From 0c909cbf2a1f2cc8ba62fb4d8a9486cbe8c9eaae Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Fri, 26 May 2017 07:58:03 -0700 Subject: [PATCH 001/403] Default NODE_OS to gci on GCE installs Looking at https://github.com/kubernetes/test-infra/tree/master/jobs, any job with "cvm" in the name explicitly sets this variable, so I hope it is only the default. --- cluster/gce/config-default.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cluster/gce/config-default.sh b/cluster/gce/config-default.sh index 5d3f74de52061..b1ab40d6eda68 100755 --- a/cluster/gce/config-default.sh +++ b/cluster/gce/config-default.sh @@ -42,7 +42,7 @@ KUBE_DELETE_NODES=${KUBE_DELETE_NODES:-true} KUBE_DELETE_NETWORK=${KUBE_DELETE_NETWORK:-false} MASTER_OS_DISTRIBUTION=${KUBE_MASTER_OS_DISTRIBUTION:-${KUBE_OS_DISTRIBUTION:-gci}} -NODE_OS_DISTRIBUTION=${KUBE_NODE_OS_DISTRIBUTION:-${KUBE_OS_DISTRIBUTION:-debian}} +NODE_OS_DISTRIBUTION=${KUBE_NODE_OS_DISTRIBUTION:-${KUBE_OS_DISTRIBUTION:-gci}} if [[ "${MASTER_OS_DISTRIBUTION}" == "coreos" ]]; then MASTER_OS_DISTRIBUTION="container-linux" fi From c7ae61b38b0bc86023cf347c24a4b69e0359629b Mon Sep 17 00:00:00 2001 From: mbohlool Date: Mon, 5 Jun 2017 12:12:43 -0700 Subject: [PATCH 002/403] Add OpenAPI README file --- api/openapi-spec/README.md | 60 +++++++++++++++++++++++++++++++++++++ hack/verify-openapi-spec.sh | 1 + 2 files changed, 61 insertions(+) create mode 100644 api/openapi-spec/README.md diff --git a/api/openapi-spec/README.md b/api/openapi-spec/README.md new file mode 100644 index 0000000000000..31e0ed851400f --- /dev/null +++ b/api/openapi-spec/README.md @@ -0,0 +1,60 @@ +# Kubernetes's OpenAPI Specification + +This folder contains an [OpenAPI specification][openapi] for Kubernetes API. + +## Vendor Extensions + +Kuberntes extends OpenAPI using these extensions. Note the version that +extensions has been added. + +### `x-kubernetes-group-version-kind` + +Operations and Definitions may have `x-kubernetes-group-version-kind` if they +are associated with a [kubernetes resource](https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#resources). + + +For example: + +``` json +"paths": { + ... + "/api/v1/namespaces/{namespace}/pods/{name}": { + ... + "get": { + ... + "x-kubernetes-group-version-kind": { + "group": "", + "version": "v1", + "kind": "Pod" + } + } + } +} +``` + +### `x-kubernetes-action` + +Operations and Definitions may have `x-kubernetes-action` if they +are associated with a [kubernetes resource](https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#resources). +Action can be one of `get`, `list`, `put`, `patch`, `post`, `delete`, `deletecollection`, `watch`, `watchlist`, `proxy`, or `connect`. + + +For example: + +``` json +"paths": { + ... + "/api/v1/namespaces/{namespace}/pods/{name}": { + ... + "get": { + ... + "x-kubernetes-action": "list" + } + } +} +``` + +### `x-kubernetes-patch-strategy` and `x-kubernetes-patch-merge-key` + +Some of the definitions may have these extensions. For more information about PatchStrategy and PatchMergeKey see +[strategic-merge-patch] (https://github.com/kubernetes/community/blob/3a1e6d22f812751ee88eccf7c59101852de63d5b/contributors/devel/strategic-merge-patch.md). diff --git a/hack/verify-openapi-spec.sh b/hack/verify-openapi-spec.sh index ac56cea109507..d205347ccefdc 100755 --- a/hack/verify-openapi-spec.sh +++ b/hack/verify-openapi-spec.sh @@ -36,6 +36,7 @@ cp -a "${SPECROOT}" "${TMP_SPECROOT}" trap "cp -a ${TMP_SPECROOT} ${SPECROOT}/..; rm -rf ${_tmp}" EXIT SIGINT rm ${SPECROOT}/* cp ${TMP_SPECROOT}/BUILD ${SPECROOT}/BUILD +cp ${TMP_SPECROOT}/README.md ${SPECROOT}/README.md "${KUBE_ROOT}/hack/update-openapi-spec.sh" echo "diffing ${SPECROOT} against freshly generated openapi spec" From 3d891f960c0673e0a813fa99e4a46996e4162e5a Mon Sep 17 00:00:00 2001 From: zhangxiaoyu-zidif Date: Wed, 7 Jun 2017 16:53:59 +0800 Subject: [PATCH 003/403] Delete reduandant err definition --- pkg/kubelet/kubelet_pods.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index e4c1aa57380d8..3689b956f8793 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -301,7 +301,6 @@ func (kl *Kubelet) GetPodCgroupParent(pod *v1.Pod) string { // GenerateRunContainerOptions generates the RunContainerOptions, which can be used by // the container runtime to set parameters for launching a container. func (kl *Kubelet) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (*kubecontainer.RunContainerOptions, bool, error) { - var err error useClusterFirstPolicy := false cgroupParent := kl.GetPodCgroupParent(pod) opts := &kubecontainer.RunContainerOptions{CgroupParent: cgroupParent} From f528bce5c66c4f2196d3aee603f3177a332b9fea Mon Sep 17 00:00:00 2001 From: zhangxiaoyu-zidif Date: Wed, 14 Jun 2017 16:25:43 +0800 Subject: [PATCH 004/403] Use reflect.DeepEqual to replace sliceEqual --- pkg/util/mount/mount_linux_test.go | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/pkg/util/mount/mount_linux_test.go b/pkg/util/mount/mount_linux_test.go index e13cb7a0f9886..4b9c6a059b360 100644 --- a/pkg/util/mount/mount_linux_test.go +++ b/pkg/util/mount/mount_linux_test.go @@ -19,6 +19,7 @@ limitations under the License. package mount import ( + "reflect" "strings" "testing" ) @@ -75,24 +76,12 @@ func TestReadProcMountsFrom(t *testing.T) { } func mountPointsEqual(a, b *MountPoint) bool { - if a.Device != b.Device || a.Path != b.Path || a.Type != b.Type || !slicesEqual(a.Opts, b.Opts) || a.Pass != b.Pass || a.Freq != b.Freq { + if a.Device != b.Device || a.Path != b.Path || a.Type != b.Type || !reflect.DeepEqual(a.Opts, b.Opts) || a.Pass != b.Pass || a.Freq != b.Freq { return false } return true } -func slicesEqual(a, b []string) bool { - if len(a) != len(b) { - return false - } - for i := range a { - if a[i] != b[i] { - return false - } - } - return true -} - func TestGetMountRefs(t *testing.T) { fm := &FakeMounter{ MountPoints: []MountPoint{ From 2e97611bc62b88c48777d6209a0ed28d17d0e52d Mon Sep 17 00:00:00 2001 From: Cao Shufeng Date: Thu, 29 Jun 2017 17:36:00 +0800 Subject: [PATCH 005/403] remove useless argument "name" --- pkg/serviceaccount/util.go | 2 +- .../apiserver/pkg/authentication/serviceaccount/util.go | 4 ++-- .../k8s.io/apiserver/pkg/endpoints/filters/impersonation.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/serviceaccount/util.go b/pkg/serviceaccount/util.go index 2ab8484a830bf..df4dc3a9140d1 100644 --- a/pkg/serviceaccount/util.go +++ b/pkg/serviceaccount/util.go @@ -28,7 +28,7 @@ func UserInfo(namespace, name, uid string) user.Info { return &user.DefaultInfo{ Name: apiserverserviceaccount.MakeUsername(namespace, name), UID: uid, - Groups: apiserverserviceaccount.MakeGroupNames(namespace, name), + Groups: apiserverserviceaccount.MakeGroupNames(namespace), } } diff --git a/staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/util.go b/staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/util.go index ac3c252b7515d..1b7bbc1390d0f 100644 --- a/staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/util.go +++ b/staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount/util.go @@ -59,8 +59,8 @@ func SplitUsername(username string) (string, string, error) { return namespace, name, nil } -// MakeGroupNames generates service account group names for the given namespace and ServiceAccount name -func MakeGroupNames(namespace, name string) []string { +// MakeGroupNames generates service account group names for the given namespace +func MakeGroupNames(namespace string) []string { return []string{ AllServiceAccountsGroup, MakeNamespaceGroupName(namespace), diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go index 891b339ecce8c..822d0fc5e7c9a 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go @@ -84,7 +84,7 @@ func WithImpersonation(handler http.Handler, requestContextMapper request.Reques username = serviceaccount.MakeUsername(impersonationRequest.Namespace, impersonationRequest.Name) if !groupsSpecified { // if groups aren't specified for a service account, we know the groups because its a fixed mapping. Add them - groups = serviceaccount.MakeGroupNames(impersonationRequest.Namespace, impersonationRequest.Name) + groups = serviceaccount.MakeGroupNames(impersonationRequest.Namespace) } case v1.SchemeGroupVersion.WithKind("User").GroupKind(): From 6c0aa1bda9b3ea4ed22abd8fbf3165586c2c41be Mon Sep 17 00:00:00 2001 From: zhangxiaoyu-zidif Date: Sun, 23 Jul 2017 02:12:53 +0800 Subject: [PATCH 006/403] fix para --- pkg/kubectl/pdb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kubectl/pdb.go b/pkg/kubectl/pdb.go index 43f54c4a7c6b0..08d8a74b8750c 100644 --- a/pkg/kubectl/pdb.go +++ b/pkg/kubectl/pdb.go @@ -214,7 +214,7 @@ func (s *PodDisruptionBudgetV2Generator) validate() error { return fmt.Errorf("a selector must be specified") } if len(s.MaxUnavailable) > 0 && len(s.MinAvailable) > 0 { - return fmt.Errorf("exactly one of min-available and max-available must be specified") + return fmt.Errorf("min-available and max-unavailable cannot be both specified") } return nil } From 46a5a1f25b810038f75d790f9667c79e0b4e5a78 Mon Sep 17 00:00:00 2001 From: tcharding Date: Wed, 26 Jul 2017 10:21:30 +1000 Subject: [PATCH 007/403] Replace duplicate cAdvisor Mock chain code with function --- pkg/kubelet/kubelet_test.go | 145 ++++++++---------------------------- 1 file changed, 30 insertions(+), 115 deletions(-) diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 54b23d9085a47..23abf174bab74 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -116,6 +116,11 @@ func (tk *TestKubelet) Cleanup() { } } +func (tk *TestKubelet) chainMock() { + tk.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + tk.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) +} + // newTestKubelet returns test kubelet with two images. func newTestKubelet(t *testing.T, controllerAttachDetachEnabled bool) *TestKubelet { imageList := []kubecontainer.Image{ @@ -328,7 +333,6 @@ var emptyPodUIDs map[types.UID]kubetypes.SyncPodType func TestSyncLoopAbort(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) kubelet := testKubelet.kubelet kubelet.runtimeState.setRuntimeSync(time.Now()) // The syncLoop waits on time.After(resyncInterval), set it really big so that we don't race for @@ -349,10 +353,6 @@ func TestSyncLoopAbort(t *testing.T) { func TestSyncPodsStartPod(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) kubelet := testKubelet.kubelet fakeRuntime := testKubelet.fakeRuntime pods := []*v1.Pod{ @@ -373,9 +373,6 @@ func TestSyncPodsDeletesWhenSourcesAreReady(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() fakeRuntime := testKubelet.fakeRuntime - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) kubelet := testKubelet.kubelet kubelet.sourcesReady = config.NewSourcesReady(func(_ sets.String) bool { return ready }) @@ -425,10 +422,8 @@ func (ls testNodeLister) List(selector labels.Selector) ([]*v1.Node, error) { func TestHandlePortConflicts(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() + testKubelet.chainMock() kl := testKubelet.kubelet - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) kl.nodeInfo = testNodeInfo{nodes: []*v1.Node{ { @@ -470,10 +465,8 @@ func TestHandlePortConflicts(t *testing.T) { func TestHandleHostNameConflicts(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() + testKubelet.chainMock() kl := testKubelet.kubelet - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) kl.nodeInfo = testNodeInfo{nodes: []*v1.Node{ { @@ -512,6 +505,7 @@ func TestHandleHostNameConflicts(t *testing.T) { func TestHandleNodeSelector(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() + testKubelet.chainMock() kl := testKubelet.kubelet nodes := []*v1.Node{ { @@ -524,9 +518,6 @@ func TestHandleNodeSelector(t *testing.T) { }, } kl.nodeInfo = testNodeInfo{nodes: nodes} - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) pods := []*v1.Pod{ podWithUIDNameNsSpec("123456789", "podA", "foo", v1.PodSpec{NodeSelector: map[string]string{"key": "A"}}), podWithUIDNameNsSpec("987654321", "podB", "foo", v1.PodSpec{NodeSelector: map[string]string{"key": "B"}}), @@ -552,6 +543,7 @@ func TestHandleNodeSelector(t *testing.T) { func TestHandleMemExceeded(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() + testKubelet.chainMock() kl := testKubelet.kubelet nodes := []*v1.Node{ {ObjectMeta: metav1.ObjectMeta{Name: testKubeletHostname}, @@ -562,9 +554,6 @@ func TestHandleMemExceeded(t *testing.T) { }}}, } kl.nodeInfo = testNodeInfo{nodes: nodes} - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) spec := v1.PodSpec{NodeName: string(kl.nodeName), Containers: []v1.Container{{Resources: v1.ResourceRequirements{ @@ -601,9 +590,7 @@ func TestHandleMemExceeded(t *testing.T) { func TestPurgingObsoleteStatusMapEntries(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() versionInfo := &cadvisorapi.VersionInfo{ KernelVersion: "3.16.0-0.bpo.4-amd64", ContainerOsVersion: "Debian GNU/Linux 7 (wheezy)", @@ -760,11 +747,7 @@ func TestCreateMirrorPod(t *testing.T) { for _, updateType := range []kubetypes.SyncPodType{kubetypes.SyncPodCreate, kubetypes.SyncPodUpdate} { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kl := testKubelet.kubelet manager := testKubelet.fakeMirrorClient @@ -787,11 +770,7 @@ func TestCreateMirrorPod(t *testing.T) { func TestDeleteOutdatedMirrorPod(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kl := testKubelet.kubelet manager := testKubelet.fakeMirrorClient @@ -830,10 +809,7 @@ func TestDeleteOutdatedMirrorPod(t *testing.T) { func TestDeleteOrphanedMirrorPods(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kl := testKubelet.kubelet manager := testKubelet.fakeMirrorClient @@ -953,11 +929,7 @@ func TestGetContainerInfoForMirrorPods(t *testing.T) { func TestHostNetworkAllowed(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet @@ -986,11 +958,7 @@ func TestHostNetworkAllowed(t *testing.T) { func TestHostNetworkDisallowed(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet @@ -1018,11 +986,7 @@ func TestHostNetworkDisallowed(t *testing.T) { func TestHostPIDAllowed(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet @@ -1051,11 +1015,7 @@ func TestHostPIDAllowed(t *testing.T) { func TestHostPIDDisallowed(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet @@ -1083,11 +1043,7 @@ func TestHostPIDDisallowed(t *testing.T) { func TestHostIPCAllowed(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet @@ -1116,11 +1072,7 @@ func TestHostIPCAllowed(t *testing.T) { func TestHostIPCDisallowed(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet @@ -1148,11 +1100,7 @@ func TestHostIPCDisallowed(t *testing.T) { func TestPrivilegeContainerAllowed(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet @@ -1178,10 +1126,7 @@ func TestPrivilegeContainerAllowed(t *testing.T) { func TestPrivilegedContainerDisallowed(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet capabilities.SetForTests(capabilities.Capabilities{ @@ -1205,10 +1150,7 @@ func TestPrivilegedContainerDisallowed(t *testing.T) { func TestNetworkErrorsWithoutHostNetwork(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet kubelet.runtimeState.setNetworkState(fmt.Errorf("simulated network error")) @@ -1323,11 +1265,7 @@ func TestSyncPodsDoesNotSetPodsThatDidNotRunTooLongToFailed(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() fakeRuntime := testKubelet.fakeRuntime - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet @@ -1392,11 +1330,7 @@ func podWithUIDNameNsSpec(uid types.UID, name, namespace string, spec v1.PodSpec func TestDeletePodDirsForDeletedPods(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kl := testKubelet.kubelet pods := []*v1.Pod{ podWithUIDNameNs("12345678", "pod1", "ns"), @@ -1432,11 +1366,7 @@ func syncAndVerifyPodDir(t *testing.T, testKubelet *TestKubelet, pods []*v1.Pod, func TestDoesNotDeletePodDirsForTerminatedPods(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kl := testKubelet.kubelet pods := []*v1.Pod{ podWithUIDNameNs("12345678", "pod1", "ns"), @@ -1455,11 +1385,7 @@ func TestDoesNotDeletePodDirsForTerminatedPods(t *testing.T) { func TestDoesNotDeletePodDirsIfContainerIsRunning(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("Start").Return(nil) - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() runningPod := &kubecontainer.Pod{ ID: "12345678", Name: "pod1", @@ -1519,10 +1445,7 @@ func TestGetPodsToSync(t *testing.T) { func TestGenerateAPIPodStatusWithSortedContainers(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet numContainers := 10 expectedOrder := []string{} @@ -1582,10 +1505,7 @@ func TestGenerateAPIPodStatusWithReasonCache(t *testing.T) { emptyContainerID := (&kubecontainer.ContainerID{}).String() testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet pod := podWithUIDNameNs("12345678", "foo", "new") pod.Spec = v1.PodSpec{RestartPolicy: v1.RestartPolicyOnFailure} @@ -1772,10 +1692,7 @@ func TestGenerateAPIPodStatusWithDifferentRestartPolicies(t *testing.T) { emptyContainerID := (&kubecontainer.ContainerID{}).String() testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() - testKubelet.fakeCadvisor.On("VersionInfo").Return(&cadvisorapi.VersionInfo{}, nil) - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) + testKubelet.chainMock() kubelet := testKubelet.kubelet pod := podWithUIDNameNs("12345678", "foo", "new") containers := []v1.Container{{Name: "succeed"}, {Name: "failed"}} @@ -1939,6 +1856,7 @@ func (a *testPodAdmitHandler) Admit(attrs *lifecycle.PodAdmitAttributes) lifecyc func TestHandlePodAdditionsInvokesPodAdmitHandlers(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() + testKubelet.chainMock() kl := testKubelet.kubelet kl.nodeInfo = testNodeInfo{nodes: []*v1.Node{ { @@ -1950,9 +1868,6 @@ func TestHandlePodAdditionsInvokesPodAdmitHandlers(t *testing.T) { }, }, }} - testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil) - testKubelet.fakeCadvisor.On("ImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) - testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil) pods := []*v1.Pod{ { From 798de2946c0c8bf814ad58c27c802d71d28d1007 Mon Sep 17 00:00:00 2001 From: yiqinguo <468894985@qq.com> Date: Fri, 7 Jul 2017 16:11:26 +0800 Subject: [PATCH 008/403] When faild create pod sandbox record event. --- pkg/kubelet/events/event.go | 1 + pkg/kubelet/kuberuntime/kuberuntime_manager.go | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/pkg/kubelet/events/event.go b/pkg/kubelet/events/event.go index 28cddf4a901c3..4cf0597d948fa 100644 --- a/pkg/kubelet/events/event.go +++ b/pkg/kubelet/events/event.go @@ -62,6 +62,7 @@ const ( SuccessfulNodeAllocatableEnforcement = "NodeAllocatableEnforced" UnsupportedMountOption = "UnsupportedMountOption" SandboxChanged = "SandboxChanged" + FailedCreatePodSandBox = "FailedCreatePodSandBox" // Image manager event reason list InvalidDiskCapacity = "InvalidDiskCapacity" diff --git a/pkg/kubelet/kuberuntime/kuberuntime_manager.go b/pkg/kubelet/kuberuntime/kuberuntime_manager.go index 545cb0d252b67..552cf2040f0dd 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_manager.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_manager.go @@ -616,6 +616,11 @@ func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, _ v1.PodStatus, podStat if err != nil { createSandboxResult.Fail(kubecontainer.ErrCreatePodSandbox, msg) glog.Errorf("createPodSandbox for pod %q failed: %v", format.Pod(pod), err) + ref, err := ref.GetReference(api.Scheme, pod) + if err != nil { + glog.Errorf("Couldn't make a ref to pod %q: '%v'", format.Pod(pod), err) + } + m.recorder.Eventf(ref, v1.EventTypeWarning, events.FailedCreatePodSandBox, "Failed create pod sandbox.") return } glog.V(4).Infof("Created PodSandbox %q for pod %q", podSandboxID, format.Pod(pod)) From 9c063c1acea6771a3d2e551a2ec7638b01244311 Mon Sep 17 00:00:00 2001 From: tcharding Date: Thu, 27 Jul 2017 07:59:09 +1000 Subject: [PATCH 009/403] Replace duplicate pod status code with function --- pkg/kubelet/kubelet_test.go | 71 ++++++++++++------------------------- 1 file changed, 23 insertions(+), 48 deletions(-) diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 23abf174bab74..9fdcf6c92d200 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -418,6 +418,12 @@ func (ls testNodeLister) List(selector labels.Selector) ([]*v1.Node, error) { return ls.nodes, nil } +func checkPodStatus(t *testing.T, kl *Kubelet, pod *v1.Pod, phase v1.PodPhase) { + status, found := kl.statusManager.GetPodStatus(pod.UID) + require.True(t, found, "Status of pod %q is not found in the status map", pod.UID) + require.Equal(t, phase, status.Phase) +} + // Tests that we handle port conflicts correctly by setting the failed status in status map. func TestHandlePortConflicts(t *testing.T) { testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) @@ -449,16 +455,10 @@ func TestHandlePortConflicts(t *testing.T) { fittingPod := pods[1] kl.HandlePodAdditions(pods) - // Check pod status stored in the status map. - // notfittingPod should be Failed - status, found := kl.statusManager.GetPodStatus(notfittingPod.UID) - require.True(t, found, "Status of pod %q is not found in the status map", notfittingPod.UID) - require.Equal(t, v1.PodFailed, status.Phase) - // fittingPod should be Pending - status, found = kl.statusManager.GetPodStatus(fittingPod.UID) - require.True(t, found, "Status of pod %q is not found in the status map", fittingPod.UID) - require.Equal(t, v1.PodPending, status.Phase) + // Check pod status stored in the status map. + checkPodStatus(t, kl, notfittingPod, v1.PodFailed) + checkPodStatus(t, kl, fittingPod, v1.PodPending) } // Tests that we handle host name conflicts correctly by setting the failed status in status map. @@ -489,16 +489,10 @@ func TestHandleHostNameConflicts(t *testing.T) { fittingPod := pods[1] kl.HandlePodAdditions(pods) - // Check pod status stored in the status map. - // notfittingPod should be Failed - status, found := kl.statusManager.GetPodStatus(notfittingPod.UID) - require.True(t, found, "Status of pod %q is not found in the status map", notfittingPod.UID) - require.Equal(t, v1.PodFailed, status.Phase) - // fittingPod should be Pending - status, found = kl.statusManager.GetPodStatus(fittingPod.UID) - require.True(t, found, "Status of pod %q is not found in the status map", fittingPod.UID) - require.Equal(t, v1.PodPending, status.Phase) + // Check pod status stored in the status map. + checkPodStatus(t, kl, notfittingPod, v1.PodFailed) + checkPodStatus(t, kl, fittingPod, v1.PodPending) } // Tests that we handle not matching labels selector correctly by setting the failed status in status map. @@ -527,16 +521,10 @@ func TestHandleNodeSelector(t *testing.T) { fittingPod := pods[1] kl.HandlePodAdditions(pods) - // Check pod status stored in the status map. - // notfittingPod should be Failed - status, found := kl.statusManager.GetPodStatus(notfittingPod.UID) - require.True(t, found, "Status of pod %q is not found in the status map", notfittingPod.UID) - require.Equal(t, v1.PodFailed, status.Phase) - // fittingPod should be Pending - status, found = kl.statusManager.GetPodStatus(fittingPod.UID) - require.True(t, found, "Status of pod %q is not found in the status map", fittingPod.UID) - require.Equal(t, v1.PodPending, status.Phase) + // Check pod status stored in the status map. + checkPodStatus(t, kl, notfittingPod, v1.PodFailed) + checkPodStatus(t, kl, fittingPod, v1.PodPending) } // Tests that we handle exceeded resources correctly by setting the failed status in status map. @@ -574,16 +562,10 @@ func TestHandleMemExceeded(t *testing.T) { fittingPod := pods[1] kl.HandlePodAdditions(pods) - // Check pod status stored in the status map. - // notfittingPod should be Failed - status, found := kl.statusManager.GetPodStatus(notfittingPod.UID) - require.True(t, found, "Status of pod %q is not found in the status map", notfittingPod.UID) - require.Equal(t, v1.PodFailed, status.Phase) - // fittingPod should be Pending - status, found = kl.statusManager.GetPodStatus(fittingPod.UID) - require.True(t, found, "Status of pod %q is not found in the status map", fittingPod.UID) - require.Equal(t, v1.PodPending, status.Phase) + // Check pod status stored in the status map. + checkPodStatus(t, kl, notfittingPod, v1.PodFailed) + checkPodStatus(t, kl, fittingPod, v1.PodPending) } // TODO(filipg): This test should be removed once StatusSyncer can do garbage collection without external signal. @@ -1892,16 +1874,10 @@ func TestHandlePodAdditionsInvokesPodAdmitHandlers(t *testing.T) { kl.admitHandlers.AddPodAdmitHandler(&testPodAdmitHandler{podsToReject: podsToReject}) kl.HandlePodAdditions(pods) - // Check pod status stored in the status map. - // podToReject should be Failed - status, found := kl.statusManager.GetPodStatus(podToReject.UID) - require.True(t, found, "Status of pod %q is not found in the status map", podToAdmit.UID) - require.Equal(t, v1.PodFailed, status.Phase) - // podToAdmit should be Pending - status, found = kl.statusManager.GetPodStatus(podToAdmit.UID) - require.True(t, found, "Status of pod %q is not found in the status map", podToAdmit.UID) - require.Equal(t, v1.PodPending, status.Phase) + // Check pod status stored in the status map. + checkPodStatus(t, kl, podToReject, v1.PodFailed) + checkPodStatus(t, kl, podToAdmit, v1.PodPending) } // testPodSyncLoopHandler is a lifecycle.PodSyncLoopHandler that is used for testing. @@ -2005,10 +1981,9 @@ func TestSyncPodKillPod(t *testing.T) { }, }) require.NoError(t, err) + // Check pod status stored in the status map. - status, found := kl.statusManager.GetPodStatus(pod.UID) - require.True(t, found, "Status of pod %q is not found in the status map", pod.UID) - require.Equal(t, v1.PodFailed, status.Phase) + checkPodStatus(t, kl, pod, v1.PodFailed) } func waitForVolumeUnmount( From c6489da70d0af8bcfdd5bb2f02a5f2aa7605859d Mon Sep 17 00:00:00 2001 From: FengyunPan Date: Fri, 28 Jul 2017 17:38:50 +0800 Subject: [PATCH 010/403] Fix the matching rule of instance ProviderID Url.Parse() can't parse ProviderID which contains ':///'. This PR use regexp to match ProviderID. --- .../openstack/openstack_instances.go | 20 ++++++++++--------- .../providers/openstack/openstack_test.go | 9 +++++++-- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/pkg/cloudprovider/providers/openstack/openstack_instances.go b/pkg/cloudprovider/providers/openstack/openstack_instances.go index 70f29ff7bd0da..66e2b84bca263 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_instances.go +++ b/pkg/cloudprovider/providers/openstack/openstack_instances.go @@ -19,7 +19,7 @@ package openstack import ( "errors" "fmt" - "net/url" + "regexp" "github.com/golang/glog" "github.com/gophercloud/gophercloud" @@ -208,14 +208,16 @@ func srvInstanceType(srv *servers.Server) (string, error) { return "", fmt.Errorf("flavor name/id not found") } +// instanceIDFromProviderID splits a provider's id and return instanceID. +// A providerID is build out of '${ProviderName}:///${instance-id}'which contains ':///'. +// See cloudprovider.GetInstanceProviderID and Instances.InstanceID. func instanceIDFromProviderID(providerID string) (instanceID string, err error) { - parsedID, err := url.Parse(providerID) - if err != nil { - return "", err - } - if parsedID.Scheme != ProviderName { - return "", fmt.Errorf("unrecognized provider %q", parsedID.Scheme) - } + // If Instances.InstanceID or cloudprovider.GetInstanceProviderID is changed, the regexp should be changed too. + var providerIdRegexp = regexp.MustCompile(`^` + ProviderName + `:///([^/]+)$`) - return parsedID.Host, nil + matches := providerIdRegexp.FindStringSubmatch(providerID) + if len(matches) != 2 { + return "", fmt.Errorf("ProviderID \"%s\" didn't match expected format \"openstack:///InstanceID\"", providerID) + } + return matches[1], nil } diff --git a/pkg/cloudprovider/providers/openstack/openstack_test.go b/pkg/cloudprovider/providers/openstack/openstack_test.go index 7e8ed5901b3c9..3306d69584a94 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_test.go +++ b/pkg/cloudprovider/providers/openstack/openstack_test.go @@ -557,17 +557,22 @@ func TestInstanceIDFromProviderID(t *testing.T) { fail bool }{ { - providerID: "openstack://7b9cf879-7146-417c-abfd-cb4272f0c935", + providerID: ProviderName + "://" + "/" + "7b9cf879-7146-417c-abfd-cb4272f0c935", instanceID: "7b9cf879-7146-417c-abfd-cb4272f0c935", fail: false, }, + { + providerID: "openstack://7b9cf879-7146-417c-abfd-cb4272f0c935", + instanceID: "", + fail: true, + }, { providerID: "7b9cf879-7146-417c-abfd-cb4272f0c935", instanceID: "", fail: true, }, { - providerID: "other-provider://7b9cf879-7146-417c-abfd-cb4272f0c935", + providerID: "other-provider:///7b9cf879-7146-417c-abfd-cb4272f0c935", instanceID: "", fail: true, }, From ef2403f80e027b59b5d4b9cd2dd84020384c1919 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Sun, 30 Jul 2017 21:57:18 +0800 Subject: [PATCH 011/403] send volumesInUse sorted in node status updates --- pkg/kubelet/volumemanager/volume_manager.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/pkg/kubelet/volumemanager/volume_manager.go b/pkg/kubelet/volumemanager/volume_manager.go index a71c05412f553..d48266f52a351 100644 --- a/pkg/kubelet/volumemanager/volume_manager.go +++ b/pkg/kubelet/volumemanager/volume_manager.go @@ -18,6 +18,7 @@ package volumemanager import ( "fmt" + "sort" "strconv" "time" @@ -286,15 +287,8 @@ func (vm *volumeManager) GetVolumesInUse() []v1.UniqueVolumeName { // volume *should* be attached to this node until it is safely unmounted. desiredVolumes := vm.desiredStateOfWorld.GetVolumesToMount() mountedVolumes := vm.actualStateOfWorld.GetGloballyMountedVolumes() - volumesToReportInUse := - make( - []v1.UniqueVolumeName, - 0, /* len */ - len(desiredVolumes)+len(mountedVolumes) /* cap */) - desiredVolumesMap := - make( - map[v1.UniqueVolumeName]bool, - len(desiredVolumes)+len(mountedVolumes) /* cap */) + volumesToReportInUse := make([]v1.UniqueVolumeName, 0, len(desiredVolumes)+len(mountedVolumes)) + desiredVolumesMap := make(map[v1.UniqueVolumeName]bool, len(desiredVolumes)+len(mountedVolumes)) for _, volume := range desiredVolumes { if volume.PluginIsAttachable { @@ -313,6 +307,9 @@ func (vm *volumeManager) GetVolumesInUse() []v1.UniqueVolumeName { } } + sort.Slice(volumesToReportInUse, func(i, j int) bool { + return string(volumesToReportInUse[i]) < string(volumesToReportInUse[j]) + }) return volumesToReportInUse } From a4811daf31844476ff0f160285f0e6c088db4662 Mon Sep 17 00:00:00 2001 From: Andy Goldstein Date: Fri, 23 Jun 2017 16:06:07 -0400 Subject: [PATCH 012/403] Fix initial exec terminal dimensions Delay attempting to send a terminal resize request to docker until after the exec has started; otherwise, the initial resize request will fail. --- pkg/kubelet/dockershim/exec.go | 24 ++++++++++++++++--- .../libdocker/kube_docker_client.go | 10 ++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/pkg/kubelet/dockershim/exec.go b/pkg/kubelet/dockershim/exec.go index 6d4b229cd8652..a861bb47f0e04 100644 --- a/pkg/kubelet/dockershim/exec.go +++ b/pkg/kubelet/dockershim/exec.go @@ -135,6 +135,9 @@ func (*NsenterExecHandler) ExecInContainer(client libdocker.Interface, container type NativeExecHandler struct{} func (*NativeExecHandler) ExecInContainer(client libdocker.Interface, container *dockertypes.ContainerJSON, cmd []string, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize, timeout time.Duration) error { + done := make(chan struct{}) + defer close(done) + createOpts := dockertypes.ExecConfig{ Cmd: cmd, AttachStdin: stdin != nil, @@ -149,9 +152,23 @@ func (*NativeExecHandler) ExecInContainer(client libdocker.Interface, container // Have to start this before the call to client.StartExec because client.StartExec is a blocking // call :-( Otherwise, resize events don't get processed and the terminal never resizes. - kubecontainer.HandleResizing(resize, func(size remotecommand.TerminalSize) { - client.ResizeExecTTY(execObj.ID, uint(size.Height), uint(size.Width)) - }) + // + // We also have to delay attempting to send a terminal resize request to docker until after the + // exec has started; otherwise, the initial resize request will fail. + execStarted := make(chan struct{}) + go func() { + select { + case <-execStarted: + // client.StartExec has started the exec, so we can start resizing + case <-done: + // ExecInContainer has returned, so short-circuit + return + } + + kubecontainer.HandleResizing(resize, func(size remotecommand.TerminalSize) { + client.ResizeExecTTY(execObj.ID, uint(size.Height), uint(size.Width)) + }) + }() startOpts := dockertypes.ExecStartCheck{Detach: false, Tty: tty} streamOpts := libdocker.StreamOptions{ @@ -159,6 +176,7 @@ func (*NativeExecHandler) ExecInContainer(client libdocker.Interface, container OutputStream: stdout, ErrorStream: stderr, RawTerminal: tty, + ExecStarted: execStarted, } err = client.StartExec(execObj.ID, startOpts, streamOpts) if err != nil { diff --git a/pkg/kubelet/dockershim/libdocker/kube_docker_client.go b/pkg/kubelet/dockershim/libdocker/kube_docker_client.go index b74a5d043552a..d9d09750ffa4f 100644 --- a/pkg/kubelet/dockershim/libdocker/kube_docker_client.go +++ b/pkg/kubelet/dockershim/libdocker/kube_docker_client.go @@ -454,6 +454,15 @@ func (d *kubeDockerClient) StartExec(startExec string, opts dockertypes.ExecStar return err } defer resp.Close() + + if sopts.ExecStarted != nil { + // Send a message to the channel indicating that the exec has started. This is needed so + // interactive execs can handle resizing correctly - the request to resize the TTY has to happen + // after the call to d.client.ContainerExecAttach, and because d.holdHijackedConnection below + // blocks, we use sopts.ExecStarted to signal the caller that it's ok to resize. + sopts.ExecStarted <- struct{}{} + } + return d.holdHijackedConnection(sopts.RawTerminal || opts.Tty, sopts.InputStream, sopts.OutputStream, sopts.ErrorStream, resp) } @@ -584,6 +593,7 @@ type StreamOptions struct { InputStream io.Reader OutputStream io.Writer ErrorStream io.Writer + ExecStarted chan struct{} } // operationTimeout is the error returned when the docker operations are timeout. From e018887501be0241ac2d1ef9b3947cb0521c3a3d Mon Sep 17 00:00:00 2001 From: "rong.zhang" Date: Tue, 1 Aug 2017 10:15:05 +0800 Subject: [PATCH 013/403] Fix Getpath() description Modify the description of the word error --- pkg/volume/cephfs/cephfs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/volume/cephfs/cephfs.go b/pkg/volume/cephfs/cephfs.go index 5ea4e6137e7d7..f59a053863a3f 100644 --- a/pkg/volume/cephfs/cephfs.go +++ b/pkg/volume/cephfs/cephfs.go @@ -260,7 +260,7 @@ func (cephfsVolume *cephfsUnmounter) TearDownAt(dir string) error { return util.UnmountPath(dir, cephfsVolume.mounter) } -// GatePath creates global mount path +// GetPath creates global mount path func (cephfsVolume *cephfs) GetPath() string { name := cephfsPluginName return cephfsVolume.plugin.host.GetPodVolumeDir(cephfsVolume.podUID, utilstrings.EscapeQualifiedNameForDisk(name), cephfsVolume.volName) From d6aca27b53e3f9f9562e4494ee2eb2310ab29615 Mon Sep 17 00:00:00 2001 From: xiangpengzhao Date: Tue, 1 Aug 2017 17:40:34 +0800 Subject: [PATCH 014/403] Remove deprecated kubectl command aliases --- docs/.generated_docs | 13 ---------- docs/man/man1/kubectl-apiversions.1 | 3 --- docs/man/man1/kubectl-clusterinfo-dump.1 | 3 --- docs/man/man1/kubectl-clusterinfo.1 | 3 --- docs/man/man1/kubectl-resize.1 | 3 --- docs/man/man1/kubectl-rollingupdate.1 | 3 --- docs/man/man1/kubectl-run-container.1 | 3 --- docs/man/man1/kubectl-update.1 | 3 --- docs/yaml/kubectl/kubectl_apiversions.yaml | 3 --- docs/yaml/kubectl/kubectl_clusterinfo.yaml | 3 --- docs/yaml/kubectl/kubectl_resize.yaml | 3 --- docs/yaml/kubectl/kubectl_rollingupdate.yaml | 3 --- docs/yaml/kubectl/kubectl_run-container.yaml | 3 --- docs/yaml/kubectl/kubectl_update.yaml | 3 --- hack/make-rules/test-cmd-util.sh | 26 -------------------- pkg/kubectl/cmd/cmd.go | 6 ----- 16 files changed, 84 deletions(-) delete mode 100644 docs/man/man1/kubectl-apiversions.1 delete mode 100644 docs/man/man1/kubectl-clusterinfo-dump.1 delete mode 100644 docs/man/man1/kubectl-clusterinfo.1 delete mode 100644 docs/man/man1/kubectl-resize.1 delete mode 100644 docs/man/man1/kubectl-rollingupdate.1 delete mode 100644 docs/man/man1/kubectl-run-container.1 delete mode 100644 docs/man/man1/kubectl-update.1 delete mode 100644 docs/yaml/kubectl/kubectl_apiversions.yaml delete mode 100644 docs/yaml/kubectl/kubectl_clusterinfo.yaml delete mode 100644 docs/yaml/kubectl/kubectl_resize.yaml delete mode 100644 docs/yaml/kubectl/kubectl_rollingupdate.yaml delete mode 100644 docs/yaml/kubectl/kubectl_run-container.yaml delete mode 100644 docs/yaml/kubectl/kubectl_update.yaml diff --git a/docs/.generated_docs b/docs/.generated_docs index 6cb4e01c47165..0ffec2e8b5bda 100644 --- a/docs/.generated_docs +++ b/docs/.generated_docs @@ -21,7 +21,6 @@ docs/man/man1/kube-scheduler.1 docs/man/man1/kubectl-alpha.1 docs/man/man1/kubectl-annotate.1 docs/man/man1/kubectl-api-versions.1 -docs/man/man1/kubectl-apiversions.1 docs/man/man1/kubectl-apply-edit-last-applied.1 docs/man/man1/kubectl-apply-set-last-applied.1 docs/man/man1/kubectl-apply-view-last-applied.1 @@ -35,8 +34,6 @@ docs/man/man1/kubectl-certificate-deny.1 docs/man/man1/kubectl-certificate.1 docs/man/man1/kubectl-cluster-info-dump.1 docs/man/man1/kubectl-cluster-info.1 -docs/man/man1/kubectl-clusterinfo-dump.1 -docs/man/man1/kubectl-clusterinfo.1 docs/man/man1/kubectl-completion.1 docs/man/man1/kubectl-config-current-context.1 docs/man/man1/kubectl-config-delete-cluster.1 @@ -91,16 +88,13 @@ docs/man/man1/kubectl-plugin.1 docs/man/man1/kubectl-port-forward.1 docs/man/man1/kubectl-proxy.1 docs/man/man1/kubectl-replace.1 -docs/man/man1/kubectl-resize.1 docs/man/man1/kubectl-rolling-update.1 -docs/man/man1/kubectl-rollingupdate.1 docs/man/man1/kubectl-rollout-history.1 docs/man/man1/kubectl-rollout-pause.1 docs/man/man1/kubectl-rollout-resume.1 docs/man/man1/kubectl-rollout-status.1 docs/man/man1/kubectl-rollout-undo.1 docs/man/man1/kubectl-rollout.1 -docs/man/man1/kubectl-run-container.1 docs/man/man1/kubectl-run.1 docs/man/man1/kubectl-scale.1 docs/man/man1/kubectl-set-image.1 @@ -114,7 +108,6 @@ docs/man/man1/kubectl-top-node.1 docs/man/man1/kubectl-top-pod.1 docs/man/man1/kubectl-top.1 docs/man/man1/kubectl-uncordon.1 -docs/man/man1/kubectl-update.1 docs/man/man1/kubectl-version.1 docs/man/man1/kubectl.1 docs/man/man1/kubelet.1 @@ -212,14 +205,12 @@ docs/yaml/kubectl/kubectl.yaml docs/yaml/kubectl/kubectl_alpha.yaml docs/yaml/kubectl/kubectl_annotate.yaml docs/yaml/kubectl/kubectl_api-versions.yaml -docs/yaml/kubectl/kubectl_apiversions.yaml docs/yaml/kubectl/kubectl_apply.yaml docs/yaml/kubectl/kubectl_attach.yaml docs/yaml/kubectl/kubectl_auth.yaml docs/yaml/kubectl/kubectl_autoscale.yaml docs/yaml/kubectl/kubectl_certificate.yaml docs/yaml/kubectl/kubectl_cluster-info.yaml -docs/yaml/kubectl/kubectl_clusterinfo.yaml docs/yaml/kubectl/kubectl_completion.yaml docs/yaml/kubectl/kubectl_config.yaml docs/yaml/kubectl/kubectl_convert.yaml @@ -242,11 +233,8 @@ docs/yaml/kubectl/kubectl_plugin.yaml docs/yaml/kubectl/kubectl_port-forward.yaml docs/yaml/kubectl/kubectl_proxy.yaml docs/yaml/kubectl/kubectl_replace.yaml -docs/yaml/kubectl/kubectl_resize.yaml docs/yaml/kubectl/kubectl_rolling-update.yaml -docs/yaml/kubectl/kubectl_rollingupdate.yaml docs/yaml/kubectl/kubectl_rollout.yaml -docs/yaml/kubectl/kubectl_run-container.yaml docs/yaml/kubectl/kubectl_run.yaml docs/yaml/kubectl/kubectl_scale.yaml docs/yaml/kubectl/kubectl_set.yaml @@ -254,5 +242,4 @@ docs/yaml/kubectl/kubectl_stop.yaml docs/yaml/kubectl/kubectl_taint.yaml docs/yaml/kubectl/kubectl_top.yaml docs/yaml/kubectl/kubectl_uncordon.yaml -docs/yaml/kubectl/kubectl_update.yaml docs/yaml/kubectl/kubectl_version.yaml diff --git a/docs/man/man1/kubectl-apiversions.1 b/docs/man/man1/kubectl-apiversions.1 deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/man/man1/kubectl-apiversions.1 +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/man/man1/kubectl-clusterinfo-dump.1 b/docs/man/man1/kubectl-clusterinfo-dump.1 deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/man/man1/kubectl-clusterinfo-dump.1 +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/man/man1/kubectl-clusterinfo.1 b/docs/man/man1/kubectl-clusterinfo.1 deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/man/man1/kubectl-clusterinfo.1 +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/man/man1/kubectl-resize.1 b/docs/man/man1/kubectl-resize.1 deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/man/man1/kubectl-resize.1 +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/man/man1/kubectl-rollingupdate.1 b/docs/man/man1/kubectl-rollingupdate.1 deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/man/man1/kubectl-rollingupdate.1 +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/man/man1/kubectl-run-container.1 b/docs/man/man1/kubectl-run-container.1 deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/man/man1/kubectl-run-container.1 +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/man/man1/kubectl-update.1 b/docs/man/man1/kubectl-update.1 deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/man/man1/kubectl-update.1 +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/yaml/kubectl/kubectl_apiversions.yaml b/docs/yaml/kubectl/kubectl_apiversions.yaml deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/yaml/kubectl/kubectl_apiversions.yaml +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/yaml/kubectl/kubectl_clusterinfo.yaml b/docs/yaml/kubectl/kubectl_clusterinfo.yaml deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/yaml/kubectl/kubectl_clusterinfo.yaml +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/yaml/kubectl/kubectl_resize.yaml b/docs/yaml/kubectl/kubectl_resize.yaml deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/yaml/kubectl/kubectl_resize.yaml +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/yaml/kubectl/kubectl_rollingupdate.yaml b/docs/yaml/kubectl/kubectl_rollingupdate.yaml deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/yaml/kubectl/kubectl_rollingupdate.yaml +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/yaml/kubectl/kubectl_run-container.yaml b/docs/yaml/kubectl/kubectl_run-container.yaml deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/yaml/kubectl/kubectl_run-container.yaml +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/docs/yaml/kubectl/kubectl_update.yaml b/docs/yaml/kubectl/kubectl_update.yaml deleted file mode 100644 index b6fd7a0f9896b..0000000000000 --- a/docs/yaml/kubectl/kubectl_update.yaml +++ /dev/null @@ -1,3 +0,0 @@ -This file is autogenerated, but we've stopped checking such files into the -repository to reduce the need for rebases. Please run hack/generate-docs.sh to -populate this file. diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index 7490b6525f397..354aeaa9ff36e 100644 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -1222,31 +1222,6 @@ run_kubectl_run_tests() { set +o errexit } -run_kubectl_using_deprecated_commands_test() { - set -o nounset - set -o errexit - - create_and_use_new_namespace - kube::log::status "Testing kubectl using deprecated commands" - ## `kubectl run-container` should function identical to `kubectl run`, but it - ## should also print a deprecation warning. - # Pre-Condition: no Job exists - kube::test::get_object_assert jobs "{{range.items}}{{$id_field}}:{{end}}" '' - # Command - output_message=$(kubectl 2>&1 run-container pi --generator=job/v1 "--image=$IMAGE_PERL" --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(15)' "${kube_flags[@]}") - # Ensure that the user is warned their command is deprecated. - kube::test::if_has_string "${output_message}" 'deprecated' - # Post-Condition: Job "pi" is created - kube::test::get_object_assert jobs "{{range.items}}{{$id_field}}:{{end}}" 'pi:' - # Clean up - kubectl delete jobs pi "${kube_flags[@]}" - # Post-condition: no pods exist. - kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" '' - - set +o nounset - set +o errexit -} - run_kubectl_get_tests() { set -o nounset set -o errexit @@ -4279,7 +4254,6 @@ runTests() { # run for federation apiserver as well. record_command run_kubectl_apply_tests record_command run_kubectl_run_tests - record_command run_kubectl_using_deprecated_commands_test record_command run_kubectl_create_filter_tests fi diff --git a/pkg/kubectl/cmd/cmd.go b/pkg/kubectl/cmd/cmd.go index 50f442f4ea16c..76a0777c02237 100644 --- a/pkg/kubectl/cmd/cmd.go +++ b/pkg/kubectl/cmd/cmd.go @@ -285,7 +285,6 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob NewCmdCreate(f, out, err), NewCmdExposeService(f, out), NewCmdRun(f, in, out, err), - deprecatedAlias("run-container", NewCmdRun(f, in, out, err)), set.NewCmdSet(f, out, err), }, }, @@ -303,9 +302,7 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob Commands: []*cobra.Command{ rollout.NewCmdRollout(f, out, err), NewCmdRollingUpdate(f, out), - deprecatedAlias("rollingupdate", NewCmdRollingUpdate(f, out)), NewCmdScale(f, out), - deprecatedAlias("resize", NewCmdScale(f, out)), NewCmdAutoscale(f, out), }, }, @@ -314,7 +311,6 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob Commands: []*cobra.Command{ NewCmdCertificate(f, out), NewCmdClusterInfo(f, out), - deprecatedAlias("clusterinfo", NewCmdClusterInfo(f, out)), NewCmdTop(f, out, err), NewCmdCordon(f, out), NewCmdUncordon(f, out), @@ -341,7 +337,6 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob NewCmdApply("kubectl", f, out, err), NewCmdPatch(f, out), NewCmdReplace(f, out), - deprecatedAlias("update", NewCmdReplace(f, out)), NewCmdConvert(f, out), }, }, @@ -386,7 +381,6 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob cmds.AddCommand(NewCmdPlugin(f, in, out, err)) cmds.AddCommand(NewCmdVersion(f, out)) cmds.AddCommand(NewCmdApiVersions(f, out)) - cmds.AddCommand(deprecatedAlias("apiversions", NewCmdApiVersions(f, out))) cmds.AddCommand(NewCmdOptions(out)) return cmds From 0dad8dd459b2b7ababde08109ed1fb0e224ac41a Mon Sep 17 00:00:00 2001 From: Avesh Agarwal Date: Tue, 1 Aug 2017 15:03:51 -0400 Subject: [PATCH 015/403] Do not allow empty topology key for pod affinities. --- pkg/api/types.go | 4 +- pkg/api/validation/validation.go | 31 ++++++-------- pkg/api/validation/validation_test.go | 42 ++++++++++++++++--- .../algorithm/priorities/util/topologies.go | 1 - 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/pkg/api/types.go b/pkg/api/types.go index ab9b7056d4fe8..2e8a1505bcb45 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -2026,9 +2026,7 @@ type PodAffinityTerm struct { // the labelSelector in the specified namespaces, where co-located is defined as running on a node // whose value of the label with key topologyKey matches that of any node on which any of the // selected pods is running. - // For PreferredDuringScheduling pod anti-affinity, empty topologyKey is interpreted as "all topologies" - // ("all topologies" here means all the topologyKeys indicated by scheduler command-line argument --failure-domains); - // for affinity and for RequiredDuringScheduling pod anti-affinity, empty topologyKey is not allowed. + // Empty topologyKey is not allowed. // +optional TopologyKey string } diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index f6bd510bfdd77..a3b476312fd67 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -2429,7 +2429,7 @@ func ValidatePreferredSchedulingTerms(terms []api.PreferredSchedulingTerm, fldPa } // validatePodAffinityTerm tests that the specified podAffinityTerm fields have valid data -func validatePodAffinityTerm(podAffinityTerm api.PodAffinityTerm, allowEmptyTopologyKey bool, fldPath *field.Path) field.ErrorList { +func validatePodAffinityTerm(podAffinityTerm api.PodAffinityTerm, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(podAffinityTerm.LabelSelector, fldPath.Child("matchExpressions"))...) @@ -2438,32 +2438,29 @@ func validatePodAffinityTerm(podAffinityTerm api.PodAffinityTerm, allowEmptyTopo allErrs = append(allErrs, field.Invalid(fldPath.Child("namespace"), name, msg)) } } - if !allowEmptyTopologyKey && len(podAffinityTerm.TopologyKey) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("topologyKey"), "can only be empty for PreferredDuringScheduling pod anti affinity")) + if len(podAffinityTerm.TopologyKey) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("topologyKey"), "can not be empty")) } - if len(podAffinityTerm.TopologyKey) != 0 { - allErrs = append(allErrs, unversionedvalidation.ValidateLabelName(podAffinityTerm.TopologyKey, fldPath.Child("topologyKey"))...) - } - return allErrs + return append(allErrs, unversionedvalidation.ValidateLabelName(podAffinityTerm.TopologyKey, fldPath.Child("topologyKey"))...) } // validatePodAffinityTerms tests that the specified podAffinityTerms fields have valid data -func validatePodAffinityTerms(podAffinityTerms []api.PodAffinityTerm, allowEmptyTopologyKey bool, fldPath *field.Path) field.ErrorList { +func validatePodAffinityTerms(podAffinityTerms []api.PodAffinityTerm, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} for i, podAffinityTerm := range podAffinityTerms { - allErrs = append(allErrs, validatePodAffinityTerm(podAffinityTerm, allowEmptyTopologyKey, fldPath.Index(i))...) + allErrs = append(allErrs, validatePodAffinityTerm(podAffinityTerm, fldPath.Index(i))...) } return allErrs } // validateWeightedPodAffinityTerms tests that the specified weightedPodAffinityTerms fields have valid data -func validateWeightedPodAffinityTerms(weightedPodAffinityTerms []api.WeightedPodAffinityTerm, allowEmptyTopologyKey bool, fldPath *field.Path) field.ErrorList { +func validateWeightedPodAffinityTerms(weightedPodAffinityTerms []api.WeightedPodAffinityTerm, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} for j, weightedTerm := range weightedPodAffinityTerms { if weightedTerm.Weight <= 0 || weightedTerm.Weight > 100 { allErrs = append(allErrs, field.Invalid(fldPath.Index(j).Child("weight"), weightedTerm.Weight, "must be in the range 1-100")) } - allErrs = append(allErrs, validatePodAffinityTerm(weightedTerm.PodAffinityTerm, allowEmptyTopologyKey, fldPath.Index(j).Child("podAffinityTerm"))...) + allErrs = append(allErrs, validatePodAffinityTerm(weightedTerm.PodAffinityTerm, fldPath.Index(j).Child("podAffinityTerm"))...) } return allErrs } @@ -2477,13 +2474,11 @@ func validatePodAntiAffinity(podAntiAffinity *api.PodAntiAffinity, fldPath *fiel // fldPath.Child("requiredDuringSchedulingRequiredDuringExecution"))...) //} if podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution != nil { - // empty topologyKey is not allowed for hard pod anti-affinity - allErrs = append(allErrs, validatePodAffinityTerms(podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution, false, + allErrs = append(allErrs, validatePodAffinityTerms(podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution, fldPath.Child("requiredDuringSchedulingIgnoredDuringExecution"))...) } if podAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution != nil { - // empty topologyKey is allowed for soft pod anti-affinity - allErrs = append(allErrs, validateWeightedPodAffinityTerms(podAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution, true, + allErrs = append(allErrs, validateWeightedPodAffinityTerms(podAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution, fldPath.Child("preferredDuringSchedulingIgnoredDuringExecution"))...) } return allErrs @@ -2498,13 +2493,11 @@ func validatePodAffinity(podAffinity *api.PodAffinity, fldPath *field.Path) fiel // fldPath.Child("requiredDuringSchedulingRequiredDuringExecution"))...) //} if podAffinity.RequiredDuringSchedulingIgnoredDuringExecution != nil { - // empty topologyKey is not allowed for hard pod affinity - allErrs = append(allErrs, validatePodAffinityTerms(podAffinity.RequiredDuringSchedulingIgnoredDuringExecution, false, + allErrs = append(allErrs, validatePodAffinityTerms(podAffinity.RequiredDuringSchedulingIgnoredDuringExecution, fldPath.Child("requiredDuringSchedulingIgnoredDuringExecution"))...) } if podAffinity.PreferredDuringSchedulingIgnoredDuringExecution != nil { - // empty topologyKey is not allowed for soft pod affinity - allErrs = append(allErrs, validateWeightedPodAffinityTerms(podAffinity.PreferredDuringSchedulingIgnoredDuringExecution, false, + allErrs = append(allErrs, validateWeightedPodAffinityTerms(podAffinity.PreferredDuringSchedulingIgnoredDuringExecution, fldPath.Child("preferredDuringSchedulingIgnoredDuringExecution"))...) } return allErrs diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 6f0940d03e1f5..542bcda1aec82 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -4655,8 +4655,8 @@ func TestValidatePod(t *testing.T) { }), }, }, - "invalid pod affinity, empty topologyKey is not allowed for hard pod affinity": { - expectedError: "can only be empty for PreferredDuringScheduling pod anti affinity", + "invalid hard pod affinity, empty topologyKey is not allowed for hard pod affinity": { + expectedError: "can not be empty", spec: api.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "123", @@ -4682,8 +4682,8 @@ func TestValidatePod(t *testing.T) { }), }, }, - "invalid pod anti-affinity, empty topologyKey is not allowed for hard pod anti-affinity": { - expectedError: "can only be empty for PreferredDuringScheduling pod anti affinity", + "invalid hard pod anti-affinity, empty topologyKey is not allowed for hard pod anti-affinity": { + expectedError: "can not be empty", spec: api.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "123", @@ -4709,8 +4709,8 @@ func TestValidatePod(t *testing.T) { }), }, }, - "invalid pod anti-affinity, empty topologyKey is not allowed for soft pod affinity": { - expectedError: "can only be empty for PreferredDuringScheduling pod anti affinity", + "invalid soft pod affinity, empty topologyKey is not allowed for soft pod affinity": { + expectedError: "can not be empty", spec: api.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "123", @@ -4739,6 +4739,36 @@ func TestValidatePod(t *testing.T) { }), }, }, + "invalid soft pod anti-affinity, empty topologyKey is not allowed for soft pod anti-affinity": { + expectedError: "can not be empty", + spec: api.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "123", + Namespace: "ns", + }, + Spec: validPodSpec(&api.Affinity{ + PodAntiAffinity: &api.PodAntiAffinity{ + PreferredDuringSchedulingIgnoredDuringExecution: []api.WeightedPodAffinityTerm{ + { + Weight: 10, + PodAffinityTerm: api.PodAffinityTerm{ + LabelSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "key2", + Operator: metav1.LabelSelectorOpNotIn, + Values: []string{"value1", "value2"}, + }, + }, + }, + Namespaces: []string{"ns"}, + }, + }, + }, + }, + }), + }, + }, "invalid toleration key": { expectedError: "spec.tolerations[0].key", spec: api.Pod{ diff --git a/plugin/pkg/scheduler/algorithm/priorities/util/topologies.go b/plugin/pkg/scheduler/algorithm/priorities/util/topologies.go index 2764d9a0acba2..511ffc137061f 100644 --- a/plugin/pkg/scheduler/algorithm/priorities/util/topologies.go +++ b/plugin/pkg/scheduler/algorithm/priorities/util/topologies.go @@ -75,7 +75,6 @@ type Topologies struct { } // NodesHaveSameTopologyKey checks if nodeA and nodeB have same label value with given topologyKey as label key. -// If the topologyKey is empty, check if the two nodes have any of the default topologyKeys, and have same corresponding label value. func (tps *Topologies) NodesHaveSameTopologyKey(nodeA, nodeB *v1.Node, topologyKey string) bool { return NodesHaveSameTopologyKey(nodeA, nodeB, topologyKey) } From 2ad04cb46dfa84fbd3b169f555ee0ed71b277428 Mon Sep 17 00:00:00 2001 From: duan-yue Date: Wed, 26 Jul 2017 16:38:29 +0800 Subject: [PATCH 016/403] fix typo --- staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go index 806f5dc9e60ea..c5bcbbc10e07b 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go +++ b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go @@ -113,7 +113,7 @@ type GenericAPIServer struct { Serializer runtime.NegotiatedSerializer // "Outputs" - // Handler holdes the handlers being used by this API server + // Handler holds the handlers being used by this API server Handler *APIServerHandler // listedPathProvider is a lister which provides the set of paths to show at / From 55339f30acd9fbad60d651e419ba50b08fa7245a Mon Sep 17 00:00:00 2001 From: Michail Kargakis Date: Thu, 3 Aug 2017 18:49:16 +0200 Subject: [PATCH 017/403] Remove failure check from deployment controller Signed-off-by: Michail Kargakis --- .../deployment/deployment_controller.go | 8 ---- pkg/controller/deployment/progress.go | 45 ------------------- 2 files changed, 53 deletions(-) diff --git a/pkg/controller/deployment/deployment_controller.go b/pkg/controller/deployment/deployment_controller.go index 56eecf595643a..9816011eece6f 100644 --- a/pkg/controller/deployment/deployment_controller.go +++ b/pkg/controller/deployment/deployment_controller.go @@ -620,14 +620,6 @@ func (dc *DeploymentController) syncDeployment(key string) error { return err } - _, err = dc.hasFailed(d, rsList, podMap) - if err != nil { - return err - } - // TODO: Automatically rollback here if we failed above. Locate the last complete - // revision and populate the rollback spec with it. - // See https://github.com/kubernetes/kubernetes/issues/23211. - if d.Spec.Paused { return dc.sync(d, rsList, podMap) } diff --git a/pkg/controller/deployment/progress.go b/pkg/controller/deployment/progress.go index 3a1425be6c9b9..1062d7edc7ac4 100644 --- a/pkg/controller/deployment/progress.go +++ b/pkg/controller/deployment/progress.go @@ -25,54 +25,9 @@ import ( "k8s.io/api/core/v1" extensions "k8s.io/api/extensions/v1beta1" - "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/controller/deployment/util" ) -// hasFailed determines if a deployment has failed or not by estimating its progress. -// Progress for a deployment is considered when a new replica set is created or adopted, -// and when new pods scale up or old pods scale down. Progress is not estimated for paused -// deployments or when users don't really care about it ie. progressDeadlineSeconds is not -// specified. -func (dc *DeploymentController) hasFailed(d *extensions.Deployment, rsList []*extensions.ReplicaSet, podMap map[types.UID]*v1.PodList) (bool, error) { - if d.Spec.ProgressDeadlineSeconds == nil || d.Spec.RollbackTo != nil || d.Spec.Paused { - return false, nil - } - - newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(d, rsList, podMap, false) - if err != nil { - return false, err - } - - // There is a template change so we don't need to check for any progress right now. - if newRS == nil { - return false, nil - } - - // Look at the status of the deployment - if there is already a NewRSAvailableReason - // then we don't need to estimate any progress. This is needed in order to avoid - // estimating progress for scaling events after a rollout has finished. - cond := util.GetDeploymentCondition(d.Status, extensions.DeploymentProgressing) - if cond != nil && cond.Reason == util.NewRSAvailableReason { - return false, nil - } - - // TODO: Look for permanent failures here. - // See https://github.com/kubernetes/kubernetes/issues/18568 - - allRSs := append(oldRSs, newRS) - newStatus := calculateStatus(allRSs, newRS, d) - - // If the deployment is complete or it is progressing, there is no need to check if it - // has timed out. - if util.DeploymentComplete(d, &newStatus) || util.DeploymentProgressing(d, &newStatus) { - return false, nil - } - - // Check if the deployment has timed out. - return util.DeploymentTimedOut(d, &newStatus), nil -} - // syncRolloutStatus updates the status of a deployment during a rollout. There are // cases this helper will run that cannot be prevented from the scaling detection, // for example a resync of the deployment after it was scaled up. In those cases, From 2f8dbae9be469f3d7e3a5f6173f7684ec8957f9c Mon Sep 17 00:00:00 2001 From: Bowei Du Date: Thu, 3 Aug 2017 11:08:20 -0700 Subject: [PATCH 018/403] Update OWNERS files for networking components This will reduce the approval load for the top level tree owners --- cluster/addons/calico-policy-controller/OWNERS | 6 +++++- cluster/addons/cluster-loadbalancing/OWNERS | 6 ++++++ cluster/addons/ip-masq-agent/OWNERS | 6 ++++++ cluster/saltbase/salt/calico/OWNERS | 6 ++++++ cluster/saltbase/salt/cni/OWNERS | 8 ++++++++ cluster/saltbase/salt/kube-proxy/OWNERS | 8 ++++++++ cluster/saltbase/salt/l7-gcp/OWNERS | 6 ++++++ 7 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 cluster/addons/cluster-loadbalancing/OWNERS create mode 100644 cluster/addons/ip-masq-agent/OWNERS create mode 100644 cluster/saltbase/salt/calico/OWNERS create mode 100644 cluster/saltbase/salt/cni/OWNERS create mode 100644 cluster/saltbase/salt/kube-proxy/OWNERS create mode 100644 cluster/saltbase/salt/l7-gcp/OWNERS diff --git a/cluster/addons/calico-policy-controller/OWNERS b/cluster/addons/calico-policy-controller/OWNERS index 0ed4b3ecad3a6..04667f7de2856 100644 --- a/cluster/addons/calico-policy-controller/OWNERS +++ b/cluster/addons/calico-policy-controller/OWNERS @@ -1,6 +1,10 @@ approvers: -- caseydavenport +- bowei +- caseydavenport +- dnardo - fasaxc reviewers: +- bowei - caseydavenport +- dnardo - fasaxc diff --git a/cluster/addons/cluster-loadbalancing/OWNERS b/cluster/addons/cluster-loadbalancing/OWNERS new file mode 100644 index 0000000000000..59cd5f76e7876 --- /dev/null +++ b/cluster/addons/cluster-loadbalancing/OWNERS @@ -0,0 +1,6 @@ +approvers: +- bowei +- nicksardo +reviewers: +- bowei +- nicksardo diff --git a/cluster/addons/ip-masq-agent/OWNERS b/cluster/addons/ip-masq-agent/OWNERS new file mode 100644 index 0000000000000..ddd12a032ae3d --- /dev/null +++ b/cluster/addons/ip-masq-agent/OWNERS @@ -0,0 +1,6 @@ +approvers: +- bowei +- dnardo +reviewers: +- bowei +- dnardo diff --git a/cluster/saltbase/salt/calico/OWNERS b/cluster/saltbase/salt/calico/OWNERS new file mode 100644 index 0000000000000..ddd12a032ae3d --- /dev/null +++ b/cluster/saltbase/salt/calico/OWNERS @@ -0,0 +1,6 @@ +approvers: +- bowei +- dnardo +reviewers: +- bowei +- dnardo diff --git a/cluster/saltbase/salt/cni/OWNERS b/cluster/saltbase/salt/cni/OWNERS new file mode 100644 index 0000000000000..b09f54100b6ba --- /dev/null +++ b/cluster/saltbase/salt/cni/OWNERS @@ -0,0 +1,8 @@ +approvers: +- bowei +- dnardo +- freehan +reviewers: +- bowei +- dnardo +- freehan diff --git a/cluster/saltbase/salt/kube-proxy/OWNERS b/cluster/saltbase/salt/kube-proxy/OWNERS new file mode 100644 index 0000000000000..b09f54100b6ba --- /dev/null +++ b/cluster/saltbase/salt/kube-proxy/OWNERS @@ -0,0 +1,8 @@ +approvers: +- bowei +- dnardo +- freehan +reviewers: +- bowei +- dnardo +- freehan diff --git a/cluster/saltbase/salt/l7-gcp/OWNERS b/cluster/saltbase/salt/l7-gcp/OWNERS new file mode 100644 index 0000000000000..59cd5f76e7876 --- /dev/null +++ b/cluster/saltbase/salt/l7-gcp/OWNERS @@ -0,0 +1,6 @@ +approvers: +- bowei +- nicksardo +reviewers: +- bowei +- nicksardo From 7a45e3983bb7e2bd2cdc059a5dbc1a92e0efaae3 Mon Sep 17 00:00:00 2001 From: jianglingxia Date: Sat, 5 Aug 2017 11:04:27 +0800 Subject: [PATCH 019/403] fix the link of doc --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d9199e67fbfd..73ccf47413c50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4234,7 +4234,7 @@ Features for this release were tracked via the use of the [kubernetes/features]( * **[beta]** `kubefed` has graduated to beta: supports hosting federation on on-prem clusters, automatically configures `kube-dns` in joining clusters and allows passing arguments to federation components. ### Internal Storage Layer -* **[stable]** The internal storage layer for kubernetes cluster state has been updated to use etcd v3 by default. Existing clusters will have to plan for a data migration window. ([docs](https://github.com/kubernetes/kubernetes.github.io/pull/2763))([kubernetes/features#44](https://github.com/kubernetes/features/issues/44)) +* **[stable]** The internal storage layer for kubernetes cluster state has been updated to use etcd v3 by default. Existing clusters will have to plan for a data migration window. ([docs](https://kubernetes.io/docs/tasks/administer-cluster/upgrade-1-6/))([kubernetes/features#44](https://github.com/kubernetes/features/issues/44)) ### kubeadm * **[beta]** Introduces an API for clients to request TLS certificates from the API server. See the [tutorial](https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster). From 95cccbb1db15cd714719ffa40decefd59bc15cbe Mon Sep 17 00:00:00 2001 From: tcharding Date: Mon, 7 Aug 2017 16:14:21 +1000 Subject: [PATCH 020/403] Remove duplicate command example --- pkg/kubectl/cmd/portforward.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/kubectl/cmd/portforward.go b/pkg/kubectl/cmd/portforward.go index bcf3e694f4b50..4ae6c60cde646 100644 --- a/pkg/kubectl/cmd/portforward.go +++ b/pkg/kubectl/cmd/portforward.go @@ -59,10 +59,7 @@ var ( kubectl port-forward mypod 8888:5000 # Listen on a random port locally, forwarding to 5000 in the pod - kubectl port-forward mypod :5000 - - # Listen on a random port locally, forwarding to 5000 in the pod - kubectl port-forward mypod 0:5000`)) + kubectl port-forward mypod :5000`)) ) func NewCmdPortForward(f cmdutil.Factory, cmdOut, cmdErr io.Writer) *cobra.Command { From 2070b3848eb1540b8b4d32a951138851f7deb89e Mon Sep 17 00:00:00 2001 From: tcharding Date: Mon, 7 Aug 2017 17:05:21 +1000 Subject: [PATCH 021/403] Add whitespace to improve error msg clarity --- pkg/kubectl/cmd/explain.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kubectl/cmd/explain.go b/pkg/kubectl/cmd/explain.go index e2967e03da437..852c6c63a0227 100644 --- a/pkg/kubectl/cmd/explain.go +++ b/pkg/kubectl/cmd/explain.go @@ -65,7 +65,7 @@ func NewCmdExplain(f cmdutil.Factory, out, cmdErr io.Writer) *cobra.Command { // RunExplain executes the appropriate steps to print a model's documentation func RunExplain(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, args []string) error { if len(args) == 0 { - fmt.Fprint(cmdErr, "You must specify the type of resource to explain. ", validResources) + fmt.Fprintf(cmdErr, "You must specify the type of resource to explain. %s\n", validResources) return cmdutil.UsageErrorf(cmd, "Required resource not specified.") } if len(args) > 1 { From 10794e7f6e3a35639c4de5f15788304b9eea9f3d Mon Sep 17 00:00:00 2001 From: Matt Landis Date: Thu, 29 Jun 2017 16:27:05 -0700 Subject: [PATCH 022/403] Arbitrarily chose first (lexicographically) subnet in AZ on AWS. When there is more than one subnet for an AZ on AWS choose arbitrarily chose the first one lexicographically for consistency. --- pkg/cloudprovider/providers/aws/aws.go | 11 +++++++-- pkg/cloudprovider/providers/aws/aws_test.go | 26 +++++++++++++++++---- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index 13db9301a5b13..c782c91832b3d 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -2467,8 +2467,15 @@ func (c *Cloud) findELBSubnets(internalELB bool) ([]string, error) { continue } - // TODO: Should this be an error? - glog.Warningf("Found multiple subnets in AZ %q; making arbitrary choice between subnets %q and %q", az, *existing.SubnetId, *subnet.SubnetId) + // If we have two subnets for the same AZ we arbitrarily choose the one that is first lexicographically. + // TODO: Should this be an error. + if strings.Compare(*existing.SubnetId, *subnet.SubnetId) > 0 { + glog.Warningf("Found multiple subnets in AZ %q; choosing %q between subnets %q and %q", az, *subnet.SubnetId, *existing.SubnetId, *subnet.SubnetId) + subnetsByAZ[az] = subnet + continue + } + + glog.Warningf("Found multiple subnets in AZ %q; choosing %q between subnets %q and %q", az, *existing.SubnetId, *existing.SubnetId, *subnet.SubnetId) continue } diff --git a/pkg/cloudprovider/providers/aws/aws_test.go b/pkg/cloudprovider/providers/aws/aws_test.go index b1302510e63c6..ee2712b5205bb 100644 --- a/pkg/cloudprovider/providers/aws/aws_test.go +++ b/pkg/cloudprovider/providers/aws/aws_test.go @@ -792,12 +792,18 @@ func TestSubnetIDsinVPC(t *testing.T) { } } - // test with 4 subnets from 3 different AZs - // add duplicate az subnet + // Test with 5 subnets from 3 different AZs. + // Add 2 duplicate AZ subnets lexicographically chosen one is the middle element in array to + // check that we both choose the correct entry when it comes after and before another element + // in the same AZ. subnets[3] = make(map[string]string) - subnets[3]["id"] = "subnet-c0000002" + subnets[3]["id"] = "subnet-c0000000" subnets[3]["az"] = "af-south-1c" + subnets[4] = make(map[string]string) + subnets[4]["id"] = "subnet-c0000002" + subnets[4]["az"] = "af-south-1c" awsServices.ec2.Subnets = constructSubnets(subnets) + routeTables["subnet-c0000000"] = true routeTables["subnet-c0000002"] = true awsServices.ec2.RouteTables = constructRouteTables(routeTables) @@ -812,6 +818,16 @@ func TestSubnetIDsinVPC(t *testing.T) { return } + expected := []*string{aws.String("subnet-a0000001"), aws.String("subnet-b0000001"), aws.String("subnet-c0000000")} + for _, s := range result { + if !contains(expected, s) { + t.Errorf("Unexpected subnet '%s' found", s) + return + } + } + + delete(routeTables, "subnet-c0000002") + // test with 6 subnets from 3 different AZs // with 3 private subnets subnets[4] = make(map[string]string) @@ -825,7 +841,7 @@ func TestSubnetIDsinVPC(t *testing.T) { routeTables["subnet-a0000001"] = false routeTables["subnet-b0000001"] = false routeTables["subnet-c0000001"] = false - routeTables["subnet-c0000002"] = true + routeTables["subnet-c0000000"] = true routeTables["subnet-d0000001"] = true routeTables["subnet-d0000002"] = true awsServices.ec2.RouteTables = constructRouteTables(routeTables) @@ -840,7 +856,7 @@ func TestSubnetIDsinVPC(t *testing.T) { return } - expected := []*string{aws.String("subnet-c0000002"), aws.String("subnet-d0000001"), aws.String("subnet-d0000002")} + expected = []*string{aws.String("subnet-c0000000"), aws.String("subnet-d0000001"), aws.String("subnet-d0000002")} for _, s := range result { if !contains(expected, s) { t.Errorf("Unexpected subnet '%s' found", s) From 847aa640b412658a25ece226c422c84be60140c2 Mon Sep 17 00:00:00 2001 From: zouyee Date: Wed, 9 Aug 2017 09:10:19 +0800 Subject: [PATCH 023/403] fix dump --- pkg/kubelet/certificate/certificate_store.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kubelet/certificate/certificate_store.go b/pkg/kubelet/certificate/certificate_store.go index 5230f1ab9b343..a98a9031978d0 100644 --- a/pkg/kubelet/certificate/certificate_store.go +++ b/pkg/kubelet/certificate/certificate_store.go @@ -101,7 +101,7 @@ func (s *fileStore) recover() error { } return err } else if fi.Mode()&os.ModeSymlink != os.ModeSymlink { - return fmt.Errorf("expected %q to be a symlink but it is a file.", updatedPath) + return fmt.Errorf("expected %q to be a symlink but it is a file", updatedPath) } // Move the 'updated' symlink to 'current'. @@ -184,7 +184,7 @@ func loadCertKeyBlocks(pairFile string) (cert *pem.Block, key *pem.Block, err er if certBlock == nil { return nil, nil, fmt.Errorf("could not decode the first block from %q from expected PEM format", pairFile) } - keyBlock, rest := pem.Decode(rest) + keyBlock, _ := pem.Decode(rest) if keyBlock == nil { return nil, nil, fmt.Errorf("could not decode the second block from %q from expected PEM format", pairFile) } From 33fa15370241fc7419bde06ce7524ad446ccb8eb Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Fri, 4 Aug 2017 13:57:43 +0800 Subject: [PATCH 024/403] Fix typos in kubefed package --- federation/pkg/kubefed/init/init.go | 2 +- federation/pkg/kubefed/util/util.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/federation/pkg/kubefed/init/init.go b/federation/pkg/kubefed/init/init.go index 31f000e3e2cd7..2599c45843964 100644 --- a/federation/pkg/kubefed/init/init.go +++ b/federation/pkg/kubefed/init/init.go @@ -284,7 +284,7 @@ func (i *initFederation) Run(cmdOut io.Writer, config util.AdminConfig) error { return err } // If the error is type NoRBACAPIError, We continue to create the rest of - // the resources, without the SA and roles (in the abscense of RBAC support). + // the resources, without the SA and roles (in the absence of RBAC support). rbacAvailable = false } diff --git a/federation/pkg/kubefed/util/util.go b/federation/pkg/kubefed/util/util.go index 075041236cacd..8be4d5a597b56 100644 --- a/federation/pkg/kubefed/util/util.go +++ b/federation/pkg/kubefed/util/util.go @@ -259,7 +259,7 @@ func buildConfigFromSecret(secret *api.Secret, serverAddress string) (*restclien // GetVersionedClientForRBACOrFail discovers the versioned rbac APIs and gets the versioned // clientset for either the preferred version or the first listed version (if no preference listed) -// TODO: We need to evaluate the usage of RESTMapper interface to achieve te same functionality +// TODO: We need to evaluate the usage of RESTMapper interface to achieve the same functionality func GetVersionedClientForRBACOrFail(hostFactory cmdutil.Factory) (client.Interface, error) { discoveryclient, err := hostFactory.DiscoveryClient() if err != nil { From 4355d7014d3f2009c90bc1fe55c8f174fe6809d1 Mon Sep 17 00:00:00 2001 From: zhangyujun Date: Fri, 11 Aug 2017 10:54:23 +0800 Subject: [PATCH 025/403] Fix the method name of BuiltInAuthenticationOptions change the BuiltInAuthenticationOptions.WithAnyonymous to WithAnonymous would be better. --- pkg/kubeapiserver/options/authentication.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kubeapiserver/options/authentication.go b/pkg/kubeapiserver/options/authentication.go index 89a5219d6af73..5b36415a5ab16 100644 --- a/pkg/kubeapiserver/options/authentication.go +++ b/pkg/kubeapiserver/options/authentication.go @@ -88,7 +88,7 @@ func NewBuiltInAuthenticationOptions() *BuiltInAuthenticationOptions { func (s *BuiltInAuthenticationOptions) WithAll() *BuiltInAuthenticationOptions { return s. - WithAnyonymous(). + WithAnonymous(). WithBootstrapToken(). WithClientCert(). WithKeystone(). @@ -100,7 +100,7 @@ func (s *BuiltInAuthenticationOptions) WithAll() *BuiltInAuthenticationOptions { WithWebHook() } -func (s *BuiltInAuthenticationOptions) WithAnyonymous() *BuiltInAuthenticationOptions { +func (s *BuiltInAuthenticationOptions) WithAnonymous() *BuiltInAuthenticationOptions { s.Anonymous = &AnonymousAuthenticationOptions{Allow: true} return s } From 813d264c86ba461c20c741c28b7890f712392491 Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Fri, 11 Aug 2017 16:49:38 -0700 Subject: [PATCH 026/403] Delete load balancers if the UIDs for services don't match. --- pkg/controller/service/service_controller.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/controller/service/service_controller.go b/pkg/controller/service/service_controller.go index 52f3c64998a69..9303290071dda 100644 --- a/pkg/controller/service/service_controller.go +++ b/pkg/controller/service/service_controller.go @@ -223,7 +223,14 @@ func (s *ServiceController) init() error { // indicating whether processing should be retried; zero means no-retry; otherwise // we should retry in that Duration. func (s *ServiceController) processServiceUpdate(cachedService *cachedService, service *v1.Service, key string) (error, time.Duration) { - + if cachedService.state != nil { + if cachedService.state.UID != service.UID { + err, retry := s.processLoadBalancerDelete(cachedService, key) + if err != nil { + return err, retry + } + } + } // cache the service, we need the info for service deletion cachedService.state = service err, retry := s.createLoadBalancerIfNeeded(key, service) @@ -765,6 +772,10 @@ func (s *ServiceController) processServiceDeletion(key string) (error, time.Dura if !ok { return fmt.Errorf("Service %s not in cache even though the watcher thought it was. Ignoring the deletion.", key), doNotRetry } + return s.processLoadBalancerDelete(cachedService, key) +} + +func (s *ServiceController) processLoadBalancerDelete(cachedService *cachedService, key string) (error, time.Duration) { service := cachedService.state // delete load balancer info only if the service type is LoadBalancer if !wantsLoadBalancer(service) { From 71501d0304cae878fffa216feec842d0e31f739b Mon Sep 17 00:00:00 2001 From: zhangxiaoyu-zidif Date: Sat, 12 Aug 2017 13:56:26 +0800 Subject: [PATCH 027/403] do-rebase --- pkg/controller/cronjob/utils.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/controller/cronjob/utils.go b/pkg/controller/cronjob/utils.go index dbdd8dd96c8db..5ac1fc5b6e56c 100644 --- a/pkg/controller/cronjob/utils.go +++ b/pkg/controller/cronjob/utils.go @@ -169,8 +169,6 @@ func getRecentUnmetScheduleTimes(sj batchv2alpha1.CronJob, now time.Time) ([]tim return starts, nil } -// XXX unit test this - // getJobFromTemplate makes a Job from a CronJob func getJobFromTemplate(sj *batchv2alpha1.CronJob, scheduledTime time.Time) (*batchv1.Job, error) { // TODO: consider adding the following labels: @@ -200,7 +198,7 @@ func getJobFromTemplate(sj *batchv2alpha1.CronJob, scheduledTime time.Time) (*ba return job, nil } -// Return Unix Epoch Time +// getTimeHash returns Unix Epoch Time func getTimeHash(scheduledTime time.Time) int64 { return scheduledTime.Unix() } From 72f4ab70e28a945ce25d40524696d0a486f8969e Mon Sep 17 00:00:00 2001 From: xiangpengzhao Date: Sun, 13 Aug 2017 00:26:52 +0800 Subject: [PATCH 028/403] Remove deprecated flag "long-running-request-regexp". --- .../apiserver/pkg/server/options/server_run_options.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go b/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go index 0ca9d5973a1a9..7045750cb8e74 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go @@ -104,12 +104,6 @@ func (s *ServerRunOptions) AddUniversalFlags(fs *pflag.FlagSet) { fs.StringVar(&s.ExternalHost, "external-hostname", s.ExternalHost, "The hostname to use when generating externalized URLs for this master (e.g. Swagger API Docs).") - // TODO: remove post-1.6 - fs.String("long-running-request-regexp", "", ""+ - "A regular expression matching long running requests which should "+ - "be excluded from maximum inflight request handling.") - fs.MarkDeprecated("long-running-request-regexp", "regular expression matching of long-running requests is no longer supported") - deprecatedMasterServiceNamespace := metav1.NamespaceDefault fs.StringVar(&deprecatedMasterServiceNamespace, "master-service-namespace", deprecatedMasterServiceNamespace, ""+ "DEPRECATED: the namespace from which the kubernetes master services should be injected into pods.") From 107ead78ce0545a858738f07f188a380d63e603d Mon Sep 17 00:00:00 2001 From: Phillip Wittrock Date: Sun, 13 Aug 2017 10:22:03 -0700 Subject: [PATCH 029/403] Implement kind visitor library for kubectl - Will be used to replace "Kind" switch statements - Allow for removal of go library dependency on kubernetes/kubernetes unversioned api packages - Better support for ensuring all types are accounted for --- pkg/kubectl/BUILD | 1 + pkg/kubectl/apps/BUILD | 42 ++++++ pkg/kubectl/apps/apps_suite_test.go | 29 ++++ pkg/kubectl/apps/kind_visitor.go | 95 +++++++++++++ pkg/kubectl/apps/kind_visitor_test.go | 190 ++++++++++++++++++++++++++ 5 files changed, 357 insertions(+) create mode 100644 pkg/kubectl/apps/BUILD create mode 100644 pkg/kubectl/apps/apps_suite_test.go create mode 100644 pkg/kubectl/apps/kind_visitor.go create mode 100644 pkg/kubectl/apps/kind_visitor_test.go diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index a408dad1dead5..5e2a4a911407a 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -184,6 +184,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/kubectl/apps:all-srcs", "//pkg/kubectl/cmd:all-srcs", "//pkg/kubectl/metricsutil:all-srcs", "//pkg/kubectl/plugins:all-srcs", diff --git a/pkg/kubectl/apps/BUILD b/pkg/kubectl/apps/BUILD new file mode 100644 index 0000000000000..0d9d988760ffd --- /dev/null +++ b/pkg/kubectl/apps/BUILD @@ -0,0 +1,42 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_library( + name = "go_default_library", + srcs = ["kind_visitor.go"], + tags = ["automanaged"], + deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) + +go_test( + name = "go_default_xtest", + srcs = [ + "apps_suite_test.go", + "kind_visitor_test.go", + ], + deps = [ + ":go_default_library", + "//vendor/github.com/onsi/ginkgo:go_default_library", + "//vendor/github.com/onsi/gomega:go_default_library", + ], +) diff --git a/pkg/kubectl/apps/apps_suite_test.go b/pkg/kubectl/apps/apps_suite_test.go new file mode 100644 index 0000000000000..a2300f1e445fb --- /dev/null +++ b/pkg/kubectl/apps/apps_suite_test.go @@ -0,0 +1,29 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apps_test + +import ( + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "testing" +) + +func TestApps(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Apps Suite") +} diff --git a/pkg/kubectl/apps/kind_visitor.go b/pkg/kubectl/apps/kind_visitor.go new file mode 100644 index 0000000000000..98443c60a5161 --- /dev/null +++ b/pkg/kubectl/apps/kind_visitor.go @@ -0,0 +1,95 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apps + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// KindVisitor is used with GroupKindElement to call a particular function depending on the +// Kind of a schema.GroupKind +type KindVisitor interface { + VisitDaemonSet(kind GroupKindElement) + VisitDeployment(kind GroupKindElement) + VisitJob(kind GroupKindElement) + VisitPod(kind GroupKindElement) + VisitReplicaSet(kind GroupKindElement) + VisitReplicationController(kind GroupKindElement) + VisitStatefulSet(kind GroupKindElement) +} + +// GroupKindElement defines a Kubernetes API group elem +type GroupKindElement schema.GroupKind + +// Accept calls the Visit method on visitor that corresponds to elem's Kind +func (elem GroupKindElement) Accept(visitor KindVisitor) error { + if elem.GroupMatch("apps", "extensions") && elem.Kind == "DaemonSet" { + visitor.VisitDaemonSet(elem) + return nil + } + if elem.GroupMatch("apps", "extensions") && elem.Kind == "Deployment" { + visitor.VisitDeployment(elem) + return nil + } + if elem.GroupMatch("apps", "extensions") && elem.Kind == "Job" { + visitor.VisitDeployment(elem) + return nil + } + if elem.GroupMatch("", "core") && elem.Kind == "Pod" { + visitor.VisitPod(elem) + return nil + } + if elem.GroupMatch("apps", "extensions") && elem.Kind == "ReplicaSet" { + visitor.VisitReplicationController(elem) + return nil + } + if elem.GroupMatch("", "core") && elem.Kind == "ReplicationController" { + visitor.VisitReplicationController(elem) + return nil + } + if elem.GroupMatch("apps") && elem.Kind == "StatefulSet" { + visitor.VisitStatefulSet(elem) + return nil + } + return fmt.Errorf("no visitor method exists for %v", elem) +} + +// GroupMatch returns true if and only if elem's group matches one +// of the group arguments +func (elem GroupKindElement) GroupMatch(groups ...string) bool { + for _, g := range groups { + if elem.Group == g { + return true + } + } + return false +} + +// DefaultKindVisitor implements KindVisitor with no-op functions. +type DefaultKindVisitor struct{} + +var _ KindVisitor = &DefaultKindVisitor{} + +func (*DefaultKindVisitor) VisitDaemonSet(kind GroupKindElement) {} +func (*DefaultKindVisitor) VisitDeployment(kind GroupKindElement) {} +func (*DefaultKindVisitor) VisitJob(kind GroupKindElement) {} +func (*DefaultKindVisitor) VisitPod(kind GroupKindElement) {} +func (*DefaultKindVisitor) VisitReplicaSet(kind GroupKindElement) {} +func (*DefaultKindVisitor) VisitReplicationController(kind GroupKindElement) {} +func (*DefaultKindVisitor) VisitStatefulSet(kind GroupKindElement) {} diff --git a/pkg/kubectl/apps/kind_visitor_test.go b/pkg/kubectl/apps/kind_visitor_test.go new file mode 100644 index 0000000000000..7d392b0491059 --- /dev/null +++ b/pkg/kubectl/apps/kind_visitor_test.go @@ -0,0 +1,190 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apps_test + +import ( + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "k8s.io/kubernetes/pkg/kubectl/apps" +) + +var _ = Describe("When KindVisitor accepts a GroupKind", func() { + + var visitor *TestKindVisitor + + BeforeEach(func() { + visitor = &TestKindVisitor{map[string]int{}} + }) + + It("should Visit DaemonSet iff the Kind is a DaemonSet", func() { + kind := apps.GroupKindElement{ + Kind: "DaemonSet", + Group: "apps", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "DaemonSet": 1, + })) + + kind = apps.GroupKindElement{ + Kind: "DaemonSet", + Group: "extensions", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "DaemonSet": 2, + })) + }) + + It("should Visit Deployment iff the Kind is a Deployment", func() { + kind := apps.GroupKindElement{ + Kind: "Deployment", + Group: "apps", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "Deployment": 1, + })) + + kind = apps.GroupKindElement{ + Kind: "Deployment", + Group: "extensions", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "Deployment": 2, + })) + }) + + It("should Visit Job iff the Kind is a Job", func() { + kind := apps.GroupKindElement{ + Kind: "Job", + Group: "apps", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "Job": 1, + })) + + kind = apps.GroupKindElement{ + Kind: "Job", + Group: "extensions", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "Job": 2, + })) + }) + + It("should Visit Pod iff the Kind is a Pod", func() { + kind := apps.GroupKindElement{ + Kind: "Pod", + Group: "", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "Pod": 1, + })) + + kind = apps.GroupKindElement{ + Kind: "Pod", + Group: "core", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "Pod": 2, + })) + }) + + It("should Visit ReplicationController iff the Kind is a ReplicationController", func() { + kind := apps.GroupKindElement{ + Kind: "ReplicationController", + Group: "", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "ReplicationController": 1, + })) + + kind = apps.GroupKindElement{ + Kind: "ReplicationController", + Group: "core", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "ReplicationController": 2, + })) + }) + + It("should Visit ReplicaSet iff the Kind is a ReplicaSet", func() { + kind := apps.GroupKindElement{ + Kind: "ReplicaSet", + Group: "apps", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "ReplicaSet": 1, + })) + + kind = apps.GroupKindElement{ + Kind: "ReplicaSet", + Group: "extensions", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "ReplicaSet": 2, + })) + }) + + It("should Visit StatefulSet iff the Kind is a StatefulSet", func() { + kind := apps.GroupKindElement{ + Kind: "StatefulSet", + Group: "apps", + } + Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{ + "StatefulSet": 1, + })) + }) + + It("should give an error if the Kind is unknown", func() { + kind := apps.GroupKindElement{ + Kind: "Unknown", + Group: "apps", + } + Expect(kind.Accept(visitor)).Should(HaveOccurred()) + Expect(visitor.visits).To(Equal(map[string]int{})) + }) +}) + +// TestKindVisitor increments a value each time a Visit method was called +type TestKindVisitor struct { + visits map[string]int +} + +var _ apps.KindVisitor = &TestKindVisitor{} + +func (t *TestKindVisitor) Visit(kind apps.GroupKindElement) { t.visits[kind.Kind] += 1 } + +func (t *TestKindVisitor) VisitDaemonSet(kind apps.GroupKindElement) { t.Visit(kind) } +func (t *TestKindVisitor) VisitDeployment(kind apps.GroupKindElement) { t.Visit(kind) } +func (t *TestKindVisitor) VisitJob(kind apps.GroupKindElement) { t.Visit(kind) } +func (t *TestKindVisitor) VisitPod(kind apps.GroupKindElement) { t.Visit(kind) } +func (t *TestKindVisitor) VisitReplicaSet(kind apps.GroupKindElement) { t.Visit(kind) } +func (t *TestKindVisitor) VisitReplicationController(kind apps.GroupKindElement) { t.Visit(kind) } +func (t *TestKindVisitor) VisitStatefulSet(kind apps.GroupKindElement) { t.Visit(kind) } From e97a18b4358a9ea622624b1addac568d7bd91105 Mon Sep 17 00:00:00 2001 From: Phillip Wittrock Date: Sun, 13 Aug 2017 10:53:55 -0700 Subject: [PATCH 030/403] Support for using a client-go client from kubectl --- pkg/kubectl/cmd/testing/BUILD | 1 + pkg/kubectl/cmd/testing/fake.go | 32 +++++++++++++++++++ pkg/kubectl/cmd/util/BUILD | 1 + pkg/kubectl/cmd/util/clientcache.go | 29 +++++++++++++++++ pkg/kubectl/cmd/util/factory.go | 5 +++ pkg/kubectl/cmd/util/factory_client_access.go | 5 +++ 6 files changed, 73 insertions(+) diff --git a/pkg/kubectl/cmd/testing/BUILD b/pkg/kubectl/cmd/testing/BUILD index 62f5708a2d0f5..e6b0ab3045c52 100644 --- a/pkg/kubectl/cmd/testing/BUILD +++ b/pkg/kubectl/cmd/testing/BUILD @@ -35,6 +35,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/rest/fake:go_default_library", ], diff --git a/pkg/kubectl/cmd/testing/fake.go b/pkg/kubectl/cmd/testing/fake.go index 23c27a45653fa..8413823798bc8 100644 --- a/pkg/kubectl/cmd/testing/fake.go +++ b/pkg/kubectl/cmd/testing/fake.go @@ -34,6 +34,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/client-go/discovery" + "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/client-go/rest/fake" fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" @@ -307,6 +308,10 @@ func (f *FakeFactory) RESTClient() (*restclient.RESTClient, error) { return nil, nil } +func (f *FakeFactory) KubernetesClientSet() (*kubernetes.Clientset, error) { + return nil, nil +} + func (f *FakeFactory) ClientSet() (internalclientset.Interface, error) { return nil, nil } @@ -582,6 +587,33 @@ func (f *fakeAPIFactory) JSONEncoder() runtime.Encoder { return testapi.Default.Codec() } +func (f *fakeAPIFactory) KubernetesClientSet() (*kubernetes.Clientset, error) { + fakeClient := f.tf.Client.(*fake.RESTClient) + clientset := kubernetes.NewForConfigOrDie(f.tf.ClientConfig) + + clientset.CoreV1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.AuthorizationV1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.AuthorizationV1beta1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.AuthorizationV1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.AuthorizationV1beta1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.AutoscalingV1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.AutoscalingV2alpha1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.BatchV1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.BatchV2alpha1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.CertificatesV1beta1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.ExtensionsV1beta1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.RbacV1alpha1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.RbacV1beta1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.StorageV1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.StorageV1beta1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.AppsV1beta1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.AppsV1beta2().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.PolicyV1beta1().RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + clientset.DiscoveryClient.RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + + return clientset, f.tf.Err +} + func (f *fakeAPIFactory) ClientSet() (internalclientset.Interface, error) { // Swap the HTTP client out of the REST client with the fake // version. diff --git a/pkg/kubectl/cmd/util/BUILD b/pkg/kubectl/cmd/util/BUILD index 99473b51dc0ae..68eee0a23bcd8 100644 --- a/pkg/kubectl/cmd/util/BUILD +++ b/pkg/kubectl/cmd/util/BUILD @@ -66,6 +66,7 @@ go_library( "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/dynamic:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", "//vendor/k8s.io/client-go/util/homedir:go_default_library", diff --git a/pkg/kubectl/cmd/util/clientcache.go b/pkg/kubectl/cmd/util/clientcache.go index da7c45cc6e737..9de532ecc9863 100644 --- a/pkg/kubectl/cmd/util/clientcache.go +++ b/pkg/kubectl/cmd/util/clientcache.go @@ -21,6 +21,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/discovery" + "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" @@ -58,6 +59,34 @@ type ClientCache struct { // argument evaluation discoveryClientFactory DiscoveryClientFactory discoveryClient discovery.DiscoveryInterface + + kubernetesClientLoader KubernetesClientCache +} + +// kubernetesClientLoader provides a new kubernetes.Clientset +type KubernetesClientCache struct { + // once makes sure the client is only initialized once + once sync.Once + // client is the cached client value + client *kubernetes.Clientset + // err is the cached error value + err error +} + +// KubernetesClientSet returns a new kubernetes.Clientset. It will cache the value +// the first time it is called and return the cached value on subsequent calls. +// If an error is encountered the first time KubernetesClientSet is called, +// the error will be cached. +func (c *ClientCache) KubernetesClientSet(requiredVersion *schema.GroupVersion) (*kubernetes.Clientset, error) { + c.kubernetesClientLoader.once.Do(func() { + config, err := c.ClientConfigForVersion(requiredVersion) + if err != nil { + c.kubernetesClientLoader.err = err + return + } + c.kubernetesClientLoader.client, c.kubernetesClientLoader.err = kubernetes.NewForConfig(config) + }) + return c.kubernetesClientLoader.client, c.kubernetesClientLoader.err } // also looks up the discovery client. We can't do this during init because the flags won't have been set diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 13419716ce55b..40a879bd884ef 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -43,6 +43,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/serializer/json" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/discovery" + "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" @@ -91,6 +92,10 @@ type ClientAccessFactory interface { // ClientSet gives you back an internal, generated clientset ClientSet() (internalclientset.Interface, error) + + // KubernetesClientSet gives you back an external clientset + KubernetesClientSet() (*kubernetes.Clientset, error) + // Returns a RESTClient for accessing Kubernetes resources or an error. RESTClient() (*restclient.RESTClient, error) // Returns a client.Config for accessing the Kubernetes server. diff --git a/pkg/kubectl/cmd/util/factory_client_access.go b/pkg/kubectl/cmd/util/factory_client_access.go index 9aaa4680c8172..2cf9c7a39f264 100644 --- a/pkg/kubectl/cmd/util/factory_client_access.go +++ b/pkg/kubectl/cmd/util/factory_client_access.go @@ -37,6 +37,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" utilflag "k8s.io/apiserver/pkg/util/flag" "k8s.io/client-go/discovery" + "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" @@ -167,6 +168,10 @@ func (f *ring0Factory) DiscoveryClient() (discovery.CachedDiscoveryInterface, er return f.discoveryFactory.DiscoveryClient() } +func (f *ring0Factory) KubernetesClientSet() (*kubernetes.Clientset, error) { + return f.clientCache.KubernetesClientSet(nil) +} + func (f *ring0Factory) ClientSet() (internalclientset.Interface, error) { return f.clientCache.ClientSetForVersion(nil) } From b85743b868ef8ce9e7a4b015904ddc7afdfdd572 Mon Sep 17 00:00:00 2001 From: FengyunPan Date: Mon, 14 Aug 2017 10:09:50 +0800 Subject: [PATCH 031/403] Mark volume as detached when node does not exist for vsphere If node does not exist, node's volumes will be detached automatically and become available. So mark them detached and return false without error. Fix #50266 --- .../providers/vsphere/vclib/utils.go | 15 ++++++ .../providers/vsphere/vclib/virtualmachine.go | 12 ++--- .../providers/vsphere/vsphere.go | 54 +++++++++---------- 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/pkg/cloudprovider/providers/vsphere/vclib/utils.go b/pkg/cloudprovider/providers/vsphere/vclib/utils.go index 8b80b4a4482f4..3ae00e8c660ad 100644 --- a/pkg/cloudprovider/providers/vsphere/vclib/utils.go +++ b/pkg/cloudprovider/providers/vsphere/vclib/utils.go @@ -27,6 +27,21 @@ import ( "github.com/vmware/govmomi/vim25/types" ) +// IsNotFound return true if err is NotFoundError or DefaultNotFoundError +func IsNotFound(err error) bool { + _, ok := err.(*find.NotFoundError) + if ok { + return true + } + + _, ok = err.(*find.DefaultNotFoundError) + if ok { + return true + } + + return false +} + func getFinder(dc *Datacenter) *find.Finder { finder := find.NewFinder(dc.Client(), true) finder.SetDatacenter(dc.Datacenter) diff --git a/pkg/cloudprovider/providers/vsphere/vclib/virtualmachine.go b/pkg/cloudprovider/providers/vsphere/vclib/virtualmachine.go index aed47f3c56607..91d70535b8f6f 100644 --- a/pkg/cloudprovider/providers/vsphere/vclib/virtualmachine.go +++ b/pkg/cloudprovider/providers/vsphere/vclib/virtualmachine.go @@ -188,9 +188,9 @@ func (vm *VirtualMachine) GetResourcePool(ctx context.Context) (*object.Resource return object.NewResourcePool(vm.Client(), vmMoList[0].ResourcePool.Reference()), nil } -// Exists checks if the VM exists. -// Returns false if VM doesn't exist or VM is in powerOff state. -func (vm *VirtualMachine) Exists(ctx context.Context) (bool, error) { +// IsActive checks if the VM is active. +// Returns true if VM is in poweredOn state. +func (vm *VirtualMachine) IsActive(ctx context.Context) (bool, error) { vmMoList, err := vm.Datacenter.GetVMMoList(ctx, []*VirtualMachine{vm}, []string{"summary"}) if err != nil { glog.Errorf("Failed to get VM Managed object with property summary. err: +%v", err) @@ -199,11 +199,7 @@ func (vm *VirtualMachine) Exists(ctx context.Context) (bool, error) { if vmMoList[0].Summary.Runtime.PowerState == ActivePowerState { return true, nil } - if vmMoList[0].Summary.Config.Template == false { - glog.Warningf("VM is not in %s state", ActivePowerState) - } else { - glog.Warningf("VM is a template") - } + return false, nil } diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 60086d52297d5..d362666eba09e 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -391,18 +391,22 @@ func (vs *VSphere) InstanceID(nodeName k8stypes.NodeName) (string, error) { } vm, err := vs.getVMByName(ctx, nodeName) if err != nil { + if vclib.IsNotFound(err) { + return "", cloudprovider.InstanceNotFound + } glog.Errorf("Failed to get VM object for node: %q. err: +%v", nodeNameToVMName(nodeName), err) return "", err } - nodeExist, err := vm.Exists(ctx) + isActive, err := vm.IsActive(ctx) if err != nil { - glog.Errorf("Failed to check whether node %q exist. err: %+v.", nodeNameToVMName(nodeName), err) + glog.Errorf("Failed to check whether node %q is active. err: %+v.", nodeNameToVMName(nodeName), err) return "", err } - if nodeExist { + if isActive { return "/" + vm.InventoryPath, nil } - return "", cloudprovider.InstanceNotFound + + return "", fmt.Errorf("The node %q is not active", nodeNameToVMName(nodeName)) } // InstanceTypeByProviderID returns the cloudprovider instance type of the node with the specified unique providerID @@ -530,22 +534,15 @@ func (vs *VSphere) DiskIsAttached(volPath string, nodeName k8stypes.NodeName) (b } vm, err := vs.getVMByName(ctx, nodeName) if err != nil { + if vclib.IsNotFound(err) { + glog.Warningf("Node %q does not exist, vsphere CP will assume disk %v is not attached to it.", nodeName, volPath) + // make the disk as detached and return false without error. + return false, nil + } glog.Errorf("Failed to get VM object for node: %q. err: +%v", vSphereInstance, err) return false, err } - nodeExist, err := vm.Exists(ctx) - if err != nil { - glog.Errorf("Failed to check whether node %q exist. err: %+v", vSphereInstance, err) - return false, err - } - if !nodeExist { - glog.Errorf("DiskIsAttached failed to determine whether disk %q is still attached: node %q is powered off", - volPath, - vSphereInstance) - return false, fmt.Errorf("DiskIsAttached failed to determine whether disk %q is still attached: node %q is powered off", - volPath, - vSphereInstance) - } + attached, err := vm.IsDiskAttached(ctx, volPath) if err != nil { glog.Errorf("DiskIsAttached failed to determine whether disk %q is still attached on node %q", @@ -584,22 +581,19 @@ func (vs *VSphere) DisksAreAttached(volPaths []string, nodeName k8stypes.NodeNam } vm, err := vs.getVMByName(ctx, nodeName) if err != nil { + if vclib.IsNotFound(err) { + glog.Warningf("Node %q does not exist, vsphere CP will assume all disks %v are not attached to it.", nodeName, volPaths) + // make all the disks as detached and return false without error. + attached := make(map[string]bool) + for _, volPath := range volPaths { + attached[volPath] = false + } + return attached, nil + } glog.Errorf("Failed to get VM object for node: %q. err: +%v", vSphereInstance, err) return nil, err } - nodeExist, err := vm.Exists(ctx) - if err != nil { - glog.Errorf("Failed to check whether node %q exist. err: %+v", vSphereInstance, err) - return nil, err - } - if !nodeExist { - glog.Errorf("DisksAreAttached failed to determine whether disks %v are still attached: node %q does not exist", - volPaths, - vSphereInstance) - return nil, fmt.Errorf("DisksAreAttached failed to determine whether disks %v are still attached: node %q does not exist", - volPaths, - vSphereInstance) - } + for _, volPath := range volPaths { result, err := vm.IsDiskAttached(ctx, volPath) if err == nil { From ea32f06d20b9f6d547f52b419333b8620aba9368 Mon Sep 17 00:00:00 2001 From: FengyunPan Date: Mon, 14 Aug 2017 10:12:46 +0800 Subject: [PATCH 032/403] [VSphere] Don't return err when node doesn't exist in DetachDisk() --- pkg/cloudprovider/providers/vsphere/vsphere.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index d362666eba09e..2105edcd6e9ac 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -498,6 +498,12 @@ func (vs *VSphere) DetachDisk(volPath string, nodeName k8stypes.NodeName) error } vm, err := vs.getVMByName(ctx, nodeName) if err != nil { + // If node doesn't exist, disk is already detached from node. + if vclib.IsNotFound(err) { + glog.Infof("Node %q does not exist, disk %s is already detached from node.", nodeNameToVMName(nodeName), volPath) + return nil + } + glog.Errorf("Failed to get VM object for node: %q. err: +%v", nodeNameToVMName(nodeName), err) return err } From abee0ce8a358b8a11dec874d080bbba5b6dac216 Mon Sep 17 00:00:00 2001 From: Klaus Ma Date: Mon, 14 Aug 2017 15:17:56 +0800 Subject: [PATCH 033/403] NodeConditionPredicates should return NodeOutOfDisk error. --- pkg/controller/daemon/daemon_controller.go | 2 +- .../daemon/daemon_controller_test.go | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/pkg/controller/daemon/daemon_controller.go b/pkg/controller/daemon/daemon_controller.go index 93673f07766cd..0c8a4ff3e65da 100644 --- a/pkg/controller/daemon/daemon_controller.go +++ b/pkg/controller/daemon/daemon_controller.go @@ -1351,7 +1351,7 @@ func NodeConditionPredicates(nodeInfo *schedulercache.NodeInfo) (bool, []algorit // TODO: There are other node status that the DaemonSet should ideally respect too, // e.g. MemoryPressure, and DiskPressure if c.Type == v1.NodeOutOfDisk && c.Status == v1.ConditionTrue { - reasons = append(reasons, predicates.ErrNodeSelectorNotMatch) + reasons = append(reasons, predicates.ErrNodeOutOfDisk) break } } diff --git a/pkg/controller/daemon/daemon_controller_test.go b/pkg/controller/daemon/daemon_controller_test.go index f8e49d48854ca..097f4cc1a2389 100644 --- a/pkg/controller/daemon/daemon_controller_test.go +++ b/pkg/controller/daemon/daemon_controller_test.go @@ -1394,6 +1394,7 @@ func setDaemonSetCritical(ds *extensions.DaemonSet) { func TestNodeShouldRunDaemonPod(t *testing.T) { cases := []struct { podsOnNode []*v1.Pod + nodeCondition []v1.NodeCondition ds *extensions.DaemonSet wantToRun, shouldSchedule, shouldContinueRunning bool err error @@ -1414,6 +1415,23 @@ func TestNodeShouldRunDaemonPod(t *testing.T) { shouldSchedule: true, shouldContinueRunning: true, }, + { + ds: &extensions.DaemonSet{ + Spec: extensions.DaemonSetSpec{ + Selector: &metav1.LabelSelector{MatchLabels: simpleDaemonSetLabel}, + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: simpleDaemonSetLabel, + }, + Spec: resourcePodSpec("", "50M", "0.5"), + }, + }, + }, + nodeCondition: []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}, + wantToRun: true, + shouldSchedule: false, + shouldContinueRunning: true, + }, { ds: &extensions.DaemonSet{ Spec: extensions.DaemonSetSpec{ @@ -1484,6 +1502,7 @@ func TestNodeShouldRunDaemonPod(t *testing.T) { for i, c := range cases { for _, strategy := range updateStrategies() { node := newNode("test-node", nil) + node.Status.Conditions = append(node.Status.Conditions, c.nodeCondition...) node.Status.Allocatable = allocatableResources("100M", "1") manager, _, _ := newTestController() manager.nodeStore.Add(node) From de3f09780b4abc853b0a114b4e45aa57e52db7a0 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Date: Sun, 30 Jul 2017 23:49:45 -0700 Subject: [PATCH 034/403] simplify disruption controller --- pkg/controller/disruption/disruption.go | 56 ++++++++++--------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/pkg/controller/disruption/disruption.go b/pkg/controller/disruption/disruption.go index 0f27683d98276..a6495728b54da 100644 --- a/pkg/controller/disruption/disruption.go +++ b/pkg/controller/disruption/disruption.go @@ -107,7 +107,7 @@ type controllerAndScale struct { // podControllerFinder is a function type that maps a pod to a list of // controllers and their scale. -type podControllerFinder func(*v1.Pod) ([]controllerAndScale, error) +type podControllerFinder func(*v1.Pod) (*controllerAndScale, error) func NewDisruptionController( podInformer coreinformers.PodInformer, @@ -170,8 +170,8 @@ func NewDisruptionController( // and we may well need further tweaks just to be able to access scale // subresources. func (dc *DisruptionController) finders() []podControllerFinder { - return []podControllerFinder{dc.getPodReplicationControllers, dc.getPodDeployments, dc.getPodReplicaSets, - dc.getPodStatefulSets} + return []podControllerFinder{dc.getPodReplicationController, dc.getPodDeployment, dc.getPodReplicaSet, + dc.getPodStatefulSet} } var ( @@ -181,9 +181,8 @@ var ( controllerKindDep = v1beta1.SchemeGroupVersion.WithKind("Deployment") ) -// getPodReplicaSets finds replicasets which have no matching deployments. -func (dc *DisruptionController) getPodReplicaSets(pod *v1.Pod) ([]controllerAndScale, error) { - var casSlice []controllerAndScale +// getPodReplicaSet finds a replicaset which has no matching deployments. +func (dc *DisruptionController) getPodReplicaSet(pod *v1.Pod) (*controllerAndScale, error) { controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return nil, nil @@ -204,13 +203,11 @@ func (dc *DisruptionController) getPodReplicaSets(pod *v1.Pod) ([]controllerAndS // Skip RS if it's controlled by a Deployment. return nil, nil } - casSlice = append(casSlice, controllerAndScale{rs.UID, *(rs.Spec.Replicas)}) - return casSlice, nil + return &controllerAndScale{rs.UID, *(rs.Spec.Replicas)}, nil } // getPodStatefulSet returns the statefulset managing the given pod. -func (dc *DisruptionController) getPodStatefulSets(pod *v1.Pod) ([]controllerAndScale, error) { - var casSlice []controllerAndScale +func (dc *DisruptionController) getPodStatefulSet(pod *v1.Pod) (*controllerAndScale, error) { controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return nil, nil @@ -227,13 +224,11 @@ func (dc *DisruptionController) getPodStatefulSets(pod *v1.Pod) ([]controllerAnd return nil, nil } - casSlice = append(casSlice, controllerAndScale{ss.UID, *(ss.Spec.Replicas)}) - return casSlice, nil + return &controllerAndScale{ss.UID, *(ss.Spec.Replicas)}, nil } // getPodDeployments finds deployments for any replicasets which are being managed by deployments. -func (dc *DisruptionController) getPodDeployments(pod *v1.Pod) ([]controllerAndScale, error) { - var casSlice []controllerAndScale +func (dc *DisruptionController) getPodDeployment(pod *v1.Pod) (*controllerAndScale, error) { controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return nil, nil @@ -264,12 +259,10 @@ func (dc *DisruptionController) getPodDeployments(pod *v1.Pod) ([]controllerAndS if deployment.UID != controllerRef.UID { return nil, nil } - casSlice = append(casSlice, controllerAndScale{deployment.UID, *(deployment.Spec.Replicas)}) - return casSlice, nil + return &controllerAndScale{deployment.UID, *(deployment.Spec.Replicas)}, nil } -func (dc *DisruptionController) getPodReplicationControllers(pod *v1.Pod) ([]controllerAndScale, error) { - var casSlice []controllerAndScale +func (dc *DisruptionController) getPodReplicationController(pod *v1.Pod) (*controllerAndScale, error) { controllerRef := metav1.GetControllerOf(pod) if controllerRef == nil { return nil, nil @@ -285,8 +278,7 @@ func (dc *DisruptionController) getPodReplicationControllers(pod *v1.Pod) ([]con if rc.UID != controllerRef.UID { return nil, nil } - casSlice = append(casSlice, controllerAndScale{rc.UID, *(rc.Spec.Replicas)}) - return casSlice, nil + return &controllerAndScale{rc.UID, *(rc.Spec.Replicas)}, nil } func (dc *DisruptionController) Run(stopCh <-chan struct{}) { @@ -590,30 +582,26 @@ func (dc *DisruptionController) getExpectedScale(pdb *policy.PodDisruptionBudget // A mapping from controllers to their scale. controllerScale := map[types.UID]int32{} - // 1. Find the controller(s) for each pod. If any pod has 0 controllers, - // that's an error. If any pod has more than 1 controller, that's also an - // error. + // 1. Find the controller for each pod. If any pod has 0 controllers, + // that's an error. With ControllerRef, a pod can only have 1 controller. for _, pod := range pods { - controllerCount := 0 + foundController := false for _, finder := range dc.finders() { - var controllers []controllerAndScale - controllers, err = finder(pod) + var controllerNScale *controllerAndScale + controllerNScale, err = finder(pod) if err != nil { return } - for _, controller := range controllers { - controllerScale[controller.UID] = controller.scale - controllerCount++ + if controllerNScale != nil { + controllerScale[controllerNScale.UID] = controllerNScale.scale + foundController = true + break } } - if controllerCount == 0 { + if !foundController { err = fmt.Errorf("found no controllers for pod %q", pod.Name) dc.recorder.Event(pdb, v1.EventTypeWarning, "NoControllers", err.Error()) return - } else if controllerCount > 1 { - err = fmt.Errorf("pod %q has %v>1 controllers", pod.Name, controllerCount) - dc.recorder.Event(pdb, v1.EventTypeWarning, "TooManyControllers", err.Error()) - return } } From 3ebb1400958bb6a675682cc21181ca3e2b519175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Ole=C5=9B?= Date: Mon, 14 Aug 2017 12:04:21 +0200 Subject: [PATCH 035/403] Log error from ensureDNSRecords --- federation/pkg/federation-controller/service/dns/dns.go | 1 + 1 file changed, 1 insertion(+) diff --git a/federation/pkg/federation-controller/service/dns/dns.go b/federation/pkg/federation-controller/service/dns/dns.go index 73167f85268f7..e478d76e6bfa8 100644 --- a/federation/pkg/federation-controller/service/dns/dns.go +++ b/federation/pkg/federation-controller/service/dns/dns.go @@ -182,6 +182,7 @@ func (s *ServiceDNSController) workerFunction() bool { for _, clusterIngress := range ingress.Items { err = s.ensureDNSRecords(clusterIngress.Cluster, service) if err != nil { + runtime.HandleError(fmt.Errorf("Error when ensuring DNS records for service %s/%s: %v", service.Namespace, service.Name, err)) s.deliverService(service, 0, true) } } From 282404cbc94af7c24ca54b023c6fbc61f8302a6c Mon Sep 17 00:00:00 2001 From: Jan Safranek Date: Mon, 14 Aug 2017 12:16:25 +0200 Subject: [PATCH 036/403] Add Exec interface to VolumeHost This exec should be used by volume plugins to execute mount utilities. It will eventually execute things in mount containers. --- .../attachdetach/attach_detach_controller.go | 4 ++ .../volume/persistentvolume/volume_host.go | 4 ++ pkg/kubelet/volume_host.go | 4 ++ pkg/util/mount/BUILD | 1 + pkg/util/mount/exec.go | 50 +++++++++++++++++++ pkg/util/mount/mount.go | 10 ++++ pkg/volume/plugins.go | 3 ++ pkg/volume/testing/testing.go | 6 +++ 8 files changed, 82 insertions(+) create mode 100644 pkg/util/mount/exec.go diff --git a/pkg/controller/volume/attachdetach/attach_detach_controller.go b/pkg/controller/volume/attachdetach/attach_detach_controller.go index 6c206e504e414..29231260c639f 100644 --- a/pkg/controller/volume/attachdetach/attach_detach_controller.go +++ b/pkg/controller/volume/attachdetach/attach_detach_controller.go @@ -571,6 +571,10 @@ func (adc *attachDetachController) GetConfigMapFunc() func(namespace, name strin } } +func (adc *attachDetachController) GetExec(pluginName string) mount.Exec { + return mount.NewOsExec() +} + func (adc *attachDetachController) addNodeToDswp(node *v1.Node, nodeName types.NodeName) { if _, exists := node.Annotations[volumehelper.ControllerManagedAttachAnnotation]; exists { keepTerminatedPodVolumes := false diff --git a/pkg/controller/volume/persistentvolume/volume_host.go b/pkg/controller/volume/persistentvolume/volume_host.go index e4c402f006853..6c91a8817dd50 100644 --- a/pkg/controller/volume/persistentvolume/volume_host.go +++ b/pkg/controller/volume/persistentvolume/volume_host.go @@ -93,6 +93,10 @@ func (adc *PersistentVolumeController) GetConfigMapFunc() func(namespace, name s } } +func (adc *PersistentVolumeController) GetExec(pluginName string) mount.Exec { + return mount.NewOsExec() +} + func (ctrl *PersistentVolumeController) GetNodeLabels() (map[string]string, error) { return nil, fmt.Errorf("GetNodeLabels() unsupported in PersistentVolumeController") } diff --git a/pkg/kubelet/volume_host.go b/pkg/kubelet/volume_host.go index 51dd94f023f18..2ab22d5773155 100644 --- a/pkg/kubelet/volume_host.go +++ b/pkg/kubelet/volume_host.go @@ -156,3 +156,7 @@ func (kvh *kubeletVolumeHost) GetNodeLabels() (map[string]string, error) { } return node.Labels, nil } + +func (kvh *kubeletVolumeHost) GetExec(pluginName string) mount.Exec { + return mount.NewOsExec() +} diff --git a/pkg/util/mount/BUILD b/pkg/util/mount/BUILD index 66aa2cbb6d071..6087221857d89 100644 --- a/pkg/util/mount/BUILD +++ b/pkg/util/mount/BUILD @@ -10,6 +10,7 @@ go_library( name = "go_default_library", srcs = [ "doc.go", + "exec.go", "fake.go", "mount.go", "mount_unsupported.go", diff --git a/pkg/util/mount/exec.go b/pkg/util/mount/exec.go new file mode 100644 index 0000000000000..716cda0a0c381 --- /dev/null +++ b/pkg/util/mount/exec.go @@ -0,0 +1,50 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package mount + +import "k8s.io/utils/exec" + +func NewOsExec() Exec { + return &osExec{} +} + +// Real implementation of Exec interface that uses simple util.Exec +type osExec struct{} + +var _ Exec = &osExec{} + +func (e *osExec) Run(cmd string, args ...string) ([]byte, error) { + exe := exec.New() + return exe.Command(cmd, args...).CombinedOutput() +} + +func NewFakeExec(run runHook) *FakeExec { + return &FakeExec{runHook: run} +} + +// Fake for testing. +type FakeExec struct { + runHook runHook +} +type runHook func(cmd string, args ...string) ([]byte, error) + +func (f *FakeExec) Run(cmd string, args ...string) ([]byte, error) { + if f.runHook != nil { + return f.runHook(cmd, args...) + } + return nil, nil +} diff --git a/pkg/util/mount/mount.go b/pkg/util/mount/mount.go index eab2889951d78..7552bbb0949a1 100644 --- a/pkg/util/mount/mount.go +++ b/pkg/util/mount/mount.go @@ -70,6 +70,16 @@ type Interface interface { GetDeviceNameFromMount(mountPath, pluginDir string) (string, error) } +// Exec executes command where mount utilities are. This can be either the host, +// container where kubelet runs or even a remote pod with mount utilities. +// Usual pkg/util/exec interface is not used because kubelet.RunInContainer does +// not provide stdin/stdout/stderr streams. +type Exec interface { + // Run executes a command and returns its stdout + stderr combined in one + // stream. + Run(cmd string, args ...string) ([]byte, error) +} + // Compile-time check to ensure all Mounter implementations satisfy // the mount interface var _ Interface = &Mounter{} diff --git a/pkg/volume/plugins.go b/pkg/volume/plugins.go index 39c67366ffc60..1521a0afc7378 100644 --- a/pkg/volume/plugins.go +++ b/pkg/volume/plugins.go @@ -244,6 +244,9 @@ type VolumeHost interface { // Returns a function that returns a configmap. GetConfigMapFunc() func(namespace, name string) (*v1.ConfigMap, error) + // Returns an interface that should be used to execute any utilities in volume plugins + GetExec(pluginName string) mount.Exec + // Returns the labels on the node GetNodeLabels() (map[string]string, error) } diff --git a/pkg/volume/testing/testing.go b/pkg/volume/testing/testing.go index 9ccd840c893df..bc96bd6ecd4a9 100644 --- a/pkg/volume/testing/testing.go +++ b/pkg/volume/testing/testing.go @@ -49,6 +49,7 @@ type fakeVolumeHost struct { pluginMgr VolumePluginMgr cloud cloudprovider.Interface mounter mount.Interface + exec mount.Exec writer io.Writer } @@ -64,6 +65,7 @@ func newFakeVolumeHost(rootDir string, kubeClient clientset.Interface, plugins [ host := &fakeVolumeHost{rootDir: rootDir, kubeClient: kubeClient, cloud: cloud} host.mounter = &mount.FakeMounter{} host.writer = &io.StdWriter{} + host.exec = mount.NewFakeExec(nil) host.pluginMgr.InitPlugins(plugins, host) return host } @@ -142,6 +144,10 @@ func (f *fakeVolumeHost) GetSecretFunc() func(namespace, name string) (*v1.Secre } } +func (f *fakeVolumeHost) GetExec(pluginName string) mount.Exec { + return f.exec +} + func (f *fakeVolumeHost) GetConfigMapFunc() func(namespace, name string) (*v1.ConfigMap, error) { return func(namespace, name string) (*v1.ConfigMap, error) { return f.kubeClient.Core().ConfigMaps(namespace).Get(name, metav1.GetOptions{}) From bc0e170d9c8c7b6209db6af4905214c3b2c4f060 Mon Sep 17 00:00:00 2001 From: Jan Safranek Date: Mon, 14 Aug 2017 12:16:26 +0200 Subject: [PATCH 037/403] Add pluginName to VolumeHost.GetMouter Different plugins can get different mounter, depending where the mount utilities are. --- .../volume/attachdetach/attach_detach_controller.go | 2 +- pkg/controller/volume/persistentvolume/volume_host.go | 2 +- pkg/kubelet/volume_host.go | 2 +- pkg/volume/aws_ebs/attacher.go | 6 +++--- pkg/volume/aws_ebs/aws_ebs.go | 8 ++++---- pkg/volume/azure_dd/attacher.go | 4 ++-- pkg/volume/azure_dd/azure_dd.go | 4 ++-- pkg/volume/azure_dd/azure_mounter.go | 4 ++-- pkg/volume/azure_file/azure_file.go | 4 ++-- pkg/volume/cephfs/cephfs.go | 4 ++-- pkg/volume/cinder/attacher.go | 6 +++--- pkg/volume/cinder/cinder.go | 6 +++--- pkg/volume/configmap/configmap.go | 4 ++-- pkg/volume/empty_dir/empty_dir.go | 4 ++-- pkg/volume/fc/attacher.go | 8 ++++---- pkg/volume/fc/fc.go | 4 ++-- pkg/volume/flexvolume/attacher.go | 4 ++-- pkg/volume/flexvolume/detacher-defaults.go | 2 +- pkg/volume/flexvolume/detacher.go | 2 +- pkg/volume/flexvolume/plugin.go | 6 +++--- pkg/volume/flocker/flocker.go | 4 ++-- pkg/volume/gce_pd/attacher.go | 6 +++--- pkg/volume/gce_pd/gce_pd.go | 6 +++--- pkg/volume/glusterfs/glusterfs.go | 4 ++-- pkg/volume/iscsi/iscsi.go | 4 ++-- pkg/volume/local/local.go | 4 ++-- pkg/volume/nfs/nfs.go | 4 ++-- pkg/volume/photon_pd/attacher.go | 6 +++--- pkg/volume/photon_pd/photon_pd.go | 6 +++--- pkg/volume/plugins.go | 2 +- pkg/volume/portworx/portworx.go | 6 +++--- pkg/volume/quobyte/quobyte.go | 6 +++--- pkg/volume/rbd/rbd.go | 4 ++-- pkg/volume/scaleio/sio_plugin.go | 2 +- pkg/volume/secret/secret.go | 4 ++-- pkg/volume/storageos/storageos.go | 4 ++-- pkg/volume/testing/testing.go | 2 +- pkg/volume/vsphere_volume/attacher.go | 6 +++--- pkg/volume/vsphere_volume/vsphere_volume.go | 6 +++--- 39 files changed, 86 insertions(+), 86 deletions(-) diff --git a/pkg/controller/volume/attachdetach/attach_detach_controller.go b/pkg/controller/volume/attachdetach/attach_detach_controller.go index 29231260c639f..151c900fd6c0f 100644 --- a/pkg/controller/volume/attachdetach/attach_detach_controller.go +++ b/pkg/controller/volume/attachdetach/attach_detach_controller.go @@ -539,7 +539,7 @@ func (adc *attachDetachController) GetCloudProvider() cloudprovider.Interface { return adc.cloud } -func (adc *attachDetachController) GetMounter() mount.Interface { +func (adc *attachDetachController) GetMounter(pluginName string) mount.Interface { return nil } diff --git a/pkg/controller/volume/persistentvolume/volume_host.go b/pkg/controller/volume/persistentvolume/volume_host.go index 6c91a8817dd50..8f182edc6b981 100644 --- a/pkg/controller/volume/persistentvolume/volume_host.go +++ b/pkg/controller/volume/persistentvolume/volume_host.go @@ -61,7 +61,7 @@ func (ctrl *PersistentVolumeController) GetCloudProvider() cloudprovider.Interfa return ctrl.cloud } -func (ctrl *PersistentVolumeController) GetMounter() mount.Interface { +func (ctrl *PersistentVolumeController) GetMounter(pluginName string) mount.Interface { return nil } diff --git a/pkg/kubelet/volume_host.go b/pkg/kubelet/volume_host.go index 2ab22d5773155..3cedc81da8fec 100644 --- a/pkg/kubelet/volume_host.go +++ b/pkg/kubelet/volume_host.go @@ -117,7 +117,7 @@ func (kvh *kubeletVolumeHost) GetCloudProvider() cloudprovider.Interface { return kvh.kubelet.cloud } -func (kvh *kubeletVolumeHost) GetMounter() mount.Interface { +func (kvh *kubeletVolumeHost) GetMounter(pluginName string) mount.Interface { return kvh.kubelet.mounter } diff --git a/pkg/volume/aws_ebs/attacher.go b/pkg/volume/aws_ebs/attacher.go index 2ccf0aa885f2e..1419864127fa3 100644 --- a/pkg/volume/aws_ebs/attacher.go +++ b/pkg/volume/aws_ebs/attacher.go @@ -54,7 +54,7 @@ func (plugin *awsElasticBlockStorePlugin) NewAttacher() (volume.Attacher, error) } func (plugin *awsElasticBlockStorePlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) return mount.GetMountRefs(mounter, deviceMountPath) } @@ -199,7 +199,7 @@ func (attacher *awsElasticBlockStoreAttacher) GetDeviceMountPath( // FIXME: this method can be further pruned. func (attacher *awsElasticBlockStoreAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { - mounter := attacher.host.GetMounter() + mounter := attacher.host.GetMounter(awsElasticBlockStorePluginName) notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath) if err != nil { if os.IsNotExist(err) { @@ -247,7 +247,7 @@ func (plugin *awsElasticBlockStorePlugin) NewDetacher() (volume.Detacher, error) } return &awsElasticBlockStoreDetacher{ - mounter: plugin.host.GetMounter(), + mounter: plugin.host.GetMounter(plugin.GetPluginName()), awsVolumes: awsCloud, }, nil } diff --git a/pkg/volume/aws_ebs/aws_ebs.go b/pkg/volume/aws_ebs/aws_ebs.go index 84498e4b9b997..433d9325be84b 100644 --- a/pkg/volume/aws_ebs/aws_ebs.go +++ b/pkg/volume/aws_ebs/aws_ebs.go @@ -104,7 +104,7 @@ func (plugin *awsElasticBlockStorePlugin) GetAccessModes() []v1.PersistentVolume func (plugin *awsElasticBlockStorePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newMounterInternal(spec, pod.UID, &AWSDiskUtil{}, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod.UID, &AWSDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *awsElasticBlockStorePlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager ebsManager, mounter mount.Interface) (volume.Mounter, error) { @@ -135,12 +135,12 @@ func (plugin *awsElasticBlockStorePlugin) newMounterInternal(spec *volume.Spec, }, fsType: fsType, readOnly: readOnly, - diskMounter: &mount.SafeFormatAndMount{Interface: plugin.host.GetMounter(), Runner: exec.New()}}, nil + diskMounter: &mount.SafeFormatAndMount{Interface: plugin.host.GetMounter(plugin.GetPluginName()), Runner: exec.New()}}, nil } func (plugin *awsElasticBlockStorePlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newUnmounterInternal(volName, podUID, &AWSDiskUtil{}, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, &AWSDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *awsElasticBlockStorePlugin) newUnmounterInternal(volName string, podUID types.UID, manager ebsManager, mounter mount.Interface) (volume.Unmounter, error) { @@ -199,7 +199,7 @@ func getVolumeSource( } func (plugin *awsElasticBlockStorePlugin) ConstructVolumeSpec(volName, mountPath string) (*volume.Spec, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName()) volumeID, err := mounter.GetDeviceNameFromMount(mountPath, pluginDir) if err != nil { diff --git a/pkg/volume/azure_dd/attacher.go b/pkg/volume/azure_dd/attacher.go index cf71f65b1a2c8..43e300fd16cab 100644 --- a/pkg/volume/azure_dd/attacher.go +++ b/pkg/volume/azure_dd/attacher.go @@ -211,7 +211,7 @@ func (a *azureDiskAttacher) GetDeviceMountPath(spec *volume.Spec) (string, error } func (attacher *azureDiskAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { - mounter := attacher.plugin.host.GetMounter() + mounter := attacher.plugin.host.GetMounter(azureDataDiskPluginName) notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath) if err != nil { @@ -277,7 +277,7 @@ func (d *azureDiskDetacher) Detach(diskURI string, nodeName types.NodeName) erro // UnmountDevice unmounts the volume on the node func (detacher *azureDiskDetacher) UnmountDevice(deviceMountPath string) error { - err := volumeutil.UnmountPath(deviceMountPath, detacher.plugin.host.GetMounter()) + err := volumeutil.UnmountPath(deviceMountPath, detacher.plugin.host.GetMounter(detacher.plugin.GetPluginName())) if err == nil { glog.V(4).Infof("azureDisk - Device %s was unmounted", deviceMountPath) } else { diff --git a/pkg/volume/azure_dd/azure_dd.go b/pkg/volume/azure_dd/azure_dd.go index 49b68cdd43a71..80d9b98b17cea 100644 --- a/pkg/volume/azure_dd/azure_dd.go +++ b/pkg/volume/azure_dd/azure_dd.go @@ -190,7 +190,7 @@ func (plugin *azureDataDiskPlugin) NewUnmounter(volName string, podUID types.UID } func (plugin *azureDataDiskPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName()) sourceName, err := mounter.GetDeviceNameFromMount(mountPath, pluginDir) @@ -210,6 +210,6 @@ func (plugin *azureDataDiskPlugin) ConstructVolumeSpec(volumeName, mountPath str } func (plugin *azureDataDiskPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { - m := plugin.host.GetMounter() + m := plugin.host.GetMounter(plugin.GetPluginName()) return mount.GetMountRefs(m, deviceMountPath) } diff --git a/pkg/volume/azure_dd/azure_mounter.go b/pkg/volume/azure_dd/azure_mounter.go index eedb5535f7529..2af044c369409 100644 --- a/pkg/volume/azure_dd/azure_mounter.go +++ b/pkg/volume/azure_dd/azure_mounter.go @@ -63,7 +63,7 @@ func (m *azureDiskMounter) GetPath() string { } func (m *azureDiskMounter) SetUpAt(dir string, fsGroup *int64) error { - mounter := m.plugin.host.GetMounter() + mounter := m.plugin.host.GetMounter(m.plugin.GetPluginName()) volumeSource, err := getVolumeSource(m.spec) if err != nil { @@ -154,7 +154,7 @@ func (u *azureDiskUnmounter) TearDownAt(dir string) error { } glog.V(4).Infof("azureDisk - TearDownAt: %s", dir) - mounter := u.plugin.host.GetMounter() + mounter := u.plugin.host.GetMounter(u.plugin.GetPluginName()) mountPoint, err := mounter.IsLikelyNotMountPoint(dir) if err != nil { return fmt.Errorf("azureDisk - TearDownAt: %s failed to do IsLikelyNotMountPoint %s", dir, err) diff --git a/pkg/volume/azure_file/azure_file.go b/pkg/volume/azure_file/azure_file.go index 426900a1f289b..26077162382b5 100644 --- a/pkg/volume/azure_file/azure_file.go +++ b/pkg/volume/azure_file/azure_file.go @@ -98,7 +98,7 @@ func (plugin *azureFilePlugin) GetAccessModes() []v1.PersistentVolumeAccessMode } func (plugin *azureFilePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { - return plugin.newMounterInternal(spec, pod, &azureSvc{}, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod, &azureSvc{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *azureFilePlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, util azureUtil, mounter mount.Interface) (volume.Mounter, error) { @@ -124,7 +124,7 @@ func (plugin *azureFilePlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod } func (plugin *azureFilePlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *azureFilePlugin) newUnmounterInternal(volName string, podUID types.UID, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/cephfs/cephfs.go b/pkg/volume/cephfs/cephfs.go index 5ea4e6137e7d7..450c5501bbd64 100644 --- a/pkg/volume/cephfs/cephfs.go +++ b/pkg/volume/cephfs/cephfs.go @@ -110,7 +110,7 @@ func (plugin *cephfsPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume. glog.V(4).Infof("found ceph secret info: %s", name) } } - return plugin.newMounterInternal(spec, pod.UID, plugin.host.GetMounter(), secret) + return plugin.newMounterInternal(spec, pod.UID, plugin.host.GetMounter(plugin.GetPluginName()), secret) } func (plugin *cephfsPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, mounter mount.Interface, secret string) (volume.Mounter, error) { @@ -153,7 +153,7 @@ func (plugin *cephfsPlugin) newMounterInternal(spec *volume.Spec, podUID types.U } func (plugin *cephfsPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *cephfsPlugin) newUnmounterInternal(volName string, podUID types.UID, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/cinder/attacher.go b/pkg/volume/cinder/attacher.go index 901876d16b885..024af41c73c8d 100644 --- a/pkg/volume/cinder/attacher.go +++ b/pkg/volume/cinder/attacher.go @@ -66,7 +66,7 @@ func (plugin *cinderPlugin) NewAttacher() (volume.Attacher, error) { } func (plugin *cinderPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) return mount.GetMountRefs(mounter, deviceMountPath) } @@ -262,7 +262,7 @@ func (attacher *cinderDiskAttacher) GetDeviceMountPath( // FIXME: this method can be further pruned. func (attacher *cinderDiskAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { - mounter := attacher.host.GetMounter() + mounter := attacher.host.GetMounter(cinderVolumePluginName) notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath) if err != nil { if os.IsNotExist(err) { @@ -309,7 +309,7 @@ func (plugin *cinderPlugin) NewDetacher() (volume.Detacher, error) { return nil, err } return &cinderDiskDetacher{ - mounter: plugin.host.GetMounter(), + mounter: plugin.host.GetMounter(plugin.GetPluginName()), cinderProvider: cinder, }, nil } diff --git a/pkg/volume/cinder/cinder.go b/pkg/volume/cinder/cinder.go index 034a5f8e8cdde..d045a7128b964 100644 --- a/pkg/volume/cinder/cinder.go +++ b/pkg/volume/cinder/cinder.go @@ -116,7 +116,7 @@ func (plugin *cinderPlugin) GetAccessModes() []v1.PersistentVolumeAccessMode { } func (plugin *cinderPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { - return plugin.newMounterInternal(spec, pod.UID, &CinderDiskUtil{}, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod.UID, &CinderDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *cinderPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager cdManager, mounter mount.Interface) (volume.Mounter, error) { @@ -143,7 +143,7 @@ func (plugin *cinderPlugin) newMounterInternal(spec *volume.Spec, podUID types.U } func (plugin *cinderPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, &CinderDiskUtil{}, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, &CinderDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *cinderPlugin) newUnmounterInternal(volName string, podUID types.UID, manager cdManager, mounter mount.Interface) (volume.Unmounter, error) { @@ -216,7 +216,7 @@ func (plugin *cinderPlugin) getCloudProvider() (CinderProvider, error) { } func (plugin *cinderPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName()) sourceName, err := mounter.GetDeviceNameFromMount(mountPath, pluginDir) if err != nil { diff --git a/pkg/volume/configmap/configmap.go b/pkg/volume/configmap/configmap.go index af05aef114529..94b83b7ed7f32 100644 --- a/pkg/volume/configmap/configmap.go +++ b/pkg/volume/configmap/configmap.go @@ -92,7 +92,7 @@ func (plugin *configMapPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, opts v spec.Name(), pod.UID, plugin, - plugin.host.GetMounter(), + plugin.host.GetMounter(plugin.GetPluginName()), plugin.host.GetWriter(), volume.MetricsNil{}, }, @@ -109,7 +109,7 @@ func (plugin *configMapPlugin) NewUnmounter(volName string, podUID types.UID) (v volName, podUID, plugin, - plugin.host.GetMounter(), + plugin.host.GetMounter(plugin.GetPluginName()), plugin.host.GetWriter(), volume.MetricsNil{}, }, diff --git a/pkg/volume/empty_dir/empty_dir.go b/pkg/volume/empty_dir/empty_dir.go index 2cb1aba212f55..76da7c3cffe8b 100644 --- a/pkg/volume/empty_dir/empty_dir.go +++ b/pkg/volume/empty_dir/empty_dir.go @@ -99,7 +99,7 @@ func (plugin *emptyDirPlugin) SupportsBulkVolumeVerification() bool { } func (plugin *emptyDirPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, opts volume.VolumeOptions) (volume.Mounter, error) { - return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter(), &realMountDetector{plugin.host.GetMounter()}, opts) + return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter(plugin.GetPluginName()), &realMountDetector{plugin.host.GetMounter(plugin.GetPluginName())}, opts) } func (plugin *emptyDirPlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, mounter mount.Interface, mountDetector mountDetector, opts volume.VolumeOptions) (volume.Mounter, error) { @@ -120,7 +120,7 @@ func (plugin *emptyDirPlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, func (plugin *emptyDirPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter(), &realMountDetector{plugin.host.GetMounter()}) + return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter(plugin.GetPluginName()), &realMountDetector{plugin.host.GetMounter(plugin.GetPluginName())}) } func (plugin *emptyDirPlugin) newUnmounterInternal(volName string, podUID types.UID, mounter mount.Interface, mountDetector mountDetector) (volume.Unmounter, error) { diff --git a/pkg/volume/fc/attacher.go b/pkg/volume/fc/attacher.go index c0e469c35bfcd..52f4a26d287f5 100644 --- a/pkg/volume/fc/attacher.go +++ b/pkg/volume/fc/attacher.go @@ -50,7 +50,7 @@ func (plugin *fcPlugin) NewAttacher() (volume.Attacher, error) { } func (plugin *fcPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) return mount.GetMountRefs(mounter, deviceMountPath) } @@ -88,7 +88,7 @@ func (attacher *fcAttacher) GetDeviceMountPath( } func (attacher *fcAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { - mounter := attacher.host.GetMounter() + mounter := attacher.host.GetMounter(fcPluginName) notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath) if err != nil { if os.IsNotExist(err) { @@ -132,7 +132,7 @@ var _ volume.Detacher = &fcDetacher{} func (plugin *fcPlugin) NewDetacher() (volume.Detacher, error) { return &fcDetacher{ - mounter: plugin.host.GetMounter(), + mounter: plugin.host.GetMounter(plugin.GetPluginName()), manager: &FCUtil{}, exe: exec.New(), }, nil @@ -192,7 +192,7 @@ func volumeSpecToMounter(spec *volume.Spec, host volume.VolumeHost) (*fcDiskMoun }, fsType: fc.FSType, readOnly: readOnly, - mounter: &mount.SafeFormatAndMount{Interface: host.GetMounter(), Runner: exec.New()}, + mounter: &mount.SafeFormatAndMount{Interface: host.GetMounter(fcPluginName), Runner: exec.New()}, }, nil } diff --git a/pkg/volume/fc/fc.go b/pkg/volume/fc/fc.go index 26e69bd709f32..079187320ebf7 100644 --- a/pkg/volume/fc/fc.go +++ b/pkg/volume/fc/fc.go @@ -103,7 +103,7 @@ func (plugin *fcPlugin) GetAccessModes() []v1.PersistentVolumeAccessMode { func (plugin *fcPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newMounterInternal(spec, pod.UID, &FCUtil{}, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod.UID, &FCUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *fcPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager diskManager, mounter mount.Interface) (volume.Mounter, error) { @@ -144,7 +144,7 @@ func (plugin *fcPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, func (plugin *fcPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newUnmounterInternal(volName, podUID, &FCUtil{}, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, &FCUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *fcPlugin) newUnmounterInternal(volName string, podUID types.UID, manager diskManager, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/flexvolume/attacher.go b/pkg/volume/flexvolume/attacher.go index 73575be4c4e96..00f1d5d487dcf 100644 --- a/pkg/volume/flexvolume/attacher.go +++ b/pkg/volume/flexvolume/attacher.go @@ -69,7 +69,7 @@ func (a *flexVolumeAttacher) GetDeviceMountPath(spec *volume.Spec) (string, erro // MountDevice is part of the volume.Attacher interface func (a *flexVolumeAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { // Mount only once. - alreadyMounted, err := prepareForMount(a.plugin.host.GetMounter(), deviceMountPath) + alreadyMounted, err := prepareForMount(a.plugin.host.GetMounter(a.plugin.GetPluginName()), deviceMountPath) if err != nil { return err } @@ -87,7 +87,7 @@ func (a *flexVolumeAttacher) MountDevice(spec *volume.Spec, devicePath string, d // Devicepath is empty if the plugin does not support attach calls. Ignore mountDevice calls if the // plugin does not implement attach interface. if devicePath != "" { - return (*attacherDefaults)(a).MountDevice(spec, devicePath, deviceMountPath, a.plugin.host.GetMounter()) + return (*attacherDefaults)(a).MountDevice(spec, devicePath, deviceMountPath, a.plugin.host.GetMounter(a.plugin.GetPluginName())) } else { return nil } diff --git a/pkg/volume/flexvolume/detacher-defaults.go b/pkg/volume/flexvolume/detacher-defaults.go index 3226836f90e15..17c85a3653203 100644 --- a/pkg/volume/flexvolume/detacher-defaults.go +++ b/pkg/volume/flexvolume/detacher-defaults.go @@ -41,5 +41,5 @@ func (d *detacherDefaults) WaitForDetach(devicePath string, timeout time.Duratio // UnmountDevice is part of the volume.Detacher interface. func (d *detacherDefaults) UnmountDevice(deviceMountPath string) error { glog.Warning(logPrefix(d.plugin.flexVolumePlugin), "using default UnmountDevice for device mount path ", deviceMountPath) - return util.UnmountPath(deviceMountPath, d.plugin.host.GetMounter()) + return util.UnmountPath(deviceMountPath, d.plugin.host.GetMounter(d.plugin.GetPluginName())) } diff --git a/pkg/volume/flexvolume/detacher.go b/pkg/volume/flexvolume/detacher.go index dcca403619e33..4acbd03eaef80 100644 --- a/pkg/volume/flexvolume/detacher.go +++ b/pkg/volume/flexvolume/detacher.go @@ -69,7 +69,7 @@ func (d *flexVolumeDetacher) UnmountDevice(deviceMountPath string) error { return nil } - notmnt, err := isNotMounted(d.plugin.host.GetMounter(), deviceMountPath) + notmnt, err := isNotMounted(d.plugin.host.GetMounter(d.plugin.GetPluginName()), deviceMountPath) if err != nil { return err } diff --git a/pkg/volume/flexvolume/plugin.go b/pkg/volume/flexvolume/plugin.go index 7b37514009404..cd1de0a6be475 100644 --- a/pkg/volume/flexvolume/plugin.go +++ b/pkg/volume/flexvolume/plugin.go @@ -158,7 +158,7 @@ func (plugin *flexVolumePlugin) GetAccessModes() []api.PersistentVolumeAccessMod // NewMounter is part of the volume.VolumePlugin interface. func (plugin *flexVolumePlugin) NewMounter(spec *volume.Spec, pod *api.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { - return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter(), plugin.runner) + return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter(plugin.GetPluginName()), plugin.runner) } // newMounterInternal is the internal mounter routine to build the volume. @@ -185,7 +185,7 @@ func (plugin *flexVolumePlugin) newMounterInternal(spec *volume.Spec, pod *api.P // NewUnmounter is part of the volume.VolumePlugin interface. func (plugin *flexVolumePlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter(), plugin.runner) + return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter(plugin.GetPluginName()), plugin.runner) } // newUnmounterInternal is the internal unmounter routine to clean the volume. @@ -254,7 +254,7 @@ func (plugin *flexVolumePlugin) isUnsupported(command string) bool { } func (plugin *flexVolumePlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) return mount.GetMountRefs(mounter, deviceMountPath) } diff --git a/pkg/volume/flocker/flocker.go b/pkg/volume/flocker/flocker.go index 33acb0a81fc83..18a59b7422827 100644 --- a/pkg/volume/flocker/flocker.go +++ b/pkg/volume/flocker/flocker.go @@ -138,7 +138,7 @@ func (p *flockerPlugin) getFlockerVolumeSource(spec *volume.Spec) (*v1.FlockerVo func (plugin *flockerPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newMounterInternal(spec, pod.UID, &FlockerUtil{}, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod.UID, &FlockerUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *flockerPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager volumeManager, mounter mount.Interface) (volume.Mounter, error) { @@ -166,7 +166,7 @@ func (plugin *flockerPlugin) newMounterInternal(spec *volume.Spec, podUID types. func (p *flockerPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { // Inject real implementations here, test through the internal function. - return p.newUnmounterInternal(volName, podUID, &FlockerUtil{}, p.host.GetMounter()) + return p.newUnmounterInternal(volName, podUID, &FlockerUtil{}, p.host.GetMounter(p.GetPluginName())) } func (p *flockerPlugin) newUnmounterInternal(volName string, podUID types.UID, manager volumeManager, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/gce_pd/attacher.go b/pkg/volume/gce_pd/attacher.go index 0cf8b3d6727d8..4801b80101c71 100644 --- a/pkg/volume/gce_pd/attacher.go +++ b/pkg/volume/gce_pd/attacher.go @@ -56,7 +56,7 @@ func (plugin *gcePersistentDiskPlugin) NewAttacher() (volume.Attacher, error) { } func (plugin *gcePersistentDiskPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) return mount.GetMountRefs(mounter, deviceMountPath) } @@ -185,7 +185,7 @@ func (attacher *gcePersistentDiskAttacher) GetDeviceMountPath( func (attacher *gcePersistentDiskAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { // Only mount the PD globally once. - mounter := attacher.host.GetMounter() + mounter := attacher.host.GetMounter(gcePersistentDiskPluginName) notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath) if err != nil { if os.IsNotExist(err) { @@ -272,5 +272,5 @@ func (detacher *gcePersistentDiskDetacher) Detach(deviceMountPath string, nodeNa } func (detacher *gcePersistentDiskDetacher) UnmountDevice(deviceMountPath string) error { - return volumeutil.UnmountPath(deviceMountPath, detacher.host.GetMounter()) + return volumeutil.UnmountPath(deviceMountPath, detacher.host.GetMounter(gcePersistentDiskPluginName)) } diff --git a/pkg/volume/gce_pd/gce_pd.go b/pkg/volume/gce_pd/gce_pd.go index b59835b387729..25f7127fe8419 100644 --- a/pkg/volume/gce_pd/gce_pd.go +++ b/pkg/volume/gce_pd/gce_pd.go @@ -100,7 +100,7 @@ func (plugin *gcePersistentDiskPlugin) GetAccessModes() []v1.PersistentVolumeAcc func (plugin *gcePersistentDiskPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newMounterInternal(spec, pod.UID, &GCEDiskUtil{}, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod.UID, &GCEDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func getVolumeSource( @@ -145,7 +145,7 @@ func (plugin *gcePersistentDiskPlugin) newMounterInternal(spec *volume.Spec, pod func (plugin *gcePersistentDiskPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newUnmounterInternal(volName, podUID, &GCEDiskUtil{}, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, &GCEDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *gcePersistentDiskPlugin) newUnmounterInternal(volName string, podUID types.UID, manager pdManager, mounter mount.Interface) (volume.Unmounter, error) { @@ -191,7 +191,7 @@ func (plugin *gcePersistentDiskPlugin) newProvisionerInternal(options volume.Vol } func (plugin *gcePersistentDiskPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName()) sourceName, err := mounter.GetDeviceNameFromMount(mountPath, pluginDir) if err != nil { diff --git a/pkg/volume/glusterfs/glusterfs.go b/pkg/volume/glusterfs/glusterfs.go index 9088688f3b1db..1499428f326be 100644 --- a/pkg/volume/glusterfs/glusterfs.go +++ b/pkg/volume/glusterfs/glusterfs.go @@ -152,7 +152,7 @@ func (plugin *glusterfsPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volu return nil, err } glog.V(1).Infof("glusterfs: endpoints %v", ep) - return plugin.newMounterInternal(spec, ep, pod, plugin.host.GetMounter(), exec.New()) + return plugin.newMounterInternal(spec, ep, pod, plugin.host.GetMounter(plugin.GetPluginName()), exec.New()) } func (plugin *glusterfsPlugin) getGlusterVolumeSource(spec *volume.Spec) (*v1.GlusterfsVolumeSource, bool) { @@ -182,7 +182,7 @@ func (plugin *glusterfsPlugin) newMounterInternal(spec *volume.Spec, ep *v1.Endp } func (plugin *glusterfsPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *glusterfsPlugin) newUnmounterInternal(volName string, podUID types.UID, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/iscsi/iscsi.go b/pkg/volume/iscsi/iscsi.go index 3e47cc02a986b..d21295ede647a 100644 --- a/pkg/volume/iscsi/iscsi.go +++ b/pkg/volume/iscsi/iscsi.go @@ -112,7 +112,7 @@ func (plugin *iscsiPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.V } } - return plugin.newMounterInternal(spec, pod.UID, &ISCSIUtil{}, plugin.host.GetMounter(), secret) + return plugin.newMounterInternal(spec, pod.UID, &ISCSIUtil{}, plugin.host.GetMounter(plugin.GetPluginName()), secret) } func (plugin *iscsiPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager diskManager, mounter mount.Interface, secret map[string]string) (volume.Mounter, error) { @@ -155,7 +155,7 @@ func (plugin *iscsiPlugin) newMounterInternal(spec *volume.Spec, podUID types.UI func (plugin *iscsiPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newUnmounterInternal(volName, podUID, &ISCSIUtil{}, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, &ISCSIUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *iscsiPlugin) newUnmounterInternal(volName string, podUID types.UID, manager diskManager, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/local/local.go b/pkg/volume/local/local.go index 33c1acbb6839b..e7316e248dfcb 100644 --- a/pkg/volume/local/local.go +++ b/pkg/volume/local/local.go @@ -104,7 +104,7 @@ func (plugin *localVolumePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ vo localVolume: &localVolume{ podUID: pod.UID, volName: spec.Name(), - mounter: plugin.host.GetMounter(), + mounter: plugin.host.GetMounter(plugin.GetPluginName()), plugin: plugin, globalPath: volumeSource.Path, MetricsProvider: volume.NewMetricsStatFS(volumeSource.Path), @@ -119,7 +119,7 @@ func (plugin *localVolumePlugin) NewUnmounter(volName string, podUID types.UID) localVolume: &localVolume{ podUID: podUID, volName: volName, - mounter: plugin.host.GetMounter(), + mounter: plugin.host.GetMounter(plugin.GetPluginName()), plugin: plugin, }, }, nil diff --git a/pkg/volume/nfs/nfs.go b/pkg/volume/nfs/nfs.go index 52169caf346e4..8d519f76bc9a7 100644 --- a/pkg/volume/nfs/nfs.go +++ b/pkg/volume/nfs/nfs.go @@ -105,7 +105,7 @@ func (plugin *nfsPlugin) GetAccessModes() []v1.PersistentVolumeAccessMode { } func (plugin *nfsPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { - return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *nfsPlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, mounter mount.Interface) (volume.Mounter, error) { @@ -129,7 +129,7 @@ func (plugin *nfsPlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, moun } func (plugin *nfsPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *nfsPlugin) newUnmounterInternal(volName string, podUID types.UID, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/photon_pd/attacher.go b/pkg/volume/photon_pd/attacher.go index b68fcc26534b2..0c3e59297ab12 100644 --- a/pkg/volume/photon_pd/attacher.go +++ b/pkg/volume/photon_pd/attacher.go @@ -180,13 +180,13 @@ func (attacher *photonPersistentDiskAttacher) GetDeviceMountPath(spec *volume.Sp // GetMountDeviceRefs finds all other references to the device referenced // by deviceMountPath; returns a list of paths. func (plugin *photonPersistentDiskPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) return mount.GetMountRefs(mounter, deviceMountPath) } // MountDevice mounts device to global mount point. func (attacher *photonPersistentDiskAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { - mounter := attacher.host.GetMounter() + mounter := attacher.host.GetMounter(photonPersistentDiskPluginName) notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath) if err != nil { if os.IsNotExist(err) { @@ -236,7 +236,7 @@ func (plugin *photonPersistentDiskPlugin) NewDetacher() (volume.Detacher, error) } return &photonPersistentDiskDetacher{ - mounter: plugin.host.GetMounter(), + mounter: plugin.host.GetMounter(plugin.GetPluginName()), photonDisks: photonCloud, }, nil } diff --git a/pkg/volume/photon_pd/photon_pd.go b/pkg/volume/photon_pd/photon_pd.go index 446cd9aa06707..2a6bac269fd29 100644 --- a/pkg/volume/photon_pd/photon_pd.go +++ b/pkg/volume/photon_pd/photon_pd.go @@ -89,11 +89,11 @@ func (plugin *photonPersistentDiskPlugin) SupportsBulkVolumeVerification() bool } func (plugin *photonPersistentDiskPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { - return plugin.newMounterInternal(spec, pod.UID, &PhotonDiskUtil{}, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod.UID, &PhotonDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *photonPersistentDiskPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, &PhotonDiskUtil{}, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, &PhotonDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *photonPersistentDiskPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager pdManager, mounter mount.Interface) (volume.Mounter, error) { @@ -131,7 +131,7 @@ func (plugin *photonPersistentDiskPlugin) newUnmounterInternal(volName string, p } func (plugin *photonPersistentDiskPlugin) ConstructVolumeSpec(volumeSpecName, mountPath string) (*volume.Spec, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName()) pdID, err := mounter.GetDeviceNameFromMount(mountPath, pluginDir) if err != nil { diff --git a/pkg/volume/plugins.go b/pkg/volume/plugins.go index 1521a0afc7378..60d6358d41c5c 100644 --- a/pkg/volume/plugins.go +++ b/pkg/volume/plugins.go @@ -224,7 +224,7 @@ type VolumeHost interface { GetCloudProvider() cloudprovider.Interface // Get mounter interface. - GetMounter() mount.Interface + GetMounter(pluginName string) mount.Interface // Get writer interface for writing data to disk. GetWriter() io.Writer diff --git a/pkg/volume/portworx/portworx.go b/pkg/volume/portworx/portworx.go index e65d4687f404f..bcac7ddcb6e72 100644 --- a/pkg/volume/portworx/portworx.go +++ b/pkg/volume/portworx/portworx.go @@ -91,7 +91,7 @@ func (plugin *portworxVolumePlugin) GetAccessModes() []v1.PersistentVolumeAccess } func (plugin *portworxVolumePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { - return plugin.newMounterInternal(spec, pod.UID, plugin.util, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod.UID, plugin.util, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *portworxVolumePlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager portworxManager, mounter mount.Interface) (volume.Mounter, error) { @@ -115,11 +115,11 @@ func (plugin *portworxVolumePlugin) newMounterInternal(spec *volume.Spec, podUID }, fsType: fsType, readOnly: readOnly, - diskMounter: &mount.SafeFormatAndMount{Interface: plugin.host.GetMounter(), Runner: exec.New()}}, nil + diskMounter: &mount.SafeFormatAndMount{Interface: plugin.host.GetMounter(plugin.GetPluginName()), Runner: exec.New()}}, nil } func (plugin *portworxVolumePlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, plugin.util, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, plugin.util, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *portworxVolumePlugin) newUnmounterInternal(volName string, podUID types.UID, manager portworxManager, diff --git a/pkg/volume/quobyte/quobyte.go b/pkg/volume/quobyte/quobyte.go index a63d952aa28d9..e11376b96e21b 100644 --- a/pkg/volume/quobyte/quobyte.go +++ b/pkg/volume/quobyte/quobyte.go @@ -92,7 +92,7 @@ func (plugin *quobytePlugin) CanSupport(spec *volume.Spec) bool { } // If Quobyte is already mounted we don't need to check if the binary is installed - if mounter, err := plugin.newMounterInternal(spec, nil, plugin.host.GetMounter()); err == nil { + if mounter, err := plugin.newMounterInternal(spec, nil, plugin.host.GetMounter(plugin.GetPluginName())); err == nil { qm, _ := mounter.(*quobyteMounter) pluginDir := plugin.host.GetPluginDir(strings.EscapeQualifiedNameForDisk(quobytePluginName)) if mounted, err := qm.pluginDirIsMounted(pluginDir); mounted && err == nil { @@ -155,7 +155,7 @@ func (plugin *quobytePlugin) ConstructVolumeSpec(volumeName, mountPath string) ( } func (plugin *quobytePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { - return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *quobytePlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, mounter mount.Interface) (volume.Mounter, error) { @@ -181,7 +181,7 @@ func (plugin *quobytePlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, } func (plugin *quobytePlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *quobytePlugin) newUnmounterInternal(volName string, podUID types.UID, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/rbd/rbd.go b/pkg/volume/rbd/rbd.go index ba06953e265cd..41cc28f819885 100644 --- a/pkg/volume/rbd/rbd.go +++ b/pkg/volume/rbd/rbd.go @@ -131,7 +131,7 @@ func (plugin *rbdPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.Vol } // Inject real implementations here, test through the internal function. - return plugin.newMounterInternal(spec, pod.UID, &RBDUtil{}, plugin.host.GetMounter(), secret) + return plugin.newMounterInternal(spec, pod.UID, &RBDUtil{}, plugin.host.GetMounter(plugin.GetPluginName()), secret) } func (plugin *rbdPlugin) getRBDVolumeSource(spec *volume.Spec) (*v1.RBDVolumeSource, bool) { @@ -173,7 +173,7 @@ func (plugin *rbdPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, func (plugin *rbdPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newUnmounterInternal(volName, podUID, &RBDUtil{}, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, &RBDUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *rbdPlugin) newUnmounterInternal(volName string, podUID types.UID, manager diskManager, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/scaleio/sio_plugin.go b/pkg/volume/scaleio/sio_plugin.go index 3b3a620aaf411..69035dd3ba90a 100644 --- a/pkg/volume/scaleio/sio_plugin.go +++ b/pkg/volume/scaleio/sio_plugin.go @@ -53,7 +53,7 @@ var _ volume.VolumePlugin = &sioPlugin{} func (p *sioPlugin) Init(host volume.VolumeHost) error { p.host = host - p.mounter = host.GetMounter() + p.mounter = host.GetMounter(p.GetPluginName()) p.volumeMtx = keymutex.NewKeyMutex() return nil } diff --git a/pkg/volume/secret/secret.go b/pkg/volume/secret/secret.go index ae551e822d777..67f4556e3f010 100644 --- a/pkg/volume/secret/secret.go +++ b/pkg/volume/secret/secret.go @@ -99,7 +99,7 @@ func (plugin *secretPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, opts volu spec.Name(), pod.UID, plugin, - plugin.host.GetMounter(), + plugin.host.GetMounter(plugin.GetPluginName()), plugin.host.GetWriter(), volume.NewCachedMetrics(volume.NewMetricsDu(getPath(pod.UID, spec.Name(), plugin.host))), }, @@ -116,7 +116,7 @@ func (plugin *secretPlugin) NewUnmounter(volName string, podUID types.UID) (volu volName, podUID, plugin, - plugin.host.GetMounter(), + plugin.host.GetMounter(plugin.GetPluginName()), plugin.host.GetWriter(), volume.NewCachedMetrics(volume.NewMetricsDu(getPath(podUID, volName, plugin.host))), }, diff --git a/pkg/volume/storageos/storageos.go b/pkg/volume/storageos/storageos.go index 6541f2eeb3fa9..cc575f5a1f6df 100644 --- a/pkg/volume/storageos/storageos.go +++ b/pkg/volume/storageos/storageos.go @@ -111,7 +111,7 @@ func (plugin *storageosPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volu return nil, err } - return plugin.newMounterInternal(spec, pod, apiCfg, &storageosUtil{}, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod, apiCfg, &storageosUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *storageosPlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, apiCfg *storageosAPIConfig, manager storageosManager, mounter mount.Interface) (volume.Mounter, error) { @@ -142,7 +142,7 @@ func (plugin *storageosPlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod } func (plugin *storageosPlugin) NewUnmounter(pvName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(pvName, podUID, &storageosUtil{}, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(pvName, podUID, &storageosUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *storageosPlugin) newUnmounterInternal(pvName string, podUID types.UID, manager storageosManager, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/testing/testing.go b/pkg/volume/testing/testing.go index bc96bd6ecd4a9..f632ce5d4254a 100644 --- a/pkg/volume/testing/testing.go +++ b/pkg/volume/testing/testing.go @@ -90,7 +90,7 @@ func (f *fakeVolumeHost) GetCloudProvider() cloudprovider.Interface { return f.cloud } -func (f *fakeVolumeHost) GetMounter() mount.Interface { +func (f *fakeVolumeHost) GetMounter(pluginName string) mount.Interface { return f.mounter } diff --git a/pkg/volume/vsphere_volume/attacher.go b/pkg/volume/vsphere_volume/attacher.go index f7a58c80d4e39..2cf90ab883b0d 100644 --- a/pkg/volume/vsphere_volume/attacher.go +++ b/pkg/volume/vsphere_volume/attacher.go @@ -167,13 +167,13 @@ func (attacher *vsphereVMDKAttacher) GetDeviceMountPath(spec *volume.Spec) (stri // GetMountDeviceRefs finds all other references to the device referenced // by deviceMountPath; returns a list of paths. func (plugin *vsphereVolumePlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) return mount.GetMountRefs(mounter, deviceMountPath) } // MountDevice mounts device to global mount point. func (attacher *vsphereVMDKAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { - mounter := attacher.host.GetMounter() + mounter := attacher.host.GetMounter(vsphereVolumePluginName) notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath) if err != nil { if os.IsNotExist(err) { @@ -221,7 +221,7 @@ func (plugin *vsphereVolumePlugin) NewDetacher() (volume.Detacher, error) { } return &vsphereVMDKDetacher{ - mounter: plugin.host.GetMounter(), + mounter: plugin.host.GetMounter(plugin.GetPluginName()), vsphereVolumes: vsphereCloud, }, nil } diff --git a/pkg/volume/vsphere_volume/vsphere_volume.go b/pkg/volume/vsphere_volume/vsphere_volume.go index 0871055d33b1d..36043df28f891 100644 --- a/pkg/volume/vsphere_volume/vsphere_volume.go +++ b/pkg/volume/vsphere_volume/vsphere_volume.go @@ -90,11 +90,11 @@ func (plugin *vsphereVolumePlugin) SupportsBulkVolumeVerification() bool { } func (plugin *vsphereVolumePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { - return plugin.newMounterInternal(spec, pod.UID, &VsphereDiskUtil{}, plugin.host.GetMounter()) + return plugin.newMounterInternal(spec, pod.UID, &VsphereDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *vsphereVolumePlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { - return plugin.newUnmounterInternal(volName, podUID, &VsphereDiskUtil{}, plugin.host.GetMounter()) + return plugin.newUnmounterInternal(volName, podUID, &VsphereDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) } func (plugin *vsphereVolumePlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager vdManager, mounter mount.Interface) (volume.Mounter, error) { @@ -131,7 +131,7 @@ func (plugin *vsphereVolumePlugin) newUnmounterInternal(volName string, podUID t } func (plugin *vsphereVolumePlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { - mounter := plugin.host.GetMounter() + mounter := plugin.host.GetMounter(plugin.GetPluginName()) pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName()) volumePath, err := mounter.GetDeviceNameFromMount(mountPath, pluginDir) if err != nil { From 0e547bae225b8d019d31054c4cf66670abf9ec17 Mon Sep 17 00:00:00 2001 From: Jan Safranek Date: Mon, 14 Aug 2017 12:16:27 +0200 Subject: [PATCH 038/403] SafeFormatAndMount should use volume.Exec provided by VolumeHost We need to execute mkfs / fsck where the utilities are. --- pkg/util/mount/BUILD | 5 +-- pkg/util/mount/mount.go | 3 +- pkg/util/mount/mount_linux.go | 9 ++-- pkg/util/mount/safe_format_and_mount_test.go | 45 ++++++++------------ pkg/volume/aws_ebs/BUILD | 1 - pkg/volume/aws_ebs/attacher.go | 4 +- pkg/volume/aws_ebs/aws_ebs.go | 3 +- pkg/volume/azure_dd/BUILD | 1 + pkg/volume/azure_dd/attacher.go | 3 +- pkg/volume/cinder/attacher.go | 4 +- pkg/volume/cinder/cinder.go | 3 +- pkg/volume/fc/BUILD | 1 + pkg/volume/fc/attacher.go | 5 ++- pkg/volume/fc/fc.go | 6 +-- pkg/volume/fc/fc_test.go | 6 ++- pkg/volume/flexvolume/attacher-defaults.go | 3 +- pkg/volume/flexvolume/mounter.go | 4 -- pkg/volume/flexvolume/plugin.go | 7 ++- pkg/volume/gce_pd/attacher.go | 4 +- pkg/volume/iscsi/iscsi.go | 10 ++--- pkg/volume/iscsi/iscsi_test.go | 5 ++- pkg/volume/photon_pd/BUILD | 1 - pkg/volume/photon_pd/attacher.go | 4 +- pkg/volume/photon_pd/photon_pd.go | 3 +- pkg/volume/portworx/BUILD | 1 - pkg/volume/portworx/portworx.go | 3 +- pkg/volume/rbd/rbd.go | 4 +- pkg/volume/scaleio/BUILD | 1 - pkg/volume/scaleio/sio_volume.go | 6 +-- pkg/volume/storageos/storageos.go | 3 +- pkg/volume/util/volumehelper/BUILD | 1 + pkg/volume/util/volumehelper/volumehelper.go | 9 ++++ pkg/volume/vsphere_volume/BUILD | 1 - pkg/volume/vsphere_volume/attacher.go | 4 +- pkg/volume/vsphere_volume/vsphere_volume.go | 3 +- 35 files changed, 77 insertions(+), 99 deletions(-) diff --git a/pkg/util/mount/BUILD b/pkg/util/mount/BUILD index 6087221857d89..3bfcded823f71 100644 --- a/pkg/util/mount/BUILD +++ b/pkg/util/mount/BUILD @@ -46,10 +46,7 @@ go_test( "//conditions:default": [], }), library = ":go_default_library", - deps = [ - "//vendor/k8s.io/utils/exec:go_default_library", - "//vendor/k8s.io/utils/exec/testing:go_default_library", - ], + deps = ["//vendor/k8s.io/utils/exec/testing:go_default_library"], ) filegroup( diff --git a/pkg/util/mount/mount.go b/pkg/util/mount/mount.go index 7552bbb0949a1..446e1f51f7fad 100644 --- a/pkg/util/mount/mount.go +++ b/pkg/util/mount/mount.go @@ -25,7 +25,6 @@ import ( "strings" "github.com/golang/glog" - "k8s.io/utils/exec" ) const ( @@ -99,7 +98,7 @@ type MountPoint struct { // mounts it otherwise the device is formatted first then mounted. type SafeFormatAndMount struct { Interface - Runner exec.Interface + Exec } // FormatAndMount formats the given disk, if needed, and mounts it. diff --git a/pkg/util/mount/mount_linux.go b/pkg/util/mount/mount_linux.go index 65715db6cc210..88396708a4f49 100644 --- a/pkg/util/mount/mount_linux.go +++ b/pkg/util/mount/mount_linux.go @@ -412,8 +412,7 @@ func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, // Run fsck on the disk to fix repairable issues glog.V(4).Infof("Checking for issues with fsck on disk: %s", source) args := []string{"-a", source} - cmd := mounter.Runner.Command("fsck", args...) - out, err := cmd.CombinedOutput() + out, err := mounter.Exec.Run("fsck", args...) if err != nil { ee, isExitError := err.(utilexec.ExitError) switch { @@ -450,8 +449,7 @@ func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, args = []string{"-F", source} } glog.Infof("Disk %q appears to be unformatted, attempting to format as type: %q with options: %v", source, fstype, args) - cmd := mounter.Runner.Command("mkfs."+fstype, args...) - _, err := cmd.CombinedOutput() + _, err := mounter.Exec.Run("mkfs."+fstype, args...) if err == nil { // the disk has been formatted successfully try to mount it again. glog.Infof("Disk successfully formatted (mkfs): %s - %s %s", fstype, source, target) @@ -476,9 +474,8 @@ func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, // diskLooksUnformatted uses 'lsblk' to see if the given disk is unformated func (mounter *SafeFormatAndMount) getDiskFormat(disk string) (string, error) { args := []string{"-n", "-o", "FSTYPE", disk} - cmd := mounter.Runner.Command("lsblk", args...) glog.V(4).Infof("Attempting to determine if disk %q is formatted using lsblk with args: (%v)", disk, args) - dataOut, err := cmd.CombinedOutput() + dataOut, err := mounter.Exec.Run("lsblk", args...) output := string(dataOut) glog.V(4).Infof("Output: %q", output) diff --git a/pkg/util/mount/safe_format_and_mount_test.go b/pkg/util/mount/safe_format_and_mount_test.go index 3ea9d575b1c59..72b768f3bf436 100644 --- a/pkg/util/mount/safe_format_and_mount_test.go +++ b/pkg/util/mount/safe_format_and_mount_test.go @@ -21,7 +21,6 @@ import ( "runtime" "testing" - "k8s.io/utils/exec" fakeexec "k8s.io/utils/exec/testing" ) @@ -181,40 +180,30 @@ func TestSafeFormatAndMount(t *testing.T) { } for _, test := range tests { - commandScripts := []fakeexec.FakeCommandAction{} - for _, expected := range test.execScripts { - ecmd := expected.command - eargs := expected.args - output := expected.output - err := expected.err - commandScript := func(cmd string, args ...string) exec.Cmd { - if cmd != ecmd { - t.Errorf("Unexpected command %s. Expecting %s", cmd, ecmd) - } - - for j := range args { - if args[j] != eargs[j] { - t.Errorf("Unexpected args %v. Expecting %v", args, eargs) - } - } - fake := fakeexec.FakeCmd{ - CombinedOutputScript: []fakeexec.FakeCombinedOutputAction{ - func() ([]byte, error) { return []byte(output), err }, - }, + execCallCount := 0 + execCallback := func(cmd string, args ...string) ([]byte, error) { + if len(test.execScripts) <= execCallCount { + t.Errorf("Unexpected command: %s %v", cmd, args) + return nil, nil + } + script := test.execScripts[execCallCount] + execCallCount++ + if script.command != cmd { + t.Errorf("Unexpected command %s. Expecting %s", cmd, script.command) + } + for j := range args { + if args[j] != script.args[j] { + t.Errorf("Unexpected args %v. Expecting %v", args, script.args) } - return fakeexec.InitFakeCmd(&fake, cmd, args...) } - commandScripts = append(commandScripts, commandScript) - } - - fake := fakeexec.FakeExec{ - CommandScript: commandScripts, + return []byte(script.output), script.err } fakeMounter := ErrorMounter{&FakeMounter{}, 0, test.mountErrs} + fakeExec := NewFakeExec(execCallback) mounter := SafeFormatAndMount{ Interface: &fakeMounter, - Runner: &fake, + Exec: fakeExec, } device := "/dev/foo" diff --git a/pkg/volume/aws_ebs/BUILD b/pkg/volume/aws_ebs/BUILD index 7b623b5f43a45..a8d96f4b4ba10 100644 --- a/pkg/volume/aws_ebs/BUILD +++ b/pkg/volume/aws_ebs/BUILD @@ -27,7 +27,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/pkg/volume/aws_ebs/attacher.go b/pkg/volume/aws_ebs/attacher.go index 1419864127fa3..2ffa14f412282 100644 --- a/pkg/volume/aws_ebs/attacher.go +++ b/pkg/volume/aws_ebs/attacher.go @@ -29,7 +29,7 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/utils/exec" + "k8s.io/kubernetes/pkg/volume/util/volumehelper" ) type awsElasticBlockStoreAttacher struct { @@ -222,7 +222,7 @@ func (attacher *awsElasticBlockStoreAttacher) MountDevice(spec *volume.Spec, dev options = append(options, "ro") } if notMnt { - diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} + diskMounter := volumehelper.NewSafeFormatAndMountFromHost(awsElasticBlockStorePluginName, attacher.host) mountOptions := volume.MountOptionFromSpec(spec, options...) err = diskMounter.FormatAndMount(devicePath, deviceMountPath, volumeSource.FSType, mountOptions) if err != nil { diff --git a/pkg/volume/aws_ebs/aws_ebs.go b/pkg/volume/aws_ebs/aws_ebs.go index 433d9325be84b..7a81f7605e71e 100644 --- a/pkg/volume/aws_ebs/aws_ebs.go +++ b/pkg/volume/aws_ebs/aws_ebs.go @@ -35,7 +35,6 @@ import ( "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumehelper" - "k8s.io/utils/exec" ) // This is the primary entrypoint for volume plugins. @@ -135,7 +134,7 @@ func (plugin *awsElasticBlockStorePlugin) newMounterInternal(spec *volume.Spec, }, fsType: fsType, readOnly: readOnly, - diskMounter: &mount.SafeFormatAndMount{Interface: plugin.host.GetMounter(plugin.GetPluginName()), Runner: exec.New()}}, nil + diskMounter: volumehelper.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host)}, nil } func (plugin *awsElasticBlockStorePlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { diff --git a/pkg/volume/azure_dd/BUILD b/pkg/volume/azure_dd/BUILD index db2313fe564bf..04688265332ac 100644 --- a/pkg/volume/azure_dd/BUILD +++ b/pkg/volume/azure_dd/BUILD @@ -24,6 +24,7 @@ go_library( "//pkg/util/strings:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", + "//pkg/volume/util/volumehelper:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/arm/compute:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/arm/storage:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/pkg/volume/azure_dd/attacher.go b/pkg/volume/azure_dd/attacher.go index 43e300fd16cab..9c6822d2a870a 100644 --- a/pkg/volume/azure_dd/attacher.go +++ b/pkg/volume/azure_dd/attacher.go @@ -35,6 +35,7 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" + "k8s.io/kubernetes/pkg/volume/util/volumehelper" "k8s.io/utils/exec" ) @@ -232,7 +233,7 @@ func (attacher *azureDiskAttacher) MountDevice(spec *volume.Spec, devicePath str options := []string{} if notMnt { - diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} + diskMounter := volumehelper.NewSafeFormatAndMountFromHost(azureDataDiskPluginName, attacher.plugin.host) mountOptions := volume.MountOptionFromSpec(spec, options...) err = diskMounter.FormatAndMount(devicePath, deviceMountPath, *volumeSource.FSType, mountOptions) if err != nil { diff --git a/pkg/volume/cinder/attacher.go b/pkg/volume/cinder/attacher.go index 024af41c73c8d..467e6c894200e 100644 --- a/pkg/volume/cinder/attacher.go +++ b/pkg/volume/cinder/attacher.go @@ -29,7 +29,7 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/utils/exec" + "k8s.io/kubernetes/pkg/volume/util/volumehelper" ) type cinderDiskAttacher struct { @@ -285,7 +285,7 @@ func (attacher *cinderDiskAttacher) MountDevice(spec *volume.Spec, devicePath st options = append(options, "ro") } if notMnt { - diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} + diskMounter := volumehelper.NewSafeFormatAndMountFromHost(cinderVolumePluginName, attacher.host) mountOptions := volume.MountOptionFromSpec(spec, options...) err = diskMounter.FormatAndMount(devicePath, deviceMountPath, volumeSource.FSType, mountOptions) if err != nil { diff --git a/pkg/volume/cinder/cinder.go b/pkg/volume/cinder/cinder.go index d045a7128b964..be6572dcd2666 100644 --- a/pkg/volume/cinder/cinder.go +++ b/pkg/volume/cinder/cinder.go @@ -36,7 +36,6 @@ import ( "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumehelper" - "k8s.io/utils/exec" ) // This is the primary entrypoint for volume plugins. @@ -139,7 +138,7 @@ func (plugin *cinderPlugin) newMounterInternal(spec *volume.Spec, podUID types.U }, fsType: fsType, readOnly: readOnly, - blockDeviceMounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()}}, nil + blockDeviceMounter: volumehelper.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host)}, nil } func (plugin *cinderPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { diff --git a/pkg/volume/fc/BUILD b/pkg/volume/fc/BUILD index df6f13d053faf..0fe87cbc121ca 100644 --- a/pkg/volume/fc/BUILD +++ b/pkg/volume/fc/BUILD @@ -20,6 +20,7 @@ go_library( "//pkg/util/strings:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", + "//pkg/volume/util/volumehelper:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/pkg/volume/fc/attacher.go b/pkg/volume/fc/attacher.go index 52f4a26d287f5..710716faa6c31 100644 --- a/pkg/volume/fc/attacher.go +++ b/pkg/volume/fc/attacher.go @@ -28,6 +28,7 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" + "k8s.io/kubernetes/pkg/volume/util/volumehelper" "k8s.io/utils/exec" ) @@ -111,7 +112,7 @@ func (attacher *fcAttacher) MountDevice(spec *volume.Spec, devicePath string, de options = append(options, "ro") } if notMnt { - diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} + diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Exec: attacher.host.GetExec(fcPluginName)} mountOptions := volume.MountOptionFromSpec(spec, options...) err = diskMounter.FormatAndMount(devicePath, deviceMountPath, volumeSource.FSType, mountOptions) if err != nil { @@ -192,7 +193,7 @@ func volumeSpecToMounter(spec *volume.Spec, host volume.VolumeHost) (*fcDiskMoun }, fsType: fc.FSType, readOnly: readOnly, - mounter: &mount.SafeFormatAndMount{Interface: host.GetMounter(fcPluginName), Runner: exec.New()}, + mounter: volumehelper.NewSafeFormatAndMountFromHost(fcPluginName, host), }, nil } diff --git a/pkg/volume/fc/fc.go b/pkg/volume/fc/fc.go index 079187320ebf7..7d4392fa3ef9a 100644 --- a/pkg/volume/fc/fc.go +++ b/pkg/volume/fc/fc.go @@ -103,10 +103,10 @@ func (plugin *fcPlugin) GetAccessModes() []v1.PersistentVolumeAccessMode { func (plugin *fcPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newMounterInternal(spec, pod.UID, &FCUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) + return plugin.newMounterInternal(spec, pod.UID, &FCUtil{}, plugin.host.GetMounter(plugin.GetPluginName()), plugin.host.GetExec(plugin.GetPluginName())) } -func (plugin *fcPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager diskManager, mounter mount.Interface) (volume.Mounter, error) { +func (plugin *fcPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager diskManager, mounter mount.Interface, exec mount.Exec) (volume.Mounter, error) { // fc volumes used directly in a pod have a ReadOnly flag set by the pod author. // fc volumes used as a PersistentVolume gets the ReadOnly flag indirectly through the persistent-claim volume used to mount the PV fc, readOnly, err := getVolumeSource(spec) @@ -138,7 +138,7 @@ func (plugin *fcPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, plugin: plugin}, fsType: fc.FSType, readOnly: readOnly, - mounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()}, + mounter: &mount.SafeFormatAndMount{Interface: mounter, Exec: exec}, }, nil } diff --git a/pkg/volume/fc/fc_test.go b/pkg/volume/fc/fc_test.go index e2662d2c90922..c65ff800f95d5 100644 --- a/pkg/volume/fc/fc_test.go +++ b/pkg/volume/fc/fc_test.go @@ -141,7 +141,8 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { fakeManager := NewFakeDiskManager() defer fakeManager.Cleanup() fakeMounter := &mount.FakeMounter{} - mounter, err := plug.(*fcPlugin).newMounterInternal(spec, types.UID("poduid"), fakeManager, fakeMounter) + fakeExec := mount.NewFakeExec(nil) + mounter, err := plug.(*fcPlugin).newMounterInternal(spec, types.UID("poduid"), fakeManager, fakeMounter, fakeExec) if err != nil { t.Errorf("Failed to make a new Mounter: %v", err) } @@ -210,7 +211,8 @@ func doTestPluginNilMounter(t *testing.T, spec *volume.Spec) { fakeManager := NewFakeDiskManager() defer fakeManager.Cleanup() fakeMounter := &mount.FakeMounter{} - mounter, err := plug.(*fcPlugin).newMounterInternal(spec, types.UID("poduid"), fakeManager, fakeMounter) + fakeExec := mount.NewFakeExec(nil) + mounter, err := plug.(*fcPlugin).newMounterInternal(spec, types.UID("poduid"), fakeManager, fakeMounter, fakeExec) if err == nil { t.Errorf("Error failed to make a new Mounter is expected: %v", err) } diff --git a/pkg/volume/flexvolume/attacher-defaults.go b/pkg/volume/flexvolume/attacher-defaults.go index 3073f4def051b..bf8dcfe825414 100644 --- a/pkg/volume/flexvolume/attacher-defaults.go +++ b/pkg/volume/flexvolume/attacher-defaults.go @@ -24,7 +24,6 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" - "k8s.io/utils/exec" ) type attacherDefaults flexVolumeAttacher @@ -59,7 +58,7 @@ func (a *attacherDefaults) MountDevice(spec *volume.Spec, devicePath string, dev options = append(options, "rw") } - diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} + diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Exec: a.plugin.host.GetExec(a.plugin.GetPluginName())} return diskMounter.FormatAndMount(devicePath, deviceMountPath, volSource.FSType, options) } diff --git a/pkg/volume/flexvolume/mounter.go b/pkg/volume/flexvolume/mounter.go index 316928c429ba6..94b2ffd748867 100644 --- a/pkg/volume/flexvolume/mounter.go +++ b/pkg/volume/flexvolume/mounter.go @@ -19,7 +19,6 @@ package flexvolume import ( "strconv" - "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" "k8s.io/utils/exec" ) @@ -29,9 +28,6 @@ type flexVolumeMounter struct { *flexVolume // Runner used to setup the volume. runner exec.Interface - // blockDeviceMounter provides the interface to create filesystem if the - // filesystem doesn't exist. - blockDeviceMounter mount.Interface // the considered volume spec spec *volume.Spec readOnly bool diff --git a/pkg/volume/flexvolume/plugin.go b/pkg/volume/flexvolume/plugin.go index cd1de0a6be475..955a47c3c003a 100644 --- a/pkg/volume/flexvolume/plugin.go +++ b/pkg/volume/flexvolume/plugin.go @@ -176,10 +176,9 @@ func (plugin *flexVolumePlugin) newMounterInternal(spec *volume.Spec, pod *api.P podServiceAccountName: pod.Spec.ServiceAccountName, volName: spec.Name(), }, - runner: runner, - spec: spec, - readOnly: readOnly, - blockDeviceMounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: runner}, + runner: runner, + spec: spec, + readOnly: readOnly, }, nil } diff --git a/pkg/volume/gce_pd/attacher.go b/pkg/volume/gce_pd/attacher.go index 4801b80101c71..e60f3c6c2f0a4 100644 --- a/pkg/volume/gce_pd/attacher.go +++ b/pkg/volume/gce_pd/attacher.go @@ -31,7 +31,7 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/utils/exec" + "k8s.io/kubernetes/pkg/volume/util/volumehelper" ) type gcePersistentDiskAttacher struct { @@ -208,7 +208,7 @@ func (attacher *gcePersistentDiskAttacher) MountDevice(spec *volume.Spec, device options = append(options, "ro") } if notMnt { - diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} + diskMounter := volumehelper.NewSafeFormatAndMountFromHost(gcePersistentDiskPluginName, attacher.host) mountOptions := volume.MountOptionFromSpec(spec, options...) err = diskMounter.FormatAndMount(devicePath, deviceMountPath, volumeSource.FSType, mountOptions) if err != nil { diff --git a/pkg/volume/iscsi/iscsi.go b/pkg/volume/iscsi/iscsi.go index d21295ede647a..d4b09f00f00bf 100644 --- a/pkg/volume/iscsi/iscsi.go +++ b/pkg/volume/iscsi/iscsi.go @@ -112,10 +112,10 @@ func (plugin *iscsiPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.V } } - return plugin.newMounterInternal(spec, pod.UID, &ISCSIUtil{}, plugin.host.GetMounter(plugin.GetPluginName()), secret) + return plugin.newMounterInternal(spec, pod.UID, &ISCSIUtil{}, plugin.host.GetMounter(plugin.GetPluginName()), plugin.host.GetExec(plugin.GetPluginName()), secret) } -func (plugin *iscsiPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager diskManager, mounter mount.Interface, secret map[string]string) (volume.Mounter, error) { +func (plugin *iscsiPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager diskManager, mounter mount.Interface, exec mount.Exec, secret map[string]string) (volume.Mounter, error) { // iscsi volumes used directly in a pod have a ReadOnly flag set by the pod author. // iscsi volumes used as a PersistentVolume gets the ReadOnly flag indirectly through the persistent-claim volume used to mount the PV iscsi, readOnly, err := getVolumeSource(spec) @@ -147,7 +147,7 @@ func (plugin *iscsiPlugin) newMounterInternal(spec *volume.Spec, podUID types.UI plugin: plugin}, fsType: iscsi.FSType, readOnly: readOnly, - mounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()}, + mounter: &mount.SafeFormatAndMount{Interface: mounter, Exec: exec}, deviceUtil: ioutil.NewDeviceHandler(ioutil.NewIOHandler()), mountOptions: volume.MountOptionFromSpec(spec), }, nil @@ -155,10 +155,10 @@ func (plugin *iscsiPlugin) newMounterInternal(spec *volume.Spec, podUID types.UI func (plugin *iscsiPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { // Inject real implementations here, test through the internal function. - return plugin.newUnmounterInternal(volName, podUID, &ISCSIUtil{}, plugin.host.GetMounter(plugin.GetPluginName())) + return plugin.newUnmounterInternal(volName, podUID, &ISCSIUtil{}, plugin.host.GetMounter(plugin.GetPluginName()), plugin.host.GetExec(plugin.GetPluginName())) } -func (plugin *iscsiPlugin) newUnmounterInternal(volName string, podUID types.UID, manager diskManager, mounter mount.Interface) (volume.Unmounter, error) { +func (plugin *iscsiPlugin) newUnmounterInternal(volName string, podUID types.UID, manager diskManager, mounter mount.Interface, exec mount.Exec) (volume.Unmounter, error) { return &iscsiDiskUnmounter{ iscsiDisk: &iscsiDisk{ podUID: podUID, diff --git a/pkg/volume/iscsi/iscsi_test.go b/pkg/volume/iscsi/iscsi_test.go index 348b1994b3fb8..1c88d0bf7f73f 100644 --- a/pkg/volume/iscsi/iscsi_test.go +++ b/pkg/volume/iscsi/iscsi_test.go @@ -141,7 +141,8 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { fakeManager := NewFakeDiskManager() defer fakeManager.Cleanup() fakeMounter := &mount.FakeMounter{} - mounter, err := plug.(*iscsiPlugin).newMounterInternal(spec, types.UID("poduid"), fakeManager, fakeMounter, nil) + fakeExec := mount.NewFakeExec(nil) + mounter, err := plug.(*iscsiPlugin).newMounterInternal(spec, types.UID("poduid"), fakeManager, fakeMounter, fakeExec, nil) if err != nil { t.Errorf("Failed to make a new Mounter: %v", err) } @@ -178,7 +179,7 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { fakeManager2 := NewFakeDiskManager() defer fakeManager2.Cleanup() - unmounter, err := plug.(*iscsiPlugin).newUnmounterInternal("vol1", types.UID("poduid"), fakeManager2, fakeMounter) + unmounter, err := plug.(*iscsiPlugin).newUnmounterInternal("vol1", types.UID("poduid"), fakeManager2, fakeMounter, fakeExec) if err != nil { t.Errorf("Failed to make a new Unmounter: %v", err) } diff --git a/pkg/volume/photon_pd/BUILD b/pkg/volume/photon_pd/BUILD index d35face84e1b6..a57d2b6cefda9 100644 --- a/pkg/volume/photon_pd/BUILD +++ b/pkg/volume/photon_pd/BUILD @@ -26,7 +26,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/pkg/volume/photon_pd/attacher.go b/pkg/volume/photon_pd/attacher.go index 0c3e59297ab12..8bdaba3c10f72 100644 --- a/pkg/volume/photon_pd/attacher.go +++ b/pkg/volume/photon_pd/attacher.go @@ -30,7 +30,7 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/utils/exec" + "k8s.io/kubernetes/pkg/volume/util/volumehelper" ) type photonPersistentDiskAttacher struct { @@ -209,7 +209,7 @@ func (attacher *photonPersistentDiskAttacher) MountDevice(spec *volume.Spec, dev options := []string{} if notMnt { - diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} + diskMounter := volumehelper.NewSafeFormatAndMountFromHost(photonPersistentDiskPluginName, attacher.host) mountOptions := volume.MountOptionFromSpec(spec) err = diskMounter.FormatAndMount(devicePath, deviceMountPath, volumeSource.FSType, mountOptions) if err != nil { diff --git a/pkg/volume/photon_pd/photon_pd.go b/pkg/volume/photon_pd/photon_pd.go index 2a6bac269fd29..daa0470893e70 100644 --- a/pkg/volume/photon_pd/photon_pd.go +++ b/pkg/volume/photon_pd/photon_pd.go @@ -31,7 +31,6 @@ import ( "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumehelper" - "k8s.io/utils/exec" ) // This is the primary entrypoint for volume plugins. @@ -116,7 +115,7 @@ func (plugin *photonPersistentDiskPlugin) newMounterInternal(spec *volume.Spec, plugin: plugin, }, fsType: fsType, - diskMounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()}}, nil + diskMounter: volumehelper.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host)}, nil } func (plugin *photonPersistentDiskPlugin) newUnmounterInternal(volName string, podUID types.UID, manager pdManager, mounter mount.Interface) (volume.Unmounter, error) { diff --git a/pkg/volume/portworx/BUILD b/pkg/volume/portworx/BUILD index 5f7d8abe3cee0..155eddc4ed3bb 100644 --- a/pkg/volume/portworx/BUILD +++ b/pkg/volume/portworx/BUILD @@ -43,7 +43,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/pkg/volume/portworx/portworx.go b/pkg/volume/portworx/portworx.go index bcac7ddcb6e72..165e9206e243e 100644 --- a/pkg/volume/portworx/portworx.go +++ b/pkg/volume/portworx/portworx.go @@ -29,7 +29,6 @@ import ( kstrings "k8s.io/kubernetes/pkg/util/strings" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util/volumehelper" - "k8s.io/utils/exec" ) // This is the primary entrypoint for volume plugins. @@ -115,7 +114,7 @@ func (plugin *portworxVolumePlugin) newMounterInternal(spec *volume.Spec, podUID }, fsType: fsType, readOnly: readOnly, - diskMounter: &mount.SafeFormatAndMount{Interface: plugin.host.GetMounter(plugin.GetPluginName()), Runner: exec.New()}}, nil + diskMounter: volumehelper.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host)}, nil } func (plugin *portworxVolumePlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) { diff --git a/pkg/volume/rbd/rbd.go b/pkg/volume/rbd/rbd.go index 41cc28f819885..4b58a10bb2756 100644 --- a/pkg/volume/rbd/rbd.go +++ b/pkg/volume/rbd/rbd.go @@ -158,7 +158,7 @@ func (plugin *rbdPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, Pool: pool, ReadOnly: readOnly, manager: manager, - mounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()}, + mounter: volumehelper.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host), plugin: plugin, MetricsProvider: volume.NewMetricsStatFS(getPath(podUID, spec.Name(), plugin.host)), }, @@ -183,7 +183,7 @@ func (plugin *rbdPlugin) newUnmounterInternal(volName string, podUID types.UID, podUID: podUID, volName: volName, manager: manager, - mounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()}, + mounter: volumehelper.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host), plugin: plugin, MetricsProvider: volume.NewMetricsStatFS(getPath(podUID, volName, plugin.host)), }, diff --git a/pkg/volume/scaleio/BUILD b/pkg/volume/scaleio/BUILD index cdd168fd922dc..6374c05205c0d 100644 --- a/pkg/volume/scaleio/BUILD +++ b/pkg/volume/scaleio/BUILD @@ -52,7 +52,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/pkg/volume/scaleio/sio_volume.go b/pkg/volume/scaleio/sio_volume.go index 1897ea449e90d..654d8fd58a600 100644 --- a/pkg/volume/scaleio/sio_volume.go +++ b/pkg/volume/scaleio/sio_volume.go @@ -34,7 +34,6 @@ import ( "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumehelper" - "k8s.io/utils/exec" ) type sioVolume struct { @@ -143,10 +142,7 @@ func (v *sioVolume) SetUpAt(dir string, fsGroup *int64) error { } glog.V(4).Info(log("setup created mount point directory %s", dir)) - diskMounter := &mount.SafeFormatAndMount{ - Interface: v.plugin.mounter, - Runner: exec.New(), - } + diskMounter := volumehelper.NewSafeFormatAndMountFromHost(v.plugin.GetPluginName(), v.plugin.host) err = diskMounter.FormatAndMount(devicePath, dir, v.fsType, options) if err != nil { diff --git a/pkg/volume/storageos/storageos.go b/pkg/volume/storageos/storageos.go index cc575f5a1f6df..af76fb7fac9da 100644 --- a/pkg/volume/storageos/storageos.go +++ b/pkg/volume/storageos/storageos.go @@ -36,7 +36,6 @@ import ( "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumehelper" - "k8s.io/utils/exec" ) // ProbeVolumePlugins is the primary entrypoint for volume plugins. @@ -137,7 +136,7 @@ func (plugin *storageosPlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod MetricsProvider: volume.NewMetricsStatFS(getPath(pod.UID, volNamespace, volName, spec.Name(), plugin.host)), }, devicePath: storageosDevicePath, - diskMounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()}, + diskMounter: &mount.SafeFormatAndMount{Interface: mounter, Exec: plugin.host.GetExec(plugin.GetPluginName())}, }, nil } diff --git a/pkg/volume/util/volumehelper/BUILD b/pkg/volume/util/volumehelper/BUILD index 1880d21c05853..849d3ee4e2c14 100644 --- a/pkg/volume/util/volumehelper/BUILD +++ b/pkg/volume/util/volumehelper/BUILD @@ -9,6 +9,7 @@ go_library( name = "go_default_library", srcs = ["volumehelper.go"], deps = [ + "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util/types:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/volume/util/volumehelper/volumehelper.go b/pkg/volume/util/volumehelper/volumehelper.go index bcde93f71ed89..b0734601d0af7 100644 --- a/pkg/volume/util/volumehelper/volumehelper.go +++ b/pkg/volume/util/volumehelper/volumehelper.go @@ -23,6 +23,7 @@ import ( "strings" "k8s.io/api/core/v1" + "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util/types" ) @@ -127,3 +128,11 @@ func SplitUniqueName(uniqueName v1.UniqueVolumeName) (string, string, error) { pluginName := fmt.Sprintf("%s/%s", components[0], components[1]) return pluginName, components[2], nil } + +// NewSafeFormatAndMountFromHost creates a new SafeFormatAndMount with Mounter +// and Exec taken from given VolumeHost. +func NewSafeFormatAndMountFromHost(pluginName string, host volume.VolumeHost) *mount.SafeFormatAndMount { + mounter := host.GetMounter(pluginName) + exec := host.GetExec(pluginName) + return &mount.SafeFormatAndMount{Interface: mounter, Exec: exec} +} diff --git a/pkg/volume/vsphere_volume/BUILD b/pkg/volume/vsphere_volume/BUILD index e118362772b60..9f5a9ac63a6e9 100644 --- a/pkg/volume/vsphere_volume/BUILD +++ b/pkg/volume/vsphere_volume/BUILD @@ -28,7 +28,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/pkg/volume/vsphere_volume/attacher.go b/pkg/volume/vsphere_volume/attacher.go index 2cf90ab883b0d..e87b07d50c509 100644 --- a/pkg/volume/vsphere_volume/attacher.go +++ b/pkg/volume/vsphere_volume/attacher.go @@ -29,7 +29,7 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/utils/exec" + "k8s.io/kubernetes/pkg/volume/util/volumehelper" ) type vsphereVMDKAttacher struct { @@ -195,7 +195,7 @@ func (attacher *vsphereVMDKAttacher) MountDevice(spec *volume.Spec, devicePath s options := []string{} if notMnt { - diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} + diskMounter := volumehelper.NewSafeFormatAndMountFromHost(vsphereVolumePluginName, attacher.host) mountOptions := volume.MountOptionFromSpec(spec, options...) err = diskMounter.FormatAndMount(devicePath, deviceMountPath, volumeSource.FSType, mountOptions) if err != nil { diff --git a/pkg/volume/vsphere_volume/vsphere_volume.go b/pkg/volume/vsphere_volume/vsphere_volume.go index 36043df28f891..92322fa2ace34 100644 --- a/pkg/volume/vsphere_volume/vsphere_volume.go +++ b/pkg/volume/vsphere_volume/vsphere_volume.go @@ -32,7 +32,6 @@ import ( "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumehelper" - "k8s.io/utils/exec" ) // This is the primary entrypoint for volume plugins. @@ -116,7 +115,7 @@ func (plugin *vsphereVolumePlugin) newMounterInternal(spec *volume.Spec, podUID plugin: plugin, }, fsType: fsType, - diskMounter: &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()}}, nil + diskMounter: volumehelper.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host)}, nil } func (plugin *vsphereVolumePlugin) newUnmounterInternal(volName string, podUID types.UID, manager vdManager, mounter mount.Interface) (volume.Unmounter, error) { From 046a6ce6bb01d432991aac1759f6ee903b4b253b Mon Sep 17 00:00:00 2001 From: John Millikin Date: Mon, 14 Aug 2017 09:50:42 -0700 Subject: [PATCH 039/403] Use `select` to disable building static binaries if `--cpu=darwin`. This change allows kubectl to be built on MacOS machines using `bazel build //cmd/kubectl`. Mac OS X doesn't support static binaries because it does not have a stable syscall API. Userspace binaries are expected to dynamically link against libcrt instead. https://developer.apple.com/library/content/qa/qa1118/_index.html --- cmd/kubectl/BUILD | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/cmd/kubectl/BUILD b/cmd/kubectl/BUILD index da36e7fcb0f6f..a4c15004d4322 100644 --- a/cmd/kubectl/BUILD +++ b/cmd/kubectl/BUILD @@ -7,12 +7,17 @@ load("//pkg/version:def.bzl", "version_x_defs") go_binary( name = "kubectl", - gc_linkopts = [ - "-linkmode", - "external", - "-extldflags", - "-static", - ], + gc_linkopts = select({ + # Mac OS X doesn't support static binaries: + # https://developer.apple.com/library/content/qa/qa1118/_index.html + "@io_bazel_rules_go//go/platform:darwin_amd64": [], + "//conditions:default": [ + "-linkmode", + "external", + "-extldflags", + "-static", + ], + }), library = ":go_default_library", visibility = [ "//build/visible_to:COMMON_release", From ceb33bde29f54a33a6d51efdb3a8669023d31f02 Mon Sep 17 00:00:00 2001 From: Ricky Pai Date: Mon, 14 Aug 2017 14:37:27 -0700 Subject: [PATCH 040/403] refactor entries added by hostAlias into a separate method and be explicit about the source --- pkg/kubelet/kubelet_pods.go | 13 +++++++++++++ pkg/kubelet/kubelet_pods_test.go | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index c7588e30f91b5..34847d8488311 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -266,6 +266,19 @@ func managedHostsFileContent(hostIP, hostName, hostDomainName string, hostAliase } else { buffer.WriteString(fmt.Sprintf("%s\t%s\n", hostIP, hostName)) } + hostsFileContent := buffer.Bytes() + hostsFileContent = append(hostsFileContent, hostsEntriesFromHostAliases(hostAliases)...) + return hostsFileContent +} + +func hostsEntriesFromHostAliases(hostAliases []v1.HostAlias) []byte { + if len(hostAliases) == 0 { + return []byte{} + } + + var buffer bytes.Buffer + buffer.WriteString("\n") + buffer.WriteString("# Entries added by HostAliases.\n") // write each IP/hostname pair as an entry into hosts file for _, hostAlias := range hostAliases { for _, hostname := range hostAlias.Hostnames { diff --git a/pkg/kubelet/kubelet_pods_test.go b/pkg/kubelet/kubelet_pods_test.go index eb9558706ae2f..83a48fde14340 100644 --- a/pkg/kubelet/kubelet_pods_test.go +++ b/pkg/kubelet/kubelet_pods_test.go @@ -287,6 +287,8 @@ fe00::0 ip6-mcastprefix fe00::1 ip6-allnodes fe00::2 ip6-allrouters 203.0.113.1 podFoo.domainFoo podFoo + +# Entries added by HostAliases. 123.45.67.89 foo 123.45.67.89 bar 123.45.67.89 baz @@ -308,6 +310,8 @@ fe00::0 ip6-mcastprefix fe00::1 ip6-allnodes fe00::2 ip6-allrouters 203.0.113.1 podFoo.domainFoo podFoo + +# Entries added by HostAliases. 123.45.67.89 foo 123.45.67.89 bar 123.45.67.89 baz From 4edd92f26d812c2bc7b7442e6a553ca3f60a4a8e Mon Sep 17 00:00:00 2001 From: Ricky Pai Date: Mon, 14 Aug 2017 14:44:21 -0700 Subject: [PATCH 041/403] add HostAlias support for HostNetwork pods --- pkg/kubelet/kubelet_pods.go | 11 +++- pkg/kubelet/kubelet_pods_test.go | 94 ++++++++++++++++++++++++++++++-- 2 files changed, 97 insertions(+), 8 deletions(-) diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index 34847d8488311..11a65313a6626 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -233,7 +233,7 @@ func ensureHostsFile(fileName, hostIP, hostName, hostDomainName string, hostAlia // if Pod is using host network, read hosts file from the node's filesystem. // `etcHostsPath` references the location of the hosts file on the node. // `/etc/hosts` for *nix systems. - hostsFileContent, err = nodeHostsFileContent(etcHostsPath) + hostsFileContent, err = nodeHostsFileContent(etcHostsPath, hostAliases) if err != nil { return err } @@ -246,8 +246,13 @@ func ensureHostsFile(fileName, hostIP, hostName, hostDomainName string, hostAlia } // nodeHostsFileContent reads the content of node's hosts file. -func nodeHostsFileContent(hostsFilePath string) ([]byte, error) { - return ioutil.ReadFile(hostsFilePath) +func nodeHostsFileContent(hostsFilePath string, hostAliases []v1.HostAlias) ([]byte, error) { + hostsFileContent, err := ioutil.ReadFile(hostsFilePath) + if err != nil { + return nil, err + } + hostsFileContent = append(hostsFileContent, hostsEntriesFromHostAliases(hostAliases)...) + return hostsFileContent, nil } // managedHostsFileContent generates the content of the managed etc hosts based on Pod IP and other diff --git a/pkg/kubelet/kubelet_pods_test.go b/pkg/kubelet/kubelet_pods_test.go index 83a48fde14340..413f266b84c78 100644 --- a/pkg/kubelet/kubelet_pods_test.go +++ b/pkg/kubelet/kubelet_pods_test.go @@ -184,11 +184,23 @@ func TestMakeMounts(t *testing.T) { func TestNodeHostsFileContent(t *testing.T) { testCases := []struct { - hostsFileName string - expectedContent string + hostsFileName string + hostAliases []v1.HostAlias + rawHostsFileContent string + expectedHostsFileContent string }{ { "hosts_test_file1", + []v1.HostAlias{}, + `# hosts file for testing. +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +fe00::0 ip6-mcastprefix +fe00::1 ip6-allnodes +fe00::2 ip6-allrouters +123.45.67.89 some.domain +`, `# hosts file for testing. 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback @@ -201,6 +213,70 @@ fe00::2 ip6-allrouters }, { "hosts_test_file2", + []v1.HostAlias{}, + `# another hosts file for testing. +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +fe00::0 ip6-mcastprefix +fe00::1 ip6-allnodes +fe00::2 ip6-allrouters +12.34.56.78 another.domain +`, + `# another hosts file for testing. +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +fe00::0 ip6-mcastprefix +fe00::1 ip6-allnodes +fe00::2 ip6-allrouters +12.34.56.78 another.domain +`, + }, + { + "hosts_test_file1_with_host_aliases", + []v1.HostAlias{ + {IP: "123.45.67.89", Hostnames: []string{"foo", "bar", "baz"}}, + }, + `# hosts file for testing. +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +fe00::0 ip6-mcastprefix +fe00::1 ip6-allnodes +fe00::2 ip6-allrouters +123.45.67.89 some.domain +`, + `# hosts file for testing. +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +fe00::0 ip6-mcastprefix +fe00::1 ip6-allnodes +fe00::2 ip6-allrouters +123.45.67.89 some.domain + +# Entries added by HostAliases. +123.45.67.89 foo +123.45.67.89 bar +123.45.67.89 baz +`, + }, + { + "hosts_test_file2_with_host_aliases", + []v1.HostAlias{ + {IP: "123.45.67.89", Hostnames: []string{"foo", "bar", "baz"}}, + {IP: "456.78.90.123", Hostnames: []string{"park", "doo", "boo"}}, + }, + `# another hosts file for testing. +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +fe00::0 ip6-mcastprefix +fe00::1 ip6-allnodes +fe00::2 ip6-allrouters +12.34.56.78 another.domain +`, `# another hosts file for testing. 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback @@ -209,18 +285,26 @@ fe00::0 ip6-mcastprefix fe00::1 ip6-allnodes fe00::2 ip6-allrouters 12.34.56.78 another.domain + +# Entries added by HostAliases. +123.45.67.89 foo +123.45.67.89 bar +123.45.67.89 baz +456.78.90.123 park +456.78.90.123 doo +456.78.90.123 boo `, }, } for _, testCase := range testCases { - tmpdir, err := writeHostsFile(testCase.hostsFileName, testCase.expectedContent) + tmpdir, err := writeHostsFile(testCase.hostsFileName, testCase.rawHostsFileContent) require.NoError(t, err, "could not create a temp hosts file") defer os.RemoveAll(tmpdir) - actualContent, fileReadErr := nodeHostsFileContent(filepath.Join(tmpdir, testCase.hostsFileName)) + actualContent, fileReadErr := nodeHostsFileContent(filepath.Join(tmpdir, testCase.hostsFileName), testCase.hostAliases) require.NoError(t, fileReadErr, "could not create read hosts file") - assert.Equal(t, testCase.expectedContent, string(actualContent), "hosts file content not expected") + assert.Equal(t, testCase.expectedHostsFileContent, string(actualContent), "hosts file content not expected") } } From 1e7c0a4b0c15c1fd1dbdccd587da42eb587f47a9 Mon Sep 17 00:00:00 2001 From: Ricky Pai Date: Mon, 14 Aug 2017 15:39:14 -0700 Subject: [PATCH 042/403] remove validation disallowing hostAlias with hostNetwork --- pkg/api/validation/validation.go | 11 ----------- pkg/api/validation/validation_test.go | 17 ++++++++++------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index b160c0110c1f8..7283cfca52206 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -2067,16 +2067,6 @@ func validateHostNetwork(hostNetwork bool, containers []api.Container, fldPath * return allErrors } -func validateHostNetworkNoHostAliases(hostNetwork bool, hostAliases []api.HostAlias, fldPath *field.Path) field.ErrorList { - allErrors := field.ErrorList{} - if hostNetwork { - if len(hostAliases) > 0 { - allErrors = append(allErrors, field.Forbidden(fldPath, "may not be set when `hostNetwork` is true")) - } - } - return allErrors -} - // validateImagePullSecrets checks to make sure the pull secrets are well // formed. Right now, we only expect name to be set (it's the only field). If // this ever changes and someone decides to set those fields, we'd like to @@ -2620,7 +2610,6 @@ func ValidatePodSecurityContext(securityContext *api.PodSecurityContext, spec *a if securityContext != nil { allErrs = append(allErrs, validateHostNetwork(securityContext.HostNetwork, spec.Containers, specPath.Child("containers"))...) - allErrs = append(allErrs, validateHostNetworkNoHostAliases(securityContext.HostNetwork, spec.HostAliases, specPath)...) if securityContext.FSGroup != nil { for _, msg := range validation.IsValidGroupID(*securityContext.FSGroup) { allErrs = append(allErrs, field.Invalid(fldPath.Child("fsGroup"), *(securityContext.FSGroup), msg)) diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index a849df8445fc9..5be6f56a061e4 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -3844,13 +3844,22 @@ func TestValidatePodSpec(t *testing.T) { RestartPolicy: api.RestartPolicyAlways, DNSPolicy: api.DNSClusterFirst, }, - { // Populate HostAliases with `foo.bar` hostnames . + { // Populate HostAliases with `foo.bar` hostnames. HostAliases: []api.HostAlias{{IP: "12.34.56.78", Hostnames: []string{"host1.foo", "host2.bar"}}}, Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File"}}, RestartPolicy: api.RestartPolicyAlways, DNSPolicy: api.DNSClusterFirst, }, + { // Populate HostAliases with HostNetwork. + HostAliases: []api.HostAlias{{IP: "12.34.56.78", Hostnames: []string{"host1.foo", "host2.bar"}}}, + Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File"}}, + SecurityContext: &api.PodSecurityContext{ + HostNetwork: true, + }, + RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: api.DNSClusterFirst, + }, { // Populate PriorityClassName. Volumes: []api.Volume{{Name: "vol", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}}, Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File"}}, @@ -3923,12 +3932,6 @@ func TestValidatePodSpec(t *testing.T) { RestartPolicy: api.RestartPolicyAlways, DNSPolicy: api.DNSClusterFirst, }, - "with hostNetwork and hostAliases": { - SecurityContext: &api.PodSecurityContext{ - HostNetwork: true, - }, - HostAliases: []api.HostAlias{{IP: "12.34.56.78", Hostnames: []string{"host1", "host2"}}}, - }, "with hostAliases with invalid IP": { SecurityContext: &api.PodSecurityContext{ HostNetwork: false, From 411cbd03e90e320542ea18367736c30904b481f7 Mon Sep 17 00:00:00 2001 From: Gavin Date: Wed, 9 Aug 2017 17:25:50 +0800 Subject: [PATCH 043/403] Move taints e2e test to sig-scheduling delete taints_test file update BUILD fix confict --- test/e2e/BUILD | 15 +-------------- test/e2e/scheduling/BUILD | 21 +++++++++++++++++++++ test/e2e/{ => scheduling}/taints_test.go | 4 ++-- 3 files changed, 24 insertions(+), 16 deletions(-) rename test/e2e/{ => scheduling}/taints_test.go (99%) diff --git a/test/e2e/BUILD b/test/e2e/BUILD index 9cf0abb35c978..365c659744468 100644 --- a/test/e2e/BUILD +++ b/test/e2e/BUILD @@ -8,10 +8,7 @@ load( go_test( name = "go_default_test", - srcs = [ - "e2e_test.go", - "taints_test.go", - ], + srcs = ["e2e_test.go"], library = ":go_default_library", deps = [ "//test/e2e/apimachinery:go_default_library", @@ -29,16 +26,6 @@ go_test( "//test/e2e/scalability:go_default_library", "//test/e2e/scheduling:go_default_library", "//test/e2e/storage:go_default_library", - "//test/utils:go_default_library", - "//vendor/github.com/onsi/ginkgo:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/test/e2e/scheduling/BUILD b/test/e2e/scheduling/BUILD index fbec227aa5bba..c39f21b35a1c5 100644 --- a/test/e2e/scheduling/BUILD +++ b/test/e2e/scheduling/BUILD @@ -3,6 +3,7 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( @@ -56,3 +57,23 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["taints_test.go"], + library = ":go_default_library", + tags = ["automanaged"], + deps = [ + "//test/e2e/framework:go_default_library", + "//test/utils:go_default_library", + "//vendor/github.com/onsi/ginkgo:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + ], +) diff --git a/test/e2e/taints_test.go b/test/e2e/scheduling/taints_test.go similarity index 99% rename from test/e2e/taints_test.go rename to test/e2e/scheduling/taints_test.go index e00638c046cb5..72dd80a6f14a3 100644 --- a/test/e2e/taints_test.go +++ b/test/e2e/scheduling/taints_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package e2e +package scheduling import ( "time" @@ -144,7 +144,7 @@ const ( // - lack of eviction of tolerating pods from a tainted node, // - delayed eviction of short-tolerating pod from a tainted node, // - lack of eviction of short-tolerating pod after taint removal. -var _ = framework.KubeDescribe("NoExecuteTaintManager [Serial]", func() { +var _ = SIGDescribe("NoExecuteTaintManager [Serial]", func() { var cs clientset.Interface var nodeList *v1.NodeList var ns string From c87d42763d145ecdc39235328f43d20d54731593 Mon Sep 17 00:00:00 2001 From: zhangjie Date: Tue, 15 Aug 2017 16:14:44 +0800 Subject: [PATCH 044/403] Modify the initialization of results in generic_scheduler.go Signed-off-by: zhangjie --- plugin/pkg/scheduler/core/generic_scheduler.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugin/pkg/scheduler/core/generic_scheduler.go b/plugin/pkg/scheduler/core/generic_scheduler.go index 9e882ef9ec5cb..984c783b90987 100644 --- a/plugin/pkg/scheduler/core/generic_scheduler.go +++ b/plugin/pkg/scheduler/core/generic_scheduler.go @@ -315,10 +315,8 @@ func PrioritizeNodes( errs = append(errs, err) } - results := make([]schedulerapi.HostPriorityList, 0, len(priorityConfigs)) - for range priorityConfigs { - results = append(results, nil) - } + results := make([]schedulerapi.HostPriorityList, len(priorityConfigs), len(priorityConfigs)) + for i, priorityConfig := range priorityConfigs { if priorityConfig.Function != nil { // DEPRECATED From 63725e3e3c69737c8afbc43cdcf0a6ebec3ec292 Mon Sep 17 00:00:00 2001 From: FengyunPan Date: Tue, 15 Aug 2017 16:42:11 +0800 Subject: [PATCH 045/403] Mark the volumes as detached when node does not exist If node doesn't exist, OpenStack Nova will assume the volumes are not attached to it. So mark the volumes as detached and return false without error. Fix: #50200 --- .../providers/openstack/openstack_instances.go | 3 +++ pkg/volume/cinder/attacher.go | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/pkg/cloudprovider/providers/openstack/openstack_instances.go b/pkg/cloudprovider/providers/openstack/openstack_instances.go index 70f29ff7bd0da..2f44527d6fec0 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_instances.go +++ b/pkg/cloudprovider/providers/openstack/openstack_instances.go @@ -157,6 +157,9 @@ func (os *OpenStack) InstanceID() (string, error) { func (i *Instances) InstanceID(name types.NodeName) (string, error) { srv, err := getServerByName(i.compute, name) if err != nil { + if err == ErrNotFound { + return "", cloudprovider.InstanceNotFound + } return "", err } // In the future it is possible to also return an endpoint as: diff --git a/pkg/volume/cinder/attacher.go b/pkg/volume/cinder/attacher.go index 901876d16b885..ecac8629fe9a4 100644 --- a/pkg/volume/cinder/attacher.go +++ b/pkg/volume/cinder/attacher.go @@ -26,6 +26,7 @@ import ( "github.com/golang/glog" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumeutil "k8s.io/kubernetes/pkg/volume/util" @@ -186,6 +187,17 @@ func (attacher *cinderDiskAttacher) VolumesAreAttached(specs []*volume.Spec, nod instanceID, err := attacher.nodeInstanceID(nodeName) if err != nil { + if err == cloudprovider.InstanceNotFound { + // If node doesn't exist, OpenStack Nova will assume the volumes are not attached to it. + // Mark the volumes as detached and return false without error. + glog.Warningf("VolumesAreAttached: node %q does not exist.", nodeName) + for spec := range volumesAttachedCheck { + volumesAttachedCheck[spec] = false + } + + return volumesAttachedCheck, nil + } + return volumesAttachedCheck, err } From d9c9d1bbdc5b56e841c198916f347b418288dc0a Mon Sep 17 00:00:00 2001 From: riverzhang Date: Tue, 15 Aug 2017 04:16:20 -0500 Subject: [PATCH 046/403] fix some typo --- pkg/volume/cephfs/cephfs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/volume/cephfs/cephfs.go b/pkg/volume/cephfs/cephfs.go index f59a053863a3f..1cae08666e1f8 100644 --- a/pkg/volume/cephfs/cephfs.go +++ b/pkg/volume/cephfs/cephfs.go @@ -260,7 +260,7 @@ func (cephfsVolume *cephfsUnmounter) TearDownAt(dir string) error { return util.UnmountPath(dir, cephfsVolume.mounter) } -// GetPath creates global mount path +// GetPath global mount path func (cephfsVolume *cephfs) GetPath() string { name := cephfsPluginName return cephfsVolume.plugin.host.GetPodVolumeDir(cephfsVolume.podUID, utilstrings.EscapeQualifiedNameForDisk(name), cephfsVolume.volName) From b35df24cbc9679b83b5382468772f19ce018937d Mon Sep 17 00:00:00 2001 From: riverzhang Date: Tue, 15 Aug 2017 04:19:01 -0500 Subject: [PATCH 047/403] fix some typo --- pkg/volume/cephfs/cephfs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/volume/cephfs/cephfs.go b/pkg/volume/cephfs/cephfs.go index 1cae08666e1f8..f59a053863a3f 100644 --- a/pkg/volume/cephfs/cephfs.go +++ b/pkg/volume/cephfs/cephfs.go @@ -260,7 +260,7 @@ func (cephfsVolume *cephfsUnmounter) TearDownAt(dir string) error { return util.UnmountPath(dir, cephfsVolume.mounter) } -// GetPath global mount path +// GetPath creates global mount path func (cephfsVolume *cephfs) GetPath() string { name := cephfsPluginName return cephfsVolume.plugin.host.GetPodVolumeDir(cephfsVolume.podUID, utilstrings.EscapeQualifiedNameForDisk(name), cephfsVolume.volName) From 568d809b24a012adeca8dc9c626a8e8be451a833 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Thu, 10 Aug 2017 16:19:13 +0800 Subject: [PATCH 048/403] kubectl show node role if defined --- pkg/printers/internalversion/BUILD | 1 - pkg/printers/internalversion/printers.go | 29 +++++++++++++++---- pkg/printers/internalversion/printers_test.go | 20 ++++++++++++- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/pkg/printers/internalversion/BUILD b/pkg/printers/internalversion/BUILD index 6d5281bd171d1..fa0ad5d66b021 100644 --- a/pkg/printers/internalversion/BUILD +++ b/pkg/printers/internalversion/BUILD @@ -55,7 +55,6 @@ go_library( "printers.go", ], deps = [ - "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//federation/apis/federation:go_default_library", "//federation/apis/federation/v1beta1:go_default_library", "//federation/client/clientset_generated/federation_clientset:go_default_library", diff --git a/pkg/printers/internalversion/printers.go b/pkg/printers/internalversion/printers.go index b03865813882f..bdd17c3c8041f 100644 --- a/pkg/printers/internalversion/printers.go +++ b/pkg/printers/internalversion/printers.go @@ -41,7 +41,6 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/events" @@ -60,7 +59,20 @@ import ( "k8s.io/kubernetes/pkg/util/node" ) -const loadBalancerWidth = 16 +const ( + loadBalancerWidth = 16 + + // LabelNodeRoleMaster specifies that a node is a master + // It's copied over to here until it's merged in core: https://github.com/kubernetes/kubernetes/pull/39112 + LabelNodeRoleMaster = "node-role.kubernetes.io/master" + + // NodeLabelRole specifies the role of a node + NodeLabelRole = "kubernetes.io/role" + + // NodeLabelKubeadmAlphaRole is a label that kubeadm applies to a Node as a hint that it has a particular purpose. + // Use of NodeLabelRole is preferred. + NodeLabelKubeadmAlphaRole = "kubeadm.alpha.kubernetes.io/role" +) // AddHandlers adds print handlers for default Kubernetes types dealing with internal versions. // TODO: handle errors from Handler @@ -1193,14 +1205,19 @@ func getNodeExternalIP(node *api.Node) string { // findNodeRole returns the role of a given node, or "" if none found. // The role is determined by looking in order for: +// * a node-role.kubernetes.io/master label // * a kubernetes.io/role label // * a kubeadm.alpha.kubernetes.io/role label -// If no role is found, ("", nil) is returned func findNodeRole(node *api.Node) string { - if role := node.Labels[kubeadm.NodeLabelKubeadmAlphaRole]; role != "" { - return role + if _, ok := node.Labels[LabelNodeRoleMaster]; ok { + return "Master" + } + if role := node.Labels[NodeLabelRole]; role != "" { + return strings.Title(role) + } + if role := node.Labels[NodeLabelKubeadmAlphaRole]; role != "" { + return strings.Title(role) } - // No role found return "" } diff --git a/pkg/printers/internalversion/printers_test.go b/pkg/printers/internalversion/printers_test.go index 701e9678f2a19..b3909b0a2ed21 100644 --- a/pkg/printers/internalversion/printers_test.go +++ b/pkg/printers/internalversion/printers_test.go @@ -825,6 +825,24 @@ func TestPrintNodeStatus(t *testing.T) { }, status: "Unknown,SchedulingDisabled", }, + { + node: api.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo10", + Labels: map[string]string{"node-role.kubernetes.io/master": "", "kubernetes.io/role": "node", "kubeadm.alpha.kubernetes.io/role": "node"}, + }, + }, + status: "Unknown,Master", + }, + { + node: api.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo11", + Labels: map[string]string{"kubernetes.io/role": "node", "kubeadm.alpha.kubernetes.io/role": "node"}, + }, + }, + status: "Unknown,Node", + }, { node: api.Node{ ObjectMeta: metav1.ObjectMeta{ @@ -833,7 +851,7 @@ func TestPrintNodeStatus(t *testing.T) { }, Status: api.NodeStatus{Conditions: []api.NodeCondition{{Type: api.NodeReady, Status: api.ConditionTrue}}}, }, - status: "Ready,node", + status: "Ready,Node", }, } From 6ee6b177197ff197fb7aed0d754e11829ff3d229 Mon Sep 17 00:00:00 2001 From: xiangpengzhao Date: Tue, 15 Aug 2017 20:03:11 +0800 Subject: [PATCH 049/403] Remove deprecated lookup cache flags. --- cmd/kube-controller-manager/app/options/options.go | 12 ------------ pkg/apis/componentconfig/types.go | 13 ------------- 2 files changed, 25 deletions(-) diff --git a/cmd/kube-controller-manager/app/options/options.go b/cmd/kube-controller-manager/app/options/options.go index 5b834261fa74d..e5acccd066b6b 100644 --- a/cmd/kube-controller-manager/app/options/options.go +++ b/cmd/kube-controller-manager/app/options/options.go @@ -69,9 +69,6 @@ func NewCMServer() *CMServer { ConcurrentDeploymentSyncs: 5, ConcurrentNamespaceSyncs: 10, ConcurrentSATokenSyncs: 5, - LookupCacheSizeForRC: 4096, - LookupCacheSizeForRS: 4096, - LookupCacheSizeForDaemonSet: 1024, ServiceSyncPeriod: metav1.Duration{Duration: 5 * time.Minute}, RouteReconciliationPeriod: metav1.Duration{Duration: 10 * time.Second}, ResourceQuotaSyncPeriod: metav1.Duration{Duration: 5 * time.Minute}, @@ -144,15 +141,6 @@ func (s *CMServer) AddFlags(fs *pflag.FlagSet, allControllers []string, disabled fs.Int32Var(&s.ConcurrentDeploymentSyncs, "concurrent-deployment-syncs", s.ConcurrentDeploymentSyncs, "The number of deployment objects that are allowed to sync concurrently. Larger number = more responsive deployments, but more CPU (and network) load") fs.Int32Var(&s.ConcurrentNamespaceSyncs, "concurrent-namespace-syncs", s.ConcurrentNamespaceSyncs, "The number of namespace objects that are allowed to sync concurrently. Larger number = more responsive namespace termination, but more CPU (and network) load") fs.Int32Var(&s.ConcurrentSATokenSyncs, "concurrent-serviceaccount-token-syncs", s.ConcurrentSATokenSyncs, "The number of service account token objects that are allowed to sync concurrently. Larger number = more responsive token generation, but more CPU (and network) load") - // TODO(#43388): Remove the following flag 6 months after v1.6.0 is released. - fs.Int32Var(&s.LookupCacheSizeForRC, "replication-controller-lookup-cache-size", s.LookupCacheSizeForRC, "This flag is deprecated and will be removed in future releases. ReplicationController no longer requires a lookup cache.") - fs.MarkDeprecated("replication-controller-lookup-cache-size", "This flag is deprecated and will be removed in future releases. ReplicationController no longer requires a lookup cache.") - // TODO(#43388): Remove the following flag 6 months after v1.6.0 is released. - fs.Int32Var(&s.LookupCacheSizeForRS, "replicaset-lookup-cache-size", s.LookupCacheSizeForRS, "This flag is deprecated and will be removed in future releases. ReplicaSet no longer requires a lookup cache.") - fs.MarkDeprecated("replicaset-lookup-cache-size", "This flag is deprecated and will be removed in future releases. ReplicaSet no longer requires a lookup cache.") - // TODO(#43388): Remove the following flag 6 months after v1.6.0 is released. - fs.Int32Var(&s.LookupCacheSizeForDaemonSet, "daemonset-lookup-cache-size", s.LookupCacheSizeForDaemonSet, "This flag is deprecated and will be removed in future releases. DaemonSet no longer requires a lookup cache.") - fs.MarkDeprecated("daemonset-lookup-cache-size", "This flag is deprecated and will be removed in future releases. DaemonSet no longer requires a lookup cache.") fs.DurationVar(&s.ServiceSyncPeriod.Duration, "service-sync-period", s.ServiceSyncPeriod.Duration, "The period for syncing services with their external load balancers") fs.DurationVar(&s.NodeSyncPeriod.Duration, "node-sync-period", 0, ""+ "This flag is deprecated and will be removed in future releases. See node-monitor-period for Node health checking or "+ diff --git a/pkg/apis/componentconfig/types.go b/pkg/apis/componentconfig/types.go index 4e4d5e1c1e67c..8b9d429320717 100644 --- a/pkg/apis/componentconfig/types.go +++ b/pkg/apis/componentconfig/types.go @@ -711,19 +711,6 @@ type KubeControllerManagerConfiguration struct { ConcurrentSATokenSyncs int32 // lookupCacheSizeForRC is the size of lookup cache for replication controllers. // Larger number = more responsive replica management, but more MEM load. - // TODO(#43388): Remove the following flag 6 months after v1.6.0 is released. - // DEPRECATED: This is no longer used. - LookupCacheSizeForRC int32 - // lookupCacheSizeForRS is the size of lookup cache for replicatsets. - // Larger number = more responsive replica management, but more MEM load. - // TODO(#43388): Remove the following flag 6 months after v1.6.0 is released. - // DEPRECATED: This is no longer used. - LookupCacheSizeForRS int32 - // lookupCacheSizeForDaemonSet is the size of lookup cache for daemonsets. - // Larger number = more responsive daemonset, but more MEM load. - // TODO(#43388): Remove the following flag 6 months after v1.6.0 is released. - // DEPRECATED: This is no longer used. - LookupCacheSizeForDaemonSet int32 // serviceSyncPeriod is the period for syncing services with their external // load balancers. ServiceSyncPeriod metav1.Duration From 5497b32865b3ffbc23b366e442606da5c5437431 Mon Sep 17 00:00:00 2001 From: allencloud Date: Tue, 15 Aug 2017 23:00:36 +0800 Subject: [PATCH 050/403] fix two typos in quobyte error message Signed-off-by: allencloud --- pkg/volume/quobyte/quobyte.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/volume/quobyte/quobyte.go b/pkg/volume/quobyte/quobyte.go index a63d952aa28d9..244b26b490ea7 100644 --- a/pkg/volume/quobyte/quobyte.go +++ b/pkg/volume/quobyte/quobyte.go @@ -395,7 +395,7 @@ func (provisioner *quobyteVolumeProvisioner) Provision() (*v1.PersistentVolume, } if !validateRegistry(provisioner.registry) { - return nil, fmt.Errorf("Quoybte registry missing or malformed: must be a host:port pair or multiple pairs separated by commas") + return nil, fmt.Errorf("Quobyte registry missing or malformed: must be a host:port pair or multiple pairs separated by commas") } // create random image name @@ -465,7 +465,7 @@ func parseAPIConfig(plugin *quobytePlugin, params map[string]string) (*quobyteAP } if len(apiServer) == 0 { - return nil, fmt.Errorf("Quoybte API server missing or malformed: must be a http(s)://host:port pair or multiple pairs separated by commas") + return nil, fmt.Errorf("Quobyte API server missing or malformed: must be a http(s)://host:port pair or multiple pairs separated by commas") } secretMap, err := util.GetSecretForPV(secretNamespace, secretName, quobytePluginName, plugin.host.GetKubeClient()) From 7654e6a9d65fc3890da620c3ba4a30143bc7e7ca Mon Sep 17 00:00:00 2001 From: Zihong Zheng Date: Tue, 15 Aug 2017 13:50:02 -0700 Subject: [PATCH 051/403] Dump installation and configuration logs for master --- cluster/log-dump/log-dump.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cluster/log-dump/log-dump.sh b/cluster/log-dump/log-dump.sh index 537e548a52870..4515a6119dcd3 100755 --- a/cluster/log-dump/log-dump.sh +++ b/cluster/log-dump/log-dump.sh @@ -121,12 +121,15 @@ function copy-logs-from-node() { # Save logs for node $1 into directory $2. Pass in any non-common files in $3. # Pass in any non-common systemd services in $4. # $3 and $4 should be a space-separated list of files. +# Set $5 to true to indicate it is on master. Default to false. # This function shouldn't ever trigger errexit function save-logs() { local -r node_name="${1}" local -r dir="${2}" local files="${3}" local opt_systemd_services="${4:-""}" + local on_master="${5:-"false"}" + if [[ -n "${use_custom_instance_list}" ]]; then if [[ -n "${LOG_DUMP_SAVE_LOGS:-}" ]]; then files="${files} ${LOG_DUMP_SAVE_LOGS:-}" @@ -147,8 +150,13 @@ function save-logs() { local -r services=( ${systemd_services} ${opt_systemd_services} ${LOG_DUMP_SAVE_SERVICES:-} ) if log-dump-ssh "${node_name}" "command -v journalctl" &> /dev/null; then - log-dump-ssh "${node_name}" "sudo journalctl --output=short-precise -u kube-node-installation.service" > "${dir}/kube-node-installation.log" || true - log-dump-ssh "${node_name}" "sudo journalctl --output=short-precise -u kube-node-configuration.service" > "${dir}/kube-node-configuration.log" || true + if [[ "${on_master}" == "true" ]]; then + log-dump-ssh "${node_name}" "sudo journalctl --output=short-precise -u kube-master-installation.service" > "${dir}/kube-master-installation.log" || true + log-dump-ssh "${node_name}" "sudo journalctl --output=short-precise -u kube-master-configuration.service" > "${dir}/kube-master-configuration.log" || true + else + log-dump-ssh "${node_name}" "sudo journalctl --output=short-precise -u kube-node-installation.service" > "${dir}/kube-node-installation.log" || true + log-dump-ssh "${node_name}" "sudo journalctl --output=short-precise -u kube-node-configuration.service" > "${dir}/kube-node-configuration.log" || true + fi log-dump-ssh "${node_name}" "sudo journalctl --output=short-precise -k" > "${dir}/kern.log" || true for svc in "${services[@]}"; do @@ -189,7 +197,7 @@ function dump_masters() { for master_name in "${master_names[@]}"; do master_dir="${report_dir}/${master_name}" mkdir -p "${master_dir}" - save-logs "${master_name}" "${master_dir}" "${master_logfiles}" & + save-logs "${master_name}" "${master_dir}" "${master_logfiles}" "" "true" & # We don't want to run more than ${max_scp_processes} at a time, so # wait once we hit that many nodes. This isn't ideal, since one might From cbc116fa3c8961727ea73b1d93f552d7279ac55b Mon Sep 17 00:00:00 2001 From: Diego Pontoriero Date: Tue, 15 Aug 2017 12:09:41 -0700 Subject: [PATCH 052/403] Fix forkedjson.LookupPatchMetadata for pointers. The provided test case fails without the lines added to fields.go. --- .../third_party/forked/golang/json/BUILD | 7 +++++ .../third_party/forked/golang/json/fields.go | 3 ++ .../forked/golang/json/fields_test.go | 30 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 staging/src/k8s.io/apimachinery/third_party/forked/golang/json/fields_test.go diff --git a/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/BUILD b/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/BUILD index cf64e1f539a62..9754f28e93219 100644 --- a/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/BUILD +++ b/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/BUILD @@ -3,6 +3,7 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( @@ -10,6 +11,12 @@ go_library( srcs = ["fields.go"], ) +go_test( + name = "go_default_test", + srcs = ["fields_test.go"], + library = ":go_default_library", +) + filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/fields.go b/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/fields.go index ac6d9cb96b1d3..006972ecafd1f 100644 --- a/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/fields.go +++ b/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/fields.go @@ -28,6 +28,9 @@ const ( // TODO: fix the returned errors to be introspectable. func LookupPatchMetadata(t reflect.Type, jsonField string) ( elemType reflect.Type, patchStrategies []string, patchMergeKey string, e error) { + if t.Kind() == reflect.Ptr { + t = t.Elem() + } if t.Kind() == reflect.Map { elemType = t.Elem() return diff --git a/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/fields_test.go b/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/fields_test.go new file mode 100644 index 0000000000000..04d8cebd9b27a --- /dev/null +++ b/staging/src/k8s.io/apimachinery/third_party/forked/golang/json/fields_test.go @@ -0,0 +1,30 @@ +package json + +import ( + "reflect" + "testing" +) + +func TestLookupPtrToStruct(t *testing.T) { + type Elem struct { + Key string + Value string + } + type Outer struct { + Inner []Elem `json:"inner" patchStrategy:"merge" patchMergeKey:"key"` + } + outer := &Outer{} + elemType, patchStrategies, patchMergeKey, err := LookupPatchMetadata(reflect.TypeOf(outer), "inner") + if err != nil { + t.Fatal(err) + } + if elemType != reflect.TypeOf([]Elem{}) { + t.Errorf("elemType = %v, want: %v", elemType, reflect.TypeOf([]Elem{})) + } + if !reflect.DeepEqual(patchStrategies, []string{"merge"}) { + t.Errorf("patchStrategies = %v, want: %v", patchStrategies, []string{"merge"}) + } + if patchMergeKey != "key" { + t.Errorf("patchMergeKey = %v, want: %v", patchMergeKey, "key") + } +} From 720f041985a97d0645884b5a2e0f58ab4fb9951d Mon Sep 17 00:00:00 2001 From: crimsonfaith91 Date: Fri, 11 Aug 2017 14:10:53 -0700 Subject: [PATCH 053/403] mark created-by annotation as deprecated --- pkg/api/annotation_key_constants.go | 2 ++ staging/src/k8s.io/api/core/v1/annotation_key_constants.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/pkg/api/annotation_key_constants.go b/pkg/api/annotation_key_constants.go index 0d41438191fcc..e935424462b5a 100644 --- a/pkg/api/annotation_key_constants.go +++ b/pkg/api/annotation_key_constants.go @@ -47,6 +47,8 @@ const ( // CreatedByAnnotation represents the key used to store the spec(json) // used to create the resource. + // This field is deprecated in favor of ControllerRef (see #44407). + // TODO(#50720): Remove this field in v1.9. CreatedByAnnotation = "kubernetes.io/created-by" // PreferAvoidPodsAnnotationKey represents the key of preferAvoidPods data (json serialized) diff --git a/staging/src/k8s.io/api/core/v1/annotation_key_constants.go b/staging/src/k8s.io/api/core/v1/annotation_key_constants.go index 6c5deb65fd336..e623913fdd129 100644 --- a/staging/src/k8s.io/api/core/v1/annotation_key_constants.go +++ b/staging/src/k8s.io/api/core/v1/annotation_key_constants.go @@ -47,6 +47,8 @@ const ( // CreatedByAnnotation represents the key used to store the spec(json) // used to create the resource. + // This field is deprecated in favor of ControllerRef (see #44407). + // TODO(#50720): Remove this field in v1.9. CreatedByAnnotation = "kubernetes.io/created-by" // PreferAvoidPodsAnnotationKey represents the key of preferAvoidPods data (json serialized) From 1c4dbcf5ca206cecd52582463be36397008c327f Mon Sep 17 00:00:00 2001 From: xiangpengzhao Date: Tue, 15 Aug 2017 15:56:18 +0800 Subject: [PATCH 054/403] Replace hard-code "cpu" and "memory" to consts --- pkg/api/resource/helpers_test.go | 8 ++--- pkg/api/v1/resource/helpers_test.go | 8 ++--- pkg/kubelet/kubelet_test.go | 2 +- pkg/kubelet/preemption/preemption_test.go | 32 +++++++++---------- pkg/kubelet/rkt/rkt_test.go | 8 ++--- .../balanced_resource_allocation_test.go | 16 +++++----- .../priorities/least_requested_test.go | 16 +++++----- .../algorithm/priorities/metadata_test.go | 4 +-- .../priorities/most_requested_test.go | 24 +++++++------- .../algorithm/priorities/test_util.go | 8 ++--- .../scheduler/core/generic_scheduler_test.go | 16 +++++----- test/e2e/pods.go | 8 ++--- test/e2e/scheduling/predicates.go | 8 ++--- test/e2e/scheduling/priorities.go | 12 +++---- test/e2e_node/allocatable_eviction_test.go | 2 +- test/e2e_node/benchmark_util.go | 5 +-- test/e2e_node/container_manager_test.go | 8 ++--- test/e2e_node/critical_pod_test.go | 12 +++---- test/e2e_node/memory_eviction_test.go | 14 ++++---- test/e2e_node/node_container_manager_test.go | 24 +++++++------- 20 files changed, 116 insertions(+), 119 deletions(-) diff --git a/pkg/api/resource/helpers_test.go b/pkg/api/resource/helpers_test.go index fbcc3688b60c8..cab00528709f7 100644 --- a/pkg/api/resource/helpers_test.go +++ b/pkg/api/resource/helpers_test.go @@ -30,9 +30,8 @@ func TestResourceHelpers(t *testing.T) { memoryLimit := resource.MustParse("10G") resourceSpec := api.ResourceRequirements{ Limits: api.ResourceList{ - "cpu": cpuLimit, - "memory": memoryLimit, - "kube.io/storage": memoryLimit, + api.ResourceCPU: cpuLimit, + api.ResourceMemory: memoryLimit, }, } if res := resourceSpec.Limits.Cpu(); res.Cmp(cpuLimit) != 0 { @@ -43,8 +42,7 @@ func TestResourceHelpers(t *testing.T) { } resourceSpec = api.ResourceRequirements{ Limits: api.ResourceList{ - "memory": memoryLimit, - "kube.io/storage": memoryLimit, + api.ResourceMemory: memoryLimit, }, } if res := resourceSpec.Limits.Cpu(); res.Value() != 0 { diff --git a/pkg/api/v1/resource/helpers_test.go b/pkg/api/v1/resource/helpers_test.go index 0cf00dd1f7b02..a0f41253f79c6 100644 --- a/pkg/api/v1/resource/helpers_test.go +++ b/pkg/api/v1/resource/helpers_test.go @@ -30,9 +30,8 @@ func TestResourceHelpers(t *testing.T) { memoryLimit := resource.MustParse("10G") resourceSpec := v1.ResourceRequirements{ Limits: v1.ResourceList{ - "cpu": cpuLimit, - "memory": memoryLimit, - "kube.io/storage": memoryLimit, + v1.ResourceCPU: cpuLimit, + v1.ResourceMemory: memoryLimit, }, } if res := resourceSpec.Limits.Cpu(); res.Cmp(cpuLimit) != 0 { @@ -43,8 +42,7 @@ func TestResourceHelpers(t *testing.T) { } resourceSpec = v1.ResourceRequirements{ Limits: v1.ResourceList{ - "memory": memoryLimit, - "kube.io/storage": memoryLimit, + v1.ResourceMemory: memoryLimit, }, } if res := resourceSpec.Limits.Cpu(); res.Value() != 0 { diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 657d304f438f1..b5a1ba0924b3c 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -563,7 +563,7 @@ func TestHandleMemExceeded(t *testing.T) { spec := v1.PodSpec{NodeName: string(kl.nodeName), Containers: []v1.Container{{Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "memory": resource.MustParse("90"), + v1.ResourceMemory: resource.MustParse("90"), }, }}}, } diff --git a/pkg/kubelet/preemption/preemption_test.go b/pkg/kubelet/preemption/preemption_test.go index fcd1950c360a0..331b4f72a5775 100644 --- a/pkg/kubelet/preemption/preemption_test.go +++ b/pkg/kubelet/preemption/preemption_test.go @@ -338,47 +338,47 @@ func getTestPods() map[string]*v1.Pod { allPods := map[string]*v1.Pod{ tinyBurstable: getPodWithResources(tinyBurstable, v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("1m"), - "memory": resource.MustParse("1Mi"), + v1.ResourceCPU: resource.MustParse("1m"), + v1.ResourceMemory: resource.MustParse("1Mi"), }, }), bestEffort: getPodWithResources(bestEffort, v1.ResourceRequirements{}), critical: getPodWithResources(critical, v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, }), burstable: getPodWithResources(burstable, v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, }), guaranteed: getPodWithResources(guaranteed, v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, Limits: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, }), highRequestBurstable: getPodWithResources(highRequestBurstable, v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("300m"), - "memory": resource.MustParse("300Mi"), + v1.ResourceCPU: resource.MustParse("300m"), + v1.ResourceMemory: resource.MustParse("300Mi"), }, }), highRequestGuaranteed: getPodWithResources(highRequestGuaranteed, v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("300m"), - "memory": resource.MustParse("300Mi"), + v1.ResourceCPU: resource.MustParse("300m"), + v1.ResourceMemory: resource.MustParse("300Mi"), }, Limits: v1.ResourceList{ - "cpu": resource.MustParse("300m"), - "memory": resource.MustParse("300Mi"), + v1.ResourceCPU: resource.MustParse("300m"), + v1.ResourceMemory: resource.MustParse("300Mi"), }, }), } diff --git a/pkg/kubelet/rkt/rkt_test.go b/pkg/kubelet/rkt/rkt_test.go index 9a1a7d75b3951..7dda72763bf0b 100644 --- a/pkg/kubelet/rkt/rkt_test.go +++ b/pkg/kubelet/rkt/rkt_test.go @@ -1073,8 +1073,8 @@ func TestSetApp(t *testing.T) { Command: []string{"/bin/bar", "$(env-bar)"}, WorkingDir: tmpDir, Resources: v1.ResourceRequirements{ - Limits: v1.ResourceList{"cpu": resource.MustParse("50m"), "memory": resource.MustParse("50M")}, - Requests: v1.ResourceList{"cpu": resource.MustParse("5m"), "memory": resource.MustParse("5M")}, + Limits: v1.ResourceList{v1.ResourceCPU: resource.MustParse("50m"), v1.ResourceMemory: resource.MustParse("50M")}, + Requests: v1.ResourceList{v1.ResourceCPU: resource.MustParse("5m"), v1.ResourceMemory: resource.MustParse("5M")}, }, }, mountPoints: []appctypes.MountPoint{ @@ -1137,8 +1137,8 @@ func TestSetApp(t *testing.T) { Args: []string{"hello", "world", "$(env-bar)"}, WorkingDir: tmpDir, Resources: v1.ResourceRequirements{ - Limits: v1.ResourceList{"cpu": resource.MustParse("50m")}, - Requests: v1.ResourceList{"memory": resource.MustParse("5M")}, + Limits: v1.ResourceList{v1.ResourceCPU: resource.MustParse("50m")}, + Requests: v1.ResourceList{v1.ResourceMemory: resource.MustParse("5M")}, }, }, mountPoints: []appctypes.MountPoint{ diff --git a/plugin/pkg/scheduler/algorithm/priorities/balanced_resource_allocation_test.go b/plugin/pkg/scheduler/algorithm/priorities/balanced_resource_allocation_test.go index 09a4afd9bf5a7..777be1b14991f 100644 --- a/plugin/pkg/scheduler/algorithm/priorities/balanced_resource_allocation_test.go +++ b/plugin/pkg/scheduler/algorithm/priorities/balanced_resource_allocation_test.go @@ -51,16 +51,16 @@ func TestBalancedResourceAllocation(t *testing.T) { { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("1000m"), - "memory": resource.MustParse("0"), + v1.ResourceCPU: resource.MustParse("1000m"), + v1.ResourceMemory: resource.MustParse("0"), }, }, }, { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("2000m"), - "memory": resource.MustParse("0"), + v1.ResourceCPU: resource.MustParse("2000m"), + v1.ResourceMemory: resource.MustParse("0"), }, }, }, @@ -74,16 +74,16 @@ func TestBalancedResourceAllocation(t *testing.T) { { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("1000m"), - "memory": resource.MustParse("2000"), + v1.ResourceCPU: resource.MustParse("1000m"), + v1.ResourceMemory: resource.MustParse("2000"), }, }, }, { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("2000m"), - "memory": resource.MustParse("3000"), + v1.ResourceCPU: resource.MustParse("2000m"), + v1.ResourceMemory: resource.MustParse("3000"), }, }, }, diff --git a/plugin/pkg/scheduler/algorithm/priorities/least_requested_test.go b/plugin/pkg/scheduler/algorithm/priorities/least_requested_test.go index 05afb586a1ebf..08e083361b43f 100644 --- a/plugin/pkg/scheduler/algorithm/priorities/least_requested_test.go +++ b/plugin/pkg/scheduler/algorithm/priorities/least_requested_test.go @@ -51,16 +51,16 @@ func TestLeastRequested(t *testing.T) { { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("1000m"), - "memory": resource.MustParse("0"), + v1.ResourceCPU: resource.MustParse("1000m"), + v1.ResourceMemory: resource.MustParse("0"), }, }, }, { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("2000m"), - "memory": resource.MustParse("0"), + v1.ResourceCPU: resource.MustParse("2000m"), + v1.ResourceMemory: resource.MustParse("0"), }, }, }, @@ -74,16 +74,16 @@ func TestLeastRequested(t *testing.T) { { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("1000m"), - "memory": resource.MustParse("2000"), + v1.ResourceCPU: resource.MustParse("1000m"), + v1.ResourceMemory: resource.MustParse("2000"), }, }, }, { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("2000m"), - "memory": resource.MustParse("3000"), + v1.ResourceCPU: resource.MustParse("2000m"), + v1.ResourceMemory: resource.MustParse("3000"), }, }, }, diff --git a/plugin/pkg/scheduler/algorithm/priorities/metadata_test.go b/plugin/pkg/scheduler/algorithm/priorities/metadata_test.go index c8bc1e1cdbb5a..b8fd653ba245d 100644 --- a/plugin/pkg/scheduler/algorithm/priorities/metadata_test.go +++ b/plugin/pkg/scheduler/algorithm/priorities/metadata_test.go @@ -85,8 +85,8 @@ func TestPriorityMetadata(t *testing.T) { ImagePullPolicy: "Always", Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("200m"), - "memory": resource.MustParse("2000"), + v1.ResourceCPU: resource.MustParse("200m"), + v1.ResourceMemory: resource.MustParse("2000"), }, }, }, diff --git a/plugin/pkg/scheduler/algorithm/priorities/most_requested_test.go b/plugin/pkg/scheduler/algorithm/priorities/most_requested_test.go index 5497ae2dd34e3..a77692b4af9ef 100644 --- a/plugin/pkg/scheduler/algorithm/priorities/most_requested_test.go +++ b/plugin/pkg/scheduler/algorithm/priorities/most_requested_test.go @@ -45,16 +45,16 @@ func TestMostRequested(t *testing.T) { { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("1000m"), - "memory": resource.MustParse("0"), + v1.ResourceCPU: resource.MustParse("1000m"), + v1.ResourceMemory: resource.MustParse("0"), }, }, }, { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("2000m"), - "memory": resource.MustParse("0"), + v1.ResourceCPU: resource.MustParse("2000m"), + v1.ResourceMemory: resource.MustParse("0"), }, }, }, @@ -68,16 +68,16 @@ func TestMostRequested(t *testing.T) { { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("1000m"), - "memory": resource.MustParse("2000"), + v1.ResourceCPU: resource.MustParse("1000m"), + v1.ResourceMemory: resource.MustParse("2000"), }, }, }, { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("2000m"), - "memory": resource.MustParse("3000"), + v1.ResourceCPU: resource.MustParse("2000m"), + v1.ResourceMemory: resource.MustParse("3000"), }, }, }, @@ -89,16 +89,16 @@ func TestMostRequested(t *testing.T) { { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("2000m"), - "memory": resource.MustParse("4000"), + v1.ResourceCPU: resource.MustParse("2000m"), + v1.ResourceMemory: resource.MustParse("4000"), }, }, }, { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("3000m"), - "memory": resource.MustParse("5000"), + v1.ResourceCPU: resource.MustParse("3000m"), + v1.ResourceMemory: resource.MustParse("5000"), }, }, }, diff --git a/plugin/pkg/scheduler/algorithm/priorities/test_util.go b/plugin/pkg/scheduler/algorithm/priorities/test_util.go index fd21ea8ac2493..9eb26f2d93c99 100644 --- a/plugin/pkg/scheduler/algorithm/priorities/test_util.go +++ b/plugin/pkg/scheduler/algorithm/priorities/test_util.go @@ -30,12 +30,12 @@ func makeNode(node string, milliCPU, memory int64) *v1.Node { ObjectMeta: metav1.ObjectMeta{Name: node}, Status: v1.NodeStatus{ Capacity: v1.ResourceList{ - "cpu": *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), - "memory": *resource.NewQuantity(memory, resource.BinarySI), + v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), + v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), }, Allocatable: v1.ResourceList{ - "cpu": *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), - "memory": *resource.NewQuantity(memory, resource.BinarySI), + v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), + v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), }, }, } diff --git a/plugin/pkg/scheduler/core/generic_scheduler_test.go b/plugin/pkg/scheduler/core/generic_scheduler_test.go index 48828b3bb98e8..f4abcaa505732 100644 --- a/plugin/pkg/scheduler/core/generic_scheduler_test.go +++ b/plugin/pkg/scheduler/core/generic_scheduler_test.go @@ -390,12 +390,12 @@ func makeNode(node string, milliCPU, memory int64) *v1.Node { ObjectMeta: metav1.ObjectMeta{Name: node}, Status: v1.NodeStatus{ Capacity: v1.ResourceList{ - "cpu": *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), - "memory": *resource.NewQuantity(memory, resource.BinarySI), + v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), + v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), }, Allocatable: v1.ResourceList{ - "cpu": *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), - "memory": *resource.NewQuantity(memory, resource.BinarySI), + v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), + v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), }, }, } @@ -438,9 +438,9 @@ func TestZeroRequest(t *testing.T) { { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse( + v1.ResourceCPU: resource.MustParse( strconv.FormatInt(priorityutil.DefaultMilliCpuRequest, 10) + "m"), - "memory": resource.MustParse( + v1.ResourceMemory: resource.MustParse( strconv.FormatInt(priorityutil.DefaultMemoryRequest, 10)), }, }, @@ -455,9 +455,9 @@ func TestZeroRequest(t *testing.T) { { Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse( + v1.ResourceCPU: resource.MustParse( strconv.FormatInt(priorityutil.DefaultMilliCpuRequest*3, 10) + "m"), - "memory": resource.MustParse( + v1.ResourceMemory: resource.MustParse( strconv.FormatInt(priorityutil.DefaultMemoryRequest*3, 10)), }, }, diff --git a/test/e2e/pods.go b/test/e2e/pods.go index 9bd8ea4be5db2..380b0bafd9f98 100644 --- a/test/e2e/pods.go +++ b/test/e2e/pods.go @@ -215,12 +215,12 @@ var _ = framework.KubeDescribe("Pods Extended", func() { Image: "gcr.io/google_containers/nginx-slim:0.7", Resources: v1.ResourceRequirements{ Limits: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, Requests: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, }, }, diff --git a/test/e2e/scheduling/predicates.go b/test/e2e/scheduling/predicates.go index 98a38967a5b7c..030f545c12d1f 100644 --- a/test/e2e/scheduling/predicates.go +++ b/test/e2e/scheduling/predicates.go @@ -157,7 +157,7 @@ var _ = SIGDescribe("SchedulerPredicates [Serial]", func() { nodeToAllocatableMap := make(map[string]int64) for _, node := range nodeList.Items { - allocatable, found := node.Status.Allocatable["cpu"] + allocatable, found := node.Status.Allocatable[v1.ResourceCPU] Expect(found).To(Equal(true)) nodeToAllocatableMap[node.Name] = allocatable.MilliValue() if nodeMaxAllocatable < allocatable.MilliValue() { @@ -201,10 +201,10 @@ var _ = SIGDescribe("SchedulerPredicates [Serial]", func() { Labels: map[string]string{"name": ""}, Resources: &v1.ResourceRequirements{ Limits: v1.ResourceList{ - "cpu": *resource.NewMilliQuantity(milliCpuPerPod, "DecimalSI"), + v1.ResourceCPU: *resource.NewMilliQuantity(milliCpuPerPod, "DecimalSI"), }, Requests: v1.ResourceList{ - "cpu": *resource.NewMilliQuantity(milliCpuPerPod, "DecimalSI"), + v1.ResourceCPU: *resource.NewMilliQuantity(milliCpuPerPod, "DecimalSI"), }, }, }), true, framework.Logf)) @@ -215,7 +215,7 @@ var _ = SIGDescribe("SchedulerPredicates [Serial]", func() { Labels: map[string]string{"name": "additional"}, Resources: &v1.ResourceRequirements{ Limits: v1.ResourceList{ - "cpu": *resource.NewMilliQuantity(milliCpuPerPod, "DecimalSI"), + v1.ResourceCPU: *resource.NewMilliQuantity(milliCpuPerPod, "DecimalSI"), }, }, } diff --git a/test/e2e/scheduling/priorities.go b/test/e2e/scheduling/priorities.go index 5ceb99c3b05a5..4d0e27670b467 100644 --- a/test/e2e/scheduling/priorities.go +++ b/test/e2e/scheduling/priorities.go @@ -278,20 +278,20 @@ func createBalancedPodForNodes(f *framework.Framework, cs clientset.Interface, n // we need the max one to keep the same cpu/mem use rate ratio = math.Max(maxCPUFraction, maxMemFraction) for _, node := range nodes { - memAllocatable, found := node.Status.Allocatable["memory"] + memAllocatable, found := node.Status.Allocatable[v1.ResourceMemory] Expect(found).To(Equal(true)) memAllocatableVal := memAllocatable.Value() - cpuAllocatable, found := node.Status.Allocatable["cpu"] + cpuAllocatable, found := node.Status.Allocatable[v1.ResourceCPU] Expect(found).To(Equal(true)) cpuAllocatableMil := cpuAllocatable.MilliValue() needCreateResource := v1.ResourceList{} cpuFraction := cpuFractionMap[node.Name] memFraction := memFractionMap[node.Name] - needCreateResource["cpu"] = *resource.NewMilliQuantity(int64((ratio-cpuFraction)*float64(cpuAllocatableMil)), resource.DecimalSI) + needCreateResource[v1.ResourceCPU] = *resource.NewMilliQuantity(int64((ratio-cpuFraction)*float64(cpuAllocatableMil)), resource.DecimalSI) - needCreateResource["memory"] = *resource.NewQuantity(int64((ratio-memFraction)*float64(memAllocatableVal)), resource.BinarySI) + needCreateResource[v1.ResourceMemory] = *resource.NewQuantity(int64((ratio-memFraction)*float64(memAllocatableVal)), resource.BinarySI) err := testutils.StartPods(cs, 1, ns, string(uuid.NewUUID()), *initPausePod(f, pausePodConfig{ @@ -332,12 +332,12 @@ func computeCpuMemFraction(cs clientset.Interface, node v1.Node, resource *v1.Re totalRequestedMemResource += getNonZeroRequests(&pod).Memory } } - cpuAllocatable, found := node.Status.Allocatable["cpu"] + cpuAllocatable, found := node.Status.Allocatable[v1.ResourceCPU] Expect(found).To(Equal(true)) cpuAllocatableMil := cpuAllocatable.MilliValue() cpuFraction := float64(totalRequestedCpuResource) / float64(cpuAllocatableMil) - memAllocatable, found := node.Status.Allocatable["memory"] + memAllocatable, found := node.Status.Allocatable[v1.ResourceMemory] Expect(found).To(Equal(true)) memAllocatableVal := memAllocatable.Value() memFraction := float64(totalRequestedMemResource) / float64(memAllocatableVal) diff --git a/test/e2e_node/allocatable_eviction_test.go b/test/e2e_node/allocatable_eviction_test.go index 99bbb0adcc7c5..dda2795301b4c 100644 --- a/test/e2e_node/allocatable_eviction_test.go +++ b/test/e2e_node/allocatable_eviction_test.go @@ -57,7 +57,7 @@ var _ = framework.KubeDescribe("MemoryAllocatableEviction [Slow] [Serial] [Disru // The default hard eviction threshold is 250Mb, so Allocatable = Capacity - Reserved - 250Mb // We want Allocatable = 50Mb, so set Reserved = Capacity - Allocatable - 250Mb = Capacity - 300Mb kubeReserved.Sub(resource.MustParse("300Mi")) - initialConfig.KubeReserved = kubeletconfig.ConfigurationMap(map[string]string{"memory": kubeReserved.String()}) + initialConfig.KubeReserved = kubeletconfig.ConfigurationMap(map[string]string{string(v1.ResourceMemory): kubeReserved.String()}) initialConfig.EnforceNodeAllocatable = []string{cm.NodeAllocatableEnforcementKey} initialConfig.ExperimentalNodeAllocatableIgnoreEvictionThreshold = false initialConfig.CgroupsPerQOS = true diff --git a/test/e2e_node/benchmark_util.go b/test/e2e_node/benchmark_util.go index 6064f287c4758..fc4fd9555f7df 100644 --- a/test/e2e_node/benchmark_util.go +++ b/test/e2e_node/benchmark_util.go @@ -26,6 +26,7 @@ import ( "strconv" "time" + "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/perftype" @@ -156,12 +157,12 @@ func getTestNodeInfo(f *framework.Framework, testName, testDesc string) map[stri node, err := f.ClientSet.Core().Nodes().Get(nodeName, metav1.GetOptions{}) Expect(err).NotTo(HaveOccurred()) - cpu, ok := node.Status.Capacity["cpu"] + cpu, ok := node.Status.Capacity[v1.ResourceCPU] if !ok { framework.Failf("Fail to fetch CPU capacity value of test node.") } - memory, ok := node.Status.Capacity["memory"] + memory, ok := node.Status.Capacity[v1.ResourceMemory] if !ok { framework.Failf("Fail to fetch Memory capacity value of test node.") } diff --git a/test/e2e_node/container_manager_test.go b/test/e2e_node/container_manager_test.go index f12bf90627c6c..1b304013e171a 100644 --- a/test/e2e_node/container_manager_test.go +++ b/test/e2e_node/container_manager_test.go @@ -172,8 +172,8 @@ var _ = framework.KubeDescribe("Container Manager Misc [Serial]", func() { Name: podName, Resources: v1.ResourceRequirements{ Limits: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("50Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("50Mi"), }, }, }, @@ -213,8 +213,8 @@ var _ = framework.KubeDescribe("Container Manager Misc [Serial]", func() { Name: podName, Resources: v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("50Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("50Mi"), }, }, }, diff --git a/test/e2e_node/critical_pod_test.go b/test/e2e_node/critical_pod_test.go index 5a0edfc9dea05..663d6fd7a31e5 100644 --- a/test/e2e_node/critical_pod_test.go +++ b/test/e2e_node/critical_pod_test.go @@ -56,18 +56,18 @@ var _ = framework.KubeDescribe("CriticalPod [Serial] [Disruptive]", func() { // Define test pods nonCriticalGuaranteed := getTestPod(false, guaranteedPodName, v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, Limits: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, }) nonCriticalBurstable := getTestPod(false, burstablePodName, v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, }) nonCriticalBestEffort := getTestPod(false, bestEffortPodName, v1.ResourceRequirements{}) diff --git a/test/e2e_node/memory_eviction_test.go b/test/e2e_node/memory_eviction_test.go index 0dae58b5792bc..1059b62b2ca9b 100644 --- a/test/e2e_node/memory_eviction_test.go +++ b/test/e2e_node/memory_eviction_test.go @@ -139,12 +139,12 @@ var _ = framework.KubeDescribe("MemoryEviction [Slow] [Serial] [Disruptive]", fu // A pod is guaranteed only when requests and limits are specified for all the containers and they are equal. guaranteed := getMemhogPod("guaranteed-pod", "guaranteed", v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }, Limits: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }}) guaranteed = f.PodClient().CreateSync(guaranteed) glog.Infof("pod created with name: %s", guaranteed.Name) @@ -152,8 +152,8 @@ var _ = framework.KubeDescribe("MemoryEviction [Slow] [Serial] [Disruptive]", fu // A pod is burstable if limits and requests do not match across all containers. burstable := getMemhogPod("burstable-pod", "burstable", v1.ResourceRequirements{ Requests: v1.ResourceList{ - "cpu": resource.MustParse("100m"), - "memory": resource.MustParse("100Mi"), + v1.ResourceCPU: resource.MustParse("100m"), + v1.ResourceMemory: resource.MustParse("100Mi"), }}) burstable = f.PodClient().CreateSync(burstable) glog.Infof("pod created with name: %s", burstable.Name) @@ -256,7 +256,7 @@ func getMemhogPod(podName string, ctnName string, res v1.ResourceRequirements) * // This helps prevent a guaranteed pod from triggering an OOM kill due to it's low memory limit, // which will cause the test to fail inappropriately. var memLimit string - if limit, ok := res.Limits["memory"]; ok { + if limit, ok := res.Limits[v1.ResourceMemory]; ok { memLimit = strconv.Itoa(int( float64(limit.Value()) * 0.8)) } else { diff --git a/test/e2e_node/node_container_manager_test.go b/test/e2e_node/node_container_manager_test.go index 1232cdaa790f0..c26fb1eefe75a 100644 --- a/test/e2e_node/node_container_manager_test.go +++ b/test/e2e_node/node_container_manager_test.go @@ -40,12 +40,12 @@ import ( func setDesiredConfiguration(initialConfig *kubeletconfig.KubeletConfiguration) { initialConfig.EnforceNodeAllocatable = []string{"pods", "kube-reserved", "system-reserved"} initialConfig.SystemReserved = kubeletconfig.ConfigurationMap{ - "cpu": "100m", - "memory": "100Mi", + string(v1.ResourceCPU): "100m", + string(v1.ResourceMemory): "100Mi", } initialConfig.KubeReserved = kubeletconfig.ConfigurationMap{ - "cpu": "100m", - "memory": "100Mi", + string(v1.ResourceCPU): "100m", + string(v1.ResourceMemory): "100Mi", } initialConfig.EvictionHard = "memory.available<100Mi" // Necessary for allocatable cgroup creation. @@ -210,23 +210,23 @@ func runTest(f *framework.Framework) error { return fmt.Errorf("Expected all resources in capacity to be found in allocatable") } // CPU based evictions are not supported. - if allocatableCPU.Cmp(schedulerAllocatable["cpu"]) != 0 { - return fmt.Errorf("Unexpected cpu allocatable value exposed by the node. Expected: %v, got: %v, capacity: %v", allocatableCPU, schedulerAllocatable["cpu"], capacity["cpu"]) + if allocatableCPU.Cmp(schedulerAllocatable[v1.ResourceCPU]) != 0 { + return fmt.Errorf("Unexpected cpu allocatable value exposed by the node. Expected: %v, got: %v, capacity: %v", allocatableCPU, schedulerAllocatable[v1.ResourceCPU], capacity[v1.ResourceCPU]) } - if allocatableMemory.Cmp(schedulerAllocatable["memory"]) != 0 { - return fmt.Errorf("Unexpected cpu allocatable value exposed by the node. Expected: %v, got: %v, capacity: %v", allocatableCPU, schedulerAllocatable["cpu"], capacity["memory"]) + if allocatableMemory.Cmp(schedulerAllocatable[v1.ResourceMemory]) != 0 { + return fmt.Errorf("Unexpected cpu allocatable value exposed by the node. Expected: %v, got: %v, capacity: %v", allocatableCPU, schedulerAllocatable[v1.ResourceCPU], capacity[v1.ResourceMemory]) } if !cgroupManager.Exists(cm.CgroupName(kubeReservedCgroup)) { return fmt.Errorf("Expected kube reserved cgroup Does not exist") } // Expect CPU shares on kube reserved cgroup to equal it's reservation which is `100m`. - kubeReservedCPU := resource.MustParse(currentConfig.KubeReserved["cpu"]) + kubeReservedCPU := resource.MustParse(currentConfig.KubeReserved[string(v1.ResourceCPU)]) if err := expectFileValToEqual(filepath.Join(subsystems.MountPoints["cpu"], kubeReservedCgroup, "cpu.shares"), cm.MilliCPUToShares(kubeReservedCPU.MilliValue()), 10); err != nil { return err } // Expect Memory limit kube reserved cgroup to equal configured value `100Mi`. - kubeReservedMemory := resource.MustParse(currentConfig.KubeReserved["memory"]) + kubeReservedMemory := resource.MustParse(currentConfig.KubeReserved[string(v1.ResourceMemory)]) if err := expectFileValToEqual(filepath.Join(subsystems.MountPoints["memory"], kubeReservedCgroup, "memory.limit_in_bytes"), kubeReservedMemory.Value(), 0); err != nil { return err } @@ -234,12 +234,12 @@ func runTest(f *framework.Framework) error { return fmt.Errorf("Expected system reserved cgroup Does not exist") } // Expect CPU shares on system reserved cgroup to equal it's reservation which is `100m`. - systemReservedCPU := resource.MustParse(currentConfig.SystemReserved["cpu"]) + systemReservedCPU := resource.MustParse(currentConfig.SystemReserved[string(v1.ResourceCPU)]) if err := expectFileValToEqual(filepath.Join(subsystems.MountPoints["cpu"], systemReservedCgroup, "cpu.shares"), cm.MilliCPUToShares(systemReservedCPU.MilliValue()), 10); err != nil { return err } // Expect Memory limit on node allocatable cgroup to equal allocatable. - systemReservedMemory := resource.MustParse(currentConfig.SystemReserved["memory"]) + systemReservedMemory := resource.MustParse(currentConfig.SystemReserved[string(v1.ResourceMemory)]) if err := expectFileValToEqual(filepath.Join(subsystems.MountPoints["memory"], systemReservedCgroup, "memory.limit_in_bytes"), systemReservedMemory.Value(), 0); err != nil { return err } From 938bffcb045399a571a1b048f762d95cb66b1e9a Mon Sep 17 00:00:00 2001 From: zhengchuan hu Date: Wed, 16 Aug 2017 22:52:56 +0800 Subject: [PATCH 055/403] Delete "hugetlb" from whitelistControllers --- pkg/kubelet/cm/cgroup_manager_linux.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kubelet/cm/cgroup_manager_linux.go b/pkg/kubelet/cm/cgroup_manager_linux.go index 7657dcca15e65..c210dc2f60534 100644 --- a/pkg/kubelet/cm/cgroup_manager_linux.go +++ b/pkg/kubelet/cm/cgroup_manager_linux.go @@ -233,7 +233,7 @@ func (m *cgroupManagerImpl) Exists(name CgroupName) bool { // scoped to the set control groups it understands. this is being discussed // in https://github.com/opencontainers/runc/issues/1440 // once resolved, we can remove this code. - whitelistControllers := sets.NewString("cpu", "cpuacct", "cpuset", "memory", "hugetlb", "systemd") + whitelistControllers := sets.NewString("cpu", "cpuacct", "cpuset", "memory", "systemd") // If even one cgroup path doesn't exist, then the cgroup doesn't exist. for controller, path := range cgroupPaths { From fc2a45ee4ef773cd403436f5e5d7ec5210789d8a Mon Sep 17 00:00:00 2001 From: Connor Doyle Date: Mon, 6 Mar 2017 19:47:39 -0800 Subject: [PATCH 056/403] Re-enable OIR e2e tests. - Removed [Feature: tag from e2e test. --- test/e2e/scheduling/opaque_resource.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/scheduling/opaque_resource.go b/test/e2e/scheduling/opaque_resource.go index 0e5e0e5de748c..2c20d51317847 100644 --- a/test/e2e/scheduling/opaque_resource.go +++ b/test/e2e/scheduling/opaque_resource.go @@ -33,7 +33,7 @@ import ( . "github.com/onsi/gomega" ) -var _ = SIGDescribe("Opaque resources [Feature:OpaqueResources]", func() { +var _ = SIGDescribe("Opaque resources", func() { f := framework.NewDefaultFramework("opaque-resource") opaqueResName := v1helper.OpaqueIntResourceName("foo") var node *v1.Node From aca62a174148eb929f0fbed707fbf991dc397e43 Mon Sep 17 00:00:00 2001 From: Phillip Wittrock Date: Wed, 16 Aug 2017 14:22:32 -0700 Subject: [PATCH 057/403] Address PR comments --- pkg/kubectl/apps/kind_visitor.go | 28 +++++++++---------- pkg/kubectl/cmd/util/clientcache.go | 19 +++++++------ pkg/kubectl/cmd/util/factory.go | 2 +- pkg/kubectl/cmd/util/factory_client_access.go | 2 +- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/pkg/kubectl/apps/kind_visitor.go b/pkg/kubectl/apps/kind_visitor.go index 98443c60a5161..0170883e1e586 100644 --- a/pkg/kubectl/apps/kind_visitor.go +++ b/pkg/kubectl/apps/kind_visitor.go @@ -47,16 +47,16 @@ func (elem GroupKindElement) Accept(visitor KindVisitor) error { visitor.VisitDeployment(elem) return nil } - if elem.GroupMatch("apps", "extensions") && elem.Kind == "Job" { - visitor.VisitDeployment(elem) + if elem.GroupMatch("batch") && elem.Kind == "Job" { + visitor.VisitJob(elem) return nil } if elem.GroupMatch("", "core") && elem.Kind == "Pod" { visitor.VisitPod(elem) return nil } - if elem.GroupMatch("apps", "extensions") && elem.Kind == "ReplicaSet" { - visitor.VisitReplicationController(elem) + if elem.GroupMatch("extensions") && elem.Kind == "ReplicaSet" { + visitor.VisitReplicaSet(elem) return nil } if elem.GroupMatch("", "core") && elem.Kind == "ReplicationController" { @@ -81,15 +81,15 @@ func (elem GroupKindElement) GroupMatch(groups ...string) bool { return false } -// DefaultKindVisitor implements KindVisitor with no-op functions. -type DefaultKindVisitor struct{} +// NoOpKindVisitor implements KindVisitor with no-op functions. +type NoOpKindVisitor struct{} -var _ KindVisitor = &DefaultKindVisitor{} +var _ KindVisitor = &NoOpKindVisitor{} -func (*DefaultKindVisitor) VisitDaemonSet(kind GroupKindElement) {} -func (*DefaultKindVisitor) VisitDeployment(kind GroupKindElement) {} -func (*DefaultKindVisitor) VisitJob(kind GroupKindElement) {} -func (*DefaultKindVisitor) VisitPod(kind GroupKindElement) {} -func (*DefaultKindVisitor) VisitReplicaSet(kind GroupKindElement) {} -func (*DefaultKindVisitor) VisitReplicationController(kind GroupKindElement) {} -func (*DefaultKindVisitor) VisitStatefulSet(kind GroupKindElement) {} +func (*NoOpKindVisitor) VisitDaemonSet(kind GroupKindElement) {} +func (*NoOpKindVisitor) VisitDeployment(kind GroupKindElement) {} +func (*NoOpKindVisitor) VisitJob(kind GroupKindElement) {} +func (*NoOpKindVisitor) VisitPod(kind GroupKindElement) {} +func (*NoOpKindVisitor) VisitReplicaSet(kind GroupKindElement) {} +func (*NoOpKindVisitor) VisitReplicationController(kind GroupKindElement) {} +func (*NoOpKindVisitor) VisitStatefulSet(kind GroupKindElement) {} diff --git a/pkg/kubectl/cmd/util/clientcache.go b/pkg/kubectl/cmd/util/clientcache.go index 9de532ecc9863..5d7440308b17b 100644 --- a/pkg/kubectl/cmd/util/clientcache.go +++ b/pkg/kubectl/cmd/util/clientcache.go @@ -60,10 +60,11 @@ type ClientCache struct { discoveryClientFactory DiscoveryClientFactory discoveryClient discovery.DiscoveryInterface - kubernetesClientLoader KubernetesClientCache + kubernetesClientCache KubernetesClientCache } -// kubernetesClientLoader provides a new kubernetes.Clientset +// KubernetesClientCache creates a new kubernetes.Clientset one time +// and then returns the result for all future requests type KubernetesClientCache struct { // once makes sure the client is only initialized once once sync.Once @@ -73,20 +74,20 @@ type KubernetesClientCache struct { err error } -// KubernetesClientSet returns a new kubernetes.Clientset. It will cache the value +// KubernetesClientSetForVersion returns a new kubernetes.Clientset. It will cache the value // the first time it is called and return the cached value on subsequent calls. -// If an error is encountered the first time KubernetesClientSet is called, +// If an error is encountered the first time KubernetesClientSetForVersion is called, // the error will be cached. -func (c *ClientCache) KubernetesClientSet(requiredVersion *schema.GroupVersion) (*kubernetes.Clientset, error) { - c.kubernetesClientLoader.once.Do(func() { +func (c *ClientCache) KubernetesClientSetForVersion(requiredVersion *schema.GroupVersion) (*kubernetes.Clientset, error) { + c.kubernetesClientCache.once.Do(func() { config, err := c.ClientConfigForVersion(requiredVersion) if err != nil { - c.kubernetesClientLoader.err = err + c.kubernetesClientCache.err = err return } - c.kubernetesClientLoader.client, c.kubernetesClientLoader.err = kubernetes.NewForConfig(config) + c.kubernetesClientCache.client, c.kubernetesClientCache.err = kubernetes.NewForConfig(config) }) - return c.kubernetesClientLoader.client, c.kubernetesClientLoader.err + return c.kubernetesClientCache.client, c.kubernetesClientCache.err } // also looks up the discovery client. We can't do this during init because the flags won't have been set diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 40a879bd884ef..6ce8f6d7098a3 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -93,7 +93,7 @@ type ClientAccessFactory interface { // ClientSet gives you back an internal, generated clientset ClientSet() (internalclientset.Interface, error) - // KubernetesClientSet gives you back an external clientset + // KubernetesClientSetForVersion gives you back an external clientset KubernetesClientSet() (*kubernetes.Clientset, error) // Returns a RESTClient for accessing Kubernetes resources or an error. diff --git a/pkg/kubectl/cmd/util/factory_client_access.go b/pkg/kubectl/cmd/util/factory_client_access.go index 2cf9c7a39f264..e71a5a2571b8e 100644 --- a/pkg/kubectl/cmd/util/factory_client_access.go +++ b/pkg/kubectl/cmd/util/factory_client_access.go @@ -169,7 +169,7 @@ func (f *ring0Factory) DiscoveryClient() (discovery.CachedDiscoveryInterface, er } func (f *ring0Factory) KubernetesClientSet() (*kubernetes.Clientset, error) { - return f.clientCache.KubernetesClientSet(nil) + return f.clientCache.KubernetesClientSetForVersion(nil) } func (f *ring0Factory) ClientSet() (internalclientset.Interface, error) { From 3393cf4718d5880fc9dc59b0f099f4c2e854e3f4 Mon Sep 17 00:00:00 2001 From: zhangxiaoyu-zidif Date: Thu, 17 Aug 2017 06:00:02 +0800 Subject: [PATCH 058/403] fix-review --- pkg/controller/statefulset/BUILD | 1 + .../statefulset/stateful_set_test.go | 23 ++++++++----------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/pkg/controller/statefulset/BUILD b/pkg/controller/statefulset/BUILD index bfb3e41ab6557..e1eb7f8b4266a 100644 --- a/pkg/controller/statefulset/BUILD +++ b/pkg/controller/statefulset/BUILD @@ -74,6 +74,7 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/informers/apps/v1beta1:go_default_library", "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", diff --git a/pkg/controller/statefulset/stateful_set_test.go b/pkg/controller/statefulset/stateful_set_test.go index ce1ff1bed1aff..5814b8b8487c7 100644 --- a/pkg/controller/statefulset/stateful_set_test.go +++ b/pkg/controller/statefulset/stateful_set_test.go @@ -17,7 +17,6 @@ limitations under the License. package statefulset import ( - "reflect" "sort" "testing" @@ -25,6 +24,7 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/tools/cache" @@ -521,16 +521,13 @@ func TestGetPodsForStatefulSetAdopt(t *testing.T) { if err != nil { t.Fatalf("getPodsForStatefulSet() error: %v", err) } - var got []string + got := sets.NewString() for _, pod := range pods { - got = append(got, pod.Name) + got.Insert(pod.Name) } - // pod2 should be claimed, pod3 and pod4 ignored - want := []string{pod1.Name, pod2.Name} - sort.Strings(got) - sort.Strings(want) - if !reflect.DeepEqual(got, want) { + want := sets.NewString(pod1.Name, pod2.Name) + if !got.Equal(want) { t.Errorf("getPodsForStatefulSet() = %v, want %v", got, want) } } @@ -561,16 +558,14 @@ func TestGetPodsForStatefulSetRelease(t *testing.T) { if err != nil { t.Fatalf("getPodsForStatefulSet() error: %v", err) } - var got []string + got := sets.NewString() for _, pod := range pods { - got = append(got, pod.Name) + got.Insert(pod.Name) } // Expect only pod1 (pod2 and pod3 should be released, pod4 ignored). - want := []string{pod1.Name} - sort.Strings(got) - sort.Strings(want) - if !reflect.DeepEqual(got, want) { + want := sets.NewString(pod1.Name) + if !got.Equal(want) { t.Errorf("getPodsForStatefulSet() = %v, want %v", got, want) } } From 78e1c6fe2906baa076556c8fccb243ab04109e2e Mon Sep 17 00:00:00 2001 From: Diego Pontoriero Date: Mon, 7 Aug 2017 09:41:25 -0700 Subject: [PATCH 059/403] Remove incorrect patch-merge directives. Directives were misplaced for the following types: - MatchExpressions - Taints - Tolerations Per the discussion in #46547, we cannot fix these because it would cause backwards-compatibility problems. Instead, remove the incorrect ones so they don't mislead users. This has no impact on behavior. --- api/openapi-spec/swagger.json | 12 +++--------- federation/apis/openapi-spec/swagger.json | 8 ++------ staging/src/k8s.io/api/core/v1/generated.proto | 6 ------ staging/src/k8s.io/api/core/v1/types.go | 12 +++--------- 4 files changed, 8 insertions(+), 30 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 850c507ae2936..3f1c22165b0f5 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -57884,9 +57884,7 @@ "properties": { "key": { "description": "The label key that the selector applies to.", - "type": "string", - "x-kubernetes-patch-merge-key": "key", - "x-kubernetes-patch-strategy": "merge" + "type": "string" }, "operator": { "description": "Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.", @@ -60001,9 +59999,7 @@ }, "key": { "description": "Required. The taint key to be applied to a node.", - "type": "string", - "x-kubernetes-patch-merge-key": "key", - "x-kubernetes-patch-strategy": "merge" + "type": "string" }, "timeAdded": { "description": "TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints.", @@ -60024,9 +60020,7 @@ }, "key": { "description": "Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.", - "type": "string", - "x-kubernetes-patch-merge-key": "key", - "x-kubernetes-patch-strategy": "merge" + "type": "string" }, "operator": { "description": "Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.", diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index 6991d095ace4f..f44cbb2148f31 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -10881,9 +10881,7 @@ "properties": { "key": { "description": "The label key that the selector applies to.", - "type": "string", - "x-kubernetes-patch-merge-key": "key", - "x-kubernetes-patch-strategy": "merge" + "type": "string" }, "operator": { "description": "Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.", @@ -11933,9 +11931,7 @@ }, "key": { "description": "Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.", - "type": "string", - "x-kubernetes-patch-merge-key": "key", - "x-kubernetes-patch-strategy": "merge" + "type": "string" }, "operator": { "description": "Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.", diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 63d797e018a0c..ca7941668a695 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -1655,8 +1655,6 @@ message NodeSelector { // that relates the key and values. message NodeSelectorRequirement { // The label key that the selector applies to. - // +patchMergeKey=key - // +patchStrategy=merge optional string key = 1; // Represents a key's relationship to a set of values. @@ -3888,8 +3886,6 @@ message TCPSocketAction { // any pod that does not tolerate the Taint. message Taint { // Required. The taint key to be applied to a node. - // +patchMergeKey=key - // +patchStrategy=merge optional string key = 1; // Required. The taint value corresponding to the taint key. @@ -3913,8 +3909,6 @@ message Toleration { // Key is the taint key that the toleration applies to. Empty means match all taint keys. // If the key is empty, operator must be Exists; this combination means to match all values and all keys. // +optional - // +patchMergeKey=key - // +patchStrategy=merge optional string key = 1; // Operator represents a key's relationship to the value. diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index cdc1237cb7522..1e098c8062743 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -2114,9 +2114,7 @@ type NodeSelectorTerm struct { // that relates the key and values. type NodeSelectorRequirement struct { // The label key that the selector applies to. - // +patchMergeKey=key - // +patchStrategy=merge - Key string `json:"key" patchStrategy:"merge" patchMergeKey:"key" protobuf:"bytes,1,opt,name=key"` + Key string `json:"key" protobuf:"bytes,1,opt,name=key"` // Represents a key's relationship to a set of values. // Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. Operator NodeSelectorOperator `json:"operator" protobuf:"bytes,2,opt,name=operator,casttype=NodeSelectorOperator"` @@ -2302,9 +2300,7 @@ type PreferredSchedulingTerm struct { // any pod that does not tolerate the Taint. type Taint struct { // Required. The taint key to be applied to a node. - // +patchMergeKey=key - // +patchStrategy=merge - Key string `json:"key" patchStrategy:"merge" patchMergeKey:"key" protobuf:"bytes,1,opt,name=key"` + Key string `json:"key" protobuf:"bytes,1,opt,name=key"` // Required. The taint value corresponding to the taint key. // +optional Value string `json:"value,omitempty" protobuf:"bytes,2,opt,name=value"` @@ -2346,9 +2342,7 @@ type Toleration struct { // Key is the taint key that the toleration applies to. Empty means match all taint keys. // If the key is empty, operator must be Exists; this combination means to match all values and all keys. // +optional - // +patchMergeKey=key - // +patchStrategy=merge - Key string `json:"key,omitempty" patchStrategy:"merge" patchMergeKey:"key" protobuf:"bytes,1,opt,name=key"` + Key string `json:"key,omitempty" protobuf:"bytes,1,opt,name=key"` // Operator represents a key's relationship to the value. // Valid operators are Exists and Equal. Defaults to Equal. // Exists is equivalent to wildcard for value, so that a pod can From 1234d2f500c63bf4d61f17f05e3c35a9da11d257 Mon Sep 17 00:00:00 2001 From: Cheng Xing Date: Wed, 16 Aug 2017 15:35:33 -0700 Subject: [PATCH 060/403] On AttachDetachController node status update, do not retry when node doesn't exist but keep the node entry in cache --- .../cache/actual_state_of_world.go | 17 ---- .../cache/actual_state_of_world_test.go | 83 ------------------- .../statusupdater/node_status_updater.go | 4 +- 3 files changed, 1 insertion(+), 103 deletions(-) diff --git a/pkg/controller/volume/attachdetach/cache/actual_state_of_world.go b/pkg/controller/volume/attachdetach/cache/actual_state_of_world.go index 5e96b4c433bf4..4ee4e26c9b429 100644 --- a/pkg/controller/volume/attachdetach/cache/actual_state_of_world.go +++ b/pkg/controller/volume/attachdetach/cache/actual_state_of_world.go @@ -125,10 +125,6 @@ type ActualStateOfWorld interface { // GetNodesToUpdateStatusFor returns the map of nodeNames to nodeToUpdateStatusFor GetNodesToUpdateStatusFor() map[types.NodeName]nodeToUpdateStatusFor - - // Removes the given node from the record of attach updates. The node's entire - // volumesToReportAsAttached list is removed. - RemoveNodeFromAttachUpdates(nodeName types.NodeName) error } // AttachedVolume represents a volume that is attached to a node. @@ -264,19 +260,6 @@ func (asw *actualStateOfWorld) AddVolumeToReportAsAttached( asw.addVolumeToReportAsAttached(volumeName, nodeName) } -func (asw *actualStateOfWorld) RemoveNodeFromAttachUpdates(nodeName types.NodeName) error { - asw.Lock() - defer asw.Unlock() - - _, nodeToUpdateExists := asw.nodesToUpdateStatusFor[nodeName] - if nodeToUpdateExists { - delete(asw.nodesToUpdateStatusFor, nodeName) - return nil - } - return fmt.Errorf("node %q does not exist in volumesToReportAsAttached list", - nodeName) -} - func (asw *actualStateOfWorld) AddVolumeNode( uniqueName v1.UniqueVolumeName, volumeSpec *volume.Spec, nodeName types.NodeName, devicePath string) (v1.UniqueVolumeName, error) { asw.Lock() diff --git a/pkg/controller/volume/attachdetach/cache/actual_state_of_world_test.go b/pkg/controller/volume/attachdetach/cache/actual_state_of_world_test.go index dcc9fd837b9c6..22a4e3df728d2 100644 --- a/pkg/controller/volume/attachdetach/cache/actual_state_of_world_test.go +++ b/pkg/controller/volume/attachdetach/cache/actual_state_of_world_test.go @@ -1165,89 +1165,6 @@ func Test_updateNodeStatusUpdateNeededError(t *testing.T) { } } -// Test_RemoveNodeFromAttachUpdates_Positive expects an entire node entry to be removed -// from nodesToUpdateStatusFor -func Test_RemoveNodeFromAttachUpdates_Positive(t *testing.T) { - // Arrange - volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t) - asw := &actualStateOfWorld{ - attachedVolumes: make(map[v1.UniqueVolumeName]attachedVolume), - nodesToUpdateStatusFor: make(map[types.NodeName]nodeToUpdateStatusFor), - volumePluginMgr: volumePluginMgr, - } - nodeName := types.NodeName("node-1") - nodeToUpdate := nodeToUpdateStatusFor{ - nodeName: nodeName, - statusUpdateNeeded: true, - volumesToReportAsAttached: make(map[v1.UniqueVolumeName]v1.UniqueVolumeName), - } - asw.nodesToUpdateStatusFor[nodeName] = nodeToUpdate - - // Act - err := asw.RemoveNodeFromAttachUpdates(nodeName) - - // Assert - if err != nil { - t.Fatalf("RemoveNodeFromAttachUpdates should not return error, but got: %v", err) - } - if len(asw.nodesToUpdateStatusFor) > 0 { - t.Fatal("nodesToUpdateStatusFor should be empty as its only entry has been deleted.") - } -} - -// Test_RemoveNodeFromAttachUpdates_Negative_NodeDoesNotExist expects an error to be thrown -// when nodeName is not in nodesToUpdateStatusFor. -func Test_RemoveNodeFromAttachUpdates_Negative_NodeDoesNotExist(t *testing.T) { - // Arrange - volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t) - asw := &actualStateOfWorld{ - attachedVolumes: make(map[v1.UniqueVolumeName]attachedVolume), - nodesToUpdateStatusFor: make(map[types.NodeName]nodeToUpdateStatusFor), - volumePluginMgr: volumePluginMgr, - } - nodeName := types.NodeName("node-1") - nodeToUpdate := nodeToUpdateStatusFor{ - nodeName: nodeName, - statusUpdateNeeded: true, - volumesToReportAsAttached: make(map[v1.UniqueVolumeName]v1.UniqueVolumeName), - } - asw.nodesToUpdateStatusFor[nodeName] = nodeToUpdate - - // Act - err := asw.RemoveNodeFromAttachUpdates("node-2") - - // Assert - if err == nil { - t.Fatal("RemoveNodeFromAttachUpdates should return an error as the nodeName doesn't exist.") - } - if len(asw.nodesToUpdateStatusFor) != 1 { - t.Fatal("The length of nodesToUpdateStatusFor should not change because no operation was performed.") - } -} - -// Test_RemoveNodeFromAttachUpdates_Negative_Empty expects an error to be thrown -// when a nodesToUpdateStatusFor is empty. -func Test_RemoveNodeFromAttachUpdates_Negative_Empty(t *testing.T) { - // Arrange - volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t) - asw := &actualStateOfWorld{ - attachedVolumes: make(map[v1.UniqueVolumeName]attachedVolume), - nodesToUpdateStatusFor: make(map[types.NodeName]nodeToUpdateStatusFor), - volumePluginMgr: volumePluginMgr, - } - - // Act - err := asw.RemoveNodeFromAttachUpdates("node-1") - - // Assert - if err == nil { - t.Fatal("RemoveNodeFromAttachUpdates should return an error as nodeToUpdateStatusFor is empty.") - } - if len(asw.nodesToUpdateStatusFor) != 0 { - t.Fatal("The length of nodesToUpdateStatusFor should be 0.") - } -} - func verifyAttachedVolume( t *testing.T, attachedVolumes []AttachedVolume, diff --git a/pkg/controller/volume/attachdetach/statusupdater/node_status_updater.go b/pkg/controller/volume/attachdetach/statusupdater/node_status_updater.go index acfc2b97bbc68..2ebb1706e99c7 100644 --- a/pkg/controller/volume/attachdetach/statusupdater/node_status_updater.go +++ b/pkg/controller/volume/attachdetach/statusupdater/node_status_updater.go @@ -68,13 +68,11 @@ func (nsu *nodeStatusUpdater) UpdateNodeStatuses() error { nodeObj, err := nsu.nodeLister.Get(string(nodeName)) if errors.IsNotFound(err) { // If node does not exist, its status cannot be updated. - // Remove the node entry from the collection of attach updates, preventing the - // status updater from unnecessarily updating the node. + // Do nothing so that there is no retry until node is created. glog.V(2).Infof( "Could not update node status. Failed to find node %q in NodeInformer cache. Error: '%v'", nodeName, err) - nsu.actualStateOfWorld.RemoveNodeFromAttachUpdates(nodeName) continue } else if err != nil { // For all other errors, log error and reset flag statusUpdateNeeded From f579e395b54413b18931e558c1dd827889fdc447 Mon Sep 17 00:00:00 2001 From: YuxiJin-tobeyjin Date: Thu, 17 Aug 2017 10:05:23 +0800 Subject: [PATCH 061/403] Remove redundant err definition --- pkg/kubectl/cmd/top_node.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/kubectl/cmd/top_node.go b/pkg/kubectl/cmd/top_node.go index e432a457622b8..b0095492b39fb 100644 --- a/pkg/kubectl/cmd/top_node.go +++ b/pkg/kubectl/cmd/top_node.go @@ -97,7 +97,6 @@ func NewCmdTopNode(f cmdutil.Factory, out io.Writer) *cobra.Command { } func (o *TopNodeOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string, out io.Writer) error { - var err error if len(args) == 1 { o.ResourceName = args[0] } else if len(args) > 1 { From 68bd8d2584231fb59db7b4382eaa47f5b6d13981 Mon Sep 17 00:00:00 2001 From: zhengjiajin Date: Thu, 17 Aug 2017 11:19:14 +0800 Subject: [PATCH 062/403] fix issue(#50821)Add image check, if image not changed, transform false --- pkg/kubectl/cmd/set/set_image.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/kubectl/cmd/set/set_image.go b/pkg/kubectl/cmd/set/set_image.go index a85d78e1b1029..9f707df489855 100644 --- a/pkg/kubectl/cmd/set/set_image.go +++ b/pkg/kubectl/cmd/set/set_image.go @@ -196,9 +196,11 @@ func (o *ImageOptions) Run() error { continue } } - spec.Containers[i].Image = resolved - // Perform updates - transformed = true + if spec.Containers[i].Image != resolved { + spec.Containers[i].Image = resolved + // Perform updates + transformed = true + } } } // Add a new container if not found From 5c354615e08e7711c1be03ac7ef6e43178f2e80f Mon Sep 17 00:00:00 2001 From: Nikhita Raghunath Date: Wed, 16 Aug 2017 17:54:48 +0530 Subject: [PATCH 063/403] update CRD strategy for status updates 1. Clear the status of the CRD and set the Generation before creation. 2. While updating the CRD: - ignore changes on status. - increase Generation if spec changes. 3. Don't update objectmeta when status is updated. - however, update finalizers. Without this, deletion will timeout. --- .../pkg/registry/customresource/etcd.go | 4 +-- .../pkg/registry/customresource/strategy.go | 26 +++++++++---------- .../registry/customresourcedefinition/BUILD | 1 + .../customresourcedefinition/strategy.go | 24 +++++++++++++++++ 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go index 6abd528354bb3..5f953b1c699a5 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go @@ -24,13 +24,13 @@ import ( genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" ) -// rest implements a RESTStorage for API services against etcd +// REST implements a RESTStorage for API services against etcd type REST struct { *genericregistry.Store } // NewREST returns a RESTStorage object that will work against API services. -func NewREST(resource schema.GroupResource, listKind schema.GroupVersionKind, copier runtime.ObjectCopier, strategy CustomResourceDefinitionStorageStrategy, optsGetter generic.RESTOptionsGetter) *REST { +func NewREST(resource schema.GroupResource, listKind schema.GroupVersionKind, copier runtime.ObjectCopier, strategy customResourceDefinitionStorageStrategy, optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ Copier: copier, NewFunc: func() runtime.Object { return &unstructured.Unstructured{} }, diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go index 8ebc90c179970..6b97d07531a78 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go @@ -32,7 +32,7 @@ import ( "k8s.io/apiserver/pkg/storage/names" ) -type CustomResourceDefinitionStorageStrategy struct { +type customResourceDefinitionStorageStrategy struct { runtime.ObjectTyper names.NameGenerator @@ -40,8 +40,8 @@ type CustomResourceDefinitionStorageStrategy struct { validator customResourceValidator } -func NewStrategy(typer runtime.ObjectTyper, namespaceScoped bool, kind schema.GroupVersionKind) CustomResourceDefinitionStorageStrategy { - return CustomResourceDefinitionStorageStrategy{ +func NewStrategy(typer runtime.ObjectTyper, namespaceScoped bool, kind schema.GroupVersionKind) customResourceDefinitionStorageStrategy { + return customResourceDefinitionStorageStrategy{ ObjectTyper: typer, NameGenerator: names.SimpleNameGenerator, namespaceScoped: namespaceScoped, @@ -52,36 +52,36 @@ func NewStrategy(typer runtime.ObjectTyper, namespaceScoped bool, kind schema.Gr } } -func (a CustomResourceDefinitionStorageStrategy) NamespaceScoped() bool { +func (a customResourceDefinitionStorageStrategy) NamespaceScoped() bool { return a.namespaceScoped } -func (CustomResourceDefinitionStorageStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) { +func (customResourceDefinitionStorageStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) { } -func (CustomResourceDefinitionStorageStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) { +func (customResourceDefinitionStorageStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) { } -func (a CustomResourceDefinitionStorageStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList { +func (a customResourceDefinitionStorageStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList { return a.validator.Validate(ctx, obj) } -func (CustomResourceDefinitionStorageStrategy) AllowCreateOnUpdate() bool { +func (customResourceDefinitionStorageStrategy) AllowCreateOnUpdate() bool { return false } -func (CustomResourceDefinitionStorageStrategy) AllowUnconditionalUpdate() bool { +func (customResourceDefinitionStorageStrategy) AllowUnconditionalUpdate() bool { return false } -func (CustomResourceDefinitionStorageStrategy) Canonicalize(obj runtime.Object) { +func (customResourceDefinitionStorageStrategy) Canonicalize(obj runtime.Object) { } -func (a CustomResourceDefinitionStorageStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { +func (a customResourceDefinitionStorageStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { return a.validator.ValidateUpdate(ctx, obj, old) } -func (a CustomResourceDefinitionStorageStrategy) GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { +func (a customResourceDefinitionStorageStrategy) GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) { accessor, err := meta.Accessor(obj) if err != nil { return nil, nil, false, err @@ -102,7 +102,7 @@ func objectMetaFieldsSet(objectMeta metav1.Object, namespaceScoped bool) fields. } } -func (a CustomResourceDefinitionStorageStrategy) MatchCustomResourceDefinitionStorage(label labels.Selector, field fields.Selector) storage.SelectionPredicate { +func (a customResourceDefinitionStorageStrategy) MatchCustomResourceDefinitionStorage(label labels.Selector, field fields.Selector) storage.SelectionPredicate { return storage.SelectionPredicate{ Label: label, Field: field, diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD index ff0bd54d2e08f..42e88f9887f27 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD @@ -14,6 +14,7 @@ go_library( deps = [ "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go index de6e34a74cf8a..b6314b0c5c8a3 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go @@ -19,6 +19,7 @@ package customresourcedefinition import ( "fmt" + apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -46,9 +47,27 @@ func (strategy) NamespaceScoped() bool { } func (strategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) { + crd := obj.(*apiextensions.CustomResourceDefinition) + crd.Status = apiextensions.CustomResourceDefinitionStatus{} + crd.Generation = 1 } func (strategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) { + newCRD := obj.(*apiextensions.CustomResourceDefinition) + oldCRD := old.(*apiextensions.CustomResourceDefinition) + newCRD.Status = oldCRD.Status + + // Any changes to the spec increment the generation number, any changes to the + // status should reflect the generation number of the corresponding object. We push + // the burden of managing the status onto the clients because we can't (in general) + // know here what version of spec the writer of the status has seen. It may seem like + // we can at first -- since obj contains spec -- but in the future we will probably make + // status its own object, and even if we don't, writes may be the result of a + // read-update-write loop, so the contents of spec may not actually be the spec that + // the controller has *seen*. + if !apiequality.Semantic.DeepEqual(oldCRD.Spec, newCRD.Spec) { + newCRD.Generation = oldCRD.Generation + 1 + } } func (strategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList { @@ -87,9 +106,14 @@ func (statusStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old r newObj := obj.(*apiextensions.CustomResourceDefinition) oldObj := old.(*apiextensions.CustomResourceDefinition) newObj.Spec = oldObj.Spec + + // Status updates are for only for updating status, not objectmeta. + // TODO: Update after ResetObjectMetaForStatus is added to meta/v1. newObj.Labels = oldObj.Labels newObj.Annotations = oldObj.Annotations newObj.OwnerReferences = oldObj.OwnerReferences + newObj.Generation = oldObj.Generation + newObj.SelfLink = oldObj.SelfLink } func (statusStrategy) AllowCreateOnUpdate() bool { From c11a9fc95d1c33f91b9d42479d0001c585f9999e Mon Sep 17 00:00:00 2001 From: zhengjiajin Date: Thu, 17 Aug 2017 14:30:46 +0800 Subject: [PATCH 064/403] fix kubectl issue(#52)kubectl run --expose continues after error (missing port) --- pkg/kubectl/cmd/run.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pkg/kubectl/cmd/run.go b/pkg/kubectl/cmd/run.go index 0f27d4273e37e..d9811bd8a7890 100644 --- a/pkg/kubectl/cmd/run.go +++ b/pkg/kubectl/cmd/run.go @@ -176,6 +176,9 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c if interactive && replicas != 1 { return cmdutil.UsageErrorf(cmd, "-i/--stdin requires that replicas is 1, found %d", replicas) } + if cmdutil.GetFlagBool(cmd, "expose") && len(cmdutil.GetFlagString(cmd, "port")) == 0 { + return cmdutil.UsageErrorf(cmd, "--port must be set when exposing a service") + } namespace, _, err := f.DefaultNamespace() if err != nil { @@ -537,11 +540,6 @@ func generateService(f cmdutil.Factory, cmd *cobra.Command, args []string, servi } names := generator.ParamNames() - port := cmdutil.GetFlagString(cmd, "port") - if len(port) == 0 { - return nil, fmt.Errorf("--port must be set when exposing a service") - } - params := map[string]interface{}{} for key, value := range paramsIn { _, isString := value.(string) From 992f6183437e3622e7d69395f7388698cb7ea7a1 Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Wed, 16 Aug 2017 15:17:36 +0800 Subject: [PATCH 065/403] move IsLocalIP() and ShouldSkipService() to pkg/proxy/util --- pkg/proxy/iptables/proxier.go | 35 +---------- pkg/proxy/userspace/proxier.go | 21 +------ pkg/proxy/util/BUILD | 21 ++++++- pkg/proxy/util/utils.go | 58 +++++++++++++++++ pkg/proxy/util/utils_test.go | 111 +++++++++++++++++++++++++++++++++ 5 files changed, 191 insertions(+), 55 deletions(-) create mode 100644 pkg/proxy/util/utils.go create mode 100644 pkg/proxy/util/utils_test.go diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 1c497df967368..6f2e666842771 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -687,20 +687,6 @@ func (proxier *Proxier) OnServiceSynced() { proxier.syncProxyRules() } -func shouldSkipService(svcName types.NamespacedName, service *api.Service) bool { - // if ClusterIP is "None" or empty, skip proxying - if !helper.IsServiceIPSet(service) { - glog.V(3).Infof("Skipping service %s due to clusterIP = %q", svcName, service.Spec.ClusterIP) - return true - } - // Even if ClusterIP is set, ServiceTypeExternalName services don't get proxied - if service.Spec.Type == api.ServiceTypeExternalName { - glog.V(3).Infof("Skipping service %s due to Type=ExternalName", svcName) - return true - } - return false -} - // is updated by this function (based on the given changes). // map is cleared after applying them. func updateServiceMap( @@ -894,7 +880,7 @@ func serviceToServiceMap(service *api.Service) proxyServiceMap { return nil } svcName := types.NamespacedName{Namespace: service.Namespace, Name: service.Name} - if shouldSkipService(svcName, service) { + if utilproxy.ShouldSkipService(svcName, service) { return nil } @@ -1211,7 +1197,7 @@ func (proxier *Proxier) syncProxyRules() { // If the "external" IP happens to be an IP that is local to this // machine, hold the local port open so no other process can open it // (because the socket might open but it would never work). - if local, err := isLocalIP(externalIP); err != nil { + if local, err := utilproxy.IsLocalIP(externalIP); err != nil { glog.Errorf("can't determine if IP is local, assuming not: %v", err) } else if local { lp := localPort{ @@ -1665,23 +1651,6 @@ func writeLine(buf *bytes.Buffer, words ...string) { } } -func isLocalIP(ip string) (bool, error) { - addrs, err := net.InterfaceAddrs() - if err != nil { - return false, err - } - for i := range addrs { - intf, _, err := net.ParseCIDR(addrs[i].String()) - if err != nil { - return false, err - } - if net.ParseIP(ip).Equal(intf) { - return true, nil - } - } - return false, nil -} - func openLocalPort(lp *localPort) (closeable, error) { // For ports on node IPs, open the actual port and hold it, even though we // use iptables to redirect traffic. diff --git a/pkg/proxy/userspace/proxier.go b/pkg/proxy/userspace/proxier.go index 846915f7fbd0f..7d3502ce79d00 100644 --- a/pkg/proxy/userspace/proxier.go +++ b/pkg/proxy/userspace/proxier.go @@ -583,7 +583,7 @@ func (proxier *Proxier) openPortal(service proxy.ServicePortName, info *ServiceI } func (proxier *Proxier) openOnePortal(portal portal, protocol api.Protocol, proxyIP net.IP, proxyPort int, name proxy.ServicePortName) error { - if local, err := isLocalIP(portal.ip); err != nil { + if local, err := utilproxy.IsLocalIP(portal.ip.String()); err != nil { return fmt.Errorf("can't determine if IP %s is local, assuming not: %v", portal.ip, err) } else if local { err := proxier.claimNodePort(portal.ip, portal.port, protocol, name) @@ -761,7 +761,7 @@ func (proxier *Proxier) closePortal(service proxy.ServicePortName, info *Service func (proxier *Proxier) closeOnePortal(portal portal, protocol api.Protocol, proxyIP net.IP, proxyPort int, name proxy.ServicePortName) []error { el := []error{} - if local, err := isLocalIP(portal.ip); err != nil { + if local, err := utilproxy.IsLocalIP(portal.ip.String()); err != nil { el = append(el, fmt.Errorf("can't determine if IP %s is local, assuming not: %v", portal.ip, err)) } else if local { if err := proxier.releaseNodePort(portal.ip, portal.port, protocol, name); err != nil { @@ -832,23 +832,6 @@ func (proxier *Proxier) closeNodePort(nodePort int, protocol api.Protocol, proxy return el } -func isLocalIP(ip net.IP) (bool, error) { - addrs, err := net.InterfaceAddrs() - if err != nil { - return false, err - } - for i := range addrs { - intf, _, err := net.ParseCIDR(addrs[i].String()) - if err != nil { - return false, err - } - if ip.Equal(intf) { - return true, nil - } - } - return false, nil -} - // See comments in the *PortalArgs() functions for some details about why we // use two chains for portals. var iptablesContainerPortalChain iptables.Chain = "KUBE-PORTALS-CONTAINER" diff --git a/pkg/proxy/util/BUILD b/pkg/proxy/util/BUILD index 01c12f6e8d522..9cbb8476aacc1 100644 --- a/pkg/proxy/util/BUILD +++ b/pkg/proxy/util/BUILD @@ -2,16 +2,31 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", - srcs = ["conntrack.go"], + srcs = [ + "conntrack.go", + "utils.go", + ], visibility = ["//visibility:public"], - deps = ["//vendor/k8s.io/utils/exec:go_default_library"], + deps = [ + "//pkg/api:go_default_library", + "//pkg/api/helper:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/utils/exec:go_default_library", + ], ) go_test( name = "go_default_test", - srcs = ["conntrack_test.go"], + srcs = [ + "conntrack_test.go", + "utils_test.go", + ], library = ":go_default_library", deps = [ + "//pkg/api:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", ], diff --git a/pkg/proxy/util/utils.go b/pkg/proxy/util/utils.go new file mode 100644 index 0000000000000..81734f5489271 --- /dev/null +++ b/pkg/proxy/util/utils.go @@ -0,0 +1,58 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "net" + + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/api/helper" + + "github.com/golang/glog" +) + +func IsLocalIP(ip string) (bool, error) { + addrs, err := net.InterfaceAddrs() + if err != nil { + return false, err + } + for i := range addrs { + intf, _, err := net.ParseCIDR(addrs[i].String()) + if err != nil { + return false, err + } + if net.ParseIP(ip).Equal(intf) { + return true, nil + } + } + return false, nil +} + +func ShouldSkipService(svcName types.NamespacedName, service *api.Service) bool { + // if ClusterIP is "None" or empty, skip proxying + if !helper.IsServiceIPSet(service) { + glog.V(3).Infof("Skipping service %s due to clusterIP = %q", svcName, service.Spec.ClusterIP) + return true + } + // Even if ClusterIP is set, ServiceTypeExternalName services don't get proxied + if service.Spec.Type == api.ServiceTypeExternalName { + glog.V(3).Infof("Skipping service %s due to Type=ExternalName", svcName) + return true + } + return false +} diff --git a/pkg/proxy/util/utils_test.go b/pkg/proxy/util/utils_test.go new file mode 100644 index 0000000000000..b57850ae5f98f --- /dev/null +++ b/pkg/proxy/util/utils_test.go @@ -0,0 +1,111 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/api" +) + +func TestShouldSkipService(t *testing.T) { + testCases := []struct { + service *api.Service + svcName types.NamespacedName + shouldSkip bool + }{ + { + // Cluster IP is None + service: &api.Service{ + ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "bar"}, + Spec: api.ServiceSpec{ + ClusterIP: api.ClusterIPNone, + }, + }, + svcName: types.NamespacedName{Namespace: "foo", Name: "bar"}, + shouldSkip: true, + }, + { + // Cluster IP is empty + service: &api.Service{ + ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "bar"}, + Spec: api.ServiceSpec{ + ClusterIP: "", + }, + }, + svcName: types.NamespacedName{Namespace: "foo", Name: "bar"}, + shouldSkip: true, + }, + { + // ExternalName type service + service: &api.Service{ + ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "bar"}, + Spec: api.ServiceSpec{ + ClusterIP: "1.2.3.4", + Type: api.ServiceTypeExternalName, + }, + }, + svcName: types.NamespacedName{Namespace: "foo", Name: "bar"}, + shouldSkip: true, + }, + { + // ClusterIP type service with ClusterIP set + service: &api.Service{ + ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "bar"}, + Spec: api.ServiceSpec{ + ClusterIP: "1.2.3.4", + Type: api.ServiceTypeClusterIP, + }, + }, + svcName: types.NamespacedName{Namespace: "foo", Name: "bar"}, + shouldSkip: false, + }, + { + // NodePort type service with ClusterIP set + service: &api.Service{ + ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "bar"}, + Spec: api.ServiceSpec{ + ClusterIP: "1.2.3.4", + Type: api.ServiceTypeNodePort, + }, + }, + svcName: types.NamespacedName{Namespace: "foo", Name: "bar"}, + shouldSkip: false, + }, + { + // LoadBalancer type service with ClusterIP set + service: &api.Service{ + ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "bar"}, + Spec: api.ServiceSpec{ + ClusterIP: "1.2.3.4", + Type: api.ServiceTypeLoadBalancer, + }, + }, + svcName: types.NamespacedName{Namespace: "foo", Name: "bar"}, + shouldSkip: false, + }, + } + + for i := range testCases { + skip := ShouldSkipService(testCases[i].svcName, testCases[i].service) + if skip != testCases[i].shouldSkip { + t.Errorf("case %d: expect %v, got %v", i, testCases[i].shouldSkip, skip) + } + } +} From 0e441494e75f966d1eb6590e5987457b07aa2a57 Mon Sep 17 00:00:00 2001 From: mathspanda Date: Thu, 17 Aug 2017 15:28:27 +0800 Subject: [PATCH 066/403] verify pkg/util contains no code --- pkg/util/BUILD | 7 ++++++ pkg/util/verify-util-pkg.sh | 48 +++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100755 pkg/util/verify-util-pkg.sh diff --git a/pkg/util/BUILD b/pkg/util/BUILD index a2916a9a1376c..6e6ec60908140 100644 --- a/pkg/util/BUILD +++ b/pkg/util/BUILD @@ -64,3 +64,10 @@ filegroup( ], tags = ["automanaged"], ) + +sh_test( + name = "verify-util-pkg", + size = "small", + srcs = ["verify-util-pkg.sh"], + data = glob(["*.go"]), +) diff --git a/pkg/util/verify-util-pkg.sh b/pkg/util/verify-util-pkg.sh new file mode 100755 index 0000000000000..755924a099af3 --- /dev/null +++ b/pkg/util/verify-util-pkg.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# Copyright 2017 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# verify-util-pkg.sh checks whether *.go except doc.go in pkg/util have been moved into +# sub-pkgs, see issue #15634. + +set -o errexit +set -o nounset +set -o pipefail + +BASH_DIR=$(dirname "${BASH_SOURCE}") + +find_go_files() { + find . -maxdepth 1 -not \( \ + \( \ + -wholename './doc.go' \ + \) -prune \ + \) -name '*.go' +} + +ret=0 + +pushd "${BASH_DIR}" > /dev/null + for path in `find_go_files`; do + file=$(basename $path) + echo "Found pkg/util/${file}, but should be moved into util sub-pkgs." 1>&2 + ret=1 + done +popd > /dev/null + +if [[ ${ret} > 0 ]]; then + exit ${ret} +fi + +echo "Util Package Verified." From a8742a0643003bff89f3f403073c788987e3dee8 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Mon, 7 Aug 2017 10:13:11 +0800 Subject: [PATCH 067/403] fix GPU resource validation incorrectly allows zero limits --- pkg/api/v1/validation/validation.go | 23 +-- pkg/api/v1/validation/validation_test.go | 179 +++++++++++++++++++++++ pkg/api/validation/validation.go | 23 +-- pkg/api/validation/validation_test.go | 15 ++ 4 files changed, 220 insertions(+), 20 deletions(-) create mode 100644 pkg/api/v1/validation/validation_test.go diff --git a/pkg/api/v1/validation/validation.go b/pkg/api/v1/validation/validation.go index c5ef5a431710d..e47b0aa86cdef 100644 --- a/pkg/api/v1/validation/validation.go +++ b/pkg/api/v1/validation/validation.go @@ -46,16 +46,6 @@ func ValidateResourceRequirements(requirements *v1.ResourceRequirements, fldPath // Validate resource quantity. allErrs = append(allErrs, ValidateResourceQuantityValue(string(resourceName), quantity, fldPath)...) - // Check that request <= limit. - requestQuantity, exists := requirements.Requests[resourceName] - if exists { - // Ensure overcommit is allowed for the resource if request != limit - if quantity.Cmp(requestQuantity) != 0 && !v1helper.IsOvercommitAllowed(resourceName) { - allErrs = append(allErrs, field.Invalid(reqPath, requestQuantity.String(), fmt.Sprintf("must be equal to %s limit", resourceName))) - } else if quantity.Cmp(requestQuantity) < 0 { - allErrs = append(allErrs, field.Invalid(limPath, quantity.String(), fmt.Sprintf("must be greater than or equal to %s request", resourceName))) - } - } } for resourceName, quantity := range requirements.Requests { fldPath := reqPath.Key(string(resourceName)) @@ -63,6 +53,19 @@ func ValidateResourceRequirements(requirements *v1.ResourceRequirements, fldPath allErrs = append(allErrs, validateContainerResourceName(string(resourceName), fldPath)...) // Validate resource quantity. allErrs = append(allErrs, ValidateResourceQuantityValue(string(resourceName), quantity, fldPath)...) + + // Check that request <= limit. + limitQuantity, exists := requirements.Limits[resourceName] + if exists { + // For GPUs, not only requests can't exceed limits, they also can't be lower, i.e. must be equal. + if quantity.Cmp(limitQuantity) != 0 && !v1helper.IsOvercommitAllowed(resourceName) { + allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be equal to %s limit", resourceName))) + } else if quantity.Cmp(limitQuantity) > 0 { + allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be less than or equal to %s limit", resourceName))) + } + } else if resourceName == v1.ResourceNvidiaGPU { + allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be equal to %s request", v1.ResourceNvidiaGPU))) + } } return allErrs diff --git a/pkg/api/v1/validation/validation_test.go b/pkg/api/v1/validation/validation_test.go new file mode 100644 index 0000000000000..2a33d7ebdc520 --- /dev/null +++ b/pkg/api/v1/validation/validation_test.go @@ -0,0 +1,179 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package validation + +import ( + "testing" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/apimachinery/pkg/util/validation/field" +) + +func TestValidateResourceRequirements(t *testing.T) { + successCase := []struct { + Name string + requirements v1.ResourceRequirements + }{ + { + Name: "GPU only setting Limits", + requirements: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("10"), + }, + }, + }, + { + Name: "GPU setting Limits equals Requests", + requirements: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("10"), + }, + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("10"), + }, + }, + }, + { + Name: "Resources with GPU with Requests", + requirements: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"), + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("1"), + }, + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"), + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("1"), + }, + }, + }, + { + Name: "Resources with only Limits", + requirements: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"), + v1.ResourceName("my.org/resource"): resource.MustParse("10"), + }, + }, + }, + { + Name: "Resources with only Requests", + requirements: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"), + v1.ResourceName("my.org/resource"): resource.MustParse("10"), + }, + }, + }, + { + Name: "Resources with Requests Less Than Limits", + requirements: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("9"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("9G"), + v1.ResourceName("my.org/resource"): resource.MustParse("9"), + }, + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"), + v1.ResourceName("my.org/resource"): resource.MustParse("9"), + }, + }, + }, + } + for _, tc := range successCase { + if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) != 0 { + t.Errorf("%q unexpected error: %v", tc.Name, errs) + } + } + + errorCase := []struct { + Name string + requirements v1.ResourceRequirements + }{ + { + Name: "GPU only setting Requests", + requirements: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("10"), + }, + }, + }, + { + Name: "GPU setting Limits less than Requests", + requirements: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("10"), + }, + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("11"), + }, + }, + }, + { + Name: "GPU setting Limits larger than Requests", + requirements: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("10"), + }, + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceNvidiaGPU): resource.MustParse("9"), + }, + }, + }, + { + Name: "Resources with Requests Larger Than Limits", + requirements: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("10G"), + v1.ResourceName("my.org/resource"): resource.MustParse("10m"), + }, + Limits: v1.ResourceList{ + v1.ResourceName(v1.ResourceCPU): resource.MustParse("9"), + v1.ResourceName(v1.ResourceMemory): resource.MustParse("9G"), + v1.ResourceName("my.org/resource"): resource.MustParse("9m"), + }, + }, + }, + { + Name: "Invalid Resources with Requests", + requirements: v1.ResourceRequirements{ + Requests: v1.ResourceList{ + v1.ResourceName("my.org"): resource.MustParse("10m"), + }, + }, + }, + { + Name: "Invalid Resources with Limits", + requirements: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceName("my.org"): resource.MustParse("9m"), + }, + }, + }, + } + for _, tc := range errorCase { + if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) == 0 { + t.Errorf("%q expected error", tc.Name) + } + } +} diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index d40d5a048ef92..1384830ec39f3 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -3718,16 +3718,6 @@ func ValidateResourceRequirements(requirements *api.ResourceRequirements, fldPat // Validate resource quantity. allErrs = append(allErrs, ValidateResourceQuantityValue(string(resourceName), quantity, fldPath)...) - // Check that request <= limit. - requestQuantity, exists := requirements.Requests[resourceName] - if exists { - // Ensure overcommit is allowed for the resource if request != limit - if quantity.Cmp(requestQuantity) != 0 && !helper.IsOvercommitAllowed(resourceName) { - allErrs = append(allErrs, field.Invalid(reqPath, requestQuantity.String(), fmt.Sprintf("must be equal to %s limit", resourceName))) - } else if quantity.Cmp(requestQuantity) < 0 { - allErrs = append(allErrs, field.Invalid(limPath, quantity.String(), fmt.Sprintf("must be greater than or equal to %s request", resourceName))) - } - } if resourceName == api.ResourceStorageOverlay && !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) { allErrs = append(allErrs, field.Forbidden(limPath, "ResourceStorageOverlay field disabled by feature-gate for ResourceRequirements")) } @@ -3738,6 +3728,19 @@ func ValidateResourceRequirements(requirements *api.ResourceRequirements, fldPat allErrs = append(allErrs, validateContainerResourceName(string(resourceName), fldPath)...) // Validate resource quantity. allErrs = append(allErrs, ValidateResourceQuantityValue(string(resourceName), quantity, fldPath)...) + + // Check that request <= limit. + limitQuantity, exists := requirements.Limits[resourceName] + if exists { + // For GPUs, not only requests can't exceed limits, they also can't be lower, i.e. must be equal. + if quantity.Cmp(limitQuantity) != 0 && !helper.IsOvercommitAllowed(resourceName) { + allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be equal to %s limit", api.ResourceNvidiaGPU))) + } else if quantity.Cmp(limitQuantity) > 0 { + allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be less than or equal to %s limit", resourceName))) + } + } else if resourceName == api.ResourceNvidiaGPU { + allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be equal to %s request", api.ResourceNvidiaGPU))) + } } return allErrs diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 99b6a68874b47..11264423d1905 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -3631,6 +3631,21 @@ func TestValidateContainers(t *testing.T) { ImagePullPolicy: "IfNotPresent", }, }, + "Resource GPU invalid setting only request": { + { + Name: "gpu-resource-request-limit", + Image: "image", + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceCPU): resource.MustParse("10"), + api.ResourceName(api.ResourceMemory): resource.MustParse("10G"), + api.ResourceName(api.ResourceNvidiaGPU): resource.MustParse("1"), + }, + }, + TerminationMessagePolicy: "File", + ImagePullPolicy: "IfNotPresent", + }, + }, "Request limit simple invalid": { { Name: "abc-123", From fc0bdb5622b8d5422d6537c7bbc4e5cfc36de123 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Wed, 9 Aug 2017 20:51:55 +0800 Subject: [PATCH 068/403] auto-gen --- pkg/api/v1/validation/BUILD | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pkg/api/v1/validation/BUILD b/pkg/api/v1/validation/BUILD index b1bb82a924cc6..14612044e10c1 100644 --- a/pkg/api/v1/validation/BUILD +++ b/pkg/api/v1/validation/BUILD @@ -3,6 +3,7 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( @@ -32,3 +33,15 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["validation_test.go"], + library = ":go_default_library", + tags = ["automanaged"], + deps = [ + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + ], +) From 75258b2763191f0de7a23f2de5075f33ae61e9d5 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Thu, 10 Aug 2017 11:45:09 +0800 Subject: [PATCH 069/403] update testcase err msg --- pkg/api/validation/validation_test.go | 2 +- pkg/quota/evaluator/core/pods_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 11264423d1905..400dc4a84e027 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -5060,7 +5060,7 @@ func TestValidatePod(t *testing.T) { }, }, "invalid opaque integer resource requirement: request must be <= limit": { - expectedError: "must be greater than or equal to pod.alpha.kubernetes.io/opaque-int-resource-A", + expectedError: "must be less than or equal to pod.alpha.kubernetes.io/opaque-int-resource-A", spec: api.Pod{ ObjectMeta: metav1.ObjectMeta{Name: "123", Namespace: "ns"}, Spec: api.PodSpec{ diff --git a/pkg/quota/evaluator/core/pods_test.go b/pkg/quota/evaluator/core/pods_test.go index b947e1f3229b5..061aa3258372e 100644 --- a/pkg/quota/evaluator/core/pods_test.go +++ b/pkg/quota/evaluator/core/pods_test.go @@ -42,7 +42,7 @@ func TestPodConstraintsFunc(t *testing.T) { }}, }, }, - err: `spec.initContainers[0].resources.limits: Invalid value: "1m": must be greater than or equal to cpu request`, + err: `spec.initContainers[0].resources.requests: Invalid value: "2m": must be less than or equal to cpu limit`, }, "container resource invalid": { pod: &api.Pod{ @@ -55,7 +55,7 @@ func TestPodConstraintsFunc(t *testing.T) { }}, }, }, - err: `spec.containers[0].resources.limits: Invalid value: "1m": must be greater than or equal to cpu request`, + err: `spec.containers[0].resources.requests: Invalid value: "2m": must be less than or equal to cpu limit`, }, "init container resource missing": { pod: &api.Pod{ From 589c90a439c7b1555d24066cb9cc75248d4659f5 Mon Sep 17 00:00:00 2001 From: Ti Zhou Date: Thu, 17 Aug 2017 16:48:26 +0800 Subject: [PATCH 070/403] Fixed several typos in CHANGELOG.md. --- CHANGELOG.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d9199e67fbfd..8ea3f5b7316b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2574,7 +2574,7 @@ filename | sha256 hash * AWS: Avoid spurious ELB listener recreation - ignore case when matching protocol ([#47391](https://github.com/kubernetes/kubernetes/pull/47391), [@justinsb](https://github.com/justinsb)) * gce kube-up: The `Node` authorization mode and `NodeRestriction` admission controller are now enabled ([#46796](https://github.com/kubernetes/kubernetes/pull/46796), [@mikedanese](https://github.com/mikedanese)) * update gophercloud/gophercloud dependency for reauthentication fixes ([#45545](https://github.com/kubernetes/kubernetes/pull/45545), [@stuart-warren](https://github.com/stuart-warren)) -* fix sync loop health check with seperating runtime errors ([#47124](https://github.com/kubernetes/kubernetes/pull/47124), [@andyxning](https://github.com/andyxning)) +* fix sync loop health check with separating runtime errors ([#47124](https://github.com/kubernetes/kubernetes/pull/47124), [@andyxning](https://github.com/andyxning)) * servicecontroller: Fix node selection logic on initial LB creation ([#45773](https://github.com/kubernetes/kubernetes/pull/45773), [@justinsb](https://github.com/justinsb)) * Fix iSCSI iSER mounting. ([#47281](https://github.com/kubernetes/kubernetes/pull/47281), [@mtanino](https://github.com/mtanino)) * StorageOS Volume Driver ([#42156](https://github.com/kubernetes/kubernetes/pull/42156), [@croomes](https://github.com/croomes)) @@ -2836,7 +2836,7 @@ filename | sha256 hash * AWS: Avoid spurious ELB listener recreation - ignore case when matching protocol ([#47391](https://github.com/kubernetes/kubernetes/pull/47391), [@justinsb](https://github.com/justinsb)) * gce kube-up: The `Node` authorization mode and `NodeRestriction` admission controller are now enabled ([#46796](https://github.com/kubernetes/kubernetes/pull/46796), [@mikedanese](https://github.com/mikedanese)) * update gophercloud/gophercloud dependency for reauthentication fixes ([#45545](https://github.com/kubernetes/kubernetes/pull/45545), [@stuart-warren](https://github.com/stuart-warren)) -* fix sync loop health check with seperating runtime errors ([#47124](https://github.com/kubernetes/kubernetes/pull/47124), [@andyxning](https://github.com/andyxning)) +* fix sync loop health check with separating runtime errors ([#47124](https://github.com/kubernetes/kubernetes/pull/47124), [@andyxning](https://github.com/andyxning)) * servicecontroller: Fix node selection logic on initial LB creation ([#45773](https://github.com/kubernetes/kubernetes/pull/45773), [@justinsb](https://github.com/justinsb)) * Fix iSCSI iSER mounting. ([#47281](https://github.com/kubernetes/kubernetes/pull/47281), [@mtanino](https://github.com/mtanino)) * StorageOS Volume Driver ([#42156](https://github.com/kubernetes/kubernetes/pull/42156), [@croomes](https://github.com/croomes)) @@ -3775,7 +3775,7 @@ filename | sha256 hash * Adds annotations to all Federation objects created by kubefed. ([#42683](https://github.com/kubernetes/kubernetes/pull/42683), [@perotinus](https://github.com/perotinus)) * [Federation][Kubefed] Bug fix to enable disabling federation controllers through override args ([#44209](https://github.com/kubernetes/kubernetes/pull/44209), [@irfanurrehman](https://github.com/irfanurrehman)) * [Federation] Remove deprecated federation-apiserver-kubeconfig secret ([#44287](https://github.com/kubernetes/kubernetes/pull/44287), [@shashidharatd](https://github.com/shashidharatd)) -* Scheduler can recieve its policy configuration from a ConfigMap ([#43892](https://github.com/kubernetes/kubernetes/pull/43892), [@bsalamat](https://github.com/bsalamat)) +* Scheduler can receive its policy configuration from a ConfigMap ([#43892](https://github.com/kubernetes/kubernetes/pull/43892), [@bsalamat](https://github.com/bsalamat)) * AWS cloud provider: fix support running the master with a different AWS account or even on a different cloud provider than the nodes. ([#44235](https://github.com/kubernetes/kubernetes/pull/44235), [@mrIncompetent](https://github.com/mrIncompetent)) * add rancher credential provider ([#40160](https://github.com/kubernetes/kubernetes/pull/40160), [@wlan0](https://github.com/wlan0)) * Support generating Open API extensions for strategic merge patch tags in go struct tags ([#44121](https://github.com/kubernetes/kubernetes/pull/44121), [@mbohlool](https://github.com/mbohlool)) @@ -4324,7 +4324,7 @@ Features for this release were tracked via the use of the [kubernetes/features]( * Remove the deprecated vsphere kube-up. ([#39140](https://github.com/kubernetes/kubernetes/pull/39140), [@kerneltime](https://github.com/kerneltime)) ### kubeadm -* Quite a few flags been renamed or removed. Those options that are removed as flags can still be accessed via the config file. Most noteably this includes external etcd settings and the option for setting the cloud provider on the API server. The [kubeadm reference documentation](https://kubernetes.io/docs/admin/kubeadm/) is up to date with the new flags. +* Quite a few flags been renamed or removed. Those options that are removed as flags can still be accessed via the config file. Most notably this includes external etcd settings and the option for setting the cloud provider on the API server. The [kubeadm reference documentation](https://kubernetes.io/docs/admin/kubeadm/) is up to date with the new flags. ### Other Deprecations * Remove cmd/kube-discovery from the tree since it's not necessary anymore ([#42070](https://github.com/kubernetes/kubernetes/pull/42070), [@luxas](https://github.com/luxas)) @@ -6380,7 +6380,7 @@ release [38537](https://github.com/kubernetes/kubernetes/issues/38537) * extensions/v1beta1.Jobs is deprecated, use batch/v1.Job instead ([#36355](https://github.com/kubernetes/kubernetes/pull/36355), [@soltysh](https://github.com/soltysh)) * The kubelet --reconcile-cdir flag is deprecated because it has no function anymore. ([#35523](https://github.com/kubernetes/kubernetes/pull/35523), [@luxas](https://github.com/luxas)) * Notice of deprecation for recycler [#36760](https://github.com/kubernetes/kubernetes/pull/36760) -* The init-container (pod.beta.kubernetes.io/init-containers) annotations used to accept capitalized field names that could be accidently generated by the k8s.io/kubernetes/pkg/api package. Using an upper case field name will now return an error and all users should use the versioned API types from `pkg/api/v1` when serializing from Golang. +* The init-container (pod.beta.kubernetes.io/init-containers) annotations used to accept capitalized field names that could be accidentally generated by the k8s.io/kubernetes/pkg/api package. Using an upper case field name will now return an error and all users should use the versioned API types from `pkg/api/v1` when serializing from Golang. ## Action Required Before Upgrading @@ -7599,7 +7599,7 @@ This is the first release tracked via the use of the [kubernetes/features](https - **Scheduling** - [alpha] Allows pods to require or prohibit (or prefer or prefer not) co-scheduling on the same node (or zone or other topology domain) as another set of pods. ([docs](http://kubernetes.io/docs/user-guide/node-selection/) ([kubernetes/features#51](https://github.com/kubernetes/features/issues/51)) - **Storage** - - [beta] Persistant Volume provisioning now supports multiple provisioners using StorageClass configuration. ([docs](http://kubernetes.io/docs/user-guide/persistent-volumes/)) ([kubernetes/features#36](https://github.com/kubernetes/features/issues/36)) + - [beta] Persistent Volume provisioning now supports multiple provisioners using StorageClass configuration. ([docs](http://kubernetes.io/docs/user-guide/persistent-volumes/)) ([kubernetes/features#36](https://github.com/kubernetes/features/issues/36)) - [stable] New volume plugin for the Quobyte Distributed File System ([docs](http://kubernetes.io/docs/user-guide/volumes/#quobyte)) ([kubernetes/features#80](https://github.com/kubernetes/features/issues/80)) - [stable] New volume plugin for Azure Data Disk ([docs](http://kubernetes.io/docs/user-guide/volumes/#azurediskvolume)) ([kubernetes/features#79](https://github.com/kubernetes/features/issues/79)) - **UI** From 0504cfbc2556155c31e5db43673d6b903c64dfa2 Mon Sep 17 00:00:00 2001 From: gmarek Date: Fri, 4 Aug 2017 17:04:14 +0200 Subject: [PATCH 071/403] Make metav1.(Micro)?Time functions take pointers --- .../job/jobcontroller.go | 6 ++--- pkg/api/pod/util.go | 4 ++-- pkg/api/v1/pod/util.go | 4 ++-- pkg/controller/controller_utils.go | 24 +++++++++---------- pkg/controller/cronjob/utils.go | 4 ++-- pkg/controller/daemon/daemon_controller.go | 8 +++---- pkg/controller/job/job_controller.go | 4 ++-- pkg/controller/podgc/gc_controller.go | 4 ++-- .../replication_controller_utils.go | 4 ++-- .../statefulset/stateful_set_utils.go | 4 ++-- pkg/kubectl/sorting_printer.go | 3 ++- pkg/kubelet/status/status_manager_test.go | 6 ++--- pkg/kubelet/util/sliceutils/sliceutils.go | 2 +- .../pkg/api/validation/objectmeta.go | 2 +- .../pkg/apis/meta/v1/micro_time.go | 12 +++++----- .../apimachinery/pkg/apis/meta/v1/time.go | 4 ++-- .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 12 ++++++---- ...pis_meta_v1_unstructed_unstructure_test.go | 4 ++-- .../pkg/registry/rest/resttest/resttest.go | 2 +- .../tools/record/events_cache_test.go | 2 +- test/e2e/framework/kubelet_stats.go | 2 +- test/e2e/framework/util.go | 4 ++-- test/e2e/scalability/density.go | 2 +- 23 files changed, 64 insertions(+), 59 deletions(-) diff --git a/federation/pkg/federation-controller/job/jobcontroller.go b/federation/pkg/federation-controller/job/jobcontroller.go index d3977182fc1e9..368ca1c396cee 100644 --- a/federation/pkg/federation-controller/job/jobcontroller.go +++ b/federation/pkg/federation-controller/job/jobcontroller.go @@ -468,12 +468,12 @@ func (fjc *FederationJobController) reconcileJob(key string) (reconciliationStat for _, condition := range currentLjob.Status.Conditions { if condition.Type == batchv1.JobComplete { if fedStatusCompleteCondition == nil || - fedStatusCompleteCondition.LastTransitionTime.Before(condition.LastTransitionTime) { + fedStatusCompleteCondition.LastTransitionTime.Before(&condition.LastTransitionTime) { fedStatusCompleteCondition = &condition } } else if condition.Type == batchv1.JobFailed { if fedStatusFailedCondition == nil || - fedStatusFailedCondition.LastTransitionTime.Before(condition.LastTransitionTime) { + fedStatusFailedCondition.LastTransitionTime.Before(&condition.LastTransitionTime) { fedStatusFailedCondition = &condition } } @@ -484,7 +484,7 @@ func (fjc *FederationJobController) reconcileJob(key string) (reconciliationStat } } if currentLjob.Status.CompletionTime != nil { - if fedStatus.CompletionTime == nil || fedStatus.CompletionTime.Before(*currentLjob.Status.CompletionTime) { + if fedStatus.CompletionTime == nil || fedStatus.CompletionTime.Before(currentLjob.Status.CompletionTime) { fedStatus.CompletionTime = currentLjob.Status.CompletionTime } } diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index 5489171586ac0..9dc4fa68ee9cb 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -218,8 +218,8 @@ func UpdatePodCondition(status *api.PodStatus, condition *api.PodCondition) bool isEqual := condition.Status == oldCondition.Status && condition.Reason == oldCondition.Reason && condition.Message == oldCondition.Message && - condition.LastProbeTime.Equal(oldCondition.LastProbeTime) && - condition.LastTransitionTime.Equal(oldCondition.LastTransitionTime) + condition.LastProbeTime.Equal(&oldCondition.LastProbeTime) && + condition.LastTransitionTime.Equal(&oldCondition.LastTransitionTime) status.Conditions[conditionIndex] = *condition // Return true if one of the fields have changed. diff --git a/pkg/api/v1/pod/util.go b/pkg/api/v1/pod/util.go index b5ddb1ca2d96b..9e869c573d840 100644 --- a/pkg/api/v1/pod/util.go +++ b/pkg/api/v1/pod/util.go @@ -348,8 +348,8 @@ func UpdatePodCondition(status *v1.PodStatus, condition *v1.PodCondition) bool { isEqual := condition.Status == oldCondition.Status && condition.Reason == oldCondition.Reason && condition.Message == oldCondition.Message && - condition.LastProbeTime.Equal(oldCondition.LastProbeTime) && - condition.LastTransitionTime.Equal(oldCondition.LastTransitionTime) + condition.LastProbeTime.Equal(&oldCondition.LastProbeTime) && + condition.LastTransitionTime.Equal(&oldCondition.LastTransitionTime) status.Conditions[conditionIndex] = *condition // Return true if one of the fields have changed. diff --git a/pkg/controller/controller_utils.go b/pkg/controller/controller_utils.go index d331ccf3f6ed6..9cc94014a65da 100644 --- a/pkg/controller/controller_utils.go +++ b/pkg/controller/controller_utils.go @@ -711,8 +711,8 @@ func (s ByLogging) Less(i, j int) bool { return maxContainerRestarts(s[i]) > maxContainerRestarts(s[j]) } // 6. older pods < newer pods < empty timestamp pods - if !s[i].CreationTimestamp.Equal(s[j].CreationTimestamp) { - return afterOrZero(s[j].CreationTimestamp, s[i].CreationTimestamp) + if !s[i].CreationTimestamp.Equal(&s[j].CreationTimestamp) { + return afterOrZero(&s[j].CreationTimestamp, &s[i].CreationTimestamp) } return false } @@ -751,31 +751,31 @@ func (s ActivePods) Less(i, j int) bool { return maxContainerRestarts(s[i]) > maxContainerRestarts(s[j]) } // 6. Empty creation time pods < newer pods < older pods - if !s[i].CreationTimestamp.Equal(s[j].CreationTimestamp) { - return afterOrZero(s[i].CreationTimestamp, s[j].CreationTimestamp) + if !s[i].CreationTimestamp.Equal(&s[j].CreationTimestamp) { + return afterOrZero(&s[i].CreationTimestamp, &s[j].CreationTimestamp) } return false } // afterOrZero checks if time t1 is after time t2; if one of them // is zero, the zero time is seen as after non-zero time. -func afterOrZero(t1, t2 metav1.Time) bool { +func afterOrZero(t1, t2 *metav1.Time) bool { if t1.Time.IsZero() || t2.Time.IsZero() { return t1.Time.IsZero() } return t1.After(t2.Time) } -func podReadyTime(pod *v1.Pod) metav1.Time { +func podReadyTime(pod *v1.Pod) *metav1.Time { if podutil.IsPodReady(pod) { for _, c := range pod.Status.Conditions { // we only care about pod ready conditions if c.Type == v1.PodReady && c.Status == v1.ConditionTrue { - return c.LastTransitionTime + return &c.LastTransitionTime } } } - return metav1.Time{} + return &metav1.Time{} } func maxContainerRestarts(pod *v1.Pod) int { @@ -841,10 +841,10 @@ type ControllersByCreationTimestamp []*v1.ReplicationController func (o ControllersByCreationTimestamp) Len() int { return len(o) } func (o ControllersByCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o ControllersByCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { + if o[i].CreationTimestamp.Equal(&o[j].CreationTimestamp) { return o[i].Name < o[j].Name } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) + return o[i].CreationTimestamp.Before(&o[j].CreationTimestamp) } // ReplicaSetsByCreationTimestamp sorts a list of ReplicaSet by creation timestamp, using their names as a tie breaker. @@ -853,10 +853,10 @@ type ReplicaSetsByCreationTimestamp []*extensions.ReplicaSet func (o ReplicaSetsByCreationTimestamp) Len() int { return len(o) } func (o ReplicaSetsByCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o ReplicaSetsByCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { + if o[i].CreationTimestamp.Equal(&o[j].CreationTimestamp) { return o[i].Name < o[j].Name } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) + return o[i].CreationTimestamp.Before(&o[j].CreationTimestamp) } // ReplicaSetsBySizeOlder sorts a list of ReplicaSet by size in descending order, using their creation timestamp or name as a tie breaker. diff --git a/pkg/controller/cronjob/utils.go b/pkg/controller/cronjob/utils.go index dbdd8dd96c8db..cbe9cb6239943 100644 --- a/pkg/controller/cronjob/utils.go +++ b/pkg/controller/cronjob/utils.go @@ -251,9 +251,9 @@ func (o byJobStartTime) Less(i, j int) bool { return o[i].Status.StartTime != nil } - if (*o[i].Status.StartTime).Equal(*o[j].Status.StartTime) { + if o[i].Status.StartTime.Equal(o[j].Status.StartTime) { return o[i].Name < o[j].Name } - return (*o[i].Status.StartTime).Before(*o[j].Status.StartTime) + return o[i].Status.StartTime.Before(o[j].Status.StartTime) } diff --git a/pkg/controller/daemon/daemon_controller.go b/pkg/controller/daemon/daemon_controller.go index 93673f07766cd..7f7674be6d286 100644 --- a/pkg/controller/daemon/daemon_controller.go +++ b/pkg/controller/daemon/daemon_controller.go @@ -1366,10 +1366,10 @@ func (o byCreationTimestamp) Len() int { return len(o) } func (o byCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o byCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { + if o[i].CreationTimestamp.Equal(&o[j].CreationTimestamp) { return o[i].Name < o[j].Name } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) + return o[i].CreationTimestamp.Before(&o[j].CreationTimestamp) } type podByCreationTimestamp []*v1.Pod @@ -1378,8 +1378,8 @@ func (o podByCreationTimestamp) Len() int { return len(o) } func (o podByCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o podByCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { + if o[i].CreationTimestamp.Equal(&o[j].CreationTimestamp) { return o[i].Name < o[j].Name } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) + return o[i].CreationTimestamp.Before(&o[j].CreationTimestamp) } diff --git a/pkg/controller/job/job_controller.go b/pkg/controller/job/job_controller.go index 6ed99e36d63d1..2a239a703276a 100644 --- a/pkg/controller/job/job_controller.go +++ b/pkg/controller/job/job_controller.go @@ -685,8 +685,8 @@ func (o byCreationTimestamp) Len() int { return len(o) } func (o byCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o byCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { + if o[i].CreationTimestamp.Equal(&o[j].CreationTimestamp) { return o[i].Name < o[j].Name } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) + return o[i].CreationTimestamp.Before(&o[j].CreationTimestamp) } diff --git a/pkg/controller/podgc/gc_controller.go b/pkg/controller/podgc/gc_controller.go index c3e7e074ff46b..76179b736b2e7 100644 --- a/pkg/controller/podgc/gc_controller.go +++ b/pkg/controller/podgc/gc_controller.go @@ -193,8 +193,8 @@ func (o byCreationTimestamp) Len() int { return len(o) } func (o byCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o byCreationTimestamp) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { + if o[i].CreationTimestamp.Equal(&o[j].CreationTimestamp) { return o[i].Name < o[j].Name } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) + return o[i].CreationTimestamp.Before(&o[j].CreationTimestamp) } diff --git a/pkg/controller/replication/replication_controller_utils.go b/pkg/controller/replication/replication_controller_utils.go index 943679b4fee1c..625317becb390 100644 --- a/pkg/controller/replication/replication_controller_utils.go +++ b/pkg/controller/replication/replication_controller_utils.go @@ -86,10 +86,10 @@ func (o OverlappingControllers) Len() int { return len(o) } func (o OverlappingControllers) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o OverlappingControllers) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { + if o[i].CreationTimestamp.Equal(&o[j].CreationTimestamp) { return o[i].Name < o[j].Name } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) + return o[i].CreationTimestamp.Before(&o[j].CreationTimestamp) } func calculateStatus(rc *v1.ReplicationController, filteredPods []*v1.Pod, manageReplicasErr error) v1.ReplicationControllerStatus { diff --git a/pkg/controller/statefulset/stateful_set_utils.go b/pkg/controller/statefulset/stateful_set_utils.go index e210cc915d570..487f7104a935b 100644 --- a/pkg/controller/statefulset/stateful_set_utils.go +++ b/pkg/controller/statefulset/stateful_set_utils.go @@ -50,10 +50,10 @@ func (o overlappingStatefulSets) Len() int { return len(o) } func (o overlappingStatefulSets) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o overlappingStatefulSets) Less(i, j int) bool { - if o[i].CreationTimestamp.Equal(o[j].CreationTimestamp) { + if o[i].CreationTimestamp.Equal(&o[j].CreationTimestamp) { return o[i].Name < o[j].Name } - return o[i].CreationTimestamp.Before(o[j].CreationTimestamp) + return o[i].CreationTimestamp.Before(&o[j].CreationTimestamp) } // statefulPodRegex is a regular expression that extracts the parent StatefulSet and ordinal from the Name of a Pod diff --git a/pkg/kubectl/sorting_printer.go b/pkg/kubectl/sorting_printer.go index 9226a213e2c24..f1330e3582bfa 100644 --- a/pkg/kubectl/sorting_printer.go +++ b/pkg/kubectl/sorting_printer.go @@ -188,7 +188,8 @@ func isLess(i, j reflect.Value) (bool, error) { // sort metav1.Time in := i.Interface() if t, ok := in.(metav1.Time); ok { - return t.Before(j.Interface().(metav1.Time)), nil + time := j.Interface().(metav1.Time) + return t.Before(&time), nil } // fallback to the fields comparison for idx := 0; idx < i.NumField(); idx++ { diff --git a/pkg/kubelet/status/status_manager_test.go b/pkg/kubelet/status/status_manager_test.go index 23148065c4900..dff67680e03a6 100644 --- a/pkg/kubelet/status/status_manager_test.go +++ b/pkg/kubelet/status/status_manager_test.go @@ -214,7 +214,7 @@ func TestChangedStatusKeepsStartTime(t *testing.T) { t.Errorf("StartTime should not be zero") } expected := now.Rfc3339Copy() - if !finalStatus.StartTime.Equal(expected) { + if !finalStatus.StartTime.Equal(&expected) { t.Errorf("Expected %v, but got %v", expected, finalStatus.StartTime) } } @@ -244,7 +244,7 @@ func TestChangedStatusUpdatesLastTransitionTime(t *testing.T) { if newReadyCondition.LastTransitionTime.IsZero() { t.Errorf("Unexpected: last transition time not set") } - if newReadyCondition.LastTransitionTime.Before(oldReadyCondition.LastTransitionTime) { + if newReadyCondition.LastTransitionTime.Before(&oldReadyCondition.LastTransitionTime) { t.Errorf("Unexpected: new transition time %s, is before old transition time %s", newReadyCondition.LastTransitionTime, oldReadyCondition.LastTransitionTime) } } @@ -283,7 +283,7 @@ func TestUnchangedStatusPreservesLastTransitionTime(t *testing.T) { if newReadyCondition.LastTransitionTime.IsZero() { t.Errorf("Unexpected: last transition time not set") } - if !oldReadyCondition.LastTransitionTime.Equal(newReadyCondition.LastTransitionTime) { + if !oldReadyCondition.LastTransitionTime.Equal(&newReadyCondition.LastTransitionTime) { t.Errorf("Unexpected: new transition time %s, is not equal to old transition time %s", newReadyCondition.LastTransitionTime, oldReadyCondition.LastTransitionTime) } } diff --git a/pkg/kubelet/util/sliceutils/sliceutils.go b/pkg/kubelet/util/sliceutils/sliceutils.go index f1a56e9e48fad..ff9fb56031f51 100644 --- a/pkg/kubelet/util/sliceutils/sliceutils.go +++ b/pkg/kubelet/util/sliceutils/sliceutils.go @@ -44,7 +44,7 @@ func (s PodsByCreationTime) Swap(i, j int) { } func (s PodsByCreationTime) Less(i, j int) bool { - return s[i].CreationTimestamp.Before(s[j].CreationTimestamp) + return s[i].CreationTimestamp.Before(&s[j].CreationTimestamp) } // ByImageSize makes an array of images sortable by their size in descending diff --git a/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go b/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go index 84bd9cdedc6b8..780c31c476cdd 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go @@ -288,7 +288,7 @@ func ValidateObjectMetaAccessorUpdate(newMeta, oldMeta metav1.Object, fldPath *f if newMeta.GetDeletionGracePeriodSeconds() != nil && (oldMeta.GetDeletionGracePeriodSeconds() == nil || *newMeta.GetDeletionGracePeriodSeconds() != *oldMeta.GetDeletionGracePeriodSeconds()) { allErrs = append(allErrs, field.Invalid(fldPath.Child("deletionGracePeriodSeconds"), newMeta.GetDeletionGracePeriodSeconds(), "field is immutable; may only be changed via deletion")) } - if newMeta.GetDeletionTimestamp() != nil && (oldMeta.GetDeletionTimestamp() == nil || !newMeta.GetDeletionTimestamp().Equal(*oldMeta.GetDeletionTimestamp())) { + if newMeta.GetDeletionTimestamp() != nil && (oldMeta.GetDeletionTimestamp() == nil || !newMeta.GetDeletionTimestamp().Equal(oldMeta.GetDeletionTimestamp())) { allErrs = append(allErrs, field.Invalid(fldPath.Child("deletionTimestamp"), newMeta.GetDeletionTimestamp(), "field is immutable; may only be changed via deletion")) } diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go index cdfbcb54fda15..dbe206704f891 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go @@ -40,8 +40,8 @@ type MicroTime struct { // DeepCopy returns a deep-copy of the MicroTime value. The underlying time.Time // type is effectively immutable in the time API, so it is safe to // copy-by-assign, despite the presence of (unexported) Pointer fields. -func (t MicroTime) DeepCopy() MicroTime { - return t +func (t *MicroTime) DeepCopyInto(out *MicroTime) { + *out = *t } // String returns the representation of the time. @@ -74,22 +74,22 @@ func (t *MicroTime) IsZero() bool { } // Before reports whether the time instant t is before u. -func (t MicroTime) Before(u MicroTime) bool { +func (t *MicroTime) Before(u *MicroTime) bool { return t.Time.Before(u.Time) } // Equal reports whether the time instant t is equal to u. -func (t MicroTime) Equal(u MicroTime) bool { +func (t *MicroTime) Equal(u *MicroTime) bool { return t.Time.Equal(u.Time) } // BeforeTime reports whether the time instant t is before second-lever precision u. -func (t MicroTime) BeforeTime(u Time) bool { +func (t *MicroTime) BeforeTime(u *Time) bool { return t.Time.Before(u.Time) } // EqualTime reports whether the time instant t is equal to second-lever precision u. -func (t MicroTime) EqualTime(u Time) bool { +func (t *MicroTime) EqualTime(u *Time) bool { return t.Time.Equal(u.Time) } diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/time.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/time.go index c73d7ca633549..435f6a8f59946 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/time.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/time.go @@ -74,12 +74,12 @@ func (t *Time) IsZero() bool { } // Before reports whether the time instant t is before u. -func (t Time) Before(u Time) bool { +func (t *Time) Before(u *Time) bool { return t.Time.Before(u.Time) } // Equal reports whether the time instant t is equal to u. -func (t Time) Equal(u Time) bool { +func (t *Time) Equal(u *Time) bool { return t.Time.Equal(u.Time) } diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go index 20d7ff391116a..c73e777b50b56 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go @@ -778,10 +778,14 @@ func (in *ListOptions) DeepCopyObject() runtime.Object { } } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MicroTime) DeepCopyInto(out *MicroTime) { - *out = in.DeepCopy() - return +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MicroTime. +func (in *MicroTime) DeepCopy() *MicroTime { + if in == nil { + return nil + } + out := new(MicroTime) + in.DeepCopyInto(out) + return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. diff --git a/staging/src/k8s.io/apimachinery/pkg/test/apis_meta_v1_unstructed_unstructure_test.go b/staging/src/k8s.io/apimachinery/pkg/test/apis_meta_v1_unstructed_unstructure_test.go index d6436214c7abd..338206d42c005 100644 --- a/staging/src/k8s.io/apimachinery/pkg/test/apis_meta_v1_unstructed_unstructure_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/test/apis_meta_v1_unstructed_unstructure_test.go @@ -206,11 +206,11 @@ func TestUnstructuredGetters(t *testing.T) { t.Errorf("GetSelfLink() = %s, want %s", got, want) } - if got, want := unstruct.GetCreationTimestamp(), metav1.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC); !got.Equal(want) { + if got, want := unstruct.GetCreationTimestamp(), metav1.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC); !got.Equal(&want) { t.Errorf("GetCreationTimestamp() = %s, want %s", got, want) } - if got, want := unstruct.GetDeletionTimestamp(), metav1.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC); got == nil || !got.Equal(want) { + if got, want := unstruct.GetDeletionTimestamp(), metav1.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC); got == nil || !got.Equal(&want) { t.Errorf("GetDeletionTimestamp() = %s, want %s", got, want) } diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/resttest.go b/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/resttest.go index 45dbaa9e0e50c..26f243972badb 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/resttest.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/resttest.go @@ -1044,7 +1044,7 @@ func (t *Tester) testDeleteGracefulShorten(obj runtime.Object, createFn CreateFu } objectMeta = t.getObjectMetaOrFail(object) if objectMeta.GetDeletionTimestamp() == nil || objectMeta.GetDeletionGracePeriodSeconds() == nil || - *objectMeta.GetDeletionGracePeriodSeconds() != expectedGrace || !objectMeta.GetDeletionTimestamp().Before(deletionTimestamp) { + *objectMeta.GetDeletionGracePeriodSeconds() != expectedGrace || !objectMeta.GetDeletionTimestamp().Before(&deletionTimestamp) { t.Errorf("unexpected deleted meta: %#v", objectMeta) } } diff --git a/staging/src/k8s.io/client-go/tools/record/events_cache_test.go b/staging/src/k8s.io/client-go/tools/record/events_cache_test.go index 799d6a77b2b19..c0063f9d42ad1 100644 --- a/staging/src/k8s.io/client-go/tools/record/events_cache_test.go +++ b/staging/src/k8s.io/client-go/tools/record/events_cache_test.go @@ -102,7 +102,7 @@ func validateEvent(messagePrefix string, actualEvent *v1.Event, expectedEvent *v } actualFirstTimestamp := recvEvent.FirstTimestamp actualLastTimestamp := recvEvent.LastTimestamp - if actualFirstTimestamp.Equal(actualLastTimestamp) { + if actualFirstTimestamp.Equal(&actualLastTimestamp) { if expectCompression { t.Errorf("%v - FirstTimestamp (%q) and LastTimestamp (%q) must be different to indicate event compression happened, but were the same. Actual Event: %#v", messagePrefix, actualFirstTimestamp, actualLastTimestamp, recvEvent) } diff --git a/test/e2e/framework/kubelet_stats.go b/test/e2e/framework/kubelet_stats.go index 57c0193c5f1a3..277a70ed0a230 100644 --- a/test/e2e/framework/kubelet_stats.go +++ b/test/e2e/framework/kubelet_stats.go @@ -618,7 +618,7 @@ func (r *resourceCollector) collectStats(oldStatsMap map[string]*stats.Container } if oldStats, ok := oldStatsMap[name]; ok { - if oldStats.CPU.Time.Equal(cStats.CPU.Time) { + if oldStats.CPU.Time.Equal(&cStats.CPU.Time) { // No change -> skip this stat. continue } diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index 08c35173b578b..5d4e9c255229c 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -2282,10 +2282,10 @@ func (o byFirstTimestamp) Len() int { return len(o) } func (o byFirstTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o byFirstTimestamp) Less(i, j int) bool { - if o[i].FirstTimestamp.Equal(o[j].FirstTimestamp) { + if o[i].FirstTimestamp.Equal(&o[j].FirstTimestamp) { return o[i].InvolvedObject.Name < o[j].InvolvedObject.Name } - return o[i].FirstTimestamp.Before(o[j].FirstTimestamp) + return o[i].FirstTimestamp.Before(&o[j].FirstTimestamp) } func dumpAllPodInfo(c clientset.Interface) { diff --git a/test/e2e/scalability/density.go b/test/e2e/scalability/density.go index 0d584781b1049..202c0ef499280 100644 --- a/test/e2e/scalability/density.go +++ b/test/e2e/scalability/density.go @@ -582,7 +582,7 @@ var _ = SIGDescribe("Density", func() { var startTime metav1.Time for _, cs := range p.Status.ContainerStatuses { if cs.State.Running != nil { - if startTime.Before(cs.State.Running.StartedAt) { + if startTime.Before(&cs.State.Running.StartedAt) { startTime = cs.State.Running.StartedAt } } From 9af36181263833ca0541a70e63676149fe6e5859 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 16 Aug 2017 14:48:48 +0200 Subject: [PATCH 072/403] Rename k8s.io/{kube-gen -> code-generator} --- .../src/k8s.io/{kube-gen => code-generator}/Godeps/Godeps.json | 0 staging/src/k8s.io/{kube-gen => code-generator}/Godeps/Readme | 0 staging/src/k8s.io/{kube-gen => code-generator}/OWNERS | 0 .../src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/BUILD | 0 .../k8s.io/{kube-gen => code-generator}/cmd/client-gen/OWNERS | 0 .../k8s.io/{kube-gen => code-generator}/cmd/client-gen/README.md | 0 .../{kube-gen => code-generator}/cmd/client-gen/args/BUILD | 0 .../{kube-gen => code-generator}/cmd/client-gen/args/args.go | 0 .../{kube-gen => code-generator}/cmd/client-gen/generators/BUILD | 0 .../cmd/client-gen/generators/client_generator.go | 0 .../cmd/client-gen/generators/fake/BUILD | 0 .../cmd/client-gen/generators/fake/fake_client_generator.go | 0 .../client-gen/generators/fake/generator_fake_for_clientset.go | 0 .../cmd/client-gen/generators/fake/generator_fake_for_group.go | 0 .../cmd/client-gen/generators/fake/generator_fake_for_type.go | 0 .../cmd/client-gen/generators/generator_for_clientset.go | 0 .../cmd/client-gen/generators/generator_for_expansion.go | 0 .../cmd/client-gen/generators/generator_for_group.go | 0 .../cmd/client-gen/generators/generator_for_type.go | 0 .../cmd/client-gen/generators/scheme/BUILD | 0 .../cmd/client-gen/generators/scheme/generator_for_scheme.go | 0 .../cmd/client-gen/generators/tags.go | 0 .../cmd/client-gen/generators/util/BUILD | 0 .../cmd/client-gen/generators/util/tags.go | 0 .../cmd/client-gen/generators/util/tags_test.go | 0 .../k8s.io/{kube-gen => code-generator}/cmd/client-gen/main.go | 0 .../{kube-gen => code-generator}/cmd/client-gen/path/BUILD | 0 .../{kube-gen => code-generator}/cmd/client-gen/path/path.go | 0 .../{kube-gen => code-generator}/cmd/client-gen/types/BUILD | 0 .../{kube-gen => code-generator}/cmd/client-gen/types/helpers.go | 0 .../cmd/client-gen/types/helpers_test.go | 0 .../{kube-gen => code-generator}/cmd/client-gen/types/types.go | 0 .../k8s.io/{kube-gen => code-generator}/cmd/conversion-gen/BUILD | 0 .../cmd/conversion-gen/generators/BUILD | 0 .../cmd/conversion-gen/generators/conversion.go | 0 .../{kube-gen => code-generator}/cmd/conversion-gen/main.go | 0 .../k8s.io/{kube-gen => code-generator}/cmd/deepcopy-gen/BUILD | 0 .../k8s.io/{kube-gen => code-generator}/cmd/deepcopy-gen/main.go | 0 .../k8s.io/{kube-gen => code-generator}/cmd/defaulter-gen/BUILD | 0 .../{kube-gen => code-generator}/cmd/defaulter-gen/main.go | 0 .../{kube-gen => code-generator}/cmd/go-to-protobuf/.gitignore | 0 .../k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/BUILD | 0 .../{kube-gen => code-generator}/cmd/go-to-protobuf/OWNERS | 0 .../{kube-gen => code-generator}/cmd/go-to-protobuf/main.go | 0 .../cmd/go-to-protobuf/protobuf/BUILD | 0 .../cmd/go-to-protobuf/protobuf/cmd.go | 0 .../cmd/go-to-protobuf/protobuf/generator.go | 0 .../cmd/go-to-protobuf/protobuf/import_tracker.go | 0 .../cmd/go-to-protobuf/protobuf/namer.go | 0 .../cmd/go-to-protobuf/protobuf/namer_test.go | 0 .../cmd/go-to-protobuf/protobuf/package.go | 0 .../cmd/go-to-protobuf/protobuf/parser.go | 0 .../cmd/go-to-protobuf/protobuf/tags.go | 0 .../cmd/go-to-protobuf/protoc-gen-gogo/BUILD | 0 .../cmd/go-to-protobuf/protoc-gen-gogo/main.go | 0 .../{kube-gen => code-generator}/cmd/import-boss/.gitignore | 0 .../k8s.io/{kube-gen => code-generator}/cmd/import-boss/BUILD | 0 .../k8s.io/{kube-gen => code-generator}/cmd/import-boss/main.go | 0 .../k8s.io/{kube-gen => code-generator}/cmd/informer-gen/BUILD | 0 .../cmd/informer-gen/generators/BUILD | 0 .../cmd/informer-gen/generators/customargs.go | 0 .../cmd/informer-gen/generators/factory.go | 0 .../cmd/informer-gen/generators/factoryinterface.go | 0 .../cmd/informer-gen/generators/generic.go | 0 .../cmd/informer-gen/generators/groupinterface.go | 0 .../cmd/informer-gen/generators/informer.go | 0 .../cmd/informer-gen/generators/packages.go | 0 .../cmd/informer-gen/generators/tags.go | 0 .../cmd/informer-gen/generators/types.go | 0 .../cmd/informer-gen/generators/versioninterface.go | 0 .../k8s.io/{kube-gen => code-generator}/cmd/informer-gen/main.go | 0 .../cmd/lister-gen/.import-restrictions | 0 .../src/k8s.io/{kube-gen => code-generator}/cmd/lister-gen/BUILD | 0 .../{kube-gen => code-generator}/cmd/lister-gen/generators/BUILD | 0 .../cmd/lister-gen/generators/expansion.go | 0 .../cmd/lister-gen/generators/lister.go | 0 .../cmd/lister-gen/generators/tags.go | 0 .../k8s.io/{kube-gen => code-generator}/cmd/lister-gen/main.go | 0 .../k8s.io/{kube-gen => code-generator}/cmd/openapi-gen/BUILD | 0 .../k8s.io/{kube-gen => code-generator}/cmd/openapi-gen/README | 0 .../k8s.io/{kube-gen => code-generator}/cmd/openapi-gen/main.go | 0 .../k8s.io/{kube-gen => code-generator}/cmd/set-gen/.gitignore | 0 .../src/k8s.io/{kube-gen => code-generator}/cmd/set-gen/BUILD | 0 .../src/k8s.io/{kube-gen => code-generator}/cmd/set-gen/main.go | 0 .../k8s.io/{kube-gen => code-generator}/hack/update-codegen.sh | 0 .../k8s.io/{kube-gen => code-generator}/hack/verify-codegen.sh | 0 staging/src/k8s.io/{kube-gen => code-generator}/test/apis/README | 0 .../{kube-gen => code-generator}/test/apis/testgroup/BUILD | 0 .../{kube-gen => code-generator}/test/apis/testgroup/doc.go | 0 .../test/apis/testgroup/install/BUILD | 0 .../test/apis/testgroup/install/install.go | 0 .../{kube-gen => code-generator}/test/apis/testgroup/register.go | 0 .../{kube-gen => code-generator}/test/apis/testgroup/types.go | 0 .../{kube-gen => code-generator}/test/apis/testgroup/v1/BUILD | 0 .../{kube-gen => code-generator}/test/apis/testgroup/v1/doc.go | 0 .../test/apis/testgroup/v1/register.go | 0 .../test/apis/testgroup/v1/types.generated.go | 0 .../{kube-gen => code-generator}/test/apis/testgroup/v1/types.go | 0 .../test/apis/testgroup/v1/zz_generated.deepcopy.go | 0 .../test/apis/testgroup/zz_generated.deepcopy.go | 0 .../{kube-gen => code-generator}/test/clientset/internal/BUILD | 0 .../test/clientset/internal/clientset.go | 0 .../{kube-gen => code-generator}/test/clientset/internal/doc.go | 0 .../test/clientset/internal/fake/BUILD | 0 .../test/clientset/internal/fake/clientset_generated.go | 0 .../test/clientset/internal/fake/doc.go | 0 .../test/clientset/internal/fake/register.go | 0 .../test/clientset/internal/scheme/BUILD | 0 .../test/clientset/internal/scheme/doc.go | 0 .../test/clientset/internal/scheme/register.go | 0 .../clientset/internal/typed/testgroup/internalversion/BUILD | 0 .../clientset/internal/typed/testgroup/internalversion/doc.go | 0 .../internal/typed/testgroup/internalversion/fake/BUILD | 0 .../internal/typed/testgroup/internalversion/fake/doc.go | 0 .../testgroup/internalversion/fake/fake_testgroup_client.go | 0 .../typed/testgroup/internalversion/fake/fake_testtype.go | 0 .../typed/testgroup/internalversion/generated_expansion.go | 0 .../internal/typed/testgroup/internalversion/testgroup_client.go | 0 .../internal/typed/testgroup/internalversion/testtype.go | 0 .../{kube-gen => code-generator}/test/clientset/versioned/BUILD | 0 .../test/clientset/versioned/clientset.go | 0 .../{kube-gen => code-generator}/test/clientset/versioned/doc.go | 0 .../test/clientset/versioned/fake/BUILD | 0 .../test/clientset/versioned/fake/clientset_generated.go | 0 .../test/clientset/versioned/fake/doc.go | 0 .../test/clientset/versioned/fake/register.go | 0 .../test/clientset/versioned/scheme/BUILD | 0 .../test/clientset/versioned/scheme/doc.go | 0 .../test/clientset/versioned/scheme/register.go | 0 .../test/clientset/versioned/typed/testgroup/v1/BUILD | 0 .../test/clientset/versioned/typed/testgroup/v1/doc.go | 0 .../test/clientset/versioned/typed/testgroup/v1/fake/BUILD | 0 .../test/clientset/versioned/typed/testgroup/v1/fake/doc.go | 0 .../versioned/typed/testgroup/v1/fake/fake_testgroup_client.go | 0 .../clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go | 0 .../versioned/typed/testgroup/v1/generated_expansion.go | 0 .../clientset/versioned/typed/testgroup/v1/testgroup_client.go | 0 .../test/clientset/versioned/typed/testgroup/v1/testtype.go | 0 .../test/informers/externalversions/BUILD | 0 .../test/informers/externalversions/factory.go | 0 .../test/informers/externalversions/generic.go | 0 .../test/informers/externalversions/internalinterfaces/BUILD | 0 .../externalversions/internalinterfaces/factory_interfaces.go | 0 .../test/informers/externalversions/testgroup/BUILD | 0 .../test/informers/externalversions/testgroup/interface.go | 0 .../test/informers/externalversions/testgroup/v1/BUILD | 0 .../test/informers/externalversions/testgroup/v1/interface.go | 0 .../test/informers/externalversions/testgroup/v1/testtype.go | 0 .../test/informers/internalversion/BUILD | 0 .../test/informers/internalversion/factory.go | 0 .../test/informers/internalversion/generic.go | 0 .../test/informers/internalversion/internalinterfaces/BUILD | 0 .../internalversion/internalinterfaces/factory_interfaces.go | 0 .../test/informers/internalversion/testgroup/BUILD | 0 .../test/informers/internalversion/testgroup/interface.go | 0 .../informers/internalversion/testgroup/internalversion/BUILD | 0 .../internalversion/testgroup/internalversion/interface.go | 0 .../internalversion/testgroup/internalversion/testtype.go | 0 .../test/listers/testgroup/internalversion/BUILD | 0 .../listers/testgroup/internalversion/expansion_generated.go | 0 .../test/listers/testgroup/internalversion/testtype.go | 0 .../{kube-gen => code-generator}/test/listers/testgroup/v1/BUILD | 0 .../test/listers/testgroup/v1/expansion_generated.go | 0 .../test/listers/testgroup/v1/testtype.go | 0 .../third_party/forked/golang/reflect/BUILD | 0 .../third_party/forked/golang/reflect/type.go | 0 vendor/k8s.io/code-generator | 1 + vendor/k8s.io/kube-gen | 1 - 168 files changed, 1 insertion(+), 1 deletion(-) rename staging/src/k8s.io/{kube-gen => code-generator}/Godeps/Godeps.json (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/Godeps/Readme (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/OWNERS (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/OWNERS (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/README.md (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/args/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/args/args.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/client_generator.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/fake/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/fake/fake_client_generator.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/fake/generator_fake_for_clientset.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/fake/generator_fake_for_group.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/fake/generator_fake_for_type.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/generator_for_clientset.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/generator_for_expansion.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/generator_for_group.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/generator_for_type.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/scheme/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/scheme/generator_for_scheme.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/tags.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/util/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/util/tags.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/generators/util/tags_test.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/path/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/path/path.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/types/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/types/helpers.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/types/helpers_test.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/client-gen/types/types.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/conversion-gen/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/conversion-gen/generators/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/conversion-gen/generators/conversion.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/conversion-gen/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/deepcopy-gen/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/deepcopy-gen/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/defaulter-gen/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/defaulter-gen/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/.gitignore (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/OWNERS (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protobuf/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protobuf/cmd.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protobuf/generator.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protobuf/import_tracker.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protobuf/namer.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protobuf/namer_test.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protobuf/package.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protobuf/parser.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protobuf/tags.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protoc-gen-gogo/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/go-to-protobuf/protoc-gen-gogo/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/import-boss/.gitignore (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/import-boss/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/import-boss/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/customargs.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/factory.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/factoryinterface.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/generic.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/groupinterface.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/informer.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/packages.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/tags.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/types.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/generators/versioninterface.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/informer-gen/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/lister-gen/.import-restrictions (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/lister-gen/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/lister-gen/generators/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/lister-gen/generators/expansion.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/lister-gen/generators/lister.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/lister-gen/generators/tags.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/lister-gen/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/openapi-gen/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/openapi-gen/README (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/openapi-gen/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/set-gen/.gitignore (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/set-gen/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/cmd/set-gen/main.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/hack/update-codegen.sh (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/hack/verify-codegen.sh (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/README (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/install/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/install/install.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/register.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/types.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/v1/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/v1/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/v1/register.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/v1/types.generated.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/v1/types.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/v1/zz_generated.deepcopy.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/apis/testgroup/zz_generated.deepcopy.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/clientset.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/fake/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/fake/clientset_generated.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/fake/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/fake/register.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/scheme/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/scheme/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/scheme/register.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/typed/testgroup/internalversion/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/typed/testgroup/internalversion/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/typed/testgroup/internalversion/fake/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/typed/testgroup/internalversion/generated_expansion.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/internal/typed/testgroup/internalversion/testtype.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/clientset.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/fake/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/fake/clientset_generated.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/fake/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/fake/register.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/scheme/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/scheme/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/scheme/register.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/typed/testgroup/v1/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/typed/testgroup/v1/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/typed/testgroup/v1/fake/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/typed/testgroup/v1/fake/doc.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/typed/testgroup/v1/generated_expansion.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/typed/testgroup/v1/testgroup_client.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/clientset/versioned/typed/testgroup/v1/testtype.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/factory.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/generic.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/internalinterfaces/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/internalinterfaces/factory_interfaces.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/testgroup/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/testgroup/interface.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/testgroup/v1/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/testgroup/v1/interface.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/externalversions/testgroup/v1/testtype.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/factory.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/generic.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/internalinterfaces/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/internalinterfaces/factory_interfaces.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/testgroup/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/testgroup/interface.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/testgroup/internalversion/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/testgroup/internalversion/interface.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/informers/internalversion/testgroup/internalversion/testtype.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/listers/testgroup/internalversion/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/listers/testgroup/internalversion/expansion_generated.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/listers/testgroup/internalversion/testtype.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/listers/testgroup/v1/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/listers/testgroup/v1/expansion_generated.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/test/listers/testgroup/v1/testtype.go (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/third_party/forked/golang/reflect/BUILD (100%) rename staging/src/k8s.io/{kube-gen => code-generator}/third_party/forked/golang/reflect/type.go (100%) create mode 120000 vendor/k8s.io/code-generator delete mode 120000 vendor/k8s.io/kube-gen diff --git a/staging/src/k8s.io/kube-gen/Godeps/Godeps.json b/staging/src/k8s.io/code-generator/Godeps/Godeps.json similarity index 100% rename from staging/src/k8s.io/kube-gen/Godeps/Godeps.json rename to staging/src/k8s.io/code-generator/Godeps/Godeps.json diff --git a/staging/src/k8s.io/kube-gen/Godeps/Readme b/staging/src/k8s.io/code-generator/Godeps/Readme similarity index 100% rename from staging/src/k8s.io/kube-gen/Godeps/Readme rename to staging/src/k8s.io/code-generator/Godeps/Readme diff --git a/staging/src/k8s.io/kube-gen/OWNERS b/staging/src/k8s.io/code-generator/OWNERS similarity index 100% rename from staging/src/k8s.io/kube-gen/OWNERS rename to staging/src/k8s.io/code-generator/OWNERS diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/BUILD rename to staging/src/k8s.io/code-generator/cmd/client-gen/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/OWNERS b/staging/src/k8s.io/code-generator/cmd/client-gen/OWNERS similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/OWNERS rename to staging/src/k8s.io/code-generator/cmd/client-gen/OWNERS diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/README.md b/staging/src/k8s.io/code-generator/cmd/client-gen/README.md similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/README.md rename to staging/src/k8s.io/code-generator/cmd/client-gen/README.md diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/args/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/args/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/args/BUILD rename to staging/src/k8s.io/code-generator/cmd/client-gen/args/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/args/args.go b/staging/src/k8s.io/code-generator/cmd/client-gen/args/args.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/args/args.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/args/args.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/BUILD rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/client_generator.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/client_generator.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/BUILD rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/fake_client_generator.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/fake_client_generator.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/generator_fake_for_clientset.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/generator_fake_for_clientset.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/generator_fake_for_group.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/generator_fake_for_group.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/generator_fake_for_type.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake/generator_fake_for_type.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/generator_for_clientset.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/generator_for_clientset.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/generator_for_expansion.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_expansion.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/generator_for_expansion.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_expansion.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/generator_for_group.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/generator_for_group.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/generator_for_type.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/generator_for_type.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme/BUILD rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme/generator_for_scheme.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme/generator_for_scheme.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/tags.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/tags.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/tags.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/tags.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/util/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/BUILD rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/util/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/tags.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/util/tags.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/tags.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/util/tags.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/tags_test.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/util/tags_test.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util/tags_test.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/generators/util/tags_test.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/main.go b/staging/src/k8s.io/code-generator/cmd/client-gen/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/main.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/path/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/path/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/path/BUILD rename to staging/src/k8s.io/code-generator/cmd/client-gen/path/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/path/path.go b/staging/src/k8s.io/code-generator/cmd/client-gen/path/path.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/path/path.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/path/path.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/types/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/types/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/types/BUILD rename to staging/src/k8s.io/code-generator/cmd/client-gen/types/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/types/helpers.go b/staging/src/k8s.io/code-generator/cmd/client-gen/types/helpers.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/types/helpers.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/types/helpers.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/types/helpers_test.go b/staging/src/k8s.io/code-generator/cmd/client-gen/types/helpers_test.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/types/helpers_test.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/types/helpers_test.go diff --git a/staging/src/k8s.io/kube-gen/cmd/client-gen/types/types.go b/staging/src/k8s.io/code-generator/cmd/client-gen/types/types.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/client-gen/types/types.go rename to staging/src/k8s.io/code-generator/cmd/client-gen/types/types.go diff --git a/staging/src/k8s.io/kube-gen/cmd/conversion-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/conversion-gen/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/conversion-gen/BUILD rename to staging/src/k8s.io/code-generator/cmd/conversion-gen/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators/BUILD b/staging/src/k8s.io/code-generator/cmd/conversion-gen/generators/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators/BUILD rename to staging/src/k8s.io/code-generator/cmd/conversion-gen/generators/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators/conversion.go b/staging/src/k8s.io/code-generator/cmd/conversion-gen/generators/conversion.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators/conversion.go rename to staging/src/k8s.io/code-generator/cmd/conversion-gen/generators/conversion.go diff --git a/staging/src/k8s.io/kube-gen/cmd/conversion-gen/main.go b/staging/src/k8s.io/code-generator/cmd/conversion-gen/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/conversion-gen/main.go rename to staging/src/k8s.io/code-generator/cmd/conversion-gen/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/deepcopy-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/deepcopy-gen/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/deepcopy-gen/BUILD rename to staging/src/k8s.io/code-generator/cmd/deepcopy-gen/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/deepcopy-gen/main.go b/staging/src/k8s.io/code-generator/cmd/deepcopy-gen/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/deepcopy-gen/main.go rename to staging/src/k8s.io/code-generator/cmd/deepcopy-gen/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/defaulter-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/defaulter-gen/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/defaulter-gen/BUILD rename to staging/src/k8s.io/code-generator/cmd/defaulter-gen/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/defaulter-gen/main.go b/staging/src/k8s.io/code-generator/cmd/defaulter-gen/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/defaulter-gen/main.go rename to staging/src/k8s.io/code-generator/cmd/defaulter-gen/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/.gitignore b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/.gitignore similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/.gitignore rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/.gitignore diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/BUILD b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/BUILD rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/OWNERS b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/OWNERS similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/OWNERS rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/OWNERS diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/main.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/main.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/BUILD b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/BUILD rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/cmd.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/cmd.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/cmd.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/cmd.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/generator.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/generator.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/generator.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/generator.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/import_tracker.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/import_tracker.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/import_tracker.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/import_tracker.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/namer.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/namer.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/namer.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/namer.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/namer_test.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/namer_test.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/namer_test.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/namer_test.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/package.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/package.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/package.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/package.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/parser.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/parser.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/parser.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/parser.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/tags.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/tags.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf/tags.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/tags.go diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo/BUILD b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo/BUILD rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo/main.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo/main.go rename to staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/import-boss/.gitignore b/staging/src/k8s.io/code-generator/cmd/import-boss/.gitignore similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/import-boss/.gitignore rename to staging/src/k8s.io/code-generator/cmd/import-boss/.gitignore diff --git a/staging/src/k8s.io/kube-gen/cmd/import-boss/BUILD b/staging/src/k8s.io/code-generator/cmd/import-boss/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/import-boss/BUILD rename to staging/src/k8s.io/code-generator/cmd/import-boss/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/import-boss/main.go b/staging/src/k8s.io/code-generator/cmd/import-boss/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/import-boss/main.go rename to staging/src/k8s.io/code-generator/cmd/import-boss/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/informer-gen/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/BUILD rename to staging/src/k8s.io/code-generator/cmd/informer-gen/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/BUILD b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/BUILD rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/customargs.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/customargs.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/customargs.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/customargs.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/factory.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/factory.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/factoryinterface.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factoryinterface.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/factoryinterface.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factoryinterface.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/generic.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/generic.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/groupinterface.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/groupinterface.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/groupinterface.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/groupinterface.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/informer.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/informer.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/packages.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/packages.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/tags.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/tags.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/tags.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/tags.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/types.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/types.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/types.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/types.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/versioninterface.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/versioninterface.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/generators/versioninterface.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/generators/versioninterface.go diff --git a/staging/src/k8s.io/kube-gen/cmd/informer-gen/main.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/informer-gen/main.go rename to staging/src/k8s.io/code-generator/cmd/informer-gen/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/lister-gen/.import-restrictions b/staging/src/k8s.io/code-generator/cmd/lister-gen/.import-restrictions similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/lister-gen/.import-restrictions rename to staging/src/k8s.io/code-generator/cmd/lister-gen/.import-restrictions diff --git a/staging/src/k8s.io/kube-gen/cmd/lister-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/lister-gen/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/lister-gen/BUILD rename to staging/src/k8s.io/code-generator/cmd/lister-gen/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/BUILD b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/BUILD rename to staging/src/k8s.io/code-generator/cmd/lister-gen/generators/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/expansion.go b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/expansion.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/expansion.go rename to staging/src/k8s.io/code-generator/cmd/lister-gen/generators/expansion.go diff --git a/staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/lister.go b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/lister.go rename to staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go diff --git a/staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/tags.go b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/tags.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/lister-gen/generators/tags.go rename to staging/src/k8s.io/code-generator/cmd/lister-gen/generators/tags.go diff --git a/staging/src/k8s.io/kube-gen/cmd/lister-gen/main.go b/staging/src/k8s.io/code-generator/cmd/lister-gen/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/lister-gen/main.go rename to staging/src/k8s.io/code-generator/cmd/lister-gen/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/openapi-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/openapi-gen/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/openapi-gen/BUILD rename to staging/src/k8s.io/code-generator/cmd/openapi-gen/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/openapi-gen/README b/staging/src/k8s.io/code-generator/cmd/openapi-gen/README similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/openapi-gen/README rename to staging/src/k8s.io/code-generator/cmd/openapi-gen/README diff --git a/staging/src/k8s.io/kube-gen/cmd/openapi-gen/main.go b/staging/src/k8s.io/code-generator/cmd/openapi-gen/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/openapi-gen/main.go rename to staging/src/k8s.io/code-generator/cmd/openapi-gen/main.go diff --git a/staging/src/k8s.io/kube-gen/cmd/set-gen/.gitignore b/staging/src/k8s.io/code-generator/cmd/set-gen/.gitignore similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/set-gen/.gitignore rename to staging/src/k8s.io/code-generator/cmd/set-gen/.gitignore diff --git a/staging/src/k8s.io/kube-gen/cmd/set-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/set-gen/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/set-gen/BUILD rename to staging/src/k8s.io/code-generator/cmd/set-gen/BUILD diff --git a/staging/src/k8s.io/kube-gen/cmd/set-gen/main.go b/staging/src/k8s.io/code-generator/cmd/set-gen/main.go similarity index 100% rename from staging/src/k8s.io/kube-gen/cmd/set-gen/main.go rename to staging/src/k8s.io/code-generator/cmd/set-gen/main.go diff --git a/staging/src/k8s.io/kube-gen/hack/update-codegen.sh b/staging/src/k8s.io/code-generator/hack/update-codegen.sh similarity index 100% rename from staging/src/k8s.io/kube-gen/hack/update-codegen.sh rename to staging/src/k8s.io/code-generator/hack/update-codegen.sh diff --git a/staging/src/k8s.io/kube-gen/hack/verify-codegen.sh b/staging/src/k8s.io/code-generator/hack/verify-codegen.sh similarity index 100% rename from staging/src/k8s.io/kube-gen/hack/verify-codegen.sh rename to staging/src/k8s.io/code-generator/hack/verify-codegen.sh diff --git a/staging/src/k8s.io/kube-gen/test/apis/README b/staging/src/k8s.io/code-generator/test/apis/README similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/README rename to staging/src/k8s.io/code-generator/test/apis/README diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/BUILD b/staging/src/k8s.io/code-generator/test/apis/testgroup/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/BUILD rename to staging/src/k8s.io/code-generator/test/apis/testgroup/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/doc.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/doc.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/install/BUILD b/staging/src/k8s.io/code-generator/test/apis/testgroup/install/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/install/BUILD rename to staging/src/k8s.io/code-generator/test/apis/testgroup/install/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/install/install.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/install/install.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/install/install.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/install/install.go diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/register.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/register.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/register.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/register.go diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/types.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/types.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/types.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/types.go diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/BUILD b/staging/src/k8s.io/code-generator/test/apis/testgroup/v1/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/BUILD rename to staging/src/k8s.io/code-generator/test/apis/testgroup/v1/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/doc.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/v1/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/doc.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/v1/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/register.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/v1/register.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/register.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/v1/register.go diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/types.generated.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/v1/types.generated.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/types.generated.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/v1/types.generated.go diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/types.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/v1/types.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/types.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/v1/types.go diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/v1/zz_generated.deepcopy.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/v1/zz_generated.deepcopy.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/v1/zz_generated.deepcopy.go diff --git a/staging/src/k8s.io/kube-gen/test/apis/testgroup/zz_generated.deepcopy.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/zz_generated.deepcopy.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/apis/testgroup/zz_generated.deepcopy.go rename to staging/src/k8s.io/code-generator/test/apis/testgroup/zz_generated.deepcopy.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/internal/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/clientset.go b/staging/src/k8s.io/code-generator/test/clientset/internal/clientset.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/clientset.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/clientset.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/doc.go b/staging/src/k8s.io/code-generator/test/clientset/internal/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/fake/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/fake/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/internal/fake/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/fake/clientset_generated.go b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/clientset_generated.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/fake/clientset_generated.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/fake/clientset_generated.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/fake/doc.go b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/fake/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/fake/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/fake/register.go b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/register.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/fake/register.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/fake/register.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/internal/scheme/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/doc.go b/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/scheme/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/register.go b/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/register.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/scheme/register.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/scheme/register.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/doc.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/doc.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/generated_expansion.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/generated_expansion.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/generated_expansion.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/generated_expansion.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testtype.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/testtype.go rename to staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testtype.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/versioned/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/clientset.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/clientset.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/clientset.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/clientset.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/doc.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/versioned/fake/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/clientset_generated.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/clientset_generated.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/clientset_generated.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/fake/clientset_generated.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/doc.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/fake/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/register.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/register.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/fake/register.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/fake/register.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/doc.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/register.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/register.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme/register.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/register.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/doc.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/BUILD rename to staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/doc.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/doc.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/doc.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/doc.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/generated_expansion.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/generated_expansion.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/generated_expansion.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/generated_expansion.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/testgroup_client.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testgroup_client.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/testgroup_client.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testgroup_client.go diff --git a/staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testtype.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/testtype.go rename to staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testtype.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/BUILD b/staging/src/k8s.io/code-generator/test/informers/externalversions/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/BUILD rename to staging/src/k8s.io/code-generator/test/informers/externalversions/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/factory.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/factory.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/factory.go rename to staging/src/k8s.io/code-generator/test/informers/externalversions/factory.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/generic.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/generic.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/generic.go rename to staging/src/k8s.io/code-generator/test/informers/externalversions/generic.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces/BUILD b/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces/BUILD rename to staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/factory_interfaces.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces/factory_interfaces.go rename to staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/factory_interfaces.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/BUILD b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/BUILD rename to staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/interface.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/interface.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/interface.go rename to staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/interface.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/BUILD b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/BUILD rename to staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/interface.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/interface.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/interface.go rename to staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/interface.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/testtype.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1/testtype.go rename to staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/testtype.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/BUILD b/staging/src/k8s.io/code-generator/test/informers/internalversion/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/BUILD rename to staging/src/k8s.io/code-generator/test/informers/internalversion/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/factory.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/factory.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/factory.go rename to staging/src/k8s.io/code-generator/test/informers/internalversion/factory.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/generic.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/generic.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/generic.go rename to staging/src/k8s.io/code-generator/test/informers/internalversion/generic.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces/BUILD b/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces/BUILD rename to staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/factory_interfaces.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces/factory_interfaces.go rename to staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/factory_interfaces.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/BUILD b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/BUILD rename to staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/interface.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/interface.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/interface.go rename to staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/interface.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/BUILD b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/BUILD rename to staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/interface.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/interface.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/interface.go rename to staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/interface.go diff --git a/staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/testtype.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion/testtype.go rename to staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/testtype.go diff --git a/staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/BUILD b/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/BUILD rename to staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/expansion_generated.go b/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/expansion_generated.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/expansion_generated.go rename to staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/expansion_generated.go diff --git a/staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/testtype.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion/testtype.go rename to staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/testtype.go diff --git a/staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/BUILD b/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/BUILD rename to staging/src/k8s.io/code-generator/test/listers/testgroup/v1/BUILD diff --git a/staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/expansion_generated.go b/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/expansion_generated.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/expansion_generated.go rename to staging/src/k8s.io/code-generator/test/listers/testgroup/v1/expansion_generated.go diff --git a/staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/testtype.go similarity index 100% rename from staging/src/k8s.io/kube-gen/test/listers/testgroup/v1/testtype.go rename to staging/src/k8s.io/code-generator/test/listers/testgroup/v1/testtype.go diff --git a/staging/src/k8s.io/kube-gen/third_party/forked/golang/reflect/BUILD b/staging/src/k8s.io/code-generator/third_party/forked/golang/reflect/BUILD similarity index 100% rename from staging/src/k8s.io/kube-gen/third_party/forked/golang/reflect/BUILD rename to staging/src/k8s.io/code-generator/third_party/forked/golang/reflect/BUILD diff --git a/staging/src/k8s.io/kube-gen/third_party/forked/golang/reflect/type.go b/staging/src/k8s.io/code-generator/third_party/forked/golang/reflect/type.go similarity index 100% rename from staging/src/k8s.io/kube-gen/third_party/forked/golang/reflect/type.go rename to staging/src/k8s.io/code-generator/third_party/forked/golang/reflect/type.go diff --git a/vendor/k8s.io/code-generator b/vendor/k8s.io/code-generator new file mode 120000 index 0000000000000..9da915490be2e --- /dev/null +++ b/vendor/k8s.io/code-generator @@ -0,0 +1 @@ +../../staging/src/k8s.io/code-generator \ No newline at end of file diff --git a/vendor/k8s.io/kube-gen b/vendor/k8s.io/kube-gen deleted file mode 120000 index c57d0e8c38934..0000000000000 --- a/vendor/k8s.io/kube-gen +++ /dev/null @@ -1 +0,0 @@ -../../staging/src/k8s.io/kube-gen \ No newline at end of file From 1d7328a290afae198aaf7ca97896307afe6c6de1 Mon Sep 17 00:00:00 2001 From: zhengjiajin Date: Thu, 17 Aug 2017 19:56:25 +0800 Subject: [PATCH 073/403] fix issue(#49695)kubectl set image deployment is ignoring --selector --- pkg/kubectl/cmd/set/set_image.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/kubectl/cmd/set/set_image.go b/pkg/kubectl/cmd/set/set_image.go index 6fe353943c140..8a2b5d3432728 100644 --- a/pkg/kubectl/cmd/set/set_image.go +++ b/pkg/kubectl/cmd/set/set_image.go @@ -227,7 +227,10 @@ func (o *ImageOptions) Run() error { } if o.PrintObject != nil && (o.Local || o.DryRun) { - return o.PrintObject(o.Cmd, o.Local, o.Mapper, info.Object, o.Out) + if err := o.PrintObject(o.Cmd, o.Local, o.Mapper, info.Object, o.Out); err != nil { + return err + } + continue } // patch the change @@ -250,7 +253,10 @@ func (o *ImageOptions) Run() error { info.Refresh(obj, true) if len(o.Output) > 0 { - return o.PrintObject(o.Cmd, o.Local, o.Mapper, obj, o.Out) + if err := o.PrintObject(o.Cmd, o.Local, o.Mapper, obj, o.Out); err != nil { + return err + } + continue } cmdutil.PrintSuccess(o.Mapper, o.ShortOutput, o.Out, info.Mapping.Resource, info.Name, o.DryRun, "image updated") } From d4b41afe59736e63c0f5388256324c2583d7a659 Mon Sep 17 00:00:00 2001 From: guangxuli Date: Thu, 17 Aug 2017 22:59:45 +0800 Subject: [PATCH 074/403] fix incorrect logic --- .../src/k8s.io/apiserver/pkg/admission/plugins.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugins.go b/staging/src/k8s.io/apiserver/pkg/admission/plugins.go index dd1368d4ddd94..5ddfc7e1f84b7 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugins.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugins.go @@ -67,13 +67,15 @@ func (ps *Plugins) Registered() []string { func (ps *Plugins) Register(name string, plugin Factory) { ps.lock.Lock() defer ps.lock.Unlock() - _, found := ps.registry[name] - if found { - glog.Fatalf("Admission plugin %q was registered twice", name) - } - if ps.registry == nil { + if ps.registry != nil { + _, found := ps.registry[name] + if found { + glog.Fatalf("Admission plugin %q was registered twice", name) + } + } else { ps.registry = map[string]Factory{} } + glog.V(1).Infof("Registered admission plugin %q", name) ps.registry[name] = plugin } From 5b8b1eb2ebad7b5ba3ffd6852afed0bccee5d88a Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Tue, 15 Aug 2017 14:59:56 -0400 Subject: [PATCH 075/403] allow default option values - kube top node|pod --- pkg/kubectl/cmd/top.go | 4 ++-- pkg/kubectl/cmd/top_node.go | 27 +++++++++++++++++++++------ pkg/kubectl/cmd/top_node_test.go | 6 +++--- pkg/kubectl/cmd/top_pod.go | 6 ++++-- pkg/kubectl/cmd/top_pod_test.go | 2 +- 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/pkg/kubectl/cmd/top.go b/pkg/kubectl/cmd/top.go index 1473f8e8a54fb..48489cfd7898f 100644 --- a/pkg/kubectl/cmd/top.go +++ b/pkg/kubectl/cmd/top.go @@ -47,7 +47,7 @@ func NewCmdTop(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { } // create subcommands - cmd.AddCommand(NewCmdTopNode(f, out)) - cmd.AddCommand(NewCmdTopPod(f, out)) + cmd.AddCommand(NewCmdTopNode(f, nil, out)) + cmd.AddCommand(NewCmdTopPod(f, nil, out)) return cmd } diff --git a/pkg/kubectl/cmd/top_node.go b/pkg/kubectl/cmd/top_node.go index e432a457622b8..668a96ffa744b 100644 --- a/pkg/kubectl/cmd/top_node.go +++ b/pkg/kubectl/cmd/top_node.go @@ -50,10 +50,23 @@ type HeapsterTopOptions struct { } func (o *HeapsterTopOptions) Bind(flags *pflag.FlagSet) { - flags.StringVar(&o.Namespace, "heapster-namespace", metricsutil.DefaultHeapsterNamespace, "Namespace Heapster service is located in") - flags.StringVar(&o.Service, "heapster-service", metricsutil.DefaultHeapsterService, "Name of Heapster service") - flags.StringVar(&o.Scheme, "heapster-scheme", metricsutil.DefaultHeapsterScheme, "Scheme (http or https) to connect to Heapster as") - flags.StringVar(&o.Port, "heapster-port", metricsutil.DefaultHeapsterPort, "Port name in service to use") + if len(o.Namespace) == 0 { + o.Namespace = metricsutil.DefaultHeapsterNamespace + } + if len(o.Service) == 0 { + o.Service = metricsutil.DefaultHeapsterService + } + if len(o.Scheme) == 0 { + o.Scheme = metricsutil.DefaultHeapsterScheme + } + if len(o.Port) == 0 { + o.Port = metricsutil.DefaultHeapsterPort + } + + flags.StringVar(&o.Namespace, "heapster-namespace", o.Namespace, "Namespace Heapster service is located in") + flags.StringVar(&o.Service, "heapster-service", o.Service, "Name of Heapster service") + flags.StringVar(&o.Scheme, "heapster-scheme", o.Scheme, "Scheme (http or https) to connect to Heapster as") + flags.StringVar(&o.Port, "heapster-port", o.Port, "Port name in service to use") } var ( @@ -70,8 +83,10 @@ var ( kubectl top node NODE_NAME`)) ) -func NewCmdTopNode(f cmdutil.Factory, out io.Writer) *cobra.Command { - options := &TopNodeOptions{} +func NewCmdTopNode(f cmdutil.Factory, options *TopNodeOptions, out io.Writer) *cobra.Command { + if options == nil { + options = &TopNodeOptions{} + } cmd := &cobra.Command{ Use: "node [NAME | -l label]", diff --git a/pkg/kubectl/cmd/top_node_test.go b/pkg/kubectl/cmd/top_node_test.go index 354afde1055b0..e2e9af185cb4b 100644 --- a/pkg/kubectl/cmd/top_node_test.go +++ b/pkg/kubectl/cmd/top_node_test.go @@ -67,7 +67,7 @@ func TestTopNodeAllMetrics(t *testing.T) { tf.ClientConfig = defaultClientConfig() buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdTopNode(f, buf) + cmd := NewCmdTopNode(f, nil, buf) cmd.Run(cmd, []string{}) // Check the presence of node names in the output. @@ -116,7 +116,7 @@ func TestTopNodeWithNameMetrics(t *testing.T) { tf.ClientConfig = defaultClientConfig() buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdTopNode(f, buf) + cmd := NewCmdTopNode(f, nil, buf) cmd.Run(cmd, []string{expectedMetrics.Name}) // Check the presence of node names in the output. @@ -176,7 +176,7 @@ func TestTopNodeWithLabelSelectorMetrics(t *testing.T) { tf.ClientConfig = defaultClientConfig() buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdTopNode(f, buf) + cmd := NewCmdTopNode(f, nil, buf) cmd.Flags().Set("selector", label) cmd.Run(cmd, []string{}) diff --git a/pkg/kubectl/cmd/top_pod.go b/pkg/kubectl/cmd/top_pod.go index 689e6e3e2fe20..e17b02be764be 100644 --- a/pkg/kubectl/cmd/top_pod.go +++ b/pkg/kubectl/cmd/top_pod.go @@ -72,8 +72,10 @@ var ( kubectl top pod -l name=myLabel`)) ) -func NewCmdTopPod(f cmdutil.Factory, out io.Writer) *cobra.Command { - options := &TopPodOptions{} +func NewCmdTopPod(f cmdutil.Factory, options *TopPodOptions, out io.Writer) *cobra.Command { + if options == nil { + options = &TopPodOptions{} + } cmd := &cobra.Command{ Use: "pod [NAME | -l label]", diff --git a/pkg/kubectl/cmd/top_pod_test.go b/pkg/kubectl/cmd/top_pod_test.go index d7a43fc146051..ef892887d2361 100644 --- a/pkg/kubectl/cmd/top_pod_test.go +++ b/pkg/kubectl/cmd/top_pod_test.go @@ -139,7 +139,7 @@ func TestTopPod(t *testing.T) { tf.ClientConfig = defaultClientConfig() buf := bytes.NewBuffer([]byte{}) - cmd := NewCmdTopPod(f, buf) + cmd := NewCmdTopPod(f, nil, buf) for name, value := range testCase.flags { cmd.Flags().Set(name, value) } From e3a3d108fb382caaa64503254bcd98ab29ba6a96 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 16 Aug 2017 15:04:52 +0200 Subject: [PATCH 076/403] Fixup after k8s.io/{kube-gen -> code-generator} rename --- build/root/Makefile.generated_files | 20 ++++----- hack/.golint_failures | 44 +++++++++---------- hack/lib/protoc.sh | 2 +- hack/make-rules/helpers/cache_go_dirs.sh | 2 +- hack/make-rules/test.sh | 4 +- hack/staging-import-restrictions.json | 10 ++--- hack/update-codegen.sh | 16 +++---- hack/update-generated-protobuf-dockerized.sh | 4 +- hack/update-generated-runtime-dockerized.sh | 2 +- hack/verify-api-groups.sh | 2 +- hack/verify-codegen.sh | 10 ++--- hack/verify-import-boss.sh | 2 +- pkg/generated/openapi/BUILD | 2 +- pkg/generated/openapi/def.bzl | 4 +- staging/BUILD | 36 +++++++-------- staging/README.md | 2 +- staging/prime-apimachinery.sh | 2 +- .../hack/update-codegen.sh | 8 ++-- .../k8s.io/apimachinery/pkg/util/sets/BUILD | 4 +- .../apimachinery/pkg/util/sets/types/types.go | 2 +- .../k8s.io/code-generator/Godeps/Godeps.json | 2 +- .../code-generator/cmd/client-gen/BUILD | 14 +++--- .../code-generator/cmd/client-gen/README.md | 2 +- .../code-generator/cmd/client-gen/args/BUILD | 2 +- .../cmd/client-gen/args/args.go | 2 +- .../cmd/client-gen/generators/BUILD | 18 ++++---- .../client-gen/generators/client_generator.go | 12 ++--- .../cmd/client-gen/generators/fake/BUILD | 10 ++--- .../generators/fake/fake_client_generator.go | 8 ++-- .../fake/generator_fake_for_clientset.go | 2 +- .../fake/generator_fake_for_group.go | 2 +- .../fake/generator_fake_for_type.go | 4 +- .../generators/generator_for_clientset.go | 2 +- .../generators/generator_for_group.go | 4 +- .../generators/generator_for_type.go | 2 +- .../cmd/client-gen/generators/scheme/BUILD | 4 +- .../generators/scheme/generator_for_scheme.go | 4 +- .../code-generator/cmd/client-gen/main.go | 6 +-- .../code-generator/cmd/conversion-gen/BUILD | 4 +- .../code-generator/cmd/conversion-gen/main.go | 2 +- .../code-generator/cmd/go-to-protobuf/BUILD | 6 +-- .../code-generator/cmd/go-to-protobuf/main.go | 2 +- .../cmd/go-to-protobuf/protobuf/BUILD | 2 +- .../cmd/go-to-protobuf/protobuf/parser.go | 2 +- .../code-generator/cmd/informer-gen/BUILD | 4 +- .../cmd/informer-gen/generators/BUILD | 4 +- .../cmd/informer-gen/generators/factory.go | 2 +- .../cmd/informer-gen/generators/generic.go | 2 +- .../informer-gen/generators/groupinterface.go | 2 +- .../cmd/informer-gen/generators/informer.go | 4 +- .../cmd/informer-gen/generators/packages.go | 4 +- .../code-generator/cmd/informer-gen/main.go | 2 +- .../code-generator/cmd/lister-gen/BUILD | 4 +- .../cmd/lister-gen/generators/BUILD | 4 +- .../cmd/lister-gen/generators/expansion.go | 2 +- .../cmd/lister-gen/generators/lister.go | 4 +- .../code-generator/cmd/lister-gen/main.go | 2 +- .../code-generator/hack/update-codegen.sh | 10 ++--- .../code-generator/test/apis/testgroup/BUILD | 4 +- .../code-generator/test/apis/testgroup/doc.go | 2 +- .../test/apis/testgroup/install/BUILD | 4 +- .../test/apis/testgroup/install/install.go | 4 +- .../test/clientset/internal/BUILD | 8 ++-- .../test/clientset/internal/clientset.go | 2 +- .../test/clientset/internal/fake/BUILD | 8 ++-- .../internal/fake/clientset_generated.go | 6 +-- .../test/clientset/internal/fake/register.go | 2 +- .../test/clientset/internal/scheme/BUILD | 2 +- .../clientset/internal/scheme/register.go | 2 +- .../typed/testgroup/internalversion/BUILD | 6 +-- .../testgroup/internalversion/fake/BUILD | 4 +- .../fake/fake_testgroup_client.go | 2 +- .../internalversion/fake/fake_testtype.go | 2 +- .../internalversion/testgroup_client.go | 2 +- .../testgroup/internalversion/testtype.go | 4 +- .../test/clientset/versioned/BUILD | 8 ++-- .../test/clientset/versioned/clientset.go | 2 +- .../test/clientset/versioned/fake/BUILD | 8 ++-- .../versioned/fake/clientset_generated.go | 6 +-- .../test/clientset/versioned/fake/register.go | 2 +- .../test/clientset/versioned/scheme/BUILD | 2 +- .../clientset/versioned/scheme/register.go | 2 +- .../versioned/typed/testgroup/v1/BUILD | 6 +-- .../versioned/typed/testgroup/v1/fake/BUILD | 4 +- .../v1/fake/fake_testgroup_client.go | 2 +- .../typed/testgroup/v1/fake/fake_testtype.go | 2 +- .../typed/testgroup/v1/testgroup_client.go | 4 +- .../versioned/typed/testgroup/v1/testtype.go | 4 +- .../test/informers/externalversions/BUILD | 12 ++--- .../informers/externalversions/factory.go | 6 +-- .../informers/externalversions/generic.go | 2 +- .../externalversions/internalinterfaces/BUILD | 2 +- .../internalinterfaces/factory_interfaces.go | 2 +- .../externalversions/testgroup/BUILD | 6 +-- .../externalversions/testgroup/interface.go | 4 +- .../externalversions/testgroup/v1/BUILD | 8 ++-- .../testgroup/v1/interface.go | 2 +- .../externalversions/testgroup/v1/testtype.go | 8 ++-- .../test/informers/internalversion/BUILD | 12 ++--- .../test/informers/internalversion/factory.go | 6 +-- .../test/informers/internalversion/generic.go | 2 +- .../internalversion/internalinterfaces/BUILD | 2 +- .../internalinterfaces/factory_interfaces.go | 2 +- .../informers/internalversion/testgroup/BUILD | 6 +-- .../internalversion/testgroup/interface.go | 4 +- .../testgroup/internalversion/BUILD | 8 ++-- .../testgroup/internalversion/interface.go | 2 +- .../testgroup/internalversion/testtype.go | 8 ++-- .../listers/testgroup/internalversion/BUILD | 2 +- .../testgroup/internalversion/testtype.go | 2 +- .../test/listers/testgroup/v1/BUILD | 2 +- .../test/listers/testgroup/v1/testtype.go | 2 +- .../kube-aggregator/hack/update-codegen.sh | 8 ++-- .../src/k8s.io/metrics/hack/update-codegen.sh | 4 +- .../sample-apiserver/hack/update-codegen.sh | 8 ++-- 115 files changed, 297 insertions(+), 297 deletions(-) diff --git a/build/root/Makefile.generated_files b/build/root/Makefile.generated_files index 08c59d8aa8f09..1d6315747b412 100644 --- a/build/root/Makefile.generated_files +++ b/build/root/Makefile.generated_files @@ -69,7 +69,7 @@ verify_generated_files: verify_gen_deepcopy \ # # expect one file to be regenerated # make gen_deepcopy # # expect nothing to be rebuilt, finish in O(seconds) -# touch vendor/k8s.io/kube-gen/cmd/deepcopy-gen/main.go +# touch vendor/k8s.io/code-generator/cmd/deepcopy-gen/main.go # make gen_deepcopy # # expect deepcopy-gen is built exactly once # # expect many files to be regenerated @@ -88,7 +88,7 @@ verify_generated_files: verify_gen_deepcopy \ # # expect one file to be regenerated # make gen_conversion # # expect nothing to be rebuilt, finish in O(seconds) -# touch vendor/k8s.io/kube-gen/cmd/conversion-gen/main.go +# touch vendor/k8s.io/code-generator/cmd/conversion-gen/main.go # make gen_conversion # # expect conversion-gen is built exactly once # # expect many files to be regenerated @@ -274,7 +274,7 @@ $(META_DIR)/$(DEEPCOPY_GEN).mk: (echo -n "$(DEEPCOPY_GEN): "; \ ./hack/run-in-gopath.sh go list \ -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ - ./vendor/k8s.io/kube-gen/cmd/deepcopy-gen \ + ./vendor/k8s.io/code-generator/cmd/deepcopy-gen \ | grep --color=never "^$(PRJ_SRC_PATH)/" \ | xargs ./hack/run-in-gopath.sh go list \ -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ @@ -299,7 +299,7 @@ sinclude $(META_DIR)/$(DEEPCOPY_GEN).mk # newer than the binary, and try to rebuild it over and over. So we touch it, # and make is happy. $(DEEPCOPY_GEN): - hack/make-rules/build.sh ./vendor/k8s.io/kube-gen/cmd/deepcopy-gen + hack/make-rules/build.sh ./vendor/k8s.io/code-generator/cmd/deepcopy-gen touch $@ # @@ -424,7 +424,7 @@ $(META_DIR)/$(DEFAULTER_GEN).mk: (echo -n "$(DEFAULTER_GEN): "; \ ./hack/run-in-gopath.sh go list \ -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ - ./vendor/k8s.io/kube-gen/cmd/defaulter-gen \ + ./vendor/k8s.io/code-generator/cmd/defaulter-gen \ | grep --color=never "^$(PRJ_SRC_PATH)/" \ | xargs ./hack/run-in-gopath.sh go list \ -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ @@ -449,7 +449,7 @@ sinclude $(META_DIR)/$(DEFAULTER_GEN).mk # newer than the binary, and try to rebuild it over and over. So we touch it, # and make is happy. $(DEFAULTER_GEN): - hack/make-rules/build.sh ./vendor/k8s.io/kube-gen/cmd/defaulter-gen + hack/make-rules/build.sh ./vendor/k8s.io/code-generator/cmd/defaulter-gen touch $@ # @@ -522,7 +522,7 @@ $(META_DIR)/$(OPENAPI_GEN).mk: (echo -n "$(OPENAPI_GEN): "; \ ./hack/run-in-gopath.sh go list \ -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ - ./vendor/k8s.io/kube-gen/cmd/openapi-gen \ + ./vendor/k8s.io/code-generator/cmd/openapi-gen \ | grep --color=never "^$(PRJ_SRC_PATH)/" \ | xargs ./hack/run-in-gopath.sh go list \ -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ @@ -547,7 +547,7 @@ sinclude $(META_DIR)/$(OPENAPI_GEN).mk # newer than the binary, and try to rebuild it over and over. So we touch it, # and make is happy. $(OPENAPI_GEN): - hack/make-rules/build.sh ./vendor/k8s.io/kube-gen/cmd/openapi-gen + hack/make-rules/build.sh ./vendor/k8s.io/code-generator/cmd/openapi-gen touch $@ # @@ -716,7 +716,7 @@ $(META_DIR)/$(CONVERSION_GEN).mk: (echo -n "$(CONVERSION_GEN): "; \ ./hack/run-in-gopath.sh go list \ -f '{{.ImportPath}}{{"\n"}}{{range .Deps}}{{.}}{{"\n"}}{{end}}' \ - ./vendor/k8s.io/kube-gen/cmd/conversion-gen \ + ./vendor/k8s.io/code-generator/cmd/conversion-gen \ | grep --color=never "^$(PRJ_SRC_PATH)/" \ | xargs ./hack/run-in-gopath.sh go list \ -f '{{$$d := .Dir}}{{$$d}}{{"\n"}}{{range .GoFiles}}{{$$d}}/{{.}}{{"\n"}}{{end}}' \ @@ -741,5 +741,5 @@ sinclude $(META_DIR)/$(CONVERSION_GEN).mk # newer than the binary, and try to rebuild it over and over. So we touch it, # and make is happy. $(CONVERSION_GEN): - hack/make-rules/build.sh ./vendor/k8s.io/kube-gen/cmd/conversion-gen + hack/make-rules/build.sh ./vendor/k8s.io/code-generator/cmd/conversion-gen touch $@ diff --git a/hack/.golint_failures b/hack/.golint_failures index aa17214fef9c4..9972dc6382b23 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -753,6 +753,28 @@ staging/src/k8s.io/client-go/util/integer staging/src/k8s.io/client-go/util/jsonpath staging/src/k8s.io/client-go/util/retry staging/src/k8s.io/client-go/util/testing +staging/src/k8s.io/code-generator/cmd/client-gen/args +staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake +staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme +staging/src/k8s.io/code-generator/cmd/client-gen/types +staging/src/k8s.io/code-generator/cmd/conversion-gen/generators +staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf +staging/src/k8s.io/code-generator/cmd/informer-gen/generators +staging/src/k8s.io/code-generator/cmd/lister-gen/generators +staging/src/k8s.io/code-generator/test/apis/testgroup +staging/src/k8s.io/code-generator/test/apis/testgroup/v1 +staging/src/k8s.io/code-generator/test/clientset/internal +staging/src/k8s.io/code-generator/test/clientset/internal/fake +staging/src/k8s.io/code-generator/test/clientset/internal/scheme +staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion +staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake +staging/src/k8s.io/code-generator/test/clientset/versioned +staging/src/k8s.io/code-generator/test/clientset/versioned/fake +staging/src/k8s.io/code-generator/test/clientset/versioned/scheme +staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1 +staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake +staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces +staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1 staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/validation @@ -764,28 +786,6 @@ staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister staging/src/k8s.io/kube-aggregator/pkg/controllers/status staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd -staging/src/k8s.io/kube-gen/cmd/client-gen/args -staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake -staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme -staging/src/k8s.io/kube-gen/cmd/client-gen/types -staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators -staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf -staging/src/k8s.io/kube-gen/cmd/informer-gen/generators -staging/src/k8s.io/kube-gen/cmd/lister-gen/generators -staging/src/k8s.io/kube-gen/test/apis/testgroup -staging/src/k8s.io/kube-gen/test/apis/testgroup/v1 -staging/src/k8s.io/kube-gen/test/clientset/internal -staging/src/k8s.io/kube-gen/test/clientset/internal/fake -staging/src/k8s.io/kube-gen/test/clientset/internal/scheme -staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion -staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake -staging/src/k8s.io/kube-gen/test/clientset/versioned -staging/src/k8s.io/kube-gen/test/clientset/versioned/fake -staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme -staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1 -staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake -staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces -staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces staging/src/k8s.io/metrics/pkg/apis/custom_metrics staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1 staging/src/k8s.io/metrics/pkg/apis/metrics diff --git a/hack/lib/protoc.sh b/hack/lib/protoc.sh index b1e8cb60c956b..980684cbd8ad7 100644 --- a/hack/lib/protoc.sh +++ b/hack/lib/protoc.sh @@ -28,7 +28,7 @@ source "${KUBE_ROOT}/hack/lib/init.sh" function kube::protoc::generate_proto() { kube::golang::setup_env local bins=( - vendor/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo + vendor/k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo ) make -C "${KUBE_ROOT}" WHAT="${bins[*]}" diff --git a/hack/make-rules/helpers/cache_go_dirs.sh b/hack/make-rules/helpers/cache_go_dirs.sh index dd385e622d529..a16f78b8c0299 100755 --- a/hack/make-rules/helpers/cache_go_dirs.sh +++ b/hack/make-rules/helpers/cache_go_dirs.sh @@ -39,7 +39,7 @@ function kfind() { # include the "special" vendor directories which are actually part # of the Kubernetes source tree - generators will use these for # including certain core API concepts. - find -H . ./vendor/k8s.io/apimachinery ./vendor/k8s.io/apiserver ./vendor/k8s.io/kube-aggregator ./vendor/k8s.io/apiextensions-apiserver ./vendor/k8s.io/metrics ./vendor/k8s.io/sample-apiserver ./vendor/k8s.io/api ./vendor/k8s.io/client-go ./vendor/k8s.io/kube-gen \ + find -H . ./vendor/k8s.io/apimachinery ./vendor/k8s.io/apiserver ./vendor/k8s.io/kube-aggregator ./vendor/k8s.io/apiextensions-apiserver ./vendor/k8s.io/metrics ./vendor/k8s.io/sample-apiserver ./vendor/k8s.io/api ./vendor/k8s.io/client-go ./vendor/k8s.io/code-generator \ \( \ -not \( \ \( \ diff --git a/hack/make-rules/test.sh b/hack/make-rules/test.sh index e243b22aba772..f7f0d812f76b1 100755 --- a/hack/make-rules/test.sh +++ b/hack/make-rules/test.sh @@ -274,11 +274,11 @@ runTests() { # separate files. # ignore paths: - # vendor/k8s.io/kube-gen/cmd/generator: is fragile when run under coverage, so ignore it for now. + # vendor/k8s.io/code-generator/cmd/generator: is fragile when run under coverage, so ignore it for now. # https://github.com/kubernetes/kubernetes/issues/24967 # vendor/k8s.io/client-go/1.4/rest: causes cover internal errors # https://github.com/golang/go/issues/16540 - cover_ignore_dirs="vendor/k8s.io/kube-gen/cmd/generator|vendor/k8s.io/client-go/1.4/rest" + cover_ignore_dirs="vendor/k8s.io/code-generator/cmd/generator|vendor/k8s.io/client-go/1.4/rest" for path in $(echo $cover_ignore_dirs | sed 's/|/ /g'); do echo -e "skipped\tk8s.io/kubernetes/$path" done diff --git a/hack/staging-import-restrictions.json b/hack/staging-import-restrictions.json index 3d421f2449581..51bd3e90100dd 100644 --- a/hack/staging-import-restrictions.json +++ b/hack/staging-import-restrictions.json @@ -14,23 +14,23 @@ ] }, { - "baseImportPath": "./vendor/k8s.io/kube-gen/", + "baseImportPath": "./vendor/k8s.io/code-generator/", "ignoredSubTrees": [ - "./vendor/k8s.io/kube-gen/test" + "./vendor/k8s.io/code-generator/test" ], "allowedImports": [ "k8s.io/gengo", - "k8s.io/kube-gen", + "k8s.io/code-generator", "k8s.io/kube-openapi" ] }, { - "baseImportPath": "./vendor/k8s.io/kube-gen/test/", + "baseImportPath": "./vendor/k8s.io/code-generator/test/", "allowedImports": [ "k8s.io/apimachinery", "k8s.io/client-go", "k8s.io/gengo", - "k8s.io/kube-gen/test", + "k8s.io/code-generator/test", "k8s.io/kube-openapi" ] }, diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 3d35adfff7686..8fae4073c72d1 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -24,9 +24,9 @@ source "${KUBE_ROOT}/hack/lib/init.sh" kube::golang::setup_env BUILD_TARGETS=( - vendor/k8s.io/kube-gen/cmd/client-gen - vendor/k8s.io/kube-gen/cmd/lister-gen - vendor/k8s.io/kube-gen/cmd/informer-gen + vendor/k8s.io/code-generator/cmd/client-gen + vendor/k8s.io/code-generator/cmd/lister-gen + vendor/k8s.io/code-generator/cmd/informer-gen ) make -C "${KUBE_ROOT}" WHAT="${BUILD_TARGETS[*]}" @@ -122,8 +122,8 @@ ${informergen} \ # You may add additional calls of code generators like set-gen above. # call generation on sub-project for now -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/kube-gen/hack/update-codegen.sh -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/kube-aggregator/hack/update-codegen.sh -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/sample-apiserver/hack/update-codegen.sh -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/apiextensions-apiserver/hack/update-codegen.sh -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/metrics/hack/update-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/code-generator/hack/update-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/kube-aggregator/hack/update-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/sample-apiserver/hack/update-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/apiextensions-apiserver/hack/update-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/metrics/hack/update-codegen.sh diff --git a/hack/update-generated-protobuf-dockerized.sh b/hack/update-generated-protobuf-dockerized.sh index 17716e936fd40..e81618fff6d34 100755 --- a/hack/update-generated-protobuf-dockerized.sh +++ b/hack/update-generated-protobuf-dockerized.sh @@ -24,8 +24,8 @@ source "${KUBE_ROOT}/hack/lib/init.sh" kube::golang::setup_env BINS=( - vendor/k8s.io/kube-gen/cmd/go-to-protobuf - vendor/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo + vendor/k8s.io/code-generator/cmd/go-to-protobuf + vendor/k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo ) make -C "${KUBE_ROOT}" WHAT="${BINS[*]}" diff --git a/hack/update-generated-runtime-dockerized.sh b/hack/update-generated-runtime-dockerized.sh index febcc48dca1ee..37f1aa5b8b1d7 100755 --- a/hack/update-generated-runtime-dockerized.sh +++ b/hack/update-generated-runtime-dockerized.sh @@ -25,7 +25,7 @@ source "${KUBE_ROOT}/hack/lib/init.sh" kube::golang::setup_env BINS=( - vendor/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo + vendor/k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo ) make -C "${KUBE_ROOT}" WHAT="${BINS[*]}" diff --git a/hack/verify-api-groups.sh b/hack/verify-api-groups.sh index bbfcb0f02002b..88de8b7f6ab35 100755 --- a/hack/verify-api-groups.sh +++ b/hack/verify-api-groups.sh @@ -71,7 +71,7 @@ groups_without_codegen=( "imagepolicy" "admission" ) -client_gen_file="${KUBE_ROOT}/vendor/k8s.io/kube-gen/cmd/client-gen/main.go" +client_gen_file="${KUBE_ROOT}/vendor/k8s.io/code-generator/cmd/client-gen/main.go" for group_dirname in "${group_dirnames[@]}"; do if ! grep -q "${group_dirname}/" "${client_gen_file}" ; then diff --git a/hack/verify-codegen.sh b/hack/verify-codegen.sh index 0e497fe4ffb09..af94a334ae035 100755 --- a/hack/verify-codegen.sh +++ b/hack/verify-codegen.sh @@ -27,10 +27,10 @@ kube::golang::setup_env # # Note: these must be before the main script call because the later calls the sub-project's # update-codegen.sh scripts. We wouldn't see any error on changes then. -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/kube-gen/hack/verify-codegen.sh -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/kube-aggregator/hack/verify-codegen.sh -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/sample-apiserver/hack/verify-codegen.sh -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/apiextensions-apiserver/hack/verify-codegen.sh -KUBEGEN_PKG=./vendor/k8s.io/kube-gen vendor/k8s.io/metrics/hack/verify-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/code-generator/hack/verify-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/kube-aggregator/hack/verify-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/sample-apiserver/hack/verify-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/apiextensions-apiserver/hack/verify-codegen.sh +CODEGEN_PKG=./vendor/k8s.io/code-generator vendor/k8s.io/metrics/hack/verify-codegen.sh "${KUBE_ROOT}/hack/update-codegen.sh" --verify-only diff --git a/hack/verify-import-boss.sh b/hack/verify-import-boss.sh index 67fdb86c806e3..7e112a4ac69d3 100755 --- a/hack/verify-import-boss.sh +++ b/hack/verify-import-boss.sh @@ -23,6 +23,6 @@ source "${KUBE_ROOT}/hack/lib/init.sh" kube::golang::setup_env -make -C "${KUBE_ROOT}" WHAT=vendor/k8s.io/kube-gen/cmd/import-boss +make -C "${KUBE_ROOT}" WHAT=vendor/k8s.io/code-generator/cmd/import-boss $(kube::util::find-binary "import-boss") --verify-only diff --git a/pkg/generated/openapi/BUILD b/pkg/generated/openapi/BUILD index bc59dcd9045a2..86cd0e7c36205 100644 --- a/pkg/generated/openapi/BUILD +++ b/pkg/generated/openapi/BUILD @@ -55,8 +55,8 @@ openapi_library( "k8s.io/apiserver/pkg/apis/audit/v1beta1", "k8s.io/apiserver/pkg/apis/example/v1", "k8s.io/client-go/pkg/version", + "k8s.io/code-generator/test/apis/testgroup/v1", "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1", - "k8s.io/kube-gen/test/apis/testgroup/v1", "k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1", "k8s.io/metrics/pkg/apis/metrics/v1alpha1", ], diff --git a/pkg/generated/openapi/def.bzl b/pkg/generated/openapi/def.bzl index 3b1f1164bee1f..fa530f2b74549 100644 --- a/pkg/generated/openapi/def.bzl +++ b/pkg/generated/openapi/def.bzl @@ -17,7 +17,7 @@ def openapi_library(name, tags, srcs, openapi_targets=[], vendor_targets=[]): srcs = srcs + ["//hack/boilerplate:boilerplate.go.txt"], outs = ["zz_generated.openapi.go"], cmd = " ".join([ - "$(location //vendor/k8s.io/kube-gen/cmd/openapi-gen)", + "$(location //vendor/k8s.io/code-generator/cmd/openapi-gen)", "--v 1", "--logtostderr", "--go-header-file $(location //hack/boilerplate:boilerplate.go.txt)", @@ -27,5 +27,5 @@ def openapi_library(name, tags, srcs, openapi_targets=[], vendor_targets=[]): "&& cp pkg/generated/openapi/zz_generated.openapi.go $(location :zz_generated.openapi.go)", ]), go_deps = deps, - tools = ["//vendor/k8s.io/kube-gen/cmd/openapi-gen"], + tools = ["//vendor/k8s.io/code-generator/cmd/openapi-gen"], ) diff --git a/staging/BUILD b/staging/BUILD index 36ba8ac835f37..442a01c5ba089 100644 --- a/staging/BUILD +++ b/staging/BUILD @@ -196,25 +196,25 @@ filegroup( "//staging/src/k8s.io/client-go/util/retry:all-srcs", "//staging/src/k8s.io/client-go/util/testing:all-srcs", "//staging/src/k8s.io/client-go/util/workqueue:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/client-gen:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/conversion-gen:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/deepcopy-gen:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/defaulter-gen:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/go-to-protobuf:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/import-boss:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/informer-gen:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/lister-gen:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/openapi-gen:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/set-gen:all-srcs", + "//staging/src/k8s.io/code-generator/test/apis/testgroup:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/internal:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/versioned:all-srcs", + "//staging/src/k8s.io/code-generator/test/informers/externalversions:all-srcs", + "//staging/src/k8s.io/code-generator/test/informers/internalversion:all-srcs", + "//staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion:all-srcs", + "//staging/src/k8s.io/code-generator/test/listers/testgroup/v1:all-srcs", + "//staging/src/k8s.io/code-generator/third_party/forked/golang/reflect:all-srcs", "//staging/src/k8s.io/kube-aggregator:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/client-gen:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/conversion-gen:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/deepcopy-gen:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/defaulter-gen:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/go-to-protobuf:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/import-boss:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/informer-gen:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/lister-gen:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/openapi-gen:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/set-gen:all-srcs", - "//staging/src/k8s.io/kube-gen/test/apis/testgroup:all-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/internal:all-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/versioned:all-srcs", - "//staging/src/k8s.io/kube-gen/test/informers/externalversions:all-srcs", - "//staging/src/k8s.io/kube-gen/test/informers/internalversion:all-srcs", - "//staging/src/k8s.io/kube-gen/test/listers/testgroup/internalversion:all-srcs", - "//staging/src/k8s.io/kube-gen/test/listers/testgroup/v1:all-srcs", - "//staging/src/k8s.io/kube-gen/third_party/forked/golang/reflect:all-srcs", "//staging/src/k8s.io/metrics/pkg/apis/custom_metrics:all-srcs", "//staging/src/k8s.io/metrics/pkg/apis/metrics:all-srcs", "//staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset:all-srcs", diff --git a/staging/README.md b/staging/README.md index ca9b88ed3a4dc..f750d3147c441 100644 --- a/staging/README.md +++ b/staging/README.md @@ -12,7 +12,7 @@ Repositories currently staged here: - [`k8s.io/apiserver`](https://github.com/kubernetes/apiserver) - [`k8s.io/client-go`](https://github.com/kubernetes/client-go) - [`k8s.io/kube-aggregator`](https://github.com/kubernetes/kube-aggregator) -- [`k8s.io/kube-gen`](https://github.com/kubernetes/kube-gen) (about to be published) +- [`k8s.io/code-generator`](https://github.com/kubernetes/code-generator) (about to be published) - [`k8s.io/metrics`](https://github.com/kubernetes/metrics) - [`k8s.io/sample-apiserver`](https://github.com/kubernetes/sample-apiserver) diff --git a/staging/prime-apimachinery.sh b/staging/prime-apimachinery.sh index 0a05d7c8f24ba..c9d4e96fb11ef 100755 --- a/staging/prime-apimachinery.sh +++ b/staging/prime-apimachinery.sh @@ -72,7 +72,7 @@ while read package; do done <${dir}/packages.txt # this file generates something or other, but we don't want to accidentally have it generate into an apimachinery package -git checkout vendor/k8s.io/kube-gen/cmd/set-gen/main.go +git checkout vendor/k8s.io/code-generator/cmd/set-gen/main.go # now run gofmt to get the sorting right diff --git a/staging/src/k8s.io/apiextensions-apiserver/hack/update-codegen.sh b/staging/src/k8s.io/apiextensions-apiserver/hack/update-codegen.sh index 7a30bf1356b81..efc52ecd886f6 100755 --- a/staging/src/k8s.io/apiextensions-apiserver/hack/update-codegen.sh +++ b/staging/src/k8s.io/apiextensions-apiserver/hack/update-codegen.sh @@ -20,7 +20,7 @@ set -o pipefail SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. SCRIPT_BASE=${SCRIPT_ROOT}/../.. -KUBEGEN_PKG=${KUBEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/kube-gen 2>/dev/null || echo k8s.io/kube-gen)} +CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo k8s.io/code-generator)} if LANG=C sed --help 2>&1 | grep -q GNU; then SED="sed" @@ -41,7 +41,7 @@ trap cleanup EXIT echo "Building client-gen" CLIENTGEN="${PWD}/client-gen-binary" -go build -o "${CLIENTGEN}" ${KUBEGEN_PKG}/cmd/client-gen +go build -o "${CLIENTGEN}" ${CODEGEN_PKG}/cmd/client-gen PREFIX=k8s.io/apiextensions-apiserver/pkg/apis INPUT_BASE="--input-base ${PREFIX}" @@ -58,7 +58,7 @@ ${CLIENTGEN} --clientset-name="clientset" ${INPUT_BASE} --input apiextensions/v1 echo "Building lister-gen" listergen="${PWD}/lister-gen" -go build -o "${listergen}" ${KUBEGEN_PKG}/cmd/lister-gen +go build -o "${listergen}" ${CODEGEN_PKG}/cmd/lister-gen LISTER_INPUT="--input-dirs k8s.io/apiextensions-apiserver/pkg/apis/apiextensions --input-dirs k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" LISTER_PATH="--output-package k8s.io/apiextensions-apiserver/pkg/client/listers" @@ -67,7 +67,7 @@ ${listergen} ${LISTER_INPUT} ${LISTER_PATH} --output-base ${SCRIPT_BASE} echo "Building informer-gen" informergen="${PWD}/informer-gen" -go build -o "${informergen}" ${KUBEGEN_PKG}/cmd/informer-gen +go build -o "${informergen}" ${CODEGEN_PKG}/cmd/informer-gen ${informergen} \ --output-base ${SCRIPT_BASE} \ diff --git a/staging/src/k8s.io/apimachinery/pkg/util/sets/BUILD b/staging/src/k8s.io/apimachinery/pkg/util/sets/BUILD index 831606ed3be91..3bf4ebc13b671 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/sets/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/util/sets/BUILD @@ -33,7 +33,7 @@ go_genrule( "string.go", ], cmd = """ -$(location //vendor/k8s.io/kube-gen/cmd/set-gen) \ +$(location //vendor/k8s.io/code-generator/cmd/set-gen) \ --input-dirs ./vendor/k8s.io/apimachinery/pkg/util/sets/types \ --output-base $$(dirname $$(dirname $(location :byte.go))) \ --go-header-file $(location //hack/boilerplate:boilerplate.go.txt) \ @@ -43,7 +43,7 @@ $(location //vendor/k8s.io/kube-gen/cmd/set-gen) \ "//vendor/k8s.io/apimachinery/pkg/util/sets/types:go_default_library", ], tools = [ - "//vendor/k8s.io/kube-gen/cmd/set-gen", + "//vendor/k8s.io/code-generator/cmd/set-gen", ], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/util/sets/types/types.go b/staging/src/k8s.io/apimachinery/pkg/util/sets/types/types.go index f7a280ec77f48..801498ad7d8bb 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/sets/types/types.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/sets/types/types.go @@ -16,7 +16,7 @@ limitations under the License. // Package types just provides input types to the set generator. It also // contains a "go generate" block. -// (You must first `go install k8s.io/kube-gen/cmd/set-gen`) +// (You must first `go install k8s.io/code-generator/cmd/set-gen`) package types //go:generate set-gen -i k8s.io/kubernetes/pkg/util/sets/types diff --git a/staging/src/k8s.io/code-generator/Godeps/Godeps.json b/staging/src/k8s.io/code-generator/Godeps/Godeps.json index 3e5428dd33fa6..27edd8a3bb495 100644 --- a/staging/src/k8s.io/code-generator/Godeps/Godeps.json +++ b/staging/src/k8s.io/code-generator/Godeps/Godeps.json @@ -1,5 +1,5 @@ { - "ImportPath": "k8s.io/kube-gen", + "ImportPath": "k8s.io/code-generator", "GoVersion": "go1.8", "GodepVersion": "v79", "Packages": [ diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/BUILD index 74864e5d48488..cef09f76bb424 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/BUILD @@ -17,10 +17,10 @@ go_library( deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/args:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/generators:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/types:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/args:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/generators:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library", ], ) @@ -35,10 +35,10 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/cmd/client-gen/args:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/client-gen/generators:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/client-gen/path:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/client-gen/types:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/client-gen/args:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/client-gen/generators:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/client-gen/path:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/client-gen/types:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/README.md b/staging/src/k8s.io/code-generator/cmd/client-gen/README.md index 4ed196e62947f..d1d67abdf988c 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/README.md +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/README.md @@ -1,4 +1,4 @@ See [generating-clientset.md](https://git.k8s.io/community/contributors/devel/generating-clientset.md) -[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/staging/src/k8s.io/kube-gen/client-gen/README.md?pixel)]() +[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/staging/src/k8s.io/code-generator/client-gen/README.md?pixel)]() diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/args/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/args/BUILD index 6d7d6df7d58c2..313e268d6f5fe 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/args/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/args/BUILD @@ -8,7 +8,7 @@ load( go_library( name = "go_default_library", srcs = ["args.go"], - deps = ["//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library"], + deps = ["//vendor/k8s.io/code-generator/cmd/client-gen/types:go_default_library"], ) filegroup( diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/args/args.go b/staging/src/k8s.io/code-generator/cmd/client-gen/args/args.go index 29dc92c9cd08b..d454cc12c71db 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/args/args.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/args/args.go @@ -16,7 +16,7 @@ limitations under the License. package args -import "k8s.io/kube-gen/cmd/client-gen/types" +import "k8s.io/code-generator/cmd/client-gen/types" // ClientGenArgs is a wrapper for arguments to client-gen. type Args struct { diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/BUILD index 95ac5eb716a4d..33dad2e742308 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/BUILD @@ -17,16 +17,16 @@ go_library( ], deps = [ "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/args:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/generators/fake:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/generators/scheme:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/generators/util:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/path:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/types:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", "//vendor/k8s.io/gengo/generator:go_default_library", "//vendor/k8s.io/gengo/namer:go_default_library", "//vendor/k8s.io/gengo/types:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/args:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/generators/fake:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/generators/scheme:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/generators/util:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/path:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library", ], ) @@ -41,9 +41,9 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/cmd/client-gen/generators/fake:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/client-gen/generators/scheme:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/client-gen/generators/util:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/client-gen/generators/util:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go index c80019cdd0bc1..e0d958fbf62c7 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go @@ -22,16 +22,16 @@ import ( "path/filepath" "strings" + clientgenargs "k8s.io/code-generator/cmd/client-gen/args" + "k8s.io/code-generator/cmd/client-gen/generators/fake" + "k8s.io/code-generator/cmd/client-gen/generators/scheme" + "k8s.io/code-generator/cmd/client-gen/generators/util" + "k8s.io/code-generator/cmd/client-gen/path" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "k8s.io/gengo/args" "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - clientgenargs "k8s.io/kube-gen/cmd/client-gen/args" - "k8s.io/kube-gen/cmd/client-gen/generators/fake" - "k8s.io/kube-gen/cmd/client-gen/generators/scheme" - "k8s.io/kube-gen/cmd/client-gen/generators/util" - "k8s.io/kube-gen/cmd/client-gen/path" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" "github.com/golang/glog" ) diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/BUILD index 71dd9a18bed89..aed87e7bacba2 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/BUILD @@ -14,14 +14,14 @@ go_library( "generator_fake_for_type.go", ], deps = [ + "//vendor/k8s.io/code-generator/cmd/client-gen/args:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/generators/scheme:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/generators/util:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/path:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/types:go_default_library", "//vendor/k8s.io/gengo/generator:go_default_library", "//vendor/k8s.io/gengo/namer:go_default_library", "//vendor/k8s.io/gengo/types:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/args:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/generators/scheme:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/generators/util:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/path:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go index 36e51f411b21d..9b607fdb35c75 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go @@ -23,10 +23,10 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/types" - clientgenargs "k8s.io/kube-gen/cmd/client-gen/args" - scheme "k8s.io/kube-gen/cmd/client-gen/generators/scheme" - "k8s.io/kube-gen/cmd/client-gen/generators/util" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" + clientgenargs "k8s.io/code-generator/cmd/client-gen/args" + scheme "k8s.io/code-generator/cmd/client-gen/generators/scheme" + "k8s.io/code-generator/cmd/client-gen/generators/util" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" ) func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, clientsetPackage string, inputPackage string, boilerplate []byte, generatedBy string) generator.Package { diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go index 665c88a583ee4..aa2d3b8dbe642 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go @@ -22,10 +22,10 @@ import ( "path/filepath" "strings" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" ) // genClientset generates a package for a clientset. diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go index 092321b93bbc1..31f49c6131ad5 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go @@ -26,7 +26,7 @@ import ( "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/kube-gen/cmd/client-gen/generators/util" + "k8s.io/code-generator/cmd/client-gen/generators/util" ) // genFakeForGroup produces a file for a group client, e.g. ExtensionsClient for the extension group. diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go index a666044054926..d606434da1ed8 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go @@ -24,8 +24,8 @@ import ( "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/kube-gen/cmd/client-gen/generators/util" - "k8s.io/kube-gen/cmd/client-gen/path" + "k8s.io/code-generator/cmd/client-gen/generators/util" + "k8s.io/code-generator/cmd/client-gen/path" ) // genFakeForType produces a file for each top-level type. diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go index 174cb65cb7834..1b8c7e4a8b2c9 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go @@ -22,10 +22,10 @@ import ( "path/filepath" "strings" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" ) // genClientset generates a package for a clientset. diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go index 213796781a5db..d1fda0c8d88f5 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go @@ -24,8 +24,8 @@ import ( "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/kube-gen/cmd/client-gen/generators/util" - "k8s.io/kube-gen/cmd/client-gen/path" + "k8s.io/code-generator/cmd/client-gen/generators/util" + "k8s.io/code-generator/cmd/client-gen/path" ) // genGroup produces a file for a group client, e.g. ExtensionsClient for the extension group. diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go index 8467a0ba4c151..17eea6c215b1b 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go @@ -25,7 +25,7 @@ import ( "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/kube-gen/cmd/client-gen/generators/util" + "k8s.io/code-generator/cmd/client-gen/generators/util" ) // genClientForType produces a file for each top-level type. diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/BUILD b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/BUILD index 850b30ad27b73..8696abc69b2d3 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/BUILD @@ -9,11 +9,11 @@ go_library( name = "go_default_library", srcs = ["generator_for_scheme.go"], deps = [ + "//vendor/k8s.io/code-generator/cmd/client-gen/path:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/types:go_default_library", "//vendor/k8s.io/gengo/generator:go_default_library", "//vendor/k8s.io/gengo/namer:go_default_library", "//vendor/k8s.io/gengo/types:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/path:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go index d703024d6839b..9c02d15c8a272 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go @@ -23,11 +23,11 @@ import ( "path/filepath" "strings" + "k8s.io/code-generator/cmd/client-gen/path" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/kube-gen/cmd/client-gen/path" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" ) // GenScheme produces a package for a clientset with the scheme, codecs and parameter codecs. diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/main.go b/staging/src/k8s.io/code-generator/cmd/client-gen/main.go index bd1e46cea4324..2bbb98b75c9d1 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/main.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/main.go @@ -23,10 +23,10 @@ import ( "sort" "strings" + clientgenargs "k8s.io/code-generator/cmd/client-gen/args" + "k8s.io/code-generator/cmd/client-gen/generators" + "k8s.io/code-generator/cmd/client-gen/types" "k8s.io/gengo/args" - clientgenargs "k8s.io/kube-gen/cmd/client-gen/args" - "k8s.io/kube-gen/cmd/client-gen/generators" - "k8s.io/kube-gen/cmd/client-gen/types" "github.com/golang/glog" flag "github.com/spf13/pflag" diff --git a/staging/src/k8s.io/code-generator/cmd/conversion-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/conversion-gen/BUILD index fea52467213dc..399ca9a0bbfb2 100644 --- a/staging/src/k8s.io/code-generator/cmd/conversion-gen/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/conversion-gen/BUILD @@ -17,8 +17,8 @@ go_library( deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/code-generator/cmd/conversion-gen/generators:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/conversion-gen/generators:go_default_library", ], ) @@ -33,7 +33,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/cmd/conversion-gen/generators:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/conversion-gen/generators:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/cmd/conversion-gen/main.go b/staging/src/k8s.io/code-generator/cmd/conversion-gen/main.go index 031c7d6d763a8..bff3246829927 100644 --- a/staging/src/k8s.io/code-generator/cmd/conversion-gen/main.go +++ b/staging/src/k8s.io/code-generator/cmd/conversion-gen/main.go @@ -37,8 +37,8 @@ package main import ( "path/filepath" + "k8s.io/code-generator/cmd/conversion-gen/generators" "k8s.io/gengo/args" - "k8s.io/kube-gen/cmd/conversion-gen/generators" "github.com/golang/glog" "github.com/spf13/pflag" diff --git a/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/BUILD b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/BUILD index 2cbc76dd291b8..d4d92238e2be9 100644 --- a/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/BUILD @@ -16,7 +16,7 @@ go_library( srcs = ["main.go"], deps = [ "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf:go_default_library", + "//vendor/k8s.io/code-generator/cmd/go-to-protobuf/protobuf:go_default_library", ], ) @@ -31,8 +31,8 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protobuf:all-srcs", - "//staging/src/k8s.io/kube-gen/cmd/go-to-protobuf/protoc-gen-gogo:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/main.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/main.go index e9b11d2a4fade..8a727193901a0 100644 --- a/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/main.go +++ b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/main.go @@ -19,7 +19,7 @@ limitations under the License. package main import ( - "k8s.io/kube-gen/cmd/go-to-protobuf/protobuf" + "k8s.io/code-generator/cmd/go-to-protobuf/protobuf" flag "github.com/spf13/pflag" ) diff --git a/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/BUILD b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/BUILD index 3d115ba277296..dfa9f43b5bac9 100644 --- a/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/BUILD @@ -20,12 +20,12 @@ go_library( deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/code-generator/third_party/forked/golang/reflect:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", "//vendor/k8s.io/gengo/generator:go_default_library", "//vendor/k8s.io/gengo/namer:go_default_library", "//vendor/k8s.io/gengo/parser:go_default_library", "//vendor/k8s.io/gengo/types:go_default_library", - "//vendor/k8s.io/kube-gen/third_party/forked/golang/reflect:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/parser.go b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/parser.go index ffa8347d19ca2..305b718edb568 100644 --- a/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/parser.go +++ b/staging/src/k8s.io/code-generator/cmd/go-to-protobuf/protobuf/parser.go @@ -30,7 +30,7 @@ import ( "reflect" "strings" - customreflect "k8s.io/kube-gen/third_party/forked/golang/reflect" + customreflect "k8s.io/code-generator/third_party/forked/golang/reflect" ) func rewriteFile(name string, header []byte, rewriteFn func(*token.FileSet, *ast.File) error) error { diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/informer-gen/BUILD index df7ee1a6d242f..5ed46f2b84d08 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/BUILD @@ -17,8 +17,8 @@ go_library( deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/code-generator/cmd/informer-gen/generators:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/informer-gen/generators:go_default_library", ], ) @@ -33,7 +33,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/cmd/informer-gen/generators:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/informer-gen/generators:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/BUILD b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/BUILD index 1f56383d0fac6..a582ad757e9b2 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/BUILD @@ -22,12 +22,12 @@ go_library( deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/generators/util:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/types:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", "//vendor/k8s.io/gengo/generator:go_default_library", "//vendor/k8s.io/gengo/namer:go_default_library", "//vendor/k8s.io/gengo/types:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/generators/util:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go index ffba1944885fd..16f733506e542 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go @@ -19,10 +19,10 @@ package generators import ( "io" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" "github.com/golang/glog" ) diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go index d3c161e181293..4054b577d433c 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go @@ -21,10 +21,10 @@ import ( "sort" "strings" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" ) // genericGenerator generates the generic informer. diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/groupinterface.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/groupinterface.go index 2d2c9b3b7bda5..bc6468ea57590 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/groupinterface.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/groupinterface.go @@ -21,10 +21,10 @@ import ( "path/filepath" "strings" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "k8s.io/gengo/generator" "k8s.io/gengo/namer" "k8s.io/gengo/types" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" ) // groupInterfaceGenerator generates the per-group interface file. diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go index ea93bc828ca6d..939d271fa38bf 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go @@ -25,8 +25,8 @@ import ( "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/kube-gen/cmd/client-gen/generators/util" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" + "k8s.io/code-generator/cmd/client-gen/generators/util" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "github.com/golang/glog" ) diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go index 08d3caa810c22..593e56a2b5f35 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go @@ -26,8 +26,8 @@ import ( "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/kube-gen/cmd/client-gen/generators/util" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" + "k8s.io/code-generator/cmd/client-gen/generators/util" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "github.com/golang/glog" ) diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/main.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/main.go index 2f946b82902fd..00d4eae2b88c4 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/main.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/main.go @@ -19,8 +19,8 @@ package main import ( "path/filepath" + "k8s.io/code-generator/cmd/informer-gen/generators" "k8s.io/gengo/args" - "k8s.io/kube-gen/cmd/informer-gen/generators" "github.com/golang/glog" "github.com/spf13/pflag" diff --git a/staging/src/k8s.io/code-generator/cmd/lister-gen/BUILD b/staging/src/k8s.io/code-generator/cmd/lister-gen/BUILD index 292dab89b7f76..12235364c442d 100644 --- a/staging/src/k8s.io/code-generator/cmd/lister-gen/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/lister-gen/BUILD @@ -17,8 +17,8 @@ go_library( deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/k8s.io/code-generator/cmd/lister-gen/generators:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/lister-gen/generators:go_default_library", ], ) @@ -33,7 +33,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/cmd/lister-gen/generators:all-srcs", + "//staging/src/k8s.io/code-generator/cmd/lister-gen/generators:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/BUILD b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/BUILD index 0d1b4865e369e..088e7098b1531 100644 --- a/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/BUILD +++ b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/BUILD @@ -14,12 +14,12 @@ go_library( ], deps = [ "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/generators/util:go_default_library", + "//vendor/k8s.io/code-generator/cmd/client-gen/types:go_default_library", "//vendor/k8s.io/gengo/args:go_default_library", "//vendor/k8s.io/gengo/generator:go_default_library", "//vendor/k8s.io/gengo/namer:go_default_library", "//vendor/k8s.io/gengo/types:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/generators/util:go_default_library", - "//vendor/k8s.io/kube-gen/cmd/client-gen/types:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/expansion.go b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/expansion.go index c091982d196f0..984368464cfe5 100644 --- a/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/expansion.go +++ b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/expansion.go @@ -25,7 +25,7 @@ import ( "k8s.io/gengo/generator" "k8s.io/gengo/types" - "k8s.io/kube-gen/cmd/client-gen/generators/util" + "k8s.io/code-generator/cmd/client-gen/generators/util" ) // expansionGenerator produces a file for a expansion interfaces. diff --git a/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go index e2e0e75f71897..9466e3cb07d35 100644 --- a/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go +++ b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go @@ -27,8 +27,8 @@ import ( "k8s.io/gengo/namer" "k8s.io/gengo/types" - "k8s.io/kube-gen/cmd/client-gen/generators/util" - clientgentypes "k8s.io/kube-gen/cmd/client-gen/types" + "k8s.io/code-generator/cmd/client-gen/generators/util" + clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "github.com/golang/glog" ) diff --git a/staging/src/k8s.io/code-generator/cmd/lister-gen/main.go b/staging/src/k8s.io/code-generator/cmd/lister-gen/main.go index 4af9d97b32beb..1be54d7471624 100644 --- a/staging/src/k8s.io/code-generator/cmd/lister-gen/main.go +++ b/staging/src/k8s.io/code-generator/cmd/lister-gen/main.go @@ -19,8 +19,8 @@ package main import ( "path/filepath" + "k8s.io/code-generator/cmd/lister-gen/generators" "k8s.io/gengo/args" - "k8s.io/kube-gen/cmd/lister-gen/generators" "github.com/golang/glog" "github.com/spf13/pflag" diff --git a/staging/src/k8s.io/code-generator/hack/update-codegen.sh b/staging/src/k8s.io/code-generator/hack/update-codegen.sh index f2a650d328415..2913e035b3e94 100755 --- a/staging/src/k8s.io/code-generator/hack/update-codegen.sh +++ b/staging/src/k8s.io/code-generator/hack/update-codegen.sh @@ -18,10 +18,10 @@ set -o errexit set -o nounset set -o pipefail -SCRIPT_PACKAGE=k8s.io/kube-gen +SCRIPT_PACKAGE=k8s.io/code-generator SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. SCRIPT_BASE=${SCRIPT_ROOT}/../.. -KUBEGEN_PKG=${KUBEGEN_PKG:-$(ls -d -1 ./vendor/k8s.io/kube-gen 2>/dev/null || echo "k8s.io/kube-gen")} +CODEGEN_PKG=${CODEGEN_PKG:-$(ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo "k8s.io/code-generator")} clientgen="${PWD}/client-gen-binary" listergen="${PWD}/lister-gen" @@ -47,20 +47,20 @@ function generate_group() { ) echo "Building client-gen" - go build -o "${clientgen}" ${KUBEGEN_PKG}/cmd/client-gen + go build -o "${clientgen}" ${CODEGEN_PKG}/cmd/client-gen echo "generating clientset for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${CLIENT_PKG}" ${clientgen} --clientset-name="internal" --input-base ${APIS_PKG} --input ${INPUT_APIS[@]} --clientset-path ${CLIENT_PKG} --output-base=${SCRIPT_BASE} ${clientgen} --clientset-name="versioned" --input-base ${APIS_PKG} --input ${GROUP_NAME}/${VERSION} --clientset-path ${CLIENT_PKG} --output-base=${SCRIPT_BASE} echo "Building lister-gen" - go build -o "${listergen}" ${KUBEGEN_PKG}/cmd/lister-gen + go build -o "${listergen}" ${CODEGEN_PKG}/cmd/lister-gen echo "generating listers for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${LISTERS_PKG}" ${listergen} --input-dirs ${APIS_PKG}/${GROUP_NAME} --input-dirs ${APIS_PKG}/${GROUP_NAME}/${VERSION} --output-package ${LISTERS_PKG} --output-base ${SCRIPT_BASE} echo "Building informer-gen" - go build -o "${informergen}" ${KUBEGEN_PKG}/cmd/informer-gen + go build -o "${informergen}" ${CODEGEN_PKG}/cmd/informer-gen echo "generating informers for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${INFORMERS_PKG}" ${informergen} \ diff --git a/staging/src/k8s.io/code-generator/test/apis/testgroup/BUILD b/staging/src/k8s.io/code-generator/test/apis/testgroup/BUILD index 4f10bd633232b..e7df940367a2b 100644 --- a/staging/src/k8s.io/code-generator/test/apis/testgroup/BUILD +++ b/staging/src/k8s.io/code-generator/test/apis/testgroup/BUILD @@ -32,8 +32,8 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/test/apis/testgroup/install:all-srcs", - "//staging/src/k8s.io/kube-gen/test/apis/testgroup/v1:all-srcs", + "//staging/src/k8s.io/code-generator/test/apis/testgroup/install:all-srcs", + "//staging/src/k8s.io/code-generator/test/apis/testgroup/v1:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/test/apis/testgroup/doc.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/doc.go index 8245a703b4d72..8ee9881358515 100644 --- a/staging/src/k8s.io/code-generator/test/apis/testgroup/doc.go +++ b/staging/src/k8s.io/code-generator/test/apis/testgroup/doc.go @@ -16,4 +16,4 @@ limitations under the License. // +k8s:deepcopy-gen=package,register // +groupName=testgroup.k8s.io -package testgroup // import "k8s.io/kube-gen/test/apis/testgroup" +package testgroup // import "k8s.io/code-generator/test/apis/testgroup" diff --git a/staging/src/k8s.io/code-generator/test/apis/testgroup/install/BUILD b/staging/src/k8s.io/code-generator/test/apis/testgroup/install/BUILD index bff464c2a2ab5..06797da115f3a 100644 --- a/staging/src/k8s.io/code-generator/test/apis/testgroup/install/BUILD +++ b/staging/src/k8s.io/code-generator/test/apis/testgroup/install/BUILD @@ -12,8 +12,8 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup/v1:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/apis/testgroup/install/install.go b/staging/src/k8s.io/code-generator/test/apis/testgroup/install/install.go index b31f54afba7a6..c3178c176d1fe 100644 --- a/staging/src/k8s.io/code-generator/test/apis/testgroup/install/install.go +++ b/staging/src/k8s.io/code-generator/test/apis/testgroup/install/install.go @@ -22,8 +22,8 @@ import ( "k8s.io/apimachinery/pkg/apimachinery/announced" "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/kube-gen/test/apis/testgroup" - "k8s.io/kube-gen/test/apis/testgroup/v1" + "k8s.io/code-generator/test/apis/testgroup" + "k8s.io/code-generator/test/apis/testgroup/v1" ) // Install registers the API group and adds types to a scheme diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/BUILD index f4cc9735339ad..1611c9e6eafcb 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/BUILD @@ -16,7 +16,7 @@ go_library( "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion:go_default_library", ], ) @@ -31,9 +31,9 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/internal/fake:all-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/internal/scheme:all-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/internal/fake:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/internal/scheme:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/clientset.go b/staging/src/k8s.io/code-generator/test/clientset/internal/clientset.go index 2046acba1ce62..8e932a9e63f81 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/clientset.go +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/clientset.go @@ -21,7 +21,7 @@ import ( discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" - testgroupinternalversion "k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion" + testgroupinternalversion "k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion" ) type Interface interface { diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/fake/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/BUILD index 6ef5deb74c5cd..7d1affdced89c 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/fake/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/BUILD @@ -21,10 +21,10 @@ go_library( "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/discovery/fake:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/internal:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/internal:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/fake/clientset_generated.go b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/clientset_generated.go index 35deb3b0342d3..57789239115f3 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/fake/clientset_generated.go +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/clientset_generated.go @@ -22,9 +22,9 @@ import ( "k8s.io/client-go/discovery" fakediscovery "k8s.io/client-go/discovery/fake" "k8s.io/client-go/testing" - clientset "k8s.io/kube-gen/test/clientset/internal" - testgroupinternalversion "k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion" - faketestgroupinternalversion "k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake" + clientset "k8s.io/code-generator/test/clientset/internal" + testgroupinternalversion "k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion" + faketestgroupinternalversion "k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake" ) // NewSimpleClientset returns a clientset that will respond with the provided objects. diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/fake/register.go b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/register.go index 6f19bd5f25f2f..903aef54103e2 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/fake/register.go +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/fake/register.go @@ -21,7 +21,7 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - testgroupinternalversion "k8s.io/kube-gen/test/apis/testgroup" + testgroupinternalversion "k8s.io/code-generator/test/apis/testgroup" ) var scheme = runtime.NewScheme() diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/BUILD index 8d8513ff6ef1d..0f64934bea805 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/BUILD @@ -18,7 +18,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup/install:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup/install:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/register.go b/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/register.go index 979fcc4b6601d..74fd8aba5d34a 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/register.go +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/scheme/register.go @@ -23,7 +23,7 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - testgroup "k8s.io/kube-gen/test/apis/testgroup/install" + testgroup "k8s.io/code-generator/test/apis/testgroup/install" os "os" ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/BUILD index 85e9eebd074b5..8760c4c081d3e 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/BUILD @@ -18,8 +18,8 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/internal/scheme:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/internal/scheme:go_default_library", ], ) @@ -34,7 +34,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion/fake:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD index 5ac8473e9ee45..78fca5f8e066e 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/BUILD @@ -20,8 +20,8 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go index 343b2fcbd66a2..bc7f5370de6e2 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go @@ -19,7 +19,7 @@ package fake import ( rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" - internalversion "k8s.io/kube-gen/test/clientset/internal/typed/testgroup/internalversion" + internalversion "k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion" ) type FakeTestgroup struct { diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go index e7ca6ee575fd0..0316834a6ad1c 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go @@ -23,7 +23,7 @@ import ( types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" testing "k8s.io/client-go/testing" - testgroup "k8s.io/kube-gen/test/apis/testgroup" + testgroup "k8s.io/code-generator/test/apis/testgroup" ) // FakeTestTypes implements TestTypeInterface diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go index f511f78ecb08e..8164fa83db11d 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go @@ -18,7 +18,7 @@ package internalversion import ( rest "k8s.io/client-go/rest" - "k8s.io/kube-gen/test/clientset/internal/scheme" + "k8s.io/code-generator/test/clientset/internal/scheme" ) type TestgroupInterface interface { diff --git a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testtype.go index 058540a5ed771..8214543db5338 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testtype.go +++ b/staging/src/k8s.io/code-generator/test/clientset/internal/typed/testgroup/internalversion/testtype.go @@ -21,8 +21,8 @@ import ( types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" rest "k8s.io/client-go/rest" - testgroup "k8s.io/kube-gen/test/apis/testgroup" - scheme "k8s.io/kube-gen/test/clientset/internal/scheme" + testgroup "k8s.io/code-generator/test/apis/testgroup" + scheme "k8s.io/code-generator/test/clientset/internal/scheme" ) // TestTypesGetter has a method to return a TestTypeInterface. diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/BUILD index 0877e63c3ef3f..af738f1ec5b28 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/BUILD @@ -16,7 +16,7 @@ go_library( "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1:go_default_library", ], ) @@ -31,9 +31,9 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/versioned/fake:all-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/versioned/scheme:all-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/versioned/fake:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/versioned/scheme:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/clientset.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/clientset.go index 709bb6418e3ff..b304108406df1 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/clientset.go +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/clientset.go @@ -21,7 +21,7 @@ import ( discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" - testgroupv1 "k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1" + testgroupv1 "k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1" ) type Interface interface { diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/BUILD index 8796fbb90a971..58bb040d3f92b 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/BUILD @@ -21,10 +21,10 @@ go_library( "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/discovery/fake:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup/v1:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/versioned:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/versioned:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/clientset_generated.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/clientset_generated.go index 3fff1dd73df33..3967979b09b56 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/clientset_generated.go +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/clientset_generated.go @@ -22,9 +22,9 @@ import ( "k8s.io/client-go/discovery" fakediscovery "k8s.io/client-go/discovery/fake" "k8s.io/client-go/testing" - clientset "k8s.io/kube-gen/test/clientset/versioned" - testgroupv1 "k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1" - faketestgroupv1 "k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake" + clientset "k8s.io/code-generator/test/clientset/versioned" + testgroupv1 "k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1" + faketestgroupv1 "k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake" ) // NewSimpleClientset returns a clientset that will respond with the provided objects. diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/register.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/register.go index 6c680274c63a4..7783996446b20 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/register.go +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/fake/register.go @@ -21,7 +21,7 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - testgroupv1 "k8s.io/kube-gen/test/apis/testgroup/v1" + testgroupv1 "k8s.io/code-generator/test/apis/testgroup/v1" ) var scheme = runtime.NewScheme() diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/BUILD index 597a08106f319..cbe61ba2562ba 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/BUILD @@ -16,7 +16,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup/v1:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/register.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/register.go index f0dba06031807..52f8ceb641920 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/register.go +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/scheme/register.go @@ -21,7 +21,7 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - testgroupv1 "k8s.io/kube-gen/test/apis/testgroup/v1" + testgroupv1 "k8s.io/code-generator/test/apis/testgroup/v1" ) var Scheme = runtime.NewScheme() diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/BUILD index 54c2ffbfb3ea9..073a2e3335e09 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/BUILD @@ -19,8 +19,8 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup/v1:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/versioned/scheme:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/versioned/scheme:go_default_library", ], ) @@ -35,7 +35,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1/fake:all-srcs", + "//staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/BUILD b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/BUILD index c8bce9ba0cf4a..68255f153bd82 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/BUILD +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/BUILD @@ -20,8 +20,8 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup/v1:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go index 871d4c2546ee8..3cff2ef02e3fa 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go @@ -19,7 +19,7 @@ package fake import ( rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" - v1 "k8s.io/kube-gen/test/clientset/versioned/typed/testgroup/v1" + v1 "k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1" ) type FakeTestgroupV1 struct { diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go index 6817ee940a09f..07fd85d95d077 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go @@ -23,7 +23,7 @@ import ( types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" testing "k8s.io/client-go/testing" - testgroup_v1 "k8s.io/kube-gen/test/apis/testgroup/v1" + testgroup_v1 "k8s.io/code-generator/test/apis/testgroup/v1" ) // FakeTestTypes implements TestTypeInterface diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testgroup_client.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testgroup_client.go index 65f4ea6d811b9..60233a0fc8b95 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testgroup_client.go +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testgroup_client.go @@ -19,8 +19,8 @@ package v1 import ( serializer "k8s.io/apimachinery/pkg/runtime/serializer" rest "k8s.io/client-go/rest" - v1 "k8s.io/kube-gen/test/apis/testgroup/v1" - "k8s.io/kube-gen/test/clientset/versioned/scheme" + v1 "k8s.io/code-generator/test/apis/testgroup/v1" + "k8s.io/code-generator/test/clientset/versioned/scheme" ) type TestgroupV1Interface interface { diff --git a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testtype.go index a2de565395c53..5fdaf5acf7a00 100644 --- a/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testtype.go +++ b/staging/src/k8s.io/code-generator/test/clientset/versioned/typed/testgroup/v1/testtype.go @@ -21,8 +21,8 @@ import ( types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" rest "k8s.io/client-go/rest" - v1 "k8s.io/kube-gen/test/apis/testgroup/v1" - scheme "k8s.io/kube-gen/test/clientset/versioned/scheme" + v1 "k8s.io/code-generator/test/apis/testgroup/v1" + scheme "k8s.io/code-generator/test/clientset/versioned/scheme" ) // TestTypesGetter has a method to return a TestTypeInterface. diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/BUILD b/staging/src/k8s.io/code-generator/test/informers/externalversions/BUILD index 9f53f06c80d68..238ee451f70d8 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/BUILD +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/BUILD @@ -15,10 +15,10 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup/v1:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/versioned:go_default_library", - "//vendor/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/kube-gen/test/informers/externalversions/testgroup:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/versioned:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/externalversions/internalinterfaces:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/externalversions/testgroup:go_default_library", ], ) @@ -33,8 +33,8 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces:all-srcs", - "//staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup:all-srcs", + "//staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces:all-srcs", + "//staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/factory.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/factory.go index 69f6f12bbcbca..e3635b36caead 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/factory.go +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/factory.go @@ -22,9 +22,9 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - versioned "k8s.io/kube-gen/test/clientset/versioned" - internalinterfaces "k8s.io/kube-gen/test/informers/externalversions/internalinterfaces" - testgroup "k8s.io/kube-gen/test/informers/externalversions/testgroup" + versioned "k8s.io/code-generator/test/clientset/versioned" + internalinterfaces "k8s.io/code-generator/test/informers/externalversions/internalinterfaces" + testgroup "k8s.io/code-generator/test/informers/externalversions/testgroup" reflect "reflect" sync "sync" time "time" diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/generic.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/generic.go index 96e76140da6ef..0a74127c38855 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/generic.go +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/generic.go @@ -22,7 +22,7 @@ import ( "fmt" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - v1 "k8s.io/kube-gen/test/apis/testgroup/v1" + v1 "k8s.io/code-generator/test/apis/testgroup/v1" ) // GenericInformer is type of SharedIndexInformer which will locate and delegate to other diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/BUILD b/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/BUILD index dcdcd13360fac..d84cf9726a9f5 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/BUILD +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/BUILD @@ -11,7 +11,7 @@ go_library( deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/versioned:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/versioned:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/factory_interfaces.go index 0365c955734b0..6dbb51f83dc4d 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/factory_interfaces.go +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -21,7 +21,7 @@ package internalinterfaces import ( runtime "k8s.io/apimachinery/pkg/runtime" cache "k8s.io/client-go/tools/cache" - versioned "k8s.io/kube-gen/test/clientset/versioned" + versioned "k8s.io/code-generator/test/clientset/versioned" time "time" ) diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/BUILD b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/BUILD index cb8cdbf610acb..88b68b583742c 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/BUILD +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/BUILD @@ -9,8 +9,8 @@ go_library( name = "go_default_library", srcs = ["interface.go"], deps = [ - "//vendor/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/externalversions/internalinterfaces:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/externalversions/testgroup/v1:go_default_library", ], ) @@ -25,7 +25,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/test/informers/externalversions/testgroup/v1:all-srcs", + "//staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/interface.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/interface.go index 575e0de1200fb..23882d106d995 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/interface.go +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/interface.go @@ -19,8 +19,8 @@ limitations under the License. package testgroup import ( - internalinterfaces "k8s.io/kube-gen/test/informers/externalversions/internalinterfaces" - v1 "k8s.io/kube-gen/test/informers/externalversions/testgroup/v1" + internalinterfaces "k8s.io/code-generator/test/informers/externalversions/internalinterfaces" + v1 "k8s.io/code-generator/test/informers/externalversions/testgroup/v1" ) // Interface provides access to each of this group's versions. diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/BUILD b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/BUILD index 02608a2d6d1e3..435d789f82abd 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/BUILD +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/BUILD @@ -16,10 +16,10 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup/v1:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/versioned:go_default_library", - "//vendor/k8s.io/kube-gen/test/informers/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/kube-gen/test/listers/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/versioned:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/externalversions/internalinterfaces:go_default_library", + "//vendor/k8s.io/code-generator/test/listers/testgroup/v1:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/interface.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/interface.go index 55bb003d211e3..7bb5a1563749d 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/interface.go +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/interface.go @@ -19,7 +19,7 @@ limitations under the License. package v1 import ( - internalinterfaces "k8s.io/kube-gen/test/informers/externalversions/internalinterfaces" + internalinterfaces "k8s.io/code-generator/test/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/testtype.go index 1334919987117..0bb1e1f42ee8c 100644 --- a/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/testtype.go +++ b/staging/src/k8s.io/code-generator/test/informers/externalversions/testgroup/v1/testtype.go @@ -23,10 +23,10 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" cache "k8s.io/client-go/tools/cache" - testgroup_v1 "k8s.io/kube-gen/test/apis/testgroup/v1" - versioned "k8s.io/kube-gen/test/clientset/versioned" - internalinterfaces "k8s.io/kube-gen/test/informers/externalversions/internalinterfaces" - v1 "k8s.io/kube-gen/test/listers/testgroup/v1" + testgroup_v1 "k8s.io/code-generator/test/apis/testgroup/v1" + versioned "k8s.io/code-generator/test/clientset/versioned" + internalinterfaces "k8s.io/code-generator/test/informers/externalversions/internalinterfaces" + v1 "k8s.io/code-generator/test/listers/testgroup/v1" time "time" ) diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/BUILD b/staging/src/k8s.io/code-generator/test/informers/internalversion/BUILD index 5c6fc023be94a..c86eb60057967 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/BUILD +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/BUILD @@ -15,10 +15,10 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/internal:go_default_library", - "//vendor/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces:go_default_library", - "//vendor/k8s.io/kube-gen/test/informers/internalversion/testgroup:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/internal:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/internalversion/internalinterfaces:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/internalversion/testgroup:go_default_library", ], ) @@ -33,8 +33,8 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces:all-srcs", - "//staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup:all-srcs", + "//staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces:all-srcs", + "//staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/factory.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/factory.go index 3169e32837f98..be67ac386ce87 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/factory.go +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/factory.go @@ -22,9 +22,9 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - internal "k8s.io/kube-gen/test/clientset/internal" - internalinterfaces "k8s.io/kube-gen/test/informers/internalversion/internalinterfaces" - testgroup "k8s.io/kube-gen/test/informers/internalversion/testgroup" + internal "k8s.io/code-generator/test/clientset/internal" + internalinterfaces "k8s.io/code-generator/test/informers/internalversion/internalinterfaces" + testgroup "k8s.io/code-generator/test/informers/internalversion/testgroup" reflect "reflect" sync "sync" time "time" diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/generic.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/generic.go index d5fd7f572c05f..fda81fd6753db 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/generic.go +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/generic.go @@ -22,7 +22,7 @@ import ( "fmt" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - testgroup "k8s.io/kube-gen/test/apis/testgroup" + testgroup "k8s.io/code-generator/test/apis/testgroup" ) // GenericInformer is type of SharedIndexInformer which will locate and delegate to other diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/BUILD b/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/BUILD index a2c8557847997..ca82011c20008 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/BUILD +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/BUILD @@ -11,7 +11,7 @@ go_library( deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/internal:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/internal:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/factory_interfaces.go index 4be066e829dac..96331a169b918 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/factory_interfaces.go +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/internalinterfaces/factory_interfaces.go @@ -21,7 +21,7 @@ package internalinterfaces import ( runtime "k8s.io/apimachinery/pkg/runtime" cache "k8s.io/client-go/tools/cache" - internal "k8s.io/kube-gen/test/clientset/internal" + internal "k8s.io/code-generator/test/clientset/internal" time "time" ) diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/BUILD b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/BUILD index a248c9e4ae109..f9c7a84ce8974 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/BUILD +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/BUILD @@ -9,8 +9,8 @@ go_library( name = "go_default_library", srcs = ["interface.go"], deps = [ - "//vendor/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces:go_default_library", - "//vendor/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/internalversion/internalinterfaces:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion:go_default_library", ], ) @@ -25,7 +25,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion:all-srcs", + "//staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion:all-srcs", ], tags = ["automanaged"], ) diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/interface.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/interface.go index 85975e32732da..48a3be5ae7bf7 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/interface.go +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/interface.go @@ -19,8 +19,8 @@ limitations under the License. package testgroup import ( - internalinterfaces "k8s.io/kube-gen/test/informers/internalversion/internalinterfaces" - internalversion "k8s.io/kube-gen/test/informers/internalversion/testgroup/internalversion" + internalinterfaces "k8s.io/code-generator/test/informers/internalversion/internalinterfaces" + internalversion "k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion" ) // Interface provides access to each of this group's versions. diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/BUILD b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/BUILD index ce07c44937396..3b5924ca6efc0 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/BUILD +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/BUILD @@ -16,10 +16,10 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup:go_default_library", - "//vendor/k8s.io/kube-gen/test/clientset/internal:go_default_library", - "//vendor/k8s.io/kube-gen/test/informers/internalversion/internalinterfaces:go_default_library", - "//vendor/k8s.io/kube-gen/test/listers/testgroup/internalversion:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup:go_default_library", + "//vendor/k8s.io/code-generator/test/clientset/internal:go_default_library", + "//vendor/k8s.io/code-generator/test/informers/internalversion/internalinterfaces:go_default_library", + "//vendor/k8s.io/code-generator/test/listers/testgroup/internalversion:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/interface.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/interface.go index b96b634e7c954..3d3d5d3483a6f 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/interface.go +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/interface.go @@ -19,7 +19,7 @@ limitations under the License. package internalversion import ( - internalinterfaces "k8s.io/kube-gen/test/informers/internalversion/internalinterfaces" + internalinterfaces "k8s.io/code-generator/test/informers/internalversion/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/testtype.go index 7ba7728cba39f..2b41de2f796ef 100644 --- a/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/testtype.go +++ b/staging/src/k8s.io/code-generator/test/informers/internalversion/testgroup/internalversion/testtype.go @@ -23,10 +23,10 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" cache "k8s.io/client-go/tools/cache" - testgroup "k8s.io/kube-gen/test/apis/testgroup" - internal "k8s.io/kube-gen/test/clientset/internal" - internalinterfaces "k8s.io/kube-gen/test/informers/internalversion/internalinterfaces" - internalversion "k8s.io/kube-gen/test/listers/testgroup/internalversion" + testgroup "k8s.io/code-generator/test/apis/testgroup" + internal "k8s.io/code-generator/test/clientset/internal" + internalinterfaces "k8s.io/code-generator/test/informers/internalversion/internalinterfaces" + internalversion "k8s.io/code-generator/test/listers/testgroup/internalversion" time "time" ) diff --git a/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/BUILD b/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/BUILD index c75646056a700..c68ae5da55056 100644 --- a/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/BUILD +++ b/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/BUILD @@ -15,7 +15,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/testtype.go index 90378b025d740..bf4af4492e164 100644 --- a/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/testtype.go +++ b/staging/src/k8s.io/code-generator/test/listers/testgroup/internalversion/testtype.go @@ -22,7 +22,7 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" - testgroup "k8s.io/kube-gen/test/apis/testgroup" + testgroup "k8s.io/code-generator/test/apis/testgroup" ) // TestTypeLister helps list TestTypes. diff --git a/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/BUILD b/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/BUILD index f9de88d20695c..4590b4eaf57f6 100644 --- a/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/BUILD +++ b/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/BUILD @@ -15,7 +15,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/kube-gen/test/apis/testgroup/v1:go_default_library", + "//vendor/k8s.io/code-generator/test/apis/testgroup/v1:go_default_library", ], ) diff --git a/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/testtype.go index f033643c53eba..37ec9a335b300 100644 --- a/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/testtype.go +++ b/staging/src/k8s.io/code-generator/test/listers/testgroup/v1/testtype.go @@ -22,7 +22,7 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" - v1 "k8s.io/kube-gen/test/apis/testgroup/v1" + v1 "k8s.io/code-generator/test/apis/testgroup/v1" ) // TestTypeLister helps list TestTypes. diff --git a/staging/src/k8s.io/kube-aggregator/hack/update-codegen.sh b/staging/src/k8s.io/kube-aggregator/hack/update-codegen.sh index a8b1f5c6d870c..53e9889caebcf 100755 --- a/staging/src/k8s.io/kube-aggregator/hack/update-codegen.sh +++ b/staging/src/k8s.io/kube-aggregator/hack/update-codegen.sh @@ -20,7 +20,7 @@ set -o pipefail SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. SCRIPT_BASE=${SCRIPT_ROOT}/../.. -KUBEGEN_PKG=${KUBEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/kube-gen 2>/dev/null || echo k8s.io/kube-gen)} +CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo k8s.io/code-generator)} if LANG=C sed --help 2>&1 | grep -q GNU; then SED="sed" @@ -42,7 +42,7 @@ trap cleanup EXIT echo "Building client-gen" CLIENTGEN="${PWD}/client-gen-binary" -go build -o "${CLIENTGEN}" ${KUBEGEN_PKG}/cmd/client-gen +go build -o "${CLIENTGEN}" ${CODEGEN_PKG}/cmd/client-gen PREFIX=k8s.io/kube-aggregator/pkg/apis INPUT_BASE="--input-base ${PREFIX}" @@ -59,7 +59,7 @@ ${CLIENTGEN} --clientset-name="clientset" ${INPUT_BASE} --input apiregistration/ echo "Building lister-gen" listergen="${PWD}/lister-gen" -go build -o "${listergen}" ${KUBEGEN_PKG}/cmd/lister-gen +go build -o "${listergen}" ${CODEGEN_PKG}/cmd/lister-gen LISTER_INPUT="--input-dirs k8s.io/kube-aggregator/pkg/apis/apiregistration --input-dirs k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1" LISTER_PATH="--output-package k8s.io/kube-aggregator/pkg/client/listers" @@ -68,7 +68,7 @@ ${listergen} ${LISTER_INPUT} ${LISTER_PATH} --output-base ${SCRIPT_BASE} echo "Building informer-gen" informergen="${PWD}/informer-gen" -go build -o "${informergen}" ${KUBEGEN_PKG}/cmd/informer-gen +go build -o "${informergen}" ${CODEGEN_PKG}/cmd/informer-gen ${informergen} \ --output-base ${SCRIPT_BASE} \ diff --git a/staging/src/k8s.io/metrics/hack/update-codegen.sh b/staging/src/k8s.io/metrics/hack/update-codegen.sh index 09d670bb40e21..72c354ccc9826 100755 --- a/staging/src/k8s.io/metrics/hack/update-codegen.sh +++ b/staging/src/k8s.io/metrics/hack/update-codegen.sh @@ -20,7 +20,7 @@ set -o pipefail SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. SCRIPT_BASE=${SCRIPT_ROOT}/../.. -KUBEGEN_PKG=${KUBEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/kube-gen 2>/dev/null || echo k8s.io/kube-gen)} +CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo k8s.io/code-generator)} # Register function to be called on EXIT to remove generated binary. function cleanup { @@ -30,7 +30,7 @@ trap cleanup EXIT echo "Building client-gen" CLIENTGEN="${PWD}/client-gen-binary" -go build -o "${CLIENTGEN}" ${KUBEGEN_PKG}/cmd/client-gen +go build -o "${CLIENTGEN}" ${CODEGEN_PKG}/cmd/client-gen PREFIX=k8s.io/metrics/pkg/apis INPUT_BASE="--input-base ${PREFIX}" diff --git a/staging/src/k8s.io/sample-apiserver/hack/update-codegen.sh b/staging/src/k8s.io/sample-apiserver/hack/update-codegen.sh index 387447a75ee47..fb717e793b26a 100755 --- a/staging/src/k8s.io/sample-apiserver/hack/update-codegen.sh +++ b/staging/src/k8s.io/sample-apiserver/hack/update-codegen.sh @@ -21,7 +21,7 @@ set -o pipefail SCRIPT_PACKAGE=k8s.io/sample-apiserver SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. SCRIPT_BASE=${SCRIPT_ROOT}/../.. -KUBEGEN_PKG=${KUBEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/kube-gen 2>/dev/null || echo k8s.io/kube-gen)} +CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo k8s.io/code-generator)} clientgen="${PWD}/client-gen-binary" listergen="${PWD}/lister-gen" @@ -47,20 +47,20 @@ function generate_group() { ) echo "Building client-gen" - go build -o "${clientgen}" ${KUBEGEN_PKG}/cmd/client-gen + go build -o "${clientgen}" ${CODEGEN_PKG}/cmd/client-gen echo "generating clientset for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${CLIENT_PKG}" ${clientgen} --input-base ${APIS_PKG} --input ${INPUT_APIS[@]} --clientset-path ${CLIENT_PKG}/clientset_generated --output-base=${SCRIPT_BASE} ${clientgen} --clientset-name="clientset" --input-base ${APIS_PKG} --input ${GROUP_NAME}/${VERSION} --clientset-path ${CLIENT_PKG}/clientset_generated --output-base=${SCRIPT_BASE} echo "Building lister-gen" - go build -o "${listergen}" ${KUBEGEN_PKG}/cmd/lister-gen + go build -o "${listergen}" ${CODEGEN_PKG}/cmd/lister-gen echo "generating listers for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${LISTERS_PKG}" ${listergen} --input-dirs ${APIS_PKG}/${GROUP_NAME} --input-dirs ${APIS_PKG}/${GROUP_NAME}/${VERSION} --output-package ${LISTERS_PKG} --output-base ${SCRIPT_BASE} echo "Building informer-gen" - go build -o "${informergen}" ${KUBEGEN_PKG}/cmd/informer-gen + go build -o "${informergen}" ${CODEGEN_PKG}/cmd/informer-gen echo "generating informers for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${INFORMERS_PKG}" ${informergen} \ From c19965c740ca06188fe5830fd5cc9f50698c2a3f Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 17 Aug 2017 11:01:05 -0500 Subject: [PATCH 077/403] cni: print better error when a CNI .configlist is put into a .config --- pkg/kubelet/network/cni/cni.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/kubelet/network/cni/cni.go b/pkg/kubelet/network/cni/cni.go index d2b1ed873c75a..0ae1edc801d80 100644 --- a/pkg/kubelet/network/cni/cni.go +++ b/pkg/kubelet/network/cni/cni.go @@ -119,6 +119,13 @@ func getDefaultCNINetwork(pluginDir, binDir, vendorCNIDirPrefix string) (*cniNet glog.Warningf("Error loading CNI config file %s: %v", confFile, err) continue } + // Ensure the config has a "type" so we know what plugin to run. + // Also catches the case where somebody put a conflist into a conf file. + if conf.Network.Type == "" { + glog.Warningf("Error loading CNI config file %s: no 'type'; perhaps this is a .conflist?", confFile) + continue + } + confList, err = libcni.ConfListFromConf(conf) if err != nil { glog.Warningf("Error converting CNI config file %s to list: %v", confFile, err) From c5f672a0d5b45896547b00298f0f4e9db7210704 Mon Sep 17 00:00:00 2001 From: Nick Sardo Date: Wed, 16 Aug 2017 19:34:20 -0700 Subject: [PATCH 078/403] Update GCP API package --- Godeps/Godeps.json | 166 +- .../api/cloudkms/v1/cloudkms-api.json | 2126 +- .../api/cloudkms/v1/cloudkms-gen.go | 139 +- .../v2beta2/cloudmonitoring-api.json | 4 +- .../api/compute/v0.alpha/compute-api.json | 2739 +- .../api/compute/v0.alpha/compute-gen.go | 10938 ++++- .../api/compute/v0.beta/compute-api.json | 1980 +- .../api/compute/v0.beta/compute-gen.go | 7183 ++- .../api/compute/v1/compute-api.json | 2788 +- .../api/compute/v1/compute-gen.go | 36638 +++++++++------- .../api/container/v1/container-api.json | 3057 +- .../api/container/v1/container-gen.go | 2898 +- .../google.golang.org/api/dns/v1/dns-api.json | 4 +- .../google.golang.org/api/gensupport/json.go | 49 +- .../google.golang.org/api/gensupport/send.go | 6 + .../api/logging/v2beta1/logging-api.json | 1677 +- .../api/logging/v2beta1/logging-gen.go | 45 +- .../api/monitoring/v3/monitoring-api.json | 2959 +- .../api/monitoring/v3/monitoring-gen.go | 153 - .../api/pubsub/v1/pubsub-api.json | 1280 +- .../api/pubsub/v1/pubsub-gen.go | 3 +- 21 files changed, 51551 insertions(+), 25281 deletions(-) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 5ab012331896e..056b4ee93fd25 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -430,32 +430,32 @@ }, { "ImportPath": "github.com/containernetworking/cni/libcni", - "Comment": "v0.5.2", + "Comment": "spec-v0.3.1", "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" }, { "ImportPath": "github.com/containernetworking/cni/pkg/invoke", - "Comment": "v0.5.2", + "Comment": "spec-v0.3.1", "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" }, { "ImportPath": "github.com/containernetworking/cni/pkg/types", - "Comment": "v0.5.2", + "Comment": "spec-v0.3.1", "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" }, { "ImportPath": "github.com/containernetworking/cni/pkg/types/020", - "Comment": "v0.5.2", + "Comment": "spec-v0.3.1", "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" }, { "ImportPath": "github.com/containernetworking/cni/pkg/types/current", - "Comment": "v0.5.2", + "Comment": "spec-v0.3.1", "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" }, { "ImportPath": "github.com/containernetworking/cni/pkg/version", - "Comment": "v0.5.2", + "Comment": "spec-v0.3.1", "Rev": "137b4975ecab6e1f0c24c1e3c228a50a3cfba75e" }, { @@ -838,12 +838,12 @@ }, { "ImportPath": "github.com/docker/distribution/digest", - "Comment": "v2.4.0-rc.1-38-gcd27f17", + "Comment": "v2.4.0-rc.1-38-gcd27f179", "Rev": "cd27f179f2c10c5d300e6d09025b538c475b0d51" }, { "ImportPath": "github.com/docker/distribution/reference", - "Comment": "v2.4.0-rc.1-38-gcd27f17", + "Comment": "v2.4.0-rc.1-38-gcd27f179", "Rev": "cd27f179f2c10c5d300e6d09025b538c475b0d51" }, { @@ -1171,127 +1171,127 @@ }, { "ImportPath": "github.com/gogo/protobuf/gogoproto", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/compare", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/defaultcheck", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/description", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/embedcheck", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/enumstringer", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/equal", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/face", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/gostring", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/marshalto", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/oneofcheck", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/populate", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/size", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/stringer", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/testgen", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/union", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/plugin/unmarshal", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/proto", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/protoc-gen-gogo/descriptor", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/protoc-gen-gogo/generator", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/protoc-gen-gogo/grpc", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/protoc-gen-gogo/plugin", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/sortkeys", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/vanity", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { "ImportPath": "github.com/gogo/protobuf/vanity/command", - "Comment": "v0.4-3-gc0656ed", + "Comment": "v0.4-3-gc0656edd", "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" }, { @@ -2152,82 +2152,82 @@ }, { "ImportPath": "github.com/opencontainers/runc/libcontainer", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/apparmor", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/fs", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/systemd", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/configs", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/configs/validate", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/criurpc", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/keys", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/label", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/seccomp", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/selinux", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/stacktrace", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/system", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/user", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/utils", - "Comment": "v1.0.0-rc2-49-gd223e2a", + "Comment": "v1.0.0-rc2-49-gd223e2ad", "Rev": "d223e2adae83f62d58448a799a5da05730228089" }, { @@ -2298,107 +2298,107 @@ }, { "ImportPath": "github.com/rackspace/gophercloud", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/bootfromvolume", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/diskconfig", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/flavors", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/images", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/compute/v2/servers", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/identity/v2/tenants", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/identity/v2/tokens", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/identity/v3/tokens", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/openstack/utils", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/pagination", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/rackspace", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/rackspace/blockstorage/v1/volumes", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/rackspace/compute/v2/servers", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/rackspace/compute/v2/volumeattach", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/rackspace/identity/v2/tokens", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/testhelper", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { "ImportPath": "github.com/rackspace/gophercloud/testhelper/client", - "Comment": "v1.0.0-1012-ge00690e", + "Comment": "v1.0.0-1012-ge00690e8", "Rev": "e00690e87603abe613e9f02c816c7c4bef82e063" }, { @@ -2859,55 +2859,55 @@ }, { "ImportPath": "google.golang.org/api/cloudkms/v1", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/cloudmonitoring/v2beta2", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/compute/v0.alpha", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/compute/v0.beta", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/compute/v1", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/container/v1", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/dns/v1", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/gensupport", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/googleapi", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/googleapi/internal/uritemplates", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/logging/v2beta1", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/monitoring/v3", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/api/pubsub/v1", - "Rev": "e3824ed33c72bf7e81da0286772c34b987520914" + "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, { "ImportPath": "google.golang.org/grpc", diff --git a/vendor/google.golang.org/api/cloudkms/v1/cloudkms-api.json b/vendor/google.golang.org/api/cloudkms/v1/cloudkms-api.json index a2d9194c7d521..2ef074320eed5 100644 --- a/vendor/google.golang.org/api/cloudkms/v1/cloudkms-api.json +++ b/vendor/google.golang.org/api/cloudkms/v1/cloudkms-api.json @@ -1,6 +1,4 @@ { - "ownerDomain": "google.com", - "name": "cloudkms", "batchPath": "batch", "title": "Google Cloud Key Management Service (KMS) API", "ownerName": "Google", @@ -8,477 +6,444 @@ "projects": { "resources": { "locations": { - "methods": { - "list": { - "description": "Lists information about the supported locations for this service.", - "response": { - "$ref": "ListLocationsResponse" - }, - "parameterOrder": [ - "name" - ], - "httpMethod": "GET", - "parameters": { - "filter": { - "location": "query", - "description": "The standard list filter.", - "type": "string" - }, - "name": { - "description": "The resource that owns the locations collection, if applicable.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" - }, - "pageToken": { - "location": "query", - "description": "The standard list page token.", - "type": "string" - }, - "pageSize": { - "description": "The standard list page size.", - "format": "int32", - "type": "integer", - "location": "query" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectsId}/locations", - "path": "v1/{+name}/locations", - "id": "cloudkms.projects.locations.list" - }, - "get": { - "response": { - "$ref": "Location" - }, - "parameterOrder": [ - "name" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "name": { - "description": "Resource name for the location.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+$", - "location": "path" - } - }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}", - "path": "v1/{+name}", - "id": "cloudkms.projects.locations.get", - "description": "Get information about a location." - } - }, "resources": { "keyRings": { - "methods": { - "list": { - "response": { - "$ref": "ListKeyRingsResponse" - }, - "parameterOrder": [ - "parent" - ], - "httpMethod": "GET", - "parameters": { - "pageToken": { - "description": "Optional pagination token, returned earlier via\nListKeyRingsResponse.next_page_token.", - "type": "string", - "location": "query" - }, - "pageSize": { - "description": "Optional limit on the number of KeyRings to include in the\nresponse. Further KeyRings can subsequently be obtained by\nincluding the ListKeyRingsResponse.next_page_token in a subsequent\nrequest. If unspecified, the server will pick an appropriate default.", - "format": "int32", - "type": "integer", - "location": "query" - }, - "parent": { - "description": "Required. The resource name of the location associated with the\nKeyRings, in the format `projects/*/locations/*`.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+$", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings", - "path": "v1/{+parent}/keyRings", - "id": "cloudkms.projects.locations.keyRings.list", - "description": "Lists KeyRings." - }, - "setIamPolicy": { - "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.", - "request": { - "$ref": "SetIamPolicyRequest" - }, - "response": { - "$ref": "Policy" - }, - "parameterOrder": [ - "resource" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "resource": { - "description": "REQUIRED: The resource for which the policy is being specified.\nSee the operation documentation for the appropriate value for this field.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", - "location": "path" - } - }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:setIamPolicy", - "path": "v1/{+resource}:setIamPolicy", - "id": "cloudkms.projects.locations.keyRings.setIamPolicy" - }, - "create": { - "httpMethod": "POST", - "parameterOrder": [ - "parent" - ], - "response": { - "$ref": "KeyRing" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "parent": { - "description": "Required. The resource name of the location associated with the\nKeyRings, in the format `projects/*/locations/*`.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+$", - "location": "path" - }, - "keyRingId": { - "description": "Required. It must be unique within a location and match the regular\nexpression `[a-zA-Z0-9_-]{1,63}`", - "type": "string", - "location": "query" - } - }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings", - "id": "cloudkms.projects.locations.keyRings.create", - "path": "v1/{+parent}/keyRings", - "description": "Create a new KeyRing in a given Project and Location.", - "request": { - "$ref": "KeyRing" - } - }, - "getIamPolicy": { - "response": { - "$ref": "Policy" - }, - "parameterOrder": [ - "resource" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "resource": { - "description": "REQUIRED: The resource for which the policy is being requested.\nSee the operation documentation for the appropriate value for this field.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", - "location": "path" - } - }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:getIamPolicy", - "path": "v1/{+resource}:getIamPolicy", - "id": "cloudkms.projects.locations.keyRings.getIamPolicy", - "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset." - }, - "get": { - "description": "Returns metadata for a given KeyRing.", - "response": { - "$ref": "KeyRing" - }, - "parameterOrder": [ - "name" - ], - "httpMethod": "GET", - "parameters": { - "name": { - "description": "The name of the KeyRing to get.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}", - "path": "v1/{+name}", - "id": "cloudkms.projects.locations.keyRings.get" - }, - "testIamPermissions": { - "request": { - "$ref": "TestIamPermissionsRequest" - }, - "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.\n\nNote: This operation is designed to be used for building permission-aware\nUIs and command-line tools, not for authorization checking. This operation\nmay \"fail open\" without warning.", - "response": { - "$ref": "TestIamPermissionsResponse" - }, - "parameterOrder": [ - "resource" - ], - "httpMethod": "POST", - "parameters": { - "resource": { - "description": "REQUIRED: The resource for which the policy detail is being requested.\nSee the operation documentation for the appropriate value for this field.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", - "location": "path" + "resources": { + "cryptoKeys": { + "resources": { + "cryptoKeyVersions": { + "methods": { + "list": { + "response": { + "$ref": "ListCryptoKeyVersionsResponse" + }, + "parameterOrder": [ + "parent" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "pageToken": { + "location": "query", + "description": "Optional pagination token, returned earlier via\nListCryptoKeyVersionsResponse.next_page_token.", + "type": "string" + }, + "pageSize": { + "format": "int32", + "description": "Optional limit on the number of CryptoKeyVersions to\ninclude in the response. Further CryptoKeyVersions can\nsubsequently be obtained by including the\nListCryptoKeyVersionsResponse.next_page_token in a subsequent request.\nIf unspecified, the server will pick an appropriate default.", + "type": "integer", + "location": "query" + }, + "parent": { + "description": "Required. The resource name of the CryptoKey to list, in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", + "location": "path" + } + }, + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.list", + "path": "v1/{+parent}/cryptoKeyVersions", + "description": "Lists CryptoKeyVersions." + }, + "create": { + "httpMethod": "POST", + "parameterOrder": [ + "parent" + ], + "response": { + "$ref": "CryptoKeyVersion" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "parent": { + "description": "Required. The name of the CryptoKey associated with\nthe CryptoKeyVersions.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", + "location": "path" + } + }, + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions", + "path": "v1/{+parent}/cryptoKeyVersions", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.create", + "request": { + "$ref": "CryptoKeyVersion" + }, + "description": "Create a new CryptoKeyVersion in a CryptoKey.\n\nThe server will assign the next sequential id. If unset,\nstate will be set to\nENABLED." + }, + "destroy": { + "response": { + "$ref": "CryptoKeyVersion" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "POST", + "parameters": { + "name": { + "description": "The resource name of the CryptoKeyVersion to destroy.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$", + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:destroy", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.destroy", + "path": "v1/{+name}:destroy", + "description": "Schedule a CryptoKeyVersion for destruction.\n\nUpon calling this method, CryptoKeyVersion.state will be set to\nDESTROY_SCHEDULED\nand destroy_time will be set to a time 24\nhours in the future, at which point the state\nwill be changed to\nDESTROYED, and the key\nmaterial will be irrevocably destroyed.\n\nBefore the destroy_time is reached,\nRestoreCryptoKeyVersion may be called to reverse the process.", + "request": { + "$ref": "DestroyCryptoKeyVersionRequest" + } + }, + "restore": { + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.restore", + "path": "v1/{+name}:restore", + "description": "Restore a CryptoKeyVersion in the\nDESTROY_SCHEDULED,\nstate.\n\nUpon restoration of the CryptoKeyVersion, state\nwill be set to DISABLED,\nand destroy_time will be cleared.", + "request": { + "$ref": "RestoreCryptoKeyVersionRequest" + }, + "response": { + "$ref": "CryptoKeyVersion" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "POST", + "parameters": { + "name": { + "description": "The resource name of the CryptoKeyVersion to restore.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$", + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:restore" + }, + "get": { + "response": { + "$ref": "CryptoKeyVersion" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "name": { + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$", + "location": "path", + "description": "The name of the CryptoKeyVersion to get.", + "type": "string", + "required": true + } + }, + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.get", + "path": "v1/{+name}", + "description": "Returns metadata for a given CryptoKeyVersion." + }, + "patch": { + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.patch", + "path": "v1/{+name}", + "description": "Update a CryptoKeyVersion's metadata.\n\nstate may be changed between\nENABLED and\nDISABLED using this\nmethod. See DestroyCryptoKeyVersion and RestoreCryptoKeyVersion to\nmove between other states.", + "request": { + "$ref": "CryptoKeyVersion" + }, + "response": { + "$ref": "CryptoKeyVersion" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "PATCH", + "parameters": { + "updateMask": { + "location": "query", + "format": "google-fieldmask", + "description": "Required list of fields to be updated in this request.", + "type": "string" + }, + "name": { + "description": "Output only. The resource name for this CryptoKeyVersion in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*/cryptoKeyVersions/*`.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$", + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}" + } + } } }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:testIamPermissions", - "path": "v1/{+resource}:testIamPermissions", - "id": "cloudkms.projects.locations.keyRings.testIamPermissions" - } - }, - "resources": { - "cryptoKeys": { "methods": { - "list": { - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys", - "path": "v1/{+parent}/cryptoKeys", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.list", - "description": "Lists CryptoKeys.", + "patch": { + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.patch", + "path": "v1/{+name}", + "description": "Update a CryptoKey.", + "request": { + "$ref": "CryptoKey" + }, "response": { - "$ref": "ListCryptoKeysResponse" + "$ref": "CryptoKey" }, "parameterOrder": [ - "parent" + "name" + ], + "httpMethod": "PATCH", + "parameters": { + "updateMask": { + "location": "query", + "format": "google-fieldmask", + "description": "Required list of fields to be updated in this request.", + "type": "string" + }, + "name": { + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", + "location": "path", + "description": "Output only. The resource name for this CryptoKey in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.", + "type": "string", + "required": true + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}" + }, + "get": { + "response": { + "$ref": "CryptoKey" + }, + "parameterOrder": [ + "name" ], "httpMethod": "GET", "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], "parameters": { - "pageSize": { - "description": "Optional limit on the number of CryptoKeys to include in the\nresponse. Further CryptoKeys can subsequently be obtained by\nincluding the ListCryptoKeysResponse.next_page_token in a subsequent\nrequest. If unspecified, the server will pick an appropriate default.", - "format": "int32", - "type": "integer", - "location": "query" - }, - "parent": { - "description": "Required. The resource name of the KeyRing to list, in the format\n`projects/*/locations/*/keyRings/*`.", - "required": true, + "name": { + "description": "The name of the CryptoKey to get.", "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", "location": "path" - }, - "pageToken": { - "location": "query", - "description": "Optional pagination token, returned earlier via\nListCryptoKeysResponse.next_page_token.", - "type": "string" } - } + }, + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.get", + "path": "v1/{+name}", + "description": "Returns metadata for a given CryptoKey, as well as its\nprimary CryptoKeyVersion." }, - "encrypt": { + "testIamPermissions": { + "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.\n\nNote: This operation is designed to be used for building permission-aware\nUIs and command-line tools, not for authorization checking. This operation\nmay \"fail open\" without warning.", "request": { - "$ref": "EncryptRequest" - }, - "description": "Encrypt data, so that it can only be recovered by a call to Decrypt.", - "response": { - "$ref": "EncryptResponse" + "$ref": "TestIamPermissionsRequest" }, + "httpMethod": "POST", "parameterOrder": [ - "name" + "resource" ], - "httpMethod": "POST", + "response": { + "$ref": "TestIamPermissionsResponse" + }, "parameters": { - "name": { - "description": "Required. The resource name of the CryptoKey or CryptoKeyVersion\nto use for encryption.\n\nIf a CryptoKey is specified, the server will use its\nprimary version.", - "required": true, + "resource": { + "description": "REQUIRED: The resource for which the policy detail is being requested.\nSee the operation documentation for the appropriate value for this field.", "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/.+$", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", "location": "path" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:encrypt", - "path": "v1/{+name}:encrypt", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.encrypt" + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:testIamPermissions", + "path": "v1/{+resource}:testIamPermissions", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.testIamPermissions" }, - "create": { + "decrypt": { + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.decrypt", + "path": "v1/{+name}:decrypt", + "request": { + "$ref": "DecryptRequest" + }, + "description": "Decrypts data that was protected by Encrypt.", "response": { - "$ref": "CryptoKey" + "$ref": "DecryptResponse" }, "parameterOrder": [ - "parent" + "name" ], "httpMethod": "POST", "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], "parameters": { - "parent": { - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", - "location": "path", - "description": "Required. The name of the KeyRing associated with the\nCryptoKeys.", + "name": { + "description": "Required. The resource name of the CryptoKey to use for decryption.\nThe server will choose the appropriate version.", + "type": "string", "required": true, - "type": "string" - }, - "cryptoKeyId": { - "location": "query", - "description": "Required. It must be unique within a KeyRing and match the regular\nexpression `[a-zA-Z0-9_-]{1,63}`", - "type": "string" + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", + "location": "path" } }, + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:decrypt" + }, + "list": { "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys", "path": "v1/{+parent}/cryptoKeys", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.create", - "description": "Create a new CryptoKey within a KeyRing.\n\nCryptoKey.purpose is required.", - "request": { - "$ref": "CryptoKey" - } - }, - "setIamPolicy": { - "httpMethod": "POST", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.list", + "description": "Lists CryptoKeys.", + "httpMethod": "GET", "parameterOrder": [ - "resource" + "parent" ], "response": { - "$ref": "Policy" + "$ref": "ListCryptoKeysResponse" }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], "parameters": { - "resource": { - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", + "parent": { "location": "path", - "description": "REQUIRED: The resource for which the policy is being specified.\nSee the operation documentation for the appropriate value for this field.", + "description": "Required. The resource name of the KeyRing to list, in the format\n`projects/*/locations/*/keyRings/*`.", + "type": "string", "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$" + }, + "pageToken": { + "location": "query", + "description": "Optional pagination token, returned earlier via\nListCryptoKeysResponse.next_page_token.", "type": "string" + }, + "pageSize": { + "location": "query", + "format": "int32", + "description": "Optional limit on the number of CryptoKeys to include in the\nresponse. Further CryptoKeys can subsequently be obtained by\nincluding the ListCryptoKeysResponse.next_page_token in a subsequent\nrequest. If unspecified, the server will pick an appropriate default.", + "type": "integer" } - }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:setIamPolicy", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.setIamPolicy", - "path": "v1/{+resource}:setIamPolicy", - "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.", - "request": { - "$ref": "SetIamPolicyRequest" } }, - "updatePrimaryVersion": { + "encrypt": { "response": { - "$ref": "CryptoKey" + "$ref": "EncryptResponse" }, "parameterOrder": [ "name" ], "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], "parameters": { "name": { - "location": "path", - "description": "The resource name of the CryptoKey to update.", - "required": true, + "description": "Required. The resource name of the CryptoKey or CryptoKeyVersion\nto use for encryption.\n\nIf a CryptoKey is specified, the server will use its\nprimary version.", "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$" + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/.+$", + "location": "path" } }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:updatePrimaryVersion", - "path": "v1/{+name}:updatePrimaryVersion", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.updatePrimaryVersion", - "description": "Update the version of a CryptoKey that will be used in Encrypt", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:encrypt", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.encrypt", + "path": "v1/{+name}:encrypt", + "description": "Encrypts data, so that it can only be recovered by a call to Decrypt.", "request": { - "$ref": "UpdateCryptoKeyPrimaryVersionRequest" + "$ref": "EncryptRequest" } }, - "getIamPolicy": { - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:getIamPolicy", - "path": "v1/{+resource}:getIamPolicy", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.getIamPolicy", - "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.", + "setIamPolicy": { + "path": "v1/{+resource}:setIamPolicy", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.setIamPolicy", + "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.", + "request": { + "$ref": "SetIamPolicyRequest" + }, + "httpMethod": "POST", "parameterOrder": [ "resource" ], "response": { "$ref": "Policy" }, - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], "parameters": { "resource": { - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", - "location": "path", - "description": "REQUIRED: The resource for which the policy is being requested.\nSee the operation documentation for the appropriate value for this field.", + "description": "REQUIRED: The resource for which the policy is being specified.\nSee the operation documentation for the appropriate value for this field.", + "type": "string", "required": true, - "type": "string" + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", + "location": "path" } - } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:setIamPolicy" }, - "patch": { + "create": { + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.create", + "path": "v1/{+parent}/cryptoKeys", + "description": "Create a new CryptoKey within a KeyRing.\n\nCryptoKey.purpose is required.", + "request": { + "$ref": "CryptoKey" + }, "response": { "$ref": "CryptoKey" }, "parameterOrder": [ - "name" + "parent" ], - "httpMethod": "PATCH", + "httpMethod": "POST", "parameters": { - "updateMask": { - "description": "Required list of fields to be updated in this request.", - "format": "google-fieldmask", + "cryptoKeyId": { + "description": "Required. It must be unique within a KeyRing and match the regular\nexpression `[a-zA-Z0-9_-]{1,63}`", + "type": "string", + "location": "query" + }, + "parent": { + "description": "Required. The name of the KeyRing associated with the\nCryptoKeys.", "type": "string", - "location": "query" - }, - "name": { - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", - "location": "path", - "description": "Output only. The resource name for this CryptoKey in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.", "required": true, - "type": "string" + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", + "location": "path" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}", - "path": "v1/{+name}", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.patch", - "request": { - "$ref": "CryptoKey" - }, - "description": "Update a CryptoKey." + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys" }, - "get": { - "description": "Returns metadata for a given CryptoKey, as well as its\nprimary CryptoKeyVersion.", + "updatePrimaryVersion": { "response": { "$ref": "CryptoKey" }, "parameterOrder": [ "name" ], - "httpMethod": "GET", + "httpMethod": "POST", "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], @@ -486,260 +451,293 @@ "name": { "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", "location": "path", - "description": "The name of the CryptoKey to get.", - "required": true, - "type": "string" + "description": "The resource name of the CryptoKey to update.", + "type": "string", + "required": true } }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}", - "path": "v1/{+name}", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.get" - }, - "testIamPermissions": { + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:updatePrimaryVersion", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.updatePrimaryVersion", + "path": "v1/{+name}:updatePrimaryVersion", "request": { - "$ref": "TestIamPermissionsRequest" - }, - "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.\n\nNote: This operation is designed to be used for building permission-aware\nUIs and command-line tools, not for authorization checking. This operation\nmay \"fail open\" without warning.", - "response": { - "$ref": "TestIamPermissionsResponse" + "$ref": "UpdateCryptoKeyPrimaryVersionRequest" }, + "description": "Update the version of a CryptoKey that will be used in Encrypt" + }, + "getIamPolicy": { + "httpMethod": "GET", "parameterOrder": [ "resource" ], - "httpMethod": "POST", + "response": { + "$ref": "Policy" + }, "parameters": { "resource": { + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", "location": "path", - "description": "REQUIRED: The resource for which the policy detail is being requested.\nSee the operation documentation for the appropriate value for this field.", - "required": true, + "description": "REQUIRED: The resource for which the policy is being requested.\nSee the operation documentation for the appropriate value for this field.", "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$" + "required": true } }, "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:testIamPermissions", - "path": "v1/{+resource}:testIamPermissions", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.testIamPermissions" - }, - "decrypt": { - "description": "Decrypt data that was protected by Encrypt.", - "request": { - "$ref": "DecryptRequest" - }, - "httpMethod": "POST", - "parameterOrder": [ - "name" - ], - "response": { - "$ref": "DecryptResponse" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "name": { - "description": "Required. The resource name of the CryptoKey to use for decryption.\nThe server will choose the appropriate version.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", - "location": "path" - } - }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:decrypt", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.decrypt", - "path": "v1/{+name}:decrypt" - } - }, - "resources": { - "cryptoKeyVersions": { - "methods": { - "list": { - "path": "v1/{+parent}/cryptoKeyVersions", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.list", - "description": "Lists CryptoKeyVersions.", - "response": { - "$ref": "ListCryptoKeyVersionsResponse" - }, - "parameterOrder": [ - "parent" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "pageToken": { - "description": "Optional pagination token, returned earlier via\nListCryptoKeyVersionsResponse.next_page_token.", - "type": "string", - "location": "query" - }, - "pageSize": { - "description": "Optional limit on the number of CryptoKeyVersions to\ninclude in the response. Further CryptoKeyVersions can\nsubsequently be obtained by including the\nListCryptoKeyVersionsResponse.next_page_token in a subsequent request.\nIf unspecified, the server will pick an appropriate default.", - "format": "int32", - "type": "integer", - "location": "query" - }, - "parent": { - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", - "location": "path", - "description": "Required. The resource name of the CryptoKey to list, in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.", - "required": true, - "type": "string" - } - }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions" - }, - "create": { - "response": { - "$ref": "CryptoKeyVersion" - }, - "parameterOrder": [ - "parent" - ], - "httpMethod": "POST", - "parameters": { - "parent": { - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$", - "location": "path", - "description": "Required. The name of the CryptoKey associated with\nthe CryptoKeyVersions.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions", - "path": "v1/{+parent}/cryptoKeyVersions", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.create", - "request": { - "$ref": "CryptoKeyVersion" - }, - "description": "Create a new CryptoKeyVersion in a CryptoKey.\n\nThe server will assign the next sequential id. If unset,\nstate will be set to\nENABLED." - }, - "destroy": { - "httpMethod": "POST", - "parameterOrder": [ - "name" - ], - "response": { - "$ref": "CryptoKeyVersion" - }, - "parameters": { - "name": { - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$", - "location": "path", - "description": "The resource name of the CryptoKeyVersion to destroy.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:destroy", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.destroy", - "path": "v1/{+name}:destroy", - "request": { - "$ref": "DestroyCryptoKeyVersionRequest" - }, - "description": "Schedule a CryptoKeyVersion for destruction.\n\nUpon calling this method, CryptoKeyVersion.state will be set to\nDESTROY_SCHEDULED\nand destroy_time will be set to a time 24\nhours in the future, at which point the state\nwill be changed to\nDESTROYED, and the key\nmaterial will be irrevocably destroyed.\n\nBefore the destroy_time is reached,\nRestoreCryptoKeyVersion may be called to reverse the process." - }, - "restore": { - "response": { - "$ref": "CryptoKeyVersion" - }, - "parameterOrder": [ - "name" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "name": { - "description": "The resource name of the CryptoKeyVersion to restore.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$", - "location": "path" - } - }, - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:restore", - "path": "v1/{+name}:restore", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.restore", - "description": "Restore a CryptoKeyVersion in the\nDESTROY_SCHEDULED,\nstate.\n\nUpon restoration of the CryptoKeyVersion, state\nwill be set to DISABLED,\nand destroy_time will be cleared.", - "request": { - "$ref": "RestoreCryptoKeyVersionRequest" - } - }, - "patch": { - "httpMethod": "PATCH", - "parameterOrder": [ - "name" - ], - "response": { - "$ref": "CryptoKeyVersion" - }, - "parameters": { - "updateMask": { - "description": "Required list of fields to be updated in this request.", - "format": "google-fieldmask", - "type": "string", - "location": "query" - }, - "name": { - "description": "Output only. The resource name for this CryptoKeyVersion in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*/cryptoKeyVersions/*`.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.patch", - "path": "v1/{+name}", - "request": { - "$ref": "CryptoKeyVersion" - }, - "description": "Update a CryptoKeyVersion's metadata.\n\nstate may be changed between\nENABLED and\nDISABLED using this\nmethod. See DestroyCryptoKeyVersion and RestoreCryptoKeyVersion to\nmove between other states." - }, - "get": { - "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}", - "path": "v1/{+name}", - "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.get", - "description": "Returns metadata for a given CryptoKeyVersion.", - "parameterOrder": [ - "name" - ], - "response": { - "$ref": "CryptoKeyVersion" - }, - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "name": { - "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$", - "location": "path", - "description": "The name of the CryptoKeyVersion to get.", - "required": true, - "type": "string" - } - } - } - } + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:getIamPolicy", + "path": "v1/{+resource}:getIamPolicy", + "id": "cloudkms.projects.locations.keyRings.cryptoKeys.getIamPolicy", + "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset." + } + } + } + }, + "methods": { + "list": { + "path": "v1/{+parent}/keyRings", + "id": "cloudkms.projects.locations.keyRings.list", + "description": "Lists KeyRings.", + "httpMethod": "GET", + "parameterOrder": [ + "parent" + ], + "response": { + "$ref": "ListKeyRingsResponse" + }, + "parameters": { + "pageSize": { + "format": "int32", + "description": "Optional limit on the number of KeyRings to include in the\nresponse. Further KeyRings can subsequently be obtained by\nincluding the ListKeyRingsResponse.next_page_token in a subsequent\nrequest. If unspecified, the server will pick an appropriate default.", + "type": "integer", + "location": "query" + }, + "parent": { + "location": "path", + "description": "Required. The resource name of the location associated with the\nKeyRings, in the format `projects/*/locations/*`.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+$" + }, + "pageToken": { + "location": "query", + "description": "Optional pagination token, returned earlier via\nListKeyRingsResponse.next_page_token.", + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings" + }, + "create": { + "httpMethod": "POST", + "parameterOrder": [ + "parent" + ], + "response": { + "$ref": "KeyRing" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "parent": { + "pattern": "^projects/[^/]+/locations/[^/]+$", + "location": "path", + "description": "Required. The resource name of the location associated with the\nKeyRings, in the format `projects/*/locations/*`.", + "type": "string", + "required": true + }, + "keyRingId": { + "description": "Required. It must be unique within a location and match the regular\nexpression `[a-zA-Z0-9_-]{1,63}`", + "type": "string", + "location": "query" + } + }, + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings", + "path": "v1/{+parent}/keyRings", + "id": "cloudkms.projects.locations.keyRings.create", + "request": { + "$ref": "KeyRing" + }, + "description": "Create a new KeyRing in a given Project and Location." + }, + "setIamPolicy": { + "response": { + "$ref": "Policy" + }, + "parameterOrder": [ + "resource" + ], + "httpMethod": "POST", + "parameters": { + "resource": { + "description": "REQUIRED: The resource for which the policy is being specified.\nSee the operation documentation for the appropriate value for this field.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", + "location": "path" } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:setIamPolicy", + "id": "cloudkms.projects.locations.keyRings.setIamPolicy", + "path": "v1/{+resource}:setIamPolicy", + "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.", + "request": { + "$ref": "SetIamPolicyRequest" } + }, + "getIamPolicy": { + "response": { + "$ref": "Policy" + }, + "parameterOrder": [ + "resource" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "resource": { + "description": "REQUIRED: The resource for which the policy is being requested.\nSee the operation documentation for the appropriate value for this field.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", + "location": "path" + } + }, + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:getIamPolicy", + "id": "cloudkms.projects.locations.keyRings.getIamPolicy", + "path": "v1/{+resource}:getIamPolicy", + "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset." + }, + "get": { + "httpMethod": "GET", + "parameterOrder": [ + "name" + ], + "response": { + "$ref": "KeyRing" + }, + "parameters": { + "name": { + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", + "location": "path", + "description": "The name of the KeyRing to get.", + "type": "string", + "required": true + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}", + "path": "v1/{+name}", + "id": "cloudkms.projects.locations.keyRings.get", + "description": "Returns metadata for a given KeyRing." + }, + "testIamPermissions": { + "id": "cloudkms.projects.locations.keyRings.testIamPermissions", + "path": "v1/{+resource}:testIamPermissions", + "request": { + "$ref": "TestIamPermissionsRequest" + }, + "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.\n\nNote: This operation is designed to be used for building permission-aware\nUIs and command-line tools, not for authorization checking. This operation\nmay \"fail open\" without warning.", + "response": { + "$ref": "TestIamPermissionsResponse" + }, + "parameterOrder": [ + "resource" + ], + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "resource": { + "description": "REQUIRED: The resource for which the policy detail is being requested.\nSee the operation documentation for the appropriate value for this field.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$", + "location": "path" + } + }, + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:testIamPermissions" } } } + }, + "methods": { + "get": { + "id": "cloudkms.projects.locations.get", + "path": "v1/{+name}", + "description": "Get information about a location.", + "response": { + "$ref": "Location" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "name": { + "location": "path", + "description": "Resource name for the location.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/locations/[^/]+$" + } + }, + "flatPath": "v1/projects/{projectsId}/locations/{locationsId}" + }, + "list": { + "description": "Lists information about the supported locations for this service.", + "response": { + "$ref": "ListLocationsResponse" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "GET", + "parameters": { + "pageToken": { + "location": "query", + "description": "The standard list page token.", + "type": "string" + }, + "name": { + "pattern": "^projects/[^/]+$", + "location": "path", + "description": "The resource that owns the locations collection, if applicable.", + "type": "string", + "required": true + }, + "pageSize": { + "format": "int32", + "description": "The standard list page size.", + "type": "integer", + "location": "query" + }, + "filter": { + "description": "The standard list filter.", + "type": "string", + "location": "query" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectsId}/locations", + "id": "cloudkms.projects.locations.list", + "path": "v1/{+name}/locations" + } } } } @@ -747,34 +745,32 @@ }, "parameters": { "upload_protocol": { + "location": "query", "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", - "type": "string", - "location": "query" + "type": "string" }, "prettyPrint": { "description": "Returns response with indentations and line breaks.", - "type": "boolean", "default": "true", + "type": "boolean", "location": "query" }, - "uploadType": { - "location": "query", - "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").", - "type": "string" - }, "fields": { "description": "Selector specifying which fields to include in a partial response.", "type": "string", "location": "query" }, + "uploadType": { + "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").", + "type": "string", + "location": "query" + }, "callback": { - "location": "query", "description": "JSONP", - "type": "string" + "type": "string", + "location": "query" }, "$.xgafv": { - "description": "V1 error format.", - "type": "string", "enumDescriptions": [ "v1 error format", "v2 error format" @@ -783,7 +779,9 @@ "enum": [ "1", "2" - ] + ], + "description": "V1 error format.", + "type": "string" }, "alt": { "enum": [ @@ -802,355 +800,145 @@ "default": "json" }, "key": { - "location": "query", "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", - "type": "string" + "type": "string", + "location": "query" }, "access_token": { + "location": "query", "description": "OAuth access token.", - "type": "string", - "location": "query" + "type": "string" }, "quotaUser": { + "location": "query", "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", - "type": "string", - "location": "query" + "type": "string" }, "pp": { + "location": "query", "description": "Pretty-print response.", - "type": "boolean", "default": "true", - "location": "query" + "type": "boolean" }, - "bearer_token": { - "description": "OAuth bearer token.", + "oauth_token": { + "description": "OAuth 2.0 token for the current user.", "type": "string", "location": "query" }, - "oauth_token": { + "bearer_token": { "location": "query", - "description": "OAuth 2.0 token for the current user.", + "description": "OAuth bearer token.", "type": "string" } }, "version": "v1", "baseUrl": "https://cloudkms.googleapis.com/", - "kind": "discovery#restDescription", - "description": "Manages encryption for your cloud services the same way you do on-premise. You can generate, use, rotate, and destroy AES256 encryption keys.", "servicePath": "", + "description": "Manages encryption for your cloud services the same way you do on-premises. You can generate, use, rotate, and destroy AES256 encryption keys.", + "kind": "discovery#restDescription", "basePath": "", "id": "cloudkms:v1", "documentationLink": "https://cloud.google.com/kms/", - "revision": "20170425", + "revision": "20170725", "discoveryVersion": "v1", "version_module": "True", "schemas": { - "Binding": { - "description": "Associates `members` with a `role`.", - "type": "object", - "properties": { - "members": { - "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n users of that domain. For example, `google.com` or `example.com`.\n\n", - "type": "array", - "items": { - "type": "string" - } - }, - "role": { - "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired", - "type": "string" - } - }, - "id": "Binding" - }, - "EncryptRequest": { - "description": "Request message for KeyManagementService.Encrypt.", - "type": "object", - "properties": { - "additionalAuthenticatedData": { - "description": "Optional data that, if specified, must also be provided during decryption\nthrough DecryptRequest.additional_authenticated_data. Must be no\nlarger than 64KiB.", - "format": "byte", - "type": "string" - }, - "plaintext": { - "description": "Required. The data to encrypt. Must be no larger than 64KiB.", - "format": "byte", - "type": "string" - } - }, - "id": "EncryptRequest" - }, - "ListCryptoKeyVersionsResponse": { - "description": "Response message for KeyManagementService.ListCryptoKeyVersions.", - "type": "object", - "properties": { - "cryptoKeyVersions": { - "description": "The list of CryptoKeyVersions.", - "type": "array", - "items": { - "$ref": "CryptoKeyVersion" - } - }, - "nextPageToken": { - "description": "A token to retrieve next page of results. Pass this value in\nListCryptoKeyVersionsRequest.page_token to retrieve the next page of\nresults.", - "type": "string" - }, - "totalSize": { - "description": "The total number of CryptoKeyVersions that matched the\nquery.", - "format": "int32", - "type": "integer" - } - }, - "id": "ListCryptoKeyVersionsResponse" - }, - "TestIamPermissionsResponse": { - "description": "Response message for `TestIamPermissions` method.", - "type": "object", - "properties": { - "permissions": { - "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "id": "TestIamPermissionsResponse" - }, - "DestroyCryptoKeyVersionRequest": { - "description": "Request message for KeyManagementService.DestroyCryptoKeyVersion.", - "type": "object", - "properties": {}, - "id": "DestroyCryptoKeyVersionRequest" - }, - "CryptoKey": { - "description": "A CryptoKey represents a logical key that can be used for cryptographic\noperations.\n\nA CryptoKey is made up of one or more versions, which\nrepresent the actual key material used in cryptographic operations.", - "type": "object", - "properties": { - "createTime": { - "description": "Output only. The time at which this CryptoKey was created.", - "format": "google-datetime", - "type": "string" - }, - "rotationPeriod": { - "description": "next_rotation_time will be advanced by this period when the service\nautomatically rotates a key. Must be at least one day.\n\nIf rotation_period is set, next_rotation_time must also be set.", - "format": "google-duration", - "type": "string" - }, - "primary": { - "description": "Output only. A copy of the \"primary\" CryptoKeyVersion that will be used\nby Encrypt when this CryptoKey is given\nin EncryptRequest.name.\n\nThe CryptoKey's primary version can be updated via\nUpdateCryptoKeyPrimaryVersion.", - "$ref": "CryptoKeyVersion" - }, - "name": { - "description": "Output only. The resource name for this CryptoKey in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.", - "type": "string" - }, - "purpose": { - "enum": [ - "CRYPTO_KEY_PURPOSE_UNSPECIFIED", - "ENCRYPT_DECRYPT" - ], - "description": "The immutable purpose of this CryptoKey. Currently, the only acceptable\npurpose is ENCRYPT_DECRYPT.", - "type": "string", - "enumDescriptions": [ - "Not specified.", - "CryptoKeys with this purpose may be used with\nEncrypt and\nDecrypt." - ] - }, - "nextRotationTime": { - "description": "At next_rotation_time, the Key Management Service will automatically:\n\n1. Create a new version of this CryptoKey.\n2. Mark the new version as primary.\n\nKey rotations performed manually via\nCreateCryptoKeyVersion and\nUpdateCryptoKeyPrimaryVersion\ndo not affect next_rotation_time.", - "format": "google-datetime", - "type": "string" - } - }, - "id": "CryptoKey" - }, - "Rule": { - "description": "A rule to be applied in a Policy.", - "type": "object", + "SetIamPolicyRequest": { "properties": { - "notIn": { - "description": "If one or more 'not_in' clauses are specified, the rule matches\nif the PRINCIPAL/AUTHORITY_SELECTOR is in none of the entries.\nThe format for in and not_in entries is the same as for members in a\nBinding (see google/iam/v1/policy.proto).", - "type": "array", - "items": { - "type": "string" - } - }, - "description": { - "description": "Human-readable description of the rule.", + "updateMask": { + "format": "google-fieldmask", + "description": "OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only\nthe fields in the mask will be modified. If no mask is provided, the\nfollowing default mask is used:\npaths: \"bindings, etag\"\nThis field is only used by Cloud IAM.", "type": "string" }, - "conditions": { - "description": "Additional restrictions that must be met", - "type": "array", - "items": { - "$ref": "Condition" - } - }, - "logConfig": { - "description": "The config returned to callers of tech.iam.IAM.CheckPolicy for any entries\nthat match the LOG action.", - "type": "array", - "items": { - "$ref": "LogConfig" - } - }, - "in": { - "description": "If one or more 'in' clauses are specified, the rule matches if\nthe PRINCIPAL/AUTHORITY_SELECTOR is in at least one of these entries.", - "type": "array", - "items": { - "type": "string" - } - }, - "permissions": { - "description": "A permission is a string of form '\u003cservice\u003e.\u003cresource type\u003e.\u003cverb\u003e'\n(e.g., 'storage.buckets.list'). A value of '*' matches all permissions,\nand a verb part of '*' (e.g., 'storage.buckets.*') matches all verbs.", - "type": "array", - "items": { - "type": "string" - } - }, - "action": { - "enum": [ - "NO_ACTION", - "ALLOW", - "ALLOW_WITH_LOG", - "DENY", - "DENY_WITH_LOG", - "LOG" - ], - "description": "Required", - "type": "string", - "enumDescriptions": [ - "Default no action.", - "Matching 'Entries' grant access.", - "Matching 'Entries' grant access and the caller promises to log\nthe request per the returned log_configs.", - "Matching 'Entries' deny access.", - "Matching 'Entries' deny access and the caller promises to log\nthe request per the returned log_configs.", - "Matching 'Entries' tell IAM.Check callers to generate logs." - ] - } - }, - "id": "Rule" - }, - "LogConfig": { - "description": "Specifies what kind of log the caller must write", - "type": "object", - "properties": { - "cloudAudit": { - "$ref": "CloudAuditOptions", - "description": "Cloud audit options." - }, - "counter": { - "$ref": "CounterOptions", - "description": "Counter options." - }, - "dataAccess": { - "description": "Data access options.", - "$ref": "DataAccessOptions" - } - }, - "id": "LogConfig" - }, - "SetIamPolicyRequest": { - "description": "Request message for `SetIamPolicy` method.", - "type": "object", - "properties": { "policy": { "$ref": "Policy", "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them." - }, - "updateMask": { - "description": "OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only\nthe fields in the mask will be modified. If no mask is provided, the\nfollowing default mask is used:\npaths: \"bindings, etag\"\nThis field is only used by Cloud IAM.", - "format": "google-fieldmask", - "type": "string" } }, - "id": "SetIamPolicyRequest" + "id": "SetIamPolicyRequest", + "description": "Request message for `SetIamPolicy` method.", + "type": "object" }, "DecryptRequest": { "description": "Request message for KeyManagementService.Decrypt.", "type": "object", "properties": { - "ciphertext": { - "description": "Required. The encrypted data originally returned in\nEncryptResponse.ciphertext.", + "additionalAuthenticatedData": { "format": "byte", + "description": "Optional data that must match the data originally supplied in\nEncryptRequest.additional_authenticated_data.", "type": "string" }, - "additionalAuthenticatedData": { - "description": "Optional data that must match the data originally supplied in\nEncryptRequest.additional_authenticated_data.", + "ciphertext": { "format": "byte", + "description": "Required. The encrypted data originally returned in\nEncryptResponse.ciphertext.", "type": "string" } }, "id": "DecryptRequest" }, "Location": { - "description": "A resource that represents Google Cloud Platform location.", - "type": "object", "properties": { - "labels": { - "description": "Cross-service attributes for the location. For example\n\n {\"cloud.googleapis.com/region\": \"us-east1\"}", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "name": { - "description": "Resource name for the location, which may vary between implementations.\nFor example: `\"projects/example-project/locations/us-east1\"`", - "type": "string" - }, "locationId": { "description": "The canonical id for this location. For example: `\"us-east1\"`.", "type": "string" }, "metadata": { - "description": "Service-specific metadata. For example the available capacity at the given\nlocation.", - "type": "object", "additionalProperties": { "description": "Properties of the object. Contains field @type with type URL.", "type": "any" - } + }, + "description": "Service-specific metadata. For example the available capacity at the given\nlocation.", + "type": "object" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Cross-service attributes for the location. For example\n\n {\"cloud.googleapis.com/region\": \"us-east1\"}", + "type": "object" + }, + "name": { + "description": "Resource name for the location, which may vary between implementations.\nFor example: `\"projects/example-project/locations/us-east1\"`", + "type": "string" } }, - "id": "Location" + "id": "Location", + "description": "A resource that represents Google Cloud Platform location.", + "type": "object" }, "ListCryptoKeysResponse": { + "description": "Response message for KeyManagementService.ListCryptoKeys.", + "type": "object", "properties": { "nextPageToken": { "description": "A token to retrieve next page of results. Pass this value in\nListCryptoKeysRequest.page_token to retrieve the next page of results.", "type": "string" }, + "totalSize": { + "format": "int32", + "description": "The total number of CryptoKeys that matched the query.", + "type": "integer" + }, "cryptoKeys": { "description": "The list of CryptoKeys.", - "type": "array", "items": { "$ref": "CryptoKey" - } - }, - "totalSize": { - "description": "The total number of CryptoKeys that matched the query.", - "format": "int32", - "type": "integer" + }, + "type": "array" } }, - "id": "ListCryptoKeysResponse", - "description": "Response message for KeyManagementService.ListCryptoKeys.", - "type": "object" + "id": "ListCryptoKeysResponse" }, "Condition": { + "description": "A condition to be met.", + "type": "object", "properties": { - "values": { - "description": "The objects of the condition. This is mutually exclusive with 'value'.", - "type": "array", - "items": { - "type": "string" - } - }, "iam": { "enumDescriptions": [ "Default non-attribute.", "Either principal or (if present) authority selector.", "The principal (even if an authority selector is present), which\nmust only be used for attribution, not authorization.", - "An approver (distinct from the requester) that has authorized this\nrequest.\nWhen used with IN, the condition indicates that one of the approvers\nassociated with the request matches the specified principal, or is a\nmember of the specified group. Approvers can only grant additional\naccess, and are thus only used in a strictly positive context\n(e.g. ALLOW/IN or DENY/NOT_IN).\nSee: go/rpc-security-policy-dynamicauth.", + "An approver (distinct from the requester) that has authorized this\nrequest.\nWhen used with IN, the condition indicates that one of the approvers\nassociated with the request matches the specified principal, or is a\nmember of the specified group. Approvers can only grant additional\naccess, and are thus only used in a strictly positive context\n(e.g. ALLOW/IN or DENY/NOT_IN).", "What types of justifications have been supplied with this request.\nString values should match enum names from tech.iam.JustificationType,\ne.g. \"MANUAL_STRING\". It is not permitted to grant access based on\nthe *absence* of a justification, so justification conditions can only\nbe used in a \"positive\" context (e.g., ALLOW/IN or DENY/NOT_IN).\n\nMultiple justifications, e.g., a Buganizer ID and a manually-entered\nreason, are normal and supported." ], "enum": [ @@ -1163,6 +951,13 @@ "description": "Trusted attributes supplied by the IAM system.", "type": "string" }, + "values": { + "description": "The objects of the condition. This is mutually exclusive with 'value'.", + "items": { + "type": "string" + }, + "type": "array" + }, "op": { "enumDescriptions": [ "Default no-op.", @@ -1187,18 +982,7 @@ "description": "Trusted attributes discharged by the service.", "type": "string" }, - "value": { - "description": "DEPRECATED. Use 'values' instead.", - "type": "string" - }, "sys": { - "enumDescriptions": [ - "Default non-attribute type", - "Region of the resource", - "Service name", - "Resource name", - "IP address of the caller" - ], "enum": [ "NO_ATTR", "REGION", @@ -1207,40 +991,53 @@ "IP" ], "description": "Trusted attributes supplied by any service that owns resources and uses\nthe IAM system for access control.", + "type": "string", + "enumDescriptions": [ + "Default non-attribute type", + "Region of the resource", + "Service name", + "Resource name", + "IP address of the caller" + ] + }, + "value": { + "description": "DEPRECATED. Use 'values' instead.", "type": "string" } }, - "id": "Condition", - "description": "A condition to be met.", - "type": "object" + "id": "Condition" }, "CounterOptions": { - "description": "Options for counters", - "type": "object", "properties": { - "metric": { - "description": "The metric to update.", - "type": "string" - }, "field": { "description": "The field value to attribute.", "type": "string" + }, + "metric": { + "description": "The metric to update.", + "type": "string" } }, - "id": "CounterOptions" + "id": "CounterOptions", + "description": "Options for counters", + "type": "object" }, "AuditLogConfig": { - "description": "Provides the configuration for logging a type of permissions.\nExample:\n\n {\n \"audit_log_configs\": [\n {\n \"log_type\": \"DATA_READ\",\n \"exempted_members\": [\n \"user:foo@gmail.com\"\n ]\n },\n {\n \"log_type\": \"DATA_WRITE\",\n }\n ]\n }\n\nThis enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting\nfoo@gmail.com from DATA_READ logging.", - "type": "object", "properties": { "exemptedMembers": { "description": "Specifies the identities that do not cause logging for this type of\npermission.\nFollows the same format of Binding.members.", - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "logType": { + "enum": [ + "LOG_TYPE_UNSPECIFIED", + "ADMIN_READ", + "DATA_WRITE", + "DATA_READ" + ], "description": "The log type that this config enables.", "type": "string", "enumDescriptions": [ @@ -1248,24 +1045,20 @@ "Admin reads. Example: CloudIAM getIamPolicy", "Data writes. Example: CloudSQL Users create", "Data reads. Example: CloudSQL Users list" - ], - "enum": [ - "LOG_TYPE_UNSPECIFIED", - "ADMIN_READ", - "DATA_WRITE", - "DATA_READ" ] } }, - "id": "AuditLogConfig" + "id": "AuditLogConfig", + "description": "Provides the configuration for logging a type of permissions.\nExample:\n\n {\n \"audit_log_configs\": [\n {\n \"log_type\": \"DATA_READ\",\n \"exempted_members\": [\n \"user:foo@gmail.com\"\n ]\n },\n {\n \"log_type\": \"DATA_WRITE\",\n }\n ]\n }\n\nThis enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting\nfoo@gmail.com from DATA_READ logging.", + "type": "object" }, "DecryptResponse": { "description": "Response message for KeyManagementService.Decrypt.", "type": "object", "properties": { "plaintext": { - "description": "The decrypted data originally supplied in EncryptRequest.plaintext.", "format": "byte", + "description": "The decrypted data originally supplied in EncryptRequest.plaintext.", "type": "string" } }, @@ -1277,21 +1070,37 @@ "properties": { "permissions": { "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).", - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } }, "id": "TestIamPermissionsRequest" }, + "EncryptResponse": { + "properties": { + "ciphertext": { + "format": "byte", + "description": "The encrypted data.", + "type": "string" + }, + "name": { + "description": "The resource name of the CryptoKeyVersion used in encryption.", + "type": "string" + } + }, + "id": "EncryptResponse", + "description": "Response message for KeyManagementService.Encrypt.", + "type": "object" + }, "KeyRing": { "description": "A KeyRing is a toplevel logical grouping of CryptoKeys.", "type": "object", "properties": { "createTime": { - "description": "Output only. The time at which this KeyRing was created.", "format": "google-datetime", + "description": "Output only. The time at which this KeyRing was created.", "type": "string" }, "name": { @@ -1301,207 +1110,438 @@ }, "id": "KeyRing" }, - "EncryptResponse": { + "ListLocationsResponse": { + "description": "The response message for Locations.ListLocations.", + "type": "object", "properties": { - "ciphertext": { - "description": "The encrypted data.", + "nextPageToken": { + "description": "The standard List next-page token.", + "type": "string" + }, + "locations": { + "description": "A list of locations that matches the specified filter in the request.", + "items": { + "$ref": "Location" + }, + "type": "array" + } + }, + "id": "ListLocationsResponse" + }, + "Policy": { + "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n {\n \"bindings\": [\n {\n \"role\": \"roles/owner\",\n \"members\": [\n \"user:mike@example.com\",\n \"group:admins@example.com\",\n \"domain:google.com\",\n \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n ]\n },\n {\n \"role\": \"roles/viewer\",\n \"members\": [\"user:sean@example.com\"]\n }\n ]\n }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).", + "type": "object", + "properties": { + "iamOwned": { + "type": "boolean" + }, + "rules": { + "description": "If more than one rule is specified, the rules are applied in the following\nmanner:\n- All matching LOG rules are always applied.\n- If any DENY/DENY_WITH_LOG rule matches, permission is denied.\n Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if any ALLOW/ALLOW_WITH_LOG rule matches, permission is\n granted.\n Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if no rule applies, permission is denied.", + "items": { + "$ref": "Rule" + }, + "type": "array" + }, + "version": { + "format": "int32", + "description": "Version of the `Policy`. The default version is 0.", + "type": "integer" + }, + "auditConfigs": { + "description": "Specifies cloud audit logging configuration for this policy.", + "items": { + "$ref": "AuditConfig" + }, + "type": "array" + }, + "bindings": { + "description": "Associates a list of `members` to a `role`.\n`bindings` with no members will result in an error.", + "items": { + "$ref": "Binding" + }, + "type": "array" + }, + "etag": { "format": "byte", + "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.", + "type": "string" + } + }, + "id": "Policy" + }, + "RestoreCryptoKeyVersionRequest": { + "properties": {}, + "id": "RestoreCryptoKeyVersionRequest", + "description": "Request message for KeyManagementService.RestoreCryptoKeyVersion.", + "type": "object" + }, + "UpdateCryptoKeyPrimaryVersionRequest": { + "properties": { + "cryptoKeyVersionId": { + "description": "The id of the child CryptoKeyVersion to use as primary.", + "type": "string" + } + }, + "id": "UpdateCryptoKeyPrimaryVersionRequest", + "description": "Request message for KeyManagementService.UpdateCryptoKeyPrimaryVersion.", + "type": "object" + }, + "ListKeyRingsResponse": { + "description": "Response message for KeyManagementService.ListKeyRings.", + "type": "object", + "properties": { + "nextPageToken": { + "description": "A token to retrieve next page of results. Pass this value in\nListKeyRingsRequest.page_token to retrieve the next page of results.", + "type": "string" + }, + "totalSize": { + "format": "int32", + "description": "The total number of KeyRings that matched the query.", + "type": "integer" + }, + "keyRings": { + "description": "The list of KeyRings.", + "items": { + "$ref": "KeyRing" + }, + "type": "array" + } + }, + "id": "ListKeyRingsResponse" + }, + "DataAccessOptions": { + "description": "Write a Data Access (Gin) log", + "type": "object", + "properties": {}, + "id": "DataAccessOptions" + }, + "AuditConfig": { + "description": "Specifies the audit configuration for a service.\nThe configuration determines which permission types are logged, and what\nidentities, if any, are exempted from logging.\nAn AuditConfig must have one or more AuditLogConfigs.\n\nIf there are AuditConfigs for both `allServices` and a specific service,\nthe union of the two AuditConfigs is used for that service: the log_types\nspecified in each AuditConfig are enabled, and the exempted_members in each\nAuditConfig are exempted.\n\nExample Policy with multiple AuditConfigs:\n\n {\n \"audit_configs\": [\n {\n \"service\": \"allServices\"\n \"audit_log_configs\": [\n {\n \"log_type\": \"DATA_READ\",\n \"exempted_members\": [\n \"user:foo@gmail.com\"\n ]\n },\n {\n \"log_type\": \"DATA_WRITE\",\n },\n {\n \"log_type\": \"ADMIN_READ\",\n }\n ]\n },\n {\n \"service\": \"fooservice.googleapis.com\"\n \"audit_log_configs\": [\n {\n \"log_type\": \"DATA_READ\",\n },\n {\n \"log_type\": \"DATA_WRITE\",\n \"exempted_members\": [\n \"user:bar@gmail.com\"\n ]\n }\n ]\n }\n ]\n }\n\nFor fooservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ\nlogging. It also exempts foo@gmail.com from DATA_READ logging, and\nbar@gmail.com from DATA_WRITE logging.", + "type": "object", + "properties": { + "exemptedMembers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "service": { + "description": "Specifies a service that will be enabled for audit logging.\nFor example, `storage.googleapis.com`, `cloudsql.googleapis.com`.\n`allServices` is a special value that covers all services.", + "type": "string" + }, + "auditLogConfigs": { + "description": "The configuration for logging of each type of permission.\nNext ID: 4", + "items": { + "$ref": "AuditLogConfig" + }, + "type": "array" + } + }, + "id": "AuditConfig" + }, + "CryptoKeyVersion": { + "description": "A CryptoKeyVersion represents an individual cryptographic key, and the\nassociated key material.\n\nIt can be used for cryptographic operations either directly, or via its\nparent CryptoKey, in which case the server will choose the appropriate\nversion for the operation.", + "type": "object", + "properties": { + "destroyEventTime": { + "format": "google-datetime", + "description": "Output only. The time this CryptoKeyVersion's key material was\ndestroyed. Only present if state is\nDESTROYED.", + "type": "string" + }, + "destroyTime": { + "format": "google-datetime", + "description": "Output only. The time this CryptoKeyVersion's key material is scheduled\nfor destruction. Only present if state is\nDESTROY_SCHEDULED.", + "type": "string" + }, + "createTime": { + "format": "google-datetime", + "description": "Output only. The time at which this CryptoKeyVersion was created.", "type": "string" }, + "state": { + "description": "The current state of the CryptoKeyVersion.", + "type": "string", + "enumDescriptions": [ + "Not specified.", + "This version may be used in Encrypt and\nDecrypt requests.", + "This version may not be used, but the key material is still available,\nand the version can be placed back into the ENABLED state.", + "This version is destroyed, and the key material is no longer stored.\nA version may not leave this state once entered.", + "This version is scheduled for destruction, and will be destroyed soon.\nCall\nRestoreCryptoKeyVersion\nto put it back into the DISABLED state." + ], + "enum": [ + "CRYPTO_KEY_VERSION_STATE_UNSPECIFIED", + "ENABLED", + "DISABLED", + "DESTROYED", + "DESTROY_SCHEDULED" + ] + }, "name": { - "description": "The resource name of the CryptoKeyVersion used in encryption.", + "description": "Output only. The resource name for this CryptoKeyVersion in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*/cryptoKeyVersions/*`.", "type": "string" } }, - "id": "EncryptResponse", - "description": "Response message for KeyManagementService.Encrypt.", - "type": "object" + "id": "CryptoKeyVersion" }, - "ListLocationsResponse": { + "CloudAuditOptions": { + "description": "Write a Cloud Audit log", + "type": "object", "properties": { - "locations": { - "description": "A list of locations that matches the specified filter in the request.", - "type": "array", + "logName": { + "enumDescriptions": [ + "Default. Should not be used.", + "Corresponds to \"cloudaudit.googleapis.com/activity\"", + "Corresponds to \"cloudaudit.googleapis.com/data_access\"" + ], + "enum": [ + "UNSPECIFIED_LOG_NAME", + "ADMIN_ACTIVITY", + "DATA_ACCESS" + ], + "description": "The log_name to populate in the Cloud Audit Record.", + "type": "string" + } + }, + "id": "CloudAuditOptions" + }, + "Binding": { + "description": "Associates `members` with a `role`.", + "type": "object", + "properties": { + "condition": { + "$ref": "Expr", + "description": "The condition that is associated with this binding.\nNOTE: an unsatisfied condition will not allow user access via current\nbinding. Different bindings, including their conditions, are examined\nindependently.\nThis field is GOOGLE_INTERNAL." + }, + "members": { + "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n For example, `admins@example.com`.\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n users of that domain. For example, `google.com` or `example.com`.\n\n", "items": { - "$ref": "Location" - } + "type": "string" + }, + "type": "array" }, - "nextPageToken": { - "description": "The standard List next-page token.", + "role": { + "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired", "type": "string" } }, - "id": "ListLocationsResponse", - "description": "The response message for Locations.ListLocations.", - "type": "object" + "id": "Binding" }, - "Policy": { - "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n {\n \"bindings\": [\n {\n \"role\": \"roles/owner\",\n \"members\": [\n \"user:mike@example.com\",\n \"group:admins@example.com\",\n \"domain:google.com\",\n \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n ]\n },\n {\n \"role\": \"roles/viewer\",\n \"members\": [\"user:sean@example.com\"]\n }\n ]\n }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).", + "Expr": { + "description": "Represents an expression text. Example:\n\n title: \"User account presence\"\n description: \"Determines whether the request has a user account\"\n expression: \"size(request.user) \u003e 0\"", "type": "object", "properties": { - "etag": { - "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.", - "format": "byte", + "location": { + "description": "An optional string indicating the location of the expression for error\nreporting, e.g. a file name and a position in the file.", "type": "string" }, - "iamOwned": { - "type": "boolean" - }, - "rules": { - "description": "If more than one rule is specified, the rules are applied in the following\nmanner:\n- All matching LOG rules are always applied.\n- If any DENY/DENY_WITH_LOG rule matches, permission is denied.\n Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if any ALLOW/ALLOW_WITH_LOG rule matches, permission is\n granted.\n Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if no rule applies, permission is denied.", - "type": "array", - "items": { - "$ref": "Rule" - } - }, - "version": { - "description": "Version of the `Policy`. The default version is 0.", - "format": "int32", - "type": "integer" + "title": { + "description": "An optional title for the expression, i.e. a short string describing\nits purpose. This can be used e.g. in UIs which allow to enter the\nexpression.", + "type": "string" }, - "auditConfigs": { - "description": "Specifies cloud audit logging configuration for this policy.", - "type": "array", - "items": { - "$ref": "AuditConfig" - } + "description": { + "description": "An optional description of the expression. This is a longer text which\ndescribes the expression, e.g. when hovered over it in a UI.", + "type": "string" }, - "bindings": { - "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.", - "type": "array", - "items": { - "$ref": "Binding" - } + "expression": { + "description": "Textual representation of an expression in\nCommon Expression Language syntax.\n\nThe application context of the containing message determines which\nwell-known feature set of CEL is supported.", + "type": "string" } }, - "id": "Policy" - }, - "RestoreCryptoKeyVersionRequest": { - "properties": {}, - "id": "RestoreCryptoKeyVersionRequest", - "description": "Request message for KeyManagementService.RestoreCryptoKeyVersion.", - "type": "object" + "id": "Expr" }, - "UpdateCryptoKeyPrimaryVersionRequest": { - "description": "Request message for KeyManagementService.UpdateCryptoKeyPrimaryVersion.", + "EncryptRequest": { + "description": "Request message for KeyManagementService.Encrypt.", "type": "object", "properties": { - "cryptoKeyVersionId": { - "description": "The id of the child CryptoKeyVersion to use as primary.", + "additionalAuthenticatedData": { + "format": "byte", + "description": "Optional data that, if specified, must also be provided during decryption\nthrough DecryptRequest.additional_authenticated_data. Must be no\nlarger than 64KiB.", + "type": "string" + }, + "plaintext": { + "format": "byte", + "description": "Required. The data to encrypt. Must be no larger than 64KiB.", "type": "string" } }, - "id": "UpdateCryptoKeyPrimaryVersionRequest" + "id": "EncryptRequest" }, - "ListKeyRingsResponse": { - "description": "Response message for KeyManagementService.ListKeyRings.", + "ListCryptoKeyVersionsResponse": { + "description": "Response message for KeyManagementService.ListCryptoKeyVersions.", "type": "object", "properties": { "nextPageToken": { - "description": "A token to retrieve next page of results. Pass this value in\nListKeyRingsRequest.page_token to retrieve the next page of results.", + "description": "A token to retrieve next page of results. Pass this value in\nListCryptoKeyVersionsRequest.page_token to retrieve the next page of\nresults.", "type": "string" }, "totalSize": { - "description": "The total number of KeyRings that matched the query.", "format": "int32", + "description": "The total number of CryptoKeyVersions that matched the\nquery.", "type": "integer" }, - "keyRings": { - "description": "The list of KeyRings.", - "type": "array", + "cryptoKeyVersions": { + "description": "The list of CryptoKeyVersions.", "items": { - "$ref": "KeyRing" - } + "$ref": "CryptoKeyVersion" + }, + "type": "array" } }, - "id": "ListKeyRingsResponse" + "id": "ListCryptoKeyVersionsResponse" }, - "DataAccessOptions": { - "description": "Write a Data Access (Gin) log", - "type": "object", + "TestIamPermissionsResponse": { + "properties": { + "permissions": { + "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "id": "TestIamPermissionsResponse", + "description": "Response message for `TestIamPermissions` method.", + "type": "object" + }, + "DestroyCryptoKeyVersionRequest": { "properties": {}, - "id": "DataAccessOptions" + "id": "DestroyCryptoKeyVersionRequest", + "description": "Request message for KeyManagementService.DestroyCryptoKeyVersion.", + "type": "object" }, - "AuditConfig": { + "Rule": { + "description": "A rule to be applied in a Policy.", + "type": "object", "properties": { - "auditLogConfigs": { - "description": "The configuration for logging of each type of permission.\nNext ID: 4", - "type": "array", + "description": { + "description": "Human-readable description of the rule.", + "type": "string" + }, + "conditions": { + "description": "Additional restrictions that must be met", "items": { - "$ref": "AuditLogConfig" - } + "$ref": "Condition" + }, + "type": "array" }, - "exemptedMembers": { - "type": "array", + "logConfig": { + "description": "The config returned to callers of tech.iam.IAM.CheckPolicy for any entries\nthat match the LOG action.", + "items": { + "$ref": "LogConfig" + }, + "type": "array" + }, + "in": { + "description": "If one or more 'in' clauses are specified, the rule matches if\nthe PRINCIPAL/AUTHORITY_SELECTOR is in at least one of these entries.", "items": { "type": "string" - } + }, + "type": "array" }, - "service": { - "description": "Specifies a service that will be enabled for audit logging.\nFor example, `storage.googleapis.com`, `cloudsql.googleapis.com`.\n`allServices` is a special value that covers all services.", - "type": "string" + "permissions": { + "description": "A permission is a string of form '\u003cservice\u003e.\u003cresource type\u003e.\u003cverb\u003e'\n(e.g., 'storage.buckets.list'). A value of '*' matches all permissions,\nand a verb part of '*' (e.g., 'storage.buckets.*') matches all verbs.", + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "description": "Required", + "type": "string", + "enumDescriptions": [ + "Default no action.", + "Matching 'Entries' grant access.", + "Matching 'Entries' grant access and the caller promises to log\nthe request per the returned log_configs.", + "Matching 'Entries' deny access.", + "Matching 'Entries' deny access and the caller promises to log\nthe request per the returned log_configs.", + "Matching 'Entries' tell IAM.Check callers to generate logs." + ], + "enum": [ + "NO_ACTION", + "ALLOW", + "ALLOW_WITH_LOG", + "DENY", + "DENY_WITH_LOG", + "LOG" + ] + }, + "notIn": { + "description": "If one or more 'not_in' clauses are specified, the rule matches\nif the PRINCIPAL/AUTHORITY_SELECTOR is in none of the entries.\nThe format for in and not_in entries is the same as for members in a\nBinding (see google/iam/v1/policy.proto).", + "items": { + "type": "string" + }, + "type": "array" } }, - "id": "AuditConfig", - "description": "Specifies the audit configuration for a service.\nThe configuration determines which permission types are logged, and what\nidentities, if any, are exempted from logging.\nAn AuditConfig must have one or more AuditLogConfigs.\n\nIf there are AuditConfigs for both `allServices` and a specific service,\nthe union of the two AuditConfigs is used for that service: the log_types\nspecified in each AuditConfig are enabled, and the exempted_members in each\nAuditConfig are exempted.\n\nExample Policy with multiple AuditConfigs:\n\n {\n \"audit_configs\": [\n {\n \"service\": \"allServices\"\n \"audit_log_configs\": [\n {\n \"log_type\": \"DATA_READ\",\n \"exempted_members\": [\n \"user:foo@gmail.com\"\n ]\n },\n {\n \"log_type\": \"DATA_WRITE\",\n },\n {\n \"log_type\": \"ADMIN_READ\",\n }\n ]\n },\n {\n \"service\": \"fooservice.googleapis.com\"\n \"audit_log_configs\": [\n {\n \"log_type\": \"DATA_READ\",\n },\n {\n \"log_type\": \"DATA_WRITE\",\n \"exempted_members\": [\n \"user:bar@gmail.com\"\n ]\n }\n ]\n }\n ]\n }\n\nFor fooservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ\nlogging. It also exempts foo@gmail.com from DATA_READ logging, and\nbar@gmail.com from DATA_WRITE logging.", - "type": "object" + "id": "Rule" }, - "CryptoKeyVersion": { - "description": "A CryptoKeyVersion represents an individual cryptographic key, and the\nassociated key material.\n\nIt can be used for cryptographic operations either directly, or via its\nparent CryptoKey, in which case the server will choose the appropriate\nversion for the operation.", + "CryptoKey": { + "description": "A CryptoKey represents a logical key that can be used for cryptographic\noperations.\n\nA CryptoKey is made up of one or more versions, which\nrepresent the actual key material used in cryptographic operations.", "type": "object", "properties": { - "destroyTime": { - "description": "Output only. The time this CryptoKeyVersion's key material is scheduled\nfor destruction. Only present if state is\nDESTROY_SCHEDULED.", + "createTime": { "format": "google-datetime", + "description": "Output only. The time at which this CryptoKey was created.", "type": "string" }, - "createTime": { - "description": "Output only. The time at which this CryptoKeyVersion was created.", - "format": "google-datetime", + "rotationPeriod": { + "format": "google-duration", + "description": "next_rotation_time will be advanced by this period when the service\nautomatically rotates a key. Must be at least one day.\n\nIf rotation_period is set, next_rotation_time must also be set.", "type": "string" }, - "state": { + "primary": { + "$ref": "CryptoKeyVersion", + "description": "Output only. A copy of the \"primary\" CryptoKeyVersion that will be used\nby Encrypt when this CryptoKey is given\nin EncryptRequest.name.\n\nThe CryptoKey's primary version can be updated via\nUpdateCryptoKeyPrimaryVersion." + }, + "name": { + "description": "Output only. The resource name for this CryptoKey in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.", + "type": "string" + }, + "purpose": { "enum": [ - "CRYPTO_KEY_VERSION_STATE_UNSPECIFIED", - "ENABLED", - "DISABLED", - "DESTROYED", - "DESTROY_SCHEDULED" + "CRYPTO_KEY_PURPOSE_UNSPECIFIED", + "ENCRYPT_DECRYPT" ], - "description": "The current state of the CryptoKeyVersion.", + "description": "The immutable purpose of this CryptoKey. Currently, the only acceptable\npurpose is ENCRYPT_DECRYPT.", "type": "string", "enumDescriptions": [ "Not specified.", - "This version may be used in Encrypt and\nDecrypt requests.", - "This version may not be used, but the key material is still available,\nand the version can be placed back into the ENABLED state.", - "This version is destroyed, and the key material is no longer stored.\nA version may not leave this state once entered.", - "This version is scheduled for destruction, and will be destroyed soon.\nCall\nRestoreCryptoKeyVersion\nto put it back into the DISABLED state." + "CryptoKeys with this purpose may be used with\nEncrypt and\nDecrypt." ] }, - "name": { - "description": "Output only. The resource name for this CryptoKeyVersion in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*/cryptoKeyVersions/*`.", - "type": "string" - }, - "destroyEventTime": { - "description": "Output only. The time this CryptoKeyVersion's key material was\ndestroyed. Only present if state is\nDESTROYED.", + "nextRotationTime": { "format": "google-datetime", + "description": "At next_rotation_time, the Key Management Service will automatically:\n\n1. Create a new version of this CryptoKey.\n2. Mark the new version as primary.\n\nKey rotations performed manually via\nCreateCryptoKeyVersion and\nUpdateCryptoKeyPrimaryVersion\ndo not affect next_rotation_time.", "type": "string" } }, - "id": "CryptoKeyVersion" + "id": "CryptoKey" }, - "CloudAuditOptions": { - "description": "Write a Cloud Audit log", + "LogConfig": { + "description": "Specifies what kind of log the caller must write\nIncrement a streamz counter with the specified metric and field names.\n\nMetric names should start with a '/', generally be lowercase-only,\nand end in \"_count\". Field names should not contain an initial slash.\nThe actual exported metric names will have \"/iam/policy\" prepended.\n\nField names correspond to IAM request parameters and field values are\ntheir respective values.\n\nAt present the only supported field names are\n - \"iam_principal\", corresponding to IAMContext.principal;\n - \"\" (empty string), resulting in one aggretated counter with no field.\n\nExamples:\n counter { metric: \"/debug_access_count\" field: \"iam_principal\" }\n ==\u003e increment counter /iam/policy/backend_debug_access_count\n {iam_principal=[value of IAMContext.principal]}\n\nAt this time we do not support:\n* multiple field names (though this may be supported in the future)\n* decrementing the counter\n* incrementing it by anything other than 1", "type": "object", - "properties": {}, - "id": "CloudAuditOptions" + "properties": { + "counter": { + "description": "Counter options.", + "$ref": "CounterOptions" + }, + "dataAccess": { + "$ref": "DataAccessOptions", + "description": "Data access options." + }, + "cloudAudit": { + "description": "Cloud audit options.", + "$ref": "CloudAuditOptions" + } + }, + "id": "LogConfig" } }, - "protocol": "rest", "icons": { - "x16": "http://www.google.com/images/icons/product/search-16.gif", - "x32": "http://www.google.com/images/icons/product/search-32.gif" + "x32": "http://www.google.com/images/icons/product/search-32.gif", + "x16": "http://www.google.com/images/icons/product/search-16.gif" }, + "protocol": "rest", "canonicalName": "Cloud KMS", "auth": { "oauth2": { @@ -1512,5 +1552,7 @@ } } }, - "rootUrl": "https://cloudkms.googleapis.com/" + "rootUrl": "https://cloudkms.googleapis.com/", + "ownerDomain": "google.com", + "name": "cloudkms" } diff --git a/vendor/google.golang.org/api/cloudkms/v1/cloudkms-gen.go b/vendor/google.golang.org/api/cloudkms/v1/cloudkms-gen.go index 2baf8313c945f..cc65a01d4a30f 100644 --- a/vendor/google.golang.org/api/cloudkms/v1/cloudkms-gen.go +++ b/vendor/google.golang.org/api/cloudkms/v1/cloudkms-gen.go @@ -291,6 +291,15 @@ func (s *AuditLogConfig) MarshalJSON() ([]byte, error) { // Binding: Associates `members` with a `role`. type Binding struct { + // Condition: The condition that is associated with this binding. + // NOTE: an unsatisfied condition will not allow user access via + // current + // binding. Different bindings, including their conditions, are + // examined + // independently. + // This field is GOOGLE_INTERNAL. + Condition *Expr `json:"condition,omitempty"` + // Members: Specifies the identities requesting access for a Cloud // Platform resource. // `members` can have the following values: @@ -317,6 +326,7 @@ type Binding struct { // group. // For example, `admins@example.com`. // + // // * `domain:{domain}`: A Google Apps domain name that represents all // the // users of that domain. For example, `google.com` or @@ -331,7 +341,7 @@ type Binding struct { // Required Role string `json:"role,omitempty"` - // ForceSendFields is a list of field names (e.g. "Members") to + // ForceSendFields is a list of field names (e.g. "Condition") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the @@ -339,7 +349,7 @@ type Binding struct { // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "Members") to include in + // NullFields is a list of field names (e.g. "Condition") to include in // API requests with the JSON null value. By default, fields with empty // values are omitted from API requests. However, any field with an // empty value appearing in NullFields will be sent to the server as @@ -356,6 +366,37 @@ func (s *Binding) MarshalJSON() ([]byte, error) { // CloudAuditOptions: Write a Cloud Audit log type CloudAuditOptions struct { + // LogName: The log_name to populate in the Cloud Audit Record. + // + // Possible values: + // "UNSPECIFIED_LOG_NAME" - Default. Should not be used. + // "ADMIN_ACTIVITY" - Corresponds to + // "cloudaudit.googleapis.com/activity" + // "DATA_ACCESS" - Corresponds to + // "cloudaudit.googleapis.com/data_access" + LogName string `json:"logName,omitempty"` + + // ForceSendFields is a list of field names (e.g. "LogName") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "LogName") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CloudAuditOptions) MarshalJSON() ([]byte, error) { + type noMethod CloudAuditOptions + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } // Condition: A condition to be met. @@ -379,7 +420,6 @@ type Condition struct { // additional // access, and are thus only used in a strictly positive context // (e.g. ALLOW/IN or DENY/NOT_IN). - // See: go/rpc-security-policy-dynamicauth. // "JUSTIFICATION_TYPE" - What types of justifications have been // supplied with this request. // String values should match enum names from @@ -801,6 +841,60 @@ func (s *EncryptResponse) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// Expr: Represents an expression text. Example: +// +// title: "User account presence" +// description: "Determines whether the request has a user account" +// expression: "size(request.user) > 0" +type Expr struct { + // Description: An optional description of the expression. This is a + // longer text which + // describes the expression, e.g. when hovered over it in a UI. + Description string `json:"description,omitempty"` + + // Expression: Textual representation of an expression in + // Common Expression Language syntax. + // + // The application context of the containing message determines + // which + // well-known feature set of CEL is supported. + Expression string `json:"expression,omitempty"` + + // Location: An optional string indicating the location of the + // expression for error + // reporting, e.g. a file name and a position in the file. + Location string `json:"location,omitempty"` + + // Title: An optional title for the expression, i.e. a short string + // describing + // its purpose. This can be used e.g. in UIs which allow to enter + // the + // expression. + Title string `json:"title,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Description") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Description") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Expr) MarshalJSON() ([]byte, error) { + type noMethod Expr + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // KeyRing: A KeyRing is a toplevel logical grouping of CryptoKeys. type KeyRing struct { // CreateTime: Output only. The time at which this KeyRing was created. @@ -1053,6 +1147,35 @@ func (s *Location) MarshalJSON() ([]byte, error) { } // LogConfig: Specifies what kind of log the caller must write +// Increment a streamz counter with the specified metric and field +// names. +// +// Metric names should start with a '/', generally be +// lowercase-only, +// and end in "_count". Field names should not contain an initial +// slash. +// The actual exported metric names will have "/iam/policy" +// prepended. +// +// Field names correspond to IAM request parameters and field values +// are +// their respective values. +// +// At present the only supported field names are +// - "iam_principal", corresponding to IAMContext.principal; +// - "" (empty string), resulting in one aggretated counter with no +// field. +// +// Examples: +// counter { metric: "/debug_access_count" field: "iam_principal" } +// ==> increment counter /iam/policy/backend_debug_access_count +// {iam_principal=[value of +// IAMContext.principal]} +// +// At this time we do not support: +// * multiple field names (though this may be supported in the future) +// * decrementing the counter +// * incrementing it by anything other than 1 type LogConfig struct { // CloudAudit: Cloud audit options. CloudAudit *CloudAuditOptions `json:"cloudAudit,omitempty"` @@ -1128,8 +1251,6 @@ type Policy struct { AuditConfigs []*AuditConfig `json:"auditConfigs,omitempty"` // Bindings: Associates a list of `members` to a `role`. - // Multiple `bindings` must not be specified for the same - // `role`. // `bindings` with no members will result in an error. Bindings []*Binding `json:"bindings,omitempty"` @@ -2819,7 +2940,7 @@ type ProjectsLocationsKeyRingsCryptoKeysDecryptCall struct { header_ http.Header } -// Decrypt: Decrypt data that was protected by Encrypt. +// Decrypt: Decrypts data that was protected by Encrypt. func (r *ProjectsLocationsKeyRingsCryptoKeysService) Decrypt(name string, decryptrequest *DecryptRequest) *ProjectsLocationsKeyRingsCryptoKeysDecryptCall { c := &ProjectsLocationsKeyRingsCryptoKeysDecryptCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.name = name @@ -2913,7 +3034,7 @@ func (c *ProjectsLocationsKeyRingsCryptoKeysDecryptCall) Do(opts ...googleapi.Ca } return ret, nil // { - // "description": "Decrypt data that was protected by Encrypt.", + // "description": "Decrypts data that was protected by Encrypt.", // "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:decrypt", // "httpMethod": "POST", // "id": "cloudkms.projects.locations.keyRings.cryptoKeys.decrypt", @@ -2954,7 +3075,7 @@ type ProjectsLocationsKeyRingsCryptoKeysEncryptCall struct { header_ http.Header } -// Encrypt: Encrypt data, so that it can only be recovered by a call to +// Encrypt: Encrypts data, so that it can only be recovered by a call to // Decrypt. func (r *ProjectsLocationsKeyRingsCryptoKeysService) Encrypt(name string, encryptrequest *EncryptRequest) *ProjectsLocationsKeyRingsCryptoKeysEncryptCall { c := &ProjectsLocationsKeyRingsCryptoKeysEncryptCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -3049,7 +3170,7 @@ func (c *ProjectsLocationsKeyRingsCryptoKeysEncryptCall) Do(opts ...googleapi.Ca } return ret, nil // { - // "description": "Encrypt data, so that it can only be recovered by a call to Decrypt.", + // "description": "Encrypts data, so that it can only be recovered by a call to Decrypt.", // "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:encrypt", // "httpMethod": "POST", // "id": "cloudkms.projects.locations.keyRings.cryptoKeys.encrypt", diff --git a/vendor/google.golang.org/api/cloudmonitoring/v2beta2/cloudmonitoring-api.json b/vendor/google.golang.org/api/cloudmonitoring/v2beta2/cloudmonitoring-api.json index de89983988b18..8910233454bc9 100644 --- a/vendor/google.golang.org/api/cloudmonitoring/v2beta2/cloudmonitoring-api.json +++ b/vendor/google.golang.org/api/cloudmonitoring/v2beta2/cloudmonitoring-api.json @@ -1,12 +1,12 @@ { "kind": "discovery#restDescription", - "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/mLggzdz9EvP0lVEQoxoRvdSJShg\"", + "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/NOsFjtPY9zRzc3K9F8mQGuDeSj0\"", "discoveryVersion": "v1", "id": "cloudmonitoring:v2beta2", "name": "cloudmonitoring", "canonicalName": "Cloud Monitoring", "version": "v2beta2", - "revision": "20161031", + "revision": "20170501", "title": "Cloud Monitoring API", "description": "Accesses Google Cloud Monitoring data.", "ownerDomain": "google.com", diff --git a/vendor/google.golang.org/api/compute/v0.alpha/compute-api.json b/vendor/google.golang.org/api/compute/v0.alpha/compute-api.json index 51cc485e67839..00938eb6b0971 100644 --- a/vendor/google.golang.org/api/compute/v0.alpha/compute-api.json +++ b/vendor/google.golang.org/api/compute/v0.alpha/compute-api.json @@ -1,11 +1,11 @@ { "kind": "discovery#restDescription", - "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/evVoqL-eOjD7KCnqEXQHq8VJpZg\"", + "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/2ZSRpzMc2ShKN_p23rokDFE50Rk\"", "discoveryVersion": "v1", "id": "compute:alpha", "name": "compute", "version": "alpha", - "revision": "20170416", + "revision": "20170721", "title": "Compute Engine API", "description": "Creates and runs virtual machines on Google Cloud Platform.", "ownerDomain": "google.com", @@ -160,11 +160,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped accelerator type lists.", + "description": "A list of AcceleratorTypesScopedList resources.", "additionalProperties": { "$ref": "AcceleratorTypesScopedList", "description": "[Output Only] Name of the scope containing this set of accelerator types." @@ -208,7 +208,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -318,7 +318,7 @@ }, "networkTier": { "type": "string", - "description": "This signifies the networking tier used for configuring this access configuration and can only take the following values: PREMIUM , SELECT. If this field is not specified, it is assumed to be PREMIUM.", + "description": "This signifies the networking tier used for configuring this access configuration and can only take the following values: PREMIUM, STANDARD.\n\nIf an AccessConfig is specified without a valid external IP address, an ephemeral IP will be created with this networkTier.\n\nIf an AccessConfig with a valid external IP address is specified, it must match that of the networkTier associated with the Address resource owning that IP.", "enum": [ "PREMIUM", "SELECT", @@ -372,11 +372,13 @@ "type": "string", "description": "The type of address to reserve. If unspecified, defaults to EXTERNAL.", "enum": [ + "DNS_FORWARDING", "EXTERNAL", "INTERNAL", "UNSPECIFIED_TYPE" ], "enumDescriptions": [ + "", "", "", "" @@ -438,7 +440,7 @@ }, "networkTier": { "type": "string", - "description": "This signifies the networking tier used for configuring this Address and can only take the following values: PREMIUM , SELECT. If this field is not specified, it is assumed to be PREMIUM.", + "description": "This signifies the networking tier used for configuring this Address and can only take the following values: PREMIUM , STANDARD.\n\nIf this field is not specified, it is assumed to be PREMIUM.", "enum": [ "PREMIUM", "SELECT", @@ -493,7 +495,7 @@ }, "items": { "type": "object", - "description": "[Output Only] A map of scoped address lists.", + "description": "A list of AddressesScopedList resources.", "additionalProperties": { "$ref": "AddressesScopedList", "description": "[Output Only] Name of the scope containing this set of addresses." @@ -521,11 +523,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of addresses.", + "description": "A list of Address resources.", "items": { "$ref": "Address" } @@ -541,7 +543,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -826,6 +828,31 @@ } } }, + "AuthorizationLoggingOptions": { + "id": "AuthorizationLoggingOptions", + "type": "object", + "description": "Authorization-related information used by Cloud Audit Logging.", + "properties": { + "permissionType": { + "type": "string", + "description": "The type of the permission that was checked.", + "enum": [ + "ADMIN_READ", + "ADMIN_WRITE", + "DATA_READ", + "DATA_WRITE", + "PERMISSION_TYPE_UNSPECIFIED" + ], + "enumDescriptions": [ + "", + "", + "", + "", + "" + ] + } + } + }, "Autoscaler": { "id": "Autoscaler", "type": "object", @@ -910,11 +937,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped autoscaler lists.", + "description": "A list of AutoscalersScopedList resources.", "additionalProperties": { "$ref": "AutoscalersScopedList", "description": "[Output Only] Name of the scope containing this set of autoscalers." @@ -942,7 +969,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -988,9 +1015,11 @@ "MISSING_LOAD_BALANCING_DATA_POINTS", "MORE_THAN_ONE_BACKEND_SERVICE", "NOT_ENOUGH_QUOTA_AVAILABLE", + "REGION_RESOURCE_STOCKOUT", "SCALING_TARGET_DOES_NOT_EXIST", "UNKNOWN", - "UNSUPPORTED_MAX_RATE_LOAD_BALANCING_CONFIGURATION" + "UNSUPPORTED_MAX_RATE_LOAD_BALANCING_CONFIGURATION", + "ZONE_RESOURCE_STOCKOUT" ], "enumDescriptions": [ "", @@ -1005,6 +1034,8 @@ "", "", "", + "", + "", "" ] } @@ -1150,13 +1181,22 @@ "type": "object", "description": "Custom utilization metric policy.", "properties": { + "filter": { + "type": "string", + "description": "A filter string, compatible with a Stackdriver Monitoring filter string for TimeSeries.list API call. This filter is used to select a specific TimeSeries for the purpose of autoscaling and to determine whether the metric is exporting per-instance or global data.\n\nFor the filter to be valid for autoscaling purposes, the following rules apply: \n- You can only use the AND operator for joining selectors. \n- You can only use direct equality comparison operator (=) without any functions for each selector. \n- You can specify the metric in both the filter string and in the metric field. However, if specified in both places, the metric must be identical. \n- The monitored resource type determines what kind of values are expected for the metric. If it is a gce_instance, the autoscaler expects the metric to include a separate TimeSeries for each instance in a group. In such a case, you cannot filter on resource labels.\nIf the resource type is any other value, the autoscaler expects this metric to contain values that apply to the entire autoscaled instance group and resource label filtering can be performed to point autoscaler at the correct TimeSeries to scale upon. This is / called a global metric for the purpose of autoscaling.\n\nIf not specified, the type defaults to gce_instance. \n\nYou should provide a filter that is selective enough to pick just one TimeSeries for the autoscaled group or for each of the instances (if you are using gce_instance resource type). If multiple TimeSeries are returned upon the query execution, the autoscaler will sum their respective values to obtain its scaling value." + }, "metric": { "type": "string", - "description": "The identifier of the Stackdriver Monitoring metric. The metric cannot have negative values and should be a utilization metric, which means that the number of virtual machines handling requests should increase or decrease proportionally to the metric. The metric must also have a label of compute.googleapis.com/resource_id with the value of the instance's unique ID, although this alone does not guarantee that the metric is valid.\n\nFor example, the following is a valid metric:\ncompute.googleapis.com/instance/network/received_bytes_count\nThe following is not a valid metric because it does not increase or decrease based on usage:\ncompute.googleapis.com/instance/cpu/reserved_cores" + "description": "The identifier (type) of the Stackdriver Monitoring metric. The metric cannot have negative values and should be a utilization metric, which means that the number of virtual machines handling requests should increase or decrease proportionally to the metric.\n\nThe metric must have a value type of INT64 or DOUBLE." + }, + "singleInstanceAssignment": { + "type": "number", + "description": "If scaling is based on a global metric value that represents the total amount of work to be done or resource usage, set this value to an amount assigned for a single instance of the scaled group. Autoscaler will keep the number of instances proportional to the value of this metric, the metric itself should not change value due to group resizing.\n\nA good metric to use with the target is for example pubsub.googleapis.com/subscription/num_undelivered_messages or a custom metric exporting the total number of requests coming to your instances.\n\nA bad example would be a metric exporting an average or median latency, since this value can't include a chunk assignable to a single instance, it could be better used with utilization_target instead.", + "format": "double" }, "utilizationTarget": { "type": "number", - "description": "Target value of the metric which autoscaler should maintain. Must be a positive value.", + "description": "The target value of the metric that autoscaler should maintain. This must be a positive value.\n\nFor example, a good metric to use as a utilization_target is compute.googleapis.com/instance/network/received_bytes_count. The autoscaler will work to keep this value constant for each of the instances.", "format": "double" }, "utilizationTargetType": { @@ -1230,7 +1270,7 @@ "properties": { "balancingMode": { "type": "string", - "description": "Specifies the balancing mode for this backend. For global HTTP(S) or TCP/SSL load balancing, the default is UTILIZATION. Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for TCP/SSL).\n\nThis cannot be used for internal load balancing.", + "description": "Specifies the balancing mode for this backend. For global HTTP(S) or TCP/SSL load balancing, the default is UTILIZATION. Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for TCP/SSL).\n\nFor Internal Load Balancing, the default and only supported mode is CONNECTION.", "enum": [ "CONNECTION", "RATE", @@ -1257,7 +1297,7 @@ }, "group": { "type": "string", - "description": "The fully-qualified URL of a zonal Instance Group resource. This instance group defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource.\n\nNote that you must specify an Instance Group resource using the fully-qualified URL, rather than a partial URL.\n\nWhen the BackendService has load balancing scheme INTERNAL, the instance group must be in a zone within the same region as the BackendService." + "description": "The fully-qualified URL of a Instance Group resource. This instance group defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource.\n\nNote that you must specify an Instance Group resource using the fully-qualified URL, rather than a partial URL.\n\nWhen the BackendService has load balancing scheme INTERNAL, the instance group must be within the same region as the BackendService." }, "maxConnections": { "type": "integer", @@ -1374,7 +1414,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -1437,7 +1477,7 @@ }, "healthChecks": { "type": "array", - "description": "The list of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified, and a health check is required.\n\nFor internal load balancing, a URL to a HealthCheck resource must be specified instead.", + "description": "The list of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified, and a health check is required for GCE backend services. A health check must not be specified for GAE app backend and Cloud Function backend.\n\nFor internal load balancing, a URL to a HealthCheck resource must be specified instead.", "items": { "type": "string" } @@ -1550,7 +1590,7 @@ }, "items": { "type": "object", - "description": "A map of scoped BackendService lists.", + "description": "A list of BackendServicesScopedList resources.", "additionalProperties": { "$ref": "BackendServicesScopedList", "description": "Name of the scope containing this set of BackendServices." @@ -1563,7 +1603,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -1626,7 +1666,8 @@ "type": "string" }, "oauth2ClientSecretSha256": { - "type": "string" + "type": "string", + "description": "[Output Only] SHA256 hash value for the field oauth2_client_secret above." } } }, @@ -1748,9 +1789,13 @@ "type": "object", "description": "Associates `members` with a `role`.", "properties": { + "condition": { + "$ref": "Expr", + "description": "The condition that is associated with this binding. NOTE: an unsatisfied condition will not allow user access via current binding. Different bindings, including their conditions, are examined independently. This field is GOOGLE_INTERNAL." + }, "members": { "type": "array", - "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.", + "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.", "items": { "type": "string" } @@ -1810,7 +1855,7 @@ "Commitment": { "id": "Commitment", "type": "object", - "description": "A usage-commitment with a start / end time. Users create commitments for particular resources (e.g. memory). Actual usage is first deducted from available commitments made prior, perhaps at a reduced price (as laid out in the commitment).", + "description": "Represents a Commitment resource. Creating a Commitment resource means that you are purchasing a committed use contract with an explicit start and end time. You can create commitments based on vCPUs and memory usage and receive discounted rates. For full details, read Signing Up for Committed Use Discounts.\n\nCommitted use discounts are subject to Google Cloud Platform's Service Specific Terms. By purchasing a committed use discount, you agree to these terms. Committed use discounts will not renew, so you must purchase a new commitment to continue receiving discounts.", "properties": { "creationTimestamp": { "type": "string", @@ -1874,7 +1919,7 @@ }, "status": { "type": "string", - "description": "[Output Only] Status of the commitment with regards to eventual expiration (each commitment has an end-date defined). One of the following values: NOT_YET_ACTIVE, ACTIVE, EXPIRED.", + "description": "[Output Only] Status of the commitment with regards to eventual expiration (each commitment has an end date defined). One of the following values: NOT_YET_ACTIVE, ACTIVE, EXPIRED.", "enum": [ "ACTIVE", "CREATING", @@ -1900,11 +1945,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "Commitments by scope.", + "description": "A list of CommitmentsScopedList resources.", "additionalProperties": { "$ref": "CommitmentsScopedList", "description": "[Output Only] Name of the scope containing this set of commitments." @@ -1932,7 +1977,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -2251,6 +2296,14 @@ "type": "string", "description": "[Output Only] Last detach timestamp in RFC3339 text format." }, + "licenseCodes": { + "type": "array", + "description": "Integer license codes indicating which licenses are attached to this disk.", + "items": { + "type": "string", + "format": "int64" + } + }, "licenses": { "type": "array", "description": "Any applicable publicly visible licenses.", @@ -2272,6 +2325,11 @@ "type": "string", "description": "Internal use only." }, + "physicalBlockSizeBytes": { + "type": "string", + "description": "Physical block size of the persistent disk, in bytes. If not present in a request, a default value is used. Initially only 4096 is supported, but other powers of two may be added. If an unsupported value is requested, the error message will list the supported values, but even a supported value may be allowed for only some projects.", + "format": "int64" + }, "region": { "type": "string", "description": "[Output Only] URL of the region where the disk resides. Only applicable for regional resources." @@ -2289,7 +2347,7 @@ }, "sizeGb": { "type": "string", - "description": "Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the sourceImage or sourceSnapshot parameter, or specify it alone to create an empty persistent disk.\n\nIf you specify this field along with sourceImage or sourceSnapshot, the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot.", + "description": "Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the sourceImage or sourceSnapshot parameter, or specify it alone to create an empty persistent disk.\n\nIf you specify this field along with sourceImage or sourceSnapshot, the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot. Acceptable values are 1 to 65536, inclusive.", "format": "int64" }, "sourceImage": { @@ -2367,11 +2425,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped disk lists.", + "description": "A list of DisksScopedList resources.", "additionalProperties": { "$ref": "DisksScopedList", "description": "[Output Only] Name of the scope containing this set of disks." @@ -2384,7 +2442,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results. Acceptable values are 0 to 500, inclusive. (Default: 500)" + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -2415,7 +2473,7 @@ }, "nextPageToken": { "type": "string", - "description": "This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -2494,11 +2552,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped disk type lists.", + "description": "A list of DiskTypesScopedList resources.", "additionalProperties": { "$ref": "DiskTypesScopedList", "description": "[Output Only] Name of the scope containing this set of disk types." @@ -2526,11 +2584,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Disk Type resources.", + "description": "A list of DiskType resources.", "items": { "$ref": "DiskType" } @@ -2743,7 +2801,36 @@ "properties": { "zone": { "type": "string", - "description": "URL of the zone where managed instance group is spawning instances (for regional resources). Zone has to belong to the region where managed instance group is located." + "description": "URL of the zone where managed instance group is spawning instances (for regional resources). Zone has to belong to the region where managed instance group is located.", + "annotations": { + "required": [ + "compute.regionInstanceGroupManagers.insert", + "compute.regionInstanceGroupManagers.update" + ] + } + } + } + }, + "Expr": { + "id": "Expr", + "type": "object", + "description": "Represents an expression text. Example:\n\ntitle: \"User account presence\" description: \"Determines whether the request has a user account\" expression: \"size(request.user) \u003e 0\"", + "properties": { + "description": { + "type": "string", + "description": "An optional description of the expression. This is a longer text which describes the expression, e.g. when hovered over it in a UI." + }, + "expression": { + "type": "string", + "description": "Textual representation of an expression in Common Expression Language syntax.\n\nThe application context of the containing message determines which well-known feature set of CEL is supported." + }, + "location": { + "type": "string", + "description": "An optional string indicating the location of the expression for error reporting, e.g. a file name and a position in the file." + }, + "title": { + "type": "string", + "description": "An optional title for the expression, i.e. a short string describing its purpose. This can be used e.g. in UIs which allow to enter the expression." } } }, @@ -2760,7 +2847,7 @@ "properties": { "IPProtocol": { "type": "string", - "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp), or the IP protocol number." + "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, ipip, sctp), or the IP protocol number." }, "ports": { "type": "array", @@ -2784,7 +2871,7 @@ "properties": { "IPProtocol": { "type": "string", - "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp), or the IP protocol number." + "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, ipip, sctp), or the IP protocol number." }, "ports": { "type": "array", @@ -2819,6 +2906,10 @@ "" ] }, + "enableLogging": { + "type": "boolean", + "description": "This field denotes whether to enable logging for a particular firewall rule. If logging is enabled, logs will be exported to the configured export destination for all firewall logs in the network. Logs may be exported to BigQuery or Pub/Sub." + }, "id": { "type": "string", "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", @@ -2826,7 +2917,7 @@ }, "kind": { "type": "string", - "description": "[Output Ony] Type of the resource. Always compute#firewall for firewall rules.", + "description": "[Output Only] Type of the resource. Always compute#firewall for firewall rules.", "default": "compute#firewall" }, "name": { @@ -2869,7 +2960,7 @@ }, "sourceTags": { "type": "array", - "description": "If source tags are specified, the firewall will apply only to traffic with source IP that belongs to a tag listed in source tags. Source tags cannot be used to control traffic to an instance's external IP address. Because tags are associated with an instance, not an IP address. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.", + "description": "If source tags are specified, the firewall rule applies only to traffic with source IPs that match the primary network interfaces of VM instances that have the tag and are in the same VPC network. Source tags cannot be used to control traffic to an instance's external IP address, it only applies to traffic between instances in the same virtual network. Because tags are associated with instances, not IP addresses. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.", "items": { "type": "string" } @@ -2897,11 +2988,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Firewall resources.", + "description": "A list of Firewall resources.", "items": { "$ref": "Firewall" } @@ -2950,7 +3041,7 @@ "properties": { "IPAddress": { "type": "string", - "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP. For regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule. Only IPv4 is supported." + "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP. For regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IPv4 address from the same scope (global or regional) will be assigned. A regional forwarding rule supports IPv4 only. A global forwarding rule supports either IPv4 or IPv6.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule." }, "IPProtocol": { "type": "string", @@ -3045,7 +3136,7 @@ }, "networkTier": { "type": "string", - "description": "This signifies the networking tier used for configuring this load balancer and can only take the following values: PREMIUM , SELECT. If this field is not specified, it is assumed to be PREMIUM.", + "description": "This signifies the networking tier used for configuring this load balancer and can only take the following values: PREMIUM , STANDARD.\n\nFor regional ForwardingRule, the valid values are PREMIUM and STANDARD. For GlobalForwardingRule, the valid value is PREMIUM.\n\nIf this field is not specified, it is assumed to be PREMIUM. If IPAddress is specified, this value must be equal to the networkTier of the Address.", "enum": [ "PREMIUM", "SELECT", @@ -3059,7 +3150,7 @@ }, "portRange": { "type": "string", - "description": "This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance.\n\nApplicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges.\n\nSome types of forwarding target have constraints on the acceptable ports: \n- TargetHttpProxy: 80, 8080 \n- TargetHttpsProxy: 443 \n- TargetSslProxy: 443 \n- TargetVpnGateway: 500, 4500\n-" + "description": "This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance.\n\nApplicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges.\n\nSome types of forwarding target have constraints on the acceptable ports: \n- TargetHttpProxy: 80, 8080 \n- TargetHttpsProxy: 443 \n- TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 \n- TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 \n- TargetVpnGateway: 500, 4500\n-" }, "ports": { "type": "array", @@ -3101,11 +3192,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped forwarding rule lists.", + "description": "A list of ForwardingRulesScopedList resources.", "additionalProperties": { "$ref": "ForwardingRulesScopedList", "description": "Name of the scope containing this set of addresses." @@ -3133,7 +3224,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Set by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -3257,6 +3348,30 @@ } } }, + "GuestAttributes": { + "id": "GuestAttributes", + "type": "object", + "description": "A guest attributes entry.", + "properties": { + "kind": { + "type": "string", + "description": "[Output Only] Type of the resource. Always compute#guestAttributes for guest attributes entry.", + "default": "compute#guestAttributes" + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for this resource." + }, + "variableKey": { + "type": "string", + "description": "The key to search for." + }, + "variableValue": { + "type": "string", + "description": "[Output Only] The value found for the requested key." + } + } + }, "GuestOsFeature": { "id": "GuestOsFeature", "type": "object", @@ -3264,7 +3379,7 @@ "properties": { "type": { "type": "string", - "description": "The type of supported feature. Currenty only VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the server might also populate this property with the value WINDOWS to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", + "description": "The type of supported feature. Currently only VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the server might also populate this property with the value WINDOWS to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", "enum": [ "FEATURE_TYPE_UNSPECIFIED", "MULTI_IP_SUBNET", @@ -3498,7 +3613,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -3650,11 +3765,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped host lists.", + "description": "A list of HostsScopedList resources.", "additionalProperties": { "$ref": "HostsScopedList", "description": "[Output Only] Name of the scope containing this set of hosts." @@ -3671,7 +3786,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -3682,11 +3797,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Host resources.", + "description": "A list of Host resources.", "items": { "$ref": "Host" } @@ -3702,7 +3817,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -3795,11 +3910,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped host type lists.", + "description": "A list of HostTypesScopedList resources.", "additionalProperties": { "$ref": "HostTypesScopedList", "description": "[Output Only] Name of the scope containing this set of host types." @@ -3816,7 +3931,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -3827,11 +3942,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Host Type resources.", + "description": "A list of HostType resources.", "items": { "$ref": "HostType" } @@ -3847,7 +3962,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -4089,7 +4204,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -4244,7 +4359,7 @@ }, "guestOsFeatures": { "type": "array", - "description": "A list of features to enable on the guest OS. Applicable for bootable images only. Currently, only one feature can be enabled, VIRTIO_SCSCI_MULTIQUEUE, which allows each virtual CPU to have its own queue. For Windows images, you can only enable VIRTIO_SCSCI_MULTIQUEUE on images with driver version 1.2.0.1621 or higher. Linux images with kernel versions 3.17 and higher will support VIRTIO_SCSCI_MULTIQUEUE.\n\nFor new Windows images, the server might also populate this field with the value WINDOWS, to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", + "description": "A list of features to enable on the guest OS. Applicable for bootable images only. Currently, only one feature can be enabled, VIRTIO_SCSI_MULTIQUEUE, which allows each virtual CPU to have its own queue. For Windows images, you can only enable VIRTIO_SCSI_MULTIQUEUE on images with driver version 1.2.0.1621 or higher. Linux images with kernel versions 3.17 and higher will support VIRTIO_SCSI_MULTIQUEUE.\n\nFor new Windows images, the server might also populate this field with the value WINDOWS, to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", "items": { "$ref": "GuestOsFeature" } @@ -4275,6 +4390,14 @@ "type": "string" } }, + "licenseCodes": { + "type": "array", + "description": "Integer license codes indicating which licenses are attached to this image.", + "items": { + "type": "string", + "format": "int64" + } + }, "licenses": { "type": "array", "description": "Any applicable license URI.", @@ -4384,11 +4507,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Image resources.", + "description": "A list of Image resources.", "items": { "$ref": "Image" } @@ -4445,7 +4568,7 @@ }, "host": { "type": "string", - "description": "Full or partial URL of the host resource that the instance should be placed on, in the format: zones/zone/hosts/host.\n\nOptional, Private Host (physical machine) that the instance will be placed on when it's created. The instance is guaranteed to be placed on the same machine as other instances with the same private host.\n\nThe request will be rejected if the private host has run out of resources." + "description": "Full or partial URL of the host resource that the instance should be placed on, in the format: zones/zone/hosts/host.\n\nOptional, sole-tenant Host (physical machine) that the instance will be placed on when it's created. The instance is guaranteed to be placed on the same machine as other instances with the same sole-tenant host.\n\nThe request will be rejected if the sole-tenant host has run out of resources." }, "id": { "type": "string", @@ -4488,7 +4611,7 @@ }, "minCpuPlatform": { "type": "string", - "description": "Minimum cpu/platform to be used by this instance. We may schedule on the specified or later cpu/platform." + "description": "Specifies a minimum CPU platform for the VM instance. Applicable values are the friendly names of CPU platforms, such as minCpuPlatform: \"Intel Haswell\" or minCpuPlatform: \"Intel Sandy Bridge\"." }, "name": { "type": "string", @@ -4528,7 +4651,7 @@ }, "status": { "type": "string", - "description": "[Output Only] The status of the instance. One of the following values: PROVISIONING, STAGING, RUNNING, STOPPING, SUSPENDING, SUSPENDED, and TERMINATED.", + "description": "[Output Only] The status of the instance. One of the following values: PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED, SUSPENDING, SUSPENDED, and TERMINATED.", "enum": [ "PROVISIONING", "RUNNING", @@ -4570,11 +4693,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped instance lists.", + "description": "A list of InstancesScopedList resources.", "additionalProperties": { "$ref": "InstancesScopedList", "description": "[Output Only] Name of the scope containing this set of instances." @@ -4672,11 +4795,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this aggregated list of instance groups. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped instance group lists.", + "description": "A list of InstanceGroupsScopedList resources.", "additionalProperties": { "$ref": "InstanceGroupsScopedList", "description": "The name of the scope that contains this set of instance groups." @@ -4693,7 +4816,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -4704,11 +4827,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this list of instance groups. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of instance groups.", + "description": "A list of InstanceGroup resources.", "items": { "$ref": "InstanceGroup" } @@ -4724,7 +4847,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -4733,6 +4856,9 @@ "type": "object", "description": "An Instance Group Manager resource.", "properties": { + "activities": { + "$ref": "InstanceGroupManagerActivities" + }, "autoHealingPolicies": { "type": "array", "description": "The autohealing policy for this managed instance group. You can specify only one value.", @@ -4807,7 +4933,8 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "annotations": { "required": [ - "compute.instanceGroupManagers.insert" + "compute.instanceGroupManagers.insert", + "compute.regionInstanceGroupManagers.insert" ] } }, @@ -4851,7 +4978,8 @@ "format": "int32", "annotations": { "required": [ - "compute.instanceGroupManagers.insert" + "compute.instanceGroupManagers.insert", + "compute.regionInstanceGroupManagers.insert" ] } }, @@ -4923,17 +5051,100 @@ } } }, + "InstanceGroupManagerActivities": { + "id": "InstanceGroupManagerActivities", + "type": "object", + "properties": { + "autohealing": { + "type": "string", + "enum": [ + "PERMITTED", + "PROHIBITED" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "autohealingHealthCheckBased": { + "type": "string", + "enum": [ + "PERMITTED", + "PROHIBITED" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "autoscalingDown": { + "type": "string", + "enum": [ + "PERMITTED", + "PROHIBITED" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "autoscalingUp": { + "type": "string", + "enum": [ + "PERMITTED", + "PROHIBITED" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "creatingInstances": { + "type": "string", + "enum": [ + "PERMITTED", + "PROHIBITED" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "deletingInstances": { + "type": "string", + "enum": [ + "PERMITTED", + "PROHIBITED" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "recreatingInstances": { + "type": "string", + "enum": [ + "PERMITTED", + "PROHIBITED" + ], + "enumDescriptions": [ + "", + "" + ] + } + } + }, "InstanceGroupManagerAggregatedList": { "id": "InstanceGroupManagerAggregatedList", "type": "object", "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this aggregated list of managed instance groups. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of filtered managed instance group lists.", + "description": "A list of InstanceGroupManagersScopedList resources.", "additionalProperties": { "$ref": "InstanceGroupManagersScopedList", "description": "[Output Only] The name of the scope that contains this set of managed instance groups." @@ -4950,7 +5161,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -4980,11 +5191,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this resource type. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of managed instance groups.", + "description": "A list of InstanceGroupManager resources.", "items": { "$ref": "InstanceGroupManager" } @@ -5074,10 +5285,14 @@ "type": "string", "description": "Minimal action to be taken on an instance. The order of action types is: RESTART \u003c REPLACE.", "enum": [ + "NONE", + "REFRESH", "REPLACE", "RESTART" ], "enumDescriptions": [ + "", + "", "", "" ] @@ -5129,6 +5344,52 @@ } } }, + "InstanceGroupManagersApplyUpdatesRequest": { + "id": "InstanceGroupManagersApplyUpdatesRequest", + "type": "object", + "description": "InstanceGroupManagers.applyUpdatesToInstances", + "properties": { + "instances": { + "type": "array", + "description": "The list of URLs of one or more instances for which we want to apply updates on this managed instance group. This can be a full URL or a partial URL, such as zones/[ZONE]/instances/[INSTANCE_NAME].", + "items": { + "type": "string" + } + }, + "maximalAction": { + "type": "string", + "description": "The maximal action that should be perfomed on the instances. By default REPLACE.", + "enum": [ + "NONE", + "REFRESH", + "REPLACE", + "RESTART" + ], + "enumDescriptions": [ + "", + "", + "", + "" + ] + }, + "minimalAction": { + "type": "string", + "description": "The minimal action that should be perfomed on the instances. By default NONE.", + "enum": [ + "NONE", + "REFRESH", + "REPLACE", + "RESTART" + ], + "enumDescriptions": [ + "", + "", + "", + "" + ] + } + } + }, "InstanceGroupManagersDeleteInstancesRequest": { "id": "InstanceGroupManagersDeleteInstancesRequest", "type": "object", @@ -5142,6 +5403,20 @@ } } }, + "InstanceGroupManagersDeletePerInstanceConfigsReq": { + "id": "InstanceGroupManagersDeletePerInstanceConfigsReq", + "type": "object", + "description": "InstanceGroupManagers.deletePerInstanceConfigs", + "properties": { + "instances": { + "type": "array", + "description": "The list of instances for which we want to delete per-instance configs on this managed instance group.", + "items": { + "type": "string" + } + } + } + }, "InstanceGroupManagersListManagedInstancesResponse": { "id": "InstanceGroupManagersListManagedInstancesResponse", "type": "object", @@ -5159,13 +5434,30 @@ } } }, - "InstanceGroupManagersRecreateInstancesRequest": { - "id": "InstanceGroupManagersRecreateInstancesRequest", + "InstanceGroupManagersListPerInstanceConfigsResp": { + "id": "InstanceGroupManagersListPerInstanceConfigsResp", "type": "object", "properties": { - "instances": { + "items": { "type": "array", - "description": "The URLs of one or more instances to recreate. This can be a full URL or a partial URL, such as zones/[ZONE]/instances/[INSTANCE_NAME].", + "description": "[Output Only] The list of PerInstanceConfig.", + "items": { + "$ref": "PerInstanceConfig" + } + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + } + } + }, + "InstanceGroupManagersRecreateInstancesRequest": { + "id": "InstanceGroupManagersRecreateInstancesRequest", + "type": "object", + "properties": { + "instances": { + "type": "array", + "description": "The URLs of one or more instances to recreate. This can be a full URL or a partial URL, such as zones/[ZONE]/instances/[INSTANCE_NAME].", "items": { "type": "string" } @@ -5309,6 +5601,20 @@ } } }, + "InstanceGroupManagersUpdatePerInstanceConfigsReq": { + "id": "InstanceGroupManagersUpdatePerInstanceConfigsReq", + "type": "object", + "description": "InstanceGroupManagers.updatePerInstanceConfigs", + "properties": { + "perInstanceConfigs": { + "type": "array", + "description": "The list of per-instance configs to insert or patch on this managed instance group.", + "items": { + "$ref": "PerInstanceConfig" + } + } + } + }, "InstanceGroupsAddInstancesRequest": { "id": "InstanceGroupsAddInstancesRequest", "type": "object", @@ -5328,11 +5634,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this list of instances in the specified instance group. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of instances and any named ports that are assigned to those instances.", + "description": "A list of InstanceWithNamedPorts resources.", "items": { "$ref": "InstanceWithNamedPorts" } @@ -5348,7 +5654,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this list of instances in the specified instance groups. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -5490,11 +5796,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of instances.", + "description": "A list of Instance resources.", "items": { "$ref": "Instance" } @@ -5521,11 +5827,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of referrers.", + "description": "A list of Reference resources.", "items": { "$ref": "Reference" } @@ -5566,7 +5872,7 @@ "properties": { "canIpForward": { "type": "boolean", - "description": "Enables instances created based on this template to send packets with source IP addresses other than their own and receive packets with destination IP addresses other than their own. If these instances will be used as an IP gateway or it will be set as the next-hop in a Route resource, specify true. If unsure, leave this set to false. See the Enable IP forwarding for instances documentation for more information." + "description": "Enables instances created based on this template to send packets with source IP addresses other than their own and receive packets with destination IP addresses other than their own. If these instances will be used as an IP gateway or it will be set as the next-hop in a Route resource, specify true. If unsure, leave this set to false. See the Enable IP forwarding documentation for more information." }, "description": { "type": "string", @@ -5608,7 +5914,7 @@ }, "minCpuPlatform": { "type": "string", - "description": "Minimum cpu/platform to be used by this instance. The instance may be scheduled on the specified or later cpu/platform." + "description": "Minimum cpu/platform to be used by this instance. The instance may be scheduled on the specified or newer cpu/platform. Applicable values are the friendly names of CPU platforms, such as minCpuPlatform: \"Intel Haswell\" or minCpuPlatform: \"Intel Sandy Bridge\". For more information, read Specifying a Minimum CPU Platform." }, "networkInterfaces": { "type": "array", @@ -5698,11 +6004,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this instance template. The server defines this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] list of InstanceTemplate resources.", + "description": "A list of InstanceTemplate resources.", "items": { "$ref": "InstanceTemplate" } @@ -5718,7 +6024,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this instance template list. The server defines this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -5932,7 +6238,7 @@ "Interconnect": { "id": "Interconnect", "type": "object", - "description": "Protocol definitions for Mixer API to support Interconnect. Next available tag: 20", + "description": "Protocol definitions for Mixer API to support Interconnect. Next available tag: 23", "properties": { "adminEnabled": { "type": "boolean", @@ -5946,10 +6252,21 @@ "type": "string", "description": "[Output Only] Creation timestamp in RFC3339 text format." }, + "customerName": { + "type": "string", + "description": "Customer name, to put in the Letter of Authorization as the party authorized to request a crossconnect." + }, "description": { "type": "string", "description": "An optional description of this resource. Provide this property when you create the resource." }, + "expectedOutages": { + "type": "array", + "description": "[Output Only] List of outages expected for this Interconnect.", + "items": { + "$ref": "InterconnectOutageNotification" + } + }, "googleIpAddress": { "type": "string", "description": "[Output Only] IP address configured on the Google side of the Interconnect link. This can be used only for ping tests." @@ -6016,11 +6333,9 @@ "description": "[Output Only] The current status of whether or not this Interconnect is functional.", "enum": [ "OS_ACTIVE", - "OS_UNPROVISIONED", - "OS_UNSPECIFIED" + "OS_UNPROVISIONED" ], "enumDescriptions": [ - "", "", "" ] @@ -6125,11 +6440,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped InterconnectAttachment lists.", + "description": "A list of InterconnectAttachmentsScopedList resources.", "additionalProperties": { "$ref": "InterconnectAttachmentsScopedList", "description": "Name of the scope containing this set of interconnect attachments." @@ -6157,11 +6472,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of InterconnectAttachment resources.", + "description": "A list of InterconnectAttachment resources.", "items": { "$ref": "InterconnectAttachment" } @@ -6282,11 +6597,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Interconnect resources.", + "description": "A list of Interconnect resources.", "items": { "$ref": "Interconnect" } @@ -6315,6 +6630,32 @@ "type": "string", "description": "[Output Only] The postal address of the Point of Presence, each line in the address is separated by a newline character." }, + "availabilityZone": { + "type": "string", + "description": "Availability zone for this location. Within a city, maintenance will not be simultaneously scheduled in more than one availability zone. Example: \"zone1\" or \"zone2\"." + }, + "city": { + "type": "string", + "description": "City designator used by the Interconnect UI to locate this InterconnectLocation within the Continent. For example: \"Chicago, IL\", \"Amsterdam, Netherlands\"." + }, + "continent": { + "type": "string", + "description": "Continent for this location. Used by the location picker in the Interconnect UI.", + "enum": [ + "C_AFRICA", + "C_ASIA_PAC", + "C_EUROPE", + "C_NORTH_AMERICA", + "C_SOUTH_AMERICA" + ], + "enumDescriptions": [ + "", + "", + "", + "", + "" + ] + }, "creationTimestamp": { "type": "string", "description": "[Output Only] Creation timestamp in RFC3339 text format." @@ -6369,11 +6710,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of InterconnectLocation resources.", + "description": "A list of InterconnectLocation resources.", "items": { "$ref": "InterconnectLocation" } @@ -6421,6 +6762,120 @@ } } }, + "InterconnectOutageNotification": { + "id": "InterconnectOutageNotification", + "type": "object", + "description": "Description of a planned outage on this Interconnect. Next id: 9", + "properties": { + "affectedCircuits": { + "type": "array", + "description": "Iff issue_type is IT_PARTIAL_OUTAGE, a list of the Google-side circuit IDs that will be affected.", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "description": "Short user-visible description of the purpose of the outage." + }, + "endTime": { + "type": "string", + "format": "int64" + }, + "issueType": { + "type": "string", + "enum": [ + "IT_OUTAGE", + "IT_PARTIAL_OUTAGE" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "name": { + "type": "string", + "description": "Unique identifier for this outage notification." + }, + "source": { + "type": "string", + "enum": [ + "NSRC_GOOGLE" + ], + "enumDescriptions": [ + "" + ] + }, + "startTime": { + "type": "string", + "description": "Scheduled start and end times for the outage (milliseconds since Unix epoch).", + "format": "int64" + }, + "state": { + "type": "string", + "enum": [ + "NS_ACTIVE", + "NS_CANCELED" + ], + "enumDescriptions": [ + "", + "" + ] + } + } + }, + "InternalIpOwner": { + "id": "InternalIpOwner", + "type": "object", + "properties": { + "ipCidrRange": { + "type": "string", + "description": "IP CIDR range being owned." + }, + "owners": { + "type": "array", + "description": "URLs of the IP owners of the IP CIDR range.", + "items": { + "type": "string" + } + }, + "systemOwned": { + "type": "boolean", + "description": "Whether this IP CIDR range is reserved for system use." + } + } + }, + "IpOwnerList": { + "id": "IpOwnerList", + "type": "object", + "description": "Contains a list of IP owners.", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] Unique identifier for the resource; defined by the server." + }, + "items": { + "type": "array", + "description": "A list of InternalIpOwner resources.", + "items": { + "$ref": "InternalIpOwner" + } + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of resource. Always compute#ipOwnerList for lists of IP owners.", + "default": "compute#ipOwnerList" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, "License": { "id": "License", "type": "object", @@ -6428,7 +6883,7 @@ "properties": { "chargesUseFee": { "type": "boolean", - "description": "[Output Only] If true, the customer will be charged license fee for running software that contains this license on an instance." + "description": "[Output Only] Deprecated. This field no longer reflects whether a license charges a usage fee." }, "creationTimestamp": { "type": "string", @@ -6498,11 +6953,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of License resources.", + "description": "A list of License resources.", "items": { "$ref": "License" } @@ -6522,12 +6977,41 @@ "type": "object", "description": "Specifies what kind of log the caller must write", "properties": { + "cloudAudit": { + "$ref": "LogConfigCloudAuditOptions", + "description": "Cloud audit options." + }, "counter": { "$ref": "LogConfigCounterOptions", "description": "Counter options." } } }, + "LogConfigCloudAuditOptions": { + "id": "LogConfigCloudAuditOptions", + "type": "object", + "description": "Write a Cloud Audit log", + "properties": { + "authorizationLoggingOptions": { + "$ref": "AuthorizationLoggingOptions", + "description": "Information used by the Cloud Audit Logging pipeline." + }, + "logName": { + "type": "string", + "description": "The log_name to populate in the Cloud Audit Record.", + "enum": [ + "ADMIN_ACTIVITY", + "DATA_ACCESS", + "UNSPECIFIED_LOG_NAME" + ], + "enumDescriptions": [ + "", + "", + "" + ] + } + } + }, "LogConfigCounterOptions": { "id": "LogConfigCounterOptions", "type": "object", @@ -6615,11 +7099,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped machine type lists.", + "description": "A list of MachineTypesScopedList resources.", "additionalProperties": { "$ref": "MachineTypesScopedList", "description": "[Output Only] Name of the scope containing this set of machine types." @@ -6647,11 +7131,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Machine Type resources.", + "description": "A list of MachineType resources.", "items": { "$ref": "MachineType" } @@ -6824,6 +7308,10 @@ "$ref": "ManagedInstanceLastAttempt", "description": "[Output Only] Information about the last attempt to create or delete the instance." }, + "override": { + "$ref": "ManagedInstanceOverride", + "description": "[Output Only] Override defined for this instance." + }, "standbyMode": { "type": "string", "description": "[Output Only] Standby mode of the instance. This field is non-empty iff the instance is a standby.", @@ -6877,6 +7365,88 @@ } } }, + "ManagedInstanceOverride": { + "id": "ManagedInstanceOverride", + "type": "object", + "description": "Overrides of stateful properties for a given instance", + "properties": { + "disks": { + "type": "array", + "description": "Disk overrides defined for this instance", + "items": { + "$ref": "ManagedInstanceOverrideDiskOverride" + } + }, + "metadata": { + "type": "array", + "description": "Metadata overrides defined for this instance.", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Key for the metadata entry. Keys must conform to the following regexp: [a-zA-Z0-9-_]+, and be less than 128 bytes in length. This is reflected as part of a URL in the metadata server. Additionally, to avoid ambiguity, keys must not conflict with any other metadata keys for the project.", + "pattern": "[a-zA-Z0-9-_]{1,128}", + "annotations": { + "required": [ + "compute.instances.insert", + "compute.projects.setCommonInstanceMetadata" + ] + } + }, + "value": { + "type": "string", + "description": "Value for the metadata entry. These are free-form strings, and only have meaning as interpreted by the image running in the instance. The only restriction placed on values is that their size must be less than or equal to 262144 bytes (256 KiB).", + "annotations": { + "required": [ + "compute.instances.insert", + "compute.projects.setCommonInstanceMetadata" + ] + } + } + } + } + }, + "origin": { + "type": "string", + "description": "[Output Only] Indicates where does the override come from.", + "enum": [ + "AUTO_GENERATED", + "USER_GENERATED" + ], + "enumDescriptions": [ + "", + "" + ] + } + } + }, + "ManagedInstanceOverrideDiskOverride": { + "id": "ManagedInstanceOverrideDiskOverride", + "type": "object", + "properties": { + "deviceName": { + "type": "string", + "description": "The name of the device on the VM" + }, + "mode": { + "type": "string", + "description": "The mode in which to attach this disk, either READ_WRITE or READ_ONLY. If not specified, the default is to attach the disk in READ_WRITE mode.", + "enum": [ + "READ_ONLY", + "READ_WRITE" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "source": { + "type": "string", + "description": "The disk that is/will be mounted" + } + } + }, "ManagedInstanceVersion": { "id": "ManagedInstanceVersion", "type": "object", @@ -6920,7 +7490,7 @@ }, "value": { "type": "string", - "description": "Value for the metadata entry. These are free-form strings, and only have meaning as interpreted by the image running in the instance. The only restriction placed on values is that their size must be less than or equal to 32768 bytes.", + "description": "Value for the metadata entry. These are free-form strings, and only have meaning as interpreted by the image running in the instance. The only restriction placed on values is that their size must be less than or equal to 262144 bytes (256 KiB).", "annotations": { "required": [ "compute.instances.insert", @@ -7032,6 +7602,10 @@ "$ref": "NetworkPeering" } }, + "routingConfig": { + "$ref": "NetworkRoutingConfig", + "description": "The network-level routing configuration for this network. Used by Cloud Router to determine what type of network-wide routing behavior to enforce." + }, "selfLink": { "type": "string", "description": "[Output Only] Server-defined URL for the resource." @@ -7064,6 +7638,11 @@ "$ref": "AliasIpRange" } }, + "fingerprint": { + "type": "string", + "description": "Fingerprint hash of contents stored in this network interface. This field will be ignored when inserting an Instance or adding a NetworkInterface. An up-to-date fingerprint must be provided in order to update the NetworkInterface.", + "format": "byte" + }, "kind": { "type": "string", "description": "[Output Only] Type of the resource. Always compute#networkInterface for network interfaces.", @@ -7094,11 +7673,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Network resources.", + "description": "A list of Network resources.", "items": { "$ref": "Network" } @@ -7153,6 +7732,25 @@ } } }, + "NetworkRoutingConfig": { + "id": "NetworkRoutingConfig", + "type": "object", + "description": "A routing configuration attached to a network resource. The message includes the list of routers associated with the network, and a flag indicating the type of routing behavior to enforce network-wide.", + "properties": { + "routingMode": { + "type": "string", + "description": "The network-wide routing mode to use. If set to REGIONAL, this network's cloud routers will only advertise routes with subnetworks of this network in the same region as the router. If set to GLOBAL, this network's cloud routers will advertise routes with all subnetworks of this network, across regions.", + "enum": [ + "GLOBAL", + "REGIONAL" + ], + "enumDescriptions": [ + "", + "" + ] + } + } + }, "NetworksAddPeeringRequest": { "id": "NetworksAddPeeringRequest", "type": "object", @@ -7574,6 +8172,19 @@ } } }, + "PerInstanceConfig": { + "id": "PerInstanceConfig", + "type": "object", + "properties": { + "instance": { + "type": "string", + "description": "The URL of the instance. Serves as a merge key during UpdatePerInstanceConfigs operation." + }, + "override": { + "$ref": "ManagedInstanceOverride" + } + } + }, "Policy": { "id": "Policy", "type": "object", @@ -7588,7 +8199,7 @@ }, "bindings": { "type": "array", - "description": "Associates a list of `members` to a `role`. Multiple `bindings` must not be specified for the same `role`. `bindings` with no members will result in an error.", + "description": "Associates a list of `members` to a `role`. `bindings` with no members will result in an error.", "items": { "$ref": "Binding" } @@ -7675,7 +8286,7 @@ }, "xpnProjectStatus": { "type": "string", - "description": "[Output Only] The role this project has in a Cross Project Network (XPN) configuration. Currently only HOST projects are differentiated.", + "description": "[Output Only] The role this project has in a shared VPC configuration. Currently only HOST projects are differentiated.", "enum": [ "HOST", "UNSPECIFIED_XPN_PROJECT_STATUS" @@ -7693,7 +8304,7 @@ "properties": { "xpnResource": { "$ref": "XpnResourceId", - "description": "XPN resource ID." + "description": "Service resource (a.k.a service project) ID." } } }, @@ -7703,7 +8314,7 @@ "properties": { "xpnResource": { "$ref": "XpnResourceId", - "description": "XPN resource ID." + "description": "Service resource (a.k.a service project) ID." } } }, @@ -7713,7 +8324,7 @@ "properties": { "kind": { "type": "string", - "description": "[Output Only] Type of resource. Always compute#projectsGetXpnResources for lists of XPN resources.", + "description": "[Output Only] Type of resource. Always compute#projectsGetXpnResources for lists of service resources (a.k.a service projects)", "default": "compute#projectsGetXpnResources" }, "nextPageToken": { @@ -7722,7 +8333,7 @@ }, "resources": { "type": "array", - "description": "XPN resources attached to this project as their XPN host.", + "description": "Serive resources (a.k.a service projects) attached to this project as their shared VPC host.", "items": { "$ref": "XpnResourceId" } @@ -7735,7 +8346,7 @@ "properties": { "organization": { "type": "string", - "description": "Optional organization ID managed by Cloud Resource Manager, for which to list XPN host projects. If not specified, the organization will be inferred from the project." + "description": "Optional organization ID managed by Cloud Resource Manager, for which to list shared VPC host projects. If not specified, the organization will be inferred from the project." } } }, @@ -7763,6 +8374,7 @@ "type": "string", "description": "[Output Only] Name of the quota metric.", "enum": [ + "AMD_S9300_GPUS", "AUTOSCALERS", "BACKEND_BUCKETS", "BACKEND_SERVICES", @@ -7782,11 +8394,15 @@ "LOCAL_SSD_TOTAL_GB", "NETWORKS", "NVIDIA_K80_GPUS", + "NVIDIA_P100_GPUS", "PREEMPTIBLE_CPUS", + "PREEMPTIBLE_LOCAL_SSD_GB", "REGIONAL_AUTOSCALERS", "REGIONAL_INSTANCE_GROUP_MANAGERS", "ROUTERS", "ROUTES", + "SECURITY_POLICIES", + "SECURITY_POLICY_RULES", "SNAPSHOTS", "SSD_TOTAL_GB", "SSL_CERTIFICATES", @@ -7840,6 +8456,11 @@ "", "", "", + "", + "", + "", + "", + "", "" ] }, @@ -7944,11 +8565,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of autoscalers.", + "description": "A list of Autoscaler resources.", "items": { "$ref": "Autoscaler" } @@ -7960,7 +8581,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -7974,11 +8595,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Disk Type resources.", + "description": "A list of DiskType resources.", "items": { "$ref": "DiskType" } @@ -8016,7 +8637,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -8036,7 +8657,21 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, + "RegionInstanceGroupManagerDeleteInstanceConfigReq": { + "id": "RegionInstanceGroupManagerDeleteInstanceConfigReq", + "type": "object", + "description": "RegionInstanceGroupManagers.deletePerInstanceConfigs", + "properties": { + "instances": { + "type": "array", + "description": "The list of instances for which we want to delete per-instance configs on this managed instance group.", + "items": { + "type": "string" + } } } }, @@ -8047,11 +8682,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of managed instance groups.", + "description": "A list of InstanceGroupManager resources.", "items": { "$ref": "InstanceGroupManager" } @@ -8063,11 +8698,25 @@ }, "nextPageToken": { "type": "string", - "description": "[Output only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", - "description": "[Output only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, + "RegionInstanceGroupManagerUpdateInstanceConfigReq": { + "id": "RegionInstanceGroupManagerUpdateInstanceConfigReq", + "type": "object", + "description": "RegionInstanceGroupManagers.updatePerInstanceConfigs", + "properties": { + "perInstanceConfigs": { + "type": "array", + "description": "The list of per-instance configs to insert or patch on this managed instance group.", + "items": { + "$ref": "PerInstanceConfig" + } } } }, @@ -8084,6 +8733,52 @@ } } }, + "RegionInstanceGroupManagersApplyUpdatesRequest": { + "id": "RegionInstanceGroupManagersApplyUpdatesRequest", + "type": "object", + "description": "InstanceGroupManagers.applyUpdatesToInstances", + "properties": { + "instances": { + "type": "array", + "description": "The list of instances for which we want to apply changes on this managed instance group.", + "items": { + "type": "string" + } + }, + "maximalAction": { + "type": "string", + "description": "The maximal action that should be perfomed on the instances. By default REPLACE.", + "enum": [ + "NONE", + "REFRESH", + "REPLACE", + "RESTART" + ], + "enumDescriptions": [ + "", + "", + "", + "" + ] + }, + "minimalAction": { + "type": "string", + "description": "The minimal action that should be perfomed on the instances. By default NONE.", + "enum": [ + "NONE", + "REFRESH", + "REPLACE", + "RESTART" + ], + "enumDescriptions": [ + "", + "", + "", + "" + ] + } + } + }, "RegionInstanceGroupManagersDeleteInstancesRequest": { "id": "RegionInstanceGroupManagersDeleteInstancesRequest", "type": "object", @@ -8097,6 +8792,23 @@ } } }, + "RegionInstanceGroupManagersListInstanceConfigsResp": { + "id": "RegionInstanceGroupManagersListInstanceConfigsResp", + "type": "object", + "properties": { + "items": { + "type": "array", + "description": "[Output Only] The list of PerInstanceConfig.", + "items": { + "$ref": "PerInstanceConfig" + } + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + } + } + }, "RegionInstanceGroupManagersListInstancesResponse": { "id": "RegionInstanceGroupManagersListInstancesResponse", "type": "object", @@ -8173,11 +8885,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of instances and any named ports that are assigned to those instances.", + "description": "A list of InstanceWithNamedPorts resources.", "items": { "$ref": "InstanceWithNamedPorts" } @@ -8193,7 +8905,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -8245,11 +8957,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Region resources.", + "description": "A list of Region resources.", "items": { "$ref": "Region" } @@ -8294,12 +9006,12 @@ "properties": { "amount": { "type": "string", - "description": "The amount of the resource purchased (in a type-dependent unit, such as bytes).", + "description": "The amount of the resource purchased (in a type-dependent unit, such as bytes). For vCPUs, this can just be an integer. For memory, this must be provided in MB. Memory must be a multiple of 256 MB, with up to 6.5GB of memory per every vCPU.", "format": "int64" }, "type": { "type": "string", - "description": "Type of resource for which this commitment applies.", + "description": "Type of resource for which this commitment applies. Possible values are VCPU and MEMORY", "enum": [ "LOCAL_SSD", "MEMORY", @@ -8328,7 +9040,7 @@ "Route": { "id": "Route", "type": "object", - "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving a instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, an instance gateway, or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.", + "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving an instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, an instance gateway, or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.", "properties": { "creationTimestamp": { "type": "string", @@ -8507,11 +9219,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Route resources.", + "description": "A list of Route resources.", "items": { "$ref": "Route" } @@ -8623,11 +9335,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped router lists.", + "description": "A list of Router resources.", "additionalProperties": { "$ref": "RoutersScopedList", "description": "Name of the scope containing this set of routers." @@ -8786,7 +9498,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -9140,11 +9852,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of SecurityPolicy resources.", + "description": "A list of SecurityPolicy resources.", "items": { "$ref": "SecurityPolicy" } @@ -9218,7 +9930,7 @@ "SecurityPolicyRule": { "id": "SecurityPolicyRule", "type": "object", - "description": "Represents a rule that describes one or more match conditions along with the action to be taken when traffic matches this condition (allow or deny)", + "description": "Represents a rule that describes one or more match conditions along with the action to be taken when traffic matches this condition (allow or deny).", "properties": { "action": { "type": "string", @@ -9243,15 +9955,15 @@ }, "priority": { "type": "integer", - "description": "An integer indicating the priority of a rule in the list. Rules are evaluated in the increasing order of priority.", - "format": "uint32" + "description": "An integer indicating the priority of a rule in the list. The priority must be a positive value between 0 and 2147483647. Rules are evaluated in the increasing order of priority.", + "format": "int32" } } }, "SecurityPolicyRuleMatcher": { "id": "SecurityPolicyRuleMatcher", "type": "object", - "description": "Represents a match condition that incoming traffic is evaluated against. Exactly one of the fields must be set.", + "description": "Represents a match condition that incoming traffic is evaluated against. Exactly one field must be specified.", "properties": { "srcIpRanges": { "type": "array", @@ -9259,6 +9971,13 @@ "items": { "type": "string" } + }, + "srcRegionCodes": { + "type": "array", + "description": "Match by country or region code.", + "items": { + "type": "string" + } } } }, @@ -9366,6 +10085,14 @@ "type": "string" } }, + "licenseCodes": { + "type": "array", + "description": "Integer license codes indicating which licenses are attached to this snapshot.", + "items": { + "type": "string", + "format": "int64" + } + }, "licenses": { "type": "array", "description": "[Output Only] A list of public visible licenses that apply to this snapshot. This can be because the original image had licenses attached (such as a Windows image).", @@ -9442,11 +10169,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Snapshot resources.", + "description": "A list of Snapshot resources.", "items": { "$ref": "Snapshot" } @@ -9515,7 +10242,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -9544,17 +10271,26 @@ "type": "object", "description": "A Subnetwork resource.", "properties": { + "allowSubnetCidrRoutesOverlap": { + "type": "boolean", + "description": "Whether this subnetwork can conflict with static routes. Setting this to true allows this subnetwork's primary and secondary ranges to conflict with routes that have already been configured on the corresponding network. Static routes will take precedence over the subnetwork route if the route prefix length is at least as large as the subnetwork prefix length.\n\nAlso, packets destined to IPs within subnetwork may contain private/sensitive data and are prevented from leaving the virtual network. Setting this field to true will disable this feature.\n\nThe default value is false and applies to all existing subnetworks and automatically created subnetworks.\n\nThis field cannot be set to true at resource creation time." + }, "creationTimestamp": { "type": "string", "description": "[Output Only] Creation timestamp in RFC3339 text format." }, "description": { "type": "string", - "description": "An optional description of this resource. Provide this property when you create the resource." + "description": "An optional description of this resource. Provide this property when you create the resource. This field can be set only at resource creation time." + }, + "fingerprint": { + "type": "string", + "description": "Fingerprint of this resource. A hash of the contents stored in this object. This field is used in optimistic locking. This field will be ignored when inserting a Subnetwork. An up-to-date fingerprint must be provided in order to update the Subnetwork.", + "format": "byte" }, "gatewayAddress": { "type": "string", - "description": "[Output Only] The gateway address for default routes to reach destination addresses outside this subnetwork." + "description": "[Output Only] The gateway address for default routes to reach destination addresses outside this subnetwork. This field can be set only at resource creation time." }, "id": { "type": "string", @@ -9563,7 +10299,7 @@ }, "ipCidrRange": { "type": "string", - "description": "The range of internal addresses that are owned by this subnetwork. Provide this property when you create the subnetwork. For example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and non-overlapping within a network. Only IPv4 is supported." + "description": "The range of internal addresses that are owned by this subnetwork. Provide this property when you create the subnetwork. For example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and non-overlapping within a network. Only IPv4 is supported. This field can be set only at resource creation time." }, "kind": { "type": "string", @@ -9577,15 +10313,15 @@ }, "network": { "type": "string", - "description": "The URL of the network to which this subnetwork belongs, provided by the client when initially creating the subnetwork. Only networks that are in the distributed mode can have subnetworks." + "description": "The URL of the network to which this subnetwork belongs, provided by the client when initially creating the subnetwork. Only networks that are in the distributed mode can have subnetworks. This field can be set only at resource creation time." }, "privateIpGoogleAccess": { "type": "boolean", - "description": "Whether the VMs in this subnet can access Google services without assigned external IP addresses." + "description": "Whether the VMs in this subnet can access Google services without assigned external IP addresses. This field can be both set at resource creation time and updated using setPrivateIpGoogleAccess." }, "region": { "type": "string", - "description": "URL of the region where the Subnetwork resides." + "description": "URL of the region where the Subnetwork resides. This field can be set only at resource creation time." }, "secondaryIpRanges": { "type": "array", @@ -9606,11 +10342,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output] A map of scoped Subnetwork lists.", + "description": "A list of SubnetworksScopedList resources.", "additionalProperties": { "$ref": "SubnetworksScopedList", "description": "Name of the scope containing this set of Subnetworks." @@ -9638,11 +10374,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "The Subnetwork resources.", + "description": "A list of Subnetwork resources.", "items": { "$ref": "Subnetwork" } @@ -9877,7 +10613,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -9901,6 +10637,26 @@ } } }, + "TargetHttpsProxiesSetQuicOverrideRequest": { + "id": "TargetHttpsProxiesSetQuicOverrideRequest", + "type": "object", + "properties": { + "quicOverride": { + "type": "string", + "description": "QUIC policy for the TargetHttpsProxy resource.", + "enum": [ + "DISABLE", + "ENABLE", + "NONE" + ], + "enumDescriptions": [ + "", + "", + "" + ] + } + } + }, "TargetHttpsProxiesSetSslCertificatesRequest": { "id": "TargetHttpsProxiesSetSslCertificatesRequest", "type": "object", @@ -9946,6 +10702,20 @@ "description": "Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.", "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?" }, + "quicOverride": { + "type": "string", + "description": "Specifies the QUIC override policy for this TargetHttpsProxy resource. This determines whether the load balancer will attempt to negotiate QUIC with clients or not. Can specify one of NONE, ENABLE, or DISABLE. Specify ENABLE to always enable QUIC, Enables QUIC when set to ENABLE, and disables QUIC when set to DISABLE. If NONE is specified, uses the QUIC policy with no user overrides, which is equivalent to DISABLE. Not specifying this field is equivalent to specifying NONE.", + "enum": [ + "DISABLE", + "ENABLE", + "NONE" + ], + "enumDescriptions": [ + "", + "", + "" + ] + }, "selfLink": { "type": "string", "description": "[Output Only] Server-defined URL for the resource." @@ -9970,7 +10740,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -10056,7 +10826,7 @@ }, "items": { "type": "object", - "description": "A map of scoped target instance lists.", + "description": "A list of TargetInstance resources.", "additionalProperties": { "$ref": "TargetInstancesScopedList", "description": "Name of the scope containing this set of target instances." @@ -10084,7 +10854,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -10275,11 +11045,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped target pool lists.", + "description": "A list of TargetPool resources.", "additionalProperties": { "$ref": "TargetPoolsScopedList", "description": "Name of the scope containing this set of target pools." @@ -10324,7 +11094,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -10600,7 +11370,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -10709,7 +11479,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -10821,11 +11591,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped target vpn gateway lists.", + "description": "A list of TargetVpnGateway resources.", "additionalProperties": { "$ref": "TargetVpnGatewaysScopedList", "description": "[Output Only] Name of the scope containing this set of target VPN gateways." @@ -10853,11 +11623,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of TargetVpnGateway resources.", + "description": "A list of TargetVpnGateway resources.", "items": { "$ref": "TargetVpnGateway" } @@ -11097,7 +11867,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Set by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -11354,11 +12124,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped vpn tunnel lists.", + "description": "A list of VpnTunnelsScopedList resources.", "additionalProperties": { "$ref": "VpnTunnelsScopedList", "description": "Name of the scope containing this set of vpn tunnels." @@ -11386,11 +12156,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of VpnTunnel resources.", + "description": "A list of VpnTunnel resources.", "items": { "$ref": "VpnTunnel" } @@ -11498,18 +12268,18 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of XPN host project URLs.", + "description": "[Output Only] A list of shared VPC host project URLs.", "items": { "$ref": "Project" } }, "kind": { "type": "string", - "description": "[Output Only] Type of resource. Always compute#xpnHostList for lists of XPN hosts.", + "description": "[Output Only] Type of resource. Always compute#xpnHostList for lists of shared VPC hosts.", "default": "compute#xpnHostList" }, "nextPageToken": { @@ -11525,15 +12295,15 @@ "XpnResourceId": { "id": "XpnResourceId", "type": "object", - "description": "XpnResourceId", + "description": "Service resource (a.k.a service project) ID.", "properties": { "id": { "type": "string", - "description": "The ID of the XPN resource. In the case of projects, this field matches the project's name, not the canonical ID." + "description": "The ID of the service resource. In the case of projects, this field matches the project ID (e.g., my-project), not the project number (e.g., 12345678)." }, "type": { "type": "string", - "description": "The type of the XPN resource.", + "description": "The type of the service resource.", "enum": [ "PROJECT", "XPN_RESOURCE_TYPE_UNSPECIFIED" @@ -11616,7 +12386,7 @@ }, "items": { "type": "array", - "description": "[Output Only] A list of Zone resources.", + "description": "A list of Zone resources.", "items": { "$ref": "Zone" } @@ -11666,7 +12436,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11757,7 +12527,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11818,7 +12588,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11888,7 +12658,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -11969,7 +12739,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -11996,7 +12766,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12049,7 +12819,7 @@ "id": "compute.addresses.setLabels", "path": "{project}/regions/{region}/addresses/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on an Address. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on an Address. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -12067,7 +12837,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "resource": { @@ -12151,7 +12921,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12214,7 +12984,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -12295,7 +13065,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -12329,7 +13099,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12382,7 +13152,7 @@ "id": "compute.autoscalers.patch", "path": "{project}/zones/{zone}/autoscalers", "httpMethod": "PATCH", - "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "autoscaler": { "type": "string", @@ -12399,7 +13169,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -12492,7 +13262,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -12543,7 +13313,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -12584,7 +13354,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -12627,7 +13397,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -12727,7 +13497,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -12753,7 +13523,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12798,7 +13568,7 @@ "id": "compute.backendBuckets.patch", "path": "{project}/global/backendBuckets/{backendBucket}", "httpMethod": "PATCH", - "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports patch semantics.", + "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "backendBucket": { "type": "string", @@ -12816,7 +13586,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -12931,7 +13701,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -12975,7 +13745,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -13002,7 +13772,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13065,7 +13835,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -13108,7 +13878,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -13210,7 +13980,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -13236,7 +14006,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13281,7 +14051,7 @@ "id": "compute.backendServices.patch", "path": "{project}/global/backendServices/{backendService}", "httpMethod": "PATCH", - "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "backendService": { "type": "string", @@ -13299,7 +14069,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -13340,7 +14110,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -13418,7 +14188,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -13490,7 +14260,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13581,7 +14351,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13642,7 +14412,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13709,7 +14479,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -13757,7 +14527,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -13880,7 +14650,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "sourceImage": { @@ -13919,7 +14689,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13990,7 +14760,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -14065,7 +14835,7 @@ "id": "compute.disks.setLabels", "path": "{project}/zones/{zone}/disks/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on a disk. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on a disk. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -14076,7 +14846,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "resource": { @@ -14181,7 +14951,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14246,7 +15016,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14272,7 +15042,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14317,7 +15087,7 @@ "id": "compute.firewalls.patch", "path": "{project}/global/firewalls/{firewall}", "httpMethod": "PATCH", - "description": "Updates the specified firewall rule with the data included in the request. This method supports patch semantics.", + "description": "Updates the specified firewall rule with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "firewall": { "type": "string", @@ -14335,7 +15105,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14414,7 +15184,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14445,7 +15215,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14515,7 +15285,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14596,7 +15366,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14623,7 +15393,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14676,7 +15446,7 @@ "id": "compute.forwardingRules.patch", "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}", "httpMethod": "PATCH", - "description": "Updates the specified forwarding rule with the data included in the request. This method supports patch semantics. Currently it only allow to patch network_tier field.", + "description": "Updates the specified forwarding rule with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules. Currently, you can only patch the network_tier field.", "parameters": { "forwardingRule": { "type": "string", @@ -14701,7 +15471,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14726,7 +15496,7 @@ "id": "compute.forwardingRules.setLabels", "path": "{project}/regions/{region}/forwardingRules/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -14744,7 +15514,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "resource": { @@ -14800,7 +15570,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14891,7 +15661,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14956,7 +15726,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -14982,7 +15752,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15027,7 +15797,7 @@ "id": "compute.globalAddresses.setLabels", "path": "{project}/global/addresses/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on a GlobalAddress. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on a GlobalAddress. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -15122,7 +15892,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -15187,7 +15957,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -15213,7 +15983,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15258,7 +16028,7 @@ "id": "compute.globalForwardingRules.patch", "path": "{project}/global/forwardingRules/{forwardingRule}", "httpMethod": "PATCH", - "description": "Updates the specified forwarding rule with the data included in the request. This method supports patch semantics. Currently it only allow to patch network_tier field.", + "description": "Updates the specified forwarding rule with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules. Currently, you can only patch the network_tier field.", "parameters": { "forwardingRule": { "type": "string", @@ -15276,7 +16046,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -15300,7 +16070,7 @@ "id": "compute.globalForwardingRules.setLabels", "path": "{project}/global/forwardingRules/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -15354,7 +16124,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -15422,7 +16192,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15535,7 +16305,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15602,7 +16372,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -15667,7 +16437,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -15693,7 +16463,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15738,7 +16508,7 @@ "id": "compute.healthChecks.patch", "path": "{project}/global/healthChecks/{healthCheck}", "httpMethod": "PATCH", - "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "healthCheck": { "type": "string", @@ -15756,7 +16526,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -15835,7 +16605,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -15866,7 +16636,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15957,7 +16727,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16018,7 +16788,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16081,7 +16851,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -16204,7 +16974,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -16238,7 +17008,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16402,7 +17172,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -16467,7 +17237,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -16493,7 +17263,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16538,7 +17308,7 @@ "id": "compute.httpHealthChecks.patch", "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", "httpMethod": "PATCH", - "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "httpHealthCheck": { "type": "string", @@ -16556,7 +17326,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -16635,7 +17405,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -16680,7 +17450,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -16745,7 +17515,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -16771,7 +17541,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16816,7 +17586,7 @@ "id": "compute.httpsHealthChecks.patch", "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", "httpMethod": "PATCH", - "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "httpsHealthCheck": { "type": "string", @@ -16834,7 +17604,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -16913,7 +17683,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -16958,7 +17728,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -16996,7 +17766,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", "location": "query" } }, @@ -17137,7 +17907,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -17166,7 +17936,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17247,7 +18017,7 @@ "id": "compute.images.setLabels", "path": "{project}/global/images/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on an image. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on an image. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -17324,7 +18094,7 @@ "id": "compute.instanceGroupManagers.abandonInstances", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", "httpMethod": "POST", - "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -17341,7 +18111,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -17375,7 +18145,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17416,6 +18186,48 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "applyUpdatesToInstances": { + "id": "compute.instanceGroupManagers.applyUpdatesToInstances", + "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances", + "httpMethod": "POST", + "description": "Apply changes to selected instances on the managed instance group. This method can be used to apply new overrides and/or new versions.", + "parameters": { + "instanceGroupManager": { + "type": "string", + "description": "The name of the managed instance group, should conform to RFC1035.", + "required": true, + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "zone": { + "type": "string", + "description": "The name of the zone where the managed instance group is located. Should conform to RFC1035.", + "required": true, + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "instanceGroupManager" + ], + "request": { + "$ref": "InstanceGroupManagersApplyUpdatesRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "delete": { "id": "compute.instanceGroupManagers.delete", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", @@ -17437,7 +18249,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -17464,7 +18276,7 @@ "id": "compute.instanceGroupManagers.deleteInstances", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", "httpMethod": "POST", - "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -17481,7 +18293,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -17507,6 +18319,48 @@ "https://www.googleapis.com/auth/compute" ] }, + "deletePerInstanceConfigs": { + "id": "compute.instanceGroupManagers.deletePerInstanceConfigs", + "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs", + "httpMethod": "POST", + "description": "Delete selected per-instance configs for the managed instance group.", + "parameters": { + "instanceGroupManager": { + "type": "string", + "description": "The name of the managed instance group. It should conform to RFC1035.", + "required": true, + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "zone": { + "type": "string", + "description": "The name of the zone where the managed instance group is located. It should conform to RFC1035.", + "required": true, + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "instanceGroupManager" + ], + "request": { + "$ref": "InstanceGroupManagersDeletePerInstanceConfigsReq" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "get": { "id": "compute.instanceGroupManagers.get", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", @@ -17551,7 +18405,7 @@ "id": "compute.instanceGroupManagers.insert", "path": "{project}/zones/{zone}/instanceGroupManagers", "httpMethod": "POST", - "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group.", + "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group. Please contact Cloud Support if you need an increase in this limit.", "parameters": { "project": { "type": "string", @@ -17562,7 +18416,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -17595,7 +18449,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17702,11 +18556,74 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "listPerInstanceConfigs": { + "id": "compute.instanceGroupManagers.listPerInstanceConfigs", + "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs", + "httpMethod": "POST", + "description": "Lists all of the per-instance configs defined for the managed instance group.", + "parameters": { + "filter": { + "type": "string", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" + }, + "instanceGroupManager": { + "type": "string", + "description": "The name of the managed instance group. It should conform to RFC1035.", + "required": true, + "location": "path" + }, + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "orderBy": { + "type": "string", + "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "zone": { + "type": "string", + "description": "The name of the zone where the managed instance group is located. It should conform to RFC1035.", + "required": true, + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "instanceGroupManager" + ], + "response": { + "$ref": "InstanceGroupManagersListPerInstanceConfigsResp" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, "patch": { "id": "compute.instanceGroupManagers.patch", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", "httpMethod": "PATCH", - "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listManagedInstances method. This method supports patch semantics.", + "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listManagedInstances method. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "instanceGroupManager": { "type": "string", @@ -17723,7 +18640,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -17754,7 +18671,7 @@ "id": "compute.instanceGroupManagers.recreateInstances", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", "httpMethod": "POST", - "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -17771,7 +18688,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -17801,7 +18718,7 @@ "id": "compute.instanceGroupManagers.resize", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize", "httpMethod": "POST", - "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", "parameters": { "instanceGroupManager": { "type": "string", @@ -17818,7 +18735,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "size": { @@ -17853,7 +18770,7 @@ "id": "compute.instanceGroupManagers.resizeAdvanced", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced", "httpMethod": "POST", - "description": "Resizes the managed instance group with advanced configuration options like disabling creation retries. This is an extended version of the resize method.\n\nIf you increase the size of the instance group, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating, creatingWithoutRetries, or deleting actions with the get or listmanagedinstances method.", + "description": "Resizes the managed instance group with advanced configuration options like disabling creation retries. This is an extended version of the resize method.\n\nIf you increase the size of the instance group, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating, creatingWithoutRetries, or deleting actions with the get or listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", "parameters": { "instanceGroupManager": { "type": "string", @@ -17870,7 +18787,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -17917,7 +18834,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -17964,7 +18881,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -18011,7 +18928,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -18054,43 +18971,90 @@ "type": "string", "description": "Name of the resource for this request.", "required": true, - "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "zone": { + "type": "string", + "description": "The name of the zone for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "resource" + ], + "request": { + "$ref": "TestPermissionsRequest" + }, + "response": { + "$ref": "TestPermissionsResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "update": { + "id": "compute.instanceGroupManagers.update", + "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", + "httpMethod": "PUT", + "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listManagedInstances method.", + "parameters": { + "instanceGroupManager": { + "type": "string", + "description": "The name of the instance group manager.", + "required": true, + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", - "description": "The name of the zone for this request.", + "description": "The name of the zone where you want to create the managed instance group.", "required": true, - "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" } }, "parameterOrder": [ "project", "zone", - "resource" + "instanceGroupManager" ], "request": { - "$ref": "TestPermissionsRequest" + "$ref": "InstanceGroupManager" }, "response": { - "$ref": "TestPermissionsResponse" + "$ref": "Operation" }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute", - "https://www.googleapis.com/auth/compute.readonly" + "https://www.googleapis.com/auth/compute" ] }, - "update": { - "id": "compute.instanceGroupManagers.update", - "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", - "httpMethod": "PUT", - "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listManagedInstances method.", + "updatePerInstanceConfigs": { + "id": "compute.instanceGroupManagers.updatePerInstanceConfigs", + "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs", + "httpMethod": "POST", + "description": "Insert or patch (for the ones that already exist) per-instance configs for the managed instance group. perInstanceConfig.instance serves as a key used to distinguish whether to perform insert or patch.", "parameters": { "instanceGroupManager": { "type": "string", - "description": "The name of the instance group manager.", + "description": "The name of the managed instance group. It should conform to RFC1035.", "required": true, "location": "path" }, @@ -18108,7 +19072,7 @@ }, "zone": { "type": "string", - "description": "The name of the zone where you want to create the managed instance group.", + "description": "The name of the zone where the managed instance group is located. It should conform to RFC1035.", "required": true, "location": "path" } @@ -18119,7 +19083,7 @@ "instanceGroupManager" ], "request": { - "$ref": "InstanceGroupManager" + "$ref": "InstanceGroupManagersUpdatePerInstanceConfigsReq" }, "response": { "$ref": "Operation" @@ -18154,7 +19118,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -18188,7 +19152,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18250,7 +19214,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -18328,7 +19292,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -18361,7 +19325,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18417,7 +19381,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "instanceGroup": { @@ -18479,7 +19443,7 @@ "id": "compute.instanceGroups.removeInstances", "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances", "httpMethod": "POST", - "description": "Removes one or more instances from the specified instance group, but does not delete those instances.", + "description": "Removes one or more instances from the specified instance group, but does not delete those instances.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration before the VM instance is removed or deleted.", "parameters": { "instanceGroup": { "type": "string", @@ -18496,7 +19460,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -18543,7 +19507,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -18640,7 +19604,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -18705,7 +19669,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -18731,7 +19695,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18841,7 +19805,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -18877,7 +19841,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18922,7 +19886,7 @@ "id": "compute.instances.attachDisk", "path": "{project}/zones/{zone}/instances/{instance}/attachDisk", "httpMethod": "POST", - "description": "Attaches a Disk resource to an instance.", + "description": "Attaches an existing Disk resource to an instance. You must first create the disk before you can attach it. It is not possible to create and attach a disk at the same time. For more information, read Adding a persistent disk to your instance.", "parameters": { "forceAttach": { "type": "boolean", @@ -18945,7 +19909,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -18994,7 +19958,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19052,7 +20016,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19106,7 +20070,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19173,6 +20137,53 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "getGuestAttributes": { + "id": "compute.instances.getGuestAttributes", + "path": "{project}/zones/{zone}/instances/{instance}/getGuestAttributes", + "httpMethod": "GET", + "description": "Returns the specified guest attributes entry.", + "parameters": { + "instance": { + "type": "string", + "description": "Name of the instance scoping this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "variableKey": { + "type": "string", + "description": "Specifies the key for the guest attributes entry.", + "location": "query" + }, + "zone": { + "type": "string", + "description": "The name of the zone for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "instance" + ], + "response": { + "$ref": "GuestAttributes" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, "getIamPolicy": { "id": "compute.instances.getIamPolicy", "path": "{project}/zones/{zone}/instances/{resource}/getIamPolicy", @@ -19287,7 +20298,12 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, + "sourceInstanceTemplate": { + "type": "string", + "description": "Specifies instance template to create the instance.\n\nThis field is optional. It can be a full or partial URL. For example, the following are all valid URLs to an instance template: \n- https://www.googleapis.com/compute/v1/projects/project/global/global/instanceTemplates/instanceTemplate \n- projects/project/global/global/instanceTemplates/instanceTemplate \n- global/instancesTemplates/instanceTemplate", "location": "query" }, "zone": { @@ -19321,7 +20337,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -19378,7 +20394,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "instance": { @@ -19457,7 +20473,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19516,7 +20532,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19590,7 +20606,7 @@ "id": "compute.instances.setLabels", "path": "{project}/zones/{zone}/instances/{instance}/setLabels", "httpMethod": "POST", - "description": "Sets labels on an instance. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets labels on an instance. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "instance": { "type": "string", @@ -19608,7 +20624,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19657,7 +20673,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19706,7 +20722,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19755,7 +20771,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19786,7 +20802,7 @@ "id": "compute.instances.setMinCpuPlatform", "path": "{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform", "httpMethod": "POST", - "description": "Changes the minimum cpu/platform that this instance should be started as. This is called on a stopped instance.", + "description": "Changes the minimum CPU platform that this instance should use. This method can only be called on a stopped instance. For more information, read Specifying a Minimum CPU Platform.", "parameters": { "instance": { "type": "string", @@ -19804,7 +20820,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19853,7 +20869,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19902,7 +20918,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -19951,7 +20967,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -20041,7 +21057,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -20087,7 +21103,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -20141,7 +21157,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -20192,7 +21208,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -20265,7 +21281,7 @@ "id": "compute.instances.updateAccessConfig", "path": "{project}/zones/{zone}/instances/{instance}/updateAccessConfig", "httpMethod": "POST", - "description": "Updates the specified access config from an instance's network interface with the data included in the request.", + "description": "Updates the specified access config from an instance's network interface with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "instance": { "type": "string", @@ -20289,7 +21305,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -20316,6 +21332,62 @@ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/compute" ] + }, + "updateNetworkInterface": { + "id": "compute.instances.updateNetworkInterface", + "path": "{project}/zones/{zone}/instances/{instance}/updateNetworkInterface", + "httpMethod": "PATCH", + "description": "Updates an instance's network interface. This method follows PATCH semantics.", + "parameters": { + "instance": { + "type": "string", + "description": "The instance name for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "networkInterface": { + "type": "string", + "description": "The name of the network interface to update.", + "required": true, + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, + "zone": { + "type": "string", + "description": "The name of the zone for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "instance", + "networkInterface" + ], + "request": { + "$ref": "NetworkInterface" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] } } }, @@ -20329,7 +21401,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -20399,7 +21471,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -20522,7 +21594,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -20549,7 +21621,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -20689,7 +21761,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -20793,7 +21865,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -20858,7 +21930,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -20884,7 +21956,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -20929,7 +22001,7 @@ "id": "compute.interconnects.patch", "path": "{project}/global/interconnects/{interconnect}", "httpMethod": "PATCH", - "description": "Updates the specified interconnect with the data included in the request using patch semantics.", + "description": "Updates the specified interconnect with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "interconnect": { "type": "string", @@ -20947,7 +22019,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21008,11 +22080,44 @@ }, "licenses": { "methods": { + "delete": { + "id": "compute.licenses.delete", + "path": "{project}/global/licenses/{license}", + "httpMethod": "DELETE", + "description": "Deletes the specified license.", + "parameters": { + "license": { + "type": "string", + "description": "Name of the license resource to delete.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "license" + ], + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "get": { "id": "compute.licenses.get", "path": "{project}/global/licenses/{license}", "httpMethod": "GET", - "description": "Returns the specified License resource. Get a list of available licenses by making a list() request.", + "description": "Returns the specified License resource.", "parameters": { "license": { "type": "string", @@ -21042,6 +22147,40 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "getIamPolicy": { + "id": "compute.licenses.getIamPolicy", + "path": "{project}/global/licenses/{resource}/getIamPolicy", + "httpMethod": "GET", + "description": "Gets the access control policy for a resource. May be empty if no such policy or resource exists.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "resource" + ], + "response": { + "$ref": "Policy" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, "insert": { "id": "compute.licenses.insert", "path": "{project}/global/licenses", @@ -21057,7 +22196,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21086,7 +22225,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -21116,10 +22255,83 @@ } }, "parameterOrder": [ - "project" + "project" + ], + "response": { + "$ref": "LicensesListResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "setIamPolicy": { + "id": "compute.licenses.setIamPolicy", + "path": "{project}/global/licenses/{resource}/setIamPolicy", + "httpMethod": "POST", + "description": "Sets the access control policy on the specified resource. Replaces any existing policy.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "resource" + ], + "request": { + "$ref": "Policy" + }, + "response": { + "$ref": "Policy" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "testIamPermissions": { + "id": "compute.licenses.testIamPermissions", + "path": "{project}/global/licenses/{resource}/testIamPermissions", + "httpMethod": "POST", + "description": "Returns permissions that a caller has on the specified resource.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "resource" ], + "request": { + "$ref": "TestPermissionsRequest" + }, "response": { - "$ref": "LicensesListResponse" + "$ref": "TestPermissionsResponse" }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", @@ -21139,7 +22351,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -21230,7 +22442,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -21305,7 +22517,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21346,7 +22558,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21411,7 +22623,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21437,7 +22649,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -21478,6 +22690,132 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "listIpOwners": { + "id": "compute.networks.listIpOwners", + "path": "{project}/global/networks/{network}/listIpOwners", + "httpMethod": "GET", + "description": "List the internal IP owners in the specified network.", + "parameters": { + "filter": { + "type": "string", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" + }, + "ipCidrRange": { + "type": "string", + "description": "(Optional) IP CIDR range filter, example: \"10.128.10.0/30\".", + "location": "query" + }, + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "network": { + "type": "string", + "description": "Name of the network to return.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "orderBy": { + "type": "string", + "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + "location": "query" + }, + "ownerProjects": { + "type": "string", + "description": "(Optional) Project IDs filter, example: \"project-1,project-2\".", + "location": "query" + }, + "ownerTypes": { + "type": "string", + "description": "(Optional) Owner types filter, example: \"instance,forwardingRule\".", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "subnetName": { + "type": "string", + "description": "(Optional) Subnetwork name filter.", + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "query" + }, + "subnetRegion": { + "type": "string", + "description": "(Optional) Subnetwork region filter.", + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "query" + } + }, + "parameterOrder": [ + "project", + "network" + ], + "response": { + "$ref": "IpOwnerList" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "patch": { + "id": "compute.networks.patch", + "path": "{project}/global/networks/{network}", + "httpMethod": "PATCH", + "description": "Patches the specified network with the data included in the request.", + "parameters": { + "network": { + "type": "string", + "description": "Name of the network to update.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + } + }, + "parameterOrder": [ + "project", + "network" + ], + "request": { + "$ref": "Network" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, "removePeering": { "id": "compute.networks.removePeering", "path": "{project}/global/networks/{network}/removePeering", @@ -21500,7 +22838,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21541,7 +22879,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21602,7 +22940,7 @@ "id": "compute.projects.disableXpnHost", "path": "{project}/disableXpnHost", "httpMethod": "POST", - "description": "Disable this project as an XPN host project.", + "description": "Disable this project as a shared VPC host project.", "parameters": { "project": { "type": "string", @@ -21613,7 +22951,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21632,7 +22970,7 @@ "id": "compute.projects.disableXpnResource", "path": "{project}/disableXpnResource", "httpMethod": "POST", - "description": "Disable an XPN resource associated with this host project.", + "description": "Disable a serivce resource (a.k.a service project) associated with this host project.", "parameters": { "project": { "type": "string", @@ -21643,7 +22981,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21665,7 +23003,7 @@ "id": "compute.projects.enableXpnHost", "path": "{project}/enableXpnHost", "httpMethod": "POST", - "description": "Enable this project as an XPN host project.", + "description": "Enable this project as a shared VPC host project.", "parameters": { "project": { "type": "string", @@ -21676,7 +23014,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21695,7 +23033,7 @@ "id": "compute.projects.enableXpnResource", "path": "{project}/enableXpnResource", "httpMethod": "POST", - "description": "Enable XPN resource (a.k.a service project or service folder in the future) for a host project, so that subnetworks in the host project can be used by instances in the service project or folder.", + "description": "Enable service resource (a.k.a service project) for a host project, so that subnets in the host project can be used by instances in the service project.", "parameters": { "project": { "type": "string", @@ -21706,7 +23044,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21754,7 +23092,7 @@ "id": "compute.projects.getXpnHost", "path": "{project}/getXpnHost", "httpMethod": "GET", - "description": "Get the XPN host project that this project links to. May be empty if no link exists.", + "description": "Get the shared VPC host project that this project links to. May be empty if no link exists.", "parameters": { "project": { "type": "string", @@ -21772,15 +23110,14 @@ }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute", - "https://www.googleapis.com/auth/compute.readonly" + "https://www.googleapis.com/auth/compute" ] }, "getXpnResources": { "id": "compute.projects.getXpnResources", "path": "{project}/getXpnResources", "httpMethod": "GET", - "description": "Get XPN resources associated with this host project.", + "description": "Get service resources (a.k.a service project) associated with this host project.", "parameters": { "filter": { "type": "string", @@ -21817,15 +23154,14 @@ }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute", - "https://www.googleapis.com/auth/compute.readonly" + "https://www.googleapis.com/auth/compute" ] }, "listXpnHosts": { "id": "compute.projects.listXpnHosts", "path": "{project}/listXpnHosts", "httpMethod": "POST", - "description": "List all XPN host projects visible to the user in an organization.", + "description": "List all shared VPC host projects visible to the user in an organization.", "parameters": { "filter": { "type": "string", @@ -21865,8 +23201,7 @@ }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute", - "https://www.googleapis.com/auth/compute.readonly" + "https://www.googleapis.com/auth/compute" ] }, "moveDisk": { @@ -21884,7 +23219,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21917,7 +23252,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21950,7 +23285,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -21983,7 +23318,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22016,7 +23351,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22070,7 +23405,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22151,7 +23486,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22178,7 +23513,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -22231,7 +23566,7 @@ "id": "compute.regionAutoscalers.patch", "path": "{project}/regions/{region}/autoscalers", "httpMethod": "PATCH", - "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "autoscaler": { "type": "string", @@ -22255,7 +23590,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22348,7 +23683,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", "location": "query" } }, @@ -22400,7 +23735,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22525,7 +23860,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22552,7 +23887,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -22605,7 +23940,7 @@ "id": "compute.regionBackendServices.patch", "path": "{project}/regions/{region}/backendServices/{backendService}", "httpMethod": "PATCH", - "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "backendService": { "type": "string", @@ -22630,7 +23965,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22725,7 +24060,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22757,7 +24092,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -22844,7 +24179,7 @@ "id": "compute.regionCommitments.insert", "path": "{project}/regions/{region}/commitments", "httpMethod": "POST", - "description": "Creates an commitment in the specified project using the data included in the request.", + "description": "Creates a commitment in the specified project using the data included in the request.", "parameters": { "project": { "type": "string", @@ -22862,7 +24197,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -22889,7 +24224,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -23037,7 +24372,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -23123,7 +24458,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -23171,7 +24506,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -23252,7 +24587,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", "location": "query" }, "sourceImage": { @@ -23284,7 +24619,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -23362,7 +24697,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -23404,7 +24739,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "resource": { @@ -23484,7 +24819,7 @@ "id": "compute.regionInstanceGroupManagers.abandonInstances", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", "httpMethod": "POST", - "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -23507,7 +24842,96 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + } + }, + "parameterOrder": [ + "project", + "region", + "instanceGroupManager" + ], + "request": { + "$ref": "RegionInstanceGroupManagersAbandonInstancesRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "applyUpdatesToInstances": { + "id": "compute.regionInstanceGroupManagers.applyUpdatesToInstances", + "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances", + "httpMethod": "POST", + "description": "Apply updates to selected instances the managed instance group.", + "parameters": { + "instanceGroupManager": { + "type": "string", + "description": "The name of the managed instance group, should conform to RFC1035.", + "required": true, + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region scoping this request, should conform to RFC1035.", + "required": true, + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "instanceGroupManager" + ], + "request": { + "$ref": "RegionInstanceGroupManagersApplyUpdatesRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "delete": { + "id": "compute.regionInstanceGroupManagers.delete", + "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", + "httpMethod": "DELETE", + "description": "Deletes the specified managed instance group and all of the instances in that group.", + "parameters": { + "instanceGroupManager": { + "type": "string", + "description": "Name of the managed instance group to delete.", + "required": true, + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region scoping this request.", + "required": true, + "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -23516,9 +24940,6 @@ "region", "instanceGroupManager" ], - "request": { - "$ref": "RegionInstanceGroupManagersAbandonInstancesRequest" - }, "response": { "$ref": "Operation" }, @@ -23527,15 +24948,15 @@ "https://www.googleapis.com/auth/compute" ] }, - "delete": { - "id": "compute.regionInstanceGroupManagers.delete", - "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", - "httpMethod": "DELETE", - "description": "Deletes the specified managed instance group and all of the instances in that group.", + "deleteInstances": { + "id": "compute.regionInstanceGroupManagers.deleteInstances", + "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", + "httpMethod": "POST", + "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", - "description": "Name of the managed instance group to delete.", + "description": "Name of the managed instance group.", "required": true, "location": "path" }, @@ -23554,7 +24975,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -23563,6 +24984,9 @@ "region", "instanceGroupManager" ], + "request": { + "$ref": "RegionInstanceGroupManagersDeleteInstancesRequest" + }, "response": { "$ref": "Operation" }, @@ -23571,15 +24995,15 @@ "https://www.googleapis.com/auth/compute" ] }, - "deleteInstances": { - "id": "compute.regionInstanceGroupManagers.deleteInstances", - "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", + "deletePerInstanceConfigs": { + "id": "compute.regionInstanceGroupManagers.deletePerInstanceConfigs", + "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs", "httpMethod": "POST", - "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Delete selected per-instance configs for the managed instance group.", "parameters": { "instanceGroupManager": { "type": "string", - "description": "Name of the managed instance group.", + "description": "The name of the managed instance group. It should conform to RFC1035.", "required": true, "location": "path" }, @@ -23592,14 +25016,9 @@ }, "region": { "type": "string", - "description": "Name of the region scoping this request.", + "description": "Name of the region scoping this request, should conform to RFC1035.", "required": true, "location": "path" - }, - "requestId": { - "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", - "location": "query" } }, "parameterOrder": [ @@ -23608,7 +25027,7 @@ "instanceGroupManager" ], "request": { - "$ref": "RegionInstanceGroupManagersDeleteInstancesRequest" + "$ref": "RegionInstanceGroupManagerDeleteInstanceConfigReq" }, "response": { "$ref": "Operation" @@ -23679,7 +25098,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -23706,7 +25125,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -23813,11 +25232,74 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "listPerInstanceConfigs": { + "id": "compute.regionInstanceGroupManagers.listPerInstanceConfigs", + "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs", + "httpMethod": "POST", + "description": "Lists all of the per-instance configs defined for the managed instance group.", + "parameters": { + "filter": { + "type": "string", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" + }, + "instanceGroupManager": { + "type": "string", + "description": "The name of the managed instance group. It should conform to RFC1035.", + "required": true, + "location": "path" + }, + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "orderBy": { + "type": "string", + "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region scoping this request, should conform to RFC1035.", + "required": true, + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "instanceGroupManager" + ], + "response": { + "$ref": "RegionInstanceGroupManagersListInstanceConfigsResp" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, "patch": { "id": "compute.regionInstanceGroupManagers.patch", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", "httpMethod": "PATCH", - "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.", + "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "instanceGroupManager": { "type": "string", @@ -23840,7 +25322,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -23865,7 +25347,7 @@ "id": "compute.regionInstanceGroupManagers.recreateInstances", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", "httpMethod": "POST", - "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -23888,7 +25370,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -23912,7 +25394,7 @@ "id": "compute.regionInstanceGroupManagers.resize", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize", "httpMethod": "POST", - "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", "parameters": { "instanceGroupManager": { "type": "string", @@ -23935,7 +25417,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "size": { @@ -23988,7 +25470,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -24035,7 +25517,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -24082,7 +25564,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -24174,7 +25656,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -24193,6 +25675,48 @@ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/compute" ] + }, + "updatePerInstanceConfigs": { + "id": "compute.regionInstanceGroupManagers.updatePerInstanceConfigs", + "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs", + "httpMethod": "POST", + "description": "Insert or patch (for the ones that already exist) per-instance configs for the managed instance group. perInstanceConfig.instance serves as a key used to distinguish whether to perform insert or patch.", + "parameters": { + "instanceGroupManager": { + "type": "string", + "description": "The name of the managed instance group. It should conform to RFC1035.", + "required": true, + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region scoping this request, should conform to RFC1035.", + "required": true, + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "instanceGroupManager" + ], + "request": { + "$ref": "RegionInstanceGroupManagerUpdateInstanceConfigReq" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] } } }, @@ -24246,7 +25770,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -24302,7 +25826,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "instanceGroup": { @@ -24387,7 +25911,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -24544,7 +26068,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -24639,7 +26163,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -24692,7 +26216,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -24755,7 +26279,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "router": { @@ -24885,7 +26409,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -24912,7 +26436,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -24965,7 +26489,7 @@ "id": "compute.routers.patch", "path": "{project}/regions/{region}/routers/{router}", "httpMethod": "PATCH", - "description": "Patches the specified Router resource with the data included in the request. This method supports patch semantics.", + "description": "Patches the specified Router resource with the data included in the request. This method supports PATCH semantics and uses JSON merge patch format and processing rules.", "parameters": { "project": { "type": "string", @@ -24983,7 +26507,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "router": { @@ -25123,7 +26647,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "router": { @@ -25169,7 +26693,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "route": { @@ -25241,7 +26765,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -25267,7 +26791,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -25364,7 +26888,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "securityPolicy": { @@ -25436,7 +26960,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -25462,7 +26986,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -25518,7 +27042,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "securityPolicy": { @@ -25601,7 +27125,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "snapshot": { @@ -25700,7 +27224,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -25781,7 +27305,7 @@ "id": "compute.snapshots.setLabels", "path": "{project}/global/snapshots/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -25869,7 +27393,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "sslCertificate": { @@ -25941,7 +27465,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -25967,7 +27491,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -26057,7 +27581,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -26120,7 +27644,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "subnetwork": { @@ -26166,7 +27690,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "subnetwork": { @@ -26299,7 +27823,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -26326,7 +27850,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -26375,6 +27899,56 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "patch": { + "id": "compute.subnetworks.patch", + "path": "{project}/regions/{region}/subnetworks/{subnetwork}", + "httpMethod": "PATCH", + "description": "Patches the specified subnetwork with the data included in the request. Only the following fields within the subnetwork resource can be specified in the request: secondary_ip_range and allow_subnet_cidr_routes_overlap. It is also mandatory to specify the current fingeprint of the subnetwork resource being patched.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region scoping this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, + "subnetwork": { + "type": "string", + "description": "Name of the Subnetwork resource to patch.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "subnetwork" + ], + "request": { + "$ref": "Subnetwork" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, "setIamPolicy": { "id": "compute.subnetworks.setIamPolicy", "path": "{project}/regions/{region}/subnetworks/{resource}/setIamPolicy", @@ -26423,7 +27997,7 @@ "id": "compute.subnetworks.setPrivateIpGoogleAccess", "path": "{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess", "httpMethod": "POST", - "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Cloudpath.", + "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Private Google Access.", "parameters": { "project": { "type": "string", @@ -26441,7 +28015,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "subnetwork": { @@ -26532,7 +28106,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetHttpProxy": { @@ -26604,7 +28178,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -26630,7 +28204,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -26686,7 +28260,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetHttpProxy": { @@ -26768,7 +28342,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetHttpsProxy": { @@ -26840,7 +28414,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -26866,7 +28440,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -26907,6 +28481,41 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "setQuicOverride": { + "id": "compute.targetHttpsProxies.setQuicOverride", + "path": "{project}/global/targetHttpsProxies/{targetHttpsProxy}/setQuicOverride", + "httpMethod": "POST", + "description": "Sets the QUIC override policy for TargetHttpsProxy.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "targetHttpsProxy": { + "type": "string", + "description": "Name of the TargetHttpsProxy resource to set the QUIC override policy for. The name should conform to RFC1035.", + "required": true, + "location": "path" + } + }, + "parameterOrder": [ + "project", + "targetHttpsProxy" + ], + "request": { + "$ref": "TargetHttpsProxiesSetQuicOverrideRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "setSslCertificates": { "id": "compute.targetHttpsProxies.setSslCertificates", "path": "{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates", @@ -26922,7 +28531,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetHttpsProxy": { @@ -26963,7 +28572,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetHttpsProxy": { @@ -27038,7 +28647,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -27094,7 +28703,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetInstance": { @@ -27182,7 +28791,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "zone": { @@ -27216,7 +28825,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -27336,7 +28945,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetPool": { @@ -27385,7 +28994,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetPool": { @@ -27420,7 +29029,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -27483,7 +29092,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetPool": { @@ -27616,7 +29225,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -27643,7 +29252,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -27714,7 +29323,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetPool": { @@ -27763,7 +29372,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetPool": { @@ -27818,7 +29427,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetPool": { @@ -27909,7 +29518,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetSslProxy": { @@ -27981,7 +29590,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -28007,7 +29616,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -28063,7 +29672,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetSslProxy": { @@ -28104,7 +29713,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetSslProxy": { @@ -28145,7 +29754,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetSslProxy": { @@ -28227,7 +29836,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetTcpProxy": { @@ -28299,7 +29908,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -28325,7 +29934,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -28381,7 +29990,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetTcpProxy": { @@ -28422,7 +30031,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetTcpProxy": { @@ -28497,7 +30106,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -28560,7 +30169,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "targetVpnGateway": { @@ -28648,7 +30257,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -28675,7 +30284,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -28788,7 +30397,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "urlMap": { @@ -28860,7 +30469,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -28893,7 +30502,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "urlMap": { @@ -28927,7 +30536,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -28972,7 +30581,7 @@ "id": "compute.urlMaps.patch", "path": "{project}/global/urlMaps/{urlMap}", "httpMethod": "PATCH", - "description": "Patches the specified UrlMap resource with the data included in the request. This method supports patch semantics.", + "description": "Patches the specified UrlMap resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "project": { "type": "string", @@ -28983,7 +30592,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "urlMap": { @@ -29062,7 +30671,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "urlMap": { @@ -29136,7 +30745,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -29199,7 +30808,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "vpnTunnel": { @@ -29287,7 +30896,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" } }, @@ -29314,7 +30923,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -29367,7 +30976,7 @@ "id": "compute.vpnTunnels.setLabels", "path": "{project}/regions/{region}/vpnTunnels/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on a VpnTunnel. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on a VpnTunnel. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -29385,7 +30994,7 @@ }, "requestId": { "type": "string", - "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", "location": "query" }, "resource": { @@ -29549,7 +31158,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -29644,7 +31253,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { diff --git a/vendor/google.golang.org/api/compute/v0.alpha/compute-gen.go b/vendor/google.golang.org/api/compute/v0.alpha/compute-gen.go index 033f9b6a94f5b..f44bc995f5e40 100644 --- a/vendor/google.golang.org/api/compute/v0.alpha/compute-gen.go +++ b/vendor/google.golang.org/api/compute/v0.alpha/compute-gen.go @@ -860,11 +860,11 @@ func (s *AcceleratorType) MarshalJSON() ([]byte, error) { } type AcceleratorTypeAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped accelerator type lists. + // Items: A list of AcceleratorTypesScopedList resources. Items map[string]AcceleratorTypesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -923,8 +923,12 @@ type AcceleratorTypeList struct { // compute#acceleratorTypeList for lists of accelerator types. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -1107,8 +1111,14 @@ type AccessConfig struct { // NetworkTier: This signifies the networking tier used for configuring // this access configuration and can only take the following values: - // PREMIUM , SELECT. If this field is not specified, it is assumed to be - // PREMIUM. + // PREMIUM, STANDARD. + // + // If an AccessConfig is specified without a valid external IP address, + // an ephemeral IP will be created with this networkTier. + // + // If an AccessConfig with a valid external IP address is specified, it + // must match that of the networkTier associated with the Address + // resource owning that IP. // // Possible values: // "PREMIUM" @@ -1172,6 +1182,7 @@ type Address struct { // to EXTERNAL. // // Possible values: + // "DNS_FORWARDING" // "EXTERNAL" // "INTERNAL" // "UNSPECIFIED_TYPE" @@ -1230,7 +1241,9 @@ type Address struct { // NetworkTier: This signifies the networking tier used for configuring // this Address and can only take the following values: PREMIUM , - // SELECT. If this field is not specified, it is assumed to be PREMIUM. + // STANDARD. + // + // If this field is not specified, it is assumed to be PREMIUM. // // Possible values: // "PREMIUM" @@ -1298,7 +1311,7 @@ type AddressAggregatedList struct { // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped address lists. + // Items: A list of AddressesScopedList resources. Items map[string]AddressesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -1345,11 +1358,11 @@ func (s *AddressAggregatedList) MarshalJSON() ([]byte, error) { // AddressList: Contains a list of addresses. type AddressList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of addresses. + // Items: A list of Address resources. Items []*Address `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#addressList for @@ -1364,7 +1377,7 @@ type AddressList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -1906,6 +1919,43 @@ func (s *AuditLogConfig) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// AuthorizationLoggingOptions: Authorization-related information used +// by Cloud Audit Logging. +type AuthorizationLoggingOptions struct { + // PermissionType: The type of the permission that was checked. + // + // Possible values: + // "ADMIN_READ" + // "ADMIN_WRITE" + // "DATA_READ" + // "DATA_WRITE" + // "PERMISSION_TYPE_UNSPECIFIED" + PermissionType string `json:"permissionType,omitempty"` + + // ForceSendFields is a list of field names (e.g. "PermissionType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "PermissionType") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *AuthorizationLoggingOptions) MarshalJSON() ([]byte, error) { + type noMethod AuthorizationLoggingOptions + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Autoscaler: Represents an Autoscaler resource. Autoscalers allow you // to automatically scale virtual machine instances in managed instance // groups according to an autoscaling policy that you define. For more @@ -2003,11 +2053,11 @@ func (s *Autoscaler) MarshalJSON() ([]byte, error) { } type AutoscalerAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped autoscaler lists. + // Items: A list of AutoscalersScopedList resources. Items map[string]AutoscalersScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -2054,8 +2104,8 @@ func (s *AutoscalerAggregatedList) MarshalJSON() ([]byte, error) { // AutoscalerList: Contains a list of Autoscaler resources. type AutoscalerList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of Autoscaler resources. @@ -2120,9 +2170,11 @@ type AutoscalerStatusDetails struct { // "MISSING_LOAD_BALANCING_DATA_POINTS" // "MORE_THAN_ONE_BACKEND_SERVICE" // "NOT_ENOUGH_QUOTA_AVAILABLE" + // "REGION_RESOURCE_STOCKOUT" // "SCALING_TARGET_DOES_NOT_EXIST" // "UNKNOWN" // "UNSUPPORTED_MAX_RATE_LOAD_BALANCING_CONFIGURATION" + // "ZONE_RESOURCE_STOCKOUT" Type string `json:"type,omitempty"` // ForceSendFields is a list of field names (e.g. "Message") to @@ -2402,27 +2454,73 @@ func (s *AutoscalingPolicyCpuUtilization) UnmarshalJSON(data []byte) error { // AutoscalingPolicyCustomMetricUtilization: Custom utilization metric // policy. type AutoscalingPolicyCustomMetricUtilization struct { - // Metric: The identifier of the Stackdriver Monitoring metric. The - // metric cannot have negative values and should be a utilization + // Filter: A filter string, compatible with a Stackdriver Monitoring + // filter string for TimeSeries.list API call. This filter is used to + // select a specific TimeSeries for the purpose of autoscaling and to + // determine whether the metric is exporting per-instance or global + // data. + // + // For the filter to be valid for autoscaling purposes, the following + // rules apply: + // - You can only use the AND operator for joining selectors. + // - You can only use direct equality comparison operator (=) without + // any functions for each selector. + // - You can specify the metric in both the filter string and in the + // metric field. However, if specified in both places, the metric must + // be identical. + // - The monitored resource type determines what kind of values are + // expected for the metric. If it is a gce_instance, the autoscaler + // expects the metric to include a separate TimeSeries for each instance + // in a group. In such a case, you cannot filter on resource labels. + // If the resource type is any other value, the autoscaler expects this + // metric to contain values that apply to the entire autoscaled instance + // group and resource label filtering can be performed to point + // autoscaler at the correct TimeSeries to scale upon. This is / called + // a global metric for the purpose of autoscaling. + // + // If not specified, the type defaults to gce_instance. + // + // You should provide a filter that is selective enough to pick just one + // TimeSeries for the autoscaled group or for each of the instances (if + // you are using gce_instance resource type). If multiple TimeSeries are + // returned upon the query execution, the autoscaler will sum their + // respective values to obtain its scaling value. + Filter string `json:"filter,omitempty"` + + // Metric: The identifier (type) of the Stackdriver Monitoring metric. + // The metric cannot have negative values and should be a utilization // metric, which means that the number of virtual machines handling - // requests should increase or decrease proportionally to the metric. - // The metric must also have a label of - // compute.googleapis.com/resource_id with the value of the instance's - // unique ID, although this alone does not guarantee that the metric is - // valid. + // requests should increase or decrease proportionally to the + // metric. // - // For example, the following is a valid - // metric: - // compute.googleapis.com/instance/network/received_bytes_count - // T - // he following is not a valid metric because it does not increase or - // decrease based on - // usage: - // compute.googleapis.com/instance/cpu/reserved_cores + // The metric must have a value type of INT64 or DOUBLE. Metric string `json:"metric,omitempty"` - // UtilizationTarget: Target value of the metric which autoscaler should - // maintain. Must be a positive value. + // SingleInstanceAssignment: If scaling is based on a global metric + // value that represents the total amount of work to be done or resource + // usage, set this value to an amount assigned for a single instance of + // the scaled group. Autoscaler will keep the number of instances + // proportional to the value of this metric, the metric itself should + // not change value due to group resizing. + // + // A good metric to use with the target is for example + // pubsub.googleapis.com/subscription/num_undelivered_messages or a + // custom metric exporting the total number of requests coming to your + // instances. + // + // A bad example would be a metric exporting an average or median + // latency, since this value can't include a chunk assignable to a + // single instance, it could be better used with utilization_target + // instead. + SingleInstanceAssignment float64 `json:"singleInstanceAssignment,omitempty"` + + // UtilizationTarget: The target value of the metric that autoscaler + // should maintain. This must be a positive value. + // + // For example, a good metric to use as a utilization_target is + // compute.googleapis.com/instance/network/received_bytes_count. The + // autoscaler will work to keep this value constant for each of the + // instances. UtilizationTarget float64 `json:"utilizationTarget,omitempty"` // UtilizationTargetType: Defines how target utilization value is @@ -2436,7 +2534,7 @@ type AutoscalingPolicyCustomMetricUtilization struct { // "GAUGE" UtilizationTargetType string `json:"utilizationTargetType,omitempty"` - // ForceSendFields is a list of field names (e.g. "Metric") to + // ForceSendFields is a list of field names (e.g. "Filter") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the @@ -2444,7 +2542,7 @@ type AutoscalingPolicyCustomMetricUtilization struct { // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "Metric") to include in API + // NullFields is a list of field names (e.g. "Filter") to include in API // requests with the JSON null value. By default, fields with empty // values are omitted from API requests. However, any field with an // empty value appearing in NullFields will be sent to the server as @@ -2462,13 +2560,15 @@ func (s *AutoscalingPolicyCustomMetricUtilization) MarshalJSON() ([]byte, error) func (s *AutoscalingPolicyCustomMetricUtilization) UnmarshalJSON(data []byte) error { type noMethod AutoscalingPolicyCustomMetricUtilization var s1 struct { - UtilizationTarget gensupport.JSONFloat64 `json:"utilizationTarget"` + SingleInstanceAssignment gensupport.JSONFloat64 `json:"singleInstanceAssignment"` + UtilizationTarget gensupport.JSONFloat64 `json:"utilizationTarget"` *noMethod } s1.noMethod = (*noMethod)(s) if err := json.Unmarshal(data, &s1); err != nil { return err } + s.SingleInstanceAssignment = float64(s1.SingleInstanceAssignment) s.UtilizationTarget = float64(s1.UtilizationTarget) return nil } @@ -2625,7 +2725,8 @@ type Backend struct { // Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for // TCP/SSL). // - // This cannot be used for internal load balancing. + // For Internal Load Balancing, the default and only supported mode is + // CONNECTION. // // Possible values: // "CONNECTION" @@ -2652,8 +2753,8 @@ type Backend struct { // BackendService. Failover bool `json:"failover,omitempty"` - // Group: The fully-qualified URL of a zonal Instance Group resource. - // This instance group defines the list of instances that serve traffic. + // Group: The fully-qualified URL of a Instance Group resource. This + // instance group defines the list of instances that serve traffic. // Member virtual machine instances from each instance group must live // in the same zone as the instance group itself. No two backends in a // backend service are allowed to use same Instance Group @@ -2663,8 +2764,7 @@ type Backend struct { // fully-qualified URL, rather than a partial URL. // // When the BackendService has load balancing scheme INTERNAL, the - // instance group must be in a zone within the same region as the - // BackendService. + // instance group must be within the same region as the BackendService. Group string `json:"group,omitempty"` // MaxConnections: The max number of simultaneous connections for the @@ -2868,8 +2968,12 @@ type BackendBucketList struct { // Kind: Type of resource. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -2962,7 +3066,8 @@ type BackendService struct { // HealthChecks: The list of URLs to the HttpHealthCheck or // HttpsHealthCheck resource for health checking this BackendService. // Currently at most one health check can be specified, and a health - // check is required. + // check is required for GCE backend services. A health check must not + // be specified for GAE app backend and Cloud Function backend. // // For internal load balancing, a URL to a HealthCheck resource must be // specified instead. @@ -3109,14 +3214,18 @@ type BackendServiceAggregatedList struct { // server. Id string `json:"id,omitempty"` - // Items: A map of scoped BackendService lists. + // Items: A list of BackendServicesScopedList resources. Items map[string]BackendServicesScopedList `json:"items,omitempty"` // Kind: Type of resource. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -3235,6 +3344,8 @@ type BackendServiceIAP struct { Oauth2ClientSecret string `json:"oauth2ClientSecret,omitempty"` + // Oauth2ClientSecretSha256: [Output Only] SHA256 hash value for the + // field oauth2_client_secret above. Oauth2ClientSecretSha256 string `json:"oauth2ClientSecretSha256,omitempty"` // ForceSendFields is a list of field names (e.g. "Enabled") to @@ -3441,6 +3552,12 @@ func (s *BackendServicesScopedListWarningData) MarshalJSON() ([]byte, error) { // Binding: Associates `members` with a `role`. type Binding struct { + // Condition: The condition that is associated with this binding. NOTE: + // an unsatisfied condition will not allow user access via current + // binding. Different bindings, including their conditions, are examined + // independently. This field is GOOGLE_INTERNAL. + Condition *Expr `json:"condition,omitempty"` + // Members: Specifies the identities requesting access for a Cloud // Platform resource. `members` can have the following values: // @@ -3464,6 +3581,8 @@ type Binding struct { // * `group:{emailid}`: An email address that represents a Google group. // For example, `admins@example.com`. // + // + // // * `domain:{domain}`: A Google Apps domain name that represents all // the users of that domain. For example, `google.com` or `example.com`. Members []string `json:"members,omitempty"` @@ -3472,7 +3591,7 @@ type Binding struct { // `roles/viewer`, `roles/editor`, or `roles/owner`. Role string `json:"role,omitempty"` - // ForceSendFields is a list of field names (e.g. "Members") to + // ForceSendFields is a list of field names (e.g. "Condition") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the @@ -3480,7 +3599,7 @@ type Binding struct { // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "Members") to include in + // NullFields is a list of field names (e.g. "Condition") to include in // API requests with the JSON null value. By default, fields with empty // values are omitted from API requests. However, any field with an // empty value appearing in NullFields will be sent to the server as @@ -3578,10 +3697,16 @@ func (s *CacheKeyPolicy) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } -// Commitment: A usage-commitment with a start / end time. Users create -// commitments for particular resources (e.g. memory). Actual usage is -// first deducted from available commitments made prior, perhaps at a -// reduced price (as laid out in the commitment). +// Commitment: Represents a Commitment resource. Creating a Commitment +// resource means that you are purchasing a committed use contract with +// an explicit start and end time. You can create commitments based on +// vCPUs and memory usage and receive discounted rates. For full +// details, read Signing Up for Committed Use Discounts. +// +// Committed use discounts are subject to Google Cloud Platform's +// Service Specific Terms. By purchasing a committed use discount, you +// agree to these terms. Committed use discounts will not renew, so you +// must purchase a new commitment to continue receiving discounts. type Commitment struct { // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text // format. @@ -3638,7 +3763,7 @@ type Commitment struct { StartTimestamp string `json:"startTimestamp,omitempty"` // Status: [Output Only] Status of the commitment with regards to - // eventual expiration (each commitment has an end-date defined). One of + // eventual expiration (each commitment has an end date defined). One of // the following values: NOT_YET_ACTIVE, ACTIVE, EXPIRED. // // Possible values: @@ -3681,11 +3806,11 @@ func (s *Commitment) MarshalJSON() ([]byte, error) { } type CommitmentAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: Commitments by scope. + // Items: A list of CommitmentsScopedList resources. Items map[string]CommitmentsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -3732,8 +3857,8 @@ func (s *CommitmentAggregatedList) MarshalJSON() ([]byte, error) { // CommitmentList: Contains a list of Commitment resources. type CommitmentList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of Commitment resources. @@ -4212,6 +4337,10 @@ type Disk struct { // text format. LastDetachTimestamp string `json:"lastDetachTimestamp,omitempty"` + // LicenseCodes: Integer license codes indicating which licenses are + // attached to this disk. + LicenseCodes googleapi.Int64s `json:"licenseCodes,omitempty"` + // Licenses: Any applicable publicly visible licenses. Licenses []string `json:"licenses,omitempty"` @@ -4227,6 +4356,14 @@ type Disk struct { // Options: Internal use only. Options string `json:"options,omitempty"` + // PhysicalBlockSizeBytes: Physical block size of the persistent disk, + // in bytes. If not present in a request, a default value is used. + // Initially only 4096 is supported, but other powers of two may be + // added. If an unsupported value is requested, the error message will + // list the supported values, but even a supported value may be allowed + // for only some projects. + PhysicalBlockSizeBytes int64 `json:"physicalBlockSizeBytes,omitempty,string"` + // Region: [Output Only] URL of the region where the disk resides. Only // applicable for regional resources. Region string `json:"region,omitempty"` @@ -4246,7 +4383,8 @@ type Disk struct { // // If you specify this field along with sourceImage or sourceSnapshot, // the value of sizeGb must not be less than the size of the sourceImage - // or the size of the snapshot. + // or the size of the snapshot. Acceptable values are 1 to 65536, + // inclusive. SizeGb int64 `json:"sizeGb,omitempty,string"` // SourceImage: The source image used to create this disk. If the source @@ -4368,11 +4506,11 @@ func (s *Disk) MarshalJSON() ([]byte, error) { } type DiskAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped disk lists. + // Items: A list of DisksScopedList resources. Items map[string]DisksScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -4384,8 +4522,7 @@ type DiskAggregatedList struct { // than maxResults, use the nextPageToken as a value for the query // parameter pageToken in the next list request. Subsequent list // requests will have their own nextPageToken to continue paging through - // the results. Acceptable values are 0 to 500, inclusive. (Default: - // 500) + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -4431,11 +4568,12 @@ type DiskList struct { // lists of disks. Kind string `json:"kind,omitempty"` - // NextPageToken: This token allows you to get the next page of results - // for list requests. If the number of results is larger than - // maxResults, use the nextPageToken as a value for the query parameter - // pageToken in the next list request. Subsequent list requests will - // have their own nextPageToken to continue paging through the results. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -4578,11 +4716,11 @@ func (s *DiskType) MarshalJSON() ([]byte, error) { } type DiskTypeAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped disk type lists. + // Items: A list of DiskTypesScopedList resources. Items map[string]DiskTypesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -4629,11 +4767,11 @@ func (s *DiskTypeAggregatedList) MarshalJSON() ([]byte, error) { // DiskTypeList: Contains a list of disk types. type DiskTypeList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Disk Type resources. + // Items: A list of DiskType resources. Items []*DiskType `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#diskTypeList for @@ -5015,6 +5153,56 @@ func (s *DistributionPolicyZoneConfiguration) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// Expr: Represents an expression text. Example: +// +// title: "User account presence" description: "Determines whether the +// request has a user account" expression: "size(request.user) > 0" +type Expr struct { + // Description: An optional description of the expression. This is a + // longer text which describes the expression, e.g. when hovered over it + // in a UI. + Description string `json:"description,omitempty"` + + // Expression: Textual representation of an expression in Common + // Expression Language syntax. + // + // The application context of the containing message determines which + // well-known feature set of CEL is supported. + Expression string `json:"expression,omitempty"` + + // Location: An optional string indicating the location of the + // expression for error reporting, e.g. a file name and a position in + // the file. + Location string `json:"location,omitempty"` + + // Title: An optional title for the expression, i.e. a short string + // describing its purpose. This can be used e.g. in UIs which allow to + // enter the expression. + Title string `json:"title,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Description") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Description") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Expr) MarshalJSON() ([]byte, error) { + type noMethod Expr + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Firewall: Represents a Firewall resource. type Firewall struct { // Allowed: The list of ALLOW rules specified by this firewall. Each @@ -5051,11 +5239,17 @@ type Firewall struct { // "INGRESS" Direction string `json:"direction,omitempty"` + // EnableLogging: This field denotes whether to enable logging for a + // particular firewall rule. If logging is enabled, logs will be + // exported to the configured export destination for all firewall logs + // in the network. Logs may be exported to BigQuery or Pub/Sub. + EnableLogging bool `json:"enableLogging,omitempty"` + // Id: [Output Only] The unique identifier for the resource. This // identifier is defined by the server. Id uint64 `json:"id,omitempty,string"` - // Kind: [Output Ony] Type of the resource. Always compute#firewall for + // Kind: [Output Only] Type of the resource. Always compute#firewall for // firewall rules. Kind string `json:"kind,omitempty"` @@ -5116,15 +5310,18 @@ type Firewall struct { // or targetTags. SourceServiceAccounts []string `json:"sourceServiceAccounts,omitempty"` - // SourceTags: If source tags are specified, the firewall will apply - // only to traffic with source IP that belongs to a tag listed in source - // tags. Source tags cannot be used to control traffic to an instance's - // external IP address. Because tags are associated with an instance, - // not an IP address. One or both of sourceRanges and sourceTags may be - // set. If both properties are set, the firewall will apply to traffic - // that has source IP address within sourceRanges OR the source IP that - // belongs to a tag listed in the sourceTags property. The connection - // does not need to match both properties for the firewall to apply. + // SourceTags: If source tags are specified, the firewall rule applies + // only to traffic with source IPs that match the primary network + // interfaces of VM instances that have the tag and are in the same VPC + // network. Source tags cannot be used to control traffic to an + // instance's external IP address, it only applies to traffic between + // instances in the same virtual network. Because tags are associated + // with instances, not IP addresses. One or both of sourceRanges and + // sourceTags may be set. If both properties are set, the firewall will + // apply to traffic that has source IP address within sourceRanges OR + // the source IP that belongs to a tag listed in the sourceTags + // property. The connection does not need to match both properties for + // the firewall to apply. SourceTags []string `json:"sourceTags,omitempty"` // TargetServiceAccounts: A list of service accounts indicating sets of @@ -5172,7 +5369,7 @@ type FirewallAllowed struct { // IPProtocol: The IP protocol to which this rule applies. The protocol // type is required when creating a firewall rule. This value can either // be one of the following well known protocol strings (tcp, udp, icmp, - // esp, ah, sctp), or the IP protocol number. + // esp, ah, ipip, sctp), or the IP protocol number. IPProtocol string `json:"IPProtocol,omitempty"` // Ports: An optional list of ports to which this rule applies. This @@ -5210,7 +5407,7 @@ type FirewallDenied struct { // IPProtocol: The IP protocol to which this rule applies. The protocol // type is required when creating a firewall rule. This value can either // be one of the following well known protocol strings (tcp, udp, icmp, - // esp, ah, sctp), or the IP protocol number. + // esp, ah, ipip, sctp), or the IP protocol number. IPProtocol string `json:"IPProtocol,omitempty"` // Ports: An optional list of ports to which this rule applies. This @@ -5246,11 +5443,11 @@ func (s *FirewallDenied) MarshalJSON() ([]byte, error) { // FirewallList: Contains a list of firewalls. type FirewallList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Firewall resources. + // Items: A list of Firewall resources. Items []*Firewall `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#firewallList for @@ -5342,15 +5539,16 @@ type ForwardingRule struct { // For global forwarding rules, the address must be a global IP. For // regional forwarding rules, the address must live in the same region // as the forwarding rule. By default, this field is empty and an - // ephemeral IP from the same scope (global or regional) will be - // assigned. + // ephemeral IPv4 address from the same scope (global or regional) will + // be assigned. A regional forwarding rule supports IPv4 only. A global + // forwarding rule supports either IPv4 or IPv6. // // When the load balancing scheme is INTERNAL, this can only be an RFC // 1918 IP address belonging to the network/subnetwork configured for // the forwarding rule. A reserved address cannot be used. If the field // is empty, the IP address will be automatically allocated from the // internal IP range of the subnetwork or network configured for this - // forwarding rule. Only IPv4 is supported. + // forwarding rule. IPAddress string `json:"IPAddress,omitempty"` // IPProtocol: The IP protocol to which this rule applies. Valid options @@ -5448,7 +5646,14 @@ type ForwardingRule struct { // NetworkTier: This signifies the networking tier used for configuring // this load balancer and can only take the following values: PREMIUM , - // SELECT. If this field is not specified, it is assumed to be PREMIUM. + // STANDARD. + // + // For regional ForwardingRule, the valid values are PREMIUM and + // STANDARD. For GlobalForwardingRule, the valid value is PREMIUM. + // + // If this field is not specified, it is assumed to be PREMIUM. If + // IPAddress is specified, this value must be equal to the networkTier + // of the Address. // // Possible values: // "PREMIUM" @@ -5469,7 +5674,10 @@ type ForwardingRule struct { // ports: // - TargetHttpProxy: 80, 8080 // - TargetHttpsProxy: 443 - // - TargetSslProxy: 443 + // - TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, + // 995, 1883, 5222 + // - TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, + // 995, 1883, 5222 // - TargetVpnGateway: 500, 4500 // - PortRange string `json:"portRange,omitempty"` @@ -5561,11 +5769,11 @@ func (s *ForwardingRule) MarshalJSON() ([]byte, error) { } type ForwardingRuleAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped forwarding rule lists. + // Items: A list of ForwardingRulesScopedList resources. Items map[string]ForwardingRulesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -5612,7 +5820,7 @@ func (s *ForwardingRuleAggregatedList) MarshalJSON() ([]byte, error) { // ForwardingRuleList: Contains a list of ForwardingRule resources. type ForwardingRuleList struct { - // Id: [Output Only] Unique identifier for the resource. Set by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -5831,9 +6039,51 @@ func (s *GlobalSetLabelsRequest) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// GuestAttributes: A guest attributes entry. +type GuestAttributes struct { + // Kind: [Output Only] Type of the resource. Always + // compute#guestAttributes for guest attributes entry. + Kind string `json:"kind,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // VariableKey: The key to search for. + VariableKey string `json:"variableKey,omitempty"` + + // VariableValue: [Output Only] The value found for the requested key. + VariableValue string `json:"variableValue,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Kind") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Kind") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *GuestAttributes) MarshalJSON() ([]byte, error) { + type noMethod GuestAttributes + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // GuestOsFeature: Guest OS features. type GuestOsFeature struct { - // Type: The type of supported feature. Currenty only + // Type: The type of supported feature. Currently only // VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the // server might also populate this property with the value WINDOWS to // indicate that this is a Windows image. This value is purely @@ -6140,8 +6390,8 @@ func (s *HealthCheck) MarshalJSON() ([]byte, error) { // HealthCheckList: Contains a list of HealthCheck resources. type HealthCheckList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of HealthCheck resources. @@ -6365,11 +6615,11 @@ func (s *Host) MarshalJSON() ([]byte, error) { } type HostAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped host lists. + // Items: A list of HostsScopedList resources. Items map[string]HostsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -6384,7 +6634,7 @@ type HostAggregatedList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -6416,11 +6666,11 @@ func (s *HostAggregatedList) MarshalJSON() ([]byte, error) { // HostList: Contains a list of hosts. type HostList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Host resources. + // Items: A list of Host resources. Items []*Host `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#hostList for @@ -6435,7 +6685,7 @@ type HostList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -6580,11 +6830,11 @@ func (s *HostType) MarshalJSON() ([]byte, error) { } type HostTypeAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped host type lists. + // Items: A list of HostTypesScopedList resources. Items map[string]HostTypesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource.Always @@ -6599,7 +6849,7 @@ type HostTypeAggregatedList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -6631,11 +6881,11 @@ func (s *HostTypeAggregatedList) MarshalJSON() ([]byte, error) { // HostTypeList: Contains a list of host types. type HostTypeList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Host Type resources. + // Items: A list of HostType resources. Items []*HostType `json:"items,omitempty"` // Kind: [Output Only] Type of resource.Always compute#hostTypeList for @@ -6650,7 +6900,7 @@ type HostTypeList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -7027,7 +7277,7 @@ func (s *HttpHealthCheck) MarshalJSON() ([]byte, error) { // HttpHealthCheckList: Contains a list of HttpHealthCheck resources. type HttpHealthCheckList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -7245,11 +7495,11 @@ type Image struct { // GuestOsFeatures: A list of features to enable on the guest OS. // Applicable for bootable images only. Currently, only one feature can - // be enabled, VIRTIO_SCSCI_MULTIQUEUE, which allows each virtual CPU to + // be enabled, VIRTIO_SCSI_MULTIQUEUE, which allows each virtual CPU to // have its own queue. For Windows images, you can only enable - // VIRTIO_SCSCI_MULTIQUEUE on images with driver version 1.2.0.1621 or + // VIRTIO_SCSI_MULTIQUEUE on images with driver version 1.2.0.1621 or // higher. Linux images with kernel versions 3.17 and higher will - // support VIRTIO_SCSCI_MULTIQUEUE. + // support VIRTIO_SCSI_MULTIQUEUE. // // For new Windows images, the server might also populate this field // with the value WINDOWS, to indicate that this is a Windows image. @@ -7295,6 +7545,10 @@ type Image struct { // the setLabels method. Labels map[string]string `json:"labels,omitempty"` + // LicenseCodes: Integer license codes indicating which licenses are + // attached to this image. + LicenseCodes googleapi.Int64s `json:"licenseCodes,omitempty"` + // Licenses: Any applicable license URI. Licenses []string `json:"licenses,omitempty"` @@ -7442,11 +7696,11 @@ func (s *ImageRawDisk) MarshalJSON() ([]byte, error) { // ImageList: Contains a list of images. type ImageList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Image resources. + // Items: A list of Image resources. Items []*Image `json:"items,omitempty"` // Kind: Type of resource. @@ -7520,12 +7774,12 @@ type Instance struct { // Host: Full or partial URL of the host resource that the instance // should be placed on, in the format: zones/zone/hosts/host. // - // Optional, Private Host (physical machine) that the instance will be - // placed on when it's created. The instance is guaranteed to be placed - // on the same machine as other instances with the same private - // host. + // Optional, sole-tenant Host (physical machine) that the instance will + // be placed on when it's created. The instance is guaranteed to be + // placed on the same machine as other instances with the same + // sole-tenant host. // - // The request will be rejected if the private host has run out of + // The request will be rejected if the sole-tenant host has run out of // resources. Host string `json:"host,omitempty"` @@ -7600,8 +7854,10 @@ type Instance struct { // This includes custom metadata and predefined keys. Metadata *Metadata `json:"metadata,omitempty"` - // MinCpuPlatform: Minimum cpu/platform to be used by this instance. We - // may schedule on the specified or later cpu/platform. + // MinCpuPlatform: Specifies a minimum CPU platform for the VM instance. + // Applicable values are the friendly names of CPU platforms, such as + // minCpuPlatform: "Intel Haswell" or minCpuPlatform: "Intel Sandy + // Bridge". MinCpuPlatform string `json:"minCpuPlatform,omitempty"` // Name: The name of the resource, provided by the client when initially @@ -7640,7 +7896,7 @@ type Instance struct { StartRestricted bool `json:"startRestricted,omitempty"` // Status: [Output Only] The status of the instance. One of the - // following values: PROVISIONING, STAGING, RUNNING, STOPPING, + // following values: PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED, // SUSPENDING, SUSPENDED, and TERMINATED. // // Possible values: @@ -7696,11 +7952,11 @@ func (s *Instance) MarshalJSON() ([]byte, error) { } type InstanceAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped instance lists. + // Items: A list of InstancesScopedList resources. Items map[string]InstancesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -7836,11 +8092,11 @@ func (s *InstanceGroup) MarshalJSON() ([]byte, error) { } type InstanceGroupAggregatedList struct { - // Id: [Output Only] A unique identifier for this aggregated list of - // instance groups. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped instance group lists. + // Items: A list of InstanceGroupsScopedList resources. Items map[string]InstanceGroupsScopedList `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -7856,8 +8112,7 @@ type InstanceGroupAggregatedList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -7889,11 +8144,11 @@ func (s *InstanceGroupAggregatedList) MarshalJSON() ([]byte, error) { // InstanceGroupList: A list of InstanceGroup resources. type InstanceGroupList struct { - // Id: [Output Only] A unique identifier for this list of instance - // groups. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A list of instance groups. + // Items: A list of InstanceGroup resources. Items []*InstanceGroup `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -7908,8 +8163,7 @@ type InstanceGroupList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -7941,6 +8195,8 @@ func (s *InstanceGroupList) MarshalJSON() ([]byte, error) { // InstanceGroupManager: An Instance Group Manager resource. type InstanceGroupManager struct { + Activities *InstanceGroupManagerActivities `json:"activities,omitempty"` + // AutoHealingPolicies: The autohealing policy for this managed instance // group. You can specify only one value. AutoHealingPolicies []*InstanceGroupManagerAutoHealingPolicy `json:"autoHealingPolicies,omitempty"` @@ -8061,21 +8317,20 @@ type InstanceGroupManager struct { // server. googleapi.ServerResponse `json:"-"` - // ForceSendFields is a list of field names (e.g. "AutoHealingPolicies") - // to unconditionally include in API requests. By default, fields with + // ForceSendFields is a list of field names (e.g. "Activities") to + // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the // server regardless of whether the field is empty or not. This may be // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "AutoHealingPolicies") to - // include in API requests with the JSON null value. By default, fields - // with empty values are omitted from API requests. However, any field - // with an empty value appearing in NullFields will be sent to the - // server as null. It is an error if a field in this list has a - // non-empty value. This may be used to include null fields in Patch - // requests. + // NullFields is a list of field names (e.g. "Activities") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. NullFields []string `json:"-"` } @@ -8165,12 +8420,71 @@ func (s *InstanceGroupManagerActionsSummary) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type InstanceGroupManagerActivities struct { + // Possible values: + // "PERMITTED" + // "PROHIBITED" + Autohealing string `json:"autohealing,omitempty"` + + // Possible values: + // "PERMITTED" + // "PROHIBITED" + AutohealingHealthCheckBased string `json:"autohealingHealthCheckBased,omitempty"` + + // Possible values: + // "PERMITTED" + // "PROHIBITED" + AutoscalingDown string `json:"autoscalingDown,omitempty"` + + // Possible values: + // "PERMITTED" + // "PROHIBITED" + AutoscalingUp string `json:"autoscalingUp,omitempty"` + + // Possible values: + // "PERMITTED" + // "PROHIBITED" + CreatingInstances string `json:"creatingInstances,omitempty"` + + // Possible values: + // "PERMITTED" + // "PROHIBITED" + DeletingInstances string `json:"deletingInstances,omitempty"` + + // Possible values: + // "PERMITTED" + // "PROHIBITED" + RecreatingInstances string `json:"recreatingInstances,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Autohealing") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Autohealing") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *InstanceGroupManagerActivities) MarshalJSON() ([]byte, error) { + type noMethod InstanceGroupManagerActivities + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type InstanceGroupManagerAggregatedList struct { - // Id: [Output Only] A unique identifier for this aggregated list of - // managed instance groups. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of filtered managed instance group lists. + // Items: A list of InstanceGroupManagersScopedList resources. Items map[string]InstanceGroupManagersScopedList `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -8186,8 +8500,7 @@ type InstanceGroupManagerAggregatedList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -8263,11 +8576,11 @@ func (s *InstanceGroupManagerAutoHealingPolicy) MarshalJSON() ([]byte, error) { // InstanceGroupManagerList: [Output Only] A list of managed instance // groups. type InstanceGroupManagerList struct { - // Id: [Output Only] A unique identifier for this resource type. The - // server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of managed instance groups. + // Items: A list of InstanceGroupManager resources. Items []*InstanceGroupManager `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -8434,6 +8747,8 @@ type InstanceGroupManagerUpdatePolicy struct { // of action types is: RESTART < REPLACE. // // Possible values: + // "NONE" + // "REFRESH" // "REPLACE" // "RESTART" MinimalAction string `json:"minimalAction,omitempty"` @@ -8540,6 +8855,58 @@ func (s *InstanceGroupManagersAbandonInstancesRequest) MarshalJSON() ([]byte, er return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// InstanceGroupManagersApplyUpdatesRequest: +// InstanceGroupManagers.applyUpdatesToInstances +type InstanceGroupManagersApplyUpdatesRequest struct { + // Instances: The list of URLs of one or more instances for which we + // want to apply updates on this managed instance group. This can be a + // full URL or a partial URL, such as + // zones/[ZONE]/instances/[INSTANCE_NAME]. + Instances []string `json:"instances,omitempty"` + + // MaximalAction: The maximal action that should be perfomed on the + // instances. By default REPLACE. + // + // Possible values: + // "NONE" + // "REFRESH" + // "REPLACE" + // "RESTART" + MaximalAction string `json:"maximalAction,omitempty"` + + // MinimalAction: The minimal action that should be perfomed on the + // instances. By default NONE. + // + // Possible values: + // "NONE" + // "REFRESH" + // "REPLACE" + // "RESTART" + MinimalAction string `json:"minimalAction,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Instances") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Instances") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *InstanceGroupManagersApplyUpdatesRequest) MarshalJSON() ([]byte, error) { + type noMethod InstanceGroupManagersApplyUpdatesRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type InstanceGroupManagersDeleteInstancesRequest struct { // Instances: The URLs of one or more instances to delete. This can be a // full URL or a partial URL, such as @@ -8569,6 +8936,36 @@ func (s *InstanceGroupManagersDeleteInstancesRequest) MarshalJSON() ([]byte, err return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// InstanceGroupManagersDeletePerInstanceConfigsReq: +// InstanceGroupManagers.deletePerInstanceConfigs +type InstanceGroupManagersDeletePerInstanceConfigsReq struct { + // Instances: The list of instances for which we want to delete + // per-instance configs on this managed instance group. + Instances []string `json:"instances,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Instances") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Instances") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *InstanceGroupManagersDeletePerInstanceConfigsReq) MarshalJSON() ([]byte, error) { + type noMethod InstanceGroupManagersDeletePerInstanceConfigsReq + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type InstanceGroupManagersListManagedInstancesResponse struct { // ManagedInstances: [Output Only] The list of instances in the managed // instance group. @@ -8610,6 +9007,45 @@ func (s *InstanceGroupManagersListManagedInstancesResponse) MarshalJSON() ([]byt return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type InstanceGroupManagersListPerInstanceConfigsResp struct { + // Items: [Output Only] The list of PerInstanceConfig. + Items []*PerInstanceConfig `json:"items,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *InstanceGroupManagersListPerInstanceConfigsResp) MarshalJSON() ([]byte, error) { + type noMethod InstanceGroupManagersListPerInstanceConfigsResp + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type InstanceGroupManagersRecreateInstancesRequest struct { // Instances: The URLs of one or more instances to recreate. This can be // a full URL or a partial URL, such as @@ -8920,6 +9356,37 @@ func (s *InstanceGroupManagersSetTargetPoolsRequest) MarshalJSON() ([]byte, erro return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// InstanceGroupManagersUpdatePerInstanceConfigsReq: +// InstanceGroupManagers.updatePerInstanceConfigs +type InstanceGroupManagersUpdatePerInstanceConfigsReq struct { + // PerInstanceConfigs: The list of per-instance configs to insert or + // patch on this managed instance group. + PerInstanceConfigs []*PerInstanceConfig `json:"perInstanceConfigs,omitempty"` + + // ForceSendFields is a list of field names (e.g. "PerInstanceConfigs") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "PerInstanceConfigs") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *InstanceGroupManagersUpdatePerInstanceConfigsReq) MarshalJSON() ([]byte, error) { + type noMethod InstanceGroupManagersUpdatePerInstanceConfigsReq + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type InstanceGroupsAddInstancesRequest struct { // Instances: The list of instances to add to the instance group. Instances []*InstanceReference `json:"instances,omitempty"` @@ -8948,12 +9415,11 @@ func (s *InstanceGroupsAddInstancesRequest) MarshalJSON() ([]byte, error) { } type InstanceGroupsListInstances struct { - // Id: [Output Only] A unique identifier for this list of instances in - // the specified instance group. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of instances and any named ports that are - // assigned to those instances. + // Items: A list of InstanceWithNamedPorts resources. Items []*InstanceWithNamedPorts `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -8969,8 +9435,7 @@ type InstanceGroupsListInstances struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this list of instances in the - // specified instance groups. The server generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -9228,11 +9693,11 @@ func (s *InstanceGroupsSetNamedPortsRequest) MarshalJSON() ([]byte, error) { // InstanceList: Contains a list of instances. type InstanceList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of instances. + // Items: A list of Instance resources. Items []*Instance `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#instanceList for @@ -9279,11 +9744,11 @@ func (s *InstanceList) MarshalJSON() ([]byte, error) { // InstanceListReferrers: Contains a list of instance referrers. type InstanceListReferrers struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of referrers. + // Items: A list of Reference resources. Items []*Reference `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -9377,8 +9842,8 @@ type InstanceProperties struct { // receive packets with destination IP addresses other than their own. // If these instances will be used as an IP gateway or it will be set as // the next-hop in a Route resource, specify true. If unsure, leave this - // set to false. See the Enable IP forwarding for instances - // documentation for more information. + // set to false. See the Enable IP forwarding documentation for more + // information. CanIpForward bool `json:"canIpForward,omitempty"` // Description: An optional text description for the instances that are @@ -9408,7 +9873,11 @@ type InstanceProperties struct { Metadata *Metadata `json:"metadata,omitempty"` // MinCpuPlatform: Minimum cpu/platform to be used by this instance. The - // instance may be scheduled on the specified or later cpu/platform. + // instance may be scheduled on the specified or newer cpu/platform. + // Applicable values are the friendly names of CPU platforms, such as + // minCpuPlatform: "Intel Haswell" or minCpuPlatform: "Intel Sandy + // Bridge". For more information, read Specifying a Minimum CPU + // Platform. MinCpuPlatform string `json:"minCpuPlatform,omitempty"` // NetworkInterfaces: An array of network access configurations for this @@ -9553,11 +10022,11 @@ func (s *InstanceTemplate) MarshalJSON() ([]byte, error) { // InstanceTemplateList: A list of instance templates. type InstanceTemplateList struct { - // Id: [Output Only] A unique identifier for this instance template. The - // server defines this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] list of InstanceTemplate resources. + // Items: A list of InstanceTemplate resources. Items []*InstanceTemplate `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -9572,8 +10041,7 @@ type InstanceTemplateList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this instance template list. The - // server defines this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -9967,7 +10435,7 @@ func (s *InstancesStartWithEncryptionKeyRequest) MarshalJSON() ([]byte, error) { } // Interconnect: Protocol definitions for Mixer API to support -// Interconnect. Next available tag: 20 +// Interconnect. Next available tag: 23 type Interconnect struct { // AdminEnabled: Administrative status of the interconnect. When this is // set to ?true?, the Interconnect is functional and may carry traffic @@ -9987,10 +10455,18 @@ type Interconnect struct { // format. CreationTimestamp string `json:"creationTimestamp,omitempty"` + // CustomerName: Customer name, to put in the Letter of Authorization as + // the party authorized to request a crossconnect. + CustomerName string `json:"customerName,omitempty"` + // Description: An optional description of this resource. Provide this // property when you create the resource. Description string `json:"description,omitempty"` + // ExpectedOutages: [Output Only] List of outages expected for this + // Interconnect. + ExpectedOutages []*InterconnectOutageNotification `json:"expectedOutages,omitempty"` + // GoogleIpAddress: [Output Only] IP address configured on the Google // side of the Interconnect link. This can be used only for ping tests. GoogleIpAddress string `json:"googleIpAddress,omitempty"` @@ -10046,7 +10522,6 @@ type Interconnect struct { // Possible values: // "OS_ACTIVE" // "OS_UNPROVISIONED" - // "OS_UNSPECIFIED" OperationalStatus string `json:"operationalStatus,omitempty"` // PeerIpAddress: [Output Only] IP address configured on the customer @@ -10196,11 +10671,11 @@ func (s *InterconnectAttachment) MarshalJSON() ([]byte, error) { } type InterconnectAttachmentAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped InterconnectAttachment lists. + // Items: A list of InterconnectAttachmentsScopedList resources. Items map[string]InterconnectAttachmentsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -10249,11 +10724,11 @@ func (s *InterconnectAttachmentAggregatedList) MarshalJSON() ([]byte, error) { // InterconnectAttachmentList: Response to the list request, and // contains a list of interconnect attachments. type InterconnectAttachmentList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of InterconnectAttachment resources. + // Items: A list of InterconnectAttachment resources. Items []*InterconnectAttachment `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -10464,11 +10939,11 @@ func (s *InterconnectAttachmentsScopedListWarningData) MarshalJSON() ([]byte, er // InterconnectList: Response to the list request, and contains a list // of interconnects. type InterconnectList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Interconnect resources. + // Items: A list of Interconnect resources. Items []*Interconnect `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#interconnectList @@ -10520,6 +10995,27 @@ type InterconnectLocation struct { // each line in the address is separated by a newline character. Address string `json:"address,omitempty"` + // AvailabilityZone: Availability zone for this location. Within a city, + // maintenance will not be simultaneously scheduled in more than one + // availability zone. Example: "zone1" or "zone2". + AvailabilityZone string `json:"availabilityZone,omitempty"` + + // City: City designator used by the Interconnect UI to locate this + // InterconnectLocation within the Continent. For example: "Chicago, + // IL", "Amsterdam, Netherlands". + City string `json:"city,omitempty"` + + // Continent: Continent for this location. Used by the location picker + // in the Interconnect UI. + // + // Possible values: + // "C_AFRICA" + // "C_ASIA_PAC" + // "C_EUROPE" + // "C_NORTH_AMERICA" + // "C_SOUTH_AMERICA" + Continent string `json:"continent,omitempty"` + // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text // format. CreationTimestamp string `json:"creationTimestamp,omitempty"` @@ -10588,11 +11084,11 @@ func (s *InterconnectLocation) MarshalJSON() ([]byte, error) { // InterconnectLocationList: Response to the list request, and contains // a list of interconnect locations. type InterconnectLocationList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of InterconnectLocation resources. + // Items: A list of InterconnectLocation resources. Items []*InterconnectLocation `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -10678,11 +11174,152 @@ func (s *InterconnectLocationRegionInfo) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// InterconnectOutageNotification: Description of a planned outage on +// this Interconnect. Next id: 9 +type InterconnectOutageNotification struct { + // AffectedCircuits: Iff issue_type is IT_PARTIAL_OUTAGE, a list of the + // Google-side circuit IDs that will be affected. + AffectedCircuits []string `json:"affectedCircuits,omitempty"` + + // Description: Short user-visible description of the purpose of the + // outage. + Description string `json:"description,omitempty"` + + EndTime int64 `json:"endTime,omitempty,string"` + + // Possible values: + // "IT_OUTAGE" + // "IT_PARTIAL_OUTAGE" + IssueType string `json:"issueType,omitempty"` + + // Name: Unique identifier for this outage notification. + Name string `json:"name,omitempty"` + + // Possible values: + // "NSRC_GOOGLE" + Source string `json:"source,omitempty"` + + // StartTime: Scheduled start and end times for the outage (milliseconds + // since Unix epoch). + StartTime int64 `json:"startTime,omitempty,string"` + + // Possible values: + // "NS_ACTIVE" + // "NS_CANCELED" + State string `json:"state,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AffectedCircuits") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AffectedCircuits") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *InterconnectOutageNotification) MarshalJSON() ([]byte, error) { + type noMethod InterconnectOutageNotification + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type InternalIpOwner struct { + // IpCidrRange: IP CIDR range being owned. + IpCidrRange string `json:"ipCidrRange,omitempty"` + + // Owners: URLs of the IP owners of the IP CIDR range. + Owners []string `json:"owners,omitempty"` + + // SystemOwned: Whether this IP CIDR range is reserved for system use. + SystemOwned bool `json:"systemOwned,omitempty"` + + // ForceSendFields is a list of field names (e.g. "IpCidrRange") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "IpCidrRange") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *InternalIpOwner) MarshalJSON() ([]byte, error) { + type noMethod InternalIpOwner + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// IpOwnerList: Contains a list of IP owners. +type IpOwnerList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. + Id string `json:"id,omitempty"` + + // Items: A list of InternalIpOwner resources. + Items []*InternalIpOwner `json:"items,omitempty"` + + // Kind: [Output Only] Type of resource. Always compute#ipOwnerList for + // lists of IP owners. + Kind string `json:"kind,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *IpOwnerList) MarshalJSON() ([]byte, error) { + type noMethod IpOwnerList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // License: A license resource. type License struct { - // ChargesUseFee: [Output Only] If true, the customer will be charged - // license fee for running software that contains this license on an - // instance. + // ChargesUseFee: [Output Only] Deprecated. This field no longer + // reflects whether a license charges a usage fee. ChargesUseFee bool `json:"chargesUseFee,omitempty"` // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text @@ -10780,11 +11417,11 @@ func (s *LicenseResourceRequirements) MarshalJSON() ([]byte, error) { } type LicensesListResponse struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of License resources. + // Items: A list of License resources. Items []*License `json:"items,omitempty"` // NextPageToken: [Output Only] This token allows you to get the next @@ -10827,10 +11464,13 @@ func (s *LicensesListResponse) MarshalJSON() ([]byte, error) { // LogConfig: Specifies what kind of log the caller must write type LogConfig struct { + // CloudAudit: Cloud audit options. + CloudAudit *LogConfigCloudAuditOptions `json:"cloudAudit,omitempty"` + // Counter: Counter options. Counter *LogConfigCounterOptions `json:"counter,omitempty"` - // ForceSendFields is a list of field names (e.g. "Counter") to + // ForceSendFields is a list of field names (e.g. "CloudAudit") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the @@ -10838,7 +11478,7 @@ type LogConfig struct { // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "Counter") to include in + // NullFields is a list of field names (e.g. "CloudAudit") to include in // API requests with the JSON null value. By default, fields with empty // values are omitted from API requests. However, any field with an // empty value appearing in NullFields will be sent to the server as @@ -10853,6 +11493,45 @@ func (s *LogConfig) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// LogConfigCloudAuditOptions: Write a Cloud Audit log +type LogConfigCloudAuditOptions struct { + // AuthorizationLoggingOptions: Information used by the Cloud Audit + // Logging pipeline. + AuthorizationLoggingOptions *AuthorizationLoggingOptions `json:"authorizationLoggingOptions,omitempty"` + + // LogName: The log_name to populate in the Cloud Audit Record. + // + // Possible values: + // "ADMIN_ACTIVITY" + // "DATA_ACCESS" + // "UNSPECIFIED_LOG_NAME" + LogName string `json:"logName,omitempty"` + + // ForceSendFields is a list of field names (e.g. + // "AuthorizationLoggingOptions") to unconditionally include in API + // requests. By default, fields with empty values are omitted from API + // requests. However, any non-pointer, non-interface field appearing in + // ForceSendFields will be sent to the server regardless of whether the + // field is empty or not. This may be used to include empty fields in + // Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. + // "AuthorizationLoggingOptions") to include in API requests with the + // JSON null value. By default, fields with empty values are omitted + // from API requests. However, any field with an empty value appearing + // in NullFields will be sent to the server as null. It is an error if a + // field in this list has a non-empty value. This may be used to include + // null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *LogConfigCloudAuditOptions) MarshalJSON() ([]byte, error) { + type noMethod LogConfigCloudAuditOptions + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // LogConfigCounterOptions: Options for counters type LogConfigCounterOptions struct { // Field: The field value to attribute. @@ -10965,11 +11644,11 @@ func (s *MachineType) MarshalJSON() ([]byte, error) { } type MachineTypeAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped machine type lists. + // Items: A list of MachineTypesScopedList resources. Items map[string]MachineTypesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -11017,11 +11696,11 @@ func (s *MachineTypeAggregatedList) MarshalJSON() ([]byte, error) { // MachineTypeList: Contains a list of machine types. type MachineTypeList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Machine Type resources. + // Items: A list of MachineType resources. Items []*MachineType `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#machineTypeList @@ -11263,6 +11942,9 @@ type ManagedInstance struct { // create or delete the instance. LastAttempt *ManagedInstanceLastAttempt `json:"lastAttempt,omitempty"` + // Override: [Output Only] Override defined for this instance. + Override *ManagedInstanceOverride `json:"override,omitempty"` + // StandbyMode: [Output Only] Standby mode of the instance. This field // is non-empty iff the instance is a standby. // @@ -11391,6 +12073,121 @@ func (s *ManagedInstanceLastAttemptErrorsErrors) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// ManagedInstanceOverride: Overrides of stateful properties for a given +// instance +type ManagedInstanceOverride struct { + // Disks: Disk overrides defined for this instance + Disks []*ManagedInstanceOverrideDiskOverride `json:"disks,omitempty"` + + // Metadata: Metadata overrides defined for this instance. + Metadata []*ManagedInstanceOverrideMetadata `json:"metadata,omitempty"` + + // Origin: [Output Only] Indicates where does the override come from. + // + // Possible values: + // "AUTO_GENERATED" + // "USER_GENERATED" + Origin string `json:"origin,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Disks") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Disks") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ManagedInstanceOverride) MarshalJSON() ([]byte, error) { + type noMethod ManagedInstanceOverride + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type ManagedInstanceOverrideMetadata struct { + // Key: Key for the metadata entry. Keys must conform to the following + // regexp: [a-zA-Z0-9-_]+, and be less than 128 bytes in length. This is + // reflected as part of a URL in the metadata server. Additionally, to + // avoid ambiguity, keys must not conflict with any other metadata keys + // for the project. + Key string `json:"key,omitempty"` + + // Value: Value for the metadata entry. These are free-form strings, and + // only have meaning as interpreted by the image running in the + // instance. The only restriction placed on values is that their size + // must be less than or equal to 262144 bytes (256 KiB). + Value string `json:"value,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Key") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Key") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ManagedInstanceOverrideMetadata) MarshalJSON() ([]byte, error) { + type noMethod ManagedInstanceOverrideMetadata + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type ManagedInstanceOverrideDiskOverride struct { + // DeviceName: The name of the device on the VM + DeviceName string `json:"deviceName,omitempty"` + + // Mode: The mode in which to attach this disk, either READ_WRITE or + // READ_ONLY. If not specified, the default is to attach the disk in + // READ_WRITE mode. + // + // Possible values: + // "READ_ONLY" + // "READ_WRITE" + Mode string `json:"mode,omitempty"` + + // Source: The disk that is/will be mounted + Source string `json:"source,omitempty"` + + // ForceSendFields is a list of field names (e.g. "DeviceName") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "DeviceName") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ManagedInstanceOverrideDiskOverride) MarshalJSON() ([]byte, error) { + type noMethod ManagedInstanceOverrideDiskOverride + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type ManagedInstanceVersion struct { // InstanceTemplate: [Output Only] The intended template of the // instance. This field is empty when current_action is one of { @@ -11476,7 +12273,7 @@ type MetadataItems struct { // Value: Value for the metadata entry. These are free-form strings, and // only have meaning as interpreted by the image running in the // instance. The only restriction placed on values is that their size - // must be less than or equal to 32768 bytes. + // must be less than or equal to 262144 bytes (256 KiB). Value string `json:"value,omitempty"` // ForceSendFields is a list of field names (e.g. "Key") to @@ -11600,6 +12397,11 @@ type Network struct { // Peerings: [Output Only] List of network peerings for the resource. Peerings []*NetworkPeering `json:"peerings,omitempty"` + // RoutingConfig: The network-level routing configuration for this + // network. Used by Cloud Router to determine what type of network-wide + // routing behavior to enforce. + RoutingConfig *NetworkRoutingConfig `json:"routingConfig,omitempty"` + // SelfLink: [Output Only] Server-defined URL for the resource. SelfLink string `json:"selfLink,omitempty"` @@ -11648,6 +12450,12 @@ type NetworkInterface struct { // subnet-mode networks. AliasIpRanges []*AliasIpRange `json:"aliasIpRanges,omitempty"` + // Fingerprint: Fingerprint hash of contents stored in this network + // interface. This field will be ignored when inserting an Instance or + // adding a NetworkInterface. An up-to-date fingerprint must be provided + // in order to update the NetworkInterface. + Fingerprint string `json:"fingerprint,omitempty"` + // Kind: [Output Only] Type of the resource. Always // compute#networkInterface for network interfaces. Kind string `json:"kind,omitempty"` @@ -11716,11 +12524,11 @@ func (s *NetworkInterface) MarshalJSON() ([]byte, error) { // NetworkList: Contains a list of networks. type NetworkList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Network resources. + // Items: A list of Network resources. Items []*Network `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#networkList for @@ -11827,6 +12635,45 @@ func (s *NetworkPeering) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// NetworkRoutingConfig: A routing configuration attached to a network +// resource. The message includes the list of routers associated with +// the network, and a flag indicating the type of routing behavior to +// enforce network-wide. +type NetworkRoutingConfig struct { + // RoutingMode: The network-wide routing mode to use. If set to + // REGIONAL, this network's cloud routers will only advertise routes + // with subnetworks of this network in the same region as the router. If + // set to GLOBAL, this network's cloud routers will advertise routes + // with all subnetworks of this network, across regions. + // + // Possible values: + // "GLOBAL" + // "REGIONAL" + RoutingMode string `json:"routingMode,omitempty"` + + // ForceSendFields is a list of field names (e.g. "RoutingMode") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "RoutingMode") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *NetworkRoutingConfig) MarshalJSON() ([]byte, error) { + type noMethod NetworkRoutingConfig + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type NetworksAddPeeringRequest struct { // AutoCreateRoutes: Whether Google Compute Engine manages the routes // automatically. @@ -12492,6 +13339,36 @@ func (s *PathRule) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type PerInstanceConfig struct { + // Instance: The URL of the instance. Serves as a merge key during + // UpdatePerInstanceConfigs operation. + Instance string `json:"instance,omitempty"` + + Override *ManagedInstanceOverride `json:"override,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Instance") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Instance") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *PerInstanceConfig) MarshalJSON() ([]byte, error) { + type noMethod PerInstanceConfig + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Policy: Defines an Identity and Access Management (IAM) policy. It is // used to specify access control policies for Cloud Platform // resources. @@ -12519,8 +13396,7 @@ type Policy struct { // policy. AuditConfigs []*AuditConfig `json:"auditConfigs,omitempty"` - // Bindings: Associates a list of `members` to a `role`. Multiple - // `bindings` must not be specified for the same `role`. `bindings` with + // Bindings: Associates a list of `members` to a `role`. `bindings` with // no members will result in an error. Bindings []*Binding `json:"bindings,omitempty"` @@ -12625,9 +13501,8 @@ type Project struct { // the Google Cloud Storage bucket where they are stored. UsageExportLocation *UsageExportLocation `json:"usageExportLocation,omitempty"` - // XpnProjectStatus: [Output Only] The role this project has in a Cross - // Project Network (XPN) configuration. Currently only HOST projects are - // differentiated. + // XpnProjectStatus: [Output Only] The role this project has in a shared + // VPC configuration. Currently only HOST projects are differentiated. // // Possible values: // "HOST" @@ -12664,7 +13539,7 @@ func (s *Project) MarshalJSON() ([]byte, error) { } type ProjectsDisableXpnResourceRequest struct { - // XpnResource: XPN resource ID. + // XpnResource: Service resource (a.k.a service project) ID. XpnResource *XpnResourceId `json:"xpnResource,omitempty"` // ForceSendFields is a list of field names (e.g. "XpnResource") to @@ -12691,7 +13566,7 @@ func (s *ProjectsDisableXpnResourceRequest) MarshalJSON() ([]byte, error) { } type ProjectsEnableXpnResourceRequest struct { - // XpnResource: XPN resource ID. + // XpnResource: Service resource (a.k.a service project) ID. XpnResource *XpnResourceId `json:"xpnResource,omitempty"` // ForceSendFields is a list of field names (e.g. "XpnResource") to @@ -12719,7 +13594,8 @@ func (s *ProjectsEnableXpnResourceRequest) MarshalJSON() ([]byte, error) { type ProjectsGetXpnResources struct { // Kind: [Output Only] Type of resource. Always - // compute#projectsGetXpnResources for lists of XPN resources. + // compute#projectsGetXpnResources for lists of service resources (a.k.a + // service projects) Kind string `json:"kind,omitempty"` // NextPageToken: [Output Only] This token allows you to get the next @@ -12730,7 +13606,8 @@ type ProjectsGetXpnResources struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // Resources: XPN resources attached to this project as their XPN host. + // Resources: Serive resources (a.k.a service projects) attached to this + // project as their shared VPC host. Resources []*XpnResourceId `json:"resources,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -12762,8 +13639,8 @@ func (s *ProjectsGetXpnResources) MarshalJSON() ([]byte, error) { type ProjectsListXpnHostsRequest struct { // Organization: Optional organization ID managed by Cloud Resource - // Manager, for which to list XPN host projects. If not specified, the - // organization will be inferred from the project. + // Manager, for which to list shared VPC host projects. If not + // specified, the organization will be inferred from the project. Organization string `json:"organization,omitempty"` // ForceSendFields is a list of field names (e.g. "Organization") to @@ -12824,6 +13701,7 @@ type Quota struct { // Metric: [Output Only] Name of the quota metric. // // Possible values: + // "AMD_S9300_GPUS" // "AUTOSCALERS" // "BACKEND_BUCKETS" // "BACKEND_SERVICES" @@ -12843,11 +13721,15 @@ type Quota struct { // "LOCAL_SSD_TOTAL_GB" // "NETWORKS" // "NVIDIA_K80_GPUS" + // "NVIDIA_P100_GPUS" // "PREEMPTIBLE_CPUS" + // "PREEMPTIBLE_LOCAL_SSD_GB" // "REGIONAL_AUTOSCALERS" // "REGIONAL_INSTANCE_GROUP_MANAGERS" // "ROUTERS" // "ROUTES" + // "SECURITY_POLICIES" + // "SECURITY_POLICY_RULES" // "SNAPSHOTS" // "SSD_TOTAL_GB" // "SSL_CERTIFICATES" @@ -13017,18 +13899,22 @@ func (s *Region) MarshalJSON() ([]byte, error) { // RegionAutoscalerList: Contains a list of autoscalers. type RegionAutoscalerList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A list of autoscalers. + // Items: A list of Autoscaler resources. Items []*Autoscaler `json:"items,omitempty"` // Kind: Type of resource. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -13062,11 +13948,11 @@ func (s *RegionAutoscalerList) MarshalJSON() ([]byte, error) { } type RegionDiskTypeList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Disk Type resources. + // Items: A list of DiskType resources. Items []*DiskType `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -13141,8 +14027,8 @@ func (s *RegionDisksResizeRequest) MarshalJSON() ([]byte, error) { // RegionInstanceGroupList: Contains a list of InstanceGroup resources. type RegionInstanceGroupList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of InstanceGroup resources. @@ -13159,8 +14045,7 @@ type RegionInstanceGroupList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -13190,14 +14075,44 @@ func (s *RegionInstanceGroupList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// RegionInstanceGroupManagerDeleteInstanceConfigReq: +// RegionInstanceGroupManagers.deletePerInstanceConfigs +type RegionInstanceGroupManagerDeleteInstanceConfigReq struct { + // Instances: The list of instances for which we want to delete + // per-instance configs on this managed instance group. + Instances []string `json:"instances,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Instances") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Instances") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *RegionInstanceGroupManagerDeleteInstanceConfigReq) MarshalJSON() ([]byte, error) { + type noMethod RegionInstanceGroupManagerDeleteInstanceConfigReq + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // RegionInstanceGroupManagerList: Contains a list of managed instance // groups. type RegionInstanceGroupManagerList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A list of managed instance groups. + // Items: A list of InstanceGroupManager resources. Items []*InstanceGroupManager `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -13205,12 +14120,15 @@ type RegionInstanceGroupManagerList struct { // groups that exist in th regional scope. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -13240,6 +14158,37 @@ func (s *RegionInstanceGroupManagerList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// RegionInstanceGroupManagerUpdateInstanceConfigReq: +// RegionInstanceGroupManagers.updatePerInstanceConfigs +type RegionInstanceGroupManagerUpdateInstanceConfigReq struct { + // PerInstanceConfigs: The list of per-instance configs to insert or + // patch on this managed instance group. + PerInstanceConfigs []*PerInstanceConfig `json:"perInstanceConfigs,omitempty"` + + // ForceSendFields is a list of field names (e.g. "PerInstanceConfigs") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "PerInstanceConfigs") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *RegionInstanceGroupManagerUpdateInstanceConfigReq) MarshalJSON() ([]byte, error) { + type noMethod RegionInstanceGroupManagerUpdateInstanceConfigReq + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type RegionInstanceGroupManagersAbandonInstancesRequest struct { // Instances: The URLs of one or more instances to abandon. This can be // a full URL or a partial URL, such as @@ -13269,6 +14218,56 @@ func (s *RegionInstanceGroupManagersAbandonInstancesRequest) MarshalJSON() ([]by return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// RegionInstanceGroupManagersApplyUpdatesRequest: +// InstanceGroupManagers.applyUpdatesToInstances +type RegionInstanceGroupManagersApplyUpdatesRequest struct { + // Instances: The list of instances for which we want to apply changes + // on this managed instance group. + Instances []string `json:"instances,omitempty"` + + // MaximalAction: The maximal action that should be perfomed on the + // instances. By default REPLACE. + // + // Possible values: + // "NONE" + // "REFRESH" + // "REPLACE" + // "RESTART" + MaximalAction string `json:"maximalAction,omitempty"` + + // MinimalAction: The minimal action that should be perfomed on the + // instances. By default NONE. + // + // Possible values: + // "NONE" + // "REFRESH" + // "REPLACE" + // "RESTART" + MinimalAction string `json:"minimalAction,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Instances") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Instances") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *RegionInstanceGroupManagersApplyUpdatesRequest) MarshalJSON() ([]byte, error) { + type noMethod RegionInstanceGroupManagersApplyUpdatesRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type RegionInstanceGroupManagersDeleteInstancesRequest struct { // Instances: The URLs of one or more instances to delete. This can be a // full URL or a partial URL, such as @@ -13298,6 +14297,45 @@ func (s *RegionInstanceGroupManagersDeleteInstancesRequest) MarshalJSON() ([]byt return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type RegionInstanceGroupManagersListInstanceConfigsResp struct { + // Items: [Output Only] The list of PerInstanceConfig. + Items []*PerInstanceConfig `json:"items,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Items") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Items") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *RegionInstanceGroupManagersListInstanceConfigsResp) MarshalJSON() ([]byte, error) { + type noMethod RegionInstanceGroupManagersListInstanceConfigsResp + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type RegionInstanceGroupManagersListInstancesResponse struct { // ManagedInstances: List of managed instances. ManagedInstances []*ManagedInstance `json:"managedInstances,omitempty"` @@ -13458,12 +14496,11 @@ func (s *RegionInstanceGroupManagersSetTemplateRequest) MarshalJSON() ([]byte, e } type RegionInstanceGroupsListInstances struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` - // Items: A list of instances and any named ports that are assigned to - // those instances. + // Items: A list of InstanceWithNamedPorts resources. Items []*InstanceWithNamedPorts `json:"items,omitempty"` // Kind: The resource type. @@ -13477,7 +14514,7 @@ type RegionInstanceGroupsListInstances struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -13582,11 +14619,11 @@ func (s *RegionInstanceGroupsSetNamedPortsRequest) MarshalJSON() ([]byte, error) // RegionList: Contains a list of region resources. type RegionList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Region resources. + // Items: A list of Region resources. Items []*Region `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#regionList for @@ -13671,10 +14708,13 @@ func (s *RegionSetLabelsRequest) MarshalJSON() ([]byte, error) { // Commitment is composed of one or more of these). type ResourceCommitment struct { // Amount: The amount of the resource purchased (in a type-dependent - // unit, such as bytes). + // unit, such as bytes). For vCPUs, this can just be an integer. For + // memory, this must be provided in MB. Memory must be a multiple of 256 + // MB, with up to 6.5GB of memory per every vCPU. Amount int64 `json:"amount,omitempty,string"` - // Type: Type of resource for which this commitment applies. + // Type: Type of resource for which this commitment applies. Possible + // values are VCPU and MEMORY // // Possible values: // "LOCAL_SSD" @@ -13739,7 +14779,7 @@ func (s *ResourceGroupReference) MarshalJSON() ([]byte, error) { // instances by tags and the set of routes for a particular instance is // called its routing table. // -// For each packet leaving a instance, the system searches that +// For each packet leaving an instance, the system searches that // instance's routing table for a single best matching route. Routes // match packets by destination IP address, preferring smaller or more // specific ranges over larger ones. If there is a tie, the system @@ -13957,11 +14997,11 @@ func (s *RouteWarningsData) MarshalJSON() ([]byte, error) { // RouteList: Contains a list of Route resources. type RouteList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Route resources. + // Items: A list of Route resources. Items []*Route `json:"items,omitempty"` // Kind: Type of resource. @@ -14116,11 +15156,11 @@ func (s *RouterAdvertisedPrefix) MarshalJSON() ([]byte, error) { // RouterAggregatedList: Contains a list of routers. type RouterAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped router lists. + // Items: A list of Router resources. Items map[string]RoutersScopedList `json:"items,omitempty"` // Kind: Type of resource. @@ -14344,8 +15384,8 @@ func (s *RouterInterface) MarshalJSON() ([]byte, error) { // RouterList: Contains a list of Router resources. type RouterList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of Router resources. @@ -14802,7 +15842,7 @@ type Scheduling struct { // // By default, this is set to true so an instance is automatically // restarted if it is terminated by Compute Engine. - AutomaticRestart bool `json:"automaticRestart,omitempty"` + AutomaticRestart *bool `json:"automaticRestart,omitempty"` // OnHostMaintenance: Defines the maintenance behavior for this // instance. For standard instances, the default behavior is MIGRATE. @@ -14845,11 +15885,11 @@ func (s *Scheduling) MarshalJSON() ([]byte, error) { } type SecurityPoliciesList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of SecurityPolicy resources. + // Items: A list of SecurityPolicy resources. Items []*SecurityPolicy `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -14996,7 +16036,7 @@ func (s *SecurityPolicyReference) MarshalJSON() ([]byte, error) { // SecurityPolicyRule: Represents a rule that describes one or more // match conditions along with the action to be taken when traffic -// matches this condition (allow or deny) +// matches this condition (allow or deny). type SecurityPolicyRule struct { // Action: The Action to preform when the client connection triggers the // rule. Can currently be either "allow" or "deny()" where valid values @@ -15019,7 +16059,8 @@ type SecurityPolicyRule struct { Preview bool `json:"preview,omitempty"` // Priority: An integer indicating the priority of a rule in the list. - // Rules are evaluated in the increasing order of priority. + // The priority must be a positive value between 0 and 2147483647. Rules + // are evaluated in the increasing order of priority. Priority int64 `json:"priority,omitempty"` // ForceSendFields is a list of field names (e.g. "Action") to @@ -15046,11 +16087,14 @@ func (s *SecurityPolicyRule) MarshalJSON() ([]byte, error) { } // SecurityPolicyRuleMatcher: Represents a match condition that incoming -// traffic is evaluated against. Exactly one of the fields must be set. +// traffic is evaluated against. Exactly one field must be specified. type SecurityPolicyRuleMatcher struct { // SrcIpRanges: CIDR IP address range. Only IPv4 is supported. SrcIpRanges []string `json:"srcIpRanges,omitempty"` + // SrcRegionCodes: Match by country or region code. + SrcRegionCodes []string `json:"srcRegionCodes,omitempty"` + // ForceSendFields is a list of field names (e.g. "SrcIpRanges") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, @@ -15231,6 +16275,10 @@ type Snapshot struct { // by the setLabels method. Label values may be empty. Labels map[string]string `json:"labels,omitempty"` + // LicenseCodes: Integer license codes indicating which licenses are + // attached to this snapshot. + LicenseCodes googleapi.Int64s `json:"licenseCodes,omitempty"` + // Licenses: [Output Only] A list of public visible licenses that apply // to this snapshot. This can be because the original image had licenses // attached (such as a Windows image). @@ -15336,11 +16384,11 @@ func (s *Snapshot) MarshalJSON() ([]byte, error) { // SnapshotList: Contains a list of Snapshot resources. type SnapshotList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Snapshot resources. + // Items: A list of Snapshot resources. Items []*Snapshot `json:"items,omitempty"` // Kind: Type of resource. @@ -15454,7 +16502,7 @@ func (s *SslCertificate) MarshalJSON() ([]byte, error) { // SslCertificateList: Contains a list of SslCertificate resources. type SslCertificateList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -15504,16 +16552,41 @@ func (s *SslCertificateList) MarshalJSON() ([]byte, error) { // Subnetwork: A Subnetwork resource. type Subnetwork struct { + // AllowSubnetCidrRoutesOverlap: Whether this subnetwork can conflict + // with static routes. Setting this to true allows this subnetwork's + // primary and secondary ranges to conflict with routes that have + // already been configured on the corresponding network. Static routes + // will take precedence over the subnetwork route if the route prefix + // length is at least as large as the subnetwork prefix length. + // + // Also, packets destined to IPs within subnetwork may contain + // private/sensitive data and are prevented from leaving the virtual + // network. Setting this field to true will disable this feature. + // + // The default value is false and applies to all existing subnetworks + // and automatically created subnetworks. + // + // This field cannot be set to true at resource creation time. + AllowSubnetCidrRoutesOverlap bool `json:"allowSubnetCidrRoutesOverlap,omitempty"` + // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text // format. CreationTimestamp string `json:"creationTimestamp,omitempty"` // Description: An optional description of this resource. Provide this - // property when you create the resource. + // property when you create the resource. This field can be set only at + // resource creation time. Description string `json:"description,omitempty"` + // Fingerprint: Fingerprint of this resource. A hash of the contents + // stored in this object. This field is used in optimistic locking. This + // field will be ignored when inserting a Subnetwork. An up-to-date + // fingerprint must be provided in order to update the Subnetwork. + Fingerprint string `json:"fingerprint,omitempty"` + // GatewayAddress: [Output Only] The gateway address for default routes - // to reach destination addresses outside this subnetwork. + // to reach destination addresses outside this subnetwork. This field + // can be set only at resource creation time. GatewayAddress string `json:"gatewayAddress,omitempty"` // Id: [Output Only] The unique identifier for the resource. This @@ -15523,7 +16596,8 @@ type Subnetwork struct { // IpCidrRange: The range of internal addresses that are owned by this // subnetwork. Provide this property when you create the subnetwork. For // example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and - // non-overlapping within a network. Only IPv4 is supported. + // non-overlapping within a network. Only IPv4 is supported. This field + // can be set only at resource creation time. IpCidrRange string `json:"ipCidrRange,omitempty"` // Kind: [Output Only] Type of the resource. Always compute#subnetwork @@ -15541,14 +16615,18 @@ type Subnetwork struct { // Network: The URL of the network to which this subnetwork belongs, // provided by the client when initially creating the subnetwork. Only - // networks that are in the distributed mode can have subnetworks. + // networks that are in the distributed mode can have subnetworks. This + // field can be set only at resource creation time. Network string `json:"network,omitempty"` // PrivateIpGoogleAccess: Whether the VMs in this subnet can access - // Google services without assigned external IP addresses. + // Google services without assigned external IP addresses. This field + // can be both set at resource creation time and updated using + // setPrivateIpGoogleAccess. PrivateIpGoogleAccess bool `json:"privateIpGoogleAccess,omitempty"` - // Region: URL of the region where the Subnetwork resides. + // Region: URL of the region where the Subnetwork resides. This field + // can be set only at resource creation time. Region string `json:"region,omitempty"` // SecondaryIpRanges: An array of configurations for secondary IP ranges @@ -15564,21 +16642,22 @@ type Subnetwork struct { // server. googleapi.ServerResponse `json:"-"` - // ForceSendFields is a list of field names (e.g. "CreationTimestamp") - // to unconditionally include in API requests. By default, fields with - // empty values are omitted from API requests. However, any non-pointer, - // non-interface field appearing in ForceSendFields will be sent to the - // server regardless of whether the field is empty or not. This may be - // used to include empty fields in Patch requests. + // ForceSendFields is a list of field names (e.g. + // "AllowSubnetCidrRoutesOverlap") to unconditionally include in API + // requests. By default, fields with empty values are omitted from API + // requests. However, any non-pointer, non-interface field appearing in + // ForceSendFields will be sent to the server regardless of whether the + // field is empty or not. This may be used to include empty fields in + // Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "CreationTimestamp") to - // include in API requests with the JSON null value. By default, fields - // with empty values are omitted from API requests. However, any field - // with an empty value appearing in NullFields will be sent to the - // server as null. It is an error if a field in this list has a - // non-empty value. This may be used to include null fields in Patch - // requests. + // NullFields is a list of field names (e.g. + // "AllowSubnetCidrRoutesOverlap") to include in API requests with the + // JSON null value. By default, fields with empty values are omitted + // from API requests. However, any field with an empty value appearing + // in NullFields will be sent to the server as null. It is an error if a + // field in this list has a non-empty value. This may be used to include + // null fields in Patch requests. NullFields []string `json:"-"` } @@ -15589,11 +16668,11 @@ func (s *Subnetwork) MarshalJSON() ([]byte, error) { } type SubnetworkAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output] A map of scoped Subnetwork lists. + // Items: A list of SubnetworksScopedList resources. Items map[string]SubnetworksScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -15640,11 +16719,11 @@ func (s *SubnetworkAggregatedList) MarshalJSON() ([]byte, error) { // SubnetworkList: Contains a list of Subnetwork resources. type SubnetworkList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: The Subnetwork resources. + // Items: A list of Subnetwork resources. Items []*Subnetwork `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#subnetworkList @@ -16070,8 +17149,8 @@ func (s *TargetHttpProxy) MarshalJSON() ([]byte, error) { // TargetHttpProxyList: A list of TargetHttpProxy resources. type TargetHttpProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetHttpProxy resources. @@ -16119,6 +17198,38 @@ func (s *TargetHttpProxyList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type TargetHttpsProxiesSetQuicOverrideRequest struct { + // QuicOverride: QUIC policy for the TargetHttpsProxy resource. + // + // Possible values: + // "DISABLE" + // "ENABLE" + // "NONE" + QuicOverride string `json:"quicOverride,omitempty"` + + // ForceSendFields is a list of field names (e.g. "QuicOverride") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "QuicOverride") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *TargetHttpsProxiesSetQuicOverrideRequest) MarshalJSON() ([]byte, error) { + type noMethod TargetHttpsProxiesSetQuicOverrideRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type TargetHttpsProxiesSetSslCertificatesRequest struct { // SslCertificates: New set of SslCertificate resources to associate // with this TargetHttpsProxy resource. Currently exactly one @@ -16181,6 +17292,21 @@ type TargetHttpsProxy struct { // last character, which cannot be a dash. Name string `json:"name,omitempty"` + // QuicOverride: Specifies the QUIC override policy for this + // TargetHttpsProxy resource. This determines whether the load balancer + // will attempt to negotiate QUIC with clients or not. Can specify one + // of NONE, ENABLE, or DISABLE. Specify ENABLE to always enable QUIC, + // Enables QUIC when set to ENABLE, and disables QUIC when set to + // DISABLE. If NONE is specified, uses the QUIC policy with no user + // overrides, which is equivalent to DISABLE. Not specifying this field + // is equivalent to specifying NONE. + // + // Possible values: + // "DISABLE" + // "ENABLE" + // "NONE" + QuicOverride string `json:"quicOverride,omitempty"` + // SelfLink: [Output Only] Server-defined URL for the resource. SelfLink string `json:"selfLink,omitempty"` @@ -16228,8 +17354,8 @@ func (s *TargetHttpsProxy) MarshalJSON() ([]byte, error) { // TargetHttpsProxyList: Contains a list of TargetHttpsProxy resources. type TargetHttpsProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetHttpsProxy resources. @@ -16362,7 +17488,7 @@ type TargetInstanceAggregatedList struct { // server. Id string `json:"id,omitempty"` - // Items: A map of scoped target instance lists. + // Items: A list of TargetInstance resources. Items map[string]TargetInstancesScopedList `json:"items,omitempty"` // Kind: Type of resource. @@ -16408,8 +17534,8 @@ func (s *TargetInstanceAggregatedList) MarshalJSON() ([]byte, error) { // TargetInstanceList: Contains a list of TargetInstance resources. type TargetInstanceList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetInstance resources. @@ -16728,11 +17854,11 @@ func (s *TargetPool) UnmarshalJSON(data []byte) error { } type TargetPoolAggregatedList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped target pool lists. + // Items: A list of TargetPool resources. Items map[string]TargetPoolsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -16815,7 +17941,7 @@ func (s *TargetPoolInstanceHealth) MarshalJSON() ([]byte, error) { // TargetPoolList: Contains a list of TargetPool resources. type TargetPoolList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -17308,8 +18434,8 @@ func (s *TargetSslProxy) MarshalJSON() ([]byte, error) { // TargetSslProxyList: Contains a list of TargetSslProxy resources. type TargetSslProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetSslProxy resources. @@ -17489,8 +18615,8 @@ func (s *TargetTcpProxy) MarshalJSON() ([]byte, error) { // TargetTcpProxyList: Contains a list of TargetTcpProxy resources. type TargetTcpProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetTcpProxy resources. @@ -17623,11 +18749,11 @@ func (s *TargetVpnGateway) MarshalJSON() ([]byte, error) { } type TargetVpnGatewayAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped target vpn gateway lists. + // Items: A list of TargetVpnGateway resources. Items map[string]TargetVpnGatewaysScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#targetVpnGateway @@ -17674,11 +18800,11 @@ func (s *TargetVpnGatewayAggregatedList) MarshalJSON() ([]byte, error) { // TargetVpnGatewayList: Contains a list of TargetVpnGateway resources. type TargetVpnGatewayList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of TargetVpnGateway resources. + // Items: A list of TargetVpnGateway resources. Items []*TargetVpnGateway `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#targetVpnGateway @@ -18068,7 +19194,7 @@ func (s *UrlMap) MarshalJSON() ([]byte, error) { // UrlMapList: Contains a list of UrlMap resources. type UrlMapList struct { - // Id: [Output Only] Unique identifier for the resource. Set by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -18451,11 +19577,11 @@ func (s *VpnTunnel) MarshalJSON() ([]byte, error) { } type VpnTunnelAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped vpn tunnel lists. + // Items: A list of VpnTunnelsScopedList resources. Items map[string]VpnTunnelsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#vpnTunnel for @@ -18502,11 +19628,11 @@ func (s *VpnTunnelAggregatedList) MarshalJSON() ([]byte, error) { // VpnTunnelList: Contains a list of VpnTunnel resources. type VpnTunnelList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of VpnTunnel resources. + // Items: A list of VpnTunnel resources. Items []*VpnTunnel `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#vpnTunnel for @@ -18679,15 +19805,15 @@ func (s *VpnTunnelsScopedListWarningData) MarshalJSON() ([]byte, error) { } type XpnHostList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of XPN host project URLs. + // Items: [Output Only] A list of shared VPC host project URLs. Items []*Project `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#xpnHostList for - // lists of XPN hosts. + // lists of shared VPC hosts. Kind string `json:"kind,omitempty"` // NextPageToken: [Output Only] This token allows you to get the next @@ -18728,13 +19854,14 @@ func (s *XpnHostList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } -// XpnResourceId: XpnResourceId +// XpnResourceId: Service resource (a.k.a service project) ID. type XpnResourceId struct { - // Id: The ID of the XPN resource. In the case of projects, this field - // matches the project's name, not the canonical ID. + // Id: The ID of the service resource. In the case of projects, this + // field matches the project ID (e.g., my-project), not the project + // number (e.g., 12345678). Id string `json:"id,omitempty"` - // Type: The type of the XPN resource. + // Type: The type of the service resource. // // Possible values: // "PROJECT" @@ -18841,7 +19968,7 @@ type ZoneList struct { // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Zone resources. + // Items: A list of Zone resources. Items []*Zone `json:"items,omitempty"` // Kind: Type of resource. @@ -18939,10 +20066,9 @@ func (r *AcceleratorTypesService) AggregatedList(project string) *AcceleratorTyp return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -18954,7 +20080,7 @@ func (r *AcceleratorTypesService) AggregatedList(project string) *AcceleratorTyp // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -19109,7 +20235,7 @@ func (c *AcceleratorTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (* // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -19357,10 +20483,9 @@ func (r *AcceleratorTypesService) List(project string, zone string) *Accelerator return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -19372,7 +20497,7 @@ func (r *AcceleratorTypesService) List(project string, zone string) *Accelerator // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -19529,7 +20654,7 @@ func (c *AcceleratorTypesListCall) Do(opts ...googleapi.CallOption) (*Accelerato // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -19619,10 +20744,9 @@ func (r *AddressesService) AggregatedList(project string) *AddressesAggregatedLi return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -19634,7 +20758,7 @@ func (r *AddressesService) AggregatedList(project string) *AddressesAggregatedLi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -19789,7 +20913,7 @@ func (c *AddressesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Address // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -19875,8 +20999,20 @@ func (r *AddressesService) Delete(project string, region string, address string) return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *AddressesDeleteCall) RequestId(requestId string) *AddressesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -19996,7 +21132,7 @@ func (c *AddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -20199,8 +21335,20 @@ func (r *AddressesService) Insert(project string, region string, address *Addres return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *AddressesInsertCall) RequestId(requestId string) *AddressesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -20316,7 +21464,7 @@ func (c *AddressesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -20358,10 +21506,9 @@ func (r *AddressesService) List(project string, region string) *AddressesListCal return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -20373,7 +21520,7 @@ func (r *AddressesService) List(project string, region string) *AddressesListCal // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -20530,7 +21677,7 @@ func (c *AddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, erro // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -20615,7 +21762,7 @@ type AddressesSetLabelsCall struct { } // SetLabels: Sets the labels on an Address. To learn more about labels, -// read the Labeling or Tagging Resources documentation. +// read the Labeling Resources documentation. func (r *AddressesService) SetLabels(project string, region string, resource string, regionsetlabelsrequest *RegionSetLabelsRequest) *AddressesSetLabelsCall { c := &AddressesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -20625,8 +21772,20 @@ func (r *AddressesService) SetLabels(project string, region string, resource str return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *AddressesSetLabelsCall) RequestId(requestId string) *AddressesSetLabelsCall { c.urlParams_.Set("requestId", requestId) return c @@ -20720,7 +21879,7 @@ func (c *AddressesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, e } return ret, nil // { - // "description": "Sets the labels on an Address. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on an Address. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.addresses.setLabels", // "parameterOrder": [ @@ -20744,7 +21903,7 @@ func (c *AddressesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -20948,10 +22107,9 @@ func (r *AutoscalersService) AggregatedList(project string) *AutoscalersAggregat return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -20963,7 +22121,7 @@ func (r *AutoscalersService) AggregatedList(project string) *AutoscalersAggregat // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -21118,7 +22276,7 @@ func (c *AutoscalersAggregatedListCall) Do(opts ...googleapi.CallOption) (*Autos // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -21203,8 +22361,20 @@ func (r *AutoscalersService) Delete(project string, zone string, autoscaler stri return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *AutoscalersDeleteCall) RequestId(requestId string) *AutoscalersDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -21317,7 +22487,7 @@ func (c *AutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -21526,8 +22696,20 @@ func (r *AutoscalersService) Insert(project string, zone string, autoscaler *Aut return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *AutoscalersInsertCall) RequestId(requestId string) *AutoscalersInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -21636,7 +22818,7 @@ func (c *AutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -21684,10 +22866,9 @@ func (r *AutoscalersService) List(project string, zone string) *AutoscalersListC return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -21699,7 +22880,7 @@ func (r *AutoscalersService) List(project string, zone string) *AutoscalersListC // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -21856,7 +23037,7 @@ func (c *AutoscalersListCall) Do(opts ...googleapi.CallOption) (*AutoscalerList, // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -21940,7 +23121,8 @@ type AutoscalersPatchCall struct { } // Patch: Updates an autoscaler in the specified project using the data -// included in the request. This method supports patch semantics. +// included in the request. This method supports PATCH semantics and +// uses the JSON merge patch format and processing rules. func (r *AutoscalersService) Patch(project string, zone string, autoscaler *Autoscaler) *AutoscalersPatchCall { c := &AutoscalersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -21956,8 +23138,20 @@ func (c *AutoscalersPatchCall) Autoscaler(autoscaler string) *AutoscalersPatchCa return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *AutoscalersPatchCall) RequestId(requestId string) *AutoscalersPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -22050,7 +23244,7 @@ func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, err } return ret, nil // { - // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.autoscalers.patch", // "parameterOrder": [ @@ -22072,7 +23266,7 @@ func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, err // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -22288,8 +23482,20 @@ func (c *AutoscalersUpdateCall) Autoscaler(autoscaler string) *AutoscalersUpdate return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *AutoscalersUpdateCall) RequestId(requestId string) *AutoscalersUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -22404,7 +23610,7 @@ func (c *AutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -22452,8 +23658,20 @@ func (r *BackendBucketsService) AddSignedUrlKey(project string, backendBucket st return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendBucketsAddSignedUrlKeyCall) RequestId(requestId string) *BackendBucketsAddSignedUrlKeyCall { c.urlParams_.Set("requestId", requestId) return c @@ -22568,7 +23786,7 @@ func (c *BackendBucketsAddSignedUrlKeyCall) Do(opts ...googleapi.CallOption) (*O // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -22607,8 +23825,20 @@ func (r *BackendBucketsService) Delete(project string, backendBucket string) *Ba return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendBucketsDeleteCall) RequestId(requestId string) *BackendBucketsDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -22719,7 +23949,7 @@ func (c *BackendBucketsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -22757,8 +23987,20 @@ func (r *BackendBucketsService) DeleteSignedUrlKey(project string, backendBucket return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendBucketsDeleteSignedUrlKeyCall) RequestId(requestId string) *BackendBucketsDeleteSignedUrlKeyCall { c.urlParams_.Set("requestId", requestId) return c @@ -22875,7 +24117,7 @@ func (c *BackendBucketsDeleteSignedUrlKeyCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -23216,8 +24458,20 @@ func (r *BackendBucketsService) Insert(project string, backendbucket *BackendBuc return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendBucketsInsertCall) RequestId(requestId string) *BackendBucketsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -23324,7 +24578,7 @@ func (c *BackendBucketsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -23363,10 +24617,9 @@ func (r *BackendBucketsService) List(project string) *BackendBucketsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -23378,7 +24631,7 @@ func (r *BackendBucketsService) List(project string) *BackendBucketsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -23533,7 +24786,7 @@ func (c *BackendBucketsListCall) Do(opts ...googleapi.CallOption) (*BackendBucke // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -23610,7 +24863,8 @@ type BackendBucketsPatchCall struct { } // Patch: Updates the specified BackendBucket resource with the data -// included in the request. This method supports patch semantics. +// included in the request. This method supports PATCH semantics and +// uses the JSON merge patch format and processing rules. func (r *BackendBucketsService) Patch(project string, backendBucket string, backendbucket *BackendBucket) *BackendBucketsPatchCall { c := &BackendBucketsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -23619,8 +24873,20 @@ func (r *BackendBucketsService) Patch(project string, backendBucket string, back return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendBucketsPatchCall) RequestId(requestId string) *BackendBucketsPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -23713,7 +24979,7 @@ func (c *BackendBucketsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports patch semantics.", + // "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.backendBuckets.patch", // "parameterOrder": [ @@ -23736,7 +25002,7 @@ func (c *BackendBucketsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -24074,8 +25340,20 @@ func (r *BackendBucketsService) Update(project string, backendBucket string, bac return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendBucketsUpdateCall) RequestId(requestId string) *BackendBucketsUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -24191,7 +25469,7 @@ func (c *BackendBucketsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -24233,8 +25511,20 @@ func (r *BackendServicesService) AddSignedUrlKey(project string, backendService return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendServicesAddSignedUrlKeyCall) RequestId(requestId string) *BackendServicesAddSignedUrlKeyCall { c.urlParams_.Set("requestId", requestId) return c @@ -24349,7 +25639,7 @@ func (c *BackendServicesAddSignedUrlKeyCall) Do(opts ...googleapi.CallOption) (* // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -24388,10 +25678,9 @@ func (r *BackendServicesService) AggregatedList(project string) *BackendServices return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -24403,7 +25692,7 @@ func (r *BackendServicesService) AggregatedList(project string) *BackendServices // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -24558,7 +25847,7 @@ func (c *BackendServicesAggregatedListCall) Do(opts ...googleapi.CallOption) (*B // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -24642,8 +25931,20 @@ func (r *BackendServicesService) Delete(project string, backendService string) * return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendServicesDeleteCall) RequestId(requestId string) *BackendServicesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -24754,7 +26055,7 @@ func (c *BackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -24792,8 +26093,20 @@ func (r *BackendServicesService) DeleteSignedUrlKey(project string, backendServi return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendServicesDeleteSignedUrlKeyCall) RequestId(requestId string) *BackendServicesDeleteSignedUrlKeyCall { c.urlParams_.Set("requestId", requestId) return c @@ -24910,7 +26223,7 @@ func (c *BackendServicesDeleteSignedUrlKeyCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -25251,8 +26564,20 @@ func (r *BackendServicesService) Insert(project string, backendservice *BackendS return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendServicesInsertCall) RequestId(requestId string) *BackendServicesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -25359,7 +26684,7 @@ func (c *BackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -25399,10 +26724,9 @@ func (r *BackendServicesService) List(project string) *BackendServicesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -25414,7 +26738,7 @@ func (r *BackendServicesService) List(project string) *BackendServicesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -25569,7 +26893,7 @@ func (c *BackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServ // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -25649,7 +26973,8 @@ type BackendServicesPatchCall struct { // included in the request. There are several restrictions and // guidelines to keep in mind when updating a backend service. Read // Restrictions and Guidelines for more information. This method -// supports patch semantics. +// supports PATCH semantics and uses the JSON merge patch format and +// processing rules. // For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/patch func (r *BackendServicesService) Patch(project string, backendService string, backendservice *BackendService) *BackendServicesPatchCall { c := &BackendServicesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -25659,8 +26984,20 @@ func (r *BackendServicesService) Patch(project string, backendService string, ba return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendServicesPatchCall) RequestId(requestId string) *BackendServicesPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -25753,7 +27090,7 @@ func (c *BackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + // "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.backendServices.patch", // "parameterOrder": [ @@ -25776,7 +27113,7 @@ func (c *BackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -25819,8 +27156,20 @@ func (r *BackendServicesService) SetSecurityPolicy(project string, backendServic return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendServicesSetSecurityPolicyCall) RequestId(requestId string) *BackendServicesSetSecurityPolicyCall { c.urlParams_.Set("requestId", requestId) return c @@ -25935,7 +27284,7 @@ func (c *BackendServicesSetSecurityPolicyCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -26128,8 +27477,20 @@ func (r *BackendServicesService) Update(project string, backendService string, b return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *BackendServicesUpdateCall) RequestId(requestId string) *BackendServicesUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -26245,7 +27606,7 @@ func (c *BackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -26432,10 +27793,9 @@ func (r *DiskTypesService) AggregatedList(project string) *DiskTypesAggregatedLi return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -26447,7 +27807,7 @@ func (r *DiskTypesService) AggregatedList(project string) *DiskTypesAggregatedLi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -26602,7 +27962,7 @@ func (c *DiskTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskTyp // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -26852,10 +28212,9 @@ func (r *DiskTypesService) List(project string, zone string) *DiskTypesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -26867,7 +28226,7 @@ func (r *DiskTypesService) List(project string, zone string) *DiskTypesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -27024,7 +28383,7 @@ func (c *DiskTypesListCall) Do(opts ...googleapi.CallOption) (*DiskTypeList, err // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -27114,10 +28473,9 @@ func (r *DisksService) AggregatedList(project string) *DisksAggregatedListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -27129,7 +28487,7 @@ func (r *DisksService) AggregatedList(project string) *DisksAggregatedListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -27284,7 +28642,7 @@ func (c *DisksAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskAggrega // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -27378,8 +28736,20 @@ func (c *DisksCreateSnapshotCall) GuestFlush(guestFlush bool) *DisksCreateSnapsh return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *DisksCreateSnapshotCall) RequestId(requestId string) *DisksCreateSnapshotCall { c.urlParams_.Set("requestId", requestId) return c @@ -27501,7 +28871,7 @@ func (c *DisksCreateSnapshotCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -27553,8 +28923,20 @@ func (r *DisksService) Delete(project string, zone string, disk string) *DisksDe return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *DisksDeleteCall) RequestId(requestId string) *DisksDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -27666,7 +29048,7 @@ func (c *DisksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -28043,8 +29425,20 @@ func (r *DisksService) Insert(project string, zone string, disk *Disk) *DisksIns return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *DisksInsertCall) RequestId(requestId string) *DisksInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -28160,7 +29554,7 @@ func (c *DisksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -28214,10 +29608,9 @@ func (r *DisksService) List(project string, zone string) *DisksListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -28229,7 +29622,7 @@ func (r *DisksService) List(project string, zone string) *DisksListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -28386,7 +29779,7 @@ func (c *DisksListCall) Do(opts ...googleapi.CallOption) (*DiskList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -28480,8 +29873,20 @@ func (r *DisksService) Resize(project string, zone string, disk string, disksres return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *DisksResizeCall) RequestId(requestId string) *DisksResizeCall { c.urlParams_.Set("requestId", requestId) return c @@ -28599,7 +30004,7 @@ func (c *DisksResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -28798,7 +30203,7 @@ type DisksSetLabelsCall struct { } // SetLabels: Sets the labels on a disk. To learn more about labels, -// read the Labeling or Tagging Resources documentation. +// read the Labeling Resources documentation. func (r *DisksService) SetLabels(project string, zone string, resource string, zonesetlabelsrequest *ZoneSetLabelsRequest) *DisksSetLabelsCall { c := &DisksSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -28808,8 +30213,20 @@ func (r *DisksService) SetLabels(project string, zone string, resource string, z return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *DisksSetLabelsCall) RequestId(requestId string) *DisksSetLabelsCall { c.urlParams_.Set("requestId", requestId) return c @@ -28903,7 +30320,7 @@ func (c *DisksSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error } return ret, nil // { - // "description": "Sets the labels on a disk. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on a disk. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.disks.setLabels", // "parameterOrder": [ @@ -28920,7 +30337,7 @@ func (c *DisksSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -29133,8 +30550,20 @@ func (r *FirewallsService) Delete(project string, firewall string) *FirewallsDel return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *FirewallsDeleteCall) RequestId(requestId string) *FirewallsDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -29245,7 +30674,7 @@ func (c *FirewallsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -29435,8 +30864,20 @@ func (r *FirewallsService) Insert(project string, firewall *Firewall) *Firewalls return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *FirewallsInsertCall) RequestId(requestId string) *FirewallsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -29543,7 +30984,7 @@ func (c *FirewallsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -29583,10 +31024,9 @@ func (r *FirewallsService) List(project string) *FirewallsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -29598,7 +31038,7 @@ func (r *FirewallsService) List(project string) *FirewallsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -29753,7 +31193,7 @@ func (c *FirewallsListCall) Do(opts ...googleapi.CallOption) (*FirewallList, err // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -29830,7 +31270,8 @@ type FirewallsPatchCall struct { } // Patch: Updates the specified firewall rule with the data included in -// the request. This method supports patch semantics. +// the request. This method supports PATCH semantics and uses the JSON +// merge patch format and processing rules. // For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/patch func (r *FirewallsService) Patch(project string, firewall string, firewall2 *Firewall) *FirewallsPatchCall { c := &FirewallsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -29840,8 +31281,20 @@ func (r *FirewallsService) Patch(project string, firewall string, firewall2 *Fir return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *FirewallsPatchCall) RequestId(requestId string) *FirewallsPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -29934,7 +31387,7 @@ func (c *FirewallsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error } return ret, nil // { - // "description": "Updates the specified firewall rule with the data included in the request. This method supports patch semantics.", + // "description": "Updates the specified firewall rule with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.firewalls.patch", // "parameterOrder": [ @@ -29957,7 +31410,7 @@ func (c *FirewallsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -30151,8 +31604,20 @@ func (r *FirewallsService) Update(project string, firewall string, firewall2 *Fi return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *FirewallsUpdateCall) RequestId(requestId string) *FirewallsUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -30268,7 +31733,7 @@ func (c *FirewallsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -30307,10 +31772,9 @@ func (r *ForwardingRulesService) AggregatedList(project string) *ForwardingRules return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -30322,7 +31786,7 @@ func (r *ForwardingRulesService) AggregatedList(project string) *ForwardingRules // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -30477,7 +31941,7 @@ func (c *ForwardingRulesAggregatedListCall) Do(opts ...googleapi.CallOption) (*F // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -30563,8 +32027,20 @@ func (r *ForwardingRulesService) Delete(project string, region string, forwardin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ForwardingRulesDeleteCall) RequestId(requestId string) *ForwardingRulesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -30684,7 +32160,7 @@ func (c *ForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -30887,8 +32363,20 @@ func (r *ForwardingRulesService) Insert(project string, region string, forwardin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ForwardingRulesInsertCall) RequestId(requestId string) *ForwardingRulesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -31004,7 +32492,7 @@ func (c *ForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -31046,10 +32534,9 @@ func (r *ForwardingRulesService) List(project string, region string) *Forwarding return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -31061,7 +32548,7 @@ func (r *ForwardingRulesService) List(project string, region string) *Forwarding // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -31218,7 +32705,7 @@ func (c *ForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingR // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -31303,8 +32790,9 @@ type ForwardingRulesPatchCall struct { } // Patch: Updates the specified forwarding rule with the data included -// in the request. This method supports patch semantics. Currently it -// only allow to patch network_tier field. +// in the request. This method supports PATCH semantics and uses the +// JSON merge patch format and processing rules. Currently, you can only +// patch the network_tier field. func (r *ForwardingRulesService) Patch(project string, region string, forwardingRule string, forwardingrule *ForwardingRule) *ForwardingRulesPatchCall { c := &ForwardingRulesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -31314,8 +32802,20 @@ func (r *ForwardingRulesService) Patch(project string, region string, forwarding return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ForwardingRulesPatchCall) RequestId(requestId string) *ForwardingRulesPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -31409,7 +32909,7 @@ func (c *ForwardingRulesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Updates the specified forwarding rule with the data included in the request. This method supports patch semantics. Currently it only allow to patch network_tier field.", + // "description": "Updates the specified forwarding rule with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules. Currently, you can only patch the network_tier field.", // "httpMethod": "PATCH", // "id": "compute.forwardingRules.patch", // "parameterOrder": [ @@ -31440,7 +32940,7 @@ func (c *ForwardingRulesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -31475,7 +32975,7 @@ type ForwardingRulesSetLabelsCall struct { } // SetLabels: Sets the labels on the specified resource. To learn more -// about labels, read the Labeling or Tagging Resources documentation. +// about labels, read the Labeling Resources documentation. func (r *ForwardingRulesService) SetLabels(project string, region string, resource string, regionsetlabelsrequest *RegionSetLabelsRequest) *ForwardingRulesSetLabelsCall { c := &ForwardingRulesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -31485,8 +32985,20 @@ func (r *ForwardingRulesService) SetLabels(project string, region string, resour return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ForwardingRulesSetLabelsCall) RequestId(requestId string) *ForwardingRulesSetLabelsCall { c.urlParams_.Set("requestId", requestId) return c @@ -31580,7 +33092,7 @@ func (c *ForwardingRulesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operat } return ret, nil // { - // "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.forwardingRules.setLabels", // "parameterOrder": [ @@ -31604,7 +33116,7 @@ func (c *ForwardingRulesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operat // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -31656,8 +33168,20 @@ func (r *ForwardingRulesService) SetTarget(project string, region string, forwar return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ForwardingRulesSetTargetCall) RequestId(requestId string) *ForwardingRulesSetTargetCall { c.urlParams_.Set("requestId", requestId) return c @@ -31782,7 +33306,7 @@ func (c *ForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (*Operat // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -31981,8 +33505,20 @@ func (r *GlobalAddressesService) Delete(project string, address string) *GlobalA return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *GlobalAddressesDeleteCall) RequestId(requestId string) *GlobalAddressesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -32093,7 +33629,7 @@ func (c *GlobalAddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -32284,8 +33820,20 @@ func (r *GlobalAddressesService) Insert(project string, address *Address) *Globa return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *GlobalAddressesInsertCall) RequestId(requestId string) *GlobalAddressesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -32392,7 +33940,7 @@ func (c *GlobalAddressesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -32431,10 +33979,9 @@ func (r *GlobalAddressesService) List(project string) *GlobalAddressesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -32446,7 +33993,7 @@ func (r *GlobalAddressesService) List(project string) *GlobalAddressesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -32601,7 +34148,7 @@ func (c *GlobalAddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -32678,7 +34225,7 @@ type GlobalAddressesSetLabelsCall struct { } // SetLabels: Sets the labels on a GlobalAddress. To learn more about -// labels, read the Labeling or Tagging Resources documentation. +// labels, read the Labeling Resources documentation. func (r *GlobalAddressesService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *GlobalAddressesSetLabelsCall { c := &GlobalAddressesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -32774,7 +34321,7 @@ func (c *GlobalAddressesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operat } return ret, nil // { - // "description": "Sets the labels on a GlobalAddress. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on a GlobalAddress. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.globalAddresses.setLabels", // "parameterOrder": [ @@ -32980,8 +34527,20 @@ func (r *GlobalForwardingRulesService) Delete(project string, forwardingRule str return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *GlobalForwardingRulesDeleteCall) RequestId(requestId string) *GlobalForwardingRulesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -33092,7 +34651,7 @@ func (c *GlobalForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -33283,8 +34842,20 @@ func (r *GlobalForwardingRulesService) Insert(project string, forwardingrule *Fo return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *GlobalForwardingRulesInsertCall) RequestId(requestId string) *GlobalForwardingRulesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -33391,7 +34962,7 @@ func (c *GlobalForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -33431,10 +35002,9 @@ func (r *GlobalForwardingRulesService) List(project string) *GlobalForwardingRul return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -33446,7 +35016,7 @@ func (r *GlobalForwardingRulesService) List(project string) *GlobalForwardingRul // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -33601,7 +35171,7 @@ func (c *GlobalForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*Forwa // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -33678,8 +35248,9 @@ type GlobalForwardingRulesPatchCall struct { } // Patch: Updates the specified forwarding rule with the data included -// in the request. This method supports patch semantics. Currently it -// only allow to patch network_tier field. +// in the request. This method supports PATCH semantics and uses the +// JSON merge patch format and processing rules. Currently, you can only +// patch the network_tier field. func (r *GlobalForwardingRulesService) Patch(project string, forwardingRule string, forwardingrule *ForwardingRule) *GlobalForwardingRulesPatchCall { c := &GlobalForwardingRulesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -33688,8 +35259,20 @@ func (r *GlobalForwardingRulesService) Patch(project string, forwardingRule stri return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *GlobalForwardingRulesPatchCall) RequestId(requestId string) *GlobalForwardingRulesPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -33782,7 +35365,7 @@ func (c *GlobalForwardingRulesPatchCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Updates the specified forwarding rule with the data included in the request. This method supports patch semantics. Currently it only allow to patch network_tier field.", + // "description": "Updates the specified forwarding rule with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules. Currently, you can only patch the network_tier field.", // "httpMethod": "PATCH", // "id": "compute.globalForwardingRules.patch", // "parameterOrder": [ @@ -33805,7 +35388,7 @@ func (c *GlobalForwardingRulesPatchCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -33839,7 +35422,7 @@ type GlobalForwardingRulesSetLabelsCall struct { } // SetLabels: Sets the labels on the specified resource. To learn more -// about labels, read the Labeling or Tagging Resources documentation. +// about labels, read the Labeling Resources documentation. func (r *GlobalForwardingRulesService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *GlobalForwardingRulesSetLabelsCall { c := &GlobalForwardingRulesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -33935,7 +35518,7 @@ func (c *GlobalForwardingRulesSetLabelsCall) Do(opts ...googleapi.CallOption) (* } return ret, nil // { - // "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.globalForwardingRules.setLabels", // "parameterOrder": [ @@ -33996,8 +35579,20 @@ func (r *GlobalForwardingRulesService) SetTarget(project string, forwardingRule return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *GlobalForwardingRulesSetTargetCall) RequestId(requestId string) *GlobalForwardingRulesSetTargetCall { c.urlParams_.Set("requestId", requestId) return c @@ -34113,7 +35708,7 @@ func (c *GlobalForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (* // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -34300,10 +35895,9 @@ func (r *GlobalOperationsService) AggregatedList(project string) *GlobalOperatio return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -34315,7 +35909,7 @@ func (r *GlobalOperationsService) AggregatedList(project string) *GlobalOperatio // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -34470,7 +36064,7 @@ func (c *GlobalOperationsAggregatedListCall) Do(opts ...googleapi.CallOption) (* // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -34816,10 +36410,9 @@ func (r *GlobalOperationsService) List(project string) *GlobalOperationsListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -34831,7 +36424,7 @@ func (r *GlobalOperationsService) List(project string) *GlobalOperationsListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -34986,7 +36579,7 @@ func (c *GlobalOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -35069,8 +36662,20 @@ func (r *HealthChecksService) Delete(project string, healthCheck string) *Health return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HealthChecksDeleteCall) RequestId(requestId string) *HealthChecksDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -35181,7 +36786,7 @@ func (c *HealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -35370,8 +36975,20 @@ func (r *HealthChecksService) Insert(project string, healthcheck *HealthCheck) * return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HealthChecksInsertCall) RequestId(requestId string) *HealthChecksInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -35478,7 +37095,7 @@ func (c *HealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -35517,10 +37134,9 @@ func (r *HealthChecksService) List(project string) *HealthChecksListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -35532,7 +37148,7 @@ func (r *HealthChecksService) List(project string) *HealthChecksListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -35687,7 +37303,7 @@ func (c *HealthChecksListCall) Do(opts ...googleapi.CallOption) (*HealthCheckLis // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -35764,8 +37380,8 @@ type HealthChecksPatchCall struct { } // Patch: Updates a HealthCheck resource in the specified project using -// the data included in the request. This method supports patch -// semantics. +// the data included in the request. This method supports PATCH +// semantics and uses the JSON merge patch format and processing rules. func (r *HealthChecksService) Patch(project string, healthCheck string, healthcheck *HealthCheck) *HealthChecksPatchCall { c := &HealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -35774,8 +37390,20 @@ func (r *HealthChecksService) Patch(project string, healthCheck string, healthch return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HealthChecksPatchCall) RequestId(requestId string) *HealthChecksPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -35868,7 +37496,7 @@ func (c *HealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, er } return ret, nil // { - // "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.healthChecks.patch", // "parameterOrder": [ @@ -35891,7 +37519,7 @@ func (c *HealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -36082,8 +37710,20 @@ func (r *HealthChecksService) Update(project string, healthCheck string, healthc return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HealthChecksUpdateCall) RequestId(requestId string) *HealthChecksUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -36199,7 +37839,7 @@ func (c *HealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -36237,10 +37877,9 @@ func (r *HostTypesService) AggregatedList(project string) *HostTypesAggregatedLi return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -36252,7 +37891,7 @@ func (r *HostTypesService) AggregatedList(project string) *HostTypesAggregatedLi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -36407,7 +38046,7 @@ func (c *HostTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*HostTyp // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -36655,10 +38294,9 @@ func (r *HostTypesService) List(project string, zone string) *HostTypesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -36670,7 +38308,7 @@ func (r *HostTypesService) List(project string, zone string) *HostTypesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -36827,7 +38465,7 @@ func (c *HostTypesListCall) Do(opts ...googleapi.CallOption) (*HostTypeList, err // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -36916,10 +38554,9 @@ func (r *HostsService) AggregatedList(project string) *HostsAggregatedListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -36931,7 +38568,7 @@ func (r *HostsService) AggregatedList(project string) *HostsAggregatedListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -37086,7 +38723,7 @@ func (c *HostsAggregatedListCall) Do(opts ...googleapi.CallOption) (*HostAggrega // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -37171,8 +38808,20 @@ func (r *HostsService) Delete(project string, zone string, host string) *HostsDe return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HostsDeleteCall) RequestId(requestId string) *HostsDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -37285,7 +38934,7 @@ func (c *HostsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -37657,8 +39306,20 @@ func (r *HostsService) Insert(project string, zone string, host *Host) *HostsIns return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HostsInsertCall) RequestId(requestId string) *HostsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -37767,7 +39428,7 @@ func (c *HostsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -37814,10 +39475,9 @@ func (r *HostsService) List(project string, zone string) *HostsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -37829,7 +39489,7 @@ func (r *HostsService) List(project string, zone string) *HostsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -37986,7 +39646,7 @@ func (c *HostsListCall) Do(opts ...googleapi.CallOption) (*HostList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -38394,8 +40054,20 @@ func (r *HttpHealthChecksService) Delete(project string, httpHealthCheck string) return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HttpHealthChecksDeleteCall) RequestId(requestId string) *HttpHealthChecksDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -38506,7 +40178,7 @@ func (c *HttpHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -38697,8 +40369,20 @@ func (r *HttpHealthChecksService) Insert(project string, httphealthcheck *HttpHe return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HttpHealthChecksInsertCall) RequestId(requestId string) *HttpHealthChecksInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -38805,7 +40489,7 @@ func (c *HttpHealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -38845,10 +40529,9 @@ func (r *HttpHealthChecksService) List(project string) *HttpHealthChecksListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -38860,7 +40543,7 @@ func (r *HttpHealthChecksService) List(project string) *HttpHealthChecksListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -39015,7 +40698,7 @@ func (c *HttpHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpHealth // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -39092,8 +40775,8 @@ type HttpHealthChecksPatchCall struct { } // Patch: Updates a HttpHealthCheck resource in the specified project -// using the data included in the request. This method supports patch -// semantics. +// using the data included in the request. This method supports PATCH +// semantics and uses the JSON merge patch format and processing rules. // For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/patch func (r *HttpHealthChecksService) Patch(project string, httpHealthCheck string, httphealthcheck *HttpHealthCheck) *HttpHealthChecksPatchCall { c := &HttpHealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -39103,8 +40786,20 @@ func (r *HttpHealthChecksService) Patch(project string, httpHealthCheck string, return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HttpHealthChecksPatchCall) RequestId(requestId string) *HttpHealthChecksPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -39197,7 +40892,7 @@ func (c *HttpHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.httpHealthChecks.patch", // "parameterOrder": [ @@ -39220,7 +40915,7 @@ func (c *HttpHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -39412,8 +41107,20 @@ func (r *HttpHealthChecksService) Update(project string, httpHealthCheck string, return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HttpHealthChecksUpdateCall) RequestId(requestId string) *HttpHealthChecksUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -39529,7 +41236,7 @@ func (c *HttpHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -39568,8 +41275,20 @@ func (r *HttpsHealthChecksService) Delete(project string, httpsHealthCheck strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HttpsHealthChecksDeleteCall) RequestId(requestId string) *HttpsHealthChecksDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -39680,7 +41399,7 @@ func (c *HttpsHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -39869,8 +41588,20 @@ func (r *HttpsHealthChecksService) Insert(project string, httpshealthcheck *Http return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HttpsHealthChecksInsertCall) RequestId(requestId string) *HttpsHealthChecksInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -39977,7 +41708,7 @@ func (c *HttpsHealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -40016,10 +41747,9 @@ func (r *HttpsHealthChecksService) List(project string) *HttpsHealthChecksListCa return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -40031,7 +41761,7 @@ func (r *HttpsHealthChecksService) List(project string) *HttpsHealthChecksListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -40186,7 +41916,7 @@ func (c *HttpsHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpsHeal // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -40263,8 +41993,8 @@ type HttpsHealthChecksPatchCall struct { } // Patch: Updates a HttpsHealthCheck resource in the specified project -// using the data included in the request. This method supports patch -// semantics. +// using the data included in the request. This method supports PATCH +// semantics and uses the JSON merge patch format and processing rules. func (r *HttpsHealthChecksService) Patch(project string, httpsHealthCheck string, httpshealthcheck *HttpsHealthCheck) *HttpsHealthChecksPatchCall { c := &HttpsHealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -40273,8 +42003,20 @@ func (r *HttpsHealthChecksService) Patch(project string, httpsHealthCheck string return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HttpsHealthChecksPatchCall) RequestId(requestId string) *HttpsHealthChecksPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -40367,7 +42109,7 @@ func (c *HttpsHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.httpsHealthChecks.patch", // "parameterOrder": [ @@ -40390,7 +42132,7 @@ func (c *HttpsHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -40581,8 +42323,20 @@ func (r *HttpsHealthChecksService) Update(project string, httpsHealthCheck strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *HttpsHealthChecksUpdateCall) RequestId(requestId string) *HttpsHealthChecksUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -40698,7 +42452,7 @@ func (c *HttpsHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -40738,8 +42492,20 @@ func (r *ImagesService) Delete(project string, image string) *ImagesDeleteCall { return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ImagesDeleteCall) RequestId(requestId string) *ImagesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -40850,7 +42616,7 @@ func (c *ImagesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -40892,8 +42658,17 @@ func (r *ImagesService) Deprecate(project string, image string, deprecationstatu return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and then the request times out. If you make the request again with +// the same request ID, the server can check if original operation with +// the same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. func (c *ImagesDeprecateCall) RequestId(requestId string) *ImagesDeprecateCall { c.urlParams_.Set("requestId", requestId) return c @@ -41009,7 +42784,7 @@ func (c *ImagesDeprecateCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", // "location": "query", // "type": "string" // } @@ -41514,8 +43289,20 @@ func (c *ImagesInsertCall) ForceCreate(forceCreate bool) *ImagesInsertCall { return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ImagesInsertCall) RequestId(requestId string) *ImagesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -41627,7 +43414,7 @@ func (c *ImagesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -41675,10 +43462,9 @@ func (r *ImagesService) List(project string) *ImagesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -41690,7 +43476,7 @@ func (r *ImagesService) List(project string) *ImagesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -41845,7 +43631,7 @@ func (c *ImagesListCall) Do(opts ...googleapi.CallOption) (*ImageList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -42069,7 +43855,7 @@ type ImagesSetLabelsCall struct { } // SetLabels: Sets the labels on an image. To learn more about labels, -// read the Labeling or Tagging Resources documentation. +// read the Labeling Resources documentation. func (r *ImagesService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *ImagesSetLabelsCall { c := &ImagesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -42165,7 +43951,7 @@ func (c *ImagesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, erro } return ret, nil // { - // "description": "Sets the labels on an image. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on an image. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.images.setLabels", // "parameterOrder": [ @@ -42374,6 +44160,11 @@ type InstanceGroupManagersAbandonInstancesCall struct { // been removed from the group. You must separately verify the status of // the abandoning action with the listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *InstanceGroupManagersService) AbandonInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersabandoninstancesrequest *InstanceGroupManagersAbandonInstancesRequest) *InstanceGroupManagersAbandonInstancesCall { @@ -42385,8 +44176,20 @@ func (r *InstanceGroupManagersService) AbandonInstances(project string, zone str return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersAbandonInstancesCall) RequestId(requestId string) *InstanceGroupManagersAbandonInstancesCall { c.urlParams_.Set("requestId", requestId) return c @@ -42480,7 +44283,7 @@ func (c *InstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOpt } return ret, nil // { - // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.abandonInstances", // "parameterOrder": [ @@ -42503,7 +44306,7 @@ func (c *InstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOpt // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -42548,10 +44351,9 @@ func (r *InstanceGroupManagersService) AggregatedList(project string) *InstanceG return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -42563,7 +44365,7 @@ func (r *InstanceGroupManagersService) AggregatedList(project string) *InstanceG // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -42719,7 +44521,7 @@ func (c *InstanceGroupManagersAggregatedListCall) Do(opts ...googleapi.CallOptio // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -42783,41 +44585,35 @@ func (c *InstanceGroupManagersAggregatedListCall) Pages(ctx context.Context, f f } } -// method id "compute.instanceGroupManagers.delete": +// method id "compute.instanceGroupManagers.applyUpdatesToInstances": -type InstanceGroupManagersDeleteCall struct { - s *Service - project string - zone string - instanceGroupManager string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersApplyUpdatesToInstancesCall struct { + s *Service + project string + zone string + instanceGroupManager string + instancegroupmanagersapplyupdatesrequest *InstanceGroupManagersApplyUpdatesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified managed instance group and all of the -// instances in that group. Note that the instance group must not belong -// to a backend service. Read Deleting an instance group for more -// information. -func (r *InstanceGroupManagersService) Delete(project string, zone string, instanceGroupManager string) *InstanceGroupManagersDeleteCall { - c := &InstanceGroupManagersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// ApplyUpdatesToInstances: Apply changes to selected instances on the +// managed instance group. This method can be used to apply new +// overrides and/or new versions. +func (r *InstanceGroupManagersService) ApplyUpdatesToInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersapplyupdatesrequest *InstanceGroupManagersApplyUpdatesRequest) *InstanceGroupManagersApplyUpdatesToInstancesCall { + c := &InstanceGroupManagersApplyUpdatesToInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone c.instanceGroupManager = instanceGroupManager - return c -} - -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. -func (c *InstanceGroupManagersDeleteCall) RequestId(requestId string) *InstanceGroupManagersDeleteCall { - c.urlParams_.Set("requestId", requestId) + c.instancegroupmanagersapplyupdatesrequest = instancegroupmanagersapplyupdatesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersDeleteCall) Fields(s ...googleapi.Field) *InstanceGroupManagersDeleteCall { +func (c *InstanceGroupManagersApplyUpdatesToInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupManagersApplyUpdatesToInstancesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -42825,31 +44621,36 @@ func (c *InstanceGroupManagersDeleteCall) Fields(s ...googleapi.Field) *Instance // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersDeleteCall) Context(ctx context.Context) *InstanceGroupManagersDeleteCall { +func (c *InstanceGroupManagersApplyUpdatesToInstancesCall) Context(ctx context.Context) *InstanceGroupManagersApplyUpdatesToInstancesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersDeleteCall) Header() http.Header { +func (c *InstanceGroupManagersApplyUpdatesToInstancesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersApplyUpdatesToInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersapplyupdatesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, @@ -42859,14 +44660,184 @@ func (c *InstanceGroupManagersDeleteCall) doRequest(alt string) (*http.Response, return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.delete" call. +// Do executes the "compute.instanceGroupManagers.applyUpdatesToInstances" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupManagersApplyUpdatesToInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Apply changes to selected instances on the managed instance group. This method can be used to apply new overrides and/or new versions.", + // "httpMethod": "POST", + // "id": "compute.instanceGroupManagers.applyUpdatesToInstances", + // "parameterOrder": [ + // "project", + // "zone", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "The name of the managed instance group, should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone where the managed instance group is located. Should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances", + // "request": { + // "$ref": "InstanceGroupManagersApplyUpdatesRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.instanceGroupManagers.delete": + +type InstanceGroupManagersDeleteCall struct { + s *Service + project string + zone string + instanceGroupManager string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes the specified managed instance group and all of the +// instances in that group. Note that the instance group must not belong +// to a backend service. Read Deleting an instance group for more +// information. +func (r *InstanceGroupManagersService) Delete(project string, zone string, instanceGroupManager string) *InstanceGroupManagersDeleteCall { + c := &InstanceGroupManagersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.zone = zone + c.instanceGroupManager = instanceGroupManager + return c +} + +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersDeleteCall) RequestId(requestId string) *InstanceGroupManagersDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstanceGroupManagersDeleteCall) Fields(s ...googleapi.Field) *InstanceGroupManagersDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstanceGroupManagersDeleteCall) Context(ctx context.Context) *InstanceGroupManagersDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstanceGroupManagersDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstanceGroupManagersDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instanceGroupManagers.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -42920,7 +44891,7 @@ func (c *InstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -42965,6 +44936,11 @@ type InstanceGroupManagersDeleteInstancesCall struct { // deleted. You must separately verify the status of the deleting action // with the listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *InstanceGroupManagersService) DeleteInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersdeleteinstancesrequest *InstanceGroupManagersDeleteInstancesRequest) *InstanceGroupManagersDeleteInstancesCall { @@ -42976,8 +44952,20 @@ func (r *InstanceGroupManagersService) DeleteInstances(project string, zone stri return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersDeleteInstancesCall) RequestId(requestId string) *InstanceGroupManagersDeleteInstancesCall { c.urlParams_.Set("requestId", requestId) return c @@ -43071,7 +45059,7 @@ func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOpti } return ret, nil // { - // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.deleteInstances", // "parameterOrder": [ @@ -43094,7 +45082,7 @@ func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOpti // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -43120,6 +45108,162 @@ func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOpti } +// method id "compute.instanceGroupManagers.deletePerInstanceConfigs": + +type InstanceGroupManagersDeletePerInstanceConfigsCall struct { + s *Service + project string + zone string + instanceGroupManager string + instancegroupmanagersdeleteperinstanceconfigsreq *InstanceGroupManagersDeletePerInstanceConfigsReq + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// DeletePerInstanceConfigs: Delete selected per-instance configs for +// the managed instance group. +func (r *InstanceGroupManagersService) DeletePerInstanceConfigs(project string, zone string, instanceGroupManager string, instancegroupmanagersdeleteperinstanceconfigsreq *InstanceGroupManagersDeletePerInstanceConfigsReq) *InstanceGroupManagersDeletePerInstanceConfigsCall { + c := &InstanceGroupManagersDeletePerInstanceConfigsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.zone = zone + c.instanceGroupManager = instanceGroupManager + c.instancegroupmanagersdeleteperinstanceconfigsreq = instancegroupmanagersdeleteperinstanceconfigsreq + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstanceGroupManagersDeletePerInstanceConfigsCall) Fields(s ...googleapi.Field) *InstanceGroupManagersDeletePerInstanceConfigsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstanceGroupManagersDeletePerInstanceConfigsCall) Context(ctx context.Context) *InstanceGroupManagersDeletePerInstanceConfigsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstanceGroupManagersDeletePerInstanceConfigsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstanceGroupManagersDeletePerInstanceConfigsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersdeleteperinstanceconfigsreq) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instanceGroupManagers.deletePerInstanceConfigs" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstanceGroupManagersDeletePerInstanceConfigsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Delete selected per-instance configs for the managed instance group.", + // "httpMethod": "POST", + // "id": "compute.instanceGroupManagers.deletePerInstanceConfigs", + // "parameterOrder": [ + // "project", + // "zone", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "The name of the managed instance group. It should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone where the managed instance group is located. It should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs", + // "request": { + // "$ref": "InstanceGroupManagersDeletePerInstanceConfigsReq" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.instanceGroupManagers.get": type InstanceGroupManagersGetCall struct { @@ -43303,6 +45447,7 @@ type InstanceGroupManagersInsertCall struct { // with the listmanagedinstances method. // // A managed instance group can have up to 1000 VM instances per group. +// Please contact Cloud Support if you need an increase in this limit. func (r *InstanceGroupManagersService) Insert(project string, zone string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersInsertCall { c := &InstanceGroupManagersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -43311,8 +45456,20 @@ func (r *InstanceGroupManagersService) Insert(project string, zone string, insta return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersInsertCall) RequestId(requestId string) *InstanceGroupManagersInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -43405,7 +45562,7 @@ func (c *InstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group.", + // "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group. Please contact Cloud Support if you need an increase in this limit.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.insert", // "parameterOrder": [ @@ -43421,7 +45578,7 @@ func (c *InstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -43468,10 +45625,9 @@ func (r *InstanceGroupManagersService) List(project string, zone string) *Instan return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -43483,7 +45639,7 @@ func (r *InstanceGroupManagersService) List(project string, zone string) *Instan // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -43640,7 +45796,7 @@ func (c *InstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*Insta // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -43927,6 +46083,266 @@ func (c *InstanceGroupManagersListManagedInstancesCall) Pages(ctx context.Contex } } +// method id "compute.instanceGroupManagers.listPerInstanceConfigs": + +type InstanceGroupManagersListPerInstanceConfigsCall struct { + s *Service + project string + zone string + instanceGroupManager string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// ListPerInstanceConfigs: Lists all of the per-instance configs defined +// for the managed instance group. +func (r *InstanceGroupManagersService) ListPerInstanceConfigs(project string, zone string, instanceGroupManager string) *InstanceGroupManagersListPerInstanceConfigsCall { + c := &InstanceGroupManagersListPerInstanceConfigsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.zone = zone + c.instanceGroupManager = instanceGroupManager + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *InstanceGroupManagersListPerInstanceConfigsCall) Filter(filter string) *InstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *InstanceGroupManagersListPerInstanceConfigsCall) MaxResults(maxResults int64) *InstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *InstanceGroupManagersListPerInstanceConfigsCall) OrderBy(orderBy string) *InstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *InstanceGroupManagersListPerInstanceConfigsCall) PageToken(pageToken string) *InstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstanceGroupManagersListPerInstanceConfigsCall) Fields(s ...googleapi.Field) *InstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstanceGroupManagersListPerInstanceConfigsCall) Context(ctx context.Context) *InstanceGroupManagersListPerInstanceConfigsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstanceGroupManagersListPerInstanceConfigsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstanceGroupManagersListPerInstanceConfigsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instanceGroupManagers.listPerInstanceConfigs" call. +// Exactly one of *InstanceGroupManagersListPerInstanceConfigsResp or +// error will be non-nil. Any non-2xx status code is an error. Response +// headers are in either +// *InstanceGroupManagersListPerInstanceConfigsResp.ServerResponse.Header +// or (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *InstanceGroupManagersListPerInstanceConfigsCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManagersListPerInstanceConfigsResp, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &InstanceGroupManagersListPerInstanceConfigsResp{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists all of the per-instance configs defined for the managed instance group.", + // "httpMethod": "POST", + // "id": "compute.instanceGroupManagers.listPerInstanceConfigs", + // "parameterOrder": [ + // "project", + // "zone", + // "instanceGroupManager" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "instanceGroupManager": { + // "description": "The name of the managed instance group. It should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone where the managed instance group is located. It should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs", + // "response": { + // "$ref": "InstanceGroupManagersListPerInstanceConfigsResp" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *InstanceGroupManagersListPerInstanceConfigsCall) Pages(ctx context.Context, f func(*InstanceGroupManagersListPerInstanceConfigsResp) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + // method id "compute.instanceGroupManagers.patch": type InstanceGroupManagersPatchCall struct { @@ -43945,7 +46361,8 @@ type InstanceGroupManagersPatchCall struct { // group is patched even if the instances in the group are still in the // process of being patched. You must separately verify the status of // the individual instances with the listManagedInstances method. This -// method supports patch semantics. +// method supports PATCH semantics and uses the JSON merge patch format +// and processing rules. func (r *InstanceGroupManagersService) Patch(project string, zone string, instanceGroupManager string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersPatchCall { c := &InstanceGroupManagersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -43955,8 +46372,20 @@ func (r *InstanceGroupManagersService) Patch(project string, zone string, instan return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersPatchCall) RequestId(requestId string) *InstanceGroupManagersPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -44050,7 +46479,7 @@ func (c *InstanceGroupManagersPatchCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listManagedInstances method. This method supports patch semantics.", + // "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listManagedInstances method. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.instanceGroupManagers.patch", // "parameterOrder": [ @@ -44073,7 +46502,7 @@ func (c *InstanceGroupManagersPatchCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -44121,6 +46550,11 @@ type InstanceGroupManagersRecreateInstancesCall struct { // separately verify the status of the recreating action with the // listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *InstanceGroupManagersService) RecreateInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersrecreateinstancesrequest *InstanceGroupManagersRecreateInstancesRequest) *InstanceGroupManagersRecreateInstancesCall { @@ -44132,8 +46566,20 @@ func (r *InstanceGroupManagersService) RecreateInstances(project string, zone st return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersRecreateInstancesCall) RequestId(requestId string) *InstanceGroupManagersRecreateInstancesCall { c.urlParams_.Set("requestId", requestId) return c @@ -44227,7 +46673,7 @@ func (c *InstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOp } return ret, nil // { - // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.recreateInstances", // "parameterOrder": [ @@ -44250,7 +46696,7 @@ func (c *InstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOp // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -44295,6 +46741,10 @@ type InstanceGroupManagersResizeCall struct { // if the group has not yet added or deleted any instances. You must // separately verify the status of the creating or deleting actions with // the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or deleted. func (r *InstanceGroupManagersService) Resize(project string, zone string, instanceGroupManager string, size int64) *InstanceGroupManagersResizeCall { c := &InstanceGroupManagersResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -44304,8 +46754,20 @@ func (r *InstanceGroupManagersService) Resize(project string, zone string, insta return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersResizeCall) RequestId(requestId string) *InstanceGroupManagersResizeCall { c.urlParams_.Set("requestId", requestId) return c @@ -44394,7 +46856,7 @@ func (c *InstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + // "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.resize", // "parameterOrder": [ @@ -44418,7 +46880,7 @@ func (c *InstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -44472,6 +46934,10 @@ type InstanceGroupManagersResizeAdvancedCall struct { // yet added or deleted any instances. You must separately verify the // status of the creating, creatingWithoutRetries, or deleting actions // with the get or listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or deleted. func (r *InstanceGroupManagersService) ResizeAdvanced(project string, zone string, instanceGroupManager string, instancegroupmanagersresizeadvancedrequest *InstanceGroupManagersResizeAdvancedRequest) *InstanceGroupManagersResizeAdvancedCall { c := &InstanceGroupManagersResizeAdvancedCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -44481,8 +46947,20 @@ func (r *InstanceGroupManagersService) ResizeAdvanced(project string, zone strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersResizeAdvancedCall) RequestId(requestId string) *InstanceGroupManagersResizeAdvancedCall { c.urlParams_.Set("requestId", requestId) return c @@ -44576,7 +47054,7 @@ func (c *InstanceGroupManagersResizeAdvancedCall) Do(opts ...googleapi.CallOptio } return ret, nil // { - // "description": "Resizes the managed instance group with advanced configuration options like disabling creation retries. This is an extended version of the resize method.\n\nIf you increase the size of the instance group, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating, creatingWithoutRetries, or deleting actions with the get or listmanagedinstances method.", + // "description": "Resizes the managed instance group with advanced configuration options like disabling creation retries. This is an extended version of the resize method.\n\nIf you increase the size of the instance group, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating, creatingWithoutRetries, or deleting actions with the get or listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.resizeAdvanced", // "parameterOrder": [ @@ -44599,7 +47077,7 @@ func (c *InstanceGroupManagersResizeAdvancedCall) Do(opts ...googleapi.CallOptio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -44648,8 +47126,20 @@ func (r *InstanceGroupManagersService) SetAutoHealingPolicies(project string, zo return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersSetAutoHealingPoliciesCall) RequestId(requestId string) *InstanceGroupManagersSetAutoHealingPoliciesCall { c.urlParams_.Set("requestId", requestId) return c @@ -44766,7 +47256,7 @@ func (c *InstanceGroupManagersSetAutoHealingPoliciesCall) Do(opts ...googleapi.C // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -44817,8 +47307,20 @@ func (r *InstanceGroupManagersService) SetInstanceTemplate(project string, zone return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersSetInstanceTemplateCall) RequestId(requestId string) *InstanceGroupManagersSetInstanceTemplateCall { c.urlParams_.Set("requestId", requestId) return c @@ -44935,7 +47437,7 @@ func (c *InstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleapi.Call // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -44990,8 +47492,20 @@ func (r *InstanceGroupManagersService) SetTargetPools(project string, zone strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersSetTargetPoolsCall) RequestId(requestId string) *InstanceGroupManagersSetTargetPoolsCall { c.urlParams_.Set("requestId", requestId) return c @@ -45108,7 +47622,7 @@ func (c *InstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.CallOptio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -45320,8 +47834,20 @@ func (r *InstanceGroupManagersService) Update(project string, zone string, insta return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupManagersUpdateCall) RequestId(requestId string) *InstanceGroupManagersUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -45438,7 +47964,7 @@ func (c *InstanceGroupManagersUpdateCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -45464,34 +47990,35 @@ func (c *InstanceGroupManagersUpdateCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.instanceGroups.addInstances": +// method id "compute.instanceGroupManagers.updatePerInstanceConfigs": -type InstanceGroupsAddInstancesCall struct { - s *Service - project string - zone string - instanceGroup string - instancegroupsaddinstancesrequest *InstanceGroupsAddInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersUpdatePerInstanceConfigsCall struct { + s *Service + project string + zone string + instanceGroupManager string + instancegroupmanagersupdateperinstanceconfigsreq *InstanceGroupManagersUpdatePerInstanceConfigsReq + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AddInstances: Adds a list of instances to the specified instance -// group. All of the instances in the instance group must be in the same -// network/subnetwork. Read Adding instances for more information. -func (r *InstanceGroupsService) AddInstances(project string, zone string, instanceGroup string, instancegroupsaddinstancesrequest *InstanceGroupsAddInstancesRequest) *InstanceGroupsAddInstancesCall { - c := &InstanceGroupsAddInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// UpdatePerInstanceConfigs: Insert or patch (for the ones that already +// exist) per-instance configs for the managed instance group. +// perInstanceConfig.instance serves as a key used to distinguish +// whether to perform insert or patch. +func (r *InstanceGroupManagersService) UpdatePerInstanceConfigs(project string, zone string, instanceGroupManager string, instancegroupmanagersupdateperinstanceconfigsreq *InstanceGroupManagersUpdatePerInstanceConfigsReq) *InstanceGroupManagersUpdatePerInstanceConfigsCall { + c := &InstanceGroupManagersUpdatePerInstanceConfigsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instanceGroup = instanceGroup - c.instancegroupsaddinstancesrequest = instancegroupsaddinstancesrequest + c.instanceGroupManager = instanceGroupManager + c.instancegroupmanagersupdateperinstanceconfigsreq = instancegroupmanagersupdateperinstanceconfigsreq return c } // RequestId sets the optional parameter "requestId": begin_interface: // MixerMutationRequestBuilder Request ID to support idempotency. -func (c *InstanceGroupsAddInstancesCall) RequestId(requestId string) *InstanceGroupsAddInstancesCall { +func (c *InstanceGroupManagersUpdatePerInstanceConfigsCall) RequestId(requestId string) *InstanceGroupManagersUpdatePerInstanceConfigsCall { c.urlParams_.Set("requestId", requestId) return c } @@ -45499,7 +48026,7 @@ func (c *InstanceGroupsAddInstancesCall) RequestId(requestId string) *InstanceGr // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsAddInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupsAddInstancesCall { +func (c *InstanceGroupManagersUpdatePerInstanceConfigsCall) Fields(s ...googleapi.Field) *InstanceGroupManagersUpdatePerInstanceConfigsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -45507,53 +48034,53 @@ func (c *InstanceGroupsAddInstancesCall) Fields(s ...googleapi.Field) *InstanceG // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsAddInstancesCall) Context(ctx context.Context) *InstanceGroupsAddInstancesCall { +func (c *InstanceGroupManagersUpdatePerInstanceConfigsCall) Context(ctx context.Context) *InstanceGroupManagersUpdatePerInstanceConfigsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsAddInstancesCall) Header() http.Header { +func (c *InstanceGroupManagersUpdatePerInstanceConfigsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsAddInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersUpdatePerInstanceConfigsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsaddinstancesrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersupdateperinstanceconfigsreq) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroup": c.instanceGroup, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.addInstances" call. +// Do executes the "compute.instanceGroupManagers.updatePerInstanceConfigs" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupManagersUpdatePerInstanceConfigsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -45584,17 +48111,17 @@ func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Adds a list of instances to the specified instance group. All of the instances in the instance group must be in the same network/subnetwork. Read Adding instances for more information.", + // "description": "Insert or patch (for the ones that already exist) per-instance configs for the managed instance group. perInstanceConfig.instance serves as a key used to distinguish whether to perform insert or patch.", // "httpMethod": "POST", - // "id": "compute.instanceGroups.addInstances", + // "id": "compute.instanceGroupManagers.updatePerInstanceConfigs", // "parameterOrder": [ // "project", // "zone", - // "instanceGroup" + // "instanceGroupManager" // ], // "parameters": { - // "instanceGroup": { - // "description": "The name of the instance group where you are adding instances.", + // "instanceGroupManager": { + // "description": "The name of the managed instance group. It should conform to RFC1035.", // "location": "path", // "required": true, // "type": "string" @@ -45612,15 +48139,15 @@ func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "zone": { - // "description": "The name of the zone where the instance group is located.", + // "description": "The name of the zone where the managed instance group is located. It should conform to RFC1035.", // "location": "path", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances", + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs", // "request": { - // "$ref": "InstanceGroupsAddInstancesRequest" + // "$ref": "InstanceGroupManagersUpdatePerInstanceConfigsReq" // }, // "response": { // "$ref": "Operation" @@ -45633,326 +48160,91 @@ func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Oper } -// method id "compute.instanceGroups.aggregatedList": +// method id "compute.instanceGroups.addInstances": -type InstanceGroupsAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstanceGroupsAddInstancesCall struct { + s *Service + project string + zone string + instanceGroup string + instancegroupsaddinstancesrequest *InstanceGroupsAddInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves the list of instance groups and sorts them -// by zone. -func (r *InstanceGroupsService) AggregatedList(project string) *InstanceGroupsAggregatedListCall { - c := &InstanceGroupsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AddInstances: Adds a list of instances to the specified instance +// group. All of the instances in the instance group must be in the same +// network/subnetwork. Read Adding instances for more information. +func (r *InstanceGroupsService) AddInstances(project string, zone string, instanceGroup string, instancegroupsaddinstancesrequest *InstanceGroupsAddInstancesRequest) *InstanceGroupsAddInstancesCall { + c := &InstanceGroupsAddInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.zone = zone + c.instanceGroup = instanceGroup + c.instancegroupsaddinstancesrequest = instancegroupsaddinstancesrequest return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *InstanceGroupsAggregatedListCall) Filter(filter string) *InstanceGroupsAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *InstanceGroupsAggregatedListCall) MaxResults(maxResults int64) *InstanceGroupsAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. // -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. // -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *InstanceGroupsAggregatedListCall) OrderBy(orderBy string) *InstanceGroupsAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *InstanceGroupsAggregatedListCall) PageToken(pageToken string) *InstanceGroupsAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupsAddInstancesCall) RequestId(requestId string) *InstanceGroupsAddInstancesCall { + c.urlParams_.Set("requestId", requestId) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsAggregatedListCall) Fields(s ...googleapi.Field) *InstanceGroupsAggregatedListCall { +func (c *InstanceGroupsAddInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupsAddInstancesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *InstanceGroupsAggregatedListCall) IfNoneMatch(entityTag string) *InstanceGroupsAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsAggregatedListCall) Context(ctx context.Context) *InstanceGroupsAggregatedListCall { +func (c *InstanceGroupsAddInstancesCall) Context(ctx context.Context) *InstanceGroupsAddInstancesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsAggregatedListCall) Header() http.Header { +func (c *InstanceGroupsAddInstancesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupsAddInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instanceGroups") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.instanceGroups.aggregatedList" call. -// Exactly one of *InstanceGroupAggregatedList or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *InstanceGroupAggregatedList.ServerResponse.Header or (if a response -// was returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *InstanceGroupsAggregatedListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupAggregatedList, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsaddinstancesrequest) if err != nil { return nil, err } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &InstanceGroupAggregatedList{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Retrieves the list of instance groups and sorts them by zone.", - // "httpMethod": "GET", - // "id": "compute.instanceGroups.aggregatedList", - // "parameterOrder": [ - // "project" - // ], - // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/aggregated/instanceGroups", - // "response": { - // "$ref": "InstanceGroupAggregatedList" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" - // ] - // } - -} - -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *InstanceGroupsAggregatedListCall) Pages(ctx context.Context, f func(*InstanceGroupAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.instanceGroups.delete": - -type InstanceGroupsDeleteCall struct { - s *Service - project string - zone string - instanceGroup string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Delete: Deletes the specified instance group. The instances in the -// group are not deleted. Note that instance group must not belong to a -// backend service. Read Deleting an instance group for more -// information. -func (r *InstanceGroupsService) Delete(project string, zone string, instanceGroup string) *InstanceGroupsDeleteCall { - c := &InstanceGroupsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.zone = zone - c.instanceGroup = instanceGroup - return c -} - -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. -func (c *InstanceGroupsDeleteCall) RequestId(requestId string) *InstanceGroupsDeleteCall { - c.urlParams_.Set("requestId", requestId) - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *InstanceGroupsDeleteCall) Fields(s ...googleapi.Field) *InstanceGroupsDeleteCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *InstanceGroupsDeleteCall) Context(ctx context.Context) *InstanceGroupsDeleteCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *InstanceGroupsDeleteCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *InstanceGroupsDeleteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, @@ -45962,14 +48254,441 @@ func (c *InstanceGroupsDeleteCall) doRequest(alt string) (*http.Response, error) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.delete" call. +// Do executes the "compute.instanceGroups.addInstances" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Adds a list of instances to the specified instance group. All of the instances in the instance group must be in the same network/subnetwork. Read Adding instances for more information.", + // "httpMethod": "POST", + // "id": "compute.instanceGroups.addInstances", + // "parameterOrder": [ + // "project", + // "zone", + // "instanceGroup" + // ], + // "parameters": { + // "instanceGroup": { + // "description": "The name of the instance group where you are adding instances.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone where the instance group is located.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances", + // "request": { + // "$ref": "InstanceGroupsAddInstancesRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.instanceGroups.aggregatedList": + +type InstanceGroupsAggregatedListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// AggregatedList: Retrieves the list of instance groups and sorts them +// by zone. +func (r *InstanceGroupsService) AggregatedList(project string) *InstanceGroupsAggregatedListCall { + c := &InstanceGroupsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *InstanceGroupsAggregatedListCall) Filter(filter string) *InstanceGroupsAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *InstanceGroupsAggregatedListCall) MaxResults(maxResults int64) *InstanceGroupsAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *InstanceGroupsAggregatedListCall) OrderBy(orderBy string) *InstanceGroupsAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *InstanceGroupsAggregatedListCall) PageToken(pageToken string) *InstanceGroupsAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstanceGroupsAggregatedListCall) Fields(s ...googleapi.Field) *InstanceGroupsAggregatedListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *InstanceGroupsAggregatedListCall) IfNoneMatch(entityTag string) *InstanceGroupsAggregatedListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstanceGroupsAggregatedListCall) Context(ctx context.Context) *InstanceGroupsAggregatedListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstanceGroupsAggregatedListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstanceGroupsAggregatedListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instanceGroups") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instanceGroups.aggregatedList" call. +// Exactly one of *InstanceGroupAggregatedList or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *InstanceGroupAggregatedList.ServerResponse.Header or (if a response +// was returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *InstanceGroupsAggregatedListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupAggregatedList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &InstanceGroupAggregatedList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves the list of instance groups and sorts them by zone.", + // "httpMethod": "GET", + // "id": "compute.instanceGroups.aggregatedList", + // "parameterOrder": [ + // "project" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/aggregated/instanceGroups", + // "response": { + // "$ref": "InstanceGroupAggregatedList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *InstanceGroupsAggregatedListCall) Pages(ctx context.Context, f func(*InstanceGroupAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.instanceGroups.delete": + +type InstanceGroupsDeleteCall struct { + s *Service + project string + zone string + instanceGroup string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes the specified instance group. The instances in the +// group are not deleted. Note that instance group must not belong to a +// backend service. Read Deleting an instance group for more +// information. +func (r *InstanceGroupsService) Delete(project string, zone string, instanceGroup string) *InstanceGroupsDeleteCall { + c := &InstanceGroupsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.zone = zone + c.instanceGroup = instanceGroup + return c +} + +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupsDeleteCall) RequestId(requestId string) *InstanceGroupsDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstanceGroupsDeleteCall) Fields(s ...googleapi.Field) *InstanceGroupsDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstanceGroupsDeleteCall) Context(ctx context.Context) *InstanceGroupsDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstanceGroupsDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstanceGroupsDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "zone": c.zone, + "instanceGroup": c.instanceGroup, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instanceGroups.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstanceGroupsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -46023,7 +48742,7 @@ func (c *InstanceGroupsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -46229,8 +48948,20 @@ func (r *InstanceGroupsService) Insert(project string, zone string, instancegrou return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupsInsertCall) RequestId(requestId string) *InstanceGroupsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -46339,7 +49070,7 @@ func (c *InstanceGroupsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -46386,10 +49117,9 @@ func (r *InstanceGroupsService) List(project string, zone string) *InstanceGroup return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -46401,7 +49131,7 @@ func (r *InstanceGroupsService) List(project string, zone string) *InstanceGroup // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -46558,7 +49288,7 @@ func (c *InstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*InstanceGrou // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -46651,10 +49381,9 @@ func (r *InstanceGroupsService) ListInstances(project string, zone string, insta return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -46666,7 +49395,7 @@ func (r *InstanceGroupsService) ListInstances(project string, zone string, insta // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -46817,7 +49546,7 @@ func (c *InstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) (*Ins // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -46911,6 +49640,10 @@ type InstanceGroupsRemoveInstancesCall struct { // RemoveInstances: Removes one or more instances from the specified // instance group, but does not delete those instances. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration before the VM instance is removed or deleted. func (r *InstanceGroupsService) RemoveInstances(project string, zone string, instanceGroup string, instancegroupsremoveinstancesrequest *InstanceGroupsRemoveInstancesRequest) *InstanceGroupsRemoveInstancesCall { c := &InstanceGroupsRemoveInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -46920,8 +49653,20 @@ func (r *InstanceGroupsService) RemoveInstances(project string, zone string, ins return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupsRemoveInstancesCall) RequestId(requestId string) *InstanceGroupsRemoveInstancesCall { c.urlParams_.Set("requestId", requestId) return c @@ -47015,7 +49760,7 @@ func (c *InstanceGroupsRemoveInstancesCall) Do(opts ...googleapi.CallOption) (*O } return ret, nil // { - // "description": "Removes one or more instances from the specified instance group, but does not delete those instances.", + // "description": "Removes one or more instances from the specified instance group, but does not delete those instances.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration before the VM instance is removed or deleted.", // "httpMethod": "POST", // "id": "compute.instanceGroups.removeInstances", // "parameterOrder": [ @@ -47038,7 +49783,7 @@ func (c *InstanceGroupsRemoveInstancesCall) Do(opts ...googleapi.CallOption) (*O // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -47087,8 +49832,20 @@ func (r *InstanceGroupsService) SetNamedPorts(project string, zone string, insta return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceGroupsSetNamedPortsCall) RequestId(requestId string) *InstanceGroupsSetNamedPortsCall { c.urlParams_.Set("requestId", requestId) return c @@ -47205,7 +49962,7 @@ func (c *InstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -47414,8 +50171,20 @@ func (r *InstanceTemplatesService) Delete(project string, instanceTemplate strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceTemplatesDeleteCall) RequestId(requestId string) *InstanceTemplatesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -47526,7 +50295,7 @@ func (c *InstanceTemplatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -47720,8 +50489,20 @@ func (r *InstanceTemplatesService) Insert(project string, instancetemplate *Inst return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstanceTemplatesInsertCall) RequestId(requestId string) *InstanceTemplatesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -47828,7 +50609,7 @@ func (c *InstanceTemplatesInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -47868,10 +50649,9 @@ func (r *InstanceTemplatesService) List(project string) *InstanceTemplatesListCa return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -47883,7 +50663,7 @@ func (r *InstanceTemplatesService) List(project string) *InstanceTemplatesListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -48038,7 +50818,7 @@ func (c *InstanceTemplatesListCall) Do(opts ...googleapi.CallOption) (*InstanceT // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -48276,8 +51056,20 @@ func (r *InstancesService) AddAccessConfig(project string, zone string, instance return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesAddAccessConfigCall) RequestId(requestId string) *InstancesAddAccessConfigCall { c.urlParams_.Set("requestId", requestId) return c @@ -48402,7 +51194,7 @@ func (c *InstancesAddAccessConfigCall) Do(opts ...googleapi.CallOption) (*Operat // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -48448,10 +51240,9 @@ func (r *InstancesService) AggregatedList(project string) *InstancesAggregatedLi return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -48463,7 +51254,7 @@ func (r *InstancesService) AggregatedList(project string) *InstancesAggregatedLi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -48618,7 +51409,7 @@ func (c *InstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Instanc // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -48695,7 +51486,10 @@ type InstancesAttachDiskCall struct { header_ http.Header } -// AttachDisk: Attaches a Disk resource to an instance. +// AttachDisk: Attaches an existing Disk resource to an instance. You +// must first create the disk before you can attach it. It is not +// possible to create and attach a disk at the same time. For more +// information, read Adding a persistent disk to your instance. // For details, see https://cloud.google.com/compute/docs/reference/latest/instances/attachDisk func (r *InstancesService) AttachDisk(project string, zone string, instance string, attacheddisk *AttachedDisk) *InstancesAttachDiskCall { c := &InstancesAttachDiskCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -48714,8 +51508,20 @@ func (c *InstancesAttachDiskCall) ForceAttach(forceAttach bool) *InstancesAttach return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesAttachDiskCall) RequestId(requestId string) *InstancesAttachDiskCall { c.urlParams_.Set("requestId", requestId) return c @@ -48809,7 +51615,7 @@ func (c *InstancesAttachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Attaches a Disk resource to an instance.", + // "description": "Attaches an existing Disk resource to an instance. You must first create the disk before you can attach it. It is not possible to create and attach a disk at the same time. For more information, read Adding a persistent disk to your instance.", // "httpMethod": "POST", // "id": "compute.instances.attachDisk", // "parameterOrder": [ @@ -48838,7 +51644,7 @@ func (c *InstancesAttachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -48888,8 +51694,20 @@ func (r *InstancesService) Delete(project string, zone string, instance string) return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesDeleteCall) RequestId(requestId string) *InstancesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -49002,7 +51820,7 @@ func (c *InstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -49051,8 +51869,20 @@ func (r *InstancesService) DeleteAccessConfig(project string, zone string, insta return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesDeleteAccessConfigCall) RequestId(requestId string) *InstancesDeleteAccessConfigCall { c.urlParams_.Set("requestId", requestId) return c @@ -49179,7 +52009,7 @@ func (c *InstancesDeleteAccessConfigCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -49226,8 +52056,20 @@ func (r *InstancesService) DetachDisk(project string, zone string, instance stri return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesDetachDiskCall) RequestId(requestId string) *InstancesDetachDiskCall { c.urlParams_.Set("requestId", requestId) return c @@ -49347,7 +52189,7 @@ func (c *InstancesDetachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -49535,6 +52377,180 @@ func (c *InstancesGetCall) Do(opts ...googleapi.CallOption) (*Instance, error) { } +// method id "compute.instances.getGuestAttributes": + +type InstancesGetGuestAttributesCall struct { + s *Service + project string + zone string + instance string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// GetGuestAttributes: Returns the specified guest attributes entry. +func (r *InstancesService) GetGuestAttributes(project string, zone string, instance string) *InstancesGetGuestAttributesCall { + c := &InstancesGetGuestAttributesCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.zone = zone + c.instance = instance + return c +} + +// VariableKey sets the optional parameter "variableKey": Specifies the +// key for the guest attributes entry. +func (c *InstancesGetGuestAttributesCall) VariableKey(variableKey string) *InstancesGetGuestAttributesCall { + c.urlParams_.Set("variableKey", variableKey) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstancesGetGuestAttributesCall) Fields(s ...googleapi.Field) *InstancesGetGuestAttributesCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *InstancesGetGuestAttributesCall) IfNoneMatch(entityTag string) *InstancesGetGuestAttributesCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstancesGetGuestAttributesCall) Context(ctx context.Context) *InstancesGetGuestAttributesCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstancesGetGuestAttributesCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstancesGetGuestAttributesCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/getGuestAttributes") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "zone": c.zone, + "instance": c.instance, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instances.getGuestAttributes" call. +// Exactly one of *GuestAttributes or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *GuestAttributes.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *InstancesGetGuestAttributesCall) Do(opts ...googleapi.CallOption) (*GuestAttributes, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &GuestAttributes{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns the specified guest attributes entry.", + // "httpMethod": "GET", + // "id": "compute.instances.getGuestAttributes", + // "parameterOrder": [ + // "project", + // "zone", + // "instance" + // ], + // "parameters": { + // "instance": { + // "description": "Name of the instance scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "variableKey": { + // "description": "Specifies the key for the guest attributes entry.", + // "location": "query", + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/zones/{zone}/instances/{instance}/getGuestAttributes", + // "response": { + // "$ref": "GuestAttributes" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + // method id "compute.instances.getIamPolicy": type InstancesGetIamPolicyCall struct { @@ -49918,13 +52934,41 @@ func (r *InstancesService) Insert(project string, zone string, instance *Instanc return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesInsertCall) RequestId(requestId string) *InstancesInsertCall { c.urlParams_.Set("requestId", requestId) return c } +// SourceInstanceTemplate sets the optional parameter +// "sourceInstanceTemplate": Specifies instance template to create the +// instance. +// +// This field is optional. It can be a full or partial URL. For example, +// the following are all valid URLs to an instance template: +// - +// https://www.googleapis.com/compute/v1/projects/project/global/global/instanceTemplates/instanceTemplate +// - projects/project/global/global/instanceTemplates/instanceTemplate +// +// - global/instancesTemplates/instanceTemplate +func (c *InstancesInsertCall) SourceInstanceTemplate(sourceInstanceTemplate string) *InstancesInsertCall { + c.urlParams_.Set("sourceInstanceTemplate", sourceInstanceTemplate) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -50028,7 +53072,12 @@ func (c *InstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, + // "sourceInstanceTemplate": { + // "description": "Specifies instance template to create the instance.\n\nThis field is optional. It can be a full or partial URL. For example, the following are all valid URLs to an instance template: \n- https://www.googleapis.com/compute/v1/projects/project/global/global/instanceTemplates/instanceTemplate \n- projects/project/global/global/instanceTemplates/instanceTemplate \n- global/instancesTemplates/instanceTemplate", // "location": "query", // "type": "string" // }, @@ -50077,10 +53126,9 @@ func (r *InstancesService) List(project string, zone string) *InstancesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -50092,7 +53140,7 @@ func (r *InstancesService) List(project string, zone string) *InstancesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -50249,7 +53297,7 @@ func (c *InstancesListCall) Do(opts ...googleapi.CallOption) (*InstanceList, err // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -50343,10 +53391,9 @@ func (r *InstancesService) ListReferrers(project string, zone string, instance s return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -50358,7 +53405,7 @@ func (r *InstancesService) ListReferrers(project string, zone string, instance s // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -50517,7 +53564,7 @@ func (c *InstancesListReferrersCall) Do(opts ...googleapi.CallOption) (*Instance // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -50618,8 +53665,20 @@ func (r *InstancesService) Reset(project string, zone string, instance string) * return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesResetCall) RequestId(requestId string) *InstancesResetCall { c.urlParams_.Set("requestId", requestId) return c @@ -50732,7 +53791,7 @@ func (c *InstancesResetCall) Do(opts ...googleapi.CallOption) (*Operation, error // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -50781,8 +53840,20 @@ func (r *InstancesService) SetDiskAutoDelete(project string, zone string, instan return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSetDiskAutoDeleteCall) RequestId(requestId string) *InstancesSetDiskAutoDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -50910,7 +53981,7 @@ func (c *InstancesSetDiskAutoDeleteCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -51106,7 +54177,7 @@ type InstancesSetLabelsCall struct { } // SetLabels: Sets labels on an instance. To learn more about labels, -// read the Labeling or Tagging Resources documentation. +// read the Labeling Resources documentation. func (r *InstancesService) SetLabels(project string, zone string, instance string, instancessetlabelsrequest *InstancesSetLabelsRequest) *InstancesSetLabelsCall { c := &InstancesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -51116,8 +54187,20 @@ func (r *InstancesService) SetLabels(project string, zone string, instance strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSetLabelsCall) RequestId(requestId string) *InstancesSetLabelsCall { c.urlParams_.Set("requestId", requestId) return c @@ -51211,7 +54294,7 @@ func (c *InstancesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, e } return ret, nil // { - // "description": "Sets labels on an instance. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets labels on an instance. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.instances.setLabels", // "parameterOrder": [ @@ -51235,7 +54318,7 @@ func (c *InstancesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -51286,8 +54369,20 @@ func (r *InstancesService) SetMachineResources(project string, zone string, inst return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSetMachineResourcesCall) RequestId(requestId string) *InstancesSetMachineResourcesCall { c.urlParams_.Set("requestId", requestId) return c @@ -51405,7 +54500,7 @@ func (c *InstancesSetMachineResourcesCall) Do(opts ...googleapi.CallOption) (*Op // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -51456,8 +54551,20 @@ func (r *InstancesService) SetMachineType(project string, zone string, instance return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSetMachineTypeCall) RequestId(requestId string) *InstancesSetMachineTypeCall { c.urlParams_.Set("requestId", requestId) return c @@ -51575,7 +54682,7 @@ func (c *InstancesSetMachineTypeCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -51627,8 +54734,20 @@ func (r *InstancesService) SetMetadata(project string, zone string, instance str return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSetMetadataCall) RequestId(requestId string) *InstancesSetMetadataCall { c.urlParams_.Set("requestId", requestId) return c @@ -51746,7 +54865,7 @@ func (c *InstancesSetMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -51786,8 +54905,10 @@ type InstancesSetMinCpuPlatformCall struct { header_ http.Header } -// SetMinCpuPlatform: Changes the minimum cpu/platform that this -// instance should be started as. This is called on a stopped instance. +// SetMinCpuPlatform: Changes the minimum CPU platform that this +// instance should use. This method can only be called on a stopped +// instance. For more information, read Specifying a Minimum CPU +// Platform. func (r *InstancesService) SetMinCpuPlatform(project string, zone string, instance string, instancessetmincpuplatformrequest *InstancesSetMinCpuPlatformRequest) *InstancesSetMinCpuPlatformCall { c := &InstancesSetMinCpuPlatformCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -51797,8 +54918,20 @@ func (r *InstancesService) SetMinCpuPlatform(project string, zone string, instan return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSetMinCpuPlatformCall) RequestId(requestId string) *InstancesSetMinCpuPlatformCall { c.urlParams_.Set("requestId", requestId) return c @@ -51892,7 +55025,7 @@ func (c *InstancesSetMinCpuPlatformCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Changes the minimum cpu/platform that this instance should be started as. This is called on a stopped instance.", + // "description": "Changes the minimum CPU platform that this instance should use. This method can only be called on a stopped instance. For more information, read Specifying a Minimum CPU Platform.", // "httpMethod": "POST", // "id": "compute.instances.setMinCpuPlatform", // "parameterOrder": [ @@ -51916,7 +55049,7 @@ func (c *InstancesSetMinCpuPlatformCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -51967,8 +55100,20 @@ func (r *InstancesService) SetScheduling(project string, zone string, instance s return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSetSchedulingCall) RequestId(requestId string) *InstancesSetSchedulingCall { c.urlParams_.Set("requestId", requestId) return c @@ -52086,7 +55231,7 @@ func (c *InstancesSetSchedulingCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -52138,8 +55283,20 @@ func (r *InstancesService) SetServiceAccount(project string, zone string, instan return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSetServiceAccountCall) RequestId(requestId string) *InstancesSetServiceAccountCall { c.urlParams_.Set("requestId", requestId) return c @@ -52257,7 +55414,7 @@ func (c *InstancesSetServiceAccountCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -52309,8 +55466,20 @@ func (r *InstancesService) SetTags(project string, zone string, instance string, return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSetTagsCall) RequestId(requestId string) *InstancesSetTagsCall { c.urlParams_.Set("requestId", requestId) return c @@ -52428,7 +55597,7 @@ func (c *InstancesSetTagsCall) Do(opts ...googleapi.CallOption) (*Operation, err // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -52627,8 +55796,20 @@ func (r *InstancesService) Start(project string, zone string, instance string) * return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesStartCall) RequestId(requestId string) *InstancesStartCall { c.urlParams_.Set("requestId", requestId) return c @@ -52741,7 +55922,7 @@ func (c *InstancesStartCall) Do(opts ...googleapi.CallOption) (*Operation, error // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -52790,8 +55971,20 @@ func (r *InstancesService) StartWithEncryptionKey(project string, zone string, i return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesStartWithEncryptionKeyCall) RequestId(requestId string) *InstancesStartWithEncryptionKeyCall { c.urlParams_.Set("requestId", requestId) return c @@ -52909,7 +56102,7 @@ func (c *InstancesStartWithEncryptionKeyCall) Do(opts ...googleapi.CallOption) ( // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -52972,8 +56165,20 @@ func (c *InstancesStopCall) DiscardLocalSsd(discardLocalSsd bool) *InstancesStop return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesStopCall) RequestId(requestId string) *InstancesStopCall { c.urlParams_.Set("requestId", requestId) return c @@ -53091,7 +56296,7 @@ func (c *InstancesStopCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -53149,8 +56354,20 @@ func (c *InstancesSuspendCall) DiscardLocalSsd(discardLocalSsd bool) *InstancesS return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesSuspendCall) RequestId(requestId string) *InstancesSuspendCall { c.urlParams_.Set("requestId", requestId) return c @@ -53268,7 +56485,7 @@ func (c *InstancesSuspendCall) Do(opts ...googleapi.CallOption) (*Operation, err // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -53466,6 +56683,8 @@ type InstancesUpdateAccessConfigCall struct { // UpdateAccessConfig: Updates the specified access config from an // instance's network interface with the data included in the request. +// This method supports PATCH semantics and uses the JSON merge patch +// format and processing rules. func (r *InstancesService) UpdateAccessConfig(project string, zone string, instance string, networkInterface string, accessconfig *AccessConfig) *InstancesUpdateAccessConfigCall { c := &InstancesUpdateAccessConfigCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -53476,8 +56695,20 @@ func (r *InstancesService) UpdateAccessConfig(project string, zone string, insta return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InstancesUpdateAccessConfigCall) RequestId(requestId string) *InstancesUpdateAccessConfigCall { c.urlParams_.Set("requestId", requestId) return c @@ -53571,7 +56802,7 @@ func (c *InstancesUpdateAccessConfigCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Updates the specified access config from an instance's network interface with the data included in the request.", + // "description": "Updates the specified access config from an instance's network interface with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "POST", // "id": "compute.instances.updateAccessConfig", // "parameterOrder": [ @@ -53602,7 +56833,7 @@ func (c *InstancesUpdateAccessConfigCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -53629,341 +56860,542 @@ func (c *InstancesUpdateAccessConfigCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.interconnectAttachments.aggregatedList": +// method id "compute.instances.updateNetworkInterface": -type InterconnectAttachmentsAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstancesUpdateNetworkInterfaceCall struct { + s *Service + project string + zone string + instance string + networkinterface *NetworkInterface + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves an aggregated list of interconnect -// attachments. -func (r *InterconnectAttachmentsService) AggregatedList(project string) *InterconnectAttachmentsAggregatedListCall { - c := &InterconnectAttachmentsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// UpdateNetworkInterface: Updates an instance's network interface. This +// method follows PATCH semantics. +func (r *InstancesService) UpdateNetworkInterface(project string, zone string, instance string, networkInterface string, networkinterface *NetworkInterface) *InstancesUpdateNetworkInterfaceCall { + c := &InstancesUpdateNetworkInterfaceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.zone = zone + c.instance = instance + c.urlParams_.Set("networkInterface", networkInterface) + c.networkinterface = networkinterface return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *InterconnectAttachmentsAggregatedListCall) Filter(filter string) *InterconnectAttachmentsAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *InterconnectAttachmentsAggregatedListCall) MaxResults(maxResults int64) *InterconnectAttachmentsAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. // -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. // -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *InterconnectAttachmentsAggregatedListCall) OrderBy(orderBy string) *InterconnectAttachmentsAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *InterconnectAttachmentsAggregatedListCall) PageToken(pageToken string) *InterconnectAttachmentsAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesUpdateNetworkInterfaceCall) RequestId(requestId string) *InstancesUpdateNetworkInterfaceCall { + c.urlParams_.Set("requestId", requestId) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InterconnectAttachmentsAggregatedListCall) Fields(s ...googleapi.Field) *InterconnectAttachmentsAggregatedListCall { +func (c *InstancesUpdateNetworkInterfaceCall) Fields(s ...googleapi.Field) *InstancesUpdateNetworkInterfaceCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *InterconnectAttachmentsAggregatedListCall) IfNoneMatch(entityTag string) *InterconnectAttachmentsAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InterconnectAttachmentsAggregatedListCall) Context(ctx context.Context) *InterconnectAttachmentsAggregatedListCall { +func (c *InstancesUpdateNetworkInterfaceCall) Context(ctx context.Context) *InstancesUpdateNetworkInterfaceCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InterconnectAttachmentsAggregatedListCall) Header() http.Header { +func (c *InstancesUpdateNetworkInterfaceCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InterconnectAttachmentsAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesUpdateNetworkInterfaceCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/interconnectAttachments") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.interconnectAttachments.aggregatedList" call. -// Exactly one of *InterconnectAttachmentAggregatedList or error will be -// non-nil. Any non-2xx status code is an error. Response headers are in -// either *InterconnectAttachmentAggregatedList.ServerResponse.Header or -// (if a response was returned at all) in -// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check -// whether the returned error was because http.StatusNotModified was -// returned. -func (c *InterconnectAttachmentsAggregatedListCall) Do(opts ...googleapi.CallOption) (*InterconnectAttachmentAggregatedList, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } + body, err := googleapi.WithoutDataWrapper.JSONReader(c.networkinterface) if err != nil { return nil, err } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &InterconnectAttachmentAggregatedList{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Retrieves an aggregated list of interconnect attachments.", - // "httpMethod": "GET", - // "id": "compute.interconnectAttachments.aggregatedList", - // "parameterOrder": [ - // "project" - // ], - // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/aggregated/interconnectAttachments", - // "response": { - // "$ref": "InterconnectAttachmentAggregatedList" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" - // ] - // } - -} - -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *InterconnectAttachmentsAggregatedListCall) Pages(ctx context.Context, f func(*InterconnectAttachmentAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.interconnectAttachments.delete": - -type InterconnectAttachmentsDeleteCall struct { - s *Service - project string - region string - interconnectAttachment string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Delete: Deletes the specified interconnect attachment. -func (r *InterconnectAttachmentsService) Delete(project string, region string, interconnectAttachment string) *InterconnectAttachmentsDeleteCall { - c := &InterconnectAttachmentsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.region = region - c.interconnectAttachment = interconnectAttachment - return c -} - -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. -func (c *InterconnectAttachmentsDeleteCall) RequestId(requestId string) *InterconnectAttachmentsDeleteCall { - c.urlParams_.Set("requestId", requestId) - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *InterconnectAttachmentsDeleteCall) Fields(s ...googleapi.Field) *InterconnectAttachmentsDeleteCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *InterconnectAttachmentsDeleteCall) Context(ctx context.Context) *InterconnectAttachmentsDeleteCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *InterconnectAttachmentsDeleteCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *InterconnectAttachmentsDeleteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/updateNetworkInterface") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("PATCH", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "interconnectAttachment": c.interconnectAttachment, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.interconnectAttachments.delete" call. +// Do executes the "compute.instances.updateNetworkInterface" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InterconnectAttachmentsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesUpdateNetworkInterfaceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an instance's network interface. This method follows PATCH semantics.", + // "httpMethod": "PATCH", + // "id": "compute.instances.updateNetworkInterface", + // "parameterOrder": [ + // "project", + // "zone", + // "instance", + // "networkInterface" + // ], + // "parameters": { + // "instance": { + // "description": "The instance name for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "networkInterface": { + // "description": "The name of the network interface to update.", + // "location": "query", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/zones/{zone}/instances/{instance}/updateNetworkInterface", + // "request": { + // "$ref": "NetworkInterface" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.interconnectAttachments.aggregatedList": + +type InterconnectAttachmentsAggregatedListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// AggregatedList: Retrieves an aggregated list of interconnect +// attachments. +func (r *InterconnectAttachmentsService) AggregatedList(project string) *InterconnectAttachmentsAggregatedListCall { + c := &InterconnectAttachmentsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *InterconnectAttachmentsAggregatedListCall) Filter(filter string) *InterconnectAttachmentsAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *InterconnectAttachmentsAggregatedListCall) MaxResults(maxResults int64) *InterconnectAttachmentsAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *InterconnectAttachmentsAggregatedListCall) OrderBy(orderBy string) *InterconnectAttachmentsAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *InterconnectAttachmentsAggregatedListCall) PageToken(pageToken string) *InterconnectAttachmentsAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InterconnectAttachmentsAggregatedListCall) Fields(s ...googleapi.Field) *InterconnectAttachmentsAggregatedListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *InterconnectAttachmentsAggregatedListCall) IfNoneMatch(entityTag string) *InterconnectAttachmentsAggregatedListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InterconnectAttachmentsAggregatedListCall) Context(ctx context.Context) *InterconnectAttachmentsAggregatedListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InterconnectAttachmentsAggregatedListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InterconnectAttachmentsAggregatedListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/interconnectAttachments") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.interconnectAttachments.aggregatedList" call. +// Exactly one of *InterconnectAttachmentAggregatedList or error will be +// non-nil. Any non-2xx status code is an error. Response headers are in +// either *InterconnectAttachmentAggregatedList.ServerResponse.Header or +// (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *InterconnectAttachmentsAggregatedListCall) Do(opts ...googleapi.CallOption) (*InterconnectAttachmentAggregatedList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &InterconnectAttachmentAggregatedList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves an aggregated list of interconnect attachments.", + // "httpMethod": "GET", + // "id": "compute.interconnectAttachments.aggregatedList", + // "parameterOrder": [ + // "project" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/aggregated/interconnectAttachments", + // "response": { + // "$ref": "InterconnectAttachmentAggregatedList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *InterconnectAttachmentsAggregatedListCall) Pages(ctx context.Context, f func(*InterconnectAttachmentAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.interconnectAttachments.delete": + +type InterconnectAttachmentsDeleteCall struct { + s *Service + project string + region string + interconnectAttachment string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes the specified interconnect attachment. +func (r *InterconnectAttachmentsService) Delete(project string, region string, interconnectAttachment string) *InterconnectAttachmentsDeleteCall { + c := &InterconnectAttachmentsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.interconnectAttachment = interconnectAttachment + return c +} + +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InterconnectAttachmentsDeleteCall) RequestId(requestId string) *InterconnectAttachmentsDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InterconnectAttachmentsDeleteCall) Fields(s ...googleapi.Field) *InterconnectAttachmentsDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InterconnectAttachmentsDeleteCall) Context(ctx context.Context) *InterconnectAttachmentsDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InterconnectAttachmentsDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InterconnectAttachmentsDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "interconnectAttachment": c.interconnectAttachment, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.interconnectAttachments.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InterconnectAttachmentsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -54025,7 +57457,7 @@ func (c *InterconnectAttachmentsDeleteCall) Do(opts ...googleapi.CallOption) (*O // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -54389,8 +57821,20 @@ func (r *InterconnectAttachmentsService) Insert(project string, region string, i return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InterconnectAttachmentsInsertCall) RequestId(requestId string) *InterconnectAttachmentsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -54506,7 +57950,7 @@ func (c *InterconnectAttachmentsInsertCall) Do(opts ...googleapi.CallOption) (*O // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -54547,10 +57991,9 @@ func (r *InterconnectAttachmentsService) List(project string, region string) *In return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -54562,7 +58005,7 @@ func (r *InterconnectAttachmentsService) List(project string, region string) *In // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -54719,7 +58162,7 @@ func (c *InterconnectAttachmentsListCall) Do(opts ...googleapi.CallOption) (*Int // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -55121,10 +58564,9 @@ func (r *InterconnectLocationsService) List(project string) *InterconnectLocatio return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -55136,7 +58578,7 @@ func (r *InterconnectLocationsService) List(project string) *InterconnectLocatio // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -55291,7 +58733,7 @@ func (c *InterconnectLocationsListCall) Do(opts ...googleapi.CallOption) (*Inter // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -55522,8 +58964,20 @@ func (r *InterconnectsService) Delete(project string, interconnect string) *Inte return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InterconnectsDeleteCall) RequestId(requestId string) *InterconnectsDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -55634,7 +59088,7 @@ func (c *InterconnectsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -55823,8 +59277,20 @@ func (r *InterconnectsService) Insert(project string, interconnect *Interconnect return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InterconnectsInsertCall) RequestId(requestId string) *InterconnectsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -55931,7 +59397,7 @@ func (c *InterconnectsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -55970,10 +59436,9 @@ func (r *InterconnectsService) List(project string) *InterconnectsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -55985,7 +59450,7 @@ func (r *InterconnectsService) List(project string) *InterconnectsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -56140,7 +59605,7 @@ func (c *InterconnectsListCall) Do(opts ...googleapi.CallOption) (*InterconnectL // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -56217,7 +59682,8 @@ type InterconnectsPatchCall struct { } // Patch: Updates the specified interconnect with the data included in -// the request using patch semantics. +// the request. This method supports PATCH semantics and uses the JSON +// merge patch format and processing rules. func (r *InterconnectsService) Patch(project string, interconnect string, interconnect2 *Interconnect) *InterconnectsPatchCall { c := &InterconnectsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -56226,8 +59692,20 @@ func (r *InterconnectsService) Patch(project string, interconnect string, interc return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *InterconnectsPatchCall) RequestId(requestId string) *InterconnectsPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -56320,7 +59798,7 @@ func (c *InterconnectsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, e } return ret, nil // { - // "description": "Updates the specified interconnect with the data included in the request using patch semantics.", + // "description": "Updates the specified interconnect with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.interconnects.patch", // "parameterOrder": [ @@ -56343,7 +59821,7 @@ func (c *InterconnectsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -56512,6 +59990,142 @@ func (c *InterconnectsTestIamPermissionsCall) Do(opts ...googleapi.CallOption) ( } +// method id "compute.licenses.delete": + +type LicensesDeleteCall struct { + s *Service + project string + license string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes the specified license. +func (r *LicensesService) Delete(project string, license string) *LicensesDeleteCall { + c := &LicensesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.license = license + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *LicensesDeleteCall) Fields(s ...googleapi.Field) *LicensesDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *LicensesDeleteCall) Context(ctx context.Context) *LicensesDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *LicensesDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *LicensesDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/licenses/{license}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "license": c.license, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.licenses.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *LicensesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Deletes the specified license.", + // "httpMethod": "DELETE", + // "id": "compute.licenses.delete", + // "parameterOrder": [ + // "project", + // "license" + // ], + // "parameters": { + // "license": { + // "description": "Name of the license resource to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/licenses/{license}", + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.licenses.get": type LicensesGetCall struct { @@ -56524,8 +60138,7 @@ type LicensesGetCall struct { header_ http.Header } -// Get: Returns the specified License resource. Get a list of available -// licenses by making a list() request. +// Get: Returns the specified License resource. // For details, see https://cloud.google.com/compute/docs/reference/latest/licenses/get func (r *LicensesService) Get(project string, license string) *LicensesGetCall { c := &LicensesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -56629,7 +60242,7 @@ func (c *LicensesGetCall) Do(opts ...googleapi.CallOption) (*License, error) { } return ret, nil // { - // "description": "Returns the specified License resource. Get a list of available licenses by making a list() request.", + // "description": "Returns the specified License resource.", // "httpMethod": "GET", // "id": "compute.licenses.get", // "parameterOrder": [ @@ -56665,6 +60278,158 @@ func (c *LicensesGetCall) Do(opts ...googleapi.CallOption) (*License, error) { } +// method id "compute.licenses.getIamPolicy": + +type LicensesGetIamPolicyCall struct { + s *Service + project string + resource string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// GetIamPolicy: Gets the access control policy for a resource. May be +// empty if no such policy or resource exists. +func (r *LicensesService) GetIamPolicy(project string, resource string) *LicensesGetIamPolicyCall { + c := &LicensesGetIamPolicyCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.resource = resource + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *LicensesGetIamPolicyCall) Fields(s ...googleapi.Field) *LicensesGetIamPolicyCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *LicensesGetIamPolicyCall) IfNoneMatch(entityTag string) *LicensesGetIamPolicyCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *LicensesGetIamPolicyCall) Context(ctx context.Context) *LicensesGetIamPolicyCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *LicensesGetIamPolicyCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *LicensesGetIamPolicyCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/licenses/{resource}/getIamPolicy") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "resource": c.resource, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.licenses.getIamPolicy" call. +// Exactly one of *Policy or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Policy.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *LicensesGetIamPolicyCall) Do(opts ...googleapi.CallOption) (*Policy, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Policy{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Gets the access control policy for a resource. May be empty if no such policy or resource exists.", + // "httpMethod": "GET", + // "id": "compute.licenses.getIamPolicy", + // "parameterOrder": [ + // "project", + // "resource" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "resource": { + // "description": "Name of the resource for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/licenses/{resource}/getIamPolicy", + // "response": { + // "$ref": "Policy" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + // method id "compute.licenses.insert": type LicensesInsertCall struct { @@ -56684,8 +60449,20 @@ func (r *LicensesService) Insert(project string, license *License) *LicensesInse return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *LicensesInsertCall) RequestId(requestId string) *LicensesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -56792,7 +60569,7 @@ func (c *LicensesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -56838,10 +60615,9 @@ func (r *LicensesService) List(project string) *LicensesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -56853,7 +60629,7 @@ func (r *LicensesService) List(project string) *LicensesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -57008,7 +60784,7 @@ func (c *LicensesListCall) Do(opts ...googleapi.CallOption) (*LicensesListRespon // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -57072,6 +60848,301 @@ func (c *LicensesListCall) Pages(ctx context.Context, f func(*LicensesListRespon } } +// method id "compute.licenses.setIamPolicy": + +type LicensesSetIamPolicyCall struct { + s *Service + project string + resource string + policy *Policy + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetIamPolicy: Sets the access control policy on the specified +// resource. Replaces any existing policy. +func (r *LicensesService) SetIamPolicy(project string, resource string, policy *Policy) *LicensesSetIamPolicyCall { + c := &LicensesSetIamPolicyCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.resource = resource + c.policy = policy + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *LicensesSetIamPolicyCall) Fields(s ...googleapi.Field) *LicensesSetIamPolicyCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *LicensesSetIamPolicyCall) Context(ctx context.Context) *LicensesSetIamPolicyCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *LicensesSetIamPolicyCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *LicensesSetIamPolicyCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/licenses/{resource}/setIamPolicy") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "resource": c.resource, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.licenses.setIamPolicy" call. +// Exactly one of *Policy or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Policy.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *LicensesSetIamPolicyCall) Do(opts ...googleapi.CallOption) (*Policy, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Policy{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the access control policy on the specified resource. Replaces any existing policy.", + // "httpMethod": "POST", + // "id": "compute.licenses.setIamPolicy", + // "parameterOrder": [ + // "project", + // "resource" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "resource": { + // "description": "Name of the resource for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/licenses/{resource}/setIamPolicy", + // "request": { + // "$ref": "Policy" + // }, + // "response": { + // "$ref": "Policy" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.licenses.testIamPermissions": + +type LicensesTestIamPermissionsCall struct { + s *Service + project string + resource string + testpermissionsrequest *TestPermissionsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// TestIamPermissions: Returns permissions that a caller has on the +// specified resource. +func (r *LicensesService) TestIamPermissions(project string, resource string, testpermissionsrequest *TestPermissionsRequest) *LicensesTestIamPermissionsCall { + c := &LicensesTestIamPermissionsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.resource = resource + c.testpermissionsrequest = testpermissionsrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *LicensesTestIamPermissionsCall) Fields(s ...googleapi.Field) *LicensesTestIamPermissionsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *LicensesTestIamPermissionsCall) Context(ctx context.Context) *LicensesTestIamPermissionsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *LicensesTestIamPermissionsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *LicensesTestIamPermissionsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/licenses/{resource}/testIamPermissions") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "resource": c.resource, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.licenses.testIamPermissions" call. +// Exactly one of *TestPermissionsResponse or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *TestPermissionsResponse.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *LicensesTestIamPermissionsCall) Do(opts ...googleapi.CallOption) (*TestPermissionsResponse, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &TestPermissionsResponse{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns permissions that a caller has on the specified resource.", + // "httpMethod": "POST", + // "id": "compute.licenses.testIamPermissions", + // "parameterOrder": [ + // "project", + // "resource" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "resource": { + // "description": "Name of the resource for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/licenses/{resource}/testIamPermissions", + // "request": { + // "$ref": "TestPermissionsRequest" + // }, + // "response": { + // "$ref": "TestPermissionsResponse" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + // method id "compute.machineTypes.aggregatedList": type MachineTypesAggregatedListCall struct { @@ -57091,10 +61162,9 @@ func (r *MachineTypesService) AggregatedList(project string) *MachineTypesAggreg return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -57106,7 +61176,7 @@ func (r *MachineTypesService) AggregatedList(project string) *MachineTypesAggreg // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -57261,7 +61331,7 @@ func (c *MachineTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Mach // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -57511,10 +61581,9 @@ func (r *MachineTypesService) List(project string, zone string) *MachineTypesLis return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -57526,7 +61595,7 @@ func (r *MachineTypesService) List(project string, zone string) *MachineTypesLis // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -57683,7 +61752,7 @@ func (c *MachineTypesListCall) Do(opts ...googleapi.CallOption) (*MachineTypeLis // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -57775,8 +61844,20 @@ func (r *NetworksService) AddPeering(project string, network string, networksadd return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *NetworksAddPeeringCall) RequestId(requestId string) *NetworksAddPeeringCall { c.urlParams_.Set("requestId", requestId) return c @@ -57892,7 +61973,7 @@ func (c *NetworksAddPeeringCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -57932,8 +62013,20 @@ func (r *NetworksService) Delete(project string, network string) *NetworksDelete return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *NetworksDeleteCall) RequestId(requestId string) *NetworksDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -58044,7 +62137,7 @@ func (c *NetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -58235,8 +62328,20 @@ func (r *NetworksService) Insert(project string, network *Network) *NetworksInse return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *NetworksInsertCall) RequestId(requestId string) *NetworksInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -58343,7 +62448,7 @@ func (c *NetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -58383,10 +62488,262 @@ func (r *NetworksService) List(project string) *NetworksListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *NetworksListCall) Filter(filter string) *NetworksListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *NetworksListCall) MaxResults(maxResults int64) *NetworksListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *NetworksListCall) OrderBy(orderBy string) *NetworksListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *NetworksListCall) PageToken(pageToken string) *NetworksListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *NetworksListCall) Fields(s ...googleapi.Field) *NetworksListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *NetworksListCall) IfNoneMatch(entityTag string) *NetworksListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *NetworksListCall) Context(ctx context.Context) *NetworksListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *NetworksListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *NetworksListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.networks.list" call. +// Exactly one of *NetworkList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *NetworkList.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &NetworkList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves the list of networks available to the specified project.", + // "httpMethod": "GET", + // "id": "compute.networks.list", + // "parameterOrder": [ + // "project" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/networks", + // "response": { + // "$ref": "NetworkList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *NetworksListCall) Pages(ctx context.Context, f func(*NetworkList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.networks.listIpOwners": + +type NetworksListIpOwnersCall struct { + s *Service + project string + network string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// ListIpOwners: List the internal IP owners in the specified network. +func (r *NetworksService) ListIpOwners(project string, network string) *NetworksListIpOwnersCall { + c := &NetworksListIpOwnersCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.network = network + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -58398,7 +62755,7 @@ func (r *NetworksService) List(project string) *NetworksListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -58410,18 +62767,25 @@ func (r *NetworksService) List(project string) *NetworksListCall { // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *NetworksListCall) Filter(filter string) *NetworksListCall { +func (c *NetworksListIpOwnersCall) Filter(filter string) *NetworksListIpOwnersCall { c.urlParams_.Set("filter", filter) return c } +// IpCidrRange sets the optional parameter "ipCidrRange": (Optional) IP +// CIDR range filter, example: "10.128.10.0/30". +func (c *NetworksListIpOwnersCall) IpCidrRange(ipCidrRange string) *NetworksListIpOwnersCall { + c.urlParams_.Set("ipCidrRange", ipCidrRange) + return c +} + // MaxResults sets the optional parameter "maxResults": The maximum // number of results per page that should be returned. If the number of // available results is larger than maxResults, Compute Engine returns a // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *NetworksListCall) MaxResults(maxResults int64) *NetworksListCall { +func (c *NetworksListIpOwnersCall) MaxResults(maxResults int64) *NetworksListIpOwnersCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -58438,23 +62802,51 @@ func (c *NetworksListCall) MaxResults(maxResults int64) *NetworksListCall { // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *NetworksListCall) OrderBy(orderBy string) *NetworksListCall { +func (c *NetworksListIpOwnersCall) OrderBy(orderBy string) *NetworksListIpOwnersCall { c.urlParams_.Set("orderBy", orderBy) return c } +// OwnerProjects sets the optional parameter "ownerProjects": (Optional) +// Project IDs filter, example: "project-1,project-2". +func (c *NetworksListIpOwnersCall) OwnerProjects(ownerProjects string) *NetworksListIpOwnersCall { + c.urlParams_.Set("ownerProjects", ownerProjects) + return c +} + +// OwnerTypes sets the optional parameter "ownerTypes": (Optional) Owner +// types filter, example: "instance,forwardingRule". +func (c *NetworksListIpOwnersCall) OwnerTypes(ownerTypes string) *NetworksListIpOwnersCall { + c.urlParams_.Set("ownerTypes", ownerTypes) + return c +} + // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *NetworksListCall) PageToken(pageToken string) *NetworksListCall { +func (c *NetworksListIpOwnersCall) PageToken(pageToken string) *NetworksListIpOwnersCall { c.urlParams_.Set("pageToken", pageToken) return c } +// SubnetName sets the optional parameter "subnetName": (Optional) +// Subnetwork name filter. +func (c *NetworksListIpOwnersCall) SubnetName(subnetName string) *NetworksListIpOwnersCall { + c.urlParams_.Set("subnetName", subnetName) + return c +} + +// SubnetRegion sets the optional parameter "subnetRegion": (Optional) +// Subnetwork region filter. +func (c *NetworksListIpOwnersCall) SubnetRegion(subnetRegion string) *NetworksListIpOwnersCall { + c.urlParams_.Set("subnetRegion", subnetRegion) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *NetworksListCall) Fields(s ...googleapi.Field) *NetworksListCall { +func (c *NetworksListIpOwnersCall) Fields(s ...googleapi.Field) *NetworksListIpOwnersCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -58464,7 +62856,7 @@ func (c *NetworksListCall) Fields(s ...googleapi.Field) *NetworksListCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *NetworksListCall) IfNoneMatch(entityTag string) *NetworksListCall { +func (c *NetworksListIpOwnersCall) IfNoneMatch(entityTag string) *NetworksListIpOwnersCall { c.ifNoneMatch_ = entityTag return c } @@ -58472,21 +62864,21 @@ func (c *NetworksListCall) IfNoneMatch(entityTag string) *NetworksListCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *NetworksListCall) Context(ctx context.Context) *NetworksListCall { +func (c *NetworksListIpOwnersCall) Context(ctx context.Context) *NetworksListIpOwnersCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *NetworksListCall) Header() http.Header { +func (c *NetworksListIpOwnersCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *NetworksListCall) doRequest(alt string) (*http.Response, error) { +func (c *NetworksListIpOwnersCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -58497,24 +62889,25 @@ func (c *NetworksListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}/listIpOwners") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "network": c.network, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.networks.list" call. -// Exactly one of *NetworkList or error will be non-nil. Any non-2xx +// Do executes the "compute.networks.listIpOwners" call. +// Exactly one of *IpOwnerList or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *NetworkList.ServerResponse.Header or (if a response was returned at +// *IpOwnerList.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error) { +func (c *NetworksListIpOwnersCall) Do(opts ...googleapi.CallOption) (*IpOwnerList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -58533,7 +62926,7 @@ func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &NetworkList{ + ret := &IpOwnerList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -58545,15 +62938,21 @@ func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error } return ret, nil // { - // "description": "Retrieves the list of networks available to the specified project.", + // "description": "List the internal IP owners in the specified network.", // "httpMethod": "GET", - // "id": "compute.networks.list", + // "id": "compute.networks.listIpOwners", // "parameterOrder": [ - // "project" + // "project", + // "network" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "ipCidrRange": { + // "description": "(Optional) IP CIDR range filter, example: \"10.128.10.0/30\".", // "location": "query", // "type": "string" // }, @@ -58565,11 +62964,28 @@ func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error // "minimum": "0", // "type": "integer" // }, + // "network": { + // "description": "Name of the network to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, // "orderBy": { // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", // "location": "query", // "type": "string" // }, + // "ownerProjects": { + // "description": "(Optional) Project IDs filter, example: \"project-1,project-2\".", + // "location": "query", + // "type": "string" + // }, + // "ownerTypes": { + // "description": "(Optional) Owner types filter, example: \"instance,forwardingRule\".", + // "location": "query", + // "type": "string" + // }, // "pageToken": { // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", // "location": "query", @@ -58581,11 +62997,23 @@ func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "subnetName": { + // "description": "(Optional) Subnetwork name filter.", + // "location": "query", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "type": "string" + // }, + // "subnetRegion": { + // "description": "(Optional) Subnetwork region filter.", + // "location": "query", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "type": "string" // } // }, - // "path": "{project}/global/networks", + // "path": "{project}/global/networks/{network}/listIpOwners", // "response": { - // "$ref": "NetworkList" + // "$ref": "IpOwnerList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -58599,7 +63027,7 @@ func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *NetworksListCall) Pages(ctx context.Context, f func(*NetworkList) error) error { +func (c *NetworksListIpOwnersCall) Pages(ctx context.Context, f func(*IpOwnerList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -58617,6 +63045,178 @@ func (c *NetworksListCall) Pages(ctx context.Context, f func(*NetworkList) error } } +// method id "compute.networks.patch": + +type NetworksPatchCall struct { + s *Service + project string + network string + network2 *Network + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Patches the specified network with the data included in the +// request. +func (r *NetworksService) Patch(project string, network string, network2 *Network) *NetworksPatchCall { + c := &NetworksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.network = network + c.network2 = network2 + return c +} + +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *NetworksPatchCall) RequestId(requestId string) *NetworksPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *NetworksPatchCall) Fields(s ...googleapi.Field) *NetworksPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *NetworksPatchCall) Context(ctx context.Context) *NetworksPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *NetworksPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *NetworksPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.network2) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("PATCH", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "network": c.network, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.networks.patch" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *NetworksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Patches the specified network with the data included in the request.", + // "httpMethod": "PATCH", + // "id": "compute.networks.patch", + // "parameterOrder": [ + // "project", + // "network" + // ], + // "parameters": { + // "network": { + // "description": "Name of the network to update.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // } + // }, + // "path": "{project}/global/networks/{network}", + // "request": { + // "$ref": "Network" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + // method id "compute.networks.removePeering": type NetworksRemovePeeringCall struct { @@ -58638,8 +63238,20 @@ func (r *NetworksService) RemovePeering(project string, network string, networks return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *NetworksRemovePeeringCall) RequestId(requestId string) *NetworksRemovePeeringCall { c.urlParams_.Set("requestId", requestId) return c @@ -58755,7 +63367,7 @@ func (c *NetworksRemovePeeringCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -58795,8 +63407,20 @@ func (r *NetworksService) SwitchToCustomMode(project string, network string) *Ne return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *NetworksSwitchToCustomModeCall) RequestId(requestId string) *NetworksSwitchToCustomModeCall { c.urlParams_.Set("requestId", requestId) return c @@ -58907,7 +63531,7 @@ func (c *NetworksSwitchToCustomModeCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -59082,15 +63706,27 @@ type ProjectsDisableXpnHostCall struct { header_ http.Header } -// DisableXpnHost: Disable this project as an XPN host project. +// DisableXpnHost: Disable this project as a shared VPC host project. func (r *ProjectsService) DisableXpnHost(project string) *ProjectsDisableXpnHostCall { c := &ProjectsDisableXpnHostCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ProjectsDisableXpnHostCall) RequestId(requestId string) *ProjectsDisableXpnHostCall { c.urlParams_.Set("requestId", requestId) return c @@ -59177,7 +63813,7 @@ func (c *ProjectsDisableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Disable this project as an XPN host project.", + // "description": "Disable this project as a shared VPC host project.", // "httpMethod": "POST", // "id": "compute.projects.disableXpnHost", // "parameterOrder": [ @@ -59192,7 +63828,7 @@ func (c *ProjectsDisableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -59220,8 +63856,8 @@ type ProjectsDisableXpnResourceCall struct { header_ http.Header } -// DisableXpnResource: Disable an XPN resource associated with this host -// project. +// DisableXpnResource: Disable a serivce resource (a.k.a service +// project) associated with this host project. func (r *ProjectsService) DisableXpnResource(project string, projectsdisablexpnresourcerequest *ProjectsDisableXpnResourceRequest) *ProjectsDisableXpnResourceCall { c := &ProjectsDisableXpnResourceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -59229,8 +63865,20 @@ func (r *ProjectsService) DisableXpnResource(project string, projectsdisablexpnr return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ProjectsDisableXpnResourceCall) RequestId(requestId string) *ProjectsDisableXpnResourceCall { c.urlParams_.Set("requestId", requestId) return c @@ -59322,7 +63970,7 @@ func (c *ProjectsDisableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Disable an XPN resource associated with this host project.", + // "description": "Disable a serivce resource (a.k.a service project) associated with this host project.", // "httpMethod": "POST", // "id": "compute.projects.disableXpnResource", // "parameterOrder": [ @@ -59337,7 +63985,7 @@ func (c *ProjectsDisableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -59367,15 +64015,27 @@ type ProjectsEnableXpnHostCall struct { header_ http.Header } -// EnableXpnHost: Enable this project as an XPN host project. +// EnableXpnHost: Enable this project as a shared VPC host project. func (r *ProjectsService) EnableXpnHost(project string) *ProjectsEnableXpnHostCall { c := &ProjectsEnableXpnHostCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ProjectsEnableXpnHostCall) RequestId(requestId string) *ProjectsEnableXpnHostCall { c.urlParams_.Set("requestId", requestId) return c @@ -59462,7 +64122,7 @@ func (c *ProjectsEnableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Enable this project as an XPN host project.", + // "description": "Enable this project as a shared VPC host project.", // "httpMethod": "POST", // "id": "compute.projects.enableXpnHost", // "parameterOrder": [ @@ -59477,7 +64137,7 @@ func (c *ProjectsEnableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -59505,10 +64165,9 @@ type ProjectsEnableXpnResourceCall struct { header_ http.Header } -// EnableXpnResource: Enable XPN resource (a.k.a service project or -// service folder in the future) for a host project, so that subnetworks -// in the host project can be used by instances in the service project -// or folder. +// EnableXpnResource: Enable service resource (a.k.a service project) +// for a host project, so that subnets in the host project can be used +// by instances in the service project. func (r *ProjectsService) EnableXpnResource(project string, projectsenablexpnresourcerequest *ProjectsEnableXpnResourceRequest) *ProjectsEnableXpnResourceCall { c := &ProjectsEnableXpnResourceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -59516,8 +64175,20 @@ func (r *ProjectsService) EnableXpnResource(project string, projectsenablexpnres return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ProjectsEnableXpnResourceCall) RequestId(requestId string) *ProjectsEnableXpnResourceCall { c.urlParams_.Set("requestId", requestId) return c @@ -59609,7 +64280,7 @@ func (c *ProjectsEnableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Opera } return ret, nil // { - // "description": "Enable XPN resource (a.k.a service project or service folder in the future) for a host project, so that subnetworks in the host project can be used by instances in the service project or folder.", + // "description": "Enable service resource (a.k.a service project) for a host project, so that subnets in the host project can be used by instances in the service project.", // "httpMethod": "POST", // "id": "compute.projects.enableXpnResource", // "parameterOrder": [ @@ -59624,7 +64295,7 @@ func (c *ProjectsEnableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Opera // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -59796,8 +64467,8 @@ type ProjectsGetXpnHostCall struct { header_ http.Header } -// GetXpnHost: Get the XPN host project that this project links to. May -// be empty if no link exists. +// GetXpnHost: Get the shared VPC host project that this project links +// to. May be empty if no link exists. func (r *ProjectsService) GetXpnHost(project string) *ProjectsGetXpnHostCall { c := &ProjectsGetXpnHostCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -59898,7 +64569,7 @@ func (c *ProjectsGetXpnHostCall) Do(opts ...googleapi.CallOption) (*Project, err } return ret, nil // { - // "description": "Get the XPN host project that this project links to. May be empty if no link exists.", + // "description": "Get the shared VPC host project that this project links to. May be empty if no link exists.", // "httpMethod": "GET", // "id": "compute.projects.getXpnHost", // "parameterOrder": [ @@ -59919,8 +64590,7 @@ func (c *ProjectsGetXpnHostCall) Do(opts ...googleapi.CallOption) (*Project, err // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } @@ -59937,7 +64607,8 @@ type ProjectsGetXpnResourcesCall struct { header_ http.Header } -// GetXpnResources: Get XPN resources associated with this host project. +// GetXpnResources: Get service resources (a.k.a service project) +// associated with this host project. func (r *ProjectsService) GetXpnResources(project string) *ProjectsGetXpnResourcesCall { c := &ProjectsGetXpnResourcesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -60062,7 +64733,7 @@ func (c *ProjectsGetXpnResourcesCall) Do(opts ...googleapi.CallOption) (*Project } return ret, nil // { - // "description": "Get XPN resources associated with this host project.", + // "description": "Get service resources (a.k.a service project) associated with this host project.", // "httpMethod": "GET", // "id": "compute.projects.getXpnResources", // "parameterOrder": [ @@ -60102,8 +64773,7 @@ func (c *ProjectsGetXpnResourcesCall) Do(opts ...googleapi.CallOption) (*Project // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } @@ -60141,8 +64811,8 @@ type ProjectsListXpnHostsCall struct { header_ http.Header } -// ListXpnHosts: List all XPN host projects visible to the user in an -// organization. +// ListXpnHosts: List all shared VPC host projects visible to the user +// in an organization. func (r *ProjectsService) ListXpnHosts(project string, projectslistxpnhostsrequest *ProjectsListXpnHostsRequest) *ProjectsListXpnHostsCall { c := &ProjectsListXpnHostsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -60260,7 +64930,7 @@ func (c *ProjectsListXpnHostsCall) Do(opts ...googleapi.CallOption) (*XpnHostLis } return ret, nil // { - // "description": "List all XPN host projects visible to the user in an organization.", + // "description": "List all shared VPC host projects visible to the user in an organization.", // "httpMethod": "POST", // "id": "compute.projects.listXpnHosts", // "parameterOrder": [ @@ -60303,8 +64973,7 @@ func (c *ProjectsListXpnHostsCall) Do(opts ...googleapi.CallOption) (*XpnHostLis // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } @@ -60350,8 +65019,20 @@ func (r *ProjectsService) MoveDisk(project string, diskmoverequest *DiskMoveRequ return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ProjectsMoveDiskCall) RequestId(requestId string) *ProjectsMoveDiskCall { c.urlParams_.Set("requestId", requestId) return c @@ -60458,7 +65139,7 @@ func (c *ProjectsMoveDiskCall) Do(opts ...googleapi.CallOption) (*Operation, err // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -60498,8 +65179,20 @@ func (r *ProjectsService) MoveInstance(project string, instancemoverequest *Inst return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ProjectsMoveInstanceCall) RequestId(requestId string) *ProjectsMoveInstanceCall { c.urlParams_.Set("requestId", requestId) return c @@ -60606,7 +65299,7 @@ func (c *ProjectsMoveInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -60647,8 +65340,20 @@ func (r *ProjectsService) SetCommonInstanceMetadata(project string, metadata *Me return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ProjectsSetCommonInstanceMetadataCall) RequestId(requestId string) *ProjectsSetCommonInstanceMetadataCall { c.urlParams_.Set("requestId", requestId) return c @@ -60755,7 +65460,7 @@ func (c *ProjectsSetCommonInstanceMetadataCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -60796,8 +65501,20 @@ func (r *ProjectsService) SetDefaultServiceAccount(project string, projectssetde return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ProjectsSetDefaultServiceAccountCall) RequestId(requestId string) *ProjectsSetDefaultServiceAccountCall { c.urlParams_.Set("requestId", requestId) return c @@ -60904,7 +65621,7 @@ func (c *ProjectsSetDefaultServiceAccountCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -60947,8 +65664,20 @@ func (r *ProjectsService) SetUsageExportBucket(project string, usageexportlocati return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *ProjectsSetUsageExportBucketCall) RequestId(requestId string) *ProjectsSetUsageExportBucketCall { c.urlParams_.Set("requestId", requestId) return c @@ -61055,7 +65784,7 @@ func (c *ProjectsSetUsageExportBucketCall) Do(opts ...googleapi.CallOption) (*Op // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -61099,8 +65828,20 @@ func (r *RegionAutoscalersService) Delete(project string, region string, autosca return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionAutoscalersDeleteCall) RequestId(requestId string) *RegionAutoscalersDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -61220,7 +65961,7 @@ func (c *RegionAutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -61421,8 +66162,20 @@ func (r *RegionAutoscalersService) Insert(project string, region string, autosca return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionAutoscalersInsertCall) RequestId(requestId string) *RegionAutoscalersInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -61538,7 +66291,7 @@ func (c *RegionAutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -61579,10 +66332,9 @@ func (r *RegionAutoscalersService) List(project string, region string) *RegionAu return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -61594,7 +66346,7 @@ func (r *RegionAutoscalersService) List(project string, region string) *RegionAu // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -61751,7 +66503,7 @@ func (c *RegionAutoscalersListCall) Do(opts ...googleapi.CallOption) (*RegionAut // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -61835,7 +66587,8 @@ type RegionAutoscalersPatchCall struct { } // Patch: Updates an autoscaler in the specified project using the data -// included in the request. This method supports patch semantics. +// included in the request. This method supports PATCH semantics and +// uses the JSON merge patch format and processing rules. func (r *RegionAutoscalersService) Patch(project string, region string, autoscaler *Autoscaler) *RegionAutoscalersPatchCall { c := &RegionAutoscalersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -61851,8 +66604,20 @@ func (c *RegionAutoscalersPatchCall) Autoscaler(autoscaler string) *RegionAutosc return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and then the request times out. If you make the request again with +// the same request ID, the server can check if original operation with +// the same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionAutoscalersPatchCall) RequestId(requestId string) *RegionAutoscalersPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -61945,7 +66710,7 @@ func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.regionAutoscalers.patch", // "parameterOrder": [ @@ -61974,7 +66739,7 @@ func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -62183,8 +66948,17 @@ func (c *RegionAutoscalersUpdateCall) Autoscaler(autoscaler string) *RegionAutos return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and then the request times out. If you make the request again with +// the same request ID, the server can check if original operation with +// the same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. func (c *RegionAutoscalersUpdateCall) RequestId(requestId string) *RegionAutoscalersUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -62306,7 +67080,7 @@ func (c *RegionAutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", // "location": "query", // "type": "string" // } @@ -62347,8 +67121,20 @@ func (r *RegionBackendServicesService) Delete(project string, region string, bac return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionBackendServicesDeleteCall) RequestId(requestId string) *RegionBackendServicesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -62468,7 +67254,7 @@ func (c *RegionBackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -62830,8 +67616,20 @@ func (r *RegionBackendServicesService) Insert(project string, region string, bac return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionBackendServicesInsertCall) RequestId(requestId string) *RegionBackendServicesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -62947,7 +67745,7 @@ func (c *RegionBackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -62988,10 +67786,9 @@ func (r *RegionBackendServicesService) List(project string, region string) *Regi return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -63003,7 +67800,7 @@ func (r *RegionBackendServicesService) List(project string, region string) *Regi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -63160,7 +67957,7 @@ func (c *RegionBackendServicesListCall) Do(opts ...googleapi.CallOption) (*Backe // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -63248,7 +68045,8 @@ type RegionBackendServicesPatchCall struct { // the data included in the request. There are several restrictions and // guidelines to keep in mind when updating a backend service. Read // Restrictions and Guidelines for more information. This method -// supports patch semantics. +// supports PATCH semantics and uses the JSON merge patch format and +// processing rules. func (r *RegionBackendServicesService) Patch(project string, region string, backendService string, backendservice *BackendService) *RegionBackendServicesPatchCall { c := &RegionBackendServicesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -63258,8 +68056,20 @@ func (r *RegionBackendServicesService) Patch(project string, region string, back return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionBackendServicesPatchCall) RequestId(requestId string) *RegionBackendServicesPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -63353,7 +68163,7 @@ func (c *RegionBackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + // "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.regionBackendServices.patch", // "parameterOrder": [ @@ -63384,7 +68194,7 @@ func (c *RegionBackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -63590,8 +68400,20 @@ func (r *RegionBackendServicesService) Update(project string, region string, bac return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionBackendServicesUpdateCall) RequestId(requestId string) *RegionBackendServicesUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -63716,7 +68538,7 @@ func (c *RegionBackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -63754,10 +68576,9 @@ func (r *RegionCommitmentsService) AggregatedList(project string) *RegionCommitm return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -63769,7 +68590,7 @@ func (r *RegionCommitmentsService) AggregatedList(project string) *RegionCommitm // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -63924,7 +68745,7 @@ func (c *RegionCommitmentsAggregatedListCall) Do(opts ...googleapi.CallOption) ( // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -64163,7 +68984,7 @@ type RegionCommitmentsInsertCall struct { header_ http.Header } -// Insert: Creates an commitment in the specified project using the data +// Insert: Creates a commitment in the specified project using the data // included in the request. func (r *RegionCommitmentsService) Insert(project string, region string, commitment *Commitment) *RegionCommitmentsInsertCall { c := &RegionCommitmentsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -64173,8 +68994,20 @@ func (r *RegionCommitmentsService) Insert(project string, region string, commitm return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionCommitmentsInsertCall) RequestId(requestId string) *RegionCommitmentsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -64267,7 +69100,7 @@ func (c *RegionCommitmentsInsertCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Creates an commitment in the specified project using the data included in the request.", + // "description": "Creates a commitment in the specified project using the data included in the request.", // "httpMethod": "POST", // "id": "compute.regionCommitments.insert", // "parameterOrder": [ @@ -64290,7 +69123,7 @@ func (c *RegionCommitmentsInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -64331,10 +69164,9 @@ func (r *RegionCommitmentsService) List(project string, region string) *RegionCo return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -64346,7 +69178,7 @@ func (r *RegionCommitmentsService) List(project string, region string) *RegionCo // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -64503,7 +69335,7 @@ func (c *RegionCommitmentsListCall) Do(opts ...googleapi.CallOption) (*Commitmen // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -64917,10 +69749,9 @@ func (r *RegionDiskTypesService) List(project string, region string) *RegionDisk return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -64932,7 +69763,7 @@ func (r *RegionDiskTypesService) List(project string, region string) *RegionDisk // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -65089,7 +69920,7 @@ func (c *RegionDiskTypesListCall) Do(opts ...googleapi.CallOption) (*RegionDiskT // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -65189,8 +70020,20 @@ func (c *RegionDisksCreateSnapshotCall) GuestFlush(guestFlush bool) *RegionDisks return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionDisksCreateSnapshotCall) RequestId(requestId string) *RegionDisksCreateSnapshotCall { c.urlParams_.Set("requestId", requestId) return c @@ -65319,7 +70162,7 @@ func (c *RegionDisksCreateSnapshotCall) Do(opts ...googleapi.CallOption) (*Opera // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -65363,8 +70206,20 @@ func (r *RegionDisksService) Delete(project string, region string, disk string) return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionDisksDeleteCall) RequestId(requestId string) *RegionDisksDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -65483,7 +70338,7 @@ func (c *RegionDisksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -65684,8 +70539,17 @@ func (r *RegionDisksService) Insert(project string, region string, disk *Disk) * return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and then the request times out. If you make the request again with +// the same request ID, the server can check if original operation with +// the same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. func (c *RegionDisksInsertCall) RequestId(requestId string) *RegionDisksInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -65808,7 +70672,7 @@ func (c *RegionDisksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", // "location": "query", // "type": "string" // }, @@ -65854,10 +70718,9 @@ func (r *RegionDisksService) List(project string, region string) *RegionDisksLis return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -65869,7 +70732,7 @@ func (r *RegionDisksService) List(project string, region string) *RegionDisksLis // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -66026,7 +70889,7 @@ func (c *RegionDisksListCall) Do(opts ...googleapi.CallOption) (*DiskList, error // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -66120,8 +70983,20 @@ func (r *RegionDisksService) Resize(project string, region string, disk string, return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionDisksResizeCall) RequestId(requestId string) *RegionDisksResizeCall { c.urlParams_.Set("requestId", requestId) return c @@ -66246,7 +71121,7 @@ func (c *RegionDisksResizeCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -66289,8 +71164,20 @@ func (r *RegionDisksService) SetLabels(project string, region string, resource s return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionDisksSetLabelsCall) RequestId(requestId string) *RegionDisksSetLabelsCall { c.urlParams_.Set("requestId", requestId) return c @@ -66408,7 +71295,7 @@ func (c *RegionDisksSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -66617,6 +71504,11 @@ type RegionInstanceGroupManagersAbandonInstancesCall struct { // been removed from the group. You must separately verify the status of // the abandoning action with the listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *RegionInstanceGroupManagersService) AbandonInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersabandoninstancesrequest *RegionInstanceGroupManagersAbandonInstancesRequest) *RegionInstanceGroupManagersAbandonInstancesCall { @@ -66628,8 +71520,20 @@ func (r *RegionInstanceGroupManagersService) AbandonInstances(project string, re return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersAbandonInstancesCall) RequestId(requestId string) *RegionInstanceGroupManagersAbandonInstancesCall { c.urlParams_.Set("requestId", requestId) return c @@ -66723,7 +71627,7 @@ func (c *RegionInstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.C } return ret, nil // { - // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.regionInstanceGroupManagers.abandonInstances", // "parameterOrder": [ @@ -66752,7 +71656,7 @@ func (c *RegionInstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.C // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -66772,6 +71676,162 @@ func (c *RegionInstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.C } +// method id "compute.regionInstanceGroupManagers.applyUpdatesToInstances": + +type RegionInstanceGroupManagersApplyUpdatesToInstancesCall struct { + s *Service + project string + region string + instanceGroupManager string + regioninstancegroupmanagersapplyupdatesrequest *RegionInstanceGroupManagersApplyUpdatesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// ApplyUpdatesToInstances: Apply updates to selected instances the +// managed instance group. +func (r *RegionInstanceGroupManagersService) ApplyUpdatesToInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersapplyupdatesrequest *RegionInstanceGroupManagersApplyUpdatesRequest) *RegionInstanceGroupManagersApplyUpdatesToInstancesCall { + c := &RegionInstanceGroupManagersApplyUpdatesToInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + c.regioninstancegroupmanagersapplyupdatesrequest = regioninstancegroupmanagersapplyupdatesrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersApplyUpdatesToInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersApplyUpdatesToInstancesCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersApplyUpdatesToInstancesCall) Context(ctx context.Context) *RegionInstanceGroupManagersApplyUpdatesToInstancesCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersApplyUpdatesToInstancesCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersApplyUpdatesToInstancesCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersapplyupdatesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.applyUpdatesToInstances" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersApplyUpdatesToInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Apply updates to selected instances the managed instance group.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.applyUpdatesToInstances", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "The name of the managed instance group, should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request, should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances", + // "request": { + // "$ref": "RegionInstanceGroupManagersApplyUpdatesRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.regionInstanceGroupManagers.delete": type RegionInstanceGroupManagersDeleteCall struct { @@ -66794,8 +71854,20 @@ func (r *RegionInstanceGroupManagersService) Delete(project string, region strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersDeleteCall) RequestId(requestId string) *RegionInstanceGroupManagersDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -66913,7 +71985,7 @@ func (c *RegionInstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -66952,6 +72024,11 @@ type RegionInstanceGroupManagersDeleteInstancesCall struct { // deleted. You must separately verify the status of the deleting action // with the listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *RegionInstanceGroupManagersService) DeleteInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersdeleteinstancesrequest *RegionInstanceGroupManagersDeleteInstancesRequest) *RegionInstanceGroupManagersDeleteInstancesCall { @@ -66963,8 +72040,20 @@ func (r *RegionInstanceGroupManagersService) DeleteInstances(project string, reg return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersDeleteInstancesCall) RequestId(requestId string) *RegionInstanceGroupManagersDeleteInstancesCall { c.urlParams_.Set("requestId", requestId) return c @@ -67058,7 +72147,7 @@ func (c *RegionInstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.Ca } return ret, nil // { - // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.regionInstanceGroupManagers.deleteInstances", // "parameterOrder": [ @@ -67087,7 +72176,7 @@ func (c *RegionInstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.Ca // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -67107,6 +72196,162 @@ func (c *RegionInstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.Ca } +// method id "compute.regionInstanceGroupManagers.deletePerInstanceConfigs": + +type RegionInstanceGroupManagersDeletePerInstanceConfigsCall struct { + s *Service + project string + region string + instanceGroupManager string + regioninstancegroupmanagerdeleteinstanceconfigreq *RegionInstanceGroupManagerDeleteInstanceConfigReq + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// DeletePerInstanceConfigs: Delete selected per-instance configs for +// the managed instance group. +func (r *RegionInstanceGroupManagersService) DeletePerInstanceConfigs(project string, region string, instanceGroupManager string, regioninstancegroupmanagerdeleteinstanceconfigreq *RegionInstanceGroupManagerDeleteInstanceConfigReq) *RegionInstanceGroupManagersDeletePerInstanceConfigsCall { + c := &RegionInstanceGroupManagersDeletePerInstanceConfigsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + c.regioninstancegroupmanagerdeleteinstanceconfigreq = regioninstancegroupmanagerdeleteinstanceconfigreq + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersDeletePerInstanceConfigsCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersDeletePerInstanceConfigsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersDeletePerInstanceConfigsCall) Context(ctx context.Context) *RegionInstanceGroupManagersDeletePerInstanceConfigsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersDeletePerInstanceConfigsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersDeletePerInstanceConfigsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerdeleteinstanceconfigreq) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.deletePerInstanceConfigs" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersDeletePerInstanceConfigsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Delete selected per-instance configs for the managed instance group.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.deletePerInstanceConfigs", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "The name of the managed instance group. It should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request, should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs", + // "request": { + // "$ref": "RegionInstanceGroupManagerDeleteInstanceConfigReq" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.regionInstanceGroupManagers.get": type RegionInstanceGroupManagersGetCall struct { @@ -67297,8 +72542,20 @@ func (r *RegionInstanceGroupManagersService) Insert(project string, region strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersInsertCall) RequestId(requestId string) *RegionInstanceGroupManagersInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -67413,7 +72670,7 @@ func (c *RegionInstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -67454,10 +72711,9 @@ func (r *RegionInstanceGroupManagersService) List(project string, region string) return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -67469,7 +72725,7 @@ func (r *RegionInstanceGroupManagersService) List(project string, region string) // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -67626,7 +72882,7 @@ func (c *RegionInstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) ( // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -67911,6 +73167,266 @@ func (c *RegionInstanceGroupManagersListManagedInstancesCall) Pages(ctx context. } } +// method id "compute.regionInstanceGroupManagers.listPerInstanceConfigs": + +type RegionInstanceGroupManagersListPerInstanceConfigsCall struct { + s *Service + project string + region string + instanceGroupManager string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// ListPerInstanceConfigs: Lists all of the per-instance configs defined +// for the managed instance group. +func (r *RegionInstanceGroupManagersService) ListPerInstanceConfigs(project string, region string, instanceGroupManager string) *RegionInstanceGroupManagersListPerInstanceConfigsCall { + c := &RegionInstanceGroupManagersListPerInstanceConfigsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) Filter(filter string) *RegionInstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) MaxResults(maxResults int64) *RegionInstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) OrderBy(orderBy string) *RegionInstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) PageToken(pageToken string) *RegionInstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersListPerInstanceConfigsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) Context(ctx context.Context) *RegionInstanceGroupManagersListPerInstanceConfigsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.listPerInstanceConfigs" call. +// Exactly one of *RegionInstanceGroupManagersListInstanceConfigsResp or +// error will be non-nil. Any non-2xx status code is an error. Response +// headers are in either +// *RegionInstanceGroupManagersListInstanceConfigsResp.ServerResponse.Hea +// der or (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) Do(opts ...googleapi.CallOption) (*RegionInstanceGroupManagersListInstanceConfigsResp, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RegionInstanceGroupManagersListInstanceConfigsResp{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists all of the per-instance configs defined for the managed instance group.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.listPerInstanceConfigs", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "instanceGroupManager": { + // "description": "The name of the managed instance group. It should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request, should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs", + // "response": { + // "$ref": "RegionInstanceGroupManagersListInstanceConfigsResp" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RegionInstanceGroupManagersListPerInstanceConfigsCall) Pages(ctx context.Context, f func(*RegionInstanceGroupManagersListInstanceConfigsResp) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + // method id "compute.regionInstanceGroupManagers.patch": type RegionInstanceGroupManagersPatchCall struct { @@ -67929,7 +73445,8 @@ type RegionInstanceGroupManagersPatchCall struct { // group is patched even if the instances in the group are still in the // process of being patched. You must separately verify the status of // the individual instances with the listmanagedinstances method. This -// method supports patch semantics. +// method supports PATCH semantics and uses the JSON merge patch format +// and processing rules. func (r *RegionInstanceGroupManagersService) Patch(project string, region string, instanceGroupManager string, instancegroupmanager *InstanceGroupManager) *RegionInstanceGroupManagersPatchCall { c := &RegionInstanceGroupManagersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -67939,8 +73456,20 @@ func (r *RegionInstanceGroupManagersService) Patch(project string, region string return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersPatchCall) RequestId(requestId string) *RegionInstanceGroupManagersPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -68034,7 +73563,7 @@ func (c *RegionInstanceGroupManagersPatchCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.", + // "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.regionInstanceGroupManagers.patch", // "parameterOrder": [ @@ -68063,7 +73592,7 @@ func (c *RegionInstanceGroupManagersPatchCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -68105,6 +73634,11 @@ type RegionInstanceGroupManagersRecreateInstancesCall struct { // separately verify the status of the recreating action with the // listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *RegionInstanceGroupManagersService) RecreateInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersrecreaterequest *RegionInstanceGroupManagersRecreateRequest) *RegionInstanceGroupManagersRecreateInstancesCall { @@ -68116,8 +73650,20 @@ func (r *RegionInstanceGroupManagersService) RecreateInstances(project string, r return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersRecreateInstancesCall) RequestId(requestId string) *RegionInstanceGroupManagersRecreateInstancesCall { c.urlParams_.Set("requestId", requestId) return c @@ -68211,7 +73757,7 @@ func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi. } return ret, nil // { - // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.regionInstanceGroupManagers.recreateInstances", // "parameterOrder": [ @@ -68240,7 +73786,7 @@ func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi. // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -68280,6 +73826,10 @@ type RegionInstanceGroupManagersResizeCall struct { // scheduled even if the group has not yet added or deleted any // instances. You must separately verify the status of the creating or // deleting actions with the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or deleted. func (r *RegionInstanceGroupManagersService) Resize(project string, region string, instanceGroupManager string, size int64) *RegionInstanceGroupManagersResizeCall { c := &RegionInstanceGroupManagersResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -68289,8 +73839,20 @@ func (r *RegionInstanceGroupManagersService) Resize(project string, region strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersResizeCall) RequestId(requestId string) *RegionInstanceGroupManagersResizeCall { c.urlParams_.Set("requestId", requestId) return c @@ -68379,7 +73941,7 @@ func (c *RegionInstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + // "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", // "httpMethod": "POST", // "id": "compute.regionInstanceGroupManagers.resize", // "parameterOrder": [ @@ -68409,7 +73971,7 @@ func (c *RegionInstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -68458,8 +74020,20 @@ func (r *RegionInstanceGroupManagersService) SetAutoHealingPolicies(project stri return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersSetAutoHealingPoliciesCall) RequestId(requestId string) *RegionInstanceGroupManagersSetAutoHealingPoliciesCall { c.urlParams_.Set("requestId", requestId) return c @@ -68582,7 +74156,7 @@ func (c *RegionInstanceGroupManagersSetAutoHealingPoliciesCall) Do(opts ...googl // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -68627,8 +74201,20 @@ func (r *RegionInstanceGroupManagersService) SetInstanceTemplate(project string, return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) RequestId(requestId string) *RegionInstanceGroupManagersSetInstanceTemplateCall { c.urlParams_.Set("requestId", requestId) return c @@ -68751,7 +74337,7 @@ func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleap // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -68796,8 +74382,20 @@ func (r *RegionInstanceGroupManagersService) SetTargetPools(project string, regi return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersSetTargetPoolsCall) RequestId(requestId string) *RegionInstanceGroupManagersSetTargetPoolsCall { c.urlParams_.Set("requestId", requestId) return c @@ -68920,7 +74518,7 @@ func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.Cal // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -69126,8 +74724,20 @@ func (r *RegionInstanceGroupManagersService) Update(project string, region strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupManagersUpdateCall) RequestId(requestId string) *RegionInstanceGroupManagersUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -69250,7 +74860,7 @@ func (c *RegionInstanceGroupManagersUpdateCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -69270,6 +74880,164 @@ func (c *RegionInstanceGroupManagersUpdateCall) Do(opts ...googleapi.CallOption) } +// method id "compute.regionInstanceGroupManagers.updatePerInstanceConfigs": + +type RegionInstanceGroupManagersUpdatePerInstanceConfigsCall struct { + s *Service + project string + region string + instanceGroupManager string + regioninstancegroupmanagerupdateinstanceconfigreq *RegionInstanceGroupManagerUpdateInstanceConfigReq + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// UpdatePerInstanceConfigs: Insert or patch (for the ones that already +// exist) per-instance configs for the managed instance group. +// perInstanceConfig.instance serves as a key used to distinguish +// whether to perform insert or patch. +func (r *RegionInstanceGroupManagersService) UpdatePerInstanceConfigs(project string, region string, instanceGroupManager string, regioninstancegroupmanagerupdateinstanceconfigreq *RegionInstanceGroupManagerUpdateInstanceConfigReq) *RegionInstanceGroupManagersUpdatePerInstanceConfigsCall { + c := &RegionInstanceGroupManagersUpdatePerInstanceConfigsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + c.regioninstancegroupmanagerupdateinstanceconfigreq = regioninstancegroupmanagerupdateinstanceconfigreq + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersUpdatePerInstanceConfigsCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersUpdatePerInstanceConfigsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersUpdatePerInstanceConfigsCall) Context(ctx context.Context) *RegionInstanceGroupManagersUpdatePerInstanceConfigsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersUpdatePerInstanceConfigsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersUpdatePerInstanceConfigsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerupdateinstanceconfigreq) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.updatePerInstanceConfigs" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersUpdatePerInstanceConfigsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Insert or patch (for the ones that already exist) per-instance configs for the managed instance group. perInstanceConfig.instance serves as a key used to distinguish whether to perform insert or patch.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.updatePerInstanceConfigs", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "The name of the managed instance group. It should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request, should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs", + // "request": { + // "$ref": "RegionInstanceGroupManagerUpdateInstanceConfigReq" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.regionInstanceGroups.get": type RegionInstanceGroupsGetCall struct { @@ -69451,10 +75219,9 @@ func (r *RegionInstanceGroupsService) List(project string, region string) *Regio return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -69466,7 +75233,7 @@ func (r *RegionInstanceGroupsService) List(project string, region string) *Regio // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -69623,7 +75390,7 @@ func (c *RegionInstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*Region // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -69719,10 +75486,9 @@ func (r *RegionInstanceGroupsService) ListInstances(project string, region strin return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -69734,7 +75500,7 @@ func (r *RegionInstanceGroupsService) ListInstances(project string, region strin // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -69886,7 +75652,7 @@ func (c *RegionInstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -69989,8 +75755,20 @@ func (r *RegionInstanceGroupsService) SetNamedPorts(project string, region strin return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RegionInstanceGroupsSetNamedPortsCall) RequestId(requestId string) *RegionInstanceGroupsSetNamedPortsCall { c.urlParams_.Set("requestId", requestId) return c @@ -70113,7 +75891,7 @@ func (c *RegionInstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -70597,10 +76375,9 @@ func (r *RegionOperationsService) List(project string, region string) *RegionOpe return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -70612,7 +76389,7 @@ func (r *RegionOperationsService) List(project string, region string) *RegionOpe // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -70769,7 +76546,7 @@ func (c *RegionOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -71013,10 +76790,9 @@ func (r *RegionsService) List(project string) *RegionsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -71028,7 +76804,7 @@ func (r *RegionsService) List(project string) *RegionsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -71183,7 +76959,7 @@ func (c *RegionsListCall) Do(opts ...googleapi.CallOption) (*RegionList, error) // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -71265,10 +77041,9 @@ func (r *RoutersService) AggregatedList(project string) *RoutersAggregatedListCa return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -71280,7 +77055,7 @@ func (r *RoutersService) AggregatedList(project string) *RoutersAggregatedListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -71435,7 +77210,7 @@ func (c *RoutersAggregatedListCall) Do(opts ...googleapi.CallOption) (*RouterAgg // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -71520,8 +77295,20 @@ func (r *RoutersService) Delete(project string, region string, router string) *R return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RoutersDeleteCall) RequestId(requestId string) *RoutersDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -71634,7 +77421,7 @@ func (c *RoutersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -72006,8 +77793,20 @@ func (r *RoutersService) Insert(project string, region string, router *Router) * return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RoutersInsertCall) RequestId(requestId string) *RoutersInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -72123,7 +77922,7 @@ func (c *RoutersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -72164,10 +77963,9 @@ func (r *RoutersService) List(project string, region string) *RoutersListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -72179,7 +77977,7 @@ func (r *RoutersService) List(project string, region string) *RoutersListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -72336,7 +78134,7 @@ func (c *RoutersListCall) Do(opts ...googleapi.CallOption) (*RouterList, error) // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -72421,7 +78219,8 @@ type RoutersPatchCall struct { } // Patch: Patches the specified Router resource with the data included -// in the request. This method supports patch semantics. +// in the request. This method supports PATCH semantics and uses JSON +// merge patch format and processing rules. func (r *RoutersService) Patch(project string, region string, router string, router2 *Router) *RoutersPatchCall { c := &RoutersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -72431,8 +78230,20 @@ func (r *RoutersService) Patch(project string, region string, router string, rou return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RoutersPatchCall) RequestId(requestId string) *RoutersPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -72526,7 +78337,7 @@ func (c *RoutersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Patches the specified Router resource with the data included in the request. This method supports patch semantics.", + // "description": "Patches the specified Router resource with the data included in the request. This method supports PATCH semantics and uses JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.routers.patch", // "parameterOrder": [ @@ -72550,7 +78361,7 @@ func (c *RoutersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -72921,8 +78732,20 @@ func (r *RoutersService) Update(project string, region string, router string, ro return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RoutersUpdateCall) RequestId(requestId string) *RoutersUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -73040,7 +78863,7 @@ func (c *RoutersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -73087,8 +78910,20 @@ func (r *RoutesService) Delete(project string, route string) *RoutesDeleteCall { return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RoutesDeleteCall) RequestId(requestId string) *RoutesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -73192,7 +79027,7 @@ func (c *RoutesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -73390,8 +79225,20 @@ func (r *RoutesService) Insert(project string, route *Route) *RoutesInsertCall { return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *RoutesInsertCall) RequestId(requestId string) *RoutesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -73498,7 +79345,7 @@ func (c *RoutesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -73538,10 +79385,9 @@ func (r *RoutesService) List(project string) *RoutesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -73553,7 +79399,7 @@ func (r *RoutesService) List(project string) *RoutesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -73708,7 +79554,7 @@ func (c *RoutesListCall) Do(opts ...googleapi.CallOption) (*RouteList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -73939,8 +79785,20 @@ func (r *SecurityPoliciesService) Delete(project string, securityPolicy string) return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SecurityPoliciesDeleteCall) RequestId(requestId string) *SecurityPoliciesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -74044,7 +79902,7 @@ func (c *SecurityPoliciesDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -74240,8 +80098,20 @@ func (r *SecurityPoliciesService) Insert(project string, securitypolicy *Securit return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SecurityPoliciesInsertCall) RequestId(requestId string) *SecurityPoliciesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -74348,7 +80218,7 @@ func (c *SecurityPoliciesInsertCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -74387,10 +80257,9 @@ func (r *SecurityPoliciesService) List(project string) *SecurityPoliciesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -74402,7 +80271,7 @@ func (r *SecurityPoliciesService) List(project string) *SecurityPoliciesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -74557,7 +80426,7 @@ func (c *SecurityPoliciesListCall) Do(opts ...googleapi.CallOption) (*SecurityPo // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -74643,8 +80512,20 @@ func (r *SecurityPoliciesService) Patch(project string, securityPolicy string, s return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SecurityPoliciesPatchCall) RequestId(requestId string) *SecurityPoliciesPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -74753,7 +80634,7 @@ func (c *SecurityPoliciesPatchCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -74955,8 +80836,20 @@ func (r *SnapshotsService) Delete(project string, snapshot string) *SnapshotsDel return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SnapshotsDeleteCall) RequestId(requestId string) *SnapshotsDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -75060,7 +80953,7 @@ func (c *SnapshotsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -75409,10 +81302,9 @@ func (r *SnapshotsService) List(project string) *SnapshotsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -75424,7 +81316,7 @@ func (r *SnapshotsService) List(project string) *SnapshotsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -75579,7 +81471,7 @@ func (c *SnapshotsListCall) Do(opts ...googleapi.CallOption) (*SnapshotList, err // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -75803,7 +81695,7 @@ type SnapshotsSetLabelsCall struct { } // SetLabels: Sets the labels on a snapshot. To learn more about labels, -// read the Labeling or Tagging Resources documentation. +// read the Labeling Resources documentation. func (r *SnapshotsService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *SnapshotsSetLabelsCall { c := &SnapshotsSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -75899,7 +81791,7 @@ func (c *SnapshotsSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, e } return ret, nil // { - // "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.snapshots.setLabels", // "parameterOrder": [ @@ -76104,8 +81996,20 @@ func (r *SslCertificatesService) Delete(project string, sslCertificate string) * return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SslCertificatesDeleteCall) RequestId(requestId string) *SslCertificatesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -76209,7 +82113,7 @@ func (c *SslCertificatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -76405,8 +82309,20 @@ func (r *SslCertificatesService) Insert(project string, sslcertificate *SslCerti return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SslCertificatesInsertCall) RequestId(requestId string) *SslCertificatesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -76513,7 +82429,7 @@ func (c *SslCertificatesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -76552,10 +82468,9 @@ func (r *SslCertificatesService) List(project string) *SslCertificatesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -76567,7 +82482,7 @@ func (r *SslCertificatesService) List(project string) *SslCertificatesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -76722,7 +82637,7 @@ func (c *SslCertificatesListCall) Do(opts ...googleapi.CallOption) (*SslCertific // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -76952,10 +82867,9 @@ func (r *SubnetworksService) AggregatedList(project string) *SubnetworksAggregat return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -76967,7 +82881,7 @@ func (r *SubnetworksService) AggregatedList(project string) *SubnetworksAggregat // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -77122,7 +83036,7 @@ func (c *SubnetworksAggregatedListCall) Do(opts ...googleapi.CallOption) (*Subne // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -77207,8 +83121,20 @@ func (r *SubnetworksService) Delete(project string, region string, subnetwork st return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SubnetworksDeleteCall) RequestId(requestId string) *SubnetworksDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -77321,7 +83247,7 @@ func (c *SubnetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -77369,8 +83295,20 @@ func (r *SubnetworksService) ExpandIpCidrRange(project string, region string, su return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SubnetworksExpandIpCidrRangeCall) RequestId(requestId string) *SubnetworksExpandIpCidrRangeCall { c.urlParams_.Set("requestId", requestId) return c @@ -77488,7 +83426,7 @@ func (c *SubnetworksExpandIpCidrRangeCall) Do(opts ...googleapi.CallOption) (*Op // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -77863,8 +83801,20 @@ func (r *SubnetworksService) Insert(project string, region string, subnetwork *S return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SubnetworksInsertCall) RequestId(requestId string) *SubnetworksInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -77980,7 +83930,7 @@ func (c *SubnetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -78021,10 +83971,9 @@ func (r *SubnetworksService) List(project string, region string) *SubnetworksLis return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -78036,7 +83985,7 @@ func (r *SubnetworksService) List(project string, region string) *SubnetworksLis // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -78193,7 +84142,7 @@ func (c *SubnetworksListCall) Do(opts ...googleapi.CallOption) (*SubnetworkList, // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -78264,6 +84213,192 @@ func (c *SubnetworksListCall) Pages(ctx context.Context, f func(*SubnetworkList) } } +// method id "compute.subnetworks.patch": + +type SubnetworksPatchCall struct { + s *Service + project string + region string + subnetwork string + subnetwork2 *Subnetwork + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Patches the specified subnetwork with the data included in the +// request. Only the following fields within the subnetwork resource can +// be specified in the request: secondary_ip_range and +// allow_subnet_cidr_routes_overlap. It is also mandatory to specify the +// current fingeprint of the subnetwork resource being patched. +func (r *SubnetworksService) Patch(project string, region string, subnetwork string, subnetwork2 *Subnetwork) *SubnetworksPatchCall { + c := &SubnetworksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.subnetwork = subnetwork + c.subnetwork2 = subnetwork2 + return c +} + +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *SubnetworksPatchCall) RequestId(requestId string) *SubnetworksPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *SubnetworksPatchCall) Fields(s ...googleapi.Field) *SubnetworksPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *SubnetworksPatchCall) Context(ctx context.Context) *SubnetworksPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *SubnetworksPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *SubnetworksPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetwork2) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("PATCH", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "subnetwork": c.subnetwork, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.subnetworks.patch" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *SubnetworksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Patches the specified subnetwork with the data included in the request. Only the following fields within the subnetwork resource can be specified in the request: secondary_ip_range and allow_subnet_cidr_routes_overlap. It is also mandatory to specify the current fingeprint of the subnetwork resource being patched.", + // "httpMethod": "PATCH", + // "id": "compute.subnetworks.patch", + // "parameterOrder": [ + // "project", + // "region", + // "subnetwork" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, + // "subnetwork": { + // "description": "Name of the Subnetwork resource to patch.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/subnetworks/{subnetwork}", + // "request": { + // "$ref": "Subnetwork" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + // method id "compute.subnetworks.setIamPolicy": type SubnetworksSetIamPolicyCall struct { @@ -78437,7 +84572,7 @@ type SubnetworksSetPrivateIpGoogleAccessCall struct { // SetPrivateIpGoogleAccess: Set whether VMs in this subnet can access // Google services without assigning external IP addresses through -// Cloudpath. +// Private Google Access. func (r *SubnetworksService) SetPrivateIpGoogleAccess(project string, region string, subnetwork string, subnetworkssetprivateipgoogleaccessrequest *SubnetworksSetPrivateIpGoogleAccessRequest) *SubnetworksSetPrivateIpGoogleAccessCall { c := &SubnetworksSetPrivateIpGoogleAccessCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -78447,8 +84582,20 @@ func (r *SubnetworksService) SetPrivateIpGoogleAccess(project string, region str return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *SubnetworksSetPrivateIpGoogleAccessCall) RequestId(requestId string) *SubnetworksSetPrivateIpGoogleAccessCall { c.urlParams_.Set("requestId", requestId) return c @@ -78542,7 +84689,7 @@ func (c *SubnetworksSetPrivateIpGoogleAccessCall) Do(opts ...googleapi.CallOptio } return ret, nil // { - // "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Cloudpath.", + // "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Private Google Access.", // "httpMethod": "POST", // "id": "compute.subnetworks.setPrivateIpGoogleAccess", // "parameterOrder": [ @@ -78566,7 +84713,7 @@ func (c *SubnetworksSetPrivateIpGoogleAccessCall) Do(opts ...googleapi.CallOptio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -78772,8 +84919,20 @@ func (r *TargetHttpProxiesService) Delete(project string, targetHttpProxy string return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetHttpProxiesDeleteCall) RequestId(requestId string) *TargetHttpProxiesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -78877,7 +85036,7 @@ func (c *TargetHttpProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -79075,8 +85234,20 @@ func (r *TargetHttpProxiesService) Insert(project string, targethttpproxy *Targe return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetHttpProxiesInsertCall) RequestId(requestId string) *TargetHttpProxiesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -79183,7 +85354,7 @@ func (c *TargetHttpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -79223,10 +85394,9 @@ func (r *TargetHttpProxiesService) List(project string) *TargetHttpProxiesListCa return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -79238,7 +85408,7 @@ func (r *TargetHttpProxiesService) List(project string) *TargetHttpProxiesListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -79393,7 +85563,7 @@ func (c *TargetHttpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHtt // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -79479,8 +85649,20 @@ func (r *TargetHttpProxiesService) SetUrlMap(project string, targetHttpProxy str return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetHttpProxiesSetUrlMapCall) RequestId(requestId string) *TargetHttpProxiesSetUrlMapCall { c.urlParams_.Set("requestId", requestId) return c @@ -79589,7 +85771,7 @@ func (c *TargetHttpProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -79783,8 +85965,20 @@ func (r *TargetHttpsProxiesService) Delete(project string, targetHttpsProxy stri return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetHttpsProxiesDeleteCall) RequestId(requestId string) *TargetHttpsProxiesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -79888,7 +86082,7 @@ func (c *TargetHttpsProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operat // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -80084,8 +86278,20 @@ func (r *TargetHttpsProxiesService) Insert(project string, targethttpsproxy *Tar return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetHttpsProxiesInsertCall) RequestId(requestId string) *TargetHttpsProxiesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -80192,7 +86398,7 @@ func (c *TargetHttpsProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operat // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -80231,10 +86437,9 @@ func (r *TargetHttpsProxiesService) List(project string) *TargetHttpsProxiesList return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -80246,7 +86451,7 @@ func (r *TargetHttpsProxiesService) List(project string) *TargetHttpsProxiesList // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -80401,7 +86606,7 @@ func (c *TargetHttpsProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHt // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -80465,6 +86670,151 @@ func (c *TargetHttpsProxiesListCall) Pages(ctx context.Context, f func(*TargetHt } } +// method id "compute.targetHttpsProxies.setQuicOverride": + +type TargetHttpsProxiesSetQuicOverrideCall struct { + s *Service + project string + targetHttpsProxy string + targethttpsproxiessetquicoverriderequest *TargetHttpsProxiesSetQuicOverrideRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetQuicOverride: Sets the QUIC override policy for TargetHttpsProxy. +func (r *TargetHttpsProxiesService) SetQuicOverride(project string, targetHttpsProxy string, targethttpsproxiessetquicoverriderequest *TargetHttpsProxiesSetQuicOverrideRequest) *TargetHttpsProxiesSetQuicOverrideCall { + c := &TargetHttpsProxiesSetQuicOverrideCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.targetHttpsProxy = targetHttpsProxy + c.targethttpsproxiessetquicoverriderequest = targethttpsproxiessetquicoverriderequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *TargetHttpsProxiesSetQuicOverrideCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesSetQuicOverrideCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *TargetHttpsProxiesSetQuicOverrideCall) Context(ctx context.Context) *TargetHttpsProxiesSetQuicOverrideCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *TargetHttpsProxiesSetQuicOverrideCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *TargetHttpsProxiesSetQuicOverrideCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxiessetquicoverriderequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies/{targetHttpsProxy}/setQuicOverride") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "targetHttpsProxy": c.targetHttpsProxy, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.targetHttpsProxies.setQuicOverride" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *TargetHttpsProxiesSetQuicOverrideCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the QUIC override policy for TargetHttpsProxy.", + // "httpMethod": "POST", + // "id": "compute.targetHttpsProxies.setQuicOverride", + // "parameterOrder": [ + // "project", + // "targetHttpsProxy" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "targetHttpsProxy": { + // "description": "Name of the TargetHttpsProxy resource to set the QUIC override policy for. The name should conform to RFC1035.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/targetHttpsProxies/{targetHttpsProxy}/setQuicOverride", + // "request": { + // "$ref": "TargetHttpsProxiesSetQuicOverrideRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.targetHttpsProxies.setSslCertificates": type TargetHttpsProxiesSetSslCertificatesCall struct { @@ -80486,8 +86836,20 @@ func (r *TargetHttpsProxiesService) SetSslCertificates(project string, targetHtt return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetHttpsProxiesSetSslCertificatesCall) RequestId(requestId string) *TargetHttpsProxiesSetSslCertificatesCall { c.urlParams_.Set("requestId", requestId) return c @@ -80596,7 +86958,7 @@ func (c *TargetHttpsProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOpti // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -80644,8 +87006,20 @@ func (r *TargetHttpsProxiesService) SetUrlMap(project string, targetHttpsProxy s return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetHttpsProxiesSetUrlMapCall) RequestId(requestId string) *TargetHttpsProxiesSetUrlMapCall { c.urlParams_.Set("requestId", requestId) return c @@ -80754,7 +87128,7 @@ func (c *TargetHttpsProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -80948,10 +87322,9 @@ func (r *TargetInstancesService) AggregatedList(project string) *TargetInstances return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -80963,7 +87336,7 @@ func (r *TargetInstancesService) AggregatedList(project string) *TargetInstances // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -81118,7 +87491,7 @@ func (c *TargetInstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*T // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -81204,8 +87577,20 @@ func (r *TargetInstancesService) Delete(project string, zone string, targetInsta return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetInstancesDeleteCall) RequestId(requestId string) *TargetInstancesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -81311,7 +87696,7 @@ func (c *TargetInstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -81529,8 +87914,20 @@ func (r *TargetInstancesService) Insert(project string, zone string, targetinsta return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetInstancesInsertCall) RequestId(requestId string) *TargetInstancesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -81639,7 +88036,7 @@ func (c *TargetInstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -81688,10 +88085,9 @@ func (r *TargetInstancesService) List(project string, zone string) *TargetInstan return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -81703,7 +88099,7 @@ func (r *TargetInstancesService) List(project string, zone string) *TargetInstan // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -81860,7 +88256,7 @@ func (c *TargetInstancesListCall) Do(opts ...googleapi.CallOption) (*TargetInsta // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -82114,8 +88510,20 @@ func (r *TargetPoolsService) AddHealthCheck(project string, region string, targe return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetPoolsAddHealthCheckCall) RequestId(requestId string) *TargetPoolsAddHealthCheckCall { c.urlParams_.Set("requestId", requestId) return c @@ -82233,7 +88641,7 @@ func (c *TargetPoolsAddHealthCheckCall) Do(opts ...googleapi.CallOption) (*Opera // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -82284,8 +88692,20 @@ func (r *TargetPoolsService) AddInstance(project string, region string, targetPo return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetPoolsAddInstanceCall) RequestId(requestId string) *TargetPoolsAddInstanceCall { c.urlParams_.Set("requestId", requestId) return c @@ -82403,7 +88823,7 @@ func (c *TargetPoolsAddInstanceCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -82449,10 +88869,9 @@ func (r *TargetPoolsService) AggregatedList(project string) *TargetPoolsAggregat return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -82464,7 +88883,7 @@ func (r *TargetPoolsService) AggregatedList(project string) *TargetPoolsAggregat // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -82619,7 +89038,7 @@ func (c *TargetPoolsAggregatedListCall) Do(opts ...googleapi.CallOption) (*Targe // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -82705,8 +89124,20 @@ func (r *TargetPoolsService) Delete(project string, region string, targetPool st return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetPoolsDeleteCall) RequestId(requestId string) *TargetPoolsDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -82819,7 +89250,7 @@ func (c *TargetPoolsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -83190,8 +89621,20 @@ func (r *TargetPoolsService) Insert(project string, region string, targetpool *T return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetPoolsInsertCall) RequestId(requestId string) *TargetPoolsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -83307,7 +89750,7 @@ func (c *TargetPoolsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -83349,10 +89792,9 @@ func (r *TargetPoolsService) List(project string, region string) *TargetPoolsLis return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -83364,7 +89806,7 @@ func (r *TargetPoolsService) List(project string, region string) *TargetPoolsLis // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -83521,7 +89963,7 @@ func (c *TargetPoolsListCall) Do(opts ...googleapi.CallOption) (*TargetPoolList, // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -83616,8 +90058,20 @@ func (r *TargetPoolsService) RemoveHealthCheck(project string, region string, ta return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetPoolsRemoveHealthCheckCall) RequestId(requestId string) *TargetPoolsRemoveHealthCheckCall { c.urlParams_.Set("requestId", requestId) return c @@ -83735,7 +90189,7 @@ func (c *TargetPoolsRemoveHealthCheckCall) Do(opts ...googleapi.CallOption) (*Op // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -83786,8 +90240,20 @@ func (r *TargetPoolsService) RemoveInstance(project string, region string, targe return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetPoolsRemoveInstanceCall) RequestId(requestId string) *TargetPoolsRemoveInstanceCall { c.urlParams_.Set("requestId", requestId) return c @@ -83905,7 +90371,7 @@ func (c *TargetPoolsRemoveInstanceCall) Do(opts ...googleapi.CallOption) (*Opera // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -83963,8 +90429,20 @@ func (c *TargetPoolsSetBackupCall) FailoverRatio(failoverRatio float64) *TargetP return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetPoolsSetBackupCall) RequestId(requestId string) *TargetPoolsSetBackupCall { c.urlParams_.Set("requestId", requestId) return c @@ -84088,7 +90566,7 @@ func (c *TargetPoolsSetBackupCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -84293,8 +90771,20 @@ func (r *TargetSslProxiesService) Delete(project string, targetSslProxy string) return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetSslProxiesDeleteCall) RequestId(requestId string) *TargetSslProxiesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -84398,7 +90888,7 @@ func (c *TargetSslProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -84594,8 +91084,20 @@ func (r *TargetSslProxiesService) Insert(project string, targetsslproxy *TargetS return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetSslProxiesInsertCall) RequestId(requestId string) *TargetSslProxiesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -84702,7 +91204,7 @@ func (c *TargetSslProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -84741,10 +91243,9 @@ func (r *TargetSslProxiesService) List(project string) *TargetSslProxiesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -84756,7 +91257,7 @@ func (r *TargetSslProxiesService) List(project string) *TargetSslProxiesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -84911,7 +91412,7 @@ func (c *TargetSslProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetSslP // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -84996,8 +91497,20 @@ func (r *TargetSslProxiesService) SetBackendService(project string, targetSslPro return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetSslProxiesSetBackendServiceCall) RequestId(requestId string) *TargetSslProxiesSetBackendServiceCall { c.urlParams_.Set("requestId", requestId) return c @@ -85106,7 +91619,7 @@ func (c *TargetSslProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -85154,8 +91667,20 @@ func (r *TargetSslProxiesService) SetProxyHeader(project string, targetSslProxy return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetSslProxiesSetProxyHeaderCall) RequestId(requestId string) *TargetSslProxiesSetProxyHeaderCall { c.urlParams_.Set("requestId", requestId) return c @@ -85264,7 +91789,7 @@ func (c *TargetSslProxiesSetProxyHeaderCall) Do(opts ...googleapi.CallOption) (* // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -85312,8 +91837,20 @@ func (r *TargetSslProxiesService) SetSslCertificates(project string, targetSslPr return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetSslProxiesSetSslCertificatesCall) RequestId(requestId string) *TargetSslProxiesSetSslCertificatesCall { c.urlParams_.Set("requestId", requestId) return c @@ -85422,7 +91959,7 @@ func (c *TargetSslProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOption // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -85616,8 +92153,20 @@ func (r *TargetTcpProxiesService) Delete(project string, targetTcpProxy string) return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetTcpProxiesDeleteCall) RequestId(requestId string) *TargetTcpProxiesDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -85721,7 +92270,7 @@ func (c *TargetTcpProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -85917,8 +92466,20 @@ func (r *TargetTcpProxiesService) Insert(project string, targettcpproxy *TargetT return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetTcpProxiesInsertCall) RequestId(requestId string) *TargetTcpProxiesInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -86025,7 +92586,7 @@ func (c *TargetTcpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -86064,10 +92625,9 @@ func (r *TargetTcpProxiesService) List(project string) *TargetTcpProxiesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -86079,7 +92639,7 @@ func (r *TargetTcpProxiesService) List(project string) *TargetTcpProxiesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -86234,7 +92794,7 @@ func (c *TargetTcpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetTcpP // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -86319,8 +92879,20 @@ func (r *TargetTcpProxiesService) SetBackendService(project string, targetTcpPro return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetTcpProxiesSetBackendServiceCall) RequestId(requestId string) *TargetTcpProxiesSetBackendServiceCall { c.urlParams_.Set("requestId", requestId) return c @@ -86429,7 +93001,7 @@ func (c *TargetTcpProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -86477,8 +93049,20 @@ func (r *TargetTcpProxiesService) SetProxyHeader(project string, targetTcpProxy return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetTcpProxiesSetProxyHeaderCall) RequestId(requestId string) *TargetTcpProxiesSetProxyHeaderCall { c.urlParams_.Set("requestId", requestId) return c @@ -86587,7 +93171,7 @@ func (c *TargetTcpProxiesSetProxyHeaderCall) Do(opts ...googleapi.CallOption) (* // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -86780,10 +93364,9 @@ func (r *TargetVpnGatewaysService) AggregatedList(project string) *TargetVpnGate return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -86795,7 +93378,7 @@ func (r *TargetVpnGatewaysService) AggregatedList(project string) *TargetVpnGate // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -86950,7 +93533,7 @@ func (c *TargetVpnGatewaysAggregatedListCall) Do(opts ...googleapi.CallOption) ( // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -87035,8 +93618,20 @@ func (r *TargetVpnGatewaysService) Delete(project string, region string, targetV return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetVpnGatewaysDeleteCall) RequestId(requestId string) *TargetVpnGatewaysDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -87149,7 +93744,7 @@ func (c *TargetVpnGatewaysDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -87358,8 +93953,20 @@ func (r *TargetVpnGatewaysService) Insert(project string, region string, targetv return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *TargetVpnGatewaysInsertCall) RequestId(requestId string) *TargetVpnGatewaysInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -87475,7 +94082,7 @@ func (c *TargetVpnGatewaysInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -87516,10 +94123,9 @@ func (r *TargetVpnGatewaysService) List(project string, region string) *TargetVp return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -87531,7 +94137,7 @@ func (r *TargetVpnGatewaysService) List(project string, region string) *TargetVp // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -87688,7 +94294,7 @@ func (c *TargetVpnGatewaysListCall) Do(opts ...googleapi.CallOption) (*TargetVpn // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -87938,8 +94544,20 @@ func (r *UrlMapsService) Delete(project string, urlMap string) *UrlMapsDeleteCal return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *UrlMapsDeleteCall) RequestId(requestId string) *UrlMapsDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -88043,7 +94661,7 @@ func (c *UrlMapsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -88241,8 +94859,20 @@ func (r *UrlMapsService) Insert(project string, urlmap *UrlMap) *UrlMapsInsertCa return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *UrlMapsInsertCall) RequestId(requestId string) *UrlMapsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -88349,7 +94979,7 @@ func (c *UrlMapsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -88391,8 +95021,20 @@ func (r *UrlMapsService) InvalidateCache(project string, urlMap string, cacheinv return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *UrlMapsInvalidateCacheCall) RequestId(requestId string) *UrlMapsInvalidateCacheCall { c.urlParams_.Set("requestId", requestId) return c @@ -88501,7 +95143,7 @@ func (c *UrlMapsInvalidateCacheCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -88548,10 +95190,9 @@ func (r *UrlMapsService) List(project string) *UrlMapsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -88563,7 +95204,7 @@ func (r *UrlMapsService) List(project string) *UrlMapsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -88718,7 +95359,7 @@ func (c *UrlMapsListCall) Do(opts ...googleapi.CallOption) (*UrlMapList, error) // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -88795,7 +95436,8 @@ type UrlMapsPatchCall struct { } // Patch: Patches the specified UrlMap resource with the data included -// in the request. This method supports patch semantics. +// in the request. This method supports PATCH semantics and uses the +// JSON merge patch format and processing rules. // For details, see https://cloud.google.com/compute/docs/reference/latest/urlMaps/patch func (r *UrlMapsService) Patch(project string, urlMap string, urlmap *UrlMap) *UrlMapsPatchCall { c := &UrlMapsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -88805,8 +95447,20 @@ func (r *UrlMapsService) Patch(project string, urlMap string, urlmap *UrlMap) *U return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *UrlMapsPatchCall) RequestId(requestId string) *UrlMapsPatchCall { c.urlParams_.Set("requestId", requestId) return c @@ -88899,7 +95553,7 @@ func (c *UrlMapsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Patches the specified UrlMap resource with the data included in the request. This method supports patch semantics.", + // "description": "Patches the specified UrlMap resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.urlMaps.patch", // "parameterOrder": [ @@ -88915,7 +95569,7 @@ func (c *UrlMapsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -89114,8 +95768,20 @@ func (r *UrlMapsService) Update(project string, urlMap string, urlmap *UrlMap) * return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *UrlMapsUpdateCall) RequestId(requestId string) *UrlMapsUpdateCall { c.urlParams_.Set("requestId", requestId) return c @@ -89224,7 +95890,7 @@ func (c *UrlMapsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -89418,10 +96084,9 @@ func (r *VpnTunnelsService) AggregatedList(project string) *VpnTunnelsAggregated return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -89433,7 +96098,7 @@ func (r *VpnTunnelsService) AggregatedList(project string) *VpnTunnelsAggregated // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -89588,7 +96253,7 @@ func (c *VpnTunnelsAggregatedListCall) Do(opts ...googleapi.CallOption) (*VpnTun // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -89673,8 +96338,20 @@ func (r *VpnTunnelsService) Delete(project string, region string, vpnTunnel stri return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *VpnTunnelsDeleteCall) RequestId(requestId string) *VpnTunnelsDeleteCall { c.urlParams_.Set("requestId", requestId) return c @@ -89787,7 +96464,7 @@ func (c *VpnTunnelsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, err // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -89996,8 +96673,20 @@ func (r *VpnTunnelsService) Insert(project string, region string, vpntunnel *Vpn return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *VpnTunnelsInsertCall) RequestId(requestId string) *VpnTunnelsInsertCall { c.urlParams_.Set("requestId", requestId) return c @@ -90113,7 +96802,7 @@ func (c *VpnTunnelsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, err // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // } @@ -90154,10 +96843,9 @@ func (r *VpnTunnelsService) List(project string, region string) *VpnTunnelsListC return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -90169,7 +96857,7 @@ func (r *VpnTunnelsService) List(project string, region string) *VpnTunnelsListC // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -90326,7 +97014,7 @@ func (c *VpnTunnelsListCall) Do(opts ...googleapi.CallOption) (*VpnTunnelList, e // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -90411,7 +97099,7 @@ type VpnTunnelsSetLabelsCall struct { } // SetLabels: Sets the labels on a VpnTunnel. To learn more about -// labels, read the Labeling or Tagging Resources documentation. +// labels, read the Labeling Resources documentation. func (r *VpnTunnelsService) SetLabels(project string, region string, resource string, regionsetlabelsrequest *RegionSetLabelsRequest) *VpnTunnelsSetLabelsCall { c := &VpnTunnelsSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -90421,8 +97109,20 @@ func (r *VpnTunnelsService) SetLabels(project string, region string, resource st return c } -// RequestId sets the optional parameter "requestId": begin_interface: -// MixerMutationRequestBuilder Request ID to support idempotency. +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). func (c *VpnTunnelsSetLabelsCall) RequestId(requestId string) *VpnTunnelsSetLabelsCall { c.urlParams_.Set("requestId", requestId) return c @@ -90516,7 +97216,7 @@ func (c *VpnTunnelsSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Sets the labels on a VpnTunnel. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on a VpnTunnel. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.vpnTunnels.setLabels", // "parameterOrder": [ @@ -90540,7 +97240,7 @@ func (c *VpnTunnelsSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "requestId": { - // "description": "begin_interface: MixerMutationRequestBuilder Request ID to support idempotency.", + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", // "location": "query", // "type": "string" // }, @@ -91031,10 +97731,9 @@ func (r *ZoneOperationsService) List(project string, zone string) *ZoneOperation return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -91046,7 +97745,7 @@ func (r *ZoneOperationsService) List(project string, zone string) *ZoneOperation // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -91203,7 +97902,7 @@ func (c *ZoneOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationLis // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -91447,10 +98146,9 @@ func (r *ZonesService) List(project string) *ZonesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -91462,7 +98160,7 @@ func (r *ZonesService) List(project string) *ZonesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -91617,7 +98315,7 @@ func (c *ZonesListCall) Do(opts ...googleapi.CallOption) (*ZoneList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, diff --git a/vendor/google.golang.org/api/compute/v0.beta/compute-api.json b/vendor/google.golang.org/api/compute/v0.beta/compute-api.json index d43a80f681507..626b31832ebbb 100644 --- a/vendor/google.golang.org/api/compute/v0.beta/compute-api.json +++ b/vendor/google.golang.org/api/compute/v0.beta/compute-api.json @@ -1,11 +1,11 @@ { "kind": "discovery#restDescription", - "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/eFyZs7VljDosqiT0aKEgQhuYKu8\"", + "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/gfBEnRRtVgnVgbcTDcEDV6LmQ_A\"", "discoveryVersion": "v1", "id": "compute:beta", "name": "compute", "version": "beta", - "revision": "20170416", + "revision": "20170721", "title": "Compute Engine API", "description": "Creates and runs virtual machines on Google Cloud Platform.", "ownerDomain": "google.com", @@ -160,11 +160,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped accelerator type lists.", + "description": "A list of AcceleratorTypesScopedList resources.", "additionalProperties": { "$ref": "AcceleratorTypesScopedList", "description": "[Output Only] Name of the scope containing this set of accelerator types." @@ -208,7 +208,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -338,6 +338,20 @@ "type": "string", "description": "The static external IP address represented by this resource." }, + "addressType": { + "type": "string", + "description": "The type of address to reserve. If unspecified, defaults to EXTERNAL.", + "enum": [ + "EXTERNAL", + "INTERNAL", + "UNSPECIFIED_TYPE" + ], + "enumDescriptions": [ + "", + "", + "" + ] + }, "creationTimestamp": { "type": "string", "description": "[Output Only] Creation timestamp in RFC3339 text format." @@ -370,6 +384,18 @@ "description": "[Output Only] Type of the resource. Always compute#address for addresses.", "default": "compute#address" }, + "labelFingerprint": { + "type": "string", + "description": "A fingerprint for the labels being applied to this Address, which is essentially a hash of the labels set used for optimistic locking. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update labels. You must always provide an up-to-date fingerprint hash in order to update or change labels.\n\nTo see the latest fingerprint, make a get() request to retrieve an Address.", + "format": "byte" + }, + "labels": { + "type": "object", + "description": "Labels to apply to this Address resource. These can be later modified by the setLabels method. Each label key/value must comply with RFC1035. Label values may be empty.", + "additionalProperties": { + "type": "string" + } + }, "name": { "type": "string", "description": "Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.", @@ -400,6 +426,10 @@ "" ] }, + "subnetwork": { + "type": "string", + "description": "For external addresses, this field should not be used.\n\nThe URL of the subnetwork in which to reserve the address. If an IP address is specified, it must be within the subnetwork's IP range." + }, "users": { "type": "array", "description": "[Output Only] The URLs of the resources that are using this address.", @@ -419,7 +449,7 @@ }, "items": { "type": "object", - "description": "[Output Only] A map of scoped address lists.", + "description": "A list of AddressesScopedList resources.", "additionalProperties": { "$ref": "AddressesScopedList", "description": "[Output Only] Name of the scope containing this set of addresses." @@ -447,11 +477,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of addresses.", + "description": "A list of Address resources.", "items": { "$ref": "Address" } @@ -467,7 +497,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -747,6 +777,31 @@ } } }, + "AuthorizationLoggingOptions": { + "id": "AuthorizationLoggingOptions", + "type": "object", + "description": "Authorization-related information used by Cloud Audit Logging.", + "properties": { + "permissionType": { + "type": "string", + "description": "The type of the permission that was checked.", + "enum": [ + "ADMIN_READ", + "ADMIN_WRITE", + "DATA_READ", + "DATA_WRITE", + "PERMISSION_TYPE_UNSPECIFIED" + ], + "enumDescriptions": [ + "", + "", + "", + "", + "" + ] + } + } + }, "Autoscaler": { "id": "Autoscaler", "type": "object", @@ -831,11 +886,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped autoscaler lists.", + "description": "A list of AutoscalersScopedList resources.", "additionalProperties": { "$ref": "AutoscalersScopedList", "description": "[Output Only] Name of the scope containing this set of autoscalers." @@ -863,7 +918,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -909,9 +964,11 @@ "MISSING_LOAD_BALANCING_DATA_POINTS", "MORE_THAN_ONE_BACKEND_SERVICE", "NOT_ENOUGH_QUOTA_AVAILABLE", + "REGION_RESOURCE_STOCKOUT", "SCALING_TARGET_DOES_NOT_EXIST", "UNKNOWN", - "UNSUPPORTED_MAX_RATE_LOAD_BALANCING_CONFIGURATION" + "UNSUPPORTED_MAX_RATE_LOAD_BALANCING_CONFIGURATION", + "ZONE_RESOURCE_STOCKOUT" ], "enumDescriptions": [ "", @@ -926,6 +983,8 @@ "", "", "", + "", + "", "" ] } @@ -1067,13 +1126,22 @@ "type": "object", "description": "Custom utilization metric policy.", "properties": { + "filter": { + "type": "string", + "description": "A filter string, compatible with a Stackdriver Monitoring filter string for TimeSeries.list API call. This filter is used to select a specific TimeSeries for the purpose of autoscaling and to determine whether the metric is exporting per-instance or global data.\n\nFor the filter to be valid for autoscaling purposes, the following rules apply: \n- You can only use the AND operator for joining selectors. \n- You can only use direct equality comparison operator (=) without any functions for each selector. \n- You can specify the metric in both the filter string and in the metric field. However, if specified in both places, the metric must be identical. \n- The monitored resource type determines what kind of values are expected for the metric. If it is a gce_instance, the autoscaler expects the metric to include a separate TimeSeries for each instance in a group. In such a case, you cannot filter on resource labels.\nIf the resource type is any other value, the autoscaler expects this metric to contain values that apply to the entire autoscaled instance group and resource label filtering can be performed to point autoscaler at the correct TimeSeries to scale upon. This is / called a global metric for the purpose of autoscaling.\n\nIf not specified, the type defaults to gce_instance. \n\nYou should provide a filter that is selective enough to pick just one TimeSeries for the autoscaled group or for each of the instances (if you are using gce_instance resource type). If multiple TimeSeries are returned upon the query execution, the autoscaler will sum their respective values to obtain its scaling value." + }, "metric": { "type": "string", - "description": "The identifier of the Stackdriver Monitoring metric. The metric cannot have negative values and should be a utilization metric, which means that the number of virtual machines handling requests should increase or decrease proportionally to the metric. The metric must also have a label of compute.googleapis.com/resource_id with the value of the instance's unique ID, although this alone does not guarantee that the metric is valid.\n\nFor example, the following is a valid metric:\ncompute.googleapis.com/instance/network/received_bytes_count\nThe following is not a valid metric because it does not increase or decrease based on usage:\ncompute.googleapis.com/instance/cpu/reserved_cores" + "description": "The identifier (type) of the Stackdriver Monitoring metric. The metric cannot have negative values and should be a utilization metric, which means that the number of virtual machines handling requests should increase or decrease proportionally to the metric.\n\nThe metric must have a value type of INT64 or DOUBLE." + }, + "singleInstanceAssignment": { + "type": "number", + "description": "If scaling is based on a global metric value that represents the total amount of work to be done or resource usage, set this value to an amount assigned for a single instance of the scaled group. Autoscaler will keep the number of instances proportional to the value of this metric, the metric itself should not change value due to group resizing.\n\nA good metric to use with the target is for example pubsub.googleapis.com/subscription/num_undelivered_messages or a custom metric exporting the total number of requests coming to your instances.\n\nA bad example would be a metric exporting an average or median latency, since this value can't include a chunk assignable to a single instance, it could be better used with utilization_target instead.", + "format": "double" }, "utilizationTarget": { "type": "number", - "description": "Target value of the metric which autoscaler should maintain. Must be a positive value.", + "description": "The target value of the metric that autoscaler should maintain. This must be a positive value.\n\nFor example, a good metric to use as a utilization_target is compute.googleapis.com/instance/network/received_bytes_count. The autoscaler will work to keep this value constant for each of the instances.", "format": "double" }, "utilizationTargetType": { @@ -1111,7 +1179,7 @@ "properties": { "balancingMode": { "type": "string", - "description": "Specifies the balancing mode for this backend. For global HTTP(S) or TCP/SSL load balancing, the default is UTILIZATION. Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for TCP/SSL).\n\nThis cannot be used for internal load balancing.", + "description": "Specifies the balancing mode for this backend. For global HTTP(S) or TCP/SSL load balancing, the default is UTILIZATION. Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for TCP/SSL).\n\nFor Internal Load Balancing, the default and only supported mode is CONNECTION.", "enum": [ "CONNECTION", "RATE", @@ -1134,7 +1202,7 @@ }, "group": { "type": "string", - "description": "The fully-qualified URL of a zonal Instance Group resource. This instance group defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource.\n\nNote that you must specify an Instance Group resource using the fully-qualified URL, rather than a partial URL.\n\nWhen the BackendService has load balancing scheme INTERNAL, the instance group must be in a zone within the same region as the BackendService." + "description": "The fully-qualified URL of a Instance Group resource. This instance group defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource.\n\nNote that you must specify an Instance Group resource using the fully-qualified URL, rather than a partial URL.\n\nWhen the BackendService has load balancing scheme INTERNAL, the instance group must be within the same region as the BackendService." }, "maxConnections": { "type": "integer", @@ -1228,7 +1296,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -1279,7 +1347,7 @@ }, "healthChecks": { "type": "array", - "description": "The list of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified, and a health check is required.\n\nFor internal load balancing, a URL to a HealthCheck resource must be specified instead.", + "description": "The list of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified, and a health check is required for GCE backend services. A health check must not be specified for GAE app backend and Cloud Function backend.\n\nFor internal load balancing, a URL to a HealthCheck resource must be specified instead.", "items": { "type": "string" } @@ -1386,7 +1454,7 @@ }, "items": { "type": "object", - "description": "A map of scoped BackendService lists.", + "description": "A list of BackendServicesScopedList resources.", "additionalProperties": { "$ref": "BackendServicesScopedList", "description": "Name of the scope containing this set of BackendServices." @@ -1399,7 +1467,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -1450,7 +1518,8 @@ "type": "string" }, "oauth2ClientSecretSha256": { - "type": "string" + "type": "string", + "description": "[Output Only] SHA256 hash value for the field oauth2_client_secret above." } } }, @@ -1572,9 +1641,13 @@ "type": "object", "description": "Associates `members` with a `role`.", "properties": { + "condition": { + "$ref": "Expr", + "description": "The condition that is associated with this binding. NOTE: an unsatisfied condition will not allow user access via current binding. Different bindings, including their conditions, are examined independently. This field is GOOGLE_INTERNAL." + }, "members": { "type": "array", - "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.", + "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`.\n\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.", "items": { "type": "string" } @@ -1634,7 +1707,7 @@ "Commitment": { "id": "Commitment", "type": "object", - "description": "A usage-commitment with a start / end time. Users create commitments for particular resources (e.g. memory). Actual usage is first deducted from available commitments made prior, perhaps at a reduced price (as laid out in the commitment).", + "description": "Represents a Commitment resource. Creating a Commitment resource means that you are purchasing a committed use contract with an explicit start and end time. You can create commitments based on vCPUs and memory usage and receive discounted rates. For full details, read Signing Up for Committed Use Discounts.\n\nCommitted use discounts are subject to Google Cloud Platform's Service Specific Terms. By purchasing a committed use discount, you agree to these terms. Committed use discounts will not renew, so you must purchase a new commitment to continue receiving discounts.", "properties": { "creationTimestamp": { "type": "string", @@ -1698,7 +1771,7 @@ }, "status": { "type": "string", - "description": "[Output Only] Status of the commitment with regards to eventual expiration (each commitment has an end-date defined). One of the following values: NOT_YET_ACTIVE, ACTIVE, EXPIRED.", + "description": "[Output Only] Status of the commitment with regards to eventual expiration (each commitment has an end date defined). One of the following values: NOT_YET_ACTIVE, ACTIVE, EXPIRED.", "enum": [ "ACTIVE", "CREATING", @@ -1724,11 +1797,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "Commitments by scope.", + "description": "A list of CommitmentsScopedList resources.", "additionalProperties": { "$ref": "CommitmentsScopedList", "description": "[Output Only] Name of the scope containing this set of commitments." @@ -1756,7 +1829,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -2098,7 +2171,7 @@ }, "sizeGb": { "type": "string", - "description": "Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the sourceImage or sourceSnapshot parameter, or specify it alone to create an empty persistent disk.\n\nIf you specify this field along with sourceImage or sourceSnapshot, the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot.", + "description": "Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the sourceImage or sourceSnapshot parameter, or specify it alone to create an empty persistent disk.\n\nIf you specify this field along with sourceImage or sourceSnapshot, the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot. Acceptable values are 1 to 65536, inclusive.", "format": "int64" }, "sourceImage": { @@ -2176,11 +2249,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped disk lists.", + "description": "A list of DisksScopedList resources.", "additionalProperties": { "$ref": "DisksScopedList", "description": "[Output Only] Name of the scope containing this set of disks." @@ -2193,7 +2266,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results. Acceptable values are 0 to 500, inclusive. (Default: 500)" + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -2224,7 +2297,7 @@ }, "nextPageToken": { "type": "string", - "description": "This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -2303,11 +2376,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped disk type lists.", + "description": "A list of DiskTypesScopedList resources.", "additionalProperties": { "$ref": "DiskTypesScopedList", "description": "[Output Only] Name of the scope containing this set of disk types." @@ -2335,11 +2408,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Disk Type resources.", + "description": "A list of DiskType resources.", "items": { "$ref": "DiskType" } @@ -2534,6 +2607,29 @@ } } }, + "Expr": { + "id": "Expr", + "type": "object", + "description": "Represents an expression text. Example:\n\ntitle: \"User account presence\" description: \"Determines whether the request has a user account\" expression: \"size(request.user) \u003e 0\"", + "properties": { + "description": { + "type": "string", + "description": "An optional description of the expression. This is a longer text which describes the expression, e.g. when hovered over it in a UI." + }, + "expression": { + "type": "string", + "description": "Textual representation of an expression in Common Expression Language syntax.\n\nThe application context of the containing message determines which well-known feature set of CEL is supported." + }, + "location": { + "type": "string", + "description": "An optional string indicating the location of the expression for error reporting, e.g. a file name and a position in the file." + }, + "title": { + "type": "string", + "description": "An optional title for the expression, i.e. a short string describing its purpose. This can be used e.g. in UIs which allow to enter the expression." + } + } + }, "Firewall": { "id": "Firewall", "type": "object", @@ -2547,7 +2643,7 @@ "properties": { "IPProtocol": { "type": "string", - "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp), or the IP protocol number." + "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, ipip, sctp), or the IP protocol number." }, "ports": { "type": "array", @@ -2571,7 +2667,7 @@ "properties": { "IPProtocol": { "type": "string", - "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp), or the IP protocol number." + "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, ipip, sctp), or the IP protocol number." }, "ports": { "type": "array", @@ -2613,7 +2709,7 @@ }, "kind": { "type": "string", - "description": "[Output Ony] Type of the resource. Always compute#firewall for firewall rules.", + "description": "[Output Only] Type of the resource. Always compute#firewall for firewall rules.", "default": "compute#firewall" }, "name": { @@ -2647,9 +2743,23 @@ "type": "string" } }, + "sourceServiceAccounts": { + "type": "array", + "description": "If source service accounts are specified, the firewall will apply only to traffic originating from an instance with a service account in this list. Source service accounts cannot be used to control traffic to an instance's external IP address because service accounts are associated with an instance, not an IP address. sourceRanges can be set at the same time as sourceServiceAccounts. If both are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP belongs to an instance with service account listed in sourceServiceAccount. The connection does not need to match both properties for the firewall to apply. sourceServiceAccounts cannot be used at the same time as sourceTags or targetTags.", + "items": { + "type": "string" + } + }, "sourceTags": { "type": "array", - "description": "If source tags are specified, the firewall will apply only to traffic with source IP that belongs to a tag listed in source tags. Source tags cannot be used to control traffic to an instance's external IP address. Because tags are associated with an instance, not an IP address. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.", + "description": "If source tags are specified, the firewall rule applies only to traffic with source IPs that match the primary network interfaces of VM instances that have the tag and are in the same VPC network. Source tags cannot be used to control traffic to an instance's external IP address, it only applies to traffic between instances in the same virtual network. Because tags are associated with instances, not IP addresses. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.", + "items": { + "type": "string" + } + }, + "targetServiceAccounts": { + "type": "array", + "description": "A list of service accounts indicating sets of instances located in the network that may make network connections as specified in allowed[]. targetServiceAccounts cannot be used at the same time as targetTags or sourceTags. If neither targetServiceAccounts nor targetTags are specified, the firewall rule applies to all instances on the specified network.", "items": { "type": "string" } @@ -2670,11 +2780,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Firewall resources.", + "description": "A list of Firewall resources.", "items": { "$ref": "Firewall" } @@ -2694,6 +2804,28 @@ } } }, + "FixedOrPercent": { + "id": "FixedOrPercent", + "type": "object", + "description": "Encapsulates numeric value that can be either absolute or relative.", + "properties": { + "calculated": { + "type": "integer", + "description": "[Output Only] Absolute value calculated based on mode: mode = fixed -\u003e calculated = fixed = percent -\u003e calculated = ceiling(percent/100 * base_value)", + "format": "int32" + }, + "fixed": { + "type": "integer", + "description": "fixed must be non-negative.", + "format": "int32" + }, + "percent": { + "type": "integer", + "description": "percent must belong to [0, 100].", + "format": "int32" + } + } + }, "ForwardingRule": { "id": "ForwardingRule", "type": "object", @@ -2701,7 +2833,7 @@ "properties": { "IPAddress": { "type": "string", - "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP. For regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule. Only IPv4 is supported." + "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP. For regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IPv4 address from the same scope (global or regional) will be assigned. A regional forwarding rule supports IPv4 only. A global forwarding rule supports either IPv4 or IPv6.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule." }, "IPProtocol": { "type": "string", @@ -2759,6 +2891,18 @@ "description": "[Output Only] Type of the resource. Always compute#forwardingRule for Forwarding Rule resources.", "default": "compute#forwardingRule" }, + "labelFingerprint": { + "type": "string", + "description": "A fingerprint for the labels being applied to this resource, which is essentially a hash of the labels set used for optimistic locking. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update labels. You must always provide an up-to-date fingerprint hash in order to update or change labels.\n\nTo see the latest fingerprint, make a get() request to retrieve a ForwardingRule.", + "format": "byte" + }, + "labels": { + "type": "object", + "description": "Labels to apply to this resource. These can be later modified by the setLabels method. Each label key/value pair must comply with RFC1035. Label values may be empty.", + "additionalProperties": { + "type": "string" + } + }, "loadBalancingScheme": { "type": "string", "description": "This signifies what the ForwardingRule will be used for and can only take the following values: INTERNAL, EXTERNAL The value of INTERNAL means that this will be used for Internal Network Load Balancing (TCP, UDP). The value of EXTERNAL means that this will be used for External Load Balancing (HTTP(S) LB, External TCP/UDP LB, SSL Proxy)", @@ -2784,7 +2928,7 @@ }, "portRange": { "type": "string", - "description": "This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance.\n\nApplicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges.\n\nSome types of forwarding target have constraints on the acceptable ports: \n- TargetHttpProxy: 80, 8080 \n- TargetHttpsProxy: 443 \n- TargetSslProxy: 443 \n- TargetVpnGateway: 500, 4500\n-" + "description": "This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance.\n\nApplicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges.\n\nSome types of forwarding target have constraints on the acceptable ports: \n- TargetHttpProxy: 80, 8080 \n- TargetHttpsProxy: 443 \n- TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 \n- TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 \n- TargetVpnGateway: 500, 4500\n-" }, "ports": { "type": "array", @@ -2826,11 +2970,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped forwarding rule lists.", + "description": "A list of ForwardingRulesScopedList resources.", "additionalProperties": { "$ref": "ForwardingRulesScopedList", "description": "Name of the scope containing this set of addresses." @@ -2858,7 +3002,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Set by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -2989,7 +3133,7 @@ "properties": { "type": { "type": "string", - "description": "The type of supported feature. Currenty only VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the server might also populate this property with the value WINDOWS to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", + "description": "The type of supported feature. Currently only VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the server might also populate this property with the value WINDOWS to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", "enum": [ "FEATURE_TYPE_UNSPECIFIED", "MULTI_IP_SUBNET", @@ -3171,7 +3315,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -3332,7 +3476,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -3487,7 +3631,7 @@ }, "guestOsFeatures": { "type": "array", - "description": "A list of features to enable on the guest OS. Applicable for bootable images only. Currently, only one feature can be enabled, VIRTIO_SCSCI_MULTIQUEUE, which allows each virtual CPU to have its own queue. For Windows images, you can only enable VIRTIO_SCSCI_MULTIQUEUE on images with driver version 1.2.0.1621 or higher. Linux images with kernel versions 3.17 and higher will support VIRTIO_SCSCI_MULTIQUEUE.\n\nFor new Windows images, the server might also populate this field with the value WINDOWS, to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", + "description": "A list of features to enable on the guest OS. Applicable for bootable images only. Currently, only one feature can be enabled, VIRTIO_SCSI_MULTIQUEUE, which allows each virtual CPU to have its own queue. For Windows images, you can only enable VIRTIO_SCSI_MULTIQUEUE on images with driver version 1.2.0.1621 or higher. Linux images with kernel versions 3.17 and higher will support VIRTIO_SCSI_MULTIQUEUE.\n\nFor new Windows images, the server might also populate this field with the value WINDOWS, to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", "items": { "$ref": "GuestOsFeature" } @@ -3581,6 +3725,18 @@ "type": "string", "description": "The ID value of the disk used to create this image. This value may be used to determine whether the image was taken from the current or a previous instance of a given disk name." }, + "sourceImage": { + "type": "string", + "description": "URL of the source image used to create this image. This can be a full or valid partial URL. You must provide exactly one of: \n- this property, or \n- the rawDisk.source property, or \n- the sourceDisk property in order to create an image." + }, + "sourceImageEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "The customer-supplied encryption key of the source image. Required if the source image is protected by a customer-supplied encryption key." + }, + "sourceImageId": { + "type": "string", + "description": "[Output Only] The ID value of the image used to create this image. This value may be used to determine whether the image was taken from the current or a previous instance of a given image name." + }, "sourceType": { "type": "string", "description": "The type of the image used to create this disk. The default and only value is RAW", @@ -3615,11 +3771,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Image resources.", + "description": "A list of Image resources.", "items": { "$ref": "Image" } @@ -3709,6 +3865,10 @@ "$ref": "Metadata", "description": "The metadata key/value pairs assigned to this instance. This includes custom metadata and predefined keys." }, + "minCpuPlatform": { + "type": "string", + "description": "Specifies a minimum CPU platform for the VM instance. Applicable values are the friendly names of CPU platforms, such as minCpuPlatform: \"Intel Haswell\" or minCpuPlatform: \"Intel Sandy Bridge\"." + }, "name": { "type": "string", "description": "The name of the resource, provided by the client when initially creating the resource. The resource name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.", @@ -3741,9 +3901,13 @@ "$ref": "ServiceAccount" } }, + "startRestricted": { + "type": "boolean", + "description": "[Output Only] Whether a VM has been restricted for start because Compute Engine has detected suspicious activity." + }, "status": { "type": "string", - "description": "[Output Only] The status of the instance. One of the following values: PROVISIONING, STAGING, RUNNING, STOPPING, SUSPENDING, SUSPENDED, and TERMINATED.", + "description": "[Output Only] The status of the instance. One of the following values: PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED, SUSPENDING, SUSPENDED, and TERMINATED.", "enum": [ "PROVISIONING", "RUNNING", @@ -3785,11 +3949,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped instance lists.", + "description": "A list of InstancesScopedList resources.", "additionalProperties": { "$ref": "InstancesScopedList", "description": "[Output Only] Name of the scope containing this set of instances." @@ -3887,11 +4051,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this aggregated list of instance groups. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped instance group lists.", + "description": "A list of InstanceGroupsScopedList resources.", "additionalProperties": { "$ref": "InstanceGroupsScopedList", "description": "The name of the scope that contains this set of instance groups." @@ -3908,7 +4072,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -3919,11 +4083,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this list of instance groups. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of instance groups.", + "description": "A list of InstanceGroup resources.", "items": { "$ref": "InstanceGroup" } @@ -3939,7 +4103,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -4018,7 +4182,8 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "annotations": { "required": [ - "compute.instanceGroupManagers.insert" + "compute.instanceGroupManagers.insert", + "compute.regionInstanceGroupManagers.insert" ] } }, @@ -4029,6 +4194,10 @@ "$ref": "NamedPort" } }, + "pendingActions": { + "$ref": "InstanceGroupManagerPendingActionsSummary", + "description": "[Output Only] The list of instance actions and the number of instances in this managed instance group that are pending for each of those actions." + }, "region": { "type": "string", "description": "[Output Only] The URL of the region where the managed instance group resides (for regional resources)." @@ -4054,10 +4223,22 @@ "format": "int32", "annotations": { "required": [ - "compute.instanceGroupManagers.insert" + "compute.instanceGroupManagers.insert", + "compute.regionInstanceGroupManagers.insert" ] } }, + "updatePolicy": { + "$ref": "InstanceGroupManagerUpdatePolicy", + "description": "The update policy for this managed instance group." + }, + "versions": { + "type": "array", + "description": "Versions supported by this IGM. User should set this field if they need fine-grained control over how many instances in each version are run by this IGM. Versions are keyed by instanceTemplate. Every instanceTemplate can appear at most once. This field overrides instanceTemplate field. If both instanceTemplate and versions are set, the user receives a warning. \"instanceTemplate: X\" is semantically equivalent to \"versions [ { instanceTemplate: X } ]\". Exactly one version must have targetSize field left unset. Size of such a version will be calculated automatically.", + "items": { + "$ref": "InstanceGroupManagerVersion" + } + }, "zone": { "type": "string", "description": "[Output Only] The URL of the zone where the managed instance group is located (for zonal resources)." @@ -4107,6 +4288,11 @@ "type": "integer", "description": "[Output Only] The number of instances in the managed instance group that are scheduled to be restarted or are currently being restarted.", "format": "int32" + }, + "verifying": { + "type": "integer", + "description": "[Output Only] The number of instances in the managed instance group that are being verified. More details regarding verification process are covered in the documentation of ManagedInstance.InstanceAction.VERIFYING enum field.", + "format": "int32" } } }, @@ -4116,11 +4302,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this aggregated list of managed instance groups. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of filtered managed instance group lists.", + "description": "A list of InstanceGroupManagersScopedList resources.", "additionalProperties": { "$ref": "InstanceGroupManagersScopedList", "description": "[Output Only] The name of the scope that contains this set of managed instance groups." @@ -4137,7 +4323,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -4163,11 +4349,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this resource type. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of managed instance groups.", + "description": "A list of InstanceGroupManager resources.", "items": { "$ref": "InstanceGroupManager" } @@ -4187,6 +4373,91 @@ } } }, + "InstanceGroupManagerPendingActionsSummary": { + "id": "InstanceGroupManagerPendingActionsSummary", + "type": "object", + "properties": { + "creating": { + "type": "integer", + "description": "[Output Only] The number of instances in the managed instance group that are pending to be created.", + "format": "int32" + }, + "deleting": { + "type": "integer", + "description": "[Output Only] The number of instances in the managed instance group that are pending to be deleted.", + "format": "int32" + }, + "recreating": { + "type": "integer", + "description": "[Output Only] The number of instances in the managed instance group that are pending to be recreated.", + "format": "int32" + }, + "restarting": { + "type": "integer", + "description": "[Output Only] The number of instances in the managed instance group that are pending to be restarted.", + "format": "int32" + } + } + }, + "InstanceGroupManagerUpdatePolicy": { + "id": "InstanceGroupManagerUpdatePolicy", + "type": "object", + "properties": { + "maxSurge": { + "$ref": "FixedOrPercent", + "description": "Maximum number of instances that can be created above the InstanceGroupManager.targetSize during the update process. By default, a fixed value of 1 is used. Using maxSurge \u003e 0 will cause instance names to change during the update process. At least one of { maxSurge, maxUnavailable } must be greater than 0." + }, + "maxUnavailable": { + "$ref": "FixedOrPercent", + "description": "Maximum number of instances that can be unavailable during the update process. The instance is considered available if all of the following conditions are satisfied: 1. Instance's status is RUNNING. 2. Instance's liveness health check result was observed to be HEALTHY at least once. By default, a fixed value of 1 is used. At least one of { maxSurge, maxUnavailable } must be greater than 0." + }, + "minReadySec": { + "type": "integer", + "description": "Minimum number of seconds to wait for after a newly created instance becomes available. This value must be from range [0, 3600].", + "format": "int32" + }, + "minimalAction": { + "type": "string", + "description": "Minimal action to be taken on an instance. The order of action types is: RESTART \u003c REPLACE.", + "enum": [ + "REPLACE", + "RESTART" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "type": { + "type": "string", + "enum": [ + "OPPORTUNISTIC", + "PROACTIVE" + ], + "enumDescriptions": [ + "", + "" + ] + } + } + }, + "InstanceGroupManagerVersion": { + "id": "InstanceGroupManagerVersion", + "type": "object", + "properties": { + "instanceTemplate": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Name of the version. Unique among all versions in the scope of this managed instance group." + }, + "targetSize": { + "$ref": "FixedOrPercent", + "description": "Intended number of instances that are created from instanceTemplate. The final number of instances created from instanceTemplate will be equal to: * if expressed as fixed number: min(targetSize.fixed, instanceGroupManager.targetSize), * if expressed as percent: ceiling(targetSize.percent * InstanceGroupManager.targetSize). If unset, this version will handle all the remaining instances." + } + } + }, "InstanceGroupManagersAbandonInstancesRequest": { "id": "InstanceGroupManagersAbandonInstancesRequest", "type": "object", @@ -4399,11 +4670,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this list of instances in the specified instance group. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of instances and any named ports that are assigned to those instances.", + "description": "A list of InstanceWithNamedPorts resources.", "items": { "$ref": "InstanceWithNamedPorts" } @@ -4419,7 +4690,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this list of instances in the specified instance groups. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -4561,11 +4832,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of instances.", + "description": "A list of Instance resources.", "items": { "$ref": "Instance" } @@ -4592,11 +4863,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of referrers.", + "description": "A list of Reference resources.", "items": { "$ref": "Reference" } @@ -4637,7 +4908,7 @@ "properties": { "canIpForward": { "type": "boolean", - "description": "Enables instances created based on this template to send packets with source IP addresses other than their own and receive packets with destination IP addresses other than their own. If these instances will be used as an IP gateway or it will be set as the next-hop in a Route resource, specify true. If unsure, leave this set to false. See the Enable IP forwarding for instances documentation for more information." + "description": "Enables instances created based on this template to send packets with source IP addresses other than their own and receive packets with destination IP addresses other than their own. If these instances will be used as an IP gateway or it will be set as the next-hop in a Route resource, specify true. If unsure, leave this set to false. See the Enable IP forwarding documentation for more information." }, "description": { "type": "string", @@ -4677,6 +4948,10 @@ "$ref": "Metadata", "description": "The metadata key/value pairs to assign to instances that are created from this template. These pairs can consist of custom metadata or predefined keys. See Project and instance metadata for more information." }, + "minCpuPlatform": { + "type": "string", + "description": "Minimum cpu/platform to be used by this instance. The instance may be scheduled on the specified or newer cpu/platform. Applicable values are the friendly names of CPU platforms, such as minCpuPlatform: \"Intel Haswell\" or minCpuPlatform: \"Intel Sandy Bridge\". For more information, read Specifying a Minimum CPU Platform." + }, "networkInterfaces": { "type": "array", "description": "An array of network access configurations for this interface.", @@ -4761,11 +5036,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this instance template. The server defines this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] list of InstanceTemplate resources.", + "description": "A list of InstanceTemplate resources.", "items": { "$ref": "InstanceTemplate" } @@ -4781,7 +5056,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this instance template list. The server defines this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -4948,6 +5223,16 @@ } } }, + "InstancesSetMinCpuPlatformRequest": { + "id": "InstancesSetMinCpuPlatformRequest", + "type": "object", + "properties": { + "minCpuPlatform": { + "type": "string", + "description": "Minimum cpu/platform this instance should be started at." + } + } + }, "InstancesSetServiceAccountRequest": { "id": "InstancesSetServiceAccountRequest", "type": "object", @@ -4985,7 +5270,7 @@ "properties": { "chargesUseFee": { "type": "boolean", - "description": "[Output Only] If true, the customer will be charged license fee for running software that contains this license on an instance." + "description": "[Output Only] Deprecated. This field no longer reflects whether a license charges a usage fee." }, "kind": { "type": "string", @@ -5013,29 +5298,58 @@ "type": "object", "description": "Specifies what kind of log the caller must write", "properties": { + "cloudAudit": { + "$ref": "LogConfigCloudAuditOptions", + "description": "Cloud audit options." + }, "counter": { "$ref": "LogConfigCounterOptions", "description": "Counter options." } } }, - "LogConfigCounterOptions": { - "id": "LogConfigCounterOptions", + "LogConfigCloudAuditOptions": { + "id": "LogConfigCloudAuditOptions", "type": "object", - "description": "Options for counters", + "description": "Write a Cloud Audit log", "properties": { - "field": { - "type": "string", - "description": "The field value to attribute." + "authorizationLoggingOptions": { + "$ref": "AuthorizationLoggingOptions", + "description": "Information used by the Cloud Audit Logging pipeline." }, - "metric": { + "logName": { "type": "string", - "description": "The metric to update." - } - } - }, - "MachineType": { - "id": "MachineType", + "description": "The log_name to populate in the Cloud Audit Record.", + "enum": [ + "ADMIN_ACTIVITY", + "DATA_ACCESS", + "UNSPECIFIED_LOG_NAME" + ], + "enumDescriptions": [ + "", + "", + "" + ] + } + } + }, + "LogConfigCounterOptions": { + "id": "LogConfigCounterOptions", + "type": "object", + "description": "Options for counters", + "properties": { + "field": { + "type": "string", + "description": "The field value to attribute." + }, + "metric": { + "type": "string", + "description": "The metric to update." + } + } + }, + "MachineType": { + "id": "MachineType", "type": "object", "description": "A Machine Type resource.", "properties": { @@ -5106,11 +5420,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped machine type lists.", + "description": "A list of MachineTypesScopedList resources.", "additionalProperties": { "$ref": "MachineTypesScopedList", "description": "[Output Only] Name of the scope containing this set of machine types." @@ -5138,11 +5452,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Machine Type resources.", + "description": "A list of MachineType resources.", "items": { "$ref": "MachineType" } @@ -5259,7 +5573,8 @@ "NONE", "RECREATING", "REFRESHING", - "RESTARTING" + "RESTARTING", + "VERIFYING" ], "enumDescriptions": [ "", @@ -5269,6 +5584,7 @@ "", "", "", + "", "" ] }, @@ -5391,7 +5707,7 @@ }, "value": { "type": "string", - "description": "Value for the metadata entry. These are free-form strings, and only have meaning as interpreted by the image running in the instance. The only restriction placed on values is that their size must be less than or equal to 32768 bytes.", + "description": "Value for the metadata entry. These are free-form strings, and only have meaning as interpreted by the image running in the instance. The only restriction placed on values is that their size must be less than or equal to 262144 bytes (256 KiB).", "annotations": { "required": [ "compute.instances.insert", @@ -5541,11 +5857,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Network resources.", + "description": "A list of Network resources.", "items": { "$ref": "Network" } @@ -6035,7 +6351,7 @@ }, "bindings": { "type": "array", - "description": "Associates a list of `members` to a `role`. Multiple `bindings` must not be specified for the same `role`. `bindings` with no members will result in an error.", + "description": "Associates a list of `members` to a `role`. `bindings` with no members will result in an error.", "items": { "$ref": "Binding" } @@ -6122,7 +6438,7 @@ }, "xpnProjectStatus": { "type": "string", - "description": "[Output Only] The role this project has in a Cross Project Network (XPN) configuration. Currently only HOST projects are differentiated.", + "description": "[Output Only] The role this project has in a shared VPC configuration. Currently only HOST projects are differentiated.", "enum": [ "HOST", "UNSPECIFIED_XPN_PROJECT_STATUS" @@ -6140,7 +6456,7 @@ "properties": { "xpnResource": { "$ref": "XpnResourceId", - "description": "XPN resource ID." + "description": "Service resource (a.k.a service project) ID." } } }, @@ -6150,7 +6466,7 @@ "properties": { "xpnResource": { "$ref": "XpnResourceId", - "description": "XPN resource ID." + "description": "Service resource (a.k.a service project) ID." } } }, @@ -6160,7 +6476,7 @@ "properties": { "kind": { "type": "string", - "description": "[Output Only] Type of resource. Always compute#projectsGetXpnResources for lists of XPN resources.", + "description": "[Output Only] Type of resource. Always compute#projectsGetXpnResources for lists of service resources (a.k.a service projects)", "default": "compute#projectsGetXpnResources" }, "nextPageToken": { @@ -6169,7 +6485,7 @@ }, "resources": { "type": "array", - "description": "XPN resources attached to this project as their XPN host.", + "description": "Serive resources (a.k.a service projects) attached to this project as their shared VPC host.", "items": { "$ref": "XpnResourceId" } @@ -6182,7 +6498,7 @@ "properties": { "organization": { "type": "string", - "description": "Optional organization ID managed by Cloud Resource Manager, for which to list XPN host projects. If not specified, the organization will be inferred from the project." + "description": "Optional organization ID managed by Cloud Resource Manager, for which to list shared VPC host projects. If not specified, the organization will be inferred from the project." } } }, @@ -6220,10 +6536,13 @@ "NETWORKS", "NVIDIA_K80_GPUS", "PREEMPTIBLE_CPUS", + "PREEMPTIBLE_LOCAL_SSD_GB", "REGIONAL_AUTOSCALERS", "REGIONAL_INSTANCE_GROUP_MANAGERS", "ROUTERS", "ROUTES", + "SECURITY_POLICIES", + "SECURITY_POLICY_RULES", "SNAPSHOTS", "SSD_TOTAL_GB", "SSL_CERTIFICATES", @@ -6275,6 +6594,9 @@ "", "", "", + "", + "", + "", "" ] }, @@ -6379,11 +6701,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of autoscalers.", + "description": "A list of Autoscaler resources.", "items": { "$ref": "Autoscaler" } @@ -6395,7 +6717,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -6410,7 +6732,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -6430,7 +6752,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -6441,11 +6763,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of managed instance groups.", + "description": "A list of InstanceGroupManager resources.", "items": { "$ref": "InstanceGroupManager" } @@ -6457,11 +6779,11 @@ }, "nextPageToken": { "type": "string", - "description": "[Output only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", - "description": "[Output only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -6567,11 +6889,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of instances and any named ports that are assigned to those instances.", + "description": "A list of InstanceWithNamedPorts resources.", "items": { "$ref": "InstanceWithNamedPorts" } @@ -6587,7 +6909,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -6639,11 +6961,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Region resources.", + "description": "A list of Region resources.", "items": { "$ref": "Region" } @@ -6663,6 +6985,24 @@ } } }, + "RegionSetLabelsRequest": { + "id": "RegionSetLabelsRequest", + "type": "object", + "properties": { + "labelFingerprint": { + "type": "string", + "description": "The fingerprint of the previous set of labels for this resource, used to detect conflicts. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update labels. You must always provide an up-to-date fingerprint hash in order to update or change labels. Make a get() request to the resource to get the latest fingerprint.", + "format": "byte" + }, + "labels": { + "type": "object", + "description": "The labels to set for this resource.", + "additionalProperties": { + "type": "string" + } + } + } + }, "ResourceCommitment": { "id": "ResourceCommitment", "type": "object", @@ -6670,12 +7010,12 @@ "properties": { "amount": { "type": "string", - "description": "The amount of the resource purchased (in a type-dependent unit, such as bytes).", + "description": "The amount of the resource purchased (in a type-dependent unit, such as bytes). For vCPUs, this can just be an integer. For memory, this must be provided in MB. Memory must be a multiple of 256 MB, with up to 6.5GB of memory per every vCPU.", "format": "int64" }, "type": { "type": "string", - "description": "Type of resource for which this commitment applies.", + "description": "Type of resource for which this commitment applies. Possible values are VCPU and MEMORY", "enum": [ "MEMORY", "UNSPECIFIED", @@ -6702,7 +7042,7 @@ "Route": { "id": "Route", "type": "object", - "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving a instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, an instance gateway, or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.", + "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving an instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, an instance gateway, or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.", "properties": { "creationTimestamp": { "type": "string", @@ -6881,11 +7221,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Route resources.", + "description": "A list of Route resources.", "items": { "$ref": "Route" } @@ -6982,11 +7322,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped router lists.", + "description": "A list of Router resources.", "additionalProperties": { "$ref": "RoutersScopedList", "description": "Name of the scope containing this set of routers." @@ -7077,7 +7417,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -7589,11 +7929,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Snapshot resources.", + "description": "A list of Snapshot resources.", "items": { "$ref": "Snapshot" } @@ -7662,7 +8002,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -7697,11 +8037,11 @@ }, "description": { "type": "string", - "description": "An optional description of this resource. Provide this property when you create the resource." + "description": "An optional description of this resource. Provide this property when you create the resource. This field can be set only at resource creation time." }, "gatewayAddress": { "type": "string", - "description": "[Output Only] The gateway address for default routes to reach destination addresses outside this subnetwork." + "description": "[Output Only] The gateway address for default routes to reach destination addresses outside this subnetwork. This field can be set only at resource creation time." }, "id": { "type": "string", @@ -7710,7 +8050,7 @@ }, "ipCidrRange": { "type": "string", - "description": "The range of internal addresses that are owned by this subnetwork. Provide this property when you create the subnetwork. For example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and non-overlapping within a network. Only IPv4 is supported." + "description": "The range of internal addresses that are owned by this subnetwork. Provide this property when you create the subnetwork. For example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and non-overlapping within a network. Only IPv4 is supported. This field can be set only at resource creation time." }, "kind": { "type": "string", @@ -7724,15 +8064,15 @@ }, "network": { "type": "string", - "description": "The URL of the network to which this subnetwork belongs, provided by the client when initially creating the subnetwork. Only networks that are in the distributed mode can have subnetworks." + "description": "The URL of the network to which this subnetwork belongs, provided by the client when initially creating the subnetwork. Only networks that are in the distributed mode can have subnetworks. This field can be set only at resource creation time." }, "privateIpGoogleAccess": { "type": "boolean", - "description": "Whether the VMs in this subnet can access Google services without assigned external IP addresses." + "description": "Whether the VMs in this subnet can access Google services without assigned external IP addresses. This field can be both set at resource creation time and updated using setPrivateIpGoogleAccess." }, "region": { "type": "string", - "description": "URL of the region where the Subnetwork resides." + "description": "URL of the region where the Subnetwork resides. This field can be set only at resource creation time." }, "secondaryIpRanges": { "type": "array", @@ -7753,11 +8093,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output] A map of scoped Subnetwork lists.", + "description": "A list of SubnetworksScopedList resources.", "additionalProperties": { "$ref": "SubnetworksScopedList", "description": "Name of the scope containing this set of Subnetworks." @@ -7785,11 +8125,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "The Subnetwork resources.", + "description": "A list of Subnetwork resources.", "items": { "$ref": "Subnetwork" } @@ -8024,7 +8364,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -8113,7 +8453,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -8199,7 +8539,7 @@ }, "items": { "type": "object", - "description": "A map of scoped target instance lists.", + "description": "A list of TargetInstance resources.", "additionalProperties": { "$ref": "TargetInstancesScopedList", "description": "Name of the scope containing this set of target instances." @@ -8227,7 +8567,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -8418,11 +8758,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped target pool lists.", + "description": "A list of TargetPool resources.", "additionalProperties": { "$ref": "TargetPoolsScopedList", "description": "Name of the scope containing this set of target pools." @@ -8467,7 +8807,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -8739,7 +9079,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -8848,7 +9188,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -8960,11 +9300,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped target vpn gateway lists.", + "description": "A list of TargetVpnGateway resources.", "additionalProperties": { "$ref": "TargetVpnGatewaysScopedList", "description": "[Output Only] Name of the scope containing this set of target VPN gateways." @@ -8992,11 +9332,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of TargetVpnGateway resources.", + "description": "A list of TargetVpnGateway resources.", "items": { "$ref": "TargetVpnGateway" } @@ -9236,7 +9576,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Set by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -9481,11 +9821,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped vpn tunnel lists.", + "description": "A list of VpnTunnelsScopedList resources.", "additionalProperties": { "$ref": "VpnTunnelsScopedList", "description": "Name of the scope containing this set of vpn tunnels." @@ -9513,11 +9853,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of VpnTunnel resources.", + "description": "A list of VpnTunnel resources.", "items": { "$ref": "VpnTunnel" } @@ -9625,18 +9965,18 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of XPN host project URLs.", + "description": "[Output Only] A list of shared VPC host project URLs.", "items": { "$ref": "Project" } }, "kind": { "type": "string", - "description": "[Output Only] Type of resource. Always compute#xpnHostList for lists of XPN hosts.", + "description": "[Output Only] Type of resource. Always compute#xpnHostList for lists of shared VPC hosts.", "default": "compute#xpnHostList" }, "nextPageToken": { @@ -9652,15 +9992,15 @@ "XpnResourceId": { "id": "XpnResourceId", "type": "object", - "description": "XpnResourceId", + "description": "Service resource (a.k.a service project) ID.", "properties": { "id": { "type": "string", - "description": "The ID of the XPN resource. In the case of projects, this field matches the project's name, not the canonical ID." + "description": "The ID of the service resource. In the case of projects, this field matches the project ID (e.g., my-project), not the project number (e.g., 12345678)." }, "type": { "type": "string", - "description": "The type of the XPN resource.", + "description": "The type of the service resource.", "enum": [ "PROJECT", "XPN_RESOURCE_TYPE_UNSPECIFIED" @@ -9677,6 +10017,13 @@ "type": "object", "description": "A Zone resource.", "properties": { + "availableCpuPlatforms": { + "type": "array", + "description": "[Output Only] Available cpu/platform selections for the zone.", + "items": { + "type": "string" + } + }, "creationTimestamp": { "type": "string", "description": "[Output Only] Creation timestamp in RFC3339 text format." @@ -9736,7 +10083,7 @@ }, "items": { "type": "array", - "description": "[Output Only] A list of Zone resources.", + "description": "A list of Zone resources.", "items": { "$ref": "Zone" } @@ -9786,7 +10133,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9877,7 +10224,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9938,7 +10285,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10005,6 +10352,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -10081,6 +10433,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -10106,7 +10463,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10155,6 +10512,55 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "setLabels": { + "id": "compute.addresses.setLabels", + "path": "{project}/regions/{region}/addresses/{resource}/setLabels", + "httpMethod": "POST", + "description": "Sets the labels on an Address. To learn more about labels, read the Labeling Resources documentation.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "The region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "resource" + ], + "request": { + "$ref": "RegionSetLabelsRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "testIamPermissions": { "id": "compute.addresses.testIamPermissions", "path": "{project}/regions/{region}/addresses/{resource}/testIamPermissions", @@ -10212,7 +10618,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10273,6 +10679,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "Name of the zone for this request.", @@ -10349,6 +10760,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "Name of the zone for this request.", @@ -10380,7 +10796,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10433,7 +10849,7 @@ "id": "compute.autoscalers.patch", "path": "{project}/zones/{zone}/autoscalers", "httpMethod": "PATCH", - "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "autoscaler": { "type": "string", @@ -10448,6 +10864,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "Name of the zone for this request.", @@ -10536,6 +10957,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "Name of the zone for this request.", @@ -10582,6 +11008,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -10642,6 +11073,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -10666,7 +11102,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10711,7 +11147,7 @@ "id": "compute.backendBuckets.patch", "path": "{project}/global/backendBuckets/{backendBucket}", "httpMethod": "PATCH", - "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports patch semantics.", + "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "backendBucket": { "type": "string", @@ -10726,6 +11162,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -10763,6 +11204,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -10792,7 +11238,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10852,6 +11298,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -10948,6 +11399,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -10972,7 +11428,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11017,7 +11473,7 @@ "id": "compute.backendServices.patch", "path": "{project}/global/backendServices/{backendService}", "httpMethod": "PATCH", - "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "backendService": { "type": "string", @@ -11032,6 +11488,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -11106,6 +11567,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -11135,7 +11601,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11226,7 +11692,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11287,7 +11753,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11352,6 +11818,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -11395,6 +11866,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -11471,6 +11947,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "sourceImage": { "type": "string", "description": "Optional. Source image to restore onto a disk.", @@ -11507,7 +11988,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11576,6 +12057,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -11604,7 +12090,7 @@ "id": "compute.disks.setLabels", "path": "{project}/zones/{zone}/disks/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on a disk. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on a disk. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -11613,6 +12099,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "resource": { "type": "string", "description": "Name of the resource for this request.", @@ -11712,6 +12203,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -11772,6 +12268,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -11796,7 +12297,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11841,7 +12342,7 @@ "id": "compute.firewalls.patch", "path": "{project}/global/firewalls/{firewall}", "httpMethod": "PATCH", - "description": "Updates the specified firewall rule with the data included in the request. This method supports patch semantics.", + "description": "Updates the specified firewall rule with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "firewall": { "type": "string", @@ -11856,6 +12357,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -11930,6 +12436,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -11959,7 +12470,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12026,6 +12537,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -12102,6 +12618,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -12127,7 +12648,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12176,19 +12697,12 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, - "setTarget": { - "id": "compute.forwardingRules.setTarget", - "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget", + "setLabels": { + "id": "compute.forwardingRules.setLabels", + "path": "{project}/regions/{region}/forwardingRules/{resource}/setLabels", "httpMethod": "POST", - "description": "Changes target URL for forwarding rule. The new target should be of the same type as the old target.", + "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling Resources documentation.", "parameters": { - "forwardingRule": { - "type": "string", - "description": "Name of the ForwardingRule resource in which target is to be set.", - "required": true, - "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - "location": "path" - }, "project": { "type": "string", "description": "Project ID for this request.", @@ -12198,7 +12712,19 @@ }, "region": { "type": "string", - "description": "Name of the region scoping this request.", + "description": "The region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -12207,10 +12733,59 @@ "parameterOrder": [ "project", "region", - "forwardingRule" + "resource" ], "request": { - "$ref": "TargetReference" + "$ref": "RegionSetLabelsRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "setTarget": { + "id": "compute.forwardingRules.setTarget", + "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget", + "httpMethod": "POST", + "description": "Changes target URL for forwarding rule. The new target should be of the same type as the old target.", + "parameters": { + "forwardingRule": { + "type": "string", + "description": "Name of the ForwardingRule resource in which target is to be set.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region scoping this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + } + }, + "parameterOrder": [ + "project", + "region", + "forwardingRule" + ], + "request": { + "$ref": "TargetReference" }, "response": { "$ref": "Operation" @@ -12288,6 +12863,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -12348,6 +12928,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -12372,7 +12957,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12413,6 +12998,42 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "setLabels": { + "id": "compute.globalAddresses.setLabels", + "path": "{project}/global/addresses/{resource}/setLabels", + "httpMethod": "POST", + "description": "Sets the labels on a GlobalAddress. To learn more about labels, read the Labeling Resources documentation.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "resource" + ], + "request": { + "$ref": "GlobalSetLabelsRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "testIamPermissions": { "id": "compute.globalAddresses.testIamPermissions", "path": "{project}/global/addresses/{resource}/testIamPermissions", @@ -12473,6 +13094,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -12533,6 +13159,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -12557,7 +13188,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12598,6 +13229,42 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "setLabels": { + "id": "compute.globalForwardingRules.setLabels", + "path": "{project}/global/forwardingRules/{resource}/setLabels", + "httpMethod": "POST", + "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling Resources documentation.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "resource" + ], + "request": { + "$ref": "GlobalSetLabelsRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "setTarget": { "id": "compute.globalForwardingRules.setTarget", "path": "{project}/global/forwardingRules/{forwardingRule}/setTarget", @@ -12617,6 +13284,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -12683,7 +13355,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12796,7 +13468,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12860,6 +13532,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -12920,6 +13597,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -12944,7 +13626,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12989,7 +13671,7 @@ "id": "compute.healthChecks.patch", "path": "{project}/global/healthChecks/{healthCheck}", "httpMethod": "PATCH", - "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "healthCheck": { "type": "string", @@ -13004,6 +13686,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13078,6 +13765,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13118,6 +13810,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13178,6 +13875,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13202,7 +13904,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13247,7 +13949,7 @@ "id": "compute.httpHealthChecks.patch", "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", "httpMethod": "PATCH", - "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "httpHealthCheck": { "type": "string", @@ -13262,6 +13964,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13336,6 +14043,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13376,6 +14088,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13436,6 +14153,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13460,7 +14182,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13505,7 +14227,7 @@ "id": "compute.httpsHealthChecks.patch", "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", "httpMethod": "PATCH", - "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "httpsHealthCheck": { "type": "string", @@ -13520,6 +14242,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13594,6 +14321,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13634,6 +14366,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13667,6 +14404,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", + "location": "query" } }, "parameterOrder": [ @@ -13758,12 +14500,22 @@ "httpMethod": "POST", "description": "Creates an image in the specified project using the data included in the request.", "parameters": { + "forceCreate": { + "type": "boolean", + "description": "Force image creation if true.", + "location": "query" + }, "project": { "type": "string", "description": "Project ID for this request.", "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -13791,7 +14543,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13836,7 +14588,7 @@ "id": "compute.images.setLabels", "path": "{project}/global/images/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on an image. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on an image. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -13913,7 +14665,7 @@ "id": "compute.instanceGroupManagers.abandonInstances", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", "httpMethod": "POST", - "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -13928,6 +14680,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the managed instance group is located.", @@ -13959,7 +14716,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14019,6 +14776,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the managed instance group is located.", @@ -14043,7 +14805,7 @@ "id": "compute.instanceGroupManagers.deleteInstances", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", "httpMethod": "POST", - "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -14058,6 +14820,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the managed instance group is located.", @@ -14125,7 +14892,7 @@ "id": "compute.instanceGroupManagers.insert", "path": "{project}/zones/{zone}/instanceGroupManagers", "httpMethod": "POST", - "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group.", + "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group. Please contact Cloud Support if you need an increase in this limit.", "parameters": { "project": { "type": "string", @@ -14134,6 +14901,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where you want to create the managed instance group.", @@ -14164,7 +14936,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14275,7 +15047,7 @@ "id": "compute.instanceGroupManagers.patch", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", "httpMethod": "PATCH", - "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listManagedInstances method. This method supports patch semantics.", + "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listManagedInstances method. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "instanceGroupManager": { "type": "string", @@ -14290,6 +15062,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where you want to create the managed instance group.", @@ -14318,7 +15095,7 @@ "id": "compute.instanceGroupManagers.recreateInstances", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", "httpMethod": "POST", - "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -14333,6 +15110,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the managed instance group is located.", @@ -14360,7 +15142,7 @@ "id": "compute.instanceGroupManagers.resize", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize", "httpMethod": "POST", - "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", "parameters": { "instanceGroupManager": { "type": "string", @@ -14375,6 +15157,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "size": { "type": "integer", "description": "The number of running instances that the managed instance group should maintain at any given time. The group automatically adds or removes instances to maintain the number of instances specified by this parameter.", @@ -14407,7 +15194,7 @@ "id": "compute.instanceGroupManagers.resizeAdvanced", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced", "httpMethod": "POST", - "description": "Resizes the managed instance group with advanced configuration options like disabling creation retries. This is an extended version of the resize method.\n\nIf you increase the size of the instance group, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating, creatingWithoutRetries, or deleting actions with the get or listmanagedinstances method.", + "description": "Resizes the managed instance group with advanced configuration options like disabling creation retries. This is an extended version of the resize method.\n\nIf you increase the size of the instance group, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating, creatingWithoutRetries, or deleting actions with the get or listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", "parameters": { "instanceGroupManager": { "type": "string", @@ -14422,6 +15209,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the managed instance group is located.", @@ -14464,6 +15256,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the managed instance group is located.", @@ -14506,6 +15303,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the managed instance group is located.", @@ -14548,6 +15350,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the managed instance group is located.", @@ -14635,6 +15442,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where you want to create the managed instance group.", @@ -14681,6 +15493,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the instance group is located.", @@ -14712,7 +15529,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14772,6 +15589,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the instance group is located.", @@ -14845,6 +15667,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where you want to create the instance group.", @@ -14875,7 +15702,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14931,7 +15758,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "instanceGroup": { @@ -14993,7 +15820,7 @@ "id": "compute.instanceGroups.removeInstances", "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances", "httpMethod": "POST", - "description": "Removes one or more instances from the specified instance group, but does not delete those instances.", + "description": "Removes one or more instances from the specified instance group, but does not delete those instances.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration before the VM instance is removed or deleted.", "parameters": { "instanceGroup": { "type": "string", @@ -15008,6 +15835,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the instance group is located.", @@ -15050,6 +15882,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone where the instance group is located.", @@ -15141,6 +15978,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -15201,6 +16043,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -15225,7 +16072,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15333,6 +16180,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -15366,7 +16218,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15411,7 +16263,7 @@ "id": "compute.instances.attachDisk", "path": "{project}/zones/{zone}/instances/{instance}/attachDisk", "httpMethod": "POST", - "description": "Attaches a Disk resource to an instance.", + "description": "Attaches an existing Disk resource to an instance. You must first create the disk before you can attach it. It is not possible to create and attach a disk at the same time. For more information, read Adding a persistent disk to your instance.", "parameters": { "instance": { "type": "string", @@ -15427,6 +16279,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -15471,6 +16328,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -15524,6 +16386,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -15573,6 +16440,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -15707,6 +16579,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -15738,7 +16615,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15795,7 +16672,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "instance": { @@ -15872,6 +16749,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -15926,6 +16808,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -15953,7 +16840,7 @@ "id": "compute.instances.setLabels", "path": "{project}/zones/{zone}/instances/{instance}/setLabels", "httpMethod": "POST", - "description": "Sets labels on an instance. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets labels on an instance. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "instance": { "type": "string", @@ -15969,6 +16856,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16013,6 +16905,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16057,6 +16954,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16101,6 +17003,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16125,6 +17032,55 @@ "https://www.googleapis.com/auth/compute" ] }, + "setMinCpuPlatform": { + "id": "compute.instances.setMinCpuPlatform", + "path": "{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform", + "httpMethod": "POST", + "description": "Changes the minimum CPU platform that this instance should use. This method can only be called on a stopped instance. For more information, read Specifying a Minimum CPU Platform.", + "parameters": { + "instance": { + "type": "string", + "description": "Name of the instance scoping this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, + "zone": { + "type": "string", + "description": "The name of the zone for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "instance" + ], + "request": { + "$ref": "InstancesSetMinCpuPlatformRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "setScheduling": { "id": "compute.instances.setScheduling", "path": "{project}/zones/{zone}/instances/{instance}/setScheduling", @@ -16145,6 +17101,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16189,6 +17150,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16233,6 +17199,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16277,6 +17248,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16318,6 +17294,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16362,6 +17343,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "The name of the zone for this request.", @@ -16436,7 +17422,7 @@ "id": "compute.licenses.get", "path": "{project}/global/licenses/{license}", "httpMethod": "GET", - "description": "Returns the specified License resource. Get a list of available licenses by making a list() request.", + "description": "Returns the specified License resource.", "parameters": { "license": { "type": "string", @@ -16478,7 +17464,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16569,7 +17555,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16641,6 +17627,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -16677,6 +17668,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -16737,6 +17733,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -16761,7 +17762,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16821,6 +17822,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -16857,6 +17863,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -16916,7 +17927,7 @@ "id": "compute.projects.disableXpnHost", "path": "{project}/disableXpnHost", "httpMethod": "POST", - "description": "Disable this project as an XPN host project.", + "description": "Disable this project as a shared VPC host project.", "parameters": { "project": { "type": "string", @@ -16924,6 +17935,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -16941,7 +17957,7 @@ "id": "compute.projects.disableXpnResource", "path": "{project}/disableXpnResource", "httpMethod": "POST", - "description": "Disable an XPN resource associated with this host project.", + "description": "Disable a serivce resource (a.k.a service project) associated with this host project.", "parameters": { "project": { "type": "string", @@ -16949,6 +17965,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -16969,7 +17990,7 @@ "id": "compute.projects.enableXpnHost", "path": "{project}/enableXpnHost", "httpMethod": "POST", - "description": "Enable this project as an XPN host project.", + "description": "Enable this project as a shared VPC host project.", "parameters": { "project": { "type": "string", @@ -16977,6 +17998,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -16994,7 +18020,7 @@ "id": "compute.projects.enableXpnResource", "path": "{project}/enableXpnResource", "httpMethod": "POST", - "description": "Enable XPN resource (a.k.a service project or service folder in the future) for a host project, so that subnetworks in the host project can be used by instances in the service project or folder.", + "description": "Enable service resource (a.k.a service project) for a host project, so that subnets in the host project can be used by instances in the service project.", "parameters": { "project": { "type": "string", @@ -17002,6 +18028,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17048,7 +18079,7 @@ "id": "compute.projects.getXpnHost", "path": "{project}/getXpnHost", "httpMethod": "GET", - "description": "Get the XPN host project that this project links to. May be empty if no link exists.", + "description": "Get the shared VPC host project that this project links to. May be empty if no link exists.", "parameters": { "project": { "type": "string", @@ -17066,15 +18097,14 @@ }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute", - "https://www.googleapis.com/auth/compute.readonly" + "https://www.googleapis.com/auth/compute" ] }, "getXpnResources": { "id": "compute.projects.getXpnResources", "path": "{project}/getXpnResources", "httpMethod": "GET", - "description": "Get XPN resources associated with this host project.", + "description": "Get service resources (a.k.a service project) associated with this host project.", "parameters": { "filter": { "type": "string", @@ -17111,15 +18141,14 @@ }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute", - "https://www.googleapis.com/auth/compute.readonly" + "https://www.googleapis.com/auth/compute" ] }, "listXpnHosts": { "id": "compute.projects.listXpnHosts", "path": "{project}/listXpnHosts", "httpMethod": "POST", - "description": "List all XPN host projects visible to the user in an organization.", + "description": "List all shared VPC host projects visible to the user in an organization.", "parameters": { "filter": { "type": "string", @@ -17159,8 +18188,7 @@ }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute", - "https://www.googleapis.com/auth/compute.readonly" + "https://www.googleapis.com/auth/compute" ] }, "moveDisk": { @@ -17175,6 +18203,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17203,6 +18236,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17231,6 +18269,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17259,6 +18302,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17308,6 +18356,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17384,6 +18437,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17409,7 +18467,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17462,7 +18520,7 @@ "id": "compute.regionAutoscalers.patch", "path": "{project}/regions/{region}/autoscalers", "httpMethod": "PATCH", - "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "autoscaler": { "type": "string", @@ -17483,6 +18541,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17571,6 +18634,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", + "location": "query" } }, "parameterOrder": [ @@ -17618,6 +18686,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17738,6 +18811,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17763,7 +18841,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17816,7 +18894,7 @@ "id": "compute.regionBackendServices.patch", "path": "{project}/regions/{region}/backendServices/{backendService}", "httpMethod": "PATCH", - "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "backendService": { "type": "string", @@ -17838,6 +18916,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17928,6 +19011,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -17958,7 +19046,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18045,7 +19133,7 @@ "id": "compute.regionCommitments.insert", "path": "{project}/regions/{region}/commitments", "httpMethod": "POST", - "description": "Creates an commitment in the specified project using the data included in the request.", + "description": "Creates a commitment in the specified project using the data included in the request.", "parameters": { "project": { "type": "string", @@ -18060,6 +19148,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18085,7 +19178,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18142,7 +19235,7 @@ "id": "compute.regionInstanceGroupManagers.abandonInstances", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", "httpMethod": "POST", - "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -18162,6 +19255,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18204,6 +19302,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18223,7 +19326,7 @@ "id": "compute.regionInstanceGroupManagers.deleteInstances", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", "httpMethod": "POST", - "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -18243,6 +19346,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18319,6 +19427,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18344,7 +19457,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18455,7 +19568,7 @@ "id": "compute.regionInstanceGroupManagers.patch", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", "httpMethod": "PATCH", - "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.", + "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "instanceGroupManager": { "type": "string", @@ -18475,6 +19588,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18498,7 +19616,7 @@ "id": "compute.regionInstanceGroupManagers.recreateInstances", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", "httpMethod": "POST", - "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -18518,6 +19636,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18540,7 +19663,7 @@ "id": "compute.regionInstanceGroupManagers.resize", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize", "httpMethod": "POST", - "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", "parameters": { "instanceGroupManager": { "type": "string", @@ -18561,6 +19684,11 @@ "required": true, "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "size": { "type": "integer", "description": "Number of instances that should exist in this instance group manager.", @@ -18608,6 +19736,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18650,6 +19783,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18692,6 +19830,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18779,6 +19922,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -18849,7 +19997,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18905,7 +20053,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "instanceGroup": { @@ -18987,6 +20135,11 @@ "description": "Name of the region scoping this request.", "required": true, "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -19142,7 +20295,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -19237,7 +20390,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -19290,7 +20443,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -19351,6 +20504,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "router": { "type": "string", "description": "Name of the Router resource to delete.", @@ -19475,6 +20633,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -19500,7 +20663,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -19553,7 +20716,7 @@ "id": "compute.routers.patch", "path": "{project}/regions/{region}/routers/{router}", "httpMethod": "PATCH", - "description": "Patches the specified Router resource with the data included in the request. This method supports patch semantics.", + "description": "Patches the specified Router resource with the data included in the request. This method supports PATCH semantics and uses JSON merge patch format and processing rules.", "parameters": { "project": { "type": "string", @@ -19569,6 +20732,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "router": { "type": "string", "description": "Name of the Router resource to patch.", @@ -19704,6 +20872,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "router": { "type": "string", "description": "Name of the Router resource to update.", @@ -19745,6 +20918,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "route": { "type": "string", "description": "Name of the Route resource to delete.", @@ -19811,6 +20989,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -19835,7 +21018,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -19930,6 +21113,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "snapshot": { "type": "string", "description": "Name of the Snapshot resource to delete.", @@ -19992,7 +21180,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -20037,7 +21225,7 @@ "id": "compute.snapshots.setLabels", "path": "{project}/global/snapshots/{resource}/setLabels", "httpMethod": "POST", - "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling or Tagging Resources documentation.", + "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "project": { "type": "string", @@ -20123,6 +21311,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "sslCertificate": { "type": "string", "description": "Name of the SslCertificate resource to delete.", @@ -20189,6 +21382,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -20213,7 +21411,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -20303,7 +21501,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -20364,6 +21562,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "subnetwork": { "type": "string", "description": "Name of the Subnetwork resource to delete.", @@ -20405,6 +21608,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "subnetwork": { "type": "string", "description": "Name of the Subnetwork resource to update.", @@ -20532,6 +21740,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -20557,7 +21770,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -20654,7 +21867,7 @@ "id": "compute.subnetworks.setPrivateIpGoogleAccess", "path": "{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess", "httpMethod": "POST", - "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Cloudpath.", + "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Private Google Access.", "parameters": { "project": { "type": "string", @@ -20670,6 +21883,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "subnetwork": { "type": "string", "description": "Name of the Subnetwork resource.", @@ -20756,6 +21974,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetHttpProxy": { "type": "string", "description": "Name of the TargetHttpProxy resource to delete.", @@ -20822,6 +22045,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -20846,7 +22074,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -20900,6 +22128,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetHttpProxy": { "type": "string", "description": "Name of the TargetHttpProxy to set a URL map for.", @@ -20977,6 +22210,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetHttpsProxy": { "type": "string", "description": "Name of the TargetHttpsProxy resource to delete.", @@ -21043,6 +22281,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -21067,7 +22310,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -21121,6 +22364,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetHttpsProxy": { "type": "string", "description": "Name of the TargetHttpsProxy resource to set an SslCertificates resource for.", @@ -21157,6 +22405,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetHttpsProxy": { "type": "string", "description": "Name of the TargetHttpsProxy resource whose URL map is to be set.", @@ -21229,7 +22482,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -21283,6 +22536,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetInstance": { "type": "string", "description": "Name of the TargetInstance resource to delete.", @@ -21366,6 +22624,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "zone": { "type": "string", "description": "Name of the zone scoping this request.", @@ -21397,7 +22660,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -21515,6 +22778,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetPool": { "type": "string", "description": "Name of the target pool to add a health check to.", @@ -21559,6 +22827,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetPool": { "type": "string", "description": "Name of the TargetPool resource to add instances to.", @@ -21591,7 +22864,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -21652,6 +22925,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetPool": { "type": "string", "description": "Name of the TargetPool resource to delete.", @@ -21779,6 +23057,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -21804,7 +23087,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -21873,6 +23156,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetPool": { "type": "string", "description": "Name of the target pool to remove health checks from.", @@ -21917,6 +23205,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetPool": { "type": "string", "description": "Name of the TargetPool resource to remove instances from.", @@ -21967,6 +23260,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetPool": { "type": "string", "description": "Name of the TargetPool resource to set a backup pool for.", @@ -22053,6 +23351,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetSslProxy": { "type": "string", "description": "Name of the TargetSslProxy resource to delete.", @@ -22119,6 +23422,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -22143,7 +23451,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -22197,6 +23505,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetSslProxy": { "type": "string", "description": "Name of the TargetSslProxy resource whose BackendService resource is to be set.", @@ -22233,6 +23546,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetSslProxy": { "type": "string", "description": "Name of the TargetSslProxy resource whose ProxyHeader is to be set.", @@ -22269,6 +23587,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetSslProxy": { "type": "string", "description": "Name of the TargetSslProxy resource whose SslCertificate resource is to be set.", @@ -22346,6 +23669,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetTcpProxy": { "type": "string", "description": "Name of the TargetTcpProxy resource to delete.", @@ -22412,6 +23740,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -22436,7 +23769,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -22490,6 +23823,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetTcpProxy": { "type": "string", "description": "Name of the TargetTcpProxy resource whose BackendService resource is to be set.", @@ -22526,6 +23864,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetTcpProxy": { "type": "string", "description": "Name of the TargetTcpProxy resource whose ProxyHeader is to be set.", @@ -22561,7 +23904,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -22622,6 +23965,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "targetVpnGateway": { "type": "string", "description": "Name of the target VPN gateway to delete.", @@ -22704,6 +24052,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -22729,7 +24082,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -22840,6 +24193,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "urlMap": { "type": "string", "description": "Name of the UrlMap resource to delete.", @@ -22906,6 +24264,11 @@ "required": true, "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -22935,6 +24298,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "urlMap": { "type": "string", "description": "Name of the UrlMap scoping this request.", @@ -22966,7 +24334,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -23011,7 +24379,7 @@ "id": "compute.urlMaps.patch", "path": "{project}/global/urlMaps/{urlMap}", "httpMethod": "PATCH", - "description": "Patches the specified UrlMap resource with the data included in the request. This method supports patch semantics.", + "description": "Patches the specified UrlMap resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "project": { "type": "string", @@ -23020,6 +24388,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "urlMap": { "type": "string", "description": "Name of the UrlMap resource to patch.", @@ -23094,6 +24467,11 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "urlMap": { "type": "string", "description": "Name of the UrlMap resource to update.", @@ -23165,7 +24543,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -23226,6 +24604,11 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" + }, "vpnTunnel": { "type": "string", "description": "Name of the VpnTunnel resource to delete.", @@ -23308,6 +24691,11 @@ "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" + }, + "requestId": { + "type": "string", + "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + "location": "query" } }, "parameterOrder": [ @@ -23333,7 +24721,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -23519,7 +24907,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -23614,7 +25002,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { diff --git a/vendor/google.golang.org/api/compute/v0.beta/compute-gen.go b/vendor/google.golang.org/api/compute/v0.beta/compute-gen.go index 57d49139b4614..2e9cc07ed49d9 100644 --- a/vendor/google.golang.org/api/compute/v0.beta/compute-gen.go +++ b/vendor/google.golang.org/api/compute/v0.beta/compute-gen.go @@ -752,11 +752,11 @@ func (s *AcceleratorType) MarshalJSON() ([]byte, error) { } type AcceleratorTypeAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped accelerator type lists. + // Items: A list of AcceleratorTypesScopedList resources. Items map[string]AcceleratorTypesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -815,8 +815,12 @@ type AcceleratorTypeList struct { // compute#acceleratorTypeList for lists of accelerator types. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -1032,6 +1036,15 @@ type Address struct { // Address: The static external IP address represented by this resource. Address string `json:"address,omitempty"` + // AddressType: The type of address to reserve. If unspecified, defaults + // to EXTERNAL. + // + // Possible values: + // "EXTERNAL" + // "INTERNAL" + // "UNSPECIFIED_TYPE" + AddressType string `json:"addressType,omitempty"` + // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text // format. CreationTimestamp string `json:"creationTimestamp,omitempty"` @@ -1058,6 +1071,22 @@ type Address struct { // addresses. Kind string `json:"kind,omitempty"` + // LabelFingerprint: A fingerprint for the labels being applied to this + // Address, which is essentially a hash of the labels set used for + // optimistic locking. The fingerprint is initially generated by Compute + // Engine and changes after every request to modify or update labels. + // You must always provide an up-to-date fingerprint hash in order to + // update or change labels. + // + // To see the latest fingerprint, make a get() request to retrieve an + // Address. + LabelFingerprint string `json:"labelFingerprint,omitempty"` + + // Labels: Labels to apply to this Address resource. These can be later + // modified by the setLabels method. Each label key/value must comply + // with RFC1035. Label values may be empty. + Labels map[string]string `json:"labels,omitempty"` + // Name: Name of the resource. Provided by the client when the resource // is created. The name must be 1-63 characters long, and comply with // RFC1035. Specifically, the name must be 1-63 characters long and @@ -1084,6 +1113,13 @@ type Address struct { // "RESERVED" Status string `json:"status,omitempty"` + // Subnetwork: For external addresses, this field should not be + // used. + // + // The URL of the subnetwork in which to reserve the address. If an IP + // address is specified, it must be within the subnetwork's IP range. + Subnetwork string `json:"subnetwork,omitempty"` + // Users: [Output Only] The URLs of the resources that are using this // address. Users []string `json:"users,omitempty"` @@ -1120,7 +1156,7 @@ type AddressAggregatedList struct { // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped address lists. + // Items: A list of AddressesScopedList resources. Items map[string]AddressesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -1167,11 +1203,11 @@ func (s *AddressAggregatedList) MarshalJSON() ([]byte, error) { // AddressList: Contains a list of addresses. type AddressList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of addresses. + // Items: A list of Address resources. Items []*Address `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#addressList for @@ -1186,7 +1222,7 @@ type AddressList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -1724,6 +1760,43 @@ func (s *AuditLogConfig) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// AuthorizationLoggingOptions: Authorization-related information used +// by Cloud Audit Logging. +type AuthorizationLoggingOptions struct { + // PermissionType: The type of the permission that was checked. + // + // Possible values: + // "ADMIN_READ" + // "ADMIN_WRITE" + // "DATA_READ" + // "DATA_WRITE" + // "PERMISSION_TYPE_UNSPECIFIED" + PermissionType string `json:"permissionType,omitempty"` + + // ForceSendFields is a list of field names (e.g. "PermissionType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "PermissionType") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *AuthorizationLoggingOptions) MarshalJSON() ([]byte, error) { + type noMethod AuthorizationLoggingOptions + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Autoscaler: Represents an Autoscaler resource. Autoscalers allow you // to automatically scale virtual machine instances in managed instance // groups according to an autoscaling policy that you define. For more @@ -1821,11 +1894,11 @@ func (s *Autoscaler) MarshalJSON() ([]byte, error) { } type AutoscalerAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped autoscaler lists. + // Items: A list of AutoscalersScopedList resources. Items map[string]AutoscalersScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -1872,8 +1945,8 @@ func (s *AutoscalerAggregatedList) MarshalJSON() ([]byte, error) { // AutoscalerList: Contains a list of Autoscaler resources. type AutoscalerList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of Autoscaler resources. @@ -1938,9 +2011,11 @@ type AutoscalerStatusDetails struct { // "MISSING_LOAD_BALANCING_DATA_POINTS" // "MORE_THAN_ONE_BACKEND_SERVICE" // "NOT_ENOUGH_QUOTA_AVAILABLE" + // "REGION_RESOURCE_STOCKOUT" // "SCALING_TARGET_DOES_NOT_EXIST" // "UNKNOWN" // "UNSUPPORTED_MAX_RATE_LOAD_BALANCING_CONFIGURATION" + // "ZONE_RESOURCE_STOCKOUT" Type string `json:"type,omitempty"` // ForceSendFields is a list of field names (e.g. "Message") to @@ -2216,27 +2291,73 @@ func (s *AutoscalingPolicyCpuUtilization) UnmarshalJSON(data []byte) error { // AutoscalingPolicyCustomMetricUtilization: Custom utilization metric // policy. type AutoscalingPolicyCustomMetricUtilization struct { - // Metric: The identifier of the Stackdriver Monitoring metric. The - // metric cannot have negative values and should be a utilization + // Filter: A filter string, compatible with a Stackdriver Monitoring + // filter string for TimeSeries.list API call. This filter is used to + // select a specific TimeSeries for the purpose of autoscaling and to + // determine whether the metric is exporting per-instance or global + // data. + // + // For the filter to be valid for autoscaling purposes, the following + // rules apply: + // - You can only use the AND operator for joining selectors. + // - You can only use direct equality comparison operator (=) without + // any functions for each selector. + // - You can specify the metric in both the filter string and in the + // metric field. However, if specified in both places, the metric must + // be identical. + // - The monitored resource type determines what kind of values are + // expected for the metric. If it is a gce_instance, the autoscaler + // expects the metric to include a separate TimeSeries for each instance + // in a group. In such a case, you cannot filter on resource labels. + // If the resource type is any other value, the autoscaler expects this + // metric to contain values that apply to the entire autoscaled instance + // group and resource label filtering can be performed to point + // autoscaler at the correct TimeSeries to scale upon. This is / called + // a global metric for the purpose of autoscaling. + // + // If not specified, the type defaults to gce_instance. + // + // You should provide a filter that is selective enough to pick just one + // TimeSeries for the autoscaled group or for each of the instances (if + // you are using gce_instance resource type). If multiple TimeSeries are + // returned upon the query execution, the autoscaler will sum their + // respective values to obtain its scaling value. + Filter string `json:"filter,omitempty"` + + // Metric: The identifier (type) of the Stackdriver Monitoring metric. + // The metric cannot have negative values and should be a utilization // metric, which means that the number of virtual machines handling - // requests should increase or decrease proportionally to the metric. - // The metric must also have a label of - // compute.googleapis.com/resource_id with the value of the instance's - // unique ID, although this alone does not guarantee that the metric is - // valid. + // requests should increase or decrease proportionally to the + // metric. // - // For example, the following is a valid - // metric: - // compute.googleapis.com/instance/network/received_bytes_count - // T - // he following is not a valid metric because it does not increase or - // decrease based on - // usage: - // compute.googleapis.com/instance/cpu/reserved_cores + // The metric must have a value type of INT64 or DOUBLE. Metric string `json:"metric,omitempty"` - // UtilizationTarget: Target value of the metric which autoscaler should - // maintain. Must be a positive value. + // SingleInstanceAssignment: If scaling is based on a global metric + // value that represents the total amount of work to be done or resource + // usage, set this value to an amount assigned for a single instance of + // the scaled group. Autoscaler will keep the number of instances + // proportional to the value of this metric, the metric itself should + // not change value due to group resizing. + // + // A good metric to use with the target is for example + // pubsub.googleapis.com/subscription/num_undelivered_messages or a + // custom metric exporting the total number of requests coming to your + // instances. + // + // A bad example would be a metric exporting an average or median + // latency, since this value can't include a chunk assignable to a + // single instance, it could be better used with utilization_target + // instead. + SingleInstanceAssignment float64 `json:"singleInstanceAssignment,omitempty"` + + // UtilizationTarget: The target value of the metric that autoscaler + // should maintain. This must be a positive value. + // + // For example, a good metric to use as a utilization_target is + // compute.googleapis.com/instance/network/received_bytes_count. The + // autoscaler will work to keep this value constant for each of the + // instances. UtilizationTarget float64 `json:"utilizationTarget,omitempty"` // UtilizationTargetType: Defines how target utilization value is @@ -2250,7 +2371,7 @@ type AutoscalingPolicyCustomMetricUtilization struct { // "GAUGE" UtilizationTargetType string `json:"utilizationTargetType,omitempty"` - // ForceSendFields is a list of field names (e.g. "Metric") to + // ForceSendFields is a list of field names (e.g. "Filter") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the @@ -2258,7 +2379,7 @@ type AutoscalingPolicyCustomMetricUtilization struct { // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "Metric") to include in API + // NullFields is a list of field names (e.g. "Filter") to include in API // requests with the JSON null value. By default, fields with empty // values are omitted from API requests. However, any field with an // empty value appearing in NullFields will be sent to the server as @@ -2276,13 +2397,15 @@ func (s *AutoscalingPolicyCustomMetricUtilization) MarshalJSON() ([]byte, error) func (s *AutoscalingPolicyCustomMetricUtilization) UnmarshalJSON(data []byte) error { type noMethod AutoscalingPolicyCustomMetricUtilization var s1 struct { - UtilizationTarget gensupport.JSONFloat64 `json:"utilizationTarget"` + SingleInstanceAssignment gensupport.JSONFloat64 `json:"singleInstanceAssignment"` + UtilizationTarget gensupport.JSONFloat64 `json:"utilizationTarget"` *noMethod } s1.noMethod = (*noMethod)(s) if err := json.Unmarshal(data, &s1); err != nil { return err } + s.SingleInstanceAssignment = float64(s1.SingleInstanceAssignment) s.UtilizationTarget = float64(s1.UtilizationTarget) return nil } @@ -2341,7 +2464,8 @@ type Backend struct { // Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for // TCP/SSL). // - // This cannot be used for internal load balancing. + // For Internal Load Balancing, the default and only supported mode is + // CONNECTION. // // Possible values: // "CONNECTION" @@ -2363,8 +2487,8 @@ type Backend struct { // property when you create the resource. Description string `json:"description,omitempty"` - // Group: The fully-qualified URL of a zonal Instance Group resource. - // This instance group defines the list of instances that serve traffic. + // Group: The fully-qualified URL of a Instance Group resource. This + // instance group defines the list of instances that serve traffic. // Member virtual machine instances from each instance group must live // in the same zone as the instance group itself. No two backends in a // backend service are allowed to use same Instance Group @@ -2374,8 +2498,7 @@ type Backend struct { // fully-qualified URL, rather than a partial URL. // // When the BackendService has load balancing scheme INTERNAL, the - // instance group must be in a zone within the same region as the - // BackendService. + // instance group must be within the same region as the BackendService. Group string `json:"group,omitempty"` // MaxConnections: The max number of simultaneous connections for the @@ -2534,8 +2657,12 @@ type BackendBucketList struct { // Kind: Type of resource. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -2609,7 +2736,8 @@ type BackendService struct { // HealthChecks: The list of URLs to the HttpHealthCheck or // HttpsHealthCheck resource for health checking this BackendService. // Currently at most one health check can be specified, and a health - // check is required. + // check is required for GCE backend services. A health check must not + // be specified for GAE app backend and Cloud Function backend. // // For internal load balancing, a URL to a HealthCheck resource must be // specified instead. @@ -2737,14 +2865,18 @@ type BackendServiceAggregatedList struct { // server. Id string `json:"id,omitempty"` - // Items: A map of scoped BackendService lists. + // Items: A list of BackendServicesScopedList resources. Items map[string]BackendServicesScopedList `json:"items,omitempty"` // Kind: Type of resource. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -2849,6 +2981,8 @@ type BackendServiceIAP struct { Oauth2ClientSecret string `json:"oauth2ClientSecret,omitempty"` + // Oauth2ClientSecretSha256: [Output Only] SHA256 hash value for the + // field oauth2_client_secret above. Oauth2ClientSecretSha256 string `json:"oauth2ClientSecretSha256,omitempty"` // ForceSendFields is a list of field names (e.g. "Enabled") to @@ -3055,6 +3189,12 @@ func (s *BackendServicesScopedListWarningData) MarshalJSON() ([]byte, error) { // Binding: Associates `members` with a `role`. type Binding struct { + // Condition: The condition that is associated with this binding. NOTE: + // an unsatisfied condition will not allow user access via current + // binding. Different bindings, including their conditions, are examined + // independently. This field is GOOGLE_INTERNAL. + Condition *Expr `json:"condition,omitempty"` + // Members: Specifies the identities requesting access for a Cloud // Platform resource. `members` can have the following values: // @@ -3078,6 +3218,8 @@ type Binding struct { // * `group:{emailid}`: An email address that represents a Google group. // For example, `admins@example.com`. // + // + // // * `domain:{domain}`: A Google Apps domain name that represents all // the users of that domain. For example, `google.com` or `example.com`. Members []string `json:"members,omitempty"` @@ -3086,7 +3228,7 @@ type Binding struct { // `roles/viewer`, `roles/editor`, or `roles/owner`. Role string `json:"role,omitempty"` - // ForceSendFields is a list of field names (e.g. "Members") to + // ForceSendFields is a list of field names (e.g. "Condition") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the @@ -3094,7 +3236,7 @@ type Binding struct { // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "Members") to include in + // NullFields is a list of field names (e.g. "Condition") to include in // API requests with the JSON null value. By default, fields with empty // values are omitted from API requests. However, any field with an // empty value appearing in NullFields will be sent to the server as @@ -3192,10 +3334,16 @@ func (s *CacheKeyPolicy) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } -// Commitment: A usage-commitment with a start / end time. Users create -// commitments for particular resources (e.g. memory). Actual usage is -// first deducted from available commitments made prior, perhaps at a -// reduced price (as laid out in the commitment). +// Commitment: Represents a Commitment resource. Creating a Commitment +// resource means that you are purchasing a committed use contract with +// an explicit start and end time. You can create commitments based on +// vCPUs and memory usage and receive discounted rates. For full +// details, read Signing Up for Committed Use Discounts. +// +// Committed use discounts are subject to Google Cloud Platform's +// Service Specific Terms. By purchasing a committed use discount, you +// agree to these terms. Committed use discounts will not renew, so you +// must purchase a new commitment to continue receiving discounts. type Commitment struct { // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text // format. @@ -3252,7 +3400,7 @@ type Commitment struct { StartTimestamp string `json:"startTimestamp,omitempty"` // Status: [Output Only] Status of the commitment with regards to - // eventual expiration (each commitment has an end-date defined). One of + // eventual expiration (each commitment has an end date defined). One of // the following values: NOT_YET_ACTIVE, ACTIVE, EXPIRED. // // Possible values: @@ -3295,11 +3443,11 @@ func (s *Commitment) MarshalJSON() ([]byte, error) { } type CommitmentAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: Commitments by scope. + // Items: A list of CommitmentsScopedList resources. Items map[string]CommitmentsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -3346,8 +3494,8 @@ func (s *CommitmentAggregatedList) MarshalJSON() ([]byte, error) { // CommitmentList: Contains a list of Commitment resources. type CommitmentList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of Commitment resources. @@ -3848,7 +3996,8 @@ type Disk struct { // // If you specify this field along with sourceImage or sourceSnapshot, // the value of sizeGb must not be less than the size of the sourceImage - // or the size of the snapshot. + // or the size of the snapshot. Acceptable values are 1 to 65536, + // inclusive. SizeGb int64 `json:"sizeGb,omitempty,string"` // SourceImage: The source image used to create this disk. If the source @@ -3970,11 +4119,11 @@ func (s *Disk) MarshalJSON() ([]byte, error) { } type DiskAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped disk lists. + // Items: A list of DisksScopedList resources. Items map[string]DisksScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -3986,8 +4135,7 @@ type DiskAggregatedList struct { // than maxResults, use the nextPageToken as a value for the query // parameter pageToken in the next list request. Subsequent list // requests will have their own nextPageToken to continue paging through - // the results. Acceptable values are 0 to 500, inclusive. (Default: - // 500) + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -4033,164 +4181,165 @@ type DiskList struct { // lists of disks. Kind string `json:"kind,omitempty"` - // NextPageToken: This token allows you to get the next page of results - // for list requests. If the number of results is larger than - // maxResults, use the nextPageToken as a value for the query parameter - // pageToken in the next list request. Subsequent list requests will - // have their own nextPageToken to continue paging through the results. - NextPageToken string `json:"nextPageToken,omitempty"` - - // SelfLink: [Output Only] Server-defined URL for this resource. - SelfLink string `json:"selfLink,omitempty"` - - // ServerResponse contains the HTTP response code and headers from the - // server. - googleapi.ServerResponse `json:"-"` - - // ForceSendFields is a list of field names (e.g. "Id") to - // unconditionally include in API requests. By default, fields with - // empty values are omitted from API requests. However, any non-pointer, - // non-interface field appearing in ForceSendFields will be sent to the - // server regardless of whether the field is empty or not. This may be - // used to include empty fields in Patch requests. - ForceSendFields []string `json:"-"` - - // NullFields is a list of field names (e.g. "Id") to include in API - // requests with the JSON null value. By default, fields with empty - // values are omitted from API requests. However, any field with an - // empty value appearing in NullFields will be sent to the server as - // null. It is an error if a field in this list has a non-empty value. - // This may be used to include null fields in Patch requests. - NullFields []string `json:"-"` -} - -func (s *DiskList) MarshalJSON() ([]byte, error) { - type noMethod DiskList - raw := noMethod(*s) - return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) -} - -type DiskMoveRequest struct { - // DestinationZone: The URL of the destination zone to move the disk. - // This can be a full or partial URL. For example, the following are all - // valid URLs to a zone: - // - https://www.googleapis.com/compute/v1/projects/project/zones/zone - // - // - projects/project/zones/zone - // - zones/zone - DestinationZone string `json:"destinationZone,omitempty"` - - // TargetDisk: The URL of the target disk to move. This can be a full or - // partial URL. For example, the following are all valid URLs to a disk: - // - // - - // https://www.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk - // - projects/project/zones/zone/disks/disk - // - zones/zone/disks/disk - TargetDisk string `json:"targetDisk,omitempty"` - - // ForceSendFields is a list of field names (e.g. "DestinationZone") to - // unconditionally include in API requests. By default, fields with - // empty values are omitted from API requests. However, any non-pointer, - // non-interface field appearing in ForceSendFields will be sent to the - // server regardless of whether the field is empty or not. This may be - // used to include empty fields in Patch requests. - ForceSendFields []string `json:"-"` - - // NullFields is a list of field names (e.g. "DestinationZone") to - // include in API requests with the JSON null value. By default, fields - // with empty values are omitted from API requests. However, any field - // with an empty value appearing in NullFields will be sent to the - // server as null. It is an error if a field in this list has a - // non-empty value. This may be used to include null fields in Patch - // requests. - NullFields []string `json:"-"` -} - -func (s *DiskMoveRequest) MarshalJSON() ([]byte, error) { - type noMethod DiskMoveRequest - raw := noMethod(*s) - return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) -} - -// DiskType: A DiskType resource. -type DiskType struct { - // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text - // format. - CreationTimestamp string `json:"creationTimestamp,omitempty"` - - // DefaultDiskSizeGb: [Output Only] Server-defined default disk size in - // GB. - DefaultDiskSizeGb int64 `json:"defaultDiskSizeGb,omitempty,string"` - - // Deprecated: [Output Only] The deprecation status associated with this - // disk type. - Deprecated *DeprecationStatus `json:"deprecated,omitempty"` - - // Description: [Output Only] An optional description of this resource. - Description string `json:"description,omitempty"` - - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. - Id uint64 `json:"id,omitempty,string"` - - // Kind: [Output Only] Type of the resource. Always compute#diskType for - // disk types. - Kind string `json:"kind,omitempty"` - - // Name: [Output Only] Name of the resource. - Name string `json:"name,omitempty"` - - // SelfLink: [Output Only] Server-defined URL for the resource. - SelfLink string `json:"selfLink,omitempty"` - - // ValidDiskSize: [Output Only] An optional textual description of the - // valid disk size, such as "10GB-10TB". - ValidDiskSize string `json:"validDiskSize,omitempty"` - - // Zone: [Output Only] URL of the zone where the disk type resides. - Zone string `json:"zone,omitempty"` - - // ServerResponse contains the HTTP response code and headers from the - // server. - googleapi.ServerResponse `json:"-"` - - // ForceSendFields is a list of field names (e.g. "CreationTimestamp") - // to unconditionally include in API requests. By default, fields with - // empty values are omitted from API requests. However, any non-pointer, - // non-interface field appearing in ForceSendFields will be sent to the - // server regardless of whether the field is empty or not. This may be - // used to include empty fields in Patch requests. - ForceSendFields []string `json:"-"` - - // NullFields is a list of field names (e.g. "CreationTimestamp") to - // include in API requests with the JSON null value. By default, fields - // with empty values are omitted from API requests. However, any field - // with an empty value appearing in NullFields will be sent to the - // server as null. It is an error if a field in this list has a - // non-empty value. This may be used to include null fields in Patch - // requests. - NullFields []string `json:"-"` -} - -func (s *DiskType) MarshalJSON() ([]byte, error) { - type noMethod DiskType - raw := noMethod(*s) - return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) -} - -type DiskTypeAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. - Id string `json:"id,omitempty"` - - // Items: [Output Only] A map of scoped disk type lists. - Items map[string]DiskTypesScopedList `json:"items,omitempty"` - - // Kind: [Output Only] Type of resource. Always - // compute#diskTypeAggregatedList. - Kind string `json:"kind,omitempty"` - + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *DiskList) MarshalJSON() ([]byte, error) { + type noMethod DiskList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type DiskMoveRequest struct { + // DestinationZone: The URL of the destination zone to move the disk. + // This can be a full or partial URL. For example, the following are all + // valid URLs to a zone: + // - https://www.googleapis.com/compute/v1/projects/project/zones/zone + // + // - projects/project/zones/zone + // - zones/zone + DestinationZone string `json:"destinationZone,omitempty"` + + // TargetDisk: The URL of the target disk to move. This can be a full or + // partial URL. For example, the following are all valid URLs to a disk: + // + // - + // https://www.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk + // - projects/project/zones/zone/disks/disk + // - zones/zone/disks/disk + TargetDisk string `json:"targetDisk,omitempty"` + + // ForceSendFields is a list of field names (e.g. "DestinationZone") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "DestinationZone") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *DiskMoveRequest) MarshalJSON() ([]byte, error) { + type noMethod DiskMoveRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// DiskType: A DiskType resource. +type DiskType struct { + // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text + // format. + CreationTimestamp string `json:"creationTimestamp,omitempty"` + + // DefaultDiskSizeGb: [Output Only] Server-defined default disk size in + // GB. + DefaultDiskSizeGb int64 `json:"defaultDiskSizeGb,omitempty,string"` + + // Deprecated: [Output Only] The deprecation status associated with this + // disk type. + Deprecated *DeprecationStatus `json:"deprecated,omitempty"` + + // Description: [Output Only] An optional description of this resource. + Description string `json:"description,omitempty"` + + // Id: [Output Only] The unique identifier for the resource. This + // identifier is defined by the server. + Id uint64 `json:"id,omitempty,string"` + + // Kind: [Output Only] Type of the resource. Always compute#diskType for + // disk types. + Kind string `json:"kind,omitempty"` + + // Name: [Output Only] Name of the resource. + Name string `json:"name,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for the resource. + SelfLink string `json:"selfLink,omitempty"` + + // ValidDiskSize: [Output Only] An optional textual description of the + // valid disk size, such as "10GB-10TB". + ValidDiskSize string `json:"validDiskSize,omitempty"` + + // Zone: [Output Only] URL of the zone where the disk type resides. + Zone string `json:"zone,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "CreationTimestamp") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CreationTimestamp") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *DiskType) MarshalJSON() ([]byte, error) { + type noMethod DiskType + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type DiskTypeAggregatedList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. + Id string `json:"id,omitempty"` + + // Items: A list of DiskTypesScopedList resources. + Items map[string]DiskTypesScopedList `json:"items,omitempty"` + + // Kind: [Output Only] Type of resource. Always + // compute#diskTypeAggregatedList. + Kind string `json:"kind,omitempty"` + // NextPageToken: [Output Only] This token allows you to get the next // page of results for list requests. If the number of results is larger // than maxResults, use the nextPageToken as a value for the query @@ -4231,11 +4380,11 @@ func (s *DiskTypeAggregatedList) MarshalJSON() ([]byte, error) { // DiskTypeList: Contains a list of disk types. type DiskTypeList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Disk Type resources. + // Items: A list of DiskType resources. Items []*DiskType `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#diskTypeList for @@ -4562,6 +4711,56 @@ func (s *DisksScopedListWarningData) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// Expr: Represents an expression text. Example: +// +// title: "User account presence" description: "Determines whether the +// request has a user account" expression: "size(request.user) > 0" +type Expr struct { + // Description: An optional description of the expression. This is a + // longer text which describes the expression, e.g. when hovered over it + // in a UI. + Description string `json:"description,omitempty"` + + // Expression: Textual representation of an expression in Common + // Expression Language syntax. + // + // The application context of the containing message determines which + // well-known feature set of CEL is supported. + Expression string `json:"expression,omitempty"` + + // Location: An optional string indicating the location of the + // expression for error reporting, e.g. a file name and a position in + // the file. + Location string `json:"location,omitempty"` + + // Title: An optional title for the expression, i.e. a short string + // describing its purpose. This can be used e.g. in UIs which allow to + // enter the expression. + Title string `json:"title,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Description") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Description") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *Expr) MarshalJSON() ([]byte, error) { + type noMethod Expr + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Firewall: Represents a Firewall resource. type Firewall struct { // Allowed: The list of ALLOW rules specified by this firewall. Each @@ -4602,7 +4801,7 @@ type Firewall struct { // identifier is defined by the server. Id uint64 `json:"id,omitempty,string"` - // Kind: [Output Ony] Type of the resource. Always compute#firewall for + // Kind: [Output Only] Type of the resource. Always compute#firewall for // firewall rules. Kind string `json:"kind,omitempty"` @@ -4649,17 +4848,42 @@ type Firewall struct { // the firewall to apply. Only IPv4 is supported. SourceRanges []string `json:"sourceRanges,omitempty"` - // SourceTags: If source tags are specified, the firewall will apply - // only to traffic with source IP that belongs to a tag listed in source - // tags. Source tags cannot be used to control traffic to an instance's - // external IP address. Because tags are associated with an instance, - // not an IP address. One or both of sourceRanges and sourceTags may be - // set. If both properties are set, the firewall will apply to traffic - // that has source IP address within sourceRanges OR the source IP that - // belongs to a tag listed in the sourceTags property. The connection + // SourceServiceAccounts: If source service accounts are specified, the + // firewall will apply only to traffic originating from an instance with + // a service account in this list. Source service accounts cannot be + // used to control traffic to an instance's external IP address because + // service accounts are associated with an instance, not an IP address. + // sourceRanges can be set at the same time as sourceServiceAccounts. If + // both are set, the firewall will apply to traffic that has source IP + // address within sourceRanges OR the source IP belongs to an instance + // with service account listed in sourceServiceAccount. The connection // does not need to match both properties for the firewall to apply. + // sourceServiceAccounts cannot be used at the same time as sourceTags + // or targetTags. + SourceServiceAccounts []string `json:"sourceServiceAccounts,omitempty"` + + // SourceTags: If source tags are specified, the firewall rule applies + // only to traffic with source IPs that match the primary network + // interfaces of VM instances that have the tag and are in the same VPC + // network. Source tags cannot be used to control traffic to an + // instance's external IP address, it only applies to traffic between + // instances in the same virtual network. Because tags are associated + // with instances, not IP addresses. One or both of sourceRanges and + // sourceTags may be set. If both properties are set, the firewall will + // apply to traffic that has source IP address within sourceRanges OR + // the source IP that belongs to a tag listed in the sourceTags + // property. The connection does not need to match both properties for + // the firewall to apply. SourceTags []string `json:"sourceTags,omitempty"` + // TargetServiceAccounts: A list of service accounts indicating sets of + // instances located in the network that may make network connections as + // specified in allowed[]. targetServiceAccounts cannot be used at the + // same time as targetTags or sourceTags. If neither + // targetServiceAccounts nor targetTags are specified, the firewall rule + // applies to all instances on the specified network. + TargetServiceAccounts []string `json:"targetServiceAccounts,omitempty"` + // TargetTags: A list of instance tags indicating sets of instances // located in the network that may make network connections as specified // in allowed[]. If no targetTags are specified, the firewall rule @@ -4697,7 +4921,7 @@ type FirewallAllowed struct { // IPProtocol: The IP protocol to which this rule applies. The protocol // type is required when creating a firewall rule. This value can either // be one of the following well known protocol strings (tcp, udp, icmp, - // esp, ah, sctp), or the IP protocol number. + // esp, ah, ipip, sctp), or the IP protocol number. IPProtocol string `json:"IPProtocol,omitempty"` // Ports: An optional list of ports to which this rule applies. This @@ -4735,7 +4959,7 @@ type FirewallDenied struct { // IPProtocol: The IP protocol to which this rule applies. The protocol // type is required when creating a firewall rule. This value can either // be one of the following well known protocol strings (tcp, udp, icmp, - // esp, ah, sctp), or the IP protocol number. + // esp, ah, ipip, sctp), or the IP protocol number. IPProtocol string `json:"IPProtocol,omitempty"` // Ports: An optional list of ports to which this rule applies. This @@ -4771,11 +4995,11 @@ func (s *FirewallDenied) MarshalJSON() ([]byte, error) { // FirewallList: Contains a list of firewalls. type FirewallList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Firewall resources. + // Items: A list of Firewall resources. Items []*Firewall `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#firewallList for @@ -4820,6 +5044,43 @@ func (s *FirewallList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// FixedOrPercent: Encapsulates numeric value that can be either +// absolute or relative. +type FixedOrPercent struct { + // Calculated: [Output Only] Absolute value calculated based on mode: + // mode = fixed -> calculated = fixed = percent -> calculated = + // ceiling(percent/100 * base_value) + Calculated int64 `json:"calculated,omitempty"` + + // Fixed: fixed must be non-negative. + Fixed int64 `json:"fixed,omitempty"` + + // Percent: percent must belong to [0, 100]. + Percent int64 `json:"percent,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Calculated") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Calculated") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *FixedOrPercent) MarshalJSON() ([]byte, error) { + type noMethod FixedOrPercent + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // ForwardingRule: A ForwardingRule resource. A ForwardingRule resource // specifies which pool of target virtual machines to forward a packet // to if it matches the given [IPAddress, IPProtocol, ports] tuple. @@ -4830,15 +5091,16 @@ type ForwardingRule struct { // For global forwarding rules, the address must be a global IP. For // regional forwarding rules, the address must live in the same region // as the forwarding rule. By default, this field is empty and an - // ephemeral IP from the same scope (global or regional) will be - // assigned. + // ephemeral IPv4 address from the same scope (global or regional) will + // be assigned. A regional forwarding rule supports IPv4 only. A global + // forwarding rule supports either IPv4 or IPv6. // // When the load balancing scheme is INTERNAL, this can only be an RFC // 1918 IP address belonging to the network/subnetwork configured for // the forwarding rule. A reserved address cannot be used. If the field // is empty, the IP address will be automatically allocated from the // internal IP range of the subnetwork or network configured for this - // forwarding rule. Only IPv4 is supported. + // forwarding rule. IPAddress string `json:"IPAddress,omitempty"` // IPProtocol: The IP protocol to which this rule applies. Valid options @@ -4889,6 +5151,22 @@ type ForwardingRule struct { // compute#forwardingRule for Forwarding Rule resources. Kind string `json:"kind,omitempty"` + // LabelFingerprint: A fingerprint for the labels being applied to this + // resource, which is essentially a hash of the labels set used for + // optimistic locking. The fingerprint is initially generated by Compute + // Engine and changes after every request to modify or update labels. + // You must always provide an up-to-date fingerprint hash in order to + // update or change labels. + // + // To see the latest fingerprint, make a get() request to retrieve a + // ForwardingRule. + LabelFingerprint string `json:"labelFingerprint,omitempty"` + + // Labels: Labels to apply to this resource. These can be later modified + // by the setLabels method. Each label key/value pair must comply with + // RFC1035. Label values may be empty. + Labels map[string]string `json:"labels,omitempty"` + // LoadBalancingScheme: This signifies what the ForwardingRule will be // used for and can only take the following values: INTERNAL, EXTERNAL // The value of INTERNAL means that this will be used for Internal @@ -4931,7 +5209,10 @@ type ForwardingRule struct { // ports: // - TargetHttpProxy: 80, 8080 // - TargetHttpsProxy: 443 - // - TargetSslProxy: 443 + // - TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, + // 995, 1883, 5222 + // - TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, + // 995, 1883, 5222 // - TargetVpnGateway: 500, 4500 // - PortRange string `json:"portRange,omitempty"` @@ -5023,11 +5304,11 @@ func (s *ForwardingRule) MarshalJSON() ([]byte, error) { } type ForwardingRuleAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped forwarding rule lists. + // Items: A list of ForwardingRulesScopedList resources. Items map[string]ForwardingRulesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -5074,7 +5355,7 @@ func (s *ForwardingRuleAggregatedList) MarshalJSON() ([]byte, error) { // ForwardingRuleList: Contains a list of ForwardingRule resources. type ForwardingRuleList struct { - // Id: [Output Only] Unique identifier for the resource. Set by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -5295,7 +5576,7 @@ func (s *GlobalSetLabelsRequest) MarshalJSON() ([]byte, error) { // GuestOsFeature: Guest OS features. type GuestOsFeature struct { - // Type: The type of supported feature. Currenty only + // Type: The type of supported feature. Currently only // VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the // server might also populate this property with the value WINDOWS to // indicate that this is a Windows image. This value is purely @@ -5534,8 +5815,8 @@ func (s *HealthCheck) MarshalJSON() ([]byte, error) { // HealthCheckList: Contains a list of HealthCheck resources. type HealthCheckList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of HealthCheck resources. @@ -5787,7 +6068,7 @@ func (s *HttpHealthCheck) MarshalJSON() ([]byte, error) { // HttpHealthCheckList: Contains a list of HttpHealthCheck resources. type HttpHealthCheckList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -6005,11 +6286,11 @@ type Image struct { // GuestOsFeatures: A list of features to enable on the guest OS. // Applicable for bootable images only. Currently, only one feature can - // be enabled, VIRTIO_SCSCI_MULTIQUEUE, which allows each virtual CPU to + // be enabled, VIRTIO_SCSI_MULTIQUEUE, which allows each virtual CPU to // have its own queue. For Windows images, you can only enable - // VIRTIO_SCSCI_MULTIQUEUE on images with driver version 1.2.0.1621 or + // VIRTIO_SCSI_MULTIQUEUE on images with driver version 1.2.0.1621 or // higher. Linux images with kernel versions 3.17 and higher will - // support VIRTIO_SCSCI_MULTIQUEUE. + // support VIRTIO_SCSI_MULTIQUEUE. // // For new Windows images, the server might also populate this field // with the value WINDOWS, to indicate that this is a Windows image. @@ -6093,6 +6374,24 @@ type Image struct { // the current or a previous instance of a given disk name. SourceDiskId string `json:"sourceDiskId,omitempty"` + // SourceImage: URL of the source image used to create this image. This + // can be a full or valid partial URL. You must provide exactly one of: + // + // - this property, or + // - the rawDisk.source property, or + // - the sourceDisk property in order to create an image. + SourceImage string `json:"sourceImage,omitempty"` + + // SourceImageEncryptionKey: The customer-supplied encryption key of the + // source image. Required if the source image is protected by a + // customer-supplied encryption key. + SourceImageEncryptionKey *CustomerEncryptionKey `json:"sourceImageEncryptionKey,omitempty"` + + // SourceImageId: [Output Only] The ID value of the image used to create + // this image. This value may be used to determine whether the image was + // taken from the current or a previous instance of a given image name. + SourceImageId string `json:"sourceImageId,omitempty"` + // SourceType: The type of the image used to create this disk. The // default and only value is RAW // @@ -6184,11 +6483,11 @@ func (s *ImageRawDisk) MarshalJSON() ([]byte, error) { // ImageList: Contains a list of images. type ImageList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Image resources. + // Items: A list of Image resources. Items []*Image `json:"items,omitempty"` // Kind: Type of resource. @@ -6309,6 +6608,12 @@ type Instance struct { // This includes custom metadata and predefined keys. Metadata *Metadata `json:"metadata,omitempty"` + // MinCpuPlatform: Specifies a minimum CPU platform for the VM instance. + // Applicable values are the friendly names of CPU platforms, such as + // minCpuPlatform: "Intel Haswell" or minCpuPlatform: "Intel Sandy + // Bridge". + MinCpuPlatform string `json:"minCpuPlatform,omitempty"` + // Name: The name of the resource, provided by the client when initially // creating the resource. The resource name must be 1-63 characters // long, and comply with RFC1035. Specifically, the name must be 1-63 @@ -6340,8 +6645,12 @@ type Instance struct { // instance. See Service Accounts for more information. ServiceAccounts []*ServiceAccount `json:"serviceAccounts,omitempty"` + // StartRestricted: [Output Only] Whether a VM has been restricted for + // start because Compute Engine has detected suspicious activity. + StartRestricted bool `json:"startRestricted,omitempty"` + // Status: [Output Only] The status of the instance. One of the - // following values: PROVISIONING, STAGING, RUNNING, STOPPING, + // following values: PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED, // SUSPENDING, SUSPENDED, and TERMINATED. // // Possible values: @@ -6397,11 +6706,11 @@ func (s *Instance) MarshalJSON() ([]byte, error) { } type InstanceAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped instance lists. + // Items: A list of InstancesScopedList resources. Items map[string]InstancesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -6537,11 +6846,11 @@ func (s *InstanceGroup) MarshalJSON() ([]byte, error) { } type InstanceGroupAggregatedList struct { - // Id: [Output Only] A unique identifier for this aggregated list of - // instance groups. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped instance group lists. + // Items: A list of InstanceGroupsScopedList resources. Items map[string]InstanceGroupsScopedList `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -6557,8 +6866,7 @@ type InstanceGroupAggregatedList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -6590,11 +6898,11 @@ func (s *InstanceGroupAggregatedList) MarshalJSON() ([]byte, error) { // InstanceGroupList: A list of InstanceGroup resources. type InstanceGroupList struct { - // Id: [Output Only] A unique identifier for this list of instance - // groups. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A list of instance groups. + // Items: A list of InstanceGroup resources. Items []*InstanceGroup `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -6609,8 +6917,7 @@ type InstanceGroupList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -6702,6 +7009,11 @@ type InstanceGroupManager struct { // complementary to this Instance Group Manager. NamedPorts []*NamedPort `json:"namedPorts,omitempty"` + // PendingActions: [Output Only] The list of instance actions and the + // number of instances in this managed instance group that are pending + // for each of those actions. + PendingActions *InstanceGroupManagerPendingActionsSummary `json:"pendingActions,omitempty"` + // Region: [Output Only] The URL of the region where the managed // instance group resides (for regional resources). Region string `json:"region,omitempty"` @@ -6727,6 +7039,20 @@ type InstanceGroupManager struct { // Resizing the group changes this number. TargetSize int64 `json:"targetSize,omitempty"` + // UpdatePolicy: The update policy for this managed instance group. + UpdatePolicy *InstanceGroupManagerUpdatePolicy `json:"updatePolicy,omitempty"` + + // Versions: Versions supported by this IGM. User should set this field + // if they need fine-grained control over how many instances in each + // version are run by this IGM. Versions are keyed by instanceTemplate. + // Every instanceTemplate can appear at most once. This field overrides + // instanceTemplate field. If both instanceTemplate and versions are + // set, the user receives a warning. "instanceTemplate: X" is + // semantically equivalent to "versions [ { instanceTemplate: X } ]". + // Exactly one version must have targetSize field left unset. Size of + // such a version will be calculated automatically. + Versions []*InstanceGroupManagerVersion `json:"versions,omitempty"` + // Zone: [Output Only] The URL of the zone where the managed instance // group is located (for zonal resources). Zone string `json:"zone,omitempty"` @@ -6810,6 +7136,12 @@ type InstanceGroupManagerActionsSummary struct { // being restarted. Restarting int64 `json:"restarting,omitempty"` + // Verifying: [Output Only] The number of instances in the managed + // instance group that are being verified. More details regarding + // verification process are covered in the documentation of + // ManagedInstance.InstanceAction.VERIFYING enum field. + Verifying int64 `json:"verifying,omitempty"` + // ForceSendFields is a list of field names (e.g. "Abandoning") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, @@ -6834,11 +7166,11 @@ func (s *InstanceGroupManagerActionsSummary) MarshalJSON() ([]byte, error) { } type InstanceGroupManagerAggregatedList struct { - // Id: [Output Only] A unique identifier for this aggregated list of - // managed instance groups. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of filtered managed instance group lists. + // Items: A list of InstanceGroupManagersScopedList resources. Items map[string]InstanceGroupManagersScopedList `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -6854,8 +7186,7 @@ type InstanceGroupManagerAggregatedList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -6924,11 +7255,11 @@ func (s *InstanceGroupManagerAutoHealingPolicy) MarshalJSON() ([]byte, error) { // InstanceGroupManagerList: [Output Only] A list of managed instance // groups. type InstanceGroupManagerList struct { - // Id: [Output Only] A unique identifier for this resource type. The - // server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of managed instance groups. + // Items: A list of InstanceGroupManager resources. Items []*InstanceGroupManager `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -6974,6 +7305,143 @@ func (s *InstanceGroupManagerList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type InstanceGroupManagerPendingActionsSummary struct { + // Creating: [Output Only] The number of instances in the managed + // instance group that are pending to be created. + Creating int64 `json:"creating,omitempty"` + + // Deleting: [Output Only] The number of instances in the managed + // instance group that are pending to be deleted. + Deleting int64 `json:"deleting,omitempty"` + + // Recreating: [Output Only] The number of instances in the managed + // instance group that are pending to be recreated. + Recreating int64 `json:"recreating,omitempty"` + + // Restarting: [Output Only] The number of instances in the managed + // instance group that are pending to be restarted. + Restarting int64 `json:"restarting,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Creating") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Creating") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *InstanceGroupManagerPendingActionsSummary) MarshalJSON() ([]byte, error) { + type noMethod InstanceGroupManagerPendingActionsSummary + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type InstanceGroupManagerUpdatePolicy struct { + // MaxSurge: Maximum number of instances that can be created above the + // InstanceGroupManager.targetSize during the update process. By + // default, a fixed value of 1 is used. Using maxSurge > 0 will cause + // instance names to change during the update process. At least one of { + // maxSurge, maxUnavailable } must be greater than 0. + MaxSurge *FixedOrPercent `json:"maxSurge,omitempty"` + + // MaxUnavailable: Maximum number of instances that can be unavailable + // during the update process. The instance is considered available if + // all of the following conditions are satisfied: 1. Instance's status + // is RUNNING. 2. Instance's liveness health check result was observed + // to be HEALTHY at least once. By default, a fixed value of 1 is used. + // At least one of { maxSurge, maxUnavailable } must be greater than 0. + MaxUnavailable *FixedOrPercent `json:"maxUnavailable,omitempty"` + + // MinReadySec: Minimum number of seconds to wait for after a newly + // created instance becomes available. This value must be from range [0, + // 3600]. + MinReadySec int64 `json:"minReadySec,omitempty"` + + // MinimalAction: Minimal action to be taken on an instance. The order + // of action types is: RESTART < REPLACE. + // + // Possible values: + // "REPLACE" + // "RESTART" + MinimalAction string `json:"minimalAction,omitempty"` + + // Possible values: + // "OPPORTUNISTIC" + // "PROACTIVE" + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "MaxSurge") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "MaxSurge") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *InstanceGroupManagerUpdatePolicy) MarshalJSON() ([]byte, error) { + type noMethod InstanceGroupManagerUpdatePolicy + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type InstanceGroupManagerVersion struct { + InstanceTemplate string `json:"instanceTemplate,omitempty"` + + // Name: Name of the version. Unique among all versions in the scope of + // this managed instance group. + Name string `json:"name,omitempty"` + + // TargetSize: Intended number of instances that are created from + // instanceTemplate. The final number of instances created from + // instanceTemplate will be equal to: * if expressed as fixed number: + // min(targetSize.fixed, instanceGroupManager.targetSize), * if + // expressed as percent: ceiling(targetSize.percent * + // InstanceGroupManager.targetSize). If unset, this version will handle + // all the remaining instances. + TargetSize *FixedOrPercent `json:"targetSize,omitempty"` + + // ForceSendFields is a list of field names (e.g. "InstanceTemplate") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "InstanceTemplate") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *InstanceGroupManagerVersion) MarshalJSON() ([]byte, error) { + type noMethod InstanceGroupManagerVersion + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type InstanceGroupManagersAbandonInstancesRequest struct { // Instances: The URLs of one or more instances to abandon. This can be // a full URL or a partial URL, such as @@ -7411,12 +7879,11 @@ func (s *InstanceGroupsAddInstancesRequest) MarshalJSON() ([]byte, error) { } type InstanceGroupsListInstances struct { - // Id: [Output Only] A unique identifier for this list of instances in - // the specified instance group. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of instances and any named ports that are - // assigned to those instances. + // Items: A list of InstanceWithNamedPorts resources. Items []*InstanceWithNamedPorts `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -7432,8 +7899,7 @@ type InstanceGroupsListInstances struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this list of instances in the - // specified instance groups. The server generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -7691,11 +8157,11 @@ func (s *InstanceGroupsSetNamedPortsRequest) MarshalJSON() ([]byte, error) { // InstanceList: Contains a list of instances. type InstanceList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of instances. + // Items: A list of Instance resources. Items []*Instance `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#instanceList for @@ -7742,11 +8208,11 @@ func (s *InstanceList) MarshalJSON() ([]byte, error) { // InstanceListReferrers: Contains a list of instance referrers. type InstanceListReferrers struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of referrers. + // Items: A list of Reference resources. Items []*Reference `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -7840,8 +8306,8 @@ type InstanceProperties struct { // receive packets with destination IP addresses other than their own. // If these instances will be used as an IP gateway or it will be set as // the next-hop in a Route resource, specify true. If unsure, leave this - // set to false. See the Enable IP forwarding for instances - // documentation for more information. + // set to false. See the Enable IP forwarding documentation for more + // information. CanIpForward bool `json:"canIpForward,omitempty"` // Description: An optional text description for the instances that are @@ -7870,6 +8336,14 @@ type InstanceProperties struct { // more information. Metadata *Metadata `json:"metadata,omitempty"` + // MinCpuPlatform: Minimum cpu/platform to be used by this instance. The + // instance may be scheduled on the specified or newer cpu/platform. + // Applicable values are the friendly names of CPU platforms, such as + // minCpuPlatform: "Intel Haswell" or minCpuPlatform: "Intel Sandy + // Bridge". For more information, read Specifying a Minimum CPU + // Platform. + MinCpuPlatform string `json:"minCpuPlatform,omitempty"` + // NetworkInterfaces: An array of network access configurations for this // interface. NetworkInterfaces []*NetworkInterface `json:"networkInterfaces,omitempty"` @@ -8004,11 +8478,11 @@ func (s *InstanceTemplate) MarshalJSON() ([]byte, error) { // InstanceTemplateList: A list of instance templates. type InstanceTemplateList struct { - // Id: [Output Only] A unique identifier for this instance template. The - // server defines this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] list of InstanceTemplate resources. + // Items: A list of InstanceTemplate resources. Items []*InstanceTemplate `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -8023,8 +8497,7 @@ type InstanceTemplateList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this instance template list. The - // server defines this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -8315,6 +8788,35 @@ func (s *InstancesSetMachineTypeRequest) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type InstancesSetMinCpuPlatformRequest struct { + // MinCpuPlatform: Minimum cpu/platform this instance should be started + // at. + MinCpuPlatform string `json:"minCpuPlatform,omitempty"` + + // ForceSendFields is a list of field names (e.g. "MinCpuPlatform") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "MinCpuPlatform") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *InstancesSetMinCpuPlatformRequest) MarshalJSON() ([]byte, error) { + type noMethod InstancesSetMinCpuPlatformRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type InstancesSetServiceAccountRequest struct { // Email: Email address of the service account. Email string `json:"email,omitempty"` @@ -8382,9 +8884,8 @@ func (s *InstancesStartWithEncryptionKeyRequest) MarshalJSON() ([]byte, error) { // License: A license resource. type License struct { - // ChargesUseFee: [Output Only] If true, the customer will be charged - // license fee for running software that contains this license on an - // instance. + // ChargesUseFee: [Output Only] Deprecated. This field no longer + // reflects whether a license charges a usage fee. ChargesUseFee bool `json:"chargesUseFee,omitempty"` // Kind: [Output Only] Type of resource. Always compute#license for @@ -8427,10 +8928,13 @@ func (s *License) MarshalJSON() ([]byte, error) { // LogConfig: Specifies what kind of log the caller must write type LogConfig struct { + // CloudAudit: Cloud audit options. + CloudAudit *LogConfigCloudAuditOptions `json:"cloudAudit,omitempty"` + // Counter: Counter options. Counter *LogConfigCounterOptions `json:"counter,omitempty"` - // ForceSendFields is a list of field names (e.g. "Counter") to + // ForceSendFields is a list of field names (e.g. "CloudAudit") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the @@ -8438,7 +8942,7 @@ type LogConfig struct { // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "Counter") to include in + // NullFields is a list of field names (e.g. "CloudAudit") to include in // API requests with the JSON null value. By default, fields with empty // values are omitted from API requests. However, any field with an // empty value appearing in NullFields will be sent to the server as @@ -8453,6 +8957,45 @@ func (s *LogConfig) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// LogConfigCloudAuditOptions: Write a Cloud Audit log +type LogConfigCloudAuditOptions struct { + // AuthorizationLoggingOptions: Information used by the Cloud Audit + // Logging pipeline. + AuthorizationLoggingOptions *AuthorizationLoggingOptions `json:"authorizationLoggingOptions,omitempty"` + + // LogName: The log_name to populate in the Cloud Audit Record. + // + // Possible values: + // "ADMIN_ACTIVITY" + // "DATA_ACCESS" + // "UNSPECIFIED_LOG_NAME" + LogName string `json:"logName,omitempty"` + + // ForceSendFields is a list of field names (e.g. + // "AuthorizationLoggingOptions") to unconditionally include in API + // requests. By default, fields with empty values are omitted from API + // requests. However, any non-pointer, non-interface field appearing in + // ForceSendFields will be sent to the server regardless of whether the + // field is empty or not. This may be used to include empty fields in + // Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. + // "AuthorizationLoggingOptions") to include in API requests with the + // JSON null value. By default, fields with empty values are omitted + // from API requests. However, any field with an empty value appearing + // in NullFields will be sent to the server as null. It is an error if a + // field in this list has a non-empty value. This may be used to include + // null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *LogConfigCloudAuditOptions) MarshalJSON() ([]byte, error) { + type noMethod LogConfigCloudAuditOptions + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // LogConfigCounterOptions: Options for counters type LogConfigCounterOptions struct { // Field: The field value to attribute. @@ -8565,11 +9108,11 @@ func (s *MachineType) MarshalJSON() ([]byte, error) { } type MachineTypeAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped machine type lists. + // Items: A list of MachineTypesScopedList resources. Items map[string]MachineTypesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -8617,11 +9160,11 @@ func (s *MachineTypeAggregatedList) MarshalJSON() ([]byte, error) { // MachineTypeList: Contains a list of machine types. type MachineTypeList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Machine Type resources. + // Items: A list of MachineType resources. Items []*MachineType `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#machineTypeList @@ -8829,6 +9372,7 @@ type ManagedInstance struct { // "RECREATING" // "REFRESHING" // "RESTARTING" + // "VERIFYING" CurrentAction string `json:"currentAction,omitempty"` // Id: [Output only] The unique identifier for this resource. This field @@ -9060,8 +9604,8 @@ type MetadataItems struct { // Value: Value for the metadata entry. These are free-form strings, and // only have meaning as interpreted by the image running in the // instance. The only restriction placed on values is that their size - // must be less than or equal to 32768 bytes. - Value string `json:"value,omitempty"` + // must be less than or equal to 262144 bytes (256 KiB). + Value *string `json:"value,omitempty"` // ForceSendFields is a list of field names (e.g. "Key") to // unconditionally include in API requests. By default, fields with @@ -9284,11 +9828,11 @@ func (s *NetworkInterface) MarshalJSON() ([]byte, error) { // NetworkList: Contains a list of networks. type NetworkList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Network resources. + // Items: A list of Network resources. Items []*Network `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#networkList for @@ -10087,8 +10631,7 @@ type Policy struct { // policy. AuditConfigs []*AuditConfig `json:"auditConfigs,omitempty"` - // Bindings: Associates a list of `members` to a `role`. Multiple - // `bindings` must not be specified for the same `role`. `bindings` with + // Bindings: Associates a list of `members` to a `role`. `bindings` with // no members will result in an error. Bindings []*Binding `json:"bindings,omitempty"` @@ -10193,9 +10736,8 @@ type Project struct { // the Google Cloud Storage bucket where they are stored. UsageExportLocation *UsageExportLocation `json:"usageExportLocation,omitempty"` - // XpnProjectStatus: [Output Only] The role this project has in a Cross - // Project Network (XPN) configuration. Currently only HOST projects are - // differentiated. + // XpnProjectStatus: [Output Only] The role this project has in a shared + // VPC configuration. Currently only HOST projects are differentiated. // // Possible values: // "HOST" @@ -10232,7 +10774,7 @@ func (s *Project) MarshalJSON() ([]byte, error) { } type ProjectsDisableXpnResourceRequest struct { - // XpnResource: XPN resource ID. + // XpnResource: Service resource (a.k.a service project) ID. XpnResource *XpnResourceId `json:"xpnResource,omitempty"` // ForceSendFields is a list of field names (e.g. "XpnResource") to @@ -10259,7 +10801,7 @@ func (s *ProjectsDisableXpnResourceRequest) MarshalJSON() ([]byte, error) { } type ProjectsEnableXpnResourceRequest struct { - // XpnResource: XPN resource ID. + // XpnResource: Service resource (a.k.a service project) ID. XpnResource *XpnResourceId `json:"xpnResource,omitempty"` // ForceSendFields is a list of field names (e.g. "XpnResource") to @@ -10287,7 +10829,8 @@ func (s *ProjectsEnableXpnResourceRequest) MarshalJSON() ([]byte, error) { type ProjectsGetXpnResources struct { // Kind: [Output Only] Type of resource. Always - // compute#projectsGetXpnResources for lists of XPN resources. + // compute#projectsGetXpnResources for lists of service resources (a.k.a + // service projects) Kind string `json:"kind,omitempty"` // NextPageToken: [Output Only] This token allows you to get the next @@ -10298,7 +10841,8 @@ type ProjectsGetXpnResources struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // Resources: XPN resources attached to this project as their XPN host. + // Resources: Serive resources (a.k.a service projects) attached to this + // project as their shared VPC host. Resources []*XpnResourceId `json:"resources,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -10330,8 +10874,8 @@ func (s *ProjectsGetXpnResources) MarshalJSON() ([]byte, error) { type ProjectsListXpnHostsRequest struct { // Organization: Optional organization ID managed by Cloud Resource - // Manager, for which to list XPN host projects. If not specified, the - // organization will be inferred from the project. + // Manager, for which to list shared VPC host projects. If not + // specified, the organization will be inferred from the project. Organization string `json:"organization,omitempty"` // ForceSendFields is a list of field names (e.g. "Organization") to @@ -10385,10 +10929,13 @@ type Quota struct { // "NETWORKS" // "NVIDIA_K80_GPUS" // "PREEMPTIBLE_CPUS" + // "PREEMPTIBLE_LOCAL_SSD_GB" // "REGIONAL_AUTOSCALERS" // "REGIONAL_INSTANCE_GROUP_MANAGERS" // "ROUTERS" // "ROUTES" + // "SECURITY_POLICIES" + // "SECURITY_POLICY_RULES" // "SNAPSHOTS" // "SSD_TOTAL_GB" // "SSL_CERTIFICATES" @@ -10557,18 +11104,22 @@ func (s *Region) MarshalJSON() ([]byte, error) { // RegionAutoscalerList: Contains a list of autoscalers. type RegionAutoscalerList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A list of autoscalers. + // Items: A list of Autoscaler resources. Items []*Autoscaler `json:"items,omitempty"` // Kind: Type of resource. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -10603,8 +11154,8 @@ func (s *RegionAutoscalerList) MarshalJSON() ([]byte, error) { // RegionInstanceGroupList: Contains a list of InstanceGroup resources. type RegionInstanceGroupList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of InstanceGroup resources. @@ -10621,8 +11172,7 @@ type RegionInstanceGroupList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -10655,11 +11205,11 @@ func (s *RegionInstanceGroupList) MarshalJSON() ([]byte, error) { // RegionInstanceGroupManagerList: Contains a list of managed instance // groups. type RegionInstanceGroupManagerList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A list of managed instance groups. + // Items: A list of InstanceGroupManager resources. Items []*InstanceGroupManager `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -10667,12 +11217,15 @@ type RegionInstanceGroupManagerList struct { // groups that exist in th regional scope. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -10920,12 +11473,11 @@ func (s *RegionInstanceGroupManagersSetTemplateRequest) MarshalJSON() ([]byte, e } type RegionInstanceGroupsListInstances struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` - // Items: A list of instances and any named ports that are assigned to - // those instances. + // Items: A list of InstanceWithNamedPorts resources. Items []*InstanceWithNamedPorts `json:"items,omitempty"` // Kind: The resource type. @@ -10939,7 +11491,7 @@ type RegionInstanceGroupsListInstances struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -11044,11 +11596,11 @@ func (s *RegionInstanceGroupsSetNamedPortsRequest) MarshalJSON() ([]byte, error) // RegionList: Contains a list of region resources. type RegionList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Region resources. + // Items: A list of Region resources. Items []*Region `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#regionList for @@ -11093,14 +11645,53 @@ func (s *RegionList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type RegionSetLabelsRequest struct { + // LabelFingerprint: The fingerprint of the previous set of labels for + // this resource, used to detect conflicts. The fingerprint is initially + // generated by Compute Engine and changes after every request to modify + // or update labels. You must always provide an up-to-date fingerprint + // hash in order to update or change labels. Make a get() request to the + // resource to get the latest fingerprint. + LabelFingerprint string `json:"labelFingerprint,omitempty"` + + // Labels: The labels to set for this resource. + Labels map[string]string `json:"labels,omitempty"` + + // ForceSendFields is a list of field names (e.g. "LabelFingerprint") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "LabelFingerprint") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *RegionSetLabelsRequest) MarshalJSON() ([]byte, error) { + type noMethod RegionSetLabelsRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // ResourceCommitment: Commitment for a particular resource (a // Commitment is composed of one or more of these). type ResourceCommitment struct { // Amount: The amount of the resource purchased (in a type-dependent - // unit, such as bytes). + // unit, such as bytes). For vCPUs, this can just be an integer. For + // memory, this must be provided in MB. Memory must be a multiple of 256 + // MB, with up to 6.5GB of memory per every vCPU. Amount int64 `json:"amount,omitempty,string"` - // Type: Type of resource for which this commitment applies. + // Type: Type of resource for which this commitment applies. Possible + // values are VCPU and MEMORY // // Possible values: // "MEMORY" @@ -11164,7 +11755,7 @@ func (s *ResourceGroupReference) MarshalJSON() ([]byte, error) { // instances by tags and the set of routes for a particular instance is // called its routing table. // -// For each packet leaving a instance, the system searches that +// For each packet leaving an instance, the system searches that // instance's routing table for a single best matching route. Routes // match packets by destination IP address, preferring smaller or more // specific ranges over larger ones. If there is a tie, the system @@ -11382,11 +11973,11 @@ func (s *RouteWarningsData) MarshalJSON() ([]byte, error) { // RouteList: Contains a list of Route resources. type RouteList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Route resources. + // Items: A list of Route resources. Items []*Route `json:"items,omitempty"` // Kind: Type of resource. @@ -11508,11 +12099,11 @@ func (s *Router) MarshalJSON() ([]byte, error) { // RouterAggregatedList: Contains a list of routers. type RouterAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped router lists. + // Items: A list of Router resources. Items map[string]RoutersScopedList `json:"items,omitempty"` // Kind: Type of resource. @@ -11679,8 +12270,8 @@ func (s *RouterInterface) MarshalJSON() ([]byte, error) { // RouterList: Contains a list of Router resources. type RouterList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of Router resources. @@ -12137,7 +12728,7 @@ type Scheduling struct { // // By default, this is set to true so an instance is automatically // restarted if it is terminated by Compute Engine. - AutomaticRestart bool `json:"automaticRestart,omitempty"` + AutomaticRestart *bool `json:"automaticRestart,omitempty"` // OnHostMaintenance: Defines the maintenance behavior for this // instance. For standard instances, the default behavior is MIGRATE. @@ -12403,11 +12994,11 @@ func (s *Snapshot) MarshalJSON() ([]byte, error) { // SnapshotList: Contains a list of Snapshot resources. type SnapshotList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Snapshot resources. + // Items: A list of Snapshot resources. Items []*Snapshot `json:"items,omitempty"` // Kind: Type of resource. @@ -12521,7 +13112,7 @@ func (s *SslCertificate) MarshalJSON() ([]byte, error) { // SslCertificateList: Contains a list of SslCertificate resources. type SslCertificateList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -12576,11 +13167,13 @@ type Subnetwork struct { CreationTimestamp string `json:"creationTimestamp,omitempty"` // Description: An optional description of this resource. Provide this - // property when you create the resource. + // property when you create the resource. This field can be set only at + // resource creation time. Description string `json:"description,omitempty"` // GatewayAddress: [Output Only] The gateway address for default routes - // to reach destination addresses outside this subnetwork. + // to reach destination addresses outside this subnetwork. This field + // can be set only at resource creation time. GatewayAddress string `json:"gatewayAddress,omitempty"` // Id: [Output Only] The unique identifier for the resource. This @@ -12590,7 +13183,8 @@ type Subnetwork struct { // IpCidrRange: The range of internal addresses that are owned by this // subnetwork. Provide this property when you create the subnetwork. For // example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and - // non-overlapping within a network. Only IPv4 is supported. + // non-overlapping within a network. Only IPv4 is supported. This field + // can be set only at resource creation time. IpCidrRange string `json:"ipCidrRange,omitempty"` // Kind: [Output Only] Type of the resource. Always compute#subnetwork @@ -12608,14 +13202,18 @@ type Subnetwork struct { // Network: The URL of the network to which this subnetwork belongs, // provided by the client when initially creating the subnetwork. Only - // networks that are in the distributed mode can have subnetworks. + // networks that are in the distributed mode can have subnetworks. This + // field can be set only at resource creation time. Network string `json:"network,omitempty"` // PrivateIpGoogleAccess: Whether the VMs in this subnet can access - // Google services without assigned external IP addresses. + // Google services without assigned external IP addresses. This field + // can be both set at resource creation time and updated using + // setPrivateIpGoogleAccess. PrivateIpGoogleAccess bool `json:"privateIpGoogleAccess,omitempty"` - // Region: URL of the region where the Subnetwork resides. + // Region: URL of the region where the Subnetwork resides. This field + // can be set only at resource creation time. Region string `json:"region,omitempty"` // SecondaryIpRanges: An array of configurations for secondary IP ranges @@ -12656,11 +13254,11 @@ func (s *Subnetwork) MarshalJSON() ([]byte, error) { } type SubnetworkAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output] A map of scoped Subnetwork lists. + // Items: A list of SubnetworksScopedList resources. Items map[string]SubnetworksScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -12707,11 +13305,11 @@ func (s *SubnetworkAggregatedList) MarshalJSON() ([]byte, error) { // SubnetworkList: Contains a list of Subnetwork resources. type SubnetworkList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: The Subnetwork resources. + // Items: A list of Subnetwork resources. Items []*Subnetwork `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#subnetworkList @@ -13137,8 +13735,8 @@ func (s *TargetHttpProxy) MarshalJSON() ([]byte, error) { // TargetHttpProxyList: A list of TargetHttpProxy resources. type TargetHttpProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetHttpProxy resources. @@ -13291,8 +13889,8 @@ func (s *TargetHttpsProxy) MarshalJSON() ([]byte, error) { // TargetHttpsProxyList: Contains a list of TargetHttpsProxy resources. type TargetHttpsProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetHttpsProxy resources. @@ -13425,7 +14023,7 @@ type TargetInstanceAggregatedList struct { // server. Id string `json:"id,omitempty"` - // Items: A map of scoped target instance lists. + // Items: A list of TargetInstance resources. Items map[string]TargetInstancesScopedList `json:"items,omitempty"` // Kind: Type of resource. @@ -13471,8 +14069,8 @@ func (s *TargetInstanceAggregatedList) MarshalJSON() ([]byte, error) { // TargetInstanceList: Contains a list of TargetInstance resources. type TargetInstanceList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetInstance resources. @@ -13791,11 +14389,11 @@ func (s *TargetPool) UnmarshalJSON(data []byte) error { } type TargetPoolAggregatedList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped target pool lists. + // Items: A list of TargetPool resources. Items map[string]TargetPoolsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -13878,7 +14476,7 @@ func (s *TargetPoolInstanceHealth) MarshalJSON() ([]byte, error) { // TargetPoolList: Contains a list of TargetPool resources. type TargetPoolList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -14367,8 +14965,8 @@ func (s *TargetSslProxy) MarshalJSON() ([]byte, error) { // TargetSslProxyList: Contains a list of TargetSslProxy resources. type TargetSslProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetSslProxy resources. @@ -14548,8 +15146,8 @@ func (s *TargetTcpProxy) MarshalJSON() ([]byte, error) { // TargetTcpProxyList: Contains a list of TargetTcpProxy resources. type TargetTcpProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetTcpProxy resources. @@ -14682,11 +15280,11 @@ func (s *TargetVpnGateway) MarshalJSON() ([]byte, error) { } type TargetVpnGatewayAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped target vpn gateway lists. + // Items: A list of TargetVpnGateway resources. Items map[string]TargetVpnGatewaysScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#targetVpnGateway @@ -14733,11 +15331,11 @@ func (s *TargetVpnGatewayAggregatedList) MarshalJSON() ([]byte, error) { // TargetVpnGatewayList: Contains a list of TargetVpnGateway resources. type TargetVpnGatewayList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of TargetVpnGateway resources. + // Items: A list of TargetVpnGateway resources. Items []*TargetVpnGateway `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#targetVpnGateway @@ -15127,7 +15725,7 @@ func (s *UrlMap) MarshalJSON() ([]byte, error) { // UrlMapList: Contains a list of UrlMap resources. type UrlMapList struct { - // Id: [Output Only] Unique identifier for the resource. Set by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -15494,11 +16092,11 @@ func (s *VpnTunnel) MarshalJSON() ([]byte, error) { } type VpnTunnelAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped vpn tunnel lists. + // Items: A list of VpnTunnelsScopedList resources. Items map[string]VpnTunnelsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#vpnTunnel for @@ -15545,11 +16143,11 @@ func (s *VpnTunnelAggregatedList) MarshalJSON() ([]byte, error) { // VpnTunnelList: Contains a list of VpnTunnel resources. type VpnTunnelList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of VpnTunnel resources. + // Items: A list of VpnTunnel resources. Items []*VpnTunnel `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#vpnTunnel for @@ -15722,15 +16320,15 @@ func (s *VpnTunnelsScopedListWarningData) MarshalJSON() ([]byte, error) { } type XpnHostList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of XPN host project URLs. + // Items: [Output Only] A list of shared VPC host project URLs. Items []*Project `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#xpnHostList for - // lists of XPN hosts. + // lists of shared VPC hosts. Kind string `json:"kind,omitempty"` // NextPageToken: [Output Only] This token allows you to get the next @@ -15771,13 +16369,14 @@ func (s *XpnHostList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } -// XpnResourceId: XpnResourceId +// XpnResourceId: Service resource (a.k.a service project) ID. type XpnResourceId struct { - // Id: The ID of the XPN resource. In the case of projects, this field - // matches the project's name, not the canonical ID. + // Id: The ID of the service resource. In the case of projects, this + // field matches the project ID (e.g., my-project), not the project + // number (e.g., 12345678). Id string `json:"id,omitempty"` - // Type: The type of the XPN resource. + // Type: The type of the service resource. // // Possible values: // "PROJECT" @@ -15809,6 +16408,10 @@ func (s *XpnResourceId) MarshalJSON() ([]byte, error) { // Zone: A Zone resource. type Zone struct { + // AvailableCpuPlatforms: [Output Only] Available cpu/platform + // selections for the zone. + AvailableCpuPlatforms []string `json:"availableCpuPlatforms,omitempty"` + // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text // format. CreationTimestamp string `json:"creationTimestamp,omitempty"` @@ -15849,15 +16452,16 @@ type Zone struct { // server. googleapi.ServerResponse `json:"-"` - // ForceSendFields is a list of field names (e.g. "CreationTimestamp") - // to unconditionally include in API requests. By default, fields with - // empty values are omitted from API requests. However, any non-pointer, - // non-interface field appearing in ForceSendFields will be sent to the - // server regardless of whether the field is empty or not. This may be - // used to include empty fields in Patch requests. + // ForceSendFields is a list of field names (e.g. + // "AvailableCpuPlatforms") to unconditionally include in API requests. + // By default, fields with empty values are omitted from API requests. + // However, any non-pointer, non-interface field appearing in + // ForceSendFields will be sent to the server regardless of whether the + // field is empty or not. This may be used to include empty fields in + // Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "CreationTimestamp") to + // NullFields is a list of field names (e.g. "AvailableCpuPlatforms") to // include in API requests with the JSON null value. By default, fields // with empty values are omitted from API requests. However, any field // with an empty value appearing in NullFields will be sent to the @@ -15879,7 +16483,7 @@ type ZoneList struct { // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Zone resources. + // Items: A list of Zone resources. Items []*Zone `json:"items,omitempty"` // Kind: Type of resource. @@ -15977,10 +16581,9 @@ func (r *AcceleratorTypesService) AggregatedList(project string) *AcceleratorTyp return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -15992,7 +16595,7 @@ func (r *AcceleratorTypesService) AggregatedList(project string) *AcceleratorTyp // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -16147,7 +16750,7 @@ func (c *AcceleratorTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (* // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -16395,10 +16998,9 @@ func (r *AcceleratorTypesService) List(project string, zone string) *Accelerator return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -16410,7 +17012,7 @@ func (r *AcceleratorTypesService) List(project string, zone string) *Accelerator // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -16567,7 +17169,7 @@ func (c *AcceleratorTypesListCall) Do(opts ...googleapi.CallOption) (*Accelerato // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -16657,10 +17259,9 @@ func (r *AddressesService) AggregatedList(project string) *AddressesAggregatedLi return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -16672,7 +17273,7 @@ func (r *AddressesService) AggregatedList(project string) *AddressesAggregatedLi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -16827,7 +17428,7 @@ func (c *AddressesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Address // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -16913,6 +17514,25 @@ func (r *AddressesService) Delete(project string, region string, address string) return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *AddressesDeleteCall) RequestId(requestId string) *AddressesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -17025,6 +17645,11 @@ func (c *AddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/addresses/{address}", @@ -17225,6 +17850,25 @@ func (r *AddressesService) Insert(project string, region string, address *Addres return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *AddressesInsertCall) RequestId(requestId string) *AddressesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -17333,6 +17977,11 @@ func (c *AddressesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/addresses", @@ -17372,10 +18021,9 @@ func (r *AddressesService) List(project string, region string) *AddressesListCal return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -17387,7 +18035,7 @@ func (r *AddressesService) List(project string, region string) *AddressesListCal // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -17544,7 +18192,7 @@ func (c *AddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, erro // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -17615,6 +18263,188 @@ func (c *AddressesListCall) Pages(ctx context.Context, f func(*AddressList) erro } } +// method id "compute.addresses.setLabels": + +type AddressesSetLabelsCall struct { + s *Service + project string + region string + resource string + regionsetlabelsrequest *RegionSetLabelsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetLabels: Sets the labels on an Address. To learn more about labels, +// read the Labeling Resources documentation. +func (r *AddressesService) SetLabels(project string, region string, resource string, regionsetlabelsrequest *RegionSetLabelsRequest) *AddressesSetLabelsCall { + c := &AddressesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.resource = resource + c.regionsetlabelsrequest = regionsetlabelsrequest + return c +} + +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *AddressesSetLabelsCall) RequestId(requestId string) *AddressesSetLabelsCall { + c.urlParams_.Set("requestId", requestId) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *AddressesSetLabelsCall) Fields(s ...googleapi.Field) *AddressesSetLabelsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *AddressesSetLabelsCall) Context(ctx context.Context) *AddressesSetLabelsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *AddressesSetLabelsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *AddressesSetLabelsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regionsetlabelsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{resource}/setLabels") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "resource": c.resource, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.addresses.setLabels" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *AddressesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the labels on an Address. To learn more about labels, read the Labeling Resources documentation.", + // "httpMethod": "POST", + // "id": "compute.addresses.setLabels", + // "parameterOrder": [ + // "project", + // "region", + // "resource" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "The region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, + // "resource": { + // "description": "Name of the resource for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/addresses/{resource}/setLabels", + // "request": { + // "$ref": "RegionSetLabelsRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.addresses.testIamPermissions": type AddressesTestIamPermissionsCall struct { @@ -17792,10 +18622,9 @@ func (r *AutoscalersService) AggregatedList(project string) *AutoscalersAggregat return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -17807,7 +18636,7 @@ func (r *AutoscalersService) AggregatedList(project string) *AutoscalersAggregat // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -17962,7 +18791,7 @@ func (c *AutoscalersAggregatedListCall) Do(opts ...googleapi.CallOption) (*Autos // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -18047,6 +18876,25 @@ func (r *AutoscalersService) Delete(project string, zone string, autoscaler stri return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *AutoscalersDeleteCall) RequestId(requestId string) *AutoscalersDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -18153,6 +19001,11 @@ func (c *AutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "Name of the zone for this request.", // "location": "path", @@ -18358,6 +19211,25 @@ func (r *AutoscalersService) Insert(project string, zone string, autoscaler *Aut return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *AutoscalersInsertCall) RequestId(requestId string) *AutoscalersInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -18460,6 +19332,11 @@ func (c *AutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "Name of the zone for this request.", // "location": "path", @@ -18504,10 +19381,9 @@ func (r *AutoscalersService) List(project string, zone string) *AutoscalersListC return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -18519,7 +19395,7 @@ func (r *AutoscalersService) List(project string, zone string) *AutoscalersListC // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -18676,7 +19552,7 @@ func (c *AutoscalersListCall) Do(opts ...googleapi.CallOption) (*AutoscalerList, // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -18760,7 +19636,8 @@ type AutoscalersPatchCall struct { } // Patch: Updates an autoscaler in the specified project using the data -// included in the request. This method supports patch semantics. +// included in the request. This method supports PATCH semantics and +// uses the JSON merge patch format and processing rules. func (r *AutoscalersService) Patch(project string, zone string, autoscaler *Autoscaler) *AutoscalersPatchCall { c := &AutoscalersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -18776,6 +19653,25 @@ func (c *AutoscalersPatchCall) Autoscaler(autoscaler string) *AutoscalersPatchCa return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *AutoscalersPatchCall) RequestId(requestId string) *AutoscalersPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -18863,7 +19759,7 @@ func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, err } return ret, nil // { - // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.autoscalers.patch", // "parameterOrder": [ @@ -18884,6 +19780,11 @@ func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, err // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "Name of the zone for this request.", // "location": "path", @@ -19096,6 +19997,25 @@ func (c *AutoscalersUpdateCall) Autoscaler(autoscaler string) *AutoscalersUpdate return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *AutoscalersUpdateCall) RequestId(requestId string) *AutoscalersUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -19204,6 +20124,11 @@ func (c *AutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, er // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "Name of the zone for this request.", // "location": "path", @@ -19246,6 +20171,25 @@ func (r *BackendBucketsService) Delete(project string, backendBucket string) *Ba return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *BackendBucketsDeleteCall) RequestId(requestId string) *BackendBucketsDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -19349,6 +20293,11 @@ func (c *BackendBucketsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/backendBuckets/{backendBucket}", @@ -19535,6 +20484,25 @@ func (r *BackendBucketsService) Insert(project string, backendbucket *BackendBuc return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *BackendBucketsInsertCall) RequestId(requestId string) *BackendBucketsInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -19634,6 +20602,11 @@ func (c *BackendBucketsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/backendBuckets", @@ -19670,10 +20643,9 @@ func (r *BackendBucketsService) List(project string) *BackendBucketsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -19685,7 +20657,7 @@ func (r *BackendBucketsService) List(project string) *BackendBucketsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -19840,7 +20812,7 @@ func (c *BackendBucketsListCall) Do(opts ...googleapi.CallOption) (*BackendBucke // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -19917,7 +20889,8 @@ type BackendBucketsPatchCall struct { } // Patch: Updates the specified BackendBucket resource with the data -// included in the request. This method supports patch semantics. +// included in the request. This method supports PATCH semantics and +// uses the JSON merge patch format and processing rules. func (r *BackendBucketsService) Patch(project string, backendBucket string, backendbucket *BackendBucket) *BackendBucketsPatchCall { c := &BackendBucketsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -19926,6 +20899,25 @@ func (r *BackendBucketsService) Patch(project string, backendBucket string, back return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *BackendBucketsPatchCall) RequestId(requestId string) *BackendBucketsPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -20013,7 +21005,7 @@ func (c *BackendBucketsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports patch semantics.", + // "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.backendBuckets.patch", // "parameterOrder": [ @@ -20034,6 +21026,11 @@ func (c *BackendBucketsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/backendBuckets/{backendBucket}", @@ -20074,6 +21071,25 @@ func (r *BackendBucketsService) Update(project string, backendBucket string, bac return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *BackendBucketsUpdateCall) RequestId(requestId string) *BackendBucketsUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -20182,6 +21198,11 @@ func (c *BackendBucketsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/backendBuckets/{backendBucket}", @@ -20218,10 +21239,9 @@ func (r *BackendServicesService) AggregatedList(project string) *BackendServices return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -20233,7 +21253,7 @@ func (r *BackendServicesService) AggregatedList(project string) *BackendServices // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -20388,7 +21408,7 @@ func (c *BackendServicesAggregatedListCall) Do(opts ...googleapi.CallOption) (*B // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -20472,6 +21492,25 @@ func (r *BackendServicesService) Delete(project string, backendService string) * return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *BackendServicesDeleteCall) RequestId(requestId string) *BackendServicesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -20575,6 +21614,11 @@ func (c *BackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/backendServices/{backendService}", @@ -20913,6 +21957,25 @@ func (r *BackendServicesService) Insert(project string, backendservice *BackendS return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *BackendServicesInsertCall) RequestId(requestId string) *BackendServicesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -21012,6 +22075,11 @@ func (c *BackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/backendServices", @@ -21049,10 +22117,9 @@ func (r *BackendServicesService) List(project string) *BackendServicesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -21064,7 +22131,7 @@ func (r *BackendServicesService) List(project string) *BackendServicesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -21219,7 +22286,7 @@ func (c *BackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServ // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -21299,7 +22366,8 @@ type BackendServicesPatchCall struct { // included in the request. There are several restrictions and // guidelines to keep in mind when updating a backend service. Read // Restrictions and Guidelines for more information. This method -// supports patch semantics. +// supports PATCH semantics and uses the JSON merge patch format and +// processing rules. // For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/patch func (r *BackendServicesService) Patch(project string, backendService string, backendservice *BackendService) *BackendServicesPatchCall { c := &BackendServicesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -21309,6 +22377,25 @@ func (r *BackendServicesService) Patch(project string, backendService string, ba return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *BackendServicesPatchCall) RequestId(requestId string) *BackendServicesPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -21396,7 +22483,7 @@ func (c *BackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + // "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.backendServices.patch", // "parameterOrder": [ @@ -21417,6 +22504,11 @@ func (c *BackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/backendServices/{backendService}", @@ -21608,6 +22700,25 @@ func (r *BackendServicesService) Update(project string, backendService string, b return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *BackendServicesUpdateCall) RequestId(requestId string) *BackendServicesUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -21716,6 +22827,11 @@ func (c *BackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/backendServices/{backendService}", @@ -21752,10 +22868,9 @@ func (r *DiskTypesService) AggregatedList(project string) *DiskTypesAggregatedLi return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -21767,7 +22882,7 @@ func (r *DiskTypesService) AggregatedList(project string) *DiskTypesAggregatedLi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -21922,7 +23037,7 @@ func (c *DiskTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskTyp // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -22172,10 +23287,9 @@ func (r *DiskTypesService) List(project string, zone string) *DiskTypesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -22187,7 +23301,7 @@ func (r *DiskTypesService) List(project string, zone string) *DiskTypesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -22344,7 +23458,7 @@ func (c *DiskTypesListCall) Do(opts ...googleapi.CallOption) (*DiskTypeList, err // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -22434,10 +23548,9 @@ func (r *DisksService) AggregatedList(project string) *DisksAggregatedListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -22449,7 +23562,7 @@ func (r *DisksService) AggregatedList(project string) *DisksAggregatedListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -22604,7 +23717,7 @@ func (c *DisksAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskAggrega // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -22698,6 +23811,25 @@ func (c *DisksCreateSnapshotCall) GuestFlush(guestFlush bool) *DisksCreateSnapsh return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *DisksCreateSnapshotCall) RequestId(requestId string) *DisksCreateSnapshotCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -22813,6 +23945,11 @@ func (c *DisksCreateSnapshotCall) Do(opts ...googleapi.CallOption) (*Operation, // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -22861,6 +23998,25 @@ func (r *DisksService) Delete(project string, zone string, disk string) *DisksDe return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *DisksDeleteCall) RequestId(requestId string) *DisksDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -22966,6 +24122,11 @@ func (c *DisksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -23176,6 +24337,25 @@ func (r *DisksService) Insert(project string, zone string, disk *Disk) *DisksIns return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *DisksInsertCall) RequestId(requestId string) *DisksInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // SourceImage sets the optional parameter "sourceImage": Source image // to restore onto a disk. func (c *DisksInsertCall) SourceImage(sourceImage string) *DisksInsertCall { @@ -23285,6 +24465,11 @@ func (c *DisksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "sourceImage": { // "description": "Optional. Source image to restore onto a disk.", // "location": "query", @@ -23335,10 +24520,9 @@ func (r *DisksService) List(project string, zone string) *DisksListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -23350,7 +24534,7 @@ func (r *DisksService) List(project string, zone string) *DisksListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -23507,7 +24691,7 @@ func (c *DisksListCall) Do(opts ...googleapi.CallOption) (*DiskList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -23601,6 +24785,25 @@ func (r *DisksService) Resize(project string, zone string, disk string, disksres return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *DisksResizeCall) RequestId(requestId string) *DisksResizeCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -23712,6 +24915,11 @@ func (c *DisksResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -23749,7 +24957,7 @@ type DisksSetLabelsCall struct { } // SetLabels: Sets the labels on a disk. To learn more about labels, -// read the Labeling or Tagging Resources documentation. +// read the Labeling Resources documentation. func (r *DisksService) SetLabels(project string, zone string, resource string, zonesetlabelsrequest *ZoneSetLabelsRequest) *DisksSetLabelsCall { c := &DisksSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -23759,6 +24967,25 @@ func (r *DisksService) SetLabels(project string, zone string, resource string, z return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *DisksSetLabelsCall) RequestId(requestId string) *DisksSetLabelsCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -23847,7 +25074,7 @@ func (c *DisksSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error } return ret, nil // { - // "description": "Sets the labels on a disk. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on a disk. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.disks.setLabels", // "parameterOrder": [ @@ -23863,6 +25090,11 @@ func (c *DisksSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "resource": { // "description": "Name of the resource for this request.", // "location": "path", @@ -24072,6 +25304,25 @@ func (r *FirewallsService) Delete(project string, firewall string) *FirewallsDel return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *FirewallsDeleteCall) RequestId(requestId string) *FirewallsDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -24175,6 +25426,11 @@ func (c *FirewallsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/firewalls/{firewall}", @@ -24362,6 +25618,25 @@ func (r *FirewallsService) Insert(project string, firewall *Firewall) *Firewalls return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *FirewallsInsertCall) RequestId(requestId string) *FirewallsInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -24461,6 +25736,11 @@ func (c *FirewallsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/firewalls", @@ -24498,10 +25778,9 @@ func (r *FirewallsService) List(project string) *FirewallsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -24513,7 +25792,7 @@ func (r *FirewallsService) List(project string) *FirewallsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -24668,7 +25947,7 @@ func (c *FirewallsListCall) Do(opts ...googleapi.CallOption) (*FirewallList, err // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -24745,7 +26024,8 @@ type FirewallsPatchCall struct { } // Patch: Updates the specified firewall rule with the data included in -// the request. This method supports patch semantics. +// the request. This method supports PATCH semantics and uses the JSON +// merge patch format and processing rules. // For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/patch func (r *FirewallsService) Patch(project string, firewall string, firewall2 *Firewall) *FirewallsPatchCall { c := &FirewallsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -24755,6 +26035,25 @@ func (r *FirewallsService) Patch(project string, firewall string, firewall2 *Fir return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *FirewallsPatchCall) RequestId(requestId string) *FirewallsPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -24842,7 +26141,7 @@ func (c *FirewallsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error } return ret, nil // { - // "description": "Updates the specified firewall rule with the data included in the request. This method supports patch semantics.", + // "description": "Updates the specified firewall rule with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.firewalls.patch", // "parameterOrder": [ @@ -24863,6 +26162,11 @@ func (c *FirewallsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/firewalls/{firewall}", @@ -25054,6 +26358,25 @@ func (r *FirewallsService) Update(project string, firewall string, firewall2 *Fi return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *FirewallsUpdateCall) RequestId(requestId string) *FirewallsUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -25162,6 +26485,11 @@ func (c *FirewallsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/firewalls/{firewall}", @@ -25198,10 +26526,9 @@ func (r *ForwardingRulesService) AggregatedList(project string) *ForwardingRules return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -25213,7 +26540,7 @@ func (r *ForwardingRulesService) AggregatedList(project string) *ForwardingRules // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -25368,7 +26695,7 @@ func (c *ForwardingRulesAggregatedListCall) Do(opts ...googleapi.CallOption) (*F // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -25454,6 +26781,25 @@ func (r *ForwardingRulesService) Delete(project string, region string, forwardin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ForwardingRulesDeleteCall) RequestId(requestId string) *ForwardingRulesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -25566,6 +26912,11 @@ func (c *ForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}", @@ -25766,6 +27117,25 @@ func (r *ForwardingRulesService) Insert(project string, region string, forwardin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ForwardingRulesInsertCall) RequestId(requestId string) *ForwardingRulesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -25874,6 +27244,11 @@ func (c *ForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/forwardingRules", @@ -25913,10 +27288,9 @@ func (r *ForwardingRulesService) List(project string, region string) *Forwarding return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -25928,7 +27302,7 @@ func (r *ForwardingRulesService) List(project string, region string) *Forwarding // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -26085,7 +27459,7 @@ func (c *ForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingR // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -26156,6 +27530,188 @@ func (c *ForwardingRulesListCall) Pages(ctx context.Context, f func(*ForwardingR } } +// method id "compute.forwardingRules.setLabels": + +type ForwardingRulesSetLabelsCall struct { + s *Service + project string + region string + resource string + regionsetlabelsrequest *RegionSetLabelsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetLabels: Sets the labels on the specified resource. To learn more +// about labels, read the Labeling Resources documentation. +func (r *ForwardingRulesService) SetLabels(project string, region string, resource string, regionsetlabelsrequest *RegionSetLabelsRequest) *ForwardingRulesSetLabelsCall { + c := &ForwardingRulesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.resource = resource + c.regionsetlabelsrequest = regionsetlabelsrequest + return c +} + +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ForwardingRulesSetLabelsCall) RequestId(requestId string) *ForwardingRulesSetLabelsCall { + c.urlParams_.Set("requestId", requestId) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ForwardingRulesSetLabelsCall) Fields(s ...googleapi.Field) *ForwardingRulesSetLabelsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ForwardingRulesSetLabelsCall) Context(ctx context.Context) *ForwardingRulesSetLabelsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ForwardingRulesSetLabelsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ForwardingRulesSetLabelsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regionsetlabelsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{resource}/setLabels") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "resource": c.resource, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.forwardingRules.setLabels" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ForwardingRulesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling Resources documentation.", + // "httpMethod": "POST", + // "id": "compute.forwardingRules.setLabels", + // "parameterOrder": [ + // "project", + // "region", + // "resource" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "The region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, + // "resource": { + // "description": "Name of the resource for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/forwardingRules/{resource}/setLabels", + // "request": { + // "$ref": "RegionSetLabelsRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.forwardingRules.setTarget": type ForwardingRulesSetTargetCall struct { @@ -26181,6 +27737,25 @@ func (r *ForwardingRulesService) SetTarget(project string, region string, forwar return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ForwardingRulesSetTargetCall) RequestId(requestId string) *ForwardingRulesSetTargetCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -26298,6 +27873,11 @@ func (c *ForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (*Operat // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget", @@ -26494,6 +28074,25 @@ func (r *GlobalAddressesService) Delete(project string, address string) *GlobalA return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *GlobalAddressesDeleteCall) RequestId(requestId string) *GlobalAddressesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -26597,6 +28196,11 @@ func (c *GlobalAddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/addresses/{address}", @@ -26785,6 +28389,25 @@ func (r *GlobalAddressesService) Insert(project string, address *Address) *Globa return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *GlobalAddressesInsertCall) RequestId(requestId string) *GlobalAddressesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -26884,6 +28507,11 @@ func (c *GlobalAddressesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/addresses", @@ -26920,10 +28548,9 @@ func (r *GlobalAddressesService) List(project string) *GlobalAddressesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -26935,7 +28562,7 @@ func (r *GlobalAddressesService) List(project string) *GlobalAddressesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -27090,7 +28717,7 @@ func (c *GlobalAddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -27154,6 +28781,153 @@ func (c *GlobalAddressesListCall) Pages(ctx context.Context, f func(*AddressList } } +// method id "compute.globalAddresses.setLabels": + +type GlobalAddressesSetLabelsCall struct { + s *Service + project string + resource string + globalsetlabelsrequest *GlobalSetLabelsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetLabels: Sets the labels on a GlobalAddress. To learn more about +// labels, read the Labeling Resources documentation. +func (r *GlobalAddressesService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *GlobalAddressesSetLabelsCall { + c := &GlobalAddressesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.resource = resource + c.globalsetlabelsrequest = globalsetlabelsrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *GlobalAddressesSetLabelsCall) Fields(s ...googleapi.Field) *GlobalAddressesSetLabelsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *GlobalAddressesSetLabelsCall) Context(ctx context.Context) *GlobalAddressesSetLabelsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *GlobalAddressesSetLabelsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *GlobalAddressesSetLabelsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{resource}/setLabels") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "resource": c.resource, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.globalAddresses.setLabels" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *GlobalAddressesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the labels on a GlobalAddress. To learn more about labels, read the Labeling Resources documentation.", + // "httpMethod": "POST", + // "id": "compute.globalAddresses.setLabels", + // "parameterOrder": [ + // "project", + // "resource" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "resource": { + // "description": "Name of the resource for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/addresses/{resource}/setLabels", + // "request": { + // "$ref": "GlobalSetLabelsRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.globalAddresses.testIamPermissions": type GlobalAddressesTestIamPermissionsCall struct { @@ -27322,6 +29096,25 @@ func (r *GlobalForwardingRulesService) Delete(project string, forwardingRule str return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *GlobalForwardingRulesDeleteCall) RequestId(requestId string) *GlobalForwardingRulesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -27425,6 +29218,11 @@ func (c *GlobalForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/forwardingRules/{forwardingRule}", @@ -27613,6 +29411,25 @@ func (r *GlobalForwardingRulesService) Insert(project string, forwardingrule *Fo return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *GlobalForwardingRulesInsertCall) RequestId(requestId string) *GlobalForwardingRulesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -27712,6 +29529,11 @@ func (c *GlobalForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/forwardingRules", @@ -27749,10 +29571,9 @@ func (r *GlobalForwardingRulesService) List(project string) *GlobalForwardingRul return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -27764,7 +29585,7 @@ func (r *GlobalForwardingRulesService) List(project string) *GlobalForwardingRul // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -27919,7 +29740,7 @@ func (c *GlobalForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*Forwa // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -27983,6 +29804,153 @@ func (c *GlobalForwardingRulesListCall) Pages(ctx context.Context, f func(*Forwa } } +// method id "compute.globalForwardingRules.setLabels": + +type GlobalForwardingRulesSetLabelsCall struct { + s *Service + project string + resource string + globalsetlabelsrequest *GlobalSetLabelsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetLabels: Sets the labels on the specified resource. To learn more +// about labels, read the Labeling Resources documentation. +func (r *GlobalForwardingRulesService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *GlobalForwardingRulesSetLabelsCall { + c := &GlobalForwardingRulesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.resource = resource + c.globalsetlabelsrequest = globalsetlabelsrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *GlobalForwardingRulesSetLabelsCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesSetLabelsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *GlobalForwardingRulesSetLabelsCall) Context(ctx context.Context) *GlobalForwardingRulesSetLabelsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *GlobalForwardingRulesSetLabelsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *GlobalForwardingRulesSetLabelsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{resource}/setLabels") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "resource": c.resource, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.globalForwardingRules.setLabels" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *GlobalForwardingRulesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling Resources documentation.", + // "httpMethod": "POST", + // "id": "compute.globalForwardingRules.setLabels", + // "parameterOrder": [ + // "project", + // "resource" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "resource": { + // "description": "Name of the resource for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/forwardingRules/{resource}/setLabels", + // "request": { + // "$ref": "GlobalSetLabelsRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.globalForwardingRules.setTarget": type GlobalForwardingRulesSetTargetCall struct { @@ -28006,6 +29974,25 @@ func (r *GlobalForwardingRulesService) SetTarget(project string, forwardingRule return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *GlobalForwardingRulesSetTargetCall) RequestId(requestId string) *GlobalForwardingRulesSetTargetCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -28114,6 +30101,11 @@ func (c *GlobalForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (* // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/forwardingRules/{forwardingRule}/setTarget", @@ -28298,10 +30290,9 @@ func (r *GlobalOperationsService) AggregatedList(project string) *GlobalOperatio return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -28313,7 +30304,7 @@ func (r *GlobalOperationsService) AggregatedList(project string) *GlobalOperatio // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -28468,7 +30459,7 @@ func (c *GlobalOperationsAggregatedListCall) Do(opts ...googleapi.CallOption) (* // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -28814,10 +30805,9 @@ func (r *GlobalOperationsService) List(project string) *GlobalOperationsListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -28829,7 +30819,7 @@ func (r *GlobalOperationsService) List(project string) *GlobalOperationsListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -28984,7 +30974,7 @@ func (c *GlobalOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -29067,6 +31057,25 @@ func (r *HealthChecksService) Delete(project string, healthCheck string) *Health return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HealthChecksDeleteCall) RequestId(requestId string) *HealthChecksDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -29170,6 +31179,11 @@ func (c *HealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, e // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/healthChecks/{healthCheck}", @@ -29356,6 +31370,25 @@ func (r *HealthChecksService) Insert(project string, healthcheck *HealthCheck) * return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HealthChecksInsertCall) RequestId(requestId string) *HealthChecksInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -29455,6 +31488,11 @@ func (c *HealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, e // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/healthChecks", @@ -29491,10 +31529,9 @@ func (r *HealthChecksService) List(project string) *HealthChecksListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -29506,7 +31543,7 @@ func (r *HealthChecksService) List(project string) *HealthChecksListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -29661,7 +31698,7 @@ func (c *HealthChecksListCall) Do(opts ...googleapi.CallOption) (*HealthCheckLis // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -29738,8 +31775,8 @@ type HealthChecksPatchCall struct { } // Patch: Updates a HealthCheck resource in the specified project using -// the data included in the request. This method supports patch -// semantics. +// the data included in the request. This method supports PATCH +// semantics and uses the JSON merge patch format and processing rules. func (r *HealthChecksService) Patch(project string, healthCheck string, healthcheck *HealthCheck) *HealthChecksPatchCall { c := &HealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -29748,6 +31785,25 @@ func (r *HealthChecksService) Patch(project string, healthCheck string, healthch return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HealthChecksPatchCall) RequestId(requestId string) *HealthChecksPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -29835,7 +31891,7 @@ func (c *HealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, er } return ret, nil // { - // "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.healthChecks.patch", // "parameterOrder": [ @@ -29856,6 +31912,11 @@ func (c *HealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, er // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/healthChecks/{healthCheck}", @@ -30044,6 +32105,25 @@ func (r *HealthChecksService) Update(project string, healthCheck string, healthc return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HealthChecksUpdateCall) RequestId(requestId string) *HealthChecksUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -30152,6 +32232,11 @@ func (c *HealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, e // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/healthChecks/{healthCheck}", @@ -30189,6 +32274,25 @@ func (r *HttpHealthChecksService) Delete(project string, httpHealthCheck string) return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HttpHealthChecksDeleteCall) RequestId(requestId string) *HttpHealthChecksDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -30292,6 +32396,11 @@ func (c *HttpHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", @@ -30480,6 +32589,25 @@ func (r *HttpHealthChecksService) Insert(project string, httphealthcheck *HttpHe return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HttpHealthChecksInsertCall) RequestId(requestId string) *HttpHealthChecksInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -30579,6 +32707,11 @@ func (c *HttpHealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operatio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/httpHealthChecks", @@ -30616,10 +32749,9 @@ func (r *HttpHealthChecksService) List(project string) *HttpHealthChecksListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -30631,7 +32763,7 @@ func (r *HttpHealthChecksService) List(project string) *HttpHealthChecksListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -30786,7 +32918,7 @@ func (c *HttpHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpHealth // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -30863,8 +32995,8 @@ type HttpHealthChecksPatchCall struct { } // Patch: Updates a HttpHealthCheck resource in the specified project -// using the data included in the request. This method supports patch -// semantics. +// using the data included in the request. This method supports PATCH +// semantics and uses the JSON merge patch format and processing rules. // For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/patch func (r *HttpHealthChecksService) Patch(project string, httpHealthCheck string, httphealthcheck *HttpHealthCheck) *HttpHealthChecksPatchCall { c := &HttpHealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -30874,6 +33006,25 @@ func (r *HttpHealthChecksService) Patch(project string, httpHealthCheck string, return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HttpHealthChecksPatchCall) RequestId(requestId string) *HttpHealthChecksPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -30961,7 +33112,7 @@ func (c *HttpHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.httpHealthChecks.patch", // "parameterOrder": [ @@ -30982,6 +33133,11 @@ func (c *HttpHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", @@ -31171,6 +33327,25 @@ func (r *HttpHealthChecksService) Update(project string, httpHealthCheck string, return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HttpHealthChecksUpdateCall) RequestId(requestId string) *HttpHealthChecksUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -31279,6 +33454,11 @@ func (c *HttpHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operatio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", @@ -31315,6 +33495,25 @@ func (r *HttpsHealthChecksService) Delete(project string, httpsHealthCheck strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HttpsHealthChecksDeleteCall) RequestId(requestId string) *HttpsHealthChecksDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -31418,6 +33617,11 @@ func (c *HttpsHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", @@ -31604,6 +33808,25 @@ func (r *HttpsHealthChecksService) Insert(project string, httpshealthcheck *Http return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HttpsHealthChecksInsertCall) RequestId(requestId string) *HttpsHealthChecksInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -31703,6 +33926,11 @@ func (c *HttpsHealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/httpsHealthChecks", @@ -31739,10 +33967,9 @@ func (r *HttpsHealthChecksService) List(project string) *HttpsHealthChecksListCa return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -31754,7 +33981,7 @@ func (r *HttpsHealthChecksService) List(project string) *HttpsHealthChecksListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -31909,7 +34136,7 @@ func (c *HttpsHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpsHeal // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -31986,8 +34213,8 @@ type HttpsHealthChecksPatchCall struct { } // Patch: Updates a HttpsHealthCheck resource in the specified project -// using the data included in the request. This method supports patch -// semantics. +// using the data included in the request. This method supports PATCH +// semantics and uses the JSON merge patch format and processing rules. func (r *HttpsHealthChecksService) Patch(project string, httpsHealthCheck string, httpshealthcheck *HttpsHealthCheck) *HttpsHealthChecksPatchCall { c := &HttpsHealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -31996,6 +34223,25 @@ func (r *HttpsHealthChecksService) Patch(project string, httpsHealthCheck string return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HttpsHealthChecksPatchCall) RequestId(requestId string) *HttpsHealthChecksPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -32083,7 +34329,7 @@ func (c *HttpsHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.httpsHealthChecks.patch", // "parameterOrder": [ @@ -32104,6 +34350,11 @@ func (c *HttpsHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operatio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", @@ -32292,6 +34543,25 @@ func (r *HttpsHealthChecksService) Update(project string, httpsHealthCheck strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *HttpsHealthChecksUpdateCall) RequestId(requestId string) *HttpsHealthChecksUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -32400,6 +34670,11 @@ func (c *HttpsHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", @@ -32437,6 +34712,25 @@ func (r *ImagesService) Delete(project string, image string) *ImagesDeleteCall { return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ImagesDeleteCall) RequestId(requestId string) *ImagesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -32540,6 +34834,11 @@ func (c *ImagesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/images/{image}", @@ -32579,6 +34878,22 @@ func (r *ImagesService) Deprecate(project string, image string, deprecationstatu return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and then the request times out. If you make the request again with +// the same request ID, the server can check if original operation with +// the same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +func (c *ImagesDeprecateCall) RequestId(requestId string) *ImagesDeprecateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -32687,6 +35002,11 @@ func (c *ImagesDeprecateCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/images/{image}/deprecate", @@ -33030,6 +35350,32 @@ func (r *ImagesService) Insert(project string, image *Image) *ImagesInsertCall { return c } +// ForceCreate sets the optional parameter "forceCreate": Force image +// creation if true. +func (c *ImagesInsertCall) ForceCreate(forceCreate bool) *ImagesInsertCall { + c.urlParams_.Set("forceCreate", fmt.Sprint(forceCreate)) + return c +} + +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ImagesInsertCall) RequestId(requestId string) *ImagesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -33123,12 +35469,22 @@ func (c *ImagesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "project" // ], // "parameters": { + // "forceCreate": { + // "description": "Force image creation if true.", + // "location": "query", + // "type": "boolean" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/images", @@ -33174,10 +35530,9 @@ func (r *ImagesService) List(project string) *ImagesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -33189,7 +35544,7 @@ func (r *ImagesService) List(project string) *ImagesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -33344,7 +35699,7 @@ func (c *ImagesListCall) Do(opts ...googleapi.CallOption) (*ImageList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -33421,7 +35776,7 @@ type ImagesSetLabelsCall struct { } // SetLabels: Sets the labels on an image. To learn more about labels, -// read the Labeling or Tagging Resources documentation. +// read the Labeling Resources documentation. func (r *ImagesService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *ImagesSetLabelsCall { c := &ImagesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -33517,7 +35872,7 @@ func (c *ImagesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, erro } return ret, nil // { - // "description": "Sets the labels on an image. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on an image. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.images.setLabels", // "parameterOrder": [ @@ -33726,6 +36081,11 @@ type InstanceGroupManagersAbandonInstancesCall struct { // been removed from the group. You must separately verify the status of // the abandoning action with the listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *InstanceGroupManagersService) AbandonInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersabandoninstancesrequest *InstanceGroupManagersAbandonInstancesRequest) *InstanceGroupManagersAbandonInstancesCall { @@ -33737,6 +36097,25 @@ func (r *InstanceGroupManagersService) AbandonInstances(project string, zone str return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersAbandonInstancesCall) RequestId(requestId string) *InstanceGroupManagersAbandonInstancesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -33825,7 +36204,7 @@ func (c *InstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOpt } return ret, nil // { - // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.abandonInstances", // "parameterOrder": [ @@ -33847,6 +36226,11 @@ func (c *InstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOpt // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the managed instance group is located.", // "location": "path", @@ -33888,10 +36272,9 @@ func (r *InstanceGroupManagersService) AggregatedList(project string) *InstanceG return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -33903,7 +36286,7 @@ func (r *InstanceGroupManagersService) AggregatedList(project string) *InstanceG // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -34059,7 +36442,7 @@ func (c *InstanceGroupManagersAggregatedListCall) Do(opts ...googleapi.CallOptio // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -34147,6 +36530,25 @@ func (r *InstanceGroupManagersService) Delete(project string, zone string, insta return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersDeleteCall) RequestId(requestId string) *InstanceGroupManagersDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -34252,6 +36654,11 @@ func (c *InstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Ope // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the managed instance group is located.", // "location": "path", @@ -34293,6 +36700,11 @@ type InstanceGroupManagersDeleteInstancesCall struct { // deleted. You must separately verify the status of the deleting action // with the listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *InstanceGroupManagersService) DeleteInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersdeleteinstancesrequest *InstanceGroupManagersDeleteInstancesRequest) *InstanceGroupManagersDeleteInstancesCall { @@ -34304,6 +36716,25 @@ func (r *InstanceGroupManagersService) DeleteInstances(project string, zone stri return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersDeleteInstancesCall) RequestId(requestId string) *InstanceGroupManagersDeleteInstancesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -34392,7 +36823,7 @@ func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOpti } return ret, nil // { - // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.deleteInstances", // "parameterOrder": [ @@ -34414,6 +36845,11 @@ func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOpti // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the managed instance group is located.", // "location": "path", @@ -34619,6 +37055,7 @@ type InstanceGroupManagersInsertCall struct { // with the listmanagedinstances method. // // A managed instance group can have up to 1000 VM instances per group. +// Please contact Cloud Support if you need an increase in this limit. func (r *InstanceGroupManagersService) Insert(project string, zone string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersInsertCall { c := &InstanceGroupManagersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -34627,6 +37064,25 @@ func (r *InstanceGroupManagersService) Insert(project string, zone string, insta return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersInsertCall) RequestId(requestId string) *InstanceGroupManagersInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -34714,7 +37170,7 @@ func (c *InstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group.", + // "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group. Please contact Cloud Support if you need an increase in this limit.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.insert", // "parameterOrder": [ @@ -34729,6 +37185,11 @@ func (c *InstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Ope // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where you want to create the managed instance group.", // "location": "path", @@ -34772,10 +37233,9 @@ func (r *InstanceGroupManagersService) List(project string, zone string) *Instan return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -34787,7 +37247,7 @@ func (r *InstanceGroupManagersService) List(project string, zone string) *Instan // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -34944,7 +37404,7 @@ func (c *InstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*Insta // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -35249,7 +37709,8 @@ type InstanceGroupManagersPatchCall struct { // group is patched even if the instances in the group are still in the // process of being patched. You must separately verify the status of // the individual instances with the listManagedInstances method. This -// method supports patch semantics. +// method supports PATCH semantics and uses the JSON merge patch format +// and processing rules. func (r *InstanceGroupManagersService) Patch(project string, zone string, instanceGroupManager string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersPatchCall { c := &InstanceGroupManagersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -35259,6 +37720,25 @@ func (r *InstanceGroupManagersService) Patch(project string, zone string, instan return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersPatchCall) RequestId(requestId string) *InstanceGroupManagersPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -35347,7 +37827,7 @@ func (c *InstanceGroupManagersPatchCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listManagedInstances method. This method supports patch semantics.", + // "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listManagedInstances method. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.instanceGroupManagers.patch", // "parameterOrder": [ @@ -35369,6 +37849,11 @@ func (c *InstanceGroupManagersPatchCall) Do(opts ...googleapi.CallOption) (*Oper // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where you want to create the managed instance group.", // "location": "path", @@ -35413,6 +37898,11 @@ type InstanceGroupManagersRecreateInstancesCall struct { // separately verify the status of the recreating action with the // listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *InstanceGroupManagersService) RecreateInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersrecreateinstancesrequest *InstanceGroupManagersRecreateInstancesRequest) *InstanceGroupManagersRecreateInstancesCall { @@ -35424,6 +37914,25 @@ func (r *InstanceGroupManagersService) RecreateInstances(project string, zone st return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersRecreateInstancesCall) RequestId(requestId string) *InstanceGroupManagersRecreateInstancesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -35512,7 +38021,7 @@ func (c *InstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOp } return ret, nil // { - // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.recreateInstances", // "parameterOrder": [ @@ -35534,6 +38043,11 @@ func (c *InstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOp // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the managed instance group is located.", // "location": "path", @@ -35575,6 +38089,10 @@ type InstanceGroupManagersResizeCall struct { // if the group has not yet added or deleted any instances. You must // separately verify the status of the creating or deleting actions with // the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or deleted. func (r *InstanceGroupManagersService) Resize(project string, zone string, instanceGroupManager string, size int64) *InstanceGroupManagersResizeCall { c := &InstanceGroupManagersResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -35584,6 +38102,25 @@ func (r *InstanceGroupManagersService) Resize(project string, zone string, insta return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersResizeCall) RequestId(requestId string) *InstanceGroupManagersResizeCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -35667,7 +38204,7 @@ func (c *InstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + // "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.resize", // "parameterOrder": [ @@ -35690,6 +38227,11 @@ func (c *InstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Ope // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "size": { // "description": "The number of running instances that the managed instance group should maintain at any given time. The group automatically adds or removes instances to maintain the number of instances specified by this parameter.", // "format": "int32", @@ -35740,6 +38282,10 @@ type InstanceGroupManagersResizeAdvancedCall struct { // yet added or deleted any instances. You must separately verify the // status of the creating, creatingWithoutRetries, or deleting actions // with the get or listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or deleted. func (r *InstanceGroupManagersService) ResizeAdvanced(project string, zone string, instanceGroupManager string, instancegroupmanagersresizeadvancedrequest *InstanceGroupManagersResizeAdvancedRequest) *InstanceGroupManagersResizeAdvancedCall { c := &InstanceGroupManagersResizeAdvancedCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -35749,6 +38295,25 @@ func (r *InstanceGroupManagersService) ResizeAdvanced(project string, zone strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersResizeAdvancedCall) RequestId(requestId string) *InstanceGroupManagersResizeAdvancedCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -35837,7 +38402,7 @@ func (c *InstanceGroupManagersResizeAdvancedCall) Do(opts ...googleapi.CallOptio } return ret, nil // { - // "description": "Resizes the managed instance group with advanced configuration options like disabling creation retries. This is an extended version of the resize method.\n\nIf you increase the size of the instance group, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating, creatingWithoutRetries, or deleting actions with the get or listmanagedinstances method.", + // "description": "Resizes the managed instance group with advanced configuration options like disabling creation retries. This is an extended version of the resize method.\n\nIf you increase the size of the instance group, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating, creatingWithoutRetries, or deleting actions with the get or listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", // "httpMethod": "POST", // "id": "compute.instanceGroupManagers.resizeAdvanced", // "parameterOrder": [ @@ -35859,6 +38424,11 @@ func (c *InstanceGroupManagersResizeAdvancedCall) Do(opts ...googleapi.CallOptio // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the managed instance group is located.", // "location": "path", @@ -35904,6 +38474,25 @@ func (r *InstanceGroupManagersService) SetAutoHealingPolicies(project string, zo return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersSetAutoHealingPoliciesCall) RequestId(requestId string) *InstanceGroupManagersSetAutoHealingPoliciesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -36014,6 +38603,11 @@ func (c *InstanceGroupManagersSetAutoHealingPoliciesCall) Do(opts ...googleapi.C // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the managed instance group is located.", // "location": "path", @@ -36061,6 +38655,25 @@ func (r *InstanceGroupManagersService) SetInstanceTemplate(project string, zone return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersSetInstanceTemplateCall) RequestId(requestId string) *InstanceGroupManagersSetInstanceTemplateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -36171,6 +38784,11 @@ func (c *InstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleapi.Call // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the managed instance group is located.", // "location": "path", @@ -36222,6 +38840,25 @@ func (r *InstanceGroupManagersService) SetTargetPools(project string, zone strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersSetTargetPoolsCall) RequestId(requestId string) *InstanceGroupManagersSetTargetPoolsCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -36332,6 +38969,11 @@ func (c *InstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.CallOptio // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the managed instance group is located.", // "location": "path", @@ -36540,6 +39182,25 @@ func (r *InstanceGroupManagersService) Update(project string, zone string, insta return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupManagersUpdateCall) RequestId(requestId string) *InstanceGroupManagersUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -36650,6 +39311,11 @@ func (c *InstanceGroupManagersUpdateCall) Do(opts ...googleapi.CallOption) (*Ope // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where you want to create the managed instance group.", // "location": "path", @@ -36697,6 +39363,25 @@ func (r *InstanceGroupsService) AddInstances(project string, zone string, instan return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupsAddInstancesCall) RequestId(requestId string) *InstanceGroupsAddInstancesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -36807,6 +39492,11 @@ func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Oper // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the instance group is located.", // "location": "path", @@ -36848,10 +39538,9 @@ func (r *InstanceGroupsService) AggregatedList(project string) *InstanceGroupsAg return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -36863,7 +39552,7 @@ func (r *InstanceGroupsService) AggregatedList(project string) *InstanceGroupsAg // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -37018,7 +39707,7 @@ func (c *InstanceGroupsAggregatedListCall) Do(opts ...googleapi.CallOption) (*In // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -37106,6 +39795,25 @@ func (r *InstanceGroupsService) Delete(project string, zone string, instanceGrou return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupsDeleteCall) RequestId(requestId string) *InstanceGroupsDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -37211,6 +39919,11 @@ func (c *InstanceGroupsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the instance group is located.", // "location": "path", @@ -37413,6 +40126,25 @@ func (r *InstanceGroupsService) Insert(project string, zone string, instancegrou return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupsInsertCall) RequestId(requestId string) *InstanceGroupsInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -37515,6 +40247,11 @@ func (c *InstanceGroupsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where you want to create the instance group.", // "location": "path", @@ -37558,10 +40295,9 @@ func (r *InstanceGroupsService) List(project string, zone string) *InstanceGroup return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -37573,7 +40309,7 @@ func (r *InstanceGroupsService) List(project string, zone string) *InstanceGroup // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -37730,7 +40466,7 @@ func (c *InstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*InstanceGrou // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -37823,10 +40559,9 @@ func (r *InstanceGroupsService) ListInstances(project string, zone string, insta return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -37838,7 +40573,7 @@ func (r *InstanceGroupsService) ListInstances(project string, zone string, insta // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -37989,7 +40724,7 @@ func (c *InstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) (*Ins // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -38083,6 +40818,10 @@ type InstanceGroupsRemoveInstancesCall struct { // RemoveInstances: Removes one or more instances from the specified // instance group, but does not delete those instances. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration before the VM instance is removed or deleted. func (r *InstanceGroupsService) RemoveInstances(project string, zone string, instanceGroup string, instancegroupsremoveinstancesrequest *InstanceGroupsRemoveInstancesRequest) *InstanceGroupsRemoveInstancesCall { c := &InstanceGroupsRemoveInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -38092,6 +40831,25 @@ func (r *InstanceGroupsService) RemoveInstances(project string, zone string, ins return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupsRemoveInstancesCall) RequestId(requestId string) *InstanceGroupsRemoveInstancesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -38180,7 +40938,7 @@ func (c *InstanceGroupsRemoveInstancesCall) Do(opts ...googleapi.CallOption) (*O } return ret, nil // { - // "description": "Removes one or more instances from the specified instance group, but does not delete those instances.", + // "description": "Removes one or more instances from the specified instance group, but does not delete those instances.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration before the VM instance is removed or deleted.", // "httpMethod": "POST", // "id": "compute.instanceGroups.removeInstances", // "parameterOrder": [ @@ -38202,6 +40960,11 @@ func (c *InstanceGroupsRemoveInstancesCall) Do(opts ...googleapi.CallOption) (*O // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the instance group is located.", // "location": "path", @@ -38247,6 +41010,25 @@ func (r *InstanceGroupsService) SetNamedPorts(project string, zone string, insta return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceGroupsSetNamedPortsCall) RequestId(requestId string) *InstanceGroupsSetNamedPortsCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -38357,6 +41139,11 @@ func (c *InstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) (*Ope // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone where the instance group is located.", // "location": "path", @@ -38562,6 +41349,25 @@ func (r *InstanceTemplatesService) Delete(project string, instanceTemplate strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceTemplatesDeleteCall) RequestId(requestId string) *InstanceTemplatesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -38665,6 +41471,11 @@ func (c *InstanceTemplatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/instanceTemplates/{instanceTemplate}", @@ -38856,6 +41667,25 @@ func (r *InstanceTemplatesService) Insert(project string, instancetemplate *Inst return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstanceTemplatesInsertCall) RequestId(requestId string) *InstanceTemplatesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -38955,6 +41785,11 @@ func (c *InstanceTemplatesInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/instanceTemplates", @@ -38992,10 +41827,9 @@ func (r *InstanceTemplatesService) List(project string) *InstanceTemplatesListCa return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -39007,7 +41841,7 @@ func (r *InstanceTemplatesService) List(project string) *InstanceTemplatesListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -39162,7 +41996,7 @@ func (c *InstanceTemplatesListCall) Do(opts ...googleapi.CallOption) (*InstanceT // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -39400,6 +42234,25 @@ func (r *InstancesService) AddAccessConfig(project string, zone string, instance return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesAddAccessConfigCall) RequestId(requestId string) *InstancesAddAccessConfigCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -39518,6 +42371,11 @@ func (c *InstancesAddAccessConfigCall) Do(opts ...googleapi.CallOption) (*Operat // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -39560,10 +42418,9 @@ func (r *InstancesService) AggregatedList(project string) *InstancesAggregatedLi return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -39575,7 +42432,7 @@ func (r *InstancesService) AggregatedList(project string) *InstancesAggregatedLi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -39730,7 +42587,7 @@ func (c *InstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Instanc // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -39807,7 +42664,10 @@ type InstancesAttachDiskCall struct { header_ http.Header } -// AttachDisk: Attaches a Disk resource to an instance. +// AttachDisk: Attaches an existing Disk resource to an instance. You +// must first create the disk before you can attach it. It is not +// possible to create and attach a disk at the same time. For more +// information, read Adding a persistent disk to your instance. // For details, see https://cloud.google.com/compute/docs/reference/latest/instances/attachDisk func (r *InstancesService) AttachDisk(project string, zone string, instance string, attacheddisk *AttachedDisk) *InstancesAttachDiskCall { c := &InstancesAttachDiskCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -39818,6 +42678,25 @@ func (r *InstancesService) AttachDisk(project string, zone string, instance stri return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesAttachDiskCall) RequestId(requestId string) *InstancesAttachDiskCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -39906,7 +42785,7 @@ func (c *InstancesAttachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Attaches a Disk resource to an instance.", + // "description": "Attaches an existing Disk resource to an instance. You must first create the disk before you can attach it. It is not possible to create and attach a disk at the same time. For more information, read Adding a persistent disk to your instance.", // "httpMethod": "POST", // "id": "compute.instances.attachDisk", // "parameterOrder": [ @@ -39929,6 +42808,11 @@ func (c *InstancesAttachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -39975,6 +42859,25 @@ func (r *InstancesService) Delete(project string, zone string, instance string) return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesDeleteCall) RequestId(requestId string) *InstancesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -40081,6 +42984,11 @@ func (c *InstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -40126,6 +43034,25 @@ func (r *InstancesService) DeleteAccessConfig(project string, zone string, insta return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesDeleteAccessConfigCall) RequestId(requestId string) *InstancesDeleteAccessConfigCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -40246,6 +43173,11 @@ func (c *InstancesDeleteAccessConfigCall) Do(opts ...googleapi.CallOption) (*Ope // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -40289,6 +43221,25 @@ func (r *InstancesService) DetachDisk(project string, zone string, instance stri return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesDetachDiskCall) RequestId(requestId string) *InstancesDetachDiskCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -40402,6 +43353,11 @@ func (c *InstancesDetachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -40806,6 +43762,25 @@ func (r *InstancesService) Insert(project string, zone string, instance *Instanc return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesInsertCall) RequestId(requestId string) *InstancesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -40908,6 +43883,11 @@ func (c *InstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -40953,10 +43933,9 @@ func (r *InstancesService) List(project string, zone string) *InstancesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -40968,7 +43947,7 @@ func (r *InstancesService) List(project string, zone string) *InstancesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -41125,7 +44104,7 @@ func (c *InstancesListCall) Do(opts ...googleapi.CallOption) (*InstanceList, err // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -41219,10 +44198,9 @@ func (r *InstancesService) ListReferrers(project string, zone string, instance s return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -41234,7 +44212,7 @@ func (r *InstancesService) ListReferrers(project string, zone string, instance s // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -41393,7 +44371,7 @@ func (c *InstancesListReferrersCall) Do(opts ...googleapi.CallOption) (*Instance // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -41494,6 +44472,25 @@ func (r *InstancesService) Reset(project string, zone string, instance string) * return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesResetCall) RequestId(requestId string) *InstancesResetCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -41600,6 +44597,11 @@ func (c *InstancesResetCall) Do(opts ...googleapi.CallOption) (*Operation, error // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -41645,6 +44647,25 @@ func (r *InstancesService) SetDiskAutoDelete(project string, zone string, instan return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesSetDiskAutoDeleteCall) RequestId(requestId string) *InstancesSetDiskAutoDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -41766,6 +44787,11 @@ func (c *InstancesSetDiskAutoDeleteCall) Do(opts ...googleapi.CallOption) (*Oper // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -41800,7 +44826,7 @@ type InstancesSetLabelsCall struct { } // SetLabels: Sets labels on an instance. To learn more about labels, -// read the Labeling or Tagging Resources documentation. +// read the Labeling Resources documentation. func (r *InstancesService) SetLabels(project string, zone string, instance string, instancessetlabelsrequest *InstancesSetLabelsRequest) *InstancesSetLabelsCall { c := &InstancesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -41810,6 +44836,25 @@ func (r *InstancesService) SetLabels(project string, zone string, instance strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesSetLabelsCall) RequestId(requestId string) *InstancesSetLabelsCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -41898,7 +44943,7 @@ func (c *InstancesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, e } return ret, nil // { - // "description": "Sets labels on an instance. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets labels on an instance. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.instances.setLabels", // "parameterOrder": [ @@ -41921,6 +44966,11 @@ func (c *InstancesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, e // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -41968,6 +45018,25 @@ func (r *InstancesService) SetMachineResources(project string, zone string, inst return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesSetMachineResourcesCall) RequestId(requestId string) *InstancesSetMachineResourcesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -42079,6 +45148,11 @@ func (c *InstancesSetMachineResourcesCall) Do(opts ...googleapi.CallOption) (*Op // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -42126,6 +45200,25 @@ func (r *InstancesService) SetMachineType(project string, zone string, instance return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesSetMachineTypeCall) RequestId(requestId string) *InstancesSetMachineTypeCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -42237,6 +45330,11 @@ func (c *InstancesSetMachineTypeCall) Do(opts ...googleapi.CallOption) (*Operati // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -42285,6 +45383,25 @@ func (r *InstancesService) SetMetadata(project string, zone string, instance str return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesSetMetadataCall) RequestId(requestId string) *InstancesSetMetadataCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -42396,6 +45513,11 @@ func (c *InstancesSetMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -42419,6 +45541,190 @@ func (c *InstancesSetMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, } +// method id "compute.instances.setMinCpuPlatform": + +type InstancesSetMinCpuPlatformCall struct { + s *Service + project string + zone string + instance string + instancessetmincpuplatformrequest *InstancesSetMinCpuPlatformRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetMinCpuPlatform: Changes the minimum CPU platform that this +// instance should use. This method can only be called on a stopped +// instance. For more information, read Specifying a Minimum CPU +// Platform. +func (r *InstancesService) SetMinCpuPlatform(project string, zone string, instance string, instancessetmincpuplatformrequest *InstancesSetMinCpuPlatformRequest) *InstancesSetMinCpuPlatformCall { + c := &InstancesSetMinCpuPlatformCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.zone = zone + c.instance = instance + c.instancessetmincpuplatformrequest = instancessetmincpuplatformrequest + return c +} + +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesSetMinCpuPlatformCall) RequestId(requestId string) *InstancesSetMinCpuPlatformCall { + c.urlParams_.Set("requestId", requestId) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstancesSetMinCpuPlatformCall) Fields(s ...googleapi.Field) *InstancesSetMinCpuPlatformCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstancesSetMinCpuPlatformCall) Context(ctx context.Context) *InstancesSetMinCpuPlatformCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstancesSetMinCpuPlatformCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstancesSetMinCpuPlatformCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetmincpuplatformrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "zone": c.zone, + "instance": c.instance, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instances.setMinCpuPlatform" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstancesSetMinCpuPlatformCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Changes the minimum CPU platform that this instance should use. This method can only be called on a stopped instance. For more information, read Specifying a Minimum CPU Platform.", + // "httpMethod": "POST", + // "id": "compute.instances.setMinCpuPlatform", + // "parameterOrder": [ + // "project", + // "zone", + // "instance" + // ], + // "parameters": { + // "instance": { + // "description": "Name of the instance scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform", + // "request": { + // "$ref": "InstancesSetMinCpuPlatformRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + // method id "compute.instances.setScheduling": type InstancesSetSchedulingCall struct { @@ -42443,6 +45749,25 @@ func (r *InstancesService) SetScheduling(project string, zone string, instance s return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesSetSchedulingCall) RequestId(requestId string) *InstancesSetSchedulingCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -42554,6 +45879,11 @@ func (c *InstancesSetSchedulingCall) Do(opts ...googleapi.CallOption) (*Operatio // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -42602,6 +45932,25 @@ func (r *InstancesService) SetServiceAccount(project string, zone string, instan return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesSetServiceAccountCall) RequestId(requestId string) *InstancesSetServiceAccountCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -42713,6 +46062,11 @@ func (c *InstancesSetServiceAccountCall) Do(opts ...googleapi.CallOption) (*Oper // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -42761,6 +46115,25 @@ func (r *InstancesService) SetTags(project string, zone string, instance string, return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesSetTagsCall) RequestId(requestId string) *InstancesSetTagsCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -42872,6 +46245,11 @@ func (c *InstancesSetTagsCall) Do(opts ...googleapi.CallOption) (*Operation, err // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -42919,6 +46297,25 @@ func (r *InstancesService) Start(project string, zone string, instance string) * return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesStartCall) RequestId(requestId string) *InstancesStartCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -43025,6 +46422,11 @@ func (c *InstancesStartCall) Do(opts ...googleapi.CallOption) (*Operation, error // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -43070,6 +46472,25 @@ func (r *InstancesService) StartWithEncryptionKey(project string, zone string, i return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesStartWithEncryptionKeyCall) RequestId(requestId string) *InstancesStartWithEncryptionKeyCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -43181,6 +46602,11 @@ func (c *InstancesStartWithEncryptionKeyCall) Do(opts ...googleapi.CallOption) ( // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -43232,6 +46658,25 @@ func (r *InstancesService) Stop(project string, zone string, instance string) *I return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *InstancesStopCall) RequestId(requestId string) *InstancesStopCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -43338,6 +46783,11 @@ func (c *InstancesStopCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -43529,8 +46979,7 @@ type LicensesGetCall struct { header_ http.Header } -// Get: Returns the specified License resource. Get a list of available -// licenses by making a list() request. +// Get: Returns the specified License resource. // For details, see https://cloud.google.com/compute/docs/reference/latest/licenses/get func (r *LicensesService) Get(project string, license string) *LicensesGetCall { c := &LicensesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -43634,7 +47083,7 @@ func (c *LicensesGetCall) Do(opts ...googleapi.CallOption) (*License, error) { } return ret, nil // { - // "description": "Returns the specified License resource. Get a list of available licenses by making a list() request.", + // "description": "Returns the specified License resource.", // "httpMethod": "GET", // "id": "compute.licenses.get", // "parameterOrder": [ @@ -43689,10 +47138,9 @@ func (r *MachineTypesService) AggregatedList(project string) *MachineTypesAggreg return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -43704,7 +47152,7 @@ func (r *MachineTypesService) AggregatedList(project string) *MachineTypesAggreg // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -43859,7 +47307,7 @@ func (c *MachineTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Mach // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -44109,10 +47557,9 @@ func (r *MachineTypesService) List(project string, zone string) *MachineTypesLis return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -44124,7 +47571,7 @@ func (r *MachineTypesService) List(project string, zone string) *MachineTypesLis // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -44281,7 +47728,7 @@ func (c *MachineTypesListCall) Do(opts ...googleapi.CallOption) (*MachineTypeLis // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -44373,6 +47820,25 @@ func (r *NetworksService) AddPeering(project string, network string, networksadd return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *NetworksAddPeeringCall) RequestId(requestId string) *NetworksAddPeeringCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -44481,6 +47947,11 @@ func (c *NetworksAddPeeringCall) Do(opts ...googleapi.CallOption) (*Operation, e // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/networks/{network}/addPeering", @@ -44518,6 +47989,25 @@ func (r *NetworksService) Delete(project string, network string) *NetworksDelete return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *NetworksDeleteCall) RequestId(requestId string) *NetworksDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -44621,6 +48111,11 @@ func (c *NetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/networks/{network}", @@ -44809,6 +48304,25 @@ func (r *NetworksService) Insert(project string, network *Network) *NetworksInse return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *NetworksInsertCall) RequestId(requestId string) *NetworksInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -44908,6 +48422,11 @@ func (c *NetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/networks", @@ -44945,10 +48464,9 @@ func (r *NetworksService) List(project string) *NetworksListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -44960,7 +48478,7 @@ func (r *NetworksService) List(project string) *NetworksListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -45115,7 +48633,7 @@ func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -45200,6 +48718,25 @@ func (r *NetworksService) RemovePeering(project string, network string, networks return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *NetworksRemovePeeringCall) RequestId(requestId string) *NetworksRemovePeeringCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -45308,6 +48845,11 @@ func (c *NetworksRemovePeeringCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/networks/{network}/removePeering", @@ -45345,6 +48887,25 @@ func (r *NetworksService) SwitchToCustomMode(project string, network string) *Ne return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *NetworksSwitchToCustomModeCall) RequestId(requestId string) *NetworksSwitchToCustomModeCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -45448,6 +49009,11 @@ func (c *NetworksSwitchToCustomModeCall) Do(opts ...googleapi.CallOption) (*Oper // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/networks/{network}/switchToCustomMode", @@ -45620,13 +49186,32 @@ type ProjectsDisableXpnHostCall struct { header_ http.Header } -// DisableXpnHost: Disable this project as an XPN host project. +// DisableXpnHost: Disable this project as a shared VPC host project. func (r *ProjectsService) DisableXpnHost(project string) *ProjectsDisableXpnHostCall { c := &ProjectsDisableXpnHostCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ProjectsDisableXpnHostCall) RequestId(requestId string) *ProjectsDisableXpnHostCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -45708,7 +49293,7 @@ func (c *ProjectsDisableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Disable this project as an XPN host project.", + // "description": "Disable this project as a shared VPC host project.", // "httpMethod": "POST", // "id": "compute.projects.disableXpnHost", // "parameterOrder": [ @@ -45721,6 +49306,11 @@ func (c *ProjectsDisableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operatio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/disableXpnHost", @@ -45746,8 +49336,8 @@ type ProjectsDisableXpnResourceCall struct { header_ http.Header } -// DisableXpnResource: Disable an XPN resource associated with this host -// project. +// DisableXpnResource: Disable a serivce resource (a.k.a service +// project) associated with this host project. func (r *ProjectsService) DisableXpnResource(project string, projectsdisablexpnresourcerequest *ProjectsDisableXpnResourceRequest) *ProjectsDisableXpnResourceCall { c := &ProjectsDisableXpnResourceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -45755,6 +49345,25 @@ func (r *ProjectsService) DisableXpnResource(project string, projectsdisablexpnr return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ProjectsDisableXpnResourceCall) RequestId(requestId string) *ProjectsDisableXpnResourceCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -45841,7 +49450,7 @@ func (c *ProjectsDisableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Disable an XPN resource associated with this host project.", + // "description": "Disable a serivce resource (a.k.a service project) associated with this host project.", // "httpMethod": "POST", // "id": "compute.projects.disableXpnResource", // "parameterOrder": [ @@ -45854,6 +49463,11 @@ func (c *ProjectsDisableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Oper // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/disableXpnResource", @@ -45881,13 +49495,32 @@ type ProjectsEnableXpnHostCall struct { header_ http.Header } -// EnableXpnHost: Enable this project as an XPN host project. +// EnableXpnHost: Enable this project as a shared VPC host project. func (r *ProjectsService) EnableXpnHost(project string) *ProjectsEnableXpnHostCall { c := &ProjectsEnableXpnHostCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ProjectsEnableXpnHostCall) RequestId(requestId string) *ProjectsEnableXpnHostCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -45969,7 +49602,7 @@ func (c *ProjectsEnableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Enable this project as an XPN host project.", + // "description": "Enable this project as a shared VPC host project.", // "httpMethod": "POST", // "id": "compute.projects.enableXpnHost", // "parameterOrder": [ @@ -45982,6 +49615,11 @@ func (c *ProjectsEnableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/enableXpnHost", @@ -46007,10 +49645,9 @@ type ProjectsEnableXpnResourceCall struct { header_ http.Header } -// EnableXpnResource: Enable XPN resource (a.k.a service project or -// service folder in the future) for a host project, so that subnetworks -// in the host project can be used by instances in the service project -// or folder. +// EnableXpnResource: Enable service resource (a.k.a service project) +// for a host project, so that subnets in the host project can be used +// by instances in the service project. func (r *ProjectsService) EnableXpnResource(project string, projectsenablexpnresourcerequest *ProjectsEnableXpnResourceRequest) *ProjectsEnableXpnResourceCall { c := &ProjectsEnableXpnResourceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -46018,6 +49655,25 @@ func (r *ProjectsService) EnableXpnResource(project string, projectsenablexpnres return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ProjectsEnableXpnResourceCall) RequestId(requestId string) *ProjectsEnableXpnResourceCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -46104,7 +49760,7 @@ func (c *ProjectsEnableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Opera } return ret, nil // { - // "description": "Enable XPN resource (a.k.a service project or service folder in the future) for a host project, so that subnetworks in the host project can be used by instances in the service project or folder.", + // "description": "Enable service resource (a.k.a service project) for a host project, so that subnets in the host project can be used by instances in the service project.", // "httpMethod": "POST", // "id": "compute.projects.enableXpnResource", // "parameterOrder": [ @@ -46117,6 +49773,11 @@ func (c *ProjectsEnableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Opera // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/enableXpnResource", @@ -46286,8 +49947,8 @@ type ProjectsGetXpnHostCall struct { header_ http.Header } -// GetXpnHost: Get the XPN host project that this project links to. May -// be empty if no link exists. +// GetXpnHost: Get the shared VPC host project that this project links +// to. May be empty if no link exists. func (r *ProjectsService) GetXpnHost(project string) *ProjectsGetXpnHostCall { c := &ProjectsGetXpnHostCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -46388,7 +50049,7 @@ func (c *ProjectsGetXpnHostCall) Do(opts ...googleapi.CallOption) (*Project, err } return ret, nil // { - // "description": "Get the XPN host project that this project links to. May be empty if no link exists.", + // "description": "Get the shared VPC host project that this project links to. May be empty if no link exists.", // "httpMethod": "GET", // "id": "compute.projects.getXpnHost", // "parameterOrder": [ @@ -46409,8 +50070,7 @@ func (c *ProjectsGetXpnHostCall) Do(opts ...googleapi.CallOption) (*Project, err // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } @@ -46427,7 +50087,8 @@ type ProjectsGetXpnResourcesCall struct { header_ http.Header } -// GetXpnResources: Get XPN resources associated with this host project. +// GetXpnResources: Get service resources (a.k.a service project) +// associated with this host project. func (r *ProjectsService) GetXpnResources(project string) *ProjectsGetXpnResourcesCall { c := &ProjectsGetXpnResourcesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -46552,7 +50213,7 @@ func (c *ProjectsGetXpnResourcesCall) Do(opts ...googleapi.CallOption) (*Project } return ret, nil // { - // "description": "Get XPN resources associated with this host project.", + // "description": "Get service resources (a.k.a service project) associated with this host project.", // "httpMethod": "GET", // "id": "compute.projects.getXpnResources", // "parameterOrder": [ @@ -46592,8 +50253,7 @@ func (c *ProjectsGetXpnResourcesCall) Do(opts ...googleapi.CallOption) (*Project // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } @@ -46631,8 +50291,8 @@ type ProjectsListXpnHostsCall struct { header_ http.Header } -// ListXpnHosts: List all XPN host projects visible to the user in an -// organization. +// ListXpnHosts: List all shared VPC host projects visible to the user +// in an organization. func (r *ProjectsService) ListXpnHosts(project string, projectslistxpnhostsrequest *ProjectsListXpnHostsRequest) *ProjectsListXpnHostsCall { c := &ProjectsListXpnHostsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -46750,7 +50410,7 @@ func (c *ProjectsListXpnHostsCall) Do(opts ...googleapi.CallOption) (*XpnHostLis } return ret, nil // { - // "description": "List all XPN host projects visible to the user in an organization.", + // "description": "List all shared VPC host projects visible to the user in an organization.", // "httpMethod": "POST", // "id": "compute.projects.listXpnHosts", // "parameterOrder": [ @@ -46793,8 +50453,7 @@ func (c *ProjectsListXpnHostsCall) Do(opts ...googleapi.CallOption) (*XpnHostLis // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } @@ -46840,6 +50499,25 @@ func (r *ProjectsService) MoveDisk(project string, diskmoverequest *DiskMoveRequ return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ProjectsMoveDiskCall) RequestId(requestId string) *ProjectsMoveDiskCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -46939,6 +50617,11 @@ func (c *ProjectsMoveDiskCall) Do(opts ...googleapi.CallOption) (*Operation, err // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/moveDisk", @@ -46976,6 +50659,25 @@ func (r *ProjectsService) MoveInstance(project string, instancemoverequest *Inst return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ProjectsMoveInstanceCall) RequestId(requestId string) *ProjectsMoveInstanceCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -47075,6 +50777,11 @@ func (c *ProjectsMoveInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/moveInstance", @@ -47113,6 +50820,25 @@ func (r *ProjectsService) SetCommonInstanceMetadata(project string, metadata *Me return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ProjectsSetCommonInstanceMetadataCall) RequestId(requestId string) *ProjectsSetCommonInstanceMetadataCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -47212,6 +50938,11 @@ func (c *ProjectsSetCommonInstanceMetadataCall) Do(opts ...googleapi.CallOption) // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/setCommonInstanceMetadata", @@ -47252,6 +50983,25 @@ func (r *ProjectsService) SetUsageExportBucket(project string, usageexportlocati return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *ProjectsSetUsageExportBucketCall) RequestId(requestId string) *ProjectsSetUsageExportBucketCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -47351,6 +51101,11 @@ func (c *ProjectsSetUsageExportBucketCall) Do(opts ...googleapi.CallOption) (*Op // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/setUsageExportBucket", @@ -47392,6 +51147,25 @@ func (r *RegionAutoscalersService) Delete(project string, region string, autosca return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionAutoscalersDeleteCall) RequestId(requestId string) *RegionAutoscalersDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -47504,6 +51278,11 @@ func (c *RegionAutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/autoscalers/{autoscaler}", @@ -47702,6 +51481,25 @@ func (r *RegionAutoscalersService) Insert(project string, region string, autosca return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionAutoscalersInsertCall) RequestId(requestId string) *RegionAutoscalersInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -47810,6 +51608,11 @@ func (c *RegionAutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/autoscalers", @@ -47848,10 +51651,9 @@ func (r *RegionAutoscalersService) List(project string, region string) *RegionAu return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -47863,7 +51665,7 @@ func (r *RegionAutoscalersService) List(project string, region string) *RegionAu // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -48020,7 +51822,7 @@ func (c *RegionAutoscalersListCall) Do(opts ...googleapi.CallOption) (*RegionAut // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -48104,7 +51906,8 @@ type RegionAutoscalersPatchCall struct { } // Patch: Updates an autoscaler in the specified project using the data -// included in the request. This method supports patch semantics. +// included in the request. This method supports PATCH semantics and +// uses the JSON merge patch format and processing rules. func (r *RegionAutoscalersService) Patch(project string, region string, autoscaler *Autoscaler) *RegionAutoscalersPatchCall { c := &RegionAutoscalersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -48120,6 +51923,25 @@ func (c *RegionAutoscalersPatchCall) Autoscaler(autoscaler string) *RegionAutosc return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and then the request times out. If you make the request again with +// the same request ID, the server can check if original operation with +// the same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionAutoscalersPatchCall) RequestId(requestId string) *RegionAutoscalersPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -48207,7 +52029,7 @@ func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.regionAutoscalers.patch", // "parameterOrder": [ @@ -48234,6 +52056,11 @@ func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operatio // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/autoscalers", @@ -48440,6 +52267,22 @@ func (c *RegionAutoscalersUpdateCall) Autoscaler(autoscaler string) *RegionAutos return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and then the request times out. If you make the request again with +// the same request ID, the server can check if original operation with +// the same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +func (c *RegionAutoscalersUpdateCall) RequestId(requestId string) *RegionAutoscalersUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -48554,6 +52397,11 @@ func (c *RegionAutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and then the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/autoscalers", @@ -48592,6 +52440,25 @@ func (r *RegionBackendServicesService) Delete(project string, region string, bac return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionBackendServicesDeleteCall) RequestId(requestId string) *RegionBackendServicesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -48704,6 +52571,11 @@ func (c *RegionBackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/backendServices/{backendService}", @@ -49063,6 +52935,25 @@ func (r *RegionBackendServicesService) Insert(project string, region string, bac return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionBackendServicesInsertCall) RequestId(requestId string) *RegionBackendServicesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -49171,6 +53062,11 @@ func (c *RegionBackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/backendServices", @@ -49209,10 +53105,9 @@ func (r *RegionBackendServicesService) List(project string, region string) *Regi return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -49224,7 +53119,7 @@ func (r *RegionBackendServicesService) List(project string, region string) *Regi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -49381,7 +53276,7 @@ func (c *RegionBackendServicesListCall) Do(opts ...googleapi.CallOption) (*Backe // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -49469,7 +53364,8 @@ type RegionBackendServicesPatchCall struct { // the data included in the request. There are several restrictions and // guidelines to keep in mind when updating a backend service. Read // Restrictions and Guidelines for more information. This method -// supports patch semantics. +// supports PATCH semantics and uses the JSON merge patch format and +// processing rules. func (r *RegionBackendServicesService) Patch(project string, region string, backendService string, backendservice *BackendService) *RegionBackendServicesPatchCall { c := &RegionBackendServicesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -49479,6 +53375,25 @@ func (r *RegionBackendServicesService) Patch(project string, region string, back return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionBackendServicesPatchCall) RequestId(requestId string) *RegionBackendServicesPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -49567,7 +53482,7 @@ func (c *RegionBackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + // "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.regionBackendServices.patch", // "parameterOrder": [ @@ -49596,6 +53511,11 @@ func (c *RegionBackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Oper // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/backendServices/{backendService}", @@ -49799,6 +53719,25 @@ func (r *RegionBackendServicesService) Update(project string, region string, bac return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionBackendServicesUpdateCall) RequestId(requestId string) *RegionBackendServicesUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -49916,6 +53855,11 @@ func (c *RegionBackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/backendServices/{backendService}", @@ -49951,10 +53895,9 @@ func (r *RegionCommitmentsService) AggregatedList(project string) *RegionCommitm return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -49966,7 +53909,7 @@ func (r *RegionCommitmentsService) AggregatedList(project string) *RegionCommitm // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -50121,7 +54064,7 @@ func (c *RegionCommitmentsAggregatedListCall) Do(opts ...googleapi.CallOption) ( // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -50360,7 +54303,7 @@ type RegionCommitmentsInsertCall struct { header_ http.Header } -// Insert: Creates an commitment in the specified project using the data +// Insert: Creates a commitment in the specified project using the data // included in the request. func (r *RegionCommitmentsService) Insert(project string, region string, commitment *Commitment) *RegionCommitmentsInsertCall { c := &RegionCommitmentsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -50370,6 +54313,25 @@ func (r *RegionCommitmentsService) Insert(project string, region string, commitm return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionCommitmentsInsertCall) RequestId(requestId string) *RegionCommitmentsInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -50457,7 +54419,7 @@ func (c *RegionCommitmentsInsertCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Creates an commitment in the specified project using the data included in the request.", + // "description": "Creates a commitment in the specified project using the data included in the request.", // "httpMethod": "POST", // "id": "compute.regionCommitments.insert", // "parameterOrder": [ @@ -50478,6 +54440,11 @@ func (c *RegionCommitmentsInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/commitments", @@ -50516,10 +54483,9 @@ func (r *RegionCommitmentsService) List(project string, region string) *RegionCo return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -50531,7 +54497,7 @@ func (r *RegionCommitmentsService) List(project string, region string) *RegionCo // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -50688,7 +54654,7 @@ func (c *RegionCommitmentsListCall) Do(opts ...googleapi.CallOption) (*Commitmen // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -50782,6 +54748,11 @@ type RegionInstanceGroupManagersAbandonInstancesCall struct { // been removed from the group. You must separately verify the status of // the abandoning action with the listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *RegionInstanceGroupManagersService) AbandonInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersabandoninstancesrequest *RegionInstanceGroupManagersAbandonInstancesRequest) *RegionInstanceGroupManagersAbandonInstancesCall { @@ -50793,6 +54764,25 @@ func (r *RegionInstanceGroupManagersService) AbandonInstances(project string, re return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersAbandonInstancesCall) RequestId(requestId string) *RegionInstanceGroupManagersAbandonInstancesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -50881,7 +54871,7 @@ func (c *RegionInstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.C } return ret, nil // { - // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.regionInstanceGroupManagers.abandonInstances", // "parameterOrder": [ @@ -50908,6 +54898,11 @@ func (c *RegionInstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.C // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", @@ -50947,6 +54942,25 @@ func (r *RegionInstanceGroupManagersService) Delete(project string, region strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersDeleteCall) RequestId(requestId string) *RegionInstanceGroupManagersDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -51057,6 +55071,11 @@ func (c *RegionInstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", @@ -51093,6 +55112,11 @@ type RegionInstanceGroupManagersDeleteInstancesCall struct { // deleted. You must separately verify the status of the deleting action // with the listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *RegionInstanceGroupManagersService) DeleteInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersdeleteinstancesrequest *RegionInstanceGroupManagersDeleteInstancesRequest) *RegionInstanceGroupManagersDeleteInstancesCall { @@ -51104,6 +55128,25 @@ func (r *RegionInstanceGroupManagersService) DeleteInstances(project string, reg return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersDeleteInstancesCall) RequestId(requestId string) *RegionInstanceGroupManagersDeleteInstancesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -51192,7 +55235,7 @@ func (c *RegionInstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.Ca } return ret, nil // { - // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.regionInstanceGroupManagers.deleteInstances", // "parameterOrder": [ @@ -51219,6 +55262,11 @@ func (c *RegionInstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.Ca // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", @@ -51426,6 +55474,25 @@ func (r *RegionInstanceGroupManagersService) Insert(project string, region strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersInsertCall) RequestId(requestId string) *RegionInstanceGroupManagersInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -51533,6 +55600,11 @@ func (c *RegionInstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers", @@ -51571,10 +55643,9 @@ func (r *RegionInstanceGroupManagersService) List(project string, region string) return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -51586,7 +55657,7 @@ func (r *RegionInstanceGroupManagersService) List(project string, region string) // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -51743,7 +55814,7 @@ func (c *RegionInstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) ( // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -52046,7 +56117,8 @@ type RegionInstanceGroupManagersPatchCall struct { // group is patched even if the instances in the group are still in the // process of being patched. You must separately verify the status of // the individual instances with the listmanagedinstances method. This -// method supports patch semantics. +// method supports PATCH semantics and uses the JSON merge patch format +// and processing rules. func (r *RegionInstanceGroupManagersService) Patch(project string, region string, instanceGroupManager string, instancegroupmanager *InstanceGroupManager) *RegionInstanceGroupManagersPatchCall { c := &RegionInstanceGroupManagersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -52056,6 +56128,25 @@ func (r *RegionInstanceGroupManagersService) Patch(project string, region string return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersPatchCall) RequestId(requestId string) *RegionInstanceGroupManagersPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -52144,7 +56235,7 @@ func (c *RegionInstanceGroupManagersPatchCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.", + // "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is patched even if the instances in the group are still in the process of being patched. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.regionInstanceGroupManagers.patch", // "parameterOrder": [ @@ -52171,6 +56262,11 @@ func (c *RegionInstanceGroupManagersPatchCall) Do(opts ...googleapi.CallOption) // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", @@ -52210,6 +56306,11 @@ type RegionInstanceGroupManagersRecreateInstancesCall struct { // separately verify the status of the recreating action with the // listmanagedinstances method. // +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// // You can specify a maximum of 1000 instances with this method per // request. func (r *RegionInstanceGroupManagersService) RecreateInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersrecreaterequest *RegionInstanceGroupManagersRecreateRequest) *RegionInstanceGroupManagersRecreateInstancesCall { @@ -52221,6 +56322,25 @@ func (r *RegionInstanceGroupManagersService) RecreateInstances(project string, r return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersRecreateInstancesCall) RequestId(requestId string) *RegionInstanceGroupManagersRecreateInstancesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -52309,7 +56429,7 @@ func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi. } return ret, nil // { - // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", // "id": "compute.regionInstanceGroupManagers.recreateInstances", // "parameterOrder": [ @@ -52336,6 +56456,11 @@ func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi. // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", @@ -52373,6 +56498,10 @@ type RegionInstanceGroupManagersResizeCall struct { // scheduled even if the group has not yet added or deleted any // instances. You must separately verify the status of the creating or // deleting actions with the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or deleted. func (r *RegionInstanceGroupManagersService) Resize(project string, region string, instanceGroupManager string, size int64) *RegionInstanceGroupManagersResizeCall { c := &RegionInstanceGroupManagersResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -52382,6 +56511,25 @@ func (r *RegionInstanceGroupManagersService) Resize(project string, region strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersResizeCall) RequestId(requestId string) *RegionInstanceGroupManagersResizeCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -52465,7 +56613,7 @@ func (c *RegionInstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + // "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", // "httpMethod": "POST", // "id": "compute.regionInstanceGroupManagers.resize", // "parameterOrder": [ @@ -52494,6 +56642,11 @@ func (c *RegionInstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "size": { // "description": "Number of instances that should exist in this instance group manager.", // "format": "int32", @@ -52539,6 +56692,25 @@ func (r *RegionInstanceGroupManagersService) SetAutoHealingPolicies(project stri return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersSetAutoHealingPoliciesCall) RequestId(requestId string) *RegionInstanceGroupManagersSetAutoHealingPoliciesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -52654,6 +56826,11 @@ func (c *RegionInstanceGroupManagersSetAutoHealingPoliciesCall) Do(opts ...googl // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setAutoHealingPolicies", @@ -52696,6 +56873,25 @@ func (r *RegionInstanceGroupManagersService) SetInstanceTemplate(project string, return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) RequestId(requestId string) *RegionInstanceGroupManagersSetInstanceTemplateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -52811,6 +57007,11 @@ func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleap // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate", @@ -52853,6 +57054,25 @@ func (r *RegionInstanceGroupManagersService) SetTargetPools(project string, regi return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersSetTargetPoolsCall) RequestId(requestId string) *RegionInstanceGroupManagersSetTargetPoolsCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -52968,6 +57188,11 @@ func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.Cal // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools", @@ -53171,6 +57396,25 @@ func (r *RegionInstanceGroupManagersService) Update(project string, region strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupManagersUpdateCall) RequestId(requestId string) *RegionInstanceGroupManagersUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -53286,6 +57530,11 @@ func (c *RegionInstanceGroupManagersUpdateCall) Do(opts ...googleapi.CallOption) // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", @@ -53484,10 +57733,9 @@ func (r *RegionInstanceGroupsService) List(project string, region string) *Regio return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -53499,7 +57747,7 @@ func (r *RegionInstanceGroupsService) List(project string, region string) *Regio // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -53656,7 +57904,7 @@ func (c *RegionInstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*Region // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -53752,10 +58000,9 @@ func (r *RegionInstanceGroupsService) ListInstances(project string, region strin return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -53767,7 +58014,7 @@ func (r *RegionInstanceGroupsService) ListInstances(project string, region strin // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -53919,7 +58166,7 @@ func (c *RegionInstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -54022,6 +58269,25 @@ func (r *RegionInstanceGroupsService) SetNamedPorts(project string, region strin return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RegionInstanceGroupsSetNamedPortsCall) RequestId(requestId string) *RegionInstanceGroupsSetNamedPortsCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -54137,6 +58403,11 @@ func (c *RegionInstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) // "location": "path", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts", @@ -54618,10 +58889,9 @@ func (r *RegionOperationsService) List(project string, region string) *RegionOpe return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -54633,7 +58903,7 @@ func (r *RegionOperationsService) List(project string, region string) *RegionOpe // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -54790,7 +59060,7 @@ func (c *RegionOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -55034,10 +59304,9 @@ func (r *RegionsService) List(project string) *RegionsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -55049,7 +59318,7 @@ func (r *RegionsService) List(project string) *RegionsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -55204,7 +59473,7 @@ func (c *RegionsListCall) Do(opts ...googleapi.CallOption) (*RegionList, error) // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -55286,10 +59555,9 @@ func (r *RoutersService) AggregatedList(project string) *RoutersAggregatedListCa return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -55301,7 +59569,7 @@ func (r *RoutersService) AggregatedList(project string) *RoutersAggregatedListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -55456,7 +59724,7 @@ func (c *RoutersAggregatedListCall) Do(opts ...googleapi.CallOption) (*RouterAgg // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -55541,6 +59809,25 @@ func (r *RoutersService) Delete(project string, region string, router string) *R return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RoutersDeleteCall) RequestId(requestId string) *RoutersDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -55647,6 +59934,11 @@ func (c *RoutersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "router": { // "description": "Name of the Router resource to delete.", // "location": "path", @@ -56015,6 +60307,25 @@ func (r *RoutersService) Insert(project string, region string, router *Router) * return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RoutersInsertCall) RequestId(requestId string) *RoutersInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -56123,6 +60434,11 @@ func (c *RoutersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/routers", @@ -56161,10 +60477,9 @@ func (r *RoutersService) List(project string, region string) *RoutersListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -56176,7 +60491,7 @@ func (r *RoutersService) List(project string, region string) *RoutersListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -56333,7 +60648,7 @@ func (c *RoutersListCall) Do(opts ...googleapi.CallOption) (*RouterList, error) // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -56418,7 +60733,8 @@ type RoutersPatchCall struct { } // Patch: Patches the specified Router resource with the data included -// in the request. This method supports patch semantics. +// in the request. This method supports PATCH semantics and uses JSON +// merge patch format and processing rules. func (r *RoutersService) Patch(project string, region string, router string, router2 *Router) *RoutersPatchCall { c := &RoutersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -56428,6 +60744,25 @@ func (r *RoutersService) Patch(project string, region string, router string, rou return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RoutersPatchCall) RequestId(requestId string) *RoutersPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -56516,7 +60851,7 @@ func (c *RoutersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Patches the specified Router resource with the data included in the request. This method supports patch semantics.", + // "description": "Patches the specified Router resource with the data included in the request. This method supports PATCH semantics and uses JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.routers.patch", // "parameterOrder": [ @@ -56539,6 +60874,11 @@ func (c *RoutersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "router": { // "description": "Name of the Router resource to patch.", // "location": "path", @@ -56906,6 +61246,25 @@ func (r *RoutersService) Update(project string, region string, router string, ro return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RoutersUpdateCall) RequestId(requestId string) *RoutersUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -57017,6 +61376,11 @@ func (c *RoutersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "router": { // "description": "Name of the Router resource to update.", // "location": "path", @@ -57060,6 +61424,25 @@ func (r *RoutesService) Delete(project string, route string) *RoutesDeleteCall { return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RoutesDeleteCall) RequestId(requestId string) *RoutesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -57157,6 +61540,11 @@ func (c *RoutesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "route": { // "description": "Name of the Route resource to delete.", // "location": "path", @@ -57351,6 +61739,25 @@ func (r *RoutesService) Insert(project string, route *Route) *RoutesInsertCall { return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *RoutesInsertCall) RequestId(requestId string) *RoutesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -57450,6 +61857,11 @@ func (c *RoutesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/routes", @@ -57487,10 +61899,9 @@ func (r *RoutesService) List(project string) *RoutesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -57502,7 +61913,7 @@ func (r *RoutesService) List(project string) *RoutesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -57657,7 +62068,7 @@ func (c *RoutesListCall) Do(opts ...googleapi.CallOption) (*RouteList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -57895,6 +62306,25 @@ func (r *SnapshotsService) Delete(project string, snapshot string) *SnapshotsDel return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *SnapshotsDeleteCall) RequestId(requestId string) *SnapshotsDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -57992,6 +62422,11 @@ func (c *SnapshotsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "snapshot": { // "description": "Name of the Snapshot resource to delete.", // "location": "path", @@ -58185,10 +62620,9 @@ func (r *SnapshotsService) List(project string) *SnapshotsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -58200,7 +62634,7 @@ func (r *SnapshotsService) List(project string) *SnapshotsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -58355,7 +62789,7 @@ func (c *SnapshotsListCall) Do(opts ...googleapi.CallOption) (*SnapshotList, err // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -58432,7 +62866,7 @@ type SnapshotsSetLabelsCall struct { } // SetLabels: Sets the labels on a snapshot. To learn more about labels, -// read the Labeling or Tagging Resources documentation. +// read the Labeling Resources documentation. func (r *SnapshotsService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *SnapshotsSetLabelsCall { c := &SnapshotsSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -58528,7 +62962,7 @@ func (c *SnapshotsSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, e } return ret, nil // { - // "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling or Tagging Resources documentation.", + // "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", // "id": "compute.snapshots.setLabels", // "parameterOrder": [ @@ -58733,6 +63167,25 @@ func (r *SslCertificatesService) Delete(project string, sslCertificate string) * return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *SslCertificatesDeleteCall) RequestId(requestId string) *SslCertificatesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -58830,6 +63283,11 @@ func (c *SslCertificatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "sslCertificate": { // "description": "Name of the SslCertificate resource to delete.", // "location": "path", @@ -59022,6 +63480,25 @@ func (r *SslCertificatesService) Insert(project string, sslcertificate *SslCerti return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *SslCertificatesInsertCall) RequestId(requestId string) *SslCertificatesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -59121,6 +63598,11 @@ func (c *SslCertificatesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/sslCertificates", @@ -59157,10 +63639,9 @@ func (r *SslCertificatesService) List(project string) *SslCertificatesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -59172,7 +63653,7 @@ func (r *SslCertificatesService) List(project string) *SslCertificatesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -59327,7 +63808,7 @@ func (c *SslCertificatesListCall) Do(opts ...googleapi.CallOption) (*SslCertific // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -59557,10 +64038,9 @@ func (r *SubnetworksService) AggregatedList(project string) *SubnetworksAggregat return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -59572,7 +64052,7 @@ func (r *SubnetworksService) AggregatedList(project string) *SubnetworksAggregat // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -59727,7 +64207,7 @@ func (c *SubnetworksAggregatedListCall) Do(opts ...googleapi.CallOption) (*Subne // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -59812,6 +64292,25 @@ func (r *SubnetworksService) Delete(project string, region string, subnetwork st return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *SubnetworksDeleteCall) RequestId(requestId string) *SubnetworksDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -59918,6 +64417,11 @@ func (c *SubnetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "subnetwork": { // "description": "Name of the Subnetwork resource to delete.", // "location": "path", @@ -59962,6 +64466,25 @@ func (r *SubnetworksService) ExpandIpCidrRange(project string, region string, su return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *SubnetworksExpandIpCidrRangeCall) RequestId(requestId string) *SubnetworksExpandIpCidrRangeCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -60073,6 +64596,11 @@ func (c *SubnetworksExpandIpCidrRangeCall) Do(opts ...googleapi.CallOption) (*Op // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "subnetwork": { // "description": "Name of the Subnetwork resource to update.", // "location": "path", @@ -60444,6 +64972,25 @@ func (r *SubnetworksService) Insert(project string, region string, subnetwork *S return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *SubnetworksInsertCall) RequestId(requestId string) *SubnetworksInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -60552,6 +65099,11 @@ func (c *SubnetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/subnetworks", @@ -60590,10 +65142,9 @@ func (r *SubnetworksService) List(project string, region string) *SubnetworksLis return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -60605,7 +65156,7 @@ func (r *SubnetworksService) List(project string, region string) *SubnetworksLis // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -60762,7 +65313,7 @@ func (c *SubnetworksListCall) Do(opts ...googleapi.CallOption) (*SubnetworkList, // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -61006,7 +65557,7 @@ type SubnetworksSetPrivateIpGoogleAccessCall struct { // SetPrivateIpGoogleAccess: Set whether VMs in this subnet can access // Google services without assigning external IP addresses through -// Cloudpath. +// Private Google Access. func (r *SubnetworksService) SetPrivateIpGoogleAccess(project string, region string, subnetwork string, subnetworkssetprivateipgoogleaccessrequest *SubnetworksSetPrivateIpGoogleAccessRequest) *SubnetworksSetPrivateIpGoogleAccessCall { c := &SubnetworksSetPrivateIpGoogleAccessCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project @@ -61016,6 +65567,25 @@ func (r *SubnetworksService) SetPrivateIpGoogleAccess(project string, region str return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *SubnetworksSetPrivateIpGoogleAccessCall) RequestId(requestId string) *SubnetworksSetPrivateIpGoogleAccessCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -61104,7 +65674,7 @@ func (c *SubnetworksSetPrivateIpGoogleAccessCall) Do(opts ...googleapi.CallOptio } return ret, nil // { - // "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Cloudpath.", + // "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Private Google Access.", // "httpMethod": "POST", // "id": "compute.subnetworks.setPrivateIpGoogleAccess", // "parameterOrder": [ @@ -61127,6 +65697,11 @@ func (c *SubnetworksSetPrivateIpGoogleAccessCall) Do(opts ...googleapi.CallOptio // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "subnetwork": { // "description": "Name of the Subnetwork resource.", // "location": "path", @@ -61329,6 +65904,25 @@ func (r *TargetHttpProxiesService) Delete(project string, targetHttpProxy string return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetHttpProxiesDeleteCall) RequestId(requestId string) *TargetHttpProxiesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -61426,6 +66020,11 @@ func (c *TargetHttpProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetHttpProxy": { // "description": "Name of the TargetHttpProxy resource to delete.", // "location": "path", @@ -61620,6 +66219,25 @@ func (r *TargetHttpProxiesService) Insert(project string, targethttpproxy *Targe return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetHttpProxiesInsertCall) RequestId(requestId string) *TargetHttpProxiesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -61719,6 +66337,11 @@ func (c *TargetHttpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/targetHttpProxies", @@ -61756,10 +66379,9 @@ func (r *TargetHttpProxiesService) List(project string) *TargetHttpProxiesListCa return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -61771,7 +66393,7 @@ func (r *TargetHttpProxiesService) List(project string) *TargetHttpProxiesListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -61926,7 +66548,7 @@ func (c *TargetHttpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHtt // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -62012,6 +66634,25 @@ func (r *TargetHttpProxiesService) SetUrlMap(project string, targetHttpProxy str return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetHttpProxiesSetUrlMapCall) RequestId(requestId string) *TargetHttpProxiesSetUrlMapCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -62114,6 +66755,11 @@ func (c *TargetHttpProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Oper // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetHttpProxy": { // "description": "Name of the TargetHttpProxy to set a URL map for.", // "location": "path", @@ -62304,6 +66950,25 @@ func (r *TargetHttpsProxiesService) Delete(project string, targetHttpsProxy stri return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetHttpsProxiesDeleteCall) RequestId(requestId string) *TargetHttpsProxiesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -62401,6 +67066,11 @@ func (c *TargetHttpsProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operat // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetHttpsProxy": { // "description": "Name of the TargetHttpsProxy resource to delete.", // "location": "path", @@ -62593,6 +67263,25 @@ func (r *TargetHttpsProxiesService) Insert(project string, targethttpsproxy *Tar return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetHttpsProxiesInsertCall) RequestId(requestId string) *TargetHttpsProxiesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -62692,6 +67381,11 @@ func (c *TargetHttpsProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operat // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/targetHttpsProxies", @@ -62728,10 +67422,9 @@ func (r *TargetHttpsProxiesService) List(project string) *TargetHttpsProxiesList return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -62743,7 +67436,7 @@ func (r *TargetHttpsProxiesService) List(project string) *TargetHttpsProxiesList // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -62898,7 +67591,7 @@ func (c *TargetHttpsProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHt // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -62983,6 +67676,25 @@ func (r *TargetHttpsProxiesService) SetSslCertificates(project string, targetHtt return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetHttpsProxiesSetSslCertificatesCall) RequestId(requestId string) *TargetHttpsProxiesSetSslCertificatesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -63085,6 +67797,11 @@ func (c *TargetHttpsProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOpti // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetHttpsProxy": { // "description": "Name of the TargetHttpsProxy resource to set an SslCertificates resource for.", // "location": "path", @@ -63129,6 +67846,25 @@ func (r *TargetHttpsProxiesService) SetUrlMap(project string, targetHttpsProxy s return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetHttpsProxiesSetUrlMapCall) RequestId(requestId string) *TargetHttpsProxiesSetUrlMapCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -63231,6 +67967,11 @@ func (c *TargetHttpsProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Ope // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetHttpsProxy": { // "description": "Name of the TargetHttpsProxy resource whose URL map is to be set.", // "location": "path", @@ -63421,10 +68162,9 @@ func (r *TargetInstancesService) AggregatedList(project string) *TargetInstances return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -63436,7 +68176,7 @@ func (r *TargetInstancesService) AggregatedList(project string) *TargetInstances // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -63591,7 +68331,7 @@ func (c *TargetInstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*T // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -63677,6 +68417,25 @@ func (r *TargetInstancesService) Delete(project string, zone string, targetInsta return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetInstancesDeleteCall) RequestId(requestId string) *TargetInstancesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -63776,6 +68535,11 @@ func (c *TargetInstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetInstance": { // "description": "Name of the TargetInstance resource to delete.", // "location": "path", @@ -63990,6 +68754,25 @@ func (r *TargetInstancesService) Insert(project string, zone string, targetinsta return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetInstancesInsertCall) RequestId(requestId string) *TargetInstancesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -64092,6 +68875,11 @@ func (c *TargetInstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "Name of the zone scoping this request.", // "location": "path", @@ -64137,10 +68925,9 @@ func (r *TargetInstancesService) List(project string, zone string) *TargetInstan return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -64152,7 +68939,7 @@ func (r *TargetInstancesService) List(project string, zone string) *TargetInstan // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -64309,7 +69096,7 @@ func (c *TargetInstancesListCall) Do(opts ...googleapi.CallOption) (*TargetInsta // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -64563,6 +69350,25 @@ func (r *TargetPoolsService) AddHealthCheck(project string, region string, targe return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetPoolsAddHealthCheckCall) RequestId(requestId string) *TargetPoolsAddHealthCheckCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -64674,6 +69480,11 @@ func (c *TargetPoolsAddHealthCheckCall) Do(opts ...googleapi.CallOption) (*Opera // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetPool": { // "description": "Name of the target pool to add a health check to.", // "location": "path", @@ -64721,6 +69532,25 @@ func (r *TargetPoolsService) AddInstance(project string, region string, targetPo return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetPoolsAddInstanceCall) RequestId(requestId string) *TargetPoolsAddInstanceCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -64832,6 +69662,11 @@ func (c *TargetPoolsAddInstanceCall) Do(opts ...googleapi.CallOption) (*Operatio // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetPool": { // "description": "Name of the TargetPool resource to add instances to.", // "location": "path", @@ -64874,10 +69709,9 @@ func (r *TargetPoolsService) AggregatedList(project string) *TargetPoolsAggregat return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -64889,7 +69723,7 @@ func (r *TargetPoolsService) AggregatedList(project string) *TargetPoolsAggregat // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -65044,7 +69878,7 @@ func (c *TargetPoolsAggregatedListCall) Do(opts ...googleapi.CallOption) (*Targe // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -65130,6 +69964,25 @@ func (r *TargetPoolsService) Delete(project string, region string, targetPool st return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetPoolsDeleteCall) RequestId(requestId string) *TargetPoolsDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -65236,6 +70089,11 @@ func (c *TargetPoolsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetPool": { // "description": "Name of the TargetPool resource to delete.", // "location": "path", @@ -65603,6 +70461,25 @@ func (r *TargetPoolsService) Insert(project string, region string, targetpool *T return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetPoolsInsertCall) RequestId(requestId string) *TargetPoolsInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -65711,6 +70588,11 @@ func (c *TargetPoolsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/targetPools", @@ -65750,10 +70632,9 @@ func (r *TargetPoolsService) List(project string, region string) *TargetPoolsLis return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -65765,7 +70646,7 @@ func (r *TargetPoolsService) List(project string, region string) *TargetPoolsLis // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -65922,7 +70803,7 @@ func (c *TargetPoolsListCall) Do(opts ...googleapi.CallOption) (*TargetPoolList, // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -66017,6 +70898,25 @@ func (r *TargetPoolsService) RemoveHealthCheck(project string, region string, ta return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetPoolsRemoveHealthCheckCall) RequestId(requestId string) *TargetPoolsRemoveHealthCheckCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -66128,6 +71028,11 @@ func (c *TargetPoolsRemoveHealthCheckCall) Do(opts ...googleapi.CallOption) (*Op // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetPool": { // "description": "Name of the target pool to remove health checks from.", // "location": "path", @@ -66175,6 +71080,25 @@ func (r *TargetPoolsService) RemoveInstance(project string, region string, targe return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetPoolsRemoveInstanceCall) RequestId(requestId string) *TargetPoolsRemoveInstanceCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -66286,6 +71210,11 @@ func (c *TargetPoolsRemoveInstanceCall) Do(opts ...googleapi.CallOption) (*Opera // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetPool": { // "description": "Name of the TargetPool resource to remove instances from.", // "location": "path", @@ -66340,6 +71269,25 @@ func (c *TargetPoolsSetBackupCall) FailoverRatio(failoverRatio float64) *TargetP return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetPoolsSetBackupCall) RequestId(requestId string) *TargetPoolsSetBackupCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -66457,6 +71405,11 @@ func (c *TargetPoolsSetBackupCall) Do(opts ...googleapi.CallOption) (*Operation, // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetPool": { // "description": "Name of the TargetPool resource to set a backup pool for.", // "location": "path", @@ -66658,6 +71611,25 @@ func (r *TargetSslProxiesService) Delete(project string, targetSslProxy string) return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetSslProxiesDeleteCall) RequestId(requestId string) *TargetSslProxiesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -66755,6 +71727,11 @@ func (c *TargetSslProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetSslProxy": { // "description": "Name of the TargetSslProxy resource to delete.", // "location": "path", @@ -66947,6 +71924,25 @@ func (r *TargetSslProxiesService) Insert(project string, targetsslproxy *TargetS return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetSslProxiesInsertCall) RequestId(requestId string) *TargetSslProxiesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -67046,6 +72042,11 @@ func (c *TargetSslProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operatio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/targetSslProxies", @@ -67082,10 +72083,9 @@ func (r *TargetSslProxiesService) List(project string) *TargetSslProxiesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -67097,7 +72097,7 @@ func (r *TargetSslProxiesService) List(project string) *TargetSslProxiesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -67252,7 +72252,7 @@ func (c *TargetSslProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetSslP // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -67337,6 +72337,25 @@ func (r *TargetSslProxiesService) SetBackendService(project string, targetSslPro return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetSslProxiesSetBackendServiceCall) RequestId(requestId string) *TargetSslProxiesSetBackendServiceCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -67439,6 +72458,11 @@ func (c *TargetSslProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetSslProxy": { // "description": "Name of the TargetSslProxy resource whose BackendService resource is to be set.", // "location": "path", @@ -67483,6 +72507,25 @@ func (r *TargetSslProxiesService) SetProxyHeader(project string, targetSslProxy return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetSslProxiesSetProxyHeaderCall) RequestId(requestId string) *TargetSslProxiesSetProxyHeaderCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -67585,6 +72628,11 @@ func (c *TargetSslProxiesSetProxyHeaderCall) Do(opts ...googleapi.CallOption) (* // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetSslProxy": { // "description": "Name of the TargetSslProxy resource whose ProxyHeader is to be set.", // "location": "path", @@ -67629,6 +72677,25 @@ func (r *TargetSslProxiesService) SetSslCertificates(project string, targetSslPr return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetSslProxiesSetSslCertificatesCall) RequestId(requestId string) *TargetSslProxiesSetSslCertificatesCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -67731,6 +72798,11 @@ func (c *TargetSslProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOption // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetSslProxy": { // "description": "Name of the TargetSslProxy resource whose SslCertificate resource is to be set.", // "location": "path", @@ -67921,6 +72993,25 @@ func (r *TargetTcpProxiesService) Delete(project string, targetTcpProxy string) return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetTcpProxiesDeleteCall) RequestId(requestId string) *TargetTcpProxiesDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -68018,6 +73109,11 @@ func (c *TargetTcpProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetTcpProxy": { // "description": "Name of the TargetTcpProxy resource to delete.", // "location": "path", @@ -68210,6 +73306,25 @@ func (r *TargetTcpProxiesService) Insert(project string, targettcpproxy *TargetT return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetTcpProxiesInsertCall) RequestId(requestId string) *TargetTcpProxiesInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -68309,6 +73424,11 @@ func (c *TargetTcpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operatio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/targetTcpProxies", @@ -68345,10 +73465,9 @@ func (r *TargetTcpProxiesService) List(project string) *TargetTcpProxiesListCall return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -68360,7 +73479,7 @@ func (r *TargetTcpProxiesService) List(project string) *TargetTcpProxiesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -68515,7 +73634,7 @@ func (c *TargetTcpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetTcpP // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -68600,6 +73719,25 @@ func (r *TargetTcpProxiesService) SetBackendService(project string, targetTcpPro return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetTcpProxiesSetBackendServiceCall) RequestId(requestId string) *TargetTcpProxiesSetBackendServiceCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -68702,6 +73840,11 @@ func (c *TargetTcpProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetTcpProxy": { // "description": "Name of the TargetTcpProxy resource whose BackendService resource is to be set.", // "location": "path", @@ -68746,6 +73889,25 @@ func (r *TargetTcpProxiesService) SetProxyHeader(project string, targetTcpProxy return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetTcpProxiesSetProxyHeaderCall) RequestId(requestId string) *TargetTcpProxiesSetProxyHeaderCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -68848,6 +74010,11 @@ func (c *TargetTcpProxiesSetProxyHeaderCall) Do(opts ...googleapi.CallOption) (* // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetTcpProxy": { // "description": "Name of the TargetTcpProxy resource whose ProxyHeader is to be set.", // "location": "path", @@ -68889,10 +74056,9 @@ func (r *TargetVpnGatewaysService) AggregatedList(project string) *TargetVpnGate return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -68904,7 +74070,7 @@ func (r *TargetVpnGatewaysService) AggregatedList(project string) *TargetVpnGate // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -69059,7 +74225,7 @@ func (c *TargetVpnGatewaysAggregatedListCall) Do(opts ...googleapi.CallOption) ( // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -69144,6 +74310,25 @@ func (r *TargetVpnGatewaysService) Delete(project string, region string, targetV return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetVpnGatewaysDeleteCall) RequestId(requestId string) *TargetVpnGatewaysDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -69250,6 +74435,11 @@ func (c *TargetVpnGatewaysDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "targetVpnGateway": { // "description": "Name of the target VPN gateway to delete.", // "location": "path", @@ -69455,6 +74645,25 @@ func (r *TargetVpnGatewaysService) Insert(project string, region string, targetv return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *TargetVpnGatewaysInsertCall) RequestId(requestId string) *TargetVpnGatewaysInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -69563,6 +74772,11 @@ func (c *TargetVpnGatewaysInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/targetVpnGateways", @@ -69601,10 +74815,9 @@ func (r *TargetVpnGatewaysService) List(project string, region string) *TargetVp return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -69616,7 +74829,7 @@ func (r *TargetVpnGatewaysService) List(project string, region string) *TargetVp // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -69773,7 +74986,7 @@ func (c *TargetVpnGatewaysListCall) Do(opts ...googleapi.CallOption) (*TargetVpn // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -70023,6 +75236,25 @@ func (r *UrlMapsService) Delete(project string, urlMap string) *UrlMapsDeleteCal return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *UrlMapsDeleteCall) RequestId(requestId string) *UrlMapsDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -70120,6 +75352,11 @@ func (c *UrlMapsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "urlMap": { // "description": "Name of the UrlMap resource to delete.", // "location": "path", @@ -70314,6 +75551,25 @@ func (r *UrlMapsService) Insert(project string, urlmap *UrlMap) *UrlMapsInsertCa return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *UrlMapsInsertCall) RequestId(requestId string) *UrlMapsInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -70413,6 +75669,11 @@ func (c *UrlMapsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/global/urlMaps", @@ -70452,6 +75713,25 @@ func (r *UrlMapsService) InvalidateCache(project string, urlMap string, cacheinv return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *UrlMapsInvalidateCacheCall) RequestId(requestId string) *UrlMapsInvalidateCacheCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -70554,6 +75834,11 @@ func (c *UrlMapsInvalidateCacheCall) Do(opts ...googleapi.CallOption) (*Operatio // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "urlMap": { // "description": "Name of the UrlMap scoping this request.", // "location": "path", @@ -70597,10 +75882,9 @@ func (r *UrlMapsService) List(project string) *UrlMapsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -70612,7 +75896,7 @@ func (r *UrlMapsService) List(project string) *UrlMapsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -70767,7 +76051,7 @@ func (c *UrlMapsListCall) Do(opts ...googleapi.CallOption) (*UrlMapList, error) // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -70844,7 +76128,8 @@ type UrlMapsPatchCall struct { } // Patch: Patches the specified UrlMap resource with the data included -// in the request. This method supports patch semantics. +// in the request. This method supports PATCH semantics and uses the +// JSON merge patch format and processing rules. // For details, see https://cloud.google.com/compute/docs/reference/latest/urlMaps/patch func (r *UrlMapsService) Patch(project string, urlMap string, urlmap *UrlMap) *UrlMapsPatchCall { c := &UrlMapsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -70854,6 +76139,25 @@ func (r *UrlMapsService) Patch(project string, urlMap string, urlmap *UrlMap) *U return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *UrlMapsPatchCall) RequestId(requestId string) *UrlMapsPatchCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -70941,7 +76245,7 @@ func (c *UrlMapsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Patches the specified UrlMap resource with the data included in the request. This method supports patch semantics.", + // "description": "Patches the specified UrlMap resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.urlMaps.patch", // "parameterOrder": [ @@ -70956,6 +76260,11 @@ func (c *UrlMapsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "urlMap": { // "description": "Name of the UrlMap resource to patch.", // "location": "path", @@ -71151,6 +76460,25 @@ func (r *UrlMapsService) Update(project string, urlMap string, urlmap *UrlMap) * return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *UrlMapsUpdateCall) RequestId(requestId string) *UrlMapsUpdateCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -71253,6 +76581,11 @@ func (c *UrlMapsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "urlMap": { // "description": "Name of the UrlMap resource to update.", // "location": "path", @@ -71443,10 +76776,9 @@ func (r *VpnTunnelsService) AggregatedList(project string) *VpnTunnelsAggregated return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -71458,7 +76790,7 @@ func (r *VpnTunnelsService) AggregatedList(project string) *VpnTunnelsAggregated // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -71613,7 +76945,7 @@ func (c *VpnTunnelsAggregatedListCall) Do(opts ...googleapi.CallOption) (*VpnTun // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -71698,6 +77030,25 @@ func (r *VpnTunnelsService) Delete(project string, region string, vpnTunnel stri return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *VpnTunnelsDeleteCall) RequestId(requestId string) *VpnTunnelsDeleteCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -71804,6 +77155,11 @@ func (c *VpnTunnelsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, err // "required": true, // "type": "string" // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" + // }, // "vpnTunnel": { // "description": "Name of the VpnTunnel resource to delete.", // "location": "path", @@ -72009,6 +77365,25 @@ func (r *VpnTunnelsService) Insert(project string, region string, vpntunnel *Vpn return c } +// RequestId sets the optional parameter "requestId": An optional +// request ID to identify requests. Specify a unique request ID so that +// if you must retry your request, the server will know to ignore the +// request if it has already been completed. +// +// For example, consider a situation where you make an initial request +// and the request times out. If you make the request again with the +// same request ID, the server can check if original operation with the +// same request ID was received, and if so, will ignore the second +// request. This prevents clients from accidentally creating duplicate +// commitments. +// +// The request ID must be a valid UUID with the exception that zero UUID +// is not supported (00000000-0000-0000-0000-000000000000). +func (c *VpnTunnelsInsertCall) RequestId(requestId string) *VpnTunnelsInsertCall { + c.urlParams_.Set("requestId", requestId) + return c +} + // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. @@ -72117,6 +77492,11 @@ func (c *VpnTunnelsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, err // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" + // }, + // "requestId": { + // "description": "An optional request ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed.\n\nFor example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments.\n\nThe request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).", + // "location": "query", + // "type": "string" // } // }, // "path": "{project}/regions/{region}/vpnTunnels", @@ -72155,10 +77535,9 @@ func (r *VpnTunnelsService) List(project string, region string) *VpnTunnelsListC return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -72170,7 +77549,7 @@ func (r *VpnTunnelsService) List(project string, region string) *VpnTunnelsListC // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -72327,7 +77706,7 @@ func (c *VpnTunnelsListCall) Do(opts ...googleapi.CallOption) (*VpnTunnelList, e // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -72862,10 +78241,9 @@ func (r *ZoneOperationsService) List(project string, zone string) *ZoneOperation return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -72877,7 +78255,7 @@ func (r *ZoneOperationsService) List(project string, zone string) *ZoneOperation // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -73034,7 +78412,7 @@ func (c *ZoneOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationLis // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -73278,10 +78656,9 @@ func (r *ZonesService) List(project string) *ZonesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -73293,7 +78670,7 @@ func (r *ZonesService) List(project string) *ZonesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -73448,7 +78825,7 @@ func (c *ZonesListCall) Do(opts ...googleapi.CallOption) (*ZoneList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, diff --git a/vendor/google.golang.org/api/compute/v1/compute-api.json b/vendor/google.golang.org/api/compute/v1/compute-api.json index 5c11319930a16..9b169bb56d52c 100644 --- a/vendor/google.golang.org/api/compute/v1/compute-api.json +++ b/vendor/google.golang.org/api/compute/v1/compute-api.json @@ -1,11 +1,11 @@ { "kind": "discovery#restDescription", - "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/RtyLBkqFU92HxRM-H7PV1QN7704\"", + "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/dXJ6H81YhcA1IB55do9QrvoIsEc\"", "discoveryVersion": "v1", "id": "compute:v1", "name": "compute", "version": "v1", - "revision": "20170416", + "revision": "20170721", "title": "Compute Engine API", "description": "Creates and runs virtual machines on Google Cloud Platform.", "ownerDomain": "google.com", @@ -91,6 +91,213 @@ } }, "schemas": { + "AcceleratorConfig": { + "id": "AcceleratorConfig", + "type": "object", + "description": "A specification of the type and number of accelerator cards attached to the instance.", + "properties": { + "acceleratorCount": { + "type": "integer", + "description": "The number of the guest accelerator cards exposed to this instance.", + "format": "int32" + }, + "acceleratorType": { + "type": "string", + "description": "Full or partial URL of the accelerator type resource to expose to this instance." + } + } + }, + "AcceleratorType": { + "id": "AcceleratorType", + "type": "object", + "description": "An Accelerator Type resource.", + "properties": { + "creationTimestamp": { + "type": "string", + "description": "[Output Only] Creation timestamp in RFC3339 text format." + }, + "deprecated": { + "$ref": "DeprecationStatus", + "description": "[Output Only] The deprecation status associated with this accelerator type." + }, + "description": { + "type": "string", + "description": "[Output Only] An optional textual description of the resource." + }, + "id": { + "type": "string", + "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", + "format": "uint64" + }, + "kind": { + "type": "string", + "description": "[Output Only] The type of the resource. Always compute#acceleratorType for accelerator types.", + "default": "compute#acceleratorType" + }, + "maximumCardsPerInstance": { + "type": "integer", + "description": "[Output Only] Maximum accelerator cards allowed per instance.", + "format": "int32" + }, + "name": { + "type": "string", + "description": "[Output Only] Name of the resource.", + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?" + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined fully-qualified URL for this resource." + }, + "zone": { + "type": "string", + "description": "[Output Only] The name of the zone where the accelerator type resides, such as us-central1-a." + } + } + }, + "AcceleratorTypeAggregatedList": { + "id": "AcceleratorTypeAggregatedList", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] Unique identifier for the resource; defined by the server." + }, + "items": { + "type": "object", + "description": "A list of AcceleratorTypesScopedList resources.", + "additionalProperties": { + "$ref": "AcceleratorTypesScopedList", + "description": "[Output Only] Name of the scope containing this set of accelerator types." + } + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of resource. Always compute#acceleratorTypeAggregatedList for aggregated lists of accelerator types.", + "default": "compute#acceleratorTypeAggregatedList" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, + "AcceleratorTypeList": { + "id": "AcceleratorTypeList", + "type": "object", + "description": "Contains a list of accelerator types.", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] Unique identifier for the resource; defined by the server." + }, + "items": { + "type": "array", + "description": "A list of AcceleratorType resources.", + "items": { + "$ref": "AcceleratorType" + } + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of resource. Always compute#acceleratorTypeList for lists of accelerator types.", + "default": "compute#acceleratorTypeList" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, + "AcceleratorTypesScopedList": { + "id": "AcceleratorTypesScopedList", + "type": "object", + "properties": { + "acceleratorTypes": { + "type": "array", + "description": "[Output Only] List of accelerator types contained in this scope.", + "items": { + "$ref": "AcceleratorType" + } + }, + "warning": { + "type": "object", + "description": "[Output Only] An informational warning that appears when the accelerator types list is empty.", + "properties": { + "code": { + "type": "string", + "description": "[Output Only] A warning code, if applicable. For example, Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in the response.", + "enum": [ + "CLEANUP_FAILED", + "DEPRECATED_RESOURCE_USED", + "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", + "INJECTED_KERNELS_DEPRECATED", + "NEXT_HOP_ADDRESS_NOT_ASSIGNED", + "NEXT_HOP_CANNOT_IP_FORWARD", + "NEXT_HOP_INSTANCE_NOT_FOUND", + "NEXT_HOP_INSTANCE_NOT_ON_NETWORK", + "NEXT_HOP_NOT_RUNNING", + "NOT_CRITICAL_ERROR", + "NO_RESULTS_ON_PAGE", + "REQUIRED_TOS_AGREEMENT", + "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING", + "RESOURCE_NOT_DELETED", + "SINGLE_INSTANCE_PROPERTY_TEMPLATE", + "UNREACHABLE" + ], + "enumDescriptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "data": { + "type": "array", + "description": "[Output Only] Metadata about this warning in key: value format. For example:\n\"data\": [ { \"key\": \"scope\", \"value\": \"zones/us-east1-d\" }", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "[Output Only] A key that provides more detail on the warning being returned. For example, for warnings where there are no results in a list request for a particular zone, this key might be scope and the key value might be the zone name. Other examples might be a key indicating a deprecated resource and a suggested replacement, or a warning about invalid network settings (for example, if an instance attempts to perform IP forwarding but is not enabled for IP forwarding)." + }, + "value": { + "type": "string", + "description": "[Output Only] A warning data value corresponding to the key." + } + } + } + }, + "message": { + "type": "string", + "description": "[Output Only] A human-readable description of the warning code." + } + } + } + } + }, "AccessConfig": { "id": "AccessConfig", "type": "object", @@ -144,6 +351,20 @@ "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", "format": "uint64" }, + "ipVersion": { + "type": "string", + "description": "The IP Version that will be used by this address. Valid options are IPV4 or IPV6. This can only be specified for a global address.", + "enum": [ + "IPV4", + "IPV6", + "UNSPECIFIED_VERSION" + ], + "enumDescriptions": [ + "", + "", + "" + ] + }, "kind": { "type": "string", "description": "[Output Only] Type of the resource. Always compute#address for addresses.", @@ -198,7 +419,7 @@ }, "items": { "type": "object", - "description": "[Output Only] A map of scoped address lists.", + "description": "A list of AddressesScopedList resources.", "additionalProperties": { "$ref": "AddressesScopedList", "description": "[Output Only] Name of the scope containing this set of addresses." @@ -226,11 +447,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of addresses.", + "description": "A list of Address resources.", "items": { "$ref": "Address" } @@ -246,7 +467,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -332,6 +553,21 @@ } } }, + "AliasIpRange": { + "id": "AliasIpRange", + "type": "object", + "description": "An alias IP range attached to an instance's network interface.", + "properties": { + "ipCidrRange": { + "type": "string", + "description": "The IP CIDR range represented by this alias IP range. This IP CIDR range must belong to the specified subnetwork and cannot contain IP addresses reserved by system or used by other network interfaces. This range may be a single IP address (e.g. 10.2.3.4), a netmask (e.g. /24) or a CIDR format string (e.g. 10.1.2.0/24)." + }, + "subnetworkRangeName": { + "type": "string", + "description": "Optional subnetwork secondary range name specifying the secondary range from which to allocate the IP CIDR range for this alias IP range. If left unspecified, the primary range of the subnetwork will be used." + } + } + }, "AttachedDisk": { "id": "AttachedDisk", "type": "object", @@ -489,6 +725,29 @@ "type": "string", "description": "[Output Only] Server-defined URL for the resource." }, + "status": { + "type": "string", + "description": "[Output Only] The status of the autoscaler configuration.", + "enum": [ + "ACTIVE", + "DELETING", + "ERROR", + "PENDING" + ], + "enumDescriptions": [ + "", + "", + "", + "" + ] + }, + "statusDetails": { + "type": "array", + "description": "[Output Only] Human-readable details about the current state of the autoscaler. Read the documentation for Commonly returned status messages for examples of status messages you might encounter.", + "items": { + "$ref": "AutoscalerStatusDetails" + } + }, "target": { "type": "string", "description": "URL of the managed instance group that this autoscaler will scale." @@ -505,11 +764,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped autoscaler lists.", + "description": "A list of AutoscalersScopedList resources.", "additionalProperties": { "$ref": "AutoscalersScopedList", "description": "[Output Only] Name of the scope containing this set of autoscalers." @@ -537,7 +796,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -561,6 +820,54 @@ } } }, + "AutoscalerStatusDetails": { + "id": "AutoscalerStatusDetails", + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "The status message." + }, + "type": { + "type": "string", + "description": "The type of error returned.", + "enum": [ + "ALL_INSTANCES_UNHEALTHY", + "BACKEND_SERVICE_DOES_NOT_EXIST", + "CAPPED_AT_MAX_NUM_REPLICAS", + "CUSTOM_METRIC_DATA_POINTS_TOO_SPARSE", + "CUSTOM_METRIC_INVALID", + "MIN_EQUALS_MAX", + "MISSING_CUSTOM_METRIC_DATA_POINTS", + "MISSING_LOAD_BALANCING_DATA_POINTS", + "MORE_THAN_ONE_BACKEND_SERVICE", + "NOT_ENOUGH_QUOTA_AVAILABLE", + "REGION_RESOURCE_STOCKOUT", + "SCALING_TARGET_DOES_NOT_EXIST", + "UNKNOWN", + "UNSUPPORTED_MAX_RATE_LOAD_BALANCING_CONFIGURATION", + "ZONE_RESOURCE_STOCKOUT" + ], + "enumDescriptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + } + } + }, "AutoscalersScopedList": { "id": "AutoscalersScopedList", "type": "object", @@ -699,11 +1006,11 @@ "properties": { "metric": { "type": "string", - "description": "The identifier of the Stackdriver Monitoring metric. The metric cannot have negative values and should be a utilization metric, which means that the number of virtual machines handling requests should increase or decrease proportionally to the metric. The metric must also have a label of compute.googleapis.com/resource_id with the value of the instance's unique ID, although this alone does not guarantee that the metric is valid.\n\nFor example, the following is a valid metric:\ncompute.googleapis.com/instance/network/received_bytes_count\nThe following is not a valid metric because it does not increase or decrease based on usage:\ncompute.googleapis.com/instance/cpu/reserved_cores" + "description": "The identifier (type) of the Stackdriver Monitoring metric. The metric cannot have negative values and should be a utilization metric, which means that the number of virtual machines handling requests should increase or decrease proportionally to the metric.\n\nThe metric must have a value type of INT64 or DOUBLE." }, "utilizationTarget": { "type": "number", - "description": "Target value of the metric which autoscaler should maintain. Must be a positive value.", + "description": "The target value of the metric that autoscaler should maintain. This must be a positive value.\n\nFor example, a good metric to use as a utilization_target is compute.googleapis.com/instance/network/received_bytes_count. The autoscaler will work to keep this value constant for each of the instances.", "format": "double" }, "utilizationTargetType": { @@ -741,7 +1048,7 @@ "properties": { "balancingMode": { "type": "string", - "description": "Specifies the balancing mode for this backend. For global HTTP(S) or TCP/SSL load balancing, the default is UTILIZATION. Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for TCP/SSL).\n\nThis cannot be used for internal load balancing.", + "description": "Specifies the balancing mode for this backend. For global HTTP(S) or TCP/SSL load balancing, the default is UTILIZATION. Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for TCP/SSL).\n\nFor Internal Load Balancing, the default and only supported mode is CONNECTION.", "enum": [ "CONNECTION", "RATE", @@ -764,7 +1071,7 @@ }, "group": { "type": "string", - "description": "The fully-qualified URL of a zonal Instance Group resource. This instance group defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource.\n\nNote that you must specify an Instance Group resource using the fully-qualified URL, rather than a partial URL.\n\nWhen the BackendService has load balancing scheme INTERNAL, the instance group must be in a zone within the same region as the BackendService." + "description": "The fully-qualified URL of a Instance Group resource. This instance group defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource.\n\nNote that you must specify an Instance Group resource using the fully-qualified URL, rather than a partial URL.\n\nWhen the BackendService has load balancing scheme INTERNAL, the instance group must be within the same region as the BackendService." }, "maxConnections": { "type": "integer", @@ -858,7 +1165,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -909,11 +1216,14 @@ }, "healthChecks": { "type": "array", - "description": "The list of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified, and a health check is required.\n\nFor internal load balancing, a URL to a HealthCheck resource must be specified instead.", + "description": "The list of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified, and a health check is required for GCE backend services. A health check must not be specified for GAE app backend and Cloud Function backend.\n\nFor internal load balancing, a URL to a HealthCheck resource must be specified instead.", "items": { "type": "string" } }, + "iap": { + "$ref": "BackendServiceIAP" + }, "id": { "type": "string", "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", @@ -1013,7 +1323,7 @@ }, "items": { "type": "object", - "description": "A map of scoped BackendService lists.", + "description": "A list of BackendServicesScopedList resources.", "additionalProperties": { "$ref": "BackendServicesScopedList", "description": "Name of the scope containing this set of BackendServices." @@ -1026,7 +1336,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -1062,19 +1372,39 @@ } } }, - "BackendServiceList": { - "id": "BackendServiceList", + "BackendServiceIAP": { + "id": "BackendServiceIAP", "type": "object", - "description": "Contains a list of BackendService resources.", + "description": "Identity-Aware Proxy", "properties": { - "id": { - "type": "string", - "description": "[Output Only] Unique identifier for the resource; defined by the server." + "enabled": { + "type": "boolean" }, - "items": { - "type": "array", - "description": "A list of BackendService resources.", - "items": { + "oauth2ClientId": { + "type": "string" + }, + "oauth2ClientSecret": { + "type": "string" + }, + "oauth2ClientSecretSha256": { + "type": "string", + "description": "[Output Only] SHA256 hash value for the field oauth2_client_secret above." + } + } + }, + "BackendServiceList": { + "id": "BackendServiceList", + "type": "object", + "description": "Contains a list of BackendService resources.", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] Unique identifier for the resource; defined by the server." + }, + "items": { + "type": "array", + "description": "A list of BackendService resources.", + "items": { "$ref": "BackendService" } }, @@ -1221,6 +1551,237 @@ } } }, + "Commitment": { + "id": "Commitment", + "type": "object", + "description": "Represents a Commitment resource. Creating a Commitment resource means that you are purchasing a committed use contract with an explicit start and end time. You can create commitments based on vCPUs and memory usage and receive discounted rates. For full details, read Signing Up for Committed Use Discounts.\n\nCommitted use discounts are subject to Google Cloud Platform's Service Specific Terms. By purchasing a committed use discount, you agree to these terms. Committed use discounts will not renew, so you must purchase a new commitment to continue receiving discounts.", + "properties": { + "creationTimestamp": { + "type": "string", + "description": "[Output Only] Creation timestamp in RFC3339 text format." + }, + "description": { + "type": "string", + "description": "An optional description of this resource. Provide this property when you create the resource." + }, + "endTimestamp": { + "type": "string", + "description": "[Output Only] Commitment end time in RFC3339 text format." + }, + "id": { + "type": "string", + "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", + "format": "uint64" + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of the resource. Always compute#commitment for commitments.", + "default": "compute#commitment" + }, + "name": { + "type": "string", + "description": "Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.", + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?" + }, + "plan": { + "type": "string", + "description": "The plan for this commitment, which determines duration and discount rate. The currently supported plans are TWELVE_MONTH (1 year), and THIRTY_SIX_MONTH (3 years).", + "enum": [ + "INVALID", + "THIRTY_SIX_MONTH", + "TWELVE_MONTH" + ], + "enumDescriptions": [ + "", + "", + "" + ] + }, + "region": { + "type": "string", + "description": "[Output Only] URL of the region where this commitment may be used." + }, + "resources": { + "type": "array", + "description": "List of commitment amounts for particular resources. Note that VCPU and MEMORY resource commitments must occur together.", + "items": { + "$ref": "ResourceCommitment" + } + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for the resource." + }, + "startTimestamp": { + "type": "string", + "description": "[Output Only] Commitment start time in RFC3339 text format." + }, + "status": { + "type": "string", + "description": "[Output Only] Status of the commitment with regards to eventual expiration (each commitment has an end date defined). One of the following values: NOT_YET_ACTIVE, ACTIVE, EXPIRED.", + "enum": [ + "ACTIVE", + "CREATING", + "EXPIRED", + "NOT_YET_ACTIVE" + ], + "enumDescriptions": [ + "", + "", + "", + "" + ] + }, + "statusMessage": { + "type": "string", + "description": "[Output Only] An optional, human-readable explanation of the status." + } + } + }, + "CommitmentAggregatedList": { + "id": "CommitmentAggregatedList", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] Unique identifier for the resource; defined by the server." + }, + "items": { + "type": "object", + "description": "A list of CommitmentsScopedList resources.", + "additionalProperties": { + "$ref": "CommitmentsScopedList", + "description": "[Output Only] Name of the scope containing this set of commitments." + } + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of resource. Always compute#commitmentAggregatedList for aggregated lists of commitments.", + "default": "compute#commitmentAggregatedList" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, + "CommitmentList": { + "id": "CommitmentList", + "type": "object", + "description": "Contains a list of Commitment resources.", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] Unique identifier for the resource; defined by the server." + }, + "items": { + "type": "array", + "description": "A list of Commitment resources.", + "items": { + "$ref": "Commitment" + } + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of resource. Always compute#commitmentList for lists of commitments.", + "default": "compute#commitmentList" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, + "CommitmentsScopedList": { + "id": "CommitmentsScopedList", + "type": "object", + "properties": { + "commitments": { + "type": "array", + "description": "[Output Only] List of commitments contained in this scope.", + "items": { + "$ref": "Commitment" + } + }, + "warning": { + "type": "object", + "description": "[Output Only] Informational warning which replaces the list of commitments when the list is empty.", + "properties": { + "code": { + "type": "string", + "description": "[Output Only] A warning code, if applicable. For example, Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in the response.", + "enum": [ + "CLEANUP_FAILED", + "DEPRECATED_RESOURCE_USED", + "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", + "INJECTED_KERNELS_DEPRECATED", + "NEXT_HOP_ADDRESS_NOT_ASSIGNED", + "NEXT_HOP_CANNOT_IP_FORWARD", + "NEXT_HOP_INSTANCE_NOT_FOUND", + "NEXT_HOP_INSTANCE_NOT_ON_NETWORK", + "NEXT_HOP_NOT_RUNNING", + "NOT_CRITICAL_ERROR", + "NO_RESULTS_ON_PAGE", + "REQUIRED_TOS_AGREEMENT", + "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING", + "RESOURCE_NOT_DELETED", + "SINGLE_INSTANCE_PROPERTY_TEMPLATE", + "UNREACHABLE" + ], + "enumDescriptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "data": { + "type": "array", + "description": "[Output Only] Metadata about this warning in key: value format. For example:\n\"data\": [ { \"key\": \"scope\", \"value\": \"zones/us-east1-d\" }", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "[Output Only] A key that provides more detail on the warning being returned. For example, for warnings where there are no results in a list request for a particular zone, this key might be scope and the key value might be the zone name. Other examples might be a key indicating a deprecated resource and a suggested replacement, or a warning about invalid network settings (for example, if an instance attempts to perform IP forwarding but is not enabled for IP forwarding)." + }, + "value": { + "type": "string", + "description": "[Output Only] A warning data value corresponding to the key." + } + } + } + }, + "message": { + "type": "string", + "description": "[Output Only] A human-readable description of the warning code." + } + } + } + } + }, "ConnectionDraining": { "id": "ConnectionDraining", "type": "object", @@ -1326,6 +1887,18 @@ "description": "[Output Only] Type of the resource. Always compute#disk for disks.", "default": "compute#disk" }, + "labelFingerprint": { + "type": "string", + "description": "A fingerprint for the labels being applied to this disk, which is essentially a hash of the labels set used for optimistic locking. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update labels. You must always provide an up-to-date fingerprint hash in order to update or change labels.\n\nTo see the latest fingerprint, make a get() request to retrieve a disk.", + "format": "byte" + }, + "labels": { + "type": "object", + "description": "Labels to apply to this disk. These can be later modified by the setLabels method.", + "additionalProperties": { + "type": "string" + } + }, "lastAttachTimestamp": { "type": "string", "description": "[Output Only] Last attach timestamp in RFC3339 text format." @@ -1361,7 +1934,7 @@ }, "sizeGb": { "type": "string", - "description": "Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the sourceImage or sourceSnapshot parameter, or specify it alone to create an empty persistent disk.\n\nIf you specify this field along with sourceImage or sourceSnapshot, the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot.", + "description": "Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the sourceImage or sourceSnapshot parameter, or specify it alone to create an empty persistent disk.\n\nIf you specify this field along with sourceImage or sourceSnapshot, the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot. Acceptable values are 1 to 65536, inclusive.", "format": "int64" }, "sourceImage": { @@ -1427,11 +2000,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped disk lists.", + "description": "A list of DisksScopedList resources.", "additionalProperties": { "$ref": "DisksScopedList", "description": "[Output Only] Name of the scope containing this set of disks." @@ -1444,7 +2017,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results. Acceptable values are 0 to 500, inclusive. (Default: 500)" + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -1475,7 +2048,7 @@ }, "nextPageToken": { "type": "string", - "description": "This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -1554,11 +2127,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped disk type lists.", + "description": "A list of DiskTypesScopedList resources.", "additionalProperties": { "$ref": "DiskTypesScopedList", "description": "[Output Only] Name of the scope containing this set of disk types." @@ -1586,11 +2159,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Disk Type resources.", + "description": "A list of DiskType resources.", "items": { "$ref": "DiskType" } @@ -1798,7 +2371,7 @@ "properties": { "IPProtocol": { "type": "string", - "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp), or the IP protocol number." + "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, ipip, sctp), or the IP protocol number." }, "ports": { "type": "array", @@ -1825,7 +2398,7 @@ }, "kind": { "type": "string", - "description": "[Output Ony] Type of the resource. Always compute#firewall for firewall rules.", + "description": "[Output Only] Type of the resource. Always compute#firewall for firewall rules.", "default": "compute#firewall" }, "name": { @@ -1856,7 +2429,7 @@ }, "sourceTags": { "type": "array", - "description": "If source tags are specified, the firewall will apply only to traffic with source IP that belongs to a tag listed in source tags. Source tags cannot be used to control traffic to an instance's external IP address. Because tags are associated with an instance, not an IP address. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.", + "description": "If source tags are specified, the firewall rule applies only to traffic with source IPs that match the primary network interfaces of VM instances that have the tag and are in the same VPC network. Source tags cannot be used to control traffic to an instance's external IP address, it only applies to traffic between instances in the same virtual network. Because tags are associated with instances, not IP addresses. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.", "items": { "type": "string" } @@ -1877,11 +2450,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Firewall resources.", + "description": "A list of Firewall resources.", "items": { "$ref": "Firewall" } @@ -1908,7 +2481,7 @@ "properties": { "IPAddress": { "type": "string", - "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP. For regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule. Only IPv4 is supported." + "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP. For regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IPv4 address from the same scope (global or regional) will be assigned. A regional forwarding rule supports IPv4 only. A global forwarding rule supports either IPv4 or IPv6.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule." }, "IPProtocol": { "type": "string", @@ -1947,6 +2520,20 @@ "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", "format": "uint64" }, + "ipVersion": { + "type": "string", + "description": "The IP Version that will be used by this forwarding rule. Valid options are IPV4 or IPV6. This can only be specified for a global forwarding rule.", + "enum": [ + "IPV4", + "IPV6", + "UNSPECIFIED_VERSION" + ], + "enumDescriptions": [ + "", + "", + "" + ] + }, "kind": { "type": "string", "description": "[Output Only] Type of the resource. Always compute#forwardingRule for Forwarding Rule resources.", @@ -1977,7 +2564,7 @@ }, "portRange": { "type": "string", - "description": "This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance.\n\nApplicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges.\n\nSome types of forwarding target have constraints on the acceptable ports: \n- TargetHttpProxy: 80, 8080 \n- TargetHttpsProxy: 443 \n- TargetSslProxy: 443 \n- TargetVpnGateway: 500, 4500\n-" + "description": "This field is used along with the target field for TargetHttpProxy, TargetHttpsProxy, TargetSslProxy, TargetTcpProxy, TargetVpnGateway, TargetPool, TargetInstance.\n\nApplicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges.\n\nSome types of forwarding target have constraints on the acceptable ports: \n- TargetHttpProxy: 80, 8080 \n- TargetHttpsProxy: 443 \n- TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 \n- TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 5222 \n- TargetVpnGateway: 500, 4500\n-" }, "ports": { "type": "array", @@ -2010,11 +2597,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped forwarding rule lists.", + "description": "A list of ForwardingRulesScopedList resources.", "additionalProperties": { "$ref": "ForwardingRulesScopedList", "description": "Name of the scope containing this set of addresses." @@ -2042,7 +2629,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Set by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -2148,6 +2735,24 @@ } } }, + "GlobalSetLabelsRequest": { + "id": "GlobalSetLabelsRequest", + "type": "object", + "properties": { + "labelFingerprint": { + "type": "string", + "description": "The fingerprint of the previous set of labels for this resource, used to detect conflicts. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update labels. You must always provide an up-to-date fingerprint hash when updating or changing labels. Make a get() request to the resource to get the latest fingerprint.", + "format": "byte" + }, + "labels": { + "type": "object", + "description": "A list of labels to apply for this resource. Each label key & value must comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash. For example, \"webserver-frontend\": \"images\". A label value can also be empty (e.g. \"my-label\": \"\").", + "additionalProperties": { + "type": "string" + } + } + } + }, "GuestOsFeature": { "id": "GuestOsFeature", "type": "object", @@ -2155,7 +2760,7 @@ "properties": { "type": { "type": "string", - "description": "The type of supported feature. Currenty only VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the server might also populate this property with the value WINDOWS to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", + "description": "The type of supported feature. Currently only VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the server might also populate this property with the value WINDOWS to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", "enum": [ "FEATURE_TYPE_UNSPECIFIED", "VIRTIO_SCSI_MULTIQUEUE", @@ -2330,7 +2935,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -2491,7 +3096,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -2646,7 +3251,7 @@ }, "guestOsFeatures": { "type": "array", - "description": "A list of features to enable on the guest OS. Applicable for bootable images only. Currently, only one feature can be enabled, VIRTIO_SCSCI_MULTIQUEUE, which allows each virtual CPU to have its own queue. For Windows images, you can only enable VIRTIO_SCSCI_MULTIQUEUE on images with driver version 1.2.0.1621 or higher. Linux images with kernel versions 3.17 and higher will support VIRTIO_SCSCI_MULTIQUEUE.\n\nFor new Windows images, the server might also populate this field with the value WINDOWS, to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", + "description": "A list of features to enable on the guest OS. Applicable for bootable images only. Currently, only one feature can be enabled, VIRTIO_SCSI_MULTIQUEUE, which allows each virtual CPU to have its own queue. For Windows images, you can only enable VIRTIO_SCSI_MULTIQUEUE on images with driver version 1.2.0.1621 or higher. Linux images with kernel versions 3.17 and higher will support VIRTIO_SCSI_MULTIQUEUE.\n\nFor new Windows images, the server might also populate this field with the value WINDOWS, to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.", "items": { "$ref": "GuestOsFeature" } @@ -2665,6 +3270,18 @@ "description": "[Output Only] Type of the resource. Always compute#image for images.", "default": "compute#image" }, + "labelFingerprint": { + "type": "string", + "description": "A fingerprint for the labels being applied to this image, which is essentially a hash of the labels used for optimistic locking. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update labels. You must always provide an up-to-date fingerprint hash in order to update or change labels.\n\nTo see the latest fingerprint, make a get() request to retrieve an image.", + "format": "byte" + }, + "labels": { + "type": "object", + "description": "Labels to apply to this image. These can be later modified by the setLabels method.", + "additionalProperties": { + "type": "string" + } + }, "licenses": { "type": "array", "description": "Any applicable license URI.", @@ -2762,11 +3379,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Image resources.", + "description": "A list of Image resources.", "items": { "$ref": "Image" } @@ -2814,6 +3431,13 @@ "$ref": "AttachedDisk" } }, + "guestAccelerators": { + "type": "array", + "description": "List of the type and count of accelerator cards attached to the instance.", + "items": { + "$ref": "AcceleratorConfig" + } + }, "id": { "type": "string", "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", @@ -2824,6 +3448,18 @@ "description": "[Output Only] Type of the resource. Always compute#instance for instances.", "default": "compute#instance" }, + "labelFingerprint": { + "type": "string", + "description": "A fingerprint for this request, which is essentially a hash of the metadata's contents and used for optimistic locking. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update metadata. You must always provide an up-to-date fingerprint hash in order to update or change metadata.\n\nTo see the latest fingerprint, make get() request to the instance.", + "format": "byte" + }, + "labels": { + "type": "object", + "description": "Labels to apply to this instance. These can be later modified by the setLabels method.", + "additionalProperties": { + "type": "string" + } + }, "machineType": { "type": "string", "description": "Full or partial URL of the machine type resource to use for this instance, in the format: zones/zone/machineTypes/machine-type. This is provided by the client when the instance is created. For example, the following is a valid partial url to a predefined machine type:\n\nzones/us-central1-f/machineTypes/n1-standard-1 \n\nTo create a custom machine type, provide a URL to a machine type in the following format, where CPUS is 1 or an even number up to 32 (2, 4, 6, ... 24, etc), and MEMORY is the total memory for this instance. Memory must be a multiple of 256 MB and must be supplied in MB (e.g. 5 GB of memory is 5120 MB):\n\nzones/zone/machineTypes/custom-CPUS-MEMORY \n\nFor example: zones/us-central1-f/machineTypes/custom-4-5120 \n\nFor a full list of restrictions, read the Specifications for custom machine types.", @@ -2869,9 +3505,13 @@ "$ref": "ServiceAccount" } }, + "startRestricted": { + "type": "boolean", + "description": "[Output Only] Whether a VM has been restricted for start because Compute Engine has detected suspicious activity." + }, "status": { "type": "string", - "description": "[Output Only] The status of the instance. One of the following values: PROVISIONING, STAGING, RUNNING, STOPPING, SUSPENDING, SUSPENDED, and TERMINATED.", + "description": "[Output Only] The status of the instance. One of the following values: PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED, SUSPENDING, SUSPENDED, and TERMINATED.", "enum": [ "PROVISIONING", "RUNNING", @@ -2913,11 +3553,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped instance lists.", + "description": "A list of InstancesScopedList resources.", "additionalProperties": { "$ref": "InstancesScopedList", "description": "[Output Only] Name of the scope containing this set of instances." @@ -3015,11 +3655,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this aggregated list of instance groups. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped instance group lists.", + "description": "A list of InstanceGroupsScopedList resources.", "additionalProperties": { "$ref": "InstanceGroupsScopedList", "description": "The name of the scope that contains this set of instance groups." @@ -3036,7 +3676,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -3047,11 +3687,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this list of instance groups. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of instance groups.", + "description": "A list of InstanceGroup resources.", "items": { "$ref": "InstanceGroup" } @@ -3067,7 +3707,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -3127,7 +3767,8 @@ "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "annotations": { "required": [ - "compute.instanceGroupManagers.insert" + "compute.instanceGroupManagers.insert", + "compute.regionInstanceGroupManagers.insert" ] } }, @@ -3159,7 +3800,8 @@ "format": "int32", "annotations": { "required": [ - "compute.instanceGroupManagers.insert" + "compute.instanceGroupManagers.insert", + "compute.regionInstanceGroupManagers.insert" ] } }, @@ -3221,11 +3863,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this aggregated list of managed instance groups. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of filtered managed instance group lists.", + "description": "A list of InstanceGroupManagersScopedList resources.", "additionalProperties": { "$ref": "InstanceGroupManagersScopedList", "description": "[Output Only] The name of the scope that contains this set of managed instance groups." @@ -3242,7 +3884,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -3253,11 +3895,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this resource type. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of managed instance groups.", + "description": "A list of InstanceGroupManager resources.", "items": { "$ref": "InstanceGroupManager" } @@ -3458,11 +4100,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this list of instances in the specified instance group. The server generates this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of instances and any named ports that are assigned to those instances.", + "description": "A list of InstanceWithNamedPorts resources.", "items": { "$ref": "InstanceWithNamedPorts" } @@ -3478,7 +4120,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this list of instances in the specified instance groups. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -3620,11 +4262,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of instances.", + "description": "A list of Instance resources.", "items": { "$ref": "Instance" } @@ -3665,7 +4307,7 @@ "properties": { "canIpForward": { "type": "boolean", - "description": "Enables instances created based on this template to send packets with source IP addresses other than their own and receive packets with destination IP addresses other than their own. If these instances will be used as an IP gateway or it will be set as the next-hop in a Route resource, specify true. If unsure, leave this set to false. See the Enable IP forwarding for instances documentation for more information." + "description": "Enables instances created based on this template to send packets with source IP addresses other than their own and receive packets with destination IP addresses other than their own. If these instances will be used as an IP gateway or it will be set as the next-hop in a Route resource, specify true. If unsure, leave this set to false. See the Enable IP forwarding documentation for more information." }, "description": { "type": "string", @@ -3678,6 +4320,20 @@ "$ref": "AttachedDisk" } }, + "guestAccelerators": { + "type": "array", + "description": "A list of guest accelerator cards' type and count to use for instances created from the instance template.", + "items": { + "$ref": "AcceleratorConfig" + } + }, + "labels": { + "type": "object", + "description": "Labels to apply to instances that are created from this template.", + "additionalProperties": { + "type": "string" + } + }, "machineType": { "type": "string", "description": "The machine type to use for instances that are created from this template.", @@ -3775,11 +4431,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this instance template. The server defines this identifier." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] list of InstanceTemplate resources.", + "description": "A list of InstanceTemplate resources.", "items": { "$ref": "InstanceTemplate" } @@ -3795,7 +4451,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this instance template list. The server defines this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -3922,6 +4578,36 @@ } } }, + "InstancesSetLabelsRequest": { + "id": "InstancesSetLabelsRequest", + "type": "object", + "properties": { + "labelFingerprint": { + "type": "string", + "description": "Fingerprint of the previous set of labels for this resource, used to prevent conflicts. Provide the latest fingerprint value when making a request to add or change labels.", + "format": "byte" + }, + "labels": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "InstancesSetMachineResourcesRequest": { + "id": "InstancesSetMachineResourcesRequest", + "type": "object", + "properties": { + "guestAccelerators": { + "type": "array", + "description": "List of the type and count of accelerator cards attached to the instance.", + "items": { + "$ref": "AcceleratorConfig" + } + } + } + }, "InstancesSetMachineTypeRequest": { "id": "InstancesSetMachineTypeRequest", "type": "object", @@ -3969,7 +4655,7 @@ "properties": { "chargesUseFee": { "type": "boolean", - "description": "[Output Only] If true, the customer will be charged license fee for running software that contains this license on an instance." + "description": "[Output Only] Deprecated. This field no longer reflects whether a license charges a usage fee." }, "kind": { "type": "string", @@ -4083,11 +4769,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped machine type lists.", + "description": "A list of MachineTypesScopedList resources.", "additionalProperties": { "$ref": "MachineTypesScopedList", "description": "[Output Only] Name of the scope containing this set of machine types." @@ -4115,11 +4801,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Machine Type resources.", + "description": "A list of MachineType resources.", "items": { "$ref": "MachineType" } @@ -4350,7 +5036,7 @@ }, "value": { "type": "string", - "description": "Value for the metadata entry. These are free-form strings, and only have meaning as interpreted by the image running in the instance. The only restriction placed on values is that their size must be less than or equal to 32768 bytes.", + "description": "Value for the metadata entry. These are free-form strings, and only have meaning as interpreted by the image running in the instance. The only restriction placed on values is that their size must be less than or equal to 262144 bytes (256 KiB).", "annotations": { "required": [ "compute.instances.insert", @@ -4431,6 +5117,13 @@ ] } }, + "peerings": { + "type": "array", + "description": "[Output Only] List of network peerings for the resource.", + "items": { + "$ref": "NetworkPeering" + } + }, "selfLink": { "type": "string", "description": "[Output Only] Server-defined URL for the resource." @@ -4456,6 +5149,13 @@ "$ref": "AccessConfig" } }, + "aliasIpRanges": { + "type": "array", + "description": "An array of alias IP ranges for this network interface. Can only be specified for network interfaces on subnet-mode networks.", + "items": { + "$ref": "AliasIpRange" + } + }, "kind": { "type": "string", "description": "[Output Only] Type of the resource. Always compute#networkInterface for network interfaces.", @@ -4486,11 +5186,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Network resources.", + "description": "A list of Network resources.", "items": { "$ref": "Network" } @@ -4510,6 +5210,69 @@ } } }, + "NetworkPeering": { + "id": "NetworkPeering", + "type": "object", + "description": "A network peering attached to a network resource. The message includes the peering name, peer network, peering state, and a flag indicating whether Google Compute Engine should automatically create routes for the peering.", + "properties": { + "autoCreateRoutes": { + "type": "boolean", + "description": "Whether full mesh connectivity is created and managed automatically. When it is set to true, Google Compute Engine will automatically create and manage the routes between two networks when the state is ACTIVE. Otherwise, user needs to create routes manually to route packets to peer network." + }, + "name": { + "type": "string", + "description": "Name of this peering. Provided by the client when the peering is created. The name must comply with RFC1035. Specifically, the name must be 1-63 characters long and match regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all the following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash." + }, + "network": { + "type": "string", + "description": "The URL of the peer network. It can be either full URL or partial URL. The peer network may belong to a different project. If the partial URL does not contain project, it is assumed that the peer network is in the same project as the current network." + }, + "state": { + "type": "string", + "description": "[Output Only] State for the peering.", + "enum": [ + "ACTIVE", + "INACTIVE" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "stateDetails": { + "type": "string", + "description": "[Output Only] Details about the current state of the peering." + } + } + }, + "NetworksAddPeeringRequest": { + "id": "NetworksAddPeeringRequest", + "type": "object", + "properties": { + "autoCreateRoutes": { + "type": "boolean", + "description": "Whether Google Compute Engine manages the routes automatically." + }, + "name": { + "type": "string", + "description": "Name of the peering, which should conform to RFC1035." + }, + "peerNetwork": { + "type": "string", + "description": "URL of the peer network. It can be either full URL or partial URL. The peer network may belong to a different project. If the partial URL does not contain project, it is assumed that the peer network is in the same project as the current network." + } + } + }, + "NetworksRemovePeeringRequest": { + "id": "NetworksRemovePeeringRequest", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the peering, which should conform to RFC1035." + } + } + }, "Operation": { "id": "Operation", "type": "object", @@ -4959,6 +5722,70 @@ "usageExportLocation": { "$ref": "UsageExportLocation", "description": "The naming prefix for daily usage reports and the Google Cloud Storage bucket where they are stored." + }, + "xpnProjectStatus": { + "type": "string", + "description": "[Output Only] The role this project has in a shared VPC configuration. Currently only HOST projects are differentiated.", + "enum": [ + "HOST", + "UNSPECIFIED_XPN_PROJECT_STATUS" + ], + "enumDescriptions": [ + "", + "" + ] + } + } + }, + "ProjectsDisableXpnResourceRequest": { + "id": "ProjectsDisableXpnResourceRequest", + "type": "object", + "properties": { + "xpnResource": { + "$ref": "XpnResourceId", + "description": "Service resource (a.k.a service project) ID." + } + } + }, + "ProjectsEnableXpnResourceRequest": { + "id": "ProjectsEnableXpnResourceRequest", + "type": "object", + "properties": { + "xpnResource": { + "$ref": "XpnResourceId", + "description": "Service resource (a.k.a service project) ID." + } + } + }, + "ProjectsGetXpnResources": { + "id": "ProjectsGetXpnResources", + "type": "object", + "properties": { + "kind": { + "type": "string", + "description": "[Output Only] Type of resource. Always compute#projectsGetXpnResources for lists of service resources (a.k.a service projects)", + "default": "compute#projectsGetXpnResources" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "resources": { + "type": "array", + "description": "Serive resources (a.k.a service projects) attached to this project as their shared VPC host.", + "items": { + "$ref": "XpnResourceId" + } + } + } + }, + "ProjectsListXpnHostsRequest": { + "id": "ProjectsListXpnHostsRequest", + "type": "object", + "properties": { + "organization": { + "type": "string", + "description": "Optional organization ID managed by Cloud Resource Manager, for which to list shared VPC host projects. If not specified, the organization will be inferred from the project." } } }, @@ -4979,6 +5806,7 @@ "AUTOSCALERS", "BACKEND_BUCKETS", "BACKEND_SERVICES", + "COMMITMENTS", "CPUS", "CPUS_ALL_REGIONS", "DISKS_TOTAL_GB", @@ -4993,11 +5821,15 @@ "IN_USE_ADDRESSES", "LOCAL_SSD_TOTAL_GB", "NETWORKS", + "NVIDIA_K80_GPUS", "PREEMPTIBLE_CPUS", + "PREEMPTIBLE_LOCAL_SSD_GB", "REGIONAL_AUTOSCALERS", "REGIONAL_INSTANCE_GROUP_MANAGERS", "ROUTERS", "ROUTES", + "SECURITY_POLICIES", + "SECURITY_POLICY_RULES", "SNAPSHOTS", "SSD_TOTAL_GB", "SSL_CERTIFICATES", @@ -5047,6 +5879,11 @@ "", "", "", + "", + "", + "", + "", + "", "" ] }, @@ -5127,11 +5964,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of autoscalers.", + "description": "A list of Autoscaler resources.", "items": { "$ref": "Autoscaler" } @@ -5143,7 +5980,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", @@ -5158,7 +5995,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -5178,7 +6015,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -5189,11 +6026,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of managed instance groups.", + "description": "A list of InstanceGroupManager resources.", "items": { "$ref": "InstanceGroupManager" } @@ -5205,11 +6042,11 @@ }, "nextPageToken": { "type": "string", - "description": "[Output only] A token used to continue a truncated list request." + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." }, "selfLink": { "type": "string", - "description": "[Output only] The URL for this resource type. The server generates this URL." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -5299,11 +6136,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "A list of instances and any named ports that are assigned to those instances.", + "description": "A list of InstanceWithNamedPorts resources.", "items": { "$ref": "InstanceWithNamedPorts" } @@ -5319,7 +6156,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] Server-defined URL for the resource." + "description": "[Output Only] Server-defined URL for this resource." } } }, @@ -5371,11 +6208,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Region resources.", + "description": "A list of Region resources.", "items": { "$ref": "Region" } @@ -5395,6 +6232,32 @@ } } }, + "ResourceCommitment": { + "id": "ResourceCommitment", + "type": "object", + "description": "Commitment for a particular resource (a Commitment is composed of one or more of these).", + "properties": { + "amount": { + "type": "string", + "description": "The amount of the resource purchased (in a type-dependent unit, such as bytes). For vCPUs, this can just be an integer. For memory, this must be provided in MB. Memory must be a multiple of 256 MB, with up to 6.5GB of memory per every vCPU.", + "format": "int64" + }, + "type": { + "type": "string", + "description": "Type of resource for which this commitment applies. Possible values are VCPU and MEMORY", + "enum": [ + "MEMORY", + "UNSPECIFIED", + "VCPU" + ], + "enumDescriptions": [ + "", + "", + "" + ] + } + } + }, "ResourceGroupReference": { "id": "ResourceGroupReference", "type": "object", @@ -5408,7 +6271,7 @@ "Route": { "id": "Route", "type": "object", - "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving a instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, an instance gateway, or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.", + "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving an instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, an instance gateway, or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.", "properties": { "creationTimestamp": { "type": "string", @@ -5472,6 +6335,10 @@ "type": "string", "description": "The URL of the local network if it should handle matching packets." }, + "nextHopPeering": { + "type": "string", + "description": "[Output Only] The network peering name that should handle matching packets, which should conform to RFC1035." + }, "nextHopVpnTunnel": { "type": "string", "description": "The URL to a VpnTunnel that should handle matching packets." @@ -5583,11 +6450,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Route resources.", + "description": "A list of Route resources.", "items": { "$ref": "Route" } @@ -5684,11 +6551,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped router lists.", + "description": "A list of Router resources.", "additionalProperties": { "$ref": "RoutersScopedList", "description": "Name of the scope containing this set of routers." @@ -5779,7 +6646,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -6137,6 +7004,18 @@ "description": "[Output Only] Type of the resource. Always compute#snapshot for Snapshot resources.", "default": "compute#snapshot" }, + "labelFingerprint": { + "type": "string", + "description": "A fingerprint for the labels being applied to this snapshot, which is essentially a hash of the labels set used for optimistic locking. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update labels. You must always provide an up-to-date fingerprint hash in order to update or change labels.\n\nTo see the latest fingerprint, make a get() request to retrieve a snapshot.", + "format": "byte" + }, + "labels": { + "type": "object", + "description": "Labels to apply to this snapshot. These can be later modified by the setLabels method. Label values may be empty.", + "additionalProperties": { + "type": "string" + } + }, "licenses": { "type": "array", "description": "[Output Only] A list of public visible licenses that apply to this snapshot. This can be because the original image had licenses attached (such as a Windows image).", @@ -6213,11 +7092,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of Snapshot resources.", + "description": "A list of Snapshot resources.", "items": { "$ref": "Snapshot" } @@ -6286,7 +7165,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -6321,11 +7200,11 @@ }, "description": { "type": "string", - "description": "An optional description of this resource. Provide this property when you create the resource." + "description": "An optional description of this resource. Provide this property when you create the resource. This field can be set only at resource creation time." }, "gatewayAddress": { "type": "string", - "description": "[Output Only] The gateway address for default routes to reach destination addresses outside this subnetwork." + "description": "[Output Only] The gateway address for default routes to reach destination addresses outside this subnetwork. This field can be set only at resource creation time." }, "id": { "type": "string", @@ -6334,7 +7213,7 @@ }, "ipCidrRange": { "type": "string", - "description": "The range of internal addresses that are owned by this subnetwork. Provide this property when you create the subnetwork. For example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and non-overlapping within a network. Only IPv4 is supported." + "description": "The range of internal addresses that are owned by this subnetwork. Provide this property when you create the subnetwork. For example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and non-overlapping within a network. Only IPv4 is supported. This field can be set only at resource creation time." }, "kind": { "type": "string", @@ -6348,15 +7227,22 @@ }, "network": { "type": "string", - "description": "The URL of the network to which this subnetwork belongs, provided by the client when initially creating the subnetwork. Only networks that are in the distributed mode can have subnetworks." + "description": "The URL of the network to which this subnetwork belongs, provided by the client when initially creating the subnetwork. Only networks that are in the distributed mode can have subnetworks. This field can be set only at resource creation time." }, "privateIpGoogleAccess": { "type": "boolean", - "description": "Whether the VMs in this subnet can access Google services without assigned external IP addresses." + "description": "Whether the VMs in this subnet can access Google services without assigned external IP addresses. This field can be both set at resource creation time and updated using setPrivateIpGoogleAccess." }, "region": { "type": "string", - "description": "URL of the region where the Subnetwork resides." + "description": "URL of the region where the Subnetwork resides. This field can be set only at resource creation time." + }, + "secondaryIpRanges": { + "type": "array", + "description": "An array of configurations for secondary IP ranges for VM instances contained in this subnetwork. The primary IP of such VM must belong to the primary ipCidrRange of the subnetwork. The alias IPs may belong to either primary or secondary ranges.", + "items": { + "$ref": "SubnetworkSecondaryRange" + } }, "selfLink": { "type": "string", @@ -6370,11 +7256,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output] A map of scoped Subnetwork lists.", + "description": "A list of SubnetworksScopedList resources.", "additionalProperties": { "$ref": "SubnetworksScopedList", "description": "Name of the scope containing this set of Subnetworks." @@ -6402,11 +7288,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "The Subnetwork resources.", + "description": "A list of Subnetwork resources.", "items": { "$ref": "Subnetwork" } @@ -6426,6 +7312,21 @@ } } }, + "SubnetworkSecondaryRange": { + "id": "SubnetworkSecondaryRange", + "type": "object", + "description": "Represents a secondary IP range of a subnetwork.", + "properties": { + "ipCidrRange": { + "type": "string", + "description": "The range of IP addresses belonging to this subnetwork secondary range. Provide this property when you create the subnetwork. Ranges must be unique and non-overlapping with all primary and secondary IP ranges within a network. Only IPv4 is supported." + }, + "rangeName": { + "type": "string", + "description": "The name associated with this subnetwork secondary range, used when adding an alias IP range to a VM instance. The name must be 1-63 characters long, and comply with RFC1035. The name must be unique within the subnetwork." + } + } + }, "SubnetworksExpandIpCidrRangeRequest": { "id": "SubnetworksExpandIpCidrRangeRequest", "type": "object", @@ -6626,7 +7527,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -6715,7 +7616,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -6801,7 +7702,7 @@ }, "items": { "type": "object", - "description": "A map of scoped target instance lists.", + "description": "A list of TargetInstance resources.", "additionalProperties": { "$ref": "TargetInstancesScopedList", "description": "Name of the scope containing this set of target instances." @@ -6829,7 +7730,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -7020,11 +7921,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped target pool lists.", + "description": "A list of TargetPool resources.", "additionalProperties": { "$ref": "TargetPoolsScopedList", "description": "Name of the scope containing this set of target pools." @@ -7069,7 +7970,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -7341,7 +8242,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -7365,12 +8266,121 @@ } } }, - "TargetVpnGateway": { - "id": "TargetVpnGateway", + "TargetTcpProxiesSetBackendServiceRequest": { + "id": "TargetTcpProxiesSetBackendServiceRequest", "type": "object", - "description": "Represents a Target VPN gateway resource.", "properties": { - "creationTimestamp": { + "service": { + "type": "string", + "description": "The URL of the new BackendService resource for the targetTcpProxy." + } + } + }, + "TargetTcpProxiesSetProxyHeaderRequest": { + "id": "TargetTcpProxiesSetProxyHeaderRequest", + "type": "object", + "properties": { + "proxyHeader": { + "type": "string", + "description": "The new type of proxy header to append before sending data to the backend. NONE or PROXY_V1 are allowed.", + "enum": [ + "NONE", + "PROXY_V1" + ], + "enumDescriptions": [ + "", + "" + ] + } + } + }, + "TargetTcpProxy": { + "id": "TargetTcpProxy", + "type": "object", + "description": "A TargetTcpProxy resource. This resource defines a TCP proxy.", + "properties": { + "creationTimestamp": { + "type": "string", + "description": "[Output Only] Creation timestamp in RFC3339 text format." + }, + "description": { + "type": "string", + "description": "An optional description of this resource. Provide this property when you create the resource." + }, + "id": { + "type": "string", + "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", + "format": "uint64" + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of the resource. Always compute#targetTcpProxy for target TCP proxies.", + "default": "compute#targetTcpProxy" + }, + "name": { + "type": "string", + "description": "Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.", + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?" + }, + "proxyHeader": { + "type": "string", + "description": "Specifies the type of proxy header to append before sending data to the backend, either NONE or PROXY_V1. The default is NONE.", + "enum": [ + "NONE", + "PROXY_V1" + ], + "enumDescriptions": [ + "", + "" + ] + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for the resource." + }, + "service": { + "type": "string", + "description": "URL to the BackendService resource." + } + } + }, + "TargetTcpProxyList": { + "id": "TargetTcpProxyList", + "type": "object", + "description": "Contains a list of TargetTcpProxy resources.", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] Unique identifier for the resource; defined by the server." + }, + "items": { + "type": "array", + "description": "A list of TargetTcpProxy resources.", + "items": { + "$ref": "TargetTcpProxy" + } + }, + "kind": { + "type": "string", + "description": "Type of resource.", + "default": "compute#targetTcpProxyList" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, + "TargetVpnGateway": { + "id": "TargetVpnGateway", + "type": "object", + "description": "Represents a Target VPN gateway resource.", + "properties": { + "creationTimestamp": { "type": "string", "description": "[Output Only] Creation timestamp in RFC3339 text format." }, @@ -7453,11 +8463,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "A map of scoped target vpn gateway lists.", + "description": "A list of TargetVpnGateway resources.", "additionalProperties": { "$ref": "TargetVpnGatewaysScopedList", "description": "[Output Only] Name of the scope containing this set of target VPN gateways." @@ -7485,11 +8495,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of TargetVpnGateway resources.", + "description": "A list of TargetVpnGateway resources.", "items": { "$ref": "TargetVpnGateway" } @@ -7680,7 +8690,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] Unique identifier for the resource. Set by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -7925,11 +8935,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "object", - "description": "[Output Only] A map of scoped vpn tunnel lists.", + "description": "A list of VpnTunnelsScopedList resources.", "additionalProperties": { "$ref": "VpnTunnelsScopedList", "description": "Name of the scope containing this set of vpn tunnels." @@ -7957,11 +8967,11 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", - "description": "[Output Only] A list of VpnTunnel resources.", + "description": "A list of VpnTunnel resources.", "items": { "$ref": "VpnTunnel" } @@ -8063,6 +9073,59 @@ } } }, + "XpnHostList": { + "id": "XpnHostList", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] Unique identifier for the resource; defined by the server." + }, + "items": { + "type": "array", + "description": "[Output Only] A list of shared VPC host project URLs.", + "items": { + "$ref": "Project" + } + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of resource. Always compute#xpnHostList for lists of shared VPC hosts.", + "default": "compute#xpnHostList" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, + "XpnResourceId": { + "id": "XpnResourceId", + "type": "object", + "description": "Service resource (a.k.a service project) ID.", + "properties": { + "id": { + "type": "string", + "description": "The ID of the service resource. In the case of projects, this field matches the project ID (e.g., my-project), not the project number (e.g., 12345678)." + }, + "type": { + "type": "string", + "description": "The type of the service resource.", + "enum": [ + "PROJECT", + "XPN_RESOURCE_TYPE_UNSPECIFIED" + ], + "enumDescriptions": [ + "", + "" + ] + } + } + }, "Zone": { "id": "Zone", "type": "object", @@ -8127,7 +9190,7 @@ }, "items": { "type": "array", - "description": "[Output Only] A list of Zone resources.", + "description": "A list of Zone resources.", "items": { "$ref": "Zone" } @@ -8146,20 +9209,38 @@ "description": "[Output Only] Server-defined URL for this resource." } } + }, + "ZoneSetLabelsRequest": { + "id": "ZoneSetLabelsRequest", + "type": "object", + "properties": { + "labelFingerprint": { + "type": "string", + "description": "The fingerprint of the previous set of labels for this resource, used to detect conflicts. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update labels. You must always provide an up-to-date fingerprint hash in order to update or change labels. Make a get() request to the resource to get the latest fingerprint.", + "format": "byte" + }, + "labels": { + "type": "object", + "description": "The labels to set for this resource.", + "additionalProperties": { + "type": "string" + } + } + } } }, "resources": { - "addresses": { + "acceleratorTypes": { "methods": { "aggregatedList": { - "id": "compute.addresses.aggregatedList", - "path": "{project}/aggregated/addresses", + "id": "compute.acceleratorTypes.aggregatedList", + "path": "{project}/aggregated/acceleratorTypes", "httpMethod": "GET", - "description": "Retrieves an aggregated list of addresses.", + "description": "Retrieves an aggregated list of accelerator types.", "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8192,7 +9273,7 @@ "project" ], "response": { - "$ref": "AddressAggregatedList" + "$ref": "AcceleratorTypeAggregatedList" }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", @@ -8200,15 +9281,15 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, - "delete": { - "id": "compute.addresses.delete", - "path": "{project}/regions/{region}/addresses/{address}", - "httpMethod": "DELETE", - "description": "Deletes the specified address resource.", + "get": { + "id": "compute.acceleratorTypes.get", + "path": "{project}/zones/{zone}/acceleratorTypes/{acceleratorType}", + "httpMethod": "GET", + "description": "Returns the specified accelerator type. Get a list of available accelerator types by making a list() request.", "parameters": { - "address": { + "acceleratorType": { "type": "string", - "description": "Name of the address resource to delete.", + "description": "Name of the accelerator type to return.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -8220,9 +9301,9 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, - "region": { + "zone": { "type": "string", - "description": "Name of the region for this request.", + "description": "The name of the zone for this request.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -8230,29 +9311,46 @@ }, "parameterOrder": [ "project", - "region", - "address" + "zone", + "acceleratorType" ], "response": { - "$ref": "Operation" + "$ref": "AcceleratorType" }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute" + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" ] }, - "get": { - "id": "compute.addresses.get", - "path": "{project}/regions/{region}/addresses/{address}", + "list": { + "id": "compute.acceleratorTypes.list", + "path": "{project}/zones/{zone}/acceleratorTypes", "httpMethod": "GET", - "description": "Returns the specified address resource.", + "description": "Retrieves a list of accelerator types available to the specified project.", "parameters": { - "address": { + "filter": { "type": "string", - "description": "Name of the address resource to return.", - "required": true, - "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - "location": "path" + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" + }, + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "orderBy": { + "type": "string", + "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" }, "project": { "type": "string", @@ -8261,9 +9359,9 @@ "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, - "region": { + "zone": { "type": "string", - "description": "Name of the region for this request.", + "description": "The name of the zone for this request.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -8271,34 +9369,169 @@ }, "parameterOrder": [ "project", - "region", - "address" + "zone" ], "response": { - "$ref": "Address" + "$ref": "AcceleratorTypeList" }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/compute", "https://www.googleapis.com/auth/compute.readonly" ] - }, - "insert": { - "id": "compute.addresses.insert", - "path": "{project}/regions/{region}/addresses", - "httpMethod": "POST", - "description": "Creates an address resource in the specified project using the data included in the request.", + } + } + }, + "addresses": { + "methods": { + "aggregatedList": { + "id": "compute.addresses.aggregatedList", + "path": "{project}/aggregated/addresses", + "httpMethod": "GET", + "description": "Retrieves an aggregated list of addresses.", "parameters": { - "project": { + "filter": { "type": "string", - "description": "Project ID for this request.", - "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - "location": "path" + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" }, - "region": { + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "orderBy": { "type": "string", - "description": "Name of the region for this request.", + "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "response": { + "$ref": "AddressAggregatedList" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "delete": { + "id": "compute.addresses.delete", + "path": "{project}/regions/{region}/addresses/{address}", + "httpMethod": "DELETE", + "description": "Deletes the specified address resource.", + "parameters": { + "address": { + "type": "string", + "description": "Name of the address resource to delete.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "address" + ], + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "get": { + "id": "compute.addresses.get", + "path": "{project}/regions/{region}/addresses/{address}", + "httpMethod": "GET", + "description": "Returns the specified address resource.", + "parameters": { + "address": { + "type": "string", + "description": "Name of the address resource to return.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "address" + ], + "response": { + "$ref": "Address" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "insert": { + "id": "compute.addresses.insert", + "path": "{project}/regions/{region}/addresses", + "httpMethod": "POST", + "description": "Creates an address resource in the specified project using the data included in the request.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -8327,7 +9560,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8388,7 +9621,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8556,7 +9789,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8609,7 +9842,7 @@ "id": "compute.autoscalers.patch", "path": "{project}/zones/{zone}/autoscalers", "httpMethod": "PATCH", - "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "autoscaler": { "type": "string", @@ -8797,7 +10030,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8842,7 +10075,7 @@ "id": "compute.backendBuckets.patch", "path": "{project}/global/backendBuckets/{backendBucket}", "httpMethod": "PATCH", - "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports patch semantics.", + "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "backendBucket": { "type": "string", @@ -8923,7 +10156,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9103,7 +10336,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9148,7 +10381,7 @@ "id": "compute.backendServices.patch", "path": "{project}/global/backendServices/{backendService}", "httpMethod": "PATCH", - "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "backendService": { "type": "string", @@ -9229,7 +10462,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9320,7 +10553,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9381,7 +10614,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9601,7 +10834,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9693,6 +10926,50 @@ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/compute" ] + }, + "setLabels": { + "id": "compute.disks.setLabels", + "path": "{project}/zones/{zone}/disks/{resource}/setLabels", + "httpMethod": "POST", + "description": "Sets the labels on a disk. To learn more about labels, read the Labeling Resources documentation.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "zone": { + "type": "string", + "description": "The name of the zone for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "resource" + ], + "request": { + "$ref": "ZoneSetLabelsRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] } } }, @@ -9801,7 +11078,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9926,7 +11203,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10094,7 +11371,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10294,7 +11571,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10442,7 +11719,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10531,7 +11808,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10644,7 +11921,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10792,7 +12069,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10837,7 +12114,7 @@ "id": "compute.healthChecks.patch", "path": "{project}/global/healthChecks/{healthCheck}", "httpMethod": "PATCH", - "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "healthCheck": { "type": "string", @@ -11013,7 +12290,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11058,7 +12335,7 @@ "id": "compute.httpHealthChecks.patch", "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", "httpMethod": "PATCH", - "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "httpHealthCheck": { "type": "string", @@ -11234,7 +12511,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11279,7 +12556,7 @@ "id": "compute.httpsHealthChecks.patch", "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", "httpMethod": "PATCH", - "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "httpsHealthCheck": { "type": "string", @@ -11495,6 +12772,11 @@ "httpMethod": "POST", "description": "Creates an image in the specified project using the data included in the request.", "parameters": { + "forceCreate": { + "type": "boolean", + "description": "Force image creation if true.", + "location": "query" + }, "project": { "type": "string", "description": "Project ID for this request.", @@ -11528,7 +12810,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11568,6 +12850,42 @@ "https://www.googleapis.com/auth/compute", "https://www.googleapis.com/auth/compute.readonly" ] + }, + "setLabels": { + "id": "compute.images.setLabels", + "path": "{project}/global/images/{resource}/setLabels", + "httpMethod": "POST", + "description": "Sets the labels on an image. To learn more about labels, read the Labeling Resources documentation.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "resource" + ], + "request": { + "$ref": "GlobalSetLabelsRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] } } }, @@ -11577,7 +12895,7 @@ "id": "compute.instanceGroupManagers.abandonInstances", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", "httpMethod": "POST", - "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -11623,7 +12941,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11707,7 +13025,7 @@ "id": "compute.instanceGroupManagers.deleteInstances", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", "httpMethod": "POST", - "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -11789,7 +13107,7 @@ "id": "compute.instanceGroupManagers.insert", "path": "{project}/zones/{zone}/instanceGroupManagers", "httpMethod": "POST", - "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group.", + "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group. Please contact Cloud Support if you need an increase in this limit.", "parameters": { "project": { "type": "string", @@ -11828,7 +13146,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11939,7 +13257,7 @@ "id": "compute.instanceGroupManagers.recreateInstances", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", "httpMethod": "POST", - "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -11981,7 +13299,7 @@ "id": "compute.instanceGroupManagers.resize", "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize", "httpMethod": "POST", - "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", "parameters": { "instanceGroupManager": { "type": "string", @@ -12162,7 +13480,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12325,7 +13643,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12381,7 +13699,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "instanceGroup": { @@ -12443,7 +13761,7 @@ "id": "compute.instanceGroups.removeInstances", "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances", "httpMethod": "POST", - "description": "Removes one or more instances from the specified instance group, but does not delete those instances.", + "description": "Removes one or more instances from the specified instance group, but does not delete those instances.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration before the VM instance is removed or deleted.", "parameters": { "instanceGroup": { "type": "string", @@ -12630,7 +13948,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12734,7 +14052,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12779,7 +14097,7 @@ "id": "compute.instances.attachDisk", "path": "{project}/zones/{zone}/instances/{instance}/attachDisk", "httpMethod": "POST", - "description": "Attaches a Disk resource to an instance.", + "description": "Attaches an existing Disk resource to an instance. You must first create the disk before you can attach it. It is not possible to create and attach a disk at the same time. For more information, read Adding a persistent disk to your instance.", "parameters": { "instance": { "type": "string", @@ -13106,7 +14424,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13252,11 +14570,11 @@ "https://www.googleapis.com/auth/compute" ] }, - "setMachineType": { - "id": "compute.instances.setMachineType", - "path": "{project}/zones/{zone}/instances/{instance}/setMachineType", + "setLabels": { + "id": "compute.instances.setLabels", + "path": "{project}/zones/{zone}/instances/{instance}/setLabels", "httpMethod": "POST", - "description": "Changes the machine type for a stopped instance to the machine type specified in the request.", + "description": "Sets labels on an instance. To learn more about labels, read the Labeling Resources documentation.", "parameters": { "instance": { "type": "string", @@ -13286,7 +14604,7 @@ "instance" ], "request": { - "$ref": "InstancesSetMachineTypeRequest" + "$ref": "InstancesSetLabelsRequest" }, "response": { "$ref": "Operation" @@ -13296,11 +14614,11 @@ "https://www.googleapis.com/auth/compute" ] }, - "setMetadata": { - "id": "compute.instances.setMetadata", - "path": "{project}/zones/{zone}/instances/{instance}/setMetadata", + "setMachineResources": { + "id": "compute.instances.setMachineResources", + "path": "{project}/zones/{zone}/instances/{instance}/setMachineResources", "httpMethod": "POST", - "description": "Sets metadata for the specified instance to the data included in the request.", + "description": "Changes the number and/or type of accelerator for a stopped instance to the values specified in the request.", "parameters": { "instance": { "type": "string", @@ -13330,7 +14648,7 @@ "instance" ], "request": { - "$ref": "Metadata" + "$ref": "InstancesSetMachineResourcesRequest" }, "response": { "$ref": "Operation" @@ -13340,15 +14658,15 @@ "https://www.googleapis.com/auth/compute" ] }, - "setScheduling": { - "id": "compute.instances.setScheduling", - "path": "{project}/zones/{zone}/instances/{instance}/setScheduling", + "setMachineType": { + "id": "compute.instances.setMachineType", + "path": "{project}/zones/{zone}/instances/{instance}/setMachineType", "httpMethod": "POST", - "description": "Sets an instance's scheduling options.", + "description": "Changes the machine type for a stopped instance to the machine type specified in the request.", "parameters": { "instance": { "type": "string", - "description": "Instance name.", + "description": "Name of the instance scoping this request.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -13374,7 +14692,7 @@ "instance" ], "request": { - "$ref": "Scheduling" + "$ref": "InstancesSetMachineTypeRequest" }, "response": { "$ref": "Operation" @@ -13384,15 +14702,15 @@ "https://www.googleapis.com/auth/compute" ] }, - "setServiceAccount": { - "id": "compute.instances.setServiceAccount", - "path": "{project}/zones/{zone}/instances/{instance}/setServiceAccount", + "setMetadata": { + "id": "compute.instances.setMetadata", + "path": "{project}/zones/{zone}/instances/{instance}/setMetadata", "httpMethod": "POST", - "description": "Sets the service account on the instance. For more information, read Changing the service account and access scopes for an instance.", + "description": "Sets metadata for the specified instance to the data included in the request.", "parameters": { "instance": { "type": "string", - "description": "Name of the instance resource to start.", + "description": "Name of the instance scoping this request.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -13418,7 +14736,7 @@ "instance" ], "request": { - "$ref": "InstancesSetServiceAccountRequest" + "$ref": "Metadata" }, "response": { "$ref": "Operation" @@ -13428,15 +14746,15 @@ "https://www.googleapis.com/auth/compute" ] }, - "setTags": { - "id": "compute.instances.setTags", - "path": "{project}/zones/{zone}/instances/{instance}/setTags", + "setScheduling": { + "id": "compute.instances.setScheduling", + "path": "{project}/zones/{zone}/instances/{instance}/setScheduling", "httpMethod": "POST", - "description": "Sets tags for the specified instance to the data included in the request.", + "description": "Sets an instance's scheduling options.", "parameters": { "instance": { "type": "string", - "description": "Name of the instance scoping this request.", + "description": "Instance name.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -13462,7 +14780,7 @@ "instance" ], "request": { - "$ref": "Tags" + "$ref": "Scheduling" }, "response": { "$ref": "Operation" @@ -13472,11 +14790,11 @@ "https://www.googleapis.com/auth/compute" ] }, - "start": { - "id": "compute.instances.start", - "path": "{project}/zones/{zone}/instances/{instance}/start", + "setServiceAccount": { + "id": "compute.instances.setServiceAccount", + "path": "{project}/zones/{zone}/instances/{instance}/setServiceAccount", "httpMethod": "POST", - "description": "Starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.", + "description": "Sets the service account on the instance. For more information, read Changing the service account and access scopes for an instance.", "parameters": { "instance": { "type": "string", @@ -13505,6 +14823,9 @@ "zone", "instance" ], + "request": { + "$ref": "InstancesSetServiceAccountRequest" + }, "response": { "$ref": "Operation" }, @@ -13513,9 +14834,94 @@ "https://www.googleapis.com/auth/compute" ] }, - "startWithEncryptionKey": { - "id": "compute.instances.startWithEncryptionKey", - "path": "{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey", + "setTags": { + "id": "compute.instances.setTags", + "path": "{project}/zones/{zone}/instances/{instance}/setTags", + "httpMethod": "POST", + "description": "Sets tags for the specified instance to the data included in the request.", + "parameters": { + "instance": { + "type": "string", + "description": "Name of the instance scoping this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "zone": { + "type": "string", + "description": "The name of the zone for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "instance" + ], + "request": { + "$ref": "Tags" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "start": { + "id": "compute.instances.start", + "path": "{project}/zones/{zone}/instances/{instance}/start", + "httpMethod": "POST", + "description": "Starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.", + "parameters": { + "instance": { + "type": "string", + "description": "Name of the instance resource to start.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "zone": { + "type": "string", + "description": "The name of the zone for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "instance" + ], + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "startWithEncryptionKey": { + "id": "compute.instances.startWithEncryptionKey", + "path": "{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey", "httpMethod": "POST", "description": "Starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.", "parameters": { @@ -13606,7 +15012,7 @@ "id": "compute.licenses.get", "path": "{project}/global/licenses/{license}", "httpMethod": "GET", - "description": "Returns the specified License resource. Get a list of available licenses by making a list() request.", + "description": "Returns the specified License resource.", "parameters": { "license": { "type": "string", @@ -13648,7 +15054,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13739,7 +15145,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13792,6 +15198,42 @@ }, "networks": { "methods": { + "addPeering": { + "id": "compute.networks.addPeering", + "path": "{project}/global/networks/{network}/addPeering", + "httpMethod": "POST", + "description": "Adds a peering to the specified network.", + "parameters": { + "network": { + "type": "string", + "description": "Name of the network resource to add peering to.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "network" + ], + "request": { + "$ref": "NetworksAddPeeringRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "delete": { "id": "compute.networks.delete", "path": "{project}/global/networks/{network}", @@ -13895,7 +15337,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13936,6 +15378,42 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "removePeering": { + "id": "compute.networks.removePeering", + "path": "{project}/global/networks/{network}/removePeering", + "httpMethod": "POST", + "description": "Removes a peering from the specified network.", + "parameters": { + "network": { + "type": "string", + "description": "Name of the network resource to remove peering from.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "network" + ], + "request": { + "$ref": "NetworksRemovePeeringRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "switchToCustomMode": { "id": "compute.networks.switchToCustomMode", "path": "{project}/global/networks/{network}/switchToCustomMode", @@ -13973,6 +15451,112 @@ }, "projects": { "methods": { + "disableXpnHost": { + "id": "compute.projects.disableXpnHost", + "path": "{project}/disableXpnHost", + "httpMethod": "POST", + "description": "Disable this project as a shared VPC host project.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "disableXpnResource": { + "id": "compute.projects.disableXpnResource", + "path": "{project}/disableXpnResource", + "httpMethod": "POST", + "description": "Disable a serivce resource (a.k.a service project) associated with this host project.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "request": { + "$ref": "ProjectsDisableXpnResourceRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "enableXpnHost": { + "id": "compute.projects.enableXpnHost", + "path": "{project}/enableXpnHost", + "httpMethod": "POST", + "description": "Enable this project as a shared VPC host project.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "enableXpnResource": { + "id": "compute.projects.enableXpnResource", + "path": "{project}/enableXpnResource", + "httpMethod": "POST", + "description": "Enable service resource (a.k.a service project) for a host project, so that subnets in the host project can be used by instances in the service project.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "request": { + "$ref": "ProjectsEnableXpnResourceRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "get": { "id": "compute.projects.get", "path": "{project}", @@ -13999,6 +15583,122 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, + "getXpnHost": { + "id": "compute.projects.getXpnHost", + "path": "{project}/getXpnHost", + "httpMethod": "GET", + "description": "Get the shared VPC host project that this project links to. May be empty if no link exists.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "response": { + "$ref": "Project" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "getXpnResources": { + "id": "compute.projects.getXpnResources", + "path": "{project}/getXpnResources", + "httpMethod": "GET", + "description": "Get service resources (a.k.a service project) associated with this host project.", + "parameters": { + "filter": { + "type": "string", + "location": "query" + }, + "maxResults": { + "type": "integer", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "order_by": { + "type": "string", + "location": "query" + }, + "pageToken": { + "type": "string", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "response": { + "$ref": "ProjectsGetXpnResources" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "listXpnHosts": { + "id": "compute.projects.listXpnHosts", + "path": "{project}/listXpnHosts", + "httpMethod": "POST", + "description": "List all shared VPC host projects visible to the user in an organization.", + "parameters": { + "filter": { + "type": "string", + "location": "query" + }, + "maxResults": { + "type": "integer", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "order_by": { + "type": "string", + "location": "query" + }, + "pageToken": { + "type": "string", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "request": { + "$ref": "ProjectsListXpnHostsRequest" + }, + "response": { + "$ref": "XpnHostList" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "moveDisk": { "id": "compute.projects.moveDisk", "path": "{project}/moveDisk", @@ -14245,7 +15945,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14298,7 +15998,7 @@ "id": "compute.regionAutoscalers.patch", "path": "{project}/regions/{region}/autoscalers", "httpMethod": "PATCH", - "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", + "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "autoscaler": { "type": "string", @@ -14554,7 +16254,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14607,7 +16307,7 @@ "id": "compute.regionBackendServices.patch", "path": "{project}/regions/{region}/backendServices/{backendService}", "httpMethod": "PATCH", - "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", + "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "backendService": { "type": "string", @@ -14648,18 +16348,209 @@ "https://www.googleapis.com/auth/compute.readonly" ] }, - "update": { - "id": "compute.regionBackendServices.update", - "path": "{project}/regions/{region}/backendServices/{backendService}", - "httpMethod": "PUT", - "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information.", + "update": { + "id": "compute.regionBackendServices.update", + "path": "{project}/regions/{region}/backendServices/{backendService}", + "httpMethod": "PUT", + "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information.", + "parameters": { + "backendService": { + "type": "string", + "description": "Name of the BackendService resource to update.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region scoping this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "backendService" + ], + "request": { + "$ref": "BackendService" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + } + } + }, + "regionCommitments": { + "methods": { + "aggregatedList": { + "id": "compute.regionCommitments.aggregatedList", + "path": "{project}/aggregated/commitments", + "httpMethod": "GET", + "description": "Retrieves an aggregated list of commitments.", + "parameters": { + "filter": { + "type": "string", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" + }, + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "orderBy": { + "type": "string", + "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "response": { + "$ref": "CommitmentAggregatedList" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "get": { + "id": "compute.regionCommitments.get", + "path": "{project}/regions/{region}/commitments/{commitment}", + "httpMethod": "GET", + "description": "Returns the specified commitment resource. Get a list of available commitments by making a list() request.", + "parameters": { + "commitment": { + "type": "string", + "description": "Name of the commitment to return.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "commitment" + ], + "response": { + "$ref": "Commitment" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "insert": { + "id": "compute.regionCommitments.insert", + "path": "{project}/regions/{region}/commitments", + "httpMethod": "POST", + "description": "Creates a commitment in the specified project using the data included in the request.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region" + ], + "request": { + "$ref": "Commitment" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "list": { + "id": "compute.regionCommitments.list", + "path": "{project}/regions/{region}/commitments", + "httpMethod": "GET", + "description": "Retrieves a list of commitments contained within the specified region.", "parameters": { - "backendService": { + "filter": { "type": "string", - "description": "Name of the BackendService resource to update.", - "required": true, - "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - "location": "path" + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" + }, + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "orderBy": { + "type": "string", + "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" }, "project": { "type": "string", @@ -14670,7 +16561,7 @@ }, "region": { "type": "string", - "description": "Name of the region scoping this request.", + "description": "Name of the region for this request.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -14678,18 +16569,15 @@ }, "parameterOrder": [ "project", - "region", - "backendService" + "region" ], - "request": { - "$ref": "BackendService" - }, "response": { - "$ref": "Operation" + "$ref": "CommitmentList" }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/compute" + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" ] } } @@ -14700,7 +16588,7 @@ "id": "compute.regionInstanceGroupManagers.abandonInstances", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", "httpMethod": "POST", - "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -14781,7 +16669,7 @@ "id": "compute.regionInstanceGroupManagers.deleteInstances", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", "httpMethod": "POST", - "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -14902,7 +16790,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15013,7 +16901,7 @@ "id": "compute.regionInstanceGroupManagers.recreateInstances", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", "httpMethod": "POST", - "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", "parameters": { "instanceGroupManager": { "type": "string", @@ -15055,7 +16943,7 @@ "id": "compute.regionInstanceGroupManagers.resize", "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize", "httpMethod": "POST", - "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", "parameters": { "instanceGroupManager": { "type": "string", @@ -15235,7 +17123,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15291,7 +17179,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "instanceGroup": { @@ -15483,7 +17371,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15578,7 +17466,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15631,7 +17519,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15841,7 +17729,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -15894,7 +17782,7 @@ "id": "compute.routers.patch", "path": "{project}/regions/{region}/routers/{router}", "httpMethod": "PATCH", - "description": "Patches the specified Router resource with the data included in the request. This method supports patch semantics.", + "description": "Patches the specified Router resource with the data included in the request. This method supports PATCH semantics and uses JSON merge patch format and processing rules.", "parameters": { "project": { "type": "string", @@ -16131,7 +18019,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16251,7 +18139,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16291,6 +18179,42 @@ "https://www.googleapis.com/auth/compute", "https://www.googleapis.com/auth/compute.readonly" ] + }, + "setLabels": { + "id": "compute.snapshots.setLabels", + "path": "{project}/global/snapshots/{resource}/setLabels", + "httpMethod": "POST", + "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling Resources documentation.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "resource": { + "type": "string", + "description": "Name of the resource for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "resource" + ], + "request": { + "$ref": "GlobalSetLabelsRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] } } }, @@ -16399,7 +18323,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16452,7 +18376,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16664,7 +18588,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -16717,7 +18641,7 @@ "id": "compute.subnetworks.setPrivateIpGoogleAccess", "path": "{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess", "httpMethod": "POST", - "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Cloudpath.", + "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Private Google Access.", "parameters": { "project": { "type": "string", @@ -16864,7 +18788,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17048,7 +18972,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17173,7 +19097,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17341,7 +19265,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17490,7 +19414,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17703,7 +19627,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -17997,7 +19921,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18148,6 +20072,226 @@ } } }, + "targetTcpProxies": { + "methods": { + "delete": { + "id": "compute.targetTcpProxies.delete", + "path": "{project}/global/targetTcpProxies/{targetTcpProxy}", + "httpMethod": "DELETE", + "description": "Deletes the specified TargetTcpProxy resource.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "targetTcpProxy": { + "type": "string", + "description": "Name of the TargetTcpProxy resource to delete.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "targetTcpProxy" + ], + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "get": { + "id": "compute.targetTcpProxies.get", + "path": "{project}/global/targetTcpProxies/{targetTcpProxy}", + "httpMethod": "GET", + "description": "Returns the specified TargetTcpProxy resource. Get a list of available target TCP proxies by making a list() request.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "targetTcpProxy": { + "type": "string", + "description": "Name of the TargetTcpProxy resource to return.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "targetTcpProxy" + ], + "response": { + "$ref": "TargetTcpProxy" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "insert": { + "id": "compute.targetTcpProxies.insert", + "path": "{project}/global/targetTcpProxies", + "httpMethod": "POST", + "description": "Creates a TargetTcpProxy resource in the specified project using the data included in the request.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "request": { + "$ref": "TargetTcpProxy" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "list": { + "id": "compute.targetTcpProxies.list", + "path": "{project}/global/targetTcpProxies", + "httpMethod": "GET", + "description": "Retrieves the list of TargetTcpProxy resources available to the specified project.", + "parameters": { + "filter": { + "type": "string", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" + }, + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + "default": "500", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "orderBy": { + "type": "string", + "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "response": { + "$ref": "TargetTcpProxyList" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "setBackendService": { + "id": "compute.targetTcpProxies.setBackendService", + "path": "{project}/global/targetTcpProxies/{targetTcpProxy}/setBackendService", + "httpMethod": "POST", + "description": "Changes the BackendService for TargetTcpProxy.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "targetTcpProxy": { + "type": "string", + "description": "Name of the TargetTcpProxy resource whose BackendService resource is to be set.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "targetTcpProxy" + ], + "request": { + "$ref": "TargetTcpProxiesSetBackendServiceRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "setProxyHeader": { + "id": "compute.targetTcpProxies.setProxyHeader", + "path": "{project}/global/targetTcpProxies/{targetTcpProxy}/setProxyHeader", + "httpMethod": "POST", + "description": "Changes the ProxyHeaderType for TargetTcpProxy.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "targetTcpProxy": { + "type": "string", + "description": "Name of the TargetTcpProxy resource whose ProxyHeader is to be set.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "targetTcpProxy" + ], + "request": { + "$ref": "TargetTcpProxiesSetProxyHeaderRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + } + } + }, "targetVpnGateways": { "methods": { "aggregatedList": { @@ -18158,7 +20302,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18326,7 +20470,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18518,7 +20662,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18563,7 +20707,7 @@ "id": "compute.urlMaps.patch", "path": "{project}/global/urlMaps/{urlMap}", "httpMethod": "PATCH", - "description": "Patches the specified UrlMap resource with the data included in the request. This method supports patch semantics.", + "description": "Patches the specified UrlMap resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", "parameters": { "project": { "type": "string", @@ -18680,7 +20824,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18848,7 +20992,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -18989,7 +21133,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -19084,7 +21228,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { diff --git a/vendor/google.golang.org/api/compute/v1/compute-gen.go b/vendor/google.golang.org/api/compute/v1/compute-gen.go index 0f0124281cd4c..8a7df317a6cfb 100644 --- a/vendor/google.golang.org/api/compute/v1/compute-gen.go +++ b/vendor/google.golang.org/api/compute/v1/compute-gen.go @@ -71,6 +71,7 @@ func New(client *http.Client) (*Service, error) { return nil, errors.New("client is nil") } s := &Service{client: client, BasePath: basePath} + s.AcceleratorTypes = NewAcceleratorTypesService(s) s.Addresses = NewAddressesService(s) s.Autoscalers = NewAutoscalersService(s) s.BackendBuckets = NewBackendBucketsService(s) @@ -96,6 +97,7 @@ func New(client *http.Client) (*Service, error) { s.Projects = NewProjectsService(s) s.RegionAutoscalers = NewRegionAutoscalersService(s) s.RegionBackendServices = NewRegionBackendServicesService(s) + s.RegionCommitments = NewRegionCommitmentsService(s) s.RegionInstanceGroupManagers = NewRegionInstanceGroupManagersService(s) s.RegionInstanceGroups = NewRegionInstanceGroupsService(s) s.RegionOperations = NewRegionOperationsService(s) @@ -110,6 +112,7 @@ func New(client *http.Client) (*Service, error) { s.TargetInstances = NewTargetInstancesService(s) s.TargetPools = NewTargetPoolsService(s) s.TargetSslProxies = NewTargetSslProxiesService(s) + s.TargetTcpProxies = NewTargetTcpProxiesService(s) s.TargetVpnGateways = NewTargetVpnGatewaysService(s) s.UrlMaps = NewUrlMapsService(s) s.VpnTunnels = NewVpnTunnelsService(s) @@ -123,6 +126,8 @@ type Service struct { BasePath string // API endpoint base URL UserAgent string // optional additional User-Agent fragment + AcceleratorTypes *AcceleratorTypesService + Addresses *AddressesService Autoscalers *AutoscalersService @@ -173,6 +178,8 @@ type Service struct { RegionBackendServices *RegionBackendServicesService + RegionCommitments *RegionCommitmentsService + RegionInstanceGroupManagers *RegionInstanceGroupManagersService RegionInstanceGroups *RegionInstanceGroupsService @@ -201,6 +208,8 @@ type Service struct { TargetSslProxies *TargetSslProxiesService + TargetTcpProxies *TargetTcpProxiesService + TargetVpnGateways *TargetVpnGatewaysService UrlMaps *UrlMapsService @@ -219,6 +228,15 @@ func (s *Service) userAgent() string { return googleapi.UserAgent + " " + s.UserAgent } +func NewAcceleratorTypesService(s *Service) *AcceleratorTypesService { + rs := &AcceleratorTypesService{s: s} + return rs +} + +type AcceleratorTypesService struct { + s *Service +} + func NewAddressesService(s *Service) *AddressesService { rs := &AddressesService{s: s} return rs @@ -444,6 +462,15 @@ type RegionBackendServicesService struct { s *Service } +func NewRegionCommitmentsService(s *Service) *RegionCommitmentsService { + rs := &RegionCommitmentsService{s: s} + return rs +} + +type RegionCommitmentsService struct { + s *Service +} + func NewRegionInstanceGroupManagersService(s *Service) *RegionInstanceGroupManagersService { rs := &RegionInstanceGroupManagersService{s: s} return rs @@ -570,6 +597,15 @@ type TargetSslProxiesService struct { s *Service } +func NewTargetTcpProxiesService(s *Service) *TargetTcpProxiesService { + rs := &TargetTcpProxiesService{s: s} + return rs +} + +type TargetTcpProxiesService struct { + s *Service +} + func NewTargetVpnGatewaysService(s *Service) *TargetVpnGatewaysService { rs := &TargetVpnGatewaysService{s: s} return rs @@ -615,6 +651,337 @@ type ZonesService struct { s *Service } +// AcceleratorConfig: A specification of the type and number of +// accelerator cards attached to the instance. +type AcceleratorConfig struct { + // AcceleratorCount: The number of the guest accelerator cards exposed + // to this instance. + AcceleratorCount int64 `json:"acceleratorCount,omitempty"` + + // AcceleratorType: Full or partial URL of the accelerator type resource + // to expose to this instance. + AcceleratorType string `json:"acceleratorType,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AcceleratorCount") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AcceleratorCount") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *AcceleratorConfig) MarshalJSON() ([]byte, error) { + type noMethod AcceleratorConfig + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AcceleratorType: An Accelerator Type resource. +type AcceleratorType struct { + // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text + // format. + CreationTimestamp string `json:"creationTimestamp,omitempty"` + + // Deprecated: [Output Only] The deprecation status associated with this + // accelerator type. + Deprecated *DeprecationStatus `json:"deprecated,omitempty"` + + // Description: [Output Only] An optional textual description of the + // resource. + Description string `json:"description,omitempty"` + + // Id: [Output Only] The unique identifier for the resource. This + // identifier is defined by the server. + Id uint64 `json:"id,omitempty,string"` + + // Kind: [Output Only] The type of the resource. Always + // compute#acceleratorType for accelerator types. + Kind string `json:"kind,omitempty"` + + // MaximumCardsPerInstance: [Output Only] Maximum accelerator cards + // allowed per instance. + MaximumCardsPerInstance int64 `json:"maximumCardsPerInstance,omitempty"` + + // Name: [Output Only] Name of the resource. + Name string `json:"name,omitempty"` + + // SelfLink: [Output Only] Server-defined fully-qualified URL for this + // resource. + SelfLink string `json:"selfLink,omitempty"` + + // Zone: [Output Only] The name of the zone where the accelerator type + // resides, such as us-central1-a. + Zone string `json:"zone,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "CreationTimestamp") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CreationTimestamp") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *AcceleratorType) MarshalJSON() ([]byte, error) { + type noMethod AcceleratorType + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type AcceleratorTypeAggregatedList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. + Id string `json:"id,omitempty"` + + // Items: A list of AcceleratorTypesScopedList resources. + Items map[string]AcceleratorTypesScopedList `json:"items,omitempty"` + + // Kind: [Output Only] Type of resource. Always + // compute#acceleratorTypeAggregatedList for aggregated lists of + // accelerator types. + Kind string `json:"kind,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AcceleratorTypeAggregatedList) MarshalJSON() ([]byte, error) { + type noMethod AcceleratorTypeAggregatedList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AcceleratorTypeList: Contains a list of accelerator types. +type AcceleratorTypeList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. + Id string `json:"id,omitempty"` + + // Items: A list of AcceleratorType resources. + Items []*AcceleratorType `json:"items,omitempty"` + + // Kind: [Output Only] Type of resource. Always + // compute#acceleratorTypeList for lists of accelerator types. + Kind string `json:"kind,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AcceleratorTypeList) MarshalJSON() ([]byte, error) { + type noMethod AcceleratorTypeList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type AcceleratorTypesScopedList struct { + // AcceleratorTypes: [Output Only] List of accelerator types contained + // in this scope. + AcceleratorTypes []*AcceleratorType `json:"acceleratorTypes,omitempty"` + + // Warning: [Output Only] An informational warning that appears when the + // accelerator types list is empty. + Warning *AcceleratorTypesScopedListWarning `json:"warning,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AcceleratorTypes") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AcceleratorTypes") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *AcceleratorTypesScopedList) MarshalJSON() ([]byte, error) { + type noMethod AcceleratorTypesScopedList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// AcceleratorTypesScopedListWarning: [Output Only] An informational +// warning that appears when the accelerator types list is empty. +type AcceleratorTypesScopedListWarning struct { + // Code: [Output Only] A warning code, if applicable. For example, + // Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in + // the response. + // + // Possible values: + // "CLEANUP_FAILED" + // "DEPRECATED_RESOURCE_USED" + // "DISK_SIZE_LARGER_THAN_IMAGE_SIZE" + // "FIELD_VALUE_OVERRIDEN" + // "INJECTED_KERNELS_DEPRECATED" + // "NEXT_HOP_ADDRESS_NOT_ASSIGNED" + // "NEXT_HOP_CANNOT_IP_FORWARD" + // "NEXT_HOP_INSTANCE_NOT_FOUND" + // "NEXT_HOP_INSTANCE_NOT_ON_NETWORK" + // "NEXT_HOP_NOT_RUNNING" + // "NOT_CRITICAL_ERROR" + // "NO_RESULTS_ON_PAGE" + // "REQUIRED_TOS_AGREEMENT" + // "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING" + // "RESOURCE_NOT_DELETED" + // "SINGLE_INSTANCE_PROPERTY_TEMPLATE" + // "UNREACHABLE" + Code string `json:"code,omitempty"` + + // Data: [Output Only] Metadata about this warning in key: value format. + // For example: + // "data": [ { "key": "scope", "value": "zones/us-east1-d" } + Data []*AcceleratorTypesScopedListWarningData `json:"data,omitempty"` + + // Message: [Output Only] A human-readable description of the warning + // code. + Message string `json:"message,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Code") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Code") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AcceleratorTypesScopedListWarning) MarshalJSON() ([]byte, error) { + type noMethod AcceleratorTypesScopedListWarning + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type AcceleratorTypesScopedListWarningData struct { + // Key: [Output Only] A key that provides more detail on the warning + // being returned. For example, for warnings where there are no results + // in a list request for a particular zone, this key might be scope and + // the key value might be the zone name. Other examples might be a key + // indicating a deprecated resource and a suggested replacement, or a + // warning about invalid network settings (for example, if an instance + // attempts to perform IP forwarding but is not enabled for IP + // forwarding). + Key string `json:"key,omitempty"` + + // Value: [Output Only] A warning data value corresponding to the key. + Value string `json:"value,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Key") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Key") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AcceleratorTypesScopedListWarningData) MarshalJSON() ([]byte, error) { + type noMethod AcceleratorTypesScopedListWarningData + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // AccessConfig: An access configuration attached to an instance's // network interface. Only one access config per instance is supported. type AccessConfig struct { @@ -681,6 +1048,16 @@ type Address struct { // identifier is defined by the server. Id uint64 `json:"id,omitempty,string"` + // IpVersion: The IP Version that will be used by this address. Valid + // options are IPV4 or IPV6. This can only be specified for a global + // address. + // + // Possible values: + // "IPV4" + // "IPV6" + // "UNSPECIFIED_VERSION" + IpVersion string `json:"ipVersion,omitempty"` + // Kind: [Output Only] Type of the resource. Always compute#address for // addresses. Kind string `json:"kind,omitempty"` @@ -747,7 +1124,7 @@ type AddressAggregatedList struct { // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped address lists. + // Items: A list of AddressesScopedList resources. Items map[string]AddressesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -794,11 +1171,11 @@ func (s *AddressAggregatedList) MarshalJSON() ([]byte, error) { // AddressList: Contains a list of addresses. type AddressList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of addresses. + // Items: A list of Address resources. Items []*Address `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#addressList for @@ -813,7 +1190,7 @@ type AddressList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -970,6 +1347,45 @@ func (s *AddressesScopedListWarningData) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// AliasIpRange: An alias IP range attached to an instance's network +// interface. +type AliasIpRange struct { + // IpCidrRange: The IP CIDR range represented by this alias IP range. + // This IP CIDR range must belong to the specified subnetwork and cannot + // contain IP addresses reserved by system or used by other network + // interfaces. This range may be a single IP address (e.g. 10.2.3.4), a + // netmask (e.g. /24) or a CIDR format string (e.g. 10.1.2.0/24). + IpCidrRange string `json:"ipCidrRange,omitempty"` + + // SubnetworkRangeName: Optional subnetwork secondary range name + // specifying the secondary range from which to allocate the IP CIDR + // range for this alias IP range. If left unspecified, the primary range + // of the subnetwork will be used. + SubnetworkRangeName string `json:"subnetworkRangeName,omitempty"` + + // ForceSendFields is a list of field names (e.g. "IpCidrRange") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "IpCidrRange") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AliasIpRange) MarshalJSON() ([]byte, error) { + type noMethod AliasIpRange + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // AttachedDisk: An instance-attached disk resource. type AttachedDisk struct { // AutoDelete: Specifies whether the disk will be auto-deleted when the @@ -1244,6 +1660,20 @@ type Autoscaler struct { // SelfLink: [Output Only] Server-defined URL for the resource. SelfLink string `json:"selfLink,omitempty"` + // Status: [Output Only] The status of the autoscaler configuration. + // + // Possible values: + // "ACTIVE" + // "DELETING" + // "ERROR" + // "PENDING" + Status string `json:"status,omitempty"` + + // StatusDetails: [Output Only] Human-readable details about the current + // state of the autoscaler. Read the documentation for Commonly returned + // status messages for examples of status messages you might encounter. + StatusDetails []*AutoscalerStatusDetails `json:"statusDetails,omitempty"` + // Target: URL of the managed instance group that this autoscaler will // scale. Target string `json:"target,omitempty"` @@ -1281,11 +1711,11 @@ func (s *Autoscaler) MarshalJSON() ([]byte, error) { } type AutoscalerAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped autoscaler lists. + // Items: A list of AutoscalersScopedList resources. Items map[string]AutoscalersScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -1332,8 +1762,8 @@ func (s *AutoscalerAggregatedList) MarshalJSON() ([]byte, error) { // AutoscalerList: Contains a list of Autoscaler resources. type AutoscalerList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of Autoscaler resources. @@ -1381,6 +1811,53 @@ func (s *AutoscalerList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type AutoscalerStatusDetails struct { + // Message: The status message. + Message string `json:"message,omitempty"` + + // Type: The type of error returned. + // + // Possible values: + // "ALL_INSTANCES_UNHEALTHY" + // "BACKEND_SERVICE_DOES_NOT_EXIST" + // "CAPPED_AT_MAX_NUM_REPLICAS" + // "CUSTOM_METRIC_DATA_POINTS_TOO_SPARSE" + // "CUSTOM_METRIC_INVALID" + // "MIN_EQUALS_MAX" + // "MISSING_CUSTOM_METRIC_DATA_POINTS" + // "MISSING_LOAD_BALANCING_DATA_POINTS" + // "MORE_THAN_ONE_BACKEND_SERVICE" + // "NOT_ENOUGH_QUOTA_AVAILABLE" + // "REGION_RESOURCE_STOCKOUT" + // "SCALING_TARGET_DOES_NOT_EXIST" + // "UNKNOWN" + // "UNSUPPORTED_MAX_RATE_LOAD_BALANCING_CONFIGURATION" + // "ZONE_RESOURCE_STOCKOUT" + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Message") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Message") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *AutoscalerStatusDetails) MarshalJSON() ([]byte, error) { + type noMethod AutoscalerStatusDetails + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type AutoscalersScopedList struct { // Autoscalers: [Output Only] List of autoscalers contained in this // scope. @@ -1631,27 +2108,22 @@ func (s *AutoscalingPolicyCpuUtilization) UnmarshalJSON(data []byte) error { // AutoscalingPolicyCustomMetricUtilization: Custom utilization metric // policy. type AutoscalingPolicyCustomMetricUtilization struct { - // Metric: The identifier of the Stackdriver Monitoring metric. The - // metric cannot have negative values and should be a utilization + // Metric: The identifier (type) of the Stackdriver Monitoring metric. + // The metric cannot have negative values and should be a utilization // metric, which means that the number of virtual machines handling - // requests should increase or decrease proportionally to the metric. - // The metric must also have a label of - // compute.googleapis.com/resource_id with the value of the instance's - // unique ID, although this alone does not guarantee that the metric is - // valid. + // requests should increase or decrease proportionally to the + // metric. // - // For example, the following is a valid - // metric: - // compute.googleapis.com/instance/network/received_bytes_count - // T - // he following is not a valid metric because it does not increase or - // decrease based on - // usage: - // compute.googleapis.com/instance/cpu/reserved_cores + // The metric must have a value type of INT64 or DOUBLE. Metric string `json:"metric,omitempty"` - // UtilizationTarget: Target value of the metric which autoscaler should - // maintain. Must be a positive value. + // UtilizationTarget: The target value of the metric that autoscaler + // should maintain. This must be a positive value. + // + // For example, a good metric to use as a utilization_target is + // compute.googleapis.com/instance/network/received_bytes_count. The + // autoscaler will work to keep this value constant for each of the + // instances. UtilizationTarget float64 `json:"utilizationTarget,omitempty"` // UtilizationTargetType: Defines how target utilization value is @@ -1756,7 +2228,8 @@ type Backend struct { // Valid values are UTILIZATION, RATE (for HTTP(S)) and CONNECTION (for // TCP/SSL). // - // This cannot be used for internal load balancing. + // For Internal Load Balancing, the default and only supported mode is + // CONNECTION. // // Possible values: // "CONNECTION" @@ -1778,8 +2251,8 @@ type Backend struct { // property when you create the resource. Description string `json:"description,omitempty"` - // Group: The fully-qualified URL of a zonal Instance Group resource. - // This instance group defines the list of instances that serve traffic. + // Group: The fully-qualified URL of a Instance Group resource. This + // instance group defines the list of instances that serve traffic. // Member virtual machine instances from each instance group must live // in the same zone as the instance group itself. No two backends in a // backend service are allowed to use same Instance Group @@ -1789,8 +2262,7 @@ type Backend struct { // fully-qualified URL, rather than a partial URL. // // When the BackendService has load balancing scheme INTERNAL, the - // instance group must be in a zone within the same region as the - // BackendService. + // instance group must be within the same region as the BackendService. Group string `json:"group,omitempty"` // MaxConnections: The max number of simultaneous connections for the @@ -1949,8 +2421,12 @@ type BackendBucketList struct { // Kind: Type of resource. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -2024,12 +2500,15 @@ type BackendService struct { // HealthChecks: The list of URLs to the HttpHealthCheck or // HttpsHealthCheck resource for health checking this BackendService. // Currently at most one health check can be specified, and a health - // check is required. + // check is required for GCE backend services. A health check must not + // be specified for GAE app backend and Cloud Function backend. // // For internal load balancing, a URL to a HealthCheck resource must be // specified instead. HealthChecks []string `json:"healthChecks,omitempty"` + Iap *BackendServiceIAP `json:"iap,omitempty"` + // Id: [Output Only] The unique identifier for the resource. This // identifier is defined by the server. Id uint64 `json:"id,omitempty,string"` @@ -2150,14 +2629,18 @@ type BackendServiceAggregatedList struct { // server. Id string `json:"id,omitempty"` - // Items: A map of scoped BackendService lists. + // Items: A list of BackendServicesScopedList resources. Items map[string]BackendServicesScopedList `json:"items,omitempty"` // Kind: Type of resource. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -2254,6 +2737,41 @@ func (s *BackendServiceGroupHealth) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// BackendServiceIAP: Identity-Aware Proxy +type BackendServiceIAP struct { + Enabled bool `json:"enabled,omitempty"` + + Oauth2ClientId string `json:"oauth2ClientId,omitempty"` + + Oauth2ClientSecret string `json:"oauth2ClientSecret,omitempty"` + + // Oauth2ClientSecretSha256: [Output Only] SHA256 hash value for the + // field oauth2_client_secret above. + Oauth2ClientSecretSha256 string `json:"oauth2ClientSecretSha256,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Enabled") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Enabled") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *BackendServiceIAP) MarshalJSON() ([]byte, error) { + type noMethod BackendServiceIAP + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // BackendServiceList: Contains a list of BackendService resources. type BackendServiceList struct { // Id: [Output Only] Unique identifier for the resource; defined by the @@ -2516,6 +3034,343 @@ func (s *CacheKeyPolicy) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// Commitment: Represents a Commitment resource. Creating a Commitment +// resource means that you are purchasing a committed use contract with +// an explicit start and end time. You can create commitments based on +// vCPUs and memory usage and receive discounted rates. For full +// details, read Signing Up for Committed Use Discounts. +// +// Committed use discounts are subject to Google Cloud Platform's +// Service Specific Terms. By purchasing a committed use discount, you +// agree to these terms. Committed use discounts will not renew, so you +// must purchase a new commitment to continue receiving discounts. +type Commitment struct { + // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text + // format. + CreationTimestamp string `json:"creationTimestamp,omitempty"` + + // Description: An optional description of this resource. Provide this + // property when you create the resource. + Description string `json:"description,omitempty"` + + // EndTimestamp: [Output Only] Commitment end time in RFC3339 text + // format. + EndTimestamp string `json:"endTimestamp,omitempty"` + + // Id: [Output Only] The unique identifier for the resource. This + // identifier is defined by the server. + Id uint64 `json:"id,omitempty,string"` + + // Kind: [Output Only] Type of the resource. Always compute#commitment + // for commitments. + Kind string `json:"kind,omitempty"` + + // Name: Name of the resource. Provided by the client when the resource + // is created. The name must be 1-63 characters long, and comply with + // RFC1035. Specifically, the name must be 1-63 characters long and + // match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means + // the first character must be a lowercase letter, and all following + // characters must be a dash, lowercase letter, or digit, except the + // last character, which cannot be a dash. + Name string `json:"name,omitempty"` + + // Plan: The plan for this commitment, which determines duration and + // discount rate. The currently supported plans are TWELVE_MONTH (1 + // year), and THIRTY_SIX_MONTH (3 years). + // + // Possible values: + // "INVALID" + // "THIRTY_SIX_MONTH" + // "TWELVE_MONTH" + Plan string `json:"plan,omitempty"` + + // Region: [Output Only] URL of the region where this commitment may be + // used. + Region string `json:"region,omitempty"` + + // Resources: List of commitment amounts for particular resources. Note + // that VCPU and MEMORY resource commitments must occur together. + Resources []*ResourceCommitment `json:"resources,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for the resource. + SelfLink string `json:"selfLink,omitempty"` + + // StartTimestamp: [Output Only] Commitment start time in RFC3339 text + // format. + StartTimestamp string `json:"startTimestamp,omitempty"` + + // Status: [Output Only] Status of the commitment with regards to + // eventual expiration (each commitment has an end date defined). One of + // the following values: NOT_YET_ACTIVE, ACTIVE, EXPIRED. + // + // Possible values: + // "ACTIVE" + // "CREATING" + // "EXPIRED" + // "NOT_YET_ACTIVE" + Status string `json:"status,omitempty"` + + // StatusMessage: [Output Only] An optional, human-readable explanation + // of the status. + StatusMessage string `json:"statusMessage,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "CreationTimestamp") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CreationTimestamp") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *Commitment) MarshalJSON() ([]byte, error) { + type noMethod Commitment + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type CommitmentAggregatedList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. + Id string `json:"id,omitempty"` + + // Items: A list of CommitmentsScopedList resources. + Items map[string]CommitmentsScopedList `json:"items,omitempty"` + + // Kind: [Output Only] Type of resource. Always + // compute#commitmentAggregatedList for aggregated lists of commitments. + Kind string `json:"kind,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CommitmentAggregatedList) MarshalJSON() ([]byte, error) { + type noMethod CommitmentAggregatedList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CommitmentList: Contains a list of Commitment resources. +type CommitmentList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. + Id string `json:"id,omitempty"` + + // Items: A list of Commitment resources. + Items []*Commitment `json:"items,omitempty"` + + // Kind: [Output Only] Type of resource. Always compute#commitmentList + // for lists of commitments. + Kind string `json:"kind,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CommitmentList) MarshalJSON() ([]byte, error) { + type noMethod CommitmentList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type CommitmentsScopedList struct { + // Commitments: [Output Only] List of commitments contained in this + // scope. + Commitments []*Commitment `json:"commitments,omitempty"` + + // Warning: [Output Only] Informational warning which replaces the list + // of commitments when the list is empty. + Warning *CommitmentsScopedListWarning `json:"warning,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Commitments") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Commitments") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CommitmentsScopedList) MarshalJSON() ([]byte, error) { + type noMethod CommitmentsScopedList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// CommitmentsScopedListWarning: [Output Only] Informational warning +// which replaces the list of commitments when the list is empty. +type CommitmentsScopedListWarning struct { + // Code: [Output Only] A warning code, if applicable. For example, + // Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in + // the response. + // + // Possible values: + // "CLEANUP_FAILED" + // "DEPRECATED_RESOURCE_USED" + // "DISK_SIZE_LARGER_THAN_IMAGE_SIZE" + // "FIELD_VALUE_OVERRIDEN" + // "INJECTED_KERNELS_DEPRECATED" + // "NEXT_HOP_ADDRESS_NOT_ASSIGNED" + // "NEXT_HOP_CANNOT_IP_FORWARD" + // "NEXT_HOP_INSTANCE_NOT_FOUND" + // "NEXT_HOP_INSTANCE_NOT_ON_NETWORK" + // "NEXT_HOP_NOT_RUNNING" + // "NOT_CRITICAL_ERROR" + // "NO_RESULTS_ON_PAGE" + // "REQUIRED_TOS_AGREEMENT" + // "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING" + // "RESOURCE_NOT_DELETED" + // "SINGLE_INSTANCE_PROPERTY_TEMPLATE" + // "UNREACHABLE" + Code string `json:"code,omitempty"` + + // Data: [Output Only] Metadata about this warning in key: value format. + // For example: + // "data": [ { "key": "scope", "value": "zones/us-east1-d" } + Data []*CommitmentsScopedListWarningData `json:"data,omitempty"` + + // Message: [Output Only] A human-readable description of the warning + // code. + Message string `json:"message,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Code") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Code") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CommitmentsScopedListWarning) MarshalJSON() ([]byte, error) { + type noMethod CommitmentsScopedListWarning + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type CommitmentsScopedListWarningData struct { + // Key: [Output Only] A key that provides more detail on the warning + // being returned. For example, for warnings where there are no results + // in a list request for a particular zone, this key might be scope and + // the key value might be the zone name. Other examples might be a key + // indicating a deprecated resource and a suggested replacement, or a + // warning about invalid network settings (for example, if an instance + // attempts to perform IP forwarding but is not enabled for IP + // forwarding). + Key string `json:"key,omitempty"` + + // Value: [Output Only] A warning data value corresponding to the key. + Value string `json:"value,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Key") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Key") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CommitmentsScopedListWarningData) MarshalJSON() ([]byte, error) { + type noMethod CommitmentsScopedListWarningData + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // ConnectionDraining: Message containing connection draining // configuration. type ConnectionDraining struct { @@ -2709,6 +3564,21 @@ type Disk struct { // disks. Kind string `json:"kind,omitempty"` + // LabelFingerprint: A fingerprint for the labels being applied to this + // disk, which is essentially a hash of the labels set used for + // optimistic locking. The fingerprint is initially generated by Compute + // Engine and changes after every request to modify or update labels. + // You must always provide an up-to-date fingerprint hash in order to + // update or change labels. + // + // To see the latest fingerprint, make a get() request to retrieve a + // disk. + LabelFingerprint string `json:"labelFingerprint,omitempty"` + + // Labels: Labels to apply to this disk. These can be later modified by + // the setLabels method. + Labels map[string]string `json:"labels,omitempty"` + // LastAttachTimestamp: [Output Only] Last attach timestamp in RFC3339 // text format. LastAttachTimestamp string `json:"lastAttachTimestamp,omitempty"` @@ -2743,7 +3613,8 @@ type Disk struct { // // If you specify this field along with sourceImage or sourceSnapshot, // the value of sizeGb must not be less than the size of the sourceImage - // or the size of the snapshot. + // or the size of the snapshot. Acceptable values are 1 to 65536, + // inclusive. SizeGb int64 `json:"sizeGb,omitempty,string"` // SourceImage: The source image used to create this disk. If the source @@ -2858,11 +3729,11 @@ func (s *Disk) MarshalJSON() ([]byte, error) { } type DiskAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped disk lists. + // Items: A list of DisksScopedList resources. Items map[string]DisksScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -2874,8 +3745,7 @@ type DiskAggregatedList struct { // than maxResults, use the nextPageToken as a value for the query // parameter pageToken in the next list request. Subsequent list // requests will have their own nextPageToken to continue paging through - // the results. Acceptable values are 0 to 500, inclusive. (Default: - // 500) + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -2921,11 +3791,12 @@ type DiskList struct { // lists of disks. Kind string `json:"kind,omitempty"` - // NextPageToken: This token allows you to get the next page of results - // for list requests. If the number of results is larger than - // maxResults, use the nextPageToken as a value for the query parameter - // pageToken in the next list request. Subsequent list requests will - // have their own nextPageToken to continue paging through the results. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -3068,11 +3939,11 @@ func (s *DiskType) MarshalJSON() ([]byte, error) { } type DiskTypeAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped disk type lists. + // Items: A list of DiskTypesScopedList resources. Items map[string]DiskTypesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -3119,11 +3990,11 @@ func (s *DiskTypeAggregatedList) MarshalJSON() ([]byte, error) { // DiskTypeList: Contains a list of disk types. type DiskTypeList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Disk Type resources. + // Items: A list of DiskType resources. Items []*DiskType `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#diskTypeList for @@ -3469,7 +4340,7 @@ type Firewall struct { // identifier is defined by the server. Id uint64 `json:"id,omitempty,string"` - // Kind: [Output Ony] Type of the resource. Always compute#firewall for + // Kind: [Output Only] Type of the resource. Always compute#firewall for // firewall rules. Kind string `json:"kind,omitempty"` @@ -3508,15 +4379,18 @@ type Firewall struct { // the firewall to apply. Only IPv4 is supported. SourceRanges []string `json:"sourceRanges,omitempty"` - // SourceTags: If source tags are specified, the firewall will apply - // only to traffic with source IP that belongs to a tag listed in source - // tags. Source tags cannot be used to control traffic to an instance's - // external IP address. Because tags are associated with an instance, - // not an IP address. One or both of sourceRanges and sourceTags may be - // set. If both properties are set, the firewall will apply to traffic - // that has source IP address within sourceRanges OR the source IP that - // belongs to a tag listed in the sourceTags property. The connection - // does not need to match both properties for the firewall to apply. + // SourceTags: If source tags are specified, the firewall rule applies + // only to traffic with source IPs that match the primary network + // interfaces of VM instances that have the tag and are in the same VPC + // network. Source tags cannot be used to control traffic to an + // instance's external IP address, it only applies to traffic between + // instances in the same virtual network. Because tags are associated + // with instances, not IP addresses. One or both of sourceRanges and + // sourceTags may be set. If both properties are set, the firewall will + // apply to traffic that has source IP address within sourceRanges OR + // the source IP that belongs to a tag listed in the sourceTags + // property. The connection does not need to match both properties for + // the firewall to apply. SourceTags []string `json:"sourceTags,omitempty"` // TargetTags: A list of instance tags indicating sets of instances @@ -3556,7 +4430,7 @@ type FirewallAllowed struct { // IPProtocol: The IP protocol to which this rule applies. The protocol // type is required when creating a firewall rule. This value can either // be one of the following well known protocol strings (tcp, udp, icmp, - // esp, ah, sctp), or the IP protocol number. + // esp, ah, ipip, sctp), or the IP protocol number. IPProtocol string `json:"IPProtocol,omitempty"` // Ports: An optional list of ports to which this rule applies. This @@ -3592,11 +4466,11 @@ func (s *FirewallAllowed) MarshalJSON() ([]byte, error) { // FirewallList: Contains a list of firewalls. type FirewallList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Firewall resources. + // Items: A list of Firewall resources. Items []*Firewall `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#firewallList for @@ -3651,15 +4525,16 @@ type ForwardingRule struct { // For global forwarding rules, the address must be a global IP. For // regional forwarding rules, the address must live in the same region // as the forwarding rule. By default, this field is empty and an - // ephemeral IP from the same scope (global or regional) will be - // assigned. + // ephemeral IPv4 address from the same scope (global or regional) will + // be assigned. A regional forwarding rule supports IPv4 only. A global + // forwarding rule supports either IPv4 or IPv6. // // When the load balancing scheme is INTERNAL, this can only be an RFC // 1918 IP address belonging to the network/subnetwork configured for // the forwarding rule. A reserved address cannot be used. If the field // is empty, the IP address will be automatically allocated from the // internal IP range of the subnetwork or network configured for this - // forwarding rule. Only IPv4 is supported. + // forwarding rule. IPAddress string `json:"IPAddress,omitempty"` // IPProtocol: The IP protocol to which this rule applies. Valid options @@ -3696,6 +4571,16 @@ type ForwardingRule struct { // identifier is defined by the server. Id uint64 `json:"id,omitempty,string"` + // IpVersion: The IP Version that will be used by this forwarding rule. + // Valid options are IPV4 or IPV6. This can only be specified for a + // global forwarding rule. + // + // Possible values: + // "IPV4" + // "IPV6" + // "UNSPECIFIED_VERSION" + IpVersion string `json:"ipVersion,omitempty"` + // Kind: [Output Only] Type of the resource. Always // compute#forwardingRule for Forwarding Rule resources. Kind string `json:"kind,omitempty"` @@ -3742,7 +4627,10 @@ type ForwardingRule struct { // ports: // - TargetHttpProxy: 80, 8080 // - TargetHttpsProxy: 443 - // - TargetSslProxy: 443 + // - TargetTcpProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, + // 995, 1883, 5222 + // - TargetSslProxy: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, + // 995, 1883, 5222 // - TargetVpnGateway: 500, 4500 // - PortRange string `json:"portRange,omitempty"` @@ -3814,11 +4702,11 @@ func (s *ForwardingRule) MarshalJSON() ([]byte, error) { } type ForwardingRuleAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped forwarding rule lists. + // Items: A list of ForwardingRulesScopedList resources. Items map[string]ForwardingRulesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -3865,7 +4753,7 @@ func (s *ForwardingRuleAggregatedList) MarshalJSON() ([]byte, error) { // ForwardingRuleList: Contains a list of ForwardingRule resources. type ForwardingRuleList struct { - // Id: [Output Only] Unique identifier for the resource. Set by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -4041,9 +4929,52 @@ func (s *ForwardingRulesScopedListWarningData) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type GlobalSetLabelsRequest struct { + // LabelFingerprint: The fingerprint of the previous set of labels for + // this resource, used to detect conflicts. The fingerprint is initially + // generated by Compute Engine and changes after every request to modify + // or update labels. You must always provide an up-to-date fingerprint + // hash when updating or changing labels. Make a get() request to the + // resource to get the latest fingerprint. + LabelFingerprint string `json:"labelFingerprint,omitempty"` + + // Labels: A list of labels to apply for this resource. Each label key & + // value must comply with RFC1035. Specifically, the name must be 1-63 + // characters long and match the regular expression + // [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a + // lowercase letter, and all following characters must be a dash, + // lowercase letter, or digit, except the last character, which cannot + // be a dash. For example, "webserver-frontend": "images". A label value + // can also be empty (e.g. "my-label": ""). + Labels map[string]string `json:"labels,omitempty"` + + // ForceSendFields is a list of field names (e.g. "LabelFingerprint") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "LabelFingerprint") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *GlobalSetLabelsRequest) MarshalJSON() ([]byte, error) { + type noMethod GlobalSetLabelsRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // GuestOsFeature: Guest OS features. type GuestOsFeature struct { - // Type: The type of supported feature. Currenty only + // Type: The type of supported feature. Currently only // VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the // server might also populate this property with the value WINDOWS to // indicate that this is a Windows image. This value is purely @@ -4278,8 +5209,8 @@ func (s *HealthCheck) MarshalJSON() ([]byte, error) { // HealthCheckList: Contains a list of HealthCheck resources. type HealthCheckList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of HealthCheck resources. @@ -4531,7 +5462,7 @@ func (s *HttpHealthCheck) MarshalJSON() ([]byte, error) { // HttpHealthCheckList: Contains a list of HttpHealthCheck resources. type HttpHealthCheckList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -4749,11 +5680,11 @@ type Image struct { // GuestOsFeatures: A list of features to enable on the guest OS. // Applicable for bootable images only. Currently, only one feature can - // be enabled, VIRTIO_SCSCI_MULTIQUEUE, which allows each virtual CPU to + // be enabled, VIRTIO_SCSI_MULTIQUEUE, which allows each virtual CPU to // have its own queue. For Windows images, you can only enable - // VIRTIO_SCSCI_MULTIQUEUE on images with driver version 1.2.0.1621 or + // VIRTIO_SCSI_MULTIQUEUE on images with driver version 1.2.0.1621 or // higher. Linux images with kernel versions 3.17 and higher will - // support VIRTIO_SCSCI_MULTIQUEUE. + // support VIRTIO_SCSI_MULTIQUEUE. // // For new Windows images, the server might also populate this field // with the value WINDOWS, to indicate that this is a Windows image. @@ -4784,6 +5715,21 @@ type Image struct { // images. Kind string `json:"kind,omitempty"` + // LabelFingerprint: A fingerprint for the labels being applied to this + // image, which is essentially a hash of the labels used for optimistic + // locking. The fingerprint is initially generated by Compute Engine and + // changes after every request to modify or update labels. You must + // always provide an up-to-date fingerprint hash in order to update or + // change labels. + // + // To see the latest fingerprint, make a get() request to retrieve an + // image. + LabelFingerprint string `json:"labelFingerprint,omitempty"` + + // Labels: Labels to apply to this image. These can be later modified by + // the setLabels method. + Labels map[string]string `json:"labels,omitempty"` + // Licenses: Any applicable license URI. Licenses []string `json:"licenses,omitempty"` @@ -4913,11 +5859,11 @@ func (s *ImageRawDisk) MarshalJSON() ([]byte, error) { // ImageList: Contains a list of images. type ImageList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Image resources. + // Items: A list of Image resources. Items []*Image `json:"items,omitempty"` // Kind: Type of resource. @@ -4984,6 +5930,10 @@ type Instance struct { // must be created before you can assign them. Disks []*AttachedDisk `json:"disks,omitempty"` + // GuestAccelerators: List of the type and count of accelerator cards + // attached to the instance. + GuestAccelerators []*AcceleratorConfig `json:"guestAccelerators,omitempty"` + // Id: [Output Only] The unique identifier for the resource. This // identifier is defined by the server. Id uint64 `json:"id,omitempty,string"` @@ -4992,6 +5942,20 @@ type Instance struct { // instances. Kind string `json:"kind,omitempty"` + // LabelFingerprint: A fingerprint for this request, which is + // essentially a hash of the metadata's contents and used for optimistic + // locking. The fingerprint is initially generated by Compute Engine and + // changes after every request to modify or update metadata. You must + // always provide an up-to-date fingerprint hash in order to update or + // change metadata. + // + // To see the latest fingerprint, make get() request to the instance. + LabelFingerprint string `json:"labelFingerprint,omitempty"` + + // Labels: Labels to apply to this instance. These can be later modified + // by the setLabels method. + Labels map[string]string `json:"labels,omitempty"` + // MachineType: Full or partial URL of the machine type resource to use // for this instance, in the format: // zones/zone/machineTypes/machine-type. This is provided by the client @@ -5051,8 +6015,12 @@ type Instance struct { // instance. See Service Accounts for more information. ServiceAccounts []*ServiceAccount `json:"serviceAccounts,omitempty"` + // StartRestricted: [Output Only] Whether a VM has been restricted for + // start because Compute Engine has detected suspicious activity. + StartRestricted bool `json:"startRestricted,omitempty"` + // Status: [Output Only] The status of the instance. One of the - // following values: PROVISIONING, STAGING, RUNNING, STOPPING, + // following values: PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED, // SUSPENDING, SUSPENDED, and TERMINATED. // // Possible values: @@ -5108,11 +6076,11 @@ func (s *Instance) MarshalJSON() ([]byte, error) { } type InstanceAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped instance lists. + // Items: A list of InstancesScopedList resources. Items map[string]InstancesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -5248,11 +6216,11 @@ func (s *InstanceGroup) MarshalJSON() ([]byte, error) { } type InstanceGroupAggregatedList struct { - // Id: [Output Only] A unique identifier for this aggregated list of - // instance groups. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped instance group lists. + // Items: A list of InstanceGroupsScopedList resources. Items map[string]InstanceGroupsScopedList `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -5268,8 +6236,7 @@ type InstanceGroupAggregatedList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -5301,11 +6268,11 @@ func (s *InstanceGroupAggregatedList) MarshalJSON() ([]byte, error) { // InstanceGroupList: A list of InstanceGroup resources. type InstanceGroupList struct { - // Id: [Output Only] A unique identifier for this list of instance - // groups. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A list of instance groups. + // Items: A list of InstanceGroup resources. Items []*InstanceGroup `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -5320,8 +6287,7 @@ type InstanceGroupList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -5526,11 +6492,11 @@ func (s *InstanceGroupManagerActionsSummary) MarshalJSON() ([]byte, error) { } type InstanceGroupManagerAggregatedList struct { - // Id: [Output Only] A unique identifier for this aggregated list of - // managed instance groups. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of filtered managed instance group lists. + // Items: A list of InstanceGroupManagersScopedList resources. Items map[string]InstanceGroupManagersScopedList `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -5546,8 +6512,7 @@ type InstanceGroupManagerAggregatedList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -5580,11 +6545,11 @@ func (s *InstanceGroupManagerAggregatedList) MarshalJSON() ([]byte, error) { // InstanceGroupManagerList: [Output Only] A list of managed instance // groups. type InstanceGroupManagerList struct { - // Id: [Output Only] A unique identifier for this resource type. The - // server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of managed instance groups. + // Items: A list of InstanceGroupManager resources. Items []*InstanceGroupManager `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -5978,12 +6943,11 @@ func (s *InstanceGroupsAddInstancesRequest) MarshalJSON() ([]byte, error) { } type InstanceGroupsListInstances struct { - // Id: [Output Only] A unique identifier for this list of instances in - // the specified instance group. The server generates this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of instances and any named ports that are - // assigned to those instances. + // Items: A list of InstanceWithNamedPorts resources. Items []*InstanceWithNamedPorts `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -5999,8 +6963,7 @@ type InstanceGroupsListInstances struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this list of instances in the - // specified instance groups. The server generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -6258,11 +7221,11 @@ func (s *InstanceGroupsSetNamedPortsRequest) MarshalJSON() ([]byte, error) { // InstanceList: Contains a list of instances. type InstanceList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of instances. + // Items: A list of Instance resources. Items []*Instance `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#instanceList for @@ -6356,8 +7319,8 @@ type InstanceProperties struct { // receive packets with destination IP addresses other than their own. // If these instances will be used as an IP gateway or it will be set as // the next-hop in a Route resource, specify true. If unsure, leave this - // set to false. See the Enable IP forwarding for instances - // documentation for more information. + // set to false. See the Enable IP forwarding documentation for more + // information. CanIpForward bool `json:"canIpForward,omitempty"` // Description: An optional text description for the instances that are @@ -6368,6 +7331,14 @@ type InstanceProperties struct { // are created from this template. Disks []*AttachedDisk `json:"disks,omitempty"` + // GuestAccelerators: A list of guest accelerator cards' type and count + // to use for instances created from the instance template. + GuestAccelerators []*AcceleratorConfig `json:"guestAccelerators,omitempty"` + + // Labels: Labels to apply to instances that are created from this + // template. + Labels map[string]string `json:"labels,omitempty"` + // MachineType: The machine type to use for instances that are created // from this template. MachineType string `json:"machineType,omitempty"` @@ -6512,11 +7483,11 @@ func (s *InstanceTemplate) MarshalJSON() ([]byte, error) { // InstanceTemplateList: A list of instance templates. type InstanceTemplateList struct { - // Id: [Output Only] A unique identifier for this instance template. The - // server defines this identifier. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] list of InstanceTemplate resources. + // Items: A list of InstanceTemplate resources. Items []*InstanceTemplate `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -6531,8 +7502,7 @@ type InstanceTemplateList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this instance template list. The - // server defines this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -6733,6 +7703,67 @@ func (s *InstancesScopedListWarningData) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type InstancesSetLabelsRequest struct { + // LabelFingerprint: Fingerprint of the previous set of labels for this + // resource, used to prevent conflicts. Provide the latest fingerprint + // value when making a request to add or change labels. + LabelFingerprint string `json:"labelFingerprint,omitempty"` + + Labels map[string]string `json:"labels,omitempty"` + + // ForceSendFields is a list of field names (e.g. "LabelFingerprint") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "LabelFingerprint") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *InstancesSetLabelsRequest) MarshalJSON() ([]byte, error) { + type noMethod InstancesSetLabelsRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type InstancesSetMachineResourcesRequest struct { + // GuestAccelerators: List of the type and count of accelerator cards + // attached to the instance. + GuestAccelerators []*AcceleratorConfig `json:"guestAccelerators,omitempty"` + + // ForceSendFields is a list of field names (e.g. "GuestAccelerators") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "GuestAccelerators") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *InstancesSetMachineResourcesRequest) MarshalJSON() ([]byte, error) { + type noMethod InstancesSetMachineResourcesRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type InstancesSetMachineTypeRequest struct { // MachineType: Full or partial URL of the machine type resource. See // Machine Types for a full list of machine types. For example: @@ -6829,9 +7860,8 @@ func (s *InstancesStartWithEncryptionKeyRequest) MarshalJSON() ([]byte, error) { // License: A license resource. type License struct { - // ChargesUseFee: [Output Only] If true, the customer will be charged - // license fee for running software that contains this license on an - // instance. + // ChargesUseFee: [Output Only] Deprecated. This field no longer + // reflects whether a license charges a usage fee. ChargesUseFee bool `json:"chargesUseFee,omitempty"` // Kind: [Output Only] Type of resource. Always compute#license for @@ -6988,11 +8018,11 @@ func (s *MachineTypeScratchDisks) MarshalJSON() ([]byte, error) { } type MachineTypeAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped machine type lists. + // Items: A list of MachineTypesScopedList resources. Items map[string]MachineTypesScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -7040,11 +8070,11 @@ func (s *MachineTypeAggregatedList) MarshalJSON() ([]byte, error) { // MachineTypeList: Contains a list of machine types. type MachineTypeList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Machine Type resources. + // Items: A list of MachineType resources. Items []*MachineType `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#machineTypeList @@ -7447,7 +8477,7 @@ type MetadataItems struct { // Value: Value for the metadata entry. These are free-form strings, and // only have meaning as interpreted by the image running in the // instance. The only restriction placed on values is that their size - // must be less than or equal to 32768 bytes. + // must be less than or equal to 262144 bytes (256 KiB). Value *string `json:"value,omitempty"` // ForceSendFields is a list of field names (e.g. "Key") to @@ -7552,6 +8582,9 @@ type Network struct { // last character, which cannot be a dash. Name string `json:"name,omitempty"` + // Peerings: [Output Only] List of network peerings for the resource. + Peerings []*NetworkPeering `json:"peerings,omitempty"` + // SelfLink: [Output Only] Server-defined URL for the resource. SelfLink string `json:"selfLink,omitempty"` @@ -7595,6 +8628,11 @@ type NetworkInterface struct { // external internet access. AccessConfigs []*AccessConfig `json:"accessConfigs,omitempty"` + // AliasIpRanges: An array of alias IP ranges for this network + // interface. Can only be specified for network interfaces on + // subnet-mode networks. + AliasIpRanges []*AliasIpRange `json:"aliasIpRanges,omitempty"` + // Kind: [Output Only] Type of the resource. Always // compute#networkInterface for network interfaces. Kind string `json:"kind,omitempty"` @@ -7663,11 +8701,11 @@ func (s *NetworkInterface) MarshalJSON() ([]byte, error) { // NetworkList: Contains a list of networks. type NetworkList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Network resources. + // Items: A list of Network resources. Items []*Network `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#networkList for @@ -7712,6 +8750,133 @@ func (s *NetworkList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// NetworkPeering: A network peering attached to a network resource. The +// message includes the peering name, peer network, peering state, and a +// flag indicating whether Google Compute Engine should automatically +// create routes for the peering. +type NetworkPeering struct { + // AutoCreateRoutes: Whether full mesh connectivity is created and + // managed automatically. When it is set to true, Google Compute Engine + // will automatically create and manage the routes between two networks + // when the state is ACTIVE. Otherwise, user needs to create routes + // manually to route packets to peer network. + AutoCreateRoutes bool `json:"autoCreateRoutes,omitempty"` + + // Name: Name of this peering. Provided by the client when the peering + // is created. The name must comply with RFC1035. Specifically, the name + // must be 1-63 characters long and match regular expression + // [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a + // lowercase letter, and all the following characters must be a dash, + // lowercase letter, or digit, except the last character, which cannot + // be a dash. + Name string `json:"name,omitempty"` + + // Network: The URL of the peer network. It can be either full URL or + // partial URL. The peer network may belong to a different project. If + // the partial URL does not contain project, it is assumed that the peer + // network is in the same project as the current network. + Network string `json:"network,omitempty"` + + // State: [Output Only] State for the peering. + // + // Possible values: + // "ACTIVE" + // "INACTIVE" + State string `json:"state,omitempty"` + + // StateDetails: [Output Only] Details about the current state of the + // peering. + StateDetails string `json:"stateDetails,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AutoCreateRoutes") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AutoCreateRoutes") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *NetworkPeering) MarshalJSON() ([]byte, error) { + type noMethod NetworkPeering + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type NetworksAddPeeringRequest struct { + // AutoCreateRoutes: Whether Google Compute Engine manages the routes + // automatically. + AutoCreateRoutes bool `json:"autoCreateRoutes,omitempty"` + + // Name: Name of the peering, which should conform to RFC1035. + Name string `json:"name,omitempty"` + + // PeerNetwork: URL of the peer network. It can be either full URL or + // partial URL. The peer network may belong to a different project. If + // the partial URL does not contain project, it is assumed that the peer + // network is in the same project as the current network. + PeerNetwork string `json:"peerNetwork,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AutoCreateRoutes") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AutoCreateRoutes") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *NetworksAddPeeringRequest) MarshalJSON() ([]byte, error) { + type noMethod NetworksAddPeeringRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type NetworksRemovePeeringRequest struct { + // Name: Name of the peering, which should conform to RFC1035. + Name string `json:"name,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Name") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Name") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *NetworksRemovePeeringRequest) MarshalJSON() ([]byte, error) { + type noMethod NetworksRemovePeeringRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Operation: An Operation resource, used to manage asynchronous API // requests. type Operation struct { @@ -8358,6 +9523,14 @@ type Project struct { // the Google Cloud Storage bucket where they are stored. UsageExportLocation *UsageExportLocation `json:"usageExportLocation,omitempty"` + // XpnProjectStatus: [Output Only] The role this project has in a shared + // VPC configuration. Currently only HOST projects are differentiated. + // + // Possible values: + // "HOST" + // "UNSPECIFIED_XPN_PROJECT_STATUS" + XpnProjectStatus string `json:"xpnProjectStatus,omitempty"` + // ServerResponse contains the HTTP response code and headers from the // server. googleapi.ServerResponse `json:"-"` @@ -8387,6 +9560,134 @@ func (s *Project) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type ProjectsDisableXpnResourceRequest struct { + // XpnResource: Service resource (a.k.a service project) ID. + XpnResource *XpnResourceId `json:"xpnResource,omitempty"` + + // ForceSendFields is a list of field names (e.g. "XpnResource") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "XpnResource") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProjectsDisableXpnResourceRequest) MarshalJSON() ([]byte, error) { + type noMethod ProjectsDisableXpnResourceRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type ProjectsEnableXpnResourceRequest struct { + // XpnResource: Service resource (a.k.a service project) ID. + XpnResource *XpnResourceId `json:"xpnResource,omitempty"` + + // ForceSendFields is a list of field names (e.g. "XpnResource") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "XpnResource") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProjectsEnableXpnResourceRequest) MarshalJSON() ([]byte, error) { + type noMethod ProjectsEnableXpnResourceRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type ProjectsGetXpnResources struct { + // Kind: [Output Only] Type of resource. Always + // compute#projectsGetXpnResources for lists of service resources (a.k.a + // service projects) + Kind string `json:"kind,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // Resources: Serive resources (a.k.a service projects) attached to this + // project as their shared VPC host. + Resources []*XpnResourceId `json:"resources,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Kind") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Kind") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProjectsGetXpnResources) MarshalJSON() ([]byte, error) { + type noMethod ProjectsGetXpnResources + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type ProjectsListXpnHostsRequest struct { + // Organization: Optional organization ID managed by Cloud Resource + // Manager, for which to list shared VPC host projects. If not + // specified, the organization will be inferred from the project. + Organization string `json:"organization,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Organization") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Organization") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ProjectsListXpnHostsRequest) MarshalJSON() ([]byte, error) { + type noMethod ProjectsListXpnHostsRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Quota: A quotas entry. type Quota struct { // Limit: [Output Only] Quota limit for this metric. @@ -8398,6 +9699,7 @@ type Quota struct { // "AUTOSCALERS" // "BACKEND_BUCKETS" // "BACKEND_SERVICES" + // "COMMITMENTS" // "CPUS" // "CPUS_ALL_REGIONS" // "DISKS_TOTAL_GB" @@ -8412,11 +9714,15 @@ type Quota struct { // "IN_USE_ADDRESSES" // "LOCAL_SSD_TOTAL_GB" // "NETWORKS" + // "NVIDIA_K80_GPUS" // "PREEMPTIBLE_CPUS" + // "PREEMPTIBLE_LOCAL_SSD_GB" // "REGIONAL_AUTOSCALERS" // "REGIONAL_INSTANCE_GROUP_MANAGERS" // "ROUTERS" // "ROUTES" + // "SECURITY_POLICIES" + // "SECURITY_POLICY_RULES" // "SNAPSHOTS" // "SSD_TOTAL_GB" // "SSL_CERTIFICATES" @@ -8545,18 +9851,22 @@ func (s *Region) MarshalJSON() ([]byte, error) { // RegionAutoscalerList: Contains a list of autoscalers. type RegionAutoscalerList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A list of autoscalers. + // Items: A list of Autoscaler resources. Items []*Autoscaler `json:"items,omitempty"` // Kind: Type of resource. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -8591,8 +9901,8 @@ func (s *RegionAutoscalerList) MarshalJSON() ([]byte, error) { // RegionInstanceGroupList: Contains a list of InstanceGroup resources. type RegionInstanceGroupList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of InstanceGroup resources. @@ -8609,8 +9919,7 @@ type RegionInstanceGroupList struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -8643,11 +9952,11 @@ func (s *RegionInstanceGroupList) MarshalJSON() ([]byte, error) { // RegionInstanceGroupManagerList: Contains a list of managed instance // groups. type RegionInstanceGroupManagerList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A list of managed instance groups. + // Items: A list of InstanceGroupManager resources. Items []*InstanceGroupManager `json:"items,omitempty"` // Kind: [Output Only] The resource type, which is always @@ -8655,12 +9964,15 @@ type RegionInstanceGroupManagerList struct { // groups that exist in th regional scope. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output only] A token used to continue a truncated - // list request. + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output only] The URL for this resource type. The server - // generates this URL. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -8873,12 +10185,11 @@ func (s *RegionInstanceGroupManagersSetTemplateRequest) MarshalJSON() ([]byte, e } type RegionInstanceGroupsListInstances struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` - // Items: A list of instances and any named ports that are assigned to - // those instances. + // Items: A list of InstanceWithNamedPorts resources. Items []*InstanceWithNamedPorts `json:"items,omitempty"` // Kind: The resource type. @@ -8892,7 +10203,7 @@ type RegionInstanceGroupsListInstances struct { // the results. NextPageToken string `json:"nextPageToken,omitempty"` - // SelfLink: [Output Only] Server-defined URL for the resource. + // SelfLink: [Output Only] Server-defined URL for this resource. SelfLink string `json:"selfLink,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -8997,11 +10308,11 @@ func (s *RegionInstanceGroupsSetNamedPortsRequest) MarshalJSON() ([]byte, error) // RegionList: Contains a list of region resources. type RegionList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Region resources. + // Items: A list of Region resources. Items []*Region `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#regionList for @@ -9046,6 +10357,47 @@ func (s *RegionList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// ResourceCommitment: Commitment for a particular resource (a +// Commitment is composed of one or more of these). +type ResourceCommitment struct { + // Amount: The amount of the resource purchased (in a type-dependent + // unit, such as bytes). For vCPUs, this can just be an integer. For + // memory, this must be provided in MB. Memory must be a multiple of 256 + // MB, with up to 6.5GB of memory per every vCPU. + Amount int64 `json:"amount,omitempty,string"` + + // Type: Type of resource for which this commitment applies. Possible + // values are VCPU and MEMORY + // + // Possible values: + // "MEMORY" + // "UNSPECIFIED" + // "VCPU" + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Amount") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Amount") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *ResourceCommitment) MarshalJSON() ([]byte, error) { + type noMethod ResourceCommitment + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type ResourceGroupReference struct { // Group: A URI referencing one of the instance groups listed in the // backend service. @@ -9079,7 +10431,7 @@ func (s *ResourceGroupReference) MarshalJSON() ([]byte, error) { // instances by tags and the set of routes for a particular instance is // called its routing table. // -// For each packet leaving a instance, the system searches that +// For each packet leaving an instance, the system searches that // instance's routing table for a single best matching route. Routes // match packets by destination IP address, preferring smaller or more // specific ranges over larger ones. If there is a tie, the system @@ -9147,6 +10499,10 @@ type Route struct { // matching packets. NextHopNetwork string `json:"nextHopNetwork,omitempty"` + // NextHopPeering: [Output Only] The network peering name that should + // handle matching packets, which should conform to RFC1035. + NextHopPeering string `json:"nextHopPeering,omitempty"` + // NextHopVpnTunnel: The URL to a VpnTunnel that should handle matching // packets. NextHopVpnTunnel string `json:"nextHopVpnTunnel,omitempty"` @@ -9293,11 +10649,11 @@ func (s *RouteWarningsData) MarshalJSON() ([]byte, error) { // RouteList: Contains a list of Route resources. type RouteList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Route resources. + // Items: A list of Route resources. Items []*Route `json:"items,omitempty"` // Kind: Type of resource. @@ -9419,11 +10775,11 @@ func (s *Router) MarshalJSON() ([]byte, error) { // RouterAggregatedList: Contains a list of routers. type RouterAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped router lists. + // Items: A list of Router resources. Items map[string]RoutersScopedList `json:"items,omitempty"` // Kind: Type of resource. @@ -9590,8 +10946,8 @@ func (s *RouterInterface) MarshalJSON() ([]byte, error) { // RouterList: Contains a list of Router resources. type RouterList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of Router resources. @@ -9988,7 +11344,7 @@ type Scheduling struct { // // By default, this is set to true so an instance is automatically // restarted if it is terminated by Compute Engine. - AutomaticRestart bool `json:"automaticRestart,omitempty"` + AutomaticRestart *bool `json:"automaticRestart,omitempty"` // OnHostMaintenance: Defines the maintenance behavior for this // instance. For standard instances, the default behavior is MIGRATE. @@ -10134,6 +11490,21 @@ type Snapshot struct { // Snapshot resources. Kind string `json:"kind,omitempty"` + // LabelFingerprint: A fingerprint for the labels being applied to this + // snapshot, which is essentially a hash of the labels set used for + // optimistic locking. The fingerprint is initially generated by Compute + // Engine and changes after every request to modify or update labels. + // You must always provide an up-to-date fingerprint hash in order to + // update or change labels. + // + // To see the latest fingerprint, make a get() request to retrieve a + // snapshot. + LabelFingerprint string `json:"labelFingerprint,omitempty"` + + // Labels: Labels to apply to this snapshot. These can be later modified + // by the setLabels method. Label values may be empty. + Labels map[string]string `json:"labels,omitempty"` + // Licenses: [Output Only] A list of public visible licenses that apply // to this snapshot. This can be because the original image had licenses // attached (such as a Windows image). @@ -10239,130 +11610,130 @@ func (s *Snapshot) MarshalJSON() ([]byte, error) { // SnapshotList: Contains a list of Snapshot resources. type SnapshotList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. + Id string `json:"id,omitempty"` + + // Items: A list of Snapshot resources. + Items []*Snapshot `json:"items,omitempty"` + + // Kind: Type of resource. + Kind string `json:"kind,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *SnapshotList) MarshalJSON() ([]byte, error) { + type noMethod SnapshotList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// SslCertificate: An SslCertificate resource. This resource provides a +// mechanism to upload an SSL key and certificate to the load balancer +// to serve secure connections from the user. +type SslCertificate struct { + // Certificate: A local certificate file. The certificate must be in PEM + // format. The certificate chain must be no greater than 5 certs long. + // The chain must include at least one intermediate cert. + Certificate string `json:"certificate,omitempty"` + + // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text + // format. + CreationTimestamp string `json:"creationTimestamp,omitempty"` + + // Description: An optional description of this resource. Provide this + // property when you create the resource. + Description string `json:"description,omitempty"` + // Id: [Output Only] The unique identifier for the resource. This // identifier is defined by the server. + Id uint64 `json:"id,omitempty,string"` + + // Kind: [Output Only] Type of the resource. Always + // compute#sslCertificate for SSL certificates. + Kind string `json:"kind,omitempty"` + + // Name: Name of the resource. Provided by the client when the resource + // is created. The name must be 1-63 characters long, and comply with + // RFC1035. Specifically, the name must be 1-63 characters long and + // match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means + // the first character must be a lowercase letter, and all following + // characters must be a dash, lowercase letter, or digit, except the + // last character, which cannot be a dash. + Name string `json:"name,omitempty"` + + // PrivateKey: A write-only private key in PEM format. Only insert + // requests will include this field. + PrivateKey string `json:"privateKey,omitempty"` + + // SelfLink: [Output only] Server-defined URL for the resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Certificate") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Certificate") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *SslCertificate) MarshalJSON() ([]byte, error) { + type noMethod SslCertificate + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// SslCertificateList: Contains a list of SslCertificate resources. +type SslCertificateList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Snapshot resources. - Items []*Snapshot `json:"items,omitempty"` - - // Kind: Type of resource. - Kind string `json:"kind,omitempty"` - - // NextPageToken: [Output Only] This token allows you to get the next - // page of results for list requests. If the number of results is larger - // than maxResults, use the nextPageToken as a value for the query - // parameter pageToken in the next list request. Subsequent list - // requests will have their own nextPageToken to continue paging through - // the results. - NextPageToken string `json:"nextPageToken,omitempty"` - - // SelfLink: [Output Only] Server-defined URL for this resource. - SelfLink string `json:"selfLink,omitempty"` - - // ServerResponse contains the HTTP response code and headers from the - // server. - googleapi.ServerResponse `json:"-"` - - // ForceSendFields is a list of field names (e.g. "Id") to - // unconditionally include in API requests. By default, fields with - // empty values are omitted from API requests. However, any non-pointer, - // non-interface field appearing in ForceSendFields will be sent to the - // server regardless of whether the field is empty or not. This may be - // used to include empty fields in Patch requests. - ForceSendFields []string `json:"-"` - - // NullFields is a list of field names (e.g. "Id") to include in API - // requests with the JSON null value. By default, fields with empty - // values are omitted from API requests. However, any field with an - // empty value appearing in NullFields will be sent to the server as - // null. It is an error if a field in this list has a non-empty value. - // This may be used to include null fields in Patch requests. - NullFields []string `json:"-"` -} - -func (s *SnapshotList) MarshalJSON() ([]byte, error) { - type noMethod SnapshotList - raw := noMethod(*s) - return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) -} - -// SslCertificate: An SslCertificate resource. This resource provides a -// mechanism to upload an SSL key and certificate to the load balancer -// to serve secure connections from the user. -type SslCertificate struct { - // Certificate: A local certificate file. The certificate must be in PEM - // format. The certificate chain must be no greater than 5 certs long. - // The chain must include at least one intermediate cert. - Certificate string `json:"certificate,omitempty"` - - // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text - // format. - CreationTimestamp string `json:"creationTimestamp,omitempty"` - - // Description: An optional description of this resource. Provide this - // property when you create the resource. - Description string `json:"description,omitempty"` - - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. - Id uint64 `json:"id,omitempty,string"` - - // Kind: [Output Only] Type of the resource. Always - // compute#sslCertificate for SSL certificates. - Kind string `json:"kind,omitempty"` - - // Name: Name of the resource. Provided by the client when the resource - // is created. The name must be 1-63 characters long, and comply with - // RFC1035. Specifically, the name must be 1-63 characters long and - // match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means - // the first character must be a lowercase letter, and all following - // characters must be a dash, lowercase letter, or digit, except the - // last character, which cannot be a dash. - Name string `json:"name,omitempty"` - - // PrivateKey: A write-only private key in PEM format. Only insert - // requests will include this field. - PrivateKey string `json:"privateKey,omitempty"` - - // SelfLink: [Output only] Server-defined URL for the resource. - SelfLink string `json:"selfLink,omitempty"` - - // ServerResponse contains the HTTP response code and headers from the - // server. - googleapi.ServerResponse `json:"-"` - - // ForceSendFields is a list of field names (e.g. "Certificate") to - // unconditionally include in API requests. By default, fields with - // empty values are omitted from API requests. However, any non-pointer, - // non-interface field appearing in ForceSendFields will be sent to the - // server regardless of whether the field is empty or not. This may be - // used to include empty fields in Patch requests. - ForceSendFields []string `json:"-"` - - // NullFields is a list of field names (e.g. "Certificate") to include - // in API requests with the JSON null value. By default, fields with - // empty values are omitted from API requests. However, any field with - // an empty value appearing in NullFields will be sent to the server as - // null. It is an error if a field in this list has a non-empty value. - // This may be used to include null fields in Patch requests. - NullFields []string `json:"-"` -} - -func (s *SslCertificate) MarshalJSON() ([]byte, error) { - type noMethod SslCertificate - raw := noMethod(*s) - return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) -} - -// SslCertificateList: Contains a list of SslCertificate resources. -type SslCertificateList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the - // server. - Id string `json:"id,omitempty"` - - // Items: A list of SslCertificate resources. - Items []*SslCertificate `json:"items,omitempty"` + // Items: A list of SslCertificate resources. + Items []*SslCertificate `json:"items,omitempty"` // Kind: Type of resource. Kind string `json:"kind,omitempty"` @@ -10412,11 +11783,13 @@ type Subnetwork struct { CreationTimestamp string `json:"creationTimestamp,omitempty"` // Description: An optional description of this resource. Provide this - // property when you create the resource. + // property when you create the resource. This field can be set only at + // resource creation time. Description string `json:"description,omitempty"` // GatewayAddress: [Output Only] The gateway address for default routes - // to reach destination addresses outside this subnetwork. + // to reach destination addresses outside this subnetwork. This field + // can be set only at resource creation time. GatewayAddress string `json:"gatewayAddress,omitempty"` // Id: [Output Only] The unique identifier for the resource. This @@ -10426,7 +11799,8 @@ type Subnetwork struct { // IpCidrRange: The range of internal addresses that are owned by this // subnetwork. Provide this property when you create the subnetwork. For // example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and - // non-overlapping within a network. Only IPv4 is supported. + // non-overlapping within a network. Only IPv4 is supported. This field + // can be set only at resource creation time. IpCidrRange string `json:"ipCidrRange,omitempty"` // Kind: [Output Only] Type of the resource. Always compute#subnetwork @@ -10444,16 +11818,26 @@ type Subnetwork struct { // Network: The URL of the network to which this subnetwork belongs, // provided by the client when initially creating the subnetwork. Only - // networks that are in the distributed mode can have subnetworks. + // networks that are in the distributed mode can have subnetworks. This + // field can be set only at resource creation time. Network string `json:"network,omitempty"` // PrivateIpGoogleAccess: Whether the VMs in this subnet can access - // Google services without assigned external IP addresses. + // Google services without assigned external IP addresses. This field + // can be both set at resource creation time and updated using + // setPrivateIpGoogleAccess. PrivateIpGoogleAccess bool `json:"privateIpGoogleAccess,omitempty"` - // Region: URL of the region where the Subnetwork resides. + // Region: URL of the region where the Subnetwork resides. This field + // can be set only at resource creation time. Region string `json:"region,omitempty"` + // SecondaryIpRanges: An array of configurations for secondary IP ranges + // for VM instances contained in this subnetwork. The primary IP of such + // VM must belong to the primary ipCidrRange of the subnetwork. The + // alias IPs may belong to either primary or secondary ranges. + SecondaryIpRanges []*SubnetworkSecondaryRange `json:"secondaryIpRanges,omitempty"` + // SelfLink: [Output Only] Server-defined URL for the resource. SelfLink string `json:"selfLink,omitempty"` @@ -10486,11 +11870,11 @@ func (s *Subnetwork) MarshalJSON() ([]byte, error) { } type SubnetworkAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output] A map of scoped Subnetwork lists. + // Items: A list of SubnetworksScopedList resources. Items map[string]SubnetworksScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -10537,11 +11921,11 @@ func (s *SubnetworkAggregatedList) MarshalJSON() ([]byte, error) { // SubnetworkList: Contains a list of Subnetwork resources. type SubnetworkList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: The Subnetwork resources. + // Items: A list of Subnetwork resources. Items []*Subnetwork `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#subnetworkList @@ -10586,6 +11970,45 @@ func (s *SubnetworkList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// SubnetworkSecondaryRange: Represents a secondary IP range of a +// subnetwork. +type SubnetworkSecondaryRange struct { + // IpCidrRange: The range of IP addresses belonging to this subnetwork + // secondary range. Provide this property when you create the + // subnetwork. Ranges must be unique and non-overlapping with all + // primary and secondary IP ranges within a network. Only IPv4 is + // supported. + IpCidrRange string `json:"ipCidrRange,omitempty"` + + // RangeName: The name associated with this subnetwork secondary range, + // used when adding an alias IP range to a VM instance. The name must be + // 1-63 characters long, and comply with RFC1035. The name must be + // unique within the subnetwork. + RangeName string `json:"rangeName,omitempty"` + + // ForceSendFields is a list of field names (e.g. "IpCidrRange") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "IpCidrRange") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *SubnetworkSecondaryRange) MarshalJSON() ([]byte, error) { + type noMethod SubnetworkSecondaryRange + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + type SubnetworksExpandIpCidrRangeRequest struct { // IpCidrRange: The IP (in CIDR format or netmask) of internal addresses // that are legal on this Subnetwork. This range should be disjoint from @@ -10928,8 +12351,8 @@ func (s *TargetHttpProxy) MarshalJSON() ([]byte, error) { // TargetHttpProxyList: A list of TargetHttpProxy resources. type TargetHttpProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetHttpProxy resources. @@ -11082,8 +12505,8 @@ func (s *TargetHttpsProxy) MarshalJSON() ([]byte, error) { // TargetHttpsProxyList: Contains a list of TargetHttpsProxy resources. type TargetHttpsProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetHttpsProxy resources. @@ -11216,7 +12639,7 @@ type TargetInstanceAggregatedList struct { // server. Id string `json:"id,omitempty"` - // Items: A map of scoped target instance lists. + // Items: A list of TargetInstance resources. Items map[string]TargetInstancesScopedList `json:"items,omitempty"` // Kind: Type of resource. @@ -11262,8 +12685,8 @@ func (s *TargetInstanceAggregatedList) MarshalJSON() ([]byte, error) { // TargetInstanceList: Contains a list of TargetInstance resources. type TargetInstanceList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetInstance resources. @@ -11582,11 +13005,11 @@ func (s *TargetPool) UnmarshalJSON(data []byte) error { } type TargetPoolAggregatedList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped target pool lists. + // Items: A list of TargetPool resources. Items map[string]TargetPoolsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always @@ -11669,7 +13092,7 @@ func (s *TargetPoolInstanceHealth) MarshalJSON() ([]byte, error) { // TargetPoolList: Contains a list of TargetPool resources. type TargetPoolList struct { - // Id: [Output Only] Unique identifier for the resource. Defined by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -12158,8 +13581,8 @@ func (s *TargetSslProxy) MarshalJSON() ([]byte, error) { // TargetSslProxyList: Contains a list of TargetSslProxy resources. type TargetSslProxyList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of TargetSslProxy resources. @@ -12206,8 +13629,69 @@ func (s *TargetSslProxyList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } -// TargetVpnGateway: Represents a Target VPN gateway resource. -type TargetVpnGateway struct { +type TargetTcpProxiesSetBackendServiceRequest struct { + // Service: The URL of the new BackendService resource for the + // targetTcpProxy. + Service string `json:"service,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Service") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Service") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *TargetTcpProxiesSetBackendServiceRequest) MarshalJSON() ([]byte, error) { + type noMethod TargetTcpProxiesSetBackendServiceRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +type TargetTcpProxiesSetProxyHeaderRequest struct { + // ProxyHeader: The new type of proxy header to append before sending + // data to the backend. NONE or PROXY_V1 are allowed. + // + // Possible values: + // "NONE" + // "PROXY_V1" + ProxyHeader string `json:"proxyHeader,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ProxyHeader") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ProxyHeader") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *TargetTcpProxiesSetProxyHeaderRequest) MarshalJSON() ([]byte, error) { + type noMethod TargetTcpProxiesSetProxyHeaderRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// TargetTcpProxy: A TargetTcpProxy resource. This resource defines a +// TCP proxy. +type TargetTcpProxy struct { // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text // format. CreationTimestamp string `json:"creationTimestamp,omitempty"` @@ -12216,17 +13700,12 @@ type TargetVpnGateway struct { // property when you create the resource. Description string `json:"description,omitempty"` - // ForwardingRules: [Output Only] A list of URLs to the ForwardingRule - // resources. ForwardingRules are created using - // compute.forwardingRules.insert and associated to a VPN gateway. - ForwardingRules []string `json:"forwardingRules,omitempty"` - // Id: [Output Only] The unique identifier for the resource. This // identifier is defined by the server. Id uint64 `json:"id,omitempty,string"` - // Kind: [Output Only] Type of resource. Always compute#targetVpnGateway - // for target VPN gateways. + // Kind: [Output Only] Type of the resource. Always + // compute#targetTcpProxy for target TCP proxies. Kind string `json:"kind,omitempty"` // Name: Name of the resource. Provided by the client when the resource @@ -12238,30 +13717,155 @@ type TargetVpnGateway struct { // last character, which cannot be a dash. Name string `json:"name,omitempty"` - // Network: URL of the network to which this VPN gateway is attached. - // Provided by the client when the VPN gateway is created. - Network string `json:"network,omitempty"` - - // Region: [Output Only] URL of the region where the target VPN gateway - // resides. - Region string `json:"region,omitempty"` + // ProxyHeader: Specifies the type of proxy header to append before + // sending data to the backend, either NONE or PROXY_V1. The default is + // NONE. + // + // Possible values: + // "NONE" + // "PROXY_V1" + ProxyHeader string `json:"proxyHeader,omitempty"` // SelfLink: [Output Only] Server-defined URL for the resource. SelfLink string `json:"selfLink,omitempty"` - // Status: [Output Only] The status of the VPN gateway. - // - // Possible values: - // "CREATING" - // "DELETING" - // "FAILED" - // "READY" - Status string `json:"status,omitempty"` - - // Tunnels: [Output Only] A list of URLs to VpnTunnel resources. - // VpnTunnels are created using compute.vpntunnels.insert method and - // associated to a VPN gateway. - Tunnels []string `json:"tunnels,omitempty"` + // Service: URL to the BackendService resource. + Service string `json:"service,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "CreationTimestamp") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CreationTimestamp") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *TargetTcpProxy) MarshalJSON() ([]byte, error) { + type noMethod TargetTcpProxy + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// TargetTcpProxyList: Contains a list of TargetTcpProxy resources. +type TargetTcpProxyList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. + Id string `json:"id,omitempty"` + + // Items: A list of TargetTcpProxy resources. + Items []*TargetTcpProxy `json:"items,omitempty"` + + // Kind: Type of resource. + Kind string `json:"kind,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *TargetTcpProxyList) MarshalJSON() ([]byte, error) { + type noMethod TargetTcpProxyList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// TargetVpnGateway: Represents a Target VPN gateway resource. +type TargetVpnGateway struct { + // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text + // format. + CreationTimestamp string `json:"creationTimestamp,omitempty"` + + // Description: An optional description of this resource. Provide this + // property when you create the resource. + Description string `json:"description,omitempty"` + + // ForwardingRules: [Output Only] A list of URLs to the ForwardingRule + // resources. ForwardingRules are created using + // compute.forwardingRules.insert and associated to a VPN gateway. + ForwardingRules []string `json:"forwardingRules,omitempty"` + + // Id: [Output Only] The unique identifier for the resource. This + // identifier is defined by the server. + Id uint64 `json:"id,omitempty,string"` + + // Kind: [Output Only] Type of resource. Always compute#targetVpnGateway + // for target VPN gateways. + Kind string `json:"kind,omitempty"` + + // Name: Name of the resource. Provided by the client when the resource + // is created. The name must be 1-63 characters long, and comply with + // RFC1035. Specifically, the name must be 1-63 characters long and + // match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means + // the first character must be a lowercase letter, and all following + // characters must be a dash, lowercase letter, or digit, except the + // last character, which cannot be a dash. + Name string `json:"name,omitempty"` + + // Network: URL of the network to which this VPN gateway is attached. + // Provided by the client when the VPN gateway is created. + Network string `json:"network,omitempty"` + + // Region: [Output Only] URL of the region where the target VPN gateway + // resides. + Region string `json:"region,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for the resource. + SelfLink string `json:"selfLink,omitempty"` + + // Status: [Output Only] The status of the VPN gateway. + // + // Possible values: + // "CREATING" + // "DELETING" + // "FAILED" + // "READY" + Status string `json:"status,omitempty"` + + // Tunnels: [Output Only] A list of URLs to VpnTunnel resources. + // VpnTunnels are created using compute.vpntunnels.insert method and + // associated to a VPN gateway. + Tunnels []string `json:"tunnels,omitempty"` // ServerResponse contains the HTTP response code and headers from the // server. @@ -12292,11 +13896,11 @@ func (s *TargetVpnGateway) MarshalJSON() ([]byte, error) { } type TargetVpnGatewayAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: A map of scoped target vpn gateway lists. + // Items: A list of TargetVpnGateway resources. Items map[string]TargetVpnGatewaysScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#targetVpnGateway @@ -12343,11 +13947,11 @@ func (s *TargetVpnGatewayAggregatedList) MarshalJSON() ([]byte, error) { // TargetVpnGatewayList: Contains a list of TargetVpnGateway resources. type TargetVpnGatewayList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of TargetVpnGateway resources. + // Items: A list of TargetVpnGateway resources. Items []*TargetVpnGateway `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#targetVpnGateway @@ -12635,7 +14239,7 @@ func (s *UrlMap) MarshalJSON() ([]byte, error) { // UrlMapList: Contains a list of UrlMap resources. type UrlMapList struct { - // Id: [Output Only] Unique identifier for the resource. Set by the + // Id: [Output Only] Unique identifier for the resource; defined by the // server. Id string `json:"id,omitempty"` @@ -13002,11 +14606,11 @@ func (s *VpnTunnel) MarshalJSON() ([]byte, error) { } type VpnTunnelAggregatedList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A map of scoped vpn tunnel lists. + // Items: A list of VpnTunnelsScopedList resources. Items map[string]VpnTunnelsScopedList `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#vpnTunnel for @@ -13053,11 +14657,11 @@ func (s *VpnTunnelAggregatedList) MarshalJSON() ([]byte, error) { // VpnTunnelList: Contains a list of VpnTunnel resources. type VpnTunnelList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of VpnTunnel resources. + // Items: A list of VpnTunnel resources. Items []*VpnTunnel `json:"items,omitempty"` // Kind: [Output Only] Type of resource. Always compute#vpnTunnel for @@ -13229,6 +14833,93 @@ func (s *VpnTunnelsScopedListWarningData) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +type XpnHostList struct { + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. + Id string `json:"id,omitempty"` + + // Items: [Output Only] A list of shared VPC host project URLs. + Items []*Project `json:"items,omitempty"` + + // Kind: [Output Only] Type of resource. Always compute#xpnHostList for + // lists of shared VPC hosts. + Kind string `json:"kind,omitempty"` + + // NextPageToken: [Output Only] This token allows you to get the next + // page of results for list requests. If the number of results is larger + // than maxResults, use the nextPageToken as a value for the query + // parameter pageToken in the next list request. Subsequent list + // requests will have their own nextPageToken to continue paging through + // the results. + NextPageToken string `json:"nextPageToken,omitempty"` + + // SelfLink: [Output Only] Server-defined URL for this resource. + SelfLink string `json:"selfLink,omitempty"` + + // ServerResponse contains the HTTP response code and headers from the + // server. + googleapi.ServerResponse `json:"-"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *XpnHostList) MarshalJSON() ([]byte, error) { + type noMethod XpnHostList + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// XpnResourceId: Service resource (a.k.a service project) ID. +type XpnResourceId struct { + // Id: The ID of the service resource. In the case of projects, this + // field matches the project ID (e.g., my-project), not the project + // number (e.g., 12345678). + Id string `json:"id,omitempty"` + + // Type: The type of the service resource. + // + // Possible values: + // "PROJECT" + // "XPN_RESOURCE_TYPE_UNSPECIFIED" + Type string `json:"type,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Id") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Id") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *XpnResourceId) MarshalJSON() ([]byte, error) { + type noMethod XpnResourceId + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Zone: A Zone resource. type Zone struct { // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text @@ -13301,7 +14992,7 @@ type ZoneList struct { // server. Id string `json:"id,omitempty"` - // Items: [Output Only] A list of Zone resources. + // Items: A list of Zone resources. Items []*Zone `json:"items,omitempty"` // Kind: Type of resource. @@ -13345,9 +15036,45 @@ func (s *ZoneList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } -// method id "compute.addresses.aggregatedList": +type ZoneSetLabelsRequest struct { + // LabelFingerprint: The fingerprint of the previous set of labels for + // this resource, used to detect conflicts. The fingerprint is initially + // generated by Compute Engine and changes after every request to modify + // or update labels. You must always provide an up-to-date fingerprint + // hash in order to update or change labels. Make a get() request to the + // resource to get the latest fingerprint. + LabelFingerprint string `json:"labelFingerprint,omitempty"` -type AddressesAggregatedListCall struct { + // Labels: The labels to set for this resource. + Labels map[string]string `json:"labels,omitempty"` + + // ForceSendFields is a list of field names (e.g. "LabelFingerprint") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "LabelFingerprint") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *ZoneSetLabelsRequest) MarshalJSON() ([]byte, error) { + type noMethod ZoneSetLabelsRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// method id "compute.acceleratorTypes.aggregatedList": + +type AcceleratorTypesAggregatedListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -13356,18 +15083,16 @@ type AddressesAggregatedListCall struct { header_ http.Header } -// AggregatedList: Retrieves an aggregated list of addresses. -// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/aggregatedList -func (r *AddressesService) AggregatedList(project string) *AddressesAggregatedListCall { - c := &AddressesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves an aggregated list of accelerator types. +func (r *AcceleratorTypesService) AggregatedList(project string) *AcceleratorTypesAggregatedListCall { + c := &AcceleratorTypesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -13379,7 +15104,7 @@ func (r *AddressesService) AggregatedList(project string) *AddressesAggregatedLi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -13391,7 +15116,7 @@ func (r *AddressesService) AggregatedList(project string) *AddressesAggregatedLi // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *AddressesAggregatedListCall) Filter(filter string) *AddressesAggregatedListCall { +func (c *AcceleratorTypesAggregatedListCall) Filter(filter string) *AcceleratorTypesAggregatedListCall { c.urlParams_.Set("filter", filter) return c } @@ -13402,7 +15127,7 @@ func (c *AddressesAggregatedListCall) Filter(filter string) *AddressesAggregated // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *AddressesAggregatedListCall) MaxResults(maxResults int64) *AddressesAggregatedListCall { +func (c *AcceleratorTypesAggregatedListCall) MaxResults(maxResults int64) *AcceleratorTypesAggregatedListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -13419,7 +15144,7 @@ func (c *AddressesAggregatedListCall) MaxResults(maxResults int64) *AddressesAgg // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *AddressesAggregatedListCall) OrderBy(orderBy string) *AddressesAggregatedListCall { +func (c *AcceleratorTypesAggregatedListCall) OrderBy(orderBy string) *AcceleratorTypesAggregatedListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -13427,7 +15152,7 @@ func (c *AddressesAggregatedListCall) OrderBy(orderBy string) *AddressesAggregat // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *AddressesAggregatedListCall) PageToken(pageToken string) *AddressesAggregatedListCall { +func (c *AcceleratorTypesAggregatedListCall) PageToken(pageToken string) *AcceleratorTypesAggregatedListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -13435,7 +15160,7 @@ func (c *AddressesAggregatedListCall) PageToken(pageToken string) *AddressesAggr // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AddressesAggregatedListCall) Fields(s ...googleapi.Field) *AddressesAggregatedListCall { +func (c *AcceleratorTypesAggregatedListCall) Fields(s ...googleapi.Field) *AcceleratorTypesAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -13445,7 +15170,7 @@ func (c *AddressesAggregatedListCall) Fields(s ...googleapi.Field) *AddressesAgg // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *AddressesAggregatedListCall) IfNoneMatch(entityTag string) *AddressesAggregatedListCall { +func (c *AcceleratorTypesAggregatedListCall) IfNoneMatch(entityTag string) *AcceleratorTypesAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -13453,21 +15178,21 @@ func (c *AddressesAggregatedListCall) IfNoneMatch(entityTag string) *AddressesAg // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AddressesAggregatedListCall) Context(ctx context.Context) *AddressesAggregatedListCall { +func (c *AcceleratorTypesAggregatedListCall) Context(ctx context.Context) *AcceleratorTypesAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AddressesAggregatedListCall) Header() http.Header { +func (c *AcceleratorTypesAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AddressesAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *AcceleratorTypesAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -13478,7 +15203,7 @@ func (c *AddressesAggregatedListCall) doRequest(alt string) (*http.Response, err } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/addresses") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/acceleratorTypes") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -13488,14 +15213,14 @@ func (c *AddressesAggregatedListCall) doRequest(alt string) (*http.Response, err return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.addresses.aggregatedList" call. -// Exactly one of *AddressAggregatedList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *AddressAggregatedList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.acceleratorTypes.aggregatedList" call. +// Exactly one of *AcceleratorTypeAggregatedList or error will be +// non-nil. Any non-2xx status code is an error. Response headers are in +// either *AcceleratorTypeAggregatedList.ServerResponse.Header or (if a +// response was returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *AddressesAggregatedListCall) Do(opts ...googleapi.CallOption) (*AddressAggregatedList, error) { +func (c *AcceleratorTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*AcceleratorTypeAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -13514,7 +15239,7 @@ func (c *AddressesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Address if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &AddressAggregatedList{ + ret := &AcceleratorTypeAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -13526,15 +15251,15 @@ func (c *AddressesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Address } return ret, nil // { - // "description": "Retrieves an aggregated list of addresses.", + // "description": "Retrieves an aggregated list of accelerator types.", // "httpMethod": "GET", - // "id": "compute.addresses.aggregatedList", + // "id": "compute.acceleratorTypes.aggregatedList", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -13564,9 +15289,9 @@ func (c *AddressesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Address // "type": "string" // } // }, - // "path": "{project}/aggregated/addresses", + // "path": "{project}/aggregated/acceleratorTypes", // "response": { - // "$ref": "AddressAggregatedList" + // "$ref": "AcceleratorTypeAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -13580,7 +15305,7 @@ func (c *AddressesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Address // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *AddressesAggregatedListCall) Pages(ctx context.Context, f func(*AddressAggregatedList) error) error { +func (c *AcceleratorTypesAggregatedListCall) Pages(ctx context.Context, f func(*AcceleratorTypeAggregatedList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -13598,181 +15323,33 @@ func (c *AddressesAggregatedListCall) Pages(ctx context.Context, f func(*Address } } -// method id "compute.addresses.delete": - -type AddressesDeleteCall struct { - s *Service - project string - region string - address string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Delete: Deletes the specified address resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/delete -func (r *AddressesService) Delete(project string, region string, address string) *AddressesDeleteCall { - c := &AddressesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.region = region - c.address = address - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *AddressesDeleteCall) Fields(s ...googleapi.Field) *AddressesDeleteCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *AddressesDeleteCall) Context(ctx context.Context) *AddressesDeleteCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *AddressesDeleteCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *AddressesDeleteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{address}") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "address": c.address, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.addresses.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *AddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Deletes the specified address resource.", - // "httpMethod": "DELETE", - // "id": "compute.addresses.delete", - // "parameterOrder": [ - // "project", - // "region", - // "address" - // ], - // "parameters": { - // "address": { - // "description": "Name of the address resource to delete.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/regions/{region}/addresses/{address}", - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.addresses.get": +// method id "compute.acceleratorTypes.get": -type AddressesGetCall struct { - s *Service - project string - region string - address string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type AcceleratorTypesGetCall struct { + s *Service + project string + zone string + acceleratorType string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified address resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/get -func (r *AddressesService) Get(project string, region string, address string) *AddressesGetCall { - c := &AddressesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified accelerator type. Get a list of available +// accelerator types by making a list() request. +func (r *AcceleratorTypesService) Get(project string, zone string, acceleratorType string) *AcceleratorTypesGetCall { + c := &AcceleratorTypesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.address = address + c.zone = zone + c.acceleratorType = acceleratorType return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AddressesGetCall) Fields(s ...googleapi.Field) *AddressesGetCall { +func (c *AcceleratorTypesGetCall) Fields(s ...googleapi.Field) *AcceleratorTypesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -13782,7 +15359,7 @@ func (c *AddressesGetCall) Fields(s ...googleapi.Field) *AddressesGetCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *AddressesGetCall) IfNoneMatch(entityTag string) *AddressesGetCall { +func (c *AcceleratorTypesGetCall) IfNoneMatch(entityTag string) *AcceleratorTypesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -13790,21 +15367,21 @@ func (c *AddressesGetCall) IfNoneMatch(entityTag string) *AddressesGetCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AddressesGetCall) Context(ctx context.Context) *AddressesGetCall { +func (c *AcceleratorTypesGetCall) Context(ctx context.Context) *AcceleratorTypesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AddressesGetCall) Header() http.Header { +func (c *AcceleratorTypesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AddressesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *AcceleratorTypesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -13815,26 +15392,26 @@ func (c *AddressesGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{address}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/acceleratorTypes/{acceleratorType}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "address": c.address, + "project": c.project, + "zone": c.zone, + "acceleratorType": c.acceleratorType, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.addresses.get" call. -// Exactly one of *Address or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Address.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *AddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, error) { +// Do executes the "compute.acceleratorTypes.get" call. +// Exactly one of *AcceleratorType or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *AcceleratorType.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AcceleratorTypesGetCall) Do(opts ...googleapi.CallOption) (*AcceleratorType, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -13853,7 +15430,7 @@ func (c *AddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Address{ + ret := &AcceleratorType{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -13865,17 +15442,17 @@ func (c *AddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, error) { } return ret, nil // { - // "description": "Returns the specified address resource.", + // "description": "Returns the specified accelerator type. Get a list of available accelerator types by making a list() request.", // "httpMethod": "GET", - // "id": "compute.addresses.get", + // "id": "compute.acceleratorTypes.get", // "parameterOrder": [ // "project", - // "region", - // "address" + // "zone", + // "acceleratorType" // ], // "parameters": { - // "address": { - // "description": "Name of the address resource to return.", + // "acceleratorType": { + // "description": "Name of the accelerator type to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -13888,17 +15465,17 @@ func (c *AddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, error) { // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region for this request.", + // "zone": { + // "description": "The name of the zone for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/addresses/{address}", + // "path": "{project}/zones/{zone}/acceleratorTypes/{acceleratorType}", // "response": { - // "$ref": "Address" + // "$ref": "AcceleratorType" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -13909,180 +15486,30 @@ func (c *AddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, error) { } -// method id "compute.addresses.insert": - -type AddressesInsertCall struct { - s *Service - project string - region string - address *Address - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Insert: Creates an address resource in the specified project using -// the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/insert -func (r *AddressesService) Insert(project string, region string, address *Address) *AddressesInsertCall { - c := &AddressesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.region = region - c.address = address - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *AddressesInsertCall) Fields(s ...googleapi.Field) *AddressesInsertCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *AddressesInsertCall) Context(ctx context.Context) *AddressesInsertCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *AddressesInsertCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *AddressesInsertCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.address) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.addresses.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *AddressesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Creates an address resource in the specified project using the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.addresses.insert", - // "parameterOrder": [ - // "project", - // "region" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/regions/{region}/addresses", - // "request": { - // "$ref": "Address" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.addresses.list": +// method id "compute.acceleratorTypes.list": -type AddressesListCall struct { +type AcceleratorTypesListCall struct { s *Service project string - region string + zone string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of addresses contained within the specified -// region. -// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/list -func (r *AddressesService) List(project string, region string) *AddressesListCall { - c := &AddressesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of accelerator types available to the +// specified project. +func (r *AcceleratorTypesService) List(project string, zone string) *AcceleratorTypesListCall { + c := &AcceleratorTypesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region + c.zone = zone return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -14094,7 +15521,7 @@ func (r *AddressesService) List(project string, region string) *AddressesListCal // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -14106,7 +15533,7 @@ func (r *AddressesService) List(project string, region string) *AddressesListCal // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *AddressesListCall) Filter(filter string) *AddressesListCall { +func (c *AcceleratorTypesListCall) Filter(filter string) *AcceleratorTypesListCall { c.urlParams_.Set("filter", filter) return c } @@ -14117,7 +15544,7 @@ func (c *AddressesListCall) Filter(filter string) *AddressesListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *AddressesListCall) MaxResults(maxResults int64) *AddressesListCall { +func (c *AcceleratorTypesListCall) MaxResults(maxResults int64) *AcceleratorTypesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -14134,7 +15561,7 @@ func (c *AddressesListCall) MaxResults(maxResults int64) *AddressesListCall { // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *AddressesListCall) OrderBy(orderBy string) *AddressesListCall { +func (c *AcceleratorTypesListCall) OrderBy(orderBy string) *AcceleratorTypesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -14142,7 +15569,7 @@ func (c *AddressesListCall) OrderBy(orderBy string) *AddressesListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *AddressesListCall) PageToken(pageToken string) *AddressesListCall { +func (c *AcceleratorTypesListCall) PageToken(pageToken string) *AcceleratorTypesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -14150,7 +15577,7 @@ func (c *AddressesListCall) PageToken(pageToken string) *AddressesListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AddressesListCall) Fields(s ...googleapi.Field) *AddressesListCall { +func (c *AcceleratorTypesListCall) Fields(s ...googleapi.Field) *AcceleratorTypesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -14160,7 +15587,7 @@ func (c *AddressesListCall) Fields(s ...googleapi.Field) *AddressesListCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *AddressesListCall) IfNoneMatch(entityTag string) *AddressesListCall { +func (c *AcceleratorTypesListCall) IfNoneMatch(entityTag string) *AcceleratorTypesListCall { c.ifNoneMatch_ = entityTag return c } @@ -14168,21 +15595,21 @@ func (c *AddressesListCall) IfNoneMatch(entityTag string) *AddressesListCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AddressesListCall) Context(ctx context.Context) *AddressesListCall { +func (c *AcceleratorTypesListCall) Context(ctx context.Context) *AcceleratorTypesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AddressesListCall) Header() http.Header { +func (c *AcceleratorTypesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AddressesListCall) doRequest(alt string) (*http.Response, error) { +func (c *AcceleratorTypesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -14193,25 +15620,25 @@ func (c *AddressesListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/acceleratorTypes") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.addresses.list" call. -// Exactly one of *AddressList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *AddressList.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *AddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, error) { +// Do executes the "compute.acceleratorTypes.list" call. +// Exactly one of *AcceleratorTypeList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *AcceleratorTypeList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AcceleratorTypesListCall) Do(opts ...googleapi.CallOption) (*AcceleratorTypeList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -14230,7 +15657,7 @@ func (c *AddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, erro if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &AddressList{ + ret := &AcceleratorTypeList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -14242,16 +15669,16 @@ func (c *AddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, erro } return ret, nil // { - // "description": "Retrieves a list of addresses contained within the specified region.", + // "description": "Retrieves a list of accelerator types available to the specified project.", // "httpMethod": "GET", - // "id": "compute.addresses.list", + // "id": "compute.acceleratorTypes.list", // "parameterOrder": [ // "project", - // "region" + // "zone" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -14280,17 +15707,17 @@ func (c *AddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, erro // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region for this request.", + // "zone": { + // "description": "The name of the zone for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/addresses", + // "path": "{project}/zones/{zone}/acceleratorTypes", // "response": { - // "$ref": "AddressList" + // "$ref": "AcceleratorTypeList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -14304,7 +15731,7 @@ func (c *AddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, erro // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *AddressesListCall) Pages(ctx context.Context, f func(*AddressList) error) error { +func (c *AcceleratorTypesListCall) Pages(ctx context.Context, f func(*AcceleratorTypeList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -14322,9 +15749,9 @@ func (c *AddressesListCall) Pages(ctx context.Context, f func(*AddressList) erro } } -// method id "compute.autoscalers.aggregatedList": +// method id "compute.addresses.aggregatedList": -type AutoscalersAggregatedListCall struct { +type AddressesAggregatedListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -14333,17 +15760,17 @@ type AutoscalersAggregatedListCall struct { header_ http.Header } -// AggregatedList: Retrieves an aggregated list of autoscalers. -func (r *AutoscalersService) AggregatedList(project string) *AutoscalersAggregatedListCall { - c := &AutoscalersAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves an aggregated list of addresses. +// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/aggregatedList +func (r *AddressesService) AggregatedList(project string) *AddressesAggregatedListCall { + c := &AddressesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -14355,7 +15782,7 @@ func (r *AutoscalersService) AggregatedList(project string) *AutoscalersAggregat // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -14367,7 +15794,7 @@ func (r *AutoscalersService) AggregatedList(project string) *AutoscalersAggregat // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *AutoscalersAggregatedListCall) Filter(filter string) *AutoscalersAggregatedListCall { +func (c *AddressesAggregatedListCall) Filter(filter string) *AddressesAggregatedListCall { c.urlParams_.Set("filter", filter) return c } @@ -14378,7 +15805,7 @@ func (c *AutoscalersAggregatedListCall) Filter(filter string) *AutoscalersAggreg // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *AutoscalersAggregatedListCall) MaxResults(maxResults int64) *AutoscalersAggregatedListCall { +func (c *AddressesAggregatedListCall) MaxResults(maxResults int64) *AddressesAggregatedListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -14395,7 +15822,7 @@ func (c *AutoscalersAggregatedListCall) MaxResults(maxResults int64) *Autoscaler // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *AutoscalersAggregatedListCall) OrderBy(orderBy string) *AutoscalersAggregatedListCall { +func (c *AddressesAggregatedListCall) OrderBy(orderBy string) *AddressesAggregatedListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -14403,7 +15830,7 @@ func (c *AutoscalersAggregatedListCall) OrderBy(orderBy string) *AutoscalersAggr // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *AutoscalersAggregatedListCall) PageToken(pageToken string) *AutoscalersAggregatedListCall { +func (c *AddressesAggregatedListCall) PageToken(pageToken string) *AddressesAggregatedListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -14411,7 +15838,7 @@ func (c *AutoscalersAggregatedListCall) PageToken(pageToken string) *Autoscalers // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AutoscalersAggregatedListCall) Fields(s ...googleapi.Field) *AutoscalersAggregatedListCall { +func (c *AddressesAggregatedListCall) Fields(s ...googleapi.Field) *AddressesAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -14421,7 +15848,7 @@ func (c *AutoscalersAggregatedListCall) Fields(s ...googleapi.Field) *Autoscaler // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *AutoscalersAggregatedListCall) IfNoneMatch(entityTag string) *AutoscalersAggregatedListCall { +func (c *AddressesAggregatedListCall) IfNoneMatch(entityTag string) *AddressesAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -14429,21 +15856,21 @@ func (c *AutoscalersAggregatedListCall) IfNoneMatch(entityTag string) *Autoscale // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AutoscalersAggregatedListCall) Context(ctx context.Context) *AutoscalersAggregatedListCall { +func (c *AddressesAggregatedListCall) Context(ctx context.Context) *AddressesAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AutoscalersAggregatedListCall) Header() http.Header { +func (c *AddressesAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AutoscalersAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *AddressesAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -14454,7 +15881,7 @@ func (c *AutoscalersAggregatedListCall) doRequest(alt string) (*http.Response, e } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/autoscalers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/addresses") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -14464,14 +15891,14 @@ func (c *AutoscalersAggregatedListCall) doRequest(alt string) (*http.Response, e return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.autoscalers.aggregatedList" call. -// Exactly one of *AutoscalerAggregatedList or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *AutoscalerAggregatedList.ServerResponse.Header or (if a response was +// Do executes the "compute.addresses.aggregatedList" call. +// Exactly one of *AddressAggregatedList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *AddressAggregatedList.ServerResponse.Header or (if a response was // returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *AutoscalersAggregatedListCall) Do(opts ...googleapi.CallOption) (*AutoscalerAggregatedList, error) { +func (c *AddressesAggregatedListCall) Do(opts ...googleapi.CallOption) (*AddressAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -14490,7 +15917,7 @@ func (c *AutoscalersAggregatedListCall) Do(opts ...googleapi.CallOption) (*Autos if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &AutoscalerAggregatedList{ + ret := &AddressAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -14502,15 +15929,15 @@ func (c *AutoscalersAggregatedListCall) Do(opts ...googleapi.CallOption) (*Autos } return ret, nil // { - // "description": "Retrieves an aggregated list of autoscalers.", + // "description": "Retrieves an aggregated list of addresses.", // "httpMethod": "GET", - // "id": "compute.autoscalers.aggregatedList", + // "id": "compute.addresses.aggregatedList", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -14540,9 +15967,9 @@ func (c *AutoscalersAggregatedListCall) Do(opts ...googleapi.CallOption) (*Autos // "type": "string" // } // }, - // "path": "{project}/aggregated/autoscalers", + // "path": "{project}/aggregated/addresses", // "response": { - // "$ref": "AutoscalerAggregatedList" + // "$ref": "AddressAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -14556,7 +15983,7 @@ func (c *AutoscalersAggregatedListCall) Do(opts ...googleapi.CallOption) (*Autos // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *AutoscalersAggregatedListCall) Pages(ctx context.Context, f func(*AutoscalerAggregatedList) error) error { +func (c *AddressesAggregatedListCall) Pages(ctx context.Context, f func(*AddressAggregatedList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -14574,31 +16001,32 @@ func (c *AutoscalersAggregatedListCall) Pages(ctx context.Context, f func(*Autos } } -// method id "compute.autoscalers.delete": +// method id "compute.addresses.delete": -type AutoscalersDeleteCall struct { +type AddressesDeleteCall struct { s *Service project string - zone string - autoscaler string + region string + address string urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Delete: Deletes the specified autoscaler. -func (r *AutoscalersService) Delete(project string, zone string, autoscaler string) *AutoscalersDeleteCall { - c := &AutoscalersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified address resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/delete +func (r *AddressesService) Delete(project string, region string, address string) *AddressesDeleteCall { + c := &AddressesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.autoscaler = autoscaler + c.region = region + c.address = address return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AutoscalersDeleteCall) Fields(s ...googleapi.Field) *AutoscalersDeleteCall { +func (c *AddressesDeleteCall) Fields(s ...googleapi.Field) *AddressesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -14606,21 +16034,21 @@ func (c *AutoscalersDeleteCall) Fields(s ...googleapi.Field) *AutoscalersDeleteC // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AutoscalersDeleteCall) Context(ctx context.Context) *AutoscalersDeleteCall { +func (c *AddressesDeleteCall) Context(ctx context.Context) *AddressesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AutoscalersDeleteCall) Header() http.Header { +func (c *AddressesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AutoscalersDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *AddressesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -14628,26 +16056,26 @@ func (c *AutoscalersDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers/{autoscaler}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{address}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "autoscaler": c.autoscaler, + "project": c.project, + "region": c.region, + "address": c.address, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.autoscalers.delete" call. +// Do executes the "compute.addresses.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *AutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *AddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -14678,17 +16106,17 @@ func (c *AutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er } return ret, nil // { - // "description": "Deletes the specified autoscaler.", + // "description": "Deletes the specified address resource.", // "httpMethod": "DELETE", - // "id": "compute.autoscalers.delete", + // "id": "compute.addresses.delete", // "parameterOrder": [ // "project", - // "zone", - // "autoscaler" + // "region", + // "address" // ], // "parameters": { - // "autoscaler": { - // "description": "Name of the autoscaler to delete.", + // "address": { + // "description": "Name of the address resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -14701,15 +16129,15 @@ func (c *AutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er // "required": true, // "type": "string" // }, - // "zone": { - // "description": "Name of the zone for this request.", + // "region": { + // "description": "Name of the region for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/autoscalers/{autoscaler}", + // "path": "{project}/regions/{region}/addresses/{address}", // "response": { // "$ref": "Operation" // }, @@ -14721,33 +16149,33 @@ func (c *AutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er } -// method id "compute.autoscalers.get": +// method id "compute.addresses.get": -type AutoscalersGetCall struct { +type AddressesGetCall struct { s *Service project string - zone string - autoscaler string + region string + address string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns the specified autoscaler resource. Get a list of -// available autoscalers by making a list() request. -func (r *AutoscalersService) Get(project string, zone string, autoscaler string) *AutoscalersGetCall { - c := &AutoscalersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified address resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/get +func (r *AddressesService) Get(project string, region string, address string) *AddressesGetCall { + c := &AddressesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.autoscaler = autoscaler + c.region = region + c.address = address return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AutoscalersGetCall) Fields(s ...googleapi.Field) *AutoscalersGetCall { +func (c *AddressesGetCall) Fields(s ...googleapi.Field) *AddressesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -14757,7 +16185,7 @@ func (c *AutoscalersGetCall) Fields(s ...googleapi.Field) *AutoscalersGetCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *AutoscalersGetCall) IfNoneMatch(entityTag string) *AutoscalersGetCall { +func (c *AddressesGetCall) IfNoneMatch(entityTag string) *AddressesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -14765,21 +16193,21 @@ func (c *AutoscalersGetCall) IfNoneMatch(entityTag string) *AutoscalersGetCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AutoscalersGetCall) Context(ctx context.Context) *AutoscalersGetCall { +func (c *AddressesGetCall) Context(ctx context.Context) *AddressesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AutoscalersGetCall) Header() http.Header { +func (c *AddressesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AutoscalersGetCall) doRequest(alt string) (*http.Response, error) { +func (c *AddressesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -14790,26 +16218,26 @@ func (c *AutoscalersGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers/{autoscaler}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{address}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "autoscaler": c.autoscaler, + "project": c.project, + "region": c.region, + "address": c.address, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.autoscalers.get" call. -// Exactly one of *Autoscaler or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Autoscaler.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *AutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler, error) { +// Do executes the "compute.addresses.get" call. +// Exactly one of *Address or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Address.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *AddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -14828,7 +16256,7 @@ func (c *AutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler, erro if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Autoscaler{ + ret := &Address{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -14840,17 +16268,17 @@ func (c *AutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler, erro } return ret, nil // { - // "description": "Returns the specified autoscaler resource. Get a list of available autoscalers by making a list() request.", + // "description": "Returns the specified address resource.", // "httpMethod": "GET", - // "id": "compute.autoscalers.get", + // "id": "compute.addresses.get", // "parameterOrder": [ // "project", - // "zone", - // "autoscaler" + // "region", + // "address" // ], // "parameters": { - // "autoscaler": { - // "description": "Name of the autoscaler to return.", + // "address": { + // "description": "Name of the address resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -14863,17 +16291,17 @@ func (c *AutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler, erro // "required": true, // "type": "string" // }, - // "zone": { - // "description": "Name of the zone for this request.", + // "region": { + // "description": "Name of the region for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/autoscalers/{autoscaler}", + // "path": "{project}/regions/{region}/addresses/{address}", // "response": { - // "$ref": "Autoscaler" + // "$ref": "Address" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -14884,32 +16312,33 @@ func (c *AutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler, erro } -// method id "compute.autoscalers.insert": +// method id "compute.addresses.insert": -type AutoscalersInsertCall struct { +type AddressesInsertCall struct { s *Service project string - zone string - autoscaler *Autoscaler + region string + address *Address urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Insert: Creates an autoscaler in the specified project using the data -// included in the request. -func (r *AutoscalersService) Insert(project string, zone string, autoscaler *Autoscaler) *AutoscalersInsertCall { - c := &AutoscalersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates an address resource in the specified project using +// the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/insert +func (r *AddressesService) Insert(project string, region string, address *Address) *AddressesInsertCall { + c := &AddressesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.autoscaler = autoscaler + c.region = region + c.address = address return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AutoscalersInsertCall) Fields(s ...googleapi.Field) *AutoscalersInsertCall { +func (c *AddressesInsertCall) Fields(s ...googleapi.Field) *AddressesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -14917,52 +16346,52 @@ func (c *AutoscalersInsertCall) Fields(s ...googleapi.Field) *AutoscalersInsertC // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AutoscalersInsertCall) Context(ctx context.Context) *AutoscalersInsertCall { +func (c *AddressesInsertCall) Context(ctx context.Context) *AddressesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AutoscalersInsertCall) Header() http.Header { +func (c *AddressesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AutoscalersInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *AddressesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.address) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, + "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.autoscalers.insert" call. +// Do executes the "compute.addresses.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *AutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *AddressesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -14993,12 +16422,12 @@ func (c *AutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er } return ret, nil // { - // "description": "Creates an autoscaler in the specified project using the data included in the request.", + // "description": "Creates an address resource in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.autoscalers.insert", + // "id": "compute.addresses.insert", // "parameterOrder": [ // "project", - // "zone" + // "region" // ], // "parameters": { // "project": { @@ -15008,17 +16437,17 @@ func (c *AutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "required": true, // "type": "string" // }, - // "zone": { - // "description": "Name of the zone for this request.", + // "region": { + // "description": "Name of the region for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/autoscalers", + // "path": "{project}/regions/{region}/addresses", // "request": { - // "$ref": "Autoscaler" + // "$ref": "Address" // }, // "response": { // "$ref": "Operation" @@ -15031,31 +16460,31 @@ func (c *AutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er } -// method id "compute.autoscalers.list": +// method id "compute.addresses.list": -type AutoscalersListCall struct { +type AddressesListCall struct { s *Service project string - zone string + region string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of autoscalers contained within the specified -// zone. -func (r *AutoscalersService) List(project string, zone string) *AutoscalersListCall { - c := &AutoscalersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of addresses contained within the specified +// region. +// For details, see https://cloud.google.com/compute/docs/reference/latest/addresses/list +func (r *AddressesService) List(project string, region string) *AddressesListCall { + c := &AddressesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone + c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -15067,7 +16496,7 @@ func (r *AutoscalersService) List(project string, zone string) *AutoscalersListC // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -15079,7 +16508,7 @@ func (r *AutoscalersService) List(project string, zone string) *AutoscalersListC // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *AutoscalersListCall) Filter(filter string) *AutoscalersListCall { +func (c *AddressesListCall) Filter(filter string) *AddressesListCall { c.urlParams_.Set("filter", filter) return c } @@ -15090,7 +16519,7 @@ func (c *AutoscalersListCall) Filter(filter string) *AutoscalersListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *AutoscalersListCall) MaxResults(maxResults int64) *AutoscalersListCall { +func (c *AddressesListCall) MaxResults(maxResults int64) *AddressesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -15107,7 +16536,7 @@ func (c *AutoscalersListCall) MaxResults(maxResults int64) *AutoscalersListCall // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *AutoscalersListCall) OrderBy(orderBy string) *AutoscalersListCall { +func (c *AddressesListCall) OrderBy(orderBy string) *AddressesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -15115,7 +16544,7 @@ func (c *AutoscalersListCall) OrderBy(orderBy string) *AutoscalersListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *AutoscalersListCall) PageToken(pageToken string) *AutoscalersListCall { +func (c *AddressesListCall) PageToken(pageToken string) *AddressesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -15123,7 +16552,7 @@ func (c *AutoscalersListCall) PageToken(pageToken string) *AutoscalersListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AutoscalersListCall) Fields(s ...googleapi.Field) *AutoscalersListCall { +func (c *AddressesListCall) Fields(s ...googleapi.Field) *AddressesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -15133,7 +16562,7 @@ func (c *AutoscalersListCall) Fields(s ...googleapi.Field) *AutoscalersListCall // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *AutoscalersListCall) IfNoneMatch(entityTag string) *AutoscalersListCall { +func (c *AddressesListCall) IfNoneMatch(entityTag string) *AddressesListCall { c.ifNoneMatch_ = entityTag return c } @@ -15141,21 +16570,21 @@ func (c *AutoscalersListCall) IfNoneMatch(entityTag string) *AutoscalersListCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AutoscalersListCall) Context(ctx context.Context) *AutoscalersListCall { +func (c *AddressesListCall) Context(ctx context.Context) *AddressesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AutoscalersListCall) Header() http.Header { +func (c *AddressesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AutoscalersListCall) doRequest(alt string) (*http.Response, error) { +func (c *AddressesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -15166,25 +16595,25 @@ func (c *AutoscalersListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, + "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.autoscalers.list" call. -// Exactly one of *AutoscalerList or error will be non-nil. Any non-2xx +// Do executes the "compute.addresses.list" call. +// Exactly one of *AddressList or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *AutoscalerList.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *AutoscalersListCall) Do(opts ...googleapi.CallOption) (*AutoscalerList, error) { +// *AddressList.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *AddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -15203,7 +16632,7 @@ func (c *AutoscalersListCall) Do(opts ...googleapi.CallOption) (*AutoscalerList, if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &AutoscalerList{ + ret := &AddressList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -15215,16 +16644,16 @@ func (c *AutoscalersListCall) Do(opts ...googleapi.CallOption) (*AutoscalerList, } return ret, nil // { - // "description": "Retrieves a list of autoscalers contained within the specified zone.", + // "description": "Retrieves a list of addresses contained within the specified region.", // "httpMethod": "GET", - // "id": "compute.autoscalers.list", + // "id": "compute.addresses.list", // "parameterOrder": [ // "project", - // "zone" + // "region" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -15253,17 +16682,17 @@ func (c *AutoscalersListCall) Do(opts ...googleapi.CallOption) (*AutoscalerList, // "required": true, // "type": "string" // }, - // "zone": { - // "description": "Name of the zone for this request.", + // "region": { + // "description": "Name of the region for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/autoscalers", + // "path": "{project}/regions/{region}/addresses", // "response": { - // "$ref": "AutoscalerList" + // "$ref": "AddressList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -15277,7 +16706,7 @@ func (c *AutoscalersListCall) Do(opts ...googleapi.CallOption) (*AutoscalerList, // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *AutoscalersListCall) Pages(ctx context.Context, f func(*AutoscalerList) error) error { +func (c *AddressesListCall) Pages(ctx context.Context, f func(*AddressList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -15295,92 +16724,155 @@ func (c *AutoscalersListCall) Pages(ctx context.Context, f func(*AutoscalerList) } } -// method id "compute.autoscalers.patch": +// method id "compute.autoscalers.aggregatedList": -type AutoscalersPatchCall struct { - s *Service - project string - zone string - autoscaler *Autoscaler - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type AutoscalersAggregatedListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Patch: Updates an autoscaler in the specified project using the data -// included in the request. This method supports patch semantics. -func (r *AutoscalersService) Patch(project string, zone string, autoscaler *Autoscaler) *AutoscalersPatchCall { - c := &AutoscalersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves an aggregated list of autoscalers. +func (r *AutoscalersService) AggregatedList(project string) *AutoscalersAggregatedListCall { + c := &AutoscalersAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.autoscaler = autoscaler return c } -// Autoscaler sets the optional parameter "autoscaler": Name of the -// autoscaler to patch. -func (c *AutoscalersPatchCall) Autoscaler(autoscaler string) *AutoscalersPatchCall { - c.urlParams_.Set("autoscaler", autoscaler) +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *AutoscalersAggregatedListCall) Filter(filter string) *AutoscalersAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *AutoscalersAggregatedListCall) MaxResults(maxResults int64) *AutoscalersAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *AutoscalersAggregatedListCall) OrderBy(orderBy string) *AutoscalersAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *AutoscalersAggregatedListCall) PageToken(pageToken string) *AutoscalersAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AutoscalersPatchCall) Fields(s ...googleapi.Field) *AutoscalersPatchCall { +func (c *AutoscalersAggregatedListCall) Fields(s ...googleapi.Field) *AutoscalersAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *AutoscalersAggregatedListCall) IfNoneMatch(entityTag string) *AutoscalersAggregatedListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AutoscalersPatchCall) Context(ctx context.Context) *AutoscalersPatchCall { +func (c *AutoscalersAggregatedListCall) Context(ctx context.Context) *AutoscalersAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AutoscalersPatchCall) Header() http.Header { +func (c *AutoscalersAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AutoscalersPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *AutoscalersAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/autoscalers") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PATCH", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.autoscalers.patch" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.autoscalers.aggregatedList" call. +// Exactly one of *AutoscalerAggregatedList or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *AutoscalerAggregatedList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *AutoscalersAggregatedListCall) Do(opts ...googleapi.CallOption) (*AutoscalerAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -15399,7 +16891,7 @@ func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, err if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &AutoscalerAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -15411,18 +16903,34 @@ func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, err } return ret, nil // { - // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", - // "httpMethod": "PATCH", - // "id": "compute.autoscalers.patch", + // "description": "Retrieves an aggregated list of autoscalers.", + // "httpMethod": "GET", + // "id": "compute.autoscalers.aggregatedList", // "parameterOrder": [ - // "project", - // "zone" + // "project" // ], // "parameters": { - // "autoscaler": { - // "description": "Name of the autoscaler to patch.", + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", // "location": "query", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "type": "string" // }, // "project": { @@ -15431,21 +16939,11 @@ func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, err // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "Name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/autoscalers", - // "request": { - // "$ref": "Autoscaler" - // }, + // "path": "{project}/aggregated/autoscalers", // "response": { - // "$ref": "Operation" + // "$ref": "AutoscalerAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -15456,39 +16954,52 @@ func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, err } -// method id "compute.autoscalers.update": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *AutoscalersAggregatedListCall) Pages(ctx context.Context, f func(*AutoscalerAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type AutoscalersUpdateCall struct { +// method id "compute.autoscalers.delete": + +type AutoscalersDeleteCall struct { s *Service project string zone string - autoscaler *Autoscaler + autoscaler string urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Update: Updates an autoscaler in the specified project using the data -// included in the request. -func (r *AutoscalersService) Update(project string, zone string, autoscaler *Autoscaler) *AutoscalersUpdateCall { - c := &AutoscalersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified autoscaler. +func (r *AutoscalersService) Delete(project string, zone string, autoscaler string) *AutoscalersDeleteCall { + c := &AutoscalersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone c.autoscaler = autoscaler return c } -// Autoscaler sets the optional parameter "autoscaler": Name of the -// autoscaler to update. -func (c *AutoscalersUpdateCall) Autoscaler(autoscaler string) *AutoscalersUpdateCall { - c.urlParams_.Set("autoscaler", autoscaler) - return c -} - // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *AutoscalersUpdateCall) Fields(s ...googleapi.Field) *AutoscalersUpdateCall { +func (c *AutoscalersDeleteCall) Fields(s ...googleapi.Field) *AutoscalersDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -15496,52 +17007,48 @@ func (c *AutoscalersUpdateCall) Fields(s ...googleapi.Field) *AutoscalersUpdateC // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *AutoscalersUpdateCall) Context(ctx context.Context) *AutoscalersUpdateCall { +func (c *AutoscalersDeleteCall) Context(ctx context.Context) *AutoscalersDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *AutoscalersUpdateCall) Header() http.Header { +func (c *AutoscalersDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *AutoscalersUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *AutoscalersDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers/{autoscaler}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PUT", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, + "project": c.project, + "zone": c.zone, + "autoscaler": c.autoscaler, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.autoscalers.update" call. +// Do executes the "compute.autoscalers.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *AutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *AutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -15572,18 +17079,20 @@ func (c *AutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, er } return ret, nil // { - // "description": "Updates an autoscaler in the specified project using the data included in the request.", - // "httpMethod": "PUT", - // "id": "compute.autoscalers.update", + // "description": "Deletes the specified autoscaler.", + // "httpMethod": "DELETE", + // "id": "compute.autoscalers.delete", // "parameterOrder": [ // "project", - // "zone" + // "zone", + // "autoscaler" // ], // "parameters": { // "autoscaler": { - // "description": "Name of the autoscaler to update.", - // "location": "query", + // "description": "Name of the autoscaler to delete.", + // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { @@ -15601,10 +17110,7 @@ func (c *AutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/autoscalers", - // "request": { - // "$ref": "Autoscaler" - // }, + // "path": "{project}/zones/{zone}/autoscalers/{autoscaler}", // "response": { // "$ref": "Operation" // }, @@ -15616,77 +17122,95 @@ func (c *AutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, er } -// method id "compute.backendBuckets.delete": +// method id "compute.autoscalers.get": -type BackendBucketsDeleteCall struct { - s *Service - project string - backendBucket string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type AutoscalersGetCall struct { + s *Service + project string + zone string + autoscaler string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified BackendBucket resource. -func (r *BackendBucketsService) Delete(project string, backendBucket string) *BackendBucketsDeleteCall { - c := &BackendBucketsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified autoscaler resource. Get a list of +// available autoscalers by making a list() request. +func (r *AutoscalersService) Get(project string, zone string, autoscaler string) *AutoscalersGetCall { + c := &AutoscalersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.backendBucket = backendBucket + c.zone = zone + c.autoscaler = autoscaler return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendBucketsDeleteCall) Fields(s ...googleapi.Field) *BackendBucketsDeleteCall { +func (c *AutoscalersGetCall) Fields(s ...googleapi.Field) *AutoscalersGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *AutoscalersGetCall) IfNoneMatch(entityTag string) *AutoscalersGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendBucketsDeleteCall) Context(ctx context.Context) *BackendBucketsDeleteCall { +func (c *AutoscalersGetCall) Context(ctx context.Context) *AutoscalersGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendBucketsDeleteCall) Header() http.Header { +func (c *AutoscalersGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendBucketsDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *AutoscalersGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers/{autoscaler}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "backendBucket": c.backendBucket, + "project": c.project, + "zone": c.zone, + "autoscaler": c.autoscaler, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendBuckets.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.autoscalers.get" call. +// Exactly one of *Autoscaler or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at +// *Autoscaler.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *BackendBucketsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *AutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -15705,7 +17229,7 @@ func (c *BackendBucketsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &Autoscaler{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -15717,16 +17241,17 @@ func (c *BackendBucketsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Deletes the specified BackendBucket resource.", - // "httpMethod": "DELETE", - // "id": "compute.backendBuckets.delete", + // "description": "Returns the specified autoscaler resource. Get a list of available autoscalers by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.autoscalers.get", // "parameterOrder": [ // "project", - // "backendBucket" + // "zone", + // "autoscaler" // ], // "parameters": { - // "backendBucket": { - // "description": "Name of the BackendBucket resource to delete.", + // "autoscaler": { + // "description": "Name of the autoscaler to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -15738,162 +17263,18 @@ func (c *BackendBucketsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // } - // }, - // "path": "{project}/global/backendBuckets/{backendBucket}", - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.backendBuckets.get": - -type BackendBucketsGetCall struct { - s *Service - project string - backendBucket string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} - -// Get: Returns the specified BackendBucket resource. Get a list of -// available backend buckets by making a list() request. -func (r *BackendBucketsService) Get(project string, backendBucket string) *BackendBucketsGetCall { - c := &BackendBucketsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.backendBucket = backendBucket - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *BackendBucketsGetCall) Fields(s ...googleapi.Field) *BackendBucketsGetCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *BackendBucketsGetCall) IfNoneMatch(entityTag string) *BackendBucketsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *BackendBucketsGetCall) Context(ctx context.Context) *BackendBucketsGetCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *BackendBucketsGetCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *BackendBucketsGetCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "backendBucket": c.backendBucket, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.backendBuckets.get" call. -// Exactly one of *BackendBucket or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *BackendBucket.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *BackendBucketsGetCall) Do(opts ...googleapi.CallOption) (*BackendBucket, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &BackendBucket{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Returns the specified BackendBucket resource. Get a list of available backend buckets by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.backendBuckets.get", - // "parameterOrder": [ - // "project", - // "backendBucket" - // ], - // "parameters": { - // "backendBucket": { - // "description": "Name of the BackendBucket resource to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // }, - // "project": { - // "description": "Project ID for this request.", + // "zone": { + // "description": "Name of the zone for this request.", // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/backendBuckets/{backendBucket}", + // "path": "{project}/zones/{zone}/autoscalers/{autoscaler}", // "response": { - // "$ref": "BackendBucket" + // "$ref": "Autoscaler" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -15904,30 +17285,32 @@ func (c *BackendBucketsGetCall) Do(opts ...googleapi.CallOption) (*BackendBucket } -// method id "compute.backendBuckets.insert": +// method id "compute.autoscalers.insert": -type BackendBucketsInsertCall struct { - s *Service - project string - backendbucket *BackendBucket - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type AutoscalersInsertCall struct { + s *Service + project string + zone string + autoscaler *Autoscaler + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates a BackendBucket resource in the specified project -// using the data included in the request. -func (r *BackendBucketsService) Insert(project string, backendbucket *BackendBucket) *BackendBucketsInsertCall { - c := &BackendBucketsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates an autoscaler in the specified project using the data +// included in the request. +func (r *AutoscalersService) Insert(project string, zone string, autoscaler *Autoscaler) *AutoscalersInsertCall { + c := &AutoscalersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.backendbucket = backendbucket + c.zone = zone + c.autoscaler = autoscaler return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendBucketsInsertCall) Fields(s ...googleapi.Field) *BackendBucketsInsertCall { +func (c *AutoscalersInsertCall) Fields(s ...googleapi.Field) *AutoscalersInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -15935,51 +17318,52 @@ func (c *BackendBucketsInsertCall) Fields(s ...googleapi.Field) *BackendBucketsI // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendBucketsInsertCall) Context(ctx context.Context) *BackendBucketsInsertCall { +func (c *AutoscalersInsertCall) Context(ctx context.Context) *AutoscalersInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendBucketsInsertCall) Header() http.Header { +func (c *AutoscalersInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendBucketsInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *AutoscalersInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendBuckets.insert" call. +// Do executes the "compute.autoscalers.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *BackendBucketsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *AutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -16010,11 +17394,12 @@ func (c *BackendBucketsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Creates a BackendBucket resource in the specified project using the data included in the request.", + // "description": "Creates an autoscaler in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.backendBuckets.insert", + // "id": "compute.autoscalers.insert", // "parameterOrder": [ - // "project" + // "project", + // "zone" // ], // "parameters": { // "project": { @@ -16023,11 +17408,18 @@ func (c *BackendBucketsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "Name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/backendBuckets", + // "path": "{project}/zones/{zone}/autoscalers", // "request": { - // "$ref": "BackendBucket" + // "$ref": "Autoscaler" // }, // "response": { // "$ref": "Operation" @@ -16040,29 +17432,30 @@ func (c *BackendBucketsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.backendBuckets.list": +// method id "compute.autoscalers.list": -type BackendBucketsListCall struct { +type AutoscalersListCall struct { s *Service project string + zone string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves the list of BackendBucket resources available to the -// specified project. -func (r *BackendBucketsService) List(project string) *BackendBucketsListCall { - c := &BackendBucketsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of autoscalers contained within the specified +// zone. +func (r *AutoscalersService) List(project string, zone string) *AutoscalersListCall { + c := &AutoscalersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.zone = zone return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -16074,7 +17467,7 @@ func (r *BackendBucketsService) List(project string) *BackendBucketsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -16086,7 +17479,7 @@ func (r *BackendBucketsService) List(project string) *BackendBucketsListCall { // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *BackendBucketsListCall) Filter(filter string) *BackendBucketsListCall { +func (c *AutoscalersListCall) Filter(filter string) *AutoscalersListCall { c.urlParams_.Set("filter", filter) return c } @@ -16097,7 +17490,7 @@ func (c *BackendBucketsListCall) Filter(filter string) *BackendBucketsListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *BackendBucketsListCall) MaxResults(maxResults int64) *BackendBucketsListCall { +func (c *AutoscalersListCall) MaxResults(maxResults int64) *AutoscalersListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -16114,7 +17507,7 @@ func (c *BackendBucketsListCall) MaxResults(maxResults int64) *BackendBucketsLis // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *BackendBucketsListCall) OrderBy(orderBy string) *BackendBucketsListCall { +func (c *AutoscalersListCall) OrderBy(orderBy string) *AutoscalersListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -16122,7 +17515,7 @@ func (c *BackendBucketsListCall) OrderBy(orderBy string) *BackendBucketsListCall // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *BackendBucketsListCall) PageToken(pageToken string) *BackendBucketsListCall { +func (c *AutoscalersListCall) PageToken(pageToken string) *AutoscalersListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -16130,7 +17523,7 @@ func (c *BackendBucketsListCall) PageToken(pageToken string) *BackendBucketsList // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendBucketsListCall) Fields(s ...googleapi.Field) *BackendBucketsListCall { +func (c *AutoscalersListCall) Fields(s ...googleapi.Field) *AutoscalersListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -16140,7 +17533,7 @@ func (c *BackendBucketsListCall) Fields(s ...googleapi.Field) *BackendBucketsLis // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *BackendBucketsListCall) IfNoneMatch(entityTag string) *BackendBucketsListCall { +func (c *AutoscalersListCall) IfNoneMatch(entityTag string) *AutoscalersListCall { c.ifNoneMatch_ = entityTag return c } @@ -16148,21 +17541,21 @@ func (c *BackendBucketsListCall) IfNoneMatch(entityTag string) *BackendBucketsLi // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendBucketsListCall) Context(ctx context.Context) *BackendBucketsListCall { +func (c *AutoscalersListCall) Context(ctx context.Context) *AutoscalersListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendBucketsListCall) Header() http.Header { +func (c *AutoscalersListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendBucketsListCall) doRequest(alt string) (*http.Response, error) { +func (c *AutoscalersListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -16173,24 +17566,25 @@ func (c *BackendBucketsListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendBuckets.list" call. -// Exactly one of *BackendBucketList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *BackendBucketList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.autoscalers.list" call. +// Exactly one of *AutoscalerList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *AutoscalerList.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *BackendBucketsListCall) Do(opts ...googleapi.CallOption) (*BackendBucketList, error) { +func (c *AutoscalersListCall) Do(opts ...googleapi.CallOption) (*AutoscalerList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -16209,7 +17603,7 @@ func (c *BackendBucketsListCall) Do(opts ...googleapi.CallOption) (*BackendBucke if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &BackendBucketList{ + ret := &AutoscalerList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -16221,15 +17615,16 @@ func (c *BackendBucketsListCall) Do(opts ...googleapi.CallOption) (*BackendBucke } return ret, nil // { - // "description": "Retrieves the list of BackendBucket resources available to the specified project.", + // "description": "Retrieves a list of autoscalers contained within the specified zone.", // "httpMethod": "GET", - // "id": "compute.backendBuckets.list", + // "id": "compute.autoscalers.list", // "parameterOrder": [ - // "project" + // "project", + // "zone" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -16257,11 +17652,18 @@ func (c *BackendBucketsListCall) Do(opts ...googleapi.CallOption) (*BackendBucke // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "Name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/backendBuckets", + // "path": "{project}/zones/{zone}/autoscalers", // "response": { - // "$ref": "BackendBucketList" + // "$ref": "AutoscalerList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -16275,7 +17677,7 @@ func (c *BackendBucketsListCall) Do(opts ...googleapi.CallOption) (*BackendBucke // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *BackendBucketsListCall) Pages(ctx context.Context, f func(*BackendBucketList) error) error { +func (c *AutoscalersListCall) Pages(ctx context.Context, f func(*AutoscalerList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -16293,32 +17695,40 @@ func (c *BackendBucketsListCall) Pages(ctx context.Context, f func(*BackendBucke } } -// method id "compute.backendBuckets.patch": +// method id "compute.autoscalers.patch": -type BackendBucketsPatchCall struct { - s *Service - project string - backendBucket string - backendbucket *BackendBucket - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type AutoscalersPatchCall struct { + s *Service + project string + zone string + autoscaler *Autoscaler + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Patch: Updates the specified BackendBucket resource with the data -// included in the request. This method supports patch semantics. -func (r *BackendBucketsService) Patch(project string, backendBucket string, backendbucket *BackendBucket) *BackendBucketsPatchCall { - c := &BackendBucketsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Patch: Updates an autoscaler in the specified project using the data +// included in the request. This method supports PATCH semantics and +// uses the JSON merge patch format and processing rules. +func (r *AutoscalersService) Patch(project string, zone string, autoscaler *Autoscaler) *AutoscalersPatchCall { + c := &AutoscalersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.backendBucket = backendBucket - c.backendbucket = backendbucket + c.zone = zone + c.autoscaler = autoscaler + return c +} + +// Autoscaler sets the optional parameter "autoscaler": Name of the +// autoscaler to patch. +func (c *AutoscalersPatchCall) Autoscaler(autoscaler string) *AutoscalersPatchCall { + c.urlParams_.Set("autoscaler", autoscaler) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendBucketsPatchCall) Fields(s ...googleapi.Field) *BackendBucketsPatchCall { +func (c *AutoscalersPatchCall) Fields(s ...googleapi.Field) *AutoscalersPatchCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -16326,52 +17736,52 @@ func (c *BackendBucketsPatchCall) Fields(s ...googleapi.Field) *BackendBucketsPa // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendBucketsPatchCall) Context(ctx context.Context) *BackendBucketsPatchCall { +func (c *AutoscalersPatchCall) Context(ctx context.Context) *AutoscalersPatchCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendBucketsPatchCall) Header() http.Header { +func (c *AutoscalersPatchCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendBucketsPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *AutoscalersPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("PATCH", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "backendBucket": c.backendBucket, + "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendBuckets.patch" call. +// Do executes the "compute.autoscalers.patch" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *BackendBucketsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *AutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -16402,19 +17812,18 @@ func (c *BackendBucketsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports patch semantics.", + // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", - // "id": "compute.backendBuckets.patch", + // "id": "compute.autoscalers.patch", // "parameterOrder": [ // "project", - // "backendBucket" + // "zone" // ], // "parameters": { - // "backendBucket": { - // "description": "Name of the BackendBucket resource to patch.", - // "location": "path", + // "autoscaler": { + // "description": "Name of the autoscaler to patch.", + // "location": "query", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, // "type": "string" // }, // "project": { @@ -16423,11 +17832,18 @@ func (c *BackendBucketsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "Name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/backendBuckets/{backendBucket}", + // "path": "{project}/zones/{zone}/autoscalers", // "request": { - // "$ref": "BackendBucket" + // "$ref": "Autoscaler" // }, // "response": { // "$ref": "Operation" @@ -16441,32 +17857,39 @@ func (c *BackendBucketsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.backendBuckets.update": +// method id "compute.autoscalers.update": -type BackendBucketsUpdateCall struct { - s *Service - project string - backendBucket string - backendbucket *BackendBucket - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type AutoscalersUpdateCall struct { + s *Service + project string + zone string + autoscaler *Autoscaler + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Update: Updates the specified BackendBucket resource with the data +// Update: Updates an autoscaler in the specified project using the data // included in the request. -func (r *BackendBucketsService) Update(project string, backendBucket string, backendbucket *BackendBucket) *BackendBucketsUpdateCall { - c := &BackendBucketsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +func (r *AutoscalersService) Update(project string, zone string, autoscaler *Autoscaler) *AutoscalersUpdateCall { + c := &AutoscalersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.backendBucket = backendBucket - c.backendbucket = backendbucket + c.zone = zone + c.autoscaler = autoscaler + return c +} + +// Autoscaler sets the optional parameter "autoscaler": Name of the +// autoscaler to update. +func (c *AutoscalersUpdateCall) Autoscaler(autoscaler string) *AutoscalersUpdateCall { + c.urlParams_.Set("autoscaler", autoscaler) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendBucketsUpdateCall) Fields(s ...googleapi.Field) *BackendBucketsUpdateCall { +func (c *AutoscalersUpdateCall) Fields(s ...googleapi.Field) *AutoscalersUpdateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -16474,52 +17897,52 @@ func (c *BackendBucketsUpdateCall) Fields(s ...googleapi.Field) *BackendBucketsU // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendBucketsUpdateCall) Context(ctx context.Context) *BackendBucketsUpdateCall { +func (c *AutoscalersUpdateCall) Context(ctx context.Context) *AutoscalersUpdateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendBucketsUpdateCall) Header() http.Header { +func (c *AutoscalersUpdateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendBucketsUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *AutoscalersUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("PUT", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "backendBucket": c.backendBucket, + "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendBuckets.update" call. +// Do executes the "compute.autoscalers.update" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *BackendBucketsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *AutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -16550,19 +17973,18 @@ func (c *BackendBucketsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Updates the specified BackendBucket resource with the data included in the request.", + // "description": "Updates an autoscaler in the specified project using the data included in the request.", // "httpMethod": "PUT", - // "id": "compute.backendBuckets.update", + // "id": "compute.autoscalers.update", // "parameterOrder": [ // "project", - // "backendBucket" + // "zone" // ], // "parameters": { - // "backendBucket": { - // "description": "Name of the BackendBucket resource to update.", - // "location": "path", + // "autoscaler": { + // "description": "Name of the autoscaler to update.", + // "location": "query", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, // "type": "string" // }, // "project": { @@ -16571,11 +17993,18 @@ func (c *BackendBucketsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "Name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/backendBuckets/{backendBucket}", + // "path": "{project}/zones/{zone}/autoscalers", // "request": { - // "$ref": "BackendBucket" + // "$ref": "Autoscaler" // }, // "response": { // "$ref": "Operation" @@ -16588,157 +18017,77 @@ func (c *BackendBucketsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.backendServices.aggregatedList": +// method id "compute.backendBuckets.delete": -type BackendServicesAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type BackendBucketsDeleteCall struct { + s *Service + project string + backendBucket string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves the list of all BackendService resources, -// regional and global, available to the specified project. -func (r *BackendServicesService) AggregatedList(project string) *BackendServicesAggregatedListCall { - c := &BackendServicesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified BackendBucket resource. +func (r *BackendBucketsService) Delete(project string, backendBucket string) *BackendBucketsDeleteCall { + c := &BackendBucketsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *BackendServicesAggregatedListCall) Filter(filter string) *BackendServicesAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *BackendServicesAggregatedListCall) MaxResults(maxResults int64) *BackendServicesAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *BackendServicesAggregatedListCall) OrderBy(orderBy string) *BackendServicesAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *BackendServicesAggregatedListCall) PageToken(pageToken string) *BackendServicesAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) + c.backendBucket = backendBucket return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendServicesAggregatedListCall) Fields(s ...googleapi.Field) *BackendServicesAggregatedListCall { +func (c *BackendBucketsDeleteCall) Fields(s ...googleapi.Field) *BackendBucketsDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *BackendServicesAggregatedListCall) IfNoneMatch(entityTag string) *BackendServicesAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendServicesAggregatedListCall) Context(ctx context.Context) *BackendServicesAggregatedListCall { +func (c *BackendBucketsDeleteCall) Context(ctx context.Context) *BackendBucketsDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendServicesAggregatedListCall) Header() http.Header { +func (c *BackendBucketsDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendServicesAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendBucketsDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/backendServices") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "backendBucket": c.backendBucket, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendServices.aggregatedList" call. -// Exactly one of *BackendServiceAggregatedList or error will be -// non-nil. Any non-2xx status code is an error. Response headers are in -// either *BackendServiceAggregatedList.ServerResponse.Header or (if a -// response was returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *BackendServicesAggregatedListCall) Do(opts ...googleapi.CallOption) (*BackendServiceAggregatedList, error) { +// Do executes the "compute.backendBuckets.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *BackendBucketsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -16757,7 +18106,7 @@ func (c *BackendServicesAggregatedListCall) Do(opts ...googleapi.CallOption) (*B if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &BackendServiceAggregatedList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -16769,150 +18118,127 @@ func (c *BackendServicesAggregatedListCall) Do(opts ...googleapi.CallOption) (*B } return ret, nil // { - // "description": "Retrieves the list of all BackendService resources, regional and global, available to the specified project.", - // "httpMethod": "GET", - // "id": "compute.backendServices.aggregatedList", + // "description": "Deletes the specified BackendBucket resource.", + // "httpMethod": "DELETE", + // "id": "compute.backendBuckets.delete", // "parameterOrder": [ - // "project" + // "project", + // "backendBucket" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "backendBucket": { + // "description": "Name of the BackendBucket resource to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { - // "description": "Name of the project scoping this request.", + // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" // } // }, - // "path": "{project}/aggregated/backendServices", + // "path": "{project}/global/backendBuckets/{backendBucket}", // "response": { - // "$ref": "BackendServiceAggregatedList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *BackendServicesAggregatedListCall) Pages(ctx context.Context, f func(*BackendServiceAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.backendServices.delete": +// method id "compute.backendBuckets.get": -type BackendServicesDeleteCall struct { - s *Service - project string - backendService string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type BackendBucketsGetCall struct { + s *Service + project string + backendBucket string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified BackendService resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/delete -func (r *BackendServicesService) Delete(project string, backendService string) *BackendServicesDeleteCall { - c := &BackendServicesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified BackendBucket resource. Get a list of +// available backend buckets by making a list() request. +func (r *BackendBucketsService) Get(project string, backendBucket string) *BackendBucketsGetCall { + c := &BackendBucketsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.backendService = backendService + c.backendBucket = backendBucket return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendServicesDeleteCall) Fields(s ...googleapi.Field) *BackendServicesDeleteCall { +func (c *BackendBucketsGetCall) Fields(s ...googleapi.Field) *BackendBucketsGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *BackendBucketsGetCall) IfNoneMatch(entityTag string) *BackendBucketsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendServicesDeleteCall) Context(ctx context.Context) *BackendServicesDeleteCall { +func (c *BackendBucketsGetCall) Context(ctx context.Context) *BackendBucketsGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendServicesDeleteCall) Header() http.Header { +func (c *BackendBucketsGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendServicesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendBucketsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "backendService": c.backendService, + "project": c.project, + "backendBucket": c.backendBucket, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendServices.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.backendBuckets.get" call. +// Exactly one of *BackendBucket or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *BackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// *BackendBucket.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *BackendBucketsGetCall) Do(opts ...googleapi.CallOption) (*BackendBucket, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -16931,7 +18257,7 @@ func (c *BackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &BackendBucket{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -16943,16 +18269,16 @@ func (c *BackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Deletes the specified BackendService resource.", - // "httpMethod": "DELETE", - // "id": "compute.backendServices.delete", + // "description": "Returns the specified BackendBucket resource. Get a list of available backend buckets by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.backendBuckets.get", // "parameterOrder": [ // "project", - // "backendService" + // "backendBucket" // ], // "parameters": { - // "backendService": { - // "description": "Name of the BackendService resource to delete.", + // "backendBucket": { + // "description": "Name of the BackendBucket resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -16966,105 +18292,95 @@ func (c *BackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // } // }, - // "path": "{project}/global/backendServices/{backendService}", + // "path": "{project}/global/backendBuckets/{backendBucket}", // "response": { - // "$ref": "Operation" + // "$ref": "BackendBucket" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.backendServices.get": +// method id "compute.backendBuckets.insert": -type BackendServicesGetCall struct { - s *Service - project string - backendService string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type BackendBucketsInsertCall struct { + s *Service + project string + backendbucket *BackendBucket + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified BackendService resource. Get a list of -// available backend services by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/get -func (r *BackendServicesService) Get(project string, backendService string) *BackendServicesGetCall { - c := &BackendServicesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a BackendBucket resource in the specified project +// using the data included in the request. +func (r *BackendBucketsService) Insert(project string, backendbucket *BackendBucket) *BackendBucketsInsertCall { + c := &BackendBucketsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.backendService = backendService + c.backendbucket = backendbucket return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendServicesGetCall) Fields(s ...googleapi.Field) *BackendServicesGetCall { +func (c *BackendBucketsInsertCall) Fields(s ...googleapi.Field) *BackendBucketsInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *BackendServicesGetCall) IfNoneMatch(entityTag string) *BackendServicesGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendServicesGetCall) Context(ctx context.Context) *BackendServicesGetCall { +func (c *BackendBucketsInsertCall) Context(ctx context.Context) *BackendBucketsInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendServicesGetCall) Header() http.Header { +func (c *BackendBucketsInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendServicesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendBucketsInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "backendService": c.backendService, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendServices.get" call. -// Exactly one of *BackendService or error will be non-nil. Any non-2xx +// Do executes the "compute.backendBuckets.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *BackendService.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *BackendServicesGetCall) Do(opts ...googleapi.CallOption) (*BackendService, error) { +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *BackendBucketsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -17083,7 +18399,7 @@ func (c *BackendServicesGetCall) Do(opts ...googleapi.CallOption) (*BackendServi if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &BackendService{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -17095,21 +18411,13 @@ func (c *BackendServicesGetCall) Do(opts ...googleapi.CallOption) (*BackendServi } return ret, nil // { - // "description": "Returns the specified BackendService resource. Get a list of available backend services by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.backendServices.get", + // "description": "Creates a BackendBucket resource in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.backendBuckets.insert", // "parameterOrder": [ - // "project", - // "backendService" + // "project" // ], // "parameters": { - // "backendService": { - // "description": "Name of the BackendService resource to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -17118,99 +18426,171 @@ func (c *BackendServicesGetCall) Do(opts ...googleapi.CallOption) (*BackendServi // "type": "string" // } // }, - // "path": "{project}/global/backendServices/{backendService}", + // "path": "{project}/global/backendBuckets", + // "request": { + // "$ref": "BackendBucket" + // }, // "response": { - // "$ref": "BackendService" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.backendServices.getHealth": +// method id "compute.backendBuckets.list": -type BackendServicesGetHealthCall struct { - s *Service - project string - backendService string - resourcegroupreference *ResourceGroupReference - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type BackendBucketsListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// GetHealth: Gets the most recent health check results for this -// BackendService. -// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/getHealth -func (r *BackendServicesService) GetHealth(project string, backendService string, resourcegroupreference *ResourceGroupReference) *BackendServicesGetHealthCall { - c := &BackendServicesGetHealthCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of BackendBucket resources available to the +// specified project. +func (r *BackendBucketsService) List(project string) *BackendBucketsListCall { + c := &BackendBucketsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.backendService = backendService - c.resourcegroupreference = resourcegroupreference + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *BackendBucketsListCall) Filter(filter string) *BackendBucketsListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *BackendBucketsListCall) MaxResults(maxResults int64) *BackendBucketsListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *BackendBucketsListCall) OrderBy(orderBy string) *BackendBucketsListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *BackendBucketsListCall) PageToken(pageToken string) *BackendBucketsListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendServicesGetHealthCall) Fields(s ...googleapi.Field) *BackendServicesGetHealthCall { +func (c *BackendBucketsListCall) Fields(s ...googleapi.Field) *BackendBucketsListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *BackendBucketsListCall) IfNoneMatch(entityTag string) *BackendBucketsListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendServicesGetHealthCall) Context(ctx context.Context) *BackendServicesGetHealthCall { +func (c *BackendBucketsListCall) Context(ctx context.Context) *BackendBucketsListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendServicesGetHealthCall) Header() http.Header { +func (c *BackendBucketsListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendServicesGetHealthCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendBucketsListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}/getHealth") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "backendService": c.backendService, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendServices.getHealth" call. -// Exactly one of *BackendServiceGroupHealth or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *BackendServiceGroupHealth.ServerResponse.Header or (if a response -// was returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.backendBuckets.list" call. +// Exactly one of *BackendBucketList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *BackendBucketList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *BackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (*BackendServiceGroupHealth, error) { +func (c *BackendBucketsListCall) Do(opts ...googleapi.CallOption) (*BackendBucketList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -17229,7 +18609,7 @@ func (c *BackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (*Backen if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &BackendServiceGroupHealth{ + ret := &BackendBucketList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -17241,34 +18621,217 @@ func (c *BackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (*Backen } return ret, nil // { - // "description": "Gets the most recent health check results for this BackendService.", - // "httpMethod": "POST", - // "id": "compute.backendServices.getHealth", + // "description": "Retrieves the list of BackendBucket resources available to the specified project.", + // "httpMethod": "GET", + // "id": "compute.backendBuckets.list", // "parameterOrder": [ - // "project", - // "backendService" + // "project" // ], // "parameters": { - // "backendService": { - // "description": "Name of the BackendService resource to which the queried instance belongs.", - // "location": "path", + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/backendBuckets", + // "response": { + // "$ref": "BackendBucketList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *BackendBucketsListCall) Pages(ctx context.Context, f func(*BackendBucketList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.backendBuckets.patch": + +type BackendBucketsPatchCall struct { + s *Service + project string + backendBucket string + backendbucket *BackendBucket + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates the specified BackendBucket resource with the data +// included in the request. This method supports PATCH semantics and +// uses the JSON merge patch format and processing rules. +func (r *BackendBucketsService) Patch(project string, backendBucket string, backendbucket *BackendBucket) *BackendBucketsPatchCall { + c := &BackendBucketsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.backendBucket = backendBucket + c.backendbucket = backendbucket + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *BackendBucketsPatchCall) Fields(s ...googleapi.Field) *BackendBucketsPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *BackendBucketsPatchCall) Context(ctx context.Context) *BackendBucketsPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *BackendBucketsPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *BackendBucketsPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("PATCH", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "backendBucket": c.backendBucket, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.backendBuckets.patch" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *BackendBucketsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates the specified BackendBucket resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", + // "httpMethod": "PATCH", + // "id": "compute.backendBuckets.patch", + // "parameterOrder": [ + // "project", + // "backendBucket" + // ], + // "parameters": { + // "backendBucket": { + // "description": "Name of the BackendBucket resource to patch.", + // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, // "project": { + // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/backendServices/{backendService}/getHealth", + // "path": "{project}/global/backendBuckets/{backendBucket}", // "request": { - // "$ref": "ResourceGroupReference" + // "$ref": "BackendBucket" // }, // "response": { - // "$ref": "BackendServiceGroupHealth" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -17279,33 +18842,32 @@ func (c *BackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (*Backen } -// method id "compute.backendServices.insert": +// method id "compute.backendBuckets.update": -type BackendServicesInsertCall struct { - s *Service - project string - backendservice *BackendService - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type BackendBucketsUpdateCall struct { + s *Service + project string + backendBucket string + backendbucket *BackendBucket + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates a BackendService resource in the specified project -// using the data included in the request. There are several -// restrictions and guidelines to keep in mind when creating a backend -// service. Read Restrictions and Guidelines for more information. -// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/insert -func (r *BackendServicesService) Insert(project string, backendservice *BackendService) *BackendServicesInsertCall { - c := &BackendServicesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Update: Updates the specified BackendBucket resource with the data +// included in the request. +func (r *BackendBucketsService) Update(project string, backendBucket string, backendbucket *BackendBucket) *BackendBucketsUpdateCall { + c := &BackendBucketsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.backendservice = backendservice + c.backendBucket = backendBucket + c.backendbucket = backendbucket return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendServicesInsertCall) Fields(s ...googleapi.Field) *BackendServicesInsertCall { +func (c *BackendBucketsUpdateCall) Fields(s ...googleapi.Field) *BackendBucketsUpdateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -17313,51 +18875,52 @@ func (c *BackendServicesInsertCall) Fields(s ...googleapi.Field) *BackendService // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendServicesInsertCall) Context(ctx context.Context) *BackendServicesInsertCall { +func (c *BackendBucketsUpdateCall) Context(ctx context.Context) *BackendBucketsUpdateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendServicesInsertCall) Header() http.Header { +func (c *BackendBucketsUpdateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendServicesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendBucketsUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("PUT", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "backendBucket": c.backendBucket, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendServices.insert" call. +// Do executes the "compute.backendBuckets.update" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *BackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *BackendBucketsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -17388,13 +18951,21 @@ func (c *BackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Creates a BackendService resource in the specified project using the data included in the request. There are several restrictions and guidelines to keep in mind when creating a backend service. Read Restrictions and Guidelines for more information.", - // "httpMethod": "POST", - // "id": "compute.backendServices.insert", + // "description": "Updates the specified BackendBucket resource with the data included in the request.", + // "httpMethod": "PUT", + // "id": "compute.backendBuckets.update", // "parameterOrder": [ - // "project" + // "project", + // "backendBucket" // ], // "parameters": { + // "backendBucket": { + // "description": "Name of the BackendBucket resource to update.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -17403,9 +18974,9 @@ func (c *BackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // } // }, - // "path": "{project}/global/backendServices", + // "path": "{project}/global/backendBuckets/{backendBucket}", // "request": { - // "$ref": "BackendService" + // "$ref": "BackendBucket" // }, // "response": { // "$ref": "Operation" @@ -17418,9 +18989,9 @@ func (c *BackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Operation } -// method id "compute.backendServices.list": +// method id "compute.backendServices.aggregatedList": -type BackendServicesListCall struct { +type BackendServicesAggregatedListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -17429,19 +19000,17 @@ type BackendServicesListCall struct { header_ http.Header } -// List: Retrieves the list of BackendService resources available to the -// specified project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/list -func (r *BackendServicesService) List(project string) *BackendServicesListCall { - c := &BackendServicesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves the list of all BackendService resources, +// regional and global, available to the specified project. +func (r *BackendServicesService) AggregatedList(project string) *BackendServicesAggregatedListCall { + c := &BackendServicesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -17453,7 +19022,7 @@ func (r *BackendServicesService) List(project string) *BackendServicesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -17465,7 +19034,7 @@ func (r *BackendServicesService) List(project string) *BackendServicesListCall { // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *BackendServicesListCall) Filter(filter string) *BackendServicesListCall { +func (c *BackendServicesAggregatedListCall) Filter(filter string) *BackendServicesAggregatedListCall { c.urlParams_.Set("filter", filter) return c } @@ -17476,7 +19045,7 @@ func (c *BackendServicesListCall) Filter(filter string) *BackendServicesListCall // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *BackendServicesListCall) MaxResults(maxResults int64) *BackendServicesListCall { +func (c *BackendServicesAggregatedListCall) MaxResults(maxResults int64) *BackendServicesAggregatedListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -17493,7 +19062,7 @@ func (c *BackendServicesListCall) MaxResults(maxResults int64) *BackendServicesL // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *BackendServicesListCall) OrderBy(orderBy string) *BackendServicesListCall { +func (c *BackendServicesAggregatedListCall) OrderBy(orderBy string) *BackendServicesAggregatedListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -17501,7 +19070,7 @@ func (c *BackendServicesListCall) OrderBy(orderBy string) *BackendServicesListCa // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *BackendServicesListCall) PageToken(pageToken string) *BackendServicesListCall { +func (c *BackendServicesAggregatedListCall) PageToken(pageToken string) *BackendServicesAggregatedListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -17509,7 +19078,7 @@ func (c *BackendServicesListCall) PageToken(pageToken string) *BackendServicesLi // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendServicesListCall) Fields(s ...googleapi.Field) *BackendServicesListCall { +func (c *BackendServicesAggregatedListCall) Fields(s ...googleapi.Field) *BackendServicesAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -17519,7 +19088,7 @@ func (c *BackendServicesListCall) Fields(s ...googleapi.Field) *BackendServicesL // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *BackendServicesListCall) IfNoneMatch(entityTag string) *BackendServicesListCall { +func (c *BackendServicesAggregatedListCall) IfNoneMatch(entityTag string) *BackendServicesAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -17527,21 +19096,21 @@ func (c *BackendServicesListCall) IfNoneMatch(entityTag string) *BackendServices // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendServicesListCall) Context(ctx context.Context) *BackendServicesListCall { +func (c *BackendServicesAggregatedListCall) Context(ctx context.Context) *BackendServicesAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendServicesListCall) Header() http.Header { +func (c *BackendServicesAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendServicesListCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendServicesAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -17552,7 +19121,7 @@ func (c *BackendServicesListCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/backendServices") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -17562,14 +19131,14 @@ func (c *BackendServicesListCall) doRequest(alt string) (*http.Response, error) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendServices.list" call. -// Exactly one of *BackendServiceList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *BackendServiceList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.backendServices.aggregatedList" call. +// Exactly one of *BackendServiceAggregatedList or error will be +// non-nil. Any non-2xx status code is an error. Response headers are in +// either *BackendServiceAggregatedList.ServerResponse.Header or (if a +// response was returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *BackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServiceList, error) { +func (c *BackendServicesAggregatedListCall) Do(opts ...googleapi.CallOption) (*BackendServiceAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -17588,7 +19157,7 @@ func (c *BackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServ if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &BackendServiceList{ + ret := &BackendServiceAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -17600,15 +19169,15 @@ func (c *BackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServ } return ret, nil // { - // "description": "Retrieves the list of BackendService resources available to the specified project.", + // "description": "Retrieves the list of all BackendService resources, regional and global, available to the specified project.", // "httpMethod": "GET", - // "id": "compute.backendServices.list", + // "id": "compute.backendServices.aggregatedList", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -17631,16 +19200,16 @@ func (c *BackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServ // "type": "string" // }, // "project": { - // "description": "Project ID for this request.", + // "description": "Name of the project scoping this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/backendServices", + // "path": "{project}/aggregated/backendServices", // "response": { - // "$ref": "BackendServiceList" + // "$ref": "BackendServiceAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -17654,7 +19223,7 @@ func (c *BackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServ // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *BackendServicesListCall) Pages(ctx context.Context, f func(*BackendServiceList) error) error { +func (c *BackendServicesAggregatedListCall) Pages(ctx context.Context, f func(*BackendServiceAggregatedList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -17672,36 +19241,30 @@ func (c *BackendServicesListCall) Pages(ctx context.Context, f func(*BackendServ } } -// method id "compute.backendServices.patch": +// method id "compute.backendServices.delete": -type BackendServicesPatchCall struct { +type BackendServicesDeleteCall struct { s *Service project string backendService string - backendservice *BackendService urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Patch: Patches the specified BackendService resource with the data -// included in the request. There are several restrictions and -// guidelines to keep in mind when updating a backend service. Read -// Restrictions and Guidelines for more information. This method -// supports patch semantics. -// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/patch -func (r *BackendServicesService) Patch(project string, backendService string, backendservice *BackendService) *BackendServicesPatchCall { - c := &BackendServicesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified BackendService resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/delete +func (r *BackendServicesService) Delete(project string, backendService string) *BackendServicesDeleteCall { + c := &BackendServicesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.backendService = backendService - c.backendservice = backendservice return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendServicesPatchCall) Fields(s ...googleapi.Field) *BackendServicesPatchCall { +func (c *BackendServicesDeleteCall) Fields(s ...googleapi.Field) *BackendServicesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -17709,36 +19272,31 @@ func (c *BackendServicesPatchCall) Fields(s ...googleapi.Field) *BackendServices // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendServicesPatchCall) Context(ctx context.Context) *BackendServicesPatchCall { +func (c *BackendServicesDeleteCall) Context(ctx context.Context) *BackendServicesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendServicesPatchCall) Header() http.Header { +func (c *BackendServicesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendServicesPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendServicesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PATCH", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, @@ -17747,14 +19305,14 @@ func (c *BackendServicesPatchCall) doRequest(alt string) (*http.Response, error) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendServices.patch" call. +// Do executes the "compute.backendServices.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *BackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *BackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -17785,16 +19343,16 @@ func (c *BackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", - // "httpMethod": "PATCH", - // "id": "compute.backendServices.patch", + // "description": "Deletes the specified BackendService resource.", + // "httpMethod": "DELETE", + // "id": "compute.backendServices.delete", // "parameterOrder": [ // "project", // "backendService" // ], // "parameters": { // "backendService": { - // "description": "Name of the BackendService resource to patch.", + // "description": "Name of the BackendService resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -17809,87 +19367,88 @@ func (c *BackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, // } // }, // "path": "{project}/global/backendServices/{backendService}", - // "request": { - // "$ref": "BackendService" - // }, // "response": { // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.backendServices.update": +// method id "compute.backendServices.get": -type BackendServicesUpdateCall struct { +type BackendServicesGetCall struct { s *Service project string backendService string - backendservice *BackendService urlParams_ gensupport.URLParams + ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Update: Updates the specified BackendService resource with the data -// included in the request. There are several restrictions and -// guidelines to keep in mind when updating a backend service. Read -// Restrictions and Guidelines for more information. -// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/update -func (r *BackendServicesService) Update(project string, backendService string, backendservice *BackendService) *BackendServicesUpdateCall { - c := &BackendServicesUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified BackendService resource. Get a list of +// available backend services by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/get +func (r *BackendServicesService) Get(project string, backendService string) *BackendServicesGetCall { + c := &BackendServicesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.backendService = backendService - c.backendservice = backendservice return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *BackendServicesUpdateCall) Fields(s ...googleapi.Field) *BackendServicesUpdateCall { +func (c *BackendServicesGetCall) Fields(s ...googleapi.Field) *BackendServicesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *BackendServicesGetCall) IfNoneMatch(entityTag string) *BackendServicesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *BackendServicesUpdateCall) Context(ctx context.Context) *BackendServicesUpdateCall { +func (c *BackendServicesGetCall) Context(ctx context.Context) *BackendServicesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *BackendServicesUpdateCall) Header() http.Header { +func (c *BackendServicesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *BackendServicesUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendServicesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PUT", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, @@ -17898,14 +19457,14 @@ func (c *BackendServicesUpdateCall) doRequest(alt string) (*http.Response, error return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.backendServices.update" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.backendServices.get" call. +// Exactly one of *BackendService or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *BackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// *BackendService.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *BackendServicesGetCall) Do(opts ...googleapi.CallOption) (*BackendService, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -17924,7 +19483,7 @@ func (c *BackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Operation if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &BackendService{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -17936,16 +19495,16 @@ func (c *BackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Updates the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information.", - // "httpMethod": "PUT", - // "id": "compute.backendServices.update", + // "description": "Returns the specified BackendService resource. Get a list of available backend services by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.backendServices.get", // "parameterOrder": [ // "project", // "backendService" // ], // "parameters": { // "backendService": { - // "description": "Name of the BackendService resource to update.", + // "description": "Name of the BackendService resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -17960,171 +19519,98 @@ func (c *BackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Operation // } // }, // "path": "{project}/global/backendServices/{backendService}", - // "request": { - // "$ref": "BackendService" - // }, // "response": { - // "$ref": "Operation" + // "$ref": "BackendService" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.diskTypes.aggregatedList": +// method id "compute.backendServices.getHealth": -type DiskTypesAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type BackendServicesGetHealthCall struct { + s *Service + project string + backendService string + resourcegroupreference *ResourceGroupReference + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves an aggregated list of disk types. -// For details, see https://cloud.google.com/compute/docs/reference/latest/diskTypes/aggregatedList -func (r *DiskTypesService) AggregatedList(project string) *DiskTypesAggregatedListCall { - c := &DiskTypesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// GetHealth: Gets the most recent health check results for this +// BackendService. +// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/getHealth +func (r *BackendServicesService) GetHealth(project string, backendService string, resourcegroupreference *ResourceGroupReference) *BackendServicesGetHealthCall { + c := &BackendServicesGetHealthCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.backendService = backendService + c.resourcegroupreference = resourcegroupreference return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *DiskTypesAggregatedListCall) Filter(filter string) *DiskTypesAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *DiskTypesAggregatedListCall) MaxResults(maxResults int64) *DiskTypesAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *DiskTypesAggregatedListCall) OrderBy(orderBy string) *DiskTypesAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *DiskTypesAggregatedListCall) PageToken(pageToken string) *DiskTypesAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *DiskTypesAggregatedListCall) Fields(s ...googleapi.Field) *DiskTypesAggregatedListCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *DiskTypesAggregatedListCall) IfNoneMatch(entityTag string) *DiskTypesAggregatedListCall { - c.ifNoneMatch_ = entityTag +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *BackendServicesGetHealthCall) Fields(s ...googleapi.Field) *BackendServicesGetHealthCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DiskTypesAggregatedListCall) Context(ctx context.Context) *DiskTypesAggregatedListCall { +func (c *BackendServicesGetHealthCall) Context(ctx context.Context) *BackendServicesGetHealthCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DiskTypesAggregatedListCall) Header() http.Header { +func (c *BackendServicesGetHealthCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DiskTypesAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendServicesGetHealthCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/diskTypes") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}/getHealth") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "backendService": c.backendService, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.diskTypes.aggregatedList" call. -// Exactly one of *DiskTypeAggregatedList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *DiskTypeAggregatedList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.backendServices.getHealth" call. +// Exactly one of *BackendServiceGroupHealth or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *BackendServiceGroupHealth.ServerResponse.Header or (if a response +// was returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *DiskTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskTypeAggregatedList, error) { +func (c *BackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (*BackendServiceGroupHealth, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -18143,7 +19629,7 @@ func (c *DiskTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskTyp if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &DiskTypeAggregatedList{ + ret := &BackendServiceGroupHealth{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -18155,47 +19641,34 @@ func (c *DiskTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskTyp } return ret, nil // { - // "description": "Retrieves an aggregated list of disk types.", - // "httpMethod": "GET", - // "id": "compute.diskTypes.aggregatedList", + // "description": "Gets the most recent health check results for this BackendService.", + // "httpMethod": "POST", + // "id": "compute.backendServices.getHealth", // "parameterOrder": [ - // "project" + // "project", + // "backendService" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "backendService": { + // "description": "Name of the BackendService resource to which the queried instance belongs.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { - // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" // } // }, - // "path": "{project}/aggregated/diskTypes", + // "path": "{project}/global/backendServices/{backendService}/getHealth", + // "request": { + // "$ref": "ResourceGroupReference" + // }, // "response": { - // "$ref": "DiskTypeAggregatedList" + // "$ref": "BackendServiceGroupHealth" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -18206,117 +19679,85 @@ func (c *DiskTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskTyp } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *DiskTypesAggregatedListCall) Pages(ctx context.Context, f func(*DiskTypeAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.diskTypes.get": +// method id "compute.backendServices.insert": -type DiskTypesGetCall struct { - s *Service - project string - zone string - diskType string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type BackendServicesInsertCall struct { + s *Service + project string + backendservice *BackendService + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified disk type. Get a list of available disk -// types by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/diskTypes/get -func (r *DiskTypesService) Get(project string, zone string, diskType string) *DiskTypesGetCall { - c := &DiskTypesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a BackendService resource in the specified project +// using the data included in the request. There are several +// restrictions and guidelines to keep in mind when creating a backend +// service. Read Restrictions and Guidelines for more information. +// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/insert +func (r *BackendServicesService) Insert(project string, backendservice *BackendService) *BackendServicesInsertCall { + c := &BackendServicesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.diskType = diskType + c.backendservice = backendservice return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *DiskTypesGetCall) Fields(s ...googleapi.Field) *DiskTypesGetCall { +func (c *BackendServicesInsertCall) Fields(s ...googleapi.Field) *BackendServicesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *DiskTypesGetCall) IfNoneMatch(entityTag string) *DiskTypesGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DiskTypesGetCall) Context(ctx context.Context) *DiskTypesGetCall { +func (c *BackendServicesInsertCall) Context(ctx context.Context) *BackendServicesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DiskTypesGetCall) Header() http.Header { +func (c *BackendServicesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DiskTypesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendServicesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/diskTypes/{diskType}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "diskType": c.diskType, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.diskTypes.get" call. -// Exactly one of *DiskType or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *DiskType.ServerResponse.Header or (if a response was returned at +// Do executes the "compute.backendServices.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *DiskTypesGetCall) Do(opts ...googleapi.CallOption) (*DiskType, error) { +func (c *BackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -18335,7 +19776,7 @@ func (c *DiskTypesGetCall) Do(opts ...googleapi.CallOption) (*DiskType, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &DiskType{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -18347,76 +19788,59 @@ func (c *DiskTypesGetCall) Do(opts ...googleapi.CallOption) (*DiskType, error) { } return ret, nil // { - // "description": "Returns the specified disk type. Get a list of available disk types by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.diskTypes.get", + // "description": "Creates a BackendService resource in the specified project using the data included in the request. There are several restrictions and guidelines to keep in mind when creating a backend service. Read Restrictions and Guidelines for more information.", + // "httpMethod": "POST", + // "id": "compute.backendServices.insert", // "parameterOrder": [ - // "project", - // "zone", - // "diskType" + // "project" // ], // "parameters": { - // "diskType": { - // "description": "Name of the disk type to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/diskTypes/{diskType}", + // "path": "{project}/global/backendServices", + // "request": { + // "$ref": "BackendService" + // }, // "response": { - // "$ref": "DiskType" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.diskTypes.list": +// method id "compute.backendServices.list": -type DiskTypesListCall struct { +type BackendServicesListCall struct { s *Service project string - zone string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of disk types available to the specified -// project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/diskTypes/list -func (r *DiskTypesService) List(project string, zone string) *DiskTypesListCall { - c := &DiskTypesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of BackendService resources available to the +// specified project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/list +func (r *BackendServicesService) List(project string) *BackendServicesListCall { + c := &BackendServicesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -18428,7 +19852,7 @@ func (r *DiskTypesService) List(project string, zone string) *DiskTypesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -18440,7 +19864,7 @@ func (r *DiskTypesService) List(project string, zone string) *DiskTypesListCall // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *DiskTypesListCall) Filter(filter string) *DiskTypesListCall { +func (c *BackendServicesListCall) Filter(filter string) *BackendServicesListCall { c.urlParams_.Set("filter", filter) return c } @@ -18451,7 +19875,7 @@ func (c *DiskTypesListCall) Filter(filter string) *DiskTypesListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *DiskTypesListCall) MaxResults(maxResults int64) *DiskTypesListCall { +func (c *BackendServicesListCall) MaxResults(maxResults int64) *BackendServicesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -18468,7 +19892,7 @@ func (c *DiskTypesListCall) MaxResults(maxResults int64) *DiskTypesListCall { // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *DiskTypesListCall) OrderBy(orderBy string) *DiskTypesListCall { +func (c *BackendServicesListCall) OrderBy(orderBy string) *BackendServicesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -18476,7 +19900,7 @@ func (c *DiskTypesListCall) OrderBy(orderBy string) *DiskTypesListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *DiskTypesListCall) PageToken(pageToken string) *DiskTypesListCall { +func (c *BackendServicesListCall) PageToken(pageToken string) *BackendServicesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -18484,7 +19908,7 @@ func (c *DiskTypesListCall) PageToken(pageToken string) *DiskTypesListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *DiskTypesListCall) Fields(s ...googleapi.Field) *DiskTypesListCall { +func (c *BackendServicesListCall) Fields(s ...googleapi.Field) *BackendServicesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -18494,7 +19918,7 @@ func (c *DiskTypesListCall) Fields(s ...googleapi.Field) *DiskTypesListCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *DiskTypesListCall) IfNoneMatch(entityTag string) *DiskTypesListCall { +func (c *BackendServicesListCall) IfNoneMatch(entityTag string) *BackendServicesListCall { c.ifNoneMatch_ = entityTag return c } @@ -18502,21 +19926,21 @@ func (c *DiskTypesListCall) IfNoneMatch(entityTag string) *DiskTypesListCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DiskTypesListCall) Context(ctx context.Context) *DiskTypesListCall { +func (c *BackendServicesListCall) Context(ctx context.Context) *BackendServicesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DiskTypesListCall) Header() http.Header { +func (c *BackendServicesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DiskTypesListCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendServicesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -18527,25 +19951,24 @@ func (c *DiskTypesListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/diskTypes") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.diskTypes.list" call. -// Exactly one of *DiskTypeList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *DiskTypeList.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *DiskTypesListCall) Do(opts ...googleapi.CallOption) (*DiskTypeList, error) { +// Do executes the "compute.backendServices.list" call. +// Exactly one of *BackendServiceList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *BackendServiceList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *BackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServiceList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -18564,7 +19987,7 @@ func (c *DiskTypesListCall) Do(opts ...googleapi.CallOption) (*DiskTypeList, err if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &DiskTypeList{ + ret := &BackendServiceList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -18576,16 +19999,15 @@ func (c *DiskTypesListCall) Do(opts ...googleapi.CallOption) (*DiskTypeList, err } return ret, nil // { - // "description": "Retrieves a list of disk types available to the specified project.", + // "description": "Retrieves the list of BackendService resources available to the specified project.", // "httpMethod": "GET", - // "id": "compute.diskTypes.list", + // "id": "compute.backendServices.list", // "parameterOrder": [ - // "project", - // "zone" + // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -18613,18 +20035,11 @@ func (c *DiskTypesListCall) Do(opts ...googleapi.CallOption) (*DiskTypeList, err // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/diskTypes", + // "path": "{project}/global/backendServices", // "response": { - // "$ref": "DiskTypeList" + // "$ref": "BackendServiceList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -18638,7 +20053,7 @@ func (c *DiskTypesListCall) Do(opts ...googleapi.CallOption) (*DiskTypeList, err // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *DiskTypesListCall) Pages(ctx context.Context, f func(*DiskTypeList) error) error { +func (c *BackendServicesListCall) Pages(ctx context.Context, f func(*BackendServiceList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -18656,157 +20071,90 @@ func (c *DiskTypesListCall) Pages(ctx context.Context, f func(*DiskTypeList) err } } -// method id "compute.disks.aggregatedList": +// method id "compute.backendServices.patch": -type DisksAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type BackendServicesPatchCall struct { + s *Service + project string + backendService string + backendservice *BackendService + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves an aggregated list of persistent disks. -// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/aggregatedList -func (r *DisksService) AggregatedList(project string) *DisksAggregatedListCall { - c := &DisksAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Patch: Patches the specified BackendService resource with the data +// included in the request. There are several restrictions and +// guidelines to keep in mind when updating a backend service. Read +// Restrictions and Guidelines for more information. This method +// supports PATCH semantics and uses the JSON merge patch format and +// processing rules. +// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/patch +func (r *BackendServicesService) Patch(project string, backendService string, backendservice *BackendService) *BackendServicesPatchCall { + c := &BackendServicesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *DisksAggregatedListCall) Filter(filter string) *DisksAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *DisksAggregatedListCall) MaxResults(maxResults int64) *DisksAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *DisksAggregatedListCall) OrderBy(orderBy string) *DisksAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *DisksAggregatedListCall) PageToken(pageToken string) *DisksAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) + c.backendService = backendService + c.backendservice = backendservice return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *DisksAggregatedListCall) Fields(s ...googleapi.Field) *DisksAggregatedListCall { +func (c *BackendServicesPatchCall) Fields(s ...googleapi.Field) *BackendServicesPatchCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *DisksAggregatedListCall) IfNoneMatch(entityTag string) *DisksAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DisksAggregatedListCall) Context(ctx context.Context) *DisksAggregatedListCall { +func (c *BackendServicesPatchCall) Context(ctx context.Context) *BackendServicesPatchCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DisksAggregatedListCall) Header() http.Header { +func (c *BackendServicesPatchCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DisksAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendServicesPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/disks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("PATCH", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "backendService": c.backendService, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.disks.aggregatedList" call. -// Exactly one of *DiskAggregatedList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *DiskAggregatedList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *DisksAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskAggregatedList, error) { +// Do executes the "compute.backendServices.patch" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *BackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -18825,7 +20173,7 @@ func (c *DisksAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskAggrega if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &DiskAggregatedList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -18837,34 +20185,19 @@ func (c *DisksAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskAggrega } return ret, nil // { - // "description": "Retrieves an aggregated list of persistent disks.", - // "httpMethod": "GET", - // "id": "compute.disks.aggregatedList", + // "description": "Patches the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", + // "httpMethod": "PATCH", + // "id": "compute.backendServices.patch", // "parameterOrder": [ - // "project" + // "project", + // "backendService" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "backendService": { + // "description": "Name of the BackendService resource to patch.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { @@ -18875,9 +20208,12 @@ func (c *DisksAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskAggrega // "type": "string" // } // }, - // "path": "{project}/aggregated/disks", - // "response": { - // "$ref": "DiskAggregatedList" + // "path": "{project}/global/backendServices/{backendService}", + // "request": { + // "$ref": "BackendService" + // }, + // "response": { + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -18888,61 +20224,35 @@ func (c *DisksAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskAggrega } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *DisksAggregatedListCall) Pages(ctx context.Context, f func(*DiskAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.disks.createSnapshot": +// method id "compute.backendServices.update": -type DisksCreateSnapshotCall struct { - s *Service - project string - zone string - disk string - snapshot *Snapshot - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type BackendServicesUpdateCall struct { + s *Service + project string + backendService string + backendservice *BackendService + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// CreateSnapshot: Creates a snapshot of a specified persistent disk. -// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/createSnapshot -func (r *DisksService) CreateSnapshot(project string, zone string, disk string, snapshot *Snapshot) *DisksCreateSnapshotCall { - c := &DisksCreateSnapshotCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Update: Updates the specified BackendService resource with the data +// included in the request. There are several restrictions and +// guidelines to keep in mind when updating a backend service. Read +// Restrictions and Guidelines for more information. +// For details, see https://cloud.google.com/compute/docs/reference/latest/backendServices/update +func (r *BackendServicesService) Update(project string, backendService string, backendservice *BackendService) *BackendServicesUpdateCall { + c := &BackendServicesUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.disk = disk - c.snapshot = snapshot - return c -} - -// GuestFlush sets the optional parameter "guestFlush": -func (c *DisksCreateSnapshotCall) GuestFlush(guestFlush bool) *DisksCreateSnapshotCall { - c.urlParams_.Set("guestFlush", fmt.Sprint(guestFlush)) + c.backendService = backendService + c.backendservice = backendservice return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *DisksCreateSnapshotCall) Fields(s ...googleapi.Field) *DisksCreateSnapshotCall { +func (c *BackendServicesUpdateCall) Fields(s ...googleapi.Field) *BackendServicesUpdateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -18950,53 +20260,52 @@ func (c *DisksCreateSnapshotCall) Fields(s ...googleapi.Field) *DisksCreateSnaps // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DisksCreateSnapshotCall) Context(ctx context.Context) *DisksCreateSnapshotCall { +func (c *BackendServicesUpdateCall) Context(ctx context.Context) *BackendServicesUpdateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DisksCreateSnapshotCall) Header() http.Header { +func (c *BackendServicesUpdateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DisksCreateSnapshotCall) doRequest(alt string) (*http.Response, error) { +func (c *BackendServicesUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.snapshot) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}/createSnapshot") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("PUT", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "disk": c.disk, + "project": c.project, + "backendService": c.backendService, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.disks.createSnapshot" call. +// Do executes the "compute.backendServices.update" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *DisksCreateSnapshotCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *BackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -19027,44 +20336,32 @@ func (c *DisksCreateSnapshotCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Creates a snapshot of a specified persistent disk.", - // "httpMethod": "POST", - // "id": "compute.disks.createSnapshot", + // "description": "Updates the specified BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information.", + // "httpMethod": "PUT", + // "id": "compute.backendServices.update", // "parameterOrder": [ // "project", - // "zone", - // "disk" + // "backendService" // ], // "parameters": { - // "disk": { - // "description": "Name of the persistent disk to snapshot.", + // "backendService": { + // "description": "Name of the BackendService resource to update.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, - // "guestFlush": { - // "location": "query", - // "type": "boolean" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/disks/{disk}/createSnapshot", + // "path": "{project}/global/backendServices/{backendService}", // "request": { - // "$ref": "Snapshot" + // "$ref": "BackendService" // }, // "response": { // "$ref": "Operation" @@ -19077,84 +20374,156 @@ func (c *DisksCreateSnapshotCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.disks.delete": +// method id "compute.diskTypes.aggregatedList": -type DisksDeleteCall struct { - s *Service - project string - zone string - disk string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type DiskTypesAggregatedListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified persistent disk. Deleting a disk -// removes its data permanently and is irreversible. However, deleting a -// disk does not delete any snapshots previously made from the disk. You -// must separately delete snapshots. -// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/delete -func (r *DisksService) Delete(project string, zone string, disk string) *DisksDeleteCall { - c := &DisksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves an aggregated list of disk types. +// For details, see https://cloud.google.com/compute/docs/reference/latest/diskTypes/aggregatedList +func (r *DiskTypesService) AggregatedList(project string) *DiskTypesAggregatedListCall { + c := &DiskTypesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.disk = disk + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *DiskTypesAggregatedListCall) Filter(filter string) *DiskTypesAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *DiskTypesAggregatedListCall) MaxResults(maxResults int64) *DiskTypesAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *DiskTypesAggregatedListCall) OrderBy(orderBy string) *DiskTypesAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *DiskTypesAggregatedListCall) PageToken(pageToken string) *DiskTypesAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *DisksDeleteCall) Fields(s ...googleapi.Field) *DisksDeleteCall { +func (c *DiskTypesAggregatedListCall) Fields(s ...googleapi.Field) *DiskTypesAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *DiskTypesAggregatedListCall) IfNoneMatch(entityTag string) *DiskTypesAggregatedListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DisksDeleteCall) Context(ctx context.Context) *DisksDeleteCall { +func (c *DiskTypesAggregatedListCall) Context(ctx context.Context) *DiskTypesAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DisksDeleteCall) Header() http.Header { +func (c *DiskTypesAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DisksDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *DiskTypesAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/diskTypes") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, - "disk": c.disk, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.disks.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *DisksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.diskTypes.aggregatedList" call. +// Exactly one of *DiskTypeAggregatedList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *DiskTypeAggregatedList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *DiskTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskTypeAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -19173,7 +20542,7 @@ func (c *DisksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &DiskTypeAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -19185,19 +20554,34 @@ func (c *DisksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { } return ret, nil // { - // "description": "Deletes the specified persistent disk. Deleting a disk removes its data permanently and is irreversible. However, deleting a disk does not delete any snapshots previously made from the disk. You must separately delete snapshots.", - // "httpMethod": "DELETE", - // "id": "compute.disks.delete", + // "description": "Retrieves an aggregated list of disk types.", + // "httpMethod": "GET", + // "id": "compute.diskTypes.aggregatedList", // "parameterOrder": [ - // "project", - // "zone", - // "disk" + // "project" // ], // "parameters": { - // "disk": { - // "description": "Name of the persistent disk to delete.", - // "location": "path", - // "required": true, + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", // "type": "string" // }, // "project": { @@ -19206,55 +20590,70 @@ func (c *DisksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/disks/{disk}", + // "path": "{project}/aggregated/diskTypes", // "response": { - // "$ref": "Operation" + // "$ref": "DiskTypeAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.disks.get": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *DiskTypesAggregatedListCall) Pages(ctx context.Context, f func(*DiskTypeAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type DisksGetCall struct { +// method id "compute.diskTypes.get": + +type DiskTypesGetCall struct { s *Service project string zone string - disk string + diskType string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns a specified persistent disk. Get a list of available -// persistent disks by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/get -func (r *DisksService) Get(project string, zone string, disk string) *DisksGetCall { - c := &DisksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified disk type. Get a list of available disk +// types by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/diskTypes/get +func (r *DiskTypesService) Get(project string, zone string, diskType string) *DiskTypesGetCall { + c := &DiskTypesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.disk = disk + c.diskType = diskType return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *DisksGetCall) Fields(s ...googleapi.Field) *DisksGetCall { +func (c *DiskTypesGetCall) Fields(s ...googleapi.Field) *DiskTypesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -19264,7 +20663,7 @@ func (c *DisksGetCall) Fields(s ...googleapi.Field) *DisksGetCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *DisksGetCall) IfNoneMatch(entityTag string) *DisksGetCall { +func (c *DiskTypesGetCall) IfNoneMatch(entityTag string) *DiskTypesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -19272,21 +20671,21 @@ func (c *DisksGetCall) IfNoneMatch(entityTag string) *DisksGetCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DisksGetCall) Context(ctx context.Context) *DisksGetCall { +func (c *DiskTypesGetCall) Context(ctx context.Context) *DiskTypesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DisksGetCall) Header() http.Header { +func (c *DiskTypesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DisksGetCall) doRequest(alt string) (*http.Response, error) { +func (c *DiskTypesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -19297,26 +20696,26 @@ func (c *DisksGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/diskTypes/{diskType}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "disk": c.disk, + "project": c.project, + "zone": c.zone, + "diskType": c.diskType, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.disks.get" call. -// Exactly one of *Disk or error will be non-nil. Any non-2xx status +// Do executes the "compute.diskTypes.get" call. +// Exactly one of *DiskType or error will be non-nil. Any non-2xx status // code is an error. Response headers are in either -// *Disk.ServerResponse.Header or (if a response was returned at all) in -// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check -// whether the returned error was because http.StatusNotModified was -// returned. -func (c *DisksGetCall) Do(opts ...googleapi.CallOption) (*Disk, error) { +// *DiskType.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *DiskTypesGetCall) Do(opts ...googleapi.CallOption) (*DiskType, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -19335,7 +20734,7 @@ func (c *DisksGetCall) Do(opts ...googleapi.CallOption) (*Disk, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Disk{ + ret := &DiskType{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -19347,17 +20746,17 @@ func (c *DisksGetCall) Do(opts ...googleapi.CallOption) (*Disk, error) { } return ret, nil // { - // "description": "Returns a specified persistent disk. Get a list of available persistent disks by making a list() request.", + // "description": "Returns the specified disk type. Get a list of available disk types by making a list() request.", // "httpMethod": "GET", - // "id": "compute.disks.get", + // "id": "compute.diskTypes.get", // "parameterOrder": [ // "project", // "zone", - // "disk" + // "diskType" // ], // "parameters": { - // "disk": { - // "description": "Name of the persistent disk to return.", + // "diskType": { + // "description": "Name of the disk type to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -19378,9 +20777,9 @@ func (c *DisksGetCall) Do(opts ...googleapi.CallOption) (*Disk, error) { // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/disks/{disk}", + // "path": "{project}/zones/{zone}/diskTypes/{diskType}", // "response": { - // "$ref": "Disk" + // "$ref": "DiskType" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -19391,80 +20790,144 @@ func (c *DisksGetCall) Do(opts ...googleapi.CallOption) (*Disk, error) { } -// method id "compute.disks.insert": +// method id "compute.diskTypes.list": -type DisksInsertCall struct { - s *Service - project string - zone string - disk *Disk - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type DiskTypesListCall struct { + s *Service + project string + zone string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Insert: Creates a persistent disk in the specified project using the -// data in the request. You can create a disk with a sourceImage, a -// sourceSnapshot, or create an empty 500 GB data disk by omitting all -// properties. You can also create a disk that is larger than the -// default size by specifying the sizeGb property. -// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/insert -func (r *DisksService) Insert(project string, zone string, disk *Disk) *DisksInsertCall { - c := &DisksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of disk types available to the specified +// project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/diskTypes/list +func (r *DiskTypesService) List(project string, zone string) *DiskTypesListCall { + c := &DiskTypesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.disk = disk return c } -// SourceImage sets the optional parameter "sourceImage": Source image -// to restore onto a disk. -func (c *DisksInsertCall) SourceImage(sourceImage string) *DisksInsertCall { - c.urlParams_.Set("sourceImage", sourceImage) +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *DiskTypesListCall) Filter(filter string) *DiskTypesListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *DiskTypesListCall) MaxResults(maxResults int64) *DiskTypesListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *DiskTypesListCall) OrderBy(orderBy string) *DiskTypesListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *DiskTypesListCall) PageToken(pageToken string) *DiskTypesListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *DisksInsertCall) Fields(s ...googleapi.Field) *DisksInsertCall { +func (c *DiskTypesListCall) Fields(s ...googleapi.Field) *DiskTypesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *DiskTypesListCall) IfNoneMatch(entityTag string) *DiskTypesListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DisksInsertCall) Context(ctx context.Context) *DisksInsertCall { +func (c *DiskTypesListCall) Context(ctx context.Context) *DiskTypesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DisksInsertCall) Header() http.Header { +func (c *DiskTypesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DisksInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *DiskTypesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.disk) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/diskTypes") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, @@ -19473,14 +20936,14 @@ func (c *DisksInsertCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.disks.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.diskTypes.list" call. +// Exactly one of *DiskTypeList or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at +// *DiskTypeList.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *DisksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *DiskTypesListCall) Do(opts ...googleapi.CallOption) (*DiskTypeList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -19499,7 +20962,7 @@ func (c *DisksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &DiskTypeList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -19511,14 +20974,37 @@ func (c *DisksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { } return ret, nil // { - // "description": "Creates a persistent disk in the specified project using the data in the request. You can create a disk with a sourceImage, a sourceSnapshot, or create an empty 500 GB data disk by omitting all properties. You can also create a disk that is larger than the default size by specifying the sizeGb property.", - // "httpMethod": "POST", - // "id": "compute.disks.insert", + // "description": "Retrieves a list of disk types available to the specified project.", + // "httpMethod": "GET", + // "id": "compute.diskTypes.list", // "parameterOrder": [ // "project", // "zone" // ], // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -19526,11 +21012,6 @@ func (c *DisksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "required": true, // "type": "string" // }, - // "sourceImage": { - // "description": "Optional. Source image to restore onto a disk.", - // "location": "query", - // "type": "string" - // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -19539,47 +21020,62 @@ func (c *DisksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/disks", - // "request": { - // "$ref": "Disk" - // }, + // "path": "{project}/zones/{zone}/diskTypes", // "response": { - // "$ref": "Operation" + // "$ref": "DiskTypeList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.disks.list": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *DiskTypesListCall) Pages(ctx context.Context, f func(*DiskTypeList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type DisksListCall struct { +// method id "compute.disks.aggregatedList": + +type DisksAggregatedListCall struct { s *Service project string - zone string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of persistent disks contained within the -// specified zone. -// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/list -func (r *DisksService) List(project string, zone string) *DisksListCall { - c := &DisksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves an aggregated list of persistent disks. +// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/aggregatedList +func (r *DisksService) AggregatedList(project string) *DisksAggregatedListCall { + c := &DisksAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -19591,7 +21087,7 @@ func (r *DisksService) List(project string, zone string) *DisksListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -19603,7 +21099,7 @@ func (r *DisksService) List(project string, zone string) *DisksListCall { // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *DisksListCall) Filter(filter string) *DisksListCall { +func (c *DisksAggregatedListCall) Filter(filter string) *DisksAggregatedListCall { c.urlParams_.Set("filter", filter) return c } @@ -19614,7 +21110,7 @@ func (c *DisksListCall) Filter(filter string) *DisksListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *DisksListCall) MaxResults(maxResults int64) *DisksListCall { +func (c *DisksAggregatedListCall) MaxResults(maxResults int64) *DisksAggregatedListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -19631,7 +21127,7 @@ func (c *DisksListCall) MaxResults(maxResults int64) *DisksListCall { // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *DisksListCall) OrderBy(orderBy string) *DisksListCall { +func (c *DisksAggregatedListCall) OrderBy(orderBy string) *DisksAggregatedListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -19639,7 +21135,7 @@ func (c *DisksListCall) OrderBy(orderBy string) *DisksListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *DisksListCall) PageToken(pageToken string) *DisksListCall { +func (c *DisksAggregatedListCall) PageToken(pageToken string) *DisksAggregatedListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -19647,7 +21143,7 @@ func (c *DisksListCall) PageToken(pageToken string) *DisksListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *DisksListCall) Fields(s ...googleapi.Field) *DisksListCall { +func (c *DisksAggregatedListCall) Fields(s ...googleapi.Field) *DisksAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -19657,7 +21153,7 @@ func (c *DisksListCall) Fields(s ...googleapi.Field) *DisksListCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *DisksListCall) IfNoneMatch(entityTag string) *DisksListCall { +func (c *DisksAggregatedListCall) IfNoneMatch(entityTag string) *DisksAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -19665,21 +21161,21 @@ func (c *DisksListCall) IfNoneMatch(entityTag string) *DisksListCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DisksListCall) Context(ctx context.Context) *DisksListCall { +func (c *DisksAggregatedListCall) Context(ctx context.Context) *DisksAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DisksListCall) Header() http.Header { +func (c *DisksAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DisksListCall) doRequest(alt string) (*http.Response, error) { +func (c *DisksAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -19690,25 +21186,24 @@ func (c *DisksListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/disks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.disks.list" call. -// Exactly one of *DiskList or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *DiskList.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *DisksListCall) Do(opts ...googleapi.CallOption) (*DiskList, error) { +// Do executes the "compute.disks.aggregatedList" call. +// Exactly one of *DiskAggregatedList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *DiskAggregatedList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *DisksAggregatedListCall) Do(opts ...googleapi.CallOption) (*DiskAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -19727,7 +21222,7 @@ func (c *DisksListCall) Do(opts ...googleapi.CallOption) (*DiskList, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &DiskList{ + ret := &DiskAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -19739,16 +21234,15 @@ func (c *DisksListCall) Do(opts ...googleapi.CallOption) (*DiskList, error) { } return ret, nil // { - // "description": "Retrieves a list of persistent disks contained within the specified zone.", + // "description": "Retrieves an aggregated list of persistent disks.", // "httpMethod": "GET", - // "id": "compute.disks.list", + // "id": "compute.disks.aggregatedList", // "parameterOrder": [ - // "project", - // "zone" + // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -19776,18 +21270,11 @@ func (c *DisksListCall) Do(opts ...googleapi.CallOption) (*DiskList, error) { // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/disks", + // "path": "{project}/aggregated/disks", // "response": { - // "$ref": "DiskList" + // "$ref": "DiskAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -19801,7 +21288,7 @@ func (c *DisksListCall) Do(opts ...googleapi.CallOption) (*DiskList, error) { // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *DisksListCall) Pages(ctx context.Context, f func(*DiskList) error) error { +func (c *DisksAggregatedListCall) Pages(ctx context.Context, f func(*DiskAggregatedList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -19819,33 +21306,40 @@ func (c *DisksListCall) Pages(ctx context.Context, f func(*DiskList) error) erro } } -// method id "compute.disks.resize": +// method id "compute.disks.createSnapshot": -type DisksResizeCall struct { - s *Service - project string - zone string - disk string - disksresizerequest *DisksResizeRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type DisksCreateSnapshotCall struct { + s *Service + project string + zone string + disk string + snapshot *Snapshot + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Resize: Resizes the specified persistent disk. -func (r *DisksService) Resize(project string, zone string, disk string, disksresizerequest *DisksResizeRequest) *DisksResizeCall { - c := &DisksResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// CreateSnapshot: Creates a snapshot of a specified persistent disk. +// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/createSnapshot +func (r *DisksService) CreateSnapshot(project string, zone string, disk string, snapshot *Snapshot) *DisksCreateSnapshotCall { + c := &DisksCreateSnapshotCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone c.disk = disk - c.disksresizerequest = disksresizerequest + c.snapshot = snapshot + return c +} + +// GuestFlush sets the optional parameter "guestFlush": +func (c *DisksCreateSnapshotCall) GuestFlush(guestFlush bool) *DisksCreateSnapshotCall { + c.urlParams_.Set("guestFlush", fmt.Sprint(guestFlush)) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *DisksResizeCall) Fields(s ...googleapi.Field) *DisksResizeCall { +func (c *DisksCreateSnapshotCall) Fields(s ...googleapi.Field) *DisksCreateSnapshotCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -19853,34 +21347,34 @@ func (c *DisksResizeCall) Fields(s ...googleapi.Field) *DisksResizeCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *DisksResizeCall) Context(ctx context.Context) *DisksResizeCall { +func (c *DisksCreateSnapshotCall) Context(ctx context.Context) *DisksCreateSnapshotCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *DisksResizeCall) Header() http.Header { +func (c *DisksCreateSnapshotCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *DisksResizeCall) doRequest(alt string) (*http.Response, error) { +func (c *DisksCreateSnapshotCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.disksresizerequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.snapshot) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}/resize") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}/createSnapshot") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -19892,14 +21386,14 @@ func (c *DisksResizeCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.disks.resize" call. +// Do executes the "compute.disks.createSnapshot" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *DisksResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *DisksCreateSnapshotCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -19930,9 +21424,9 @@ func (c *DisksResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { } return ret, nil // { - // "description": "Resizes the specified persistent disk.", + // "description": "Creates a snapshot of a specified persistent disk.", // "httpMethod": "POST", - // "id": "compute.disks.resize", + // "id": "compute.disks.createSnapshot", // "parameterOrder": [ // "project", // "zone", @@ -19940,12 +21434,16 @@ func (c *DisksResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // ], // "parameters": { // "disk": { - // "description": "The name of the persistent disk.", + // "description": "Name of the persistent disk to snapshot.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, + // "guestFlush": { + // "location": "query", + // "type": "boolean" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -19961,9 +21459,9 @@ func (c *DisksResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/disks/{disk}/resize", + // "path": "{project}/zones/{zone}/disks/{disk}/createSnapshot", // "request": { - // "$ref": "DisksResizeRequest" + // "$ref": "Snapshot" // }, // "response": { // "$ref": "Operation" @@ -19976,30 +21474,35 @@ func (c *DisksResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { } -// method id "compute.firewalls.delete": +// method id "compute.disks.delete": -type FirewallsDeleteCall struct { +type DisksDeleteCall struct { s *Service project string - firewall string + zone string + disk string urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Delete: Deletes the specified firewall. -// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/delete -func (r *FirewallsService) Delete(project string, firewall string) *FirewallsDeleteCall { - c := &FirewallsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified persistent disk. Deleting a disk +// removes its data permanently and is irreversible. However, deleting a +// disk does not delete any snapshots previously made from the disk. You +// must separately delete snapshots. +// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/delete +func (r *DisksService) Delete(project string, zone string, disk string) *DisksDeleteCall { + c := &DisksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.firewall = firewall + c.zone = zone + c.disk = disk return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *FirewallsDeleteCall) Fields(s ...googleapi.Field) *FirewallsDeleteCall { +func (c *DisksDeleteCall) Fields(s ...googleapi.Field) *DisksDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -20007,21 +21510,21 @@ func (c *FirewallsDeleteCall) Fields(s ...googleapi.Field) *FirewallsDeleteCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *FirewallsDeleteCall) Context(ctx context.Context) *FirewallsDeleteCall { +func (c *DisksDeleteCall) Context(ctx context.Context) *DisksDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *FirewallsDeleteCall) Header() http.Header { +func (c *DisksDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *FirewallsDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *DisksDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -20029,25 +21532,26 @@ func (c *FirewallsDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "firewall": c.firewall, + "project": c.project, + "zone": c.zone, + "disk": c.disk, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.firewalls.delete" call. +// Do executes the "compute.disks.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *FirewallsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *DisksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -20078,18 +21582,18 @@ func (c *FirewallsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro } return ret, nil // { - // "description": "Deletes the specified firewall.", + // "description": "Deletes the specified persistent disk. Deleting a disk removes its data permanently and is irreversible. However, deleting a disk does not delete any snapshots previously made from the disk. You must separately delete snapshots.", // "httpMethod": "DELETE", - // "id": "compute.firewalls.delete", + // "id": "compute.disks.delete", // "parameterOrder": [ // "project", - // "firewall" + // "zone", + // "disk" // ], // "parameters": { - // "firewall": { - // "description": "Name of the firewall rule to delete.", + // "disk": { + // "description": "Name of the persistent disk to delete.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -20099,9 +21603,16 @@ func (c *FirewallsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/firewalls/{firewall}", + // "path": "{project}/zones/{zone}/disks/{disk}", // "response": { // "$ref": "Operation" // }, @@ -20113,31 +21624,34 @@ func (c *FirewallsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro } -// method id "compute.firewalls.get": +// method id "compute.disks.get": -type FirewallsGetCall struct { +type DisksGetCall struct { s *Service project string - firewall string + zone string + disk string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns the specified firewall. -// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/get -func (r *FirewallsService) Get(project string, firewall string) *FirewallsGetCall { - c := &FirewallsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns a specified persistent disk. Get a list of available +// persistent disks by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/get +func (r *DisksService) Get(project string, zone string, disk string) *DisksGetCall { + c := &DisksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.firewall = firewall + c.zone = zone + c.disk = disk return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *FirewallsGetCall) Fields(s ...googleapi.Field) *FirewallsGetCall { +func (c *DisksGetCall) Fields(s ...googleapi.Field) *DisksGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -20147,7 +21661,7 @@ func (c *FirewallsGetCall) Fields(s ...googleapi.Field) *FirewallsGetCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *FirewallsGetCall) IfNoneMatch(entityTag string) *FirewallsGetCall { +func (c *DisksGetCall) IfNoneMatch(entityTag string) *DisksGetCall { c.ifNoneMatch_ = entityTag return c } @@ -20155,21 +21669,21 @@ func (c *FirewallsGetCall) IfNoneMatch(entityTag string) *FirewallsGetCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *FirewallsGetCall) Context(ctx context.Context) *FirewallsGetCall { +func (c *DisksGetCall) Context(ctx context.Context) *DisksGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *FirewallsGetCall) Header() http.Header { +func (c *DisksGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *FirewallsGetCall) doRequest(alt string) (*http.Response, error) { +func (c *DisksGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -20180,25 +21694,26 @@ func (c *FirewallsGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "firewall": c.firewall, + "project": c.project, + "zone": c.zone, + "disk": c.disk, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.firewalls.get" call. -// Exactly one of *Firewall or error will be non-nil. Any non-2xx status +// Do executes the "compute.disks.get" call. +// Exactly one of *Disk or error will be non-nil. Any non-2xx status // code is an error. Response headers are in either -// *Firewall.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *FirewallsGetCall) Do(opts ...googleapi.CallOption) (*Firewall, error) { +// *Disk.ServerResponse.Header or (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *DisksGetCall) Do(opts ...googleapi.CallOption) (*Disk, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -20217,7 +21732,7 @@ func (c *FirewallsGetCall) Do(opts ...googleapi.CallOption) (*Firewall, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Firewall{ + ret := &Disk{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -20229,16 +21744,17 @@ func (c *FirewallsGetCall) Do(opts ...googleapi.CallOption) (*Firewall, error) { } return ret, nil // { - // "description": "Returns the specified firewall.", + // "description": "Returns a specified persistent disk. Get a list of available persistent disks by making a list() request.", // "httpMethod": "GET", - // "id": "compute.firewalls.get", + // "id": "compute.disks.get", // "parameterOrder": [ // "project", - // "firewall" + // "zone", + // "disk" // ], // "parameters": { - // "firewall": { - // "description": "Name of the firewall rule to return.", + // "disk": { + // "description": "Name of the persistent disk to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -20250,11 +21766,18 @@ func (c *FirewallsGetCall) Do(opts ...googleapi.CallOption) (*Firewall, error) { // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/firewalls/{firewall}", + // "path": "{project}/zones/{zone}/disks/{disk}", // "response": { - // "$ref": "Firewall" + // "$ref": "Disk" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -20265,31 +21788,43 @@ func (c *FirewallsGetCall) Do(opts ...googleapi.CallOption) (*Firewall, error) { } -// method id "compute.firewalls.insert": +// method id "compute.disks.insert": -type FirewallsInsertCall struct { +type DisksInsertCall struct { s *Service project string - firewall *Firewall + zone string + disk *Disk urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Insert: Creates a firewall rule in the specified project using the -// data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/insert -func (r *FirewallsService) Insert(project string, firewall *Firewall) *FirewallsInsertCall { - c := &FirewallsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a persistent disk in the specified project using the +// data in the request. You can create a disk with a sourceImage, a +// sourceSnapshot, or create an empty 500 GB data disk by omitting all +// properties. You can also create a disk that is larger than the +// default size by specifying the sizeGb property. +// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/insert +func (r *DisksService) Insert(project string, zone string, disk *Disk) *DisksInsertCall { + c := &DisksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.firewall = firewall + c.zone = zone + c.disk = disk + return c +} + +// SourceImage sets the optional parameter "sourceImage": Source image +// to restore onto a disk. +func (c *DisksInsertCall) SourceImage(sourceImage string) *DisksInsertCall { + c.urlParams_.Set("sourceImage", sourceImage) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *FirewallsInsertCall) Fields(s ...googleapi.Field) *FirewallsInsertCall { +func (c *DisksInsertCall) Fields(s ...googleapi.Field) *DisksInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -20297,51 +21832,52 @@ func (c *FirewallsInsertCall) Fields(s ...googleapi.Field) *FirewallsInsertCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *FirewallsInsertCall) Context(ctx context.Context) *FirewallsInsertCall { +func (c *DisksInsertCall) Context(ctx context.Context) *DisksInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *FirewallsInsertCall) Header() http.Header { +func (c *DisksInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *FirewallsInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *DisksInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.disk) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.firewalls.insert" call. +// Do executes the "compute.disks.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *FirewallsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *DisksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -20372,11 +21908,12 @@ func (c *FirewallsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro } return ret, nil // { - // "description": "Creates a firewall rule in the specified project using the data included in the request.", + // "description": "Creates a persistent disk in the specified project using the data in the request. You can create a disk with a sourceImage, a sourceSnapshot, or create an empty 500 GB data disk by omitting all properties. You can also create a disk that is larger than the default size by specifying the sizeGb property.", // "httpMethod": "POST", - // "id": "compute.firewalls.insert", + // "id": "compute.disks.insert", // "parameterOrder": [ - // "project" + // "project", + // "zone" // ], // "parameters": { // "project": { @@ -20385,11 +21922,23 @@ func (c *FirewallsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "sourceImage": { + // "description": "Optional. Source image to restore onto a disk.", + // "location": "query", + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/firewalls", + // "path": "{project}/zones/{zone}/disks", // "request": { - // "$ref": "Firewall" + // "$ref": "Disk" // }, // "response": { // "$ref": "Operation" @@ -20402,30 +21951,31 @@ func (c *FirewallsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro } -// method id "compute.firewalls.list": +// method id "compute.disks.list": -type FirewallsListCall struct { +type DisksListCall struct { s *Service project string + zone string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves the list of firewall rules available to the specified -// project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/list -func (r *FirewallsService) List(project string) *FirewallsListCall { - c := &FirewallsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of persistent disks contained within the +// specified zone. +// For details, see https://cloud.google.com/compute/docs/reference/latest/disks/list +func (r *DisksService) List(project string, zone string) *DisksListCall { + c := &DisksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.zone = zone return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -20437,7 +21987,7 @@ func (r *FirewallsService) List(project string) *FirewallsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -20449,7 +21999,7 @@ func (r *FirewallsService) List(project string) *FirewallsListCall { // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *FirewallsListCall) Filter(filter string) *FirewallsListCall { +func (c *DisksListCall) Filter(filter string) *DisksListCall { c.urlParams_.Set("filter", filter) return c } @@ -20460,7 +22010,7 @@ func (c *FirewallsListCall) Filter(filter string) *FirewallsListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *FirewallsListCall) MaxResults(maxResults int64) *FirewallsListCall { +func (c *DisksListCall) MaxResults(maxResults int64) *DisksListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -20477,7 +22027,7 @@ func (c *FirewallsListCall) MaxResults(maxResults int64) *FirewallsListCall { // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *FirewallsListCall) OrderBy(orderBy string) *FirewallsListCall { +func (c *DisksListCall) OrderBy(orderBy string) *DisksListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -20485,7 +22035,7 @@ func (c *FirewallsListCall) OrderBy(orderBy string) *FirewallsListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *FirewallsListCall) PageToken(pageToken string) *FirewallsListCall { +func (c *DisksListCall) PageToken(pageToken string) *DisksListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -20493,7 +22043,7 @@ func (c *FirewallsListCall) PageToken(pageToken string) *FirewallsListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *FirewallsListCall) Fields(s ...googleapi.Field) *FirewallsListCall { +func (c *DisksListCall) Fields(s ...googleapi.Field) *DisksListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -20503,7 +22053,7 @@ func (c *FirewallsListCall) Fields(s ...googleapi.Field) *FirewallsListCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *FirewallsListCall) IfNoneMatch(entityTag string) *FirewallsListCall { +func (c *DisksListCall) IfNoneMatch(entityTag string) *DisksListCall { c.ifNoneMatch_ = entityTag return c } @@ -20511,21 +22061,21 @@ func (c *FirewallsListCall) IfNoneMatch(entityTag string) *FirewallsListCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *FirewallsListCall) Context(ctx context.Context) *FirewallsListCall { +func (c *DisksListCall) Context(ctx context.Context) *DisksListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *FirewallsListCall) Header() http.Header { +func (c *DisksListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *FirewallsListCall) doRequest(alt string) (*http.Response, error) { +func (c *DisksListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -20536,24 +22086,25 @@ func (c *FirewallsListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.firewalls.list" call. -// Exactly one of *FirewallList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *FirewallList.ServerResponse.Header or (if a response was returned at +// Do executes the "compute.disks.list" call. +// Exactly one of *DiskList or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *DiskList.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *FirewallsListCall) Do(opts ...googleapi.CallOption) (*FirewallList, error) { +func (c *DisksListCall) Do(opts ...googleapi.CallOption) (*DiskList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -20572,7 +22123,7 @@ func (c *FirewallsListCall) Do(opts ...googleapi.CallOption) (*FirewallList, err if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &FirewallList{ + ret := &DiskList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -20584,15 +22135,16 @@ func (c *FirewallsListCall) Do(opts ...googleapi.CallOption) (*FirewallList, err } return ret, nil // { - // "description": "Retrieves the list of firewall rules available to the specified project.", + // "description": "Retrieves a list of persistent disks contained within the specified zone.", // "httpMethod": "GET", - // "id": "compute.firewalls.list", + // "id": "compute.disks.list", // "parameterOrder": [ - // "project" + // "project", + // "zone" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -20620,11 +22172,18 @@ func (c *FirewallsListCall) Do(opts ...googleapi.CallOption) (*FirewallList, err // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/firewalls", + // "path": "{project}/zones/{zone}/disks", // "response": { - // "$ref": "FirewallList" + // "$ref": "DiskList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -20638,7 +22197,7 @@ func (c *FirewallsListCall) Do(opts ...googleapi.CallOption) (*FirewallList, err // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *FirewallsListCall) Pages(ctx context.Context, f func(*FirewallList) error) error { +func (c *DisksListCall) Pages(ctx context.Context, f func(*DiskList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -20656,35 +22215,33 @@ func (c *FirewallsListCall) Pages(ctx context.Context, f func(*FirewallList) err } } -// method id "compute.firewalls.patch": +// method id "compute.disks.resize": -type FirewallsPatchCall struct { - s *Service - project string - firewall string - firewall2 *Firewall - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type DisksResizeCall struct { + s *Service + project string + zone string + disk string + disksresizerequest *DisksResizeRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Patch: Updates the specified firewall rule with the data included in -// the request. Using PUT method, can only update following fields of -// firewall rule: allowed, description, sourceRanges, sourceTags, -// targetTags. This method supports patch semantics. -// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/patch -func (r *FirewallsService) Patch(project string, firewall string, firewall2 *Firewall) *FirewallsPatchCall { - c := &FirewallsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Resize: Resizes the specified persistent disk. +func (r *DisksService) Resize(project string, zone string, disk string, disksresizerequest *DisksResizeRequest) *DisksResizeCall { + c := &DisksResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.firewall = firewall - c.firewall2 = firewall2 + c.zone = zone + c.disk = disk + c.disksresizerequest = disksresizerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *FirewallsPatchCall) Fields(s ...googleapi.Field) *FirewallsPatchCall { +func (c *DisksResizeCall) Fields(s ...googleapi.Field) *DisksResizeCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -20692,52 +22249,53 @@ func (c *FirewallsPatchCall) Fields(s ...googleapi.Field) *FirewallsPatchCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *FirewallsPatchCall) Context(ctx context.Context) *FirewallsPatchCall { +func (c *DisksResizeCall) Context(ctx context.Context) *DisksResizeCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *FirewallsPatchCall) Header() http.Header { +func (c *DisksResizeCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *FirewallsPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *DisksResizeCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.disksresizerequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}/resize") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PATCH", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "firewall": c.firewall, + "project": c.project, + "zone": c.zone, + "disk": c.disk, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.firewalls.patch" call. +// Do executes the "compute.disks.resize" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *FirewallsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *DisksResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -20768,16 +22326,17 @@ func (c *FirewallsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error } return ret, nil // { - // "description": "Updates the specified firewall rule with the data included in the request. Using PUT method, can only update following fields of firewall rule: allowed, description, sourceRanges, sourceTags, targetTags. This method supports patch semantics.", - // "httpMethod": "PATCH", - // "id": "compute.firewalls.patch", + // "description": "Resizes the specified persistent disk.", + // "httpMethod": "POST", + // "id": "compute.disks.resize", // "parameterOrder": [ // "project", - // "firewall" + // "zone", + // "disk" // ], // "parameters": { - // "firewall": { - // "description": "Name of the firewall rule to update.", + // "disk": { + // "description": "The name of the persistent disk.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -20789,11 +22348,18 @@ func (c *FirewallsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/firewalls/{firewall}", + // "path": "{project}/zones/{zone}/disks/{disk}/resize", // "request": { - // "$ref": "Firewall" + // "$ref": "DisksResizeRequest" // }, // "response": { // "$ref": "Operation" @@ -20806,35 +22372,34 @@ func (c *FirewallsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error } -// method id "compute.firewalls.update": +// method id "compute.disks.setLabels": -type FirewallsUpdateCall struct { - s *Service - project string - firewall string - firewall2 *Firewall - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type DisksSetLabelsCall struct { + s *Service + project string + zone string + resource string + zonesetlabelsrequest *ZoneSetLabelsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Update: Updates the specified firewall rule with the data included in -// the request. Using PUT method, can only update following fields of -// firewall rule: allowed, description, sourceRanges, sourceTags, -// targetTags. -// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/update -func (r *FirewallsService) Update(project string, firewall string, firewall2 *Firewall) *FirewallsUpdateCall { - c := &FirewallsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetLabels: Sets the labels on a disk. To learn more about labels, +// read the Labeling Resources documentation. +func (r *DisksService) SetLabels(project string, zone string, resource string, zonesetlabelsrequest *ZoneSetLabelsRequest) *DisksSetLabelsCall { + c := &DisksSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.firewall = firewall - c.firewall2 = firewall2 + c.zone = zone + c.resource = resource + c.zonesetlabelsrequest = zonesetlabelsrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *FirewallsUpdateCall) Fields(s ...googleapi.Field) *FirewallsUpdateCall { +func (c *DisksSetLabelsCall) Fields(s ...googleapi.Field) *DisksSetLabelsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -20842,52 +22407,53 @@ func (c *FirewallsUpdateCall) Fields(s ...googleapi.Field) *FirewallsUpdateCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *FirewallsUpdateCall) Context(ctx context.Context) *FirewallsUpdateCall { +func (c *DisksSetLabelsCall) Context(ctx context.Context) *DisksSetLabelsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *FirewallsUpdateCall) Header() http.Header { +func (c *DisksSetLabelsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *FirewallsUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *DisksSetLabelsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.zonesetlabelsrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{resource}/setLabels") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PUT", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "firewall": c.firewall, + "zone": c.zone, + "resource": c.resource, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.firewalls.update" call. +// Do executes the "compute.disks.setLabels" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *FirewallsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *DisksSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -20918,32 +22484,40 @@ func (c *FirewallsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, erro } return ret, nil // { - // "description": "Updates the specified firewall rule with the data included in the request. Using PUT method, can only update following fields of firewall rule: allowed, description, sourceRanges, sourceTags, targetTags.", - // "httpMethod": "PUT", - // "id": "compute.firewalls.update", + // "description": "Sets the labels on a disk. To learn more about labels, read the Labeling Resources documentation.", + // "httpMethod": "POST", + // "id": "compute.disks.setLabels", // "parameterOrder": [ // "project", - // "firewall" + // "zone", + // "resource" // ], // "parameters": { - // "firewall": { - // "description": "Name of the firewall rule to update.", + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "resource": { + // "description": "Name of the resource for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, - // "project": { - // "description": "Project ID for this request.", + // "zone": { + // "description": "The name of the zone for this request.", // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/firewalls/{firewall}", + // "path": "{project}/zones/{zone}/disks/{resource}/setLabels", // "request": { - // "$ref": "Firewall" + // "$ref": "ZoneSetLabelsRequest" // }, // "response": { // "$ref": "Operation" @@ -20956,157 +22530,78 @@ func (c *FirewallsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, erro } -// method id "compute.forwardingRules.aggregatedList": +// method id "compute.firewalls.delete": -type ForwardingRulesAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type FirewallsDeleteCall struct { + s *Service + project string + firewall string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves an aggregated list of forwarding rules. -// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/aggregatedList -func (r *ForwardingRulesService) AggregatedList(project string) *ForwardingRulesAggregatedListCall { - c := &ForwardingRulesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified firewall. +// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/delete +func (r *FirewallsService) Delete(project string, firewall string) *FirewallsDeleteCall { + c := &FirewallsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *ForwardingRulesAggregatedListCall) Filter(filter string) *ForwardingRulesAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *ForwardingRulesAggregatedListCall) MaxResults(maxResults int64) *ForwardingRulesAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *ForwardingRulesAggregatedListCall) OrderBy(orderBy string) *ForwardingRulesAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *ForwardingRulesAggregatedListCall) PageToken(pageToken string) *ForwardingRulesAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) + c.firewall = firewall return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ForwardingRulesAggregatedListCall) Fields(s ...googleapi.Field) *ForwardingRulesAggregatedListCall { +func (c *FirewallsDeleteCall) Fields(s ...googleapi.Field) *FirewallsDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *ForwardingRulesAggregatedListCall) IfNoneMatch(entityTag string) *ForwardingRulesAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ForwardingRulesAggregatedListCall) Context(ctx context.Context) *ForwardingRulesAggregatedListCall { +func (c *FirewallsDeleteCall) Context(ctx context.Context) *FirewallsDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ForwardingRulesAggregatedListCall) Header() http.Header { +func (c *FirewallsDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ForwardingRulesAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *FirewallsDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/forwardingRules") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "firewall": c.firewall, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.forwardingRules.aggregatedList" call. -// Exactly one of *ForwardingRuleAggregatedList or error will be -// non-nil. Any non-2xx status code is an error. Response headers are in -// either *ForwardingRuleAggregatedList.ServerResponse.Header or (if a -// response was returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *ForwardingRulesAggregatedListCall) Do(opts ...googleapi.CallOption) (*ForwardingRuleAggregatedList, error) { +// Do executes the "compute.firewalls.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *FirewallsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -21125,7 +22620,7 @@ func (c *ForwardingRulesAggregatedListCall) Do(opts ...googleapi.CallOption) (*F if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &ForwardingRuleAggregatedList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -21137,34 +22632,19 @@ func (c *ForwardingRulesAggregatedListCall) Do(opts ...googleapi.CallOption) (*F } return ret, nil // { - // "description": "Retrieves an aggregated list of forwarding rules.", - // "httpMethod": "GET", - // "id": "compute.forwardingRules.aggregatedList", + // "description": "Deletes the specified firewall.", + // "httpMethod": "DELETE", + // "id": "compute.firewalls.delete", // "parameterOrder": [ - // "project" + // "project", + // "firewall" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "firewall": { + // "description": "Name of the firewall rule to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { @@ -21175,115 +22655,104 @@ func (c *ForwardingRulesAggregatedListCall) Do(opts ...googleapi.CallOption) (*F // "type": "string" // } // }, - // "path": "{project}/aggregated/forwardingRules", + // "path": "{project}/global/firewalls/{firewall}", // "response": { - // "$ref": "ForwardingRuleAggregatedList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *ForwardingRulesAggregatedListCall) Pages(ctx context.Context, f func(*ForwardingRuleAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.forwardingRules.delete": +// method id "compute.firewalls.get": -type ForwardingRulesDeleteCall struct { - s *Service - project string - region string - forwardingRule string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type FirewallsGetCall struct { + s *Service + project string + firewall string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified ForwardingRule resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/delete -func (r *ForwardingRulesService) Delete(project string, region string, forwardingRule string) *ForwardingRulesDeleteCall { - c := &ForwardingRulesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified firewall. +// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/get +func (r *FirewallsService) Get(project string, firewall string) *FirewallsGetCall { + c := &FirewallsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.forwardingRule = forwardingRule + c.firewall = firewall return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ForwardingRulesDeleteCall) Fields(s ...googleapi.Field) *ForwardingRulesDeleteCall { +func (c *FirewallsGetCall) Fields(s ...googleapi.Field) *FirewallsGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *FirewallsGetCall) IfNoneMatch(entityTag string) *FirewallsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ForwardingRulesDeleteCall) Context(ctx context.Context) *ForwardingRulesDeleteCall { +func (c *FirewallsGetCall) Context(ctx context.Context) *FirewallsGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ForwardingRulesDeleteCall) Header() http.Header { +func (c *FirewallsGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ForwardingRulesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *FirewallsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "forwardingRule": c.forwardingRule, + "project": c.project, + "firewall": c.firewall, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.forwardingRules.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at +// Do executes the "compute.firewalls.get" call. +// Exactly one of *Firewall or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Firewall.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *FirewallsGetCall) Do(opts ...googleapi.CallOption) (*Firewall, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -21302,7 +22771,7 @@ func (c *ForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &Firewall{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -21314,17 +22783,16 @@ func (c *ForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Deletes the specified ForwardingRule resource.", - // "httpMethod": "DELETE", - // "id": "compute.forwardingRules.delete", + // "description": "Returns the specified firewall.", + // "httpMethod": "GET", + // "id": "compute.firewalls.get", // "parameterOrder": [ // "project", - // "region", - // "forwardingRule" + // "firewall" // ], // "parameters": { - // "forwardingRule": { - // "description": "Name of the ForwardingRule resource to delete.", + // "firewall": { + // "description": "Name of the firewall rule to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -21336,116 +22804,98 @@ func (c *ForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}", + // "path": "{project}/global/firewalls/{firewall}", // "response": { - // "$ref": "Operation" + // "$ref": "Firewall" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.forwardingRules.get": +// method id "compute.firewalls.insert": -type ForwardingRulesGetCall struct { - s *Service - project string - region string - forwardingRule string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type FirewallsInsertCall struct { + s *Service + project string + firewall *Firewall + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified ForwardingRule resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/get -func (r *ForwardingRulesService) Get(project string, region string, forwardingRule string) *ForwardingRulesGetCall { - c := &ForwardingRulesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a firewall rule in the specified project using the +// data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/insert +func (r *FirewallsService) Insert(project string, firewall *Firewall) *FirewallsInsertCall { + c := &FirewallsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.forwardingRule = forwardingRule + c.firewall = firewall return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ForwardingRulesGetCall) Fields(s ...googleapi.Field) *ForwardingRulesGetCall { +func (c *FirewallsInsertCall) Fields(s ...googleapi.Field) *FirewallsInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *ForwardingRulesGetCall) IfNoneMatch(entityTag string) *ForwardingRulesGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ForwardingRulesGetCall) Context(ctx context.Context) *ForwardingRulesGetCall { +func (c *FirewallsInsertCall) Context(ctx context.Context) *FirewallsInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ForwardingRulesGetCall) Header() http.Header { +func (c *FirewallsInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ForwardingRulesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *FirewallsInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "forwardingRule": c.forwardingRule, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.forwardingRules.get" call. -// Exactly one of *ForwardingRule or error will be non-nil. Any non-2xx +// Do executes the "compute.firewalls.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *ForwardingRule.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *ForwardingRulesGetCall) Do(opts ...googleapi.CallOption) (*ForwardingRule, error) { +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *FirewallsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -21464,7 +22914,7 @@ func (c *ForwardingRulesGetCall) Do(opts ...googleapi.CallOption) (*ForwardingRu if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &ForwardingRule{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -21476,224 +22926,59 @@ func (c *ForwardingRulesGetCall) Do(opts ...googleapi.CallOption) (*ForwardingRu } return ret, nil // { - // "description": "Returns the specified ForwardingRule resource.", - // "httpMethod": "GET", - // "id": "compute.forwardingRules.get", + // "description": "Creates a firewall rule in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.firewalls.insert", // "parameterOrder": [ - // "project", - // "region", - // "forwardingRule" + // "project" // ], // "parameters": { - // "forwardingRule": { - // "description": "Name of the ForwardingRule resource to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}", + // "path": "{project}/global/firewalls", + // "request": { + // "$ref": "Firewall" + // }, // "response": { - // "$ref": "ForwardingRule" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.forwardingRules.insert": +// method id "compute.firewalls.list": -type ForwardingRulesInsertCall struct { - s *Service - project string - region string - forwardingrule *ForwardingRule - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type FirewallsListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Insert: Creates a ForwardingRule resource in the specified project -// and region using the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/insert -func (r *ForwardingRulesService) Insert(project string, region string, forwardingrule *ForwardingRule) *ForwardingRulesInsertCall { - c := &ForwardingRulesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.region = region - c.forwardingrule = forwardingrule - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *ForwardingRulesInsertCall) Fields(s ...googleapi.Field) *ForwardingRulesInsertCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *ForwardingRulesInsertCall) Context(ctx context.Context) *ForwardingRulesInsertCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *ForwardingRulesInsertCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *ForwardingRulesInsertCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.forwardingRules.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *ForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Creates a ForwardingRule resource in the specified project and region using the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.forwardingRules.insert", - // "parameterOrder": [ - // "project", - // "region" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/regions/{region}/forwardingRules", - // "request": { - // "$ref": "ForwardingRule" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.forwardingRules.list": - -type ForwardingRulesListCall struct { - s *Service - project string - region string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} - -// List: Retrieves a list of ForwardingRule resources available to the -// specified project and region. -// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/list -func (r *ForwardingRulesService) List(project string, region string) *ForwardingRulesListCall { - c := &ForwardingRulesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of firewall rules available to the specified +// project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/list +func (r *FirewallsService) List(project string) *FirewallsListCall { + c := &FirewallsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -21705,7 +22990,7 @@ func (r *ForwardingRulesService) List(project string, region string) *Forwarding // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -21717,7 +23002,7 @@ func (r *ForwardingRulesService) List(project string, region string) *Forwarding // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *ForwardingRulesListCall) Filter(filter string) *ForwardingRulesListCall { +func (c *FirewallsListCall) Filter(filter string) *FirewallsListCall { c.urlParams_.Set("filter", filter) return c } @@ -21728,7 +23013,7 @@ func (c *ForwardingRulesListCall) Filter(filter string) *ForwardingRulesListCall // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *ForwardingRulesListCall) MaxResults(maxResults int64) *ForwardingRulesListCall { +func (c *FirewallsListCall) MaxResults(maxResults int64) *FirewallsListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -21745,7 +23030,7 @@ func (c *ForwardingRulesListCall) MaxResults(maxResults int64) *ForwardingRulesL // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *ForwardingRulesListCall) OrderBy(orderBy string) *ForwardingRulesListCall { +func (c *FirewallsListCall) OrderBy(orderBy string) *FirewallsListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -21753,7 +23038,7 @@ func (c *ForwardingRulesListCall) OrderBy(orderBy string) *ForwardingRulesListCa // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *ForwardingRulesListCall) PageToken(pageToken string) *ForwardingRulesListCall { +func (c *FirewallsListCall) PageToken(pageToken string) *FirewallsListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -21761,7 +23046,7 @@ func (c *ForwardingRulesListCall) PageToken(pageToken string) *ForwardingRulesLi // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ForwardingRulesListCall) Fields(s ...googleapi.Field) *ForwardingRulesListCall { +func (c *FirewallsListCall) Fields(s ...googleapi.Field) *FirewallsListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -21771,7 +23056,7 @@ func (c *ForwardingRulesListCall) Fields(s ...googleapi.Field) *ForwardingRulesL // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *ForwardingRulesListCall) IfNoneMatch(entityTag string) *ForwardingRulesListCall { +func (c *FirewallsListCall) IfNoneMatch(entityTag string) *FirewallsListCall { c.ifNoneMatch_ = entityTag return c } @@ -21779,21 +23064,21 @@ func (c *ForwardingRulesListCall) IfNoneMatch(entityTag string) *ForwardingRules // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ForwardingRulesListCall) Context(ctx context.Context) *ForwardingRulesListCall { +func (c *FirewallsListCall) Context(ctx context.Context) *FirewallsListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ForwardingRulesListCall) Header() http.Header { +func (c *FirewallsListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ForwardingRulesListCall) doRequest(alt string) (*http.Response, error) { +func (c *FirewallsListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -21804,25 +23089,24 @@ func (c *ForwardingRulesListCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.forwardingRules.list" call. -// Exactly one of *ForwardingRuleList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *ForwardingRuleList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *ForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingRuleList, error) { +// Do executes the "compute.firewalls.list" call. +// Exactly one of *FirewallList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *FirewallList.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *FirewallsListCall) Do(opts ...googleapi.CallOption) (*FirewallList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -21841,7 +23125,7 @@ func (c *ForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingR if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &ForwardingRuleList{ + ret := &FirewallList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -21853,16 +23137,15 @@ func (c *ForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingR } return ret, nil // { - // "description": "Retrieves a list of ForwardingRule resources available to the specified project and region.", + // "description": "Retrieves the list of firewall rules available to the specified project.", // "httpMethod": "GET", - // "id": "compute.forwardingRules.list", + // "id": "compute.firewalls.list", // "parameterOrder": [ - // "project", - // "region" + // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -21890,18 +23173,11 @@ func (c *ForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingR // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/forwardingRules", + // "path": "{project}/global/firewalls", // "response": { - // "$ref": "ForwardingRuleList" + // "$ref": "FirewallList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -21915,7 +23191,7 @@ func (c *ForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingR // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *ForwardingRulesListCall) Pages(ctx context.Context, f func(*ForwardingRuleList) error) error { +func (c *FirewallsListCall) Pages(ctx context.Context, f func(*FirewallList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -21933,35 +23209,35 @@ func (c *ForwardingRulesListCall) Pages(ctx context.Context, f func(*ForwardingR } } -// method id "compute.forwardingRules.setTarget": +// method id "compute.firewalls.patch": -type ForwardingRulesSetTargetCall struct { - s *Service - project string - region string - forwardingRule string - targetreference *TargetReference - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type FirewallsPatchCall struct { + s *Service + project string + firewall string + firewall2 *Firewall + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetTarget: Changes target URL for forwarding rule. The new target -// should be of the same type as the old target. -// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/setTarget -func (r *ForwardingRulesService) SetTarget(project string, region string, forwardingRule string, targetreference *TargetReference) *ForwardingRulesSetTargetCall { - c := &ForwardingRulesSetTargetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Patch: Updates the specified firewall rule with the data included in +// the request. Using PUT method, can only update following fields of +// firewall rule: allowed, description, sourceRanges, sourceTags, +// targetTags. This method supports patch semantics. +// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/patch +func (r *FirewallsService) Patch(project string, firewall string, firewall2 *Firewall) *FirewallsPatchCall { + c := &FirewallsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.forwardingRule = forwardingRule - c.targetreference = targetreference + c.firewall = firewall + c.firewall2 = firewall2 return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ForwardingRulesSetTargetCall) Fields(s ...googleapi.Field) *ForwardingRulesSetTargetCall { +func (c *FirewallsPatchCall) Fields(s ...googleapi.Field) *FirewallsPatchCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -21969,53 +23245,52 @@ func (c *ForwardingRulesSetTargetCall) Fields(s ...googleapi.Field) *ForwardingR // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ForwardingRulesSetTargetCall) Context(ctx context.Context) *ForwardingRulesSetTargetCall { +func (c *FirewallsPatchCall) Context(ctx context.Context) *FirewallsPatchCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ForwardingRulesSetTargetCall) Header() http.Header { +func (c *FirewallsPatchCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ForwardingRulesSetTargetCall) doRequest(alt string) (*http.Response, error) { +func (c *FirewallsPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("PATCH", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "forwardingRule": c.forwardingRule, + "project": c.project, + "firewall": c.firewall, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.forwardingRules.setTarget" call. +// Do executes the "compute.firewalls.patch" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *FirewallsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -22046,17 +23321,16 @@ func (c *ForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (*Operat } return ret, nil // { - // "description": "Changes target URL for forwarding rule. The new target should be of the same type as the old target.", - // "httpMethod": "POST", - // "id": "compute.forwardingRules.setTarget", + // "description": "Updates the specified firewall rule with the data included in the request. Using PUT method, can only update following fields of firewall rule: allowed, description, sourceRanges, sourceTags, targetTags. This method supports patch semantics.", + // "httpMethod": "PATCH", + // "id": "compute.firewalls.patch", // "parameterOrder": [ // "project", - // "region", - // "forwardingRule" + // "firewall" // ], // "parameters": { - // "forwardingRule": { - // "description": "Name of the ForwardingRule resource in which target is to be set.", + // "firewall": { + // "description": "Name of the firewall rule to update.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -22068,18 +23342,11 @@ func (c *ForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (*Operat // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget", + // "path": "{project}/global/firewalls/{firewall}", // "request": { - // "$ref": "TargetReference" + // "$ref": "Firewall" // }, // "response": { // "$ref": "Operation" @@ -22092,30 +23359,35 @@ func (c *ForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (*Operat } -// method id "compute.globalAddresses.delete": +// method id "compute.firewalls.update": -type GlobalAddressesDeleteCall struct { +type FirewallsUpdateCall struct { s *Service project string - address string + firewall string + firewall2 *Firewall urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Delete: Deletes the specified address resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalAddresses/delete -func (r *GlobalAddressesService) Delete(project string, address string) *GlobalAddressesDeleteCall { - c := &GlobalAddressesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Update: Updates the specified firewall rule with the data included in +// the request. Using PUT method, can only update following fields of +// firewall rule: allowed, description, sourceRanges, sourceTags, +// targetTags. +// For details, see https://cloud.google.com/compute/docs/reference/latest/firewalls/update +func (r *FirewallsService) Update(project string, firewall string, firewall2 *Firewall) *FirewallsUpdateCall { + c := &FirewallsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.address = address + c.firewall = firewall + c.firewall2 = firewall2 return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalAddressesDeleteCall) Fields(s ...googleapi.Field) *GlobalAddressesDeleteCall { +func (c *FirewallsUpdateCall) Fields(s ...googleapi.Field) *FirewallsUpdateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -22123,47 +23395,52 @@ func (c *GlobalAddressesDeleteCall) Fields(s ...googleapi.Field) *GlobalAddresse // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalAddressesDeleteCall) Context(ctx context.Context) *GlobalAddressesDeleteCall { +func (c *FirewallsUpdateCall) Context(ctx context.Context) *FirewallsUpdateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalAddressesDeleteCall) Header() http.Header { +func (c *FirewallsUpdateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalAddressesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *FirewallsUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{address}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("PUT", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "address": c.address, + "project": c.project, + "firewall": c.firewall, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalAddresses.delete" call. +// Do executes the "compute.firewalls.update" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *GlobalAddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *FirewallsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -22194,16 +23471,16 @@ func (c *GlobalAddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Deletes the specified address resource.", - // "httpMethod": "DELETE", - // "id": "compute.globalAddresses.delete", + // "description": "Updates the specified firewall rule with the data included in the request. Using PUT method, can only update following fields of firewall rule: allowed, description, sourceRanges, sourceTags, targetTags.", + // "httpMethod": "PUT", + // "id": "compute.firewalls.update", // "parameterOrder": [ // "project", - // "address" + // "firewall" // ], // "parameters": { - // "address": { - // "description": "Name of the address resource to delete.", + // "firewall": { + // "description": "Name of the firewall rule to update.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -22217,7 +23494,10 @@ func (c *GlobalAddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // } // }, - // "path": "{project}/global/addresses/{address}", + // "path": "{project}/global/firewalls/{firewall}", + // "request": { + // "$ref": "Firewall" + // }, // "response": { // "$ref": "Operation" // }, @@ -22229,32 +23509,96 @@ func (c *GlobalAddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation } -// method id "compute.globalAddresses.get": +// method id "compute.forwardingRules.aggregatedList": -type GlobalAddressesGetCall struct { +type ForwardingRulesAggregatedListCall struct { s *Service project string - address string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns the specified address resource. Get a list of available -// addresses by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalAddresses/get -func (r *GlobalAddressesService) Get(project string, address string) *GlobalAddressesGetCall { - c := &GlobalAddressesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves an aggregated list of forwarding rules. +// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/aggregatedList +func (r *ForwardingRulesService) AggregatedList(project string) *ForwardingRulesAggregatedListCall { + c := &ForwardingRulesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.address = address + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *ForwardingRulesAggregatedListCall) Filter(filter string) *ForwardingRulesAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *ForwardingRulesAggregatedListCall) MaxResults(maxResults int64) *ForwardingRulesAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *ForwardingRulesAggregatedListCall) OrderBy(orderBy string) *ForwardingRulesAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *ForwardingRulesAggregatedListCall) PageToken(pageToken string) *ForwardingRulesAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalAddressesGetCall) Fields(s ...googleapi.Field) *GlobalAddressesGetCall { +func (c *ForwardingRulesAggregatedListCall) Fields(s ...googleapi.Field) *ForwardingRulesAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -22264,7 +23608,7 @@ func (c *GlobalAddressesGetCall) Fields(s ...googleapi.Field) *GlobalAddressesGe // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *GlobalAddressesGetCall) IfNoneMatch(entityTag string) *GlobalAddressesGetCall { +func (c *ForwardingRulesAggregatedListCall) IfNoneMatch(entityTag string) *ForwardingRulesAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -22272,21 +23616,21 @@ func (c *GlobalAddressesGetCall) IfNoneMatch(entityTag string) *GlobalAddressesG // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalAddressesGetCall) Context(ctx context.Context) *GlobalAddressesGetCall { +func (c *ForwardingRulesAggregatedListCall) Context(ctx context.Context) *ForwardingRulesAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalAddressesGetCall) Header() http.Header { +func (c *ForwardingRulesAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalAddressesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *ForwardingRulesAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -22297,25 +23641,24 @@ func (c *GlobalAddressesGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{address}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/forwardingRules") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "address": c.address, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalAddresses.get" call. -// Exactly one of *Address or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Address.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *GlobalAddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, error) { +// Do executes the "compute.forwardingRules.aggregatedList" call. +// Exactly one of *ForwardingRuleAggregatedList or error will be +// non-nil. Any non-2xx status code is an error. Response headers are in +// either *ForwardingRuleAggregatedList.ServerResponse.Header or (if a +// response was returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ForwardingRulesAggregatedListCall) Do(opts ...googleapi.CallOption) (*ForwardingRuleAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -22334,7 +23677,7 @@ func (c *GlobalAddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, err if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Address{ + ret := &ForwardingRuleAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -22346,19 +23689,34 @@ func (c *GlobalAddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, err } return ret, nil // { - // "description": "Returns the specified address resource. Get a list of available addresses by making a list() request.", + // "description": "Retrieves an aggregated list of forwarding rules.", // "httpMethod": "GET", - // "id": "compute.globalAddresses.get", + // "id": "compute.forwardingRules.aggregatedList", // "parameterOrder": [ - // "project", - // "address" + // "project" // ], // "parameters": { - // "address": { - // "description": "Name of the address resource to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", // "type": "string" // }, // "project": { @@ -22369,378 +23727,9 @@ func (c *GlobalAddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, err // "type": "string" // } // }, - // "path": "{project}/global/addresses/{address}", + // "path": "{project}/aggregated/forwardingRules", // "response": { - // "$ref": "Address" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" - // ] - // } - -} - -// method id "compute.globalAddresses.insert": - -type GlobalAddressesInsertCall struct { - s *Service - project string - address *Address - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Insert: Creates an address resource in the specified project using -// the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalAddresses/insert -func (r *GlobalAddressesService) Insert(project string, address *Address) *GlobalAddressesInsertCall { - c := &GlobalAddressesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.address = address - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *GlobalAddressesInsertCall) Fields(s ...googleapi.Field) *GlobalAddressesInsertCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *GlobalAddressesInsertCall) Context(ctx context.Context) *GlobalAddressesInsertCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *GlobalAddressesInsertCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *GlobalAddressesInsertCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.address) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.globalAddresses.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *GlobalAddressesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Creates an address resource in the specified project using the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.globalAddresses.insert", - // "parameterOrder": [ - // "project" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/addresses", - // "request": { - // "$ref": "Address" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.globalAddresses.list": - -type GlobalAddressesListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} - -// List: Retrieves a list of global addresses. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalAddresses/list -func (r *GlobalAddressesService) List(project string) *GlobalAddressesListCall { - c := &GlobalAddressesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *GlobalAddressesListCall) Filter(filter string) *GlobalAddressesListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *GlobalAddressesListCall) MaxResults(maxResults int64) *GlobalAddressesListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *GlobalAddressesListCall) OrderBy(orderBy string) *GlobalAddressesListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *GlobalAddressesListCall) PageToken(pageToken string) *GlobalAddressesListCall { - c.urlParams_.Set("pageToken", pageToken) - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *GlobalAddressesListCall) Fields(s ...googleapi.Field) *GlobalAddressesListCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *GlobalAddressesListCall) IfNoneMatch(entityTag string) *GlobalAddressesListCall { - c.ifNoneMatch_ = entityTag - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *GlobalAddressesListCall) Context(ctx context.Context) *GlobalAddressesListCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *GlobalAddressesListCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *GlobalAddressesListCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.globalAddresses.list" call. -// Exactly one of *AddressList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *AddressList.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *GlobalAddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &AddressList{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Retrieves a list of global addresses.", - // "httpMethod": "GET", - // "id": "compute.globalAddresses.list", - // "parameterOrder": [ - // "project" - // ], - // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/addresses", - // "response": { - // "$ref": "AddressList" + // "$ref": "ForwardingRuleAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -22754,7 +23743,7 @@ func (c *GlobalAddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *GlobalAddressesListCall) Pages(ctx context.Context, f func(*AddressList) error) error { +func (c *ForwardingRulesAggregatedListCall) Pages(ctx context.Context, f func(*ForwardingRuleAggregatedList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -22772,22 +23761,24 @@ func (c *GlobalAddressesListCall) Pages(ctx context.Context, f func(*AddressList } } -// method id "compute.globalForwardingRules.delete": +// method id "compute.forwardingRules.delete": -type GlobalForwardingRulesDeleteCall struct { +type ForwardingRulesDeleteCall struct { s *Service project string + region string forwardingRule string urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Delete: Deletes the specified GlobalForwardingRule resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/delete -func (r *GlobalForwardingRulesService) Delete(project string, forwardingRule string) *GlobalForwardingRulesDeleteCall { - c := &GlobalForwardingRulesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified ForwardingRule resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/delete +func (r *ForwardingRulesService) Delete(project string, region string, forwardingRule string) *ForwardingRulesDeleteCall { + c := &ForwardingRulesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.region = region c.forwardingRule = forwardingRule return c } @@ -22795,7 +23786,7 @@ func (r *GlobalForwardingRulesService) Delete(project string, forwardingRule str // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalForwardingRulesDeleteCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesDeleteCall { +func (c *ForwardingRulesDeleteCall) Fields(s ...googleapi.Field) *ForwardingRulesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -22803,21 +23794,21 @@ func (c *GlobalForwardingRulesDeleteCall) Fields(s ...googleapi.Field) *GlobalFo // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalForwardingRulesDeleteCall) Context(ctx context.Context) *GlobalForwardingRulesDeleteCall { +func (c *ForwardingRulesDeleteCall) Context(ctx context.Context) *ForwardingRulesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalForwardingRulesDeleteCall) Header() http.Header { +func (c *ForwardingRulesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalForwardingRulesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *ForwardingRulesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -22825,25 +23816,26 @@ func (c *GlobalForwardingRulesDeleteCall) doRequest(alt string) (*http.Response, reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "region": c.region, "forwardingRule": c.forwardingRule, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalForwardingRules.delete" call. +// Do executes the "compute.forwardingRules.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *GlobalForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -22874,11 +23866,12 @@ func (c *GlobalForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Deletes the specified GlobalForwardingRule resource.", + // "description": "Deletes the specified ForwardingRule resource.", // "httpMethod": "DELETE", - // "id": "compute.globalForwardingRules.delete", + // "id": "compute.forwardingRules.delete", // "parameterOrder": [ // "project", + // "region", // "forwardingRule" // ], // "parameters": { @@ -22895,9 +23888,16 @@ func (c *GlobalForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/forwardingRules/{forwardingRule}", + // "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}", // "response": { // "$ref": "Operation" // }, @@ -22909,11 +23909,12 @@ func (c *GlobalForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.globalForwardingRules.get": +// method id "compute.forwardingRules.get": -type GlobalForwardingRulesGetCall struct { +type ForwardingRulesGetCall struct { s *Service project string + region string forwardingRule string urlParams_ gensupport.URLParams ifNoneMatch_ string @@ -22921,12 +23922,12 @@ type GlobalForwardingRulesGetCall struct { header_ http.Header } -// Get: Returns the specified GlobalForwardingRule resource. Get a list -// of available forwarding rules by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/get -func (r *GlobalForwardingRulesService) Get(project string, forwardingRule string) *GlobalForwardingRulesGetCall { - c := &GlobalForwardingRulesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified ForwardingRule resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/get +func (r *ForwardingRulesService) Get(project string, region string, forwardingRule string) *ForwardingRulesGetCall { + c := &ForwardingRulesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.region = region c.forwardingRule = forwardingRule return c } @@ -22934,7 +23935,7 @@ func (r *GlobalForwardingRulesService) Get(project string, forwardingRule string // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalForwardingRulesGetCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesGetCall { +func (c *ForwardingRulesGetCall) Fields(s ...googleapi.Field) *ForwardingRulesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -22944,7 +23945,7 @@ func (c *GlobalForwardingRulesGetCall) Fields(s ...googleapi.Field) *GlobalForwa // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *GlobalForwardingRulesGetCall) IfNoneMatch(entityTag string) *GlobalForwardingRulesGetCall { +func (c *ForwardingRulesGetCall) IfNoneMatch(entityTag string) *ForwardingRulesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -22952,21 +23953,21 @@ func (c *GlobalForwardingRulesGetCall) IfNoneMatch(entityTag string) *GlobalForw // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalForwardingRulesGetCall) Context(ctx context.Context) *GlobalForwardingRulesGetCall { +func (c *ForwardingRulesGetCall) Context(ctx context.Context) *ForwardingRulesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalForwardingRulesGetCall) Header() http.Header { +func (c *ForwardingRulesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalForwardingRulesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *ForwardingRulesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -22977,25 +23978,26 @@ func (c *GlobalForwardingRulesGetCall) doRequest(alt string) (*http.Response, er } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "region": c.region, "forwardingRule": c.forwardingRule, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalForwardingRules.get" call. +// Do executes the "compute.forwardingRules.get" call. // Exactly one of *ForwardingRule or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *ForwardingRule.ServerResponse.Header or (if a response was returned // at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *GlobalForwardingRulesGetCall) Do(opts ...googleapi.CallOption) (*ForwardingRule, error) { +func (c *ForwardingRulesGetCall) Do(opts ...googleapi.CallOption) (*ForwardingRule, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -23026,11 +24028,12 @@ func (c *GlobalForwardingRulesGetCall) Do(opts ...googleapi.CallOption) (*Forwar } return ret, nil // { - // "description": "Returns the specified GlobalForwardingRule resource. Get a list of available forwarding rules by making a list() request.", + // "description": "Returns the specified ForwardingRule resource.", // "httpMethod": "GET", - // "id": "compute.globalForwardingRules.get", + // "id": "compute.forwardingRules.get", // "parameterOrder": [ // "project", + // "region", // "forwardingRule" // ], // "parameters": { @@ -23047,9 +24050,16 @@ func (c *GlobalForwardingRulesGetCall) Do(opts ...googleapi.CallOption) (*Forwar // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/forwardingRules/{forwardingRule}", + // "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}", // "response": { // "$ref": "ForwardingRule" // }, @@ -23062,23 +24072,25 @@ func (c *GlobalForwardingRulesGetCall) Do(opts ...googleapi.CallOption) (*Forwar } -// method id "compute.globalForwardingRules.insert": +// method id "compute.forwardingRules.insert": -type GlobalForwardingRulesInsertCall struct { +type ForwardingRulesInsertCall struct { s *Service project string + region string forwardingrule *ForwardingRule urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Insert: Creates a GlobalForwardingRule resource in the specified -// project using the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/insert -func (r *GlobalForwardingRulesService) Insert(project string, forwardingrule *ForwardingRule) *GlobalForwardingRulesInsertCall { - c := &GlobalForwardingRulesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a ForwardingRule resource in the specified project +// and region using the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/insert +func (r *ForwardingRulesService) Insert(project string, region string, forwardingrule *ForwardingRule) *ForwardingRulesInsertCall { + c := &ForwardingRulesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.region = region c.forwardingrule = forwardingrule return c } @@ -23086,7 +24098,7 @@ func (r *GlobalForwardingRulesService) Insert(project string, forwardingrule *Fo // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalForwardingRulesInsertCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesInsertCall { +func (c *ForwardingRulesInsertCall) Fields(s ...googleapi.Field) *ForwardingRulesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -23094,21 +24106,21 @@ func (c *GlobalForwardingRulesInsertCall) Fields(s ...googleapi.Field) *GlobalFo // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalForwardingRulesInsertCall) Context(ctx context.Context) *GlobalForwardingRulesInsertCall { +func (c *ForwardingRulesInsertCall) Context(ctx context.Context) *ForwardingRulesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalForwardingRulesInsertCall) Header() http.Header { +func (c *ForwardingRulesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalForwardingRulesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *ForwardingRulesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -23121,24 +24133,25 @@ func (c *GlobalForwardingRulesInsertCall) doRequest(alt string) (*http.Response, } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalForwardingRules.insert" call. +// Do executes the "compute.forwardingRules.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *GlobalForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -23169,11 +24182,12 @@ func (c *GlobalForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Creates a GlobalForwardingRule resource in the specified project using the data included in the request.", + // "description": "Creates a ForwardingRule resource in the specified project and region using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.globalForwardingRules.insert", + // "id": "compute.forwardingRules.insert", // "parameterOrder": [ - // "project" + // "project", + // "region" // ], // "parameters": { // "project": { @@ -23182,9 +24196,16 @@ func (c *GlobalForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/forwardingRules", + // "path": "{project}/regions/{region}/forwardingRules", // "request": { // "$ref": "ForwardingRule" // }, @@ -23199,30 +24220,31 @@ func (c *GlobalForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.globalForwardingRules.list": +// method id "compute.forwardingRules.list": -type GlobalForwardingRulesListCall struct { +type ForwardingRulesListCall struct { s *Service project string + region string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of GlobalForwardingRule resources available to -// the specified project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/list -func (r *GlobalForwardingRulesService) List(project string) *GlobalForwardingRulesListCall { - c := &GlobalForwardingRulesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of ForwardingRule resources available to the +// specified project and region. +// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/list +func (r *ForwardingRulesService) List(project string, region string) *ForwardingRulesListCall { + c := &ForwardingRulesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -23234,7 +24256,7 @@ func (r *GlobalForwardingRulesService) List(project string) *GlobalForwardingRul // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -23246,7 +24268,7 @@ func (r *GlobalForwardingRulesService) List(project string) *GlobalForwardingRul // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *GlobalForwardingRulesListCall) Filter(filter string) *GlobalForwardingRulesListCall { +func (c *ForwardingRulesListCall) Filter(filter string) *ForwardingRulesListCall { c.urlParams_.Set("filter", filter) return c } @@ -23257,7 +24279,7 @@ func (c *GlobalForwardingRulesListCall) Filter(filter string) *GlobalForwardingR // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *GlobalForwardingRulesListCall) MaxResults(maxResults int64) *GlobalForwardingRulesListCall { +func (c *ForwardingRulesListCall) MaxResults(maxResults int64) *ForwardingRulesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -23274,7 +24296,7 @@ func (c *GlobalForwardingRulesListCall) MaxResults(maxResults int64) *GlobalForw // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *GlobalForwardingRulesListCall) OrderBy(orderBy string) *GlobalForwardingRulesListCall { +func (c *ForwardingRulesListCall) OrderBy(orderBy string) *ForwardingRulesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -23282,7 +24304,7 @@ func (c *GlobalForwardingRulesListCall) OrderBy(orderBy string) *GlobalForwardin // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *GlobalForwardingRulesListCall) PageToken(pageToken string) *GlobalForwardingRulesListCall { +func (c *ForwardingRulesListCall) PageToken(pageToken string) *ForwardingRulesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -23290,7 +24312,7 @@ func (c *GlobalForwardingRulesListCall) PageToken(pageToken string) *GlobalForwa // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalForwardingRulesListCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesListCall { +func (c *ForwardingRulesListCall) Fields(s ...googleapi.Field) *ForwardingRulesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -23300,7 +24322,7 @@ func (c *GlobalForwardingRulesListCall) Fields(s ...googleapi.Field) *GlobalForw // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *GlobalForwardingRulesListCall) IfNoneMatch(entityTag string) *GlobalForwardingRulesListCall { +func (c *ForwardingRulesListCall) IfNoneMatch(entityTag string) *ForwardingRulesListCall { c.ifNoneMatch_ = entityTag return c } @@ -23308,21 +24330,21 @@ func (c *GlobalForwardingRulesListCall) IfNoneMatch(entityTag string) *GlobalFor // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalForwardingRulesListCall) Context(ctx context.Context) *GlobalForwardingRulesListCall { +func (c *ForwardingRulesListCall) Context(ctx context.Context) *ForwardingRulesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalForwardingRulesListCall) Header() http.Header { +func (c *ForwardingRulesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalForwardingRulesListCall) doRequest(alt string) (*http.Response, error) { +func (c *ForwardingRulesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -23333,24 +24355,25 @@ func (c *GlobalForwardingRulesListCall) doRequest(alt string) (*http.Response, e } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalForwardingRules.list" call. +// Do executes the "compute.forwardingRules.list" call. // Exactly one of *ForwardingRuleList or error will be non-nil. Any // non-2xx status code is an error. Response headers are in either // *ForwardingRuleList.ServerResponse.Header or (if a response was // returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *GlobalForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingRuleList, error) { +func (c *ForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingRuleList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -23381,15 +24404,16 @@ func (c *GlobalForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*Forwa } return ret, nil // { - // "description": "Retrieves a list of GlobalForwardingRule resources available to the specified project.", + // "description": "Retrieves a list of ForwardingRule resources available to the specified project and region.", // "httpMethod": "GET", - // "id": "compute.globalForwardingRules.list", + // "id": "compute.forwardingRules.list", // "parameterOrder": [ - // "project" + // "project", + // "region" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -23417,9 +24441,16 @@ func (c *GlobalForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*Forwa // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/forwardingRules", + // "path": "{project}/regions/{region}/forwardingRules", // "response": { // "$ref": "ForwardingRuleList" // }, @@ -23435,7 +24466,7 @@ func (c *GlobalForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*Forwa // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *GlobalForwardingRulesListCall) Pages(ctx context.Context, f func(*ForwardingRuleList) error) error { +func (c *ForwardingRulesListCall) Pages(ctx context.Context, f func(*ForwardingRuleList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -23453,11 +24484,12 @@ func (c *GlobalForwardingRulesListCall) Pages(ctx context.Context, f func(*Forwa } } -// method id "compute.globalForwardingRules.setTarget": +// method id "compute.forwardingRules.setTarget": -type GlobalForwardingRulesSetTargetCall struct { +type ForwardingRulesSetTargetCall struct { s *Service project string + region string forwardingRule string targetreference *TargetReference urlParams_ gensupport.URLParams @@ -23465,12 +24497,13 @@ type GlobalForwardingRulesSetTargetCall struct { header_ http.Header } -// SetTarget: Changes target URL for the GlobalForwardingRule resource. -// The new target should be of the same type as the old target. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/setTarget -func (r *GlobalForwardingRulesService) SetTarget(project string, forwardingRule string, targetreference *TargetReference) *GlobalForwardingRulesSetTargetCall { - c := &GlobalForwardingRulesSetTargetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetTarget: Changes target URL for forwarding rule. The new target +// should be of the same type as the old target. +// For details, see https://cloud.google.com/compute/docs/reference/latest/forwardingRules/setTarget +func (r *ForwardingRulesService) SetTarget(project string, region string, forwardingRule string, targetreference *TargetReference) *ForwardingRulesSetTargetCall { + c := &ForwardingRulesSetTargetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.region = region c.forwardingRule = forwardingRule c.targetreference = targetreference return c @@ -23479,7 +24512,7 @@ func (r *GlobalForwardingRulesService) SetTarget(project string, forwardingRule // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalForwardingRulesSetTargetCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesSetTargetCall { +func (c *ForwardingRulesSetTargetCall) Fields(s ...googleapi.Field) *ForwardingRulesSetTargetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -23487,21 +24520,21 @@ func (c *GlobalForwardingRulesSetTargetCall) Fields(s ...googleapi.Field) *Globa // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalForwardingRulesSetTargetCall) Context(ctx context.Context) *GlobalForwardingRulesSetTargetCall { +func (c *ForwardingRulesSetTargetCall) Context(ctx context.Context) *ForwardingRulesSetTargetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalForwardingRulesSetTargetCall) Header() http.Header { +func (c *ForwardingRulesSetTargetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalForwardingRulesSetTargetCall) doRequest(alt string) (*http.Response, error) { +func (c *ForwardingRulesSetTargetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -23514,25 +24547,26 @@ func (c *GlobalForwardingRulesSetTargetCall) doRequest(alt string) (*http.Respon } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}/setTarget") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "region": c.region, "forwardingRule": c.forwardingRule, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalForwardingRules.setTarget" call. +// Do executes the "compute.forwardingRules.setTarget" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *GlobalForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -23563,11 +24597,12 @@ func (c *GlobalForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (* } return ret, nil // { - // "description": "Changes target URL for the GlobalForwardingRule resource. The new target should be of the same type as the old target.", + // "description": "Changes target URL for forwarding rule. The new target should be of the same type as the old target.", // "httpMethod": "POST", - // "id": "compute.globalForwardingRules.setTarget", + // "id": "compute.forwardingRules.setTarget", // "parameterOrder": [ // "project", + // "region", // "forwardingRule" // ], // "parameters": { @@ -23584,9 +24619,16 @@ func (c *GlobalForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (* // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/forwardingRules/{forwardingRule}/setTarget", + // "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget", // "request": { // "$ref": "TargetReference" // }, @@ -23601,157 +24643,78 @@ func (c *GlobalForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (* } -// method id "compute.globalOperations.aggregatedList": +// method id "compute.globalAddresses.delete": -type GlobalOperationsAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type GlobalAddressesDeleteCall struct { + s *Service + project string + address string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves an aggregated list of all operations. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalOperations/aggregatedList -func (r *GlobalOperationsService) AggregatedList(project string) *GlobalOperationsAggregatedListCall { - c := &GlobalOperationsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified address resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalAddresses/delete +func (r *GlobalAddressesService) Delete(project string, address string) *GlobalAddressesDeleteCall { + c := &GlobalAddressesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *GlobalOperationsAggregatedListCall) Filter(filter string) *GlobalOperationsAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *GlobalOperationsAggregatedListCall) MaxResults(maxResults int64) *GlobalOperationsAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *GlobalOperationsAggregatedListCall) OrderBy(orderBy string) *GlobalOperationsAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *GlobalOperationsAggregatedListCall) PageToken(pageToken string) *GlobalOperationsAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) + c.address = address return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalOperationsAggregatedListCall) Fields(s ...googleapi.Field) *GlobalOperationsAggregatedListCall { +func (c *GlobalAddressesDeleteCall) Fields(s ...googleapi.Field) *GlobalAddressesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *GlobalOperationsAggregatedListCall) IfNoneMatch(entityTag string) *GlobalOperationsAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalOperationsAggregatedListCall) Context(ctx context.Context) *GlobalOperationsAggregatedListCall { +func (c *GlobalAddressesDeleteCall) Context(ctx context.Context) *GlobalAddressesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalOperationsAggregatedListCall) Header() http.Header { +func (c *GlobalAddressesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalOperationsAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalAddressesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/operations") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{address}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "address": c.address, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalOperations.aggregatedList" call. -// Exactly one of *OperationAggregatedList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *OperationAggregatedList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *GlobalOperationsAggregatedListCall) Do(opts ...googleapi.CallOption) (*OperationAggregatedList, error) { +// Do executes the "compute.globalAddresses.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *GlobalAddressesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -23770,7 +24733,7 @@ func (c *GlobalOperationsAggregatedListCall) Do(opts ...googleapi.CallOption) (* if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &OperationAggregatedList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -23782,34 +24745,19 @@ func (c *GlobalOperationsAggregatedListCall) Do(opts ...googleapi.CallOption) (* } return ret, nil // { - // "description": "Retrieves an aggregated list of all operations.", - // "httpMethod": "GET", - // "id": "compute.globalOperations.aggregatedList", + // "description": "Deletes the specified address resource.", + // "httpMethod": "DELETE", + // "id": "compute.globalAddresses.delete", // "parameterOrder": [ - // "project" + // "project", + // "address" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "address": { + // "description": "Name of the address resource to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { @@ -23820,127 +24768,145 @@ func (c *GlobalOperationsAggregatedListCall) Do(opts ...googleapi.CallOption) (* // "type": "string" // } // }, - // "path": "{project}/aggregated/operations", + // "path": "{project}/global/addresses/{address}", // "response": { - // "$ref": "OperationAggregatedList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *GlobalOperationsAggregatedListCall) Pages(ctx context.Context, f func(*OperationAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.globalOperations.delete": +// method id "compute.globalAddresses.get": -type GlobalOperationsDeleteCall struct { - s *Service - project string - operation string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type GlobalAddressesGetCall struct { + s *Service + project string + address string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified Operations resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalOperations/delete -func (r *GlobalOperationsService) Delete(project string, operation string) *GlobalOperationsDeleteCall { - c := &GlobalOperationsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified address resource. Get a list of available +// addresses by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalAddresses/get +func (r *GlobalAddressesService) Get(project string, address string) *GlobalAddressesGetCall { + c := &GlobalAddressesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.operation = operation + c.address = address return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalOperationsDeleteCall) Fields(s ...googleapi.Field) *GlobalOperationsDeleteCall { +func (c *GlobalAddressesGetCall) Fields(s ...googleapi.Field) *GlobalAddressesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *GlobalAddressesGetCall) IfNoneMatch(entityTag string) *GlobalAddressesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalOperationsDeleteCall) Context(ctx context.Context) *GlobalOperationsDeleteCall { +func (c *GlobalAddressesGetCall) Context(ctx context.Context) *GlobalAddressesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalOperationsDeleteCall) Header() http.Header { +func (c *GlobalAddressesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalOperationsDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalAddressesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{address}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "operation": c.operation, + "project": c.project, + "address": c.address, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalOperations.delete" call. -func (c *GlobalOperationsDeleteCall) Do(opts ...googleapi.CallOption) error { +// Do executes the "compute.globalAddresses.get" call. +// Exactly one of *Address or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Address.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *GlobalAddressesGetCall) Do(opts ...googleapi.CallOption) (*Address, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } if err != nil { - return err + return nil, err } defer googleapi.CloseBody(res) if err := googleapi.CheckResponse(res); err != nil { - return err + return nil, err } - return nil + ret := &Address{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil // { - // "description": "Deletes the specified Operations resource.", - // "httpMethod": "DELETE", - // "id": "compute.globalOperations.delete", + // "description": "Returns the specified address resource. Get a list of available addresses by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.globalAddresses.get", // "parameterOrder": [ // "project", - // "operation" + // "address" // ], // "parameters": { - // "operation": { - // "description": "Name of the Operations resource to delete.", + // "address": { + // "description": "Name of the address resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -23954,102 +24920,96 @@ func (c *GlobalOperationsDeleteCall) Do(opts ...googleapi.CallOption) error { // "type": "string" // } // }, - // "path": "{project}/global/operations/{operation}", + // "path": "{project}/global/addresses/{address}", + // "response": { + // "$ref": "Address" + // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.globalOperations.get": +// method id "compute.globalAddresses.insert": -type GlobalOperationsGetCall struct { - s *Service - project string - operation string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type GlobalAddressesInsertCall struct { + s *Service + project string + address *Address + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Retrieves the specified Operations resource. Get a list of -// operations by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalOperations/get -func (r *GlobalOperationsService) Get(project string, operation string) *GlobalOperationsGetCall { - c := &GlobalOperationsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates an address resource in the specified project using +// the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalAddresses/insert +func (r *GlobalAddressesService) Insert(project string, address *Address) *GlobalAddressesInsertCall { + c := &GlobalAddressesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.operation = operation + c.address = address return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalOperationsGetCall) Fields(s ...googleapi.Field) *GlobalOperationsGetCall { +func (c *GlobalAddressesInsertCall) Fields(s ...googleapi.Field) *GlobalAddressesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *GlobalOperationsGetCall) IfNoneMatch(entityTag string) *GlobalOperationsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalOperationsGetCall) Context(ctx context.Context) *GlobalOperationsGetCall { +func (c *GlobalAddressesInsertCall) Context(ctx context.Context) *GlobalAddressesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalOperationsGetCall) Header() http.Header { +func (c *GlobalAddressesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalOperationsGetCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalAddressesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.address) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "operation": c.operation, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalOperations.get" call. +// Do executes the "compute.globalAddresses.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *GlobalOperationsGetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *GlobalAddressesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -24080,21 +25040,13 @@ func (c *GlobalOperationsGetCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Retrieves the specified Operations resource. Get a list of operations by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.globalOperations.get", + // "description": "Creates an address resource in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.globalAddresses.insert", // "parameterOrder": [ - // "project", - // "operation" + // "project" // ], // "parameters": { - // "operation": { - // "description": "Name of the Operations resource to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -24103,22 +25055,24 @@ func (c *GlobalOperationsGetCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // } // }, - // "path": "{project}/global/operations/{operation}", + // "path": "{project}/global/addresses", + // "request": { + // "$ref": "Address" + // }, // "response": { // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.globalOperations.list": +// method id "compute.globalAddresses.list": -type GlobalOperationsListCall struct { +type GlobalAddressesListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -24127,19 +25081,17 @@ type GlobalOperationsListCall struct { header_ http.Header } -// List: Retrieves a list of Operation resources contained within the -// specified project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/globalOperations/list -func (r *GlobalOperationsService) List(project string) *GlobalOperationsListCall { - c := &GlobalOperationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of global addresses. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalAddresses/list +func (r *GlobalAddressesService) List(project string) *GlobalAddressesListCall { + c := &GlobalAddressesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -24151,7 +25103,7 @@ func (r *GlobalOperationsService) List(project string) *GlobalOperationsListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -24163,7 +25115,7 @@ func (r *GlobalOperationsService) List(project string) *GlobalOperationsListCall // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *GlobalOperationsListCall) Filter(filter string) *GlobalOperationsListCall { +func (c *GlobalAddressesListCall) Filter(filter string) *GlobalAddressesListCall { c.urlParams_.Set("filter", filter) return c } @@ -24174,7 +25126,7 @@ func (c *GlobalOperationsListCall) Filter(filter string) *GlobalOperationsListCa // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *GlobalOperationsListCall) MaxResults(maxResults int64) *GlobalOperationsListCall { +func (c *GlobalAddressesListCall) MaxResults(maxResults int64) *GlobalAddressesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -24191,7 +25143,7 @@ func (c *GlobalOperationsListCall) MaxResults(maxResults int64) *GlobalOperation // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *GlobalOperationsListCall) OrderBy(orderBy string) *GlobalOperationsListCall { +func (c *GlobalAddressesListCall) OrderBy(orderBy string) *GlobalAddressesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -24199,7 +25151,7 @@ func (c *GlobalOperationsListCall) OrderBy(orderBy string) *GlobalOperationsList // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *GlobalOperationsListCall) PageToken(pageToken string) *GlobalOperationsListCall { +func (c *GlobalAddressesListCall) PageToken(pageToken string) *GlobalAddressesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -24207,7 +25159,7 @@ func (c *GlobalOperationsListCall) PageToken(pageToken string) *GlobalOperations // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *GlobalOperationsListCall) Fields(s ...googleapi.Field) *GlobalOperationsListCall { +func (c *GlobalAddressesListCall) Fields(s ...googleapi.Field) *GlobalAddressesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -24217,7 +25169,7 @@ func (c *GlobalOperationsListCall) Fields(s ...googleapi.Field) *GlobalOperation // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *GlobalOperationsListCall) IfNoneMatch(entityTag string) *GlobalOperationsListCall { +func (c *GlobalAddressesListCall) IfNoneMatch(entityTag string) *GlobalAddressesListCall { c.ifNoneMatch_ = entityTag return c } @@ -24225,21 +25177,21 @@ func (c *GlobalOperationsListCall) IfNoneMatch(entityTag string) *GlobalOperatio // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *GlobalOperationsListCall) Context(ctx context.Context) *GlobalOperationsListCall { +func (c *GlobalAddressesListCall) Context(ctx context.Context) *GlobalAddressesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *GlobalOperationsListCall) Header() http.Header { +func (c *GlobalAddressesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *GlobalOperationsListCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalAddressesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -24250,7 +25202,7 @@ func (c *GlobalOperationsListCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -24260,14 +25212,14 @@ func (c *GlobalOperationsListCall) doRequest(alt string) (*http.Response, error) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.globalOperations.list" call. -// Exactly one of *OperationList or error will be non-nil. Any non-2xx +// Do executes the "compute.globalAddresses.list" call. +// Exactly one of *AddressList or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *OperationList.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *GlobalOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationList, error) { +// *AddressList.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *GlobalAddressesListCall) Do(opts ...googleapi.CallOption) (*AddressList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -24286,7 +25238,7 @@ func (c *GlobalOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &OperationList{ + ret := &AddressList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -24298,15 +25250,15 @@ func (c *GlobalOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL } return ret, nil // { - // "description": "Retrieves a list of Operation resources contained within the specified project.", + // "description": "Retrieves a list of global addresses.", // "httpMethod": "GET", - // "id": "compute.globalOperations.list", + // "id": "compute.globalAddresses.list", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -24336,9 +25288,9 @@ func (c *GlobalOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL // "type": "string" // } // }, - // "path": "{project}/global/operations", + // "path": "{project}/global/addresses", // "response": { - // "$ref": "OperationList" + // "$ref": "AddressList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -24352,7 +25304,7 @@ func (c *GlobalOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *GlobalOperationsListCall) Pages(ctx context.Context, f func(*OperationList) error) error { +func (c *GlobalAddressesListCall) Pages(ctx context.Context, f func(*AddressList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -24370,29 +25322,30 @@ func (c *GlobalOperationsListCall) Pages(ctx context.Context, f func(*OperationL } } -// method id "compute.healthChecks.delete": +// method id "compute.globalForwardingRules.delete": -type HealthChecksDeleteCall struct { - s *Service - project string - healthCheck string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type GlobalForwardingRulesDeleteCall struct { + s *Service + project string + forwardingRule string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified HealthCheck resource. -func (r *HealthChecksService) Delete(project string, healthCheck string) *HealthChecksDeleteCall { - c := &HealthChecksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified GlobalForwardingRule resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/delete +func (r *GlobalForwardingRulesService) Delete(project string, forwardingRule string) *GlobalForwardingRulesDeleteCall { + c := &GlobalForwardingRulesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.healthCheck = healthCheck + c.forwardingRule = forwardingRule return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HealthChecksDeleteCall) Fields(s ...googleapi.Field) *HealthChecksDeleteCall { +func (c *GlobalForwardingRulesDeleteCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -24400,21 +25353,21 @@ func (c *HealthChecksDeleteCall) Fields(s ...googleapi.Field) *HealthChecksDelet // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HealthChecksDeleteCall) Context(ctx context.Context) *HealthChecksDeleteCall { +func (c *GlobalForwardingRulesDeleteCall) Context(ctx context.Context) *GlobalForwardingRulesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HealthChecksDeleteCall) Header() http.Header { +func (c *GlobalForwardingRulesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HealthChecksDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalForwardingRulesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -24422,25 +25375,25 @@ func (c *HealthChecksDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "healthCheck": c.healthCheck, + "project": c.project, + "forwardingRule": c.forwardingRule, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.healthChecks.delete" call. +// Do executes the "compute.globalForwardingRules.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *HealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *GlobalForwardingRulesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -24471,16 +25424,16 @@ func (c *HealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, e } return ret, nil // { - // "description": "Deletes the specified HealthCheck resource.", + // "description": "Deletes the specified GlobalForwardingRule resource.", // "httpMethod": "DELETE", - // "id": "compute.healthChecks.delete", + // "id": "compute.globalForwardingRules.delete", // "parameterOrder": [ // "project", - // "healthCheck" + // "forwardingRule" // ], // "parameters": { - // "healthCheck": { - // "description": "Name of the HealthCheck resource to delete.", + // "forwardingRule": { + // "description": "Name of the ForwardingRule resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -24494,7 +25447,7 @@ func (c *HealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // } // }, - // "path": "{project}/global/healthChecks/{healthCheck}", + // "path": "{project}/global/forwardingRules/{forwardingRule}", // "response": { // "$ref": "Operation" // }, @@ -24506,31 +25459,32 @@ func (c *HealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, e } -// method id "compute.healthChecks.get": +// method id "compute.globalForwardingRules.get": -type HealthChecksGetCall struct { - s *Service - project string - healthCheck string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type GlobalForwardingRulesGetCall struct { + s *Service + project string + forwardingRule string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified HealthCheck resource. Get a list of -// available health checks by making a list() request. -func (r *HealthChecksService) Get(project string, healthCheck string) *HealthChecksGetCall { - c := &HealthChecksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified GlobalForwardingRule resource. Get a list +// of available forwarding rules by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/get +func (r *GlobalForwardingRulesService) Get(project string, forwardingRule string) *GlobalForwardingRulesGetCall { + c := &GlobalForwardingRulesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.healthCheck = healthCheck + c.forwardingRule = forwardingRule return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HealthChecksGetCall) Fields(s ...googleapi.Field) *HealthChecksGetCall { +func (c *GlobalForwardingRulesGetCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -24540,7 +25494,7 @@ func (c *HealthChecksGetCall) Fields(s ...googleapi.Field) *HealthChecksGetCall // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *HealthChecksGetCall) IfNoneMatch(entityTag string) *HealthChecksGetCall { +func (c *GlobalForwardingRulesGetCall) IfNoneMatch(entityTag string) *GlobalForwardingRulesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -24548,21 +25502,21 @@ func (c *HealthChecksGetCall) IfNoneMatch(entityTag string) *HealthChecksGetCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HealthChecksGetCall) Context(ctx context.Context) *HealthChecksGetCall { +func (c *GlobalForwardingRulesGetCall) Context(ctx context.Context) *GlobalForwardingRulesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HealthChecksGetCall) Header() http.Header { +func (c *GlobalForwardingRulesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HealthChecksGetCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalForwardingRulesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -24573,25 +25527,25 @@ func (c *HealthChecksGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "healthCheck": c.healthCheck, + "project": c.project, + "forwardingRule": c.forwardingRule, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.healthChecks.get" call. -// Exactly one of *HealthCheck or error will be non-nil. Any non-2xx +// Do executes the "compute.globalForwardingRules.get" call. +// Exactly one of *ForwardingRule or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *HealthCheck.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *HealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HealthCheck, error) { +// *ForwardingRule.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *GlobalForwardingRulesGetCall) Do(opts ...googleapi.CallOption) (*ForwardingRule, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -24610,7 +25564,7 @@ func (c *HealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HealthCheck, er if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &HealthCheck{ + ret := &ForwardingRule{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -24622,16 +25576,16 @@ func (c *HealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HealthCheck, er } return ret, nil // { - // "description": "Returns the specified HealthCheck resource. Get a list of available health checks by making a list() request.", + // "description": "Returns the specified GlobalForwardingRule resource. Get a list of available forwarding rules by making a list() request.", // "httpMethod": "GET", - // "id": "compute.healthChecks.get", + // "id": "compute.globalForwardingRules.get", // "parameterOrder": [ // "project", - // "healthCheck" + // "forwardingRule" // ], // "parameters": { - // "healthCheck": { - // "description": "Name of the HealthCheck resource to return.", + // "forwardingRule": { + // "description": "Name of the ForwardingRule resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -24645,9 +25599,9 @@ func (c *HealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HealthCheck, er // "type": "string" // } // }, - // "path": "{project}/global/healthChecks/{healthCheck}", + // "path": "{project}/global/forwardingRules/{forwardingRule}", // "response": { - // "$ref": "HealthCheck" + // "$ref": "ForwardingRule" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -24658,30 +25612,31 @@ func (c *HealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HealthCheck, er } -// method id "compute.healthChecks.insert": +// method id "compute.globalForwardingRules.insert": -type HealthChecksInsertCall struct { - s *Service - project string - healthcheck *HealthCheck - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type GlobalForwardingRulesInsertCall struct { + s *Service + project string + forwardingrule *ForwardingRule + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates a HealthCheck resource in the specified project using -// the data included in the request. -func (r *HealthChecksService) Insert(project string, healthcheck *HealthCheck) *HealthChecksInsertCall { - c := &HealthChecksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a GlobalForwardingRule resource in the specified +// project using the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/insert +func (r *GlobalForwardingRulesService) Insert(project string, forwardingrule *ForwardingRule) *GlobalForwardingRulesInsertCall { + c := &GlobalForwardingRulesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.healthcheck = healthcheck + c.forwardingrule = forwardingrule return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HealthChecksInsertCall) Fields(s ...googleapi.Field) *HealthChecksInsertCall { +func (c *GlobalForwardingRulesInsertCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -24689,34 +25644,34 @@ func (c *HealthChecksInsertCall) Fields(s ...googleapi.Field) *HealthChecksInser // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HealthChecksInsertCall) Context(ctx context.Context) *HealthChecksInsertCall { +func (c *GlobalForwardingRulesInsertCall) Context(ctx context.Context) *GlobalForwardingRulesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HealthChecksInsertCall) Header() http.Header { +func (c *GlobalForwardingRulesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HealthChecksInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalForwardingRulesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -24726,14 +25681,14 @@ func (c *HealthChecksInsertCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.healthChecks.insert" call. +// Do executes the "compute.globalForwardingRules.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *HealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *GlobalForwardingRulesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -24764,9 +25719,9 @@ func (c *HealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, e } return ret, nil // { - // "description": "Creates a HealthCheck resource in the specified project using the data included in the request.", + // "description": "Creates a GlobalForwardingRule resource in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.healthChecks.insert", + // "id": "compute.globalForwardingRules.insert", // "parameterOrder": [ // "project" // ], @@ -24779,9 +25734,9 @@ func (c *HealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // } // }, - // "path": "{project}/global/healthChecks", + // "path": "{project}/global/forwardingRules", // "request": { - // "$ref": "HealthCheck" + // "$ref": "ForwardingRule" // }, // "response": { // "$ref": "Operation" @@ -24794,9 +25749,9 @@ func (c *HealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, e } -// method id "compute.healthChecks.list": +// method id "compute.globalForwardingRules.list": -type HealthChecksListCall struct { +type GlobalForwardingRulesListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -24805,18 +25760,18 @@ type HealthChecksListCall struct { header_ http.Header } -// List: Retrieves the list of HealthCheck resources available to the -// specified project. -func (r *HealthChecksService) List(project string) *HealthChecksListCall { - c := &HealthChecksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of GlobalForwardingRule resources available to +// the specified project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/list +func (r *GlobalForwardingRulesService) List(project string) *GlobalForwardingRulesListCall { + c := &GlobalForwardingRulesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -24828,7 +25783,7 @@ func (r *HealthChecksService) List(project string) *HealthChecksListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -24840,7 +25795,7 @@ func (r *HealthChecksService) List(project string) *HealthChecksListCall { // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *HealthChecksListCall) Filter(filter string) *HealthChecksListCall { +func (c *GlobalForwardingRulesListCall) Filter(filter string) *GlobalForwardingRulesListCall { c.urlParams_.Set("filter", filter) return c } @@ -24851,7 +25806,7 @@ func (c *HealthChecksListCall) Filter(filter string) *HealthChecksListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *HealthChecksListCall) MaxResults(maxResults int64) *HealthChecksListCall { +func (c *GlobalForwardingRulesListCall) MaxResults(maxResults int64) *GlobalForwardingRulesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -24868,7 +25823,7 @@ func (c *HealthChecksListCall) MaxResults(maxResults int64) *HealthChecksListCal // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *HealthChecksListCall) OrderBy(orderBy string) *HealthChecksListCall { +func (c *GlobalForwardingRulesListCall) OrderBy(orderBy string) *GlobalForwardingRulesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -24876,7 +25831,7 @@ func (c *HealthChecksListCall) OrderBy(orderBy string) *HealthChecksListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *HealthChecksListCall) PageToken(pageToken string) *HealthChecksListCall { +func (c *GlobalForwardingRulesListCall) PageToken(pageToken string) *GlobalForwardingRulesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -24884,7 +25839,7 @@ func (c *HealthChecksListCall) PageToken(pageToken string) *HealthChecksListCall // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HealthChecksListCall) Fields(s ...googleapi.Field) *HealthChecksListCall { +func (c *GlobalForwardingRulesListCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -24894,7 +25849,7 @@ func (c *HealthChecksListCall) Fields(s ...googleapi.Field) *HealthChecksListCal // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *HealthChecksListCall) IfNoneMatch(entityTag string) *HealthChecksListCall { +func (c *GlobalForwardingRulesListCall) IfNoneMatch(entityTag string) *GlobalForwardingRulesListCall { c.ifNoneMatch_ = entityTag return c } @@ -24902,21 +25857,21 @@ func (c *HealthChecksListCall) IfNoneMatch(entityTag string) *HealthChecksListCa // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HealthChecksListCall) Context(ctx context.Context) *HealthChecksListCall { +func (c *GlobalForwardingRulesListCall) Context(ctx context.Context) *GlobalForwardingRulesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HealthChecksListCall) Header() http.Header { +func (c *GlobalForwardingRulesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HealthChecksListCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalForwardingRulesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -24927,7 +25882,7 @@ func (c *HealthChecksListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -24937,14 +25892,14 @@ func (c *HealthChecksListCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.healthChecks.list" call. -// Exactly one of *HealthCheckList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *HealthCheckList.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.globalForwardingRules.list" call. +// Exactly one of *ForwardingRuleList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *ForwardingRuleList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *HealthChecksListCall) Do(opts ...googleapi.CallOption) (*HealthCheckList, error) { +func (c *GlobalForwardingRulesListCall) Do(opts ...googleapi.CallOption) (*ForwardingRuleList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -24963,7 +25918,7 @@ func (c *HealthChecksListCall) Do(opts ...googleapi.CallOption) (*HealthCheckLis if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &HealthCheckList{ + ret := &ForwardingRuleList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -24975,15 +25930,15 @@ func (c *HealthChecksListCall) Do(opts ...googleapi.CallOption) (*HealthCheckLis } return ret, nil // { - // "description": "Retrieves the list of HealthCheck resources available to the specified project.", + // "description": "Retrieves a list of GlobalForwardingRule resources available to the specified project.", // "httpMethod": "GET", - // "id": "compute.healthChecks.list", + // "id": "compute.globalForwardingRules.list", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -25013,9 +25968,9 @@ func (c *HealthChecksListCall) Do(opts ...googleapi.CallOption) (*HealthCheckLis // "type": "string" // } // }, - // "path": "{project}/global/healthChecks", + // "path": "{project}/global/forwardingRules", // "response": { - // "$ref": "HealthCheckList" + // "$ref": "ForwardingRuleList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -25029,7 +25984,7 @@ func (c *HealthChecksListCall) Do(opts ...googleapi.CallOption) (*HealthCheckLis // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *HealthChecksListCall) Pages(ctx context.Context, f func(*HealthCheckList) error) error { +func (c *GlobalForwardingRulesListCall) Pages(ctx context.Context, f func(*ForwardingRuleList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -25047,33 +26002,33 @@ func (c *HealthChecksListCall) Pages(ctx context.Context, f func(*HealthCheckLis } } -// method id "compute.healthChecks.patch": +// method id "compute.globalForwardingRules.setTarget": -type HealthChecksPatchCall struct { - s *Service - project string - healthCheck string - healthcheck *HealthCheck - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type GlobalForwardingRulesSetTargetCall struct { + s *Service + project string + forwardingRule string + targetreference *TargetReference + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Patch: Updates a HealthCheck resource in the specified project using -// the data included in the request. This method supports patch -// semantics. -func (r *HealthChecksService) Patch(project string, healthCheck string, healthcheck *HealthCheck) *HealthChecksPatchCall { - c := &HealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetTarget: Changes target URL for the GlobalForwardingRule resource. +// The new target should be of the same type as the old target. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalForwardingRules/setTarget +func (r *GlobalForwardingRulesService) SetTarget(project string, forwardingRule string, targetreference *TargetReference) *GlobalForwardingRulesSetTargetCall { + c := &GlobalForwardingRulesSetTargetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.healthCheck = healthCheck - c.healthcheck = healthcheck + c.forwardingRule = forwardingRule + c.targetreference = targetreference return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HealthChecksPatchCall) Fields(s ...googleapi.Field) *HealthChecksPatchCall { +func (c *GlobalForwardingRulesSetTargetCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesSetTargetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -25081,52 +26036,52 @@ func (c *HealthChecksPatchCall) Fields(s ...googleapi.Field) *HealthChecksPatchC // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HealthChecksPatchCall) Context(ctx context.Context) *HealthChecksPatchCall { +func (c *GlobalForwardingRulesSetTargetCall) Context(ctx context.Context) *GlobalForwardingRulesSetTargetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HealthChecksPatchCall) Header() http.Header { +func (c *GlobalForwardingRulesSetTargetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HealthChecksPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalForwardingRulesSetTargetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}/setTarget") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PATCH", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "healthCheck": c.healthCheck, + "project": c.project, + "forwardingRule": c.forwardingRule, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.healthChecks.patch" call. +// Do executes the "compute.globalForwardingRules.setTarget" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *HealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *GlobalForwardingRulesSetTargetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -25157,16 +26112,16 @@ func (c *HealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, er } return ret, nil // { - // "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", - // "httpMethod": "PATCH", - // "id": "compute.healthChecks.patch", + // "description": "Changes target URL for the GlobalForwardingRule resource. The new target should be of the same type as the old target.", + // "httpMethod": "POST", + // "id": "compute.globalForwardingRules.setTarget", // "parameterOrder": [ // "project", - // "healthCheck" + // "forwardingRule" // ], // "parameters": { - // "healthCheck": { - // "description": "Name of the HealthCheck resource to patch.", + // "forwardingRule": { + // "description": "Name of the ForwardingRule resource in which target is to be set.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -25180,101 +26135,171 @@ func (c *HealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // } // }, - // "path": "{project}/global/healthChecks/{healthCheck}", + // "path": "{project}/global/forwardingRules/{forwardingRule}/setTarget", // "request": { - // "$ref": "HealthCheck" + // "$ref": "TargetReference" // }, // "response": { // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.healthChecks.update": +// method id "compute.globalOperations.aggregatedList": -type HealthChecksUpdateCall struct { - s *Service - project string - healthCheck string - healthcheck *HealthCheck - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type GlobalOperationsAggregatedListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Update: Updates a HealthCheck resource in the specified project using -// the data included in the request. -func (r *HealthChecksService) Update(project string, healthCheck string, healthcheck *HealthCheck) *HealthChecksUpdateCall { - c := &HealthChecksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves an aggregated list of all operations. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalOperations/aggregatedList +func (r *GlobalOperationsService) AggregatedList(project string) *GlobalOperationsAggregatedListCall { + c := &GlobalOperationsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.healthCheck = healthCheck - c.healthcheck = healthcheck + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *GlobalOperationsAggregatedListCall) Filter(filter string) *GlobalOperationsAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *GlobalOperationsAggregatedListCall) MaxResults(maxResults int64) *GlobalOperationsAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *GlobalOperationsAggregatedListCall) OrderBy(orderBy string) *GlobalOperationsAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *GlobalOperationsAggregatedListCall) PageToken(pageToken string) *GlobalOperationsAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HealthChecksUpdateCall) Fields(s ...googleapi.Field) *HealthChecksUpdateCall { +func (c *GlobalOperationsAggregatedListCall) Fields(s ...googleapi.Field) *GlobalOperationsAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *GlobalOperationsAggregatedListCall) IfNoneMatch(entityTag string) *GlobalOperationsAggregatedListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HealthChecksUpdateCall) Context(ctx context.Context) *HealthChecksUpdateCall { +func (c *GlobalOperationsAggregatedListCall) Context(ctx context.Context) *GlobalOperationsAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HealthChecksUpdateCall) Header() http.Header { +func (c *GlobalOperationsAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HealthChecksUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalOperationsAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/operations") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PUT", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "healthCheck": c.healthCheck, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.healthChecks.update" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *HealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.globalOperations.aggregatedList" call. +// Exactly one of *OperationAggregatedList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *OperationAggregatedList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *GlobalOperationsAggregatedListCall) Do(opts ...googleapi.CallOption) (*OperationAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -25293,7 +26318,7 @@ func (c *HealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, e if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &OperationAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -25305,19 +26330,34 @@ func (c *HealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, e } return ret, nil // { - // "description": "Updates a HealthCheck resource in the specified project using the data included in the request.", - // "httpMethod": "PUT", - // "id": "compute.healthChecks.update", + // "description": "Retrieves an aggregated list of all operations.", + // "httpMethod": "GET", + // "id": "compute.globalOperations.aggregatedList", // "parameterOrder": [ - // "project", - // "healthCheck" + // "project" // ], // "parameters": { - // "healthCheck": { - // "description": "Name of the HealthCheck resource to update.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", // "type": "string" // }, // "project": { @@ -25328,45 +26368,64 @@ func (c *HealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, e // "type": "string" // } // }, - // "path": "{project}/global/healthChecks/{healthCheck}", - // "request": { - // "$ref": "HealthCheck" - // }, + // "path": "{project}/aggregated/operations", // "response": { - // "$ref": "Operation" + // "$ref": "OperationAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.httpHealthChecks.delete": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *GlobalOperationsAggregatedListCall) Pages(ctx context.Context, f func(*OperationAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type HttpHealthChecksDeleteCall struct { - s *Service - project string - httpHealthCheck string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +// method id "compute.globalOperations.delete": + +type GlobalOperationsDeleteCall struct { + s *Service + project string + operation string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified HttpHealthCheck resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/delete -func (r *HttpHealthChecksService) Delete(project string, httpHealthCheck string) *HttpHealthChecksDeleteCall { - c := &HttpHealthChecksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified Operations resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalOperations/delete +func (r *GlobalOperationsService) Delete(project string, operation string) *GlobalOperationsDeleteCall { + c := &GlobalOperationsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.httpHealthCheck = httpHealthCheck + c.operation = operation return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HttpHealthChecksDeleteCall) Fields(s ...googleapi.Field) *HttpHealthChecksDeleteCall { +func (c *GlobalOperationsDeleteCall) Fields(s ...googleapi.Field) *GlobalOperationsDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -25374,21 +26433,21 @@ func (c *HttpHealthChecksDeleteCall) Fields(s ...googleapi.Field) *HttpHealthChe // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HttpHealthChecksDeleteCall) Context(ctx context.Context) *HttpHealthChecksDeleteCall { +func (c *GlobalOperationsDeleteCall) Context(ctx context.Context) *GlobalOperationsDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HttpHealthChecksDeleteCall) Header() http.Header { +func (c *GlobalOperationsDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HttpHealthChecksDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalOperationsDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -25396,65 +26455,40 @@ func (c *HttpHealthChecksDeleteCall) doRequest(alt string) (*http.Response, erro reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "httpHealthCheck": c.httpHealthCheck, + "project": c.project, + "operation": c.operation, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.httpHealthChecks.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *HttpHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.globalOperations.delete" call. +func (c *GlobalOperationsDeleteCall) Do(opts ...googleapi.CallOption) error { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } if err != nil { - return nil, err + return err } defer googleapi.CloseBody(res) if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err + return err } - return ret, nil + return nil // { - // "description": "Deletes the specified HttpHealthCheck resource.", + // "description": "Deletes the specified Operations resource.", // "httpMethod": "DELETE", - // "id": "compute.httpHealthChecks.delete", + // "id": "compute.globalOperations.delete", // "parameterOrder": [ // "project", - // "httpHealthCheck" + // "operation" // ], // "parameters": { - // "httpHealthCheck": { - // "description": "Name of the HttpHealthCheck resource to delete.", + // "operation": { + // "description": "Name of the Operations resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -25468,10 +26502,7 @@ func (c *HttpHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // } // }, - // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", - // "response": { - // "$ref": "Operation" - // }, + // "path": "{project}/global/operations/{operation}", // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", // "https://www.googleapis.com/auth/compute" @@ -25480,32 +26511,32 @@ func (c *HttpHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio } -// method id "compute.httpHealthChecks.get": +// method id "compute.globalOperations.get": -type HttpHealthChecksGetCall struct { - s *Service - project string - httpHealthCheck string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type GlobalOperationsGetCall struct { + s *Service + project string + operation string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified HttpHealthCheck resource. Get a list of -// available HTTP health checks by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/get -func (r *HttpHealthChecksService) Get(project string, httpHealthCheck string) *HttpHealthChecksGetCall { - c := &HttpHealthChecksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Retrieves the specified Operations resource. Get a list of +// operations by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalOperations/get +func (r *GlobalOperationsService) Get(project string, operation string) *GlobalOperationsGetCall { + c := &GlobalOperationsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.httpHealthCheck = httpHealthCheck + c.operation = operation return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HttpHealthChecksGetCall) Fields(s ...googleapi.Field) *HttpHealthChecksGetCall { +func (c *GlobalOperationsGetCall) Fields(s ...googleapi.Field) *GlobalOperationsGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -25515,7 +26546,7 @@ func (c *HttpHealthChecksGetCall) Fields(s ...googleapi.Field) *HttpHealthChecks // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *HttpHealthChecksGetCall) IfNoneMatch(entityTag string) *HttpHealthChecksGetCall { +func (c *GlobalOperationsGetCall) IfNoneMatch(entityTag string) *GlobalOperationsGetCall { c.ifNoneMatch_ = entityTag return c } @@ -25523,21 +26554,21 @@ func (c *HttpHealthChecksGetCall) IfNoneMatch(entityTag string) *HttpHealthCheck // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HttpHealthChecksGetCall) Context(ctx context.Context) *HttpHealthChecksGetCall { +func (c *GlobalOperationsGetCall) Context(ctx context.Context) *GlobalOperationsGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HttpHealthChecksGetCall) Header() http.Header { +func (c *GlobalOperationsGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HttpHealthChecksGetCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalOperationsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -25548,25 +26579,25 @@ func (c *HttpHealthChecksGetCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "httpHealthCheck": c.httpHealthCheck, + "project": c.project, + "operation": c.operation, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.httpHealthChecks.get" call. -// Exactly one of *HttpHealthCheck or error will be non-nil. Any non-2xx +// Do executes the "compute.globalOperations.get" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *HttpHealthCheck.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *HttpHealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HttpHealthCheck, error) { +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *GlobalOperationsGetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -25585,7 +26616,7 @@ func (c *HttpHealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HttpHealthC if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &HttpHealthCheck{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -25597,16 +26628,16 @@ func (c *HttpHealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HttpHealthC } return ret, nil // { - // "description": "Returns the specified HttpHealthCheck resource. Get a list of available HTTP health checks by making a list() request.", + // "description": "Retrieves the specified Operations resource. Get a list of operations by making a list() request.", // "httpMethod": "GET", - // "id": "compute.httpHealthChecks.get", + // "id": "compute.globalOperations.get", // "parameterOrder": [ // "project", - // "httpHealthCheck" + // "operation" // ], // "parameters": { - // "httpHealthCheck": { - // "description": "Name of the HttpHealthCheck resource to return.", + // "operation": { + // "description": "Name of the Operations resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -25620,9 +26651,9 @@ func (c *HttpHealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HttpHealthC // "type": "string" // } // }, - // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", + // "path": "{project}/global/operations/{operation}", // "response": { - // "$ref": "HttpHealthCheck" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -25633,192 +26664,54 @@ func (c *HttpHealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HttpHealthC } -// method id "compute.httpHealthChecks.insert": +// method id "compute.globalOperations.list": -type HttpHealthChecksInsertCall struct { - s *Service - project string - httphealthcheck *HttpHealthCheck - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type GlobalOperationsListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Insert: Creates a HttpHealthCheck resource in the specified project -// using the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/insert -func (r *HttpHealthChecksService) Insert(project string, httphealthcheck *HttpHealthCheck) *HttpHealthChecksInsertCall { - c := &HttpHealthChecksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of Operation resources contained within the +// specified project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/globalOperations/list +func (r *GlobalOperationsService) List(project string) *GlobalOperationsListCall { + c := &GlobalOperationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.httphealthcheck = httphealthcheck - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *HttpHealthChecksInsertCall) Fields(s ...googleapi.Field) *HttpHealthChecksInsertCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *HttpHealthChecksInsertCall) Context(ctx context.Context) *HttpHealthChecksInsertCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *HttpHealthChecksInsertCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *HttpHealthChecksInsertCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.httpHealthChecks.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *HttpHealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Creates a HttpHealthCheck resource in the specified project using the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.httpHealthChecks.insert", - // "parameterOrder": [ - // "project" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/httpHealthChecks", - // "request": { - // "$ref": "HttpHealthCheck" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.httpHealthChecks.list": - -type HttpHealthChecksListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} - -// List: Retrieves the list of HttpHealthCheck resources available to -// the specified project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/list -func (r *HttpHealthChecksService) List(project string) *HttpHealthChecksListCall { - c := &HttpHealthChecksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *HttpHealthChecksListCall) Filter(filter string) *HttpHealthChecksListCall { - c.urlParams_.Set("filter", filter) +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *GlobalOperationsListCall) Filter(filter string) *GlobalOperationsListCall { + c.urlParams_.Set("filter", filter) return c } @@ -25828,7 +26721,7 @@ func (c *HttpHealthChecksListCall) Filter(filter string) *HttpHealthChecksListCa // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *HttpHealthChecksListCall) MaxResults(maxResults int64) *HttpHealthChecksListCall { +func (c *GlobalOperationsListCall) MaxResults(maxResults int64) *GlobalOperationsListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -25845,7 +26738,7 @@ func (c *HttpHealthChecksListCall) MaxResults(maxResults int64) *HttpHealthCheck // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *HttpHealthChecksListCall) OrderBy(orderBy string) *HttpHealthChecksListCall { +func (c *GlobalOperationsListCall) OrderBy(orderBy string) *GlobalOperationsListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -25853,7 +26746,7 @@ func (c *HttpHealthChecksListCall) OrderBy(orderBy string) *HttpHealthChecksList // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *HttpHealthChecksListCall) PageToken(pageToken string) *HttpHealthChecksListCall { +func (c *GlobalOperationsListCall) PageToken(pageToken string) *GlobalOperationsListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -25861,7 +26754,7 @@ func (c *HttpHealthChecksListCall) PageToken(pageToken string) *HttpHealthChecks // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HttpHealthChecksListCall) Fields(s ...googleapi.Field) *HttpHealthChecksListCall { +func (c *GlobalOperationsListCall) Fields(s ...googleapi.Field) *GlobalOperationsListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -25871,7 +26764,7 @@ func (c *HttpHealthChecksListCall) Fields(s ...googleapi.Field) *HttpHealthCheck // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *HttpHealthChecksListCall) IfNoneMatch(entityTag string) *HttpHealthChecksListCall { +func (c *GlobalOperationsListCall) IfNoneMatch(entityTag string) *GlobalOperationsListCall { c.ifNoneMatch_ = entityTag return c } @@ -25879,21 +26772,21 @@ func (c *HttpHealthChecksListCall) IfNoneMatch(entityTag string) *HttpHealthChec // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HttpHealthChecksListCall) Context(ctx context.Context) *HttpHealthChecksListCall { +func (c *GlobalOperationsListCall) Context(ctx context.Context) *GlobalOperationsListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HttpHealthChecksListCall) Header() http.Header { +func (c *GlobalOperationsListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HttpHealthChecksListCall) doRequest(alt string) (*http.Response, error) { +func (c *GlobalOperationsListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -25904,7 +26797,7 @@ func (c *HttpHealthChecksListCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -25914,14 +26807,14 @@ func (c *HttpHealthChecksListCall) doRequest(alt string) (*http.Response, error) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.httpHealthChecks.list" call. -// Exactly one of *HttpHealthCheckList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *HttpHealthCheckList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.globalOperations.list" call. +// Exactly one of *OperationList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *OperationList.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *HttpHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpHealthCheckList, error) { +func (c *GlobalOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -25940,7 +26833,7 @@ func (c *HttpHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpHealth if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &HttpHealthCheckList{ + ret := &OperationList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -25952,15 +26845,15 @@ func (c *HttpHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpHealth } return ret, nil // { - // "description": "Retrieves the list of HttpHealthCheck resources available to the specified project.", + // "description": "Retrieves a list of Operation resources contained within the specified project.", // "httpMethod": "GET", - // "id": "compute.httpHealthChecks.list", + // "id": "compute.globalOperations.list", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -25990,9 +26883,9 @@ func (c *HttpHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpHealth // "type": "string" // } // }, - // "path": "{project}/global/httpHealthChecks", + // "path": "{project}/global/operations", // "response": { - // "$ref": "HttpHealthCheckList" + // "$ref": "OperationList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -26006,7 +26899,7 @@ func (c *HttpHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpHealth // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *HttpHealthChecksListCall) Pages(ctx context.Context, f func(*HttpHealthCheckList) error) error { +func (c *GlobalOperationsListCall) Pages(ctx context.Context, f func(*OperationList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -26024,34 +26917,29 @@ func (c *HttpHealthChecksListCall) Pages(ctx context.Context, f func(*HttpHealth } } -// method id "compute.httpHealthChecks.patch": +// method id "compute.healthChecks.delete": -type HttpHealthChecksPatchCall struct { - s *Service - project string - httpHealthCheck string - httphealthcheck *HttpHealthCheck - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HealthChecksDeleteCall struct { + s *Service + project string + healthCheck string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Patch: Updates a HttpHealthCheck resource in the specified project -// using the data included in the request. This method supports patch -// semantics. -// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/patch -func (r *HttpHealthChecksService) Patch(project string, httpHealthCheck string, httphealthcheck *HttpHealthCheck) *HttpHealthChecksPatchCall { - c := &HttpHealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified HealthCheck resource. +func (r *HealthChecksService) Delete(project string, healthCheck string) *HealthChecksDeleteCall { + c := &HealthChecksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.httpHealthCheck = httpHealthCheck - c.httphealthcheck = httphealthcheck + c.healthCheck = healthCheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HttpHealthChecksPatchCall) Fields(s ...googleapi.Field) *HttpHealthChecksPatchCall { +func (c *HealthChecksDeleteCall) Fields(s ...googleapi.Field) *HealthChecksDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -26059,52 +26947,47 @@ func (c *HttpHealthChecksPatchCall) Fields(s ...googleapi.Field) *HttpHealthChec // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HttpHealthChecksPatchCall) Context(ctx context.Context) *HttpHealthChecksPatchCall { +func (c *HealthChecksDeleteCall) Context(ctx context.Context) *HealthChecksDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HttpHealthChecksPatchCall) Header() http.Header { +func (c *HealthChecksDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HttpHealthChecksPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *HealthChecksDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PATCH", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "httpHealthCheck": c.httpHealthCheck, + "project": c.project, + "healthCheck": c.healthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.httpHealthChecks.patch" call. +// Do executes the "compute.healthChecks.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *HttpHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -26135,16 +27018,16 @@ func (c *HttpHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", - // "httpMethod": "PATCH", - // "id": "compute.httpHealthChecks.patch", + // "description": "Deletes the specified HealthCheck resource.", + // "httpMethod": "DELETE", + // "id": "compute.healthChecks.delete", // "parameterOrder": [ // "project", - // "httpHealthCheck" + // "healthCheck" // ], // "parameters": { - // "httpHealthCheck": { - // "description": "Name of the HttpHealthCheck resource to patch.", + // "healthCheck": { + // "description": "Name of the HealthCheck resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -26158,102 +27041,104 @@ func (c *HttpHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation // "type": "string" // } // }, - // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", - // "request": { - // "$ref": "HttpHealthCheck" - // }, + // "path": "{project}/global/healthChecks/{healthCheck}", // "response": { // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.httpHealthChecks.update": +// method id "compute.healthChecks.get": -type HttpHealthChecksUpdateCall struct { - s *Service - project string - httpHealthCheck string - httphealthcheck *HttpHealthCheck - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HealthChecksGetCall struct { + s *Service + project string + healthCheck string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Update: Updates a HttpHealthCheck resource in the specified project -// using the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/update -func (r *HttpHealthChecksService) Update(project string, httpHealthCheck string, httphealthcheck *HttpHealthCheck) *HttpHealthChecksUpdateCall { - c := &HttpHealthChecksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified HealthCheck resource. Get a list of +// available health checks by making a list() request. +func (r *HealthChecksService) Get(project string, healthCheck string) *HealthChecksGetCall { + c := &HealthChecksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.httpHealthCheck = httpHealthCheck - c.httphealthcheck = httphealthcheck + c.healthCheck = healthCheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HttpHealthChecksUpdateCall) Fields(s ...googleapi.Field) *HttpHealthChecksUpdateCall { +func (c *HealthChecksGetCall) Fields(s ...googleapi.Field) *HealthChecksGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *HealthChecksGetCall) IfNoneMatch(entityTag string) *HealthChecksGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HttpHealthChecksUpdateCall) Context(ctx context.Context) *HttpHealthChecksUpdateCall { +func (c *HealthChecksGetCall) Context(ctx context.Context) *HealthChecksGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HttpHealthChecksUpdateCall) Header() http.Header { +func (c *HealthChecksGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HttpHealthChecksUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *HealthChecksGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PUT", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "httpHealthCheck": c.httpHealthCheck, + "project": c.project, + "healthCheck": c.healthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.httpHealthChecks.update" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.healthChecks.get" call. +// Exactly one of *HealthCheck or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at +// *HealthCheck.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *HttpHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HealthCheck, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -26272,7 +27157,7 @@ func (c *HttpHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operatio if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &HealthCheck{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -26284,16 +27169,16 @@ func (c *HttpHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request.", - // "httpMethod": "PUT", - // "id": "compute.httpHealthChecks.update", + // "description": "Returns the specified HealthCheck resource. Get a list of available health checks by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.healthChecks.get", // "parameterOrder": [ // "project", - // "httpHealthCheck" + // "healthCheck" // ], // "parameters": { - // "httpHealthCheck": { - // "description": "Name of the HttpHealthCheck resource to update.", + // "healthCheck": { + // "description": "Name of the HealthCheck resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -26307,44 +27192,43 @@ func (c *HttpHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // } // }, - // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", - // "request": { - // "$ref": "HttpHealthCheck" - // }, + // "path": "{project}/global/healthChecks/{healthCheck}", // "response": { - // "$ref": "Operation" + // "$ref": "HealthCheck" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.httpsHealthChecks.delete": +// method id "compute.healthChecks.insert": -type HttpsHealthChecksDeleteCall struct { - s *Service - project string - httpsHealthCheck string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HealthChecksInsertCall struct { + s *Service + project string + healthcheck *HealthCheck + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified HttpsHealthCheck resource. -func (r *HttpsHealthChecksService) Delete(project string, httpsHealthCheck string) *HttpsHealthChecksDeleteCall { - c := &HttpsHealthChecksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a HealthCheck resource in the specified project using +// the data included in the request. +func (r *HealthChecksService) Insert(project string, healthcheck *HealthCheck) *HealthChecksInsertCall { + c := &HealthChecksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.httpsHealthCheck = httpsHealthCheck + c.healthcheck = healthcheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HttpsHealthChecksDeleteCall) Fields(s ...googleapi.Field) *HttpsHealthChecksDeleteCall { +func (c *HealthChecksInsertCall) Fields(s ...googleapi.Field) *HealthChecksInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -26352,47 +27236,51 @@ func (c *HttpsHealthChecksDeleteCall) Fields(s ...googleapi.Field) *HttpsHealthC // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HttpsHealthChecksDeleteCall) Context(ctx context.Context) *HttpsHealthChecksDeleteCall { +func (c *HealthChecksInsertCall) Context(ctx context.Context) *HealthChecksInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HttpsHealthChecksDeleteCall) Header() http.Header { +func (c *HealthChecksInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HttpsHealthChecksDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *HealthChecksInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "httpsHealthCheck": c.httpsHealthCheck, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.httpsHealthChecks.delete" call. +// Do executes the "compute.healthChecks.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *HttpsHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -26423,21 +27311,13 @@ func (c *HttpsHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Deletes the specified HttpsHealthCheck resource.", - // "httpMethod": "DELETE", - // "id": "compute.httpsHealthChecks.delete", + // "description": "Creates a HealthCheck resource in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.healthChecks.insert", // "parameterOrder": [ - // "project", - // "httpsHealthCheck" + // "project" // ], // "parameters": { - // "httpsHealthCheck": { - // "description": "Name of the HttpsHealthCheck resource to delete.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -26446,7 +27326,10 @@ func (c *HttpsHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // } // }, - // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", + // "path": "{project}/global/healthChecks", + // "request": { + // "$ref": "HealthCheck" + // }, // "response": { // "$ref": "Operation" // }, @@ -26458,353 +27341,64 @@ func (c *HttpsHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operati } -// method id "compute.httpsHealthChecks.get": +// method id "compute.healthChecks.list": -type HttpsHealthChecksGetCall struct { - s *Service - project string - httpsHealthCheck string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type HealthChecksListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified HttpsHealthCheck resource. Get a list of -// available HTTPS health checks by making a list() request. -func (r *HttpsHealthChecksService) Get(project string, httpsHealthCheck string) *HttpsHealthChecksGetCall { - c := &HttpsHealthChecksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of HealthCheck resources available to the +// specified project. +func (r *HealthChecksService) List(project string) *HealthChecksListCall { + c := &HealthChecksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.httpsHealthCheck = httpsHealthCheck - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *HttpsHealthChecksGetCall) Fields(s ...googleapi.Field) *HttpsHealthChecksGetCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *HttpsHealthChecksGetCall) IfNoneMatch(entityTag string) *HttpsHealthChecksGetCall { - c.ifNoneMatch_ = entityTag +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *HealthChecksListCall) Filter(filter string) *HealthChecksListCall { + c.urlParams_.Set("filter", filter) return c } -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *HttpsHealthChecksGetCall) Context(ctx context.Context) *HttpsHealthChecksGetCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *HttpsHealthChecksGetCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *HttpsHealthChecksGetCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "httpsHealthCheck": c.httpsHealthCheck, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.httpsHealthChecks.get" call. -// Exactly one of *HttpsHealthCheck or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *HttpsHealthCheck.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *HttpsHealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HttpsHealthCheck, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &HttpsHealthCheck{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Returns the specified HttpsHealthCheck resource. Get a list of available HTTPS health checks by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.httpsHealthChecks.get", - // "parameterOrder": [ - // "project", - // "httpsHealthCheck" - // ], - // "parameters": { - // "httpsHealthCheck": { - // "description": "Name of the HttpsHealthCheck resource to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", - // "response": { - // "$ref": "HttpsHealthCheck" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" - // ] - // } - -} - -// method id "compute.httpsHealthChecks.insert": - -type HttpsHealthChecksInsertCall struct { - s *Service - project string - httpshealthcheck *HttpsHealthCheck - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Insert: Creates a HttpsHealthCheck resource in the specified project -// using the data included in the request. -func (r *HttpsHealthChecksService) Insert(project string, httpshealthcheck *HttpsHealthCheck) *HttpsHealthChecksInsertCall { - c := &HttpsHealthChecksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.httpshealthcheck = httpshealthcheck - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *HttpsHealthChecksInsertCall) Fields(s ...googleapi.Field) *HttpsHealthChecksInsertCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *HttpsHealthChecksInsertCall) Context(ctx context.Context) *HttpsHealthChecksInsertCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *HttpsHealthChecksInsertCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *HttpsHealthChecksInsertCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.httpsHealthChecks.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *HttpsHealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Creates a HttpsHealthCheck resource in the specified project using the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.httpsHealthChecks.insert", - // "parameterOrder": [ - // "project" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/httpsHealthChecks", - // "request": { - // "$ref": "HttpsHealthCheck" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.httpsHealthChecks.list": - -type HttpsHealthChecksListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} - -// List: Retrieves the list of HttpsHealthCheck resources available to -// the specified project. -func (r *HttpsHealthChecksService) List(project string) *HttpsHealthChecksListCall { - c := &HttpsHealthChecksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *HttpsHealthChecksListCall) Filter(filter string) *HttpsHealthChecksListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *HttpsHealthChecksListCall) MaxResults(maxResults int64) *HttpsHealthChecksListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *HealthChecksListCall) MaxResults(maxResults int64) *HealthChecksListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -26820,7 +27414,7 @@ func (c *HttpsHealthChecksListCall) MaxResults(maxResults int64) *HttpsHealthChe // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *HttpsHealthChecksListCall) OrderBy(orderBy string) *HttpsHealthChecksListCall { +func (c *HealthChecksListCall) OrderBy(orderBy string) *HealthChecksListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -26828,7 +27422,7 @@ func (c *HttpsHealthChecksListCall) OrderBy(orderBy string) *HttpsHealthChecksLi // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *HttpsHealthChecksListCall) PageToken(pageToken string) *HttpsHealthChecksListCall { +func (c *HealthChecksListCall) PageToken(pageToken string) *HealthChecksListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -26836,7 +27430,7 @@ func (c *HttpsHealthChecksListCall) PageToken(pageToken string) *HttpsHealthChec // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HttpsHealthChecksListCall) Fields(s ...googleapi.Field) *HttpsHealthChecksListCall { +func (c *HealthChecksListCall) Fields(s ...googleapi.Field) *HealthChecksListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -26846,7 +27440,7 @@ func (c *HttpsHealthChecksListCall) Fields(s ...googleapi.Field) *HttpsHealthChe // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *HttpsHealthChecksListCall) IfNoneMatch(entityTag string) *HttpsHealthChecksListCall { +func (c *HealthChecksListCall) IfNoneMatch(entityTag string) *HealthChecksListCall { c.ifNoneMatch_ = entityTag return c } @@ -26854,21 +27448,21 @@ func (c *HttpsHealthChecksListCall) IfNoneMatch(entityTag string) *HttpsHealthCh // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HttpsHealthChecksListCall) Context(ctx context.Context) *HttpsHealthChecksListCall { +func (c *HealthChecksListCall) Context(ctx context.Context) *HealthChecksListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HttpsHealthChecksListCall) Header() http.Header { +func (c *HealthChecksListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HttpsHealthChecksListCall) doRequest(alt string) (*http.Response, error) { +func (c *HealthChecksListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -26879,7 +27473,7 @@ func (c *HttpsHealthChecksListCall) doRequest(alt string) (*http.Response, error } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -26889,14 +27483,14 @@ func (c *HttpsHealthChecksListCall) doRequest(alt string) (*http.Response, error return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.httpsHealthChecks.list" call. -// Exactly one of *HttpsHealthCheckList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *HttpsHealthCheckList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.healthChecks.list" call. +// Exactly one of *HealthCheckList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *HealthCheckList.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *HttpsHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpsHealthCheckList, error) { +func (c *HealthChecksListCall) Do(opts ...googleapi.CallOption) (*HealthCheckList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -26915,7 +27509,7 @@ func (c *HttpsHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpsHeal if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &HttpsHealthCheckList{ + ret := &HealthCheckList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -26927,15 +27521,15 @@ func (c *HttpsHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpsHeal } return ret, nil // { - // "description": "Retrieves the list of HttpsHealthCheck resources available to the specified project.", + // "description": "Retrieves the list of HealthCheck resources available to the specified project.", // "httpMethod": "GET", - // "id": "compute.httpsHealthChecks.list", + // "id": "compute.healthChecks.list", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -26965,9 +27559,9 @@ func (c *HttpsHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpsHeal // "type": "string" // } // }, - // "path": "{project}/global/httpsHealthChecks", + // "path": "{project}/global/healthChecks", // "response": { - // "$ref": "HttpsHealthCheckList" + // "$ref": "HealthCheckList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -26981,7 +27575,7 @@ func (c *HttpsHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpsHeal // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *HttpsHealthChecksListCall) Pages(ctx context.Context, f func(*HttpsHealthCheckList) error) error { +func (c *HealthChecksListCall) Pages(ctx context.Context, f func(*HealthCheckList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -26999,33 +27593,33 @@ func (c *HttpsHealthChecksListCall) Pages(ctx context.Context, f func(*HttpsHeal } } -// method id "compute.httpsHealthChecks.patch": +// method id "compute.healthChecks.patch": -type HttpsHealthChecksPatchCall struct { - s *Service - project string - httpsHealthCheck string - httpshealthcheck *HttpsHealthCheck - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HealthChecksPatchCall struct { + s *Service + project string + healthCheck string + healthcheck *HealthCheck + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Patch: Updates a HttpsHealthCheck resource in the specified project -// using the data included in the request. This method supports patch -// semantics. -func (r *HttpsHealthChecksService) Patch(project string, httpsHealthCheck string, httpshealthcheck *HttpsHealthCheck) *HttpsHealthChecksPatchCall { - c := &HttpsHealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Patch: Updates a HealthCheck resource in the specified project using +// the data included in the request. This method supports PATCH +// semantics and uses the JSON merge patch format and processing rules. +func (r *HealthChecksService) Patch(project string, healthCheck string, healthcheck *HealthCheck) *HealthChecksPatchCall { + c := &HealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.httpsHealthCheck = httpsHealthCheck - c.httpshealthcheck = httpshealthcheck + c.healthCheck = healthCheck + c.healthcheck = healthcheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HttpsHealthChecksPatchCall) Fields(s ...googleapi.Field) *HttpsHealthChecksPatchCall { +func (c *HealthChecksPatchCall) Fields(s ...googleapi.Field) *HealthChecksPatchCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -27033,52 +27627,52 @@ func (c *HttpsHealthChecksPatchCall) Fields(s ...googleapi.Field) *HttpsHealthCh // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HttpsHealthChecksPatchCall) Context(ctx context.Context) *HttpsHealthChecksPatchCall { +func (c *HealthChecksPatchCall) Context(ctx context.Context) *HealthChecksPatchCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HttpsHealthChecksPatchCall) Header() http.Header { +func (c *HealthChecksPatchCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HttpsHealthChecksPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *HealthChecksPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("PATCH", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "httpsHealthCheck": c.httpsHealthCheck, + "project": c.project, + "healthCheck": c.healthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.httpsHealthChecks.patch" call. +// Do executes the "compute.healthChecks.patch" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *HttpsHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -27109,16 +27703,16 @@ func (c *HttpsHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports patch semantics.", + // "description": "Updates a HealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", - // "id": "compute.httpsHealthChecks.patch", + // "id": "compute.healthChecks.patch", // "parameterOrder": [ // "project", - // "httpsHealthCheck" + // "healthCheck" // ], // "parameters": { - // "httpsHealthCheck": { - // "description": "Name of the HttpsHealthCheck resource to patch.", + // "healthCheck": { + // "description": "Name of the HealthCheck resource to patch.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -27132,9 +27726,9 @@ func (c *HttpsHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // } // }, - // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", + // "path": "{project}/global/healthChecks/{healthCheck}", // "request": { - // "$ref": "HttpsHealthCheck" + // "$ref": "HealthCheck" // }, // "response": { // "$ref": "Operation" @@ -27148,32 +27742,32 @@ func (c *HttpsHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operatio } -// method id "compute.httpsHealthChecks.update": +// method id "compute.healthChecks.update": -type HttpsHealthChecksUpdateCall struct { - s *Service - project string - httpsHealthCheck string - httpshealthcheck *HttpsHealthCheck - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HealthChecksUpdateCall struct { + s *Service + project string + healthCheck string + healthcheck *HealthCheck + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Update: Updates a HttpsHealthCheck resource in the specified project -// using the data included in the request. -func (r *HttpsHealthChecksService) Update(project string, httpsHealthCheck string, httpshealthcheck *HttpsHealthCheck) *HttpsHealthChecksUpdateCall { - c := &HttpsHealthChecksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Update: Updates a HealthCheck resource in the specified project using +// the data included in the request. +func (r *HealthChecksService) Update(project string, healthCheck string, healthcheck *HealthCheck) *HealthChecksUpdateCall { + c := &HealthChecksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.httpsHealthCheck = httpsHealthCheck - c.httpshealthcheck = httpshealthcheck + c.healthCheck = healthCheck + c.healthcheck = healthcheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *HttpsHealthChecksUpdateCall) Fields(s ...googleapi.Field) *HttpsHealthChecksUpdateCall { +func (c *HealthChecksUpdateCall) Fields(s ...googleapi.Field) *HealthChecksUpdateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -27181,52 +27775,52 @@ func (c *HttpsHealthChecksUpdateCall) Fields(s ...googleapi.Field) *HttpsHealthC // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *HttpsHealthChecksUpdateCall) Context(ctx context.Context) *HttpsHealthChecksUpdateCall { +func (c *HealthChecksUpdateCall) Context(ctx context.Context) *HealthChecksUpdateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *HttpsHealthChecksUpdateCall) Header() http.Header { +func (c *HealthChecksUpdateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *HttpsHealthChecksUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *HealthChecksUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("PUT", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "httpsHealthCheck": c.httpsHealthCheck, + "project": c.project, + "healthCheck": c.healthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.httpsHealthChecks.update" call. +// Do executes the "compute.healthChecks.update" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *HttpsHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -27257,16 +27851,16 @@ func (c *HttpsHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request.", + // "description": "Updates a HealthCheck resource in the specified project using the data included in the request.", // "httpMethod": "PUT", - // "id": "compute.httpsHealthChecks.update", + // "id": "compute.healthChecks.update", // "parameterOrder": [ // "project", - // "httpsHealthCheck" + // "healthCheck" // ], // "parameters": { - // "httpsHealthCheck": { - // "description": "Name of the HttpsHealthCheck resource to update.", + // "healthCheck": { + // "description": "Name of the HealthCheck resource to update.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -27280,9 +27874,9 @@ func (c *HttpsHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // } // }, - // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", + // "path": "{project}/global/healthChecks/{healthCheck}", // "request": { - // "$ref": "HttpsHealthCheck" + // "$ref": "HealthCheck" // }, // "response": { // "$ref": "Operation" @@ -27295,30 +27889,30 @@ func (c *HttpsHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operati } -// method id "compute.images.delete": +// method id "compute.httpHealthChecks.delete": -type ImagesDeleteCall struct { - s *Service - project string - image string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HttpHealthChecksDeleteCall struct { + s *Service + project string + httpHealthCheck string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified image. -// For details, see https://cloud.google.com/compute/docs/reference/latest/images/delete -func (r *ImagesService) Delete(project string, image string) *ImagesDeleteCall { - c := &ImagesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified HttpHealthCheck resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/delete +func (r *HttpHealthChecksService) Delete(project string, httpHealthCheck string) *HttpHealthChecksDeleteCall { + c := &HttpHealthChecksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.image = image + c.httpHealthCheck = httpHealthCheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ImagesDeleteCall) Fields(s ...googleapi.Field) *ImagesDeleteCall { +func (c *HttpHealthChecksDeleteCall) Fields(s ...googleapi.Field) *HttpHealthChecksDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -27326,21 +27920,21 @@ func (c *ImagesDeleteCall) Fields(s ...googleapi.Field) *ImagesDeleteCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ImagesDeleteCall) Context(ctx context.Context) *ImagesDeleteCall { +func (c *HttpHealthChecksDeleteCall) Context(ctx context.Context) *HttpHealthChecksDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ImagesDeleteCall) Header() http.Header { +func (c *HttpHealthChecksDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ImagesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpHealthChecksDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -27348,25 +27942,25 @@ func (c *ImagesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "image": c.image, + "project": c.project, + "httpHealthCheck": c.httpHealthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.images.delete" call. +// Do executes the "compute.httpHealthChecks.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ImagesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HttpHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -27397,16 +27991,16 @@ func (c *ImagesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Deletes the specified image.", + // "description": "Deletes the specified HttpHealthCheck resource.", // "httpMethod": "DELETE", - // "id": "compute.images.delete", + // "id": "compute.httpHealthChecks.delete", // "parameterOrder": [ // "project", - // "image" + // "httpHealthCheck" // ], // "parameters": { - // "image": { - // "description": "Name of the image resource to delete.", + // "httpHealthCheck": { + // "description": "Name of the HttpHealthCheck resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -27420,7 +28014,7 @@ func (c *ImagesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // } // }, - // "path": "{project}/global/images/{image}", + // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", // "response": { // "$ref": "Operation" // }, @@ -27432,334 +28026,32 @@ func (c *ImagesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) } -// method id "compute.images.deprecate": +// method id "compute.httpHealthChecks.get": -type ImagesDeprecateCall struct { - s *Service - project string - image string - deprecationstatus *DeprecationStatus - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Deprecate: Sets the deprecation status of an image. -// -// If an empty request body is given, clears the deprecation status -// instead. -// For details, see https://cloud.google.com/compute/docs/reference/latest/images/deprecate -func (r *ImagesService) Deprecate(project string, image string, deprecationstatus *DeprecationStatus) *ImagesDeprecateCall { - c := &ImagesDeprecateCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.image = image - c.deprecationstatus = deprecationstatus - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *ImagesDeprecateCall) Fields(s ...googleapi.Field) *ImagesDeprecateCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *ImagesDeprecateCall) Context(ctx context.Context) *ImagesDeprecateCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *ImagesDeprecateCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *ImagesDeprecateCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.deprecationstatus) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}/deprecate") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "image": c.image, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.images.deprecate" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *ImagesDeprecateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Sets the deprecation status of an image.\n\nIf an empty request body is given, clears the deprecation status instead.", - // "httpMethod": "POST", - // "id": "compute.images.deprecate", - // "parameterOrder": [ - // "project", - // "image" - // ], - // "parameters": { - // "image": { - // "description": "Image name.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/images/{image}/deprecate", - // "request": { - // "$ref": "DeprecationStatus" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.images.get": - -type ImagesGetCall struct { - s *Service - project string - image string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} - -// Get: Returns the specified image. Get a list of available images by -// making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/images/get -func (r *ImagesService) Get(project string, image string) *ImagesGetCall { - c := &ImagesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.image = image - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *ImagesGetCall) Fields(s ...googleapi.Field) *ImagesGetCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *ImagesGetCall) IfNoneMatch(entityTag string) *ImagesGetCall { - c.ifNoneMatch_ = entityTag - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *ImagesGetCall) Context(ctx context.Context) *ImagesGetCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *ImagesGetCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *ImagesGetCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "image": c.image, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.images.get" call. -// Exactly one of *Image or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Image.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *ImagesGetCall) Do(opts ...googleapi.CallOption) (*Image, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Image{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Returns the specified image. Get a list of available images by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.images.get", - // "parameterOrder": [ - // "project", - // "image" - // ], - // "parameters": { - // "image": { - // "description": "Name of the image resource to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/images/{image}", - // "response": { - // "$ref": "Image" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" - // ] - // } - -} - -// method id "compute.images.getFromFamily": - -type ImagesGetFromFamilyCall struct { - s *Service - project string - family string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type HttpHealthChecksGetCall struct { + s *Service + project string + httpHealthCheck string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// GetFromFamily: Returns the latest image that is part of an image -// family and is not deprecated. -func (r *ImagesService) GetFromFamily(project string, family string) *ImagesGetFromFamilyCall { - c := &ImagesGetFromFamilyCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified HttpHealthCheck resource. Get a list of +// available HTTP health checks by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/get +func (r *HttpHealthChecksService) Get(project string, httpHealthCheck string) *HttpHealthChecksGetCall { + c := &HttpHealthChecksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.family = family + c.httpHealthCheck = httpHealthCheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ImagesGetFromFamilyCall) Fields(s ...googleapi.Field) *ImagesGetFromFamilyCall { +func (c *HttpHealthChecksGetCall) Fields(s ...googleapi.Field) *HttpHealthChecksGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -27769,7 +28061,7 @@ func (c *ImagesGetFromFamilyCall) Fields(s ...googleapi.Field) *ImagesGetFromFam // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *ImagesGetFromFamilyCall) IfNoneMatch(entityTag string) *ImagesGetFromFamilyCall { +func (c *HttpHealthChecksGetCall) IfNoneMatch(entityTag string) *HttpHealthChecksGetCall { c.ifNoneMatch_ = entityTag return c } @@ -27777,21 +28069,21 @@ func (c *ImagesGetFromFamilyCall) IfNoneMatch(entityTag string) *ImagesGetFromFa // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ImagesGetFromFamilyCall) Context(ctx context.Context) *ImagesGetFromFamilyCall { +func (c *HttpHealthChecksGetCall) Context(ctx context.Context) *HttpHealthChecksGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ImagesGetFromFamilyCall) Header() http.Header { +func (c *HttpHealthChecksGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ImagesGetFromFamilyCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpHealthChecksGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -27802,25 +28094,25 @@ func (c *ImagesGetFromFamilyCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/family/{family}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "family": c.family, + "project": c.project, + "httpHealthCheck": c.httpHealthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.images.getFromFamily" call. -// Exactly one of *Image or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Image.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *ImagesGetFromFamilyCall) Do(opts ...googleapi.CallOption) (*Image, error) { +// Do executes the "compute.httpHealthChecks.get" call. +// Exactly one of *HttpHealthCheck or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *HttpHealthCheck.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *HttpHealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HttpHealthCheck, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -27839,7 +28131,7 @@ func (c *ImagesGetFromFamilyCall) Do(opts ...googleapi.CallOption) (*Image, erro if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Image{ + ret := &HttpHealthCheck{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -27851,16 +28143,16 @@ func (c *ImagesGetFromFamilyCall) Do(opts ...googleapi.CallOption) (*Image, erro } return ret, nil // { - // "description": "Returns the latest image that is part of an image family and is not deprecated.", + // "description": "Returns the specified HttpHealthCheck resource. Get a list of available HTTP health checks by making a list() request.", // "httpMethod": "GET", - // "id": "compute.images.getFromFamily", + // "id": "compute.httpHealthChecks.get", // "parameterOrder": [ // "project", - // "family" + // "httpHealthCheck" // ], // "parameters": { - // "family": { - // "description": "Name of the image family to search for.", + // "httpHealthCheck": { + // "description": "Name of the HttpHealthCheck resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -27874,9 +28166,9 @@ func (c *ImagesGetFromFamilyCall) Do(opts ...googleapi.CallOption) (*Image, erro // "type": "string" // } // }, - // "path": "{project}/global/images/family/{family}", + // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", // "response": { - // "$ref": "Image" + // "$ref": "HttpHealthCheck" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -27887,31 +28179,31 @@ func (c *ImagesGetFromFamilyCall) Do(opts ...googleapi.CallOption) (*Image, erro } -// method id "compute.images.insert": +// method id "compute.httpHealthChecks.insert": -type ImagesInsertCall struct { - s *Service - project string - image *Image - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HttpHealthChecksInsertCall struct { + s *Service + project string + httphealthcheck *HttpHealthCheck + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates an image in the specified project using the data -// included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/images/insert -func (r *ImagesService) Insert(project string, image *Image) *ImagesInsertCall { - c := &ImagesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a HttpHealthCheck resource in the specified project +// using the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/insert +func (r *HttpHealthChecksService) Insert(project string, httphealthcheck *HttpHealthCheck) *HttpHealthChecksInsertCall { + c := &HttpHealthChecksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.image = image + c.httphealthcheck = httphealthcheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ImagesInsertCall) Fields(s ...googleapi.Field) *ImagesInsertCall { +func (c *HttpHealthChecksInsertCall) Fields(s ...googleapi.Field) *HttpHealthChecksInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -27919,34 +28211,34 @@ func (c *ImagesInsertCall) Fields(s ...googleapi.Field) *ImagesInsertCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ImagesInsertCall) Context(ctx context.Context) *ImagesInsertCall { +func (c *HttpHealthChecksInsertCall) Context(ctx context.Context) *HttpHealthChecksInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ImagesInsertCall) Header() http.Header { +func (c *HttpHealthChecksInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ImagesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpHealthChecksInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.image) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -27956,14 +28248,14 @@ func (c *ImagesInsertCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.images.insert" call. +// Do executes the "compute.httpHealthChecks.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ImagesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HttpHealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -27994,9 +28286,9 @@ func (c *ImagesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Creates an image in the specified project using the data included in the request.", + // "description": "Creates a HttpHealthCheck resource in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.images.insert", + // "id": "compute.httpHealthChecks.insert", // "parameterOrder": [ // "project" // ], @@ -28009,27 +28301,24 @@ func (c *ImagesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // } // }, - // "path": "{project}/global/images", + // "path": "{project}/global/httpHealthChecks", // "request": { - // "$ref": "Image" + // "$ref": "HttpHealthCheck" // }, // "response": { // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/devstorage.full_control", - // "https://www.googleapis.com/auth/devstorage.read_only", - // "https://www.googleapis.com/auth/devstorage.read_write" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.images.list": +// method id "compute.httpHealthChecks.list": -type ImagesListCall struct { +type HttpHealthChecksListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -28038,24 +28327,18 @@ type ImagesListCall struct { header_ http.Header } -// List: Retrieves the list of private images available to the specified -// project. Private images are images you create that belong to your -// project. This method does not get any images that belong to other -// projects, including publicly-available images, like Debian 8. If you -// want to get a list of publicly-available images, use this method to -// make a request to the respective image project, such as debian-cloud -// or windows-cloud. -// For details, see https://cloud.google.com/compute/docs/reference/latest/images/list -func (r *ImagesService) List(project string) *ImagesListCall { - c := &ImagesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of HttpHealthCheck resources available to +// the specified project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/list +func (r *HttpHealthChecksService) List(project string) *HttpHealthChecksListCall { + c := &HttpHealthChecksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -28067,7 +28350,7 @@ func (r *ImagesService) List(project string) *ImagesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -28079,7 +28362,7 @@ func (r *ImagesService) List(project string) *ImagesListCall { // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *ImagesListCall) Filter(filter string) *ImagesListCall { +func (c *HttpHealthChecksListCall) Filter(filter string) *HttpHealthChecksListCall { c.urlParams_.Set("filter", filter) return c } @@ -28090,7 +28373,7 @@ func (c *ImagesListCall) Filter(filter string) *ImagesListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *ImagesListCall) MaxResults(maxResults int64) *ImagesListCall { +func (c *HttpHealthChecksListCall) MaxResults(maxResults int64) *HttpHealthChecksListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -28107,7 +28390,7 @@ func (c *ImagesListCall) MaxResults(maxResults int64) *ImagesListCall { // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *ImagesListCall) OrderBy(orderBy string) *ImagesListCall { +func (c *HttpHealthChecksListCall) OrderBy(orderBy string) *HttpHealthChecksListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -28115,7 +28398,7 @@ func (c *ImagesListCall) OrderBy(orderBy string) *ImagesListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *ImagesListCall) PageToken(pageToken string) *ImagesListCall { +func (c *HttpHealthChecksListCall) PageToken(pageToken string) *HttpHealthChecksListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -28123,7 +28406,7 @@ func (c *ImagesListCall) PageToken(pageToken string) *ImagesListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ImagesListCall) Fields(s ...googleapi.Field) *ImagesListCall { +func (c *HttpHealthChecksListCall) Fields(s ...googleapi.Field) *HttpHealthChecksListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -28133,7 +28416,7 @@ func (c *ImagesListCall) Fields(s ...googleapi.Field) *ImagesListCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *ImagesListCall) IfNoneMatch(entityTag string) *ImagesListCall { +func (c *HttpHealthChecksListCall) IfNoneMatch(entityTag string) *HttpHealthChecksListCall { c.ifNoneMatch_ = entityTag return c } @@ -28141,21 +28424,21 @@ func (c *ImagesListCall) IfNoneMatch(entityTag string) *ImagesListCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ImagesListCall) Context(ctx context.Context) *ImagesListCall { +func (c *HttpHealthChecksListCall) Context(ctx context.Context) *HttpHealthChecksListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ImagesListCall) Header() http.Header { +func (c *HttpHealthChecksListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ImagesListCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpHealthChecksListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -28166,7 +28449,7 @@ func (c *ImagesListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -28176,14 +28459,14 @@ func (c *ImagesListCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.images.list" call. -// Exactly one of *ImageList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *ImageList.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *ImagesListCall) Do(opts ...googleapi.CallOption) (*ImageList, error) { +// Do executes the "compute.httpHealthChecks.list" call. +// Exactly one of *HttpHealthCheckList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *HttpHealthCheckList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *HttpHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpHealthCheckList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -28202,7 +28485,7 @@ func (c *ImagesListCall) Do(opts ...googleapi.CallOption) (*ImageList, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &ImageList{ + ret := &HttpHealthCheckList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -28214,15 +28497,15 @@ func (c *ImagesListCall) Do(opts ...googleapi.CallOption) (*ImageList, error) { } return ret, nil // { - // "description": "Retrieves the list of private images available to the specified project. Private images are images you create that belong to your project. This method does not get any images that belong to other projects, including publicly-available images, like Debian 8. If you want to get a list of publicly-available images, use this method to make a request to the respective image project, such as debian-cloud or windows-cloud.", + // "description": "Retrieves the list of HttpHealthCheck resources available to the specified project.", // "httpMethod": "GET", - // "id": "compute.images.list", + // "id": "compute.httpHealthChecks.list", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -28252,9 +28535,9 @@ func (c *ImagesListCall) Do(opts ...googleapi.CallOption) (*ImageList, error) { // "type": "string" // } // }, - // "path": "{project}/global/images", + // "path": "{project}/global/httpHealthChecks", // "response": { - // "$ref": "ImageList" + // "$ref": "HttpHealthCheckList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -28268,7 +28551,7 @@ func (c *ImagesListCall) Do(opts ...googleapi.CallOption) (*ImageList, error) { // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *ImagesListCall) Pages(ctx context.Context, f func(*ImageList) error) error { +func (c *HttpHealthChecksListCall) Pages(ctx context.Context, f func(*HttpHealthCheckList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -28286,44 +28569,34 @@ func (c *ImagesListCall) Pages(ctx context.Context, f func(*ImageList) error) er } } -// method id "compute.instanceGroupManagers.abandonInstances": +// method id "compute.httpHealthChecks.patch": -type InstanceGroupManagersAbandonInstancesCall struct { - s *Service - project string - zone string - instanceGroupManager string - instancegroupmanagersabandoninstancesrequest *InstanceGroupManagersAbandonInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HttpHealthChecksPatchCall struct { + s *Service + project string + httpHealthCheck string + httphealthcheck *HttpHealthCheck + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AbandonInstances: Schedules a group action to remove the specified -// instances from the managed instance group. Abandoning an instance -// does not delete the instance, but it does remove the instance from -// any target pools that are applied by the managed instance group. This -// method reduces the targetSize of the managed instance group by the -// number of instances that you abandon. This operation is marked as -// DONE when the action is scheduled even if the instances have not yet -// been removed from the group. You must separately verify the status of -// the abandoning action with the listmanagedinstances method. -// -// You can specify a maximum of 1000 instances with this method per -// request. -func (r *InstanceGroupManagersService) AbandonInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersabandoninstancesrequest *InstanceGroupManagersAbandonInstancesRequest) *InstanceGroupManagersAbandonInstancesCall { - c := &InstanceGroupManagersAbandonInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Patch: Updates a HttpHealthCheck resource in the specified project +// using the data included in the request. This method supports PATCH +// semantics and uses the JSON merge patch format and processing rules. +// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/patch +func (r *HttpHealthChecksService) Patch(project string, httpHealthCheck string, httphealthcheck *HttpHealthCheck) *HttpHealthChecksPatchCall { + c := &HttpHealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroupManager = instanceGroupManager - c.instancegroupmanagersabandoninstancesrequest = instancegroupmanagersabandoninstancesrequest + c.httpHealthCheck = httpHealthCheck + c.httphealthcheck = httphealthcheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersAbandonInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupManagersAbandonInstancesCall { +func (c *HttpHealthChecksPatchCall) Fields(s ...googleapi.Field) *HttpHealthChecksPatchCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -28331,53 +28604,52 @@ func (c *InstanceGroupManagersAbandonInstancesCall) Fields(s ...googleapi.Field) // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersAbandonInstancesCall) Context(ctx context.Context) *InstanceGroupManagersAbandonInstancesCall { +func (c *HttpHealthChecksPatchCall) Context(ctx context.Context) *HttpHealthChecksPatchCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersAbandonInstancesCall) Header() http.Header { +func (c *HttpHealthChecksPatchCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersAbandonInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpHealthChecksPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersabandoninstancesrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("PATCH", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, + "httpHealthCheck": c.httpHealthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.abandonInstances" call. +// Do executes the "compute.httpHealthChecks.patch" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HttpHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -28408,18 +28680,18 @@ func (c *InstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOpt } return ret, nil // { - // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", - // "httpMethod": "POST", - // "id": "compute.instanceGroupManagers.abandonInstances", + // "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", + // "httpMethod": "PATCH", + // "id": "compute.httpHealthChecks.patch", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroupManager" + // "httpHealthCheck" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", + // "httpHealthCheck": { + // "description": "Name of the HttpHealthCheck resource to patch.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -28429,181 +28701,104 @@ func (c *InstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOpt // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", + // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", // "request": { - // "$ref": "InstanceGroupManagersAbandonInstancesRequest" + // "$ref": "HttpHealthCheck" // }, // "response": { // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instanceGroupManagers.aggregatedList": +// method id "compute.httpHealthChecks.update": -type InstanceGroupManagersAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type HttpHealthChecksUpdateCall struct { + s *Service + project string + httpHealthCheck string + httphealthcheck *HttpHealthCheck + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves the list of managed instance groups and -// groups them by zone. -func (r *InstanceGroupManagersService) AggregatedList(project string) *InstanceGroupManagersAggregatedListCall { - c := &InstanceGroupManagersAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Update: Updates a HttpHealthCheck resource in the specified project +// using the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks/update +func (r *HttpHealthChecksService) Update(project string, httpHealthCheck string, httphealthcheck *HttpHealthCheck) *HttpHealthChecksUpdateCall { + c := &HttpHealthChecksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *InstanceGroupManagersAggregatedListCall) Filter(filter string) *InstanceGroupManagersAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *InstanceGroupManagersAggregatedListCall) MaxResults(maxResults int64) *InstanceGroupManagersAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *InstanceGroupManagersAggregatedListCall) OrderBy(orderBy string) *InstanceGroupManagersAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *InstanceGroupManagersAggregatedListCall) PageToken(pageToken string) *InstanceGroupManagersAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) + c.httpHealthCheck = httpHealthCheck + c.httphealthcheck = httphealthcheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersAggregatedListCall) Fields(s ...googleapi.Field) *InstanceGroupManagersAggregatedListCall { +func (c *HttpHealthChecksUpdateCall) Fields(s ...googleapi.Field) *HttpHealthChecksUpdateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *InstanceGroupManagersAggregatedListCall) IfNoneMatch(entityTag string) *InstanceGroupManagersAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersAggregatedListCall) Context(ctx context.Context) *InstanceGroupManagersAggregatedListCall { +func (c *HttpHealthChecksUpdateCall) Context(ctx context.Context) *HttpHealthChecksUpdateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersAggregatedListCall) Header() http.Header { +func (c *HttpHealthChecksUpdateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpHealthChecksUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instanceGroupManagers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("PUT", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "httpHealthCheck": c.httpHealthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.aggregatedList" call. -// Exactly one of *InstanceGroupManagerAggregatedList or error will be -// non-nil. Any non-2xx status code is an error. Response headers are in -// either *InstanceGroupManagerAggregatedList.ServerResponse.Header or -// (if a response was returned at all) in -// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check -// whether the returned error was because http.StatusNotModified was -// returned. -func (c *InstanceGroupManagersAggregatedListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManagerAggregatedList, error) { +// Do executes the "compute.httpHealthChecks.update" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *HttpHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -28622,7 +28817,7 @@ func (c *InstanceGroupManagersAggregatedListCall) Do(opts ...googleapi.CallOptio if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceGroupManagerAggregatedList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -28634,34 +28829,19 @@ func (c *InstanceGroupManagersAggregatedListCall) Do(opts ...googleapi.CallOptio } return ret, nil // { - // "description": "Retrieves the list of managed instance groups and groups them by zone.", - // "httpMethod": "GET", - // "id": "compute.instanceGroupManagers.aggregatedList", + // "description": "Updates a HttpHealthCheck resource in the specified project using the data included in the request.", + // "httpMethod": "PUT", + // "id": "compute.httpHealthChecks.update", // "parameterOrder": [ - // "project" + // "project", + // "httpHealthCheck" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "httpHealthCheck": { + // "description": "Name of the HttpHealthCheck resource to update.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { @@ -28672,68 +28852,44 @@ func (c *InstanceGroupManagersAggregatedListCall) Do(opts ...googleapi.CallOptio // "type": "string" // } // }, - // "path": "{project}/aggregated/instanceGroupManagers", + // "path": "{project}/global/httpHealthChecks/{httpHealthCheck}", + // "request": { + // "$ref": "HttpHealthCheck" + // }, // "response": { - // "$ref": "InstanceGroupManagerAggregatedList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *InstanceGroupManagersAggregatedListCall) Pages(ctx context.Context, f func(*InstanceGroupManagerAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.instanceGroupManagers.delete": +// method id "compute.httpsHealthChecks.delete": -type InstanceGroupManagersDeleteCall struct { - s *Service - project string - zone string - instanceGroupManager string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HttpsHealthChecksDeleteCall struct { + s *Service + project string + httpsHealthCheck string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified managed instance group and all of the -// instances in that group. Note that the instance group must not belong -// to a backend service. Read Deleting an instance group for more -// information. -func (r *InstanceGroupManagersService) Delete(project string, zone string, instanceGroupManager string) *InstanceGroupManagersDeleteCall { - c := &InstanceGroupManagersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified HttpsHealthCheck resource. +func (r *HttpsHealthChecksService) Delete(project string, httpsHealthCheck string) *HttpsHealthChecksDeleteCall { + c := &HttpsHealthChecksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroupManager = instanceGroupManager + c.httpsHealthCheck = httpsHealthCheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersDeleteCall) Fields(s ...googleapi.Field) *InstanceGroupManagersDeleteCall { +func (c *HttpsHealthChecksDeleteCall) Fields(s ...googleapi.Field) *HttpsHealthChecksDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -28741,21 +28897,21 @@ func (c *InstanceGroupManagersDeleteCall) Fields(s ...googleapi.Field) *Instance // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersDeleteCall) Context(ctx context.Context) *InstanceGroupManagersDeleteCall { +func (c *HttpsHealthChecksDeleteCall) Context(ctx context.Context) *HttpsHealthChecksDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersDeleteCall) Header() http.Header { +func (c *HttpsHealthChecksDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpsHealthChecksDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -28763,26 +28919,25 @@ func (c *InstanceGroupManagersDeleteCall) doRequest(alt string) (*http.Response, reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, + "httpsHealthCheck": c.httpsHealthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.delete" call. +// Do executes the "compute.httpsHealthChecks.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HttpsHealthChecksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -28813,18 +28968,18 @@ func (c *InstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Deletes the specified managed instance group and all of the instances in that group. Note that the instance group must not belong to a backend service. Read Deleting an instance group for more information.", + // "description": "Deletes the specified HttpsHealthCheck resource.", // "httpMethod": "DELETE", - // "id": "compute.instanceGroupManagers.delete", + // "id": "compute.httpsHealthChecks.delete", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroupManager" + // "httpsHealthCheck" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "The name of the managed instance group to delete.", + // "httpsHealthCheck": { + // "description": "Name of the HttpsHealthCheck resource to delete.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -28834,15 +28989,9 @@ func (c *InstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", + // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", // "response": { // "$ref": "Operation" // }, @@ -28854,97 +29003,92 @@ func (c *InstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.instanceGroupManagers.deleteInstances": +// method id "compute.httpsHealthChecks.get": -type InstanceGroupManagersDeleteInstancesCall struct { - s *Service - project string - zone string - instanceGroupManager string - instancegroupmanagersdeleteinstancesrequest *InstanceGroupManagersDeleteInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HttpsHealthChecksGetCall struct { + s *Service + project string + httpsHealthCheck string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// DeleteInstances: Schedules a group action to delete the specified -// instances in the managed instance group. The instances are also -// removed from any target pools of which they were a member. This -// method reduces the targetSize of the managed instance group by the -// number of instances that you delete. This operation is marked as DONE -// when the action is scheduled even if the instances are still being -// deleted. You must separately verify the status of the deleting action -// with the listmanagedinstances method. -// -// You can specify a maximum of 1000 instances with this method per -// request. -func (r *InstanceGroupManagersService) DeleteInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersdeleteinstancesrequest *InstanceGroupManagersDeleteInstancesRequest) *InstanceGroupManagersDeleteInstancesCall { - c := &InstanceGroupManagersDeleteInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified HttpsHealthCheck resource. Get a list of +// available HTTPS health checks by making a list() request. +func (r *HttpsHealthChecksService) Get(project string, httpsHealthCheck string) *HttpsHealthChecksGetCall { + c := &HttpsHealthChecksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroupManager = instanceGroupManager - c.instancegroupmanagersdeleteinstancesrequest = instancegroupmanagersdeleteinstancesrequest + c.httpsHealthCheck = httpsHealthCheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersDeleteInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupManagersDeleteInstancesCall { +func (c *HttpsHealthChecksGetCall) Fields(s ...googleapi.Field) *HttpsHealthChecksGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *HttpsHealthChecksGetCall) IfNoneMatch(entityTag string) *HttpsHealthChecksGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersDeleteInstancesCall) Context(ctx context.Context) *InstanceGroupManagersDeleteInstancesCall { +func (c *HttpsHealthChecksGetCall) Context(ctx context.Context) *HttpsHealthChecksGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersDeleteInstancesCall) Header() http.Header { +func (c *HttpsHealthChecksGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersDeleteInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpsHealthChecksGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersdeleteinstancesrequest) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, + "httpsHealthCheck": c.httpsHealthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.deleteInstances" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.httpsHealthChecks.get" call. +// Exactly one of *HttpsHealthCheck or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *HttpsHealthCheck.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *HttpsHealthChecksGetCall) Do(opts ...googleapi.CallOption) (*HttpsHealthCheck, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -28963,7 +29107,7 @@ func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOpti if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &HttpsHealthCheck{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -28975,18 +29119,18 @@ func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOpti } return ret, nil // { - // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", - // "httpMethod": "POST", - // "id": "compute.instanceGroupManagers.deleteInstances", + // "description": "Returns the specified HttpsHealthCheck resource. Get a list of available HTTPS health checks by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.httpsHealthChecks.get", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroupManager" + // "httpsHealthCheck" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", + // "httpsHealthCheck": { + // "description": "Name of the HttpsHealthCheck resource to return.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -28996,224 +29140,45 @@ func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOpti // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", - // "request": { - // "$ref": "InstanceGroupManagersDeleteInstancesRequest" - // }, + // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", // "response": { - // "$ref": "Operation" + // "$ref": "HttpsHealthCheck" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instanceGroupManagers.get": +// method id "compute.httpsHealthChecks.insert": -type InstanceGroupManagersGetCall struct { - s *Service - project string - zone string - instanceGroupManager string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type HttpsHealthChecksInsertCall struct { + s *Service + project string + httpshealthcheck *HttpsHealthCheck + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns all of the details about the specified managed instance -// group. Get a list of available managed instance groups by making a -// list() request. -func (r *InstanceGroupManagersService) Get(project string, zone string, instanceGroupManager string) *InstanceGroupManagersGetCall { - c := &InstanceGroupManagersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a HttpsHealthCheck resource in the specified project +// using the data included in the request. +func (r *HttpsHealthChecksService) Insert(project string, httpshealthcheck *HttpsHealthCheck) *HttpsHealthChecksInsertCall { + c := &HttpsHealthChecksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroupManager = instanceGroupManager + c.httpshealthcheck = httpshealthcheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersGetCall) Fields(s ...googleapi.Field) *InstanceGroupManagersGetCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *InstanceGroupManagersGetCall) IfNoneMatch(entityTag string) *InstanceGroupManagersGetCall { - c.ifNoneMatch_ = entityTag - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *InstanceGroupManagersGetCall) Context(ctx context.Context) *InstanceGroupManagersGetCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *InstanceGroupManagersGetCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *InstanceGroupManagersGetCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroupManager": c.instanceGroupManager, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.instanceGroupManagers.get" call. -// Exactly one of *InstanceGroupManager or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *InstanceGroupManager.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *InstanceGroupManagersGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManager, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &InstanceGroupManager{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Returns all of the details about the specified managed instance group. Get a list of available managed instance groups by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.instanceGroupManagers.get", - // "parameterOrder": [ - // "project", - // "zone", - // "instanceGroupManager" - // ], - // "parameters": { - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", - // "location": "path", - // "required": true, - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", - // "response": { - // "$ref": "InstanceGroupManager" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" - // ] - // } - -} - -// method id "compute.instanceGroupManagers.insert": - -type InstanceGroupManagersInsertCall struct { - s *Service - project string - zone string - instancegroupmanager *InstanceGroupManager - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Insert: Creates a managed instance group using the information that -// you specify in the request. After the group is created, it schedules -// an action to create instances in the group using the specified -// instance template. This operation is marked as DONE when the group is -// created even if the instances in the group have not yet been created. -// You must separately verify the status of the individual instances -// with the listmanagedinstances method. -// -// A managed instance group can have up to 1000 VM instances per group. -func (r *InstanceGroupManagersService) Insert(project string, zone string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersInsertCall { - c := &InstanceGroupManagersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.zone = zone - c.instancegroupmanager = instancegroupmanager - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *InstanceGroupManagersInsertCall) Fields(s ...googleapi.Field) *InstanceGroupManagersInsertCall { +func (c *HttpsHealthChecksInsertCall) Fields(s ...googleapi.Field) *HttpsHealthChecksInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -29221,52 +29186,51 @@ func (c *InstanceGroupManagersInsertCall) Fields(s ...googleapi.Field) *Instance // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersInsertCall) Context(ctx context.Context) *InstanceGroupManagersInsertCall { +func (c *HttpsHealthChecksInsertCall) Context(ctx context.Context) *HttpsHealthChecksInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersInsertCall) Header() http.Header { +func (c *HttpsHealthChecksInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpsHealthChecksInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.insert" call. +// Do executes the "compute.httpsHealthChecks.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HttpsHealthChecksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -29297,12 +29261,11 @@ func (c *InstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group.", + // "description": "Creates a HttpsHealthCheck resource in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.instanceGroupManagers.insert", + // "id": "compute.httpsHealthChecks.insert", // "parameterOrder": [ - // "project", - // "zone" + // "project" // ], // "parameters": { // "project": { @@ -29311,17 +29274,11 @@ func (c *InstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where you want to create the managed instance group.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers", + // "path": "{project}/global/httpsHealthChecks", // "request": { - // "$ref": "InstanceGroupManager" + // "$ref": "HttpsHealthCheck" // }, // "response": { // "$ref": "Operation" @@ -29334,31 +29291,28 @@ func (c *InstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.instanceGroupManagers.list": +// method id "compute.httpsHealthChecks.list": -type InstanceGroupManagersListCall struct { +type HttpsHealthChecksListCall struct { s *Service project string - zone string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of managed instance groups that are contained -// within the specified project and zone. -func (r *InstanceGroupManagersService) List(project string, zone string) *InstanceGroupManagersListCall { - c := &InstanceGroupManagersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of HttpsHealthCheck resources available to +// the specified project. +func (r *HttpsHealthChecksService) List(project string) *HttpsHealthChecksListCall { + c := &HttpsHealthChecksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -29370,7 +29324,7 @@ func (r *InstanceGroupManagersService) List(project string, zone string) *Instan // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -29382,7 +29336,7 @@ func (r *InstanceGroupManagersService) List(project string, zone string) *Instan // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *InstanceGroupManagersListCall) Filter(filter string) *InstanceGroupManagersListCall { +func (c *HttpsHealthChecksListCall) Filter(filter string) *HttpsHealthChecksListCall { c.urlParams_.Set("filter", filter) return c } @@ -29393,7 +29347,7 @@ func (c *InstanceGroupManagersListCall) Filter(filter string) *InstanceGroupMana // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *InstanceGroupManagersListCall) MaxResults(maxResults int64) *InstanceGroupManagersListCall { +func (c *HttpsHealthChecksListCall) MaxResults(maxResults int64) *HttpsHealthChecksListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -29410,7 +29364,7 @@ func (c *InstanceGroupManagersListCall) MaxResults(maxResults int64) *InstanceGr // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *InstanceGroupManagersListCall) OrderBy(orderBy string) *InstanceGroupManagersListCall { +func (c *HttpsHealthChecksListCall) OrderBy(orderBy string) *HttpsHealthChecksListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -29418,7 +29372,7 @@ func (c *InstanceGroupManagersListCall) OrderBy(orderBy string) *InstanceGroupMa // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *InstanceGroupManagersListCall) PageToken(pageToken string) *InstanceGroupManagersListCall { +func (c *HttpsHealthChecksListCall) PageToken(pageToken string) *HttpsHealthChecksListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -29426,7 +29380,7 @@ func (c *InstanceGroupManagersListCall) PageToken(pageToken string) *InstanceGro // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersListCall) Fields(s ...googleapi.Field) *InstanceGroupManagersListCall { +func (c *HttpsHealthChecksListCall) Fields(s ...googleapi.Field) *HttpsHealthChecksListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -29436,7 +29390,7 @@ func (c *InstanceGroupManagersListCall) Fields(s ...googleapi.Field) *InstanceGr // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *InstanceGroupManagersListCall) IfNoneMatch(entityTag string) *InstanceGroupManagersListCall { +func (c *HttpsHealthChecksListCall) IfNoneMatch(entityTag string) *HttpsHealthChecksListCall { c.ifNoneMatch_ = entityTag return c } @@ -29444,21 +29398,21 @@ func (c *InstanceGroupManagersListCall) IfNoneMatch(entityTag string) *InstanceG // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersListCall) Context(ctx context.Context) *InstanceGroupManagersListCall { +func (c *HttpsHealthChecksListCall) Context(ctx context.Context) *HttpsHealthChecksListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersListCall) Header() http.Header { +func (c *HttpsHealthChecksListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersListCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpsHealthChecksListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -29469,25 +29423,24 @@ func (c *InstanceGroupManagersListCall) doRequest(alt string) (*http.Response, e } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.list" call. -// Exactly one of *InstanceGroupManagerList or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *InstanceGroupManagerList.ServerResponse.Header or (if a response was +// Do executes the "compute.httpsHealthChecks.list" call. +// Exactly one of *HttpsHealthCheckList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *HttpsHealthCheckList.ServerResponse.Header or (if a response was // returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *InstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManagerList, error) { +func (c *HttpsHealthChecksListCall) Do(opts ...googleapi.CallOption) (*HttpsHealthCheckList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -29506,7 +29459,7 @@ func (c *InstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*Insta if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceGroupManagerList{ + ret := &HttpsHealthCheckList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -29518,16 +29471,15 @@ func (c *InstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*Insta } return ret, nil // { - // "description": "Retrieves a list of managed instance groups that are contained within the specified project and zone.", + // "description": "Retrieves the list of HttpsHealthCheck resources available to the specified project.", // "httpMethod": "GET", - // "id": "compute.instanceGroupManagers.list", + // "id": "compute.httpsHealthChecks.list", // "parameterOrder": [ - // "project", - // "zone" + // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -29555,17 +29507,11 @@ func (c *InstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*Insta // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers", + // "path": "{project}/global/httpsHealthChecks", // "response": { - // "$ref": "InstanceGroupManagerList" + // "$ref": "HttpsHealthCheckList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -29579,7 +29525,7 @@ func (c *InstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*Insta // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *InstanceGroupManagersListCall) Pages(ctx context.Context, f func(*InstanceGroupManagerList) error) error { +func (c *HttpsHealthChecksListCall) Pages(ctx context.Context, f func(*HttpsHealthCheckList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -29597,60 +29543,33 @@ func (c *InstanceGroupManagersListCall) Pages(ctx context.Context, f func(*Insta } } -// method id "compute.instanceGroupManagers.listManagedInstances": +// method id "compute.httpsHealthChecks.patch": -type InstanceGroupManagersListManagedInstancesCall struct { - s *Service - project string - zone string - instanceGroupManager string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HttpsHealthChecksPatchCall struct { + s *Service + project string + httpsHealthCheck string + httpshealthcheck *HttpsHealthCheck + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// ListManagedInstances: Lists all of the instances in the managed -// instance group. Each instance in the list has a currentAction, which -// indicates the action that the managed instance group is performing on -// the instance. For example, if the group is still creating an -// instance, the currentAction is CREATING. If a previous action failed, -// the list displays the errors for that failed action. -func (r *InstanceGroupManagersService) ListManagedInstances(project string, zone string, instanceGroupManager string) *InstanceGroupManagersListManagedInstancesCall { - c := &InstanceGroupManagersListManagedInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Patch: Updates a HttpsHealthCheck resource in the specified project +// using the data included in the request. This method supports PATCH +// semantics and uses the JSON merge patch format and processing rules. +func (r *HttpsHealthChecksService) Patch(project string, httpsHealthCheck string, httpshealthcheck *HttpsHealthCheck) *HttpsHealthChecksPatchCall { + c := &HttpsHealthChecksPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroupManager = instanceGroupManager - return c -} - -// Filter sets the optional parameter "filter": -func (c *InstanceGroupManagersListManagedInstancesCall) Filter(filter string) *InstanceGroupManagersListManagedInstancesCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": -func (c *InstanceGroupManagersListManagedInstancesCall) MaxResults(maxResults int64) *InstanceGroupManagersListManagedInstancesCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "order_by": -func (c *InstanceGroupManagersListManagedInstancesCall) OrderBy(orderBy string) *InstanceGroupManagersListManagedInstancesCall { - c.urlParams_.Set("order_by", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": -func (c *InstanceGroupManagersListManagedInstancesCall) PageToken(pageToken string) *InstanceGroupManagersListManagedInstancesCall { - c.urlParams_.Set("pageToken", pageToken) + c.httpsHealthCheck = httpsHealthCheck + c.httpshealthcheck = httpshealthcheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersListManagedInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupManagersListManagedInstancesCall { +func (c *HttpsHealthChecksPatchCall) Fields(s ...googleapi.Field) *HttpsHealthChecksPatchCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -29658,50 +29577,52 @@ func (c *InstanceGroupManagersListManagedInstancesCall) Fields(s ...googleapi.Fi // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersListManagedInstancesCall) Context(ctx context.Context) *InstanceGroupManagersListManagedInstancesCall { +func (c *HttpsHealthChecksPatchCall) Context(ctx context.Context) *HttpsHealthChecksPatchCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersListManagedInstancesCall) Header() http.Header { +func (c *HttpsHealthChecksPatchCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersListManagedInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpsHealthChecksPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("PATCH", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, + "httpsHealthCheck": c.httpsHealthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.listManagedInstances" call. -// Exactly one of *InstanceGroupManagersListManagedInstancesResponse or -// error will be non-nil. Any non-2xx status code is an error. Response -// headers are in either -// *InstanceGroupManagersListManagedInstancesResponse.ServerResponse.Head -// er or (if a response was returned at all) in -// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check -// whether the returned error was because http.StatusNotModified was -// returned. -func (c *InstanceGroupManagersListManagedInstancesCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManagersListManagedInstancesResponse, error) { +// Do executes the "compute.httpsHealthChecks.patch" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *HttpsHealthChecksPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -29720,7 +29641,7 @@ func (c *InstanceGroupManagersListManagedInstancesCall) Do(opts ...googleapi.Cal if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceGroupManagersListManagedInstancesResponse{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -29732,57 +29653,35 @@ func (c *InstanceGroupManagersListManagedInstancesCall) Do(opts ...googleapi.Cal } return ret, nil // { - // "description": "Lists all of the instances in the managed instance group. Each instance in the list has a currentAction, which indicates the action that the managed instance group is performing on the instance. For example, if the group is still creating an instance, the currentAction is CREATING. If a previous action failed, the list displays the errors for that failed action.", - // "httpMethod": "POST", - // "id": "compute.instanceGroupManagers.listManagedInstances", + // "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", + // "httpMethod": "PATCH", + // "id": "compute.httpsHealthChecks.patch", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroupManager" + // "httpsHealthCheck" // ], // "parameters": { - // "filter": { - // "location": "query", - // "type": "string" - // }, - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", + // "httpsHealthCheck": { + // "description": "Name of the HttpsHealthCheck resource to patch.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, - // "maxResults": { - // "default": "500", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "order_by": { - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "location": "query", - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances", + // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", + // "request": { + // "$ref": "HttpsHealthCheck" + // }, // "response": { - // "$ref": "InstanceGroupManagersListManagedInstancesResponse" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -29793,42 +29692,32 @@ func (c *InstanceGroupManagersListManagedInstancesCall) Do(opts ...googleapi.Cal } -// method id "compute.instanceGroupManagers.recreateInstances": +// method id "compute.httpsHealthChecks.update": -type InstanceGroupManagersRecreateInstancesCall struct { - s *Service - project string - zone string - instanceGroupManager string - instancegroupmanagersrecreateinstancesrequest *InstanceGroupManagersRecreateInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type HttpsHealthChecksUpdateCall struct { + s *Service + project string + httpsHealthCheck string + httpshealthcheck *HttpsHealthCheck + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// RecreateInstances: Schedules a group action to recreate the specified -// instances in the managed instance group. The instances are deleted -// and recreated using the current instance template for the managed -// instance group. This operation is marked as DONE when the action is -// scheduled even if the instances have not yet been recreated. You must -// separately verify the status of the recreating action with the -// listmanagedinstances method. -// -// You can specify a maximum of 1000 instances with this method per -// request. -func (r *InstanceGroupManagersService) RecreateInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersrecreateinstancesrequest *InstanceGroupManagersRecreateInstancesRequest) *InstanceGroupManagersRecreateInstancesCall { - c := &InstanceGroupManagersRecreateInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Update: Updates a HttpsHealthCheck resource in the specified project +// using the data included in the request. +func (r *HttpsHealthChecksService) Update(project string, httpsHealthCheck string, httpshealthcheck *HttpsHealthCheck) *HttpsHealthChecksUpdateCall { + c := &HttpsHealthChecksUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroupManager = instanceGroupManager - c.instancegroupmanagersrecreateinstancesrequest = instancegroupmanagersrecreateinstancesrequest + c.httpsHealthCheck = httpsHealthCheck + c.httpshealthcheck = httpshealthcheck return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersRecreateInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupManagersRecreateInstancesCall { +func (c *HttpsHealthChecksUpdateCall) Fields(s ...googleapi.Field) *HttpsHealthChecksUpdateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -29836,53 +29725,52 @@ func (c *InstanceGroupManagersRecreateInstancesCall) Fields(s ...googleapi.Field // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersRecreateInstancesCall) Context(ctx context.Context) *InstanceGroupManagersRecreateInstancesCall { +func (c *HttpsHealthChecksUpdateCall) Context(ctx context.Context) *HttpsHealthChecksUpdateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersRecreateInstancesCall) Header() http.Header { +func (c *HttpsHealthChecksUpdateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersRecreateInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *HttpsHealthChecksUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersrecreateinstancesrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("PUT", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, + "httpsHealthCheck": c.httpsHealthCheck, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.recreateInstances" call. +// Do executes the "compute.httpsHealthChecks.update" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *HttpsHealthChecksUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -29913,18 +29801,18 @@ func (c *InstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOp } return ret, nil // { - // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", - // "httpMethod": "POST", - // "id": "compute.instanceGroupManagers.recreateInstances", + // "description": "Updates a HttpsHealthCheck resource in the specified project using the data included in the request.", + // "httpMethod": "PUT", + // "id": "compute.httpsHealthChecks.update", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroupManager" + // "httpsHealthCheck" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", + // "httpsHealthCheck": { + // "description": "Name of the HttpsHealthCheck resource to update.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -29934,17 +29822,11 @@ func (c *InstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOp // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", + // "path": "{project}/global/httpsHealthChecks/{httpsHealthCheck}", // "request": { - // "$ref": "InstanceGroupManagersRecreateInstancesRequest" + // "$ref": "HttpsHealthCheck" // }, // "response": { // "$ref": "Operation" @@ -29957,38 +29839,30 @@ func (c *InstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOp } -// method id "compute.instanceGroupManagers.resize": +// method id "compute.images.delete": -type InstanceGroupManagersResizeCall struct { - s *Service - project string - zone string - instanceGroupManager string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ImagesDeleteCall struct { + s *Service + project string + image string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Resize: Resizes the managed instance group. If you increase the size, -// the group creates new instances using the current instance template. -// If you decrease the size, the group deletes instances. The resize -// operation is marked DONE when the resize actions are scheduled even -// if the group has not yet added or deleted any instances. You must -// separately verify the status of the creating or deleting actions with -// the listmanagedinstances method. -func (r *InstanceGroupManagersService) Resize(project string, zone string, instanceGroupManager string, size int64) *InstanceGroupManagersResizeCall { - c := &InstanceGroupManagersResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified image. +// For details, see https://cloud.google.com/compute/docs/reference/latest/images/delete +func (r *ImagesService) Delete(project string, image string) *ImagesDeleteCall { + c := &ImagesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroupManager = instanceGroupManager - c.urlParams_.Set("size", fmt.Sprint(size)) + c.image = image return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersResizeCall) Fields(s ...googleapi.Field) *InstanceGroupManagersResizeCall { +func (c *ImagesDeleteCall) Fields(s ...googleapi.Field) *ImagesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -29996,21 +29870,21 @@ func (c *InstanceGroupManagersResizeCall) Fields(s ...googleapi.Field) *Instance // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersResizeCall) Context(ctx context.Context) *InstanceGroupManagersResizeCall { +func (c *ImagesDeleteCall) Context(ctx context.Context) *ImagesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersResizeCall) Header() http.Header { +func (c *ImagesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersResizeCall) doRequest(alt string) (*http.Response, error) { +func (c *ImagesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -30018,26 +29892,25 @@ func (c *InstanceGroupManagersResizeCall) doRequest(alt string) (*http.Response, reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, + "image": c.image, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.resize" call. +// Do executes the "compute.images.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ImagesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -30068,19 +29941,18 @@ func (c *InstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", - // "httpMethod": "POST", - // "id": "compute.instanceGroupManagers.resize", + // "description": "Deletes the specified image.", + // "httpMethod": "DELETE", + // "id": "compute.images.delete", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroupManager", - // "size" + // "image" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", + // "image": { + // "description": "Name of the image resource to delete.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -30090,22 +29962,9 @@ func (c *InstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "size": { - // "description": "The number of running instances that the managed instance group should maintain at any given time. The group automatically adds or removes instances to maintain the number of instances specified by this parameter.", - // "format": "int32", - // "location": "query", - // "required": true, - // "type": "integer" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize", + // "path": "{project}/global/images/{image}", // "response": { // "$ref": "Operation" // }, @@ -30117,35 +29976,35 @@ func (c *InstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.instanceGroupManagers.setInstanceTemplate": +// method id "compute.images.deprecate": -type InstanceGroupManagersSetInstanceTemplateCall struct { - s *Service - project string - zone string - instanceGroupManager string - instancegroupmanagerssetinstancetemplaterequest *InstanceGroupManagersSetInstanceTemplateRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ImagesDeprecateCall struct { + s *Service + project string + image string + deprecationstatus *DeprecationStatus + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetInstanceTemplate: Specifies the instance template to use when -// creating new instances in this group. The templates for existing -// instances in the group do not change unless you recreate them. -func (r *InstanceGroupManagersService) SetInstanceTemplate(project string, zone string, instanceGroupManager string, instancegroupmanagerssetinstancetemplaterequest *InstanceGroupManagersSetInstanceTemplateRequest) *InstanceGroupManagersSetInstanceTemplateCall { - c := &InstanceGroupManagersSetInstanceTemplateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Deprecate: Sets the deprecation status of an image. +// +// If an empty request body is given, clears the deprecation status +// instead. +// For details, see https://cloud.google.com/compute/docs/reference/latest/images/deprecate +func (r *ImagesService) Deprecate(project string, image string, deprecationstatus *DeprecationStatus) *ImagesDeprecateCall { + c := &ImagesDeprecateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroupManager = instanceGroupManager - c.instancegroupmanagerssetinstancetemplaterequest = instancegroupmanagerssetinstancetemplaterequest + c.image = image + c.deprecationstatus = deprecationstatus return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersSetInstanceTemplateCall) Fields(s ...googleapi.Field) *InstanceGroupManagersSetInstanceTemplateCall { +func (c *ImagesDeprecateCall) Fields(s ...googleapi.Field) *ImagesDeprecateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -30153,53 +30012,52 @@ func (c *InstanceGroupManagersSetInstanceTemplateCall) Fields(s ...googleapi.Fie // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersSetInstanceTemplateCall) Context(ctx context.Context) *InstanceGroupManagersSetInstanceTemplateCall { +func (c *ImagesDeprecateCall) Context(ctx context.Context) *ImagesDeprecateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersSetInstanceTemplateCall) Header() http.Header { +func (c *ImagesDeprecateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersSetInstanceTemplateCall) doRequest(alt string) (*http.Response, error) { +func (c *ImagesDeprecateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssetinstancetemplaterequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.deprecationstatus) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}/deprecate") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, + "image": c.image, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.setInstanceTemplate" call. +// Do executes the "compute.images.deprecate" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ImagesDeprecateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -30230,18 +30088,18 @@ func (c *InstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleapi.Call } return ret, nil // { - // "description": "Specifies the instance template to use when creating new instances in this group. The templates for existing instances in the group do not change unless you recreate them.", + // "description": "Sets the deprecation status of an image.\n\nIf an empty request body is given, clears the deprecation status instead.", // "httpMethod": "POST", - // "id": "compute.instanceGroupManagers.setInstanceTemplate", + // "id": "compute.images.deprecate", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroupManager" + // "image" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", + // "image": { + // "description": "Image name.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -30251,17 +30109,11 @@ func (c *InstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleapi.Call // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate", + // "path": "{project}/global/images/{image}/deprecate", // "request": { - // "$ref": "InstanceGroupManagersSetInstanceTemplateRequest" + // "$ref": "DeprecationStatus" // }, // "response": { // "$ref": "Operation" @@ -30274,93 +30126,93 @@ func (c *InstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleapi.Call } -// method id "compute.instanceGroupManagers.setTargetPools": +// method id "compute.images.get": -type InstanceGroupManagersSetTargetPoolsCall struct { - s *Service - project string - zone string - instanceGroupManager string - instancegroupmanagerssettargetpoolsrequest *InstanceGroupManagersSetTargetPoolsRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ImagesGetCall struct { + s *Service + project string + image string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// SetTargetPools: Modifies the target pools to which all instances in -// this managed instance group are assigned. The target pools -// automatically apply to all of the instances in the managed instance -// group. This operation is marked DONE when you make the request even -// if the instances have not yet been added to their target pools. The -// change might take some time to apply to all of the instances in the -// group depending on the size of the group. -func (r *InstanceGroupManagersService) SetTargetPools(project string, zone string, instanceGroupManager string, instancegroupmanagerssettargetpoolsrequest *InstanceGroupManagersSetTargetPoolsRequest) *InstanceGroupManagersSetTargetPoolsCall { - c := &InstanceGroupManagersSetTargetPoolsCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified image. Get a list of available images by +// making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/images/get +func (r *ImagesService) Get(project string, image string) *ImagesGetCall { + c := &ImagesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroupManager = instanceGroupManager - c.instancegroupmanagerssettargetpoolsrequest = instancegroupmanagerssettargetpoolsrequest + c.image = image return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupManagersSetTargetPoolsCall) Fields(s ...googleapi.Field) *InstanceGroupManagersSetTargetPoolsCall { +func (c *ImagesGetCall) Fields(s ...googleapi.Field) *ImagesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ImagesGetCall) IfNoneMatch(entityTag string) *ImagesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupManagersSetTargetPoolsCall) Context(ctx context.Context) *InstanceGroupManagersSetTargetPoolsCall { +func (c *ImagesGetCall) Context(ctx context.Context) *ImagesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupManagersSetTargetPoolsCall) Header() http.Header { +func (c *ImagesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupManagersSetTargetPoolsCall) doRequest(alt string) (*http.Response, error) { +func (c *ImagesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssettargetpoolsrequest) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, + "image": c.image, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroupManagers.setTargetPools" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.images.get" call. +// Exactly one of *Image or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Image.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ImagesGetCall) Do(opts ...googleapi.CallOption) (*Image, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -30379,7 +30231,7 @@ func (c *InstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.CallOptio if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &Image{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -30391,18 +30243,18 @@ func (c *InstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.CallOptio } return ret, nil // { - // "description": "Modifies the target pools to which all instances in this managed instance group are assigned. The target pools automatically apply to all of the instances in the managed instance group. This operation is marked DONE when you make the request even if the instances have not yet been added to their target pools. The change might take some time to apply to all of the instances in the group depending on the size of the group.", - // "httpMethod": "POST", - // "id": "compute.instanceGroupManagers.setTargetPools", + // "description": "Returns the specified image. Get a list of available images by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.images.get", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroupManager" + // "image" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", + // "image": { + // "description": "Name of the image resource to return.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -30412,112 +30264,107 @@ func (c *InstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.CallOptio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the managed instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools", - // "request": { - // "$ref": "InstanceGroupManagersSetTargetPoolsRequest" - // }, + // "path": "{project}/global/images/{image}", // "response": { - // "$ref": "Operation" + // "$ref": "Image" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instanceGroups.addInstances": +// method id "compute.images.getFromFamily": -type InstanceGroupsAddInstancesCall struct { - s *Service - project string - zone string - instanceGroup string - instancegroupsaddinstancesrequest *InstanceGroupsAddInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ImagesGetFromFamilyCall struct { + s *Service + project string + family string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// AddInstances: Adds a list of instances to the specified instance -// group. All of the instances in the instance group must be in the same -// network/subnetwork. Read Adding instances for more information. -func (r *InstanceGroupsService) AddInstances(project string, zone string, instanceGroup string, instancegroupsaddinstancesrequest *InstanceGroupsAddInstancesRequest) *InstanceGroupsAddInstancesCall { - c := &InstanceGroupsAddInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// GetFromFamily: Returns the latest image that is part of an image +// family and is not deprecated. +func (r *ImagesService) GetFromFamily(project string, family string) *ImagesGetFromFamilyCall { + c := &ImagesGetFromFamilyCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroup = instanceGroup - c.instancegroupsaddinstancesrequest = instancegroupsaddinstancesrequest + c.family = family return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsAddInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupsAddInstancesCall { +func (c *ImagesGetFromFamilyCall) Fields(s ...googleapi.Field) *ImagesGetFromFamilyCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ImagesGetFromFamilyCall) IfNoneMatch(entityTag string) *ImagesGetFromFamilyCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsAddInstancesCall) Context(ctx context.Context) *InstanceGroupsAddInstancesCall { +func (c *ImagesGetFromFamilyCall) Context(ctx context.Context) *ImagesGetFromFamilyCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsAddInstancesCall) Header() http.Header { +func (c *ImagesGetFromFamilyCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsAddInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *ImagesGetFromFamilyCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsaddinstancesrequest) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/family/{family}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroup": c.instanceGroup, + "project": c.project, + "family": c.family, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.addInstances" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.images.getFromFamily" call. +// Exactly one of *Image or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Image.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ImagesGetFromFamilyCall) Do(opts ...googleapi.CallOption) (*Image, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -30536,7 +30383,7 @@ func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Oper if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &Image{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -30548,18 +30395,18 @@ func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Adds a list of instances to the specified instance group. All of the instances in the instance group must be in the same network/subnetwork. Read Adding instances for more information.", - // "httpMethod": "POST", - // "id": "compute.instanceGroups.addInstances", + // "description": "Returns the latest image that is part of an image family and is not deprecated.", + // "httpMethod": "GET", + // "id": "compute.images.getFromFamily", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroup" + // "family" // ], // "parameters": { - // "instanceGroup": { - // "description": "The name of the instance group where you are adding instances.", + // "family": { + // "description": "Name of the image family to search for.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -30569,165 +30416,90 @@ func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Oper // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances", - // "request": { - // "$ref": "InstanceGroupsAddInstancesRequest" - // }, + // "path": "{project}/global/images/family/{family}", // "response": { - // "$ref": "Operation" + // "$ref": "Image" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instanceGroups.aggregatedList": +// method id "compute.images.insert": -type InstanceGroupsAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type ImagesInsertCall struct { + s *Service + project string + image *Image + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves the list of instance groups and sorts them -// by zone. -func (r *InstanceGroupsService) AggregatedList(project string) *InstanceGroupsAggregatedListCall { - c := &InstanceGroupsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates an image in the specified project using the data +// included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/images/insert +func (r *ImagesService) Insert(project string, image *Image) *ImagesInsertCall { + c := &ImagesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.image = image return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *InstanceGroupsAggregatedListCall) Filter(filter string) *InstanceGroupsAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *InstanceGroupsAggregatedListCall) MaxResults(maxResults int64) *InstanceGroupsAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *InstanceGroupsAggregatedListCall) OrderBy(orderBy string) *InstanceGroupsAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *InstanceGroupsAggregatedListCall) PageToken(pageToken string) *InstanceGroupsAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) +// ForceCreate sets the optional parameter "forceCreate": Force image +// creation if true. +func (c *ImagesInsertCall) ForceCreate(forceCreate bool) *ImagesInsertCall { + c.urlParams_.Set("forceCreate", fmt.Sprint(forceCreate)) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsAggregatedListCall) Fields(s ...googleapi.Field) *InstanceGroupsAggregatedListCall { +func (c *ImagesInsertCall) Fields(s ...googleapi.Field) *ImagesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *InstanceGroupsAggregatedListCall) IfNoneMatch(entityTag string) *InstanceGroupsAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsAggregatedListCall) Context(ctx context.Context) *InstanceGroupsAggregatedListCall { +func (c *ImagesInsertCall) Context(ctx context.Context) *ImagesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsAggregatedListCall) Header() http.Header { +func (c *ImagesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *ImagesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.image) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instanceGroups") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, @@ -30735,14 +30507,14 @@ func (c *InstanceGroupsAggregatedListCall) doRequest(alt string) (*http.Response return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.aggregatedList" call. -// Exactly one of *InstanceGroupAggregatedList or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *InstanceGroupAggregatedList.ServerResponse.Header or (if a response -// was returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *InstanceGroupsAggregatedListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupAggregatedList, error) { +// Do executes the "compute.images.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ImagesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -30761,7 +30533,7 @@ func (c *InstanceGroupsAggregatedListCall) Do(opts ...googleapi.CallOption) (*In if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceGroupAggregatedList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -30773,35 +30545,17 @@ func (c *InstanceGroupsAggregatedListCall) Do(opts ...googleapi.CallOption) (*In } return ret, nil // { - // "description": "Retrieves the list of instance groups and sorts them by zone.", - // "httpMethod": "GET", - // "id": "compute.instanceGroups.aggregatedList", + // "description": "Creates an image in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.images.insert", // "parameterOrder": [ // "project" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "forceCreate": { + // "description": "Force image creation if true.", // "location": "query", - // "type": "string" + // "type": "boolean" // }, // "project": { // "description": "Project ID for this request.", @@ -30811,117 +30565,180 @@ func (c *InstanceGroupsAggregatedListCall) Do(opts ...googleapi.CallOption) (*In // "type": "string" // } // }, - // "path": "{project}/aggregated/instanceGroups", + // "path": "{project}/global/images", + // "request": { + // "$ref": "Image" + // }, // "response": { - // "$ref": "InstanceGroupAggregatedList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/devstorage.full_control", + // "https://www.googleapis.com/auth/devstorage.read_only", + // "https://www.googleapis.com/auth/devstorage.read_write" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *InstanceGroupsAggregatedListCall) Pages(ctx context.Context, f func(*InstanceGroupAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } +// method id "compute.images.list": + +type ImagesListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// method id "compute.instanceGroups.delete": +// List: Retrieves the list of private images available to the specified +// project. Private images are images you create that belong to your +// project. This method does not get any images that belong to other +// projects, including publicly-available images, like Debian 8. If you +// want to get a list of publicly-available images, use this method to +// make a request to the respective image project, such as debian-cloud +// or windows-cloud. +// For details, see https://cloud.google.com/compute/docs/reference/latest/images/list +func (r *ImagesService) List(project string) *ImagesListCall { + c := &ImagesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + return c +} -type InstanceGroupsDeleteCall struct { - s *Service - project string - zone string - instanceGroup string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *ImagesListCall) Filter(filter string) *ImagesListCall { + c.urlParams_.Set("filter", filter) + return c } -// Delete: Deletes the specified instance group. The instances in the -// group are not deleted. Note that instance group must not belong to a -// backend service. Read Deleting an instance group for more -// information. -func (r *InstanceGroupsService) Delete(project string, zone string, instanceGroup string) *InstanceGroupsDeleteCall { - c := &InstanceGroupsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.zone = zone - c.instanceGroup = instanceGroup +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *ImagesListCall) MaxResults(maxResults int64) *ImagesListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *ImagesListCall) OrderBy(orderBy string) *ImagesListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *ImagesListCall) PageToken(pageToken string) *ImagesListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsDeleteCall) Fields(s ...googleapi.Field) *InstanceGroupsDeleteCall { +func (c *ImagesListCall) Fields(s ...googleapi.Field) *ImagesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ImagesListCall) IfNoneMatch(entityTag string) *ImagesListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsDeleteCall) Context(ctx context.Context) *InstanceGroupsDeleteCall { +func (c *ImagesListCall) Context(ctx context.Context) *ImagesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsDeleteCall) Header() http.Header { +func (c *ImagesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *ImagesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroup": c.instanceGroup, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.images.list" call. +// Exactly one of *ImageList or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at +// *ImageList.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ImagesListCall) Do(opts ...googleapi.CallOption) (*ImageList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -30940,7 +30757,7 @@ func (c *InstanceGroupsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &ImageList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -30952,19 +30769,34 @@ func (c *InstanceGroupsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Deletes the specified instance group. The instances in the group are not deleted. Note that instance group must not belong to a backend service. Read Deleting an instance group for more information.", - // "httpMethod": "DELETE", - // "id": "compute.instanceGroups.delete", + // "description": "Retrieves the list of private images available to the specified project. Private images are images you create that belong to your project. This method does not get any images that belong to other projects, including publicly-available images, like Debian 8. If you want to get a list of publicly-available images, use this method to make a request to the respective image project, such as debian-cloud or windows-cloud.", + // "httpMethod": "GET", + // "id": "compute.images.list", // "parameterOrder": [ - // "project", - // "zone", - // "instanceGroup" + // "project" // ], // "parameters": { - // "instanceGroup": { - // "description": "The name of the instance group to delete.", - // "location": "path", - // "required": true, + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", // "type": "string" // }, // "project": { @@ -30973,115 +30805,121 @@ func (c *InstanceGroupsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}", + // "path": "{project}/global/images", // "response": { - // "$ref": "Operation" + // "$ref": "ImageList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instanceGroups.get": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *ImagesListCall) Pages(ctx context.Context, f func(*ImageList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type InstanceGroupsGetCall struct { - s *Service - project string - zone string - instanceGroup string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +// method id "compute.images.setLabels": + +type ImagesSetLabelsCall struct { + s *Service + project string + resource string + globalsetlabelsrequest *GlobalSetLabelsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified instance group. Get a list of available -// instance groups by making a list() request. -func (r *InstanceGroupsService) Get(project string, zone string, instanceGroup string) *InstanceGroupsGetCall { - c := &InstanceGroupsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetLabels: Sets the labels on an image. To learn more about labels, +// read the Labeling Resources documentation. +func (r *ImagesService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *ImagesSetLabelsCall { + c := &ImagesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instanceGroup = instanceGroup + c.resource = resource + c.globalsetlabelsrequest = globalsetlabelsrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsGetCall) Fields(s ...googleapi.Field) *InstanceGroupsGetCall { +func (c *ImagesSetLabelsCall) Fields(s ...googleapi.Field) *ImagesSetLabelsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *InstanceGroupsGetCall) IfNoneMatch(entityTag string) *InstanceGroupsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsGetCall) Context(ctx context.Context) *InstanceGroupsGetCall { +func (c *ImagesSetLabelsCall) Context(ctx context.Context) *ImagesSetLabelsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsGetCall) Header() http.Header { +func (c *ImagesSetLabelsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsGetCall) doRequest(alt string) (*http.Response, error) { +func (c *ImagesSetLabelsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{resource}/setLabels") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroup": c.instanceGroup, + "project": c.project, + "resource": c.resource, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.get" call. -// Exactly one of *InstanceGroup or error will be non-nil. Any non-2xx +// Do executes the "compute.images.setLabels" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *InstanceGroup.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *InstanceGroupsGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroup, error) { +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ImagesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -31100,7 +30938,7 @@ func (c *InstanceGroupsGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroup if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceGroup{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -31112,21 +30950,14 @@ func (c *InstanceGroupsGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroup } return ret, nil // { - // "description": "Returns the specified instance group. Get a list of available instance groups by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.instanceGroups.get", + // "description": "Sets the labels on an image. To learn more about labels, read the Labeling Resources documentation.", + // "httpMethod": "POST", + // "id": "compute.images.setLabels", // "parameterOrder": [ // "project", - // "zone", - // "instanceGroup" + // "resource" // ], // "parameters": { - // "instanceGroup": { - // "description": "The name of the instance group.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -31134,52 +30965,72 @@ func (c *InstanceGroupsGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroup // "required": true, // "type": "string" // }, - // "zone": { - // "description": "The name of the zone where the instance group is located.", + // "resource": { + // "description": "Name of the resource for this request.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}", + // "path": "{project}/global/images/{resource}/setLabels", + // "request": { + // "$ref": "GlobalSetLabelsRequest" + // }, // "response": { - // "$ref": "InstanceGroup" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.instanceGroups.insert": +// method id "compute.instanceGroupManagers.abandonInstances": -type InstanceGroupsInsertCall struct { - s *Service - project string - zone string - instancegroup *InstanceGroup - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersAbandonInstancesCall struct { + s *Service + project string + zone string + instanceGroupManager string + instancegroupmanagersabandoninstancesrequest *InstanceGroupManagersAbandonInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates an instance group in the specified project using the -// parameters that are included in the request. -func (r *InstanceGroupsService) Insert(project string, zone string, instancegroup *InstanceGroup) *InstanceGroupsInsertCall { - c := &InstanceGroupsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AbandonInstances: Schedules a group action to remove the specified +// instances from the managed instance group. Abandoning an instance +// does not delete the instance, but it does remove the instance from +// any target pools that are applied by the managed instance group. This +// method reduces the targetSize of the managed instance group by the +// number of instances that you abandon. This operation is marked as +// DONE when the action is scheduled even if the instances have not yet +// been removed from the group. You must separately verify the status of +// the abandoning action with the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// +// You can specify a maximum of 1000 instances with this method per +// request. +func (r *InstanceGroupManagersService) AbandonInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersabandoninstancesrequest *InstanceGroupManagersAbandonInstancesRequest) *InstanceGroupManagersAbandonInstancesCall { + c := &InstanceGroupManagersAbandonInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instancegroup = instancegroup + c.instanceGroupManager = instanceGroupManager + c.instancegroupmanagersabandoninstancesrequest = instancegroupmanagersabandoninstancesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsInsertCall) Fields(s ...googleapi.Field) *InstanceGroupsInsertCall { +func (c *InstanceGroupManagersAbandonInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupManagersAbandonInstancesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -31187,52 +31038,53 @@ func (c *InstanceGroupsInsertCall) Fields(s ...googleapi.Field) *InstanceGroupsI // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsInsertCall) Context(ctx context.Context) *InstanceGroupsInsertCall { +func (c *InstanceGroupManagersAbandonInstancesCall) Context(ctx context.Context) *InstanceGroupManagersAbandonInstancesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsInsertCall) Header() http.Header { +func (c *InstanceGroupManagersAbandonInstancesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersAbandonInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroup) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersabandoninstancesrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.insert" call. +// Do executes the "compute.instanceGroupManagers.abandonInstances" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -31263,14 +31115,21 @@ func (c *InstanceGroupsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Creates an instance group in the specified project using the parameters that are included in the request.", + // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", - // "id": "compute.instanceGroups.insert", + // "id": "compute.instanceGroupManagers.abandonInstances", // "parameterOrder": [ // "project", - // "zone" + // "zone", + // "instanceGroupManager" // ], // "parameters": { + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", + // "location": "path", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -31279,15 +31138,15 @@ func (c *InstanceGroupsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "zone": { - // "description": "The name of the zone where you want to create the instance group.", + // "description": "The name of the zone where the managed instance group is located.", // "location": "path", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroups", + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", // "request": { - // "$ref": "InstanceGroup" + // "$ref": "InstanceGroupManagersAbandonInstancesRequest" // }, // "response": { // "$ref": "Operation" @@ -31300,31 +31159,28 @@ func (c *InstanceGroupsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.instanceGroups.list": +// method id "compute.instanceGroupManagers.aggregatedList": -type InstanceGroupsListCall struct { +type InstanceGroupManagersAggregatedListCall struct { s *Service project string - zone string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves the list of instance groups that are located in the -// specified project and zone. -func (r *InstanceGroupsService) List(project string, zone string) *InstanceGroupsListCall { - c := &InstanceGroupsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves the list of managed instance groups and +// groups them by zone. +func (r *InstanceGroupManagersService) AggregatedList(project string) *InstanceGroupManagersAggregatedListCall { + c := &InstanceGroupManagersAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -31336,7 +31192,7 @@ func (r *InstanceGroupsService) List(project string, zone string) *InstanceGroup // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -31348,7 +31204,7 @@ func (r *InstanceGroupsService) List(project string, zone string) *InstanceGroup // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *InstanceGroupsListCall) Filter(filter string) *InstanceGroupsListCall { +func (c *InstanceGroupManagersAggregatedListCall) Filter(filter string) *InstanceGroupManagersAggregatedListCall { c.urlParams_.Set("filter", filter) return c } @@ -31359,7 +31215,7 @@ func (c *InstanceGroupsListCall) Filter(filter string) *InstanceGroupsListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *InstanceGroupsListCall) MaxResults(maxResults int64) *InstanceGroupsListCall { +func (c *InstanceGroupManagersAggregatedListCall) MaxResults(maxResults int64) *InstanceGroupManagersAggregatedListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -31376,7 +31232,7 @@ func (c *InstanceGroupsListCall) MaxResults(maxResults int64) *InstanceGroupsLis // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *InstanceGroupsListCall) OrderBy(orderBy string) *InstanceGroupsListCall { +func (c *InstanceGroupManagersAggregatedListCall) OrderBy(orderBy string) *InstanceGroupManagersAggregatedListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -31384,7 +31240,7 @@ func (c *InstanceGroupsListCall) OrderBy(orderBy string) *InstanceGroupsListCall // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *InstanceGroupsListCall) PageToken(pageToken string) *InstanceGroupsListCall { +func (c *InstanceGroupManagersAggregatedListCall) PageToken(pageToken string) *InstanceGroupManagersAggregatedListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -31392,7 +31248,7 @@ func (c *InstanceGroupsListCall) PageToken(pageToken string) *InstanceGroupsList // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsListCall) Fields(s ...googleapi.Field) *InstanceGroupsListCall { +func (c *InstanceGroupManagersAggregatedListCall) Fields(s ...googleapi.Field) *InstanceGroupManagersAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -31402,7 +31258,7 @@ func (c *InstanceGroupsListCall) Fields(s ...googleapi.Field) *InstanceGroupsLis // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *InstanceGroupsListCall) IfNoneMatch(entityTag string) *InstanceGroupsListCall { +func (c *InstanceGroupManagersAggregatedListCall) IfNoneMatch(entityTag string) *InstanceGroupManagersAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -31410,21 +31266,21 @@ func (c *InstanceGroupsListCall) IfNoneMatch(entityTag string) *InstanceGroupsLi // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsListCall) Context(ctx context.Context) *InstanceGroupsListCall { +func (c *InstanceGroupManagersAggregatedListCall) Context(ctx context.Context) *InstanceGroupManagersAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsListCall) Header() http.Header { +func (c *InstanceGroupManagersAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsListCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -31435,25 +31291,25 @@ func (c *InstanceGroupsListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instanceGroupManagers") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.list" call. -// Exactly one of *InstanceGroupList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *InstanceGroupList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *InstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupList, error) { +// Do executes the "compute.instanceGroupManagers.aggregatedList" call. +// Exactly one of *InstanceGroupManagerAggregatedList or error will be +// non-nil. Any non-2xx status code is an error. Response headers are in +// either *InstanceGroupManagerAggregatedList.ServerResponse.Header or +// (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *InstanceGroupManagersAggregatedListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManagerAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -31472,7 +31328,7 @@ func (c *InstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*InstanceGrou if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceGroupList{ + ret := &InstanceGroupManagerAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -31484,16 +31340,15 @@ func (c *InstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*InstanceGrou } return ret, nil // { - // "description": "Retrieves the list of instance groups that are located in the specified project and zone.", + // "description": "Retrieves the list of managed instance groups and groups them by zone.", // "httpMethod": "GET", - // "id": "compute.instanceGroups.list", + // "id": "compute.instanceGroupManagers.aggregatedList", // "parameterOrder": [ - // "project", - // "zone" + // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -31521,17 +31376,11 @@ func (c *InstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*InstanceGrou // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone where the instance group is located.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroups", + // "path": "{project}/aggregated/instanceGroupManagers", // "response": { - // "$ref": "InstanceGroupList" + // "$ref": "InstanceGroupManagerAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -31545,7 +31394,7 @@ func (c *InstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*InstanceGrou // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *InstanceGroupsListCall) Pages(ctx context.Context, f func(*InstanceGroupList) error) error { +func (c *InstanceGroupManagersAggregatedListCall) Pages(ctx context.Context, f func(*InstanceGroupManagerAggregatedList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -31563,101 +31412,34 @@ func (c *InstanceGroupsListCall) Pages(ctx context.Context, f func(*InstanceGrou } } -// method id "compute.instanceGroups.listInstances": +// method id "compute.instanceGroupManagers.delete": -type InstanceGroupsListInstancesCall struct { - s *Service - project string - zone string - instanceGroup string - instancegroupslistinstancesrequest *InstanceGroupsListInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} +type InstanceGroupManagersDeleteCall struct { + s *Service + project string + zone string + instanceGroupManager string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} -// ListInstances: Lists the instances in the specified instance group. -func (r *InstanceGroupsService) ListInstances(project string, zone string, instanceGroup string, instancegroupslistinstancesrequest *InstanceGroupsListInstancesRequest) *InstanceGroupsListInstancesCall { - c := &InstanceGroupsListInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified managed instance group and all of the +// instances in that group. Note that the instance group must not belong +// to a backend service. Read Deleting an instance group for more +// information. +func (r *InstanceGroupManagersService) Delete(project string, zone string, instanceGroupManager string) *InstanceGroupManagersDeleteCall { + c := &InstanceGroupManagersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instanceGroup = instanceGroup - c.instancegroupslistinstancesrequest = instancegroupslistinstancesrequest - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *InstanceGroupsListInstancesCall) Filter(filter string) *InstanceGroupsListInstancesCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *InstanceGroupsListInstancesCall) MaxResults(maxResults int64) *InstanceGroupsListInstancesCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *InstanceGroupsListInstancesCall) OrderBy(orderBy string) *InstanceGroupsListInstancesCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *InstanceGroupsListInstancesCall) PageToken(pageToken string) *InstanceGroupsListInstancesCall { - c.urlParams_.Set("pageToken", pageToken) + c.instanceGroupManager = instanceGroupManager return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsListInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupsListInstancesCall { +func (c *InstanceGroupManagersDeleteCall) Fields(s ...googleapi.Field) *InstanceGroupManagersDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -31665,53 +31447,48 @@ func (c *InstanceGroupsListInstancesCall) Fields(s ...googleapi.Field) *Instance // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsListInstancesCall) Context(ctx context.Context) *InstanceGroupsListInstancesCall { +func (c *InstanceGroupManagersDeleteCall) Context(ctx context.Context) *InstanceGroupManagersDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsListInstancesCall) Header() http.Header { +func (c *InstanceGroupManagersDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsListInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupslistinstancesrequest) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroup": c.instanceGroup, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.listInstances" call. -// Exactly one of *InstanceGroupsListInstances or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *InstanceGroupsListInstances.ServerResponse.Header or (if a response -// was returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *InstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) (*InstanceGroupsListInstances, error) { +// Do executes the "compute.instanceGroupManagers.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -31730,7 +31507,7 @@ func (c *InstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) (*Ins if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceGroupsListInstances{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -31742,44 +31519,21 @@ func (c *InstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) (*Ins } return ret, nil // { - // "description": "Lists the instances in the specified instance group.", - // "httpMethod": "POST", - // "id": "compute.instanceGroups.listInstances", + // "description": "Deletes the specified managed instance group and all of the instances in that group. Note that the instance group must not belong to a backend service. Read Deleting an instance group for more information.", + // "httpMethod": "DELETE", + // "id": "compute.instanceGroupManagers.delete", // "parameterOrder": [ // "project", // "zone", - // "instanceGroup" + // "instanceGroupManager" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "instanceGroup": { - // "description": "The name of the instance group from which you want to generate a list of included instances.", + // "instanceGroupManager": { + // "description": "The name of the managed instance group to delete.", // "location": "path", // "required": true, // "type": "string" // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -31788,77 +31542,66 @@ func (c *InstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) (*Ins // "type": "string" // }, // "zone": { - // "description": "The name of the zone where the instance group is located.", + // "description": "The name of the zone where the managed instance group is located.", // "location": "path", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances", - // "request": { - // "$ref": "InstanceGroupsListInstancesRequest" - // }, + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", // "response": { - // "$ref": "InstanceGroupsListInstances" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *InstanceGroupsListInstancesCall) Pages(ctx context.Context, f func(*InstanceGroupsListInstances) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.instanceGroups.removeInstances": +// method id "compute.instanceGroupManagers.deleteInstances": -type InstanceGroupsRemoveInstancesCall struct { - s *Service - project string - zone string - instanceGroup string - instancegroupsremoveinstancesrequest *InstanceGroupsRemoveInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersDeleteInstancesCall struct { + s *Service + project string + zone string + instanceGroupManager string + instancegroupmanagersdeleteinstancesrequest *InstanceGroupManagersDeleteInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// RemoveInstances: Removes one or more instances from the specified -// instance group, but does not delete those instances. -func (r *InstanceGroupsService) RemoveInstances(project string, zone string, instanceGroup string, instancegroupsremoveinstancesrequest *InstanceGroupsRemoveInstancesRequest) *InstanceGroupsRemoveInstancesCall { - c := &InstanceGroupsRemoveInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// DeleteInstances: Schedules a group action to delete the specified +// instances in the managed instance group. The instances are also +// removed from any target pools of which they were a member. This +// method reduces the targetSize of the managed instance group by the +// number of instances that you delete. This operation is marked as DONE +// when the action is scheduled even if the instances are still being +// deleted. You must separately verify the status of the deleting action +// with the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// +// You can specify a maximum of 1000 instances with this method per +// request. +func (r *InstanceGroupManagersService) DeleteInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersdeleteinstancesrequest *InstanceGroupManagersDeleteInstancesRequest) *InstanceGroupManagersDeleteInstancesCall { + c := &InstanceGroupManagersDeleteInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instanceGroup = instanceGroup - c.instancegroupsremoveinstancesrequest = instancegroupsremoveinstancesrequest + c.instanceGroupManager = instanceGroupManager + c.instancegroupmanagersdeleteinstancesrequest = instancegroupmanagersdeleteinstancesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsRemoveInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupsRemoveInstancesCall { +func (c *InstanceGroupManagersDeleteInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupManagersDeleteInstancesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -31866,53 +31609,53 @@ func (c *InstanceGroupsRemoveInstancesCall) Fields(s ...googleapi.Field) *Instan // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsRemoveInstancesCall) Context(ctx context.Context) *InstanceGroupsRemoveInstancesCall { +func (c *InstanceGroupManagersDeleteInstancesCall) Context(ctx context.Context) *InstanceGroupManagersDeleteInstancesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsRemoveInstancesCall) Header() http.Header { +func (c *InstanceGroupManagersDeleteInstancesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsRemoveInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersDeleteInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsremoveinstancesrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersdeleteinstancesrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroup": c.instanceGroup, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.removeInstances" call. +// Do executes the "compute.instanceGroupManagers.deleteInstances" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceGroupsRemoveInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -31943,17 +31686,17 @@ func (c *InstanceGroupsRemoveInstancesCall) Do(opts ...googleapi.CallOption) (*O } return ret, nil // { - // "description": "Removes one or more instances from the specified instance group, but does not delete those instances.", + // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", // "httpMethod": "POST", - // "id": "compute.instanceGroups.removeInstances", + // "id": "compute.instanceGroupManagers.deleteInstances", // "parameterOrder": [ // "project", // "zone", - // "instanceGroup" + // "instanceGroupManager" // ], // "parameters": { - // "instanceGroup": { - // "description": "The name of the instance group where the specified instances will be removed.", + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", // "location": "path", // "required": true, // "type": "string" @@ -31966,15 +31709,15 @@ func (c *InstanceGroupsRemoveInstancesCall) Do(opts ...googleapi.CallOption) (*O // "type": "string" // }, // "zone": { - // "description": "The name of the zone where the instance group is located.", + // "description": "The name of the zone where the managed instance group is located.", // "location": "path", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances", + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", // "request": { - // "$ref": "InstanceGroupsRemoveInstancesRequest" + // "$ref": "InstanceGroupManagersDeleteInstancesRequest" // }, // "response": { // "$ref": "Operation" @@ -31987,87 +31730,96 @@ func (c *InstanceGroupsRemoveInstancesCall) Do(opts ...googleapi.CallOption) (*O } -// method id "compute.instanceGroups.setNamedPorts": +// method id "compute.instanceGroupManagers.get": -type InstanceGroupsSetNamedPortsCall struct { - s *Service - project string - zone string - instanceGroup string - instancegroupssetnamedportsrequest *InstanceGroupsSetNamedPortsRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersGetCall struct { + s *Service + project string + zone string + instanceGroupManager string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// SetNamedPorts: Sets the named ports for the specified instance group. -func (r *InstanceGroupsService) SetNamedPorts(project string, zone string, instanceGroup string, instancegroupssetnamedportsrequest *InstanceGroupsSetNamedPortsRequest) *InstanceGroupsSetNamedPortsCall { - c := &InstanceGroupsSetNamedPortsCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns all of the details about the specified managed instance +// group. Get a list of available managed instance groups by making a +// list() request. +func (r *InstanceGroupManagersService) Get(project string, zone string, instanceGroupManager string) *InstanceGroupManagersGetCall { + c := &InstanceGroupManagersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instanceGroup = instanceGroup - c.instancegroupssetnamedportsrequest = instancegroupssetnamedportsrequest + c.instanceGroupManager = instanceGroupManager return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceGroupsSetNamedPortsCall) Fields(s ...googleapi.Field) *InstanceGroupsSetNamedPortsCall { +func (c *InstanceGroupManagersGetCall) Fields(s ...googleapi.Field) *InstanceGroupManagersGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *InstanceGroupManagersGetCall) IfNoneMatch(entityTag string) *InstanceGroupManagersGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceGroupsSetNamedPortsCall) Context(ctx context.Context) *InstanceGroupsSetNamedPortsCall { +func (c *InstanceGroupManagersGetCall) Context(ctx context.Context) *InstanceGroupManagersGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceGroupsSetNamedPortsCall) Header() http.Header { +func (c *InstanceGroupManagersGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceGroupsSetNamedPortsCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupssetnamedportsrequest) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instanceGroup": c.instanceGroup, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceGroups.setNamedPorts" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.instanceGroupManagers.get" call. +// Exactly one of *InstanceGroupManager or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *InstanceGroupManager.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *InstanceGroupManagersGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManager, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -32086,7 +31838,7 @@ func (c *InstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) (*Ope if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &InstanceGroupManager{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -32098,17 +31850,17 @@ func (c *InstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Sets the named ports for the specified instance group.", - // "httpMethod": "POST", - // "id": "compute.instanceGroups.setNamedPorts", + // "description": "Returns all of the details about the specified managed instance group. Get a list of available managed instance groups by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.instanceGroupManagers.get", // "parameterOrder": [ // "project", // "zone", - // "instanceGroup" + // "instanceGroupManager" // ], // "parameters": { - // "instanceGroup": { - // "description": "The name of the instance group where the named ports are updated.", + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", // "location": "path", // "required": true, // "type": "string" @@ -32121,55 +31873,59 @@ func (c *InstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "zone": { - // "description": "The name of the zone where the instance group is located.", + // "description": "The name of the zone where the managed instance group is located.", // "location": "path", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts", - // "request": { - // "$ref": "InstanceGroupsSetNamedPortsRequest" - // }, + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}", // "response": { - // "$ref": "Operation" + // "$ref": "InstanceGroupManager" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instanceTemplates.delete": +// method id "compute.instanceGroupManagers.insert": -type InstanceTemplatesDeleteCall struct { - s *Service - project string - instanceTemplate string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersInsertCall struct { + s *Service + project string + zone string + instancegroupmanager *InstanceGroupManager + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified instance template. If you delete an -// instance template that is being referenced from another instance -// group, the instance group will not be able to create or recreate -// virtual machine instances. Deleting an instance template is permanent -// and cannot be undone. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instanceTemplates/delete -func (r *InstanceTemplatesService) Delete(project string, instanceTemplate string) *InstanceTemplatesDeleteCall { - c := &InstanceTemplatesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a managed instance group using the information that +// you specify in the request. After the group is created, it schedules +// an action to create instances in the group using the specified +// instance template. This operation is marked as DONE when the group is +// created even if the instances in the group have not yet been created. +// You must separately verify the status of the individual instances +// with the listmanagedinstances method. +// +// A managed instance group can have up to 1000 VM instances per group. +// Please contact Cloud Support if you need an increase in this limit. +func (r *InstanceGroupManagersService) Insert(project string, zone string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersInsertCall { + c := &InstanceGroupManagersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.instanceTemplate = instanceTemplate + c.zone = zone + c.instancegroupmanager = instancegroupmanager return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceTemplatesDeleteCall) Fields(s ...googleapi.Field) *InstanceTemplatesDeleteCall { +func (c *InstanceGroupManagersInsertCall) Fields(s ...googleapi.Field) *InstanceGroupManagersInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -32177,47 +31933,52 @@ func (c *InstanceTemplatesDeleteCall) Fields(s ...googleapi.Field) *InstanceTemp // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceTemplatesDeleteCall) Context(ctx context.Context) *InstanceTemplatesDeleteCall { +func (c *InstanceGroupManagersInsertCall) Context(ctx context.Context) *InstanceGroupManagersInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceTemplatesDeleteCall) Header() http.Header { +func (c *InstanceGroupManagersInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceTemplatesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates/{instanceTemplate}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "instanceTemplate": c.instanceTemplate, + "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceTemplates.delete" call. +// Do executes the "compute.instanceGroupManagers.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstanceTemplatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -32248,30 +32009,32 @@ func (c *InstanceTemplatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Deletes the specified instance template. If you delete an instance template that is being referenced from another instance group, the instance group will not be able to create or recreate virtual machine instances. Deleting an instance template is permanent and cannot be undone.", - // "httpMethod": "DELETE", - // "id": "compute.instanceTemplates.delete", + // "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA managed instance group can have up to 1000 VM instances per group. Please contact Cloud Support if you need an increase in this limit.", + // "httpMethod": "POST", + // "id": "compute.instanceGroupManagers.insert", // "parameterOrder": [ // "project", - // "instanceTemplate" + // "zone" // ], // "parameters": { - // "instanceTemplate": { - // "description": "The name of the instance template to delete.", + // "project": { + // "description": "Project ID for this request.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" // }, - // "project": { - // "description": "Project ID for this request.", + // "zone": { + // "description": "The name of the zone where you want to create the managed instance group.", // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/instanceTemplates/{instanceTemplate}", + // "path": "{project}/zones/{zone}/instanceGroupManagers", + // "request": { + // "$ref": "InstanceGroupManager" + // }, // "response": { // "$ref": "Operation" // }, @@ -32283,323 +32046,30 @@ func (c *InstanceTemplatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operati } -// method id "compute.instanceTemplates.get": +// method id "compute.instanceGroupManagers.list": -type InstanceTemplatesGetCall struct { - s *Service - project string - instanceTemplate string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersListCall struct { + s *Service + project string + zone string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified instance template. Get a list of available -// instance templates by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instanceTemplates/get -func (r *InstanceTemplatesService) Get(project string, instanceTemplate string) *InstanceTemplatesGetCall { - c := &InstanceTemplatesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of managed instance groups that are contained +// within the specified project and zone. +func (r *InstanceGroupManagersService) List(project string, zone string) *InstanceGroupManagersListCall { + c := &InstanceGroupManagersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.instanceTemplate = instanceTemplate - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *InstanceTemplatesGetCall) Fields(s ...googleapi.Field) *InstanceTemplatesGetCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) + c.zone = zone return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *InstanceTemplatesGetCall) IfNoneMatch(entityTag string) *InstanceTemplatesGetCall { - c.ifNoneMatch_ = entityTag - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *InstanceTemplatesGetCall) Context(ctx context.Context) *InstanceTemplatesGetCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *InstanceTemplatesGetCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *InstanceTemplatesGetCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates/{instanceTemplate}") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "instanceTemplate": c.instanceTemplate, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.instanceTemplates.get" call. -// Exactly one of *InstanceTemplate or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *InstanceTemplate.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *InstanceTemplatesGetCall) Do(opts ...googleapi.CallOption) (*InstanceTemplate, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &InstanceTemplate{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Returns the specified instance template. Get a list of available instance templates by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.instanceTemplates.get", - // "parameterOrder": [ - // "project", - // "instanceTemplate" - // ], - // "parameters": { - // "instanceTemplate": { - // "description": "The name of the instance template.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/instanceTemplates/{instanceTemplate}", - // "response": { - // "$ref": "InstanceTemplate" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" - // ] - // } - -} - -// method id "compute.instanceTemplates.insert": - -type InstanceTemplatesInsertCall struct { - s *Service - project string - instancetemplate *InstanceTemplate - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Insert: Creates an instance template in the specified project using -// the data that is included in the request. If you are creating a new -// template to update an existing instance group, your new instance -// template must use the same network or, if applicable, the same -// subnetwork as the original template. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instanceTemplates/insert -func (r *InstanceTemplatesService) Insert(project string, instancetemplate *InstanceTemplate) *InstanceTemplatesInsertCall { - c := &InstanceTemplatesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.instancetemplate = instancetemplate - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *InstanceTemplatesInsertCall) Fields(s ...googleapi.Field) *InstanceTemplatesInsertCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *InstanceTemplatesInsertCall) Context(ctx context.Context) *InstanceTemplatesInsertCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *InstanceTemplatesInsertCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *InstanceTemplatesInsertCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancetemplate) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.instanceTemplates.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstanceTemplatesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Creates an instance template in the specified project using the data that is included in the request. If you are creating a new template to update an existing instance group, your new instance template must use the same network or, if applicable, the same subnetwork as the original template.", - // "httpMethod": "POST", - // "id": "compute.instanceTemplates.insert", - // "parameterOrder": [ - // "project" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/instanceTemplates", - // "request": { - // "$ref": "InstanceTemplate" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.instanceTemplates.list": - -type InstanceTemplatesListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} - -// List: Retrieves a list of instance templates that are contained -// within the specified project and zone. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instanceTemplates/list -func (r *InstanceTemplatesService) List(project string) *InstanceTemplatesListCall { - c := &InstanceTemplatesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -32611,7 +32081,7 @@ func (r *InstanceTemplatesService) List(project string) *InstanceTemplatesListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -32623,7 +32093,7 @@ func (r *InstanceTemplatesService) List(project string) *InstanceTemplatesListCa // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *InstanceTemplatesListCall) Filter(filter string) *InstanceTemplatesListCall { +func (c *InstanceGroupManagersListCall) Filter(filter string) *InstanceGroupManagersListCall { c.urlParams_.Set("filter", filter) return c } @@ -32634,7 +32104,7 @@ func (c *InstanceTemplatesListCall) Filter(filter string) *InstanceTemplatesList // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *InstanceTemplatesListCall) MaxResults(maxResults int64) *InstanceTemplatesListCall { +func (c *InstanceGroupManagersListCall) MaxResults(maxResults int64) *InstanceGroupManagersListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -32651,7 +32121,7 @@ func (c *InstanceTemplatesListCall) MaxResults(maxResults int64) *InstanceTempla // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *InstanceTemplatesListCall) OrderBy(orderBy string) *InstanceTemplatesListCall { +func (c *InstanceGroupManagersListCall) OrderBy(orderBy string) *InstanceGroupManagersListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -32659,7 +32129,7 @@ func (c *InstanceTemplatesListCall) OrderBy(orderBy string) *InstanceTemplatesLi // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *InstanceTemplatesListCall) PageToken(pageToken string) *InstanceTemplatesListCall { +func (c *InstanceGroupManagersListCall) PageToken(pageToken string) *InstanceGroupManagersListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -32667,7 +32137,7 @@ func (c *InstanceTemplatesListCall) PageToken(pageToken string) *InstanceTemplat // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstanceTemplatesListCall) Fields(s ...googleapi.Field) *InstanceTemplatesListCall { +func (c *InstanceGroupManagersListCall) Fields(s ...googleapi.Field) *InstanceGroupManagersListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -32677,7 +32147,7 @@ func (c *InstanceTemplatesListCall) Fields(s ...googleapi.Field) *InstanceTempla // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *InstanceTemplatesListCall) IfNoneMatch(entityTag string) *InstanceTemplatesListCall { +func (c *InstanceGroupManagersListCall) IfNoneMatch(entityTag string) *InstanceGroupManagersListCall { c.ifNoneMatch_ = entityTag return c } @@ -32685,21 +32155,21 @@ func (c *InstanceTemplatesListCall) IfNoneMatch(entityTag string) *InstanceTempl // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstanceTemplatesListCall) Context(ctx context.Context) *InstanceTemplatesListCall { +func (c *InstanceGroupManagersListCall) Context(ctx context.Context) *InstanceGroupManagersListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstanceTemplatesListCall) Header() http.Header { +func (c *InstanceGroupManagersListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstanceTemplatesListCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -32710,24 +32180,25 @@ func (c *InstanceTemplatesListCall) doRequest(alt string) (*http.Response, error } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instanceTemplates.list" call. -// Exactly one of *InstanceTemplateList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *InstanceTemplateList.ServerResponse.Header or (if a response was +// Do executes the "compute.instanceGroupManagers.list" call. +// Exactly one of *InstanceGroupManagerList or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *InstanceGroupManagerList.ServerResponse.Header or (if a response was // returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *InstanceTemplatesListCall) Do(opts ...googleapi.CallOption) (*InstanceTemplateList, error) { +func (c *InstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManagerList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -32746,7 +32217,7 @@ func (c *InstanceTemplatesListCall) Do(opts ...googleapi.CallOption) (*InstanceT if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceTemplateList{ + ret := &InstanceGroupManagerList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -32758,15 +32229,16 @@ func (c *InstanceTemplatesListCall) Do(opts ...googleapi.CallOption) (*InstanceT } return ret, nil // { - // "description": "Retrieves a list of instance templates that are contained within the specified project and zone.", + // "description": "Retrieves a list of managed instance groups that are contained within the specified project and zone.", // "httpMethod": "GET", - // "id": "compute.instanceTemplates.list", + // "id": "compute.instanceGroupManagers.list", // "parameterOrder": [ - // "project" + // "project", + // "zone" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -32794,11 +32266,17 @@ func (c *InstanceTemplatesListCall) Do(opts ...googleapi.CallOption) (*InstanceT // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone where the managed instance group is located.", + // "location": "path", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/instanceTemplates", + // "path": "{project}/zones/{zone}/instanceGroupManagers", // "response": { - // "$ref": "InstanceTemplateList" + // "$ref": "InstanceGroupManagerList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -32812,7 +32290,7 @@ func (c *InstanceTemplatesListCall) Do(opts ...googleapi.CallOption) (*InstanceT // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *InstanceTemplatesListCall) Pages(ctx context.Context, f func(*InstanceTemplateList) error) error { +func (c *InstanceGroupManagersListCall) Pages(ctx context.Context, f func(*InstanceGroupManagerList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -32830,36 +32308,60 @@ func (c *InstanceTemplatesListCall) Pages(ctx context.Context, f func(*InstanceT } } -// method id "compute.instances.addAccessConfig": +// method id "compute.instanceGroupManagers.listManagedInstances": -type InstancesAddAccessConfigCall struct { - s *Service - project string - zone string - instance string - accessconfig *AccessConfig - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersListManagedInstancesCall struct { + s *Service + project string + zone string + instanceGroupManager string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AddAccessConfig: Adds an access config to an instance's network -// interface. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/addAccessConfig -func (r *InstancesService) AddAccessConfig(project string, zone string, instance string, networkInterface string, accessconfig *AccessConfig) *InstancesAddAccessConfigCall { - c := &InstancesAddAccessConfigCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// ListManagedInstances: Lists all of the instances in the managed +// instance group. Each instance in the list has a currentAction, which +// indicates the action that the managed instance group is performing on +// the instance. For example, if the group is still creating an +// instance, the currentAction is CREATING. If a previous action failed, +// the list displays the errors for that failed action. +func (r *InstanceGroupManagersService) ListManagedInstances(project string, zone string, instanceGroupManager string) *InstanceGroupManagersListManagedInstancesCall { + c := &InstanceGroupManagersListManagedInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance - c.urlParams_.Set("networkInterface", networkInterface) - c.accessconfig = accessconfig + c.instanceGroupManager = instanceGroupManager + return c +} + +// Filter sets the optional parameter "filter": +func (c *InstanceGroupManagersListManagedInstancesCall) Filter(filter string) *InstanceGroupManagersListManagedInstancesCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": +func (c *InstanceGroupManagersListManagedInstancesCall) MaxResults(maxResults int64) *InstanceGroupManagersListManagedInstancesCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "order_by": +func (c *InstanceGroupManagersListManagedInstancesCall) OrderBy(orderBy string) *InstanceGroupManagersListManagedInstancesCall { + c.urlParams_.Set("order_by", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": +func (c *InstanceGroupManagersListManagedInstancesCall) PageToken(pageToken string) *InstanceGroupManagersListManagedInstancesCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesAddAccessConfigCall) Fields(s ...googleapi.Field) *InstancesAddAccessConfigCall { +func (c *InstanceGroupManagersListManagedInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupManagersListManagedInstancesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -32867,53 +32369,50 @@ func (c *InstancesAddAccessConfigCall) Fields(s ...googleapi.Field) *InstancesAd // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesAddAccessConfigCall) Context(ctx context.Context) *InstancesAddAccessConfigCall { +func (c *InstanceGroupManagersListManagedInstancesCall) Context(ctx context.Context) *InstanceGroupManagersListManagedInstancesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesAddAccessConfigCall) Header() http.Header { +func (c *InstanceGroupManagersListManagedInstancesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesAddAccessConfigCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersListManagedInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.accessconfig) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/addAccessConfig") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.addAccessConfig" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstancesAddAccessConfigCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.instanceGroupManagers.listManagedInstances" call. +// Exactly one of *InstanceGroupManagersListManagedInstancesResponse or +// error will be non-nil. Any non-2xx status code is an error. Response +// headers are in either +// *InstanceGroupManagersListManagedInstancesResponse.ServerResponse.Head +// er or (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *InstanceGroupManagersListManagedInstancesCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManagersListManagedInstancesResponse, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -32932,7 +32431,7 @@ func (c *InstancesAddAccessConfigCall) Do(opts ...googleapi.CallOption) (*Operat if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &InstanceGroupManagersListManagedInstancesResponse{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -32944,27 +32443,38 @@ func (c *InstancesAddAccessConfigCall) Do(opts ...googleapi.CallOption) (*Operat } return ret, nil // { - // "description": "Adds an access config to an instance's network interface.", + // "description": "Lists all of the instances in the managed instance group. Each instance in the list has a currentAction, which indicates the action that the managed instance group is performing on the instance. For example, if the group is still creating an instance, the currentAction is CREATING. If a previous action failed, the list displays the errors for that failed action.", // "httpMethod": "POST", - // "id": "compute.instances.addAccessConfig", + // "id": "compute.instanceGroupManagers.listManagedInstances", // "parameterOrder": [ // "project", // "zone", - // "instance", - // "networkInterface" + // "instanceGroupManager" // ], // "parameters": { - // "instance": { - // "description": "The instance name for this request.", + // "filter": { + // "location": "query", + // "type": "string" + // }, + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, - // "networkInterface": { - // "description": "The name of the network interface to add to this instance.", + // "maxResults": { + // "default": "500", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "order_by": { + // "location": "query", + // "type": "string" + // }, + // "pageToken": { // "location": "query", - // "required": true, // "type": "string" // }, // "project": { @@ -32975,179 +32485,120 @@ func (c *InstancesAddAccessConfigCall) Do(opts ...googleapi.CallOption) (*Operat // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the managed instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/addAccessConfig", - // "request": { - // "$ref": "AccessConfig" - // }, + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances", // "response": { - // "$ref": "Operation" + // "$ref": "InstanceGroupManagersListManagedInstancesResponse" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instances.aggregatedList": +// method id "compute.instanceGroupManagers.recreateInstances": -type InstancesAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersRecreateInstancesCall struct { + s *Service + project string + zone string + instanceGroupManager string + instancegroupmanagersrecreateinstancesrequest *InstanceGroupManagersRecreateInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves aggregated list of instances. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/aggregatedList -func (r *InstancesService) AggregatedList(project string) *InstancesAggregatedListCall { - c := &InstancesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// RecreateInstances: Schedules a group action to recreate the specified +// instances in the managed instance group. The instances are deleted +// and recreated using the current instance template for the managed +// instance group. This operation is marked as DONE when the action is +// scheduled even if the instances have not yet been recreated. You must +// separately verify the status of the recreating action with the +// listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// +// You can specify a maximum of 1000 instances with this method per +// request. +func (r *InstanceGroupManagersService) RecreateInstances(project string, zone string, instanceGroupManager string, instancegroupmanagersrecreateinstancesrequest *InstanceGroupManagersRecreateInstancesRequest) *InstanceGroupManagersRecreateInstancesCall { + c := &InstanceGroupManagersRecreateInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *InstancesAggregatedListCall) Filter(filter string) *InstancesAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *InstancesAggregatedListCall) MaxResults(maxResults int64) *InstancesAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *InstancesAggregatedListCall) OrderBy(orderBy string) *InstancesAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *InstancesAggregatedListCall) PageToken(pageToken string) *InstancesAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) + c.zone = zone + c.instanceGroupManager = instanceGroupManager + c.instancegroupmanagersrecreateinstancesrequest = instancegroupmanagersrecreateinstancesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesAggregatedListCall) Fields(s ...googleapi.Field) *InstancesAggregatedListCall { +func (c *InstanceGroupManagersRecreateInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupManagersRecreateInstancesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *InstancesAggregatedListCall) IfNoneMatch(entityTag string) *InstancesAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesAggregatedListCall) Context(ctx context.Context) *InstancesAggregatedListCall { +func (c *InstanceGroupManagersRecreateInstancesCall) Context(ctx context.Context) *InstanceGroupManagersRecreateInstancesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesAggregatedListCall) Header() http.Header { +func (c *InstanceGroupManagersRecreateInstancesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersRecreateInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersrecreateinstancesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.aggregatedList" call. -// Exactly one of *InstanceAggregatedList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *InstanceAggregatedList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *InstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*InstanceAggregatedList, error) { +// Do executes the "compute.instanceGroupManagers.recreateInstances" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -33166,7 +32617,7 @@ func (c *InstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Instanc if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceAggregatedList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -33178,34 +32629,19 @@ func (c *InstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Instanc } return ret, nil // { - // "description": "Retrieves aggregated list of instances.", - // "httpMethod": "GET", - // "id": "compute.instances.aggregatedList", + // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "httpMethod": "POST", + // "id": "compute.instanceGroupManagers.recreateInstances", // "parameterOrder": [ - // "project" + // "project", + // "zone", + // "instanceGroupManager" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", + // "location": "path", + // "required": true, // "type": "string" // }, // "project": { @@ -33214,70 +32650,65 @@ func (c *InstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Instanc // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone where the managed instance group is located.", + // "location": "path", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/aggregated/instances", + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", + // "request": { + // "$ref": "InstanceGroupManagersRecreateInstancesRequest" + // }, // "response": { - // "$ref": "InstanceAggregatedList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *InstancesAggregatedListCall) Pages(ctx context.Context, f func(*InstanceAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.instances.attachDisk": +// method id "compute.instanceGroupManagers.resize": -type InstancesAttachDiskCall struct { - s *Service - project string - zone string - instance string - attacheddisk *AttachedDisk - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersResizeCall struct { + s *Service + project string + zone string + instanceGroupManager string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AttachDisk: Attaches a Disk resource to an instance. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/attachDisk -func (r *InstancesService) AttachDisk(project string, zone string, instance string, attacheddisk *AttachedDisk) *InstancesAttachDiskCall { - c := &InstancesAttachDiskCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Resize: Resizes the managed instance group. If you increase the size, +// the group creates new instances using the current instance template. +// If you decrease the size, the group deletes instances. The resize +// operation is marked DONE when the resize actions are scheduled even +// if the group has not yet added or deleted any instances. You must +// separately verify the status of the creating or deleting actions with +// the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or deleted. +func (r *InstanceGroupManagersService) Resize(project string, zone string, instanceGroupManager string, size int64) *InstanceGroupManagersResizeCall { + c := &InstanceGroupManagersResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance - c.attacheddisk = attacheddisk + c.instanceGroupManager = instanceGroupManager + c.urlParams_.Set("size", fmt.Sprint(size)) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesAttachDiskCall) Fields(s ...googleapi.Field) *InstancesAttachDiskCall { +func (c *InstanceGroupManagersResizeCall) Fields(s ...googleapi.Field) *InstanceGroupManagersResizeCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -33285,53 +32716,48 @@ func (c *InstancesAttachDiskCall) Fields(s ...googleapi.Field) *InstancesAttachD // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesAttachDiskCall) Context(ctx context.Context) *InstancesAttachDiskCall { +func (c *InstanceGroupManagersResizeCall) Context(ctx context.Context) *InstanceGroupManagersResizeCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesAttachDiskCall) Header() http.Header { +func (c *InstanceGroupManagersResizeCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesAttachDiskCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersResizeCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.attacheddisk) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/attachDisk") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.attachDisk" call. +// Do executes the "compute.instanceGroupManagers.resize" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesAttachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -33362,19 +32788,19 @@ func (c *InstancesAttachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Attaches a Disk resource to an instance.", + // "description": "Resizes the managed instance group. If you increase the size, the group creates new instances using the current instance template. If you decrease the size, the group deletes instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", // "httpMethod": "POST", - // "id": "compute.instances.attachDisk", + // "id": "compute.instanceGroupManagers.resize", // "parameterOrder": [ // "project", // "zone", - // "instance" + // "instanceGroupManager", + // "size" // ], // "parameters": { - // "instance": { - // "description": "The instance name for this request.", + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -33385,18 +32811,21 @@ func (c *InstancesAttachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, // "required": true, // "type": "string" // }, + // "size": { + // "description": "The number of running instances that the managed instance group should maintain at any given time. The group automatically adds or removes instances to maintain the number of instances specified by this parameter.", + // "format": "int32", + // "location": "query", + // "required": true, + // "type": "integer" + // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the managed instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/attachDisk", - // "request": { - // "$ref": "AttachedDisk" - // }, + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize", // "response": { // "$ref": "Operation" // }, @@ -33408,33 +32837,35 @@ func (c *InstancesAttachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.instances.delete": +// method id "compute.instanceGroupManagers.setInstanceTemplate": -type InstancesDeleteCall struct { - s *Service - project string - zone string - instance string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersSetInstanceTemplateCall struct { + s *Service + project string + zone string + instanceGroupManager string + instancegroupmanagerssetinstancetemplaterequest *InstanceGroupManagersSetInstanceTemplateRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified Instance resource. For more -// information, see Stopping or Deleting an Instance. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/delete -func (r *InstancesService) Delete(project string, zone string, instance string) *InstancesDeleteCall { - c := &InstancesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetInstanceTemplate: Specifies the instance template to use when +// creating new instances in this group. The templates for existing +// instances in the group do not change unless you recreate them. +func (r *InstanceGroupManagersService) SetInstanceTemplate(project string, zone string, instanceGroupManager string, instancegroupmanagerssetinstancetemplaterequest *InstanceGroupManagersSetInstanceTemplateRequest) *InstanceGroupManagersSetInstanceTemplateCall { + c := &InstanceGroupManagersSetInstanceTemplateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance + c.instanceGroupManager = instanceGroupManager + c.instancegroupmanagerssetinstancetemplaterequest = instancegroupmanagerssetinstancetemplaterequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesDeleteCall) Fields(s ...googleapi.Field) *InstancesDeleteCall { +func (c *InstanceGroupManagersSetInstanceTemplateCall) Fields(s ...googleapi.Field) *InstanceGroupManagersSetInstanceTemplateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -33442,48 +32873,53 @@ func (c *InstancesDeleteCall) Fields(s ...googleapi.Field) *InstancesDeleteCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesDeleteCall) Context(ctx context.Context) *InstancesDeleteCall { +func (c *InstanceGroupManagersSetInstanceTemplateCall) Context(ctx context.Context) *InstanceGroupManagersSetInstanceTemplateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesDeleteCall) Header() http.Header { +func (c *InstanceGroupManagersSetInstanceTemplateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersSetInstanceTemplateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssetinstancetemplaterequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.delete" call. +// Do executes the "compute.instanceGroupManagers.setInstanceTemplate" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -33514,19 +32950,18 @@ func (c *InstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro } return ret, nil // { - // "description": "Deletes the specified Instance resource. For more information, see Stopping or Deleting an Instance.", - // "httpMethod": "DELETE", - // "id": "compute.instances.delete", + // "description": "Specifies the instance template to use when creating new instances in this group. The templates for existing instances in the group do not change unless you recreate them.", + // "httpMethod": "POST", + // "id": "compute.instanceGroupManagers.setInstanceTemplate", // "parameterOrder": [ // "project", // "zone", - // "instance" + // "instanceGroupManager" // ], // "parameters": { - // "instance": { - // "description": "Name of the instance resource to delete.", + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -33538,14 +32973,16 @@ func (c *InstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the managed instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}", + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate", + // "request": { + // "$ref": "InstanceGroupManagersSetInstanceTemplateRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -33557,35 +32994,39 @@ func (c *InstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro } -// method id "compute.instances.deleteAccessConfig": +// method id "compute.instanceGroupManagers.setTargetPools": -type InstancesDeleteAccessConfigCall struct { - s *Service - project string - zone string - instance string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupManagersSetTargetPoolsCall struct { + s *Service + project string + zone string + instanceGroupManager string + instancegroupmanagerssettargetpoolsrequest *InstanceGroupManagersSetTargetPoolsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// DeleteAccessConfig: Deletes an access config from an instance's -// network interface. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/deleteAccessConfig -func (r *InstancesService) DeleteAccessConfig(project string, zone string, instance string, accessConfig string, networkInterface string) *InstancesDeleteAccessConfigCall { - c := &InstancesDeleteAccessConfigCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetTargetPools: Modifies the target pools to which all instances in +// this managed instance group are assigned. The target pools +// automatically apply to all of the instances in the managed instance +// group. This operation is marked DONE when you make the request even +// if the instances have not yet been added to their target pools. The +// change might take some time to apply to all of the instances in the +// group depending on the size of the group. +func (r *InstanceGroupManagersService) SetTargetPools(project string, zone string, instanceGroupManager string, instancegroupmanagerssettargetpoolsrequest *InstanceGroupManagersSetTargetPoolsRequest) *InstanceGroupManagersSetTargetPoolsCall { + c := &InstanceGroupManagersSetTargetPoolsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance - c.urlParams_.Set("accessConfig", accessConfig) - c.urlParams_.Set("networkInterface", networkInterface) + c.instanceGroupManager = instanceGroupManager + c.instancegroupmanagerssettargetpoolsrequest = instancegroupmanagerssettargetpoolsrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesDeleteAccessConfigCall) Fields(s ...googleapi.Field) *InstancesDeleteAccessConfigCall { +func (c *InstanceGroupManagersSetTargetPoolsCall) Fields(s ...googleapi.Field) *InstanceGroupManagersSetTargetPoolsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -33593,48 +33034,53 @@ func (c *InstancesDeleteAccessConfigCall) Fields(s ...googleapi.Field) *Instance // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesDeleteAccessConfigCall) Context(ctx context.Context) *InstancesDeleteAccessConfigCall { +func (c *InstanceGroupManagersSetTargetPoolsCall) Context(ctx context.Context) *InstanceGroupManagersSetTargetPoolsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesDeleteAccessConfigCall) Header() http.Header { +func (c *InstanceGroupManagersSetTargetPoolsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesDeleteAccessConfigCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupManagersSetTargetPoolsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssettargetpoolsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "zone": c.zone, + "instanceGroupManager": c.instanceGroupManager, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.deleteAccessConfig" call. +// Do executes the "compute.instanceGroupManagers.setTargetPools" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesDeleteAccessConfigCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -33665,33 +33111,18 @@ func (c *InstancesDeleteAccessConfigCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Deletes an access config from an instance's network interface.", + // "description": "Modifies the target pools to which all instances in this managed instance group are assigned. The target pools automatically apply to all of the instances in the managed instance group. This operation is marked DONE when you make the request even if the instances have not yet been added to their target pools. The change might take some time to apply to all of the instances in the group depending on the size of the group.", // "httpMethod": "POST", - // "id": "compute.instances.deleteAccessConfig", + // "id": "compute.instanceGroupManagers.setTargetPools", // "parameterOrder": [ // "project", // "zone", - // "instance", - // "accessConfig", - // "networkInterface" + // "instanceGroupManager" // ], // "parameters": { - // "accessConfig": { - // "description": "The name of the access config to delete.", - // "location": "query", - // "required": true, - // "type": "string" - // }, - // "instance": { - // "description": "The instance name for this request.", + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "networkInterface": { - // "description": "The name of the network interface.", - // "location": "query", // "required": true, // "type": "string" // }, @@ -33703,14 +33134,16 @@ func (c *InstancesDeleteAccessConfigCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the managed instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig", + // "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools", + // "request": { + // "$ref": "InstanceGroupManagersSetTargetPoolsRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -33722,33 +33155,35 @@ func (c *InstancesDeleteAccessConfigCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.instances.detachDisk": +// method id "compute.instanceGroups.addInstances": -type InstancesDetachDiskCall struct { - s *Service - project string - zone string - instance string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupsAddInstancesCall struct { + s *Service + project string + zone string + instanceGroup string + instancegroupsaddinstancesrequest *InstanceGroupsAddInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// DetachDisk: Detaches a disk from an instance. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/detachDisk -func (r *InstancesService) DetachDisk(project string, zone string, instance string, deviceName string) *InstancesDetachDiskCall { - c := &InstancesDetachDiskCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AddInstances: Adds a list of instances to the specified instance +// group. All of the instances in the instance group must be in the same +// network/subnetwork. Read Adding instances for more information. +func (r *InstanceGroupsService) AddInstances(project string, zone string, instanceGroup string, instancegroupsaddinstancesrequest *InstanceGroupsAddInstancesRequest) *InstanceGroupsAddInstancesCall { + c := &InstanceGroupsAddInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance - c.urlParams_.Set("deviceName", deviceName) + c.instanceGroup = instanceGroup + c.instancegroupsaddinstancesrequest = instancegroupsaddinstancesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesDetachDiskCall) Fields(s ...googleapi.Field) *InstancesDetachDiskCall { +func (c *InstanceGroupsAddInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupsAddInstancesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -33756,48 +33191,53 @@ func (c *InstancesDetachDiskCall) Fields(s ...googleapi.Field) *InstancesDetachD // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesDetachDiskCall) Context(ctx context.Context) *InstancesDetachDiskCall { +func (c *InstanceGroupsAddInstancesCall) Context(ctx context.Context) *InstanceGroupsAddInstancesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesDetachDiskCall) Header() http.Header { +func (c *InstanceGroupsAddInstancesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesDetachDiskCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupsAddInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsaddinstancesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/detachDisk") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "zone": c.zone, + "instanceGroup": c.instanceGroup, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.detachDisk" call. +// Do executes the "compute.instanceGroups.addInstances" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesDetachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupsAddInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -33828,26 +33268,18 @@ func (c *InstancesDetachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Detaches a disk from an instance.", + // "description": "Adds a list of instances to the specified instance group. All of the instances in the instance group must be in the same network/subnetwork. Read Adding instances for more information.", // "httpMethod": "POST", - // "id": "compute.instances.detachDisk", + // "id": "compute.instanceGroups.addInstances", // "parameterOrder": [ // "project", // "zone", - // "instance", - // "deviceName" + // "instanceGroup" // ], // "parameters": { - // "deviceName": { - // "description": "Disk device name to detach.", - // "location": "query", - // "required": true, - // "type": "string" - // }, - // "instance": { - // "description": "Instance name.", + // "instanceGroup": { + // "description": "The name of the instance group where you are adding instances.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -33859,14 +33291,16 @@ func (c *InstancesDetachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/detachDisk", + // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances", + // "request": { + // "$ref": "InstanceGroupsAddInstancesRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -33878,34 +33312,96 @@ func (c *InstancesDetachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.instances.get": +// method id "compute.instanceGroups.aggregatedList": -type InstancesGetCall struct { +type InstanceGroupsAggregatedListCall struct { s *Service project string - zone string - instance string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns the specified Instance resource. Get a list of available -// instances by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/get -func (r *InstancesService) Get(project string, zone string, instance string) *InstancesGetCall { - c := &InstancesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves the list of instance groups and sorts them +// by zone. +func (r *InstanceGroupsService) AggregatedList(project string) *InstanceGroupsAggregatedListCall { + c := &InstanceGroupsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instance = instance + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *InstanceGroupsAggregatedListCall) Filter(filter string) *InstanceGroupsAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *InstanceGroupsAggregatedListCall) MaxResults(maxResults int64) *InstanceGroupsAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *InstanceGroupsAggregatedListCall) OrderBy(orderBy string) *InstanceGroupsAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *InstanceGroupsAggregatedListCall) PageToken(pageToken string) *InstanceGroupsAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesGetCall) Fields(s ...googleapi.Field) *InstancesGetCall { +func (c *InstanceGroupsAggregatedListCall) Fields(s ...googleapi.Field) *InstanceGroupsAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -33915,7 +33411,7 @@ func (c *InstancesGetCall) Fields(s ...googleapi.Field) *InstancesGetCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *InstancesGetCall) IfNoneMatch(entityTag string) *InstancesGetCall { +func (c *InstanceGroupsAggregatedListCall) IfNoneMatch(entityTag string) *InstanceGroupsAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -33923,21 +33419,21 @@ func (c *InstancesGetCall) IfNoneMatch(entityTag string) *InstancesGetCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesGetCall) Context(ctx context.Context) *InstancesGetCall { +func (c *InstanceGroupsAggregatedListCall) Context(ctx context.Context) *InstanceGroupsAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesGetCall) Header() http.Header { +func (c *InstanceGroupsAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupsAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -33948,26 +33444,203 @@ func (c *InstancesGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instanceGroups") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.get" call. -// Exactly one of *Instance or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Instance.ServerResponse.Header or (if a response was returned at +// Do executes the "compute.instanceGroups.aggregatedList" call. +// Exactly one of *InstanceGroupAggregatedList or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *InstanceGroupAggregatedList.ServerResponse.Header or (if a response +// was returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *InstanceGroupsAggregatedListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupAggregatedList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &InstanceGroupAggregatedList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves the list of instance groups and sorts them by zone.", + // "httpMethod": "GET", + // "id": "compute.instanceGroups.aggregatedList", + // "parameterOrder": [ + // "project" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/aggregated/instanceGroups", + // "response": { + // "$ref": "InstanceGroupAggregatedList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *InstanceGroupsAggregatedListCall) Pages(ctx context.Context, f func(*InstanceGroupAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.instanceGroups.delete": + +type InstanceGroupsDeleteCall struct { + s *Service + project string + zone string + instanceGroup string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes the specified instance group. The instances in the +// group are not deleted. Note that instance group must not belong to a +// backend service. Read Deleting an instance group for more +// information. +func (r *InstanceGroupsService) Delete(project string, zone string, instanceGroup string) *InstanceGroupsDeleteCall { + c := &InstanceGroupsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.zone = zone + c.instanceGroup = instanceGroup + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstanceGroupsDeleteCall) Fields(s ...googleapi.Field) *InstanceGroupsDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstanceGroupsDeleteCall) Context(ctx context.Context) *InstanceGroupsDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstanceGroupsDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstanceGroupsDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "zone": c.zone, + "instanceGroup": c.instanceGroup, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instanceGroups.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesGetCall) Do(opts ...googleapi.CallOption) (*Instance, error) { +func (c *InstanceGroupsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -33986,7 +33659,7 @@ func (c *InstancesGetCall) Do(opts ...googleapi.CallOption) (*Instance, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Instance{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -33998,19 +33671,18 @@ func (c *InstancesGetCall) Do(opts ...googleapi.CallOption) (*Instance, error) { } return ret, nil // { - // "description": "Returns the specified Instance resource. Get a list of available instances by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.instances.get", + // "description": "Deletes the specified instance group. The instances in the group are not deleted. Note that instance group must not belong to a backend service. Read Deleting an instance group for more information.", + // "httpMethod": "DELETE", + // "id": "compute.instanceGroups.delete", // "parameterOrder": [ // "project", // "zone", - // "instance" + // "instanceGroup" // ], // "parameters": { - // "instance": { - // "description": "Name of the instance resource to return.", + // "instanceGroup": { + // "description": "The name of the instance group to delete.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -34022,72 +33694,51 @@ func (c *InstancesGetCall) Do(opts ...googleapi.CallOption) (*Instance, error) { // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}", + // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}", // "response": { - // "$ref": "Instance" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.instances.getSerialPortOutput": +// method id "compute.instanceGroups.get": -type InstancesGetSerialPortOutputCall struct { - s *Service - project string - zone string - instance string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstanceGroupsGetCall struct { + s *Service + project string + zone string + instanceGroup string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// GetSerialPortOutput: Returns the specified instance's serial port -// output. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/getSerialPortOutput -func (r *InstancesService) GetSerialPortOutput(project string, zone string, instance string) *InstancesGetSerialPortOutputCall { - c := &InstancesGetSerialPortOutputCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified instance group. Get a list of available +// instance groups by making a list() request. +func (r *InstanceGroupsService) Get(project string, zone string, instanceGroup string) *InstanceGroupsGetCall { + c := &InstanceGroupsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance - return c -} - -// Port sets the optional parameter "port": Specifies which COM or -// serial port to retrieve data from. -func (c *InstancesGetSerialPortOutputCall) Port(port int64) *InstancesGetSerialPortOutputCall { - c.urlParams_.Set("port", fmt.Sprint(port)) - return c -} - -// Start sets the optional parameter "start": Returns output starting -// from a specific byte position. Use this to page through output when -// the output is too large to return in a single request. For the -// initial request, leave this field unspecified. For subsequent calls, -// this field should be set to the next value returned in the previous -// call. -func (c *InstancesGetSerialPortOutputCall) Start(start int64) *InstancesGetSerialPortOutputCall { - c.urlParams_.Set("start", fmt.Sprint(start)) + c.instanceGroup = instanceGroup return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesGetSerialPortOutputCall) Fields(s ...googleapi.Field) *InstancesGetSerialPortOutputCall { +func (c *InstanceGroupsGetCall) Fields(s ...googleapi.Field) *InstanceGroupsGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -34097,7 +33748,7 @@ func (c *InstancesGetSerialPortOutputCall) Fields(s ...googleapi.Field) *Instanc // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *InstancesGetSerialPortOutputCall) IfNoneMatch(entityTag string) *InstancesGetSerialPortOutputCall { +func (c *InstanceGroupsGetCall) IfNoneMatch(entityTag string) *InstanceGroupsGetCall { c.ifNoneMatch_ = entityTag return c } @@ -34105,21 +33756,21 @@ func (c *InstancesGetSerialPortOutputCall) IfNoneMatch(entityTag string) *Instan // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesGetSerialPortOutputCall) Context(ctx context.Context) *InstancesGetSerialPortOutputCall { +func (c *InstanceGroupsGetCall) Context(ctx context.Context) *InstanceGroupsGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesGetSerialPortOutputCall) Header() http.Header { +func (c *InstanceGroupsGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesGetSerialPortOutputCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -34130,26 +33781,26 @@ func (c *InstancesGetSerialPortOutputCall) doRequest(alt string) (*http.Response } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/serialPort") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "zone": c.zone, + "instanceGroup": c.instanceGroup, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.getSerialPortOutput" call. -// Exactly one of *SerialPortOutput or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *SerialPortOutput.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.instanceGroups.get" call. +// Exactly one of *InstanceGroup or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *InstanceGroup.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *InstancesGetSerialPortOutputCall) Do(opts ...googleapi.CallOption) (*SerialPortOutput, error) { +func (c *InstanceGroupsGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroup, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -34168,7 +33819,7 @@ func (c *InstancesGetSerialPortOutputCall) Do(opts ...googleapi.CallOption) (*Se if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &SerialPortOutput{ + ret := &InstanceGroup{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -34180,31 +33831,21 @@ func (c *InstancesGetSerialPortOutputCall) Do(opts ...googleapi.CallOption) (*Se } return ret, nil // { - // "description": "Returns the specified instance's serial port output.", + // "description": "Returns the specified instance group. Get a list of available instance groups by making a list() request.", // "httpMethod": "GET", - // "id": "compute.instances.getSerialPortOutput", + // "id": "compute.instanceGroups.get", // "parameterOrder": [ // "project", // "zone", - // "instance" + // "instanceGroup" // ], // "parameters": { - // "instance": { - // "description": "Name of the instance scoping this request.", + // "instanceGroup": { + // "description": "The name of the instance group.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, - // "port": { - // "default": "1", - // "description": "Specifies which COM or serial port to retrieve data from.", - // "format": "int32", - // "location": "query", - // "maximum": "4", - // "minimum": "1", - // "type": "integer" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -34212,23 +33853,16 @@ func (c *InstancesGetSerialPortOutputCall) Do(opts ...googleapi.CallOption) (*Se // "required": true, // "type": "string" // }, - // "start": { - // "description": "Returns output starting from a specific byte position. Use this to page through output when the output is too large to return in a single request. For the initial request, leave this field unspecified. For subsequent calls, this field should be set to the next value returned in the previous call.", - // "format": "int64", - // "location": "query", - // "type": "string" - // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/serialPort", + // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}", // "response": { - // "$ref": "SerialPortOutput" + // "$ref": "InstanceGroup" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -34239,33 +33873,32 @@ func (c *InstancesGetSerialPortOutputCall) Do(opts ...googleapi.CallOption) (*Se } -// method id "compute.instances.insert": +// method id "compute.instanceGroups.insert": -type InstancesInsertCall struct { - s *Service - project string - zone string - instance *Instance - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupsInsertCall struct { + s *Service + project string + zone string + instancegroup *InstanceGroup + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates an instance resource in the specified project using -// the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/insert -func (r *InstancesService) Insert(project string, zone string, instance *Instance) *InstancesInsertCall { - c := &InstancesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates an instance group in the specified project using the +// parameters that are included in the request. +func (r *InstanceGroupsService) Insert(project string, zone string, instancegroup *InstanceGroup) *InstanceGroupsInsertCall { + c := &InstanceGroupsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance + c.instancegroup = instancegroup return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesInsertCall) Fields(s ...googleapi.Field) *InstancesInsertCall { +func (c *InstanceGroupsInsertCall) Fields(s ...googleapi.Field) *InstanceGroupsInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -34273,34 +33906,34 @@ func (c *InstancesInsertCall) Fields(s ...googleapi.Field) *InstancesInsertCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesInsertCall) Context(ctx context.Context) *InstancesInsertCall { +func (c *InstanceGroupsInsertCall) Context(ctx context.Context) *InstanceGroupsInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesInsertCall) Header() http.Header { +func (c *InstanceGroupsInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupsInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instance) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroup) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -34311,14 +33944,14 @@ func (c *InstancesInsertCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.insert" call. +// Do executes the "compute.instanceGroups.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -34349,9 +33982,9 @@ func (c *InstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro } return ret, nil // { - // "description": "Creates an instance resource in the specified project using the data included in the request.", + // "description": "Creates an instance group in the specified project using the parameters that are included in the request.", // "httpMethod": "POST", - // "id": "compute.instances.insert", + // "id": "compute.instanceGroups.insert", // "parameterOrder": [ // "project", // "zone" @@ -34365,16 +33998,15 @@ func (c *InstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where you want to create the instance group.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances", + // "path": "{project}/zones/{zone}/instanceGroups", // "request": { - // "$ref": "Instance" + // "$ref": "InstanceGroup" // }, // "response": { // "$ref": "Operation" @@ -34387,9 +34019,9 @@ func (c *InstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, erro } -// method id "compute.instances.list": +// method id "compute.instanceGroups.list": -type InstancesListCall struct { +type InstanceGroupsListCall struct { s *Service project string zone string @@ -34399,20 +34031,18 @@ type InstancesListCall struct { header_ http.Header } -// List: Retrieves the list of instances contained within the specified -// zone. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/list -func (r *InstancesService) List(project string, zone string) *InstancesListCall { - c := &InstancesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of instance groups that are located in the +// specified project and zone. +func (r *InstanceGroupsService) List(project string, zone string) *InstanceGroupsListCall { + c := &InstanceGroupsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -34424,7 +34054,7 @@ func (r *InstancesService) List(project string, zone string) *InstancesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -34436,7 +34066,7 @@ func (r *InstancesService) List(project string, zone string) *InstancesListCall // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *InstancesListCall) Filter(filter string) *InstancesListCall { +func (c *InstanceGroupsListCall) Filter(filter string) *InstanceGroupsListCall { c.urlParams_.Set("filter", filter) return c } @@ -34447,7 +34077,7 @@ func (c *InstancesListCall) Filter(filter string) *InstancesListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *InstancesListCall) MaxResults(maxResults int64) *InstancesListCall { +func (c *InstanceGroupsListCall) MaxResults(maxResults int64) *InstanceGroupsListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -34464,7 +34094,7 @@ func (c *InstancesListCall) MaxResults(maxResults int64) *InstancesListCall { // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *InstancesListCall) OrderBy(orderBy string) *InstancesListCall { +func (c *InstanceGroupsListCall) OrderBy(orderBy string) *InstanceGroupsListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -34472,7 +34102,7 @@ func (c *InstancesListCall) OrderBy(orderBy string) *InstancesListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *InstancesListCall) PageToken(pageToken string) *InstancesListCall { +func (c *InstanceGroupsListCall) PageToken(pageToken string) *InstanceGroupsListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -34480,7 +34110,7 @@ func (c *InstancesListCall) PageToken(pageToken string) *InstancesListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesListCall) Fields(s ...googleapi.Field) *InstancesListCall { +func (c *InstanceGroupsListCall) Fields(s ...googleapi.Field) *InstanceGroupsListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -34490,7 +34120,7 @@ func (c *InstancesListCall) Fields(s ...googleapi.Field) *InstancesListCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *InstancesListCall) IfNoneMatch(entityTag string) *InstancesListCall { +func (c *InstanceGroupsListCall) IfNoneMatch(entityTag string) *InstanceGroupsListCall { c.ifNoneMatch_ = entityTag return c } @@ -34498,21 +34128,21 @@ func (c *InstancesListCall) IfNoneMatch(entityTag string) *InstancesListCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesListCall) Context(ctx context.Context) *InstancesListCall { +func (c *InstanceGroupsListCall) Context(ctx context.Context) *InstanceGroupsListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesListCall) Header() http.Header { +func (c *InstanceGroupsListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesListCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupsListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -34523,7 +34153,7 @@ func (c *InstancesListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -34534,14 +34164,14 @@ func (c *InstancesListCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.list" call. -// Exactly one of *InstanceList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *InstanceList.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstancesListCall) Do(opts ...googleapi.CallOption) (*InstanceList, error) { +// Do executes the "compute.instanceGroups.list" call. +// Exactly one of *InstanceGroupList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *InstanceGroupList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *InstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*InstanceGroupList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -34560,7 +34190,7 @@ func (c *InstancesListCall) Do(opts ...googleapi.CallOption) (*InstanceList, err if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceList{ + ret := &InstanceGroupList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -34572,16 +34202,16 @@ func (c *InstancesListCall) Do(opts ...googleapi.CallOption) (*InstanceList, err } return ret, nil // { - // "description": "Retrieves the list of instances contained within the specified zone.", + // "description": "Retrieves the list of instance groups that are located in the specified project and zone.", // "httpMethod": "GET", - // "id": "compute.instances.list", + // "id": "compute.instanceGroups.list", // "parameterOrder": [ // "project", // "zone" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -34611,16 +34241,15 @@ func (c *InstancesListCall) Do(opts ...googleapi.CallOption) (*InstanceList, err // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances", + // "path": "{project}/zones/{zone}/instanceGroups", // "response": { - // "$ref": "InstanceList" + // "$ref": "InstanceGroupList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -34634,7 +34263,7 @@ func (c *InstancesListCall) Do(opts ...googleapi.CallOption) (*InstanceList, err // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *InstancesListCall) Pages(ctx context.Context, f func(*InstanceList) error) error { +func (c *InstanceGroupsListCall) Pages(ctx context.Context, f func(*InstanceGroupList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -34652,33 +34281,100 @@ func (c *InstancesListCall) Pages(ctx context.Context, f func(*InstanceList) err } } -// method id "compute.instances.reset": +// method id "compute.instanceGroups.listInstances": -type InstancesResetCall struct { - s *Service - project string - zone string - instance string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupsListInstancesCall struct { + s *Service + project string + zone string + instanceGroup string + instancegroupslistinstancesrequest *InstanceGroupsListInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Reset: Performs a reset on the instance. For more information, see -// Resetting an instance. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/reset -func (r *InstancesService) Reset(project string, zone string, instance string) *InstancesResetCall { - c := &InstancesResetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// ListInstances: Lists the instances in the specified instance group. +func (r *InstanceGroupsService) ListInstances(project string, zone string, instanceGroup string, instancegroupslistinstancesrequest *InstanceGroupsListInstancesRequest) *InstanceGroupsListInstancesCall { + c := &InstanceGroupsListInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance + c.instanceGroup = instanceGroup + c.instancegroupslistinstancesrequest = instancegroupslistinstancesrequest + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *InstanceGroupsListInstancesCall) Filter(filter string) *InstanceGroupsListInstancesCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *InstanceGroupsListInstancesCall) MaxResults(maxResults int64) *InstanceGroupsListInstancesCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *InstanceGroupsListInstancesCall) OrderBy(orderBy string) *InstanceGroupsListInstancesCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *InstanceGroupsListInstancesCall) PageToken(pageToken string) *InstanceGroupsListInstancesCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesResetCall) Fields(s ...googleapi.Field) *InstancesResetCall { +func (c *InstanceGroupsListInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupsListInstancesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -34686,48 +34382,53 @@ func (c *InstancesResetCall) Fields(s ...googleapi.Field) *InstancesResetCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesResetCall) Context(ctx context.Context) *InstancesResetCall { +func (c *InstanceGroupsListInstancesCall) Context(ctx context.Context) *InstanceGroupsListInstancesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesResetCall) Header() http.Header { +func (c *InstanceGroupsListInstancesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesResetCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupsListInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupslistinstancesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/reset") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "zone": c.zone, + "instanceGroup": c.instanceGroup, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.reset" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstancesResetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.instanceGroups.listInstances" call. +// Exactly one of *InstanceGroupsListInstances or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *InstanceGroupsListInstances.ServerResponse.Header or (if a response +// was returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *InstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) (*InstanceGroupsListInstances, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -34746,7 +34447,7 @@ func (c *InstancesResetCall) Do(opts ...googleapi.CallOption) (*Operation, error if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &InstanceGroupsListInstances{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -34758,22 +34459,44 @@ func (c *InstancesResetCall) Do(opts ...googleapi.CallOption) (*Operation, error } return ret, nil // { - // "description": "Performs a reset on the instance. For more information, see Resetting an instance.", + // "description": "Lists the instances in the specified instance group.", // "httpMethod": "POST", - // "id": "compute.instances.reset", + // "id": "compute.instanceGroups.listInstances", // "parameterOrder": [ // "project", // "zone", - // "instance" + // "instanceGroup" // ], // "parameters": { - // "instance": { - // "description": "Name of the instance scoping this request.", + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "instanceGroup": { + // "description": "The name of the instance group from which you want to generate a list of included instances.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -34782,54 +34505,81 @@ func (c *InstancesResetCall) Do(opts ...googleapi.CallOption) (*Operation, error // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/reset", + // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances", + // "request": { + // "$ref": "InstanceGroupsListInstancesRequest" + // }, // "response": { - // "$ref": "Operation" + // "$ref": "InstanceGroupsListInstances" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instances.setDiskAutoDelete": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *InstanceGroupsListInstancesCall) Pages(ctx context.Context, f func(*InstanceGroupsListInstances) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type InstancesSetDiskAutoDeleteCall struct { - s *Service - project string - zone string - instance string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +// method id "compute.instanceGroups.removeInstances": + +type InstanceGroupsRemoveInstancesCall struct { + s *Service + project string + zone string + instanceGroup string + instancegroupsremoveinstancesrequest *InstanceGroupsRemoveInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetDiskAutoDelete: Sets the auto-delete flag for a disk attached to -// an instance. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/setDiskAutoDelete -func (r *InstancesService) SetDiskAutoDelete(project string, zone string, instance string, autoDelete bool, deviceName string) *InstancesSetDiskAutoDeleteCall { - c := &InstancesSetDiskAutoDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// RemoveInstances: Removes one or more instances from the specified +// instance group, but does not delete those instances. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration before the VM instance is removed or deleted. +func (r *InstanceGroupsService) RemoveInstances(project string, zone string, instanceGroup string, instancegroupsremoveinstancesrequest *InstanceGroupsRemoveInstancesRequest) *InstanceGroupsRemoveInstancesCall { + c := &InstanceGroupsRemoveInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance - c.urlParams_.Set("autoDelete", fmt.Sprint(autoDelete)) - c.urlParams_.Set("deviceName", deviceName) + c.instanceGroup = instanceGroup + c.instancegroupsremoveinstancesrequest = instancegroupsremoveinstancesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesSetDiskAutoDeleteCall) Fields(s ...googleapi.Field) *InstancesSetDiskAutoDeleteCall { +func (c *InstanceGroupsRemoveInstancesCall) Fields(s ...googleapi.Field) *InstanceGroupsRemoveInstancesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -34837,48 +34587,53 @@ func (c *InstancesSetDiskAutoDeleteCall) Fields(s ...googleapi.Field) *Instances // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesSetDiskAutoDeleteCall) Context(ctx context.Context) *InstancesSetDiskAutoDeleteCall { +func (c *InstanceGroupsRemoveInstancesCall) Context(ctx context.Context) *InstanceGroupsRemoveInstancesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesSetDiskAutoDeleteCall) Header() http.Header { +func (c *InstanceGroupsRemoveInstancesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesSetDiskAutoDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupsRemoveInstancesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsremoveinstancesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "zone": c.zone, + "instanceGroup": c.instanceGroup, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.setDiskAutoDelete" call. +// Do executes the "compute.instanceGroups.removeInstances" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesSetDiskAutoDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupsRemoveInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -34909,34 +34664,18 @@ func (c *InstancesSetDiskAutoDeleteCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Sets the auto-delete flag for a disk attached to an instance.", + // "description": "Removes one or more instances from the specified instance group, but does not delete those instances.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration before the VM instance is removed or deleted.", // "httpMethod": "POST", - // "id": "compute.instances.setDiskAutoDelete", + // "id": "compute.instanceGroups.removeInstances", // "parameterOrder": [ // "project", // "zone", - // "instance", - // "autoDelete", - // "deviceName" + // "instanceGroup" // ], // "parameters": { - // "autoDelete": { - // "description": "Whether to auto-delete the disk when the instance is deleted.", - // "location": "query", - // "required": true, - // "type": "boolean" - // }, - // "deviceName": { - // "description": "The device name of the disk to modify.", - // "location": "query", - // "pattern": "\\w[\\w.-]{0,254}", - // "required": true, - // "type": "string" - // }, - // "instance": { - // "description": "The instance name.", + // "instanceGroup": { + // "description": "The name of the instance group where the specified instances will be removed.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -34948,14 +34687,16 @@ func (c *InstancesSetDiskAutoDeleteCall) Do(opts ...googleapi.CallOption) (*Oper // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete", + // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances", + // "request": { + // "$ref": "InstanceGroupsRemoveInstancesRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -34967,34 +34708,33 @@ func (c *InstancesSetDiskAutoDeleteCall) Do(opts ...googleapi.CallOption) (*Oper } -// method id "compute.instances.setMachineType": +// method id "compute.instanceGroups.setNamedPorts": -type InstancesSetMachineTypeCall struct { - s *Service - project string - zone string - instance string - instancessetmachinetyperequest *InstancesSetMachineTypeRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceGroupsSetNamedPortsCall struct { + s *Service + project string + zone string + instanceGroup string + instancegroupssetnamedportsrequest *InstanceGroupsSetNamedPortsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetMachineType: Changes the machine type for a stopped instance to -// the machine type specified in the request. -func (r *InstancesService) SetMachineType(project string, zone string, instance string, instancessetmachinetyperequest *InstancesSetMachineTypeRequest) *InstancesSetMachineTypeCall { - c := &InstancesSetMachineTypeCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetNamedPorts: Sets the named ports for the specified instance group. +func (r *InstanceGroupsService) SetNamedPorts(project string, zone string, instanceGroup string, instancegroupssetnamedportsrequest *InstanceGroupsSetNamedPortsRequest) *InstanceGroupsSetNamedPortsCall { + c := &InstanceGroupsSetNamedPortsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.instance = instance - c.instancessetmachinetyperequest = instancessetmachinetyperequest + c.instanceGroup = instanceGroup + c.instancegroupssetnamedportsrequest = instancegroupssetnamedportsrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesSetMachineTypeCall) Fields(s ...googleapi.Field) *InstancesSetMachineTypeCall { +func (c *InstanceGroupsSetNamedPortsCall) Fields(s ...googleapi.Field) *InstanceGroupsSetNamedPortsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -35002,53 +34742,53 @@ func (c *InstancesSetMachineTypeCall) Fields(s ...googleapi.Field) *InstancesSet // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesSetMachineTypeCall) Context(ctx context.Context) *InstancesSetMachineTypeCall { +func (c *InstanceGroupsSetNamedPortsCall) Context(ctx context.Context) *InstanceGroupsSetNamedPortsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesSetMachineTypeCall) Header() http.Header { +func (c *InstanceGroupsSetNamedPortsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesSetMachineTypeCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceGroupsSetNamedPortsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetmachinetyperequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupssetnamedportsrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setMachineType") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "zone": c.zone, + "instanceGroup": c.instanceGroup, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.setMachineType" call. +// Do executes the "compute.instanceGroups.setNamedPorts" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesSetMachineTypeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -35079,19 +34819,18 @@ func (c *InstancesSetMachineTypeCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Changes the machine type for a stopped instance to the machine type specified in the request.", + // "description": "Sets the named ports for the specified instance group.", // "httpMethod": "POST", - // "id": "compute.instances.setMachineType", + // "id": "compute.instanceGroups.setNamedPorts", // "parameterOrder": [ // "project", // "zone", - // "instance" + // "instanceGroup" // ], // "parameters": { - // "instance": { - // "description": "Name of the instance scoping this request.", + // "instanceGroup": { + // "description": "The name of the instance group where the named ports are updated.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, @@ -35103,16 +34842,15 @@ func (c *InstancesSetMachineTypeCall) Do(opts ...googleapi.CallOption) (*Operati // "type": "string" // }, // "zone": { - // "description": "The name of the zone for this request.", + // "description": "The name of the zone where the instance group is located.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/setMachineType", + // "path": "{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts", // "request": { - // "$ref": "InstancesSetMachineTypeRequest" + // "$ref": "InstanceGroupsSetNamedPortsRequest" // }, // "response": { // "$ref": "Operation" @@ -35125,35 +34863,34 @@ func (c *InstancesSetMachineTypeCall) Do(opts ...googleapi.CallOption) (*Operati } -// method id "compute.instances.setMetadata": +// method id "compute.instanceTemplates.delete": -type InstancesSetMetadataCall struct { - s *Service - project string - zone string - instance string - metadata *Metadata - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceTemplatesDeleteCall struct { + s *Service + project string + instanceTemplate string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetMetadata: Sets metadata for the specified instance to the data -// included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/setMetadata -func (r *InstancesService) SetMetadata(project string, zone string, instance string, metadata *Metadata) *InstancesSetMetadataCall { - c := &InstancesSetMetadataCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified instance template. If you delete an +// instance template that is being referenced from another instance +// group, the instance group will not be able to create or recreate +// virtual machine instances. Deleting an instance template is permanent +// and cannot be undone. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instanceTemplates/delete +func (r *InstanceTemplatesService) Delete(project string, instanceTemplate string) *InstanceTemplatesDeleteCall { + c := &InstanceTemplatesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instance = instance - c.metadata = metadata + c.instanceTemplate = instanceTemplate return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesSetMetadataCall) Fields(s ...googleapi.Field) *InstancesSetMetadataCall { +func (c *InstanceTemplatesDeleteCall) Fields(s ...googleapi.Field) *InstanceTemplatesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -35161,53 +34898,47 @@ func (c *InstancesSetMetadataCall) Fields(s ...googleapi.Field) *InstancesSetMet // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesSetMetadataCall) Context(ctx context.Context) *InstancesSetMetadataCall { +func (c *InstanceTemplatesDeleteCall) Context(ctx context.Context) *InstanceTemplatesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesSetMetadataCall) Header() http.Header { +func (c *InstanceTemplatesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesSetMetadataCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceTemplatesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setMetadata") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates/{instanceTemplate}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "instanceTemplate": c.instanceTemplate, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.setMetadata" call. +// Do executes the "compute.instanceTemplates.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesSetMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceTemplatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -35238,17 +34969,16 @@ func (c *InstancesSetMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Sets metadata for the specified instance to the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.instances.setMetadata", + // "description": "Deletes the specified instance template. If you delete an instance template that is being referenced from another instance group, the instance group will not be able to create or recreate virtual machine instances. Deleting an instance template is permanent and cannot be undone.", + // "httpMethod": "DELETE", + // "id": "compute.instanceTemplates.delete", // "parameterOrder": [ // "project", - // "zone", - // "instance" + // "instanceTemplate" // ], // "parameters": { - // "instance": { - // "description": "Name of the instance scoping this request.", + // "instanceTemplate": { + // "description": "The name of the instance template to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -35260,19 +34990,9 @@ func (c *InstancesSetMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/setMetadata", - // "request": { - // "$ref": "Metadata" - // }, + // "path": "{project}/global/instanceTemplates/{instanceTemplate}", // "response": { // "$ref": "Operation" // }, @@ -35284,88 +35004,93 @@ func (c *InstancesSetMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.instances.setScheduling": - -type InstancesSetSchedulingCall struct { - s *Service - project string - zone string - instance string - scheduling *Scheduling - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} +// method id "compute.instanceTemplates.get": -// SetScheduling: Sets an instance's scheduling options. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/setScheduling -func (r *InstancesService) SetScheduling(project string, zone string, instance string, scheduling *Scheduling) *InstancesSetSchedulingCall { - c := &InstancesSetSchedulingCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.zone = zone - c.instance = instance - c.scheduling = scheduling +type InstanceTemplatesGetCall struct { + s *Service + project string + instanceTemplate string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns the specified instance template. Get a list of available +// instance templates by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instanceTemplates/get +func (r *InstanceTemplatesService) Get(project string, instanceTemplate string) *InstanceTemplatesGetCall { + c := &InstanceTemplatesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.instanceTemplate = instanceTemplate return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesSetSchedulingCall) Fields(s ...googleapi.Field) *InstancesSetSchedulingCall { +func (c *InstanceTemplatesGetCall) Fields(s ...googleapi.Field) *InstanceTemplatesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *InstanceTemplatesGetCall) IfNoneMatch(entityTag string) *InstanceTemplatesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesSetSchedulingCall) Context(ctx context.Context) *InstancesSetSchedulingCall { +func (c *InstanceTemplatesGetCall) Context(ctx context.Context) *InstanceTemplatesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesSetSchedulingCall) Header() http.Header { +func (c *InstanceTemplatesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesSetSchedulingCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceTemplatesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.scheduling) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setScheduling") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates/{instanceTemplate}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, + "instanceTemplate": c.instanceTemplate, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.setScheduling" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstancesSetSchedulingCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.instanceTemplates.get" call. +// Exactly one of *InstanceTemplate or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *InstanceTemplate.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *InstanceTemplatesGetCall) Do(opts ...googleapi.CallOption) (*InstanceTemplate, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -35384,7 +35109,7 @@ func (c *InstancesSetSchedulingCall) Do(opts ...googleapi.CallOption) (*Operatio if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &InstanceTemplate{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -35396,17 +35121,16 @@ func (c *InstancesSetSchedulingCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Sets an instance's scheduling options.", - // "httpMethod": "POST", - // "id": "compute.instances.setScheduling", + // "description": "Returns the specified instance template. Get a list of available instance templates by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.instanceTemplates.get", // "parameterOrder": [ // "project", - // "zone", - // "instance" + // "instanceTemplate" // ], // "parameters": { - // "instance": { - // "description": "Instance name.", + // "instanceTemplate": { + // "description": "The name of the instance template.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -35418,59 +35142,49 @@ func (c *InstancesSetSchedulingCall) Do(opts ...googleapi.CallOption) (*Operatio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/setScheduling", - // "request": { - // "$ref": "Scheduling" - // }, + // "path": "{project}/global/instanceTemplates/{instanceTemplate}", // "response": { - // "$ref": "Operation" + // "$ref": "InstanceTemplate" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instances.setServiceAccount": +// method id "compute.instanceTemplates.insert": -type InstancesSetServiceAccountCall struct { - s *Service - project string - zone string - instance string - instancessetserviceaccountrequest *InstancesSetServiceAccountRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceTemplatesInsertCall struct { + s *Service + project string + instancetemplate *InstanceTemplate + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetServiceAccount: Sets the service account on the instance. For more -// information, read Changing the service account and access scopes for -// an instance. -func (r *InstancesService) SetServiceAccount(project string, zone string, instance string, instancessetserviceaccountrequest *InstancesSetServiceAccountRequest) *InstancesSetServiceAccountCall { - c := &InstancesSetServiceAccountCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates an instance template in the specified project using +// the data that is included in the request. If you are creating a new +// template to update an existing instance group, your new instance +// template must use the same network or, if applicable, the same +// subnetwork as the original template. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instanceTemplates/insert +func (r *InstanceTemplatesService) Insert(project string, instancetemplate *InstanceTemplate) *InstanceTemplatesInsertCall { + c := &InstanceTemplatesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instance = instance - c.instancessetserviceaccountrequest = instancessetserviceaccountrequest + c.instancetemplate = instancetemplate return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesSetServiceAccountCall) Fields(s ...googleapi.Field) *InstancesSetServiceAccountCall { +func (c *InstanceTemplatesInsertCall) Fields(s ...googleapi.Field) *InstanceTemplatesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -35478,53 +35192,51 @@ func (c *InstancesSetServiceAccountCall) Fields(s ...googleapi.Field) *Instances // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesSetServiceAccountCall) Context(ctx context.Context) *InstancesSetServiceAccountCall { +func (c *InstanceTemplatesInsertCall) Context(ctx context.Context) *InstanceTemplatesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesSetServiceAccountCall) Header() http.Header { +func (c *InstanceTemplatesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesSetServiceAccountCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceTemplatesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetserviceaccountrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancetemplate) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setServiceAccount") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.setServiceAccount" call. +// Do executes the "compute.instanceTemplates.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesSetServiceAccountCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstanceTemplatesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -35555,40 +35267,24 @@ func (c *InstancesSetServiceAccountCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Sets the service account on the instance. For more information, read Changing the service account and access scopes for an instance.", + // "description": "Creates an instance template in the specified project using the data that is included in the request. If you are creating a new template to update an existing instance group, your new instance template must use the same network or, if applicable, the same subnetwork as the original template.", // "httpMethod": "POST", - // "id": "compute.instances.setServiceAccount", + // "id": "compute.instanceTemplates.insert", // "parameterOrder": [ - // "project", - // "zone", - // "instance" + // "project" // ], // "parameters": { - // "instance": { - // "description": "Name of the instance resource to start.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/setServiceAccount", + // "path": "{project}/global/instanceTemplates", // "request": { - // "$ref": "InstancesSetServiceAccountRequest" + // "$ref": "InstanceTemplate" // }, // "response": { // "$ref": "Operation" @@ -35601,89 +35297,157 @@ func (c *InstancesSetServiceAccountCall) Do(opts ...googleapi.CallOption) (*Oper } -// method id "compute.instances.setTags": +// method id "compute.instanceTemplates.list": -type InstancesSetTagsCall struct { - s *Service - project string - zone string - instance string - tags *Tags - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstanceTemplatesListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// SetTags: Sets tags for the specified instance to the data included in -// the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/setTags -func (r *InstancesService) SetTags(project string, zone string, instance string, tags *Tags) *InstancesSetTagsCall { - c := &InstancesSetTagsCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of instance templates that are contained +// within the specified project and zone. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instanceTemplates/list +func (r *InstanceTemplatesService) List(project string) *InstanceTemplatesListCall { + c := &InstanceTemplatesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instance = instance - c.tags = tags + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *InstanceTemplatesListCall) Filter(filter string) *InstanceTemplatesListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *InstanceTemplatesListCall) MaxResults(maxResults int64) *InstanceTemplatesListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *InstanceTemplatesListCall) OrderBy(orderBy string) *InstanceTemplatesListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *InstanceTemplatesListCall) PageToken(pageToken string) *InstanceTemplatesListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesSetTagsCall) Fields(s ...googleapi.Field) *InstancesSetTagsCall { +func (c *InstanceTemplatesListCall) Fields(s ...googleapi.Field) *InstanceTemplatesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *InstanceTemplatesListCall) IfNoneMatch(entityTag string) *InstanceTemplatesListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesSetTagsCall) Context(ctx context.Context) *InstancesSetTagsCall { +func (c *InstanceTemplatesListCall) Context(ctx context.Context) *InstanceTemplatesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesSetTagsCall) Header() http.Header { +func (c *InstanceTemplatesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesSetTagsCall) doRequest(alt string) (*http.Response, error) { +func (c *InstanceTemplatesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.tags) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setTags") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.setTags" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstancesSetTagsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.instanceTemplates.list" call. +// Exactly one of *InstanceTemplateList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *InstanceTemplateList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *InstanceTemplatesListCall) Do(opts ...googleapi.CallOption) (*InstanceTemplateList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -35702,7 +35466,7 @@ func (c *InstancesSetTagsCall) Do(opts ...googleapi.CallOption) (*Operation, err if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &InstanceTemplateList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -35714,20 +35478,34 @@ func (c *InstancesSetTagsCall) Do(opts ...googleapi.CallOption) (*Operation, err } return ret, nil // { - // "description": "Sets tags for the specified instance to the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.instances.setTags", + // "description": "Retrieves a list of instance templates that are contained within the specified project and zone.", + // "httpMethod": "GET", + // "id": "compute.instanceTemplates.list", // "parameterOrder": [ - // "project", - // "zone", - // "instance" + // "project" // ], // "parameters": { - // "instance": { - // "description": "Name of the instance scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", // "type": "string" // }, // "project": { @@ -35736,58 +35514,72 @@ func (c *InstancesSetTagsCall) Do(opts ...googleapi.CallOption) (*Operation, err // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/setTags", - // "request": { - // "$ref": "Tags" - // }, + // "path": "{project}/global/instanceTemplates", // "response": { - // "$ref": "Operation" + // "$ref": "InstanceTemplateList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instances.start": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *InstanceTemplatesListCall) Pages(ctx context.Context, f func(*InstanceTemplateList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type InstancesStartCall struct { - s *Service - project string - zone string - instance string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +// method id "compute.instances.addAccessConfig": + +type InstancesAddAccessConfigCall struct { + s *Service + project string + zone string + instance string + accessconfig *AccessConfig + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Start: Starts an instance that was stopped using the using the -// instances().stop method. For more information, see Restart an -// instance. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/start -func (r *InstancesService) Start(project string, zone string, instance string) *InstancesStartCall { - c := &InstancesStartCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AddAccessConfig: Adds an access config to an instance's network +// interface. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/addAccessConfig +func (r *InstancesService) AddAccessConfig(project string, zone string, instance string, networkInterface string, accessconfig *AccessConfig) *InstancesAddAccessConfigCall { + c := &InstancesAddAccessConfigCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone c.instance = instance + c.urlParams_.Set("networkInterface", networkInterface) + c.accessconfig = accessconfig return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesStartCall) Fields(s ...googleapi.Field) *InstancesStartCall { +func (c *InstancesAddAccessConfigCall) Fields(s ...googleapi.Field) *InstancesAddAccessConfigCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -35795,29 +35587,34 @@ func (c *InstancesStartCall) Fields(s ...googleapi.Field) *InstancesStartCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesStartCall) Context(ctx context.Context) *InstancesStartCall { +func (c *InstancesAddAccessConfigCall) Context(ctx context.Context) *InstancesAddAccessConfigCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesStartCall) Header() http.Header { +func (c *InstancesAddAccessConfigCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesStartCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesAddAccessConfigCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.accessconfig) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/start") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/addAccessConfig") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -35829,14 +35626,14 @@ func (c *InstancesStartCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.start" call. +// Do executes the "compute.instances.addAccessConfig" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesStartCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesAddAccessConfigCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -35867,22 +35664,29 @@ func (c *InstancesStartCall) Do(opts ...googleapi.CallOption) (*Operation, error } return ret, nil // { - // "description": "Starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.", + // "description": "Adds an access config to an instance's network interface.", // "httpMethod": "POST", - // "id": "compute.instances.start", + // "id": "compute.instances.addAccessConfig", // "parameterOrder": [ // "project", // "zone", - // "instance" + // "instance", + // "networkInterface" // ], // "parameters": { // "instance": { - // "description": "Name of the instance resource to start.", + // "description": "The instance name for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, + // "networkInterface": { + // "description": "The name of the network interface to add to this instance.", + // "location": "query", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -35898,7 +35702,10 @@ func (c *InstancesStartCall) Do(opts ...googleapi.CallOption) (*Operation, error // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/start", + // "path": "{project}/zones/{zone}/instances/{instance}/addAccessConfig", + // "request": { + // "$ref": "AccessConfig" + // }, // "response": { // "$ref": "Operation" // }, @@ -35910,89 +35717,156 @@ func (c *InstancesStartCall) Do(opts ...googleapi.CallOption) (*Operation, error } -// method id "compute.instances.startWithEncryptionKey": +// method id "compute.instances.aggregatedList": -type InstancesStartWithEncryptionKeyCall struct { - s *Service - project string - zone string - instance string - instancesstartwithencryptionkeyrequest *InstancesStartWithEncryptionKeyRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstancesAggregatedListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// StartWithEncryptionKey: Starts an instance that was stopped using the -// using the instances().stop method. For more information, see Restart -// an instance. -func (r *InstancesService) StartWithEncryptionKey(project string, zone string, instance string, instancesstartwithencryptionkeyrequest *InstancesStartWithEncryptionKeyRequest) *InstancesStartWithEncryptionKeyCall { - c := &InstancesStartWithEncryptionKeyCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves aggregated list of instances. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/aggregatedList +func (r *InstancesService) AggregatedList(project string) *InstancesAggregatedListCall { + c := &InstancesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.instance = instance - c.instancesstartwithencryptionkeyrequest = instancesstartwithencryptionkeyrequest - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *InstancesStartWithEncryptionKeyCall) Fields(s ...googleapi.Field) *InstancesStartWithEncryptionKeyCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *InstancesAggregatedListCall) Filter(filter string) *InstancesAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *InstancesAggregatedListCall) MaxResults(maxResults int64) *InstancesAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *InstancesAggregatedListCall) OrderBy(orderBy string) *InstancesAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *InstancesAggregatedListCall) PageToken(pageToken string) *InstancesAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstancesAggregatedListCall) Fields(s ...googleapi.Field) *InstancesAggregatedListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *InstancesAggregatedListCall) IfNoneMatch(entityTag string) *InstancesAggregatedListCall { + c.ifNoneMatch_ = entityTag return c } // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesStartWithEncryptionKeyCall) Context(ctx context.Context) *InstancesStartWithEncryptionKeyCall { +func (c *InstancesAggregatedListCall) Context(ctx context.Context) *InstancesAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesStartWithEncryptionKeyCall) Header() http.Header { +func (c *InstancesAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesStartWithEncryptionKeyCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesstartwithencryptionkeyrequest) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instances") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "instance": c.instance, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.startWithEncryptionKey" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *InstancesStartWithEncryptionKeyCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.instances.aggregatedList" call. +// Exactly one of *InstanceAggregatedList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *InstanceAggregatedList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *InstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*InstanceAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -36011,7 +35885,7 @@ func (c *InstancesStartWithEncryptionKeyCall) Do(opts ...googleapi.CallOption) ( if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &InstanceAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -36023,20 +35897,34 @@ func (c *InstancesStartWithEncryptionKeyCall) Do(opts ...googleapi.CallOption) ( } return ret, nil // { - // "description": "Starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.", - // "httpMethod": "POST", - // "id": "compute.instances.startWithEncryptionKey", + // "description": "Retrieves aggregated list of instances.", + // "httpMethod": "GET", + // "id": "compute.instances.aggregatedList", // "parameterOrder": [ - // "project", - // "zone", - // "instance" + // "project" // ], // "parameters": { - // "instance": { - // "description": "Name of the instance resource to start.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", // "type": "string" // }, // "project": { @@ -36045,62 +35933,73 @@ func (c *InstancesStartWithEncryptionKeyCall) Do(opts ...googleapi.CallOption) ( // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "zone": { - // "description": "The name of the zone for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey", - // "request": { - // "$ref": "InstancesStartWithEncryptionKeyRequest" - // }, + // "path": "{project}/aggregated/instances", // "response": { - // "$ref": "Operation" + // "$ref": "InstanceAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.instances.stop": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *InstancesAggregatedListCall) Pages(ctx context.Context, f func(*InstanceAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type InstancesStopCall struct { - s *Service - project string - zone string - instance string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +// method id "compute.instances.attachDisk": + +type InstancesAttachDiskCall struct { + s *Service + project string + zone string + instance string + attacheddisk *AttachedDisk + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Stop: Stops a running instance, shutting it down cleanly, and allows -// you to restart the instance at a later time. Stopped instances do not -// incur per-minute, virtual machine usage charges while they are -// stopped, but any resources that the virtual machine is using, such as -// persistent disks and static IP addresses, will continue to be charged -// until they are deleted. For more information, see Stopping an -// instance. -// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/stop -func (r *InstancesService) Stop(project string, zone string, instance string) *InstancesStopCall { - c := &InstancesStopCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AttachDisk: Attaches an existing Disk resource to an instance. You +// must first create the disk before you can attach it. It is not +// possible to create and attach a disk at the same time. For more +// information, read Adding a persistent disk to your instance. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/attachDisk +func (r *InstancesService) AttachDisk(project string, zone string, instance string, attacheddisk *AttachedDisk) *InstancesAttachDiskCall { + c := &InstancesAttachDiskCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone c.instance = instance + c.attacheddisk = attacheddisk return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *InstancesStopCall) Fields(s ...googleapi.Field) *InstancesStopCall { +func (c *InstancesAttachDiskCall) Fields(s ...googleapi.Field) *InstancesAttachDiskCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -36108,29 +36007,34 @@ func (c *InstancesStopCall) Fields(s ...googleapi.Field) *InstancesStopCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *InstancesStopCall) Context(ctx context.Context) *InstancesStopCall { +func (c *InstancesAttachDiskCall) Context(ctx context.Context) *InstancesAttachDiskCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *InstancesStopCall) Header() http.Header { +func (c *InstancesAttachDiskCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *InstancesStopCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesAttachDiskCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.attacheddisk) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/stop") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/attachDisk") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -36142,14 +36046,14 @@ func (c *InstancesStopCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.instances.stop" call. +// Do executes the "compute.instances.attachDisk" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *InstancesStopCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesAttachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -36180,9 +36084,9 @@ func (c *InstancesStopCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Stops a running instance, shutting it down cleanly, and allows you to restart the instance at a later time. Stopped instances do not incur per-minute, virtual machine usage charges while they are stopped, but any resources that the virtual machine is using, such as persistent disks and static IP addresses, will continue to be charged until they are deleted. For more information, see Stopping an instance.", + // "description": "Attaches an existing Disk resource to an instance. You must first create the disk before you can attach it. It is not possible to create and attach a disk at the same time. For more information, read Adding a persistent disk to your instance.", // "httpMethod": "POST", - // "id": "compute.instances.stop", + // "id": "compute.instances.attachDisk", // "parameterOrder": [ // "project", // "zone", @@ -36190,7 +36094,7 @@ func (c *InstancesStopCall) Do(opts ...googleapi.CallOption) (*Operation, error) // ], // "parameters": { // "instance": { - // "description": "Name of the instance resource to stop.", + // "description": "The instance name for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -36211,7 +36115,10 @@ func (c *InstancesStopCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/instances/{instance}/stop", + // "path": "{project}/zones/{zone}/instances/{instance}/attachDisk", + // "request": { + // "$ref": "AttachedDisk" + // }, // "response": { // "$ref": "Operation" // }, @@ -36223,93 +36130,82 @@ func (c *InstancesStopCall) Do(opts ...googleapi.CallOption) (*Operation, error) } -// method id "compute.licenses.get": +// method id "compute.instances.delete": -type LicensesGetCall struct { - s *Service - project string - license string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstancesDeleteCall struct { + s *Service + project string + zone string + instance string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified License resource. Get a list of available -// licenses by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/licenses/get -func (r *LicensesService) Get(project string, license string) *LicensesGetCall { - c := &LicensesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified Instance resource. For more +// information, see Stopping or Deleting an Instance. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/delete +func (r *InstancesService) Delete(project string, zone string, instance string) *InstancesDeleteCall { + c := &InstancesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.license = license + c.zone = zone + c.instance = instance return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *LicensesGetCall) Fields(s ...googleapi.Field) *LicensesGetCall { +func (c *InstancesDeleteCall) Fields(s ...googleapi.Field) *InstancesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *LicensesGetCall) IfNoneMatch(entityTag string) *LicensesGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *LicensesGetCall) Context(ctx context.Context) *LicensesGetCall { +func (c *InstancesDeleteCall) Context(ctx context.Context) *InstancesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *LicensesGetCall) Header() http.Header { +func (c *InstancesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *LicensesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/licenses/{license}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "license": c.license, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.licenses.get" call. -// Exactly one of *License or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *License.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *LicensesGetCall) Do(opts ...googleapi.CallOption) (*License, error) { +// Do executes the "compute.instances.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -36328,7 +36224,7 @@ func (c *LicensesGetCall) Do(opts ...googleapi.CallOption) (*License, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &License{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -36340,16 +36236,17 @@ func (c *LicensesGetCall) Do(opts ...googleapi.CallOption) (*License, error) { } return ret, nil // { - // "description": "Returns the specified License resource. Get a list of available licenses by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.licenses.get", + // "description": "Deletes the specified Instance resource. For more information, see Stopping or Deleting an Instance.", + // "httpMethod": "DELETE", + // "id": "compute.instances.delete", // "parameterOrder": [ // "project", - // "license" + // "zone", + // "instance" // ], // "parameters": { - // "license": { - // "description": "Name of the License resource to return.", + // "instance": { + // "description": "Name of the instance resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -36361,172 +36258,105 @@ func (c *LicensesGetCall) Do(opts ...googleapi.CallOption) (*License, error) { // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/licenses/{license}", + // "path": "{project}/zones/{zone}/instances/{instance}", // "response": { - // "$ref": "License" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.machineTypes.aggregatedList": +// method id "compute.instances.deleteAccessConfig": -type MachineTypesAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstancesDeleteAccessConfigCall struct { + s *Service + project string + zone string + instance string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves an aggregated list of machine types. -// For details, see https://cloud.google.com/compute/docs/reference/latest/machineTypes/aggregatedList -func (r *MachineTypesService) AggregatedList(project string) *MachineTypesAggregatedListCall { - c := &MachineTypesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// DeleteAccessConfig: Deletes an access config from an instance's +// network interface. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/deleteAccessConfig +func (r *InstancesService) DeleteAccessConfig(project string, zone string, instance string, accessConfig string, networkInterface string) *InstancesDeleteAccessConfigCall { + c := &InstancesDeleteAccessConfigCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *MachineTypesAggregatedListCall) Filter(filter string) *MachineTypesAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *MachineTypesAggregatedListCall) MaxResults(maxResults int64) *MachineTypesAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *MachineTypesAggregatedListCall) OrderBy(orderBy string) *MachineTypesAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *MachineTypesAggregatedListCall) PageToken(pageToken string) *MachineTypesAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) + c.zone = zone + c.instance = instance + c.urlParams_.Set("accessConfig", accessConfig) + c.urlParams_.Set("networkInterface", networkInterface) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *MachineTypesAggregatedListCall) Fields(s ...googleapi.Field) *MachineTypesAggregatedListCall { +func (c *InstancesDeleteAccessConfigCall) Fields(s ...googleapi.Field) *InstancesDeleteAccessConfigCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *MachineTypesAggregatedListCall) IfNoneMatch(entityTag string) *MachineTypesAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *MachineTypesAggregatedListCall) Context(ctx context.Context) *MachineTypesAggregatedListCall { +func (c *InstancesDeleteAccessConfigCall) Context(ctx context.Context) *InstancesDeleteAccessConfigCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *MachineTypesAggregatedListCall) Header() http.Header { +func (c *InstancesDeleteAccessConfigCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *MachineTypesAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesDeleteAccessConfigCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/machineTypes") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.machineTypes.aggregatedList" call. -// Exactly one of *MachineTypeAggregatedList or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *MachineTypeAggregatedList.ServerResponse.Header or (if a response -// was returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *MachineTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*MachineTypeAggregatedList, error) { +// Do executes the "compute.instances.deleteAccessConfig" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstancesDeleteAccessConfigCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -36545,7 +36375,7 @@ func (c *MachineTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Mach if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &MachineTypeAggregatedList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -36557,34 +36387,34 @@ func (c *MachineTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Mach } return ret, nil // { - // "description": "Retrieves an aggregated list of machine types.", - // "httpMethod": "GET", - // "id": "compute.machineTypes.aggregatedList", + // "description": "Deletes an access config from an instance's network interface.", + // "httpMethod": "POST", + // "id": "compute.instances.deleteAccessConfig", // "parameterOrder": [ - // "project" + // "project", + // "zone", + // "instance", + // "accessConfig", + // "networkInterface" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "accessConfig": { + // "description": "The name of the access config to delete.", // "location": "query", + // "required": true, // "type": "string" // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", + // "instance": { + // "description": "The instance name for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "networkInterface": { + // "description": "The name of the network interface.", // "location": "query", + // "required": true, // "type": "string" // }, // "project": { @@ -36593,70 +36423,211 @@ func (c *MachineTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*Mach // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/aggregated/machineTypes", + // "path": "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig", // "response": { - // "$ref": "MachineTypeAggregatedList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *MachineTypesAggregatedListCall) Pages(ctx context.Context, f func(*MachineTypeAggregatedList) error) error { +// method id "compute.instances.detachDisk": + +type InstancesDetachDiskCall struct { + s *Service + project string + zone string + instance string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// DetachDisk: Detaches a disk from an instance. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/detachDisk +func (r *InstancesService) DetachDisk(project string, zone string, instance string, deviceName string) *InstancesDetachDiskCall { + c := &InstancesDetachDiskCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.zone = zone + c.instance = instance + c.urlParams_.Set("deviceName", deviceName) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstancesDetachDiskCall) Fields(s ...googleapi.Field) *InstancesDetachDiskCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstancesDetachDiskCall) Context(ctx context.Context) *InstancesDetachDiskCall { c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstancesDetachDiskCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstancesDetachDiskCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/detachDisk") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "zone": c.zone, + "instance": c.instance, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instances.detachDisk" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstancesDetachDiskCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() } - if x.NextPageToken == "" { - return nil + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, } - c.PageToken(x.NextPageToken) } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Detaches a disk from an instance.", + // "httpMethod": "POST", + // "id": "compute.instances.detachDisk", + // "parameterOrder": [ + // "project", + // "zone", + // "instance", + // "deviceName" + // ], + // "parameters": { + // "deviceName": { + // "description": "Disk device name to detach.", + // "location": "query", + // "required": true, + // "type": "string" + // }, + // "instance": { + // "description": "Instance name.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/zones/{zone}/instances/{instance}/detachDisk", + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + } -// method id "compute.machineTypes.get": +// method id "compute.instances.get": -type MachineTypesGetCall struct { +type InstancesGetCall struct { s *Service project string zone string - machineType string + instance string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns the specified machine type. Get a list of available -// machine types by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/machineTypes/get -func (r *MachineTypesService) Get(project string, zone string, machineType string) *MachineTypesGetCall { - c := &MachineTypesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified Instance resource. Get a list of available +// instances by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/get +func (r *InstancesService) Get(project string, zone string, instance string) *InstancesGetCall { + c := &InstancesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone - c.machineType = machineType + c.instance = instance return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *MachineTypesGetCall) Fields(s ...googleapi.Field) *MachineTypesGetCall { +func (c *InstancesGetCall) Fields(s ...googleapi.Field) *InstancesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -36666,7 +36637,7 @@ func (c *MachineTypesGetCall) Fields(s ...googleapi.Field) *MachineTypesGetCall // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *MachineTypesGetCall) IfNoneMatch(entityTag string) *MachineTypesGetCall { +func (c *InstancesGetCall) IfNoneMatch(entityTag string) *InstancesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -36674,21 +36645,21 @@ func (c *MachineTypesGetCall) IfNoneMatch(entityTag string) *MachineTypesGetCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *MachineTypesGetCall) Context(ctx context.Context) *MachineTypesGetCall { +func (c *InstancesGetCall) Context(ctx context.Context) *InstancesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *MachineTypesGetCall) Header() http.Header { +func (c *InstancesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *MachineTypesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -36699,26 +36670,26 @@ func (c *MachineTypesGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/machineTypes/{machineType}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "machineType": c.machineType, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.machineTypes.get" call. -// Exactly one of *MachineType or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *MachineType.ServerResponse.Header or (if a response was returned at +// Do executes the "compute.instances.get" call. +// Exactly one of *Instance or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Instance.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *MachineTypesGetCall) Do(opts ...googleapi.CallOption) (*MachineType, error) { +func (c *InstancesGetCall) Do(opts ...googleapi.CallOption) (*Instance, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -36737,7 +36708,7 @@ func (c *MachineTypesGetCall) Do(opts ...googleapi.CallOption) (*MachineType, er if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &MachineType{ + ret := &Instance{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -36749,17 +36720,17 @@ func (c *MachineTypesGetCall) Do(opts ...googleapi.CallOption) (*MachineType, er } return ret, nil // { - // "description": "Returns the specified machine type. Get a list of available machine types by making a list() request.", + // "description": "Returns the specified Instance resource. Get a list of available instances by making a list() request.", // "httpMethod": "GET", - // "id": "compute.machineTypes.get", + // "id": "compute.instances.get", // "parameterOrder": [ // "project", // "zone", - // "machineType" + // "instance" // ], // "parameters": { - // "machineType": { - // "description": "Name of the machine type to return.", + // "instance": { + // "description": "Name of the instance resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -36780,9 +36751,9 @@ func (c *MachineTypesGetCall) Do(opts ...googleapi.CallOption) (*MachineType, er // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/machineTypes/{machineType}", + // "path": "{project}/zones/{zone}/instances/{instance}", // "response": { - // "$ref": "MachineType" + // "$ref": "Instance" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -36793,100 +36764,52 @@ func (c *MachineTypesGetCall) Do(opts ...googleapi.CallOption) (*MachineType, er } -// method id "compute.machineTypes.list": +// method id "compute.instances.getSerialPortOutput": -type MachineTypesListCall struct { +type InstancesGetSerialPortOutputCall struct { s *Service project string zone string + instance string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of machine types available to the specified -// project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/machineTypes/list -func (r *MachineTypesService) List(project string, zone string) *MachineTypesListCall { - c := &MachineTypesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// GetSerialPortOutput: Returns the specified instance's serial port +// output. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/getSerialPortOutput +func (r *InstancesService) GetSerialPortOutput(project string, zone string, instance string) *InstancesGetSerialPortOutputCall { + c := &InstancesGetSerialPortOutputCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.zone = zone + c.instance = instance return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *MachineTypesListCall) Filter(filter string) *MachineTypesListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *MachineTypesListCall) MaxResults(maxResults int64) *MachineTypesListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *MachineTypesListCall) OrderBy(orderBy string) *MachineTypesListCall { - c.urlParams_.Set("orderBy", orderBy) +// Port sets the optional parameter "port": Specifies which COM or +// serial port to retrieve data from. +func (c *InstancesGetSerialPortOutputCall) Port(port int64) *InstancesGetSerialPortOutputCall { + c.urlParams_.Set("port", fmt.Sprint(port)) return c } -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *MachineTypesListCall) PageToken(pageToken string) *MachineTypesListCall { - c.urlParams_.Set("pageToken", pageToken) +// Start sets the optional parameter "start": Returns output starting +// from a specific byte position. Use this to page through output when +// the output is too large to return in a single request. For the +// initial request, leave this field unspecified. For subsequent calls, +// this field should be set to the next value returned in the previous +// call. +func (c *InstancesGetSerialPortOutputCall) Start(start int64) *InstancesGetSerialPortOutputCall { + c.urlParams_.Set("start", fmt.Sprint(start)) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *MachineTypesListCall) Fields(s ...googleapi.Field) *MachineTypesListCall { +func (c *InstancesGetSerialPortOutputCall) Fields(s ...googleapi.Field) *InstancesGetSerialPortOutputCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -36896,7 +36819,7 @@ func (c *MachineTypesListCall) Fields(s ...googleapi.Field) *MachineTypesListCal // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *MachineTypesListCall) IfNoneMatch(entityTag string) *MachineTypesListCall { +func (c *InstancesGetSerialPortOutputCall) IfNoneMatch(entityTag string) *InstancesGetSerialPortOutputCall { c.ifNoneMatch_ = entityTag return c } @@ -36904,21 +36827,21 @@ func (c *MachineTypesListCall) IfNoneMatch(entityTag string) *MachineTypesListCa // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *MachineTypesListCall) Context(ctx context.Context) *MachineTypesListCall { +func (c *InstancesGetSerialPortOutputCall) Context(ctx context.Context) *InstancesGetSerialPortOutputCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *MachineTypesListCall) Header() http.Header { +func (c *InstancesGetSerialPortOutputCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *MachineTypesListCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesGetSerialPortOutputCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -36929,25 +36852,26 @@ func (c *MachineTypesListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/machineTypes") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/serialPort") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.machineTypes.list" call. -// Exactly one of *MachineTypeList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *MachineTypeList.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.instances.getSerialPortOutput" call. +// Exactly one of *SerialPortOutput or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *SerialPortOutput.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *MachineTypesListCall) Do(opts ...googleapi.CallOption) (*MachineTypeList, error) { +func (c *InstancesGetSerialPortOutputCall) Do(opts ...googleapi.CallOption) (*SerialPortOutput, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -36966,7 +36890,7 @@ func (c *MachineTypesListCall) Do(opts ...googleapi.CallOption) (*MachineTypeLis if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &MachineTypeList{ + ret := &SerialPortOutput{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -36978,37 +36902,31 @@ func (c *MachineTypesListCall) Do(opts ...googleapi.CallOption) (*MachineTypeLis } return ret, nil // { - // "description": "Retrieves a list of machine types available to the specified project.", + // "description": "Returns the specified instance's serial port output.", // "httpMethod": "GET", - // "id": "compute.machineTypes.list", + // "id": "compute.instances.getSerialPortOutput", // "parameterOrder": [ // "project", - // "zone" + // "zone", + // "instance" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", + // "instance": { + // "description": "Name of the instance scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", + // "port": { + // "default": "1", + // "description": "Specifies which COM or serial port to retrieve data from.", + // "format": "int32", // "location": "query", - // "minimum": "0", + // "maximum": "4", + // "minimum": "1", // "type": "integer" // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -37016,6 +36934,12 @@ func (c *MachineTypesListCall) Do(opts ...googleapi.CallOption) (*MachineTypeLis // "required": true, // "type": "string" // }, + // "start": { + // "description": "Returns output starting from a specific byte position. Use this to page through output when the output is too large to return in a single request. For the initial request, leave this field unspecified. For subsequent calls, this field should be set to the next value returned in the previous call.", + // "format": "int64", + // "location": "query", + // "type": "string" + // }, // "zone": { // "description": "The name of the zone for this request.", // "location": "path", @@ -37024,9 +36948,9 @@ func (c *MachineTypesListCall) Do(opts ...googleapi.CallOption) (*MachineTypeLis // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/machineTypes", + // "path": "{project}/zones/{zone}/instances/{instance}/serialPort", // "response": { - // "$ref": "MachineTypeList" + // "$ref": "SerialPortOutput" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -37037,51 +36961,33 @@ func (c *MachineTypesListCall) Do(opts ...googleapi.CallOption) (*MachineTypeLis } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *MachineTypesListCall) Pages(ctx context.Context, f func(*MachineTypeList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.networks.delete": +// method id "compute.instances.insert": -type NetworksDeleteCall struct { +type InstancesInsertCall struct { s *Service project string - network string + zone string + instance *Instance urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Delete: Deletes the specified network. -// For details, see https://cloud.google.com/compute/docs/reference/latest/networks/delete -func (r *NetworksService) Delete(project string, network string) *NetworksDeleteCall { - c := &NetworksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates an instance resource in the specified project using +// the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/insert +func (r *InstancesService) Insert(project string, zone string, instance *Instance) *InstancesInsertCall { + c := &InstancesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.network = network + c.zone = zone + c.instance = instance return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *NetworksDeleteCall) Fields(s ...googleapi.Field) *NetworksDeleteCall { +func (c *InstancesInsertCall) Fields(s ...googleapi.Field) *InstancesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -37089,47 +36995,52 @@ func (c *NetworksDeleteCall) Fields(s ...googleapi.Field) *NetworksDeleteCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *NetworksDeleteCall) Context(ctx context.Context) *NetworksDeleteCall { +func (c *InstancesInsertCall) Context(ctx context.Context) *InstancesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *NetworksDeleteCall) Header() http.Header { +func (c *InstancesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *NetworksDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instance) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "network": c.network, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.networks.delete" call. +// Do executes the "compute.instances.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *NetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -37160,32 +37071,35 @@ func (c *NetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error } return ret, nil // { - // "description": "Deletes the specified network.", - // "httpMethod": "DELETE", - // "id": "compute.networks.delete", + // "description": "Creates an instance resource in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.instances.insert", // "parameterOrder": [ // "project", - // "network" + // "zone" // ], // "parameters": { - // "network": { - // "description": "Name of the network to delete.", + // "project": { + // "description": "Project ID for this request.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" // }, - // "project": { - // "description": "Project ID for this request.", + // "zone": { + // "description": "The name of the zone for this request.", // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/networks/{network}", - // "response": { - // "$ref": "Operation" + // "path": "{project}/zones/{zone}/instances", + // "request": { + // "$ref": "Instance" + // }, + // "response": { + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -37195,32 +37109,99 @@ func (c *NetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error } -// method id "compute.networks.get": +// method id "compute.instances.list": -type NetworksGetCall struct { +type InstancesListCall struct { s *Service project string - network string + zone string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns the specified network. Get a list of available networks -// by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/networks/get -func (r *NetworksService) Get(project string, network string) *NetworksGetCall { - c := &NetworksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of instances contained within the specified +// zone. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/list +func (r *InstancesService) List(project string, zone string) *InstancesListCall { + c := &InstancesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.network = network + c.zone = zone + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *InstancesListCall) Filter(filter string) *InstancesListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *InstancesListCall) MaxResults(maxResults int64) *InstancesListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *InstancesListCall) OrderBy(orderBy string) *InstancesListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *InstancesListCall) PageToken(pageToken string) *InstancesListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *NetworksGetCall) Fields(s ...googleapi.Field) *NetworksGetCall { +func (c *InstancesListCall) Fields(s ...googleapi.Field) *InstancesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -37230,7 +37211,7 @@ func (c *NetworksGetCall) Fields(s ...googleapi.Field) *NetworksGetCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *NetworksGetCall) IfNoneMatch(entityTag string) *NetworksGetCall { +func (c *InstancesListCall) IfNoneMatch(entityTag string) *InstancesListCall { c.ifNoneMatch_ = entityTag return c } @@ -37238,21 +37219,21 @@ func (c *NetworksGetCall) IfNoneMatch(entityTag string) *NetworksGetCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *NetworksGetCall) Context(ctx context.Context) *NetworksGetCall { +func (c *InstancesListCall) Context(ctx context.Context) *InstancesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *NetworksGetCall) Header() http.Header { +func (c *InstancesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *NetworksGetCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -37263,25 +37244,25 @@ func (c *NetworksGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "network": c.network, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.networks.get" call. -// Exactly one of *Network or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Network.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *NetworksGetCall) Do(opts ...googleapi.CallOption) (*Network, error) { +// Do executes the "compute.instances.list" call. +// Exactly one of *InstanceList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *InstanceList.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstancesListCall) Do(opts ...googleapi.CallOption) (*InstanceList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -37300,7 +37281,7 @@ func (c *NetworksGetCall) Do(opts ...googleapi.CallOption) (*Network, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Network{ + ret := &InstanceList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -37312,19 +37293,35 @@ func (c *NetworksGetCall) Do(opts ...googleapi.CallOption) (*Network, error) { } return ret, nil // { - // "description": "Returns the specified network. Get a list of available networks by making a list() request.", + // "description": "Retrieves the list of instances contained within the specified zone.", // "httpMethod": "GET", - // "id": "compute.networks.get", + // "id": "compute.instances.list", // "parameterOrder": [ // "project", - // "network" + // "zone" // ], // "parameters": { - // "network": { - // "description": "Name of the network to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", // "type": "string" // }, // "project": { @@ -37333,11 +37330,18 @@ func (c *NetworksGetCall) Do(opts ...googleapi.CallOption) (*Network, error) { // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/networks/{network}", + // "path": "{project}/zones/{zone}/instances", // "response": { - // "$ref": "Network" + // "$ref": "InstanceList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -37348,31 +37352,54 @@ func (c *NetworksGetCall) Do(opts ...googleapi.CallOption) (*Network, error) { } -// method id "compute.networks.insert": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *InstancesListCall) Pages(ctx context.Context, f func(*InstanceList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type NetworksInsertCall struct { +// method id "compute.instances.reset": + +type InstancesResetCall struct { s *Service project string - network *Network + zone string + instance string urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Insert: Creates a network in the specified project using the data -// included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/networks/insert -func (r *NetworksService) Insert(project string, network *Network) *NetworksInsertCall { - c := &NetworksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Reset: Performs a reset on the instance. For more information, see +// Resetting an instance. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/reset +func (r *InstancesService) Reset(project string, zone string, instance string) *InstancesResetCall { + c := &InstancesResetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.network = network + c.zone = zone + c.instance = instance return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *NetworksInsertCall) Fields(s ...googleapi.Field) *NetworksInsertCall { +func (c *InstancesResetCall) Fields(s ...googleapi.Field) *InstancesResetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -37380,51 +37407,48 @@ func (c *NetworksInsertCall) Fields(s ...googleapi.Field) *NetworksInsertCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *NetworksInsertCall) Context(ctx context.Context) *NetworksInsertCall { +func (c *InstancesResetCall) Context(ctx context.Context) *InstancesResetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *NetworksInsertCall) Header() http.Header { +func (c *InstancesResetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *NetworksInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesResetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.network) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/reset") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.networks.insert" call. +// Do executes the "compute.instances.reset" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *NetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesResetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -37455,25 +37479,38 @@ func (c *NetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error } return ret, nil // { - // "description": "Creates a network in the specified project using the data included in the request.", + // "description": "Performs a reset on the instance. For more information, see Resetting an instance.", // "httpMethod": "POST", - // "id": "compute.networks.insert", + // "id": "compute.instances.reset", // "parameterOrder": [ - // "project" + // "project", + // "zone", + // "instance" // ], // "parameters": { + // "instance": { + // "description": "Name of the instance scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/networks", - // "request": { - // "$ref": "Network" - // }, + // "path": "{project}/zones/{zone}/instances/{instance}/reset", // "response": { // "$ref": "Operation" // }, @@ -37485,158 +37522,84 @@ func (c *NetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error } -// method id "compute.networks.list": +// method id "compute.instances.setDiskAutoDelete": -type NetworksListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstancesSetDiskAutoDeleteCall struct { + s *Service + project string + zone string + instance string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// List: Retrieves the list of networks available to the specified -// project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/networks/list -func (r *NetworksService) List(project string) *NetworksListCall { - c := &NetworksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetDiskAutoDelete: Sets the auto-delete flag for a disk attached to +// an instance. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/setDiskAutoDelete +func (r *InstancesService) SetDiskAutoDelete(project string, zone string, instance string, autoDelete bool, deviceName string) *InstancesSetDiskAutoDeleteCall { + c := &InstancesSetDiskAutoDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *NetworksListCall) Filter(filter string) *NetworksListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *NetworksListCall) MaxResults(maxResults int64) *NetworksListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *NetworksListCall) OrderBy(orderBy string) *NetworksListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *NetworksListCall) PageToken(pageToken string) *NetworksListCall { - c.urlParams_.Set("pageToken", pageToken) + c.zone = zone + c.instance = instance + c.urlParams_.Set("autoDelete", fmt.Sprint(autoDelete)) + c.urlParams_.Set("deviceName", deviceName) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *NetworksListCall) Fields(s ...googleapi.Field) *NetworksListCall { +func (c *InstancesSetDiskAutoDeleteCall) Fields(s ...googleapi.Field) *InstancesSetDiskAutoDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *NetworksListCall) IfNoneMatch(entityTag string) *NetworksListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *NetworksListCall) Context(ctx context.Context) *NetworksListCall { +func (c *InstancesSetDiskAutoDeleteCall) Context(ctx context.Context) *InstancesSetDiskAutoDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *NetworksListCall) Header() http.Header { +func (c *InstancesSetDiskAutoDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *NetworksListCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesSetDiskAutoDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.networks.list" call. -// Exactly one of *NetworkList or error will be non-nil. Any non-2xx +// Do executes the "compute.instances.setDiskAutoDelete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *NetworkList.ServerResponse.Header or (if a response was returned at +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error) { +func (c *InstancesSetDiskAutoDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -37655,7 +37618,7 @@ func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &NetworkList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -37667,34 +37630,35 @@ func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error } return ret, nil // { - // "description": "Retrieves the list of networks available to the specified project.", - // "httpMethod": "GET", - // "id": "compute.networks.list", + // "description": "Sets the auto-delete flag for a disk attached to an instance.", + // "httpMethod": "POST", + // "id": "compute.instances.setDiskAutoDelete", // "parameterOrder": [ - // "project" + // "project", + // "zone", + // "instance", + // "autoDelete", + // "deviceName" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", + // "autoDelete": { + // "description": "Whether to auto-delete the disk when the instance is deleted.", // "location": "query", - // "minimum": "0", - // "type": "integer" + // "required": true, + // "type": "boolean" // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "deviceName": { + // "description": "The device name of the disk to modify.", // "location": "query", + // "pattern": "\\w[\\w.-]{0,254}", + // "required": true, // "type": "string" // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "instance": { + // "description": "The instance name.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { @@ -37703,66 +37667,55 @@ func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/networks", + // "path": "{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete", // "response": { - // "$ref": "NetworkList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *NetworksListCall) Pages(ctx context.Context, f func(*NetworkList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.networks.switchToCustomMode": +// method id "compute.instances.setLabels": -type NetworksSwitchToCustomModeCall struct { - s *Service - project string - network string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstancesSetLabelsCall struct { + s *Service + project string + zone string + instance string + instancessetlabelsrequest *InstancesSetLabelsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SwitchToCustomMode: Switches the network mode from auto subnet mode -// to custom subnet mode. -func (r *NetworksService) SwitchToCustomMode(project string, network string) *NetworksSwitchToCustomModeCall { - c := &NetworksSwitchToCustomModeCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetLabels: Sets labels on an instance. To learn more about labels, +// read the Labeling Resources documentation. +func (r *InstancesService) SetLabels(project string, zone string, instance string, instancessetlabelsrequest *InstancesSetLabelsRequest) *InstancesSetLabelsCall { + c := &InstancesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.network = network + c.zone = zone + c.instance = instance + c.instancessetlabelsrequest = instancessetlabelsrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *NetworksSwitchToCustomModeCall) Fields(s ...googleapi.Field) *NetworksSwitchToCustomModeCall { +func (c *InstancesSetLabelsCall) Fields(s ...googleapi.Field) *InstancesSetLabelsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -37770,47 +37723,53 @@ func (c *NetworksSwitchToCustomModeCall) Fields(s ...googleapi.Field) *NetworksS // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *NetworksSwitchToCustomModeCall) Context(ctx context.Context) *NetworksSwitchToCustomModeCall { +func (c *InstancesSetLabelsCall) Context(ctx context.Context) *InstancesSetLabelsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *NetworksSwitchToCustomModeCall) Header() http.Header { +func (c *InstancesSetLabelsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *NetworksSwitchToCustomModeCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesSetLabelsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetlabelsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}/switchToCustomMode") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setLabels") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "network": c.network, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.networks.switchToCustomMode" call. +// Do executes the "compute.instances.setLabels" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *NetworksSwitchToCustomModeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -37841,16 +37800,17 @@ func (c *NetworksSwitchToCustomModeCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Switches the network mode from auto subnet mode to custom subnet mode.", + // "description": "Sets labels on an instance. To learn more about labels, read the Labeling Resources documentation.", // "httpMethod": "POST", - // "id": "compute.networks.switchToCustomMode", + // "id": "compute.instances.setLabels", // "parameterOrder": [ // "project", - // "network" + // "zone", + // "instance" // ], // "parameters": { - // "network": { - // "description": "Name of the network to be updated.", + // "instance": { + // "description": "Name of the instance scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -37862,9 +37822,19 @@ func (c *NetworksSwitchToCustomModeCall) Do(opts ...googleapi.CallOption) (*Oper // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/networks/{network}/switchToCustomMode", + // "path": "{project}/zones/{zone}/instances/{instance}/setLabels", + // "request": { + // "$ref": "InstancesSetLabelsRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -37876,89 +37846,88 @@ func (c *NetworksSwitchToCustomModeCall) Do(opts ...googleapi.CallOption) (*Oper } -// method id "compute.projects.get": +// method id "compute.instances.setMachineResources": -type ProjectsGetCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstancesSetMachineResourcesCall struct { + s *Service + project string + zone string + instance string + instancessetmachineresourcesrequest *InstancesSetMachineResourcesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified Project resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/projects/get -func (r *ProjectsService) Get(project string) *ProjectsGetCall { - c := &ProjectsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetMachineResources: Changes the number and/or type of accelerator +// for a stopped instance to the values specified in the request. +func (r *InstancesService) SetMachineResources(project string, zone string, instance string, instancessetmachineresourcesrequest *InstancesSetMachineResourcesRequest) *InstancesSetMachineResourcesCall { + c := &InstancesSetMachineResourcesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.zone = zone + c.instance = instance + c.instancessetmachineresourcesrequest = instancessetmachineresourcesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsGetCall) Fields(s ...googleapi.Field) *ProjectsGetCall { +func (c *InstancesSetMachineResourcesCall) Fields(s ...googleapi.Field) *InstancesSetMachineResourcesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *ProjectsGetCall) IfNoneMatch(entityTag string) *ProjectsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsGetCall) Context(ctx context.Context) *ProjectsGetCall { +func (c *InstancesSetMachineResourcesCall) Context(ctx context.Context) *InstancesSetMachineResourcesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsGetCall) Header() http.Header { +func (c *InstancesSetMachineResourcesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsGetCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesSetMachineResourcesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetmachineresourcesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setMachineResources") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.projects.get" call. -// Exactly one of *Project or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Project.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *ProjectsGetCall) Do(opts ...googleapi.CallOption) (*Project, error) { +// Do executes the "compute.instances.setMachineResources" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstancesSetMachineResourcesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -37977,7 +37946,7 @@ func (c *ProjectsGetCall) Do(opts ...googleapi.CallOption) (*Project, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Project{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -37989,57 +37958,80 @@ func (c *ProjectsGetCall) Do(opts ...googleapi.CallOption) (*Project, error) { } return ret, nil // { - // "description": "Returns the specified Project resource.", - // "httpMethod": "GET", - // "id": "compute.projects.get", + // "description": "Changes the number and/or type of accelerator for a stopped instance to the values specified in the request.", + // "httpMethod": "POST", + // "id": "compute.instances.setMachineResources", // "parameterOrder": [ - // "project" + // "project", + // "zone", + // "instance" // ], // "parameters": { + // "instance": { + // "description": "Name of the instance scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}", + // "path": "{project}/zones/{zone}/instances/{instance}/setMachineResources", + // "request": { + // "$ref": "InstancesSetMachineResourcesRequest" + // }, // "response": { - // "$ref": "Project" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.projects.moveDisk": +// method id "compute.instances.setMachineType": -type ProjectsMoveDiskCall struct { - s *Service - project string - diskmoverequest *DiskMoveRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstancesSetMachineTypeCall struct { + s *Service + project string + zone string + instance string + instancessetmachinetyperequest *InstancesSetMachineTypeRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// MoveDisk: Moves a persistent disk from one zone to another. -func (r *ProjectsService) MoveDisk(project string, diskmoverequest *DiskMoveRequest) *ProjectsMoveDiskCall { - c := &ProjectsMoveDiskCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetMachineType: Changes the machine type for a stopped instance to +// the machine type specified in the request. +func (r *InstancesService) SetMachineType(project string, zone string, instance string, instancessetmachinetyperequest *InstancesSetMachineTypeRequest) *InstancesSetMachineTypeCall { + c := &InstancesSetMachineTypeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.diskmoverequest = diskmoverequest + c.zone = zone + c.instance = instance + c.instancessetmachinetyperequest = instancessetmachinetyperequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsMoveDiskCall) Fields(s ...googleapi.Field) *ProjectsMoveDiskCall { +func (c *InstancesSetMachineTypeCall) Fields(s ...googleapi.Field) *InstancesSetMachineTypeCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -38047,51 +38039,53 @@ func (c *ProjectsMoveDiskCall) Fields(s ...googleapi.Field) *ProjectsMoveDiskCal // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsMoveDiskCall) Context(ctx context.Context) *ProjectsMoveDiskCall { +func (c *InstancesSetMachineTypeCall) Context(ctx context.Context) *InstancesSetMachineTypeCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsMoveDiskCall) Header() http.Header { +func (c *InstancesSetMachineTypeCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsMoveDiskCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesSetMachineTypeCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.diskmoverequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetmachinetyperequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/moveDisk") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setMachineType") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.projects.moveDisk" call. +// Do executes the "compute.instances.setMachineType" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsMoveDiskCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesSetMachineTypeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -38122,24 +38116,40 @@ func (c *ProjectsMoveDiskCall) Do(opts ...googleapi.CallOption) (*Operation, err } return ret, nil // { - // "description": "Moves a persistent disk from one zone to another.", + // "description": "Changes the machine type for a stopped instance to the machine type specified in the request.", // "httpMethod": "POST", - // "id": "compute.projects.moveDisk", + // "id": "compute.instances.setMachineType", // "parameterOrder": [ - // "project" + // "project", + // "zone", + // "instance" // ], // "parameters": { + // "instance": { + // "description": "Name of the instance scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/moveDisk", + // "path": "{project}/zones/{zone}/instances/{instance}/setMachineType", // "request": { - // "$ref": "DiskMoveRequest" + // "$ref": "InstancesSetMachineTypeRequest" // }, // "response": { // "$ref": "Operation" @@ -38152,30 +38162,35 @@ func (c *ProjectsMoveDiskCall) Do(opts ...googleapi.CallOption) (*Operation, err } -// method id "compute.projects.moveInstance": +// method id "compute.instances.setMetadata": -type ProjectsMoveInstanceCall struct { - s *Service - project string - instancemoverequest *InstanceMoveRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstancesSetMetadataCall struct { + s *Service + project string + zone string + instance string + metadata *Metadata + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// MoveInstance: Moves an instance and its attached persistent disks -// from one zone to another. -func (r *ProjectsService) MoveInstance(project string, instancemoverequest *InstanceMoveRequest) *ProjectsMoveInstanceCall { - c := &ProjectsMoveInstanceCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetMetadata: Sets metadata for the specified instance to the data +// included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/setMetadata +func (r *InstancesService) SetMetadata(project string, zone string, instance string, metadata *Metadata) *InstancesSetMetadataCall { + c := &InstancesSetMetadataCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.instancemoverequest = instancemoverequest + c.zone = zone + c.instance = instance + c.metadata = metadata return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsMoveInstanceCall) Fields(s ...googleapi.Field) *ProjectsMoveInstanceCall { +func (c *InstancesSetMetadataCall) Fields(s ...googleapi.Field) *InstancesSetMetadataCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -38183,51 +38198,53 @@ func (c *ProjectsMoveInstanceCall) Fields(s ...googleapi.Field) *ProjectsMoveIns // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsMoveInstanceCall) Context(ctx context.Context) *ProjectsMoveInstanceCall { +func (c *InstancesSetMetadataCall) Context(ctx context.Context) *InstancesSetMetadataCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsMoveInstanceCall) Header() http.Header { +func (c *InstancesSetMetadataCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsMoveInstanceCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesSetMetadataCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancemoverequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/moveInstance") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setMetadata") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.projects.moveInstance" call. +// Do executes the "compute.instances.setMetadata" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsMoveInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesSetMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -38258,24 +38275,40 @@ func (c *ProjectsMoveInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Moves an instance and its attached persistent disks from one zone to another.", + // "description": "Sets metadata for the specified instance to the data included in the request.", // "httpMethod": "POST", - // "id": "compute.projects.moveInstance", + // "id": "compute.instances.setMetadata", // "parameterOrder": [ - // "project" + // "project", + // "zone", + // "instance" // ], // "parameters": { + // "instance": { + // "description": "Name of the instance scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/moveInstance", + // "path": "{project}/zones/{zone}/instances/{instance}/setMetadata", // "request": { - // "$ref": "InstanceMoveRequest" + // "$ref": "Metadata" // }, // "response": { // "$ref": "Operation" @@ -38288,31 +38321,34 @@ func (c *ProjectsMoveInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.projects.setCommonInstanceMetadata": +// method id "compute.instances.setScheduling": -type ProjectsSetCommonInstanceMetadataCall struct { +type InstancesSetSchedulingCall struct { s *Service project string - metadata *Metadata + zone string + instance string + scheduling *Scheduling urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// SetCommonInstanceMetadata: Sets metadata common to all instances -// within the specified project using the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/projects/setCommonInstanceMetadata -func (r *ProjectsService) SetCommonInstanceMetadata(project string, metadata *Metadata) *ProjectsSetCommonInstanceMetadataCall { - c := &ProjectsSetCommonInstanceMetadataCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetScheduling: Sets an instance's scheduling options. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/setScheduling +func (r *InstancesService) SetScheduling(project string, zone string, instance string, scheduling *Scheduling) *InstancesSetSchedulingCall { + c := &InstancesSetSchedulingCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.metadata = metadata + c.zone = zone + c.instance = instance + c.scheduling = scheduling return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsSetCommonInstanceMetadataCall) Fields(s ...googleapi.Field) *ProjectsSetCommonInstanceMetadataCall { +func (c *InstancesSetSchedulingCall) Fields(s ...googleapi.Field) *InstancesSetSchedulingCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -38320,51 +38356,53 @@ func (c *ProjectsSetCommonInstanceMetadataCall) Fields(s ...googleapi.Field) *Pr // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsSetCommonInstanceMetadataCall) Context(ctx context.Context) *ProjectsSetCommonInstanceMetadataCall { +func (c *InstancesSetSchedulingCall) Context(ctx context.Context) *InstancesSetSchedulingCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsSetCommonInstanceMetadataCall) Header() http.Header { +func (c *InstancesSetSchedulingCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsSetCommonInstanceMetadataCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesSetSchedulingCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.scheduling) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/setCommonInstanceMetadata") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setScheduling") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.projects.setCommonInstanceMetadata" call. +// Do executes the "compute.instances.setScheduling" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsSetCommonInstanceMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesSetSchedulingCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -38395,24 +38433,40 @@ func (c *ProjectsSetCommonInstanceMetadataCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Sets metadata common to all instances within the specified project using the data included in the request.", + // "description": "Sets an instance's scheduling options.", // "httpMethod": "POST", - // "id": "compute.projects.setCommonInstanceMetadata", + // "id": "compute.instances.setScheduling", // "parameterOrder": [ - // "project" + // "project", + // "zone", + // "instance" // ], // "parameters": { + // "instance": { + // "description": "Instance name.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/setCommonInstanceMetadata", + // "path": "{project}/zones/{zone}/instances/{instance}/setScheduling", // "request": { - // "$ref": "Metadata" + // "$ref": "Scheduling" // }, // "response": { // "$ref": "Operation" @@ -38425,33 +38479,35 @@ func (c *ProjectsSetCommonInstanceMetadataCall) Do(opts ...googleapi.CallOption) } -// method id "compute.projects.setUsageExportBucket": +// method id "compute.instances.setServiceAccount": -type ProjectsSetUsageExportBucketCall struct { - s *Service - project string - usageexportlocation *UsageExportLocation - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstancesSetServiceAccountCall struct { + s *Service + project string + zone string + instance string + instancessetserviceaccountrequest *InstancesSetServiceAccountRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetUsageExportBucket: Enables the usage export feature and sets the -// usage export bucket where reports are stored. If you provide an empty -// request body using this method, the usage export feature will be -// disabled. -// For details, see https://cloud.google.com/compute/docs/reference/latest/projects/setUsageExportBucket -func (r *ProjectsService) SetUsageExportBucket(project string, usageexportlocation *UsageExportLocation) *ProjectsSetUsageExportBucketCall { - c := &ProjectsSetUsageExportBucketCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetServiceAccount: Sets the service account on the instance. For more +// information, read Changing the service account and access scopes for +// an instance. +func (r *InstancesService) SetServiceAccount(project string, zone string, instance string, instancessetserviceaccountrequest *InstancesSetServiceAccountRequest) *InstancesSetServiceAccountCall { + c := &InstancesSetServiceAccountCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.usageexportlocation = usageexportlocation + c.zone = zone + c.instance = instance + c.instancessetserviceaccountrequest = instancessetserviceaccountrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsSetUsageExportBucketCall) Fields(s ...googleapi.Field) *ProjectsSetUsageExportBucketCall { +func (c *InstancesSetServiceAccountCall) Fields(s ...googleapi.Field) *InstancesSetServiceAccountCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -38459,51 +38515,53 @@ func (c *ProjectsSetUsageExportBucketCall) Fields(s ...googleapi.Field) *Project // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsSetUsageExportBucketCall) Context(ctx context.Context) *ProjectsSetUsageExportBucketCall { +func (c *InstancesSetServiceAccountCall) Context(ctx context.Context) *InstancesSetServiceAccountCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsSetUsageExportBucketCall) Header() http.Header { +func (c *InstancesSetServiceAccountCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsSetUsageExportBucketCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesSetServiceAccountCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.usageexportlocation) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetserviceaccountrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/setUsageExportBucket") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setServiceAccount") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.projects.setUsageExportBucket" call. +// Do executes the "compute.instances.setServiceAccount" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsSetUsageExportBucketCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesSetServiceAccountCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -38534,64 +38592,81 @@ func (c *ProjectsSetUsageExportBucketCall) Do(opts ...googleapi.CallOption) (*Op } return ret, nil // { - // "description": "Enables the usage export feature and sets the usage export bucket where reports are stored. If you provide an empty request body using this method, the usage export feature will be disabled.", + // "description": "Sets the service account on the instance. For more information, read Changing the service account and access scopes for an instance.", // "httpMethod": "POST", - // "id": "compute.projects.setUsageExportBucket", + // "id": "compute.instances.setServiceAccount", // "parameterOrder": [ - // "project" + // "project", + // "zone", + // "instance" // ], // "parameters": { + // "instance": { + // "description": "Name of the instance resource to start.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/setUsageExportBucket", + // "path": "{project}/zones/{zone}/instances/{instance}/setServiceAccount", // "request": { - // "$ref": "UsageExportLocation" + // "$ref": "InstancesSetServiceAccountRequest" // }, // "response": { // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/devstorage.full_control", - // "https://www.googleapis.com/auth/devstorage.read_only", - // "https://www.googleapis.com/auth/devstorage.read_write" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.regionAutoscalers.delete": +// method id "compute.instances.setTags": -type RegionAutoscalersDeleteCall struct { +type InstancesSetTagsCall struct { s *Service project string - region string - autoscaler string + zone string + instance string + tags *Tags urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Delete: Deletes the specified autoscaler. -func (r *RegionAutoscalersService) Delete(project string, region string, autoscaler string) *RegionAutoscalersDeleteCall { - c := &RegionAutoscalersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetTags: Sets tags for the specified instance to the data included in +// the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/setTags +func (r *InstancesService) SetTags(project string, zone string, instance string, tags *Tags) *InstancesSetTagsCall { + c := &InstancesSetTagsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.autoscaler = autoscaler + c.zone = zone + c.instance = instance + c.tags = tags return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionAutoscalersDeleteCall) Fields(s ...googleapi.Field) *RegionAutoscalersDeleteCall { +func (c *InstancesSetTagsCall) Fields(s ...googleapi.Field) *InstancesSetTagsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -38599,48 +38674,53 @@ func (c *RegionAutoscalersDeleteCall) Fields(s ...googleapi.Field) *RegionAutosc // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionAutoscalersDeleteCall) Context(ctx context.Context) *RegionAutoscalersDeleteCall { +func (c *InstancesSetTagsCall) Context(ctx context.Context) *InstancesSetTagsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionAutoscalersDeleteCall) Header() http.Header { +func (c *InstancesSetTagsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionAutoscalersDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesSetTagsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.tags) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers/{autoscaler}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setTags") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "autoscaler": c.autoscaler, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionAutoscalers.delete" call. +// Do executes the "compute.instances.setTags" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionAutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesSetTagsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -38671,17 +38751,17 @@ func (c *RegionAutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Deletes the specified autoscaler.", - // "httpMethod": "DELETE", - // "id": "compute.regionAutoscalers.delete", + // "description": "Sets tags for the specified instance to the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.instances.setTags", // "parameterOrder": [ // "project", - // "region", - // "autoscaler" + // "zone", + // "instance" // ], // "parameters": { - // "autoscaler": { - // "description": "Name of the autoscaler to delete.", + // "instance": { + // "description": "Name of the instance scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -38694,15 +38774,18 @@ func (c *RegionAutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operati // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", + // "zone": { + // "description": "The name of the zone for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/autoscalers/{autoscaler}", + // "path": "{project}/zones/{zone}/instances/{instance}/setTags", + // "request": { + // "$ref": "Tags" + // }, // "response": { // "$ref": "Operation" // }, @@ -38714,94 +38797,83 @@ func (c *RegionAutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operati } -// method id "compute.regionAutoscalers.get": +// method id "compute.instances.start": -type RegionAutoscalersGetCall struct { - s *Service - project string - region string - autoscaler string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type InstancesStartCall struct { + s *Service + project string + zone string + instance string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified autoscaler. -func (r *RegionAutoscalersService) Get(project string, region string, autoscaler string) *RegionAutoscalersGetCall { - c := &RegionAutoscalersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Start: Starts an instance that was stopped using the using the +// instances().stop method. For more information, see Restart an +// instance. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/start +func (r *InstancesService) Start(project string, zone string, instance string) *InstancesStartCall { + c := &InstancesStartCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.autoscaler = autoscaler + c.zone = zone + c.instance = instance return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionAutoscalersGetCall) Fields(s ...googleapi.Field) *RegionAutoscalersGetCall { +func (c *InstancesStartCall) Fields(s ...googleapi.Field) *InstancesStartCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RegionAutoscalersGetCall) IfNoneMatch(entityTag string) *RegionAutoscalersGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionAutoscalersGetCall) Context(ctx context.Context) *RegionAutoscalersGetCall { +func (c *InstancesStartCall) Context(ctx context.Context) *InstancesStartCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionAutoscalersGetCall) Header() http.Header { +func (c *InstancesStartCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionAutoscalersGetCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesStartCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers/{autoscaler}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/start") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "autoscaler": c.autoscaler, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionAutoscalers.get" call. -// Exactly one of *Autoscaler or error will be non-nil. Any non-2xx +// Do executes the "compute.instances.start" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Autoscaler.ServerResponse.Header or (if a response was returned at +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionAutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler, error) { +func (c *InstancesStartCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -38820,7 +38892,7 @@ func (c *RegionAutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Autoscaler{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -38832,17 +38904,17 @@ func (c *RegionAutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler } return ret, nil // { - // "description": "Returns the specified autoscaler.", - // "httpMethod": "GET", - // "id": "compute.regionAutoscalers.get", + // "description": "Starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.", + // "httpMethod": "POST", + // "id": "compute.instances.start", // "parameterOrder": [ // "project", - // "region", - // "autoscaler" + // "zone", + // "instance" // ], // "parameters": { - // "autoscaler": { - // "description": "Name of the autoscaler to return.", + // "instance": { + // "description": "Name of the instance resource to start.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -38855,53 +38927,55 @@ func (c *RegionAutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", + // "zone": { + // "description": "The name of the zone for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/autoscalers/{autoscaler}", + // "path": "{project}/zones/{zone}/instances/{instance}/start", // "response": { - // "$ref": "Autoscaler" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.regionAutoscalers.insert": +// method id "compute.instances.startWithEncryptionKey": -type RegionAutoscalersInsertCall struct { - s *Service - project string - region string - autoscaler *Autoscaler - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type InstancesStartWithEncryptionKeyCall struct { + s *Service + project string + zone string + instance string + instancesstartwithencryptionkeyrequest *InstancesStartWithEncryptionKeyRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates an autoscaler in the specified project using the data -// included in the request. -func (r *RegionAutoscalersService) Insert(project string, region string, autoscaler *Autoscaler) *RegionAutoscalersInsertCall { - c := &RegionAutoscalersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// StartWithEncryptionKey: Starts an instance that was stopped using the +// using the instances().stop method. For more information, see Restart +// an instance. +func (r *InstancesService) StartWithEncryptionKey(project string, zone string, instance string, instancesstartwithencryptionkeyrequest *InstancesStartWithEncryptionKeyRequest) *InstancesStartWithEncryptionKeyCall { + c := &InstancesStartWithEncryptionKeyCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.autoscaler = autoscaler + c.zone = zone + c.instance = instance + c.instancesstartwithencryptionkeyrequest = instancesstartwithencryptionkeyrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionAutoscalersInsertCall) Fields(s ...googleapi.Field) *RegionAutoscalersInsertCall { +func (c *InstancesStartWithEncryptionKeyCall) Fields(s ...googleapi.Field) *InstancesStartWithEncryptionKeyCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -38909,52 +38983,53 @@ func (c *RegionAutoscalersInsertCall) Fields(s ...googleapi.Field) *RegionAutosc // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionAutoscalersInsertCall) Context(ctx context.Context) *RegionAutoscalersInsertCall { +func (c *InstancesStartWithEncryptionKeyCall) Context(ctx context.Context) *InstancesStartWithEncryptionKeyCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionAutoscalersInsertCall) Header() http.Header { +func (c *InstancesStartWithEncryptionKeyCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionAutoscalersInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *InstancesStartWithEncryptionKeyCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesstartwithencryptionkeyrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, + "project": c.project, + "zone": c.zone, + "instance": c.instance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionAutoscalers.insert" call. +// Do executes the "compute.instances.startWithEncryptionKey" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionAutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *InstancesStartWithEncryptionKeyCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -38985,14 +39060,22 @@ func (c *RegionAutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Creates an autoscaler in the specified project using the data included in the request.", + // "description": "Starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.", // "httpMethod": "POST", - // "id": "compute.regionAutoscalers.insert", + // "id": "compute.instances.startWithEncryptionKey", // "parameterOrder": [ // "project", - // "region" + // "zone", + // "instance" // ], // "parameters": { + // "instance": { + // "description": "Name of the instance resource to start.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -39000,17 +39083,17 @@ func (c *RegionAutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", + // "zone": { + // "description": "The name of the zone for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/autoscalers", + // "path": "{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey", // "request": { - // "$ref": "Autoscaler" + // "$ref": "InstancesStartWithEncryptionKeyRequest" // }, // "response": { // "$ref": "Operation" @@ -39023,31 +39106,334 @@ func (c *RegionAutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operati } -// method id "compute.regionAutoscalers.list": +// method id "compute.instances.stop": -type RegionAutoscalersListCall struct { +type InstancesStopCall struct { + s *Service + project string + zone string + instance string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Stop: Stops a running instance, shutting it down cleanly, and allows +// you to restart the instance at a later time. Stopped instances do not +// incur per-minute, virtual machine usage charges while they are +// stopped, but any resources that the virtual machine is using, such as +// persistent disks and static IP addresses, will continue to be charged +// until they are deleted. For more information, see Stopping an +// instance. +// For details, see https://cloud.google.com/compute/docs/reference/latest/instances/stop +func (r *InstancesService) Stop(project string, zone string, instance string) *InstancesStopCall { + c := &InstancesStopCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.zone = zone + c.instance = instance + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *InstancesStopCall) Fields(s ...googleapi.Field) *InstancesStopCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *InstancesStopCall) Context(ctx context.Context) *InstancesStopCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *InstancesStopCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *InstancesStopCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/stop") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "zone": c.zone, + "instance": c.instance, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.instances.stop" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *InstancesStopCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Stops a running instance, shutting it down cleanly, and allows you to restart the instance at a later time. Stopped instances do not incur per-minute, virtual machine usage charges while they are stopped, but any resources that the virtual machine is using, such as persistent disks and static IP addresses, will continue to be charged until they are deleted. For more information, see Stopping an instance.", + // "httpMethod": "POST", + // "id": "compute.instances.stop", + // "parameterOrder": [ + // "project", + // "zone", + // "instance" + // ], + // "parameters": { + // "instance": { + // "description": "Name of the instance resource to stop.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the zone for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/zones/{zone}/instances/{instance}/stop", + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.licenses.get": + +type LicensesGetCall struct { s *Service project string - region string + license string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of autoscalers contained within the specified -// region. -func (r *RegionAutoscalersService) List(project string, region string) *RegionAutoscalersListCall { - c := &RegionAutoscalersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified License resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/licenses/get +func (r *LicensesService) Get(project string, license string) *LicensesGetCall { + c := &LicensesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.license = license + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *LicensesGetCall) Fields(s ...googleapi.Field) *LicensesGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *LicensesGetCall) IfNoneMatch(entityTag string) *LicensesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *LicensesGetCall) Context(ctx context.Context) *LicensesGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *LicensesGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *LicensesGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/licenses/{license}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "license": c.license, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.licenses.get" call. +// Exactly one of *License or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *License.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *LicensesGetCall) Do(opts ...googleapi.CallOption) (*License, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &License{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns the specified License resource.", + // "httpMethod": "GET", + // "id": "compute.licenses.get", + // "parameterOrder": [ + // "project", + // "license" + // ], + // "parameters": { + // "license": { + // "description": "Name of the License resource to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/licenses/{license}", + // "response": { + // "$ref": "License" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.machineTypes.aggregatedList": + +type MachineTypesAggregatedListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// AggregatedList: Retrieves an aggregated list of machine types. +// For details, see https://cloud.google.com/compute/docs/reference/latest/machineTypes/aggregatedList +func (r *MachineTypesService) AggregatedList(project string) *MachineTypesAggregatedListCall { + c := &MachineTypesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -39059,7 +39445,7 @@ func (r *RegionAutoscalersService) List(project string, region string) *RegionAu // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -39071,7 +39457,7 @@ func (r *RegionAutoscalersService) List(project string, region string) *RegionAu // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *RegionAutoscalersListCall) Filter(filter string) *RegionAutoscalersListCall { +func (c *MachineTypesAggregatedListCall) Filter(filter string) *MachineTypesAggregatedListCall { c.urlParams_.Set("filter", filter) return c } @@ -39082,7 +39468,7 @@ func (c *RegionAutoscalersListCall) Filter(filter string) *RegionAutoscalersList // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *RegionAutoscalersListCall) MaxResults(maxResults int64) *RegionAutoscalersListCall { +func (c *MachineTypesAggregatedListCall) MaxResults(maxResults int64) *MachineTypesAggregatedListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -39099,7 +39485,7 @@ func (c *RegionAutoscalersListCall) MaxResults(maxResults int64) *RegionAutoscal // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *RegionAutoscalersListCall) OrderBy(orderBy string) *RegionAutoscalersListCall { +func (c *MachineTypesAggregatedListCall) OrderBy(orderBy string) *MachineTypesAggregatedListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -39107,7 +39493,7 @@ func (c *RegionAutoscalersListCall) OrderBy(orderBy string) *RegionAutoscalersLi // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *RegionAutoscalersListCall) PageToken(pageToken string) *RegionAutoscalersListCall { +func (c *MachineTypesAggregatedListCall) PageToken(pageToken string) *MachineTypesAggregatedListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -39115,7 +39501,7 @@ func (c *RegionAutoscalersListCall) PageToken(pageToken string) *RegionAutoscale // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionAutoscalersListCall) Fields(s ...googleapi.Field) *RegionAutoscalersListCall { +func (c *MachineTypesAggregatedListCall) Fields(s ...googleapi.Field) *MachineTypesAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -39125,7 +39511,7 @@ func (c *RegionAutoscalersListCall) Fields(s ...googleapi.Field) *RegionAutoscal // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *RegionAutoscalersListCall) IfNoneMatch(entityTag string) *RegionAutoscalersListCall { +func (c *MachineTypesAggregatedListCall) IfNoneMatch(entityTag string) *MachineTypesAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -39133,21 +39519,21 @@ func (c *RegionAutoscalersListCall) IfNoneMatch(entityTag string) *RegionAutosca // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionAutoscalersListCall) Context(ctx context.Context) *RegionAutoscalersListCall { +func (c *MachineTypesAggregatedListCall) Context(ctx context.Context) *MachineTypesAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionAutoscalersListCall) Header() http.Header { +func (c *MachineTypesAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionAutoscalersListCall) doRequest(alt string) (*http.Response, error) { +func (c *MachineTypesAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -39158,25 +39544,24 @@ func (c *RegionAutoscalersListCall) doRequest(alt string) (*http.Response, error } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/machineTypes") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionAutoscalers.list" call. -// Exactly one of *RegionAutoscalerList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *RegionAutoscalerList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.machineTypes.aggregatedList" call. +// Exactly one of *MachineTypeAggregatedList or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *MachineTypeAggregatedList.ServerResponse.Header or (if a response +// was returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *RegionAutoscalersListCall) Do(opts ...googleapi.CallOption) (*RegionAutoscalerList, error) { +func (c *MachineTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*MachineTypeAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -39195,7 +39580,7 @@ func (c *RegionAutoscalersListCall) Do(opts ...googleapi.CallOption) (*RegionAut if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RegionAutoscalerList{ + ret := &MachineTypeAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -39207,16 +39592,15 @@ func (c *RegionAutoscalersListCall) Do(opts ...googleapi.CallOption) (*RegionAut } return ret, nil // { - // "description": "Retrieves a list of autoscalers contained within the specified region.", + // "description": "Retrieves an aggregated list of machine types.", // "httpMethod": "GET", - // "id": "compute.regionAutoscalers.list", + // "id": "compute.machineTypes.aggregatedList", // "parameterOrder": [ - // "project", - // "region" + // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -39244,18 +39628,11 @@ func (c *RegionAutoscalersListCall) Do(opts ...googleapi.CallOption) (*RegionAut // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/autoscalers", + // "path": "{project}/aggregated/machineTypes", // "response": { - // "$ref": "RegionAutoscalerList" + // "$ref": "MachineTypeAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -39269,7 +39646,7 @@ func (c *RegionAutoscalersListCall) Do(opts ...googleapi.CallOption) (*RegionAut // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *RegionAutoscalersListCall) Pages(ctx context.Context, f func(*RegionAutoscalerList) error) error { +func (c *MachineTypesAggregatedListCall) Pages(ctx context.Context, f func(*MachineTypeAggregatedList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -39287,92 +39664,96 @@ func (c *RegionAutoscalersListCall) Pages(ctx context.Context, f func(*RegionAut } } -// method id "compute.regionAutoscalers.patch": +// method id "compute.machineTypes.get": -type RegionAutoscalersPatchCall struct { - s *Service - project string - region string - autoscaler *Autoscaler - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type MachineTypesGetCall struct { + s *Service + project string + zone string + machineType string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Patch: Updates an autoscaler in the specified project using the data -// included in the request. This method supports patch semantics. -func (r *RegionAutoscalersService) Patch(project string, region string, autoscaler *Autoscaler) *RegionAutoscalersPatchCall { - c := &RegionAutoscalersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified machine type. Get a list of available +// machine types by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/machineTypes/get +func (r *MachineTypesService) Get(project string, zone string, machineType string) *MachineTypesGetCall { + c := &MachineTypesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.autoscaler = autoscaler - return c -} - -// Autoscaler sets the optional parameter "autoscaler": Name of the -// autoscaler to patch. -func (c *RegionAutoscalersPatchCall) Autoscaler(autoscaler string) *RegionAutoscalersPatchCall { - c.urlParams_.Set("autoscaler", autoscaler) + c.zone = zone + c.machineType = machineType return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionAutoscalersPatchCall) Fields(s ...googleapi.Field) *RegionAutoscalersPatchCall { +func (c *MachineTypesGetCall) Fields(s ...googleapi.Field) *MachineTypesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *MachineTypesGetCall) IfNoneMatch(entityTag string) *MachineTypesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionAutoscalersPatchCall) Context(ctx context.Context) *RegionAutoscalersPatchCall { +func (c *MachineTypesGetCall) Context(ctx context.Context) *MachineTypesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionAutoscalersPatchCall) Header() http.Header { +func (c *MachineTypesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionAutoscalersPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *MachineTypesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/machineTypes/{machineType}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PATCH", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, + "project": c.project, + "zone": c.zone, + "machineType": c.machineType, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionAutoscalers.patch" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.machineTypes.get" call. +// Exactly one of *MachineType or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at +// *MachineType.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *MachineTypesGetCall) Do(opts ...googleapi.CallOption) (*MachineType, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -39391,7 +39772,7 @@ func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operatio if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &MachineType{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -39403,18 +39784,20 @@ func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports patch semantics.", - // "httpMethod": "PATCH", - // "id": "compute.regionAutoscalers.patch", + // "description": "Returns the specified machine type. Get a list of available machine types by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.machineTypes.get", // "parameterOrder": [ // "project", - // "region" + // "zone", + // "machineType" // ], // "parameters": { - // "autoscaler": { - // "description": "Name of the autoscaler to patch.", - // "location": "query", + // "machineType": { + // "description": "Name of the machine type to return.", + // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { @@ -39424,20 +39807,17 @@ func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operatio // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", + // "zone": { + // "description": "The name of the zone for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/autoscalers", - // "request": { - // "$ref": "Autoscaler" - // }, + // "path": "{project}/zones/{zone}/machineTypes/{machineType}", // "response": { - // "$ref": "Operation" + // "$ref": "MachineType" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -39448,92 +39828,160 @@ func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operatio } -// method id "compute.regionAutoscalers.update": +// method id "compute.machineTypes.list": -type RegionAutoscalersUpdateCall struct { - s *Service - project string - region string - autoscaler *Autoscaler - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type MachineTypesListCall struct { + s *Service + project string + zone string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Update: Updates an autoscaler in the specified project using the data -// included in the request. -func (r *RegionAutoscalersService) Update(project string, region string, autoscaler *Autoscaler) *RegionAutoscalersUpdateCall { - c := &RegionAutoscalersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of machine types available to the specified +// project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/machineTypes/list +func (r *MachineTypesService) List(project string, zone string) *MachineTypesListCall { + c := &MachineTypesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.autoscaler = autoscaler + c.zone = zone return c } -// Autoscaler sets the optional parameter "autoscaler": Name of the -// autoscaler to update. -func (c *RegionAutoscalersUpdateCall) Autoscaler(autoscaler string) *RegionAutoscalersUpdateCall { - c.urlParams_.Set("autoscaler", autoscaler) +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *MachineTypesListCall) Filter(filter string) *MachineTypesListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *MachineTypesListCall) MaxResults(maxResults int64) *MachineTypesListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *MachineTypesListCall) OrderBy(orderBy string) *MachineTypesListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *MachineTypesListCall) PageToken(pageToken string) *MachineTypesListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionAutoscalersUpdateCall) Fields(s ...googleapi.Field) *RegionAutoscalersUpdateCall { +func (c *MachineTypesListCall) Fields(s ...googleapi.Field) *MachineTypesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *MachineTypesListCall) IfNoneMatch(entityTag string) *MachineTypesListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionAutoscalersUpdateCall) Context(ctx context.Context) *RegionAutoscalersUpdateCall { +func (c *MachineTypesListCall) Context(ctx context.Context) *MachineTypesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionAutoscalersUpdateCall) Header() http.Header { +func (c *MachineTypesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionAutoscalersUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *MachineTypesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/machineTypes") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PUT", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionAutoscalers.update" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.machineTypes.list" call. +// Exactly one of *MachineTypeList or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *RegionAutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// *MachineTypeList.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *MachineTypesListCall) Do(opts ...googleapi.CallOption) (*MachineTypeList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -39552,7 +40000,7 @@ func (c *RegionAutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operati if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &MachineTypeList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -39564,18 +40012,35 @@ func (c *RegionAutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Updates an autoscaler in the specified project using the data included in the request.", - // "httpMethod": "PUT", - // "id": "compute.regionAutoscalers.update", + // "description": "Retrieves a list of machine types available to the specified project.", + // "httpMethod": "GET", + // "id": "compute.machineTypes.list", // "parameterOrder": [ // "project", - // "region" + // "zone" // ], // "parameters": { - // "autoscaler": { - // "description": "Name of the autoscaler to update.", + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", // "location": "query", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "type": "string" // }, // "project": { @@ -39585,54 +40050,73 @@ func (c *RegionAutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operati // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", + // "zone": { + // "description": "The name of the zone for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/autoscalers", - // "request": { - // "$ref": "Autoscaler" - // }, + // "path": "{project}/zones/{zone}/machineTypes", // "response": { - // "$ref": "Operation" + // "$ref": "MachineTypeList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.regionBackendServices.delete": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *MachineTypesListCall) Pages(ctx context.Context, f func(*MachineTypeList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type RegionBackendServicesDeleteCall struct { - s *Service - project string - region string - backendService string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +// method id "compute.networks.addPeering": + +type NetworksAddPeeringCall struct { + s *Service + project string + network string + networksaddpeeringrequest *NetworksAddPeeringRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified regional BackendService resource. -func (r *RegionBackendServicesService) Delete(project string, region string, backendService string) *RegionBackendServicesDeleteCall { - c := &RegionBackendServicesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AddPeering: Adds a peering to the specified network. +func (r *NetworksService) AddPeering(project string, network string, networksaddpeeringrequest *NetworksAddPeeringRequest) *NetworksAddPeeringCall { + c := &NetworksAddPeeringCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.backendService = backendService + c.network = network + c.networksaddpeeringrequest = networksaddpeeringrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionBackendServicesDeleteCall) Fields(s ...googleapi.Field) *RegionBackendServicesDeleteCall { +func (c *NetworksAddPeeringCall) Fields(s ...googleapi.Field) *NetworksAddPeeringCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -39640,48 +40124,52 @@ func (c *RegionBackendServicesDeleteCall) Fields(s ...googleapi.Field) *RegionBa // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionBackendServicesDeleteCall) Context(ctx context.Context) *RegionBackendServicesDeleteCall { +func (c *NetworksAddPeeringCall) Context(ctx context.Context) *NetworksAddPeeringCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionBackendServicesDeleteCall) Header() http.Header { +func (c *NetworksAddPeeringCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionBackendServicesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *NetworksAddPeeringCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.networksaddpeeringrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}/addPeering") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "backendService": c.backendService, + "project": c.project, + "network": c.network, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionBackendServices.delete" call. +// Do executes the "compute.networks.addPeering" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionBackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *NetworksAddPeeringCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -39712,17 +40200,16 @@ func (c *RegionBackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Deletes the specified regional BackendService resource.", - // "httpMethod": "DELETE", - // "id": "compute.regionBackendServices.delete", + // "description": "Adds a peering to the specified network.", + // "httpMethod": "POST", + // "id": "compute.networks.addPeering", // "parameterOrder": [ // "project", - // "region", - // "backendService" + // "network" // ], // "parameters": { - // "backendService": { - // "description": "Name of the BackendService resource to delete.", + // "network": { + // "description": "Name of the network resource to add peering to.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -39734,16 +40221,12 @@ func (c *RegionBackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/backendServices/{backendService}", + // "path": "{project}/global/networks/{network}/addPeering", + // "request": { + // "$ref": "NetworksAddPeeringRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -39755,94 +40238,78 @@ func (c *RegionBackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.regionBackendServices.get": +// method id "compute.networks.delete": -type RegionBackendServicesGetCall struct { - s *Service - project string - region string - backendService string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type NetworksDeleteCall struct { + s *Service + project string + network string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified regional BackendService resource. -func (r *RegionBackendServicesService) Get(project string, region string, backendService string) *RegionBackendServicesGetCall { - c := &RegionBackendServicesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified network. +// For details, see https://cloud.google.com/compute/docs/reference/latest/networks/delete +func (r *NetworksService) Delete(project string, network string) *NetworksDeleteCall { + c := &NetworksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.backendService = backendService + c.network = network return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionBackendServicesGetCall) Fields(s ...googleapi.Field) *RegionBackendServicesGetCall { +func (c *NetworksDeleteCall) Fields(s ...googleapi.Field) *NetworksDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RegionBackendServicesGetCall) IfNoneMatch(entityTag string) *RegionBackendServicesGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionBackendServicesGetCall) Context(ctx context.Context) *RegionBackendServicesGetCall { +func (c *NetworksDeleteCall) Context(ctx context.Context) *NetworksDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionBackendServicesGetCall) Header() http.Header { +func (c *NetworksDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionBackendServicesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *NetworksDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "backendService": c.backendService, + "project": c.project, + "network": c.network, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionBackendServices.get" call. -// Exactly one of *BackendService or error will be non-nil. Any non-2xx +// Do executes the "compute.networks.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *BackendService.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *RegionBackendServicesGetCall) Do(opts ...googleapi.CallOption) (*BackendService, error) { +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *NetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -39861,7 +40328,7 @@ func (c *RegionBackendServicesGetCall) Do(opts ...googleapi.CallOption) (*Backen if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &BackendService{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -39873,17 +40340,16 @@ func (c *RegionBackendServicesGetCall) Do(opts ...googleapi.CallOption) (*Backen } return ret, nil // { - // "description": "Returns the specified regional BackendService resource.", - // "httpMethod": "GET", - // "id": "compute.regionBackendServices.get", + // "description": "Deletes the specified network.", + // "httpMethod": "DELETE", + // "id": "compute.networks.delete", // "parameterOrder": [ // "project", - // "region", - // "backendService" + // "network" // ], // "parameters": { - // "backendService": { - // "description": "Name of the BackendService resource to return.", + // "network": { + // "description": "Name of the network to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -39895,110 +40361,107 @@ func (c *RegionBackendServicesGetCall) Do(opts ...googleapi.CallOption) (*Backen // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/backendServices/{backendService}", + // "path": "{project}/global/networks/{network}", // "response": { - // "$ref": "BackendService" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.regionBackendServices.getHealth": +// method id "compute.networks.get": -type RegionBackendServicesGetHealthCall struct { - s *Service - project string - region string - backendService string - resourcegroupreference *ResourceGroupReference - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type NetworksGetCall struct { + s *Service + project string + network string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// GetHealth: Gets the most recent health check results for this -// regional BackendService. -func (r *RegionBackendServicesService) GetHealth(project string, region string, backendService string, resourcegroupreference *ResourceGroupReference) *RegionBackendServicesGetHealthCall { - c := &RegionBackendServicesGetHealthCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified network. Get a list of available networks +// by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/networks/get +func (r *NetworksService) Get(project string, network string) *NetworksGetCall { + c := &NetworksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.backendService = backendService - c.resourcegroupreference = resourcegroupreference + c.network = network return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionBackendServicesGetHealthCall) Fields(s ...googleapi.Field) *RegionBackendServicesGetHealthCall { +func (c *NetworksGetCall) Fields(s ...googleapi.Field) *NetworksGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *NetworksGetCall) IfNoneMatch(entityTag string) *NetworksGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionBackendServicesGetHealthCall) Context(ctx context.Context) *RegionBackendServicesGetHealthCall { +func (c *NetworksGetCall) Context(ctx context.Context) *NetworksGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionBackendServicesGetHealthCall) Header() http.Header { +func (c *NetworksGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionBackendServicesGetHealthCall) doRequest(alt string) (*http.Response, error) { +func (c *NetworksGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}/getHealth") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "backendService": c.backendService, + "project": c.project, + "network": c.network, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionBackendServices.getHealth" call. -// Exactly one of *BackendServiceGroupHealth or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *BackendServiceGroupHealth.ServerResponse.Header or (if a response -// was returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *RegionBackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (*BackendServiceGroupHealth, error) { +// Do executes the "compute.networks.get" call. +// Exactly one of *Network or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Network.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *NetworksGetCall) Do(opts ...googleapi.CallOption) (*Network, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -40017,7 +40480,7 @@ func (c *RegionBackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (* if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &BackendServiceGroupHealth{ + ret := &Network{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -40029,42 +40492,32 @@ func (c *RegionBackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (* } return ret, nil // { - // "description": "Gets the most recent health check results for this regional BackendService.", - // "httpMethod": "POST", - // "id": "compute.regionBackendServices.getHealth", + // "description": "Returns the specified network. Get a list of available networks by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.networks.get", // "parameterOrder": [ // "project", - // "region", - // "backendService" + // "network" // ], // "parameters": { - // "backendService": { - // "description": "Name of the BackendService resource to which the queried instance belongs.", + // "network": { + // "description": "Name of the network to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, // "project": { + // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/backendServices/{backendService}/getHealth", - // "request": { - // "$ref": "ResourceGroupReference" - // }, + // "path": "{project}/global/networks/{network}", // "response": { - // "$ref": "BackendServiceGroupHealth" + // "$ref": "Network" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -40075,35 +40528,31 @@ func (c *RegionBackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (* } -// method id "compute.regionBackendServices.insert": +// method id "compute.networks.insert": -type RegionBackendServicesInsertCall struct { - s *Service - project string - region string - backendservice *BackendService - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type NetworksInsertCall struct { + s *Service + project string + network *Network + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates a regional BackendService resource in the specified -// project using the data included in the request. There are several -// restrictions and guidelines to keep in mind when creating a regional -// backend service. Read Restrictions and Guidelines for more -// information. -func (r *RegionBackendServicesService) Insert(project string, region string, backendservice *BackendService) *RegionBackendServicesInsertCall { - c := &RegionBackendServicesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a network in the specified project using the data +// included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/networks/insert +func (r *NetworksService) Insert(project string, network *Network) *NetworksInsertCall { + c := &NetworksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.backendservice = backendservice + c.network = network return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionBackendServicesInsertCall) Fields(s ...googleapi.Field) *RegionBackendServicesInsertCall { +func (c *NetworksInsertCall) Fields(s ...googleapi.Field) *NetworksInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -40111,52 +40560,51 @@ func (c *RegionBackendServicesInsertCall) Fields(s ...googleapi.Field) *RegionBa // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionBackendServicesInsertCall) Context(ctx context.Context) *RegionBackendServicesInsertCall { +func (c *NetworksInsertCall) Context(ctx context.Context) *NetworksInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionBackendServicesInsertCall) Header() http.Header { +func (c *NetworksInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionBackendServicesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *NetworksInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.network) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionBackendServices.insert" call. +// Do executes the "compute.networks.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionBackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *NetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -40187,12 +40635,11 @@ func (c *RegionBackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Creates a regional BackendService resource in the specified project using the data included in the request. There are several restrictions and guidelines to keep in mind when creating a regional backend service. Read Restrictions and Guidelines for more information.", + // "description": "Creates a network in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.regionBackendServices.insert", + // "id": "compute.networks.insert", // "parameterOrder": [ - // "project", - // "region" + // "project" // ], // "parameters": { // "project": { @@ -40201,18 +40648,11 @@ func (c *RegionBackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/backendServices", + // "path": "{project}/global/networks", // "request": { - // "$ref": "BackendService" + // "$ref": "Network" // }, // "response": { // "$ref": "Operation" @@ -40225,31 +40665,29 @@ func (c *RegionBackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.regionBackendServices.list": +// method id "compute.networks.list": -type RegionBackendServicesListCall struct { +type NetworksListCall struct { s *Service project string - region string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves the list of regional BackendService resources -// available to the specified project in the given region. -func (r *RegionBackendServicesService) List(project string, region string) *RegionBackendServicesListCall { - c := &RegionBackendServicesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of networks available to the specified +// project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/networks/list +func (r *NetworksService) List(project string) *NetworksListCall { + c := &NetworksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -40261,7 +40699,7 @@ func (r *RegionBackendServicesService) List(project string, region string) *Regi // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -40273,7 +40711,7 @@ func (r *RegionBackendServicesService) List(project string, region string) *Regi // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *RegionBackendServicesListCall) Filter(filter string) *RegionBackendServicesListCall { +func (c *NetworksListCall) Filter(filter string) *NetworksListCall { c.urlParams_.Set("filter", filter) return c } @@ -40284,7 +40722,7 @@ func (c *RegionBackendServicesListCall) Filter(filter string) *RegionBackendServ // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *RegionBackendServicesListCall) MaxResults(maxResults int64) *RegionBackendServicesListCall { +func (c *NetworksListCall) MaxResults(maxResults int64) *NetworksListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -40301,7 +40739,7 @@ func (c *RegionBackendServicesListCall) MaxResults(maxResults int64) *RegionBack // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *RegionBackendServicesListCall) OrderBy(orderBy string) *RegionBackendServicesListCall { +func (c *NetworksListCall) OrderBy(orderBy string) *NetworksListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -40309,7 +40747,7 @@ func (c *RegionBackendServicesListCall) OrderBy(orderBy string) *RegionBackendSe // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *RegionBackendServicesListCall) PageToken(pageToken string) *RegionBackendServicesListCall { +func (c *NetworksListCall) PageToken(pageToken string) *NetworksListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -40317,7 +40755,7 @@ func (c *RegionBackendServicesListCall) PageToken(pageToken string) *RegionBacke // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionBackendServicesListCall) Fields(s ...googleapi.Field) *RegionBackendServicesListCall { +func (c *NetworksListCall) Fields(s ...googleapi.Field) *NetworksListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -40327,7 +40765,7 @@ func (c *RegionBackendServicesListCall) Fields(s ...googleapi.Field) *RegionBack // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *RegionBackendServicesListCall) IfNoneMatch(entityTag string) *RegionBackendServicesListCall { +func (c *NetworksListCall) IfNoneMatch(entityTag string) *NetworksListCall { c.ifNoneMatch_ = entityTag return c } @@ -40335,21 +40773,21 @@ func (c *RegionBackendServicesListCall) IfNoneMatch(entityTag string) *RegionBac // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionBackendServicesListCall) Context(ctx context.Context) *RegionBackendServicesListCall { +func (c *NetworksListCall) Context(ctx context.Context) *NetworksListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionBackendServicesListCall) Header() http.Header { +func (c *NetworksListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionBackendServicesListCall) doRequest(alt string) (*http.Response, error) { +func (c *NetworksListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -40360,25 +40798,24 @@ func (c *RegionBackendServicesListCall) doRequest(alt string) (*http.Response, e } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionBackendServices.list" call. -// Exactly one of *BackendServiceList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *BackendServiceList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *RegionBackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServiceList, error) { +// Do executes the "compute.networks.list" call. +// Exactly one of *NetworkList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *NetworkList.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *NetworksListCall) Do(opts ...googleapi.CallOption) (*NetworkList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -40397,7 +40834,7 @@ func (c *RegionBackendServicesListCall) Do(opts ...googleapi.CallOption) (*Backe if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &BackendServiceList{ + ret := &NetworkList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -40409,16 +40846,15 @@ func (c *RegionBackendServicesListCall) Do(opts ...googleapi.CallOption) (*Backe } return ret, nil // { - // "description": "Retrieves the list of regional BackendService resources available to the specified project in the given region.", + // "description": "Retrieves the list of networks available to the specified project.", // "httpMethod": "GET", - // "id": "compute.regionBackendServices.list", + // "id": "compute.networks.list", // "parameterOrder": [ - // "project", - // "region" + // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -40446,18 +40882,11 @@ func (c *RegionBackendServicesListCall) Do(opts ...googleapi.CallOption) (*Backe // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/backendServices", + // "path": "{project}/global/networks", // "response": { - // "$ref": "BackendServiceList" + // "$ref": "NetworkList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -40471,7 +40900,7 @@ func (c *RegionBackendServicesListCall) Do(opts ...googleapi.CallOption) (*Backe // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *RegionBackendServicesListCall) Pages(ctx context.Context, f func(*BackendServiceList) error) error { +func (c *NetworksListCall) Pages(ctx context.Context, f func(*NetworkList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -40489,37 +40918,31 @@ func (c *RegionBackendServicesListCall) Pages(ctx context.Context, f func(*Backe } } -// method id "compute.regionBackendServices.patch": +// method id "compute.networks.removePeering": -type RegionBackendServicesPatchCall struct { - s *Service - project string - region string - backendService string - backendservice *BackendService - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type NetworksRemovePeeringCall struct { + s *Service + project string + network string + networksremovepeeringrequest *NetworksRemovePeeringRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Patch: Updates the specified regional BackendService resource with -// the data included in the request. There are several restrictions and -// guidelines to keep in mind when updating a backend service. Read -// Restrictions and Guidelines for more information. This method -// supports patch semantics. -func (r *RegionBackendServicesService) Patch(project string, region string, backendService string, backendservice *BackendService) *RegionBackendServicesPatchCall { - c := &RegionBackendServicesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// RemovePeering: Removes a peering from the specified network. +func (r *NetworksService) RemovePeering(project string, network string, networksremovepeeringrequest *NetworksRemovePeeringRequest) *NetworksRemovePeeringCall { + c := &NetworksRemovePeeringCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.backendService = backendService - c.backendservice = backendservice + c.network = network + c.networksremovepeeringrequest = networksremovepeeringrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionBackendServicesPatchCall) Fields(s ...googleapi.Field) *RegionBackendServicesPatchCall { +func (c *NetworksRemovePeeringCall) Fields(s ...googleapi.Field) *NetworksRemovePeeringCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -40527,53 +40950,52 @@ func (c *RegionBackendServicesPatchCall) Fields(s ...googleapi.Field) *RegionBac // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionBackendServicesPatchCall) Context(ctx context.Context) *RegionBackendServicesPatchCall { +func (c *NetworksRemovePeeringCall) Context(ctx context.Context) *NetworksRemovePeeringCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionBackendServicesPatchCall) Header() http.Header { +func (c *NetworksRemovePeeringCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionBackendServicesPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *NetworksRemovePeeringCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.networksremovepeeringrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}/removePeering") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PATCH", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "backendService": c.backendService, + "project": c.project, + "network": c.network, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionBackendServices.patch" call. +// Do executes the "compute.networks.removePeering" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionBackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *NetworksRemovePeeringCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -40604,17 +41026,16 @@ func (c *RegionBackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Oper } return ret, nil // { - // "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports patch semantics.", - // "httpMethod": "PATCH", - // "id": "compute.regionBackendServices.patch", + // "description": "Removes a peering from the specified network.", + // "httpMethod": "POST", + // "id": "compute.networks.removePeering", // "parameterOrder": [ // "project", - // "region", - // "backendService" + // "network" // ], // "parameters": { - // "backendService": { - // "description": "Name of the BackendService resource to patch.", + // "network": { + // "description": "Name of the network resource to remove peering from.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -40626,61 +41047,47 @@ func (c *RegionBackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Oper // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/backendServices/{backendService}", + // "path": "{project}/global/networks/{network}/removePeering", // "request": { - // "$ref": "BackendService" + // "$ref": "NetworksRemovePeeringRequest" // }, // "response": { // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.regionBackendServices.update": +// method id "compute.networks.switchToCustomMode": -type RegionBackendServicesUpdateCall struct { - s *Service - project string - region string - backendService string - backendservice *BackendService - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type NetworksSwitchToCustomModeCall struct { + s *Service + project string + network string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Update: Updates the specified regional BackendService resource with -// the data included in the request. There are several restrictions and -// guidelines to keep in mind when updating a backend service. Read -// Restrictions and Guidelines for more information. -func (r *RegionBackendServicesService) Update(project string, region string, backendService string, backendservice *BackendService) *RegionBackendServicesUpdateCall { - c := &RegionBackendServicesUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SwitchToCustomMode: Switches the network mode from auto subnet mode +// to custom subnet mode. +func (r *NetworksService) SwitchToCustomMode(project string, network string) *NetworksSwitchToCustomModeCall { + c := &NetworksSwitchToCustomModeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.backendService = backendService - c.backendservice = backendservice + c.network = network return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionBackendServicesUpdateCall) Fields(s ...googleapi.Field) *RegionBackendServicesUpdateCall { +func (c *NetworksSwitchToCustomModeCall) Fields(s ...googleapi.Field) *NetworksSwitchToCustomModeCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -40688,53 +41095,47 @@ func (c *RegionBackendServicesUpdateCall) Fields(s ...googleapi.Field) *RegionBa // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionBackendServicesUpdateCall) Context(ctx context.Context) *RegionBackendServicesUpdateCall { +func (c *NetworksSwitchToCustomModeCall) Context(ctx context.Context) *NetworksSwitchToCustomModeCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionBackendServicesUpdateCall) Header() http.Header { +func (c *NetworksSwitchToCustomModeCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionBackendServicesUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *NetworksSwitchToCustomModeCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}/switchToCustomMode") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PUT", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "backendService": c.backendService, + "project": c.project, + "network": c.network, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionBackendServices.update" call. +// Do executes the "compute.networks.switchToCustomMode" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionBackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *NetworksSwitchToCustomModeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -40765,17 +41166,16 @@ func (c *RegionBackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information.", - // "httpMethod": "PUT", - // "id": "compute.regionBackendServices.update", + // "description": "Switches the network mode from auto subnet mode to custom subnet mode.", + // "httpMethod": "POST", + // "id": "compute.networks.switchToCustomMode", // "parameterOrder": [ // "project", - // "region", - // "backendService" + // "network" // ], // "parameters": { - // "backendService": { - // "description": "Name of the BackendService resource to update.", + // "network": { + // "description": "Name of the network to be updated.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, @@ -40787,19 +41187,9 @@ func (c *RegionBackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Ope // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/backendServices/{backendService}", - // "request": { - // "$ref": "BackendService" - // }, + // "path": "{project}/global/networks/{network}/switchToCustomMode", // "response": { // "$ref": "Operation" // }, @@ -40811,44 +41201,27 @@ func (c *RegionBackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.regionInstanceGroupManagers.abandonInstances": +// method id "compute.projects.disableXpnHost": -type RegionInstanceGroupManagersAbandonInstancesCall struct { - s *Service - project string - region string - instanceGroupManager string - regioninstancegroupmanagersabandoninstancesrequest *RegionInstanceGroupManagersAbandonInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsDisableXpnHostCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AbandonInstances: Schedules a group action to remove the specified -// instances from the managed instance group. Abandoning an instance -// does not delete the instance, but it does remove the instance from -// any target pools that are applied by the managed instance group. This -// method reduces the targetSize of the managed instance group by the -// number of instances that you abandon. This operation is marked as -// DONE when the action is scheduled even if the instances have not yet -// been removed from the group. You must separately verify the status of -// the abandoning action with the listmanagedinstances method. -// -// You can specify a maximum of 1000 instances with this method per -// request. -func (r *RegionInstanceGroupManagersService) AbandonInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersabandoninstancesrequest *RegionInstanceGroupManagersAbandonInstancesRequest) *RegionInstanceGroupManagersAbandonInstancesCall { - c := &RegionInstanceGroupManagersAbandonInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// DisableXpnHost: Disable this project as a shared VPC host project. +func (r *ProjectsService) DisableXpnHost(project string) *ProjectsDisableXpnHostCall { + c := &ProjectsDisableXpnHostCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroupManager = instanceGroupManager - c.regioninstancegroupmanagersabandoninstancesrequest = regioninstancegroupmanagersabandoninstancesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersAbandonInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersAbandonInstancesCall { +func (c *ProjectsDisableXpnHostCall) Fields(s ...googleapi.Field) *ProjectsDisableXpnHostCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -40856,53 +41229,46 @@ func (c *RegionInstanceGroupManagersAbandonInstancesCall) Fields(s ...googleapi. // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersAbandonInstancesCall) Context(ctx context.Context) *RegionInstanceGroupManagersAbandonInstancesCall { +func (c *ProjectsDisableXpnHostCall) Context(ctx context.Context) *ProjectsDisableXpnHostCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersAbandonInstancesCall) Header() http.Header { +func (c *ProjectsDisableXpnHostCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersAbandonInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsDisableXpnHostCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersabandoninstancesrequest) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/disableXpnHost") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.abandonInstances" call. +// Do executes the "compute.projects.disableXpnHost" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsDisableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -40933,39 +41299,22 @@ func (c *RegionInstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.C } return ret, nil // { - // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Disable this project as a shared VPC host project.", // "httpMethod": "POST", - // "id": "compute.regionInstanceGroupManagers.abandonInstances", + // "id": "compute.projects.disableXpnHost", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroupManager" + // "project" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "Name of the managed instance group.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", - // "request": { - // "$ref": "RegionInstanceGroupManagersAbandonInstancesRequest" - // }, + // "path": "{project}/disableXpnHost", // "response": { // "$ref": "Operation" // }, @@ -40977,32 +41326,30 @@ func (c *RegionInstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.C } -// method id "compute.regionInstanceGroupManagers.delete": +// method id "compute.projects.disableXpnResource": -type RegionInstanceGroupManagersDeleteCall struct { - s *Service - project string - region string - instanceGroupManager string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsDisableXpnResourceCall struct { + s *Service + project string + projectsdisablexpnresourcerequest *ProjectsDisableXpnResourceRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified managed instance group and all of the -// instances in that group. -func (r *RegionInstanceGroupManagersService) Delete(project string, region string, instanceGroupManager string) *RegionInstanceGroupManagersDeleteCall { - c := &RegionInstanceGroupManagersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// DisableXpnResource: Disable a serivce resource (a.k.a service +// project) associated with this host project. +func (r *ProjectsService) DisableXpnResource(project string, projectsdisablexpnresourcerequest *ProjectsDisableXpnResourceRequest) *ProjectsDisableXpnResourceCall { + c := &ProjectsDisableXpnResourceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroupManager = instanceGroupManager + c.projectsdisablexpnresourcerequest = projectsdisablexpnresourcerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersDeleteCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersDeleteCall { +func (c *ProjectsDisableXpnResourceCall) Fields(s ...googleapi.Field) *ProjectsDisableXpnResourceCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -41010,48 +41357,51 @@ func (c *RegionInstanceGroupManagersDeleteCall) Fields(s ...googleapi.Field) *Re // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersDeleteCall) Context(ctx context.Context) *RegionInstanceGroupManagersDeleteCall { +func (c *ProjectsDisableXpnResourceCall) Context(ctx context.Context) *ProjectsDisableXpnResourceCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersDeleteCall) Header() http.Header { +func (c *ProjectsDisableXpnResourceCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsDisableXpnResourceCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.projectsdisablexpnresourcerequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/disableXpnResource") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.delete" call. +// Do executes the "compute.projects.disableXpnResource" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsDisableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -41082,36 +41432,25 @@ func (c *RegionInstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Deletes the specified managed instance group and all of the instances in that group.", - // "httpMethod": "DELETE", - // "id": "compute.regionInstanceGroupManagers.delete", + // "description": "Disable a serivce resource (a.k.a service project) associated with this host project.", + // "httpMethod": "POST", + // "id": "compute.projects.disableXpnResource", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroupManager" + // "project" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "Name of the managed instance group to delete.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", + // "path": "{project}/disableXpnResource", + // "request": { + // "$ref": "ProjectsDisableXpnResourceRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -41123,43 +41462,27 @@ func (c *RegionInstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) } -// method id "compute.regionInstanceGroupManagers.deleteInstances": +// method id "compute.projects.enableXpnHost": -type RegionInstanceGroupManagersDeleteInstancesCall struct { - s *Service - project string - region string - instanceGroupManager string - regioninstancegroupmanagersdeleteinstancesrequest *RegionInstanceGroupManagersDeleteInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsEnableXpnHostCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// DeleteInstances: Schedules a group action to delete the specified -// instances in the managed instance group. The instances are also -// removed from any target pools of which they were a member. This -// method reduces the targetSize of the managed instance group by the -// number of instances that you delete. This operation is marked as DONE -// when the action is scheduled even if the instances are still being -// deleted. You must separately verify the status of the deleting action -// with the listmanagedinstances method. -// -// You can specify a maximum of 1000 instances with this method per -// request. -func (r *RegionInstanceGroupManagersService) DeleteInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersdeleteinstancesrequest *RegionInstanceGroupManagersDeleteInstancesRequest) *RegionInstanceGroupManagersDeleteInstancesCall { - c := &RegionInstanceGroupManagersDeleteInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// EnableXpnHost: Enable this project as a shared VPC host project. +func (r *ProjectsService) EnableXpnHost(project string) *ProjectsEnableXpnHostCall { + c := &ProjectsEnableXpnHostCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroupManager = instanceGroupManager - c.regioninstancegroupmanagersdeleteinstancesrequest = regioninstancegroupmanagersdeleteinstancesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersDeleteInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersDeleteInstancesCall { +func (c *ProjectsEnableXpnHostCall) Fields(s ...googleapi.Field) *ProjectsEnableXpnHostCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -41167,53 +41490,46 @@ func (c *RegionInstanceGroupManagersDeleteInstancesCall) Fields(s ...googleapi.F // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersDeleteInstancesCall) Context(ctx context.Context) *RegionInstanceGroupManagersDeleteInstancesCall { +func (c *ProjectsEnableXpnHostCall) Context(ctx context.Context) *ProjectsEnableXpnHostCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersDeleteInstancesCall) Header() http.Header { +func (c *ProjectsEnableXpnHostCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersDeleteInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsEnableXpnHostCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersdeleteinstancesrequest) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/enableXpnHost") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.deleteInstances" call. +// Do executes the "compute.projects.enableXpnHost" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsEnableXpnHostCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -41244,39 +41560,22 @@ func (c *RegionInstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.Ca } return ret, nil // { - // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "Enable this project as a shared VPC host project.", // "httpMethod": "POST", - // "id": "compute.regionInstanceGroupManagers.deleteInstances", + // "id": "compute.projects.enableXpnHost", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroupManager" + // "project" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "Name of the managed instance group.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", - // "request": { - // "$ref": "RegionInstanceGroupManagersDeleteInstancesRequest" - // }, + // "path": "{project}/enableXpnHost", // "response": { // "$ref": "Operation" // }, @@ -41288,95 +41587,83 @@ func (c *RegionInstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.Ca } -// method id "compute.regionInstanceGroupManagers.get": +// method id "compute.projects.enableXpnResource": -type RegionInstanceGroupManagersGetCall struct { - s *Service - project string - region string - instanceGroupManager string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type ProjectsEnableXpnResourceCall struct { + s *Service + project string + projectsenablexpnresourcerequest *ProjectsEnableXpnResourceRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns all of the details about the specified managed instance -// group. -func (r *RegionInstanceGroupManagersService) Get(project string, region string, instanceGroupManager string) *RegionInstanceGroupManagersGetCall { - c := &RegionInstanceGroupManagersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// EnableXpnResource: Enable service resource (a.k.a service project) +// for a host project, so that subnets in the host project can be used +// by instances in the service project. +func (r *ProjectsService) EnableXpnResource(project string, projectsenablexpnresourcerequest *ProjectsEnableXpnResourceRequest) *ProjectsEnableXpnResourceCall { + c := &ProjectsEnableXpnResourceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroupManager = instanceGroupManager + c.projectsenablexpnresourcerequest = projectsenablexpnresourcerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersGetCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersGetCall { +func (c *ProjectsEnableXpnResourceCall) Fields(s ...googleapi.Field) *ProjectsEnableXpnResourceCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RegionInstanceGroupManagersGetCall) IfNoneMatch(entityTag string) *RegionInstanceGroupManagersGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersGetCall) Context(ctx context.Context) *RegionInstanceGroupManagersGetCall { +func (c *ProjectsEnableXpnResourceCall) Context(ctx context.Context) *ProjectsEnableXpnResourceCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersGetCall) Header() http.Header { +func (c *ProjectsEnableXpnResourceCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersGetCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsEnableXpnResourceCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.projectsenablexpnresourcerequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/enableXpnResource") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.get" call. -// Exactly one of *InstanceGroupManager or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *InstanceGroupManager.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManager, error) { +// Do executes the "compute.projects.enableXpnResource" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsEnableXpnResourceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -41395,7 +41682,7 @@ func (c *RegionInstanceGroupManagersGetCall) Do(opts ...googleapi.CallOption) (* if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceGroupManager{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -41407,134 +41694,119 @@ func (c *RegionInstanceGroupManagersGetCall) Do(opts ...googleapi.CallOption) (* } return ret, nil // { - // "description": "Returns all of the details about the specified managed instance group.", - // "httpMethod": "GET", - // "id": "compute.regionInstanceGroupManagers.get", + // "description": "Enable service resource (a.k.a service project) for a host project, so that subnets in the host project can be used by instances in the service project.", + // "httpMethod": "POST", + // "id": "compute.projects.enableXpnResource", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroupManager" + // "project" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "Name of the managed instance group to return.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", + // "path": "{project}/enableXpnResource", + // "request": { + // "$ref": "ProjectsEnableXpnResourceRequest" + // }, // "response": { - // "$ref": "InstanceGroupManager" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.regionInstanceGroupManagers.insert": +// method id "compute.projects.get": -type RegionInstanceGroupManagersInsertCall struct { - s *Service - project string - region string - instancegroupmanager *InstanceGroupManager - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsGetCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Insert: Creates a managed instance group using the information that -// you specify in the request. After the group is created, it schedules -// an action to create instances in the group using the specified -// instance template. This operation is marked as DONE when the group is -// created even if the instances in the group have not yet been created. -// You must separately verify the status of the individual instances -// with the listmanagedinstances method. -// -// A regional managed instance group can contain up to 2000 instances. -func (r *RegionInstanceGroupManagersService) Insert(project string, region string, instancegroupmanager *InstanceGroupManager) *RegionInstanceGroupManagersInsertCall { - c := &RegionInstanceGroupManagersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified Project resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/projects/get +func (r *ProjectsService) Get(project string) *ProjectsGetCall { + c := &ProjectsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instancegroupmanager = instancegroupmanager return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersInsertCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersInsertCall { +func (c *ProjectsGetCall) Fields(s ...googleapi.Field) *ProjectsGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ProjectsGetCall) IfNoneMatch(entityTag string) *ProjectsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersInsertCall) Context(ctx context.Context) *RegionInstanceGroupManagersInsertCall { +func (c *ProjectsGetCall) Context(ctx context.Context) *ProjectsGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersInsertCall) Header() http.Header { +func (c *ProjectsGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.projects.get" call. +// Exactly one of *Project or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Project.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ProjectsGetCall) Do(opts ...googleapi.CallOption) (*Project, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -41553,7 +41825,7 @@ func (c *RegionInstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &Project{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -41565,12 +41837,11 @@ func (c *RegionInstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA regional managed instance group can contain up to 2000 instances.", - // "httpMethod": "POST", - // "id": "compute.regionInstanceGroupManagers.insert", + // "description": "Returns the specified Project resource.", + // "httpMethod": "GET", + // "id": "compute.projects.get", // "parameterOrder": [ - // "project", - // "region" + // "project" // ], // "parameters": { // "project": { @@ -41579,122 +41850,44 @@ func (c *RegionInstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers", - // "request": { - // "$ref": "InstanceGroupManager" - // }, + // "path": "{project}", // "response": { - // "$ref": "Operation" + // "$ref": "Project" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.regionInstanceGroupManagers.list": +// method id "compute.projects.getXpnHost": -type RegionInstanceGroupManagersListCall struct { +type ProjectsGetXpnHostCall struct { s *Service project string - region string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves the list of managed instance groups that are -// contained within the specified region. -func (r *RegionInstanceGroupManagersService) List(project string, region string) *RegionInstanceGroupManagersListCall { - c := &RegionInstanceGroupManagersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// GetXpnHost: Get the shared VPC host project that this project links +// to. May be empty if no link exists. +func (r *ProjectsService) GetXpnHost(project string) *ProjectsGetXpnHostCall { + c := &ProjectsGetXpnHostCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *RegionInstanceGroupManagersListCall) Filter(filter string) *RegionInstanceGroupManagersListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *RegionInstanceGroupManagersListCall) MaxResults(maxResults int64) *RegionInstanceGroupManagersListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *RegionInstanceGroupManagersListCall) OrderBy(orderBy string) *RegionInstanceGroupManagersListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *RegionInstanceGroupManagersListCall) PageToken(pageToken string) *RegionInstanceGroupManagersListCall { - c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersListCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersListCall { +func (c *ProjectsGetXpnHostCall) Fields(s ...googleapi.Field) *ProjectsGetXpnHostCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -41704,7 +41897,7 @@ func (c *RegionInstanceGroupManagersListCall) Fields(s ...googleapi.Field) *Regi // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *RegionInstanceGroupManagersListCall) IfNoneMatch(entityTag string) *RegionInstanceGroupManagersListCall { +func (c *ProjectsGetXpnHostCall) IfNoneMatch(entityTag string) *ProjectsGetXpnHostCall { c.ifNoneMatch_ = entityTag return c } @@ -41712,21 +41905,21 @@ func (c *RegionInstanceGroupManagersListCall) IfNoneMatch(entityTag string) *Reg // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersListCall) Context(ctx context.Context) *RegionInstanceGroupManagersListCall { +func (c *ProjectsGetXpnHostCall) Context(ctx context.Context) *ProjectsGetXpnHostCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersListCall) Header() http.Header { +func (c *ProjectsGetXpnHostCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersListCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsGetXpnHostCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -41737,28 +41930,27 @@ func (c *RegionInstanceGroupManagersListCall) doRequest(alt string) (*http.Respo } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/getXpnHost") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.list" call. -// Exactly one of *RegionInstanceGroupManagerList or error will be -// non-nil. Any non-2xx status code is an error. Response headers are in -// either *RegionInstanceGroupManagerList.ServerResponse.Header or (if a -// response was returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*RegionInstanceGroupManagerList, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { +// Do executes the "compute.projects.getXpnHost" call. +// Exactly one of *Project or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Project.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *ProjectsGetXpnHostCall) Do(opts ...googleapi.CallOption) (*Project, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { if res.Body != nil { res.Body.Close() } @@ -41774,7 +41966,7 @@ func (c *RegionInstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) ( if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RegionInstanceGroupManagerList{ + ret := &Project{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -41786,129 +41978,72 @@ func (c *RegionInstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) ( } return ret, nil // { - // "description": "Retrieves the list of managed instance groups that are contained within the specified region.", + // "description": "Get the shared VPC host project that this project links to. May be empty if no link exists.", // "httpMethod": "GET", - // "id": "compute.regionInstanceGroupManagers.list", + // "id": "compute.projects.getXpnHost", // "parameterOrder": [ - // "project", - // "region" + // "project" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers", + // "path": "{project}/getXpnHost", // "response": { - // "$ref": "RegionInstanceGroupManagerList" + // "$ref": "Project" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *RegionInstanceGroupManagersListCall) Pages(ctx context.Context, f func(*RegionInstanceGroupManagerList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.regionInstanceGroupManagers.listManagedInstances": +// method id "compute.projects.getXpnResources": -type RegionInstanceGroupManagersListManagedInstancesCall struct { - s *Service - project string - region string - instanceGroupManager string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsGetXpnResourcesCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// ListManagedInstances: Lists the instances in the managed instance -// group and instances that are scheduled to be created. The list -// includes any current actions that the group has scheduled for its -// instances. -func (r *RegionInstanceGroupManagersService) ListManagedInstances(project string, region string, instanceGroupManager string) *RegionInstanceGroupManagersListManagedInstancesCall { - c := &RegionInstanceGroupManagersListManagedInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// GetXpnResources: Get service resources (a.k.a service project) +// associated with this host project. +func (r *ProjectsService) GetXpnResources(project string) *ProjectsGetXpnResourcesCall { + c := &ProjectsGetXpnResourcesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroupManager = instanceGroupManager return c } // Filter sets the optional parameter "filter": -func (c *RegionInstanceGroupManagersListManagedInstancesCall) Filter(filter string) *RegionInstanceGroupManagersListManagedInstancesCall { +func (c *ProjectsGetXpnResourcesCall) Filter(filter string) *ProjectsGetXpnResourcesCall { c.urlParams_.Set("filter", filter) return c } // MaxResults sets the optional parameter "maxResults": -func (c *RegionInstanceGroupManagersListManagedInstancesCall) MaxResults(maxResults int64) *RegionInstanceGroupManagersListManagedInstancesCall { +func (c *ProjectsGetXpnResourcesCall) MaxResults(maxResults int64) *ProjectsGetXpnResourcesCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } // OrderBy sets the optional parameter "order_by": -func (c *RegionInstanceGroupManagersListManagedInstancesCall) OrderBy(orderBy string) *RegionInstanceGroupManagersListManagedInstancesCall { +func (c *ProjectsGetXpnResourcesCall) OrderBy(orderBy string) *ProjectsGetXpnResourcesCall { c.urlParams_.Set("order_by", orderBy) return c } // PageToken sets the optional parameter "pageToken": -func (c *RegionInstanceGroupManagersListManagedInstancesCall) PageToken(pageToken string) *RegionInstanceGroupManagersListManagedInstancesCall { +func (c *ProjectsGetXpnResourcesCall) PageToken(pageToken string) *ProjectsGetXpnResourcesCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -41916,58 +42051,67 @@ func (c *RegionInstanceGroupManagersListManagedInstancesCall) PageToken(pageToke // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersListManagedInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersListManagedInstancesCall { +func (c *ProjectsGetXpnResourcesCall) Fields(s ...googleapi.Field) *ProjectsGetXpnResourcesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ProjectsGetXpnResourcesCall) IfNoneMatch(entityTag string) *ProjectsGetXpnResourcesCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersListManagedInstancesCall) Context(ctx context.Context) *RegionInstanceGroupManagersListManagedInstancesCall { +func (c *ProjectsGetXpnResourcesCall) Context(ctx context.Context) *ProjectsGetXpnResourcesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersListManagedInstancesCall) Header() http.Header { +func (c *ProjectsGetXpnResourcesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersListManagedInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsGetXpnResourcesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/getXpnResources") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.listManagedInstances" call. -// Exactly one of *RegionInstanceGroupManagersListInstancesResponse or -// error will be non-nil. Any non-2xx status code is an error. Response -// headers are in either -// *RegionInstanceGroupManagersListInstancesResponse.ServerResponse.Heade -// r or (if a response was returned at all) in -// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check -// whether the returned error was because http.StatusNotModified was -// returned. -func (c *RegionInstanceGroupManagersListManagedInstancesCall) Do(opts ...googleapi.CallOption) (*RegionInstanceGroupManagersListInstancesResponse, error) { +// Do executes the "compute.projects.getXpnResources" call. +// Exactly one of *ProjectsGetXpnResources or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *ProjectsGetXpnResources.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ProjectsGetXpnResourcesCall) Do(opts ...googleapi.CallOption) (*ProjectsGetXpnResources, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -41986,7 +42130,7 @@ func (c *RegionInstanceGroupManagersListManagedInstancesCall) Do(opts ...googlea if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RegionInstanceGroupManagersListInstancesResponse{ + ret := &ProjectsGetXpnResources{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -41998,25 +42142,17 @@ func (c *RegionInstanceGroupManagersListManagedInstancesCall) Do(opts ...googlea } return ret, nil // { - // "description": "Lists the instances in the managed instance group and instances that are scheduled to be created. The list includes any current actions that the group has scheduled for its instances.", - // "httpMethod": "POST", - // "id": "compute.regionInstanceGroupManagers.listManagedInstances", + // "description": "Get service resources (a.k.a service project) associated with this host project.", + // "httpMethod": "GET", + // "id": "compute.projects.getXpnResources", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroupManager" + // "project" // ], // "parameters": { // "filter": { // "location": "query", // "type": "string" // }, - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "maxResults": { // "default": "500", // "format": "uint32", @@ -42038,63 +42174,89 @@ func (c *RegionInstanceGroupManagersListManagedInstancesCall) Do(opts ...googlea // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances", + // "path": "{project}/getXpnResources", // "response": { - // "$ref": "RegionInstanceGroupManagersListInstancesResponse" + // "$ref": "ProjectsGetXpnResources" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.regionInstanceGroupManagers.recreateInstances": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *ProjectsGetXpnResourcesCall) Pages(ctx context.Context, f func(*ProjectsGetXpnResources) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type RegionInstanceGroupManagersRecreateInstancesCall struct { - s *Service - project string - region string - instanceGroupManager string - regioninstancegroupmanagersrecreaterequest *RegionInstanceGroupManagersRecreateRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +// method id "compute.projects.listXpnHosts": + +type ProjectsListXpnHostsCall struct { + s *Service + project string + projectslistxpnhostsrequest *ProjectsListXpnHostsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// RecreateInstances: Schedules a group action to recreate the specified -// instances in the managed instance group. The instances are deleted -// and recreated using the current instance template for the managed -// instance group. This operation is marked as DONE when the action is -// scheduled even if the instances have not yet been recreated. You must -// separately verify the status of the recreating action with the -// listmanagedinstances method. -// -// You can specify a maximum of 1000 instances with this method per -// request. -func (r *RegionInstanceGroupManagersService) RecreateInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersrecreaterequest *RegionInstanceGroupManagersRecreateRequest) *RegionInstanceGroupManagersRecreateInstancesCall { - c := &RegionInstanceGroupManagersRecreateInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// ListXpnHosts: List all shared VPC host projects visible to the user +// in an organization. +func (r *ProjectsService) ListXpnHosts(project string, projectslistxpnhostsrequest *ProjectsListXpnHostsRequest) *ProjectsListXpnHostsCall { + c := &ProjectsListXpnHostsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroupManager = instanceGroupManager - c.regioninstancegroupmanagersrecreaterequest = regioninstancegroupmanagersrecreaterequest + c.projectslistxpnhostsrequest = projectslistxpnhostsrequest + return c +} + +// Filter sets the optional parameter "filter": +func (c *ProjectsListXpnHostsCall) Filter(filter string) *ProjectsListXpnHostsCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": +func (c *ProjectsListXpnHostsCall) MaxResults(maxResults int64) *ProjectsListXpnHostsCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "order_by": +func (c *ProjectsListXpnHostsCall) OrderBy(orderBy string) *ProjectsListXpnHostsCall { + c.urlParams_.Set("order_by", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": +func (c *ProjectsListXpnHostsCall) PageToken(pageToken string) *ProjectsListXpnHostsCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersRecreateInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersRecreateInstancesCall { +func (c *ProjectsListXpnHostsCall) Fields(s ...googleapi.Field) *ProjectsListXpnHostsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -42102,53 +42264,51 @@ func (c *RegionInstanceGroupManagersRecreateInstancesCall) Fields(s ...googleapi // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersRecreateInstancesCall) Context(ctx context.Context) *RegionInstanceGroupManagersRecreateInstancesCall { +func (c *ProjectsListXpnHostsCall) Context(ctx context.Context) *ProjectsListXpnHostsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersRecreateInstancesCall) Header() http.Header { +func (c *ProjectsListXpnHostsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersRecreateInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsListXpnHostsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersrecreaterequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.projectslistxpnhostsrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/listXpnHosts") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.recreateInstances" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.projects.listXpnHosts" call. +// Exactly one of *XpnHostList or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at +// *XpnHostList.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsListXpnHostsCall) Do(opts ...googleapi.CallOption) (*XpnHostList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -42167,7 +42327,7 @@ func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi. if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &XpnHostList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -42179,19 +42339,30 @@ func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi. } return ret, nil // { - // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "description": "List all shared VPC host projects visible to the user in an organization.", // "httpMethod": "POST", - // "id": "compute.regionInstanceGroupManagers.recreateInstances", + // "id": "compute.projects.listXpnHosts", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroupManager" + // "project" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "Name of the managed instance group.", - // "location": "path", - // "required": true, + // "filter": { + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "order_by": { + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "location": "query", // "type": "string" // }, // "project": { @@ -42200,20 +42371,14 @@ func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi. // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", + // "path": "{project}/listXpnHosts", // "request": { - // "$ref": "RegionInstanceGroupManagersRecreateRequest" + // "$ref": "ProjectsListXpnHostsRequest" // }, // "response": { - // "$ref": "Operation" + // "$ref": "XpnHostList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -42223,39 +42388,50 @@ func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi. } -// method id "compute.regionInstanceGroupManagers.resize": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *ProjectsListXpnHostsCall) Pages(ctx context.Context, f func(*XpnHostList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type RegionInstanceGroupManagersResizeCall struct { - s *Service - project string - region string - instanceGroupManager string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +// method id "compute.projects.moveDisk": + +type ProjectsMoveDiskCall struct { + s *Service + project string + diskmoverequest *DiskMoveRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Resize: Changes the intended size for the managed instance group. If -// you increase the size, the group schedules actions to create new -// instances using the current instance template. If you decrease the -// size, the group schedules delete actions on one or more instances. -// The resize operation is marked DONE when the resize actions are -// scheduled even if the group has not yet added or deleted any -// instances. You must separately verify the status of the creating or -// deleting actions with the listmanagedinstances method. -func (r *RegionInstanceGroupManagersService) Resize(project string, region string, instanceGroupManager string, size int64) *RegionInstanceGroupManagersResizeCall { - c := &RegionInstanceGroupManagersResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// MoveDisk: Moves a persistent disk from one zone to another. +func (r *ProjectsService) MoveDisk(project string, diskmoverequest *DiskMoveRequest) *ProjectsMoveDiskCall { + c := &ProjectsMoveDiskCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroupManager = instanceGroupManager - c.urlParams_.Set("size", fmt.Sprint(size)) + c.diskmoverequest = diskmoverequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersResizeCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersResizeCall { +func (c *ProjectsMoveDiskCall) Fields(s ...googleapi.Field) *ProjectsMoveDiskCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -42263,48 +42439,51 @@ func (c *RegionInstanceGroupManagersResizeCall) Fields(s ...googleapi.Field) *Re // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersResizeCall) Context(ctx context.Context) *RegionInstanceGroupManagersResizeCall { +func (c *ProjectsMoveDiskCall) Context(ctx context.Context) *ProjectsMoveDiskCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersResizeCall) Header() http.Header { +func (c *ProjectsMoveDiskCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersResizeCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsMoveDiskCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.diskmoverequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/moveDisk") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.resize" call. +// Do executes the "compute.projects.moveDisk" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsMoveDiskCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -42335,45 +42514,25 @@ func (c *RegionInstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.", + // "description": "Moves a persistent disk from one zone to another.", // "httpMethod": "POST", - // "id": "compute.regionInstanceGroupManagers.resize", + // "id": "compute.projects.moveDisk", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroupManager", - // "size" + // "project" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "Name of the managed instance group.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" - // }, - // "size": { - // "description": "Number of instances that should exist in this instance group manager.", - // "format": "int32", - // "location": "query", - // "minimum": "0", - // "required": true, - // "type": "integer" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize", + // "path": "{project}/moveDisk", + // "request": { + // "$ref": "DiskMoveRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -42385,35 +42544,30 @@ func (c *RegionInstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) } -// method id "compute.regionInstanceGroupManagers.setInstanceTemplate": +// method id "compute.projects.moveInstance": -type RegionInstanceGroupManagersSetInstanceTemplateCall struct { - s *Service - project string - region string - instanceGroupManager string - regioninstancegroupmanagerssettemplaterequest *RegionInstanceGroupManagersSetTemplateRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsMoveInstanceCall struct { + s *Service + project string + instancemoverequest *InstanceMoveRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetInstanceTemplate: Sets the instance template to use when creating -// new instances or recreating instances in this group. Existing -// instances are not affected. -func (r *RegionInstanceGroupManagersService) SetInstanceTemplate(project string, region string, instanceGroupManager string, regioninstancegroupmanagerssettemplaterequest *RegionInstanceGroupManagersSetTemplateRequest) *RegionInstanceGroupManagersSetInstanceTemplateCall { - c := &RegionInstanceGroupManagersSetInstanceTemplateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// MoveInstance: Moves an instance and its attached persistent disks +// from one zone to another. +func (r *ProjectsService) MoveInstance(project string, instancemoverequest *InstanceMoveRequest) *ProjectsMoveInstanceCall { + c := &ProjectsMoveInstanceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroupManager = instanceGroupManager - c.regioninstancegroupmanagerssettemplaterequest = regioninstancegroupmanagerssettemplaterequest + c.instancemoverequest = instancemoverequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersSetInstanceTemplateCall { +func (c *ProjectsMoveInstanceCall) Fields(s ...googleapi.Field) *ProjectsMoveInstanceCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -42421,53 +42575,51 @@ func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Fields(s ...googlea // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Context(ctx context.Context) *RegionInstanceGroupManagersSetInstanceTemplateCall { +func (c *ProjectsMoveInstanceCall) Context(ctx context.Context) *ProjectsMoveInstanceCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Header() http.Header { +func (c *ProjectsMoveInstanceCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsMoveInstanceCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettemplaterequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancemoverequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/moveInstance") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.setInstanceTemplate" call. +// Do executes the "compute.projects.moveInstance" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsMoveInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -42498,38 +42650,24 @@ func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleap } return ret, nil // { - // "description": "Sets the instance template to use when creating new instances or recreating instances in this group. Existing instances are not affected.", + // "description": "Moves an instance and its attached persistent disks from one zone to another.", // "httpMethod": "POST", - // "id": "compute.regionInstanceGroupManagers.setInstanceTemplate", + // "id": "compute.projects.moveInstance", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroupManager" + // "project" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "The name of the managed instance group.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate", + // "path": "{project}/moveInstance", // "request": { - // "$ref": "RegionInstanceGroupManagersSetTemplateRequest" + // "$ref": "InstanceMoveRequest" // }, // "response": { // "$ref": "Operation" @@ -42542,35 +42680,31 @@ func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleap } -// method id "compute.regionInstanceGroupManagers.setTargetPools": +// method id "compute.projects.setCommonInstanceMetadata": -type RegionInstanceGroupManagersSetTargetPoolsCall struct { - s *Service - project string - region string - instanceGroupManager string - regioninstancegroupmanagerssettargetpoolsrequest *RegionInstanceGroupManagersSetTargetPoolsRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsSetCommonInstanceMetadataCall struct { + s *Service + project string + metadata *Metadata + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetTargetPools: Modifies the target pools to which all new instances -// in this group are assigned. Existing instances in the group are not -// affected. -func (r *RegionInstanceGroupManagersService) SetTargetPools(project string, region string, instanceGroupManager string, regioninstancegroupmanagerssettargetpoolsrequest *RegionInstanceGroupManagersSetTargetPoolsRequest) *RegionInstanceGroupManagersSetTargetPoolsCall { - c := &RegionInstanceGroupManagersSetTargetPoolsCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetCommonInstanceMetadata: Sets metadata common to all instances +// within the specified project using the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/projects/setCommonInstanceMetadata +func (r *ProjectsService) SetCommonInstanceMetadata(project string, metadata *Metadata) *ProjectsSetCommonInstanceMetadataCall { + c := &ProjectsSetCommonInstanceMetadataCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroupManager = instanceGroupManager - c.regioninstancegroupmanagerssettargetpoolsrequest = regioninstancegroupmanagerssettargetpoolsrequest + c.metadata = metadata return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersSetTargetPoolsCall { +func (c *ProjectsSetCommonInstanceMetadataCall) Fields(s ...googleapi.Field) *ProjectsSetCommonInstanceMetadataCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -42578,53 +42712,51 @@ func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Fields(s ...googleapi.Fi // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Context(ctx context.Context) *RegionInstanceGroupManagersSetTargetPoolsCall { +func (c *ProjectsSetCommonInstanceMetadataCall) Context(ctx context.Context) *ProjectsSetCommonInstanceMetadataCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Header() http.Header { +func (c *ProjectsSetCommonInstanceMetadataCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupManagersSetTargetPoolsCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsSetCommonInstanceMetadataCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettargetpoolsrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/setCommonInstanceMetadata") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroupManager": c.instanceGroupManager, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroupManagers.setTargetPools" call. +// Do executes the "compute.projects.setCommonInstanceMetadata" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsSetCommonInstanceMetadataCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -42655,38 +42787,24 @@ func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.Cal } return ret, nil // { - // "description": "Modifies the target pools to which all new instances in this group are assigned. Existing instances in the group are not affected.", + // "description": "Sets metadata common to all instances within the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.regionInstanceGroupManagers.setTargetPools", + // "id": "compute.projects.setCommonInstanceMetadata", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroupManager" + // "project" // ], // "parameters": { - // "instanceGroupManager": { - // "description": "Name of the managed instance group.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools", + // "path": "{project}/setCommonInstanceMetadata", // "request": { - // "$ref": "RegionInstanceGroupManagersSetTargetPoolsRequest" + // "$ref": "Metadata" // }, // "response": { // "$ref": "Operation" @@ -42699,94 +42817,85 @@ func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.Cal } -// method id "compute.regionInstanceGroups.get": +// method id "compute.projects.setUsageExportBucket": -type RegionInstanceGroupsGetCall struct { - s *Service - project string - region string - instanceGroup string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type ProjectsSetUsageExportBucketCall struct { + s *Service + project string + usageexportlocation *UsageExportLocation + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified instance group resource. -func (r *RegionInstanceGroupsService) Get(project string, region string, instanceGroup string) *RegionInstanceGroupsGetCall { - c := &RegionInstanceGroupsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetUsageExportBucket: Enables the usage export feature and sets the +// usage export bucket where reports are stored. If you provide an empty +// request body using this method, the usage export feature will be +// disabled. +// For details, see https://cloud.google.com/compute/docs/reference/latest/projects/setUsageExportBucket +func (r *ProjectsService) SetUsageExportBucket(project string, usageexportlocation *UsageExportLocation) *ProjectsSetUsageExportBucketCall { + c := &ProjectsSetUsageExportBucketCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.instanceGroup = instanceGroup + c.usageexportlocation = usageexportlocation return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupsGetCall) Fields(s ...googleapi.Field) *RegionInstanceGroupsGetCall { +func (c *ProjectsSetUsageExportBucketCall) Fields(s ...googleapi.Field) *ProjectsSetUsageExportBucketCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RegionInstanceGroupsGetCall) IfNoneMatch(entityTag string) *RegionInstanceGroupsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupsGetCall) Context(ctx context.Context) *RegionInstanceGroupsGetCall { +func (c *ProjectsSetUsageExportBucketCall) Context(ctx context.Context) *ProjectsSetUsageExportBucketCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupsGetCall) Header() http.Header { +func (c *ProjectsSetUsageExportBucketCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupsGetCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsSetUsageExportBucketCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.usageexportlocation) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroups/{instanceGroup}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/setUsageExportBucket") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroup": c.instanceGroup, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroups.get" call. -// Exactly one of *InstanceGroup or error will be non-nil. Any non-2xx +// Do executes the "compute.projects.setUsageExportBucket" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *InstanceGroup.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *RegionInstanceGroupsGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroup, error) { +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsSetUsageExportBucketCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -42805,7 +42914,7 @@ func (c *RegionInstanceGroupsGetCall) Do(opts ...googleapi.CallOption) (*Instanc if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &InstanceGroup{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -42817,202 +42926,113 @@ func (c *RegionInstanceGroupsGetCall) Do(opts ...googleapi.CallOption) (*Instanc } return ret, nil // { - // "description": "Returns the specified instance group resource.", - // "httpMethod": "GET", - // "id": "compute.regionInstanceGroups.get", + // "description": "Enables the usage export feature and sets the usage export bucket where reports are stored. If you provide an empty request body using this method, the usage export feature will be disabled.", + // "httpMethod": "POST", + // "id": "compute.projects.setUsageExportBucket", // "parameterOrder": [ - // "project", - // "region", - // "instanceGroup" + // "project" // ], // "parameters": { - // "instanceGroup": { - // "description": "Name of the instance group resource to return.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroups/{instanceGroup}", + // "path": "{project}/setUsageExportBucket", + // "request": { + // "$ref": "UsageExportLocation" + // }, // "response": { - // "$ref": "InstanceGroup" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/devstorage.full_control", + // "https://www.googleapis.com/auth/devstorage.read_only", + // "https://www.googleapis.com/auth/devstorage.read_write" // ] // } } -// method id "compute.regionInstanceGroups.list": +// method id "compute.regionAutoscalers.delete": -type RegionInstanceGroupsListCall struct { - s *Service - project string - region string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type RegionAutoscalersDeleteCall struct { + s *Service + project string + region string + autoscaler string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// List: Retrieves the list of instance group resources contained within -// the specified region. -func (r *RegionInstanceGroupsService) List(project string, region string) *RegionInstanceGroupsListCall { - c := &RegionInstanceGroupsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified autoscaler. +func (r *RegionAutoscalersService) Delete(project string, region string, autoscaler string) *RegionAutoscalersDeleteCall { + c := &RegionAutoscalersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.region = region - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *RegionInstanceGroupsListCall) Filter(filter string) *RegionInstanceGroupsListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *RegionInstanceGroupsListCall) MaxResults(maxResults int64) *RegionInstanceGroupsListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *RegionInstanceGroupsListCall) OrderBy(orderBy string) *RegionInstanceGroupsListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *RegionInstanceGroupsListCall) PageToken(pageToken string) *RegionInstanceGroupsListCall { - c.urlParams_.Set("pageToken", pageToken) + c.autoscaler = autoscaler return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupsListCall) Fields(s ...googleapi.Field) *RegionInstanceGroupsListCall { +func (c *RegionAutoscalersDeleteCall) Fields(s ...googleapi.Field) *RegionAutoscalersDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RegionInstanceGroupsListCall) IfNoneMatch(entityTag string) *RegionInstanceGroupsListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupsListCall) Context(ctx context.Context) *RegionInstanceGroupsListCall { +func (c *RegionAutoscalersDeleteCall) Context(ctx context.Context) *RegionAutoscalersDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupsListCall) Header() http.Header { +func (c *RegionAutoscalersDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupsListCall) doRequest(alt string) (*http.Response, error) { +func (c *RegionAutoscalersDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroups") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers/{autoscaler}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, + "project": c.project, + "region": c.region, + "autoscaler": c.autoscaler, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroups.list" call. -// Exactly one of *RegionInstanceGroupList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *RegionInstanceGroupList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *RegionInstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*RegionInstanceGroupList, error) { +// Do executes the "compute.regionAutoscalers.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionAutoscalersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -43031,7 +43051,7 @@ func (c *RegionInstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*Region if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RegionInstanceGroupList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -43043,35 +43063,20 @@ func (c *RegionInstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*Region } return ret, nil // { - // "description": "Retrieves the list of instance group resources contained within the specified region.", - // "httpMethod": "GET", - // "id": "compute.regionInstanceGroups.list", + // "description": "Deletes the specified autoscaler.", + // "httpMethod": "DELETE", + // "id": "compute.regionAutoscalers.delete", // "parameterOrder": [ // "project", - // "region" + // "region", + // "autoscaler" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "autoscaler": { + // "description": "Name of the autoscaler to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, // "project": { @@ -43084,197 +43089,111 @@ func (c *RegionInstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*Region // "region": { // "description": "Name of the region scoping this request.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroups", + // "path": "{project}/regions/{region}/autoscalers/{autoscaler}", // "response": { - // "$ref": "RegionInstanceGroupList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *RegionInstanceGroupsListCall) Pages(ctx context.Context, f func(*RegionInstanceGroupList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.regionInstanceGroups.listInstances": +// method id "compute.regionAutoscalers.get": -type RegionInstanceGroupsListInstancesCall struct { - s *Service - project string - region string - instanceGroup string - regioninstancegroupslistinstancesrequest *RegionInstanceGroupsListInstancesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type RegionAutoscalersGetCall struct { + s *Service + project string + region string + autoscaler string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// ListInstances: Lists the instances in the specified instance group -// and displays information about the named ports. Depending on the -// specified options, this method can list all instances or only the -// instances that are running. -func (r *RegionInstanceGroupsService) ListInstances(project string, region string, instanceGroup string, regioninstancegroupslistinstancesrequest *RegionInstanceGroupsListInstancesRequest) *RegionInstanceGroupsListInstancesCall { - c := &RegionInstanceGroupsListInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified autoscaler. +func (r *RegionAutoscalersService) Get(project string, region string, autoscaler string) *RegionAutoscalersGetCall { + c := &RegionAutoscalersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.region = region - c.instanceGroup = instanceGroup - c.regioninstancegroupslistinstancesrequest = regioninstancegroupslistinstancesrequest - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *RegionInstanceGroupsListInstancesCall) Filter(filter string) *RegionInstanceGroupsListInstancesCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *RegionInstanceGroupsListInstancesCall) MaxResults(maxResults int64) *RegionInstanceGroupsListInstancesCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *RegionInstanceGroupsListInstancesCall) OrderBy(orderBy string) *RegionInstanceGroupsListInstancesCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *RegionInstanceGroupsListInstancesCall) PageToken(pageToken string) *RegionInstanceGroupsListInstancesCall { - c.urlParams_.Set("pageToken", pageToken) + c.autoscaler = autoscaler return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupsListInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupsListInstancesCall { +func (c *RegionAutoscalersGetCall) Fields(s ...googleapi.Field) *RegionAutoscalersGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionAutoscalersGetCall) IfNoneMatch(entityTag string) *RegionAutoscalersGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupsListInstancesCall) Context(ctx context.Context) *RegionInstanceGroupsListInstancesCall { +func (c *RegionAutoscalersGetCall) Context(ctx context.Context) *RegionAutoscalersGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupsListInstancesCall) Header() http.Header { +func (c *RegionAutoscalersGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupsListInstancesCall) doRequest(alt string) (*http.Response, error) { +func (c *RegionAutoscalersGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupslistinstancesrequest) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers/{autoscaler}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroup": c.instanceGroup, + "project": c.project, + "region": c.region, + "autoscaler": c.autoscaler, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroups.listInstances" call. -// Exactly one of *RegionInstanceGroupsListInstances or error will be -// non-nil. Any non-2xx status code is an error. Response headers are in -// either *RegionInstanceGroupsListInstances.ServerResponse.Header or -// (if a response was returned at all) in -// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check -// whether the returned error was because http.StatusNotModified was -// returned. -func (c *RegionInstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) (*RegionInstanceGroupsListInstances, error) { +// Do executes the "compute.regionAutoscalers.get" call. +// Exactly one of *Autoscaler or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Autoscaler.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionAutoscalersGetCall) Do(opts ...googleapi.CallOption) (*Autoscaler, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -43293,7 +43212,7 @@ func (c *RegionInstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RegionInstanceGroupsListInstances{ + ret := &Autoscaler{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -43305,64 +43224,40 @@ func (c *RegionInstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Lists the instances in the specified instance group and displays information about the named ports. Depending on the specified options, this method can list all instances or only the instances that are running.", - // "httpMethod": "POST", - // "id": "compute.regionInstanceGroups.listInstances", + // "description": "Returns the specified autoscaler.", + // "httpMethod": "GET", + // "id": "compute.regionAutoscalers.get", // "parameterOrder": [ // "project", // "region", - // "instanceGroup" + // "autoscaler" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", + // "autoscaler": { + // "description": "Name of the autoscaler to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, - // "instanceGroup": { - // "description": "Name of the regional instance group for which we want to list the instances.", + // "project": { + // "description": "Project ID for this request.", // "location": "path", - // "required": true, - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" // }, // "region": { // "description": "Name of the region scoping this request.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances", - // "request": { - // "$ref": "RegionInstanceGroupsListInstancesRequest" - // }, + // "path": "{project}/regions/{region}/autoscalers/{autoscaler}", // "response": { - // "$ref": "RegionInstanceGroupsListInstances" + // "$ref": "Autoscaler" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -43373,55 +43268,32 @@ func (c *RegionInstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *RegionInstanceGroupsListInstancesCall) Pages(ctx context.Context, f func(*RegionInstanceGroupsListInstances) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.regionInstanceGroups.setNamedPorts": +// method id "compute.regionAutoscalers.insert": -type RegionInstanceGroupsSetNamedPortsCall struct { - s *Service - project string - region string - instanceGroup string - regioninstancegroupssetnamedportsrequest *RegionInstanceGroupsSetNamedPortsRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type RegionAutoscalersInsertCall struct { + s *Service + project string + region string + autoscaler *Autoscaler + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetNamedPorts: Sets the named ports for the specified regional -// instance group. -func (r *RegionInstanceGroupsService) SetNamedPorts(project string, region string, instanceGroup string, regioninstancegroupssetnamedportsrequest *RegionInstanceGroupsSetNamedPortsRequest) *RegionInstanceGroupsSetNamedPortsCall { - c := &RegionInstanceGroupsSetNamedPortsCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates an autoscaler in the specified project using the data +// included in the request. +func (r *RegionAutoscalersService) Insert(project string, region string, autoscaler *Autoscaler) *RegionAutoscalersInsertCall { + c := &RegionAutoscalersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.region = region - c.instanceGroup = instanceGroup - c.regioninstancegroupssetnamedportsrequest = regioninstancegroupssetnamedportsrequest + c.autoscaler = autoscaler return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionInstanceGroupsSetNamedPortsCall) Fields(s ...googleapi.Field) *RegionInstanceGroupsSetNamedPortsCall { +func (c *RegionAutoscalersInsertCall) Fields(s ...googleapi.Field) *RegionAutoscalersInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -43429,53 +43301,52 @@ func (c *RegionInstanceGroupsSetNamedPortsCall) Fields(s ...googleapi.Field) *Re // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionInstanceGroupsSetNamedPortsCall) Context(ctx context.Context) *RegionInstanceGroupsSetNamedPortsCall { +func (c *RegionAutoscalersInsertCall) Context(ctx context.Context) *RegionAutoscalersInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionInstanceGroupsSetNamedPortsCall) Header() http.Header { +func (c *RegionAutoscalersInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionInstanceGroupsSetNamedPortsCall) doRequest(alt string) (*http.Response, error) { +func (c *RegionAutoscalersInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupssetnamedportsrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "instanceGroup": c.instanceGroup, + "project": c.project, + "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionInstanceGroups.setNamedPorts" call. +// Do executes the "compute.regionAutoscalers.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionInstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *RegionAutoscalersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -43506,21 +43377,14 @@ func (c *RegionInstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Sets the named ports for the specified regional instance group.", + // "description": "Creates an autoscaler in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.regionInstanceGroups.setNamedPorts", + // "id": "compute.regionAutoscalers.insert", // "parameterOrder": [ // "project", - // "region", - // "instanceGroup" + // "region" // ], // "parameters": { - // "instanceGroup": { - // "description": "The name of the regional instance group where the named ports are updated.", - // "location": "path", - // "required": true, - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -43531,13 +43395,14 @@ func (c *RegionInstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) // "region": { // "description": "Name of the region scoping this request.", // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts", + // "path": "{project}/regions/{region}/autoscalers", // "request": { - // "$ref": "RegionInstanceGroupsSetNamedPortsRequest" + // "$ref": "Autoscaler" // }, // "response": { // "$ref": "Operation" @@ -43550,292 +43415,9 @@ func (c *RegionInstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) } -// method id "compute.regionOperations.delete": - -type RegionOperationsDeleteCall struct { - s *Service - project string - region string - operation string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Delete: Deletes the specified region-specific Operations resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/regionOperations/delete -func (r *RegionOperationsService) Delete(project string, region string, operation string) *RegionOperationsDeleteCall { - c := &RegionOperationsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.region = region - c.operation = operation - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *RegionOperationsDeleteCall) Fields(s ...googleapi.Field) *RegionOperationsDeleteCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *RegionOperationsDeleteCall) Context(ctx context.Context) *RegionOperationsDeleteCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *RegionOperationsDeleteCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *RegionOperationsDeleteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations/{operation}") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "operation": c.operation, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.regionOperations.delete" call. -func (c *RegionOperationsDeleteCall) Do(opts ...googleapi.CallOption) error { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if err != nil { - return err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return err - } - return nil - // { - // "description": "Deletes the specified region-specific Operations resource.", - // "httpMethod": "DELETE", - // "id": "compute.regionOperations.delete", - // "parameterOrder": [ - // "project", - // "region", - // "operation" - // ], - // "parameters": { - // "operation": { - // "description": "Name of the Operations resource to delete.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/regions/{region}/operations/{operation}", - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.regionOperations.get": - -type RegionOperationsGetCall struct { - s *Service - project string - region string - operation string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} - -// Get: Retrieves the specified region-specific Operations resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/regionOperations/get -func (r *RegionOperationsService) Get(project string, region string, operation string) *RegionOperationsGetCall { - c := &RegionOperationsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.region = region - c.operation = operation - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *RegionOperationsGetCall) Fields(s ...googleapi.Field) *RegionOperationsGetCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RegionOperationsGetCall) IfNoneMatch(entityTag string) *RegionOperationsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *RegionOperationsGetCall) Context(ctx context.Context) *RegionOperationsGetCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *RegionOperationsGetCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *RegionOperationsGetCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations/{operation}") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "operation": c.operation, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.regionOperations.get" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *RegionOperationsGetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Retrieves the specified region-specific Operations resource.", - // "httpMethod": "GET", - // "id": "compute.regionOperations.get", - // "parameterOrder": [ - // "project", - // "region", - // "operation" - // ], - // "parameters": { - // "operation": { - // "description": "Name of the Operations resource to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/regions/{region}/operations/{operation}", - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" - // ] - // } - -} - -// method id "compute.regionOperations.list": +// method id "compute.regionAutoscalers.list": -type RegionOperationsListCall struct { +type RegionAutoscalersListCall struct { s *Service project string region string @@ -43845,20 +43427,18 @@ type RegionOperationsListCall struct { header_ http.Header } -// List: Retrieves a list of Operation resources contained within the -// specified region. -// For details, see https://cloud.google.com/compute/docs/reference/latest/regionOperations/list -func (r *RegionOperationsService) List(project string, region string) *RegionOperationsListCall { - c := &RegionOperationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of autoscalers contained within the specified +// region. +func (r *RegionAutoscalersService) List(project string, region string) *RegionAutoscalersListCall { + c := &RegionAutoscalersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -43870,7 +43450,7 @@ func (r *RegionOperationsService) List(project string, region string) *RegionOpe // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -43882,7 +43462,7 @@ func (r *RegionOperationsService) List(project string, region string) *RegionOpe // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *RegionOperationsListCall) Filter(filter string) *RegionOperationsListCall { +func (c *RegionAutoscalersListCall) Filter(filter string) *RegionAutoscalersListCall { c.urlParams_.Set("filter", filter) return c } @@ -43893,7 +43473,7 @@ func (c *RegionOperationsListCall) Filter(filter string) *RegionOperationsListCa // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *RegionOperationsListCall) MaxResults(maxResults int64) *RegionOperationsListCall { +func (c *RegionAutoscalersListCall) MaxResults(maxResults int64) *RegionAutoscalersListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -43910,7 +43490,7 @@ func (c *RegionOperationsListCall) MaxResults(maxResults int64) *RegionOperation // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *RegionOperationsListCall) OrderBy(orderBy string) *RegionOperationsListCall { +func (c *RegionAutoscalersListCall) OrderBy(orderBy string) *RegionAutoscalersListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -43918,7 +43498,7 @@ func (c *RegionOperationsListCall) OrderBy(orderBy string) *RegionOperationsList // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *RegionOperationsListCall) PageToken(pageToken string) *RegionOperationsListCall { +func (c *RegionAutoscalersListCall) PageToken(pageToken string) *RegionAutoscalersListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -43926,7 +43506,7 @@ func (c *RegionOperationsListCall) PageToken(pageToken string) *RegionOperations // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionOperationsListCall) Fields(s ...googleapi.Field) *RegionOperationsListCall { +func (c *RegionAutoscalersListCall) Fields(s ...googleapi.Field) *RegionAutoscalersListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -43936,7 +43516,7 @@ func (c *RegionOperationsListCall) Fields(s ...googleapi.Field) *RegionOperation // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *RegionOperationsListCall) IfNoneMatch(entityTag string) *RegionOperationsListCall { +func (c *RegionAutoscalersListCall) IfNoneMatch(entityTag string) *RegionAutoscalersListCall { c.ifNoneMatch_ = entityTag return c } @@ -43944,21 +43524,21 @@ func (c *RegionOperationsListCall) IfNoneMatch(entityTag string) *RegionOperatio // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionOperationsListCall) Context(ctx context.Context) *RegionOperationsListCall { +func (c *RegionAutoscalersListCall) Context(ctx context.Context) *RegionAutoscalersListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionOperationsListCall) Header() http.Header { +func (c *RegionAutoscalersListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionOperationsListCall) doRequest(alt string) (*http.Response, error) { +func (c *RegionAutoscalersListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -43969,7 +43549,7 @@ func (c *RegionOperationsListCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -43980,14 +43560,14 @@ func (c *RegionOperationsListCall) doRequest(alt string) (*http.Response, error) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regionOperations.list" call. -// Exactly one of *OperationList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *OperationList.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.regionAutoscalers.list" call. +// Exactly one of *RegionAutoscalerList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RegionAutoscalerList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *RegionOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationList, error) { +func (c *RegionAutoscalersListCall) Do(opts ...googleapi.CallOption) (*RegionAutoscalerList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -44006,7 +43586,7 @@ func (c *RegionOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &OperationList{ + ret := &RegionAutoscalerList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -44018,16 +43598,16 @@ func (c *RegionOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL } return ret, nil // { - // "description": "Retrieves a list of Operation resources contained within the specified region.", + // "description": "Retrieves a list of autoscalers contained within the specified region.", // "httpMethod": "GET", - // "id": "compute.regionOperations.list", + // "id": "compute.regionAutoscalers.list", // "parameterOrder": [ // "project", // "region" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -44057,16 +43637,16 @@ func (c *RegionOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL // "type": "string" // }, // "region": { - // "description": "Name of the region for this request.", + // "description": "Name of the region scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/operations", + // "path": "{project}/regions/{region}/autoscalers", // "response": { - // "$ref": "OperationList" + // "$ref": "RegionAutoscalerList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -44080,7 +43660,7 @@ func (c *RegionOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationL // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *RegionOperationsListCall) Pages(ctx context.Context, f func(*OperationList) error) error { +func (c *RegionAutoscalersListCall) Pages(ctx context.Context, f func(*RegionAutoscalerList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -44098,77 +43678,238 @@ func (c *RegionOperationsListCall) Pages(ctx context.Context, f func(*OperationL } } -// method id "compute.regions.get": +// method id "compute.regionAutoscalers.patch": -type RegionsGetCall struct { - s *Service - project string - region string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type RegionAutoscalersPatchCall struct { + s *Service + project string + region string + autoscaler *Autoscaler + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified Region resource. Get a list of available -// regions by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/regions/get -func (r *RegionsService) Get(project string, region string) *RegionsGetCall { - c := &RegionsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Patch: Updates an autoscaler in the specified project using the data +// included in the request. This method supports PATCH semantics and +// uses the JSON merge patch format and processing rules. +func (r *RegionAutoscalersService) Patch(project string, region string, autoscaler *Autoscaler) *RegionAutoscalersPatchCall { + c := &RegionAutoscalersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.region = region + c.autoscaler = autoscaler + return c +} + +// Autoscaler sets the optional parameter "autoscaler": Name of the +// autoscaler to patch. +func (c *RegionAutoscalersPatchCall) Autoscaler(autoscaler string) *RegionAutoscalersPatchCall { + c.urlParams_.Set("autoscaler", autoscaler) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionsGetCall) Fields(s ...googleapi.Field) *RegionsGetCall { +func (c *RegionAutoscalersPatchCall) Fields(s ...googleapi.Field) *RegionAutoscalersPatchCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RegionsGetCall) IfNoneMatch(entityTag string) *RegionsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionsGetCall) Context(ctx context.Context) *RegionsGetCall { +func (c *RegionAutoscalersPatchCall) Context(ctx context.Context) *RegionAutoscalersPatchCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionsGetCall) Header() http.Header { +func (c *RegionAutoscalersPatchCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionsGetCall) doRequest(alt string) (*http.Response, error) { +func (c *RegionAutoscalersPatchCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("PATCH", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionAutoscalers.patch" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionAutoscalersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates an autoscaler in the specified project using the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", + // "httpMethod": "PATCH", + // "id": "compute.regionAutoscalers.patch", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "autoscaler": { + // "description": "Name of the autoscaler to patch.", + // "location": "query", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/autoscalers", + // "request": { + // "$ref": "Autoscaler" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regionAutoscalers.update": + +type RegionAutoscalersUpdateCall struct { + s *Service + project string + region string + autoscaler *Autoscaler + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates an autoscaler in the specified project using the data +// included in the request. +func (r *RegionAutoscalersService) Update(project string, region string, autoscaler *Autoscaler) *RegionAutoscalersUpdateCall { + c := &RegionAutoscalersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.autoscaler = autoscaler + return c +} + +// Autoscaler sets the optional parameter "autoscaler": Name of the +// autoscaler to update. +func (c *RegionAutoscalersUpdateCall) Autoscaler(autoscaler string) *RegionAutoscalersUpdateCall { + c.urlParams_.Set("autoscaler", autoscaler) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionAutoscalersUpdateCall) Fields(s ...googleapi.Field) *RegionAutoscalersUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionAutoscalersUpdateCall) Context(ctx context.Context) *RegionAutoscalersUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionAutoscalersUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionAutoscalersUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v } + reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("PUT", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, @@ -44177,14 +43918,14 @@ func (c *RegionsGetCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regions.get" call. -// Exactly one of *Region or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Region.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *RegionsGetCall) Do(opts ...googleapi.CallOption) (*Region, error) { +// Do executes the "compute.regionAutoscalers.update" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionAutoscalersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -44203,7 +43944,7 @@ func (c *RegionsGetCall) Do(opts ...googleapi.CallOption) (*Region, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Region{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -44215,14 +43956,20 @@ func (c *RegionsGetCall) Do(opts ...googleapi.CallOption) (*Region, error) { } return ret, nil // { - // "description": "Returns the specified Region resource. Get a list of available regions by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.regions.get", + // "description": "Updates an autoscaler in the specified project using the data included in the request.", + // "httpMethod": "PUT", + // "id": "compute.regionAutoscalers.update", // "parameterOrder": [ // "project", // "region" // ], // "parameters": { + // "autoscaler": { + // "description": "Name of the autoscaler to update.", + // "location": "query", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -44231,178 +43978,7447 @@ func (c *RegionsGetCall) Do(opts ...googleapi.CallOption) (*Region, error) { // "type": "string" // }, // "region": { - // "description": "Name of the region resource to return.", + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/autoscalers", + // "request": { + // "$ref": "Autoscaler" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionBackendServices.delete": + +type RegionBackendServicesDeleteCall struct { + s *Service + project string + region string + backendService string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes the specified regional BackendService resource. +func (r *RegionBackendServicesService) Delete(project string, region string, backendService string) *RegionBackendServicesDeleteCall { + c := &RegionBackendServicesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.backendService = backendService + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionBackendServicesDeleteCall) Fields(s ...googleapi.Field) *RegionBackendServicesDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionBackendServicesDeleteCall) Context(ctx context.Context) *RegionBackendServicesDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionBackendServicesDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionBackendServicesDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "backendService": c.backendService, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionBackendServices.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionBackendServicesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Deletes the specified regional BackendService resource.", + // "httpMethod": "DELETE", + // "id": "compute.regionBackendServices.delete", + // "parameterOrder": [ + // "project", + // "region", + // "backendService" + // ], + // "parameters": { + // "backendService": { + // "description": "Name of the BackendService resource to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}", + // "path": "{project}/regions/{region}/backendServices/{backendService}", + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionBackendServices.get": + +type RegionBackendServicesGetCall struct { + s *Service + project string + region string + backendService string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns the specified regional BackendService resource. +func (r *RegionBackendServicesService) Get(project string, region string, backendService string) *RegionBackendServicesGetCall { + c := &RegionBackendServicesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.backendService = backendService + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionBackendServicesGetCall) Fields(s ...googleapi.Field) *RegionBackendServicesGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionBackendServicesGetCall) IfNoneMatch(entityTag string) *RegionBackendServicesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionBackendServicesGetCall) Context(ctx context.Context) *RegionBackendServicesGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionBackendServicesGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionBackendServicesGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "backendService": c.backendService, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionBackendServices.get" call. +// Exactly one of *BackendService or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *BackendService.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionBackendServicesGetCall) Do(opts ...googleapi.CallOption) (*BackendService, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &BackendService{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns the specified regional BackendService resource.", + // "httpMethod": "GET", + // "id": "compute.regionBackendServices.get", + // "parameterOrder": [ + // "project", + // "region", + // "backendService" + // ], + // "parameters": { + // "backendService": { + // "description": "Name of the BackendService resource to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/backendServices/{backendService}", + // "response": { + // "$ref": "BackendService" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regionBackendServices.getHealth": + +type RegionBackendServicesGetHealthCall struct { + s *Service + project string + region string + backendService string + resourcegroupreference *ResourceGroupReference + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// GetHealth: Gets the most recent health check results for this +// regional BackendService. +func (r *RegionBackendServicesService) GetHealth(project string, region string, backendService string, resourcegroupreference *ResourceGroupReference) *RegionBackendServicesGetHealthCall { + c := &RegionBackendServicesGetHealthCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.backendService = backendService + c.resourcegroupreference = resourcegroupreference + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionBackendServicesGetHealthCall) Fields(s ...googleapi.Field) *RegionBackendServicesGetHealthCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionBackendServicesGetHealthCall) Context(ctx context.Context) *RegionBackendServicesGetHealthCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionBackendServicesGetHealthCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionBackendServicesGetHealthCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}/getHealth") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "backendService": c.backendService, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionBackendServices.getHealth" call. +// Exactly one of *BackendServiceGroupHealth or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *BackendServiceGroupHealth.ServerResponse.Header or (if a response +// was returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionBackendServicesGetHealthCall) Do(opts ...googleapi.CallOption) (*BackendServiceGroupHealth, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &BackendServiceGroupHealth{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Gets the most recent health check results for this regional BackendService.", + // "httpMethod": "POST", + // "id": "compute.regionBackendServices.getHealth", + // "parameterOrder": [ + // "project", + // "region", + // "backendService" + // ], + // "parameters": { + // "backendService": { + // "description": "Name of the BackendService resource to which the queried instance belongs.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/backendServices/{backendService}/getHealth", + // "request": { + // "$ref": "ResourceGroupReference" + // }, + // "response": { + // "$ref": "BackendServiceGroupHealth" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regionBackendServices.insert": + +type RegionBackendServicesInsertCall struct { + s *Service + project string + region string + backendservice *BackendService + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Creates a regional BackendService resource in the specified +// project using the data included in the request. There are several +// restrictions and guidelines to keep in mind when creating a regional +// backend service. Read Restrictions and Guidelines for more +// information. +func (r *RegionBackendServicesService) Insert(project string, region string, backendservice *BackendService) *RegionBackendServicesInsertCall { + c := &RegionBackendServicesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.backendservice = backendservice + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionBackendServicesInsertCall) Fields(s ...googleapi.Field) *RegionBackendServicesInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionBackendServicesInsertCall) Context(ctx context.Context) *RegionBackendServicesInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionBackendServicesInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionBackendServicesInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionBackendServices.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionBackendServicesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Creates a regional BackendService resource in the specified project using the data included in the request. There are several restrictions and guidelines to keep in mind when creating a regional backend service. Read Restrictions and Guidelines for more information.", + // "httpMethod": "POST", + // "id": "compute.regionBackendServices.insert", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/backendServices", + // "request": { + // "$ref": "BackendService" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionBackendServices.list": + +type RegionBackendServicesListCall struct { + s *Service + project string + region string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Retrieves the list of regional BackendService resources +// available to the specified project in the given region. +func (r *RegionBackendServicesService) List(project string, region string) *RegionBackendServicesListCall { + c := &RegionBackendServicesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RegionBackendServicesListCall) Filter(filter string) *RegionBackendServicesListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RegionBackendServicesListCall) MaxResults(maxResults int64) *RegionBackendServicesListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RegionBackendServicesListCall) OrderBy(orderBy string) *RegionBackendServicesListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RegionBackendServicesListCall) PageToken(pageToken string) *RegionBackendServicesListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionBackendServicesListCall) Fields(s ...googleapi.Field) *RegionBackendServicesListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionBackendServicesListCall) IfNoneMatch(entityTag string) *RegionBackendServicesListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionBackendServicesListCall) Context(ctx context.Context) *RegionBackendServicesListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionBackendServicesListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionBackendServicesListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionBackendServices.list" call. +// Exactly one of *BackendServiceList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *BackendServiceList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionBackendServicesListCall) Do(opts ...googleapi.CallOption) (*BackendServiceList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &BackendServiceList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves the list of regional BackendService resources available to the specified project in the given region.", + // "httpMethod": "GET", + // "id": "compute.regionBackendServices.list", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/backendServices", + // "response": { + // "$ref": "BackendServiceList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RegionBackendServicesListCall) Pages(ctx context.Context, f func(*BackendServiceList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.regionBackendServices.patch": + +type RegionBackendServicesPatchCall struct { + s *Service + project string + region string + backendService string + backendservice *BackendService + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Updates the specified regional BackendService resource with +// the data included in the request. There are several restrictions and +// guidelines to keep in mind when updating a backend service. Read +// Restrictions and Guidelines for more information. This method +// supports PATCH semantics and uses the JSON merge patch format and +// processing rules. +func (r *RegionBackendServicesService) Patch(project string, region string, backendService string, backendservice *BackendService) *RegionBackendServicesPatchCall { + c := &RegionBackendServicesPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.backendService = backendService + c.backendservice = backendservice + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionBackendServicesPatchCall) Fields(s ...googleapi.Field) *RegionBackendServicesPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionBackendServicesPatchCall) Context(ctx context.Context) *RegionBackendServicesPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionBackendServicesPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionBackendServicesPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("PATCH", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "backendService": c.backendService, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionBackendServices.patch" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionBackendServicesPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", + // "httpMethod": "PATCH", + // "id": "compute.regionBackendServices.patch", + // "parameterOrder": [ + // "project", + // "region", + // "backendService" + // ], + // "parameters": { + // "backendService": { + // "description": "Name of the BackendService resource to patch.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/backendServices/{backendService}", + // "request": { + // "$ref": "BackendService" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regionBackendServices.update": + +type RegionBackendServicesUpdateCall struct { + s *Service + project string + region string + backendService string + backendservice *BackendService + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates the specified regional BackendService resource with +// the data included in the request. There are several restrictions and +// guidelines to keep in mind when updating a backend service. Read +// Restrictions and Guidelines for more information. +func (r *RegionBackendServicesService) Update(project string, region string, backendService string, backendservice *BackendService) *RegionBackendServicesUpdateCall { + c := &RegionBackendServicesUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.backendService = backendService + c.backendservice = backendservice + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionBackendServicesUpdateCall) Fields(s ...googleapi.Field) *RegionBackendServicesUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionBackendServicesUpdateCall) Context(ctx context.Context) *RegionBackendServicesUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionBackendServicesUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionBackendServicesUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("PUT", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "backendService": c.backendService, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionBackendServices.update" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionBackendServicesUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates the specified regional BackendService resource with the data included in the request. There are several restrictions and guidelines to keep in mind when updating a backend service. Read Restrictions and Guidelines for more information.", + // "httpMethod": "PUT", + // "id": "compute.regionBackendServices.update", + // "parameterOrder": [ + // "project", + // "region", + // "backendService" + // ], + // "parameters": { + // "backendService": { + // "description": "Name of the BackendService resource to update.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/backendServices/{backendService}", + // "request": { + // "$ref": "BackendService" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionCommitments.aggregatedList": + +type RegionCommitmentsAggregatedListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// AggregatedList: Retrieves an aggregated list of commitments. +func (r *RegionCommitmentsService) AggregatedList(project string) *RegionCommitmentsAggregatedListCall { + c := &RegionCommitmentsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RegionCommitmentsAggregatedListCall) Filter(filter string) *RegionCommitmentsAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RegionCommitmentsAggregatedListCall) MaxResults(maxResults int64) *RegionCommitmentsAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RegionCommitmentsAggregatedListCall) OrderBy(orderBy string) *RegionCommitmentsAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RegionCommitmentsAggregatedListCall) PageToken(pageToken string) *RegionCommitmentsAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionCommitmentsAggregatedListCall) Fields(s ...googleapi.Field) *RegionCommitmentsAggregatedListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionCommitmentsAggregatedListCall) IfNoneMatch(entityTag string) *RegionCommitmentsAggregatedListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionCommitmentsAggregatedListCall) Context(ctx context.Context) *RegionCommitmentsAggregatedListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionCommitmentsAggregatedListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionCommitmentsAggregatedListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/commitments") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionCommitments.aggregatedList" call. +// Exactly one of *CommitmentAggregatedList or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *CommitmentAggregatedList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionCommitmentsAggregatedListCall) Do(opts ...googleapi.CallOption) (*CommitmentAggregatedList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CommitmentAggregatedList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves an aggregated list of commitments.", + // "httpMethod": "GET", + // "id": "compute.regionCommitments.aggregatedList", + // "parameterOrder": [ + // "project" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/aggregated/commitments", + // "response": { + // "$ref": "CommitmentAggregatedList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RegionCommitmentsAggregatedListCall) Pages(ctx context.Context, f func(*CommitmentAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.regionCommitments.get": + +type RegionCommitmentsGetCall struct { + s *Service + project string + region string + commitment string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns the specified commitment resource. Get a list of +// available commitments by making a list() request. +func (r *RegionCommitmentsService) Get(project string, region string, commitment string) *RegionCommitmentsGetCall { + c := &RegionCommitmentsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.commitment = commitment + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionCommitmentsGetCall) Fields(s ...googleapi.Field) *RegionCommitmentsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionCommitmentsGetCall) IfNoneMatch(entityTag string) *RegionCommitmentsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionCommitmentsGetCall) Context(ctx context.Context) *RegionCommitmentsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionCommitmentsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionCommitmentsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/commitments/{commitment}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "commitment": c.commitment, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionCommitments.get" call. +// Exactly one of *Commitment or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Commitment.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionCommitmentsGetCall) Do(opts ...googleapi.CallOption) (*Commitment, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Commitment{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns the specified commitment resource. Get a list of available commitments by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.regionCommitments.get", + // "parameterOrder": [ + // "project", + // "region", + // "commitment" + // ], + // "parameters": { + // "commitment": { + // "description": "Name of the commitment to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/commitments/{commitment}", + // "response": { + // "$ref": "Commitment" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regionCommitments.insert": + +type RegionCommitmentsInsertCall struct { + s *Service + project string + region string + commitment *Commitment + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Creates a commitment in the specified project using the data +// included in the request. +func (r *RegionCommitmentsService) Insert(project string, region string, commitment *Commitment) *RegionCommitmentsInsertCall { + c := &RegionCommitmentsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.commitment = commitment + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionCommitmentsInsertCall) Fields(s ...googleapi.Field) *RegionCommitmentsInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionCommitmentsInsertCall) Context(ctx context.Context) *RegionCommitmentsInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionCommitmentsInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionCommitmentsInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.commitment) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/commitments") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionCommitments.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionCommitmentsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Creates a commitment in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.regionCommitments.insert", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/commitments", + // "request": { + // "$ref": "Commitment" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionCommitments.list": + +type RegionCommitmentsListCall struct { + s *Service + project string + region string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Retrieves a list of commitments contained within the specified +// region. +func (r *RegionCommitmentsService) List(project string, region string) *RegionCommitmentsListCall { + c := &RegionCommitmentsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RegionCommitmentsListCall) Filter(filter string) *RegionCommitmentsListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RegionCommitmentsListCall) MaxResults(maxResults int64) *RegionCommitmentsListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RegionCommitmentsListCall) OrderBy(orderBy string) *RegionCommitmentsListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RegionCommitmentsListCall) PageToken(pageToken string) *RegionCommitmentsListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionCommitmentsListCall) Fields(s ...googleapi.Field) *RegionCommitmentsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionCommitmentsListCall) IfNoneMatch(entityTag string) *RegionCommitmentsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionCommitmentsListCall) Context(ctx context.Context) *RegionCommitmentsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionCommitmentsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionCommitmentsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/commitments") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionCommitments.list" call. +// Exactly one of *CommitmentList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *CommitmentList.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionCommitmentsListCall) Do(opts ...googleapi.CallOption) (*CommitmentList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &CommitmentList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves a list of commitments contained within the specified region.", + // "httpMethod": "GET", + // "id": "compute.regionCommitments.list", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/commitments", + // "response": { + // "$ref": "CommitmentList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RegionCommitmentsListCall) Pages(ctx context.Context, f func(*CommitmentList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.regionInstanceGroupManagers.abandonInstances": + +type RegionInstanceGroupManagersAbandonInstancesCall struct { + s *Service + project string + region string + instanceGroupManager string + regioninstancegroupmanagersabandoninstancesrequest *RegionInstanceGroupManagersAbandonInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// AbandonInstances: Schedules a group action to remove the specified +// instances from the managed instance group. Abandoning an instance +// does not delete the instance, but it does remove the instance from +// any target pools that are applied by the managed instance group. This +// method reduces the targetSize of the managed instance group by the +// number of instances that you abandon. This operation is marked as +// DONE when the action is scheduled even if the instances have not yet +// been removed from the group. You must separately verify the status of +// the abandoning action with the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// +// You can specify a maximum of 1000 instances with this method per +// request. +func (r *RegionInstanceGroupManagersService) AbandonInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersabandoninstancesrequest *RegionInstanceGroupManagersAbandonInstancesRequest) *RegionInstanceGroupManagersAbandonInstancesCall { + c := &RegionInstanceGroupManagersAbandonInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + c.regioninstancegroupmanagersabandoninstancesrequest = regioninstancegroupmanagersabandoninstancesrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersAbandonInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersAbandonInstancesCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersAbandonInstancesCall) Context(ctx context.Context) *RegionInstanceGroupManagersAbandonInstancesCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersAbandonInstancesCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersAbandonInstancesCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersabandoninstancesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.abandonInstances" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersAbandonInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Schedules a group action to remove the specified instances from the managed instance group. Abandoning an instance does not delete the instance, but it does remove the instance from any target pools that are applied by the managed instance group. This method reduces the targetSize of the managed instance group by the number of instances that you abandon. This operation is marked as DONE when the action is scheduled even if the instances have not yet been removed from the group. You must separately verify the status of the abandoning action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.abandonInstances", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "Name of the managed instance group.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances", + // "request": { + // "$ref": "RegionInstanceGroupManagersAbandonInstancesRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionInstanceGroupManagers.delete": + +type RegionInstanceGroupManagersDeleteCall struct { + s *Service + project string + region string + instanceGroupManager string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes the specified managed instance group and all of the +// instances in that group. +func (r *RegionInstanceGroupManagersService) Delete(project string, region string, instanceGroupManager string) *RegionInstanceGroupManagersDeleteCall { + c := &RegionInstanceGroupManagersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersDeleteCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersDeleteCall) Context(ctx context.Context) *RegionInstanceGroupManagersDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Deletes the specified managed instance group and all of the instances in that group.", + // "httpMethod": "DELETE", + // "id": "compute.regionInstanceGroupManagers.delete", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "Name of the managed instance group to delete.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionInstanceGroupManagers.deleteInstances": + +type RegionInstanceGroupManagersDeleteInstancesCall struct { + s *Service + project string + region string + instanceGroupManager string + regioninstancegroupmanagersdeleteinstancesrequest *RegionInstanceGroupManagersDeleteInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// DeleteInstances: Schedules a group action to delete the specified +// instances in the managed instance group. The instances are also +// removed from any target pools of which they were a member. This +// method reduces the targetSize of the managed instance group by the +// number of instances that you delete. This operation is marked as DONE +// when the action is scheduled even if the instances are still being +// deleted. You must separately verify the status of the deleting action +// with the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// +// You can specify a maximum of 1000 instances with this method per +// request. +func (r *RegionInstanceGroupManagersService) DeleteInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersdeleteinstancesrequest *RegionInstanceGroupManagersDeleteInstancesRequest) *RegionInstanceGroupManagersDeleteInstancesCall { + c := &RegionInstanceGroupManagersDeleteInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + c.regioninstancegroupmanagersdeleteinstancesrequest = regioninstancegroupmanagersdeleteinstancesrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersDeleteInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersDeleteInstancesCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersDeleteInstancesCall) Context(ctx context.Context) *RegionInstanceGroupManagersDeleteInstancesCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersDeleteInstancesCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersDeleteInstancesCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersdeleteinstancesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.deleteInstances" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersDeleteInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Schedules a group action to delete the specified instances in the managed instance group. The instances are also removed from any target pools of which they were a member. This method reduces the targetSize of the managed instance group by the number of instances that you delete. This operation is marked as DONE when the action is scheduled even if the instances are still being deleted. You must separately verify the status of the deleting action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.deleteInstances", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "Name of the managed instance group.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances", + // "request": { + // "$ref": "RegionInstanceGroupManagersDeleteInstancesRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionInstanceGroupManagers.get": + +type RegionInstanceGroupManagersGetCall struct { + s *Service + project string + region string + instanceGroupManager string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns all of the details about the specified managed instance +// group. +func (r *RegionInstanceGroupManagersService) Get(project string, region string, instanceGroupManager string) *RegionInstanceGroupManagersGetCall { + c := &RegionInstanceGroupManagersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersGetCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionInstanceGroupManagersGetCall) IfNoneMatch(entityTag string) *RegionInstanceGroupManagersGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersGetCall) Context(ctx context.Context) *RegionInstanceGroupManagersGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.get" call. +// Exactly one of *InstanceGroupManager or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *InstanceGroupManager.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroupManager, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &InstanceGroupManager{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns all of the details about the specified managed instance group.", + // "httpMethod": "GET", + // "id": "compute.regionInstanceGroupManagers.get", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "Name of the managed instance group to return.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}", + // "response": { + // "$ref": "InstanceGroupManager" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regionInstanceGroupManagers.insert": + +type RegionInstanceGroupManagersInsertCall struct { + s *Service + project string + region string + instancegroupmanager *InstanceGroupManager + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Creates a managed instance group using the information that +// you specify in the request. After the group is created, it schedules +// an action to create instances in the group using the specified +// instance template. This operation is marked as DONE when the group is +// created even if the instances in the group have not yet been created. +// You must separately verify the status of the individual instances +// with the listmanagedinstances method. +// +// A regional managed instance group can contain up to 2000 instances. +func (r *RegionInstanceGroupManagersService) Insert(project string, region string, instancegroupmanager *InstanceGroupManager) *RegionInstanceGroupManagersInsertCall { + c := &RegionInstanceGroupManagersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instancegroupmanager = instancegroupmanager + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersInsertCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersInsertCall) Context(ctx context.Context) *RegionInstanceGroupManagersInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Creates a managed instance group using the information that you specify in the request. After the group is created, it schedules an action to create instances in the group using the specified instance template. This operation is marked as DONE when the group is created even if the instances in the group have not yet been created. You must separately verify the status of the individual instances with the listmanagedinstances method.\n\nA regional managed instance group can contain up to 2000 instances.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.insert", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers", + // "request": { + // "$ref": "InstanceGroupManager" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionInstanceGroupManagers.list": + +type RegionInstanceGroupManagersListCall struct { + s *Service + project string + region string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Retrieves the list of managed instance groups that are +// contained within the specified region. +func (r *RegionInstanceGroupManagersService) List(project string, region string) *RegionInstanceGroupManagersListCall { + c := &RegionInstanceGroupManagersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RegionInstanceGroupManagersListCall) Filter(filter string) *RegionInstanceGroupManagersListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RegionInstanceGroupManagersListCall) MaxResults(maxResults int64) *RegionInstanceGroupManagersListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RegionInstanceGroupManagersListCall) OrderBy(orderBy string) *RegionInstanceGroupManagersListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RegionInstanceGroupManagersListCall) PageToken(pageToken string) *RegionInstanceGroupManagersListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersListCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionInstanceGroupManagersListCall) IfNoneMatch(entityTag string) *RegionInstanceGroupManagersListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersListCall) Context(ctx context.Context) *RegionInstanceGroupManagersListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.list" call. +// Exactly one of *RegionInstanceGroupManagerList or error will be +// non-nil. Any non-2xx status code is an error. Response headers are in +// either *RegionInstanceGroupManagerList.ServerResponse.Header or (if a +// response was returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersListCall) Do(opts ...googleapi.CallOption) (*RegionInstanceGroupManagerList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RegionInstanceGroupManagerList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves the list of managed instance groups that are contained within the specified region.", + // "httpMethod": "GET", + // "id": "compute.regionInstanceGroupManagers.list", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers", + // "response": { + // "$ref": "RegionInstanceGroupManagerList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RegionInstanceGroupManagersListCall) Pages(ctx context.Context, f func(*RegionInstanceGroupManagerList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.regionInstanceGroupManagers.listManagedInstances": + +type RegionInstanceGroupManagersListManagedInstancesCall struct { + s *Service + project string + region string + instanceGroupManager string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// ListManagedInstances: Lists the instances in the managed instance +// group and instances that are scheduled to be created. The list +// includes any current actions that the group has scheduled for its +// instances. +func (r *RegionInstanceGroupManagersService) ListManagedInstances(project string, region string, instanceGroupManager string) *RegionInstanceGroupManagersListManagedInstancesCall { + c := &RegionInstanceGroupManagersListManagedInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + return c +} + +// Filter sets the optional parameter "filter": +func (c *RegionInstanceGroupManagersListManagedInstancesCall) Filter(filter string) *RegionInstanceGroupManagersListManagedInstancesCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": +func (c *RegionInstanceGroupManagersListManagedInstancesCall) MaxResults(maxResults int64) *RegionInstanceGroupManagersListManagedInstancesCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "order_by": +func (c *RegionInstanceGroupManagersListManagedInstancesCall) OrderBy(orderBy string) *RegionInstanceGroupManagersListManagedInstancesCall { + c.urlParams_.Set("order_by", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": +func (c *RegionInstanceGroupManagersListManagedInstancesCall) PageToken(pageToken string) *RegionInstanceGroupManagersListManagedInstancesCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersListManagedInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersListManagedInstancesCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersListManagedInstancesCall) Context(ctx context.Context) *RegionInstanceGroupManagersListManagedInstancesCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersListManagedInstancesCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersListManagedInstancesCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.listManagedInstances" call. +// Exactly one of *RegionInstanceGroupManagersListInstancesResponse or +// error will be non-nil. Any non-2xx status code is an error. Response +// headers are in either +// *RegionInstanceGroupManagersListInstancesResponse.ServerResponse.Heade +// r or (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *RegionInstanceGroupManagersListManagedInstancesCall) Do(opts ...googleapi.CallOption) (*RegionInstanceGroupManagersListInstancesResponse, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RegionInstanceGroupManagersListInstancesResponse{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists the instances in the managed instance group and instances that are scheduled to be created. The list includes any current actions that the group has scheduled for its instances.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.listManagedInstances", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "filter": { + // "location": "query", + // "type": "string" + // }, + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "order_by": { + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances", + // "response": { + // "$ref": "RegionInstanceGroupManagersListInstancesResponse" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regionInstanceGroupManagers.recreateInstances": + +type RegionInstanceGroupManagersRecreateInstancesCall struct { + s *Service + project string + region string + instanceGroupManager string + regioninstancegroupmanagersrecreaterequest *RegionInstanceGroupManagersRecreateRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// RecreateInstances: Schedules a group action to recreate the specified +// instances in the managed instance group. The instances are deleted +// and recreated using the current instance template for the managed +// instance group. This operation is marked as DONE when the action is +// scheduled even if the instances have not yet been recreated. You must +// separately verify the status of the recreating action with the +// listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or +// deleted. +// +// You can specify a maximum of 1000 instances with this method per +// request. +func (r *RegionInstanceGroupManagersService) RecreateInstances(project string, region string, instanceGroupManager string, regioninstancegroupmanagersrecreaterequest *RegionInstanceGroupManagersRecreateRequest) *RegionInstanceGroupManagersRecreateInstancesCall { + c := &RegionInstanceGroupManagersRecreateInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + c.regioninstancegroupmanagersrecreaterequest = regioninstancegroupmanagersrecreaterequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersRecreateInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersRecreateInstancesCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersRecreateInstancesCall) Context(ctx context.Context) *RegionInstanceGroupManagersRecreateInstancesCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersRecreateInstancesCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersRecreateInstancesCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersrecreaterequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.recreateInstances" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersRecreateInstancesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Schedules a group action to recreate the specified instances in the managed instance group. The instances are deleted and recreated using the current instance template for the managed instance group. This operation is marked as DONE when the action is scheduled even if the instances have not yet been recreated. You must separately verify the status of the recreating action with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.\n\nYou can specify a maximum of 1000 instances with this method per request.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.recreateInstances", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "Name of the managed instance group.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances", + // "request": { + // "$ref": "RegionInstanceGroupManagersRecreateRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionInstanceGroupManagers.resize": + +type RegionInstanceGroupManagersResizeCall struct { + s *Service + project string + region string + instanceGroupManager string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Resize: Changes the intended size for the managed instance group. If +// you increase the size, the group schedules actions to create new +// instances using the current instance template. If you decrease the +// size, the group schedules delete actions on one or more instances. +// The resize operation is marked DONE when the resize actions are +// scheduled even if the group has not yet added or deleted any +// instances. You must separately verify the status of the creating or +// deleting actions with the listmanagedinstances method. +// +// If the group is part of a backend service that has enabled connection +// draining, it can take up to 60 seconds after the connection draining +// duration has elapsed before the VM instance is removed or deleted. +func (r *RegionInstanceGroupManagersService) Resize(project string, region string, instanceGroupManager string, size int64) *RegionInstanceGroupManagersResizeCall { + c := &RegionInstanceGroupManagersResizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + c.urlParams_.Set("size", fmt.Sprint(size)) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersResizeCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersResizeCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersResizeCall) Context(ctx context.Context) *RegionInstanceGroupManagersResizeCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersResizeCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersResizeCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.resize" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersResizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Changes the intended size for the managed instance group. If you increase the size, the group schedules actions to create new instances using the current instance template. If you decrease the size, the group schedules delete actions on one or more instances. The resize operation is marked DONE when the resize actions are scheduled even if the group has not yet added or deleted any instances. You must separately verify the status of the creating or deleting actions with the listmanagedinstances method.\n\nIf the group is part of a backend service that has enabled connection draining, it can take up to 60 seconds after the connection draining duration has elapsed before the VM instance is removed or deleted.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.resize", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager", + // "size" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "Name of the managed instance group.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "size": { + // "description": "Number of instances that should exist in this instance group manager.", + // "format": "int32", + // "location": "query", + // "minimum": "0", + // "required": true, + // "type": "integer" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize", + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionInstanceGroupManagers.setInstanceTemplate": + +type RegionInstanceGroupManagersSetInstanceTemplateCall struct { + s *Service + project string + region string + instanceGroupManager string + regioninstancegroupmanagerssettemplaterequest *RegionInstanceGroupManagersSetTemplateRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetInstanceTemplate: Sets the instance template to use when creating +// new instances or recreating instances in this group. Existing +// instances are not affected. +func (r *RegionInstanceGroupManagersService) SetInstanceTemplate(project string, region string, instanceGroupManager string, regioninstancegroupmanagerssettemplaterequest *RegionInstanceGroupManagersSetTemplateRequest) *RegionInstanceGroupManagersSetInstanceTemplateCall { + c := &RegionInstanceGroupManagersSetInstanceTemplateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + c.regioninstancegroupmanagerssettemplaterequest = regioninstancegroupmanagerssettemplaterequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersSetInstanceTemplateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Context(ctx context.Context) *RegionInstanceGroupManagersSetInstanceTemplateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettemplaterequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.setInstanceTemplate" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersSetInstanceTemplateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the instance template to use when creating new instances or recreating instances in this group. Existing instances are not affected.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.setInstanceTemplate", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "The name of the managed instance group.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate", + // "request": { + // "$ref": "RegionInstanceGroupManagersSetTemplateRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionInstanceGroupManagers.setTargetPools": + +type RegionInstanceGroupManagersSetTargetPoolsCall struct { + s *Service + project string + region string + instanceGroupManager string + regioninstancegroupmanagerssettargetpoolsrequest *RegionInstanceGroupManagersSetTargetPoolsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetTargetPools: Modifies the target pools to which all new instances +// in this group are assigned. Existing instances in the group are not +// affected. +func (r *RegionInstanceGroupManagersService) SetTargetPools(project string, region string, instanceGroupManager string, regioninstancegroupmanagerssettargetpoolsrequest *RegionInstanceGroupManagersSetTargetPoolsRequest) *RegionInstanceGroupManagersSetTargetPoolsCall { + c := &RegionInstanceGroupManagersSetTargetPoolsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroupManager = instanceGroupManager + c.regioninstancegroupmanagerssettargetpoolsrequest = regioninstancegroupmanagerssettargetpoolsrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Fields(s ...googleapi.Field) *RegionInstanceGroupManagersSetTargetPoolsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Context(ctx context.Context) *RegionInstanceGroupManagersSetTargetPoolsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupManagersSetTargetPoolsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettargetpoolsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroupManager": c.instanceGroupManager, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroupManagers.setTargetPools" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupManagersSetTargetPoolsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Modifies the target pools to which all new instances in this group are assigned. Existing instances in the group are not affected.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroupManagers.setTargetPools", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroupManager" + // ], + // "parameters": { + // "instanceGroupManager": { + // "description": "Name of the managed instance group.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools", + // "request": { + // "$ref": "RegionInstanceGroupManagersSetTargetPoolsRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionInstanceGroups.get": + +type RegionInstanceGroupsGetCall struct { + s *Service + project string + region string + instanceGroup string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns the specified instance group resource. +func (r *RegionInstanceGroupsService) Get(project string, region string, instanceGroup string) *RegionInstanceGroupsGetCall { + c := &RegionInstanceGroupsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroup = instanceGroup + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupsGetCall) Fields(s ...googleapi.Field) *RegionInstanceGroupsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionInstanceGroupsGetCall) IfNoneMatch(entityTag string) *RegionInstanceGroupsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupsGetCall) Context(ctx context.Context) *RegionInstanceGroupsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroups/{instanceGroup}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroup": c.instanceGroup, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroups.get" call. +// Exactly one of *InstanceGroup or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *InstanceGroup.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionInstanceGroupsGetCall) Do(opts ...googleapi.CallOption) (*InstanceGroup, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &InstanceGroup{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns the specified instance group resource.", + // "httpMethod": "GET", + // "id": "compute.regionInstanceGroups.get", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroup" + // ], + // "parameters": { + // "instanceGroup": { + // "description": "Name of the instance group resource to return.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroups/{instanceGroup}", + // "response": { + // "$ref": "InstanceGroup" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regionInstanceGroups.list": + +type RegionInstanceGroupsListCall struct { + s *Service + project string + region string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Retrieves the list of instance group resources contained within +// the specified region. +func (r *RegionInstanceGroupsService) List(project string, region string) *RegionInstanceGroupsListCall { + c := &RegionInstanceGroupsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RegionInstanceGroupsListCall) Filter(filter string) *RegionInstanceGroupsListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RegionInstanceGroupsListCall) MaxResults(maxResults int64) *RegionInstanceGroupsListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RegionInstanceGroupsListCall) OrderBy(orderBy string) *RegionInstanceGroupsListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RegionInstanceGroupsListCall) PageToken(pageToken string) *RegionInstanceGroupsListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupsListCall) Fields(s ...googleapi.Field) *RegionInstanceGroupsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionInstanceGroupsListCall) IfNoneMatch(entityTag string) *RegionInstanceGroupsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupsListCall) Context(ctx context.Context) *RegionInstanceGroupsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroups") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroups.list" call. +// Exactly one of *RegionInstanceGroupList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RegionInstanceGroupList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionInstanceGroupsListCall) Do(opts ...googleapi.CallOption) (*RegionInstanceGroupList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RegionInstanceGroupList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves the list of instance group resources contained within the specified region.", + // "httpMethod": "GET", + // "id": "compute.regionInstanceGroups.list", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroups", + // "response": { + // "$ref": "RegionInstanceGroupList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RegionInstanceGroupsListCall) Pages(ctx context.Context, f func(*RegionInstanceGroupList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.regionInstanceGroups.listInstances": + +type RegionInstanceGroupsListInstancesCall struct { + s *Service + project string + region string + instanceGroup string + regioninstancegroupslistinstancesrequest *RegionInstanceGroupsListInstancesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// ListInstances: Lists the instances in the specified instance group +// and displays information about the named ports. Depending on the +// specified options, this method can list all instances or only the +// instances that are running. +func (r *RegionInstanceGroupsService) ListInstances(project string, region string, instanceGroup string, regioninstancegroupslistinstancesrequest *RegionInstanceGroupsListInstancesRequest) *RegionInstanceGroupsListInstancesCall { + c := &RegionInstanceGroupsListInstancesCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroup = instanceGroup + c.regioninstancegroupslistinstancesrequest = regioninstancegroupslistinstancesrequest + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RegionInstanceGroupsListInstancesCall) Filter(filter string) *RegionInstanceGroupsListInstancesCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RegionInstanceGroupsListInstancesCall) MaxResults(maxResults int64) *RegionInstanceGroupsListInstancesCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RegionInstanceGroupsListInstancesCall) OrderBy(orderBy string) *RegionInstanceGroupsListInstancesCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RegionInstanceGroupsListInstancesCall) PageToken(pageToken string) *RegionInstanceGroupsListInstancesCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupsListInstancesCall) Fields(s ...googleapi.Field) *RegionInstanceGroupsListInstancesCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupsListInstancesCall) Context(ctx context.Context) *RegionInstanceGroupsListInstancesCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupsListInstancesCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupsListInstancesCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupslistinstancesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroup": c.instanceGroup, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroups.listInstances" call. +// Exactly one of *RegionInstanceGroupsListInstances or error will be +// non-nil. Any non-2xx status code is an error. Response headers are in +// either *RegionInstanceGroupsListInstances.ServerResponse.Header or +// (if a response was returned at all) in +// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check +// whether the returned error was because http.StatusNotModified was +// returned. +func (c *RegionInstanceGroupsListInstancesCall) Do(opts ...googleapi.CallOption) (*RegionInstanceGroupsListInstances, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RegionInstanceGroupsListInstances{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists the instances in the specified instance group and displays information about the named ports. Depending on the specified options, this method can list all instances or only the instances that are running.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroups.listInstances", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroup" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "instanceGroup": { + // "description": "Name of the regional instance group for which we want to list the instances.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances", + // "request": { + // "$ref": "RegionInstanceGroupsListInstancesRequest" + // }, + // "response": { + // "$ref": "RegionInstanceGroupsListInstances" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RegionInstanceGroupsListInstancesCall) Pages(ctx context.Context, f func(*RegionInstanceGroupsListInstances) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.regionInstanceGroups.setNamedPorts": + +type RegionInstanceGroupsSetNamedPortsCall struct { + s *Service + project string + region string + instanceGroup string + regioninstancegroupssetnamedportsrequest *RegionInstanceGroupsSetNamedPortsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetNamedPorts: Sets the named ports for the specified regional +// instance group. +func (r *RegionInstanceGroupsService) SetNamedPorts(project string, region string, instanceGroup string, regioninstancegroupssetnamedportsrequest *RegionInstanceGroupsSetNamedPortsRequest) *RegionInstanceGroupsSetNamedPortsCall { + c := &RegionInstanceGroupsSetNamedPortsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.instanceGroup = instanceGroup + c.regioninstancegroupssetnamedportsrequest = regioninstancegroupssetnamedportsrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionInstanceGroupsSetNamedPortsCall) Fields(s ...googleapi.Field) *RegionInstanceGroupsSetNamedPortsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionInstanceGroupsSetNamedPortsCall) Context(ctx context.Context) *RegionInstanceGroupsSetNamedPortsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionInstanceGroupsSetNamedPortsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionInstanceGroupsSetNamedPortsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupssetnamedportsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "instanceGroup": c.instanceGroup, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionInstanceGroups.setNamedPorts" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionInstanceGroupsSetNamedPortsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the named ports for the specified regional instance group.", + // "httpMethod": "POST", + // "id": "compute.regionInstanceGroups.setNamedPorts", + // "parameterOrder": [ + // "project", + // "region", + // "instanceGroup" + // ], + // "parameters": { + // "instanceGroup": { + // "description": "The name of the regional instance group where the named ports are updated.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts", + // "request": { + // "$ref": "RegionInstanceGroupsSetNamedPortsRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionOperations.delete": + +type RegionOperationsDeleteCall struct { + s *Service + project string + region string + operation string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes the specified region-specific Operations resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/regionOperations/delete +func (r *RegionOperationsService) Delete(project string, region string, operation string) *RegionOperationsDeleteCall { + c := &RegionOperationsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.operation = operation + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionOperationsDeleteCall) Fields(s ...googleapi.Field) *RegionOperationsDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionOperationsDeleteCall) Context(ctx context.Context) *RegionOperationsDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionOperationsDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionOperationsDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations/{operation}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "operation": c.operation, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionOperations.delete" call. +func (c *RegionOperationsDeleteCall) Do(opts ...googleapi.CallOption) error { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if err != nil { + return err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return err + } + return nil + // { + // "description": "Deletes the specified region-specific Operations resource.", + // "httpMethod": "DELETE", + // "id": "compute.regionOperations.delete", + // "parameterOrder": [ + // "project", + // "region", + // "operation" + // ], + // "parameters": { + // "operation": { + // "description": "Name of the Operations resource to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/operations/{operation}", + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.regionOperations.get": + +type RegionOperationsGetCall struct { + s *Service + project string + region string + operation string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Retrieves the specified region-specific Operations resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/regionOperations/get +func (r *RegionOperationsService) Get(project string, region string, operation string) *RegionOperationsGetCall { + c := &RegionOperationsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.operation = operation + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionOperationsGetCall) Fields(s ...googleapi.Field) *RegionOperationsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionOperationsGetCall) IfNoneMatch(entityTag string) *RegionOperationsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionOperationsGetCall) Context(ctx context.Context) *RegionOperationsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionOperationsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionOperationsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations/{operation}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "operation": c.operation, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionOperations.get" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionOperationsGetCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves the specified region-specific Operations resource.", + // "httpMethod": "GET", + // "id": "compute.regionOperations.get", + // "parameterOrder": [ + // "project", + // "region", + // "operation" + // ], + // "parameters": { + // "operation": { + // "description": "Name of the Operations resource to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/operations/{operation}", + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regionOperations.list": + +type RegionOperationsListCall struct { + s *Service + project string + region string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Retrieves a list of Operation resources contained within the +// specified region. +// For details, see https://cloud.google.com/compute/docs/reference/latest/regionOperations/list +func (r *RegionOperationsService) List(project string, region string) *RegionOperationsListCall { + c := &RegionOperationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RegionOperationsListCall) Filter(filter string) *RegionOperationsListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RegionOperationsListCall) MaxResults(maxResults int64) *RegionOperationsListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RegionOperationsListCall) OrderBy(orderBy string) *RegionOperationsListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RegionOperationsListCall) PageToken(pageToken string) *RegionOperationsListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionOperationsListCall) Fields(s ...googleapi.Field) *RegionOperationsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionOperationsListCall) IfNoneMatch(entityTag string) *RegionOperationsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionOperationsListCall) Context(ctx context.Context) *RegionOperationsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionOperationsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionOperationsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regionOperations.list" call. +// Exactly one of *OperationList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *OperationList.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RegionOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &OperationList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves a list of Operation resources contained within the specified region.", + // "httpMethod": "GET", + // "id": "compute.regionOperations.list", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/operations", + // "response": { + // "$ref": "OperationList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RegionOperationsListCall) Pages(ctx context.Context, f func(*OperationList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.regions.get": + +type RegionsGetCall struct { + s *Service + project string + region string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns the specified Region resource. Get a list of available +// regions by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/regions/get +func (r *RegionsService) Get(project string, region string) *RegionsGetCall { + c := &RegionsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionsGetCall) Fields(s ...googleapi.Field) *RegionsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionsGetCall) IfNoneMatch(entityTag string) *RegionsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionsGetCall) Context(ctx context.Context) *RegionsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regions.get" call. +// Exactly one of *Region or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Region.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *RegionsGetCall) Do(opts ...googleapi.CallOption) (*Region, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Region{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns the specified Region resource. Get a list of available regions by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.regions.get", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region resource to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}", + // "response": { + // "$ref": "Region" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.regions.list": + +type RegionsListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Retrieves the list of region resources available to the +// specified project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/regions/list +func (r *RegionsService) List(project string) *RegionsListCall { + c := &RegionsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RegionsListCall) Filter(filter string) *RegionsListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RegionsListCall) MaxResults(maxResults int64) *RegionsListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RegionsListCall) OrderBy(orderBy string) *RegionsListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RegionsListCall) PageToken(pageToken string) *RegionsListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RegionsListCall) Fields(s ...googleapi.Field) *RegionsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RegionsListCall) IfNoneMatch(entityTag string) *RegionsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RegionsListCall) Context(ctx context.Context) *RegionsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RegionsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RegionsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.regions.list" call. +// Exactly one of *RegionList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *RegionList.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RegionsListCall) Do(opts ...googleapi.CallOption) (*RegionList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RegionList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves the list of region resources available to the specified project.", + // "httpMethod": "GET", + // "id": "compute.regions.list", + // "parameterOrder": [ + // "project" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions", + // "response": { + // "$ref": "RegionList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RegionsListCall) Pages(ctx context.Context, f func(*RegionList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.routers.aggregatedList": + +type RoutersAggregatedListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// AggregatedList: Retrieves an aggregated list of routers. +func (r *RoutersService) AggregatedList(project string) *RoutersAggregatedListCall { + c := &RoutersAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RoutersAggregatedListCall) Filter(filter string) *RoutersAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RoutersAggregatedListCall) MaxResults(maxResults int64) *RoutersAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RoutersAggregatedListCall) OrderBy(orderBy string) *RoutersAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RoutersAggregatedListCall) PageToken(pageToken string) *RoutersAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RoutersAggregatedListCall) Fields(s ...googleapi.Field) *RoutersAggregatedListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RoutersAggregatedListCall) IfNoneMatch(entityTag string) *RoutersAggregatedListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RoutersAggregatedListCall) Context(ctx context.Context) *RoutersAggregatedListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RoutersAggregatedListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RoutersAggregatedListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/routers") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.routers.aggregatedList" call. +// Exactly one of *RouterAggregatedList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RouterAggregatedList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RoutersAggregatedListCall) Do(opts ...googleapi.CallOption) (*RouterAggregatedList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RouterAggregatedList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves an aggregated list of routers.", + // "httpMethod": "GET", + // "id": "compute.routers.aggregatedList", + // "parameterOrder": [ + // "project" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/aggregated/routers", + // "response": { + // "$ref": "RouterAggregatedList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RoutersAggregatedListCall) Pages(ctx context.Context, f func(*RouterAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.routers.delete": + +type RoutersDeleteCall struct { + s *Service + project string + region string + router string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes the specified Router resource. +func (r *RoutersService) Delete(project string, region string, router string) *RoutersDeleteCall { + c := &RoutersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.router = router + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RoutersDeleteCall) Fields(s ...googleapi.Field) *RoutersDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RoutersDeleteCall) Context(ctx context.Context) *RoutersDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RoutersDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RoutersDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "router": c.router, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.routers.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RoutersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Deletes the specified Router resource.", + // "httpMethod": "DELETE", + // "id": "compute.routers.delete", + // "parameterOrder": [ + // "project", + // "region", + // "router" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "router": { + // "description": "Name of the Router resource to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/routers/{router}", + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.routers.get": + +type RoutersGetCall struct { + s *Service + project string + region string + router string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Returns the specified Router resource. Get a list of available +// routers by making a list() request. +func (r *RoutersService) Get(project string, region string, router string) *RoutersGetCall { + c := &RoutersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.router = router + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RoutersGetCall) Fields(s ...googleapi.Field) *RoutersGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RoutersGetCall) IfNoneMatch(entityTag string) *RoutersGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RoutersGetCall) Context(ctx context.Context) *RoutersGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RoutersGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RoutersGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "router": c.router, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.routers.get" call. +// Exactly one of *Router or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Router.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *RoutersGetCall) Do(opts ...googleapi.CallOption) (*Router, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Router{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns the specified Router resource. Get a list of available routers by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.routers.get", + // "parameterOrder": [ + // "project", + // "region", + // "router" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "router": { + // "description": "Name of the Router resource to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/routers/{router}", + // "response": { + // "$ref": "Router" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.routers.getRouterStatus": + +type RoutersGetRouterStatusCall struct { + s *Service + project string + region string + router string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// GetRouterStatus: Retrieves runtime information of the specified +// router. +func (r *RoutersService) GetRouterStatus(project string, region string, router string) *RoutersGetRouterStatusCall { + c := &RoutersGetRouterStatusCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.router = router + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RoutersGetRouterStatusCall) Fields(s ...googleapi.Field) *RoutersGetRouterStatusCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RoutersGetRouterStatusCall) IfNoneMatch(entityTag string) *RoutersGetRouterStatusCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RoutersGetRouterStatusCall) Context(ctx context.Context) *RoutersGetRouterStatusCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RoutersGetRouterStatusCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RoutersGetRouterStatusCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}/getRouterStatus") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "router": c.router, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.routers.getRouterStatus" call. +// Exactly one of *RouterStatusResponse or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RouterStatusResponse.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RoutersGetRouterStatusCall) Do(opts ...googleapi.CallOption) (*RouterStatusResponse, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RouterStatusResponse{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves runtime information of the specified router.", + // "httpMethod": "GET", + // "id": "compute.routers.getRouterStatus", + // "parameterOrder": [ + // "project", + // "region", + // "router" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "router": { + // "description": "Name of the Router resource to query.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/routers/{router}/getRouterStatus", + // "response": { + // "$ref": "RouterStatusResponse" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.routers.insert": + +type RoutersInsertCall struct { + s *Service + project string + region string + router *Router + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Creates a Router resource in the specified project and region +// using the data included in the request. +func (r *RoutersService) Insert(project string, region string, router *Router) *RoutersInsertCall { + c := &RoutersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.router = router + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RoutersInsertCall) Fields(s ...googleapi.Field) *RoutersInsertCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RoutersInsertCall) Context(ctx context.Context) *RoutersInsertCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RoutersInsertCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RoutersInsertCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.router) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.routers.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RoutersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Creates a Router resource in the specified project and region using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.routers.insert", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/routers", + // "request": { + // "$ref": "Router" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.routers.list": + +type RoutersListCall struct { + s *Service + project string + region string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Retrieves a list of Router resources available to the specified +// project. +func (r *RoutersService) List(project string, region string) *RoutersListCall { + c := &RoutersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RoutersListCall) Filter(filter string) *RoutersListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RoutersListCall) MaxResults(maxResults int64) *RoutersListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RoutersListCall) OrderBy(orderBy string) *RoutersListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RoutersListCall) PageToken(pageToken string) *RoutersListCall { + c.urlParams_.Set("pageToken", pageToken) + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RoutersListCall) Fields(s ...googleapi.Field) *RoutersListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *RoutersListCall) IfNoneMatch(entityTag string) *RoutersListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RoutersListCall) Context(ctx context.Context) *RoutersListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RoutersListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RoutersListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.routers.list" call. +// Exactly one of *RouterList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *RouterList.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RoutersListCall) Do(opts ...googleapi.CallOption) (*RouterList, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RouterList{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves a list of Router resources available to the specified project.", + // "httpMethod": "GET", + // "id": "compute.routers.list", + // "parameterOrder": [ + // "project", + // "region" + // ], + // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/routers", + // "response": { + // "$ref": "RouterList" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RoutersListCall) Pages(ctx context.Context, f func(*RouterList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} + +// method id "compute.routers.patch": + +type RoutersPatchCall struct { + s *Service + project string + region string + router string + router2 *Router + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Patch: Patches the specified Router resource with the data included +// in the request. This method supports PATCH semantics and uses JSON +// merge patch format and processing rules. +func (r *RoutersService) Patch(project string, region string, router string, router2 *Router) *RoutersPatchCall { + c := &RoutersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.router = router + c.router2 = router2 + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RoutersPatchCall) Fields(s ...googleapi.Field) *RoutersPatchCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RoutersPatchCall) Context(ctx context.Context) *RoutersPatchCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RoutersPatchCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RoutersPatchCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("PATCH", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "router": c.router, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.routers.patch" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RoutersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Patches the specified Router resource with the data included in the request. This method supports PATCH semantics and uses JSON merge patch format and processing rules.", + // "httpMethod": "PATCH", + // "id": "compute.routers.patch", + // "parameterOrder": [ + // "project", + // "region", + // "router" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "router": { + // "description": "Name of the Router resource to patch.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/routers/{router}", + // "request": { + // "$ref": "Router" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.routers.preview": + +type RoutersPreviewCall struct { + s *Service + project string + region string + router string + router2 *Router + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Preview: Preview fields auto-generated during router create and +// update operations. Calling this method does NOT create or update the +// router. +func (r *RoutersService) Preview(project string, region string, router string, router2 *Router) *RoutersPreviewCall { + c := &RoutersPreviewCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.router = router + c.router2 = router2 + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RoutersPreviewCall) Fields(s ...googleapi.Field) *RoutersPreviewCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RoutersPreviewCall) Context(ctx context.Context) *RoutersPreviewCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RoutersPreviewCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RoutersPreviewCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}/preview") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "router": c.router, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.routers.preview" call. +// Exactly one of *RoutersPreviewResponse or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *RoutersPreviewResponse.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *RoutersPreviewCall) Do(opts ...googleapi.CallOption) (*RoutersPreviewResponse, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &RoutersPreviewResponse{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Preview fields auto-generated during router create and update operations. Calling this method does NOT create or update the router.", + // "httpMethod": "POST", + // "id": "compute.routers.preview", + // "parameterOrder": [ + // "project", + // "region", + // "router" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "router": { + // "description": "Name of the Router resource to query.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/routers/{router}/preview", + // "request": { + // "$ref": "Router" + // }, + // "response": { + // "$ref": "RoutersPreviewResponse" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.routers.update": + +type RoutersUpdateCall struct { + s *Service + project string + region string + router string + router2 *Router + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates the specified Router resource with the data included +// in the request. +func (r *RoutersService) Update(project string, region string, router string, router2 *Router) *RoutersUpdateCall { + c := &RoutersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.router = router + c.router2 = router2 + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *RoutersUpdateCall) Fields(s ...googleapi.Field) *RoutersUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *RoutersUpdateCall) Context(ctx context.Context) *RoutersUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *RoutersUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *RoutersUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("PUT", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "router": c.router, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.routers.update" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RoutersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates the specified Router resource with the data included in the request.", + // "httpMethod": "PUT", + // "id": "compute.routers.update", + // "parameterOrder": [ + // "project", + // "region", + // "router" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "router": { + // "description": "Name of the Router resource to update.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/routers/{router}", + // "request": { + // "$ref": "Router" + // }, // "response": { - // "$ref": "Region" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.regions.list": +// method id "compute.routes.delete": -type RegionsListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type RoutesDeleteCall struct { + s *Service + project string + route string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// List: Retrieves the list of region resources available to the -// specified project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/regions/list -func (r *RegionsService) List(project string) *RegionsListCall { - c := &RegionsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified Route resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/routes/delete +func (r *RoutesService) Delete(project string, route string) *RoutesDeleteCall { + c := &RoutesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *RegionsListCall) Filter(filter string) *RegionsListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *RegionsListCall) MaxResults(maxResults int64) *RegionsListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *RegionsListCall) OrderBy(orderBy string) *RegionsListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *RegionsListCall) PageToken(pageToken string) *RegionsListCall { - c.urlParams_.Set("pageToken", pageToken) + c.route = route return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RegionsListCall) Fields(s ...googleapi.Field) *RegionsListCall { +func (c *RoutesDeleteCall) Fields(s ...googleapi.Field) *RoutesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RegionsListCall) IfNoneMatch(entityTag string) *RegionsListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RegionsListCall) Context(ctx context.Context) *RegionsListCall { +func (c *RoutesDeleteCall) Context(ctx context.Context) *RoutesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RegionsListCall) Header() http.Header { +func (c *RoutesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RegionsListCall) doRequest(alt string) (*http.Response, error) { +func (c *RoutesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes/{route}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "route": c.route, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.regions.list" call. -// Exactly one of *RegionList or error will be non-nil. Any non-2xx +// Do executes the "compute.routes.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *RegionList.ServerResponse.Header or (if a response was returned at +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RegionsListCall) Do(opts ...googleapi.CallOption) (*RegionList, error) { +func (c *RoutesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -44421,7 +51437,7 @@ func (c *RegionsListCall) Do(opts ...googleapi.CallOption) (*RegionList, error) if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RegionList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -44433,168 +51449,67 @@ func (c *RegionsListCall) Do(opts ...googleapi.CallOption) (*RegionList, error) } return ret, nil // { - // "description": "Retrieves the list of region resources available to the specified project.", - // "httpMethod": "GET", - // "id": "compute.regions.list", + // "description": "Deletes the specified Route resource.", + // "httpMethod": "DELETE", + // "id": "compute.routes.delete", // "parameterOrder": [ - // "project" + // "project", + // "route" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "route": { + // "description": "Name of the Route resource to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/regions", + // "path": "{project}/global/routes/{route}", // "response": { - // "$ref": "RegionList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *RegionsListCall) Pages(ctx context.Context, f func(*RegionList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.routers.aggregatedList": +// method id "compute.routes.get": -type RoutersAggregatedListCall struct { +type RoutesGetCall struct { s *Service project string + route string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// AggregatedList: Retrieves an aggregated list of routers. -func (r *RoutersService) AggregatedList(project string) *RoutersAggregatedListCall { - c := &RoutersAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified Route resource. Get a list of available +// routes by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/routes/get +func (r *RoutesService) Get(project string, route string) *RoutesGetCall { + c := &RoutesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *RoutersAggregatedListCall) Filter(filter string) *RoutersAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *RoutersAggregatedListCall) MaxResults(maxResults int64) *RoutersAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *RoutersAggregatedListCall) OrderBy(orderBy string) *RoutersAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *RoutersAggregatedListCall) PageToken(pageToken string) *RoutersAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) + c.route = route return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutersAggregatedListCall) Fields(s ...googleapi.Field) *RoutersAggregatedListCall { +func (c *RoutesGetCall) Fields(s ...googleapi.Field) *RoutesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -44604,7 +51519,7 @@ func (c *RoutersAggregatedListCall) Fields(s ...googleapi.Field) *RoutersAggrega // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *RoutersAggregatedListCall) IfNoneMatch(entityTag string) *RoutersAggregatedListCall { +func (c *RoutesGetCall) IfNoneMatch(entityTag string) *RoutesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -44612,21 +51527,21 @@ func (c *RoutersAggregatedListCall) IfNoneMatch(entityTag string) *RoutersAggreg // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutersAggregatedListCall) Context(ctx context.Context) *RoutersAggregatedListCall { +func (c *RoutesGetCall) Context(ctx context.Context) *RoutesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutersAggregatedListCall) Header() http.Header { +func (c *RoutesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutersAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *RoutesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -44637,24 +51552,25 @@ func (c *RoutersAggregatedListCall) doRequest(alt string) (*http.Response, error } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/routers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes/{route}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "route": c.route, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routers.aggregatedList" call. -// Exactly one of *RouterAggregatedList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *RouterAggregatedList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *RoutersAggregatedListCall) Do(opts ...googleapi.CallOption) (*RouterAggregatedList, error) { +// Do executes the "compute.routes.get" call. +// Exactly one of *Route or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Route.ServerResponse.Header or (if a response was returned at all) +// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to +// check whether the returned error was because http.StatusNotModified +// was returned. +func (c *RoutesGetCall) Do(opts ...googleapi.CallOption) (*Route, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -44673,7 +51589,7 @@ func (c *RoutersAggregatedListCall) Do(opts ...googleapi.CallOption) (*RouterAgg if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RouterAggregatedList{ + ret := &Route{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -44685,47 +51601,32 @@ func (c *RoutersAggregatedListCall) Do(opts ...googleapi.CallOption) (*RouterAgg } return ret, nil // { - // "description": "Retrieves an aggregated list of routers.", + // "description": "Returns the specified Route resource. Get a list of available routes by making a list() request.", // "httpMethod": "GET", - // "id": "compute.routers.aggregatedList", + // "id": "compute.routes.get", // "parameterOrder": [ - // "project" + // "project", + // "route" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "route": { + // "description": "Name of the Route resource to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/aggregated/routers", + // "path": "{project}/global/routes/{route}", // "response": { - // "$ref": "RouterAggregatedList" + // "$ref": "Route" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -44736,52 +51637,31 @@ func (c *RoutersAggregatedListCall) Do(opts ...googleapi.CallOption) (*RouterAgg } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *RoutersAggregatedListCall) Pages(ctx context.Context, f func(*RouterAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.routers.delete": +// method id "compute.routes.insert": -type RoutersDeleteCall struct { +type RoutesInsertCall struct { s *Service project string - region string - router string + route *Route urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Delete: Deletes the specified Router resource. -func (r *RoutersService) Delete(project string, region string, router string) *RoutersDeleteCall { - c := &RoutersDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a Route resource in the specified project using the +// data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/routes/insert +func (r *RoutesService) Insert(project string, route *Route) *RoutesInsertCall { + c := &RoutesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.router = router + c.route = route return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutersDeleteCall) Fields(s ...googleapi.Field) *RoutersDeleteCall { +func (c *RoutesInsertCall) Fields(s ...googleapi.Field) *RoutesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -44789,48 +51669,51 @@ func (c *RoutersDeleteCall) Fields(s ...googleapi.Field) *RoutersDeleteCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutersDeleteCall) Context(ctx context.Context) *RoutersDeleteCall { +func (c *RoutesInsertCall) Context(ctx context.Context) *RoutesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutersDeleteCall) Header() http.Header { +func (c *RoutesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutersDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *RoutesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.route) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, - "router": c.router, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routers.delete" call. +// Do executes the "compute.routes.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RoutersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *RoutesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -44861,13 +51744,11 @@ func (c *RoutersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Deletes the specified Router resource.", - // "httpMethod": "DELETE", - // "id": "compute.routers.delete", + // "description": "Creates a Route resource in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.routes.insert", // "parameterOrder": [ - // "project", - // "region", - // "router" + // "project" // ], // "parameters": { // "project": { @@ -44876,23 +51757,12 @@ func (c *RoutersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "router": { - // "description": "Name of the Router resource to delete.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/routers/{router}", + // "path": "{project}/global/routes", + // "request": { + // "$ref": "Route" + // }, // "response": { // "$ref": "Operation" // }, @@ -44904,33 +51774,97 @@ func (c *RoutersDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) } -// method id "compute.routers.get": +// method id "compute.routes.list": -type RoutersGetCall struct { +type RoutesListCall struct { s *Service project string - region string - router string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns the specified Router resource. Get a list of available -// routers by making a list() request. -func (r *RoutersService) Get(project string, region string, router string) *RoutersGetCall { - c := &RoutersGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of Route resources available to the +// specified project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/routes/list +func (r *RoutesService) List(project string) *RoutesListCall { + c := &RoutesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.router = router + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *RoutesListCall) Filter(filter string) *RoutesListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *RoutesListCall) MaxResults(maxResults int64) *RoutesListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *RoutesListCall) OrderBy(orderBy string) *RoutesListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *RoutesListCall) PageToken(pageToken string) *RoutesListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutersGetCall) Fields(s ...googleapi.Field) *RoutersGetCall { +func (c *RoutesListCall) Fields(s ...googleapi.Field) *RoutesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -44940,7 +51874,7 @@ func (c *RoutersGetCall) Fields(s ...googleapi.Field) *RoutersGetCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *RoutersGetCall) IfNoneMatch(entityTag string) *RoutersGetCall { +func (c *RoutesListCall) IfNoneMatch(entityTag string) *RoutesListCall { c.ifNoneMatch_ = entityTag return c } @@ -44948,21 +51882,21 @@ func (c *RoutersGetCall) IfNoneMatch(entityTag string) *RoutersGetCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutersGetCall) Context(ctx context.Context) *RoutersGetCall { +func (c *RoutesListCall) Context(ctx context.Context) *RoutesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutersGetCall) Header() http.Header { +func (c *RoutesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutersGetCall) doRequest(alt string) (*http.Response, error) { +func (c *RoutesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -44973,26 +51907,24 @@ func (c *RoutersGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, - "router": c.router, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routers.get" call. -// Exactly one of *Router or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Router.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *RoutersGetCall) Do(opts ...googleapi.CallOption) (*Router, error) { +// Do executes the "compute.routes.list" call. +// Exactly one of *RouteList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *RouteList.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *RoutesListCall) Do(opts ...googleapi.CallOption) (*RouteList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -45011,7 +51943,7 @@ func (c *RoutersGetCall) Do(opts ...googleapi.CallOption) (*Router, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Router{ + ret := &RouteList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -45023,40 +51955,47 @@ func (c *RoutersGetCall) Do(opts ...googleapi.CallOption) (*Router, error) { } return ret, nil // { - // "description": "Returns the specified Router resource. Get a list of available routers by making a list() request.", + // "description": "Retrieves the list of Route resources available to the specified project.", // "httpMethod": "GET", - // "id": "compute.routers.get", + // "id": "compute.routes.list", // "parameterOrder": [ - // "project", - // "region", - // "router" + // "project" // ], // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", // "type": "string" // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", // "type": "string" // }, - // "router": { - // "description": "Name of the Router resource to return.", + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, + // "project": { + // "description": "Project ID for this request.", // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/routers/{router}", + // "path": "{project}/global/routes", // "response": { - // "$ref": "Router" + // "$ref": "RouteList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -45067,95 +52006,105 @@ func (c *RoutersGetCall) Do(opts ...googleapi.CallOption) (*Router, error) { } -// method id "compute.routers.getRouterStatus": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *RoutesListCall) Pages(ctx context.Context, f func(*RouteList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type RoutersGetRouterStatusCall struct { - s *Service - project string - region string - router string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +// method id "compute.snapshots.delete": + +type SnapshotsDeleteCall struct { + s *Service + project string + snapshot string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// GetRouterStatus: Retrieves runtime information of the specified -// router. -func (r *RoutersService) GetRouterStatus(project string, region string, router string) *RoutersGetRouterStatusCall { - c := &RoutersGetRouterStatusCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified Snapshot resource. Keep in mind that +// deleting a single snapshot might not necessarily delete all the data +// on that snapshot. If any data on the snapshot that is marked for +// deletion is needed for subsequent snapshots, the data will be moved +// to the next corresponding snapshot. +// +// For more information, see Deleting snaphots. +// For details, see https://cloud.google.com/compute/docs/reference/latest/snapshots/delete +func (r *SnapshotsService) Delete(project string, snapshot string) *SnapshotsDeleteCall { + c := &SnapshotsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.router = router + c.snapshot = snapshot return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutersGetRouterStatusCall) Fields(s ...googleapi.Field) *RoutersGetRouterStatusCall { +func (c *SnapshotsDeleteCall) Fields(s ...googleapi.Field) *SnapshotsDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RoutersGetRouterStatusCall) IfNoneMatch(entityTag string) *RoutersGetRouterStatusCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutersGetRouterStatusCall) Context(ctx context.Context) *RoutersGetRouterStatusCall { +func (c *SnapshotsDeleteCall) Context(ctx context.Context) *SnapshotsDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutersGetRouterStatusCall) Header() http.Header { +func (c *SnapshotsDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutersGetRouterStatusCall) doRequest(alt string) (*http.Response, error) { +func (c *SnapshotsDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}/getRouterStatus") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{snapshot}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "router": c.router, + "project": c.project, + "snapshot": c.snapshot, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routers.getRouterStatus" call. -// Exactly one of *RouterStatusResponse or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *RouterStatusResponse.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *RoutersGetRouterStatusCall) Do(opts ...googleapi.CallOption) (*RouterStatusResponse, error) { +// Do executes the "compute.snapshots.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *SnapshotsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -45174,7 +52123,7 @@ func (c *RoutersGetRouterStatusCall) Do(opts ...googleapi.CallOption) (*RouterSt if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RouterStatusResponse{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -45186,13 +52135,12 @@ func (c *RoutersGetRouterStatusCall) Do(opts ...googleapi.CallOption) (*RouterSt } return ret, nil // { - // "description": "Retrieves runtime information of the specified router.", - // "httpMethod": "GET", - // "id": "compute.routers.getRouterStatus", + // "description": "Deletes the specified Snapshot resource. Keep in mind that deleting a single snapshot might not necessarily delete all the data on that snapshot. If any data on the snapshot that is marked for deletion is needed for subsequent snapshots, the data will be moved to the next corresponding snapshot.\n\nFor more information, see Deleting snaphots.", + // "httpMethod": "DELETE", + // "id": "compute.snapshots.delete", // "parameterOrder": [ // "project", - // "region", - // "router" + // "snapshot" // ], // "parameters": { // "project": { @@ -45202,113 +52150,113 @@ func (c *RoutersGetRouterStatusCall) Do(opts ...googleapi.CallOption) (*RouterSt // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "router": { - // "description": "Name of the Router resource to query.", + // "snapshot": { + // "description": "Name of the Snapshot resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/routers/{router}/getRouterStatus", + // "path": "{project}/global/snapshots/{snapshot}", // "response": { - // "$ref": "RouterStatusResponse" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.routers.insert": +// method id "compute.snapshots.get": -type RoutersInsertCall struct { - s *Service - project string - region string - router *Router - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type SnapshotsGetCall struct { + s *Service + project string + snapshot string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Insert: Creates a Router resource in the specified project and region -// using the data included in the request. -func (r *RoutersService) Insert(project string, region string, router *Router) *RoutersInsertCall { - c := &RoutersInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified Snapshot resource. Get a list of available +// snapshots by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/snapshots/get +func (r *SnapshotsService) Get(project string, snapshot string) *SnapshotsGetCall { + c := &SnapshotsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.router = router + c.snapshot = snapshot return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutersInsertCall) Fields(s ...googleapi.Field) *RoutersInsertCall { +func (c *SnapshotsGetCall) Fields(s ...googleapi.Field) *SnapshotsGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *SnapshotsGetCall) IfNoneMatch(entityTag string) *SnapshotsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutersInsertCall) Context(ctx context.Context) *RoutersInsertCall { +func (c *SnapshotsGetCall) Context(ctx context.Context) *SnapshotsGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutersInsertCall) Header() http.Header { +func (c *SnapshotsGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutersInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *SnapshotsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.router) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{snapshot}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, + "project": c.project, + "snapshot": c.snapshot, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routers.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at +// Do executes the "compute.snapshots.get" call. +// Exactly one of *Snapshot or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *Snapshot.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RoutersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *SnapshotsGetCall) Do(opts ...googleapi.CallOption) (*Snapshot, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -45327,7 +52275,7 @@ func (c *RoutersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &Snapshot{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -45339,12 +52287,12 @@ func (c *RoutersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Creates a Router resource in the specified project and region using the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.routers.insert", + // "description": "Returns the specified Snapshot resource. Get a list of available snapshots by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.snapshots.get", // "parameterOrder": [ // "project", - // "region" + // "snapshot" // ], // "parameters": { // "project": { @@ -45354,54 +52302,50 @@ func (c *RoutersInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region for this request.", + // "snapshot": { + // "description": "Name of the Snapshot resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/routers", - // "request": { - // "$ref": "Router" - // }, + // "path": "{project}/global/snapshots/{snapshot}", // "response": { - // "$ref": "Operation" + // "$ref": "Snapshot" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.routers.list": +// method id "compute.snapshots.list": -type RoutersListCall struct { +type SnapshotsListCall struct { s *Service project string - region string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of Router resources available to the specified -// project. -func (r *RoutersService) List(project string, region string) *RoutersListCall { - c := &RoutersListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of Snapshot resources contained within the +// specified project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/snapshots/list +func (r *SnapshotsService) List(project string) *SnapshotsListCall { + c := &SnapshotsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -45413,7 +52357,7 @@ func (r *RoutersService) List(project string, region string) *RoutersListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -45425,7 +52369,7 @@ func (r *RoutersService) List(project string, region string) *RoutersListCall { // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *RoutersListCall) Filter(filter string) *RoutersListCall { +func (c *SnapshotsListCall) Filter(filter string) *SnapshotsListCall { c.urlParams_.Set("filter", filter) return c } @@ -45436,7 +52380,7 @@ func (c *RoutersListCall) Filter(filter string) *RoutersListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *RoutersListCall) MaxResults(maxResults int64) *RoutersListCall { +func (c *SnapshotsListCall) MaxResults(maxResults int64) *SnapshotsListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -45453,7 +52397,7 @@ func (c *RoutersListCall) MaxResults(maxResults int64) *RoutersListCall { // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *RoutersListCall) OrderBy(orderBy string) *RoutersListCall { +func (c *SnapshotsListCall) OrderBy(orderBy string) *SnapshotsListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -45461,7 +52405,7 @@ func (c *RoutersListCall) OrderBy(orderBy string) *RoutersListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *RoutersListCall) PageToken(pageToken string) *RoutersListCall { +func (c *SnapshotsListCall) PageToken(pageToken string) *SnapshotsListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -45469,7 +52413,7 @@ func (c *RoutersListCall) PageToken(pageToken string) *RoutersListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutersListCall) Fields(s ...googleapi.Field) *RoutersListCall { +func (c *SnapshotsListCall) Fields(s ...googleapi.Field) *SnapshotsListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -45479,7 +52423,7 @@ func (c *RoutersListCall) Fields(s ...googleapi.Field) *RoutersListCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *RoutersListCall) IfNoneMatch(entityTag string) *RoutersListCall { +func (c *SnapshotsListCall) IfNoneMatch(entityTag string) *SnapshotsListCall { c.ifNoneMatch_ = entityTag return c } @@ -45487,21 +52431,21 @@ func (c *RoutersListCall) IfNoneMatch(entityTag string) *RoutersListCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutersListCall) Context(ctx context.Context) *RoutersListCall { +func (c *SnapshotsListCall) Context(ctx context.Context) *SnapshotsListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutersListCall) Header() http.Header { +func (c *SnapshotsListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutersListCall) doRequest(alt string) (*http.Response, error) { +func (c *SnapshotsListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -45512,25 +52456,24 @@ func (c *RoutersListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routers.list" call. -// Exactly one of *RouterList or error will be non-nil. Any non-2xx +// Do executes the "compute.snapshots.list" call. +// Exactly one of *SnapshotList or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *RouterList.ServerResponse.Header or (if a response was returned at +// *SnapshotList.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RoutersListCall) Do(opts ...googleapi.CallOption) (*RouterList, error) { +func (c *SnapshotsListCall) Do(opts ...googleapi.CallOption) (*SnapshotList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -45549,7 +52492,7 @@ func (c *RoutersListCall) Do(opts ...googleapi.CallOption) (*RouterList, error) if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RouterList{ + ret := &SnapshotList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -45561,16 +52504,15 @@ func (c *RoutersListCall) Do(opts ...googleapi.CallOption) (*RouterList, error) } return ret, nil // { - // "description": "Retrieves a list of Router resources available to the specified project.", + // "description": "Retrieves the list of Snapshot resources contained within the specified project.", // "httpMethod": "GET", - // "id": "compute.routers.list", + // "id": "compute.snapshots.list", // "parameterOrder": [ - // "project", - // "region" + // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -45598,18 +52540,11 @@ func (c *RoutersListCall) Do(opts ...googleapi.CallOption) (*RouterList, error) // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/routers", + // "path": "{project}/global/snapshots", // "response": { - // "$ref": "RouterList" + // "$ref": "SnapshotList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -45623,7 +52558,7 @@ func (c *RoutersListCall) Do(opts ...googleapi.CallOption) (*RouterList, error) // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *RoutersListCall) Pages(ctx context.Context, f func(*RouterList) error) error { +func (c *SnapshotsListCall) Pages(ctx context.Context, f func(*SnapshotList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -45641,34 +52576,176 @@ func (c *RoutersListCall) Pages(ctx context.Context, f func(*RouterList) error) } } -// method id "compute.routers.patch": +// method id "compute.snapshots.setLabels": -type RoutersPatchCall struct { - s *Service - project string - region string - router string - router2 *Router - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type SnapshotsSetLabelsCall struct { + s *Service + project string + resource string + globalsetlabelsrequest *GlobalSetLabelsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetLabels: Sets the labels on a snapshot. To learn more about labels, +// read the Labeling Resources documentation. +func (r *SnapshotsService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *SnapshotsSetLabelsCall { + c := &SnapshotsSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.resource = resource + c.globalsetlabelsrequest = globalsetlabelsrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *SnapshotsSetLabelsCall) Fields(s ...googleapi.Field) *SnapshotsSetLabelsCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *SnapshotsSetLabelsCall) Context(ctx context.Context) *SnapshotsSetLabelsCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *SnapshotsSetLabelsCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *SnapshotsSetLabelsCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{resource}/setLabels") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "resource": c.resource, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.snapshots.setLabels" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *SnapshotsSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the labels on a snapshot. To learn more about labels, read the Labeling Resources documentation.", + // "httpMethod": "POST", + // "id": "compute.snapshots.setLabels", + // "parameterOrder": [ + // "project", + // "resource" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "resource": { + // "description": "Name of the resource for this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/global/snapshots/{resource}/setLabels", + // "request": { + // "$ref": "GlobalSetLabelsRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute" + // ] + // } + +} + +// method id "compute.sslCertificates.delete": + +type SslCertificatesDeleteCall struct { + s *Service + project string + sslCertificate string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Patch: Patches the specified Router resource with the data included -// in the request. This method supports patch semantics. -func (r *RoutersService) Patch(project string, region string, router string, router2 *Router) *RoutersPatchCall { - c := &RoutersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified SslCertificate resource. +func (r *SslCertificatesService) Delete(project string, sslCertificate string) *SslCertificatesDeleteCall { + c := &SslCertificatesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.router = router - c.router2 = router2 + c.sslCertificate = sslCertificate return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutersPatchCall) Fields(s ...googleapi.Field) *RoutersPatchCall { +func (c *SslCertificatesDeleteCall) Fields(s ...googleapi.Field) *SslCertificatesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -45676,53 +52753,47 @@ func (c *RoutersPatchCall) Fields(s ...googleapi.Field) *RoutersPatchCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutersPatchCall) Context(ctx context.Context) *RoutersPatchCall { +func (c *SslCertificatesDeleteCall) Context(ctx context.Context) *SslCertificatesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutersPatchCall) Header() http.Header { +func (c *SslCertificatesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutersPatchCall) doRequest(alt string) (*http.Response, error) { +func (c *SslCertificatesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates/{sslCertificate}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PATCH", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "router": c.router, + "project": c.project, + "sslCertificate": c.sslCertificate, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routers.patch" call. +// Do executes the "compute.sslCertificates.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RoutersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *SslCertificatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -45753,13 +52824,12 @@ func (c *RoutersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Patches the specified Router resource with the data included in the request. This method supports patch semantics.", - // "httpMethod": "PATCH", - // "id": "compute.routers.patch", + // "description": "Deletes the specified SslCertificate resource.", + // "httpMethod": "DELETE", + // "id": "compute.sslCertificates.delete", // "parameterOrder": [ // "project", - // "region", - // "router" + // "sslCertificate" // ], // "parameters": { // "project": { @@ -45769,120 +52839,112 @@ func (c *RoutersPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "router": { - // "description": "Name of the Router resource to patch.", + // "sslCertificate": { + // "description": "Name of the SslCertificate resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/routers/{router}", - // "request": { - // "$ref": "Router" - // }, + // "path": "{project}/global/sslCertificates/{sslCertificate}", // "response": { // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.routers.preview": +// method id "compute.sslCertificates.get": -type RoutersPreviewCall struct { - s *Service - project string - region string - router string - router2 *Router - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type SslCertificatesGetCall struct { + s *Service + project string + sslCertificate string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Preview: Preview fields auto-generated during router create and -// update operations. Calling this method does NOT create or update the -// router. -func (r *RoutersService) Preview(project string, region string, router string, router2 *Router) *RoutersPreviewCall { - c := &RoutersPreviewCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified SslCertificate resource. Get a list of +// available SSL certificates by making a list() request. +func (r *SslCertificatesService) Get(project string, sslCertificate string) *SslCertificatesGetCall { + c := &SslCertificatesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.router = router - c.router2 = router2 + c.sslCertificate = sslCertificate return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutersPreviewCall) Fields(s ...googleapi.Field) *RoutersPreviewCall { +func (c *SslCertificatesGetCall) Fields(s ...googleapi.Field) *SslCertificatesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *SslCertificatesGetCall) IfNoneMatch(entityTag string) *SslCertificatesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutersPreviewCall) Context(ctx context.Context) *RoutersPreviewCall { +func (c *SslCertificatesGetCall) Context(ctx context.Context) *SslCertificatesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutersPreviewCall) Header() http.Header { +func (c *SslCertificatesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutersPreviewCall) doRequest(alt string) (*http.Response, error) { +func (c *SslCertificatesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}/preview") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates/{sslCertificate}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "router": c.router, + "project": c.project, + "sslCertificate": c.sslCertificate, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routers.preview" call. -// Exactly one of *RoutersPreviewResponse or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *RoutersPreviewResponse.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.sslCertificates.get" call. +// Exactly one of *SslCertificate or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *SslCertificate.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *RoutersPreviewCall) Do(opts ...googleapi.CallOption) (*RoutersPreviewResponse, error) { +func (c *SslCertificatesGetCall) Do(opts ...googleapi.CallOption) (*SslCertificate, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -45901,7 +52963,7 @@ func (c *RoutersPreviewCall) Do(opts ...googleapi.CallOption) (*RoutersPreviewRe if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RoutersPreviewResponse{ + ret := &SslCertificate{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -45913,13 +52975,12 @@ func (c *RoutersPreviewCall) Do(opts ...googleapi.CallOption) (*RoutersPreviewRe } return ret, nil // { - // "description": "Preview fields auto-generated during router create and update operations. Calling this method does NOT create or update the router.", - // "httpMethod": "POST", - // "id": "compute.routers.preview", + // "description": "Returns the specified SslCertificate resource. Get a list of available SSL certificates by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.sslCertificates.get", // "parameterOrder": [ // "project", - // "region", - // "router" + // "sslCertificate" // ], // "parameters": { // "project": { @@ -45929,27 +52990,17 @@ func (c *RoutersPreviewCall) Do(opts ...googleapi.CallOption) (*RoutersPreviewRe // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "router": { - // "description": "Name of the Router resource to query.", + // "sslCertificate": { + // "description": "Name of the SslCertificate resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/routers/{router}/preview", - // "request": { - // "$ref": "Router" - // }, + // "path": "{project}/global/sslCertificates/{sslCertificate}", // "response": { - // "$ref": "RoutersPreviewResponse" + // "$ref": "SslCertificate" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -45960,34 +53011,30 @@ func (c *RoutersPreviewCall) Do(opts ...googleapi.CallOption) (*RoutersPreviewRe } -// method id "compute.routers.update": +// method id "compute.sslCertificates.insert": -type RoutersUpdateCall struct { - s *Service - project string - region string - router string - router2 *Router - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type SslCertificatesInsertCall struct { + s *Service + project string + sslcertificate *SslCertificate + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Update: Updates the specified Router resource with the data included -// in the request. -func (r *RoutersService) Update(project string, region string, router string, router2 *Router) *RoutersUpdateCall { - c := &RoutersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a SslCertificate resource in the specified project +// using the data included in the request. +func (r *SslCertificatesService) Insert(project string, sslcertificate *SslCertificate) *SslCertificatesInsertCall { + c := &SslCertificatesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.router = router - c.router2 = router2 + c.sslcertificate = sslcertificate return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutersUpdateCall) Fields(s ...googleapi.Field) *RoutersUpdateCall { +func (c *SslCertificatesInsertCall) Fields(s ...googleapi.Field) *SslCertificatesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -45995,53 +53042,51 @@ func (c *RoutersUpdateCall) Fields(s ...googleapi.Field) *RoutersUpdateCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutersUpdateCall) Context(ctx context.Context) *RoutersUpdateCall { +func (c *SslCertificatesInsertCall) Context(ctx context.Context) *SslCertificatesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutersUpdateCall) Header() http.Header { +func (c *SslCertificatesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutersUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *SslCertificatesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.sslcertificate) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PUT", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, - "router": c.router, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routers.update" call. +// Do executes the "compute.sslCertificates.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RoutersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *SslCertificatesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -46072,13 +53117,11 @@ func (c *RoutersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Updates the specified Router resource with the data included in the request.", - // "httpMethod": "PUT", - // "id": "compute.routers.update", + // "description": "Creates a SslCertificate resource in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.sslCertificates.insert", // "parameterOrder": [ - // "project", - // "region", - // "router" + // "project" // ], // "parameters": { // "project": { @@ -46087,25 +53130,11 @@ func (c *RoutersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "router": { - // "description": "Name of the Router resource to update.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/routers/{router}", + // "path": "{project}/global/sslCertificates", // "request": { - // "$ref": "Router" + // "$ref": "SslCertificate" // }, // "response": { // "$ref": "Operation" @@ -46118,78 +53147,156 @@ func (c *RoutersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) } -// method id "compute.routes.delete": +// method id "compute.sslCertificates.list": -type RoutesDeleteCall struct { - s *Service - project string - route string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type SslCertificatesListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified Route resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/routes/delete -func (r *RoutesService) Delete(project string, route string) *RoutesDeleteCall { - c := &RoutesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of SslCertificate resources available to the +// specified project. +func (r *SslCertificatesService) List(project string) *SslCertificatesListCall { + c := &SslCertificatesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.route = route + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *SslCertificatesListCall) Filter(filter string) *SslCertificatesListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *SslCertificatesListCall) MaxResults(maxResults int64) *SslCertificatesListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *SslCertificatesListCall) OrderBy(orderBy string) *SslCertificatesListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *SslCertificatesListCall) PageToken(pageToken string) *SslCertificatesListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutesDeleteCall) Fields(s ...googleapi.Field) *RoutesDeleteCall { +func (c *SslCertificatesListCall) Fields(s ...googleapi.Field) *SslCertificatesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *SslCertificatesListCall) IfNoneMatch(entityTag string) *SslCertificatesListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutesDeleteCall) Context(ctx context.Context) *RoutesDeleteCall { +func (c *SslCertificatesListCall) Context(ctx context.Context) *SslCertificatesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutesDeleteCall) Header() http.Header { +func (c *SslCertificatesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *SslCertificatesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes/{route}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "route": c.route, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routes.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *RoutesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.sslCertificates.list" call. +// Exactly one of *SslCertificateList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *SslCertificateList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *SslCertificatesListCall) Do(opts ...googleapi.CallOption) (*SslCertificateList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -46208,7 +53315,7 @@ func (c *RoutesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &SslCertificateList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -46220,67 +53327,167 @@ func (c *RoutesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Deletes the specified Route resource.", - // "httpMethod": "DELETE", - // "id": "compute.routes.delete", + // "description": "Retrieves the list of SslCertificate resources available to the specified project.", + // "httpMethod": "GET", + // "id": "compute.sslCertificates.list", // "parameterOrder": [ - // "project", - // "route" + // "project" // ], // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "route": { - // "description": "Name of the Route resource to delete.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/global/routes/{route}", + // "path": "{project}/global/sslCertificates", // "response": { - // "$ref": "Operation" + // "$ref": "SslCertificateList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.routes.get": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *SslCertificatesListCall) Pages(ctx context.Context, f func(*SslCertificateList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type RoutesGetCall struct { +// method id "compute.subnetworks.aggregatedList": + +type SubnetworksAggregatedListCall struct { s *Service project string - route string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns the specified Route resource. Get a list of available -// routes by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/routes/get -func (r *RoutesService) Get(project string, route string) *RoutesGetCall { - c := &RoutesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.route = route +// AggregatedList: Retrieves an aggregated list of subnetworks. +func (r *SubnetworksService) AggregatedList(project string) *SubnetworksAggregatedListCall { + c := &SubnetworksAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *SubnetworksAggregatedListCall) Filter(filter string) *SubnetworksAggregatedListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *SubnetworksAggregatedListCall) MaxResults(maxResults int64) *SubnetworksAggregatedListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *SubnetworksAggregatedListCall) OrderBy(orderBy string) *SubnetworksAggregatedListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *SubnetworksAggregatedListCall) PageToken(pageToken string) *SubnetworksAggregatedListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutesGetCall) Fields(s ...googleapi.Field) *RoutesGetCall { +func (c *SubnetworksAggregatedListCall) Fields(s ...googleapi.Field) *SubnetworksAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -46290,7 +53497,7 @@ func (c *RoutesGetCall) Fields(s ...googleapi.Field) *RoutesGetCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *RoutesGetCall) IfNoneMatch(entityTag string) *RoutesGetCall { +func (c *SubnetworksAggregatedListCall) IfNoneMatch(entityTag string) *SubnetworksAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -46298,21 +53505,21 @@ func (c *RoutesGetCall) IfNoneMatch(entityTag string) *RoutesGetCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutesGetCall) Context(ctx context.Context) *RoutesGetCall { +func (c *SubnetworksAggregatedListCall) Context(ctx context.Context) *SubnetworksAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutesGetCall) Header() http.Header { +func (c *SubnetworksAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *SubnetworksAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -46323,25 +53530,24 @@ func (c *RoutesGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes/{route}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/subnetworks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "route": c.route, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routes.get" call. -// Exactly one of *Route or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Route.ServerResponse.Header or (if a response was returned at all) -// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to -// check whether the returned error was because http.StatusNotModified -// was returned. -func (c *RoutesGetCall) Do(opts ...googleapi.CallOption) (*Route, error) { +// Do executes the "compute.subnetworks.aggregatedList" call. +// Exactly one of *SubnetworkAggregatedList or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *SubnetworkAggregatedList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *SubnetworksAggregatedListCall) Do(opts ...googleapi.CallOption) (*SubnetworkAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -46360,7 +53566,7 @@ func (c *RoutesGetCall) Do(opts ...googleapi.CallOption) (*Route, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Route{ + ret := &SubnetworkAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -46372,32 +53578,47 @@ func (c *RoutesGetCall) Do(opts ...googleapi.CallOption) (*Route, error) { } return ret, nil // { - // "description": "Returns the specified Route resource. Get a list of available routes by making a list() request.", + // "description": "Retrieves an aggregated list of subnetworks.", // "httpMethod": "GET", - // "id": "compute.routes.get", + // "id": "compute.subnetworks.aggregatedList", // "parameterOrder": [ - // "project", - // "route" + // "project" // ], // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "route": { - // "description": "Name of the Route resource to return.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/global/routes/{route}", + // "path": "{project}/aggregated/subnetworks", // "response": { - // "$ref": "Route" + // "$ref": "SubnetworkAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -46408,31 +53629,52 @@ func (c *RoutesGetCall) Do(opts ...googleapi.CallOption) (*Route, error) { } -// method id "compute.routes.insert": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *SubnetworksAggregatedListCall) Pages(ctx context.Context, f func(*SubnetworkAggregatedList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type RoutesInsertCall struct { +// method id "compute.subnetworks.delete": + +type SubnetworksDeleteCall struct { s *Service project string - route *Route + region string + subnetwork string urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Insert: Creates a Route resource in the specified project using the -// data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/routes/insert -func (r *RoutesService) Insert(project string, route *Route) *RoutesInsertCall { - c := &RoutesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified subnetwork. +func (r *SubnetworksService) Delete(project string, region string, subnetwork string) *SubnetworksDeleteCall { + c := &SubnetworksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.route = route + c.region = region + c.subnetwork = subnetwork return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutesInsertCall) Fields(s ...googleapi.Field) *RoutesInsertCall { +func (c *SubnetworksDeleteCall) Fields(s ...googleapi.Field) *SubnetworksDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -46440,51 +53682,48 @@ func (c *RoutesInsertCall) Fields(s ...googleapi.Field) *RoutesInsertCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutesInsertCall) Context(ctx context.Context) *RoutesInsertCall { +func (c *SubnetworksDeleteCall) Context(ctx context.Context) *SubnetworksDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutesInsertCall) Header() http.Header { +func (c *SubnetworksDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *SubnetworksDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.route) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "region": c.region, + "subnetwork": c.subnetwork, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routes.insert" call. +// Do executes the "compute.subnetworks.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RoutesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *SubnetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -46515,11 +53754,13 @@ func (c *RoutesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Creates a Route resource in the specified project using the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.routes.insert", + // "description": "Deletes the specified subnetwork.", + // "httpMethod": "DELETE", + // "id": "compute.subnetworks.delete", // "parameterOrder": [ - // "project" + // "project", + // "region", + // "subnetwork" // ], // "parameters": { // "project": { @@ -46528,12 +53769,23 @@ func (c *RoutesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "subnetwork": { + // "description": "Name of the Subnetwork resource to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/routes", - // "request": { - // "$ref": "Route" - // }, + // "path": "{project}/regions/{region}/subnetworks/{subnetwork}", // "response": { // "$ref": "Operation" // }, @@ -46545,158 +53797,88 @@ func (c *RoutesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) } -// method id "compute.routes.list": +// method id "compute.subnetworks.expandIpCidrRange": -type RoutesListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type SubnetworksExpandIpCidrRangeCall struct { + s *Service + project string + region string + subnetwork string + subnetworksexpandipcidrrangerequest *SubnetworksExpandIpCidrRangeRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// List: Retrieves the list of Route resources available to the -// specified project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/routes/list -func (r *RoutesService) List(project string) *RoutesListCall { - c := &RoutesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// ExpandIpCidrRange: Expands the IP CIDR range of the subnetwork to a +// specified value. +func (r *SubnetworksService) ExpandIpCidrRange(project string, region string, subnetwork string, subnetworksexpandipcidrrangerequest *SubnetworksExpandIpCidrRangeRequest) *SubnetworksExpandIpCidrRangeCall { + c := &SubnetworksExpandIpCidrRangeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *RoutesListCall) Filter(filter string) *RoutesListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *RoutesListCall) MaxResults(maxResults int64) *RoutesListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *RoutesListCall) OrderBy(orderBy string) *RoutesListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *RoutesListCall) PageToken(pageToken string) *RoutesListCall { - c.urlParams_.Set("pageToken", pageToken) + c.region = region + c.subnetwork = subnetwork + c.subnetworksexpandipcidrrangerequest = subnetworksexpandipcidrrangerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *RoutesListCall) Fields(s ...googleapi.Field) *RoutesListCall { +func (c *SubnetworksExpandIpCidrRangeCall) Fields(s ...googleapi.Field) *SubnetworksExpandIpCidrRangeCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *RoutesListCall) IfNoneMatch(entityTag string) *RoutesListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *RoutesListCall) Context(ctx context.Context) *RoutesListCall { +func (c *SubnetworksExpandIpCidrRangeCall) Context(ctx context.Context) *SubnetworksExpandIpCidrRangeCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *RoutesListCall) Header() http.Header { +func (c *SubnetworksExpandIpCidrRangeCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *RoutesListCall) doRequest(alt string) (*http.Response, error) { +func (c *SubnetworksExpandIpCidrRangeCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetworksexpandipcidrrangerequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "region": c.region, + "subnetwork": c.subnetwork, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.routes.list" call. -// Exactly one of *RouteList or error will be non-nil. Any non-2xx +// Do executes the "compute.subnetworks.expandIpCidrRange" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *RouteList.ServerResponse.Header or (if a response was returned at +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *RoutesListCall) Do(opts ...googleapi.CallOption) (*RouteList, error) { +func (c *SubnetworksExpandIpCidrRangeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -46715,7 +53897,7 @@ func (c *RoutesListCall) Do(opts ...googleapi.CallOption) (*RouteList, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &RouteList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -46727,156 +53909,141 @@ func (c *RoutesListCall) Do(opts ...googleapi.CallOption) (*RouteList, error) { } return ret, nil // { - // "description": "Retrieves the list of Route resources available to the specified project.", - // "httpMethod": "GET", - // "id": "compute.routes.list", + // "description": "Expands the IP CIDR range of the subnetwork to a specified value.", + // "httpMethod": "POST", + // "id": "compute.subnetworks.expandIpCidrRange", // "parameterOrder": [ - // "project" + // "project", + // "region", + // "subnetwork" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, // "type": "string" // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, // "type": "string" // }, - // "project": { - // "description": "Project ID for this request.", + // "subnetwork": { + // "description": "Name of the Subnetwork resource to update.", // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/routes", + // "path": "{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange", + // "request": { + // "$ref": "SubnetworksExpandIpCidrRangeRequest" + // }, // "response": { - // "$ref": "RouteList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *RoutesListCall) Pages(ctx context.Context, f func(*RouteList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.snapshots.delete": +// method id "compute.subnetworks.get": -type SnapshotsDeleteCall struct { - s *Service - project string - snapshot string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type SubnetworksGetCall struct { + s *Service + project string + region string + subnetwork string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified Snapshot resource. Keep in mind that -// deleting a single snapshot might not necessarily delete all the data -// on that snapshot. If any data on the snapshot that is marked for -// deletion is needed for subsequent snapshots, the data will be moved -// to the next corresponding snapshot. -// -// For more information, see Deleting snaphots. -// For details, see https://cloud.google.com/compute/docs/reference/latest/snapshots/delete -func (r *SnapshotsService) Delete(project string, snapshot string) *SnapshotsDeleteCall { - c := &SnapshotsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified subnetwork. Get a list of available +// subnetworks list() request. +func (r *SubnetworksService) Get(project string, region string, subnetwork string) *SubnetworksGetCall { + c := &SubnetworksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.snapshot = snapshot + c.region = region + c.subnetwork = subnetwork return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SnapshotsDeleteCall) Fields(s ...googleapi.Field) *SnapshotsDeleteCall { +func (c *SubnetworksGetCall) Fields(s ...googleapi.Field) *SubnetworksGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *SubnetworksGetCall) IfNoneMatch(entityTag string) *SubnetworksGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SnapshotsDeleteCall) Context(ctx context.Context) *SnapshotsDeleteCall { +func (c *SubnetworksGetCall) Context(ctx context.Context) *SubnetworksGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SnapshotsDeleteCall) Header() http.Header { +func (c *SubnetworksGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SnapshotsDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *SubnetworksGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{snapshot}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "snapshot": c.snapshot, + "project": c.project, + "region": c.region, + "subnetwork": c.subnetwork, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.snapshots.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.subnetworks.get" call. +// Exactly one of *Subnetwork or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at +// *Subnetwork.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *SnapshotsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *SubnetworksGetCall) Do(opts ...googleapi.CallOption) (*Subnetwork, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -46895,7 +54062,7 @@ func (c *SnapshotsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &Subnetwork{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -46907,12 +54074,13 @@ func (c *SnapshotsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro } return ret, nil // { - // "description": "Deletes the specified Snapshot resource. Keep in mind that deleting a single snapshot might not necessarily delete all the data on that snapshot. If any data on the snapshot that is marked for deletion is needed for subsequent snapshots, the data will be moved to the next corresponding snapshot.\n\nFor more information, see Deleting snaphots.", - // "httpMethod": "DELETE", - // "id": "compute.snapshots.delete", + // "description": "Returns the specified subnetwork. Get a list of available subnetworks list() request.", + // "httpMethod": "GET", + // "id": "compute.subnetworks.get", // "parameterOrder": [ // "project", - // "snapshot" + // "region", + // "subnetwork" // ], // "parameters": { // "project": { @@ -46922,113 +54090,113 @@ func (c *SnapshotsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, erro // "required": true, // "type": "string" // }, - // "snapshot": { - // "description": "Name of the Snapshot resource to delete.", + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "subnetwork": { + // "description": "Name of the Subnetwork resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/snapshots/{snapshot}", + // "path": "{project}/regions/{region}/subnetworks/{subnetwork}", // "response": { - // "$ref": "Operation" + // "$ref": "Subnetwork" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] - // } - -} - -// method id "compute.snapshots.get": - -type SnapshotsGetCall struct { - s *Service - project string - snapshot string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header + // } + } -// Get: Returns the specified Snapshot resource. Get a list of available -// snapshots by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/snapshots/get -func (r *SnapshotsService) Get(project string, snapshot string) *SnapshotsGetCall { - c := &SnapshotsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// method id "compute.subnetworks.insert": + +type SubnetworksInsertCall struct { + s *Service + project string + region string + subnetwork *Subnetwork + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Insert: Creates a subnetwork in the specified project using the data +// included in the request. +func (r *SubnetworksService) Insert(project string, region string, subnetwork *Subnetwork) *SubnetworksInsertCall { + c := &SubnetworksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.snapshot = snapshot + c.region = region + c.subnetwork = subnetwork return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SnapshotsGetCall) Fields(s ...googleapi.Field) *SnapshotsGetCall { +func (c *SubnetworksInsertCall) Fields(s ...googleapi.Field) *SubnetworksInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *SnapshotsGetCall) IfNoneMatch(entityTag string) *SnapshotsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SnapshotsGetCall) Context(ctx context.Context) *SnapshotsGetCall { +func (c *SubnetworksInsertCall) Context(ctx context.Context) *SubnetworksInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SnapshotsGetCall) Header() http.Header { +func (c *SubnetworksInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SnapshotsGetCall) doRequest(alt string) (*http.Response, error) { +func (c *SubnetworksInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetwork) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{snapshot}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "snapshot": c.snapshot, + "project": c.project, + "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.snapshots.get" call. -// Exactly one of *Snapshot or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *Snapshot.ServerResponse.Header or (if a response was returned at +// Do executes the "compute.subnetworks.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *SnapshotsGetCall) Do(opts ...googleapi.CallOption) (*Snapshot, error) { +func (c *SubnetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -47047,7 +54215,7 @@ func (c *SnapshotsGetCall) Do(opts ...googleapi.CallOption) (*Snapshot, error) { if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Snapshot{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -47059,12 +54227,12 @@ func (c *SnapshotsGetCall) Do(opts ...googleapi.CallOption) (*Snapshot, error) { } return ret, nil // { - // "description": "Returns the specified Snapshot resource. Get a list of available snapshots by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.snapshots.get", + // "description": "Creates a subnetwork in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.subnetworks.insert", // "parameterOrder": [ // "project", - // "snapshot" + // "region" // ], // "parameters": { // "project": { @@ -47074,51 +54242,53 @@ func (c *SnapshotsGetCall) Do(opts ...googleapi.CallOption) (*Snapshot, error) { // "required": true, // "type": "string" // }, - // "snapshot": { - // "description": "Name of the Snapshot resource to return.", + // "region": { + // "description": "Name of the region scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/snapshots/{snapshot}", + // "path": "{project}/regions/{region}/subnetworks", + // "request": { + // "$ref": "Subnetwork" + // }, // "response": { - // "$ref": "Snapshot" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.snapshots.list": +// method id "compute.subnetworks.list": -type SnapshotsListCall struct { +type SubnetworksListCall struct { s *Service project string + region string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves the list of Snapshot resources contained within the -// specified project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/snapshots/list -func (r *SnapshotsService) List(project string) *SnapshotsListCall { - c := &SnapshotsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of subnetworks available to the specified +// project. +func (r *SubnetworksService) List(project string, region string) *SubnetworksListCall { + c := &SubnetworksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -47130,7 +54300,7 @@ func (r *SnapshotsService) List(project string) *SnapshotsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -47142,7 +54312,7 @@ func (r *SnapshotsService) List(project string) *SnapshotsListCall { // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *SnapshotsListCall) Filter(filter string) *SnapshotsListCall { +func (c *SubnetworksListCall) Filter(filter string) *SubnetworksListCall { c.urlParams_.Set("filter", filter) return c } @@ -47153,7 +54323,7 @@ func (c *SnapshotsListCall) Filter(filter string) *SnapshotsListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *SnapshotsListCall) MaxResults(maxResults int64) *SnapshotsListCall { +func (c *SubnetworksListCall) MaxResults(maxResults int64) *SubnetworksListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -47170,7 +54340,7 @@ func (c *SnapshotsListCall) MaxResults(maxResults int64) *SnapshotsListCall { // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *SnapshotsListCall) OrderBy(orderBy string) *SnapshotsListCall { +func (c *SubnetworksListCall) OrderBy(orderBy string) *SubnetworksListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -47178,7 +54348,7 @@ func (c *SnapshotsListCall) OrderBy(orderBy string) *SnapshotsListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *SnapshotsListCall) PageToken(pageToken string) *SnapshotsListCall { +func (c *SubnetworksListCall) PageToken(pageToken string) *SubnetworksListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -47186,7 +54356,7 @@ func (c *SnapshotsListCall) PageToken(pageToken string) *SnapshotsListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SnapshotsListCall) Fields(s ...googleapi.Field) *SnapshotsListCall { +func (c *SubnetworksListCall) Fields(s ...googleapi.Field) *SubnetworksListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -47196,7 +54366,7 @@ func (c *SnapshotsListCall) Fields(s ...googleapi.Field) *SnapshotsListCall { // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *SnapshotsListCall) IfNoneMatch(entityTag string) *SnapshotsListCall { +func (c *SubnetworksListCall) IfNoneMatch(entityTag string) *SubnetworksListCall { c.ifNoneMatch_ = entityTag return c } @@ -47204,21 +54374,21 @@ func (c *SnapshotsListCall) IfNoneMatch(entityTag string) *SnapshotsListCall { // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SnapshotsListCall) Context(ctx context.Context) *SnapshotsListCall { +func (c *SubnetworksListCall) Context(ctx context.Context) *SubnetworksListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SnapshotsListCall) Header() http.Header { +func (c *SubnetworksListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SnapshotsListCall) doRequest(alt string) (*http.Response, error) { +func (c *SubnetworksListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -47229,24 +54399,25 @@ func (c *SnapshotsListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.snapshots.list" call. -// Exactly one of *SnapshotList or error will be non-nil. Any non-2xx +// Do executes the "compute.subnetworks.list" call. +// Exactly one of *SubnetworkList or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *SnapshotList.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *SnapshotsListCall) Do(opts ...googleapi.CallOption) (*SnapshotList, error) { +// *SubnetworkList.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *SubnetworksListCall) Do(opts ...googleapi.CallOption) (*SubnetworkList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -47265,7 +54436,7 @@ func (c *SnapshotsListCall) Do(opts ...googleapi.CallOption) (*SnapshotList, err if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &SnapshotList{ + ret := &SubnetworkList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -47277,15 +54448,16 @@ func (c *SnapshotsListCall) Do(opts ...googleapi.CallOption) (*SnapshotList, err } return ret, nil // { - // "description": "Retrieves the list of Snapshot resources contained within the specified project.", + // "description": "Retrieves a list of subnetworks available to the specified project.", // "httpMethod": "GET", - // "id": "compute.snapshots.list", + // "id": "compute.subnetworks.list", // "parameterOrder": [ - // "project" + // "project", + // "region" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -47313,11 +54485,18 @@ func (c *SnapshotsListCall) Do(opts ...googleapi.CallOption) (*SnapshotList, err // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/snapshots", + // "path": "{project}/regions/{region}/subnetworks", // "response": { - // "$ref": "SnapshotList" + // "$ref": "SubnetworkList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -47331,7 +54510,7 @@ func (c *SnapshotsListCall) Do(opts ...googleapi.CallOption) (*SnapshotList, err // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *SnapshotsListCall) Pages(ctx context.Context, f func(*SnapshotList) error) error { +func (c *SubnetworksListCall) Pages(ctx context.Context, f func(*SubnetworkList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -47349,29 +54528,35 @@ func (c *SnapshotsListCall) Pages(ctx context.Context, f func(*SnapshotList) err } } -// method id "compute.sslCertificates.delete": +// method id "compute.subnetworks.setPrivateIpGoogleAccess": -type SslCertificatesDeleteCall struct { - s *Service - project string - sslCertificate string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type SubnetworksSetPrivateIpGoogleAccessCall struct { + s *Service + project string + region string + subnetwork string + subnetworkssetprivateipgoogleaccessrequest *SubnetworksSetPrivateIpGoogleAccessRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified SslCertificate resource. -func (r *SslCertificatesService) Delete(project string, sslCertificate string) *SslCertificatesDeleteCall { - c := &SslCertificatesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetPrivateIpGoogleAccess: Set whether VMs in this subnet can access +// Google services without assigning external IP addresses through +// Private Google Access. +func (r *SubnetworksService) SetPrivateIpGoogleAccess(project string, region string, subnetwork string, subnetworkssetprivateipgoogleaccessrequest *SubnetworksSetPrivateIpGoogleAccessRequest) *SubnetworksSetPrivateIpGoogleAccessCall { + c := &SubnetworksSetPrivateIpGoogleAccessCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.sslCertificate = sslCertificate + c.region = region + c.subnetwork = subnetwork + c.subnetworkssetprivateipgoogleaccessrequest = subnetworkssetprivateipgoogleaccessrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SslCertificatesDeleteCall) Fields(s ...googleapi.Field) *SslCertificatesDeleteCall { +func (c *SubnetworksSetPrivateIpGoogleAccessCall) Fields(s ...googleapi.Field) *SubnetworksSetPrivateIpGoogleAccessCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -47379,47 +54564,53 @@ func (c *SslCertificatesDeleteCall) Fields(s ...googleapi.Field) *SslCertificate // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SslCertificatesDeleteCall) Context(ctx context.Context) *SslCertificatesDeleteCall { +func (c *SubnetworksSetPrivateIpGoogleAccessCall) Context(ctx context.Context) *SubnetworksSetPrivateIpGoogleAccessCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SslCertificatesDeleteCall) Header() http.Header { +func (c *SubnetworksSetPrivateIpGoogleAccessCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SslCertificatesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *SubnetworksSetPrivateIpGoogleAccessCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetworkssetprivateipgoogleaccessrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates/{sslCertificate}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "sslCertificate": c.sslCertificate, + "project": c.project, + "region": c.region, + "subnetwork": c.subnetwork, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.sslCertificates.delete" call. +// Do executes the "compute.subnetworks.setPrivateIpGoogleAccess" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *SslCertificatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *SubnetworksSetPrivateIpGoogleAccessCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -47450,12 +54641,13 @@ func (c *SslCertificatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Deletes the specified SslCertificate resource.", - // "httpMethod": "DELETE", - // "id": "compute.sslCertificates.delete", + // "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Private Google Access.", + // "httpMethod": "POST", + // "id": "compute.subnetworks.setPrivateIpGoogleAccess", // "parameterOrder": [ // "project", - // "sslCertificate" + // "region", + // "subnetwork" // ], // "parameters": { // "project": { @@ -47465,15 +54657,25 @@ func (c *SslCertificatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "required": true, // "type": "string" // }, - // "sslCertificate": { - // "description": "Name of the SslCertificate resource to delete.", + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "subnetwork": { + // "description": "Name of the Subnetwork resource.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/sslCertificates/{sslCertificate}", + // "path": "{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess", + // "request": { + // "$ref": "SubnetworksSetPrivateIpGoogleAccessRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -47485,92 +54687,78 @@ func (c *SslCertificatesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation } -// method id "compute.sslCertificates.get": +// method id "compute.targetHttpProxies.delete": -type SslCertificatesGetCall struct { - s *Service - project string - sslCertificate string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type TargetHttpProxiesDeleteCall struct { + s *Service + project string + targetHttpProxy string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified SslCertificate resource. Get a list of -// available SSL certificates by making a list() request. -func (r *SslCertificatesService) Get(project string, sslCertificate string) *SslCertificatesGetCall { - c := &SslCertificatesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified TargetHttpProxy resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/delete +func (r *TargetHttpProxiesService) Delete(project string, targetHttpProxy string) *TargetHttpProxiesDeleteCall { + c := &TargetHttpProxiesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.sslCertificate = sslCertificate + c.targetHttpProxy = targetHttpProxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SslCertificatesGetCall) Fields(s ...googleapi.Field) *SslCertificatesGetCall { +func (c *TargetHttpProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetHttpProxiesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *SslCertificatesGetCall) IfNoneMatch(entityTag string) *SslCertificatesGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SslCertificatesGetCall) Context(ctx context.Context) *SslCertificatesGetCall { +func (c *TargetHttpProxiesDeleteCall) Context(ctx context.Context) *TargetHttpProxiesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SslCertificatesGetCall) Header() http.Header { +func (c *TargetHttpProxiesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SslCertificatesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpProxiesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates/{sslCertificate}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies/{targetHttpProxy}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "sslCertificate": c.sslCertificate, + "project": c.project, + "targetHttpProxy": c.targetHttpProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.sslCertificates.get" call. -// Exactly one of *SslCertificate or error will be non-nil. Any non-2xx +// Do executes the "compute.targetHttpProxies.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *SslCertificate.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *SslCertificatesGetCall) Do(opts ...googleapi.CallOption) (*SslCertificate, error) { +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *TargetHttpProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -47589,7 +54777,7 @@ func (c *SslCertificatesGetCall) Do(opts ...googleapi.CallOption) (*SslCertifica if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &SslCertificate{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -47601,12 +54789,12 @@ func (c *SslCertificatesGetCall) Do(opts ...googleapi.CallOption) (*SslCertifica } return ret, nil // { - // "description": "Returns the specified SslCertificate resource. Get a list of available SSL certificates by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.sslCertificates.get", + // "description": "Deletes the specified TargetHttpProxy resource.", + // "httpMethod": "DELETE", + // "id": "compute.targetHttpProxies.delete", // "parameterOrder": [ // "project", - // "sslCertificate" + // "targetHttpProxy" // ], // "parameters": { // "project": { @@ -47616,103 +54804,113 @@ func (c *SslCertificatesGetCall) Do(opts ...googleapi.CallOption) (*SslCertifica // "required": true, // "type": "string" // }, - // "sslCertificate": { - // "description": "Name of the SslCertificate resource to return.", + // "targetHttpProxy": { + // "description": "Name of the TargetHttpProxy resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/sslCertificates/{sslCertificate}", + // "path": "{project}/global/targetHttpProxies/{targetHttpProxy}", // "response": { - // "$ref": "SslCertificate" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.sslCertificates.insert": +// method id "compute.targetHttpProxies.get": -type SslCertificatesInsertCall struct { - s *Service - project string - sslcertificate *SslCertificate - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetHttpProxiesGetCall struct { + s *Service + project string + targetHttpProxy string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Insert: Creates a SslCertificate resource in the specified project -// using the data included in the request. -func (r *SslCertificatesService) Insert(project string, sslcertificate *SslCertificate) *SslCertificatesInsertCall { - c := &SslCertificatesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified TargetHttpProxy resource. Get a list of +// available target HTTP proxies by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/get +func (r *TargetHttpProxiesService) Get(project string, targetHttpProxy string) *TargetHttpProxiesGetCall { + c := &TargetHttpProxiesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.sslcertificate = sslcertificate + c.targetHttpProxy = targetHttpProxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SslCertificatesInsertCall) Fields(s ...googleapi.Field) *SslCertificatesInsertCall { +func (c *TargetHttpProxiesGetCall) Fields(s ...googleapi.Field) *TargetHttpProxiesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *TargetHttpProxiesGetCall) IfNoneMatch(entityTag string) *TargetHttpProxiesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SslCertificatesInsertCall) Context(ctx context.Context) *SslCertificatesInsertCall { +func (c *TargetHttpProxiesGetCall) Context(ctx context.Context) *TargetHttpProxiesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SslCertificatesInsertCall) Header() http.Header { +func (c *TargetHttpProxiesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SslCertificatesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpProxiesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.sslcertificate) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies/{targetHttpProxy}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "targetHttpProxy": c.targetHttpProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.sslCertificates.insert" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx +// Do executes the "compute.targetHttpProxies.get" call. +// Exactly one of *TargetHttpProxy or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *SslCertificatesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// *TargetHttpProxy.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *TargetHttpProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHttpProxy, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -47731,7 +54929,7 @@ func (c *SslCertificatesInsertCall) Do(opts ...googleapi.CallOption) (*Operation if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &TargetHttpProxy{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -47743,11 +54941,12 @@ func (c *SslCertificatesInsertCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Creates a SslCertificate resource in the specified project using the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.sslCertificates.insert", + // "description": "Returns the specified TargetHttpProxy resource. Get a list of available target HTTP proxies by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.targetHttpProxies.get", // "parameterOrder": [ - // "project" + // "project", + // "targetHttpProxy" // ], // "parameters": { // "project": { @@ -47756,159 +54955,90 @@ func (c *SslCertificatesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "targetHttpProxy": { + // "description": "Name of the TargetHttpProxy resource to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/sslCertificates", - // "request": { - // "$ref": "SslCertificate" - // }, + // "path": "{project}/global/targetHttpProxies/{targetHttpProxy}", // "response": { - // "$ref": "Operation" + // "$ref": "TargetHttpProxy" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } - -// method id "compute.sslCertificates.list": - -type SslCertificatesListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} - -// List: Retrieves the list of SslCertificate resources available to the -// specified project. -func (r *SslCertificatesService) List(project string) *SslCertificatesListCall { - c := &SslCertificatesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *SslCertificatesListCall) Filter(filter string) *SslCertificatesListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *SslCertificatesListCall) MaxResults(maxResults int64) *SslCertificatesListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *SslCertificatesListCall) OrderBy(orderBy string) *SslCertificatesListCall { - c.urlParams_.Set("orderBy", orderBy) - return c + +// method id "compute.targetHttpProxies.insert": + +type TargetHttpProxiesInsertCall struct { + s *Service + project string + targethttpproxy *TargetHttpProxy + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *SslCertificatesListCall) PageToken(pageToken string) *SslCertificatesListCall { - c.urlParams_.Set("pageToken", pageToken) +// Insert: Creates a TargetHttpProxy resource in the specified project +// using the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/insert +func (r *TargetHttpProxiesService) Insert(project string, targethttpproxy *TargetHttpProxy) *TargetHttpProxiesInsertCall { + c := &TargetHttpProxiesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.targethttpproxy = targethttpproxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SslCertificatesListCall) Fields(s ...googleapi.Field) *SslCertificatesListCall { +func (c *TargetHttpProxiesInsertCall) Fields(s ...googleapi.Field) *TargetHttpProxiesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *SslCertificatesListCall) IfNoneMatch(entityTag string) *SslCertificatesListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SslCertificatesListCall) Context(ctx context.Context) *SslCertificatesListCall { +func (c *TargetHttpProxiesInsertCall) Context(ctx context.Context) *TargetHttpProxiesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SslCertificatesListCall) Header() http.Header { +func (c *TargetHttpProxiesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SslCertificatesListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpProxiesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpproxy) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, @@ -47916,14 +55046,14 @@ func (c *SslCertificatesListCall) doRequest(alt string) (*http.Response, error) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.sslCertificates.list" call. -// Exactly one of *SslCertificateList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *SslCertificateList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *SslCertificatesListCall) Do(opts ...googleapi.CallOption) (*SslCertificateList, error) { +// Do executes the "compute.targetHttpProxies.insert" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *TargetHttpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -47942,7 +55072,7 @@ func (c *SslCertificatesListCall) Do(opts ...googleapi.CallOption) (*SslCertific if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &SslCertificateList{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -47954,36 +55084,13 @@ func (c *SslCertificatesListCall) Do(opts ...googleapi.CallOption) (*SslCertific } return ret, nil // { - // "description": "Retrieves the list of SslCertificate resources available to the specified project.", - // "httpMethod": "GET", - // "id": "compute.sslCertificates.list", + // "description": "Creates a TargetHttpProxy resource in the specified project using the data included in the request.", + // "httpMethod": "POST", + // "id": "compute.targetHttpProxies.insert", // "parameterOrder": [ // "project" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -47992,43 +55099,24 @@ func (c *SslCertificatesListCall) Do(opts ...googleapi.CallOption) (*SslCertific // "type": "string" // } // }, - // "path": "{project}/global/sslCertificates", + // "path": "{project}/global/targetHttpProxies", + // "request": { + // "$ref": "TargetHttpProxy" + // }, // "response": { - // "$ref": "SslCertificateList" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *SslCertificatesListCall) Pages(ctx context.Context, f func(*SslCertificateList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.subnetworks.aggregatedList": +// method id "compute.targetHttpProxies.list": -type SubnetworksAggregatedListCall struct { +type TargetHttpProxiesListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -48037,17 +55125,18 @@ type SubnetworksAggregatedListCall struct { header_ http.Header } -// AggregatedList: Retrieves an aggregated list of subnetworks. -func (r *SubnetworksService) AggregatedList(project string) *SubnetworksAggregatedListCall { - c := &SubnetworksAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of TargetHttpProxy resources available to +// the specified project. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/list +func (r *TargetHttpProxiesService) List(project string) *TargetHttpProxiesListCall { + c := &TargetHttpProxiesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -48059,7 +55148,7 @@ func (r *SubnetworksService) AggregatedList(project string) *SubnetworksAggregat // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -48071,7 +55160,7 @@ func (r *SubnetworksService) AggregatedList(project string) *SubnetworksAggregat // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *SubnetworksAggregatedListCall) Filter(filter string) *SubnetworksAggregatedListCall { +func (c *TargetHttpProxiesListCall) Filter(filter string) *TargetHttpProxiesListCall { c.urlParams_.Set("filter", filter) return c } @@ -48082,7 +55171,7 @@ func (c *SubnetworksAggregatedListCall) Filter(filter string) *SubnetworksAggreg // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *SubnetworksAggregatedListCall) MaxResults(maxResults int64) *SubnetworksAggregatedListCall { +func (c *TargetHttpProxiesListCall) MaxResults(maxResults int64) *TargetHttpProxiesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -48099,7 +55188,7 @@ func (c *SubnetworksAggregatedListCall) MaxResults(maxResults int64) *Subnetwork // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *SubnetworksAggregatedListCall) OrderBy(orderBy string) *SubnetworksAggregatedListCall { +func (c *TargetHttpProxiesListCall) OrderBy(orderBy string) *TargetHttpProxiesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -48107,7 +55196,7 @@ func (c *SubnetworksAggregatedListCall) OrderBy(orderBy string) *SubnetworksAggr // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *SubnetworksAggregatedListCall) PageToken(pageToken string) *SubnetworksAggregatedListCall { +func (c *TargetHttpProxiesListCall) PageToken(pageToken string) *TargetHttpProxiesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -48115,7 +55204,7 @@ func (c *SubnetworksAggregatedListCall) PageToken(pageToken string) *Subnetworks // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SubnetworksAggregatedListCall) Fields(s ...googleapi.Field) *SubnetworksAggregatedListCall { +func (c *TargetHttpProxiesListCall) Fields(s ...googleapi.Field) *TargetHttpProxiesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -48125,7 +55214,7 @@ func (c *SubnetworksAggregatedListCall) Fields(s ...googleapi.Field) *Subnetwork // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *SubnetworksAggregatedListCall) IfNoneMatch(entityTag string) *SubnetworksAggregatedListCall { +func (c *TargetHttpProxiesListCall) IfNoneMatch(entityTag string) *TargetHttpProxiesListCall { c.ifNoneMatch_ = entityTag return c } @@ -48133,21 +55222,21 @@ func (c *SubnetworksAggregatedListCall) IfNoneMatch(entityTag string) *Subnetwor // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SubnetworksAggregatedListCall) Context(ctx context.Context) *SubnetworksAggregatedListCall { +func (c *TargetHttpProxiesListCall) Context(ctx context.Context) *TargetHttpProxiesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SubnetworksAggregatedListCall) Header() http.Header { +func (c *TargetHttpProxiesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SubnetworksAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpProxiesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -48158,7 +55247,7 @@ func (c *SubnetworksAggregatedListCall) doRequest(alt string) (*http.Response, e } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/subnetworks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -48168,14 +55257,14 @@ func (c *SubnetworksAggregatedListCall) doRequest(alt string) (*http.Response, e return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.subnetworks.aggregatedList" call. -// Exactly one of *SubnetworkAggregatedList or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *SubnetworkAggregatedList.ServerResponse.Header or (if a response was +// Do executes the "compute.targetHttpProxies.list" call. +// Exactly one of *TargetHttpProxyList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *TargetHttpProxyList.ServerResponse.Header or (if a response was // returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *SubnetworksAggregatedListCall) Do(opts ...googleapi.CallOption) (*SubnetworkAggregatedList, error) { +func (c *TargetHttpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHttpProxyList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -48194,7 +55283,7 @@ func (c *SubnetworksAggregatedListCall) Do(opts ...googleapi.CallOption) (*Subne if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &SubnetworkAggregatedList{ + ret := &TargetHttpProxyList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -48206,15 +55295,15 @@ func (c *SubnetworksAggregatedListCall) Do(opts ...googleapi.CallOption) (*Subne } return ret, nil // { - // "description": "Retrieves an aggregated list of subnetworks.", + // "description": "Retrieves the list of TargetHttpProxy resources available to the specified project.", // "httpMethod": "GET", - // "id": "compute.subnetworks.aggregatedList", + // "id": "compute.targetHttpProxies.list", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -48244,9 +55333,9 @@ func (c *SubnetworksAggregatedListCall) Do(opts ...googleapi.CallOption) (*Subne // "type": "string" // } // }, - // "path": "{project}/aggregated/subnetworks", + // "path": "{project}/global/targetHttpProxies", // "response": { - // "$ref": "SubnetworkAggregatedList" + // "$ref": "TargetHttpProxyList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -48260,7 +55349,7 @@ func (c *SubnetworksAggregatedListCall) Do(opts ...googleapi.CallOption) (*Subne // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *SubnetworksAggregatedListCall) Pages(ctx context.Context, f func(*SubnetworkAggregatedList) error) error { +func (c *TargetHttpProxiesListCall) Pages(ctx context.Context, f func(*TargetHttpProxyList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -48278,400 +55367,85 @@ func (c *SubnetworksAggregatedListCall) Pages(ctx context.Context, f func(*Subne } } -// method id "compute.subnetworks.delete": - -type SubnetworksDeleteCall struct { - s *Service - project string - region string - subnetwork string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Delete: Deletes the specified subnetwork. -func (r *SubnetworksService) Delete(project string, region string, subnetwork string) *SubnetworksDeleteCall { - c := &SubnetworksDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.region = region - c.subnetwork = subnetwork - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *SubnetworksDeleteCall) Fields(s ...googleapi.Field) *SubnetworksDeleteCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *SubnetworksDeleteCall) Context(ctx context.Context) *SubnetworksDeleteCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *SubnetworksDeleteCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *SubnetworksDeleteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "subnetwork": c.subnetwork, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.subnetworks.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *SubnetworksDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Deletes the specified subnetwork.", - // "httpMethod": "DELETE", - // "id": "compute.subnetworks.delete", - // "parameterOrder": [ - // "project", - // "region", - // "subnetwork" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "subnetwork": { - // "description": "Name of the Subnetwork resource to delete.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/regions/{region}/subnetworks/{subnetwork}", - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.subnetworks.expandIpCidrRange": - -type SubnetworksExpandIpCidrRangeCall struct { - s *Service - project string - region string - subnetwork string - subnetworksexpandipcidrrangerequest *SubnetworksExpandIpCidrRangeRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// ExpandIpCidrRange: Expands the IP CIDR range of the subnetwork to a -// specified value. -func (r *SubnetworksService) ExpandIpCidrRange(project string, region string, subnetwork string, subnetworksexpandipcidrrangerequest *SubnetworksExpandIpCidrRangeRequest) *SubnetworksExpandIpCidrRangeCall { - c := &SubnetworksExpandIpCidrRangeCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.region = region - c.subnetwork = subnetwork - c.subnetworksexpandipcidrrangerequest = subnetworksexpandipcidrrangerequest - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *SubnetworksExpandIpCidrRangeCall) Fields(s ...googleapi.Field) *SubnetworksExpandIpCidrRangeCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *SubnetworksExpandIpCidrRangeCall) Context(ctx context.Context) *SubnetworksExpandIpCidrRangeCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *SubnetworksExpandIpCidrRangeCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *SubnetworksExpandIpCidrRangeCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetworksexpandipcidrrangerequest) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "subnetwork": c.subnetwork, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.subnetworks.expandIpCidrRange" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *SubnetworksExpandIpCidrRangeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Expands the IP CIDR range of the subnetwork to a specified value.", - // "httpMethod": "POST", - // "id": "compute.subnetworks.expandIpCidrRange", - // "parameterOrder": [ - // "project", - // "region", - // "subnetwork" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "subnetwork": { - // "description": "Name of the Subnetwork resource to update.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange", - // "request": { - // "$ref": "SubnetworksExpandIpCidrRangeRequest" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.subnetworks.get": - -type SubnetworksGetCall struct { - s *Service - project string - region string - subnetwork string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header -} +// method id "compute.targetHttpProxies.setUrlMap": -// Get: Returns the specified subnetwork. Get a list of available -// subnetworks list() request. -func (r *SubnetworksService) Get(project string, region string, subnetwork string) *SubnetworksGetCall { - c := &SubnetworksGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +type TargetHttpProxiesSetUrlMapCall struct { + s *Service + project string + targetHttpProxy string + urlmapreference *UrlMapReference + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// SetUrlMap: Changes the URL map for TargetHttpProxy. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/setUrlMap +func (r *TargetHttpProxiesService) SetUrlMap(project string, targetHttpProxy string, urlmapreference *UrlMapReference) *TargetHttpProxiesSetUrlMapCall { + c := &TargetHttpProxiesSetUrlMapCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.subnetwork = subnetwork + c.targetHttpProxy = targetHttpProxy + c.urlmapreference = urlmapreference return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SubnetworksGetCall) Fields(s ...googleapi.Field) *SubnetworksGetCall { +func (c *TargetHttpProxiesSetUrlMapCall) Fields(s ...googleapi.Field) *TargetHttpProxiesSetUrlMapCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *SubnetworksGetCall) IfNoneMatch(entityTag string) *SubnetworksGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SubnetworksGetCall) Context(ctx context.Context) *SubnetworksGetCall { +func (c *TargetHttpProxiesSetUrlMapCall) Context(ctx context.Context) *TargetHttpProxiesSetUrlMapCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SubnetworksGetCall) Header() http.Header { +func (c *TargetHttpProxiesSetUrlMapCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SubnetworksGetCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpProxiesSetUrlMapCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "subnetwork": c.subnetwork, + "project": c.project, + "targetHttpProxy": c.targetHttpProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.subnetworks.get" call. -// Exactly one of *Subnetwork or error will be non-nil. Any non-2xx +// Do executes the "compute.targetHttpProxies.setUrlMap" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *Subnetwork.ServerResponse.Header or (if a response was returned at +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *SubnetworksGetCall) Do(opts ...googleapi.CallOption) (*Subnetwork, error) { +func (c *TargetHttpProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -48690,7 +55464,7 @@ func (c *SubnetworksGetCall) Do(opts ...googleapi.CallOption) (*Subnetwork, erro if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Subnetwork{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -48702,13 +55476,12 @@ func (c *SubnetworksGetCall) Do(opts ...googleapi.CallOption) (*Subnetwork, erro } return ret, nil // { - // "description": "Returns the specified subnetwork. Get a list of available subnetworks list() request.", - // "httpMethod": "GET", - // "id": "compute.subnetworks.get", + // "description": "Changes the URL map for TargetHttpProxy.", + // "httpMethod": "POST", + // "id": "compute.targetHttpProxies.setUrlMap", // "parameterOrder": [ // "project", - // "region", - // "subnetwork" + // "targetHttpProxy" // ], // "parameters": { // "project": { @@ -48718,60 +55491,52 @@ func (c *SubnetworksGetCall) Do(opts ...googleapi.CallOption) (*Subnetwork, erro // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "subnetwork": { - // "description": "Name of the Subnetwork resource to return.", + // "targetHttpProxy": { + // "description": "Name of the TargetHttpProxy to set a URL map for.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/subnetworks/{subnetwork}", + // "path": "{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap", + // "request": { + // "$ref": "UrlMapReference" + // }, // "response": { - // "$ref": "Subnetwork" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.subnetworks.insert": +// method id "compute.targetHttpsProxies.delete": -type SubnetworksInsertCall struct { - s *Service - project string - region string - subnetwork *Subnetwork - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetHttpsProxiesDeleteCall struct { + s *Service + project string + targetHttpsProxy string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates a subnetwork in the specified project using the data -// included in the request. -func (r *SubnetworksService) Insert(project string, region string, subnetwork *Subnetwork) *SubnetworksInsertCall { - c := &SubnetworksInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified TargetHttpsProxy resource. +func (r *TargetHttpsProxiesService) Delete(project string, targetHttpsProxy string) *TargetHttpsProxiesDeleteCall { + c := &TargetHttpsProxiesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.subnetwork = subnetwork + c.targetHttpsProxy = targetHttpsProxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SubnetworksInsertCall) Fields(s ...googleapi.Field) *SubnetworksInsertCall { +func (c *TargetHttpsProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -48779,52 +55544,47 @@ func (c *SubnetworksInsertCall) Fields(s ...googleapi.Field) *SubnetworksInsertC // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SubnetworksInsertCall) Context(ctx context.Context) *SubnetworksInsertCall { +func (c *TargetHttpsProxiesDeleteCall) Context(ctx context.Context) *TargetHttpsProxiesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SubnetworksInsertCall) Header() http.Header { +func (c *TargetHttpsProxiesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SubnetworksInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpsProxiesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetwork) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies/{targetHttpsProxy}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, + "project": c.project, + "targetHttpsProxy": c.targetHttpsProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.subnetworks.insert" call. +// Do executes the "compute.targetHttpsProxies.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *SubnetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetHttpsProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -48855,12 +55615,12 @@ func (c *SubnetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er } return ret, nil // { - // "description": "Creates a subnetwork in the specified project using the data included in the request.", - // "httpMethod": "POST", - // "id": "compute.subnetworks.insert", + // "description": "Deletes the specified TargetHttpsProxy resource.", + // "httpMethod": "DELETE", + // "id": "compute.targetHttpsProxies.delete", // "parameterOrder": [ // "project", - // "region" + // "targetHttpsProxy" // ], // "parameters": { // "project": { @@ -48870,18 +55630,15 @@ func (c *SubnetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", + // "targetHttpsProxy": { + // "description": "Name of the TargetHttpsProxy resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/subnetworks", - // "request": { - // "$ref": "Subnetwork" - // }, + // "path": "{project}/global/targetHttpsProxies/{targetHttpsProxy}", // "response": { // "$ref": "Operation" // }, @@ -48893,99 +55650,31 @@ func (c *SubnetworksInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er } -// method id "compute.subnetworks.list": +// method id "compute.targetHttpsProxies.get": -type SubnetworksListCall struct { - s *Service - project string - region string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type TargetHttpsProxiesGetCall struct { + s *Service + project string + targetHttpsProxy string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// List: Retrieves a list of subnetworks available to the specified -// project. -func (r *SubnetworksService) List(project string, region string) *SubnetworksListCall { - c := &SubnetworksListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified TargetHttpsProxy resource. Get a list of +// available target HTTPS proxies by making a list() request. +func (r *TargetHttpsProxiesService) Get(project string, targetHttpsProxy string) *TargetHttpsProxiesGetCall { + c := &TargetHttpsProxiesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - return c -} - -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *SubnetworksListCall) Filter(filter string) *SubnetworksListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *SubnetworksListCall) MaxResults(maxResults int64) *SubnetworksListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *SubnetworksListCall) OrderBy(orderBy string) *SubnetworksListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *SubnetworksListCall) PageToken(pageToken string) *SubnetworksListCall { - c.urlParams_.Set("pageToken", pageToken) + c.targetHttpsProxy = targetHttpsProxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SubnetworksListCall) Fields(s ...googleapi.Field) *SubnetworksListCall { +func (c *TargetHttpsProxiesGetCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -48995,7 +55684,7 @@ func (c *SubnetworksListCall) Fields(s ...googleapi.Field) *SubnetworksListCall // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *SubnetworksListCall) IfNoneMatch(entityTag string) *SubnetworksListCall { +func (c *TargetHttpsProxiesGetCall) IfNoneMatch(entityTag string) *TargetHttpsProxiesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -49003,21 +55692,21 @@ func (c *SubnetworksListCall) IfNoneMatch(entityTag string) *SubnetworksListCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SubnetworksListCall) Context(ctx context.Context) *SubnetworksListCall { +func (c *TargetHttpsProxiesGetCall) Context(ctx context.Context) *TargetHttpsProxiesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SubnetworksListCall) Header() http.Header { +func (c *TargetHttpsProxiesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SubnetworksListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpsProxiesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -49028,25 +55717,25 @@ func (c *SubnetworksListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies/{targetHttpsProxy}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, + "project": c.project, + "targetHttpsProxy": c.targetHttpsProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.subnetworks.list" call. -// Exactly one of *SubnetworkList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *SubnetworkList.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.targetHttpsProxies.get" call. +// Exactly one of *TargetHttpsProxy or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *TargetHttpsProxy.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *SubnetworksListCall) Do(opts ...googleapi.CallOption) (*SubnetworkList, error) { +func (c *TargetHttpsProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHttpsProxy, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -49065,7 +55754,7 @@ func (c *SubnetworksListCall) Do(opts ...googleapi.CallOption) (*SubnetworkList, if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &SubnetworkList{ + ret := &TargetHttpsProxy{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -49077,37 +55766,14 @@ func (c *SubnetworksListCall) Do(opts ...googleapi.CallOption) (*SubnetworkList, } return ret, nil // { - // "description": "Retrieves a list of subnetworks available to the specified project.", + // "description": "Returns the specified TargetHttpsProxy resource. Get a list of available target HTTPS proxies by making a list() request.", // "httpMethod": "GET", - // "id": "compute.subnetworks.list", + // "id": "compute.targetHttpsProxies.get", // "parameterOrder": [ // "project", - // "region" + // "targetHttpsProxy" // ], // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -49115,17 +55781,17 @@ func (c *SubnetworksListCall) Do(opts ...googleapi.CallOption) (*SubnetworkList, // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", + // "targetHttpsProxy": { + // "description": "Name of the TargetHttpsProxy resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/subnetworks", + // "path": "{project}/global/targetHttpsProxies/{targetHttpsProxy}", // "response": { - // "$ref": "SubnetworkList" + // "$ref": "TargetHttpsProxy" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -49136,56 +55802,30 @@ func (c *SubnetworksListCall) Do(opts ...googleapi.CallOption) (*SubnetworkList, } -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *SubnetworksListCall) Pages(ctx context.Context, f func(*SubnetworkList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.subnetworks.setPrivateIpGoogleAccess": +// method id "compute.targetHttpsProxies.insert": -type SubnetworksSetPrivateIpGoogleAccessCall struct { - s *Service - project string - region string - subnetwork string - subnetworkssetprivateipgoogleaccessrequest *SubnetworksSetPrivateIpGoogleAccessRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetHttpsProxiesInsertCall struct { + s *Service + project string + targethttpsproxy *TargetHttpsProxy + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetPrivateIpGoogleAccess: Set whether VMs in this subnet can access -// Google services without assigning external IP addresses through -// Cloudpath. -func (r *SubnetworksService) SetPrivateIpGoogleAccess(project string, region string, subnetwork string, subnetworkssetprivateipgoogleaccessrequest *SubnetworksSetPrivateIpGoogleAccessRequest) *SubnetworksSetPrivateIpGoogleAccessCall { - c := &SubnetworksSetPrivateIpGoogleAccessCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a TargetHttpsProxy resource in the specified project +// using the data included in the request. +func (r *TargetHttpsProxiesService) Insert(project string, targethttpsproxy *TargetHttpsProxy) *TargetHttpsProxiesInsertCall { + c := &TargetHttpsProxiesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.subnetwork = subnetwork - c.subnetworkssetprivateipgoogleaccessrequest = subnetworkssetprivateipgoogleaccessrequest + c.targethttpsproxy = targethttpsproxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *SubnetworksSetPrivateIpGoogleAccessCall) Fields(s ...googleapi.Field) *SubnetworksSetPrivateIpGoogleAccessCall { +func (c *TargetHttpsProxiesInsertCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -49193,53 +55833,51 @@ func (c *SubnetworksSetPrivateIpGoogleAccessCall) Fields(s ...googleapi.Field) * // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *SubnetworksSetPrivateIpGoogleAccessCall) Context(ctx context.Context) *SubnetworksSetPrivateIpGoogleAccessCall { +func (c *TargetHttpsProxiesInsertCall) Context(ctx context.Context) *TargetHttpsProxiesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *SubnetworksSetPrivateIpGoogleAccessCall) Header() http.Header { +func (c *TargetHttpsProxiesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *SubnetworksSetPrivateIpGoogleAccessCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpsProxiesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetworkssetprivateipgoogleaccessrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxy) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "subnetwork": c.subnetwork, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.subnetworks.setPrivateIpGoogleAccess" call. +// Do executes the "compute.targetHttpsProxies.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *SubnetworksSetPrivateIpGoogleAccessCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetHttpsProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -49270,13 +55908,11 @@ func (c *SubnetworksSetPrivateIpGoogleAccessCall) Do(opts ...googleapi.CallOptio } return ret, nil // { - // "description": "Set whether VMs in this subnet can access Google services without assigning external IP addresses through Cloudpath.", + // "description": "Creates a TargetHttpsProxy resource in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.subnetworks.setPrivateIpGoogleAccess", + // "id": "compute.targetHttpsProxies.insert", // "parameterOrder": [ - // "project", - // "region", - // "subnetwork" + // "project" // ], // "parameters": { // "project": { @@ -49285,25 +55921,11 @@ func (c *SubnetworksSetPrivateIpGoogleAccessCall) Do(opts ...googleapi.CallOptio // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "subnetwork": { - // "description": "Name of the Subnetwork resource.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess", + // "path": "{project}/global/targetHttpsProxies", // "request": { - // "$ref": "SubnetworksSetPrivateIpGoogleAccessRequest" + // "$ref": "TargetHttpsProxy" // }, // "response": { // "$ref": "Operation" @@ -49316,78 +55938,156 @@ func (c *SubnetworksSetPrivateIpGoogleAccessCall) Do(opts ...googleapi.CallOptio } -// method id "compute.targetHttpProxies.delete": +// method id "compute.targetHttpsProxies.list": -type TargetHttpProxiesDeleteCall struct { - s *Service - project string - targetHttpProxy string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetHttpsProxiesListCall struct { + s *Service + project string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified TargetHttpProxy resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/delete -func (r *TargetHttpProxiesService) Delete(project string, targetHttpProxy string) *TargetHttpProxiesDeleteCall { - c := &TargetHttpProxiesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of TargetHttpsProxy resources available to +// the specified project. +func (r *TargetHttpsProxiesService) List(project string) *TargetHttpsProxiesListCall { + c := &TargetHttpsProxiesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetHttpProxy = targetHttpProxy + return c +} + +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. +// +// The field_name is the name of the field you want to compare. Only +// atomic field types are supported (string, number, boolean). The +// comparison_string must be either eq (equals) or ne (not equals). The +// literal_string is the string value to filter to. The literal value +// must be valid for the type of field you are filtering by (string, +// number, boolean). For string fields, the literal value is interpreted +// as a regular expression using RE2 syntax. The literal value must +// match the entire field. +// +// For example, to filter for instances that do not have a name of +// example-instance, you would use name ne example-instance. +// +// You can filter on nested fields. For example, you could filter on +// instances that have set the scheduling.automaticRestart field to +// true. Use filtering on nested fields to take advantage of labels to +// organize and search for results based on label values. +// +// To filter on multiple expressions, provide each separate expression +// within parentheses. For example, (scheduling.automaticRestart eq +// true) (zone eq us-central1-f). Multiple expressions are treated as +// AND expressions, meaning that resources must match all expressions to +// pass the filters. +func (c *TargetHttpsProxiesListCall) Filter(filter string) *TargetHttpsProxiesListCall { + c.urlParams_.Set("filter", filter) + return c +} + +// MaxResults sets the optional parameter "maxResults": The maximum +// number of results per page that should be returned. If the number of +// available results is larger than maxResults, Compute Engine returns a +// nextPageToken that can be used to get the next page of results in +// subsequent list requests. Acceptable values are 0 to 500, inclusive. +// (Default: 500) +func (c *TargetHttpsProxiesListCall) MaxResults(maxResults int64) *TargetHttpsProxiesListCall { + c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) + return c +} + +// OrderBy sets the optional parameter "orderBy": Sorts list results by +// a certain order. By default, results are returned in alphanumerical +// order based on the resource name. +// +// You can also sort results in descending order based on the creation +// timestamp using orderBy="creationTimestamp desc". This sorts results +// based on the creationTimestamp field in reverse chronological order +// (newest result first). Use this to sort resources like operations so +// that the newest operation is returned first. +// +// Currently, only sorting by name or creationTimestamp desc is +// supported. +func (c *TargetHttpsProxiesListCall) OrderBy(orderBy string) *TargetHttpsProxiesListCall { + c.urlParams_.Set("orderBy", orderBy) + return c +} + +// PageToken sets the optional parameter "pageToken": Specifies a page +// token to use. Set pageToken to the nextPageToken returned by a +// previous list request to get the next page of results. +func (c *TargetHttpsProxiesListCall) PageToken(pageToken string) *TargetHttpsProxiesListCall { + c.urlParams_.Set("pageToken", pageToken) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetHttpProxiesDeleteCall { +func (c *TargetHttpsProxiesListCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *TargetHttpsProxiesListCall) IfNoneMatch(entityTag string) *TargetHttpsProxiesListCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpProxiesDeleteCall) Context(ctx context.Context) *TargetHttpProxiesDeleteCall { +func (c *TargetHttpsProxiesListCall) Context(ctx context.Context) *TargetHttpsProxiesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpProxiesDeleteCall) Header() http.Header { +func (c *TargetHttpsProxiesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpProxiesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpsProxiesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies/{targetHttpProxy}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "targetHttpProxy": c.targetHttpProxy, + "project": c.project, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpProxies.delete" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *TargetHttpProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +// Do executes the "compute.targetHttpsProxies.list" call. +// Exactly one of *TargetHttpsProxyList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *TargetHttpsProxyList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *TargetHttpsProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHttpsProxyList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -49406,7 +56106,7 @@ func (c *TargetHttpProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operati if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &Operation{ + ret := &TargetHttpsProxyList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -49418,128 +56118,156 @@ func (c *TargetHttpProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Deletes the specified TargetHttpProxy resource.", - // "httpMethod": "DELETE", - // "id": "compute.targetHttpProxies.delete", + // "description": "Retrieves the list of TargetHttpsProxy resources available to the specified project.", + // "httpMethod": "GET", + // "id": "compute.targetHttpsProxies.list", // "parameterOrder": [ - // "project", - // "targetHttpProxy" + // "project" // ], // "parameters": { + // "filter": { + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "location": "query", + // "type": "string" + // }, + // "maxResults": { + // "default": "500", + // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", + // "format": "uint32", + // "location": "query", + // "minimum": "0", + // "type": "integer" + // }, + // "orderBy": { + // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", + // "location": "query", + // "type": "string" + // }, + // "pageToken": { + // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + // "location": "query", + // "type": "string" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "targetHttpProxy": { - // "description": "Name of the TargetHttpProxy resource to delete.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/global/targetHttpProxies/{targetHttpProxy}", + // "path": "{project}/global/targetHttpsProxies", // "response": { - // "$ref": "Operation" + // "$ref": "TargetHttpsProxyList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" // ] // } } -// method id "compute.targetHttpProxies.get": +// Pages invokes f for each page of results. +// A non-nil error returned from f will halt the iteration. +// The provided context supersedes any context provided to the Context method. +func (c *TargetHttpsProxiesListCall) Pages(ctx context.Context, f func(*TargetHttpsProxyList) error) error { + c.ctx_ = ctx + defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point + for { + x, err := c.Do() + if err != nil { + return err + } + if err := f(x); err != nil { + return err + } + if x.NextPageToken == "" { + return nil + } + c.PageToken(x.NextPageToken) + } +} -type TargetHttpProxiesGetCall struct { - s *Service - project string - targetHttpProxy string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +// method id "compute.targetHttpsProxies.setSslCertificates": + +type TargetHttpsProxiesSetSslCertificatesCall struct { + s *Service + project string + targetHttpsProxy string + targethttpsproxiessetsslcertificatesrequest *TargetHttpsProxiesSetSslCertificatesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified TargetHttpProxy resource. Get a list of -// available target HTTP proxies by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/get -func (r *TargetHttpProxiesService) Get(project string, targetHttpProxy string) *TargetHttpProxiesGetCall { - c := &TargetHttpProxiesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetSslCertificates: Replaces SslCertificates for TargetHttpsProxy. +func (r *TargetHttpsProxiesService) SetSslCertificates(project string, targetHttpsProxy string, targethttpsproxiessetsslcertificatesrequest *TargetHttpsProxiesSetSslCertificatesRequest) *TargetHttpsProxiesSetSslCertificatesCall { + c := &TargetHttpsProxiesSetSslCertificatesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetHttpProxy = targetHttpProxy + c.targetHttpsProxy = targetHttpsProxy + c.targethttpsproxiessetsslcertificatesrequest = targethttpsproxiessetsslcertificatesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpProxiesGetCall) Fields(s ...googleapi.Field) *TargetHttpProxiesGetCall { +func (c *TargetHttpsProxiesSetSslCertificatesCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesSetSslCertificatesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *TargetHttpProxiesGetCall) IfNoneMatch(entityTag string) *TargetHttpProxiesGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpProxiesGetCall) Context(ctx context.Context) *TargetHttpProxiesGetCall { +func (c *TargetHttpsProxiesSetSslCertificatesCall) Context(ctx context.Context) *TargetHttpsProxiesSetSslCertificatesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpProxiesGetCall) Header() http.Header { +func (c *TargetHttpsProxiesSetSslCertificatesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpProxiesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpsProxiesSetSslCertificatesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxiessetsslcertificatesrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies/{targetHttpProxy}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "targetHttpProxy": c.targetHttpProxy, + "project": c.project, + "targetHttpsProxy": c.targetHttpsProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpProxies.get" call. -// Exactly one of *TargetHttpProxy or error will be non-nil. Any non-2xx +// Do executes the "compute.targetHttpsProxies.setSslCertificates" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *TargetHttpProxy.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *TargetHttpProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHttpProxy, error) { +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *TargetHttpsProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -49558,7 +56286,7 @@ func (c *TargetHttpProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHttp if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetHttpProxy{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -49570,12 +56298,12 @@ func (c *TargetHttpProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHttp } return ret, nil // { - // "description": "Returns the specified TargetHttpProxy resource. Get a list of available target HTTP proxies by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.targetHttpProxies.get", + // "description": "Replaces SslCertificates for TargetHttpsProxy.", + // "httpMethod": "POST", + // "id": "compute.targetHttpsProxies.setSslCertificates", // "parameterOrder": [ // "project", - // "targetHttpProxy" + // "targetHttpsProxy" // ], // "parameters": { // "project": { @@ -49585,52 +56313,54 @@ func (c *TargetHttpProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHttp // "required": true, // "type": "string" // }, - // "targetHttpProxy": { - // "description": "Name of the TargetHttpProxy resource to return.", + // "targetHttpsProxy": { + // "description": "Name of the TargetHttpsProxy resource to set an SslCertificates resource for.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/targetHttpProxies/{targetHttpProxy}", + // "path": "{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates", + // "request": { + // "$ref": "TargetHttpsProxiesSetSslCertificatesRequest" + // }, // "response": { - // "$ref": "TargetHttpProxy" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.targetHttpProxies.insert": +// method id "compute.targetHttpsProxies.setUrlMap": -type TargetHttpProxiesInsertCall struct { - s *Service - project string - targethttpproxy *TargetHttpProxy - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetHttpsProxiesSetUrlMapCall struct { + s *Service + project string + targetHttpsProxy string + urlmapreference *UrlMapReference + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates a TargetHttpProxy resource in the specified project -// using the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/insert -func (r *TargetHttpProxiesService) Insert(project string, targethttpproxy *TargetHttpProxy) *TargetHttpProxiesInsertCall { - c := &TargetHttpProxiesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetUrlMap: Changes the URL map for TargetHttpsProxy. +func (r *TargetHttpsProxiesService) SetUrlMap(project string, targetHttpsProxy string, urlmapreference *UrlMapReference) *TargetHttpsProxiesSetUrlMapCall { + c := &TargetHttpsProxiesSetUrlMapCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targethttpproxy = targethttpproxy + c.targetHttpsProxy = targetHttpsProxy + c.urlmapreference = urlmapreference return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpProxiesInsertCall) Fields(s ...googleapi.Field) *TargetHttpProxiesInsertCall { +func (c *TargetHttpsProxiesSetUrlMapCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesSetUrlMapCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -49638,51 +56368,52 @@ func (c *TargetHttpProxiesInsertCall) Fields(s ...googleapi.Field) *TargetHttpPr // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpProxiesInsertCall) Context(ctx context.Context) *TargetHttpProxiesInsertCall { +func (c *TargetHttpsProxiesSetUrlMapCall) Context(ctx context.Context) *TargetHttpsProxiesSetUrlMapCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpProxiesInsertCall) Header() http.Header { +func (c *TargetHttpsProxiesSetUrlMapCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpProxiesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetHttpsProxiesSetUrlMapCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpproxy) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, + "project": c.project, + "targetHttpsProxy": c.targetHttpsProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpProxies.insert" call. +// Do executes the "compute.targetHttpsProxies.setUrlMap" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetHttpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetHttpsProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -49713,11 +56444,12 @@ func (c *TargetHttpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operati } return ret, nil // { - // "description": "Creates a TargetHttpProxy resource in the specified project using the data included in the request.", + // "description": "Changes the URL map for TargetHttpsProxy.", // "httpMethod": "POST", - // "id": "compute.targetHttpProxies.insert", + // "id": "compute.targetHttpsProxies.setUrlMap", // "parameterOrder": [ - // "project" + // "project", + // "targetHttpsProxy" // ], // "parameters": { // "project": { @@ -49726,11 +56458,18 @@ func (c *TargetHttpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operati // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "targetHttpsProxy": { + // "description": "Name of the TargetHttpsProxy resource whose URL map is to be set.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/targetHttpProxies", + // "path": "{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap", // "request": { - // "$ref": "TargetHttpProxy" + // "$ref": "UrlMapReference" // }, // "response": { // "$ref": "Operation" @@ -49743,9 +56482,9 @@ func (c *TargetHttpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operati } -// method id "compute.targetHttpProxies.list": +// method id "compute.targetInstances.aggregatedList": -type TargetHttpProxiesListCall struct { +type TargetInstancesAggregatedListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -49754,19 +56493,17 @@ type TargetHttpProxiesListCall struct { header_ http.Header } -// List: Retrieves the list of TargetHttpProxy resources available to -// the specified project. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/list -func (r *TargetHttpProxiesService) List(project string) *TargetHttpProxiesListCall { - c := &TargetHttpProxiesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves an aggregated list of target instances. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/aggregatedList +func (r *TargetInstancesService) AggregatedList(project string) *TargetInstancesAggregatedListCall { + c := &TargetInstancesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -49778,7 +56515,7 @@ func (r *TargetHttpProxiesService) List(project string) *TargetHttpProxiesListCa // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -49790,7 +56527,7 @@ func (r *TargetHttpProxiesService) List(project string) *TargetHttpProxiesListCa // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *TargetHttpProxiesListCall) Filter(filter string) *TargetHttpProxiesListCall { +func (c *TargetInstancesAggregatedListCall) Filter(filter string) *TargetInstancesAggregatedListCall { c.urlParams_.Set("filter", filter) return c } @@ -49801,7 +56538,7 @@ func (c *TargetHttpProxiesListCall) Filter(filter string) *TargetHttpProxiesList // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *TargetHttpProxiesListCall) MaxResults(maxResults int64) *TargetHttpProxiesListCall { +func (c *TargetInstancesAggregatedListCall) MaxResults(maxResults int64) *TargetInstancesAggregatedListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -49818,7 +56555,7 @@ func (c *TargetHttpProxiesListCall) MaxResults(maxResults int64) *TargetHttpProx // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *TargetHttpProxiesListCall) OrderBy(orderBy string) *TargetHttpProxiesListCall { +func (c *TargetInstancesAggregatedListCall) OrderBy(orderBy string) *TargetInstancesAggregatedListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -49826,7 +56563,7 @@ func (c *TargetHttpProxiesListCall) OrderBy(orderBy string) *TargetHttpProxiesLi // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *TargetHttpProxiesListCall) PageToken(pageToken string) *TargetHttpProxiesListCall { +func (c *TargetInstancesAggregatedListCall) PageToken(pageToken string) *TargetInstancesAggregatedListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -49834,7 +56571,7 @@ func (c *TargetHttpProxiesListCall) PageToken(pageToken string) *TargetHttpProxi // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpProxiesListCall) Fields(s ...googleapi.Field) *TargetHttpProxiesListCall { +func (c *TargetInstancesAggregatedListCall) Fields(s ...googleapi.Field) *TargetInstancesAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -49844,7 +56581,7 @@ func (c *TargetHttpProxiesListCall) Fields(s ...googleapi.Field) *TargetHttpProx // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *TargetHttpProxiesListCall) IfNoneMatch(entityTag string) *TargetHttpProxiesListCall { +func (c *TargetInstancesAggregatedListCall) IfNoneMatch(entityTag string) *TargetInstancesAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -49852,21 +56589,21 @@ func (c *TargetHttpProxiesListCall) IfNoneMatch(entityTag string) *TargetHttpPro // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpProxiesListCall) Context(ctx context.Context) *TargetHttpProxiesListCall { +func (c *TargetInstancesAggregatedListCall) Context(ctx context.Context) *TargetInstancesAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpProxiesListCall) Header() http.Header { +func (c *TargetInstancesAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpProxiesListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetInstancesAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -49877,7 +56614,7 @@ func (c *TargetHttpProxiesListCall) doRequest(alt string) (*http.Response, error } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/targetInstances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -49887,14 +56624,14 @@ func (c *TargetHttpProxiesListCall) doRequest(alt string) (*http.Response, error return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpProxies.list" call. -// Exactly one of *TargetHttpProxyList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *TargetHttpProxyList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.targetInstances.aggregatedList" call. +// Exactly one of *TargetInstanceAggregatedList or error will be +// non-nil. Any non-2xx status code is an error. Response headers are in +// either *TargetInstanceAggregatedList.ServerResponse.Header or (if a +// response was returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetHttpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHttpProxyList, error) { +func (c *TargetInstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*TargetInstanceAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -49913,7 +56650,7 @@ func (c *TargetHttpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHtt if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetHttpProxyList{ + ret := &TargetInstanceAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -49925,15 +56662,15 @@ func (c *TargetHttpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHtt } return ret, nil // { - // "description": "Retrieves the list of TargetHttpProxy resources available to the specified project.", + // "description": "Retrieves an aggregated list of target instances.", // "httpMethod": "GET", - // "id": "compute.targetHttpProxies.list", + // "id": "compute.targetInstances.aggregatedList", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -49963,9 +56700,9 @@ func (c *TargetHttpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHtt // "type": "string" // } // }, - // "path": "{project}/global/targetHttpProxies", + // "path": "{project}/aggregated/targetInstances", // "response": { - // "$ref": "TargetHttpProxyList" + // "$ref": "TargetInstanceAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -49979,7 +56716,7 @@ func (c *TargetHttpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHtt // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *TargetHttpProxiesListCall) Pages(ctx context.Context, f func(*TargetHttpProxyList) error) error { +func (c *TargetInstancesAggregatedListCall) Pages(ctx context.Context, f func(*TargetInstanceAggregatedList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -49997,176 +56734,32 @@ func (c *TargetHttpProxiesListCall) Pages(ctx context.Context, f func(*TargetHtt } } -// method id "compute.targetHttpProxies.setUrlMap": - -type TargetHttpProxiesSetUrlMapCall struct { - s *Service - project string - targetHttpProxy string - urlmapreference *UrlMapReference - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// SetUrlMap: Changes the URL map for TargetHttpProxy. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetHttpProxies/setUrlMap -func (r *TargetHttpProxiesService) SetUrlMap(project string, targetHttpProxy string, urlmapreference *UrlMapReference) *TargetHttpProxiesSetUrlMapCall { - c := &TargetHttpProxiesSetUrlMapCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.targetHttpProxy = targetHttpProxy - c.urlmapreference = urlmapreference - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *TargetHttpProxiesSetUrlMapCall) Fields(s ...googleapi.Field) *TargetHttpProxiesSetUrlMapCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *TargetHttpProxiesSetUrlMapCall) Context(ctx context.Context) *TargetHttpProxiesSetUrlMapCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *TargetHttpProxiesSetUrlMapCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *TargetHttpProxiesSetUrlMapCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "targetHttpProxy": c.targetHttpProxy, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.targetHttpProxies.setUrlMap" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *TargetHttpProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Changes the URL map for TargetHttpProxy.", - // "httpMethod": "POST", - // "id": "compute.targetHttpProxies.setUrlMap", - // "parameterOrder": [ - // "project", - // "targetHttpProxy" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "targetHttpProxy": { - // "description": "Name of the TargetHttpProxy to set a URL map for.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap", - // "request": { - // "$ref": "UrlMapReference" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.targetHttpsProxies.delete": +// method id "compute.targetInstances.delete": -type TargetHttpsProxiesDeleteCall struct { - s *Service - project string - targetHttpsProxy string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetInstancesDeleteCall struct { + s *Service + project string + zone string + targetInstance string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified TargetHttpsProxy resource. -func (r *TargetHttpsProxiesService) Delete(project string, targetHttpsProxy string) *TargetHttpsProxiesDeleteCall { - c := &TargetHttpsProxiesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified TargetInstance resource. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/delete +func (r *TargetInstancesService) Delete(project string, zone string, targetInstance string) *TargetInstancesDeleteCall { + c := &TargetInstancesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetHttpsProxy = targetHttpsProxy + c.zone = zone + c.targetInstance = targetInstance return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpsProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesDeleteCall { +func (c *TargetInstancesDeleteCall) Fields(s ...googleapi.Field) *TargetInstancesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -50174,21 +56767,21 @@ func (c *TargetHttpsProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetHttps // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpsProxiesDeleteCall) Context(ctx context.Context) *TargetHttpsProxiesDeleteCall { +func (c *TargetInstancesDeleteCall) Context(ctx context.Context) *TargetInstancesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpsProxiesDeleteCall) Header() http.Header { +func (c *TargetInstancesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpsProxiesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetInstancesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -50196,25 +56789,26 @@ func (c *TargetHttpsProxiesDeleteCall) doRequest(alt string) (*http.Response, er reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies/{targetHttpsProxy}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances/{targetInstance}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "targetHttpsProxy": c.targetHttpsProxy, + "project": c.project, + "zone": c.zone, + "targetInstance": c.targetInstance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpsProxies.delete" call. +// Do executes the "compute.targetInstances.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetHttpsProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetInstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -50245,12 +56839,13 @@ func (c *TargetHttpsProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operat } return ret, nil // { - // "description": "Deletes the specified TargetHttpsProxy resource.", + // "description": "Deletes the specified TargetInstance resource.", // "httpMethod": "DELETE", - // "id": "compute.targetHttpsProxies.delete", + // "id": "compute.targetInstances.delete", // "parameterOrder": [ // "project", - // "targetHttpsProxy" + // "zone", + // "targetInstance" // ], // "parameters": { // "project": { @@ -50260,15 +56855,22 @@ func (c *TargetHttpsProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operat // "required": true, // "type": "string" // }, - // "targetHttpsProxy": { - // "description": "Name of the TargetHttpsProxy resource to delete.", + // "targetInstance": { + // "description": "Name of the TargetInstance resource to delete.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "Name of the zone scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/targetHttpsProxies/{targetHttpsProxy}", + // "path": "{project}/zones/{zone}/targetInstances/{targetInstance}", // "response": { // "$ref": "Operation" // }, @@ -50280,31 +56882,34 @@ func (c *TargetHttpsProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operat } -// method id "compute.targetHttpsProxies.get": +// method id "compute.targetInstances.get": -type TargetHttpsProxiesGetCall struct { - s *Service - project string - targetHttpsProxy string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type TargetInstancesGetCall struct { + s *Service + project string + zone string + targetInstance string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified TargetHttpsProxy resource. Get a list of -// available target HTTPS proxies by making a list() request. -func (r *TargetHttpsProxiesService) Get(project string, targetHttpsProxy string) *TargetHttpsProxiesGetCall { - c := &TargetHttpsProxiesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified TargetInstance resource. Get a list of +// available target instances by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/get +func (r *TargetInstancesService) Get(project string, zone string, targetInstance string) *TargetInstancesGetCall { + c := &TargetInstancesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetHttpsProxy = targetHttpsProxy + c.zone = zone + c.targetInstance = targetInstance return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpsProxiesGetCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesGetCall { +func (c *TargetInstancesGetCall) Fields(s ...googleapi.Field) *TargetInstancesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -50314,7 +56919,7 @@ func (c *TargetHttpsProxiesGetCall) Fields(s ...googleapi.Field) *TargetHttpsPro // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *TargetHttpsProxiesGetCall) IfNoneMatch(entityTag string) *TargetHttpsProxiesGetCall { +func (c *TargetInstancesGetCall) IfNoneMatch(entityTag string) *TargetInstancesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -50322,21 +56927,21 @@ func (c *TargetHttpsProxiesGetCall) IfNoneMatch(entityTag string) *TargetHttpsPr // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpsProxiesGetCall) Context(ctx context.Context) *TargetHttpsProxiesGetCall { +func (c *TargetInstancesGetCall) Context(ctx context.Context) *TargetInstancesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpsProxiesGetCall) Header() http.Header { +func (c *TargetInstancesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpsProxiesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetInstancesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -50347,25 +56952,26 @@ func (c *TargetHttpsProxiesGetCall) doRequest(alt string) (*http.Response, error } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies/{targetHttpsProxy}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances/{targetInstance}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "targetHttpsProxy": c.targetHttpsProxy, + "project": c.project, + "zone": c.zone, + "targetInstance": c.targetInstance, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpsProxies.get" call. -// Exactly one of *TargetHttpsProxy or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *TargetHttpsProxy.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.targetInstances.get" call. +// Exactly one of *TargetInstance or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *TargetInstance.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetHttpsProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHttpsProxy, error) { +func (c *TargetInstancesGetCall) Do(opts ...googleapi.CallOption) (*TargetInstance, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -50384,7 +56990,7 @@ func (c *TargetHttpsProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHtt if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetHttpsProxy{ + ret := &TargetInstance{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -50396,12 +57002,13 @@ func (c *TargetHttpsProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHtt } return ret, nil // { - // "description": "Returns the specified TargetHttpsProxy resource. Get a list of available target HTTPS proxies by making a list() request.", + // "description": "Returns the specified TargetInstance resource. Get a list of available target instances by making a list() request.", // "httpMethod": "GET", - // "id": "compute.targetHttpsProxies.get", + // "id": "compute.targetInstances.get", // "parameterOrder": [ // "project", - // "targetHttpsProxy" + // "zone", + // "targetInstance" // ], // "parameters": { // "project": { @@ -50411,17 +57018,24 @@ func (c *TargetHttpsProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHtt // "required": true, // "type": "string" // }, - // "targetHttpsProxy": { - // "description": "Name of the TargetHttpsProxy resource to return.", + // "targetInstance": { + // "description": "Name of the TargetInstance resource to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "Name of the zone scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/targetHttpsProxies/{targetHttpsProxy}", + // "path": "{project}/zones/{zone}/targetInstances/{targetInstance}", // "response": { - // "$ref": "TargetHttpsProxy" + // "$ref": "TargetInstance" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -50432,30 +57046,33 @@ func (c *TargetHttpsProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetHtt } -// method id "compute.targetHttpsProxies.insert": +// method id "compute.targetInstances.insert": -type TargetHttpsProxiesInsertCall struct { - s *Service - project string - targethttpsproxy *TargetHttpsProxy - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetInstancesInsertCall struct { + s *Service + project string + zone string + targetinstance *TargetInstance + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates a TargetHttpsProxy resource in the specified project -// using the data included in the request. -func (r *TargetHttpsProxiesService) Insert(project string, targethttpsproxy *TargetHttpsProxy) *TargetHttpsProxiesInsertCall { - c := &TargetHttpsProxiesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a TargetInstance resource in the specified project +// and zone using the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/insert +func (r *TargetInstancesService) Insert(project string, zone string, targetinstance *TargetInstance) *TargetInstancesInsertCall { + c := &TargetInstancesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targethttpsproxy = targethttpsproxy + c.zone = zone + c.targetinstance = targetinstance return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpsProxiesInsertCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesInsertCall { +func (c *TargetInstancesInsertCall) Fields(s ...googleapi.Field) *TargetInstancesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -50463,51 +57080,52 @@ func (c *TargetHttpsProxiesInsertCall) Fields(s ...googleapi.Field) *TargetHttps // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpsProxiesInsertCall) Context(ctx context.Context) *TargetHttpsProxiesInsertCall { +func (c *TargetInstancesInsertCall) Context(ctx context.Context) *TargetInstancesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpsProxiesInsertCall) Header() http.Header { +func (c *TargetInstancesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpsProxiesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetInstancesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxy) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetinstance) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpsProxies.insert" call. +// Do executes the "compute.targetInstances.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetHttpsProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetInstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -50538,11 +57156,12 @@ func (c *TargetHttpsProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operat } return ret, nil // { - // "description": "Creates a TargetHttpsProxy resource in the specified project using the data included in the request.", + // "description": "Creates a TargetInstance resource in the specified project and zone using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.targetHttpsProxies.insert", + // "id": "compute.targetInstances.insert", // "parameterOrder": [ - // "project" + // "project", + // "zone" // ], // "parameters": { // "project": { @@ -50551,11 +57170,18 @@ func (c *TargetHttpsProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operat // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "Name of the zone scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/targetHttpsProxies", + // "path": "{project}/zones/{zone}/targetInstances", // "request": { - // "$ref": "TargetHttpsProxy" + // "$ref": "TargetInstance" // }, // "response": { // "$ref": "Operation" @@ -50568,29 +57194,31 @@ func (c *TargetHttpsProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operat } -// method id "compute.targetHttpsProxies.list": +// method id "compute.targetInstances.list": -type TargetHttpsProxiesListCall struct { +type TargetInstancesListCall struct { s *Service project string + zone string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves the list of TargetHttpsProxy resources available to -// the specified project. -func (r *TargetHttpsProxiesService) List(project string) *TargetHttpsProxiesListCall { - c := &TargetHttpsProxiesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of TargetInstance resources available to the +// specified project and zone. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/list +func (r *TargetInstancesService) List(project string, zone string) *TargetInstancesListCall { + c := &TargetInstancesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.zone = zone return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -50602,7 +57230,7 @@ func (r *TargetHttpsProxiesService) List(project string) *TargetHttpsProxiesList // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -50614,7 +57242,7 @@ func (r *TargetHttpsProxiesService) List(project string) *TargetHttpsProxiesList // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *TargetHttpsProxiesListCall) Filter(filter string) *TargetHttpsProxiesListCall { +func (c *TargetInstancesListCall) Filter(filter string) *TargetInstancesListCall { c.urlParams_.Set("filter", filter) return c } @@ -50625,7 +57253,7 @@ func (c *TargetHttpsProxiesListCall) Filter(filter string) *TargetHttpsProxiesLi // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *TargetHttpsProxiesListCall) MaxResults(maxResults int64) *TargetHttpsProxiesListCall { +func (c *TargetInstancesListCall) MaxResults(maxResults int64) *TargetInstancesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -50642,7 +57270,7 @@ func (c *TargetHttpsProxiesListCall) MaxResults(maxResults int64) *TargetHttpsPr // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *TargetHttpsProxiesListCall) OrderBy(orderBy string) *TargetHttpsProxiesListCall { +func (c *TargetInstancesListCall) OrderBy(orderBy string) *TargetInstancesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -50650,7 +57278,7 @@ func (c *TargetHttpsProxiesListCall) OrderBy(orderBy string) *TargetHttpsProxies // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *TargetHttpsProxiesListCall) PageToken(pageToken string) *TargetHttpsProxiesListCall { +func (c *TargetInstancesListCall) PageToken(pageToken string) *TargetInstancesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -50658,7 +57286,7 @@ func (c *TargetHttpsProxiesListCall) PageToken(pageToken string) *TargetHttpsPro // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpsProxiesListCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesListCall { +func (c *TargetInstancesListCall) Fields(s ...googleapi.Field) *TargetInstancesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -50668,7 +57296,7 @@ func (c *TargetHttpsProxiesListCall) Fields(s ...googleapi.Field) *TargetHttpsPr // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *TargetHttpsProxiesListCall) IfNoneMatch(entityTag string) *TargetHttpsProxiesListCall { +func (c *TargetInstancesListCall) IfNoneMatch(entityTag string) *TargetInstancesListCall { c.ifNoneMatch_ = entityTag return c } @@ -50676,21 +57304,21 @@ func (c *TargetHttpsProxiesListCall) IfNoneMatch(entityTag string) *TargetHttpsP // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpsProxiesListCall) Context(ctx context.Context) *TargetHttpsProxiesListCall { +func (c *TargetInstancesListCall) Context(ctx context.Context) *TargetInstancesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpsProxiesListCall) Header() http.Header { +func (c *TargetInstancesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpsProxiesListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetInstancesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -50701,24 +57329,25 @@ func (c *TargetHttpsProxiesListCall) doRequest(alt string) (*http.Response, erro } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, + "zone": c.zone, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpsProxies.list" call. -// Exactly one of *TargetHttpsProxyList or error will be non-nil. Any +// Do executes the "compute.targetInstances.list" call. +// Exactly one of *TargetInstanceList or error will be non-nil. Any // non-2xx status code is an error. Response headers are in either -// *TargetHttpsProxyList.ServerResponse.Header or (if a response was +// *TargetInstanceList.ServerResponse.Header or (if a response was // returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetHttpsProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHttpsProxyList, error) { +func (c *TargetInstancesListCall) Do(opts ...googleapi.CallOption) (*TargetInstanceList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -50737,7 +57366,7 @@ func (c *TargetHttpsProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHt if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetHttpsProxyList{ + ret := &TargetInstanceList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -50749,15 +57378,16 @@ func (c *TargetHttpsProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHt } return ret, nil // { - // "description": "Retrieves the list of TargetHttpsProxy resources available to the specified project.", + // "description": "Retrieves a list of TargetInstance resources available to the specified project and zone.", // "httpMethod": "GET", - // "id": "compute.targetHttpsProxies.list", + // "id": "compute.targetInstances.list", // "parameterOrder": [ - // "project" + // "project", + // "zone" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -50785,11 +57415,18 @@ func (c *TargetHttpsProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHt // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" + // }, + // "zone": { + // "description": "Name of the zone scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" // } // }, - // "path": "{project}/global/targetHttpsProxies", + // "path": "{project}/zones/{zone}/targetInstances", // "response": { - // "$ref": "TargetHttpsProxyList" + // "$ref": "TargetInstanceList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -50803,7 +57440,7 @@ func (c *TargetHttpsProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetHt // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *TargetHttpsProxiesListCall) Pages(ctx context.Context, f func(*TargetHttpsProxyList) error) error { +func (c *TargetInstancesListCall) Pages(ctx context.Context, f func(*TargetInstanceList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -50821,31 +57458,34 @@ func (c *TargetHttpsProxiesListCall) Pages(ctx context.Context, f func(*TargetHt } } -// method id "compute.targetHttpsProxies.setSslCertificates": +// method id "compute.targetPools.addHealthCheck": -type TargetHttpsProxiesSetSslCertificatesCall struct { - s *Service - project string - targetHttpsProxy string - targethttpsproxiessetsslcertificatesrequest *TargetHttpsProxiesSetSslCertificatesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetPoolsAddHealthCheckCall struct { + s *Service + project string + region string + targetPool string + targetpoolsaddhealthcheckrequest *TargetPoolsAddHealthCheckRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetSslCertificates: Replaces SslCertificates for TargetHttpsProxy. -func (r *TargetHttpsProxiesService) SetSslCertificates(project string, targetHttpsProxy string, targethttpsproxiessetsslcertificatesrequest *TargetHttpsProxiesSetSslCertificatesRequest) *TargetHttpsProxiesSetSslCertificatesCall { - c := &TargetHttpsProxiesSetSslCertificatesCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AddHealthCheck: Adds health check URLs to a target pool. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/addHealthCheck +func (r *TargetPoolsService) AddHealthCheck(project string, region string, targetPool string, targetpoolsaddhealthcheckrequest *TargetPoolsAddHealthCheckRequest) *TargetPoolsAddHealthCheckCall { + c := &TargetPoolsAddHealthCheckCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetHttpsProxy = targetHttpsProxy - c.targethttpsproxiessetsslcertificatesrequest = targethttpsproxiessetsslcertificatesrequest + c.region = region + c.targetPool = targetPool + c.targetpoolsaddhealthcheckrequest = targetpoolsaddhealthcheckrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpsProxiesSetSslCertificatesCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesSetSslCertificatesCall { +func (c *TargetPoolsAddHealthCheckCall) Fields(s ...googleapi.Field) *TargetPoolsAddHealthCheckCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -50853,52 +57493,53 @@ func (c *TargetHttpsProxiesSetSslCertificatesCall) Fields(s ...googleapi.Field) // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpsProxiesSetSslCertificatesCall) Context(ctx context.Context) *TargetHttpsProxiesSetSslCertificatesCall { +func (c *TargetPoolsAddHealthCheckCall) Context(ctx context.Context) *TargetPoolsAddHealthCheckCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpsProxiesSetSslCertificatesCall) Header() http.Header { +func (c *TargetPoolsAddHealthCheckCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpsProxiesSetSslCertificatesCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsAddHealthCheckCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxiessetsslcertificatesrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddhealthcheckrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "targetHttpsProxy": c.targetHttpsProxy, + "project": c.project, + "region": c.region, + "targetPool": c.targetPool, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpsProxies.setSslCertificates" call. +// Do executes the "compute.targetPools.addHealthCheck" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetHttpsProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetPoolsAddHealthCheckCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -50929,12 +57570,13 @@ func (c *TargetHttpsProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOpti } return ret, nil // { - // "description": "Replaces SslCertificates for TargetHttpsProxy.", + // "description": "Adds health check URLs to a target pool.", // "httpMethod": "POST", - // "id": "compute.targetHttpsProxies.setSslCertificates", + // "id": "compute.targetPools.addHealthCheck", // "parameterOrder": [ // "project", - // "targetHttpsProxy" + // "region", + // "targetPool" // ], // "parameters": { // "project": { @@ -50944,17 +57586,24 @@ func (c *TargetHttpsProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOpti // "required": true, // "type": "string" // }, - // "targetHttpsProxy": { - // "description": "Name of the TargetHttpsProxy resource to set an SslCertificates resource for.", + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "targetPool": { + // "description": "Name of the target pool to add a health check to.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates", + // "path": "{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck", // "request": { - // "$ref": "TargetHttpsProxiesSetSslCertificatesRequest" + // "$ref": "TargetPoolsAddHealthCheckRequest" // }, // "response": { // "$ref": "Operation" @@ -50967,31 +57616,34 @@ func (c *TargetHttpsProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOpti } -// method id "compute.targetHttpsProxies.setUrlMap": +// method id "compute.targetPools.addInstance": -type TargetHttpsProxiesSetUrlMapCall struct { - s *Service - project string - targetHttpsProxy string - urlmapreference *UrlMapReference - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetPoolsAddInstanceCall struct { + s *Service + project string + region string + targetPool string + targetpoolsaddinstancerequest *TargetPoolsAddInstanceRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetUrlMap: Changes the URL map for TargetHttpsProxy. -func (r *TargetHttpsProxiesService) SetUrlMap(project string, targetHttpsProxy string, urlmapreference *UrlMapReference) *TargetHttpsProxiesSetUrlMapCall { - c := &TargetHttpsProxiesSetUrlMapCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AddInstance: Adds an instance to a target pool. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/addInstance +func (r *TargetPoolsService) AddInstance(project string, region string, targetPool string, targetpoolsaddinstancerequest *TargetPoolsAddInstanceRequest) *TargetPoolsAddInstanceCall { + c := &TargetPoolsAddInstanceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetHttpsProxy = targetHttpsProxy - c.urlmapreference = urlmapreference + c.region = region + c.targetPool = targetPool + c.targetpoolsaddinstancerequest = targetpoolsaddinstancerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetHttpsProxiesSetUrlMapCall) Fields(s ...googleapi.Field) *TargetHttpsProxiesSetUrlMapCall { +func (c *TargetPoolsAddInstanceCall) Fields(s ...googleapi.Field) *TargetPoolsAddInstanceCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -50999,52 +57651,53 @@ func (c *TargetHttpsProxiesSetUrlMapCall) Fields(s ...googleapi.Field) *TargetHt // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetHttpsProxiesSetUrlMapCall) Context(ctx context.Context) *TargetHttpsProxiesSetUrlMapCall { +func (c *TargetPoolsAddInstanceCall) Context(ctx context.Context) *TargetPoolsAddInstanceCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetHttpsProxiesSetUrlMapCall) Header() http.Header { +func (c *TargetPoolsAddInstanceCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetHttpsProxiesSetUrlMapCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsAddInstanceCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddinstancerequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/addInstance") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "targetHttpsProxy": c.targetHttpsProxy, + "project": c.project, + "region": c.region, + "targetPool": c.targetPool, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetHttpsProxies.setUrlMap" call. +// Do executes the "compute.targetPools.addInstance" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetHttpsProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetPoolsAddInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -51075,12 +57728,13 @@ func (c *TargetHttpsProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Changes the URL map for TargetHttpsProxy.", + // "description": "Adds an instance to a target pool.", // "httpMethod": "POST", - // "id": "compute.targetHttpsProxies.setUrlMap", + // "id": "compute.targetPools.addInstance", // "parameterOrder": [ // "project", - // "targetHttpsProxy" + // "region", + // "targetPool" // ], // "parameters": { // "project": { @@ -51090,17 +57744,24 @@ func (c *TargetHttpsProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Ope // "required": true, // "type": "string" // }, - // "targetHttpsProxy": { - // "description": "Name of the TargetHttpsProxy resource whose URL map is to be set.", + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "targetPool": { + // "description": "Name of the TargetPool resource to add instances to.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap", + // "path": "{project}/regions/{region}/targetPools/{targetPool}/addInstance", // "request": { - // "$ref": "UrlMapReference" + // "$ref": "TargetPoolsAddInstanceRequest" // }, // "response": { // "$ref": "Operation" @@ -51113,9 +57774,9 @@ func (c *TargetHttpsProxiesSetUrlMapCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "compute.targetInstances.aggregatedList": +// method id "compute.targetPools.aggregatedList": -type TargetInstancesAggregatedListCall struct { +type TargetPoolsAggregatedListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -51124,18 +57785,17 @@ type TargetInstancesAggregatedListCall struct { header_ http.Header } -// AggregatedList: Retrieves an aggregated list of target instances. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/aggregatedList -func (r *TargetInstancesService) AggregatedList(project string) *TargetInstancesAggregatedListCall { - c := &TargetInstancesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// AggregatedList: Retrieves an aggregated list of target pools. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/aggregatedList +func (r *TargetPoolsService) AggregatedList(project string) *TargetPoolsAggregatedListCall { + c := &TargetPoolsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -51147,7 +57807,7 @@ func (r *TargetInstancesService) AggregatedList(project string) *TargetInstances // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -51159,7 +57819,7 @@ func (r *TargetInstancesService) AggregatedList(project string) *TargetInstances // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *TargetInstancesAggregatedListCall) Filter(filter string) *TargetInstancesAggregatedListCall { +func (c *TargetPoolsAggregatedListCall) Filter(filter string) *TargetPoolsAggregatedListCall { c.urlParams_.Set("filter", filter) return c } @@ -51170,7 +57830,7 @@ func (c *TargetInstancesAggregatedListCall) Filter(filter string) *TargetInstanc // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *TargetInstancesAggregatedListCall) MaxResults(maxResults int64) *TargetInstancesAggregatedListCall { +func (c *TargetPoolsAggregatedListCall) MaxResults(maxResults int64) *TargetPoolsAggregatedListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -51187,7 +57847,7 @@ func (c *TargetInstancesAggregatedListCall) MaxResults(maxResults int64) *Target // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *TargetInstancesAggregatedListCall) OrderBy(orderBy string) *TargetInstancesAggregatedListCall { +func (c *TargetPoolsAggregatedListCall) OrderBy(orderBy string) *TargetPoolsAggregatedListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -51195,7 +57855,7 @@ func (c *TargetInstancesAggregatedListCall) OrderBy(orderBy string) *TargetInsta // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *TargetInstancesAggregatedListCall) PageToken(pageToken string) *TargetInstancesAggregatedListCall { +func (c *TargetPoolsAggregatedListCall) PageToken(pageToken string) *TargetPoolsAggregatedListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -51203,7 +57863,7 @@ func (c *TargetInstancesAggregatedListCall) PageToken(pageToken string) *TargetI // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetInstancesAggregatedListCall) Fields(s ...googleapi.Field) *TargetInstancesAggregatedListCall { +func (c *TargetPoolsAggregatedListCall) Fields(s ...googleapi.Field) *TargetPoolsAggregatedListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -51213,7 +57873,7 @@ func (c *TargetInstancesAggregatedListCall) Fields(s ...googleapi.Field) *Target // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *TargetInstancesAggregatedListCall) IfNoneMatch(entityTag string) *TargetInstancesAggregatedListCall { +func (c *TargetPoolsAggregatedListCall) IfNoneMatch(entityTag string) *TargetPoolsAggregatedListCall { c.ifNoneMatch_ = entityTag return c } @@ -51221,21 +57881,21 @@ func (c *TargetInstancesAggregatedListCall) IfNoneMatch(entityTag string) *Targe // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetInstancesAggregatedListCall) Context(ctx context.Context) *TargetInstancesAggregatedListCall { +func (c *TargetPoolsAggregatedListCall) Context(ctx context.Context) *TargetPoolsAggregatedListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetInstancesAggregatedListCall) Header() http.Header { +func (c *TargetPoolsAggregatedListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetInstancesAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsAggregatedListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -51246,7 +57906,7 @@ func (c *TargetInstancesAggregatedListCall) doRequest(alt string) (*http.Respons } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/targetInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/targetPools") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -51256,14 +57916,14 @@ func (c *TargetInstancesAggregatedListCall) doRequest(alt string) (*http.Respons return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetInstances.aggregatedList" call. -// Exactly one of *TargetInstanceAggregatedList or error will be -// non-nil. Any non-2xx status code is an error. Response headers are in -// either *TargetInstanceAggregatedList.ServerResponse.Header or (if a -// response was returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.targetPools.aggregatedList" call. +// Exactly one of *TargetPoolAggregatedList or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *TargetPoolAggregatedList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetInstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*TargetInstanceAggregatedList, error) { +func (c *TargetPoolsAggregatedListCall) Do(opts ...googleapi.CallOption) (*TargetPoolAggregatedList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -51282,7 +57942,7 @@ func (c *TargetInstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*T if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetInstanceAggregatedList{ + ret := &TargetPoolAggregatedList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -51294,15 +57954,15 @@ func (c *TargetInstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*T } return ret, nil // { - // "description": "Retrieves an aggregated list of target instances.", + // "description": "Retrieves an aggregated list of target pools.", // "httpMethod": "GET", - // "id": "compute.targetInstances.aggregatedList", + // "id": "compute.targetPools.aggregatedList", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -51332,9 +57992,9 @@ func (c *TargetInstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*T // "type": "string" // } // }, - // "path": "{project}/aggregated/targetInstances", + // "path": "{project}/aggregated/targetPools", // "response": { - // "$ref": "TargetInstanceAggregatedList" + // "$ref": "TargetPoolAggregatedList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -51348,7 +58008,7 @@ func (c *TargetInstancesAggregatedListCall) Do(opts ...googleapi.CallOption) (*T // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *TargetInstancesAggregatedListCall) Pages(ctx context.Context, f func(*TargetInstanceAggregatedList) error) error { +func (c *TargetPoolsAggregatedListCall) Pages(ctx context.Context, f func(*TargetPoolAggregatedList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -51366,32 +58026,32 @@ func (c *TargetInstancesAggregatedListCall) Pages(ctx context.Context, f func(*T } } -// method id "compute.targetInstances.delete": +// method id "compute.targetPools.delete": -type TargetInstancesDeleteCall struct { - s *Service - project string - zone string - targetInstance string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetPoolsDeleteCall struct { + s *Service + project string + region string + targetPool string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes the specified TargetInstance resource. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/delete -func (r *TargetInstancesService) Delete(project string, zone string, targetInstance string) *TargetInstancesDeleteCall { - c := &TargetInstancesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified target pool. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/delete +func (r *TargetPoolsService) Delete(project string, region string, targetPool string) *TargetPoolsDeleteCall { + c := &TargetPoolsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.targetInstance = targetInstance + c.region = region + c.targetPool = targetPool return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetInstancesDeleteCall) Fields(s ...googleapi.Field) *TargetInstancesDeleteCall { +func (c *TargetPoolsDeleteCall) Fields(s ...googleapi.Field) *TargetPoolsDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -51399,21 +58059,21 @@ func (c *TargetInstancesDeleteCall) Fields(s ...googleapi.Field) *TargetInstance // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetInstancesDeleteCall) Context(ctx context.Context) *TargetInstancesDeleteCall { +func (c *TargetPoolsDeleteCall) Context(ctx context.Context) *TargetPoolsDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetInstancesDeleteCall) Header() http.Header { +func (c *TargetPoolsDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetInstancesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -51421,26 +58081,26 @@ func (c *TargetInstancesDeleteCall) doRequest(alt string) (*http.Response, error reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances/{targetInstance}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "targetInstance": c.targetInstance, + "project": c.project, + "region": c.region, + "targetPool": c.targetPool, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetInstances.delete" call. +// Do executes the "compute.targetPools.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetInstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetPoolsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -51471,13 +58131,13 @@ func (c *TargetInstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Deletes the specified TargetInstance resource.", + // "description": "Deletes the specified target pool.", // "httpMethod": "DELETE", - // "id": "compute.targetInstances.delete", + // "id": "compute.targetPools.delete", // "parameterOrder": [ // "project", - // "zone", - // "targetInstance" + // "region", + // "targetPool" // ], // "parameters": { // "project": { @@ -51487,22 +58147,22 @@ func (c *TargetInstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation // "required": true, // "type": "string" // }, - // "targetInstance": { - // "description": "Name of the TargetInstance resource to delete.", + // "region": { + // "description": "Name of the region scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, - // "zone": { - // "description": "Name of the zone scoping this request.", + // "targetPool": { + // "description": "Name of the TargetPool resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/targetInstances/{targetInstance}", + // "path": "{project}/regions/{region}/targetPools/{targetPool}", // "response": { // "$ref": "Operation" // }, @@ -51514,34 +58174,34 @@ func (c *TargetInstancesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation } -// method id "compute.targetInstances.get": +// method id "compute.targetPools.get": -type TargetInstancesGetCall struct { - s *Service - project string - zone string - targetInstance string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type TargetPoolsGetCall struct { + s *Service + project string + region string + targetPool string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified TargetInstance resource. Get a list of -// available target instances by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/get -func (r *TargetInstancesService) Get(project string, zone string, targetInstance string) *TargetInstancesGetCall { - c := &TargetInstancesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified target pool. Get a list of available +// target pools by making a list() request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/get +func (r *TargetPoolsService) Get(project string, region string, targetPool string) *TargetPoolsGetCall { + c := &TargetPoolsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.targetInstance = targetInstance + c.region = region + c.targetPool = targetPool return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetInstancesGetCall) Fields(s ...googleapi.Field) *TargetInstancesGetCall { +func (c *TargetPoolsGetCall) Fields(s ...googleapi.Field) *TargetPoolsGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -51551,7 +58211,7 @@ func (c *TargetInstancesGetCall) Fields(s ...googleapi.Field) *TargetInstancesGe // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *TargetInstancesGetCall) IfNoneMatch(entityTag string) *TargetInstancesGetCall { +func (c *TargetPoolsGetCall) IfNoneMatch(entityTag string) *TargetPoolsGetCall { c.ifNoneMatch_ = entityTag return c } @@ -51559,21 +58219,21 @@ func (c *TargetInstancesGetCall) IfNoneMatch(entityTag string) *TargetInstancesG // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetInstancesGetCall) Context(ctx context.Context) *TargetInstancesGetCall { +func (c *TargetPoolsGetCall) Context(ctx context.Context) *TargetPoolsGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetInstancesGetCall) Header() http.Header { +func (c *TargetPoolsGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetInstancesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -51584,26 +58244,183 @@ func (c *TargetInstancesGetCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances/{targetInstance}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "zone": c.zone, - "targetInstance": c.targetInstance, + "project": c.project, + "region": c.region, + "targetPool": c.targetPool, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetInstances.get" call. -// Exactly one of *TargetInstance or error will be non-nil. Any non-2xx +// Do executes the "compute.targetPools.get" call. +// Exactly one of *TargetPool or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *TargetInstance.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use +// *TargetPool.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *TargetPoolsGetCall) Do(opts ...googleapi.CallOption) (*TargetPool, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &TargetPool{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Returns the specified target pool. Get a list of available target pools by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.targetPools.get", + // "parameterOrder": [ + // "project", + // "region", + // "targetPool" + // ], + // "parameters": { + // "project": { + // "description": "Project ID for this request.", + // "location": "path", + // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + // "required": true, + // "type": "string" + // }, + // "region": { + // "description": "Name of the region scoping this request.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // }, + // "targetPool": { + // "description": "Name of the TargetPool resource to return.", + // "location": "path", + // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + // "required": true, + // "type": "string" + // } + // }, + // "path": "{project}/regions/{region}/targetPools/{targetPool}", + // "response": { + // "$ref": "TargetPool" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform", + // "https://www.googleapis.com/auth/compute", + // "https://www.googleapis.com/auth/compute.readonly" + // ] + // } + +} + +// method id "compute.targetPools.getHealth": + +type TargetPoolsGetHealthCall struct { + s *Service + project string + region string + targetPool string + instancereference *InstanceReference + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// GetHealth: Gets the most recent health check results for each IP for +// the instance that is referenced by the given target pool. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/getHealth +func (r *TargetPoolsService) GetHealth(project string, region string, targetPool string, instancereference *InstanceReference) *TargetPoolsGetHealthCall { + c := &TargetPoolsGetHealthCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.project = project + c.region = region + c.targetPool = targetPool + c.instancereference = instancereference + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *TargetPoolsGetHealthCall) Fields(s ...googleapi.Field) *TargetPoolsGetHealthCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *TargetPoolsGetHealthCall) Context(ctx context.Context) *TargetPoolsGetHealthCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *TargetPoolsGetHealthCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *TargetPoolsGetHealthCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancereference) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/getHealth") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "project": c.project, + "region": c.region, + "targetPool": c.targetPool, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "compute.targetPools.getHealth" call. +// Exactly one of *TargetPoolInstanceHealth or error will be non-nil. +// Any non-2xx status code is an error. Response headers are in either +// *TargetPoolInstanceHealth.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetInstancesGetCall) Do(opts ...googleapi.CallOption) (*TargetInstance, error) { +func (c *TargetPoolsGetHealthCall) Do(opts ...googleapi.CallOption) (*TargetPoolInstanceHealth, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -51622,7 +58439,7 @@ func (c *TargetInstancesGetCall) Do(opts ...googleapi.CallOption) (*TargetInstan if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetInstance{ + ret := &TargetPoolInstanceHealth{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -51634,13 +58451,13 @@ func (c *TargetInstancesGetCall) Do(opts ...googleapi.CallOption) (*TargetInstan } return ret, nil // { - // "description": "Returns the specified TargetInstance resource. Get a list of available target instances by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.targetInstances.get", + // "description": "Gets the most recent health check results for each IP for the instance that is referenced by the given target pool.", + // "httpMethod": "POST", + // "id": "compute.targetPools.getHealth", // "parameterOrder": [ // "project", - // "zone", - // "targetInstance" + // "region", + // "targetPool" // ], // "parameters": { // "project": { @@ -51650,24 +58467,27 @@ func (c *TargetInstancesGetCall) Do(opts ...googleapi.CallOption) (*TargetInstan // "required": true, // "type": "string" // }, - // "targetInstance": { - // "description": "Name of the TargetInstance resource to return.", + // "region": { + // "description": "Name of the region scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, - // "zone": { - // "description": "Name of the zone scoping this request.", + // "targetPool": { + // "description": "Name of the TargetPool resource to which the queried instance belongs.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/targetInstances/{targetInstance}", + // "path": "{project}/regions/{region}/targetPools/{targetPool}/getHealth", + // "request": { + // "$ref": "InstanceReference" + // }, // "response": { - // "$ref": "TargetInstance" + // "$ref": "TargetPoolInstanceHealth" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -51678,33 +58498,33 @@ func (c *TargetInstancesGetCall) Do(opts ...googleapi.CallOption) (*TargetInstan } -// method id "compute.targetInstances.insert": +// method id "compute.targetPools.insert": -type TargetInstancesInsertCall struct { - s *Service - project string - zone string - targetinstance *TargetInstance - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetPoolsInsertCall struct { + s *Service + project string + region string + targetpool *TargetPool + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates a TargetInstance resource in the specified project -// and zone using the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/insert -func (r *TargetInstancesService) Insert(project string, zone string, targetinstance *TargetInstance) *TargetInstancesInsertCall { - c := &TargetInstancesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Insert: Creates a target pool in the specified project and region +// using the data included in the request. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/insert +func (r *TargetPoolsService) Insert(project string, region string, targetpool *TargetPool) *TargetPoolsInsertCall { + c := &TargetPoolsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone - c.targetinstance = targetinstance + c.region = region + c.targetpool = targetpool return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetInstancesInsertCall) Fields(s ...googleapi.Field) *TargetInstancesInsertCall { +func (c *TargetPoolsInsertCall) Fields(s ...googleapi.Field) *TargetPoolsInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -51712,52 +58532,52 @@ func (c *TargetInstancesInsertCall) Fields(s ...googleapi.Field) *TargetInstance // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetInstancesInsertCall) Context(ctx context.Context) *TargetInstancesInsertCall { +func (c *TargetPoolsInsertCall) Context(ctx context.Context) *TargetPoolsInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetInstancesInsertCall) Header() http.Header { +func (c *TargetPoolsInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetInstancesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetinstance) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpool) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, + "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetInstances.insert" call. +// Do executes the "compute.targetPools.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetInstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetPoolsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -51788,12 +58608,12 @@ func (c *TargetInstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation } return ret, nil // { - // "description": "Creates a TargetInstance resource in the specified project and zone using the data included in the request.", + // "description": "Creates a target pool in the specified project and region using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.targetInstances.insert", + // "id": "compute.targetPools.insert", // "parameterOrder": [ // "project", - // "zone" + // "region" // ], // "parameters": { // "project": { @@ -51803,17 +58623,17 @@ func (c *TargetInstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation // "required": true, // "type": "string" // }, - // "zone": { - // "description": "Name of the zone scoping this request.", + // "region": { + // "description": "Name of the region scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/targetInstances", + // "path": "{project}/regions/{region}/targetPools", // "request": { - // "$ref": "TargetInstance" + // "$ref": "TargetPool" // }, // "response": { // "$ref": "Operation" @@ -51826,32 +58646,31 @@ func (c *TargetInstancesInsertCall) Do(opts ...googleapi.CallOption) (*Operation } -// method id "compute.targetInstances.list": +// method id "compute.targetPools.list": -type TargetInstancesListCall struct { +type TargetPoolsListCall struct { s *Service project string - zone string + region string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of TargetInstance resources available to the -// specified project and zone. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetInstances/list -func (r *TargetInstancesService) List(project string, zone string) *TargetInstancesListCall { - c := &TargetInstancesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves a list of target pools available to the specified +// project and region. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/list +func (r *TargetPoolsService) List(project string, region string) *TargetPoolsListCall { + c := &TargetPoolsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.zone = zone + c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -51863,7 +58682,7 @@ func (r *TargetInstancesService) List(project string, zone string) *TargetInstan // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -51875,7 +58694,7 @@ func (r *TargetInstancesService) List(project string, zone string) *TargetInstan // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *TargetInstancesListCall) Filter(filter string) *TargetInstancesListCall { +func (c *TargetPoolsListCall) Filter(filter string) *TargetPoolsListCall { c.urlParams_.Set("filter", filter) return c } @@ -51886,7 +58705,7 @@ func (c *TargetInstancesListCall) Filter(filter string) *TargetInstancesListCall // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *TargetInstancesListCall) MaxResults(maxResults int64) *TargetInstancesListCall { +func (c *TargetPoolsListCall) MaxResults(maxResults int64) *TargetPoolsListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -51903,7 +58722,7 @@ func (c *TargetInstancesListCall) MaxResults(maxResults int64) *TargetInstancesL // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *TargetInstancesListCall) OrderBy(orderBy string) *TargetInstancesListCall { +func (c *TargetPoolsListCall) OrderBy(orderBy string) *TargetPoolsListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -51911,7 +58730,7 @@ func (c *TargetInstancesListCall) OrderBy(orderBy string) *TargetInstancesListCa // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *TargetInstancesListCall) PageToken(pageToken string) *TargetInstancesListCall { +func (c *TargetPoolsListCall) PageToken(pageToken string) *TargetPoolsListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -51919,7 +58738,7 @@ func (c *TargetInstancesListCall) PageToken(pageToken string) *TargetInstancesLi // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetInstancesListCall) Fields(s ...googleapi.Field) *TargetInstancesListCall { +func (c *TargetPoolsListCall) Fields(s ...googleapi.Field) *TargetPoolsListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -51929,7 +58748,7 @@ func (c *TargetInstancesListCall) Fields(s ...googleapi.Field) *TargetInstancesL // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *TargetInstancesListCall) IfNoneMatch(entityTag string) *TargetInstancesListCall { +func (c *TargetPoolsListCall) IfNoneMatch(entityTag string) *TargetPoolsListCall { c.ifNoneMatch_ = entityTag return c } @@ -51937,21 +58756,21 @@ func (c *TargetInstancesListCall) IfNoneMatch(entityTag string) *TargetInstances // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetInstancesListCall) Context(ctx context.Context) *TargetInstancesListCall { +func (c *TargetPoolsListCall) Context(ctx context.Context) *TargetPoolsListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetInstancesListCall) Header() http.Header { +func (c *TargetPoolsListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetInstancesListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -51962,25 +58781,25 @@ func (c *TargetInstancesListCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "zone": c.zone, + "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetInstances.list" call. -// Exactly one of *TargetInstanceList or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *TargetInstanceList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.targetPools.list" call. +// Exactly one of *TargetPoolList or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *TargetPoolList.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetInstancesListCall) Do(opts ...googleapi.CallOption) (*TargetInstanceList, error) { +func (c *TargetPoolsListCall) Do(opts ...googleapi.CallOption) (*TargetPoolList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -51999,7 +58818,7 @@ func (c *TargetInstancesListCall) Do(opts ...googleapi.CallOption) (*TargetInsta if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetInstanceList{ + ret := &TargetPoolList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -52011,16 +58830,16 @@ func (c *TargetInstancesListCall) Do(opts ...googleapi.CallOption) (*TargetInsta } return ret, nil // { - // "description": "Retrieves a list of TargetInstance resources available to the specified project and zone.", + // "description": "Retrieves a list of target pools available to the specified project and region.", // "httpMethod": "GET", - // "id": "compute.targetInstances.list", + // "id": "compute.targetPools.list", // "parameterOrder": [ // "project", - // "zone" + // "region" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -52049,17 +58868,17 @@ func (c *TargetInstancesListCall) Do(opts ...googleapi.CallOption) (*TargetInsta // "required": true, // "type": "string" // }, - // "zone": { - // "description": "Name of the zone scoping this request.", + // "region": { + // "description": "Name of the region scoping this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/zones/{zone}/targetInstances", + // "path": "{project}/regions/{region}/targetPools", // "response": { - // "$ref": "TargetInstanceList" + // "$ref": "TargetPoolList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -52073,7 +58892,7 @@ func (c *TargetInstancesListCall) Do(opts ...googleapi.CallOption) (*TargetInsta // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *TargetInstancesListCall) Pages(ctx context.Context, f func(*TargetInstanceList) error) error { +func (c *TargetPoolsListCall) Pages(ctx context.Context, f func(*TargetPoolList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -52091,34 +58910,34 @@ func (c *TargetInstancesListCall) Pages(ctx context.Context, f func(*TargetInsta } } -// method id "compute.targetPools.addHealthCheck": +// method id "compute.targetPools.removeHealthCheck": -type TargetPoolsAddHealthCheckCall struct { - s *Service - project string - region string - targetPool string - targetpoolsaddhealthcheckrequest *TargetPoolsAddHealthCheckRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetPoolsRemoveHealthCheckCall struct { + s *Service + project string + region string + targetPool string + targetpoolsremovehealthcheckrequest *TargetPoolsRemoveHealthCheckRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AddHealthCheck: Adds health check URLs to a target pool. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/addHealthCheck -func (r *TargetPoolsService) AddHealthCheck(project string, region string, targetPool string, targetpoolsaddhealthcheckrequest *TargetPoolsAddHealthCheckRequest) *TargetPoolsAddHealthCheckCall { - c := &TargetPoolsAddHealthCheckCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// RemoveHealthCheck: Removes health check URL from a target pool. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/removeHealthCheck +func (r *TargetPoolsService) RemoveHealthCheck(project string, region string, targetPool string, targetpoolsremovehealthcheckrequest *TargetPoolsRemoveHealthCheckRequest) *TargetPoolsRemoveHealthCheckCall { + c := &TargetPoolsRemoveHealthCheckCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.region = region c.targetPool = targetPool - c.targetpoolsaddhealthcheckrequest = targetpoolsaddhealthcheckrequest + c.targetpoolsremovehealthcheckrequest = targetpoolsremovehealthcheckrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsAddHealthCheckCall) Fields(s ...googleapi.Field) *TargetPoolsAddHealthCheckCall { +func (c *TargetPoolsRemoveHealthCheckCall) Fields(s ...googleapi.Field) *TargetPoolsRemoveHealthCheckCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -52126,34 +58945,34 @@ func (c *TargetPoolsAddHealthCheckCall) Fields(s ...googleapi.Field) *TargetPool // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsAddHealthCheckCall) Context(ctx context.Context) *TargetPoolsAddHealthCheckCall { +func (c *TargetPoolsRemoveHealthCheckCall) Context(ctx context.Context) *TargetPoolsRemoveHealthCheckCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsAddHealthCheckCall) Header() http.Header { +func (c *TargetPoolsRemoveHealthCheckCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsAddHealthCheckCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsRemoveHealthCheckCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddhealthcheckrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremovehealthcheckrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -52165,14 +58984,14 @@ func (c *TargetPoolsAddHealthCheckCall) doRequest(alt string) (*http.Response, e return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.addHealthCheck" call. +// Do executes the "compute.targetPools.removeHealthCheck" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetPoolsAddHealthCheckCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetPoolsRemoveHealthCheckCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -52203,9 +59022,9 @@ func (c *TargetPoolsAddHealthCheckCall) Do(opts ...googleapi.CallOption) (*Opera } return ret, nil // { - // "description": "Adds health check URLs to a target pool.", + // "description": "Removes health check URL from a target pool.", // "httpMethod": "POST", - // "id": "compute.targetPools.addHealthCheck", + // "id": "compute.targetPools.removeHealthCheck", // "parameterOrder": [ // "project", // "region", @@ -52220,23 +59039,23 @@ func (c *TargetPoolsAddHealthCheckCall) Do(opts ...googleapi.CallOption) (*Opera // "type": "string" // }, // "region": { - // "description": "Name of the region scoping this request.", + // "description": "Name of the region for this request.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // }, // "targetPool": { - // "description": "Name of the target pool to add a health check to.", + // "description": "Name of the target pool to remove health checks from.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck", + // "path": "{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck", // "request": { - // "$ref": "TargetPoolsAddHealthCheckRequest" + // "$ref": "TargetPoolsRemoveHealthCheckRequest" // }, // "response": { // "$ref": "Operation" @@ -52249,34 +59068,34 @@ func (c *TargetPoolsAddHealthCheckCall) Do(opts ...googleapi.CallOption) (*Opera } -// method id "compute.targetPools.addInstance": +// method id "compute.targetPools.removeInstance": -type TargetPoolsAddInstanceCall struct { - s *Service - project string - region string - targetPool string - targetpoolsaddinstancerequest *TargetPoolsAddInstanceRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetPoolsRemoveInstanceCall struct { + s *Service + project string + region string + targetPool string + targetpoolsremoveinstancerequest *TargetPoolsRemoveInstanceRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AddInstance: Adds an instance to a target pool. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/addInstance -func (r *TargetPoolsService) AddInstance(project string, region string, targetPool string, targetpoolsaddinstancerequest *TargetPoolsAddInstanceRequest) *TargetPoolsAddInstanceCall { - c := &TargetPoolsAddInstanceCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// RemoveInstance: Removes instance URL from a target pool. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/removeInstance +func (r *TargetPoolsService) RemoveInstance(project string, region string, targetPool string, targetpoolsremoveinstancerequest *TargetPoolsRemoveInstanceRequest) *TargetPoolsRemoveInstanceCall { + c := &TargetPoolsRemoveInstanceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project c.region = region c.targetPool = targetPool - c.targetpoolsaddinstancerequest = targetpoolsaddinstancerequest + c.targetpoolsremoveinstancerequest = targetpoolsremoveinstancerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsAddInstanceCall) Fields(s ...googleapi.Field) *TargetPoolsAddInstanceCall { +func (c *TargetPoolsRemoveInstanceCall) Fields(s ...googleapi.Field) *TargetPoolsRemoveInstanceCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -52284,34 +59103,34 @@ func (c *TargetPoolsAddInstanceCall) Fields(s ...googleapi.Field) *TargetPoolsAd // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsAddInstanceCall) Context(ctx context.Context) *TargetPoolsAddInstanceCall { +func (c *TargetPoolsRemoveInstanceCall) Context(ctx context.Context) *TargetPoolsRemoveInstanceCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsAddInstanceCall) Header() http.Header { +func (c *TargetPoolsRemoveInstanceCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsAddInstanceCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsRemoveInstanceCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddinstancerequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremoveinstancerequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/addInstance") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/removeInstance") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -52323,14 +59142,14 @@ func (c *TargetPoolsAddInstanceCall) doRequest(alt string) (*http.Response, erro return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.addInstance" call. +// Do executes the "compute.targetPools.removeInstance" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetPoolsAddInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetPoolsRemoveInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -52361,9 +59180,9 @@ func (c *TargetPoolsAddInstanceCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Adds an instance to a target pool.", + // "description": "Removes instance URL from a target pool.", // "httpMethod": "POST", - // "id": "compute.targetPools.addInstance", + // "id": "compute.targetPools.removeInstance", // "parameterOrder": [ // "project", // "region", @@ -52385,16 +59204,16 @@ func (c *TargetPoolsAddInstanceCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // }, // "targetPool": { - // "description": "Name of the TargetPool resource to add instances to.", + // "description": "Name of the TargetPool resource to remove instances from.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools/{targetPool}/addInstance", + // "path": "{project}/regions/{region}/targetPools/{targetPool}/removeInstance", // "request": { - // "$ref": "TargetPoolsAddInstanceRequest" + // "$ref": "TargetPoolsRemoveInstanceRequest" // }, // "response": { // "$ref": "Operation" @@ -52407,317 +59226,78 @@ func (c *TargetPoolsAddInstanceCall) Do(opts ...googleapi.CallOption) (*Operatio } -// method id "compute.targetPools.aggregatedList": +// method id "compute.targetPools.setBackup": -type TargetPoolsAggregatedListCall struct { - s *Service - project string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type TargetPoolsSetBackupCall struct { + s *Service + project string + region string + targetPool string + targetreference *TargetReference + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// AggregatedList: Retrieves an aggregated list of target pools. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/aggregatedList -func (r *TargetPoolsService) AggregatedList(project string) *TargetPoolsAggregatedListCall { - c := &TargetPoolsAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetBackup: Changes a backup target pool's configurations. +// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/setBackup +func (r *TargetPoolsService) SetBackup(project string, region string, targetPool string, targetreference *TargetReference) *TargetPoolsSetBackupCall { + c := &TargetPoolsSetBackupCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project + c.region = region + c.targetPool = targetPool + c.targetreference = targetreference return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. -// -// The field_name is the name of the field you want to compare. Only -// atomic field types are supported (string, number, boolean). The -// comparison_string must be either eq (equals) or ne (not equals). The -// literal_string is the string value to filter to. The literal value -// must be valid for the type of field you are filtering by (string, -// number, boolean). For string fields, the literal value is interpreted -// as a regular expression using RE2 syntax. The literal value must -// match the entire field. -// -// For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. -// -// You can filter on nested fields. For example, you could filter on -// instances that have set the scheduling.automaticRestart field to -// true. Use filtering on nested fields to take advantage of labels to -// organize and search for results based on label values. -// -// To filter on multiple expressions, provide each separate expression -// within parentheses. For example, (scheduling.automaticRestart eq -// true) (zone eq us-central1-f). Multiple expressions are treated as -// AND expressions, meaning that resources must match all expressions to -// pass the filters. -func (c *TargetPoolsAggregatedListCall) Filter(filter string) *TargetPoolsAggregatedListCall { - c.urlParams_.Set("filter", filter) - return c -} - -// MaxResults sets the optional parameter "maxResults": The maximum -// number of results per page that should be returned. If the number of -// available results is larger than maxResults, Compute Engine returns a -// nextPageToken that can be used to get the next page of results in -// subsequent list requests. Acceptable values are 0 to 500, inclusive. -// (Default: 500) -func (c *TargetPoolsAggregatedListCall) MaxResults(maxResults int64) *TargetPoolsAggregatedListCall { - c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) - return c -} - -// OrderBy sets the optional parameter "orderBy": Sorts list results by -// a certain order. By default, results are returned in alphanumerical -// order based on the resource name. -// -// You can also sort results in descending order based on the creation -// timestamp using orderBy="creationTimestamp desc". This sorts results -// based on the creationTimestamp field in reverse chronological order -// (newest result first). Use this to sort resources like operations so -// that the newest operation is returned first. -// -// Currently, only sorting by name or creationTimestamp desc is -// supported. -func (c *TargetPoolsAggregatedListCall) OrderBy(orderBy string) *TargetPoolsAggregatedListCall { - c.urlParams_.Set("orderBy", orderBy) - return c -} - -// PageToken sets the optional parameter "pageToken": Specifies a page -// token to use. Set pageToken to the nextPageToken returned by a -// previous list request to get the next page of results. -func (c *TargetPoolsAggregatedListCall) PageToken(pageToken string) *TargetPoolsAggregatedListCall { - c.urlParams_.Set("pageToken", pageToken) +// FailoverRatio sets the optional parameter "failoverRatio": New +// failoverRatio value for the target pool. +func (c *TargetPoolsSetBackupCall) FailoverRatio(failoverRatio float64) *TargetPoolsSetBackupCall { + c.urlParams_.Set("failoverRatio", fmt.Sprint(failoverRatio)) return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsAggregatedListCall) Fields(s ...googleapi.Field) *TargetPoolsAggregatedListCall { +func (c *TargetPoolsSetBackupCall) Fields(s ...googleapi.Field) *TargetPoolsSetBackupCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *TargetPoolsAggregatedListCall) IfNoneMatch(entityTag string) *TargetPoolsAggregatedListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsAggregatedListCall) Context(ctx context.Context) *TargetPoolsAggregatedListCall { +func (c *TargetPoolsSetBackupCall) Context(ctx context.Context) *TargetPoolsSetBackupCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsAggregatedListCall) Header() http.Header { +func (c *TargetPoolsSetBackupCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsAggregatedListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetPoolsSetBackupCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/targetPools") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.targetPools.aggregatedList" call. -// Exactly one of *TargetPoolAggregatedList or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *TargetPoolAggregatedList.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *TargetPoolsAggregatedListCall) Do(opts ...googleapi.CallOption) (*TargetPoolAggregatedList, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference) if err != nil { return nil, err } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &TargetPoolAggregatedList{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Retrieves an aggregated list of target pools.", - // "httpMethod": "GET", - // "id": "compute.targetPools.aggregatedList", - // "parameterOrder": [ - // "project" - // ], - // "parameters": { - // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", - // "location": "query", - // "type": "string" - // }, - // "maxResults": { - // "default": "500", - // "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)", - // "format": "uint32", - // "location": "query", - // "minimum": "0", - // "type": "integer" - // }, - // "orderBy": { - // "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.", - // "location": "query", - // "type": "string" - // }, - // "pageToken": { - // "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", - // "location": "query", - // "type": "string" - // }, - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/aggregated/targetPools", - // "response": { - // "$ref": "TargetPoolAggregatedList" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" - // ] - // } - -} - -// Pages invokes f for each page of results. -// A non-nil error returned from f will halt the iteration. -// The provided context supersedes any context provided to the Context method. -func (c *TargetPoolsAggregatedListCall) Pages(ctx context.Context, f func(*TargetPoolAggregatedList) error) error { - c.ctx_ = ctx - defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point - for { - x, err := c.Do() - if err != nil { - return err - } - if err := f(x); err != nil { - return err - } - if x.NextPageToken == "" { - return nil - } - c.PageToken(x.NextPageToken) - } -} - -// method id "compute.targetPools.delete": - -type TargetPoolsDeleteCall struct { - s *Service - project string - region string - targetPool string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// Delete: Deletes the specified target pool. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/delete -func (r *TargetPoolsService) Delete(project string, region string, targetPool string) *TargetPoolsDeleteCall { - c := &TargetPoolsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.region = region - c.targetPool = targetPool - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *TargetPoolsDeleteCall) Fields(s ...googleapi.Field) *TargetPoolsDeleteCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *TargetPoolsDeleteCall) Context(ctx context.Context) *TargetPoolsDeleteCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *TargetPoolsDeleteCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *TargetPoolsDeleteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/setBackup") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, @@ -52727,14 +59307,14 @@ func (c *TargetPoolsDeleteCall) doRequest(alt string) (*http.Response, error) { return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.delete" call. +// Do executes the "compute.targetPools.setBackup" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetPoolsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetPoolsSetBackupCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -52765,15 +59345,21 @@ func (c *TargetPoolsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er } return ret, nil // { - // "description": "Deletes the specified target pool.", - // "httpMethod": "DELETE", - // "id": "compute.targetPools.delete", + // "description": "Changes a backup target pool's configurations.", + // "httpMethod": "POST", + // "id": "compute.targetPools.setBackup", // "parameterOrder": [ // "project", // "region", // "targetPool" // ], // "parameters": { + // "failoverRatio": { + // "description": "New failoverRatio value for the target pool.", + // "format": "float", + // "location": "query", + // "type": "number" + // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -52789,14 +59375,17 @@ func (c *TargetPoolsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er // "type": "string" // }, // "targetPool": { - // "description": "Name of the TargetPool resource to delete.", + // "description": "Name of the TargetPool resource to set a backup pool for.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools/{targetPool}", + // "path": "{project}/regions/{region}/targetPools/{targetPool}/setBackup", + // "request": { + // "$ref": "TargetReference" + // }, // "response": { // "$ref": "Operation" // }, @@ -52808,96 +59397,77 @@ func (c *TargetPoolsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, er } -// method id "compute.targetPools.get": +// method id "compute.targetSslProxies.delete": -type TargetPoolsGetCall struct { - s *Service - project string - region string - targetPool string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type TargetSslProxiesDeleteCall struct { + s *Service + project string + targetSslProxy string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Returns the specified target pool. Get a list of available -// target pools by making a list() request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/get -func (r *TargetPoolsService) Get(project string, region string, targetPool string) *TargetPoolsGetCall { - c := &TargetPoolsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified TargetSslProxy resource. +func (r *TargetSslProxiesService) Delete(project string, targetSslProxy string) *TargetSslProxiesDeleteCall { + c := &TargetSslProxiesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.targetPool = targetPool + c.targetSslProxy = targetSslProxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsGetCall) Fields(s ...googleapi.Field) *TargetPoolsGetCall { +func (c *TargetSslProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetSslProxiesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *TargetPoolsGetCall) IfNoneMatch(entityTag string) *TargetPoolsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsGetCall) Context(ctx context.Context) *TargetPoolsGetCall { +func (c *TargetSslProxiesDeleteCall) Context(ctx context.Context) *TargetSslProxiesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsGetCall) Header() http.Header { +func (c *TargetSslProxiesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsGetCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetSslProxiesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "targetPool": c.targetPool, + "project": c.project, + "targetSslProxy": c.targetSslProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.get" call. -// Exactly one of *TargetPool or error will be non-nil. Any non-2xx +// Do executes the "compute.targetSslProxies.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *TargetPool.ServerResponse.Header or (if a response was returned at +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetPoolsGetCall) Do(opts ...googleapi.CallOption) (*TargetPool, error) { +func (c *TargetSslProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -52916,7 +59486,7 @@ func (c *TargetPoolsGetCall) Do(opts ...googleapi.CallOption) (*TargetPool, erro if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetPool{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -52928,13 +59498,12 @@ func (c *TargetPoolsGetCall) Do(opts ...googleapi.CallOption) (*TargetPool, erro } return ret, nil // { - // "description": "Returns the specified target pool. Get a list of available target pools by making a list() request.", - // "httpMethod": "GET", - // "id": "compute.targetPools.get", + // "description": "Deletes the specified TargetSslProxy resource.", + // "httpMethod": "DELETE", + // "id": "compute.targetSslProxies.delete", // "parameterOrder": [ // "project", - // "region", - // "targetPool" + // "targetSslProxy" // ], // "parameters": { // "project": { @@ -52944,117 +59513,112 @@ func (c *TargetPoolsGetCall) Do(opts ...googleapi.CallOption) (*TargetPool, erro // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "targetPool": { - // "description": "Name of the TargetPool resource to return.", + // "targetSslProxy": { + // "description": "Name of the TargetSslProxy resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools/{targetPool}", + // "path": "{project}/global/targetSslProxies/{targetSslProxy}", // "response": { - // "$ref": "TargetPool" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute", - // "https://www.googleapis.com/auth/compute.readonly" + // "https://www.googleapis.com/auth/compute" // ] // } } -// method id "compute.targetPools.getHealth": +// method id "compute.targetSslProxies.get": -type TargetPoolsGetHealthCall struct { - s *Service - project string - region string - targetPool string - instancereference *InstanceReference - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetSslProxiesGetCall struct { + s *Service + project string + targetSslProxy string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header } -// GetHealth: Gets the most recent health check results for each IP for -// the instance that is referenced by the given target pool. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/getHealth -func (r *TargetPoolsService) GetHealth(project string, region string, targetPool string, instancereference *InstanceReference) *TargetPoolsGetHealthCall { - c := &TargetPoolsGetHealthCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified TargetSslProxy resource. Get a list of +// available target SSL proxies by making a list() request. +func (r *TargetSslProxiesService) Get(project string, targetSslProxy string) *TargetSslProxiesGetCall { + c := &TargetSslProxiesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.targetPool = targetPool - c.instancereference = instancereference + c.targetSslProxy = targetSslProxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsGetHealthCall) Fields(s ...googleapi.Field) *TargetPoolsGetHealthCall { +func (c *TargetSslProxiesGetCall) Fields(s ...googleapi.Field) *TargetSslProxiesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *TargetSslProxiesGetCall) IfNoneMatch(entityTag string) *TargetSslProxiesGetCall { + c.ifNoneMatch_ = entityTag + return c +} + // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsGetHealthCall) Context(ctx context.Context) *TargetPoolsGetHealthCall { +func (c *TargetSslProxiesGetCall) Context(ctx context.Context) *TargetSslProxiesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsGetHealthCall) Header() http.Header { +func (c *TargetSslProxiesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsGetHealthCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetSslProxiesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancereference) - if err != nil { - return nil, err + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } - reqHeaders.Set("Content-Type", "application/json") + var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/getHealth") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) + req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "targetPool": c.targetPool, + "project": c.project, + "targetSslProxy": c.targetSslProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.getHealth" call. -// Exactly one of *TargetPoolInstanceHealth or error will be non-nil. -// Any non-2xx status code is an error. Response headers are in either -// *TargetPoolInstanceHealth.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.targetSslProxies.get" call. +// Exactly one of *TargetSslProxy or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *TargetSslProxy.ServerResponse.Header or (if a response was returned +// at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetPoolsGetHealthCall) Do(opts ...googleapi.CallOption) (*TargetPoolInstanceHealth, error) { +func (c *TargetSslProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetSslProxy, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -53073,7 +59637,7 @@ func (c *TargetPoolsGetHealthCall) Do(opts ...googleapi.CallOption) (*TargetPool if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetPoolInstanceHealth{ + ret := &TargetSslProxy{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -53085,13 +59649,12 @@ func (c *TargetPoolsGetHealthCall) Do(opts ...googleapi.CallOption) (*TargetPool } return ret, nil // { - // "description": "Gets the most recent health check results for each IP for the instance that is referenced by the given target pool.", - // "httpMethod": "POST", - // "id": "compute.targetPools.getHealth", + // "description": "Returns the specified TargetSslProxy resource. Get a list of available target SSL proxies by making a list() request.", + // "httpMethod": "GET", + // "id": "compute.targetSslProxies.get", // "parameterOrder": [ // "project", - // "region", - // "targetPool" + // "targetSslProxy" // ], // "parameters": { // "project": { @@ -53101,27 +59664,17 @@ func (c *TargetPoolsGetHealthCall) Do(opts ...googleapi.CallOption) (*TargetPool // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "targetPool": { - // "description": "Name of the TargetPool resource to which the queried instance belongs.", + // "targetSslProxy": { + // "description": "Name of the TargetSslProxy resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools/{targetPool}/getHealth", - // "request": { - // "$ref": "InstanceReference" - // }, + // "path": "{project}/global/targetSslProxies/{targetSslProxy}", // "response": { - // "$ref": "TargetPoolInstanceHealth" + // "$ref": "TargetSslProxy" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -53132,33 +59685,30 @@ func (c *TargetPoolsGetHealthCall) Do(opts ...googleapi.CallOption) (*TargetPool } -// method id "compute.targetPools.insert": +// method id "compute.targetSslProxies.insert": -type TargetPoolsInsertCall struct { - s *Service - project string - region string - targetpool *TargetPool - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetSslProxiesInsertCall struct { + s *Service + project string + targetsslproxy *TargetSslProxy + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Insert: Creates a target pool in the specified project and region +// Insert: Creates a TargetSslProxy resource in the specified project // using the data included in the request. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/insert -func (r *TargetPoolsService) Insert(project string, region string, targetpool *TargetPool) *TargetPoolsInsertCall { - c := &TargetPoolsInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +func (r *TargetSslProxiesService) Insert(project string, targetsslproxy *TargetSslProxy) *TargetSslProxiesInsertCall { + c := &TargetSslProxiesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.targetpool = targetpool + c.targetsslproxy = targetsslproxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsInsertCall) Fields(s ...googleapi.Field) *TargetPoolsInsertCall { +func (c *TargetSslProxiesInsertCall) Fields(s ...googleapi.Field) *TargetSslProxiesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -53166,52 +59716,51 @@ func (c *TargetPoolsInsertCall) Fields(s ...googleapi.Field) *TargetPoolsInsertC // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsInsertCall) Context(ctx context.Context) *TargetPoolsInsertCall { +func (c *TargetSslProxiesInsertCall) Context(ctx context.Context) *TargetSslProxiesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsInsertCall) Header() http.Header { +func (c *TargetSslProxiesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetSslProxiesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpool) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxy) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.insert" call. +// Do executes the "compute.targetSslProxies.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetPoolsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetSslProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -53242,12 +59791,11 @@ func (c *TargetPoolsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er } return ret, nil // { - // "description": "Creates a target pool in the specified project and region using the data included in the request.", + // "description": "Creates a TargetSslProxy resource in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.targetPools.insert", + // "id": "compute.targetSslProxies.insert", // "parameterOrder": [ - // "project", - // "region" + // "project" // ], // "parameters": { // "project": { @@ -53256,18 +59804,11 @@ func (c *TargetPoolsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools", + // "path": "{project}/global/targetSslProxies", // "request": { - // "$ref": "TargetPool" + // "$ref": "TargetSslProxy" // }, // "response": { // "$ref": "Operation" @@ -53280,32 +59821,28 @@ func (c *TargetPoolsInsertCall) Do(opts ...googleapi.CallOption) (*Operation, er } -// method id "compute.targetPools.list": +// method id "compute.targetSslProxies.list": -type TargetPoolsListCall struct { +type TargetSslProxiesListCall struct { s *Service project string - region string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// List: Retrieves a list of target pools available to the specified -// project and region. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/list -func (r *TargetPoolsService) List(project string, region string) *TargetPoolsListCall { - c := &TargetPoolsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// List: Retrieves the list of TargetSslProxy resources available to the +// specified project. +func (r *TargetSslProxiesService) List(project string) *TargetSslProxiesListCall { + c := &TargetSslProxiesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -53317,7 +59854,7 @@ func (r *TargetPoolsService) List(project string, region string) *TargetPoolsLis // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -53329,7 +59866,7 @@ func (r *TargetPoolsService) List(project string, region string) *TargetPoolsLis // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *TargetPoolsListCall) Filter(filter string) *TargetPoolsListCall { +func (c *TargetSslProxiesListCall) Filter(filter string) *TargetSslProxiesListCall { c.urlParams_.Set("filter", filter) return c } @@ -53340,7 +59877,7 @@ func (c *TargetPoolsListCall) Filter(filter string) *TargetPoolsListCall { // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *TargetPoolsListCall) MaxResults(maxResults int64) *TargetPoolsListCall { +func (c *TargetSslProxiesListCall) MaxResults(maxResults int64) *TargetSslProxiesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -53357,7 +59894,7 @@ func (c *TargetPoolsListCall) MaxResults(maxResults int64) *TargetPoolsListCall // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *TargetPoolsListCall) OrderBy(orderBy string) *TargetPoolsListCall { +func (c *TargetSslProxiesListCall) OrderBy(orderBy string) *TargetSslProxiesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -53365,7 +59902,7 @@ func (c *TargetPoolsListCall) OrderBy(orderBy string) *TargetPoolsListCall { // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *TargetPoolsListCall) PageToken(pageToken string) *TargetPoolsListCall { +func (c *TargetSslProxiesListCall) PageToken(pageToken string) *TargetSslProxiesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -53373,7 +59910,7 @@ func (c *TargetPoolsListCall) PageToken(pageToken string) *TargetPoolsListCall { // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsListCall) Fields(s ...googleapi.Field) *TargetPoolsListCall { +func (c *TargetSslProxiesListCall) Fields(s ...googleapi.Field) *TargetSslProxiesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -53383,7 +59920,7 @@ func (c *TargetPoolsListCall) Fields(s ...googleapi.Field) *TargetPoolsListCall // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *TargetPoolsListCall) IfNoneMatch(entityTag string) *TargetPoolsListCall { +func (c *TargetSslProxiesListCall) IfNoneMatch(entityTag string) *TargetSslProxiesListCall { c.ifNoneMatch_ = entityTag return c } @@ -53391,21 +59928,21 @@ func (c *TargetPoolsListCall) IfNoneMatch(entityTag string) *TargetPoolsListCall // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsListCall) Context(ctx context.Context) *TargetPoolsListCall { +func (c *TargetSslProxiesListCall) Context(ctx context.Context) *TargetSslProxiesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsListCall) Header() http.Header { +func (c *TargetSslProxiesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetSslProxiesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -53416,25 +59953,24 @@ func (c *TargetPoolsListCall) doRequest(alt string) (*http.Response, error) { } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "region": c.region, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.list" call. -// Exactly one of *TargetPoolList or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *TargetPoolList.ServerResponse.Header or (if a response was returned -// at all) in error.(*googleapi.Error).Header. Use +// Do executes the "compute.targetSslProxies.list" call. +// Exactly one of *TargetSslProxyList or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *TargetSslProxyList.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetPoolsListCall) Do(opts ...googleapi.CallOption) (*TargetPoolList, error) { +func (c *TargetSslProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetSslProxyList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -53453,7 +59989,7 @@ func (c *TargetPoolsListCall) Do(opts ...googleapi.CallOption) (*TargetPoolList, if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetPoolList{ + ret := &TargetSslProxyList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -53465,16 +60001,15 @@ func (c *TargetPoolsListCall) Do(opts ...googleapi.CallOption) (*TargetPoolList, } return ret, nil // { - // "description": "Retrieves a list of target pools available to the specified project and region.", + // "description": "Retrieves the list of TargetSslProxy resources available to the specified project.", // "httpMethod": "GET", - // "id": "compute.targetPools.list", + // "id": "compute.targetSslProxies.list", // "parameterOrder": [ - // "project", - // "region" + // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -53502,18 +60037,11 @@ func (c *TargetPoolsListCall) Do(opts ...googleapi.CallOption) (*TargetPoolList, // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", // "required": true, // "type": "string" - // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools", + // "path": "{project}/global/targetSslProxies", // "response": { - // "$ref": "TargetPoolList" + // "$ref": "TargetSslProxyList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -53527,7 +60055,7 @@ func (c *TargetPoolsListCall) Do(opts ...googleapi.CallOption) (*TargetPoolList, // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *TargetPoolsListCall) Pages(ctx context.Context, f func(*TargetPoolList) error) error { +func (c *TargetSslProxiesListCall) Pages(ctx context.Context, f func(*TargetSslProxyList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -53545,34 +60073,31 @@ func (c *TargetPoolsListCall) Pages(ctx context.Context, f func(*TargetPoolList) } } -// method id "compute.targetPools.removeHealthCheck": +// method id "compute.targetSslProxies.setBackendService": -type TargetPoolsRemoveHealthCheckCall struct { - s *Service - project string - region string - targetPool string - targetpoolsremovehealthcheckrequest *TargetPoolsRemoveHealthCheckRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetSslProxiesSetBackendServiceCall struct { + s *Service + project string + targetSslProxy string + targetsslproxiessetbackendservicerequest *TargetSslProxiesSetBackendServiceRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// RemoveHealthCheck: Removes health check URL from a target pool. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/removeHealthCheck -func (r *TargetPoolsService) RemoveHealthCheck(project string, region string, targetPool string, targetpoolsremovehealthcheckrequest *TargetPoolsRemoveHealthCheckRequest) *TargetPoolsRemoveHealthCheckCall { - c := &TargetPoolsRemoveHealthCheckCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetBackendService: Changes the BackendService for TargetSslProxy. +func (r *TargetSslProxiesService) SetBackendService(project string, targetSslProxy string, targetsslproxiessetbackendservicerequest *TargetSslProxiesSetBackendServiceRequest) *TargetSslProxiesSetBackendServiceCall { + c := &TargetSslProxiesSetBackendServiceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.targetPool = targetPool - c.targetpoolsremovehealthcheckrequest = targetpoolsremovehealthcheckrequest + c.targetSslProxy = targetSslProxy + c.targetsslproxiessetbackendservicerequest = targetsslproxiessetbackendservicerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsRemoveHealthCheckCall) Fields(s ...googleapi.Field) *TargetPoolsRemoveHealthCheckCall { +func (c *TargetSslProxiesSetBackendServiceCall) Fields(s ...googleapi.Field) *TargetSslProxiesSetBackendServiceCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -53580,53 +60105,52 @@ func (c *TargetPoolsRemoveHealthCheckCall) Fields(s ...googleapi.Field) *TargetP // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsRemoveHealthCheckCall) Context(ctx context.Context) *TargetPoolsRemoveHealthCheckCall { +func (c *TargetSslProxiesSetBackendServiceCall) Context(ctx context.Context) *TargetSslProxiesSetBackendServiceCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsRemoveHealthCheckCall) Header() http.Header { +func (c *TargetSslProxiesSetBackendServiceCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsRemoveHealthCheckCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetSslProxiesSetBackendServiceCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremovehealthcheckrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetbackendservicerequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}/setBackendService") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "targetPool": c.targetPool, + "project": c.project, + "targetSslProxy": c.targetSslProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.removeHealthCheck" call. +// Do executes the "compute.targetSslProxies.setBackendService" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetPoolsRemoveHealthCheckCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetSslProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -53657,13 +60181,12 @@ func (c *TargetPoolsRemoveHealthCheckCall) Do(opts ...googleapi.CallOption) (*Op } return ret, nil // { - // "description": "Removes health check URL from a target pool.", + // "description": "Changes the BackendService for TargetSslProxy.", // "httpMethod": "POST", - // "id": "compute.targetPools.removeHealthCheck", + // "id": "compute.targetSslProxies.setBackendService", // "parameterOrder": [ // "project", - // "region", - // "targetPool" + // "targetSslProxy" // ], // "parameters": { // "project": { @@ -53673,24 +60196,17 @@ func (c *TargetPoolsRemoveHealthCheckCall) Do(opts ...googleapi.CallOption) (*Op // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region for this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "targetPool": { - // "description": "Name of the target pool to remove health checks from.", + // "targetSslProxy": { + // "description": "Name of the TargetSslProxy resource whose BackendService resource is to be set.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck", + // "path": "{project}/global/targetSslProxies/{targetSslProxy}/setBackendService", // "request": { - // "$ref": "TargetPoolsRemoveHealthCheckRequest" + // "$ref": "TargetSslProxiesSetBackendServiceRequest" // }, // "response": { // "$ref": "Operation" @@ -53703,34 +60219,31 @@ func (c *TargetPoolsRemoveHealthCheckCall) Do(opts ...googleapi.CallOption) (*Op } -// method id "compute.targetPools.removeInstance": +// method id "compute.targetSslProxies.setProxyHeader": -type TargetPoolsRemoveInstanceCall struct { - s *Service - project string - region string - targetPool string - targetpoolsremoveinstancerequest *TargetPoolsRemoveInstanceRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetSslProxiesSetProxyHeaderCall struct { + s *Service + project string + targetSslProxy string + targetsslproxiessetproxyheaderrequest *TargetSslProxiesSetProxyHeaderRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// RemoveInstance: Removes instance URL from a target pool. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/removeInstance -func (r *TargetPoolsService) RemoveInstance(project string, region string, targetPool string, targetpoolsremoveinstancerequest *TargetPoolsRemoveInstanceRequest) *TargetPoolsRemoveInstanceCall { - c := &TargetPoolsRemoveInstanceCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetProxyHeader: Changes the ProxyHeaderType for TargetSslProxy. +func (r *TargetSslProxiesService) SetProxyHeader(project string, targetSslProxy string, targetsslproxiessetproxyheaderrequest *TargetSslProxiesSetProxyHeaderRequest) *TargetSslProxiesSetProxyHeaderCall { + c := &TargetSslProxiesSetProxyHeaderCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.targetPool = targetPool - c.targetpoolsremoveinstancerequest = targetpoolsremoveinstancerequest + c.targetSslProxy = targetSslProxy + c.targetsslproxiessetproxyheaderrequest = targetsslproxiessetproxyheaderrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsRemoveInstanceCall) Fields(s ...googleapi.Field) *TargetPoolsRemoveInstanceCall { +func (c *TargetSslProxiesSetProxyHeaderCall) Fields(s ...googleapi.Field) *TargetSslProxiesSetProxyHeaderCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -53738,53 +60251,52 @@ func (c *TargetPoolsRemoveInstanceCall) Fields(s ...googleapi.Field) *TargetPool // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsRemoveInstanceCall) Context(ctx context.Context) *TargetPoolsRemoveInstanceCall { +func (c *TargetSslProxiesSetProxyHeaderCall) Context(ctx context.Context) *TargetSslProxiesSetProxyHeaderCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsRemoveInstanceCall) Header() http.Header { +func (c *TargetSslProxiesSetProxyHeaderCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsRemoveInstanceCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetSslProxiesSetProxyHeaderCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremoveinstancerequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetproxyheaderrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/removeInstance") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "targetPool": c.targetPool, + "project": c.project, + "targetSslProxy": c.targetSslProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.removeInstance" call. +// Do executes the "compute.targetSslProxies.setProxyHeader" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetPoolsRemoveInstanceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetSslProxiesSetProxyHeaderCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -53815,13 +60327,12 @@ func (c *TargetPoolsRemoveInstanceCall) Do(opts ...googleapi.CallOption) (*Opera } return ret, nil // { - // "description": "Removes instance URL from a target pool.", + // "description": "Changes the ProxyHeaderType for TargetSslProxy.", // "httpMethod": "POST", - // "id": "compute.targetPools.removeInstance", + // "id": "compute.targetSslProxies.setProxyHeader", // "parameterOrder": [ // "project", - // "region", - // "targetPool" + // "targetSslProxy" // ], // "parameters": { // "project": { @@ -53831,24 +60342,17 @@ func (c *TargetPoolsRemoveInstanceCall) Do(opts ...googleapi.CallOption) (*Opera // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "targetPool": { - // "description": "Name of the TargetPool resource to remove instances from.", + // "targetSslProxy": { + // "description": "Name of the TargetSslProxy resource whose ProxyHeader is to be set.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools/{targetPool}/removeInstance", + // "path": "{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader", // "request": { - // "$ref": "TargetPoolsRemoveInstanceRequest" + // "$ref": "TargetSslProxiesSetProxyHeaderRequest" // }, // "response": { // "$ref": "Operation" @@ -53861,41 +60365,31 @@ func (c *TargetPoolsRemoveInstanceCall) Do(opts ...googleapi.CallOption) (*Opera } -// method id "compute.targetPools.setBackup": +// method id "compute.targetSslProxies.setSslCertificates": -type TargetPoolsSetBackupCall struct { - s *Service - project string - region string - targetPool string - targetreference *TargetReference - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type TargetSslProxiesSetSslCertificatesCall struct { + s *Service + project string + targetSslProxy string + targetsslproxiessetsslcertificatesrequest *TargetSslProxiesSetSslCertificatesRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetBackup: Changes a backup target pool's configurations. -// For details, see https://cloud.google.com/compute/docs/reference/latest/targetPools/setBackup -func (r *TargetPoolsService) SetBackup(project string, region string, targetPool string, targetreference *TargetReference) *TargetPoolsSetBackupCall { - c := &TargetPoolsSetBackupCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetSslCertificates: Changes SslCertificates for TargetSslProxy. +func (r *TargetSslProxiesService) SetSslCertificates(project string, targetSslProxy string, targetsslproxiessetsslcertificatesrequest *TargetSslProxiesSetSslCertificatesRequest) *TargetSslProxiesSetSslCertificatesCall { + c := &TargetSslProxiesSetSslCertificatesCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.region = region - c.targetPool = targetPool - c.targetreference = targetreference - return c -} - -// FailoverRatio sets the optional parameter "failoverRatio": New -// failoverRatio value for the target pool. -func (c *TargetPoolsSetBackupCall) FailoverRatio(failoverRatio float64) *TargetPoolsSetBackupCall { - c.urlParams_.Set("failoverRatio", fmt.Sprint(failoverRatio)) + c.targetSslProxy = targetSslProxy + c.targetsslproxiessetsslcertificatesrequest = targetsslproxiessetsslcertificatesrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetPoolsSetBackupCall) Fields(s ...googleapi.Field) *TargetPoolsSetBackupCall { +func (c *TargetSslProxiesSetSslCertificatesCall) Fields(s ...googleapi.Field) *TargetSslProxiesSetSslCertificatesCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -53903,53 +60397,52 @@ func (c *TargetPoolsSetBackupCall) Fields(s ...googleapi.Field) *TargetPoolsSetB // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetPoolsSetBackupCall) Context(ctx context.Context) *TargetPoolsSetBackupCall { +func (c *TargetSslProxiesSetSslCertificatesCall) Context(ctx context.Context) *TargetSslProxiesSetSslCertificatesCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetPoolsSetBackupCall) Header() http.Header { +func (c *TargetSslProxiesSetSslCertificatesCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetPoolsSetBackupCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetSslProxiesSetSslCertificatesCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetsslcertificatesrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/setBackup") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "region": c.region, - "targetPool": c.targetPool, + "project": c.project, + "targetSslProxy": c.targetSslProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetPools.setBackup" call. +// Do executes the "compute.targetSslProxies.setSslCertificates" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetPoolsSetBackupCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetSslProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -53980,21 +60473,14 @@ func (c *TargetPoolsSetBackupCall) Do(opts ...googleapi.CallOption) (*Operation, } return ret, nil // { - // "description": "Changes a backup target pool's configurations.", + // "description": "Changes SslCertificates for TargetSslProxy.", // "httpMethod": "POST", - // "id": "compute.targetPools.setBackup", + // "id": "compute.targetSslProxies.setSslCertificates", // "parameterOrder": [ // "project", - // "region", - // "targetPool" + // "targetSslProxy" // ], // "parameters": { - // "failoverRatio": { - // "description": "New failoverRatio value for the target pool.", - // "format": "float", - // "location": "query", - // "type": "number" - // }, // "project": { // "description": "Project ID for this request.", // "location": "path", @@ -54002,24 +60488,17 @@ func (c *TargetPoolsSetBackupCall) Do(opts ...googleapi.CallOption) (*Operation, // "required": true, // "type": "string" // }, - // "region": { - // "description": "Name of the region scoping this request.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // }, - // "targetPool": { - // "description": "Name of the TargetPool resource to set a backup pool for.", + // "targetSslProxy": { + // "description": "Name of the TargetSslProxy resource whose SslCertificate resource is to be set.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/regions/{region}/targetPools/{targetPool}/setBackup", + // "path": "{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates", // "request": { - // "$ref": "TargetReference" + // "$ref": "TargetSslProxiesSetSslCertificatesRequest" // }, // "response": { // "$ref": "Operation" @@ -54032,29 +60511,29 @@ func (c *TargetPoolsSetBackupCall) Do(opts ...googleapi.CallOption) (*Operation, } -// method id "compute.targetSslProxies.delete": +// method id "compute.targetTcpProxies.delete": -type TargetSslProxiesDeleteCall struct { +type TargetTcpProxiesDeleteCall struct { s *Service project string - targetSslProxy string + targetTcpProxy string urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Delete: Deletes the specified TargetSslProxy resource. -func (r *TargetSslProxiesService) Delete(project string, targetSslProxy string) *TargetSslProxiesDeleteCall { - c := &TargetSslProxiesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Delete: Deletes the specified TargetTcpProxy resource. +func (r *TargetTcpProxiesService) Delete(project string, targetTcpProxy string) *TargetTcpProxiesDeleteCall { + c := &TargetTcpProxiesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetSslProxy = targetSslProxy + c.targetTcpProxy = targetTcpProxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetSslProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetSslProxiesDeleteCall { +func (c *TargetTcpProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetTcpProxiesDeleteCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -54062,21 +60541,21 @@ func (c *TargetSslProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetSslProx // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetSslProxiesDeleteCall) Context(ctx context.Context) *TargetSslProxiesDeleteCall { +func (c *TargetTcpProxiesDeleteCall) Context(ctx context.Context) *TargetTcpProxiesDeleteCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetSslProxiesDeleteCall) Header() http.Header { +func (c *TargetTcpProxiesDeleteCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetSslProxiesDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetTcpProxiesDeleteCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -54084,25 +60563,25 @@ func (c *TargetSslProxiesDeleteCall) doRequest(alt string) (*http.Response, erro reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetTcpProxies/{targetTcpProxy}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "targetSslProxy": c.targetSslProxy, + "targetTcpProxy": c.targetTcpProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetSslProxies.delete" call. +// Do executes the "compute.targetTcpProxies.delete" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetSslProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetTcpProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -54133,12 +60612,12 @@ func (c *TargetSslProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Deletes the specified TargetSslProxy resource.", + // "description": "Deletes the specified TargetTcpProxy resource.", // "httpMethod": "DELETE", - // "id": "compute.targetSslProxies.delete", + // "id": "compute.targetTcpProxies.delete", // "parameterOrder": [ // "project", - // "targetSslProxy" + // "targetTcpProxy" // ], // "parameters": { // "project": { @@ -54148,15 +60627,15 @@ func (c *TargetSslProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio // "required": true, // "type": "string" // }, - // "targetSslProxy": { - // "description": "Name of the TargetSslProxy resource to delete.", + // "targetTcpProxy": { + // "description": "Name of the TargetTcpProxy resource to delete.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/targetSslProxies/{targetSslProxy}", + // "path": "{project}/global/targetTcpProxies/{targetTcpProxy}", // "response": { // "$ref": "Operation" // }, @@ -54168,31 +60647,31 @@ func (c *TargetSslProxiesDeleteCall) Do(opts ...googleapi.CallOption) (*Operatio } -// method id "compute.targetSslProxies.get": +// method id "compute.targetTcpProxies.get": -type TargetSslProxiesGetCall struct { +type TargetTcpProxiesGetCall struct { s *Service project string - targetSslProxy string + targetTcpProxy string urlParams_ gensupport.URLParams ifNoneMatch_ string ctx_ context.Context header_ http.Header } -// Get: Returns the specified TargetSslProxy resource. Get a list of -// available target SSL proxies by making a list() request. -func (r *TargetSslProxiesService) Get(project string, targetSslProxy string) *TargetSslProxiesGetCall { - c := &TargetSslProxiesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Get: Returns the specified TargetTcpProxy resource. Get a list of +// available target TCP proxies by making a list() request. +func (r *TargetTcpProxiesService) Get(project string, targetTcpProxy string) *TargetTcpProxiesGetCall { + c := &TargetTcpProxiesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetSslProxy = targetSslProxy + c.targetTcpProxy = targetTcpProxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetSslProxiesGetCall) Fields(s ...googleapi.Field) *TargetSslProxiesGetCall { +func (c *TargetTcpProxiesGetCall) Fields(s ...googleapi.Field) *TargetTcpProxiesGetCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -54202,7 +60681,7 @@ func (c *TargetSslProxiesGetCall) Fields(s ...googleapi.Field) *TargetSslProxies // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *TargetSslProxiesGetCall) IfNoneMatch(entityTag string) *TargetSslProxiesGetCall { +func (c *TargetTcpProxiesGetCall) IfNoneMatch(entityTag string) *TargetTcpProxiesGetCall { c.ifNoneMatch_ = entityTag return c } @@ -54210,21 +60689,21 @@ func (c *TargetSslProxiesGetCall) IfNoneMatch(entityTag string) *TargetSslProxie // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetSslProxiesGetCall) Context(ctx context.Context) *TargetSslProxiesGetCall { +func (c *TargetTcpProxiesGetCall) Context(ctx context.Context) *TargetTcpProxiesGetCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetSslProxiesGetCall) Header() http.Header { +func (c *TargetTcpProxiesGetCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetSslProxiesGetCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetTcpProxiesGetCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -54235,25 +60714,25 @@ func (c *TargetSslProxiesGetCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetTcpProxies/{targetTcpProxy}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "targetSslProxy": c.targetSslProxy, + "targetTcpProxy": c.targetTcpProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetSslProxies.get" call. -// Exactly one of *TargetSslProxy or error will be non-nil. Any non-2xx +// Do executes the "compute.targetTcpProxies.get" call. +// Exactly one of *TargetTcpProxy or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either -// *TargetSslProxy.ServerResponse.Header or (if a response was returned +// *TargetTcpProxy.ServerResponse.Header or (if a response was returned // at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetSslProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetSslProxy, error) { +func (c *TargetTcpProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetTcpProxy, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -54272,7 +60751,7 @@ func (c *TargetSslProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetSslPr if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetSslProxy{ + ret := &TargetTcpProxy{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -54284,12 +60763,12 @@ func (c *TargetSslProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetSslPr } return ret, nil // { - // "description": "Returns the specified TargetSslProxy resource. Get a list of available target SSL proxies by making a list() request.", + // "description": "Returns the specified TargetTcpProxy resource. Get a list of available target TCP proxies by making a list() request.", // "httpMethod": "GET", - // "id": "compute.targetSslProxies.get", + // "id": "compute.targetTcpProxies.get", // "parameterOrder": [ // "project", - // "targetSslProxy" + // "targetTcpProxy" // ], // "parameters": { // "project": { @@ -54299,17 +60778,17 @@ func (c *TargetSslProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetSslPr // "required": true, // "type": "string" // }, - // "targetSslProxy": { - // "description": "Name of the TargetSslProxy resource to return.", + // "targetTcpProxy": { + // "description": "Name of the TargetTcpProxy resource to return.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/targetSslProxies/{targetSslProxy}", + // "path": "{project}/global/targetTcpProxies/{targetTcpProxy}", // "response": { - // "$ref": "TargetSslProxy" + // "$ref": "TargetTcpProxy" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -54320,30 +60799,30 @@ func (c *TargetSslProxiesGetCall) Do(opts ...googleapi.CallOption) (*TargetSslPr } -// method id "compute.targetSslProxies.insert": +// method id "compute.targetTcpProxies.insert": -type TargetSslProxiesInsertCall struct { +type TargetTcpProxiesInsertCall struct { s *Service project string - targetsslproxy *TargetSslProxy + targettcpproxy *TargetTcpProxy urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// Insert: Creates a TargetSslProxy resource in the specified project +// Insert: Creates a TargetTcpProxy resource in the specified project // using the data included in the request. -func (r *TargetSslProxiesService) Insert(project string, targetsslproxy *TargetSslProxy) *TargetSslProxiesInsertCall { - c := &TargetSslProxiesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} +func (r *TargetTcpProxiesService) Insert(project string, targettcpproxy *TargetTcpProxy) *TargetTcpProxiesInsertCall { + c := &TargetTcpProxiesInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetsslproxy = targetsslproxy + c.targettcpproxy = targettcpproxy return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetSslProxiesInsertCall) Fields(s ...googleapi.Field) *TargetSslProxiesInsertCall { +func (c *TargetTcpProxiesInsertCall) Fields(s ...googleapi.Field) *TargetTcpProxiesInsertCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -54351,34 +60830,34 @@ func (c *TargetSslProxiesInsertCall) Fields(s ...googleapi.Field) *TargetSslProx // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetSslProxiesInsertCall) Context(ctx context.Context) *TargetSslProxiesInsertCall { +func (c *TargetTcpProxiesInsertCall) Context(ctx context.Context) *TargetTcpProxiesInsertCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetSslProxiesInsertCall) Header() http.Header { +func (c *TargetTcpProxiesInsertCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetSslProxiesInsertCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetTcpProxiesInsertCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxy) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targettcpproxy) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetTcpProxies") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -54388,14 +60867,14 @@ func (c *TargetSslProxiesInsertCall) doRequest(alt string) (*http.Response, erro return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetSslProxies.insert" call. +// Do executes the "compute.targetTcpProxies.insert" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetSslProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetTcpProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -54426,9 +60905,9 @@ func (c *TargetSslProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operatio } return ret, nil // { - // "description": "Creates a TargetSslProxy resource in the specified project using the data included in the request.", + // "description": "Creates a TargetTcpProxy resource in the specified project using the data included in the request.", // "httpMethod": "POST", - // "id": "compute.targetSslProxies.insert", + // "id": "compute.targetTcpProxies.insert", // "parameterOrder": [ // "project" // ], @@ -54441,9 +60920,9 @@ func (c *TargetSslProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operatio // "type": "string" // } // }, - // "path": "{project}/global/targetSslProxies", + // "path": "{project}/global/targetTcpProxies", // "request": { - // "$ref": "TargetSslProxy" + // "$ref": "TargetTcpProxy" // }, // "response": { // "$ref": "Operation" @@ -54456,9 +60935,9 @@ func (c *TargetSslProxiesInsertCall) Do(opts ...googleapi.CallOption) (*Operatio } -// method id "compute.targetSslProxies.list": +// method id "compute.targetTcpProxies.list": -type TargetSslProxiesListCall struct { +type TargetTcpProxiesListCall struct { s *Service project string urlParams_ gensupport.URLParams @@ -54467,18 +60946,17 @@ type TargetSslProxiesListCall struct { header_ http.Header } -// List: Retrieves the list of TargetSslProxy resources available to the +// List: Retrieves the list of TargetTcpProxy resources available to the // specified project. -func (r *TargetSslProxiesService) List(project string) *TargetSslProxiesListCall { - c := &TargetSslProxiesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +func (r *TargetTcpProxiesService) List(project string) *TargetTcpProxiesListCall { + c := &TargetTcpProxiesListCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -54490,7 +60968,7 @@ func (r *TargetSslProxiesService) List(project string) *TargetSslProxiesListCall // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -54502,7 +60980,7 @@ func (r *TargetSslProxiesService) List(project string) *TargetSslProxiesListCall // true) (zone eq us-central1-f). Multiple expressions are treated as // AND expressions, meaning that resources must match all expressions to // pass the filters. -func (c *TargetSslProxiesListCall) Filter(filter string) *TargetSslProxiesListCall { +func (c *TargetTcpProxiesListCall) Filter(filter string) *TargetTcpProxiesListCall { c.urlParams_.Set("filter", filter) return c } @@ -54513,7 +60991,7 @@ func (c *TargetSslProxiesListCall) Filter(filter string) *TargetSslProxiesListCa // nextPageToken that can be used to get the next page of results in // subsequent list requests. Acceptable values are 0 to 500, inclusive. // (Default: 500) -func (c *TargetSslProxiesListCall) MaxResults(maxResults int64) *TargetSslProxiesListCall { +func (c *TargetTcpProxiesListCall) MaxResults(maxResults int64) *TargetTcpProxiesListCall { c.urlParams_.Set("maxResults", fmt.Sprint(maxResults)) return c } @@ -54530,7 +61008,7 @@ func (c *TargetSslProxiesListCall) MaxResults(maxResults int64) *TargetSslProxie // // Currently, only sorting by name or creationTimestamp desc is // supported. -func (c *TargetSslProxiesListCall) OrderBy(orderBy string) *TargetSslProxiesListCall { +func (c *TargetTcpProxiesListCall) OrderBy(orderBy string) *TargetTcpProxiesListCall { c.urlParams_.Set("orderBy", orderBy) return c } @@ -54538,7 +61016,7 @@ func (c *TargetSslProxiesListCall) OrderBy(orderBy string) *TargetSslProxiesList // PageToken sets the optional parameter "pageToken": Specifies a page // token to use. Set pageToken to the nextPageToken returned by a // previous list request to get the next page of results. -func (c *TargetSslProxiesListCall) PageToken(pageToken string) *TargetSslProxiesListCall { +func (c *TargetTcpProxiesListCall) PageToken(pageToken string) *TargetTcpProxiesListCall { c.urlParams_.Set("pageToken", pageToken) return c } @@ -54546,7 +61024,7 @@ func (c *TargetSslProxiesListCall) PageToken(pageToken string) *TargetSslProxies // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetSslProxiesListCall) Fields(s ...googleapi.Field) *TargetSslProxiesListCall { +func (c *TargetTcpProxiesListCall) Fields(s ...googleapi.Field) *TargetTcpProxiesListCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -54556,7 +61034,7 @@ func (c *TargetSslProxiesListCall) Fields(s ...googleapi.Field) *TargetSslProxie // getting updates only after the object has changed since the last // request. Use googleapi.IsNotModified to check whether the response // error from Do is the result of In-None-Match. -func (c *TargetSslProxiesListCall) IfNoneMatch(entityTag string) *TargetSslProxiesListCall { +func (c *TargetTcpProxiesListCall) IfNoneMatch(entityTag string) *TargetTcpProxiesListCall { c.ifNoneMatch_ = entityTag return c } @@ -54564,21 +61042,21 @@ func (c *TargetSslProxiesListCall) IfNoneMatch(entityTag string) *TargetSslProxi // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetSslProxiesListCall) Context(ctx context.Context) *TargetSslProxiesListCall { +func (c *TargetTcpProxiesListCall) Context(ctx context.Context) *TargetTcpProxiesListCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetSslProxiesListCall) Header() http.Header { +func (c *TargetTcpProxiesListCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetSslProxiesListCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetTcpProxiesListCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v @@ -54589,7 +61067,7 @@ func (c *TargetSslProxiesListCall) doRequest(alt string) (*http.Response, error) } var body io.Reader = nil c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetTcpProxies") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) req.Header = reqHeaders @@ -54599,14 +61077,14 @@ func (c *TargetSslProxiesListCall) doRequest(alt string) (*http.Response, error) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetSslProxies.list" call. -// Exactly one of *TargetSslProxyList or error will be non-nil. Any +// Do executes the "compute.targetTcpProxies.list" call. +// Exactly one of *TargetTcpProxyList or error will be non-nil. Any // non-2xx status code is an error. Response headers are in either -// *TargetSslProxyList.ServerResponse.Header or (if a response was +// *TargetTcpProxyList.ServerResponse.Header or (if a response was // returned at all) in error.(*googleapi.Error).Header. Use // googleapi.IsNotModified to check whether the returned error was // because http.StatusNotModified was returned. -func (c *TargetSslProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetSslProxyList, error) { +func (c *TargetTcpProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetTcpProxyList, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -54625,7 +61103,7 @@ func (c *TargetSslProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetSslP if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &TargetSslProxyList{ + ret := &TargetTcpProxyList{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -54637,15 +61115,15 @@ func (c *TargetSslProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetSslP } return ret, nil // { - // "description": "Retrieves the list of TargetSslProxy resources available to the specified project.", + // "description": "Retrieves the list of TargetTcpProxy resources available to the specified project.", // "httpMethod": "GET", - // "id": "compute.targetSslProxies.list", + // "id": "compute.targetTcpProxies.list", // "parameterOrder": [ // "project" // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -54675,9 +61153,9 @@ func (c *TargetSslProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetSslP // "type": "string" // } // }, - // "path": "{project}/global/targetSslProxies", + // "path": "{project}/global/targetTcpProxies", // "response": { - // "$ref": "TargetSslProxyList" + // "$ref": "TargetTcpProxyList" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform", @@ -54691,7 +61169,7 @@ func (c *TargetSslProxiesListCall) Do(opts ...googleapi.CallOption) (*TargetSslP // Pages invokes f for each page of results. // A non-nil error returned from f will halt the iteration. // The provided context supersedes any context provided to the Context method. -func (c *TargetSslProxiesListCall) Pages(ctx context.Context, f func(*TargetSslProxyList) error) error { +func (c *TargetTcpProxiesListCall) Pages(ctx context.Context, f func(*TargetTcpProxyList) error) error { c.ctx_ = ctx defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point for { @@ -54709,31 +61187,31 @@ func (c *TargetSslProxiesListCall) Pages(ctx context.Context, f func(*TargetSslP } } -// method id "compute.targetSslProxies.setBackendService": +// method id "compute.targetTcpProxies.setBackendService": -type TargetSslProxiesSetBackendServiceCall struct { +type TargetTcpProxiesSetBackendServiceCall struct { s *Service project string - targetSslProxy string - targetsslproxiessetbackendservicerequest *TargetSslProxiesSetBackendServiceRequest + targetTcpProxy string + targettcpproxiessetbackendservicerequest *TargetTcpProxiesSetBackendServiceRequest urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// SetBackendService: Changes the BackendService for TargetSslProxy. -func (r *TargetSslProxiesService) SetBackendService(project string, targetSslProxy string, targetsslproxiessetbackendservicerequest *TargetSslProxiesSetBackendServiceRequest) *TargetSslProxiesSetBackendServiceCall { - c := &TargetSslProxiesSetBackendServiceCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetBackendService: Changes the BackendService for TargetTcpProxy. +func (r *TargetTcpProxiesService) SetBackendService(project string, targetTcpProxy string, targettcpproxiessetbackendservicerequest *TargetTcpProxiesSetBackendServiceRequest) *TargetTcpProxiesSetBackendServiceCall { + c := &TargetTcpProxiesSetBackendServiceCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetSslProxy = targetSslProxy - c.targetsslproxiessetbackendservicerequest = targetsslproxiessetbackendservicerequest + c.targetTcpProxy = targetTcpProxy + c.targettcpproxiessetbackendservicerequest = targettcpproxiessetbackendservicerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetSslProxiesSetBackendServiceCall) Fields(s ...googleapi.Field) *TargetSslProxiesSetBackendServiceCall { +func (c *TargetTcpProxiesSetBackendServiceCall) Fields(s ...googleapi.Field) *TargetTcpProxiesSetBackendServiceCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -54741,52 +61219,52 @@ func (c *TargetSslProxiesSetBackendServiceCall) Fields(s ...googleapi.Field) *Ta // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetSslProxiesSetBackendServiceCall) Context(ctx context.Context) *TargetSslProxiesSetBackendServiceCall { +func (c *TargetTcpProxiesSetBackendServiceCall) Context(ctx context.Context) *TargetTcpProxiesSetBackendServiceCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetSslProxiesSetBackendServiceCall) Header() http.Header { +func (c *TargetTcpProxiesSetBackendServiceCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetSslProxiesSetBackendServiceCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetTcpProxiesSetBackendServiceCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetbackendservicerequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targettcpproxiessetbackendservicerequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}/setBackendService") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetTcpProxies/{targetTcpProxy}/setBackendService") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "targetSslProxy": c.targetSslProxy, + "targetTcpProxy": c.targetTcpProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetSslProxies.setBackendService" call. +// Do executes the "compute.targetTcpProxies.setBackendService" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetSslProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetTcpProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -54817,12 +61295,12 @@ func (c *TargetSslProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Changes the BackendService for TargetSslProxy.", + // "description": "Changes the BackendService for TargetTcpProxy.", // "httpMethod": "POST", - // "id": "compute.targetSslProxies.setBackendService", + // "id": "compute.targetTcpProxies.setBackendService", // "parameterOrder": [ // "project", - // "targetSslProxy" + // "targetTcpProxy" // ], // "parameters": { // "project": { @@ -54832,17 +61310,17 @@ func (c *TargetSslProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) // "required": true, // "type": "string" // }, - // "targetSslProxy": { - // "description": "Name of the TargetSslProxy resource whose BackendService resource is to be set.", + // "targetTcpProxy": { + // "description": "Name of the TargetTcpProxy resource whose BackendService resource is to be set.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/targetSslProxies/{targetSslProxy}/setBackendService", + // "path": "{project}/global/targetTcpProxies/{targetTcpProxy}/setBackendService", // "request": { - // "$ref": "TargetSslProxiesSetBackendServiceRequest" + // "$ref": "TargetTcpProxiesSetBackendServiceRequest" // }, // "response": { // "$ref": "Operation" @@ -54855,31 +61333,31 @@ func (c *TargetSslProxiesSetBackendServiceCall) Do(opts ...googleapi.CallOption) } -// method id "compute.targetSslProxies.setProxyHeader": +// method id "compute.targetTcpProxies.setProxyHeader": -type TargetSslProxiesSetProxyHeaderCall struct { +type TargetTcpProxiesSetProxyHeaderCall struct { s *Service project string - targetSslProxy string - targetsslproxiessetproxyheaderrequest *TargetSslProxiesSetProxyHeaderRequest + targetTcpProxy string + targettcpproxiessetproxyheaderrequest *TargetTcpProxiesSetProxyHeaderRequest urlParams_ gensupport.URLParams ctx_ context.Context header_ http.Header } -// SetProxyHeader: Changes the ProxyHeaderType for TargetSslProxy. -func (r *TargetSslProxiesService) SetProxyHeader(project string, targetSslProxy string, targetsslproxiessetproxyheaderrequest *TargetSslProxiesSetProxyHeaderRequest) *TargetSslProxiesSetProxyHeaderCall { - c := &TargetSslProxiesSetProxyHeaderCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetProxyHeader: Changes the ProxyHeaderType for TargetTcpProxy. +func (r *TargetTcpProxiesService) SetProxyHeader(project string, targetTcpProxy string, targettcpproxiessetproxyheaderrequest *TargetTcpProxiesSetProxyHeaderRequest) *TargetTcpProxiesSetProxyHeaderCall { + c := &TargetTcpProxiesSetProxyHeaderCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.project = project - c.targetSslProxy = targetSslProxy - c.targetsslproxiessetproxyheaderrequest = targetsslproxiessetproxyheaderrequest + c.targetTcpProxy = targetTcpProxy + c.targettcpproxiessetproxyheaderrequest = targettcpproxiessetproxyheaderrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *TargetSslProxiesSetProxyHeaderCall) Fields(s ...googleapi.Field) *TargetSslProxiesSetProxyHeaderCall { +func (c *TargetTcpProxiesSetProxyHeaderCall) Fields(s ...googleapi.Field) *TargetTcpProxiesSetProxyHeaderCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -54887,52 +61365,52 @@ func (c *TargetSslProxiesSetProxyHeaderCall) Fields(s ...googleapi.Field) *Targe // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *TargetSslProxiesSetProxyHeaderCall) Context(ctx context.Context) *TargetSslProxiesSetProxyHeaderCall { +func (c *TargetTcpProxiesSetProxyHeaderCall) Context(ctx context.Context) *TargetTcpProxiesSetProxyHeaderCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *TargetSslProxiesSetProxyHeaderCall) Header() http.Header { +func (c *TargetTcpProxiesSetProxyHeaderCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *TargetSslProxiesSetProxyHeaderCall) doRequest(alt string) (*http.Response, error) { +func (c *TargetTcpProxiesSetProxyHeaderCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetproxyheaderrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.targettcpproxiessetproxyheaderrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader") + urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetTcpProxies/{targetTcpProxy}/setProxyHeader") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, - "targetSslProxy": c.targetSslProxy, + "targetTcpProxy": c.targetTcpProxy, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "compute.targetSslProxies.setProxyHeader" call. +// Do executes the "compute.targetTcpProxies.setProxyHeader" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *TargetSslProxiesSetProxyHeaderCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *TargetTcpProxiesSetProxyHeaderCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -54963,12 +61441,12 @@ func (c *TargetSslProxiesSetProxyHeaderCall) Do(opts ...googleapi.CallOption) (* } return ret, nil // { - // "description": "Changes the ProxyHeaderType for TargetSslProxy.", + // "description": "Changes the ProxyHeaderType for TargetTcpProxy.", // "httpMethod": "POST", - // "id": "compute.targetSslProxies.setProxyHeader", + // "id": "compute.targetTcpProxies.setProxyHeader", // "parameterOrder": [ // "project", - // "targetSslProxy" + // "targetTcpProxy" // ], // "parameters": { // "project": { @@ -54978,163 +61456,17 @@ func (c *TargetSslProxiesSetProxyHeaderCall) Do(opts ...googleapi.CallOption) (* // "required": true, // "type": "string" // }, - // "targetSslProxy": { - // "description": "Name of the TargetSslProxy resource whose ProxyHeader is to be set.", + // "targetTcpProxy": { + // "description": "Name of the TargetTcpProxy resource whose ProxyHeader is to be set.", // "location": "path", // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", // "required": true, // "type": "string" // } // }, - // "path": "{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader", + // "path": "{project}/global/targetTcpProxies/{targetTcpProxy}/setProxyHeader", // "request": { - // "$ref": "TargetSslProxiesSetProxyHeaderRequest" - // }, - // "response": { - // "$ref": "Operation" - // }, - // "scopes": [ - // "https://www.googleapis.com/auth/cloud-platform", - // "https://www.googleapis.com/auth/compute" - // ] - // } - -} - -// method id "compute.targetSslProxies.setSslCertificates": - -type TargetSslProxiesSetSslCertificatesCall struct { - s *Service - project string - targetSslProxy string - targetsslproxiessetsslcertificatesrequest *TargetSslProxiesSetSslCertificatesRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header -} - -// SetSslCertificates: Changes SslCertificates for TargetSslProxy. -func (r *TargetSslProxiesService) SetSslCertificates(project string, targetSslProxy string, targetsslproxiessetsslcertificatesrequest *TargetSslProxiesSetSslCertificatesRequest) *TargetSslProxiesSetSslCertificatesCall { - c := &TargetSslProxiesSetSslCertificatesCall{s: r.s, urlParams_: make(gensupport.URLParams)} - c.project = project - c.targetSslProxy = targetSslProxy - c.targetsslproxiessetsslcertificatesrequest = targetsslproxiessetsslcertificatesrequest - return c -} - -// Fields allows partial responses to be retrieved. See -// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse -// for more information. -func (c *TargetSslProxiesSetSslCertificatesCall) Fields(s ...googleapi.Field) *TargetSslProxiesSetSslCertificatesCall { - c.urlParams_.Set("fields", googleapi.CombineFields(s)) - return c -} - -// Context sets the context to be used in this call's Do method. Any -// pending HTTP request will be aborted if the provided context is -// canceled. -func (c *TargetSslProxiesSetSslCertificatesCall) Context(ctx context.Context) *TargetSslProxiesSetSslCertificatesCall { - c.ctx_ = ctx - return c -} - -// Header returns an http.Header that can be modified by the caller to -// add HTTP headers to the request. -func (c *TargetSslProxiesSetSslCertificatesCall) Header() http.Header { - if c.header_ == nil { - c.header_ = make(http.Header) - } - return c.header_ -} - -func (c *TargetSslProxiesSetSslCertificatesCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := make(http.Header) - for k, v := range c.header_ { - reqHeaders[k] = v - } - reqHeaders.Set("User-Agent", c.s.userAgent()) - var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetsslcertificatesrequest) - if err != nil { - return nil, err - } - reqHeaders.Set("Content-Type", "application/json") - c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates") - urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("POST", urls, body) - req.Header = reqHeaders - googleapi.Expand(req.URL, map[string]string{ - "project": c.project, - "targetSslProxy": c.targetSslProxy, - }) - return gensupport.SendRequest(c.ctx_, c.s.client, req) -} - -// Do executes the "compute.targetSslProxies.setSslCertificates" call. -// Exactly one of *Operation or error will be non-nil. Any non-2xx -// status code is an error. Response headers are in either -// *Operation.ServerResponse.Header or (if a response was returned at -// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified -// to check whether the returned error was because -// http.StatusNotModified was returned. -func (c *TargetSslProxiesSetSslCertificatesCall) Do(opts ...googleapi.CallOption) (*Operation, error) { - gensupport.SetOptions(c.urlParams_, opts...) - res, err := c.doRequest("json") - if res != nil && res.StatusCode == http.StatusNotModified { - if res.Body != nil { - res.Body.Close() - } - return nil, &googleapi.Error{ - Code: res.StatusCode, - Header: res.Header, - } - } - if err != nil { - return nil, err - } - defer googleapi.CloseBody(res) - if err := googleapi.CheckResponse(res); err != nil { - return nil, err - } - ret := &Operation{ - ServerResponse: googleapi.ServerResponse{ - Header: res.Header, - HTTPStatusCode: res.StatusCode, - }, - } - target := &ret - if err := json.NewDecoder(res.Body).Decode(target); err != nil { - return nil, err - } - return ret, nil - // { - // "description": "Changes SslCertificates for TargetSslProxy.", - // "httpMethod": "POST", - // "id": "compute.targetSslProxies.setSslCertificates", - // "parameterOrder": [ - // "project", - // "targetSslProxy" - // ], - // "parameters": { - // "project": { - // "description": "Project ID for this request.", - // "location": "path", - // "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", - // "required": true, - // "type": "string" - // }, - // "targetSslProxy": { - // "description": "Name of the TargetSslProxy resource whose SslCertificate resource is to be set.", - // "location": "path", - // "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", - // "required": true, - // "type": "string" - // } - // }, - // "path": "{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates", - // "request": { - // "$ref": "TargetSslProxiesSetSslCertificatesRequest" + // "$ref": "TargetTcpProxiesSetProxyHeaderRequest" // }, // "response": { // "$ref": "Operation" @@ -55165,10 +61497,9 @@ func (r *TargetVpnGatewaysService) AggregatedList(project string) *TargetVpnGate return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -55180,7 +61511,7 @@ func (r *TargetVpnGatewaysService) AggregatedList(project string) *TargetVpnGate // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -55335,7 +61666,7 @@ func (c *TargetVpnGatewaysAggregatedListCall) Do(opts ...googleapi.CallOption) ( // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -55877,10 +62208,9 @@ func (r *TargetVpnGatewaysService) List(project string, region string) *TargetVp return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -55892,7 +62222,7 @@ func (r *TargetVpnGatewaysService) List(project string, region string) *TargetVp // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -56049,7 +62379,7 @@ func (c *TargetVpnGatewaysListCall) Do(opts ...googleapi.CallOption) (*TargetVpn // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -56714,10 +63044,9 @@ func (r *UrlMapsService) List(project string) *UrlMapsListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -56729,7 +63058,7 @@ func (r *UrlMapsService) List(project string) *UrlMapsListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -56884,7 +63213,7 @@ func (c *UrlMapsListCall) Do(opts ...googleapi.CallOption) (*UrlMapList, error) // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -56961,7 +63290,8 @@ type UrlMapsPatchCall struct { } // Patch: Patches the specified UrlMap resource with the data included -// in the request. This method supports patch semantics. +// in the request. This method supports PATCH semantics and uses the +// JSON merge patch format and processing rules. // For details, see https://cloud.google.com/compute/docs/reference/latest/urlMaps/patch func (r *UrlMapsService) Patch(project string, urlMap string, urlmap *UrlMap) *UrlMapsPatchCall { c := &UrlMapsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)} @@ -57058,7 +63388,7 @@ func (c *UrlMapsPatchCall) Do(opts ...googleapi.CallOption) (*Operation, error) } return ret, nil // { - // "description": "Patches the specified UrlMap resource with the data included in the request. This method supports patch semantics.", + // "description": "Patches the specified UrlMap resource with the data included in the request. This method supports PATCH semantics and uses the JSON merge patch format and processing rules.", // "httpMethod": "PATCH", // "id": "compute.urlMaps.patch", // "parameterOrder": [ @@ -57412,10 +63742,9 @@ func (r *VpnTunnelsService) AggregatedList(project string) *VpnTunnelsAggregated return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -57427,7 +63756,7 @@ func (r *VpnTunnelsService) AggregatedList(project string) *VpnTunnelsAggregated // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -57582,7 +63911,7 @@ func (c *VpnTunnelsAggregatedListCall) Do(opts ...googleapi.CallOption) (*VpnTun // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -58124,10 +64453,9 @@ func (r *VpnTunnelsService) List(project string, region string) *VpnTunnelsListC return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -58139,7 +64467,7 @@ func (r *VpnTunnelsService) List(project string, region string) *VpnTunnelsListC // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -58296,7 +64624,7 @@ func (c *VpnTunnelsListCall) Do(opts ...googleapi.CallOption) (*VpnTunnelList, e // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -58672,10 +65000,9 @@ func (r *ZoneOperationsService) List(project string, zone string) *ZoneOperation return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -58687,7 +65014,7 @@ func (r *ZoneOperationsService) List(project string, zone string) *ZoneOperation // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -58844,7 +65171,7 @@ func (c *ZoneOperationsListCall) Do(opts ...googleapi.CallOption) (*OperationLis // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, @@ -59088,10 +65415,9 @@ func (r *ZonesService) List(project string) *ZonesListCall { return c } -// Filter sets the optional parameter "filter": Sets a filter expression -// for filtering listed resources, in the form filter={expression}. Your -// {expression} must be in the format: field_name comparison_string -// literal_string. +// Filter sets the optional parameter "filter": Sets a filter +// {expression} for filtering listed resources. Your {expression} must +// be in the format: field_name comparison_string literal_string. // // The field_name is the name of the field you want to compare. Only // atomic field types are supported (string, number, boolean). The @@ -59103,7 +65429,7 @@ func (r *ZonesService) List(project string) *ZonesListCall { // match the entire field. // // For example, to filter for instances that do not have a name of -// example-instance, you would use filter=name ne example-instance. +// example-instance, you would use name ne example-instance. // // You can filter on nested fields. For example, you could filter on // instances that have set the scheduling.automaticRestart field to @@ -59258,7 +65584,7 @@ func (c *ZonesListCall) Do(opts ...googleapi.CallOption) (*ZoneList, error) { // ], // "parameters": { // "filter": { - // "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + // "description": "Sets a filter {expression} for filtering listed resources. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", // "location": "query", // "type": "string" // }, diff --git a/vendor/google.golang.org/api/container/v1/container-api.json b/vendor/google.golang.org/api/container/v1/container-api.json index f19daf840bff8..e9151bb696b3f 100644 --- a/vendor/google.golang.org/api/container/v1/container-api.json +++ b/vendor/google.golang.org/api/container/v1/container-api.json @@ -1,20 +1,823 @@ { + "basePath": "", + "ownerDomain": "google.com", + "name": "container", + "batchPath": "batch", + "revision": "20170720", + "documentationLink": "https://cloud.google.com/container-engine/", + "id": "container:v1", + "title": "Google Container Engine API", + "ownerName": "Google", + "discoveryVersion": "v1", "resources": { "projects": { "resources": { "zones": { + "methods": { + "getServerconfig": { + "flatPath": "v1/projects/{projectId}/zones/{zone}/serverconfig", + "path": "v1/projects/{projectId}/zones/{zone}/serverconfig", + "id": "container.projects.zones.getServerconfig", + "description": "Returns configuration info about the Container Engine service.", + "httpMethod": "GET", + "parameterOrder": [ + "projectId", + "zone" + ], + "response": { + "$ref": "ServerConfig" + }, + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "description": "The name of the Google Compute Engine [zone](/compute/docs/zones#available)\nto return operations for.", + "type": "string", + "required": true, + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ] + } + }, "resources": { "clusters": { + "methods": { + "locations": { + "request": { + "$ref": "SetLocationsRequest" + }, + "description": "Sets the locations of a specific cluster.", + "httpMethod": "POST", + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "description": "The name of the cluster to upgrade.", + "type": "string", + "required": true, + "location": "path" + } + }, + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/locations", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/locations", + "id": "container.projects.zones.clusters.locations" + }, + "update": { + "response": { + "$ref": "Operation" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "PUT", + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "location": "path", + "description": "The name of the cluster to upgrade.", + "type": "string", + "required": true + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", + "id": "container.projects.zones.clusters.update", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", + "description": "Updates the settings of a specific cluster.", + "request": { + "$ref": "UpdateClusterRequest" + } + }, + "monitoring": { + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/monitoring", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/monitoring", + "id": "container.projects.zones.clusters.monitoring", + "description": "Sets the monitoring service of a specific cluster.", + "request": { + "$ref": "SetMonitoringServiceRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "response": { + "$ref": "Operation" + }, + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "description": "The name of the cluster to upgrade.", + "type": "string", + "required": true, + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ] + }, + "master": { + "httpMethod": "POST", + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "response": { + "$ref": "Operation" + }, + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "location": "path", + "description": "The name of the cluster to upgrade.", + "type": "string", + "required": true + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/master", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/master", + "id": "container.projects.zones.clusters.master", + "description": "Updates the master of a specific cluster.", + "request": { + "$ref": "UpdateMasterRequest" + } + }, + "setMasterAuth": { + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth", + "id": "container.projects.zones.clusters.setMasterAuth", + "request": { + "$ref": "SetMasterAuthRequest" + }, + "description": "Used to set master auth materials. Currently supports :-\nChanging the admin password of a specific cluster.\nThis can be either via password generation or explicitly set the password.", + "httpMethod": "POST", + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "location": "path", + "description": "The name of the cluster to upgrade.", + "type": "string", + "required": true + } + } + }, + "logging": { + "request": { + "$ref": "SetLoggingServiceRequest" + }, + "description": "Sets the logging service of a specific cluster.", + "response": { + "$ref": "Operation" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true + }, + "zone": { + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true, + "location": "path" + }, + "clusterId": { + "description": "The name of the cluster to upgrade.", + "type": "string", + "required": true, + "location": "path" + } + }, + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/logging", + "id": "container.projects.zones.clusters.logging", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/logging" + }, + "list": { + "response": { + "$ref": "ListClustersResponse" + }, + "parameterOrder": [ + "projectId", + "zone" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true + }, + "zone": { + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides, or \"-\" for all zones.", + "type": "string", + "required": true, + "location": "path" + } + }, + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters", + "id": "container.projects.zones.clusters.list", + "path": "v1/projects/{projectId}/zones/{zone}/clusters", + "description": "Lists all clusters owned by a project in either the specified zone or all\nzones." + }, + "create": { + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters", + "path": "v1/projects/{projectId}/zones/{zone}/clusters", + "id": "container.projects.zones.clusters.create", + "description": "Creates a cluster, consisting of the specified number and type of Google\nCompute Engine instances.\n\nBy default, the cluster is created in the project's\n[default network](/compute/docs/networks-and-firewalls#networks).\n\nOne firewall is added for the cluster. After cluster creation,\nthe cluster creates routes for each node to allow the containers\non that node to communicate with all other instances in the\ncluster.\n\nFinally, an entry is added to the project's global metadata indicating\nwhich CIDR range is being used by the cluster.", + "request": { + "$ref": "CreateClusterRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "projectId", + "zone" + ], + "response": { + "$ref": "Operation" + }, + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true + }, + "zone": { + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true, + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ] + }, + "resourceLabels": { + "description": "Sets labels on a cluster.", + "request": { + "$ref": "SetLabelsRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "response": { + "$ref": "Operation" + }, + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "description": "The name of the cluster.", + "type": "string", + "required": true, + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels", + "id": "container.projects.zones.clusters.resourceLabels" + }, + "completeIpRotation": { + "request": { + "$ref": "CompleteIPRotationRequest" + }, + "description": "Completes master IP rotation.", + "response": { + "$ref": "Operation" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + "type": "string", + "required": true + }, + "zone": { + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true, + "location": "path" + }, + "clusterId": { + "description": "The name of the cluster.", + "type": "string", + "required": true, + "location": "path" + } + }, + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation", + "id": "container.projects.zones.clusters.completeIpRotation", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation" + }, + "get": { + "description": "Gets the details of a specific cluster.", + "response": { + "$ref": "Cluster" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "location": "path", + "description": "The name of the cluster to retrieve.", + "type": "string", + "required": true + } + }, + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", + "id": "container.projects.zones.clusters.get", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}" + }, + "legacyAbac": { + "response": { + "$ref": "Operation" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "POST", + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true, + "location": "path" + }, + "clusterId": { + "description": "The name of the cluster to update.", + "type": "string", + "required": true, + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/legacyAbac", + "id": "container.projects.zones.clusters.legacyAbac", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/legacyAbac", + "description": "Enables or disables the ABAC authorization mechanism on a cluster.", + "request": { + "$ref": "SetLegacyAbacRequest" + } + }, + "setNetworkPolicy": { + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setNetworkPolicy", + "id": "container.projects.zones.clusters.setNetworkPolicy", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setNetworkPolicy", + "request": { + "$ref": "SetNetworkPolicyRequest" + }, + "description": "Enables/Disables Network Policy for a cluster.", + "response": { + "$ref": "Operation" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + "type": "string", + "required": true + }, + "zone": { + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true, + "location": "path" + }, + "clusterId": { + "location": "path", + "description": "The name of the cluster.", + "type": "string", + "required": true + } + } + }, + "startIpRotation": { + "request": { + "$ref": "StartIPRotationRequest" + }, + "description": "Start master IP rotation.", + "response": { + "$ref": "Operation" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + "type": "string", + "required": true + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "location": "path", + "description": "The name of the cluster.", + "type": "string", + "required": true + } + }, + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation", + "id": "container.projects.zones.clusters.startIpRotation", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation" + }, + "addons": { + "response": { + "$ref": "Operation" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "POST", + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "description": "The name of the cluster to upgrade.", + "type": "string", + "required": true, + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/addons", + "id": "container.projects.zones.clusters.addons", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/addons", + "description": "Sets the addons of a specific cluster.", + "request": { + "$ref": "SetAddonsConfigRequest" + } + }, + "delete": { + "description": "Deletes the cluster, including the Kubernetes endpoint and all worker\nnodes.\n\nFirewalls and routes that were configured during cluster creation\nare also deleted.\n\nOther Google Compute Engine resources that might be in use by the cluster\n(e.g. load balancer resources) will not be deleted if they weren't present\nat the initial create time.", + "response": { + "$ref": "Operation" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "DELETE", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true + }, + "zone": { + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true, + "location": "path" + }, + "clusterId": { + "location": "path", + "description": "The name of the cluster to delete.", + "type": "string", + "required": true + } + }, + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", + "id": "container.projects.zones.clusters.delete", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}" + } + }, "resources": { "nodePools": { "methods": { - "setManagement": { - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement", - "id": "container.projects.zones.clusters.nodePools.setManagement", - "description": "Sets the NodeManagement options for a node pool.", + "list": { + "description": "Lists the node pools for a cluster.", + "httpMethod": "GET", + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "response": { + "$ref": "ListNodePoolsResponse" + }, + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + "type": "string", + "required": true + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "location": "path", + "description": "The name of the cluster.", + "type": "string", + "required": true + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + "id": "container.projects.zones.clusters.nodePools.list" + }, + "rollback": { + "description": "Roll back the previously Aborted or Failed NodePool upgrade.\nThis will be an no-op if the last upgrade successfully completed.", "request": { - "$ref": "SetNodePoolManagementRequest" + "$ref": "RollbackNodePoolUpgradeRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "projectId", + "zone", + "clusterId", + "nodePoolId" + ], + "response": { + "$ref": "Operation" + }, + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "description": "The name of the cluster to rollback.", + "type": "string", + "required": true, + "location": "path" + }, + "nodePoolId": { + "description": "The name of the node pool to rollback.", + "type": "string", + "required": true, + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback", + "id": "container.projects.zones.clusters.nodePools.rollback" + }, + "create": { + "description": "Creates a node pool for a cluster.", + "request": { + "$ref": "CreateNodePoolRequest" + }, + "response": { + "$ref": "Operation" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId" + ], + "httpMethod": "POST", + "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + "type": "string", + "required": true + }, + "zone": { + "location": "path", + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string", + "required": true + }, + "clusterId": { + "location": "path", + "description": "The name of the cluster.", + "type": "string", + "required": true + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + "id": "container.projects.zones.clusters.nodePools.create", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools" + }, + "autoscaling": { + "request": { + "$ref": "SetNodePoolAutoscalingRequest" }, + "description": "Sets the autoscaling settings of a specific node pool.", "response": { "$ref": "Operation" }, @@ -29,35 +832,81 @@ "https://www.googleapis.com/auth/cloud-platform" ], "parameters": { + "nodePoolId": { + "description": "The name of the node pool to upgrade.", + "type": "string", + "required": true, + "location": "path" + }, + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true + }, "zone": { "location": "path", "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string" + "type": "string", + "required": true }, "clusterId": { - "description": "The name of the cluster to update.", + "description": "The name of the cluster to upgrade.", + "type": "string", "required": true, + "location": "path" + } + }, + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/autoscaling", + "id": "container.projects.zones.clusters.nodePools.autoscaling", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/autoscaling" + }, + "get": { + "response": { + "$ref": "NodePool" + }, + "parameterOrder": [ + "projectId", + "zone", + "clusterId", + "nodePoolId" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" + ], + "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", "type": "string", + "required": true, "location": "path" }, - "nodePoolId": { - "description": "The name of the node pool to update.", - "required": true, + "zone": { + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", "type": "string", + "required": true, "location": "path" }, - "projectId": { - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, + "clusterId": { + "description": "The name of the cluster.", "type": "string", + "required": true, "location": "path" + }, + "nodePoolId": { + "location": "path", + "description": "The name of the node pool.", + "type": "string", + "required": true } }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement" + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + "id": "container.projects.zones.clusters.nodePools.get", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + "description": "Retrieves the node pool requested." }, - "delete": { - "httpMethod": "DELETE", + "update": { "response": { "$ref": "Operation" }, @@ -67,79 +916,94 @@ "clusterId", "nodePoolId" ], + "httpMethod": "POST", "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], "parameters": { + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true, + "location": "path" + }, "zone": { "location": "path", "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string" + "type": "string", + "required": true }, "clusterId": { "location": "path", - "description": "The name of the cluster.", - "required": true, - "type": "string" + "description": "The name of the cluster to upgrade.", + "type": "string", + "required": true }, "nodePoolId": { "location": "path", - "description": "The name of the node pool to delete.", - "required": true, - "type": "string" - }, - "projectId": { - "location": "path", - "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", - "required": true, - "type": "string" + "description": "The name of the node pool to upgrade.", + "type": "string", + "required": true } }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", - "id": "container.projects.zones.clusters.nodePools.delete", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", - "description": "Deletes a node pool from a cluster." + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/update", + "id": "container.projects.zones.clusters.nodePools.update", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/update", + "request": { + "$ref": "UpdateNodePoolRequest" + }, + "description": "Updates the version and/or image type of a specific node pool." }, - "list": { - "description": "Lists the node pools for a cluster.", - "httpMethod": "GET", + "delete": { "response": { - "$ref": "ListNodePoolsResponse" + "$ref": "Operation" }, "parameterOrder": [ "projectId", "zone", - "clusterId" + "clusterId", + "nodePoolId" ], + "httpMethod": "DELETE", "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], "parameters": { + "nodePoolId": { + "description": "The name of the node pool to delete.", + "type": "string", + "required": true, + "location": "path" + }, "projectId": { "location": "path", "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", - "required": true, - "type": "string" + "type": "string", + "required": true }, "zone": { "location": "path", "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string" + "type": "string", + "required": true }, "clusterId": { "location": "path", "description": "The name of the cluster.", - "required": true, - "type": "string" + "type": "string", + "required": true } }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", - "id": "container.projects.zones.clusters.nodePools.list", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools" + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + "id": "container.projects.zones.clusters.nodePools.delete", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + "description": "Deletes a node pool from a cluster." }, - "rollback": { + "setManagement": { + "description": "Sets the NodeManagement options for a node pool.", + "request": { + "$ref": "SetNodePoolManagementRequest" + }, "response": { "$ref": "Operation" }, @@ -151,54 +1015,49 @@ ], "httpMethod": "POST", "parameters": { + "projectId": { + "location": "path", + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", + "required": true + }, "zone": { "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, "type": "string", + "required": true, "location": "path" }, "clusterId": { - "description": "The name of the cluster to rollback.", - "required": true, + "description": "The name of the cluster to update.", "type": "string", + "required": true, "location": "path" }, "nodePoolId": { - "location": "path", - "description": "The name of the node pool to rollback.", - "required": true, - "type": "string" - }, - "projectId": { - "location": "path", - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "description": "The name of the node pool to update.", + "type": "string", "required": true, - "type": "string" + "location": "path" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback", - "id": "container.projects.zones.clusters.nodePools.rollback", - "request": { - "$ref": "RollbackNodePoolUpgradeRequest" - }, - "description": "Roll back the previously Aborted or Failed NodePool upgrade.\nThis will be an no-op if the last upgrade successfully completed." + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement", + "id": "container.projects.zones.clusters.nodePools.setManagement", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement" }, - "create": { - "id": "container.projects.zones.clusters.nodePools.create", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", - "description": "Creates a node pool for a cluster.", + "setSize": { "request": { - "$ref": "CreateNodePoolRequest" + "$ref": "SetNodePoolSizeRequest" }, + "description": "Sets the size of a specific node pool.", "httpMethod": "POST", "parameterOrder": [ "projectId", "zone", - "clusterId" + "clusterId", + "nodePoolId" ], "response": { "$ref": "Operation" @@ -207,674 +1066,184 @@ "https://www.googleapis.com/auth/cloud-platform" ], "parameters": { - "projectId": { - "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", - "required": true, + "nodePoolId": { + "location": "path", + "description": "The name of the node pool to update.", "type": "string", - "location": "path" + "required": true }, - "zone": { - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, + "projectId": { + "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", "type": "string", - "location": "path" - }, - "clusterId": { - "description": "The name of the cluster.", "required": true, - "type": "string", "location": "path" - } - }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools" - }, - "get": { - "response": { - "$ref": "NodePool" - }, - "parameterOrder": [ - "projectId", - "zone", - "clusterId", - "nodePoolId" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { + }, "zone": { "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string", - "location": "path" - }, - "clusterId": { - "description": "The name of the cluster.", - "required": true, "type": "string", - "location": "path" - }, - "nodePoolId": { - "description": "The name of the node pool.", "required": true, - "type": "string", "location": "path" }, - "projectId": { + "clusterId": { "location": "path", - "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", - "required": true, - "type": "string" + "description": "The name of the cluster to update.", + "type": "string", + "required": true } }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", - "id": "container.projects.zones.clusters.nodePools.get", - "description": "Retrieves the node pool requested." + "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setSize", + "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setSize", + "id": "container.projects.zones.clusters.nodePools.setSize" } } } - }, + } + }, + "operations": { "methods": { - "resourceLabels": { - "response": { - "$ref": "Operation" - }, - "parameterOrder": [ - "projectId", - "zone", - "clusterId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "projectId": { - "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", - "required": true, - "type": "string", - "location": "path" - }, - "zone": { - "location": "path", - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string" - }, - "clusterId": { - "location": "path", - "description": "The name of the cluster.", - "required": true, - "type": "string" - } - }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels", - "id": "container.projects.zones.clusters.resourceLabels", - "description": "Sets labels on a cluster.", - "request": { - "$ref": "SetLabelsRequest" - } - }, - "create": { - "description": "Creates a cluster, consisting of the specified number and type of Google\nCompute Engine instances.\n\nBy default, the cluster is created in the project's\n[default network](/compute/docs/networks-and-firewalls#networks).\n\nOne firewall is added for the cluster. After cluster creation,\nthe cluster creates routes for each node to allow the containers\non that node to communicate with all other instances in the\ncluster.\n\nFinally, an entry is added to the project's global metadata indicating\nwhich CIDR range is being used by the cluster.", - "request": { - "$ref": "CreateClusterRequest" - }, - "httpMethod": "POST", - "parameterOrder": [ - "projectId", - "zone" - ], - "response": { - "$ref": "Operation" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "projectId": { - "location": "path", - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, - "type": "string" - }, - "zone": { - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string", - "location": "path" - } - }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters", - "id": "container.projects.zones.clusters.create", - "path": "v1/projects/{projectId}/zones/{zone}/clusters" - }, - "completeIpRotation": { - "response": { - "$ref": "Operation" - }, - "parameterOrder": [ - "projectId", - "zone", - "clusterId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "zone": { - "location": "path", - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string" - }, - "clusterId": { - "description": "The name of the cluster.", - "required": true, - "type": "string", - "location": "path" - }, - "projectId": { - "location": "path", - "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", - "required": true, - "type": "string" - } - }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation", - "id": "container.projects.zones.clusters.completeIpRotation", - "description": "Completes master IP rotation.", - "request": { - "$ref": "CompleteIPRotationRequest" - } - }, - "get": { - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", - "id": "container.projects.zones.clusters.get", - "description": "Gets the details of a specific cluster.", - "response": { - "$ref": "Cluster" - }, - "parameterOrder": [ - "projectId", - "zone", - "clusterId" - ], - "httpMethod": "GET", - "parameters": { - "projectId": { - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, - "type": "string", - "location": "path" - }, - "zone": { - "location": "path", - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string" - }, - "clusterId": { - "description": "The name of the cluster to retrieve.", - "required": true, - "type": "string", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}" - }, - "legacyAbac": { + "cancel": { + "description": "Cancels the specified operation.", "request": { - "$ref": "SetLegacyAbacRequest" + "$ref": "CancelOperationRequest" }, - "description": "Enables or disables the ABAC authorization mechanism on a cluster.", "response": { - "$ref": "Operation" + "$ref": "Empty" }, "parameterOrder": [ "projectId", "zone", - "clusterId" + "operationId" ], "httpMethod": "POST", "parameters": { + "operationId": { + "description": "The server-assigned `name` of the operation.", + "type": "string", + "required": true, + "location": "path" + }, "projectId": { "location": "path", "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, - "type": "string" + "type": "string", + "required": true }, "zone": { - "location": "path", - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string" - }, - "clusterId": { - "description": "The name of the cluster to update.", - "required": true, + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the operation resides.", "type": "string", + "required": true, "location": "path" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/legacyAbac", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/legacyAbac", - "id": "container.projects.zones.clusters.legacyAbac" + "flatPath": "v1/projects/{projectId}/zones/{zone}/operations/{operationId}:cancel", + "id": "container.projects.zones.operations.cancel", + "path": "v1/projects/{projectId}/zones/{zone}/operations/{operationId}:cancel" }, - "update": { + "get": { + "description": "Gets the specified operation.", "response": { "$ref": "Operation" }, "parameterOrder": [ "projectId", "zone", - "clusterId" + "operationId" ], - "httpMethod": "PUT", + "httpMethod": "GET", "parameters": { - "zone": { + "operationId": { "location": "path", - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string" - }, - "clusterId": { - "description": "The name of the cluster to upgrade.", - "required": true, + "description": "The server-assigned `name` of the operation.", "type": "string", - "location": "path" + "required": true }, "projectId": { "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, - "type": "string", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", - "id": "container.projects.zones.clusters.update", - "request": { - "$ref": "UpdateClusterRequest" - }, - "description": "Updates the settings of a specific cluster." - }, - "startIpRotation": { - "description": "Start master IP rotation.", - "request": { - "$ref": "StartIPRotationRequest" - }, - "response": { - "$ref": "Operation" - }, - "parameterOrder": [ - "projectId", - "zone", - "clusterId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "zone": { - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, "type": "string", - "location": "path" - }, - "clusterId": { - "location": "path", - "description": "The name of the cluster.", - "required": true, - "type": "string" - }, - "projectId": { - "location": "path", - "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", - "required": true, - "type": "string" - } - }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation", - "id": "container.projects.zones.clusters.startIpRotation" - }, - "setMasterAuth": { - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth", - "id": "container.projects.zones.clusters.setMasterAuth", - "description": "Used to set master auth materials. Currently supports :-\nChanging the admin password of a specific cluster.\nThis can be either via password generation or explicitly set the password.", - "request": { - "$ref": "SetMasterAuthRequest" - }, - "response": { - "$ref": "Operation" - }, - "parameterOrder": [ - "projectId", - "zone", - "clusterId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "projectId": { - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", "required": true, - "type": "string", "location": "path" }, "zone": { "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, "type": "string", - "location": "path" - }, - "clusterId": { - "location": "path", - "description": "The name of the cluster to upgrade.", - "required": true, - "type": "string" - } - }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth" - }, - "delete": { - "response": { - "$ref": "Operation" - }, - "parameterOrder": [ - "projectId", - "zone", - "clusterId" - ], - "httpMethod": "DELETE", - "parameters": { - "zone": { - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", "required": true, - "type": "string", "location": "path" - }, - "clusterId": { - "location": "path", - "description": "The name of the cluster to delete.", - "required": true, - "type": "string" - }, - "projectId": { - "location": "path", - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, - "type": "string" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform" ], - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", - "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", - "id": "container.projects.zones.clusters.delete", - "description": "Deletes the cluster, including the Kubernetes endpoint and all worker\nnodes.\n\nFirewalls and routes that were configured during cluster creation\nare also deleted.\n\nOther Google Compute Engine resources that might be in use by the cluster\n(e.g. load balancer resources) will not be deleted if they weren't present\nat the initial create time." + "flatPath": "v1/projects/{projectId}/zones/{zone}/operations/{operationId}", + "id": "container.projects.zones.operations.get", + "path": "v1/projects/{projectId}/zones/{zone}/operations/{operationId}" }, "list": { - "parameterOrder": [ - "projectId", - "zone" - ], "httpMethod": "GET", - "response": { - "$ref": "ListClustersResponse" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "projectId": { - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, - "type": "string", - "location": "path" - }, - "zone": { - "location": "path", - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides, or \"-\" for all zones.", - "required": true, - "type": "string" - } - }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters", - "path": "v1/projects/{projectId}/zones/{zone}/clusters", - "id": "container.projects.zones.clusters.list", - "description": "Lists all clusters owned by a project in either the specified zone or all\nzones." - } - } - }, - "operations": { - "methods": { - "cancel": { - "path": "v1/projects/{projectId}/zones/{zone}/operations/{operationId}:cancel", - "id": "container.projects.zones.operations.cancel", - "description": "Cancels the specified operation.", - "request": { - "$ref": "CancelOperationRequest" - }, - "response": { - "$ref": "Empty" - }, - "parameterOrder": [ - "projectId", - "zone", - "operationId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "zone": { - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the operation resides.", - "required": true, - "type": "string", - "location": "path" - }, - "operationId": { - "description": "The server-assigned `name` of the operation.", - "required": true, - "type": "string", - "location": "path" - }, - "projectId": { - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, - "type": "string", - "location": "path" - } - }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/operations/{operationId}:cancel" - }, - "list": { - "description": "Lists all operations in a project in a specific zone or all zones.", - "response": { - "$ref": "ListOperationsResponse" - }, "parameterOrder": [ "projectId", "zone" ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "parameters": { - "projectId": { - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, - "type": "string", - "location": "path" - }, - "zone": { - "location": "path", - "description": "The name of the Google Compute Engine [zone](/compute/docs/zones#available)\nto return operations for, or `-` for all zones.", - "required": true, - "type": "string" - } - }, - "flatPath": "v1/projects/{projectId}/zones/{zone}/operations", - "path": "v1/projects/{projectId}/zones/{zone}/operations", - "id": "container.projects.zones.operations.list" - }, - "get": { "response": { - "$ref": "Operation" + "$ref": "ListOperationsResponse" }, - "parameterOrder": [ - "projectId", - "zone", - "operationId" + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform" ], - "httpMethod": "GET", "parameters": { - "operationId": { - "description": "The server-assigned `name` of the operation.", - "required": true, - "type": "string", - "location": "path" - }, "projectId": { - "location": "path", "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + "type": "string", "required": true, - "type": "string" + "location": "path" }, "zone": { "location": "path", - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "required": true, - "type": "string" + "description": "The name of the Google Compute Engine [zone](/compute/docs/zones#available)\nto return operations for, or `-` for all zones.", + "type": "string", + "required": true } }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectId}/zones/{zone}/operations/{operationId}", - "path": "v1/projects/{projectId}/zones/{zone}/operations/{operationId}", - "id": "container.projects.zones.operations.get", - "description": "Gets the specified operation." + "flatPath": "v1/projects/{projectId}/zones/{zone}/operations", + "path": "v1/projects/{projectId}/zones/{zone}/operations", + "id": "container.projects.zones.operations.list", + "description": "Lists all operations in a project in a specific zone or all zones." } } } - }, - "methods": { - "getServerconfig": { - "description": "Returns configuration info about the Container Engine service.", - "response": { - "$ref": "ServerConfig" - }, - "parameterOrder": [ - "projectId", - "zone" - ], - "httpMethod": "GET", - "parameters": { - "projectId": { - "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", - "required": true, - "type": "string", - "location": "path" - }, - "zone": { - "location": "path", - "description": "The name of the Google Compute Engine [zone](/compute/docs/zones#available)\nto return operations for.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform" - ], - "flatPath": "v1/projects/{projectId}/zones/{zone}/serverconfig", - "id": "container.projects.zones.getServerconfig", - "path": "v1/projects/{projectId}/zones/{zone}/serverconfig" - } } } } } }, "parameters": { - "alt": { - "enum": [ - "json", - "media", - "proto" - ], - "type": "string", - "enumDescriptions": [ - "Responses with Content-Type of application/json", - "Media download with context-dependent Content-Type", - "Responses with Content-Type of application/x-protobuf" - ], - "location": "query", - "description": "Data format for response.", - "default": "json" - }, - "key": { - "location": "query", - "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", - "type": "string" - }, - "access_token": { - "location": "query", - "description": "OAuth access token.", - "type": "string" - }, - "quotaUser": { - "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", - "type": "string", - "location": "query" - }, "pp": { - "location": "query", "description": "Pretty-print response.", + "default": "true", "type": "boolean", - "default": "true" - }, - "bearer_token": { - "description": "OAuth bearer token.", - "type": "string", "location": "query" }, "oauth_token": { + "location": "query", "description": "OAuth 2.0 token for the current user.", + "type": "string" + }, + "bearer_token": { + "description": "OAuth bearer token.", "type": "string", "location": "query" }, "upload_protocol": { - "location": "query", "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", - "type": "string" + "type": "string", + "location": "query" }, "prettyPrint": { "description": "Returns response with indentations and line breaks.", - "type": "boolean", "default": "true", + "type": "boolean", "location": "query" }, "uploadType": { @@ -893,795 +1262,1093 @@ "location": "query" }, "$.xgafv": { + "enumDescriptions": [ + "v1 error format", + "v2 error format" + ], + "location": "query", "enum": [ "1", "2" ], "description": "V1 error format.", - "type": "string", + "type": "string" + }, + "alt": { "enumDescriptions": [ - "v1 error format", - "v2 error format" + "Responses with Content-Type of application/json", + "Media download with context-dependent Content-Type", + "Responses with Content-Type of application/x-protobuf" + ], + "location": "query", + "description": "Data format for response.", + "default": "json", + "enum": [ + "json", + "media", + "proto" ], + "type": "string" + }, + "access_token": { + "location": "query", + "description": "OAuth access token.", + "type": "string" + }, + "key": { + "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", + "type": "string", + "location": "query" + }, + "quotaUser": { + "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", + "type": "string", "location": "query" } }, "schemas": { - "LegacyAbac": { - "description": "Configuration for the legacy Attribute Based Access Control authorization\nmode.", + "SetLocationsRequest": { + "description": "SetLocationsRequest sets the locations of the cluster.", + "type": "object", + "properties": { + "locations": { + "description": "The desired list of Google Compute Engine\n[locations](/compute/docs/zones#available) in which the cluster's nodes\nshould be located. Changing the locations a cluster is in will result\nin nodes being either created or removed from the cluster, depending on\nwhether locations are being added or removed.\n\nThis list must always include the cluster's primary zone.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "id": "SetLocationsRequest" + }, + "RollbackNodePoolUpgradeRequest": { + "description": "RollbackNodePoolUpgradeRequest rollbacks the previously Aborted or Failed\nNodePool upgrade. This will be an no-op if the last upgrade successfully\ncompleted.", + "type": "object", + "properties": {}, + "id": "RollbackNodePoolUpgradeRequest" + }, + "SetNodePoolSizeRequest": { + "description": "SetNodePoolSizeRequest sets the size a node\npool.", + "type": "object", + "properties": { + "nodeCount": { + "format": "int32", + "description": "The desired node count for the pool.", + "type": "integer" + } + }, + "id": "SetNodePoolSizeRequest" + }, + "UpdateClusterRequest": { + "description": "UpdateClusterRequest updates the settings of a cluster.", + "type": "object", + "properties": { + "update": { + "description": "A description of the update.", + "$ref": "ClusterUpdate" + } + }, + "id": "UpdateClusterRequest" + }, + "NetworkPolicy": { + "description": "Configuration options for the NetworkPolicy feature.\nhttps://kubernetes.io/docs/concepts/services-networking/networkpolicies/", "type": "object", "properties": { "enabled": { - "description": "Whether the ABAC authorizer is enabled for this cluster. When enabled,\nidentities in the system, including service accounts, nodes, and\ncontrollers, will have statically granted permissions beyond those\nprovided by the RBAC configuration or IAM.", + "description": "Whether network policy is enabled on the cluster.", "type": "boolean" + }, + "provider": { + "description": "The selected network policy provider.", + "type": "string", + "enumDescriptions": [ + "Not set", + "Tigera (Calico Felix)." + ], + "enum": [ + "PROVIDER_UNSPECIFIED", + "CALICO" + ] } }, - "id": "LegacyAbac" + "id": "NetworkPolicy" }, - "NodePool": { + "UpdateMasterRequest": { + "description": "UpdateMasterRequest updates the master of the cluster.", + "type": "object", + "properties": { + "masterVersion": { + "description": "The Kubernetes version to change the master to. The only valid value is the\nlatest supported version. Use \"-\" to have the server automatically select\nthe latest version.", + "type": "string" + } + }, + "id": "UpdateMasterRequest" + }, + "Cluster": { + "description": "A Google Container Engine cluster.", + "type": "object", "properties": { + "description": { + "description": "An optional description of this cluster.", + "type": "string" + }, + "currentNodeCount": { + "format": "int32", + "description": "[Output only] The number of nodes currently in the cluster.", + "type": "integer" + }, + "monitoringService": { + "description": "The monitoring service the cluster should use to write metrics.\nCurrently available options:\n\n* `monitoring.googleapis.com` - the Google Cloud Monitoring service.\n* `none` - no metrics will be exported from the cluster.\n* if left as an empty string, `monitoring.googleapis.com` will be used.", + "type": "string" + }, + "network": { + "description": "The name of the Google Compute Engine\n[network](/compute/docs/networks-and-firewalls#networks) to which the\ncluster is connected. If left unspecified, the `default` network\nwill be used.", + "type": "string" + }, + "labelFingerprint": { + "description": "The fingerprint of the set of labels for this cluster.", + "type": "string" + }, + "zone": { + "description": "[Output only] The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + "type": "string" + }, + "loggingService": { + "description": "The logging service the cluster should use to write logs.\nCurrently available options:\n\n* `logging.googleapis.com` - the Google Cloud Logging service.\n* `none` - no logs will be exported from the cluster.\n* if left as an empty string,`logging.googleapis.com` will be used.", + "type": "string" + }, + "nodeIpv4CidrSize": { + "format": "int32", + "description": "[Output only] The size of the address space on each node for hosting\ncontainers. This is provisioned from within the `container_ipv4_cidr`\nrange.", + "type": "integer" + }, + "expireTime": { + "description": "[Output only] The time the cluster will be automatically\ndeleted in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.", + "type": "string" + }, + "masterAuthorizedNetworksConfig": { + "$ref": "MasterAuthorizedNetworksConfig", + "description": "Master authorized networks is a Beta feature.\nThe configuration options for master authorized networks feature." + }, + "statusMessage": { + "description": "[Output only] Additional information about the current status of this\ncluster, if available.", + "type": "string" + }, + "masterAuth": { + "$ref": "MasterAuth", + "description": "The authentication information for accessing the master endpoint." + }, + "currentMasterVersion": { + "description": "[Output only] The current software version of the master endpoint.", + "type": "string" + }, + "nodeConfig": { + "$ref": "NodeConfig", + "description": "Parameters used in creating the cluster's nodes.\nSee `nodeConfig` for the description of its properties.\nFor requests, this field should only be used in lieu of a\n\"node_pool\" object, since this configuration (along with the\n\"initial_node_count\") will be used to create a \"NodePool\" object with an\nauto-generated name. Do not use this and a node_pool at the same time.\nFor responses, this field will be populated with the node configuration of\nthe first node pool.\n\nIf unspecified, the defaults are used." + }, + "addonsConfig": { + "description": "Configurations for the various addons available to run in the cluster.", + "$ref": "AddonsConfig" + }, "status": { "enumDescriptions": [ "Not set.", - "The PROVISIONING state indicates the node pool is being created.", - "The RUNNING state indicates the node pool has been created\nand is fully usable.", - "The RUNNING_WITH_ERROR state indicates the node pool has been created\nand is partially usable. Some error state has occurred and some\nfunctionality may be impaired. Customer may need to reissue a request\nor trigger a new update.", - "The RECONCILING state indicates that some work is actively being done on\nthe node pool, such as upgrading node software. Details can\nbe found in the `statusMessage` field.", - "The STOPPING state indicates the node pool is being deleted.", - "The ERROR state indicates the node pool may be unusable. Details\ncan be found in the `statusMessage` field." + "The PROVISIONING state indicates the cluster is being created.", + "The RUNNING state indicates the cluster has been created and is fully\nusable.", + "The RECONCILING state indicates that some work is actively being done on\nthe cluster, such as upgrading the master or node software. Details can\nbe found in the `statusMessage` field.", + "The STOPPING state indicates the cluster is being deleted.", + "The ERROR state indicates the cluster may be unusable. Details\ncan be found in the `statusMessage` field." ], "enum": [ "STATUS_UNSPECIFIED", "PROVISIONING", "RUNNING", - "RUNNING_WITH_ERROR", "RECONCILING", "STOPPING", "ERROR" ], - "description": "[Output only] The status of the nodes in this pool instance.", + "description": "[Output only] The current status of this cluster.", "type": "string" }, - "config": { - "description": "The node configuration of the pool.", - "$ref": "NodeConfig" + "subnetwork": { + "description": "The name of the Google Compute Engine\n[subnetwork](/compute/docs/subnetworks) to which the\ncluster is connected.", + "type": "string" }, - "statusMessage": { - "description": "[Output only] Additional information about the current status of this\nnode pool instance, if available.", + "currentNodeVersion": { + "description": "[Output only] The current version of the node software components.\nIf they are currently at multiple versions because they're in the process\nof being upgraded, this reflects the minimum version of all nodes.", "type": "string" }, + "resourceLabels": { + "description": "The resource labels for the cluster to use to annotate any related\nGoogle Compute Engine resources.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, "name": { - "description": "The name of the node pool.", + "description": "The name of this cluster. The name must be unique within this project\nand zone, and can be up to 40 characters with the following restrictions:\n\n* Lowercase letters, numbers, and hyphens only.\n* Must start with a letter.\n* Must end with a number or a letter.", "type": "string" }, - "autoscaling": { - "description": "Autoscaler configuration for this NodePool. Autoscaler is enabled\nonly if a valid configuration is present.", - "$ref": "NodePoolAutoscaling" + "initialClusterVersion": { + "description": "The initial Kubernetes version for this cluster. Valid versions are those\nfound in validMasterVersions returned by getServerConfig. The version can\nbe upgraded over time; such upgrades are reflected in\ncurrentMasterVersion and currentNodeVersion.", + "type": "string" + }, + "ipAllocationPolicy": { + "$ref": "IPAllocationPolicy", + "description": "Configuration for cluster IP allocation." + }, + "endpoint": { + "description": "[Output only] The IP address of this cluster's master endpoint.\nThe endpoint can be accessed from the internet at\n`https://username:password@endpoint/`.\n\nSee the `masterAuth` property of this resource for username and\npassword information.", + "type": "string" + }, + "legacyAbac": { + "description": "Configuration for the legacy ABAC authorization mode.", + "$ref": "LegacyAbac" + }, + "createTime": { + "description": "[Output only] The time the cluster was created, in\n[RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.", + "type": "string" + }, + "clusterIpv4Cidr": { + "description": "The IP address range of the container pods in this cluster, in\n[CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)\nnotation (e.g. `10.96.0.0/14`). Leave blank to have\none automatically chosen or specify a `/14` block in `10.0.0.0/8`.", + "type": "string" }, "initialNodeCount": { - "description": "The initial node count for the pool. You must ensure that your\nCompute Engine \u003ca href=\"/compute/docs/resource-quotas\"\u003eresource quota\u003c/a\u003e\nis sufficient for this number of instances. You must also have available\nfirewall and routes quota.", "format": "int32", + "description": "The number of nodes to create in this cluster. You must ensure that your\nCompute Engine \u003ca href=\"/compute/docs/resource-quotas\"\u003eresource quota\u003c/a\u003e\nis sufficient for this number of instances. You must also have available\nfirewall and routes quota.\nFor requests, this field should only be used in lieu of a\n\"node_pool\" object, since this configuration (along with the\n\"node_config\") will be used to create a \"NodePool\" object with an\nauto-generated name. Do not use this and a node_pool at the same time.", "type": "integer" }, - "management": { - "description": "NodeManagement configuration for this NodePool.", - "$ref": "NodeManagement" - }, "selfLink": { "description": "[Output only] Server-defined URL for the resource.", "type": "string" }, - "version": { - "description": "[Output only] The version of the Kubernetes of this node.", - "type": "string" + "locations": { + "description": "The list of Google Compute Engine\n[locations](/compute/docs/zones#available) in which the cluster's nodes\nshould be located.", + "items": { + "type": "string" + }, + "type": "array" + }, + "nodePools": { + "description": "The node pools associated with this cluster.\nThis field should not be set if \"node_config\" or \"initial_node_count\" are\nspecified.", + "items": { + "$ref": "NodePool" + }, + "type": "array" }, "instanceGroupUrls": { - "description": "[Output only] The resource URLs of [instance\ngroups](/compute/docs/instance-groups/) associated with this\nnode pool.", - "type": "array", + "description": "[Output only] The resource URLs of [instance\ngroups](/compute/docs/instance-groups/) associated with this\ncluster.", "items": { "type": "string" - } + }, + "type": "array" + }, + "servicesIpv4Cidr": { + "description": "[Output only] The IP address range of the Kubernetes services in\nthis cluster, in\n[CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)\nnotation (e.g. `1.2.3.4/29`). Service addresses are\ntypically put in the last `/16` from the container CIDR.", + "type": "string" + }, + "networkPolicy": { + "$ref": "NetworkPolicy", + "description": "Configuration options for the NetworkPolicy feature." + }, + "enableKubernetesAlpha": { + "description": "Kubernetes alpha features are enabled on this cluster. This includes alpha\nAPI groups (e.g. v1alpha1) and features that may not be production ready in\nthe kubernetes version of the master and nodes.\nThe cluster has no SLA for uptime and master/node upgrades are disabled.\nAlpha enabled clusters are automatically deleted thirty days after\ncreation.", + "type": "boolean" } }, - "id": "NodePool", - "description": "NodePool contains the name and configuration for a cluster's node pool.\nNode pools are a set of nodes (i.e. VM's), with a common configuration and\nspecification, under the control of the cluster master. They may have a set\nof Kubernetes labels applied to them, which may be used to reference them\nduring pod scheduling. They may also be resized up or down, to accommodate\nthe workload.", - "type": "object" + "id": "Cluster" }, - "SetLabelsRequest": { + "CreateNodePoolRequest": { + "description": "CreateNodePoolRequest creates a node pool for a cluster.", + "type": "object", "properties": { - "resourceLabels": { - "additionalProperties": { - "type": "string" + "nodePool": { + "description": "The node pool to create.", + "$ref": "NodePool" + } + }, + "id": "CreateNodePoolRequest" + }, + "ListOperationsResponse": { + "description": "ListOperationsResponse is the result of ListOperationsRequest.", + "type": "object", + "properties": { + "operations": { + "description": "A list of operations in the project in the specified zone.", + "items": { + "$ref": "Operation" }, - "description": "The labels to set for that cluster.", - "type": "object" + "type": "array" }, - "labelFingerprint": { - "description": "The fingerprint of the previous set of labels for this resource,\nused to detect conflicts. The fingerprint is initially generated by\nContainer Engine and changes after every request to modify or update\nlabels. You must always provide an up-to-date fingerprint hash when\nupdating or changing labels. Make a \u003ccode\u003eget()\u003c/code\u003e request to the\nresource to get the latest fingerprint.", + "missingZones": { + "description": "If any zones are listed here, the list of operations returned\nmay be missing the operations from those zones.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "id": "ListOperationsResponse" + }, + "SetMonitoringServiceRequest": { + "description": "SetMonitoringServiceRequest sets the monitoring service of a cluster.", + "type": "object", + "properties": { + "monitoringService": { + "description": "The monitoring service the cluster should use to write metrics.\nCurrently available options:\n\n* \"monitoring.googleapis.com\" - the Google Cloud Monitoring service\n* \"none\" - no metrics will be exported from the cluster", "type": "string" } }, - "id": "SetLabelsRequest", - "description": "SetLabelsRequest sets the Google Cloud Platform labels on a Google Container\nEngine cluster, which will in turn set them for Google Compute Engine\nresources used by that cluster", - "type": "object" + "id": "SetMonitoringServiceRequest" }, - "NodeManagement": { - "description": "NodeManagement defines the set of node management services turned on for the\nnode pool.", + "CidrBlock": { + "description": "CidrBlock contains an optional name and one CIDR block.", "type": "object", "properties": { - "autoUpgrade": { - "description": "A flag that specifies whether node auto-upgrade is enabled for the node\npool. If enabled, node auto-upgrade helps keep the nodes in your node pool\nup to date with the latest release version of Kubernetes.", - "type": "boolean" - }, - "autoRepair": { - "description": "A flag that specifies whether the node auto-repair is enabled for the node\npool. If enabled, the nodes in this node pool will be monitored and, if\nthey fail health checks too many times, an automatic repair action will be\ntriggered.", - "type": "boolean" + "displayName": { + "description": "display_name is an optional field for users to identify CIDR blocks.", + "type": "string" }, - "upgradeOptions": { - "$ref": "AutoUpgradeOptions", - "description": "Specifies the Auto Upgrade knobs for the node pool." + "cidrBlock": { + "description": "cidr_block must be specified in CIDR notation.", + "type": "string" } }, - "id": "NodeManagement" - }, - "CancelOperationRequest": { - "properties": {}, - "id": "CancelOperationRequest", - "description": "CancelOperationRequest cancels a single operation.", - "type": "object" + "id": "CidrBlock" }, - "SetLegacyAbacRequest": { - "description": "SetLegacyAbacRequest enables or disables the ABAC authorization mechanism for\na cluster.", + "ServerConfig": { + "description": "Container Engine service configuration.", "type": "object", "properties": { - "enabled": { - "description": "Whether ABAC authorization will be enabled in the cluster.", - "type": "boolean" + "validMasterVersions": { + "description": "List of valid master versions.", + "items": { + "type": "string" + }, + "type": "array" + }, + "defaultImageType": { + "description": "Default image type.", + "type": "string" + }, + "defaultClusterVersion": { + "description": "Version of Kubernetes the service deploys by default.", + "type": "string" + }, + "validImageTypes": { + "description": "List of valid image types.", + "items": { + "type": "string" + }, + "type": "array" + }, + "validNodeVersions": { + "description": "List of valid node upgrade target versions.", + "items": { + "type": "string" + }, + "type": "array" } }, - "id": "SetLegacyAbacRequest" + "id": "ServerConfig" }, - "Operation": { - "description": "This operation resource represents operations that may have happened or are\nhappening on the cluster. All fields are output only.", + "MasterAuth": { + "description": "The authentication information for accessing the master endpoint.\nAuthentication can be done using HTTP basic auth or using client\ncertificates.", "type": "object", "properties": { - "name": { - "description": "The server-assigned ID for the operation.", + "clientKey": { + "description": "[Output only] Base64-encoded private key used by clients to authenticate\nto the cluster endpoint.", "type": "string" }, - "statusMessage": { - "description": "If an error has occurred, a textual description of the error.", + "clusterCaCertificate": { + "description": "[Output only] Base64-encoded public certificate that is the root of\ntrust for the cluster.", "type": "string" }, - "selfLink": { - "description": "Server-defined URL for the resource.", + "clientCertificate": { + "description": "[Output only] Base64-encoded public certificate used by clients to\nauthenticate to the cluster endpoint.", "type": "string" }, - "targetLink": { - "description": "Server-defined URL for the target of the operation.", + "username": { + "description": "The username to use for HTTP basic authentication to the master endpoint.\nFor clusters v1.6.0 and later, you can disable basic authentication by\nproviding an empty username.", "type": "string" }, - "detail": { - "description": "Detailed operation progress, if available.", + "password": { + "description": "The password to use for HTTP basic authentication to the master endpoint.\nBecause the master endpoint is open to the Internet, you should create a\nstrong password. If a password is provided for cluster creation, username\nmust be non-empty.", "type": "string" }, - "operationType": { - "enumDescriptions": [ - "Not set.", - "Cluster create.", - "Cluster delete.", - "A master upgrade.", - "A node upgrade.", - "Cluster repair.", - "Cluster update.", - "Node pool create.", - "Node pool delete.", - "Set node pool management.", - "Automatic node pool repair.", - "Automatic node upgrade.", - "Set labels.", - "Set/generate master auth materials" - ], - "enum": [ - "TYPE_UNSPECIFIED", - "CREATE_CLUSTER", - "DELETE_CLUSTER", - "UPGRADE_MASTER", - "UPGRADE_NODES", - "REPAIR_CLUSTER", - "UPDATE_CLUSTER", - "CREATE_NODE_POOL", - "DELETE_NODE_POOL", - "SET_NODE_POOL_MANAGEMENT", - "AUTO_REPAIR_NODES", - "AUTO_UPGRADE_NODES", - "SET_LABELS", - "SET_MASTER_AUTH" - ], - "description": "The operation type.", + "clientCertificateConfig": { + "description": "Configuration for client certificate authentication on the cluster. If no\nconfiguration is specified, a client certificate is issued.", + "$ref": "ClientCertificateConfig" + } + }, + "id": "MasterAuth" + }, + "NodeConfig": { + "description": "Parameters that describe the nodes in a cluster.", + "type": "object", + "properties": { + "imageType": { + "description": "The image type to use for this node. Note that for a given image type,\nthe latest version of it will be used.", + "type": "string" + }, + "oauthScopes": { + "description": "The set of Google API scopes to be made available on all of the\nnode VMs under the \"default\" service account.\n\nThe following scopes are recommended, but not required, and by default are\nnot included:\n\n* `https://www.googleapis.com/auth/compute` is required for mounting\npersistent storage on your nodes.\n* `https://www.googleapis.com/auth/devstorage.read_only` is required for\ncommunicating with **gcr.io**\n(the [Google Container Registry](/container-registry/)).\n\nIf unspecified, no scopes are added, unless Cloud Logging or Cloud\nMonitoring are enabled, in which case their required scopes will be added.", + "items": { + "type": "string" + }, + "type": "array" + }, + "preemptible": { + "description": "Whether the nodes are created as preemptible VM instances. See:\nhttps://cloud.google.com/compute/docs/instances/preemptible for more\ninformation about preemptible VM instances.", + "type": "boolean" + }, + "labels": { + "description": "The map of Kubernetes labels (key/value pairs) to be applied to each node.\nThese will added in addition to any default label(s) that\nKubernetes may apply to the node.\nIn case of conflict in label keys, the applied set may differ depending on\nthe Kubernetes version -- it's best to assume the behavior is undefined\nand conflicts should be avoided.\nFor more information, including usage and the valid values, see:\nhttp://kubernetes.io/v1.1/docs/user-guide/labels.html", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "localSsdCount": { + "format": "int32", + "description": "The number of local SSD disks to be attached to the node.\n\nThe limit for this value is dependant upon the maximum number of\ndisks available on a machine per zone. See:\nhttps://cloud.google.com/compute/docs/disks/local-ssd#local_ssd_limits\nfor more information.", + "type": "integer" + }, + "metadata": { + "description": "The metadata key/value pairs assigned to instances in the cluster.\n\nKeys must conform to the regexp [a-zA-Z0-9-_]+ and be less than 128 bytes\nin length. These are reflected as part of a URL in the metadata server.\nAdditionally, to avoid ambiguity, keys must not conflict with any other\nmetadata keys for the project or be one of the four reserved keys:\n\"instance-template\", \"kube-env\", \"startup-script\", and \"user-data\"\n\nValues are free-form strings, and only have meaning as interpreted by\nthe image running in the instance. The only restriction placed on them is\nthat each value's size must be less than or equal to 32 KB.\n\nThe total size of all keys and values must be less than 512 KB.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "diskSizeGb": { + "format": "int32", + "description": "Size of the disk attached to each node, specified in GB.\nThe smallest allowed disk size is 10GB.\n\nIf unspecified, the default disk size is 100GB.", + "type": "integer" + }, + "tags": { + "description": "The list of instance tags applied to all nodes. Tags are used to identify\nvalid sources or targets for network firewalls and are specified by\nthe client during cluster or node pool creation. Each tag within the list\nmust comply with RFC1035.", + "items": { + "type": "string" + }, + "type": "array" + }, + "serviceAccount": { + "description": "The Google Cloud Platform Service Account to be used by the node VMs. If\nno Service Account is specified, the \"default\" service account is used.", "type": "string" }, - "zone": { - "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the operation\nis taking place.", + "accelerators": { + "description": "A list of hardware accelerators to be attached to each node.\nSee https://cloud.google.com/compute/docs/gpus for more information about\nsupport for GPUs.", + "items": { + "$ref": "AcceleratorConfig" + }, + "type": "array" + }, + "machineType": { + "description": "The name of a Google Compute Engine [machine\ntype](/compute/docs/machine-types) (e.g.\n`n1-standard-1`).\n\nIf unspecified, the default machine type is\n`n1-standard-1`.", + "type": "string" + } + }, + "id": "NodeConfig" + }, + "AutoUpgradeOptions": { + "description": "AutoUpgradeOptions defines the set of options for the user to control how\nthe Auto Upgrades will proceed.", + "type": "object", + "properties": { + "description": { + "description": "[Output only] This field is set when upgrades are about to commence\nwith the description of the upgrade.", "type": "string" }, - "status": { - "enumDescriptions": [ - "Not set.", - "The operation has been created.", - "The operation is currently running.", - "The operation is done, either cancelled or completed.", - "The operation is aborting." - ], - "enum": [ - "STATUS_UNSPECIFIED", - "PENDING", - "RUNNING", - "DONE", - "ABORTING" - ], - "description": "The current status of the operation.", + "autoUpgradeStartTime": { + "description": "[Output only] This field is set when upgrades are about to commence\nwith the approximate start time for the upgrades, in\n[RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.", "type": "string" } }, - "id": "Operation" + "id": "AutoUpgradeOptions" }, - "AddonsConfig": { - "description": "Configuration for the addons that can be automatically spun up in the\ncluster, enabling additional functionality.", + "ListClustersResponse": { + "description": "ListClustersResponse is the result of ListClustersRequest.", "type": "object", "properties": { - "horizontalPodAutoscaling": { - "description": "Configuration for the horizontal pod autoscaling feature, which\nincreases or decreases the number of replica pods a replication controller\nhas based on the resource usage of the existing pods.", - "$ref": "HorizontalPodAutoscaling" + "clusters": { + "description": "A list of clusters in the project in the specified zone, or\nacross all ones.", + "items": { + "$ref": "Cluster" + }, + "type": "array" }, - "httpLoadBalancing": { - "description": "Configuration for the HTTP (L7) load balancing controller addon, which\nmakes it easy to set up HTTP load balancers for services in a cluster.", - "$ref": "HttpLoadBalancing" + "missingZones": { + "description": "If any zones are listed here, the list of clusters returned\nmay be missing those zones.", + "items": { + "type": "string" + }, + "type": "array" } }, - "id": "AddonsConfig" + "id": "ListClustersResponse" }, - "RollbackNodePoolUpgradeRequest": { - "description": "RollbackNodePoolUpgradeRequest rollbacks the previously Aborted or Failed\nNodePool upgrade. This will be an no-op if the last upgrade successfully\ncompleted.", + "HttpLoadBalancing": { + "description": "Configuration options for the HTTP (L7) load balancing controller addon,\nwhich makes it easy to set up HTTP load balancers for services in a cluster.", "type": "object", - "properties": {}, - "id": "RollbackNodePoolUpgradeRequest" + "properties": { + "disabled": { + "description": "Whether the HTTP Load Balancing controller is enabled in the cluster.\nWhen enabled, it runs a small pod in the cluster that manages the load\nbalancers.", + "type": "boolean" + } + }, + "id": "HttpLoadBalancing" }, - "UpdateClusterRequest": { - "description": "UpdateClusterRequest updates the settings of a cluster.", + "SetNetworkPolicyRequest": { + "description": "SetNetworkPolicyRequest enables/disables network policy for a cluster.", + "type": "object", + "properties": { + "networkPolicy": { + "description": "Configuration options for the NetworkPolicy feature.", + "$ref": "NetworkPolicy" + } + }, + "id": "SetNetworkPolicyRequest" + }, + "SetMasterAuthRequest": { + "description": "SetMasterAuthRequest updates the admin password of a cluster.", "type": "object", "properties": { "update": { - "$ref": "ClusterUpdate", + "$ref": "MasterAuth", "description": "A description of the update." + }, + "action": { + "description": "The exact form of action to be taken on the master auth", + "type": "string", + "enumDescriptions": [ + "Operation is unknown and will error out", + "Set the password to a user generated value.", + "Generate a new password and set it to that." + ], + "enum": [ + "UNKNOWN", + "SET_PASSWORD", + "GENERATE_PASSWORD" + ] } }, - "id": "UpdateClusterRequest" + "id": "SetMasterAuthRequest" }, - "Cluster": { - "description": "A Google Container Engine cluster.", + "ClientCertificateConfig": { + "description": "Configuration for client certificates on the cluster.", "type": "object", "properties": { - "nodePools": { - "description": "The node pools associated with this cluster.\nThis field should not be set if \"node_config\" or \"initial_node_count\" are\nspecified.", - "type": "array", - "items": { - "$ref": "NodePool" - } - }, - "selfLink": { - "description": "[Output only] Server-defined URL for the resource.", - "type": "string" - }, - "locations": { - "description": "The list of Google Compute Engine\n[locations](/compute/docs/zones#available) in which the cluster's nodes\nshould be located.", - "type": "array", - "items": { - "type": "string" - } - }, - "instanceGroupUrls": { - "description": "[Output only] The resource URLs of [instance\ngroups](/compute/docs/instance-groups/) associated with this\ncluster.", - "type": "array", - "items": { - "type": "string" - } - }, - "servicesIpv4Cidr": { - "description": "[Output only] The IP address range of the Kubernetes services in\nthis cluster, in\n[CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)\nnotation (e.g. `1.2.3.4/29`). Service addresses are\ntypically put in the last `/16` from the container CIDR.", - "type": "string" - }, - "enableKubernetesAlpha": { - "description": "Kubernetes alpha features are enabled on this cluster. This includes alpha\nAPI groups (e.g. v1alpha1) and features that may not be production ready in\nthe kubernetes version of the master and nodes.\nThe cluster has no SLA for uptime and master/node upgrades are disabled.\nAlpha enabled clusters are automatically deleted thirty days after\ncreation.", + "issueClientCertificate": { + "description": "Issue a client certificate.", + "type": "boolean" + } + }, + "id": "ClientCertificateConfig" + }, + "NodePoolAutoscaling": { + "description": "NodePoolAutoscaling contains information required by cluster autoscaler to\nadjust the size of the node pool to the current cluster usage.", + "type": "object", + "properties": { + "enabled": { + "description": "Is autoscaling enabled for this node pool.", "type": "boolean" }, - "description": { - "description": "An optional description of this cluster.", - "type": "string" - }, - "currentNodeCount": { - "description": "[Output only] The number of nodes currently in the cluster.", + "maxNodeCount": { "format": "int32", + "description": "Maximum number of nodes in the NodePool. Must be \u003e= min_node_count. There\nhas to enough quota to scale up the cluster.", "type": "integer" }, - "monitoringService": { - "description": "The monitoring service the cluster should use to write metrics.\nCurrently available options:\n\n* `monitoring.googleapis.com` - the Google Cloud Monitoring service.\n* `none` - no metrics will be exported from the cluster.\n* if left as an empty string, `monitoring.googleapis.com` will be used.", - "type": "string" - }, - "network": { - "description": "The name of the Google Compute Engine\n[network](/compute/docs/networks-and-firewalls#networks) to which the\ncluster is connected. If left unspecified, the `default` network\nwill be used.", - "type": "string" - }, - "labelFingerprint": { - "description": "The fingerprint of the set of labels for this cluster.", - "type": "string" - }, - "zone": { - "description": "[Output only] The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", - "type": "string" - }, - "loggingService": { - "description": "The logging service the cluster should use to write logs.\nCurrently available options:\n\n* `logging.googleapis.com` - the Google Cloud Logging service.\n* `none` - no logs will be exported from the cluster.\n* if left as an empty string,`logging.googleapis.com` will be used.", - "type": "string" - }, - "nodeIpv4CidrSize": { - "description": "[Output only] The size of the address space on each node for hosting\ncontainers. This is provisioned from within the `container_ipv4_cidr`\nrange.", + "minNodeCount": { "format": "int32", + "description": "Minimum number of nodes in the NodePool. Must be \u003e= 1 and \u003c=\nmax_node_count.", "type": "integer" - }, - "expireTime": { - "description": "[Output only] The time the cluster will be automatically\ndeleted in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.", + } + }, + "id": "NodePoolAutoscaling" + }, + "IPAllocationPolicy": { + "description": "Configuration for controlling how IPs are allocated in the cluster.", + "type": "object", + "properties": { + "servicesIpv4Cidr": { + "description": "The IP address range of the services IPs in this cluster. If blank, a range\nwill be automatically chosen with the default size.\n\nThis field is only applicable when `use_ip_aliases` is true.\n\nSet to blank to have a range will be chosen with the default size.\n\nSet to /netmask (e.g. `/14`) to have a range be chosen with a specific\nnetmask.\n\nSet to a [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)\nnotation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.\n`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range\nto use.", "type": "string" }, - "statusMessage": { - "description": "[Output only] Additional information about the current status of this\ncluster, if available.", - "type": "string" + "createSubnetwork": { + "description": "Whether a new subnetwork will be created automatically for the cluster.\n\nThis field is only applicable when `use_ip_aliases` is true.", + "type": "boolean" }, - "masterAuth": { - "description": "The authentication information for accessing the master endpoint.", - "$ref": "MasterAuth" + "useIpAliases": { + "description": "Whether alias IPs will be used for pod IPs in the cluster.", + "type": "boolean" }, - "currentMasterVersion": { - "description": "[Output only] The current software version of the master endpoint.", + "subnetworkName": { + "description": "A custom subnetwork name to be used if `create_subnetwork` is true. If\nthis field is empty, then an automatic name will be chosen for the new\nsubnetwork.", "type": "string" }, - "nodeConfig": { - "$ref": "NodeConfig", - "description": "Parameters used in creating the cluster's nodes.\nSee `nodeConfig` for the description of its properties.\nFor requests, this field should only be used in lieu of a\n\"node_pool\" object, since this configuration (along with the\n\"initial_node_count\") will be used to create a \"NodePool\" object with an\nauto-generated name. Do not use this and a node_pool at the same time.\nFor responses, this field will be populated with the node configuration of\nthe first node pool.\n\nIf unspecified, the defaults are used." - }, - "addonsConfig": { - "description": "Configurations for the various addons available to run in the cluster.", - "$ref": "AddonsConfig" - }, - "status": { - "enum": [ - "STATUS_UNSPECIFIED", - "PROVISIONING", - "RUNNING", - "RECONCILING", - "STOPPING", - "ERROR" - ], - "description": "[Output only] The current status of this cluster.", - "type": "string", - "enumDescriptions": [ - "Not set.", - "The PROVISIONING state indicates the cluster is being created.", - "The RUNNING state indicates the cluster has been created and is fully\nusable.", - "The RECONCILING state indicates that some work is actively being done on\nthe cluster, such as upgrading the master or node software. Details can\nbe found in the `statusMessage` field.", - "The STOPPING state indicates the cluster is being deleted.", - "The ERROR state indicates the cluster may be unusable. Details\ncan be found in the `statusMessage` field." - ] - }, - "subnetwork": { - "description": "The name of the Google Compute Engine\n[subnetwork](/compute/docs/subnetworks) to which the\ncluster is connected.", + "clusterIpv4Cidr": { + "description": "The IP address range for the cluster pod IPs. If this field is set, then\n`cluster.cluster_ipv4_cidr` must be left blank.\n\nThis field is only applicable when `use_ip_aliases` is true.\n\nSet to blank to have a range will be chosen with the default size.\n\nSet to /netmask (e.g. `/14`) to have a range be chosen with a specific\nnetmask.\n\nSet to a [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)\nnotation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.\n`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range\nto use.", "type": "string" }, - "currentNodeVersion": { - "description": "[Output only] The current version of the node software components.\nIf they are currently at multiple versions because they're in the process\nof being upgraded, this reflects the minimum version of all nodes.", + "nodeIpv4Cidr": { + "description": "The IP address range of the instance IPs in this cluster.\n\nThis is applicable only if `create_subnetwork` is true.\n\nSet to blank to have a range will be chosen with the default size.\n\nSet to /netmask (e.g. `/14`) to have a range be chosen with a specific\nnetmask.\n\nSet to a [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)\nnotation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g.\n`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range\nto use.", + "type": "string" + } + }, + "id": "IPAllocationPolicy" + }, + "ClusterUpdate": { + "description": "ClusterUpdate describes an update to the cluster. Exactly one update can\nbe applied to a cluster with each request, so at most one field can be\nprovided.", + "type": "object", + "properties": { + "desiredNodePoolId": { + "description": "The node pool to be upgraded. This field is mandatory if\n\"desired_node_version\", \"desired_image_family\" or\n\"desired_node_pool_autoscaling\" is specified and there is more than one\nnode pool on the cluster.", "type": "string" }, - "resourceLabels": { - "additionalProperties": { - "type": "string" - }, - "description": "The resource labels for the cluster to use to annotate any related GCE\nresources.", - "type": "object" - }, - "name": { - "description": "The name of this cluster. The name must be unique within this project\nand zone, and can be up to 40 characters with the following restrictions:\n\n* Lowercase letters, numbers, and hyphens only.\n* Must start with a letter.\n* Must end with a number or a letter.", + "desiredNodeVersion": { + "description": "The Kubernetes version to change the nodes to (typically an\nupgrade). Use `-` to upgrade to the latest version supported by\nthe server.", "type": "string" }, - "initialClusterVersion": { - "description": "The initial Kubernetes version for this cluster. Valid versions are those\nfound in validMasterVersions returned by getServerConfig. The version can\nbe upgraded over time; such upgrades are reflected in\ncurrentMasterVersion and currentNodeVersion.", + "desiredMasterVersion": { + "description": "The Kubernetes version to change the master to. The only valid value is the\nlatest supported version. Use \"-\" to have the server automatically select\nthe latest version.", "type": "string" }, - "legacyAbac": { - "description": "Configuration for the legacy ABAC authorization mode.", - "$ref": "LegacyAbac" + "desiredMasterAuthorizedNetworksConfig": { + "description": "Master authorized networks is a Beta feature.\nThe desired configuration options for master authorized networks feature.", + "$ref": "MasterAuthorizedNetworksConfig" }, - "endpoint": { - "description": "[Output only] The IP address of this cluster's master endpoint.\nThe endpoint can be accessed from the internet at\n`https://username:password@endpoint/`.\n\nSee the `masterAuth` property of this resource for username and\npassword information.", - "type": "string" + "desiredLocations": { + "description": "The desired list of Google Compute Engine\n[locations](/compute/docs/zones#available) in which the cluster's nodes\nshould be located. Changing the locations a cluster is in will result\nin nodes being either created or removed from the cluster, depending on\nwhether locations are being added or removed.\n\nThis list must always include the cluster's primary zone.", + "items": { + "type": "string" + }, + "type": "array" }, - "createTime": { - "description": "[Output only] The time the cluster was created, in\n[RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.", + "desiredNodePoolAutoscaling": { + "$ref": "NodePoolAutoscaling", + "description": "Autoscaler configuration for the node pool specified in\ndesired_node_pool_id. If there is only one pool in the\ncluster and desired_node_pool_id is not provided then\nthe change applies to that single node pool." + }, + "desiredMonitoringService": { + "description": "The monitoring service the cluster should use to write metrics.\nCurrently available options:\n\n* \"monitoring.googleapis.com\" - the Google Cloud Monitoring service\n* \"none\" - no metrics will be exported from the cluster", "type": "string" }, - "clusterIpv4Cidr": { - "description": "The IP address range of the container pods in this cluster, in\n[CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)\nnotation (e.g. `10.96.0.0/14`). Leave blank to have\none automatically chosen or specify a `/14` block in `10.0.0.0/8`.", + "desiredImageType": { + "description": "The desired image type for the node pool.\nNOTE: Set the \"desired_node_pool\" field as well.", "type": "string" }, - "initialNodeCount": { - "description": "The number of nodes to create in this cluster. You must ensure that your\nCompute Engine \u003ca href=\"/compute/docs/resource-quotas\"\u003eresource quota\u003c/a\u003e\nis sufficient for this number of instances. You must also have available\nfirewall and routes quota.\nFor requests, this field should only be used in lieu of a\n\"node_pool\" object, since this configuration (along with the\n\"node_config\") will be used to create a \"NodePool\" object with an\nauto-generated name. Do not use this and a node_pool at the same time.", - "format": "int32", - "type": "integer" + "desiredAddonsConfig": { + "description": "Configurations for the various addons available to run in the cluster.", + "$ref": "AddonsConfig" } }, - "id": "Cluster" + "id": "ClusterUpdate" }, - "CreateNodePoolRequest": { - "description": "CreateNodePoolRequest creates a node pool for a cluster.", + "SetLoggingServiceRequest": { + "description": "SetLoggingServiceRequest sets the logging service of a cluster.", "type": "object", "properties": { - "nodePool": { - "description": "The node pool to create.", - "$ref": "NodePool" + "loggingService": { + "description": "The logging service the cluster should use to write metrics.\nCurrently available options:\n\n* \"logging.googleapis.com\" - the Google Cloud Logging service\n* \"none\" - no metrics will be exported from the cluster", + "type": "string" } }, - "id": "CreateNodePoolRequest" + "id": "SetLoggingServiceRequest" }, - "ListOperationsResponse": { - "description": "ListOperationsResponse is the result of ListOperationsRequest.", + "HorizontalPodAutoscaling": { + "description": "Configuration options for the horizontal pod autoscaling feature, which\nincreases or decreases the number of replica pods a replication controller\nhas based on the resource usage of the existing pods.", "type": "object", "properties": { - "missingZones": { - "description": "If any zones are listed here, the list of operations returned\nmay be missing the operations from those zones.", - "type": "array", - "items": { - "type": "string" - } - }, - "operations": { - "description": "A list of operations in the project in the specified zone.", - "type": "array", - "items": { - "$ref": "Operation" - } + "disabled": { + "description": "Whether the Horizontal Pod Autoscaling feature is enabled in the cluster.\nWhen enabled, it ensures that a Heapster pod is running in the cluster,\nwhich is also used by the Cloud Monitoring service.", + "type": "boolean" } }, - "id": "ListOperationsResponse" + "id": "HorizontalPodAutoscaling" }, - "ServerConfig": { + "SetNodePoolManagementRequest": { + "description": "SetNodePoolManagementRequest sets the node management properties of a node\npool.", + "type": "object", "properties": { - "validMasterVersions": { - "description": "List of valid master versions.", - "type": "array", - "items": { - "type": "string" - } - }, - "defaultClusterVersion": { - "description": "Version of Kubernetes the service deploys by default.", - "type": "string" - }, - "defaultImageType": { - "description": "Default image type.", - "type": "string" + "management": { + "$ref": "NodeManagement", + "description": "NodeManagement configuration for the node pool." + } + }, + "id": "SetNodePoolManagementRequest" + }, + "Empty": { + "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n service Foo {\n rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.", + "type": "object", + "properties": {}, + "id": "Empty" + }, + "MasterAuthorizedNetworksConfig": { + "description": "Master authorized networks is a Beta feature.\nConfiguration options for the master authorized networks feature. Enabled\nmaster authorized networks will disallow all external traffic to access\nKubernetes master through HTTPS except traffic from the given CIDR blocks,\nGoogle Compute Engine Public IPs and Google Prod IPs.", + "type": "object", + "properties": { + "enabled": { + "description": "Whether or not master authorized networks is enabled.", + "type": "boolean" }, - "validNodeVersions": { - "description": "List of valid node upgrade target versions.", - "type": "array", + "cidrBlocks": { + "description": "cidr_blocks define up to 10 external networks that could access\nKubernetes master through HTTPS.", "items": { - "type": "string" - } - }, - "validImageTypes": { - "description": "List of valid image types.", - "type": "array", + "$ref": "CidrBlock" + }, + "type": "array" + } + }, + "id": "MasterAuthorizedNetworksConfig" + }, + "SetNodePoolAutoscalingRequest": { + "description": "SetNodePoolAutoscalingRequest sets the autoscaler settings of a node pool.", + "type": "object", + "properties": { + "autoscaling": { + "$ref": "NodePoolAutoscaling", + "description": "Autoscaling configuration for the node pool." + } + }, + "id": "SetNodePoolAutoscalingRequest" + }, + "CreateClusterRequest": { + "description": "CreateClusterRequest creates a cluster.", + "type": "object", + "properties": { + "cluster": { + "description": "A [cluster\nresource](/container-engine/reference/rest/v1/projects.zones.clusters)", + "$ref": "Cluster" + } + }, + "id": "CreateClusterRequest" + }, + "ListNodePoolsResponse": { + "description": "ListNodePoolsResponse is the result of ListNodePoolsRequest.", + "type": "object", + "properties": { + "nodePools": { + "description": "A list of node pools for a cluster.", "items": { - "type": "string" - } + "$ref": "NodePool" + }, + "type": "array" } }, - "id": "ServerConfig", - "description": "Container Engine service configuration.", - "type": "object" + "id": "ListNodePoolsResponse" }, - "MasterAuth": { - "description": "The authentication information for accessing the master endpoint.\nAuthentication can be done using HTTP basic auth or using client\ncertificates.", + "CompleteIPRotationRequest": { + "description": "CompleteIPRotationRequest moves the cluster master back into single-IP mode.", + "type": "object", + "properties": {}, + "id": "CompleteIPRotationRequest" + }, + "StartIPRotationRequest": { + "description": "StartIPRotationRequest creates a new IP for the cluster and then performs\na node upgrade on each node pool to point to the new IP.", + "type": "object", + "properties": {}, + "id": "StartIPRotationRequest" + }, + "UpdateNodePoolRequest": { + "description": "UpdateNodePoolRequests update a node pool's image and/or version.", "type": "object", "properties": { - "clusterCaCertificate": { - "description": "[Output only] Base64-encoded public certificate that is the root of\ntrust for the cluster.", + "imageType": { + "description": "The desired image type for the node pool.", "type": "string" }, - "password": { - "description": "The password to use for HTTP basic authentication to the master endpoint.\nBecause the master endpoint is open to the Internet, you should create a\nstrong password. If a password is provided for cluster creation, username\nmust be non-empty.", + "nodeVersion": { + "description": "The Kubernetes version to change the nodes to (typically an\nupgrade). Use `-` to upgrade to the latest version supported by\nthe server.", "type": "string" - }, - "clientCertificate": { - "description": "[Output only] Base64-encoded public certificate used by clients to\nauthenticate to the cluster endpoint.", + } + }, + "id": "UpdateNodePoolRequest" + }, + "AcceleratorConfig": { + "description": "AcceleratorConfig represents a Hardware Accelerator request.", + "type": "object", + "properties": { + "acceleratorType": { + "description": "The accelerator type resource name. List of supported accelerators\n[here](/compute/docs/gpus/#Introduction)", "type": "string" }, - "username": { - "description": "The username to use for HTTP basic authentication to the master endpoint.\nFor clusters v1.6.0 and later, you can disable basic authentication by\nproviding an empty username.", + "acceleratorCount": { + "format": "int64", + "description": "The number of the accelerator cards exposed to an instance.", "type": "string" + } + }, + "id": "AcceleratorConfig" + }, + "LegacyAbac": { + "description": "Configuration for the legacy Attribute Based Access Control authorization\nmode.", + "type": "object", + "properties": { + "enabled": { + "description": "Whether the ABAC authorizer is enabled for this cluster. When enabled,\nidentities in the system, including service accounts, nodes, and\ncontrollers, will have statically granted permissions beyond those\nprovided by the RBAC configuration or IAM.", + "type": "boolean" + } + }, + "id": "LegacyAbac" + }, + "SetAddonsConfigRequest": { + "description": "SetAddonsConfigRequest sets the addons associated with the cluster.", + "type": "object", + "properties": { + "addonsConfig": { + "$ref": "AddonsConfig", + "description": "The desired configurations for the various addons available to run in the\ncluster." + } + }, + "id": "SetAddonsConfigRequest" + }, + "SetLabelsRequest": { + "description": "SetLabelsRequest sets the Google Cloud Platform labels on a Google Container\nEngine cluster, which will in turn set them for Google Compute Engine\nresources used by that cluster", + "type": "object", + "properties": { + "resourceLabels": { + "description": "The labels to set for that cluster.", + "type": "object", + "additionalProperties": { + "type": "string" + } }, - "clientKey": { - "description": "[Output only] Base64-encoded private key used by clients to authenticate\nto the cluster endpoint.", + "labelFingerprint": { + "description": "The fingerprint of the previous set of labels for this resource,\nused to detect conflicts. The fingerprint is initially generated by\nContainer Engine and changes after every request to modify or update\nlabels. You must always provide an up-to-date fingerprint hash when\nupdating or changing labels. Make a \u003ccode\u003eget()\u003c/code\u003e request to the\nresource to get the latest fingerprint.", "type": "string" } }, - "id": "MasterAuth" + "id": "SetLabelsRequest" }, - "NodeConfig": { + "NodePool": { + "description": "NodePool contains the name and configuration for a cluster's node pool.\nNode pools are a set of nodes (i.e. VM's), with a common configuration and\nspecification, under the control of the cluster master. They may have a set\nof Kubernetes labels applied to them, which may be used to reference them\nduring pod scheduling. They may also be resized up or down, to accommodate\nthe workload.", + "type": "object", "properties": { - "machineType": { - "description": "The name of a Google Compute Engine [machine\ntype](/compute/docs/machine-types) (e.g.\n`n1-standard-1`).\n\nIf unspecified, the default machine type is\n`n1-standard-1`.", + "status": { + "enumDescriptions": [ + "Not set.", + "The PROVISIONING state indicates the node pool is being created.", + "The RUNNING state indicates the node pool has been created\nand is fully usable.", + "The RUNNING_WITH_ERROR state indicates the node pool has been created\nand is partially usable. Some error state has occurred and some\nfunctionality may be impaired. Customer may need to reissue a request\nor trigger a new update.", + "The RECONCILING state indicates that some work is actively being done on\nthe node pool, such as upgrading node software. Details can\nbe found in the `statusMessage` field.", + "The STOPPING state indicates the node pool is being deleted.", + "The ERROR state indicates the node pool may be unusable. Details\ncan be found in the `statusMessage` field." + ], + "enum": [ + "STATUS_UNSPECIFIED", + "PROVISIONING", + "RUNNING", + "RUNNING_WITH_ERROR", + "RECONCILING", + "STOPPING", + "ERROR" + ], + "description": "[Output only] The status of the nodes in this pool instance.", "type": "string" }, - "imageType": { - "description": "The image type to use for this node. Note that for a given image type,\nthe latest version of it will be used.", + "config": { + "$ref": "NodeConfig", + "description": "The node configuration of the pool." + }, + "statusMessage": { + "description": "[Output only] Additional information about the current status of this\nnode pool instance, if available.", "type": "string" }, - "oauthScopes": { - "description": "The set of Google API scopes to be made available on all of the\nnode VMs under the \"default\" service account.\n\nThe following scopes are recommended, but not required, and by default are\nnot included:\n\n* `https://www.googleapis.com/auth/compute` is required for mounting\npersistent storage on your nodes.\n* `https://www.googleapis.com/auth/devstorage.read_only` is required for\ncommunicating with **gcr.io**\n(the [Google Container Registry](/container-registry/)).\n\nIf unspecified, no scopes are added, unless Cloud Logging or Cloud\nMonitoring are enabled, in which case their required scopes will be added.", - "type": "array", - "items": { - "type": "string" - } + "name": { + "description": "The name of the node pool.", + "type": "string" }, - "preemptible": { - "description": "Whether the nodes are created as preemptible VM instances. See:\nhttps://cloud.google.com/compute/docs/instances/preemptible for more\ninforamtion about preemptible VM instances.", - "type": "boolean" + "autoscaling": { + "description": "Autoscaler configuration for this NodePool. Autoscaler is enabled\nonly if a valid configuration is present.", + "$ref": "NodePoolAutoscaling" }, - "labels": { - "additionalProperties": { - "type": "string" - }, - "description": "The map of Kubernetes labels (key/value pairs) to be applied to each node.\nThese will added in addition to any default label(s) that\nKubernetes may apply to the node.\nIn case of conflict in label keys, the applied set may differ depending on\nthe Kubernetes version -- it's best to assume the behavior is undefined\nand conflicts should be avoided.\nFor more information, including usage and the valid values, see:\nhttp://kubernetes.io/v1.1/docs/user-guide/labels.html", - "type": "object" + "management": { + "description": "NodeManagement configuration for this NodePool.", + "$ref": "NodeManagement" }, - "localSsdCount": { - "description": "The number of local SSD disks to be attached to the node.\n\nThe limit for this value is dependant upon the maximum number of\ndisks available on a machine per zone. See:\nhttps://cloud.google.com/compute/docs/disks/local-ssd#local_ssd_limits\nfor more information.", + "initialNodeCount": { "format": "int32", + "description": "The initial node count for the pool. You must ensure that your\nCompute Engine \u003ca href=\"/compute/docs/resource-quotas\"\u003eresource quota\u003c/a\u003e\nis sufficient for this number of instances. You must also have available\nfirewall and routes quota.", "type": "integer" }, - "metadata": { - "additionalProperties": { - "type": "string" - }, - "description": "The metadata key/value pairs assigned to instances in the cluster.\n\nKeys must conform to the regexp [a-zA-Z0-9-_]+ and be less than 128 bytes\nin length. These are reflected as part of a URL in the metadata server.\nAdditionally, to avoid ambiguity, keys must not conflict with any other\nmetadata keys for the project or be one of the four reserved keys:\n\"instance-template\", \"kube-env\", \"startup-script\", and \"user-data\"\n\nValues are free-form strings, and only have meaning as interpreted by\nthe image running in the instance. The only restriction placed on them is\nthat each value's size must be less than or equal to 32 KB.\n\nThe total size of all keys and values must be less than 512 KB.", - "type": "object" - }, - "diskSizeGb": { - "description": "Size of the disk attached to each node, specified in GB.\nThe smallest allowed disk size is 10GB.\n\nIf unspecified, the default disk size is 100GB.", - "format": "int32", - "type": "integer" + "selfLink": { + "description": "[Output only] Server-defined URL for the resource.", + "type": "string" }, - "tags": { - "description": "The list of instance tags applied to all nodes. Tags are used to identify\nvalid sources or targets for network firewalls and are specified by\nthe client during cluster or node pool creation. Each tag within the list\nmust comply with RFC1035.", - "type": "array", + "instanceGroupUrls": { + "description": "[Output only] The resource URLs of [instance\ngroups](/compute/docs/instance-groups/) associated with this\nnode pool.", "items": { "type": "string" - } - }, - "serviceAccount": { - "description": "The Google Cloud Platform Service Account to be used by the node VMs. If\nno Service Account is specified, the \"default\" service account is used.", - "type": "string" - } - }, - "id": "NodeConfig", - "description": "Parameters that describe the nodes in a cluster.", - "type": "object" - }, - "AutoUpgradeOptions": { - "properties": { - "autoUpgradeStartTime": { - "description": "[Output only] This field is set when upgrades are about to commence\nwith the approximate start time for the upgrades, in\n[RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.", - "type": "string" + }, + "type": "array" }, - "description": { - "description": "[Output only] This field is set when upgrades are about to commence\nwith the description of the upgrade.", + "version": { + "description": "[Output only] The version of the Kubernetes of this node.", "type": "string" } }, - "id": "AutoUpgradeOptions", - "description": "AutoUpgradeOptions defines the set of options for the user to control how\nthe Auto Upgrades will proceed.", - "type": "object" + "id": "NodePool" }, - "ListClustersResponse": { - "description": "ListClustersResponse is the result of ListClustersRequest.", + "NodeManagement": { + "description": "NodeManagement defines the set of node management services turned on for the\nnode pool.", "type": "object", "properties": { - "missingZones": { - "description": "If any zones are listed here, the list of clusters returned\nmay be missing those zones.", - "type": "array", - "items": { - "type": "string" - } + "autoRepair": { + "description": "A flag that specifies whether the node auto-repair is enabled for the node\npool. If enabled, the nodes in this node pool will be monitored and, if\nthey fail health checks too many times, an automatic repair action will be\ntriggered.", + "type": "boolean" }, - "clusters": { - "description": "A list of clusters in the project in the specified zone, or\nacross all ones.", - "type": "array", - "items": { - "$ref": "Cluster" - } + "autoUpgrade": { + "description": "A flag that specifies whether node auto-upgrade is enabled for the node\npool. If enabled, node auto-upgrade helps keep the nodes in your node pool\nup to date with the latest release version of Kubernetes.", + "type": "boolean" + }, + "upgradeOptions": { + "description": "Specifies the Auto Upgrade knobs for the node pool.", + "$ref": "AutoUpgradeOptions" } }, - "id": "ListClustersResponse" + "id": "NodeManagement" }, - "HttpLoadBalancing": { - "description": "Configuration options for the HTTP (L7) load balancing controller addon,\nwhich makes it easy to set up HTTP load balancers for services in a cluster.", + "CancelOperationRequest": { + "description": "CancelOperationRequest cancels a single operation.", "type": "object", - "properties": { - "disabled": { - "description": "Whether the HTTP Load Balancing controller is enabled in the cluster.\nWhen enabled, it runs a small pod in the cluster that manages the load\nbalancers.", - "type": "boolean" - } - }, - "id": "HttpLoadBalancing" + "properties": {}, + "id": "CancelOperationRequest" }, - "NodePoolAutoscaling": { + "SetLegacyAbacRequest": { + "description": "SetLegacyAbacRequest enables or disables the ABAC authorization mechanism for\na cluster.", + "type": "object", "properties": { "enabled": { - "description": "Is autoscaling enabled for this node pool.", + "description": "Whether ABAC authorization will be enabled in the cluster.", "type": "boolean" - }, - "maxNodeCount": { - "description": "Maximum number of nodes in the NodePool. Must be \u003e= min_node_count. There\nhas to enough quota to scale up the cluster.", - "format": "int32", - "type": "integer" - }, - "minNodeCount": { - "description": "Minimum number of nodes in the NodePool. Must be \u003e= 1 and \u003c=\nmax_node_count.", - "format": "int32", - "type": "integer" } }, - "id": "NodePoolAutoscaling", - "description": "NodePoolAutoscaling contains information required by cluster autoscaler to\nadjust the size of the node pool to the current cluster usage.", - "type": "object" + "id": "SetLegacyAbacRequest" }, - "SetMasterAuthRequest": { - "description": "SetMasterAuthRequest updates the admin password of a cluster.", + "KubernetesDashboard": { + "description": "Configuration for the Kubernetes Dashboard.", "type": "object", "properties": { - "update": { - "$ref": "MasterAuth", - "description": "A description of the update." - }, - "action": { - "enumDescriptions": [ - "Operation is unknown and will error out", - "Set the password to a user generated value.", - "Generate a new password and set it to that." - ], - "enum": [ - "UNKNOWN", - "SET_PASSWORD", - "GENERATE_PASSWORD" - ], - "description": "The exact form of action to be taken on the master auth", - "type": "string" + "disabled": { + "description": "Whether the Kubernetes Dashboard is enabled for this cluster.", + "type": "boolean" } }, - "id": "SetMasterAuthRequest" + "id": "KubernetesDashboard" }, - "ClusterUpdate": { - "description": "ClusterUpdate describes an update to the cluster. Exactly one update can\nbe applied to a cluster with each request, so at most one field can be\nprovided.", + "Operation": { + "description": "This operation resource represents operations that may have happened or are\nhappening on the cluster. All fields are output only.", "type": "object", "properties": { - "desiredLocations": { - "description": "The desired list of Google Compute Engine\n[locations](/compute/docs/zones#available) in which the cluster's nodes\nshould be located. Changing the locations a cluster is in will result\nin nodes being either created or removed from the cluster, depending on\nwhether locations are being added or removed.\n\nThis list must always include the cluster's primary zone.", - "type": "array", - "items": { - "type": "string" - } - }, - "desiredNodePoolAutoscaling": { - "description": "Autoscaler configuration for the node pool specified in\ndesired_node_pool_id. If there is only one pool in the\ncluster and desired_node_pool_id is not provided then\nthe change applies to that single node pool.", - "$ref": "NodePoolAutoscaling" + "selfLink": { + "description": "Server-defined URL for the resource.", + "type": "string" }, - "desiredMonitoringService": { - "description": "The monitoring service the cluster should use to write metrics.\nCurrently available options:\n\n* \"monitoring.googleapis.com\" - the Google Cloud Monitoring service\n* \"none\" - no metrics will be exported from the cluster", + "detail": { + "description": "Detailed operation progress, if available.", "type": "string" }, - "desiredImageType": { - "description": "The desired image type for the node pool.\nNOTE: Set the \"desired_node_pool\" field as well.", + "targetLink": { + "description": "Server-defined URL for the target of the operation.", "type": "string" }, - "desiredAddonsConfig": { - "$ref": "AddonsConfig", - "description": "Configurations for the various addons available to run in the cluster." + "operationType": { + "description": "The operation type.", + "type": "string", + "enumDescriptions": [ + "Not set.", + "Cluster create.", + "Cluster delete.", + "A master upgrade.", + "A node upgrade.", + "Cluster repair.", + "Cluster update.", + "Node pool create.", + "Node pool delete.", + "Set node pool management.", + "Automatic node pool repair.", + "Automatic node upgrade.", + "Set labels.", + "Set/generate master auth materials", + "Set node pool size.", + "Updates network policy for a cluster." + ], + "enum": [ + "TYPE_UNSPECIFIED", + "CREATE_CLUSTER", + "DELETE_CLUSTER", + "UPGRADE_MASTER", + "UPGRADE_NODES", + "REPAIR_CLUSTER", + "UPDATE_CLUSTER", + "CREATE_NODE_POOL", + "DELETE_NODE_POOL", + "SET_NODE_POOL_MANAGEMENT", + "AUTO_REPAIR_NODES", + "AUTO_UPGRADE_NODES", + "SET_LABELS", + "SET_MASTER_AUTH", + "SET_NODE_POOL_SIZE", + "SET_NETWORK_POLICY" + ] }, - "desiredNodePoolId": { - "description": "The node pool to be upgraded. This field is mandatory if\n\"desired_node_version\", \"desired_image_family\" or\n\"desired_node_pool_autoscaling\" is specified and there is more than one\nnode pool on the cluster.", + "zone": { + "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the operation\nis taking place.", "type": "string" }, - "desiredNodeVersion": { - "description": "The Kubernetes version to change the nodes to (typically an\nupgrade). Use `-` to upgrade to the latest version supported by\nthe server.", + "status": { + "enumDescriptions": [ + "Not set.", + "The operation has been created.", + "The operation is currently running.", + "The operation is done, either cancelled or completed.", + "The operation is aborting." + ], + "enum": [ + "STATUS_UNSPECIFIED", + "PENDING", + "RUNNING", + "DONE", + "ABORTING" + ], + "description": "The current status of the operation.", "type": "string" }, - "desiredMasterVersion": { - "description": "The Kubernetes version to change the master to. The only valid value is the\nlatest supported version. Use \"-\" to have the server automatically select\nthe latest version.", + "name": { + "description": "The server-assigned ID for the operation.", + "type": "string" + }, + "statusMessage": { + "description": "If an error has occurred, a textual description of the error.", "type": "string" } }, - "id": "ClusterUpdate" - }, - "HorizontalPodAutoscaling": { - "properties": { - "disabled": { - "description": "Whether the Horizontal Pod Autoscaling feature is enabled in the cluster.\nWhen enabled, it ensures that a Heapster pod is running in the cluster,\nwhich is also used by the Cloud Monitoring service.", - "type": "boolean" - } - }, - "id": "HorizontalPodAutoscaling", - "description": "Configuration options for the horizontal pod autoscaling feature, which\nincreases or decreases the number of replica pods a replication controller\nhas based on the resource usage of the existing pods.", - "type": "object" - }, - "Empty": { - "properties": {}, - "id": "Empty", - "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n service Foo {\n rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.", - "type": "object" - }, - "SetNodePoolManagementRequest": { - "properties": { - "management": { - "description": "NodeManagement configuration for the node pool.", - "$ref": "NodeManagement" - } - }, - "id": "SetNodePoolManagementRequest", - "description": "SetNodePoolManagementRequest sets the node management properties of a node\npool.", - "type": "object" - }, - "CreateClusterRequest": { - "properties": { - "cluster": { - "$ref": "Cluster", - "description": "A [cluster\nresource](/container-engine/reference/rest/v1/projects.zones.clusters)" - } - }, - "id": "CreateClusterRequest", - "description": "CreateClusterRequest creates a cluster.", - "type": "object" + "id": "Operation" }, - "ListNodePoolsResponse": { + "AddonsConfig": { + "description": "Configuration for the addons that can be automatically spun up in the\ncluster, enabling additional functionality.", + "type": "object", "properties": { - "nodePools": { - "description": "A list of node pools for a cluster.", - "type": "array", - "items": { - "$ref": "NodePool" - } + "kubernetesDashboard": { + "description": "Configuration for the Kubernetes Dashboard.", + "$ref": "KubernetesDashboard" + }, + "horizontalPodAutoscaling": { + "$ref": "HorizontalPodAutoscaling", + "description": "Configuration for the horizontal pod autoscaling feature, which\nincreases or decreases the number of replica pods a replication controller\nhas based on the resource usage of the existing pods." + }, + "httpLoadBalancing": { + "$ref": "HttpLoadBalancing", + "description": "Configuration for the HTTP (L7) load balancing controller addon, which\nmakes it easy to set up HTTP load balancers for services in a cluster." } }, - "id": "ListNodePoolsResponse", - "description": "ListNodePoolsResponse is the result of ListNodePoolsRequest.", - "type": "object" - }, - "CompleteIPRotationRequest": { - "properties": {}, - "id": "CompleteIPRotationRequest", - "description": "CompleteIPRotationRequest moves the cluster master back into single-IP mode.", - "type": "object" - }, - "StartIPRotationRequest": { - "properties": {}, - "id": "StartIPRotationRequest", - "description": "StartIPRotationRequest creates a new IP for the cluster and then performs\na node upgrade on each node pool to point to the new IP.", - "type": "object" + "id": "AddonsConfig" } }, + "protocol": "rest", "icons": { "x16": "http://www.google.com/images/icons/product/search-16.gif", "x32": "http://www.google.com/images/icons/product/search-32.gif" }, - "protocol": "rest", "version": "v1", "baseUrl": "https://container.googleapis.com/", "auth": { @@ -1693,18 +2360,8 @@ } } }, - "kind": "discovery#restDescription", - "description": "The Google Container Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.", "servicePath": "", - "rootUrl": "https://container.googleapis.com/", - "basePath": "", - "ownerDomain": "google.com", - "name": "container", - "batchPath": "batch", - "id": "container:v1", - "documentationLink": "https://cloud.google.com/container-engine/", - "revision": "20170424", - "title": "Google Container Engine API", - "ownerName": "Google", - "discoveryVersion": "v1" + "description": "The Google Container Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.", + "kind": "discovery#restDescription", + "rootUrl": "https://container.googleapis.com/" } diff --git a/vendor/google.golang.org/api/container/v1/container-gen.go b/vendor/google.golang.org/api/container/v1/container-gen.go index c12ef91c8bc4d..839d7b6eb7c22 100644 --- a/vendor/google.golang.org/api/container/v1/container-gen.go +++ b/vendor/google.golang.org/api/container/v1/container-gen.go @@ -132,6 +132,42 @@ type ProjectsZonesOperationsService struct { s *Service } +// AcceleratorConfig: AcceleratorConfig represents a Hardware +// Accelerator request. +type AcceleratorConfig struct { + // AcceleratorCount: The number of the accelerator cards exposed to an + // instance. + AcceleratorCount int64 `json:"acceleratorCount,omitempty,string"` + + // AcceleratorType: The accelerator type resource name. List of + // supported accelerators + // [here](/compute/docs/gpus/#Introduction) + AcceleratorType string `json:"acceleratorType,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AcceleratorCount") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AcceleratorCount") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *AcceleratorConfig) MarshalJSON() ([]byte, error) { + type noMethod AcceleratorConfig + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // AddonsConfig: Configuration for the addons that can be automatically // spun up in the // cluster, enabling additional functionality. @@ -149,6 +185,9 @@ type AddonsConfig struct { // cluster. HttpLoadBalancing *HttpLoadBalancing `json:"httpLoadBalancing,omitempty"` + // KubernetesDashboard: Configuration for the Kubernetes Dashboard. + KubernetesDashboard *KubernetesDashboard `json:"kubernetesDashboard,omitempty"` + // ForceSendFields is a list of field names (e.g. // "HorizontalPodAutoscaling") to unconditionally include in API // requests. By default, fields with empty values are omitted from API @@ -220,6 +259,69 @@ func (s *AutoUpgradeOptions) MarshalJSON() ([]byte, error) { type CancelOperationRequest struct { } +// CidrBlock: CidrBlock contains an optional name and one CIDR block. +type CidrBlock struct { + // CidrBlock: cidr_block must be specified in CIDR notation. + CidrBlock string `json:"cidrBlock,omitempty"` + + // DisplayName: display_name is an optional field for users to identify + // CIDR blocks. + DisplayName string `json:"displayName,omitempty"` + + // ForceSendFields is a list of field names (e.g. "CidrBlock") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CidrBlock") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *CidrBlock) MarshalJSON() ([]byte, error) { + type noMethod CidrBlock + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// ClientCertificateConfig: Configuration for client certificates on the +// cluster. +type ClientCertificateConfig struct { + // IssueClientCertificate: Issue a client certificate. + IssueClientCertificate bool `json:"issueClientCertificate,omitempty"` + + // ForceSendFields is a list of field names (e.g. + // "IssueClientCertificate") to unconditionally include in API requests. + // By default, fields with empty values are omitted from API requests. + // However, any non-pointer, non-interface field appearing in + // ForceSendFields will be sent to the server regardless of whether the + // field is empty or not. This may be used to include empty fields in + // Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "IssueClientCertificate") + // to include in API requests with the JSON null value. By default, + // fields with empty values are omitted from API requests. However, any + // field with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *ClientCertificateConfig) MarshalJSON() ([]byte, error) { + type noMethod ClientCertificateConfig + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // Cluster: A Google Container Engine cluster. type Cluster struct { // AddonsConfig: Configurations for the various addons available to run @@ -318,6 +420,9 @@ type Cluster struct { // cluster. InstanceGroupUrls []string `json:"instanceGroupUrls,omitempty"` + // IpAllocationPolicy: Configuration for cluster IP allocation. + IpAllocationPolicy *IPAllocationPolicy `json:"ipAllocationPolicy,omitempty"` + // LabelFingerprint: The fingerprint of the set of labels for this // cluster. LabelFingerprint string `json:"labelFingerprint,omitempty"` @@ -345,6 +450,11 @@ type Cluster struct { // endpoint. MasterAuth *MasterAuth `json:"masterAuth,omitempty"` + // MasterAuthorizedNetworksConfig: Master authorized networks is a Beta + // feature. + // The configuration options for master authorized networks feature. + MasterAuthorizedNetworksConfig *MasterAuthorizedNetworksConfig `json:"masterAuthorizedNetworksConfig,omitempty"` + // MonitoringService: The monitoring service the cluster should use to // write metrics. // Currently available options: @@ -374,6 +484,9 @@ type Cluster struct { // will be used. Network string `json:"network,omitempty"` + // NetworkPolicy: Configuration options for the NetworkPolicy feature. + NetworkPolicy *NetworkPolicy `json:"networkPolicy,omitempty"` + // NodeConfig: Parameters used in creating the cluster's nodes. // See `nodeConfig` for the description of its properties. // For requests, this field should only be used in lieu of a @@ -404,8 +517,8 @@ type Cluster struct { NodePools []*NodePool `json:"nodePools,omitempty"` // ResourceLabels: The resource labels for the cluster to use to - // annotate any related GCE - // resources. + // annotate any related + // Google Compute Engine resources. ResourceLabels map[string]string `json:"resourceLabels,omitempty"` // SelfLink: [Output only] Server-defined URL for the resource. @@ -513,6 +626,12 @@ type ClusterUpdate struct { // This list must always include the cluster's primary zone. DesiredLocations []string `json:"desiredLocations,omitempty"` + // DesiredMasterAuthorizedNetworksConfig: Master authorized networks is + // a Beta feature. + // The desired configuration options for master authorized networks + // feature. + DesiredMasterAuthorizedNetworksConfig *MasterAuthorizedNetworksConfig `json:"desiredMasterAuthorizedNetworksConfig,omitempty"` + // DesiredMasterVersion: The Kubernetes version to change the master to. // The only valid value is the // latest supported version. Use "-" to have the server automatically @@ -728,6 +847,147 @@ func (s *HttpLoadBalancing) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// IPAllocationPolicy: Configuration for controlling how IPs are +// allocated in the cluster. +type IPAllocationPolicy struct { + // ClusterIpv4Cidr: The IP address range for the cluster pod IPs. If + // this field is set, then + // `cluster.cluster_ipv4_cidr` must be left blank. + // + // This field is only applicable when `use_ip_aliases` is true. + // + // Set to blank to have a range will be chosen with the default + // size. + // + // Set to /netmask (e.g. `/14`) to have a range be chosen with a + // specific + // netmask. + // + // Set to a + // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) + // no + // tation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks + // (e.g. + // `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific + // range + // to use. + ClusterIpv4Cidr string `json:"clusterIpv4Cidr,omitempty"` + + // CreateSubnetwork: Whether a new subnetwork will be created + // automatically for the cluster. + // + // This field is only applicable when `use_ip_aliases` is true. + CreateSubnetwork bool `json:"createSubnetwork,omitempty"` + + // NodeIpv4Cidr: The IP address range of the instance IPs in this + // cluster. + // + // This is applicable only if `create_subnetwork` is true. + // + // Set to blank to have a range will be chosen with the default + // size. + // + // Set to /netmask (e.g. `/14`) to have a range be chosen with a + // specific + // netmask. + // + // Set to a + // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) + // no + // tation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks + // (e.g. + // `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific + // range + // to use. + NodeIpv4Cidr string `json:"nodeIpv4Cidr,omitempty"` + + // ServicesIpv4Cidr: The IP address range of the services IPs in this + // cluster. If blank, a range + // will be automatically chosen with the default size. + // + // This field is only applicable when `use_ip_aliases` is true. + // + // Set to blank to have a range will be chosen with the default + // size. + // + // Set to /netmask (e.g. `/14`) to have a range be chosen with a + // specific + // netmask. + // + // Set to a + // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) + // no + // tation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks + // (e.g. + // `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific + // range + // to use. + ServicesIpv4Cidr string `json:"servicesIpv4Cidr,omitempty"` + + // SubnetworkName: A custom subnetwork name to be used if + // `create_subnetwork` is true. If + // this field is empty, then an automatic name will be chosen for the + // new + // subnetwork. + SubnetworkName string `json:"subnetworkName,omitempty"` + + // UseIpAliases: Whether alias IPs will be used for pod IPs in the + // cluster. + UseIpAliases bool `json:"useIpAliases,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ClusterIpv4Cidr") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ClusterIpv4Cidr") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *IPAllocationPolicy) MarshalJSON() ([]byte, error) { + type noMethod IPAllocationPolicy + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// KubernetesDashboard: Configuration for the Kubernetes Dashboard. +type KubernetesDashboard struct { + // Disabled: Whether the Kubernetes Dashboard is enabled for this + // cluster. + Disabled bool `json:"disabled,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Disabled") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Disabled") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *KubernetesDashboard) MarshalJSON() ([]byte, error) { + type noMethod KubernetesDashboard + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // LegacyAbac: Configuration for the legacy Attribute Based Access // Control authorization // mode. @@ -887,6 +1147,11 @@ type MasterAuth struct { // authenticate to the cluster endpoint. ClientCertificate string `json:"clientCertificate,omitempty"` + // ClientCertificateConfig: Configuration for client certificate + // authentication on the cluster. If no + // configuration is specified, a client certificate is issued. + ClientCertificateConfig *ClientCertificateConfig `json:"clientCertificateConfig,omitempty"` + // ClientKey: [Output only] Base64-encoded private key used by clients // to authenticate // to the cluster endpoint. @@ -937,8 +1202,94 @@ func (s *MasterAuth) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// MasterAuthorizedNetworksConfig: Master authorized networks is a Beta +// feature. +// Configuration options for the master authorized networks feature. +// Enabled +// master authorized networks will disallow all external traffic to +// access +// Kubernetes master through HTTPS except traffic from the given CIDR +// blocks, +// Google Compute Engine Public IPs and Google Prod IPs. +type MasterAuthorizedNetworksConfig struct { + // CidrBlocks: cidr_blocks define up to 10 external networks that could + // access + // Kubernetes master through HTTPS. + CidrBlocks []*CidrBlock `json:"cidrBlocks,omitempty"` + + // Enabled: Whether or not master authorized networks is enabled. + Enabled bool `json:"enabled,omitempty"` + + // ForceSendFields is a list of field names (e.g. "CidrBlocks") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "CidrBlocks") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *MasterAuthorizedNetworksConfig) MarshalJSON() ([]byte, error) { + type noMethod MasterAuthorizedNetworksConfig + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// NetworkPolicy: Configuration options for the NetworkPolicy +// feature. +// https://kubernetes.io/docs/concepts/services-networking/netwo +// rkpolicies/ +type NetworkPolicy struct { + // Enabled: Whether network policy is enabled on the cluster. + Enabled bool `json:"enabled,omitempty"` + + // Provider: The selected network policy provider. + // + // Possible values: + // "PROVIDER_UNSPECIFIED" - Not set + // "CALICO" - Tigera (Calico Felix). + Provider string `json:"provider,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Enabled") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Enabled") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *NetworkPolicy) MarshalJSON() ([]byte, error) { + type noMethod NetworkPolicy + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // NodeConfig: Parameters that describe the nodes in a cluster. type NodeConfig struct { + // Accelerators: A list of hardware accelerators to be attached to each + // node. + // See https://cloud.google.com/compute/docs/gpus for more information + // about + // support for GPUs. + Accelerators []*AcceleratorConfig `json:"accelerators,omitempty"` + // DiskSizeGb: Size of the disk attached to each node, specified in // GB. // The smallest allowed disk size is 10GB. @@ -1036,7 +1387,7 @@ type NodeConfig struct { // See: // https://cloud.google.com/compute/docs/instances/preemptible for // more - // inforamtion about preemptible VM instances. + // information about preemptible VM instances. Preemptible bool `json:"preemptible,omitempty"` // ServiceAccount: The Google Cloud Platform Service Account to be used @@ -1054,7 +1405,7 @@ type NodeConfig struct { // must comply with RFC1035. Tags []string `json:"tags,omitempty"` - // ForceSendFields is a list of field names (e.g. "DiskSizeGb") to + // ForceSendFields is a list of field names (e.g. "Accelerators") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the @@ -1062,10 +1413,10 @@ type NodeConfig struct { // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "DiskSizeGb") to include in - // API requests with the JSON null value. By default, fields with empty - // values are omitted from API requests. However, any field with an - // empty value appearing in NullFields will be sent to the server as + // NullFields is a list of field names (e.g. "Accelerators") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as // null. It is an error if a field in this list has a non-empty value. // This may be used to include null fields in Patch requests. NullFields []string `json:"-"` @@ -1296,6 +1647,8 @@ type Operation struct { // "AUTO_UPGRADE_NODES" - Automatic node upgrade. // "SET_LABELS" - Set labels. // "SET_MASTER_AUTH" - Set/generate master auth materials + // "SET_NODE_POOL_SIZE" - Set node pool size. + // "SET_NETWORK_POLICY" - Updates network policy for a cluster. OperationType string `json:"operationType,omitempty"` // SelfLink: Server-defined URL for the resource. @@ -1406,6 +1759,37 @@ func (s *ServerConfig) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// SetAddonsConfigRequest: SetAddonsConfigRequest sets the addons +// associated with the cluster. +type SetAddonsConfigRequest struct { + // AddonsConfig: The desired configurations for the various addons + // available to run in the + // cluster. + AddonsConfig *AddonsConfig `json:"addonsConfig,omitempty"` + + // ForceSendFields is a list of field names (e.g. "AddonsConfig") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "AddonsConfig") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *SetAddonsConfigRequest) MarshalJSON() ([]byte, error) { + type noMethod SetAddonsConfigRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // SetLabelsRequest: SetLabelsRequest sets the Google Cloud Platform // labels on a Google Container // Engine cluster, which will in turn set them for Google Compute @@ -1482,21 +1866,23 @@ func (s *SetLegacyAbacRequest) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } -// SetMasterAuthRequest: SetMasterAuthRequest updates the admin password -// of a cluster. -type SetMasterAuthRequest struct { - // Action: The exact form of action to be taken on the master auth +// SetLocationsRequest: SetLocationsRequest sets the locations of the +// cluster. +type SetLocationsRequest struct { + // Locations: The desired list of Google Compute + // Engine + // [locations](/compute/docs/zones#available) in which the cluster's + // nodes + // should be located. Changing the locations a cluster is in will + // result + // in nodes being either created or removed from the cluster, depending + // on + // whether locations are being added or removed. // - // Possible values: - // "UNKNOWN" - Operation is unknown and will error out - // "SET_PASSWORD" - Set the password to a user generated value. - // "GENERATE_PASSWORD" - Generate a new password and set it to that. - Action string `json:"action,omitempty"` - - // Update: A description of the update. - Update *MasterAuth `json:"update,omitempty"` + // This list must always include the cluster's primary zone. + Locations []string `json:"locations,omitempty"` - // ForceSendFields is a list of field names (e.g. "Action") to + // ForceSendFields is a list of field names (e.g. "Locations") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the @@ -1504,8 +1890,8 @@ type SetMasterAuthRequest struct { // used to include empty fields in Patch requests. ForceSendFields []string `json:"-"` - // NullFields is a list of field names (e.g. "Action") to include in API - // requests with the JSON null value. By default, fields with empty + // NullFields is a list of field names (e.g. "Locations") to include in + // API requests with the JSON null value. By default, fields with empty // values are omitted from API requests. However, any field with an // empty value appearing in NullFields will be sent to the server as // null. It is an error if a field in this list has a non-empty value. @@ -1513,21 +1899,186 @@ type SetMasterAuthRequest struct { NullFields []string `json:"-"` } -func (s *SetMasterAuthRequest) MarshalJSON() ([]byte, error) { - type noMethod SetMasterAuthRequest +func (s *SetLocationsRequest) MarshalJSON() ([]byte, error) { + type noMethod SetLocationsRequest raw := noMethod(*s) return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } -// SetNodePoolManagementRequest: SetNodePoolManagementRequest sets the -// node management properties of a node -// pool. -type SetNodePoolManagementRequest struct { - // Management: NodeManagement configuration for the node pool. - Management *NodeManagement `json:"management,omitempty"` - - // ForceSendFields is a list of field names (e.g. "Management") to - // unconditionally include in API requests. By default, fields with +// SetLoggingServiceRequest: SetLoggingServiceRequest sets the logging +// service of a cluster. +type SetLoggingServiceRequest struct { + // LoggingService: The logging service the cluster should use to write + // metrics. + // Currently available options: + // + // * "logging.googleapis.com" - the Google Cloud Logging service + // * "none" - no metrics will be exported from the cluster + LoggingService string `json:"loggingService,omitempty"` + + // ForceSendFields is a list of field names (e.g. "LoggingService") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "LoggingService") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *SetLoggingServiceRequest) MarshalJSON() ([]byte, error) { + type noMethod SetLoggingServiceRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// SetMasterAuthRequest: SetMasterAuthRequest updates the admin password +// of a cluster. +type SetMasterAuthRequest struct { + // Action: The exact form of action to be taken on the master auth + // + // Possible values: + // "UNKNOWN" - Operation is unknown and will error out + // "SET_PASSWORD" - Set the password to a user generated value. + // "GENERATE_PASSWORD" - Generate a new password and set it to that. + Action string `json:"action,omitempty"` + + // Update: A description of the update. + Update *MasterAuth `json:"update,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Action") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Action") to include in API + // requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *SetMasterAuthRequest) MarshalJSON() ([]byte, error) { + type noMethod SetMasterAuthRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// SetMonitoringServiceRequest: SetMonitoringServiceRequest sets the +// monitoring service of a cluster. +type SetMonitoringServiceRequest struct { + // MonitoringService: The monitoring service the cluster should use to + // write metrics. + // Currently available options: + // + // * "monitoring.googleapis.com" - the Google Cloud Monitoring service + // * "none" - no metrics will be exported from the cluster + MonitoringService string `json:"monitoringService,omitempty"` + + // ForceSendFields is a list of field names (e.g. "MonitoringService") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "MonitoringService") to + // include in API requests with the JSON null value. By default, fields + // with empty values are omitted from API requests. However, any field + // with an empty value appearing in NullFields will be sent to the + // server as null. It is an error if a field in this list has a + // non-empty value. This may be used to include null fields in Patch + // requests. + NullFields []string `json:"-"` +} + +func (s *SetMonitoringServiceRequest) MarshalJSON() ([]byte, error) { + type noMethod SetMonitoringServiceRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// SetNetworkPolicyRequest: SetNetworkPolicyRequest enables/disables +// network policy for a cluster. +type SetNetworkPolicyRequest struct { + // NetworkPolicy: Configuration options for the NetworkPolicy feature. + NetworkPolicy *NetworkPolicy `json:"networkPolicy,omitempty"` + + // ForceSendFields is a list of field names (e.g. "NetworkPolicy") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "NetworkPolicy") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *SetNetworkPolicyRequest) MarshalJSON() ([]byte, error) { + type noMethod SetNetworkPolicyRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// SetNodePoolAutoscalingRequest: SetNodePoolAutoscalingRequest sets the +// autoscaler settings of a node pool. +type SetNodePoolAutoscalingRequest struct { + // Autoscaling: Autoscaling configuration for the node pool. + Autoscaling *NodePoolAutoscaling `json:"autoscaling,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Autoscaling") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "Autoscaling") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *SetNodePoolAutoscalingRequest) MarshalJSON() ([]byte, error) { + type noMethod SetNodePoolAutoscalingRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// SetNodePoolManagementRequest: SetNodePoolManagementRequest sets the +// node management properties of a node +// pool. +type SetNodePoolManagementRequest struct { + // Management: NodeManagement configuration for the node pool. + Management *NodeManagement `json:"management,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Management") to + // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, // non-interface field appearing in ForceSendFields will be sent to the // server regardless of whether the field is empty or not. This may be @@ -1549,6 +2100,36 @@ func (s *SetNodePoolManagementRequest) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// SetNodePoolSizeRequest: SetNodePoolSizeRequest sets the size a +// node +// pool. +type SetNodePoolSizeRequest struct { + // NodeCount: The desired node count for the pool. + NodeCount int64 `json:"nodeCount,omitempty"` + + // ForceSendFields is a list of field names (e.g. "NodeCount") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "NodeCount") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *SetNodePoolSizeRequest) MarshalJSON() ([]byte, error) { + type noMethod SetNodePoolSizeRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // StartIPRotationRequest: StartIPRotationRequest creates a new IP for // the cluster and then performs // a node upgrade on each node pool to point to the new IP. @@ -1584,6 +2165,74 @@ func (s *UpdateClusterRequest) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) } +// UpdateMasterRequest: UpdateMasterRequest updates the master of the +// cluster. +type UpdateMasterRequest struct { + // MasterVersion: The Kubernetes version to change the master to. The + // only valid value is the + // latest supported version. Use "-" to have the server automatically + // select + // the latest version. + MasterVersion string `json:"masterVersion,omitempty"` + + // ForceSendFields is a list of field names (e.g. "MasterVersion") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "MasterVersion") to include + // in API requests with the JSON null value. By default, fields with + // empty values are omitted from API requests. However, any field with + // an empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *UpdateMasterRequest) MarshalJSON() ([]byte, error) { + type noMethod UpdateMasterRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + +// UpdateNodePoolRequest: UpdateNodePoolRequests update a node pool's +// image and/or version. +type UpdateNodePoolRequest struct { + // ImageType: The desired image type for the node pool. + ImageType string `json:"imageType,omitempty"` + + // NodeVersion: The Kubernetes version to change the nodes to (typically + // an + // upgrade). Use `-` to upgrade to the latest version supported by + // the server. + NodeVersion string `json:"nodeVersion,omitempty"` + + // ForceSendFields is a list of field names (e.g. "ImageType") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` + + // NullFields is a list of field names (e.g. "ImageType") to include in + // API requests with the JSON null value. By default, fields with empty + // values are omitted from API requests. However, any field with an + // empty value appearing in NullFields will be sent to the server as + // null. It is an error if a field in this list has a non-empty value. + // This may be used to include null fields in Patch requests. + NullFields []string `json:"-"` +} + +func (s *UpdateNodePoolRequest) MarshalJSON() ([]byte, error) { + type noMethod UpdateNodePoolRequest + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields) +} + // method id "container.projects.zones.getServerconfig": type ProjectsZonesGetServerconfigCall struct { @@ -1733,33 +2382,33 @@ func (c *ProjectsZonesGetServerconfigCall) Do(opts ...googleapi.CallOption) (*Se } -// method id "container.projects.zones.clusters.completeIpRotation": +// method id "container.projects.zones.clusters.addons": -type ProjectsZonesClustersCompleteIpRotationCall struct { - s *Service - projectId string - zone string - clusterId string - completeiprotationrequest *CompleteIPRotationRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersAddonsCall struct { + s *Service + projectId string + zone string + clusterId string + setaddonsconfigrequest *SetAddonsConfigRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// CompleteIpRotation: Completes master IP rotation. -func (r *ProjectsZonesClustersService) CompleteIpRotation(projectId string, zone string, clusterId string, completeiprotationrequest *CompleteIPRotationRequest) *ProjectsZonesClustersCompleteIpRotationCall { - c := &ProjectsZonesClustersCompleteIpRotationCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Addons: Sets the addons of a specific cluster. +func (r *ProjectsZonesClustersService) Addons(projectId string, zone string, clusterId string, setaddonsconfigrequest *SetAddonsConfigRequest) *ProjectsZonesClustersAddonsCall { + c := &ProjectsZonesClustersAddonsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId - c.completeiprotationrequest = completeiprotationrequest + c.setaddonsconfigrequest = setaddonsconfigrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersCompleteIpRotationCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersCompleteIpRotationCall { +func (c *ProjectsZonesClustersAddonsCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersAddonsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -1767,34 +2416,34 @@ func (c *ProjectsZonesClustersCompleteIpRotationCall) Fields(s ...googleapi.Fiel // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersCompleteIpRotationCall) Context(ctx context.Context) *ProjectsZonesClustersCompleteIpRotationCall { +func (c *ProjectsZonesClustersAddonsCall) Context(ctx context.Context) *ProjectsZonesClustersAddonsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersCompleteIpRotationCall) Header() http.Header { +func (c *ProjectsZonesClustersAddonsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersCompleteIpRotationCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersAddonsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.completeiprotationrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setaddonsconfigrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/addons") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -1806,14 +2455,14 @@ func (c *ProjectsZonesClustersCompleteIpRotationCall) doRequest(alt string) (*ht return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.completeIpRotation" call. +// Do executes the "container.projects.zones.clusters.addons" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersCompleteIpRotationCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsZonesClustersAddonsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -1844,10 +2493,10 @@ func (c *ProjectsZonesClustersCompleteIpRotationCall) Do(opts ...googleapi.CallO } return ret, nil // { - // "description": "Completes master IP rotation.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation", + // "description": "Sets the addons of a specific cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/addons", // "httpMethod": "POST", - // "id": "container.projects.zones.clusters.completeIpRotation", + // "id": "container.projects.zones.clusters.addons", // "parameterOrder": [ // "projectId", // "zone", @@ -1855,13 +2504,13 @@ func (c *ProjectsZonesClustersCompleteIpRotationCall) Do(opts ...googleapi.CallO // ], // "parameters": { // "clusterId": { - // "description": "The name of the cluster.", + // "description": "The name of the cluster to upgrade.", // "location": "path", // "required": true, // "type": "string" // }, // "projectId": { - // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", // "location": "path", // "required": true, // "type": "string" @@ -1873,9 +2522,9 @@ func (c *ProjectsZonesClustersCompleteIpRotationCall) Do(opts ...googleapi.CallO // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/addons", // "request": { - // "$ref": "CompleteIPRotationRequest" + // "$ref": "SetAddonsConfigRequest" // }, // "response": { // "$ref": "Operation" @@ -1887,11 +2536,165 @@ func (c *ProjectsZonesClustersCompleteIpRotationCall) Do(opts ...googleapi.CallO } -// method id "container.projects.zones.clusters.create": +// method id "container.projects.zones.clusters.completeIpRotation": -type ProjectsZonesClustersCreateCall struct { - s *Service - projectId string +type ProjectsZonesClustersCompleteIpRotationCall struct { + s *Service + projectId string + zone string + clusterId string + completeiprotationrequest *CompleteIPRotationRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// CompleteIpRotation: Completes master IP rotation. +func (r *ProjectsZonesClustersService) CompleteIpRotation(projectId string, zone string, clusterId string, completeiprotationrequest *CompleteIPRotationRequest) *ProjectsZonesClustersCompleteIpRotationCall { + c := &ProjectsZonesClustersCompleteIpRotationCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.projectId = projectId + c.zone = zone + c.clusterId = clusterId + c.completeiprotationrequest = completeiprotationrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProjectsZonesClustersCompleteIpRotationCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersCompleteIpRotationCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProjectsZonesClustersCompleteIpRotationCall) Context(ctx context.Context) *ProjectsZonesClustersCompleteIpRotationCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProjectsZonesClustersCompleteIpRotationCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProjectsZonesClustersCompleteIpRotationCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.completeiprotationrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "container.projects.zones.clusters.completeIpRotation" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsZonesClustersCompleteIpRotationCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Completes master IP rotation.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation", + // "httpMethod": "POST", + // "id": "container.projects.zones.clusters.completeIpRotation", + // "parameterOrder": [ + // "projectId", + // "zone", + // "clusterId" + // ], + // "parameters": { + // "clusterId": { + // "description": "The name of the cluster.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "projectId": { + // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation", + // "request": { + // "$ref": "CompleteIPRotationRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform" + // ] + // } + +} + +// method id "container.projects.zones.clusters.create": + +type ProjectsZonesClustersCreateCall struct { + s *Service + projectId string zone string createclusterrequest *CreateClusterRequest urlParams_ gensupport.URLParams @@ -2665,33 +3468,33 @@ func (c *ProjectsZonesClustersListCall) Do(opts ...googleapi.CallOption) (*ListC } -// method id "container.projects.zones.clusters.resourceLabels": +// method id "container.projects.zones.clusters.locations": -type ProjectsZonesClustersResourceLabelsCall struct { - s *Service - projectId string - zone string - clusterId string - setlabelsrequest *SetLabelsRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersLocationsCall struct { + s *Service + projectId string + zone string + clusterId string + setlocationsrequest *SetLocationsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// ResourceLabels: Sets labels on a cluster. -func (r *ProjectsZonesClustersService) ResourceLabels(projectId string, zone string, clusterId string, setlabelsrequest *SetLabelsRequest) *ProjectsZonesClustersResourceLabelsCall { - c := &ProjectsZonesClustersResourceLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Locations: Sets the locations of a specific cluster. +func (r *ProjectsZonesClustersService) Locations(projectId string, zone string, clusterId string, setlocationsrequest *SetLocationsRequest) *ProjectsZonesClustersLocationsCall { + c := &ProjectsZonesClustersLocationsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId - c.setlabelsrequest = setlabelsrequest + c.setlocationsrequest = setlocationsrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersResourceLabelsCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersResourceLabelsCall { +func (c *ProjectsZonesClustersLocationsCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersLocationsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -2699,34 +3502,34 @@ func (c *ProjectsZonesClustersResourceLabelsCall) Fields(s ...googleapi.Field) * // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersResourceLabelsCall) Context(ctx context.Context) *ProjectsZonesClustersResourceLabelsCall { +func (c *ProjectsZonesClustersLocationsCall) Context(ctx context.Context) *ProjectsZonesClustersLocationsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersResourceLabelsCall) Header() http.Header { +func (c *ProjectsZonesClustersLocationsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersResourceLabelsCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersLocationsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.setlabelsrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setlocationsrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/locations") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -2738,14 +3541,14 @@ func (c *ProjectsZonesClustersResourceLabelsCall) doRequest(alt string) (*http.R return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.resourceLabels" call. +// Do executes the "container.projects.zones.clusters.locations" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersResourceLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsZonesClustersLocationsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -2776,10 +3579,10 @@ func (c *ProjectsZonesClustersResourceLabelsCall) Do(opts ...googleapi.CallOptio } return ret, nil // { - // "description": "Sets labels on a cluster.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels", + // "description": "Sets the locations of a specific cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/locations", // "httpMethod": "POST", - // "id": "container.projects.zones.clusters.resourceLabels", + // "id": "container.projects.zones.clusters.locations", // "parameterOrder": [ // "projectId", // "zone", @@ -2787,13 +3590,13 @@ func (c *ProjectsZonesClustersResourceLabelsCall) Do(opts ...googleapi.CallOptio // ], // "parameters": { // "clusterId": { - // "description": "The name of the cluster.", + // "description": "The name of the cluster to upgrade.", // "location": "path", // "required": true, // "type": "string" // }, // "projectId": { - // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", // "location": "path", // "required": true, // "type": "string" @@ -2805,9 +3608,9 @@ func (c *ProjectsZonesClustersResourceLabelsCall) Do(opts ...googleapi.CallOptio // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/locations", // "request": { - // "$ref": "SetLabelsRequest" + // "$ref": "SetLocationsRequest" // }, // "response": { // "$ref": "Operation" @@ -2819,37 +3622,33 @@ func (c *ProjectsZonesClustersResourceLabelsCall) Do(opts ...googleapi.CallOptio } -// method id "container.projects.zones.clusters.setMasterAuth": +// method id "container.projects.zones.clusters.logging": -type ProjectsZonesClustersSetMasterAuthCall struct { - s *Service - projectId string - zone string - clusterId string - setmasterauthrequest *SetMasterAuthRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersLoggingCall struct { + s *Service + projectId string + zone string + clusterId string + setloggingservicerequest *SetLoggingServiceRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetMasterAuth: Used to set master auth materials. Currently supports -// :- -// Changing the admin password of a specific cluster. -// This can be either via password generation or explicitly set the -// password. -func (r *ProjectsZonesClustersService) SetMasterAuth(projectId string, zone string, clusterId string, setmasterauthrequest *SetMasterAuthRequest) *ProjectsZonesClustersSetMasterAuthCall { - c := &ProjectsZonesClustersSetMasterAuthCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Logging: Sets the logging service of a specific cluster. +func (r *ProjectsZonesClustersService) Logging(projectId string, zone string, clusterId string, setloggingservicerequest *SetLoggingServiceRequest) *ProjectsZonesClustersLoggingCall { + c := &ProjectsZonesClustersLoggingCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId - c.setmasterauthrequest = setmasterauthrequest + c.setloggingservicerequest = setloggingservicerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersSetMasterAuthCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersSetMasterAuthCall { +func (c *ProjectsZonesClustersLoggingCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersLoggingCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -2857,34 +3656,34 @@ func (c *ProjectsZonesClustersSetMasterAuthCall) Fields(s ...googleapi.Field) *P // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersSetMasterAuthCall) Context(ctx context.Context) *ProjectsZonesClustersSetMasterAuthCall { +func (c *ProjectsZonesClustersLoggingCall) Context(ctx context.Context) *ProjectsZonesClustersLoggingCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersSetMasterAuthCall) Header() http.Header { +func (c *ProjectsZonesClustersLoggingCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersSetMasterAuthCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersLoggingCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.setmasterauthrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setloggingservicerequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/logging") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -2896,14 +3695,14 @@ func (c *ProjectsZonesClustersSetMasterAuthCall) doRequest(alt string) (*http.Re return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.setMasterAuth" call. +// Do executes the "container.projects.zones.clusters.logging" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersSetMasterAuthCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsZonesClustersLoggingCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -2934,10 +3733,10 @@ func (c *ProjectsZonesClustersSetMasterAuthCall) Do(opts ...googleapi.CallOption } return ret, nil // { - // "description": "Used to set master auth materials. Currently supports :-\nChanging the admin password of a specific cluster.\nThis can be either via password generation or explicitly set the password.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth", + // "description": "Sets the logging service of a specific cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/logging", // "httpMethod": "POST", - // "id": "container.projects.zones.clusters.setMasterAuth", + // "id": "container.projects.zones.clusters.logging", // "parameterOrder": [ // "projectId", // "zone", @@ -2963,9 +3762,9 @@ func (c *ProjectsZonesClustersSetMasterAuthCall) Do(opts ...googleapi.CallOption // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/logging", // "request": { - // "$ref": "SetMasterAuthRequest" + // "$ref": "SetLoggingServiceRequest" // }, // "response": { // "$ref": "Operation" @@ -2977,33 +3776,33 @@ func (c *ProjectsZonesClustersSetMasterAuthCall) Do(opts ...googleapi.CallOption } -// method id "container.projects.zones.clusters.startIpRotation": +// method id "container.projects.zones.clusters.master": -type ProjectsZonesClustersStartIpRotationCall struct { - s *Service - projectId string - zone string - clusterId string - startiprotationrequest *StartIPRotationRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersMasterCall struct { + s *Service + projectId string + zone string + clusterId string + updatemasterrequest *UpdateMasterRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// StartIpRotation: Start master IP rotation. -func (r *ProjectsZonesClustersService) StartIpRotation(projectId string, zone string, clusterId string, startiprotationrequest *StartIPRotationRequest) *ProjectsZonesClustersStartIpRotationCall { - c := &ProjectsZonesClustersStartIpRotationCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Master: Updates the master of a specific cluster. +func (r *ProjectsZonesClustersService) Master(projectId string, zone string, clusterId string, updatemasterrequest *UpdateMasterRequest) *ProjectsZonesClustersMasterCall { + c := &ProjectsZonesClustersMasterCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId - c.startiprotationrequest = startiprotationrequest + c.updatemasterrequest = updatemasterrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersStartIpRotationCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersStartIpRotationCall { +func (c *ProjectsZonesClustersMasterCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersMasterCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -3011,34 +3810,34 @@ func (c *ProjectsZonesClustersStartIpRotationCall) Fields(s ...googleapi.Field) // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersStartIpRotationCall) Context(ctx context.Context) *ProjectsZonesClustersStartIpRotationCall { +func (c *ProjectsZonesClustersMasterCall) Context(ctx context.Context) *ProjectsZonesClustersMasterCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersStartIpRotationCall) Header() http.Header { +func (c *ProjectsZonesClustersMasterCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersStartIpRotationCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersMasterCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.startiprotationrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.updatemasterrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/master") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -3050,14 +3849,14 @@ func (c *ProjectsZonesClustersStartIpRotationCall) doRequest(alt string) (*http. return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.startIpRotation" call. +// Do executes the "container.projects.zones.clusters.master" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersStartIpRotationCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsZonesClustersMasterCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -3088,10 +3887,10 @@ func (c *ProjectsZonesClustersStartIpRotationCall) Do(opts ...googleapi.CallOpti } return ret, nil // { - // "description": "Start master IP rotation.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation", + // "description": "Updates the master of a specific cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/master", // "httpMethod": "POST", - // "id": "container.projects.zones.clusters.startIpRotation", + // "id": "container.projects.zones.clusters.master", // "parameterOrder": [ // "projectId", // "zone", @@ -3099,13 +3898,13 @@ func (c *ProjectsZonesClustersStartIpRotationCall) Do(opts ...googleapi.CallOpti // ], // "parameters": { // "clusterId": { - // "description": "The name of the cluster.", + // "description": "The name of the cluster to upgrade.", // "location": "path", // "required": true, // "type": "string" // }, // "projectId": { - // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", // "location": "path", // "required": true, // "type": "string" @@ -3117,9 +3916,9 @@ func (c *ProjectsZonesClustersStartIpRotationCall) Do(opts ...googleapi.CallOpti // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/master", // "request": { - // "$ref": "StartIPRotationRequest" + // "$ref": "UpdateMasterRequest" // }, // "response": { // "$ref": "Operation" @@ -3131,33 +3930,33 @@ func (c *ProjectsZonesClustersStartIpRotationCall) Do(opts ...googleapi.CallOpti } -// method id "container.projects.zones.clusters.update": +// method id "container.projects.zones.clusters.monitoring": -type ProjectsZonesClustersUpdateCall struct { - s *Service - projectId string - zone string - clusterId string - updateclusterrequest *UpdateClusterRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersMonitoringCall struct { + s *Service + projectId string + zone string + clusterId string + setmonitoringservicerequest *SetMonitoringServiceRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Update: Updates the settings of a specific cluster. -func (r *ProjectsZonesClustersService) Update(projectId string, zone string, clusterId string, updateclusterrequest *UpdateClusterRequest) *ProjectsZonesClustersUpdateCall { - c := &ProjectsZonesClustersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Monitoring: Sets the monitoring service of a specific cluster. +func (r *ProjectsZonesClustersService) Monitoring(projectId string, zone string, clusterId string, setmonitoringservicerequest *SetMonitoringServiceRequest) *ProjectsZonesClustersMonitoringCall { + c := &ProjectsZonesClustersMonitoringCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId - c.updateclusterrequest = updateclusterrequest + c.setmonitoringservicerequest = setmonitoringservicerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersUpdateCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersUpdateCall { +func (c *ProjectsZonesClustersMonitoringCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersMonitoringCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -3165,36 +3964,36 @@ func (c *ProjectsZonesClustersUpdateCall) Fields(s ...googleapi.Field) *Projects // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersUpdateCall) Context(ctx context.Context) *ProjectsZonesClustersUpdateCall { +func (c *ProjectsZonesClustersMonitoringCall) Context(ctx context.Context) *ProjectsZonesClustersMonitoringCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersUpdateCall) Header() http.Header { +func (c *ProjectsZonesClustersMonitoringCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersUpdateCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersMonitoringCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.updateclusterrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setmonitoringservicerequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/monitoring") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("PUT", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "projectId": c.projectId, @@ -3204,14 +4003,14 @@ func (c *ProjectsZonesClustersUpdateCall) doRequest(alt string) (*http.Response, return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.update" call. +// Do executes the "container.projects.zones.clusters.monitoring" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsZonesClustersMonitoringCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -3242,10 +4041,10 @@ func (c *ProjectsZonesClustersUpdateCall) Do(opts ...googleapi.CallOption) (*Ope } return ret, nil // { - // "description": "Updates the settings of a specific cluster.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", - // "httpMethod": "PUT", - // "id": "container.projects.zones.clusters.update", + // "description": "Sets the monitoring service of a specific cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/monitoring", + // "httpMethod": "POST", + // "id": "container.projects.zones.clusters.monitoring", // "parameterOrder": [ // "projectId", // "zone", @@ -3271,9 +4070,9 @@ func (c *ProjectsZonesClustersUpdateCall) Do(opts ...googleapi.CallOption) (*Ope // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/monitoring", // "request": { - // "$ref": "UpdateClusterRequest" + // "$ref": "SetMonitoringServiceRequest" // }, // "response": { // "$ref": "Operation" @@ -3285,33 +4084,33 @@ func (c *ProjectsZonesClustersUpdateCall) Do(opts ...googleapi.CallOption) (*Ope } -// method id "container.projects.zones.clusters.nodePools.create": +// method id "container.projects.zones.clusters.resourceLabels": -type ProjectsZonesClustersNodePoolsCreateCall struct { - s *Service - projectId string - zone string - clusterId string - createnodepoolrequest *CreateNodePoolRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersResourceLabelsCall struct { + s *Service + projectId string + zone string + clusterId string + setlabelsrequest *SetLabelsRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Create: Creates a node pool for a cluster. -func (r *ProjectsZonesClustersNodePoolsService) Create(projectId string, zone string, clusterId string, createnodepoolrequest *CreateNodePoolRequest) *ProjectsZonesClustersNodePoolsCreateCall { - c := &ProjectsZonesClustersNodePoolsCreateCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// ResourceLabels: Sets labels on a cluster. +func (r *ProjectsZonesClustersService) ResourceLabels(projectId string, zone string, clusterId string, setlabelsrequest *SetLabelsRequest) *ProjectsZonesClustersResourceLabelsCall { + c := &ProjectsZonesClustersResourceLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId - c.createnodepoolrequest = createnodepoolrequest + c.setlabelsrequest = setlabelsrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersNodePoolsCreateCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsCreateCall { +func (c *ProjectsZonesClustersResourceLabelsCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersResourceLabelsCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -3319,34 +4118,34 @@ func (c *ProjectsZonesClustersNodePoolsCreateCall) Fields(s ...googleapi.Field) // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersNodePoolsCreateCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsCreateCall { +func (c *ProjectsZonesClustersResourceLabelsCall) Context(ctx context.Context) *ProjectsZonesClustersResourceLabelsCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersNodePoolsCreateCall) Header() http.Header { +func (c *ProjectsZonesClustersResourceLabelsCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersNodePoolsCreateCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersResourceLabelsCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.createnodepoolrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setlabelsrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -3358,14 +4157,14 @@ func (c *ProjectsZonesClustersNodePoolsCreateCall) doRequest(alt string) (*http. return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.nodePools.create" call. +// Do executes the "container.projects.zones.clusters.resourceLabels" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersNodePoolsCreateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsZonesClustersResourceLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -3396,10 +4195,10 @@ func (c *ProjectsZonesClustersNodePoolsCreateCall) Do(opts ...googleapi.CallOpti } return ret, nil // { - // "description": "Creates a node pool for a cluster.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + // "description": "Sets labels on a cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels", // "httpMethod": "POST", - // "id": "container.projects.zones.clusters.nodePools.create", + // "id": "container.projects.zones.clusters.resourceLabels", // "parameterOrder": [ // "projectId", // "zone", @@ -3425,9 +4224,9 @@ func (c *ProjectsZonesClustersNodePoolsCreateCall) Do(opts ...googleapi.CallOpti // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels", // "request": { - // "$ref": "CreateNodePoolRequest" + // "$ref": "SetLabelsRequest" // }, // "response": { // "$ref": "Operation" @@ -3439,33 +4238,37 @@ func (c *ProjectsZonesClustersNodePoolsCreateCall) Do(opts ...googleapi.CallOpti } -// method id "container.projects.zones.clusters.nodePools.delete": +// method id "container.projects.zones.clusters.setMasterAuth": -type ProjectsZonesClustersNodePoolsDeleteCall struct { - s *Service - projectId string - zone string - clusterId string - nodePoolId string - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersSetMasterAuthCall struct { + s *Service + projectId string + zone string + clusterId string + setmasterauthrequest *SetMasterAuthRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Delete: Deletes a node pool from a cluster. -func (r *ProjectsZonesClustersNodePoolsService) Delete(projectId string, zone string, clusterId string, nodePoolId string) *ProjectsZonesClustersNodePoolsDeleteCall { - c := &ProjectsZonesClustersNodePoolsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetMasterAuth: Used to set master auth materials. Currently supports +// :- +// Changing the admin password of a specific cluster. +// This can be either via password generation or explicitly set the +// password. +func (r *ProjectsZonesClustersService) SetMasterAuth(projectId string, zone string, clusterId string, setmasterauthrequest *SetMasterAuthRequest) *ProjectsZonesClustersSetMasterAuthCall { + c := &ProjectsZonesClustersSetMasterAuthCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId - c.nodePoolId = nodePoolId + c.setmasterauthrequest = setmasterauthrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersNodePoolsDeleteCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsDeleteCall { +func (c *ProjectsZonesClustersSetMasterAuthCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersSetMasterAuthCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -3473,49 +4276,53 @@ func (c *ProjectsZonesClustersNodePoolsDeleteCall) Fields(s ...googleapi.Field) // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersNodePoolsDeleteCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsDeleteCall { +func (c *ProjectsZonesClustersSetMasterAuthCall) Context(ctx context.Context) *ProjectsZonesClustersSetMasterAuthCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersNodePoolsDeleteCall) Header() http.Header { +func (c *ProjectsZonesClustersSetMasterAuthCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersNodePoolsDeleteCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersSetMasterAuthCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setmasterauthrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("DELETE", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "projectId": c.projectId, - "zone": c.zone, - "clusterId": c.clusterId, - "nodePoolId": c.nodePoolId, + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.nodePools.delete" call. +// Do executes the "container.projects.zones.clusters.setMasterAuth" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersNodePoolsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsZonesClustersSetMasterAuthCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -3546,31 +4353,24 @@ func (c *ProjectsZonesClustersNodePoolsDeleteCall) Do(opts ...googleapi.CallOpti } return ret, nil // { - // "description": "Deletes a node pool from a cluster.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", - // "httpMethod": "DELETE", - // "id": "container.projects.zones.clusters.nodePools.delete", + // "description": "Used to set master auth materials. Currently supports :-\nChanging the admin password of a specific cluster.\nThis can be either via password generation or explicitly set the password.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth", + // "httpMethod": "POST", + // "id": "container.projects.zones.clusters.setMasterAuth", // "parameterOrder": [ // "projectId", // "zone", - // "clusterId", - // "nodePoolId" + // "clusterId" // ], // "parameters": { // "clusterId": { - // "description": "The name of the cluster.", - // "location": "path", - // "required": true, - // "type": "string" - // }, - // "nodePoolId": { - // "description": "The name of the node pool to delete.", + // "description": "The name of the cluster to upgrade.", // "location": "path", // "required": true, // "type": "string" // }, // "projectId": { - // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", // "location": "path", // "required": true, // "type": "string" @@ -3582,7 +4382,10 @@ func (c *ProjectsZonesClustersNodePoolsDeleteCall) Do(opts ...googleapi.CallOpti // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth", + // "request": { + // "$ref": "SetMasterAuthRequest" + // }, // "response": { // "$ref": "Operation" // }, @@ -3593,79 +4396,1334 @@ func (c *ProjectsZonesClustersNodePoolsDeleteCall) Do(opts ...googleapi.CallOpti } -// method id "container.projects.zones.clusters.nodePools.get": +// method id "container.projects.zones.clusters.setNetworkPolicy": -type ProjectsZonesClustersNodePoolsGetCall struct { - s *Service - projectId string - zone string - clusterId string - nodePoolId string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersSetNetworkPolicyCall struct { + s *Service + projectId string + zone string + clusterId string + setnetworkpolicyrequest *SetNetworkPolicyRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Get: Retrieves the node pool requested. -func (r *ProjectsZonesClustersNodePoolsService) Get(projectId string, zone string, clusterId string, nodePoolId string) *ProjectsZonesClustersNodePoolsGetCall { - c := &ProjectsZonesClustersNodePoolsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetNetworkPolicy: Enables/Disables Network Policy for a cluster. +func (r *ProjectsZonesClustersService) SetNetworkPolicy(projectId string, zone string, clusterId string, setnetworkpolicyrequest *SetNetworkPolicyRequest) *ProjectsZonesClustersSetNetworkPolicyCall { + c := &ProjectsZonesClustersSetNetworkPolicyCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.projectId = projectId + c.zone = zone + c.clusterId = clusterId + c.setnetworkpolicyrequest = setnetworkpolicyrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProjectsZonesClustersSetNetworkPolicyCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersSetNetworkPolicyCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProjectsZonesClustersSetNetworkPolicyCall) Context(ctx context.Context) *ProjectsZonesClustersSetNetworkPolicyCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProjectsZonesClustersSetNetworkPolicyCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProjectsZonesClustersSetNetworkPolicyCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setnetworkpolicyrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setNetworkPolicy") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "container.projects.zones.clusters.setNetworkPolicy" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsZonesClustersSetNetworkPolicyCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Enables/Disables Network Policy for a cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setNetworkPolicy", + // "httpMethod": "POST", + // "id": "container.projects.zones.clusters.setNetworkPolicy", + // "parameterOrder": [ + // "projectId", + // "zone", + // "clusterId" + // ], + // "parameters": { + // "clusterId": { + // "description": "The name of the cluster.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "projectId": { + // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setNetworkPolicy", + // "request": { + // "$ref": "SetNetworkPolicyRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform" + // ] + // } + +} + +// method id "container.projects.zones.clusters.startIpRotation": + +type ProjectsZonesClustersStartIpRotationCall struct { + s *Service + projectId string + zone string + clusterId string + startiprotationrequest *StartIPRotationRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// StartIpRotation: Start master IP rotation. +func (r *ProjectsZonesClustersService) StartIpRotation(projectId string, zone string, clusterId string, startiprotationrequest *StartIPRotationRequest) *ProjectsZonesClustersStartIpRotationCall { + c := &ProjectsZonesClustersStartIpRotationCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.projectId = projectId + c.zone = zone + c.clusterId = clusterId + c.startiprotationrequest = startiprotationrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProjectsZonesClustersStartIpRotationCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersStartIpRotationCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProjectsZonesClustersStartIpRotationCall) Context(ctx context.Context) *ProjectsZonesClustersStartIpRotationCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProjectsZonesClustersStartIpRotationCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProjectsZonesClustersStartIpRotationCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.startiprotationrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "container.projects.zones.clusters.startIpRotation" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsZonesClustersStartIpRotationCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Start master IP rotation.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation", + // "httpMethod": "POST", + // "id": "container.projects.zones.clusters.startIpRotation", + // "parameterOrder": [ + // "projectId", + // "zone", + // "clusterId" + // ], + // "parameters": { + // "clusterId": { + // "description": "The name of the cluster.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "projectId": { + // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation", + // "request": { + // "$ref": "StartIPRotationRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform" + // ] + // } + +} + +// method id "container.projects.zones.clusters.update": + +type ProjectsZonesClustersUpdateCall struct { + s *Service + projectId string + zone string + clusterId string + updateclusterrequest *UpdateClusterRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Update: Updates the settings of a specific cluster. +func (r *ProjectsZonesClustersService) Update(projectId string, zone string, clusterId string, updateclusterrequest *UpdateClusterRequest) *ProjectsZonesClustersUpdateCall { + c := &ProjectsZonesClustersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.projectId = projectId + c.zone = zone + c.clusterId = clusterId + c.updateclusterrequest = updateclusterrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProjectsZonesClustersUpdateCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersUpdateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProjectsZonesClustersUpdateCall) Context(ctx context.Context) *ProjectsZonesClustersUpdateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProjectsZonesClustersUpdateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProjectsZonesClustersUpdateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.updateclusterrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("PUT", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "container.projects.zones.clusters.update" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsZonesClustersUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Updates the settings of a specific cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", + // "httpMethod": "PUT", + // "id": "container.projects.zones.clusters.update", + // "parameterOrder": [ + // "projectId", + // "zone", + // "clusterId" + // ], + // "parameters": { + // "clusterId": { + // "description": "The name of the cluster to upgrade.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "projectId": { + // "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}", + // "request": { + // "$ref": "UpdateClusterRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform" + // ] + // } + +} + +// method id "container.projects.zones.clusters.nodePools.autoscaling": + +type ProjectsZonesClustersNodePoolsAutoscalingCall struct { + s *Service + projectId string + zone string + clusterId string + nodePoolId string + setnodepoolautoscalingrequest *SetNodePoolAutoscalingRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Autoscaling: Sets the autoscaling settings of a specific node pool. +func (r *ProjectsZonesClustersNodePoolsService) Autoscaling(projectId string, zone string, clusterId string, nodePoolId string, setnodepoolautoscalingrequest *SetNodePoolAutoscalingRequest) *ProjectsZonesClustersNodePoolsAutoscalingCall { + c := &ProjectsZonesClustersNodePoolsAutoscalingCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.projectId = projectId + c.zone = zone + c.clusterId = clusterId + c.nodePoolId = nodePoolId + c.setnodepoolautoscalingrequest = setnodepoolautoscalingrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProjectsZonesClustersNodePoolsAutoscalingCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsAutoscalingCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProjectsZonesClustersNodePoolsAutoscalingCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsAutoscalingCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProjectsZonesClustersNodePoolsAutoscalingCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProjectsZonesClustersNodePoolsAutoscalingCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setnodepoolautoscalingrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/autoscaling") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + "nodePoolId": c.nodePoolId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "container.projects.zones.clusters.nodePools.autoscaling" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsZonesClustersNodePoolsAutoscalingCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Sets the autoscaling settings of a specific node pool.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/autoscaling", + // "httpMethod": "POST", + // "id": "container.projects.zones.clusters.nodePools.autoscaling", + // "parameterOrder": [ + // "projectId", + // "zone", + // "clusterId", + // "nodePoolId" + // ], + // "parameters": { + // "clusterId": { + // "description": "The name of the cluster to upgrade.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "nodePoolId": { + // "description": "The name of the node pool to upgrade.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "projectId": { + // "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/autoscaling", + // "request": { + // "$ref": "SetNodePoolAutoscalingRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform" + // ] + // } + +} + +// method id "container.projects.zones.clusters.nodePools.create": + +type ProjectsZonesClustersNodePoolsCreateCall struct { + s *Service + projectId string + zone string + clusterId string + createnodepoolrequest *CreateNodePoolRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Create: Creates a node pool for a cluster. +func (r *ProjectsZonesClustersNodePoolsService) Create(projectId string, zone string, clusterId string, createnodepoolrequest *CreateNodePoolRequest) *ProjectsZonesClustersNodePoolsCreateCall { + c := &ProjectsZonesClustersNodePoolsCreateCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.projectId = projectId + c.zone = zone + c.clusterId = clusterId + c.createnodepoolrequest = createnodepoolrequest + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProjectsZonesClustersNodePoolsCreateCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsCreateCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProjectsZonesClustersNodePoolsCreateCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsCreateCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProjectsZonesClustersNodePoolsCreateCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProjectsZonesClustersNodePoolsCreateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.createnodepoolrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "container.projects.zones.clusters.nodePools.create" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsZonesClustersNodePoolsCreateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Creates a node pool for a cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + // "httpMethod": "POST", + // "id": "container.projects.zones.clusters.nodePools.create", + // "parameterOrder": [ + // "projectId", + // "zone", + // "clusterId" + // ], + // "parameters": { + // "clusterId": { + // "description": "The name of the cluster.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "projectId": { + // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + // "request": { + // "$ref": "CreateNodePoolRequest" + // }, + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform" + // ] + // } + +} + +// method id "container.projects.zones.clusters.nodePools.delete": + +type ProjectsZonesClustersNodePoolsDeleteCall struct { + s *Service + projectId string + zone string + clusterId string + nodePoolId string + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Delete: Deletes a node pool from a cluster. +func (r *ProjectsZonesClustersNodePoolsService) Delete(projectId string, zone string, clusterId string, nodePoolId string) *ProjectsZonesClustersNodePoolsDeleteCall { + c := &ProjectsZonesClustersNodePoolsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.projectId = projectId + c.zone = zone + c.clusterId = clusterId + c.nodePoolId = nodePoolId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProjectsZonesClustersNodePoolsDeleteCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsDeleteCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProjectsZonesClustersNodePoolsDeleteCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsDeleteCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProjectsZonesClustersNodePoolsDeleteCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProjectsZonesClustersNodePoolsDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + "nodePoolId": c.nodePoolId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "container.projects.zones.clusters.nodePools.delete" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsZonesClustersNodePoolsDeleteCall) Do(opts ...googleapi.CallOption) (*Operation, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &Operation{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Deletes a node pool from a cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + // "httpMethod": "DELETE", + // "id": "container.projects.zones.clusters.nodePools.delete", + // "parameterOrder": [ + // "projectId", + // "zone", + // "clusterId", + // "nodePoolId" + // ], + // "parameters": { + // "clusterId": { + // "description": "The name of the cluster.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "nodePoolId": { + // "description": "The name of the node pool to delete.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "projectId": { + // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + // "response": { + // "$ref": "Operation" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform" + // ] + // } + +} + +// method id "container.projects.zones.clusters.nodePools.get": + +type ProjectsZonesClustersNodePoolsGetCall struct { + s *Service + projectId string + zone string + clusterId string + nodePoolId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// Get: Retrieves the node pool requested. +func (r *ProjectsZonesClustersNodePoolsService) Get(projectId string, zone string, clusterId string, nodePoolId string) *ProjectsZonesClustersNodePoolsGetCall { + c := &ProjectsZonesClustersNodePoolsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.projectId = projectId + c.zone = zone + c.clusterId = clusterId + c.nodePoolId = nodePoolId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProjectsZonesClustersNodePoolsGetCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsGetCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ProjectsZonesClustersNodePoolsGetCall) IfNoneMatch(entityTag string) *ProjectsZonesClustersNodePoolsGetCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProjectsZonesClustersNodePoolsGetCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsGetCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProjectsZonesClustersNodePoolsGetCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProjectsZonesClustersNodePoolsGetCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + "nodePoolId": c.nodePoolId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "container.projects.zones.clusters.nodePools.get" call. +// Exactly one of *NodePool or error will be non-nil. Any non-2xx status +// code is an error. Response headers are in either +// *NodePool.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsZonesClustersNodePoolsGetCall) Do(opts ...googleapi.CallOption) (*NodePool, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &NodePool{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Retrieves the node pool requested.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + // "httpMethod": "GET", + // "id": "container.projects.zones.clusters.nodePools.get", + // "parameterOrder": [ + // "projectId", + // "zone", + // "clusterId", + // "nodePoolId" + // ], + // "parameters": { + // "clusterId": { + // "description": "The name of the cluster.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "nodePoolId": { + // "description": "The name of the node pool.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "projectId": { + // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + // "response": { + // "$ref": "NodePool" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform" + // ] + // } + +} + +// method id "container.projects.zones.clusters.nodePools.list": + +type ProjectsZonesClustersNodePoolsListCall struct { + s *Service + projectId string + zone string + clusterId string + urlParams_ gensupport.URLParams + ifNoneMatch_ string + ctx_ context.Context + header_ http.Header +} + +// List: Lists the node pools for a cluster. +func (r *ProjectsZonesClustersNodePoolsService) List(projectId string, zone string, clusterId string) *ProjectsZonesClustersNodePoolsListCall { + c := &ProjectsZonesClustersNodePoolsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} + c.projectId = projectId + c.zone = zone + c.clusterId = clusterId + return c +} + +// Fields allows partial responses to be retrieved. See +// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse +// for more information. +func (c *ProjectsZonesClustersNodePoolsListCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsListCall { + c.urlParams_.Set("fields", googleapi.CombineFields(s)) + return c +} + +// IfNoneMatch sets the optional parameter which makes the operation +// fail if the object's ETag matches the given value. This is useful for +// getting updates only after the object has changed since the last +// request. Use googleapi.IsNotModified to check whether the response +// error from Do is the result of In-None-Match. +func (c *ProjectsZonesClustersNodePoolsListCall) IfNoneMatch(entityTag string) *ProjectsZonesClustersNodePoolsListCall { + c.ifNoneMatch_ = entityTag + return c +} + +// Context sets the context to be used in this call's Do method. Any +// pending HTTP request will be aborted if the provided context is +// canceled. +func (c *ProjectsZonesClustersNodePoolsListCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsListCall { + c.ctx_ = ctx + return c +} + +// Header returns an http.Header that can be modified by the caller to +// add HTTP headers to the request. +func (c *ProjectsZonesClustersNodePoolsListCall) Header() http.Header { + if c.header_ == nil { + c.header_ = make(http.Header) + } + return c.header_ +} + +func (c *ProjectsZonesClustersNodePoolsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + for k, v := range c.header_ { + reqHeaders[k] = v + } + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } + var body io.Reader = nil + c.urlParams_.Set("alt", alt) + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools") + urls += "?" + c.urlParams_.Encode() + req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders + googleapi.Expand(req.URL, map[string]string{ + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + }) + return gensupport.SendRequest(c.ctx_, c.s.client, req) +} + +// Do executes the "container.projects.zones.clusters.nodePools.list" call. +// Exactly one of *ListNodePoolsResponse or error will be non-nil. Any +// non-2xx status code is an error. Response headers are in either +// *ListNodePoolsResponse.ServerResponse.Header or (if a response was +// returned at all) in error.(*googleapi.Error).Header. Use +// googleapi.IsNotModified to check whether the returned error was +// because http.StatusNotModified was returned. +func (c *ProjectsZonesClustersNodePoolsListCall) Do(opts ...googleapi.CallOption) (*ListNodePoolsResponse, error) { + gensupport.SetOptions(c.urlParams_, opts...) + res, err := c.doRequest("json") + if res != nil && res.StatusCode == http.StatusNotModified { + if res.Body != nil { + res.Body.Close() + } + return nil, &googleapi.Error{ + Code: res.StatusCode, + Header: res.Header, + } + } + if err != nil { + return nil, err + } + defer googleapi.CloseBody(res) + if err := googleapi.CheckResponse(res); err != nil { + return nil, err + } + ret := &ListNodePoolsResponse{ + ServerResponse: googleapi.ServerResponse{ + Header: res.Header, + HTTPStatusCode: res.StatusCode, + }, + } + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { + return nil, err + } + return ret, nil + // { + // "description": "Lists the node pools for a cluster.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + // "httpMethod": "GET", + // "id": "container.projects.zones.clusters.nodePools.list", + // "parameterOrder": [ + // "projectId", + // "zone", + // "clusterId" + // ], + // "parameters": { + // "clusterId": { + // "description": "The name of the cluster.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "projectId": { + // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "zone": { + // "description": "The name of the Google Compute Engine\n[zone](/compute/docs/zones#available) in which the cluster\nresides.", + // "location": "path", + // "required": true, + // "type": "string" + // } + // }, + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + // "response": { + // "$ref": "ListNodePoolsResponse" + // }, + // "scopes": [ + // "https://www.googleapis.com/auth/cloud-platform" + // ] + // } + +} + +// method id "container.projects.zones.clusters.nodePools.rollback": + +type ProjectsZonesClustersNodePoolsRollbackCall struct { + s *Service + projectId string + zone string + clusterId string + nodePoolId string + rollbacknodepoolupgraderequest *RollbackNodePoolUpgradeRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header +} + +// Rollback: Roll back the previously Aborted or Failed NodePool +// upgrade. +// This will be an no-op if the last upgrade successfully completed. +func (r *ProjectsZonesClustersNodePoolsService) Rollback(projectId string, zone string, clusterId string, nodePoolId string, rollbacknodepoolupgraderequest *RollbackNodePoolUpgradeRequest) *ProjectsZonesClustersNodePoolsRollbackCall { + c := &ProjectsZonesClustersNodePoolsRollbackCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId c.nodePoolId = nodePoolId + c.rollbacknodepoolupgraderequest = rollbacknodepoolupgraderequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersNodePoolsGetCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsGetCall { +func (c *ProjectsZonesClustersNodePoolsRollbackCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsRollbackCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *ProjectsZonesClustersNodePoolsGetCall) IfNoneMatch(entityTag string) *ProjectsZonesClustersNodePoolsGetCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersNodePoolsGetCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsGetCall { +func (c *ProjectsZonesClustersNodePoolsRollbackCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsRollbackCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersNodePoolsGetCall) Header() http.Header { +func (c *ProjectsZonesClustersNodePoolsRollbackCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersNodePoolsGetCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersNodePoolsRollbackCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollbacknodepoolupgraderequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "projectId": c.projectId, @@ -3676,14 +5734,14 @@ func (c *ProjectsZonesClustersNodePoolsGetCall) doRequest(alt string) (*http.Res return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.nodePools.get" call. -// Exactly one of *NodePool or error will be non-nil. Any non-2xx status -// code is an error. Response headers are in either -// *NodePool.ServerResponse.Header or (if a response was returned at +// Do executes the "container.projects.zones.clusters.nodePools.rollback" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersNodePoolsGetCall) Do(opts ...googleapi.CallOption) (*NodePool, error) { +func (c *ProjectsZonesClustersNodePoolsRollbackCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -3702,7 +5760,7 @@ func (c *ProjectsZonesClustersNodePoolsGetCall) Do(opts ...googleapi.CallOption) if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &NodePool{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -3714,10 +5772,10 @@ func (c *ProjectsZonesClustersNodePoolsGetCall) Do(opts ...googleapi.CallOption) } return ret, nil // { - // "description": "Retrieves the node pool requested.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", - // "httpMethod": "GET", - // "id": "container.projects.zones.clusters.nodePools.get", + // "description": "Roll back the previously Aborted or Failed NodePool upgrade.\nThis will be an no-op if the last upgrade successfully completed.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback", + // "httpMethod": "POST", + // "id": "container.projects.zones.clusters.nodePools.rollback", // "parameterOrder": [ // "projectId", // "zone", @@ -3726,19 +5784,19 @@ func (c *ProjectsZonesClustersNodePoolsGetCall) Do(opts ...googleapi.CallOption) // ], // "parameters": { // "clusterId": { - // "description": "The name of the cluster.", + // "description": "The name of the cluster to rollback.", // "location": "path", // "required": true, // "type": "string" // }, // "nodePoolId": { - // "description": "The name of the node pool.", + // "description": "The name of the node pool to rollback.", // "location": "path", // "required": true, // "type": "string" // }, // "projectId": { - // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", // "location": "path", // "required": true, // "type": "string" @@ -3750,9 +5808,12 @@ func (c *ProjectsZonesClustersNodePoolsGetCall) Do(opts ...googleapi.CallOption) // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback", + // "request": { + // "$ref": "RollbackNodePoolUpgradeRequest" + // }, // "response": { - // "$ref": "NodePool" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform" @@ -3761,94 +5822,90 @@ func (c *ProjectsZonesClustersNodePoolsGetCall) Do(opts ...googleapi.CallOption) } -// method id "container.projects.zones.clusters.nodePools.list": +// method id "container.projects.zones.clusters.nodePools.setManagement": -type ProjectsZonesClustersNodePoolsListCall struct { - s *Service - projectId string - zone string - clusterId string - urlParams_ gensupport.URLParams - ifNoneMatch_ string - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersNodePoolsSetManagementCall struct { + s *Service + projectId string + zone string + clusterId string + nodePoolId string + setnodepoolmanagementrequest *SetNodePoolManagementRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// List: Lists the node pools for a cluster. -func (r *ProjectsZonesClustersNodePoolsService) List(projectId string, zone string, clusterId string) *ProjectsZonesClustersNodePoolsListCall { - c := &ProjectsZonesClustersNodePoolsListCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetManagement: Sets the NodeManagement options for a node pool. +func (r *ProjectsZonesClustersNodePoolsService) SetManagement(projectId string, zone string, clusterId string, nodePoolId string, setnodepoolmanagementrequest *SetNodePoolManagementRequest) *ProjectsZonesClustersNodePoolsSetManagementCall { + c := &ProjectsZonesClustersNodePoolsSetManagementCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId + c.nodePoolId = nodePoolId + c.setnodepoolmanagementrequest = setnodepoolmanagementrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersNodePoolsListCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsListCall { +func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsSetManagementCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } -// IfNoneMatch sets the optional parameter which makes the operation -// fail if the object's ETag matches the given value. This is useful for -// getting updates only after the object has changed since the last -// request. Use googleapi.IsNotModified to check whether the response -// error from Do is the result of In-None-Match. -func (c *ProjectsZonesClustersNodePoolsListCall) IfNoneMatch(entityTag string) *ProjectsZonesClustersNodePoolsListCall { - c.ifNoneMatch_ = entityTag - return c -} - // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersNodePoolsListCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsListCall { +func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsSetManagementCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersNodePoolsListCall) Header() http.Header { +func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersNodePoolsListCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersNodePoolsSetManagementCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - reqHeaders.Set("If-None-Match", c.ifNoneMatch_) - } var body io.Reader = nil + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setnodepoolmanagementrequest) + if err != nil { + return nil, err + } + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement") urls += "?" + c.urlParams_.Encode() - req, _ := http.NewRequest("GET", urls, body) + req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ - "projectId": c.projectId, - "zone": c.zone, - "clusterId": c.clusterId, + "projectId": c.projectId, + "zone": c.zone, + "clusterId": c.clusterId, + "nodePoolId": c.nodePoolId, }) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.nodePools.list" call. -// Exactly one of *ListNodePoolsResponse or error will be non-nil. Any -// non-2xx status code is an error. Response headers are in either -// *ListNodePoolsResponse.ServerResponse.Header or (if a response was -// returned at all) in error.(*googleapi.Error).Header. Use -// googleapi.IsNotModified to check whether the returned error was -// because http.StatusNotModified was returned. -func (c *ProjectsZonesClustersNodePoolsListCall) Do(opts ...googleapi.CallOption) (*ListNodePoolsResponse, error) { +// Do executes the "container.projects.zones.clusters.nodePools.setManagement" call. +// Exactly one of *Operation or error will be non-nil. Any non-2xx +// status code is an error. Response headers are in either +// *Operation.ServerResponse.Header or (if a response was returned at +// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified +// to check whether the returned error was because +// http.StatusNotModified was returned. +func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -3867,7 +5924,7 @@ func (c *ProjectsZonesClustersNodePoolsListCall) Do(opts ...googleapi.CallOption if err := googleapi.CheckResponse(res); err != nil { return nil, err } - ret := &ListNodePoolsResponse{ + ret := &Operation{ ServerResponse: googleapi.ServerResponse{ Header: res.Header, HTTPStatusCode: res.StatusCode, @@ -3879,24 +5936,31 @@ func (c *ProjectsZonesClustersNodePoolsListCall) Do(opts ...googleapi.CallOption } return ret, nil // { - // "description": "Lists the node pools for a cluster.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", - // "httpMethod": "GET", - // "id": "container.projects.zones.clusters.nodePools.list", + // "description": "Sets the NodeManagement options for a node pool.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement", + // "httpMethod": "POST", + // "id": "container.projects.zones.clusters.nodePools.setManagement", // "parameterOrder": [ // "projectId", // "zone", - // "clusterId" + // "clusterId", + // "nodePoolId" // ], // "parameters": { // "clusterId": { - // "description": "The name of the cluster.", + // "description": "The name of the cluster to update.", + // "location": "path", + // "required": true, + // "type": "string" + // }, + // "nodePoolId": { + // "description": "The name of the node pool to update.", // "location": "path", // "required": true, // "type": "string" // }, // "projectId": { - // "description": "The Google Developers Console [project ID or project\nnumber](https://developers.google.com/console/help/new/#projectnumber).", + // "description": "The Google Developers Console [project ID or project\nnumber](https://support.google.com/cloud/answer/6158840).", // "location": "path", // "required": true, // "type": "string" @@ -3908,9 +5972,12 @@ func (c *ProjectsZonesClustersNodePoolsListCall) Do(opts ...googleapi.CallOption // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement", + // "request": { + // "$ref": "SetNodePoolManagementRequest" + // }, // "response": { - // "$ref": "ListNodePoolsResponse" + // "$ref": "Operation" // }, // "scopes": [ // "https://www.googleapis.com/auth/cloud-platform" @@ -3919,37 +5986,35 @@ func (c *ProjectsZonesClustersNodePoolsListCall) Do(opts ...googleapi.CallOption } -// method id "container.projects.zones.clusters.nodePools.rollback": +// method id "container.projects.zones.clusters.nodePools.setSize": -type ProjectsZonesClustersNodePoolsRollbackCall struct { - s *Service - projectId string - zone string - clusterId string - nodePoolId string - rollbacknodepoolupgraderequest *RollbackNodePoolUpgradeRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersNodePoolsSetSizeCall struct { + s *Service + projectId string + zone string + clusterId string + nodePoolId string + setnodepoolsizerequest *SetNodePoolSizeRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// Rollback: Roll back the previously Aborted or Failed NodePool -// upgrade. -// This will be an no-op if the last upgrade successfully completed. -func (r *ProjectsZonesClustersNodePoolsService) Rollback(projectId string, zone string, clusterId string, nodePoolId string, rollbacknodepoolupgraderequest *RollbackNodePoolUpgradeRequest) *ProjectsZonesClustersNodePoolsRollbackCall { - c := &ProjectsZonesClustersNodePoolsRollbackCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// SetSize: Sets the size of a specific node pool. +func (r *ProjectsZonesClustersNodePoolsService) SetSize(projectId string, zone string, clusterId string, nodePoolId string, setnodepoolsizerequest *SetNodePoolSizeRequest) *ProjectsZonesClustersNodePoolsSetSizeCall { + c := &ProjectsZonesClustersNodePoolsSetSizeCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId c.nodePoolId = nodePoolId - c.rollbacknodepoolupgraderequest = rollbacknodepoolupgraderequest + c.setnodepoolsizerequest = setnodepoolsizerequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersNodePoolsRollbackCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsRollbackCall { +func (c *ProjectsZonesClustersNodePoolsSetSizeCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsSetSizeCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -3957,34 +6022,34 @@ func (c *ProjectsZonesClustersNodePoolsRollbackCall) Fields(s ...googleapi.Field // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersNodePoolsRollbackCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsRollbackCall { +func (c *ProjectsZonesClustersNodePoolsSetSizeCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsSetSizeCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersNodePoolsRollbackCall) Header() http.Header { +func (c *ProjectsZonesClustersNodePoolsSetSizeCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersNodePoolsRollbackCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersNodePoolsSetSizeCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollbacknodepoolupgraderequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.setnodepoolsizerequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setSize") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -3997,14 +6062,14 @@ func (c *ProjectsZonesClustersNodePoolsRollbackCall) doRequest(alt string) (*htt return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.nodePools.rollback" call. +// Do executes the "container.projects.zones.clusters.nodePools.setSize" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersNodePoolsRollbackCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsZonesClustersNodePoolsSetSizeCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -4035,10 +6100,10 @@ func (c *ProjectsZonesClustersNodePoolsRollbackCall) Do(opts ...googleapi.CallOp } return ret, nil // { - // "description": "Roll back the previously Aborted or Failed NodePool upgrade.\nThis will be an no-op if the last upgrade successfully completed.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback", + // "description": "Sets the size of a specific node pool.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setSize", // "httpMethod": "POST", - // "id": "container.projects.zones.clusters.nodePools.rollback", + // "id": "container.projects.zones.clusters.nodePools.setSize", // "parameterOrder": [ // "projectId", // "zone", @@ -4047,13 +6112,13 @@ func (c *ProjectsZonesClustersNodePoolsRollbackCall) Do(opts ...googleapi.CallOp // ], // "parameters": { // "clusterId": { - // "description": "The name of the cluster to rollback.", + // "description": "The name of the cluster to update.", // "location": "path", // "required": true, // "type": "string" // }, // "nodePoolId": { - // "description": "The name of the node pool to rollback.", + // "description": "The name of the node pool to update.", // "location": "path", // "required": true, // "type": "string" @@ -4071,9 +6136,9 @@ func (c *ProjectsZonesClustersNodePoolsRollbackCall) Do(opts ...googleapi.CallOp // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setSize", // "request": { - // "$ref": "RollbackNodePoolUpgradeRequest" + // "$ref": "SetNodePoolSizeRequest" // }, // "response": { // "$ref": "Operation" @@ -4085,35 +6150,36 @@ func (c *ProjectsZonesClustersNodePoolsRollbackCall) Do(opts ...googleapi.CallOp } -// method id "container.projects.zones.clusters.nodePools.setManagement": +// method id "container.projects.zones.clusters.nodePools.update": -type ProjectsZonesClustersNodePoolsSetManagementCall struct { - s *Service - projectId string - zone string - clusterId string - nodePoolId string - setnodepoolmanagementrequest *SetNodePoolManagementRequest - urlParams_ gensupport.URLParams - ctx_ context.Context - header_ http.Header +type ProjectsZonesClustersNodePoolsUpdateCall struct { + s *Service + projectId string + zone string + clusterId string + nodePoolId string + updatenodepoolrequest *UpdateNodePoolRequest + urlParams_ gensupport.URLParams + ctx_ context.Context + header_ http.Header } -// SetManagement: Sets the NodeManagement options for a node pool. -func (r *ProjectsZonesClustersNodePoolsService) SetManagement(projectId string, zone string, clusterId string, nodePoolId string, setnodepoolmanagementrequest *SetNodePoolManagementRequest) *ProjectsZonesClustersNodePoolsSetManagementCall { - c := &ProjectsZonesClustersNodePoolsSetManagementCall{s: r.s, urlParams_: make(gensupport.URLParams)} +// Update: Updates the version and/or image type of a specific node +// pool. +func (r *ProjectsZonesClustersNodePoolsService) Update(projectId string, zone string, clusterId string, nodePoolId string, updatenodepoolrequest *UpdateNodePoolRequest) *ProjectsZonesClustersNodePoolsUpdateCall { + c := &ProjectsZonesClustersNodePoolsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)} c.projectId = projectId c.zone = zone c.clusterId = clusterId c.nodePoolId = nodePoolId - c.setnodepoolmanagementrequest = setnodepoolmanagementrequest + c.updatenodepoolrequest = updatenodepoolrequest return c } // Fields allows partial responses to be retrieved. See // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse // for more information. -func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsSetManagementCall { +func (c *ProjectsZonesClustersNodePoolsUpdateCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersNodePoolsUpdateCall { c.urlParams_.Set("fields", googleapi.CombineFields(s)) return c } @@ -4121,34 +6187,34 @@ func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Fields(s ...googleapi. // Context sets the context to be used in this call's Do method. Any // pending HTTP request will be aborted if the provided context is // canceled. -func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsSetManagementCall { +func (c *ProjectsZonesClustersNodePoolsUpdateCall) Context(ctx context.Context) *ProjectsZonesClustersNodePoolsUpdateCall { c.ctx_ = ctx return c } // Header returns an http.Header that can be modified by the caller to // add HTTP headers to the request. -func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Header() http.Header { +func (c *ProjectsZonesClustersNodePoolsUpdateCall) Header() http.Header { if c.header_ == nil { c.header_ = make(http.Header) } return c.header_ } -func (c *ProjectsZonesClustersNodePoolsSetManagementCall) doRequest(alt string) (*http.Response, error) { +func (c *ProjectsZonesClustersNodePoolsUpdateCall) doRequest(alt string) (*http.Response, error) { reqHeaders := make(http.Header) for k, v := range c.header_ { reqHeaders[k] = v } reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil - body, err := googleapi.WithoutDataWrapper.JSONReader(c.setnodepoolmanagementrequest) + body, err := googleapi.WithoutDataWrapper.JSONReader(c.updatenodepoolrequest) if err != nil { return nil, err } reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) - urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement") + urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/update") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) req.Header = reqHeaders @@ -4161,14 +6227,14 @@ func (c *ProjectsZonesClustersNodePoolsSetManagementCall) doRequest(alt string) return gensupport.SendRequest(c.ctx_, c.s.client, req) } -// Do executes the "container.projects.zones.clusters.nodePools.setManagement" call. +// Do executes the "container.projects.zones.clusters.nodePools.update" call. // Exactly one of *Operation or error will be non-nil. Any non-2xx // status code is an error. Response headers are in either // *Operation.ServerResponse.Header or (if a response was returned at // all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified // to check whether the returned error was because // http.StatusNotModified was returned. -func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Do(opts ...googleapi.CallOption) (*Operation, error) { +func (c *ProjectsZonesClustersNodePoolsUpdateCall) Do(opts ...googleapi.CallOption) (*Operation, error) { gensupport.SetOptions(c.urlParams_, opts...) res, err := c.doRequest("json") if res != nil && res.StatusCode == http.StatusNotModified { @@ -4199,10 +6265,10 @@ func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Do(opts ...googleapi.C } return ret, nil // { - // "description": "Sets the NodeManagement options for a node pool.", - // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement", + // "description": "Updates the version and/or image type of a specific node pool.", + // "flatPath": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/update", // "httpMethod": "POST", - // "id": "container.projects.zones.clusters.nodePools.setManagement", + // "id": "container.projects.zones.clusters.nodePools.update", // "parameterOrder": [ // "projectId", // "zone", @@ -4211,13 +6277,13 @@ func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Do(opts ...googleapi.C // ], // "parameters": { // "clusterId": { - // "description": "The name of the cluster to update.", + // "description": "The name of the cluster to upgrade.", // "location": "path", // "required": true, // "type": "string" // }, // "nodePoolId": { - // "description": "The name of the node pool to update.", + // "description": "The name of the node pool to upgrade.", // "location": "path", // "required": true, // "type": "string" @@ -4235,9 +6301,9 @@ func (c *ProjectsZonesClustersNodePoolsSetManagementCall) Do(opts ...googleapi.C // "type": "string" // } // }, - // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement", + // "path": "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/update", // "request": { - // "$ref": "SetNodePoolManagementRequest" + // "$ref": "UpdateNodePoolRequest" // }, // "response": { // "$ref": "Operation" diff --git a/vendor/google.golang.org/api/dns/v1/dns-api.json b/vendor/google.golang.org/api/dns/v1/dns-api.json index 38bdda5bd6231..8fcd79ea45e4a 100644 --- a/vendor/google.golang.org/api/dns/v1/dns-api.json +++ b/vendor/google.golang.org/api/dns/v1/dns-api.json @@ -1,11 +1,11 @@ { "kind": "discovery#restDescription", - "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/RqBsQyB2YZT-ZAkK7pcLByI9SZs\"", + "etag": "\"YWOzh2SDasdU84ArJnpYek-OMdg/gwrprolZcJUNBq_AKpcBKtz0xIE\"", "discoveryVersion": "v1", "id": "dns:v1", "name": "dns", "version": "v1", - "revision": "20161110", + "revision": "20170602", "title": "Google Cloud DNS API", "description": "Configures and serves authoritative DNS records.", "ownerDomain": "google.com", diff --git a/vendor/google.golang.org/api/gensupport/json.go b/vendor/google.golang.org/api/gensupport/json.go index 53331b79b034f..c01e32189f44b 100644 --- a/vendor/google.golang.org/api/gensupport/json.go +++ b/vendor/google.golang.org/api/gensupport/json.go @@ -22,23 +22,33 @@ func MarshalJSON(schema interface{}, forceSendFields, nullFields []string) ([]by return json.Marshal(schema) } - mustInclude := make(map[string]struct{}) + mustInclude := make(map[string]bool) for _, f := range forceSendFields { - mustInclude[f] = struct{}{} + mustInclude[f] = true } - useNull := make(map[string]struct{}) - for _, f := range nullFields { - useNull[f] = struct{}{} + useNull := make(map[string]bool) + useNullMaps := make(map[string]map[string]bool) + for _, nf := range nullFields { + parts := strings.SplitN(nf, ".", 2) + field := parts[0] + if len(parts) == 1 { + useNull[field] = true + } else { + if useNullMaps[field] == nil { + useNullMaps[field] = map[string]bool{} + } + useNullMaps[field][parts[1]] = true + } } - dataMap, err := schemaToMap(schema, mustInclude, useNull) + dataMap, err := schemaToMap(schema, mustInclude, useNull, useNullMaps) if err != nil { return nil, err } return json.Marshal(dataMap) } -func schemaToMap(schema interface{}, mustInclude, useNull map[string]struct{}) (map[string]interface{}, error) { +func schemaToMap(schema interface{}, mustInclude, useNull map[string]bool, useNullMaps map[string]map[string]bool) (map[string]interface{}, error) { m := make(map[string]interface{}) s := reflect.ValueOf(schema) st := s.Type() @@ -59,17 +69,35 @@ func schemaToMap(schema interface{}, mustInclude, useNull map[string]struct{}) ( v := s.Field(i) f := st.Field(i) - if _, ok := useNull[f.Name]; ok { + if useNull[f.Name] { if !isEmptyValue(v) { return nil, fmt.Errorf("field %q in NullFields has non-empty value", f.Name) } m[tag.apiName] = nil continue } + if !includeField(v, f, mustInclude) { continue } + // If map fields are explicitly set to null, use a map[string]interface{}. + if f.Type.Kind() == reflect.Map && useNullMaps[f.Name] != nil { + ms, ok := v.Interface().(map[string]string) + if !ok { + return nil, fmt.Errorf("field %q has keys in NullFields but is not a map[string]string", f.Name) + } + mi := map[string]interface{}{} + for k, v := range ms { + mi[k] = v + } + for k := range useNullMaps[f.Name] { + mi[k] = nil + } + m[tag.apiName] = mi + continue + } + // nil maps are treated as empty maps. if f.Type.Kind() == reflect.Map && v.IsNil() { m[tag.apiName] = map[string]string{} @@ -139,7 +167,7 @@ func parseJSONTag(val string) (jsonTag, error) { } // Reports whether the struct field "f" with value "v" should be included in JSON output. -func includeField(v reflect.Value, f reflect.StructField, mustInclude map[string]struct{}) bool { +func includeField(v reflect.Value, f reflect.StructField, mustInclude map[string]bool) bool { // The regular JSON encoding of a nil pointer is "null", which means "delete this field". // Therefore, we could enable field deletion by honoring pointer fields' presence in the mustInclude set. // However, many fields are not pointers, so there would be no way to delete these fields. @@ -156,8 +184,7 @@ func includeField(v reflect.Value, f reflect.StructField, mustInclude map[string return false } - _, ok := mustInclude[f.Name] - return ok || !isEmptyValue(v) + return mustInclude[f.Name] || !isEmptyValue(v) } // isEmptyValue reports whether v is the empty value for its type. This diff --git a/vendor/google.golang.org/api/gensupport/send.go b/vendor/google.golang.org/api/gensupport/send.go index 3d22f638fc723..092044f448ca8 100644 --- a/vendor/google.golang.org/api/gensupport/send.go +++ b/vendor/google.golang.org/api/gensupport/send.go @@ -5,6 +5,7 @@ package gensupport import ( + "errors" "net/http" "golang.org/x/net/context" @@ -32,6 +33,11 @@ func RegisterHook(h Hook) { // If ctx is non-nil, it calls all hooks, then sends the request with // ctxhttp.Do, then calls any functions returned by the hooks in reverse order. func SendRequest(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { + // Disallow Accept-Encoding because it interferes with the automatic gzip handling + // done by the default http.Transport. See https://github.com/google/google-api-go-client/issues/219. + if _, ok := req.Header["Accept-Encoding"]; ok { + return nil, errors.New("google api: custom Accept-Encoding headers not allowed") + } if ctx == nil { return client.Do(req) } diff --git a/vendor/google.golang.org/api/logging/v2beta1/logging-api.json b/vendor/google.golang.org/api/logging/v2beta1/logging-api.json index 27bf67d13c925..277b084fe6886 100644 --- a/vendor/google.golang.org/api/logging/v2beta1/logging-api.json +++ b/vendor/google.golang.org/api/logging/v2beta1/logging-api.json @@ -1,93 +1,230 @@ { + "canonicalName": "Logging", + "auth": { + "oauth2": { + "scopes": { + "https://www.googleapis.com/auth/logging.write": { + "description": "Submit log data for your projects" + }, + "https://www.googleapis.com/auth/logging.read": { + "description": "View log data for your projects" + }, + "https://www.googleapis.com/auth/logging.admin": { + "description": "Administrate log data for your projects" + }, + "https://www.googleapis.com/auth/cloud-platform.read-only": { + "description": "View your data across Google Cloud Platform services" + }, + "https://www.googleapis.com/auth/cloud-platform": { + "description": "View and manage your data across Google Cloud Platform services" + } + } + } + }, + "rootUrl": "https://logging.googleapis.com/", + "ownerDomain": "google.com", + "name": "logging", + "batchPath": "batch", "title": "Stackdriver Logging API", "ownerName": "Google", "resources": { - "projects": { + "monitoredResourceDescriptors": { + "methods": { + "list": { + "description": "Lists the descriptors for monitored resource types used by Stackdriver Logging.", + "response": { + "$ref": "ListMonitoredResourceDescriptorsResponse" + }, + "parameterOrder": [], + "httpMethod": "GET", + "parameters": { + "pageToken": { + "location": "query", + "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.", + "type": "string" + }, + "pageSize": { + "location": "query", + "format": "int32", + "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", + "type": "integer" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/logging.admin", + "https://www.googleapis.com/auth/logging.read" + ], + "flatPath": "v2beta1/monitoredResourceDescriptors", + "id": "logging.monitoredResourceDescriptors.list", + "path": "v2beta1/monitoredResourceDescriptors" + } + } + }, + "organizations": { "resources": { - "metrics": { + "logs": { "methods": { - "delete": { - "id": "logging.projects.metrics.delete", - "path": "v2beta1/{+metricName}", - "description": "Deletes a logs-based metric.", - "httpMethod": "DELETE", - "parameterOrder": [ - "metricName" - ], + "list": { + "description": "Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have entries are listed.", + "httpMethod": "GET", "response": { - "$ref": "Empty" + "$ref": "ListLogsResponse" }, + "parameterOrder": [ + "parent" + ], "parameters": { - "metricName": { - "description": "The resource name of the metric to delete:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n", + "pageSize": { + "location": "query", + "format": "int32", + "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", + "type": "integer" + }, + "parent": { + "location": "path", + "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\n", + "type": "string", "required": true, + "pattern": "^organizations/[^/]+$" + }, + "pageToken": { "type": "string", - "pattern": "^projects/[^/]+/metrics/[^/]+$", - "location": "path" + "location": "query", + "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call." } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", "https://www.googleapis.com/auth/logging.admin", - "https://www.googleapis.com/auth/logging.write" + "https://www.googleapis.com/auth/logging.read" ], - "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}" + "flatPath": "v2beta1/organizations/{organizationsId}/logs", + "path": "v2beta1/{+parent}/logs", + "id": "logging.organizations.logs.list" }, - "list": { - "description": "Lists logs-based metrics.", - "httpMethod": "GET", + "delete": { "response": { - "$ref": "ListLogMetricsResponse" + "$ref": "Empty" }, "parameterOrder": [ - "parent" + "logName" ], + "httpMethod": "DELETE", + "parameters": { + "logName": { + "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]\"\n\"folders/[FOLDER_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.", + "type": "string", + "required": true, + "pattern": "^organizations/[^/]+/logs/[^/]+$", + "location": "path" + } + }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/logging.admin", - "https://www.googleapis.com/auth/logging.read" + "https://www.googleapis.com/auth/logging.admin" + ], + "flatPath": "v2beta1/organizations/{organizationsId}/logs/{logsId}", + "id": "logging.organizations.logs.delete", + "path": "v2beta1/{+logName}", + "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted." + } + } + } + } + }, + "entries": { + "methods": { + "write": { + "id": "logging.entries.write", + "path": "v2beta1/entries:write", + "description": "Writes log entries to Stackdriver Logging.", + "request": { + "$ref": "WriteLogEntriesRequest" + }, + "response": { + "$ref": "WriteLogEntriesResponse" + }, + "parameterOrder": [], + "httpMethod": "POST", + "parameters": {}, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/logging.admin", + "https://www.googleapis.com/auth/logging.write" + ], + "flatPath": "v2beta1/entries:write" + }, + "list": { + "response": { + "$ref": "ListLogEntriesResponse" + }, + "parameterOrder": [], + "httpMethod": "POST", + "parameters": {}, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/logging.admin", + "https://www.googleapis.com/auth/logging.read" + ], + "flatPath": "v2beta1/entries:list", + "id": "logging.entries.list", + "path": "v2beta1/entries:list", + "description": "Lists log entries. Use this method to retrieve log entries from Stackdriver Logging. For ways to export log entries, see Exporting Logs.", + "request": { + "$ref": "ListLogEntriesRequest" + } + } + } + }, + "projects": { + "resources": { + "sinks": { + "methods": { + "delete": { + "httpMethod": "DELETE", + "response": { + "$ref": "Empty" + }, + "parameterOrder": [ + "sinkName" ], "parameters": { - "parent": { - "description": "Required. The name of the project containing the metrics:\n\"projects/[PROJECT_ID]\"\n", - "required": true, + "sinkName": { + "pattern": "^projects/[^/]+/sinks/[^/]+$", + "location": "path", + "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]\"\n\"folders/[FOLDER_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".", "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" - }, - "pageToken": { - "location": "query", - "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.", - "type": "string" - }, - "pageSize": { - "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", - "format": "int32", - "type": "integer", - "location": "query" + "required": true } }, - "flatPath": "v2beta1/projects/{projectsId}/metrics", - "id": "logging.projects.metrics.list", - "path": "v2beta1/{+parent}/metrics" + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/logging.admin" + ], + "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}", + "path": "v2beta1/{+sinkName}", + "id": "logging.projects.sinks.delete", + "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted." }, "get": { - "description": "Gets a logs-based metric.", "response": { - "$ref": "LogMetric" + "$ref": "LogSink" }, "parameterOrder": [ - "metricName" + "sinkName" ], "httpMethod": "GET", "parameters": { - "metricName": { - "pattern": "^projects/[^/]+/metrics/[^/]+$", + "sinkName": { + "pattern": "^projects/[^/]+/sinks/[^/]+$", "location": "path", - "description": "The resource name of the desired metric:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n", - "required": true, - "type": "string" + "description": "Required. The resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]\"\n\"folders/[FOLDER_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".", + "type": "string", + "required": true } }, "scopes": [ @@ -96,95 +233,143 @@ "https://www.googleapis.com/auth/logging.admin", "https://www.googleapis.com/auth/logging.read" ], - "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}", - "path": "v2beta1/{+metricName}", - "id": "logging.projects.metrics.get" + "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}", + "id": "logging.projects.sinks.get", + "path": "v2beta1/{+sinkName}", + "description": "Gets a sink." }, - "update": { - "id": "logging.projects.metrics.update", - "path": "v2beta1/{+metricName}", - "request": { - "$ref": "LogMetric" + "list": { + "response": { + "$ref": "ListSinksResponse" }, - "description": "Creates or updates a logs-based metric.", + "parameterOrder": [ + "parent" + ], + "httpMethod": "GET", + "parameters": { + "pageToken": { + "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.", + "type": "string", + "location": "query" + }, + "pageSize": { + "location": "query", + "format": "int32", + "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", + "type": "integer" + }, + "parent": { + "pattern": "^projects/[^/]+$", + "location": "path", + "description": "Required. The parent resource whose sinks are to be listed:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\n", + "type": "string", + "required": true + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/logging.admin", + "https://www.googleapis.com/auth/logging.read" + ], + "flatPath": "v2beta1/projects/{projectsId}/sinks", + "id": "logging.projects.sinks.list", + "path": "v2beta1/{+parent}/sinks", + "description": "Lists sinks." + }, + "update": { "httpMethod": "PUT", "parameterOrder": [ - "metricName" + "sinkName" ], "response": { - "$ref": "LogMetric" + "$ref": "LogSink" }, "parameters": { - "metricName": { - "pattern": "^projects/[^/]+/metrics/[^/]+$", + "uniqueWriterIdentity": { + "location": "query", + "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value is false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value is true and the new value is set to false or defaulted to false.", + "type": "boolean" + }, + "sinkName": { "location": "path", - "description": "The resource name of the metric to update:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\nThe updated metric must be provided in the request and it's name field must be the same as [METRIC_ID] If the metric does not exist in [PROJECT_ID], then a new metric is created.", + "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]\"\n\"folders/[FOLDER_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".", + "type": "string", "required": true, - "type": "string" + "pattern": "^projects/[^/]+/sinks/[^/]+$" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/logging.admin", - "https://www.googleapis.com/auth/logging.write" + "https://www.googleapis.com/auth/logging.admin" ], - "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}" + "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}", + "path": "v2beta1/{+sinkName}", + "id": "logging.projects.sinks.update", + "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field.", + "request": { + "$ref": "LogSink" + } }, "create": { "request": { - "$ref": "LogMetric" + "$ref": "LogSink" + }, + "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.", + "response": { + "$ref": "LogSink" }, - "description": "Creates a logs-based metric.", - "httpMethod": "POST", "parameterOrder": [ "parent" ], - "response": { - "$ref": "LogMetric" - }, + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/logging.admin" + ], "parameters": { "parent": { - "description": "The resource name of the project in which to create the metric:\n\"projects/[PROJECT_ID]\"\nThe new metric must be provided in the request.", - "required": true, + "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\".", "type": "string", + "required": true, "pattern": "^projects/[^/]+$", "location": "path" + }, + "uniqueWriterIdentity": { + "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is the same group or service account used by Stackdriver Logging before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.", + "type": "boolean", + "location": "query" } }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/logging.admin", - "https://www.googleapis.com/auth/logging.write" - ], - "flatPath": "v2beta1/projects/{projectsId}/metrics", - "id": "logging.projects.metrics.create", - "path": "v2beta1/{+parent}/metrics" + "flatPath": "v2beta1/projects/{projectsId}/sinks", + "id": "logging.projects.sinks.create", + "path": "v2beta1/{+parent}/sinks" } } }, "logs": { "methods": { "delete": { + "httpMethod": "DELETE", "response": { "$ref": "Empty" }, "parameterOrder": [ "logName" ], - "httpMethod": "DELETE", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/logging.admin" - ], "parameters": { "logName": { - "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]\"\n\"folders/[FOLDER_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.", - "required": true, "type": "string", + "required": true, "pattern": "^projects/[^/]+/logs/[^/]+$", - "location": "path" + "location": "path", + "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]\"\n\"folders/[FOLDER_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry." } }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/logging.admin" + ], "flatPath": "v2beta1/projects/{projectsId}/logs/{logsId}", "path": "v2beta1/{+logName}", "id": "logging.projects.logs.delete", @@ -192,13 +377,13 @@ }, "list": { "description": "Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have entries are listed.", + "httpMethod": "GET", "parameterOrder": [ "parent" ], "response": { "$ref": "ListLogsResponse" }, - "httpMethod": "GET", "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/cloud-platform.read-only", @@ -207,22 +392,22 @@ ], "parameters": { "parent": { + "pattern": "^projects/[^/]+$", + "location": "path", "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\n", - "required": true, "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" + "required": true }, "pageToken": { + "location": "query", "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.", - "type": "string", - "location": "query" + "type": "string" }, "pageSize": { + "type": "integer", "location": "query", - "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", "format": "int32", - "type": "integer" + "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available." } }, "flatPath": "v2beta1/projects/{projectsId}/logs", @@ -231,214 +416,134 @@ } } }, - "sinks": { + "metrics": { "methods": { - "create": { - "request": { - "$ref": "LogSink" - }, - "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.", - "httpMethod": "POST", - "parameterOrder": [ - "parent" - ], - "response": { - "$ref": "LogSink" - }, + "update": { "parameters": { - "parent": { - "pattern": "^projects/[^/]+$", + "metricName": { "location": "path", - "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\".", - "required": true, - "type": "string" - }, - "uniqueWriterIdentity": { - "location": "query", - "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is the same group or service account used by Stackdriver Logging before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.", - "type": "boolean" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/logging.admin" - ], - "flatPath": "v2beta1/projects/{projectsId}/sinks", - "id": "logging.projects.sinks.create", - "path": "v2beta1/{+parent}/sinks" - }, - "delete": { - "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted.", - "parameterOrder": [ - "sinkName" - ], - "response": { - "$ref": "Empty" - }, - "httpMethod": "DELETE", - "parameters": { - "sinkName": { - "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]\"\n\"folders/[FOLDER_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".", - "required": true, + "description": "The resource name of the metric to update:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\nThe updated metric must be provided in the request and it's name field must be the same as [METRIC_ID] If the metric does not exist in [PROJECT_ID], then a new metric is created.", "type": "string", - "pattern": "^projects/[^/]+/sinks/[^/]+$", - "location": "path" + "required": true, + "pattern": "^projects/[^/]+/metrics/[^/]+$" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/logging.admin" - ], - "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}", - "path": "v2beta1/{+sinkName}", - "id": "logging.projects.sinks.delete" - }, - "list": { - "response": { - "$ref": "ListSinksResponse" - }, - "parameterOrder": [ - "parent" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", "https://www.googleapis.com/auth/logging.admin", - "https://www.googleapis.com/auth/logging.read" + "https://www.googleapis.com/auth/logging.write" ], - "parameters": { - "parent": { - "description": "Required. The parent resource whose sinks are to be listed:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\n", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" - }, - "pageToken": { - "location": "query", - "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.", - "type": "string" - }, - "pageSize": { - "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", - "format": "int32", - "type": "integer", - "location": "query" - } + "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}", + "id": "logging.projects.metrics.update", + "path": "v2beta1/{+metricName}", + "description": "Creates or updates a logs-based metric.", + "request": { + "$ref": "LogMetric" }, - "flatPath": "v2beta1/projects/{projectsId}/sinks", - "path": "v2beta1/{+parent}/sinks", - "id": "logging.projects.sinks.list", - "description": "Lists sinks." - }, - "get": { - "description": "Gets a sink.", - "httpMethod": "GET", "response": { - "$ref": "LogSink" + "$ref": "LogMetric" }, "parameterOrder": [ - "sinkName" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/logging.admin", - "https://www.googleapis.com/auth/logging.read" + "metricName" ], - "parameters": { - "sinkName": { - "description": "Required. The resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]\"\n\"folders/[FOLDER_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/sinks/[^/]+$", - "location": "path" - } - }, - "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}", - "id": "logging.projects.sinks.get", - "path": "v2beta1/{+sinkName}" + "httpMethod": "PUT" }, - "update": { - "httpMethod": "PUT", - "parameterOrder": [ - "sinkName" - ], + "create": { "response": { - "$ref": "LogSink" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/logging.admin" + "$ref": "LogMetric" + }, + "parameterOrder": [ + "parent" ], + "httpMethod": "POST", "parameters": { - "sinkName": { - "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]\"\n\"folders/[FOLDER_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".", - "required": true, + "parent": { + "description": "The resource name of the project in which to create the metric:\n\"projects/[PROJECT_ID]\"\nThe new metric must be provided in the request.", "type": "string", - "pattern": "^projects/[^/]+/sinks/[^/]+$", + "required": true, + "pattern": "^projects/[^/]+$", "location": "path" - }, - "uniqueWriterIdentity": { - "location": "query", - "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value is false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value is true and the new value is false.", - "type": "boolean" } }, - "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}", - "id": "logging.projects.sinks.update", - "path": "v2beta1/{+sinkName}", - "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field.", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/logging.admin", + "https://www.googleapis.com/auth/logging.write" + ], + "flatPath": "v2beta1/projects/{projectsId}/metrics", + "id": "logging.projects.metrics.create", + "path": "v2beta1/{+parent}/metrics", + "description": "Creates a logs-based metric.", "request": { - "$ref": "LogSink" + "$ref": "LogMetric" } - } - } - } - } - }, - "billingAccounts": { - "resources": { - "logs": { - "methods": { + }, "delete": { + "httpMethod": "DELETE", + "parameterOrder": [ + "metricName" + ], + "response": { + "$ref": "Empty" + }, "parameters": { - "logName": { - "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]\"\n\"folders/[FOLDER_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.", - "required": true, + "metricName": { + "description": "The resource name of the metric to delete:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n", "type": "string", - "pattern": "^billingAccounts/[^/]+/logs/[^/]+$", + "required": true, + "pattern": "^projects/[^/]+/metrics/[^/]+$", "location": "path" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/logging.admin" + "https://www.googleapis.com/auth/logging.admin", + "https://www.googleapis.com/auth/logging.write" ], - "flatPath": "v2beta1/billingAccounts/{billingAccountsId}/logs/{logsId}", - "id": "logging.billingAccounts.logs.delete", - "path": "v2beta1/{+logName}", - "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.", - "httpMethod": "DELETE", + "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}", + "path": "v2beta1/{+metricName}", + "id": "logging.projects.metrics.delete", + "description": "Deletes a logs-based metric." + }, + "get": { + "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}", + "id": "logging.projects.metrics.get", + "path": "v2beta1/{+metricName}", + "description": "Gets a logs-based metric.", + "response": { + "$ref": "LogMetric" + }, "parameterOrder": [ - "logName" + "metricName" ], - "response": { - "$ref": "Empty" + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/logging.admin", + "https://www.googleapis.com/auth/logging.read" + ], + "parameters": { + "metricName": { + "location": "path", + "description": "The resource name of the desired metric:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/metrics/[^/]+$" + } } }, "list": { - "id": "logging.billingAccounts.logs.list", - "path": "v2beta1/{+parent}/logs", - "description": "Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have entries are listed.", - "httpMethod": "GET", + "id": "logging.projects.metrics.list", + "path": "v2beta1/{+parent}/metrics", + "description": "Lists logs-based metrics.", "response": { - "$ref": "ListLogsResponse" + "$ref": "ListLogMetricsResponse" }, "parameterOrder": [ "parent" ], + "httpMethod": "GET", "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/cloud-platform.read-only", @@ -447,69 +552,39 @@ ], "parameters": { "pageToken": { - "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.", "type": "string", - "location": "query" + "location": "query", + "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call." }, "pageSize": { "location": "query", - "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", "format": "int32", + "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", "type": "integer" }, "parent": { - "pattern": "^billingAccounts/[^/]+$", + "pattern": "^projects/[^/]+$", "location": "path", - "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\n", - "required": true, - "type": "string" + "description": "Required. The name of the project containing the metrics:\n\"projects/[PROJECT_ID]\"\n", + "type": "string", + "required": true } }, - "flatPath": "v2beta1/billingAccounts/{billingAccountsId}/logs" + "flatPath": "v2beta1/projects/{projectsId}/metrics" } } } } }, - "monitoredResourceDescriptors": { - "methods": { - "list": { - "path": "v2beta1/monitoredResourceDescriptors", - "id": "logging.monitoredResourceDescriptors.list", - "description": "Lists the descriptors for monitored resource types used by Stackdriver Logging.", - "parameterOrder": [], - "response": { - "$ref": "ListMonitoredResourceDescriptorsResponse" - }, - "httpMethod": "GET", - "parameters": { - "pageToken": { - "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.", - "type": "string", - "location": "query" - }, - "pageSize": { - "location": "query", - "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", - "format": "int32", - "type": "integer" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/logging.admin", - "https://www.googleapis.com/auth/logging.read" - ], - "flatPath": "v2beta1/monitoredResourceDescriptors" - } - } - }, - "organizations": { + "billingAccounts": { "resources": { "logs": { "methods": { "delete": { + "flatPath": "v2beta1/billingAccounts/{billingAccountsId}/logs/{logsId}", + "id": "logging.billingAccounts.logs.delete", + "path": "v2beta1/{+logName}", + "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.", "response": { "$ref": "Empty" }, @@ -520,47 +595,43 @@ "parameters": { "logName": { "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]\"\n\"folders/[FOLDER_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.", - "required": true, "type": "string", - "pattern": "^organizations/[^/]+/logs/[^/]+$", + "required": true, + "pattern": "^billingAccounts/[^/]+/logs/[^/]+$", "location": "path" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/logging.admin" - ], - "flatPath": "v2beta1/organizations/{organizationsId}/logs/{logsId}", - "path": "v2beta1/{+logName}", - "id": "logging.organizations.logs.delete", - "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted." + ] }, "list": { - "httpMethod": "GET", "response": { "$ref": "ListLogsResponse" }, "parameterOrder": [ "parent" ], + "httpMethod": "GET", "parameters": { + "parent": { + "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\n", + "type": "string", + "required": true, + "pattern": "^billingAccounts/[^/]+$", + "location": "path" + }, "pageToken": { "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.", "type": "string", "location": "query" }, "pageSize": { - "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", + "location": "query", "format": "int32", - "type": "integer", - "location": "query" - }, - "parent": { - "pattern": "^organizations/[^/]+$", - "location": "path", - "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\n", - "required": true, - "type": "string" + "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.", + "type": "integer" } }, "scopes": [ @@ -569,102 +640,60 @@ "https://www.googleapis.com/auth/logging.admin", "https://www.googleapis.com/auth/logging.read" ], - "flatPath": "v2beta1/organizations/{organizationsId}/logs", - "id": "logging.organizations.logs.list", + "flatPath": "v2beta1/billingAccounts/{billingAccountsId}/logs", + "id": "logging.billingAccounts.logs.list", "path": "v2beta1/{+parent}/logs", "description": "Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have entries are listed." } } } } - }, - "entries": { - "methods": { - "list": { - "response": { - "$ref": "ListLogEntriesResponse" - }, - "parameterOrder": [], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/logging.admin", - "https://www.googleapis.com/auth/logging.read" - ], - "parameters": {}, - "flatPath": "v2beta1/entries:list", - "path": "v2beta1/entries:list", - "id": "logging.entries.list", - "description": "Lists log entries. Use this method to retrieve log entries from Stackdriver Logging. For ways to export log entries, see Exporting Logs.", - "request": { - "$ref": "ListLogEntriesRequest" - } - }, - "write": { - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/logging.admin", - "https://www.googleapis.com/auth/logging.write" - ], - "parameters": {}, - "flatPath": "v2beta1/entries:write", - "id": "logging.entries.write", - "path": "v2beta1/entries:write", - "description": "Writes log entries to Stackdriver Logging.", - "request": { - "$ref": "WriteLogEntriesRequest" - }, - "httpMethod": "POST", - "parameterOrder": [], - "response": { - "$ref": "WriteLogEntriesResponse" - } - } - } } }, "parameters": { "upload_protocol": { + "location": "query", "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", - "type": "string", - "location": "query" + "type": "string" }, "prettyPrint": { + "location": "query", "description": "Returns response with indentations and line breaks.", - "type": "boolean", "default": "true", - "location": "query" - }, - "fields": { - "description": "Selector specifying which fields to include in a partial response.", - "type": "string", - "location": "query" + "type": "boolean" }, "uploadType": { + "location": "query", "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").", - "type": "string", - "location": "query" + "type": "string" }, - "callback": { + "fields": { "location": "query", - "description": "JSONP", + "description": "Selector specifying which fields to include in a partial response.", "type": "string" }, "$.xgafv": { + "location": "query", + "enum": [ + "1", + "2" + ], "description": "V1 error format.", "type": "string", "enumDescriptions": [ "v1 error format", "v2 error format" - ], - "location": "query", - "enum": [ - "1", - "2" ] }, + "callback": { + "description": "JSONP", + "type": "string", + "location": "query" + }, "alt": { + "location": "query", + "description": "Data format for response.", + "default": "json", "enum": [ "json", "media", @@ -675,36 +704,33 @@ "Responses with Content-Type of application/json", "Media download with context-dependent Content-Type", "Responses with Content-Type of application/x-protobuf" - ], - "location": "query", - "description": "Data format for response.", - "default": "json" - }, - "key": { - "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", - "type": "string", - "location": "query" + ] }, "access_token": { "description": "OAuth access token.", "type": "string", "location": "query" }, + "key": { + "location": "query", + "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", + "type": "string" + }, "quotaUser": { "location": "query", "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", "type": "string" }, "pp": { + "location": "query", "description": "Pretty-print response.", - "type": "boolean", "default": "true", - "location": "query" + "type": "boolean" }, "bearer_token": { + "location": "query", "description": "OAuth bearer token.", - "type": "string", - "location": "query" + "type": "string" }, "oauth_token": { "location": "query", @@ -714,176 +740,48 @@ }, "version": "v2beta1", "baseUrl": "https://logging.googleapis.com/", - "servicePath": "", - "description": "Writes log entries and manages your Stackdriver Logging configuration.", "kind": "discovery#restDescription", + "description": "Writes log entries and manages your Stackdriver Logging configuration.", + "servicePath": "", "basePath": "", - "documentationLink": "https://cloud.google.com/logging/docs/", - "revision": "20170410", "id": "logging:v2beta1", + "revision": "20170717", + "documentationLink": "https://cloud.google.com/logging/docs/", "discoveryVersion": "v1", "version_module": "True", "schemas": { - "MonitoredResourceDescriptor": { - "id": "MonitoredResourceDescriptor", - "description": "An object that describes the schema of a MonitoredResource object using a type name and a set of labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of \"gce_instance\" and specifies the use of the labels \"instance_id\" and \"zone\" to identify particular VM instances.Different APIs can support different monitored resource types. APIs generally provide a list method that returns the monitored resource descriptors used by the API.", - "type": "object", - "properties": { - "name": { - "description": "Optional. The resource name of the monitored resource descriptor: \"projects/{project_id}/monitoredResourceDescriptors/{type}\" where {type} is the value of the type field in this object and {project_id} is a project ID that provides API-specific context for accessing the type. APIs that do not use project information can use the resource name format \"monitoredResourceDescriptors/{type}\".", - "type": "string" - }, - "displayName": { - "description": "Optional. A concise name for the monitored resource type that might be displayed in user interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example, \"Google Cloud SQL Database\".", - "type": "string" - }, - "description": { - "description": "Optional. A detailed description of the monitored resource type that might be used in documentation.", - "type": "string" - }, - "type": { - "description": "Required. The monitored resource type. For example, the type \"cloudsql_database\" represents databases in Google Cloud SQL. The maximum length of this value is 256 characters.", - "type": "string" - }, - "labels": { - "description": "Required. A set of labels used to describe instances of this monitored resource type. For example, an individual Google Cloud SQL database is identified by values for the labels \"database_id\" and \"zone\".", - "type": "array", - "items": { - "$ref": "LabelDescriptor" - } - } - } - }, - "LogEntrySourceLocation": { - "description": "Additional information about the source code location that produced the log entry.", - "type": "object", - "properties": { - "file": { - "description": "Optional. Source file name. Depending on the runtime environment, this might be a simple name or a fully-qualified name.", - "type": "string" - }, - "function": { - "description": "Optional. Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information may be used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python).", - "type": "string" - }, - "line": { - "description": "Optional. Line within the source file. 1-based; 0 indicates no line number available.", - "format": "int64", - "type": "string" - } - }, - "id": "LogEntrySourceLocation" - }, - "ListLogEntriesResponse": { - "description": "Result returned from ListLogEntries.", - "type": "object", - "properties": { - "nextPageToken": { - "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.If a value for next_page_token appears and the entries field is empty, it means that the search found no log entries so far but it did not have time to search all the possible log entries. Retry the method with this value for page_token to continue the search. Alternatively, consider speeding up the search by changing your filter to specify a single log name or resource type, or to narrow the time range of the search.", - "type": "string" - }, - "entries": { - "description": "A list of log entries.", - "type": "array", - "items": { - "$ref": "LogEntry" - } - } - }, - "id": "ListLogEntriesResponse" - }, - "LogLine": { - "id": "LogLine", - "description": "Application log line emitted while processing a request.", - "type": "object", - "properties": { - "sourceLocation": { - "$ref": "SourceLocation", - "description": "Where in the source code this log message was written." - }, - "time": { - "description": "Approximate time when this log entry was made.", - "format": "google-datetime", - "type": "string" - }, - "severity": { - "description": "Severity of this log entry.", - "type": "string", - "enumDescriptions": [ - "(0) The log entry has no assigned severity level.", - "(100) Debug or trace information.", - "(200) Routine information, such as ongoing status or performance.", - "(300) Normal but significant events, such as start up, shut down, or a configuration change.", - "(400) Warning events might cause problems.", - "(500) Error events are likely to cause problems.", - "(600) Critical events cause more severe problems or outages.", - "(700) A person must take an action immediately.", - "(800) One or more systems are unusable." - ], - "enum": [ - "DEFAULT", - "DEBUG", - "INFO", - "NOTICE", - "WARNING", - "ERROR", - "CRITICAL", - "ALERT", - "EMERGENCY" - ] - }, - "logMessage": { - "description": "App-provided log message.", - "type": "string" - } - } - }, - "ListLogMetricsResponse": { - "id": "ListLogMetricsResponse", - "description": "Result returned from ListLogMetrics.", - "type": "object", - "properties": { - "metrics": { - "description": "A list of logs-based metrics.", - "type": "array", - "items": { - "$ref": "LogMetric" - } - }, - "nextPageToken": { - "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.", - "type": "string" - } - } - }, "Empty": { - "id": "Empty", - "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.", "type": "object", - "properties": {} + "properties": {}, + "id": "Empty", + "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}." }, "LogEntry": { - "id": "LogEntry", "description": "An individual entry in a log.", "type": "object", "properties": { - "timestamp": { - "description": "Optional. The time the event described by the log entry occurred. If omitted in a new log entry, Stackdriver Logging will insert the time the log entry is received. Stackdriver Logging might reject log entries whose time stamps are more than a couple of hours in the future. Log entries with time stamps in the past are accepted.", + "receiveTimestamp": { "format": "google-datetime", + "description": "Output only. The time the log entry was received by Stackdriver Logging.", "type": "string" }, + "timestamp": { + "type": "string", + "format": "google-datetime", + "description": "Optional. The time the event described by the log entry occurred. If omitted in a new log entry, Stackdriver Logging will insert the time the log entry is received. Stackdriver Logging might reject log entries whose time stamps are more than a couple of hours in the future. Log entries with time stamps in the past are accepted." + }, "logName": { "description": "Required. The resource name of the log to which this log entry belongs:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]\"\n\"folders/[FOLDER_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded within log_name. Example: \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". [LOG_ID] must be less than 512 characters long and can only include the following characters: upper and lower case alphanumeric characters, forward-slash, underscore, hyphen, and period.For backward compatibility, if log_name begins with a forward-slash, such as /projects/..., then the log entry is ingested as usual but the forward-slash is removed. Listing the log entry will not show the leading slash and filtering for a log name with a leading slash will never return any results.", "type": "string" }, + "httpRequest": { + "$ref": "HttpRequest", + "description": "Optional. Information about the HTTP request associated with this log entry, if applicable." + }, "resource": { "description": "Required. The monitored resource associated with this log entry. Example: a log entry that reports a database error would be associated with the monitored resource designating the particular database that reported the error.", "$ref": "MonitoredResource" }, - "httpRequest": { - "description": "Optional. Information about the HTTP request associated with this log entry, if applicable.", - "$ref": "HttpRequest" - }, "jsonPayload": { "additionalProperties": { "description": "Properties of the object.", @@ -906,24 +804,26 @@ }, "protoPayload": { "additionalProperties": { - "description": "Properties of the object. Contains field @type with type URL.", - "type": "any" + "type": "any", + "description": "Properties of the object. Contains field @type with type URL." }, "description": "The log entry payload, represented as a protocol buffer. Some Google Cloud Platform services use this field for their log entry payloads.", "type": "object" }, - "labels": { - "description": "Optional. A set of user-defined (key, value) data that provides additional information about the log entry.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, "trace": { "description": "Optional. Resource name of the trace associated with the log entry, if any. If it contains a relative resource name, the name is assumed to be relative to //tracing.googleapis.com. Example: projects/my-projectid/traces/06796866738c859f2f19b7cfb3214824", "type": "string" }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Optional. A set of user-defined (key, value) data that provides additional information about the log entry.", + "type": "object" + }, "severity": { + "description": "Optional. The severity of the log entry. The default value is LogSeverity.DEFAULT.", + "type": "string", "enumDescriptions": [ "(0) The log entry has no assigned severity level.", "(100) Debug or trace information.", @@ -945,15 +845,14 @@ "CRITICAL", "ALERT", "EMERGENCY" - ], - "description": "Optional. The severity of the log entry. The default value is LogSeverity.DEFAULT.", - "type": "string" + ] }, "sourceLocation": { "$ref": "LogEntrySourceLocation", "description": "Optional. Source code location information associated with the log entry, if any." } - } + }, + "id": "LogEntry" }, "SourceLocation": { "description": "Specifies a location in a source code file.", @@ -964,158 +863,84 @@ "type": "string" }, "functionName": { - "description": "Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information is used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python).", - "type": "string" + "type": "string", + "description": "Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information is used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python)." }, "line": { - "description": "Line within the source file.", - "format": "int64", - "type": "string" - } - }, - "id": "SourceLocation" - }, - "ListLogEntriesRequest": { - "description": "The parameters to ListLogEntries.", - "type": "object", - "properties": { - "orderBy": { - "description": "Optional. How the results should be sorted. Presently, the only permitted values are \"timestamp asc\" (default) and \"timestamp desc\". The first option returns entries in order of increasing values of LogEntry.timestamp (oldest first), and the second option returns entries in order of decreasing timestamps (newest first). Entries with equal timestamps are returned in order of their insert_id values.", - "type": "string" - }, - "resourceNames": { - "description": "Required. Names of one or more parent resources from which to retrieve log entries:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\nProjects listed in the project_ids field are added to this list.", - "type": "array", - "items": { - "type": "string" - } - }, - "projectIds": { - "description": "Deprecated. Use resource_names instead. One or more project identifiers or project numbers from which to retrieve log entries. Example: \"my-project-1A\". If present, these project identifiers are converted to resource name format and added to the list of resources in resource_names.", - "type": "array", - "items": { - "type": "string" - } - }, - "filter": { - "description": "Optional. A filter that chooses which log entries to return. See Advanced Logs Filters. Only log entries that match the filter are returned. An empty filter matches all log entries in the resources listed in resource_names. Referencing a parent resource that is not listed in resource_names will cause the filter to return no results. The maximum length of the filter is 20000 characters.", - "type": "string" - }, - "pageToken": { - "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. page_token must be the value of next_page_token from the previous response. The values of other method parameters should be identical to those in the previous call.", - "type": "string" - }, - "pageSize": { - "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of next_page_token in the response indicates that more results might be available.", - "format": "int32", - "type": "integer" - } - }, - "id": "ListLogEntriesRequest" - }, - "RequestLog": { - "description": "Complete log information about a single HTTP request to an App Engine application.", - "type": "object", - "properties": { - "endTime": { - "description": "Time when the request finished.", - "format": "google-datetime", - "type": "string" - }, - "userAgent": { - "description": "User agent that made the request.", - "type": "string" - }, - "wasLoadingRequest": { - "description": "Whether this was a loading request for the instance.", - "type": "boolean" - }, - "sourceReference": { - "description": "Source code for the application that handled this request. There can be more than one source reference per deployed application if source code is distributed among multiple repositories.", - "type": "array", - "items": { - "$ref": "SourceReference" - } - }, - "responseSize": { - "description": "Size in bytes sent back to client by request.", "format": "int64", + "description": "Line within the source file.", "type": "string" - }, - "traceId": { - "description": "Stackdriver Trace identifier for this request.", + } + }, + "id": "SourceLocation" + }, + "ListLogEntriesRequest": { + "id": "ListLogEntriesRequest", + "description": "The parameters to ListLogEntries.", + "type": "object", + "properties": { + "orderBy": { + "description": "Optional. How the results should be sorted. Presently, the only permitted values are \"timestamp asc\" (default) and \"timestamp desc\". The first option returns entries in order of increasing values of LogEntry.timestamp (oldest first), and the second option returns entries in order of decreasing timestamps (newest first). Entries with equal timestamps are returned in order of their insert_id values.", "type": "string" }, - "line": { - "description": "A list of log lines emitted by the application while serving this request.", - "type": "array", + "resourceNames": { + "description": "Required. Names of one or more parent resources from which to retrieve log entries:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]\"\n\"folders/[FOLDER_ID]\"\nProjects listed in the project_ids field are added to this list.", "items": { - "$ref": "LogLine" - } - }, - "referrer": { - "description": "Referrer URL of request.", - "type": "string" + "type": "string" + }, + "type": "array" }, - "taskQueueName": { - "description": "Queue name of the request, in the case of an offline request.", - "type": "string" + "projectIds": { + "description": "Deprecated. Use resource_names instead. One or more project identifiers or project numbers from which to retrieve log entries. Example: \"my-project-1A\". If present, these project identifiers are converted to resource name format and added to the list of resources in resource_names.", + "items": { + "type": "string" + }, + "type": "array" }, - "requestId": { - "description": "Globally unique identifier for a request, which is based on the request start time. Request IDs for requests which started later will compare greater as strings than those for requests which started earlier.", - "type": "string" + "filter": { + "type": "string", + "description": "Optional. A filter that chooses which log entries to return. See Advanced Logs Filters. Only log entries that match the filter are returned. An empty filter matches all log entries in the resources listed in resource_names. Referencing a parent resource that is not listed in resource_names will cause the filter to return no results. The maximum length of the filter is 20000 characters." }, - "nickname": { - "description": "The logged-in user who made the request.Most likely, this is the part of the user's email before the @ sign. The field value is the same for different requests from the same user, but different users can have similar names. This information is also available to the application via the App Engine Users API.This field will be populated starting with App Engine 1.9.21.", + "pageToken": { + "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. page_token must be the value of next_page_token from the previous response. The values of other method parameters should be identical to those in the previous call.", "type": "string" }, - "status": { - "description": "HTTP response status code. Example: 200, 404.", + "pageSize": { "format": "int32", + "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of next_page_token in the response indicates that more results might be available.", "type": "integer" - }, - "resource": { - "description": "Contains the path and query portion of the URL that was requested. For example, if the URL was \"http://example.com/app?name=val\", the resource would be \"/app?name=val\". The fragment identifier, which is identified by the # character, is not included.", - "type": "string" - }, - "pendingTime": { - "description": "Time this request spent in the pending request queue.", - "format": "google-duration", - "type": "string" - }, - "taskName": { - "description": "Task name of the request, in the case of an offline request.", - "type": "string" - }, - "urlMapEntry": { - "description": "File or class that handled the request.", - "type": "string" - }, + } + } + }, + "RequestLog": { + "description": "Complete log information about a single HTTP request to an App Engine application.", + "type": "object", + "properties": { "instanceIndex": { - "description": "If the instance processing this request belongs to a manually scaled module, then this is the 0-based index of the instance. Otherwise, this value is -1.", "format": "int32", + "description": "If the instance processing this request belongs to a manually scaled module, then this is the 0-based index of the instance. Otherwise, this value is -1.", "type": "integer" }, + "finished": { + "type": "boolean", + "description": "Whether this request is finished or active." + }, "host": { "description": "Internet host and port number of the resource being requested.", "type": "string" }, - "finished": { - "description": "Whether this request is finished or active.", - "type": "boolean" - }, "httpVersion": { "description": "HTTP version of request. Example: \"HTTP/1.1\".", "type": "string" }, "startTime": { - "description": "Time when the request started.", "format": "google-datetime", + "description": "Time when the request started.", "type": "string" }, "latency": { - "description": "Latency of the request.", "format": "google-duration", + "description": "Latency of the request.", "type": "string" }, "ip": { @@ -1123,8 +948,8 @@ "type": "string" }, "appId": { - "description": "Application that handled this request.", - "type": "string" + "type": "string", + "description": "Application that handled this request." }, "appEngineRelease": { "description": "App Engine release version.", @@ -1135,8 +960,8 @@ "type": "string" }, "cost": { - "description": "An indication of the relative cost of serving this request.", "format": "double", + "description": "An indication of the relative cost of serving this request.", "type": "number" }, "instanceId": { @@ -1144,8 +969,8 @@ "type": "string" }, "megaCycles": { - "description": "Number of CPU megacycles used to process request.", "format": "int64", + "description": "Number of CPU megacycles used to process request.", "type": "string" }, "first": { @@ -1159,30 +984,103 @@ "moduleId": { "description": "Module of the application that handled this request.", "type": "string" + }, + "endTime": { + "type": "string", + "format": "google-datetime", + "description": "Time when the request finished." + }, + "userAgent": { + "description": "User agent that made the request.", + "type": "string" + }, + "wasLoadingRequest": { + "description": "Whether this was a loading request for the instance.", + "type": "boolean" + }, + "sourceReference": { + "description": "Source code for the application that handled this request. There can be more than one source reference per deployed application if source code is distributed among multiple repositories.", + "items": { + "$ref": "SourceReference" + }, + "type": "array" + }, + "responseSize": { + "format": "int64", + "description": "Size in bytes sent back to client by request.", + "type": "string" + }, + "traceId": { + "description": "Stackdriver Trace identifier for this request.", + "type": "string" + }, + "line": { + "description": "A list of log lines emitted by the application while serving this request.", + "items": { + "$ref": "LogLine" + }, + "type": "array" + }, + "taskQueueName": { + "description": "Queue name of the request, in the case of an offline request.", + "type": "string" + }, + "referrer": { + "description": "Referrer URL of request.", + "type": "string" + }, + "requestId": { + "description": "Globally unique identifier for a request, which is based on the request start time. Request IDs for requests which started later will compare greater as strings than those for requests which started earlier.", + "type": "string" + }, + "nickname": { + "type": "string", + "description": "The logged-in user who made the request.Most likely, this is the part of the user's email before the @ sign. The field value is the same for different requests from the same user, but different users can have similar names. This information is also available to the application via the App Engine Users API.This field will be populated starting with App Engine 1.9.21." + }, + "pendingTime": { + "format": "google-duration", + "description": "Time this request spent in the pending request queue.", + "type": "string" + }, + "resource": { + "description": "Contains the path and query portion of the URL that was requested. For example, if the URL was \"http://example.com/app?name=val\", the resource would be \"/app?name=val\". The fragment identifier, which is identified by the # character, is not included.", + "type": "string" + }, + "status": { + "type": "integer", + "format": "int32", + "description": "HTTP response status code. Example: 200, 404." + }, + "taskName": { + "description": "Task name of the request, in the case of an offline request.", + "type": "string" + }, + "urlMapEntry": { + "description": "File or class that handled the request.", + "type": "string" } }, "id": "RequestLog" }, "ListMonitoredResourceDescriptorsResponse": { - "id": "ListMonitoredResourceDescriptorsResponse", "description": "Result returned from ListMonitoredResourceDescriptors.", "type": "object", "properties": { - "nextPageToken": { - "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.", - "type": "string" - }, "resourceDescriptors": { "description": "A list of resource descriptors.", - "type": "array", "items": { "$ref": "MonitoredResourceDescriptor" - } + }, + "type": "array" + }, + "nextPageToken": { + "type": "string", + "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken." } - } + }, + "id": "ListMonitoredResourceDescriptorsResponse" }, "SourceReference": { - "id": "SourceReference", "description": "A reference to a particular snapshot of the source tree used to build and deploy an application.", "type": "object", "properties": { @@ -1194,35 +1092,17 @@ "description": "The canonical and persistent identifier of the deployed revision. Example (git): \"0035781c50ec7aa23385dc841529ce8a4b70db1b\"", "type": "string" } - } - }, - "LogEntryOperation": { - "description": "Additional information about a potentially long-running operation with which a log entry is associated.", - "type": "object", - "properties": { - "last": { - "description": "Optional. Set this to True if this is the last log entry in the operation.", - "type": "boolean" - }, - "id": { - "description": "Optional. An arbitrary operation identifier. Log entries with the same identifier are assumed to be part of the same operation.", - "type": "string" - }, - "producer": { - "description": "Optional. An arbitrary producer identifier. The combination of id and producer must be globally unique. Examples for producer: \"MyDivision.MyBigCompany.com\", \"github.com/MyProject/MyApplication\".", - "type": "string" - }, - "first": { - "description": "Optional. Set this to True if this is the first log entry in the operation.", - "type": "boolean" - } }, - "id": "LogEntryOperation" + "id": "SourceReference" }, "LogMetric": { "description": "Describes a logs-based metric. The value of the metric is the number of log entries that match a logs filter in a given time interval.", "type": "object", "properties": { + "description": { + "description": "Optional. A description of this metric, which is used in documentation.", + "type": "string" + }, "version": { "enumDescriptions": [ "Stackdriver Logging API v2.", @@ -1242,13 +1122,32 @@ "name": { "description": "Required. The client-assigned metric identifier. Examples: \"error_count\", \"nginx/requests\".Metric identifiers are limited to 100 characters and can include only the following characters: A-Z, a-z, 0-9, and the special characters _-.,+!*',()%/. The forward-slash character (/) denotes a hierarchy of name pieces, and it cannot be the first character of the name.The metric identifier in this field must not be URL-encoded (https://en.wikipedia.org/wiki/Percent-encoding). However, when the metric identifier appears as the [METRIC_ID] part of a metric_name API parameter, then the metric identifier must be URL-encoded. Example: \"projects/my-project/metrics/nginx%2Frequests\".", "type": "string" + } + }, + "id": "LogMetric" + }, + "LogEntryOperation": { + "description": "Additional information about a potentially long-running operation with which a log entry is associated.", + "type": "object", + "properties": { + "last": { + "description": "Optional. Set this to True if this is the last log entry in the operation.", + "type": "boolean" }, - "description": { - "description": "Optional. A description of this metric, which is used in documentation.", + "id": { + "description": "Optional. An arbitrary operation identifier. Log entries with the same identifier are assumed to be part of the same operation.", + "type": "string" + }, + "first": { + "description": "Optional. Set this to True if this is the first log entry in the operation.", + "type": "boolean" + }, + "producer": { + "description": "Optional. An arbitrary producer identifier. The combination of id and producer must be globally unique. Examples for producer: \"MyDivision.MyBigCompany.com\", \"github.com/MyProject/MyApplication\".", "type": "string" } }, - "id": "LogMetric" + "id": "LogEntryOperation" }, "WriteLogEntriesResponse": { "description": "Result returned from WriteLogEntries. empty", @@ -1260,41 +1159,47 @@ "description": "An object representing a resource that can be used for monitoring, logging, billing, or other purposes. Examples include virtual machine instances, databases, and storage devices such as disks. The type field identifies a MonitoredResourceDescriptor object that describes the resource's schema. Information in the labels field identifies the actual resource and its attributes according to the schema. For example, a particular Compute Engine VM instance could be represented by the following object, because the MonitoredResourceDescriptor for \"gce_instance\" has labels \"instance_id\" and \"zone\":\n{ \"type\": \"gce_instance\",\n \"labels\": { \"instance_id\": \"12345678901234\",\n \"zone\": \"us-central1-a\" }}\n", "type": "object", "properties": { + "type": { + "type": "string", + "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Compute Engine VM instance is gce_instance." + }, "labels": { - "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Cloud SQL databases use the labels \"database_id\" and \"zone\".", - "type": "object", "additionalProperties": { "type": "string" - } - }, - "type": { - "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Cloud SQL database is \"cloudsql_database\".", - "type": "string" + }, + "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Compute Engine VM instances use the labels \"project_id\", \"instance_id\", and \"zone\".", + "type": "object" } }, "id": "MonitoredResource" }, "LogSink": { - "id": "LogSink", - "description": "Describes a sink used to export log entries to one of the following destinations in any project: a Cloud Storage bucket, a BigQuery dataset, or a Cloud Pub/Sub topic. A logs filter controls which log entries are exported. The sink must be created within a project, organization, billing account, or folder.", "type": "object", "properties": { - "filter": { - "description": "Optional. An advanced logs filter. The only exported log entries are those that are in the resource owning the sink and that match the filter. The filter must use the log entry format specified by the output_version_format parameter. For example, in the v2 format:\nlogName=\"projects/[PROJECT_ID]/logs/[LOG_ID]\" AND severity\u003e=ERROR\n", + "name": { + "description": "Required. The client-assigned sink identifier, unique within the project. Example: \"my-syslog-errors-to-pubsub\". Sink identifiers are limited to 100 characters and can include only the following characters: upper and lower-case alphanumeric characters, underscores, hyphens, and periods.", "type": "string" }, + "includeChildren": { + "description": "Optional. This field applies only to sinks owned by organizations and folders. If the field is false, the default, only the logs owned by the sink's parent resource are available for export. If the field is true, then logs from all the projects, folders, and billing accounts contained in the sink's parent resource are also available for export. Whether a particular log entry from the children is exported depends on the sink's filter expression. For example, if this field is true, then the filter resource.type=gce_instance would export all Compute Engine VM instance log entries from all projects in the sink's parent. To only export entries from certain child projects, filter on the project part of the log name:\nlogName:(\"projects/test-project1/\" OR \"projects/test-project2/\") AND\nresource.type=gce_instance\n", + "type": "boolean" + }, "destination": { "description": "Required. The export destination:\n\"storage.googleapis.com/[GCS_BUCKET]\"\n\"bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]\"\n\"pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]\"\nThe sink's writer_identity, set when the sink is created, must have permission to write to the destination or else the log entries are not exported. For more information, see Exporting Logs With Sinks.", "type": "string" }, + "filter": { + "description": "Optional. An advanced logs filter. The only exported log entries are those that are in the resource owning the sink and that match the filter. The filter must use the log entry format specified by the output_version_format parameter. For example, in the v2 format:\nlogName=\"projects/[PROJECT_ID]/logs/[LOG_ID]\" AND severity\u003e=ERROR\n", + "type": "string" + }, "endTime": { - "description": "Optional. The time at which this sink will stop exporting log entries. Log entries are exported only if their timestamp is earlier than the end time. If this field is not supplied, there is no end time. If both a start time and an end time are provided, then the end time must be later than the start time.", "format": "google-datetime", + "description": "Optional. The time at which this sink will stop exporting log entries. Log entries are exported only if their timestamp is earlier than the end time. If this field is not supplied, there is no end time. If both a start time and an end time are provided, then the end time must be later than the start time.", "type": "string" }, "startTime": { - "description": "Optional. The time at which this sink will begin exporting log entries. Log entries are exported only if their timestamp is not earlier than the start time. The default value of this field is the time the sink is created or updated.", "format": "google-datetime", + "description": "Optional. The time at which this sink will begin exporting log entries. Log entries are exported only if their timestamp is not earlier than the start time. The default value of this field is the time the sink is created or updated.", "type": "string" }, "writerIdentity": { @@ -1302,119 +1207,104 @@ "type": "string" }, "outputVersionFormat": { - "enumDescriptions": [ - "An unspecified format version that will default to V2.", - "LogEntry version 2 format.", - "LogEntry version 1 format." - ], "enum": [ "VERSION_FORMAT_UNSPECIFIED", "V2", "V1" ], - "description": "Optional. The log entry format to use for this sink's exported log entries. The v2 format is used by default. The v1 format is deprecated and should be used only as part of a migration effort to v2. See Migration to the v2 API.", - "type": "string" - }, - "name": { - "description": "Required. The client-assigned sink identifier, unique within the project. Example: \"my-syslog-errors-to-pubsub\". Sink identifiers are limited to 100 characters and can include only the following characters: upper and lower-case alphanumeric characters, underscores, hyphens, and periods.", - "type": "string" - }, - "includeChildren": { - "description": "Optional. This field presently applies only to sinks in organizations and folders. If true, then logs from children of this entity will also be available to this sink for export. Whether particular log entries from the children are exported depends on the sink's filter expression. For example, if this sink is associated with an organization, then logs from all projects in the organization as well as from the organization itself will be available for export.", - "type": "boolean" + "description": "Deprecated. The log entry format to use for this sink's exported log entries. The v2 format is used by default and cannot be changed.", + "type": "string", + "enumDescriptions": [ + "An unspecified format version that will default to V2.", + "LogEntry version 2 format.", + "LogEntry version 1 format." + ] } - } + }, + "id": "LogSink", + "description": "Describes a sink used to export log entries to one of the following destinations in any project: a Cloud Storage bucket, a BigQuery dataset, or a Cloud Pub/Sub topic. A logs filter controls which log entries are exported. The sink must be created within a project, organization, billing account, or folder." }, "WriteLogEntriesRequest": { "id": "WriteLogEntriesRequest", "description": "The parameters to WriteLogEntries.", "type": "object", "properties": { - "labels": { - "description": "Optional. Default labels that are added to the labels field of all log entries in entries. If a log entry already has a label with the same key as a label in this parameter, then the log entry's label is not changed. See LogEntry.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "resource": { - "$ref": "MonitoredResource", - "description": "Optional. A default monitored resource object that is assigned to all log entries in entries that do not specify a value for resource. Example:\n{ \"type\": \"gce_instance\",\n \"labels\": {\n \"zone\": \"us-central1-a\", \"instance_id\": \"00000000000000000000\" }}\nSee LogEntry." - }, - "logName": { - "description": "Optional. A default log resource name that is assigned to all log entries in entries that do not specify a value for log_name:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]\"\n\"folders/[FOLDER_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\" or \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.", - "type": "string" - }, "entries": { "description": "Required. The log entries to write. Values supplied for the fields log_name, resource, and labels in this entries.write request are inserted into those log entries in this list that do not provide their own values.Stackdriver Logging also creates and inserts values for timestamp and insert_id if the entries do not provide them. The created insert_id for the N'th entry in this list will be greater than earlier entries and less than later entries. Otherwise, the order of log entries in this list does not matter.To improve throughput and to avoid exceeding the quota limit for calls to entries.write, you should write multiple log entries at once rather than calling this method for each individual log entry.", - "type": "array", "items": { "$ref": "LogEntry" - } + }, + "type": "array" + }, + "logName": { + "description": "Optional. A default log resource name that is assigned to all log entries in entries that do not specify a value for log_name:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n\"billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]\"\n\"folders/[FOLDER_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\" or \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.", + "type": "string" }, "partialSuccess": { "description": "Optional. Whether valid entries should be written even if some other entries fail due to INVALID_ARGUMENT or PERMISSION_DENIED errors. If any entry is not written, then the response status is the error associated with one of the failed entries and the response includes error details keyed by the entries' zero-based index in the entries.write method.", "type": "boolean" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Optional. Default labels that are added to the labels field of all log entries in entries. If a log entry already has a label with the same key as a label in this parameter, then the log entry's label is not changed. See LogEntry.", + "type": "object" + }, + "resource": { + "$ref": "MonitoredResource", + "description": "Optional. A default monitored resource object that is assigned to all log entries in entries that do not specify a value for resource. Example:\n{ \"type\": \"gce_instance\",\n \"labels\": {\n \"zone\": \"us-central1-a\", \"instance_id\": \"00000000000000000000\" }}\nSee LogEntry." } } }, "ListLogsResponse": { - "id": "ListLogsResponse", "description": "Result returned from ListLogs.", "type": "object", "properties": { "logNames": { "description": "A list of log names. For example, \"projects/my-project/syslog\" or \"organizations/123/cloudresourcemanager.googleapis.com%2Factivity\".", - "type": "array", "items": { "type": "string" - } + }, + "type": "array" }, "nextPageToken": { "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.", "type": "string" } - } - }, - "ListSinksResponse": { - "description": "Result returned from ListSinks.", - "type": "object", - "properties": { - "sinks": { - "description": "A list of sinks.", - "type": "array", - "items": { - "$ref": "LogSink" - } - }, - "nextPageToken": { - "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call the same method again using the value of nextPageToken as pageToken.", - "type": "string" - } }, - "id": "ListSinksResponse" + "id": "ListLogsResponse" }, "HttpRequest": { "description": "A common proto for logging HTTP requests. Only contains semantics defined by the HTTP specification. Product-specific logging information MUST be defined in a separate message.", "type": "object", "properties": { + "userAgent": { + "description": "The user agent sent by the client. Example: \"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET CLR 1.0.3705)\".", + "type": "string" + }, + "latency": { + "format": "google-duration", + "description": "The request processing latency on the server, from the time the request was received until the response was sent.", + "type": "string" + }, "cacheFillBytes": { - "description": "The number of HTTP response bytes inserted into cache. Set only when a cache fill was attempted.", "format": "int64", + "description": "The number of HTTP response bytes inserted into cache. Set only when a cache fill was attempted.", "type": "string" }, "requestMethod": { "description": "The request method. Examples: \"GET\", \"HEAD\", \"PUT\", \"POST\".", "type": "string" }, - "responseSize": { - "description": "The size of the HTTP response message sent back to the client, in bytes, including the response headers and the response body.", + "requestSize": { "format": "int64", + "description": "The size of the HTTP request message in bytes, including the request headers and the request body.", "type": "string" }, - "requestSize": { - "description": "The size of the HTTP request message in bytes, including the request headers and the request body.", + "responseSize": { "format": "int64", + "description": "The size of the HTTP response message sent back to the client, in bytes, including the response headers and the response body.", "type": "string" }, "requestUrl": { @@ -1422,16 +1312,16 @@ "type": "string" }, "remoteIp": { - "description": "The IP address (IPv4 or IPv6) of the client that issued the HTTP request. Examples: \"192.168.1.1\", \"FE80::0202:B3FF:FE1E:8329\".", - "type": "string" + "type": "string", + "description": "The IP address (IPv4 or IPv6) of the client that issued the HTTP request. Examples: \"192.168.1.1\", \"FE80::0202:B3FF:FE1E:8329\"." }, "serverIp": { "description": "The IP address (IPv4 or IPv6) of the origin server that the request was sent to.", "type": "string" }, "cacheLookup": { - "description": "Whether or not a cache lookup was attempted.", - "type": "boolean" + "type": "boolean", + "description": "Whether or not a cache lookup was attempted." }, "cacheHit": { "description": "Whether or not an entity was served from cache (with or without validation).", @@ -1442,25 +1332,34 @@ "type": "boolean" }, "status": { - "description": "The response code indicating the status of response. Examples: 200, 404.", "format": "int32", + "description": "The response code indicating the status of response. Examples: 200, 404.", "type": "integer" }, "referer": { "description": "The referer URL of the request, as defined in HTTP/1.1 Header Field Definitions (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html).", "type": "string" + } + }, + "id": "HttpRequest" + }, + "ListSinksResponse": { + "description": "Result returned from ListSinks.", + "type": "object", + "properties": { + "sinks": { + "description": "A list of sinks.", + "items": { + "$ref": "LogSink" + }, + "type": "array" }, - "latency": { - "description": "The request processing latency on the server, from the time the request was received until the response was sent.", - "format": "google-duration", - "type": "string" - }, - "userAgent": { - "description": "The user agent sent by the client. Example: \"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET CLR 1.0.3705)\".", + "nextPageToken": { + "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call the same method again using the value of nextPageToken as pageToken.", "type": "string" } }, - "id": "HttpRequest" + "id": "ListSinksResponse" }, "LabelDescriptor": { "description": "A description of a label.", @@ -1475,8 +1374,6 @@ "type": "string" }, "valueType": { - "description": "The type of data that can be assigned to the label.", - "type": "string", "enumDescriptions": [ "A variable-length string. This is the default.", "Boolean; true or false.", @@ -1486,41 +1383,149 @@ "STRING", "BOOL", "INT64" - ] + ], + "description": "The type of data that can be assigned to the label.", + "type": "string" } }, "id": "LabelDescriptor" - } - }, - "icons": { - "x32": "http://www.google.com/images/icons/product/search-32.gif", - "x16": "http://www.google.com/images/icons/product/search-16.gif" - }, - "protocol": "rest", - "canonicalName": "Logging", - "auth": { - "oauth2": { - "scopes": { - "https://www.googleapis.com/auth/cloud-platform.read-only": { - "description": "View your data across Google Cloud Platform services" + }, + "MonitoredResourceDescriptor": { + "id": "MonitoredResourceDescriptor", + "description": "An object that describes the schema of a MonitoredResource object using a type name and a set of labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of \"gce_instance\" and specifies the use of the labels \"instance_id\" and \"zone\" to identify particular VM instances.Different APIs can support different monitored resource types. APIs generally provide a list method that returns the monitored resource descriptors used by the API.", + "type": "object", + "properties": { + "labels": { + "description": "Required. A set of labels used to describe instances of this monitored resource type. For example, an individual Google Cloud SQL database is identified by values for the labels \"database_id\" and \"zone\".", + "items": { + "$ref": "LabelDescriptor" + }, + "type": "array" }, - "https://www.googleapis.com/auth/logging.admin": { - "description": "Administrate log data for your projects" + "name": { + "type": "string", + "description": "Optional. The resource name of the monitored resource descriptor: \"projects/{project_id}/monitoredResourceDescriptors/{type}\" where {type} is the value of the type field in this object and {project_id} is a project ID that provides API-specific context for accessing the type. APIs that do not use project information can use the resource name format \"monitoredResourceDescriptors/{type}\"." }, - "https://www.googleapis.com/auth/logging.read": { - "description": "View log data for your projects" + "description": { + "description": "Optional. A detailed description of the monitored resource type that might be used in documentation.", + "type": "string" }, - "https://www.googleapis.com/auth/logging.write": { - "description": "Submit log data for your projects" + "displayName": { + "description": "Optional. A concise name for the monitored resource type that might be displayed in user interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example, \"Google Cloud SQL Database\".", + "type": "string" }, - "https://www.googleapis.com/auth/cloud-platform": { - "description": "View and manage your data across Google Cloud Platform services" + "type": { + "description": "Required. The monitored resource type. For example, the type \"cloudsql_database\" represents databases in Google Cloud SQL. The maximum length of this value is 256 characters.", + "type": "string" } } + }, + "LogEntrySourceLocation": { + "description": "Additional information about the source code location that produced the log entry.", + "type": "object", + "properties": { + "file": { + "description": "Optional. Source file name. Depending on the runtime environment, this might be a simple name or a fully-qualified name.", + "type": "string" + }, + "function": { + "type": "string", + "description": "Optional. Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information may be used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python)." + }, + "line": { + "format": "int64", + "description": "Optional. Line within the source file. 1-based; 0 indicates no line number available.", + "type": "string" + } + }, + "id": "LogEntrySourceLocation" + }, + "ListLogEntriesResponse": { + "description": "Result returned from ListLogEntries.", + "type": "object", + "properties": { + "nextPageToken": { + "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.If a value for next_page_token appears and the entries field is empty, it means that the search found no log entries so far but it did not have time to search all the possible log entries. Retry the method with this value for page_token to continue the search. Alternatively, consider speeding up the search by changing your filter to specify a single log name or resource type, or to narrow the time range of the search.", + "type": "string" + }, + "entries": { + "description": "A list of log entries.", + "items": { + "$ref": "LogEntry" + }, + "type": "array" + } + }, + "id": "ListLogEntriesResponse" + }, + "LogLine": { + "description": "Application log line emitted while processing a request.", + "type": "object", + "properties": { + "logMessage": { + "description": "App-provided log message.", + "type": "string" + }, + "severity": { + "type": "string", + "enumDescriptions": [ + "(0) The log entry has no assigned severity level.", + "(100) Debug or trace information.", + "(200) Routine information, such as ongoing status or performance.", + "(300) Normal but significant events, such as start up, shut down, or a configuration change.", + "(400) Warning events might cause problems.", + "(500) Error events are likely to cause problems.", + "(600) Critical events cause more severe problems or outages.", + "(700) A person must take an action immediately.", + "(800) One or more systems are unusable." + ], + "enum": [ + "DEFAULT", + "DEBUG", + "INFO", + "NOTICE", + "WARNING", + "ERROR", + "CRITICAL", + "ALERT", + "EMERGENCY" + ], + "description": "Severity of this log entry." + }, + "sourceLocation": { + "description": "Where in the source code this log message was written.", + "$ref": "SourceLocation" + }, + "time": { + "format": "google-datetime", + "description": "Approximate time when this log entry was made.", + "type": "string" + } + }, + "id": "LogLine" + }, + "ListLogMetricsResponse": { + "properties": { + "metrics": { + "description": "A list of logs-based metrics.", + "items": { + "$ref": "LogMetric" + }, + "type": "array" + }, + "nextPageToken": { + "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.", + "type": "string" + } + }, + "id": "ListLogMetricsResponse", + "description": "Result returned from ListLogMetrics.", + "type": "object" } }, - "rootUrl": "https://logging.googleapis.com/", - "ownerDomain": "google.com", - "name": "logging", - "batchPath": "batch" + "icons": { + "x32": "http://www.google.com/images/icons/product/search-32.gif", + "x16": "http://www.google.com/images/icons/product/search-16.gif" + }, + "protocol": "rest" } diff --git a/vendor/google.golang.org/api/logging/v2beta1/logging-gen.go b/vendor/google.golang.org/api/logging/v2beta1/logging-gen.go index 4671278752f20..ca93df524f3f4 100644 --- a/vendor/google.golang.org/api/logging/v2beta1/logging-gen.go +++ b/vendor/google.golang.org/api/logging/v2beta1/logging-gen.go @@ -670,6 +670,10 @@ type LogEntry struct { // log entry payloads. ProtoPayload googleapi.RawMessage `json:"protoPayload,omitempty"` + // ReceiveTimestamp: Output only. The time the log entry was received by + // Stackdriver Logging. + ReceiveTimestamp string `json:"receiveTimestamp,omitempty"` + // Resource: Required. The monitored resource associated with this log // entry. Example: a log entry that reports a database error would be // associated with the monitored resource designating the particular @@ -973,13 +977,22 @@ type LogSink struct { // Filter string `json:"filter,omitempty"` - // IncludeChildren: Optional. This field presently applies only to sinks - // in organizations and folders. If true, then logs from children of - // this entity will also be available to this sink for export. Whether - // particular log entries from the children are exported depends on the - // sink's filter expression. For example, if this sink is associated - // with an organization, then logs from all projects in the organization - // as well as from the organization itself will be available for export. + // IncludeChildren: Optional. This field applies only to sinks owned by + // organizations and folders. If the field is false, the default, only + // the logs owned by the sink's parent resource are available for + // export. If the field is true, then logs from all the projects, + // folders, and billing accounts contained in the sink's parent resource + // are also available for export. Whether a particular log entry from + // the children is exported depends on the sink's filter expression. For + // example, if this field is true, then the filter + // resource.type=gce_instance would export all Compute Engine VM + // instance log entries from all projects in the sink's parent. To only + // export entries from certain child projects, filter on the project + // part of the log name: + // logName:("projects/test-project1/" OR "projects/test-project2/") + // AND + // resource.type=gce_instance + // IncludeChildren bool `json:"includeChildren,omitempty"` // Name: Required. The client-assigned sink identifier, unique within @@ -989,10 +1002,9 @@ type LogSink struct { // underscores, hyphens, and periods. Name string `json:"name,omitempty"` - // OutputVersionFormat: Optional. The log entry format to use for this - // sink's exported log entries. The v2 format is used by default. The v1 - // format is deprecated and should be used only as part of a migration - // effort to v2. See Migration to the v2 API. + // OutputVersionFormat: Deprecated. The log entry format to use for this + // sink's exported log entries. The v2 format is used by default and + // cannot be changed. // // Possible values: // "VERSION_FORMAT_UNSPECIFIED" - An unspecified format version that @@ -1061,13 +1073,13 @@ func (s *LogSink) MarshalJSON() ([]byte, error) { // type MonitoredResource struct { // Labels: Required. Values for all of the labels listed in the - // associated monitored resource descriptor. For example, Cloud SQL - // databases use the labels "database_id" and "zone". + // associated monitored resource descriptor. For example, Compute Engine + // VM instances use the labels "project_id", "instance_id", and "zone". Labels map[string]string `json:"labels,omitempty"` // Type: Required. The monitored resource type. This field must match // the type field of a MonitoredResourceDescriptor object. For example, - // the type of a Cloud SQL database is "cloudsql_database". + // the type of a Compute Engine VM instance is gce_instance. Type string `json:"type,omitempty"` // ForceSendFields is a list of field names (e.g. "Labels") to @@ -4285,7 +4297,8 @@ func (r *ProjectsSinksService) Update(sinkNameid string, logsink *LogSink) *Proj // then there is no change to the sink's writer_identity. // If the old value is false and the new value is true, then // writer_identity is changed to a unique service account. -// It is an error if the old value is true and the new value is false. +// It is an error if the old value is true and the new value is set to +// false or defaulted to false. func (c *ProjectsSinksUpdateCall) UniqueWriterIdentity(uniqueWriterIdentity bool) *ProjectsSinksUpdateCall { c.urlParams_.Set("uniqueWriterIdentity", fmt.Sprint(uniqueWriterIdentity)) return c @@ -4393,7 +4406,7 @@ func (c *ProjectsSinksUpdateCall) Do(opts ...googleapi.CallOption) (*LogSink, er // "type": "string" // }, // "uniqueWriterIdentity": { - // "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value is false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value is true and the new value is false.", + // "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value is false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value is true and the new value is set to false or defaulted to false.", // "location": "query", // "type": "boolean" // } diff --git a/vendor/google.golang.org/api/monitoring/v3/monitoring-api.json b/vendor/google.golang.org/api/monitoring/v3/monitoring-api.json index a22e70a065531..e8c3d881714c1 100644 --- a/vendor/google.golang.org/api/monitoring/v3/monitoring-api.json +++ b/vendor/google.golang.org/api/monitoring/v3/monitoring-api.json @@ -1,819 +1,284 @@ { - "resources": { - "projects": { - "resources": { - "collectdTimeSeries": { - "methods": { - "create": { - "httpMethod": "POST", - "parameterOrder": [ - "name" - ], - "response": { - "$ref": "Empty" - }, - "parameters": { - "name": { - "pattern": "^projects/[^/]+$", - "location": "path", - "description": "The project in which to create the time series. The format is \"projects/PROJECT_ID_OR_NUMBER\".", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.write" - ], - "flatPath": "v3/projects/{projectsId}/collectdTimeSeries", - "id": "monitoring.projects.collectdTimeSeries.create", - "path": "v3/{+name}/collectdTimeSeries", - "request": { - "$ref": "CreateCollectdTimeSeriesRequest" - }, - "description": "Stackdriver Monitoring Agent only: Creates a new time series.\u003caside class=\"caution\"\u003eThis method is only for use by the Stackdriver Monitoring Agent. Use projects.timeSeries.create instead.\u003c/aside\u003e" - } - } - }, - "timeSeries": { - "methods": { - "list": { - "parameterOrder": [ - "name" - ], - "httpMethod": "GET", - "response": { - "$ref": "ListTimeSeriesResponse" - }, - "parameters": { - "secondaryAggregation.alignmentPeriod": { - "description": "The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.", - "format": "google-duration", - "type": "string", - "location": "query" - }, - "pageSize": { - "description": "A positive number that is the maximum number of results to return. When view field sets to FULL, it limits the number of Points server will return; if view field is HEADERS, it limits the number of TimeSeries server will return.", - "format": "int32", - "type": "integer", - "location": "query" - }, - "secondaryAggregation.perSeriesAligner": { - "enum": [ - "ALIGN_NONE", - "ALIGN_DELTA", - "ALIGN_RATE", - "ALIGN_INTERPOLATE", - "ALIGN_NEXT_OLDER", - "ALIGN_MIN", - "ALIGN_MAX", - "ALIGN_MEAN", - "ALIGN_COUNT", - "ALIGN_SUM", - "ALIGN_STDDEV", - "ALIGN_COUNT_TRUE", - "ALIGN_FRACTION_TRUE", - "ALIGN_PERCENTILE_99", - "ALIGN_PERCENTILE_95", - "ALIGN_PERCENTILE_50", - "ALIGN_PERCENTILE_05" - ], - "description": "The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.", - "type": "string", - "location": "query" - }, - "orderBy": { - "location": "query", - "description": "Specifies the order in which the points of the time series should be returned. By default, results are not ordered. Currently, this field must be left blank.", - "type": "string" - }, - "aggregation.crossSeriesReducer": { - "location": "query", - "enum": [ - "REDUCE_NONE", - "REDUCE_MEAN", - "REDUCE_MIN", - "REDUCE_MAX", - "REDUCE_SUM", - "REDUCE_STDDEV", - "REDUCE_COUNT", - "REDUCE_COUNT_TRUE", - "REDUCE_FRACTION_TRUE", - "REDUCE_PERCENTILE_99", - "REDUCE_PERCENTILE_95", - "REDUCE_PERCENTILE_50", - "REDUCE_PERCENTILE_05" - ], - "description": "The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.", - "type": "string" - }, - "filter": { - "description": "A monitoring filter that specifies which time series should be returned. The filter must specify a single metric type, and can additionally specify metric labels and other information. For example:\nmetric.type = \"compute.googleapis.com/instance/cpu/usage_time\" AND\n metric.label.instance_name = \"my-instance-name\"\n", - "type": "string", - "location": "query" - }, - "pageToken": { - "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", - "type": "string", - "location": "query" - }, - "aggregation.perSeriesAligner": { - "enum": [ - "ALIGN_NONE", - "ALIGN_DELTA", - "ALIGN_RATE", - "ALIGN_INTERPOLATE", - "ALIGN_NEXT_OLDER", - "ALIGN_MIN", - "ALIGN_MAX", - "ALIGN_MEAN", - "ALIGN_COUNT", - "ALIGN_SUM", - "ALIGN_STDDEV", - "ALIGN_COUNT_TRUE", - "ALIGN_FRACTION_TRUE", - "ALIGN_PERCENTILE_99", - "ALIGN_PERCENTILE_95", - "ALIGN_PERCENTILE_50", - "ALIGN_PERCENTILE_05" - ], - "description": "The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.", - "type": "string", - "location": "query" - }, - "interval.startTime": { - "location": "query", - "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.", - "format": "google-datetime", - "type": "string" - }, - "view": { - "enum": [ - "FULL", - "HEADERS" - ], - "description": "Specifies which information is returned about the time series.", - "type": "string", - "location": "query" - }, - "secondaryAggregation.crossSeriesReducer": { - "location": "query", - "enum": [ - "REDUCE_NONE", - "REDUCE_MEAN", - "REDUCE_MIN", - "REDUCE_MAX", - "REDUCE_SUM", - "REDUCE_STDDEV", - "REDUCE_COUNT", - "REDUCE_COUNT_TRUE", - "REDUCE_FRACTION_TRUE", - "REDUCE_PERCENTILE_99", - "REDUCE_PERCENTILE_95", - "REDUCE_PERCENTILE_50", - "REDUCE_PERCENTILE_05" - ], - "description": "The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.", - "type": "string" - }, - "secondaryAggregation.groupByFields": { - "description": "The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.", - "type": "string", - "repeated": true, - "location": "query" - }, - "name": { - "pattern": "^projects/[^/]+$", - "location": "path", - "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", - "required": true, - "type": "string" - }, - "aggregation.groupByFields": { - "repeated": true, - "location": "query", - "description": "The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.", - "type": "string" - }, - "interval.endTime": { - "description": "Required. The end of the time interval.", - "format": "google-datetime", - "type": "string", - "location": "query" - }, - "aggregation.alignmentPeriod": { - "description": "The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.", - "format": "google-duration", - "type": "string", - "location": "query" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read" - ], - "flatPath": "v3/projects/{projectsId}/timeSeries", - "path": "v3/{+name}/timeSeries", - "id": "monitoring.projects.timeSeries.list", - "description": "Lists time series that match a filter. This method does not require a Stackdriver account." - }, - "create": { - "httpMethod": "POST", - "parameterOrder": [ - "name" - ], - "response": { - "$ref": "Empty" - }, - "parameters": { - "name": { - "pattern": "^projects/[^/]+$", - "location": "path", - "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.write" - ], - "flatPath": "v3/projects/{projectsId}/timeSeries", - "id": "monitoring.projects.timeSeries.create", - "path": "v3/{+name}/timeSeries", - "request": { - "$ref": "CreateTimeSeriesRequest" - }, - "description": "Creates or adds data to one or more time series. The response is empty if all time series in the request were written. If any time series could not be written, a corresponding failure message is included in the error response." - } - } - }, - "metricDescriptors": { - "methods": { - "create": { - "response": { - "$ref": "MetricDescriptor" - }, - "parameterOrder": [ - "name" - ], - "httpMethod": "POST", - "parameters": { - "name": { - "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.write" - ], - "flatPath": "v3/projects/{projectsId}/metricDescriptors", - "path": "v3/{+name}/metricDescriptors", - "id": "monitoring.projects.metricDescriptors.create", - "request": { - "$ref": "MetricDescriptor" - }, - "description": "Creates a new metric descriptor. User-created metric descriptors define custom metrics." - }, - "delete": { - "httpMethod": "DELETE", - "response": { - "$ref": "Empty" - }, - "parameterOrder": [ - "name" - ], - "parameters": { - "name": { - "pattern": "^projects/[^/]+/metricDescriptors/.+$", - "location": "path", - "description": "The metric descriptor on which to execute the request. The format is \"projects/{project_id_or_number}/metricDescriptors/{metric_id}\". An example of {metric_id} is: \"custom.googleapis.com/my_test_metric\".", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring" - ], - "flatPath": "v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}", - "id": "monitoring.projects.metricDescriptors.delete", - "path": "v3/{+name}", - "description": "Deletes a metric descriptor. Only user-created custom metrics can be deleted." - }, - "list": { - "response": { - "$ref": "ListMetricDescriptorsResponse" - }, - "parameterOrder": [ - "name" - ], - "httpMethod": "GET", - "parameters": { - "filter": { - "location": "query", - "description": "If this field is empty, all custom and system-defined metric descriptors are returned. Otherwise, the filter specifies which metric descriptors are to be returned. For example, the following filter matches all custom metrics:\nmetric.type = starts_with(\"custom.googleapis.com/\")\n", - "type": "string" - }, - "name": { - "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" - }, - "pageToken": { - "location": "query", - "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", - "type": "string" - }, - "pageSize": { - "location": "query", - "description": "A positive number that is the maximum number of results to return.", - "format": "int32", - "type": "integer" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - "https://www.googleapis.com/auth/monitoring.write" - ], - "flatPath": "v3/projects/{projectsId}/metricDescriptors", - "path": "v3/{+name}/metricDescriptors", - "id": "monitoring.projects.metricDescriptors.list", - "description": "Lists metric descriptors that match a filter. This method does not require a Stackdriver account." - }, - "get": { - "path": "v3/{+name}", - "id": "monitoring.projects.metricDescriptors.get", - "description": "Gets a single metric descriptor. This method does not require a Stackdriver account.", - "response": { - "$ref": "MetricDescriptor" - }, - "parameterOrder": [ - "name" - ], - "httpMethod": "GET", - "parameters": { - "name": { - "pattern": "^projects/[^/]+/metricDescriptors/.+$", - "location": "path", - "description": "The metric descriptor on which to execute the request. The format is \"projects/{project_id_or_number}/metricDescriptors/{metric_id}\". An example value of {metric_id} is \"compute.googleapis.com/instance/disk/read_bytes_count\".", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - "https://www.googleapis.com/auth/monitoring.write" - ], - "flatPath": "v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}" - } - } - }, - "monitoredResourceDescriptors": { - "methods": { - "list": { - "description": "Lists monitored resource descriptors that match a filter. This method does not require a Stackdriver account.", - "parameterOrder": [ - "name" - ], - "httpMethod": "GET", - "response": { - "$ref": "ListMonitoredResourceDescriptorsResponse" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - "https://www.googleapis.com/auth/monitoring.write" - ], - "parameters": { - "filter": { - "description": "An optional filter describing the descriptors to be returned. The filter can reference the descriptor's type and labels. For example, the following filter returns only Google Compute Engine descriptors that have an id label:\nresource.type = starts_with(\"gce_\") AND resource.label:id\n", - "type": "string", - "location": "query" - }, - "name": { - "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" - }, - "pageToken": { - "location": "query", - "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", - "type": "string" - }, - "pageSize": { - "location": "query", - "description": "A positive number that is the maximum number of results to return.", - "format": "int32", - "type": "integer" - } - }, - "flatPath": "v3/projects/{projectsId}/monitoredResourceDescriptors", - "path": "v3/{+name}/monitoredResourceDescriptors", - "id": "monitoring.projects.monitoredResourceDescriptors.list" - }, - "get": { - "description": "Gets a single monitored resource descriptor. This method does not require a Stackdriver account.", - "httpMethod": "GET", - "response": { - "$ref": "MonitoredResourceDescriptor" - }, - "parameterOrder": [ - "name" - ], - "parameters": { - "name": { - "pattern": "^projects/[^/]+/monitoredResourceDescriptors/[^/]+$", - "location": "path", - "description": "The monitored resource descriptor to get. The format is \"projects/{project_id_or_number}/monitoredResourceDescriptors/{resource_type}\". The {resource_type} is a predefined type, such as cloudsql_database.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - "https://www.googleapis.com/auth/monitoring.write" - ], - "flatPath": "v3/projects/{projectsId}/monitoredResourceDescriptors/{monitoredResourceDescriptorsId}", - "id": "monitoring.projects.monitoredResourceDescriptors.get", - "path": "v3/{+name}" - } - } - }, - "groups": { - "methods": { - "delete": { - "path": "v3/{+name}", - "id": "monitoring.projects.groups.delete", - "description": "Deletes an existing group.", - "parameterOrder": [ - "name" - ], - "httpMethod": "DELETE", - "response": { - "$ref": "Empty" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring" - ], - "parameters": { - "name": { - "pattern": "^projects/[^/]+/groups/[^/]+$", - "location": "path", - "description": "The group to delete. The format is \"projects/{project_id_or_number}/groups/{group_id}\".", - "required": true, - "type": "string" - } - }, - "flatPath": "v3/projects/{projectsId}/groups/{groupsId}" - }, - "list": { - "description": "Lists the existing groups.", - "httpMethod": "GET", - "response": { - "$ref": "ListGroupsResponse" - }, - "parameterOrder": [ - "name" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read" - ], - "parameters": { - "descendantsOfGroup": { - "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns the descendants of the specified group. This is a superset of the results returned by the childrenOfGroup filter, and includes children-of-children, and so forth.", - "type": "string", - "location": "query" - }, - "pageToken": { - "location": "query", - "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", - "type": "string" - }, - "pageSize": { - "location": "query", - "description": "A positive number that is the maximum number of results to return.", - "format": "int32", - "type": "integer" - }, - "ancestorsOfGroup": { - "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns groups that are ancestors of the specified group. The groups are returned in order, starting with the immediate parent and ending with the most distant ancestor. If the specified group has no immediate parent, the results are empty.", - "type": "string", - "location": "query" - }, - "name": { - "description": "The project whose groups are to be listed. The format is \"projects/{project_id_or_number}\".", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" - }, - "childrenOfGroup": { - "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns groups whose parentName field contains the group name. If no groups have this parent, the results are empty.", - "type": "string", - "location": "query" - } - }, - "flatPath": "v3/projects/{projectsId}/groups", - "id": "monitoring.projects.groups.list", - "path": "v3/{+name}/groups" - }, - "get": { - "httpMethod": "GET", - "response": { - "$ref": "Group" - }, - "parameterOrder": [ - "name" - ], - "parameters": { - "name": { - "description": "The group to retrieve. The format is \"projects/{project_id_or_number}/groups/{group_id}\".", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/groups/[^/]+$", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read" - ], - "flatPath": "v3/projects/{projectsId}/groups/{groupsId}", - "id": "monitoring.projects.groups.get", - "path": "v3/{+name}", - "description": "Gets a single group." - }, - "update": { - "response": { - "$ref": "Group" - }, - "parameterOrder": [ - "name" - ], - "httpMethod": "PUT", - "parameters": { - "name": { - "description": "Output only. The name of this group. The format is \"projects/{project_id_or_number}/groups/{group_id}\". When creating a group, this field is ignored and a new name is created consisting of the project specified in the call to CreateGroup and a unique {group_id} that is generated automatically.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/groups/[^/]+$", - "location": "path" - }, - "validateOnly": { - "location": "query", - "description": "If true, validate this request but do not update the existing group.", - "type": "boolean" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring" - ], - "flatPath": "v3/projects/{projectsId}/groups/{groupsId}", - "path": "v3/{+name}", - "id": "monitoring.projects.groups.update", - "request": { - "$ref": "Group" - }, - "description": "Updates an existing group. You can change any group attributes except name." - }, - "create": { - "response": { - "$ref": "Group" - }, - "parameterOrder": [ - "name" - ], - "httpMethod": "POST", - "parameters": { - "name": { - "description": "The project in which to create the group. The format is \"projects/{project_id_or_number}\".", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" - }, - "validateOnly": { - "location": "query", - "description": "If true, validate this request but do not create the group.", - "type": "boolean" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring" - ], - "flatPath": "v3/projects/{projectsId}/groups", - "path": "v3/{+name}/groups", - "id": "monitoring.projects.groups.create", - "request": { - "$ref": "Group" - }, - "description": "Creates a new group." - } - }, - "resources": { - "members": { - "methods": { - "list": { - "id": "monitoring.projects.groups.members.list", - "path": "v3/{+name}/members", - "description": "Lists the monitored resources that are members of a group.", - "httpMethod": "GET", - "response": { - "$ref": "ListGroupMembersResponse" - }, - "parameterOrder": [ - "name" - ], - "parameters": { - "pageToken": { - "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", - "type": "string", - "location": "query" - }, - "interval.startTime": { - "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.", - "format": "google-datetime", - "type": "string", - "location": "query" - }, - "pageSize": { - "description": "A positive number that is the maximum number of results to return.", - "format": "int32", - "type": "integer", - "location": "query" - }, - "name": { - "description": "The group whose members are listed. The format is \"projects/{project_id_or_number}/groups/{group_id}\".", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/groups/[^/]+$", - "location": "path" - }, - "interval.endTime": { - "description": "Required. The end of the time interval.", - "format": "google-datetime", - "type": "string", - "location": "query" - }, - "filter": { - "description": "An optional list filter describing the members to be returned. The filter may reference the type, labels, and metadata of monitored resources that comprise the group. For example, to return only resources representing Compute Engine VM instances, use this filter:\nresource.type = \"gce_instance\"\n", - "type": "string", - "location": "query" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read" - ], - "flatPath": "v3/projects/{projectsId}/groups/{groupsId}/members" - } - } - } - } + "baseUrl": "https://monitoring.googleapis.com/", + "description": "Manages your Stackdriver Monitoring data and configurations. Most projects must be associated with a Stackdriver account, with a few exceptions as noted on the individual method pages.", + "servicePath": "", + "kind": "discovery#restDescription", + "basePath": "", + "id": "monitoring:v3", + "documentationLink": "https://cloud.google.com/monitoring/api/", + "revision": "20170731", + "discoveryVersion": "v1", + "version_module": "True", + "schemas": { + "Linear": { + "description": "Specifies a linear sequence of buckets that all have the same width (except overflow and underflow). Each bucket represents a constant absolute uncertainty on the specific value in the bucket.There are num_finite_buckets + 2 (= N) buckets. Bucket i has the following boundaries:Upper bound (0 \u003c= i \u003c N-1): offset + (width * i). Lower bound (1 \u003c= i \u003c N): offset + (width * (i - 1)).", + "type": "object", + "properties": { + "numFiniteBuckets": { + "format": "int32", + "description": "Must be greater than 0.", + "type": "integer" + }, + "width": { + "format": "double", + "description": "Must be greater than 0.", + "type": "number" + }, + "offset": { + "format": "double", + "description": "Lower bound of the first bucket.", + "type": "number" } - } - } - }, - "parameters": { - "bearer_token": { - "location": "query", - "description": "OAuth bearer token.", - "type": "string" - }, - "oauth_token": { - "description": "OAuth 2.0 token for the current user.", - "type": "string", - "location": "query" - }, - "upload_protocol": { - "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", - "type": "string", - "location": "query" - }, - "prettyPrint": { - "location": "query", - "description": "Returns response with indentations and line breaks.", - "type": "boolean", - "default": "true" + }, + "id": "Linear" }, - "uploadType": { - "location": "query", - "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").", - "type": "string" + "Option": { + "description": "A protocol buffer option, which can be attached to a message, field, enumeration, etc.", + "type": "object", + "properties": { + "value": { + "additionalProperties": { + "description": "Properties of the object. Contains field @type with type URL.", + "type": "any" + }, + "description": "The option's value packed in an Any message. If the value is a primitive, the corresponding wrapper type defined in google/protobuf/wrappers.proto should be used. If the value is an enum, it should be stored as an int32 value using the google.protobuf.Int32Value type.", + "type": "object" + }, + "name": { + "description": "The option's name. For protobuf built-in options (options defined in descriptor.proto), this is the short name. For example, \"map_entry\". For custom options, it should be the fully-qualified name. For example, \"google.api.http\".", + "type": "string" + } + }, + "id": "Option" }, - "fields": { - "description": "Selector specifying which fields to include in a partial response.", - "type": "string", - "location": "query" + "Empty": { + "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.", + "type": "object", + "properties": {}, + "id": "Empty" }, - "callback": { - "description": "JSONP", - "type": "string", - "location": "query" + "Explicit": { + "description": "Specifies a set of buckets with arbitrary widths.There are size(bounds) + 1 (= N) buckets. Bucket i has the following boundaries:Upper bound (0 \u003c= i \u003c N-1): boundsi Lower bound (1 \u003c= i \u003c N); boundsi - 1The bounds field must contain at least one element. If bounds has only one element, then there are no finite buckets, and that single element is the common boundary of the overflow and underflow buckets.", + "type": "object", + "properties": { + "bounds": { + "description": "The values must be monotonically increasing.", + "items": { + "format": "double", + "type": "number" + }, + "type": "array" + } + }, + "id": "Explicit" }, - "$.xgafv": { - "enum": [ - "1", - "2" - ], - "description": "V1 error format.", - "type": "string", - "enumDescriptions": [ - "v1 error format", - "v2 error format" - ], - "location": "query" + "TimeInterval": { + "description": "A time interval extending just after a start time through an end time. If the start time is the same as the end time, then the interval represents a single point in time.", + "type": "object", + "properties": { + "endTime": { + "format": "google-datetime", + "description": "Required. The end of the time interval.", + "type": "string" + }, + "startTime": { + "format": "google-datetime", + "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.", + "type": "string" + } + }, + "id": "TimeInterval" }, - "alt": { - "enum": [ - "json", - "media", - "proto" - ], - "type": "string", - "enumDescriptions": [ - "Responses with Content-Type of application/json", - "Media download with context-dependent Content-Type", - "Responses with Content-Type of application/x-protobuf" - ], - "location": "query", - "description": "Data format for response.", - "default": "json" + "Exponential": { + "description": "Specifies an exponential sequence of buckets that have a width that is proportional to the value of the lower bound. Each bucket represents a constant relative uncertainty on a specific value in the bucket.There are num_finite_buckets + 2 (= N) buckets. Bucket i has the following boundaries:Upper bound (0 \u003c= i \u003c N-1): scale * (growth_factor ^ i). Lower bound (1 \u003c= i \u003c N): scale * (growth_factor ^ (i - 1)).", + "type": "object", + "properties": { + "numFiniteBuckets": { + "format": "int32", + "description": "Must be greater than 0.", + "type": "integer" + }, + "growthFactor": { + "format": "double", + "description": "Must be greater than 1.", + "type": "number" + }, + "scale": { + "format": "double", + "description": "Must be greater than 0.", + "type": "number" + } + }, + "id": "Exponential" }, - "key": { - "location": "query", - "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", - "type": "string" + "Point": { + "description": "A single data point in a time series.", + "type": "object", + "properties": { + "value": { + "$ref": "TypedValue", + "description": "The value of the data point." + }, + "interval": { + "$ref": "TimeInterval", + "description": "The time interval to which the data point applies. For GAUGE metrics, only the end time of the interval is used. For DELTA metrics, the start and end time should specify a non-zero interval, with subsequent points specifying contiguous and non-overlapping intervals. For CUMULATIVE metrics, the start and end time should specify a non-zero interval, with subsequent points specifying the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points." + } + }, + "id": "Point" }, - "access_token": { - "description": "OAuth access token.", - "type": "string", - "location": "query" + "Field": { + "description": "A single field of a message type.", + "type": "object", + "properties": { + "typeUrl": { + "description": "The field type URL, without the scheme, for message or enumeration types. Example: \"type.googleapis.com/google.protobuf.Timestamp\".", + "type": "string" + }, + "number": { + "format": "int32", + "description": "The field number.", + "type": "integer" + }, + "jsonName": { + "description": "The field JSON name.", + "type": "string" + }, + "kind": { + "description": "The field type.", + "type": "string", + "enumDescriptions": [ + "Field type unknown.", + "Field type double.", + "Field type float.", + "Field type int64.", + "Field type uint64.", + "Field type int32.", + "Field type fixed64.", + "Field type fixed32.", + "Field type bool.", + "Field type string.", + "Field type group. Proto2 syntax only, and deprecated.", + "Field type message.", + "Field type bytes.", + "Field type uint32.", + "Field type enum.", + "Field type sfixed32.", + "Field type sfixed64.", + "Field type sint32.", + "Field type sint64." + ], + "enum": [ + "TYPE_UNKNOWN", + "TYPE_DOUBLE", + "TYPE_FLOAT", + "TYPE_INT64", + "TYPE_UINT64", + "TYPE_INT32", + "TYPE_FIXED64", + "TYPE_FIXED32", + "TYPE_BOOL", + "TYPE_STRING", + "TYPE_GROUP", + "TYPE_MESSAGE", + "TYPE_BYTES", + "TYPE_UINT32", + "TYPE_ENUM", + "TYPE_SFIXED32", + "TYPE_SFIXED64", + "TYPE_SINT32", + "TYPE_SINT64" + ] + }, + "options": { + "description": "The protocol buffer options.", + "items": { + "$ref": "Option" + }, + "type": "array" + }, + "oneofIndex": { + "format": "int32", + "description": "The index of the field type in Type.oneofs, for message or enumeration types. The first type has index 1; zero means the type is not in the list.", + "type": "integer" + }, + "packed": { + "description": "Whether to use alternative packed wire representation.", + "type": "boolean" + }, + "cardinality": { + "description": "The field cardinality.", + "type": "string", + "enumDescriptions": [ + "For fields with unknown cardinality.", + "For optional fields.", + "For required fields. Proto2 syntax only.", + "For repeated fields." + ], + "enum": [ + "CARDINALITY_UNKNOWN", + "CARDINALITY_OPTIONAL", + "CARDINALITY_REQUIRED", + "CARDINALITY_REPEATED" + ] + }, + "defaultValue": { + "description": "The string value of the default value of this field. Proto2 syntax only.", + "type": "string" + }, + "name": { + "description": "The field name.", + "type": "string" + } + }, + "id": "Field" }, - "quotaUser": { - "location": "query", - "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", - "type": "string" + "Metric": { + "description": "A specific metric, identified by specifying values for all of the labels of a MetricDescriptor.", + "type": "object", + "properties": { + "labels": { + "description": "The set of label values that uniquely identify this metric. All labels listed in the MetricDescriptor must be assigned values.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "type": { + "description": "An existing metric type, see google.api.MetricDescriptor. For example, custom.googleapis.com/invoice/paid/amount.", + "type": "string" + } + }, + "id": "Metric" + }, + "ListTimeSeriesResponse": { + "description": "The ListTimeSeries response.", + "type": "object", + "properties": { + "timeSeries": { + "description": "One or more time series that match the filter included in the request.", + "items": { + "$ref": "TimeSeries" + }, + "type": "array" + }, + "nextPageToken": { + "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.", + "type": "string" + } + }, + "id": "ListTimeSeriesResponse" }, - "pp": { - "description": "Pretty-print response.", - "type": "boolean", - "default": "true", - "location": "query" - } - }, - "version": "v3", - "baseUrl": "https://monitoring.googleapis.com/", - "kind": "discovery#restDescription", - "servicePath": "", - "description": "Manages your Stackdriver Monitoring data and configurations. Most projects must be associated with a Stackdriver account, with a few exceptions as noted on the individual method pages.", - "basePath": "", - "documentationLink": "https://cloud.google.com/monitoring/api/", - "id": "monitoring:v3", - "revision": "20170424", - "discoveryVersion": "v1", - "version_module": "True", - "schemas": { "LabelDescriptor": { "description": "A description of a label.", "type": "object", "properties": { - "key": { - "description": "The label key.", - "type": "string" - }, "description": { "description": "A human-readable description for the label.", "type": "string" }, "valueType": { + "description": "The type of data that can be assigned to the label.", + "type": "string", "enumDescriptions": [ "A variable-length string. This is the default.", "Boolean; true or false.", @@ -823,192 +288,360 @@ "STRING", "BOOL", "INT64" - ], - "description": "The type of data that can be assigned to the label.", + ] + }, + "key": { + "description": "The label key.", "type": "string" } }, "id": "LabelDescriptor" }, - "ListTimeSeriesResponse": { + "Type": { + "description": "A protocol buffer message type.", + "type": "object", "properties": { - "nextPageToken": { - "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.", + "options": { + "description": "The protocol buffer options.", + "items": { + "$ref": "Option" + }, + "type": "array" + }, + "fields": { + "description": "The list of fields.", + "items": { + "$ref": "Field" + }, + "type": "array" + }, + "name": { + "description": "The fully qualified message name.", "type": "string" }, - "timeSeries": { - "description": "One or more time series that match the filter included in the request.", - "type": "array", + "oneofs": { + "description": "The list of types appearing in oneof definitions in this type.", "items": { - "$ref": "TimeSeries" - } + "type": "string" + }, + "type": "array" + }, + "sourceContext": { + "description": "The source context.", + "$ref": "SourceContext" + }, + "syntax": { + "description": "The source syntax.", + "type": "string", + "enumDescriptions": [ + "Syntax proto2.", + "Syntax proto3." + ], + "enum": [ + "SYNTAX_PROTO2", + "SYNTAX_PROTO3" + ] } }, - "id": "ListTimeSeriesResponse", - "description": "The ListTimeSeries response.", - "type": "object" + "id": "Type" }, "Group": { + "description": "The description of a dynamic collection of monitored resources. Each group has a filter that is matched against monitored resources and their associated metadata. If a group's filter matches an available monitored resource, then that resource is a member of that group. Groups can contain any number of monitored resources, and each monitored resource can be a member of any number of groups.Groups can be nested in parent-child hierarchies. The parentName field identifies an optional parent for each group. If a group has a parent, then the only monitored resources available to be matched by the group's filter are the resources contained in the parent group. In other words, a group contains the monitored resources that match its filter and the filters of all the group's ancestors. A group without a parent can contain any monitored resource.For example, consider an infrastructure running a set of instances with two user-defined tags: \"environment\" and \"role\". A parent group has a filter, environment=\"production\". A child of that parent group has a filter, role=\"transcoder\". The parent group contains all instances in the production environment, regardless of their roles. The child group contains instances that have the transcoder role and are in the production environment.The monitored resources contained in a group can change at any moment, depending on what resources exist and what filters are associated with the group and its ancestors.", + "type": "object", "properties": { + "displayName": { + "description": "A user-assigned name for this group, used only for display purposes.", + "type": "string" + }, + "isCluster": { + "description": "If true, the members of this group are considered to be a cluster. The system can perform additional analysis on groups that are clusters.", + "type": "boolean" + }, "filter": { "description": "The filter used to determine which monitored resources belong to this group.", "type": "string" }, + "parentName": { + "description": "The name of the group's parent, if it has one. The format is \"projects/{project_id_or_number}/groups/{group_id}\". For groups with no parent, parentName is the empty string, \"\".", + "type": "string" + }, "name": { "description": "Output only. The name of this group. The format is \"projects/{project_id_or_number}/groups/{group_id}\". When creating a group, this field is ignored and a new name is created consisting of the project specified in the call to CreateGroup and a unique {group_id} that is generated automatically.", "type": "string" + } + }, + "id": "Group" + }, + "BucketOptions": { + "description": "BucketOptions describes the bucket boundaries used to create a histogram for the distribution. The buckets can be in a linear sequence, an exponential sequence, or each bucket can be specified explicitly. BucketOptions does not include the number of values in each bucket.A bucket has an inclusive lower bound and exclusive upper bound for the values that are counted for that bucket. The upper bound of a bucket must be strictly greater than the lower bound. The sequence of N buckets for a distribution consists of an underflow bucket (number 0), zero or more finite buckets (number 1 through N - 2) and an overflow bucket (number N - 1). The buckets are contiguous: the lower bound of bucket i (i \u003e 0) is the same as the upper bound of bucket i - 1. The buckets span the whole range of finite values: lower bound of the underflow bucket is -infinity and the upper bound of the overflow bucket is +infinity. The finite buckets are so-called because both bounds are finite.", + "type": "object", + "properties": { + "explicitBuckets": { + "description": "The explicit buckets.", + "$ref": "Explicit" }, - "parentName": { - "description": "The name of the group's parent, if it has one. The format is \"projects/{project_id_or_number}/groups/{group_id}\". For groups with no parent, parentName is the empty string, \"\".", - "type": "string" + "linearBuckets": { + "$ref": "Linear", + "description": "The linear bucket." }, - "displayName": { - "description": "A user-assigned name for this group, used only for display purposes.", + "exponentialBuckets": { + "$ref": "Exponential", + "description": "The exponential buckets." + } + }, + "id": "BucketOptions" + }, + "CollectdValue": { + "description": "A single data point from a collectd-based plugin.", + "type": "object", + "properties": { + "value": { + "description": "The measurement value.", + "$ref": "TypedValue" + }, + "dataSourceType": { + "enumDescriptions": [ + "An unspecified data source type. This corresponds to google.api.MetricDescriptor.MetricKind.METRIC_KIND_UNSPECIFIED.", + "An instantaneous measurement of a varying quantity. This corresponds to google.api.MetricDescriptor.MetricKind.GAUGE.", + "A cumulative value over time. This corresponds to google.api.MetricDescriptor.MetricKind.CUMULATIVE.", + "A rate of change of the measurement.", + "An amount of change since the last measurement interval. This corresponds to google.api.MetricDescriptor.MetricKind.DELTA." + ], + "enum": [ + "UNSPECIFIED_DATA_SOURCE_TYPE", + "GAUGE", + "COUNTER", + "DERIVE", + "ABSOLUTE" + ], + "description": "The type of measurement.", "type": "string" }, - "isCluster": { - "description": "If true, the members of this group are considered to be a cluster. The system can perform additional analysis on groups that are clusters.", - "type": "boolean" + "dataSourceName": { + "description": "The data source for the collectd value. For example there are two data sources for network measurements: \"rx\" and \"tx\".", + "type": "string" } }, - "id": "Group", - "description": "The description of a dynamic collection of monitored resources. Each group has a filter that is matched against monitored resources and their associated metadata. If a group's filter matches an available monitored resource, then that resource is a member of that group. Groups can contain any number of monitored resources, and each monitored resource can be a member of any number of groups.Groups can be nested in parent-child hierarchies. The parentName field identifies an optional parent for each group. If a group has a parent, then the only monitored resources available to be matched by the group's filter are the resources contained in the parent group. In other words, a group contains the monitored resources that match its filter and the filters of all the group's ancestors. A group without a parent can contain any monitored resource.For example, consider an infrastructure running a set of instances with two user-defined tags: \"environment\" and \"role\". A parent group has a filter, environment=\"production\". A child of that parent group has a filter, role=\"transcoder\". The parent group contains all instances in the production environment, regardless of their roles. The child group contains instances that have the transcoder role and are in the production environment.The monitored resources contained in a group can change at any moment, depending on what resources exist and what filters are associated with the group and its ancestors.", - "type": "object" + "id": "CollectdValue" }, - "Type": { + "SourceContext": { + "description": "SourceContext represents information about the source of a protobuf element, like the file in which it is defined.", + "type": "object", "properties": { - "fields": { - "description": "The list of fields.", - "type": "array", + "fileName": { + "description": "The path-qualified name of the .proto file that contained the associated protobuf element. For example: \"google/protobuf/source_context.proto\".", + "type": "string" + } + }, + "id": "SourceContext" + }, + "MetricDescriptor": { + "description": "Defines a metric type and its schema. Once a metric descriptor is created, deleting or altering it stops data collection and makes the metric type's existing data unusable.", + "type": "object", + "properties": { + "metricKind": { + "description": "Whether the metric records instantaneous values, changes to a value, etc. Some combinations of metric_kind and value_type might not be supported.", + "type": "string", + "enumDescriptions": [ + "Do not use this default value.", + "An instantaneous measurement of a value.", + "The change in a value during a time interval.", + "A value accumulated over a time interval. Cumulative measurements in a time series should have the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points." + ], + "enum": [ + "METRIC_KIND_UNSPECIFIED", + "GAUGE", + "DELTA", + "CUMULATIVE" + ] + }, + "displayName": { + "description": "A concise name for the metric, which can be displayed in user interfaces. Use sentence case without an ending period, for example \"Request count\".", + "type": "string" + }, + "description": { + "description": "A detailed description of the metric, which can be used in documentation.", + "type": "string" + }, + "unit": { + "description": "The unit in which the metric value is reported. It is only applicable if the value_type is INT64, DOUBLE, or DISTRIBUTION. The supported units are a subset of The Unified Code for Units of Measure (http://unitsofmeasure.org/ucum.html) standard:Basic units (UNIT)\nbit bit\nBy byte\ns second\nmin minute\nh hour\nd dayPrefixes (PREFIX)\nk kilo (10**3)\nM mega (10**6)\nG giga (10**9)\nT tera (10**12)\nP peta (10**15)\nE exa (10**18)\nZ zetta (10**21)\nY yotta (10**24)\nm milli (10**-3)\nu micro (10**-6)\nn nano (10**-9)\np pico (10**-12)\nf femto (10**-15)\na atto (10**-18)\nz zepto (10**-21)\ny yocto (10**-24)\nKi kibi (2**10)\nMi mebi (2**20)\nGi gibi (2**30)\nTi tebi (2**40)GrammarThe grammar includes the dimensionless unit 1, such as 1/s.The grammar also includes these connectors:\n/ division (as an infix operator, e.g. 1/s).\n. multiplication (as an infix operator, e.g. GBy.d)The grammar for a unit is as follows:\nExpression = Component { \".\" Component } { \"/\" Component } ;\n\nComponent = [ PREFIX ] UNIT [ Annotation ]\n | Annotation\n | \"1\"\n ;\n\nAnnotation = \"{\" NAME \"}\" ;\nNotes:\nAnnotation is just a comment if it follows a UNIT and is equivalent to 1 if it is used alone. For examples, {requests}/s == 1/s, By{transmitted}/s == By/s.\nNAME is a sequence of non-blank printable ASCII characters not containing '{' or '}'.", + "type": "string" + }, + "labels": { + "description": "The set of labels that can be used to describe a specific instance of this metric type. For example, the appengine.googleapis.com/http/server/response_latencies metric type has a label for the HTTP response code, response_code, so you can look at latencies for successful responses or just for responses that failed.", "items": { - "$ref": "Field" - } + "$ref": "LabelDescriptor" + }, + "type": "array" }, "name": { - "description": "The fully qualified message name.", + "description": "The resource name of the metric descriptor. Depending on the implementation, the name typically includes: (1) the parent resource name that defines the scope of the metric type or of its data; and (2) the metric's URL-encoded type, which also appears in the type field of this descriptor. For example, following is the resource name of a custom metric within the GCP project my-project-id:\n\"projects/my-project-id/metricDescriptors/custom.googleapis.com%2Finvoice%2Fpaid%2Famount\"\n", "type": "string" }, - "oneofs": { - "description": "The list of types appearing in oneof definitions in this type.", - "type": "array", - "items": { - "type": "string" - } + "type": { + "description": "The metric type, including its DNS name prefix. The type is not URL-encoded. All user-defined custom metric types have the DNS name custom.googleapis.com. Metric types should use a natural hierarchical grouping. For example:\n\"custom.googleapis.com/invoice/paid/amount\"\n\"appengine.googleapis.com/http/server/response_latencies\"\n", + "type": "string" }, - "syntax": { + "valueType": { "enumDescriptions": [ - "Syntax proto2.", - "Syntax proto3." + "Do not use this default value.", + "The value is a boolean. This value type can be used only if the metric kind is GAUGE.", + "The value is a signed 64-bit integer.", + "The value is a double precision floating point number.", + "The value is a text string. This value type can be used only if the metric kind is GAUGE.", + "The value is a Distribution.", + "The value is money." ], "enum": [ - "SYNTAX_PROTO2", - "SYNTAX_PROTO3" + "VALUE_TYPE_UNSPECIFIED", + "BOOL", + "INT64", + "DOUBLE", + "STRING", + "DISTRIBUTION", + "MONEY" ], - "description": "The source syntax.", + "description": "Whether the measurement is an integer, a floating-point number, etc. Some combinations of metric_kind and value_type might not be supported.", "type": "string" + } + }, + "id": "MetricDescriptor" + }, + "Range": { + "description": "The range of the population values.", + "type": "object", + "properties": { + "min": { + "format": "double", + "description": "The minimum of the population values.", + "type": "number" }, - "sourceContext": { - "description": "The source context.", - "$ref": "SourceContext" + "max": { + "format": "double", + "description": "The maximum of the population values.", + "type": "number" + } + }, + "id": "Range" + }, + "ListGroupsResponse": { + "description": "The ListGroups response.", + "type": "object", + "properties": { + "nextPageToken": { + "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.", + "type": "string" }, - "options": { - "description": "The protocol buffer options.", - "type": "array", - "items": { - "$ref": "Option" - } + "group": { + "description": "The groups that match the specified filters.", + "items": { + "$ref": "Group" + }, + "type": "array" } }, - "id": "Type", - "description": "A protocol buffer message type.", - "type": "object" + "id": "ListGroupsResponse" }, - "BucketOptions": { - "description": "BucketOptions describes the bucket boundaries used to create a histogram for the distribution. The buckets can be in a linear sequence, an exponential sequence, or each bucket can be specified explicitly. BucketOptions does not include the number of values in each bucket.A bucket has an inclusive lower bound and exclusive upper bound for the values that are counted for that bucket. The upper bound of a bucket must be strictly greater than the lower bound. The sequence of N buckets for a distribution consists of an underflow bucket (number 0), zero or more finite buckets (number 1 through N - 2) and an overflow bucket (number N - 1). The buckets are contiguous: the lower bound of bucket i (i \u003e 0) is the same as the upper bound of bucket i - 1. The buckets span the whole range of finite values: lower bound of the underflow bucket is -infinity and the upper bound of the overflow bucket is +infinity. The finite buckets are so-called because both bounds are finite.", + "CreateCollectdTimeSeriesRequest": { + "description": "The CreateCollectdTimeSeries request.", "type": "object", "properties": { - "exponentialBuckets": { - "$ref": "Exponential", - "description": "The exponential buckets." + "collectdPayloads": { + "description": "The collectd payloads representing the time series data. You must not include more than a single point for each time series, so no two payloads can have the same values for all of the fields plugin, plugin_instance, type, and type_instance.", + "items": { + "$ref": "CollectdPayload" + }, + "type": "array" }, - "linearBuckets": { - "description": "The linear bucket.", - "$ref": "Linear" + "resource": { + "$ref": "MonitoredResource", + "description": "The monitored resource associated with the time series." }, - "explicitBuckets": { - "description": "The explicit buckets.", - "$ref": "Explicit" + "collectdVersion": { + "description": "The version of collectd that collected the data. Example: \"5.3.0-192.el6\".", + "type": "string" } }, - "id": "BucketOptions" + "id": "CreateCollectdTimeSeriesRequest" }, - "CollectdValue": { - "description": "A single data point from a collectd-based plugin.", + "ListGroupMembersResponse": { + "description": "The ListGroupMembers response.", "type": "object", "properties": { - "value": { - "$ref": "TypedValue", - "description": "The measurement value." + "members": { + "description": "A set of monitored resources in the group.", + "items": { + "$ref": "MonitoredResource" + }, + "type": "array" }, - "dataSourceType": { - "enumDescriptions": [ - "An unspecified data source type. This corresponds to google.api.MetricDescriptor.MetricKind.METRIC_KIND_UNSPECIFIED.", - "An instantaneous measurement of a varying quantity. This corresponds to google.api.MetricDescriptor.MetricKind.GAUGE.", - "A cumulative value over time. This corresponds to google.api.MetricDescriptor.MetricKind.CUMULATIVE.", - "A rate of change of the measurement.", - "An amount of change since the last measurement interval. This corresponds to google.api.MetricDescriptor.MetricKind.DELTA." - ], - "enum": [ - "UNSPECIFIED_DATA_SOURCE_TYPE", - "GAUGE", - "COUNTER", - "DERIVE", - "ABSOLUTE" - ], - "description": "The type of measurement.", + "nextPageToken": { + "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.", "type": "string" }, - "dataSourceName": { - "description": "The data source for the collectd value. For example there are two data sources for network measurements: \"rx\" and \"tx\".", - "type": "string" + "totalSize": { + "format": "int32", + "description": "The total number of elements matching this request.", + "type": "integer" } }, - "id": "CollectdValue" + "id": "ListGroupMembersResponse" }, - "MetricDescriptor": { - "description": "Defines a metric type and its schema. Once a metric descriptor is created, deleting or altering it stops data collection and makes the metric type's existing data unusable.", + "ListMonitoredResourceDescriptorsResponse": { + "description": "The ListMonitoredResourceDescriptors response.", "type": "object", "properties": { - "unit": { - "description": "The unit in which the metric value is reported. It is only applicable if the value_type is INT64, DOUBLE, or DISTRIBUTION. The supported units are a subset of The Unified Code for Units of Measure (http://unitsofmeasure.org/ucum.html) standard:Basic units (UNIT)\nbit bit\nBy byte\ns second\nmin minute\nh hour\nd dayPrefixes (PREFIX)\nk kilo (10**3)\nM mega (10**6)\nG giga (10**9)\nT tera (10**12)\nP peta (10**15)\nE exa (10**18)\nZ zetta (10**21)\nY yotta (10**24)\nm milli (10**-3)\nu micro (10**-6)\nn nano (10**-9)\np pico (10**-12)\nf femto (10**-15)\na atto (10**-18)\nz zepto (10**-21)\ny yocto (10**-24)\nKi kibi (2**10)\nMi mebi (2**20)\nGi gibi (2**30)\nTi tebi (2**40)GrammarThe grammar includes the dimensionless unit 1, such as 1/s.The grammar also includes these connectors:\n/ division (as an infix operator, e.g. 1/s).\n. multiplication (as an infix operator, e.g. GBy.d)The grammar for a unit is as follows:\nExpression = Component { \".\" Component } { \"/\" Component } ;\n\nComponent = [ PREFIX ] UNIT [ Annotation ]\n | Annotation\n | \"1\"\n ;\n\nAnnotation = \"{\" NAME \"}\" ;\nNotes:\nAnnotation is just a comment if it follows a UNIT and is equivalent to 1 if it is used alone. For examples, {requests}/s == 1/s, By{transmitted}/s == By/s.\nNAME is a sequence of non-blank printable ASCII characters not containing '{' or '}'.", + "nextPageToken": { + "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.", "type": "string" }, - "labels": { - "description": "The set of labels that can be used to describe a specific instance of this metric type. For example, the appengine.googleapis.com/http/server/response_latencies metric type has a label for the HTTP response code, response_code, so you can look at latencies for successful responses or just for responses that failed.", - "type": "array", + "resourceDescriptors": { + "description": "The monitored resource descriptors that are available to this project and that match filter, if present.", "items": { - "$ref": "LabelDescriptor" - } + "$ref": "MonitoredResourceDescriptor" + }, + "type": "array" + } + }, + "id": "ListMonitoredResourceDescriptorsResponse" + }, + "TimeSeries": { + "description": "A collection of data points that describes the time-varying values of a metric. A time series is identified by a combination of a fully-specified monitored resource and a fully-specified metric. This type is used for both listing and creating time series.", + "type": "object", + "properties": { + "resource": { + "description": "The associated monitored resource. Custom metrics can use only certain monitored resource types in their time series data.", + "$ref": "MonitoredResource" }, - "name": { - "description": "The resource name of the metric descriptor. Depending on the implementation, the name typically includes: (1) the parent resource name that defines the scope of the metric type or of its data; and (2) the metric's URL-encoded type, which also appears in the type field of this descriptor. For example, following is the resource name of a custom metric within the GCP project my-project-id:\n\"projects/my-project-id/metricDescriptors/custom.googleapis.com%2Finvoice%2Fpaid%2Famount\"\n", - "type": "string" + "metricKind": { + "description": "The metric kind of the time series. When listing time series, this metric kind might be different from the metric kind of the associated metric if this time series is an alignment or reduction of other time series.When creating a time series, this field is optional. If present, it must be the same as the metric kind of the associated metric. If the associated metric's descriptor must be auto-created, then this field specifies the metric kind of the new descriptor and must be either GAUGE (the default) or CUMULATIVE.", + "type": "string", + "enumDescriptions": [ + "Do not use this default value.", + "An instantaneous measurement of a value.", + "The change in a value during a time interval.", + "A value accumulated over a time interval. Cumulative measurements in a time series should have the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points." + ], + "enum": [ + "METRIC_KIND_UNSPECIFIED", + "GAUGE", + "DELTA", + "CUMULATIVE" + ] }, - "type": { - "description": "The metric type, including its DNS name prefix. The type is not URL-encoded. All user-defined custom metric types have the DNS name custom.googleapis.com. Metric types should use a natural hierarchical grouping. For example:\n\"custom.googleapis.com/invoice/paid/amount\"\n\"appengine.googleapis.com/http/server/response_latencies\"\n", - "type": "string" + "points": { + "description": "The data points of this time series. When listing time series, the order of the points is specified by the list method.When creating a time series, this field must contain exactly one point and the point's type must be the same as the value type of the associated metric. If the associated metric's descriptor must be auto-created, then the value type of the descriptor is determined by the point's type, which must be BOOL, INT64, DOUBLE, or DISTRIBUTION.", + "items": { + "$ref": "Point" + }, + "type": "array" + }, + "metric": { + "$ref": "Metric", + "description": "The associated metric. A fully-specified metric used to identify the time series." }, "valueType": { - "enum": [ - "VALUE_TYPE_UNSPECIFIED", - "BOOL", - "INT64", - "DOUBLE", - "STRING", - "DISTRIBUTION", - "MONEY" - ], - "description": "Whether the measurement is an integer, a floating-point number, etc. Some combinations of metric_kind and value_type might not be supported.", + "description": "The value type of the time series. When listing time series, this value type might be different from the value type of the associated metric if this time series is an alignment or reduction of other time series.When creating a time series, this field is optional. If present, it must be the same as the type of the data in the points field.", "type": "string", "enumDescriptions": [ "Do not use this default value.", @@ -1018,667 +651,979 @@ "The value is a text string. This value type can be used only if the metric kind is GAUGE.", "The value is a Distribution.", "The value is money." - ] - }, - "metricKind": { - "enum": [ - "METRIC_KIND_UNSPECIFIED", - "GAUGE", - "DELTA", - "CUMULATIVE" ], - "description": "Whether the metric records instantaneous values, changes to a value, etc. Some combinations of metric_kind and value_type might not be supported.", - "type": "string", - "enumDescriptions": [ - "Do not use this default value.", - "An instantaneous measurement of a value.", - "The change in a value during a time interval.", - "A value accumulated over a time interval. Cumulative measurements in a time series should have the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points." + "enum": [ + "VALUE_TYPE_UNSPECIFIED", + "BOOL", + "INT64", + "DOUBLE", + "STRING", + "DISTRIBUTION", + "MONEY" ] - }, - "displayName": { - "description": "A concise name for the metric, which can be displayed in user interfaces. Use sentence case without an ending period, for example \"Request count\".", - "type": "string" - }, - "description": { - "description": "A detailed description of the metric, which can be used in documentation.", - "type": "string" } }, - "id": "MetricDescriptor" + "id": "TimeSeries" }, - "SourceContext": { - "description": "SourceContext represents information about the source of a protobuf element, like the file in which it is defined.", + "CreateTimeSeriesRequest": { + "description": "The CreateTimeSeries request.", "type": "object", "properties": { - "fileName": { - "description": "The path-qualified name of the .proto file that contained the associated protobuf element. For example: \"google/protobuf/source_context.proto\".", - "type": "string" + "timeSeries": { + "description": "The new data to be added to a list of time series. Adds at most one data point to each of several time series. The new data point must be more recent than any other point in its time series. Each TimeSeries value must fully specify a unique time series by supplying all label values for the metric and the monitored resource.", + "items": { + "$ref": "TimeSeries" + }, + "type": "array" } }, - "id": "SourceContext" + "id": "CreateTimeSeriesRequest" }, - "Range": { + "Distribution": { + "description": "Distribution contains summary statistics for a population of values. It optionally contains a histogram representing the distribution of those values across a set of buckets.The summary statistics are the count, mean, sum of the squared deviation from the mean, the minimum, and the maximum of the set of population of values. The histogram is based on a sequence of buckets and gives a count of values that fall into each bucket. The boundaries of the buckets are given either explicitly or by formulas for buckets of fixed or exponentially increasing widths.Although it is not forbidden, it is generally a bad idea to include non-finite values (infinities or NaNs) in the population of values, as this will render the mean and sum_of_squared_deviation fields meaningless.", + "type": "object", "properties": { - "min": { - "description": "The minimum of the population values.", + "bucketCounts": { + "description": "Required in the Stackdriver Monitoring API v3. The values for each bucket specified in bucket_options. The sum of the values in bucketCounts must equal the value in the count field of the Distribution object. The order of the bucket counts follows the numbering schemes described for the three bucket types. The underflow bucket has number 0; the finite buckets, if any, have numbers 1 through N-2; and the overflow bucket has number N-1. The size of bucket_counts must not be greater than N. If the size is less than N, then the remaining buckets are assigned values of zero.", + "items": { + "format": "int64", + "type": "string" + }, + "type": "array" + }, + "bucketOptions": { + "description": "Required in the Stackdriver Monitoring API v3. Defines the histogram bucket boundaries.", + "$ref": "BucketOptions" + }, + "sumOfSquaredDeviation": { "format": "double", + "description": "The sum of squared deviations from the mean of the values in the population. For values x_i this is:\nSum[i=1..n]((x_i - mean)^2)\nKnuth, \"The Art of Computer Programming\", Vol. 2, page 323, 3rd edition describes Welford's method for accumulating this sum in one pass.If count is zero then this field must be zero.", "type": "number" }, - "max": { - "description": "The maximum of the population values.", + "range": { + "description": "If specified, contains the range of the population values. The field must not be present if the count is zero. This field is presently ignored by the Stackdriver Monitoring API v3.", + "$ref": "Range" + }, + "count": { + "format": "int64", + "description": "The number of values in the population. Must be non-negative. This value must equal the sum of the values in bucket_counts if a histogram is provided.", + "type": "string" + }, + "mean": { "format": "double", + "description": "The arithmetic mean of the values in the population. If count is zero then this field must be zero.", "type": "number" } }, - "id": "Range", - "description": "The range of the population values.", - "type": "object" + "id": "Distribution" }, - "ListGroupsResponse": { + "MonitoredResource": { + "description": "An object representing a resource that can be used for monitoring, logging, billing, or other purposes. Examples include virtual machine instances, databases, and storage devices such as disks. The type field identifies a MonitoredResourceDescriptor object that describes the resource's schema. Information in the labels field identifies the actual resource and its attributes according to the schema. For example, a particular Compute Engine VM instance could be represented by the following object, because the MonitoredResourceDescriptor for \"gce_instance\" has labels \"instance_id\" and \"zone\":\n{ \"type\": \"gce_instance\",\n \"labels\": { \"instance_id\": \"12345678901234\",\n \"zone\": \"us-central1-a\" }}\n", + "type": "object", + "properties": { + "labels": { + "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Compute Engine VM instances use the labels \"project_id\", \"instance_id\", and \"zone\".", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "type": { + "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Compute Engine VM instance is gce_instance.", + "type": "string" + } + }, + "id": "MonitoredResource" + }, + "ListMetricDescriptorsResponse": { + "description": "The ListMetricDescriptors response.", + "type": "object", "properties": { "nextPageToken": { "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.", "type": "string" }, - "group": { - "description": "The groups that match the specified filters.", - "type": "array", + "metricDescriptors": { + "description": "The metric descriptors that are available to the project and that match the value of filter, if present.", + "items": { + "$ref": "MetricDescriptor" + }, + "type": "array" + } + }, + "id": "ListMetricDescriptorsResponse" + }, + "MonitoredResourceDescriptor": { + "description": "An object that describes the schema of a MonitoredResource object using a type name and a set of labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of \"gce_instance\" and specifies the use of the labels \"instance_id\" and \"zone\" to identify particular VM instances.Different APIs can support different monitored resource types. APIs generally provide a list method that returns the monitored resource descriptors used by the API.", + "type": "object", + "properties": { + "description": { + "description": "Optional. A detailed description of the monitored resource type that might be used in documentation.", + "type": "string" + }, + "displayName": { + "description": "Optional. A concise name for the monitored resource type that might be displayed in user interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example, \"Google Cloud SQL Database\".", + "type": "string" + }, + "type": { + "description": "Required. The monitored resource type. For example, the type \"cloudsql_database\" represents databases in Google Cloud SQL. The maximum length of this value is 256 characters.", + "type": "string" + }, + "labels": { + "description": "Required. A set of labels used to describe instances of this monitored resource type. For example, an individual Google Cloud SQL database is identified by values for the labels \"database_id\" and \"zone\".", "items": { - "$ref": "Group" - } + "$ref": "LabelDescriptor" + }, + "type": "array" + }, + "name": { + "description": "Optional. The resource name of the monitored resource descriptor: \"projects/{project_id}/monitoredResourceDescriptors/{type}\" where {type} is the value of the type field in this object and {project_id} is a project ID that provides API-specific context for accessing the type. APIs that do not use project information can use the resource name format \"monitoredResourceDescriptors/{type}\".", + "type": "string" } }, - "id": "ListGroupsResponse", - "description": "The ListGroups response.", - "type": "object" + "id": "MonitoredResourceDescriptor" }, - "CreateCollectdTimeSeriesRequest": { - "description": "The CreateCollectdTimeSeries request.", + "TypedValue": { + "description": "A single strongly-typed value.", "type": "object", "properties": { - "resource": { - "$ref": "MonitoredResource", - "description": "The monitored resource associated with the time series." + "doubleValue": { + "format": "double", + "description": "A 64-bit double-precision floating-point number. Its magnitude is approximately ±10\u003csup\u003e±300\u003c/sup\u003e and it has 16 significant digits of precision.", + "type": "number" }, - "collectdPayloads": { - "description": "The collectd payloads representing the time series data. You must not include more than a single point for each time series, so no two payloads can have the same values for all of the fields plugin, plugin_instance, type, and type_instance.", - "type": "array", - "items": { - "$ref": "CollectdPayload" - } + "int64Value": { + "format": "int64", + "description": "A 64-bit integer. Its range is approximately ±9.2x10\u003csup\u003e18\u003c/sup\u003e.", + "type": "string" }, - "collectdVersion": { - "description": "The version of collectd that collected the data. Example: \"5.3.0-192.el6\".", + "distributionValue": { + "$ref": "Distribution", + "description": "A distribution value." + }, + "stringValue": { + "description": "A variable-length string value.", "type": "string" + }, + "boolValue": { + "description": "A Boolean value: true or false.", + "type": "boolean" } }, - "id": "CreateCollectdTimeSeriesRequest" + "id": "TypedValue" }, - "ListGroupMembersResponse": { - "description": "The ListGroupMembers response.", + "CollectdPayload": { + "description": "A collection of data points sent from a collectd-based plugin. See the collectd documentation for more information.", "type": "object", "properties": { - "nextPageToken": { - "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.", + "endTime": { + "format": "google-datetime", + "description": "The end time of the interval.", "type": "string" }, - "totalSize": { - "description": "The total number of elements matching this request.", - "format": "int32", - "type": "integer" + "startTime": { + "format": "google-datetime", + "description": "The start time of the interval.", + "type": "string" }, - "members": { - "description": "A set of monitored resources in the group.", - "type": "array", + "values": { + "description": "The measured values during this time interval. Each value must have a different dataSourceName.", "items": { - "$ref": "MonitoredResource" - } + "$ref": "CollectdValue" + }, + "type": "array" + }, + "typeInstance": { + "description": "The measurement type instance. Example: \"used\".", + "type": "string" + }, + "type": { + "description": "The measurement type. Example: \"memory\".", + "type": "string" + }, + "metadata": { + "additionalProperties": { + "$ref": "TypedValue" + }, + "description": "The measurement metadata. Example: \"process_id\" -\u003e 12345", + "type": "object" + }, + "plugin": { + "description": "The name of the plugin. Example: \"disk\".", + "type": "string" + }, + "pluginInstance": { + "description": "The instance name of the plugin Example: \"hdcl\".", + "type": "string" } }, - "id": "ListGroupMembersResponse" - }, - "ListMonitoredResourceDescriptorsResponse": { - "properties": { - "nextPageToken": { - "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.", - "type": "string" + "id": "CollectdPayload" + } + }, + "protocol": "rest", + "icons": { + "x16": "http://www.google.com/images/icons/product/search-16.gif", + "x32": "http://www.google.com/images/icons/product/search-32.gif" + }, + "canonicalName": "Monitoring", + "auth": { + "oauth2": { + "scopes": { + "https://www.googleapis.com/auth/monitoring": { + "description": "View and write monitoring data for all of your Google and third-party Cloud and API projects" }, - "resourceDescriptors": { - "description": "The monitored resource descriptors that are available to this project and that match filter, if present.", - "type": "array", - "items": { - "$ref": "MonitoredResourceDescriptor" + "https://www.googleapis.com/auth/monitoring.write": { + "description": "Publish metric data to your Google Cloud projects" + }, + "https://www.googleapis.com/auth/monitoring.read": { + "description": "View monitoring data for all of your Google Cloud and third-party projects" + }, + "https://www.googleapis.com/auth/cloud-platform": { + "description": "View and manage your data across Google Cloud Platform services" + } + } + } + }, + "rootUrl": "https://monitoring.googleapis.com/", + "ownerDomain": "google.com", + "name": "monitoring", + "batchPath": "batch", + "fullyEncodeReservedExpansion": true, + "title": "Stackdriver Monitoring API", + "ownerName": "Google", + "resources": { + "projects": { + "resources": { + "timeSeries": { + "methods": { + "list": { + "httpMethod": "GET", + "parameterOrder": [ + "name" + ], + "response": { + "$ref": "ListTimeSeriesResponse" + }, + "parameters": { + "interval.endTime": { + "format": "google-datetime", + "description": "Required. The end of the time interval.", + "type": "string", + "location": "query" + }, + "aggregation.alignmentPeriod": { + "format": "google-duration", + "description": "The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.", + "type": "string", + "location": "query" + }, + "pageSize": { + "format": "int32", + "description": "A positive number that is the maximum number of results to return. When view field sets to FULL, it limits the number of Points server will return; if view field is HEADERS, it limits the number of TimeSeries server will return.", + "type": "integer", + "location": "query" + }, + "orderBy": { + "description": "Specifies the order in which the points of the time series should be returned. By default, results are not ordered. Currently, this field must be left blank.", + "type": "string", + "location": "query" + }, + "aggregation.crossSeriesReducer": { + "description": "The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.", + "type": "string", + "location": "query", + "enum": [ + "REDUCE_NONE", + "REDUCE_MEAN", + "REDUCE_MIN", + "REDUCE_MAX", + "REDUCE_SUM", + "REDUCE_STDDEV", + "REDUCE_COUNT", + "REDUCE_COUNT_TRUE", + "REDUCE_FRACTION_TRUE", + "REDUCE_PERCENTILE_99", + "REDUCE_PERCENTILE_95", + "REDUCE_PERCENTILE_50", + "REDUCE_PERCENTILE_05" + ] + }, + "filter": { + "description": "A monitoring filter that specifies which time series should be returned. The filter must specify a single metric type, and can additionally specify metric labels and other information. For example:\nmetric.type = \"compute.googleapis.com/instance/cpu/usage_time\" AND\n metric.label.instance_name = \"my-instance-name\"\n", + "type": "string", + "location": "query" + }, + "pageToken": { + "location": "query", + "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", + "type": "string" + }, + "aggregation.perSeriesAligner": { + "location": "query", + "enum": [ + "ALIGN_NONE", + "ALIGN_DELTA", + "ALIGN_RATE", + "ALIGN_INTERPOLATE", + "ALIGN_NEXT_OLDER", + "ALIGN_MIN", + "ALIGN_MAX", + "ALIGN_MEAN", + "ALIGN_COUNT", + "ALIGN_SUM", + "ALIGN_STDDEV", + "ALIGN_COUNT_TRUE", + "ALIGN_FRACTION_TRUE", + "ALIGN_PERCENTILE_99", + "ALIGN_PERCENTILE_95", + "ALIGN_PERCENTILE_50", + "ALIGN_PERCENTILE_05" + ], + "description": "The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.", + "type": "string" + }, + "interval.startTime": { + "format": "google-datetime", + "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.", + "type": "string", + "location": "query" + }, + "view": { + "description": "Specifies which information is returned about the time series.", + "type": "string", + "location": "query", + "enum": [ + "FULL", + "HEADERS" + ] + }, + "name": { + "location": "path", + "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+$" + }, + "aggregation.groupByFields": { + "description": "The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.", + "type": "string", + "repeated": true, + "location": "query" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.read" + ], + "flatPath": "v3/projects/{projectsId}/timeSeries", + "path": "v3/{+name}/timeSeries", + "id": "monitoring.projects.timeSeries.list", + "description": "Lists time series that match a filter. This method does not require a Stackdriver account." + }, + "create": { + "response": { + "$ref": "Empty" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "POST", + "parameters": { + "name": { + "location": "path", + "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+$" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.write" + ], + "flatPath": "v3/projects/{projectsId}/timeSeries", + "id": "monitoring.projects.timeSeries.create", + "path": "v3/{+name}/timeSeries", + "description": "Creates or adds data to one or more time series. The response is empty if all time series in the request were written. If any time series could not be written, a corresponding failure message is included in the error response.", + "request": { + "$ref": "CreateTimeSeriesRequest" + } + } } - } - }, - "id": "ListMonitoredResourceDescriptorsResponse", - "description": "The ListMonitoredResourceDescriptors response.", - "type": "object" - }, - "TimeSeries": { - "properties": { - "metricKind": { - "enumDescriptions": [ - "Do not use this default value.", - "An instantaneous measurement of a value.", - "The change in a value during a time interval.", - "A value accumulated over a time interval. Cumulative measurements in a time series should have the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points." - ], - "enum": [ - "METRIC_KIND_UNSPECIFIED", - "GAUGE", - "DELTA", - "CUMULATIVE" - ], - "description": "The metric kind of the time series. When listing time series, this metric kind might be different from the metric kind of the associated metric if this time series is an alignment or reduction of other time series.When creating a time series, this field is optional. If present, it must be the same as the metric kind of the associated metric. If the associated metric's descriptor must be auto-created, then this field specifies the metric kind of the new descriptor and must be either GAUGE (the default) or CUMULATIVE.", - "type": "string" - }, - "metric": { - "$ref": "Metric", - "description": "The associated metric. A fully-specified metric used to identify the time series." }, - "points": { - "description": "The data points of this time series. When listing time series, the order of the points is specified by the list method.When creating a time series, this field must contain exactly one point and the point's type must be the same as the value type of the associated metric. If the associated metric's descriptor must be auto-created, then the value type of the descriptor is determined by the point's type, which must be BOOL, INT64, DOUBLE, or DISTRIBUTION.", - "type": "array", - "items": { - "$ref": "Point" + "metricDescriptors": { + "methods": { + "get": { + "description": "Gets a single metric descriptor. This method does not require a Stackdriver account.", + "response": { + "$ref": "MetricDescriptor" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "GET", + "parameters": { + "name": { + "description": "The metric descriptor on which to execute the request. The format is \"projects/{project_id_or_number}/metricDescriptors/{metric_id}\". An example value of {metric_id} is \"compute.googleapis.com/instance/disk/read_bytes_count\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/metricDescriptors/.+$", + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.read", + "https://www.googleapis.com/auth/monitoring.write" + ], + "flatPath": "v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}", + "id": "monitoring.projects.metricDescriptors.get", + "path": "v3/{+name}" + }, + "list": { + "description": "Lists metric descriptors that match a filter. This method does not require a Stackdriver account.", + "response": { + "$ref": "ListMetricDescriptorsResponse" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.read", + "https://www.googleapis.com/auth/monitoring.write" + ], + "parameters": { + "pageSize": { + "location": "query", + "format": "int32", + "description": "A positive number that is the maximum number of results to return.", + "type": "integer" + }, + "filter": { + "location": "query", + "description": "If this field is empty, all custom and system-defined metric descriptors are returned. Otherwise, the filter specifies which metric descriptors are to be returned. For example, the following filter matches all custom metrics:\nmetric.type = starts_with(\"custom.googleapis.com/\")\n", + "type": "string" + }, + "pageToken": { + "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", + "type": "string", + "location": "query" + }, + "name": { + "location": "path", + "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+$" + } + }, + "flatPath": "v3/projects/{projectsId}/metricDescriptors", + "id": "monitoring.projects.metricDescriptors.list", + "path": "v3/{+name}/metricDescriptors" + }, + "create": { + "description": "Creates a new metric descriptor. User-created metric descriptors define custom metrics.", + "request": { + "$ref": "MetricDescriptor" + }, + "response": { + "$ref": "MetricDescriptor" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "POST", + "parameters": { + "name": { + "location": "path", + "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+$" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.write" + ], + "flatPath": "v3/projects/{projectsId}/metricDescriptors", + "id": "monitoring.projects.metricDescriptors.create", + "path": "v3/{+name}/metricDescriptors" + }, + "delete": { + "description": "Deletes a metric descriptor. Only user-created custom metrics can be deleted.", + "response": { + "$ref": "Empty" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "DELETE", + "parameters": { + "name": { + "description": "The metric descriptor on which to execute the request. The format is \"projects/{project_id_or_number}/metricDescriptors/{metric_id}\". An example of {metric_id} is: \"custom.googleapis.com/my_test_metric\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/metricDescriptors/.+$", + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring" + ], + "flatPath": "v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}", + "id": "monitoring.projects.metricDescriptors.delete", + "path": "v3/{+name}" + } } }, - "valueType": { - "enum": [ - "VALUE_TYPE_UNSPECIFIED", - "BOOL", - "INT64", - "DOUBLE", - "STRING", - "DISTRIBUTION", - "MONEY" - ], - "description": "The value type of the time series. When listing time series, this value type might be different from the value type of the associated metric if this time series is an alignment or reduction of other time series.When creating a time series, this field is optional. If present, it must be the same as the type of the data in the points field.", - "type": "string", - "enumDescriptions": [ - "Do not use this default value.", - "The value is a boolean. This value type can be used only if the metric kind is GAUGE.", - "The value is a signed 64-bit integer.", - "The value is a double precision floating point number.", - "The value is a text string. This value type can be used only if the metric kind is GAUGE.", - "The value is a Distribution.", - "The value is money." - ] - }, - "resource": { - "description": "The associated monitored resource. Custom metrics can use only certain monitored resource types in their time series data.", - "$ref": "MonitoredResource" - } - }, - "id": "TimeSeries", - "description": "A collection of data points that describes the time-varying values of a metric. A time series is identified by a combination of a fully-specified monitored resource and a fully-specified metric. This type is used for both listing and creating time series.", - "type": "object" - }, - "CreateTimeSeriesRequest": { - "description": "The CreateTimeSeries request.", - "type": "object", - "properties": { - "timeSeries": { - "description": "The new data to be added to a list of time series. Adds at most one data point to each of several time series. The new data point must be more recent than any other point in its time series. Each TimeSeries value must fully specify a unique time series by supplying all label values for the metric and the monitored resource.", - "type": "array", - "items": { - "$ref": "TimeSeries" + "monitoredResourceDescriptors": { + "methods": { + "get": { + "response": { + "$ref": "MonitoredResourceDescriptor" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.read", + "https://www.googleapis.com/auth/monitoring.write" + ], + "parameters": { + "name": { + "location": "path", + "description": "The monitored resource descriptor to get. The format is \"projects/{project_id_or_number}/monitoredResourceDescriptors/{resource_type}\". The {resource_type} is a predefined type, such as cloudsql_database.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/monitoredResourceDescriptors/[^/]+$" + } + }, + "flatPath": "v3/projects/{projectsId}/monitoredResourceDescriptors/{monitoredResourceDescriptorsId}", + "id": "monitoring.projects.monitoredResourceDescriptors.get", + "path": "v3/{+name}", + "description": "Gets a single monitored resource descriptor. This method does not require a Stackdriver account." + }, + "list": { + "description": "Lists monitored resource descriptors that match a filter. This method does not require a Stackdriver account.", + "httpMethod": "GET", + "parameterOrder": [ + "name" + ], + "response": { + "$ref": "ListMonitoredResourceDescriptorsResponse" + }, + "parameters": { + "pageSize": { + "format": "int32", + "description": "A positive number that is the maximum number of results to return.", + "type": "integer", + "location": "query" + }, + "filter": { + "location": "query", + "description": "An optional filter describing the descriptors to be returned. The filter can reference the descriptor's type and labels. For example, the following filter returns only Google Compute Engine descriptors that have an id label:\nresource.type = starts_with(\"gce_\") AND resource.label:id\n", + "type": "string" + }, + "pageToken": { + "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", + "type": "string", + "location": "query" + }, + "name": { + "location": "path", + "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+$" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.read", + "https://www.googleapis.com/auth/monitoring.write" + ], + "flatPath": "v3/projects/{projectsId}/monitoredResourceDescriptors", + "path": "v3/{+name}/monitoredResourceDescriptors", + "id": "monitoring.projects.monitoredResourceDescriptors.list" + } } - } - }, - "id": "CreateTimeSeriesRequest" - }, - "Distribution": { - "description": "Distribution contains summary statistics for a population of values. It optionally contains a histogram representing the distribution of those values across a set of buckets.The summary statistics are the count, mean, sum of the squared deviation from the mean, the minimum, and the maximum of the set of population of values. The histogram is based on a sequence of buckets and gives a count of values that fall into each bucket. The boundaries of the buckets are given either explicitly or by formulas for buckets of fixed or exponentially increasing widths.Although it is not forbidden, it is generally a bad idea to include non-finite values (infinities or NaNs) in the population of values, as this will render the mean and sum_of_squared_deviation fields meaningless.", - "type": "object", - "properties": { - "range": { - "description": "If specified, contains the range of the population values. The field must not be present if the count is zero. This field is presently ignored by the Stackdriver Monitoring API v3.", - "$ref": "Range" - }, - "count": { - "description": "The number of values in the population. Must be non-negative. This value must equal the sum of the values in bucket_counts if a histogram is provided.", - "format": "int64", - "type": "string" - }, - "mean": { - "description": "The arithmetic mean of the values in the population. If count is zero then this field must be zero.", - "format": "double", - "type": "number" }, - "bucketCounts": { - "description": "Required in the Stackdriver Monitoring API v3. The values for each bucket specified in bucket_options. The sum of the values in bucketCounts must equal the value in the count field of the Distribution object. The order of the bucket counts follows the numbering schemes described for the three bucket types. The underflow bucket has number 0; the finite buckets, if any, have numbers 1 through N-2; and the overflow bucket has number N-1. The size of bucket_counts must not be greater than N. If the size is less than N, then the remaining buckets are assigned values of zero.", - "type": "array", - "items": { - "format": "int64", - "type": "string" + "groups": { + "methods": { + "get": { + "description": "Gets a single group.", + "response": { + "$ref": "Group" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "GET", + "parameters": { + "name": { + "description": "The group to retrieve. The format is \"projects/{project_id_or_number}/groups/{group_id}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/groups/[^/]+$", + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.read" + ], + "flatPath": "v3/projects/{projectsId}/groups/{groupsId}", + "id": "monitoring.projects.groups.get", + "path": "v3/{+name}" + }, + "list": { + "response": { + "$ref": "ListGroupsResponse" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.read" + ], + "parameters": { + "pageSize": { + "format": "int32", + "description": "A positive number that is the maximum number of results to return.", + "type": "integer", + "location": "query" + }, + "ancestorsOfGroup": { + "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns groups that are ancestors of the specified group. The groups are returned in order, starting with the immediate parent and ending with the most distant ancestor. If the specified group has no immediate parent, the results are empty.", + "type": "string", + "location": "query" + }, + "name": { + "description": "The project whose groups are to be listed. The format is \"projects/{project_id_or_number}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+$", + "location": "path" + }, + "childrenOfGroup": { + "location": "query", + "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns groups whose parentName field contains the group name. If no groups have this parent, the results are empty.", + "type": "string" + }, + "descendantsOfGroup": { + "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns the descendants of the specified group. This is a superset of the results returned by the childrenOfGroup filter, and includes children-of-children, and so forth.", + "type": "string", + "location": "query" + }, + "pageToken": { + "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", + "type": "string", + "location": "query" + } + }, + "flatPath": "v3/projects/{projectsId}/groups", + "id": "monitoring.projects.groups.list", + "path": "v3/{+name}/groups", + "description": "Lists the existing groups." + }, + "update": { + "flatPath": "v3/projects/{projectsId}/groups/{groupsId}", + "path": "v3/{+name}", + "id": "monitoring.projects.groups.update", + "request": { + "$ref": "Group" + }, + "description": "Updates an existing group. You can change any group attributes except name.", + "httpMethod": "PUT", + "parameterOrder": [ + "name" + ], + "response": { + "$ref": "Group" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring" + ], + "parameters": { + "validateOnly": { + "location": "query", + "description": "If true, validate this request but do not update the existing group.", + "type": "boolean" + }, + "name": { + "location": "path", + "description": "Output only. The name of this group. The format is \"projects/{project_id_or_number}/groups/{group_id}\". When creating a group, this field is ignored and a new name is created consisting of the project specified in the call to CreateGroup and a unique {group_id} that is generated automatically.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/groups/[^/]+$" + } + } + }, + "create": { + "request": { + "$ref": "Group" + }, + "description": "Creates a new group.", + "response": { + "$ref": "Group" + }, + "parameterOrder": [ + "name" + ], + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring" + ], + "parameters": { + "validateOnly": { + "description": "If true, validate this request but do not create the group.", + "type": "boolean", + "location": "query" + }, + "name": { + "location": "path", + "description": "The project in which to create the group. The format is \"projects/{project_id_or_number}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+$" + } + }, + "flatPath": "v3/projects/{projectsId}/groups", + "id": "monitoring.projects.groups.create", + "path": "v3/{+name}/groups" + }, + "delete": { + "description": "Deletes an existing group.", + "httpMethod": "DELETE", + "parameterOrder": [ + "name" + ], + "response": { + "$ref": "Empty" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring" + ], + "parameters": { + "name": { + "description": "The group to delete. The format is \"projects/{project_id_or_number}/groups/{group_id}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/groups/[^/]+$", + "location": "path" + } + }, + "flatPath": "v3/projects/{projectsId}/groups/{groupsId}", + "path": "v3/{+name}", + "id": "monitoring.projects.groups.delete" + } + }, + "resources": { + "members": { + "methods": { + "list": { + "flatPath": "v3/projects/{projectsId}/groups/{groupsId}/members", + "path": "v3/{+name}/members", + "id": "monitoring.projects.groups.members.list", + "description": "Lists the monitored resources that are members of a group.", + "httpMethod": "GET", + "response": { + "$ref": "ListGroupMembersResponse" + }, + "parameterOrder": [ + "name" + ], + "parameters": { + "pageSize": { + "format": "int32", + "description": "A positive number that is the maximum number of results to return.", + "type": "integer", + "location": "query" + }, + "interval.startTime": { + "location": "query", + "format": "google-datetime", + "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.", + "type": "string" + }, + "name": { + "location": "path", + "description": "The group whose members are listed. The format is \"projects/{project_id_or_number}/groups/{group_id}\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/groups/[^/]+$" + }, + "interval.endTime": { + "location": "query", + "format": "google-datetime", + "description": "Required. The end of the time interval.", + "type": "string" + }, + "filter": { + "location": "query", + "description": "An optional list filter describing the members to be returned. The filter may reference the type, labels, and metadata of monitored resources that comprise the group. For example, to return only resources representing Compute Engine VM instances, use this filter:\nresource.type = \"gce_instance\"\n", + "type": "string" + }, + "pageToken": { + "location": "query", + "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.", + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.read" + ] + } + } + } } }, - "bucketOptions": { - "$ref": "BucketOptions", - "description": "Required in the Stackdriver Monitoring API v3. Defines the histogram bucket boundaries." - }, - "sumOfSquaredDeviation": { - "description": "The sum of squared deviations from the mean of the values in the population. For values x_i this is:\nSum[i=1..n]((x_i - mean)^2)\nKnuth, \"The Art of Computer Programming\", Vol. 2, page 323, 3rd edition describes Welford's method for accumulating this sum in one pass.If count is zero then this field must be zero.", - "format": "double", - "type": "number" - } - }, - "id": "Distribution" - }, - "MonitoredResource": { - "properties": { - "labels": { - "additionalProperties": { - "type": "string" - }, - "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Compute Engine VM instances use the labels \"project_id\", \"instance_id\", and \"zone\".", - "type": "object" - }, - "type": { - "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Compute Engine VM instance is gce_instance.", - "type": "string" - } - }, - "id": "MonitoredResource", - "description": "An object representing a resource that can be used for monitoring, logging, billing, or other purposes. Examples include virtual machine instances, databases, and storage devices such as disks. The type field identifies a MonitoredResourceDescriptor object that describes the resource's schema. Information in the labels field identifies the actual resource and its attributes according to the schema. For example, a particular Compute Engine VM instance could be represented by the following object, because the MonitoredResourceDescriptor for \"gce_instance\" has labels \"instance_id\" and \"zone\":\n{ \"type\": \"gce_instance\",\n \"labels\": { \"instance_id\": \"12345678901234\",\n \"zone\": \"us-central1-a\" }}\n", - "type": "object" - }, - "ListMetricDescriptorsResponse": { - "description": "The ListMetricDescriptors response.", - "type": "object", - "properties": { - "metricDescriptors": { - "description": "The metric descriptors that are available to the project and that match the value of filter, if present.", - "type": "array", - "items": { - "$ref": "MetricDescriptor" + "collectdTimeSeries": { + "methods": { + "create": { + "flatPath": "v3/projects/{projectsId}/collectdTimeSeries", + "path": "v3/{+name}/collectdTimeSeries", + "id": "monitoring.projects.collectdTimeSeries.create", + "description": "Stackdriver Monitoring Agent only: Creates a new time series.\u003caside class=\"caution\"\u003eThis method is only for use by the Stackdriver Monitoring Agent. Use projects.timeSeries.create instead.\u003c/aside\u003e", + "request": { + "$ref": "CreateCollectdTimeSeriesRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "name" + ], + "response": { + "$ref": "Empty" + }, + "parameters": { + "name": { + "location": "path", + "description": "The project in which to create the time series. The format is \"projects/PROJECT_ID_OR_NUMBER\".", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+$" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/monitoring", + "https://www.googleapis.com/auth/monitoring.write" + ] + } } - }, - "nextPageToken": { - "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.", - "type": "string" } - }, - "id": "ListMetricDescriptorsResponse" + } + } + }, + "parameters": { + "bearer_token": { + "description": "OAuth bearer token.", + "type": "string", + "location": "query" }, - "MonitoredResourceDescriptor": { - "description": "An object that describes the schema of a MonitoredResource object using a type name and a set of labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of \"gce_instance\" and specifies the use of the labels \"instance_id\" and \"zone\" to identify particular VM instances.Different APIs can support different monitored resource types. APIs generally provide a list method that returns the monitored resource descriptors used by the API.", - "type": "object", - "properties": { - "name": { - "description": "Optional. The resource name of the monitored resource descriptor: \"projects/{project_id}/monitoredResourceDescriptors/{type}\" where {type} is the value of the type field in this object and {project_id} is a project ID that provides API-specific context for accessing the type. APIs that do not use project information can use the resource name format \"monitoredResourceDescriptors/{type}\".", - "type": "string" - }, - "displayName": { - "description": "Optional. A concise name for the monitored resource type that might be displayed in user interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example, \"Google Cloud SQL Database\".", - "type": "string" - }, - "description": { - "description": "Optional. A detailed description of the monitored resource type that might be used in documentation.", - "type": "string" - }, - "type": { - "description": "Required. The monitored resource type. For example, the type \"cloudsql_database\" represents databases in Google Cloud SQL. The maximum length of this value is 256 characters.", - "type": "string" - }, - "labels": { - "description": "Required. A set of labels used to describe instances of this monitored resource type. For example, an individual Google Cloud SQL database is identified by values for the labels \"database_id\" and \"zone\".", - "type": "array", - "items": { - "$ref": "LabelDescriptor" - } - } - }, - "id": "MonitoredResourceDescriptor" + "oauth_token": { + "description": "OAuth 2.0 token for the current user.", + "type": "string", + "location": "query" }, - "TypedValue": { - "properties": { - "int64Value": { - "description": "A 64-bit integer. Its range is approximately ±9.2x10\u003csup\u003e18\u003c/sup\u003e.", - "format": "int64", - "type": "string" - }, - "distributionValue": { - "description": "A distribution value.", - "$ref": "Distribution" - }, - "boolValue": { - "description": "A Boolean value: true or false.", - "type": "boolean" - }, - "stringValue": { - "description": "A variable-length string value.", - "type": "string" - }, - "doubleValue": { - "description": "A 64-bit double-precision floating-point number. Its magnitude is approximately ±10\u003csup\u003e±300\u003c/sup\u003e and it has 16 significant digits of precision.", - "format": "double", - "type": "number" - } - }, - "id": "TypedValue", - "description": "A single strongly-typed value.", - "type": "object" + "upload_protocol": { + "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", + "type": "string", + "location": "query" }, - "CollectdPayload": { - "description": "A collection of data points sent from a collectd-based plugin. See the collectd documentation for more information.", - "type": "object", - "properties": { - "plugin": { - "description": "The name of the plugin. Example: \"disk\".", - "type": "string" - }, - "pluginInstance": { - "description": "The instance name of the plugin Example: \"hdcl\".", - "type": "string" - }, - "endTime": { - "description": "The end time of the interval.", - "format": "google-datetime", - "type": "string" - }, - "startTime": { - "description": "The start time of the interval.", - "format": "google-datetime", - "type": "string" - }, - "values": { - "description": "The measured values during this time interval. Each value must have a different dataSourceName.", - "type": "array", - "items": { - "$ref": "CollectdValue" - } - }, - "typeInstance": { - "description": "The measurement type instance. Example: \"used\".", - "type": "string" - }, - "type": { - "description": "The measurement type. Example: \"memory\".", - "type": "string" - }, - "metadata": { - "additionalProperties": { - "$ref": "TypedValue" - }, - "description": "The measurement metadata. Example: \"process_id\" -\u003e 12345", - "type": "object" - } - }, - "id": "CollectdPayload" + "prettyPrint": { + "location": "query", + "description": "Returns response with indentations and line breaks.", + "default": "true", + "type": "boolean" }, - "Linear": { - "description": "Specifies a linear sequence of buckets that all have the same width (except overflow and underflow). Each bucket represents a constant absolute uncertainty on the specific value in the bucket.There are num_finite_buckets + 2 (= N) buckets. Bucket i has the following boundaries:Upper bound (0 \u003c= i \u003c N-1): offset + (width * i). Lower bound (1 \u003c= i \u003c N): offset + (width * (i - 1)).", - "type": "object", - "properties": { - "width": { - "description": "Must be greater than 0.", - "format": "double", - "type": "number" - }, - "offset": { - "description": "Lower bound of the first bucket.", - "format": "double", - "type": "number" - }, - "numFiniteBuckets": { - "description": "Must be greater than 0.", - "format": "int32", - "type": "integer" - } - }, - "id": "Linear" + "uploadType": { + "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").", + "type": "string", + "location": "query" }, - "Option": { - "properties": { - "name": { - "description": "The option's name. For protobuf built-in options (options defined in descriptor.proto), this is the short name. For example, \"map_entry\". For custom options, it should be the fully-qualified name. For example, \"google.api.http\".", - "type": "string" - }, - "value": { - "additionalProperties": { - "description": "Properties of the object. Contains field @type with type URL.", - "type": "any" - }, - "description": "The option's value packed in an Any message. If the value is a primitive, the corresponding wrapper type defined in google/protobuf/wrappers.proto should be used. If the value is an enum, it should be stored as an int32 value using the google.protobuf.Int32Value type.", - "type": "object" - } - }, - "id": "Option", - "description": "A protocol buffer option, which can be attached to a message, field, enumeration, etc.", - "type": "object" + "fields": { + "description": "Selector specifying which fields to include in a partial response.", + "type": "string", + "location": "query" }, - "Empty": { - "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.", - "type": "object", - "properties": {}, - "id": "Empty" + "$.xgafv": { + "enumDescriptions": [ + "v1 error format", + "v2 error format" + ], + "location": "query", + "enum": [ + "1", + "2" + ], + "description": "V1 error format.", + "type": "string" }, - "TimeInterval": { - "description": "A time interval extending just after a start time through an end time. If the start time is the same as the end time, then the interval represents a single point in time.", - "type": "object", - "properties": { - "endTime": { - "description": "Required. The end of the time interval.", - "format": "google-datetime", - "type": "string" - }, - "startTime": { - "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.", - "format": "google-datetime", - "type": "string" - } - }, - "id": "TimeInterval" + "callback": { + "description": "JSONP", + "type": "string", + "location": "query" }, - "Explicit": { - "description": "Specifies a set of buckets with arbitrary widths.There are size(bounds) + 1 (= N) buckets. Bucket i has the following boundaries:Upper bound (0 \u003c= i \u003c N-1): boundsi Lower bound (1 \u003c= i \u003c N); boundsi - 1The bounds field must contain at least one element. If bounds has only one element, then there are no finite buckets, and that single element is the common boundary of the overflow and underflow buckets.", - "type": "object", - "properties": { - "bounds": { - "description": "The values must be monotonically increasing.", - "type": "array", - "items": { - "format": "double", - "type": "number" - } - } - }, - "id": "Explicit" + "alt": { + "type": "string", + "enumDescriptions": [ + "Responses with Content-Type of application/json", + "Media download with context-dependent Content-Type", + "Responses with Content-Type of application/x-protobuf" + ], + "location": "query", + "description": "Data format for response.", + "default": "json", + "enum": [ + "json", + "media", + "proto" + ] }, - "Exponential": { - "properties": { - "growthFactor": { - "description": "Must be greater than 1.", - "format": "double", - "type": "number" - }, - "scale": { - "description": "Must be greater than 0.", - "format": "double", - "type": "number" - }, - "numFiniteBuckets": { - "description": "Must be greater than 0.", - "format": "int32", - "type": "integer" - } - }, - "id": "Exponential", - "description": "Specifies an exponential sequence of buckets that have a width that is proportional to the value of the lower bound. Each bucket represents a constant relative uncertainty on a specific value in the bucket.There are num_finite_buckets + 2 (= N) buckets. Bucket i has the following boundaries:Upper bound (0 \u003c= i \u003c N-1): scale * (growth_factor ^ i). Lower bound (1 \u003c= i \u003c N): scale * (growth_factor ^ (i - 1)).", - "type": "object" + "access_token": { + "description": "OAuth access token.", + "type": "string", + "location": "query" }, - "Point": { - "properties": { - "value": { - "$ref": "TypedValue", - "description": "The value of the data point." - }, - "interval": { - "description": "The time interval to which the data point applies. For GAUGE metrics, only the end time of the interval is used. For DELTA metrics, the start and end time should specify a non-zero interval, with subsequent points specifying contiguous and non-overlapping intervals. For CUMULATIVE metrics, the start and end time should specify a non-zero interval, with subsequent points specifying the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points.", - "$ref": "TimeInterval" - } - }, - "id": "Point", - "description": "A single data point in a time series.", - "type": "object" + "key": { + "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", + "type": "string", + "location": "query" }, - "Field": { - "properties": { - "jsonName": { - "description": "The field JSON name.", - "type": "string" - }, - "kind": { - "enum": [ - "TYPE_UNKNOWN", - "TYPE_DOUBLE", - "TYPE_FLOAT", - "TYPE_INT64", - "TYPE_UINT64", - "TYPE_INT32", - "TYPE_FIXED64", - "TYPE_FIXED32", - "TYPE_BOOL", - "TYPE_STRING", - "TYPE_GROUP", - "TYPE_MESSAGE", - "TYPE_BYTES", - "TYPE_UINT32", - "TYPE_ENUM", - "TYPE_SFIXED32", - "TYPE_SFIXED64", - "TYPE_SINT32", - "TYPE_SINT64" - ], - "description": "The field type.", - "type": "string", - "enumDescriptions": [ - "Field type unknown.", - "Field type double.", - "Field type float.", - "Field type int64.", - "Field type uint64.", - "Field type int32.", - "Field type fixed64.", - "Field type fixed32.", - "Field type bool.", - "Field type string.", - "Field type group. Proto2 syntax only, and deprecated.", - "Field type message.", - "Field type bytes.", - "Field type uint32.", - "Field type enum.", - "Field type sfixed32.", - "Field type sfixed64.", - "Field type sint32.", - "Field type sint64." - ] - }, - "options": { - "description": "The protocol buffer options.", - "type": "array", - "items": { - "$ref": "Option" - } - }, - "oneofIndex": { - "description": "The index of the field type in Type.oneofs, for message or enumeration types. The first type has index 1; zero means the type is not in the list.", - "format": "int32", - "type": "integer" - }, - "cardinality": { - "enumDescriptions": [ - "For fields with unknown cardinality.", - "For optional fields.", - "For required fields. Proto2 syntax only.", - "For repeated fields." - ], - "enum": [ - "CARDINALITY_UNKNOWN", - "CARDINALITY_OPTIONAL", - "CARDINALITY_REQUIRED", - "CARDINALITY_REPEATED" - ], - "description": "The field cardinality.", - "type": "string" - }, - "packed": { - "description": "Whether to use alternative packed wire representation.", - "type": "boolean" - }, - "defaultValue": { - "description": "The string value of the default value of this field. Proto2 syntax only.", - "type": "string" - }, - "name": { - "description": "The field name.", - "type": "string" - }, - "typeUrl": { - "description": "The field type URL, without the scheme, for message or enumeration types. Example: \"type.googleapis.com/google.protobuf.Timestamp\".", - "type": "string" - }, - "number": { - "description": "The field number.", - "format": "int32", - "type": "integer" - } - }, - "id": "Field", - "description": "A single field of a message type.", - "type": "object" + "quotaUser": { + "location": "query", + "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", + "type": "string" }, - "Metric": { - "description": "A specific metric, identified by specifying values for all of the labels of a MetricDescriptor.", - "type": "object", - "properties": { - "type": { - "description": "An existing metric type, see google.api.MetricDescriptor. For example, custom.googleapis.com/invoice/paid/amount.", - "type": "string" - }, - "labels": { - "additionalProperties": { - "type": "string" - }, - "description": "The set of label values that uniquely identify this metric. All labels listed in the MetricDescriptor must be assigned values.", - "type": "object" - } - }, - "id": "Metric" - } - }, - "icons": { - "x16": "http://www.google.com/images/icons/product/search-16.gif", - "x32": "http://www.google.com/images/icons/product/search-32.gif" - }, - "protocol": "rest", - "canonicalName": "Monitoring", - "auth": { - "oauth2": { - "scopes": { - "https://www.googleapis.com/auth/monitoring": { - "description": "View and write monitoring data for all of your Google and third-party Cloud and API projects" - }, - "https://www.googleapis.com/auth/monitoring.write": { - "description": "Publish metric data to your Google Cloud projects" - }, - "https://www.googleapis.com/auth/cloud-platform": { - "description": "View and manage your data across Google Cloud Platform services" - }, - "https://www.googleapis.com/auth/monitoring.read": { - "description": "View monitoring data for all of your Google Cloud and third-party projects" - } - } + "pp": { + "location": "query", + "description": "Pretty-print response.", + "default": "true", + "type": "boolean" } }, - "rootUrl": "https://monitoring.googleapis.com/", - "ownerDomain": "google.com", - "name": "monitoring", - "batchPath": "batch", - "title": "Stackdriver Monitoring API", - "ownerName": "Google" + "version": "v3" } diff --git a/vendor/google.golang.org/api/monitoring/v3/monitoring-gen.go b/vendor/google.golang.org/api/monitoring/v3/monitoring-gen.go index e24cfb5bfa7af..6383333b8a913 100644 --- a/vendor/google.golang.org/api/monitoring/v3/monitoring-gen.go +++ b/vendor/google.golang.org/api/monitoring/v3/monitoring-gen.go @@ -4166,103 +4166,6 @@ func (c *ProjectsTimeSeriesListCall) PageToken(pageToken string) *ProjectsTimeSe return c } -// SecondaryAggregationAlignmentPeriod sets the optional parameter -// "secondaryAggregation.alignmentPeriod": The alignment period for -// per-time series alignment. If present, alignmentPeriod must be at -// least 60 seconds. After per-time series alignment, each time series -// will contain data points only on the period boundaries. If -// perSeriesAligner is not specified or equals ALIGN_NONE, then this -// field is ignored. If perSeriesAligner is specified and does not equal -// ALIGN_NONE, then this field must be defined; otherwise an error is -// returned. -func (c *ProjectsTimeSeriesListCall) SecondaryAggregationAlignmentPeriod(secondaryAggregationAlignmentPeriod string) *ProjectsTimeSeriesListCall { - c.urlParams_.Set("secondaryAggregation.alignmentPeriod", secondaryAggregationAlignmentPeriod) - return c -} - -// SecondaryAggregationCrossSeriesReducer sets the optional parameter -// "secondaryAggregation.crossSeriesReducer": The approach to be used to -// combine time series. Not all reducer functions may be applied to all -// time series, depending on the metric type and the value type of the -// original time series. Reduction may change the metric type of value -// type of the time series.Time series data must be aligned in order to -// perform cross-time series reduction. If crossSeriesReducer is -// specified, then perSeriesAligner must be specified and not equal -// ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error -// is returned. -// -// Possible values: -// "REDUCE_NONE" -// "REDUCE_MEAN" -// "REDUCE_MIN" -// "REDUCE_MAX" -// "REDUCE_SUM" -// "REDUCE_STDDEV" -// "REDUCE_COUNT" -// "REDUCE_COUNT_TRUE" -// "REDUCE_FRACTION_TRUE" -// "REDUCE_PERCENTILE_99" -// "REDUCE_PERCENTILE_95" -// "REDUCE_PERCENTILE_50" -// "REDUCE_PERCENTILE_05" -func (c *ProjectsTimeSeriesListCall) SecondaryAggregationCrossSeriesReducer(secondaryAggregationCrossSeriesReducer string) *ProjectsTimeSeriesListCall { - c.urlParams_.Set("secondaryAggregation.crossSeriesReducer", secondaryAggregationCrossSeriesReducer) - return c -} - -// SecondaryAggregationGroupByFields sets the optional parameter -// "secondaryAggregation.groupByFields": The set of fields to preserve -// when crossSeriesReducer is specified. The groupByFields determine how -// the time series are partitioned into subsets prior to applying the -// aggregation function. Each subset contains time series that have the -// same value for each of the grouping fields. Each individual time -// series is a member of exactly one subset. The crossSeriesReducer is -// applied to each subset of time series. It is not possible to reduce -// across different resource types, so this field implicitly contains -// resource.type. Fields not specified in groupByFields are aggregated -// away. If groupByFields is not specified and all the time series have -// the same resource type, then the time series are aggregated into a -// single output time series. If crossSeriesReducer is not defined, this -// field is ignored. -func (c *ProjectsTimeSeriesListCall) SecondaryAggregationGroupByFields(secondaryAggregationGroupByFields ...string) *ProjectsTimeSeriesListCall { - c.urlParams_.SetMulti("secondaryAggregation.groupByFields", append([]string{}, secondaryAggregationGroupByFields...)) - return c -} - -// SecondaryAggregationPerSeriesAligner sets the optional parameter -// "secondaryAggregation.perSeriesAligner": The approach to be used to -// align individual time series. Not all alignment functions may be -// applied to all time series, depending on the metric type and value -// type of the original time series. Alignment may change the metric -// type or the value type of the time series.Time series data must be -// aligned in order to perform cross-time series reduction. If -// crossSeriesReducer is specified, then perSeriesAligner must be -// specified and not equal ALIGN_NONE and alignmentPeriod must be -// specified; otherwise, an error is returned. -// -// Possible values: -// "ALIGN_NONE" -// "ALIGN_DELTA" -// "ALIGN_RATE" -// "ALIGN_INTERPOLATE" -// "ALIGN_NEXT_OLDER" -// "ALIGN_MIN" -// "ALIGN_MAX" -// "ALIGN_MEAN" -// "ALIGN_COUNT" -// "ALIGN_SUM" -// "ALIGN_STDDEV" -// "ALIGN_COUNT_TRUE" -// "ALIGN_FRACTION_TRUE" -// "ALIGN_PERCENTILE_99" -// "ALIGN_PERCENTILE_95" -// "ALIGN_PERCENTILE_50" -// "ALIGN_PERCENTILE_05" -func (c *ProjectsTimeSeriesListCall) SecondaryAggregationPerSeriesAligner(secondaryAggregationPerSeriesAligner string) *ProjectsTimeSeriesListCall { - c.urlParams_.Set("secondaryAggregation.perSeriesAligner", secondaryAggregationPerSeriesAligner) - return c -} - // View sets the optional parameter "view": Specifies which information // is returned about the time series. // @@ -4472,62 +4375,6 @@ func (c *ProjectsTimeSeriesListCall) Do(opts ...googleapi.CallOption) (*ListTime // "location": "query", // "type": "string" // }, - // "secondaryAggregation.alignmentPeriod": { - // "description": "The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.", - // "format": "google-duration", - // "location": "query", - // "type": "string" - // }, - // "secondaryAggregation.crossSeriesReducer": { - // "description": "The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.", - // "enum": [ - // "REDUCE_NONE", - // "REDUCE_MEAN", - // "REDUCE_MIN", - // "REDUCE_MAX", - // "REDUCE_SUM", - // "REDUCE_STDDEV", - // "REDUCE_COUNT", - // "REDUCE_COUNT_TRUE", - // "REDUCE_FRACTION_TRUE", - // "REDUCE_PERCENTILE_99", - // "REDUCE_PERCENTILE_95", - // "REDUCE_PERCENTILE_50", - // "REDUCE_PERCENTILE_05" - // ], - // "location": "query", - // "type": "string" - // }, - // "secondaryAggregation.groupByFields": { - // "description": "The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.", - // "location": "query", - // "repeated": true, - // "type": "string" - // }, - // "secondaryAggregation.perSeriesAligner": { - // "description": "The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.", - // "enum": [ - // "ALIGN_NONE", - // "ALIGN_DELTA", - // "ALIGN_RATE", - // "ALIGN_INTERPOLATE", - // "ALIGN_NEXT_OLDER", - // "ALIGN_MIN", - // "ALIGN_MAX", - // "ALIGN_MEAN", - // "ALIGN_COUNT", - // "ALIGN_SUM", - // "ALIGN_STDDEV", - // "ALIGN_COUNT_TRUE", - // "ALIGN_FRACTION_TRUE", - // "ALIGN_PERCENTILE_99", - // "ALIGN_PERCENTILE_95", - // "ALIGN_PERCENTILE_50", - // "ALIGN_PERCENTILE_05" - // ], - // "location": "query", - // "type": "string" - // }, // "view": { // "description": "Specifies which information is returned about the time series.", // "enum": [ diff --git a/vendor/google.golang.org/api/pubsub/v1/pubsub-api.json b/vendor/google.golang.org/api/pubsub/v1/pubsub-api.json index 7a0ef731bb7c2..740d94400a96e 100644 --- a/vendor/google.golang.org/api/pubsub/v1/pubsub-api.json +++ b/vendor/google.golang.org/api/pubsub/v1/pubsub-api.json @@ -1,15 +1,4 @@ { - "kind": "discovery#restDescription", - "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n", - "servicePath": "", - "rootUrl": "https://pubsub.googleapis.com/", - "basePath": "", - "ownerDomain": "google.com", - "name": "pubsub", - "batchPath": "batch", - "revision": "20170329", - "documentationLink": "https://cloud.google.com/pubsub/docs", - "id": "pubsub:v1", "title": "Google Cloud Pub/Sub API", "ownerName": "Google", "discoveryVersion": "v1", @@ -18,8 +7,91 @@ "resources": { "topics": { "methods": { + "create": { + "httpMethod": "PUT", + "parameterOrder": [ + "name" + ], + "response": { + "$ref": "Topic" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ], + "parameters": { + "name": { + "pattern": "^projects/[^/]+/topics/[^/]+$", + "location": "path", + "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.", + "type": "string", + "required": true + } + }, + "flatPath": "v1/projects/{projectsId}/topics/{topicsId}", + "path": "v1/{+name}", + "id": "pubsub.projects.topics.create", + "request": { + "$ref": "Topic" + }, + "description": "Creates the given topic with the given name." + }, + "setIamPolicy": { + "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.", + "request": { + "$ref": "SetIamPolicyRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "resource" + ], + "response": { + "$ref": "Policy" + }, + "parameters": { + "resource": { + "description": "REQUIRED: The resource for which the policy is being specified.\nSee the operation documentation for the appropriate value for this field.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/topics/[^/]+$", + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ], + "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:setIamPolicy", + "path": "v1/{+resource}:setIamPolicy", + "id": "pubsub.projects.topics.setIamPolicy" + }, + "getIamPolicy": { + "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:getIamPolicy", + "path": "v1/{+resource}:getIamPolicy", + "id": "pubsub.projects.topics.getIamPolicy", + "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.", + "httpMethod": "GET", + "response": { + "$ref": "Policy" + }, + "parameterOrder": [ + "resource" + ], + "parameters": { + "resource": { + "location": "path", + "description": "REQUIRED: The resource for which the policy is being requested.\nSee the operation documentation for the appropriate value for this field.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/topics/[^/]+$" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ] + }, "get": { - "description": "Gets the configuration of a topic.", "response": { "$ref": "Topic" }, @@ -33,67 +105,68 @@ ], "parameters": { "topic": { - "location": "path", - "description": "The name of the topic to get.\nFormat is `projects/{project}/topics/{topic}`.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+/topics/[^/]+$" + "required": true, + "pattern": "^projects/[^/]+/topics/[^/]+$", + "location": "path", + "description": "The name of the topic to get.\nFormat is `projects/{project}/topics/{topic}`." } }, "flatPath": "v1/projects/{projectsId}/topics/{topicsId}", + "id": "pubsub.projects.topics.get", "path": "v1/{+topic}", - "id": "pubsub.projects.topics.get" + "description": "Gets the configuration of a topic." }, "publish": { "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:publish", "path": "v1/{+topic}:publish", "id": "pubsub.projects.topics.publish", - "description": "Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic\ndoes not exist. The message payload must not be empty; it must contain\n either a non-empty data field, or at least one attribute.", "request": { "$ref": "PublishRequest" }, - "response": { - "$ref": "PublishResponse" - }, + "description": "Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic\ndoes not exist. The message payload must not be empty; it must contain\n either a non-empty data field, or at least one attribute.", + "httpMethod": "POST", "parameterOrder": [ "topic" ], - "httpMethod": "POST", + "response": { + "$ref": "PublishResponse" + }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/pubsub" ], "parameters": { "topic": { + "pattern": "^projects/[^/]+/topics/[^/]+$", + "location": "path", "description": "The messages in the request will be published on this topic.\nFormat is `projects/{project}/topics/{topic}`.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+/topics/[^/]+$", - "location": "path" + "required": true } } }, "testIamPermissions": { + "httpMethod": "POST", + "parameterOrder": [ + "resource" + ], "response": { "$ref": "TestIamPermissionsResponse" }, - "parameterOrder": [ - "resource" + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" ], - "httpMethod": "POST", "parameters": { "resource": { "location": "path", "description": "REQUIRED: The resource for which the policy detail is being requested.\nSee the operation documentation for the appropriate value for this field.", - "required": true, "type": "string", + "required": true, "pattern": "^projects/[^/]+/topics/[^/]+$" } }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ], "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:testIamPermissions", "path": "v1/{+resource}:testIamPermissions", "id": "pubsub.projects.topics.testIamPermissions", @@ -103,9 +176,6 @@ "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.\n\nNote: This operation is designed to be used for building permission-aware\nUIs and command-line tools, not for authorization checking. This operation\nmay \"fail open\" without warning." }, "delete": { - "flatPath": "v1/projects/{projectsId}/topics/{topicsId}", - "id": "pubsub.projects.topics.delete", - "path": "v1/{+topic}", "description": "Deletes the topic with the given name. Returns `NOT_FOUND` if the topic\ndoes not exist. After a topic is deleted, a new topic may be created with\nthe same name; this is an entirely new topic with none of the old\nconfiguration or subscriptions. Existing subscriptions to this topic are\nnot deleted, but their `topic` field is set to `_deleted-topic_`.", "httpMethod": "DELETE", "parameterOrder": [ @@ -120,22 +190,25 @@ ], "parameters": { "topic": { + "pattern": "^projects/[^/]+/topics/[^/]+$", "location": "path", "description": "Name of the topic to delete.\nFormat is `projects/{project}/topics/{topic}`.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+/topics/[^/]+$" + "required": true } - } + }, + "flatPath": "v1/projects/{projectsId}/topics/{topicsId}", + "path": "v1/{+topic}", + "id": "pubsub.projects.topics.delete" }, "list": { + "httpMethod": "GET", "response": { "$ref": "ListTopicsResponse" }, "parameterOrder": [ "project" ], - "httpMethod": "GET", "parameters": { "pageToken": { "description": "The value returned by the last `ListTopicsResponse`; indicates that this is\na continuation of a prior `ListTopics` call, and that the system should\nreturn the next page of data.", @@ -143,17 +216,17 @@ "location": "query" }, "pageSize": { - "description": "Maximum number of topics to return.", - "format": "int32", "type": "integer", - "location": "query" + "location": "query", + "format": "int32", + "description": "Maximum number of topics to return." }, "project": { + "pattern": "^projects/[^/]+$", "location": "path", "description": "The name of the cloud project that topics belong to.\nFormat is `projects/{project}`.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+$" + "required": true } }, "scopes": [ @@ -164,372 +237,142 @@ "path": "v1/{+project}/topics", "id": "pubsub.projects.topics.list", "description": "Lists matching topics." - }, - "setIamPolicy": { - "response": { - "$ref": "Policy" - }, - "parameterOrder": [ - "resource" - ], - "httpMethod": "POST", - "parameters": { - "resource": { - "location": "path", - "description": "REQUIRED: The resource for which the policy is being specified.\nSee the operation documentation for the appropriate value for this field.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/topics/[^/]+$" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ], - "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:setIamPolicy", - "path": "v1/{+resource}:setIamPolicy", - "id": "pubsub.projects.topics.setIamPolicy", - "request": { - "$ref": "SetIamPolicyRequest" - }, - "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy." - }, - "create": { - "flatPath": "v1/projects/{projectsId}/topics/{topicsId}", - "id": "pubsub.projects.topics.create", - "path": "v1/{+name}", - "request": { - "$ref": "Topic" - }, - "description": "Creates the given topic with the given name.", - "httpMethod": "PUT", - "parameterOrder": [ - "name" - ], - "response": { - "$ref": "Topic" - }, - "parameters": { - "name": { - "location": "path", - "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/topics/[^/]+$" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ] - }, - "getIamPolicy": { - "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:getIamPolicy", - "id": "pubsub.projects.topics.getIamPolicy", - "path": "v1/{+resource}:getIamPolicy", - "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.", - "httpMethod": "GET", - "parameterOrder": [ - "resource" - ], - "response": { - "$ref": "Policy" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ], - "parameters": { - "resource": { - "description": "REQUIRED: The resource for which the policy is being requested.\nSee the operation documentation for the appropriate value for this field.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/topics/[^/]+$", - "location": "path" - } - } } }, "resources": { "subscriptions": { "methods": { "list": { - "flatPath": "v1/projects/{projectsId}/topics/{topicsId}/subscriptions", "id": "pubsub.projects.topics.subscriptions.list", "path": "v1/{+topic}/subscriptions", "description": "Lists the name of the subscriptions for this topic.", - "httpMethod": "GET", - "parameterOrder": [ - "topic" - ], "response": { "$ref": "ListTopicSubscriptionsResponse" }, + "parameterOrder": [ + "topic" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ], "parameters": { - "pageSize": { + "pageToken": { + "type": "string", "location": "query", - "description": "Maximum number of subscription names to return.", + "description": "The value returned by the last `ListTopicSubscriptionsResponse`; indicates\nthat this is a continuation of a prior `ListTopicSubscriptions` call, and\nthat the system should return the next page of data." + }, + "pageSize": { "format": "int32", - "type": "integer" + "description": "Maximum number of subscription names to return.", + "type": "integer", + "location": "query" }, "topic": { "location": "path", "description": "The name of the topic that subscriptions are attached to.\nFormat is `projects/{project}/topics/{topic}`.", - "required": true, "type": "string", + "required": true, "pattern": "^projects/[^/]+/topics/[^/]+$" - }, - "pageToken": { - "location": "query", - "description": "The value returned by the last `ListTopicSubscriptionsResponse`; indicates\nthat this is a continuation of a prior `ListTopicSubscriptions` call, and\nthat the system should return the next page of data.", - "type": "string" } }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ] + "flatPath": "v1/projects/{projectsId}/topics/{topicsId}/subscriptions" } } } } }, - "subscriptions": { + "snapshots": { "methods": { - "list": { - "httpMethod": "GET", - "response": { - "$ref": "ListSubscriptionsResponse" - }, - "parameterOrder": [ - "project" - ], - "parameters": { - "pageToken": { - "location": "query", - "description": "The value returned by the last `ListSubscriptionsResponse`; indicates that\nthis is a continuation of a prior `ListSubscriptions` call, and that the\nsystem should return the next page of data.", - "type": "string" - }, - "pageSize": { - "location": "query", - "description": "Maximum number of subscriptions to return.", - "format": "int32", - "type": "integer" - }, - "project": { - "description": "The name of the cloud project that subscriptions belong to.\nFormat is `projects/{project}`.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+$", - "location": "path" - } - }, + "setIamPolicy": { "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/pubsub" ], - "flatPath": "v1/projects/{projectsId}/subscriptions", - "id": "pubsub.projects.subscriptions.list", - "path": "v1/{+project}/subscriptions", - "description": "Lists matching subscriptions." - }, - "setIamPolicy": { - "request": { - "$ref": "SetIamPolicyRequest" - }, - "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.", - "response": { - "$ref": "Policy" - }, - "parameterOrder": [ - "resource" - ], - "httpMethod": "POST", "parameters": { "resource": { + "location": "path", "description": "REQUIRED: The resource for which the policy is being specified.\nSee the operation documentation for the appropriate value for this field.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+/subscriptions/[^/]+$", - "location": "path" + "required": true, + "pattern": "^projects/[^/]+/snapshots/[^/]+$" } }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ], - "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy", + "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:setIamPolicy", + "id": "pubsub.projects.snapshots.setIamPolicy", "path": "v1/{+resource}:setIamPolicy", - "id": "pubsub.projects.subscriptions.setIamPolicy" - }, - "create": { + "request": { + "$ref": "SetIamPolicyRequest" + }, + "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.", "response": { - "$ref": "Subscription" + "$ref": "Policy" }, "parameterOrder": [ - "name" - ], - "httpMethod": "PUT", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" + "resource" ], - "parameters": { - "name": { - "location": "path", - "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/subscriptions/[^/]+$" - } - }, - "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}", - "path": "v1/{+name}", - "id": "pubsub.projects.subscriptions.create", - "description": "Creates a subscription to a given topic.\nIf the subscription already exists, returns `ALREADY_EXISTS`.\nIf the corresponding topic doesn't exist, returns `NOT_FOUND`.\n\nIf the name is not provided in the request, the server will assign a random\nname for this subscription on the same project as the topic, conforming\nto the\n[resource name format](https://cloud.google.com/pubsub/docs/overview#names).\nThe generated name is populated in the returned Subscription object.\nNote that for REST API requests, you must specify a name in the request.", - "request": { - "$ref": "Subscription" - } + "httpMethod": "POST" }, - "acknowledge": { - "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge", - "path": "v1/{+subscription}:acknowledge", - "id": "pubsub.projects.subscriptions.acknowledge", - "description": "Acknowledges the messages associated with the `ack_ids` in the\n`AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages\nfrom the subscription.\n\nAcknowledging a message whose ack deadline has expired may succeed,\nbut such a message may be redelivered later. Acknowledging a message more\nthan once will not result in an error.", + "testIamPermissions": { + "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:testIamPermissions", + "id": "pubsub.projects.snapshots.testIamPermissions", + "path": "v1/{+resource}:testIamPermissions", "request": { - "$ref": "AcknowledgeRequest" + "$ref": "TestIamPermissionsRequest" }, + "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.\n\nNote: This operation is designed to be used for building permission-aware\nUIs and command-line tools, not for authorization checking. This operation\nmay \"fail open\" without warning.", "response": { - "$ref": "Empty" + "$ref": "TestIamPermissionsResponse" }, "parameterOrder": [ - "subscription" + "resource" ], "httpMethod": "POST", "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/pubsub" ], - "parameters": { - "subscription": { - "description": "The subscription whose message is being acknowledged.\nFormat is `projects/{project}/subscriptions/{sub}`.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/subscriptions/[^/]+$", - "location": "path" - } - } - }, - "getIamPolicy": { - "httpMethod": "GET", - "parameterOrder": [ - "resource" - ], - "response": { - "$ref": "Policy" - }, "parameters": { "resource": { - "location": "path", - "description": "REQUIRED: The resource for which the policy is being requested.\nSee the operation documentation for the appropriate value for this field.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+/subscriptions/[^/]+$" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ], - "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy", - "id": "pubsub.projects.subscriptions.getIamPolicy", - "path": "v1/{+resource}:getIamPolicy", - "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset." - }, - "modifyAckDeadline": { - "response": { - "$ref": "Empty" - }, - "parameterOrder": [ - "subscription" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ], - "parameters": { - "subscription": { - "location": "path", - "description": "The name of the subscription.\nFormat is `projects/{project}/subscriptions/{sub}`.", "required": true, - "type": "string", - "pattern": "^projects/[^/]+/subscriptions/[^/]+$" - } - }, - "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline", - "path": "v1/{+subscription}:modifyAckDeadline", - "id": "pubsub.projects.subscriptions.modifyAckDeadline", - "description": "Modifies the ack deadline for a specific message. This method is useful\nto indicate that more time is needed to process a message by the\nsubscriber, or to make the message available for redelivery if the\nprocessing was interrupted. Note that this does not modify the\nsubscription-level `ackDeadlineSeconds` used for subsequent messages.", - "request": { - "$ref": "ModifyAckDeadlineRequest" - } - }, - "get": { - "description": "Gets the configuration details of a subscription.", - "response": { - "$ref": "Subscription" - }, - "parameterOrder": [ - "subscription" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ], - "parameters": { - "subscription": { + "pattern": "^projects/[^/]+/snapshots/[^/]+$", "location": "path", - "description": "The name of the subscription to get.\nFormat is `projects/{project}/subscriptions/{sub}`.", - "required": true, - "type": "string", - "pattern": "^projects/[^/]+/subscriptions/[^/]+$" + "description": "REQUIRED: The resource for which the policy detail is being requested.\nSee the operation documentation for the appropriate value for this field." } - }, - "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}", - "path": "v1/{+subscription}", - "id": "pubsub.projects.subscriptions.get" + } }, - "testIamPermissions": { - "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.\n\nNote: This operation is designed to be used for building permission-aware\nUIs and command-line tools, not for authorization checking. This operation\nmay \"fail open\" without warning.", - "request": { - "$ref": "TestIamPermissionsRequest" - }, + "getIamPolicy": { + "id": "pubsub.projects.snapshots.getIamPolicy", + "path": "v1/{+resource}:getIamPolicy", + "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.", "response": { - "$ref": "TestIamPermissionsResponse" + "$ref": "Policy" }, "parameterOrder": [ "resource" ], - "httpMethod": "POST", + "httpMethod": "GET", "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/pubsub" ], "parameters": { "resource": { - "location": "path", - "description": "REQUIRED: The resource for which the policy detail is being requested.\nSee the operation documentation for the appropriate value for this field.", - "required": true, + "description": "REQUIRED: The resource for which the policy is being requested.\nSee the operation documentation for the appropriate value for this field.", "type": "string", - "pattern": "^projects/[^/]+/subscriptions/[^/]+$" + "required": true, + "pattern": "^projects/[^/]+/snapshots/[^/]+$", + "location": "path" } }, - "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions", - "path": "v1/{+resource}:testIamPermissions", - "id": "pubsub.projects.subscriptions.testIamPermissions" - }, + "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:getIamPolicy" + } + } + }, + "subscriptions": { + "methods": { "modifyPushConfig": { "response": { "$ref": "Empty" @@ -538,32 +381,28 @@ "subscription" ], "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/pubsub" - ], "parameters": { "subscription": { - "location": "path", "description": "The name of the subscription.\nFormat is `projects/{project}/subscriptions/{sub}`.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+/subscriptions/[^/]+$" + "required": true, + "pattern": "^projects/[^/]+/subscriptions/[^/]+$", + "location": "path" } }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ], "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyPushConfig", - "path": "v1/{+subscription}:modifyPushConfig", "id": "pubsub.projects.subscriptions.modifyPushConfig", + "path": "v1/{+subscription}:modifyPushConfig", "description": "Modifies the `PushConfig` for a specified subscription.\n\nThis may be used to change a push subscription to a pull one (signified by\nan empty `PushConfig`) or vice versa, or change the endpoint URL and other\nattributes of a push subscription. Messages will accumulate for delivery\ncontinuously through the call regardless of changes to the `PushConfig`.", "request": { "$ref": "ModifyPushConfigRequest" } }, "pull": { - "request": { - "$ref": "PullRequest" - }, - "description": "Pulls messages from the server. Returns an empty list if there are no\nmessages available in the backlog. The server may return `UNAVAILABLE` if\nthere are too many concurrent pull requests pending for the given\nsubscription.", "response": { "$ref": "PullResponse" }, @@ -574,8 +413,8 @@ "parameters": { "subscription": { "description": "The subscription from which messages should be pulled.\nFormat is `projects/{project}/subscriptions/{sub}`.", - "required": true, "type": "string", + "required": true, "pattern": "^projects/[^/]+/subscriptions/[^/]+$", "location": "path" } @@ -585,122 +424,272 @@ "https://www.googleapis.com/auth/pubsub" ], "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:pull", + "id": "pubsub.projects.subscriptions.pull", "path": "v1/{+subscription}:pull", - "id": "pubsub.projects.subscriptions.pull" + "description": "Pulls messages from the server. Returns an empty list if there are no\nmessages available in the backlog. The server may return `UNAVAILABLE` if\nthere are too many concurrent pull requests pending for the given\nsubscription.", + "request": { + "$ref": "PullRequest" + } }, "delete": { - "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}", - "path": "v1/{+subscription}", - "id": "pubsub.projects.subscriptions.delete", "description": "Deletes an existing subscription. All messages retained in the subscription\nare immediately dropped. Calls to `Pull` after deletion will return\n`NOT_FOUND`. After a subscription is deleted, a new one may be created with\nthe same name, but the new one has no association with the old\nsubscription or its topic unless the same topic is specified.", + "httpMethod": "DELETE", "response": { "$ref": "Empty" }, "parameterOrder": [ "subscription" ], - "httpMethod": "DELETE", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ], "parameters": { "subscription": { + "location": "path", "description": "The subscription to delete.\nFormat is `projects/{project}/subscriptions/{sub}`.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+/subscriptions/[^/]+$", - "location": "path" + "required": true, + "pattern": "^projects/[^/]+/subscriptions/[^/]+$" + } + }, + "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}", + "path": "v1/{+subscription}", + "id": "pubsub.projects.subscriptions.delete" + }, + "list": { + "response": { + "$ref": "ListSubscriptionsResponse" + }, + "parameterOrder": [ + "project" + ], + "httpMethod": "GET", + "parameters": { + "pageToken": { + "location": "query", + "description": "The value returned by the last `ListSubscriptionsResponse`; indicates that\nthis is a continuation of a prior `ListSubscriptions` call, and that the\nsystem should return the next page of data.", + "type": "string" + }, + "pageSize": { + "location": "query", + "format": "int32", + "description": "Maximum number of subscriptions to return.", + "type": "integer" + }, + "project": { + "pattern": "^projects/[^/]+$", + "location": "path", + "description": "The name of the cloud project that subscriptions belong to.\nFormat is `projects/{project}`.", + "type": "string", + "required": true } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/pubsub" - ] - } - } - }, - "snapshots": { - "methods": { + ], + "flatPath": "v1/projects/{projectsId}/subscriptions", + "id": "pubsub.projects.subscriptions.list", + "path": "v1/{+project}/subscriptions", + "description": "Lists matching subscriptions." + }, "setIamPolicy": { - "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:setIamPolicy", - "path": "v1/{+resource}:setIamPolicy", - "id": "pubsub.projects.snapshots.setIamPolicy", + "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.", "request": { "$ref": "SetIamPolicyRequest" }, - "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.", - "response": { - "$ref": "Policy" - }, + "httpMethod": "POST", "parameterOrder": [ "resource" ], - "httpMethod": "POST", + "response": { + "$ref": "Policy" + }, "parameters": { "resource": { "description": "REQUIRED: The resource for which the policy is being specified.\nSee the operation documentation for the appropriate value for this field.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+/snapshots/[^/]+$", + "required": true, + "pattern": "^projects/[^/]+/subscriptions/[^/]+$", "location": "path" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/pubsub" - ] + ], + "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy", + "path": "v1/{+resource}:setIamPolicy", + "id": "pubsub.projects.subscriptions.setIamPolicy" }, - "testIamPermissions": { + "create": { + "path": "v1/{+name}", + "id": "pubsub.projects.subscriptions.create", "request": { - "$ref": "TestIamPermissionsRequest" + "$ref": "Subscription" }, - "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.\n\nNote: This operation is designed to be used for building permission-aware\nUIs and command-line tools, not for authorization checking. This operation\nmay \"fail open\" without warning.", + "description": "Creates a subscription to a given topic.\nIf the subscription already exists, returns `ALREADY_EXISTS`.\nIf the corresponding topic doesn't exist, returns `NOT_FOUND`.\n\nIf the name is not provided in the request, the server will assign a random\nname for this subscription on the same project as the topic, conforming\nto the\n[resource name format](https://cloud.google.com/pubsub/docs/overview#names).\nThe generated name is populated in the returned Subscription object.\nNote that for REST API requests, you must specify a name in the request.", + "httpMethod": "PUT", + "parameterOrder": [ + "name" + ], "response": { - "$ref": "TestIamPermissionsResponse" + "$ref": "Subscription" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ], + "parameters": { + "name": { + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/subscriptions/[^/]+$", + "location": "path", + "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`." + } + }, + "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}" + }, + "acknowledge": { + "request": { + "$ref": "AcknowledgeRequest" }, + "description": "Acknowledges the messages associated with the `ack_ids` in the\n`AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages\nfrom the subscription.\n\nAcknowledging a message whose ack deadline has expired may succeed,\nbut such a message may be redelivered later. Acknowledging a message more\nthan once will not result in an error.", + "httpMethod": "POST", "parameterOrder": [ - "resource" + "subscription" + ], + "response": { + "$ref": "Empty" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ], + "parameters": { + "subscription": { + "pattern": "^projects/[^/]+/subscriptions/[^/]+$", + "location": "path", + "description": "The subscription whose message is being acknowledged.\nFormat is `projects/{project}/subscriptions/{sub}`.", + "type": "string", + "required": true + } + }, + "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge", + "path": "v1/{+subscription}:acknowledge", + "id": "pubsub.projects.subscriptions.acknowledge" + }, + "modifyAckDeadline": { + "response": { + "$ref": "Empty" + }, + "parameterOrder": [ + "subscription" ], "httpMethod": "POST", "parameters": { - "resource": { - "description": "REQUIRED: The resource for which the policy detail is being requested.\nSee the operation documentation for the appropriate value for this field.", - "required": true, + "subscription": { + "location": "path", + "description": "The name of the subscription.\nFormat is `projects/{project}/subscriptions/{sub}`.", "type": "string", - "pattern": "^projects/[^/]+/snapshots/[^/]+$", - "location": "path" + "required": true, + "pattern": "^projects/[^/]+/subscriptions/[^/]+$" } }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/pubsub" ], - "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:testIamPermissions", - "path": "v1/{+resource}:testIamPermissions", - "id": "pubsub.projects.snapshots.testIamPermissions" + "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline", + "id": "pubsub.projects.subscriptions.modifyAckDeadline", + "path": "v1/{+subscription}:modifyAckDeadline", + "description": "Modifies the ack deadline for a specific message. This method is useful\nto indicate that more time is needed to process a message by the\nsubscriber, or to make the message available for redelivery if the\nprocessing was interrupted. Note that this does not modify the\nsubscription-level `ackDeadlineSeconds` used for subsequent messages.", + "request": { + "$ref": "ModifyAckDeadlineRequest" + } }, "getIamPolicy": { - "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.", - "response": { - "$ref": "Policy" - }, "parameterOrder": [ "resource" ], "httpMethod": "GET", + "response": { + "$ref": "Policy" + }, "scopes": [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/pubsub" ], "parameters": { "resource": { - "location": "path", "description": "REQUIRED: The resource for which the policy is being requested.\nSee the operation documentation for the appropriate value for this field.", - "required": true, "type": "string", - "pattern": "^projects/[^/]+/snapshots/[^/]+$" + "required": true, + "pattern": "^projects/[^/]+/subscriptions/[^/]+$", + "location": "path" } }, - "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:getIamPolicy", + "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy", + "id": "pubsub.projects.subscriptions.getIamPolicy", "path": "v1/{+resource}:getIamPolicy", - "id": "pubsub.projects.snapshots.getIamPolicy" + "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset." + }, + "get": { + "parameters": { + "subscription": { + "pattern": "^projects/[^/]+/subscriptions/[^/]+$", + "location": "path", + "description": "The name of the subscription to get.\nFormat is `projects/{project}/subscriptions/{sub}`.", + "type": "string", + "required": true + } + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ], + "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}", + "path": "v1/{+subscription}", + "id": "pubsub.projects.subscriptions.get", + "description": "Gets the configuration details of a subscription.", + "httpMethod": "GET", + "response": { + "$ref": "Subscription" + }, + "parameterOrder": [ + "subscription" + ] + }, + "testIamPermissions": { + "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions", + "path": "v1/{+resource}:testIamPermissions", + "id": "pubsub.projects.subscriptions.testIamPermissions", + "request": { + "$ref": "TestIamPermissionsRequest" + }, + "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.\n\nNote: This operation is designed to be used for building permission-aware\nUIs and command-line tools, not for authorization checking. This operation\nmay \"fail open\" without warning.", + "httpMethod": "POST", + "parameterOrder": [ + "resource" + ], + "response": { + "$ref": "TestIamPermissionsResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/pubsub" + ], + "parameters": { + "resource": { + "location": "path", + "description": "REQUIRED: The resource for which the policy detail is being requested.\nSee the operation documentation for the appropriate value for this field.", + "type": "string", + "required": true, + "pattern": "^projects/[^/]+/subscriptions/[^/]+$" + } + } } } } @@ -708,11 +697,26 @@ } }, "parameters": { + "key": { + "location": "query", + "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", + "type": "string" + }, + "access_token": { + "location": "query", + "description": "OAuth access token.", + "type": "string" + }, + "quotaUser": { + "location": "query", + "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", + "type": "string" + }, "pp": { "location": "query", "description": "Pretty-print response.", - "type": "boolean", - "default": "true" + "default": "true", + "type": "boolean" }, "bearer_token": { "description": "OAuth bearer token.", @@ -725,209 +729,72 @@ "type": "string" }, "upload_protocol": { - "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", - "type": "string", - "location": "query" - }, - "prettyPrint": { - "description": "Returns response with indentations and line breaks.", - "type": "boolean", - "default": "true", - "location": "query" - }, - "fields": { - "description": "Selector specifying which fields to include in a partial response.", - "type": "string", - "location": "query" - }, - "uploadType": { - "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").", - "type": "string", - "location": "query" - }, - "callback": { "location": "query", - "description": "JSONP", - "type": "string" - }, - "$.xgafv": { - "description": "V1 error format.", - "type": "string", - "enumDescriptions": [ - "v1 error format", - "v2 error format" - ], - "location": "query", - "enum": [ - "1", - "2" - ] - }, - "alt": { - "type": "string", - "enumDescriptions": [ - "Responses with Content-Type of application/json", - "Media download with context-dependent Content-Type", - "Responses with Content-Type of application/x-protobuf" - ], - "location": "query", - "description": "Data format for response.", - "default": "json", - "enum": [ - "json", - "media", - "proto" - ] - }, - "key": { - "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", - "type": "string", - "location": "query" - }, - "access_token": { - "description": "OAuth access token.", - "type": "string", - "location": "query" - }, - "quotaUser": { - "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", - "type": "string", - "location": "query" - } - }, - "schemas": { - "Policy": { - "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n {\n \"bindings\": [\n {\n \"role\": \"roles/owner\",\n \"members\": [\n \"user:mike@example.com\",\n \"group:admins@example.com\",\n \"domain:google.com\",\n \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n ]\n },\n {\n \"role\": \"roles/viewer\",\n \"members\": [\"user:sean@example.com\"]\n }\n ]\n }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).", - "type": "object", - "properties": { - "etag": { - "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.", - "format": "byte", - "type": "string" - }, - "version": { - "description": "Version of the `Policy`. The default version is 0.", - "format": "int32", - "type": "integer" - }, - "bindings": { - "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.", - "type": "array", - "items": { - "$ref": "Binding" - } - } - }, - "id": "Policy" - }, - "Topic": { - "description": "A topic resource.", - "type": "object", - "properties": { - "name": { - "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.", - "type": "string" - } - }, - "id": "Topic" - }, - "ModifyAckDeadlineRequest": { - "description": "Request for the ModifyAckDeadline method.", - "type": "object", - "properties": { - "ackDeadlineSeconds": { - "description": "The new ack deadline with respect to the time this request was sent to\nthe Pub/Sub system. For example, if the value is 10, the new\nack deadline will expire 10 seconds after the `ModifyAckDeadline` call\nwas made. Specifying zero may immediately make the message available for\nanother pull request.\nThe minimum deadline you can specify is 0 seconds.\nThe maximum deadline you can specify is 600 seconds (10 minutes).", - "format": "int32", - "type": "integer" - }, - "ackIds": { - "description": "List of acknowledgment IDs.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "id": "ModifyAckDeadlineRequest" - }, - "SetIamPolicyRequest": { - "description": "Request message for `SetIamPolicy` method.", - "type": "object", - "properties": { - "policy": { - "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.", - "$ref": "Policy" - } - }, - "id": "SetIamPolicyRequest" - }, - "ModifyPushConfigRequest": { - "description": "Request for the ModifyPushConfig method.", - "type": "object", - "properties": { - "pushConfig": { - "$ref": "PushConfig", - "description": "The push configuration for future deliveries.\n\nAn empty `pushConfig` indicates that the Pub/Sub system should\nstop pushing messages from the given subscription and allow\nmessages to be pulled and acknowledged - effectively pausing\nthe subscription if `Pull` is not called." - } - }, - "id": "ModifyPushConfigRequest" - }, - "PubsubMessage": { - "description": "A message data and its attributes. The message payload must not be empty;\nit must contain either a non-empty data field, or at least one attribute.", - "type": "object", - "properties": { - "data": { - "description": "The message payload.", - "format": "byte", - "type": "string" - }, - "attributes": { - "description": "Optional attributes for this message.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "messageId": { - "description": "ID of this message, assigned by the server when the message is published.\nGuaranteed to be unique within the topic. This value may be read by a\nsubscriber that receives a `PubsubMessage` via a `Pull` call or a push\ndelivery. It must not be populated by the publisher in a `Publish` call.", - "type": "string" - }, - "publishTime": { - "description": "The time at which the message was published, populated by the server when\nit receives the `Publish` call. It must not be populated by the\npublisher in a `Publish` call.", - "format": "google-datetime", - "type": "string" - } - }, - "id": "PubsubMessage" + "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", + "type": "string" }, - "Binding": { - "description": "Associates `members` with a `role`.", - "type": "object", - "properties": { - "members": { - "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n users of that domain. For example, `google.com` or `example.com`.\n\n", - "type": "array", - "items": { - "type": "string" - } - }, - "role": { - "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired", - "type": "string" - } - }, - "id": "Binding" + "prettyPrint": { + "description": "Returns response with indentations and line breaks.", + "default": "true", + "type": "boolean", + "location": "query" + }, + "fields": { + "description": "Selector specifying which fields to include in a partial response.", + "type": "string", + "location": "query" + }, + "uploadType": { + "location": "query", + "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").", + "type": "string" + }, + "$.xgafv": { + "enumDescriptions": [ + "v1 error format", + "v2 error format" + ], + "location": "query", + "enum": [ + "1", + "2" + ], + "description": "V1 error format.", + "type": "string" + }, + "callback": { + "location": "query", + "description": "JSONP", + "type": "string" }, + "alt": { + "enum": [ + "json", + "media", + "proto" + ], + "type": "string", + "enumDescriptions": [ + "Responses with Content-Type of application/json", + "Media download with context-dependent Content-Type", + "Responses with Content-Type of application/x-protobuf" + ], + "location": "query", + "description": "Data format for response.", + "default": "json" + } + }, + "schemas": { "AcknowledgeRequest": { "description": "Request for the Acknowledge method.", "type": "object", "properties": { "ackIds": { "description": "The acknowledgment ID for the messages being acknowledged that was returned\nby the Pub/Sub system in the `Pull` response. Must not be empty.", - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } }, "id": "AcknowledgeRequest" @@ -942,16 +809,16 @@ "description": "Response for the `ListTopics` method.", "type": "object", "properties": { + "nextPageToken": { + "description": "If not empty, indicates that there may be more topics that match the\nrequest; this value should be passed in a new `ListTopicsRequest`.", + "type": "string" + }, "topics": { "description": "The resulting topics.", - "type": "array", "items": { "$ref": "Topic" - } - }, - "nextPageToken": { - "description": "If not empty, indicates that there may be more topics that match the\nrequest; this value should be passed in a new `ListTopicsRequest`.", - "type": "string" + }, + "type": "array" } }, "id": "ListTopicsResponse" @@ -965,28 +832,28 @@ "type": "string" }, "subscriptions": { - "description": "The names of the subscriptions that match the request.", - "type": "array", "items": { "type": "string" - } + }, + "type": "array", + "description": "The names of the subscriptions that match the request." } }, "id": "ListTopicSubscriptionsResponse" }, "PullResponse": { - "description": "Response for the `Pull` method.", "type": "object", "properties": { "receivedMessages": { "description": "Received Pub/Sub messages. The Pub/Sub system will return zero messages if\nthere are no more available in the backlog. The Pub/Sub system may return\nfewer than the `maxMessages` requested even if there are more messages\navailable in the backlog.", - "type": "array", "items": { "$ref": "ReceivedMessage" - } + }, + "type": "array" } }, - "id": "PullResponse" + "id": "PullResponse", + "description": "Response for the `Pull` method." }, "ReceivedMessage": { "description": "A message and its corresponding acknowledgment ID.", @@ -997,8 +864,8 @@ "type": "string" }, "message": { - "$ref": "PubsubMessage", - "description": "The message." + "description": "The message.", + "$ref": "PubsubMessage" } }, "id": "ReceivedMessage" @@ -1007,16 +874,16 @@ "description": "Configuration for a push delivery endpoint.", "type": "object", "properties": { - "pushEndpoint": { - "description": "A URL locating the endpoint to which messages should be pushed.\nFor example, a Webhook endpoint might use \"https://example.com/push\".", - "type": "string" - }, "attributes": { + "description": "Endpoint configuration attributes.\n\nEvery endpoint has a set of API supported attributes that can be used to\ncontrol different aspects of the message delivery.\n\nThe currently supported attribute is `x-goog-version`, which you can\nuse to change the format of the pushed message. This attribute\nindicates the version of the data expected by the endpoint. This\ncontrols the shape of the pushed message (i.e., its fields and metadata).\nThe endpoint version is based on the version of the Pub/Sub API.\n\nIf not present during the `CreateSubscription` call, it will default to\nthe version of the API used to make such call. If not present during a\n`ModifyPushConfig` call, its value will not be changed. `GetSubscription`\ncalls will always return a valid version, even if the subscription was\ncreated without this attribute.\n\nThe possible values for this attribute are:\n\n* `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.\n* `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.", + "type": "object", "additionalProperties": { "type": "string" - }, - "description": "Endpoint configuration attributes.\n\nEvery endpoint has a set of API supported attributes that can be used to\ncontrol different aspects of the message delivery.\n\nThe currently supported attribute is `x-goog-version`, which you can\nuse to change the format of the pushed message. This attribute\nindicates the version of the data expected by the endpoint. This\ncontrols the shape of the pushed message (i.e., its fields and metadata).\nThe endpoint version is based on the version of the Pub/Sub API.\n\nIf not present during the `CreateSubscription` call, it will default to\nthe version of the API used to make such call. If not present during a\n`ModifyPushConfig` call, its value will not be changed. `GetSubscription`\ncalls will always return a valid version, even if the subscription was\ncreated without this attribute.\n\nThe possible values for this attribute are:\n\n* `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.\n* `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.", - "type": "object" + } + }, + "pushEndpoint": { + "description": "A URL locating the endpoint to which messages should be pushed.\nFor example, a Webhook endpoint might use \"https://example.com/push\".", + "type": "string" } }, "id": "PushConfig" @@ -1027,10 +894,10 @@ "properties": { "permissions": { "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.", - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } }, "id": "TestIamPermissionsResponse" @@ -1039,19 +906,20 @@ "description": "Request for the `Pull` method.", "type": "object", "properties": { - "returnImmediately": { - "description": "If this field set to true, the system will respond immediately even if\nit there are no messages available to return in the `Pull` response.\nOtherwise, the system may wait (for a bounded amount of time) until at\nleast one message is available, rather than returning no messages. The\nclient may cancel the request if it does not wish to wait any longer for\nthe response.", - "type": "boolean" - }, "maxMessages": { - "description": "The maximum number of messages returned for this request. The Pub/Sub\nsystem may return fewer than the number specified.", "format": "int32", + "description": "The maximum number of messages returned for this request. The Pub/Sub\nsystem may return fewer than the number specified.", "type": "integer" + }, + "returnImmediately": { + "description": "If this field set to true, the system will respond immediately even if\nit there are no messages available to return in the `Pull` response.\nOtherwise, the system may wait (for a bounded amount of time) until at\nleast one message is available, rather than returning no messages. The\nclient may cancel the request if it does not wish to wait any longer for\nthe response.", + "type": "boolean" } }, "id": "PullRequest" }, "ListSubscriptionsResponse": { + "id": "ListSubscriptionsResponse", "description": "Response for the `ListSubscriptions` method.", "type": "object", "properties": { @@ -1061,13 +929,12 @@ }, "subscriptions": { "description": "The subscriptions that match the request.", - "type": "array", "items": { "$ref": "Subscription" - } + }, + "type": "array" } - }, - "id": "ListSubscriptionsResponse" + } }, "PublishRequest": { "description": "Request for the Publish method.", @@ -1075,10 +942,10 @@ "properties": { "messages": { "description": "The messages to publish.", - "type": "array", "items": { "$ref": "PubsubMessage" - } + }, + "type": "array" } }, "id": "PublishRequest" @@ -1089,21 +956,24 @@ "properties": { "messageIds": { "description": "The server-assigned ID of each published message, in the same order as\nthe messages in the request. IDs are guaranteed to be unique within\nthe topic.", - "type": "array", "items": { "type": "string" - } + }, + "type": "array" } }, "id": "PublishResponse" }, "Subscription": { - "description": "A subscription resource.", "type": "object", "properties": { + "pushConfig": { + "description": "If push delivery is used with this subscription, this field is\nused to configure it. An empty `pushConfig` signifies that the subscriber\nwill pull and ack messages using API methods.", + "$ref": "PushConfig" + }, "ackDeadlineSeconds": { - "description": "This value is the maximum time after a subscriber receives a message\nbefore the subscriber should acknowledge the message. After message\ndelivery but before the ack deadline expires and before the message is\nacknowledged, it is an outstanding message and will not be delivered\nagain during that time (on a best-effort basis).\n\nFor pull subscriptions, this value is used as the initial value for the ack\ndeadline. To override this value for a given message, call\n`ModifyAckDeadline` with the corresponding `ack_id` if using\npull.\nThe minimum custom deadline you can specify is 10 seconds.\nThe maximum custom deadline you can specify is 600 seconds (10 minutes).\nIf this parameter is 0, a default value of 10 seconds is used.\n\nFor push delivery, this value is also used to set the request timeout for\nthe call to the push endpoint.\n\nIf the subscriber never acknowledges the message, the Pub/Sub\nsystem will eventually redeliver the message.", "format": "int32", + "description": "This value is the maximum time after a subscriber receives a message\nbefore the subscriber should acknowledge the message. After message\ndelivery but before the ack deadline expires and before the message is\nacknowledged, it is an outstanding message and will not be delivered\nagain during that time (on a best-effort basis).\n\nFor pull subscriptions, this value is used as the initial value for the ack\ndeadline. To override this value for a given message, call\n`ModifyAckDeadline` with the corresponding `ack_id` if using\npull.\nThe minimum custom deadline you can specify is 10 seconds.\nThe maximum custom deadline you can specify is 600 seconds (10 minutes).\nIf this parameter is 0, a default value of 10 seconds is used.\n\nFor push delivery, this value is also used to set the request timeout for\nthe call to the push endpoint.\n\nIf the subscriber never acknowledges the message, the Pub/Sub\nsystem will eventually redeliver the message.", "type": "integer" }, "name": { @@ -1113,34 +983,153 @@ "topic": { "description": "The name of the topic from which this subscription is receiving messages.\nFormat is `projects/{project}/topics/{topic}`.\nThe value of this field will be `_deleted-topic_` if the topic has been\ndeleted.", "type": "string" - }, - "pushConfig": { - "$ref": "PushConfig", - "description": "If push delivery is used with this subscription, this field is\nused to configure it. An empty `pushConfig` signifies that the subscriber\nwill pull and ack messages using API methods." } }, - "id": "Subscription" + "id": "Subscription", + "description": "A subscription resource." }, "TestIamPermissionsRequest": { - "description": "Request message for `TestIamPermissions` method.", "type": "object", "properties": { "permissions": { "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).", - "type": "array", "items": { "type": "string" - } + }, + "type": "array" + } + }, + "id": "TestIamPermissionsRequest", + "description": "Request message for `TestIamPermissions` method." + }, + "Policy": { + "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n {\n \"bindings\": [\n {\n \"role\": \"roles/owner\",\n \"members\": [\n \"user:mike@example.com\",\n \"group:admins@example.com\",\n \"domain:google.com\",\n \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n ]\n },\n {\n \"role\": \"roles/viewer\",\n \"members\": [\"user:sean@example.com\"]\n }\n ]\n }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).", + "type": "object", + "properties": { + "bindings": { + "description": "Associates a list of `members` to a `role`.\n`bindings` with no members will result in an error.", + "items": { + "$ref": "Binding" + }, + "type": "array" + }, + "etag": { + "format": "byte", + "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.", + "type": "string" + }, + "version": { + "format": "int32", + "description": "Version of the `Policy`. The default version is 0.", + "type": "integer" + } + }, + "id": "Policy" + }, + "Topic": { + "description": "A topic resource.", + "type": "object", + "properties": { + "name": { + "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.", + "type": "string" + } + }, + "id": "Topic" + }, + "ModifyAckDeadlineRequest": { + "description": "Request for the ModifyAckDeadline method.", + "type": "object", + "properties": { + "ackDeadlineSeconds": { + "format": "int32", + "description": "The new ack deadline with respect to the time this request was sent to\nthe Pub/Sub system. For example, if the value is 10, the new\nack deadline will expire 10 seconds after the `ModifyAckDeadline` call\nwas made. Specifying zero may immediately make the message available for\nanother pull request.\nThe minimum deadline you can specify is 0 seconds.\nThe maximum deadline you can specify is 600 seconds (10 minutes).", + "type": "integer" + }, + "ackIds": { + "description": "List of acknowledgment IDs.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "id": "ModifyAckDeadlineRequest" + }, + "SetIamPolicyRequest": { + "description": "Request message for `SetIamPolicy` method.", + "type": "object", + "properties": { + "policy": { + "$ref": "Policy", + "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them." + } + }, + "id": "SetIamPolicyRequest" + }, + "ModifyPushConfigRequest": { + "description": "Request for the ModifyPushConfig method.", + "type": "object", + "properties": { + "pushConfig": { + "description": "The push configuration for future deliveries.\n\nAn empty `pushConfig` indicates that the Pub/Sub system should\nstop pushing messages from the given subscription and allow\nmessages to be pulled and acknowledged - effectively pausing\nthe subscription if `Pull` is not called.", + "$ref": "PushConfig" + } + }, + "id": "ModifyPushConfigRequest" + }, + "PubsubMessage": { + "description": "A message data and its attributes. The message payload must not be empty;\nit must contain either a non-empty data field, or at least one attribute.", + "type": "object", + "properties": { + "messageId": { + "description": "ID of this message, assigned by the server when the message is published.\nGuaranteed to be unique within the topic. This value may be read by a\nsubscriber that receives a `PubsubMessage` via a `Pull` call or a push\ndelivery. It must not be populated by the publisher in a `Publish` call.", + "type": "string" + }, + "attributes": { + "additionalProperties": { + "type": "string" + }, + "description": "Optional attributes for this message.", + "type": "object" + }, + "publishTime": { + "format": "google-datetime", + "description": "The time at which the message was published, populated by the server when\nit receives the `Publish` call. It must not be populated by the\npublisher in a `Publish` call.", + "type": "string" + }, + "data": { + "format": "byte", + "description": "The message payload.", + "type": "string" + } + }, + "id": "PubsubMessage" + }, + "Binding": { + "properties": { + "role": { + "type": "string", + "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired" + }, + "members": { + "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n For example, `admins@example.com`.\n\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n users of that domain. For example, `google.com` or `example.com`.\n\n", + "items": { + "type": "string" + }, + "type": "array" } }, - "id": "TestIamPermissionsRequest" + "id": "Binding", + "description": "Associates `members` with a `role`.", + "type": "object" } }, - "protocol": "rest", "icons": { - "x32": "http://www.google.com/images/icons/product/search-32.gif", - "x16": "http://www.google.com/images/icons/product/search-16.gif" + "x16": "http://www.google.com/images/icons/product/search-16.gif", + "x32": "http://www.google.com/images/icons/product/search-32.gif" }, + "protocol": "rest", "version": "v1", "baseUrl": "https://pubsub.googleapis.com/", "canonicalName": "Pubsub", @@ -1155,5 +1144,16 @@ } } } - } + }, + "kind": "discovery#restDescription", + "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n", + "servicePath": "", + "rootUrl": "https://pubsub.googleapis.com/", + "basePath": "", + "ownerDomain": "google.com", + "name": "pubsub", + "batchPath": "batch", + "id": "pubsub:v1", + "documentationLink": "https://cloud.google.com/pubsub/docs", + "revision": "20170630" } diff --git a/vendor/google.golang.org/api/pubsub/v1/pubsub-gen.go b/vendor/google.golang.org/api/pubsub/v1/pubsub-gen.go index c7e511ede97a8..12ea3588d8a45 100644 --- a/vendor/google.golang.org/api/pubsub/v1/pubsub-gen.go +++ b/vendor/google.golang.org/api/pubsub/v1/pubsub-gen.go @@ -193,6 +193,7 @@ type Binding struct { // group. // For example, `admins@example.com`. // + // // * `domain:{domain}`: A Google Apps domain name that represents all // the // users of that domain. For example, `google.com` or @@ -477,8 +478,6 @@ func (s *ModifyPushConfigRequest) MarshalJSON() ([]byte, error) { // [IAM developer's guide](https://cloud.google.com/iam). type Policy struct { // Bindings: Associates a list of `members` to a `role`. - // Multiple `bindings` must not be specified for the same - // `role`. // `bindings` with no members will result in an error. Bindings []*Binding `json:"bindings,omitempty"` From cbb95fae92f49ad87d6665ebca2b908c19a8423c Mon Sep 17 00:00:00 2001 From: Todd Lyons Date: Tue, 15 Aug 2017 15:41:30 -0700 Subject: [PATCH 079/403] NR Infrastructure agent example daemonset Copy of previous newrelic example, then modified to use the new agent "newrelic-infra" instead of "nrsysmond". Also maps all of host node's root fs into /host in the container (ro, but still exposes underlying node info into a container). Updates to README --- examples/newrelic-infrastructure/.gitignore | 1 + examples/newrelic-infrastructure/README.md | 146 ++++++++++++++++++ .../config-to-secret.sh | 20 +++ .../newrelic-config-template.yaml | 7 + .../newrelic-infra-daemonset.yaml | 58 +++++++ examples/newrelic-infrastructure/nrconfig.env | 9 ++ 6 files changed, 241 insertions(+) create mode 100644 examples/newrelic-infrastructure/.gitignore create mode 100644 examples/newrelic-infrastructure/README.md create mode 100755 examples/newrelic-infrastructure/config-to-secret.sh create mode 100644 examples/newrelic-infrastructure/newrelic-config-template.yaml create mode 100644 examples/newrelic-infrastructure/newrelic-infra-daemonset.yaml create mode 100644 examples/newrelic-infrastructure/nrconfig.env diff --git a/examples/newrelic-infrastructure/.gitignore b/examples/newrelic-infrastructure/.gitignore new file mode 100644 index 0000000000000..2ad9294d5dfe2 --- /dev/null +++ b/examples/newrelic-infrastructure/.gitignore @@ -0,0 +1 @@ +*.local diff --git a/examples/newrelic-infrastructure/README.md b/examples/newrelic-infrastructure/README.md new file mode 100644 index 0000000000000..df27b5cbee5c0 --- /dev/null +++ b/examples/newrelic-infrastructure/README.md @@ -0,0 +1,146 @@ +## New Relic Infrastructure Server Monitoring Agent Example + +This example shows how to run a New Relic Infrastructure server monitoring agent as a pod in a DaemonSet on an existing Kubernetes cluster. + +This example will create a DaemonSet which places the New Relic Infrastructure monitoring agent on every node in the cluster. It's also fairly trivial to exclude specific Kubernetes nodes from the DaemonSet to just monitor specific servers. (The prior nrsysmond has been deprecated.) + +### Step 0: Prerequisites + +This process will create privileged containers which have full access to the host system for logging. Beware of the security implications of this. + +DaemonSets must be enabled on your cluster. Instructions for enabling DaemonSet can be found [here](../../docs/api.md#enabling-the-extensions-group). + +### Step 1: Configure New Relic Infrastructure Agent + +The New Relic Infrastructure agent is configured via environment variables. We will configure these environment variables in a sourced bash script, encode the environment file data, and store it in a secret which will be loaded at container runtime. (Reread this sentence a few times, it's *HOW* the entire container works.) + +The [New Relic Linux Infrastructure Server configuration page](https://docs.newrelic.com/docs/servers/new-relic-servers-linux/installation-configuration/configuring-servers-linux) lists all the other settings for the Infrastructure process. + +To create an environment variable for a setting, prepend NRIA_ to its name and capitalize all of the env variable. For example, + +```console +log_file=/var/log/nr-infra.log +``` + +translates to + +```console +NRIA_LOG_FILE=/var/log/nr-infra.log +``` + +Edit examples/newrelic-infrastructure/nrconfig.env and configure relevant environment variables for your NewRelic Infrastructure agent. There are a few defauts defined, but the only required variable is the New Relic license key. + +Now, let's vendor the config into a secret. + +```console +$ cd examples/newrelic-infrastructure/ +$ ./config-to-secret.sh +``` + + + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: newrelic-config +type: Opaque +data: + config: {{config_data}} +``` + +[Download example](newrelic-config-template.yaml?raw=true) + + +The script will encode the config file and write it to `newrelic-config.yaml`. + +Finally, submit the config to the cluster: + +```console +$ kubectl create -f examples/newrelic-infrastructure/newrelic-config.yaml +``` + +### Step 2: Create the DaemonSet definition. + +The DaemonSet definition instructs Kubernetes to place a newrelic Infrastructure agent on each Kubernetes node. + + + +```yaml +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + name: newrelic-infra-agent + labels: + tier: monitoring + app: newrelic-infra-agent + version: v1 +spec: + template: + metadata: + labels: + name: newrelic + spec: + # Filter to specific nodes: + # nodeSelector: + # app: newrelic + hostPID: true + hostIPC: true + hostNetwork: true + containers: + - resources: + requests: + cpu: 0.15 + securityContext: + privileged: true + image: newrelic/infrastructure + name: newrelic + command: [ "bash", "-c", "source /etc/kube-nr-infra/config && /usr/bin/newrelic-infra" ] + volumeMounts: + - name: newrelic-config + mountPath: /etc/kube-nr-infra + readOnly: true + - name: dev + mountPath: /dev + - name: run + mountPath: /var/run/docker.sock + - name: log + mountPath: /var/log + - name: host-root + mountPath: /host + readOnly: true + volumes: + - name: newrelic-config + secret: + secretName: newrelic-config + - name: dev + hostPath: + path: /dev + - name: run + hostPath: + path: /var/run/docker.sock + - name: log + hostPath: + path: /var/log + - name: host-root + hostPath: + path: / +``` + +[Download example](newrelic-infra-daemonset.yaml?raw=true) + + +The daemonset instructs Kubernetes to spawn pods on each node, mapping /dev/, /run/, and /var/log to the container. It also maps the entire kube node / to /host/ in the container with a read-only mount. It also maps the secrets we set up earlier to /etc/kube-newrelic/config, and sources them in the startup script, configuring the agent properly. + +#### DaemonSet customization + +- There are more environment variables for fine tuning the infrastructure agent's operation (or a yaml file that you'd have to construct). See [Infrastructure Agent Environment Variables][(https://docs.newrelic.com/docs/infrastructure/new-relic-infrastructure/configuration/configure-infrastructure-agent) for the full list. + + +### Known issues + +It's a bit cludgy to define the environment variables like we do here in these config files. There is [another issue](https://github.com/kubernetes/kubernetes/issues/4710) to discuss adding mapping secrets to environment variables in Kubernetes. (Personally I don't like that method and prefer to use the config secrets.) + + +[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/examples/newrelic/README.md?pixel)]() + diff --git a/examples/newrelic-infrastructure/config-to-secret.sh b/examples/newrelic-infrastructure/config-to-secret.sh new file mode 100755 index 0000000000000..520c71990b015 --- /dev/null +++ b/examples/newrelic-infrastructure/config-to-secret.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Copyright 2014 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Encodes the environment variables into a Kubernetes secret. + +BASE64_ENC=$(cat nrconfig.env | base64 | tr -d '\n') +sed -e "s#{{config_data}}#${BASE64_ENC}#g" ./newrelic-config-template.yaml > newrelic-config.yaml diff --git a/examples/newrelic-infrastructure/newrelic-config-template.yaml b/examples/newrelic-infrastructure/newrelic-config-template.yaml new file mode 100644 index 0000000000000..361a307924070 --- /dev/null +++ b/examples/newrelic-infrastructure/newrelic-config-template.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Secret +metadata: + name: newrelic-config +type: Opaque +data: + config: {{config_data}} diff --git a/examples/newrelic-infrastructure/newrelic-infra-daemonset.yaml b/examples/newrelic-infrastructure/newrelic-infra-daemonset.yaml new file mode 100644 index 0000000000000..395ab97223a5d --- /dev/null +++ b/examples/newrelic-infrastructure/newrelic-infra-daemonset.yaml @@ -0,0 +1,58 @@ +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + name: newrelic-infra-agent + labels: + tier: monitoring + app: newrelic-infra-agent + version: v1 +spec: + template: + metadata: + labels: + name: newrelic + spec: + # Filter to specific nodes: + # nodeSelector: + # app: newrelic + hostPID: true + hostIPC: true + hostNetwork: true + containers: + - resources: + requests: + cpu: 0.15 + securityContext: + privileged: true + image: newrelic/infrastructure + name: newrelic + command: [ "bash", "-c", "source /etc/kube-nr-infra/config && /usr/bin/newrelic-infra" ] + volumeMounts: + - name: newrelic-config + mountPath: /etc/kube-nr-infra + readOnly: true + - name: dev + mountPath: /dev + - name: run + mountPath: /var/run/docker.sock + - name: log + mountPath: /var/log + - name: host-root + mountPath: /host + readOnly: true + volumes: + - name: newrelic-config + secret: + secretName: newrelic-config + - name: dev + hostPath: + path: /dev + - name: run + hostPath: + path: /var/run/docker.sock + - name: log + hostPath: + path: /var/log + - name: host-root + hostPath: + path: / diff --git a/examples/newrelic-infrastructure/nrconfig.env b/examples/newrelic-infrastructure/nrconfig.env new file mode 100644 index 0000000000000..ced09727caf41 --- /dev/null +++ b/examples/newrelic-infrastructure/nrconfig.env @@ -0,0 +1,9 @@ +#--REQUIRED-- +# Put your license key in this variable +export NRIA_LICENSE_KEY=REPLACE_LICENSE_KEY_HERE +# +#--OPTIONAL-- +# Set to 1 for debug output in the log +export NRIA_VERBOSE=0 +# Can log to any file, but will not create directories +export NRIA_LOG_FILE=/var/log/nr-infra.log From a0e95f947580789954195aa2e014f89e05332e93 Mon Sep 17 00:00:00 2001 From: Nick Sardo Date: Thu, 17 Aug 2017 10:29:58 -0700 Subject: [PATCH 080/403] Fix e2e_node for changes to /api/compute/v0.beta package --- test/e2e_node/runner/remote/run_remote.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/e2e_node/runner/remote/run_remote.go b/test/e2e_node/runner/remote/run_remote.go index 14460219064a5..4174728031026 100644 --- a/test/e2e_node/runner/remote/run_remote.go +++ b/test/e2e_node/runner/remote/run_remote.go @@ -369,7 +369,7 @@ func getImageMetadata(input string) *compute.Metadata { val := v metadataItems = append(metadataItems, &compute.MetadataItems{ Key: k, - Value: val, + Value: &val, }) } ret := compute.Metadata{Items: metadataItems} @@ -540,10 +540,11 @@ func createInstance(imageConfig *internalGCEImage) (string, error) { for _, accelerator := range imageConfig.resources.Accelerators { if i.GuestAccelerators == nil { + autoRestart := true i.GuestAccelerators = []*compute.AcceleratorConfig{} i.Scheduling = &compute.Scheduling{ OnHostMaintenance: "TERMINATE", - AutomaticRestart: true, + AutomaticRestart: &autoRestart, } } aType := fmt.Sprintf(acceleratorTypeResourceFormat, *project, *zone, accelerator.Type) @@ -627,7 +628,7 @@ func isCloudInitUsed(metadata *compute.Metadata) bool { return false } for _, item := range metadata.Items { - if item.Key == "user-data" && strings.HasPrefix(item.Value, "#cloud-config") { + if item.Key == "user-data" && item.Value != nil && strings.HasPrefix(*item.Value, "#cloud-config") { return true } } From cb28f0f34fabc7ee2ea280e4853eb0fdbaa4bd74 Mon Sep 17 00:00:00 2001 From: Walter Fender Date: Mon, 31 Jul 2017 15:43:20 -0700 Subject: [PATCH 081/403] Add e2e aggregator test. What this PR does / why we need it: This adds an e2e test for aggregation based on the sample-apiserver. Currently is uses a sample-apiserver built as of 1.7. This should ensure that the aggregation system works end-to-end. It will also help detect if we break "old" extension api servers. Which issue this PR fixes (optional, in fixes #(, fixes fixes #43714 Fixed bazel for the change. Fixed # of args issue from govet. Added code to test dynamic.Client. --- test/e2e/apimachinery/BUILD | 8 + test/e2e/apimachinery/aggregator.go | 490 ++++++++++++++++++++++++++++ test/e2e/framework/BUILD | 1 + test/e2e/framework/framework.go | 4 + test/utils/deployment.go | 17 +- 5 files changed, 516 insertions(+), 4 deletions(-) create mode 100644 test/e2e/apimachinery/aggregator.go diff --git a/test/e2e/apimachinery/BUILD b/test/e2e/apimachinery/BUILD index f4c0a40a1033f..21a93f45c6c37 100644 --- a/test/e2e/apimachinery/BUILD +++ b/test/e2e/apimachinery/BUILD @@ -8,6 +8,7 @@ load( go_library( name = "go_default_library", srcs = [ + "aggregator.go", "custom_resource_definition.go", "etcd_failure.go", "framework.go", @@ -20,6 +21,7 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/pod:go_default_library", + "//pkg/apis/rbac:go_default_library", "//pkg/printers:go_default_library", "//pkg/util/version:go_default_library", "//test/e2e/apps:go_default_library", @@ -33,6 +35,7 @@ go_library( "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", + "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", "//vendor/k8s.io/apiextensions-apiserver/test/integration/testserver:go_default_library", @@ -48,9 +51,14 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", + "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/util/cert:go_default_library", "//vendor/k8s.io/client-go/util/retry:go_default_library", + "//vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", ], ) diff --git a/test/e2e/apimachinery/aggregator.go b/test/e2e/apimachinery/aggregator.go new file mode 100644 index 0000000000000..bbf9bfb2e0049 --- /dev/null +++ b/test/e2e/apimachinery/aggregator.go @@ -0,0 +1,490 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apimachinery + +import ( + "crypto/x509" + "encoding/json" + "io/ioutil" + "os" + "strings" + "time" + + "k8s.io/api/core/v1" + extensions "k8s.io/api/extensions/v1beta1" + rbacv1beta1 "k8s.io/api/rbac/v1beta1" + apierrs "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + unstructuredv1 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apiserver/pkg/authentication/serviceaccount" + "k8s.io/client-go/discovery" + "k8s.io/client-go/util/cert" + apiregistrationv1beta1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1" + rbacapi "k8s.io/kubernetes/pkg/apis/rbac" + "k8s.io/kubernetes/test/e2e/framework" + samplev1alpha1 "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" + + . "github.com/onsi/ginkgo" +) + +type aggregatorContext struct { + apiserverCert []byte + apiserverKey []byte + apiserverSigningCert []byte +} + +var _ = SIGDescribe("Aggregator", func() { + f := framework.NewDefaultFramework("aggregator") + framework.AddCleanupAction(func() { + cleanTest(f, false) + }) + + It("Should be able to support the 1.7 Sample API Server using the current Aggregator", func() { + // Make sure the relevant provider supports Agggregator + framework.SkipUnlessProviderIs("gce", "gke") + + // Testing a 1.7 version of the sample-apiserver + TestSampleAPIServer(f, "gcr.io/kubernetes-e2e-test-images/k8s-aggregator-sample-apiserver-amd64:1.7", "sample-system") + }) +}) + +func cleanTest(f *framework.Framework, block bool) { + namespace := "sample-system" + client := f.ClientSet + _ = client.ExtensionsV1beta1().Deployments(namespace).Delete("sample-apiserver", nil) + _ = client.CoreV1().Secrets(namespace).Delete("sample-apiserver-secret", nil) + _ = client.CoreV1().Services(namespace).Delete("sample-api", nil) + _ = client.CoreV1().ServiceAccounts(namespace).Delete("sample-apiserver", nil) + _ = client.RbacV1beta1().RoleBindings("kube-system").Delete("wardler-auth-reader", nil) + _ = client.CoreV1().Namespaces().Delete(namespace, nil) + _ = client.RbacV1beta1().ClusterRoles().Delete("wardler", nil) + _ = client.RbacV1beta1().ClusterRoleBindings().Delete("wardler:sample-system:anonymous", nil) + aggrclient := f.AggregatorClient + _ = aggrclient.ApiregistrationV1beta1().APIServices().Delete("v1alpha1.wardle.k8s.io", nil) + if block { + _ = wait.Poll(100*time.Millisecond, 5*time.Second, func() (bool, error) { + _, err := client.CoreV1().Namespaces().Get("sample-system", metav1.GetOptions{}) + if err != nil { + if apierrs.IsNotFound(err) { + return true, nil + } + return false, err + } + return false, nil + }) + } +} + +func setupSampleAPIServerCert(namespaceName, serviceName string) *aggregatorContext { + aggregatorCertDir, err := ioutil.TempDir("", "test-e2e-aggregator") + if err != nil { + framework.Failf("Failed to create a temp dir for cert generation %v", err) + } + defer os.RemoveAll(aggregatorCertDir) + apiserverSigningKey, err := cert.NewPrivateKey() + if err != nil { + framework.Failf("Failed to create CA private key for apiserver %v", err) + } + apiserverSigningCert, err := cert.NewSelfSignedCACert(cert.Config{CommonName: "e2e-sampleapiserver-ca"}, apiserverSigningKey) + if err != nil { + framework.Failf("Failed to create CA cert for apiserver %v", err) + } + apiserverCACertFile, err := ioutil.TempFile(aggregatorCertDir, "apiserver-ca.crt") + if err != nil { + framework.Failf("Failed to create a temp file for ca cert generation %v", err) + } + if err := ioutil.WriteFile(apiserverCACertFile.Name(), cert.EncodeCertPEM(apiserverSigningCert), 0644); err != nil { + framework.Failf("Failed to write CA cert for apiserver %v", err) + } + apiserverKey, err := cert.NewPrivateKey() + if err != nil { + framework.Failf("Failed to create private key for apiserver %v", err) + } + apiserverCert, err := cert.NewSignedCert( + cert.Config{ + CommonName: serviceName + "." + namespaceName + ".svc", + Usages: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + }, + apiserverKey, apiserverSigningCert, apiserverSigningKey, + ) + if err != nil { + framework.Failf("Failed to create cert for apiserver %v", err) + } + apiserverCertFile, err := ioutil.TempFile(aggregatorCertDir, "apiserver.crt") + if err != nil { + framework.Failf("Failed to create a temp file for cert generation %v", err) + } + apiserverKeyFile, err := ioutil.TempFile(aggregatorCertDir, "apiserver.key") + if err != nil { + framework.Failf("Failed to create a temp file for key generation %v", err) + } + if err := ioutil.WriteFile(apiserverCertFile.Name(), cert.EncodeCertPEM(apiserverCert), 0600); err != nil { + framework.Failf("Failed to write cert file for apiserver %v", err) + } + if err := ioutil.WriteFile(apiserverKeyFile.Name(), cert.EncodePrivateKeyPEM(apiserverKey), 0644); err != nil { + framework.Failf("Failed to write key file for apiserver %v", err) + } + return &aggregatorContext{ + apiserverCert: cert.EncodeCertPEM(apiserverCert), + apiserverKey: cert.EncodePrivateKeyPEM(apiserverKey), + apiserverSigningCert: cert.EncodeCertPEM(apiserverSigningCert), + } +} + +// A basic test if the sample-apiserver code from 1.7 and compiled against 1.7 +// will work on the current Aggregator/API-Server. +func TestSampleAPIServer(f *framework.Framework, image, namespaceName string) { + By("Registering the sample API server.") + cleanTest(f, true) + client := f.ClientSet + iclient := f.InternalClientset + aggrclient := f.AggregatorClient + + context := setupSampleAPIServerCert(namespaceName, "sample-api") + ns := f.Namespace.Name + if framework.ProviderIs("gke") { + // kubectl create clusterrolebinding user-cluster-admin-binding --clusterrole=cluster-admin --user=user@domain.com + framework.BindClusterRole(client.RbacV1beta1(), "cluster-admin", ns, + rbacv1beta1.Subject{Kind: rbacv1beta1.ServiceAccountKind, Namespace: ns, Name: "default"}) + err := framework.WaitForAuthorizationUpdate(client.AuthorizationV1beta1(), + serviceaccount.MakeUsername(ns, "default"), + "", "get", schema.GroupResource{Group: "storage.k8s.io", Resource: "storageclasses"}, true) + framework.ExpectNoError(err, "Failed to update authorization: %v", err) + } + + // kubectl create -f namespace.yaml + var namespace string + err := wait.Poll(100*time.Millisecond, 30*time.Second, func() (bool, error) { + got, err := client.CoreV1().Namespaces().Create(&v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: namespaceName}}) + if err != nil { + if strings.HasPrefix(err.Error(), "object is being deleted:") { + return false, nil + } + return false, err + } + namespace = got.Name + return true, nil + }) + framework.ExpectNoError(err, "creating namespace %q", namespaceName) + + // kubectl create -f secret.yaml + secretName := "sample-apiserver-secret" + secret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretName, + }, + Type: v1.SecretTypeOpaque, + Data: map[string][]byte{ + "tls.crt": context.apiserverCert, + "tls.key": context.apiserverKey, + }, + } + _, err = client.CoreV1().Secrets(namespace).Create(secret) + framework.ExpectNoError(err, "creating secret %q in namespace %q", secretName, namespace) + + // kubectl create -f deploy.yaml + deploymentName := "sample-apiserver-deployment" + etcdImage := "quay.io/coreos/etcd:v3.0.17" + podLabels := map[string]string{"app": "sample-apiserver", "apiserver": "true"} + replicas := int32(1) + zero := int64(0) + mounts := []v1.VolumeMount{ + { + Name: "apiserver-certs", + ReadOnly: true, + MountPath: "/apiserver.local.config/certificates", + }, + } + volumes := []v1.Volume{ + { + Name: "apiserver-certs", + VolumeSource: v1.VolumeSource{ + Secret: &v1.SecretVolumeSource{SecretName: secretName}, + }, + }, + } + containers := []v1.Container{ + { + Name: "sample-apiserver", + VolumeMounts: mounts, + Args: []string{ + "--etcd-servers=http://localhost:2379", + "--tls-cert-file=/apiserver.local.config/certificates/tls.crt", + "--tls-private-key-file=/apiserver.local.config/certificates/tls.key", + "--audit-log-path=-", + "--audit-log-maxage=0", + "--audit-log-maxbackup=0", + }, + Image: image, + }, + { + Name: "etcd", + Image: etcdImage, + }, + } + d := &extensions.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: deploymentName, + }, + Spec: extensions.DeploymentSpec{ + Replicas: &replicas, + Strategy: extensions.DeploymentStrategy{ + Type: extensions.RollingUpdateDeploymentStrategyType, + }, + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: podLabels, + }, + Spec: v1.PodSpec{ + TerminationGracePeriodSeconds: &zero, + Containers: containers, + Volumes: volumes, + }, + }, + }, + } + deployment, err := client.ExtensionsV1beta1().Deployments(namespace).Create(d) + framework.ExpectNoError(err, "creating deployment %s in namespace %s", deploymentName, namespace) + err = framework.WaitForDeploymentRevisionAndImage(client, namespace, deploymentName, "1", image) + framework.ExpectNoError(err, "waiting for the deployment of image %s in %s in %s to complete", image, deploymentName, namespace) + err = framework.WaitForDeploymentRevisionAndImage(client, namespace, deploymentName, "1", etcdImage) + framework.ExpectNoError(err, "waiting for the deployment of image %s in %s to complete", etcdImage, deploymentName, namespace) + + // kubectl create -f service.yaml + serviceLabels := map[string]string{"apiserver": "true"} + service := &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: namespace, + Name: "sample-api", + Labels: map[string]string{"test": "aggregator"}, + }, + Spec: v1.ServiceSpec{ + Selector: serviceLabels, + Ports: []v1.ServicePort{ + { + Protocol: "TCP", + Port: 443, + TargetPort: intstr.FromInt(443), + }, + }, + }, + } + _, err = client.CoreV1().Services(namespace).Create(service) + framework.ExpectNoError(err, "creating service %s in namespace %s", "sample-apiserver", namespace) + + // kubectl create -f serviceAccount.yaml + sa := &v1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Name: "sample-apiserver"}} + _, err = client.CoreV1().ServiceAccounts(namespace).Create(sa) + framework.ExpectNoError(err, "creating service account %s in namespace %s", "sample-apiserver", namespace) + + // kubectl create -f authDelegator.yaml + _, err = client.RbacV1beta1().ClusterRoleBindings().Create(&rbacv1beta1.ClusterRoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: "wardler:" + namespace + ":anonymous", + }, + RoleRef: rbacv1beta1.RoleRef{ + APIGroup: "rbac.authorization.k8s.io", + Kind: "ClusterRole", + Name: "wardler", + }, + Subjects: []rbacv1beta1.Subject{ + { + APIGroup: "rbac.authorization.k8s.io", + Kind: "User", + Name: namespace + ":anonymous", + }, + }, + }) + framework.ExpectNoError(err, "creating cluster role binding %s", "wardler:"+namespace+":anonymous") + + // kubectl create -f role.yaml + resourceRule, err := rbacapi.NewRule("create", "delete", "deletecollection", "get", "list", "patch", "update", "watch").Groups("wardle.k8s.io").Resources("flunders").Rule() + framework.ExpectNoError(err, "creating cluster resource rule") + urlRule, err := rbacapi.NewRule("get").URLs("*").Rule() + framework.ExpectNoError(err, "creating cluster url rule") + roleLabels := map[string]string{"kubernetes.io/bootstrapping": "wardle-default"} + role := rbacapi.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{ + Name: "wardler", + Labels: roleLabels, + }, + Rules: []rbacapi.PolicyRule{resourceRule, urlRule}, + } + _, err = iclient.Rbac().ClusterRoles().Create(&role) + framework.ExpectNoError(err, "creating cluster role %s", "wardler") + + // kubectl create -f auth-reader.yaml + _, err = client.RbacV1beta1().RoleBindings("kube-system").Create(&rbacv1beta1.RoleBinding{ + ObjectMeta: metav1.ObjectMeta{ + Name: "wardler-auth-reader", + Annotations: map[string]string{ + rbacv1beta1.AutoUpdateAnnotationKey: "true", + }, + }, + RoleRef: rbacv1beta1.RoleRef{ + APIGroup: "", + Kind: "Role", + Name: "extension-apiserver-authentication-reader", + }, + Subjects: []rbacv1beta1.Subject{ + { + Kind: "ServiceAccount", + Name: "default", // "sample-apiserver", + Namespace: namespace, + }, + }, + }) + framework.ExpectNoError(err, "creating role binding %s:sample-apiserver to access configMap", namespace) + + // kubectl create -f apiservice.yaml + _, err = aggrclient.ApiregistrationV1beta1().APIServices().Create(&apiregistrationv1beta1.APIService{ + ObjectMeta: metav1.ObjectMeta{Name: "v1alpha1.wardle.k8s.io"}, + Spec: apiregistrationv1beta1.APIServiceSpec{ + Service: &apiregistrationv1beta1.ServiceReference{ + Namespace: namespace, + Name: "sample-api", + }, + Group: "wardle.k8s.io", + Version: "v1alpha1", + CABundle: context.apiserverSigningCert, + GroupPriorityMinimum: 2000, + VersionPriority: 200, + }, + }) + framework.ExpectNoError(err, "creating apiservice %s with namespace %s", "v1alpha1.wardle.k8s.io", namespace) + + // Wait for the extension apiserver to be up and healthy + // kubectl get deployments -n sample-system && status == Running + err = framework.WaitForDeploymentStatusValid(client, deployment) + + // We seem to need to do additional waiting until the extension api service is actually up. + err = wait.Poll(100*time.Millisecond, 30*time.Second, func() (bool, error) { + request := client.Discovery().RESTClient().Get().AbsPath("/apis/wardle.k8s.io/v1alpha1/namespaces/default/flunders") + request.SetHeader("Accept", "application/json") + _, err := request.DoRaw() + if err != nil { + status, ok := err.(*apierrs.StatusError) + if !ok { + return false, err + } + if status.Status().Code == 404 && strings.HasPrefix(err.Error(), "the server could not find the requested resource") { + return false, nil + } + return false, err + } + return true, nil + }) + framework.ExpectNoError(err, "gave up waiting for apiservice wardle to come up successfully") + + // kubectl create -f flunders-1.yaml -v 9 + // curl -k -v -XPOST https://localhost/apis/wardle.k8s.io/v1alpha1/namespaces/default/flunders + // Request Body: {"apiVersion":"wardle.k8s.io/v1alpha1","kind":"Flunder","metadata":{"labels":{"sample-label":"true"},"name":"test-flunder","namespace":"default"}} + flunder := `{"apiVersion":"wardle.k8s.io/v1alpha1","kind":"Flunder","metadata":{"labels":{"sample-label":"true"},"name":"test-flunder","namespace":"default"}}` + result := client.Discovery().RESTClient().Post().AbsPath("/apis/wardle.k8s.io/v1alpha1/namespaces/default/flunders").Body([]byte(flunder)).Do() + framework.ExpectNoError(result.Error(), "creating a new flunders resource") + var statusCode int + result.StatusCode(&statusCode) + if statusCode != 201 { + framework.Failf("Flunders client creation response was status %d, not 201", statusCode) + } + + // kubectl get flunders -v 9 + // curl -k -v -XGET https://localhost/apis/wardle.k8s.io/v1alpha1/namespaces/default/flunders + contents, err := client.Discovery().RESTClient().Get().AbsPath("/apis/wardle.k8s.io/v1alpha1/namespaces/default/flunders").SetHeader("Accept", "application/json").DoRaw() + framework.ExpectNoError(err, "attempting to get a newly created flunders resource") + var flundersList samplev1alpha1.FlunderList + err = json.Unmarshal(contents, &flundersList) + framework.ExpectNoError(err, "Error in unmarshalling %T response from server %s", contents, "/apis/wardle.k8s.io/v1alpha1") + if len(flundersList.Items) != 1 { + framework.Failf("failed to get back the correct flunders list %v", flundersList) + } + + // kubectl delete flunder test-flunder -v 9 + // curl -k -v -XDELETE https://35.193.112.40/apis/wardle.k8s.io/v1alpha1/namespaces/default/flunders/test-flunder + _, err = client.Discovery().RESTClient().Delete().AbsPath("/apis/wardle.k8s.io/v1alpha1/namespaces/default/flunders/test-flunder").DoRaw() + framework.ExpectNoError(err, "attempting to delete a newly created flunders resource") + + // kubectl get flunders -v 9 + // curl -k -v -XGET https://localhost/apis/wardle.k8s.io/v1alpha1/namespaces/default/flunders + contents, err = client.Discovery().RESTClient().Get().AbsPath("/apis/wardle.k8s.io/v1alpha1/namespaces/default/flunders").SetHeader("Accept", "application/json").DoRaw() + framework.ExpectNoError(err, "confirming delete of a newly created flunders resource") + err = json.Unmarshal(contents, &flundersList) + framework.ExpectNoError(err, "Error in unmarshalling %T response from server %s", contents, "/apis/wardle.k8s.io/v1alpha1") + if len(flundersList.Items) != 0 { + framework.Failf("failed to get back the correct deleted flunders list %v", flundersList) + } + + // Rerun the Create/List/Delete tests using the Dynamic client. + resources, err := client.Discovery().ServerPreferredNamespacedResources() + framework.ExpectNoError(err, "getting server preferred namespaces resources for dynamic client") + groupVersionResources, err := discovery.GroupVersionResources(resources) + framework.ExpectNoError(err, "getting group version resources for dynamic client") + gvr := schema.GroupVersionResource{Group: "wardle.k8s.io", Version: "v1alpha1", Resource: "flunders"} + _, ok := groupVersionResources[gvr] + if !ok { + framework.Failf("could not find group version resource for dynamic client and wardle/flunders.") + } + clientPool := f.ClientPool + dynamicClient, err := clientPool.ClientForGroupVersionResource(gvr) + framework.ExpectNoError(err, "getting group version resources for dynamic client") + apiResource := metav1.APIResource{Name: gvr.Resource, Namespaced: true} + + // kubectl create -f flunders-1.yaml + // Request Body: {"apiVersion":"wardle.k8s.io/v1alpha1","kind":"Flunder","metadata":{"labels":{"sample-label":"true"},"name":"test-flunder","namespace":"default"}} + testFlunder := samplev1alpha1.Flunder{ + TypeMeta: metav1.TypeMeta{ + Kind: "Flunder", + APIVersion: "wardle.k8s.io/v1alpha1", + }, + ObjectMeta: metav1.ObjectMeta{Name: "test-flunder"}, + Spec: samplev1alpha1.FlunderSpec{}, + } + jsonFlunder, err := json.Marshal(testFlunder) + framework.ExpectNoError(err, "marshalling test-flunder for create using dynamic client") + unstruct := &unstructuredv1.Unstructured{} + err = unstruct.UnmarshalJSON(jsonFlunder) + framework.ExpectNoError(err, "unmarshalling test-flunder as unstructured for create using dynamic client") + unstruct, err = dynamicClient.Resource(&apiResource, namespace).Create(unstruct) + framework.ExpectNoError(err, "listing flunders using dynamic client") + + // kubectl get flunders + obj, err := dynamicClient.Resource(&apiResource, namespace).List(metav1.ListOptions{}) + framework.ExpectNoError(err, "listing flunders using dynamic client") + unstructuredList, ok := obj.(*unstructuredv1.UnstructuredList) + framework.ExpectNoError(err, "casting flunders list(%T) as unstructuredList using dynamic client", obj) + if len(unstructuredList.Items) != 1 { + framework.Failf("failed to get back the correct flunders list %v from the dynamic client", unstructuredList) + } + + // kubectl delete flunder test-flunder + err = dynamicClient.Resource(&apiResource, namespace).Delete("test-flunder", &metav1.DeleteOptions{}) + framework.ExpectNoError(err, "deleting flunders using dynamic client") + + // kubectl get flunders + obj, err = dynamicClient.Resource(&apiResource, namespace).List(metav1.ListOptions{}) + framework.ExpectNoError(err, "listing flunders using dynamic client") + unstructuredList, ok = obj.(*unstructuredv1.UnstructuredList) + framework.ExpectNoError(err, "casting flunders list(%T) as unstructuredList using dynamic client", obj) + if len(unstructuredList.Items) != 0 { + framework.Failf("failed to get back the correct deleted flunders list %v from the dynamic client", unstructuredList) + } + + cleanTest(f, true) +} diff --git a/test/e2e/framework/BUILD b/test/e2e/framework/BUILD index 2469f92a0547e..65f0265c96391 100644 --- a/test/e2e/framework/BUILD +++ b/test/e2e/framework/BUILD @@ -135,6 +135,7 @@ go_library( "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", "//vendor/k8s.io/client-go/tools/remotecommand:go_default_library", "//vendor/k8s.io/client-go/util/retry:go_default_library", + "//vendor/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/test/e2e/framework/framework.go b/test/e2e/framework/framework.go index f17d7d31b0970..891082e6a4f6f 100644 --- a/test/e2e/framework/framework.go +++ b/test/e2e/framework/framework.go @@ -43,6 +43,7 @@ import ( clientreporestclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" + aggregatorclient "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/kubemark" @@ -71,6 +72,7 @@ type Framework struct { InternalClientset *internalclientset.Clientset StagingClient *staging.Clientset + AggregatorClient *aggregatorclient.Clientset ClientPool dynamic.ClientPool SkipNamespaceCreation bool // Whether to skip creating a namespace @@ -195,6 +197,8 @@ func (f *Framework) BeforeEach() { Expect(err).NotTo(HaveOccurred()) f.InternalClientset, err = internalclientset.NewForConfig(config) Expect(err).NotTo(HaveOccurred()) + f.AggregatorClient, err = aggregatorclient.NewForConfig(config) + Expect(err).NotTo(HaveOccurred()) clientRepoConfig := getClientRepoConfig(config) f.StagingClient, err = staging.NewForConfig(clientRepoConfig) Expect(err).NotTo(HaveOccurred()) diff --git a/test/utils/deployment.go b/test/utils/deployment.go index 464ccebd2001a..abcff858d975d 100644 --- a/test/utils/deployment.go +++ b/test/utils/deployment.go @@ -175,8 +175,8 @@ func WaitForDeploymentRevisionAndImage(c clientset.Interface, ns, deploymentName logf(reason) return false, nil } - if deployment.Spec.Template.Spec.Containers[0].Image != image { - reason = fmt.Sprintf("Deployment %q doesn't have the required image set", deployment.Name) + if !containsImage(deployment.Spec.Template.Spec.Containers, image) { + reason = fmt.Sprintf("Deployment %q doesn't have the required image %s set", deployment.Name, image) logf(reason) return false, nil } @@ -185,8 +185,8 @@ func WaitForDeploymentRevisionAndImage(c clientset.Interface, ns, deploymentName logf(reason) return false, nil } - if newRS.Spec.Template.Spec.Containers[0].Image != image { - reason = fmt.Sprintf("New replica set %q doesn't have the required image set", newRS.Name) + if !containsImage(newRS.Spec.Template.Spec.Containers, image) { + reason = fmt.Sprintf("New replica set %q doesn't have the required image %s.", newRS.Name, image) logf(reason) return false, nil } @@ -204,3 +204,12 @@ func WaitForDeploymentRevisionAndImage(c clientset.Interface, ns, deploymentName } return nil } + +func containsImage(containers []v1.Container, imageName string) bool { + for _, container := range containers { + if container.Image == imageName { + return true + } + } + return false +} From 3390bc3cbcd83fcf4aefc5fbf58ef0e9143ed990 Mon Sep 17 00:00:00 2001 From: Daneyon Hansen Date: Wed, 28 Jun 2017 10:20:13 -0700 Subject: [PATCH 082/403] Updates Kubeadm Master Endpoint for IPv6 Previously, kubeadm would use : to construct a master endpoint. This works fine for IPv4 addresses, but not for IPv6. IPv6 requires the ip to be encased in brackets when being joined to a port with a colon. This patch updates kubeadm to support wrapping a v6 address with [] to form the master endpoint url. Since this functionality is needed in multiple areas, a dedicated util function was created. Fixes: https://github.com/kubernetes/kubernetes/issues/48227 --- cmd/kubeadm/app/apis/kubeadm/types.go | 5 - cmd/kubeadm/app/apis/kubeadm/validation/BUILD | 1 + .../app/apis/kubeadm/validation/validation.go | 12 + .../kubeadm/validation/validation_test.go | 85 +++++++ cmd/kubeadm/app/cmd/init.go | 9 +- cmd/kubeadm/app/phases/addons/proxy/proxy.go | 9 +- cmd/kubeadm/app/phases/kubeconfig/BUILD | 2 + .../app/phases/kubeconfig/kubeconfig.go | 28 ++- .../app/phases/kubeconfig/kubeconfig_test.go | 9 +- cmd/kubeadm/app/util/BUILD | 8 +- cmd/kubeadm/app/util/endpoint.go | 51 ++++ cmd/kubeadm/app/util/endpoint_test.go | 223 ++++++++++++++++++ 12 files changed, 422 insertions(+), 20 deletions(-) create mode 100644 cmd/kubeadm/app/util/endpoint.go create mode 100644 cmd/kubeadm/app/util/endpoint_test.go diff --git a/cmd/kubeadm/app/apis/kubeadm/types.go b/cmd/kubeadm/app/apis/kubeadm/types.go index 93ad680334447..62010f10bea9e 100644 --- a/cmd/kubeadm/app/apis/kubeadm/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/types.go @@ -17,7 +17,6 @@ limitations under the License. package kubeadm import ( - "fmt" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -116,7 +115,3 @@ type NodeConfiguration struct { // the security of kubeadm since other nodes can impersonate the master. DiscoveryTokenUnsafeSkipCAVerification bool } - -func (cfg *MasterConfiguration) GetMasterEndpoint() string { - return fmt.Sprintf("https://%s:%d", cfg.API.AdvertiseAddress, cfg.API.BindPort) -} diff --git a/cmd/kubeadm/app/apis/kubeadm/validation/BUILD b/cmd/kubeadm/app/apis/kubeadm/validation/BUILD index c7412cc893841..5e5dbb152253c 100644 --- a/cmd/kubeadm/app/apis/kubeadm/validation/BUILD +++ b/cmd/kubeadm/app/apis/kubeadm/validation/BUILD @@ -24,6 +24,7 @@ go_library( "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/cmd/features:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", + "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/token:go_default_library", "//pkg/api/validation:go_default_library", "//pkg/kubeapiserver/authorizer/modes:go_default_library", diff --git a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go index dbdd252dccb9e..0bc24c57398c0 100644 --- a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go +++ b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go @@ -31,6 +31,7 @@ import ( "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/cmd/kubeadm/app/cmd/features" "k8s.io/kubernetes/cmd/kubeadm/app/constants" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" tokenutil "k8s.io/kubernetes/cmd/kubeadm/app/util/token" apivalidation "k8s.io/kubernetes/pkg/api/validation" authzmodes "k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes" @@ -68,6 +69,7 @@ func ValidateMasterConfiguration(c *kubeadm.MasterConfiguration) field.ErrorList allErrs = append(allErrs, ValidateNodeName(c.NodeName, field.NewPath("node-name"))...) allErrs = append(allErrs, ValidateToken(c.Token, field.NewPath("token"))...) allErrs = append(allErrs, ValidateFeatureFlags(c.FeatureFlags, field.NewPath("feature-flags"))...) + allErrs = append(allErrs, ValidateAPIEndpoint(c, field.NewPath("api-endpoint"))...) return allErrs } @@ -309,3 +311,13 @@ func ValidateFeatureFlags(featureFlags map[string]bool, fldPath *field.Path) fie return allErrs } + +func ValidateAPIEndpoint(c *kubeadm.MasterConfiguration, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + endpoint, err := kubeadmutil.GetMasterEndpoint(c) + if err != nil { + allErrs = append(allErrs, field.Invalid(fldPath, endpoint, "Invalid API Endpoint")) + } + return allErrs +} diff --git a/cmd/kubeadm/app/apis/kubeadm/validation/validation_test.go b/cmd/kubeadm/app/apis/kubeadm/validation/validation_test.go index e4fe08cf57cea..ad84a58a6461a 100644 --- a/cmd/kubeadm/app/apis/kubeadm/validation/validation_test.go +++ b/cmd/kubeadm/app/apis/kubeadm/validation/validation_test.go @@ -209,6 +209,71 @@ func TestValidateIPNetFromString(t *testing.T) { } } +func TestValidateAPIEndpoint(t *testing.T) { + var tests = []struct { + name string + s *kubeadm.MasterConfiguration + expected bool + }{ + { + name: "Missing configuration", + s: &kubeadm.MasterConfiguration{}, + expected: false, + }, + { + name: "Valid IPv4 address and default port", + s: &kubeadm.MasterConfiguration{ + API: kubeadm.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: 6443, + }, + }, + expected: true, + }, + { + name: "Valid IPv6 address and port", + s: &kubeadm.MasterConfiguration{ + API: kubeadm.API{ + AdvertiseAddress: "2001:db7::1", + BindPort: 3446, + }, + }, + expected: true, + }, + { + name: "Invalid IPv4 address", + s: &kubeadm.MasterConfiguration{ + API: kubeadm.API{ + AdvertiseAddress: "1.2.34", + BindPort: 6443, + }, + }, + expected: false, + }, + { + name: "Invalid IPv6 address", + s: &kubeadm.MasterConfiguration{ + API: kubeadm.API{ + AdvertiseAddress: "2001:db7:1", + BindPort: 3446, + }, + }, + expected: false, + }, + } + for _, rt := range tests { + actual := ValidateAPIEndpoint(rt.s, nil) + if (len(actual) == 0) != rt.expected { + t.Errorf( + "%s test case failed:\n\texpected: %t\n\t actual: %t", + rt.name, + rt.expected, + (len(actual) == 0), + ) + } + } +} + func TestValidateMasterConfiguration(t *testing.T) { nodename := "valid-nodename" var tests = []struct { @@ -220,6 +285,10 @@ func TestValidateMasterConfiguration(t *testing.T) { &kubeadm.MasterConfiguration{}, false}, {"invalid missing token with IPv4 service subnet", &kubeadm.MasterConfiguration{ + API: kubeadm.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: 6443, + }, AuthorizationModes: []string{"Node", "RBAC"}, Networking: kubeadm.Networking{ ServiceSubnet: "10.96.0.1/12", @@ -230,6 +299,10 @@ func TestValidateMasterConfiguration(t *testing.T) { }, false}, {"invalid missing token with IPv6 service subnet", &kubeadm.MasterConfiguration{ + API: kubeadm.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: 6443, + }, AuthorizationModes: []string{"Node", "RBAC"}, Networking: kubeadm.Networking{ ServiceSubnet: "2001:db8::1/98", @@ -240,6 +313,10 @@ func TestValidateMasterConfiguration(t *testing.T) { }, false}, {"invalid missing node name", &kubeadm.MasterConfiguration{ + API: kubeadm.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: 6443, + }, AuthorizationModes: []string{"Node", "RBAC"}, Networking: kubeadm.Networking{ ServiceSubnet: "10.96.0.1/12", @@ -250,6 +327,10 @@ func TestValidateMasterConfiguration(t *testing.T) { }, false}, {"valid master configuration with IPv4 service subnet", &kubeadm.MasterConfiguration{ + API: kubeadm.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: 6443, + }, AuthorizationModes: []string{"Node", "RBAC"}, Networking: kubeadm.Networking{ ServiceSubnet: "10.96.0.1/12", @@ -261,6 +342,10 @@ func TestValidateMasterConfiguration(t *testing.T) { }, true}, {"valid master configuration using IPv6 service subnet", &kubeadm.MasterConfiguration{ + API: kubeadm.API{ + AdvertiseAddress: "1:2:3::4", + BindPort: 3446, + }, AuthorizationModes: []string{"Node", "RBAC"}, Networking: kubeadm.Networking{ ServiceSubnet: "2001:db8::1/98", diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index 46d613b2e89af..f1f881273970a 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -20,7 +20,6 @@ import ( "fmt" "io" "io/ioutil" - "strconv" "text/template" "time" @@ -73,7 +72,7 @@ var ( You can now join any number of machines by running the following on each node as root: - kubeadm join --token {{.Token}} {{.MasterIP}}:{{.MasterPort}} --discovery-token-ca-cert-hash {{.CAPubKeyPin}} + kubeadm join --token {{.Token}} {{.MasterHostPort}} --discovery-token-ca-cert-hash {{.CAPubKeyPin}} `))) ) @@ -329,6 +328,9 @@ func (i *Init) Run(out io.Writer) error { // Load the CA certificate from so we can pin its public key caCert, err := pkiutil.TryLoadCertFromDisk(i.cfg.CertificatesDir, kubeadmconstants.CACertAndKeyBaseName) + + // Generate the Master host/port pair used by initDoneTempl + masterHostPort, err := kubeadmutil.GetMasterHostPort(i.cfg) if err != nil { return err } @@ -338,8 +340,7 @@ func (i *Init) Run(out io.Writer) error { "KubeConfigName": kubeadmconstants.AdminKubeConfigFileName, "Token": i.cfg.Token, "CAPubKeyPin": pubkeypin.Hash(caCert), - "MasterIP": i.cfg.API.AdvertiseAddress, - "MasterPort": strconv.Itoa(int(i.cfg.API.BindPort)), + "MasterHostPort": masterHostPort, } if i.skipTokenPrint { ctx["Token"] = "" diff --git a/cmd/kubeadm/app/phases/addons/proxy/proxy.go b/cmd/kubeadm/app/phases/addons/proxy/proxy.go index 51d53a37d4db9..3cab19681316d 100644 --- a/cmd/kubeadm/app/phases/addons/proxy/proxy.go +++ b/cmd/kubeadm/app/phases/addons/proxy/proxy.go @@ -49,10 +49,15 @@ func EnsureProxyAddon(cfg *kubeadmapi.MasterConfiguration, client clientset.Inte return fmt.Errorf("error when creating kube-proxy service account: %v", err) } + // Generate Master Enpoint kubeconfig file + masterEndpoint, err := kubeadmutil.GetMasterEndpoint(cfg) + if err != nil { + return err + } + proxyConfigMapBytes, err := kubeadmutil.ParseTemplate(KubeProxyConfigMap, struct{ MasterEndpoint string }{ // Fetch this value from the kubeconfig file - MasterEndpoint: fmt.Sprintf("https://%s:%d", cfg.API.AdvertiseAddress, cfg.API.BindPort), - }) + MasterEndpoint: masterEndpoint}) if err != nil { return fmt.Errorf("error when parsing kube-proxy configmap template: %v", err) } diff --git a/cmd/kubeadm/app/phases/kubeconfig/BUILD b/cmd/kubeadm/app/phases/kubeconfig/BUILD index 2ead488e93e70..d62577dd5b389 100644 --- a/cmd/kubeadm/app/phases/kubeconfig/BUILD +++ b/cmd/kubeadm/app/phases/kubeconfig/BUILD @@ -16,6 +16,7 @@ go_library( "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/phases/certs/pkiutil:go_default_library", + "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/kubeconfig:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", @@ -44,6 +45,7 @@ go_test( "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/phases/certs/pkiutil:go_default_library", + "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/test:go_default_library", "//cmd/kubeadm/test/certs:go_default_library", "//cmd/kubeadm/test/kubeconfig:go_default_library", diff --git a/cmd/kubeadm/app/phases/kubeconfig/kubeconfig.go b/cmd/kubeadm/app/phases/kubeconfig/kubeconfig.go index 667283b9258b8..1d1474417baeb 100644 --- a/cmd/kubeadm/app/phases/kubeconfig/kubeconfig.go +++ b/cmd/kubeadm/app/phases/kubeconfig/kubeconfig.go @@ -32,6 +32,7 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs/pkiutil" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" ) @@ -134,10 +135,15 @@ func getKubeConfigSpecs(cfg *kubeadmapi.MasterConfiguration) (map[string]*kubeCo return nil, fmt.Errorf("couldn't create a kubeconfig; the CA files couldn't be loaded: %v", err) } + masterEndpoint, err := kubeadmutil.GetMasterEndpoint(cfg) + if err != nil { + return nil, err + } + var kubeConfigSpec = map[string]*kubeConfigSpec{ kubeadmconstants.AdminKubeConfigFileName: { CACert: caCert, - APIServer: cfg.GetMasterEndpoint(), + APIServer: masterEndpoint, ClientName: "kubernetes-admin", ClientCertAuth: &clientCertAuth{ CAKey: caKey, @@ -146,7 +152,7 @@ func getKubeConfigSpecs(cfg *kubeadmapi.MasterConfiguration) (map[string]*kubeCo }, kubeadmconstants.KubeletKubeConfigFileName: { CACert: caCert, - APIServer: cfg.GetMasterEndpoint(), + APIServer: masterEndpoint, ClientName: fmt.Sprintf("system:node:%s", cfg.NodeName), ClientCertAuth: &clientCertAuth{ CAKey: caKey, @@ -155,7 +161,7 @@ func getKubeConfigSpecs(cfg *kubeadmapi.MasterConfiguration) (map[string]*kubeCo }, kubeadmconstants.ControllerManagerKubeConfigFileName: { CACert: caCert, - APIServer: cfg.GetMasterEndpoint(), + APIServer: masterEndpoint, ClientName: kubeadmconstants.ControllerManagerUser, ClientCertAuth: &clientCertAuth{ CAKey: caKey, @@ -163,7 +169,7 @@ func getKubeConfigSpecs(cfg *kubeadmapi.MasterConfiguration) (map[string]*kubeCo }, kubeadmconstants.SchedulerKubeConfigFileName: { CACert: caCert, - APIServer: cfg.GetMasterEndpoint(), + APIServer: masterEndpoint, ClientName: kubeadmconstants.SchedulerUser, ClientCertAuth: &clientCertAuth{ CAKey: caKey, @@ -266,9 +272,14 @@ func WriteKubeConfigWithClientCert(out io.Writer, cfg *kubeadmapi.MasterConfigur return fmt.Errorf("couldn't create a kubeconfig; the CA files couldn't be loaded: %v", err) } + masterEndpoint, err := kubeadmutil.GetMasterEndpoint(cfg) + if err != nil { + return err + } + spec := &kubeConfigSpec{ ClientName: clientName, - APIServer: cfg.GetMasterEndpoint(), + APIServer: masterEndpoint, CACert: caCert, ClientCertAuth: &clientCertAuth{ CAKey: caKey, @@ -287,9 +298,14 @@ func WriteKubeConfigWithToken(out io.Writer, cfg *kubeadmapi.MasterConfiguration return fmt.Errorf("couldn't create a kubeconfig; the CA files couldn't be loaded: %v", err) } + masterEndpoint, err := kubeadmutil.GetMasterEndpoint(cfg) + if err != nil { + return err + } + spec := &kubeConfigSpec{ ClientName: clientName, - APIServer: cfg.GetMasterEndpoint(), + APIServer: masterEndpoint, CACert: caCert, TokenAuth: &tokenAuth{ Token: token, diff --git a/cmd/kubeadm/app/phases/kubeconfig/kubeconfig_test.go b/cmd/kubeadm/app/phases/kubeconfig/kubeconfig_test.go index c2e376c248ed9..5290b2fb598a8 100644 --- a/cmd/kubeadm/app/phases/kubeconfig/kubeconfig_test.go +++ b/cmd/kubeadm/app/phases/kubeconfig/kubeconfig_test.go @@ -34,6 +34,7 @@ import ( pkiutil "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs/pkiutil" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" testutil "k8s.io/kubernetes/cmd/kubeadm/test" certstestutil "k8s.io/kubernetes/cmd/kubeadm/test/certs" kubeconfigtestutil "k8s.io/kubernetes/cmd/kubeadm/test/kubeconfig" @@ -117,8 +118,12 @@ func TestGetKubeConfigSpecs(t *testing.T) { } // Asserts MasterConfiguration values injected into spec - if spec.APIServer != cfg.GetMasterEndpoint() { - t.Errorf("getKubeConfigSpecs didn't injected cfg.APIServer address into spec for %s", assertion.kubeConfigFile) + masterEndpoint, err := kubeadmutil.GetMasterEndpoint(cfg) + if err != nil { + t.Error(err) + } + if spec.APIServer != masterEndpoint { + t.Errorf("getKubeConfigSpecs didn't injected cfg.APIServer endpoint into spec for %s", assertion.kubeConfigFile) } // Asserts CA certs and CA keys loaded into specs diff --git a/cmd/kubeadm/app/util/BUILD b/cmd/kubeadm/app/util/BUILD index e06553c7893aa..b762a5d1fb25a 100644 --- a/cmd/kubeadm/app/util/BUILD +++ b/cmd/kubeadm/app/util/BUILD @@ -9,11 +9,13 @@ load( go_library( name = "go_default_library", srcs = [ + "endpoint.go", "error.go", "template.go", "version.go", ], deps = [ + "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/preflight:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", ], @@ -22,12 +24,16 @@ go_library( go_test( name = "go_default_test", srcs = [ + "endpoint_test.go", "error_test.go", "template_test.go", "version_test.go", ], library = ":go_default_library", - deps = ["//cmd/kubeadm/app/preflight:go_default_library"], + deps = [ + "//cmd/kubeadm/app/apis/kubeadm:go_default_library", + "//cmd/kubeadm/app/preflight:go_default_library", + ], ) filegroup( diff --git a/cmd/kubeadm/app/util/endpoint.go b/cmd/kubeadm/app/util/endpoint.go new file mode 100644 index 0000000000000..d3e32dbeceaaa --- /dev/null +++ b/cmd/kubeadm/app/util/endpoint.go @@ -0,0 +1,51 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "fmt" + "net" + "strconv" + + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" +) + +// GetMasterEndpoint returns a properly formatted Master Endpoint +// or passes the error from GetMasterHostPort. +func GetMasterEndpoint(cfg *kubeadmapi.MasterConfiguration) (string, error) { + hostPort, err := GetMasterHostPort(cfg) + if err != nil { + return "", err + } + return fmt.Sprintf("https://%s", hostPort), nil +} + +// GetMasterHostPort returns a properly formatted Master IP/port pair or error +// if the IP address can not be parsed or port is outside the valid TCP range. +func GetMasterHostPort(cfg *kubeadmapi.MasterConfiguration) (string, error) { + masterIP := net.ParseIP(cfg.API.AdvertiseAddress) + if masterIP == nil { + return "", fmt.Errorf("error parsing address %s", cfg.API.AdvertiseAddress) + } + + if cfg.API.BindPort < 0 || cfg.API.BindPort > 65535 { + return "", fmt.Errorf("api server port must be between 0 and 65535") + } + + hostPort := net.JoinHostPort(masterIP.String(), strconv.Itoa(int(cfg.API.BindPort))) + return hostPort, nil +} diff --git a/cmd/kubeadm/app/util/endpoint_test.go b/cmd/kubeadm/app/util/endpoint_test.go new file mode 100644 index 0000000000000..f5bef19dbb5e4 --- /dev/null +++ b/cmd/kubeadm/app/util/endpoint_test.go @@ -0,0 +1,223 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "testing" + + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" +) + +func TestGetMasterEndpoint(t *testing.T) { + var tests = []struct { + name string + cfg *kubeadmapi.MasterConfiguration + endpoint string + expected bool + }{ + { + name: "valid IPv4 endpoint", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: 1234, + }, + }, + endpoint: "https://1.2.3.4:1234", + expected: true, + }, + { + name: "valid IPv6 endpoint", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "2001:db8::1", + BindPort: 4321, + }, + }, + endpoint: "https://[2001:db8::1]:4321", + expected: true, + }, + { + name: "invalid IPv4 endpoint", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: 1234, + }, + }, + endpoint: "https://[1.2.3.4]:1234", + expected: false, + }, + { + name: "invalid IPv6 endpoint", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "2001:db8::1", + BindPort: 4321, + }, + }, + endpoint: "https://2001:db8::1:4321", + expected: false, + }, + { + name: "invalid IPv4 AdvertiseAddress", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "1.2.34", + BindPort: 1234, + }, + }, + endpoint: "https://1.2.3.4:1234", + expected: false, + }, + { + name: "invalid IPv6 AdvertiseAddress", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "2001::db8::1", + BindPort: 4321, + }, + }, + endpoint: "https://[2001:db8::1]:4321", + expected: false, + }, + } + for _, rt := range tests { + actual, err := GetMasterEndpoint(rt.cfg) + if err != nil && rt.expected { + t.Error(err) + } + if actual != rt.endpoint && rt.expected { + t.Errorf( + "%s test case failed:\n\texpected: %s\n\t actual: %s", + rt.name, + rt.endpoint, + (actual), + ) + } + } +} + +func TestGetMasterHostPort(t *testing.T) { + var tests = []struct { + name string + cfg *kubeadmapi.MasterConfiguration + hostPort string + expected bool + }{ + { + name: "valid IPv4 master host and port", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: 1234, + }, + }, + hostPort: "1.2.3.4:1234", + expected: true, + }, + { + name: "valid IPv6 master host port", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "2001:db8::1", + BindPort: 4321, + }, + }, + hostPort: "[2001:db8::1]:4321", + expected: true, + }, + { + name: "invalid IPv4 address", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "1.2.34", + BindPort: 1234, + }, + }, + hostPort: "1.2.3.4:1234", + expected: false, + }, + { + name: "invalid IPv6 address", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "2001::db8::1", + BindPort: 4321, + }, + }, + hostPort: "[2001:db8::1]:4321", + expected: false, + }, + { + name: "invalid TCP port number", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: 987654321, + }, + }, + hostPort: "1.2.3.4:987654321", + expected: false, + }, + { + name: "invalid negative TCP port number", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "1.2.3.4", + BindPort: -987654321, + }, + }, + hostPort: "1.2.3.4:-987654321", + expected: false, + }, + { + name: "unspecified IPv4 TCP port", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "1.2.3.4", + }, + }, + hostPort: "1.2.3.4:0", + expected: true, + }, + { + name: "unspecified IPv6 TCP port", + cfg: &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{ + AdvertiseAddress: "1:2:3::4", + }, + }, + hostPort: "[1:2:3::4]:0", + expected: true, + }, + } + for _, rt := range tests { + actual, err := GetMasterHostPort(rt.cfg) + if err != nil && rt.expected { + t.Error(err) + } + if actual != rt.hostPort && rt.expected { + t.Errorf( + "%s test case failed:\n\texpected: %s\n\t actual: %s", + rt.name, + rt.hostPort, + (actual), + ) + } + } +} From 92415f7dd72caf337ab4753b0d0878efbe8b4f88 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Thu, 17 Aug 2017 11:37:51 -0700 Subject: [PATCH 083/403] Proposal to add @wlan0 to appropriate owner files --- cmd/cloud-controller-manager/OWNERS | 8 ++++++++ pkg/cloudprovider/OWNERS | 1 + pkg/controller/cloud/OWNERS | 8 ++++++++ 3 files changed, 17 insertions(+) create mode 100644 cmd/cloud-controller-manager/OWNERS create mode 100644 pkg/controller/cloud/OWNERS diff --git a/cmd/cloud-controller-manager/OWNERS b/cmd/cloud-controller-manager/OWNERS new file mode 100644 index 0000000000000..5a58eee8cea76 --- /dev/null +++ b/cmd/cloud-controller-manager/OWNERS @@ -0,0 +1,8 @@ +approvers: +- thockin +- luxas +- wlan0 +reviewers: +- thockin +- luxas +- wlan0 diff --git a/pkg/cloudprovider/OWNERS b/pkg/cloudprovider/OWNERS index 5abbe51cb2c03..249a4a546b174 100644 --- a/pkg/cloudprovider/OWNERS +++ b/pkg/cloudprovider/OWNERS @@ -38,3 +38,4 @@ reviewers: - jdef - freehan - jingxu97 +- wlan0 diff --git a/pkg/controller/cloud/OWNERS b/pkg/controller/cloud/OWNERS new file mode 100644 index 0000000000000..5a58eee8cea76 --- /dev/null +++ b/pkg/controller/cloud/OWNERS @@ -0,0 +1,8 @@ +approvers: +- thockin +- luxas +- wlan0 +reviewers: +- thockin +- luxas +- wlan0 From 0b1d5488796f07b03b9ae9c60ef488d84fabe0ad Mon Sep 17 00:00:00 2001 From: Shyam Jeedigunta Date: Thu, 17 Aug 2017 20:13:34 +0200 Subject: [PATCH 084/403] Make route-controller list only relevant routes instead of all of them --- pkg/cloudprovider/providers/gce/gce_routes.go | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/pkg/cloudprovider/providers/gce/gce_routes.go b/pkg/cloudprovider/providers/gce/gce_routes.go index c5d3a37c24592..1e0d82661b530 100644 --- a/pkg/cloudprovider/providers/gce/gce_routes.go +++ b/pkg/cloudprovider/providers/gce/gce_routes.go @@ -20,7 +20,6 @@ import ( "fmt" "net/http" "path" - "strings" "time" "k8s.io/apimachinery/pkg/types" @@ -46,7 +45,12 @@ func (gce *GCECloud) ListRoutes(clusterName string) ([]*cloudprovider.Route, err listCall := gce.service.Routes.List(gce.projectID) prefix := truncateClusterName(clusterName) - listCall = listCall.Filter("name eq " + prefix + "-.*") + // Filter for routes starting with clustername AND belonging to the + // relevant gcp network AND having description = "k8s-node-route". + filter := "(name eq " + prefix + "-.*) " + filter = filter + "(network eq " + gce.networkURL + ") " + filter = filter + "(description eq " + k8sNodeRouteTag + ")" + listCall = listCall.Filter(filter) if pageToken != "" { listCall = listCall.PageToken(pageToken) } @@ -58,18 +62,6 @@ func (gce *GCECloud) ListRoutes(clusterName string) ([]*cloudprovider.Route, err } pageToken = res.NextPageToken for _, r := range res.Items { - if r.Network != gce.networkURL { - continue - } - // Not managed if route description != "k8s-node-route" - if r.Description != k8sNodeRouteTag { - continue - } - // Not managed if route name doesn't start with - if !strings.HasPrefix(r.Name, prefix) { - continue - } - target := path.Base(r.NextHopInstance) // TODO: Should we lastComponent(target) this? targetNodeName := types.NodeName(target) // NodeName == Instance Name on GCE From 32c5d938eb8cdaf1d404210441d6e3ba9cc89904 Mon Sep 17 00:00:00 2001 From: Phillip Wittrock Date: Thu, 17 Aug 2017 11:48:18 -0700 Subject: [PATCH 085/403] Update with PR comments --- pkg/kubectl/apps/apps_suite_test.go | 4 ++-- pkg/kubectl/apps/kind_visitor_test.go | 21 ++------------------- pkg/kubectl/cmd/util/factory.go | 2 +- 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/pkg/kubectl/apps/apps_suite_test.go b/pkg/kubectl/apps/apps_suite_test.go index a2300f1e445fb..b1bc1310ea036 100644 --- a/pkg/kubectl/apps/apps_suite_test.go +++ b/pkg/kubectl/apps/apps_suite_test.go @@ -17,10 +17,10 @@ limitations under the License. package apps_test import ( + "testing" + . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - - "testing" ) func TestApps(t *testing.T) { diff --git a/pkg/kubectl/apps/kind_visitor_test.go b/pkg/kubectl/apps/kind_visitor_test.go index 7d392b0491059..c5c2d1a631c50 100644 --- a/pkg/kubectl/apps/kind_visitor_test.go +++ b/pkg/kubectl/apps/kind_visitor_test.go @@ -74,21 +74,13 @@ var _ = Describe("When KindVisitor accepts a GroupKind", func() { It("should Visit Job iff the Kind is a Job", func() { kind := apps.GroupKindElement{ Kind: "Job", - Group: "apps", + Group: "batch", } Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) Expect(visitor.visits).To(Equal(map[string]int{ "Job": 1, })) - kind = apps.GroupKindElement{ - Kind: "Job", - Group: "extensions", - } - Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) - Expect(visitor.visits).To(Equal(map[string]int{ - "Job": 2, - })) }) It("should Visit Pod iff the Kind is a Pod", func() { @@ -133,21 +125,12 @@ var _ = Describe("When KindVisitor accepts a GroupKind", func() { It("should Visit ReplicaSet iff the Kind is a ReplicaSet", func() { kind := apps.GroupKindElement{ - Kind: "ReplicaSet", - Group: "apps", - } - Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) - Expect(visitor.visits).To(Equal(map[string]int{ - "ReplicaSet": 1, - })) - - kind = apps.GroupKindElement{ Kind: "ReplicaSet", Group: "extensions", } Expect(kind.Accept(visitor)).ShouldNot(HaveOccurred()) Expect(visitor.visits).To(Equal(map[string]int{ - "ReplicaSet": 2, + "ReplicaSet": 1, })) }) diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 6ce8f6d7098a3..40a879bd884ef 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -93,7 +93,7 @@ type ClientAccessFactory interface { // ClientSet gives you back an internal, generated clientset ClientSet() (internalclientset.Interface, error) - // KubernetesClientSetForVersion gives you back an external clientset + // KubernetesClientSet gives you back an external clientset KubernetesClientSet() (*kubernetes.Clientset, error) // Returns a RESTClient for accessing Kubernetes resources or an error. From bf6155b08c9b17c905c3da3915b149a647918f91 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Wed, 9 Aug 2017 14:51:39 -0700 Subject: [PATCH 086/403] make admission plugins handle mutating spec of uninitialized pods --- pkg/kubeapiserver/admission/BUILD | 1 + pkg/kubeapiserver/admission/util/BUILD | 31 +++++++++ .../admission/util/initializer.go | 56 ++++++++++++++++ plugin/pkg/admission/podnodeselector/BUILD | 1 + .../admission/podnodeselector/admission.go | 14 +++- .../podnodeselector/admission_test.go | 52 ++++++++++++++- .../admission/podtolerationrestriction/BUILD | 1 + .../podtolerationrestriction/admission.go | 7 +- .../admission_test.go | 66 +++++++++++++++++++ plugin/pkg/admission/serviceaccount/BUILD | 1 + .../pkg/admission/serviceaccount/admission.go | 12 +++- .../serviceaccount/admission_test.go | 62 ++++++++++++++++- 12 files changed, 298 insertions(+), 6 deletions(-) create mode 100644 pkg/kubeapiserver/admission/util/BUILD create mode 100644 pkg/kubeapiserver/admission/util/initializer.go diff --git a/pkg/kubeapiserver/admission/BUILD b/pkg/kubeapiserver/admission/BUILD index c1a833dcd13ae..95a3eb4c30655 100644 --- a/pkg/kubeapiserver/admission/BUILD +++ b/pkg/kubeapiserver/admission/BUILD @@ -42,6 +42,7 @@ filegroup( srcs = [ ":package-srcs", "//pkg/kubeapiserver/admission/configuration:all-srcs", + "//pkg/kubeapiserver/admission/util:all-srcs", ], tags = ["automanaged"], ) diff --git a/pkg/kubeapiserver/admission/util/BUILD b/pkg/kubeapiserver/admission/util/BUILD new file mode 100644 index 0000000000000..401e3a39a58b5 --- /dev/null +++ b/pkg/kubeapiserver/admission/util/BUILD @@ -0,0 +1,31 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["initializer.go"], + tags = ["automanaged"], + deps = [ + "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/kubeapiserver/admission/util/initializer.go b/pkg/kubeapiserver/admission/util/initializer.go new file mode 100644 index 0000000000000..165c4ee9ba86d --- /dev/null +++ b/pkg/kubeapiserver/admission/util/initializer.go @@ -0,0 +1,56 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apiserver/pkg/admission" +) + +// IsUpdatingInitializedObject returns if the operation is trying to update an +// already initialized object. +func IsUpdatingInitializedObject(a admission.Attributes) (bool, error) { + if a.GetOperation() != admission.Update { + return false, nil + } + oldObj := a.GetOldObject() + accessor, err := meta.Accessor(oldObj) + if err != nil { + return false, err + } + if accessor.GetInitializers() == nil { + return true, nil + } + return false, nil +} + +// IsUpdatingUninitializedObject returns if the operation is trying to update an +// object that is not initialized yet. +func IsUpdatingUninitializedObject(a admission.Attributes) (bool, error) { + if a.GetOperation() != admission.Update { + return false, nil + } + oldObj := a.GetOldObject() + accessor, err := meta.Accessor(oldObj) + if err != nil { + return false, err + } + if accessor.GetInitializers() == nil { + return false, nil + } + return true, nil +} diff --git a/plugin/pkg/admission/podnodeselector/BUILD b/plugin/pkg/admission/podnodeselector/BUILD index e89110ebb087a..3d589c9332d22 100644 --- a/plugin/pkg/admission/podnodeselector/BUILD +++ b/plugin/pkg/admission/podnodeselector/BUILD @@ -15,6 +15,7 @@ go_library( "//pkg/client/informers/informers_generated/internalversion:go_default_library", "//pkg/client/listers/core/internalversion:go_default_library", "//pkg/kubeapiserver/admission:go_default_library", + "//pkg/kubeapiserver/admission/util:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/plugin/pkg/admission/podnodeselector/admission.go b/plugin/pkg/admission/podnodeselector/admission.go index 8e00f0b825d9a..469286f1e9b6a 100644 --- a/plugin/pkg/admission/podnodeselector/admission.go +++ b/plugin/pkg/admission/podnodeselector/admission.go @@ -33,6 +33,7 @@ import ( informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion" corelisters "k8s.io/kubernetes/pkg/client/listers/core/internalversion" kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission" + "k8s.io/kubernetes/pkg/kubeapiserver/admission/util" ) // The annotation key scheduler.alpha.kubernetes.io/node-selector is for assigning @@ -112,11 +113,20 @@ func (p *podNodeSelector) Admit(a admission.Attributes) error { return admission.NewForbidden(a, fmt.Errorf("not yet ready to handle request")) } + updateInitialized, err := util.IsUpdatingInitializedObject(a) + if err != nil { + return err + } + if updateInitialized { + // node selector of an initialized pod is immutable + return nil + } + name := pod.Name nsName := a.GetNamespace() var namespace *api.Namespace - namespace, err := p.namespaceLister.Get(nsName) + namespace, err = p.namespaceLister.Get(nsName) if errors.IsNotFound(err) { namespace, err = p.defaultGetNamespace(nsName) if err != nil { @@ -158,7 +168,7 @@ func (p *podNodeSelector) Admit(a admission.Attributes) error { func NewPodNodeSelector(clusterNodeSelectors map[string]string) *podNodeSelector { return &podNodeSelector{ - Handler: admission.NewHandler(admission.Create), + Handler: admission.NewHandler(admission.Create, admission.Update), clusterNodeSelectors: clusterNodeSelectors, } } diff --git a/plugin/pkg/admission/podnodeselector/admission_test.go b/plugin/pkg/admission/podnodeselector/admission_test.go index f5bc4ac969e2d..0075468a89a28 100644 --- a/plugin/pkg/admission/podnodeselector/admission_test.go +++ b/plugin/pkg/admission/podnodeselector/admission_test.go @@ -52,6 +52,12 @@ func TestPodAdmission(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "testPod", Namespace: "testNamespace"}, } + oldPod := *pod + oldPod.Initializers = &metav1.Initializers{Pending: []metav1.Initializer{{Name: "init"}}} + oldPod.Spec.NodeSelector = map[string]string{ + "old": "true", + } + tests := []struct { defaultNodeSelector string namespaceNodeSelector string @@ -166,7 +172,17 @@ func TestPodAdmission(t *testing.T) { } else if !test.admit && err == nil { t.Errorf("Test: %s, expected an error", test.testName) } + if test.admit && !labels.Equals(test.mergedNodeSelector, labels.Set(pod.Spec.NodeSelector)) { + t.Errorf("Test: %s, expected: %s but got: %s", test.testName, test.mergedNodeSelector, pod.Spec.NodeSelector) + } + // handles update of uninitialized pod like it's newly created. + err = handler.Admit(admission.NewAttributesRecord(pod, &oldPod, api.Kind("Pod").WithVersion("version"), "testNamespace", namespace.ObjectMeta.Name, api.Resource("pods").WithVersion("version"), "", admission.Update, nil)) + if test.admit && err != nil { + t.Errorf("Test: %s, expected no error but got: %s", test.testName, err) + } else if !test.admit && err == nil { + t.Errorf("Test: %s, expected an error", test.testName) + } if test.admit && !labels.Equals(test.mergedNodeSelector, labels.Set(pod.Spec.NodeSelector)) { t.Errorf("Test: %s, expected: %s but got: %s", test.testName, test.mergedNodeSelector, pod.Spec.NodeSelector) } @@ -176,7 +192,7 @@ func TestPodAdmission(t *testing.T) { func TestHandles(t *testing.T) { for op, shouldHandle := range map[admission.Operation]bool{ admission.Create: true, - admission.Update: false, + admission.Update: true, admission.Connect: false, admission.Delete: false, } { @@ -187,6 +203,40 @@ func TestHandles(t *testing.T) { } } +func TestIgnoreUpdatingInitializedPod(t *testing.T) { + mockClient := &fake.Clientset{} + handler, informerFactory, err := newHandlerForTest(mockClient) + if err != nil { + t.Errorf("unexpected error initializing handler: %v", err) + } + handler.SetReadyFunc(func() bool { return true }) + + podNodeSelector := map[string]string{"infra": "false"} + pod := &api.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: "testPod", Namespace: "testNamespace"}, + Spec: api.PodSpec{NodeSelector: podNodeSelector}, + } + // this conflicts with podNodeSelector + namespaceNodeSelector := "infra=true" + namespace := &api.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testNamespace", + Namespace: "", + Annotations: map[string]string{"scheduler.alpha.kubernetes.io/node-selector": namespaceNodeSelector}, + }, + } + err = informerFactory.Core().InternalVersion().Namespaces().Informer().GetStore().Update(namespace) + if err != nil { + t.Fatal(err) + } + + // if the update of initialized pod is not ignored, an error will be returned because the pod's nodeSelector conflicts with namespace's nodeSelector. + err = handler.Admit(admission.NewAttributesRecord(pod, pod, api.Kind("Pod").WithVersion("version"), "testNamespace", namespace.ObjectMeta.Name, api.Resource("pods").WithVersion("version"), "", admission.Update, nil)) + if err != nil { + t.Errorf("expected no error, got: %v", err) + } +} + // newHandlerForTest returns the admission controller configured for testing. func newHandlerForTest(c clientset.Interface) (*podNodeSelector, informers.SharedInformerFactory, error) { f := informers.NewSharedInformerFactory(c, 5*time.Minute) diff --git a/plugin/pkg/admission/podtolerationrestriction/BUILD b/plugin/pkg/admission/podtolerationrestriction/BUILD index f8df1e2786b64..929165c92bf30 100644 --- a/plugin/pkg/admission/podtolerationrestriction/BUILD +++ b/plugin/pkg/admission/podtolerationrestriction/BUILD @@ -40,6 +40,7 @@ go_library( "//pkg/client/informers/informers_generated/internalversion:go_default_library", "//pkg/client/listers/core/internalversion:go_default_library", "//pkg/kubeapiserver/admission:go_default_library", + "//pkg/kubeapiserver/admission/util:go_default_library", "//pkg/util/tolerations:go_default_library", "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction:go_default_library", "//plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction/install:go_default_library", diff --git a/plugin/pkg/admission/podtolerationrestriction/admission.go b/plugin/pkg/admission/podtolerationrestriction/admission.go index a71f92ba4a121..655a2e365a021 100644 --- a/plugin/pkg/admission/podtolerationrestriction/admission.go +++ b/plugin/pkg/admission/podtolerationrestriction/admission.go @@ -34,6 +34,7 @@ import ( informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion" corelisters "k8s.io/kubernetes/pkg/client/listers/core/internalversion" kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission" + "k8s.io/kubernetes/pkg/kubeapiserver/admission/util" "k8s.io/kubernetes/pkg/util/tolerations" pluginapi "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction/apis/podtolerationrestriction" "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm" @@ -112,7 +113,11 @@ func (p *podTolerationsPlugin) Admit(a admission.Attributes) error { } var finalTolerations []api.Toleration - if a.GetOperation() == admission.Create { + updateUninitialized, err := util.IsUpdatingUninitializedObject(a) + if err != nil { + return err + } + if a.GetOperation() == admission.Create || updateUninitialized { ts, err := p.getNamespaceDefaultTolerations(namespace) if err != nil { return err diff --git a/plugin/pkg/admission/podtolerationrestriction/admission_test.go b/plugin/pkg/admission/podtolerationrestriction/admission_test.go index 76faaa718949e..4673aa0692c8c 100644 --- a/plugin/pkg/admission/podtolerationrestriction/admission_test.go +++ b/plugin/pkg/admission/podtolerationrestriction/admission_test.go @@ -233,6 +233,11 @@ func TestPodAdmission(t *testing.T) { pod := test.pod pod.Spec.Tolerations = test.podTolerations + // copy the original pod for tests of uninitialized pod updates. + oldPod := *pod + oldPod.Initializers = &metav1.Initializers{Pending: []metav1.Initializer{{Name: "init"}}} + oldPod.Spec.Tolerations = []api.Toleration{{Key: "testKey", Operator: "Equal", Value: "testValue1", Effect: "NoSchedule", TolerationSeconds: nil}} + err := handler.Admit(admission.NewAttributesRecord(pod, nil, api.Kind("Pod").WithVersion("version"), "testNamespace", namespace.ObjectMeta.Name, api.Resource("pods").WithVersion("version"), "", admission.Create, nil)) if test.admit && err != nil { t.Errorf("Test: %s, expected no error but got: %s", test.testName, err) @@ -244,6 +249,19 @@ func TestPodAdmission(t *testing.T) { if test.admit && !tolerations.EqualTolerations(updatedPodTolerations, test.mergedTolerations) { t.Errorf("Test: %s, expected: %#v but got: %#v", test.testName, test.mergedTolerations, updatedPodTolerations) } + + // handles update of uninitialized pod like it's newly created. + err = handler.Admit(admission.NewAttributesRecord(pod, &oldPod, api.Kind("Pod").WithVersion("version"), "testNamespace", namespace.ObjectMeta.Name, api.Resource("pods").WithVersion("version"), "", admission.Update, nil)) + if test.admit && err != nil { + t.Errorf("Test: %s, expected no error but got: %s", test.testName, err) + } else if !test.admit && err == nil { + t.Errorf("Test: %s, expected an error", test.testName) + } + + updatedPodTolerations = pod.Spec.Tolerations + if test.admit && !tolerations.EqualTolerations(updatedPodTolerations, test.mergedTolerations) { + t.Errorf("Test: %s, expected: %#v but got: %#v", test.testName, test.mergedTolerations, updatedPodTolerations) + } } } @@ -267,6 +285,54 @@ func TestHandles(t *testing.T) { } } +func TestIgnoreUpdatingInitializedPod(t *testing.T) { + mockClient := &fake.Clientset{} + handler, informerFactory, err := newHandlerForTest(mockClient) + if err != nil { + t.Errorf("unexpected error initializing handler: %v", err) + } + handler.SetReadyFunc(func() bool { return true }) + + pod := &api.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: "testPod", Namespace: "testNamespace"}, + Spec: api.PodSpec{}, + } + podToleration := api.Toleration{ + Key: "testKey", + Operator: "Equal", + Value: "testValue1", + Effect: "NoSchedule", + TolerationSeconds: nil, + } + pod.Spec.Tolerations = []api.Toleration{podToleration} + + // this conflicts with pod's Tolerations + namespaceToleration := podToleration + namespaceToleration.Value = "testValue2" + namespaceTolerations := []api.Toleration{namespaceToleration} + tolerationsStr, err := json.Marshal(namespaceTolerations) + if err != nil { + t.Errorf("error in marshalling namespace tolerations %v", namespaceTolerations) + } + namespace := &api.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testNamespace", + Namespace: "", + }, + } + namespace.Annotations = map[string]string{NSDefaultTolerations: string(tolerationsStr)} + err = informerFactory.Core().InternalVersion().Namespaces().Informer().GetStore().Update(namespace) + if err != nil { + t.Fatal(err) + } + + // if the update of initialized pod is not ignored, an error will be returned because the pod's Tolerations conflicts with namespace's Tolerations. + err = handler.Admit(admission.NewAttributesRecord(pod, pod, api.Kind("Pod").WithVersion("version"), "testNamespace", pod.ObjectMeta.Name, api.Resource("pods").WithVersion("version"), "", admission.Update, nil)) + if err != nil { + t.Errorf("expected no error, got: %v", err) + } +} + // newHandlerForTest returns the admission controller configured for testing. func newHandlerForTest(c clientset.Interface) (*podTolerationsPlugin, informers.SharedInformerFactory, error) { f := informers.NewSharedInformerFactory(c, 5*time.Minute) diff --git a/plugin/pkg/admission/serviceaccount/BUILD b/plugin/pkg/admission/serviceaccount/BUILD index dc51db0a95ac4..0d9bf3a764d8d 100644 --- a/plugin/pkg/admission/serviceaccount/BUILD +++ b/plugin/pkg/admission/serviceaccount/BUILD @@ -19,6 +19,7 @@ go_library( "//pkg/client/informers/informers_generated/internalversion:go_default_library", "//pkg/client/listers/core/internalversion:go_default_library", "//pkg/kubeapiserver/admission:go_default_library", + "//pkg/kubeapiserver/admission/util:go_default_library", "//pkg/serviceaccount:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/plugin/pkg/admission/serviceaccount/admission.go b/plugin/pkg/admission/serviceaccount/admission.go index 2b7c4abfb8f10..9e319d26d6c82 100644 --- a/plugin/pkg/admission/serviceaccount/admission.go +++ b/plugin/pkg/admission/serviceaccount/admission.go @@ -36,6 +36,7 @@ import ( informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion" corelisters "k8s.io/kubernetes/pkg/client/listers/core/internalversion" kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission" + "k8s.io/kubernetes/pkg/kubeapiserver/admission/util" "k8s.io/kubernetes/pkg/serviceaccount" ) @@ -90,7 +91,7 @@ var _ = kubeapiserveradmission.WantsInternalKubeInformerFactory(&serviceAccount{ // 5. If MountServiceAccountToken is true, it adds a VolumeMount with the pod's ServiceAccount's api token secret to containers func NewServiceAccount() *serviceAccount { return &serviceAccount{ - Handler: admission.NewHandler(admission.Create), + Handler: admission.NewHandler(admission.Create, admission.Update), // TODO: enable this once we've swept secret usage to account for adding secret references to service accounts LimitSecretReferences: false, // Auto mount service account API token secrets @@ -143,6 +144,15 @@ func (s *serviceAccount) Admit(a admission.Attributes) (err error) { return nil } + updateInitialized, err := util.IsUpdatingInitializedObject(a) + if err != nil { + return err + } + if updateInitialized { + // related pod spec fields are immutable after the pod is initialized + return nil + } + // Don't modify the spec of mirror pods. // That makes the kubelet very angry and confused, and it immediately deletes the pod (because the spec doesn't match) // That said, don't allow mirror pods to reference ServiceAccounts or SecretVolumeSources either diff --git a/plugin/pkg/admission/serviceaccount/admission_test.go b/plugin/pkg/admission/serviceaccount/admission_test.go index f5b8631556603..80337481010fc 100644 --- a/plugin/pkg/admission/serviceaccount/admission_test.go +++ b/plugin/pkg/admission/serviceaccount/admission_test.go @@ -36,7 +36,7 @@ import ( func TestIgnoresNonCreate(t *testing.T) { pod := &api.Pod{} - for _, op := range []admission.Operation{admission.Update, admission.Delete, admission.Connect} { + for _, op := range []admission.Operation{admission.Delete, admission.Connect} { attrs := admission.NewAttributesRecord(pod, nil, api.Kind("Pod").WithVersion("version"), "myns", "myname", api.Resource("pods").WithVersion("version"), "", op, nil) handler := admission.NewChainHandler(NewServiceAccount()) err := handler.Admit(attrs) @@ -46,6 +46,17 @@ func TestIgnoresNonCreate(t *testing.T) { } } +func TestIgnoresUpdateOfInitializedPod(t *testing.T) { + pod := &api.Pod{} + oldPod := &api.Pod{} + attrs := admission.NewAttributesRecord(pod, oldPod, api.Kind("Pod").WithVersion("version"), "myns", "myname", api.Resource("pods").WithVersion("version"), "", admission.Update, nil) + handler := admission.NewChainHandler(NewServiceAccount()) + err := handler.Admit(attrs) + if err != nil { + t.Errorf("Expected update of initialized pod allowed, got err: %v", err) + } +} + func TestIgnoresNonPodResource(t *testing.T) { pod := &api.Pod{} attrs := admission.NewAttributesRecord(pod, nil, api.Kind("Pod").WithVersion("version"), "myns", "myname", api.Resource("CustomResource").WithVersion("version"), "", admission.Create, nil) @@ -309,6 +320,55 @@ func TestAutomountsAPIToken(t *testing.T) { t.Fatalf("Expected\n\t%#v\ngot\n\t%#v", expectedVolumeMount, pod.Spec.Containers[0].VolumeMounts[0]) } + // Test ServiceAccount admission plugin applies the same changes if the + // operation is an update to an uninitialized pod. + oldPod := &api.Pod{ + Spec: api.PodSpec{ + Containers: []api.Container{ + { + // the volumeMount in the oldPod shouldn't affect the result. + VolumeMounts: []api.VolumeMount{ + { + Name: "wrong-" + tokenName, + ReadOnly: true, + MountPath: DefaultAPITokenMountPath, + }, + }, + }, + }, + }, + } + // oldPod is not intialized. + oldPod.Initializers = &metav1.Initializers{Pending: []metav1.Initializer{{Name: "init"}}} + pod = &api.Pod{ + Spec: api.PodSpec{ + Containers: []api.Container{ + {}, + }, + }, + } + attrs = admission.NewAttributesRecord(pod, oldPod, api.Kind("Pod").WithVersion("version"), ns, "myname", api.Resource("pods").WithVersion("version"), "", admission.Update, nil) + err = admit.Admit(attrs) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + if pod.Spec.ServiceAccountName != DefaultServiceAccountName { + t.Errorf("Expected service account %s assigned, got %s", DefaultServiceAccountName, pod.Spec.ServiceAccountName) + } + if len(pod.Spec.Volumes) != 1 { + t.Fatalf("Expected 1 volume, got %d", len(pod.Spec.Volumes)) + } + if !reflect.DeepEqual(expectedVolume, pod.Spec.Volumes[0]) { + t.Fatalf("Expected\n\t%#v\ngot\n\t%#v", expectedVolume, pod.Spec.Volumes[0]) + } + if len(pod.Spec.Containers[0].VolumeMounts) != 1 { + t.Fatalf("Expected 1 volume mount, got %d", len(pod.Spec.Containers[0].VolumeMounts)) + } + if !reflect.DeepEqual(expectedVolumeMount, pod.Spec.Containers[0].VolumeMounts[0]) { + t.Fatalf("Expected\n\t%#v\ngot\n\t%#v", expectedVolumeMount, pod.Spec.Containers[0].VolumeMounts[0]) + } + + // testing InitContainers pod = &api.Pod{ Spec: api.PodSpec{ InitContainers: []api.Container{ From ef29b836c0d07d8ac47bf5ac82118cb75779774c Mon Sep 17 00:00:00 2001 From: Lantao Liu Date: Fri, 4 Aug 2017 22:26:43 +0000 Subject: [PATCH 087/403] Set ExecSync timeout in liveness prober. --- pkg/kubelet/kuberuntime/kuberuntime_container.go | 2 +- pkg/kubelet/remote/remote_runtime.go | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pkg/kubelet/kuberuntime/kuberuntime_container.go b/pkg/kubelet/kuberuntime/kuberuntime_container.go index 7b8a15484daf8..9befe53387253 100644 --- a/pkg/kubelet/kuberuntime/kuberuntime_container.go +++ b/pkg/kubelet/kuberuntime/kuberuntime_container.go @@ -763,7 +763,7 @@ func (m *kubeGenericRuntimeManager) GetAttach(id kubecontainer.ContainerID, stdi // RunInContainer synchronously executes the command in the container, and returns the output. func (m *kubeGenericRuntimeManager) RunInContainer(id kubecontainer.ContainerID, cmd []string, timeout time.Duration) ([]byte, error) { - stdout, stderr, err := m.runtimeService.ExecSync(id.ID, cmd, 0) + stdout, stderr, err := m.runtimeService.ExecSync(id.ID, cmd, timeout) // NOTE(tallclair): This does not correctly interleave stdout & stderr, but should be sufficient // for logging purposes. A combined output option will need to be added to the ExecSyncRequest // if more precise output ordering is ever required. diff --git a/pkg/kubelet/remote/remote_runtime.go b/pkg/kubelet/remote/remote_runtime.go index 647c564b7e38c..a083544c76312 100644 --- a/pkg/kubelet/remote/remote_runtime.go +++ b/pkg/kubelet/remote/remote_runtime.go @@ -23,6 +23,7 @@ import ( "time" "github.com/golang/glog" + "golang.org/x/net/context" "google.golang.org/grpc" internalapi "k8s.io/kubernetes/pkg/kubelet/apis/cri" @@ -291,9 +292,14 @@ func (r *RemoteRuntimeService) ContainerStatus(containerID string) (*runtimeapi. // ExecSync executes a command in the container, and returns the stdout output. // If command exits with a non-zero exit code, an error is returned. func (r *RemoteRuntimeService) ExecSync(containerID string, cmd []string, timeout time.Duration) (stdout []byte, stderr []byte, err error) { - ctx, cancel := getContextWithTimeout(timeout) - if timeout == 0 { - // Do not set timeout when timeout is 0. + // Do not set timeout when timeout is 0. + var ctx context.Context + var cancel context.CancelFunc + if timeout != 0 { + // Use timeout + default timeout (2 minutes) as timeout to leave some time for + // the runtime to do cleanup. + ctx, cancel = getContextWithTimeout(r.timeout + timeout) + } else { ctx, cancel = getContextWithCancel() } defer cancel() From 6366f93d10006905d64dfc85c30db5e3ae1edd81 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Thu, 27 Jul 2017 14:56:30 -0400 Subject: [PATCH 088/403] Clear collections between each test of TestList --- pkg/registry/registrytest/etcd.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/registry/registrytest/etcd.go b/pkg/registry/registrytest/etcd.go index 13abeac2baac6..344ce4629b2a2 100644 --- a/pkg/registry/registrytest/etcd.go +++ b/pkg/registry/registrytest/etcd.go @@ -202,6 +202,10 @@ func (t *Tester) createObject(ctx genericapirequest.Context, obj runtime.Object) func (t *Tester) setObjectsForList(objects []runtime.Object) []runtime.Object { key := t.storage.KeyRootFunc(t.tester.TestContext()) + if _, err := t.storage.DeleteCollection(t.tester.TestContext(), nil, nil); err != nil { + t.tester.Errorf("unable to clear collection: %v", err) + return nil + } if err := storagetesting.CreateObjList(key, t.storage.Storage, objects); err != nil { t.tester.Errorf("unexpected error: %v", err) return nil From 0b0235b48497c07cc6c8286167978b599d69b690 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Thu, 27 Jul 2017 14:56:56 -0400 Subject: [PATCH 089/403] Verify TableConversion behavior in resttest --- .../pkg/registry/rest/resttest/resttest.go | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/resttest.go b/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/resttest.go index 45dbaa9e0e50c..ed8ee282949a5 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/resttest.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/resttest/resttest.go @@ -207,6 +207,7 @@ func (t *Tester) TestList(valid runtime.Object, assignFn AssignFunc) { t.testListNotFound(assignFn) t.testListFound(valid.DeepCopyObject(), assignFn) t.testListMatchLabels(valid.DeepCopyObject(), assignFn) + t.testListTableConversion(valid.DeepCopyObject(), assignFn) } // Test watching objects. @@ -1256,6 +1257,97 @@ func (t *Tester) testListNotFound(assignFn AssignFunc) { } } +// testListTableConversion verifies a set of known bounds and expected limitations for the values +// returned from a TableList. These conditions may be changed if necessary with adequate review. +func (t *Tester) testListTableConversion(obj runtime.Object, assignFn AssignFunc) { + ctx := t.TestContext() + testLabels := map[string]string{"key": "value"} + + foo3 := obj.DeepCopyObject() + t.setObjectMeta(foo3, "foo3") + foo4 := obj.DeepCopyObject() + foo4Meta := t.getObjectMetaOrFail(foo4) + foo4Meta.SetName("foo4") + foo4Meta.SetNamespace(genericapirequest.NamespaceValue(ctx)) + foo4Meta.SetLabels(testLabels) + + objs := ([]runtime.Object{foo3, foo4}) + + assignFn(objs) + + options := &metainternalversion.ListOptions{} + listObj, err := t.storage.(rest.Lister).List(ctx, options) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + items, err := listToItems(listObj) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(items) != len(objs) { + t.Errorf("unexpected number of items: %v", len(items)) + } + if !apiequality.Semantic.DeepEqual(objs, items) { + t.Errorf("expected: %#v, got: %#v", objs, items) + } + + table, err := t.storage.(rest.TableConvertor).ConvertToTable(ctx, listObj, nil) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(table.Rows) != len(items) { + t.Errorf("unexpected number of rows: %v", len(table.Rows)) + } + columns := table.ColumnDefinitions + if len(columns) == 0 { + t.Errorf("unexpected number of columns: %v", len(columns)) + } + if columns[0].Name != "Name" || columns[0].Type != "string" || columns[0].Format != "name" { + t.Errorf("expect column 0 to be the name column: %#v", columns[0]) + } + for j, column := range columns { + if len(column.Name) == 0 { + t.Errorf("column %d has no name", j) + } + switch column.Type { + case "string", "date", "integer": + default: + t.Errorf("column %d has unexpected type: %q", j, column.Type) + } + switch { + case column.Format == "": + case column.Format == "name" && column.Type == "string": + default: + t.Errorf("column %d has unexpected format: %q with type %q", j, column.Format, column.Type) + } + if column.Priority < 0 || column.Priority > 2 { + t.Errorf("column %d has unexpected priority", j, column.Priority) + } + if len(column.Description) == 0 { + t.Errorf("column %d has no description", j) + } + if column.Name == "Created At" && column.Type != "date" && column.Format != "" { + t.Errorf("column %d looks like a created at column, but has a different type and format: %#v", j, column) + } + } + for i, row := range table.Rows { + if len(row.Cells) != len(table.ColumnDefinitions) { + t.Errorf("row %d did not have the correct number of cells: %d in %v", len(table.ColumnDefinitions), row.Cells) + } + for j, cell := range row.Cells { + // do not add to this test without discussion - may break clients + switch cell.(type) { + case float64, int64, int32, int, string, bool: + case []interface{}: + default: + t.Errorf("row %d, cell %d has an unrecognized type, only JSON serialization safe types are allowed: %T ", i, j, cell) + } + } + if len(row.Cells) != len(table.ColumnDefinitions) { + } + } +} + // ============================================================================= // Watching tests. From e5857b1ec02514f06b82bf5833fcb87645732883 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Thu, 27 Jul 2017 14:57:09 -0400 Subject: [PATCH 090/403] Make generic metadata conform to documented name column convention --- staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go | 4 ++-- staging/src/k8s.io/apiserver/pkg/registry/rest/table.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go index af4e119ef191a..4847a59340808 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go @@ -1869,7 +1869,7 @@ func TestGetTable(t *testing.T) { expected: &metav1alpha1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1alpha1"}, ColumnDefinitions: []metav1alpha1.TableColumnDefinition{ - {Name: "Name", Type: "string", Description: metaDoc["name"]}, + {Name: "Name", Type: "string", Format: "name", Description: metaDoc["name"]}, {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, }, Rows: []metav1alpha1.TableRow{ @@ -1883,7 +1883,7 @@ func TestGetTable(t *testing.T) { expected: &metav1alpha1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1alpha1"}, ColumnDefinitions: []metav1alpha1.TableColumnDefinition{ - {Name: "Name", Type: "string", Description: metaDoc["name"]}, + {Name: "Name", Type: "string", Format: "name", Description: metaDoc["name"]}, {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, }, Rows: []metav1alpha1.TableRow{ diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/table.go b/staging/src/k8s.io/apiserver/pkg/registry/rest/table.go index 21e393c450a0b..087421e9f3d5f 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/table.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/table.go @@ -64,7 +64,7 @@ func (c defaultTableConvertor) ConvertToTable(ctx genericapirequest.Context, obj } } table.ColumnDefinitions = []metav1alpha1.TableColumnDefinition{ - {Name: "Name", Type: "string", Description: swaggerMetadataDescriptions["name"]}, + {Name: "Name", Type: "string", Format: "name", Description: swaggerMetadataDescriptions["name"]}, {Name: "Created At", Type: "date", Description: swaggerMetadataDescriptions["creationTimestamp"]}, } return &table, nil From da5265d19a61a84b5c6d0cb64af0907876c3b786 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Wed, 26 Jul 2017 22:49:14 -0400 Subject: [PATCH 091/403] Enable server side printers for converted types --- pkg/registry/apps/statefulset/storage/BUILD | 3 +++ pkg/registry/apps/statefulset/storage/storage.go | 5 +++++ pkg/registry/batch/cronjob/storage/BUILD | 3 +++ pkg/registry/batch/cronjob/storage/storage.go | 12 +++++++++--- pkg/registry/batch/job/storage/BUILD | 3 +++ pkg/registry/batch/job/storage/storage.go | 5 +++++ pkg/registry/core/endpoint/storage/BUILD | 3 +++ pkg/registry/core/endpoint/storage/storage.go | 5 +++++ pkg/registry/core/node/storage/BUILD | 3 +++ pkg/registry/core/node/storage/storage.go | 5 +++++ pkg/registry/core/podtemplate/storage/BUILD | 3 +++ pkg/registry/core/podtemplate/storage/storage.go | 5 +++++ .../core/replicationcontroller/storage/BUILD | 3 +++ .../core/replicationcontroller/storage/storage.go | 5 +++++ pkg/registry/core/service/storage/BUILD | 3 +++ pkg/registry/core/service/storage/storage.go | 5 +++++ pkg/registry/extensions/daemonset/storage/BUILD | 3 +++ pkg/registry/extensions/daemonset/storage/storage.go | 5 +++++ pkg/registry/extensions/ingress/storage/BUILD | 3 +++ pkg/registry/extensions/ingress/storage/storage.go | 5 +++++ pkg/registry/extensions/replicaset/storage/BUILD | 3 +++ .../extensions/replicaset/storage/storage.go | 5 +++++ .../policy/poddisruptionbudget/storage/BUILD | 3 +++ .../policy/poddisruptionbudget/storage/storage.go | 5 +++++ 24 files changed, 100 insertions(+), 3 deletions(-) diff --git a/pkg/registry/apps/statefulset/storage/BUILD b/pkg/registry/apps/statefulset/storage/BUILD index 1d3a58e657314..66767360ae97b 100644 --- a/pkg/registry/apps/statefulset/storage/BUILD +++ b/pkg/registry/apps/statefulset/storage/BUILD @@ -36,6 +36,9 @@ go_library( "//pkg/apis/apps:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/validation:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/apps/statefulset:go_default_library", "//pkg/registry/cachesize:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/registry/apps/statefulset/storage/storage.go b/pkg/registry/apps/statefulset/storage/storage.go index 80375251a9662..066e95116a645 100644 --- a/pkg/registry/apps/statefulset/storage/storage.go +++ b/pkg/registry/apps/statefulset/storage/storage.go @@ -30,6 +30,9 @@ import ( "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/extensions" extvalidation "k8s.io/kubernetes/pkg/apis/extensions/validation" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/apps/statefulset" "k8s.io/kubernetes/pkg/registry/cachesize" ) @@ -69,6 +72,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { CreateStrategy: statefulset.Strategy, UpdateStrategy: statefulset.Strategy, DeleteStrategy: statefulset.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/batch/cronjob/storage/BUILD b/pkg/registry/batch/cronjob/storage/BUILD index 2d8b18208f053..823dc973f701d 100644 --- a/pkg/registry/batch/cronjob/storage/BUILD +++ b/pkg/registry/batch/cronjob/storage/BUILD @@ -31,6 +31,9 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/batch/cronjob:go_default_library", "//pkg/registry/cachesize:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/batch/cronjob/storage/storage.go b/pkg/registry/batch/cronjob/storage/storage.go index dbff7059b2424..9e48fb244f8c3 100644 --- a/pkg/registry/batch/cronjob/storage/storage.go +++ b/pkg/registry/batch/cronjob/storage/storage.go @@ -25,6 +25,9 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/batch" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/batch/cronjob" "k8s.io/kubernetes/pkg/registry/cachesize" ) @@ -42,9 +45,12 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { NewListFunc: func() runtime.Object { return &batch.CronJobList{} }, DefaultQualifiedResource: batch.Resource("cronjobs"), WatchCacheSize: cachesize.GetWatchCacheSizeByResource("cronjobs"), - CreateStrategy: cronjob.Strategy, - UpdateStrategy: cronjob.Strategy, - DeleteStrategy: cronjob.Strategy, + + CreateStrategy: cronjob.Strategy, + UpdateStrategy: cronjob.Strategy, + DeleteStrategy: cronjob.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/batch/job/storage/BUILD b/pkg/registry/batch/job/storage/BUILD index 90b02b45ff2a0..3173c3ea3d355 100644 --- a/pkg/registry/batch/job/storage/BUILD +++ b/pkg/registry/batch/job/storage/BUILD @@ -29,6 +29,9 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/batch/job:go_default_library", "//pkg/registry/cachesize:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/batch/job/storage/storage.go b/pkg/registry/batch/job/storage/storage.go index aa52d251023ca..9fa1ced76f9c0 100644 --- a/pkg/registry/batch/job/storage/storage.go +++ b/pkg/registry/batch/job/storage/storage.go @@ -25,6 +25,9 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/batch" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/batch/job" "k8s.io/kubernetes/pkg/registry/cachesize" ) @@ -62,6 +65,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { CreateStrategy: job.Strategy, UpdateStrategy: job.Strategy, DeleteStrategy: job.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: job.GetAttrs} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/core/endpoint/storage/BUILD b/pkg/registry/core/endpoint/storage/BUILD index 3721e1a89c90e..e348e08c7fbd9 100644 --- a/pkg/registry/core/endpoint/storage/BUILD +++ b/pkg/registry/core/endpoint/storage/BUILD @@ -27,6 +27,9 @@ go_library( srcs = ["storage.go"], deps = [ "//pkg/api:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/cachesize:go_default_library", "//pkg/registry/core/endpoint:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/registry/core/endpoint/storage/storage.go b/pkg/registry/core/endpoint/storage/storage.go index 28e30837199fe..d7ed2254745c0 100644 --- a/pkg/registry/core/endpoint/storage/storage.go +++ b/pkg/registry/core/endpoint/storage/storage.go @@ -22,6 +22,9 @@ import ( genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/core/endpoint" ) @@ -42,6 +45,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { CreateStrategy: endpoint.Strategy, UpdateStrategy: endpoint.Strategy, DeleteStrategy: endpoint.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/core/node/storage/BUILD b/pkg/registry/core/node/storage/BUILD index 04d1942af5fff..27d3a8a0278e4 100644 --- a/pkg/registry/core/node/storage/BUILD +++ b/pkg/registry/core/node/storage/BUILD @@ -31,6 +31,9 @@ go_library( "//pkg/api:go_default_library", "//pkg/api/v1:go_default_library", "//pkg/kubelet/client:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/cachesize:go_default_library", "//pkg/registry/core/node:go_default_library", "//pkg/registry/core/node/rest:go_default_library", diff --git a/pkg/registry/core/node/storage/storage.go b/pkg/registry/core/node/storage/storage.go index fb9e6c2fcdb15..0f28cec47f0fa 100644 --- a/pkg/registry/core/node/storage/storage.go +++ b/pkg/registry/core/node/storage/storage.go @@ -31,6 +31,9 @@ import ( "k8s.io/kubernetes/pkg/api" k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/kubelet/client" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/core/node" noderest "k8s.io/kubernetes/pkg/registry/core/node/rest" @@ -84,6 +87,8 @@ func NewStorage(optsGetter generic.RESTOptionsGetter, kubeletClientConfig client UpdateStrategy: node.Strategy, DeleteStrategy: node.Strategy, ExportStrategy: node.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: node.GetAttrs, TriggerFunc: node.NodeNameTriggerFunc} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/core/podtemplate/storage/BUILD b/pkg/registry/core/podtemplate/storage/BUILD index 94aeadfdbd65a..d408695edd18a 100644 --- a/pkg/registry/core/podtemplate/storage/BUILD +++ b/pkg/registry/core/podtemplate/storage/BUILD @@ -27,6 +27,9 @@ go_library( srcs = ["storage.go"], deps = [ "//pkg/api:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/cachesize:go_default_library", "//pkg/registry/core/podtemplate:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/registry/core/podtemplate/storage/storage.go b/pkg/registry/core/podtemplate/storage/storage.go index 9376d4b4ba49c..81b4d4e74f51e 100644 --- a/pkg/registry/core/podtemplate/storage/storage.go +++ b/pkg/registry/core/podtemplate/storage/storage.go @@ -21,6 +21,9 @@ import ( "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/core/podtemplate" ) @@ -44,6 +47,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { ExportStrategy: podtemplate.Strategy, ReturnDeletedObject: true, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/core/replicationcontroller/storage/BUILD b/pkg/registry/core/replicationcontroller/storage/BUILD index ffef9f4d1d359..99928e1bde34a 100644 --- a/pkg/registry/core/replicationcontroller/storage/BUILD +++ b/pkg/registry/core/replicationcontroller/storage/BUILD @@ -35,6 +35,9 @@ go_library( "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", "//pkg/apis/autoscaling/validation:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/cachesize:go_default_library", "//pkg/registry/core/replicationcontroller:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/registry/core/replicationcontroller/storage/storage.go b/pkg/registry/core/replicationcontroller/storage/storage.go index 1d0bb1e76e988..210f29532d2c6 100644 --- a/pkg/registry/core/replicationcontroller/storage/storage.go +++ b/pkg/registry/core/replicationcontroller/storage/storage.go @@ -32,6 +32,9 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/apis/autoscaling/validation" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/core/replicationcontroller" ) @@ -71,6 +74,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { CreateStrategy: replicationcontroller.Strategy, UpdateStrategy: replicationcontroller.Strategy, DeleteStrategy: replicationcontroller.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: replicationcontroller.GetAttrs} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/core/service/storage/BUILD b/pkg/registry/core/service/storage/BUILD index faece9dd9ed9f..d96681f169615 100644 --- a/pkg/registry/core/service/storage/BUILD +++ b/pkg/registry/core/service/storage/BUILD @@ -28,6 +28,9 @@ go_library( srcs = ["storage.go"], deps = [ "//pkg/api:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/cachesize:go_default_library", "//pkg/registry/core/service:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/core/service/storage/storage.go b/pkg/registry/core/service/storage/storage.go index 886f227592e7d..865e792098411 100644 --- a/pkg/registry/core/service/storage/storage.go +++ b/pkg/registry/core/service/storage/storage.go @@ -24,6 +24,9 @@ import ( genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/core/service" ) @@ -45,6 +48,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { UpdateStrategy: service.Strategy, DeleteStrategy: service.Strategy, ExportStrategy: service.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/extensions/daemonset/storage/BUILD b/pkg/registry/extensions/daemonset/storage/BUILD index 176dae98bc97e..d4e6ddfac9bb2 100644 --- a/pkg/registry/extensions/daemonset/storage/BUILD +++ b/pkg/registry/extensions/daemonset/storage/BUILD @@ -29,6 +29,9 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/cachesize:go_default_library", "//pkg/registry/extensions/daemonset:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/extensions/daemonset/storage/storage.go b/pkg/registry/extensions/daemonset/storage/storage.go index 0ba0dc9b3cded..5f0c4d3079314 100644 --- a/pkg/registry/extensions/daemonset/storage/storage.go +++ b/pkg/registry/extensions/daemonset/storage/storage.go @@ -25,6 +25,9 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/extensions/daemonset" ) @@ -46,6 +49,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { CreateStrategy: daemonset.Strategy, UpdateStrategy: daemonset.Strategy, DeleteStrategy: daemonset.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/extensions/ingress/storage/BUILD b/pkg/registry/extensions/ingress/storage/BUILD index 0b538d6b2cf42..5bfdd5d06881f 100644 --- a/pkg/registry/extensions/ingress/storage/BUILD +++ b/pkg/registry/extensions/ingress/storage/BUILD @@ -30,6 +30,9 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/cachesize:go_default_library", "//pkg/registry/extensions/ingress:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/extensions/ingress/storage/storage.go b/pkg/registry/extensions/ingress/storage/storage.go index f6c7d6a915c13..7a9e6409e87b9 100644 --- a/pkg/registry/extensions/ingress/storage/storage.go +++ b/pkg/registry/extensions/ingress/storage/storage.go @@ -25,6 +25,9 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/extensions/ingress" ) @@ -46,6 +49,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { CreateStrategy: ingress.Strategy, UpdateStrategy: ingress.Strategy, DeleteStrategy: ingress.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/extensions/replicaset/storage/BUILD b/pkg/registry/extensions/replicaset/storage/BUILD index 7ccbe4d101be7..a1cca2204b46e 100644 --- a/pkg/registry/extensions/replicaset/storage/BUILD +++ b/pkg/registry/extensions/replicaset/storage/BUILD @@ -35,6 +35,9 @@ go_library( "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/validation:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/cachesize:go_default_library", "//pkg/registry/extensions/replicaset:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", diff --git a/pkg/registry/extensions/replicaset/storage/storage.go b/pkg/registry/extensions/replicaset/storage/storage.go index b10c455ae911b..e3b7d18745fb9 100644 --- a/pkg/registry/extensions/replicaset/storage/storage.go +++ b/pkg/registry/extensions/replicaset/storage/storage.go @@ -31,6 +31,9 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" extvalidation "k8s.io/kubernetes/pkg/apis/extensions/validation" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/extensions/replicaset" ) @@ -70,6 +73,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { CreateStrategy: replicaset.Strategy, UpdateStrategy: replicaset.Strategy, DeleteStrategy: replicaset.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: replicaset.GetAttrs} if err := store.CompleteWithOptions(options); err != nil { diff --git a/pkg/registry/policy/poddisruptionbudget/storage/BUILD b/pkg/registry/policy/poddisruptionbudget/storage/BUILD index 5c0c85eca3f05..fe817c6c6853a 100644 --- a/pkg/registry/policy/poddisruptionbudget/storage/BUILD +++ b/pkg/registry/policy/poddisruptionbudget/storage/BUILD @@ -31,6 +31,9 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/apis/policy:go_default_library", + "//pkg/printers:go_default_library", + "//pkg/printers/internalversion:go_default_library", + "//pkg/printers/storage:go_default_library", "//pkg/registry/cachesize:go_default_library", "//pkg/registry/policy/poddisruptionbudget:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/registry/policy/poddisruptionbudget/storage/storage.go b/pkg/registry/policy/poddisruptionbudget/storage/storage.go index e97136c295865..2f196e85b1a6c 100644 --- a/pkg/registry/policy/poddisruptionbudget/storage/storage.go +++ b/pkg/registry/policy/poddisruptionbudget/storage/storage.go @@ -25,6 +25,9 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" policyapi "k8s.io/kubernetes/pkg/apis/policy" + "k8s.io/kubernetes/pkg/printers" + printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" + printerstorage "k8s.io/kubernetes/pkg/printers/storage" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/policy/poddisruptionbudget" ) @@ -46,6 +49,8 @@ func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { CreateStrategy: poddisruptionbudget.Strategy, UpdateStrategy: poddisruptionbudget.Strategy, DeleteStrategy: poddisruptionbudget.Strategy, + + TableConvertor: printerstorage.TableConvertor{TablePrinter: printers.NewTablePrinter().With(printersinternal.AddHandlers)}, } options := &generic.StoreOptions{RESTOptions: optsGetter} if err := store.CompleteWithOptions(options); err != nil { From c969079f49397b01e471bde036f6556b5af4b683 Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Thu, 17 Aug 2017 18:08:26 -0400 Subject: [PATCH 092/403] add tests --- pkg/kubectl/cmd/top_node_test.go | 53 ++++++++++++ pkg/kubectl/cmd/top_pod_test.go | 143 +++++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+) diff --git a/pkg/kubectl/cmd/top_node_test.go b/pkg/kubectl/cmd/top_node_test.go index e2e9af185cb4b..ba292a63bb162 100644 --- a/pkg/kubectl/cmd/top_node_test.go +++ b/pkg/kubectl/cmd/top_node_test.go @@ -79,6 +79,59 @@ func TestTopNodeAllMetrics(t *testing.T) { } } +func TestTopNodeAllMetricsCustomDefaults(t *testing.T) { + customBaseHeapsterServiceAddress := "/api/v1/namespaces/custom-namespace/services/https:custom-heapster-service:/proxy" + customBaseMetricsAddress := customBaseHeapsterServiceAddress + "/apis/metrics" + + initTestErrorHandler(t) + metrics, nodes := testNodeMetricsData() + expectedMetricsPath := fmt.Sprintf("%s/%s/nodes", customBaseMetricsAddress, metricsApiVersion) + expectedNodePath := fmt.Sprintf("/%s/%s/nodes", apiPrefix, apiVersion) + + f, tf, codec, ns := cmdtesting.NewAPIFactory() + tf.Printer = &testPrinter{} + tf.Client = &fake.RESTClient{ + APIRegistry: api.Registry, + NegotiatedSerializer: ns, + Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { + switch p, m := req.URL.Path, req.Method; { + case p == expectedMetricsPath && m == "GET": + body, err := marshallBody(metrics) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: body}, nil + case p == expectedNodePath && m == "GET": + return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, nodes)}, nil + default: + t.Fatalf("unexpected request: %#v\nGot URL: %#v\nExpected path: %#v", req, req.URL, expectedMetricsPath) + return nil, nil + } + }), + } + tf.Namespace = "test" + tf.ClientConfig = defaultClientConfig() + buf := bytes.NewBuffer([]byte{}) + + opts := &TopNodeOptions{ + HeapsterOptions: HeapsterTopOptions{ + Namespace: "custom-namespace", + Scheme: "https", + Service: "custom-heapster-service", + }, + } + cmd := NewCmdTopNode(f, opts, buf) + cmd.Run(cmd, []string{}) + + // Check the presence of node names in the output. + result := buf.String() + for _, m := range metrics.Items { + if !strings.Contains(result, m.Name) { + t.Errorf("missing metrics for %s: \n%s", m.Name, result) + } + } +} + func TestTopNodeWithNameMetrics(t *testing.T) { initTestErrorHandler(t) metrics, nodes := testNodeMetricsData() diff --git a/pkg/kubectl/cmd/top_pod_test.go b/pkg/kubectl/cmd/top_pod_test.go index ef892887d2361..3766123fb7999 100644 --- a/pkg/kubectl/cmd/top_pod_test.go +++ b/pkg/kubectl/cmd/top_pod_test.go @@ -170,6 +170,149 @@ func TestTopPod(t *testing.T) { } } +func TestTopPodCustomDefaults(t *testing.T) { + customBaseHeapsterServiceAddress := "/api/v1/namespaces/custom-namespace/services/https:custom-heapster-service:/proxy" + customBaseMetricsAddress := customBaseHeapsterServiceAddress + "/apis/metrics" + customTopPathPrefix := customBaseMetricsAddress + "/" + metricsApiVersion + + testNS := "custom-namespace" + testCases := []struct { + name string + namespace string + flags map[string]string + args []string + expectedPath string + expectedQuery string + namespaces []string + containers bool + listsNamespaces bool + }{ + { + name: "all namespaces", + flags: map[string]string{"all-namespaces": "true"}, + expectedPath: customTopPathPrefix + "/pods", + namespaces: []string{testNS, "secondtestns", "thirdtestns"}, + listsNamespaces: true, + }, + { + name: "all in namespace", + expectedPath: customTopPathPrefix + "/namespaces/" + testNS + "/pods", + namespaces: []string{testNS, testNS}, + }, + { + name: "pod with name", + args: []string{"pod1"}, + expectedPath: customTopPathPrefix + "/namespaces/" + testNS + "/pods/pod1", + namespaces: []string{testNS}, + }, + { + name: "pod with label selector", + flags: map[string]string{"selector": "key=value"}, + expectedPath: customTopPathPrefix + "/namespaces/" + testNS + "/pods", + expectedQuery: "labelSelector=" + url.QueryEscape("key=value"), + namespaces: []string{testNS, testNS}, + }, + { + name: "pod with container metrics", + flags: map[string]string{"containers": "true"}, + args: []string{"pod1"}, + expectedPath: customTopPathPrefix + "/namespaces/" + testNS + "/pods/pod1", + namespaces: []string{testNS}, + containers: true, + }, + } + initTestErrorHandler(t) + for _, testCase := range testCases { + t.Logf("Running test case: %s", testCase.name) + metricsList := testPodMetricsData() + var expectedMetrics []metricsapi.PodMetrics + var expectedContainerNames, nonExpectedMetricsNames []string + for n, m := range metricsList { + if n < len(testCase.namespaces) { + m.Namespace = testCase.namespaces[n] + expectedMetrics = append(expectedMetrics, m) + for _, c := range m.Containers { + expectedContainerNames = append(expectedContainerNames, c.Name) + } + } else { + nonExpectedMetricsNames = append(nonExpectedMetricsNames, m.Name) + } + } + + var response interface{} + if len(expectedMetrics) == 1 { + response = expectedMetrics[0] + } else { + response = metricsapi.PodMetricsList{ + ListMeta: metav1.ListMeta{ + ResourceVersion: "2", + }, + Items: expectedMetrics, + } + } + + f, tf, _, ns := cmdtesting.NewAPIFactory() + tf.Printer = &testPrinter{} + tf.Client = &fake.RESTClient{ + APIRegistry: api.Registry, + NegotiatedSerializer: ns, + Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { + switch p, m, q := req.URL.Path, req.Method, req.URL.RawQuery; { + case p == testCase.expectedPath && m == "GET" && (testCase.expectedQuery == "" || q == testCase.expectedQuery): + body, err := marshallBody(response) + if err != nil { + t.Errorf("%s: unexpected error: %v", testCase.name, err) + } + return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: body}, nil + default: + t.Fatalf("%s: unexpected request: %#v\nGot URL: %#v\nExpected path: %#v\nExpected query: %#v", + testCase.name, req, req.URL, testCase.expectedPath, testCase.expectedQuery) + return nil, nil + } + }), + } + tf.Namespace = testNS + tf.ClientConfig = defaultClientConfig() + buf := bytes.NewBuffer([]byte{}) + + opts := &TopPodOptions{ + HeapsterOptions: HeapsterTopOptions{ + Namespace: "custom-namespace", + Scheme: "https", + Service: "custom-heapster-service", + }, + } + cmd := NewCmdTopPod(f, opts, buf) + for name, value := range testCase.flags { + cmd.Flags().Set(name, value) + } + cmd.Run(cmd, testCase.args) + + // Check the presence of pod names&namespaces/container names in the output. + result := buf.String() + if testCase.containers { + for _, containerName := range expectedContainerNames { + if !strings.Contains(result, containerName) { + t.Errorf("%s: missing metrics for container %s: \n%s", testCase.name, containerName, result) + } + } + } + for _, m := range expectedMetrics { + if !strings.Contains(result, m.Name) { + t.Errorf("%s: missing metrics for %s: \n%s", testCase.name, m.Name, result) + } + if testCase.listsNamespaces && !strings.Contains(result, m.Namespace) { + t.Errorf("%s: missing metrics for %s/%s: \n%s", testCase.name, m.Namespace, m.Name, result) + } + } + for _, name := range nonExpectedMetricsNames { + if strings.Contains(result, name) { + t.Errorf("%s: unexpected metrics for %s: \n%s", testCase.name, name, result) + } + } + } +} + func testPodMetricsData() []metricsapi.PodMetrics { return []metricsapi.PodMetrics{ { From 71b477bd6b5b7bdae37f6fd4514e7073b25a2ad8 Mon Sep 17 00:00:00 2001 From: crimsonfaith91 Date: Thu, 17 Aug 2017 12:03:50 -0700 Subject: [PATCH 093/403] Change API version of statefulset scale subresource e2e test to v1beta2 --- test/e2e/apps/BUILD | 1 + test/e2e/apps/statefulset.go | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/test/e2e/apps/BUILD b/test/e2e/apps/BUILD index 7bdc5073c6812..864e878a98dd8 100644 --- a/test/e2e/apps/BUILD +++ b/test/e2e/apps/BUILD @@ -43,6 +43,7 @@ go_library( "//vendor/github.com/onsi/ginkgo:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", "//vendor/k8s.io/api/apps/v1beta1:go_default_library", + "//vendor/k8s.io/api/apps/v1beta2:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/test/e2e/apps/statefulset.go b/test/e2e/apps/statefulset.go index 2b7bd2c755f11..b0c8cbdffc3e6 100644 --- a/test/e2e/apps/statefulset.go +++ b/test/e2e/apps/statefulset.go @@ -24,6 +24,7 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" apps "k8s.io/api/apps/v1beta1" + appsv1beta2 "k8s.io/api/apps/v1beta2" "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" klabels "k8s.io/apimachinery/pkg/labels" @@ -855,8 +856,8 @@ var _ = SIGDescribe("StatefulSet", func() { By("getting scale subresource") scale := framework.NewStatefulSetScale(ss) - scaleResult := &apps.Scale{} - err = c.AppsV1beta1().RESTClient().Get().AbsPath("/apis/apps/v1beta1").Namespace(ns).Resource("statefulsets").Name(ssName).SubResource("scale").Do().Into(scale) + scaleResult := &appsv1beta2.Scale{} + err = c.AppsV1beta2().RESTClient().Get().AbsPath("/apis/apps/v1beta2").Namespace(ns).Resource("statefulsets").Name(ssName).SubResource("scale").Do().Into(scale) if err != nil { framework.Failf("Failed to get scale subresource: %v", err) } @@ -866,7 +867,7 @@ var _ = SIGDescribe("StatefulSet", func() { By("updating a scale subresource") scale.ResourceVersion = "" //unconditionally update to 2 replicas scale.Spec.Replicas = 2 - err = c.AppsV1beta1().RESTClient().Put().AbsPath("/apis/apps/v1beta1").Namespace(ns).Resource("statefulsets").Name(ssName).SubResource("scale").Body(scale).Do().Into(scaleResult) + err = c.AppsV1beta2().RESTClient().Put().AbsPath("/apis/apps/v1beta2").Namespace(ns).Resource("statefulsets").Name(ssName).SubResource("scale").Body(scale).Do().Into(scaleResult) if err != nil { framework.Failf("Failed to put scale subresource: %v", err) } From 5cb7ddbf54c0ce4a37ea2e99735abb1abafc6d97 Mon Sep 17 00:00:00 2001 From: Yinan Li Date: Thu, 17 Aug 2017 15:42:12 -0700 Subject: [PATCH 094/403] Added lister expansions for DaemonSet, Deployment, ReplicaSet, and StatefulSet for apps/v1beta2 --- .../client-go/listers/apps/v1beta2/BUILD | 6 + .../apps/v1beta2/daemonset_expansion.go | 113 ++++++++++++++++++ .../apps/v1beta2/deployment_expansion.go | 70 +++++++++++ .../apps/v1beta2/expansion_generated.go | 32 ----- .../apps/v1beta2/replicaset_expansion.go | 73 +++++++++++ .../apps/v1beta2/statefulset_expansion.go | 77 ++++++++++++ 6 files changed, 339 insertions(+), 32 deletions(-) create mode 100644 staging/src/k8s.io/client-go/listers/apps/v1beta2/daemonset_expansion.go create mode 100644 staging/src/k8s.io/client-go/listers/apps/v1beta2/deployment_expansion.go create mode 100644 staging/src/k8s.io/client-go/listers/apps/v1beta2/replicaset_expansion.go create mode 100644 staging/src/k8s.io/client-go/listers/apps/v1beta2/statefulset_expansion.go diff --git a/staging/src/k8s.io/client-go/listers/apps/v1beta2/BUILD b/staging/src/k8s.io/client-go/listers/apps/v1beta2/BUILD index 92b2721013d30..f81e6e17418d1 100644 --- a/staging/src/k8s.io/client-go/listers/apps/v1beta2/BUILD +++ b/staging/src/k8s.io/client-go/listers/apps/v1beta2/BUILD @@ -10,15 +10,21 @@ go_library( srcs = [ "controllerrevision.go", "daemonset.go", + "daemonset_expansion.go", "deployment.go", + "deployment_expansion.go", "expansion_generated.go", "replicaset.go", + "replicaset_expansion.go", "scale.go", "statefulset.go", + "statefulset_expansion.go", ], deps = [ "//vendor/k8s.io/api/apps/v1beta2:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", ], diff --git a/staging/src/k8s.io/client-go/listers/apps/v1beta2/daemonset_expansion.go b/staging/src/k8s.io/client-go/listers/apps/v1beta2/daemonset_expansion.go new file mode 100644 index 0000000000000..3b01aaa487d37 --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/apps/v1beta2/daemonset_expansion.go @@ -0,0 +1,113 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta2 + +import ( + "fmt" + + apps "k8s.io/api/apps/v1beta2" + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" +) + +// DaemonSetListerExpansion allows custom methods to be added to +// DaemonSetLister. +type DaemonSetListerExpansion interface { + GetPodDaemonSets(pod *v1.Pod) ([]*apps.DaemonSet, error) + GetHistoryDaemonSets(history *apps.ControllerRevision) ([]*apps.DaemonSet, error) +} + +// DaemonSetNamespaceListerExpansion allows custom methods to be added to +// DaemonSetNamespaceLister. +type DaemonSetNamespaceListerExpansion interface{} + +// GetPodDaemonSets returns a list of DaemonSets that potentially match a pod. +// Only the one specified in the Pod's ControllerRef will actually manage it. +// Returns an error only if no matching DaemonSets are found. +func (s *daemonSetLister) GetPodDaemonSets(pod *v1.Pod) ([]*apps.DaemonSet, error) { + var selector labels.Selector + var daemonSet *apps.DaemonSet + + if len(pod.Labels) == 0 { + return nil, fmt.Errorf("no daemon sets found for pod %v because it has no labels", pod.Name) + } + + list, err := s.DaemonSets(pod.Namespace).List(labels.Everything()) + if err != nil { + return nil, err + } + + var daemonSets []*apps.DaemonSet + for i := range list { + daemonSet = list[i] + if daemonSet.Namespace != pod.Namespace { + continue + } + selector, err = metav1.LabelSelectorAsSelector(daemonSet.Spec.Selector) + if err != nil { + // this should not happen if the DaemonSet passed validation + return nil, err + } + + // If a daemonSet with a nil or empty selector creeps in, it should match nothing, not everything. + if selector.Empty() || !selector.Matches(labels.Set(pod.Labels)) { + continue + } + daemonSets = append(daemonSets, daemonSet) + } + + if len(daemonSets) == 0 { + return nil, fmt.Errorf("could not find daemon set for pod %s in namespace %s with labels: %v", pod.Name, pod.Namespace, pod.Labels) + } + + return daemonSets, nil +} + +// GetHistoryDaemonSets returns a list of DaemonSets that potentially +// match a ControllerRevision. Only the one specified in the ControllerRevision's ControllerRef +// will actually manage it. +// Returns an error only if no matching DaemonSets are found. +func (s *daemonSetLister) GetHistoryDaemonSets(history *apps.ControllerRevision) ([]*apps.DaemonSet, error) { + if len(history.Labels) == 0 { + return nil, fmt.Errorf("no DaemonSet found for ControllerRevision %s because it has no labels", history.Name) + } + + list, err := s.DaemonSets(history.Namespace).List(labels.Everything()) + if err != nil { + return nil, err + } + + var daemonSets []*apps.DaemonSet + for _, ds := range list { + selector, err := metav1.LabelSelectorAsSelector(ds.Spec.Selector) + if err != nil { + return nil, fmt.Errorf("invalid label selector: %v", err) + } + // If a DaemonSet with a nil or empty selector creeps in, it should match nothing, not everything. + if selector.Empty() || !selector.Matches(labels.Set(history.Labels)) { + continue + } + daemonSets = append(daemonSets, ds) + } + + if len(daemonSets) == 0 { + return nil, fmt.Errorf("could not find DaemonSets for ControllerRevision %s in namespace %s with labels: %v", history.Name, history.Namespace, history.Labels) + } + + return daemonSets, nil +} diff --git a/staging/src/k8s.io/client-go/listers/apps/v1beta2/deployment_expansion.go b/staging/src/k8s.io/client-go/listers/apps/v1beta2/deployment_expansion.go new file mode 100644 index 0000000000000..1537167a0df6a --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/apps/v1beta2/deployment_expansion.go @@ -0,0 +1,70 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta2 + +import ( + "fmt" + + apps "k8s.io/api/apps/v1beta2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" +) + +// DeploymentListerExpansion allows custom methods to be added to +// DeploymentLister. +type DeploymentListerExpansion interface { + GetDeploymentsForReplicaSet(rs *apps.ReplicaSet) ([]*apps.Deployment, error) +} + +// DeploymentNamespaceListerExpansion allows custom methods to be added to +// DeploymentNamespaceLister. +type DeploymentNamespaceListerExpansion interface{} + +// GetDeploymentsForReplicaSet returns a list of Deployments that potentially +// match a ReplicaSet. Only the one specified in the ReplicaSet's ControllerRef +// will actually manage it. +// Returns an error only if no matching Deployments are found. +func (s *deploymentLister) GetDeploymentsForReplicaSet(rs *apps.ReplicaSet) ([]*apps.Deployment, error) { + if len(rs.Labels) == 0 { + return nil, fmt.Errorf("no deployments found for ReplicaSet %v because it has no labels", rs.Name) + } + + // TODO: MODIFY THIS METHOD so that it checks for the podTemplateSpecHash label + dList, err := s.Deployments(rs.Namespace).List(labels.Everything()) + if err != nil { + return nil, err + } + + var deployments []*apps.Deployment + for _, d := range dList { + selector, err := metav1.LabelSelectorAsSelector(d.Spec.Selector) + if err != nil { + return nil, fmt.Errorf("invalid label selector: %v", err) + } + // If a deployment with a nil or empty selector creeps in, it should match nothing, not everything. + if selector.Empty() || !selector.Matches(labels.Set(rs.Labels)) { + continue + } + deployments = append(deployments, d) + } + + if len(deployments) == 0 { + return nil, fmt.Errorf("could not find deployments set for ReplicaSet %s in namespace %s with labels: %v", rs.Name, rs.Namespace, rs.Labels) + } + + return deployments, nil +} diff --git a/staging/src/k8s.io/client-go/listers/apps/v1beta2/expansion_generated.go b/staging/src/k8s.io/client-go/listers/apps/v1beta2/expansion_generated.go index b04eda57a5852..6db63d4b09411 100644 --- a/staging/src/k8s.io/client-go/listers/apps/v1beta2/expansion_generated.go +++ b/staging/src/k8s.io/client-go/listers/apps/v1beta2/expansion_generated.go @@ -26,30 +26,6 @@ type ControllerRevisionListerExpansion interface{} // ControllerRevisionNamespaceLister. type ControllerRevisionNamespaceListerExpansion interface{} -// DaemonSetListerExpansion allows custom methods to be added to -// DaemonSetLister. -type DaemonSetListerExpansion interface{} - -// DaemonSetNamespaceListerExpansion allows custom methods to be added to -// DaemonSetNamespaceLister. -type DaemonSetNamespaceListerExpansion interface{} - -// DeploymentListerExpansion allows custom methods to be added to -// DeploymentLister. -type DeploymentListerExpansion interface{} - -// DeploymentNamespaceListerExpansion allows custom methods to be added to -// DeploymentNamespaceLister. -type DeploymentNamespaceListerExpansion interface{} - -// ReplicaSetListerExpansion allows custom methods to be added to -// ReplicaSetLister. -type ReplicaSetListerExpansion interface{} - -// ReplicaSetNamespaceListerExpansion allows custom methods to be added to -// ReplicaSetNamespaceLister. -type ReplicaSetNamespaceListerExpansion interface{} - // ScaleListerExpansion allows custom methods to be added to // ScaleLister. type ScaleListerExpansion interface{} @@ -57,11 +33,3 @@ type ScaleListerExpansion interface{} // ScaleNamespaceListerExpansion allows custom methods to be added to // ScaleNamespaceLister. type ScaleNamespaceListerExpansion interface{} - -// StatefulSetListerExpansion allows custom methods to be added to -// StatefulSetLister. -type StatefulSetListerExpansion interface{} - -// StatefulSetNamespaceListerExpansion allows custom methods to be added to -// StatefulSetNamespaceLister. -type StatefulSetNamespaceListerExpansion interface{} diff --git a/staging/src/k8s.io/client-go/listers/apps/v1beta2/replicaset_expansion.go b/staging/src/k8s.io/client-go/listers/apps/v1beta2/replicaset_expansion.go new file mode 100644 index 0000000000000..7562fe996891c --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/apps/v1beta2/replicaset_expansion.go @@ -0,0 +1,73 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta2 + +import ( + "fmt" + + apps "k8s.io/api/apps/v1beta2" + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" +) + +// ReplicaSetListerExpansion allows custom methods to be added to +// ReplicaSetLister. +type ReplicaSetListerExpansion interface { + GetPodReplicaSets(pod *v1.Pod) ([]*apps.ReplicaSet, error) +} + +// ReplicaSetNamespaceListerExpansion allows custom methods to be added to +// ReplicaSetNamespaceLister. +type ReplicaSetNamespaceListerExpansion interface{} + +// GetPodReplicaSets returns a list of ReplicaSets that potentially match a pod. +// Only the one specified in the Pod's ControllerRef will actually manage it. +// Returns an error only if no matching ReplicaSets are found. +func (s *replicaSetLister) GetPodReplicaSets(pod *v1.Pod) ([]*apps.ReplicaSet, error) { + if len(pod.Labels) == 0 { + return nil, fmt.Errorf("no ReplicaSets found for pod %v because it has no labels", pod.Name) + } + + list, err := s.ReplicaSets(pod.Namespace).List(labels.Everything()) + if err != nil { + return nil, err + } + + var rss []*apps.ReplicaSet + for _, rs := range list { + if rs.Namespace != pod.Namespace { + continue + } + selector, err := metav1.LabelSelectorAsSelector(rs.Spec.Selector) + if err != nil { + return nil, fmt.Errorf("invalid selector: %v", err) + } + + // If a ReplicaSet with a nil or empty selector creeps in, it should match nothing, not everything. + if selector.Empty() || !selector.Matches(labels.Set(pod.Labels)) { + continue + } + rss = append(rss, rs) + } + + if len(rss) == 0 { + return nil, fmt.Errorf("could not find ReplicaSet for pod %s in namespace %s with labels: %v", pod.Name, pod.Namespace, pod.Labels) + } + + return rss, nil +} diff --git a/staging/src/k8s.io/client-go/listers/apps/v1beta2/statefulset_expansion.go b/staging/src/k8s.io/client-go/listers/apps/v1beta2/statefulset_expansion.go new file mode 100644 index 0000000000000..6fa6b9144b2b1 --- /dev/null +++ b/staging/src/k8s.io/client-go/listers/apps/v1beta2/statefulset_expansion.go @@ -0,0 +1,77 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta2 + +import ( + "fmt" + + apps "k8s.io/api/apps/v1beta2" + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" +) + +// StatefulSetListerExpansion allows custom methods to be added to +// StatefulSetLister. +type StatefulSetListerExpansion interface { + GetPodStatefulSets(pod *v1.Pod) ([]*apps.StatefulSet, error) +} + +// StatefulSetNamespaceListerExpansion allows custom methods to be added to +// StatefulSetNamespaceLister. +type StatefulSetNamespaceListerExpansion interface{} + +// GetPodStatefulSets returns a list of StatefulSets that potentially match a pod. +// Only the one specified in the Pod's ControllerRef will actually manage it. +// Returns an error only if no matching StatefulSets are found. +func (s *statefulSetLister) GetPodStatefulSets(pod *v1.Pod) ([]*apps.StatefulSet, error) { + var selector labels.Selector + var ps *apps.StatefulSet + + if len(pod.Labels) == 0 { + return nil, fmt.Errorf("no StatefulSets found for pod %v because it has no labels", pod.Name) + } + + list, err := s.StatefulSets(pod.Namespace).List(labels.Everything()) + if err != nil { + return nil, err + } + + var psList []*apps.StatefulSet + for i := range list { + ps = list[i] + if ps.Namespace != pod.Namespace { + continue + } + selector, err = metav1.LabelSelectorAsSelector(ps.Spec.Selector) + if err != nil { + return nil, fmt.Errorf("invalid selector: %v", err) + } + + // If a StatefulSet with a nil or empty selector creeps in, it should match nothing, not everything. + if selector.Empty() || !selector.Matches(labels.Set(pod.Labels)) { + continue + } + psList = append(psList, ps) + } + + if len(psList) == 0 { + return nil, fmt.Errorf("could not find StatefulSet for pod %s in namespace %s with labels: %v", pod.Name, pod.Namespace, pod.Labels) + } + + return psList, nil +} From 2c129e4d6ab1bf0a8fab9e9b454e6c40ab4edcf6 Mon Sep 17 00:00:00 2001 From: Random-Liu Date: Wed, 16 Aug 2017 23:15:11 -0700 Subject: [PATCH 095/403] Add instance metadata from flag even when using image config. --- test/e2e_node/runner/remote/run_remote.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/e2e_node/runner/remote/run_remote.go b/test/e2e_node/runner/remote/run_remote.go index 14460219064a5..bf9fb7f1d4ce8 100644 --- a/test/e2e_node/runner/remote/run_remote.go +++ b/test/e2e_node/runner/remote/run_remote.go @@ -208,11 +208,15 @@ func main() { images = []string{imageConfig.Image} } for _, image := range images { + metadata := imageConfig.Metadata + if len(strings.TrimSpace(*instanceMetadata)) > 0 { + metadata += "," + *instanceMetadata + } gceImage := internalGCEImage{ image: image, imageDesc: imageConfig.ImageDesc, project: imageConfig.Project, - metadata: getImageMetadata(imageConfig.Metadata), + metadata: getImageMetadata(metadata), machine: imageConfig.Machine, tests: imageConfig.Tests, resources: imageConfig.Resources, From c5c7b33f126d6c23ae609a4e7cdee06def9a81ba Mon Sep 17 00:00:00 2001 From: Mo Khan Date: Thu, 17 Aug 2017 19:51:24 -0400 Subject: [PATCH 096/403] Add enj to OWNERS for test/integration/etcd/etcd_storage_path_test.go --- test/OWNERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/OWNERS b/test/OWNERS index 4d67671175a4d..b78c707fcaf95 100644 --- a/test/OWNERS +++ b/test/OWNERS @@ -2,6 +2,7 @@ reviewers: - bowei - deads2k - enisoc + - enj # for test/integration/etcd/etcd_storage_path_test.go - erictune - fabianofranz # for test/e2e/kubectl.go - foxish # for test/e2e/network-partition.go @@ -25,6 +26,7 @@ approvers: - bowei # for test/e2e/{dns*,network}.go - deads2k - enisoc + - enj # for test/integration/etcd/etcd_storage_path_test.go - eparis - erictune - fabianofranz # for test/e2e/kubectl.go From 9f1f83020b9fcee98300cbbc0a046240db55facc Mon Sep 17 00:00:00 2001 From: Yang Guo Date: Tue, 15 Aug 2017 18:21:58 -0700 Subject: [PATCH 097/403] Add node e2e test for Docker's live-restore --- test/e2e_node/BUILD | 1 + test/e2e_node/docker_test.go | 104 ++++++++++++++++++ test/e2e_node/docker_util.go | 54 ++++++++- test/e2e_node/gke_environment_test.go | 10 -- .../jenkins/cos-init-live-restore.yaml | 19 ++++ test/e2e_node/jenkins/image-config.yaml | 2 +- test/e2e_node/util.go | 11 ++ 7 files changed, 188 insertions(+), 13 deletions(-) create mode 100644 test/e2e_node/jenkins/cos-init-live-restore.yaml diff --git a/test/e2e_node/BUILD b/test/e2e_node/BUILD index 18841759ef41c..b8b5ef4f7432e 100644 --- a/test/e2e_node/BUILD +++ b/test/e2e_node/BUILD @@ -41,6 +41,7 @@ go_library( "//test/e2e/perftype:go_default_library", "//test/e2e_node/perftype:go_default_library", "//vendor/github.com/blang/semver:go_default_library", + "//vendor/github.com/coreos/go-systemd/util:go_default_library", "//vendor/github.com/docker/docker/client:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/client/v2:go_default_library", diff --git a/test/e2e_node/docker_test.go b/test/e2e_node/docker_test.go index 8c79604fb148e..fa5ed68e6216f 100644 --- a/test/e2e_node/docker_test.go +++ b/test/e2e_node/docker_test.go @@ -17,11 +17,16 @@ limitations under the License. package e2e_node import ( + "fmt" + "strings" + "time" + "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/test/e2e/framework" . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" ) var _ = framework.KubeDescribe("Docker features [Feature:Docker]", func() { @@ -70,4 +75,103 @@ var _ = framework.KubeDescribe("Docker features [Feature:Docker]", func() { } }) }) + + Context("when live-restore is enabled [Serial] [Slow] [Disruptive]", func() { + It("containers should not be disrupted when the daemon shuts down and restarts", func() { + const ( + podName = "live-restore-test-pod" + containerName = "live-restore-test-container" + ) + + isSupported, err := isDockerLiveRestoreSupported() + framework.ExpectNoError(err) + if !isSupported { + framework.Skipf("Docker live-restore is not supported.") + } + isEnabled, err := isDockerLiveRestoreEnabled() + framework.ExpectNoError(err) + if !isEnabled { + framework.Skipf("Docker live-restore is not enabled.") + } + + By("Create the test pod.") + pod := f.PodClient().CreateSync(&v1.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: podName}, + Spec: v1.PodSpec{ + Containers: []v1.Container{{ + Name: containerName, + Image: "gcr.io/google_containers/nginx-slim:0.7", + }}, + }, + }) + + By("Ensure that the container is running before Docker is down.") + Eventually(func() bool { + return isContainerRunning(pod.Status.PodIP) + }).Should(BeTrue()) + + startTime1, err := getContainerStartTime(f, podName, containerName) + framework.ExpectNoError(err) + + By("Stop Docker daemon.") + framework.ExpectNoError(stopDockerDaemon()) + isDockerDown := true + defer func() { + if isDockerDown { + By("Start Docker daemon.") + framework.ExpectNoError(startDockerDaemon()) + } + }() + + By("Ensure that the container is running after Docker is down.") + Consistently(func() bool { + return isContainerRunning(pod.Status.PodIP) + }).Should(BeTrue()) + + By("Start Docker daemon.") + framework.ExpectNoError(startDockerDaemon()) + isDockerDown = false + + By("Ensure that the container is running after Docker has restarted.") + Consistently(func() bool { + return isContainerRunning(pod.Status.PodIP) + }).Should(BeTrue()) + + By("Ensure that the container has not been restarted after Docker is restarted.") + Consistently(func() bool { + startTime2, err := getContainerStartTime(f, podName, containerName) + framework.ExpectNoError(err) + return startTime1 == startTime2 + }, 3*time.Second, time.Second).Should(BeTrue()) + }) + }) }) + +// isContainerRunning returns true if the container is running by checking +// whether the server is responding, and false otherwise. +func isContainerRunning(podIP string) bool { + output, err := runCommand("curl", podIP) + if err != nil { + return false + } + return strings.Contains(output, "Welcome to nginx!") +} + +// getContainerStartTime returns the start time of the container with the +// containerName of the pod having the podName. +func getContainerStartTime(f *framework.Framework, podName, containerName string) (time.Time, error) { + pod, err := f.PodClient().Get(podName, metav1.GetOptions{}) + if err != nil { + return time.Time{}, fmt.Errorf("failed to get pod %q: %v", podName, err) + } + for _, status := range pod.Status.ContainerStatuses { + if status.Name != containerName { + continue + } + if status.State.Running == nil { + return time.Time{}, fmt.Errorf("%v/%v is not running", podName, containerName) + } + return status.State.Running.StartedAt.Time, nil + } + return time.Time{}, fmt.Errorf("failed to find %v/%v", podName, containerName) +} diff --git a/test/e2e_node/docker_util.go b/test/e2e_node/docker_util.go index b8bc2497083e3..625733daf5aab 100644 --- a/test/e2e_node/docker_util.go +++ b/test/e2e_node/docker_util.go @@ -21,11 +21,13 @@ import ( "fmt" "github.com/blang/semver" + systemdutil "github.com/coreos/go-systemd/util" "github.com/docker/docker/client" ) const ( - defaultDockerEndpoint = "unix:///var/run/docker.sock" + defaultDockerEndpoint = "unix:///var/run/docker.sock" + dockerDaemonConfigName = "/etc/docker/daemon.json" ) // getDockerAPIVersion returns the Docker's API version. @@ -36,7 +38,7 @@ func getDockerAPIVersion() (semver.Version, error) { } version, err := c.ServerVersion(context.Background()) if err != nil { - return semver.Version{}, fmt.Errorf("failed to get docker info: %v", err) + return semver.Version{}, fmt.Errorf("failed to get docker server version: %v", err) } return semver.MustParse(version.APIVersion + ".0"), nil } @@ -60,3 +62,51 @@ func isDockerNoNewPrivilegesSupported() (bool, error) { } return version.GTE(semver.MustParse("1.23.0")), nil } + +// isDockerLiveRestoreSupported returns true if live-restore is supported in +// the current Docker version. +func isDockerLiveRestoreSupported() (bool, error) { + version, err := getDockerAPIVersion() + if err != nil { + return false, err + } + return version.GTE(semver.MustParse("1.26.0")), nil +} + +// isDockerLiveRestoreEnabled returns true if live-restore is enabled in the +// Docker. +func isDockerLiveRestoreEnabled() (bool, error) { + c, err := client.NewClient(defaultDockerEndpoint, "", nil, nil) + if err != nil { + return false, fmt.Errorf("failed to create docker client: %v", err) + } + info, err := c.Info(context.Background()) + if err != nil { + return false, fmt.Errorf("failed to get docker info: %v", err) + } + return info.LiveRestoreEnabled, nil +} + +// stopDockerDaemon starts the Docker daemon. +func startDockerDaemon() error { + switch { + case systemdutil.IsRunningSystemd(): + _, err := runCommand("systemctl", "start", "docker") + return err + default: + _, err := runCommand("service", "docker", "start") + return err + } +} + +// stopDockerDaemon stops the Docker daemon. +func stopDockerDaemon() error { + switch { + case systemdutil.IsRunningSystemd(): + _, err := runCommand("systemctl", "stop", "docker") + return err + default: + _, err := runCommand("service", "docker", "stop") + return err + } +} diff --git a/test/e2e_node/gke_environment_test.go b/test/e2e_node/gke_environment_test.go index 133f7647c11b0..1b48614a628fb 100644 --- a/test/e2e_node/gke_environment_test.go +++ b/test/e2e_node/gke_environment_test.go @@ -342,16 +342,6 @@ var _ = framework.KubeDescribe("GKE system requirements [Conformance] [Feature:G }) }) -// runCommand runs the cmd and returns the combined stdout and stderr, or an -// error if the command failed. -func runCommand(cmd ...string) (string, error) { - output, err := exec.Command(cmd[0], cmd[1:]...).CombinedOutput() - if err != nil { - return "", fmt.Errorf("failed to run %q: %s (%s)", strings.Join(cmd, " "), err, output) - } - return string(output), nil -} - // getPPID returns the PPID for the pid. func getPPID(pid int) (int, error) { statusFile := "/proc/" + strconv.Itoa(pid) + "/status" diff --git a/test/e2e_node/jenkins/cos-init-live-restore.yaml b/test/e2e_node/jenkins/cos-init-live-restore.yaml new file mode 100644 index 0000000000000..ccc5688679c30 --- /dev/null +++ b/test/e2e_node/jenkins/cos-init-live-restore.yaml @@ -0,0 +1,19 @@ +#cloud-config + +runcmd: + - echo '{"live-restore":true}' > /etc/docker/daemon.json + - systemctl restart docker + - mount /tmp /tmp -o remount,exec,suid + - usermod -a -G docker jenkins + - mkdir -p /var/lib/kubelet + - mkdir -p /home/kubernetes/containerized_mounter/rootfs + - mount --bind /home/kubernetes/containerized_mounter/ /home/kubernetes/containerized_mounter/ + - mount -o remount, exec /home/kubernetes/containerized_mounter/ + - wget https://storage.googleapis.com/kubernetes-release/gci-mounter/mounter.tar -O /tmp/mounter.tar + - tar xvf /tmp/mounter.tar -C /home/kubernetes/containerized_mounter/rootfs + - mkdir -p /home/kubernetes/containerized_mounter/rootfs/var/lib/kubelet + - mount --rbind /var/lib/kubelet /home/kubernetes/containerized_mounter/rootfs/var/lib/kubelet + - mount --make-rshared /home/kubernetes/containerized_mounter/rootfs/var/lib/kubelet + - mount --bind /proc /home/kubernetes/containerized_mounter/rootfs/proc + - mount --bind /dev /home/kubernetes/containerized_mounter/rootfs/dev + - rm /tmp/mounter.tar diff --git a/test/e2e_node/jenkins/image-config.yaml b/test/e2e_node/jenkins/image-config.yaml index cea4180420364..471212d80478b 100644 --- a/test/e2e_node/jenkins/image-config.yaml +++ b/test/e2e_node/jenkins/image-config.yaml @@ -19,4 +19,4 @@ images: cos-beta: image_regex: cos-beta-60-9592-70-0 # docker 1.13.1 project: cos-cloud - metadata: "user-data Date: Thu, 17 Aug 2017 20:42:46 -0400 Subject: [PATCH 098/403] Add enj as reviewer to OWNERS Adding myself as a reviewer for the following areas: - API - auth - registry - storage (etcd) Signed-off-by: Monis Khan --- pkg/apis/authentication/OWNERS | 1 + pkg/apis/authorization/OWNERS | 1 + pkg/apis/certificates/OWNERS | 1 + pkg/apis/rbac/OWNERS | 1 + pkg/auth/OWNERS | 1 + pkg/controller/serviceaccount/OWNERS | 1 + pkg/master/OWNERS | 1 + pkg/registry/OWNERS | 1 + pkg/registry/authorization/OWNERS | 1 + pkg/registry/certificates/OWNERS | 1 + pkg/registry/rbac/OWNERS | 1 + pkg/registry/registrytest/OWNERS | 1 + pkg/serviceaccount/OWNERS | 1 + plugin/pkg/admission/serviceaccount/OWNERS | 1 + plugin/pkg/auth/OWNERS | 1 + staging/src/k8s.io/api/authentication/OWNERS | 1 + staging/src/k8s.io/api/authorization/OWNERS | 1 + staging/src/k8s.io/api/certificates/OWNERS | 1 + staging/src/k8s.io/api/rbac/OWNERS | 1 + staging/src/k8s.io/apiserver/OWNERS | 1 + staging/src/k8s.io/apiserver/pkg/registry/generic/OWNERS | 1 + staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS | 1 + staging/src/k8s.io/apiserver/pkg/server/options/OWNERS | 1 + staging/src/k8s.io/apiserver/pkg/storage/OWNERS | 1 + staging/src/k8s.io/apiserver/pkg/storage/etcd/OWNERS | 1 + staging/src/k8s.io/apiserver/pkg/storage/testing/OWNERS | 1 + 26 files changed, 26 insertions(+) diff --git a/pkg/apis/authentication/OWNERS b/pkg/apis/authentication/OWNERS index 4135522b21d5f..95235234107c9 100755 --- a/pkg/apis/authentication/OWNERS +++ b/pkg/apis/authentication/OWNERS @@ -7,3 +7,4 @@ reviewers: - timothysc - mbohlool - jianhuiz +- enj diff --git a/pkg/apis/authorization/OWNERS b/pkg/apis/authorization/OWNERS index 2fef50443b652..a68d7eef5775a 100755 --- a/pkg/apis/authorization/OWNERS +++ b/pkg/apis/authorization/OWNERS @@ -15,3 +15,4 @@ reviewers: - mbohlool - david-mcmahon - jianhuiz +- enj diff --git a/pkg/apis/certificates/OWNERS b/pkg/apis/certificates/OWNERS index c67bd1172a1b3..6066d2c1218f7 100755 --- a/pkg/apis/certificates/OWNERS +++ b/pkg/apis/certificates/OWNERS @@ -12,3 +12,4 @@ reviewers: - mbohlool - david-mcmahon - jianhuiz +- enj diff --git a/pkg/apis/rbac/OWNERS b/pkg/apis/rbac/OWNERS index a35477b920d78..53710111cde18 100755 --- a/pkg/apis/rbac/OWNERS +++ b/pkg/apis/rbac/OWNERS @@ -15,3 +15,4 @@ reviewers: - lixiaobing10051267 - jianhuiz - liggitt +- enj diff --git a/pkg/auth/OWNERS b/pkg/auth/OWNERS index 8e8b9ee3776c9..2d126eacd8c39 100644 --- a/pkg/auth/OWNERS +++ b/pkg/auth/OWNERS @@ -3,3 +3,4 @@ approvers: - liggitt - deads2k reviewers: +- enj diff --git a/pkg/controller/serviceaccount/OWNERS b/pkg/controller/serviceaccount/OWNERS index 8e6172a01c674..a678215e98405 100755 --- a/pkg/controller/serviceaccount/OWNERS +++ b/pkg/controller/serviceaccount/OWNERS @@ -4,3 +4,4 @@ approvers: reviewers: - liggitt - deads2k +- enj diff --git a/pkg/master/OWNERS b/pkg/master/OWNERS index 739cc9ee46aae..afb28125c4dae 100644 --- a/pkg/master/OWNERS +++ b/pkg/master/OWNERS @@ -38,3 +38,4 @@ reviewers: - madhusudancs - hongchaodeng - jszczepkowski +- enj diff --git a/pkg/registry/OWNERS b/pkg/registry/OWNERS index 1b51832e39e70..b26edf1880dc5 100644 --- a/pkg/registry/OWNERS +++ b/pkg/registry/OWNERS @@ -37,3 +37,4 @@ reviewers: - dims - madhusudancs - hongchaodeng +- enj diff --git a/pkg/registry/authorization/OWNERS b/pkg/registry/authorization/OWNERS index 7c9eabed06954..d21ad8662fdcf 100755 --- a/pkg/registry/authorization/OWNERS +++ b/pkg/registry/authorization/OWNERS @@ -1,3 +1,4 @@ reviewers: - deads2k - liggitt +- enj diff --git a/pkg/registry/certificates/OWNERS b/pkg/registry/certificates/OWNERS index 07a69259288f4..ce89a734755bb 100755 --- a/pkg/registry/certificates/OWNERS +++ b/pkg/registry/certificates/OWNERS @@ -8,3 +8,4 @@ reviewers: - dims - hongchaodeng - david-mcmahon +- enj diff --git a/pkg/registry/rbac/OWNERS b/pkg/registry/rbac/OWNERS index 7c9eabed06954..d21ad8662fdcf 100755 --- a/pkg/registry/rbac/OWNERS +++ b/pkg/registry/rbac/OWNERS @@ -1,3 +1,4 @@ reviewers: - deads2k - liggitt +- enj diff --git a/pkg/registry/registrytest/OWNERS b/pkg/registry/registrytest/OWNERS index 2bfe9edfb7b83..c00d143160e21 100755 --- a/pkg/registry/registrytest/OWNERS +++ b/pkg/registry/registrytest/OWNERS @@ -21,3 +21,4 @@ reviewers: - ddysher - mqliang - sdminonne +- enj diff --git a/pkg/serviceaccount/OWNERS b/pkg/serviceaccount/OWNERS index 019de5ebe2443..c799f8b6ab193 100644 --- a/pkg/serviceaccount/OWNERS +++ b/pkg/serviceaccount/OWNERS @@ -6,3 +6,4 @@ reviewers: - deads2k - mikedanese - ericchiang +- enj diff --git a/plugin/pkg/admission/serviceaccount/OWNERS b/plugin/pkg/admission/serviceaccount/OWNERS index 8e6172a01c674..a678215e98405 100644 --- a/plugin/pkg/admission/serviceaccount/OWNERS +++ b/plugin/pkg/admission/serviceaccount/OWNERS @@ -4,3 +4,4 @@ approvers: reviewers: - liggitt - deads2k +- enj diff --git a/plugin/pkg/auth/OWNERS b/plugin/pkg/auth/OWNERS index ebac20047f920..3d732d11f2d96 100644 --- a/plugin/pkg/auth/OWNERS +++ b/plugin/pkg/auth/OWNERS @@ -7,3 +7,4 @@ reviewers: - liggitt - deads2k - ericchiang +- enj diff --git a/staging/src/k8s.io/api/authentication/OWNERS b/staging/src/k8s.io/api/authentication/OWNERS index 4135522b21d5f..95235234107c9 100755 --- a/staging/src/k8s.io/api/authentication/OWNERS +++ b/staging/src/k8s.io/api/authentication/OWNERS @@ -7,3 +7,4 @@ reviewers: - timothysc - mbohlool - jianhuiz +- enj diff --git a/staging/src/k8s.io/api/authorization/OWNERS b/staging/src/k8s.io/api/authorization/OWNERS index 2fef50443b652..a68d7eef5775a 100755 --- a/staging/src/k8s.io/api/authorization/OWNERS +++ b/staging/src/k8s.io/api/authorization/OWNERS @@ -15,3 +15,4 @@ reviewers: - mbohlool - david-mcmahon - jianhuiz +- enj diff --git a/staging/src/k8s.io/api/certificates/OWNERS b/staging/src/k8s.io/api/certificates/OWNERS index c67bd1172a1b3..6066d2c1218f7 100755 --- a/staging/src/k8s.io/api/certificates/OWNERS +++ b/staging/src/k8s.io/api/certificates/OWNERS @@ -12,3 +12,4 @@ reviewers: - mbohlool - david-mcmahon - jianhuiz +- enj diff --git a/staging/src/k8s.io/api/rbac/OWNERS b/staging/src/k8s.io/api/rbac/OWNERS index a35477b920d78..53710111cde18 100755 --- a/staging/src/k8s.io/api/rbac/OWNERS +++ b/staging/src/k8s.io/api/rbac/OWNERS @@ -15,3 +15,4 @@ reviewers: - lixiaobing10051267 - jianhuiz - liggitt +- enj diff --git a/staging/src/k8s.io/apiserver/OWNERS b/staging/src/k8s.io/apiserver/OWNERS index e4525fc6b7f96..52f250446a3b7 100644 --- a/staging/src/k8s.io/apiserver/OWNERS +++ b/staging/src/k8s.io/apiserver/OWNERS @@ -15,3 +15,4 @@ reviewers: - ncdc - tallclair - timothysc +- enj diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/OWNERS b/staging/src/k8s.io/apiserver/pkg/registry/generic/OWNERS index 00811f8ffb14d..429b15e49b890 100755 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/OWNERS +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/OWNERS @@ -32,3 +32,4 @@ reviewers: - feihujiang - sdminonne - goltermann +- enj diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS b/staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS index 313ee7c5a9dc1..e9de724aa6b74 100755 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS @@ -31,3 +31,4 @@ reviewers: - feihujiang - sdminonne - goltermann +- enj diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/OWNERS b/staging/src/k8s.io/apiserver/pkg/server/options/OWNERS index c9e6b138ef464..6371177fcfc06 100755 --- a/staging/src/k8s.io/apiserver/pkg/server/options/OWNERS +++ b/staging/src/k8s.io/apiserver/pkg/server/options/OWNERS @@ -12,3 +12,4 @@ reviewers: - ericchiang - ping035627 - xiangpengzhao +- enj diff --git a/staging/src/k8s.io/apiserver/pkg/storage/OWNERS b/staging/src/k8s.io/apiserver/pkg/storage/OWNERS index 1ab7d48c54527..b7bff4f12f703 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/OWNERS +++ b/staging/src/k8s.io/apiserver/pkg/storage/OWNERS @@ -27,3 +27,4 @@ reviewers: - mqliang - feihujiang - rrati +- enj diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd/OWNERS b/staging/src/k8s.io/apiserver/pkg/storage/etcd/OWNERS index a1ca07ed9ecbb..a0654988307e9 100755 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd/OWNERS +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd/OWNERS @@ -22,3 +22,4 @@ reviewers: - pweil- - mqliang - feihujiang +- enj diff --git a/staging/src/k8s.io/apiserver/pkg/storage/testing/OWNERS b/staging/src/k8s.io/apiserver/pkg/storage/testing/OWNERS index 604c717180b11..ff5dd0da818a8 100755 --- a/staging/src/k8s.io/apiserver/pkg/storage/testing/OWNERS +++ b/staging/src/k8s.io/apiserver/pkg/storage/testing/OWNERS @@ -7,3 +7,4 @@ reviewers: - soltysh - mml - feihujiang +- enj From a8c68d9211a3d6aa2e1b555c447f20a888036e73 Mon Sep 17 00:00:00 2001 From: zhengjiajin Date: Fri, 18 Aug 2017 09:39:07 +0800 Subject: [PATCH 099/403] add cmd test kubectl set image --- hack/make-rules/test-cmd-util.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index a490624e16ab1..1c3d8267cabe9 100644 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -2836,6 +2836,10 @@ run_deployment_tests() { kubectl set image deployment nginx-deployment "*"="${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]}" kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + # Set image of all containners of the deployment again when image not change + kubectl set image deployment nginx-deployment "*"="${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]}" + kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" # Clean up kubectl delete deployment nginx-deployment "${kube_flags[@]}" From a909cc8af515314c481422d6ab0d60a8253e3d99 Mon Sep 17 00:00:00 2001 From: tengqm Date: Thu, 17 Aug 2017 20:33:11 +0800 Subject: [PATCH 100/403] Fix admission plugin registration The current registration of admission plug-ins happen too late so the command line help is not yielding correct/useful information to users. This is already causing confusion as mentioned in some issues. This patch fixes it by moving plugins.go down to options package because "plugins" in this context are themselves options for users. Registration of plugins is not an expensive operation and it is already done in most execution paths. In future, we may want to revisit these plugins and migrate them to the shared apiserver repo when appropriate. --- cmd/kube-apiserver/app/BUILD | 27 ------------------ cmd/kube-apiserver/app/options/BUILD | 28 +++++++++++++++++++ cmd/kube-apiserver/app/options/options.go | 3 ++ .../app/{ => options}/plugins.go | 2 +- cmd/kube-apiserver/app/server.go | 3 -- 5 files changed, 32 insertions(+), 31 deletions(-) rename cmd/kube-apiserver/app/{ => options}/plugins.go (99%) diff --git a/cmd/kube-apiserver/app/BUILD b/cmd/kube-apiserver/app/BUILD index 48b7925eff759..563922ce5cbc2 100644 --- a/cmd/kube-apiserver/app/BUILD +++ b/cmd/kube-apiserver/app/BUILD @@ -10,7 +10,6 @@ go_library( srcs = [ "aggregator.go", "apiextensions.go", - "plugins.go", "server.go", ], deps = [ @@ -24,7 +23,6 @@ go_library( "//pkg/client/clientset_generated/internalclientset:go_default_library", "//pkg/client/informers/informers_generated/internalversion:go_default_library", "//pkg/cloudprovider:go_default_library", - "//pkg/cloudprovider/providers:go_default_library", "//pkg/controller/serviceaccount:go_default_library", "//pkg/generated/openapi:go_default_library", "//pkg/kubeapiserver:go_default_library", @@ -42,31 +40,6 @@ go_library( "//pkg/util/reflector/prometheus:go_default_library", "//pkg/util/workqueue/prometheus:go_default_library", "//pkg/version:go_default_library", - "//plugin/pkg/admission/admit:go_default_library", - "//plugin/pkg/admission/alwayspullimages:go_default_library", - "//plugin/pkg/admission/antiaffinity:go_default_library", - "//plugin/pkg/admission/defaulttolerationseconds:go_default_library", - "//plugin/pkg/admission/deny:go_default_library", - "//plugin/pkg/admission/exec:go_default_library", - "//plugin/pkg/admission/gc:go_default_library", - "//plugin/pkg/admission/imagepolicy:go_default_library", - "//plugin/pkg/admission/initialization:go_default_library", - "//plugin/pkg/admission/initialresources:go_default_library", - "//plugin/pkg/admission/limitranger:go_default_library", - "//plugin/pkg/admission/namespace/autoprovision:go_default_library", - "//plugin/pkg/admission/namespace/exists:go_default_library", - "//plugin/pkg/admission/noderestriction:go_default_library", - "//plugin/pkg/admission/persistentvolume/label:go_default_library", - "//plugin/pkg/admission/podnodeselector:go_default_library", - "//plugin/pkg/admission/podpreset:go_default_library", - "//plugin/pkg/admission/podtolerationrestriction:go_default_library", - "//plugin/pkg/admission/priority:go_default_library", - "//plugin/pkg/admission/resourcequota:go_default_library", - "//plugin/pkg/admission/security/podsecuritypolicy:go_default_library", - "//plugin/pkg/admission/securitycontext/scdeny:go_default_library", - "//plugin/pkg/admission/serviceaccount:go_default_library", - "//plugin/pkg/admission/storageclass/setdefault:go_default_library", - "//plugin/pkg/admission/webhook:go_default_library", "//plugin/pkg/auth/authenticator/token/bootstrap:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/cmd/kube-apiserver/app/options/BUILD b/cmd/kube-apiserver/app/options/BUILD index 6e5b3d199632b..24b91cd21f16a 100644 --- a/cmd/kube-apiserver/app/options/BUILD +++ b/cmd/kube-apiserver/app/options/BUILD @@ -10,17 +10,45 @@ go_library( name = "go_default_library", srcs = [ "options.go", + "plugins.go", "validation.go", ], deps = [ "//pkg/api:go_default_library", "//pkg/api/validation:go_default_library", + "//pkg/cloudprovider/providers:go_default_library", "//pkg/features:go_default_library", "//pkg/kubeapiserver/options:go_default_library", "//pkg/kubelet/client:go_default_library", "//pkg/master/ports:go_default_library", + "//plugin/pkg/admission/admit:go_default_library", + "//plugin/pkg/admission/alwayspullimages:go_default_library", + "//plugin/pkg/admission/antiaffinity:go_default_library", + "//plugin/pkg/admission/defaulttolerationseconds:go_default_library", + "//plugin/pkg/admission/deny:go_default_library", + "//plugin/pkg/admission/exec:go_default_library", + "//plugin/pkg/admission/gc:go_default_library", + "//plugin/pkg/admission/imagepolicy:go_default_library", + "//plugin/pkg/admission/initialization:go_default_library", + "//plugin/pkg/admission/initialresources:go_default_library", + "//plugin/pkg/admission/limitranger:go_default_library", + "//plugin/pkg/admission/namespace/autoprovision:go_default_library", + "//plugin/pkg/admission/namespace/exists:go_default_library", + "//plugin/pkg/admission/noderestriction:go_default_library", + "//plugin/pkg/admission/persistentvolume/label:go_default_library", + "//plugin/pkg/admission/podnodeselector:go_default_library", + "//plugin/pkg/admission/podpreset:go_default_library", + "//plugin/pkg/admission/podtolerationrestriction:go_default_library", + "//plugin/pkg/admission/priority:go_default_library", + "//plugin/pkg/admission/resourcequota:go_default_library", + "//plugin/pkg/admission/security/podsecuritypolicy:go_default_library", + "//plugin/pkg/admission/securitycontext/scdeny:go_default_library", + "//plugin/pkg/admission/serviceaccount:go_default_library", + "//plugin/pkg/admission/storageclass/setdefault:go_default_library", + "//plugin/pkg/admission/webhook:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/options:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", ], diff --git a/cmd/kube-apiserver/app/options/options.go b/cmd/kube-apiserver/app/options/options.go index c9daf9da33762..31cc05294340f 100644 --- a/cmd/kube-apiserver/app/options/options.go +++ b/cmd/kube-apiserver/app/options/options.go @@ -113,6 +113,9 @@ func NewServerRunOptions() *ServerRunOptions { } // Overwrite the default for storage data format. s.Etcd.DefaultStorageMediaType = "application/vnd.kubernetes.protobuf" + + // register all admission plugins + RegisterAllAdmissionPlugins(s.Admission.Plugins) // Set the default for admission plugins names s.Admission.PluginNames = []string{"AlwaysAdmit"} return &s diff --git a/cmd/kube-apiserver/app/plugins.go b/cmd/kube-apiserver/app/options/plugins.go similarity index 99% rename from cmd/kube-apiserver/app/plugins.go rename to cmd/kube-apiserver/app/options/plugins.go index 06e21d5a5f0ce..7d0e8bb04a304 100644 --- a/cmd/kube-apiserver/app/plugins.go +++ b/cmd/kube-apiserver/app/options/plugins.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package app +package options // This file exists to force the desired plugin implementations to be linked. // This should probably be part of some configuration fed into the build for a diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index 7d0e9a1fc2483..95a201daa002c 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -249,9 +249,6 @@ func CreateNodeDialer(s *options.ServerRunOptions) (tunneler.Tunneler, *http.Tra // CreateKubeAPIServerConfig creates all the resources for running the API server, but runs none of them func CreateKubeAPIServerConfig(s *options.ServerRunOptions, nodeTunneler tunneler.Tunneler, proxyTransport http.RoundTripper) (*master.Config, informers.SharedInformerFactory, clientgoinformers.SharedInformerFactory, *kubeserver.InsecureServingInfo, aggregatorapiserver.ServiceResolver, error) { - // register all admission plugins - RegisterAllAdmissionPlugins(s.Admission.Plugins) - // set defaults in the options before trying to create the generic config if err := defaultOptions(s); err != nil { return nil, nil, nil, nil, nil, err From 85602fd5428efe4f6e08b7a540d06425ea6f4e2c Mon Sep 17 00:00:00 2001 From: Di Xu Date: Sun, 13 Aug 2017 20:10:25 +0800 Subject: [PATCH 101/403] CollisionCount should have type int32 across controllers that use it for collision avoidance --- pkg/apis/apps/fuzzer/fuzzer.go | 2 +- pkg/apis/apps/types.go | 2 +- pkg/apis/apps/v1beta2/conversion.go | 4 ++-- pkg/apis/apps/validation/validation_test.go | 9 +++++---- pkg/apis/extensions/types.go | 4 ++-- pkg/apis/extensions/validation/validation.go | 8 ++++---- .../extensions/validation/validation_test.go | 19 +++++++++++-------- pkg/controller/controller_utils.go | 4 ++-- pkg/controller/controller_utils_test.go | 13 ++++++++----- pkg/controller/daemon/update.go | 2 +- pkg/controller/deployment/sync.go | 4 ++-- .../deployment/util/replicaset_util.go | 2 +- staging/src/k8s.io/api/apps/v1beta1/types.go | 4 ++-- staging/src/k8s.io/api/apps/v1beta2/types.go | 6 +++--- .../k8s.io/api/extensions/v1beta1/types.go | 4 ++-- test/e2e/apps/deployment.go | 2 +- 16 files changed, 48 insertions(+), 41 deletions(-) diff --git a/pkg/apis/apps/fuzzer/fuzzer.go b/pkg/apis/apps/fuzzer/fuzzer.go index beb97dc168474..8013a273b015a 100644 --- a/pkg/apis/apps/fuzzer/fuzzer.go +++ b/pkg/apis/apps/fuzzer/fuzzer.go @@ -44,7 +44,7 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { s.Status.ObservedGeneration = new(int64) } if s.Status.CollisionCount == nil { - s.Status.CollisionCount = new(int64) + s.Status.CollisionCount = new(int32) } }, } diff --git a/pkg/apis/apps/types.go b/pkg/apis/apps/types.go index 9841c2ab4f6fc..5e2b010c73012 100644 --- a/pkg/apis/apps/types.go +++ b/pkg/apis/apps/types.go @@ -192,7 +192,7 @@ type StatefulSetStatus struct { // uses this field as a collision avoidance mechanism when it needs to create the name for the // newest ControllerRevision. // +optional - CollisionCount *int64 + CollisionCount *int32 } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/apis/apps/v1beta2/conversion.go b/pkg/apis/apps/v1beta2/conversion.go index 01eb4528920b4..2e130eb2cd960 100644 --- a/pkg/apis/apps/v1beta2/conversion.go +++ b/pkg/apis/apps/v1beta2/conversion.go @@ -244,7 +244,7 @@ func Convert_v1beta2_StatefulSetStatus_To_apps_StatefulSetStatus(in *appsv1beta2 out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision if in.CollisionCount != nil { - out.CollisionCount = new(int64) + out.CollisionCount = new(int32) *out.CollisionCount = *in.CollisionCount } return nil @@ -261,7 +261,7 @@ func Convert_apps_StatefulSetStatus_To_v1beta2_StatefulSetStatus(in *apps.Statef out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision if in.CollisionCount != nil { - out.CollisionCount = new(int64) + out.CollisionCount = new(int32) *out.CollisionCount = *in.CollisionCount } return nil diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 9071fa189f0a7..aeee6b391c8d1 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -302,7 +302,8 @@ func TestValidateStatefulSet(t *testing.T) { } func TestValidateStatefulSetStatus(t *testing.T) { - minusOne := int64(-1) + observedGenerationMinusOne := int64(-1) + collisionCountMinusOne := int32(-1) tests := []struct { name string replicas int32 @@ -310,7 +311,7 @@ func TestValidateStatefulSetStatus(t *testing.T) { currentReplicas int32 updatedReplicas int32 observedGeneration *int64 - collisionCount *int64 + collisionCount *int32 expectedErr bool }{ { @@ -359,7 +360,7 @@ func TestValidateStatefulSetStatus(t *testing.T) { readyReplicas: 3, currentReplicas: 2, updatedReplicas: 1, - observedGeneration: &minusOne, + observedGeneration: &observedGenerationMinusOne, expectedErr: true, }, { @@ -368,7 +369,7 @@ func TestValidateStatefulSetStatus(t *testing.T) { readyReplicas: 3, currentReplicas: 2, updatedReplicas: 1, - collisionCount: &minusOne, + collisionCount: &collisionCountMinusOne, expectedErr: true, }, { diff --git a/pkg/apis/extensions/types.go b/pkg/apis/extensions/types.go index 8e60c6f9ed949..55511f96f1349 100644 --- a/pkg/apis/extensions/types.go +++ b/pkg/apis/extensions/types.go @@ -345,7 +345,7 @@ type DeploymentStatus struct { // field as a collision avoidance mechanism when it needs to create the name for the // newest ReplicaSet. // +optional - CollisionCount *int64 + CollisionCount *int32 } type DeploymentConditionType string @@ -519,7 +519,7 @@ type DaemonSetStatus struct { // uses this field as a collision avoidance mechanism when it needs to // create the name for the newest ControllerRevision. // +optional - CollisionCount *int64 + CollisionCount *int32 } // +genclient diff --git a/pkg/apis/extensions/validation/validation.go b/pkg/apis/extensions/validation/validation.go index d145fd421fb50..6696d0b195e0b 100644 --- a/pkg/apis/extensions/validation/validation.go +++ b/pkg/apis/extensions/validation/validation.go @@ -95,7 +95,7 @@ func ValidateDaemonSetStatusUpdate(ds, oldDS *extensions.DaemonSet) field.ErrorL allErrs := apivalidation.ValidateObjectMetaUpdate(&ds.ObjectMeta, &oldDS.ObjectMeta, field.NewPath("metadata")) allErrs = append(allErrs, validateDaemonSetStatus(&ds.Status, field.NewPath("status"))...) if isDecremented(ds.Status.CollisionCount, oldDS.Status.CollisionCount) { - value := int64(0) + value := int32(0) if ds.Status.CollisionCount != nil { value = *ds.Status.CollisionCount } @@ -311,7 +311,7 @@ func ValidateDeploymentStatus(status *extensions.DeploymentStatus, fldPath *fiel allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.AvailableReplicas), fldPath.Child("availableReplicas"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.UnavailableReplicas), fldPath.Child("unavailableReplicas"))...) if status.CollisionCount != nil { - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(*status.CollisionCount, fldPath.Child("collisionCount"))...) + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*status.CollisionCount), fldPath.Child("collisionCount"))...) } msg := "cannot be greater than status.replicas" if status.UpdatedReplicas > status.Replicas { @@ -342,7 +342,7 @@ func ValidateDeploymentStatusUpdate(update, old *extensions.Deployment) field.Er fldPath := field.NewPath("status") allErrs = append(allErrs, ValidateDeploymentStatus(&update.Status, fldPath)...) if isDecremented(update.Status.CollisionCount, old.Status.CollisionCount) { - value := int64(0) + value := int32(0) if update.Status.CollisionCount != nil { value = *update.Status.CollisionCount } @@ -352,7 +352,7 @@ func ValidateDeploymentStatusUpdate(update, old *extensions.Deployment) field.Er } // TODO: Move in "k8s.io/kubernetes/pkg/api/validation" -func isDecremented(update, old *int64) bool { +func isDecremented(update, old *int32) bool { if update == nil && old != nil { return true } diff --git a/pkg/apis/extensions/validation/validation_test.go b/pkg/apis/extensions/validation/validation_test.go index 5e6c6df8ee219..0afd286dcca0e 100644 --- a/pkg/apis/extensions/validation/validation_test.go +++ b/pkg/apis/extensions/validation/validation_test.go @@ -1238,6 +1238,7 @@ func int64p(i int) *int64 { } func TestValidateDeploymentStatus(t *testing.T) { + collisionCount := int32(-3) tests := []struct { name string @@ -1246,7 +1247,7 @@ func TestValidateDeploymentStatus(t *testing.T) { readyReplicas int32 availableReplicas int32 observedGeneration int64 - collisionCount *int64 + collisionCount *int32 expectedErr bool }{ @@ -1347,7 +1348,7 @@ func TestValidateDeploymentStatus(t *testing.T) { name: "invalid collisionCount", replicas: 3, observedGeneration: 1, - collisionCount: int64p(-3), + collisionCount: &collisionCount, expectedErr: true, }, } @@ -1371,6 +1372,8 @@ func TestValidateDeploymentStatus(t *testing.T) { } func TestValidateDeploymentStatusUpdate(t *testing.T) { + collisionCount := int32(1) + otherCollisionCount := int32(2) tests := []struct { name string @@ -1384,24 +1387,24 @@ func TestValidateDeploymentStatusUpdate(t *testing.T) { CollisionCount: nil, }, to: extensions.DeploymentStatus{ - CollisionCount: int64p(1), + CollisionCount: &collisionCount, }, expectedErr: false, }, { name: "stable: valid update", from: extensions.DeploymentStatus{ - CollisionCount: int64p(1), + CollisionCount: &collisionCount, }, to: extensions.DeploymentStatus{ - CollisionCount: int64p(1), + CollisionCount: &collisionCount, }, expectedErr: false, }, { name: "unset: invalid update", from: extensions.DeploymentStatus{ - CollisionCount: int64p(1), + CollisionCount: &collisionCount, }, to: extensions.DeploymentStatus{ CollisionCount: nil, @@ -1411,10 +1414,10 @@ func TestValidateDeploymentStatusUpdate(t *testing.T) { { name: "decrease: invalid update", from: extensions.DeploymentStatus{ - CollisionCount: int64p(2), + CollisionCount: &otherCollisionCount, }, to: extensions.DeploymentStatus{ - CollisionCount: int64p(1), + CollisionCount: &collisionCount, }, expectedErr: true, }, diff --git a/pkg/controller/controller_utils.go b/pkg/controller/controller_utils.go index d331ccf3f6ed6..f0ec6943bf2b0 100644 --- a/pkg/controller/controller_utils.go +++ b/pkg/controller/controller_utils.go @@ -1030,14 +1030,14 @@ func WaitForCacheSync(controllerName string, stopCh <-chan struct{}, cacheSyncs } // ComputeHash returns a hash value calculated from pod template and a collisionCount to avoid hash collision -func ComputeHash(template *v1.PodTemplateSpec, collisionCount *int64) uint32 { +func ComputeHash(template *v1.PodTemplateSpec, collisionCount *int32) uint32 { podTemplateSpecHasher := fnv.New32a() hashutil.DeepHashObject(podTemplateSpecHasher, *template) // Add collisionCount in the hash if it exists. if collisionCount != nil { collisionCountBytes := make([]byte, 8) - binary.LittleEndian.PutUint64(collisionCountBytes, uint64(*collisionCount)) + binary.LittleEndian.PutUint32(collisionCountBytes, uint32(*collisionCount)) podTemplateSpecHasher.Write(collisionCountBytes) } diff --git a/pkg/controller/controller_utils_test.go b/pkg/controller/controller_utils_test.go index 0b3842c53834d..a72359585fafe 100644 --- a/pkg/controller/controller_utils_test.go +++ b/pkg/controller/controller_utils_test.go @@ -453,23 +453,26 @@ func int64P(num int64) *int64 { } func TestComputeHash(t *testing.T) { + collisionCount := int32(1) + otherCollisionCount := int32(2) + maxCollisionCount := int32(math.MaxInt32) tests := []struct { name string template *v1.PodTemplateSpec - collisionCount *int64 - otherCollisionCount *int64 + collisionCount *int32 + otherCollisionCount *int32 }{ { name: "simple", template: &v1.PodTemplateSpec{}, - collisionCount: int64P(1), - otherCollisionCount: int64P(2), + collisionCount: &collisionCount, + otherCollisionCount: &otherCollisionCount, }, { name: "using math.MaxInt64", template: &v1.PodTemplateSpec{}, collisionCount: nil, - otherCollisionCount: int64P(int64(math.MaxInt64)), + otherCollisionCount: &maxCollisionCount, }, } diff --git a/pkg/controller/daemon/update.go b/pkg/controller/daemon/update.go index 72486594f0e84..49ff90ce787be 100644 --- a/pkg/controller/daemon/update.go +++ b/pkg/controller/daemon/update.go @@ -368,7 +368,7 @@ func (dsc *DaemonSetsController) snapshot(ds *extensions.DaemonSet, revision int return nil, getErr } if currDS.Status.CollisionCount == nil { - currDS.Status.CollisionCount = new(int64) + currDS.Status.CollisionCount = new(int32) } *currDS.Status.CollisionCount++ _, updateErr := dsc.kubeClient.ExtensionsV1beta1().DaemonSets(ds.Namespace).UpdateStatus(currDS) diff --git a/pkg/controller/deployment/sync.go b/pkg/controller/deployment/sync.go index a1a85a5a8f708..3731f21d32979 100644 --- a/pkg/controller/deployment/sync.go +++ b/pkg/controller/deployment/sync.go @@ -160,7 +160,7 @@ func (dc *DeploymentController) rsAndPodsWithHashKeySynced(d *extensions.Deploym // 1. Add hash label to the rs's pod template, and make sure the controller sees this update so that no orphaned pods will be created // 2. Add hash label to all pods this rs owns, wait until replicaset controller reports rs.Status.FullyLabeledReplicas equal to the desired number of replicas // 3. Add hash label to the rs's label and selector -func (dc *DeploymentController) addHashKeyToRSAndPods(rs *extensions.ReplicaSet, podList *v1.PodList, collisionCount *int64) (*extensions.ReplicaSet, error) { +func (dc *DeploymentController) addHashKeyToRSAndPods(rs *extensions.ReplicaSet, podList *v1.PodList, collisionCount *int32) (*extensions.ReplicaSet, error) { // If the rs already has the new hash label in its selector, it's done syncing if labelsutil.SelectorHasLabel(rs.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey) { return rs, nil @@ -349,7 +349,7 @@ func (dc *DeploymentController) getNewReplicaSet(d *extensions.Deployment, rsLis // and requeue the Deployment. if !isEqual { if d.Status.CollisionCount == nil { - d.Status.CollisionCount = new(int64) + d.Status.CollisionCount = new(int32) } preCollisionCount := *d.Status.CollisionCount *d.Status.CollisionCount++ diff --git a/pkg/controller/deployment/util/replicaset_util.go b/pkg/controller/deployment/util/replicaset_util.go index f2a2fad1cf222..0b7c0d36917a7 100644 --- a/pkg/controller/deployment/util/replicaset_util.go +++ b/pkg/controller/deployment/util/replicaset_util.go @@ -70,7 +70,7 @@ func UpdateRSWithRetries(rsClient unversionedextensions.ReplicaSetInterface, rsL } // GetReplicaSetHash returns the pod template hash of a ReplicaSet's pod template space -func GetReplicaSetHash(rs *extensions.ReplicaSet, uniquifier *int64) (string, error) { +func GetReplicaSetHash(rs *extensions.ReplicaSet, uniquifier *int32) (string, error) { template, err := scheme.Scheme.DeepCopy(rs.Spec.Template) if err != nil { return "", err diff --git a/staging/src/k8s.io/api/apps/v1beta1/types.go b/staging/src/k8s.io/api/apps/v1beta1/types.go index 6ff3f8fdee194..36ac1e4229626 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/types.go +++ b/staging/src/k8s.io/api/apps/v1beta1/types.go @@ -244,7 +244,7 @@ type StatefulSetStatus struct { // uses this field as a collision avoidance mechanism when it needs to create the name for the // newest ControllerRevision. // +optional - CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` + CollisionCount *int32 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -445,7 +445,7 @@ type DeploymentStatus struct { // field as a collision avoidance mechanism when it needs to create the name for the // newest ReplicaSet. // +optional - CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` + CollisionCount *int32 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` } type DeploymentConditionType string diff --git a/staging/src/k8s.io/api/apps/v1beta2/types.go b/staging/src/k8s.io/api/apps/v1beta2/types.go index d040d3de2a005..f1bebdccfa7d0 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/types.go +++ b/staging/src/k8s.io/api/apps/v1beta2/types.go @@ -251,7 +251,7 @@ type StatefulSetStatus struct { // uses this field as a collision avoidance mechanism when it needs to create the name for the // newest ControllerRevision. // +optional - CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` + CollisionCount *int32 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -425,7 +425,7 @@ type DeploymentStatus struct { // field as a collision avoidance mechanism when it needs to create the name for the // newest ReplicaSet. // +optional - CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` + CollisionCount *int32 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` } type DeploymentConditionType string @@ -598,7 +598,7 @@ type DaemonSetStatus struct { // uses this field as a collision avoidance mechanism when it needs to // create the name for the newest ControllerRevision. // +optional - CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` + CollisionCount *int32 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` } // +genclient diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types.go b/staging/src/k8s.io/api/extensions/v1beta1/types.go index 98bd22488c5bb..11300661fb10f 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types.go @@ -345,7 +345,7 @@ type DeploymentStatus struct { // field as a collision avoidance mechanism when it needs to create the name for the // newest ReplicaSet. // +optional - CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` + CollisionCount *int32 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` } type DeploymentConditionType string @@ -524,7 +524,7 @@ type DaemonSetStatus struct { // uses this field as a collision avoidance mechanism when it needs to // create the name for the newest ControllerRevision. // +optional - CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` + CollisionCount *int32 `json:"collisionCount,omitempty" protobuf:"varint,9,opt,name=collisionCount"` } // +genclient diff --git a/test/e2e/apps/deployment.go b/test/e2e/apps/deployment.go index 7ba00e199781e..79e723ef1f72d 100644 --- a/test/e2e/apps/deployment.go +++ b/test/e2e/apps/deployment.go @@ -1449,7 +1449,7 @@ func testDeploymentHashCollisionAvoidance(f *framework.Framework) { return false, nil } framework.Logf(spew.Sprintf("deployment status: %#v", d.Status)) - return d.Status.CollisionCount != nil && *d.Status.CollisionCount == int64(1), nil + return d.Status.CollisionCount != nil && *d.Status.CollisionCount == int32(1), nil }); err != nil { framework.Failf("Failed to increment collision counter for deployment %q: %v", deploymentName, err) } From b36320beb1878e3ca6ddc7b814492884edf68ff6 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Fri, 18 Aug 2017 11:07:35 +0800 Subject: [PATCH 102/403] auto-gen --- api/openapi-spec/swagger.json | 14 +- api/swagger-spec/apps_v1beta1.json | 4 +- api/swagger-spec/apps_v1beta2.json | 6 +- api/swagger-spec/extensions_v1beta1.json | 4 +- .../apps/v1beta1/definitions.html | 4 +- .../apps/v1beta2/definitions.html | 6 +- .../extensions/v1beta1/definitions.html | 4 +- federation/apis/openapi-spec/swagger.json | 4 +- .../apis/swagger-spec/extensions_v1beta1.json | 4 +- .../extensions/v1beta1/definitions.html | 4 +- .../apps/v1beta1/zz_generated.conversion.go | 8 +- .../apps/v1beta2/zz_generated.conversion.go | 12 +- pkg/apis/apps/zz_generated.deepcopy.go | 2 +- .../v1beta1/zz_generated.conversion.go | 8 +- pkg/apis/extensions/zz_generated.deepcopy.go | 4 +- .../k8s.io/api/apps/v1beta1/generated.pb.go | 236 ++++++------- .../k8s.io/api/apps/v1beta1/generated.proto | 4 +- .../api/apps/v1beta1/types.generated.go | 16 +- .../api/apps/v1beta1/zz_generated.deepcopy.go | 4 +- .../k8s.io/api/apps/v1beta2/generated.pb.go | 266 +++++++-------- .../k8s.io/api/apps/v1beta2/generated.proto | 6 +- .../api/apps/v1beta2/zz_generated.deepcopy.go | 6 +- .../api/extensions/v1beta1/generated.pb.go | 316 +++++++++--------- .../api/extensions/v1beta1/generated.proto | 4 +- .../api/extensions/v1beta1/types.generated.go | 16 +- .../v1beta1/zz_generated.deepcopy.go | 4 +- 26 files changed, 483 insertions(+), 483 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index ec76397775af5..82b161ba2574d 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -55087,7 +55087,7 @@ "collisionCount": { "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", "type": "integer", - "format": "int64" + "format": "int32" }, "conditions": { "description": "Represents the latest available observations of a deployment's current state.", @@ -55355,7 +55355,7 @@ "collisionCount": { "description": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", "type": "integer", - "format": "int64" + "format": "int32" }, "currentReplicas": { "description": "currentReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by currentRevision.", @@ -55583,7 +55583,7 @@ "collisionCount": { "description": "Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", "type": "integer", - "format": "int64" + "format": "int32" }, "currentNumberScheduled": { "description": "The number of nodes that are running at least 1 daemon pod and are supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/", @@ -55794,7 +55794,7 @@ "collisionCount": { "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", "type": "integer", - "format": "int64" + "format": "int32" }, "conditions": { "description": "Represents the latest available observations of a deployment's current state.", @@ -56221,7 +56221,7 @@ "collisionCount": { "description": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", "type": "integer", - "format": "int64" + "format": "int32" }, "currentReplicas": { "description": "currentReplicas is the number of Pods created by the StatefulSet controller from the StatefulSet version indicated by currentRevision.", @@ -62440,7 +62440,7 @@ "collisionCount": { "description": "Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", "type": "integer", - "format": "int64" + "format": "int32" }, "currentNumberScheduled": { "description": "The number of nodes that are running at least 1 daemon pod and are supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/", @@ -62693,7 +62693,7 @@ "collisionCount": { "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", "type": "integer", - "format": "int64" + "format": "int32" }, "conditions": { "description": "Represents the latest available observations of a deployment's current state.", diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 1f99ebc6bfac7..516390e48dccd 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -5909,7 +5909,7 @@ }, "collisionCount": { "type": "integer", - "format": "int64", + "format": "int32", "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet." } } @@ -6282,7 +6282,7 @@ }, "collisionCount": { "type": "integer", - "format": "int64", + "format": "int32", "description": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision." } } diff --git a/api/swagger-spec/apps_v1beta2.json b/api/swagger-spec/apps_v1beta2.json index 07913f99aca54..5c721df4b40df 100644 --- a/api/swagger-spec/apps_v1beta2.json +++ b/api/swagger-spec/apps_v1beta2.json @@ -8041,7 +8041,7 @@ }, "collisionCount": { "type": "integer", - "format": "int64", + "format": "int32", "description": "Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision." } } @@ -8216,7 +8216,7 @@ }, "collisionCount": { "type": "integer", - "format": "int64", + "format": "int32", "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet." } } @@ -8708,7 +8708,7 @@ }, "collisionCount": { "type": "integer", - "format": "int64", + "format": "int32", "description": "collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision." } } diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index 28fbd8d968b61..138f899914f34 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -8594,7 +8594,7 @@ }, "collisionCount": { "type": "integer", - "format": "int64", + "format": "int32", "description": "Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision." } } @@ -8853,7 +8853,7 @@ }, "collisionCount": { "type": "integer", - "format": "int64", + "format": "int32", "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet." } } diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index af1f8e3447d85..3b8ab4ae8bf00 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -476,7 +476,7 @@

v1beta1.DeploymentStatus

collisionCount

Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.

false

-

integer (int64)

+

integer (int32)

@@ -5139,7 +5139,7 @@

v1beta1.StatefulSetStatus

collisionCount

collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.

false

-

integer (int64)

+

integer (int32)

diff --git a/docs/api-reference/apps/v1beta2/definitions.html b/docs/api-reference/apps/v1beta2/definitions.html index 2cbc82b45ca6c..b70697b5be14f 100755 --- a/docs/api-reference/apps/v1beta2/definitions.html +++ b/docs/api-reference/apps/v1beta2/definitions.html @@ -1653,7 +1653,7 @@

v1beta2.StatefulSetStatus

collisionCount

collisionCount is the count of hash collisions for the StatefulSet. The StatefulSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.

false

-

integer (int64)

+

integer (int32)

@@ -2190,7 +2190,7 @@

v1beta2.DeploymentStatus

collisionCount

Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.

false

-

integer (int64)

+

integer (int32)

@@ -2410,7 +2410,7 @@

v1beta2.DaemonSetStatus

collisionCount

Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.

false

-

integer (int64)

+

integer (int32)

diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index f3cd2f322aebb..125105c42dd73 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -494,7 +494,7 @@

v1beta1.DeploymentStatus

collisionCount

Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.

false

-

integer (int64)

+

integer (int32)

@@ -687,7 +687,7 @@

v1beta1.DaemonSetStatus

collisionCount

Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.

false

-

integer (int64)

+

integer (int32)

diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index b0f0e4363dded..7fc8d68e2da3a 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -12269,7 +12269,7 @@ "collisionCount": { "description": "Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.", "type": "integer", - "format": "int64" + "format": "int32" }, "currentNumberScheduled": { "description": "The number of nodes that are running at least 1 daemon pod and are supposed to run the daemon pod. More info: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/", @@ -12522,7 +12522,7 @@ "collisionCount": { "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", "type": "integer", - "format": "int64" + "format": "int32" }, "conditions": { "description": "Represents the latest available observations of a deployment's current state.", diff --git a/federation/apis/swagger-spec/extensions_v1beta1.json b/federation/apis/swagger-spec/extensions_v1beta1.json index 07185c5cd8ea8..9e2719ee54005 100644 --- a/federation/apis/swagger-spec/extensions_v1beta1.json +++ b/federation/apis/swagger-spec/extensions_v1beta1.json @@ -6953,7 +6953,7 @@ }, "collisionCount": { "type": "integer", - "format": "int64", + "format": "int32", "description": "Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision." } } @@ -7212,7 +7212,7 @@ }, "collisionCount": { "type": "integer", - "format": "int64", + "format": "int32", "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet." } } diff --git a/federation/docs/api-reference/extensions/v1beta1/definitions.html b/federation/docs/api-reference/extensions/v1beta1/definitions.html index 63e825ed50878..1d1d4ad5ff7f9 100755 --- a/federation/docs/api-reference/extensions/v1beta1/definitions.html +++ b/federation/docs/api-reference/extensions/v1beta1/definitions.html @@ -482,7 +482,7 @@

v1beta1.DeploymentStatus

collisionCount

Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.

false

-

integer (int64)

+

integer (int32)

@@ -675,7 +675,7 @@

v1beta1.DaemonSetStatus

collisionCount

Count of hash collisions for the DaemonSet. The DaemonSet controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ControllerRevision.

false

-

integer (int64)

+

integer (int32)

diff --git a/pkg/apis/apps/v1beta1/zz_generated.conversion.go b/pkg/apis/apps/v1beta1/zz_generated.conversion.go index 972e5a70a2556..4a670f88fd6d6 100644 --- a/pkg/apis/apps/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/apps/v1beta1/zz_generated.conversion.go @@ -332,7 +332,7 @@ func autoConvert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(in *v1b out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]extensions.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -349,7 +349,7 @@ func autoConvert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(in *ext out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]v1beta1.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -625,7 +625,7 @@ func autoConvert_v1beta1_StatefulSetStatus_To_apps_StatefulSetStatus(in *v1beta1 out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -642,7 +642,7 @@ func autoConvert_apps_StatefulSetStatus_To_v1beta1_StatefulSetStatus(in *apps.St out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } diff --git a/pkg/apis/apps/v1beta2/zz_generated.conversion.go b/pkg/apis/apps/v1beta2/zz_generated.conversion.go index 6dabfaa441768..51c33d9d896a1 100644 --- a/pkg/apis/apps/v1beta2/zz_generated.conversion.go +++ b/pkg/apis/apps/v1beta2/zz_generated.conversion.go @@ -272,7 +272,7 @@ func autoConvert_v1beta2_DaemonSetStatus_To_extensions_DaemonSetStatus(in *v1bet out.UpdatedNumberScheduled = in.UpdatedNumberScheduled out.NumberAvailable = in.NumberAvailable out.NumberUnavailable = in.NumberUnavailable - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -290,7 +290,7 @@ func autoConvert_extensions_DaemonSetStatus_To_v1beta2_DaemonSetStatus(in *exten out.UpdatedNumberScheduled = in.UpdatedNumberScheduled out.NumberAvailable = in.NumberAvailable out.NumberUnavailable = in.NumberUnavailable - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -466,7 +466,7 @@ func autoConvert_v1beta2_DeploymentStatus_To_extensions_DeploymentStatus(in *v1b out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]extensions.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -483,7 +483,7 @@ func autoConvert_extensions_DeploymentStatus_To_v1beta2_DeploymentStatus(in *ext out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]v1beta2.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -905,7 +905,7 @@ func autoConvert_v1beta2_StatefulSetStatus_To_apps_StatefulSetStatus(in *v1beta2 out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -917,7 +917,7 @@ func autoConvert_apps_StatefulSetStatus_To_v1beta2_StatefulSetStatus(in *apps.St out.UpdatedReplicas = in.UpdatedReplicas out.CurrentRevision = in.CurrentRevision out.UpdateRevision = in.UpdateRevision - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } diff --git a/pkg/apis/apps/zz_generated.deepcopy.go b/pkg/apis/apps/zz_generated.deepcopy.go index 0a4d363861484..983dabf46af75 100644 --- a/pkg/apis/apps/zz_generated.deepcopy.go +++ b/pkg/apis/apps/zz_generated.deepcopy.go @@ -278,7 +278,7 @@ func (in *StatefulSetStatus) DeepCopyInto(out *StatefulSetStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } diff --git a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go index e9b2aa64a3f03..aee174500ab5e 100644 --- a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go @@ -378,7 +378,7 @@ func autoConvert_v1beta1_DaemonSetStatus_To_extensions_DaemonSetStatus(in *v1bet out.UpdatedNumberScheduled = in.UpdatedNumberScheduled out.NumberAvailable = in.NumberAvailable out.NumberUnavailable = in.NumberUnavailable - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -396,7 +396,7 @@ func autoConvert_extensions_DaemonSetStatus_To_v1beta1_DaemonSetStatus(in *exten out.UpdatedNumberScheduled = in.UpdatedNumberScheduled out.NumberAvailable = in.NumberAvailable out.NumberUnavailable = in.NumberUnavailable - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -621,7 +621,7 @@ func autoConvert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(in *v1b out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]extensions.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -638,7 +638,7 @@ func autoConvert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(in *ext out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]v1beta1.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) - out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) + out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) return nil } diff --git a/pkg/apis/extensions/zz_generated.deepcopy.go b/pkg/apis/extensions/zz_generated.deepcopy.go index d5af9371dff80..69414fa715642 100644 --- a/pkg/apis/extensions/zz_generated.deepcopy.go +++ b/pkg/apis/extensions/zz_generated.deepcopy.go @@ -456,7 +456,7 @@ func (in *DaemonSetStatus) DeepCopyInto(out *DaemonSetStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } @@ -682,7 +682,7 @@ func (in *DeploymentStatus) DeepCopyInto(out *DeploymentStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } diff --git a/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go b/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go index bc0a74ab76a6f..6d5e1f7a1ebeb 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go @@ -3050,7 +3050,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) } - var v int64 + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3060,7 +3060,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int64(b) & 0x7F) << shift + v |= (int32(b) & 0x7F) << shift if b < 0x80 { break } @@ -4587,7 +4587,7 @@ func (m *StatefulSetStatus) Unmarshal(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) } - var v int64 + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -4597,7 +4597,7 @@ func (m *StatefulSetStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int64(b) & 0x7F) << shift + v |= (int32(b) & 0x7F) << shift if b < 0x80 { break } @@ -4847,118 +4847,118 @@ func init() { var fileDescriptorGenerated = []byte{ // 1820 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcd, 0x6f, 0x1c, 0x49, - 0x15, 0x77, 0xcf, 0x87, 0x3d, 0x53, 0x5e, 0x8f, 0xe3, 0xb2, 0xb1, 0x67, 0xbd, 0x30, 0xb6, 0x86, - 0xd5, 0xae, 0xb3, 0xbb, 0xee, 0xd9, 0x78, 0x97, 0xd5, 0x26, 0x91, 0x22, 0x3c, 0xe3, 0x90, 0x38, - 0xb2, 0xb1, 0x53, 0x63, 0x07, 0x11, 0x40, 0x4a, 0x4d, 0x4f, 0x65, 0xdc, 0x71, 0x7f, 0xa9, 0xbb, - 0x7a, 0xc8, 0x88, 0x0b, 0x77, 0x90, 0xc2, 0x99, 0xbf, 0x82, 0x23, 0x82, 0x1b, 0x27, 0x5f, 0x90, - 0x22, 0x2e, 0xe4, 0x64, 0x91, 0xc9, 0x95, 0x2b, 0x97, 0x48, 0x48, 0xa8, 0xaa, 0xab, 0xbf, 0xbb, - 0xed, 0x31, 0x12, 0x3e, 0x70, 0x9b, 0xae, 0xf7, 0xde, 0xef, 0xbd, 0xaa, 0x7a, 0xf5, 0xde, 0xef, - 0x0d, 0xf8, 0xe1, 0xe9, 0xb7, 0x8e, 0xac, 0x9a, 0xad, 0x53, 0xb7, 0x47, 0x6c, 0x83, 0x50, 0xe2, - 0xb4, 0x86, 0xc4, 0xe8, 0x9b, 0x76, 0x4b, 0x08, 0xb0, 0xa5, 0xb6, 0xb0, 0x65, 0x39, 0xad, 0xe1, - 0xad, 0x1e, 0xa1, 0xf8, 0x56, 0x6b, 0x40, 0x0c, 0x62, 0x63, 0x4a, 0xfa, 0xb2, 0x65, 0x9b, 0xd4, - 0x84, 0x2b, 0x9e, 0xa2, 0x8c, 0x2d, 0x55, 0x66, 0x8a, 0xb2, 0x50, 0x5c, 0xdd, 0x1c, 0xa8, 0xf4, - 0xc4, 0xed, 0xc9, 0x8a, 0xa9, 0xb7, 0x06, 0xe6, 0xc0, 0x6c, 0x71, 0xfd, 0x9e, 0xfb, 0x9c, 0x7f, - 0xf1, 0x0f, 0xfe, 0xcb, 0xc3, 0x59, 0x6d, 0x46, 0x1c, 0x2a, 0xa6, 0x4d, 0x5a, 0xc3, 0x94, 0xaf, - 0xd5, 0x9b, 0x11, 0x1d, 0xcb, 0xd4, 0x54, 0x65, 0x94, 0x17, 0xd6, 0xea, 0xd7, 0xa1, 0xaa, 0x8e, - 0x95, 0x13, 0xd5, 0x20, 0xf6, 0xa8, 0x65, 0x9d, 0x0e, 0xd8, 0x82, 0xd3, 0xd2, 0x09, 0xc5, 0x59, - 0x0e, 0x5a, 0x79, 0x56, 0xb6, 0x6b, 0x50, 0x55, 0x27, 0x29, 0x83, 0x6f, 0x2e, 0x33, 0x70, 0x94, - 0x13, 0xa2, 0xe3, 0x94, 0xdd, 0x57, 0x79, 0x76, 0x2e, 0x55, 0xb5, 0x96, 0x6a, 0x50, 0x87, 0xda, - 0x49, 0xa3, 0xe6, 0xbf, 0x24, 0x00, 0x3b, 0xa6, 0x41, 0x6d, 0x53, 0xd3, 0x88, 0x8d, 0xc8, 0x50, - 0x75, 0x54, 0xd3, 0x80, 0xcf, 0x40, 0x85, 0xed, 0xa7, 0x8f, 0x29, 0xae, 0x4b, 0xeb, 0xd2, 0xc6, - 0xec, 0xd6, 0x97, 0x72, 0x78, 0x29, 0x01, 0xbc, 0x6c, 0x9d, 0x0e, 0xd8, 0x82, 0x23, 0x33, 0x6d, - 0x79, 0x78, 0x4b, 0x3e, 0xe8, 0xbd, 0x20, 0x0a, 0xdd, 0x27, 0x14, 0xb7, 0xe1, 0xd9, 0xf9, 0xda, - 0xd4, 0xf8, 0x7c, 0x0d, 0x84, 0x6b, 0x28, 0x40, 0x85, 0x07, 0xa0, 0xc4, 0xd1, 0x0b, 0x1c, 0x7d, - 0x33, 0x17, 0x5d, 0x6c, 0x5a, 0x46, 0xf8, 0x97, 0xf7, 0x5f, 0x52, 0x62, 0xb0, 0xf0, 0xda, 0x1f, - 0x08, 0xe8, 0xd2, 0x0e, 0xa6, 0x18, 0x71, 0x20, 0xf8, 0x05, 0xa8, 0xd8, 0x22, 0xfc, 0x7a, 0x71, - 0x5d, 0xda, 0x28, 0xb6, 0x6f, 0x08, 0xad, 0x8a, 0xbf, 0x2d, 0x14, 0x68, 0x34, 0xcf, 0x24, 0xb0, - 0x9c, 0xde, 0xf7, 0x9e, 0xea, 0x50, 0xf8, 0xf3, 0xd4, 0xde, 0xe5, 0xc9, 0xf6, 0xce, 0xac, 0xf9, - 0xce, 0x03, 0xc7, 0xfe, 0x4a, 0x64, 0xdf, 0x87, 0xa0, 0xac, 0x52, 0xa2, 0x3b, 0xf5, 0xc2, 0x7a, - 0x71, 0x63, 0x76, 0xeb, 0x73, 0x39, 0x27, 0xd7, 0xe5, 0x74, 0x74, 0xed, 0x39, 0x81, 0x5b, 0xde, - 0x65, 0x08, 0xc8, 0x03, 0x6a, 0xfe, 0xb6, 0x00, 0xc0, 0x0e, 0xb1, 0x34, 0x73, 0xa4, 0x13, 0x83, - 0x5e, 0xc3, 0xd5, 0xed, 0x82, 0x92, 0x63, 0x11, 0x45, 0x5c, 0xdd, 0xa7, 0xb9, 0x3b, 0x08, 0x83, - 0xea, 0x5a, 0x44, 0x09, 0x2f, 0x8d, 0x7d, 0x21, 0x0e, 0x01, 0x1f, 0x83, 0x69, 0x87, 0x62, 0xea, - 0x3a, 0xfc, 0xca, 0x66, 0xb7, 0x6e, 0x4e, 0x02, 0xc6, 0x0d, 0xda, 0x35, 0x01, 0x37, 0xed, 0x7d, - 0x23, 0x01, 0xd4, 0xfc, 0x7b, 0x11, 0x2c, 0x86, 0xca, 0x1d, 0xd3, 0xe8, 0xab, 0x94, 0xa5, 0xf4, - 0x5d, 0x50, 0xa2, 0x23, 0x8b, 0xf0, 0x33, 0xa9, 0xb6, 0x3f, 0xf5, 0x83, 0x39, 0x1a, 0x59, 0xe4, - 0xfd, 0xf9, 0xda, 0x4a, 0x86, 0x09, 0x13, 0x21, 0x6e, 0x04, 0xf7, 0x82, 0x38, 0x0b, 0xdc, 0xfc, - 0xeb, 0xb8, 0xf3, 0xf7, 0xe7, 0x6b, 0x19, 0xb5, 0x46, 0x0e, 0x90, 0xe2, 0x21, 0xc2, 0x4f, 0xc0, - 0xb4, 0x4d, 0xb0, 0x63, 0x1a, 0xf5, 0x12, 0x47, 0x0b, 0xb6, 0x82, 0xf8, 0x2a, 0x12, 0x52, 0x78, - 0x13, 0xcc, 0xe8, 0xc4, 0x71, 0xf0, 0x80, 0xd4, 0xcb, 0x5c, 0x71, 0x5e, 0x28, 0xce, 0xec, 0x7b, - 0xcb, 0xc8, 0x97, 0xc3, 0x17, 0xa0, 0xa6, 0x61, 0x87, 0x1e, 0x5b, 0x7d, 0x4c, 0xc9, 0x91, 0xaa, - 0x93, 0xfa, 0x34, 0x3f, 0xd0, 0xcf, 0x26, 0xbb, 0x7b, 0x66, 0xd1, 0x5e, 0x16, 0xe8, 0xb5, 0xbd, - 0x18, 0x12, 0x4a, 0x20, 0xc3, 0x21, 0x80, 0x6c, 0xe5, 0xc8, 0xc6, 0x86, 0xe3, 0x1d, 0x14, 0xf3, - 0x37, 0x73, 0x65, 0x7f, 0xab, 0xc2, 0x1f, 0xdc, 0x4b, 0xa1, 0xa1, 0x0c, 0x0f, 0xcd, 0x3f, 0x4a, - 0xa0, 0x16, 0x5e, 0xd3, 0x35, 0xbc, 0xd5, 0x87, 0xf1, 0xb7, 0xfa, 0xfd, 0x09, 0x92, 0x33, 0xe7, - 0x8d, 0xfe, 0xb3, 0x00, 0x60, 0xa8, 0x84, 0x4c, 0x4d, 0xeb, 0x61, 0xe5, 0x14, 0xae, 0x83, 0x92, - 0x81, 0x75, 0x3f, 0x27, 0x83, 0x07, 0xf2, 0x63, 0xac, 0x13, 0xc4, 0x25, 0xf0, 0x95, 0x04, 0xa0, - 0xcb, 0x8f, 0xbe, 0xbf, 0x6d, 0x18, 0x26, 0xc5, 0xec, 0x34, 0xfc, 0x80, 0x3a, 0x13, 0x04, 0xe4, - 0xfb, 0x92, 0x8f, 0x53, 0x28, 0xf7, 0x0d, 0x6a, 0x8f, 0xc2, 0x5b, 0x48, 0x2b, 0xa0, 0x0c, 0xd7, - 0xf0, 0x67, 0x00, 0xd8, 0x02, 0xf3, 0xc8, 0x14, 0xcf, 0x36, 0xbf, 0x06, 0xf8, 0xee, 0x3b, 0xa6, - 0xf1, 0x5c, 0x1d, 0x84, 0x85, 0x05, 0x05, 0x10, 0x28, 0x02, 0xb7, 0x7a, 0x1f, 0xac, 0xe4, 0xc4, - 0x09, 0x6f, 0x80, 0xe2, 0x29, 0x19, 0x79, 0x47, 0x85, 0xd8, 0x4f, 0xb8, 0x04, 0xca, 0x43, 0xac, - 0xb9, 0xc4, 0x7b, 0x93, 0xc8, 0xfb, 0xb8, 0x53, 0xf8, 0x56, 0x6a, 0xfe, 0xa1, 0x1c, 0xcd, 0x14, - 0x56, 0x6f, 0xe0, 0x06, 0x6b, 0x0f, 0x96, 0xa6, 0x2a, 0xd8, 0xe1, 0x18, 0xe5, 0xf6, 0x07, 0x5e, - 0x6b, 0xf0, 0xd6, 0x50, 0x20, 0x85, 0xbf, 0x00, 0x15, 0x87, 0x68, 0x44, 0xa1, 0xa6, 0x2d, 0x4a, - 0xdc, 0x57, 0x13, 0xe6, 0x14, 0xee, 0x11, 0xad, 0x2b, 0x4c, 0x3d, 0x78, 0xff, 0x0b, 0x05, 0x90, - 0xf0, 0x31, 0xa8, 0x50, 0xa2, 0x5b, 0x1a, 0xa6, 0x44, 0x9c, 0x5e, 0x2c, 0xaf, 0x58, 0xed, 0x60, - 0x60, 0x87, 0x66, 0xff, 0x48, 0xa8, 0xf1, 0xea, 0x19, 0xe4, 0xa9, 0xbf, 0x8a, 0x02, 0x18, 0xf8, - 0x53, 0x50, 0x71, 0x28, 0xeb, 0xea, 0x83, 0x11, 0xaf, 0x28, 0x17, 0xb5, 0x95, 0x68, 0x1d, 0xf5, - 0x4c, 0x42, 0x68, 0x7f, 0x05, 0x05, 0x70, 0x70, 0x1b, 0xcc, 0xeb, 0xaa, 0x81, 0x08, 0xee, 0x8f, - 0xba, 0x44, 0x31, 0x8d, 0xbe, 0xc3, 0x4b, 0x51, 0xb9, 0xbd, 0x22, 0x8c, 0xe6, 0xf7, 0xe3, 0x62, - 0x94, 0xd4, 0x87, 0x7b, 0x60, 0xc9, 0x6f, 0xbb, 0x0f, 0x55, 0x87, 0x9a, 0xf6, 0x68, 0x4f, 0xd5, - 0x55, 0xca, 0x0b, 0x54, 0xb9, 0x5d, 0x1f, 0x9f, 0xaf, 0x2d, 0xa1, 0x0c, 0x39, 0xca, 0xb4, 0x62, - 0xb5, 0xd3, 0xc2, 0xae, 0x43, 0xfa, 0xbc, 0xe0, 0x54, 0xc2, 0xda, 0x79, 0xc8, 0x57, 0x91, 0x90, - 0xc2, 0x9f, 0xc4, 0xd2, 0xb4, 0x72, 0xb5, 0x34, 0xad, 0xe5, 0xa7, 0x28, 0x3c, 0x06, 0x2b, 0x96, - 0x6d, 0x0e, 0x6c, 0xe2, 0x38, 0x3b, 0x04, 0xf7, 0x35, 0xd5, 0x20, 0xfe, 0xc9, 0x54, 0xf9, 0x8e, - 0x3e, 0x1a, 0x9f, 0xaf, 0xad, 0x1c, 0x66, 0xab, 0xa0, 0x3c, 0xdb, 0xe6, 0x5f, 0x4a, 0xe0, 0x46, - 0xb2, 0xc7, 0xc1, 0x47, 0x00, 0x9a, 0x3d, 0x87, 0xd8, 0x43, 0xd2, 0x7f, 0xe0, 0x11, 0x37, 0xc6, - 0x6e, 0x24, 0xce, 0x6e, 0x82, 0x77, 0x7b, 0x90, 0xd2, 0x40, 0x19, 0x56, 0x1e, 0x3f, 0x12, 0x0f, - 0xa0, 0xc0, 0x03, 0x8d, 0xf0, 0xa3, 0xd4, 0x23, 0xd8, 0x06, 0xf3, 0xe2, 0xed, 0xfb, 0x42, 0x9e, - 0xac, 0x91, 0x7b, 0x3f, 0x8e, 0x8b, 0x51, 0x52, 0x1f, 0x3e, 0x00, 0x0b, 0x78, 0x88, 0x55, 0x0d, - 0xf7, 0x34, 0x12, 0x80, 0x94, 0x38, 0xc8, 0x87, 0x02, 0x64, 0x61, 0x3b, 0xa9, 0x80, 0xd2, 0x36, - 0x70, 0x1f, 0x2c, 0xba, 0x46, 0x1a, 0xca, 0xcb, 0xc3, 0x8f, 0x04, 0xd4, 0xe2, 0x71, 0x5a, 0x05, - 0x65, 0xd9, 0xc1, 0x67, 0x00, 0x28, 0x7e, 0x63, 0x76, 0xea, 0xd3, 0xbc, 0x92, 0x7e, 0x31, 0xc1, - 0x7b, 0x09, 0xba, 0x79, 0x58, 0xc5, 0x82, 0x25, 0x07, 0x45, 0x30, 0xe1, 0x5d, 0x30, 0x67, 0xb3, - 0x17, 0x10, 0x84, 0x3a, 0xc3, 0x43, 0xfd, 0x8e, 0x30, 0x9b, 0x43, 0x51, 0x21, 0x8a, 0xeb, 0xc2, - 0x3b, 0xa0, 0xa6, 0x98, 0x9a, 0xc6, 0x33, 0xbf, 0x63, 0xba, 0x06, 0xe5, 0xc9, 0x5b, 0x6c, 0x43, - 0xd6, 0x99, 0x3b, 0x31, 0x09, 0x4a, 0x68, 0x36, 0xff, 0x2c, 0x45, 0xdb, 0x8c, 0xff, 0x9c, 0xe1, - 0x9d, 0x18, 0xf5, 0xf9, 0x24, 0x41, 0x7d, 0x96, 0xd3, 0x16, 0x11, 0xe6, 0xa3, 0x82, 0x39, 0x96, - 0xfc, 0xaa, 0x31, 0xf0, 0x2e, 0x5c, 0x94, 0xc4, 0x2f, 0x2f, 0x7c, 0x4a, 0x81, 0x76, 0xa4, 0x31, - 0x2e, 0xf0, 0x9d, 0x47, 0x85, 0x28, 0x8e, 0xdc, 0xbc, 0x07, 0x6a, 0xf1, 0x77, 0x18, 0xe3, 0xf4, - 0xd2, 0xa5, 0x9c, 0xfe, 0x9d, 0x04, 0x56, 0x72, 0xbc, 0x43, 0x0d, 0xd4, 0x74, 0xfc, 0x32, 0x92, - 0x23, 0x97, 0x72, 0x63, 0x36, 0x35, 0xc9, 0xde, 0xd4, 0x24, 0xef, 0x1a, 0xf4, 0xc0, 0xee, 0x52, - 0x5b, 0x35, 0x06, 0xde, 0x3d, 0xec, 0xc7, 0xb0, 0x50, 0x02, 0x1b, 0x3e, 0x05, 0x15, 0x1d, 0xbf, - 0xec, 0xba, 0xf6, 0x20, 0xeb, 0xbc, 0x26, 0xf3, 0xc3, 0xfb, 0xc7, 0xbe, 0x40, 0x41, 0x01, 0x5e, - 0xf3, 0x00, 0xac, 0xc7, 0x36, 0xc9, 0x4a, 0x05, 0x79, 0xee, 0x6a, 0x5d, 0x12, 0x5e, 0xf8, 0xe7, - 0xa0, 0x6a, 0x61, 0x9b, 0xaa, 0x41, 0xb9, 0x28, 0xb7, 0xe7, 0xc6, 0xe7, 0x6b, 0xd5, 0x43, 0x7f, - 0x11, 0x85, 0xf2, 0xe6, 0xbf, 0x25, 0x50, 0xee, 0x2a, 0x58, 0x23, 0xd7, 0x30, 0x3a, 0xec, 0xc4, - 0x46, 0x87, 0x66, 0x6e, 0x12, 0xf1, 0x78, 0x72, 0xa7, 0x86, 0xbd, 0xc4, 0xd4, 0xf0, 0xf1, 0x25, - 0x38, 0x17, 0x0f, 0x0c, 0xb7, 0x41, 0x35, 0x70, 0x17, 0xab, 0x92, 0xd2, 0x65, 0x55, 0xb2, 0xf9, - 0xfb, 0x02, 0x98, 0x8d, 0xb8, 0xb8, 0x9a, 0x35, 0x3b, 0xee, 0x08, 0xd1, 0x60, 0x65, 0x68, 0x6b, - 0x92, 0x8d, 0xc8, 0x3e, 0xa9, 0xf0, 0xf8, 0x5b, 0xd8, 0xbd, 0xd3, 0x5c, 0xe3, 0x1e, 0xa8, 0x51, - 0x6c, 0x0f, 0x08, 0xf5, 0x65, 0xfc, 0xc0, 0xaa, 0x21, 0xd3, 0x3f, 0x8a, 0x49, 0x51, 0x42, 0x7b, - 0xf5, 0x2e, 0x98, 0x8b, 0x39, 0xbb, 0x12, 0x09, 0x7b, 0xc5, 0x0e, 0x27, 0x4c, 0xce, 0x6b, 0xc8, - 0xae, 0x47, 0xb1, 0xec, 0xda, 0xc8, 0x3f, 0xcc, 0xc8, 0x93, 0xc9, 0xcb, 0x31, 0x94, 0xc8, 0xb1, - 0xcf, 0x26, 0x42, 0xbb, 0x38, 0xd3, 0xfe, 0x24, 0x81, 0xf9, 0x88, 0xf6, 0x35, 0x4c, 0x30, 0xbb, - 0xf1, 0x09, 0xe6, 0xe3, 0x49, 0x36, 0x91, 0x33, 0xc2, 0xfc, 0xb5, 0x1c, 0x0b, 0xfe, 0xff, 0x9e, - 0x54, 0xff, 0x0a, 0x2c, 0x0d, 0x4d, 0xcd, 0xd5, 0x49, 0x47, 0xc3, 0xaa, 0xee, 0x2b, 0x30, 0x06, - 0x53, 0x4c, 0xfe, 0x51, 0x11, 0xc0, 0x13, 0xdb, 0x51, 0x1d, 0x4a, 0x0c, 0xfa, 0x24, 0xb4, 0x6c, - 0x7f, 0x57, 0x38, 0x59, 0x7a, 0x92, 0x01, 0x87, 0x32, 0x9d, 0xc0, 0x1f, 0x80, 0x59, 0x46, 0xe0, - 0x54, 0x85, 0xb0, 0x59, 0x50, 0x4c, 0xff, 0x8b, 0x02, 0x68, 0xb6, 0x1b, 0x8a, 0x50, 0x54, 0x0f, - 0x9e, 0x80, 0x45, 0xcb, 0xec, 0xef, 0x63, 0x03, 0x0f, 0x08, 0x6b, 0x7b, 0x87, 0xfc, 0x0f, 0x4d, - 0xce, 0xb4, 0xab, 0xed, 0x6f, 0x7c, 0xa6, 0x74, 0x98, 0x56, 0x79, 0xcf, 0x28, 0x6b, 0x7a, 0x99, - 0xf3, 0x80, 0x2c, 0x48, 0x68, 0x83, 0x9a, 0x2b, 0xda, 0x8f, 0x18, 0x3c, 0xbc, 0xf9, 0x7f, 0x6b, - 0x92, 0x0c, 0x3b, 0x8e, 0x59, 0x86, 0xd5, 0x28, 0xbe, 0x8e, 0x12, 0x1e, 0x72, 0x07, 0x89, 0xca, - 0x7f, 0x33, 0x48, 0x34, 0x7f, 0x53, 0x02, 0x0b, 0xa9, 0xa7, 0x0b, 0x7f, 0x74, 0x01, 0xe3, 0x5e, - 0xfe, 0x9f, 0xb1, 0xed, 0x14, 0x61, 0x2c, 0x5e, 0x81, 0x30, 0x6e, 0x83, 0x79, 0xc5, 0xb5, 0x6d, - 0x36, 0xeb, 0xc7, 0x59, 0x76, 0x40, 0xd5, 0x3b, 0x71, 0x31, 0x4a, 0xea, 0x67, 0xb1, 0xfd, 0xf2, - 0x15, 0xd9, 0x7e, 0x34, 0x0a, 0xc1, 0xd8, 0xbc, 0xb4, 0x4b, 0x47, 0x21, 0x88, 0x5b, 0x52, 0x9f, - 0x75, 0x2b, 0x0f, 0x35, 0x40, 0x98, 0x89, 0x77, 0xab, 0xe3, 0x98, 0x14, 0x25, 0xb4, 0x33, 0x98, - 0x73, 0x75, 0x62, 0xe6, 0xfc, 0x37, 0x09, 0x7c, 0x98, 0x9b, 0xa1, 0x70, 0x3b, 0x46, 0xa0, 0x37, - 0x13, 0x04, 0xfa, 0x7b, 0xb9, 0x86, 0x11, 0x1e, 0x6d, 0x67, 0xf3, 0xe8, 0xdb, 0x93, 0xf1, 0xe8, - 0x0c, 0x92, 0x77, 0x39, 0xa1, 0x6e, 0x6f, 0x9e, 0xbd, 0x6d, 0x4c, 0xbd, 0x7e, 0xdb, 0x98, 0x7a, - 0xf3, 0xb6, 0x31, 0xf5, 0xeb, 0x71, 0x43, 0x3a, 0x1b, 0x37, 0xa4, 0xd7, 0xe3, 0x86, 0xf4, 0x66, - 0xdc, 0x90, 0xfe, 0x31, 0x6e, 0x48, 0xbf, 0x7b, 0xd7, 0x98, 0x7a, 0x3a, 0x23, 0x3c, 0xfe, 0x27, - 0x00, 0x00, 0xff, 0xff, 0x72, 0x04, 0xd9, 0xa7, 0xb9, 0x19, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4b, 0x6f, 0x1b, 0xc9, + 0x11, 0xd6, 0x50, 0xa4, 0x44, 0xb6, 0x56, 0x94, 0xd5, 0x52, 0x24, 0xae, 0x36, 0xa1, 0x04, 0x66, + 0xb1, 0x2b, 0xef, 0xae, 0x86, 0x6b, 0xd9, 0x31, 0xfc, 0x00, 0x8c, 0x88, 0x94, 0x63, 0xcb, 0x90, + 0x22, 0xb9, 0x29, 0x39, 0x88, 0x93, 0x00, 0x6e, 0x0e, 0xdb, 0xd4, 0x58, 0xf3, 0xc2, 0x4c, 0x0f, + 0x63, 0x22, 0x97, 0xdc, 0x13, 0xc0, 0x39, 0xe7, 0x57, 0xe4, 0x18, 0x24, 0xb7, 0x9c, 0x74, 0x09, + 0x60, 0xe4, 0x12, 0x9f, 0x84, 0x98, 0xbe, 0xe6, 0x9a, 0x8b, 0x81, 0x00, 0x41, 0xf7, 0xf4, 0xbc, + 0x67, 0x24, 0x2a, 0x40, 0x74, 0xc8, 0x8d, 0xd3, 0x55, 0xf5, 0x55, 0x75, 0x77, 0x75, 0xd5, 0x57, + 0x04, 0x3f, 0x3c, 0xb9, 0xe3, 0xc8, 0xaa, 0xd9, 0x3c, 0x71, 0xbb, 0xc4, 0x36, 0x08, 0x25, 0x4e, + 0x73, 0x40, 0x8c, 0x9e, 0x69, 0x37, 0x85, 0x00, 0x5b, 0x6a, 0x13, 0x5b, 0x96, 0xd3, 0x1c, 0xdc, + 0xe8, 0x12, 0x8a, 0x6f, 0x34, 0xfb, 0xc4, 0x20, 0x36, 0xa6, 0xa4, 0x27, 0x5b, 0xb6, 0x49, 0x4d, + 0xb8, 0xec, 0x29, 0xca, 0xd8, 0x52, 0x65, 0xa6, 0x28, 0x0b, 0xc5, 0x95, 0x8d, 0xbe, 0x4a, 0x8f, + 0xdd, 0xae, 0xac, 0x98, 0x7a, 0xb3, 0x6f, 0xf6, 0xcd, 0x26, 0xd7, 0xef, 0xba, 0x2f, 0xf9, 0x17, + 0xff, 0xe0, 0xbf, 0x3c, 0x9c, 0x95, 0x46, 0xc4, 0xa1, 0x62, 0xda, 0xa4, 0x39, 0x48, 0xf9, 0x5a, + 0xb9, 0x1e, 0xd1, 0xb1, 0x4c, 0x4d, 0x55, 0x86, 0x79, 0x61, 0xad, 0xdc, 0x0a, 0x55, 0x75, 0xac, + 0x1c, 0xab, 0x06, 0xb1, 0x87, 0x4d, 0xeb, 0xa4, 0xcf, 0x16, 0x9c, 0xa6, 0x4e, 0x28, 0xce, 0x72, + 0xd0, 0xcc, 0xb3, 0xb2, 0x5d, 0x83, 0xaa, 0x3a, 0x49, 0x19, 0xdc, 0xbe, 0xc8, 0xc0, 0x51, 0x8e, + 0x89, 0x8e, 0x53, 0x76, 0x37, 0xf3, 0xec, 0x5c, 0xaa, 0x6a, 0x4d, 0xd5, 0xa0, 0x0e, 0xb5, 0x93, + 0x46, 0x8d, 0x7f, 0x49, 0x00, 0xb6, 0x4d, 0x83, 0xda, 0xa6, 0xa6, 0x11, 0x1b, 0x91, 0x81, 0xea, + 0xa8, 0xa6, 0x01, 0x5f, 0x80, 0x32, 0xdb, 0x4f, 0x0f, 0x53, 0x5c, 0x93, 0xd6, 0xa4, 0xf5, 0x99, + 0xcd, 0x6f, 0xe5, 0xf0, 0x52, 0x02, 0x78, 0xd9, 0x3a, 0xe9, 0xb3, 0x05, 0x47, 0x66, 0xda, 0xf2, + 0xe0, 0x86, 0xbc, 0xdf, 0x7d, 0x45, 0x14, 0xba, 0x47, 0x28, 0x6e, 0xc1, 0xd3, 0xb3, 0xd5, 0x89, + 0xd1, 0xd9, 0x2a, 0x08, 0xd7, 0x50, 0x80, 0x0a, 0xf7, 0x41, 0x91, 0xa3, 0x17, 0x38, 0xfa, 0x46, + 0x2e, 0xba, 0xd8, 0xb4, 0x8c, 0xf0, 0x2f, 0x1f, 0xbe, 0xa6, 0xc4, 0x60, 0xe1, 0xb5, 0x3e, 0x11, + 0xd0, 0xc5, 0x6d, 0x4c, 0x31, 0xe2, 0x40, 0xf0, 0x1b, 0x50, 0xb6, 0x45, 0xf8, 0xb5, 0xc9, 0x35, + 0x69, 0x7d, 0xb2, 0x75, 0x4d, 0x68, 0x95, 0xfd, 0x6d, 0xa1, 0x40, 0xa3, 0x71, 0x2a, 0x81, 0xa5, + 0xf4, 0xbe, 0x77, 0x55, 0x87, 0xc2, 0x9f, 0xa7, 0xf6, 0x2e, 0x8f, 0xb7, 0x77, 0x66, 0xcd, 0x77, + 0x1e, 0x38, 0xf6, 0x57, 0x22, 0xfb, 0x3e, 0x00, 0x25, 0x95, 0x12, 0xdd, 0xa9, 0x15, 0xd6, 0x26, + 0xd7, 0x67, 0x36, 0xbf, 0x96, 0x73, 0x72, 0x5d, 0x4e, 0x47, 0xd7, 0x9a, 0x15, 0xb8, 0xa5, 0x1d, + 0x86, 0x80, 0x3c, 0xa0, 0xc6, 0x6f, 0x0b, 0x00, 0x6c, 0x13, 0x4b, 0x33, 0x87, 0x3a, 0x31, 0xe8, + 0x15, 0x5c, 0xdd, 0x0e, 0x28, 0x3a, 0x16, 0x51, 0xc4, 0xd5, 0x7d, 0x99, 0xbb, 0x83, 0x30, 0xa8, + 0x8e, 0x45, 0x94, 0xf0, 0xd2, 0xd8, 0x17, 0xe2, 0x10, 0xf0, 0x29, 0x98, 0x72, 0x28, 0xa6, 0xae, + 0xc3, 0xaf, 0x6c, 0x66, 0xf3, 0xfa, 0x38, 0x60, 0xdc, 0xa0, 0x55, 0x15, 0x70, 0x53, 0xde, 0x37, + 0x12, 0x40, 0x8d, 0xbf, 0x4f, 0x82, 0x85, 0x50, 0xb9, 0x6d, 0x1a, 0x3d, 0x95, 0xb2, 0x94, 0xbe, + 0x0f, 0x8a, 0x74, 0x68, 0x11, 0x7e, 0x26, 0x95, 0xd6, 0x97, 0x7e, 0x30, 0x87, 0x43, 0x8b, 0x7c, + 0x3c, 0x5b, 0x5d, 0xce, 0x30, 0x61, 0x22, 0xc4, 0x8d, 0xe0, 0x6e, 0x10, 0x67, 0x81, 0x9b, 0xdf, + 0x8a, 0x3b, 0xff, 0x78, 0xb6, 0x9a, 0x51, 0x6b, 0xe4, 0x00, 0x29, 0x1e, 0x22, 0xfc, 0x02, 0x4c, + 0xd9, 0x04, 0x3b, 0xa6, 0x51, 0x2b, 0x72, 0xb4, 0x60, 0x2b, 0x88, 0xaf, 0x22, 0x21, 0x85, 0xd7, + 0xc1, 0xb4, 0x4e, 0x1c, 0x07, 0xf7, 0x49, 0xad, 0xc4, 0x15, 0xe7, 0x84, 0xe2, 0xf4, 0x9e, 0xb7, + 0x8c, 0x7c, 0x39, 0x7c, 0x05, 0xaa, 0x1a, 0x76, 0xe8, 0x91, 0xd5, 0xc3, 0x94, 0x1c, 0xaa, 0x3a, + 0xa9, 0x4d, 0xf1, 0x03, 0xfd, 0x6a, 0xbc, 0xbb, 0x67, 0x16, 0xad, 0x25, 0x81, 0x5e, 0xdd, 0x8d, + 0x21, 0xa1, 0x04, 0x32, 0x1c, 0x00, 0xc8, 0x56, 0x0e, 0x6d, 0x6c, 0x38, 0xde, 0x41, 0x31, 0x7f, + 0xd3, 0x97, 0xf6, 0xb7, 0x22, 0xfc, 0xc1, 0xdd, 0x14, 0x1a, 0xca, 0xf0, 0xd0, 0xf8, 0xa3, 0x04, + 0xaa, 0xe1, 0x35, 0x5d, 0xc1, 0x5b, 0x7d, 0x1c, 0x7f, 0xab, 0xdf, 0x1f, 0x23, 0x39, 0x73, 0xde, + 0xe8, 0x3f, 0x0b, 0x00, 0x86, 0x4a, 0xc8, 0xd4, 0xb4, 0x2e, 0x56, 0x4e, 0xe0, 0x1a, 0x28, 0x1a, + 0x58, 0xf7, 0x73, 0x32, 0x78, 0x20, 0x3f, 0xc6, 0x3a, 0x41, 0x5c, 0x02, 0xdf, 0x48, 0x00, 0xba, + 0xfc, 0xe8, 0x7b, 0x5b, 0x86, 0x61, 0x52, 0xcc, 0x4e, 0xc3, 0x0f, 0xa8, 0x3d, 0x46, 0x40, 0xbe, + 0x2f, 0xf9, 0x28, 0x85, 0xf2, 0xd0, 0xa0, 0xf6, 0x30, 0xbc, 0x85, 0xb4, 0x02, 0xca, 0x70, 0x0d, + 0x7f, 0x06, 0x80, 0x2d, 0x30, 0x0f, 0x4d, 0xf1, 0x6c, 0xf3, 0x6b, 0x80, 0xef, 0xbe, 0x6d, 0x1a, + 0x2f, 0xd5, 0x7e, 0x58, 0x58, 0x50, 0x00, 0x81, 0x22, 0x70, 0x2b, 0x0f, 0xc1, 0x72, 0x4e, 0x9c, + 0xf0, 0x1a, 0x98, 0x3c, 0x21, 0x43, 0xef, 0xa8, 0x10, 0xfb, 0x09, 0x17, 0x41, 0x69, 0x80, 0x35, + 0x97, 0x78, 0x6f, 0x12, 0x79, 0x1f, 0xf7, 0x0a, 0x77, 0xa4, 0xc6, 0x1f, 0x4a, 0xd1, 0x4c, 0x61, + 0xf5, 0x06, 0xae, 0xb3, 0xf6, 0x60, 0x69, 0xaa, 0x82, 0x1d, 0x8e, 0x51, 0x6a, 0x7d, 0xe2, 0xb5, + 0x06, 0x6f, 0x0d, 0x05, 0x52, 0xf8, 0x0b, 0x50, 0x76, 0x88, 0x46, 0x14, 0x6a, 0xda, 0xa2, 0xc4, + 0xdd, 0x1c, 0x33, 0xa7, 0x70, 0x97, 0x68, 0x1d, 0x61, 0xea, 0xc1, 0xfb, 0x5f, 0x28, 0x80, 0x84, + 0x4f, 0x41, 0x99, 0x12, 0xdd, 0xd2, 0x30, 0x25, 0xe2, 0xf4, 0x62, 0x79, 0xc5, 0x6a, 0x07, 0x03, + 0x3b, 0x30, 0x7b, 0x87, 0x42, 0x8d, 0x57, 0xcf, 0x20, 0x4f, 0xfd, 0x55, 0x14, 0xc0, 0xc0, 0x9f, + 0x82, 0xb2, 0x43, 0x59, 0x57, 0xef, 0x0f, 0x79, 0x45, 0x39, 0xaf, 0xad, 0x44, 0xeb, 0xa8, 0x67, + 0x12, 0x42, 0xfb, 0x2b, 0x28, 0x80, 0x83, 0x5b, 0x60, 0x4e, 0x57, 0x0d, 0x44, 0x70, 0x6f, 0xd8, + 0x21, 0x8a, 0x69, 0xf4, 0x1c, 0x5e, 0x8a, 0x4a, 0xad, 0x65, 0x61, 0x34, 0xb7, 0x17, 0x17, 0xa3, + 0xa4, 0x3e, 0xdc, 0x05, 0x8b, 0x7e, 0xdb, 0x7d, 0xac, 0x3a, 0xd4, 0xb4, 0x87, 0xbb, 0xaa, 0xae, + 0x52, 0x5e, 0xa0, 0x4a, 0xad, 0xda, 0xe8, 0x6c, 0x75, 0x11, 0x65, 0xc8, 0x51, 0xa6, 0x15, 0xab, + 0x9d, 0x16, 0x76, 0x1d, 0xd2, 0xe3, 0x05, 0xa7, 0x1c, 0xd6, 0xce, 0x03, 0xbe, 0x8a, 0x84, 0x14, + 0xfe, 0x24, 0x96, 0xa6, 0xe5, 0xcb, 0xa5, 0x69, 0x35, 0x3f, 0x45, 0xe1, 0x11, 0x58, 0xb6, 0x6c, + 0xb3, 0x6f, 0x13, 0xc7, 0xd9, 0x26, 0xb8, 0xa7, 0xa9, 0x06, 0xf1, 0x4f, 0xa6, 0xc2, 0x77, 0xf4, + 0xd9, 0xe8, 0x6c, 0x75, 0xf9, 0x20, 0x5b, 0x05, 0xe5, 0xd9, 0x36, 0xfe, 0x52, 0x04, 0xd7, 0x92, + 0x3d, 0x0e, 0x3e, 0x01, 0xd0, 0xec, 0x3a, 0xc4, 0x1e, 0x90, 0xde, 0x23, 0x8f, 0xb8, 0x31, 0x76, + 0x23, 0x71, 0x76, 0x13, 0xbc, 0xdb, 0xfd, 0x94, 0x06, 0xca, 0xb0, 0xf2, 0xf8, 0x91, 0x78, 0x00, + 0x05, 0x1e, 0x68, 0x84, 0x1f, 0xa5, 0x1e, 0xc1, 0x16, 0x98, 0x13, 0x6f, 0xdf, 0x17, 0xf2, 0x64, + 0x8d, 0xdc, 0xfb, 0x51, 0x5c, 0x8c, 0x92, 0xfa, 0xf0, 0x11, 0x98, 0xc7, 0x03, 0xac, 0x6a, 0xb8, + 0xab, 0x91, 0x00, 0xa4, 0xc8, 0x41, 0x3e, 0x15, 0x20, 0xf3, 0x5b, 0x49, 0x05, 0x94, 0xb6, 0x81, + 0x7b, 0x60, 0xc1, 0x35, 0xd2, 0x50, 0x5e, 0x1e, 0x7e, 0x26, 0xa0, 0x16, 0x8e, 0xd2, 0x2a, 0x28, + 0xcb, 0x0e, 0xbe, 0x00, 0x40, 0xf1, 0x1b, 0xb3, 0x53, 0x9b, 0xe2, 0x95, 0xf4, 0x9b, 0x31, 0xde, + 0x4b, 0xd0, 0xcd, 0xc3, 0x2a, 0x16, 0x2c, 0x39, 0x28, 0x82, 0x09, 0xef, 0x83, 0x59, 0x9b, 0xbd, + 0x80, 0x20, 0xd4, 0x69, 0x1e, 0xea, 0x77, 0x84, 0xd9, 0x2c, 0x8a, 0x0a, 0x51, 0x5c, 0x17, 0xde, + 0x03, 0x55, 0xc5, 0xd4, 0x34, 0x9e, 0xf9, 0x6d, 0xd3, 0x35, 0x28, 0x4f, 0xde, 0x52, 0x0b, 0xb2, + 0xce, 0xdc, 0x8e, 0x49, 0x50, 0x42, 0xb3, 0xf1, 0x67, 0x29, 0xda, 0x66, 0xfc, 0xe7, 0x0c, 0xef, + 0xc5, 0xa8, 0xcf, 0x17, 0x09, 0xea, 0xb3, 0x94, 0xb6, 0x88, 0x30, 0x1f, 0x15, 0xcc, 0xb2, 0xe4, + 0x57, 0x8d, 0xbe, 0x77, 0xe1, 0xa2, 0x24, 0x7e, 0x7b, 0xee, 0x53, 0x0a, 0xb4, 0x23, 0x8d, 0x71, + 0x9e, 0xef, 0x3c, 0x2a, 0x44, 0x71, 0xe4, 0xc6, 0x03, 0x50, 0x8d, 0xbf, 0xc3, 0x18, 0xa7, 0x97, + 0x2e, 0xe4, 0xf4, 0x1f, 0x24, 0xb0, 0x9c, 0xe3, 0x1d, 0x6a, 0xa0, 0xaa, 0xe3, 0xd7, 0x91, 0x1c, + 0xb9, 0x90, 0x1b, 0xb3, 0xa9, 0x49, 0xf6, 0xa6, 0x26, 0x79, 0xc7, 0xa0, 0xfb, 0x76, 0x87, 0xda, + 0xaa, 0xd1, 0xf7, 0xee, 0x61, 0x2f, 0x86, 0x85, 0x12, 0xd8, 0xf0, 0x39, 0x28, 0xeb, 0xf8, 0x75, + 0xc7, 0xb5, 0xfb, 0x59, 0xe7, 0x35, 0x9e, 0x1f, 0xde, 0x3f, 0xf6, 0x04, 0x0a, 0x0a, 0xf0, 0x1a, + 0xfb, 0x60, 0x2d, 0xb6, 0x49, 0x56, 0x2a, 0xc8, 0x4b, 0x57, 0xeb, 0x90, 0xf0, 0xc2, 0xbf, 0x06, + 0x15, 0x0b, 0xdb, 0x54, 0x0d, 0xca, 0x45, 0xa9, 0x35, 0x3b, 0x3a, 0x5b, 0xad, 0x1c, 0xf8, 0x8b, + 0x28, 0x94, 0x37, 0xfe, 0x2d, 0x81, 0x52, 0x47, 0xc1, 0x1a, 0xb9, 0x82, 0xd1, 0x61, 0x3b, 0x36, + 0x3a, 0x34, 0x72, 0x93, 0x88, 0xc7, 0x93, 0x3b, 0x35, 0xec, 0x26, 0xa6, 0x86, 0xcf, 0x2f, 0xc0, + 0x39, 0x7f, 0x60, 0xb8, 0x0b, 0x2a, 0x81, 0xbb, 0x58, 0x95, 0x94, 0x2e, 0xaa, 0x92, 0x8d, 0xdf, + 0x17, 0xc0, 0x4c, 0xc4, 0xc5, 0xe5, 0xac, 0xd9, 0x71, 0x47, 0x88, 0x06, 0x2b, 0x43, 0x9b, 0xe3, + 0x6c, 0x44, 0xf6, 0x49, 0x85, 0xc7, 0xdf, 0xc2, 0xee, 0x9d, 0xe6, 0x1a, 0x0f, 0x40, 0x95, 0x62, + 0xbb, 0x4f, 0xa8, 0x2f, 0xe3, 0x07, 0x56, 0x09, 0x99, 0xfe, 0x61, 0x4c, 0x8a, 0x12, 0xda, 0x2b, + 0xf7, 0xc1, 0x6c, 0xcc, 0xd9, 0xa5, 0x48, 0xd8, 0x1b, 0x76, 0x38, 0x61, 0x72, 0x5e, 0x41, 0x76, + 0x3d, 0x89, 0x65, 0xd7, 0x7a, 0xfe, 0x61, 0x46, 0x9e, 0x4c, 0x5e, 0x8e, 0xa1, 0x44, 0x8e, 0x7d, + 0x35, 0x16, 0xda, 0xf9, 0x99, 0xf6, 0x27, 0x09, 0xcc, 0x45, 0xb4, 0xaf, 0x60, 0x82, 0xd9, 0x89, + 0x4f, 0x30, 0x9f, 0x8f, 0xb3, 0x89, 0x9c, 0x11, 0xe6, 0xaf, 0xa5, 0x58, 0xf0, 0xff, 0xf7, 0xa4, + 0xfa, 0x57, 0x60, 0x71, 0x60, 0x6a, 0xae, 0x4e, 0xda, 0x1a, 0x56, 0x75, 0x5f, 0x81, 0x31, 0x98, + 0xc9, 0xe4, 0x1f, 0x15, 0x01, 0x3c, 0xb1, 0x1d, 0xd5, 0xa1, 0xc4, 0xa0, 0xcf, 0x42, 0xcb, 0xd6, + 0x77, 0x85, 0x93, 0xc5, 0x67, 0x19, 0x70, 0x28, 0xd3, 0x09, 0xfc, 0x01, 0x98, 0x61, 0x04, 0x4e, + 0x55, 0x08, 0x9b, 0x05, 0xc5, 0xf4, 0xbf, 0x20, 0x80, 0x66, 0x3a, 0xa1, 0x08, 0x45, 0xf5, 0xe0, + 0x31, 0x58, 0xb0, 0xcc, 0xde, 0x1e, 0x36, 0x70, 0x9f, 0xb0, 0xb6, 0x77, 0xc0, 0xff, 0xd0, 0xe4, + 0x4c, 0xbb, 0xd2, 0xba, 0xed, 0x33, 0xa5, 0x83, 0xb4, 0xca, 0x47, 0x46, 0x59, 0xd3, 0xcb, 0x9c, + 0x07, 0x64, 0x41, 0x42, 0x1b, 0x54, 0x5d, 0xd1, 0x7e, 0xc4, 0xe0, 0xe1, 0xcd, 0xff, 0x9b, 0xe3, + 0x64, 0xd8, 0x51, 0xcc, 0x32, 0xac, 0x46, 0xf1, 0x75, 0x94, 0xf0, 0x90, 0x3b, 0x48, 0x94, 0xff, + 0x9b, 0x41, 0xa2, 0xf1, 0x9b, 0x22, 0x98, 0x4f, 0x3d, 0x5d, 0xf8, 0xa3, 0x73, 0x18, 0xf7, 0xd2, + 0xff, 0x8c, 0x6d, 0xa7, 0x08, 0xe3, 0xe4, 0x25, 0x08, 0xe3, 0x16, 0x98, 0x53, 0x5c, 0xdb, 0x66, + 0xb3, 0x7e, 0x9c, 0x65, 0x07, 0x54, 0xbd, 0x1d, 0x17, 0xa3, 0xa4, 0x7e, 0x16, 0xdb, 0x2f, 0x5d, + 0x92, 0xed, 0x47, 0xa3, 0x10, 0x8c, 0xcd, 0x4b, 0xbb, 0x74, 0x14, 0x82, 0xb8, 0x25, 0xf5, 0x59, + 0xb7, 0xf2, 0x50, 0x03, 0x84, 0xe9, 0x78, 0xb7, 0x3a, 0x8a, 0x49, 0x51, 0x42, 0x3b, 0x83, 0x39, + 0x57, 0xc6, 0x66, 0xce, 0x7f, 0x93, 0xc0, 0xa7, 0xb9, 0x19, 0x0a, 0xb7, 0x62, 0x04, 0x7a, 0x23, + 0x41, 0xa0, 0xbf, 0x97, 0x6b, 0x18, 0xe1, 0xd1, 0x76, 0x36, 0x8f, 0xbe, 0x3b, 0x1e, 0x8f, 0xce, + 0x20, 0x79, 0x17, 0x13, 0xea, 0xd6, 0xc6, 0xe9, 0xfb, 0xfa, 0xc4, 0xdb, 0xf7, 0xf5, 0x89, 0x77, + 0xef, 0xeb, 0x13, 0xbf, 0x1e, 0xd5, 0xa5, 0xd3, 0x51, 0x5d, 0x7a, 0x3b, 0xaa, 0x4b, 0xef, 0x46, + 0x75, 0xe9, 0x1f, 0xa3, 0xba, 0xf4, 0xbb, 0x0f, 0xf5, 0x89, 0xe7, 0xd3, 0xc2, 0xe3, 0x7f, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x3a, 0x2e, 0x29, 0xcd, 0xb9, 0x19, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/apps/v1beta1/generated.proto b/staging/src/k8s.io/api/apps/v1beta1/generated.proto index 79f49feac03f3..3d2c9dbf0bdde 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/apps/v1beta1/generated.proto @@ -208,7 +208,7 @@ message DeploymentStatus { // field as a collision avoidance mechanism when it needs to create the name for the // newest ReplicaSet. // +optional - optional int64 collisionCount = 8; + optional int32 collisionCount = 8; } // DeploymentStrategy describes how to replace existing pods with new ones. @@ -434,7 +434,7 @@ message StatefulSetStatus { // uses this field as a collision avoidance mechanism when it needs to create the name for the // newest ControllerRevision. // +optional - optional int64 collisionCount = 9; + optional int32 collisionCount = 9; } // StatefulSetUpdateStrategy indicates the strategy that the StatefulSet diff --git a/staging/src/k8s.io/api/apps/v1beta1/types.generated.go b/staging/src/k8s.io/api/apps/v1beta1/types.generated.go index faf2b8e711fa1..e687ac9521dec 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/types.generated.go +++ b/staging/src/k8s.io/api/apps/v1beta1/types.generated.go @@ -2812,13 +2812,13 @@ func (x *StatefulSetStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) } } else { if x.CollisionCount == nil { - x.CollisionCount = new(int64) + x.CollisionCount = new(int32) } yym19 := z.DecBinary() _ = yym19 if false { } else { - *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + *((*int32)(x.CollisionCount)) = int32(r.DecodeInt(32)) } } default: @@ -3010,13 +3010,13 @@ func (x *StatefulSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder } } else { if x.CollisionCount == nil { - x.CollisionCount = new(int64) + x.CollisionCount = new(int32) } yym36 := z.DecBinary() _ = yym36 if false { } else { - *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + *((*int32)(x.CollisionCount)) = int32(r.DecodeInt(32)) } } for { @@ -6008,13 +6008,13 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } } else { if x.CollisionCount == nil { - x.CollisionCount = new(int64) + x.CollisionCount = new(int32) } yym19 := z.DecBinary() _ = yym19 if false { } else { - *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + *((*int32)(x.CollisionCount)) = int32(r.DecodeInt(32)) } } default: @@ -6202,13 +6202,13 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) } } else { if x.CollisionCount == nil { - x.CollisionCount = new(int64) + x.CollisionCount = new(int32) } yym36 := z.DecBinary() _ = yym36 if false { } else { - *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + *((*int32)(x.CollisionCount)) = int32(r.DecodeInt(32)) } } for { diff --git a/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go index 4ee37fe96369c..2f046b02057dd 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go @@ -377,7 +377,7 @@ func (in *DeploymentStatus) DeepCopyInto(out *DeploymentStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } @@ -694,7 +694,7 @@ func (in *StatefulSetStatus) DeepCopyInto(out *StatefulSetStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } diff --git a/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go b/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go index bc561c69f2711..07d95d8aca5c7 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go +++ b/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go @@ -3167,7 +3167,7 @@ func (m *DaemonSetStatus) Unmarshal(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) } - var v int64 + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3177,7 +3177,7 @@ func (m *DaemonSetStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int64(b) & 0x7F) << shift + v |= (int32(b) & 0x7F) << shift if b < 0x80 { break } @@ -4213,7 +4213,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) } - var v int64 + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -4223,7 +4223,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int64(b) & 0x7F) << shift + v |= (int32(b) & 0x7F) << shift if b < 0x80 { break } @@ -6538,7 +6538,7 @@ func (m *StatefulSetStatus) Unmarshal(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) } - var v int64 + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -6548,7 +6548,7 @@ func (m *StatefulSetStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int64(b) & 0x7F) << shift + v |= (int32(b) & 0x7F) << shift if b < 0x80 { break } @@ -6804,131 +6804,131 @@ var fileDescriptorGenerated = []byte{ 0x28, 0xc9, 0x40, 0x83, 0x16, 0x30, 0xb5, 0x4b, 0xaf, 0x26, 0x9a, 0x17, 0x66, 0x38, 0x5b, 0x2f, 0x7a, 0xe9, 0xa9, 0x40, 0x81, 0x02, 0xe9, 0xb9, 0xff, 0x44, 0x7b, 0x2a, 0x8a, 0xf6, 0x56, 0x04, 0x85, 0x2f, 0x05, 0x82, 0x5e, 0x92, 0x93, 0x50, 0x6f, 0x8e, 0x3d, 0xf7, 0x12, 0xa0, 0x40, 0x41, - 0x0e, 0xe7, 0xc1, 0x79, 0x58, 0x23, 0x25, 0xde, 0x14, 0xb9, 0xed, 0x90, 0xbf, 0xef, 0xc7, 0x8f, - 0xe4, 0xc7, 0xef, 0xfb, 0x0d, 0x67, 0xc1, 0x8f, 0x4f, 0xde, 0x75, 0x55, 0xcd, 0x6a, 0x9d, 0x78, - 0x47, 0xc4, 0x31, 0x09, 0x25, 0x6e, 0xab, 0x4f, 0xcc, 0xae, 0xe5, 0xb4, 0x44, 0x07, 0xb6, 0xb5, - 0x16, 0xb6, 0x6d, 0xb7, 0xd5, 0xbf, 0x73, 0x44, 0x28, 0x5e, 0x6b, 0xf5, 0x88, 0x49, 0x1c, 0x4c, - 0x49, 0x57, 0xb5, 0x1d, 0x8b, 0x5a, 0x70, 0xc1, 0x07, 0xaa, 0xd8, 0xd6, 0x54, 0x06, 0x54, 0x05, - 0x70, 0xe9, 0x56, 0x4f, 0xa3, 0xc7, 0xde, 0x91, 0xda, 0xb1, 0x8c, 0x56, 0xcf, 0xea, 0x59, 0x2d, - 0x8e, 0x3f, 0xf2, 0x9e, 0xf0, 0x27, 0xfe, 0xc0, 0x7f, 0xf9, 0x3c, 0x4b, 0xcd, 0xd8, 0x80, 0x1d, - 0xcb, 0x21, 0xad, 0xfe, 0x9d, 0xe4, 0x58, 0x4b, 0xd7, 0x63, 0x18, 0xdb, 0xd2, 0xb5, 0xce, 0x40, - 0xb8, 0x95, 0x86, 0xbe, 0x15, 0x41, 0x0d, 0xdc, 0x39, 0xd6, 0x4c, 0xe2, 0x0c, 0x5a, 0xf6, 0x49, - 0x8f, 0x35, 0xb8, 0x2d, 0x83, 0x50, 0x9c, 0x35, 0x40, 0x2b, 0xcf, 0xca, 0xf1, 0x4c, 0xaa, 0x19, - 0x24, 0x65, 0xf0, 0xce, 0x59, 0x06, 0x6e, 0xe7, 0x98, 0x18, 0x38, 0x65, 0xf7, 0x66, 0x9e, 0x9d, - 0x47, 0x35, 0xbd, 0xa5, 0x99, 0xd4, 0xa5, 0x4e, 0xd2, 0xa8, 0xf9, 0x1f, 0x05, 0xc0, 0x0d, 0xcb, - 0xa4, 0x8e, 0xa5, 0xeb, 0xc4, 0x41, 0xa4, 0xaf, 0xb9, 0x9a, 0x65, 0xc2, 0xc7, 0xa0, 0xc6, 0xe6, - 0xd3, 0xc5, 0x14, 0x2f, 0x2a, 0x2b, 0xca, 0xea, 0xe4, 0xda, 0x6d, 0x35, 0xda, 0x94, 0x90, 0x5e, - 0xb5, 0x4f, 0x7a, 0xac, 0xc1, 0x55, 0x19, 0x5a, 0xed, 0xdf, 0x51, 0x77, 0x8f, 0x3e, 0x26, 0x1d, - 0xba, 0x4d, 0x28, 0x6e, 0xc3, 0x67, 0xa7, 0xcb, 0x63, 0xc3, 0xd3, 0x65, 0x10, 0xb5, 0xa1, 0x90, - 0x15, 0xee, 0x82, 0x0a, 0x67, 0x2f, 0x71, 0xf6, 0x5b, 0xb9, 0xec, 0x62, 0xd2, 0x2a, 0xc2, 0xbf, - 0x78, 0xff, 0x29, 0x25, 0x26, 0x73, 0xaf, 0x7d, 0x49, 0x50, 0x57, 0x36, 0x31, 0xc5, 0x88, 0x13, - 0xc1, 0x9b, 0xa0, 0xe6, 0x08, 0xf7, 0x17, 0xcb, 0x2b, 0xca, 0x6a, 0xb9, 0x7d, 0x59, 0xa0, 0x6a, - 0xc1, 0xb4, 0x50, 0x88, 0x68, 0x3e, 0x53, 0xc0, 0x7c, 0x7a, 0xde, 0x5b, 0x9a, 0x4b, 0xe1, 0xcf, - 0x52, 0x73, 0x57, 0x8b, 0xcd, 0x9d, 0x59, 0xf3, 0x99, 0x87, 0x03, 0x07, 0x2d, 0xb1, 0x79, 0xef, - 0x81, 0xaa, 0x46, 0x89, 0xe1, 0x2e, 0x96, 0x56, 0xca, 0xab, 0x93, 0x6b, 0x37, 0xd4, 0x9c, 0x58, - 0x57, 0xd3, 0xde, 0xb5, 0xa7, 0x04, 0x6f, 0xf5, 0x21, 0x63, 0x40, 0x3e, 0x51, 0xf3, 0x37, 0x25, - 0x50, 0xdf, 0xc4, 0xc4, 0xb0, 0xcc, 0x7d, 0x42, 0x47, 0xb0, 0x73, 0x0f, 0x40, 0xc5, 0xb5, 0x49, - 0x47, 0xec, 0xdc, 0xb5, 0xdc, 0x09, 0x84, 0x3e, 0xed, 0xdb, 0xa4, 0x13, 0x6d, 0x19, 0x7b, 0x42, - 0x9c, 0x01, 0xee, 0x81, 0x71, 0x97, 0x62, 0xea, 0xb9, 0x7c, 0xc3, 0x26, 0xd7, 0x56, 0x0b, 0x70, - 0x71, 0x7c, 0x7b, 0x5a, 0xb0, 0x8d, 0xfb, 0xcf, 0x48, 0xf0, 0x34, 0xff, 0xa4, 0x80, 0xa9, 0x10, - 0x3b, 0x82, 0xdd, 0xbc, 0x2f, 0xef, 0x66, 0xf3, 0xec, 0x09, 0xe4, 0x6c, 0xe2, 0xa7, 0xe5, 0x98, - 0xe3, 0x6c, 0x89, 0xe0, 0xcf, 0x41, 0xcd, 0x25, 0x3a, 0xe9, 0x50, 0xcb, 0x11, 0x8e, 0xbf, 0x59, - 0xd0, 0x71, 0x7c, 0x44, 0xf4, 0x7d, 0x61, 0xda, 0xbe, 0xc4, 0x3c, 0x0f, 0x9e, 0x50, 0x48, 0x09, - 0x3f, 0x04, 0x35, 0x4a, 0x0c, 0x5b, 0xc7, 0x94, 0x88, 0x9d, 0x7c, 0x35, 0xee, 0x3c, 0x4b, 0x97, - 0x8c, 0x6c, 0xcf, 0xea, 0x1e, 0x08, 0x18, 0xdf, 0xc6, 0x70, 0x31, 0x82, 0x56, 0x14, 0xd2, 0x40, - 0x1b, 0x4c, 0x7b, 0x76, 0x97, 0x21, 0x29, 0x4b, 0x31, 0xbd, 0x81, 0xd8, 0xd6, 0xdb, 0x67, 0xaf, - 0xca, 0xa1, 0x64, 0xd7, 0x9e, 0x17, 0xa3, 0x4c, 0xcb, 0xed, 0x28, 0xc1, 0x0f, 0xd7, 0xc1, 0x8c, - 0xa1, 0x99, 0x88, 0xe0, 0xee, 0x60, 0x9f, 0x74, 0x2c, 0xb3, 0xeb, 0x2e, 0x56, 0x56, 0x94, 0xd5, - 0x6a, 0x7b, 0x41, 0x10, 0xcc, 0x6c, 0xcb, 0xdd, 0x28, 0x89, 0x87, 0x5b, 0x60, 0x2e, 0x48, 0x0a, - 0x0f, 0x34, 0x97, 0x5a, 0xce, 0x60, 0x4b, 0x33, 0x34, 0xba, 0x38, 0xce, 0x79, 0x16, 0x87, 0xa7, - 0xcb, 0x73, 0x28, 0xa3, 0x1f, 0x65, 0x5a, 0x35, 0xff, 0x58, 0x05, 0x33, 0x89, 0x58, 0x85, 0x8f, - 0xc0, 0x7c, 0xc7, 0x73, 0x1c, 0x62, 0xd2, 0x1d, 0xcf, 0x38, 0x22, 0xce, 0x7e, 0xe7, 0x98, 0x74, - 0x3d, 0x9d, 0x74, 0xf9, 0xb6, 0x56, 0xdb, 0x0d, 0xe1, 0xeb, 0xfc, 0x46, 0x26, 0x0a, 0xe5, 0x58, - 0xc3, 0x0f, 0x00, 0x34, 0x79, 0xd3, 0xb6, 0xe6, 0xba, 0x21, 0x67, 0x89, 0x73, 0x2e, 0x09, 0x4e, - 0xb8, 0x93, 0x42, 0xa0, 0x0c, 0x2b, 0xe6, 0x63, 0x97, 0xb8, 0x9a, 0x43, 0xba, 0x49, 0x1f, 0xcb, - 0xb2, 0x8f, 0x9b, 0x99, 0x28, 0x94, 0x63, 0x0d, 0xdf, 0x06, 0x93, 0xfe, 0x68, 0x7c, 0xcd, 0xc5, - 0xe6, 0xcc, 0x0a, 0xb2, 0xc9, 0x9d, 0xa8, 0x0b, 0xc5, 0x71, 0x6c, 0x6a, 0xd6, 0x91, 0x4b, 0x9c, - 0x3e, 0xe9, 0xde, 0xf7, 0x0b, 0x16, 0xcb, 0xea, 0x55, 0x9e, 0xd5, 0xc3, 0xa9, 0xed, 0xa6, 0x10, - 0x28, 0xc3, 0x8a, 0x4d, 0xcd, 0x8f, 0x9a, 0xd4, 0xd4, 0xc6, 0xe5, 0xa9, 0x1d, 0x66, 0xa2, 0x50, - 0x8e, 0x35, 0x8b, 0x3d, 0xdf, 0xe5, 0xf5, 0x3e, 0xd6, 0x74, 0x7c, 0xa4, 0x93, 0xc5, 0x09, 0x39, - 0xf6, 0x76, 0xe4, 0x6e, 0x94, 0xc4, 0xc3, 0xfb, 0xe0, 0x8a, 0xdf, 0x74, 0x68, 0xe2, 0x90, 0xa4, - 0xc6, 0x49, 0x5e, 0x11, 0x24, 0x57, 0x76, 0x92, 0x00, 0x94, 0xb6, 0x81, 0x77, 0xc1, 0x74, 0xc7, - 0xd2, 0x75, 0x1e, 0x8f, 0x1b, 0x96, 0x67, 0xd2, 0xc5, 0x3a, 0x5f, 0x2b, 0xc8, 0xce, 0xd0, 0x86, - 0xd4, 0x83, 0x12, 0xc8, 0xe6, 0xa7, 0x0a, 0x58, 0xc8, 0x39, 0x87, 0xf0, 0x47, 0xa0, 0x42, 0x07, - 0x36, 0xe1, 0x81, 0x5a, 0x6f, 0xdf, 0x08, 0x52, 0xf8, 0xc1, 0xc0, 0x26, 0x5f, 0x9d, 0x2e, 0x5f, - 0xcd, 0x31, 0x63, 0xdd, 0x88, 0x1b, 0xc2, 0x63, 0x30, 0xc5, 0x6a, 0x98, 0x66, 0xf6, 0x7c, 0x88, - 0x48, 0x35, 0xad, 0xdc, 0x8c, 0x80, 0xe2, 0xe8, 0x28, 0x69, 0x5e, 0x19, 0x9e, 0x2e, 0x4f, 0x49, - 0x7d, 0x48, 0x26, 0x6e, 0xfe, 0xb6, 0x04, 0xc0, 0x26, 0xb1, 0x75, 0x6b, 0x60, 0x10, 0x73, 0x14, - 0x65, 0xf0, 0xa1, 0x54, 0x06, 0x5f, 0xcf, 0xcf, 0x71, 0xa1, 0x53, 0xb9, 0x75, 0xf0, 0xc3, 0x44, - 0x1d, 0xbc, 0x5e, 0x84, 0xec, 0xc5, 0x85, 0xf0, 0xf3, 0x32, 0x98, 0x8d, 0xc0, 0x1b, 0x96, 0xd9, - 0xd5, 0xf8, 0x69, 0xb8, 0x27, 0xed, 0xe8, 0xeb, 0x89, 0x1d, 0x5d, 0xc8, 0x30, 0x89, 0xed, 0xe6, - 0x56, 0xe8, 0x67, 0x89, 0x9b, 0xbf, 0x25, 0x0f, 0xfe, 0xd5, 0xe9, 0x72, 0x86, 0xe2, 0x56, 0x43, - 0x26, 0xd9, 0x45, 0x78, 0x0d, 0x8c, 0x3b, 0x04, 0xbb, 0x96, 0xc9, 0xd3, 0x42, 0x3d, 0x9a, 0x0a, - 0xe2, 0xad, 0x48, 0xf4, 0xc2, 0xeb, 0x60, 0xc2, 0x20, 0xae, 0x8b, 0x7b, 0x84, 0x67, 0x80, 0x7a, - 0x7b, 0x46, 0x00, 0x27, 0xb6, 0xfd, 0x66, 0x14, 0xf4, 0xc3, 0x8f, 0xc1, 0xb4, 0x8e, 0x5d, 0x11, - 0x8e, 0x07, 0x9a, 0x41, 0xf8, 0x19, 0x9f, 0x5c, 0x7b, 0xa3, 0xd8, 0xde, 0x33, 0x8b, 0xa8, 0xf6, - 0x6c, 0x49, 0x4c, 0x28, 0xc1, 0x0c, 0xfb, 0x00, 0xb2, 0x96, 0x03, 0x07, 0x9b, 0xae, 0xbf, 0x50, - 0x6c, 0xbc, 0x89, 0x73, 0x8f, 0x17, 0xe6, 0xb3, 0xad, 0x14, 0x1b, 0xca, 0x18, 0xa1, 0xf9, 0x67, - 0x05, 0x4c, 0x47, 0xdb, 0x34, 0x02, 0x8d, 0xf3, 0x40, 0xd6, 0x38, 0xaf, 0x16, 0x08, 0xce, 0x1c, - 0x91, 0xf3, 0x79, 0x25, 0xee, 0x3a, 0x57, 0x39, 0xab, 0x4c, 0xb5, 0xdb, 0xba, 0xd6, 0xc1, 0xae, - 0x28, 0x87, 0x97, 0x7c, 0xc5, 0xee, 0xb7, 0xa1, 0xb0, 0x57, 0xd2, 0x43, 0xa5, 0x97, 0xab, 0x87, - 0xca, 0xdf, 0x8c, 0x1e, 0xfa, 0x29, 0xa8, 0xb9, 0x81, 0x12, 0xaa, 0x70, 0xca, 0x1b, 0x85, 0x0e, - 0xb6, 0x10, 0x41, 0x21, 0x75, 0x28, 0x7f, 0x42, 0xba, 0x2c, 0xe1, 0x53, 0xfd, 0x36, 0x85, 0x0f, - 0x3b, 0xcc, 0x36, 0xf6, 0x5c, 0xd2, 0xe5, 0x27, 0xa0, 0x16, 0x1d, 0xe6, 0x3d, 0xde, 0x8a, 0x44, - 0x2f, 0x3c, 0x04, 0x0b, 0xb6, 0x63, 0xf5, 0x1c, 0xe2, 0xba, 0x9b, 0x04, 0x77, 0x75, 0xcd, 0x24, - 0xc1, 0x04, 0xea, 0x7c, 0xe0, 0xab, 0xc3, 0xd3, 0xe5, 0x85, 0xbd, 0x6c, 0x08, 0xca, 0xb3, 0x6d, - 0xfe, 0xad, 0x02, 0x2e, 0x27, 0x73, 0x63, 0x8e, 0x8a, 0x50, 0x2e, 0xa4, 0x22, 0x6e, 0xc6, 0xe2, - 0xd4, 0x97, 0x58, 0xb1, 0xb7, 0xcb, 0x54, 0xac, 0xae, 0x83, 0x19, 0xa1, 0x1a, 0x82, 0x4e, 0xa1, - 0xa3, 0xc2, 0xed, 0x39, 0x94, 0xbb, 0x51, 0x12, 0xcf, 0xb4, 0x41, 0x54, 0xf2, 0x03, 0x92, 0x8a, - 0xac, 0x0d, 0xd6, 0x93, 0x00, 0x94, 0xb6, 0x81, 0xdb, 0x60, 0xd6, 0x33, 0xd3, 0x54, 0x7e, 0xb8, - 0x5c, 0x15, 0x54, 0xb3, 0x87, 0x69, 0x08, 0xca, 0xb2, 0x83, 0x8f, 0x01, 0xe8, 0x04, 0x09, 0xdd, - 0x5d, 0x1c, 0xe7, 0x29, 0xe1, 0x66, 0x81, 0xb0, 0x0e, 0xab, 0x40, 0x54, 0x56, 0xc3, 0x26, 0x17, - 0xc5, 0x38, 0xe1, 0x3d, 0x30, 0xe5, 0x70, 0x49, 0x18, 0xb8, 0xea, 0xcb, 0xaa, 0xef, 0x09, 0xb3, - 0x29, 0x14, 0xef, 0x44, 0x32, 0x36, 0x43, 0x09, 0xd5, 0x0a, 0x2b, 0xa1, 0xbf, 0x2a, 0x00, 0xa6, - 0xcf, 0x21, 0xbc, 0x2b, 0x95, 0xcc, 0x6b, 0x89, 0x92, 0x39, 0x9f, 0xb6, 0x88, 0x55, 0x4c, 0x2d, - 0x5b, 0xff, 0xdc, 0x2e, 0xa8, 0x7f, 0xa2, 0x84, 0x5a, 0x4c, 0x00, 0x89, 0x65, 0x18, 0xcd, 0x3d, - 0x40, 0x51, 0x01, 0x14, 0x39, 0xf5, 0x0d, 0x08, 0xa0, 0x18, 0xd9, 0x8b, 0x05, 0xd0, 0xbf, 0x4b, - 0x60, 0x36, 0x02, 0x17, 0x16, 0x40, 0x19, 0x26, 0x2f, 0x4d, 0x00, 0x65, 0x2b, 0x88, 0xf2, 0xcb, - 0x56, 0x10, 0x2f, 0x41, 0x78, 0x71, 0x51, 0x12, 0x2d, 0xdd, 0xff, 0x93, 0x28, 0x89, 0xbc, 0xca, - 0x11, 0x25, 0x7f, 0x28, 0xc5, 0x5d, 0xff, 0xce, 0x8b, 0x92, 0xaf, 0x7f, 0x65, 0xd2, 0xfc, 0x7b, - 0x19, 0x5c, 0x4e, 0x9e, 0x43, 0xa9, 0x40, 0x2a, 0x67, 0x16, 0xc8, 0x3d, 0x30, 0xf7, 0xc4, 0xd3, - 0xf5, 0x01, 0x5f, 0x86, 0x58, 0x95, 0xf4, 0x4b, 0xeb, 0xf7, 0x85, 0xe5, 0xdc, 0x4f, 0x32, 0x30, - 0x28, 0xd3, 0x32, 0xa7, 0xd8, 0x97, 0x2f, 0x54, 0xec, 0x53, 0x15, 0xa8, 0x72, 0x8e, 0x0a, 0x94, - 0x59, 0xb8, 0xab, 0x17, 0x28, 0xdc, 0xe7, 0xab, 0xb4, 0x19, 0x89, 0xeb, 0xac, 0x4a, 0xdb, 0xfc, - 0xb5, 0x02, 0xe6, 0xb3, 0x5f, 0xb8, 0xa1, 0x0e, 0xa6, 0x0d, 0xfc, 0x34, 0x7e, 0x2f, 0x71, 0x56, - 0x11, 0xf1, 0xa8, 0xa6, 0xab, 0xfe, 0x57, 0x06, 0xf5, 0xa1, 0x49, 0x77, 0x9d, 0x7d, 0xea, 0x68, - 0x66, 0xcf, 0xaf, 0xbc, 0xdb, 0x12, 0x17, 0x4a, 0x70, 0x37, 0xbf, 0x54, 0xc0, 0x42, 0x4e, 0xe5, - 0x1b, 0xad, 0x27, 0xf0, 0x23, 0x50, 0x33, 0xf0, 0xd3, 0x7d, 0xcf, 0xe9, 0x65, 0xd5, 0xea, 0x62, - 0xe3, 0xf0, 0xd3, 0xbc, 0x2d, 0x58, 0x50, 0xc8, 0xd7, 0xdc, 0x05, 0x2b, 0xd2, 0x24, 0xd9, 0xc9, - 0x21, 0x4f, 0x3c, 0x9d, 0x1f, 0x22, 0x21, 0x36, 0x6e, 0x80, 0xba, 0x8d, 0x1d, 0xaa, 0x85, 0x52, - 0xb5, 0xda, 0x9e, 0x1a, 0x9e, 0x2e, 0xd7, 0xf7, 0x82, 0x46, 0x14, 0xf5, 0x37, 0xff, 0xab, 0x80, - 0xea, 0x7e, 0x07, 0xeb, 0x64, 0x04, 0xd5, 0x7e, 0x53, 0xaa, 0xf6, 0xf9, 0x17, 0xdd, 0xdc, 0x9f, - 0xdc, 0x42, 0xbf, 0x95, 0x28, 0xf4, 0xaf, 0x9d, 0xc1, 0xf3, 0xe2, 0x1a, 0xff, 0x1e, 0xa8, 0x87, - 0xc3, 0x9d, 0x2f, 0x01, 0x35, 0x7f, 0x5f, 0x02, 0x93, 0xb1, 0x21, 0xce, 0x99, 0xbe, 0x1e, 0x4b, - 0x69, 0x9f, 0x1d, 0xcc, 0xb5, 0x22, 0x13, 0x51, 0x83, 0x14, 0xff, 0xbe, 0x49, 0x9d, 0xf8, 0x0b, - 0x5e, 0x3a, 0xf3, 0xff, 0x10, 0x4c, 0x53, 0xec, 0xf4, 0x08, 0x0d, 0xfa, 0xf8, 0x82, 0xd5, 0xa3, - 0xdb, 0x89, 0x03, 0xa9, 0x17, 0x25, 0xd0, 0x4b, 0xf7, 0xc0, 0x94, 0x34, 0x18, 0xbc, 0x0c, 0xca, - 0x27, 0x64, 0xe0, 0xcb, 0x1e, 0xc4, 0x7e, 0xc2, 0x39, 0x50, 0xed, 0x63, 0xdd, 0xf3, 0xe3, 0xbc, - 0x8e, 0xfc, 0x87, 0xbb, 0xa5, 0x77, 0x95, 0xe6, 0x27, 0x6c, 0x71, 0xa2, 0xe0, 0x1c, 0x41, 0x74, - 0x7d, 0x20, 0x45, 0x57, 0xfe, 0x77, 0xa0, 0xf8, 0x91, 0xc9, 0x8b, 0x31, 0x94, 0x88, 0xb1, 0x37, - 0x0a, 0xb1, 0xbd, 0x38, 0xd2, 0xfe, 0xa2, 0x80, 0x99, 0x18, 0x7a, 0x04, 0x02, 0xe7, 0xa1, 0x2c, - 0x70, 0x5e, 0x2b, 0x32, 0x89, 0x1c, 0x85, 0xf3, 0x8f, 0xaa, 0xe4, 0xfc, 0x77, 0x5e, 0xe2, 0xfc, - 0x12, 0xcc, 0xf5, 0x2d, 0xdd, 0x33, 0xc8, 0x86, 0x8e, 0x35, 0x23, 0x00, 0xb0, 0x2a, 0x5e, 0x4e, - 0xbe, 0x5b, 0x84, 0xf4, 0xc4, 0x71, 0x35, 0x97, 0x12, 0x93, 0x3e, 0x8a, 0x2c, 0x23, 0x1d, 0xf2, - 0x28, 0x83, 0x0e, 0x65, 0x0e, 0x02, 0xdf, 0x06, 0x93, 0x4c, 0x4f, 0x68, 0x1d, 0xb2, 0x83, 0x8d, - 0x40, 0x38, 0x87, 0x5f, 0x3c, 0xf6, 0xa3, 0x2e, 0x14, 0xc7, 0xc1, 0x63, 0x30, 0x6b, 0x5b, 0xdd, - 0x6d, 0x6c, 0xe2, 0x1e, 0x61, 0x65, 0x6f, 0x8f, 0xff, 0x15, 0x81, 0x5f, 0xc6, 0xd4, 0xdb, 0xef, - 0x04, 0x6f, 0xe9, 0x7b, 0x69, 0x08, 0x7b, 0x69, 0xc9, 0x68, 0xe6, 0x2f, 0x2d, 0x59, 0x94, 0xd0, - 0x49, 0x7d, 0xa5, 0xf3, 0xef, 0x2c, 0xd7, 0x8a, 0x44, 0xd8, 0x05, 0xbf, 0xd3, 0xe5, 0xdd, 0x35, - 0xd5, 0x2e, 0xf4, 0x91, 0xed, 0x93, 0x0a, 0xb8, 0x92, 0x3a, 0xba, 0xdf, 0xe2, 0x6d, 0x4f, 0x4a, - 0x2e, 0x96, 0xcf, 0x21, 0x17, 0xd7, 0xc1, 0x8c, 0xf8, 0xbe, 0x97, 0x50, 0x9b, 0xa1, 0x1e, 0xdf, - 0x90, 0xbb, 0x51, 0x12, 0x9f, 0x75, 0xdb, 0x54, 0x3d, 0xe7, 0x6d, 0x53, 0xdc, 0x0b, 0xf1, 0x1f, - 0x0a, 0x3f, 0xf4, 0xd2, 0x5e, 0x88, 0xbf, 0x52, 0x24, 0xf1, 0xac, 0x62, 0xf9, 0xac, 0x21, 0xc3, - 0x84, 0x5c, 0xb1, 0x0e, 0xa5, 0x5e, 0x94, 0x40, 0x7f, 0xad, 0x6f, 0x58, 0xff, 0x54, 0xc0, 0x2b, - 0xb9, 0x51, 0x0a, 0xd7, 0xa5, 0x57, 0xfe, 0x5b, 0x89, 0x57, 0xfe, 0x1f, 0xe4, 0x1a, 0xc6, 0x5e, - 0xfc, 0x9d, 0xec, 0x7b, 0x9c, 0xf7, 0x8a, 0xdd, 0xe3, 0x64, 0x08, 0xbd, 0xb3, 0x2f, 0x74, 0xda, - 0xb7, 0x9e, 0x3d, 0x6f, 0x8c, 0x7d, 0xf6, 0xbc, 0x31, 0xf6, 0xc5, 0xf3, 0xc6, 0xd8, 0xaf, 0x86, - 0x0d, 0xe5, 0xd9, 0xb0, 0xa1, 0x7c, 0x36, 0x6c, 0x28, 0x5f, 0x0c, 0x1b, 0xca, 0xbf, 0x86, 0x0d, - 0xe5, 0x77, 0x5f, 0x36, 0xc6, 0x3e, 0x9a, 0x10, 0x23, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xc2, - 0x59, 0x7e, 0xf2, 0x77, 0x25, 0x00, 0x00, + 0x0e, 0xe7, 0xc1, 0x79, 0x58, 0x23, 0x25, 0xde, 0x14, 0xb9, 0x69, 0xf9, 0xfd, 0xbe, 0x1f, 0x3f, + 0x0e, 0x3f, 0x7e, 0xdf, 0x6f, 0x38, 0x02, 0x3f, 0x3e, 0x79, 0xd7, 0x55, 0x35, 0xab, 0x75, 0xe2, + 0x1d, 0x11, 0xc7, 0x24, 0x94, 0xb8, 0xad, 0x3e, 0x31, 0xbb, 0x96, 0xd3, 0x12, 0x06, 0x6c, 0x6b, + 0x2d, 0x6c, 0xdb, 0x6e, 0xab, 0x7f, 0xe7, 0x88, 0x50, 0xbc, 0xd6, 0xea, 0x11, 0x93, 0x38, 0x98, + 0x92, 0xae, 0x6a, 0x3b, 0x16, 0xb5, 0xe0, 0x82, 0x0f, 0x54, 0xb1, 0xad, 0xa9, 0x0c, 0xa8, 0x0a, + 0xe0, 0xd2, 0xad, 0x9e, 0x46, 0x8f, 0xbd, 0x23, 0xb5, 0x63, 0x19, 0xad, 0x9e, 0xd5, 0xb3, 0x5a, + 0x1c, 0x7f, 0xe4, 0x3d, 0xe1, 0xbf, 0xf8, 0x0f, 0xfe, 0x97, 0xcf, 0xb3, 0xd4, 0x8c, 0x4d, 0xd8, + 0xb1, 0x1c, 0xd2, 0xea, 0xdf, 0x49, 0xce, 0xb5, 0x74, 0x3d, 0x86, 0xb1, 0x2d, 0x5d, 0xeb, 0x0c, + 0x44, 0x58, 0x69, 0xe8, 0x5b, 0x11, 0xd4, 0xc0, 0x9d, 0x63, 0xcd, 0x24, 0xce, 0xa0, 0x65, 0x9f, + 0xf4, 0xd8, 0x80, 0xdb, 0x32, 0x08, 0xc5, 0x59, 0x13, 0xb4, 0xf2, 0xbc, 0x1c, 0xcf, 0xa4, 0x9a, + 0x41, 0x52, 0x0e, 0xef, 0x9c, 0xe5, 0xe0, 0x76, 0x8e, 0x89, 0x81, 0x53, 0x7e, 0x6f, 0xe6, 0xf9, + 0x79, 0x54, 0xd3, 0x5b, 0x9a, 0x49, 0x5d, 0xea, 0x24, 0x9d, 0x9a, 0xff, 0x51, 0x00, 0xdc, 0xb0, + 0x4c, 0xea, 0x58, 0xba, 0x4e, 0x1c, 0x44, 0xfa, 0x9a, 0xab, 0x59, 0x26, 0x7c, 0x0c, 0x6a, 0x6c, + 0x3d, 0x5d, 0x4c, 0xf1, 0xa2, 0xb2, 0xa2, 0xac, 0x4e, 0xae, 0xdd, 0x56, 0xa3, 0x4d, 0x09, 0xe9, + 0x55, 0xfb, 0xa4, 0xc7, 0x06, 0x5c, 0x95, 0xa1, 0xd5, 0xfe, 0x1d, 0x75, 0xf7, 0xe8, 0x63, 0xd2, + 0xa1, 0xdb, 0x84, 0xe2, 0x36, 0x7c, 0x76, 0xba, 0x3c, 0x36, 0x3c, 0x5d, 0x06, 0xd1, 0x18, 0x0a, + 0x59, 0xe1, 0x2e, 0xa8, 0x70, 0xf6, 0x12, 0x67, 0xbf, 0x95, 0xcb, 0x2e, 0x16, 0xad, 0x22, 0xfc, + 0x8b, 0xf7, 0x9f, 0x52, 0x62, 0xb2, 0xf0, 0xda, 0x97, 0x04, 0x75, 0x65, 0x13, 0x53, 0x8c, 0x38, + 0x11, 0xbc, 0x09, 0x6a, 0x8e, 0x08, 0x7f, 0xb1, 0xbc, 0xa2, 0xac, 0x96, 0xdb, 0x97, 0x05, 0xaa, + 0x16, 0x2c, 0x0b, 0x85, 0x88, 0xe6, 0x33, 0x05, 0xcc, 0xa7, 0xd7, 0xbd, 0xa5, 0xb9, 0x14, 0xfe, + 0x2c, 0xb5, 0x76, 0xb5, 0xd8, 0xda, 0x99, 0x37, 0x5f, 0x79, 0x38, 0x71, 0x30, 0x12, 0x5b, 0xf7, + 0x1e, 0xa8, 0x6a, 0x94, 0x18, 0xee, 0x62, 0x69, 0xa5, 0xbc, 0x3a, 0xb9, 0x76, 0x43, 0xcd, 0xc9, + 0x75, 0x35, 0x1d, 0x5d, 0x7b, 0x4a, 0xf0, 0x56, 0x1f, 0x32, 0x06, 0xe4, 0x13, 0x35, 0x7f, 0x53, + 0x02, 0xf5, 0x4d, 0x4c, 0x0c, 0xcb, 0xdc, 0x27, 0x74, 0x04, 0x3b, 0xf7, 0x00, 0x54, 0x5c, 0x9b, + 0x74, 0xc4, 0xce, 0x5d, 0xcb, 0x5d, 0x40, 0x18, 0xd3, 0xbe, 0x4d, 0x3a, 0xd1, 0x96, 0xb1, 0x5f, + 0x88, 0x33, 0xc0, 0x3d, 0x30, 0xee, 0x52, 0x4c, 0x3d, 0x97, 0x6f, 0xd8, 0xe4, 0xda, 0x6a, 0x01, + 0x2e, 0x8e, 0x6f, 0x4f, 0x0b, 0xb6, 0x71, 0xff, 0x37, 0x12, 0x3c, 0xcd, 0x3f, 0x29, 0x60, 0x2a, + 0xc4, 0x8e, 0x60, 0x37, 0xef, 0xcb, 0xbb, 0xd9, 0x3c, 0x7b, 0x01, 0x39, 0x9b, 0xf8, 0x69, 0x39, + 0x16, 0x38, 0x7b, 0x44, 0xf0, 0xe7, 0xa0, 0xe6, 0x12, 0x9d, 0x74, 0xa8, 0xe5, 0x88, 0xc0, 0xdf, + 0x2c, 0x18, 0x38, 0x3e, 0x22, 0xfa, 0xbe, 0x70, 0x6d, 0x5f, 0x62, 0x91, 0x07, 0xbf, 0x50, 0x48, + 0x09, 0x3f, 0x04, 0x35, 0x4a, 0x0c, 0x5b, 0xc7, 0x94, 0x88, 0x9d, 0x7c, 0x35, 0x1e, 0x3c, 0x2b, + 0x97, 0x8c, 0x6c, 0xcf, 0xea, 0x1e, 0x08, 0x18, 0xdf, 0xc6, 0xf0, 0x61, 0x04, 0xa3, 0x28, 0xa4, + 0x81, 0x36, 0x98, 0xf6, 0xec, 0x2e, 0x43, 0x52, 0x56, 0x62, 0x7a, 0x03, 0xb1, 0xad, 0xb7, 0xcf, + 0x7e, 0x2a, 0x87, 0x92, 0x5f, 0x7b, 0x5e, 0xcc, 0x32, 0x2d, 0x8f, 0xa3, 0x04, 0x3f, 0x5c, 0x07, + 0x33, 0x86, 0x66, 0x22, 0x82, 0xbb, 0x83, 0x7d, 0xd2, 0xb1, 0xcc, 0xae, 0xbb, 0x58, 0x59, 0x51, + 0x56, 0xab, 0xed, 0x05, 0x41, 0x30, 0xb3, 0x2d, 0x9b, 0x51, 0x12, 0x0f, 0xb7, 0xc0, 0x5c, 0x50, + 0x14, 0x1e, 0x68, 0x2e, 0xb5, 0x9c, 0xc1, 0x96, 0x66, 0x68, 0x74, 0x71, 0x9c, 0xf3, 0x2c, 0x0e, + 0x4f, 0x97, 0xe7, 0x50, 0x86, 0x1d, 0x65, 0x7a, 0x35, 0xff, 0x58, 0x05, 0x33, 0x89, 0x5c, 0x85, + 0x8f, 0xc0, 0x7c, 0xc7, 0x73, 0x1c, 0x62, 0xd2, 0x1d, 0xcf, 0x38, 0x22, 0xce, 0x7e, 0xe7, 0x98, + 0x74, 0x3d, 0x9d, 0x74, 0xf9, 0xb6, 0x56, 0xdb, 0x0d, 0x11, 0xeb, 0xfc, 0x46, 0x26, 0x0a, 0xe5, + 0x78, 0xc3, 0x0f, 0x00, 0x34, 0xf9, 0xd0, 0xb6, 0xe6, 0xba, 0x21, 0x67, 0x89, 0x73, 0x2e, 0x09, + 0x4e, 0xb8, 0x93, 0x42, 0xa0, 0x0c, 0x2f, 0x16, 0x63, 0x97, 0xb8, 0x9a, 0x43, 0xba, 0xc9, 0x18, + 0xcb, 0x72, 0x8c, 0x9b, 0x99, 0x28, 0x94, 0xe3, 0x0d, 0xdf, 0x06, 0x93, 0xfe, 0x6c, 0xfc, 0x99, + 0x8b, 0xcd, 0x99, 0x15, 0x64, 0x93, 0x3b, 0x91, 0x09, 0xc5, 0x71, 0x6c, 0x69, 0xd6, 0x91, 0x4b, + 0x9c, 0x3e, 0xe9, 0xde, 0xf7, 0x1b, 0x16, 0xab, 0xea, 0x55, 0x5e, 0xd5, 0xc3, 0xa5, 0xed, 0xa6, + 0x10, 0x28, 0xc3, 0x8b, 0x2d, 0xcd, 0xcf, 0x9a, 0xd4, 0xd2, 0xc6, 0xe5, 0xa5, 0x1d, 0x66, 0xa2, + 0x50, 0x8e, 0x37, 0xcb, 0x3d, 0x3f, 0xe4, 0xf5, 0x3e, 0xd6, 0x74, 0x7c, 0xa4, 0x93, 0xc5, 0x09, + 0x39, 0xf7, 0x76, 0x64, 0x33, 0x4a, 0xe2, 0xe1, 0x7d, 0x70, 0xc5, 0x1f, 0x3a, 0x34, 0x71, 0x48, + 0x52, 0xe3, 0x24, 0xaf, 0x08, 0x92, 0x2b, 0x3b, 0x49, 0x00, 0x4a, 0xfb, 0xc0, 0xbb, 0x60, 0xba, + 0x63, 0xe9, 0x3a, 0xcf, 0xc7, 0x0d, 0xcb, 0x33, 0xe9, 0x62, 0x9d, 0xb3, 0x40, 0x76, 0x86, 0x36, + 0x24, 0x0b, 0x4a, 0x20, 0x9b, 0x9f, 0x2a, 0x60, 0x21, 0xe7, 0x1c, 0xc2, 0x1f, 0x81, 0x0a, 0x1d, + 0xd8, 0x84, 0x27, 0x6a, 0xbd, 0x7d, 0x23, 0x28, 0xe1, 0x07, 0x03, 0x9b, 0x7c, 0x75, 0xba, 0x7c, + 0x35, 0xc7, 0x8d, 0x99, 0x11, 0x77, 0x84, 0xc7, 0x60, 0x8a, 0xf5, 0x30, 0xcd, 0xec, 0xf9, 0x10, + 0x51, 0x6a, 0x5a, 0xb9, 0x15, 0x01, 0xc5, 0xd1, 0x51, 0xd1, 0xbc, 0x32, 0x3c, 0x5d, 0x9e, 0x92, + 0x6c, 0x48, 0x26, 0x6e, 0xfe, 0xb6, 0x04, 0xc0, 0x26, 0xb1, 0x75, 0x6b, 0x60, 0x10, 0x73, 0x14, + 0x6d, 0xf0, 0xa1, 0xd4, 0x06, 0x5f, 0xcf, 0xaf, 0x71, 0x61, 0x50, 0xb9, 0x7d, 0xf0, 0xc3, 0x44, + 0x1f, 0xbc, 0x5e, 0x84, 0xec, 0xc5, 0x8d, 0xf0, 0xf3, 0x32, 0x98, 0x8d, 0xc0, 0x1b, 0x96, 0xd9, + 0xd5, 0xf8, 0x69, 0xb8, 0x27, 0xed, 0xe8, 0xeb, 0x89, 0x1d, 0x5d, 0xc8, 0x70, 0x89, 0xed, 0xe6, + 0x56, 0x18, 0x67, 0x89, 0xbb, 0xbf, 0x25, 0x4f, 0xfe, 0xd5, 0xe9, 0x72, 0x86, 0xe2, 0x56, 0x43, + 0x26, 0x39, 0x44, 0x78, 0x0d, 0x8c, 0x3b, 0x04, 0xbb, 0x96, 0xc9, 0xcb, 0x42, 0x3d, 0x5a, 0x0a, + 0xe2, 0xa3, 0x48, 0x58, 0xe1, 0x75, 0x30, 0x61, 0x10, 0xd7, 0xc5, 0x3d, 0xc2, 0x2b, 0x40, 0xbd, + 0x3d, 0x23, 0x80, 0x13, 0xdb, 0xfe, 0x30, 0x0a, 0xec, 0xf0, 0x63, 0x30, 0xad, 0x63, 0x57, 0xa4, + 0xe3, 0x81, 0x66, 0x10, 0x7e, 0xc6, 0x27, 0xd7, 0xde, 0x28, 0xb6, 0xf7, 0xcc, 0x23, 0xea, 0x3d, + 0x5b, 0x12, 0x13, 0x4a, 0x30, 0xc3, 0x3e, 0x80, 0x6c, 0xe4, 0xc0, 0xc1, 0xa6, 0xeb, 0x3f, 0x28, + 0x36, 0xdf, 0xc4, 0xb9, 0xe7, 0x0b, 0xeb, 0xd9, 0x56, 0x8a, 0x0d, 0x65, 0xcc, 0xd0, 0xfc, 0xb3, + 0x02, 0xa6, 0xa3, 0x6d, 0x1a, 0x81, 0xc6, 0x79, 0x20, 0x6b, 0x9c, 0x57, 0x0b, 0x24, 0x67, 0x8e, + 0xc8, 0xf9, 0xbc, 0x12, 0x0f, 0x9d, 0xab, 0x9c, 0x55, 0xa6, 0xda, 0x6d, 0x5d, 0xeb, 0x60, 0x57, + 0xb4, 0xc3, 0x4b, 0xbe, 0x62, 0xf7, 0xc7, 0x50, 0x68, 0x95, 0xf4, 0x50, 0xe9, 0xe5, 0xea, 0xa1, + 0xf2, 0x37, 0xa3, 0x87, 0x7e, 0x0a, 0x6a, 0x6e, 0xa0, 0x84, 0x2a, 0x9c, 0xf2, 0x46, 0xa1, 0x83, + 0x2d, 0x44, 0x50, 0x48, 0x1d, 0xca, 0x9f, 0x90, 0x2e, 0x4b, 0xf8, 0x54, 0xbf, 0x4d, 0xe1, 0xc3, + 0x0e, 0xb3, 0x8d, 0x3d, 0x97, 0x74, 0xf9, 0x09, 0xa8, 0x45, 0x87, 0x79, 0x8f, 0x8f, 0x22, 0x61, + 0x85, 0x87, 0x60, 0xc1, 0x76, 0xac, 0x9e, 0x43, 0x5c, 0x77, 0x93, 0xe0, 0xae, 0xae, 0x99, 0x24, + 0x58, 0x80, 0xdf, 0xb2, 0xae, 0x0e, 0x4f, 0x97, 0x17, 0xf6, 0xb2, 0x21, 0x28, 0xcf, 0xb7, 0xf9, + 0xb7, 0x0a, 0xb8, 0x9c, 0xac, 0x8d, 0x39, 0x2a, 0x42, 0xb9, 0x90, 0x8a, 0xb8, 0x19, 0xcb, 0x53, + 0x5f, 0x62, 0xc5, 0xde, 0x2e, 0x53, 0xb9, 0xba, 0x0e, 0x66, 0x84, 0x6a, 0x08, 0x8c, 0x42, 0x47, + 0x85, 0xdb, 0x73, 0x28, 0x9b, 0x51, 0x12, 0xcf, 0xb4, 0x41, 0xd4, 0xf2, 0x03, 0x92, 0x8a, 0xac, + 0x0d, 0xd6, 0x93, 0x00, 0x94, 0xf6, 0x81, 0xdb, 0x60, 0xd6, 0x33, 0xd3, 0x54, 0x7e, 0xba, 0x5c, + 0x15, 0x54, 0xb3, 0x87, 0x69, 0x08, 0xca, 0xf2, 0x83, 0x8f, 0x01, 0xe8, 0x04, 0x05, 0xdd, 0x5d, + 0x1c, 0xe7, 0x25, 0xe1, 0x66, 0x81, 0xb4, 0x0e, 0xbb, 0x40, 0xd4, 0x56, 0xc3, 0x21, 0x17, 0xc5, + 0x38, 0xe1, 0x3d, 0x30, 0xe5, 0x70, 0x49, 0x18, 0x84, 0xea, 0xcb, 0xaa, 0xef, 0x09, 0xb7, 0x29, + 0x14, 0x37, 0x22, 0x19, 0x9b, 0xa1, 0x84, 0x6a, 0x85, 0x95, 0xd0, 0x5f, 0x15, 0x00, 0xd3, 0xe7, + 0x10, 0xde, 0x95, 0x5a, 0xe6, 0xb5, 0x44, 0xcb, 0x9c, 0x4f, 0x7b, 0xc4, 0x3a, 0xa6, 0x96, 0xad, + 0x7f, 0x6e, 0x17, 0xd4, 0x3f, 0x51, 0x41, 0x2d, 0x26, 0x80, 0xc4, 0x63, 0x18, 0xcd, 0x3d, 0x40, + 0x51, 0x01, 0x14, 0x05, 0xf5, 0x0d, 0x08, 0xa0, 0x18, 0xd9, 0x8b, 0x05, 0xd0, 0xbf, 0x4b, 0x60, + 0x36, 0x02, 0x17, 0x16, 0x40, 0x19, 0x2e, 0x2f, 0x4d, 0x00, 0x65, 0x2b, 0x88, 0xf2, 0xcb, 0x56, + 0x10, 0x2f, 0x41, 0x78, 0x71, 0x51, 0x12, 0x3d, 0xba, 0xff, 0x27, 0x51, 0x12, 0x45, 0x95, 0x23, + 0x4a, 0xfe, 0x50, 0x8a, 0x87, 0xfe, 0x9d, 0x17, 0x25, 0x5f, 0xff, 0xca, 0xa4, 0xf9, 0xf7, 0x32, + 0xb8, 0x9c, 0x3c, 0x87, 0x52, 0x83, 0x54, 0xce, 0x6c, 0x90, 0x7b, 0x60, 0xee, 0x89, 0xa7, 0xeb, + 0x03, 0xfe, 0x18, 0x62, 0x5d, 0xd2, 0x6f, 0xad, 0xdf, 0x17, 0x9e, 0x73, 0x3f, 0xc9, 0xc0, 0xa0, + 0x4c, 0xcf, 0x9c, 0x66, 0x5f, 0xbe, 0x50, 0xb3, 0x4f, 0x75, 0xa0, 0xca, 0x39, 0x3a, 0x50, 0x66, + 0xe3, 0xae, 0x5e, 0xa0, 0x71, 0x9f, 0xaf, 0xd3, 0x66, 0x14, 0xae, 0xb3, 0x3a, 0x6d, 0xf3, 0xd7, + 0x0a, 0x98, 0xcf, 0x7e, 0xe1, 0x86, 0x3a, 0x98, 0x36, 0xf0, 0xd3, 0xf8, 0xbd, 0xc4, 0x59, 0x4d, + 0xc4, 0xa3, 0x9a, 0xae, 0xfa, 0x5f, 0x19, 0xd4, 0x87, 0x26, 0xdd, 0x75, 0xf6, 0xa9, 0xa3, 0x99, + 0x3d, 0xbf, 0xf3, 0x6e, 0x4b, 0x5c, 0x28, 0xc1, 0xdd, 0xfc, 0x52, 0x01, 0x0b, 0x39, 0x9d, 0x6f, + 0xb4, 0x91, 0xc0, 0x8f, 0x40, 0xcd, 0xc0, 0x4f, 0xf7, 0x3d, 0xa7, 0x97, 0xd5, 0xab, 0x8b, 0xcd, + 0xc3, 0x4f, 0xf3, 0xb6, 0x60, 0x41, 0x21, 0x5f, 0x73, 0x17, 0xac, 0x48, 0x8b, 0x64, 0x27, 0x87, + 0x3c, 0xf1, 0x74, 0x7e, 0x88, 0x84, 0xd8, 0xb8, 0x01, 0xea, 0x36, 0x76, 0xa8, 0x16, 0x4a, 0xd5, + 0x6a, 0x7b, 0x6a, 0x78, 0xba, 0x5c, 0xdf, 0x0b, 0x06, 0x51, 0x64, 0x6f, 0xfe, 0x57, 0x01, 0xd5, + 0xfd, 0x0e, 0xd6, 0xc9, 0x08, 0xba, 0xfd, 0xa6, 0xd4, 0xed, 0xf3, 0x2f, 0xba, 0x79, 0x3c, 0xb9, + 0x8d, 0x7e, 0x2b, 0xd1, 0xe8, 0x5f, 0x3b, 0x83, 0xe7, 0xc5, 0x3d, 0xfe, 0x3d, 0x50, 0x0f, 0xa7, + 0x3b, 0x5f, 0x01, 0x6a, 0xfe, 0xbe, 0x04, 0x26, 0x63, 0x53, 0x9c, 0xb3, 0x7c, 0x3d, 0x96, 0xca, + 0x3e, 0x3b, 0x98, 0x6b, 0x45, 0x16, 0xa2, 0x06, 0x25, 0xfe, 0x7d, 0x93, 0x3a, 0xf1, 0x17, 0xbc, + 0x74, 0xe5, 0xff, 0x21, 0x98, 0xa6, 0xd8, 0xe9, 0x11, 0x1a, 0xd8, 0xf8, 0x03, 0xab, 0x47, 0xb7, + 0x13, 0x07, 0x92, 0x15, 0x25, 0xd0, 0x4b, 0xf7, 0xc0, 0x94, 0x34, 0x19, 0xbc, 0x0c, 0xca, 0x27, + 0x64, 0xe0, 0xcb, 0x1e, 0xc4, 0xfe, 0x84, 0x73, 0xa0, 0xda, 0xc7, 0xba, 0xe7, 0xe7, 0x79, 0x1d, + 0xf9, 0x3f, 0xee, 0x96, 0xde, 0x55, 0x9a, 0x9f, 0xb0, 0x87, 0x13, 0x25, 0xe7, 0x08, 0xb2, 0xeb, + 0x03, 0x29, 0xbb, 0xf2, 0xbf, 0x03, 0xc5, 0x8f, 0x4c, 0x5e, 0x8e, 0xa1, 0x44, 0x8e, 0xbd, 0x51, + 0x88, 0xed, 0xc5, 0x99, 0xf6, 0x17, 0x05, 0xcc, 0xc4, 0xd0, 0x23, 0x10, 0x38, 0x0f, 0x65, 0x81, + 0xf3, 0x5a, 0x91, 0x45, 0xe4, 0x28, 0x9c, 0x7f, 0x54, 0xa5, 0xe0, 0xbf, 0xf3, 0x12, 0xe7, 0x97, + 0x60, 0xae, 0x6f, 0xe9, 0x9e, 0x41, 0x36, 0x74, 0xac, 0x19, 0x01, 0x80, 0x75, 0xf1, 0x72, 0xf2, + 0xdd, 0x22, 0xa4, 0x27, 0x8e, 0xab, 0xb9, 0x94, 0x98, 0xf4, 0x51, 0xe4, 0x19, 0xe9, 0x90, 0x47, + 0x19, 0x74, 0x28, 0x73, 0x12, 0xf8, 0x36, 0x98, 0x64, 0x7a, 0x42, 0xeb, 0x90, 0x1d, 0x6c, 0x04, + 0xc2, 0x39, 0xfc, 0xe2, 0xb1, 0x1f, 0x99, 0x50, 0x1c, 0x07, 0x8f, 0xc1, 0xac, 0x6d, 0x75, 0xb7, + 0xb1, 0x89, 0x7b, 0x84, 0xb5, 0xbd, 0x3d, 0xfe, 0xaf, 0x08, 0xfc, 0x32, 0xa6, 0xde, 0x7e, 0x27, + 0x78, 0x4b, 0xdf, 0x4b, 0x43, 0xd8, 0x4b, 0x4b, 0xc6, 0x30, 0x7f, 0x69, 0xc9, 0xa2, 0x84, 0x4e, + 0xea, 0x2b, 0x9d, 0x7f, 0x67, 0xb9, 0x56, 0x24, 0xc3, 0x2e, 0xf8, 0x9d, 0x2e, 0xef, 0xae, 0xa9, + 0x76, 0xa1, 0x8f, 0x6c, 0x9f, 0x54, 0xc0, 0x95, 0xd4, 0xd1, 0xfd, 0x16, 0x6f, 0x7b, 0x52, 0x72, + 0xb1, 0x7c, 0x0e, 0xb9, 0xb8, 0x0e, 0x66, 0xc4, 0xf7, 0xbd, 0x84, 0xda, 0x0c, 0xf5, 0xf8, 0x86, + 0x6c, 0x46, 0x49, 0x7c, 0xd6, 0x6d, 0x53, 0xf5, 0x9c, 0xb7, 0x4d, 0xf1, 0x28, 0xc4, 0xff, 0x50, + 0xf8, 0xa9, 0x97, 0x8e, 0x42, 0xfc, 0x2b, 0x45, 0x12, 0xcf, 0x3a, 0x96, 0xcf, 0x1a, 0x32, 0x4c, + 0xc8, 0x1d, 0xeb, 0x50, 0xb2, 0xa2, 0x04, 0xfa, 0x6b, 0x7d, 0xc3, 0xfa, 0xa7, 0x02, 0x5e, 0xc9, + 0xcd, 0x52, 0xb8, 0x2e, 0xbd, 0xf2, 0xdf, 0x4a, 0xbc, 0xf2, 0xff, 0x20, 0xd7, 0x31, 0xf6, 0xe2, + 0xef, 0x64, 0xdf, 0xe3, 0xbc, 0x57, 0xec, 0x1e, 0x27, 0x43, 0xe8, 0x9d, 0x7d, 0xa1, 0xd3, 0xbe, + 0xf5, 0xec, 0x79, 0x63, 0xec, 0xb3, 0xe7, 0x8d, 0xb1, 0x2f, 0x9e, 0x37, 0xc6, 0x7e, 0x35, 0x6c, + 0x28, 0xcf, 0x86, 0x0d, 0xe5, 0xb3, 0x61, 0x43, 0xf9, 0x62, 0xd8, 0x50, 0xfe, 0x35, 0x6c, 0x28, + 0xbf, 0xfb, 0xb2, 0x31, 0xf6, 0xd1, 0x84, 0x98, 0xf1, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe8, + 0x1d, 0x40, 0xdd, 0x77, 0x25, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/apps/v1beta2/generated.proto b/staging/src/k8s.io/api/apps/v1beta2/generated.proto index 432e4225017c8..3c29c96d36a4c 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/generated.proto +++ b/staging/src/k8s.io/api/apps/v1beta2/generated.proto @@ -174,7 +174,7 @@ message DaemonSetStatus { // uses this field as a collision avoidance mechanism when it needs to // create the name for the newest ControllerRevision. // +optional - optional int64 collisionCount = 9; + optional int32 collisionCount = 9; } // DaemonSetUpdateStrategy is a struct used to control the update strategy for a DaemonSet. @@ -318,7 +318,7 @@ message DeploymentStatus { // field as a collision avoidance mechanism when it needs to create the name for the // newest ReplicaSet. // +optional - optional int64 collisionCount = 8; + optional int32 collisionCount = 8; } // DeploymentStrategy describes how to replace existing pods with new ones. @@ -672,7 +672,7 @@ message StatefulSetStatus { // uses this field as a collision avoidance mechanism when it needs to create the name for the // newest ControllerRevision. // +optional - optional int64 collisionCount = 9; + optional int32 collisionCount = 9; } // StatefulSetUpdateStrategy indicates the strategy that the StatefulSet diff --git a/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go b/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go index b631371e7eca1..124f84a9d4ef8 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go @@ -327,7 +327,7 @@ func (in *DaemonSetStatus) DeepCopyInto(out *DaemonSetStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } @@ -519,7 +519,7 @@ func (in *DeploymentStatus) DeepCopyInto(out *DeploymentStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } @@ -974,7 +974,7 @@ func (in *StatefulSetStatus) DeepCopyInto(out *StatefulSetStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go b/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go index 52d8268e53f97..47ded03b8357f 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go @@ -5362,7 +5362,7 @@ func (m *DaemonSetStatus) Unmarshal(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) } - var v int64 + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -5372,7 +5372,7 @@ func (m *DaemonSetStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int64(b) & 0x7F) << shift + v |= (int32(b) & 0x7F) << shift if b < 0x80 { break } @@ -6666,7 +6666,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) } - var v int64 + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -6676,7 +6676,7 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int64(b) & 0x7F) << shift + v |= (int32(b) & 0x7F) << shift if b < 0x80 { break } @@ -11959,7 +11959,7 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 3431 bytes of a gzipped FileDescriptorProto + // 3430 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5b, 0x4f, 0x6c, 0x1b, 0xc7, 0xd5, 0xf7, 0x8a, 0xa2, 0x44, 0x3d, 0x59, 0x92, 0x35, 0x72, 0x64, 0x46, 0x8e, 0x45, 0x67, 0x03, 0xf8, 0xb3, 0xf3, 0xd9, 0x64, 0xec, 0xc4, 0x89, 0xbf, 0x18, 0x5f, 0xbe, 0x4f, 0x94, 0xfc, 0x47, @@ -12022,157 +12022,157 @@ var fileDescriptorGenerated = []byte{ 0x79, 0x61, 0x57, 0x51, 0x35, 0x65, 0x53, 0x23, 0xc5, 0xd1, 0xe8, 0x3a, 0x5e, 0x8b, 0x92, 0x71, 0x9c, 0x1f, 0xdd, 0x82, 0x69, 0x77, 0x68, 0x5d, 0x57, 0x7c, 0x90, 0x02, 0x07, 0x79, 0x56, 0x80, 0x4c, 0xaf, 0xc5, 0x19, 0x70, 0x52, 0x06, 0xbd, 0x0e, 0x93, 0x4d, 0x43, 0xd3, 0xf8, 0x7a, 0x5c, - 0x34, 0x1c, 0x9d, 0x16, 0xc7, 0x78, 0xac, 0x10, 0xdb, 0x8f, 0x8b, 0x11, 0x0a, 0x8e, 0x71, 0xca, - 0x7f, 0x90, 0xe0, 0x54, 0xc6, 0x9e, 0x46, 0xff, 0x07, 0xc3, 0xb4, 0x6b, 0x7a, 0xa7, 0xf5, 0x7f, - 0x7b, 0x07, 0x44, 0xa3, 0x6b, 0x92, 0xc7, 0x7b, 0xa5, 0xd3, 0x19, 0x62, 0x8c, 0x8c, 0xb9, 0x20, - 0xd2, 0x61, 0xc2, 0x62, 0xea, 0xf4, 0xb6, 0xcb, 0x22, 0x92, 0xd7, 0xd5, 0x1e, 0x39, 0x06, 0x87, - 0x65, 0x82, 0x64, 0x3c, 0xbd, 0xbf, 0x57, 0x9a, 0x88, 0xd0, 0x70, 0x14, 0x5e, 0xfe, 0x70, 0x08, - 0x60, 0x89, 0x98, 0x9a, 0xd1, 0xed, 0x10, 0xfd, 0x28, 0x0e, 0xdc, 0x3b, 0x91, 0x03, 0xf7, 0x52, - 0xaf, 0xdc, 0xe9, 0x9b, 0x96, 0x79, 0xe2, 0xbe, 0x15, 0x3b, 0x71, 0x2b, 0xfd, 0x43, 0x1e, 0x7c, - 0xe4, 0xfe, 0x25, 0x07, 0x33, 0x01, 0xf3, 0xa2, 0xa1, 0xb7, 0x54, 0xbe, 0x3f, 0xae, 0x47, 0xe6, - 0xf8, 0xbf, 0x62, 0x73, 0x7c, 0x2a, 0x45, 0x24, 0x34, 0xbf, 0x2b, 0xbe, 0xb5, 0x43, 0x5c, 0xfc, - 0x95, 0xa8, 0xf2, 0xc7, 0x7b, 0xa5, 0x94, 0xcb, 0x4a, 0xd9, 0x47, 0x8a, 0x9a, 0x88, 0xce, 0xc1, - 0x88, 0x45, 0x14, 0xdb, 0xd0, 0x79, 0xa2, 0x18, 0x0b, 0x5c, 0xc1, 0x7c, 0x14, 0x0b, 0x2a, 0xba, - 0x00, 0xa3, 0x1d, 0x62, 0xdb, 0x4a, 0x9b, 0xf0, 0x9c, 0x30, 0x56, 0x9d, 0x12, 0x8c, 0xa3, 0xab, - 0xee, 0x30, 0xf6, 0xe8, 0xe8, 0x01, 0x4c, 0x6a, 0x8a, 0x2d, 0x16, 0x68, 0x43, 0xed, 0x10, 0xbe, - 0xeb, 0xc7, 0xaf, 0xbc, 0xd8, 0xdf, 0x3a, 0x60, 0x12, 0xc1, 0xc9, 0xb6, 0x12, 0x41, 0xc2, 0x31, - 0x64, 0xb4, 0x0b, 0x88, 0x8d, 0x34, 0x2c, 0x45, 0xb7, 0xdd, 0x40, 0x31, 0x7d, 0xa3, 0x03, 0xeb, - 0xf3, 0x33, 0xdc, 0x4a, 0x02, 0x0d, 0xa7, 0x68, 0x90, 0x7f, 0x23, 0xc1, 0x64, 0x30, 0x4d, 0x47, - 0x50, 0x4d, 0xad, 0x45, 0xab, 0xa9, 0x0b, 0x7d, 0x2f, 0xd1, 0x8c, 0x72, 0xea, 0x1f, 0x43, 0x80, - 0x02, 0x26, 0xb6, 0xc1, 0x37, 0x95, 0xe6, 0x4e, 0x1f, 0x77, 0x85, 0x0f, 0x24, 0x40, 0x22, 0x3d, - 0x2f, 0xe8, 0xba, 0x41, 0x79, 0xc6, 0xf7, 0xcc, 0x5a, 0xee, 0xdb, 0x2c, 0x4f, 0x63, 0x79, 0x3d, - 0x81, 0x75, 0x43, 0xa7, 0x56, 0x37, 0x98, 0x91, 0x24, 0x03, 0x4e, 0x31, 0x00, 0x29, 0x00, 0x96, - 0xc0, 0x6c, 0x18, 0x62, 0x23, 0x5f, 0xea, 0x23, 0xe7, 0x31, 0x81, 0x45, 0x43, 0xdf, 0x52, 0xdb, - 0x41, 0xda, 0xc1, 0x3e, 0x10, 0x0e, 0x81, 0xce, 0xdd, 0x80, 0x53, 0x19, 0xd6, 0xa2, 0x13, 0x90, - 0xdb, 0x21, 0x5d, 0x37, 0x6c, 0x98, 0xfd, 0x89, 0x4e, 0x86, 0xef, 0x54, 0x63, 0xe2, 0x3a, 0xf4, - 0xfa, 0xd0, 0x35, 0x49, 0xfe, 0x24, 0x1f, 0x5e, 0x3b, 0xbc, 0x94, 0x3d, 0x0f, 0x05, 0x8b, 0x98, - 0x9a, 0xda, 0x54, 0x6c, 0x51, 0xa1, 0xf0, 0xaa, 0x14, 0x8b, 0x31, 0xec, 0x53, 0x23, 0x45, 0xef, - 0xd0, 0xd3, 0x2d, 0x7a, 0x73, 0x4f, 0xa6, 0xe8, 0xfd, 0x16, 0x14, 0x6c, 0xaf, 0xdc, 0x1d, 0xe6, - 0x90, 0x97, 0x07, 0xc8, 0xaf, 0xa2, 0xd2, 0xf5, 0x15, 0xf8, 0x35, 0xae, 0x0f, 0x9a, 0x56, 0xdd, - 0xe6, 0x07, 0xac, 0x6e, 0x9f, 0x68, 0x45, 0xca, 0x72, 0xaa, 0xa9, 0x38, 0x36, 0x69, 0xf1, 0x44, - 0x54, 0x08, 0x72, 0x6a, 0x8d, 0x8f, 0x62, 0x41, 0x45, 0xf7, 0x23, 0x4b, 0xb6, 0x70, 0x98, 0x25, - 0x3b, 0x99, 0xbd, 0x5c, 0xd1, 0x3a, 0x9c, 0x32, 0x2d, 0xa3, 0x6d, 0x11, 0xdb, 0x5e, 0x22, 0x4a, - 0x4b, 0x53, 0x75, 0xe2, 0xc5, 0x67, 0x8c, 0xfb, 0x75, 0x7a, 0x7f, 0xaf, 0x74, 0xaa, 0x96, 0xce, - 0x82, 0xb3, 0x64, 0xe5, 0x47, 0xc3, 0x70, 0x22, 0x7e, 0x02, 0x66, 0x54, 0x8f, 0xd2, 0xa1, 0xaa, - 0xc7, 0x8b, 0xa1, 0xcd, 0xe0, 0x96, 0xd6, 0xfe, 0xec, 0xa7, 0x6c, 0x88, 0x05, 0x98, 0x12, 0xd9, - 0xc0, 0x23, 0x8a, 0xfa, 0xd9, 0x9f, 0xfd, 0xf5, 0x28, 0x19, 0xc7, 0xf9, 0x59, 0x4d, 0x18, 0x94, - 0x7a, 0x1e, 0xc8, 0x70, 0xb4, 0x26, 0x5c, 0x88, 0x33, 0xe0, 0xa4, 0x0c, 0x5a, 0x85, 0x19, 0x47, - 0x4f, 0x42, 0xb9, 0xab, 0xf1, 0xb4, 0x80, 0x9a, 0x59, 0x4f, 0xb2, 0xe0, 0x34, 0x39, 0xb4, 0x05, - 0xd0, 0xf4, 0x8e, 0x6d, 0xbb, 0x38, 0xc2, 0x33, 0xec, 0x95, 0xbe, 0xf7, 0x8e, 0x7f, 0xe2, 0x07, - 0x79, 0xcd, 0x1f, 0xb2, 0x71, 0x08, 0x19, 0x5d, 0x87, 0x09, 0x8b, 0x5f, 0x08, 0x3c, 0x83, 0xdd, - 0xa2, 0xfa, 0x19, 0x21, 0x36, 0x81, 0xc3, 0x44, 0x1c, 0xe5, 0x4d, 0xa9, 0x83, 0x0b, 0x7d, 0xd7, - 0xc1, 0xbf, 0x95, 0xc2, 0x87, 0x90, 0x5f, 0x02, 0xbf, 0x1e, 0x29, 0x8f, 0xce, 0xc5, 0xca, 0xa3, - 0xd9, 0xa4, 0x44, 0xa8, 0x3a, 0x32, 0xd2, 0xab, 0xdf, 0x57, 0x07, 0xaa, 0x7e, 0x83, 0xc3, 0xb3, - 0x77, 0xf9, 0xfb, 0x91, 0x04, 0xb3, 0x37, 0xeb, 0xb7, 0x2c, 0xc3, 0x31, 0x3d, 0x73, 0xee, 0x98, - 0x6e, 0x5c, 0x5f, 0x83, 0x61, 0xcb, 0xd1, 0x3c, 0x3f, 0x5e, 0xf0, 0xfc, 0xc0, 0x8e, 0xc6, 0xfc, - 0x98, 0x89, 0x49, 0xb9, 0x4e, 0x30, 0x01, 0xb4, 0x06, 0x23, 0x96, 0xa2, 0xb7, 0x89, 0x77, 0xac, - 0x9e, 0xeb, 0x61, 0xfd, 0xf2, 0x12, 0x66, 0xec, 0xa1, 0xe2, 0x8d, 0x4b, 0x63, 0x81, 0x22, 0x7f, - 0x5f, 0x82, 0xa9, 0xdb, 0x8d, 0x46, 0x6d, 0x59, 0xe7, 0x3b, 0xba, 0xa6, 0xd0, 0x6d, 0x76, 0xd2, - 0x9b, 0x0a, 0xdd, 0x8e, 0x9f, 0xf4, 0x8c, 0x86, 0x39, 0x05, 0x7d, 0x1d, 0x46, 0x59, 0x26, 0x21, - 0x7a, 0xab, 0xcf, 0x52, 0x5b, 0xc0, 0x57, 0x5d, 0xa1, 0xa0, 0x42, 0x14, 0x03, 0xd8, 0x83, 0x93, - 0x77, 0xe0, 0x64, 0xc8, 0x1c, 0x16, 0x0f, 0xfe, 0x66, 0x88, 0xea, 0x90, 0x67, 0x9a, 0xbd, 0x27, - 0xc1, 0x5e, 0x2f, 0x5f, 0x31, 0x97, 0x82, 0x4a, 0x87, 0xfd, 0xb2, 0xb1, 0x8b, 0x25, 0xaf, 0xc2, - 0xc4, 0x6d, 0xc3, 0xa6, 0x35, 0xc3, 0xa2, 0x3c, 0x2c, 0xe8, 0x0c, 0xe4, 0x3a, 0xaa, 0x2e, 0xce, - 0xd9, 0x71, 0x21, 0x93, 0x63, 0x67, 0x04, 0x1b, 0xe7, 0x64, 0xe5, 0xa1, 0xc8, 0x3c, 0x01, 0x59, - 0x79, 0x88, 0xd9, 0xb8, 0x7c, 0x0b, 0x46, 0x45, 0xb8, 0xc3, 0x40, 0xb9, 0x83, 0x81, 0x72, 0x29, - 0x40, 0x3f, 0x18, 0x82, 0x51, 0x61, 0xfd, 0x11, 0x5c, 0x9a, 0x56, 0x22, 0x97, 0xa6, 0x17, 0xfb, - 0x9b, 0xc9, 0xcc, 0x1b, 0x53, 0x23, 0x76, 0x63, 0xba, 0xd8, 0x27, 0xde, 0xc1, 0xd7, 0xa5, 0x8f, - 0x25, 0x98, 0x8c, 0xae, 0x21, 0x74, 0x15, 0xc6, 0xd9, 0xf9, 0xa0, 0x36, 0xc9, 0x5a, 0x50, 0x96, - 0xfa, 0x8f, 0x19, 0xf5, 0x80, 0x84, 0xc3, 0x7c, 0xa8, 0xed, 0x8b, 0xb1, 0x69, 0x17, 0x4e, 0x67, - 0x87, 0xd4, 0xa1, 0xaa, 0x56, 0x76, 0x1b, 0x14, 0xe5, 0x65, 0x9d, 0xde, 0xb1, 0xea, 0xd4, 0x52, - 0xf5, 0x76, 0x42, 0x11, 0x5f, 0x43, 0x61, 0x64, 0xf9, 0xd7, 0x12, 0x8c, 0x0b, 0x93, 0x8f, 0xe0, - 0x12, 0xf0, 0xb5, 0xe8, 0x25, 0xe0, 0x5c, 0x9f, 0xfb, 0x31, 0xfd, 0x06, 0xf0, 0xb3, 0xc0, 0x74, - 0xb6, 0x03, 0x59, 0x42, 0xd8, 0x36, 0x6c, 0x1a, 0x4f, 0x08, 0x6c, 0xef, 0x60, 0x4e, 0x41, 0x0e, - 0x9c, 0x50, 0x63, 0x5b, 0x56, 0x84, 0xb6, 0xd2, 0x9f, 0x25, 0xbe, 0x58, 0xb5, 0x28, 0xe0, 0x4f, - 0xc4, 0x29, 0x38, 0xa1, 0x42, 0x26, 0x90, 0xe0, 0x42, 0x77, 0x61, 0x78, 0x9b, 0x52, 0x33, 0xe5, - 0xdd, 0xb7, 0x47, 0xa2, 0x08, 0x4c, 0x28, 0x70, 0xef, 0x1a, 0x8d, 0x1a, 0xe6, 0x50, 0xf2, 0x3f, - 0x83, 0x78, 0xd4, 0xdd, 0x35, 0xee, 0xa7, 0x3f, 0xe9, 0x30, 0xe9, 0x6f, 0x3c, 0x2d, 0xf5, 0xa1, - 0xdb, 0x90, 0xa3, 0x5a, 0xbf, 0xb7, 0x38, 0x81, 0xd8, 0x58, 0xa9, 0x07, 0xf9, 0xa3, 0xb1, 0x52, - 0xc7, 0x0c, 0x02, 0xdd, 0x81, 0x3c, 0x3b, 0x2c, 0xd8, 0x16, 0xcc, 0xf5, 0xbf, 0xa5, 0x99, 0xff, - 0xc1, 0x82, 0x60, 0xbf, 0x6c, 0xec, 0xe2, 0xc8, 0xef, 0xc2, 0x44, 0x64, 0x9f, 0xa2, 0x77, 0xe0, - 0xb8, 0x66, 0x28, 0xad, 0xaa, 0xa2, 0x29, 0x7a, 0x93, 0x78, 0x8f, 0xec, 0xe7, 0xd2, 0x2e, 0x04, - 0x2b, 0x21, 0x3e, 0xb1, 0xcb, 0xfd, 0x56, 0x59, 0x98, 0x86, 0x23, 0x88, 0xb2, 0x02, 0x10, 0xf8, - 0x88, 0x4a, 0x90, 0x67, 0xeb, 0xcc, 0x4d, 0xff, 0x63, 0xd5, 0x31, 0x66, 0x21, 0x5b, 0x7e, 0x36, - 0x76, 0xc7, 0xd1, 0x15, 0x00, 0x9b, 0x34, 0x2d, 0x42, 0x79, 0x32, 0x70, 0x9f, 0x3f, 0xfc, 0xb4, - 0x57, 0xf7, 0x29, 0x38, 0xc4, 0x25, 0xff, 0x5e, 0x82, 0x89, 0x35, 0x42, 0xdf, 0x33, 0xac, 0x9d, - 0x1a, 0x6f, 0xca, 0x1e, 0x41, 0xb2, 0xc5, 0x91, 0x64, 0xfb, 0x52, 0x8f, 0x99, 0x89, 0x58, 0x97, - 0x95, 0x72, 0x99, 0x1f, 0xc5, 0x08, 0x67, 0x78, 0xef, 0xae, 0x43, 0xde, 0x34, 0x2c, 0xea, 0x1d, - 0x9c, 0x03, 0x69, 0x64, 0x79, 0x2c, 0x74, 0x74, 0x32, 0x18, 0xec, 0xa2, 0x31, 0x3f, 0xb6, 0x2c, - 0xa3, 0x23, 0x56, 0xeb, 0x60, 0xa8, 0x84, 0x58, 0x81, 0x1f, 0x37, 0x2d, 0xa3, 0x83, 0x39, 0x96, - 0xfc, 0x3b, 0x09, 0xa6, 0x23, 0x9c, 0x47, 0x90, 0x37, 0xef, 0x46, 0xf3, 0xe6, 0xc5, 0x41, 0x1c, - 0xc9, 0xc8, 0x9e, 0x7f, 0x8f, 0xbb, 0xc1, 0x1c, 0x46, 0x5b, 0x30, 0x6e, 0x1a, 0xad, 0xfa, 0x13, - 0xe8, 0x4a, 0x4d, 0xb1, 0x63, 0xa7, 0x16, 0x60, 0xe1, 0x30, 0x30, 0x7a, 0x08, 0xd3, 0xba, 0xd2, - 0x21, 0xb6, 0xa9, 0x34, 0x49, 0xfd, 0x09, 0x3c, 0x07, 0x3c, 0xc3, 0x9f, 0xbd, 0xe3, 0x88, 0x38, - 0xa9, 0x44, 0xfe, 0x79, 0xc2, 0x6f, 0xc3, 0xa2, 0xe8, 0x16, 0x14, 0x78, 0x3b, 0xbf, 0x69, 0x68, - 0xde, 0xc3, 0x35, 0x9b, 0x8a, 0x9a, 0x18, 0x7b, 0xbc, 0x57, 0x3a, 0x9d, 0xf2, 0x26, 0xe9, 0x91, - 0xb1, 0x2f, 0x8c, 0xd6, 0x60, 0xd8, 0xfc, 0x2a, 0x27, 0x36, 0x4f, 0xea, 0xfc, 0x98, 0xe6, 0x38, - 0xf2, 0x97, 0x71, 0x73, 0x79, 0x6a, 0x7f, 0xf0, 0xc4, 0xa6, 0xc9, 0xaf, 0x10, 0x32, 0xa7, 0x6a, - 0x13, 0x46, 0xc5, 0x89, 0x26, 0x56, 0xdf, 0x6b, 0x83, 0xac, 0xbe, 0x70, 0xd6, 0xf6, 0xeb, 0x69, - 0x6f, 0xd0, 0x03, 0x96, 0xff, 0x28, 0xc1, 0x34, 0x37, 0xa0, 0xe9, 0x58, 0x2a, 0xed, 0x1e, 0x59, - 0x9e, 0xdb, 0x88, 0xe4, 0xb9, 0x57, 0x7a, 0x38, 0x96, 0xb0, 0x30, 0x33, 0xd7, 0x7d, 0x2a, 0xc1, - 0x33, 0x09, 0xee, 0x23, 0xc8, 0x13, 0xeb, 0xd1, 0x3c, 0xf1, 0xd2, 0xa0, 0x0e, 0x65, 0x55, 0x5a, - 0xe3, 0x29, 0xee, 0xf0, 0x85, 0x78, 0x05, 0xc0, 0xb4, 0xd4, 0x5d, 0x55, 0x23, 0x6d, 0xd1, 0x9b, - 0x2c, 0x04, 0x21, 0xaf, 0xf9, 0x14, 0x1c, 0xe2, 0x42, 0x36, 0xcc, 0xb6, 0xc8, 0x96, 0xe2, 0x68, - 0x74, 0xa1, 0xd5, 0x5a, 0x54, 0x4c, 0x65, 0x53, 0xd5, 0x54, 0xaa, 0x8a, 0xcb, 0xe2, 0x58, 0xf5, - 0xba, 0xdb, 0x33, 0x4c, 0xe3, 0x78, 0xbc, 0x57, 0x3a, 0x93, 0xd6, 0x1b, 0xf0, 0x58, 0xba, 0x38, - 0x03, 0x1a, 0x75, 0xa1, 0x68, 0x91, 0x77, 0x1d, 0xd5, 0x22, 0xad, 0x25, 0xcb, 0x30, 0x23, 0x6a, - 0x73, 0x5c, 0xed, 0xff, 0xee, 0xef, 0x95, 0x8a, 0x38, 0x83, 0xa7, 0xb7, 0xe2, 0x4c, 0x78, 0xf4, - 0x00, 0x66, 0x14, 0x4d, 0x33, 0xde, 0x23, 0x51, 0x67, 0x87, 0xb9, 0xd6, 0x6b, 0xfb, 0x7b, 0xa5, - 0x99, 0x85, 0x24, 0xb9, 0xb7, 0xc2, 0x34, 0x50, 0x54, 0x81, 0xd1, 0x5d, 0x43, 0x73, 0x3a, 0xc4, - 0x2e, 0xe6, 0x39, 0x3e, 0x4b, 0x8c, 0xa3, 0x1b, 0xee, 0xd0, 0xe3, 0xbd, 0xd2, 0xc8, 0xcd, 0x3a, - 0xbf, 0xa6, 0x7b, 0x5c, 0xec, 0x7e, 0xc2, 0x4a, 0x13, 0xb1, 0x67, 0xf9, 0x7b, 0x61, 0x21, 0x48, - 0x0a, 0xb7, 0x03, 0x12, 0x0e, 0xf3, 0xa1, 0xfb, 0x30, 0xb6, 0x2d, 0xee, 0xa4, 0x76, 0x71, 0xb4, - 0xaf, 0x43, 0x29, 0x72, 0x87, 0xad, 0x4e, 0x0b, 0x15, 0x63, 0xde, 0xb0, 0x8d, 0x03, 0x44, 0x74, - 0x01, 0x46, 0xf9, 0x8f, 0xe5, 0x25, 0xfe, 0x18, 0x53, 0x08, 0x52, 0xc7, 0x6d, 0x77, 0x18, 0x7b, - 0x74, 0x8f, 0x75, 0xb9, 0xb6, 0xc8, 0x1f, 0x05, 0x63, 0xac, 0xcb, 0xb5, 0x45, 0xec, 0xd1, 0xd1, - 0x3b, 0x30, 0x6a, 0x93, 0x15, 0x55, 0x77, 0x1e, 0x16, 0xa1, 0xaf, 0x96, 0x62, 0xfd, 0x06, 0xe7, - 0x8e, 0x3d, 0x8b, 0x04, 0x1a, 0x04, 0x1d, 0x7b, 0xb0, 0x68, 0x1b, 0xc6, 0x2c, 0x47, 0x5f, 0xb0, - 0xd7, 0x6d, 0x62, 0x15, 0xc7, 0xb9, 0x8e, 0x5e, 0xd9, 0x12, 0x7b, 0xfc, 0x71, 0x2d, 0x7e, 0x84, - 0x7c, 0x0e, 0x1c, 0x80, 0xa3, 0xef, 0x49, 0x80, 0x6c, 0xc7, 0x34, 0x35, 0xd2, 0x21, 0x3a, 0x55, - 0x34, 0xfe, 0x12, 0x63, 0x17, 0x8f, 0x73, 0x9d, 0xff, 0xdf, 0xcb, 0xaf, 0x84, 0x60, 0x5c, 0xb9, - 0xff, 0xe4, 0x99, 0x64, 0xc5, 0x29, 0x7a, 0x59, 0x68, 0xb7, 0x6c, 0xfe, 0x77, 0x71, 0xa2, 0xaf, - 0xd0, 0xa6, 0xbf, 0x38, 0x05, 0xa1, 0x15, 0x74, 0xec, 0xc1, 0xa2, 0x0d, 0x98, 0xb5, 0x88, 0xd2, - 0xba, 0xa3, 0x6b, 0x5d, 0x6c, 0x18, 0xf4, 0xa6, 0xaa, 0x11, 0xbb, 0x6b, 0x53, 0xd2, 0x29, 0x4e, - 0xf2, 0x69, 0xf7, 0x5b, 0xf2, 0x38, 0x95, 0x0b, 0x67, 0x48, 0xa3, 0x0e, 0x94, 0xbc, 0x94, 0xc1, - 0xf6, 0x93, 0x9f, 0xb3, 0x6e, 0xd8, 0x4d, 0x45, 0x73, 0x5f, 0x81, 0xa7, 0xb8, 0x82, 0x17, 0xf6, - 0xf7, 0x4a, 0xa5, 0xa5, 0x83, 0x59, 0x71, 0x2f, 0x2c, 0xf4, 0x36, 0x14, 0x95, 0x2c, 0x3d, 0x27, - 0xb8, 0x9e, 0xb3, 0xc2, 0x91, 0x62, 0xa6, 0x92, 0x4c, 0x04, 0xde, 0xca, 0x16, 0x0f, 0x9b, 0x47, - 0xf3, 0xed, 0xd8, 0x60, 0xad, 0xec, 0xc0, 0xb4, 0x27, 0xd6, 0xca, 0x0e, 0x41, 0x1e, 0xfc, 0x36, - 0xf3, 0xb7, 0x21, 0x98, 0x09, 0x98, 0xfb, 0x6e, 0x65, 0xa7, 0x88, 0x3c, 0xb5, 0x56, 0x76, 0x7a, - 0x2f, 0x38, 0xf7, 0xb4, 0x7b, 0xc1, 0x4f, 0xa1, 0x85, 0xce, 0xdb, 0xcb, 0x41, 0xe8, 0xfe, 0xfd, - 0xda, 0xcb, 0x81, 0x6d, 0x19, 0x25, 0xcf, 0x2f, 0x87, 0xc2, 0x0e, 0xfc, 0xc7, 0xf7, 0x38, 0xbf, - 0xfa, 0x07, 0x76, 0xf2, 0xa7, 0x39, 0x38, 0x11, 0xdf, 0x8d, 0x91, 0x56, 0x98, 0xd4, 0xb3, 0x15, - 0x56, 0x83, 0x93, 0x5b, 0x8e, 0xa6, 0x75, 0x79, 0x18, 0x42, 0xfd, 0x30, 0xf7, 0x29, 0xfb, 0x39, - 0x21, 0x79, 0xf2, 0x66, 0x0a, 0x0f, 0x4e, 0x95, 0xcc, 0x68, 0xeb, 0xe5, 0x0e, 0xd5, 0xd6, 0x4b, - 0x74, 0x99, 0x86, 0x07, 0xe8, 0x32, 0xa5, 0xb6, 0xe8, 0xf2, 0x87, 0x68, 0xd1, 0x1d, 0xa6, 0xa7, - 0x96, 0x92, 0xc4, 0x7a, 0xf5, 0xd4, 0xe4, 0xe7, 0x60, 0x4e, 0x88, 0x51, 0xde, 0xee, 0xd2, 0xa9, - 0x65, 0x68, 0x1a, 0xb1, 0x96, 0x9c, 0x4e, 0xa7, 0x2b, 0xbf, 0x01, 0x93, 0xd1, 0x46, 0xae, 0x3b, - 0xd3, 0x6e, 0x2f, 0x59, 0x34, 0x14, 0x42, 0x33, 0xed, 0x8e, 0x63, 0x9f, 0x43, 0x7e, 0x5f, 0x82, - 0xd9, 0xf4, 0x0f, 0xb6, 0x90, 0x06, 0x93, 0x1d, 0xe5, 0x61, 0xf8, 0xeb, 0x36, 0xe9, 0x90, 0x77, - 0x69, 0xde, 0xc1, 0x5b, 0x8d, 0x60, 0xe1, 0x18, 0x36, 0xbb, 0x5f, 0x9f, 0xca, 0xe8, 0x9d, 0x1d, - 0xad, 0x25, 0xe8, 0x1e, 0x14, 0x3a, 0xca, 0xc3, 0xba, 0x63, 0xb5, 0xc9, 0xa1, 0x5f, 0x0f, 0x78, - 0xc6, 0x58, 0x15, 0x28, 0xd8, 0xc7, 0x93, 0x3f, 0x92, 0xa0, 0x98, 0x55, 0x68, 0xa2, 0xab, 0x91, - 0x2e, 0xdf, 0xf3, 0xb1, 0x2e, 0xdf, 0x74, 0x42, 0xee, 0x29, 0xf5, 0xf8, 0x7e, 0x21, 0xc1, 0x6c, - 0x7a, 0xc1, 0x8d, 0x5e, 0x8e, 0x58, 0x58, 0x8a, 0x59, 0x38, 0x15, 0x93, 0x12, 0xf6, 0x7d, 0x13, - 0x26, 0x45, 0x59, 0x2e, 0x60, 0x44, 0x54, 0xe5, 0xb4, 0x5c, 0x29, 0x20, 0xbc, 0x32, 0x94, 0xcf, - 0x57, 0x74, 0x0c, 0xc7, 0xd0, 0xe4, 0xef, 0x0e, 0x41, 0xbe, 0xde, 0x54, 0x34, 0x72, 0x04, 0x65, - 0xd6, 0x9b, 0x91, 0x32, 0xab, 0xd7, 0x97, 0xe8, 0xdc, 0xaa, 0xcc, 0x0a, 0x0b, 0xc7, 0x2a, 0xac, - 0x17, 0xfb, 0x42, 0x3b, 0xb8, 0xb8, 0xfa, 0x1f, 0x18, 0xf3, 0x95, 0x0e, 0x96, 0xf3, 0xe5, 0x9f, - 0x0e, 0xc1, 0x78, 0x48, 0xc5, 0x80, 0x27, 0xc6, 0x56, 0xe4, 0xa4, 0xed, 0xe7, 0x7f, 0x52, 0x42, - 0xba, 0xca, 0xde, 0xd9, 0xea, 0x7e, 0xb0, 0x15, 0x7c, 0xa2, 0x93, 0x3c, 0x72, 0xdf, 0x80, 0x49, - 0xca, 0xff, 0x67, 0xc3, 0x7f, 0x73, 0xcb, 0xf1, 0xb5, 0xe8, 0x7f, 0xe6, 0xd7, 0x88, 0x50, 0x71, - 0x8c, 0x7b, 0xee, 0x3a, 0x4c, 0x44, 0x94, 0x0d, 0xf4, 0xbd, 0xd5, 0xaf, 0x24, 0x78, 0xbe, 0xe7, - 0x95, 0x0d, 0x55, 0x23, 0x9b, 0xa4, 0x1c, 0xdb, 0x24, 0xf3, 0xd9, 0x00, 0x4f, 0xb1, 0x6f, 0xff, - 0xfe, 0x10, 0xa0, 0xc6, 0xb6, 0x6a, 0xb5, 0x6a, 0x8a, 0x45, 0xbb, 0x58, 0xfc, 0xe3, 0xcd, 0x11, - 0x6c, 0x98, 0xab, 0x30, 0xde, 0x22, 0x76, 0xd3, 0x52, 0x79, 0x70, 0x44, 0x75, 0xee, 0x3f, 0x6b, - 0x2c, 0x05, 0x24, 0x1c, 0xe6, 0x43, 0x6f, 0x41, 0x61, 0xd7, 0xfd, 0x4f, 0x2e, 0xaf, 0x2b, 0xd5, - 0xab, 0x90, 0x0c, 0xfe, 0xf7, 0x2b, 0x58, 0x3f, 0x62, 0xc0, 0xc6, 0x3e, 0x98, 0xfc, 0xa1, 0x04, - 0xb3, 0xc9, 0x40, 0x2c, 0x31, 0x53, 0x9f, 0x7e, 0x30, 0x9e, 0x83, 0x61, 0x8e, 0xce, 0xa2, 0x70, - 0xdc, 0x7d, 0x61, 0x66, 0x9a, 0x31, 0x1f, 0x95, 0xff, 0x2c, 0xc1, 0x5c, 0xba, 0x69, 0x47, 0x50, - 0xb6, 0xdf, 0x8b, 0x96, 0xed, 0xbd, 0x5e, 0x0d, 0xd2, 0xed, 0xcc, 0x28, 0xe1, 0xff, 0x94, 0x1a, - 0xf3, 0x23, 0x70, 0x6a, 0x23, 0xea, 0xd4, 0xe5, 0x81, 0x9d, 0x4a, 0x77, 0xa8, 0x7a, 0xe9, 0xd1, - 0x17, 0xf3, 0xc7, 0x3e, 0xfb, 0x62, 0xfe, 0xd8, 0xe7, 0x5f, 0xcc, 0x1f, 0xfb, 0xce, 0xfe, 0xbc, - 0xf4, 0x68, 0x7f, 0x5e, 0xfa, 0x6c, 0x7f, 0x5e, 0xfa, 0x7c, 0x7f, 0x5e, 0xfa, 0xeb, 0xfe, 0xbc, - 0xf4, 0xc3, 0x2f, 0xe7, 0x8f, 0xdd, 0x1b, 0x15, 0xb8, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xc0, - 0x14, 0x27, 0xd4, 0x89, 0x3a, 0x00, 0x00, + 0x34, 0x1c, 0x9d, 0x16, 0xc7, 0x38, 0x0a, 0x62, 0xfb, 0x71, 0x31, 0x42, 0xc1, 0x31, 0x4e, 0xf9, + 0x0f, 0x12, 0x9c, 0xca, 0xd8, 0xd3, 0xe8, 0xff, 0x60, 0x98, 0x76, 0x4d, 0xef, 0xb4, 0xfe, 0x6f, + 0xef, 0x80, 0x68, 0x74, 0x4d, 0xf2, 0x78, 0xaf, 0x74, 0x3a, 0x43, 0x8c, 0x91, 0x31, 0x17, 0x44, + 0x3a, 0x4c, 0x58, 0x4c, 0x9d, 0xde, 0x76, 0x59, 0x44, 0xf2, 0xba, 0xda, 0x23, 0xc7, 0xe0, 0xb0, + 0x4c, 0x90, 0x8c, 0xa7, 0xf7, 0xf7, 0x4a, 0x13, 0x11, 0x1a, 0x8e, 0xc2, 0xcb, 0x1f, 0x0e, 0x01, + 0x2c, 0x11, 0x53, 0x33, 0xba, 0x1d, 0xa2, 0x1f, 0xc5, 0x81, 0x7b, 0x27, 0x72, 0xe0, 0x5e, 0xea, + 0x95, 0x3b, 0x7d, 0xd3, 0x32, 0x4f, 0xdc, 0xb7, 0x62, 0x27, 0x6e, 0xa5, 0x7f, 0xc8, 0x83, 0x8f, + 0xdc, 0xbf, 0xe4, 0x60, 0x26, 0x60, 0x5e, 0x34, 0xf4, 0x96, 0xca, 0xf7, 0xc7, 0xf5, 0xc8, 0x1c, + 0xff, 0x57, 0x6c, 0x8e, 0x4f, 0xa5, 0x88, 0x84, 0xe6, 0x77, 0xc5, 0xb7, 0x76, 0x88, 0x8b, 0xbf, + 0x12, 0x55, 0xfe, 0x78, 0xaf, 0x94, 0x72, 0x59, 0x29, 0xfb, 0x48, 0x51, 0x13, 0xd1, 0x39, 0x18, + 0xb1, 0x88, 0x62, 0x1b, 0x3a, 0x4f, 0x14, 0x63, 0x81, 0x2b, 0x98, 0x8f, 0x62, 0x41, 0x45, 0x17, + 0x60, 0xb4, 0x43, 0x6c, 0x5b, 0x69, 0x13, 0x9e, 0x13, 0xc6, 0xaa, 0x53, 0x82, 0x71, 0x74, 0xd5, + 0x1d, 0xc6, 0x1e, 0x1d, 0x3d, 0x80, 0x49, 0x4d, 0xb1, 0xc5, 0x02, 0x6d, 0xa8, 0x1d, 0xc2, 0x77, + 0xfd, 0xf8, 0x95, 0x17, 0xfb, 0x5b, 0x07, 0x4c, 0x22, 0x38, 0xd9, 0x56, 0x22, 0x48, 0x38, 0x86, + 0x8c, 0x76, 0x01, 0xb1, 0x91, 0x86, 0xa5, 0xe8, 0xb6, 0x1b, 0x28, 0xa6, 0x6f, 0x74, 0x60, 0x7d, + 0x7e, 0x86, 0x5b, 0x49, 0xa0, 0xe1, 0x14, 0x0d, 0xf2, 0x6f, 0x24, 0x98, 0x0c, 0xa6, 0xe9, 0x08, + 0xaa, 0xa9, 0xb5, 0x68, 0x35, 0x75, 0xa1, 0xef, 0x25, 0x9a, 0x51, 0x4e, 0xfd, 0x63, 0x08, 0x50, + 0xc0, 0xc4, 0x36, 0xf8, 0xa6, 0xd2, 0xdc, 0xe9, 0xe3, 0xae, 0xf0, 0x81, 0x04, 0x48, 0xa4, 0xe7, + 0x05, 0x5d, 0x37, 0x28, 0xcf, 0xf8, 0x9e, 0x59, 0xcb, 0x7d, 0x9b, 0xe5, 0x69, 0x2c, 0xaf, 0x27, + 0xb0, 0x6e, 0xe8, 0xd4, 0xea, 0x06, 0x33, 0x92, 0x64, 0xc0, 0x29, 0x06, 0x20, 0x05, 0xc0, 0x12, + 0x98, 0x0d, 0x43, 0x6c, 0xe4, 0x4b, 0x7d, 0xe4, 0x3c, 0x26, 0xb0, 0x68, 0xe8, 0x5b, 0x6a, 0x3b, + 0x48, 0x3b, 0xd8, 0x07, 0xc2, 0x21, 0xd0, 0xb9, 0x1b, 0x70, 0x2a, 0xc3, 0x5a, 0x74, 0x02, 0x72, + 0x3b, 0xa4, 0xeb, 0x86, 0x0d, 0xb3, 0x3f, 0xd1, 0xc9, 0xf0, 0x9d, 0x6a, 0x4c, 0x5c, 0x87, 0x5e, + 0x1f, 0xba, 0x26, 0xc9, 0x9f, 0xe4, 0xc3, 0x6b, 0x87, 0x97, 0xb2, 0xe7, 0xa1, 0x60, 0x11, 0x53, + 0x53, 0x9b, 0x8a, 0x2d, 0x2a, 0x14, 0x5e, 0x95, 0x62, 0x31, 0x86, 0x7d, 0x6a, 0xa4, 0xe8, 0x1d, + 0x7a, 0xba, 0x45, 0x6f, 0xee, 0xc9, 0x14, 0xbd, 0xdf, 0x82, 0x82, 0xed, 0x95, 0xbb, 0xc3, 0x1c, + 0xf2, 0xf2, 0x00, 0xf9, 0x55, 0x54, 0xba, 0xbe, 0x02, 0xbf, 0xc6, 0xf5, 0x41, 0xd3, 0xaa, 0xdb, + 0xfc, 0x80, 0xd5, 0xed, 0x13, 0xad, 0x48, 0x59, 0x4e, 0x35, 0x15, 0xc7, 0x26, 0x2d, 0x9e, 0x88, + 0x0a, 0x41, 0x4e, 0xad, 0xf1, 0x51, 0x2c, 0xa8, 0xe8, 0x7e, 0x64, 0xc9, 0x16, 0x0e, 0xb3, 0x64, + 0x27, 0xb3, 0x97, 0x2b, 0x5a, 0x87, 0x53, 0xa6, 0x65, 0xb4, 0x2d, 0x62, 0xdb, 0x4b, 0x44, 0x69, + 0x69, 0xaa, 0x4e, 0xbc, 0xf8, 0xb8, 0xa5, 0xca, 0xe9, 0xfd, 0xbd, 0xd2, 0xa9, 0x5a, 0x3a, 0x0b, + 0xce, 0x92, 0x95, 0x1f, 0x0d, 0xc3, 0x89, 0xf8, 0x09, 0x98, 0x51, 0x3d, 0x4a, 0x87, 0xaa, 0x1e, + 0x2f, 0x86, 0x36, 0x83, 0x5b, 0x5a, 0xfb, 0xb3, 0x9f, 0xb2, 0x21, 0x16, 0x60, 0x4a, 0x64, 0x03, + 0x8f, 0x28, 0xea, 0x67, 0x7f, 0xf6, 0xd7, 0xa3, 0x64, 0x1c, 0xe7, 0x67, 0x35, 0x61, 0x50, 0xea, + 0x79, 0x20, 0xc3, 0xd1, 0x9a, 0x70, 0x21, 0xce, 0x80, 0x93, 0x32, 0x68, 0x15, 0x66, 0x1c, 0x3d, + 0x09, 0xe5, 0xae, 0xc6, 0xd3, 0x02, 0x6a, 0x66, 0x3d, 0xc9, 0x82, 0xd3, 0xe4, 0xd0, 0x16, 0x40, + 0xd3, 0x3b, 0xb6, 0xed, 0xe2, 0x08, 0xcf, 0xb0, 0x57, 0xfa, 0xde, 0x3b, 0xfe, 0x89, 0x1f, 0xe4, + 0x35, 0x7f, 0xc8, 0xc6, 0x21, 0x64, 0x74, 0x1d, 0x26, 0x2c, 0x7e, 0x21, 0xf0, 0x0c, 0x76, 0x8b, + 0xea, 0x67, 0x84, 0xd8, 0x04, 0x0e, 0x13, 0x71, 0x94, 0x37, 0xa5, 0x0e, 0x2e, 0xf4, 0x5d, 0x07, + 0xff, 0x56, 0x0a, 0x1f, 0x42, 0x7e, 0x09, 0xfc, 0x7a, 0xa4, 0x3c, 0x3a, 0x17, 0x2b, 0x8f, 0x66, + 0x93, 0x12, 0xa1, 0xea, 0xc8, 0x48, 0xaf, 0x7e, 0x5f, 0x1d, 0xa8, 0xfa, 0x0d, 0x0e, 0xcf, 0xde, + 0xe5, 0xef, 0x47, 0x12, 0xcc, 0xde, 0xac, 0xdf, 0xb2, 0x0c, 0xc7, 0xf4, 0xcc, 0xb9, 0x63, 0xba, + 0x71, 0x7d, 0x0d, 0x86, 0x2d, 0x47, 0xf3, 0xfc, 0x78, 0xc1, 0xf3, 0x03, 0x3b, 0x1a, 0xf3, 0x63, + 0x26, 0x26, 0xe5, 0x3a, 0xc1, 0x04, 0xd0, 0x1a, 0x8c, 0x58, 0x8a, 0xde, 0x26, 0xde, 0xb1, 0x7a, + 0xae, 0x87, 0xf5, 0xcb, 0x4b, 0x98, 0xb1, 0x87, 0x8a, 0x37, 0x2e, 0x8d, 0x05, 0x8a, 0xfc, 0x7d, + 0x09, 0xa6, 0x6e, 0x37, 0x1a, 0xb5, 0x65, 0x9d, 0xef, 0xe8, 0x9a, 0x42, 0xb7, 0xd9, 0x49, 0x6f, + 0x2a, 0x74, 0x3b, 0x7e, 0xd2, 0x33, 0x1a, 0xe6, 0x14, 0xf4, 0x75, 0x18, 0x65, 0x99, 0x84, 0xe8, + 0xad, 0x3e, 0x4b, 0x6d, 0x01, 0x5f, 0x75, 0x85, 0x82, 0x0a, 0x51, 0x0c, 0x60, 0x0f, 0x4e, 0xde, + 0x81, 0x93, 0x21, 0x73, 0x58, 0x3c, 0xf8, 0x9b, 0x21, 0xaa, 0x43, 0x9e, 0x69, 0xf6, 0x9e, 0x04, + 0x7b, 0xbd, 0x7c, 0xc5, 0x5c, 0x0a, 0x2a, 0x1d, 0xf6, 0xcb, 0xc6, 0x2e, 0x96, 0xbc, 0x0a, 0x13, + 0xb7, 0x0d, 0x9b, 0xd6, 0x0c, 0x8b, 0xf2, 0xb0, 0xa0, 0x33, 0x90, 0xeb, 0xa8, 0xba, 0x38, 0x67, + 0xc7, 0x85, 0x4c, 0x8e, 0x9d, 0x11, 0x6c, 0x9c, 0x93, 0x95, 0x87, 0x22, 0xf3, 0x04, 0x64, 0xe5, + 0x21, 0x66, 0xe3, 0xf2, 0x2d, 0x18, 0x15, 0xe1, 0x0e, 0x03, 0xe5, 0x0e, 0x06, 0xca, 0xa5, 0x00, + 0xfd, 0x60, 0x08, 0x46, 0x85, 0xf5, 0x47, 0x70, 0x69, 0x5a, 0x89, 0x5c, 0x9a, 0x5e, 0xec, 0x6f, + 0x26, 0x33, 0x6f, 0x4c, 0x8d, 0xd8, 0x8d, 0xe9, 0x62, 0x9f, 0x78, 0x07, 0x5f, 0x97, 0x3e, 0x96, + 0x60, 0x32, 0xba, 0x86, 0xd0, 0x55, 0x18, 0x67, 0xe7, 0x83, 0xda, 0x24, 0x6b, 0x41, 0x59, 0xea, + 0x3f, 0x66, 0xd4, 0x03, 0x12, 0x0e, 0xf3, 0xa1, 0xb6, 0x2f, 0xc6, 0xa6, 0x5d, 0x38, 0x9d, 0x1d, + 0x52, 0x87, 0xaa, 0x5a, 0xd9, 0x6d, 0x50, 0x94, 0x97, 0x75, 0x7a, 0xc7, 0xaa, 0x53, 0x4b, 0xd5, + 0xdb, 0x09, 0x45, 0x7c, 0x0d, 0x85, 0x91, 0xe5, 0x5f, 0x4b, 0x30, 0x2e, 0x4c, 0x3e, 0x82, 0x4b, + 0xc0, 0xd7, 0xa2, 0x97, 0x80, 0x73, 0x7d, 0xee, 0xc7, 0xf4, 0x1b, 0xc0, 0xcf, 0x02, 0xd3, 0xd9, + 0x0e, 0x64, 0x09, 0x61, 0xdb, 0xb0, 0x69, 0x3c, 0x21, 0xb0, 0xbd, 0x83, 0x39, 0x05, 0x39, 0x70, + 0x42, 0x8d, 0x6d, 0x59, 0x11, 0xda, 0x4a, 0x7f, 0x96, 0xf8, 0x62, 0xd5, 0xa2, 0x80, 0x3f, 0x11, + 0xa7, 0xe0, 0x84, 0x0a, 0x99, 0x40, 0x82, 0x0b, 0xdd, 0x85, 0xe1, 0x6d, 0x4a, 0xcd, 0x94, 0x77, + 0xdf, 0x1e, 0x89, 0x22, 0x30, 0xa1, 0xc0, 0xbd, 0x6b, 0x34, 0x6a, 0x98, 0x43, 0xc9, 0xff, 0x0c, + 0xe2, 0x51, 0x77, 0xd7, 0xb8, 0x9f, 0xfe, 0xa4, 0xc3, 0xa4, 0xbf, 0xf1, 0xb4, 0xd4, 0x87, 0x6e, + 0x43, 0x8e, 0x6a, 0xfd, 0xde, 0xe2, 0x04, 0x62, 0x63, 0xa5, 0x1e, 0xe4, 0x8f, 0xc6, 0x4a, 0x1d, + 0x33, 0x08, 0x74, 0x07, 0xf2, 0xec, 0xb0, 0x60, 0x5b, 0x30, 0xd7, 0xff, 0x96, 0x66, 0xfe, 0x07, + 0x0b, 0x82, 0xfd, 0xb2, 0xb1, 0x8b, 0x23, 0xbf, 0x0b, 0x13, 0x91, 0x7d, 0x8a, 0xde, 0x81, 0xe3, + 0x9a, 0xa1, 0xb4, 0xaa, 0x8a, 0xa6, 0xe8, 0x4d, 0xe2, 0x3d, 0xb2, 0x9f, 0x4b, 0xbb, 0x10, 0xac, + 0x84, 0xf8, 0xc4, 0x2e, 0xf7, 0x5b, 0x65, 0x61, 0x1a, 0x8e, 0x20, 0xca, 0x0a, 0x40, 0xe0, 0x23, + 0x2a, 0x41, 0x9e, 0xad, 0x33, 0x37, 0xfd, 0x8f, 0x55, 0xc7, 0x98, 0x85, 0x6c, 0xf9, 0xd9, 0xd8, + 0x1d, 0x47, 0x57, 0x00, 0x6c, 0xd2, 0xb4, 0x08, 0xe5, 0xc9, 0xc0, 0x7d, 0xfe, 0xf0, 0xd3, 0x5e, + 0xdd, 0xa7, 0xe0, 0x10, 0x97, 0xfc, 0x7b, 0x09, 0x26, 0xd6, 0x08, 0x7d, 0xcf, 0xb0, 0x76, 0x6a, + 0xbc, 0x29, 0x7b, 0x04, 0xc9, 0x16, 0x47, 0x92, 0xed, 0x4b, 0x3d, 0x66, 0x26, 0x62, 0x5d, 0x56, + 0xca, 0x65, 0x7e, 0x14, 0x23, 0x9c, 0xe1, 0xbd, 0xbb, 0x0e, 0x79, 0xd3, 0xb0, 0xa8, 0x77, 0x70, + 0x0e, 0xa4, 0x91, 0xe5, 0xb1, 0xd0, 0xd1, 0xc9, 0x60, 0xb0, 0x8b, 0xc6, 0xfc, 0xd8, 0xb2, 0x8c, + 0x8e, 0x58, 0xad, 0x83, 0xa1, 0x12, 0x62, 0x05, 0x7e, 0xdc, 0xb4, 0x8c, 0x0e, 0xe6, 0x58, 0xf2, + 0xef, 0x24, 0x98, 0x8e, 0x70, 0x1e, 0x41, 0xde, 0xbc, 0x1b, 0xcd, 0x9b, 0x17, 0x07, 0x71, 0x24, + 0x23, 0x7b, 0xfe, 0x3d, 0xee, 0x06, 0x73, 0x18, 0x6d, 0xc1, 0xb8, 0x69, 0xb4, 0xea, 0x4f, 0xa0, + 0x2b, 0x35, 0xc5, 0x8e, 0x9d, 0x5a, 0x80, 0x85, 0xc3, 0xc0, 0xe8, 0x21, 0x4c, 0xeb, 0x4a, 0x87, + 0xd8, 0xa6, 0xd2, 0x24, 0xf5, 0x27, 0xf0, 0x1c, 0xf0, 0x0c, 0x7f, 0xf6, 0x8e, 0x23, 0xe2, 0xa4, + 0x12, 0xf9, 0xe7, 0x09, 0xbf, 0x0d, 0x8b, 0xa2, 0x5b, 0x50, 0xe0, 0xed, 0xfc, 0xa6, 0xa1, 0x79, + 0x0f, 0xd7, 0x6c, 0x2a, 0x6a, 0x62, 0xec, 0xf1, 0x5e, 0xe9, 0x74, 0xca, 0x9b, 0xa4, 0x47, 0xc6, + 0xbe, 0x30, 0x5a, 0x83, 0x61, 0xf3, 0xab, 0x9c, 0xd8, 0x3c, 0xa9, 0xf3, 0x63, 0x9a, 0xe3, 0xc8, + 0x5f, 0xc6, 0xcd, 0xe5, 0xa9, 0xfd, 0xc1, 0x13, 0x9b, 0x26, 0xbf, 0x42, 0xc8, 0x9c, 0xaa, 0x4d, + 0x18, 0x15, 0x27, 0x9a, 0x58, 0x7d, 0xaf, 0x0d, 0xb2, 0xfa, 0xc2, 0x59, 0xdb, 0xaf, 0xa7, 0xbd, + 0x41, 0x0f, 0x58, 0xfe, 0xa3, 0x04, 0xd3, 0xdc, 0x80, 0xa6, 0x63, 0xa9, 0xb4, 0x7b, 0x64, 0x79, + 0x6e, 0x23, 0x92, 0xe7, 0x5e, 0xe9, 0xe1, 0x58, 0xc2, 0xc2, 0xcc, 0x5c, 0xf7, 0xa9, 0x04, 0xcf, + 0x24, 0xb8, 0x8f, 0x20, 0x4f, 0xac, 0x47, 0xf3, 0xc4, 0x4b, 0x83, 0x3a, 0x94, 0x55, 0x69, 0x8d, + 0xa7, 0xb8, 0xc3, 0x17, 0xe2, 0x15, 0x00, 0xd3, 0x52, 0x77, 0x55, 0x8d, 0xb4, 0x45, 0x6f, 0xb2, + 0x10, 0x84, 0xbc, 0xe6, 0x53, 0x70, 0x88, 0x0b, 0xd9, 0x30, 0xdb, 0x22, 0x5b, 0x8a, 0xa3, 0xd1, + 0x85, 0x56, 0x6b, 0x51, 0x31, 0x95, 0x4d, 0x55, 0x53, 0xa9, 0x2a, 0x2e, 0x8b, 0x63, 0xd5, 0xeb, + 0x6e, 0xcf, 0x30, 0x8d, 0xe3, 0xf1, 0x5e, 0xe9, 0x4c, 0x5a, 0x6f, 0xc0, 0x63, 0xe9, 0xe2, 0x0c, + 0x68, 0xd4, 0x85, 0xa2, 0x45, 0xde, 0x75, 0x54, 0x8b, 0xb4, 0x96, 0x2c, 0xc3, 0x8c, 0xa8, 0xcd, + 0x71, 0xb5, 0xff, 0xbb, 0xbf, 0x57, 0x2a, 0xe2, 0x0c, 0x9e, 0xde, 0x8a, 0x33, 0xe1, 0xd1, 0x03, + 0x98, 0x51, 0x34, 0xcd, 0x78, 0x8f, 0x44, 0x9d, 0x1d, 0xe6, 0x5a, 0xaf, 0xed, 0xef, 0x95, 0x66, + 0x16, 0x92, 0xe4, 0xde, 0x0a, 0xd3, 0x40, 0x51, 0x05, 0x46, 0x77, 0x0d, 0xcd, 0xe9, 0x10, 0xbb, + 0x98, 0xe7, 0xf8, 0x2c, 0x31, 0x8e, 0x6e, 0xb8, 0x43, 0x8f, 0xf7, 0x4a, 0x23, 0x37, 0xeb, 0xfc, + 0x9a, 0xee, 0x71, 0xb1, 0xfb, 0x09, 0x2b, 0x4d, 0xc4, 0x9e, 0xe5, 0xef, 0x85, 0x85, 0x20, 0x29, + 0xdc, 0x0e, 0x48, 0x38, 0xcc, 0x87, 0xee, 0xc3, 0xd8, 0xb6, 0xb8, 0x93, 0xda, 0xc5, 0xd1, 0xbe, + 0x0e, 0xa5, 0xc8, 0x1d, 0xb6, 0x3a, 0x2d, 0x54, 0x8c, 0x79, 0xc3, 0x36, 0x0e, 0x10, 0xd1, 0x05, + 0x18, 0xe5, 0x3f, 0x96, 0x97, 0xf8, 0x63, 0x4c, 0x21, 0x48, 0x1d, 0xb7, 0xdd, 0x61, 0xec, 0xd1, + 0x3d, 0xd6, 0xe5, 0xda, 0x22, 0x7f, 0x14, 0x8c, 0xb1, 0x2e, 0xd7, 0x16, 0xb1, 0x47, 0x47, 0xef, + 0xc0, 0xa8, 0x4d, 0x56, 0x54, 0xdd, 0x79, 0x58, 0x84, 0xbe, 0x5a, 0x8a, 0xf5, 0x1b, 0x9c, 0x3b, + 0xf6, 0x2c, 0x12, 0x68, 0x10, 0x74, 0xec, 0xc1, 0xa2, 0x6d, 0x18, 0xb3, 0x1c, 0x7d, 0xc1, 0x5e, + 0xb7, 0x89, 0x55, 0x1c, 0xe7, 0x3a, 0x7a, 0x65, 0x4b, 0xec, 0xf1, 0xc7, 0xb5, 0xf8, 0x11, 0xf2, + 0x39, 0x70, 0x00, 0x8e, 0xbe, 0x27, 0x01, 0xb2, 0x1d, 0xd3, 0xd4, 0x48, 0x87, 0xe8, 0x54, 0xd1, + 0xf8, 0x4b, 0x8c, 0x5d, 0x3c, 0xce, 0x75, 0xfe, 0x7f, 0x2f, 0xbf, 0x12, 0x82, 0x71, 0xe5, 0xfe, + 0x93, 0x67, 0x92, 0x15, 0xa7, 0xe8, 0x65, 0xa1, 0xdd, 0xb2, 0xf9, 0xdf, 0xc5, 0x89, 0xbe, 0x42, + 0x9b, 0xfe, 0xe2, 0x14, 0x84, 0x56, 0xd0, 0xb1, 0x07, 0x8b, 0x36, 0x60, 0xd6, 0x22, 0x4a, 0xeb, + 0x8e, 0xae, 0x75, 0xb1, 0x61, 0xd0, 0x9b, 0xaa, 0x46, 0xec, 0xae, 0x4d, 0x49, 0xa7, 0x38, 0xc9, + 0xa7, 0xdd, 0x6f, 0xc9, 0xe3, 0x54, 0x2e, 0x9c, 0x21, 0x8d, 0x3a, 0x50, 0xf2, 0x52, 0x06, 0xdb, + 0x4f, 0x7e, 0xce, 0xba, 0x61, 0x37, 0x15, 0xcd, 0x7d, 0x05, 0x9e, 0xe2, 0x0a, 0x5e, 0xd8, 0xdf, + 0x2b, 0x95, 0x96, 0x0e, 0x66, 0xc5, 0xbd, 0xb0, 0xd0, 0xdb, 0x50, 0x54, 0xb2, 0xf4, 0x9c, 0xe0, + 0x7a, 0xce, 0x0a, 0x47, 0x8a, 0x99, 0x4a, 0x32, 0x11, 0x78, 0x2b, 0x5b, 0x3c, 0x6c, 0x1e, 0xcd, + 0xb7, 0x63, 0x83, 0xb5, 0xb2, 0x03, 0xd3, 0x9e, 0x58, 0x2b, 0x3b, 0x04, 0x79, 0xf0, 0xdb, 0xcc, + 0xdf, 0x86, 0x60, 0x26, 0x60, 0xee, 0xbb, 0x95, 0x9d, 0x22, 0xf2, 0xd4, 0x5a, 0xd9, 0xe9, 0xbd, + 0xe0, 0xdc, 0xd3, 0xee, 0x05, 0x3f, 0x85, 0x16, 0x3a, 0x6f, 0x2f, 0x07, 0xa1, 0xfb, 0xf7, 0x6b, + 0x2f, 0x07, 0xb6, 0x65, 0x94, 0x3c, 0xbf, 0x1c, 0x0a, 0x3b, 0xf0, 0x1f, 0xdf, 0xe3, 0xfc, 0xea, + 0x1f, 0xd8, 0xc9, 0x9f, 0xe6, 0xe0, 0x44, 0x7c, 0x37, 0x46, 0x5a, 0x61, 0x52, 0xcf, 0x56, 0x58, + 0x0d, 0x4e, 0x6e, 0x39, 0x9a, 0xd6, 0xe5, 0x61, 0x08, 0xf5, 0xc3, 0xdc, 0xa7, 0xec, 0xe7, 0x84, + 0xe4, 0xc9, 0x9b, 0x29, 0x3c, 0x38, 0x55, 0x32, 0xa3, 0xad, 0x97, 0x3b, 0x54, 0x5b, 0x2f, 0xd1, + 0x65, 0x1a, 0x1e, 0xa0, 0xcb, 0x94, 0xda, 0xa2, 0xcb, 0x1f, 0xa2, 0x45, 0x77, 0x98, 0x9e, 0x5a, + 0x4a, 0x12, 0xeb, 0xd5, 0x53, 0x93, 0x9f, 0x83, 0x39, 0x21, 0x46, 0x79, 0xbb, 0x4b, 0xa7, 0x96, + 0xa1, 0x69, 0xc4, 0x5a, 0x72, 0x3a, 0x9d, 0xae, 0xfc, 0x06, 0x4c, 0x46, 0x1b, 0xb9, 0xee, 0x4c, + 0xbb, 0xbd, 0x64, 0xd1, 0x50, 0x08, 0xcd, 0xb4, 0x3b, 0x8e, 0x7d, 0x0e, 0xf9, 0x7d, 0x09, 0x66, + 0xd3, 0x3f, 0xd8, 0x42, 0x1a, 0x4c, 0x76, 0x94, 0x87, 0xe1, 0xaf, 0xdb, 0xa4, 0x43, 0xde, 0xa5, + 0x79, 0x07, 0x6f, 0x35, 0x82, 0x85, 0x63, 0xd8, 0xec, 0x7e, 0x7d, 0x2a, 0xa3, 0x77, 0x76, 0xb4, + 0x96, 0xa0, 0x7b, 0x50, 0xe8, 0x28, 0x0f, 0xeb, 0x8e, 0xd5, 0x26, 0x87, 0x7e, 0x3d, 0xe0, 0x19, + 0x63, 0x55, 0xa0, 0x60, 0x1f, 0x4f, 0xfe, 0x48, 0x82, 0x62, 0x56, 0xa1, 0x89, 0xae, 0x46, 0xba, + 0x7c, 0xcf, 0xc7, 0xba, 0x7c, 0xd3, 0x09, 0xb9, 0xa7, 0xd4, 0xe3, 0xfb, 0x85, 0x04, 0xb3, 0xe9, + 0x05, 0x37, 0x7a, 0x39, 0x62, 0x61, 0x29, 0x66, 0xe1, 0x54, 0x4c, 0x4a, 0xd8, 0xf7, 0x4d, 0x98, + 0x14, 0x65, 0xb9, 0x80, 0x11, 0x51, 0x95, 0xd3, 0x72, 0xa5, 0x80, 0xf0, 0xca, 0x50, 0x3e, 0x5f, + 0xd1, 0x31, 0x1c, 0x43, 0x93, 0xbf, 0x3b, 0x04, 0xf9, 0x7a, 0x53, 0xd1, 0xc8, 0x11, 0x94, 0x59, + 0x6f, 0x46, 0xca, 0xac, 0x5e, 0x5f, 0xa2, 0x73, 0xab, 0x32, 0x2b, 0x2c, 0x1c, 0xab, 0xb0, 0x5e, + 0xec, 0x0b, 0xed, 0xe0, 0xe2, 0xea, 0x7f, 0x60, 0xcc, 0x57, 0x3a, 0x58, 0xce, 0x97, 0x7f, 0x3a, + 0x04, 0xe3, 0x21, 0x15, 0x03, 0x9e, 0x18, 0x5b, 0x91, 0x93, 0xb6, 0x9f, 0xff, 0x49, 0x09, 0xe9, + 0x2a, 0x7b, 0x67, 0xab, 0xfb, 0xc1, 0x56, 0xf0, 0x89, 0x4e, 0xf2, 0xc8, 0x7d, 0x03, 0x26, 0x29, + 0xff, 0x9f, 0x0d, 0xff, 0xcd, 0x2d, 0xc7, 0xd7, 0xa2, 0xff, 0x99, 0x5f, 0x23, 0x42, 0xc5, 0x31, + 0xee, 0xb9, 0xeb, 0x30, 0x11, 0x51, 0x36, 0xd0, 0xf7, 0x56, 0xbf, 0x92, 0xe0, 0xf9, 0x9e, 0x57, + 0x36, 0x54, 0x8d, 0x6c, 0x92, 0x72, 0x6c, 0x93, 0xcc, 0x67, 0x03, 0x3c, 0xc5, 0xbe, 0xfd, 0xfb, + 0x43, 0x80, 0x1a, 0xdb, 0xaa, 0xd5, 0xaa, 0x29, 0x16, 0xed, 0x62, 0xf1, 0x8f, 0x37, 0x47, 0xb0, + 0x61, 0xae, 0xc2, 0x78, 0x8b, 0xd8, 0x4d, 0x4b, 0xe5, 0xc1, 0x11, 0xd5, 0xb9, 0xff, 0xac, 0xb1, + 0x14, 0x90, 0x70, 0x98, 0x0f, 0xbd, 0x05, 0x85, 0x5d, 0xf7, 0x3f, 0xb9, 0xbc, 0xae, 0x54, 0xaf, + 0x42, 0x32, 0xf8, 0xdf, 0xaf, 0x60, 0xfd, 0x88, 0x01, 0x1b, 0xfb, 0x60, 0xf2, 0x87, 0x12, 0xcc, + 0x26, 0x03, 0xb1, 0xc4, 0x4c, 0x7d, 0xfa, 0xc1, 0x78, 0x0e, 0x86, 0x39, 0x3a, 0x8b, 0xc2, 0x71, + 0xf7, 0x85, 0x99, 0x69, 0xc6, 0x7c, 0x54, 0xfe, 0xb3, 0x04, 0x73, 0xe9, 0xa6, 0x1d, 0x41, 0xd9, + 0x7e, 0x2f, 0x5a, 0xb6, 0xf7, 0x7a, 0x35, 0x48, 0xb7, 0x33, 0xa3, 0x84, 0xff, 0x53, 0x6a, 0xcc, + 0x8f, 0xc0, 0xa9, 0x8d, 0xa8, 0x53, 0x97, 0x07, 0x76, 0x2a, 0xdd, 0xa1, 0xea, 0xa5, 0x47, 0x5f, + 0xcc, 0x1f, 0xfb, 0xec, 0x8b, 0xf9, 0x63, 0x9f, 0x7f, 0x31, 0x7f, 0xec, 0x3b, 0xfb, 0xf3, 0xd2, + 0xa3, 0xfd, 0x79, 0xe9, 0xb3, 0xfd, 0x79, 0xe9, 0xf3, 0xfd, 0x79, 0xe9, 0xaf, 0xfb, 0xf3, 0xd2, + 0x0f, 0xbf, 0x9c, 0x3f, 0x76, 0x6f, 0x54, 0xe0, 0xfe, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x87, + 0x28, 0xe6, 0x89, 0x3a, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto index 91510a4a33e1e..c9e7224726924 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto @@ -181,7 +181,7 @@ message DaemonSetStatus { // uses this field as a collision avoidance mechanism when it needs to // create the name for the newest ControllerRevision. // +optional - optional int64 collisionCount = 9; + optional int32 collisionCount = 9; } message DaemonSetUpdateStrategy { @@ -344,7 +344,7 @@ message DeploymentStatus { // field as a collision avoidance mechanism when it needs to create the name for the // newest ReplicaSet. // +optional - optional int64 collisionCount = 8; + optional int32 collisionCount = 8; } // DeploymentStrategy describes how to replace existing pods with new ones. diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types.generated.go b/staging/src/k8s.io/api/extensions/v1beta1/types.generated.go index ee6d2082b77dc..b6ecc170b19f7 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types.generated.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types.generated.go @@ -6000,13 +6000,13 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } } else { if x.CollisionCount == nil { - x.CollisionCount = new(int64) + x.CollisionCount = new(int32) } yym19 := z.DecBinary() _ = yym19 if false { } else { - *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + *((*int32)(x.CollisionCount)) = int32(r.DecodeInt(32)) } } default: @@ -6194,13 +6194,13 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) } } else { if x.CollisionCount == nil { - x.CollisionCount = new(int64) + x.CollisionCount = new(int32) } yym36 := z.DecBinary() _ = yym36 if false { } else { - *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + *((*int32)(x.CollisionCount)) = int32(r.DecodeInt(32)) } } for { @@ -8424,13 +8424,13 @@ func (x *DaemonSetStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { } } else { if x.CollisionCount == nil { - x.CollisionCount = new(int64) + x.CollisionCount = new(int32) } yym21 := z.DecBinary() _ = yym21 if false { } else { - *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + *((*int32)(x.CollisionCount)) = int32(r.DecodeInt(32)) } } default: @@ -8640,13 +8640,13 @@ func (x *DaemonSetStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) } } else { if x.CollisionCount == nil { - x.CollisionCount = new(int64) + x.CollisionCount = new(int32) } yym40 := z.DecBinary() _ = yym40 if false { } else { - *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + *((*int32)(x.CollisionCount)) = int32(r.DecodeInt(32)) } } for { diff --git a/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go index 6f2c4aa7e1a60..d93cb0cea23b7 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go @@ -477,7 +477,7 @@ func (in *DaemonSetStatus) DeepCopyInto(out *DaemonSetStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } @@ -712,7 +712,7 @@ func (in *DeploymentStatus) DeepCopyInto(out *DeploymentStatus) { if *in == nil { *out = nil } else { - *out = new(int64) + *out = new(int32) **out = **in } } From 623d0efb6dad290428bcfc133267bece34633caf Mon Sep 17 00:00:00 2001 From: "Tim(Xiaoyu) Zhang" Date: Fri, 18 Aug 2017 11:09:11 +0800 Subject: [PATCH 103/403] Reduce one time url direction Reduce one time url direction --- examples/volumes/flexvolume/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/volumes/flexvolume/README.md b/examples/volumes/flexvolume/README.md index 33ce85b526e5d..a872b6524865f 100644 --- a/examples/volumes/flexvolume/README.md +++ b/examples/volumes/flexvolume/README.md @@ -1 +1 @@ -This file has moved to [https://github.com/kubernetes/examples/blob/master/staging/volumes/flexvolume/README.md](https://github.com/kubernetes/examples/blob/master/staging/volumes/flexvolume/README.md) +This file has moved to [https://github.com/kubernetes/community/blob/master/contributors/devel/flexvolume.md](https://github.com/kubernetes/community/blob/master/contributors/devel/flexvolume.md) From 7b5c7bb711e7f15a1bf216a7a51fd40148110fba Mon Sep 17 00:00:00 2001 From: Cao Shufeng Date: Fri, 18 Aug 2017 11:50:27 +0800 Subject: [PATCH 104/403] remove dead code for cloner I found some dead code in audit webhook backend. This change do some clean work for: https://github.com/kubernetes/kubernetes/pull/48544/commits/2bbe72d4e09f7c95e1ad851187d4733a54644fbe --- .../pkg/controller/finalizer/BUILD | 1 - .../pkg/controller/finalizer/crd_finalizer.go | 3 --- .../pkg/controller/status/BUILD | 1 - .../pkg/controller/status/naming_controller.go | 3 --- .../apiserver/plugin/pkg/audit/webhook/BUILD | 2 -- .../plugin/pkg/audit/webhook/webhook.go | 18 ------------------ .../pkg/controllers/autoregister/BUILD | 1 - .../autoregister/autoregister_controller.go | 5 ----- .../pkg/controllers/status/BUILD | 1 - .../controllers/status/available_controller.go | 3 --- 10 files changed, 38 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD index 6bf81ab317c87..058f6e2562388 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD @@ -17,7 +17,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go index f73c7db37e9c1..b60900ab1bafb 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go @@ -26,7 +26,6 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/conversion" utilerrors "k8s.io/apimachinery/pkg/util/errors" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" @@ -42,8 +41,6 @@ import ( listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion" ) -var cloner = conversion.NewCloner() - // CRDFinalizer is a controller that finalizes the CRD by deleting all the CRs associated with it. type CRDFinalizer struct { crdClient client.CustomResourceDefinitionsGetter diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD index 3ca71007cba18..2737a2efa49cf 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD @@ -29,7 +29,6 @@ go_library( "//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go index 4789f0acaf834..271d11adf8674 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go @@ -26,7 +26,6 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/labels" utilerrors "k8s.io/apimachinery/pkg/util/errors" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -41,8 +40,6 @@ import ( listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion" ) -var cloner = conversion.NewCloner() - // This controller is reserving names. To avoid conflicts, be sure to run only one instance of the worker at a time. // This could eventually be lifted, but starting simple. type NamingConditionController struct { diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD b/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD index f27eb13cea4f5..fd43d807e7a8c 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD +++ b/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/BUILD @@ -33,8 +33,6 @@ go_library( deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/k8s.io/apiserver/pkg/apis/audit:go_default_library", diff --git a/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/webhook.go b/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/webhook.go index 8d7f6b3a4e795..7dc96cd9b46e1 100644 --- a/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/webhook.go +++ b/staging/src/k8s.io/apiserver/plugin/pkg/audit/webhook/webhook.go @@ -26,8 +26,6 @@ import ( "k8s.io/apimachinery/pkg/apimachinery/announced" "k8s.io/apimachinery/pkg/apimachinery/registered" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/runtime" auditinternal "k8s.io/apiserver/pkg/apis/audit" @@ -147,24 +145,11 @@ func newBatchWebhook(configFile string, groupVersions []schema.GroupVersion) (*b return nil, err } - c := conversion.NewCloner() - for _, f := range metav1.GetGeneratedDeepCopyFuncs() { - if err := c.RegisterGeneratedDeepCopyFunc(f); err != nil { - return nil, fmt.Errorf("registering meta deep copy method: %v", err) - } - } - for _, f := range auditinternal.GetGeneratedDeepCopyFuncs() { - if err := c.RegisterGeneratedDeepCopyFunc(f); err != nil { - return nil, fmt.Errorf("registering audit deep copy method: %v", err) - } - } - return &batchBackend{ w: w, buffer: make(chan *auditinternal.Event, defaultBatchBufferSize), maxBatchSize: defaultBatchMaxSize, maxBatchWait: defaultBatchMaxWait, - cloner: c, shutdownCh: make(chan struct{}), }, nil } @@ -172,9 +157,6 @@ func newBatchWebhook(configFile string, groupVersions []schema.GroupVersion) (*b type batchBackend struct { w *webhook.GenericWebhook - // Cloner is used to deep copy events as they are buffered. - cloner *conversion.Cloner - // Channel to buffer events in memory before sending them on the webhook. buffer chan *auditinternal.Event // Maximum number of events that can be sent at once. diff --git a/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD index 15d2fc9dfaffb..15e5ec214072d 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/BUILD @@ -27,7 +27,6 @@ go_library( deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/autoregister_controller.go b/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/autoregister_controller.go index 7c723c499af7f..4fe8aa6b46f25 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/autoregister_controller.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/controllers/autoregister/autoregister_controller.go @@ -25,7 +25,6 @@ import ( "github.com/golang/glog" apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/conversion" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/cache" @@ -42,10 +41,6 @@ const ( AutoRegisterManagedLabel = "kube-aggregator.kubernetes.io/automanaged" ) -var ( - cloner = conversion.NewCloner() -) - // AutoAPIServiceRegistration is an interface which callers can re-declare locally and properly cast to for // adding and removing APIServices type AutoAPIServiceRegistration interface { diff --git a/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/BUILD b/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/BUILD index a2f239d0ad901..6624253ca11fb 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/BUILD +++ b/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/BUILD @@ -15,7 +15,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", diff --git a/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/available_controller.go b/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/available_controller.go index 7517b40f6bd39..7516749e4af65 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/available_controller.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/controllers/status/available_controller.go @@ -26,7 +26,6 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -43,8 +42,6 @@ import ( "k8s.io/kube-aggregator/pkg/controllers" ) -var cloner = conversion.NewCloner() - type AvailableConditionController struct { apiServiceClient apiregistrationclient.APIServicesGetter From 42c41a07c8da4d6d37996dd1c4060e7077c61e23 Mon Sep 17 00:00:00 2001 From: xilabao Date: Wed, 7 Jun 2017 14:04:17 +0800 Subject: [PATCH 105/403] validate nonResourceURL in create clusterrole --- pkg/kubectl/cmd/create_clusterrole.go | 15 ++++++++ pkg/kubectl/cmd/create_clusterrole_test.go | 42 +++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/pkg/kubectl/cmd/create_clusterrole.go b/pkg/kubectl/cmd/create_clusterrole.go index 9ab572871b729..1a6ba4e6821c2 100644 --- a/pkg/kubectl/cmd/create_clusterrole.go +++ b/pkg/kubectl/cmd/create_clusterrole.go @@ -19,6 +19,7 @@ package cmd import ( "fmt" "io" + "strings" "github.com/spf13/cobra" @@ -133,6 +134,20 @@ func (c *CreateClusterRoleOptions) Validate() error { return fmt.Errorf("invalid verb: '%s' for nonResourceURL", v) } } + + for _, nonResourceURL := range c.NonResourceURLs { + if nonResourceURL == "*" { + continue + } + + if nonResourceURL == "" || !strings.HasPrefix(nonResourceURL, "/") { + return fmt.Errorf("nonResourceURL should start with /") + } + + if strings.ContainsRune(nonResourceURL[:len(nonResourceURL)-1], '*') { + return fmt.Errorf("nonResourceURL only supports wildcard matches when '*' is at the end") + } + } } return nil diff --git a/pkg/kubectl/cmd/create_clusterrole_test.go b/pkg/kubectl/cmd/create_clusterrole_test.go index 4d877307c8b9f..e930c6eacf0e0 100644 --- a/pkg/kubectl/cmd/create_clusterrole_test.go +++ b/pkg/kubectl/cmd/create_clusterrole_test.go @@ -375,6 +375,46 @@ func TestClusterRoleValidate(t *testing.T) { }, expectErr: false, }, + "test-invalid-empty-non-resource-url": { + clusterRoleOptions: &CreateClusterRoleOptions{ + CreateRoleOptions: &CreateRoleOptions{ + Name: "my-clusterrole", + Verbs: []string{"create"}, + }, + NonResourceURLs: []string{""}, + }, + expectErr: true, + }, + "test-invalid-non-resource-url": { + clusterRoleOptions: &CreateClusterRoleOptions{ + CreateRoleOptions: &CreateRoleOptions{ + Name: "my-clusterrole", + Verbs: []string{"create"}, + }, + NonResourceURLs: []string{"logs"}, + }, + expectErr: true, + }, + "test-invalid-non-resource-url-with-*": { + clusterRoleOptions: &CreateClusterRoleOptions{ + CreateRoleOptions: &CreateRoleOptions{ + Name: "my-clusterrole", + Verbs: []string{"create"}, + }, + NonResourceURLs: []string{"/logs/*/"}, + }, + expectErr: true, + }, + "test-invalid-non-resource-url-with-multiple-*": { + clusterRoleOptions: &CreateClusterRoleOptions{ + CreateRoleOptions: &CreateRoleOptions{ + Name: "my-clusterrole", + Verbs: []string{"create"}, + }, + NonResourceURLs: []string{"/logs*/*"}, + }, + expectErr: true, + }, "test-invalid-verb-for-non-resource-url": { clusterRoleOptions: &CreateClusterRoleOptions{ CreateRoleOptions: &CreateRoleOptions{ @@ -397,7 +437,7 @@ func TestClusterRoleValidate(t *testing.T) { }, }, }, - NonResourceURLs: []string{"/logs/"}, + NonResourceURLs: []string{"/logs/", "/logs/*"}, }, expectErr: false, }, From 58669f6f1d0c894c7a1dc8e2805bcde946987dd7 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Mon, 14 Aug 2017 09:49:46 +0800 Subject: [PATCH 106/403] support fieldSelector spec.schedulerName --- pkg/api/v1/conversion.go | 1 + pkg/registry/core/pod/strategy.go | 3 ++- pkg/registry/core/pod/strategy_test.go | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pkg/api/v1/conversion.go b/pkg/api/v1/conversion.go index 72b07cffd58e7..f53f24858a901 100644 --- a/pkg/api/v1/conversion.go +++ b/pkg/api/v1/conversion.go @@ -192,6 +192,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error { "spec.nodeName", "spec.restartPolicy", "spec.serviceAccountName", + "spec.schedulerName", "status.phase", "status.hostIP", "status.podIP": diff --git a/pkg/registry/core/pod/strategy.go b/pkg/registry/core/pod/strategy.go index 9337ef9b9941b..2c6bbf5237630 100644 --- a/pkg/registry/core/pod/strategy.go +++ b/pkg/registry/core/pod/strategy.go @@ -196,9 +196,10 @@ func PodToSelectableFields(pod *api.Pod) fields.Set { // amount of allocations needed to create the fields.Set. If you add any // field here or the number of object-meta related fields changes, this should // be adjusted. - podSpecificFieldsSet := make(fields.Set, 6) + podSpecificFieldsSet := make(fields.Set, 7) podSpecificFieldsSet["spec.nodeName"] = pod.Spec.NodeName podSpecificFieldsSet["spec.restartPolicy"] = string(pod.Spec.RestartPolicy) + podSpecificFieldsSet["spec.schedulerName"] = string(pod.Spec.SchedulerName) podSpecificFieldsSet["status.phase"] = string(pod.Status.Phase) podSpecificFieldsSet["status.podIP"] = string(pod.Status.PodIP) return generic.AddObjectMetaFieldsSet(podSpecificFieldsSet, &pod.ObjectMeta, true) diff --git a/pkg/registry/core/pod/strategy_test.go b/pkg/registry/core/pod/strategy_test.go index e2f34621085d8..4d602cb06569a 100644 --- a/pkg/registry/core/pod/strategy_test.go +++ b/pkg/registry/core/pod/strategy_test.go @@ -71,6 +71,20 @@ func TestMatchPod(t *testing.T) { fieldSelector: fields.ParseSelectorOrDie("spec.restartPolicy=Never"), expectMatch: false, }, + { + in: &api.Pod{ + Spec: api.PodSpec{SchedulerName: "scheduler1"}, + }, + fieldSelector: fields.ParseSelectorOrDie("spec.schedulerName=scheduler1"), + expectMatch: true, + }, + { + in: &api.Pod{ + Spec: api.PodSpec{SchedulerName: "scheduler1"}, + }, + fieldSelector: fields.ParseSelectorOrDie("spec.schedulerName=scheduler2"), + expectMatch: false, + }, { in: &api.Pod{ Status: api.PodStatus{Phase: api.PodRunning}, From b00ec8e46cb9c323d55316f638d853c6d7c8a79e Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Thu, 22 Jun 2017 16:41:34 +0800 Subject: [PATCH 107/403] Cleanup makeEventRecorder function drop KubeletConfiguration arg since it is unused --- cmd/kubelet/app/server.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 69a2a5d8c1ff5..7761b2b76871d 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -205,7 +205,7 @@ func initConfigz(kc *kubeletconfiginternal.KubeletConfiguration) (*configz.Confi } // makeEventRecorder sets up kubeDeps.Recorder if its nil. Its a no-op otherwise. -func makeEventRecorder(s *kubeletconfiginternal.KubeletConfiguration, kubeDeps *kubelet.Dependencies, nodeName types.NodeName) { +func makeEventRecorder(kubeDeps *kubelet.Dependencies, nodeName types.NodeName) { if kubeDeps.Recorder != nil { return } @@ -384,7 +384,7 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies) (err error) { } // Setup event recorder if required. - makeEventRecorder(&s.KubeletConfiguration, kubeDeps, nodeName) + makeEventRecorder(kubeDeps, nodeName) if kubeDeps.ContainerManager == nil { if s.CgroupsPerQOS && s.CgroupRoot == "" { @@ -616,7 +616,7 @@ func RunKubelet(kubeFlags *options.KubeletFlags, kubeCfg *kubeletconfiginternal. return err } // Setup event recorder if required. - makeEventRecorder(kubeCfg, kubeDeps, nodeName) + makeEventRecorder(kubeDeps, nodeName) // TODO(mtaufen): I moved the validation of these fields here, from UnsecuredKubeletConfig, // so that I could remove the associated fields from KubeletConfiginternal. I would From 5fac458f5f3065f563b69dfa8a0c5ff118df5331 Mon Sep 17 00:00:00 2001 From: fabriziopandini Date: Fri, 18 Aug 2017 09:13:49 +0200 Subject: [PATCH 108/403] Main work -- refactor certs phase --- cmd/kubeadm/app/phases/certs/certs.go | 288 +++++++++++++- cmd/kubeadm/app/phases/certs/certs_test.go | 415 ++++++++++++++++++--- cmd/kubeadm/test/certs/util.go | 55 +++ cmd/kubeadm/test/util.go | 11 + 4 files changed, 703 insertions(+), 66 deletions(-) diff --git a/cmd/kubeadm/app/phases/certs/certs.go b/cmd/kubeadm/app/phases/certs/certs.go index 0fc6b5b27fa5c..a6b060a0da2f3 100644 --- a/cmd/kubeadm/app/phases/certs/certs.go +++ b/cmd/kubeadm/app/phases/certs/certs.go @@ -22,14 +22,164 @@ import ( "fmt" "net" - "k8s.io/apimachinery/pkg/util/validation" certutil "k8s.io/client-go/util/cert" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs/pkiutil" "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" + "k8s.io/kubernetes/staging/src/k8s.io/apimachinery/pkg/util/validation" ) +// CreatePKIAssets will create and write to disk all PKI assets necessary to establish the control plane. +// If the PKI assets already exists in the target folder, they are used only if evaluated equal; otherwise an error is returned. +func CreatePKIAssets(cfg *kubeadmapi.MasterConfiguration) error { + + certActions := []func(cfg *kubeadmapi.MasterConfiguration) error{ + CreateCACertAndKeyfiles, + CreateAPIServerCertAndKeyFiles, + CreateAPIServerKubeletClientCertAndKeyFiles, + CreateServiceAccountKeyAndPublicKeyFiles, + CreateFrontProxyCACertAndKeyFiles, + CreateFrontProxyClientCertAndKeyFiles, + } + + for _, action := range certActions { + err := action(cfg) + if err != nil { + return err + } + } + + fmt.Printf("[certificates] Valid certificates and keys now exist in %q\n", cfg.CertificatesDir) + + return nil +} + +// CreateCACertAndKeyfiles create a new self signed CA certificate and key files. +// If the CA certificate and key files already exists in the target folder, they are used only if evaluated equal; otherwise an error is returned. +func CreateCACertAndKeyfiles(cfg *kubeadmapi.MasterConfiguration) error { + + caCert, caKey, err := NewCACertAndKey() + if err != nil { + return err + } + + return writeCertificateAuthorithyFilesIfNotExist( + cfg.CertificatesDir, + kubeadmconstants.CACertAndKeyBaseName, + caCert, + caKey, + ) +} + +// CreateAPIServerCertAndKeyFiles create a new certificate and key files for the apiserver. +// If the apiserver certificate and key files already exists in the target folder, they are used only if evaluated equal; otherwise an error is returned. +// It assumes the cluster CA certificate and key files should exists into the CertificatesDir +func CreateAPIServerCertAndKeyFiles(cfg *kubeadmapi.MasterConfiguration) error { + + caCert, caKey, err := loadCertificateAuthorithy(cfg.CertificatesDir, kubeadmconstants.CACertAndKeyBaseName) + if err != nil { + return err + } + + apiCert, apiKey, err := NewAPIServerCertAndKey(cfg, caCert, caKey) + if err != nil { + return err + } + + return writeCertificateFilesIfNotExist( + cfg.CertificatesDir, + kubeadmconstants.APIServerCertAndKeyBaseName, + caCert, + apiCert, + apiKey, + ) +} + +// CreateAPIServerKubeletClientCertAndKeyFiles create a new CA certificate for kubelets calling apiserver +// If the apiserver-kubelet-client certificate and key files already exists in the target folder, they are used only if evaluated equals; otherwise an error is returned. +// It assumes the cluster CA certificate and key files should exists into the CertificatesDir +func CreateAPIServerKubeletClientCertAndKeyFiles(cfg *kubeadmapi.MasterConfiguration) error { + + caCert, caKey, err := loadCertificateAuthorithy(cfg.CertificatesDir, kubeadmconstants.CACertAndKeyBaseName) + if err != nil { + return err + } + + apiClientCert, apiClientKey, err := NewAPIServerKubeletClientCertAndKey(caCert, caKey) + if err != nil { + return err + } + + return writeCertificateFilesIfNotExist( + cfg.CertificatesDir, + kubeadmconstants.APIServerKubeletClientCertAndKeyBaseName, + caCert, + apiClientCert, + apiClientKey, + ) +} + +// CreateServiceAccountKeyAndPublicKeyFiles create a new public/private key files for signing service account users. +// If the sa public/private key files already exists in the target folder, they are used only if evaluated equals; otherwise an error is returned. +func CreateServiceAccountKeyAndPublicKeyFiles(cfg *kubeadmapi.MasterConfiguration) error { + + saSigningKey, err := NewServiceAccountSigningKey() + if err != nil { + return err + } + + return writeKeyFilesIfNotExist( + cfg.CertificatesDir, + kubeadmconstants.ServiceAccountKeyBaseName, + saSigningKey, + ) +} + +// CreateFrontProxyCACertAndKeyFiles create a self signed front proxy CA certificate and key files. +// Front proxy CA and client certs are used to secure a front proxy authenticator which is used to assert identity +// without the client cert; This is a separte CA, so that front proxy identities cannot hit the API and normal client certs cannot be used +// as front proxies. +// If the front proxy CA certificate and key files already exists in the target folder, they are used only if evaluated equals; otherwise an error is returned. +func CreateFrontProxyCACertAndKeyFiles(cfg *kubeadmapi.MasterConfiguration) error { + + frontProxyCACert, frontProxyCAKey, err := NewFrontProxyCACertAndKey() + if err != nil { + return err + } + + return writeCertificateAuthorithyFilesIfNotExist( + cfg.CertificatesDir, + kubeadmconstants.FrontProxyCACertAndKeyBaseName, + frontProxyCACert, + frontProxyCAKey, + ) +} + +// CreateFrontProxyClientCertAndKeyFiles create a new certificate for proxy server client. +// If the front-proxy-client certificate and key files already exists in the target folder, they are used only if evaluated equals; otherwise an error is returned. +// It assumes the front proxy CAA certificate and key files should exists into the CertificatesDir +func CreateFrontProxyClientCertAndKeyFiles(cfg *kubeadmapi.MasterConfiguration) error { + + frontProxyCACert, frontProxyCAKey, err := loadCertificateAuthorithy(cfg.CertificatesDir, kubeadmconstants.FrontProxyCACertAndKeyBaseName) + if err != nil { + return err + } + + frontProxyClientCert, frontProxyClientKey, err := NewFrontProxyClientCertAndKey(frontProxyCACert, frontProxyCAKey) + if err != nil { + return err + } + + return writeCertificateFilesIfNotExist( + cfg.CertificatesDir, + kubeadmconstants.FrontProxyClientCertAndKeyBaseName, + frontProxyCACert, + frontProxyClientCert, + frontProxyClientKey, + ) +} + // NewCACertAndKey will generate a self signed CA. func NewCACertAndKey() (*x509.Certificate, *rsa.PrivateKey, error) { @@ -91,10 +241,6 @@ func NewServiceAccountSigningKey() (*rsa.PrivateKey, error) { } // NewFrontProxyCACertAndKey generate a self signed front proxy CA. -// Front proxy CA and client certs are used to secure a front proxy authenticator which is used to assert identity -// without the client cert. -// This is a separte CA, so that front proxy identities cannot hit the API and normal client certs cannot be used -// as front proxies. func NewFrontProxyCACertAndKey() (*x509.Certificate, *rsa.PrivateKey, error) { frontProxyCACert, frontProxyCAKey, err := pkiutil.NewCertificateAuthority() @@ -120,6 +266,138 @@ func NewFrontProxyClientCertAndKey(frontProxyCACert *x509.Certificate, frontProx return frontProxyClientCert, frontProxyClientKey, nil } +// loadCertificateAuthorithy loads certificate authorithy +func loadCertificateAuthorithy(pkiDir string, baseName string) (*x509.Certificate, *rsa.PrivateKey, error) { + // Checks if certificate authorithy exists in the PKI directory + if !pkiutil.CertOrKeyExist(pkiDir, baseName) { + return nil, nil, fmt.Errorf("couldn't load %s certificate authorithy from %s", baseName, pkiDir) + } + + // Try to load certificate authorithy .crt and .key from the PKI directory + caCert, caKey, err := pkiutil.TryLoadCertAndKeyFromDisk(pkiDir, baseName) + if err != nil { + return nil, nil, fmt.Errorf("failure loading %s certificate authorithy: %v", baseName, err) + } + + // Make sure the loaded CA cert actually is a CA + if !caCert.IsCA { + return nil, nil, fmt.Errorf("%s certificate is not a certificate authorithy", baseName) + } + + return caCert, caKey, nil +} + +// writeCertificateAuthorithyFilesIfNotExist write a new certificate Authorithy to the given path. +// If there already is a certificate file at the given path; kubeadm tries to load it and check if the values in the +// existing and the expected certificate equals. If they do; kubeadm will just skip writing the file as it's up-to-date, +// otherwise this function returns an error. +func writeCertificateAuthorithyFilesIfNotExist(pkiDir string, baseName string, caCert *x509.Certificate, caKey *rsa.PrivateKey) error { + + // If cert or key exists, we should try to load them + if pkiutil.CertOrKeyExist(pkiDir, baseName) { + + // Try to load .crt and .key from the PKI directory + caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkiDir, baseName) + if err != nil { + return fmt.Errorf("failure loading %s certificate: %v", baseName, err) + } + + // Check if the existing cert is a CA + if !caCert.IsCA { + return fmt.Errorf("certificate %s is not a CA", baseName) + } + + // kubeadm doesn't validate the existing certificate Authorithy more than this; + // Basically, if we find a certificate file with the same path; and it is a CA + // kubeadm thinks those files are equal and doesn't bother writing a new file + fmt.Printf("[certificates] Using the existing %s certificate and key.\n", baseName) + } else { + + // Write .crt and .key files to disk + if err := pkiutil.WriteCertAndKey(pkiDir, baseName, caCert, caKey); err != nil { + return fmt.Errorf("failure while saving %s certificate and key: %v", baseName, err) + } + + fmt.Printf("[certificates] Generated %s certificate and key.\n", baseName) + } + return nil +} + +// writeCertificateFilesIfNotExist write a new certificate to the given path. +// If there already is a certificate file at the given path; kubeadm tries to load it and check if the values in the +// existing and the expected certificate equals. If they do; kubeadm will just skip writing the file as it's up-to-date, +// otherwise this function returns an error. +func writeCertificateFilesIfNotExist(pkiDir string, baseName string, signingCert *x509.Certificate, cert *x509.Certificate, key *rsa.PrivateKey) error { + + // Checks if the signed certificate exists in the PKI directory + if pkiutil.CertOrKeyExist(pkiDir, baseName) { + // Try to load signed certificate .crt and .key from the PKI directory + signedCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkiDir, baseName) + if err != nil { + return fmt.Errorf("failure loading %s certificate: %v", baseName, err) + } + + // Check if the existing cert is signed by the given CA + if err := signedCert.CheckSignatureFrom(signingCert); err != nil { + return fmt.Errorf("certificate %s is not signed by corresponding CA", baseName) + } + + // kubeadm doesn't validate the existing certificate more than this; + // Basically, if we find a certificate file with the same path; and it is signed by + // the expected certificate authorithy, kubeadm thinks those files are equal and + // doesn't bother writing a new file + fmt.Printf("[certificates] Using the existing %s certificate and key.\n", baseName) + } else { + + // Write .crt and .key files to disk + if err := pkiutil.WriteCertAndKey(pkiDir, baseName, cert, key); err != nil { + return fmt.Errorf("failure while saving %s certificate and key: %v", baseName, err) + } + + fmt.Printf("[certificates] Generated %s certificate and key.\n", baseName) + if pkiutil.HasServerAuth(cert) { + fmt.Printf("[certificates] %s serving cert is signed for DNS names %v and IPs %v\n", baseName, cert.DNSNames, cert.IPAddresses) + } + } + + return nil +} + +// writeKeyFilesIfNotExist write a new key to the given path. +// If there already is a key file at the given path; kubeadm tries to load it and check if the values in the +// existing and the expected key equals. If they do; kubeadm will just skip writing the file as it's up-to-date, +// otherwise this function returns an error. +func writeKeyFilesIfNotExist(pkiDir string, baseName string, key *rsa.PrivateKey) error { + + // Checks if the key exists in the PKI directory + if pkiutil.CertOrKeyExist(pkiDir, baseName) { + + // Try to load .key from the PKI directory + _, err := pkiutil.TryLoadKeyFromDisk(pkiDir, baseName) + if err != nil { + return fmt.Errorf("%s key existed but it could not be loaded properly: %v", baseName, err) + } + + // kubeadm doesn't validate the existing certificate key more than this; + // Basically, if we find a key file with the same path kubeadm thinks those files + // are equal and doesn't bother writing a new file + fmt.Printf("[certificates] Using the existing %s key.\n", baseName) + } else { + + // Write .key and .pub files to disk + if err := pkiutil.WriteKey(pkiDir, baseName, key); err != nil { + return fmt.Errorf("failure while saving %s key: %v", baseName, err) + } + + if err := pkiutil.WritePublicKey(pkiDir, baseName, &key.PublicKey); err != nil { + return fmt.Errorf("failure while saving %s public key: %v", baseName, err) + } + fmt.Printf("[certificates] Generated %s key and public key.\n", baseName) + } + + return nil +} + // getAltNames builds an AltNames object for to be used when generating apiserver certificate func getAltNames(cfg *kubeadmapi.MasterConfiguration) (*certutil.AltNames, error) { diff --git a/cmd/kubeadm/app/phases/certs/certs_test.go b/cmd/kubeadm/app/phases/certs/certs_test.go index 7a058373fe6d8..5840e6485243e 100644 --- a/cmd/kubeadm/app/phases/certs/certs_test.go +++ b/cmd/kubeadm/app/phases/certs/certs_test.go @@ -17,21 +17,298 @@ limitations under the License. package certs import ( + "crypto/rsa" "crypto/x509" "net" + "os" "testing" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" - "k8s.io/kubernetes/cmd/kubeadm/app/constants" + kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" + "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs/pkiutil" + + testutil "k8s.io/kubernetes/cmd/kubeadm/test" + certstestutil "k8s.io/kubernetes/cmd/kubeadm/test/certs" ) +func TestWriteCertificateAuthorithyFilesIfNotExist(t *testing.T) { + + setupCert, setupKey, _ := NewCACertAndKey() + caCert, caKey, _ := NewCACertAndKey() + + var tests = []struct { + setupFunc func(pkiDir string) error + expectedError bool + expectedCa *x509.Certificate + }{ + { // ca cert does not exists > ca written + expectedCa: caCert, + }, + { // ca cert exists, is ca > existing ca used + setupFunc: func(pkiDir string) error { + return writeCertificateAuthorithyFilesIfNotExist(pkiDir, "dummy", setupCert, setupKey) + }, + expectedCa: setupCert, + }, + { // some file exists, but it is not a valid ca cert > err + setupFunc: func(pkiDir string) error { + testutil.SetupEmptyFiles(t, pkiDir, "dummy.crt") + return nil + }, + expectedError: true, + }, + { // cert exists, but it is not a ca > err + setupFunc: func(pkiDir string) error { + cert, key, _ := NewFrontProxyClientCertAndKey(setupCert, setupKey) + return writeCertificateFilesIfNotExist(pkiDir, "dummy", setupCert, cert, key) + }, + expectedError: true, + }, + } + + for _, test := range tests { + // Create temp folder for the test case + tmpdir := testutil.SetupTempDir(t) + defer os.RemoveAll(tmpdir) + + // executes setup func (if necessary) + if test.setupFunc != nil { + if err := test.setupFunc(tmpdir); err != nil { + t.Errorf("error executing setupFunc: %v", err) + continue + } + } + + // executes create func + err := writeCertificateAuthorithyFilesIfNotExist(tmpdir, "dummy", caCert, caKey) + + if !test.expectedError && err != nil { + t.Errorf("error writeCertificateAuthorithyFilesIfNotExist failed when not expected to fail: %v", err) + continue + } else if test.expectedError && err == nil { + t.Error("error writeCertificateAuthorithyFilesIfNotExist didn't failed when expected") + continue + } else if test.expectedError { + continue + } + + // asserts expected files are there + testutil.AssertFileExists(t, tmpdir, "dummy.key", "dummy.crt") + + // check created cert + resultingCaCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(tmpdir, "dummy") + if err != nil { + t.Errorf("failure reading created cert: %v", err) + continue + } + if !resultingCaCert.Equal(test.expectedCa) { + t.Error("created ca cert does not match expected ca cert") + } + } +} + +func TestWriteCertificateFilesIfNotExist(t *testing.T) { + + caCert, caKey, _ := NewFrontProxyCACertAndKey() + setupCert, setupKey, _ := NewFrontProxyClientCertAndKey(caCert, caKey) + cert, key, _ := NewFrontProxyClientCertAndKey(caCert, caKey) + + var tests = []struct { + setupFunc func(pkiDir string) error + expectedError bool + expectedCert *x509.Certificate + }{ + { // cert does not exists > cert written + expectedCert: cert, + }, + { // cert exists, is signed by the same ca > existing cert used + setupFunc: func(pkiDir string) error { + return writeCertificateFilesIfNotExist(pkiDir, "dummy", caCert, setupCert, setupKey) + }, + expectedCert: setupCert, + }, + { // some file exists, but it is not a valid cert > err + setupFunc: func(pkiDir string) error { + testutil.SetupEmptyFiles(t, pkiDir, "dummy.crt") + return nil + }, + expectedError: true, + }, + { // cert exists, is signed by another ca > err + setupFunc: func(pkiDir string) error { + anotherCaCert, anotherCaKey, _ := NewFrontProxyCACertAndKey() + anotherCert, anotherKey, _ := NewFrontProxyClientCertAndKey(anotherCaCert, anotherCaKey) + + return writeCertificateFilesIfNotExist(pkiDir, "dummy", anotherCaCert, anotherCert, anotherKey) + }, + expectedError: true, + }, + } + + for _, test := range tests { + // Create temp folder for the test case + tmpdir := testutil.SetupTempDir(t) + defer os.RemoveAll(tmpdir) + + // executes setup func (if necessary) + if test.setupFunc != nil { + if err := test.setupFunc(tmpdir); err != nil { + t.Errorf("error executing setupFunc: %v", err) + continue + } + } + + // executes create func + err := writeCertificateFilesIfNotExist(tmpdir, "dummy", caCert, cert, key) + + if !test.expectedError && err != nil { + t.Errorf("error writeCertificateFilesIfNotExist failed when not expected to fail: %v", err) + continue + } else if test.expectedError && err == nil { + t.Error("error writeCertificateFilesIfNotExist didn't failed when expected") + continue + } else if test.expectedError { + continue + } + + // asserts expected files are there + testutil.AssertFileExists(t, tmpdir, "dummy.key", "dummy.crt") + + // check created cert + resultingCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(tmpdir, "dummy") + if err != nil { + t.Errorf("failure reading created cert: %v", err) + continue + } + if !resultingCert.Equal(test.expectedCert) { + t.Error("created cert does not match expected cert") + } + } +} + +func TestWriteKeyFilesIfNotExist(t *testing.T) { + + setupKey, _ := NewServiceAccountSigningKey() + key, _ := NewServiceAccountSigningKey() + + var tests = []struct { + setupFunc func(pkiDir string) error + expectedError bool + expectedKey *rsa.PrivateKey + }{ + { // key does not exists > key written + expectedKey: key, + }, + { // key exists > existing key used + setupFunc: func(pkiDir string) error { + return writeKeyFilesIfNotExist(pkiDir, "dummy", setupKey) + }, + expectedKey: setupKey, + }, + { // some file exists, but it is not a valid key > err + setupFunc: func(pkiDir string) error { + testutil.SetupEmptyFiles(t, pkiDir, "dummy.key") + return nil + }, + expectedError: true, + }, + } + + for _, test := range tests { + // Create temp folder for the test case + tmpdir := testutil.SetupTempDir(t) + defer os.RemoveAll(tmpdir) + + // executes setup func (if necessary) + if test.setupFunc != nil { + if err := test.setupFunc(tmpdir); err != nil { + t.Errorf("error executing setupFunc: %v", err) + continue + } + } + + // executes create func + err := writeKeyFilesIfNotExist(tmpdir, "dummy", key) + + if !test.expectedError && err != nil { + t.Errorf("error writeKeyFilesIfNotExist failed when not expected to fail: %v", err) + continue + } else if test.expectedError && err == nil { + t.Error("error writeKeyFilesIfNotExist didn't failed when expected") + continue + } else if test.expectedError { + continue + } + + // asserts expected files are there + testutil.AssertFileExists(t, tmpdir, "dummy.key", "dummy.pub") + + // check created key + resultingKey, err := pkiutil.TryLoadKeyFromDisk(tmpdir, "dummy") + if err != nil { + t.Errorf("failure reading created key: %v", err) + continue + } + + //TODO: check if there is a better method to compare keys + if resultingKey.D == key.D { + t.Error("created key does not match expected key") + } + } +} + +func TestGetAltNames(t *testing.T) { + hostname := "valid-hostname" + advertiseIP := "1.2.3.4" + cfg := &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{AdvertiseAddress: advertiseIP}, + Networking: kubeadmapi.Networking{ServiceSubnet: "10.96.0.0/12", DNSDomain: "cluster.local"}, + NodeName: hostname, + } + + altNames, err := getAltNames(cfg) + if err != nil { + t.Fatalf("failed calling getAltNames: %v", err) + } + + expectedDNSNames := []string{hostname, "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster.local"} + for _, DNSName := range expectedDNSNames { + found := false + for _, val := range altNames.DNSNames { + if val == DNSName { + found = true + break + } + } + + if !found { + t.Errorf("altNames does not contain DNSName %s", DNSName) + } + } + + expectedIPAddresses := []string{"10.96.0.1", advertiseIP} + for _, IPAddress := range expectedIPAddresses { + found := false + for _, val := range altNames.IPs { + if val.Equal(net.ParseIP(IPAddress)) { + found = true + break + } + } + + if !found { + t.Errorf("altNames does not contain IPAddress %s", IPAddress) + } + } +} + func TestNewCACertAndKey(t *testing.T) { caCert, _, err := NewCACertAndKey() if err != nil { t.Fatalf("failed call NewCACertAndKey: %v", err) } - assertIsCa(t, caCert) + certstestutil.AssertCertificateIsCa(t, caCert) } func TestNewAPIServerCertAndKey(t *testing.T) { @@ -51,15 +328,10 @@ func TestNewAPIServerCertAndKey(t *testing.T) { t.Fatalf("failed creation of cert and key: %v", err) } - assertIsSignedByCa(t, apiServerCert, caCert) - assertHasServerAuth(t, apiServerCert) - - for _, DNSName := range []string{hostname, "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster.local"} { - assertHasDNSNames(t, apiServerCert, DNSName) - } - for _, IPAddress := range []string{"10.96.0.1", addr} { - assertHasIPAddresses(t, apiServerCert, net.ParseIP(IPAddress)) - } + certstestutil.AssertCertificateIsSignedByCa(t, apiServerCert, caCert) + certstestutil.AssertCertificateHasServerAuthUsage(t, apiServerCert) + certstestutil.AssertCertificateHasDNSNames(t, apiServerCert, hostname, "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster.local") + certstestutil.AssertCertificateHasIPAddresses(t, apiServerCert, net.ParseIP("10.96.0.1"), net.ParseIP(addr)) } } @@ -71,9 +343,9 @@ func TestNewAPIServerKubeletClientCertAndKey(t *testing.T) { t.Fatalf("failed creation of cert and key: %v", err) } - assertIsSignedByCa(t, apiClientCert, caCert) - assertHasClientAuth(t, apiClientCert) - assertHasOrganization(t, apiClientCert, constants.MastersGroup) + certstestutil.AssertCertificateIsSignedByCa(t, apiClientCert, caCert) + certstestutil.AssertCertificateHasClientAuthUsage(t, apiClientCert) + certstestutil.AssertCertificateHasOrganizations(t, apiClientCert, kubeadmconstants.MastersGroup) } func TestNewNewServiceAccountSigningKey(t *testing.T) { @@ -94,7 +366,7 @@ func TestNewFrontProxyCACertAndKey(t *testing.T) { t.Fatalf("failed creation of cert and key: %v", err) } - assertIsCa(t, frontProxyCACert) + certstestutil.AssertCertificateIsCa(t, frontProxyCACert) } func TestNewFrontProxyClientCertAndKey(t *testing.T) { @@ -105,63 +377,84 @@ func TestNewFrontProxyClientCertAndKey(t *testing.T) { t.Fatalf("failed creation of cert and key: %v", err) } - assertIsSignedByCa(t, frontProxyClientCert, frontProxyCACert) - assertHasClientAuth(t, frontProxyClientCert) + certstestutil.AssertCertificateIsSignedByCa(t, frontProxyClientCert, frontProxyCACert) + certstestutil.AssertCertificateHasClientAuthUsage(t, frontProxyClientCert) } -func assertIsCa(t *testing.T, cert *x509.Certificate) { - if !cert.IsCA { - t.Error("cert is not a valida CA") - } -} +func TestCreateCertificateFilesMethods(t *testing.T) { -func assertIsSignedByCa(t *testing.T, cert *x509.Certificate, ca *x509.Certificate) { - if err := cert.CheckSignatureFrom(ca); err != nil { - t.Error("cert is not signed by ca") + var tests = []struct { + setupFunc func(cfg *kubeadmapi.MasterConfiguration) error + createFunc func(cfg *kubeadmapi.MasterConfiguration) error + expectedFiles []string + }{ + { + createFunc: CreatePKIAssets, + expectedFiles: []string{ + kubeadmconstants.CACertName, kubeadmconstants.CAKeyName, + kubeadmconstants.APIServerCertName, kubeadmconstants.APIServerKeyName, + kubeadmconstants.APIServerKubeletClientCertName, kubeadmconstants.APIServerKubeletClientKeyName, + kubeadmconstants.ServiceAccountPrivateKeyName, kubeadmconstants.ServiceAccountPublicKeyName, + kubeadmconstants.FrontProxyCACertName, kubeadmconstants.FrontProxyCAKeyName, + kubeadmconstants.FrontProxyClientCertName, kubeadmconstants.FrontProxyClientKeyName, + }, + }, + { + createFunc: CreateCACertAndKeyfiles, + expectedFiles: []string{kubeadmconstants.CACertName, kubeadmconstants.CAKeyName}, + }, + { + setupFunc: CreateCACertAndKeyfiles, + createFunc: CreateAPIServerCertAndKeyFiles, + expectedFiles: []string{kubeadmconstants.APIServerCertName, kubeadmconstants.APIServerKeyName}, + }, + { + setupFunc: CreateCACertAndKeyfiles, + createFunc: CreateAPIServerKubeletClientCertAndKeyFiles, + expectedFiles: []string{kubeadmconstants.APIServerKubeletClientCertName, kubeadmconstants.APIServerKubeletClientKeyName}, + }, + { + createFunc: CreateServiceAccountKeyAndPublicKeyFiles, + expectedFiles: []string{kubeadmconstants.ServiceAccountPrivateKeyName, kubeadmconstants.ServiceAccountPublicKeyName}, + }, + { + createFunc: CreateFrontProxyCACertAndKeyFiles, + expectedFiles: []string{kubeadmconstants.FrontProxyCACertName, kubeadmconstants.FrontProxyCAKeyName}, + }, + { + setupFunc: CreateFrontProxyCACertAndKeyFiles, + createFunc: CreateFrontProxyClientCertAndKeyFiles, + expectedFiles: []string{kubeadmconstants.FrontProxyCACertName, kubeadmconstants.FrontProxyCAKeyName}, + }, } -} -func assertHasClientAuth(t *testing.T, cert *x509.Certificate) { - for i := range cert.ExtKeyUsage { - if cert.ExtKeyUsage[i] == x509.ExtKeyUsageClientAuth { - return - } - } - t.Error("cert is not a ClientAuth") -} + for _, test := range tests { + // Create temp folder for the test case + tmpdir := testutil.SetupTempDir(t) + defer os.RemoveAll(tmpdir) -func assertHasServerAuth(t *testing.T, cert *x509.Certificate) { - for i := range cert.ExtKeyUsage { - if cert.ExtKeyUsage[i] == x509.ExtKeyUsageServerAuth { - return + cfg := &kubeadmapi.MasterConfiguration{ + API: kubeadmapi.API{AdvertiseAddress: "1.2.3.4"}, + Networking: kubeadmapi.Networking{ServiceSubnet: "10.96.0.0/12", DNSDomain: "cluster.local"}, + NodeName: "valid-hostname", + CertificatesDir: tmpdir, } - } - t.Error("cert is not a ServerAuth") -} -func assertHasOrganization(t *testing.T, cert *x509.Certificate, OU string) { - for i := range cert.Subject.Organization { - if cert.Subject.Organization[i] == OU { - return + // executes setup func (if necessary) + if test.setupFunc != nil { + if err := test.setupFunc(cfg); err != nil { + t.Errorf("error executing setupFunc: %v", err) + continue + } } - } - t.Errorf("cert does not contain OU %s", OU) -} -func assertHasDNSNames(t *testing.T, cert *x509.Certificate, DNSName string) { - for i := range cert.DNSNames { - if cert.DNSNames[i] == DNSName { - return + // executes create func + if err := test.createFunc(cfg); err != nil { + t.Errorf("error executing createFunc: %v", err) + continue } - } - t.Errorf("cert does not contain DNSName %s", DNSName) -} -func assertHasIPAddresses(t *testing.T, cert *x509.Certificate, IPAddress net.IP) { - for i := range cert.IPAddresses { - if cert.IPAddresses[i].Equal(IPAddress) { - return - } + // asserts expected files are there + testutil.AssertFileExists(t, tmpdir, test.expectedFiles...) } - t.Errorf("cert does not contain IPAddress %s", IPAddress) } diff --git a/cmd/kubeadm/test/certs/util.go b/cmd/kubeadm/test/certs/util.go index 30ef1d303ae66..4f3235010cf03 100644 --- a/cmd/kubeadm/test/certs/util.go +++ b/cmd/kubeadm/test/certs/util.go @@ -19,6 +19,7 @@ package certs import ( "crypto/rsa" "crypto/x509" + "net" "testing" "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs/pkiutil" @@ -35,6 +36,13 @@ func SetupCertificateAuthorithy(t *testing.T) (*x509.Certificate, *rsa.PrivateKe return caCert, caKey } +// AssertCertificateIsCa is a utility function for kubeadm testing that asserts if a given certificate is a CA +func AssertCertificateIsCa(t *testing.T, cert *x509.Certificate) { + if !cert.IsCA { + t.Error("cert is not a valida CA") + } +} + // AssertCertificateIsSignedByCa is a utility function for kubeadm testing that asserts if a given certificate is signed // by the expected CA func AssertCertificateIsSignedByCa(t *testing.T, cert *x509.Certificate, signingCa *x509.Certificate) { @@ -77,3 +85,50 @@ func AssertCertificateHasClientAuthUsage(t *testing.T, cert *x509.Certificate) { } t.Error("cert has not ClientAuth usage as expected") } + +// AssertCertificateHasServerAuthUsage is a utility function for kubeadm testing that asserts if a given certificate has +// the expected ExtKeyUsageServerAuth +func AssertCertificateHasServerAuthUsage(t *testing.T, cert *x509.Certificate) { + for i := range cert.ExtKeyUsage { + if cert.ExtKeyUsage[i] == x509.ExtKeyUsageServerAuth { + return + } + } + t.Error("cert is not a ServerAuth") +} + +// AssertCertificateHasDNSNames is a utility function for kubeadm testing that asserts if a given certificate has +// the expected DNSNames +func AssertCertificateHasDNSNames(t *testing.T, cert *x509.Certificate, DNSNames ...string) { + for _, DNSName := range DNSNames { + found := false + for _, val := range cert.DNSNames { + if val == DNSName { + found = true + break + } + } + + if !found { + t.Errorf("cert does not contain DNSName %s", DNSName) + } + } +} + +// AssertCertificateHasIPAddresses is a utility function for kubeadm testing that asserts if a given certificate has +// the expected IPAddresses +func AssertCertificateHasIPAddresses(t *testing.T, cert *x509.Certificate, IPAddresses ...net.IP) { + for _, IPAddress := range IPAddresses { + found := false + for _, val := range cert.IPAddresses { + if val.Equal(IPAddress) { + found = true + break + } + } + + if !found { + t.Errorf("cert does not contain IPAddress %s", IPAddress) + } + } +} diff --git a/cmd/kubeadm/test/util.go b/cmd/kubeadm/test/util.go index fe8ea38f781db..916e72bf512ea 100644 --- a/cmd/kubeadm/test/util.go +++ b/cmd/kubeadm/test/util.go @@ -76,6 +76,17 @@ func SetupMasterConfigurationFile(t *testing.T, tmpdir string, cfg *kubeadmapi.M return cfgPath } +// SetupEmptyFiles is a utility function for kubeadm testing that creates one or more empty files (touch) +func SetupEmptyFiles(t *testing.T, tmpdir string, fileNames ...string) { + for _, fileName := range fileNames { + newFile, err := os.Create(filepath.Join(tmpdir, fileName)) + if err != nil { + t.Fatalf("Error creating file %s in %s: %v", fileName, tmpdir, err) + } + newFile.Close() + } +} + // SetupPkiDirWithCertificateAuthorithy is a utility function for kubeadm testing that creates a // CertificateAuthorithy cert/key pair into /pki subfolder of a given temporary directory. // The funtion returns the path of the created pki. From 00fa026b9d9c00076d1a64ed6c688355aac40615 Mon Sep 17 00:00:00 2001 From: fabriziopandini Date: Fri, 18 Aug 2017 09:14:11 +0200 Subject: [PATCH 109/403] Main work -- cleanup certs CLI command --- cmd/kubeadm/app/cmd/init.go | 4 +- cmd/kubeadm/app/cmd/phases/certs.go | 251 ++--------------------- cmd/kubeadm/app/cmd/phases/certs_test.go | 106 +++++++--- 3 files changed, 92 insertions(+), 269 deletions(-) diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index f1f881273970a..39f1c8b7adba2 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -31,13 +31,13 @@ import ( kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" "k8s.io/kubernetes/cmd/kubeadm/app/cmd/features" - cmdphases "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" dnsaddonphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/dns" proxyaddonphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/proxy" apiconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/apiconfig" clusterinfophase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo" nodebootstraptokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node" + certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs" "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs/pkiutil" controlplanephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane" etcdphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/etcd" @@ -234,7 +234,7 @@ func (i *Init) Run(out io.Writer) error { } // PHASE 1: Generate certificates - if err := cmdphases.CreatePKIAssets(i.cfg); err != nil { + if err := certsphase.CreatePKIAssets(i.cfg); err != nil { return err } diff --git a/cmd/kubeadm/app/cmd/phases/certs.go b/cmd/kubeadm/app/cmd/phases/certs.go index aa8c23ce1be67..6e4344d74cd25 100644 --- a/cmd/kubeadm/app/cmd/phases/certs.go +++ b/cmd/kubeadm/app/cmd/phases/certs.go @@ -17,17 +17,12 @@ limitations under the License. package phases import ( - "crypto/rsa" - "crypto/x509" - "fmt" - "github.com/spf13/cobra" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" - kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" - certphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs" - "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs/pkiutil" + "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" + certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" "k8s.io/kubernetes/pkg/api" @@ -64,37 +59,37 @@ func getCertsSubCommands() []*cobra.Command { { use: "all", short: "Generate all PKI assets necessary to establish the control plane", - cmdFunc: CreatePKIAssets, + cmdFunc: certsphase.CreatePKIAssets, }, { use: "ca", short: "Generate CA certificate and key for a Kubernetes cluster.", - cmdFunc: createOrUseCACertAndKey, + cmdFunc: certsphase.CreateCACertAndKeyfiles, }, { use: "apiserver", short: "Generate API Server serving certificate and key.", - cmdFunc: createOrUseAPIServerCertAndKey, + cmdFunc: certsphase.CreateAPIServerCertAndKeyFiles, }, { use: "apiserver-kubelet-client", short: "Generate a client certificate for the API Server to connect to the kubelets securely.", - cmdFunc: createOrUseAPIServerKubeletClientCertAndKey, + cmdFunc: certsphase.CreateAPIServerKubeletClientCertAndKeyFiles, }, { use: "sa", short: "Generate a private key for signing service account tokens along with its public key.", - cmdFunc: createOrUseServiceAccountKeyAndPublicKey, + cmdFunc: certsphase.CreateServiceAccountKeyAndPublicKeyFiles, }, { use: "front-proxy-ca", short: "Generate front proxy CA certificate and key for a Kubernetes cluster.", - cmdFunc: createOrUseFrontProxyCACertAndKey, + cmdFunc: certsphase.CreateFrontProxyCACertAndKeyFiles, }, { use: "front-proxy-client", short: "Generate front proxy CA client certificate and key for a Kubernetes cluster.", - cmdFunc: createOrUseFrontProxyClientCertAndKey, + cmdFunc: certsphase.CreateFrontProxyClientCertAndKeyFiles, }, } @@ -131,6 +126,9 @@ func runCmdFunc(cmdFunc func(cfg *kubeadmapi.MasterConfiguration) error, cfgPath // are shared between sub commands and gets access to current value e.g. flags value. return func(cmd *cobra.Command, args []string) { + if err := validation.ValidateMixedArguments(cmd.Flags()); err != nil { + kubeadmutil.CheckErr(err) + } // This call returns the ready-to-use configuration based on the configuration file that might or might not exist and the default cfg populated by flags internalcfg, err := configutil.ConfigFileAndDefaultsToInternalConfig(*cfgPath, cfg) @@ -141,228 +139,3 @@ func runCmdFunc(cmdFunc func(cfg *kubeadmapi.MasterConfiguration) error, cfgPath kubeadmutil.CheckErr(err) } } - -// CreatePKIAssets will create and write to disk all PKI assets necessary to establish the control plane. -// Please note that this action is a bulk action calling all the atomic certphase actions -func CreatePKIAssets(cfg *kubeadmapi.MasterConfiguration) error { - - certActions := []func(cfg *kubeadmapi.MasterConfiguration) error{ - createOrUseCACertAndKey, - createOrUseAPIServerCertAndKey, - createOrUseAPIServerKubeletClientCertAndKey, - createOrUseServiceAccountKeyAndPublicKey, - createOrUseFrontProxyCACertAndKey, - createOrUseFrontProxyClientCertAndKey, - } - - for _, action := range certActions { - err := action(cfg) - if err != nil { - return err - } - } - - fmt.Printf("[certificates] Valid certificates and keys now exist in %q\n", cfg.CertificatesDir) - - return nil -} - -// createOrUseCACertAndKey create a new self signed CA, or use the existing one. -func createOrUseCACertAndKey(cfg *kubeadmapi.MasterConfiguration) error { - - return createOrUseCertificateAuthorithy( - cfg.CertificatesDir, - kubeadmconstants.CACertAndKeyBaseName, - "CA", - certphase.NewCACertAndKey, - ) -} - -// createOrUseAPIServerCertAndKey create a new CA certificate for apiserver, or use the existing one. -// It assumes the CA certificates should exists into the CertificatesDir -func createOrUseAPIServerCertAndKey(cfg *kubeadmapi.MasterConfiguration) error { - - return createOrUseSignedCertificate( - cfg.CertificatesDir, - kubeadmconstants.CACertAndKeyBaseName, - kubeadmconstants.APIServerCertAndKeyBaseName, - "API server", - func(caCert *x509.Certificate, caKey *rsa.PrivateKey) (*x509.Certificate, *rsa.PrivateKey, error) { - return certphase.NewAPIServerCertAndKey(cfg, caCert, caKey) - }, - ) -} - -// create a new CA certificate for kubelets calling apiserver, or use the existing one -// It assumes the CA certificates should exists into the CertificatesDir -func createOrUseAPIServerKubeletClientCertAndKey(cfg *kubeadmapi.MasterConfiguration) error { - - return createOrUseSignedCertificate( - cfg.CertificatesDir, - kubeadmconstants.CACertAndKeyBaseName, - kubeadmconstants.APIServerKubeletClientCertAndKeyBaseName, - "API server kubelet client", - certphase.NewAPIServerKubeletClientCertAndKey, - ) -} - -// createOrUseServiceAccountKeyAndPublicKey create a new public/private key pairs for signing service account user, or use the existing one. -func createOrUseServiceAccountKeyAndPublicKey(cfg *kubeadmapi.MasterConfiguration) error { - - return createOrUseKeyAndPublicKey( - cfg.CertificatesDir, - kubeadmconstants.ServiceAccountKeyBaseName, - "service account", - certphase.NewServiceAccountSigningKey, - ) -} - -// createOrUseFrontProxyCACertAndKey create a new self signed front proxy CA, or use the existing one. -func createOrUseFrontProxyCACertAndKey(cfg *kubeadmapi.MasterConfiguration) error { - - return createOrUseCertificateAuthorithy( - cfg.CertificatesDir, - kubeadmconstants.FrontProxyCACertAndKeyBaseName, - "front-proxy CA", - certphase.NewFrontProxyCACertAndKey, - ) -} - -// createOrUseFrontProxyClientCertAndKey create a new certificate for proxy server client, or use the existing one. -// It assumes the front proxy CA certificates should exists into the CertificatesDir -func createOrUseFrontProxyClientCertAndKey(cfg *kubeadmapi.MasterConfiguration) error { - - return createOrUseSignedCertificate( - cfg.CertificatesDir, - kubeadmconstants.FrontProxyCACertAndKeyBaseName, - kubeadmconstants.FrontProxyClientCertAndKeyBaseName, - "front-proxy client", - certphase.NewFrontProxyClientCertAndKey, - ) -} - -// createOrUseCertificateAuthorithy is a generic function that will create a new certificate Authorithy using the given newFunc, -// assign file names according to the given baseName, or use the existing one already present in pkiDir. -func createOrUseCertificateAuthorithy(pkiDir string, baseName string, UXName string, newFunc func() (*x509.Certificate, *rsa.PrivateKey, error)) error { - - // If cert or key exists, we should try to load them - if pkiutil.CertOrKeyExist(pkiDir, baseName) { - - // Try to load .crt and .key from the PKI directory - caCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkiDir, baseName) - if err != nil { - return fmt.Errorf("failure loading %s certificate: %v", UXName, err) - } - - // Check if the existing cert is a CA - if !caCert.IsCA { - return fmt.Errorf("certificate %s is not a CA", UXName) - } - - fmt.Printf("[certificates] Using the existing %s certificate and key.\n", UXName) - } else { - // The certificate and the key did NOT exist, let's generate them now - caCert, caKey, err := newFunc() - if err != nil { - return fmt.Errorf("failure while generating %s certificate and key: %v", UXName, err) - } - - // Write .crt and .key files to disk - if err = pkiutil.WriteCertAndKey(pkiDir, baseName, caCert, caKey); err != nil { - return fmt.Errorf("failure while saving %s certificate and key: %v", UXName, err) - } - - fmt.Printf("[certificates] Generated %s certificate and key.\n", UXName) - } - return nil -} - -// createOrUseSignedCertificate is a generic function that will create a new signed certificate using the given newFunc, -// assign file names according to the given baseName, or use the existing one already present in pkiDir. -func createOrUseSignedCertificate(pkiDir string, CABaseName string, baseName string, UXName string, newFunc func(*x509.Certificate, *rsa.PrivateKey) (*x509.Certificate, *rsa.PrivateKey, error)) error { - - // Checks if certificate authorithy exists in the PKI directory - if !pkiutil.CertOrKeyExist(pkiDir, CABaseName) { - return fmt.Errorf("couldn't load certificate authorithy for %s from certificate dir", UXName) - } - - // Try to load certificate authorithy .crt and .key from the PKI directory - caCert, caKey, err := pkiutil.TryLoadCertAndKeyFromDisk(pkiDir, CABaseName) - if err != nil { - return fmt.Errorf("failure loading certificate authorithy for %s: %v", UXName, err) - } - - // Make sure the loaded CA cert actually is a CA - if !caCert.IsCA { - return fmt.Errorf("certificate authorithy for %s is not a CA", UXName) - } - - // Checks if the signed certificate exists in the PKI directory - if pkiutil.CertOrKeyExist(pkiDir, baseName) { - // Try to load signed certificate .crt and .key from the PKI directory - signedCert, _, err := pkiutil.TryLoadCertAndKeyFromDisk(pkiDir, baseName) - if err != nil { - return fmt.Errorf("failure loading %s certificate: %v", UXName, err) - } - - // Check if the existing cert is signed by the given CA - if err := signedCert.CheckSignatureFrom(caCert); err != nil { - return fmt.Errorf("certificate %s is not signed by corresponding CA", UXName) - } - - fmt.Printf("[certificates] Using the existing %s certificate and key.\n", UXName) - } else { - // The certificate and the key did NOT exist, let's generate them now - signedCert, signedKey, err := newFunc(caCert, caKey) - if err != nil { - return fmt.Errorf("failure while generating %s key and certificate: %v", UXName, err) - } - - // Write .crt and .key files to disk - if err = pkiutil.WriteCertAndKey(pkiDir, baseName, signedCert, signedKey); err != nil { - return fmt.Errorf("failure while saving %s certificate and key: %v", UXName, err) - } - - fmt.Printf("[certificates] Generated %s certificate and key.\n", UXName) - if pkiutil.HasServerAuth(signedCert) { - fmt.Printf("[certificates] %s serving cert is signed for DNS names %v and IPs %v\n", UXName, signedCert.DNSNames, signedCert.IPAddresses) - } - } - - return nil -} - -// createOrUseKeyAndPublicKey is a generic function that will create a new public/private key pairs using the given newFunc, -// assign file names according to the given baseName, or use the existing one already present in pkiDir. -func createOrUseKeyAndPublicKey(pkiDir string, baseName string, UXName string, newFunc func() (*rsa.PrivateKey, error)) error { - - // Checks if the key exists in the PKI directory - if pkiutil.CertOrKeyExist(pkiDir, baseName) { - - // Try to load .key from the PKI directory - _, err := pkiutil.TryLoadKeyFromDisk(pkiDir, baseName) - if err != nil { - return fmt.Errorf("%s key existed but they could not be loaded properly: %v", UXName, err) - } - - fmt.Printf("[certificates] Using the existing %s key.\n", UXName) - } else { - // The key does NOT exist, let's generate it now - key, err := newFunc() - if err != nil { - return fmt.Errorf("failure while generating %s key: %v", UXName, err) - } - - // Write .key and .pub files to disk - if err = pkiutil.WriteKey(pkiDir, baseName, key); err != nil { - return fmt.Errorf("failure while saving %s key: %v", UXName, err) - } - - if err = pkiutil.WritePublicKey(pkiDir, baseName, &key.PublicKey); err != nil { - return fmt.Errorf("failure while saving %s public key: %v", UXName, err) - } - fmt.Printf("[certificates] Generated %s key and public key.\n", UXName) - } - - return nil -} diff --git a/cmd/kubeadm/app/cmd/phases/certs_test.go b/cmd/kubeadm/app/cmd/phases/certs_test.go index 8cb5e7414e200..abf67f6992302 100644 --- a/cmd/kubeadm/app/cmd/phases/certs_test.go +++ b/cmd/kubeadm/app/cmd/phases/certs_test.go @@ -33,7 +33,61 @@ import ( cmdtestutil "k8s.io/kubernetes/cmd/kubeadm/test/cmd" ) -func TestSubCmdCertsCreateFiles(t *testing.T) { +func TestCertsSubCommandsHasFlags(t *testing.T) { + + subCmds := getCertsSubCommands() + + commonFlags := []string{ + "cert-dir", + "config", + } + + var tests = []struct { + command string + additionalFlags []string + }{ + { + command: "all", + additionalFlags: []string{ + "apiserver-advertise-address", + "apiserver-cert-extra-sans", + "service-cidr", + "service-dns-domain", + }, + }, + { + command: "ca", + }, + { + command: "apiserver", + additionalFlags: []string{ + "apiserver-advertise-address", + "apiserver-cert-extra-sans", + "service-cidr", + "service-dns-domain", + }, + }, + { + command: "apiserver-kubelet-client", + }, + { + command: "sa", + }, + { + command: "front-proxy-ca", + }, + { + command: "front-proxy-client", + }, + } + + for _, test := range tests { + expectedFlags := append(commonFlags, test.additionalFlags...) + cmdtestutil.AssertSubCommandHasFlags(t, subCmds, test.command, expectedFlags...) + } +} + +func TestSubCmdCertsCreateFilesWithFlags(t *testing.T) { subCmds := getCertsSubCommands() @@ -53,25 +107,13 @@ func TestSubCmdCertsCreateFiles(t *testing.T) { }, }, { - subCmds: []string{"ca"}, - expectedFiles: []string{kubeadmconstants.CACertName, kubeadmconstants.CAKeyName}, - }, - { - subCmds: []string{"ca", "apiserver"}, - expectedFiles: []string{kubeadmconstants.CACertName, kubeadmconstants.CAKeyName, kubeadmconstants.APIServerCertName, kubeadmconstants.APIServerKeyName}, - }, - { - subCmds: []string{"ca", "apiserver-kubelet-client"}, - expectedFiles: []string{kubeadmconstants.CACertName, kubeadmconstants.CAKeyName, kubeadmconstants.APIServerKubeletClientCertName, kubeadmconstants.APIServerKubeletClientKeyName}, + subCmds: []string{"ca", "apiserver", "apiserver-kubelet-client"}, + expectedFiles: []string{kubeadmconstants.CACertName, kubeadmconstants.CAKeyName, kubeadmconstants.APIServerCertName, kubeadmconstants.APIServerKeyName, kubeadmconstants.APIServerKubeletClientCertName, kubeadmconstants.APIServerKubeletClientKeyName}, }, { subCmds: []string{"sa"}, expectedFiles: []string{kubeadmconstants.ServiceAccountPrivateKeyName, kubeadmconstants.ServiceAccountPublicKeyName}, }, - { - subCmds: []string{"front-proxy-ca"}, - expectedFiles: []string{kubeadmconstants.FrontProxyCACertName, kubeadmconstants.FrontProxyCAKeyName}, - }, { subCmds: []string{"front-proxy-ca", "front-proxy-client"}, expectedFiles: []string{kubeadmconstants.FrontProxyCACertName, kubeadmconstants.FrontProxyCAKeyName, kubeadmconstants.FrontProxyClientCertName, kubeadmconstants.FrontProxyClientKeyName}, @@ -94,7 +136,7 @@ func TestSubCmdCertsCreateFiles(t *testing.T) { } } -func TestSubCmdApiServerFlags(t *testing.T) { +func TestSubCmdCertsApiServerForwardsFlags(t *testing.T) { subCmds := getCertsSubCommands() @@ -116,6 +158,7 @@ func TestSubCmdApiServerFlags(t *testing.T) { } cmdtestutil.RunSubCommand(t, subCmds, "apiserver", apiserverFlags...) + // asserts created cert has values from CLI flags APIserverCert, err := pkiutil.TryLoadCertFromDisk(tmpdir, kubeadmconstants.APIServerCertAndKeyBaseName) if err != nil { t.Fatalf("Error loading API server certificate: %v", err) @@ -135,29 +178,36 @@ func TestSubCmdApiServerFlags(t *testing.T) { } } -func TestSubCmdCertsReadsConfig(t *testing.T) { +func TestSubCmdCertsCreateFilesWithConfigFile(t *testing.T) { subCmds := getCertsSubCommands() var tests = []struct { - subCmds []string - expectedFileCount int + subCmds []string + expectedFiles []string }{ { - subCmds: []string{"sa"}, - expectedFileCount: 2, + subCmds: []string{"all"}, + expectedFiles: []string{ + kubeadmconstants.CACertName, kubeadmconstants.CAKeyName, + kubeadmconstants.APIServerCertName, kubeadmconstants.APIServerKeyName, + kubeadmconstants.APIServerKubeletClientCertName, kubeadmconstants.APIServerKubeletClientKeyName, + kubeadmconstants.ServiceAccountPrivateKeyName, kubeadmconstants.ServiceAccountPublicKeyName, + kubeadmconstants.FrontProxyCACertName, kubeadmconstants.FrontProxyCAKeyName, + kubeadmconstants.FrontProxyClientCertName, kubeadmconstants.FrontProxyClientKeyName, + }, }, { - subCmds: []string{"front-proxy-ca", "front-proxy-client"}, - expectedFileCount: 4, + subCmds: []string{"ca", "apiserver", "apiserver-kubelet-client"}, + expectedFiles: []string{kubeadmconstants.CACertName, kubeadmconstants.CAKeyName, kubeadmconstants.APIServerCertName, kubeadmconstants.APIServerKeyName, kubeadmconstants.APIServerKubeletClientCertName, kubeadmconstants.APIServerKubeletClientKeyName}, }, { - subCmds: []string{"ca", "apiserver", "apiserver-kubelet-client"}, - expectedFileCount: 6, + subCmds: []string{"front-proxy-ca", "front-proxy-client"}, + expectedFiles: []string{kubeadmconstants.FrontProxyCACertName, kubeadmconstants.FrontProxyCAKeyName, kubeadmconstants.FrontProxyClientCertName, kubeadmconstants.FrontProxyClientKeyName}, }, { - subCmds: []string{"all"}, - expectedFileCount: 12, + subCmds: []string{"sa"}, + expectedFiles: []string{kubeadmconstants.ServiceAccountPrivateKeyName, kubeadmconstants.ServiceAccountPublicKeyName}, }, } @@ -182,6 +232,6 @@ func TestSubCmdCertsReadsConfig(t *testing.T) { } // verify expected files are there - testutil.AssertFilesCount(t, tmpdir, test.expectedFileCount) + testutil.AssertFileExists(t, tmpdir, test.expectedFiles...) } } From c6bb8fbb4aaa8981da8863b88e88ba7aed3ff3d0 Mon Sep 17 00:00:00 2001 From: fabriziopandini Date: Fri, 18 Aug 2017 09:14:28 +0200 Subject: [PATCH 110/403] Autogenerated bazel files --- cmd/kubeadm/app/cmd/BUILD | 1 + cmd/kubeadm/app/cmd/phases/BUILD | 1 - cmd/kubeadm/app/phases/certs/BUILD | 5 ++++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cmd/kubeadm/app/cmd/BUILD b/cmd/kubeadm/app/cmd/BUILD index e80b1b37996be..6b4f40779f18c 100644 --- a/cmd/kubeadm/app/cmd/BUILD +++ b/cmd/kubeadm/app/cmd/BUILD @@ -30,6 +30,7 @@ go_library( "//cmd/kubeadm/app/phases/apiconfig:go_default_library", "//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:go_default_library", "//cmd/kubeadm/app/phases/bootstraptoken/node:go_default_library", + "//cmd/kubeadm/app/phases/certs:go_default_library", "//cmd/kubeadm/app/phases/certs/pkiutil:go_default_library", "//cmd/kubeadm/app/phases/controlplane:go_default_library", "//cmd/kubeadm/app/phases/etcd:go_default_library", diff --git a/cmd/kubeadm/app/cmd/phases/BUILD b/cmd/kubeadm/app/cmd/phases/BUILD index 8f683403e7e67..787750a032295 100644 --- a/cmd/kubeadm/app/cmd/phases/BUILD +++ b/cmd/kubeadm/app/cmd/phases/BUILD @@ -29,7 +29,6 @@ go_library( "//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:go_default_library", "//cmd/kubeadm/app/phases/bootstraptoken/node:go_default_library", "//cmd/kubeadm/app/phases/certs:go_default_library", - "//cmd/kubeadm/app/phases/certs/pkiutil:go_default_library", "//cmd/kubeadm/app/phases/controlplane:go_default_library", "//cmd/kubeadm/app/phases/etcd:go_default_library", "//cmd/kubeadm/app/phases/kubeconfig:go_default_library", diff --git a/cmd/kubeadm/app/phases/certs/BUILD b/cmd/kubeadm/app/phases/certs/BUILD index f144a02481a6a..16e44355db911 100644 --- a/cmd/kubeadm/app/phases/certs/BUILD +++ b/cmd/kubeadm/app/phases/certs/BUILD @@ -13,6 +13,9 @@ go_test( deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", + "//cmd/kubeadm/app/phases/certs/pkiutil:go_default_library", + "//cmd/kubeadm/test:go_default_library", + "//cmd/kubeadm/test/certs:go_default_library", ], ) @@ -27,7 +30,7 @@ go_library( "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/phases/certs/pkiutil:go_default_library", "//pkg/registry/core/service/ipallocator:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//vendor/k8s.io/client-go/util/cert:go_default_library", ], ) From f2ec610455f3756afebfcbd99c108abc86a5015d Mon Sep 17 00:00:00 2001 From: Cao Shufeng Date: Fri, 18 Aug 2017 16:28:30 +0800 Subject: [PATCH 111/403] [advanced audit api] fuzz Event with random value This is an error import by me: https://github.com/kubernetes/kubernetes/pull/49115 We need to fuzz other parts of Event with random value, otherwise this round trip test will not make too much sense. @sttts @ericchiang --- staging/src/k8s.io/apiserver/pkg/apis/audit/fuzzer/fuzzer.go | 1 + 1 file changed, 1 insertion(+) diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/fuzzer/fuzzer.go b/staging/src/k8s.io/apiserver/pkg/apis/audit/fuzzer/fuzzer.go index 24b06367350aa..1ec4464c5b341 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/fuzzer/fuzzer.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/fuzzer/fuzzer.go @@ -28,6 +28,7 @@ import ( func Funcs(codecs runtimeserializer.CodecFactory) []interface{} { return []interface{}{ func(e *audit.Event, c fuzz.Continue) { + c.FuzzNoCustom(e) switch c.RandBool() { case true: e.RequestObject = nil From 6fcde5694f13bda03622dddd48c6b4e14a324c53 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Fri, 18 Aug 2017 18:41:56 +0800 Subject: [PATCH 112/403] Fix zsh completion for kubeadm --- cmd/kubeadm/app/cmd/completion.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/cmd/kubeadm/app/cmd/completion.go b/cmd/kubeadm/app/cmd/completion.go index e56b674a89746..9035d80f41ddd 100644 --- a/cmd/kubeadm/app/cmd/completion.go +++ b/cmd/kubeadm/app/cmd/completion.go @@ -186,14 +186,6 @@ __kubeadm_compopt() { true # don't do anything. Not supported by bashcompinit in zsh } -__kubeadm_declare() { - if [ "$1" == "-F" ]; then - whence -w "$@" - else - builtin declare "$@" - fi -} - __kubeadm_ltrim_colon_completions() { if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then @@ -280,7 +272,7 @@ __kubeadm_convert_bash_to_zsh() { -e "s/${LWORD}__ltrim_colon_completions${RWORD}/__kubeadm_ltrim_colon_completions/g" \ -e "s/${LWORD}compgen${RWORD}/__kubeadm_compgen/g" \ -e "s/${LWORD}compopt${RWORD}/__kubeadm_compopt/g" \ - -e "s/${LWORD}declare${RWORD}/__kubeadm_declare/g" \ + -e "s/${LWORD}declare${RWORD}/builtin declare/g" \ -e "s/\\\$(type${RWORD}/\$(__kubeadm_type/g" \ <<'BASH_COMPLETION_EOF' ` From cd23c5d1b07557ada969f549930e8497aa90340d Mon Sep 17 00:00:00 2001 From: Mik Vyatskov Date: Fri, 18 Aug 2017 13:18:49 +0200 Subject: [PATCH 113/403] Stackdriver Logging e2e: Explicitly check for docker and kubelet logs presence --- .../logging/stackdrvier/basic.go | 20 ++++++++++++++----- .../logging/stackdrvier/utils.go | 16 +++++++++------ .../instrumentation/logging/utils/types.go | 1 + .../e2e/instrumentation/logging/utils/wait.go | 13 ++++++++++++ 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/test/e2e/instrumentation/logging/stackdrvier/basic.go b/test/e2e/instrumentation/logging/stackdrvier/basic.go index 74b1a7a0d418d..8e21b07c0e916 100644 --- a/test/e2e/instrumentation/logging/stackdrvier/basic.go +++ b/test/e2e/instrumentation/logging/stackdrvier/basic.go @@ -142,11 +142,21 @@ var _ = instrumentation.SIGDescribe("Cluster level logging implemented by Stackd ginkgo.It("should ingest system logs from all nodes", func() { withLogProviderForScope(f, systemScope, func(p *sdLogProvider) { - ginkgo.By("Waiting for some system logs to ingest") - nodeIds := utils.GetNodeIds(f.ClientSet) - c := utils.NewLogChecker(p, utils.UntilFirstEntry, utils.JustTimeout, nodeIds...) - err := utils.WaitForLogs(c, ingestionInterval, ingestionTimeout) - framework.ExpectNoError(err) + ginkgo.By("Waiting for some kubelet logs to be ingested from each node", func() { + nodeIds := utils.GetNodeIds(f.ClientSet) + log := fmt.Sprintf("projects/%s/logs/kubelet", framework.TestContext.CloudConfig.ProjectID) + c := utils.NewLogChecker(p, utils.UntilFirstEntryFromLog(log), utils.JustTimeout, nodeIds...) + err := utils.WaitForLogs(c, ingestionInterval, ingestionTimeout) + framework.ExpectNoError(err) + }) + + ginkgo.By("Waiting for some docker logs to be ingested from each node", func() { + nodeIds := utils.GetNodeIds(f.ClientSet) + log := fmt.Sprintf("projects/%s/logs/docker", framework.TestContext.CloudConfig.ProjectID) + c := utils.NewLogChecker(p, utils.UntilFirstEntryFromLog(log), utils.JustTimeout, nodeIds...) + err := utils.WaitForLogs(c, ingestionInterval, ingestionTimeout) + framework.ExpectNoError(err) + }) }) }) }) diff --git a/test/e2e/instrumentation/logging/stackdrvier/utils.go b/test/e2e/instrumentation/logging/stackdrvier/utils.go index 4c28bccbee88b..1b4c9ca424cab 100644 --- a/test/e2e/instrumentation/logging/stackdrvier/utils.go +++ b/test/e2e/instrumentation/logging/stackdrvier/utils.go @@ -315,23 +315,27 @@ func (p *sdLogProvider) tryGetName(sdLogEntry sd.LogEntry) (string, bool) { return "", false } -func convertLogEntry(sdLogEntry sd.LogEntry) (utils.LogEntry, error) { +func convertLogEntry(sdLogEntry sd.LogEntry) (entry utils.LogEntry, err error) { + entry = utils.LogEntry{LogName: sdLogEntry.LogName} if sdLogEntry.TextPayload != "" { - return utils.LogEntry{TextPayload: sdLogEntry.TextPayload}, nil + entry.TextPayload = sdLogEntry.TextPayload + return } bytes, err := sdLogEntry.JsonPayload.MarshalJSON() if err != nil { - return utils.LogEntry{}, fmt.Errorf("Failed to get jsonPayload from LogEntry %v", sdLogEntry) + err = fmt.Errorf("Failed to get jsonPayload from LogEntry %v", sdLogEntry) + return } var jsonObject map[string]interface{} err = json.Unmarshal(bytes, &jsonObject) if err != nil { - return utils.LogEntry{}, - fmt.Errorf("Failed to deserialize jsonPayload as json object %s", string(bytes[:])) + err = fmt.Errorf("Failed to deserialize jsonPayload as json object %s", string(bytes[:])) + return } - return utils.LogEntry{JSONPayload: jsonObject}, nil + entry.JSONPayload = jsonObject + return } func pullAndAck(service *pubsub.Service, subs *pubsub.Subscription) ([]*pubsub.ReceivedMessage, error) { diff --git a/test/e2e/instrumentation/logging/utils/types.go b/test/e2e/instrumentation/logging/utils/types.go index 39825cdc66d76..d9a278dd7f184 100644 --- a/test/e2e/instrumentation/logging/utils/types.go +++ b/test/e2e/instrumentation/logging/utils/types.go @@ -30,6 +30,7 @@ var ( // LogEntry represents a log entry, received from the logging backend. type LogEntry struct { + LogName string TextPayload string JSONPayload map[string]interface{} } diff --git a/test/e2e/instrumentation/logging/utils/wait.go b/test/e2e/instrumentation/logging/utils/wait.go index 9d1c13c581039..0535b27302f10 100644 --- a/test/e2e/instrumentation/logging/utils/wait.go +++ b/test/e2e/instrumentation/logging/utils/wait.go @@ -42,6 +42,19 @@ var UntilFirstEntry IngestionPred = func(_ string, entries []LogEntry) (bool, er return len(entries) > 0, nil } +// UntilFirstEntryFromLog is a IngestionPred that checks that at least one +// entry from the log with a given name was ingested. +func UntilFirstEntryFromLog(log string) IngestionPred { + return func(_ string, entries []LogEntry) (bool, error) { + for _, e := range entries { + if e.LogName == log { + return true, nil + } + } + return false, nil + } +} + // TimeoutFun is a function that is called when the waiting times out. type TimeoutFun func([]string, []bool) error From 53348c0531d398ad1208644432c812653e81b058 Mon Sep 17 00:00:00 2001 From: David Eads Date: Fri, 18 Aug 2017 08:46:32 -0400 Subject: [PATCH 114/403] add diff details to pod validation error --- pkg/api/validation/BUILD | 1 + pkg/api/validation/validation.go | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/api/validation/BUILD b/pkg/api/validation/BUILD index c0b1cbd948503..8107e7f45d183 100644 --- a/pkg/api/validation/BUILD +++ b/pkg/api/validation/BUILD @@ -32,6 +32,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 1384830ec39f3..85b6b82e167f2 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -38,6 +38,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" unversionedvalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" @@ -2734,8 +2735,10 @@ func ValidatePodUpdate(newPod, oldPod *api.Pod) field.ErrorList { allErrs = append(allErrs, validateOnlyAddedTolerations(newPod.Spec.Tolerations, oldPod.Spec.Tolerations, specPath.Child("tolerations"))...) if !apiequality.Semantic.DeepEqual(mungedPod.Spec, oldPod.Spec) { + // This diff isn't perfect, but it's a helluva lot better an "I'm not going to tell you what the difference is". //TODO: Pinpoint the specific field that causes the invalid error after we have strategic merge diff - allErrs = append(allErrs, field.Forbidden(specPath, "pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)")) + specDiff := diff.ObjectDiff(mungedPod.Spec, oldPod.Spec) + allErrs = append(allErrs, field.Forbidden(specPath, fmt.Sprintf("pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)\n%v", specDiff))) } return allErrs From 0bf84aa182449ab51cbb5f819da3fbcad19690a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Fri, 18 Aug 2017 16:05:12 +0300 Subject: [PATCH 115/403] kubeadm: Adds dry-run support for kubeadm using the '--dry-run' option --- .../app/apis/kubeadm/validation/validation.go | 2 +- cmd/kubeadm/app/cmd/init.go | 44 +++- cmd/kubeadm/app/cmd/phases/markmaster.go | 4 - cmd/kubeadm/app/cmd/token.go | 23 +- .../app/phases/markmaster/markmaster.go | 2 + cmd/kubeadm/app/util/apiclient/BUILD | 30 +++ .../app/util/apiclient/clientbacked_dryrun.go | 139 ++++++++++ .../app/util/apiclient/dryrunclient.go | 237 ++++++++++++++++++ .../app/util/apiclient/dryrunclient_test.go | 100 ++++++++ cmd/kubeadm/app/util/apiclient/init_dryrun.go | 162 ++++++++++++ .../app/util/apiclient/init_dryrun_test.go | 126 ++++++++++ .../src/k8s.io/client-go/testing/actions.go | 11 + 12 files changed, 863 insertions(+), 17 deletions(-) create mode 100644 cmd/kubeadm/app/util/apiclient/clientbacked_dryrun.go create mode 100644 cmd/kubeadm/app/util/apiclient/dryrunclient.go create mode 100644 cmd/kubeadm/app/util/apiclient/dryrunclient_test.go create mode 100644 cmd/kubeadm/app/util/apiclient/init_dryrun.go create mode 100644 cmd/kubeadm/app/util/apiclient/init_dryrun_test.go diff --git a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go index 0bc24c57398c0..b91c0849fe5fe 100644 --- a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go +++ b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go @@ -284,7 +284,7 @@ func ValidateMixedArguments(flag *pflag.FlagSet) error { mixedInvalidFlags := []string{} flag.Visit(func(f *pflag.Flag) { - if f.Name == "config" || strings.HasPrefix(f.Name, "skip-") { + if f.Name == "config" || strings.HasPrefix(f.Name, "skip-") || f.Name == "dry-run" { // "--skip-*" flags can be set with --config return } diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index f1f881273970a..94d3fb4a0b4da 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -20,6 +20,7 @@ import ( "fmt" "io" "io/ioutil" + "os" "text/template" "time" @@ -27,6 +28,7 @@ import ( "github.com/spf13/cobra" "k8s.io/apimachinery/pkg/runtime" + clientset "k8s.io/client-go/kubernetes" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" @@ -85,6 +87,7 @@ func NewCmdInit(out io.Writer) *cobra.Command { var cfgPath string var skipPreFlight bool var skipTokenPrint bool + var dryRun bool cmd := &cobra.Command{ Use: "init", Short: "Run this in order to set up the Kubernetes master", @@ -93,7 +96,7 @@ func NewCmdInit(out io.Writer) *cobra.Command { internalcfg := &kubeadmapi.MasterConfiguration{} api.Scheme.Convert(cfg, internalcfg, nil) - i, err := NewInit(cfgPath, internalcfg, skipPreFlight, skipTokenPrint) + i, err := NewInit(cfgPath, internalcfg, skipPreFlight, skipTokenPrint, dryRun) kubeadmutil.CheckErr(err) kubeadmutil.CheckErr(i.Validate(cmd)) @@ -155,6 +158,11 @@ func NewCmdInit(out io.Writer) *cobra.Command { &skipTokenPrint, "skip-token-print", skipTokenPrint, "Skip printing of the default bootstrap token generated by 'kubeadm init'", ) + // Note: All flags that are not bound to the cfg object should be whitelisted in cmd/kubeadm/app/apis/kubeadm/validation/validation.go + cmd.PersistentFlags().BoolVar( + &dryRun, "dry-run", dryRun, + "Don't apply any changes; just output what would be done", + ) cmd.PersistentFlags().StringVar( &cfg.Token, "token", cfg.Token, @@ -167,7 +175,7 @@ func NewCmdInit(out io.Writer) *cobra.Command { return cmd } -func NewInit(cfgPath string, cfg *kubeadmapi.MasterConfiguration, skipPreFlight, skipTokenPrint bool) (*Init, error) { +func NewInit(cfgPath string, cfg *kubeadmapi.MasterConfiguration, skipPreFlight, skipTokenPrint, dryRun bool) (*Init, error) { fmt.Println("[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.") @@ -209,12 +217,13 @@ func NewInit(cfgPath string, cfg *kubeadmapi.MasterConfiguration, skipPreFlight, fmt.Println("[preflight] Skipping pre-flight checks") } - return &Init{cfg: cfg, skipTokenPrint: skipTokenPrint}, nil + return &Init{cfg: cfg, skipTokenPrint: skipTokenPrint, dryRun: dryRun}, nil } type Init struct { cfg *kubeadmapi.MasterConfiguration skipTokenPrint bool + dryRun bool } // Validate validates configuration passed to "kubeadm init" @@ -255,16 +264,11 @@ func (i *Init) Run(out io.Writer) error { } } - client, err := kubeconfigutil.ClientSetFromFile(kubeadmconstants.GetAdminKubeConfigPath()) + client, err := createClientsetAndOptionallyWaitForReady(i.cfg, i.dryRun) if err != nil { return err } - fmt.Printf("[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory %q\n", kubeadmconstants.GetStaticPodDirectory()) - if err := apiclient.WaitForAPI(client, 30*time.Minute); err != nil { - return err - } - // PHASE 4: Mark the master with the right label/taint if err := markmasterphase.MarkMaster(client, i.cfg.NodeName); err != nil { return err @@ -348,3 +352,25 @@ func (i *Init) Run(out io.Writer) error { return initDoneTempl.Execute(out, ctx) } + +func createClientsetAndOptionallyWaitForReady(cfg *kubeadmapi.MasterConfiguration, dryRun bool) (clientset.Interface, error) { + if dryRun { + // If we're dry-running; we should create a faked client that answers some GETs in order to be able to do the full init flow and just logs the rest of requests + dryRunGetter := apiclient.NewInitDryRunGetter(cfg.NodeName, cfg.Networking.ServiceSubnet) + return apiclient.NewDryRunClient(dryRunGetter, os.Stdout), nil + } + + // If we're acting for real,we should create a connection to the API server and wait for it to come up + client, err := kubeconfigutil.ClientSetFromFile(kubeadmconstants.GetAdminKubeConfigPath()) + if err != nil { + return nil, err + } + + fmt.Printf("[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory %q\n", kubeadmconstants.GetStaticPodDirectory()) + // TODO: Adjust this timeout or start polling the kubelet API + // TODO: Make this timeout more realistic when we do create some more complex logic about the interaction with the kubelet + if err := apiclient.WaitForAPI(client, 30*time.Minute); err != nil { + return nil, err + } + return client, nil +} diff --git a/cmd/kubeadm/app/cmd/phases/markmaster.go b/cmd/kubeadm/app/cmd/phases/markmaster.go index 3cdd00c8d60f0..5c4e91e2b0c86 100644 --- a/cmd/kubeadm/app/cmd/phases/markmaster.go +++ b/cmd/kubeadm/app/cmd/phases/markmaster.go @@ -17,8 +17,6 @@ limitations under the License. package phases import ( - "fmt" - "github.com/spf13/cobra" markmasterphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/markmaster" @@ -41,8 +39,6 @@ func NewCmdMarkMaster() *cobra.Command { kubeadmutil.CheckErr(err) nodeName := args[0] - fmt.Printf("[markmaster] Will mark node %s as master by adding a label and a taint\n", nodeName) - return markmasterphase.MarkMaster(client, nodeName) }, } diff --git a/cmd/kubeadm/app/cmd/token.go b/cmd/kubeadm/app/cmd/token.go index 730356605bb6b..78a581bf8107a 100644 --- a/cmd/kubeadm/app/cmd/token.go +++ b/cmd/kubeadm/app/cmd/token.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "io" + "os" "sort" "strings" "text/tabwriter" @@ -36,6 +37,7 @@ import ( kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" tokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" + "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" tokenutil "k8s.io/kubernetes/cmd/kubeadm/app/util/token" "k8s.io/kubernetes/pkg/api" @@ -46,6 +48,7 @@ import ( func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { var kubeConfigFile string + var dryRun bool tokenCmd := &cobra.Command{ Use: "token", Short: "Manage bootstrap tokens.", @@ -86,6 +89,8 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { tokenCmd.PersistentFlags().StringVar(&kubeConfigFile, "kubeconfig", "/etc/kubernetes/admin.conf", "The KubeConfig file to use for talking to the cluster") + tokenCmd.PersistentFlags().BoolVar(&dryRun, + "dry-run", dryRun, "Whether to enable dry-run mode or not") var usages []string var tokenDuration time.Duration @@ -106,7 +111,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { if len(args) != 0 { token = args[0] } - client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) + client, err := getClientset(kubeConfigFile, dryRun) kubeadmutil.CheckErr(err) // TODO: remove this warning in 1.9 @@ -136,7 +141,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { This command will list all Bootstrap Tokens for you. `), Run: func(tokenCmd *cobra.Command, args []string) { - client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) + client, err := getClientset(kubeConfigFile, dryRun) kubeadmutil.CheckErr(err) err = RunListTokens(out, errW, client) @@ -158,7 +163,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { if len(args) < 1 { kubeadmutil.CheckErr(fmt.Errorf("missing subcommand; 'token delete' is missing token of form [%q]", tokenutil.TokenIDRegexpString)) } - client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) + client, err := getClientset(kubeConfigFile, dryRun) kubeadmutil.CheckErr(err) err = RunDeleteToken(out, client, args[0]) @@ -338,3 +343,15 @@ func getSecretString(secret *v1.Secret, key string) string { } return "" } + +func getClientset(file string, dryRun bool) (clientset.Interface, error) { + if dryRun { + dryRunGetter, err := apiclient.NewClientBackedDryRunGetterFromKubeconfig(file) + if err != nil { + return nil, err + } + return apiclient.NewDryRunClient(dryRunGetter, os.Stdout), nil + } + client, err := kubeconfigutil.ClientSetFromFile(file) + return client, err +} diff --git a/cmd/kubeadm/app/phases/markmaster/markmaster.go b/cmd/kubeadm/app/phases/markmaster/markmaster.go index 79e817ffc0ba1..9917f08a92b9a 100644 --- a/cmd/kubeadm/app/phases/markmaster/markmaster.go +++ b/cmd/kubeadm/app/phases/markmaster/markmaster.go @@ -34,6 +34,8 @@ import ( // MarkMaster taints the master and sets the master label func MarkMaster(client clientset.Interface, masterName string) error { + fmt.Printf("[markmaster] Will mark node %s as master by adding a label and a taint\n", masterName) + // Loop on every falsy return. Return with an error if raised. Exit successfully if true is returned. return wait.Poll(kubeadmconstants.APICallRetryInterval, kubeadmconstants.MarkMasterTimeout, func() (bool, error) { // First get the node object diff --git a/cmd/kubeadm/app/util/apiclient/BUILD b/cmd/kubeadm/app/util/apiclient/BUILD index 02286772b76b4..d4cfb392fdb18 100644 --- a/cmd/kubeadm/app/util/apiclient/BUILD +++ b/cmd/kubeadm/app/util/apiclient/BUILD @@ -3,23 +3,37 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( name = "go_default_library", srcs = [ + "clientbacked_dryrun.go", + "dryrunclient.go", "idempotency.go", + "init_dryrun.go", "wait.go", ], deps = [ "//cmd/kubeadm/app/constants:go_default_library", + "//pkg/registry/core/service/ipallocator:go_default_library", + "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//vendor/k8s.io/client-go/dynamic:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//vendor/k8s.io/client-go/rest:go_default_library", + "//vendor/k8s.io/client-go/testing:go_default_library", + "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", ], ) @@ -35,3 +49,19 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = [ + "dryrunclient_test.go", + "init_dryrun_test.go", + ], + library = ":go_default_library", + deps = [ + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/k8s.io/client-go/testing:go_default_library", + ], +) diff --git a/cmd/kubeadm/app/util/apiclient/clientbacked_dryrun.go b/cmd/kubeadm/app/util/apiclient/clientbacked_dryrun.go new file mode 100644 index 0000000000000..6d9266276e95b --- /dev/null +++ b/cmd/kubeadm/app/util/apiclient/clientbacked_dryrun.go @@ -0,0 +1,139 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apiclient + +import ( + "encoding/json" + "fmt" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + kuberuntime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/dynamic" + clientsetscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + core "k8s.io/client-go/testing" + "k8s.io/client-go/tools/clientcmd" +) + +// ClientBackedDryRunGetter implements the DryRunGetter interface for use in NewDryRunClient() and proxies all GET and LIST requests to the backing API server reachable via rest.Config +type ClientBackedDryRunGetter struct { + baseConfig *rest.Config + dynClientPool dynamic.ClientPool +} + +// InitDryRunGetter should implement the DryRunGetter interface +var _ DryRunGetter = &ClientBackedDryRunGetter{} + +// NewClientBackedDryRunGetter creates a new ClientBackedDryRunGetter instance based on the rest.Config object +func NewClientBackedDryRunGetter(config *rest.Config) *ClientBackedDryRunGetter { + return &ClientBackedDryRunGetter{ + baseConfig: config, + dynClientPool: dynamic.NewDynamicClientPool(config), + } +} + +// NewClientBackedDryRunGetterFromKubeconfig creates a new ClientBackedDryRunGetter instance from the given KubeConfig file +func NewClientBackedDryRunGetterFromKubeconfig(file string) (*ClientBackedDryRunGetter, error) { + config, err := clientcmd.LoadFromFile(file) + if err != nil { + return nil, fmt.Errorf("failed to load kubeconfig: %v", err) + } + clientConfig, err := clientcmd.NewDefaultClientConfig(*config, &clientcmd.ConfigOverrides{}).ClientConfig() + if err != nil { + return nil, fmt.Errorf("failed to create API client configuration from kubeconfig: %v", err) + } + return NewClientBackedDryRunGetter(clientConfig), nil +} + +// HandleGetAction handles GET actions to the dryrun clientset this interface supports +func (clg *ClientBackedDryRunGetter) HandleGetAction(action core.GetAction) (bool, runtime.Object, error) { + rc, err := clg.actionToResourceClient(action) + if err != nil { + return true, nil, err + } + + unversionedObj, err := rc.Get(action.GetName(), metav1.GetOptions{}) + // If the unversioned object does not have .apiVersion; the inner object is probably nil + if len(unversionedObj.GetAPIVersion()) == 0 { + return true, nil, apierrors.NewNotFound(action.GetResource().GroupResource(), action.GetName()) + } + newObj, err := decodeUnversionedIntoAPIObject(action, unversionedObj) + if err != nil { + fmt.Printf("error after decode: %v %v\n", unversionedObj, err) + return true, nil, err + } + return true, newObj, err +} + +// HandleListAction handles LIST actions to the dryrun clientset this interface supports +func (clg *ClientBackedDryRunGetter) HandleListAction(action core.ListAction) (bool, runtime.Object, error) { + rc, err := clg.actionToResourceClient(action) + if err != nil { + return true, nil, err + } + + listOpts := metav1.ListOptions{ + LabelSelector: action.GetListRestrictions().Labels.String(), + FieldSelector: action.GetListRestrictions().Fields.String(), + } + + unversionedList, err := rc.List(listOpts) + // If the runtime.Object here is nil, we should return successfully with no result + if unversionedList == nil { + return true, unversionedList, nil + } + newObj, err := decodeUnversionedIntoAPIObject(action, unversionedList) + if err != nil { + fmt.Printf("error after decode: %v %v\n", unversionedList, err) + return true, nil, err + } + return true, newObj, err +} + +// actionToResourceClient returns the ResourceInterface for the given action +// First; the function gets the right API group interface from the resource type. The API group struct behind the interface +// returned may be cached in the dynamic client pool. Then, an APIResource object is constructed so that it can be passed to +// dynamic.Interface's Resource() function, which will give us the final ResourceInterface to query +func (clg *ClientBackedDryRunGetter) actionToResourceClient(action core.Action) (dynamic.ResourceInterface, error) { + dynIface, err := clg.dynClientPool.ClientForGroupVersionResource(action.GetResource()) + if err != nil { + return nil, err + } + + apiResource := &metav1.APIResource{ + Name: action.GetResource().Resource, + Namespaced: action.GetNamespace() != "", + } + + return dynIface.Resource(apiResource, action.GetNamespace()), nil +} + +// decodeUnversionedIntoAPIObject converts the *unversioned.Unversioned object returned from the dynamic client +// to bytes; and then decodes it back _to an external api version (k8s.io/api vs k8s.io/kubernetes/pkg/api*)_ using the normal API machinery +func decodeUnversionedIntoAPIObject(action core.Action, unversionedObj runtime.Object) (runtime.Object, error) { + objBytes, err := json.Marshal(unversionedObj) + if err != nil { + return nil, err + } + newObj, err := kuberuntime.Decode(clientsetscheme.Codecs.UniversalDecoder(action.GetResource().GroupVersion()), objBytes) + if err != nil { + return nil, err + } + return newObj, nil +} diff --git a/cmd/kubeadm/app/util/apiclient/dryrunclient.go b/cmd/kubeadm/app/util/apiclient/dryrunclient.go new file mode 100644 index 0000000000000..c306a9c4740a8 --- /dev/null +++ b/cmd/kubeadm/app/util/apiclient/dryrunclient.go @@ -0,0 +1,237 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apiclient + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" + + "github.com/ghodss/yaml" + "k8s.io/apimachinery/pkg/runtime" + clientset "k8s.io/client-go/kubernetes" + fakeclientset "k8s.io/client-go/kubernetes/fake" + core "k8s.io/client-go/testing" +) + +// DryRunGetter is an interface that must be supplied to the NewDryRunClient function in order to contstruct a fully functional fake dryrun clientset +type DryRunGetter interface { + HandleGetAction(core.GetAction) (bool, runtime.Object, error) + HandleListAction(core.ListAction) (bool, runtime.Object, error) +} + +// MarshalFunc takes care of converting any object to a byte array for displaying the object to the user +type MarshalFunc func(runtime.Object) ([]byte, error) + +// DefaultMarshalFunc is the default MarshalFunc used; uses YAML to print objects to the user +func DefaultMarshalFunc(obj runtime.Object) ([]byte, error) { + b, err := yaml.Marshal(obj) + return b, err +} + +// DryRunClientOptions specifies options to pass to NewDryRunClientWithOpts in order to get a dryrun clientset +type DryRunClientOptions struct { + Writer io.Writer + Getter DryRunGetter + PrependReactors []core.Reactor + AppendReactors []core.Reactor + MarshalFunc MarshalFunc + PrintGETAndLIST bool +} + +// actionWithName is the generic interface for an action that has a name associated with it +// This just makes it easier to catch all actions that has a name; instead of hard-coding all request that has it associated +type actionWithName interface { + core.Action + GetName() string +} + +// actionWithObject is the generic interface for an action that has an object associated with it +// This just makes it easier to catch all actions that has an object; instead of hard-coding all request that has it associated +type actionWithObject interface { + core.Action + GetObject() runtime.Object +} + +// NewDryRunClient is a wrapper for NewDryRunClientWithOpts using some default values +func NewDryRunClient(drg DryRunGetter, w io.Writer) clientset.Interface { + return NewDryRunClientWithOpts(DryRunClientOptions{ + Writer: w, + Getter: drg, + PrependReactors: []core.Reactor{}, + AppendReactors: []core.Reactor{}, + MarshalFunc: DefaultMarshalFunc, + PrintGETAndLIST: false, + }) +} + +// NewDryRunClientWithOpts returns a clientset.Interface that can be used normally for talking to the Kubernetes API. +// This client doesn't apply changes to the backend. The client gets GET/LIST values from the DryRunGetter implementation. +// This client logs all I/O to the writer w in YAML format +func NewDryRunClientWithOpts(opts DryRunClientOptions) clientset.Interface { + // Build a chain of reactors to act like a normal clientset; but log everything's that happening and don't change any state + client := fakeclientset.NewSimpleClientset() + + // Build the chain of reactors. Order matters; first item here will be invoked first on match, then the second one will be evaluted, etc. + defaultReactorChain := []core.Reactor{ + // Log everything that happens. Default the object if it's about to be created/updated so that the logged object is representative. + &core.SimpleReactor{ + Verb: "*", + Resource: "*", + Reaction: func(action core.Action) (bool, runtime.Object, error) { + logDryRunAction(action, opts.Writer, opts.MarshalFunc) + + return false, nil, nil + }, + }, + // Let the DryRunGetter implementation take care of all GET requests. + // The DryRunGetter implementation may call a real API Server behind the scenes or just fake everything + &core.SimpleReactor{ + Verb: "get", + Resource: "*", + Reaction: func(action core.Action) (bool, runtime.Object, error) { + getAction, ok := action.(core.GetAction) + if !ok { + // something's wrong, we can't handle this event + return true, nil, fmt.Errorf("can't cast get reactor event action object to GetAction interface") + } + handled, obj, err := opts.Getter.HandleGetAction(getAction) + + if opts.PrintGETAndLIST { + // Print the marshalled object format with one tab indentation + objBytes, err := opts.MarshalFunc(obj) + if err == nil { + fmt.Println("[dryrun] Returning faked GET response:") + printBytesWithLinePrefix(opts.Writer, objBytes, "\t") + } + } + + return handled, obj, err + }, + }, + // Let the DryRunGetter implementation take care of all GET requests. + // The DryRunGetter implementation may call a real API Server behind the scenes or just fake everything + &core.SimpleReactor{ + Verb: "list", + Resource: "*", + Reaction: func(action core.Action) (bool, runtime.Object, error) { + listAction, ok := action.(core.ListAction) + if !ok { + // something's wrong, we can't handle this event + return true, nil, fmt.Errorf("can't cast list reactor event action object to ListAction interface") + } + handled, objs, err := opts.Getter.HandleListAction(listAction) + + if opts.PrintGETAndLIST { + // Print the marshalled object format with one tab indentation + objBytes, err := opts.MarshalFunc(objs) + if err == nil { + fmt.Println("[dryrun] Returning faked LIST response:") + printBytesWithLinePrefix(opts.Writer, objBytes, "\t") + } + } + + return handled, objs, err + }, + }, + // For the verbs that modify anything on the server; just return the object if present and exit successfully + &core.SimpleReactor{ + Verb: "create", + Resource: "*", + Reaction: successfulModificationReactorFunc, + }, + &core.SimpleReactor{ + Verb: "update", + Resource: "*", + Reaction: successfulModificationReactorFunc, + }, + &core.SimpleReactor{ + Verb: "delete", + Resource: "*", + Reaction: successfulModificationReactorFunc, + }, + &core.SimpleReactor{ + Verb: "delete-collection", + Resource: "*", + Reaction: successfulModificationReactorFunc, + }, + &core.SimpleReactor{ + Verb: "patch", + Resource: "*", + Reaction: successfulModificationReactorFunc, + }, + } + + // The chain of reactors will look like this: + // opts.PrependReactors | defaultReactorChain | opts.AppendReactors | client.Fake.ReactionChain (default reactors for the fake clientset) + fullReactorChain := append(opts.PrependReactors, defaultReactorChain...) + fullReactorChain = append(fullReactorChain, opts.AppendReactors...) + + // Prepend the reaction chain with our reactors. Important, these MUST be prepended; not appended due to how the fake clientset works by default + client.Fake.ReactionChain = append(fullReactorChain, client.Fake.ReactionChain...) + return client +} + +// successfulModificationReactorFunc is a no-op that just returns the POSTed/PUTed value if present; but does nothing to edit any backing data store. +func successfulModificationReactorFunc(action core.Action) (bool, runtime.Object, error) { + objAction, ok := action.(actionWithObject) + if ok { + return true, objAction.GetObject(), nil + } + return true, nil, nil +} + +// logDryRunAction logs the action that was recorded by the "catch-all" (*,*) reactor and tells the user what would have happened in an user-friendly way +func logDryRunAction(action core.Action, w io.Writer, marshalFunc MarshalFunc) { + + group := action.GetResource().Group + if len(group) == 0 { + group = "core" + } + fmt.Fprintf(w, "[dryrun] Would perform action %s on resource %q in API group \"%s/%s\"\n", strings.ToUpper(action.GetVerb()), action.GetResource().Resource, group, action.GetResource().Version) + + namedAction, ok := action.(actionWithName) + if ok { + fmt.Fprintf(w, "[dryrun] Resource name: %q\n", namedAction.GetName()) + } + + objAction, ok := action.(actionWithObject) + if ok && objAction.GetObject() != nil { + // Print the marshalled object with a tab indentation + objBytes, err := marshalFunc(objAction.GetObject()) + if err == nil { + fmt.Println("[dryrun] Attached object:") + printBytesWithLinePrefix(w, objBytes, "\t") + } + } + + patchAction, ok := action.(core.PatchAction) + if ok { + // Replace all occurences of \" with a simple " when printing + fmt.Fprintf(w, "[dryrun] Attached patch:\n\t%s\n", strings.Replace(string(patchAction.GetPatch()), `\"`, `"`, -1)) + } +} + +// printBytesWithLinePrefix prints objBytes to writer w with linePrefix in the beginning of every line +func printBytesWithLinePrefix(w io.Writer, objBytes []byte, linePrefix string) { + scanner := bufio.NewScanner(bytes.NewReader(objBytes)) + for scanner.Scan() { + fmt.Fprintf(w, "%s%s\n", linePrefix, scanner.Text()) + } +} diff --git a/cmd/kubeadm/app/util/apiclient/dryrunclient_test.go b/cmd/kubeadm/app/util/apiclient/dryrunclient_test.go new file mode 100644 index 0000000000000..246bc7a78d6bb --- /dev/null +++ b/cmd/kubeadm/app/util/apiclient/dryrunclient_test.go @@ -0,0 +1,100 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apiclient + +import ( + "bytes" + "testing" + + "k8s.io/api/core/v1" + rbac "k8s.io/api/rbac/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + core "k8s.io/client-go/testing" +) + +func TestLogDryRunAction(t *testing.T) { + var tests = []struct { + action core.Action + expectedBytes []byte + buf *bytes.Buffer + }{ + { + action: core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "services"}, "default", "kubernetes"), + expectedBytes: []byte(`[dryrun] Would perform action GET on resource "services" in API group "core/v1" +[dryrun] Resource name: "kubernetes" +`), + }, + { + action: core.NewRootGetAction(schema.GroupVersionResource{Group: rbac.GroupName, Version: rbac.SchemeGroupVersion.Version, Resource: "clusterrolebindings"}, "system:node"), + expectedBytes: []byte(`[dryrun] Would perform action GET on resource "clusterrolebindings" in API group "rbac.authorization.k8s.io/v1beta1" +[dryrun] Resource name: "system:node" +`), + }, + { + action: core.NewListAction(schema.GroupVersionResource{Version: "v1", Resource: "services"}, schema.GroupVersionKind{Version: "v1", Kind: "Service"}, "default", metav1.ListOptions{}), + expectedBytes: []byte(`[dryrun] Would perform action LIST on resource "services" in API group "core/v1" +`), + }, + { + action: core.NewCreateAction(schema.GroupVersionResource{Version: "v1", Resource: "services"}, "default", &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + }, + Spec: v1.ServiceSpec{ + ClusterIP: "1.1.1.1", + }, + }), + expectedBytes: []byte(`[dryrun] Would perform action CREATE on resource "services" in API group "core/v1" + metadata: + creationTimestamp: null + name: foo + spec: + clusterIP: 1.1.1.1 + status: + loadBalancer: {} +`), + }, + { + action: core.NewPatchAction(schema.GroupVersionResource{Version: "v1", Resource: "nodes"}, "default", "my-node", []byte(`{"spec":{"taints":[{"key": "foo", "value": "bar"}]}}`)), + expectedBytes: []byte(`[dryrun] Would perform action PATCH on resource "nodes" in API group "core/v1" +[dryrun] Resource name: "my-node" +[dryrun] Attached patch: + {"spec":{"taints":[{"key": "foo", "value": "bar"}]}} +`), + }, + { + action: core.NewDeleteAction(schema.GroupVersionResource{Version: "v1", Resource: "pods"}, "default", "my-pod"), + expectedBytes: []byte(`[dryrun] Would perform action DELETE on resource "pods" in API group "core/v1" +[dryrun] Resource name: "my-pod" +`), + }, + } + for _, rt := range tests { + rt.buf = bytes.NewBufferString("") + logDryRunAction(rt.action, rt.buf, DefaultMarshalFunc) + actualBytes := rt.buf.Bytes() + + if !bytes.Equal(actualBytes, rt.expectedBytes) { + t.Errorf( + "failed LogDryRunAction:\n\texpected bytes: %q\n\t actual: %q", + rt.expectedBytes, + actualBytes, + ) + } + } +} diff --git a/cmd/kubeadm/app/util/apiclient/init_dryrun.go b/cmd/kubeadm/app/util/apiclient/init_dryrun.go new file mode 100644 index 0000000000000..ab31a98665499 --- /dev/null +++ b/cmd/kubeadm/app/util/apiclient/init_dryrun.go @@ -0,0 +1,162 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apiclient + +import ( + "fmt" + "net" + "strings" + + "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/intstr" + core "k8s.io/client-go/testing" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" + "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" +) + +// InitDryRunGetter implements the DryRunGetter interface and can be used to GET/LIST values in the dryrun fake clientset +// Need to handle these routes in a special manner: +// - GET /default/services/kubernetes -- must return a valid Service +// - GET /clusterrolebindings/system:nodes -- can safely return a NotFound error +// - GET /kube-system/secrets/bootstrap-token-* -- can safely return a NotFound error +// - GET /nodes/ -- must return a valid Node +// - ...all other, unknown GETs/LISTs will be logged +type InitDryRunGetter struct { + masterName string + serviceSubnet string +} + +// InitDryRunGetter should implement the DryRunGetter interface +var _ DryRunGetter = &InitDryRunGetter{} + +// NewInitDryRunGetter creates a new instance of the InitDryRunGetter struct +func NewInitDryRunGetter(masterName string, serviceSubnet string) *InitDryRunGetter { + return &InitDryRunGetter{ + masterName: masterName, + serviceSubnet: serviceSubnet, + } +} + +// HandleGetAction handles GET actions to the dryrun clientset this interface supports +func (idr *InitDryRunGetter) HandleGetAction(action core.GetAction) (bool, runtime.Object, error) { + funcs := []func(core.GetAction) (bool, runtime.Object, error){ + idr.handleKubernetesService, + idr.handleGetNode, + idr.handleSystemNodesClusterRoleBinding, + idr.handleGetBootstrapToken, + } + for _, f := range funcs { + handled, obj, err := f(action) + if handled { + return handled, obj, err + } + } + + return false, nil, nil +} + +// HandleListAction handles GET actions to the dryrun clientset this interface supports. +// Currently there are no known LIST calls during kubeadm init this code has to take care of. +func (idr *InitDryRunGetter) HandleListAction(action core.ListAction) (bool, runtime.Object, error) { + return false, nil, nil +} + +// handleKubernetesService returns a faked Kubernetes service in order to be able to continue running kubeadm init. +// The kube-dns addon code GETs the kubernetes service in order to extract the service subnet +func (idr *InitDryRunGetter) handleKubernetesService(action core.GetAction) (bool, runtime.Object, error) { + if action.GetName() != "kubernetes" || action.GetNamespace() != metav1.NamespaceDefault || action.GetResource().Resource != "services" { + // We can't handle this event + return false, nil, nil + } + + _, svcSubnet, err := net.ParseCIDR(idr.serviceSubnet) + if err != nil { + return true, nil, fmt.Errorf("error parsing CIDR %q: %v", idr.serviceSubnet, err) + } + + internalAPIServerVirtualIP, err := ipallocator.GetIndexedIP(svcSubnet, 1) + if err != nil { + return true, nil, fmt.Errorf("unable to get first IP address from the given CIDR (%s): %v", svcSubnet.String(), err) + } + + // The only used field of this Service object is the ClusterIP, which kube-dns uses to calculate its own IP + return true, &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kubernetes", + Namespace: metav1.NamespaceDefault, + Labels: map[string]string{ + "component": "apiserver", + "provider": "kubernetes", + }, + }, + Spec: v1.ServiceSpec{ + ClusterIP: internalAPIServerVirtualIP.String(), + Ports: []v1.ServicePort{ + { + Name: "https", + Port: 443, + TargetPort: intstr.FromInt(6443), + }, + }, + }, + }, nil +} + +// handleGetNode returns a fake node object for the purpose of moving kubeadm init forwards. +func (idr *InitDryRunGetter) handleGetNode(action core.GetAction) (bool, runtime.Object, error) { + if action.GetName() != idr.masterName || action.GetResource().Resource != "nodes" { + // We can't handle this event + return false, nil, nil + } + + return true, &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: idr.masterName, + Labels: map[string]string{ + "kubernetes.io/hostname": idr.masterName, + }, + }, + Spec: v1.NodeSpec{ + ExternalID: idr.masterName, + }, + }, nil +} + +// handleSystemNodesClusterRoleBinding handles the GET call to the system:nodes clusterrolebinding +func (idr *InitDryRunGetter) handleSystemNodesClusterRoleBinding(action core.GetAction) (bool, runtime.Object, error) { + if action.GetName() != constants.NodesClusterRoleBinding || action.GetResource().Resource != "clusterrolebindings" { + // We can't handle this event + return false, nil, nil + } + // We can safely return a NotFound error here as the code will just proceed normally and don't care about modifying this clusterrolebinding + // This can only happen on an upgrade; and in that case the ClientBackedDryRunGetter impl will be used + return true, nil, apierrors.NewNotFound(action.GetResource().GroupResource(), "clusterrolebinding not found") +} + +// handleGetBootstrapToken handles the case where kubeadm init creates the default token; and the token code GETs the +// bootstrap token secret first in order to check if it already exists +func (idr *InitDryRunGetter) handleGetBootstrapToken(action core.GetAction) (bool, runtime.Object, error) { + if !strings.HasPrefix(action.GetName(), "bootstrap-token-") || action.GetNamespace() != metav1.NamespaceSystem || action.GetResource().Resource != "secrets" { + // We can't handle this event + return false, nil, nil + } + // We can safely return a NotFound error here as the code will just proceed normally and create the Bootstrap Token + return true, nil, apierrors.NewNotFound(action.GetResource().GroupResource(), "secret not found") +} diff --git a/cmd/kubeadm/app/util/apiclient/init_dryrun_test.go b/cmd/kubeadm/app/util/apiclient/init_dryrun_test.go new file mode 100644 index 0000000000000..9e681b5218746 --- /dev/null +++ b/cmd/kubeadm/app/util/apiclient/init_dryrun_test.go @@ -0,0 +1,126 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apiclient + +import ( + "bytes" + "encoding/json" + "testing" + + rbac "k8s.io/api/rbac/v1beta1" + "k8s.io/apimachinery/pkg/runtime/schema" + core "k8s.io/client-go/testing" +) + +func TestHandleGetAction(t *testing.T) { + masterName := "master-foo" + serviceSubnet := "10.96.0.1/12" + idr := NewInitDryRunGetter(masterName, serviceSubnet) + + var tests = []struct { + action core.GetActionImpl + expectedHandled bool + expectedObjectJSON []byte + expectedErr bool + }{ + { + action: core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "services"}, "default", "kubernetes"), + expectedHandled: true, + expectedObjectJSON: []byte(`{"metadata":{"name":"kubernetes","namespace":"default","creationTimestamp":null,"labels":{"component":"apiserver","provider":"kubernetes"}},"spec":{"ports":[{"name":"https","port":443,"targetPort":6443}],"clusterIP":"10.96.0.1"},"status":{"loadBalancer":{}}}`), + expectedErr: false, + }, + { + action: core.NewRootGetAction(schema.GroupVersionResource{Version: "v1", Resource: "nodes"}, masterName), + expectedHandled: true, + expectedObjectJSON: []byte(`{"metadata":{"name":"master-foo","creationTimestamp":null,"labels":{"kubernetes.io/hostname":"master-foo"}},"spec":{"externalID":"master-foo"},"status":{"daemonEndpoints":{"kubeletEndpoint":{"Port":0}},"nodeInfo":{"machineID":"","systemUUID":"","bootID":"","kernelVersion":"","osImage":"","containerRuntimeVersion":"","kubeletVersion":"","kubeProxyVersion":"","operatingSystem":"","architecture":""}}}`), + expectedErr: false, + }, + { + action: core.NewRootGetAction(schema.GroupVersionResource{Group: rbac.GroupName, Version: rbac.SchemeGroupVersion.Version, Resource: "clusterrolebindings"}, "system:node"), + expectedHandled: true, + expectedObjectJSON: []byte(``), + expectedErr: true, // we expect a NotFound error here + }, + { + action: core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, "kube-system", "bootstrap-token-abcdef"), + expectedHandled: true, + expectedObjectJSON: []byte(``), + expectedErr: true, // we expect a NotFound error here + }, + { // an ask for a kubernetes service in the _kube-system_ ns should not be answered + action: core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "services"}, "kube-system", "kubernetes"), + expectedHandled: false, + expectedObjectJSON: []byte(``), + expectedErr: false, + }, + { // an ask for an other service than kubernetes should not be answered + action: core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "services"}, "default", "my-other-service"), + expectedHandled: false, + expectedObjectJSON: []byte(``), + expectedErr: false, + }, + { // an ask for an other node than the master should not be answered + action: core.NewRootGetAction(schema.GroupVersionResource{Version: "v1", Resource: "nodes"}, "other-node"), + expectedHandled: false, + expectedObjectJSON: []byte(``), + expectedErr: false, + }, + { // an ask for a secret in any other ns than kube-system should not be answered + action: core.NewGetAction(schema.GroupVersionResource{Version: "v1", Resource: "secrets"}, "default", "bootstrap-token-abcdef"), + expectedHandled: false, + expectedObjectJSON: []byte(``), + expectedErr: false, + }, + } + for _, rt := range tests { + handled, obj, actualErr := idr.HandleGetAction(rt.action) + objBytes := []byte(``) + if obj != nil { + var err error + objBytes, err = json.Marshal(obj) + if err != nil { + t.Fatalf("couldn't marshal returned object") + } + } + + if handled != rt.expectedHandled { + t.Errorf( + "failed HandleGetAction:\n\texpected handled: %t\n\t actual: %t %v", + rt.expectedHandled, + handled, + rt.action, + ) + } + + if !bytes.Equal(objBytes, rt.expectedObjectJSON) { + t.Errorf( + "failed HandleGetAction:\n\texpected object: %q\n\t actual: %q", + rt.expectedObjectJSON, + objBytes, + ) + } + + if (actualErr != nil) != rt.expectedErr { + t.Errorf( + "failed HandleGetAction:\n\texpected error: %t\n\t actual: %t %v", + rt.expectedErr, + (actualErr != nil), + rt.action, + ) + } + } +} diff --git a/staging/src/k8s.io/client-go/testing/actions.go b/staging/src/k8s.io/client-go/testing/actions.go index 12a2ecf95b0e3..8633a81dec5f7 100644 --- a/staging/src/k8s.io/client-go/testing/actions.go +++ b/staging/src/k8s.io/client-go/testing/actions.go @@ -319,6 +319,17 @@ type DeleteAction interface { GetName() string } +type DeleteCollectionAction interface { + Action + GetListRestrictions() ListRestrictions +} + +type PatchAction interface { + Action + GetName() string + GetPatch() []byte +} + type WatchAction interface { Action GetWatchRestrictions() WatchRestrictions From 46c6aea1cf486c7cf5e8bb45abb3fcd11a83680c Mon Sep 17 00:00:00 2001 From: Yinan Li Date: Fri, 18 Aug 2017 06:49:02 -0700 Subject: [PATCH 116/403] Use CollisionCount for collision avoidance in StatefulSet controller --- pkg/controller/history/controller_history.go | 58 +++--- .../history/controller_history_test.go | 188 ++++++++++++------ .../statefulset/stateful_set_control.go | 37 ++-- .../statefulset/stateful_set_control_test.go | 16 +- .../statefulset/stateful_set_utils.go | 5 +- .../statefulset/stateful_set_utils_test.go | 5 +- 6 files changed, 193 insertions(+), 116 deletions(-) diff --git a/pkg/controller/history/controller_history.go b/pkg/controller/history/controller_history.go index e4201c65bc969..16934d6cd4efc 100644 --- a/pkg/controller/history/controller_history.go +++ b/pkg/controller/history/controller_history.go @@ -54,15 +54,17 @@ func ControllerRevisionName(prefix string, hash uint32) string { return fmt.Sprintf("%s-%d", prefix, hash) } -// NewControllerRevision returns the a ControllerRevision with a ControllerRef pointing parent and indicating that +// NewControllerRevision returns a ControllerRevision with a ControllerRef pointing to parent and indicating that // parent is of parentKind. The ControllerRevision has labels matching selector, contains Data equal to data, and -// has a Revision equal to revision. If the returned error is nil, the returned ControllerRevision is valid. If the +// has a Revision equal to revision. The collisionCount is used when creating the name of the ControllerRevision +// so the name is likely unique. If the returned error is nil, the returned ControllerRevision is valid. If the // returned error is not nil, the returned ControllerRevision is invalid for use. func NewControllerRevision(parent metav1.Object, parentKind schema.GroupVersionKind, selector labels.Selector, data runtime.RawExtension, - revision int64) (*apps.ControllerRevision, error) { + revision int64, + collisionCount *int32) (*apps.ControllerRevision, error) { labelMap, err := labels.ConvertSelectorToLabelsMap(selector.String()) if err != nil { return nil, err @@ -86,7 +88,7 @@ func NewControllerRevision(parent metav1.Object, Data: data, Revision: revision, } - hash := HashControllerRevision(cr, nil) + hash := HashControllerRevision(cr, collisionCount) cr.Name = ControllerRevisionName(parent.GetName(), hash) cr.Labels[ControllerRevisionHashLabel] = strconv.FormatInt(int64(hash), 10) return cr, nil @@ -94,7 +96,7 @@ func NewControllerRevision(parent metav1.Object, // HashControllerRevision hashes the contents of revision's Data using FNV hashing. If probe is not nil, the byte value // of probe is added written to the hash as well. -func HashControllerRevision(revision *apps.ControllerRevision, probe *uint32) uint32 { +func HashControllerRevision(revision *apps.ControllerRevision, probe *int32) uint32 { hf := fnv.New32() if len(revision.Data.Raw) > 0 { hf.Write(revision.Data.Raw) @@ -177,11 +179,13 @@ type Interface interface { // returned error is not nil, the returned slice is not valid. ListControllerRevisions(parent metav1.Object, selector labels.Selector) ([]*apps.ControllerRevision, error) // CreateControllerRevision attempts to create the revision as owned by parent via a ControllerRef. If name - // collision occurs, a unique identifier is added to the hash of the revision and it is renamed using - // ControllerRevisionName. Implementations may cease to attempt to retry creation after some number of attempts - // and return an error. If the returned error is not nil, creation failed. If the returned error is nil, the - // returned ControllerRevision has been created. - CreateControllerRevision(parent metav1.Object, revision *apps.ControllerRevision) (*apps.ControllerRevision, error) + // collision occurs, collisionCount (incremented each time collision occurs except for the first time) is + // added to the hash of the revision and it is renamed using ControllerRevisionName. Implementations may + // cease to attempt to retry creation after some number of attempts and return an error. If the returned + // error is not nil, creation failed. If the returned error is nil, the returned ControllerRevision has been + // created. + // Callers must make sure that collisionCount is not nil. An error is returned if it is. + CreateControllerRevision(parent metav1.Object, revision *apps.ControllerRevision, collisionCount *int32) (*apps.ControllerRevision, error) // DeleteControllerRevision attempts to delete revision. If the returned error is not nil, deletion has failed. DeleteControllerRevision(revision *apps.ControllerRevision) error // UpdateControllerRevision updates revision such that its Revision is equal to newRevision. Implementations @@ -233,9 +237,10 @@ func (rh *realHistory) ListControllerRevisions(parent metav1.Object, selector la return owned, err } -func (rh *realHistory) CreateControllerRevision(parent metav1.Object, revision *apps.ControllerRevision) (*apps.ControllerRevision, error) { - // Initialize the probe to 0 - probe := uint32(0) +func (rh *realHistory) CreateControllerRevision(parent metav1.Object, revision *apps.ControllerRevision, collisionCount *int32) (*apps.ControllerRevision, error) { + if collisionCount == nil { + return nil, fmt.Errorf("collisionCount should not be nil") + } // Clone the input any, err := scheme.Scheme.DeepCopy(revision) @@ -246,18 +251,12 @@ func (rh *realHistory) CreateControllerRevision(parent metav1.Object, revision * // Continue to attempt to create the revision updating the name with a new hash on each iteration for { - var hash uint32 - // The first attempt uses no probe to resolve collisions - if probe > 0 { - hash = HashControllerRevision(revision, &probe) - } else { - hash = HashControllerRevision(revision, nil) - } + hash := HashControllerRevision(revision, collisionCount) // Update the revisions name and labels clone.Name = ControllerRevisionName(parent.GetName(), hash) created, err := rh.client.AppsV1beta1().ControllerRevisions(parent.GetNamespace()).Create(clone) if errors.IsAlreadyExists(err) { - probe++ + *collisionCount++ continue } return created, err @@ -370,9 +369,10 @@ func (fh *fakeHistory) addRevision(revision *apps.ControllerRevision) (*apps.Con return revision, fh.indexer.Update(revision) } -func (fh *fakeHistory) CreateControllerRevision(parent metav1.Object, revision *apps.ControllerRevision) (*apps.ControllerRevision, error) { - // Initialize the probe to 0 - probe := uint32(0) +func (fh *fakeHistory) CreateControllerRevision(parent metav1.Object, revision *apps.ControllerRevision, collisionCount *int32) (*apps.ControllerRevision, error) { + if collisionCount == nil { + return nil, fmt.Errorf("collisionCount should not be nil") + } // Clone the input any, err := scheme.Scheme.DeepCopy(revision) @@ -384,18 +384,12 @@ func (fh *fakeHistory) CreateControllerRevision(parent metav1.Object, revision * // Continue to attempt to create the revision updating the name with a new hash on each iteration for { - var hash uint32 - // The first attempt uses no probe to resolve collisions - if probe > 0 { - hash = HashControllerRevision(revision, &probe) - } else { - hash = HashControllerRevision(revision, nil) - } + hash := HashControllerRevision(revision, collisionCount) // Update the revisions name and labels clone.Name = ControllerRevisionName(parent.GetName(), hash) created, err := fh.addRevision(clone) if errors.IsAlreadyExists(err) { - probe++ + *collisionCount++ continue } return created, err diff --git a/pkg/controller/history/controller_history_test.go b/pkg/controller/history/controller_history_test.go index ab5845eb34257..5e9c1eadf151e 100644 --- a/pkg/controller/history/controller_history_test.go +++ b/pkg/controller/history/controller_history_test.go @@ -85,22 +85,22 @@ func TestRealHistory_ListControllerRevisions(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, nil) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, nil) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, nil) if err != nil { t.Fatal(err) } ss2Rev1.Namespace = ss2.Namespace - ss1Orphan, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 3) + ss1Orphan, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 3, nil) if err != nil { t.Fatal(err) } @@ -186,22 +186,22 @@ func TestFakeHistory_ListControllerRevisions(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, nil) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, nil) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, nil) if err != nil { t.Fatal(err) } ss2Rev1.Namespace = ss2.Namespace - ss1Orphan, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 3) + ss1Orphan, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 3, nil) if err != nil { t.Fatal(err) } @@ -257,33 +257,53 @@ func TestRealHistory_CreateControllerRevision(t *testing.T) { testFn := func(test *testcase, t *testing.T) { client := fake.NewSimpleClientset() informerFactory := informers.NewSharedInformerFactory(client, controller.NoResyncPeriodFunc()) - stop := make(chan struct{}) defer close(stop) informerFactory.Start(stop) informer := informerFactory.Apps().V1beta1().ControllerRevisions() informerFactory.WaitForCacheSync(stop) history := NewHistory(client, informer.Lister()) + + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } } - created, err := history.CreateControllerRevision(test.parent, test.revision) + // Clear collisionCount before creating the test revision + collisionCount = 0 + created, err := history.CreateControllerRevision(test.parent, test.revision, &collisionCount) if err != nil { t.Errorf("%s: %s", test.name, err) } - if test.rename && created.Name == test.revision.Name { - t.Errorf("%s: wanted rename got %s %s", test.name, created.Name, test.revision.Name) + if test.rename { + if created.Name == test.revision.Name { + t.Errorf("%s: wanted rename got %s %s", test.name, created.Name, test.revision.Name) + } + expectedName := ControllerRevisionName(test.parent.GetName(), HashControllerRevision(test.revision, &collisionCount)) + if created.Name != expectedName { + t.Errorf("%s: on name collision wanted new name %s got %s", test.name, expectedName, created.Name) + } + + // Second name collision should have incremented collisionCount to 2 + _, err = history.CreateControllerRevision(test.parent, test.revision, &collisionCount) + if err != nil { + t.Errorf("%s: %s", test.name, err) + } + if collisionCount != 2 { + t.Errorf("%s: on second name collision wanted collisionCount 1 got %d", test.name, collisionCount) + } } if !test.rename && created.Name != test.revision.Name { t.Errorf("%s: wanted %s got %s", test.name, test.revision.Name, created.Name) } } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) ss2 := newStatefulSet(3, "ss2", types.UID("ss2"), map[string]string{"goo": "car"}) + ss2.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) @@ -292,17 +312,17 @@ func TestRealHistory_CreateControllerRevision(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -374,26 +394,47 @@ func TestFakeHistory_CreateControllerRevision(t *testing.T) { informer := informerFactory.Apps().V1beta1().ControllerRevisions() informerFactory.WaitForCacheSync(stop) history := NewFakeHistory(informer) + + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } } - created, err := history.CreateControllerRevision(test.parent, test.revision) + // Clear collisionCount before creating the test revision + collisionCount = 0 + created, err := history.CreateControllerRevision(test.parent, test.revision, &collisionCount) if err != nil { t.Errorf("%s: %s", test.name, err) } - if test.rename && created.Name == test.revision.Name { - t.Errorf("%s: wanted rename got %s %s", test.name, created.Name, test.revision.Name) + if test.rename { + if created.Name == test.revision.Name { + t.Errorf("%s: wanted rename got %s %s", test.name, created.Name, test.revision.Name) + } + expectedName := ControllerRevisionName(test.parent.GetName(), HashControllerRevision(test.revision, &collisionCount)) + if created.Name != expectedName { + t.Errorf("%s: on name collision wanted new name %s got %s", test.name, expectedName, created.Name) + } + + // Second name collision should have incremented collisionCount to 2 + _, err = history.CreateControllerRevision(test.parent, test.revision, &collisionCount) + if err != nil { + t.Errorf("%s: %s", test.name, err) + } + if collisionCount != 2 { + t.Errorf("%s: on second name collision wanted collisionCount 1 got %d", test.name, collisionCount) + } } if !test.rename && created.Name != test.revision.Name { t.Errorf("%s: wanted %s got %s", test.name, test.revision.Name, created.Name) } } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) ss2 := newStatefulSet(3, "ss2", types.UID("ss2"), map[string]string{"goo": "car"}) + ss2.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) @@ -402,17 +443,17 @@ func TestFakeHistory_CreateControllerRevision(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -511,8 +552,9 @@ func TestRealHistory_UpdateControllerRevision(t *testing.T) { informer := informerFactory.Apps().V1beta1().ControllerRevisions() informerFactory.WaitForCacheSync(stop) history := NewHistory(client, informer.Lister()) + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } @@ -532,17 +574,18 @@ func TestRealHistory_UpdateControllerRevision(t *testing.T) { } } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -641,8 +684,9 @@ func TestFakeHistory_UpdateControllerRevision(t *testing.T) { informer := informerFactory.Apps().V1beta1().ControllerRevisions() informerFactory.WaitForCacheSync(stop) history := NewFakeHistory(informer) + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } @@ -659,17 +703,18 @@ func TestFakeHistory_UpdateControllerRevision(t *testing.T) { } } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -731,8 +776,9 @@ func TestRealHistory_DeleteControllerRevision(t *testing.T) { informer := informerFactory.Apps().V1beta1().ControllerRevisions() informerFactory.WaitForCacheSync(stop) history := NewHistory(client, informer.Lister()) + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } @@ -746,7 +792,9 @@ func TestRealHistory_DeleteControllerRevision(t *testing.T) { } } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) ss2 := newStatefulSet(3, "ss2", types.UID("ss2"), map[string]string{"goo": "car"}) + ss2.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) @@ -755,22 +803,22 @@ func TestRealHistory_DeleteControllerRevision(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } ss2Rev1.Namespace = ss2.Namespace - ss2Rev2, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 2) + ss2Rev2, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 2, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -839,8 +887,9 @@ func TestFakeHistory_DeleteControllerRevision(t *testing.T) { informer := informerFactory.Apps().V1beta1().ControllerRevisions() informerFactory.WaitForCacheSync(stop) history := NewFakeHistory(informer) + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } @@ -854,7 +903,9 @@ func TestFakeHistory_DeleteControllerRevision(t *testing.T) { } } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) ss2 := newStatefulSet(3, "ss2", types.UID("ss2"), map[string]string{"goo": "car"}) + ss2.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) @@ -863,22 +914,22 @@ func TestFakeHistory_DeleteControllerRevision(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } ss2Rev1.Namespace = ss2.Namespace - ss2Rev2, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 2) + ss2Rev2, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 2, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -982,8 +1033,9 @@ func TestRealHistory_AdoptControllerRevision(t *testing.T) { informerFactory.WaitForCacheSync(stop) history := NewHistory(client, informer.Lister()) + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } @@ -1001,7 +1053,9 @@ func TestRealHistory_AdoptControllerRevision(t *testing.T) { } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) ss2 := newStatefulSet(3, "ss2", types.UID("ss2"), map[string]string{"goo": "car"}) + ss2.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) @@ -1010,18 +1064,18 @@ func TestRealHistory_AdoptControllerRevision(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace ss1Rev2.OwnerReferences = []metav1.OwnerReference{} - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -1093,8 +1147,9 @@ func TestFakeHistory_AdoptControllerRevision(t *testing.T) { informerFactory.WaitForCacheSync(stop) history := NewFakeHistory(informer) + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } @@ -1112,7 +1167,9 @@ func TestFakeHistory_AdoptControllerRevision(t *testing.T) { } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) ss2 := newStatefulSet(3, "ss2", types.UID("ss2"), map[string]string{"goo": "car"}) + ss2.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) @@ -1121,18 +1178,18 @@ func TestFakeHistory_AdoptControllerRevision(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace ss1Rev2.OwnerReferences = []metav1.OwnerReference{} - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -1243,8 +1300,9 @@ func TestRealHistory_ReleaseControllerRevision(t *testing.T) { informerFactory.WaitForCacheSync(stop) history := NewHistory(client, informer.Lister()) + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } @@ -1276,18 +1334,18 @@ func TestRealHistory_ReleaseControllerRevision(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, nil) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, nil) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace ss1Rev2.OwnerReferences = []metav1.OwnerReference{} - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, nil) if err != nil { t.Fatal(err) } @@ -1371,8 +1429,9 @@ func TestFakeHistory_ReleaseControllerRevision(t *testing.T) { informer := informerFactory.Apps().V1beta1().ControllerRevisions() informerFactory.WaitForCacheSync(stop) history := NewFakeHistory(informer) + var collisionCount int32 for i := range test.existing { - _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision) + _, err := history.CreateControllerRevision(test.existing[i].parent, test.existing[i].revision, &collisionCount) if err != nil { t.Fatal(err) } @@ -1395,7 +1454,9 @@ func TestFakeHistory_ReleaseControllerRevision(t *testing.T) { } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) ss2 := newStatefulSet(3, "ss2", types.UID("ss2"), map[string]string{"goo": "car"}) + ss2.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) @@ -1404,18 +1465,18 @@ func TestFakeHistory_ReleaseControllerRevision(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace ss1Rev2.OwnerReferences = []metav1.OwnerReference{} - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -1499,7 +1560,9 @@ func TestFindEqualRevisions(t *testing.T) { } } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) ss2 := newStatefulSet(3, "ss2", types.UID("ss2"), map[string]string{"goo": "car"}) + ss2.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) @@ -1508,23 +1571,23 @@ func TestFindEqualRevisions(t *testing.T) { if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace ss1Rev2.OwnerReferences = []metav1.OwnerReference{} - ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1) + ss2Rev1, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 1, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } ss2Rev1.Namespace = ss2.Namespace - ss2Rev2, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 2) + ss2Rev2, err := NewControllerRevision(ss2, parentKind, sel2, rawTemplate(&ss2.Spec.Template), 2, ss2.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -1569,22 +1632,23 @@ func TestSortControllerRevisions(t *testing.T) { } } ss1 := newStatefulSet(3, "ss1", types.UID("ss1"), map[string]string{"foo": "bar"}) + ss1.Status.CollisionCount = new(int32) sel1, err := metav1.LabelSelectorAsSelector(ss1.Spec.Selector) if err != nil { t.Fatal(err) } - ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1) + ss1Rev1, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 1, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev1.Namespace = ss1.Namespace - ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev2, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } ss1Rev2.Namespace = ss1.Namespace - ss1Rev3, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2) + ss1Rev3, err := NewControllerRevision(ss1, parentKind, sel1, rawTemplate(&ss1.Spec.Template), 2, ss1.Status.CollisionCount) if err != nil { t.Fatal(err) } diff --git a/pkg/controller/statefulset/stateful_set_control.go b/pkg/controller/statefulset/stateful_set_control.go index 637236b8768d6..0fe3ff9708c8f 100644 --- a/pkg/controller/statefulset/stateful_set_control.go +++ b/pkg/controller/statefulset/stateful_set_control.go @@ -80,13 +80,13 @@ func (ssc *defaultStatefulSetControl) UpdateStatefulSet(set *apps.StatefulSet, p history.SortControllerRevisions(revisions) // get the current, and update revisions - currentRevision, updateRevision, err := ssc.getStatefulSetRevisions(set, revisions) + currentRevision, updateRevision, collisionCount, err := ssc.getStatefulSetRevisions(set, revisions) if err != nil { return err } // perform the main update function and get the status - status, err := ssc.updateStatefulSet(set, currentRevision, updateRevision, pods) + status, err := ssc.updateStatefulSet(set, currentRevision, updateRevision, collisionCount, pods) if err != nil { return err } @@ -174,21 +174,31 @@ func (ssc *defaultStatefulSetControl) truncateHistory( return nil } -// getStatefulSetRevisions returns the current and update ControllerRevisions for set. This method may create a new revision, -// or modify the Revision of an existing revision if an update to set is detected. This method expects that revisions -// is sorted when supplied. +// getStatefulSetRevisions returns the current and update ControllerRevisions for set. It also +// returns a collision count that records the number of name collisions set saw when creating +// new ControllerRevisions. This count is incremented on every name collision and is used in +// building the ControllerRevision names for name collision avoidance. This method may create +// a new revision, or modify the Revision of an existing revision if an update to set is detected. +// This method expects that revisions is sorted when supplied. func (ssc *defaultStatefulSetControl) getStatefulSetRevisions( set *apps.StatefulSet, - revisions []*apps.ControllerRevision) (*apps.ControllerRevision, *apps.ControllerRevision, error) { + revisions []*apps.ControllerRevision) (*apps.ControllerRevision, *apps.ControllerRevision, int32, error) { var currentRevision, updateRevision *apps.ControllerRevision revisionCount := len(revisions) history.SortControllerRevisions(revisions) + // Use a local copy of set.Status.CollisionCount to avoid modifying set.Status directly. + // This copy is returned so the value gets carried over to set.Status in updateStatefulSet. + var collisionCount int32 + if set.Status.CollisionCount != nil { + collisionCount = *set.Status.CollisionCount + } + // create a new revision from the current set - updateRevision, err := newRevision(set, nextRevision(revisions)) + updateRevision, err := newRevision(set, nextRevision(revisions), &collisionCount) if err != nil { - return nil, nil, err + return nil, nil, collisionCount, err } // find any equivalent revisions @@ -205,13 +215,13 @@ func (ssc *defaultStatefulSetControl) getStatefulSetRevisions( equalRevisions[equalCount-1], updateRevision.Revision) if err != nil { - return nil, nil, err + return nil, nil, collisionCount, err } } else { //if there is no equivalent revision we create a new one - updateRevision, err = ssc.controllerHistory.CreateControllerRevision(set, updateRevision) + updateRevision, err = ssc.controllerHistory.CreateControllerRevision(set, updateRevision, &collisionCount) if err != nil { - return nil, nil, err + return nil, nil, collisionCount, err } } @@ -227,7 +237,7 @@ func (ssc *defaultStatefulSetControl) getStatefulSetRevisions( currentRevision = updateRevision } - return currentRevision, updateRevision, nil + return currentRevision, updateRevision, collisionCount, nil } // updateStatefulSet performs the update function for a StatefulSet. This method creates, updates, and deletes Pods in @@ -243,6 +253,7 @@ func (ssc *defaultStatefulSetControl) updateStatefulSet( set *apps.StatefulSet, currentRevision *apps.ControllerRevision, updateRevision *apps.ControllerRevision, + collisionCount int32, pods []*v1.Pod) (*apps.StatefulSetStatus, error) { // get the current and update revisions of the set. currentSet, err := applyRevision(set, currentRevision) @@ -260,6 +271,8 @@ func (ssc *defaultStatefulSetControl) updateStatefulSet( *status.ObservedGeneration = set.Generation status.CurrentRevision = currentRevision.Name status.UpdateRevision = updateRevision.Name + status.CollisionCount = new(int32) + *status.CollisionCount = collisionCount replicaCount := int(*set.Spec.Replicas) // slice that will contain all Pods such that 0 <= getOrdinal(pod) < set.Spec.Replicas diff --git a/pkg/controller/statefulset/stateful_set_control_test.go b/pkg/controller/statefulset/stateful_set_control_test.go index 3d0184968bd3f..50d7b0822b6e5 100644 --- a/pkg/controller/statefulset/stateful_set_control_test.go +++ b/pkg/controller/statefulset/stateful_set_control_test.go @@ -465,14 +465,15 @@ func TestStatefulSetControl_getSetRevisions(t *testing.T) { informerFactory.Core().V1().Pods().Informer().HasSynced, informerFactory.Apps().V1beta1().ControllerRevisions().Informer().HasSynced, ) + test.set.Status.CollisionCount = new(int32) for i := range test.existing { - ssc.controllerHistory.CreateControllerRevision(test.set, test.existing[i]) + ssc.controllerHistory.CreateControllerRevision(test.set, test.existing[i], test.set.Status.CollisionCount) } revisions, err := ssc.ListRevisions(test.set) if err != nil { t.Fatal(err) } - current, update, err := ssc.getStatefulSetRevisions(test.set, revisions) + current, update, _, err := ssc.getStatefulSetRevisions(test.set, revisions) revisions, err = ssc.ListRevisions(test.set) if err != nil { t.Fatal(err) @@ -480,20 +481,20 @@ func TestStatefulSetControl_getSetRevisions(t *testing.T) { if len(revisions) != test.expectedCount { t.Errorf("%s: want %d revisions got %d", test.name, test.expectedCount, len(revisions)) } - if test.err && err != nil { + if test.err && err == nil { t.Errorf("%s: expected error", test.name) } if !test.err && !history.EqualRevision(current, test.expectedCurrent) { t.Errorf("%s: for current want %v got %v", test.name, test.expectedCurrent, current) } if !test.err && !history.EqualRevision(update, test.expectedUpdate) { - t.Errorf("%s: for current want %v got %v", test.name, test.expectedUpdate, update) + t.Errorf("%s: for update want %v got %v", test.name, test.expectedUpdate, update) } if !test.err && test.expectedCurrent != nil && current != nil && test.expectedCurrent.Revision != current.Revision { t.Errorf("%s: for current revision want %d got %d", test.name, test.expectedCurrent.Revision, current.Revision) } if !test.err && test.expectedUpdate != nil && update != nil && test.expectedUpdate.Revision != update.Revision { - t.Errorf("%s: for current revision want %d got %d", test.name, test.expectedUpdate.Revision, update.Revision) + t.Errorf("%s: for update revision want %d got %d", test.name, test.expectedUpdate.Revision, update.Revision) } } @@ -508,14 +509,17 @@ func TestStatefulSetControl_getSetRevisions(t *testing.T) { } set := newStatefulSet(3) + set.Status.CollisionCount = new(int32) rev0 := newRevisionOrDie(set, 1) set1 := copySet(set) set1.Spec.Template.Spec.Containers[0].Image = "foo" set1.Status.CurrentRevision = rev0.Name + set1.Status.CollisionCount = new(int32) rev1 := newRevisionOrDie(set1, 2) set2 := copySet(set1) set2.Spec.Template.Labels["new"] = "label" set2.Status.CurrentRevision = rev0.Name + set2.Status.CollisionCount = new(int32) rev2 := newRevisionOrDie(set2, 3) tests := []testcase{ { @@ -2097,7 +2101,7 @@ func updateStatefulSetControl(set *apps.StatefulSet, } func newRevisionOrDie(set *apps.StatefulSet, revision int64) *apps.ControllerRevision { - rev, err := newRevision(set, revision) + rev, err := newRevision(set, revision, set.Status.CollisionCount) if err != nil { panic(err) } diff --git a/pkg/controller/statefulset/stateful_set_utils.go b/pkg/controller/statefulset/stateful_set_utils.go index e210cc915d570..ed3570ab4d95e 100644 --- a/pkg/controller/statefulset/stateful_set_utils.go +++ b/pkg/controller/statefulset/stateful_set_utils.go @@ -288,7 +288,7 @@ func getPatch(set *apps.StatefulSet) ([]byte, error) { // The Revision of the returned ControllerRevision is set to revision. If the returned error is nil, the returned // ControllerRevision is valid. StatefulSet revisions are stored as patches that re-apply the current state of set // to a new StatefulSet using a strategic merge patch to replace the saved state of the new StatefulSet. -func newRevision(set *apps.StatefulSet, revision int64) (*apps.ControllerRevision, error) { +func newRevision(set *apps.StatefulSet, revision int64, collisionCount *int32) (*apps.ControllerRevision, error) { patch, err := getPatch(set) if err != nil { return nil, err @@ -301,7 +301,8 @@ func newRevision(set *apps.StatefulSet, revision int64) (*apps.ControllerRevisio controllerKind, selector, runtime.RawExtension{Raw: patch}, - revision) + revision, + collisionCount) if err != nil { return nil, err } diff --git a/pkg/controller/statefulset/stateful_set_utils_test.go b/pkg/controller/statefulset/stateful_set_utils_test.go index 6efe8c466f7be..f8e6469accb4c 100644 --- a/pkg/controller/statefulset/stateful_set_utils_test.go +++ b/pkg/controller/statefulset/stateful_set_utils_test.go @@ -274,7 +274,8 @@ func TestNewPodControllerRef(t *testing.T) { func TestCreateApplyRevision(t *testing.T) { set := newStatefulSet(1) - revision, err := newRevision(set, 1) + set.Status.CollisionCount = new(int32) + revision, err := newRevision(set, 1, set.Status.CollisionCount) if err != nil { t.Fatal(err) } @@ -289,7 +290,7 @@ func TestCreateApplyRevision(t *testing.T) { if err != nil { t.Fatal(err) } - restoredRevision, err := newRevision(restoredSet, 2) + restoredRevision, err := newRevision(restoredSet, 2, restoredSet.Status.CollisionCount) if err != nil { t.Fatal(err) } From 2312920cbcb1a8db1311725c38cf188b76c6ef93 Mon Sep 17 00:00:00 2001 From: Alexander Kanevskiy Date: Mon, 14 Aug 2017 20:19:36 +0300 Subject: [PATCH 117/403] Implemented support for using images from CI builds Implements kubernetes/kubeadm#337 --- cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go | 1 + cmd/kubeadm/app/apis/kubeadm/types.go | 17 +++++ cmd/kubeadm/app/apis/kubeadm/v1alpha1/BUILD | 2 + cmd/kubeadm/app/apis/kubeadm/v1alpha1/doc.go | 1 + cmd/kubeadm/app/constants/constants.go | 3 + cmd/kubeadm/app/phases/addons/proxy/proxy.go | 2 +- .../app/phases/controlplane/manifests.go | 6 +- cmd/kubeadm/app/util/config/masterconfig.go | 5 ++ cmd/kubeadm/app/util/version.go | 73 +++++++++++++++---- cmd/kubeadm/app/util/version_test.go | 69 +++++++++++++++++- 10 files changed, 160 insertions(+), 19 deletions(-) diff --git a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go index 5dedda4e4b5fd..d9288ffeee046 100644 --- a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go +++ b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go @@ -40,6 +40,7 @@ func Funcs(codecs runtimeserializer.CodecFactory) []interface{} { obj.Etcd.Image = "foo" obj.Etcd.DataDir = "foo" obj.ImageRepository = "foo" + obj.CIImageRepository = "" obj.UnifiedControlPlaneImage = "foo" obj.FeatureFlags = map[string]bool{} }, diff --git a/cmd/kubeadm/app/apis/kubeadm/types.go b/cmd/kubeadm/app/apis/kubeadm/types.go index 62010f10bea9e..32d9c3410bb42 100644 --- a/cmd/kubeadm/app/apis/kubeadm/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/types.go @@ -49,6 +49,11 @@ type MasterConfiguration struct { // ImageRepository what container registry to pull control plane images from ImageRepository string + + // Container registry for core images generated by CI + // +k8s:conversion-gen=false + CIImageRepository string + // UnifiedControlPlaneImage specifies if a specific container image should be used for all control plane components UnifiedControlPlaneImage string @@ -115,3 +120,15 @@ type NodeConfiguration struct { // the security of kubeadm since other nodes can impersonate the master. DiscoveryTokenUnsafeSkipCAVerification bool } + +// GetControlPlaneImageRepository returns name of image repository +// for control plane images (API,Controller Manager,Scheduler and Proxy) +// It will override location with CI registry name in case user requests special +// Kubernetes version from CI build area. +// (See: kubeadmconstants.DefaultCIImageRepository) +func (cfg *MasterConfiguration) GetControlPlaneImageRepository() string { + if cfg.CIImageRepository != "" { + return cfg.CIImageRepository + } + return cfg.ImageRepository +} diff --git a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/BUILD b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/BUILD index 3feef312b9d62..b75dec730b3f9 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/BUILD +++ b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/BUILD @@ -12,10 +12,12 @@ go_library( "doc.go", "register.go", "types.go", + "zz_generated.conversion.go", "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], deps = [ + "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", diff --git a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/doc.go b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/doc.go index 4609a57d9eb0f..d0a277ec0b28b 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/doc.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/doc.go @@ -17,4 +17,5 @@ limitations under the License. // +k8s:defaulter-gen=TypeMeta // +groupName=kubeadm.k8s.io // +k8s:deepcopy-gen=package +// +k8s:conversion-gen=k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm package v1alpha1 // import "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" diff --git a/cmd/kubeadm/app/constants/constants.go b/cmd/kubeadm/app/constants/constants.go index 8a5a98c0ab7e7..c3c1d96153160 100644 --- a/cmd/kubeadm/app/constants/constants.go +++ b/cmd/kubeadm/app/constants/constants.go @@ -116,6 +116,9 @@ const ( // NodeBootstrapTokenAuthGroup specifies which group a Node Bootstrap Token should be authenticated in // TODO: This should be changed in the v1.8 dev cycle to a node-BT-specific group instead of the generic Bootstrap Token group that is used now NodeBootstrapTokenAuthGroup = "system:bootstrappers" + + // DefaultCIImageRepository points to image registry where CI uploads images from ci-cross build job + DefaultCIImageRepository = "gcr.io/kubernetes-ci-images" ) var ( diff --git a/cmd/kubeadm/app/phases/addons/proxy/proxy.go b/cmd/kubeadm/app/phases/addons/proxy/proxy.go index 3cab19681316d..98c5dfe60d69a 100644 --- a/cmd/kubeadm/app/phases/addons/proxy/proxy.go +++ b/cmd/kubeadm/app/phases/addons/proxy/proxy.go @@ -63,7 +63,7 @@ func EnsureProxyAddon(cfg *kubeadmapi.MasterConfiguration, client clientset.Inte } proxyDaemonSetBytes, err := kubeadmutil.ParseTemplate(KubeProxyDaemonSet, struct{ ImageRepository, Arch, Version, ImageOverride, ClusterCIDR, MasterTaintKey, CloudTaintKey string }{ - ImageRepository: cfg.ImageRepository, + ImageRepository: cfg.GetControlPlaneImageRepository(), Arch: runtime.GOARCH, Version: kubeadmutil.KubernetesVersionToImageTag(cfg.KubernetesVersion), ImageOverride: cfg.UnifiedControlPlaneImage, diff --git a/cmd/kubeadm/app/phases/controlplane/manifests.go b/cmd/kubeadm/app/phases/controlplane/manifests.go index ed073cedd5f82..b6d6c7d5a6dc7 100644 --- a/cmd/kubeadm/app/phases/controlplane/manifests.go +++ b/cmd/kubeadm/app/phases/controlplane/manifests.go @@ -71,7 +71,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.MasterConfiguration, k8sVersion *version. staticPodSpecs := map[string]v1.Pod{ kubeadmconstants.KubeAPIServer: staticpodutil.ComponentPod(v1.Container{ Name: kubeadmconstants.KubeAPIServer, - Image: images.GetCoreImage(kubeadmconstants.KubeAPIServer, cfg.ImageRepository, cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage), + Image: images.GetCoreImage(kubeadmconstants.KubeAPIServer, cfg.GetControlPlaneImageRepository(), cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage), Command: getAPIServerCommand(cfg, k8sVersion), VolumeMounts: mounts.GetVolumeMounts(kubeadmconstants.KubeAPIServer), LivenessProbe: staticpodutil.ComponentProbe(int(cfg.API.BindPort), "/healthz", v1.URISchemeHTTPS), @@ -80,7 +80,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.MasterConfiguration, k8sVersion *version. }, mounts.GetVolumes(kubeadmconstants.KubeAPIServer)), kubeadmconstants.KubeControllerManager: staticpodutil.ComponentPod(v1.Container{ Name: kubeadmconstants.KubeControllerManager, - Image: images.GetCoreImage(kubeadmconstants.KubeControllerManager, cfg.ImageRepository, cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage), + Image: images.GetCoreImage(kubeadmconstants.KubeControllerManager, cfg.GetControlPlaneImageRepository(), cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage), Command: getControllerManagerCommand(cfg, k8sVersion), VolumeMounts: mounts.GetVolumeMounts(kubeadmconstants.KubeControllerManager), LivenessProbe: staticpodutil.ComponentProbe(10252, "/healthz", v1.URISchemeHTTP), @@ -89,7 +89,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.MasterConfiguration, k8sVersion *version. }, mounts.GetVolumes(kubeadmconstants.KubeControllerManager)), kubeadmconstants.KubeScheduler: staticpodutil.ComponentPod(v1.Container{ Name: kubeadmconstants.KubeScheduler, - Image: images.GetCoreImage(kubeadmconstants.KubeScheduler, cfg.ImageRepository, cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage), + Image: images.GetCoreImage(kubeadmconstants.KubeScheduler, cfg.GetControlPlaneImageRepository(), cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage), Command: getSchedulerCommand(cfg), VolumeMounts: mounts.GetVolumeMounts(kubeadmconstants.KubeScheduler), LivenessProbe: staticpodutil.ComponentProbe(10251, "/healthz", v1.URISchemeHTTP), diff --git a/cmd/kubeadm/app/util/config/masterconfig.go b/cmd/kubeadm/app/util/config/masterconfig.go index 8cb6aaf018c09..7a2bb0d94bb07 100644 --- a/cmd/kubeadm/app/util/config/masterconfig.go +++ b/cmd/kubeadm/app/util/config/masterconfig.go @@ -44,6 +44,11 @@ func SetInitDynamicDefaults(cfg *kubeadmapi.MasterConfiguration) error { } cfg.API.AdvertiseAddress = ip.String() + // Requested version is automatic CI build, thus use KubernetesCI Image Repository for core images + if kubeadmutil.KubernetesIsCIVersion(cfg.KubernetesVersion) { + cfg.CIImageRepository = kubeadmconstants.DefaultCIImageRepository + } + // Validate version argument ver, err := kubeadmutil.KubernetesReleaseVersion(cfg.KubernetesVersion) if err != nil { diff --git a/cmd/kubeadm/app/util/version.go b/cmd/kubeadm/app/util/version.go index ae442701aa05a..81d521c26169d 100644 --- a/cmd/kubeadm/app/util/version.go +++ b/cmd/kubeadm/app/util/version.go @@ -25,9 +25,10 @@ import ( ) var ( - kubeReleaseBucketURL = "https://storage.googleapis.com/kubernetes-release/release" + kubeReleaseBucketURL = "https://dl.k8s.io" kubeReleaseRegex = regexp.MustCompile(`^v?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)([-0-9a-zA-Z_\.+]*)?$`) kubeReleaseLabelRegex = regexp.MustCompile(`^[[:lower:]]+(-[-\w_\.]+)?$`) + kubeBucketPrefixes = regexp.MustCompile(`^((release|ci|ci-cross)/)?([-\w_\.+]+)$`) ) // KubernetesReleaseVersion is helper function that can fetch @@ -53,22 +54,20 @@ func KubernetesReleaseVersion(version string) (string, error) { return version, nil } return "v" + version, nil - } else if kubeReleaseLabelRegex.MatchString(version) { - url := fmt.Sprintf("%s/%s.txt", kubeReleaseBucketURL, version) - resp, err := http.Get(url) - if err != nil { - return "", fmt.Errorf("unable to get URL %q: %s", url, err.Error()) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return "", fmt.Errorf("unable to fetch release information. URL: %q Status: %v", url, resp.Status) - } - body, err := ioutil.ReadAll(resp.Body) + } + + bucketURL, versionLabel, err := splitVersion(version) + if err != nil { + return "", err + } + if kubeReleaseLabelRegex.MatchString(versionLabel) { + url := fmt.Sprintf("%s/%s.txt", bucketURL, versionLabel) + body, err := fetchFromURL(url) if err != nil { - return "", fmt.Errorf("unable to read content of URL %q: %s", url, err.Error()) + return "", err } // Re-validate received version and return. - return KubernetesReleaseVersion(strings.Trim(string(body), " \t\n")) + return KubernetesReleaseVersion(body) } return "", fmt.Errorf("version %q doesn't match patterns for neither semantic version nor labels (stable, latest, ...)", version) } @@ -83,3 +82,49 @@ func KubernetesVersionToImageTag(version string) string { allowed := regexp.MustCompile(`[^-a-zA-Z0-9_\.]`) return allowed.ReplaceAllString(version, "_") } + +// KubernetesIsCIVersion checks if user requested CI version +func KubernetesIsCIVersion(version string) bool { + subs := kubeBucketPrefixes.FindAllStringSubmatch(version, 1) + if len(subs) == 1 && len(subs[0]) == 4 && strings.HasPrefix(subs[0][2], "ci") { + return true + } + return false +} + +// Internal helper: split version parts, +// Return base URL and cleaned-up version +func splitVersion(version string) (string, string, error) { + var urlSuffix string + subs := kubeBucketPrefixes.FindAllStringSubmatch(version, 1) + if len(subs) != 1 || len(subs[0]) != 4 { + return "", "", fmt.Errorf("invalid version %q", version) + } + + switch { + case strings.HasPrefix(subs[0][2], "ci"): + // Special case. CI images populated only by ci-cross area + urlSuffix = "ci-cross" + default: + urlSuffix = "release" + } + url := fmt.Sprintf("%s/%s", kubeReleaseBucketURL, urlSuffix) + return url, subs[0][3], nil +} + +// Internal helper: return content of URL +func fetchFromURL(url string) (string, error) { + resp, err := http.Get(url) + if err != nil { + return "", fmt.Errorf("unable to get URL %q: %s", url, err.Error()) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("unable to fetch file. URL: %q Status: %v", url, resp.Status) + } + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", fmt.Errorf("unable to read content of URL %q: %s", url, err.Error()) + } + return strings.TrimSpace(string(body)), nil +} diff --git a/cmd/kubeadm/app/util/version_test.go b/cmd/kubeadm/app/util/version_test.go index 491ea24344a46..a333031a5b112 100644 --- a/cmd/kubeadm/app/util/version_test.go +++ b/cmd/kubeadm/app/util/version_test.go @@ -45,7 +45,7 @@ func TestValidVersion(t *testing.T) { "v1.6.0-alpha.0.536+d60d9f3269288f", "v1.5.0-alpha.0.1078+1044b6822497da-pull", "v1.5.0-alpha.1.822+49b9e32fad9f32-pull-gke-gci", - "v1.6.1_coreos.0", + "v1.6.1+coreos.0", } for _, s := range validVersions { ver, err := KubernetesReleaseVersion(s) @@ -165,3 +165,70 @@ func TestVersionToTag(t *testing.T) { } } } + +func TestSplitVersion(t *testing.T) { + type T struct { + input string + bucket string + label string + valid bool + } + cases := []T{ + // Release area + {"v1.7.0", "https://dl.k8s.io/release", "v1.7.0", true}, + {"v1.8.0-alpha.2.1231+afabd012389d53a", "https://dl.k8s.io/release", "v1.8.0-alpha.2.1231+afabd012389d53a", true}, + {"release/v1.7.0", "https://dl.k8s.io/release", "v1.7.0", true}, + {"release/latest-1.7", "https://dl.k8s.io/release", "latest-1.7", true}, + // CI builds area, lookup actual builds at ci-cross/*.txt + {"ci-cross/latest", "https://dl.k8s.io/ci-cross", "latest", true}, + {"ci/latest-1.7", "https://dl.k8s.io/ci-cross", "latest-1.7", true}, + // unknown label in default (release) area: splitVersion validate only areas. + {"unknown-1", "https://dl.k8s.io/release", "unknown-1", true}, + // unknown area, not valid input. + {"unknown/latest-1", "", "", false}, + } + + // kubeReleaseBucketURL can be overriden during network tests, thus ensure + // it will contain value corresponding to expected outcome for this unit test + kubeReleaseBucketURL = "https://dl.k8s.io" + + for _, tc := range cases { + bucket, label, err := splitVersion(tc.input) + switch { + case err != nil && tc.valid: + t.Errorf("splitVersion: unexpected error for %q. Error: %v", tc.input, err) + case err == nil && !tc.valid: + t.Errorf("splitVersion: error expected for key %q, but result is %q, %q", tc.input, bucket, label) + case bucket != tc.bucket: + t.Errorf("splitVersion: unexpected bucket result for key %q. Expected: %q Actual: %q", tc.input, tc.bucket, bucket) + case label != tc.label: + t.Errorf("splitVersion: unexpected label result for key %q. Expected: %q Actual: %q", tc.input, tc.label, label) + } + + } +} + +func TestKubernetesIsCIVersion(t *testing.T) { + type T struct { + input string + expected bool + } + cases := []T{ + {"", false}, + // Official releases + {"v1.0.0", false}, + {"release/v1.0.0", false}, + // CI builds + {"ci/latest-1", true}, + {"ci-cross/latest", true}, + } + + for _, tc := range cases { + result := KubernetesIsCIVersion(tc.input) + t.Logf("KubernetesIsCIVersion: Input: %q. Result: %v. Expected: %v", tc.input, result, tc.expected) + if result != tc.expected { + t.Errorf("failed KubernetesIsCIVersion: Input: %q. Result: %v. Expected: %v", tc.input, result, tc.expected) + } + } + +} From 9f3ac327c753f53853136b96a2a060c97f688411 Mon Sep 17 00:00:00 2001 From: Alexander Kanevskiy Date: Mon, 14 Aug 2017 21:29:46 +0300 Subject: [PATCH 118/403] Autogenerated --- .../v1alpha1/zz_generated.conversion.go | 279 ++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.conversion.go diff --git a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.conversion.go new file mode 100644 index 0000000000000..f1f66e6e26582 --- /dev/null +++ b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.conversion.go @@ -0,0 +1,279 @@ +// +build !ignore_autogenerated + +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// This file was autogenerated by conversion-gen. Do not edit it manually! + +package v1alpha1 + +import ( + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + kubeadm "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + time "time" + unsafe "unsafe" +) + +func init() { + localSchemeBuilder.Register(RegisterConversions) +} + +// RegisterConversions adds conversion functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterConversions(scheme *runtime.Scheme) error { + return scheme.AddGeneratedConversionFuncs( + Convert_v1alpha1_API_To_kubeadm_API, + Convert_kubeadm_API_To_v1alpha1_API, + Convert_v1alpha1_Etcd_To_kubeadm_Etcd, + Convert_kubeadm_Etcd_To_v1alpha1_Etcd, + Convert_v1alpha1_MasterConfiguration_To_kubeadm_MasterConfiguration, + Convert_kubeadm_MasterConfiguration_To_v1alpha1_MasterConfiguration, + Convert_v1alpha1_Networking_To_kubeadm_Networking, + Convert_kubeadm_Networking_To_v1alpha1_Networking, + Convert_v1alpha1_NodeConfiguration_To_kubeadm_NodeConfiguration, + Convert_kubeadm_NodeConfiguration_To_v1alpha1_NodeConfiguration, + Convert_v1alpha1_TokenDiscovery_To_kubeadm_TokenDiscovery, + Convert_kubeadm_TokenDiscovery_To_v1alpha1_TokenDiscovery, + ) +} + +func autoConvert_v1alpha1_API_To_kubeadm_API(in *API, out *kubeadm.API, s conversion.Scope) error { + out.AdvertiseAddress = in.AdvertiseAddress + out.BindPort = in.BindPort + return nil +} + +// Convert_v1alpha1_API_To_kubeadm_API is an autogenerated conversion function. +func Convert_v1alpha1_API_To_kubeadm_API(in *API, out *kubeadm.API, s conversion.Scope) error { + return autoConvert_v1alpha1_API_To_kubeadm_API(in, out, s) +} + +func autoConvert_kubeadm_API_To_v1alpha1_API(in *kubeadm.API, out *API, s conversion.Scope) error { + out.AdvertiseAddress = in.AdvertiseAddress + out.BindPort = in.BindPort + return nil +} + +// Convert_kubeadm_API_To_v1alpha1_API is an autogenerated conversion function. +func Convert_kubeadm_API_To_v1alpha1_API(in *kubeadm.API, out *API, s conversion.Scope) error { + return autoConvert_kubeadm_API_To_v1alpha1_API(in, out, s) +} + +func autoConvert_v1alpha1_Etcd_To_kubeadm_Etcd(in *Etcd, out *kubeadm.Etcd, s conversion.Scope) error { + out.Endpoints = *(*[]string)(unsafe.Pointer(&in.Endpoints)) + out.CAFile = in.CAFile + out.CertFile = in.CertFile + out.KeyFile = in.KeyFile + out.DataDir = in.DataDir + out.ExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.ExtraArgs)) + out.Image = in.Image + return nil +} + +// Convert_v1alpha1_Etcd_To_kubeadm_Etcd is an autogenerated conversion function. +func Convert_v1alpha1_Etcd_To_kubeadm_Etcd(in *Etcd, out *kubeadm.Etcd, s conversion.Scope) error { + return autoConvert_v1alpha1_Etcd_To_kubeadm_Etcd(in, out, s) +} + +func autoConvert_kubeadm_Etcd_To_v1alpha1_Etcd(in *kubeadm.Etcd, out *Etcd, s conversion.Scope) error { + if in.Endpoints == nil { + out.Endpoints = make([]string, 0) + } else { + out.Endpoints = *(*[]string)(unsafe.Pointer(&in.Endpoints)) + } + out.CAFile = in.CAFile + out.CertFile = in.CertFile + out.KeyFile = in.KeyFile + out.DataDir = in.DataDir + out.ExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.ExtraArgs)) + out.Image = in.Image + return nil +} + +// Convert_kubeadm_Etcd_To_v1alpha1_Etcd is an autogenerated conversion function. +func Convert_kubeadm_Etcd_To_v1alpha1_Etcd(in *kubeadm.Etcd, out *Etcd, s conversion.Scope) error { + return autoConvert_kubeadm_Etcd_To_v1alpha1_Etcd(in, out, s) +} + +func autoConvert_v1alpha1_MasterConfiguration_To_kubeadm_MasterConfiguration(in *MasterConfiguration, out *kubeadm.MasterConfiguration, s conversion.Scope) error { + if err := Convert_v1alpha1_API_To_kubeadm_API(&in.API, &out.API, s); err != nil { + return err + } + if err := Convert_v1alpha1_Etcd_To_kubeadm_Etcd(&in.Etcd, &out.Etcd, s); err != nil { + return err + } + if err := Convert_v1alpha1_Networking_To_kubeadm_Networking(&in.Networking, &out.Networking, s); err != nil { + return err + } + out.KubernetesVersion = in.KubernetesVersion + out.CloudProvider = in.CloudProvider + out.NodeName = in.NodeName + out.AuthorizationModes = *(*[]string)(unsafe.Pointer(&in.AuthorizationModes)) + out.Token = in.Token + out.TokenTTL = time.Duration(in.TokenTTL) + out.APIServerExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.APIServerExtraArgs)) + out.ControllerManagerExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.ControllerManagerExtraArgs)) + out.SchedulerExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.SchedulerExtraArgs)) + out.APIServerCertSANs = *(*[]string)(unsafe.Pointer(&in.APIServerCertSANs)) + out.CertificatesDir = in.CertificatesDir + out.ImageRepository = in.ImageRepository + out.UnifiedControlPlaneImage = in.UnifiedControlPlaneImage + out.FeatureFlags = *(*map[string]bool)(unsafe.Pointer(&in.FeatureFlags)) + return nil +} + +// Convert_v1alpha1_MasterConfiguration_To_kubeadm_MasterConfiguration is an autogenerated conversion function. +func Convert_v1alpha1_MasterConfiguration_To_kubeadm_MasterConfiguration(in *MasterConfiguration, out *kubeadm.MasterConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha1_MasterConfiguration_To_kubeadm_MasterConfiguration(in, out, s) +} + +func autoConvert_kubeadm_MasterConfiguration_To_v1alpha1_MasterConfiguration(in *kubeadm.MasterConfiguration, out *MasterConfiguration, s conversion.Scope) error { + if err := Convert_kubeadm_API_To_v1alpha1_API(&in.API, &out.API, s); err != nil { + return err + } + if err := Convert_kubeadm_Etcd_To_v1alpha1_Etcd(&in.Etcd, &out.Etcd, s); err != nil { + return err + } + if err := Convert_kubeadm_Networking_To_v1alpha1_Networking(&in.Networking, &out.Networking, s); err != nil { + return err + } + out.KubernetesVersion = in.KubernetesVersion + out.CloudProvider = in.CloudProvider + out.NodeName = in.NodeName + if in.AuthorizationModes == nil { + out.AuthorizationModes = make([]string, 0) + } else { + out.AuthorizationModes = *(*[]string)(unsafe.Pointer(&in.AuthorizationModes)) + } + out.Token = in.Token + out.TokenTTL = time.Duration(in.TokenTTL) + out.APIServerExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.APIServerExtraArgs)) + out.ControllerManagerExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.ControllerManagerExtraArgs)) + out.SchedulerExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.SchedulerExtraArgs)) + if in.APIServerCertSANs == nil { + out.APIServerCertSANs = make([]string, 0) + } else { + out.APIServerCertSANs = *(*[]string)(unsafe.Pointer(&in.APIServerCertSANs)) + } + out.CertificatesDir = in.CertificatesDir + out.ImageRepository = in.ImageRepository + // INFO: in.CIImageRepository opted out of conversion generation + out.UnifiedControlPlaneImage = in.UnifiedControlPlaneImage + out.FeatureFlags = *(*map[string]bool)(unsafe.Pointer(&in.FeatureFlags)) + return nil +} + +// Convert_kubeadm_MasterConfiguration_To_v1alpha1_MasterConfiguration is an autogenerated conversion function. +func Convert_kubeadm_MasterConfiguration_To_v1alpha1_MasterConfiguration(in *kubeadm.MasterConfiguration, out *MasterConfiguration, s conversion.Scope) error { + return autoConvert_kubeadm_MasterConfiguration_To_v1alpha1_MasterConfiguration(in, out, s) +} + +func autoConvert_v1alpha1_Networking_To_kubeadm_Networking(in *Networking, out *kubeadm.Networking, s conversion.Scope) error { + out.ServiceSubnet = in.ServiceSubnet + out.PodSubnet = in.PodSubnet + out.DNSDomain = in.DNSDomain + return nil +} + +// Convert_v1alpha1_Networking_To_kubeadm_Networking is an autogenerated conversion function. +func Convert_v1alpha1_Networking_To_kubeadm_Networking(in *Networking, out *kubeadm.Networking, s conversion.Scope) error { + return autoConvert_v1alpha1_Networking_To_kubeadm_Networking(in, out, s) +} + +func autoConvert_kubeadm_Networking_To_v1alpha1_Networking(in *kubeadm.Networking, out *Networking, s conversion.Scope) error { + out.ServiceSubnet = in.ServiceSubnet + out.PodSubnet = in.PodSubnet + out.DNSDomain = in.DNSDomain + return nil +} + +// Convert_kubeadm_Networking_To_v1alpha1_Networking is an autogenerated conversion function. +func Convert_kubeadm_Networking_To_v1alpha1_Networking(in *kubeadm.Networking, out *Networking, s conversion.Scope) error { + return autoConvert_kubeadm_Networking_To_v1alpha1_Networking(in, out, s) +} + +func autoConvert_v1alpha1_NodeConfiguration_To_kubeadm_NodeConfiguration(in *NodeConfiguration, out *kubeadm.NodeConfiguration, s conversion.Scope) error { + out.CACertPath = in.CACertPath + out.DiscoveryFile = in.DiscoveryFile + out.DiscoveryToken = in.DiscoveryToken + out.DiscoveryTokenAPIServers = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenAPIServers)) + out.NodeName = in.NodeName + out.TLSBootstrapToken = in.TLSBootstrapToken + out.Token = in.Token + out.DiscoveryTokenCACertHashes = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenCACertHashes)) + out.DiscoveryTokenUnsafeSkipCAVerification = in.DiscoveryTokenUnsafeSkipCAVerification + return nil +} + +// Convert_v1alpha1_NodeConfiguration_To_kubeadm_NodeConfiguration is an autogenerated conversion function. +func Convert_v1alpha1_NodeConfiguration_To_kubeadm_NodeConfiguration(in *NodeConfiguration, out *kubeadm.NodeConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha1_NodeConfiguration_To_kubeadm_NodeConfiguration(in, out, s) +} + +func autoConvert_kubeadm_NodeConfiguration_To_v1alpha1_NodeConfiguration(in *kubeadm.NodeConfiguration, out *NodeConfiguration, s conversion.Scope) error { + out.CACertPath = in.CACertPath + out.DiscoveryFile = in.DiscoveryFile + out.DiscoveryToken = in.DiscoveryToken + if in.DiscoveryTokenAPIServers == nil { + out.DiscoveryTokenAPIServers = make([]string, 0) + } else { + out.DiscoveryTokenAPIServers = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenAPIServers)) + } + out.NodeName = in.NodeName + out.TLSBootstrapToken = in.TLSBootstrapToken + out.Token = in.Token + if in.DiscoveryTokenCACertHashes == nil { + out.DiscoveryTokenCACertHashes = make([]string, 0) + } else { + out.DiscoveryTokenCACertHashes = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenCACertHashes)) + } + out.DiscoveryTokenUnsafeSkipCAVerification = in.DiscoveryTokenUnsafeSkipCAVerification + return nil +} + +// Convert_kubeadm_NodeConfiguration_To_v1alpha1_NodeConfiguration is an autogenerated conversion function. +func Convert_kubeadm_NodeConfiguration_To_v1alpha1_NodeConfiguration(in *kubeadm.NodeConfiguration, out *NodeConfiguration, s conversion.Scope) error { + return autoConvert_kubeadm_NodeConfiguration_To_v1alpha1_NodeConfiguration(in, out, s) +} + +func autoConvert_v1alpha1_TokenDiscovery_To_kubeadm_TokenDiscovery(in *TokenDiscovery, out *kubeadm.TokenDiscovery, s conversion.Scope) error { + out.ID = in.ID + out.Secret = in.Secret + out.Addresses = *(*[]string)(unsafe.Pointer(&in.Addresses)) + return nil +} + +// Convert_v1alpha1_TokenDiscovery_To_kubeadm_TokenDiscovery is an autogenerated conversion function. +func Convert_v1alpha1_TokenDiscovery_To_kubeadm_TokenDiscovery(in *TokenDiscovery, out *kubeadm.TokenDiscovery, s conversion.Scope) error { + return autoConvert_v1alpha1_TokenDiscovery_To_kubeadm_TokenDiscovery(in, out, s) +} + +func autoConvert_kubeadm_TokenDiscovery_To_v1alpha1_TokenDiscovery(in *kubeadm.TokenDiscovery, out *TokenDiscovery, s conversion.Scope) error { + out.ID = in.ID + out.Secret = in.Secret + if in.Addresses == nil { + out.Addresses = make([]string, 0) + } else { + out.Addresses = *(*[]string)(unsafe.Pointer(&in.Addresses)) + } + return nil +} + +// Convert_kubeadm_TokenDiscovery_To_v1alpha1_TokenDiscovery is an autogenerated conversion function. +func Convert_kubeadm_TokenDiscovery_To_v1alpha1_TokenDiscovery(in *kubeadm.TokenDiscovery, out *TokenDiscovery, s conversion.Scope) error { + return autoConvert_kubeadm_TokenDiscovery_To_v1alpha1_TokenDiscovery(in, out, s) +} From 014b7659880d8cd0932c50b500e8c05bae6723fe Mon Sep 17 00:00:00 2001 From: Benjamin Bauer Date: Tue, 8 Aug 2017 10:50:38 -0700 Subject: [PATCH 119/403] Refactor cluster_upgrade to include statefulset upgrade tests. --- test/e2e/lifecycle/cluster_upgrade.go | 57 +++++++++++++++++++++------ 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/test/e2e/lifecycle/cluster_upgrade.go b/test/e2e/lifecycle/cluster_upgrade.go index 2a87f15f9e768..d3efc6629b32e 100644 --- a/test/e2e/lifecycle/cluster_upgrade.go +++ b/test/e2e/lifecycle/cluster_upgrade.go @@ -53,12 +53,18 @@ var upgradeTests = []upgrades.Test{ &upgrades.AppArmorUpgradeTest{}, } +var statefulsetUpgradeTests = []upgrades.Test{ + &upgrades.MySqlUpgradeTest{}, + &upgrades.EtcdUpgradeTest{}, + &upgrades.CassandraUpgradeTest{}, +} + var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { f := framework.NewDefaultFramework("cluster-upgrade") // Create the frameworks here because we can only create them // in a "Describe". - testFrameworks := createUpgradeFrameworks() + testFrameworks := createUpgradeFrameworks(upgradeTests) SIGDescribe("master upgrade", func() { It("should maintain a functioning cluster [Feature:MasterUpgrade]", func() { upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget) @@ -78,7 +84,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { framework.ExpectNoError(framework.MasterUpgrade(target)) framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target)) } - runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.MasterUpgrade, upgradeFunc) + runUpgradeSuite(f, upgradeTests, testFrameworks, testSuite, upgCtx, upgrades.MasterUpgrade, upgradeFunc) }) }) @@ -100,7 +106,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage)) framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target)) } - runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.NodeUpgrade, upgradeFunc) + runUpgradeSuite(f, upgradeTests, testFrameworks, testSuite, upgCtx, upgrades.NodeUpgrade, upgradeFunc) }) }) @@ -121,7 +127,7 @@ var _ = framework.KubeDescribe("Upgrade [Feature:Upgrade]", func() { framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage)) framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target)) } - runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.ClusterUpgrade, upgradeFunc) + runUpgradeSuite(f, upgradeTests, testFrameworks, testSuite, upgCtx, upgrades.ClusterUpgrade, upgradeFunc) }) }) }) @@ -131,7 +137,7 @@ var _ = SIGDescribe("Downgrade [Feature:Downgrade]", func() { // Create the frameworks here because we can only create them // in a "Describe". - testFrameworks := createUpgradeFrameworks() + testFrameworks := createUpgradeFrameworks(upgradeTests) SIGDescribe("cluster downgrade", func() { It("should maintain a functioning cluster [Feature:ClusterDowngrade]", func() { @@ -152,7 +158,7 @@ var _ = SIGDescribe("Downgrade [Feature:Downgrade]", func() { framework.ExpectNoError(framework.MasterUpgrade(target)) framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target)) } - runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.ClusterUpgrade, upgradeFunc) + runUpgradeSuite(f, upgradeTests, testFrameworks, testSuite, upgCtx, upgrades.ClusterUpgrade, upgradeFunc) }) }) }) @@ -162,7 +168,7 @@ var _ = SIGDescribe("etcd Upgrade [Feature:EtcdUpgrade]", func() { // Create the frameworks here because we can only create them // in a "Describe". - testFrameworks := createUpgradeFrameworks() + testFrameworks := createUpgradeFrameworks(upgradeTests) SIGDescribe("etcd upgrade", func() { It("should maintain a functioning cluster", func() { upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), "") @@ -177,7 +183,35 @@ var _ = SIGDescribe("etcd Upgrade [Feature:EtcdUpgrade]", func() { defer finalizeUpgradeTest(start, etcdTest) framework.ExpectNoError(framework.EtcdUpgrade(framework.TestContext.EtcdUpgradeStorage, framework.TestContext.EtcdUpgradeVersion)) } - runUpgradeSuite(f, testFrameworks, testSuite, upgCtx, upgrades.EtcdUpgrade, upgradeFunc) + runUpgradeSuite(f, upgradeTests, testFrameworks, testSuite, upgCtx, upgrades.EtcdUpgrade, upgradeFunc) + }) + }) +}) + +var _ = Describe("[sig-apps] stateful Upgrade [Feature:StatefulUpgrade]", func() { + f := framework.NewDefaultFramework("stateful-upgrade") + + // Create the frameworks here because we can only create them + // in a "Describe". + testFrameworks := createUpgradeFrameworks(statefulsetUpgradeTests) + framework.KubeDescribe("stateful upgrade", func() { + It("should maintain a functioning cluster", func() { + upgCtx, err := getUpgradeContext(f.ClientSet.Discovery(), framework.TestContext.UpgradeTarget) + framework.ExpectNoError(err) + + testSuite := &junit.TestSuite{Name: "Stateful upgrade"} + statefulUpgradeTest := &junit.TestCase{Name: "[sig-apps] stateful-upgrade", Classname: "upgrade_tests"} + testSuite.TestCases = append(testSuite.TestCases, statefulUpgradeTest) + upgradeFunc := func() { + start := time.Now() + defer finalizeUpgradeTest(start, statefulUpgradeTest) + target := upgCtx.Versions[1].Version.String() + framework.ExpectNoError(framework.MasterUpgrade(target)) + framework.ExpectNoError(framework.CheckMasterVersion(f.ClientSet, target)) + framework.ExpectNoError(framework.NodeUpgrade(f, target, framework.TestContext.UpgradeImage)) + framework.ExpectNoError(framework.CheckNodesVersions(f.ClientSet, target)) + } + runUpgradeSuite(f, statefulsetUpgradeTests, testFrameworks, testSuite, upgCtx, upgrades.ClusterUpgrade, upgradeFunc) }) }) }) @@ -241,10 +275,10 @@ func finalizeUpgradeTest(start time.Time, tc *junit.TestCase) { } } -func createUpgradeFrameworks() map[string]*framework.Framework { +func createUpgradeFrameworks(tests []upgrades.Test) map[string]*framework.Framework { nsFilter := regexp.MustCompile("[^[:word:]-]+") // match anything that's not a word character or hyphen testFrameworks := map[string]*framework.Framework{} - for _, t := range upgradeTests { + for _, t := range tests { ns := nsFilter.ReplaceAllString(t.Name(), "-") // and replace with a single hyphen ns = strings.Trim(ns, "-") testFrameworks[t.Name()] = framework.NewDefaultFramework(ns) @@ -254,6 +288,7 @@ func createUpgradeFrameworks() map[string]*framework.Framework { func runUpgradeSuite( f *framework.Framework, + tests []upgrades.Test, testFrameworks map[string]*framework.Framework, testSuite *junit.TestSuite, upgCtx *upgrades.UpgradeContext, @@ -264,7 +299,7 @@ func runUpgradeSuite( framework.ExpectNoError(err) cm := chaosmonkey.New(upgradeFunc) - for _, t := range upgradeTests { + for _, t := range tests { testCase := &junit.TestCase{ Name: t.Name(), Classname: "upgrade_tests", From fa71aac011368d041063d0e6b86fc74bd55a27d2 Mon Sep 17 00:00:00 2001 From: Seth Jennings Date: Mon, 14 Aug 2017 12:53:25 -0500 Subject: [PATCH 120/403] bump(github.com/google/cadvisor): 27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6 --- Godeps/Godeps.json | 164 +++++++++--------- .../github.com/google/cadvisor/api/handler.go | 4 +- .../cadvisor/container/common/helpers.go | 19 +- .../cadvisor/devicemapper/thin_ls_client.go | 2 +- vendor/github.com/google/cadvisor/fs/fs.go | 69 ++++++-- .../google/cadvisor/http/handlers.go | 12 +- .../google/cadvisor/info/v1/machine.go | 11 ++ .../google/cadvisor/info/v2/machine.go | 3 + .../google/cadvisor/machine/info.go | 49 ++++++ .../google/cadvisor/manager/container.go | 10 +- .../google/cadvisor/manager/manager.go | 6 +- .../google/cadvisor/metrics/prometheus.go | 86 +++++++++ .../google/cadvisor/pages/containers.go | 9 +- .../google/cadvisor/pages/docker.go | 19 +- .../github.com/google/cadvisor/pages/pages.go | 20 +-- .../google/cadvisor/pages/static/BUILD | 1 + .../google/cadvisor/pages/static/assets.go | 16 +- .../google/cadvisor/pages/static/static.go | 15 +- .../google/cadvisor/pages/templates.go | 2 +- .../cadvisor/utils/oomparser/oomparser.go | 2 +- 20 files changed, 348 insertions(+), 171 deletions(-) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 5ab012331896e..a99dd30b7c14c 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1336,208 +1336,208 @@ }, { "ImportPath": "github.com/google/cadvisor/api", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/cache/memory", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/client/v2", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/collector", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/container", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/container/common", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/container/docker", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/container/libcontainer", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/container/raw", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/container/rkt", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/container/systemd", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/devicemapper", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/events", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/fs", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/healthz", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/http", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/http/mux", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/info/v1", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/info/v2", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/machine", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/manager", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher/raw", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher/rkt", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/metrics", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/pages", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/pages/static", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/storage", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/summary", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/utils", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/utils/cloudinfo", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/utils/cpuload", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/utils/cpuload/netlink", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/utils/docker", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/utils/oomparser", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/utils/sysfs", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/utils/sysinfo", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/utils/tail", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/validate", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/version", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/cadvisor/zfs", - "Comment": "v0.26.1", - "Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1" + "Comment": "v0.26.0-37-g27e1acb", + "Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6" }, { "ImportPath": "github.com/google/certificate-transparency/go", diff --git a/vendor/github.com/google/cadvisor/api/handler.go b/vendor/github.com/google/cadvisor/api/handler.go index b6ee725d45b8e..bf9e2c80a0d5c 100644 --- a/vendor/github.com/google/cadvisor/api/handler.go +++ b/vendor/github.com/google/cadvisor/api/handler.go @@ -85,7 +85,7 @@ func handleRequest(supportedApiVersions map[string]ApiVersion, m manager.Manager versions = append(versions, v) } sort.Strings(versions) - fmt.Fprintf(w, "Supported API versions: %s", strings.Join(versions, ",")) + http.Error(w, fmt.Sprintf("Supported API versions: %s", strings.Join(versions, ",")), http.StatusBadRequest) return nil } @@ -109,7 +109,7 @@ func handleRequest(supportedApiVersions map[string]ApiVersion, m manager.Manager if requestType == "" { requestTypes := versionHandler.SupportedRequestTypes() sort.Strings(requestTypes) - fmt.Fprintf(w, "Supported request types: %q", strings.Join(requestTypes, ",")) + http.Error(w, fmt.Sprintf("Supported request types: %q", strings.Join(requestTypes, ",")), http.StatusBadRequest) return nil } diff --git a/vendor/github.com/google/cadvisor/container/common/helpers.go b/vendor/github.com/google/cadvisor/container/common/helpers.go index 33d9db3730238..f5539b5d1ac9f 100644 --- a/vendor/github.com/google/cadvisor/container/common/helpers.go +++ b/vendor/github.com/google/cadvisor/container/common/helpers.go @@ -127,15 +127,13 @@ func GetSpec(cgroupPaths map[string]string, machineInfoFactory info.MachineInfoF func readString(dirpath string, file string) string { cgroupFile := path.Join(dirpath, file) - // Ignore non-existent files - if !utils.FileExists(cgroupFile) { - return "" - } - // Read out, err := ioutil.ReadFile(cgroupFile) if err != nil { - glog.Errorf("readString: Failed to read %q: %s", cgroupFile, err) + // Ignore non-existent files + if !os.IsNotExist(err) { + glog.Errorf("readString: Failed to read %q: %s", cgroupFile, err) + } return "" } return strings.TrimSpace(string(out)) @@ -158,13 +156,12 @@ func readUInt64(dirpath string, file string) uint64 { // Lists all directories under "path" and outputs the results as children of "parent". func ListDirectories(dirpath string, parent string, recursive bool, output map[string]struct{}) error { - // Ignore if this hierarchy does not exist. - if !utils.FileExists(dirpath) { - return nil - } - entries, err := ioutil.ReadDir(dirpath) if err != nil { + // Ignore if this hierarchy does not exist. + if os.IsNotExist(err) { + err = nil + } return err } for _, entry := range entries { diff --git a/vendor/github.com/google/cadvisor/devicemapper/thin_ls_client.go b/vendor/github.com/google/cadvisor/devicemapper/thin_ls_client.go index 130172a05e60a..29737434bfd69 100644 --- a/vendor/github.com/google/cadvisor/devicemapper/thin_ls_client.go +++ b/vendor/github.com/google/cadvisor/devicemapper/thin_ls_client.go @@ -80,7 +80,7 @@ func parseThinLsOutput(output []byte) map[string]uint64 { deviceID := fields[0] usage, err := strconv.ParseUint(fields[1], 10, 64) if err != nil { - glog.Warning("unexpected error parsing thin_ls output: %v", err) + glog.Warningf("unexpected error parsing thin_ls output: %v", err) continue } diff --git a/vendor/github.com/google/cadvisor/fs/fs.go b/vendor/github.com/google/cadvisor/fs/fs.go index d5b7072d02941..de40d5fd28698 100644 --- a/vendor/github.com/google/cadvisor/fs/fs.go +++ b/vendor/github.com/google/cadvisor/fs/fs.go @@ -79,6 +79,8 @@ type RealFsInfo struct { // Map from label to block device path. // Labels are intent-specific tags that are auto-detected. labels map[string]string + // Map from mountpoint to mount information. + mounts map[string]*mount.Info // devicemapper client dmsetup devicemapper.DmsetupClient } @@ -106,9 +108,14 @@ func NewFsInfo(context Context) (FsInfo, error) { fsInfo := &RealFsInfo{ partitions: processMounts(mounts, excluded), labels: make(map[string]string, 0), + mounts: make(map[string]*mount.Info, 0), dmsetup: devicemapper.NewDmsetupClient(), } + for _, mount := range mounts { + fsInfo.mounts[mount.Mountpoint] = mount + } + fsInfo.addRktImagesLabel(context, mounts) // need to call this before the log line below printing out the partitions, as this function may // add a "partition" for devicemapper to fsInfo.partitions @@ -125,6 +132,7 @@ func processMounts(mounts []*mount.Info, excludedMountpointPrefixes []string) ma supportedFsType := map[string]bool{ // all ext systems are checked through prefix. "btrfs": true, + "tmpfs": true, "xfs": true, "zfs": true, } @@ -152,25 +160,12 @@ func processMounts(mounts []*mount.Info, excludedMountpointPrefixes []string) ma // btrfs fix: following workaround fixes wrong btrfs Major and Minor Ids reported in /proc/self/mountinfo. // instead of using values from /proc/self/mountinfo we use stat to get Ids from btrfs mount point if mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") { - - buf := new(syscall.Stat_t) - err := syscall.Stat(mount.Source, buf) + major, minor, err := getBtrfsMajorMinorIds(mount) if err != nil { - glog.Warningf("stat failed on %s with error: %s", mount.Source, err) + glog.Warningf("%s", err) } else { - glog.Infof("btrfs mount %#v", mount) - if buf.Mode&syscall.S_IFMT == syscall.S_IFBLK { - err := syscall.Stat(mount.Mountpoint, buf) - if err != nil { - glog.Warningf("stat failed on %s with error: %s", mount.Mountpoint, err) - } else { - glog.Infof("btrfs dev major:minor %d:%d\n", int(major(buf.Dev)), int(minor(buf.Dev))) - glog.Infof("btrfs rdev major:minor %d:%d\n", int(major(buf.Rdev)), int(minor(buf.Rdev))) - - mount.Major = int(major(buf.Dev)) - mount.Minor = int(minor(buf.Dev)) - } - } + mount.Major = major + mount.Minor = minor } } @@ -444,6 +439,7 @@ func (self *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) { if err != nil { return nil, fmt.Errorf("stat failed on %s with error: %s", dir, err) } + major := major(buf.Dev) minor := minor(buf.Dev) for device, partition := range self.partitions { @@ -451,6 +447,16 @@ func (self *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) { return &DeviceInfo{device, major, minor}, nil } } + + mount, found := self.mounts[dir] + if found && mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") { + major, minor, err := getBtrfsMajorMinorIds(mount) + if err != nil { + glog.Warningf("%s", err) + } else { + return &DeviceInfo{mount.Source, uint(major), uint(minor)}, nil + } + } return nil, fmt.Errorf("could not find device with major: %d, minor: %d in cached partitions map", major, minor) } @@ -644,3 +650,32 @@ func (b *byteCounter) Write(p []byte) (int, error) { b.bytesWritten += uint64(len(p)) return len(p), nil } + +// Get major and minor Ids for a mount point using btrfs as filesystem. +func getBtrfsMajorMinorIds(mount *mount.Info) (int, int, error) { + // btrfs fix: following workaround fixes wrong btrfs Major and Minor Ids reported in /proc/self/mountinfo. + // instead of using values from /proc/self/mountinfo we use stat to get Ids from btrfs mount point + + buf := new(syscall.Stat_t) + err := syscall.Stat(mount.Source, buf) + if err != nil { + err = fmt.Errorf("stat failed on %s with error: %s", mount.Source, err) + return 0, 0, err + } + + glog.Infof("btrfs mount %#v", mount) + if buf.Mode&syscall.S_IFMT == syscall.S_IFBLK { + err := syscall.Stat(mount.Mountpoint, buf) + if err != nil { + err = fmt.Errorf("stat failed on %s with error: %s", mount.Mountpoint, err) + return 0, 0, err + } + + glog.Infof("btrfs dev major:minor %d:%d\n", int(major(buf.Dev)), int(minor(buf.Dev))) + glog.Infof("btrfs rdev major:minor %d:%d\n", int(major(buf.Rdev)), int(minor(buf.Rdev))) + + return int(major(buf.Dev)), int(minor(buf.Dev)), nil + } else { + return 0, 0, fmt.Errorf("%s is not a block device", mount.Source) + } +} diff --git a/vendor/github.com/google/cadvisor/http/handlers.go b/vendor/github.com/google/cadvisor/http/handlers.go index c1a1f58f4e52a..a2b4055dde0ac 100644 --- a/vendor/github.com/google/cadvisor/http/handlers.go +++ b/vendor/github.com/google/cadvisor/http/handlers.go @@ -44,7 +44,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut mux.HandleFunc(validate.ValidatePage, func(w http.ResponseWriter, r *http.Request) { err := validate.HandleRequest(w, containerManager) if err != nil { - fmt.Fprintf(w, "%s", err) + http.Error(w, err.Error(), http.StatusInternalServerError) } }) @@ -104,15 +104,9 @@ func RegisterPrometheusHandler(mux httpmux.Mux, containerManager manager.Manager } func staticHandlerNoAuth(w http.ResponseWriter, r *http.Request) { - err := static.HandleRequest(w, r.URL) - if err != nil { - fmt.Fprintf(w, "%s", err) - } + static.HandleRequest(w, r.URL) } func staticHandler(w http.ResponseWriter, r *auth.AuthenticatedRequest) { - err := static.HandleRequest(w, r.URL) - if err != nil { - fmt.Fprintf(w, "%s", err) - } + static.HandleRequest(w, r.URL) } diff --git a/vendor/github.com/google/cadvisor/info/v1/machine.go b/vendor/github.com/google/cadvisor/info/v1/machine.go index 9395ceaae904d..cf5e828d9e556 100644 --- a/vendor/github.com/google/cadvisor/info/v1/machine.go +++ b/vendor/github.com/google/cadvisor/info/v1/machine.go @@ -94,6 +94,14 @@ func (self *Node) AddPerCoreCache(c Cache) { } } +type HugePagesInfo struct { + // huge page size (in kB) + PageSize uint64 `json:"page_size"` + + // number of huge pages + NumPages uint64 `json:"num_pages"` +} + type DiskInfo struct { // device name Name string `json:"name"` @@ -158,6 +166,9 @@ type MachineInfo struct { // The amount of memory (in bytes) in this machine MemoryCapacity uint64 `json:"memory_capacity"` + // HugePages on this machine. + HugePages []HugePagesInfo `json:"hugepages"` + // The machine id MachineID string `json:"machine_id"` diff --git a/vendor/github.com/google/cadvisor/info/v2/machine.go b/vendor/github.com/google/cadvisor/info/v2/machine.go index ecf04bf58d5cc..d89f1f3909241 100644 --- a/vendor/github.com/google/cadvisor/info/v2/machine.go +++ b/vendor/github.com/google/cadvisor/info/v2/machine.go @@ -52,6 +52,9 @@ type Attributes struct { // The system uuid SystemUUID string `json:"system_uuid"` + // HugePages on this machine. + HugePages []v1.HugePagesInfo `json:"hugepages"` + // Filesystems on this machine. Filesystems []v1.FsInfo `json:"filesystems"` diff --git a/vendor/github.com/google/cadvisor/machine/info.go b/vendor/github.com/google/cadvisor/machine/info.go index b08e9a8e9dbb4..a58321d595a62 100644 --- a/vendor/github.com/google/cadvisor/machine/info.go +++ b/vendor/github.com/google/cadvisor/machine/info.go @@ -17,8 +17,10 @@ package machine import ( "bytes" "flag" + "fmt" "io/ioutil" "path/filepath" + "strconv" "strings" "syscall" @@ -31,6 +33,8 @@ import ( "github.com/golang/glog" ) +const hugepagesDirectory = "/sys/kernel/mm/hugepages/" + var machineIdFilePath = flag.String("machine_id_file", "/etc/machine-id,/var/lib/dbus/machine-id", "Comma-separated list of files to check for machine-id. Use the first one that exists.") var bootIdFilePath = flag.String("boot_id_file", "/proc/sys/kernel/random/boot_id", "Comma-separated list of files to check for boot-id. Use the first one that exists.") @@ -48,6 +52,45 @@ func getInfoFromFiles(filePaths string) string { return "" } +// GetHugePagesInfo returns information about pre-allocated huge pages +func GetHugePagesInfo() ([]info.HugePagesInfo, error) { + var hugePagesInfo []info.HugePagesInfo + files, err := ioutil.ReadDir(hugepagesDirectory) + if err != nil { + // treat as non-fatal since kernels and machine can be + // configured to disable hugepage support + return hugePagesInfo, nil + } + for _, st := range files { + nameArray := strings.Split(st.Name(), "-") + pageSizeArray := strings.Split(nameArray[1], "kB") + pageSize, err := strconv.ParseUint(string(pageSizeArray[0]), 10, 64) + if err != nil { + return hugePagesInfo, err + } + + numFile := hugepagesDirectory + st.Name() + "/nr_hugepages" + val, err := ioutil.ReadFile(numFile) + if err != nil { + return hugePagesInfo, err + } + var numPages uint64 + // we use sscanf as the file as a new-line that trips up ParseUint + // it returns the number of tokens successfully parsed, so if + // n != 1, it means we were unable to parse a number from the file + n, err := fmt.Sscanf(string(val), "%d", &numPages) + if err != nil || n != 1 { + return hugePagesInfo, fmt.Errorf("could not parse file %v contents %q", numFile, string(val)) + } + + hugePagesInfo = append(hugePagesInfo, info.HugePagesInfo{ + NumPages: numPages, + PageSize: pageSize, + }) + } + return hugePagesInfo, nil +} + func Info(sysFs sysfs.SysFs, fsInfo fs.FsInfo, inHostNamespace bool) (*info.MachineInfo, error) { rootFs := "/" if !inHostNamespace { @@ -65,6 +108,11 @@ func Info(sysFs sysfs.SysFs, fsInfo fs.FsInfo, inHostNamespace bool) (*info.Mach return nil, err } + hugePagesInfo, err := GetHugePagesInfo() + if err != nil { + return nil, err + } + filesystems, err := fsInfo.GetGlobalFsInfo() if err != nil { glog.Errorf("Failed to get global filesystem information: %v", err) @@ -99,6 +147,7 @@ func Info(sysFs sysfs.SysFs, fsInfo fs.FsInfo, inHostNamespace bool) (*info.Mach NumCores: numCores, CpuFrequency: clockSpeed, MemoryCapacity: memoryCapacity, + HugePages: hugePagesInfo, DiskMap: diskMap, NetworkDevices: netDevices, Topology: topology, diff --git a/vendor/github.com/google/cadvisor/manager/container.go b/vendor/github.com/google/cadvisor/manager/container.go index 53d8cad30d8ee..4924db5b5e6b6 100644 --- a/vendor/github.com/google/cadvisor/manager/container.go +++ b/vendor/github.com/google/cadvisor/manager/container.go @@ -113,16 +113,18 @@ func (c *containerData) allowErrorLogging() bool { return false } -func (c *containerData) GetInfo() (*containerInfo, error) { +func (c *containerData) GetInfo(shouldUpdateSubcontainers bool) (*containerInfo, error) { // Get spec and subcontainers. if time.Since(c.lastUpdatedTime) > 5*time.Second { err := c.updateSpec() if err != nil { return nil, err } - err = c.updateSubcontainers() - if err != nil { - return nil, err + if shouldUpdateSubcontainers { + err = c.updateSubcontainers() + if err != nil { + return nil, err + } } c.lastUpdatedTime = time.Now() } diff --git a/vendor/github.com/google/cadvisor/manager/manager.go b/vendor/github.com/google/cadvisor/manager/manager.go index 6e4a02be9cd5a..39fc85b75a34e 100644 --- a/vendor/github.com/google/cadvisor/manager/manager.go +++ b/vendor/github.com/google/cadvisor/manager/manager.go @@ -400,7 +400,7 @@ func (self *manager) GetContainerSpec(containerName string, options v2.RequestOp var errs partialFailure specs := make(map[string]v2.ContainerSpec) for name, cont := range conts { - cinfo, err := cont.GetInfo() + cinfo, err := cont.GetInfo(false) if err != nil { errs.append(name, "GetInfo", err) } @@ -449,7 +449,7 @@ func (self *manager) GetContainerInfoV2(containerName string, options v2.Request infos := make(map[string]v2.ContainerInfo, len(containers)) for name, container := range containers { result := v2.ContainerInfo{} - cinfo, err := container.GetInfo() + cinfo, err := container.GetInfo(false) if err != nil { errs.append(name, "GetInfo", err) infos[name] = result @@ -473,7 +473,7 @@ func (self *manager) GetContainerInfoV2(containerName string, options v2.Request func (self *manager) containerDataToContainerInfo(cont *containerData, query *info.ContainerInfoRequest) (*info.ContainerInfo, error) { // Get the info from the container. - cinfo, err := cont.GetInfo() + cinfo, err := cont.GetInfo(true) if err != nil { return nil, err } diff --git a/vendor/github.com/google/cadvisor/metrics/prometheus.go b/vendor/github.com/google/cadvisor/metrics/prometheus.go index 87d53e946e38d..2c766d66489c5 100644 --- a/vendor/github.com/google/cadvisor/metrics/prometheus.go +++ b/vendor/github.com/google/cadvisor/metrics/prometheus.go @@ -189,6 +189,13 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo getValues: func(s *info.ContainerStats) metricValues { return metricValues{{value: float64(s.Cpu.CFS.ThrottledTime) / float64(time.Second)}} }, + }, { + name: "container_cpu_load_average_10s", + help: "Value of container cpu load average over the last 10 seconds.", + valueType: prometheus.GaugeValue, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{{value: float64(s.Cpu.LoadAverage)}} + }, }, { name: "container_memory_cache", help: "Number of bytes of page cache memory.", @@ -578,6 +585,84 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo } return values }, + }, { + name: "container_network_tcp_usage_total", + help: "tcp connection usage statistic for container", + valueType: prometheus.GaugeValue, + extraLabels: []string{"tcp_state"}, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{ + { + value: float64(s.Network.Tcp.Established), + labels: []string{"established"}, + }, + { + value: float64(s.Network.Tcp.SynSent), + labels: []string{"synsent"}, + }, + { + value: float64(s.Network.Tcp.SynRecv), + labels: []string{"synrecv"}, + }, + { + value: float64(s.Network.Tcp.FinWait1), + labels: []string{"finwait1"}, + }, + { + value: float64(s.Network.Tcp.FinWait2), + labels: []string{"finwait2"}, + }, + { + value: float64(s.Network.Tcp.TimeWait), + labels: []string{"timewait"}, + }, + { + value: float64(s.Network.Tcp.Close), + labels: []string{"close"}, + }, + { + value: float64(s.Network.Tcp.CloseWait), + labels: []string{"closewait"}, + }, + { + value: float64(s.Network.Tcp.LastAck), + labels: []string{"lastack"}, + }, + { + value: float64(s.Network.Tcp.Listen), + labels: []string{"listen"}, + }, + { + value: float64(s.Network.Tcp.Closing), + labels: []string{"closing"}, + }, + } + }, + }, { + name: "container_network_udp_usage_total", + help: "udp connection usage statistic for container", + valueType: prometheus.GaugeValue, + extraLabels: []string{"udp_state"}, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{ + { + value: float64(s.Network.Udp.Listen), + labels: []string{"listen"}, + }, + { + value: float64(s.Network.Udp.Dropped), + labels: []string{"dropped"}, + }, + { + value: float64(s.Network.Udp.RxQueued), + labels: []string{"rxqueued"}, + }, + { + value: float64(s.Network.Udp.TxQueued), + labels: []string{"txqueued"}, + }, + } + }, }, { name: "container_tasks_state", help: "Number of tasks in given state", @@ -610,6 +695,7 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo }, }, } + return c } diff --git a/vendor/github.com/google/cadvisor/pages/containers.go b/vendor/github.com/google/cadvisor/pages/containers.go index 2b15965d45b50..8f29815224d49 100644 --- a/vendor/github.com/google/cadvisor/pages/containers.go +++ b/vendor/github.com/google/cadvisor/pages/containers.go @@ -163,7 +163,7 @@ func printUnit(bytes uint64) string { return ByteSize(bytes).Unit() } -func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error { +func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) { start := time.Now() // The container name is the path after the handler @@ -175,14 +175,16 @@ func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) e } cont, err := m.GetContainerInfo(containerName, &reqParams) if err != nil { - return fmt.Errorf("failed to get container %q with error: %v", containerName, err) + http.Error(w, fmt.Sprintf("failed to get container %q with error: %v", containerName, err), http.StatusNotFound) + return } displayName := getContainerDisplayName(cont.ContainerReference) // Get the MachineInfo machineInfo, err := m.GetMachineInfo() if err != nil { - return err + http.Error(w, fmt.Sprintf("failed to get machine info: %v", err), http.StatusInternalServerError) + return } rootDir := getRootDir(containerName) @@ -241,7 +243,6 @@ func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) e } glog.V(5).Infof("Request took %s", time.Since(start)) - return nil } // Build a relative path to the root of the container page. diff --git a/vendor/github.com/google/cadvisor/pages/docker.go b/vendor/github.com/google/cadvisor/pages/docker.go index 3d40e2f662832..4fb2f6bc76fc7 100644 --- a/vendor/github.com/google/cadvisor/pages/docker.go +++ b/vendor/github.com/google/cadvisor/pages/docker.go @@ -51,7 +51,7 @@ func toStatusKV(status info.DockerStatus) ([]keyVal, []keyVal) { }, ds } -func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error { +func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) { start := time.Now() // The container name is the path after the handler @@ -66,7 +66,8 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error } conts, err := m.AllDockerContainers(&reqParams) if err != nil { - return fmt.Errorf("failed to get container %q with error: %v", containerName, err) + http.Error(w, fmt.Sprintf("failed to get container %q with error: %v", containerName, err), http.StatusNotFound) + return } subcontainers := make([]link, 0, len(conts)) for _, cont := range conts { @@ -79,14 +80,16 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error // Get Docker status status, err := m.DockerInfo() if err != nil { - return err + http.Error(w, fmt.Sprintf("failed to get docker info: %v", err), http.StatusInternalServerError) + return } dockerStatus, driverStatus := toStatusKV(status) // Get Docker Images images, err := m.DockerImages() if err != nil { - return err + http.Error(w, fmt.Sprintf("failed to get docker images: %v", err), http.StatusInternalServerError) + return } dockerContainersText := "Docker Containers" @@ -110,7 +113,8 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error } cont, err := m.DockerContainer(containerName[1:], &reqParams) if err != nil { - return fmt.Errorf("failed to get container %q with error: %v", containerName, err) + http.Error(w, fmt.Sprintf("failed to get container %q with error: %v", containerName, err), http.StatusNotFound) + return } displayName := getContainerDisplayName(cont.ContainerReference) @@ -128,7 +132,8 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error // Get the MachineInfo machineInfo, err := m.GetMachineInfo() if err != nil { - return err + http.Error(w, fmt.Sprintf("failed to get machine info: %v", err), http.StatusInternalServerError) + return } data = &pageData{ DisplayName: displayName, @@ -153,5 +158,5 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error } glog.V(5).Infof("Request took %s", time.Since(start)) - return nil + return } diff --git a/vendor/github.com/google/cadvisor/pages/pages.go b/vendor/github.com/google/cadvisor/pages/pages.go index 48f613561727e..7568b2ac3d745 100644 --- a/vendor/github.com/google/cadvisor/pages/pages.go +++ b/vendor/github.com/google/cadvisor/pages/pages.go @@ -77,37 +77,25 @@ func init() { func containerHandlerNoAuth(containerManager manager.Manager) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - err := serveContainersPage(containerManager, w, r.URL) - if err != nil { - fmt.Fprintf(w, "%s", err) - } + serveContainersPage(containerManager, w, r.URL) } } func containerHandler(containerManager manager.Manager) auth.AuthenticatedHandlerFunc { return func(w http.ResponseWriter, r *auth.AuthenticatedRequest) { - err := serveContainersPage(containerManager, w, r.URL) - if err != nil { - fmt.Fprintf(w, "%s", err) - } + serveContainersPage(containerManager, w, r.URL) } } func dockerHandlerNoAuth(containerManager manager.Manager) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - err := serveDockerPage(containerManager, w, r.URL) - if err != nil { - fmt.Fprintf(w, "%s", err) - } + serveDockerPage(containerManager, w, r.URL) } } func dockerHandler(containerManager manager.Manager) auth.AuthenticatedHandlerFunc { return func(w http.ResponseWriter, r *auth.AuthenticatedRequest) { - err := serveDockerPage(containerManager, w, r.URL) - if err != nil { - fmt.Fprintf(w, "%s", err) - } + serveDockerPage(containerManager, w, r.URL) } } diff --git a/vendor/github.com/google/cadvisor/pages/static/BUILD b/vendor/github.com/google/cadvisor/pages/static/BUILD index 6a4fee907a371..99a38f5fb5573 100644 --- a/vendor/github.com/google/cadvisor/pages/static/BUILD +++ b/vendor/github.com/google/cadvisor/pages/static/BUILD @@ -7,6 +7,7 @@ go_library( "static.go", ], visibility = ["//visibility:public"], + deps = ["//vendor/github.com/golang/glog:go_default_library"], ) filegroup( diff --git a/vendor/github.com/google/cadvisor/pages/static/assets.go b/vendor/github.com/google/cadvisor/pages/static/assets.go index 5ab69b87530b5..0aa57596c3c10 100644 --- a/vendor/github.com/google/cadvisor/pages/static/assets.go +++ b/vendor/github.com/google/cadvisor/pages/static/assets.go @@ -90,7 +90,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _pagesAssetsJsBootstrap311MinJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xd4\x7d\xeb\x73\xdb\x46\x92\xf8\xf7\xfd\x2b\x48\x24\x3f\x09\x30\xc1\x87\xec\x4d\xed\x16\x69\x88\x95\x78\xbd\xf5\xcb\x55\x92\xcd\x6d\xbc\x95\xaa\xe3\x6a\xaf\xf0\x18\x90\x90\x20\x82\x01\x40\xd9\x5e\x89\xf7\xb7\x5f\xf7\xbc\x67\x30\x20\x29\xc5\x5f\xee\x8b\x4d\x00\xf3\xe8\xe9\xe9\x77\xf7\x8c\xa6\xaf\x86\x7f\x18\xbc\x1a\x7c\x57\x55\x6d\xd3\xd6\xf1\x6e\xf0\xf0\x66\x72\x35\xb9\x1a\xf8\x9b\xb6\xdd\xcd\xa7\xd3\x35\x69\x13\xf1\x6d\x92\x56\xf7\x01\xb6\x7e\x57\xed\x3e\xd7\xc5\x7a\xd3\x0e\x5e\xcf\xae\xae\xc6\xf0\xcf\x1f\x07\x1f\x3e\x16\x6d\x4b\xea\x70\xf0\xfd\x36\x9d\x60\xa3\x1f\x8a\x94\x6c\x1b\x92\x0d\xf6\xdb\x8c\xd4\x83\x1f\xbf\xff\xc0\x06\x6d\x70\xd4\xa2\xdd\xec\x13\x1c\x6f\xda\x7e\x4c\x9a\xa9\x9c\x62\x9a\x94\x55\x32\xbd\x8f\x1b\x18\x6a\xfa\xc3\xf7\xef\xde\xff\xf4\xcb\x7b\x9c\x72\xfa\x87\x22\xf7\x3d\x1c\x29\x2f\xb6\x24\xf3\xa2\xa8\xfd\xbc\x23\x55\x3e\xb8\xfd\xcf\x3d\xa9\x3f\x07\xed\xa6\xae\x3e\x0e\xb6\xe4\xe3\xe0\x7d\x5d\x57\xb5\xef\xc9\x05\x5d\x36\x83\xff\x88\x1f\xe2\x5f\xd2\xba\xd8\xb5\x83\x9a\xfc\xb6\x2f\x6a\xd2\xf0\x7e\x5e\xb0\x18\xe5\xfb\x6d\xda\x16\xd5\xd6\x8f\x83\x47\x6f\xdf\x90\x01\x74\x2b\xd2\xd6\x5b\x88\x0f\x83\xc4\x0f\x1e\x1f\xe2\x7a\x10\x47\x59\x95\xee\xef\xc9\xb6\x9d\xa4\x35\x89\x5b\xf2\xbe\x24\xf8\xe4\x7b\x12\x7e\x2f\x08\x93\xe8\xf1\x57\x92\xdc\x15\xed\x87\x3a\xde\x36\x05\x8e\x30\xf7\x3e\x5a\x6f\xde\x6f\x33\x2f\xfc\xb1\xfa\xb7\xde\xa6\x95\xbf\x09\x7e\xfd\x9b\xfe\xad\x32\xba\x0e\x2a\xab\x6d\xdb\x3b\xcc\x61\x91\x03\x3a\x10\xfa\x74\x50\xc0\x52\x02\xc0\xe3\x43\x55\x64\x83\xd9\x30\x8a\xe2\x49\xd3\x7e\x2e\xc9\x2a\xbd\x09\x6a\xd2\xee\xeb\xed\x23\x74\x99\x27\xf0\x7c\x58\xb0\x17\xc3\xab\x43\x3c\xc9\xb7\x13\x72\xbf\x2f\x61\xc1\x06\x14\x91\xc4\x5c\xc2\xf0\x93\x46\xc3\xab\x30\x8b\xda\x4d\xd1\x2c\x62\x1f\xff\x0b\x26\x00\x85\x0f\xd3\xec\x77\xbb\xaa\x6e\x27\x0a\xb6\x09\xcc\x14\xca\x01\x82\x47\xe8\x3b\x3b\x04\x0b\x1c\x86\x44\xfa\xfb\xa7\xa7\xd8\xcf\x02\xe8\x59\xac\xd7\xa4\xee\x1d\x2b\x10\x10\x0f\x1a\xd2\x7e\x28\xee\x49\xb5\x6f\x7d\x12\x26\x41\x88\x70\x1c\xc2\xd8\xd7\x06\x75\x0d\x12\xc1\x2e\x1f\x82\x83\xcf\x09\x2a\xec\xa7\x0b\x84\x31\x89\x2e\x57\x59\xdc\xc6\xe3\xac\x68\xee\x8b\xa6\x89\xbc\xb8\x24\x75\xeb\xdd\x5c\x86\xa9\x02\x3f\x85\xa9\xe0\x1f\x40\x82\xef\xa5\x65\x91\xde\x79\x61\x42\xe1\x99\xa4\x65\xd5\x10\x80\x39\x9d\xec\xea\xaa\xad\x90\x98\xd9\x3b\x03\xa9\x92\x02\x53\x00\x3a\x97\x38\xf0\x68\xcb\x6c\x92\x34\x13\x36\x6b\x30\xa9\xc9\x7d\xf5\x40\x60\x05\x08\x5c\x16\x71\xec\x87\x24\xca\x26\x71\xdb\x42\x17\x0a\x6c\x1b\xd7\xc0\xcf\x40\xf4\xe4\xe9\xc9\x57\xdf\x36\x35\xc9\x3d\x6c\x4c\x2e\x2e\x08\x0c\xb5\x2b\xe3\x94\xf8\xd3\xc9\x2b\x7f\x19\x7d\xb5\xfa\xd7\x3f\x9b\x9b\x57\x5f\x07\xd3\xd0\xf3\x02\xb6\x41\x39\x8c\x4f\x82\x45\x72\x71\x91\x00\xf8\xe4\x01\x58\xe0\x2f\x24\x8f\xf7\x65\xeb\x07\x61\x3e\x29\xc9\x76\xdd\x6e\x60\x86\x1c\x66\xd8\xc4\xcd\xbb\x32\x6e\x1a\x9f\x23\x28\x58\x66\xf3\x6c\xb2\x8b\x6b\xe4\x9b\x00\x9b\x8b\x55\x25\x40\x8e\xef\x1f\x28\x3b\xd1\xf5\x69\xcb\x03\xa6\x9a\x14\x0d\x9f\xe3\x67\x36\x23\xc9\xfc\x00\xe7\xe0\x4b\xe7\x93\x14\x5b\x58\x88\x6b\x7b\x2f\x2e\x72\x0d\x96\x3c\xce\x08\x80\x92\x1f\x27\x4f\xd8\x39\x17\xdd\xfb\x57\xdf\xcc\x82\x39\x6c\x09\xec\x1f\x47\x37\xb2\x08\x85\x75\xa1\x7e\x1a\x3b\xc9\x69\x93\xee\x3d\x89\xd3\x8d\x4e\x8d\xdd\x2d\xc3\xcd\x02\xa1\x22\xd7\x8f\xfb\xd5\x79\x0b\x2d\x51\xde\xa5\xac\x5f\x10\x7a\x48\x9f\xdb\xb5\x12\x8d\xb0\x3f\x64\x95\xdc\x4c\xd2\xb8\x2c\x81\x85\x80\xb8\x43\x05\xdd\xe4\x5d\xb5\x85\x0e\xfb\xb4\xad\xea\x28\xd5\x3f\x6c\x2b\xf8\x94\x03\xb5\xb6\x3a\x1f\xf2\x05\x68\xcb\xcb\x24\x67\x09\xa9\xa8\x11\xba\xdc\x3c\x0a\xf5\x38\xde\x15\x48\xfa\x1d\x6a\x7f\x06\xbf\x29\xa6\x0a\xb3\xe0\x91\x22\xf2\x6b\xc2\xe4\x6f\x84\x4c\xc6\xf8\xaa\xda\x61\x9b\x06\x76\x84\x7c\x6a\x61\x0f\xfd\xc7\x03\xd0\xce\x5f\xde\xff\xf5\xdb\x7f\xfc\xf0\xe1\x17\xe8\xc9\x9a\x15\xcd\x0f\x55\x9c\x01\xb6\x40\x62\x1d\x16\xaa\x41\xf4\x58\xb2\xf7\x1f\xa0\xfb\xdc\xe3\x0f\x93\xc9\xc4\xc3\x61\x14\xf0\x20\x63\x7e\x69\x81\x2e\x1c\x22\xd0\x03\x89\x10\x27\x25\xe8\x28\x2e\x0a\x25\x98\x74\x6b\x0b\x4a\xa4\xbb\x3d\x72\x82\xf7\x10\x97\xde\xdc\xdb\xb4\xf7\xa5\x17\xe6\x62\xdf\x81\xb1\x46\x91\x87\x00\xc0\x4b\xa0\x6e\x94\x67\xf0\xa0\x28\x40\xbe\x82\x19\x56\xe4\x06\xb9\x88\xfe\x9f\xc3\x66\x3f\x3d\xe9\x68\x80\x17\x41\xa8\xc9\xc3\x18\x97\xf0\xe9\xb3\x4e\x7c\x9e\xb6\x60\x20\x9d\x64\xe9\xdb\x08\x9a\x85\x20\x27\xb2\x8c\x71\x0e\xb0\x04\x95\x19\x29\x30\x47\x30\x37\x9b\x5e\x5c\x74\xfa\x82\x3a\x30\xf8\x33\x15\x92\xea\x5b\x3a\x08\x70\x50\xc8\xa8\x7e\x16\x98\x08\x6e\xab\xf5\xba\x34\x14\x01\x53\xc0\x00\x4d\x62\x62\x95\x11\x52\xd3\xfa\x5c\x20\xf3\x9e\x5e\xb2\x6f\x5b\x40\x01\x48\xe4\x60\x01\x3a\x2f\xe1\x62\x49\x6c\x93\x39\x06\x18\x15\x99\xdc\x97\x85\x57\x03\xf8\x15\x60\x83\xd2\xeb\xce\xf7\x10\x24\x2f\x80\xf5\x89\x17\xe9\x86\xa4\x77\xb0\xc5\xf0\xce\x1c\x48\x13\x77\x00\xf8\x03\x0a\x19\x00\xfa\x6a\x9e\xf0\x29\x26\xe2\xb5\x29\xb6\xc4\x5b\x90\x5d\x17\x17\xf6\x24\xe1\xf0\xd4\x1c\x81\xa6\x1a\x36\xf1\x76\x0d\xaf\x0e\xb1\x0d\x1a\x43\x8c\xd5\x93\x49\xb0\x94\x49\x30\x86\xb2\x85\xf6\xdb\x50\x65\x2f\x94\x61\x6c\x24\x10\xcb\x79\xe4\x55\xc9\x2d\x49\x5b\x25\xa2\x52\x58\xad\x25\xdc\x78\x73\x2e\xdd\x12\x3a\x62\x98\xa3\x7c\x63\x0b\xc0\x6d\x59\x0a\x02\xf1\x41\x0e\xa3\xce\x12\xfc\x08\x60\x4a\x31\xc7\x06\x32\xe4\x5c\x62\x7c\x39\x2d\xe8\x38\x12\xd2\x53\x92\x8e\x0f\xa8\x44\x9d\xa7\xd3\xe2\xbf\x22\xf6\xfd\xc6\x0b\xbb\xe2\x22\x06\xca\x64\x6a\x39\x00\x63\x40\x6d\x6d\xd2\x02\xca\x40\xbf\xa5\x40\x84\x82\xc2\xbd\x09\x7d\x1b\x80\x1c\x65\x23\xfa\x02\x27\x41\xd8\xd5\xc4\xcf\x31\x66\x14\x5c\xc0\xd7\x1d\xe1\xca\x8d\xa8\xc9\xd7\x40\xc2\x45\x1a\x03\x26\x1b\x27\xff\x80\xa6\xa9\x2b\x18\xbc\x1c\xab\x86\x9e\x25\x98\x19\x2e\xc1\x00\x80\x76\x5c\x3e\x36\x65\x41\xa5\x05\x13\x1e\xa0\xd9\x6b\x90\x8b\x7c\x02\x46\xa7\xfc\xa1\x68\xc9\x7d\x13\x6d\xf7\x65\x19\x7a\x1b\x60\x9e\x1a\x09\x49\x1b\x9c\x8d\x6a\xd3\x3d\xa2\xe9\x1e\xc1\x42\xa3\xa1\xf6\x42\x21\x04\x15\x1c\x4c\x06\x05\xaa\x65\x49\x62\x60\x0e\xb3\x65\xfa\x39\x2d\x45\x4b\x53\x65\x08\x90\xe7\xdf\x90\x37\x21\x1d\x70\xce\xc1\x0b\x3f\x82\x4b\x30\x07\xc3\xd6\x90\x6d\x74\x24\x97\x75\x90\xc0\x7e\xeb\xd8\x19\x5e\x09\x75\xc5\x67\x00\x6e\x01\xd0\xea\xef\xf9\xa3\x6f\x7c\x34\x11\xad\xf5\x19\x6a\x63\x4a\x19\x2d\xd0\x0c\x9c\x23\x87\x33\xd6\xbb\x05\x85\xc0\x85\xb3\x73\xdc\x40\x58\xd6\xfa\xd2\x80\x8c\xbf\xa5\x3b\xf6\x3d\x78\x6a\x9f\x1c\x6c\xe5\xd8\x55\x8b\x86\x70\x93\xa5\x94\x0c\xf5\x8d\xd7\xfb\x4a\x0b\x72\x92\x6e\x8a\x32\x83\xdf\xbe\xd1\x18\xc0\x04\x00\x7c\xbd\x4b\x47\xc3\x38\x94\x37\x15\x36\x9c\x2c\xcd\xb5\x80\x5a\x16\xbb\x74\xad\xcf\xc3\xb4\xca\xf8\xea\xe9\x69\x76\x9d\x2c\x99\x67\x35\xd7\xc9\x7a\x69\x53\x23\xf1\x3d\xfc\x84\x72\x43\xf0\x8b\x67\x78\x42\x00\x1a\x40\x74\x08\xe6\x19\xea\x63\xb5\x79\xb8\x58\x24\x1d\x3f\x50\x13\x10\x3f\xb9\xce\x96\x1e\x6e\x16\x58\x12\x28\x02\x80\x6c\x7d\x0d\x40\x34\x01\xac\x95\xd3\xc1\xce\xa2\xbf\x99\xc0\xa9\xb5\x47\x94\x36\x06\x54\xe2\x80\x26\x63\x28\xb8\xb8\x70\x9b\xdd\xbe\xa5\x85\x4e\xf9\x71\xa1\xe2\x36\x1f\x00\xb0\x38\x20\x3a\xc9\x00\xe6\x5a\x11\xd2\x3e\x32\x14\x1b\x64\x6f\x1a\x6c\x10\xc5\xa7\x8d\x36\x58\xed\x0b\x86\x62\x48\xb2\xcc\x47\xfc\x64\x09\x5d\xa6\x41\xcf\x60\x09\x12\x81\x4f\x9c\xc1\xbe\xa2\xb3\x65\x0a\xcd\x70\x1d\x31\xd0\x91\x70\xbc\x92\xe4\x48\x14\x34\x50\xe3\x85\x1b\xfd\x53\x5e\xd4\x0d\x7e\x03\x5d\x03\x9f\x0a\xe6\xb2\x83\x95\x34\x24\xd2\x4c\xc2\x27\x83\xf1\x51\x96\xf1\x30\xc1\xe2\x08\xef\x7a\xc1\x6a\x03\xa0\x1d\xa0\x3f\x71\x99\x2a\x0e\xb4\x81\xa0\xa3\x7a\xe8\x56\x79\x80\x14\x43\x26\x8b\x00\xc2\xd1\x15\xcb\x3e\x50\x6d\x39\x27\xab\xd9\x4d\x98\x15\x35\xa1\x38\x9c\xaf\x0f\x92\x41\xdd\x04\x77\x1b\x84\xb7\x4e\x27\x52\x6c\x9a\x6f\x82\x34\x0b\x73\xae\x49\x38\xf3\x75\x74\xa0\x24\x7c\xbf\xf3\xe5\x2c\x63\x2f\x7c\xae\x64\x60\xba\x3a\xf6\x0b\x63\x2e\x25\x00\x57\x45\x47\x68\xdd\x70\x37\x5d\x1a\xf0\xca\xf2\x0b\xfa\x1c\xe5\x3e\x6b\x93\xee\x09\x18\xb4\xb0\xaf\x72\x38\x30\x0d\x70\x23\x26\x55\x9e\x83\x26\xf9\xb5\xc8\xda\x8d\xee\x2e\xac\xe1\xb3\xf1\x94\x9d\x1d\x10\x22\x06\xd2\x56\x49\xb8\xbe\x99\xdc\x56\x05\xa8\xe8\x01\x1a\xbc\xdd\x05\x59\xae\xc6\x4a\x7c\x30\x3b\x86\x85\x46\x75\xba\x6f\xa4\x4d\x5d\x74\xa9\xa7\xbb\x31\xc0\xd2\xe0\xb4\xf4\x45\x08\xc8\x9b\x57\xd9\x24\x45\xf0\xd4\x0a\xc7\xd9\xbe\x8e\xf1\x07\x10\x04\x0c\x97\x12\x7f\x16\x8e\xaf\x02\xf0\xa3\xfc\xac\x87\x42\x88\x6b\x9d\x16\xeb\x84\x6e\x7a\x77\x40\x1c\x48\x92\xe6\x7a\x84\xe9\x77\xc3\x07\x10\xad\x17\xc6\xd3\x97\xf0\x03\x14\x1c\x20\xb6\xfa\xfc\x73\xee\x02\x87\x4e\x4f\x21\x40\xf9\x66\x47\x39\xd2\x65\x3a\xcf\x99\x44\xb5\x3c\x09\xc5\x43\x5d\x5f\x62\xbb\xbf\x4f\x98\xfd\x28\x46\x41\x8b\x00\x56\x37\x5f\x2f\xc9\x6a\x0d\x02\x0c\x06\x55\x26\x14\xb1\x35\xb0\xf4\x32\xc4\x24\x2e\x3f\x43\x7e\x3b\xed\x69\x48\x44\x9f\xf4\x35\xe4\xa0\x1d\x6f\x83\xe2\xe0\x26\x1c\x68\x4f\xe0\x81\xb8\xbc\x8e\x50\xdf\x22\x98\xc9\x15\x23\xa4\xbe\x87\x19\x21\x0c\xd0\x37\x75\x85\x07\x47\x22\x3c\x68\xed\x2c\x11\xdb\x29\xf6\x15\x77\xd0\x98\x4d\x40\x09\x5e\x37\xc6\x0f\x14\xce\xa9\xf1\x4b\xe4\x6a\xfd\x3c\x08\xfd\xde\xbe\x01\xee\x90\x83\xd0\x70\x4b\xd7\x6e\xdf\x08\x10\xfc\x11\x84\x68\xf5\x91\xa1\x17\xa3\x20\x86\xac\x8d\x45\x3c\xa1\x46\x55\xed\xc9\x31\x6f\x2e\x03\x27\xd1\x27\x02\xa3\xe0\x1a\x48\xa0\x13\xb1\xec\xc3\xcb\xbc\xb1\x2f\x11\xea\x52\xf2\x07\xc5\x05\x75\x9e\x2c\x9f\x09\x0d\x69\xa9\xc4\xd8\x23\x5f\x8c\xd5\x28\xb0\x5c\x01\xe6\x7c\x72\x91\x22\x1c\x72\xd3\x37\x62\x6f\x3b\x2e\x50\x06\x42\x17\xa0\xd2\x03\x0c\x22\xc2\xd3\xa7\x7d\x3e\xa2\x6e\xf1\xa4\x92\x8f\x97\xfc\x0d\xf8\x5a\x84\x5a\x38\x96\x89\xb5\xa9\x3e\xea\x83\x4b\x73\xc6\xc0\x87\x70\x8e\x1c\xf3\x61\x24\x59\x6e\xad\x34\x4b\x60\x54\xca\x84\x55\x59\xc6\xbb\x06\xa4\x31\x5a\x4d\x6e\x01\x0c\xaa\x71\xe8\x0e\x5b\x9b\x31\x28\xb1\x01\xfa\x13\x37\x20\xae\xc1\xc6\x8e\xb7\xa4\x1c\xc0\x0f\x84\x07\x27\x43\x41\x68\xc4\xb2\xb2\x28\xd5\x68\xdf\x00\x0c\xdc\xbd\xcc\x5c\xb0\x30\xe0\x52\xd9\x12\x98\x9b\xaa\xf5\x30\x7b\x7a\x72\x0d\x14\x22\xc9\xb0\xbc\x02\xb7\xfa\xe4\xe6\x81\x4f\x64\x2e\xdd\x50\x62\x0a\x14\x4d\x89\xf1\x97\x28\xc1\x03\x8c\x59\xce\x9c\x54\x7a\xc5\xd3\x0c\xda\xfe\x9d\x9e\x88\x8e\xd9\x9d\x8a\x0c\x10\x73\x38\x97\x17\xef\x51\x58\xb8\x26\x9c\xf5\x2a\x51\xd8\xf0\xad\xb9\xe3\x07\x6a\x28\xbb\x4c\x18\x61\xdb\xe6\x2c\xe4\xce\xc4\x01\xae\x64\x0d\x14\x94\xc6\xf7\xa4\x7c\x17\x03\xc2\x57\x5e\x93\xd6\x30\x1c\xe8\x25\x61\x99\x8c\x31\xb5\xd2\x35\x07\x7b\xed\x24\x19\xc8\x15\xa1\x0b\xa7\x15\xf2\xe6\x9b\x19\x5d\xb8\x31\x30\x58\x6b\xa0\xdf\x82\xc3\xc1\xe4\x97\x8d\xe1\x91\xf4\xf3\xcb\xb3\xd8\x65\x23\x8c\xf8\x2f\xc7\x2e\xbd\xc4\xb7\x4a\xed\x85\xa6\x18\x1a\x57\xc6\xe9\xff\xa7\x62\xc2\xda\x68\x37\x65\xf6\x12\x72\x37\xd7\xd4\x4b\xbd\x59\x87\x7a\xcf\x24\x39\x40\x5a\x46\x2c\x9a\x7b\x16\xc1\x7b\x2a\x17\xea\x22\x20\xe6\xef\x74\x50\x35\x3b\x91\xab\x15\x24\x97\x9d\x24\xb9\x79\xa6\xd1\xbf\x4d\x67\xdd\xc0\x3e\x36\x5b\x1d\x23\xab\x25\x93\x50\x73\xca\x8c\x1e\xfa\x96\x86\xc1\xca\x57\xbd\x30\x9e\xbe\x88\xc1\x2a\xf1\xf9\x62\x83\x75\x31\x24\x98\x78\x14\x8a\x92\xad\x20\x8a\x52\x4c\x25\x44\x43\xd0\xe4\x96\xc5\x2a\x85\x6e\xd7\x62\xed\xd8\xbd\x98\xdd\x43\x12\x57\xa6\x28\xef\xed\x34\x45\xc5\xb7\x33\x4c\x51\x81\xc2\xd3\xa6\xa8\x18\xb4\x27\xf0\x1d\x89\x06\x27\x6d\xd0\x1e\x0b\xb4\x6b\xb8\xbd\xc4\x2a\x0d\x59\xbe\x1a\x4c\xcf\xdc\xb9\xb9\x9b\x68\xbd\x14\x81\xf4\xb9\xdc\xd0\xc2\x04\x8a\xe9\x65\x68\x7d\x1b\x15\x17\x17\xe0\x83\x53\x83\x75\x6d\x32\x35\x40\x77\x7b\x71\x71\xcb\xb4\xf7\xa5\x1b\x15\x2b\x6d\xb8\xc8\xbb\x1c\x15\xa3\x4b\x6a\x54\x6e\xab\x16\xeb\x1c\xba\xec\x9c\xa1\x6e\x5e\xe5\x1d\xa6\x10\x2d\x31\xc4\xa3\xa4\x03\xf0\x87\xde\x13\x13\xec\x52\xd3\x6f\xce\xb4\x42\xb5\xc2\x97\x04\x2d\xe1\x4c\xd5\x17\x84\x88\xc9\x1e\x26\x4a\xfd\x58\xe4\xa2\x49\x64\x45\x6b\x28\x25\x2d\xf4\x72\x80\x6a\x47\xb6\x34\xa7\x96\xb9\x2a\x00\x84\xe6\xc8\xea\x6a\x07\x46\x3a\xe6\x83\x8e\x54\x01\x58\xee\x33\x1b\xda\x25\x51\x8d\xe1\x00\x19\x5a\x81\x85\x8c\x01\x27\xce\x8a\x89\x94\x52\x5e\x62\x56\x4c\xa4\xc8\xc9\xd3\xaf\x56\xdf\x8e\xff\x2b\x1e\xff\xfb\x66\x3a\x69\x31\x4d\x93\xf6\x52\xa4\x59\x46\x91\x61\x6f\xb4\xe7\x85\xb4\xa6\xe6\x1a\x33\xed\x96\xd9\x3c\x91\x31\x6e\x5e\xd4\xe1\x49\xf0\xc7\x49\x9c\xde\xe1\x03\x0a\x0a\x93\xe5\x44\x13\x64\x39\x23\xc6\x8b\x69\x1c\x93\x7d\x15\x32\x34\x03\x1e\x84\x6b\x7e\x44\x5c\x67\x0c\x4b\x44\x7a\x3b\x2c\x68\x88\x59\xed\x89\x48\x7c\x87\x83\xb9\xcc\x81\x73\xe5\x9d\x03\x71\x70\x0e\xb4\x29\x80\x26\x67\x81\xb0\x86\x6b\xa0\xc2\x6a\xdb\x56\xfb\x74\xd3\x00\xda\x5b\x20\xf3\x81\xac\xb7\x12\x3f\x78\xc5\x15\xd8\xed\xb9\x96\x16\xdb\xc6\x0f\x49\x5c\x8f\xe1\x3f\x3d\x1c\xed\x5f\xbe\xcd\x8a\x87\x41\x8a\xb3\x45\x5e\x17\x77\xd3\x6b\x60\xbb\x62\xdb\x90\xba\xfd\x36\x6f\x31\x26\xed\x6b\x89\x20\x51\xaf\xc3\xf6\x6a\xe3\x26\x68\x80\x5d\x15\xb0\x64\x5d\x3f\x41\xa1\x78\x83\x59\x7a\xb7\x79\xc3\x4d\xf2\xdc\xcc\xd0\xda\x44\x2c\x2d\x51\x7d\x4c\xf0\x90\x73\xc0\x4c\x03\x34\x22\xeb\xb5\x0e\xa1\xbe\x81\x77\xe4\x33\x36\x36\x48\x01\xa0\x9e\xfa\x6f\xfe\xfc\xf4\xc7\xd9\xd3\xeb\x3f\x05\x9c\x6a\x13\x6c\xfa\xae\xca\x48\x60\x29\x45\x96\x3d\xef\xd4\xf9\x24\x93\xa6\xad\x76\x3f\x03\x30\xf1\x3a\x66\x72\x20\x1c\x66\x67\x51\x42\xd6\x4f\x09\x43\x90\xa1\x20\x57\x5f\xff\x29\x8a\x14\x40\x9c\x3d\xd8\xcb\x8f\x9b\x22\xdd\xa0\x52\xa5\x42\x16\x84\x11\x47\x00\x60\x97\x6e\x99\x2f\x36\xcc\x1b\x94\xc5\x1c\xa5\x2a\x80\xf3\x00\xe2\xa4\x0e\xe6\x0f\x45\x53\x00\x30\x83\x18\x63\xde\x7c\x04\x6f\x05\xb6\x38\x89\x80\xaa\xf6\x37\xde\x68\x33\xf2\xc2\x01\x7b\x53\x16\x4d\x9b\x54\x9f\xf0\x25\x05\xad\x30\xbc\x2e\x50\x03\x3c\xc7\x54\xc0\x38\x25\x92\x8f\x37\xa7\xa0\x20\x7b\xbf\xf9\xb3\x06\x3f\x68\x84\xeb\x19\xfc\x33\x1e\x87\x7f\x9c\x99\xef\xdf\x16\x32\x81\x04\x4f\xa3\x51\xf8\x3f\xb7\xa8\x43\xa2\x19\xc6\x29\xc9\x6f\xfe\xad\x5c\x1e\xd8\x51\x07\xe9\x4b\x80\x96\x16\x54\xb0\x30\x9e\x9e\x55\x73\x94\x4a\x05\x6c\xb8\x90\x92\xbe\x82\x85\xe9\x12\x2a\xc2\xcb\xa8\x75\x92\x1f\xab\x3c\xca\x64\xe5\x91\x96\x92\x17\x23\x18\x16\x4a\x6e\x7d\x3b\x6d\xa1\xc8\xd5\xae\x4f\x59\x28\x72\x50\xad\x0a\xe9\x74\x13\x25\x68\x07\x79\x55\xdf\x6b\xc6\x4b\x4c\x6b\x07\x6d\xba\x3f\x9c\x1e\x92\x84\x5d\xa9\xca\x7a\x71\x06\xed\xeb\xa7\xe8\x91\x52\x68\x87\x38\x5d\xcc\xfe\xfb\x12\xff\x56\xa6\xde\x55\x07\x20\x44\x28\xcf\x3e\x35\xbf\xa0\x6c\x72\xc4\x96\x50\x2b\xb7\x9d\x84\x3c\x4f\x8e\xdc\x57\x59\x5c\x8e\x53\x10\xf9\xd4\xb0\x9a\x60\x08\xce\x77\x74\x0f\x1d\x55\x4b\x3d\xae\x13\x0e\xc1\xea\x22\xe9\xe0\x9e\x28\x2f\xb2\x82\x52\x02\xfc\xf9\x70\x16\x02\xca\x92\x2a\xae\x33\xfc\x8d\x22\xb6\x13\xaa\xb2\x35\x60\x6c\x30\xd6\x4a\xc7\x80\xed\xa8\xc4\x76\xda\xcf\x88\x49\xd9\x49\xe7\x8e\xf2\x60\x6b\xb0\xf3\x5e\xc9\xc1\x8e\x14\x48\xfd\x23\x8b\xdb\x28\x34\x68\x16\xf5\x14\x4d\x1a\xdb\x36\xe4\x9e\x28\x69\xd2\x78\xa7\xf2\x5c\x7a\xf9\x04\xa3\x6c\x5e\xea\xaa\x81\x66\xd7\xc0\xb2\xd7\x37\x97\x66\xe5\x04\x22\x85\xef\x03\x1b\x5b\xe0\xdf\xe1\x87\x39\x13\x52\xa9\xcb\x33\x64\x25\x9c\x0b\xed\x9b\x2c\x09\x10\x05\xa8\xda\xb7\x78\x07\x2a\x26\xfb\x50\x49\x41\x31\x49\xaa\xec\x33\x56\xd2\xc8\x26\x88\x76\xe8\xcc\x62\x33\x1f\x00\x3a\x10\xc2\x99\x3e\xb9\x9d\xe7\x4a\x5d\x61\x04\xb4\xcd\xb9\x91\x18\xd7\x45\x3c\x66\xb6\xa7\x17\x62\x38\x3b\x05\x47\x1a\x04\x4a\x4a\xfe\xca\x64\x3a\xaf\x76\x36\x36\x7e\x7b\x7c\xe7\xb3\x65\xda\xc3\x48\x59\x11\x97\x15\x06\x04\xce\xae\xb8\xd6\x06\x62\xf0\x48\x4a\x22\xbd\x89\xad\x37\x33\x2c\x7d\x3d\xde\x33\x38\x16\x59\x02\xaa\x77\xd7\x0d\x3b\x8c\x7f\xce\xc4\x3d\x81\x92\xc4\x24\x77\x30\x09\xdd\xee\x81\x2a\x4b\xe4\xf4\x7e\x65\xd1\xbb\xa1\x3d\xf2\x1c\x48\x0b\x17\x55\x6c\xfb\x41\xe8\x84\x81\x9c\x3b\x3e\xe3\xc3\xf5\x70\xcf\x73\xd3\xaf\xbc\x66\xf9\x05\x51\x42\xc9\x85\x3f\xe2\xc4\xc7\xe3\x37\xb8\xbf\x66\x7b\xdf\xde\x50\x9d\x88\x23\x23\x65\x72\x12\x8f\x54\x9a\x74\x5e\x77\x25\x7c\x6c\x89\x78\x60\xbd\x08\x8f\x2b\x30\x77\x8c\x17\xb9\xea\x38\xf2\xc5\x37\xc5\xfd\x96\xd2\xe1\x66\x94\x50\x08\xe6\x8a\x28\x29\x74\x02\x76\x92\xb2\x0c\xad\x24\x34\x46\x67\x27\xa8\x2e\xdf\xef\x1c\x72\xd2\xb5\x3e\xb4\x66\x63\x61\xcd\x4a\x8c\x2b\x08\xe7\xa6\x2c\xb7\x26\x43\xf4\xf6\xcc\xe6\x60\x3f\xba\x8f\xee\x54\x8b\xa5\x4b\x18\x0c\xfd\x62\x3a\xe6\xb4\xff\x9d\xf8\x86\x54\x7c\x2c\x86\x29\x60\xb2\xa0\x32\x47\xe9\x06\xfa\xc5\xdc\x82\x1d\xc4\xb3\x0a\x44\x58\x96\x08\x1a\x1f\xe6\x14\x49\x67\xf0\xc4\x5d\xfc\xdb\x61\x31\xf6\xff\xdc\xf3\x64\xb4\xda\x4d\x09\x62\x86\x13\xda\x4b\xc5\xbc\x25\x48\x96\x6f\xca\x24\xb8\xf8\x3a\xb8\x1c\xa5\xa3\x4b\x6f\x40\xfd\xd3\x3e\xc5\x75\xbe\x92\x76\x11\x9f\xe0\x16\xca\x54\xe9\xbe\x46\xc5\xc9\xb4\x0c\x48\x4b\x30\xe7\xc1\xb0\x4d\xed\xe2\x4a\x01\xde\xd2\xe6\x4c\xc6\x5b\x2a\xe6\xab\x7f\xd3\x84\x89\x16\x14\x96\x44\x8e\x0a\xd6\x44\x8d\xad\x64\xad\xed\x37\x15\x6d\x38\x4c\x84\xf7\x2c\xd8\x51\xb6\x3c\x2a\x19\x93\x63\x27\x3b\xf0\x20\x10\x29\x1b\x32\x74\x6c\xbd\x1c\x7f\xe9\x3b\x09\xf3\xf4\x31\x94\xb3\xc4\xfb\x97\x59\x05\xfc\x03\xaa\xd6\x8a\x97\x53\xaa\x58\xa8\x9f\x56\xb6\xf9\x94\xd3\x28\x23\x3f\x61\x1e\x69\x39\x77\xa1\xd2\xd6\x7d\x81\x72\x72\x22\x50\x9e\x3f\x3d\x75\x86\x83\x29\xb4\x28\xf8\xda\x19\x05\x5f\xe6\x18\x04\xcf\x82\xf9\x9a\x1a\x70\x18\x18\xa0\x86\x9c\x76\xde\x85\x0e\xe6\x0a\x8a\xb3\x0f\xa7\xfd\x4d\x86\xa7\x93\xe1\x70\x36\x9c\xf2\xdd\xac\x03\x09\xd2\x38\x76\x15\x81\x2b\x3f\xdc\x3a\x92\x15\xfb\xa9\x3b\x36\x4e\x83\x85\xa7\x8a\x31\xba\x3b\xa4\x22\xdd\x6a\xa3\x98\x9f\x35\x1f\x4e\xbf\xe2\xb1\xa0\x0c\x8c\xa6\x4c\x2b\xdf\x48\x45\x1d\x03\x98\xdb\x18\xe0\x89\x31\x70\xeb\xb0\xe1\x08\x9b\x45\xa4\x25\x59\x49\x1b\xf5\x89\x4c\xc3\x13\xc7\x10\xc1\x18\x8f\x46\x4b\x85\x7a\x66\x95\x19\x26\x82\x2d\x7f\xc8\x93\xd4\xe1\x32\x3d\x98\x78\xd4\xe4\x04\x93\xad\x2c\xc2\xc4\x1d\x75\x5b\x3b\x9d\x37\xa4\xc1\xe0\xe6\xa8\x2f\xf0\xb7\x63\xe0\x5e\x9e\x16\x04\x4a\x36\x24\x2d\x7b\x20\x5b\x1a\x37\x63\x0f\x2d\x2b\x52\x63\x0f\xb4\xb6\x9c\x1d\x3f\x32\x3d\x74\xe5\x80\x17\xdb\xa2\xc5\xc3\x01\x55\xd9\x16\x3b\x50\x01\x30\x99\xe9\x02\xc7\xdb\xe2\x9e\x46\x2f\xd0\xef\xa5\x34\x84\x23\xcc\xa1\x0b\x34\xc7\x02\x78\xe4\x93\x39\x9a\xca\xe4\x7e\x87\x12\x66\x6e\x28\x2c\x31\xf2\xb5\xe3\xe5\x38\xae\x6b\x70\x7f\xaf\xdf\x4e\xe1\x9b\xb3\x41\xb1\xdd\x92\x5a\x36\xa0\xff\x5e\x86\xdc\x76\xe0\xa5\xf3\x03\x16\x4a\x0b\xdb\xa2\x2d\x09\x68\xe2\x30\x03\x57\xe8\xf3\x7c\x16\xe2\x61\x29\x84\x0b\xe3\x06\x71\x01\xe3\xc0\x83\xa9\xf7\x71\xed\x46\x5c\x43\x16\xd1\x08\x94\x0a\x8f\x97\x62\x3e\xe9\x84\x39\xec\x02\x1b\xfa\x00\x5c\xf7\x37\xf6\x0c\xdc\x21\xcf\xd4\x9a\x1b\x27\xec\x9f\x49\xb3\x2b\x11\xff\x03\x8f\xf1\x20\xb3\x48\x17\xf9\x78\xbc\x60\x1c\xbf\x8e\xc8\x2a\xbf\x41\xbb\x80\x87\x99\xa3\x68\x1d\xf4\x69\x74\x6f\x24\x81\x35\xa3\x2b\x62\x9b\x4c\x3b\x9f\xb1\x37\xd7\xaf\x0b\xd4\x63\x03\x9c\xe7\x3e\xde\xee\x81\xc2\x87\x30\xd1\x23\x8f\x8f\x8a\x23\x14\xeb\xa5\x7e\x3e\x62\x2e\xec\x73\x8c\x91\x76\xda\xb0\x93\x11\xbc\x0d\x50\xa4\xd7\xa9\x5a\xf0\x37\x23\xef\xb9\x30\xd3\x99\x8d\x10\x81\x3e\x60\xf1\xfc\x01\x29\x98\xc2\xd4\x3f\x38\x3b\x30\x4d\xfb\xdf\xae\x2a\x2a\xbd\x7d\xf8\x28\x09\x93\xa3\x50\xb1\x87\xe7\x1d\xb8\x7d\x93\x17\x9f\x3e\x20\xa5\xfa\x41\xe7\x3c\x04\x97\x8e\x8d\x43\xb9\x28\x86\xec\xf4\xe2\xb4\xe6\xac\xd2\xef\xc2\xaa\x4d\xd3\x89\xdf\x70\x11\x9e\x60\xc4\x9e\x32\xd1\xc5\x45\xa7\xfa\x51\x7e\xf1\xf9\xaf\xe8\x91\xc6\xc2\xf8\x53\x88\x22\x5c\x3c\x80\x80\x4e\x1c\x8b\x2c\xc9\x1a\xa4\x44\x07\x6c\x51\x12\x02\x90\xa6\x51\x17\x56\xa3\x64\x5b\xec\x05\x9e\x24\xa0\xa6\x87\xf1\x56\x0b\xc2\x22\x43\xa7\xab\xf8\x66\x18\xe1\x79\x96\x04\x7e\x45\xa8\xee\x6d\xb8\x28\x55\x39\xac\xff\x64\x50\x80\x29\x10\x6f\x53\x5c\x3a\x9d\x23\x55\xb6\xc1\x32\x99\xe3\x91\x2c\xc3\x26\x0e\x56\x92\xf8\x78\x8d\x49\x77\xc9\xa0\x1c\x95\xae\xd5\xa8\x55\x2e\x91\x1e\x5c\x10\xc5\xc6\xa9\x90\xe8\xa8\x5b\x35\x79\x8e\x86\x23\xbc\x11\xb4\xca\x77\xc5\x7a\x41\x0d\x1c\x5a\xc5\xa1\xc6\x89\xdc\x95\xcc\x38\x1e\x1e\x63\x54\x53\xe0\x68\x2c\xd2\x75\xb0\x27\xa2\xef\x03\x0c\xef\x88\x06\x3a\x36\x29\x4b\xfd\x1f\xc3\x26\x0a\xa8\xd3\xe8\x44\xea\x3e\x13\x9d\x38\x60\x17\x9f\xc2\x71\x77\x0d\x4c\xf1\x29\x1a\x1c\x2b\x50\xec\xa9\x34\x34\x16\x2f\x1c\x49\xf4\x1a\x58\xdc\xdc\x17\x27\x50\xb9\x6e\xa3\xc9\xbd\xde\x78\x59\x4f\x7d\x15\x77\xa1\xba\x47\xa0\x40\x59\x8b\x32\x2b\x40\x88\x9c\xd2\x94\xc0\xd2\x94\x40\x83\x54\xd9\x5d\x3c\x3e\xcb\xb4\xa4\x27\x16\xaa\x64\x8e\x31\x86\xb4\x40\x96\xee\xd7\xca\x77\x0c\x33\x3c\xf7\xd1\xe3\x66\x76\xfa\x81\xfa\x9d\xfe\xb3\x59\x62\xe1\xdf\x12\xfe\x9f\x16\x34\xf1\x48\x6d\x5c\xc2\x2a\x8e\x49\xa4\x6e\x3c\xc8\xd1\x6c\x7e\x7a\xa2\x46\x10\xad\x59\x26\x2d\x8a\xa1\x80\x16\xf2\x3f\xc2\x5b\xb0\x3f\xf0\x50\x0d\xfc\x07\x6e\xf6\x0e\x0d\x12\x2f\x29\x2b\xd0\xdf\x07\xcd\xe2\x24\x16\x7e\xa4\xa5\xb2\xcc\x94\x37\xef\x6e\x81\xa5\x53\x7a\x42\xda\x58\xa6\xc8\x6b\x0a\x96\xf9\xb9\x62\x1e\x1f\xab\x55\xb1\xfd\xe6\x5b\xfd\x15\x2b\x7d\x43\xf2\xe1\xda\xff\xce\x0a\x81\x88\xd0\x79\x58\x46\x24\xbc\x8f\xfa\xd2\xee\x2a\x38\x0e\xfe\x87\x6e\x1d\xab\x0f\xe1\x36\xf2\xf0\x8d\x1d\x3d\x50\x58\x60\x65\xd7\x13\x6a\x04\x52\x58\xe7\x77\x13\xe0\x2b\xfe\x00\x30\x54\xcf\x19\x81\x2d\x4d\x0c\xc1\x9e\x60\x8c\xdd\xa9\x31\x66\xd8\x85\x22\x87\x26\x0c\xf2\x76\x81\x67\xc6\xab\xb6\xad\xee\xa1\x13\xb0\xf5\x06\x2c\xa9\xdd\x68\x33\x61\xd5\xc5\xa3\xdb\xf1\xfd\x75\xb5\xa4\xa4\xc1\xac\x64\xd5\x68\x7c\x3f\xbe\x7d\x3b\x5b\x8a\xde\xe2\xc4\x15\x6f\x40\x1f\x46\xc5\xf5\x56\x1e\xc8\xa2\xff\xf1\xaf\xf8\x7b\x5c\xbc\xdd\x2d\x79\xa7\x39\xb1\x8e\xb1\x94\x06\x65\xd1\x4a\x90\xdf\x24\x09\xbc\x8b\xcb\x94\xfa\xff\xd9\xdf\xd8\x52\x48\xb8\x09\x8b\xf0\x96\xf3\x2c\x50\x5b\xf9\xf9\x67\xc1\x0b\xfe\x6f\xa1\x20\x4d\x4d\x46\xa2\xcf\x40\x09\xab\x8e\xdc\xb9\x81\x6e\x01\x82\x37\x4a\x99\x3c\x3a\x2c\x8e\x85\x38\x40\x78\x74\xc3\x1b\x27\xce\xff\xd4\xc7\x22\x1a\x35\x66\xc1\x0d\x19\x6a\x2e\xd0\x75\xa0\x2e\x24\x9a\x24\x43\x63\xdc\xe6\x93\xb5\xfe\x8a\x97\x88\x6e\x22\xe0\x87\x86\x7c\x0f\x38\x23\xec\x10\xcf\x3d\x68\xae\x62\x3b\x66\x82\xe1\x0a\xb3\xf3\x7d\x4d\xe8\xe6\xd2\x36\x8b\xa2\xf9\x29\xfe\xc9\xdf\x60\x02\x62\x43\x33\xfa\xf4\xb9\xc0\xe7\x02\x9f\x13\x24\x9e\x28\x61\x74\x16\x26\x94\x16\x22\xf6\xdf\xa8\x00\x7b\x96\xc1\x84\x92\x57\xec\x2e\x8a\x3e\x65\xfc\xa1\x91\xbe\x9e\xeb\x0e\x27\x51\x92\xea\xc7\xb8\x05\xda\xab\xf6\xd0\x30\xc6\x19\x02\x26\xb9\x8c\xd7\xf8\x06\xbd\xd7\x03\x5a\x87\x33\xf3\xb4\x11\x2d\x37\x67\x85\x0e\x1d\x9c\xdd\x75\x71\x46\x7d\x19\xc6\x16\xe9\xc5\xc5\x1d\xb8\x19\x58\xd9\x45\xaf\x6b\xd0\x56\xb9\x1e\xdf\x05\xe1\x94\xf1\xc9\x13\xbc\x90\x05\x53\x6c\xb7\xca\x68\xb6\x60\xeb\x7f\x3b\x83\xee\x65\x34\x7e\xfd\x8a\x3d\x0b\xec\xcc\x00\x46\xce\xb5\x09\x96\xe2\x9d\x03\x1a\xa7\x79\x2e\xe4\xbf\x45\xe7\xd4\x2f\xc7\xf9\xe8\x36\xbc\x0d\x19\x2f\xb2\x70\xdf\xa0\xdb\xec\x6e\xbc\x0e\xef\x42\xa6\x0f\x16\x19\x1e\x32\x91\x93\xdb\xe1\x6c\xd5\xcb\xf0\xf1\x65\x56\x9d\x3a\xc5\x5c\x95\xa4\x61\xbc\xfc\x66\xf6\xca\xbf\x1a\xc7\xd3\x24\x18\x79\xff\x0f\x63\xcd\xb6\x79\x20\xf5\x6d\xcf\x11\x09\x46\xd1\x89\x94\x05\xdc\xff\xc0\xc8\x1e\x4b\x0b\x9a\xde\x36\xb7\xba\x84\x20\x44\x37\x7a\xc9\x6e\x1e\x01\x71\x86\xe7\x42\x6f\x10\xa3\xb1\x19\xe5\x40\xa6\xc5\x5b\xa3\x00\x01\x03\xb6\x6b\x03\x44\xd8\x80\xc9\xaa\xa3\x79\x3e\xed\xf2\xa2\x84\x1b\xa2\x43\xcb\x70\x52\x0a\x36\x74\xc9\x1b\x15\xa5\x51\x02\xa7\xc7\x44\x09\x49\x37\x79\xe8\xb2\x1a\xdd\x86\x11\x41\xca\x3f\x7a\x32\x34\x7b\x66\x74\xf7\x25\xa2\xef\x54\x30\xd7\x29\xb9\xf9\x01\x3e\x63\x1f\x84\x2f\x7a\xe2\x68\xcd\x02\x40\x61\x81\x45\x1a\x63\xa1\x86\x0f\x8f\xae\x0e\x85\x8d\x16\xeb\xa1\xc7\x0a\xd0\x55\x6c\xe3\x72\xcc\xdb\x07\xe8\xa7\xf5\x7f\x0f\xbb\xc3\xcb\x3c\x29\x6f\xd1\x21\x7a\x65\xd7\xf6\x1d\xb4\x56\x84\xde\xf1\x41\x85\x3d\xd4\x35\xaa\x6d\x6b\x51\x55\xc7\x2b\x3f\xda\x61\xa1\x26\x38\xea\x77\x28\x2b\x01\x29\xef\xca\x02\x3a\xff\x1d\x1c\xff\x65\xcf\x7b\x3f\x98\x3f\xd2\x23\x49\xe0\x29\xeb\x22\x89\x19\x10\xf2\x25\x13\x4a\x07\x3b\xcc\xc1\x4d\x91\xee\xb2\x6c\x1d\x6f\x89\x17\x15\xb3\x57\xd6\x4b\xbc\xa4\x2a\x80\xc9\xdc\x84\x5b\x30\x4c\xfe\x73\xf5\x92\x4c\x28\xa4\xd3\xd7\xe3\x74\xfa\xfa\x20\x0c\x1a\xbd\xdf\x38\x3b\xda\x81\xdb\x30\xce\x99\xa0\x51\x36\x7d\xad\x77\x1f\xa7\x87\xf9\x59\x0d\xc5\x3c\x87\x0e\x1a\xdc\x24\x6d\x5f\x06\x24\x82\x0c\x5c\xcc\xc9\x8d\x36\x8b\x7a\x6d\x4a\x7e\x7a\xf2\x1d\xdb\x8f\xce\x20\x7c\x5e\xf2\xff\x99\x0b\x92\x50\x67\x83\xbf\xb2\x6f\x94\x28\x76\xbd\x37\x5e\xe0\x37\xf9\x0b\xaf\xb4\x33\xe3\x86\x3c\xc8\x6a\x0d\x18\x9b\xea\xc4\xbe\x44\x83\x7e\xd5\x7e\xf3\x24\x31\x95\x88\xb6\x12\x60\x31\x59\x6b\xfc\x87\xb8\x2c\x32\xe3\x16\xab\x6e\xda\x9d\xbb\x06\x3f\x55\x19\x11\x85\x43\x7a\x8e\xd8\x11\x7b\x16\x11\x35\x76\x6e\xcc\x8a\xc8\xa0\x93\xda\x99\x4e\xc5\x65\xed\x53\x82\xcd\xf1\xf6\x57\xae\x52\xad\xf7\xfc\x6b\x6f\x2f\xfd\xe9\x78\xad\x97\x0a\x72\x2c\xbf\x6c\x18\x83\xba\xab\x8b\x94\xef\x95\x55\xd9\x9f\xb2\x58\x0b\x1e\x46\x4e\x59\x10\x0b\x6b\x28\x4d\xcc\x80\xd9\x54\x57\x9f\x0d\x93\x5d\x8f\x88\xe8\x49\x03\xa1\x39\xe8\xae\x59\x25\x04\x06\x50\x5c\xc9\xfd\xc5\x05\xb0\x91\x42\xe4\x44\xb5\xd0\x1f\xbe\xc4\x81\x1b\x91\x55\xe8\xbf\x2a\xca\x07\x22\xf4\xf8\xe2\xd1\x9e\x40\x5b\xda\x3c\x42\x23\x73\x1e\xcf\x38\x41\xa3\x52\x85\xbc\xb7\x2b\x59\x28\x3e\x9d\x4e\x17\x0a\x8c\xf0\x84\xe1\xef\x4a\x0e\xb1\x44\xce\xae\xda\xb1\xfb\x84\x58\x22\x87\x9d\x3f\x54\x33\x75\x6f\x3f\xfd\x99\x75\x50\xd7\x9d\x0a\xe8\x6f\x1b\x2f\xd0\x13\x41\xba\x0a\xec\xc3\x80\x4a\xe2\x3e\x6a\x99\x22\x7e\xad\x88\x8c\x8e\xf3\x7a\x79\x5e\xcf\x89\x29\x1b\x77\xea\x48\xac\xc5\xc8\x0c\x99\x29\xa3\xcd\x1b\xab\x31\x17\xd4\xf0\x7d\xf3\xe6\xda\x31\x98\xac\x22\x35\x73\x4a\x87\x40\x67\x9a\xf3\xd6\x2a\x9b\x07\xe6\x9d\x4d\x06\x41\xfc\xfe\x10\xff\x4b\xcd\x7b\x2d\x8a\x2e\xc3\x71\xca\xe4\x37\xd1\x75\xae\xc9\x6f\x75\x96\x15\xb9\xae\xee\xdd\xfc\xbb\x18\x91\x85\xb6\xd4\xd0\xa9\xdb\x9b\x70\xba\x12\x03\x6e\x51\xbb\x97\x41\xa7\xc6\xba\xd5\xfe\x06\x8e\xf8\xea\x73\x6c\x49\xae\x39\x75\xa4\x76\xed\xb0\xa3\xdb\x25\x0d\x90\xc4\x6d\x80\xe8\xe6\x87\x44\xb0\xdb\xee\x48\x26\xbc\xc1\x52\xfe\x62\xb6\x47\x4c\x6d\x0f\xf9\xf2\xcb\x1b\x0b\x4e\x23\xe1\x84\x55\x23\x8c\x02\x6a\xe1\xf4\x99\x35\xc2\x58\x80\x36\x86\x22\xe1\xfb\xb8\xd0\x1f\xbe\x84\x22\x11\x32\xe6\xf7\x28\x12\x29\x73\x5f\xa4\x48\x78\x6f\x97\x22\x11\x9f\x4e\x2b\x12\x81\x91\x67\x28\x12\xcd\xe9\xa6\xae\x01\x0d\xbf\xd3\xe3\xab\xfa\xa5\x77\x75\x95\x92\xa6\x61\xce\xa3\x99\xc0\x05\x7c\xd2\x1b\x8b\xb1\x42\x83\x06\x50\x03\x1e\x6d\x9d\xa7\xb2\xe4\x0e\x5e\x47\xb1\xf8\xcc\x5f\xb2\xf8\x2f\x0f\x13\x47\x9d\x14\x2e\x3f\xf1\x8e\x7e\x39\xfb\x35\x6e\x76\x9f\xb5\x52\x99\xfc\x79\x77\x5a\x88\x0c\x6c\x64\xd1\x1b\xaf\x0e\xf5\x69\xd9\x4c\x60\x9f\x12\x75\x5f\x6d\x2c\xca\x65\xa8\x7f\x3a\xf2\x06\x78\x98\x6c\x50\x16\x83\x6b\x3c\x25\xc4\x86\xa7\x7e\x17\x00\xe5\xaf\x6e\xc4\x81\x6f\x3a\x93\xf1\x8a\x5d\xcf\xc3\x6c\x43\xcd\x1a\x86\xc9\x41\xff\x6e\x84\xbd\xcc\x51\x0f\xf2\x45\xaf\xc6\x60\x33\xcc\xaf\x66\x76\x54\x89\xf6\x3d\xed\xd0\x46\x11\xdb\xa4\xa5\xc7\x46\xc2\xab\xe0\xb8\x37\xcc\x13\xf4\xa7\xd6\xb0\xd0\x2a\x23\x17\x6a\x9f\x99\x64\x30\x70\x1e\x4c\xee\x63\x57\xe5\x7e\x87\x0f\xb5\x52\x25\xb3\xa8\x29\x8f\xa6\xff\xfa\x6a\x32\x15\x69\x18\x3c\xa9\xa7\x42\x34\x39\x56\x70\x89\x23\x7c\x79\xa7\x52\x68\xb5\xca\xe9\xcd\x67\xd4\x8f\x44\x2b\xa8\x68\x7e\xa5\x4b\xf7\x53\x8b\x08\x51\x66\xfb\x33\x76\x3a\xd8\xfa\xa2\x4a\xfc\xf1\xa8\xea\xcd\xcd\xd3\x13\xad\x1e\x0d\x26\x4d\x55\x6b\xf9\x3e\x6a\x85\x09\x7e\x04\x2c\x8f\xd1\xf9\x3b\x74\x4f\xbf\xa6\x02\xbb\x93\xdd\xbe\x61\x59\x6b\x94\xd4\x61\x2a\x50\xac\xbd\xbf\xba\xe1\x01\x57\xe3\x62\x39\x4a\x13\xfd\xce\x6d\x2f\xf4\x23\x83\xfc\x19\x14\xc2\x42\x30\x7b\xa1\x27\xc7\x5e\xb0\xf8\x83\x28\x28\xc6\x4d\xb6\xbf\x61\x19\xda\xd8\x35\xf3\x46\x64\x57\x44\xd9\x0b\x5b\xb6\xb8\x85\x8e\xaf\x36\xe4\x37\x79\xea\x0c\x41\xcf\x10\x5e\x47\x99\x38\xca\xb7\x1e\x46\x7e\x1c\xc1\x46\xc7\x40\x02\x78\x47\x83\x48\x63\xd2\x4e\x78\x91\x6b\x4c\xb3\x9d\xeb\x8b\x8b\xe4\x2d\x0d\xe9\x5a\x3d\x7b\xba\x60\x5d\x4e\xac\x2a\x6e\x62\xac\xb8\x81\x1e\xf9\x2a\xbe\x81\x91\xae\x61\x24\xfc\xe1\x0f\xe1\xff\xd1\x15\xec\x3b\x1d\x1c\x7f\x76\x06\xc3\x2e\xb6\x86\xe5\xdf\x0c\xff\xb0\xcb\xfb\x89\xb8\x80\x51\x71\x0c\xf3\xa1\x9b\x7f\x6c\xdb\xa2\x74\x89\xac\xf0\xd4\x55\x71\x5a\x6e\x56\x0e\x3b\x12\xf5\x85\x6c\x5a\xef\x72\x94\xe0\x51\xf2\xf0\x72\x64\x37\x43\xbe\x93\xdf\x2f\xe9\xc1\xfb\x54\x02\xe5\x7b\x65\xe1\xb9\xee\x53\x5b\xc8\x6b\xda\xb5\x83\xc7\x78\x08\x4d\x3b\x63\xeb\x67\x51\xa6\xce\xe1\x96\x85\x76\x78\xd0\x31\x22\xe6\x54\x65\x78\x57\x60\x53\xe9\x04\x50\x09\xd6\x85\xc4\xf2\xfd\xc2\x7c\xfc\x12\x36\x82\x36\xe7\x99\x37\x13\xab\x1e\x2f\xba\x9e\x41\x76\x77\x19\x05\xea\xe3\x69\xb3\x40\xa1\x41\x95\xa4\x9e\x77\x97\x15\xf6\x11\x97\xcf\x9c\x73\x91\x95\x9c\xe9\x77\xdf\x64\x25\x38\x45\x3f\x4c\x88\x15\x89\xa7\xea\x21\xf4\x4e\x21\x9e\xbf\x97\xc4\xb6\x2f\xf9\xe1\x5e\x9d\x34\x03\xcc\xdb\x47\x89\xa5\x81\xe8\x55\x48\x60\x16\x64\xf6\xf9\xfd\x2c\xea\xad\xa2\x95\x47\xf5\xf1\x56\x1a\xc1\x07\x94\x53\x1c\x77\x5a\xf2\xca\xe8\xd4\xbc\xf7\x71\x8e\xd2\x0d\xac\x08\x94\x6f\xd4\x04\xb3\x4a\x3b\xda\x38\xe9\xde\x6a\x79\xe0\xe7\xad\x05\x9f\x80\x65\x34\xcc\x8f\x5c\x8b\xb3\xc6\xfb\xdb\x44\xbe\x57\x08\x2f\x13\xe2\x30\xd5\x4d\x14\xfc\xbe\x0e\xd7\x2a\xe5\xaf\xe1\x5c\x4d\xfb\x88\x7b\x32\x57\x39\x5f\x0a\x6b\x07\xd4\x43\xe7\x7a\x17\x87\x8c\x64\x31\x6a\x69\x98\x12\xfa\xa7\x2c\x9c\x52\x4e\xdd\x7a\x65\x6c\x2a\xde\x7e\x75\xe2\x26\x4d\xd7\x05\x97\xe1\x7a\x49\xc3\xb5\x46\x30\x3e\xb1\x52\x9c\xe8\x4f\x75\x9c\x54\x76\x9d\x76\x8f\xec\xc3\xc2\xe7\xb3\x25\x1e\x9e\x6f\xc8\xf8\x05\x0e\xb9\xa4\x0f\x6d\x3d\x78\x1f\x5e\xdf\xcd\xb9\xdd\x3f\x58\xb1\x58\x9f\xfa\x93\x15\xe4\x58\x16\x89\xd0\x3f\xcf\xd1\x49\x65\x99\xb1\xbd\x38\x59\x88\x1f\x5f\x24\xa6\x07\x84\x63\xff\xfd\x0a\x4a\x4c\xba\x08\x3d\x4f\x80\x42\x37\x67\x60\x0e\x5e\x9f\x11\x94\x83\xe5\x9c\xac\xe0\xc7\xa1\x7a\xeb\xf7\x11\x6a\x79\xbb\xa2\x78\xb9\x2b\xca\x4e\x4d\xbf\xa3\x30\x5e\xfc\x35\x1c\x18\x83\xf1\xff\x0b\xab\xc6\x55\x2d\xf3\x99\x9e\xd2\xd7\x4c\x31\x44\xa6\x86\x50\xde\x58\x9c\xe7\xc5\x27\x6d\xcd\xe6\x95\xe7\xf8\x07\x08\x44\x5a\x4d\xbf\x24\x5d\xfd\x89\x8f\xb3\xbb\xff\x5a\xb4\x1b\x2a\xff\x7e\xa8\xaa\x9d\xb3\xd4\x57\xab\xbc\xa6\xc3\x8a\xda\xf7\xfd\x76\x57\x6c\xd9\xcf\x1d\xe6\xb2\x45\x1e\x4c\xf9\x58\xc6\x44\xec\x06\xc2\xbf\xbf\xff\xe5\xfd\x87\xc8\xa3\x03\x0d\xe8\xbf\x58\xbc\xc1\x7f\xf1\x44\x59\xe8\x70\xc1\x66\xdd\xb4\xa2\x3e\xa7\x79\x41\x5a\x07\x26\xe3\x72\x63\xfd\xc3\x91\x7b\xf2\x38\xac\x86\xf4\x40\x28\xb9\xd1\x27\xe2\x4b\xbc\xe6\x49\x33\xfe\x43\xfb\x1c\x9b\xc8\x21\x2e\xfa\xa0\x88\x52\x9a\xd9\x8b\xad\xeb\xe8\x7b\xb7\x49\x5f\xae\xe3\xaf\x88\xf4\xd1\x48\x78\x15\x1c\x99\xc1\x85\x43\xb9\x04\xd3\xdd\x53\xc7\x63\x14\xbf\x4a\x1f\x24\xeb\x47\x8c\x7d\x3b\xb5\x40\x8c\x70\x54\x2c\x87\x89\x96\x04\x02\x51\x82\xa3\x3d\x61\xa4\xb1\xe0\x09\x51\x9d\x18\x31\x40\x44\xbd\x4e\xf0\x62\xe4\x21\x26\x99\x29\xcf\x69\x91\x0f\x8c\x14\xb8\x32\xc9\x58\x0c\xc3\x67\xb1\x6a\xfa\x9c\xcd\x37\x74\x30\x01\x8c\xdd\x83\x92\x45\x41\xc9\x7f\xa8\x71\x08\x28\x9a\x91\x7a\x02\xbf\x06\x67\x5b\x0e\xaf\xe6\xac\xe1\x06\xe3\x1f\x08\xbe\x89\x1a\x81\xce\x6b\x70\xf9\x36\xaa\x84\x8d\xf5\xc1\x0b\xae\xc0\x69\xe3\x55\x6f\xc3\x2b\x59\x7f\xca\x51\x32\x8c\xa2\x82\x8b\x23\x0e\x82\x39\x38\xbb\xff\x18\x4f\x94\x78\xb2\x98\x88\x13\xf7\xc8\x2f\x96\xde\xd8\x1b\x15\x58\xf9\x12\xde\x49\xe3\xe8\x76\xe4\x49\xb9\xe2\xf5\x5d\x74\x70\x07\x3d\x8e\x5e\x6d\x20\xe4\x47\x11\x6a\x12\x44\xe5\xc7\x8b\xa5\x08\xf7\xea\xcc\xed\x07\x73\x25\x52\xce\x64\xd5\x5b\xfd\x0f\x93\xf1\x15\x48\x73\x92\x2f\x35\xf4\x38\x38\x40\xd0\xb0\xdd\x0a\x8a\xce\x1f\xaa\x60\x60\xd0\x44\x39\xec\xc6\xd8\xbd\x53\x78\xbe\xfe\x60\xa8\x6c\x3a\xfc\x42\xfd\xfc\x12\x6a\x9b\x6f\xc0\x99\x9e\x11\x5f\xe8\x4b\xbc\x22\xa6\x41\x1c\x6a\x9d\x7d\x38\xe3\x8f\x51\xd1\x25\xbf\xc8\x13\x62\x60\x9f\x74\x84\xa8\xdf\xc1\xff\x34\x93\x88\xf5\x44\xe2\xc7\xd3\xd3\x23\x2d\xfc\xa6\x0f\xdf\xd1\xbd\xa5\x7f\x27\x88\x17\xef\xb1\xdd\x8e\xcc\x06\x81\xec\xf0\x01\x4f\x38\xab\xd6\x58\x29\xa7\x7d\xa2\x76\x2d\xc2\xc8\xee\xd0\x51\x06\xc3\xe2\x0f\xff\x1b\x00\x00\xff\xff\x92\x3b\x10\xd7\xb7\x71\x00\x00") +var _pagesAssetsJsBootstrap311MinJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x7d\x5d\x73\xe3\x36\xb6\xe0\xfb\xfc\x0a\x09\x33\x4b\x03\x31\x44\xcb\xdd\x93\xba\xb7\xa8\xa6\x55\x49\x4f\xdf\xda\x6c\x25\x99\xec\x4d\xdf\x4a\xd5\x6a\x34\x5b\x20\x08\x4a\xb0\x69\x52\x21\x29\x77\x7b\x2c\xed\x6f\xdf\xc2\x27\x01\x12\xb2\xec\x4e\xbf\xdc\x97\x6e\x91\xc4\xc7\xc1\xc1\xf9\x3e\x07\xf0\xd5\x37\xd3\x3f\x4d\xbe\x99\x7c\x5f\xd7\x5d\xdb\x35\x64\x37\x79\x78\x1b\x5f\xc7\xd7\x13\xb8\xed\xba\x5d\x72\x75\xb5\x61\x5d\x66\xbe\xc5\xb4\xbe\x47\xa2\xf5\xfb\x7a\xf7\xd8\xf0\xcd\xb6\x9b\xbc\x99\x5f\x5f\xcf\xde\xcc\xaf\xff\x3a\xf9\xf8\x89\x77\x1d\x6b\xf0\xe4\x87\x8a\xc6\xa2\xd1\x8f\x9c\xb2\xaa\x65\xf9\x64\x5f\xe5\xac\x99\xfc\xf4\xc3\x47\x35\x68\x2b\x46\xe5\xdd\x76\x9f\x89\xf1\xae\xba\x4f\x59\x7b\x65\xa7\xb8\xca\xca\x3a\xbb\xba\x27\x6d\xc7\x9a\xab\x1f\x7f\x78\xff\xe1\xe7\x5f\x3f\x88\x29\xaf\xfe\xc4\x0b\x08\xc4\x48\x05\xaf\x58\x0e\xd2\xb4\x7b\xdc\xb1\xba\x98\xdc\xfe\xef\x3d\x6b\x1e\x51\xb7\x6d\xea\x4f\x93\x8a\x7d\x9a\x7c\x68\x9a\xba\x81\xc0\x2e\xe8\xa2\x9d\xfc\x2f\xf2\x40\x7e\xa5\x0d\xdf\x75\x93\x86\xfd\xbe\xe7\x0d\x6b\x75\x3f\x80\x16\x97\xc5\xbe\xa2\x1d\xaf\x2b\x48\xd0\x13\xd8\xb7\x6c\xd2\x76\x0d\xa7\x1d\x58\x98\x0f\x93\x0c\xa2\xa7\x07\xd2\x4c\x48\x9a\xd7\x74\x7f\xcf\xaa\x2e\xa6\x0d\x23\x1d\xfb\x50\x32\xf1\x04\x81\x85\x1f\x20\x9c\xa5\x4f\xbf\xb1\xec\x8e\x77\x1f\x1b\x52\xb5\x5c\x8c\x90\x80\x4f\x83\x37\x1f\xaa\x1c\xe0\x9f\xea\x7f\xb9\x6d\x3a\xfb\x9b\x89\xaf\x7f\x77\xbf\xd5\x5e\xd7\x49\x3d\x68\xdb\x9d\x1c\xe6\xb8\x28\xea\x06\x0a\xe8\xe9\x84\x57\x93\x0c\xf1\x02\x3e\xd4\x3c\x9f\xcc\xa7\x69\x4a\xe2\xb6\x7b\x2c\xd9\x8a\xae\x51\xc3\xba\x7d\x53\x3d\xb1\x2a\x4f\xb2\x15\x5d\x1f\x17\xea\xc5\xf4\xfa\x48\xe2\xa2\x8a\xd9\xfd\xbe\x24\x1d\xf3\xa0\x48\x2d\xe6\x32\x85\x1f\x9a\x4e\xaf\x71\x9e\x76\x5b\xde\x2e\x08\x14\xff\xa1\xb8\xae\x18\x24\x71\xbb\xdf\xed\xea\xa6\x8b\x7b\xd8\x62\x56\xe5\xd8\x0e\x80\x9e\x68\x3a\x9d\x1f\xd1\x42\x0c\xc3\x52\xf7\xfd\xe1\x40\x60\x8e\xe2\xae\xe1\x9b\x0d\x6b\x4e\x8e\x85\x0c\xc4\x93\x96\x75\x1f\xf9\x3d\xab\xf7\x1d\x64\x38\x43\x58\xc0\x71\xc4\x04\x3a\x83\x86\x06\x49\x33\x88\x8e\xe8\x08\x35\x41\xe1\xd3\x74\x21\x60\xcc\xd2\x8b\x55\x4e\x3a\x32\xcb\x79\x7b\xcf\xdb\x36\x05\xa4\x64\x4d\x07\xd6\x17\x98\xf6\xe0\x53\xf4\x44\x20\x15\x48\x80\x80\x96\x9c\xde\x01\x9c\x49\x78\x62\x5a\xd6\x2d\x43\xc7\x05\x8d\x77\x4d\xdd\xd5\x82\x98\xd5\x3b\x0f\xa9\x96\x02\x29\x44\x4f\x85\xc5\x01\x90\x2d\xf3\x38\x6b\x63\x35\x2b\x8a\x1b\x76\x5f\x3f\x30\x88\x8e\x02\xb8\x3c\xd5\xd8\xc7\x2c\xcd\x63\xd2\x75\x0d\x04\x12\xd8\x8e\x34\x1b\xd6\x01\xb4\x60\x87\x03\xec\xbf\x6d\x1b\x56\x00\xd1\x98\x45\x11\x8b\x1b\xb6\x2b\x09\x65\xf0\x2a\xfe\x06\x2e\xd3\x3f\xaf\xfe\xf9\x8f\x76\xfd\xcd\x5f\xd0\x15\x06\x00\xa9\x0d\x2a\x52\x02\x19\x5a\x64\x51\x94\xc5\xbb\x86\x3d\xb0\xaa\xfb\x1b\x2b\xc8\xbe\xec\x20\xc2\x45\x5c\xb2\x6a\xd3\x6d\x0f\x07\x58\xa4\x79\xbc\x25\xed\xfb\x92\xb4\x2d\xd4\x08\x42\xcb\x3c\xc9\xe3\x1d\x69\x04\xdf\x20\xd1\xdc\xac\x2a\x4b\x49\xfc\xe1\x41\xb2\x93\x5c\x9f\xb3\x3c\x84\xb3\x98\xb7\x7a\x8e\x5f\xd4\x8c\x2c\x87\x48\xcc\xa1\x97\xae\x27\xe1\x15\x40\x38\xb4\xbd\x51\x54\x38\xb0\x14\x24\x67\x00\x2d\x8b\xe7\xc9\x93\xa2\x20\xdd\xc3\xeb\x6f\xe7\x28\xa1\x10\xa1\xe3\x42\xa3\x5b\xb0\x88\x84\x75\xd1\xff\xf4\x76\x52\xd3\xa6\xdc\x7b\x46\xe8\xd6\xa5\xc6\xf1\x96\x89\xcd\x82\xa0\x5f\xbf\xd8\xaf\xd1\x5b\xcc\x52\x21\xef\xa8\xea\x87\x30\x10\xf4\x59\x6d\x7a\xd1\x98\x45\x11\x5b\x65\xeb\x98\x92\xb2\x84\xb9\x20\x6e\xdc\x43\x17\xbf\xaf\xab\xb6\x6b\xf6\xb4\xab\x9b\x94\xba\x1f\xaa\xfa\x7d\x5d\x15\x25\xa7\x9d\xcb\x87\x7a\x01\xce\xf2\x72\xcb\x59\x46\x2a\x3a\x84\x6e\x37\x4f\x42\x3d\x23\x3b\x2e\x48\x7f\x44\xed\xaf\xe0\xb7\x9e\xa9\x70\x8e\x9e\x24\x22\xff\xc2\x94\xfc\x4d\x05\x93\x29\xbe\xaa\x77\xa2\x4d\x9b\x92\x98\x7d\xee\x58\x95\xc3\xa7\x23\xce\xe2\xbf\x7d\xf8\x8f\xef\xfe\xeb\xc7\x8f\xbf\xe2\x5c\x37\xe3\xed\x8f\x35\xc9\x79\xb5\x49\xa7\xd7\xc7\x45\xdf\x20\x7d\x2a\xd5\xfb\x8f\xec\x73\x97\x00\xfd\x10\xc7\x31\x10\xc3\xf4\xc0\xb7\xac\xfb\xb5\x23\x1d\x0b\x88\x40\x90\xf3\x96\x64\x25\xcb\x81\x16\x85\x16\x4c\xb9\xb5\x5c\x12\xe9\x6e\x2f\x38\x01\x3c\x90\x12\x24\x60\xdb\xdd\x97\x00\x17\x66\xdf\xd1\x22\xbb\x4c\x81\x00\x00\x60\x41\xdd\x42\x9e\xb1\xcf\x5d\x4f\x01\xf6\x15\xc0\xf9\x8a\xad\x05\x17\xc9\xff\x8b\x55\xb6\x3e\x1c\x5c\x34\xac\xb2\x35\xc2\x8e\x3c\x24\x62\x09\x9f\x1f\x5d\xe2\x03\xce\x82\x41\x9a\x66\x4b\x38\x44\xd0\x1c\xe7\x31\xc9\x73\xc5\x39\x14\x29\x99\x41\x31\x45\x28\xf1\x9b\x46\xd1\xa8\xef\x35\xce\x3d\xfe\xa4\x46\x52\x7d\x27\x07\x41\xe8\x88\x15\xd5\xcf\x91\x8f\xe0\xae\xde\x6c\x4a\x4f\x11\x28\x05\x3c\x9d\xe3\xcc\xc7\xaa\x22\xa4\xb6\x83\x5a\x20\xeb\x9e\x20\xdb\x77\x5d\x5d\xb5\x60\x7d\x81\x16\xbc\x80\x99\x16\x4b\x66\x9b\xfc\x31\x0a\x5e\xe5\x76\x5f\x16\xa0\x21\x39\xaf\x41\x9a\x4a\x7a\xdd\x41\x20\x40\x02\x28\x8a\xa0\x79\x41\xb7\x8c\xde\xb1\x5c\xbc\xf3\x07\x72\xc4\x1d\xed\xf8\x83\x10\x32\x24\x9d\x5e\x27\x99\x9e\x22\x36\xaf\x7d\xb1\x65\xde\x22\x4c\xa2\x68\x38\x09\x9e\x9e\x9b\x03\x39\xaa\x61\x4b\xaa\x0d\x03\xe8\x48\x86\xa0\x29\xc4\x0c\x7a\x2a\x09\x46\x95\x04\x53\x28\x5b\x38\xbf\x3d\x55\xf6\x85\x32\x4c\x8d\x04\x10\x2e\x52\x50\x67\xb7\x8c\x76\xbd\x88\xa2\x51\x44\x07\xc2\x4d\x37\xd7\xd2\x2d\x93\x23\xe2\x42\xc8\x37\xb5\x00\xb1\x2d\x4b\x43\x20\x10\x25\x54\xe8\x2c\xc3\x8f\x90\xf6\x62\x4e\x0d\xe4\xc9\xb9\xcc\xfb\x72\x5e\xd0\x69\x24\xd0\x73\x92\x4e\x0f\xd8\x8b\x3a\xe0\xd2\xe2\x3f\x53\xf5\x7d\x0d\xf0\x58\x5c\x10\x98\xc5\x4a\x2d\xa3\x05\x75\xb6\x36\xeb\x2a\x20\xf4\x1b\x4d\xa9\xa5\x70\x10\xcb\xb7\x08\x53\x3d\x23\x34\x38\x41\x78\xac\x89\x5f\x63\xcc\xf4\x70\x61\x3a\x16\xae\xda\x88\x8a\xff\xc2\xab\x9c\x53\xd2\xd5\x4d\x1b\xe4\x9f\x98\x92\xa6\xde\xb7\xac\x9c\xf5\x0d\xc1\x40\x30\x2b\x5c\xc6\x3b\xb2\x6f\x99\x96\x8f\x6d\xc9\xa5\xb4\x50\xc2\xa3\xea\x58\xf3\x40\x4a\x3d\x81\xa2\x53\xfd\xc0\x3b\x76\xdf\xa6\xd5\xbe\x2c\x31\xd8\xd6\x0f\xac\x11\x84\xe4\x0c\xae\x46\x1d\xd2\xbd\x40\xd3\xbd\x00\x4b\x18\x0d\x0d\xc0\x46\x08\xf6\x70\x28\x19\x84\xfa\x96\x25\x23\x0f\x6c\xd0\x92\x3e\xd2\xd2\xb4\xf4\x55\x86\x01\x39\xf9\x96\xbd\xc5\x72\xc0\x44\x83\x87\x3f\x35\x64\x97\x4c\xe7\xbe\x6c\x93\x23\x85\xac\x83\xec\x70\x80\x2e\x76\xa6\xd7\x46\x5d\xe9\x19\xa2\x88\x96\x8c\x34\x3f\xe8\x47\xe8\x7d\xf4\x11\xed\xf4\x99\x3a\x63\x5a\x19\x6d\xd0\xdc\xb2\xce\x0e\xe7\xad\xb7\x62\x9f\x3b\x2d\x9c\x83\xe3\x22\x63\x59\xbb\x4b\xdb\xb0\xee\x3b\xb9\x63\x3f\x54\x39\xfb\x1c\x60\xab\xc0\xae\x0e\x68\x48\x6c\xb2\x95\x92\xd8\xdd\x78\xb7\xaf\xb5\x20\x63\xba\xe5\x65\xde\xb0\x0a\x7a\x8d\x63\x2e\x00\x80\x6e\x97\x91\x86\x09\x28\x6f\x29\x6c\x34\x59\xfa\x6b\x81\xc8\xf8\x17\xd9\x8d\x3b\x8f\xd2\x2a\xb3\xeb\xc3\x61\x7e\x93\x2d\x95\x67\x95\xb8\x64\xbd\x1c\x52\x23\x83\x40\x7c\x12\x72\xc3\xf0\x0b\xf0\x3c\xa1\xb8\xab\x61\x86\x8e\x28\xc9\x85\x3e\xee\x37\x4f\x2c\x56\x90\x0e\x44\xfd\x04\x0c\x66\x37\xf9\x12\x88\xcd\x02\x09\x10\x22\x00\x60\x02\x1d\x00\x85\x09\x30\x58\xb9\x1c\xec\x45\xf4\x37\x37\x38\x1d\xec\x91\xa4\x8d\x89\x94\x38\x00\x69\x14\x44\x51\xd8\xec\x86\x03\x2d\x74\xce\x8f\xc3\x3d\xb7\xc1\xe9\x1c\x0d\x38\x20\x3d\xcb\x00\xfe\x5a\x05\xa4\xa7\xc8\xd0\x6c\xd0\x70\xd3\x18\x54\xf8\x1c\xa2\xad\x61\x0f\x5f\x30\x94\x42\xd2\xc0\x7c\x14\x9f\x06\x42\x57\x69\xd0\x17\xb0\x04\x4b\xe9\xe1\x90\xaf\xb2\xb5\x70\xb6\x7c\xa1\x89\x37\xa9\x02\x5d\x10\x0e\x28\x59\x21\x88\x42\x06\x6a\x00\xde\xba\x9f\x0a\xde\xb4\xe2\x5b\x49\xda\x0e\x60\xae\x5c\x76\x5e\xc0\x29\xb3\x66\x92\x78\xf2\x18\x5f\xc8\x32\x1d\x26\x58\x3c\xc3\xbb\x00\xad\xb6\x6b\x88\x8e\xbc\x80\x2c\x64\xaa\x04\xd0\x96\x4e\xaf\xa5\x1e\xba\xed\x3d\x40\x89\x21\x9f\x45\x9e\x1a\x26\x5c\xb1\xfc\xa3\xd4\x96\x09\x5b\xcd\xd7\x38\xe7\x0d\x93\x38\x4c\x36\x47\xcb\xa0\x61\x82\xbb\x45\xf8\x36\xe8\x44\x9a\x4d\x83\x3e\x48\x73\x5c\x68\x4d\xa2\x99\x6f\xa4\x03\x2d\xe1\xc3\xd1\x97\x17\x19\x7b\xf8\xb5\x92\x41\xe9\x6a\x02\xb9\x37\x57\x2f\x00\x57\x7c\x24\xb4\xd6\xda\x4d\xb7\x06\x7c\x6f\xf9\xa1\x53\x8e\xf2\x29\x6b\x53\xee\x09\x40\x4b\xc8\xfa\xe1\x32\x84\xc5\x46\xc4\x75\x51\xb4\xac\xfb\x8d\xe7\xdd\xd6\x75\x17\x36\x08\x33\xef\x29\x7f\x71\x40\x88\x79\x48\x5b\x65\x78\xb3\x8e\x6f\x6b\x5e\x41\x30\x11\x06\xef\x78\x41\x03\x57\x63\x65\x3e\xf8\x1d\x31\x77\xa8\xce\xf5\x8d\x9c\xa9\xf9\x98\x7a\xc6\x1b\x83\x8e\xc2\x69\x39\x15\x21\x60\x6f\xbf\xc9\x63\x2a\xc0\xeb\x57\x38\xcb\xf7\x0d\x11\x3f\x00\x12\x30\x50\x06\xe7\x78\x76\x8d\x10\x4a\x60\x7e\x82\x42\x58\x68\x9d\x03\xd6\xc1\x61\x7a\x0f\x40\x8c\x2c\x49\x6b\x3d\xa2\xf4\xbb\xe7\x03\x98\xd6\x0b\xef\xe9\x6b\xf8\x01\x3d\x1c\xb8\x38\xe9\x9f\x6b\x17\x18\x07\x3d\x05\x24\xe4\xdb\x30\xca\x41\x97\x34\x29\x94\x44\x1d\x78\x12\x3d\x0f\x8d\x7d\x89\x6a\x7f\x9f\x29\xfb\xd1\x8c\x22\x2c\x02\x48\x51\xb2\x59\xb2\xd5\x66\x0d\x51\x52\x38\x26\x14\x1b\x6a\x60\xeb\x65\x98\x49\x42\x7e\x86\xfd\x76\xde\xd3\xb0\x88\x3e\xeb\x6b\xd8\x41\x47\xde\x86\xc4\xc1\x1a\x4f\x9c\xa7\x59\x57\x87\xbc\x0e\xec\x6e\x11\x81\xc1\x18\xa1\xf4\x3d\xfc\x08\x21\x12\xbe\x69\x28\x3c\x78\x69\xc2\x83\x83\x9d\x65\x66\x3b\xcd\xbe\x8a\x1d\xf4\x66\x33\x50\x02\xb4\xd8\x44\x11\xec\x71\x2e\x8d\x5f\x66\x57\x0b\x0b\x84\xe1\xc9\xbe\x48\xec\x50\x80\xd0\xc4\x96\x6e\xc2\xbe\x11\x26\xf0\x13\xaf\xf2\xfa\x93\x42\x6f\x59\x93\xdc\x93\xb5\xc4\xc4\x13\x1a\xa1\xaa\x81\x1d\x73\x7d\x81\x82\x44\x9f\x19\x8c\x2e\xb2\x1e\xe8\xcc\x2c\xfb\xf8\x65\xde\xd8\xd7\x08\x75\xf5\xf2\x47\x88\x0b\xe9\x3c\x0d\x7c\x26\x61\x48\x5b\x25\xa6\x1e\xf5\x62\x06\x8d\xd0\xc0\x15\x50\xce\xa7\x16\x29\xc6\x21\xf7\x7d\x23\xf5\x76\xe4\x02\xe5\xfc\x9e\x55\x2d\x77\x03\x0c\x26\xc2\x73\x4a\xfb\x7c\x12\xba\x05\x58\x25\x4f\x96\xfa\x4d\x02\xb6\x4c\x5a\x38\x03\x13\x6b\x5b\x7f\x72\x07\xb7\xe6\x8c\x87\x0f\xe3\x1c\x05\xe6\xe3\xc2\xd3\x36\x5b\x6b\xcd\x92\x6d\xfd\x49\x32\x61\x5d\x96\x64\xd7\x32\x20\x63\x4b\x61\x01\x9c\x21\x3c\x0d\x87\xad\xfd\x18\x94\xd9\x00\xf7\x49\x1b\x10\x37\x93\x78\x47\x2a\x56\x4e\x6e\x26\xb1\x80\x47\x4c\x26\x04\xa1\x17\xcb\xca\x53\xea\xd0\xbe\x07\x58\x1e\x45\xb9\xbf\x60\x63\xc0\x51\xdb\x12\x82\xad\x54\xeb\x38\x3f\x1c\x42\x03\x61\x41\x32\x2a\xaf\xa0\xad\x3e\xbb\x79\x10\x2d\xfc\xa5\x7b\x4a\xac\x07\xc5\x51\x62\xfa\xa5\x90\xe0\x68\xc5\xd6\x70\x1e\xa4\xd2\x6b\x9d\x66\x70\xf6\xef\xfc\x44\x72\xcc\xf1\x54\x6c\x22\x30\x27\xe6\x02\x64\x2f\x84\x45\x68\xc2\xf9\x49\x25\xba\xad\x3f\x55\xfe\x8e\x1f\xa5\xa1\x1c\x32\x61\x8c\x6d\x5b\xa8\x90\xbb\x12\x07\x62\x25\x9b\x94\xc4\x94\xdc\xb3\xf2\x3d\x69\x19\x5c\x81\x96\x36\x75\x29\xf4\x92\xb1\x4c\x66\x00\x0d\x71\xf9\xac\x9d\x64\x03\xb9\x26\x74\x11\xb4\x42\xde\x7e\x3b\x97\x0b\xf7\x06\x5e\xcd\xd7\xab\xcd\x1a\x1d\x8f\x3e\xbf\x6c\x3d\x8f\xe4\x34\xbf\xbc\x8a\x5d\xb6\xc6\x88\xff\x7a\xec\x72\x92\xf8\x56\x74\xb8\x50\xba\x86\x08\xf5\xc6\xe9\xff\x94\x62\x62\xb0\xd1\x61\xca\x3c\x49\xc8\xe3\x5c\xd3\x49\xea\xcd\x47\xd4\xfb\x42\x92\xdb\xf2\x3c\x67\x03\x9a\x7b\x15\xc1\x83\x3e\x17\x1a\x22\x20\xe5\xef\x8c\x50\x35\x3f\x93\xab\x35\x24\x97\x9f\x25\xb9\x24\x77\xe8\x7f\x48\x67\xe3\xc0\xbe\x68\xb6\x7a\x8e\xac\x96\x4a\x42\x25\x92\x19\x81\xf0\x2d\x3d\x83\x55\xaf\x7a\xe1\x3d\x7d\x15\x83\xd5\xe2\xf3\x8b\x0d\xd6\xc5\x94\x45\x51\x61\x15\xa5\x5a\x41\x9a\xd2\x28\x82\x34\x9d\x52\x84\x07\x16\xab\x15\xba\x63\x8b\x75\x64\xf7\x46\x11\x93\x24\xde\x9b\xa2\xba\x77\xd0\x14\x35\xdf\x5e\x60\x8a\x1a\x14\x9e\x37\x45\xcd\xa0\x27\x02\xdf\xa9\x69\x70\xd6\x06\x3d\x61\x81\x8e\x0d\xb7\x2f\xb1\x4a\xb1\xca\x57\xe3\x4d\x5a\x04\x37\x77\x9b\x6e\x96\x26\x90\x9e\xd8\x0d\xe5\x3e\x50\x4a\x2f\x03\x84\x6f\x53\x1e\x45\x04\x72\x69\xb0\x6e\x7c\xa6\x3e\x1c\xe0\x6d\x14\xdd\x2a\xed\x7d\x11\x46\xc5\xca\x19\x2e\x05\x17\x97\xfc\xf2\x42\x1a\x95\x55\xdd\xc1\x3c\xc4\xce\xb9\xd0\xcd\xab\x62\xc4\x14\xa6\x25\x48\x80\x23\x1d\xc0\xda\xeb\x89\x70\xd1\x6b\xfa\xed\x0b\xad\x50\xa7\xf0\x25\x13\x96\x70\xde\xd7\x17\x60\x81\xc9\x13\x4c\x44\x21\x31\xb9\x68\x96\x0e\xa2\x35\x92\x92\x16\x6e\x39\x40\xbd\x63\x95\xcc\xa9\xe5\xa1\x0a\x00\xa3\x39\xf2\xa6\xde\xe5\xf5\xa7\x0a\x60\xf6\x4c\x15\xc0\xc0\x7d\x56\x43\x87\x24\xaa\x37\xdc\x11\x1d\x9d\x02\x0b\x1b\x03\xce\x82\x15\x13\x54\x52\x5e\xe6\x57\x4c\x50\xc1\xc9\x57\x7f\x5e\x7d\x37\xfb\x3f\x64\xf6\xaf\xf5\x55\xdc\xb1\xb6\x83\xf4\x24\x45\xfa\x65\x14\xb9\xe8\x2d\xec\x79\x23\xad\xa5\xb9\xa6\x4c\xbb\x65\x9e\x64\x36\xc6\xad\x8b\x3a\x80\x05\x7f\x96\x11\x7a\x27\x1e\x84\xa0\xf0\x59\xce\x34\x11\x2c\xe7\xc5\x78\x09\xcc\x06\xec\xdb\x23\xc3\x31\xe0\xd1\x71\x51\x3c\x23\xae\x73\x85\x25\x66\xbd\x1d\x15\x34\xe4\x2d\x04\xb1\x49\x7c\xe3\x49\x62\x73\xe0\x5a\x79\x17\x29\x35\x1c\x38\xa4\x00\x99\x9c\x85\x08\x4f\x37\xe8\x09\xd4\x55\x57\xef\xe9\xb6\xed\x48\xd3\x01\x5e\x4d\x6c\xbd\x95\xf9\xa1\x2b\xae\xa2\x68\x5a\x38\x69\xb1\x8a\x3c\x64\xa4\x99\x55\xc4\x0b\x47\xc3\x8b\x77\x39\x7f\x98\x50\x31\x5b\x0a\xc6\xb8\xbb\xba\xb9\x40\x31\xaf\x5a\xd6\x74\xdf\x15\x1d\x6b\x2c\xf9\x7a\xf5\x3a\x6a\xaf\xb6\x61\x82\xe6\x05\xec\x0b\x58\xf2\xb1\x9f\xd0\xa3\x78\x8b\x84\x17\x1c\x34\x6f\xb4\x49\x5e\xf8\x19\xda\x21\x11\x5b\x4b\xd4\x1d\x13\xb3\xb8\xa8\xe9\xbe\x85\xe8\x68\xeb\xb5\x8e\xd8\xdd\xc0\x3b\xf6\x28\x1a\x7b\xa4\xc0\x0b\x78\x05\xdf\xfe\xfb\xe1\xaf\xf3\xc3\x9b\x7f\x43\x9a\x6a\x33\xd1\xf4\x7d\x9d\x33\x34\x50\x8a\x2a\x7b\x3e\xaa\xf3\xc9\xe2\xb6\xab\x77\xbf\x34\xf5\x8e\x6c\x88\x92\x03\x78\x9a\xbf\x88\x12\xf2\xd3\x94\x30\xdd\x1c\x0e\x9b\x28\x7a\xf3\x6f\x69\xda\x03\xa4\xd9\x43\xbd\xfc\xb4\xe5\x74\x2b\x94\xaa\x14\xb2\x0c\x19\x04\xe0\x3c\x96\x5b\x06\xcd\x86\x81\x49\xc9\x13\x21\x55\xe3\x9c\x3f\xf0\x9c\x35\x28\x79\xe0\x2d\xcf\x4a\x36\x21\x00\xf3\x54\x8f\x00\x56\x4d\x5d\xb2\xf4\x9e\x55\xfb\x35\xb8\xdc\x5e\x02\x3c\x51\x6f\x4a\xde\x76\x59\xfd\x59\xbc\x94\xa0\x71\xcf\xeb\xba\x4d\xb9\xce\x31\xf1\xb8\xe0\xa5\x20\x1f\x90\x48\x50\x04\x7b\xbf\xfd\x77\x07\xfe\x28\xba\xbd\x99\x47\xd1\xed\x6c\x86\xff\x3a\xf7\xdf\xbf\xe3\x36\x81\x14\x45\xb7\x97\x97\xf8\xff\xdd\x0a\x1d\x92\xce\x11\xe6\x31\xfb\x1d\xde\xda\xe5\x1d\x8f\xc7\xa3\xf5\x25\x8a\xca\x52\xc1\xc2\x7b\x7a\x55\xcd\x11\xb5\x0a\xd8\x73\x21\x2d\x7d\xa1\x85\xef\x12\xf6\x84\x97\x4b\xeb\xa4\x78\xae\xf2\x28\xb7\x95\x47\x4e\x4a\xde\x8c\xe0\x59\x28\xc5\xe0\xdb\x79\x0b\xc5\xae\x76\x73\xce\x42\xb1\x83\x3a\x55\x48\xe7\x9b\xf4\x82\x76\x52\xd4\xcd\xbd\x63\xbc\x10\x59\x3b\x38\xa4\xfb\xe3\xf9\x21\x19\x1e\x4b\x55\xd5\x4b\x33\xe8\xa9\x7e\x3d\x3d\x4a\x0a\x1d\x11\x67\x88\xd9\xff\x58\xe2\x7f\x90\xa9\x0f\xd5\x01\x18\x11\xaa\xb3\x4f\xed\xaf\x42\x36\x05\x62\x4b\x42\x2b\x77\xa3\x84\xbc\x4e\x8e\xdc\xd7\x39\x29\x67\xb4\xae\x3a\x69\x58\xc5\x65\x4d\x72\x18\xe8\x8e\x03\x55\x4b\x27\x5c\x27\x31\x84\xaa\x8b\x94\x83\x03\x53\x5e\x34\x08\x4a\x19\xf0\x93\xe9\x1c\xdf\xb1\xc7\xac\x26\x4d\x2e\x7e\x0b\x11\x3b\x0a\x55\x0d\x35\x20\xf1\x18\x6b\xe5\x62\x60\xe8\xa8\x90\x61\xda\xcf\x8b\x49\x0d\x93\xce\x23\xe5\xa1\xd6\x30\xcc\x7b\x65\xc7\x61\xa4\xc0\xea\x1f\x5b\xdc\x26\xa1\x11\x66\xd1\x89\xa2\x49\x6f\xdb\xa6\xda\x13\x65\x2d\x25\xbb\x3e\xcf\xe5\x96\x4f\x28\xca\xd6\xa5\xae\x0e\x68\xc3\x1a\x58\xf5\x7a\x7d\xe1\x57\x4e\x08\xa4\xe8\x7d\x50\x63\x1b\xfc\x07\xfc\xb0\x60\x42\x8a\x86\x3c\x43\x55\xc2\xb9\x70\xbe\xd9\x92\x00\x53\x80\xea\x7c\x23\xbb\x1d\xab\xf2\x8f\xb5\x15\x14\x71\x56\xe7\x8f\x08\x3b\x4d\x04\xda\x21\x8a\x55\x6c\xe6\x63\xbd\x83\x73\x84\x73\x77\xf2\x61\x9e\x8b\x86\xc2\x08\xc2\x36\xd7\x46\x22\x69\x38\x99\x29\xdb\x13\xe0\xe9\xb5\x98\x8c\x55\x45\xdd\x50\xf6\x1f\x4a\xa6\xeb\x6a\x67\x6f\xe3\xab\xe7\x77\x3e\x5f\xd2\x13\x8c\x94\x73\x52\xd6\x1b\xf0\x8a\x8a\x6b\x67\x20\x05\x8f\xa5\x24\x76\x32\xb1\xf5\x76\x3e\x47\xc9\x99\x9e\xe8\xb9\xc8\x52\x86\x9e\xc2\x75\xc3\x01\xe3\x5f\x33\xf1\x89\x40\x49\xe6\x93\x7b\x14\x9d\x08\x1f\xf5\x65\x89\x9a\xde\xaf\x07\xf4\xee\x69\x8f\xa2\x80\x40\x2e\x8a\x57\xa7\x41\x18\x85\x81\x82\x3b\x3e\xd7\xc3\x9d\xe0\x9e\xd7\xa6\x5f\x75\xcd\xf2\x17\x44\x09\x2d\x17\xfe\x24\x26\x7e\x3e\x7e\x23\xf6\xd7\x6f\x0f\x87\x1b\xea\x12\x71\xea\xa5\x4c\xce\xe2\x51\x4a\x93\xd1\xeb\xb1\x84\x27\x03\x11\xbf\x9a\xaf\xd3\x34\x25\xba\x52\x4e\x17\xb9\xba\x38\x82\xe6\x5b\xcf\xfd\x03\xa5\xa3\xcd\x28\xa3\x10\xfc\x15\x49\x52\x18\x05\xec\x2c\x65\x79\x5a\xc9\x68\x8c\xd1\x4e\x48\x5d\xbe\xdf\x05\xe4\x64\x68\x7d\xc2\x9a\x25\xc6\x9a\xb5\x18\xef\x21\x4c\x7c\x59\x3e\x98\x4c\xa0\xf7\xc4\x6c\x01\xf6\x93\xfb\x18\x4e\xb5\x0c\x74\x89\x82\xe1\xb4\x98\x26\x9a\xf6\xbf\x37\xdf\x04\x15\x3f\x17\xc3\x34\x30\x0d\xa0\xf2\x47\x19\x07\xfa\xcd\xdc\x86\x1d\xcc\x73\x1f\x88\x18\x58\x22\xc2\xf8\xf0\xa7\xc8\x46\x83\x67\xe1\xe2\xdf\x11\x8b\xa9\xff\x13\x00\x6c\xb4\x3a\x4c\x09\x66\x86\x33\xda\xab\x8f\x79\x5b\x90\x06\xbe\xa9\x92\xe0\xe6\xeb\xe4\xe2\x92\x5e\x5e\x80\x89\xf4\x4f\x4f\x29\xae\x97\x2b\xe9\x10\xf1\x19\x6e\x91\x4c\x45\xf7\x8d\x50\x9c\x4a\xcb\x44\x11\x04\x6d\x47\x3a\x4e\x87\xc5\x95\x06\xbc\xe5\x90\x33\x15\x6f\xf5\x31\x5f\xf7\x9b\x23\x4c\x9c\xa0\xb0\x25\x72\xa1\x60\x7d\xd4\x0c\x95\xec\x60\xfb\x7d\x45\x8b\xa7\x99\xf1\x9e\x0d\x3b\xda\x96\xcf\x4a\xc6\xec\xb9\x93\x1d\x19\x44\x47\x56\xb6\x6c\x1a\xd8\x7a\x3b\xfe\x12\x06\x09\xf3\xfc\x31\x94\x17\x89\xf7\xaf\xb3\x0a\x94\x08\x55\x3b\x88\x97\x4b\xaa\x58\xf4\x3f\x07\xd9\xe6\x73\x4e\xa3\x8d\xfc\xe0\x22\x75\x72\xee\x46\xa5\x6d\x4e\x05\xca\xd9\x99\x40\x79\x71\x38\x8c\x86\xc3\x85\x1b\x05\xdf\x04\xa3\xe0\xcb\x62\x45\xd7\x30\x47\xc9\x46\x1a\x70\x51\x54\x28\x43\xce\x39\xef\x22\x07\x0b\x05\xc5\xd5\x87\xf3\xfe\xa6\xc2\xd3\xd9\x70\xb8\x1a\xae\xf7\xdd\x06\x07\x12\xac\x71\x1c\x2a\x02\xef\xfd\xf0\xc1\x91\x2c\x02\x69\x38\x36\x2e\x83\x85\xe7\x8a\x31\xc6\x3b\xd4\x47\xba\xfb\x8d\x52\x7e\x56\x32\xbd\xfa\xb3\x8e\x05\xe5\x28\x8a\x72\xa7\x7c\x83\x9a\x3a\x86\x05\x95\x01\x1e\x02\x50\xd0\x86\x63\x6a\x16\x93\x96\x54\x25\x6d\xd2\x27\xf2\x0d\x4f\x31\x86\x09\xc6\x00\x19\x2d\x35\xea\x59\x55\x66\xf8\x08\x1e\xf8\x43\xc0\x52\x47\xc8\xf4\x50\xe2\xd1\x91\x13\x4a\xb6\xaa\x08\x93\x76\xd4\x87\xda\xe9\x65\x43\x7a\x0c\xee\x8f\xfa\x05\xfe\x36\xc1\x99\x49\x0b\x3e\xee\x98\x27\x69\xd5\x03\xab\x64\xdc\x4c\x3d\x74\xaa\x48\x4d\x3d\xc8\xda\x72\x75\xfc\xc8\xf7\xd0\x7b\x07\x9c\x57\xbc\x83\xa0\xab\xeb\xb2\xe3\x3b\x80\xc5\x64\xbe\x0b\x4c\x2a\x7e\x2f\xa3\x17\xc2\xef\x95\x34\x24\x46\x48\x40\x57\xef\x00\x6e\x59\xc9\x04\x9f\x24\xc2\x54\x66\xf7\x3b\x21\x61\x12\x4f\x61\x99\x91\x6f\x02\x2f\x67\xa4\x69\xea\x4f\xe0\xe6\xdd\x55\xce\x1f\x82\x0d\x78\x55\xb1\xc6\x36\x90\xff\x5e\x60\x6d\x3b\xe8\xd2\xf9\x89\x0a\xa5\xe1\x8e\x77\x25\x4b\x00\xc0\x39\x2b\xc9\x63\x32\xc7\xdb\xee\xbe\x14\x70\xd1\xba\xea\x08\xaf\x98\x00\xd2\xd7\xfb\x62\xed\x5e\x5c\xc3\x16\xd1\x18\x94\x1a\x8f\x57\x62\x3e\x1b\x85\x39\x86\x05\x36\xf2\x61\xc3\xba\xbf\xab\x67\x98\x23\x7b\xa6\xd6\xdf\x38\x63\xff\xc4\xed\xae\x14\xf8\x9f\x00\xc5\x83\xca\x22\x5d\x14\xb3\xd9\x42\x71\xfc\x26\x65\xab\x62\x2d\xec\x02\x1d\x66\x4e\xd3\x0d\x3a\xa5\xd1\xc1\xa5\x05\xd6\x8f\xae\x98\x6d\xf2\xed\x7c\xc5\xde\x5a\xbf\x2e\x84\x1e\x9b\x88\x79\xee\x49\xb5\x27\x25\x98\xa6\x1b\x05\xc2\x36\xb5\x47\x28\x36\x4b\xf7\x7c\x44\x62\xec\x73\x80\xf9\xb8\x8d\x3a\x19\xa1\xdb\xd4\xfb\x0e\x8c\xaa\x16\xe0\xf6\x12\xbc\x16\x66\x39\xb3\x17\x22\x70\x07\xe4\xaf\x1f\x50\x82\x69\x4c\xfd\x63\xb0\x83\xd2\xb4\xff\x37\x54\x45\xe5\xb6\xc7\x4f\x96\x30\x35\x0a\x7b\xf6\x00\xe0\xa8\xed\x9b\x82\x7f\xfe\x28\x28\x15\xa2\xd1\x79\x08\x2d\x1d\xdb\x80\x72\xe9\x19\x72\xd4\x4b\xd3\x5a\xb0\x4a\x7f\x0c\xab\x33\xcd\x28\x7e\xa3\x45\x78\x86\x70\x16\x4b\x26\x8a\xa2\x51\xf5\xa3\xfd\x02\xf5\xaf\xf4\x49\xc6\xc2\xf4\x13\x16\x22\xdc\x3c\x1c\x11\xce\x02\x8b\x2c\xd9\x86\x74\x6c\x04\xb6\x29\x09\x79\x3a\x62\x9a\x8e\x61\xf5\x4a\xb6\xcd\x5e\x44\x11\x51\xa6\x87\xf7\xd6\x09\xc2\x0a\x86\xa6\x2b\xb2\x9e\xa6\xb9\x00\x79\x45\xd6\xa9\x50\xf7\x43\xb8\x24\x55\x05\xac\xff\x6c\xc2\xab\xb6\x23\x15\x15\x4b\x97\x73\xd0\xde\x36\x58\x66\x09\x81\x99\x6f\x13\xa3\x95\x25\x3e\x5d\x63\x32\x5e\x32\x44\xa8\xd7\xb5\x0e\xb5\xda\x25\xca\x83\x0b\xa6\xd8\x98\x1a\x89\x2e\x74\xab\x23\xcf\x85\xe1\x88\xa9\xa5\x55\xbd\x2b\x83\x17\xd2\xc0\x91\x55\x1c\xfd\x38\x69\xb8\x92\x59\x8c\x97\xa6\xee\x14\x62\x34\x15\xe9\x3a\x0e\x27\x92\xef\x11\x4a\xfa\x06\x2e\x36\x25\x4b\xfd\x37\xc3\xa6\x10\x50\xe7\xd1\x29\xa8\xfb\x85\xe8\x14\x03\x8e\xf1\x69\x1c\xf7\xd0\xc0\x12\x9f\xa6\xc1\x73\x05\x8a\x27\x2a\x0d\xbd\xc5\x1b\x47\x52\x78\x0d\x2a\x6e\x0e\xcd\x09\x54\xad\xdb\x64\x72\xef\x64\xbc\xec\x44\x7d\x95\x76\xa1\xc6\x47\xa0\x3a\xbe\x33\x65\x56\x2d\xeb\xec\x94\xbe\x04\xb6\xa6\x84\x30\x48\x7b\xbb\x4b\xc7\x67\x95\x96\x04\x66\xa1\xbd\xcc\xf1\xc6\xb0\x16\xc8\x32\xfc\xba\xf7\x1d\x71\xbe\x9a\xaf\xf1\x09\x37\x73\xd4\x0f\x17\xe9\xd5\x3f\xda\x25\xd9\x77\xf5\xf2\x1f\xed\xf2\x8a\xcb\xc4\xa3\xb4\x71\x99\xaa\x38\x66\x69\x7f\xe3\x41\x21\xcc\xe6\xc3\x41\x1a\x41\xb2\x66\x99\x75\x42\x0c\x21\x59\xc8\xff\xd4\xd5\xbb\x64\x8e\x4b\x56\x74\xc9\x1c\xe7\xbc\xdd\x09\x83\x04\x64\x65\x4d\xef\xc0\xd1\xb1\x38\xd9\x00\x3f\xd6\x52\x59\xe6\xbd\x37\x1f\x6e\x81\x92\xdc\x4b\x48\x7b\xcb\x34\x79\x4d\xc3\x32\xbf\xd4\xca\xe3\x53\xb5\x2a\x43\xbf\xf9\xd6\x7d\xa5\x4a\xdf\x04\xf9\x68\xed\x7f\x37\x08\x81\x98\xd0\x39\x2e\x53\x86\xef\xd3\x53\x69\xf7\x3e\x38\x7e\x38\x78\xd6\x71\xff\x01\x57\x29\x10\x6f\x86\xd1\x83\x1e\x0b\xaa\xec\x3a\x96\x46\xa0\x84\x35\xb9\x8b\xeb\x7d\xa7\x1f\x20\xc2\xf5\x6b\x46\x50\x4b\x33\x43\xa8\x27\x88\xf0\xee\xdc\x18\x73\xd1\x45\x22\x47\x26\x0c\x8a\x6e\xc1\x44\x97\xae\xab\xef\x41\x9a\xb2\x28\xda\xc6\x5d\xbd\xbb\xdc\xc6\xaa\xba\xf8\xf2\x76\x76\x7f\x53\x2f\x25\x69\x28\x2b\xb9\x6f\x34\xbb\x9f\xdd\xbe\x9b\x2f\x4d\x6f\x73\xe2\x4a\x37\x90\x0f\x97\xfc\xa6\xb2\x07\xb2\xe4\x7f\xfa\xab\xf8\x3d\xe3\xef\x76\x4b\xdd\x29\x61\x83\x63\x2c\xa5\x47\x59\xb2\x12\xe4\x77\x4b\x02\xef\x49\x49\xa5\xff\x9f\xff\x5d\x2d\x85\xe1\x2d\xe6\xf8\x56\xf3\x2c\xd9\xed\xca\xc7\x5f\x0c\x2f\xc0\xdf\xb1\x21\x4d\x47\x46\x0a\x9f\x41\x12\x56\x93\x86\x73\x03\xe3\x02\x04\x70\x49\x95\x3c\x3a\x2e\x9e\x0b\x71\x74\x7c\x37\x0e\x6f\x9c\x39\xff\xd3\x3c\x17\xd1\x68\x20\x1a\x14\x13\xfa\x0b\x0c\x1d\xa8\xc3\xcc\x91\x64\xc2\x18\x1f\xf2\xc9\xc6\x7d\xa5\x4b\x44\xb7\xe9\x8e\x34\x2d\xfb\xa1\xea\x20\x53\x87\x78\xee\x49\xb3\xe1\xd5\x4c\x09\x86\xeb\xb9\xe0\xb8\x13\x4d\xe4\xe6\xca\x36\x0b\xde\xfe\x4c\x7e\x86\x5b\x14\x45\x70\x2b\x33\xfa\xf2\x99\x8b\x67\x2e\x9e\x33\x41\x3c\x69\xa6\xe8\x0c\x67\x92\x16\x52\xf5\xdf\x25\xc7\x44\xc3\x24\x24\xaf\xd9\x5d\x21\xfa\x7a\xe3\x4f\x18\xe9\x9b\xc4\x75\x38\x59\x2f\xa9\x7e\x22\xdd\x36\x6e\xea\x7d\x95\x43\x22\x66\x40\x4a\x72\x79\xaf\xc5\x1b\xe1\xbd\x1e\x85\x75\x38\xf7\x4f\x1b\xc9\x72\x73\x55\xe8\x30\xc2\xd9\xdd\x18\x67\xd2\x97\x51\x6c\x41\xa3\xe8\x6e\x9a\x0a\xd9\x2a\x3d\x2d\x77\x95\x9b\xd9\x1d\xc2\x57\x8a\x4f\x0e\x5d\xbd\xb3\x05\x53\x6a\xb7\xca\x74\xbe\x50\xeb\x7f\x37\x8f\x22\x58\xa6\xb3\x37\xdf\xa8\x67\x83\x9d\x39\x66\x86\x6b\x33\x84\x5f\x06\x9a\xa6\x79\x2d\xe4\xbf\x13\xce\x29\x2c\x67\xc5\xe5\x2d\xbe\xc5\x8a\x17\x55\xb8\x6f\x32\x6e\x76\x37\xdb\xe0\x3b\xac\xf4\xc1\x22\x8f\x22\x67\xf2\x61\x38\xbb\xef\xe5\xf9\xf8\x36\xab\x2e\x9d\x62\xad\x4a\x28\x26\xcb\x6f\xe7\xdf\xc0\xeb\x19\xb9\xca\xd0\x25\xf8\x1f\x20\x01\xa3\x23\xa2\x56\xdf\x9e\x38\x22\xa1\x28\x3a\xb3\xb2\x40\xfb\x1f\x0b\x62\xd2\x82\xbe\xb7\xad\xad\x2e\x23\x08\x85\x1b\xbd\x54\x37\x8f\x24\xa0\x63\x9f\x3b\xb0\x16\x18\x25\x7e\x94\x43\x30\xed\x84\x57\x93\xae\xde\x4d\xd4\xae\x4d\x04\xc2\x26\x4a\x56\x3d\x9b\xe7\x73\x2e\x2f\xca\xb4\x21\x3a\x1d\x18\x4e\xbd\x82\xc5\x21\x79\xd3\x47\x69\x7a\x81\x73\xc2\x44\xc1\x6c\x9c\x3c\x0c\x59\x8d\x61\xc3\x88\x09\xca\x7f\xf6\x64\x68\xfe\xca\xe8\xee\x97\x88\xbe\x73\xc1\xdc\xa0\xe4\xd6\x07\xf8\xbc\x7d\x30\xbe\xe8\x99\xa3\x35\x0b\x48\x74\x60\x51\xc6\x58\xa4\xe1\xa3\xa3\xab\x53\x63\xa3\x11\x37\xf4\x58\x37\x7c\xc3\x2b\x52\xce\x74\x7b\x24\xfc\xb4\xd3\xdf\xf1\x78\x78\x9b\x27\xd5\x2d\x46\x44\xdf\xdb\xb5\xa7\x0e\x5a\xf7\x84\x3e\xf2\x41\x8d\x3d\x34\x36\xaa\x87\xd6\x62\x5f\x1d\xdf\xfb\xd1\x01\x0b\x35\x13\xa3\x7e\x2f\x64\x25\xaf\x36\xef\x4b\xce\xaa\xee\x3f\x19\xed\x96\x27\xde\x43\x94\x3c\xc9\x23\x49\x49\xe6\x89\x24\x65\x40\xd8\x97\x4a\x28\x1d\x87\x61\x0e\x6d\x8a\x8c\x97\x35\xd4\xf1\x03\xf1\xd2\xc7\xec\x7b\xeb\x85\x2c\xa5\x0a\x50\x32\x37\xd3\x16\x8c\x92\xff\x5a\xbd\x64\xb1\x84\xf4\xea\xcd\x8c\x5e\xbd\x39\x1a\x83\xc6\xed\x37\xcb\x9f\xed\xa0\x6d\x98\xe0\x4c\x57\x6f\x66\xf9\xd5\x1b\xb7\xfb\x8c\x1e\x93\x17\x35\x34\xf3\x1c\x47\x68\x08\x93\xf4\xf0\x32\x20\x13\x64\xd0\x62\xce\x6e\xb4\x5f\xd4\x3b\xa4\xe4\xc3\x01\x06\xb6\x5f\x38\x83\x5d\xc9\x96\xfa\x7f\xe5\x82\x64\xd2\xd9\xd0\xaf\x86\x37\x4a\xf0\xdd\xc9\x1b\x2f\xc4\x37\xfb\xeb\x70\x18\x1c\xaf\x33\x41\xd6\xc1\x80\xc4\x57\x27\xc3\x4b\x34\xe4\x57\xe7\xb7\x4e\x12\x4b\x89\x38\x54\x02\x2a\x26\x3b\x18\xff\x81\x94\x3c\xf7\x6e\xb1\x1a\xa7\xdd\xb5\x6b\xf0\x73\x9d\x33\x53\x38\xe4\xe6\x88\x03\xb1\x67\x13\x51\x53\xe7\xc6\x06\x11\x19\xe1\xa4\x8e\xa6\xeb\xe3\xb2\xc3\x53\x82\xed\xf3\xed\xaf\x43\xa5\x5a\x1f\xf4\xd7\x93\xbd\xdc\xa7\xe7\x6b\xbd\xfa\x20\xc7\xf2\xeb\x86\x31\xa4\xbb\xba\xa0\x7a\xaf\x06\x95\xfd\x54\xc5\x5a\x20\x15\x84\x26\x83\x58\x90\x0e\x10\x99\xb3\xb6\x6b\xea\x47\xcf\x64\x77\x23\x22\x6e\xd2\xc0\x68\x0e\xb9\x6b\x83\x12\x02\x0f\x28\xad\xe4\xfe\x16\x02\xd8\x4b\x21\x6a\xa2\x5a\xb8\x0f\x5f\xe3\xc0\x8d\xc9\x2a\x9c\xbe\x2a\x0a\xb2\xc3\x01\xe8\xc5\x0b\x7b\x42\xd8\xd2\xfe\x11\x1a\x9b\xf3\x78\xc5\x09\x9a\x3e\x55\xa8\x7b\x87\x92\x85\xe6\xd3\xf9\x74\xa1\xc1\x88\x4e\x18\xfe\xa1\xe4\x90\x4a\xe4\xec\xea\x9d\xba\x4f\x48\x25\x72\xd4\xf9\xc3\x7e\xa6\xf1\xed\xa7\xbf\xa8\x0e\xfd\x75\xa7\x06\xfa\xdb\x16\x20\x37\x11\xe4\xaa\xc0\x53\x18\xe8\x93\xb8\x4f\x4e\xa6\x48\x5f\x2b\x62\xa3\xe3\xba\x5e\x5e\xd7\x73\x26\x00\x9c\x48\x1d\x99\xb5\x78\x99\x21\x3f\x65\xb4\x7d\x3b\x68\xac\x05\xf5\xcd\xbb\xab\xed\xdb\x9b\xc0\x60\xb6\x8a\xd4\xcf\x29\x1d\x91\xcb\x34\x2f\x5b\xab\x6d\x8e\xfc\x3b\x9b\x3c\x82\xf8\xe3\x21\xfe\x2f\x35\xef\x9d\x28\xba\x0d\xc7\xf5\x26\xbf\x8f\xae\x97\x9a\xfc\x83\xce\xb6\x22\x37\xd4\x7d\x9c\x7f\x37\x23\xaa\xd0\x56\x3f\x34\x0d\x7b\x13\x41\x57\x62\xa2\x2d\xea\xf0\x32\xe4\xd4\x10\x1d\x0e\xa7\x1b\x04\xe2\xab\xaf\xb1\x25\xb5\xe6\x74\x91\x3a\xb6\xc3\x9e\xdd\x2e\x6b\x80\x64\x61\x03\xc4\x35\x3f\x2c\x82\xc3\x76\x47\x16\xeb\x06\x4b\xfb\x4b\xd9\x1e\x44\xda\x1e\xf6\xe5\xd7\x37\x16\x82\x46\xc2\x19\xab\xc6\x18\x05\xd2\xc2\x39\x65\xd6\x18\x63\xa1\xe3\x3b\x4f\x91\xe8\x7d\x5c\xb8\x0f\x5f\x43\x91\x18\x19\xf3\x47\x14\x89\x95\xb9\x5f\xa4\x48\x74\xef\x90\x22\x31\x9f\xce\x2b\x12\x83\x91\x57\x28\x12\xc7\xe9\x96\xae\x81\x0c\xbf\xcb\xe3\xab\xee\xa5\x77\x4d\x4d\x59\xdb\x2a\xe7\xd1\x4f\xe0\xa6\x04\xca\x1b\x8b\x79\x0b\x55\x00\x15\xe9\x68\x6b\x42\x6d\xc9\x5d\x9d\x3f\xa6\xc4\x7c\xd6\x2f\x55\xfc\x57\x87\x89\xd3\x51\x0a\x57\x9f\x78\x17\x7e\xb9\xfa\x35\x6b\x77\x8f\x4e\xa9\x4c\xf1\xba\x3b\x2d\x4c\x06\x36\x1d\xd0\x9b\xae\x0e\x85\xb2\x6c\x06\x0d\x4f\x89\x86\xaf\x36\x36\xe5\x32\xd2\x3f\xbd\x04\x93\xb8\x22\x0f\x93\x92\x4f\x6e\x26\x44\x1f\x8c\x53\xbe\x59\x9b\x12\xb8\x5a\x9b\x03\xdf\x72\x26\xef\x95\xba\x9e\x47\xd9\x86\x8e\x35\xdc\xb0\xa2\x61\xed\xd6\xd8\xcb\x1a\xf5\x10\x1d\xdd\x6a\x0c\x35\x43\x72\x3d\x1f\x46\x95\x64\xdf\xf3\x0e\x6d\x9a\xaa\x4d\x5a\x02\x35\x12\x48\xc0\x4e\x7b\xc3\x3a\x41\x7f\x6e\x0d\x0b\xa7\x32\x72\xd1\xef\xb3\x92\x0c\x1e\xce\x51\x7c\x4f\x42\x95\xfb\x23\x3e\x74\x4a\x95\xfc\xa2\xa6\x22\xbd\xfa\xe7\x9f\xe3\x2b\x93\x86\x89\x22\x79\x9b\xb4\xb9\x3b\x21\x8a\x0a\x7b\x84\xaf\x18\x55\x0a\xad\x56\x85\xbc\xf9\x4c\xfa\x91\xc2\x0a\xe2\xed\x6f\x72\xe9\x90\x0e\x88\x50\xc8\x6c\x38\x57\xa7\x83\x07\x5f\xfa\x12\x7f\x84\x30\x5b\xaf\x0f\x07\x59\x3d\x8a\xe2\xb6\x6e\x9c\x7c\x9f\xb4\xc2\x0c\x3f\xae\xe6\xeb\x99\x70\xfe\x8e\xe3\xd3\xaf\xd4\x60\x37\xde\xed\x5b\x95\xb5\x16\x92\x1a\x53\x83\x62\xe7\xfd\xf5\x5a\x07\x5c\xbd\x8b\xe5\x24\x4d\x9c\x76\x6e\x4f\x42\x7f\xe9\x91\xbf\x82\xc2\x58\x08\x7e\x2f\xe1\xc9\xa9\x17\x2a\xfe\x60\x0a\x8a\xc5\x26\x0f\xbf\xe1\x3c\xa5\xb3\xd0\xcc\x5b\x93\x5d\x31\x65\x2f\x6a\xd9\xe6\x16\x3a\xbd\x5a\xac\x6f\xf2\x74\x19\x42\x9e\x21\xbc\x49\x73\x73\x94\x6f\x33\x4d\x21\x49\x8b\xb8\x24\x6d\x07\x91\xc0\x96\x0e\x9d\xc9\x4e\xa4\x63\x90\xc8\x6c\xe7\x26\x8a\xb2\x77\x32\xa4\x3b\xe8\x79\xa2\x4b\x51\x37\x90\xf4\x15\x37\x64\x36\x5b\xa0\xcd\x34\x2d\x56\x64\x1d\x45\xd9\x4d\xca\xe4\x0f\x38\x65\x2b\x72\x79\xbd\x3e\x1c\xe4\xe0\xe2\xe7\x68\x30\xd1\x65\xa8\x61\xf5\x37\xcf\x3f\x1c\xf3\x7e\x66\x2e\x60\xec\x39\x46\xf9\xd0\xed\x7f\x55\x1d\x2f\x43\x22\x0b\x9f\xbb\x2a\xce\xc9\xcd\xda\x61\x2f\x4d\x7d\xa1\x9a\x16\x5c\x5c\x66\x97\x17\x60\x8d\x2f\x2e\x87\xcd\x04\xdf\xd9\xef\x17\xf2\xe0\x3d\xb5\x40\x41\x50\x72\x10\xba\x4f\x6d\x61\xaf\x69\x77\x0e\x1e\xdf\xb3\x6a\xef\x9c\xb1\x85\x79\x9a\xf7\xe7\x70\x4b\xee\x1c\x1e\x0c\x8c\x88\x70\x7f\xd6\x1b\x18\x6c\xf6\x3a\xa1\xdd\x3d\x0e\x2e\x24\xb6\xef\x17\xfe\xe3\xd7\xb0\x11\x9c\x39\x5f\x78\x33\x71\xdf\xe3\x8b\xae\x67\xb0\xdd\x43\x46\x41\xff\xf1\xbc\x59\xd0\xa3\xa1\x2f\x49\x7d\xd9\x5d\x56\xa2\x8f\xb9\x7c\xe6\x25\x17\x59\xd9\x99\xfe\xf0\x4d\x56\x86\x53\xdc\xc3\x84\xc7\xc5\xf9\x7a\x08\xb7\x13\xa6\x69\xd6\x13\xdb\xbe\xd4\x87\x7b\x5d\xd2\x44\x00\xe1\x3c\xcd\x06\x1a\x48\x5e\x85\x74\x38\xc0\x7c\x78\x7e\x3f\x4f\x4f\x56\xd1\xda\xa3\xfa\x78\x6a\x0f\xe2\x2b\x4e\x09\xdc\x69\xa9\x2b\xa3\xa9\x7f\xef\x63\x22\xa4\xdb\x84\x00\x21\xdf\xa4\x09\x36\x28\xed\xe8\x48\x36\xbe\xd5\xf2\xa8\xcf\x5b\x1b\x3e\x29\x10\x9e\x16\xcf\x5c\x8b\xb3\x49\x09\xcc\x4d\xbe\xd7\x08\x2f\x1f\x62\x4c\x5d\x13\x45\x7c\xdf\xe0\x4d\x9f\xf2\x77\x70\xde\x4f\xfb\x24\xf6\x24\xe9\x73\xbe\x12\xd6\x11\xa8\xc7\xd1\xf5\x2e\x01\x19\xa9\x62\xd4\xd6\x30\x65\xf2\x4f\x59\x04\xa5\x5c\x7f\xeb\x95\xb7\xa9\x93\x9b\xc9\xb9\x9b\x34\x43\x17\x5c\xe2\xcd\x52\x86\x6b\xbd\x60\x7c\x36\x48\x71\x0a\x7f\x6a\xe4\xa4\xaa\xeb\xb4\x4f\xc8\xbe\x28\xca\x5e\x2e\xf1\xb0\xa0\x2f\x7d\x81\x43\x61\xe9\xc3\x59\x0f\xde\x08\x12\x7c\xe9\x1f\xac\x58\x6c\xce\xfd\xc9\x0a\xf6\x5c\x16\x89\xc9\x3f\xcf\x31\x4a\x65\xf9\xb1\x3d\x92\x2d\xcc\x8f\xaf\x12\xd3\x23\xd9\xe8\xef\x57\x48\x62\x72\x45\xe8\xcb\x04\x68\x47\xb2\x60\x60\x8e\x64\x2f\x09\xca\x91\xec\x7c\x05\xbf\x18\xea\x64\xfd\xbe\x80\xda\xde\xae\x68\x5e\xee\x78\x39\xaa\xe9\x0f\x14\xc6\x9b\xbf\x86\xd3\x91\x4c\xf1\xff\x17\x56\x8d\xf7\xb5\xcc\x2f\xf4\x94\xfe\xa2\x14\x43\xea\x6b\x88\xde\x1b\x23\x45\xc1\x3f\x3b\x6b\xf6\xaf\x3c\xdf\x32\x7a\x67\xd2\x6a\xee\x25\xe9\xfd\x9f\xf8\x78\x71\xf7\xdf\x78\xb7\x95\xf2\xef\xc7\xba\xde\x05\x4b\x7d\x9d\xca\x6b\x39\xac\xa9\x7d\xdf\x57\x3b\x5e\xa9\x9f\x3b\x5e\x55\x36\x0f\xd6\xfb\x58\xde\x44\xea\x06\xc2\xff\xfc\xf0\xeb\x87\x8f\x29\x90\x03\x4d\xe4\xbf\xb3\xae\xde\xe9\x5f\x3a\x51\x86\x03\x2e\xd8\x7c\x9c\x56\x74\xe7\xf4\x2f\x48\x1b\xc1\xe4\x5d\x6e\xec\x7e\x78\xe6\x9e\x3c\x0d\xab\x27\x3d\x04\x94\xda\xe8\x33\xf1\x25\x5d\xf3\xe4\x18\xff\x78\x78\x8e\xcd\xe4\x10\x17\xa7\xa0\x48\xa9\xcc\xec\x91\xc1\x75\xf4\x27\xb7\xc9\x5d\x6e\xe0\xaf\x88\x9c\xa2\x11\x7c\x8d\x9e\x99\x21\x84\x43\xbb\x04\xdf\xdd\xeb\x8f\xc7\xf4\xfc\x6a\x7d\x90\xfc\x34\x62\x86\xb7\x53\x1b\xc4\x18\x47\x65\xe0\x30\xc9\x92\xc0\x7a\x87\xb7\x69\x11\x2b\xd2\x58\xe8\x84\xa8\x4b\x8c\x51\x04\x99\xf4\x3a\xd3\xbc\x3f\xc4\x64\x33\xe5\x85\x2c\xf2\xd9\xa4\x05\x0a\x65\x92\x37\x51\x04\xf5\x2c\x83\x9a\xbe\x60\xf3\xad\x1c\xcc\x00\x33\xec\x21\xc9\x82\x4b\xf2\x9f\x3a\x1c\x12\x45\xf9\x65\xff\xf4\x2e\x95\xc0\x2e\xa7\xd7\x89\x6a\xb8\x8d\x22\x05\xbe\x8f\x1a\x83\xce\x9b\x94\xce\xb6\x7d\x09\x9b\xea\xb3\x89\xa2\xcd\x4d\x9a\xeb\xaa\xb7\xe9\xb5\xad\x3f\xd5\x28\x99\xa6\x29\xd7\xe2\x48\x83\xe0\x0f\xae\xee\x3f\xae\x77\x32\xd3\xaf\x8b\x89\x34\x71\x5f\x42\xbe\x04\x33\x70\xc9\x13\x00\x10\xbe\xb3\xc6\xd1\xed\x25\xb0\x72\x05\x9c\xba\xe8\xe0\x0e\xe1\xbb\x67\xaf\x36\x30\xf2\x83\x63\x47\x82\xf4\xf9\x71\xbe\x34\xe1\x5e\x97\xb9\x21\x4a\x7a\x91\xf2\x42\x56\xbd\x75\xff\x30\x99\x5e\x81\x35\x27\xf5\x52\x31\xd0\xe0\x00\x24\xb6\xbb\x87\x62\xf4\x87\x2a\x14\x18\x32\x51\x4e\x67\xdb\x59\x78\xa7\x8e\x08\x99\xab\x60\xb4\xca\x96\xc3\x2f\xfa\x9f\x5f\x43\x6d\xeb\x0d\x78\xa1\x67\xa4\x17\xfa\x25\x5e\x91\xd2\x20\x01\xb5\xae\x3e\xbc\xe0\x8f\x51\xc9\x25\x7f\x91\x27\xa4\xc0\x3e\xeb\x08\x49\xbf\x43\xff\x69\x26\x13\xeb\x49\xcd\x8f\xc3\xe1\x49\x16\x7e\xcb\x87\xef\xe5\xde\xca\xbf\x13\xa4\x8b\xf7\xd4\x6e\xa7\x7e\x03\x64\x3b\x7c\xac\x77\x6e\xeb\xae\xde\xa5\xce\x27\x69\xd7\x0a\x18\xd5\x1d\x3a\xbd\xc1\xb0\xf8\xd3\xff\x0f\x00\x00\xff\xff\x92\x3b\x10\xd7\xb7\x71\x00\x00") func pagesAssetsJsBootstrap311MinJsBytes() ([]byte, error) { return bindataRead( @@ -110,7 +110,7 @@ func pagesAssetsJsBootstrap311MinJs() (*asset, error) { return a, nil } -var _pagesAssetsJsContainersJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x7d\xf9\x73\x1b\xc7\xd1\xe8\xcf\x4f\x7f\xc5\x58\x71\xbe\x05\x9e\x80\x25\x28\xdb\xef\x95\x41\x51\x55\x14\x25\x39\x4c\x74\xb8\x48\x2a\xa9\x14\xcd\x62\x2d\xb1\x43\x62\xa5\xc5\x2e\xb2\x07\x8f\xd8\xfc\xdf\x5f\x1f\x73\xee\x01\x80\x34\xed\xe4\x55\xa2\xef\x8b\x09\xec\xf6\xf4\xf4\xf4\xf4\xf4\x35\x3d\x83\xad\x2d\xb1\x9f\x2f\x6f\x8b\xe4\x72\x5e\x89\xe7\x93\xed\x6f\xc5\x0f\x79\x7e\x99\x4a\x71\x90\xcd\x42\xb1\x97\xa6\xe2\x10\x5f\x95\xe2\x50\x96\xb2\xb8\x92\x71\xf8\x64\x6b\x0b\xfe\x5f\xbc\x4b\x66\x32\x2b\x65\x2c\xea\x2c\x96\x85\xa8\xe6\x52\xec\x2d\xa3\x19\xfc\x51\x6f\x46\xe2\xaf\xb2\x28\x93\x3c\x13\xcf\xc3\x89\x18\x20\xc0\x53\xf5\xea\xe9\x70\x07\x51\xdc\xe6\xb5\x58\x44\xb7\x22\xcb\x2b\x51\x97\x12\x70\x24\xa5\xb8\x48\xa0\x73\x79\x33\x93\xcb\x4a\x24\x99\x98\xe5\x8b\x65\x9a\x44\xd9\x4c\x8a\xeb\xa4\x9a\x53\x3f\x0a\x0b\x52\x22\xfe\xae\x70\xe4\xe7\x55\x04\xe0\x11\x34\x58\xc2\xb7\x0b\x17\x50\x44\x95\x22\x1a\xff\xcd\xab\x6a\x39\xdd\xda\xba\xbe\xbe\x0e\x23\x22\x38\xcc\x8b\xcb\xad\x94\x41\xcb\xad\x77\x07\xfb\x6f\x3e\x1c\xbd\x19\x03\xd1\xaa\xd1\xa7\x2c\x95\x65\x29\x0a\xf9\x8f\x3a\x29\x60\xc0\xe7\xb7\x22\x5a\x02\x51\xb3\xe8\x1c\x48\x4d\xa3\x6b\x91\x17\x22\xba\x2c\x24\xbc\xab\x72\x24\xfa\xba\x48\xaa\x24\xbb\x1c\x89\x32\xbf\xa8\xae\xa3\x42\x22\x9a\x38\x29\xab\x22\x39\xaf\x2b\x8f\x67\x9a\x44\x18\xb9\x0b\x00\x5c\x8b\x32\xf1\x74\xef\x48\x1c\x1c\x3d\x15\xaf\xf6\x8e\x0e\x8e\x46\x88\xe4\x6f\x07\xc7\x7f\xfa\xf8\xe9\x58\xfc\x6d\xef\xf0\x70\xef\xc3\xf1\xc1\x9b\x23\xf1\xf1\x50\xec\x7f\xfc\xf0\xfa\xe0\xf8\xe0\xe3\x07\xf8\xf6\x56\xec\x7d\xf8\xbb\xf8\xcb\xc1\x87\xd7\x23\x21\x81\x63\xd0\x8f\xbc\x59\x16\x38\x02\x20\x33\x41\x6e\xf2\x24\x8a\x23\x29\x3d\x12\x2e\x72\x26\xa9\x5c\xca\x59\x72\x91\xcc\x60\x68\xd9\x65\x1d\x5d\x4a\x71\x99\x5f\xc9\x22\x83\x11\x89\xa5\x2c\x16\x49\x89\xb3\x5a\x02\x81\x31\xa2\x49\x93\x45\x52\x45\x15\x3d\x6a\x8d\x2b\x7c\xf2\xe4\xa2\xce\x66\xf8\x56\xcc\xeb\x45\x94\x25\xff\x94\x83\xac\x5e\x00\x6b\xe0\xd3\x08\x1a\x24\x55\x39\x14\x3f\x3f\x11\xe2\x2a\x2a\xe8\xeb\x0e\x7c\x46\x52\x06\xf8\x45\xec\x32\x48\xb8\xcc\x97\x83\xe1\x8e\xfa\x92\xca\xec\x12\x64\xe1\x7f\xfe\x47\x00\x2a\xf1\x72\x97\x90\xf1\x4b\xbf\x01\x63\x16\x04\xb6\xa5\xc0\xe0\xc1\x1d\xfc\xaf\x90\x55\x5d\x64\xe2\x84\x88\xc1\x26\xa7\x3b\x4f\xee\x9e\xe0\x80\xde\xe6\x69\x9a\x5f\xe3\x68\x71\x20\x07\x6f\xf6\x45\x16\x2d\xf0\xeb\x2c\xcf\xae\x64\x86\x63\x69\x0f\x0a\xc0\x70\x5c\x76\x28\x80\x1f\x68\xf1\xc7\xbc\x3d\x79\xfe\xed\x48\x9c\x04\xc7\xc9\xab\x60\x24\x82\x1f\xf8\xcf\x7b\xfe\xf3\x17\xfe\xf3\x2a\x38\x1d\xee\x58\xfa\xe0\xcf\xc9\xe4\x34\xac\xf2\xb7\xc9\x8d\x8c\x07\xcf\x87\xe2\x99\x08\xe0\xff\x9e\xd1\x9b\x6d\x22\xba\x45\xf3\x7b\x09\x82\x34\xeb\x20\xbb\x4d\x37\x83\x6e\x42\xfa\x64\x42\xa4\x33\xe5\x4c\x38\xd3\xcd\x64\xdf\x56\xb2\xbc\x3f\xe9\x48\xfb\xeb\x02\x96\x50\x24\x2a\x5c\x4e\xa1\xa5\x30\x86\xc7\xc7\xf8\x6c\x40\x53\x08\xda\x27\x91\xe5\x71\x52\xc1\x62\x1c\x89\x0a\xff\x1e\xdf\x2e\xf1\x73\x1c\x55\x11\xc8\x7a\x2a\x17\x30\xca\x83\x78\x84\xb3\xfd\x23\x88\x6d\x89\xeb\xaf\xa8\x0e\x40\x26\x6f\xec\xe0\x10\x9a\xd0\xc2\x10\x33\x79\x0d\xb2\x8d\xea\x2e\xbc\x4a\xca\x3a\x4a\x93\x7f\x92\x20\x87\xaf\x35\xd0\x60\x68\xc4\x11\x1b\x27\xd0\x68\xb2\x03\x7f\x5e\x78\xf4\x28\x81\x84\x17\xcf\x9e\x69\x91\x33\xfd\x84\x51\x1c\xef\xe7\x69\xbd\xc8\x06\x96\xea\x93\xe4\x74\xe4\xa1\x80\x07\x43\x2d\x9a\x5e\xd3\xc3\xfc\xba\x1c\xe0\x13\x7a\x9d\x5c\x88\xc1\x57\x03\x33\x56\x52\x36\x49\x16\xe7\xd7\xe1\x6c\x1e\x15\xb0\x94\x74\xf7\xde\xd3\x13\xd3\xe0\x54\xec\xd2\x6b\x5a\x14\x7d\xa3\xe7\x91\xc7\xf9\xac\xc6\x46\xe1\xa5\xac\xde\x70\xfb\x57\xb7\x07\xb1\xed\x7c\xa8\x08\x56\x8c\x9d\x95\xe5\x7e\x1a\x95\xe5\x87\x68\x21\x4b\xe0\x13\xd3\x11\xcc\x65\x04\x3a\x01\x46\x11\x4c\x45\x10\x8c\xf8\x21\xcd\xb5\x7a\x46\x9f\xc7\x05\x7c\x51\x2f\xf3\x38\x3e\xee\x7c\x8f\xbd\xed\xa8\xde\xf2\x65\x65\x3b\x89\xd2\x0a\xf4\x53\x84\x3a\x17\x1a\x1d\x55\xb7\xa9\x9c\x8a\xaa\xa8\x25\x63\x5c\x82\x30\x00\x22\x99\x21\xa6\xc0\x3e\x3b\x02\xe9\x9e\x5a\x69\x51\xa8\x60\x1d\xfd\xa9\x5a\xa4\x2e\x02\x14\x23\x9e\xc2\xa9\x15\x29\xfb\x6a\xaf\x04\x5d\x17\x43\xe7\x53\x71\x11\xa5\xa5\x6a\xe4\xf1\x63\xea\x7f\xd5\x23\xe9\x9b\xa5\x10\x85\x7f\x60\xe4\x60\x44\xc3\x1d\x36\x16\x4c\x9a\x64\x52\x50\xd3\xc6\xaa\x79\x07\x2f\xf6\xf1\xf9\xc0\x5f\x34\xad\x85\x82\x6a\xcf\xae\x0c\x50\x16\xc0\xd1\x83\xec\x22\x81\xc7\xb7\x9a\xd1\x8b\xe8\x06\x9e\x8e\xdd\xc7\x5d\xcb\x01\x71\x77\x2d\x03\xf2\x2f\x40\xff\x14\x15\x69\xa6\x8b\xa4\x28\x2b\xd0\x48\xc8\x4b\x34\x96\x91\x80\xa5\x06\xab\x1e\x41\x51\xb6\x11\x0d\x2c\x05\xf1\x15\x2c\xce\x3a\x4d\x35\x16\x5e\x13\xf0\x02\x14\x8a\x5a\xb7\xd8\x6e\x60\x9f\x92\x2c\x2a\x69\xa4\x5e\xdf\x02\x6b\x71\x48\x23\x1c\x01\x77\x60\xe8\xfe\x0c\x38\xb6\x77\xe0\xcf\x0b\x8d\xd7\x90\xfe\xd9\x92\xce\xe3\xbf\x8a\x52\x80\xd6\x1d\x7d\x3e\xdd\x51\xef\x90\x5a\x7c\xf7\x02\x3b\xb1\x4d\x84\x62\x23\xbc\xd2\x90\x77\x8d\x16\x2f\x91\x22\xaf\x05\xb1\xb8\xd5\xe2\x4e\xaf\x2e\xb4\xfb\x52\xc4\x79\x16\x54\xe2\x3a\xca\x2a\x64\x5c\x39\xcf\x41\x06\xb2\x5b\x6c\x56\xc3\x7a\x23\x17\xa5\x9a\x83\xd3\x30\x01\x99\x14\xb3\x68\x49\xfc\x46\x62\x08\x02\x7c\x20\x7c\x5d\x85\x8c\x6f\x8f\xa7\xa3\x04\x61\x04\x5d\xba\x00\x09\x23\x84\xdb\x93\x3f\x6a\xdf\xe9\xb2\x88\x96\x73\x71\x2e\x61\x39\x34\x30\xc1\x38\xae\x41\xf0\xa2\x2c\xb4\x82\xf3\x37\x12\x64\x18\x05\x82\x8d\xc5\x00\x87\x34\x66\xce\x6c\x01\x56\xad\xba\x2c\xe4\x0b\x31\xd1\x2c\x70\x9b\x4f\x76\x9c\x41\xef\xc5\x31\x75\x1d\x4b\x92\x3d\x14\x6f\x20\x4e\x82\xcf\xa6\x25\x08\x5c\x10\x82\xc8\xe4\x0c\xc6\x1f\x15\xb7\x2c\x87\xbf\x42\xd5\x77\xa9\xed\x00\x1e\x4a\xe4\x52\xd0\xd0\xd9\x4a\xec\xbc\xf5\xb0\xfd\x70\xf3\x10\x80\x2a\x3a\x97\x45\xb3\x97\x4d\x2c\x03\x33\x6c\xbf\x90\x40\x29\x71\x05\xf5\x00\xb1\xc6\x1f\xed\xef\x65\x42\xac\x0a\xba\x8f\x19\x81\x21\x1c\x7f\x7c\xfd\x71\x70\xb5\x88\x8a\x45\x9e\x0e\xa7\xe2\x5d\x9e\x7f\x01\x0a\x41\xe0\x81\x8c\xec\x52\x3b\x38\x57\x09\x74\xcc\xf4\xe1\x62\x00\xd4\xa0\x49\xca\x45\x9e\xa3\xbf\xcb\x88\xc0\x77\x59\x98\x31\xb7\x2c\xc6\xac\x86\x58\x06\x2d\x31\xd8\x05\xad\x3b\x95\x65\x98\x4b\x0c\x78\xa6\xe2\x1b\x70\x78\xe8\x41\x2a\x2f\x41\xbd\x4f\xc5\xcf\xcb\xbc\x24\x29\x84\x36\x59\x9e\xc9\xe0\x6e\xa4\xd4\xca\xac\x2e\x8f\xa3\x02\xa8\x80\x37\x33\x98\x81\xcb\xbc\xb8\x55\xd8\xae\xf6\x6e\x12\xd0\xfe\x7a\xb1\x93\x07\x30\x25\xc5\x3b\xd2\x4a\x06\xc6\xc2\xf2\x3f\xf5\xb5\xc8\xd4\xae\x8c\x91\xaf\x18\x1a\x74\xa9\x97\x0e\x79\xe7\x79\x55\xe5\x8b\xc0\xaa\x91\x1d\x66\xca\x01\xaf\xed\xeb\x79\x0e\x8b\x02\x45\x47\x49\x9a\x98\x47\xa5\x55\x08\xb4\xcc\xc1\xc7\x82\xe5\x84\x8c\x87\x59\x02\xa7\x3e\xa1\x70\x0c\x61\x94\xc9\x31\x2b\x5a\xec\xee\xba\x1a\x0d\xf9\x1c\xd2\xb0\x43\x3b\xb4\x90\x75\xdc\x76\xb8\x2d\xfe\x37\x02\xef\xac\x02\x25\x05\x3a\x09\xbf\xb7\xa0\x24\x1d\x0f\x33\x96\x3f\xc8\x8a\x87\xa6\x82\x06\xa5\xde\x12\x1c\x14\x6a\x63\xe8\x2c\x8b\xb2\xbc\x94\xe0\x26\xc7\xa5\x63\x49\x61\x3a\x0f\x14\xd0\x00\xc4\xa5\x80\xce\x46\x02\x02\xa9\xab\x24\xaf\x9d\x90\x05\x5e\xb9\x16\x49\x41\x0e\xb5\xf9\xc4\x06\xee\x7b\x83\x40\xaf\xd9\x45\x29\xc6\x2f\x45\x56\x86\xd6\x71\x46\x24\xb8\x5c\x8e\x41\xe5\x0c\x86\xa0\x47\xb1\x91\x7d\x30\x04\xbe\xa0\x3b\x0e\xff\xf4\x20\xf7\xe7\x72\xf6\xa5\xc4\x09\x71\x02\x38\x08\x23\x4b\x08\xcc\xe0\x71\x36\x4b\xeb\x58\x36\xde\x41\x48\x98\xd7\xc5\xcc\x75\xb9\x41\x0a\x0e\xd5\xd3\x01\x35\x1d\x19\x28\x1e\xb0\x22\x90\xde\x85\xfc\x5f\xc5\xd6\x97\x60\x77\x20\x1e\x73\xde\x80\x76\x3c\xd1\xad\x4f\xdb\x84\x82\xa3\x85\x91\x09\x46\xed\xb2\x40\x1a\x61\x94\xf9\x55\x12\x03\x65\x29\x04\xc2\x0f\x22\xfa\x6d\x5e\xec\xa5\x30\x5b\x1a\x2d\x38\x2d\x79\x6b\x0c\x28\xb5\x3e\x84\x1e\xc3\x2e\x08\xb2\xb1\x4a\x6a\xa8\xe4\xd0\x69\xf5\xdb\xe5\xf8\x74\xa2\xf2\x54\x3d\x29\x5c\x97\xb5\x7e\x13\x0a\x05\x0c\x89\xd6\x2f\x68\x12\xa0\x1d\x02\xf3\x06\xfd\xd3\x86\x4b\x58\x82\x22\x04\x01\xbf\x8c\x6a\x70\x68\x43\x94\xb8\x08\x33\x0b\x98\x44\x29\x12\x4c\xd6\xc0\x4b\x70\x11\xa2\xa2\x88\x28\x49\x42\x1f\x4a\x95\x59\xb9\xce\x11\x93\x5a\x57\xe5\x14\xbf\x00\x46\x08\x0f\x41\xe9\xa6\x11\x78\x02\x64\x58\x22\x74\x98\x25\x86\x97\xec\x0d\xe8\xac\x01\xf5\xd9\x70\x44\x7f\x20\x3a\x06\x8e\xc7\xc9\x94\xf1\x20\x15\x95\x75\x56\xce\x93\x8b\x6a\x70\x12\xbc\xc3\x4e\x30\x98\xfc\x2b\x62\xa6\x60\xb2\x65\xd7\x20\xac\xaf\x53\xfc\x42\x8e\x01\x8e\x4f\xc5\x8d\xd6\xe4\xc3\xdc\x74\xda\x24\x1a\xec\x71\x6e\x0d\xbe\x22\xe6\x5e\xd6\x53\x59\x12\xca\x76\x68\x63\xa2\x2d\xc6\xb6\xb6\x18\x85\x8c\xdf\x16\xf9\x62\x2a\xbe\xb7\x0f\x8e\x73\x07\xe0\x56\x62\x98\xc1\x30\xff\xf7\x3b\xf7\x19\x82\xe9\x56\xa0\x08\xf3\xe2\x38\x81\x05\x33\x15\x0a\xc8\x58\x35\x50\xfb\x71\x5d\xa8\x8f\xdf\x63\x6c\x2e\xa3\x92\x42\x90\x00\xe3\x82\xa8\x08\xee\xdc\x70\x89\x94\xa6\x31\xdc\xbd\x66\x9b\x26\x6c\x53\x93\xcd\x76\xc0\x28\xdf\x91\xe6\x8b\xab\x7a\xd9\x75\x04\x8f\x0d\x63\x95\x04\xc4\xdd\x57\xb0\xef\xf9\x0d\xae\x83\x41\x01\xd6\xfb\x75\x52\x8c\xc0\xb3\x4c\xd3\xf3\x68\xf6\x85\xa5\xe4\x6b\xa4\xe2\xcf\x47\x1f\x3f\x68\x00\xcc\x22\x44\xcb\x64\xeb\x6a\x3b\x9c\x6c\x29\xd4\x20\x34\x1a\x2d\x7b\x44\xe2\x67\x83\x46\xb9\x48\xe2\xce\xa3\x6b\x59\x76\x90\xf3\x63\x91\xa3\x1f\xd9\x20\x47\xaf\x56\x8c\xdc\x36\xa7\xee\x39\x50\xb7\x2c\x31\xdb\xe1\x21\x18\xaa\x29\x08\xc1\x9d\x97\x83\x0d\x88\xd6\xf0\x17\x51\x92\x5a\xf8\xcf\xff\x98\xdf\x00\x6d\x95\xbc\xa9\x8e\x40\xd9\xd6\xa0\xe5\x64\x51\xe4\x85\x87\xe3\xe4\xb4\x35\x6c\xb2\xdf\x9a\x1e\x65\x1e\x1a\x79\x3f\xd0\x12\x06\xc2\x67\x0f\xf6\x54\x6e\xc8\x18\xe8\xef\x50\xfe\x03\x22\x93\x4a\xfc\x9f\x49\x89\xba\xc6\x76\x3b\x07\xfd\x0e\x1e\x12\xad\xb4\x2c\x47\x9f\x63\x89\x5e\xb2\xc9\x3e\x71\xb3\x5d\x81\x7c\x0d\x59\x01\x25\x17\xb7\x03\x13\x50\x7e\x5a\xa2\x43\x0e\x62\x95\x64\x6c\x6a\x54\x4f\x32\x7e\x75\xfb\xe9\x00\xbc\x1b\x4c\x21\xd7\x08\x84\xaa\xeb\x29\xe8\xab\x33\x02\x7b\x0a\x2b\xb5\x50\xc1\x66\x60\x9e\x06\x53\xa0\x70\xe4\x3c\x64\x72\xe0\xf1\x04\x57\x10\xab\x87\xaf\xc3\xeb\xb9\xcc\x06\xda\x3d\xfb\x3a\x04\x67\xab\xea\x94\x48\x6b\xd3\x5a\x73\x3f\xd2\x63\x1b\x8e\xd6\x22\xda\xde\x2a\xeb\xf3\x8d\x70\xf5\x48\x94\x6d\x0b\x76\x67\x09\x21\x85\x8b\x0e\x1f\xb9\x11\xa8\x11\x19\x1f\x04\x4c\x78\x47\x43\x1b\x6d\x0b\x47\xba\x5e\x6b\x95\xc9\x81\x23\x0a\xd5\xfe\x8f\x9f\x44\x5d\x46\x2d\xb3\xb0\xbf\xac\x8f\xf3\x2a\x4a\x3f\xe1\x3b\xd7\x3a\x2c\xac\x3a\x18\xb1\x70\x5a\x93\xad\x3c\x0b\x90\xd1\x10\x6c\xe9\xd9\x6c\x59\xa3\xbf\xf1\x55\x87\xcb\x12\xc0\xbb\x60\xe8\xdb\x71\x2f\x53\x45\x4e\x38\xaa\x6f\xcc\xc4\x52\x54\x17\x10\x3d\xc1\xe9\x8e\x6f\x46\x4e\x4e\x7b\xc3\xbb\x96\x07\xe4\x99\x7c\xeb\x18\xba\x0e\x51\xa2\x92\x07\x8e\x5f\xe8\xbd\x06\x4f\x6f\xdb\x01\xd1\x2e\xea\x07\x24\xb5\xe1\x8d\x86\x18\x8e\x42\xb3\xc5\x92\x7d\x52\xfb\x9d\xe5\x95\x31\x68\x5b\x6e\x86\x22\xcc\xa3\x70\x59\x97\x73\x1f\xd3\xb0\x0b\x82\x40\x80\xa1\x21\x4f\x64\x85\x7c\xd2\x1e\x69\xe3\x31\x86\xfa\x96\x66\x85\x8d\xe2\x71\xc2\xa4\xf1\xda\x60\xd6\x4b\x55\x55\x7d\x49\xaa\x60\x3f\x07\xef\x28\x58\x27\x68\x69\x1e\xc5\x6d\x39\x7b\x07\x4f\x37\x91\xb0\x1e\xb1\xd8\xbb\x92\x05\x8c\xef\xf7\x10\x8c\xc7\x9c\x34\x3d\x67\xc8\x93\xb3\x88\xc7\x40\x79\x98\xc9\xe4\xf1\xa6\xe5\xb0\xce\x28\xa1\x0a\x73\x01\x8e\x53\xbc\x7a\x86\x96\xb2\x18\xcf\x60\x1e\x57\xe9\x84\x1f\x65\x81\x53\xfd\xaf\xd0\x0a\x2a\xd9\x14\xb1\x0c\x10\xc5\x2a\xcd\x54\x18\xd7\xb2\x29\x1e\x6d\x11\x50\x11\x81\x43\x6f\x88\x06\x05\x91\x94\x9e\x14\x30\x2a\xe6\x3f\x89\x37\xed\x8a\x24\x66\x0a\xfe\xd3\x55\x90\x97\xa8\x9d\x70\xa2\xb6\x87\xab\x5e\xbe\xd6\xc7\x6c\xac\x9b\x10\x0d\x2d\x06\xd2\x88\xa2\x72\x46\xdf\x4e\x3e\x9f\xb6\x15\x5a\x13\x02\x74\x9b\x83\xae\xa5\xe5\xee\x7e\x5f\x5d\x47\x54\x89\x73\x58\x76\x5f\xe2\xfc\x3a\x6b\x2f\x25\x5a\x43\xaf\xf4\xfb\xde\xc5\xe4\x05\xa2\x3d\xd1\xf1\xea\xc5\xe5\x81\x3e\xcc\xf4\x7e\x2a\x29\xe5\x19\xfc\x45\x16\x99\xbc\x8f\x0d\x6e\x90\xb9\x7e\x21\x74\x34\xe8\x5a\x10\x9d\x60\xff\x1e\x0b\x63\xa5\x6d\xae\x81\x91\x6d\x49\xc6\xa7\x9d\x96\xb9\x67\xb1\x34\x90\x96\xb7\xe0\x57\x2f\xda\x68\xf9\xf9\xef\x64\xf2\x0f\x39\xe1\xc1\x41\xac\x12\x21\x0a\xd3\x51\x44\x2e\x20\x8a\xf6\x92\x1a\xae\xc3\xaa\x32\x40\x75\xa9\x32\xc7\x88\x6d\x19\x95\x98\x0a\xc1\xc6\x6f\x69\x13\x4a\xe7\x53\x28\x2d\x18\x27\x57\x49\x0c\x21\x31\x23\x5f\xe6\x09\xb2\xc8\x0f\x83\x1c\xfc\x34\x10\xcc\x28\x0c\x3a\x7a\xe5\x1e\xfa\x1d\x8c\x0d\x44\x5d\x6f\x36\x37\x91\x77\x09\xba\x6b\x55\x5a\x0d\x70\x8f\x2b\xc3\xf8\xb3\x43\xc3\xaa\xad\xb0\xce\x36\xfe\xb2\x6a\xed\x8e\x29\x0b\xd3\xdb\xd2\xd9\x30\x73\x4d\xce\x0a\x78\xb5\xd0\x54\x23\x0a\x5b\x01\x8a\x12\x33\x10\xa1\x46\x05\x96\xf3\xd0\x4c\x73\xd2\x4a\x2f\x10\xdc\xdf\x4a\x70\x5b\x56\xfc\x53\x16\xb9\x95\x0e\x9a\x40\x2c\x00\x32\xf8\x18\x2a\x79\xb6\x3d\xc2\xb9\x3f\x97\x58\x7a\x04\xa6\xbf\xe4\xbd\x48\xb5\x61\x54\xe4\xd7\xa1\x43\xb7\xbb\x58\xbd\x75\x69\x46\xd7\x9e\x21\x60\xf1\x1b\x50\xb6\x36\x22\x73\x03\x2e\x7f\xf1\xd1\x56\xa7\x1b\x52\xf9\x40\x27\x40\xec\xa9\xda\x84\x7c\x9b\xe1\x02\x65\xc5\x62\x00\x7b\x56\x5c\x2b\x63\xe8\xca\xc9\x54\xfd\x1d\x99\x35\x3b\xe5\x85\x48\x4d\x56\x3a\x72\xee\x58\xd7\x38\x74\xee\x5a\x69\x39\x76\x2d\x9e\x59\x13\xf4\x55\x3b\xab\xdb\xb1\xc0\xd6\x9a\x9b\x99\x5e\x9e\xac\xa5\x37\x5d\xb9\x8a\xad\x36\x96\x36\x1c\x77\x6c\xca\x83\x4d\x80\xa5\xb5\xa9\x6c\x37\x8f\xae\x76\x9e\x68\x41\xf1\x55\xaa\x19\x70\xa8\x95\xab\x7d\xf2\x10\x6f\xa3\x35\xdd\x0b\xb9\xc0\xd4\x4d\xd7\x8c\xbf\xa7\x57\xbf\xfd\xa4\x33\x09\xff\x92\x79\x57\xd3\x86\xb3\xc6\x54\xf0\x0c\xc1\xd4\xe4\x99\x7c\x2f\x2f\xa3\xf3\xdb\x4a\x3e\xce\xdc\x68\x6c\x7a\x7e\xfc\x09\xa2\xcc\x35\xcd\x10\x96\xe6\xe1\x5e\x8a\xde\x41\xe8\x9c\x9a\x8f\x0c\xb4\x3a\xb4\xea\xf0\x06\x57\xfb\x4e\xfd\x0e\x98\xf1\x96\x10\x81\x22\x96\xed\x9b\x46\xaa\x7c\x54\xbd\xe5\xbf\xde\xed\x5c\xd1\xd9\xcb\x5d\xf1\xdc\x5d\x99\x2b\xfc\xb8\x95\x24\x3f\x77\x1c\x3c\x60\x9a\x26\x70\xf3\x35\xfa\x58\xfe\xa1\x5b\x34\x93\x8b\x45\x92\xa6\x09\x85\x3b\x5c\xef\x10\x7d\xe1\xdd\x0f\x58\x9b\xb8\x37\x0b\xbd\x53\x23\xcb\x52\x63\x65\xde\x47\xd5\x3c\x2c\xf2\x3a\x8b\x07\x83\x81\x19\x91\xe7\xb2\xc1\xb7\xce\xc8\x4a\x6d\x32\x2a\x75\x45\xd3\xa3\xf1\xbf\xa4\x17\xc6\x98\x39\x53\xb9\x3d\x99\xb8\xf1\x90\xda\xe0\x21\xc3\x74\x12\x80\xa1\x00\x37\x5f\x43\x9f\xfa\xc5\x63\xbc\x9a\x36\x15\x09\x86\x76\x4a\x8c\x8e\xa2\xaa\x26\x1f\x01\xd8\xe5\xee\x38\x60\xc1\x67\x68\x26\x85\x2a\x55\xdb\x82\x81\x58\xd5\x6a\x26\x08\x3b\x64\x6e\xf0\xd2\xe3\x10\x43\x9e\xcd\xb0\x76\x38\xa9\x6e\x2d\x1f\x34\xf6\x15\xc0\x9a\x39\xf4\xc7\x1f\xb2\x3b\x55\x1d\xea\x85\x90\xfb\x73\xe2\x73\x97\x95\x2f\x30\xd8\x41\xdb\xe0\x31\xcc\xed\x0f\x7a\x29\xaa\xc6\xca\xaf\xd3\xdc\x86\x7e\xb1\xfc\x5a\xfb\xf6\x3f\xfb\xae\xa2\xbb\xe9\xe9\x41\x76\x39\xa3\x9e\x63\xeb\x83\x9b\x98\x4b\x79\xc5\x26\x15\xac\xd9\x70\x91\xe6\x79\x31\xa0\x2d\x10\xc5\x00\x1a\x77\x38\x41\x69\xa5\xa7\x86\xfb\x3b\x9e\x93\x86\x23\xd3\x55\x02\x51\x7c\x95\x94\x39\xf4\x5b\x12\xee\xd0\x38\x53\x84\x20\x96\x57\x09\x6d\x4b\x5b\xbf\x50\xed\x2a\x38\xea\x55\xd5\x3b\x70\x6d\x7c\x5e\xc4\xb8\x1f\xc2\xe0\x0c\x70\x62\x39\xfa\x0c\x7b\x0f\xc9\xb5\x3c\x25\x07\xff\xed\x91\xf8\x03\x26\x75\x06\xe6\x39\x7c\xd9\x1e\x8e\x9c\xe1\x9e\x7a\xe2\x40\x25\xf5\x28\x41\x54\xcf\x44\x85\x40\x18\xcc\x58\xb6\x69\xaa\xe2\xa4\x5c\xa6\xd1\x2d\x17\x9b\x7f\x17\xea\xc6\xc1\x5b\x0b\x19\x4b\x90\xef\xb4\x0c\x44\x29\xd9\x06\x94\x15\xe8\x10\x2a\xf1\xe2\x6d\xaf\x82\x37\x11\x69\x6e\xd1\x78\xd8\x5e\x4a\xbb\x5c\x16\xd1\xcd\x99\xd1\xdd\xee\x50\xbf\xb3\x2b\xc4\x93\x23\xae\x6c\x3b\x73\xf7\x78\x2d\xb3\xac\xd0\x95\x58\x6b\x3f\x98\x8c\x5c\x60\xd7\x5d\x55\x86\xb3\x77\xf3\x98\xcc\x21\xed\xc3\x5a\x9b\x4b\xca\xe7\xf9\xb7\x24\x28\xcf\xbf\xdd\xd1\xaf\x7f\x48\x9a\xaf\x3d\x3b\xdd\xe5\xbf\xdc\xdb\x46\xae\xd5\x53\x6b\x93\x26\x1b\x38\x34\xbd\x5b\x16\xf0\xe1\x4f\x79\x75\x8f\x50\xf2\xd1\xb2\x26\x8f\x99\xc9\x58\xed\x50\xad\x6b\x72\x9d\x17\x5f\x20\xbe\x3f\xc3\xea\x87\xae\x86\xbd\x09\x89\x27\x2a\xc0\x54\xdb\xd4\x3c\x5b\xa4\x6a\xc1\x4f\x5d\x63\x52\xac\xd5\x3a\xdb\x50\xf3\xf7\x08\x8a\x6b\x7a\x40\x54\xd4\xa2\x59\x0b\xf9\xc2\xeb\xdd\xc8\x4e\x83\xa4\x0d\x4c\x9d\x66\xc3\x27\xbd\x61\x4a\xbe\x45\x91\x5f\xd2\x99\x91\xf3\xa8\x08\x1f\xcb\x11\x9c\xe7\x15\xaf\xb1\x86\xa2\xef\x99\x4a\x47\xe9\x7b\x43\xd5\xe8\x48\x93\xae\x43\xd8\xb2\x1f\x9d\xa8\x66\x79\x1a\x1b\x4c\x2e\xde\xb1\x25\x1a\x61\xbf\x1e\x04\x7f\xd0\xac\x19\xc3\x9b\xb1\x5e\xba\xe1\x75\x12\x57\xf3\x81\x1d\xe1\x33\x11\xfc\x31\x18\xb6\xda\x60\x47\xcd\x46\x4e\xe7\x7e\x2b\x86\x1b\xe3\x26\x7f\x60\x76\x79\xf1\x9b\x9b\xda\x76\x0f\xa0\x34\xc7\xcd\x27\x2e\xb6\x68\x77\xc1\x85\xf3\x78\x20\x9e\x39\xd8\x02\x31\x40\x60\x97\x05\x48\xd3\x30\x60\xd7\x74\xd3\xfc\x5d\x33\x78\x71\x56\x19\xdb\x42\xb7\x0a\xef\x22\x72\x0f\x77\xd9\x2a\x04\x4c\x57\xf9\x99\xb7\x0f\xb2\x42\x01\x39\xd0\xad\xa8\x0e\x7f\x60\x90\xf0\xbe\xb8\xf9\xaa\x4c\x50\x97\x12\xb4\x30\x7d\x05\x5b\x16\x42\x67\xce\xb0\xcc\xd1\xeb\xaa\x55\xaa\x95\x74\x26\x5d\xc6\xdb\x2b\xe2\xeb\x8c\x47\x24\xaa\x9b\xad\xe2\x46\x10\xcb\x1a\xa1\x9b\x1a\x33\x9d\xaf\x79\xe0\xae\x98\xee\xa4\x6f\x67\x4c\xbd\x5f\xb5\x3b\x86\xb3\x67\x27\x8b\xe6\x50\xab\x85\xc4\x9b\x0d\x3c\x2b\xb0\xbd\xe3\xd3\xd1\xa8\x13\x34\x6c\x6e\x36\xec\x9d\x61\x23\xa0\x4d\xe7\x4e\x51\x1e\x1a\x54\xa3\x46\x05\x62\x1b\xc2\x26\xa3\xbd\x69\x66\x1a\x9c\xaa\x74\xd0\x69\x65\x9e\xca\x30\xcd\x2f\x6d\xff\xc1\x27\xb5\xe5\x99\x83\xcb\x94\xc5\x76\x08\x4f\x83\x91\x68\xc8\x61\xf0\x14\x1d\xc8\xc0\x94\x7a\x78\x1b\x76\x8a\x2c\x2f\x1b\xb4\xd6\xe0\x2b\x01\xc1\xcf\x87\xfa\xf3\xbf\x67\xc9\xc2\x41\x76\x24\x67\xf7\x8a\x7c\xd5\xf6\xb4\x2e\x6b\x7d\x4c\xe7\xc2\x4c\x00\xc1\xb6\x05\xe2\xc4\x17\x82\xd3\xb0\xba\x39\x23\xe6\x8a\xb1\xd5\x8c\x44\xee\x3d\xda\xba\x1b\x86\x1e\x57\x1e\x87\xc4\xe2\x57\x90\x58\x6c\x48\xe2\x23\xec\xe3\x90\xd6\xc2\x44\x85\xe0\xfa\xea\x95\xb9\x46\xad\xa6\xa8\x90\xad\xec\xd4\x82\x6f\xe8\xd5\x7f\xd5\xe0\x7f\xb6\x1a\x64\x05\xf8\x5f\xd5\xf7\xdb\xa8\x3e\x5e\x7e\x0f\xd4\x7d\xdc\xf8\xb7\x57\x7e\x0f\x27\xb2\xd8\x94\xc8\x47\x50\x7f\xac\xae\x3a\xf5\x9f\x93\x6d\x72\x52\x3c\x1c\xad\xf0\x91\xbe\x86\x1f\x88\xe9\x9d\x23\x82\xe2\x0c\xc5\xaa\x4a\xb6\xb6\x30\x77\xa8\x20\x2d\xbe\xb4\xf3\xd2\x9d\xfa\xeb\x58\x90\x12\x4f\x43\x42\x70\xf2\x22\x4e\xae\x5e\x06\xbd\xa7\xa3\xd7\x27\x08\xd7\xa7\x07\x1f\x21\x39\xa8\x93\x63\x8a\xdb\xaf\x3f\xbe\xb7\xb2\xe7\xac\xb3\x07\xe4\x0d\x59\x8c\x41\x82\x55\x64\xa7\xea\xe4\x55\x48\xe7\x90\x6d\x43\x3a\x6e\x80\xf1\x9b\x06\xf6\x63\xb9\xc6\x91\x7c\x3b\xc2\xae\x30\xce\x05\xb2\xb9\x68\x1b\xca\xb9\x81\x9c\x25\x64\x18\x28\x19\xbe\x6b\xe4\xbe\x0e\x16\x78\x04\x7a\x90\xd0\x1f\x6b\x41\xf9\x3b\x46\x3e\xb8\x45\x2d\x7e\xf9\x45\xf0\x13\x7b\x62\xa6\x79\x60\x46\x2f\x11\xef\xb0\x16\x9e\x94\x30\x47\x11\x1c\x95\x7e\x28\xe9\xcc\x1a\x27\xae\x83\xe3\xe8\x92\x7c\xdb\x83\xd7\x74\x06\x24\x29\x2a\x2c\xc3\xc0\x43\xda\xf8\x9d\x4e\x67\x20\xb9\x7e\xe9\x84\x3d\x52\x4f\x18\xb9\x5a\x1c\xe1\xbb\x3e\x99\xf3\x95\xfa\x93\x41\x63\x4e\x75\xeb\xdd\x87\x8d\x72\x69\x1e\x33\x5a\xd2\xdd\xa1\xbf\x89\x62\x18\x66\xe3\x51\x81\x7c\x80\x67\x8c\x0f\x03\x4e\x7c\x72\x86\x90\x68\xbc\xcb\x65\x9a\x54\x83\x60\x1a\x18\x3b\x09\xe0\xf4\x14\xbc\x97\xf1\xf6\x48\x6c\xaf\xa8\x9b\xeb\xc0\xd9\x5f\xce\x41\x3d\xf5\x51\xf2\xb9\x4d\x89\xf2\x6f\xa8\x95\x75\x6d\xb6\xdd\x4a\x07\xea\x90\x6b\x52\x08\xec\xc4\x87\x46\x2d\x64\x4b\x1f\x9e\xd8\xff\xfa\x36\x82\x87\xfc\x39\x4f\x32\xea\xbd\xd3\x8e\x50\x4f\x0c\x02\x33\xdc\x0d\x63\xc7\x95\xc4\x61\x59\x9f\x83\x6c\x60\x26\xfa\xf9\xb7\xdd\xe0\x66\x14\x3f\x5f\x4d\x1d\x9e\x5c\xb1\x6c\x9e\xf1\x1d\x26\x17\x53\x2f\xb9\xd2\x0d\x36\xd4\x65\x1d\x24\x58\xee\x89\x40\x0b\x3f\xa3\x03\x48\xb1\x3a\xde\xd7\x49\x90\x4f\x87\x6a\x40\x24\xc4\x61\x95\xbf\xcb\x67\x11\x58\x09\x92\xf7\x81\xe9\x71\x8d\x21\xe3\xb3\x50\x55\xef\xc5\x1a\x41\x9c\xcf\xbe\xc8\x62\xcc\xdd\x02\x6b\xbf\x99\xb8\x17\x6b\xec\xb4\x74\x89\x3a\x45\x83\xea\xa4\x3c\xcc\xf3\x6a\x24\xcc\x91\x91\xa5\x3d\x60\x63\x95\x8c\xf3\xb0\x4b\xaf\xa8\xfc\x19\xa3\x1c\x57\xf9\x32\x18\xb2\xe2\x0c\x3e\xe4\xc2\xbc\x00\xd9\xaf\xd9\xbe\xb6\x75\x91\xaf\x75\x08\xc0\x54\x1d\xfe\xc8\xda\xe6\x47\xf5\xf7\xa8\xc2\x12\x33\xed\x6a\x62\x6d\xcb\x1f\xe9\xa6\x93\x37\xef\xf9\xc3\xe1\xd1\x91\xbe\xa6\xa2\xa9\xa0\xf8\x1c\x4e\xa0\x2a\xa3\x31\x91\x6a\xd0\xe4\x0b\x10\x8f\x18\x8f\xe3\xf6\xe8\x2d\xc6\xb8\x42\x51\xad\x56\x63\xce\x27\xc6\xd4\xd5\xaa\xf5\xc9\x25\xc7\xd5\x7f\xdf\x6a\xaf\x80\xa7\xaf\xa7\x68\x59\x65\x7c\x35\xc7\xed\x78\x14\x84\xea\x64\xc3\x9a\x66\xa5\x50\xdb\xa2\xb0\x89\x56\xf5\x97\x88\x83\x03\xd7\x08\xd5\x3f\x6e\x00\xb7\x4c\xe2\x8d\xc0\x22\x3c\xde\x7b\xb6\x21\x74\x89\xe2\x74\x86\x3e\x7a\xf7\x6a\xd6\xaa\x77\x2a\x9a\xdd\xf0\xde\x3e\x16\x3f\x98\xaa\x94\x55\x40\xce\x2d\x3b\xac\x43\x1f\xd8\xdf\x42\x2e\xd6\xf7\x07\x40\x1b\xf6\xd7\xee\xa8\x28\xcb\x96\xc6\x6c\x83\x0c\xef\x4b\xbf\xa7\x91\xed\x00\x56\xf4\xe2\x29\xe7\x15\x63\x68\xcf\x68\x55\x77\x97\xd0\x36\x87\xc1\x5a\xa0\x7f\xf6\x1b\xf0\xb3\x45\xec\x54\x5b\xf8\x6b\x4f\xb9\xf5\x97\x45\x5e\x2f\x41\xf0\x9b\x2d\xe9\xf9\xd9\x32\xe2\xad\x7c\xfc\x87\x3e\x6f\xc9\xe1\x05\x26\x5a\x54\xcb\x34\xc9\xbe\x60\xa5\x63\x52\x09\x0c\x93\x4a\xb3\xff\x6b\x0f\x78\x85\xad\xfe\xde\x61\xa3\x5d\x11\xbc\x88\xc4\xbc\x90\x17\xbb\x4f\xe9\x06\x27\x7b\x60\xcd\xb6\xdd\xa2\x53\x6a\xdc\x15\xbc\x78\xfa\x32\xf0\xf6\x16\xf8\x8d\x63\x75\xbf\x99\xb0\x67\xfb\x62\x2b\x7a\x19\x68\xca\xdb\x12\xc4\xed\x48\x6a\x2c\x45\x77\xf7\xa9\xbc\x5f\x6b\xe2\x7c\xfb\x02\xfe\xc0\x77\x2d\x13\xe7\xe6\xac\x5a\x11\x5b\x96\xc7\x5e\xc0\x46\xeb\xbe\x19\xb1\x6d\x90\xb5\xea\x09\x42\x94\xff\xcc\x39\xa8\x3d\x68\xbd\xc4\x0d\x14\x8e\x45\x68\x9b\x04\x33\x31\xcd\xe0\x66\x5d\x40\x63\x91\xde\x3b\x64\xec\x09\x04\x37\x8c\x24\x7f\xbb\x88\x51\xa6\x61\xb4\x5c\xca\x2c\xb6\x8e\x9b\xa5\xd0\x91\x44\x21\xe8\xd6\x15\xbc\x8e\x69\x10\x14\xf9\x35\xee\xff\x8d\xcb\xc5\x78\xfb\x79\x0b\x8c\xd1\x21\x96\xf9\xb7\x2f\x8d\xe7\x61\xaa\x3b\x12\xaa\xea\x40\x29\x9e\x52\x78\xe6\x04\x89\xc3\xa1\x5b\xee\xdf\x88\x13\x9d\x22\x2d\x4b\xa1\x43\x94\xd9\x30\x3c\x77\xda\xe2\x97\x71\x1c\x65\x97\xd6\xec\x3e\x68\xc4\x6a\xb4\xdf\xaf\x18\x6c\x2f\x41\xf8\x90\xc1\x1a\x23\xf2\x87\xeb\x44\xb9\x9e\x98\xb4\xa9\xf8\xa6\x3d\x14\xa7\xb1\xc6\x79\xaf\xe8\xdc\x1c\xcc\x17\x22\x68\x50\x19\x4c\x9b\x33\xa1\xad\x45\xe0\xf4\x0a\x50\xce\x37\x03\x41\xf9\x5e\x78\x97\xf0\x93\x3b\x2d\xce\xe8\xa1\x06\x54\x02\xa4\xcf\xc7\x87\x72\xb1\xac\x6e\x07\x86\x57\x32\xb5\xfb\xa7\x1b\x24\x72\xb4\xc2\x79\x73\xb3\x94\xb3\xaa\xf4\x4e\x37\xcc\xd2\xbc\xac\xb1\x16\x10\xaf\x66\x01\xdd\x1d\x8a\xbd\x0b\xbc\x9f\x85\xce\xab\xc9\x1b\x39\xab\x49\x03\xa1\x9a\xfa\xf3\x91\x00\x23\x84\xf6\x47\x24\x25\xe2\xbb\x4c\xae\x64\x46\xca\xbe\xc8\x53\x81\x07\x7e\xc5\xb9\xbc\xc0\xf3\x67\xf8\x2c\xc9\x6a\xb0\x57\x74\x35\xe4\x31\xdd\xc4\xa9\xb5\x19\x2f\x5e\x20\xa3\xbc\xcd\x66\xf3\x22\xcf\xf2\xba\x4c\x6f\x5d\x6d\x27\x97\x6f\xa8\x67\x4c\xa6\xcb\x65\x69\x8e\x80\x83\x87\x4e\x0f\x70\x60\xf9\x52\xdf\x19\x43\x8f\xd6\xa5\x10\x9e\x98\x84\x7b\x44\x38\xa8\xf6\x91\xc7\x07\xc3\xa9\x74\xda\x9d\x5e\xed\x72\x2f\x21\x5f\x24\x41\xf2\x84\x0f\x06\xe6\x6a\x87\xa3\xd9\x5c\xc6\x75\x2a\xd5\x65\x51\x37\x15\xbd\x47\x1c\x25\xdf\xaa\x92\xd7\x95\x57\xa8\xdf\x31\xa6\x1d\x71\x37\x12\x13\xdf\x18\xa0\xed\x34\x57\xe2\x94\x42\xf1\x7d\xd9\x51\x0d\x4f\x00\x83\xfe\x5a\xa2\xc6\x39\x6b\x9b\xcb\xa3\xce\x6d\xf1\xec\x9a\x42\xd9\x5f\x7e\xe9\x2a\xf9\x68\xd7\x4c\x32\xbf\xc8\x62\x76\x9c\x4f\x68\x95\x0c\x07\x64\xe6\xc6\x54\x80\x15\xac\x2c\x89\xda\x71\x5c\x29\x3d\x89\x10\x46\x85\x6b\x49\xdf\x9c\x32\xff\xf8\x38\x9e\x01\x18\x53\x9a\x6b\xcc\x44\xd2\x5c\x6c\x4e\xa4\xbd\x75\xaa\xf8\x9c\x45\x97\x11\xde\x3a\x75\x28\xc7\x7c\x59\x20\x9d\x6e\xc0\x33\xc4\x22\xa2\x45\x46\xf7\x9b\xc2\x1a\xa5\xdb\xfe\x5a\x25\xd7\x0a\xd9\xaa\x11\xc0\xeb\xff\xe5\x1e\x4d\x7e\x8a\xd4\xe3\x31\x5d\x26\xfb\xe9\x06\x64\x03\x0a\x4d\xf9\x46\xbc\xf2\x8e\xd5\x3a\x0a\x9f\x18\xa7\xcf\xe5\x3e\x94\x77\x1b\x51\xd0\x38\x8d\xd8\xa4\x81\xbb\x36\xa7\x19\xef\x4b\x84\x96\x32\x2e\x57\x59\x23\x68\xf7\x5d\x05\x6e\x4d\xa0\xaa\xd3\x7b\x18\xab\x34\x95\x6a\x67\x6f\x0d\x99\x7a\x5f\x6c\x63\x3a\xbd\x2a\x11\xbd\x93\x39\xa6\x6d\xde\xdf\x62\x52\xfd\xed\x58\xd3\x1f\x6f\xac\x3c\x94\x35\xb6\x80\x75\x0d\x77\xda\xee\x65\x0f\xc5\xeb\xed\x6d\x83\xaa\xa6\xe2\xaa\xc1\x6c\x2d\xd4\x75\xba\xe5\x1a\x15\x46\xb0\x20\x60\x04\xbb\xd9\xcc\x5d\xca\x8a\xbb\x50\x3d\xb8\x4b\xa3\xe9\xf1\x98\x1c\x5a\xf3\x85\x7f\x2d\x88\x83\xc1\x74\xa8\x68\xb2\x59\x37\xfb\x8f\x56\x68\x1f\x09\xbc\x42\xe9\xed\x58\xe1\x30\x73\xdb\x30\x5e\x6e\x17\x3b\x0e\x8a\xbb\xce\x99\x76\xcf\xe3\x98\x7b\x5f\x5a\xc7\x71\xc0\xe8\xc1\x4c\x57\xfe\x79\xa2\xb2\x59\x3d\xeb\x9b\x4d\x1d\x86\xf4\x1d\x98\xf4\x36\xde\x01\xee\x01\xc7\xcc\xd6\x4d\xaa\x0a\x54\xb8\x4a\x7b\x3f\xaf\xb5\x07\xfc\x07\xad\x6f\xdd\x1e\xc6\x0a\x0e\x94\x30\x00\x82\x7f\x8c\xdb\xc5\x0e\x07\x57\x9d\xa4\x7b\xe2\xcf\x53\x17\x76\x4f\x55\x79\xf0\x54\x84\xfd\xea\x16\x70\x77\x9e\x5c\x75\xa8\x1f\xb6\x4e\x26\xaa\x8a\xf5\xcd\xf9\xd7\x2c\x70\x7e\x30\x0b\x95\x06\x7e\x08\x17\x57\x9c\x4e\xf3\x19\xd9\xd7\xc7\x5a\x5e\x72\x0f\x0f\x61\xa7\x62\x69\x87\xcf\xe9\x1f\x80\x86\x38\x80\xfa\x6a\x9e\x72\x2e\x29\x59\xc1\x57\xd3\x83\xc7\x32\xe2\x6a\xca\xa8\x12\x8b\xbc\xac\x30\x43\x83\x5c\x11\x10\x9a\xe0\x5d\x8f\x6e\x9a\x62\xa5\x10\x50\x33\x9e\x94\xf6\x72\xc2\x0e\xed\xd4\x45\x23\x71\xee\x2e\xab\x28\x54\xb7\x8e\x94\x78\x44\x0a\x16\xdd\xb9\xf7\xa0\x55\x39\xc9\xb5\x32\xc0\x06\xdc\x22\x95\x5d\x28\x5e\xac\x43\xe1\x63\x68\xbc\xc4\x0b\xf0\xa2\x02\x86\x8a\x3a\x92\xa9\x75\x78\x4f\x9f\xf5\xd5\x86\xed\x91\xea\xe3\x0a\xb4\xfd\xbc\x48\xb2\x5e\xe5\xa2\x59\x66\x6a\x75\x89\x49\x5e\xdf\x0f\x99\x51\x16\xc8\xee\x49\xa5\x1b\xfb\xfa\xe6\xb5\x5f\x20\x1f\x67\x6a\x55\xc1\xbc\x37\xbb\xbe\x83\xb5\xe1\x04\x2b\x44\x2f\x36\x40\xf4\xff\xe7\x34\x23\x84\xa2\x0e\xb7\xbb\x21\xf4\x2e\xf9\x47\x1e\x54\x1f\x10\x8e\xa7\x10\x5e\x34\x2a\x9e\xfd\xe1\x00\xe8\x1e\x99\xbb\x57\x4e\x85\x1b\x3c\xe3\xe2\xe4\x97\xf4\x86\x8f\xf8\xfb\x87\x55\x89\x63\x0e\xdf\x6d\x9b\x17\xbd\x6d\xc6\x6e\x23\xef\x8d\xba\xa0\xd9\x17\x62\x9d\x91\xc4\xe0\x57\x4f\xa0\xfe\xee\x9d\x1e\xe6\x6c\x62\xef\x6d\x0a\xea\xba\xa5\xd2\x63\xbd\x53\xd6\xb2\xac\x8f\xea\x85\xbb\x43\xcf\x42\xe2\x3c\x74\x1b\xaa\xdc\x65\xeb\x1c\x3e\x3e\x36\xe5\x6d\x8c\xf2\x19\xa7\x3e\xbb\xcf\x73\xda\x4e\x34\xd8\x26\x67\x7f\xbd\x23\xf7\x80\x77\xaa\xfb\xda\xea\x22\x52\x49\x96\xd3\xdf\xd4\xe9\x77\x4d\x93\xd6\x74\xd0\x05\xaa\xc0\xff\x64\xb1\x90\x71\x82\x95\x2f\x9e\x6e\x19\xa9\xcb\x55\x31\x86\x65\xc7\xcd\xcc\x9a\x33\x37\xf7\xf6\xbd\xec\x39\xee\x86\x8b\xec\xe9\xb5\x5f\x7e\x51\xcb\x66\x05\x90\x77\x21\xab\x6d\xf1\x55\x47\x7f\xf6\x87\x3c\x4e\x8d\x87\xd9\xf4\x26\xcd\x2f\x12\x50\xc6\x6e\x55\xbf\x6d\x59\x69\x09\xa2\x68\xa3\x3e\xf1\x66\x07\x97\xd3\x69\xe3\x92\x0b\x7a\xa8\x65\x63\x85\xbf\xcb\x83\x78\x00\x4d\x4d\x9f\xb7\x97\xae\xaf\x76\x77\x29\x8b\x71\x01\xcf\x62\xc7\x1f\x73\x21\xcd\x12\x6e\x1d\x9e\xef\x5e\xa0\x3b\x1d\x48\x58\x61\xb6\xee\x22\x69\xe8\xe3\x15\x0a\xd9\xaf\x2b\x28\x4d\x4d\xec\xa0\xe3\x0c\x06\xba\x86\x3a\x06\x2d\x65\xca\x87\x1e\x1b\xe7\x66\x54\x46\x56\x7f\x75\x72\xdd\xe5\x32\xca\x6c\x6a\xdf\xd4\xdc\x4e\xb1\x86\xa4\x03\xfc\xdc\xc0\xfa\x94\xd0\xd0\xd6\x56\xe6\x8a\xc6\x21\x12\x9d\xa1\x34\x7b\x4b\x58\x17\xa2\xd4\x24\x32\xe7\xa2\x90\xe5\x9c\x2f\xde\x34\x46\x85\x2f\xaa\x2d\x15\x38\x17\x35\x9b\x61\x83\xb3\x9b\x2f\x1b\xb7\x42\xd1\x76\x94\xe6\x9f\x81\xd4\xe9\xed\xbe\x43\x8d\x2b\xcf\x2c\x9a\x62\xe9\xde\x05\xed\x6e\x1c\x35\xd6\x71\xd7\x19\xb2\xce\x22\xe5\x95\xc8\xbb\x9b\x6c\x90\x57\xee\x99\x24\xa3\x21\x36\x99\xc4\x20\xd8\x71\x2f\x8e\x4b\x53\xe7\x4c\x91\x3e\x32\x68\x67\xc2\xdf\x32\xa3\xcd\x82\xe6\x34\xf4\x97\x52\xde\x73\xe4\xad\x3d\x33\x4f\xde\x7a\x4e\xf0\x75\x22\xd4\x27\x9f\x9a\xfb\x33\xb8\x0a\xd2\xa4\xb9\xc1\xa4\x57\x4a\x55\x15\xb8\xa9\x96\x52\xe9\x0b\xfe\xf0\x14\xde\x51\x40\xf7\xeb\x77\xc3\x5b\x9c\x51\x37\xca\x15\xe8\x81\x71\x75\x52\xc9\xc5\xa6\xed\xaa\xe8\x9c\x37\x71\x46\xe0\xe2\xac\x6d\x33\x03\x97\x10\xd7\x8b\x5e\x3a\x21\x36\xa6\xcb\x7a\x1a\x55\xee\xc3\xb5\xa8\xba\xf4\x85\xd9\xa2\x76\x94\xdb\xe6\x73\x33\x31\xf7\x39\x69\xe3\x4f\xaa\x82\x7d\x2e\xba\xd7\xb7\x7b\x37\xc2\x57\x29\xc6\xb7\x72\xb2\x62\x1d\xc5\xb0\xce\x5b\x24\xda\xdc\x05\xac\x86\xfd\xeb\x72\x55\xed\x2b\x6b\x7b\xbd\x0b\xfe\x87\xca\xa9\xb5\x21\x88\x3f\x2c\x73\x58\x67\x7e\x82\xab\x0f\x0a\x53\x4b\x7c\xaf\xba\x03\x7c\xaf\x8c\xa3\xfe\xd7\xb9\xd3\xdf\x92\x86\xc0\x22\xe0\x3c\xc2\x26\xd9\x51\xfe\x77\xb7\x19\x85\x8d\x8c\xb1\x47\x9e\x16\xae\xa0\x65\x23\x9b\x89\xbc\x87\xf4\xdc\x9d\xf8\xf4\x08\xf0\x33\x8c\x1b\xa5\x14\x7b\x28\xb9\xf3\x33\x63\xf7\xdd\x55\x73\x53\x2f\xae\x7b\x11\xc5\xf1\x5e\x9a\xd2\xfd\xf3\x2d\x27\xb7\x95\x3d\xa5\x9f\xbd\xb0\x0f\xd7\xd7\x42\x73\xa4\x82\x0d\x8e\x96\x74\x36\xa4\x83\x93\x3e\x17\x3d\x5b\xe0\x2d\x1a\x3c\x4c\xd3\x91\xcf\xf5\xe0\xf0\x28\xba\x05\x39\xf1\xda\xab\x4a\x09\x42\xee\xde\x59\x6a\xc8\xeb\xbe\xcc\x83\xdf\x2b\x03\x62\x81\x7d\x0b\xa1\xc1\x88\x8f\x7f\xa5\xdf\x4d\x32\x7d\x9f\x58\x0c\xe6\xf6\x0f\x5a\x8d\x04\x8c\xa7\xae\xe9\xd7\x0c\xd4\x0b\x3d\x74\xfe\xd9\x01\x33\x64\x8d\xb8\xa9\x0c\x18\x6c\x17\xad\xb2\x2f\x7f\x68\x6c\xcf\xeb\xaa\x02\x6f\x10\x6d\xae\xa5\x61\x18\xce\x93\x58\xba\x39\xc2\x3b\xab\x0a\xb4\x89\x76\x06\xfd\x4c\x04\x67\xd4\x4b\xd9\x53\x34\xd1\x5a\xf2\xab\x8c\xe4\xfd\xcd\xe4\xbd\x0d\xe5\xc3\x4d\xa5\x6b\xf8\x88\xe1\xae\xd9\xb3\x2c\x19\xf1\xe4\xac\x35\x7d\xda\xf8\x29\x68\x87\xe3\x38\x73\x56\x04\xfc\x89\xf3\x44\xc3\xf9\x09\x0c\xfe\xa7\x29\x1b\xb4\xc9\xd9\x69\xa9\x0a\xf7\xc7\xb4\xdc\x35\x8f\x3f\x3f\x40\xcd\xf9\x70\x9d\x23\x1b\xf6\xd8\xb8\xb3\x42\x5a\x26\xd1\x4a\xe4\x8f\x51\x52\x98\x65\xf3\xec\x59\xe2\x06\x65\x6b\x9a\xe9\x9f\x34\xdb\x15\x5e\xff\xf6\x44\x79\xcf\x69\x72\x37\x30\x72\x59\xa1\xd9\x60\xc2\x22\x2b\xc7\x28\xc3\xbf\x3a\x3a\xa2\xbe\xd6\x47\x46\x6a\xb2\xb9\x62\xc1\x1e\x6b\x6c\xf3\xdb\x6c\xd8\x28\x28\x3c\x36\xa9\xd9\xb7\x8e\xe3\x7c\xf3\x91\x37\x6e\x75\xe3\x91\x9b\xb7\x5a\x3b\x01\x74\x2c\xec\x84\x2e\x58\x24\x1c\x26\x4c\xe8\x08\xbe\xbc\xc4\x15\xb1\x52\xc6\x4d\x49\x54\x46\x62\xd5\xa8\x3f\xe8\x8b\x38\xdb\x23\xd7\xf3\x0c\xf1\x85\x3b\xed\x1b\x8f\xa2\x21\x1d\x6d\xeb\xeb\x54\x21\x76\xc4\x7d\x0f\x33\x55\x4e\x2b\xf2\x3c\x3b\x63\x8c\x9e\x76\xad\x3a\x42\xcf\xc2\x3a\x16\xa9\x6b\x0d\x46\x37\xde\xe0\x7a\x25\xa7\x01\xe7\xd9\x30\xe7\x12\xac\x0d\x56\x7d\x03\xd3\xc3\xcc\x24\xef\x6e\x5d\x1d\x63\x21\xd2\xae\xa3\xd7\x88\x09\x62\x86\xf5\x71\xbb\x3f\x05\x3a\x7c\xfc\x29\x78\x29\x5e\xb0\x15\x33\xef\xce\xab\x4c\xc0\xff\xc6\xb1\xbc\x88\xea\xb4\x0a\x1a\x97\x78\xe8\xa6\xe3\x2a\xbf\xbc\x4c\xe5\x4f\x81\xa8\x6e\x97\x12\xdb\x11\x1a\xf8\x9e\xc4\xe6\x5b\xc3\x34\x6a\x22\x35\x81\xcf\x3c\x0a\xa1\x29\x96\xda\x29\xc4\x1e\x95\x22\x2a\x92\x68\x0c\x2e\x21\xfe\x46\xcf\x12\x5e\xa1\x49\xff\x29\x68\xd2\x46\x50\xf2\x06\xd4\x4a\x2c\x91\x08\xd2\xee\x30\xc6\xa0\xdd\xb1\x60\xf5\xc3\xc4\x36\x2d\xb2\x8b\xb4\xa1\xd7\x00\xdb\x8b\x2d\x52\x5c\x82\x11\x68\xb6\xcd\x22\x58\x4f\xee\xdb\x2d\x66\x41\x4f\xe7\x75\xba\xbe\x6b\xe5\x16\xc0\xf0\x9b\xf3\x36\x46\x93\x0b\xcf\xd1\x02\xc3\x63\xfe\xd6\xc9\x0d\x42\x91\xca\xf8\xfc\xb6\x6f\x52\x50\x79\x93\x1c\x6c\xd5\x29\xfe\x97\x16\x4b\x27\xcd\x28\x41\x86\x68\xfb\x2b\x7f\xa8\xfc\xfb\x50\x7a\xc8\xdc\x30\x5f\x21\x1e\x7a\x1b\x95\xcd\x4c\x00\x37\x57\xca\xbe\xa3\x14\xd2\x2d\x81\x6c\xa8\x50\x5f\x33\x3d\xc6\x2f\xee\x40\x67\x4a\xbf\x6c\xfd\xdb\xfc\xf4\x8e\x5f\x08\xb8\x91\x32\xfe\x0f\x89\x3a\x7e\x1b\xed\xca\x6f\x3e\x65\x7c\x92\xd1\x87\xa3\xdf\x06\x77\xd5\x70\xfb\x82\x81\x8e\x40\xe5\x7e\x61\x4d\x6f\x7a\x82\xc7\xb6\x8f\x7b\x7d\x24\x10\xae\xcb\xbb\x51\x83\xb6\x2f\xbc\x69\xe0\xba\xe3\x39\xc3\x1d\xa7\xb1\xf0\x5f\xe9\x7a\x34\x2a\xf9\xdf\xe7\xe4\xf8\xac\x61\xae\xf8\x6c\x3a\xf1\xd0\x9d\xb6\x62\x3b\x75\x0f\x77\x66\x51\xb8\xfc\x50\x3e\xeb\xae\x7d\xab\x7c\x1c\x3b\xf6\x9e\xd3\x60\x5e\x27\x18\x03\xd1\x4f\xea\xdb\x8e\xfc\x40\x83\x7f\xc4\x4e\x77\x73\x62\xe0\x4f\xdd\x78\xc3\x3f\x93\x42\x4d\x3a\x02\x0d\x9e\x79\x03\x6b\xbc\x96\xe7\x7e\x8f\x3e\xb2\x49\x27\xa2\xde\x0b\xbd\x2d\xd0\x46\x77\x10\x74\xa8\xfd\x91\xbb\x3e\x3c\xc5\xae\x6b\xce\xa9\x00\x25\x16\xf8\x83\x57\x26\x81\x88\xf7\x7c\x24\xe5\x1c\x7f\x68\x38\x8f\x62\x2a\x13\xf7\x9d\x4c\xfc\x09\xed\x41\x43\x71\x83\x2b\xb0\xbf\xac\xe9\xef\x7b\x55\xc3\x60\x74\xbc\x7b\xbe\x09\xb7\x3f\xe8\xc7\x8d\x2f\x64\x35\x9b\xb3\x5c\xf2\x8f\x0c\xf3\x6f\x1e\xcf\xa3\x2b\x49\xbf\x75\x6c\x7f\xfd\xd1\xee\x50\xec\xdb\x5f\xa5\x78\xef\x95\x0c\xf4\x24\xfd\xfd\x03\xe9\x8d\x65\xd7\xbb\x05\xe0\x24\x0e\x75\xa2\xa2\x27\xe9\x09\x10\xea\x53\x17\x90\xaf\x55\x77\x7d\x2d\xbb\xd3\xb5\x39\xd1\xa7\x08\xfa\xc8\x68\x44\x06\x66\x61\x6c\xe0\x13\x6f\x4f\xbc\xdd\x28\x75\x28\xca\xbb\x30\x34\xaa\x78\xba\xa9\x1a\x5f\x05\x48\x42\x5e\xc9\xe2\x16\x7f\xe6\x0d\xe7\x65\xc3\x9f\xd1\x33\xe6\xb4\x75\x24\x58\xdc\xe7\x10\xb1\xdd\x6f\x2f\x9d\xfb\x56\x5a\x25\x65\x8f\x40\xd4\xbd\xc9\x32\x45\x8f\x23\x60\x0d\x9f\xe7\x7e\x62\xce\x34\xb8\x3f\x89\x38\xc2\x55\x46\xfe\x90\x93\xbc\x67\x9e\x6e\x6b\x96\x76\xfe\x50\xa2\x2d\xf0\xb4\x6f\xfb\x43\x20\x37\xbf\xdf\xc8\xe7\xf7\x73\xaf\x19\x04\xe3\x68\xcc\xe1\x74\xf6\x6f\xfe\x5f\x00\x00\x00\xff\xff\x38\xce\x15\xfe\x42\x86\x00\x00") +var _pagesAssetsJsContainersJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xeb\x72\x1b\xb9\xd1\xe8\xef\xa3\xa7\xe8\x75\x36\x3b\xe4\x27\x72\x48\x79\x2f\xa7\x96\x32\x5d\x25\xcb\xf6\x46\x5f\x7c\x2b\x49\x4e\x2a\x25\xab\x54\xd0\x0c\x48\xc2\x1e\x0e\x26\x00\x46\x14\x77\x57\xef\x7e\x0a\xb7\x01\x30\x17\x92\xd2\x6a\x37\x39\x95\xf8\x87\x45\xce\x34\x1a\x8d\x46\xa3\x6f\x68\x80\xa3\x11\x1c\xd3\x62\xcd\xc8\x7c\x21\xe0\xe9\xf8\xe0\x3b\xf8\x89\xd2\x79\x86\xe1\x24\x4f\x62\x38\xca\x32\x38\x95\xaf\x38\x9c\x62\x8e\xd9\x0d\x4e\xe3\xbd\xd1\x68\x6f\x34\x82\x37\x24\xc1\x39\xc7\x29\x94\x79\x8a\x19\x88\x05\x86\xa3\x02\x25\x0b\x6c\xdf\x0c\xe0\x6f\x98\x71\x42\x73\x78\x1a\x8f\xa1\x27\x01\x9e\x98\x57\x4f\xfa\x87\x12\xc5\x9a\x96\xb0\x44\x6b\xc8\xa9\x80\x92\x63\x10\x0b\xc2\x61\x46\x32\x0c\xf8\x36\xc1\x85\x00\x92\x43\x42\x97\x45\x46\x50\x9e\x60\x58\x11\xb1\x50\xfd\x18\x2c\x92\x12\xf8\x87\xc1\x41\xaf\x05\x22\x39\x20\x48\x68\xb1\x06\x3a\xf3\x01\x01\x09\x43\xb4\xfc\xb7\x10\xa2\x98\x8c\x46\xab\xd5\x2a\x46\x8a\xe0\x98\xb2\xf9\x28\xd3\xa0\x7c\xf4\xe6\xe4\xf8\xd5\xbb\xb3\x57\xc3\xa7\xf1\xd8\x34\xfa\x98\x67\x98\x73\x60\xf8\x9f\x25\x61\x38\x85\xeb\x35\xa0\xa2\xc8\x48\x82\xae\x33\x0c\x19\x5a\x01\x65\x80\xe6\x0c\xe3\x14\x04\x95\x44\xaf\x18\x11\x24\x9f\x0f\x80\xd3\x99\x58\x21\x86\x25\x9a\x94\x70\xc1\xc8\x75\x29\x02\x9e\x59\x12\x09\x0f\x00\x68\x0e\x28\x87\x27\x47\x67\x70\x72\xf6\x04\x5e\x1c\x9d\x9d\x9c\x0d\x24\x92\xbf\x9f\x9c\xff\xe5\xfd\xc7\x73\xf8\xfb\xd1\xe9\xe9\xd1\xbb\xf3\x93\x57\x67\xf0\xfe\x14\x8e\xdf\xbf\x7b\x79\x72\x7e\xf2\xfe\xdd\x19\xbc\x7f\x0d\x47\xef\xfe\x01\x7f\x3d\x79\xf7\x72\x00\x98\x88\x05\x66\x80\x6f\x0b\x26\x47\x40\x19\x10\xc9\x4d\x3d\x89\x70\x86\x71\x40\xc2\x8c\x6a\x92\x78\x81\x13\x32\x23\x09\x64\x28\x9f\x97\x68\x8e\x61\x4e\x6f\x30\xcb\x49\x3e\x87\x02\xb3\x25\xe1\x72\x56\x39\xa0\x3c\x95\x68\x32\xb2\x24\x02\x09\xf5\xa8\x31\xae\x78\x6f\x6f\x56\xe6\x89\x7c\x0b\x8b\x72\x89\x72\xf2\x33\xee\xe5\xe5\x72\x00\x9c\xfc\x8c\x07\x50\xe6\x44\xf0\x3e\xfc\xb2\x07\x70\x83\x98\xfa\x7a\xb8\x07\x8a\x94\x9e\xfc\x02\x53\x0d\x12\x17\xb4\xe8\xf5\x0f\xcd\x97\x0c\xe7\x73\xb1\x80\x6f\xbe\x81\xbc\x5c\xc2\xf3\xa9\x42\xa6\x5f\x86\x0d\x34\x66\x50\x60\x23\x03\xb6\x07\x70\xb7\x07\xc0\xb0\x28\x59\x0e\x17\x8a\x18\xd9\xe4\xf2\x70\xef\x6e\x4f\x0e\xe8\x35\xcd\x32\xba\x92\xa3\x95\x03\x39\x79\x75\x0c\x39\x5a\xca\xaf\x09\xcd\x6f\x70\x2e\xc7\xd2\x1c\xd4\xc9\xab\x63\x39\x2e\x37\x14\x86\x25\x2d\xe1\x98\x0f\xc6\x4f\xbf\x1b\xc0\x45\x74\x4e\x5e\x44\x03\x88\x7e\xd2\x7f\xde\xea\x3f\x7f\xd5\x7f\x5e\x44\x97\xfd\x43\x47\x1f\xc3\xe2\x62\x7c\x19\x0b\xfa\x9a\xdc\xe2\xb4\xf7\xb4\x0f\xfb\x10\x41\x04\xfb\xea\xcd\x81\x22\xba\x41\xf3\x5b\x2c\x18\x49\x5a\xc8\x6e\xd2\xad\x41\x77\x21\x7d\x3c\x56\xa4\x6b\xca\x35\xe1\x9a\x6e\x4d\xf6\x5a\x60\x7e\x7f\xd2\x25\xed\x2f\x19\x5a\x01\x02\x21\x97\x53\xec\x28\x4c\x19\x5a\x9d\xcb\x67\x3d\x35\x85\x1c\x33\x82\xf9\x39\x11\x19\xe6\x03\x10\xf2\xef\xf9\xba\x90\x9f\x53\x24\xd0\x00\x70\x86\x97\x38\x17\x27\xe9\x40\xce\xf6\x07\x34\x97\xaf\x38\x65\xe2\x24\x4f\xf1\xad\x1b\x9c\x84\x56\x68\x61\x0a\x39\x5e\xc1\x5c\xa9\xbb\xf8\x86\xf0\x12\x65\xe4\x67\x25\xc8\xf1\x4b\x0b\xd4\xeb\x57\xe2\x28\x1b\x13\x98\xc2\xf8\x10\x08\x3c\x0b\xe8\x31\x02\x79\x08\x64\x7f\xdf\x8a\x5c\xd5\x4f\x8c\xd2\xf4\x98\x66\xe5\x32\xef\x39\xaa\x2f\xc8\xe5\x20\x40\x71\x41\x34\xef\xa4\x68\x06\x4d\x4f\xe9\x8a\xf7\xe4\x13\xf5\x9a\xcc\xa0\xf7\x55\xaf\x1a\xab\x52\x36\x24\x4f\xe9\x2a\x4e\x16\x88\x09\x5e\x49\x7c\xf0\xf4\xa2\x6a\x70\x09\x53\xf5\x5a\x2d\x8a\xae\xd1\xeb\x91\xa7\x34\x29\x65\xa3\x78\x8e\xc5\x2b\xdd\xfe\xc5\xfa\x24\x75\x9d\xf7\x0d\xc1\x86\xb1\x09\xe7\xc7\x19\xe2\xfc\x1d\x5a\x62\x0e\x53\x43\x47\xb4\xc0\x28\xc5\xec\x94\xae\xa2\x09\x44\xd1\x40\x3f\x54\x73\x6d\x9e\xa9\xcf\x43\x46\x57\xf6\x25\x4d\xd3\xf3\xd6\xf7\xb2\xb7\x43\xd3\x1b\x2d\x84\xeb\x04\x65\x02\xb3\x1c\x49\x9d\x7b\x4a\x57\x67\x62\x9d\xe1\x09\x08\x56\x62\x8d\xb1\x40\x73\x3c\x81\x08\xe7\x12\x53\xe4\x9e\x9d\x91\x9f\xf1\xc4\x49\x8b\x41\x95\xd1\xd5\x5f\xc4\x32\xf3\x11\x48\x31\xd2\x53\x38\x71\x22\xe5\x5e\x1d\xf1\x04\xe7\x29\xc9\xe7\x13\x98\xa1\x8c\x9b\x46\x01\x3f\x26\xe1\x57\x3b\x92\xae\x59\x8a\xa5\xf0\xf7\x2a\x39\x18\xa8\xe1\xf6\x6b\x0b\x26\x23\x39\x06\xd5\xb4\xb6\x6a\xde\x90\x1c\x1f\xcb\xe7\xbd\x70\xd1\x34\x16\x8a\x54\x7b\x6e\x65\x2c\x49\x0e\x53\x38\xc9\x67\x24\x27\x62\x6d\x19\xbd\x44\xb7\x30\x85\xa1\xff\xb8\x6d\x39\x48\xdc\x6d\xcb\x40\xf9\x17\xf9\x0d\x66\x42\x69\xa6\x19\x61\x5c\x40\xa2\x78\x29\x8d\x25\x82\x97\x48\xe0\x58\x81\x4a\xd9\x96\x68\x2e\xc8\x25\x7c\x35\x85\xbc\xcc\x32\x8b\x45\xaf\x89\x0b\x72\x79\x31\xbe\x34\xeb\x56\xb6\xeb\xb9\xa7\x4a\x16\x8d\x34\xaa\x5e\x5f\x93\x3c\x95\x43\x1a\xc8\x11\xe8\x0e\x2a\xba\x3f\xc3\x14\x0e\x0e\xe1\xb3\xa1\xfb\x82\x5c\x56\xa4\x7f\x76\xa4\xeb\xf1\xdf\xa0\x0c\xa6\x55\xf7\x9f\x2f\x0f\xcd\x3b\x49\xad\x7c\xf7\x4c\x76\xe2\x9a\x80\x61\xe3\x0d\xca\x2c\xe4\x5d\xad\xc5\x73\x49\x51\xd0\x42\xb1\xb8\xd1\xe2\xce\xae\x2e\x69\xf7\x31\xa4\x34\x8f\x04\xac\x50\x2e\x24\xe3\xf8\x82\xae\x00\xe5\x6b\xd9\xac\xc4\x1c\x94\x8b\x22\x16\x28\x87\x31\x70\x0a\x09\x2a\x14\xbf\x25\x31\x0a\x02\x90\x9c\x00\x24\x62\x8d\xef\x48\x4f\x07\x47\x4b\x0c\x82\x2c\xf1\x40\x23\x3c\x18\xff\xd9\xfa\x4e\x73\x86\x8a\x05\x5c\xe3\x8c\xae\x6a\x98\xc8\x0c\x56\x18\x12\x94\xc7\x4e\x70\xfe\xae\x04\x19\xa6\x0a\x6c\x08\x3d\x39\xa4\xa1\xe6\xcc\x08\x0e\xc6\x56\x75\x39\xc8\x67\x30\xb6\x2c\xf0\x9b\x8f\x0f\xbd\x41\x1f\xa5\xa9\xea\x3a\xc5\x4a\xf6\xa4\x78\xd3\x19\x60\x94\x2c\xac\x04\xa1\x5c\x43\xe4\x38\xc1\x9c\x23\xb6\xd6\x72\xf8\x1b\x54\x7d\x9b\xda\x8e\x52\x24\xb0\xe4\x52\x54\xd3\xd9\x46\xec\x82\xf5\x70\xf0\x70\xf3\x10\xe5\xe5\xf2\x1a\xb3\x7a\x2f\xbb\x58\x06\xcd\xb0\x63\x86\x91\xc0\x8a\x2b\x52\x0f\x28\xd6\x84\xa3\xfd\xa3\x4c\x88\x53\x41\xf7\x31\x23\xa3\x11\x9c\xbf\x7f\xf9\xbe\x77\xb3\x44\x6c\x49\xb3\xfe\x04\xde\x50\xfa\x05\x48\x2e\xa8\x54\x74\xf9\xdc\x3a\x38\x37\x04\xaf\x0c\x7d\x72\x31\xcc\xb1\x00\x04\x7c\x49\xa9\xf4\x77\x35\x22\x94\x93\x65\x35\xe6\x86\xc5\x48\x4a\x76\xa3\x2c\xf1\x04\x22\xab\x3b\x8d\x65\x58\x60\x19\xf0\x4c\xe0\xdb\xf1\x58\x3f\xc8\xf0\x1c\xe7\xe9\x04\x7e\x29\x28\x57\x52\x38\x81\x28\xa7\x39\x8e\xee\x06\x46\xad\x24\x25\x3f\x47\x6c\x8e\xc5\x04\xa2\x04\x09\x3c\xa7\x6c\x6d\xb0\xdd\x1c\xdd\x12\x3e\xa9\x16\xbb\xf2\x00\x26\x4a\xf1\x0e\xac\x92\x21\x78\xa5\xe5\x7f\x12\x6a\x91\x89\x5b\x19\x83\x50\x31\xd4\xe8\x32\x2f\x3d\xf2\xae\xa9\x10\x74\x19\x39\x35\x72\xa8\x99\x72\xa2\xd7\xf6\x6a\x41\x33\xac\x84\xc9\x48\x1a\x2c\x10\x77\x0a\x41\x2d\xf3\x01\x08\xb6\x96\xcc\x4d\x70\x2e\x30\x03\xa2\xc2\x31\x09\x63\x4c\x4e\xb5\xa2\x61\x3a\xf5\x35\x9a\xe4\x73\xac\x86\x1d\xbb\xa1\xc5\x5a\xc7\x1d\xc4\x07\xf0\x3f\x12\xf8\x70\x13\xa8\x52\xa0\xe3\xf8\x47\x07\xaa\xa4\xe3\x61\xc6\xf2\x27\x2c\xf4\xd0\x4c\xd0\x60\xd4\x1b\x91\x83\x92\xda\x98\xe4\x90\xa3\x9c\x72\x9c\xd0\x3c\xe5\x9e\x25\x9d\x63\x71\x62\x80\x7a\x49\xc9\x18\xce\xc5\x00\x0a\x86\x6f\x08\x2d\xbd\x90\x25\x29\x99\x6f\x91\x0c\x64\xdf\x9a\x4f\xd9\xc0\x7f\x5f\x21\xb0\x6b\x76\xc9\x61\xf8\x1c\x72\x1e\x3b\xc7\x59\x22\x91\xcb\xe5\x9c\x2c\x71\xaf\x0f\x43\x85\xc4\x3d\xe8\xc3\xff\x28\x77\x7c\x3c\x1e\xdb\x41\x1e\x2f\x70\xf2\x85\xcb\x09\xf1\x02\x38\x9c\x02\x17\x48\x70\x20\x79\x92\x95\x29\xae\xbd\x63\x98\xd3\x92\x25\xbe\xcb\xbd\x40\xfc\xd4\x3c\xed\xa9\xa6\x83\x0a\x4a\x0f\xd8\x10\xa8\xde\xc5\xfa\x7f\xc3\xd6\xe7\x30\x96\xf1\x98\xf7\xe6\x62\x7c\x79\x61\x5b\x5f\x36\x09\x45\x59\x26\x23\x13\x19\xb5\x63\x26\x69\x84\x82\xd1\x1b\x92\xe2\x14\x32\xc2\xc5\x83\x88\x7e\x4d\xd9\x51\x96\xf5\x2a\xb4\x27\xf9\x8c\x36\xc6\x20\xa5\x36\x84\xb0\x63\x98\x4e\xa7\xce\x2a\x99\xa1\x2a\x87\xce\xaa\xdf\x36\xc7\xa7\x15\x55\xa0\xea\x95\xc2\xf5\x59\x1b\x36\x51\xa1\x40\x45\xa2\xf3\x0b\xea\x04\x58\x87\xa0\x7a\x23\xfd\xd3\x9a\x4b\xc8\xb1\x90\x02\x3e\x47\xe5\x1c\xf3\x58\x4a\x1c\x02\xc2\x55\x12\x85\x11\x8e\x53\xf9\x12\xe5\x80\x18\x43\x2a\x49\xa2\x3e\x70\x93\x59\x59\x51\x89\xc9\xac\x2b\x3e\x91\x5f\x10\x70\xc1\xa4\xd2\xcd\xd0\x35\xce\x94\x61\x41\xd2\x61\xc6\x32\xbc\xd4\xde\x80\xcd\x1a\xa8\x3e\x6b\x8e\xe8\x4f\x8a\x8e\x9e\xe7\x71\x6a\xca\xf4\x20\x0d\x95\x65\xce\x17\x64\x26\x7a\x17\xd1\x1b\xd9\x89\x0c\x26\xff\x26\x31\xab\x60\xb2\x61\xd7\x0a\x5a\x94\x99\xfc\xa2\x1c\x03\x39\x3e\x13\x37\x3a\x93\x0f\xd3\x76\x9b\xa4\x06\x7b\x4e\x9d\xc1\x37\xc4\xdc\xcb\x7a\x1a\x4b\xa2\xb2\x1d\xd6\x98\x58\x8b\x71\x60\x2d\x06\xc3\xe9\x6b\x46\x97\x13\xf8\xd1\x3d\x38\xa7\x1e\xc0\x1a\xcb\x30\x43\xc3\xfc\xdf\xef\xfd\x67\x12\xcc\xb6\x5a\x92\x9c\xb2\x73\x92\x7c\xe1\x13\x30\x40\x95\x55\x9b\xc0\x2f\x69\xc9\xcc\xc7\x1f\x65\x6c\x8e\x11\x57\x21\x48\x24\xe3\x02\xc4\xa2\x3b\x3f\x5c\x52\x4a\xb3\x32\xdc\x9d\x66\x5b\x4d\xd8\xae\x26\x5b\xdb\x81\x4a\xf9\x0e\x2c\x5f\x7c\xd5\xab\x5d\x47\x94\x2c\x64\xac\x42\xf2\x19\x0d\x15\xec\x5b\xfd\x46\xae\x83\x1e\xa3\x54\xbc\x24\x6c\x00\x09\xca\xb2\x6b\x94\x7c\xd1\x52\xf2\xb5\xa4\xe2\x7f\xcf\xde\xbf\xb3\x00\xb0\x0f\x11\x2a\xc8\xe8\xe6\x20\x1e\x8f\x0c\xea\x68\x00\x16\xad\xf6\x88\xe0\x97\x0a\x8d\x71\x91\xe0\x2e\xa0\xab\xe0\x2d\xe4\x7c\x60\x54\xfa\x91\x35\x72\xec\x6a\x95\x91\xdb\xee\xd4\x3d\x8d\xc7\xa3\x82\x47\xb0\x1f\x22\xe8\x9b\x29\x88\x53\x9a\xe3\xde\x0e\x44\x5b\xf8\x19\x22\x99\x83\xff\xfc\xcf\xc5\x2d\x1b\x80\xc0\xb7\xe2\x4c\x20\x51\xf2\x01\x60\xc6\x28\x0b\x70\x5c\x5c\x36\x86\xad\xec\xb7\xa5\xc7\x98\x87\x5a\xde\x0f\xa7\x0e\x22\x64\x8f\xec\x89\xef\xc8\x98\xd1\x08\x4e\xf1\x3f\x4b\xcc\x05\xfc\x30\xe6\x52\xd7\xb8\x6e\x17\x84\x0b\xca\xd6\x6a\xa5\xe5\x54\xfa\x1c\x85\xf4\x92\xab\xec\x93\x6e\x36\x05\xc9\xd7\x58\x2b\x20\x32\x5b\xf7\xaa\x80\xf2\x63\x21\x1d\x72\x58\x22\x92\x6b\x53\x63\x7a\xc2\xe9\x8b\xf5\xc7\x13\x58\x2d\x48\x86\xa1\x94\x40\x52\x75\x3d\xc9\xcb\xe5\x95\x02\x7b\x02\x0b\xcc\x4c\xb0\x19\x55\x4f\xa3\x09\xfc\x60\x16\x9c\x7e\xa8\xc9\x89\x26\x30\x96\x2b\x48\xab\x87\xaf\xe3\xd5\x02\xe7\x3d\xeb\x9e\x7d\x1d\x17\x94\x8b\x56\x89\x74\x36\xad\x31\xf7\x03\x3b\xb6\xfe\x60\x2b\xa2\x83\x11\x2f\xaf\x77\xc2\xd5\x21\x51\xae\xed\x29\xe6\xc5\x00\x02\x74\xf2\x91\x1f\x81\x56\x22\x13\x82\x5c\x8c\x2f\x5b\x1a\xba\x68\x1b\x3c\xe9\x7a\x69\x55\xa6\x0e\x1c\xa5\x50\x1d\x7f\xf8\x08\x25\x47\x0d\xb3\x70\x5c\x94\xe7\x54\xa0\xec\xa3\x7c\xe7\x5b\x87\xa5\x53\x07\x03\x2d\x9c\xce\x64\x1b\xcf\xa2\xc0\x49\xbc\x40\xfc\x2a\x29\x4a\xe9\x6f\x7c\xd5\xe2\xb2\x44\x49\x51\x46\xfd\xd0\x8e\x07\x99\x2a\xe5\x84\x4b\xf5\x7d\x11\x9d\xeb\xa8\x2e\x52\xf4\x44\x97\x87\xa1\x19\xb9\xb8\xec\x0c\xef\x1a\x1e\x50\x60\xf2\x9d\x63\xe8\x3b\x44\xc4\x24\x0f\x3c\xbf\x30\x78\x0d\x43\x38\xf0\x40\xac\x8b\xfa\x4e\x92\x5a\xf3\x46\x63\x19\x8e\x72\x81\x96\x85\xf6\x49\xdd\x77\x2d\xaf\x1a\x83\xb5\xe5\xd5\x50\xa0\x7a\x14\x17\x25\x5f\x84\x98\xfa\x6d\x10\x0a\x24\x29\xca\x58\x4f\xa4\x90\x7c\xb2\x1e\x69\xed\xb1\x0c\xf5\x1d\xcd\x06\x9b\x8a\xc7\x15\x26\x8b\xd7\x05\xb3\x41\xaa\x4a\x74\x25\xa9\xa2\x63\xca\x30\x8f\xb6\x09\x5a\x46\x51\xda\x94\xb3\x37\x14\xa5\xbb\x48\x58\x87\x58\x1c\xdd\x60\x86\xe6\xf8\x8f\x10\x8c\xc7\x9c\x34\x3b\x67\x92\x27\x57\x48\x8f\x41\xe5\x61\xc6\xe3\xc7\x9b\x96\xd3\x32\x57\x09\x55\x10\x0b\x86\x51\xba\x79\x86\x0a\xcc\x86\x09\x65\x78\x93\x4e\xf8\x80\x99\x9c\xea\x7f\x85\x56\x30\xc9\x26\xa4\x65\x40\x51\x6c\xd2\x4c\xac\x72\x2d\xeb\xe2\xd1\x14\x01\x13\x11\x78\xf4\xc6\xd2\xa0\x48\x24\x3c\x90\x02\x8d\x4a\xf3\x5f\x89\xb7\xda\x15\x21\xd5\x14\xfc\xa7\xab\xa0\x20\x51\x3b\xd6\x89\xda\x0e\xae\x06\xf9\xda\x10\x73\x65\xdd\x00\x6a\x5a\xac\xc0\x4c\x8a\xca\x95\xfa\x76\xf1\xf9\xb2\xa9\xd0\xea\x10\x7d\x18\x79\xe8\x1a\x5a\xee\xee\x8f\xd5\x75\x8a\x2a\xb8\x66\x18\x7d\x49\xe9\x2a\x6f\x2e\x25\xb5\x86\x5e\xd8\xf7\x9d\x8b\x29\x08\x44\x3b\xa2\xe3\xcd\x8b\x2b\x00\x7d\x98\xe9\xfd\xc8\x55\xca\x33\xfa\x2b\x66\x39\xbe\x8f\x0d\xae\x91\xb9\x7d\x21\xb4\x34\x68\x5b\x10\xad\x60\xff\x1e\x0b\x63\xa3\x6d\x2e\x39\x66\x4d\x49\x96\x4f\x5b\x2d\x73\xc7\x62\xa9\x21\xe5\x6b\x2e\xf0\xb2\x89\x56\x3f\xff\x83\x4c\xfe\xa9\x4e\x78\xe8\x20\xd6\x88\x90\x0a\xd3\xa5\x88\xcc\x18\x5d\x06\x49\x0d\xdf\x61\x35\x19\xa0\x92\x9b\xcc\xb1\xc4\x56\x20\xce\xb1\x6e\xfc\x5a\x6d\x42\xd9\x7c\x8a\x4a\x0b\xa6\xe4\x86\xa4\x25\xca\x34\xf2\x82\x12\xc9\xa2\x30\x0c\xf2\xf0\xab\x81\xbc\x44\x02\xf5\x5a\x7a\xd5\x3d\x74\x3b\x18\x3b\x88\xba\xdd\x6c\xae\x23\x6f\x13\x74\xdf\xaa\x34\x1a\x5c\x90\xcb\x38\x97\xf1\x67\x8b\x86\x35\x5b\x61\xad\x6d\xc2\x65\xd5\xd8\x1d\x33\x16\xa6\xb3\xa5\xb7\x61\xe6\x9b\x9c\x0d\xf0\x66\xa1\x99\x46\x2a\x6c\xcd\x31\x53\x89\x19\xe0\x05\x62\x1c\x9b\x99\xd6\x49\x2b\xbb\x40\x00\x09\x39\x79\xf8\x16\x7e\xc6\x8c\x3a\xe9\x50\x13\x08\x48\x38\x7c\x1a\x8a\xec\x1f\x0c\xe4\xdc\x5f\x63\x28\xa5\x34\x20\xae\xf7\x22\xcd\x86\x11\xa3\xab\xd8\xa3\xdb\x5f\xac\xc1\xba\xac\x46\xd7\x9c\xa1\x19\x65\xaf\x50\xb2\x70\x11\x99\x1f\x70\x85\x8b\x4f\x6d\x75\xfa\x21\x55\x08\x74\x41\xf6\x0f\x2e\xcd\x26\xe4\xeb\x5c\x2e\x50\xad\x58\x2a\xc0\x8e\x15\xd7\xc8\x18\xfa\x72\x32\x31\x7f\x07\xd5\x9a\x9d\xe8\x85\xa8\x9a\x6c\x74\xe4\xfc\xb1\x6e\x71\xe8\xfc\xb5\xd2\x70\xec\x1a\x3c\x73\x26\xe8\xab\x66\x56\xb7\x65\x81\x6d\x35\x37\x89\x5d\x9e\x5a\x4b\xef\xba\x72\x0d\x5b\x5d\x2c\x5d\x71\xdc\xb3\x29\x0f\x36\x01\x8e\xd6\xba\xb2\xdd\x3d\xba\x3a\xdc\xb3\x82\x12\xaa\xd4\x6a\xc0\xb1\x55\xae\xee\xc9\x43\xbc\x8d\xc6\x74\x2f\xf1\x92\xb2\x75\xeb\x8c\xbf\x55\xaf\x7e\xff\x49\xd7\x24\xfc\x4b\xe6\xdd\x4c\x9b\x9c\x35\x4d\x85\x9e\x21\x18\x01\xcd\xf1\x5b\x3c\x47\xd7\x6b\x81\x1f\x67\x6e\x2c\x36\x3b\x3f\xe1\x04\xa9\xcc\xb5\x9a\x21\x2a\xc3\xbb\x2c\xab\x76\x10\x5a\xa7\xe6\xbd\x06\xda\x1c\x5a\xb5\x78\x83\x9b\x7d\xa7\x6e\x07\xac\xf2\x96\x24\x02\x43\xac\xb6\x6f\x16\xa9\xf1\x51\xed\x96\xff\x76\xb7\x73\x43\x67\xcf\xa7\xf0\xd4\x5f\x99\x1b\xfc\xb8\x8d\x24\x3f\xf5\x1c\x3c\x86\x56\x96\xc0\xdd\xd7\xe8\x63\xf9\x87\x7e\xd1\x0c\x85\x25\xc9\x32\xa2\xc2\x1d\x5d\xef\x80\xbe\xe8\xdd\x8f\x02\xb3\x04\xe7\x02\xcd\xb1\xde\xd2\xae\x58\x5a\x59\x99\xb7\x48\x2c\x62\x46\xcb\x3c\xed\xf5\x7a\xd5\x88\x02\x97\x0d\x46\xed\x91\x95\xd9\x64\x34\xea\x4a\x4d\x8f\xc5\xff\x5c\xbd\xa8\x8c\x99\x37\x95\x07\xe3\xb1\x1f\x0f\x99\x0d\x1e\x65\x98\x2e\xa2\xe3\x0f\x1f\xa3\x41\x05\x7d\x19\x16\x8f\xe9\xd5\xb4\xab\x48\x68\x68\xaf\xc4\xe8\x0c\x89\x52\xf9\x08\x82\x06\x3b\x0e\x9c\xfc\x6c\xf2\xbd\xb2\x13\x55\xa9\xda\x14\x0c\x89\xd5\xac\x66\x05\xe1\x86\xac\x1b\x3c\x0f\x38\xa4\x21\xaf\x12\x54\xa0\x84\x88\xb5\xe3\x83\xc5\xbe\x01\x38\xa8\x51\x0a\x87\xec\x4f\x55\x8b\x7a\x51\xc8\xc3\x39\x09\xb9\xab\x95\x6f\x34\xf0\xd1\xd6\x78\x9c\x97\xcb\x9f\xec\x52\x34\x8d\x8d\x5f\x67\xb9\x5d\xb2\x78\x46\x32\x6c\x7d\xfb\x5f\x42\x57\xd1\xdf\xf4\x0c\x20\xdb\x9c\xd1\xc0\xb1\x0d\xc1\xab\x98\xcb\x78\xc5\x55\x2a\xd8\xb2\x61\x96\x51\xca\x7a\x6a\x0b\xc4\x30\x40\x8d\x3b\x1e\x4b\x69\x55\x4f\x2b\xee\x1f\x06\x4e\x9a\x1c\x99\xad\x12\x40\xe9\x0d\xe1\x94\xc5\x33\xae\x70\xc7\x95\x33\xa5\x10\xa4\xf8\x86\xa8\x6d\x69\xe7\x17\x9a\x5d\x05\x4f\xbd\x9a\x7a\x07\x5d\x1b\x4f\x59\x8a\x99\xf5\x09\x35\xc0\x85\xe3\xe8\xbe\xec\x3d\x56\xae\xe5\xa5\x72\xf0\x5f\x9f\xc1\x9f\x22\xd8\x87\x5e\xf5\x1c\xf6\xe1\xa0\x3f\xf0\x86\x7b\x59\x2f\x59\x7b\xa3\x24\x48\xd5\x33\xa9\x42\x20\x19\xcc\x38\xb6\x59\xaa\x52\xc2\x8b\x0c\xad\x75\xb1\xf9\xf7\xb1\x6d\x1c\xbd\x76\x90\x29\x16\x88\x64\x3c\x02\x8e\xb5\x0d\xe0\x82\x64\x99\x2a\xf1\xd2\xdb\x5e\x4c\x6f\x22\xaa\xb9\x95\xc6\xc3\xf5\xc2\xdd\x72\x59\xa2\xdb\xab\x4a\x77\xfb\x43\xfd\xde\xad\x90\x40\x8e\x74\x65\xdb\x95\xbf\xc7\xeb\x98\xe5\x84\x8e\x67\x24\xc1\xbd\xf1\xc0\x07\xf6\xdd\x55\x63\x38\x3b\x37\x8f\x95\x39\x54\xfb\xb0\xce\xe6\x2a\xe5\xf3\xf4\x3b\x25\x28\x4f\xbf\x3b\xb4\xaf\x7f\x22\xf5\xd7\x81\x9d\x6e\xf3\x5f\xee\x6d\x23\xb7\xea\xa9\xad\x49\x93\x1d\x1c\x9a\xce\x2d\x8b\x01\x44\x7f\xa1\xe2\x1e\xa1\xe4\xa3\x65\x4d\x1e\x3b\x61\xdd\xed\x50\x6d\x6b\xb2\xa2\xec\x0b\xc9\xe7\x57\x1c\x8b\xd6\x86\x9d\x09\x89\x3d\x13\x60\x9a\x6d\x6a\x3d\x5b\x4a\xd5\x0e\x80\x6f\x31\x29\xce\x6a\x5d\xed\xa8\xf9\x3b\x04\xc5\x37\x3d\xf0\xcd\x37\x7b\x36\x0d\xb3\x05\xf2\x59\xd0\x7b\x25\x3b\x35\x92\x76\x30\x75\x96\x0d\x1f\xed\x86\xa9\xf2\x2d\x18\x9d\xab\x33\x23\xd7\x88\xc5\x8f\xe5\x08\x2e\xa8\xd0\x6b\xac\xa6\xe8\x3b\xa6\xd2\x53\xfa\xc1\x50\x2d\x3a\xa5\x49\xb7\x21\x6c\xd8\x8f\x56\x54\x09\xcd\xd2\x0a\x93\x8f\x77\xe8\x88\x96\xb0\x5f\xf7\xa2\x3f\x59\xd6\x0c\x17\x54\x0c\xed\xd2\x8d\x57\x24\x15\x8b\x9e\x1b\xe1\x3e\x44\x7f\x8e\xfa\x8d\x36\xb2\xa3\x7a\x23\xaf\xf3\xb0\x95\x86\x1b\x0a\x7c\x2b\xa2\x6a\x97\x57\x7e\xf3\x53\xdb\xfe\x01\x94\xfa\xb8\xf5\x89\x8b\x91\xda\x5d\xf0\xe1\x02\x1e\xc0\xbe\x87\x2d\x82\x9e\x04\xf6\x59\x20\x69\xea\x47\xda\x35\xdd\x35\x7f\x57\x0f\x5e\xbc\x55\xa6\x6d\xa1\x5f\x85\x37\x43\xfe\xe1\x2e\x57\x85\x90\xa3\x25\x0e\x33\x6f\xef\xb0\x90\x02\x72\x62\x5b\xa9\x3a\xfc\x5e\x85\x44\xef\x8b\x57\x5f\x8d\x09\x6a\x53\x82\x0e\xa6\xab\x60\xcb\x41\xd8\xcc\x19\x4c\xa7\x10\x74\xd5\x28\xd5\x22\xad\x49\x97\xe1\xc1\x86\xf8\x3a\xd7\x23\x02\x71\x3b\x62\xb7\xa0\x58\x56\x0b\xdd\xcc\x98\xd5\xf9\x9a\x07\xee\x8a\xd9\x4e\xba\x76\xc6\xcc\xfb\x4d\xbb\x63\x72\xf6\xdc\x64\xa9\x39\xb4\x6a\x81\x04\xb3\x01\x53\x35\xe0\x80\x8e\x5a\x9d\x60\xc5\xe6\x7a\xc3\xce\x19\xae\x04\xb4\xee\xdc\x19\xca\xe3\x0a\xd5\xa0\x56\x81\xd8\x84\x70\xc9\xe8\x60\x9a\x35\x0d\x5e\x55\x7a\x42\x73\x4e\x33\x1c\x67\x74\xee\xfa\x8f\x3e\x9a\x2d\x4f\x0a\x33\x92\xa7\x6e\x08\x4f\xa2\x01\xd4\xe4\x30\x7a\x22\x1d\xc8\xa8\x2a\xf5\x08\x36\xec\x0c\x59\x41\x36\x68\xab\xc1\x37\x02\x22\x3f\x9f\xda\xcf\xff\x9e\x25\x0b\x27\xf9\x19\x4e\xee\x15\xf9\x9a\xed\x69\x5b\xd6\xfa\x98\xce\x45\xb8\xb5\xd1\x14\x88\x8b\x50\x08\x2e\x63\x71\x7b\xa5\x98\x0b\x43\xa7\x19\x15\xb9\xf7\x68\xeb\x6f\x18\x06\x5c\x79\x1c\x12\xd9\x6f\x20\x91\xed\x48\xe2\x23\xec\xe3\x28\xad\x05\x05\x66\xa0\xeb\xab\x37\xe6\x1a\xad\x9a\x52\x85\x6c\xbc\x55\x0b\xbe\x52\xaf\xfe\xab\x06\xff\xb3\xd5\xa0\x56\x80\xff\x55\x7d\xbf\x8f\xea\xd3\xcb\xef\x81\xba\x4f\x37\xfe\xfd\x95\xdf\xc3\x89\x64\xbb\x12\xf9\x08\xea\x4f\xab\xab\x56\xfd\xe7\x65\x9b\xbc\x14\x8f\x8e\x56\xf4\x91\xbe\x9a\x1f\xf8\x9a\x64\xf8\x4c\x41\xe9\x0c\xc5\xa6\x4a\xb6\xa6\x30\xb7\xa8\x20\x2b\xbe\x6a\xe7\xa5\x3d\xf5\xd7\xb2\x20\x71\x06\x53\x19\x9c\x3c\x4b\xc9\xcd\xf3\xa8\xf3\x74\xf4\xf6\x04\xe1\xf6\xf4\xe0\x23\x24\x07\x6d\x72\xcc\x70\xfb\xe5\xfb\xb7\x4e\xf6\xbc\x75\xf6\x80\xbc\xa1\x16\x63\x1e\xdb\xc8\xce\xd4\xc9\x9b\x90\xce\x23\xdb\x85\x74\xba\x81\x8c\xdf\x2c\x70\x18\xcb\xd5\x8e\xe4\xbb\x11\xb6\x85\x71\x3e\x90\xcb\x45\xbb\x50\xce\x0f\xe4\x1c\x21\xfd\xc8\xc8\xf0\x5d\x2d\xf7\x75\xb2\x44\x73\xcc\x7b\x44\xfd\x71\x16\x54\x7f\x97\x91\x4f\x5e\x66\x19\xfc\xfa\x2b\xe8\x27\xee\xc4\x4c\xfd\xc0\x8c\x5d\x22\xc1\x61\x2d\x98\xc2\x2f\xd5\x51\x04\x4f\xa5\x9f\x62\x75\x66\x4d\x27\xae\xa3\x73\x34\x57\xbe\xed\xc9\x4b\x75\x06\x84\x30\x51\xa2\x0c\xce\xc8\xcf\x4a\xed\xab\xd3\x19\x92\xdc\xb0\x74\xc2\x1d\xa9\x57\x18\x75\xb5\xb8\x84\x6f\xfb\x54\x9d\xaf\xb4\x9f\x2a\x34\xd5\xa9\x6e\xbb\xfb\xb0\x53\x2e\x2d\x60\x46\x43\xba\x5b\xf4\xb7\xa2\x18\xcd\xeb\x8f\x98\xe4\x03\x4c\x0d\x3e\x19\x70\xca\x27\x57\x12\x52\x1a\x6f\x5e\x64\x44\xf4\xa2\x49\x54\xd9\xc9\x82\x72\xf5\x34\xc1\xbd\xe1\xc1\x00\x0e\x36\xd4\xcd\xb5\xe0\xec\x2e\xe7\x50\x3d\x75\x51\xf2\xb9\x49\x89\xf1\x6f\x54\x2b\xe7\xda\x1c\xf8\x95\x0e\xaa\x43\x5d\x93\xa2\xc0\x2e\x42\x68\xa9\x85\x5c\xe9\x83\xb7\x79\x14\xda\x08\x3d\xe4\xcf\x94\xe4\xaa\xf7\x56\x3b\xa2\x7a\xd2\x20\x03\xe8\x80\x71\xe3\x22\x69\xcc\xcb\x6b\x2e\x58\x6f\x3c\x80\xa7\xdf\xb5\x83\x57\xa3\xf8\xe5\x66\xe2\xf1\xe4\x46\xcb\xe6\x95\xbe\xc3\x64\x36\x09\x92\x2b\xed\x60\x7d\x5b\xd6\xa1\x04\xcb\x3f\x11\xe8\xe0\x13\x75\x00\x29\x35\xc7\xfb\x5a\x09\x0a\xe9\x30\x0d\x14\x09\x69\x2c\xe8\x1b\x9a\xa0\x0c\x9f\x29\x79\xef\x55\x3d\x6e\x31\x64\xfa\x2c\x94\xe8\xbc\x58\x23\x4a\x69\xf2\x05\xb3\xa1\xee\x36\x1a\xc0\xb7\x63\xff\x62\x8d\xc3\x86\x2e\x31\xa7\x68\xa4\x3a\xe1\xa7\x94\x8a\x01\x54\x47\x46\x0a\x77\xc0\xc6\x29\x19\xef\x61\x9b\x5e\x31\xf9\x33\x8d\x72\x28\x68\x11\xf5\xb5\xe2\x8c\xde\x51\xa8\x5e\xc0\x8c\x96\xda\xbe\x36\x75\x51\xa8\x75\xf6\xb4\x07\x6b\xaa\x0e\x3f\x68\x6d\xf3\xc1\xfc\x3d\x13\x88\x09\xb0\xae\xe6\xf1\x87\x8f\xf0\x67\x75\xd3\xc9\xab\xb7\xfa\xc3\xe9\xd9\x99\xbd\xa6\xa2\xae\xa0\xf4\x39\x9c\xc8\x54\x46\x93\x7c\xee\xd0\xd0\xe5\x12\xe5\x69\xb4\x07\xd0\xa1\xb7\x34\xc6\x0d\x8a\x6a\xb3\x1a\xf3\x3e\x69\x4c\x6d\xad\x1a\x9f\x7c\x72\x7c\xfd\xf7\x9d\xf5\x0a\xf4\xf4\x75\x14\x2d\x9b\x8c\xaf\xe5\xb8\x1b\x8f\x81\x30\x9d\xec\x58\xd3\x6c\x14\x6a\x53\x14\x76\xd1\xaa\xe1\x12\xf1\x70\xc8\x35\xa2\xea\x1f\x77\x80\x2b\x48\xba\x13\x18\x62\x38\x17\x57\x3b\x42\x73\x29\x4e\x57\xd2\x47\x6f\x5f\xcd\x56\xf5\x4e\xa0\xde\x8d\xde\xdb\xbf\x4a\x8a\xb2\xaa\x4a\xd9\x04\xe4\xdd\xb2\xa3\x75\xe8\x03\xfb\x5b\xe2\xe5\xf6\xfe\x96\x78\xb9\x63\x7f\xcd\x8e\x18\xe7\x0d\x8d\xd9\x04\xe9\xdf\x97\xfe\x40\x23\xbb\x01\x6c\xe8\x25\x50\xce\x1b\xc6\xd0\x9c\x51\x51\xb6\x97\xd0\xd6\x87\xa1\xb5\x40\xf7\xec\xd7\xe0\x93\x65\xea\x55\x5b\x84\x6b\xcf\xb8\xf5\x73\x46\xcb\x02\xa6\xf5\xc1\xeb\xe7\x57\x05\xd2\x5b\xf9\xd6\xe7\xe5\x3a\xbc\x60\x68\x65\x5b\x66\x24\xff\x02\x88\x03\x11\x20\xc3\x24\x5e\xed\xff\xba\x03\x5e\x71\xa3\xbf\x37\xb2\xd1\x14\xa2\x67\x08\x16\x0c\xcf\xa6\x4f\xd4\x0d\x4e\xee\xc0\x9a\x6b\x3b\x52\xa7\xd4\x74\x57\xfb\x10\x3d\x79\x1e\x05\x7b\x0b\xfa\x8d\x67\x75\xbf\x1d\x6b\xcf\xf6\xd9\x08\x3d\x8f\xea\x45\x8f\x4e\x82\x74\x3b\x25\x35\x8e\xa2\xbb\xfb\x54\xde\x6f\x35\x71\xa1\x7d\x19\xc0\xd3\xef\x1b\x26\xce\xcf\x59\x35\x22\xb6\x9c\xa6\x41\xc0\xa6\xd6\x7d\x3d\x62\xdb\x21\x6b\xd5\x11\x84\x18\xff\xd9\x1c\x54\x81\x25\x2a\x80\xce\x40\xc7\x22\x6a\x9b\x04\x04\x6d\x04\x37\xdb\x02\x1a\x87\xf4\xde\x21\x63\x47\x20\xb8\x63\x24\xf9\xfb\x45\x8c\x38\x8b\x51\x51\xe0\x3c\x75\x8e\x9b\xa3\xd0\x93\x44\x00\x75\xeb\x4a\x86\x38\xef\x45\x8c\xae\x20\xa1\xd9\x90\x2f\x87\x07\x4f\x1b\x60\x1a\x9d\xc4\xb2\xf8\xee\x79\xe5\x79\x54\xd5\x1d\x44\x55\x75\x48\x29\x9e\xa8\xf0\xcc\x0b\x12\xfb\x7d\xbf\xdc\xbf\x16\x27\x7a\x45\x5a\x8e\x42\x8f\xa8\x6a\xc3\xf0\xda\x6b\x2b\xbf\x0c\x53\x94\xcf\x9d\xd9\x7d\xd0\x88\xcd\x68\x7f\xdc\x30\xd8\x4e\x82\xe4\x43\x0d\x56\x1b\x51\x38\x5c\x2f\xca\x0d\xc4\xa4\x49\xc5\xb7\xcd\xa1\x78\x8d\x2d\xce\x7b\x45\xe7\xd5\xc1\x7c\x80\xa8\x46\x65\x34\xa9\xcf\x84\xb5\x16\x91\xd7\x6b\x34\xf1\x07\x50\x41\xa8\x7c\x6f\x34\x01\xa2\x9f\xdc\x59\x71\x96\x1e\x6a\xa4\x4a\x80\xec\xf9\xf8\x18\x2f\x0b\xb1\xee\x55\xbc\xc2\x99\xdb\x3f\xdd\x21\x91\x63\x15\xce\xab\xdb\x02\x27\x82\x07\xa7\x1b\x92\x8c\xf2\x92\x61\xae\xae\x66\x41\x59\x16\xc3\xd1\x4c\x60\x73\x5e\x0d\xdf\xe2\xa4\x54\x1a\x48\xaa\xa9\xff\x3d\x03\x56\xe6\xd2\xfe\x00\xe1\x12\xdf\x9c\xdc\xe0\x5c\x29\x7b\x46\x33\xb8\x46\xc9\x17\xb8\xc6\x33\xca\xf4\x99\x70\x92\x97\x24\x9f\xab\xab\x21\xcf\xd5\x4d\x9c\x56\x9b\xe9\xc5\xcb\x01\xf1\x75\x9e\x2c\x18\xcd\x69\xc9\xb3\xb5\xaf\xed\x70\xf1\x4a\xf5\x8c\x7b\xf2\x33\xaf\x8e\x80\xbf\xa3\xea\x25\x97\x03\xa3\x45\x5c\xe5\xc3\x71\xb1\x35\x85\xe0\x12\xee\x48\xe1\x50\xb5\x8f\x7a\x7c\x18\x88\xb0\x69\x77\xf5\x6a\xaa\x7b\x89\xf5\x45\x12\x4a\x9e\xe4\x83\x5e\x75\xb5\xc3\x59\xb2\xc0\x69\x99\x61\x73\x59\xd4\xad\x50\xef\x25\x0e\xae\x6f\x55\xa1\xa5\x08\x0a\xf5\x5b\xc6\x74\x08\x77\x03\x18\xd7\x2e\x61\xcb\x32\x77\x25\x0e\x07\xc3\xf7\xa2\xa5\x1a\x5e\x01\xf4\xba\x6b\x89\x6a\xe7\xac\x5d\x2e\x4f\x75\xee\x8a\x67\xb7\x14\xca\xfe\xfa\x6b\x5b\xc9\x47\xb3\x66\x52\xf3\x4b\x59\xcc\x96\xf3\x09\x8d\x92\xe1\x48\x99\xb9\xa1\x2a\xc0\x8a\x36\x96\x44\x1d\x7a\xae\x94\x9d\xc4\xe3\x0f\x1f\xe3\xad\xa4\xef\x4e\x59\x78\x7c\x3c\x4a\x8a\x72\xa8\xd2\x5c\x43\x4d\xa4\x9a\x8b\xdd\x89\x74\xb7\x4e\xb1\xcf\x39\x9a\xa3\xac\x3f\x81\x53\x3c\xd4\x97\x05\xaa\xd3\x0d\x6f\x28\x4a\x01\xa9\x45\xa6\xee\x37\xe5\x02\xa9\xdb\xfe\x1a\x25\xd7\x06\xd9\xa6\x11\x8c\x46\xf0\x7f\xfc\xa3\xc9\x4f\x24\xf5\x19\x45\xa9\x26\xfb\xc9\x0e\x64\x8f\x46\x15\xe5\x3b\xf1\x2a\x38\x56\xeb\x29\x7c\xc5\x38\x7b\x2e\xf7\xa1\xbc\xdb\x89\x82\xda\x69\xc4\x3a\x0d\xba\xeb\xea\x34\xe3\x7d\x89\xb0\x52\xa6\xcb\x55\xb6\x08\xda\x7d\x57\x81\x5f\x13\x68\xea\xf4\x1e\xc6\x2a\x4b\xa5\xd9\xd9\xdb\x42\xa6\xdd\x17\xdb\x99\xce\xa0\x4a\xc4\xee\x64\x0e\xd5\x36\xef\xef\x31\xa9\xe1\x76\x6c\xd5\x9f\xde\x58\x79\x28\x6b\x5c\x01\xeb\x16\xee\x34\xdd\xcb\x0e\x8a\xb7\xdb\xdb\x1a\x55\x75\xc5\x55\x72\x41\x97\xe6\x3a\x5d\xbe\x45\x85\x29\xd8\xab\xa5\x86\xdd\x6d\xe6\xe6\x58\xe8\x2e\x4c\x0f\xfe\xd2\xa8\x7b\x3c\x55\x0e\xad\xfe\x22\xbc\x16\xc4\xc3\x50\x75\x68\x68\x72\x59\x37\xf7\x4f\xad\xd0\x2e\x12\xf4\x0a\x55\x6f\x87\x06\x47\x35\xb7\x35\xe3\xe5\x77\x71\xe8\xa1\xb8\x6b\x9d\x69\xff\x3c\x4e\x75\xef\x4b\xe3\x38\x0e\x4c\x65\xa0\x25\xc2\xf3\x44\xbc\x5e\x3d\x1b\x9a\xcd\x6a\xcb\xbd\xe3\xc0\x64\xb0\xf1\x3e\x83\xde\x03\x8e\x99\x6d\x9b\x54\x13\xa8\xe8\x2a\xed\x63\x5a\x5a\x0f\xf8\x4f\x56\xdf\xfa\x3d\x0c\x0d\xdc\x30\x91\x80\x51\x3f\xbe\x41\x59\xcf\xe3\xe0\xa6\x93\x74\x7b\xe1\x3c\xb5\x61\x0f\x54\x55\x00\xaf\x8a\xb0\x5f\xac\x8f\x8b\xb2\xf5\xe4\xaa\x47\x7d\xbf\x71\x32\xd1\x54\xac\xef\xce\xbf\x7a\x81\xf3\x83\x59\x68\x34\xf0\x43\xb8\xb8\xe1\x74\x5a\xc8\xc8\xae\x3e\xb6\xf2\x52\xf7\xf0\x10\x76\x1a\x96\xb6\xf8\x9c\xe1\x01\x68\x94\xeb\xbe\xea\xa7\x9c\xb9\x4a\x56\xe8\xab\xe9\x8f\x3f\x7c\x1c\xe8\x6a\x4a\x24\x60\x49\xb9\x80\x48\x73\x05\x70\x2e\x18\x09\xd3\x14\x1b\x85\x40\x35\xd3\x93\xd2\x5c\x4e\xb2\x43\x37\x75\x68\x00\xd7\xfe\xb2\x42\xb1\xb9\x75\x84\xc7\xd2\x2b\x7d\x0e\xd7\xc1\x83\x46\xe5\xa4\xae\x95\x01\xb8\x03\x9c\x71\xdc\x86\xe2\xd9\x36\x14\x21\x86\xda\xcb\x84\x2e\x0b\xc4\xf0\x8b\xb5\xd4\x91\x9a\x5a\x8f\xf7\xfe\xa5\xe5\x2d\x23\xb5\xc7\x15\xd4\xf6\xf3\x92\xe4\x9d\xca\xc5\xb2\xac\xaa\xd5\x55\x4c\x0a\xfa\x7e\xc8\x8c\x6a\x81\x6c\x9f\x54\x75\x63\x5f\xd7\xbc\x76\x0b\xe4\xe3\x4c\xad\x29\x98\x0f\x66\x37\x74\xb0\x76\x9c\x60\x83\xe8\xd9\x0e\x88\xfe\xff\x9c\x66\x09\x61\xa8\x23\x82\x32\xb8\x46\x5c\xff\xc8\x83\xe9\x83\xd1\x2c\xc3\xac\x5e\xf1\x1c\x0e\x87\x97\xd7\x47\xca\xdc\xbd\xf0\x2a\xdc\xca\xeb\x23\x5d\x9c\xfc\x5c\xbd\xd1\x47\xfc\xc3\xc3\xaa\x8a\x63\x1e\xdf\x5d\x9b\x67\x9d\x6d\x86\x7e\xa3\xe0\xcd\xf8\xd0\x3b\x1f\x6e\x85\xd8\x66\x24\x65\xf0\x6b\x27\xd0\x7e\x0f\x4e\x0f\xeb\x6c\x62\xe7\x6d\x0a\xe6\xba\x25\x1e\xb0\xde\x2b\x6b\x29\xca\xb3\x72\xe9\xef\xd0\x6b\x21\xf1\x1e\xfa\x0d\x4d\xee\xb2\x71\x0e\x5f\x3e\xae\xca\xdb\x34\xca\x7d\x9d\xfa\x6c\x3f\xcf\xe9\x3a\xb1\x60\xbb\x9c\xfd\x0d\x8e\xdc\x27\x45\x39\xb1\x7d\x8d\xda\x88\x34\x92\xe5\xf5\x37\xf1\xfa\xdd\xd2\xa4\x31\x1d\xea\x02\x55\x3a\x03\xb2\x5c\xe2\x94\x20\x11\xce\x02\x1f\x98\xcb\x55\x65\x0c\xab\x1d\xb7\x6a\xd6\xbc\xb9\xb9\xb7\xef\xe5\xce\x71\xd7\x5c\xe4\x40\xaf\xfd\xfa\xab\x59\x36\x1b\x80\x82\x0b\x59\x5d\x8b\xaf\x5a\xfa\x73\x3f\xe4\x71\x19\xd4\x29\xf9\xa0\xd5\x2f\x12\xa8\x8c\xdd\xa6\x7e\x9b\xb2\xd2\x10\x44\x68\xa2\xbe\x08\x66\x47\x2e\xa7\xcb\xda\x25\x17\xea\xe1\xa1\xbb\x4e\xb0\xcb\xdf\xd5\x83\x78\x00\x4d\x75\x9f\xb7\x93\xae\xaf\xa6\x53\x95\xc5\x98\x91\x1c\xa7\x9e\x3f\xe6\x43\x56\x4b\xb8\x71\x78\xbe\x7d\x81\x1e\xb6\x20\xd1\x0a\xb3\x71\x17\x49\x4d\x1f\x6f\x50\xc8\x61\x5d\x01\xaf\x6a\x62\x7b\x2d\x67\x30\xa4\x6b\x68\x63\x50\x8e\x33\x7d\xe8\xb1\x76\x6e\xc6\x64\x64\xed\x57\x2f\xd7\xcd\x0b\x94\xbb\xd4\x7e\x55\x73\x3b\x81\xa8\xdf\x06\x7e\x5d\xc1\x86\x94\xa8\xa1\x6d\xad\xcc\x85\xda\x21\x12\x9b\xa1\xac\xf6\x96\x72\xbc\xb2\x6a\x52\x32\x67\xc6\x30\x5f\xe8\x8b\x37\x2b\xa3\xa2\x2f\xaa\xe5\x06\x5c\x17\x35\x57\xc3\x86\x94\xd1\xa2\x76\x2b\x94\xda\x8e\xb2\xfc\xab\x20\x6d\x7a\xbb\xeb\x50\xe3\xc6\x33\x8b\x55\xb1\x74\xe7\x82\xf6\x37\x8e\x6a\xeb\xb8\xed\x0c\x59\x6b\x91\xf2\x46\xe4\xed\x4d\x76\xc8\x2b\x77\x4c\x52\xa5\x21\x76\x99\xc4\x28\x3a\xf4\x2f\x8e\xcb\x32\xef\x4c\x91\x3d\x32\xe8\x66\x22\xdc\x32\x53\x9b\x05\xf5\x69\xe8\x2e\xa5\xbc\xe7\xc8\x1b\x7b\x66\x81\xbc\x75\x9c\xe0\x6b\x45\x68\x4f\x3e\xd5\xf7\x67\xe4\x2a\xc8\x48\x7d\x83\xc9\xae\x14\x21\x58\x2f\x62\x34\x53\xa5\x2f\x05\xc3\x1c\xe7\xfa\xe7\xa1\x3a\xe0\x1d\x4e\xd4\x8e\x72\x03\xfa\x25\xce\x4b\x22\xf0\x72\xd7\x76\x02\x5d\xeb\x4d\x9c\x01\x0c\x0f\xb6\xb6\x49\x32\x92\xc8\xf5\x62\x97\x4e\x2c\x1b\xab\xcb\x7a\x6a\x55\xee\xfd\xad\xa8\xda\xf4\x45\xb5\x45\xed\x29\xb7\xdd\xe7\x66\x5c\xdd\xe7\x64\x8d\xbf\x52\x15\xda\xe7\x52\xf7\xfa\xb6\xef\x46\x84\x2a\xa5\xf2\xad\xbc\xac\x58\x4b\x31\xac\xf7\x56\x12\x5d\xdd\x05\x6c\x86\xfd\xdb\x72\x55\xcd\x2b\x6b\x3b\xbd\x0b\xfd\x4f\x2a\xa7\xc6\x86\x20\x61\x5c\x9c\x96\x79\x98\xe0\xea\x82\x82\xa9\xbd\x57\xdd\x03\xbe\x57\xc6\xd1\xfe\x6b\xdd\xe9\x6f\x48\x43\xe4\x10\xe8\x3c\xc2\x2e\xd9\x51\xfd\xef\x6e\x37\x0a\x6b\x19\xe3\x80\x3c\x2b\x5c\x51\xc3\x46\xd6\x13\x79\x0f\xe9\xb9\x3d\xf1\x19\x10\x10\x66\x18\x77\x4a\x29\x76\x50\x72\x17\x66\xc6\xee\xbb\xab\xe6\xa7\x5e\x7c\xf7\x02\xa5\xe9\x51\x96\xa9\xfb\xe7\x1b\x4e\x6e\x23\x7b\xaa\x7e\xf6\xc2\x3d\xdc\x5e\x0b\xad\x23\x15\xd9\xe0\xac\x50\x67\x43\x5a\x38\x19\x72\x31\xb0\x05\xc1\xa2\x01\x92\x37\x29\xb2\x87\x98\x6d\x98\x35\xf5\x41\x2e\x82\xf6\x97\x5e\xa5\xb0\x7f\x67\x69\x45\x5e\xfb\x65\x1e\xfa\xbd\x31\x20\x0e\x38\xb4\x10\x16\x4c\xf1\xf1\x6f\xea\x77\x93\xaa\xbe\x2f\x1c\x86\xea\xf6\x0f\xb5\x1a\x15\x30\x4c\xcd\xaf\x19\x98\x17\x76\xe8\xfa\x67\x07\xaa\x21\x5b\xc4\x75\x65\xa0\xc1\xa6\xd2\x2a\x87\xf2\x27\x8d\xed\x75\x29\x04\xcd\x87\xd2\xe6\x3a\x1a\xfa\xf1\x82\xa4\xd8\xcf\x11\xde\x39\x55\x60\x4d\xb4\x37\xe8\x7d\x88\xae\x54\x2f\xbc\xa3\x68\xa2\xb1\xe4\x37\x19\xc9\xfb\x9b\xc9\x7b\x1b\xca\x87\x9b\x4a\xdf\xf0\x29\x86\xfb\x66\xcf\xb1\x64\xa0\x27\x67\xab\xe9\xb3\xc6\xcf\x40\x7b\x1c\x97\x33\xe7\x44\x20\x9c\xb8\x40\x34\xbc\x9f\xc0\xd0\xff\x2c\x65\xbd\x26\x39\x87\x0d\x55\xe1\xff\x98\x96\xbf\xe6\xe7\x58\x68\x8d\xa4\x0f\xd7\x79\xb2\xe1\x8e\x8d\x7b\x2b\xa4\x61\x12\x9d\x44\x7e\x40\x84\x55\xcb\x66\x7f\x9f\xf8\x41\xd9\x96\x66\xf6\x27\xcd\xa6\x10\xf4\xef\x4e\x94\x77\x9c\x26\xf7\x03\x23\x9f\x15\x96\x0d\x55\x58\xe4\xe4\x58\xca\xf0\x6f\x8e\x8e\x54\x5f\xdb\x23\x23\x33\xd9\xba\x62\xc1\x1d\x6b\x6c\xf2\xbb\xda\xb0\x31\x50\x53\xe9\x97\x19\xf6\x6d\xe3\xb8\xbe\xf9\x28\x18\xb7\xb9\xf1\xc8\xcf\x5b\x6d\x9d\x00\x75\x2c\xec\x42\x5d\xb0\xa8\x70\x54\x61\x42\x4b\xf0\x15\x24\xae\x14\x2b\x71\x5a\x97\x44\x63\x24\x36\x8d\xfa\x9d\xbd\x88\xb3\x39\x72\x3b\xcf\x51\x74\xe8\x4f\xfb\xce\xa3\xa8\x49\x47\xd3\xfa\x7a\x55\x88\x1d\x17\xbe\xdd\xdf\x54\x79\xad\x94\xe7\xd9\x1a\x63\x74\xb4\x6b\xd4\x11\x06\x16\xd6\xb3\x48\x6d\x6b\x10\xdd\x06\x83\xeb\x94\x9c\x1a\x5c\x60\xc3\xbc\x4b\xb0\x76\x58\xf5\x35\x4c\x0f\x33\x93\x7a\x77\xeb\xe6\x1c\xdf\xfa\x85\x80\x00\x8a\x09\x90\x64\x88\xf3\xe9\xa7\xc8\x86\x8f\x9f\xa2\xe7\xf0\x4c\x5b\xb1\xea\xdd\xb5\xc8\xe1\x5a\xe4\xc3\x14\xcf\x50\x99\x89\xa8\x76\x89\x87\x6d\x3a\x14\x74\x3e\xcf\xf0\xa7\x08\xc4\xba\xc0\xb2\x9d\x42\xf3\x29\x02\x92\x56\xdf\x6a\xa6\xd1\x12\x69\x09\xdc\x0f\x28\xfc\x14\xa9\x1a\x47\x83\x38\xa0\x12\x10\x23\x68\xb8\x40\xbc\xa0\x45\x59\x4c\x3f\x45\xd2\xa4\x7f\x8a\xea\xb4\x29\x28\x7c\x5b\xa0\x3c\xc5\x92\x08\xa5\xdd\x3f\x45\xae\x02\xd8\x75\x0c\x5a\xfd\x68\x62\xeb\x16\xd9\x47\x5a\xd3\x6b\x9f\xa2\xe7\xcf\x46\x4a\x71\x81\x46\x60\xd9\x96\x20\x86\x83\xb7\x23\xcd\x82\x8e\xce\xcb\x6c\x7b\xd7\xc6\x2d\xf8\x14\x35\xe6\x6d\x28\x4d\xee\xa7\x08\xa4\x05\x9e\x7e\x8a\xf4\xb7\x56\x6e\x28\x14\x19\x4e\xaf\xd7\x5d\x93\x22\x95\xb7\x92\x83\x51\x99\xc9\xff\xd5\x62\x69\xa5\x59\x4a\x50\x45\xb4\xfb\x95\x3f\xa9\xfc\xbb\x50\x06\xc8\xfc\x30\xdf\x20\xee\xd7\x6e\x93\x0d\x33\x01\xba\xb9\x51\xf6\x2d\xa5\x90\x7e\x09\x64\x4d\x85\x86\x9a\xe9\x31\x7e\x71\x07\x15\x85\xd1\x2f\xa3\x7f\x9b\x9f\xde\x09\x0b\x01\x77\x52\xc6\xff\x21\x51\xc7\xef\xa3\x5d\xf5\x9b\x8f\xb9\x3e\xc9\x18\xc2\xa9\xdf\x06\xf7\xd5\x70\xf3\x82\x81\x96\x40\xe5\x7e\x61\x4d\x67\x7a\x42\x8f\xed\x98\x66\x46\x57\xf9\x2e\xef\x4e\x0d\x9a\xbe\xf0\xae\x81\xeb\xe1\x5e\xe8\x14\x37\x4e\x63\x81\x72\xab\x3d\x8f\xc6\x24\xff\xbb\x9c\x9c\x90\x35\x9a\x2b\x21\x9b\x2e\x02\x74\x97\x8d\xd8\xce\xdc\xc3\x9d\x3b\x14\x3e\x3f\x8c\xcf\x3a\x75\x6f\x8d\x8f\xe3\xc6\xde\x71\x1a\x2c\xe8\x44\xc6\x40\xea\x27\xf5\x5d\x47\x61\xa0\xa1\x7f\xc4\xce\x76\x73\x51\xc1\x5f\xfa\xf1\x46\x78\x26\x45\x35\x69\x09\x34\xf4\xcc\x57\xb0\x95\xd7\xf2\x34\xec\x31\x44\x36\x6e\x45\xd4\x79\xa1\xb7\x03\xda\xe9\x0e\x82\x16\xb5\x3f\xf0\xd7\x47\xa0\xd8\x6d\xcd\xb9\x2a\x40\x49\x61\xb5\xc0\x2e\x81\x08\x33\x92\x13\xbe\xc0\x5c\xfd\xce\x8e\x2a\x13\x0f\x9d\xcc\x0f\x68\xee\x6d\x12\xe8\x8e\x16\x88\x1f\x17\xa5\xfa\xfb\xd6\xd4\x30\x54\x3a\xde\x3f\xdf\x34\x1a\xc1\x4b\xf5\xe3\xc6\x33\x2c\x92\x85\x96\x4b\xfd\x23\xc3\xfa\x37\x8f\x17\xe8\x06\xab\xdf\x3a\x76\xbf\xfe\xe8\x76\x28\x8e\xdd\xaf\x52\xbc\x0d\x4a\x06\x3a\x92\xfe\xe1\x81\xf4\xda\xb2\xeb\xdc\x02\xf0\x12\x87\x36\x51\xd1\x91\xf4\x84\xa9\x1d\x64\x1b\x50\xa8\x55\xa7\xa1\x96\x3d\x6c\xdb\x9c\xe8\x52\x04\x5d\x64\xd4\x22\x83\x6a\x61\xec\xe0\x13\x1f\x8c\x83\xdd\x28\x73\x28\x2a\xb8\x30\x14\x09\x3d\xdd\xaa\x1a\xdf\x04\x48\x80\x6f\x30\x5b\xc3\x0f\x63\xb5\x65\xb5\xe3\xcf\xe8\x55\xe6\xb4\x71\x24\x18\xee\x73\x88\xd8\xed\xb7\x73\xef\xbe\x95\x46\x49\xd9\x23\x10\x75\x6f\xb2\xaa\xa2\xc7\x01\xfc\x30\xd6\xe7\xb9\xdd\x99\x06\xff\x27\x11\x07\x72\x95\x29\x7f\xc8\x4b\xde\x6b\x9e\x1e\x58\x96\xb6\xfe\x50\xa2\x2b\xf0\x74\x6f\xbb\x43\x20\x3f\xbf\x5f\xcb\xe7\x77\x73\xaf\x1e\x04\xcb\xd1\x54\x87\xd3\xb5\x7f\xf3\xff\x02\x00\x00\xff\xff\x38\xce\x15\xfe\x42\x86\x00\x00") func pagesAssetsJsContainersJsBytes() ([]byte, error) { return bindataRead( @@ -130,7 +130,7 @@ func pagesAssetsJsContainersJs() (*asset, error) { return a, nil } -var _pagesAssetsJsGchartsJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\xbd\xe9\x7e\xdb\x38\xd2\x2f\xfc\x3d\x57\x21\xbb\x33\x6e\x31\xa2\x65\xc9\x59\xda\x91\xc2\xe8\x78\x91\x63\x27\xf1\x6e\xc7\x49\x14\xcd\xfc\x40\x12\x94\x68\xad\xd6\xe2\x25\xb1\xdf\x6b\x7f\xeb\x5f\x00\x48\x50\x92\xd3\x3d\xcf\x79\x4e\x67\xc6\x02\x81\x02\x50\x28\x14\x0a\x85\x42\x01\xc8\x47\xd3\x7e\x30\x89\x07\xfd\xbc\x93\xfb\xf5\xec\x46\x8c\x72\x42\x78\xb2\x1f\x0c\x42\x79\x71\xba\xbf\x3d\xe8\x0d\x07\x7d\xd9\x9f\xb8\xbe\xf0\x6e\xe3\x7e\x38\xb8\x75\x03\xe1\x1d\xf9\x57\x32\x98\xb8\xa1\xf0\xf6\xfb\x51\xdc\x8f\x27\xf7\xae\x14\x5e\x38\x08\xa6\x3d\xc0\x46\xc2\x8b\xc7\x87\xe2\xd0\x6d\x7b\x07\x62\xd2\x76\x5b\xc2\xdb\x1c\x8d\xc4\xbd\xdb\x16\xde\xe1\xb4\xe7\xcb\x91\x1b\x53\x88\x00\x7a\x5e\x7d\x34\x1a\x8c\xdc\x2b\xe1\x6d\x0d\x06\x5d\x29\xfa\x6e\x47\x78\x43\x31\x1a\xcb\x7d\x2a\xa8\xab\xc3\xbb\xdd\x81\x98\xb8\x7d\x14\xbb\x8b\xea\xa4\x3b\xa0\xea\xe4\x2c\x92\x55\xd3\x96\xdc\x50\xe4\x85\xeb\x3b\xbf\x46\x72\x32\x1d\xf5\x73\xa2\x78\x1b\x87\x93\xb6\xe7\x3f\x26\x10\xd7\xb3\x10\xa1\x98\x08\x1b\x60\x34\x0b\x10\xc8\xb8\x6b\x03\x8c\x67\x01\xa2\xee\x60\x30\xb2\x21\x26\x73\x10\x83\x51\x4f\x4c\x6c\x90\xe9\x2c\xc8\x48\xf6\x06\x37\xd2\x06\xb9\x99\x43\x84\xe8\x94\xa9\xe7\x76\x16\xa2\x25\x27\xdb\x83\xee\xb4\xd7\xdf\xef\x87\xf2\x8e\x40\x9f\x25\xb0\x77\xb3\xb0\xe3\xc9\x68\xd0\xc9\x54\x78\xbf\xa0\xb8\xf3\xb8\x97\x81\xf9\x39\xd7\xb4\xb8\x9b\xa1\xce\xe6\x2c\xc0\x64\x70\x36\x19\xc5\xfd\x96\x0d\xb4\x35\x0b\x34\x1c\x8c\x63\xa4\xd8\x40\xdb\xf3\x25\x7d\x3c\x3b\x3a\xb4\x41\x76\x66\x41\xfa\xf2\x2e\x43\xe6\xfa\x1c\x0d\x07\x7d\x6a\xf8\x34\x98\x64\x7b\x6c\x77\xbe\xc7\xfa\x93\xb3\xf8\x67\xa6\xed\x1f\x66\x81\x7a\x72\x3c\x16\xad\x0c\xcc\xfe\x7c\xa7\x11\x8b\xda\x10\x9f\xe6\x3b\x42\x8c\x32\x48\x7f\x9e\x85\x00\xeb\xdb\x00\x07\xb3\x00\xfe\x60\x32\x19\xf4\x32\xfd\x7d\x38\x57\x4d\x20\xba\x19\x44\x8e\xe6\x58\x70\x70\x3b\xb6\x01\x8e\x17\x10\x6f\x22\xe2\x7e\x06\xe8\x64\x16\xa8\x2b\x7c\x99\xe1\x88\xd3\xb9\x11\x17\x8f\x87\x5d\x71\x6f\xc3\x9c\xcd\xc2\xb4\x65\xdc\x6a\x67\x1a\x7d\x3e\x87\xee\x2c\xc4\xc5\x1c\xdd\xc6\xf5\xde\x70\x92\xa9\xe8\x72\xbe\xd1\xd3\x7e\x68\x43\x7c\x9d\xa7\x7e\x5f\x8e\xf6\xce\x0f\x3e\xdb\x50\xdf\xe6\x69\xd3\xcd\xb2\xd4\xf7\x39\xc2\xc8\x28\x83\xee\xf3\x59\x00\x79\x3d\x15\xdd\x0c\x71\x85\x3f\x5b\xcb\x78\x7c\xae\x58\x3c\xed\x69\x7f\x16\x88\x86\xed\xde\x1c\xf9\x82\x59\xa8\xc9\xfd\x30\xc3\x0e\xe1\x1c\x80\xf0\x8d\x18\x49\x80\xe4\x1c\xd0\x48\xf4\xc7\x5d\x31\xc9\x14\x15\xcd\x42\xf5\x45\x56\x8a\xb4\x16\xa0\xfc\x45\x74\xa7\x19\xa0\xf6\x2c\x10\x4f\x09\x36\x44\x3c\x0b\x71\x13\x8f\x63\x3f\xee\xc6\xd9\x3e\xbf\x9a\x05\xf3\x07\xdd\x4c\x97\x77\x66\x01\xba\xb2\xdf\xca\x4e\x1b\xdd\x39\x64\x46\x83\xc9\x60\x96\x86\xbd\xb9\xfe\xea\x8a\x31\xcd\x88\xd9\xd6\xf7\x67\xa1\x06\x43\x11\x28\x9c\xd3\x5e\x1d\xcc\x02\x8d\x07\x2c\x25\x78\xaa\xbe\xf6\x96\xc5\x70\x28\xfb\xe1\x76\x3b\xee\x86\xcb\xee\xd0\xf7\x96\x49\x10\x4f\xe4\x68\xd9\xbd\xa6\xb0\xa0\x32\x6e\x64\xbd\x2b\x31\x2d\x2f\xbb\x23\x8a\x22\x0a\x6f\x81\xd5\x49\x12\x6f\x77\x63\x8a\x3e\xa5\x99\x7c\xd9\x1d\x53\xd2\xb8\x1d\x47\x14\x9c\x50\x50\xde\xc9\x80\xe0\xbd\x65\x9e\x37\x97\xdd\x29\xc5\x11\x67\x77\xc5\x70\x2c\x97\xdd\x1b\xfa\x1a\x8a\x09\x55\xd3\x5f\x76\x6f\xe9\x63\x24\x69\x20\x07\x94\x72\x47\x1f\x93\xc1\x6e\x7c\x27\x09\x9b\x7b\x64\xa2\x49\x93\x8a\x24\xb4\x30\x39\x2e\xbb\x3f\xb9\xa0\xfe\x84\xf1\xd9\xa4\x8f\x41\x14\x8d\xe5\xe4\x52\x55\xb3\xa5\x52\x03\x41\x89\xdb\x08\xb7\xc5\x68\x93\xc2\x3b\x08\x8f\x24\xb1\x17\xb8\xfe\x90\xa6\xfd\x65\xb7\xae\x1a\xb3\x43\x91\xcb\xee\x2e\x7d\x90\x40\x92\xa3\xc9\x96\xa4\x49\x96\x62\x3e\x70\x0c\xa1\x78\x23\x08\x81\x3d\xe0\x25\x46\x98\xc8\x06\xd3\xa0\x2d\xc7\xcb\xee\x3e\x5a\x4c\x85\xca\xfe\xd7\x65\xf7\x53\xf2\xf1\x6d\xd9\xfd\x4c\x1f\x34\x4d\x07\x84\xd0\x81\xaa\xe4\xe2\x7c\x7b\x77\xda\xed\x7e\xa3\x79\x77\xd9\x3d\x04\x91\x79\x22\x5f\x76\x8f\x0c\x45\xef\x94\x4a\xb4\x8b\x36\x1e\x2b\x62\x51\x1d\x27\x4c\x1b\x4c\xe8\xcb\xee\x29\x85\xaf\xa7\x72\x74\x7f\x26\xbb\x12\xf3\xce\xb2\x7b\x96\x34\x2b\xe9\xa2\x73\x85\x08\x91\x5a\x0d\xdd\x65\xf7\x82\xfb\x74\x34\x9e\xe8\x3e\x7e\xf6\x45\xd5\x5f\x17\x40\xf0\x12\x45\x70\x3f\x7e\x96\xe8\xbc\x5b\xca\x2e\x27\x9b\x13\x9a\x6a\xfd\x29\x28\xf3\x35\x01\x38\x1f\x0c\x97\xdd\x6f\xfc\xc9\xed\xf8\xce\x04\xa6\x32\x41\x4f\x42\xf6\x39\xaa\x66\x65\x60\xd9\x15\x81\xb7\xec\x93\xba\xb7\xec\xfa\x01\xb7\x70\x6f\x30\x1d\x11\x4c\x40\x5f\x18\xc4\x14\x0c\x11\xa4\xde\x38\x8b\xfd\x2e\x31\xd3\xb2\x2b\x15\x24\x34\x85\x65\x37\x52\x1f\xba\x5d\xe3\xad\xfb\x73\xd1\x02\xff\x2f\xbb\x2d\x4a\x31\x9a\x62\xd2\xec\x36\x45\x8e\xa7\x3e\x55\xbf\xec\xc6\x01\x33\x31\xf5\xda\x15\x85\x86\x23\x79\x13\x0f\xa6\xe3\xa4\x9a\x4e\x00\x16\x53\xba\xc4\xb2\xdb\x65\x90\xc1\x90\x7a\xfe\x7e\x7f\x5c\xef\x53\xb1\x23\xe1\x77\xa9\x9e\x1e\x52\xb4\x3a\xb1\xec\xf6\x03\xcd\x2d\xf7\xcb\xee\x00\x95\x51\x7b\x02\xc9\x72\x8d\x86\x4d\x00\x5e\xe1\xe0\xb5\x6e\x15\x31\x3f\xa0\x86\x24\x43\x88\x7d\x03\xc3\xa7\xc7\x62\xc4\xf8\x4e\x03\x66\x54\xa3\x42\xd0\x90\xa0\x88\x29\xf1\xdf\x66\x8b\xd3\x6f\x91\x79\x22\x82\x0e\x0d\x09\x0a\x76\x07\xc4\xd2\x8c\xc7\x3d\x1a\xa7\x75\x0a\x1a\x0d\xf4\xd5\x16\xe3\xa3\xdb\xfe\xb1\x6e\x03\xc1\x23\xe7\x3d\x5a\xb0\x89\x6a\x6f\x69\xd2\xd9\xd1\xe4\xa2\xce\xdf\x42\xc5\x50\x25\x68\x80\xa0\x0e\xea\x49\xb0\xc1\x0e\x2a\x11\x09\x8f\xd4\x03\xc3\xb6\x07\x54\x17\xa5\xef\xaa\x08\xc5\xc0\x1f\x02\xc3\x63\x7a\xd8\xdd\x33\xb2\x23\x2a\x7f\x8f\x92\x48\x92\x87\x83\x1e\x0d\x10\x2e\x7f\x92\x62\xf6\x51\x15\x92\x8e\x84\x4f\x4c\x37\x50\xe8\x73\x52\xa4\x62\xc3\x03\xf0\x0f\x2b\x23\x34\x5e\xd0\xc8\x91\x8c\x68\xb4\xa8\x12\x15\x87\x1c\xa3\x2a\xd2\x34\x68\x64\x28\x62\xb2\x4a\x41\x83\x22\x60\xa1\xd6\xa5\x0a\xcf\xd1\xd5\x86\x6f\x2e\x02\x33\x96\x2c\xee\xfe\xa2\x50\x3a\x88\xfb\xf4\x49\x99\x2f\x99\x0e\xa4\x78\x10\xe3\x83\xcf\x94\x86\x41\x6c\x9f\xf4\x20\x8f\x82\x4d\xc2\x48\x0f\xaf\xef\x49\x8a\x19\x70\xcf\x29\xe6\x54\xf4\x5b\x18\x06\xa1\x12\x85\x67\xc1\x28\x1e\x52\x92\x4f\xdf\x7d\x1a\x2d\x3c\x47\xd1\x68\xa0\xcf\x91\xca\xb4\x4d\xcc\x36\x1d\x13\x2d\x43\x8a\xd3\xfa\x06\x8d\x02\xfa\xb8\x01\xec\x11\xb5\xbe\x15\xf2\xf8\x22\xb6\x8d\x23\x4a\x6b\xd3\x27\xe1\x4c\x79\x63\x0e\x81\xe7\xea\x20\xc9\x14\xc3\xee\x0a\xc0\xdd\x18\x32\xb5\x13\x7a\xcf\xb8\xd6\x73\x9a\x65\x88\xe3\x43\xf0\x93\x20\x98\x5e\x68\x8f\xb1\xad\xfb\x7d\x8a\xeb\xa3\x7a\xa3\xa8\x10\xab\x1b\x04\x88\xc9\x91\x32\x91\xd4\x21\xd7\xa1\x66\x77\x60\xb5\xcb\xb2\x0a\x2c\x3c\x0a\x11\xec\xd1\xec\x2a\x0d\xc3\x1d\x27\xe3\x67\xac\x5b\xae\xfa\x62\x12\x1a\xc1\xa5\x09\xf5\x81\x70\xe2\x8e\x9f\x86\xdc\xc5\x9a\xed\x6e\xe8\x2b\x1a\x0d\x7a\xdb\x24\xc7\xb7\x59\x6a\xdf\xaa\xf4\x94\x87\xee\x28\x82\x56\x5e\xfd\x75\x62\xc3\x50\x0b\x24\x1a\x63\x34\x36\x00\x79\x0d\xa6\xdc\xa4\xd0\xae\x16\xb8\x7b\x44\x2a\x26\xc3\x16\x45\x86\x32\x12\xd3\xee\xe4\x4b\x2c\x6f\xa9\x07\x42\x25\x9a\x88\x71\x99\x2c\xba\x8f\x76\x42\x23\xff\x48\xcc\xd7\x93\x0f\x12\xf3\xbb\x0a\x15\x35\x81\x7c\x08\x0d\x03\x33\x83\xec\x29\xd2\xea\x66\xec\x87\xe0\x66\x0c\xac\x8f\x68\x27\x74\x02\x62\x7e\x16\x3c\x6a\xee\xa7\x04\x2e\x59\x4f\xf2\x94\x98\x54\xa4\x87\xd8\xe7\x30\x95\x7a\x34\x3c\x54\xf1\x67\xb4\x82\xed\x87\xc4\xb6\x87\xa1\x19\xaf\x0a\x9b\x23\xfa\xd6\xca\x00\x8d\xf9\x63\x8d\x0c\xc9\xc4\x78\x6c\xb2\x9c\xa0\x67\xe3\x31\x69\x8a\xf1\x4f\x2d\x5b\x4e\x43\xe6\x78\x88\x3f\x42\xf5\x2c\x34\x8c\xad\x86\xe4\x39\x37\x22\xa4\x02\x2f\x42\x33\x92\xb4\xb8\xf8\x4c\xc8\x0a\x08\xdc\x2f\xa0\xc2\x00\x0d\xb8\x0c\x95\x40\xd9\x37\x7c\xf2\x55\x21\x61\x8d\xbd\x6f\xe1\xcc\x84\xb6\x89\x22\xbe\x2b\xaa\xa6\xa2\xe7\x79\x42\x0a\x33\xc0\x84\x54\x33\x3b\x38\x02\xb3\xbb\x2f\x35\xe3\x11\xbd\xc1\x23\x81\x04\x16\xe8\xf9\x10\x29\xd3\x11\x64\xee\x99\x92\x89\x52\x9a\x89\x82\xc5\x7f\x24\x53\xb2\xaa\xcc\xb4\x0c\x5b\x96\x37\x84\x15\x8d\x30\x99\x48\x41\x23\x1f\xe2\x24\x4a\x4f\x68\x57\x12\xaa\x0c\x2a\x50\x5a\x05\xad\x84\x69\x76\xb9\x20\xa5\x6a\xb4\x2d\xa0\xeb\x74\xa5\x9a\x06\x30\x12\x49\x7d\x5b\xbe\x1a\xc4\x44\xea\x01\x85\xa6\x7d\xad\x30\x0d\x39\xcf\xe7\xc1\xad\xc9\x73\x2d\x93\x99\xf0\x27\x89\xea\x23\xee\x05\xea\x55\x6f\x99\x1a\x2f\x84\xb7\xfc\xe3\xae\x54\xa2\x01\x47\x60\x3f\x30\xb6\xe8\x37\x47\x83\x0a\x3f\x24\x7b\x29\xe8\x13\xd0\xb3\xe5\x5c\x38\x90\xe3\x5c\x7f\x30\xc9\xb1\x36\x92\x03\xa7\x51\x62\x40\x89\x7f\xe6\x58\x95\x5e\xfe\xd3\x0d\xf9\x8b\x15\x50\xfa\x22\xcd\xf9\x4f\xfa\xb9\xc1\x4f\x6e\xed\xfd\x9f\xee\x2d\x45\xff\x41\x64\x43\xad\x7f\x3c\x2f\xd3\xbf\x75\xfa\xf7\xf2\xf9\x4b\x1a\x79\x48\x2a\xf1\x7f\x34\xf6\xf0\xb1\x51\xc2\x3f\x1a\x7a\xf8\x88\x22\xea\xf5\x4d\x1d\xe2\x8f\x2d\xfa\x78\x4e\x03\x0d\x3f\x65\x1a\x59\xf4\xfb\x2f\x1a\x53\xf4\xb3\x42\xa3\x09\x3f\x7f\x94\xaa\x34\x76\x38\xf4\xf2\x2d\x05\xf7\x11\x14\xbd\x21\x05\x23\x60\xb0\xa2\x18\xc1\x6b\x0d\x06\xad\xae\x5c\x6d\xdd\xc4\x3f\x69\xe8\x00\xa8\x35\x21\x98\x4f\x08\x75\x11\xfa\x8c\xd0\xf5\x74\x80\xf0\x01\x5a\x46\x1d\x8b\x02\xfe\xa4\xc0\x21\x7d\xe7\xa9\x77\xf1\x9d\xff\x37\x91\x95\xbe\x1d\xea\x5a\x7c\x3b\xf9\x86\x58\xfd\xd9\xa4\xcf\x63\x8a\x7d\x41\xc3\x84\x7e\x0a\x34\x34\xe8\xc7\xa5\x31\x81\x1f\x22\xe1\x39\xfd\xae\x52\xe7\x23\xcb\x6a\x6f\x40\x48\x74\x54\x90\x38\xa2\xcb\xa1\x01\xf5\x36\x07\x78\x61\x03\x75\x8f\x64\x2b\x47\xdc\x4a\xbf\x83\x29\xef\x82\xca\x28\xd2\x90\xc1\x4f\x91\x02\x97\x08\x9c\x9d\x9d\x11\x73\xa0\x4b\x8a\x43\xe2\xcf\x9c\x5e\xbe\x2e\x97\xd7\x97\x73\xca\x04\x45\xbd\x33\x44\x39\x6b\x6b\xe2\x4a\xdc\x15\x15\x25\xc4\x30\x1e\xd3\xca\xb1\xc7\x71\x34\xe2\xaf\x19\x82\xe6\xe4\x49\x1c\xac\xf5\x06\xe1\xb4\x2b\xc7\x6b\xa0\xd6\x1a\x71\x0d\xa7\x4d\x27\x71\x77\xcd\x17\xa3\xff\x10\xfb\xa4\x11\x4a\x2d\xc5\xea\x90\x06\x2c\xe1\x43\x7d\xf9\x0d\x3f\xc5\xd7\x34\x30\x39\xf0\x86\xf8\x0c\xf0\xe8\xf3\xe7\x88\x41\x60\xaa\x62\xb2\xff\x11\xab\x46\x84\x38\x09\x71\xa4\x96\x8b\x14\x71\xab\x42\x6f\x89\x41\x91\x44\x31\x01\xfd\x12\x2b\x85\xf4\x43\xb1\x92\x7e\x2a\xd4\xd5\xf8\x01\x0a\x2d\x0a\x50\x07\xb6\xe9\xe7\x1d\xf1\x1b\x72\xbf\x5b\x1b\x0f\x45\xff\xfd\x8f\x69\xa9\x24\xc0\x76\x2a\x6e\x02\x99\xf5\x9e\x18\x4f\x7f\x8e\x28\x7c\x85\x5c\x3e\x42\x9b\xa0\xe7\xbb\xb8\xd7\xca\xb1\x62\x84\x01\x1b\x62\xfd\x52\xc9\x95\x96\x73\x63\xe8\x69\x7f\xba\x5b\x0c\x83\xb2\xe7\x81\xaa\xb9\x08\xf6\xc3\x4a\x0e\x53\x54\x35\x77\xdb\xa6\x69\x70\x95\x40\x03\x59\xa1\xd1\x75\x3b\x12\xc4\x9f\x34\x54\xb6\xb9\x72\x83\xca\x8e\xfa\x0a\xdf\xaf\xf4\xfd\xf1\xb0\x4a\x48\x85\x14\x5b\x37\xb1\xfa\xbb\x03\x24\x19\xdd\x2e\x85\x88\xb9\x7a\xf4\x43\x5f\x7d\xfa\xa9\xd1\xa0\x00\xf8\xff\x21\x8e\xa0\xcf\x4d\x9a\x64\xf0\xb9\x79\x7c\xfc\xb9\x7e\x4e\xc3\x84\x3f\x4e\xeb\x14\xbf\x8f\xe0\xd6\xe6\x59\x9d\xba\x7e\x48\xa0\x5b\xa7\x24\x43\xf0\x7b\x71\x7e\x7e\x74\x48\x23\x04\xe9\xdb\x47\x34\x9f\x7f\x52\xa1\x83\x83\xcd\xc3\x1d\x62\x05\x82\xd9\x3e\x3b\x2b\x6f\xb3\xf0\xa4\x51\xc3\xa9\xa2\xff\xe7\x24\x47\xcc\x44\xfa\xbb\xcc\x8d\xe3\x56\x3f\x8e\xe2\x40\xf4\x27\xb9\x30\x6e\xc5\x93\x31\x8b\x98\x1e\xa9\x6d\xbd\x69\x2f\x17\x8d\x84\x5e\xf5\x73\x1a\x31\x13\x8a\x64\xd3\x21\x24\x12\x7f\xb0\x62\x26\x47\xb9\x58\xc9\x22\x9a\x74\xe9\x93\x66\x8d\x29\xa5\xee\x6c\xd2\x44\x7a\x83\xc0\xfe\x17\x1a\xa9\xa8\x1f\x33\x18\x0d\xcf\x7b\x44\xca\x40\xc2\xda\x4b\x1d\x4b\x5f\xd4\xba\x43\x00\xd4\x0f\xb6\xea\x84\xfc\x11\x87\x27\xc1\xda\x87\x03\xa2\xc6\x26\x01\xec\xd2\xa8\x45\xe4\xee\xe9\xe6\x01\x01\x6f\x21\x4a\xfa\xa3\xa9\x80\x30\x3f\x41\xca\x07\x1a\xc9\xfc\x8b\x2c\x67\x08\xed\x91\x3c\x22\xb8\xbd\xbd\x4a\x8f\x46\xe8\x39\x47\x1d\x5d\x10\xfd\x76\x10\x4b\xbf\x17\x88\xda\xd7\x45\x7e\xe1\x8f\x03\x2a\xa6\x4e\xc9\xfb\x87\xc7\x17\x54\xce\x25\x47\x9e\xed\x1f\xee\xd4\x49\x45\xf8\x8a\xaf\x8f\xe2\x46\x18\x9d\xef\x1b\x22\x3e\xd1\xf8\xe1\xdf\xfa\xb7\x0f\x75\xea\x91\x5d\xca\x4e\xdd\xf1\x1c\x71\x9f\xf7\x0f\x29\xf9\x03\xc5\x1c\xd0\x98\xf1\x29\xe6\xa0\x7e\x4e\xbd\xba\x87\x98\xfd\xcf\x9f\xf7\xcf\xea\xdb\x47\xe8\x2e\x9f\xd3\xf6\x0f\x2f\xce\x09\x95\x7d\xa4\x1e\x1c\xe4\xa0\x54\x44\x24\xec\x0f\x8e\x0e\xcf\xa9\x31\x9f\x10\x7d\xb6\x4f\x00\x01\x43\x43\x36\x85\x3a\x74\x64\x34\x82\xcf\x04\x44\x48\x48\xc4\x1f\x1e\x71\xdb\x48\xec\x44\xea\xf3\x6c\xfb\x74\xff\x98\x9a\x75\x00\x20\x9a\xe3\x55\x07\x1c\xd2\xd7\x11\x8d\x48\xc0\x1c\x6d\x7d\xac\x6f\x13\x44\x1b\x1f\xc7\x9b\x94\x9d\x7a\x83\xd2\x4f\x48\x88\x22\xea\x24\x77\x4f\xff\x51\x67\x20\xee\x62\xf3\xf4\xbc\x4e\x74\x3c\xa1\x0f\xaa\xe4\x14\x3f\xba\x86\x2b\x00\x9b\xc6\x9d\x21\xa1\xfe\x99\x0b\x3e\x47\x98\x7a\x61\x9b\x9a\xd1\x61\xa0\xf3\x6f\x9f\x29\xdc\xe5\xf0\x17\x22\xff\x05\x20\xc4\x64\x3a\x0a\xa1\x9d\x7f\xc1\x97\x1c\x4e\x34\xae\x3d\x06\x53\xf3\xfd\x25\x25\x51\x89\x5f\xf1\x53\xff\x7a\xae\xc6\xcb\x37\x7c\x11\xf9\xbf\xe3\x97\x70\xeb\x23\xc3\xf9\xe9\xe6\x36\xf5\x83\xdf\xa2\x60\x9b\xe6\x76\x2e\x79\xc0\x29\x83\x01\xcd\xa0\xfd\xfb\x1c\x4d\xea\x01\x4d\x3f\x6b\xf4\xdb\xe3\x05\xe6\x90\x93\x31\xad\xf6\xe2\x31\x4f\xb2\xc5\x1c\xeb\x8d\x39\xd8\x4f\x28\x8d\x14\x05\x98\x4d\x10\xea\x93\x56\xd1\xcf\xf5\x79\xfb\x22\x37\x88\x72\x62\xd4\x62\xb5\x83\x06\x8d\xa4\x3a\x2f\x61\x43\x21\xb8\x4b\x0c\xde\x09\x87\xea\xf5\x4f\xb0\x9c\x20\xa8\xe7\x8c\x08\x80\x32\xec\x4b\x85\xdd\xb3\x1b\x4e\x54\x1a\x62\x8b\xd2\xbe\xd5\x37\x29\x77\x9b\x42\xdf\x61\x58\xa1\xc4\x06\x6c\x2a\xf8\x1d\xb0\x7d\x21\xc7\xfb\x28\x4d\xd8\x56\xac\xc8\x5d\x6d\x2c\x6a\xc2\xbe\x62\xc5\x5f\xf2\x86\x4d\x13\x86\x16\x28\x1d\x3f\x60\x60\xe1\x00\xa6\xef\xb8\x85\x10\x22\xaf\x38\x34\x86\xc9\x85\x53\xa7\x30\xb8\x70\xe8\xae\xb4\x41\x3d\x48\xc9\x4d\xd8\x5b\x28\xaa\x59\x80\xad\x85\x02\xff\xc1\xdc\xa3\xa6\x9b\xff\x90\x66\xfc\x1f\xbd\xc8\xe8\x12\xec\x7f\xb4\x5a\x4e\x53\x53\x8f\x3e\x05\x91\x19\x3f\xfe\x98\xc4\x0a\xab\xda\xc8\x2f\xba\xc3\xb6\xc8\x1b\x83\x17\x0c\x34\x88\xec\x91\xea\x7d\x0d\xe0\x51\x2c\x68\x7e\x1e\x71\x70\x04\x52\x8d\x11\x9c\x4e\x68\x5a\x9e\x50\xc8\x27\xba\xe2\x87\x16\xd8\x2d\x5e\x30\xad\xf2\x1a\xa6\x02\xab\x8e\x40\xfc\xa8\x88\xf8\xa1\x26\xed\x4d\xcb\xa8\xbe\xb7\x1c\xe2\x8d\x26\x1a\x77\x0c\x3b\x18\x85\x72\xb4\xa5\xd7\xaa\x9f\x66\xa3\x8c\xfa\x9e\xc6\xeb\x05\x6e\x36\x42\x83\x1d\xa6\xb1\xa7\x4a\xd7\x3d\x9a\x89\xd1\x80\xcf\x8e\xd3\x78\x5e\x70\x9c\x64\xbe\x35\xd4\x1d\x63\xcb\x2b\x74\x0a\x05\xb0\x21\x09\xa3\xaa\x9f\x99\xa0\x94\xb0\x1a\x09\xbd\xfc\x80\xbd\x48\x64\x96\x22\x5f\xd4\x37\x2d\xb6\xd2\x55\x32\x47\x69\x8a\xfd\x6c\x71\x98\x24\x3e\x8c\x45\xc2\x7c\xec\xb2\x19\x71\xdc\x80\xc9\x48\x24\x0b\x43\x62\x25\x02\x0f\x61\x3c\xa2\x48\x6c\x99\x51\x37\x6d\xb5\x38\x08\x93\x84\x0e\x4d\x78\x85\xff\x9c\x61\x64\x10\xf7\x44\xf7\xec\xbe\x47\x2b\x28\x18\x96\x38\x6e\x4c\x8d\xd9\x01\x70\x3c\x92\x81\x5a\xbd\xd4\x5b\xd6\x7a\xfd\x18\xe1\x1b\x58\x9f\x84\xbd\x6e\xda\x25\x18\x52\x44\x3f\xe0\x47\x74\xa1\x6a\xef\xb7\x52\x8b\xe7\x47\x0e\xb3\xe9\xf1\x13\x82\x94\x8d\x4d\x56\x82\xed\x65\xb0\x58\x09\x63\xb9\x53\x4b\x69\xc9\x11\x7a\x0a\xdc\xd1\x33\xe0\x67\x64\x9d\x82\xc4\x07\x1c\xea\x6b\xfc\x0e\xe9\x0b\x2b\x0e\xe4\xd1\xfa\x6b\x66\xfd\xb5\xaa\x4a\x06\xd1\x56\x89\x69\x07\xb7\xab\xe1\x08\xd6\xae\x7f\x0c\x2e\x95\xcd\xe0\x59\xfb\x9f\x67\x99\xb6\x60\x2e\x4b\xc0\x8b\x58\x55\x4d\xc6\x45\x58\xce\xd2\x48\x18\x0b\xe4\xa8\xf8\x81\xbf\x36\x49\xd3\xdc\xe2\x45\x4a\xc7\x02\xe9\x89\xe1\xb8\xb8\x63\xfa\x62\x7c\x26\x47\x37\xbc\xe0\xe9\x5a\x30\x19\x54\x8a\xb0\xaf\x3d\x95\x76\xc0\x0a\xeb\xb1\x00\xe3\xf6\x9f\x84\x52\x1b\xc1\x66\x5d\x3f\x78\x12\xee\x0b\x35\x97\x3b\x60\xc8\x20\x18\xd6\xa4\xd6\x19\x7e\xba\xe6\x48\x0c\x34\xea\x1e\xaa\xef\x18\x3f\xa4\x0b\xe4\x48\xec\x9c\x20\x2c\x61\x29\x39\x6d\xa5\x06\x9f\x11\x72\xb4\x61\xeb\x3b\x43\x6c\x1c\x86\xb0\x36\x9c\x23\x3c\x18\xc5\x3f\xa1\xee\x50\xb9\x17\x2d\x63\xb4\xfa\x82\xd0\xa4\x47\x71\x97\x1c\x9a\x0c\x89\x49\xbe\xb7\x60\x42\xe9\xc6\xb0\xc3\x8d\x51\x20\xdb\x5c\xce\xd9\x88\xf3\x9c\xd2\x3a\xc4\xe9\x6d\x63\x13\xf1\x11\x8a\xfb\x14\x17\x20\x34\xc0\xc2\x75\x82\x4c\x5d\x2c\x71\x29\x8a\x04\xcf\xb3\x29\x22\xd0\x0f\xc4\x96\x88\x12\x77\xda\x80\x11\xe1\x4b\x86\xf1\x94\xa0\x5a\x08\xc7\x7d\x9d\x72\xc3\x59\xc6\xb0\x36\x0a\x65\xfb\x08\x61\x6e\xe4\x30\xec\xfe\xb9\x80\x97\xb4\xf7\x1c\x23\x5b\x1c\xb7\xad\x6c\x3d\x3f\xed\x38\x36\x6a\x8e\x61\x6f\xe4\xc8\x5b\x9a\xfc\x4e\x60\xed\x41\xe3\xda\x54\x63\x9f\x47\xc3\x39\x02\x6a\x82\x8e\x29\x92\x24\xf1\x15\x7e\x78\xa6\x21\x6e\x42\x98\xe8\xd8\x6d\x5b\x96\x8b\x2d\x14\x38\x20\x99\x63\xac\x51\x48\xa4\xb5\x39\xa9\xe3\x30\xd8\x20\x55\x6b\xe9\x46\xfe\xee\x58\x71\x4a\xd0\xd6\xad\x18\x2d\x53\x77\xad\x28\x16\x9e\xc3\xb6\xb5\x1f\xf1\x81\x53\x49\x0c\x24\x16\xf4\xbd\x24\x46\x15\xb9\x9f\x7c\x6b\x39\x7b\xdd\xb6\x4d\xc5\xa3\x36\x5b\x9d\x49\x92\x10\x1b\x50\xf0\x0e\x96\x4f\x01\x5b\xc7\x00\x1b\x25\x94\x4a\x24\xc0\x4a\x6e\x24\xbb\x4c\x3f\x9a\x8c\xf0\xd5\xa2\x59\xe9\x06\x81\x01\x14\x97\x5b\x84\x26\x44\xb7\x3b\x0a\x8c\x61\x2b\x15\xb0\x30\x89\xae\xdc\x15\xca\x64\x7c\xdf\x26\xb5\x6f\xac\xb5\xcc\x9f\x80\x62\x3b\x0a\xe3\xf0\x99\xa1\xa9\x57\x06\x23\x4f\x4b\xba\x4d\x40\xb4\xd9\x2c\xb2\x85\x20\x35\x1e\xf5\x6c\x23\x3c\xe8\xc6\x21\x8c\xae\x42\x19\x4e\x94\x02\x0f\xbb\xd2\x4c\x4c\x03\x36\x58\x31\x63\xfd\x3e\xe6\x18\x6d\xe2\xd8\x69\xb3\x2d\x98\xd6\x9d\x44\xfa\xb6\x31\x58\x12\xcd\xdb\x89\x59\xfa\x84\xe1\x11\x1e\xb7\x25\xec\x1a\x1f\x90\x36\x8d\x98\x60\xa7\x48\x34\x3b\x86\x30\xe6\xaa\x4f\x6d\x5d\x3f\xe7\x4f\x1a\x25\x6b\xbc\x44\xdd\x6b\xeb\xaf\x2b\xd2\xb7\x0d\x25\x2e\x0c\xcc\xb6\xd9\x26\xda\x07\x18\xcf\x28\x5f\x38\x8d\x82\xdf\x99\x39\x3f\xea\x84\x41\xc4\xea\xd4\x27\x7c\xa6\xcb\xf5\xcf\xe6\x73\xa8\x8d\xf6\x07\x1c\x81\x91\x73\xd8\x36\x66\xc4\xa3\x36\x1b\x72\x98\xf2\x6a\xdf\xe0\x98\x62\x68\xe6\x39\x69\x27\x96\xd3\x4b\xd4\xca\x61\x35\x6d\x7c\x55\xdf\xa3\x1c\xec\xca\x3a\xf8\x1f\x39\xf9\x4f\xce\xcb\x95\x69\xb9\x7b\x8a\x9c\x72\x44\x24\x84\x20\x39\x6b\xb3\x9d\x2e\xe6\xb2\xbf\x33\x78\xd6\x6a\xf7\xec\x9c\x20\x68\x38\x5c\xe0\x07\x4b\x53\x6a\x66\x3b\xd9\x78\xbb\xa4\x20\x35\xed\x2b\xfd\xfc\x84\x69\x9a\xf2\xff\x1c\x0c\x7a\x5b\x53\x1a\x2f\xfd\xf1\x11\xf4\x05\xc2\x82\x52\x7f\xc1\x5a\x4d\xa9\xbf\x4a\x8f\xb0\x53\x23\x54\x7e\x84\x89\x9a\x42\x0f\xd4\xef\xdf\x09\x86\xbe\x9f\xd3\x8f\x59\x7c\x87\x48\xe3\x8f\x57\x24\x74\xd4\xc7\x7a\xe9\x25\xa5\x5c\xba\x22\xf6\x44\xfc\xf0\xf0\xeb\xd1\xf5\x63\x6f\xd2\x8e\xc7\xa9\x6f\x4d\x10\xe7\x45\xb2\x1f\x79\x33\x88\xc3\x5c\x69\xc9\xf3\x84\xb5\x83\x1c\x63\xcb\xd2\x0d\x9c\x5f\xc2\x13\x8d\x51\xd0\xcc\x5f\x48\xa7\x1a\x78\xc1\xc3\x83\x1f\x57\x45\xa3\xd4\x8c\xa9\x94\x87\x87\xa5\xa0\x21\xc2\xe6\xc3\x03\xff\xe4\x89\xaa\x05\xa4\x39\x55\xea\xbe\x3c\x68\x1a\x12\xec\xc7\xe6\xca\x4a\x3e\xa4\x62\xc6\x7e\x33\xef\x38\x55\x67\x49\xc5\x11\x12\xbe\x53\x0b\x1a\x61\xd3\xf3\x2b\x54\x34\x05\xf8\xab\xc2\x51\xbf\x1e\xad\xad\xea\x58\x6d\xa0\x9a\x52\x83\x14\x27\x37\xf4\x7c\xe0\xe4\xca\xaa\xa4\x22\xb8\x8a\xaa\x13\x47\x79\x48\xbc\x25\x2f\x6c\xc8\xa6\x13\xf2\x4f\x55\xd2\x18\xcc\xe9\x36\x23\xb5\xaa\xc3\xa1\xb5\xdb\x1d\xe7\x9d\x5f\xd6\xce\x6d\x8b\xe9\x24\x8a\x5f\x7c\x2f\xf5\xb1\xb2\x36\x9f\x23\x51\xe3\xbf\x15\xfe\xeb\x41\xf0\x0a\x0b\xef\x36\x67\x07\xc6\xbe\x07\x5e\xc5\x92\xa3\x4a\xb8\xf9\x9e\x77\xd5\x06\x92\x94\x8a\xbf\xb9\xb8\x4f\x03\xb6\x1f\x00\xa0\x25\x1c\x5d\xfe\xa8\x55\x9d\x4d\x0c\x92\x44\xbf\xaa\x08\x11\x88\xc6\xa7\x66\xa3\x13\x34\x1b\x9f\x9b\x54\x1c\x72\x04\x9e\x47\x4b\x08\x03\x78\xd5\xd6\x71\xb4\x06\x79\x78\x30\x58\x50\x07\x78\xde\xf9\xca\x0a\x0d\x1c\x63\x0c\x58\x4a\x50\x6c\x74\x65\xf3\xc9\xa4\x80\x92\x96\xf8\x37\x4f\x52\xc7\xc9\x22\x4b\xd5\xdc\xa3\x9a\xc5\x79\x3f\xff\xa3\x52\x49\x41\x4e\x4a\x3d\x68\x3d\xda\xbd\xd6\x6e\xab\x4e\x54\x24\x3c\x68\x65\x8a\xf3\xec\x8a\xac\xd6\x1b\x82\x59\xdd\x1a\xdb\xec\x0f\x56\xf0\x32\xcc\x7f\x35\x9b\xbc\x64\xa7\x76\xec\x54\xee\x61\xcf\x1b\xb5\x2c\xf7\x02\xab\xd3\x39\x39\xc1\x00\x70\xc4\xab\xe8\xfc\x95\x95\x6c\x4f\x58\x7e\x07\x99\xca\xf1\x61\xc3\x06\x4d\xb4\x3b\x85\x1e\xd8\xd0\x06\xcc\xf3\xea\xed\x14\x64\xb8\x18\xe4\xd6\x2a\xe5\x7a\x31\x88\x85\xd5\x68\x41\xa3\x6d\x3c\xfa\x8b\x38\x3d\x6d\x37\x1a\xac\x09\xc9\x04\xb0\xb3\x4e\xec\xa2\x45\x83\xe6\x01\x92\x27\x79\x15\xf0\x0a\x85\x56\x28\x9c\x47\x14\x1c\x85\xbc\x08\x1a\x8c\xa7\x23\xf9\x9f\x69\x1c\xfe\x67\xb9\x90\x2f\xd7\xdf\xbe\x68\x37\xf6\x88\x6b\x9c\xf7\xef\xdf\x97\x1c\x97\xa0\xbd\x52\x35\xed\xe9\x76\x28\x8c\x20\x4b\x6a\xf8\xdc\x6c\x9c\x51\x0e\xd1\x10\x41\xd3\x4d\x4c\x00\x8e\xe5\x8b\x92\x66\x22\x4e\x5b\x12\xce\xa4\x4d\x9a\x7a\xae\x97\xe7\xe1\xb5\xfe\x2e\xc9\x43\x7d\xa7\x1a\x1d\x7a\x2d\x1e\x87\x57\xa1\x1a\x87\x06\xc0\x5d\x4f\x7a\xdf\x92\x1f\x6a\xe4\x2e\xce\xe1\x54\x55\xfc\x40\x2a\x2c\x03\x37\x4c\x8a\x10\x1c\x03\xbc\x1e\x1f\xe7\x4b\x9d\x01\xb2\x1a\x66\x39\x44\x99\x76\x7d\xf5\x8c\xc1\x01\x95\x09\x0c\xbf\xd5\xf2\xd2\x6c\x24\xe4\x4a\xde\x69\x5c\x93\x68\x27\x9d\xd4\xa9\x11\x35\x2b\x44\x1c\x83\xcf\x57\xae\x0a\xfd\x6a\xd7\x96\x12\x7f\xaa\xc5\xf6\xef\xda\xeb\x96\x9f\xa2\x90\x4f\xe2\x9c\xa0\x89\xe8\x7e\x63\xbb\x39\xd7\xaa\x2c\x51\x30\xbd\x51\x55\x8f\xcc\x29\x37\xb1\x07\x0b\x66\xb1\x3f\xb8\x7d\x78\x98\xa3\x50\x01\x52\x1a\xe9\x8f\xe9\x7c\x78\x85\x1e\xe7\xde\xf6\x63\xcc\x64\x8e\xfa\x21\xf4\xbf\x0a\x1a\xc0\x89\xd0\x89\x8b\x92\x94\x08\x33\xbd\xd0\x20\x8a\x69\x6a\xd3\xb1\x79\x52\x24\x1c\x77\x91\x7c\x23\x00\xe8\x16\xb5\x7c\x48\x3a\xca\x44\x9a\x6f\xf7\x36\xf6\x96\x4a\x4e\x05\x3f\x65\x87\xbe\x1c\x53\x92\xae\x52\x93\x81\x70\xf9\x1c\x36\xdd\xc0\xf3\x1b\x67\x34\xbd\xdd\xb7\x69\x22\xf6\x89\x31\xf6\x10\x28\x52\x6d\x72\x44\x05\x54\x83\xc6\x35\x51\xa8\xb1\xe3\x63\x1e\x00\xd1\xce\x89\xd4\x14\x15\x98\xf0\x45\x88\x0f\x25\x50\x0d\x47\xf3\x7a\xad\xd8\xea\x0e\x7c\xd1\xad\x53\xd5\x6c\x1e\x26\x4d\x2e\xee\xb2\x26\xe5\x54\x99\xa0\x84\x21\x4f\x98\x69\xd7\x7e\xd3\x13\x72\xa2\x50\x60\xde\xec\x02\x2b\x9f\x7a\xd9\xa9\x8a\xa2\xf4\x10\xaa\xb2\xb3\x15\x28\x4e\x68\xc0\x83\x93\xe2\x5c\x81\xf4\x2b\x99\x4e\xa9\xc2\x0d\xdc\x48\xf5\x7a\xeb\xef\x47\x12\xca\x6d\x04\x7a\x10\xbb\x2d\xea\x74\x9e\x0b\xd5\xca\x53\xef\x4b\x91\x94\x11\x45\x13\xfc\x65\xf5\xf4\x5d\xac\x3b\xba\x57\x0c\xc4\x90\xca\x93\x67\xf0\xf1\x38\x1f\x89\x40\x3a\x0b\xe2\x14\x67\xdd\xc5\x99\x1e\x21\x49\xd0\xb8\x0d\x9a\x55\x9f\x7a\x1f\xe9\x45\xf6\x13\xf1\x88\xff\xc4\xca\xca\x07\xa1\xf2\x28\xf7\x16\xf4\xc5\xe3\xb7\xfc\x5d\xec\xf6\x48\x2b\xf2\x29\x00\x0a\x2c\x6f\x4f\xc7\xb4\x58\x62\xc7\x69\x22\x32\x4a\xed\xd0\xb8\x4a\xdd\x77\xe3\x8c\xc7\x58\x89\xa6\xa7\xc6\x65\x88\x01\x50\xb2\xe4\x54\x57\x71\xad\xc2\x09\x13\xc9\x6a\xd9\xd0\xa8\xf4\xce\x23\xe4\x04\x0f\xdd\x1d\x49\x45\x79\x19\xcf\x5f\x4b\xe4\xae\xfd\xbb\xf1\x63\xfc\xe3\x4e\x94\x9a\x2f\x9e\xaf\x35\xda\x60\x7a\xab\x8a\x4d\x5b\x38\x53\xb6\xad\x98\x1b\x94\x3a\xf6\x5a\xe9\x4b\x6b\x8d\x7f\x97\x56\xdf\x36\xe7\x4b\xe9\x29\x44\x93\x11\x7b\x4b\x3c\xba\xd6\xf8\x31\xf9\x31\xfa\xd1\xcf\x35\x0b\x6b\x2d\x77\x2c\x1d\x15\xfb\xef\x34\xfa\x21\x0d\x3e\x27\x90\x23\xab\xc0\x9d\x78\xbe\xbc\xa4\x1d\xc8\xa8\x43\x3a\x5f\xca\xb7\x75\x4d\x58\x0c\x66\x07\xaa\x2d\xb2\xf6\x43\xe1\xee\x6b\x04\x06\x14\xfe\xa4\xc3\x43\x0a\x7f\xd4\xe1\x6b\x0a\x7f\xd6\xe1\x11\x85\xf7\x74\x78\x4c\xe1\x5d\xa9\xb9\x03\xb3\xc5\x24\x14\xba\xfd\x46\x07\x11\x55\x88\x56\xd5\x17\x75\x49\xd3\x79\x7e\xa6\x62\xc7\x02\x68\x47\x36\x80\xc6\xc6\x06\xe8\x65\x00\x34\x8a\x36\xc0\x34\x53\x85\xc6\xdb\x06\x38\xc8\x00\xe8\xc6\xd8\x00\x42\x08\x1b\x42\x37\xd1\x31\x73\x8e\x60\x99\x40\xb8\x7b\x6b\x2b\x44\xdf\x01\x02\xef\x28\x30\x44\xe0\x3d\x05\xae\x11\x58\xa6\xc0\x08\x81\x3f\xd1\xbd\x08\x60\xc7\x9c\xc2\x13\x84\x1b\xf8\x58\x79\xf7\x7e\xf9\xcf\xe6\x5a\xca\xf6\xd3\x0c\x9f\xec\xa2\xaf\x88\x60\x35\x3f\x80\x12\x4c\x62\xb3\x76\xc3\x00\x95\x5b\xf5\x23\xac\x8e\xbd\xb1\xc7\xc2\x2f\xbd\x63\x5d\xa9\x4b\x57\xed\x46\x57\xda\x91\xab\x76\xa8\x2b\x3d\x84\xd4\xbe\x74\x65\x2a\x1f\xdd\x80\x96\x35\x4a\xc4\xb2\x78\x3d\xb6\x66\x16\xb4\xfe\x8e\x5a\x6f\x09\x2a\xa9\xea\x88\x48\xba\x89\x26\xd4\x81\xc8\x74\x73\x84\x2f\xd9\xd8\xa6\x3c\x25\x1a\x6e\xb7\xd2\x08\xb4\xb6\xc8\x7f\x95\x05\xd9\x68\x93\xbc\x2a\x13\xa1\x23\x91\x6f\x39\xa4\xe2\x44\x9e\x12\x11\x8d\x1b\xa2\x79\x0b\xa3\x8a\x22\xbf\x0a\x92\xa1\xa2\x40\xe3\xc1\x8d\x68\x02\xbc\xf0\x9b\x0d\x3f\x64\x71\x98\x2f\xb9\xab\xc8\x9e\x48\x41\x52\x8f\xa2\x47\x6b\x50\xdc\x2e\x1a\x65\x2b\xf9\xc6\xbf\xab\xcd\x82\x53\x25\xca\xdb\xf2\xd6\xf9\x35\xbe\x8d\x27\x41\x9b\x66\x84\x5f\x81\xa0\x19\x61\xcf\x17\x15\x9d\xb5\x2e\xab\x1c\x35\x09\x92\xa8\x76\xa4\xa2\xae\xd3\xa8\x9e\x8e\xfa\x98\x46\x4d\x65\x55\x6f\x1c\x54\xb0\x18\x98\xa3\x45\xa8\x69\x11\x24\xb4\xc0\x88\x21\x7a\x84\xc9\x60\xb1\x48\x12\x5a\x1c\xf7\xa8\x74\xc0\x3b\x66\x3a\x34\xe9\xc7\xf8\xdd\x0a\x9a\x55\x5b\x6b\x59\xd3\xd2\x07\x3d\xbc\x21\x0c\xdf\xfb\x9a\x87\xa5\x04\xed\xfc\xd5\x97\x4e\xe1\x8b\x4c\x7b\xd7\x3a\x31\x90\x91\xb6\xe9\x38\xf0\x2d\xe2\xee\x65\x25\x72\x4b\xe4\xfd\x42\xd9\x69\xf4\x64\x56\xd2\xed\x67\x54\x1e\x5a\xe1\xaa\xc5\xb5\x53\x13\x8d\x3b\x22\x86\xfe\xaa\x24\x73\x03\x2d\x5f\x03\xae\x0b\xcb\xeb\xd5\xb2\xe7\x85\xbc\x56\x0e\xa0\x59\x1a\x4c\xa9\xea\xaf\xd2\x6d\x17\x7b\xe2\x8e\xdb\x41\xc4\x2a\x04\xd6\x01\x8c\xf9\xc5\x8c\xa8\x1d\xa5\x55\x58\x87\x42\x32\x0c\xa2\xe6\x59\x6a\x40\x76\x9e\xcd\x88\xcb\x8f\x73\x0b\xef\x12\x61\x4c\xd2\x37\x9d\xdc\x92\x85\xb8\xb4\xe2\x7d\x2b\x3e\xf2\x14\xea\x21\xb5\xc9\x95\x68\x98\xdb\x22\x1d\x9d\xe6\xb4\x60\x65\xa5\xf5\x2e\xaa\xb6\x0a\x05\x45\xb0\x0e\xad\xd3\x5b\xa4\xfc\x1f\xb9\x5d\x4f\xea\x50\xdf\x5b\xcb\xff\x08\x5f\x38\xf9\x1f\x3b\x2f\x1c\x08\x99\xec\x77\x35\x1c\x70\xd6\xb1\xd7\x6f\x4c\x88\xc0\x1d\x1a\x58\x8d\x23\x97\xfe\x35\xdd\xa9\x37\xe4\xb8\x6e\x1a\x07\x7e\xa3\x8a\xc7\x8d\x52\x93\x4d\x10\x14\x9e\xaa\xb0\xe3\x8f\xa4\xe8\x90\x28\xf8\x14\x2b\x88\x32\x62\x6b\xa5\x4a\x47\xe4\xf1\xe1\x96\x69\x75\xc1\xe0\x56\xc2\x54\x27\x50\x05\x26\xdb\x3a\x52\x15\x20\x07\x55\x12\xe2\x5d\xc4\x38\x8f\xb7\xed\xb8\x2b\x01\x1b\x24\xec\x6d\x75\xe6\xa7\x2c\x9b\x89\x77\x7e\x6d\xb5\x5c\x11\xef\xfd\x5a\xb9\x52\xb2\x8e\x95\x70\x9f\x9b\x5e\xf1\xa9\x57\xa8\x67\xaa\xc1\x3b\xf0\x7d\xb5\x50\x08\x1c\xdf\x7b\x59\x7e\xe1\x17\x68\x8d\x23\xa1\xf4\xb9\xfe\xbf\xbc\x57\xeb\x6f\x5f\xbd\x7d\xf3\xd7\xfa\xdb\x37\xd6\x92\x18\xd9\x7f\xd2\xa0\x5a\x2f\xbf\xfa\xeb\xd5\xc6\xcb\x37\xaf\x36\xcc\x7a\xea\xa1\x94\xca\xe5\x03\x7b\x49\x2b\xac\x25\x2d\x35\x83\x46\x19\xab\x13\xb5\x58\x54\x2c\x15\xe3\xd0\xe6\xca\x84\x5b\x94\x4c\xfa\xb1\xaa\x5d\x7c\xe6\x64\x92\x21\x48\xa3\x43\x68\x3b\xb6\x70\xdb\xb4\xe5\xfb\x20\x1d\x57\x96\xbe\xad\x0a\xcf\x37\x56\xf3\xce\x8f\xc6\x8f\xe6\xaf\xc7\x42\xed\x45\xf1\xf9\x8f\x7f\x3f\xb8\x95\x3f\xde\x2d\xfd\xf8\xc1\xf5\x6d\xf9\x09\x16\x77\xa5\x0d\x8a\xd8\xa1\x88\xca\x55\x2b\x2b\xf4\xa1\xb0\x9e\xca\x56\xfd\x6e\x98\x6f\x0b\x51\xc8\xfb\xb5\x20\x14\x05\xbf\x50\x27\x21\x79\xe4\x14\x62\x21\xdc\xc3\x96\x63\x23\xef\x63\x66\x30\x74\x25\x61\x6f\x1a\x90\x12\xf1\x28\xab\xb3\x28\x7d\xad\xa9\xba\xe0\x38\x56\x6a\xaf\x7b\x12\x7b\xc7\x31\x04\x42\x2d\x53\x76\x4a\x1a\x95\xca\x43\x96\xe3\x1f\x2b\xb3\x80\x81\xa7\x84\x40\x40\x3c\x5a\x7a\x1f\xd4\x8c\xe0\x40\x85\xc4\x19\x95\x00\x83\x80\xed\x06\x46\xe6\x0e\x60\x88\x5b\x59\x21\xe9\xe3\x83\xb5\xb5\xf0\xa3\xb2\x2a\xa4\x50\x82\xc9\x0c\x67\x05\x34\x52\x21\xd8\x31\x1b\x0b\xa8\x97\x30\x47\x90\xda\x6b\xba\xad\x6a\x24\xe8\xa3\xbb\x45\x4c\x45\xb8\x5e\xfe\xb6\x25\x97\x69\x4b\x0c\xce\x8a\x2c\x95\xdf\x37\xcc\x00\x55\xa9\x7d\x24\x2f\x03\x6f\xa6\x8d\xce\xdf\x37\xf1\x72\xb6\x89\xa4\x31\x93\x26\xb0\xba\xfa\x4f\x1b\xf8\x1d\xcd\xfb\xe2\xcf\x37\x4f\x45\xff\xae\x87\x12\xe3\xa8\xf7\x4c\xb0\x50\xf4\x18\xd7\x9a\x32\x6a\x1e\x91\x62\x43\x42\x93\x86\xdf\xbb\xb0\x1a\x11\xc5\x23\x60\x23\x57\x56\x7c\x94\x19\x90\x08\x8d\x9a\x6e\x44\x8b\x28\x8b\xb7\x4e\xe3\xf9\xb2\x9f\x2a\x3a\xf4\x42\x6a\x33\x35\x37\xac\xae\xd2\x5c\x12\xce\x96\x4e\x4b\xcd\x10\xa5\x33\x63\x9e\x31\x3f\x0e\x17\x34\x33\xed\xc5\xe1\x3f\x6d\xad\xc6\xa8\xd1\x44\xf3\x68\x12\x98\x43\xad\x43\xad\xee\x50\xab\x3b\x8a\xcf\x3a\x40\xad\xa5\x06\x7d\xd7\x6b\x35\x3a\xb4\xe2\x52\x58\x76\xdd\x8e\xcb\x3a\x2a\x11\xa3\x50\x68\x7a\xdd\x44\x96\x92\x42\x77\x0e\x9c\xb1\x1f\xfa\x34\xce\x48\xfd\xaf\x70\x6e\x41\x47\x21\xb4\xe7\x50\xc6\x54\xd6\x22\x94\x31\x89\xb5\x80\x6f\xc4\x58\xb5\x9a\x9e\x46\x35\xa2\xb0\xdb\x72\x45\xaa\xb9\x11\x8a\x17\x8c\xe2\x48\x86\xd3\x40\xce\x60\xe9\x86\xce\x2f\x28\x01\xbe\xf7\x95\x18\x34\x4c\xb3\x25\x19\x9e\x46\x1c\x79\x81\xb6\x24\x56\xfe\x9e\xb7\xf4\xd6\x80\x96\xc9\xbf\xa4\x42\x29\x74\x25\x41\x02\xa3\x47\x1b\xa5\x2f\xdc\xd3\x5f\x68\xbc\x3e\x7b\xba\xab\xbf\xfc\x5e\xf4\xfc\x3d\xf3\xd9\x7c\x0d\xe5\xf9\x09\xd6\xd6\x03\x6e\xa9\xa4\x11\x5c\xa2\x01\x77\xc9\x08\xb6\xe4\xef\x58\xb1\x25\xff\xdf\xe0\xb7\xf4\x14\x82\x66\xc1\xbd\x54\xb2\x46\xe3\x76\x28\x6c\x2d\xb0\x94\xed\x0b\x5a\x43\xc0\xd8\xc1\x25\xaa\x59\xcc\x55\x51\x2b\x2b\x34\x73\x3f\xba\x7a\x66\xab\xce\x2b\x07\x5f\x93\x51\xee\x7b\xdf\x4c\x38\x99\x8a\x49\x47\x80\x7c\xac\x98\x36\x41\xf9\xf6\xa9\x4d\x0d\xbf\x69\x69\x74\xdf\xfe\x0b\x49\xf1\xdf\x75\x16\x2d\x80\x12\xe9\x98\x9e\x9c\xb4\xf5\xe1\xea\xa4\xf2\x2b\xad\x91\x74\xad\xd9\x1a\x59\x12\x87\xab\x9e\x16\x4f\xa1\x92\xc6\x2c\xa1\x02\x5d\xaf\xa6\x58\x60\xc4\x14\xa6\x85\xb0\xca\xca\x5b\x6e\xf2\x18\x78\x54\x79\x42\x90\x60\x9e\x20\x01\x08\x12\x34\xad\x93\x9b\x33\x96\x96\x77\xde\x89\x8a\xb1\x4e\x6e\x5e\x59\x13\x37\x9b\x62\x3e\x5a\x05\xf8\x57\xda\xa0\xb4\xc4\x1b\x03\x4e\xaa\x94\x69\x8b\x0c\x4c\x31\x55\x9f\x9a\xa2\xad\x7f\xe8\x90\x2a\x1f\x53\xb4\x6d\x39\xc1\x95\xe9\x97\xf0\x8a\xed\x61\x25\xe0\x90\xf6\x9b\xbc\xb2\x59\x4a\xe3\xe8\x86\x55\x5a\x2c\x60\xe6\x22\xe6\x21\xf6\xef\x1a\xf6\x0f\x2c\xb3\xaa\xbd\xbd\x65\xb7\x84\xe0\xb7\x7c\x65\x45\x3b\x8e\x17\xda\xc1\x5b\x57\x59\xf3\x12\x6b\xcf\xef\x32\xcb\x01\xac\x83\xb0\x88\x29\x55\xc3\x77\x7e\x35\x24\x46\xe1\xcd\x3b\x41\x7f\x52\x06\x56\x81\x86\x45\xb4\xf8\x6a\x76\x5d\x51\x86\x8e\x61\xd9\xd5\x59\xd7\x30\xdc\x92\xc4\x07\xc4\xa7\xc0\x82\x48\x1d\x62\x09\x2d\xbd\x2e\x42\xd4\x7a\xb5\x0f\xf6\x53\xed\x83\x85\x70\xad\x72\x1c\x61\xec\xc6\x02\x46\x74\x63\xc4\x95\x49\x17\x45\x8a\xf3\x5b\x1e\x2f\x4d\xd4\xe4\xd3\xe2\xc9\x47\xd0\xb4\xd2\x69\x52\x7c\x47\x6f\x1b\xa2\x28\x2c\x48\xad\x1d\xd2\xab\x54\xe6\xa6\x14\xed\x4a\x53\xe3\xd5\x55\xc6\xc8\x6d\xf7\xe5\xd5\xd5\x8c\xe4\x5a\x7f\xef\xd9\x6d\xaf\x51\x41\x57\x89\xa4\x75\x2a\x99\x4f\x08\xb6\xd4\x0e\xa6\xb4\xe2\x94\xe7\x7e\x3d\xba\x6a\x8d\x86\x0e\xe1\x3e\x33\x33\x02\x75\x09\xcd\x94\x34\xa6\xfb\x31\x91\xa0\x16\xb7\x0b\x13\x04\x2a\x79\x6d\xa4\x96\x8e\x5e\xae\x17\xb0\xfa\xb7\x88\xe9\x93\x68\x22\x52\xfb\x34\xdc\xbd\x25\xa8\x58\x01\x66\x5c\xe9\x3c\x32\x0f\xdb\xd8\x74\x66\xdb\x55\x67\x41\x18\x3c\x3c\x74\xaf\xdc\xa5\x72\x66\x50\xed\xce\x6d\xcc\xd4\x75\x0c\xd5\x61\x06\xb9\x05\x6f\x52\x89\xde\xd0\xb4\xd3\x2e\x84\x22\xc1\xdd\xd8\x21\x59\xd5\xaa\x1a\x6d\x21\x2a\xb4\xde\xbf\x2f\xbb\xfd\x6a\x9f\xf4\x45\x96\x1c\x92\x50\xef\x36\x49\x75\x20\x7d\xdf\x27\x16\xc1\x97\x43\xa3\xb3\x5f\x8b\xbc\x6e\xa1\x5c\xc9\xb7\x3c\x52\x2b\xbc\xa5\x7e\xa2\x4b\x74\x6a\x51\xe5\xff\x8b\x2c\x33\xe6\x95\xb1\x2e\x04\xa4\xdd\xfb\x68\x96\xdd\xad\xfd\x39\xa6\x2e\xd9\x8a\x33\x2b\x93\xbf\xd8\x8b\xa2\x12\xb8\xec\x8b\xa0\x64\x51\x55\x71\x39\x97\x57\xe5\x3a\xec\x79\x2b\xa1\x4f\x98\x17\x8d\x01\x49\x3d\x1f\x7f\xa9\x47\x44\x63\x18\x34\x57\x7d\xfc\x7d\x54\x1b\xee\x8b\x2a\xc4\x1f\x64\xb0\xae\x3e\xb0\x57\x52\x0b\x6a\x4c\xf9\x99\xfa\xb7\x78\xe7\x86\xc5\xbb\xcc\x4a\x6c\x70\x95\x98\x50\x97\x78\xaf\xf3\xe1\x01\xbf\x3e\xa3\xf4\xb1\xb9\xc4\x1a\x76\x3a\x3f\xda\x7b\xf6\xd4\x4b\xa1\xb7\x17\xd2\x74\x47\x98\xca\x77\x41\x55\xaa\x99\x65\x09\x6d\x93\x68\x9a\x6c\x2e\x9a\x5a\x53\x8b\xf7\x55\x76\x79\xcc\xeb\x62\xbd\x48\xb6\xc0\xf6\xc2\x99\xf3\xf8\x50\xe2\xad\x9e\xda\x37\xe9\x29\x72\x34\x70\xac\x41\x13\x1a\xe1\xc3\xe3\x06\xa3\xc6\x9e\x7c\x24\xcf\x3c\xd5\x20\xce\xb3\x2d\x36\xa0\x91\x41\x03\x04\x3f\xa4\xdb\x3a\x0e\x44\x85\x5c\xb4\xb8\x1f\x5a\xf2\xb4\xa1\xa4\xe9\xfb\xf2\x8b\xbc\x58\x2d\x99\x46\x53\xec\x0c\xf7\x50\x4f\x7a\x65\x07\x3b\x60\xf9\x74\xae\xb7\xef\x40\x99\x63\xba\x46\x73\x81\x3c\x5e\xa0\x4d\xdc\x5c\x65\x45\x47\xa3\x69\x8c\x08\xff\x40\x0c\x57\x59\x02\xd7\xac\x9d\xb9\x9b\xab\x74\x37\x90\x24\x72\xc5\xd7\x12\x73\xc1\xf6\xfb\x6d\x32\x65\x66\x76\x52\xe7\x48\x90\xe0\xa4\xb0\x48\x15\x96\x46\x53\x73\x50\x06\x55\x69\x50\x8d\x2c\x54\x25\xd3\x39\x78\xef\x45\x69\x15\x39\xa2\x0c\xb0\x8b\xa8\x21\xce\xa3\x41\xd4\xde\x24\xb2\xe7\xc9\x05\x5b\xac\x6a\x9b\xf1\x23\x2d\x71\x09\x72\xa9\xe4\xb8\xf7\x57\x08\xa1\xed\x4e\x5a\xca\x4f\xbb\x14\xcb\xdc\xf8\xc9\x1a\x80\x55\x1f\xe3\xbe\xb4\x60\x0b\x74\x7e\x7b\xf3\x89\x8d\x31\x28\x0a\xf6\xc4\xf4\x99\x8a\x7f\x1a\xf9\xa5\x38\x4e\x4b\xb4\xf7\x88\x53\xbc\x37\x67\xc5\x38\xad\xae\xe3\x7e\x5e\xad\xb1\x59\xed\xb0\x05\xf3\x56\x46\x31\x11\xff\xf2\x53\x85\x34\x78\xe1\xd7\x82\x82\x5f\xb1\x98\x6e\x7b\xb6\x6c\x51\x08\x5e\xe4\xfd\x55\xdb\x4c\xb9\x93\xa1\xdb\x8b\x76\xf1\x78\x7f\xad\xbc\x61\x0d\xef\x7a\x56\x0a\xf8\x04\x12\x0c\xc6\x79\xce\x67\x4f\x31\xf3\x60\x63\x6a\xc7\x2c\xd8\x87\xf9\x89\x9c\xda\x44\x15\xbe\x68\x37\xee\x60\x86\x5e\xa5\x44\x42\x70\x0d\x88\xb8\x2f\xdf\xd8\x5a\xdb\xde\xac\x6a\xc8\x36\x17\x01\x71\x64\x29\xc1\xfb\x36\xd4\x45\x6c\xf5\xdd\x42\xeb\x97\xc0\x2a\xc0\xae\xe5\xa3\x9d\x7f\xff\x6a\xd1\xae\xfb\x9a\x3d\x12\x2c\x56\xb3\x73\xf6\x05\x3b\x93\x00\xcd\x7f\x95\xad\xe1\xf8\x79\x01\x10\x8c\xf2\xb0\x30\xa0\x57\x0f\xae\x70\x94\x63\x30\xdc\x9f\xc8\x91\x72\x78\x53\x9b\x31\x7e\x5c\xcc\x44\x57\x7a\xf9\x19\x38\x6b\x30\x1c\x5e\x61\x87\x78\x47\xe4\x0f\xaf\x60\xe7\xb2\xf8\x52\x6d\x45\x1f\x5c\x55\x69\x16\xe3\xc4\xa2\x98\x2c\xf0\xb6\x02\xc3\x5a\x4c\x7a\x7c\xb5\xc8\x79\xea\xf0\x2a\xdd\x74\xa3\x34\xe3\x89\x82\x12\xbd\x83\x56\x92\x46\xdf\xf9\xa5\x32\x5b\x89\x78\x06\x33\x42\x19\x66\x54\x98\xfe\x0e\xaf\xaa\x3b\xd8\x87\xb1\xb0\x60\x1b\x51\x55\x6d\x1c\xbe\xe7\xa9\xcc\x49\x10\x47\x1c\x5b\x8c\x92\x0a\x1a\x3e\xe9\x48\x55\xfa\xf3\xf8\x68\x2d\xe4\x92\x4d\xf7\xc3\xc1\x24\x17\xf7\x86\xea\xd0\xb7\x0c\xb1\xcd\x9e\x76\xc7\xc9\x95\xe5\x7c\xa2\xd0\x9b\x8c\xee\x7f\x7d\x37\xca\x5f\x80\x33\x2e\x24\xb0\x90\x1c\x2e\x51\xbb\xae\x34\x26\x61\x95\xf7\xf6\x7f\x09\x8f\x89\x53\x45\x2e\x8d\xb6\x5e\xb2\x89\xc6\x35\x4c\xbb\x46\xbf\x12\xa6\x30\xc9\x85\x49\xbb\x30\x59\x7d\xb4\x64\xca\x69\x82\x93\x12\xc0\x34\x07\x7a\x58\x1f\x92\x6a\x57\xae\x96\x33\x62\x58\xf9\xfa\x51\xba\xef\x68\x6b\x7b\x94\xf8\xcf\xa8\x33\xf9\xb9\xf1\x44\x0e\x93\xb3\x37\xb9\xde\x74\x3c\x61\xb7\x03\x5f\xe6\x7e\xca\xd1\x40\xef\x87\xb7\xac\x9e\x68\xd9\x3d\xc1\x8b\x90\x68\x65\x25\x7c\xef\x49\x12\x9d\xef\x11\x7c\x47\xfa\x68\xd2\x1d\x7c\x01\x1a\x96\x8f\x05\x2f\x4a\x77\x7b\x92\x7e\xb0\x5c\x8f\x0e\x52\x25\x54\xb5\x4b\x11\x4e\x58\x55\x0b\x77\xc6\x2d\x85\x4a\x56\x54\x4c\x37\xe2\x14\x6d\x0d\x55\x43\xcb\xae\x62\xef\x50\x1e\xda\x7a\xd7\xb1\xb5\x3a\x70\x12\xae\xa3\x89\x9b\xfd\x2c\x7e\xc3\x7c\xca\x04\x1a\x1a\x5c\x7c\x8d\x8b\x46\xfd\x11\x7d\x6e\xf4\x45\x95\xa4\xbb\x58\xb1\x53\x60\x77\x71\x50\x55\xd5\x3d\x66\x98\x34\xb5\x57\x27\x3e\x31\x5d\xdb\x92\xda\xd2\x24\x52\xa4\x4a\x94\x99\x93\xac\x16\x09\xfb\xc6\x36\x6f\x8d\x2d\x52\x5a\x8e\x55\xd1\x16\xb2\x5c\x5a\x06\x61\xbd\x49\xbf\x94\xe2\x9b\xcc\x2c\x0a\xe9\x54\x16\x9c\x5d\xcd\xd9\x34\xd4\x70\x4c\xd8\xde\xd8\x34\x93\x2c\x5f\x66\x18\x9a\xd4\x3f\xc9\x7a\x87\x54\x39\xe1\x30\xea\x25\xd9\x49\x35\x95\xae\x58\xb4\xa2\xbe\x9c\x55\xbf\x54\x76\x60\x6e\xdb\x77\xb0\x70\x0d\x16\xdb\xb5\x52\xeb\xce\x53\xad\x80\xa2\x34\xdb\x92\xdf\x29\xc9\x27\x36\xa3\x91\x48\x53\x6b\x03\x4d\x91\x42\x61\x41\x7f\x7c\xcb\xaa\x82\xb3\xb2\xcc\x9a\x50\xbe\x67\x54\x58\xb5\xd6\x54\x56\x1b\x43\x71\x5e\x1d\xda\xeb\x7f\xfb\x0e\xac\xce\x3f\xca\x1d\x2e\xf2\xd9\xf4\x3b\x4f\x51\x5a\x59\xe9\xfd\xdf\xd1\x36\xe8\x3c\xd9\xc0\x85\x24\x0c\x75\x65\xbe\xde\x08\xb0\x4c\x37\x96\x57\x72\xc7\x12\xd4\xba\x4c\x23\xe9\xfe\x3c\x6f\xcb\x9c\x3e\xc2\x27\xba\x23\x29\xc2\xfb\x9c\xb9\x1f\x85\xa6\x32\x99\xeb\xc8\xfb\xdc\xf2\x9f\x05\xbf\x30\x95\x34\x9a\xa8\x5c\xcf\x1a\x7a\x51\x67\x46\x4b\x52\xa5\xd7\x00\x57\x99\x05\x6e\x59\x44\xc5\xf2\x3f\xd3\xdd\x66\x09\xb8\xa0\x33\xda\x9d\x59\x3f\x55\xe3\x99\xcc\x2e\x9a\xa3\x96\x9a\x5e\x1b\x5b\x41\x33\xe5\x85\x2d\x96\x36\xda\x2f\x0d\x40\xb5\x46\xb3\xb2\xb0\x56\x14\x0f\xfd\x3a\xad\x79\x81\x4c\x8c\x7f\x8b\x3b\xf2\x53\x53\xd3\x12\x00\x78\xca\x6e\xa0\xe9\xbd\x3d\xb9\xec\xe5\x3b\xb9\x78\x7c\x6c\xae\xf4\x38\x8a\x72\x8b\xee\x15\xca\xe1\xa2\x07\x9c\xe2\x50\xdb\x92\x39\x73\x13\x51\xce\x5c\xf3\x52\xe4\x3b\x83\xf2\xcb\x39\x5b\x81\xb9\x9a\xe5\x3f\x18\x22\xbc\xf2\xc2\x45\x48\x98\x5d\x80\x24\x8d\x0a\xd5\x9a\x3c\x44\x87\x58\x16\x8c\x6a\xf4\x8e\x5a\x85\xdc\xb0\xb4\x06\x1e\x3e\x22\x1a\x1e\x59\x93\x56\xc0\x3e\x39\x26\x3f\x69\xec\x29\x19\xcf\x32\x8e\x60\x36\x3a\xd4\x83\x65\xde\xa3\xed\x58\x6a\x27\x3c\xf4\x13\x7f\x8b\x50\x2c\xd0\x27\xd9\x87\x1f\xec\xf0\xaf\xf5\x84\xa5\x47\xbe\x70\xaa\x0b\x16\xcc\x58\x66\x7a\xeb\xb4\xce\x4c\x73\x87\xd4\x6d\xd6\x57\xa1\xdc\x5c\x30\xbf\x74\x3a\xff\x53\x9c\x3b\x9d\xa7\x50\x7e\x02\xbd\xc2\x1c\x76\x89\x94\x20\x8c\xd2\x3e\xee\xea\x3e\x66\x9f\xbe\x16\x58\xb2\xca\xc1\x3e\x36\xad\x54\xf0\xe8\x9e\x8f\x52\x14\xcf\x49\xb4\x6a\x17\xfc\x39\xe4\xdf\xe9\xc9\xf6\x29\xe2\x29\xc4\x02\x45\x37\xe5\x3f\x28\x27\x79\x1b\x41\x37\x4b\x3d\xed\xb4\x49\x82\x88\xa1\xaf\x76\x30\xb1\x5e\x7a\xdd\x0e\x3c\x2c\x2f\x8b\x61\xf0\x84\xbe\x4c\x58\x3e\x52\xfa\x85\xb0\xd3\x7b\x1d\x5e\xfc\xa5\xe8\x08\xc8\x62\x34\xc7\x7f\xa7\x5b\x8b\x86\xf8\x6c\x41\xda\x56\x2b\x45\x22\x46\xc3\xa4\xf9\xcd\xa6\xa5\xdf\x50\xf1\x07\x9d\x85\xc5\xdb\x78\x50\xb6\x2d\x9c\xcc\x00\xb8\x1f\x79\xb6\x9e\x60\xe6\xf4\x8e\xa9\x88\x77\x36\x2f\x8b\xcf\xcf\x33\x60\x96\xaf\xc3\x3c\x9e\x7a\xf1\x99\x62\x88\x6e\xb0\x4a\xc4\xd0\x31\xcd\xc0\x5c\x91\xc8\xfe\xd2\x63\x32\x57\x54\x9f\x3d\x17\xf9\xcb\x19\xd3\x1b\xd6\x10\x94\xcf\xb3\xb3\x54\x75\x24\x11\x77\xc9\x13\x44\xfc\xbc\x35\x1b\x2b\x44\x68\x49\x7f\x1e\x8a\xea\x1c\xa5\x43\x36\x5b\x84\x09\xa2\xb2\x99\x58\xc0\x02\x8d\x2c\x31\x42\xe8\xb8\x42\x07\x16\xcd\xf3\x96\x4c\x3a\x5f\x68\xe7\xba\xc8\xb4\xc3\x5e\x9e\x1a\x9e\x80\x04\xcf\xc2\x58\x1c\xdf\xf1\xf3\x1a\x3f\x5a\x84\xce\x33\x3d\x65\x9e\x66\x09\xb5\xb8\x0f\x13\x6f\x67\x43\x78\xd1\x74\x75\x21\xab\xab\xae\x2e\xb6\x50\x70\xd3\xae\x7c\xbf\xfe\x42\x03\xac\xac\x18\xd2\xb9\x70\x90\xa6\xde\x71\x2c\x27\xaf\x5e\xc7\x2c\xfd\x74\x17\x70\xee\x79\x77\x18\xff\x9d\x4e\xaa\x26\x16\x2c\xcd\x1d\x84\xa8\x00\x96\x21\x8b\x54\x44\x2a\xbd\xc3\xe1\x25\x1b\xec\xda\x68\x3d\xad\xb5\x9e\xae\x44\x2a\x53\xbb\x9f\xad\x27\xa9\xc2\xa5\x2a\xa4\xcb\x7b\x14\x56\xf9\xbc\xbb\xee\x95\x1d\x17\x6a\x98\x55\xcd\xe3\x25\xfa\xdb\x5b\x68\xf6\xcd\x12\x35\x25\x66\x85\x87\xf6\x78\x2e\x5b\x06\x9e\xaa\xd7\x24\xb5\x28\xcd\x7a\x79\xda\x03\xba\x8f\xb9\x50\x8f\x0b\xbd\xda\xc9\x0c\x3d\x65\xa8\xca\xac\xb3\xbb\x9d\x1a\xa9\x0a\x82\x86\x3e\xad\x26\x05\x05\x88\xe7\x1c\xa7\x82\x38\x74\x0e\x45\xb1\xa2\xe8\xcc\x58\x33\x7d\x63\x51\x4c\x84\x1e\xc6\x23\xab\xc7\x34\xe6\x9f\x5d\x16\xf5\x9d\x88\x33\x4d\x4a\x0b\xe1\x7c\x5c\xa9\x96\xa1\x33\xc6\xda\x40\x19\x6b\x93\xa1\xc4\xba\x95\xda\xc3\x20\x0d\x9e\x39\x8a\x16\x0e\xfb\x8b\x07\x08\xd6\x60\x5d\xcd\x77\xc4\x70\x97\xea\x42\xd4\xe1\x60\x2c\xbd\x99\xb5\x98\x92\x9a\x0a\x7e\xb1\xe4\x9c\x97\x48\x82\xdb\x9b\x4a\x21\x37\xb0\xdc\x1b\xa9\x32\xdb\xe8\x21\x2c\x31\x9a\x72\xb4\x19\x95\x5a\x7e\x50\x07\x4b\x4f\xf7\xa2\x6e\xb3\xfb\xe4\xa2\xd9\x5a\x41\xd2\x32\x3f\xa2\x2c\xe9\xa2\x1c\xaa\x6a\x4f\x0c\xa1\x48\xe5\x82\x36\x56\xe8\x61\x6e\x1c\x53\x47\xb3\xa2\x1a\xb3\x35\x87\xf4\xac\x5b\x24\xf3\x85\x71\x30\x58\x28\x3b\x48\x90\xb1\x83\xa8\x65\x7b\xa0\x8c\x1f\xa6\x6d\xb5\x56\x05\x5e\x7d\x8f\xf6\x02\xdc\x1a\xcc\xfd\x4e\x86\xdb\x33\x3a\x0f\x6f\xc3\xa6\xd2\xee\x22\xe3\xbe\x98\xd8\x76\x68\xf6\xf3\x0e\x5a\x35\x25\x89\x2b\x7a\x47\xc2\xec\xf9\x7e\x6c\x56\xd4\x72\xc8\xda\xbf\x30\xe2\x23\x29\x81\xe6\xc7\x8c\x75\x08\xcc\x3c\xe7\x41\x64\x76\xa9\x2d\xa3\xd1\x8c\x9d\x5a\xef\x6f\x98\xb9\xbd\xa0\xac\xf6\x58\x0a\xcd\x2b\xc1\x3c\x3c\xac\x9d\x81\x39\x9c\x68\x52\xcd\xe0\x04\xa6\xaf\x66\x91\x5e\x02\x40\xb2\x3e\xd7\x6d\xb6\xf6\x17\x84\xda\xb4\x9d\xdf\x50\x28\xcc\xef\x27\x98\x7a\x80\x87\xad\x59\x5e\xdb\x6b\x9c\xe4\x18\xda\x17\x9f\x8f\xa1\x39\x1c\x62\x37\xaa\x64\x77\x35\x83\x8b\xb1\x59\xa9\xd4\x54\xfd\xe1\xe6\xc2\xe3\x80\x7f\x23\x4f\xaa\x6d\x58\x78\xd2\x28\x77\xd0\xc4\xc5\xa0\x45\x14\xa5\xe5\x17\x7e\x33\xcb\xf7\xcc\x09\xad\x04\xaf\xa1\xc6\x2b\xe9\xb2\xa1\x41\x6f\x16\x33\xa3\xfd\x26\x5e\x14\x66\x7a\x1e\x6a\x94\x14\x6a\x2d\xde\x36\x60\xc7\x6e\x68\xf5\x38\x48\xa2\x1b\x61\xef\x16\x27\x9e\x3e\x1d\x38\xb8\x76\x9a\xca\x35\x29\x6c\x20\xdc\xf4\x10\xad\x15\x38\x5e\xea\x82\x59\x9e\xca\x9d\x18\xe6\xd0\x66\xde\xa1\xe8\x34\x2d\xb3\x43\xda\x2f\x97\x0b\x09\x00\xb7\xa6\x2c\xdb\x50\xc4\x6f\x09\x70\xfe\xbf\x42\x00\xd3\xd4\x05\x84\xf8\x4d\xc3\xb1\xbb\xee\x2d\x6c\xfd\x02\x43\xcb\xd7\xc5\x3d\xde\x92\x33\x3d\xde\x92\xbf\xef\xf1\xcb\xa4\xc1\xff\x05\x3b\x5a\x16\x98\x19\x96\xfc\xad\x1f\xd0\x98\x47\xb5\x51\xad\xd4\x74\x51\xcd\x2a\xf1\x09\xec\xc4\x5a\x0d\x3d\x71\x80\xd2\x1c\x9d\xd4\x7b\xf7\xd8\xc6\x66\x3f\xfa\x92\x5b\x76\x0a\x82\xd6\x03\xe3\xbf\x5d\x0f\xb4\x7c\x96\x92\x3c\xdf\x84\x61\x66\xc2\x31\xe9\x3c\x4b\xa9\x49\xdc\x59\xa0\x0c\x08\x45\xa5\x6a\xd6\xcd\x45\xef\x1c\xfa\xe9\xe4\x4e\xc5\xe7\xf5\xbc\x7e\x59\xec\x05\xff\x93\x32\x1a\x27\x38\xca\xa6\xca\x78\x4a\xe5\x34\xf3\x29\x40\x19\x6b\xe7\x69\xe5\xb6\xf1\x8d\x97\x20\x4e\xf5\x09\x05\xd9\x80\x85\xa1\x02\x3b\xfe\x7d\x9d\xb4\x90\x49\xab\x24\xdd\xe5\xf0\xe7\xbc\xd6\xc4\x9d\x3e\xa6\x4e\x9f\x69\xf1\xcc\x4e\x7d\xe2\x15\x15\xa8\x55\x66\xe3\x34\xc0\x96\xe4\xca\x8a\xcf\x74\xb4\x77\x51\x89\x9a\x71\x6f\x41\x45\x9c\x4d\x59\x67\x7c\xa2\xb7\xe5\xa3\xbd\x60\x09\x38\xd3\x10\xcc\x77\xbf\xd5\x8a\xc6\xa9\x56\xf4\xfc\x77\x44\x01\x6f\x79\x9e\x9a\xa7\x35\x9b\xdf\x5d\x28\x23\xf0\x25\x85\x16\xa0\xad\x60\x93\x25\x15\x0a\x78\xef\xa7\x83\x6a\x29\xbb\xbd\x33\xee\x50\xb1\xaf\xdf\xa9\x83\x1d\x1a\x31\xcb\xb1\x12\x32\x82\xd5\xa0\xa4\x1e\x3f\x21\x6d\x35\xab\x36\x84\x20\x31\x0f\x26\x0e\xc1\x51\xce\xa4\x60\xe5\xc9\x09\x14\x40\x7c\x57\xf9\x1a\x0d\x78\xc3\xfb\x39\xfd\x85\x4b\x8e\xdf\xe1\xdf\x47\xa5\xb6\x3e\xb9\x61\x05\xea\xaa\xbd\x26\xb5\x95\x36\xed\x18\x1f\xb8\x6f\xa1\xf0\xfc\xb8\xd8\x17\x37\x71\x0b\xea\x15\x48\x40\x71\x0a\xdf\xef\x94\x48\x1f\x8d\x9b\x80\x45\xef\x77\xc4\x4f\x3b\x1e\xfd\x26\x9e\x6e\x8f\xf4\x7d\xa4\x0a\xbd\xe9\xb8\xb7\x1d\xf7\xae\xe3\x3e\xcf\x1c\x21\xec\xa4\xa8\xd8\x15\x3d\x3c\xb0\xf9\x9c\x1d\xff\x3b\xde\x6e\x9c\x9f\x76\xdc\xe5\xa3\x21\x29\x79\xcb\xd4\x4a\xf3\x7d\x7c\xba\xec\xb8\x9b\x49\xfa\xf9\x28\x0e\x71\xff\x46\x02\xf1\x29\x72\xdc\xad\x24\xf9\x83\x0c\x3a\x83\x65\x6c\x1b\x72\x44\x63\x08\xe7\x77\x77\x59\x5f\xb3\x89\xf8\xfc\x6f\x0a\x72\xdc\xba\x2e\x69\x36\xa3\x2b\xa4\xf0\xea\x9d\x95\x15\x9d\xfb\x60\xe0\xc7\x38\x95\xea\xfa\x14\x8f\x06\xba\xbb\x1d\x8f\xc2\x34\x50\xa4\x28\x0e\xbb\x62\x82\x6b\x43\x1e\x1e\x8e\xaa\x37\x5c\xe2\x2e\xf2\x88\x80\xd4\xd5\xdb\xe4\xfb\x32\xc6\xbe\xe4\x5d\xf2\xfd\x39\xee\x4f\xef\x28\x86\x88\xe7\x2d\x2d\xa1\x50\xae\x0e\x81\xa2\x18\x0e\xf5\xd5\x45\x38\x8a\xb2\xfc\xb5\x5c\xd6\x9b\x53\x1f\x3a\x1e\x75\xe5\x07\x85\xd9\x07\x2a\x65\xb3\x1f\x8e\x68\xf6\xa2\x64\x2b\x32\x3e\x6e\xe3\x8e\x93\x99\x38\x11\xda\x66\xc5\x40\x8a\x64\x63\x49\x9d\x42\x4b\x35\x67\xd1\x88\x64\xb3\xa2\x66\x45\xe5\x8e\xbd\x97\x31\xb5\xa8\x5c\x47\xae\x0f\x26\xf9\x49\x75\x50\x3f\xc3\xdc\x99\xda\xee\x3d\x13\x53\xbc\x51\xed\x70\x47\x4a\x31\xce\xc3\xdb\x72\xab\x53\xf3\xbd\xb5\xd1\xcd\x8f\x4a\xbe\xf1\xef\x1f\x0e\x8e\x89\xe5\x7f\x38\x0f\x55\x67\xad\xb2\xc9\x49\x3f\xfc\x7c\xad\x82\xab\x0c\x1f\x46\x37\x4e\xa3\x92\x6b\xce\xc1\xa1\x73\x68\xd5\xb7\x76\x29\xfd\x4f\xf1\xe4\xc7\x5a\xfe\xc7\x59\xc1\x59\x73\xaa\x6a\x88\xe6\xb1\x41\x85\x23\x38\xd3\x8e\x03\x6d\xbc\xdc\xac\x1c\x25\xa3\x75\x53\x65\x65\x02\xb8\xfe\xfb\x2e\x04\x81\x53\x4b\x0e\x10\x55\xc4\x23\x96\x79\xd4\xd1\xf6\xf1\xdd\xfd\x8e\x25\x73\x28\xb1\xc1\x97\x05\xa8\x00\x1c\x21\x3f\xc6\xf9\x3d\xb8\x86\xdb\xbb\xe7\x76\x16\x54\x2a\xa5\x78\xef\xa9\x43\x8c\x91\x34\x54\x77\x29\xd6\x8b\xc0\x4a\xd4\x74\xc6\x09\x27\xf4\xa8\x5c\x1f\x1a\xc6\x28\xaa\x75\x04\x4a\x2e\x97\x9c\xca\x6b\x47\xf7\x49\x8a\xd6\x27\xdb\x70\x78\xe7\x05\x8a\xc8\x95\x92\x5a\x5a\xdf\x7b\xea\xaa\x13\xbf\x52\xa2\x59\xfa\x13\xcf\xd2\xbf\x91\xb6\x9f\xf4\x0a\xfe\x4e\xad\xd1\xef\x1d\xdb\xe4\xf3\xb9\x33\x6b\xf1\xf1\x6b\x4b\xa5\x0a\x86\x00\x2d\x81\xee\xe8\xb3\x78\x47\xaa\x02\xd5\x49\xa1\xfb\x8a\xbd\x09\x72\xd0\xc9\x78\x6a\x14\xef\x56\x7d\xb8\x77\x51\xe8\x9e\x42\xf7\xa6\x5f\xda\x8d\x9f\x38\x28\xfe\x22\x28\x84\x2f\x42\x8b\x8e\x87\xd9\x9a\x35\xa6\xa6\x18\x5d\x88\x05\x7f\xf4\x14\x7c\x41\xc3\x17\x18\x7e\xb4\x68\xb2\xbe\xf3\xda\x8d\x7b\x5f\xdb\x1e\xef\x1c\x43\x46\x2b\xf2\x3e\x63\x60\x24\x0a\x8d\x9f\x2a\x67\xb2\xa0\x98\xc9\x53\xa5\x3c\xbb\x7c\xaa\x98\xfa\x82\x62\xea\x4f\x15\x23\xfd\x39\x53\x62\x66\x22\xfb\xd4\xa9\xe9\xd2\x0a\xe8\x08\xdd\xd1\x08\xdf\xc3\x23\xd3\xa4\xb8\xd7\xea\xd8\x4a\xde\xa4\xfb\xce\x6c\x4d\x87\xf3\x46\x4b\xd5\xbf\xd7\x9a\xe5\x84\x42\xf7\xee\x85\xa7\x43\xf7\x2f\xd2\x2d\x15\x5d\x48\xba\x31\xab\xfb\x6c\xa8\x27\x52\x9a\x9a\xcf\x44\x72\xb9\x42\xba\xc3\xf8\x3b\x26\x6c\x8c\xb0\x1b\x47\x7f\x71\x7e\x66\x93\xc3\x9b\x4d\x30\xe2\xa5\x77\xfc\x77\xac\x7f\xac\x58\x9f\x32\x33\x49\x28\x63\x86\xf9\x4f\xed\xa1\xac\xbc\x92\x50\x9d\x2b\x18\x90\xe6\xe1\x91\x7c\x4a\xcf\x21\xb0\x17\xba\xc8\xc7\x27\x14\xc0\x25\xa5\xb8\x8e\x30\xf8\x61\xad\x98\x01\x32\x34\x49\x99\x90\xca\x74\x52\x02\x59\xf1\x9b\xcd\xb9\x7e\x9a\x65\xcf\xb4\xb4\xc9\xe2\xc2\x26\x4f\x97\x35\xcb\xa3\x69\x59\xf5\xc5\x65\xd5\x9f\x2e\xeb\xd9\x3f\x60\x20\x53\xbe\xa1\xa3\xc5\x15\xba\xd8\x17\xc1\x6c\xb9\x6c\x0b\xa2\xde\x58\xda\xec\x3c\x3c\x90\x08\x7e\xeb\xb8\x6d\x7c\x6e\x91\x00\xe6\x38\x48\x62\x8e\x7f\x78\x40\x1c\x09\x76\x5c\x4b\x5d\xa4\x19\xd6\x8d\x09\x10\xc9\x4b\x14\x19\x92\xa2\x71\xc5\xdf\x0f\x0f\x3f\xe9\xff\xf5\x8e\xb5\xef\x6f\xb3\x83\xa8\x81\x81\xce\x3b\xf9\x0b\xd6\x09\x2b\x9d\x90\xd6\x4b\x79\xfa\xeb\xa9\x78\xdb\x7a\x60\xe7\x53\x96\x22\x12\xf4\x3d\x3e\xb4\x5f\xb1\x1c\xf5\x2e\x67\xb7\x61\xbf\x76\xf2\x52\xb8\xb3\x4e\xd8\xdf\x32\x72\xd5\x7f\x78\x90\xa9\xbb\x65\xe3\x5b\x88\x9b\xae\x1a\xa7\x3e\xee\xb6\xfa\xc6\x07\x7d\x0b\x54\x8b\x2a\xe9\x58\xba\xd9\xa3\x06\xdf\xe7\x8b\x32\x3e\x21\xaa\x44\x3e\x1b\x9c\x29\x93\xfe\x2e\x2a\x13\xdb\x61\x5a\xd5\x4b\xad\x06\x5f\x3b\xa9\xab\x9b\xf0\xc2\x87\x07\x01\xff\x43\x1a\xb5\x4b\xde\xb1\xac\xf9\xea\xd0\x62\xe5\x88\xaf\x9d\x52\xb5\x08\x94\x8f\x79\xfa\xe1\x21\xb0\x4c\x61\x68\x88\x5f\xc8\x07\x35\xaa\x39\xa0\x39\x5d\xdd\x3b\x85\x79\x27\xf3\x60\xcc\xb6\xb9\xc2\x94\xaf\x11\x7b\x22\x2d\xaf\x16\xeb\xfe\x8c\x7d\x41\x7a\x25\x75\x4c\xac\x0a\xff\xee\x48\xed\x8d\xd2\xfa\xb7\xd5\x18\x87\x4d\x65\x5e\x81\x4d\xbd\xe5\xc0\x90\x0e\x9f\xf0\xd4\x68\x90\x98\x55\x61\x01\x8b\x02\x76\xd5\x3e\x96\x0a\x47\xab\x16\x5a\xe8\x63\x8d\x6f\x97\xde\x6a\x7c\x24\x55\xc0\x5c\xdb\x02\x8b\x9f\xba\x66\x8a\xd4\x7e\xfe\xca\xaf\xfd\x18\x17\xd6\x1c\xb5\x17\xfb\x4f\x30\x48\x69\xff\x5c\x77\xed\xd9\x15\xac\xd1\xc9\x02\x85\x8f\x7b\x79\xde\x6e\xbb\x86\x07\xc2\x1a\x77\x4d\xac\x2e\x28\xe2\xdc\x17\x35\xfd\x04\x15\x3e\x83\x00\x37\x8d\xe1\x0e\xcb\x5d\x3c\x4d\x56\x61\x87\x89\x8e\x84\x8e\x78\xdb\xcc\x53\x00\x86\x6f\x02\xbd\xc7\xfa\xe4\x1a\xd7\x0b\x70\xe8\xbb\xcf\x56\xd0\xdb\xa6\x5a\xb5\x08\xbe\x6b\x4d\x9f\xa5\xef\x40\xb5\x0a\x64\xb7\x6b\x6e\x59\x5f\xc6\xc7\xb1\xfa\xc0\x0b\x0e\xdd\x2e\x2e\x58\x4f\x52\xce\xd4\x07\xa5\x0c\x90\xd0\xaf\xe0\x96\x59\x8a\xec\x2f\xbb\xd1\x88\xfa\x51\xdd\x7c\x5b\x59\xe6\x8f\xad\x81\xba\xd6\x4e\xdd\xd8\x59\x39\x6d\xb9\x3d\x71\xa7\x9e\xdd\xa8\xe0\x62\xcc\xcf\xfa\x05\x0e\x5c\xb4\x58\xb9\x69\xbb\x78\x45\x86\xcb\xa4\x80\x2a\x13\x9d\x50\x39\x6c\xbb\xd3\xb1\xec\x89\x61\x05\x2f\xf3\x1c\x88\x21\xae\xb2\xef\xc6\x2d\x02\xbc\xd9\xc4\xef\xb2\xcb\x97\xec\x55\xbe\xb4\x2d\x25\x91\x6f\xd0\xe1\x8b\xeb\xa0\x4e\xe3\xd7\x28\x71\xa2\xd1\x0a\xe0\x41\x71\x9e\xaa\xd9\x7a\xda\x11\x8d\x4f\xd8\x76\x6d\x3c\x0f\x9b\xf6\x0d\x2b\xd2\x36\x39\xd7\x3b\x70\x71\xa7\xb2\x96\x54\x59\xe7\xb8\xf9\xce\x14\x49\x7f\x6d\x6f\x95\x6e\x46\x34\xf1\x83\x67\xfc\x92\x08\x6e\x73\x46\xa6\xad\xb0\x59\xf1\x2d\x59\x13\x74\x67\x64\x4d\x8f\xaa\x86\xb0\x59\x70\x2e\x07\x49\xb6\x98\xa0\xb1\x8e\x6b\xf0\x48\xbd\xe6\xfb\x14\x5a\xd0\x62\xf9\x1e\x81\xc6\x36\x30\x0c\x1b\x7b\x4d\x3e\x27\xd5\x68\x47\x2e\xad\x28\x39\x1a\x02\x04\x36\x60\x21\xdc\x7a\xac\x20\x1d\x77\xaa\x06\x09\x67\xf8\xc5\xe9\xa1\x49\xdf\xd3\xc9\x66\xef\xab\x7a\xa5\x36\xb8\xaa\x7a\x97\x4f\x12\x44\x35\xf4\xe4\x23\x67\xeb\x45\x7c\x59\x20\x5f\x8f\x70\xe4\x3c\xc2\x36\x7e\xc6\xa7\xaf\xaa\xc0\x4b\x2d\xa5\x7b\x3e\x5f\x6e\x55\xe9\x58\x5f\x9c\x61\x2c\x49\x7c\xd3\x70\x09\xf8\xf4\xe3\x3a\xef\x1a\xad\xac\xf4\xb9\xd1\x01\xd1\x68\x7d\x91\xb7\x9a\x4a\xd6\xb2\x2d\x75\xd1\xe1\xeb\x2d\x70\x74\xec\xba\x89\x6a\x03\x8c\x86\x1d\x75\x0e\x0c\x22\x1c\xbb\x22\xb3\xbb\x48\x11\xef\x22\x55\xbb\xca\xbb\x7f\x29\xec\xd2\x6f\xed\x7b\x7e\x40\x15\x50\xa0\x75\x45\x7f\x2b\x11\x8d\xf6\x8a\xa4\x90\x6d\x2b\x97\x76\x9f\x4b\xd5\x62\xdb\xc4\x17\x75\xb5\x91\x9f\x2f\x98\xe8\x84\xd6\x21\x09\x7d\x17\x07\xb1\x54\xd0\xd4\xf7\x71\x7c\x10\xa2\xa2\x2e\xe6\x30\x81\x7d\x13\x18\x46\xea\xf7\xa3\x89\xf8\x64\x02\x87\x26\x70\x6c\x02\x3b\x1a\xf6\x8b\x89\xa8\xeb\x88\x0b\x13\x71\x69\x02\xdf\x4d\xe0\xb9\x09\x48\x5f\x07\x22\x13\x10\x26\xd0\x32\x81\xb6\x09\x9c\xea\x82\xcf\xf5\x6f\xc7\x24\xf4\x4d\x60\x9c\x5c\x31\xb2\x64\x4e\xe9\xd9\x4e\x57\x43\xc3\xd6\x82\x6f\xb2\xb2\x0f\xa2\x75\xf5\xde\x26\x41\x5c\x28\xdb\xa4\x6b\x1f\xae\xb2\x9c\x9a\xba\x19\x67\x81\x2a\x4c\x8b\x17\x7e\xb3\xea\x08\xbe\xfe\xca\x2e\x34\xd6\x85\xfa\x8d\x2b\x5c\x77\xc8\x3f\x8d\x5d\x5f\x6f\x3b\x59\xa7\xb5\x7e\x03\xd7\x08\x03\x5b\x5c\x74\x32\xa3\x1e\xb3\x27\xc1\xd6\xf8\x2f\x57\x4f\x93\x34\xcf\xc8\xa9\x7c\xb1\x33\xb4\x31\x6e\xcd\x65\x9c\xa2\x71\x1f\x22\x2b\xfd\xad\x60\x97\xa2\xf1\xdd\x6f\x2e\xb2\xbb\x95\x3d\xc5\x4b\xf6\x09\x9d\x9e\x5d\x6a\x52\x60\x91\x5f\xa0\xd3\x13\x30\xbf\x1a\x54\x5b\x10\x57\xb9\x46\x2f\x80\x66\x56\x81\xd7\x32\x39\x66\x06\xfb\xb5\xe1\xdf\x2a\xdf\xa0\x14\xa6\xde\x65\xf6\x05\xa2\x36\x0e\xfa\x1a\xc3\xd2\x3b\x85\x6a\x3a\x68\x17\x00\x25\x0d\xb2\xde\x4f\xec\xa6\xdb\xd0\x34\x7c\xae\x40\xa7\xa5\xfc\xa6\xd2\x1a\x43\x1e\xa5\x14\xf0\x11\x80\x4f\xfa\x97\x0f\xba\x41\xd4\x01\xf6\xa2\x2b\x93\xe6\xb0\xf1\xc1\xc8\x65\x13\x99\x1e\x10\x01\xe3\x50\xb7\x25\xb3\x44\x57\x29\xc3\xd9\xee\x1b\x76\x13\x37\x11\x01\x33\xa2\xbe\x60\x20\x1d\xda\xbc\x34\x82\xb8\x57\x36\x46\x60\xbf\xf8\x02\xcc\xd1\x6c\x96\x2b\xf4\xc2\x88\x59\x76\xa5\xfc\x46\x59\x8e\x61\x55\x11\x4b\x9e\x5f\x25\x4d\xc5\xb7\xb1\xf3\x71\x7d\x65\x4a\xaf\x91\x19\x48\xc0\xcb\xba\xbe\xa0\xa4\x14\x3b\xbb\x2e\x53\xc5\x7a\xad\x8c\x9b\x10\x28\x9d\x15\x6f\x56\xcc\x39\xff\x5b\x2f\x23\xab\x14\xcc\xdb\x99\x56\x96\xe1\x28\x71\xa4\x6e\x69\x12\x68\x2e\x8f\x14\x13\x81\x2f\x33\x57\x99\xde\xa5\xf9\xca\x90\x4a\xab\x8e\x61\x8a\xd3\x80\xcf\xb5\xd1\xdf\xaa\x39\x82\x45\x25\xf0\x19\x2c\xab\xcd\xd2\xf3\xa2\xda\x58\xb7\xb4\xb2\x44\x25\x50\x6f\xe0\xa6\xb3\xda\x6a\xf9\xc5\x24\x89\x0f\x39\x3e\x62\xdf\x09\x8a\x84\x53\x44\x25\x8f\x1b\x24\xa8\xf8\x8a\xc4\x5f\x67\x35\x1f\xd6\xb8\xba\x4a\xc4\xdf\x8f\xa1\xc7\x42\x86\x66\xb0\xb0\x31\xe1\x1b\x08\x83\xa2\xba\x5e\x18\x0f\x4c\x71\x4a\x63\x4a\x02\x60\xa9\x04\xc7\x6b\x03\x13\xda\x30\xd4\xd7\x61\x02\x63\x66\xab\xa2\xbe\x81\x9f\x1f\xef\x14\xa3\xfb\xe3\x41\x4c\xf2\x0b\x57\x0e\x3e\x0f\x9a\xc5\xb3\xf3\xcd\xd3\xf3\xff\x9c\x1f\xfd\xa7\x7e\xb8\x03\x27\xf2\xb4\x3f\x27\xd9\xf9\x5e\x31\xa6\xba\x6d\xd5\x4f\xfb\x25\xdd\xcf\xc2\xf1\xa6\x2b\x68\x29\x41\x95\xef\xbe\xb5\xa8\x06\x82\x65\x3d\xa1\x0d\x09\x2d\x2f\x0b\x9f\xe7\xee\x2b\xa2\xbf\xa3\x6a\x11\x69\x2d\x49\x8f\xa7\xdb\xf2\xf6\x6a\xca\xb0\x4b\x4d\x90\x4a\xb4\x19\xb0\x7e\xf4\xd9\x1e\xf2\xd7\xe9\x90\xb9\xd0\xfc\xe1\x88\xa2\x75\x57\x34\xd5\x6e\xf6\x92\x5f\x1a\xde\xd3\x0f\x7d\x27\x09\x2c\x9f\x56\x56\x38\x1d\x37\x64\x01\x46\x4b\xa7\xc6\x4e\xd0\x5c\xca\x0a\x7d\x8e\x73\xaa\xd7\x5a\xae\x41\xba\xf3\x39\x09\x9e\x2b\xb4\xc7\x96\xea\x70\x9e\x78\x02\x56\x10\xd2\x8b\x8c\xec\xb3\x55\x53\x69\x7c\xe2\xb7\x0c\xf2\xc9\x56\x6b\x72\x49\xba\x76\xd9\xe0\x22\xcd\x95\x62\xac\x80\xe8\x17\xa4\x99\x41\x88\x2f\xac\x13\x04\xfd\x8c\xbc\xbb\xc9\xf6\x77\x23\xe9\xbd\x89\x56\x12\xe1\x15\x45\x4b\xbf\x52\x62\x1c\x4e\xb2\xde\xce\x65\x4d\xf3\x94\x17\xe9\x4d\x49\x72\x98\x1c\x2f\x20\xf2\xf1\x11\x69\xa1\xc9\x28\xf4\xb1\x17\x16\xcf\xf9\x40\xfb\x0f\x61\x4f\xc4\xca\x9c\xba\xc7\xe9\x39\x21\xf5\xac\x03\x2a\x77\x58\x6c\xa8\x47\x67\x2a\x65\x97\xdf\x92\xa1\xdf\xbd\xfa\xe6\x0e\xfd\xa8\xa7\x7d\x28\xa0\x5e\xb5\xa9\x94\x1f\xdd\x7b\xc0\xef\x1f\x7c\xa8\x8c\xa5\xbb\x75\x4a\x5a\x83\xa5\xde\x4f\xcd\x84\x5c\x0b\xd5\x29\xfa\x4a\x9e\x03\xab\x65\xd2\x0b\x1a\x17\xb8\x42\x38\xc8\x58\x80\x6f\xcc\x7a\xa0\x68\xbf\x7e\xc7\xdd\x70\x16\xa4\x1b\x65\xba\xed\x58\xc5\x8e\x87\x32\x88\xa3\x58\x5a\x1b\xd0\xb7\x49\x21\xe6\x6a\x74\x93\xef\xda\xcc\x6e\xc8\xfb\x72\xfd\xaf\x37\x1b\xef\x6d\x69\x7c\x67\xd4\xbe\x18\xf3\xd6\x38\x61\x7a\x4f\x3f\x47\x8d\x17\x07\xf4\xd5\x45\xb8\xed\xf0\xe1\xc7\xe8\xe1\x47\x1f\x57\x15\x8d\x64\xe6\xd2\x49\xea\xcb\xfb\xae\x3e\x21\x8d\x03\x18\xbe\xd1\xae\xcd\x3d\x7d\x6b\xb9\x1f\x77\x9b\x3b\x39\xfb\x36\x45\x44\xf0\x15\x88\xd5\x04\x08\xf7\x83\x97\xb6\x54\x24\x61\x04\x07\xb5\x24\xbf\xbe\x89\x91\xa0\x97\xbc\xb1\xb4\xae\x00\x5c\xfb\xf7\x8f\xf1\x8b\x35\xf7\xc8\x59\x74\x7d\xda\xcf\xae\xed\xd5\x9f\x20\x59\xb6\xf8\x5b\x63\x9a\x6e\x4e\x75\xad\xcd\xfc\x25\x1a\x97\xb4\xa6\x27\xaa\x10\x97\x38\x8e\x3d\xf0\x03\x3e\x61\x9a\xdc\x36\x86\xab\xf0\x9c\x85\xb4\x3a\x32\x27\x4e\x15\x8c\x25\x29\x54\xc9\xc4\x4f\xca\xe9\xe5\x1e\x5b\x05\x88\x6c\x5a\x5e\x29\x16\xa7\x27\x98\xb9\x86\x8f\x2d\x3d\x24\x19\xfd\x62\xf6\xfe\x66\x35\x78\x6c\x47\x83\xd4\x29\x25\x64\x23\x82\x75\xf7\x36\xc7\xd4\xf9\x5e\xee\xd1\xef\xb2\xa4\x43\x28\xa5\x75\x66\x41\xba\xd9\x9d\x39\x74\x93\x4c\xa1\x63\x94\xd0\xf5\xa1\x28\x95\x1e\xc1\x30\xd6\x4d\x5a\x09\xed\x03\xdd\xf9\x98\x9f\x93\x03\xe4\xd6\x68\x4f\xcf\xd2\x69\x28\x6c\x56\x3f\x5a\xa3\xc5\x3a\x05\xda\x9d\x39\xd0\xc3\xda\xef\xb5\xdf\x4c\x4f\xf3\x2c\xce\x78\x9e\xfa\x48\x5c\x47\x7c\x3b\x34\x6f\xc7\xc0\xf2\xf5\x78\xe9\x9d\x6b\x8f\x86\x58\x78\x67\x1d\xfa\x6d\x3d\xe9\xd9\x70\x1d\xb1\x53\xc3\x22\xd7\x62\x65\xe1\xd3\x50\xa9\x99\x0f\x1b\xb7\x67\x4f\x38\x5d\x2a\x3b\x1c\x75\x99\xca\xc4\x4e\x0c\xd1\xc6\x3f\x87\xbd\xba\xf5\x9e\x03\xdf\xab\x4c\x96\x99\xd5\xbd\xce\x60\x2f\xf1\x29\x4b\xe6\x31\xe9\x45\xcd\x31\x0d\xd1\xcb\xcb\x24\x8b\x79\x56\xfb\x77\x79\xac\x99\x0d\x12\x92\xf2\xca\x96\x98\xc3\x51\x69\x11\x06\x3d\xe9\x2d\x2d\xe1\x8e\xcc\x46\x27\x9a\x3d\xb5\xe0\xab\x03\x0b\x7c\xe0\xbd\xb6\x43\xab\xc6\xba\x60\xe5\x88\xbe\x7f\x72\x28\x31\x01\x90\x3e\xdd\xd8\x16\xa2\xa9\x0d\x6f\xc8\x2c\x94\xcd\x4d\x7b\xa2\xa9\xc1\x29\xf8\x68\x59\xc8\x6d\xbb\x89\x9c\xaa\x7a\xc0\x5f\x97\x61\x5d\xcc\xa9\xa6\x75\x5e\xa4\x58\xbe\x84\xdb\x5d\xfb\xb2\x19\xe3\xf2\x7b\x1d\xb1\x22\xa7\x27\xe2\xcd\x4e\x4d\xdd\xb1\x79\x15\x15\x70\x92\x59\xdd\x8a\xcc\x45\x39\x15\x4e\x50\x6a\x3a\x69\xa7\x01\xd6\x5c\x70\x70\x44\x33\x52\x30\x25\x93\x95\x47\x53\xa8\x69\x6f\x1e\xdb\xdd\x1d\x89\x16\x7e\xa1\x32\x2a\x15\x24\x54\x2a\x05\x67\x24\x34\x16\xdc\x0a\xb0\x93\x59\x34\xa2\x97\xb4\xb5\xea\xf1\xb2\x78\xb2\x35\xbf\xdf\xab\xfb\x25\x21\xc6\x22\xd3\x92\x35\x5b\xd6\x2d\xe9\xcc\xc4\x10\x1e\xac\x5a\x3e\xba\xc4\x9f\xc9\xeb\x23\xaf\xbd\x3f\x9b\x2c\xab\x08\xb0\x25\xbf\xa9\x57\x50\xa1\x5e\x7d\x20\x15\xcf\xec\xe8\x35\x3e\xb3\x0f\x2f\x45\xd1\xf2\x56\xc5\x29\xf8\xaf\x0a\x9e\x75\x40\x02\xc9\x14\x82\x48\xe4\xa0\x46\xde\xec\x2e\x62\x59\x48\x94\xec\xa0\xb2\x9e\xc9\xf7\x86\x52\xb0\xe3\x05\x47\x79\xad\x2e\x25\x1f\x06\x5e\x1b\xbf\xe2\x3f\x5e\x8c\xdf\x33\x12\x1a\x57\x08\xa8\x77\x72\x79\x68\x74\xf0\xfd\x35\xf2\xba\xf8\xed\x1f\x7a\x3d\xfc\x86\x07\x5e\x88\xdf\x8f\x5d\xe1\xf5\xbb\xca\xed\x67\xd8\x85\xcb\xca\xd7\xa1\xf0\xae\x91\x74\x33\x5a\xe0\x11\x8d\xf5\x23\x0c\x36\x9e\x37\x88\xd0\x1c\x0e\xd6\xd3\xe0\xd7\x34\x78\x96\x06\xaf\xa3\xda\x12\xad\x07\xd9\x86\xbd\xc4\x9a\xc9\xc3\x03\xeb\x16\x4e\x85\xbf\x56\x56\xd4\x17\x6f\x44\x93\x78\xc6\x0c\xd1\x18\x11\xfb\xd4\xf8\x27\xef\x54\x7e\x69\xa3\xaa\x68\x7c\x27\xaa\x2a\xfb\x27\x29\xdb\x24\x6b\x69\xce\x4a\x94\x18\x2c\xb6\x37\x9b\xea\x77\x44\x3d\x43\x0a\x83\x75\x6a\x23\x9d\x0d\xa4\x75\x5b\x40\xbd\x53\x9b\xfa\xa2\xb2\xd5\xa9\x05\xf4\x43\xf5\xdf\x04\xa2\xf2\xb3\x53\x3b\x8c\x66\x16\xbe\x5b\x33\xb9\xfa\x82\x73\x5d\x09\xce\xd5\x11\x9c\xab\x4b\x3f\x9c\x2d\xad\x6d\xd7\xd2\x36\xb9\x6b\x27\x83\xa1\x27\xaa\xe7\xc9\x1e\x63\xf5\x40\x07\x49\x24\x7c\xd7\xc1\x10\x67\x5d\x76\xbb\x6a\x26\xe8\x2d\x7a\x89\x83\x77\xa1\x82\xb0\xb9\xca\x81\x0f\xc4\xfe\xbe\xff\xa4\x8b\x57\xe3\x20\x50\x80\xa8\xfc\xd1\xf9\xdd\x76\x24\xa1\x6b\x00\x5d\x53\x87\x6b\xca\x70\x75\x65\x7f\xe7\x2a\x46\x13\x61\x2d\x63\x87\xd8\xed\x52\x57\x7e\x68\xbe\xf7\x74\x01\x7c\xcf\x60\xd8\x7c\xe7\x99\x2a\xa0\x81\x52\x95\x0a\x00\x21\x40\x50\x8d\x1a\xe2\x00\xf6\xe6\xe2\x9d\x9d\xbf\x78\x97\xcd\x7d\x9f\xc9\x5b\xbc\xb7\x72\xaa\xc3\x14\x24\xf8\xef\x86\xa2\x1f\xce\xc8\x7e\xf4\x0b\x6b\x31\xb5\xa4\xe1\xab\x1e\x23\xe3\x9e\xdb\x3b\x7e\x54\x4d\x81\x91\x76\xdc\x03\x3b\x9e\x2a\x28\x30\xaa\x8e\xfb\xdd\x8e\xff\xd0\x5c\x45\x93\x1d\xb3\xb9\xad\xca\x9d\x2f\xd3\x5f\x50\x5e\x30\x5f\x56\x38\xb3\x8d\x99\x32\xd8\x07\x3d\x05\x7c\xc7\xc4\x61\x76\x88\x3f\xe0\x66\x19\xd4\x5e\xe5\xa6\x78\x3a\x9e\x9b\xe5\xe3\xaf\x03\x0e\x14\xfa\x8a\x5d\x6e\x17\x65\x40\xeb\x98\x1f\xd3\x04\xf4\xba\xcf\xcd\xb3\xef\x80\xe8\x66\x37\xc3\xa9\xa6\x77\x9e\xaf\x7a\xc2\xe7\x0f\x61\x75\x2a\x92\x0e\x60\x29\xf2\xd5\x17\x17\xfa\xf8\x6c\xa1\x17\x04\xe3\x9a\xba\x3c\x18\x44\x67\x77\x9b\x13\x44\x67\x13\x18\xd1\x64\x18\x59\x09\x1f\xfe\x7e\x7f\xda\x42\x60\xb2\xb8\xfe\xc9\x13\xd5\x4f\x9e\xa8\x7d\xf2\x74\xe5\x0b\x9d\x2e\x54\xe5\xf5\xc5\x95\xd7\x9f\xa8\xbc\xfe\x44\xe5\xf5\xa7\x2b\x7f\xf6\x4f\x9c\x35\x66\x38\xb0\x40\x23\xce\x59\x30\x24\x10\x6b\xd0\x65\x6f\x8e\x05\xc3\xa3\x78\x8f\x61\x30\x57\xe0\xa2\xe2\x9c\xac\x03\x08\x17\xea\xcf\x17\x09\x23\xc5\x7f\xef\x16\x32\x83\x01\x76\xf5\x67\x31\x40\x9c\xa9\x19\x5e\x23\xb3\x35\xcf\x6f\xfb\xa7\x8e\x5a\x96\xa4\xff\x9e\x7a\x93\x24\x3d\xeb\x27\x5e\x05\x41\xea\x4d\xc0\x92\x7e\xbf\xfb\x37\x4e\x22\xfb\x5d\xd3\x97\x6e\x56\x3a\x3f\xe1\x35\xf2\x31\x63\x65\x56\x62\x5d\x0d\x7e\xc1\x94\x67\x0f\x12\x26\x2e\x66\x4c\x8e\xb4\x86\xf7\xa7\xd9\xdc\x68\x19\xea\x36\x45\x60\xde\x51\x11\x3c\xb3\x70\xb4\x95\xff\x73\xf7\x77\xbe\x32\x1f\xd8\x3f\x46\xcd\x01\x96\xdf\x0c\x93\xc8\xf3\x8d\xec\xb7\xbd\x68\x9e\xf2\x34\x56\x32\xca\x10\x86\x1b\xe1\x06\x5a\xd4\x19\x26\x33\x54\x4a\xda\xad\x76\xde\x71\x7f\xa0\xb9\x9f\x3d\x29\x45\xb5\x4e\x8d\x3b\x61\x95\xc3\x84\xd2\x64\xb6\xc8\xa6\x36\x0e\xdf\x25\xa6\xc2\xdc\xf7\x64\x4e\x4f\x7a\xc9\x0b\xdd\xa4\xd3\x57\x29\xde\x74\xbb\x20\x81\xee\x66\xce\x62\xa6\x2a\x7d\xd6\x9e\x65\x04\xb1\x91\xe8\x6e\xe8\xa5\x42\x5e\xf5\x24\xe2\x0b\xbe\x69\x5b\xf0\xce\x4b\xee\x44\xd5\x99\x2d\xb1\xaf\xee\x26\x37\x73\x81\xea\x7e\x4e\x29\xf8\xa6\x49\xf2\x9d\x97\xdc\xf0\xaf\x7b\x3f\xc0\x05\x60\xab\x81\x1b\xad\xa6\xb7\x7c\x29\x47\x8b\x27\x7c\xb3\xb7\x65\x3a\x00\x40\x6f\xcc\x0b\x9b\x3c\x3b\x8c\x9a\x99\xeb\x10\x12\xba\xab\xd5\x17\xd0\x91\xde\x6c\xe7\x45\xde\x5c\x37\xc0\x87\xc1\xb4\xbf\xe3\xa5\x8d\x51\xf3\xdd\xfb\x54\x15\xc8\xf3\x32\xeb\xef\x06\x11\xe7\x4a\x54\x24\x07\x7c\xa4\xa8\x16\x6a\x65\x20\x4d\xab\x76\x70\x15\xcb\xc2\x62\x3b\x49\x79\xd1\x6a\xc7\x41\x57\x75\x56\x03\xd8\x58\x49\xf5\x49\x34\x97\x45\x19\x03\xe6\x4f\xa3\xcb\xf1\x26\x70\xeb\x9d\xcc\xc2\xb6\x08\x4a\xae\xb6\x38\x91\x34\x5b\x7d\x3e\xda\xe3\x43\xca\xca\x0d\xde\xda\x94\xaa\x3e\x7b\x4a\x3f\xcb\xc8\xf9\xfd\x6e\x4d\xd7\xf9\x8e\xe9\xa9\x3c\xd8\x2d\xd2\xbf\x4f\xc9\xac\xbd\xdb\xd5\x14\xae\x68\x3b\xdb\x2b\xef\xad\x8e\x78\x52\x5f\x4b\x0b\x7f\x5a\x6d\xb3\x0b\xb5\xe5\xda\xce\x8c\x1b\x00\x15\x0a\xfc\x58\xaa\xc0\x27\xb3\xa2\x18\x9e\x42\xab\xe9\xf8\x70\xdc\x12\xbf\x99\x47\x85\x33\x7a\x35\xd5\xa1\xf0\x15\x35\xe0\xf7\xab\xd6\x78\x00\x7c\x62\x36\x56\x3e\xa1\xb4\x64\x0b\x63\x45\xb5\x45\x0b\x37\xe5\x3f\xba\x93\xf2\xbc\x5a\xbc\x2d\xb2\xdc\x3c\xe5\xf2\x07\xfd\xb4\x25\x27\xdb\xb8\x1d\x69\xf4\x44\x3e\xed\x25\x6b\x51\x70\x6d\xdd\x9d\x25\xd7\xda\x3a\x15\x36\xab\x5b\x3d\xa5\x10\x3d\xa9\x73\xfd\xef\x7a\xfe\x3d\xa1\x11\x3d\xa5\x70\xfd\x6f\x3a\x0a\x3e\xa1\x0f\x3d\xa5\x6e\xfd\x5f\xf9\x15\xfe\x8f\xb5\xaa\x8c\xfe\xb4\x58\x53\x5a\xa0\x15\xfd\x2f\x69\x40\x0b\x5c\x1d\x6d\x05\xe8\x6f\xdd\x1e\x53\x67\xeb\xc4\xca\xca\x57\xcf\xd7\xea\xc6\x7d\xc5\xa9\xb0\x07\xd8\x34\xce\xd7\xe1\xde\x63\xaf\x24\xea\x32\x39\xe3\x96\x0f\xbc\x5d\x95\xc3\x51\xd7\x7e\xdc\xe1\xc9\x2b\x2f\x73\x83\x6a\x76\xf8\x1f\xc6\x7a\x83\x59\x6d\x09\xe1\xca\x02\x95\xc9\x4c\xed\xbc\xd2\x2f\xe0\x1d\x85\xc0\x82\x5b\xd2\x70\xe9\x66\xee\x22\x1b\xd5\x87\xd9\x1d\x48\xca\xc1\x15\x1a\x29\x9b\xd9\xd5\x36\xdb\xda\x41\x2d\xa8\x30\xa8\x41\x15\x2f\x7a\x58\x0e\xe5\xb6\xb9\x4e\xef\xc0\x25\x7e\x93\x5b\xca\x45\x89\x7e\x58\x12\x0c\x7a\xc3\xe9\x44\x86\x67\x78\xb2\x96\x6f\xfc\x5f\x9c\x44\x05\xf2\x25\x8c\xd8\x1d\xf3\xf1\x2c\x29\x20\xcc\xd5\x30\xfc\xe4\x32\xdf\x53\x7a\x54\xb1\xd0\x38\xca\x2a\x68\x1a\x2b\x7e\x82\x30\x64\xef\x0d\xfa\x8b\x7b\x77\xb8\x60\x98\x71\xee\x58\x5b\xbb\x6b\x66\x2f\xd6\x3e\xb6\xf5\x44\x2e\xf3\xba\x6d\xbb\x4c\x77\x33\xd6\x55\x9a\xd7\xe1\xf5\x9a\xbf\xe9\x3c\x3c\x3c\x0f\x61\xf5\xd9\xef\xe4\x6f\x61\xfe\xf4\x67\x07\x09\x84\xf5\x9d\x0b\x63\x1d\x46\x03\x7d\x51\x58\x59\x47\xd8\x5d\xf0\xb4\xcb\xbe\x87\x98\x58\xef\x9a\x3c\x8a\x29\x06\xaf\x51\xa4\x75\x9f\xcd\xaa\xb0\x6c\xb5\x3b\x63\x7f\xb7\x6f\x19\x07\x96\x73\xb3\xc9\x55\xe3\xee\xa8\x24\x9e\xac\xa9\x1b\xef\xc3\xc3\x4e\x37\xcf\x9e\xb7\x8e\xed\x4e\x67\xed\x07\x5b\xde\x1a\xd8\x10\x80\x95\x8c\x0d\x57\xe9\x4d\x64\xaa\xcc\x5f\x78\x5a\xbb\x52\x72\x09\x67\xfa\x3b\x62\x9b\x56\xc9\xf5\xf9\x19\xe9\x4a\xe9\xf1\x11\x06\x48\xde\x44\x46\xf9\x7a\x33\x8a\xbe\x60\x0d\xf0\x59\xcd\xc3\xb4\x46\x08\x34\x2e\x7d\xcc\x6d\x78\xe2\xee\x12\x66\x5c\xa5\xc2\x91\xaa\xc2\x89\x5f\x93\xc4\xaf\xbe\x7d\x10\x3b\xed\xb9\xbd\x64\x5b\xc7\xf8\x3e\x6c\x58\xae\xae\x13\xed\x86\xa0\x37\x74\x49\x17\x32\x9d\x8b\xb7\x7b\x3c\xef\x63\x8b\xd8\xcc\xf3\x86\xad\xaa\xd9\x49\xc2\x46\x89\xd0\x9e\x1a\x66\x7b\x85\xf7\xd1\xad\x8c\x21\x31\xb7\xe7\xed\xb4\x15\x18\x10\xd5\x21\x42\xd4\x85\xd3\x02\x66\xec\xa0\xf9\x9e\xdd\x12\xd9\x76\xe8\xe3\xe3\x39\xbf\xb5\x6b\x55\xca\x3f\x93\xb6\xb5\x55\x93\x51\x48\x53\x97\xe7\xac\x5f\x94\xa7\x97\x41\x25\x37\x14\xf8\x5f\x09\xed\xe2\x4e\x45\xa3\x8a\xad\x20\xef\x30\x26\xd2\x7c\x10\x82\xa4\x78\xc2\x70\x1c\xc0\x1c\x4b\xed\x52\x54\x63\x0f\x01\xe5\x8b\xc3\x37\xa3\x33\xb6\x75\xf3\xf5\x9c\xcd\x1e\xb8\xae\x8e\x5b\x17\xf2\x5f\x1a\xbf\x4c\x88\x41\xdb\x59\xf2\xce\xda\xe6\x95\xac\x4b\x60\xe8\x76\xaa\xa4\xbf\x42\x3a\x6d\x69\xff\x6f\x8c\x09\x73\xa7\x73\x57\xe4\x69\x74\x76\xdc\x03\x5c\xee\x0d\xa0\xaf\xf4\xe5\x38\x48\xec\x7b\x1d\x58\x40\x57\x3b\xc0\x60\xb5\xbb\x6a\x40\x8f\x00\xea\x52\xd6\x42\x9f\x4a\xd6\xbc\xdf\x75\x4d\xf2\x09\x92\xf5\x19\xe5\x24\xb9\x03\x36\x72\x3b\x8a\x5f\x5a\x38\x88\xd1\x29\xde\x51\xe0\x1e\x81\xfb\xaa\x6f\x6c\x48\xac\x2c\x41\x2d\x6e\xe1\x00\xc8\x39\xb8\x52\xad\x26\xd8\xf8\xe3\x22\x27\x13\x44\x19\x28\xd2\x44\x58\x91\x50\x9a\x72\x36\xe5\x91\xec\x6b\x13\x13\xb8\x1a\x19\x1d\x38\xa1\x44\xb0\x9a\x57\x23\xfa\xfd\x10\x36\xe7\xa0\xa0\xf9\xce\xa3\xc2\x7e\x97\xcf\x82\xe2\xc9\x16\xb6\x20\x3c\x41\xab\x15\x3c\x85\xb8\x00\xbd\xb0\x10\xa8\xe9\x7c\x0e\xb7\x88\x52\xec\x19\x1d\x17\xd8\x2b\x95\x14\x21\xad\xb6\x13\xe0\x7b\x1d\xcb\xe5\xbd\x47\x82\x71\x90\xb2\xce\xa9\xa7\xc2\xc0\xd5\x32\x9e\x38\x2c\x19\x08\x4a\x0a\x06\x8d\x23\x5f\xbd\xff\x3b\xc2\x6f\x08\xc6\x56\x67\xc3\x90\xa0\x8c\xe1\xf9\x12\xd5\xb0\x0f\x99\x8e\xc0\x27\xea\x1a\x5c\x65\xae\x3a\xac\x04\xfe\x6d\x79\x24\xbc\xd4\xcc\x46\x1c\xd7\xca\xbc\xca\xa6\x0c\xe8\x34\x82\x99\xc7\x84\x57\x67\x09\x46\x53\xab\x1b\x15\xef\xb8\x49\x50\x3d\xe8\xe3\x5e\xb5\x14\x46\x9a\x64\x0b\xd9\x60\x27\x9d\x14\x21\x2a\x43\x05\x5b\xa6\x08\x42\x6d\x55\xe0\xaf\x2a\x05\x18\xd2\x37\xfd\x55\xdb\x45\x24\x04\xf1\x54\x55\x04\x6e\xf2\x21\x7a\xab\x11\x9f\xe7\x81\xfc\xad\xfa\x6c\xb0\xcf\xeb\xc4\x4b\x6e\xa4\xab\xd3\xbf\xf2\x17\x37\x0b\xc3\xea\x18\x7e\x68\x18\xff\x8e\x2a\x2b\x60\xc9\xc6\x7c\x02\x78\xf5\x09\x76\xe1\x73\xa2\x8f\xf0\x13\x23\x01\xa6\x1f\x9d\x52\x9e\xfe\x6a\x11\xaa\xce\x52\x68\x62\x3b\x94\x79\x55\x67\xfe\xa6\xef\x26\x03\xc6\xf4\x67\x8f\xf7\x8a\x1c\xce\x19\x28\x41\x4c\xa1\x56\x95\xb2\xdc\xad\xe2\xf4\x3e\x31\x0c\x1f\x3d\x54\xbb\x1b\xcf\xbe\xe3\x11\x3b\x2e\xce\x57\xfb\x3b\xa6\x1f\xac\xf3\x12\x99\x79\xff\x7b\x57\xf1\xc4\x77\xb4\xac\x9a\x9d\xa4\x02\xaa\x23\xa4\x8e\x09\xa8\xbc\x30\x73\xb8\x6c\x5f\x8a\x8c\x4f\x60\xb6\x87\x7d\xc3\x19\x3c\x52\xb4\x89\x57\xf7\x43\xdd\xcc\x5e\xda\xf3\x87\x39\xb4\x9a\xe4\x08\xf4\x79\xb6\xc0\x9c\x67\xb3\x64\x51\x79\x1d\x3e\x71\x95\x5f\xac\x6c\x7d\x6a\x2f\xd4\xb6\x58\x39\xb1\x55\x2d\x37\xab\x67\x05\xca\x15\x9b\x37\x50\x0a\x3d\x61\x0e\xf4\xc6\x8f\x81\xf7\xa9\xfd\xc8\x47\x26\x79\x74\x04\x50\x53\x10\xa0\x7a\x9c\x1a\xcf\x2b\x9f\x89\xdf\x3e\xc2\x43\xc2\xec\xbc\xe1\xc8\x64\xa3\x4c\x23\x81\x03\xeb\x30\xaf\x5b\x23\xc2\x0e\x93\xbc\x3e\xea\xb0\xf3\x9b\x59\x29\x5b\x9b\x41\xe9\x68\xfd\x9e\x78\x28\x67\xbd\xfe\x34\xb9\xf5\x3c\x88\x1d\xa9\xe2\xcd\x98\xe7\x42\x41\x6a\xc7\x1e\xce\xa1\x78\xfc\x0b\x97\x24\x38\x29\x16\x4f\xf8\x93\x89\x61\x3e\xf8\x82\xb6\x99\xfe\x6d\xec\xe0\x61\xdb\x46\x3d\xe3\x74\xff\xbc\x3b\x73\xaf\x62\xa2\x0e\x1d\x77\x9c\x80\x0d\x61\x50\x87\x48\x7a\x25\x63\xd4\xf4\x42\x90\xde\x6a\xd3\x8b\xc7\x63\x5c\xea\xa7\x36\xcb\x92\xeb\x66\x97\x89\x16\x3d\xe5\x4d\x16\xf4\xf2\xd9\xf7\x0b\x4e\x35\x63\x5a\x2f\x60\xab\x63\xac\x7e\x8d\xd7\x3a\x70\x1b\x70\x0a\x17\x8b\x7c\x60\x82\x9e\x3e\xdd\x91\x6a\x65\xec\xa7\x63\x3f\x23\xd2\x4b\xce\xd6\x3d\x05\x12\xf6\x6c\x0f\x72\x7c\xd8\xee\xe5\xbd\xd4\xa2\xf4\x49\xf2\x24\xc9\x0c\x52\x6f\xd1\x3c\x7a\x92\x78\xae\xa6\x3e\x6d\x5c\x0b\xce\x0b\x7d\x0d\xd4\x4c\x7e\x13\x8f\x63\x3f\xee\xc6\x93\x7b\x7e\x5b\xb2\x87\xd3\xe5\x70\xbb\x3f\x6b\x39\xd5\x2d\x6c\x7d\x93\x24\xa8\x9e\x22\xf0\xbd\xc5\x66\x15\x94\xc5\xdf\xa1\x06\xa0\xe9\x85\x73\x2c\x7c\x46\xf1\x93\xcc\x3c\x47\x4b\xd3\x31\x5f\x8a\x83\x4d\xca\x90\x4f\x71\x2f\x11\x6b\x2c\x25\x67\x0f\x03\xb5\x88\x5b\x0a\x1f\x1e\x94\xe4\xaf\x69\x73\x00\x3f\xcb\x45\x64\x57\x63\x39\x39\x9f\xb1\xd0\xce\x6a\xbb\xd7\x5b\xf4\x51\x83\x5a\x78\x4c\xb3\x6a\xd6\x7c\xc7\xda\x74\xf1\xde\xb5\x4e\x0e\xa6\x8e\xe6\xbd\xd9\x65\x4e\xb5\xdb\xe6\xe7\x67\x6a\x7d\x7e\xdc\xd8\xa9\x84\xbe\x50\x11\x41\xf1\x60\xf0\xf3\x08\x87\x62\x26\x24\xf0\x2b\xfb\x2d\xfd\x4c\x0d\x89\x90\x28\xee\xc2\x70\xe1\x93\x58\x38\xaa\x1d\x55\x3e\xf8\xa2\x50\x2e\x95\x5e\xf8\x85\x23\x5b\x2d\x6f\xeb\xca\x4e\x35\x43\xf8\x04\x7a\x62\xf7\x78\x6c\xb5\x88\x64\x96\x7e\x18\xc8\x55\xef\xa0\xe1\xf2\x31\xd6\xcd\x8c\xd3\x6e\xa0\x7d\x11\x78\x21\x74\xd6\x96\x72\x82\x09\xcb\x9b\x8f\xce\xe3\x64\x3f\xc1\x13\xfd\x8b\xc1\x78\x0c\xbf\x11\x07\xa7\x8f\xd8\x37\xf6\xab\xf2\x91\x4d\x1d\xcf\x42\xef\x2b\xf6\xf3\xaf\x23\xf7\xa4\x65\x6e\x68\xd1\x98\xd0\x88\xae\x86\x78\xf9\x20\x01\xb9\x59\x00\xc2\xd6\xa6\xab\xfc\x49\x0b\xde\x16\xc6\x77\x1e\xd7\x59\x9a\xc3\x24\x01\xa7\xef\xb6\xe1\x9c\xc1\x68\xc9\x0c\x5a\x52\xa3\xc5\x37\xf0\xb2\x1f\x65\xe8\x2e\x7c\x3b\xf1\xab\xbd\xcc\xb9\x6d\x7b\x4a\x90\xee\xb4\xd4\x71\xa7\xab\x1e\xe9\x1a\xb5\x65\xea\xb3\x8b\xb1\x1c\x9d\xb1\xab\xee\x72\xa5\x4e\x51\x97\x7c\xdb\x80\x1d\x3b\xf3\xd8\x75\xa7\x97\x78\x4c\x79\xfa\x4d\x21\x75\xae\x4c\x1f\x2a\xbb\xea\x29\x51\xe5\xf9\xb5\x93\xca\x91\xcb\x72\xfe\xaa\x47\xab\x75\x64\xc1\x7b\xf4\x89\x6b\x6e\x15\xc3\x51\xd0\xf2\x80\xaf\xbf\x31\x60\x8f\x8f\x46\x8e\xa9\x53\x8e\x8e\x2e\xac\xd3\xe6\xd2\x6e\x9b\xf9\xa3\xb6\xba\x76\x5f\x2d\x31\x4a\xd9\x62\x4c\xba\x75\xac\xc0\x62\x1c\xb3\x6a\x51\xab\xa9\x50\x1a\x7f\x6b\xb5\x8a\xe3\xa9\x1d\x8a\xe0\x92\x37\x6e\x21\xb4\xa9\x43\x4b\x41\xd1\x1f\xdc\x9d\xc5\x3f\x49\x86\x26\xb2\xc5\xeb\xb1\xc8\xc4\xc0\xf9\xd2\x76\xf7\x03\x56\x84\x74\x1c\x09\xe5\xd3\x96\xfb\x21\x48\x87\x2c\xf3\x91\xba\xda\x9a\x07\x30\x04\x02\x8b\x03\x9e\x6e\x7b\x6a\x84\x0e\x66\x47\xe8\x31\xa6\x85\x91\x1a\xea\xab\xbe\xfa\xa3\x86\x7e\xc0\x73\xc5\xa6\x1e\xfa\xab\x6a\x95\xe7\x2b\x61\xc0\x1b\x7e\xd6\xd0\xe9\xf5\x32\x6e\xad\x6b\xff\xfe\x11\x16\x86\x77\x35\xfd\xc2\xb5\x9f\x5e\x25\x0a\x76\x2f\x97\x9c\xc4\xd3\x9c\xa7\x68\x12\x8f\xa2\x38\x9a\xf6\x27\x71\x4f\x8d\x1b\x5c\xcc\x32\x17\xe3\x29\xd3\x00\x92\x8c\x79\x86\x8f\x0d\xb0\x35\x25\x89\x93\x0b\x32\x46\xe9\x32\x34\x3d\x4b\x30\x23\x7a\xe6\x6c\x0f\x89\xdc\xac\x29\x8a\xbb\xa2\xed\xee\x11\xb9\xed\x87\x4f\x98\xaa\x6a\x25\x6b\xfa\x9f\xcb\xdd\x09\x98\x07\x38\x5c\x0f\x58\xdf\xe2\xf0\x6e\xc0\x9d\xc0\xe1\xed\x20\xdb\x11\xbb\x30\x2c\x04\xea\x80\xaa\xef\xb1\x59\x04\xc5\x50\x8f\x72\x18\xc5\x10\x1f\x72\x58\x17\xc3\xe1\x05\xc5\x74\xf9\xf1\xbc\x2e\x6b\x43\x7c\xcd\x03\xfe\xe2\xd1\x0a\x60\xf8\x19\x9e\xbe\x93\x76\xdc\xaf\xac\xbb\x3d\x19\xc6\xd3\x5e\xe5\x15\xec\x6b\x41\xa7\xf2\xc6\x76\xee\xba\xee\x25\x8e\xe3\x59\xcb\x4c\xa1\xe7\x0b\x6d\x9d\xf1\xd2\x79\x30\xb9\x9c\x35\x03\x7a\x63\x40\x13\x62\x42\x68\x13\x0a\x35\xfa\x3f\xf5\x4c\x25\x4b\x5a\xeb\xd2\xb8\xde\x8c\x89\xe0\x6d\x72\xd3\x1a\x23\xf6\xd9\x67\x02\x73\xf8\xd0\x67\x02\x73\xf8\xd8\x67\xca\x70\xf8\xa3\xff\xb7\x04\xc6\xca\xd6\x10\x18\x4b\x57\x43\xe0\x13\x3f\x25\xf0\xa7\xf9\x62\x9e\x24\x70\x7a\x24\xc4\x92\x08\xbf\x1e\xf1\x20\x9d\x39\xce\xfa\xa2\x0a\xd7\x5e\x27\xb3\x3b\x02\x6d\xd3\x24\x57\x38\xb9\xba\xae\xde\x3d\xe3\xbd\x1e\xbc\xed\x8a\x57\x73\xf9\xb6\x16\x07\xe3\xa0\xdc\xcc\x5c\xf4\x8e\x7a\x48\x53\xf5\xd6\x7a\x62\x32\x8a\xef\x7e\xe4\x1b\xa5\xd5\xb7\x3f\x8a\x3f\x56\x9b\x05\x37\xf7\x4f\xc2\x56\x06\x67\x58\xbb\xab\xcd\xc7\xfc\x70\xd6\xd4\xe3\x14\xa8\xe6\xdf\xf9\x1a\xae\x30\xa9\xac\xd5\xfe\x28\x52\x7a\x85\x14\xe6\x5a\xe5\xc7\xda\x8f\x35\x15\x4f\xd1\xcd\x17\xce\xff\xa1\x58\x0a\xff\x51\x6b\xbe\xa8\x39\x94\x50\xe1\x22\x09\x1c\xd0\x5e\x03\x09\x0f\xcf\x1d\x06\x22\xf8\x82\x2a\x03\x5f\xc8\xcc\x5f\x7f\xe4\x8b\x08\x3d\xb7\x5e\x2c\x1f\x1b\xbe\x98\xd0\x1c\x30\xe9\x79\xfa\x0a\x58\x1f\xb7\x8a\xdc\xa9\xdb\x7b\xac\x73\x9a\x87\x81\x91\xbe\x34\x67\x4e\x7b\x79\x36\xee\x06\x4b\x34\xff\xb5\x07\xe3\x49\x1f\x07\xa5\x95\xfe\x8a\x92\x4a\x6e\x8f\x26\xf7\xc7\xe4\x2c\x31\xeb\xff\xd4\x5c\x35\x6c\x08\xc2\x3e\x0a\x3f\xb5\x34\x47\x9a\x21\x18\xad\xc6\xcb\xa6\x3a\x01\x4e\x95\x0c\xb2\x77\x20\xde\x2c\x02\x7f\x3d\x0b\x6e\xbd\xd8\x63\x89\xd3\xf4\x80\x36\x9f\x9b\x2c\xbd\xf3\xd8\x11\x0e\x6f\xc6\x42\x41\xc2\x52\xf1\x5d\x58\x4d\x5e\xe2\xe1\x17\x88\xfd\x55\xf5\xda\xc6\xcb\x0d\xcf\xa3\x05\xe2\x9b\x97\x78\x15\x82\xbe\x93\xf4\x82\x74\xdc\x25\xa4\x94\x19\x40\xc3\xbd\x7c\xed\xa5\xbb\xaf\x24\x5c\x0b\x9e\x2c\x98\x93\x83\xab\xfa\x60\x41\xcf\x5b\xfb\xe3\xc1\xee\x92\xfb\x19\x41\xba\x4d\x8c\x7c\xd7\xc3\x88\xe4\x56\x94\x5c\x73\x3d\x5c\xe9\x7d\x72\xe6\x88\x45\x82\x99\x02\xd4\x3b\xfd\xd0\x79\x19\x48\x3e\x3c\xc8\xf7\x81\x83\x37\x35\xc3\x02\x3f\x6e\x55\x48\x8e\xc1\x80\x4e\x7c\x07\x5b\xe8\xca\xd5\xd0\x38\xdd\x1b\x37\x7a\x46\xf0\x10\x0c\xda\xa8\xad\x34\xf3\xcf\x1f\xfe\x70\x2c\x3c\x7f\xf6\x66\xcf\xdd\xd8\xb8\xe2\x95\xa9\x08\xee\xf4\xa0\xaf\x54\xa8\x87\x8c\xba\x43\x6b\x6f\xe5\xe9\x8e\x87\xcd\xd9\xf6\x6b\x6d\x83\x6b\xe4\xa5\x53\x28\x3f\x3c\x04\x7c\xcf\x9d\x02\x66\x2c\x53\xa3\x4e\xa4\x9d\x6a\x19\x65\xc2\xd1\xdd\x96\x76\x87\x6f\x26\x2a\x8f\xf0\x1a\x1a\x53\x97\xca\xc5\xe5\xb9\xec\x61\x88\xc3\xfe\x28\xb8\x1b\xb9\x42\x18\x9f\xe2\xc0\x61\x3b\x74\x59\x2f\xfc\xa0\xfc\xf9\xfa\x7d\xf3\x5b\xea\x60\x98\x8f\xd8\xb2\x09\x97\x5f\x46\x88\xd8\xc5\x05\x18\xf4\x54\x7d\x97\x1d\xa2\x4c\xa6\x7e\x44\x99\xde\xfb\x7c\x73\x90\xd7\x8f\x2a\xbe\xc7\x3c\xb7\x5a\xe6\x52\x28\x4e\x6b\x99\x96\x67\xb0\x3e\x69\xc0\x9d\xb9\xd5\xf3\x7e\x89\x6e\x1c\x48\x1f\x6f\xad\x2d\xff\x11\x95\xa2\x8d\x28\x5a\x76\x05\xcd\xc6\xd7\x53\x79\xdb\x8e\x27\x1c\x2d\xa4\x1f\xfe\x45\xd1\xd7\x53\x41\x9f\xa5\x52\x14\x31\x14\x7d\xf6\x04\xb5\x0b\x30\x7f\x51\x54\xf8\x8a\x22\x7f\x4e\x47\xba\x28\x06\xf2\x69\x75\xc9\xdf\xaf\xa3\xd7\x61\x40\xdf\xf1\xf8\x5a\xd5\x15\xc9\x57\x01\x65\xf0\xbb\x82\x66\xb2\x3b\x89\x40\x3f\x68\xcb\x50\x74\x7b\x83\x7e\xa8\x20\xfc\x20\x04\x04\x67\x28\x95\x50\xb1\xfa\xbc\x89\x07\x5d\x39\xa1\xc8\x0d\xb1\xee\xcb\x75\x8a\x24\xa1\xd0\xa7\x6f\xf1\x7a\x5d\xac\x0b\xfa\x9e\x8e\xba\xf7\xb7\x83\x01\xca\x09\xa5\xbf\xb1\x41\xe8\x07\x22\x94\x13\x5d\xd8\xeb\xe8\xad\x14\x25\x8a\x6b\x8b\xd1\x64\x24\xa7\x63\xd3\x86\x12\x47\x0e\x82\x41\x57\x70\xdb\xc3\xf5\x37\x6f\xcb\x12\x67\xfa\x47\xa2\xcb\x48\xfd\x15\xbd\x2e\xf1\x77\x3f\xea\x0e\x6e\xe5\x48\x97\xf8\xe6\xd5\xdb\xd7\x32\x54\x09\xe3\xb8\xdb\x61\xd8\x68\x03\x6d\x0e\x46\x71\x6f\x3c\x00\x7a\x61\x50\x7e\xf5\x12\x31\xf7\x38\xca\x9f\x50\x32\x14\xa3\x8e\xd5\xca\x0d\x5f\x45\x25\x50\x1b\xbe\x89\x6a\x0d\xba\xa1\xec\x8f\xb8\x5d\xd4\xaa\x37\x25\x13\x3f\x12\xf7\x68\xfe\x5b\xfc\x33\x51\x52\xaa\xec\x6f\x5e\xa1\x55\x3a\xce\x06\x7b\x86\xb8\x4e\x5b\x74\x62\x14\x17\xfa\x7f\xbd\xd1\xc5\xf5\x44\x4b\xf6\x27\xe8\xec\x0d\x3f\xc5\x67\xd0\x8d\x6f\xa4\x29\xf6\xf5\xeb\x37\xfe\xba\xc6\x9d\x68\xd3\x57\xbd\x1c\x6d\x04\xa6\xae\xc1\x28\x68\xc7\xc0\xf3\xed\xdb\x97\xeb\x41\xa0\x22\x47\x32\xd4\x85\x1a\xb0\x31\xf7\x37\x45\xca\xb7\x6f\xdf\xfc\x25\x74\xa4\x14\xa6\x9e\x8d\xc8\x0f\x36\x74\x3d\x63\x74\x8a\x26\xd4\xab\x8d\x97\xa1\x41\x8c\xe3\x35\x09\xd6\xa3\x57\xf4\x2f\x13\x2f\x67\xe3\x69\x28\x5c\x4f\x07\xf1\x58\x11\x3c\x90\x61\x59\xc5\x27\x6c\xf5\x96\x28\x16\xbe\xa4\x48\x29\x87\xc3\xb8\xaf\x3a\xb3\xfc\xea\xad\x8e\x1a\x77\xee\x93\xee\xf2\x55\x0f\xc6\x3d\x5d\xff\x9b\xb7\xf8\xa7\x63\x64\x26\x66\x10\xb6\x12\x76\x29\xcb\xb7\xcc\xcd\x51\x3c\x92\xfe\x08\xca\x1c\xf5\xc0\x3a\xfe\xa3\xb8\x2e\x98\x2d\x19\x7d\x51\x24\x22\x22\x16\x89\x41\x39\x9e\x18\xb2\xac\xaf\x6f\xf8\x0c\x3b\x0d\xda\xe3\x58\x30\x9c\x1a\x1f\x2d\x3c\xa1\xe1\x0f\x46\x03\xe6\x37\xfc\xa3\x38\x4c\x9f\x49\x81\x1b\x6a\x94\x3f\x03\x33\x71\xc6\xf0\x2f\xf4\x86\xcd\x5b\xa1\xa0\x91\x84\x38\x34\xea\x5e\xba\x29\x33\x6d\x70\xcf\xf1\xf7\xbd\xec\xd2\x08\x00\x3f\x85\x51\x04\x5e\xe0\x06\x13\x34\x6e\x75\xbb\x0f\xe5\xad\x91\x03\x94\xa1\x3d\x98\x24\x84\x7c\xf3\xd6\xa7\x81\x1f\xf7\xc3\x58\xf4\x15\x43\x04\xe1\xeb\xe0\x75\xa0\xe2\x5a\x40\xfc\x15\xd8\x8e\x9a\x17\xdf\x0c\x46\xf7\x8a\x08\x5c\x8c\x61\xd6\xa8\x24\xdf\x6c\x50\x86\xae\xb8\x91\x7d\xbe\x55\xe3\x0f\xf9\x46\xbe\x89\x44\x1a\x45\x84\x1e\xb7\x55\xd6\x52\xf4\x1a\xf1\xb7\x7d\xd3\x8c\xbf\x82\x88\xf9\xb4\x2b\x89\xf7\x88\x4d\xa3\x88\x59\x10\xa4\x86\xc4\xe9\xc2\x22\xa6\x3b\x4a\x84\xe1\x86\x7c\xa3\xe3\x12\x29\x40\x64\xd8\x28\x99\x48\x35\x4c\xa5\x1e\xcc\x1c\x97\xd0\x32\xa1\x11\x75\xa2\x08\xd7\x4d\xb2\xe2\x95\xf0\x25\xfe\x25\x71\x0a\xb7\xb7\x25\x49\xbc\x91\x46\xce\x01\x26\x74\xf4\xdf\x04\x65\x1d\x97\x8c\x22\x6a\x41\x09\xa3\x48\xc5\xa6\xc3\x68\xbd\xe4\xaf\x8b\x24\x3e\xe1\xdf\x8d\xbf\x02\x09\xa2\x3d\x53\xf1\xd6\x38\xfa\xeb\xaf\x8d\x8d\xb7\x6f\x4d\x06\x6b\x20\x65\x13\x26\x52\x76\x75\x59\x7e\x29\x78\x15\x4a\x9d\x90\xb6\x9b\xfe\x93\xdc\x9c\x9e\xd4\x22\xaf\xa4\x3f\x0d\x6e\x24\x1e\xc2\x97\x4c\x9a\x3e\x7f\x83\xdf\x41\xf2\x54\x0a\x19\xde\xa6\xe9\x66\xc0\xcd\x04\x17\xa2\x18\xb5\x20\xca\xcc\x44\x6f\xde\x04\x21\x5a\xaa\x92\x2c\xb1\x8a\x9e\x55\x91\x89\x68\xf2\xc5\xeb\xd7\xa0\xab\x8a\x1e\x4e\x47\xc3\x2e\xa0\xdf\xbe\xfc\xab\x14\xfa\x26\xda\xa2\xe2\xcb\xc0\x7f\xf9\x57\x39\x49\xb0\xc4\xd1\x5f\xfe\x9b\x0d\x29\x93\x94\x21\xa6\xfb\x74\xd0\x44\x24\x6f\x4d\x9a\x2d\x7c\x5e\x6d\x84\x65\x88\x46\x95\xa2\xc4\x8f\x1e\x11\x7f\x95\x5f\x6f\x10\xd7\xf6\xe2\xb0\x6f\x71\x63\xf9\x6d\xf9\xed\x5f\x68\x77\xdc\x9f\xc0\x6c\xd5\x53\x53\x6b\x84\x3e\xec\xc5\xe3\xc9\xfd\x68\x30\x36\xb3\xab\x04\xa2\x83\x20\x10\xe3\xb8\xaf\xa3\x7c\x2a\xb1\x2f\x6e\xc4\xd5\x20\x95\x2e\xa1\x14\x44\x98\x67\x14\x7d\x6f\xe6\x1f\xaa\x80\xf8\x97\x26\x66\x86\x08\xa3\xd7\xe8\x0d\x96\xfe\x4c\x7a\x25\x02\xf8\x3b\x1c\x09\x1f\x34\xf7\x37\xe4\x3a\xd1\xd1\x9a\x08\xc4\x6b\x06\xe2\x08\xd5\xa4\x28\x7a\xa5\xe3\x34\xf5\x43\x41\x64\xa6\x92\x87\xa2\x2b\x6d\xe1\x23\xa5\xdc\x40\x0f\x72\xbc\x19\x15\x34\x0f\xbc\xdd\x50\x71\x36\x05\x45\x44\xd0\x52\xc5\xdb\xf4\xa3\xc9\xac\x04\x71\x3d\x14\x43\x71\x2f\xa8\xb5\x43\x45\x82\x28\x24\x12\x0c\xa5\x08\xda\xc3\x69\x14\x29\x02\x08\xff\x2d\xe2\x46\x53\x96\x44\x1b\xaf\x5f\x12\xa7\x25\x83\x2c\x28\x05\xc4\x09\xc3\xee\x14\xa4\x0e\x43\x51\x0a\x89\x5a\xc3\xc1\x6d\x98\x88\x72\xbf\x24\x99\x5d\x13\xf6\xd9\xd0\x34\x34\xcd\x56\xac\x4a\x3d\x73\x6f\xd4\x14\x4c\x69\x98\xd4\x46\x83\x7b\x61\x86\xcf\xab\xf2\x9b\xb7\xe8\xb2\x31\x49\x9c\xae\x34\x90\x1b\xfe\xab\xd7\xe5\x97\x88\x35\x03\x5c\x6c\x94\xfe\x5a\x47\x44\x3f\x4c\xca\x8b\x5e\x89\x57\x6f\xa8\x0e\x7b\xc0\xcb\x0d\xff\xf5\x5f\x1c\x35\x6e\xd3\x60\x54\x43\xf1\x35\x68\x35\x8e\x65\xbf\x8f\x61\x25\x4a\xaf\xd7\xd7\xd1\xf9\xa4\xb0\xdc\xb0\x10\xa5\xd6\xd2\x3f\x02\xc9\x48\x08\x49\x14\xb0\x99\xfd\x8d\x78\xcd\x72\x32\x23\x2f\xa8\xc9\x10\x5b\x19\x51\x61\xe2\xfa\x46\x14\x08\x30\xea\xdc\xe8\x20\x9d\x8a\x62\x2d\x51\xf2\xea\xcd\xc6\x3a\xe6\x88\x09\x4b\xd6\x90\xc2\x10\xf6\x13\xc9\xc2\xb7\xa4\x85\x2f\x3c\x8a\x26\x4c\x70\x52\x04\xa2\x90\x98\x63\x32\xa0\xf5\xf4\x40\xcd\x31\x2f\x5f\x51\xe3\x33\x63\x8d\xba\x29\xa4\x6c\xc9\x24\x4f\x5c\xb6\x0e\x72\xdc\xb6\xa5\x98\xf0\x38\x22\x4d\xf1\x25\xbe\x31\x34\x36\xa5\x0a\x8c\x7b\x83\x8e\x51\x60\x31\x8d\x64\x04\x1b\xfa\x55\x45\x24\x7c\x2a\x58\x96\xd9\x1e\xba\x59\xcb\x82\xf0\x92\xf3\x85\x89\x05\x46\xbd\x2b\xed\x79\xb7\xb2\x26\x2a\xb7\xb2\xc0\x7b\x17\x3b\x3d\x36\xc5\xa5\xb7\x8a\xf9\xc5\x41\xe8\xd5\xb1\x28\x76\x03\x18\xa3\x47\xb0\x53\xe1\x2a\x82\x23\x69\xee\x08\x0e\xec\x37\x5c\x01\xbe\x9b\x82\x4f\xdb\x8e\xba\x08\x75\xab\xc7\xab\x8f\xad\x5e\x43\x28\x0b\x45\x33\x5b\x45\xa0\xe0\x6f\x55\xf1\x66\xbf\x48\x14\x96\x73\xf1\x98\xdf\x21\x14\x78\x08\x8a\xd6\x15\xa4\x24\x0f\x46\xb9\x31\x37\x07\x4f\x34\xa6\xde\x50\xd6\xea\x79\x69\xc9\xb4\x64\x41\x3b\xb1\x87\xc7\xc8\x13\xde\x0f\x0f\x40\xcc\xc6\x8a\x97\x87\xc7\x58\x1e\xfe\x91\x2f\x3a\xea\x7f\xd6\xfa\xb0\x6e\x4c\x0b\x4b\xa6\x02\x27\xd9\xdd\x3a\xa0\xc2\x0b\xcb\x7f\xce\x62\xdc\x96\x77\x0a\x6b\x42\xf7\x55\x62\xb0\x31\x87\xb8\xa9\x2a\x57\x0a\x61\xaf\x96\x18\x13\xdb\x15\xa6\xa7\xcc\x3f\x75\xcb\x2a\xdb\xe8\x98\x45\x6e\xd9\x5d\x77\xdc\xf2\x1b\xc7\x4d\x62\x5e\xce\xc5\xbc\xd6\x31\x96\x43\xd0\xbe\xb5\x96\x6c\x0b\xb5\xdb\xda\xe6\x13\x88\x01\x7e\xd5\x62\x9c\xdf\x1b\xc5\xe6\xbe\x78\x78\x58\x7f\xfd\xfa\x1d\xfd\x44\x82\x9d\xb5\x68\x01\xa8\xa2\x7c\x8e\x0a\x38\x2a\x50\x51\xe9\x7e\xdf\x9f\xcb\xf9\x3f\x89\x26\xa7\xb2\xe0\xe3\x4f\x50\xf8\x73\xd9\x99\x25\xcf\xe9\x87\x2d\x45\x9e\x3f\x61\x4c\xfb\x48\x68\x35\x3a\x68\xd6\x1b\xb8\x52\xe0\xdb\x4f\xbf\x03\x7c\x07\xe9\xb7\xd9\x56\x00\xe1\xfd\x82\xb5\xeb\xb0\x6b\xef\xd9\xa1\xa9\x58\xf5\x62\x71\xea\xf2\x96\xac\xfd\xb0\x67\x76\x7f\xac\xd4\x5c\xa3\x26\xf0\x16\x59\x99\x83\xec\x2c\xb4\xae\x82\xb6\x37\xbe\xcf\x4f\x07\xba\x52\xaf\xf1\xf5\xa7\x7a\xf9\xbc\xe4\x76\xbc\xe2\xeb\x17\xf9\xb0\x20\x9d\x6a\xc8\xce\x35\xf9\x10\x47\x0c\x22\xef\x4d\xe9\x45\x9e\xdf\xad\xcd\x87\xab\x52\x5d\x22\xa7\x63\xc5\xaa\xaf\x63\x0b\xe5\xf5\x12\x52\xd8\xfd\x80\xd3\xfc\xd5\xc0\xa4\xad\xbf\x62\xb7\x8a\xd2\xbb\xce\xca\x4a\xf1\xf5\x7b\x0f\xbe\x68\x14\xbf\x96\x5f\x7f\xd1\x81\x27\x9a\x0a\xaf\xe2\x2b\xe1\x15\xde\x27\x8d\x0a\x78\x25\xf7\x5f\xf4\xc7\x6d\xb9\x1d\xfb\x39\xda\x84\x13\xa8\x07\x6b\x78\xd9\xba\x52\x7e\xc7\xd6\xb0\x55\x2f\xbd\x2e\xa0\xfc\xfe\xcd\x8b\xa0\x26\x0a\x6f\xd4\xc3\xc0\x2f\x82\x4a\xf9\xfd\x3a\xc5\xf8\x95\xf5\xf7\x2f\x39\x45\xc5\xe7\xd7\xd7\x5e\x12\xb6\x2f\xde\x54\xec\x3d\xec\xd3\x2c\x95\xcb\x6a\x13\x72\xbd\xa9\x6c\x2a\xea\x52\x41\xa6\x34\xd1\x9f\x30\xd4\x6f\x94\xfa\x4e\xe8\x49\x2f\xf2\x88\xf6\x2f\x02\xb5\xad\xac\xdc\x92\x14\x99\xa9\xf9\x84\xef\x8b\x7c\xb9\xe0\x3b\x95\xa0\xe0\xaf\xfa\x2f\x02\x2a\x88\xb0\x82\x0f\x3a\xe7\xa2\xb6\x45\xd4\x5c\x51\x28\xaf\xbd\x44\x67\xd9\x71\xe8\x2d\xfb\x7b\x15\x30\x19\x92\x85\x8e\x72\xa7\x95\xfa\x37\xa2\x01\x04\x04\x76\x7a\xde\xda\xbf\xff\xc8\xd7\x2a\xb0\x55\x8a\xd5\xa8\xf9\xeb\xe5\xa3\xf3\x8b\x06\xe2\xe3\xf3\xb5\xd8\x3d\x33\xc6\xcf\x51\xcb\x77\x6a\x3f\xf2\xf9\xd2\x43\xa3\xbc\xfa\xb6\xf9\x23\xfc\x55\x22\x10\xc7\xfd\x31\xae\xfd\x93\xb8\x1f\x0e\x95\x96\x4a\x9e\xa3\x2c\x09\x61\x77\xa4\x9a\xcc\x2d\x8d\x3c\x88\x71\xd9\x9c\x11\xf0\xfc\x49\xac\xee\xaa\x61\xdd\x78\xa9\x4e\x4e\xa8\xfb\x30\xa8\xd9\xef\xd5\x71\x54\x98\x8c\xf8\x2b\x50\x8e\x44\xfa\xcb\xdc\x60\xd3\x60\xef\x58\x73\x6d\x48\xc3\x76\xad\xfc\xd8\x9b\xbd\xf0\xea\x63\xb3\xf6\x95\x46\xa2\x7d\x59\xe7\x67\x6b\x93\x6e\xf3\x2a\x1f\xb8\x78\x16\x21\x43\xe3\xe0\x05\x3a\xbd\x90\x2f\x83\x69\x70\x69\x9e\xa6\x35\xe2\xcb\x69\x7c\xd9\x8e\x5f\x4f\xe3\xa9\x85\x16\x2b\x1f\xf4\x32\x5e\xa3\x54\x7b\xa3\x44\x55\x62\xec\x67\xb6\xe2\x0e\xe7\xe1\x30\xea\xf5\xff\x67\xa1\x8f\xe6\x6c\x82\xe9\x6b\xee\xe6\x92\x3a\x3e\x5e\xff\x8b\xe5\x58\xc5\xc7\xb5\x8f\x3b\xed\xca\x39\xbc\x74\xf8\xdd\x38\xa7\x70\x91\x86\x1f\x71\x0c\x3d\x20\x19\xbf\xf0\xe2\x02\xbf\xb8\xd3\x5e\x15\xf4\xc7\x7a\xfe\x15\x66\xfd\x5d\xab\x99\xe7\x32\xfb\xc2\x58\xbb\x28\xfc\x71\x9e\xc9\x93\x5f\x7f\xfb\x56\x51\xf4\xf5\xc6\x5f\x8a\x84\xe5\xf2\x2b\xa6\x99\xb3\x56\xae\xbf\x74\x56\x53\x30\xdf\x80\xf9\x06\xcc\x4f\xc0\x6c\x11\x79\xb1\xb0\x3a\x54\xb2\xca\x1d\x56\x30\x11\x65\x44\x94\xad\x88\x75\x44\x40\xde\x5a\x97\x19\x6b\x62\x7e\x32\x27\x11\xde\xf9\x34\x2f\xfb\xda\xa3\x1b\xe7\xc6\x11\xe3\x13\x13\xed\x8b\xfc\x71\x6f\xe6\x59\x6a\x7b\x4b\xb2\xa7\xdc\xdc\xef\xf5\x59\x19\xca\xca\x87\x7e\x91\x05\x0e\xc6\xea\x32\xcb\xa7\x6e\xa6\x20\xe8\x55\x9d\xdd\x42\xee\x24\x45\x2e\x3d\xa8\x7a\x8f\xcb\x89\x70\x4a\x15\xc8\x99\xe3\x4a\x14\xce\xf0\xc8\x69\x6f\x86\x44\xea\x48\x14\xf2\xd2\x1f\xe7\x5d\x72\xa4\x89\x33\x2a\x64\x53\x57\xe0\xde\xcc\x61\xd5\xfb\x26\x0f\x45\x86\x7e\x8f\xe7\xbf\xd2\xae\xd7\xa0\x82\xdf\x48\xeb\x0e\x5a\x71\x20\xba\xd8\xa3\xc8\x78\xa1\x7f\xb1\x2f\x24\x21\x55\xe3\xa9\x2b\x49\xf4\xb9\x74\xbb\x1c\xbe\x97\xc4\xa9\x65\xe2\x2a\xdd\x96\xfd\xe2\x93\x3d\xf0\x85\xe7\x9d\x3c\x3c\xd0\xdf\x23\xfe\xfb\xb9\x5d\x3b\xa9\xb0\xf2\x49\x4a\x9d\x85\x8f\xd1\x9a\x84\xb5\x19\x78\x02\x7f\x55\xbd\xe1\xac\x98\x92\xf9\x96\x79\x56\xf1\x6b\x22\x8e\x95\xb6\x22\x32\x57\x64\x5d\xaa\x36\x0a\x8f\x9f\x5a\xad\xaa\x27\x98\x45\x63\x1f\xce\x70\x57\xb8\x79\xc8\xba\xe4\xcb\x92\x48\x5f\x67\x9c\xe6\x8b\x57\x38\x27\x85\xb3\xc5\xc5\x33\x1c\x84\x2a\x5e\xdd\x92\x98\xfa\x35\xc6\xae\x30\x8d\xe4\x3b\x1c\xee\x49\xae\x60\xf2\x1b\x3f\xfd\xc4\x75\xbf\x83\xeb\x67\xf1\x5d\xe3\x9f\x4a\x83\x7f\x9a\xd5\xef\xf9\x30\xf3\xd6\x85\x7a\xb3\x8a\x58\x48\x5d\x64\xe5\xaa\xbb\x2e\xc1\x52\x3c\xa3\xf9\xde\xc0\x14\x84\xf3\xc7\xbb\x7d\x51\x53\x57\x66\x70\x54\xc5\xe0\xeb\xea\xdc\xfc\xbc\x85\xc6\xa6\x18\x87\x2b\x2b\xc4\x11\x14\x4b\x41\xeb\x22\xa9\xb4\xb3\x2e\x0d\xbf\xe0\x16\x17\x5a\x09\x10\x32\xd8\x34\xb4\x1e\xc7\x4c\x28\x91\xc4\xd1\xec\x6c\x3d\x00\x1c\x60\x4b\x88\xda\x8a\xfb\x37\xd1\x86\xb0\xe9\xb5\xae\xd4\x57\xe2\xe9\x95\xdc\x91\x83\x0b\x6e\xf8\x59\x1c\xcd\x59\x80\xe2\x58\xe0\xd1\x60\x57\x81\x05\xf9\x82\xd9\x7c\x81\x9d\x0f\x4f\xfa\x65\x72\x99\xae\x0e\xf5\xd6\x98\x0d\x8f\x50\xe2\xb8\xb1\x9e\x79\x05\xd6\x51\x97\xe9\x94\xdd\x30\xfb\x38\x68\xf0\x2e\xe4\xf7\x5e\x04\x23\x69\x3d\xf2\x19\x34\x17\x32\x50\x6f\xe6\xd6\x18\xe5\x55\x7e\x52\x53\x8e\x9c\x27\x35\xd2\x3d\x69\x42\x61\xce\x76\xe9\x2f\xbb\x88\x38\x15\x92\x71\x96\x48\xfd\x96\xee\x9b\xab\xd6\xf8\xa9\xaf\xb8\xea\x0e\x2d\xe2\x7c\x37\xf5\xbf\x54\x97\x69\x53\xa4\x25\x99\x02\x48\x17\xd7\x96\x4a\x01\x0b\x17\x52\x88\x2c\xdf\x4e\x39\xf3\xa2\xba\xe6\x1f\x88\xd9\x84\xe4\x2b\x2b\x78\xfb\xe6\xbe\x89\xe3\x21\xb8\xe2\x52\x6f\xc9\x9b\xcb\x2b\xf8\xd8\x88\x01\x46\x53\xdf\x73\x75\x28\xa2\xc6\xa1\xcc\x0e\xbe\x02\x0b\x13\x3e\x30\x98\xe3\x96\xbb\x99\x5b\x2b\xbe\x1b\xd9\x50\x52\x3a\x44\x66\xf7\xcf\x7e\x8c\x88\x26\x41\x3e\x43\x48\xaa\x63\xd9\x7e\xa7\xe7\x03\x5c\xf6\x66\x5e\x35\xb6\x6e\x78\xce\x6c\x3c\x76\xd4\xcb\xe0\x5a\x13\x0a\xd2\x5d\xcc\xc0\x5b\xcd\x07\x85\xb2\x79\x1d\x3f\x48\x8f\x1a\x94\xcc\xad\x7e\x36\x72\x47\xb1\x59\x4a\xf3\x03\x41\xab\x5a\xa1\x4d\x2f\xdd\x54\x33\xa0\xbf\x1a\xb2\xe8\x57\xe1\xc0\xa9\x85\x15\x7b\x70\x8a\xe4\x72\x1f\x9e\x93\xee\x43\xf3\x1a\xc0\x45\xc7\xbb\x00\xe7\xa8\xaf\xcd\x7b\x7c\xa5\xdd\xb0\x29\x71\x22\x5b\xf4\xd5\xdd\x1b\xfb\x4f\xdd\xbd\x41\xe5\xe1\x8c\xdf\x97\xf0\xa9\xf4\x8b\x0e\xd2\xdb\xe3\xa7\xd2\x37\xef\x7f\xfb\xfe\x90\xd0\x47\x8f\xef\x43\x57\x17\xe7\xea\x6c\xea\x69\xa1\xee\xde\x13\x87\x04\xad\x8c\x5f\xd4\x24\x4e\x79\x9d\x24\x4c\xf9\x6d\x85\xc1\x37\xce\x0f\x2c\xbf\x18\x62\x7b\xdb\x3b\xa9\x1a\x09\x13\x07\xe6\xdc\xe7\x91\xcc\xf3\xa7\x26\xdb\x31\x1e\x82\x36\x33\xdc\xb6\xd4\x40\xdb\xed\x3c\xbe\x34\xcc\x48\x5a\x25\x3d\xf7\x4d\x49\x6d\x3c\x93\xf5\xdc\x37\x25\x1d\xfa\x56\x49\x53\xf3\x56\x18\x5e\x3c\xa5\x2f\x0d\x73\x1d\x5b\x30\x5f\xe1\xb5\xd5\xd7\x0a\x0e\x7d\x69\x98\x7e\xd7\xdb\x6e\x27\x40\xc1\x89\x39\x2c\x47\xf1\xf8\xd4\x50\x5f\xf6\xcc\x7d\x31\xc5\x0f\x71\x0d\x7f\xd4\xd0\xe2\xc4\xcb\x34\x71\x0f\x89\x7b\x76\xe2\x5e\x4b\xdd\x4a\x2f\x8a\xf5\xb6\x29\x9b\xe2\x30\x41\x52\x8c\x3e\xc4\xb7\xd7\x2a\x5e\xb5\xc0\x50\xe9\x57\x9a\x72\x1a\xd9\x29\xa7\x91\x39\x87\x78\xa3\xef\xbb\x17\x8d\x1b\x76\x20\x36\x91\xfc\xad\x61\xfc\xb7\x0c\x43\xac\xe9\x33\x6b\x3e\xbb\x2c\x5e\x5d\xcd\xb3\xc0\xaf\x28\xee\x76\x2b\x9c\x23\xf0\x69\x34\x6f\xcb\x8a\xee\x2e\x77\x3c\x19\xc1\xee\xa5\x7b\xc6\x9d\x8a\x8a\x26\xbf\xfb\xb5\x55\xd1\x54\x76\x83\x93\x8a\x26\x9a\x4b\x94\xd1\x14\x73\xf7\x74\xf0\x72\xcf\xad\xb7\x2b\xed\x8e\x69\x83\xe3\x0e\xc5\x64\x22\x47\xfd\x24\xee\x26\xc4\x6b\xa3\xcf\xb6\x67\x18\xdb\xba\xc6\x69\xaf\xa5\xe6\x95\x2a\x2b\x59\x9e\xd2\xea\xcb\x15\x52\x0d\x5a\x2e\x87\xd7\x29\x7c\x1a\xb9\x03\xe5\x66\x8a\x94\x6f\x37\xe6\x0b\x69\xdf\x6f\xdc\x3b\xc4\xde\x95\x5d\x4e\xbd\x2f\xbb\x77\x88\xdf\xf3\x5d\x4e\xff\xec\xe3\x02\xf5\x23\x7e\x88\x9e\xaf\x1d\x8d\xfb\xad\xad\xc1\xdd\x45\x3f\x9e\x8c\x29\xf9\x66\xe2\x8e\xdb\x62\x34\x3c\xc7\x4b\xa7\x31\xf0\x43\x7d\xf5\x47\xe3\xea\xad\x9b\xa1\x91\xf4\xf9\x50\x86\x51\x58\x48\x1c\x40\x42\xaa\x75\x08\x8d\x7d\xbc\xe2\xd3\x32\x9f\xed\x31\xbf\xa1\x41\x4d\x9a\xe9\x03\x7c\x6a\xa7\xd9\xa7\x3a\x43\x7d\x5e\xf2\xbd\x46\xa6\x57\x54\x5c\x26\x23\x75\x90\x8a\xdd\x11\xe3\x36\xbb\xd6\x25\xbd\x35\xba\x4b\x7a\x6b\x74\x9f\xf4\x56\x6b\x24\xc2\x98\xa6\xdb\x8a\x48\x7a\x8a\xf4\xdd\xdf\x9c\x5f\xfc\x78\x76\x74\xb8\xb2\x82\xbf\x8d\x56\xd8\xac\x99\x00\xfc\xc0\x43\x88\x8a\xdf\x5f\x1e\xe4\x6b\xd9\x73\x75\x95\x37\x4f\xc4\x65\xe5\x54\xca\x07\xfa\xe1\x36\x01\xb9\x62\x64\xd3\xf6\x36\xaf\x04\x48\x3e\x98\x98\x91\x74\xd2\x97\xd2\x88\xdf\xf4\x02\xbd\x95\x72\x60\xd5\xc7\x80\xfb\x92\x19\x70\x14\x47\x43\xed\x4b\x66\xa8\xf1\xb0\x25\x65\x5f\x77\x2f\x77\xab\x0e\x13\x8e\x78\xd2\x17\x23\xce\x77\x16\x5d\x18\xf5\x3d\x73\x03\xa1\x56\x90\x58\x23\x3f\x79\xbc\xa4\x06\xcc\x3f\x2a\x48\x32\x94\x15\x79\xbe\xaa\xee\xc9\x29\x64\x7b\x1b\xe9\xdb\xed\xf9\xfc\x24\x5d\x37\xaf\xd8\x73\xa7\xcc\x65\xb4\xc3\x99\x8b\xf8\x8c\x7c\xe5\x5a\xaa\x89\xde\x60\x44\xa7\xcf\xb9\x3e\x05\x4f\x3e\x81\x87\xdb\x45\x2f\x09\x72\xbe\x6a\x12\xc7\x76\xdb\x65\x66\x45\x83\x0f\x92\x8b\x87\x78\xd6\x29\xd5\x02\x02\x73\xd8\x19\x72\x7a\x13\x47\x7d\x19\x6f\x3e\xd0\x7e\xd6\x16\xe1\xe0\xf6\x29\x34\xfc\xb7\x56\x55\x99\xc5\x53\xe9\x9d\x20\x2a\xe0\xc2\x30\xa6\x3e\x78\xc3\xe8\xa3\x22\x91\x21\x08\xdf\xd8\x6b\xbd\xfe\x6c\x11\x87\x3e\x5f\x07\x46\x88\xad\xac\xe8\x92\x46\xb6\x43\xfa\x30\x73\x6b\x62\x9f\x2f\x23\x2b\xe3\x7e\x83\x63\xc9\xc6\xa8\xeb\xbe\xa7\x19\xfb\x17\x89\xd2\x12\x8f\xe5\xca\x45\x1b\x22\xb3\x64\x06\xf1\x45\xdb\x3e\x05\x3d\x9a\x79\xcb\x5a\xe7\xd6\xb0\x27\xaa\x04\xf8\x1e\x55\x52\x3d\xb1\x6c\x5f\x65\x3e\xb6\x2e\xa6\x5a\x5c\x88\x80\xf0\x66\xb1\xad\x35\x41\xd2\x7c\xca\xaa\xe0\x54\xdd\xac\xfd\xa4\xda\x1e\x6d\x4b\xc3\xf3\xcc\xe2\x4c\x9f\x1a\x23\x96\x0f\xbc\xa5\xd2\xac\xfa\xaf\xe8\xab\x53\xcb\xca\x35\x9e\x15\x35\xf4\x04\xae\x69\xd9\xde\xc6\x0a\x9a\xf8\x94\xc2\xe8\x27\xd0\x15\xe1\x11\x87\x89\x89\x28\x7c\xc8\xab\x6c\xe2\x09\x0a\xa3\x03\x04\xe6\x62\x0a\xf7\xbb\x08\xd3\x4c\x4c\xe1\x2f\x7b\x08\x5f\x72\xf8\x72\x0f\x96\x2c\x0c\x54\xad\xfc\xf9\x08\x06\x38\x72\x4a\x6d\x5c\x2a\x55\x14\x4e\x81\x41\x8e\xe2\xca\x95\x00\xe3\xdf\x0b\xe9\x2f\xce\x03\xd0\xb8\xa7\xf0\x69\x84\xf0\x5d\x19\xe1\xbb\x32\xc2\xf7\x1c\xbe\xe7\xf0\x9e\x8f\xf0\x9e\x8f\xf0\x67\x0e\x7f\xe6\xf0\xcd\x04\xf5\xd0\xcf\x63\xa0\x4f\xf1\xdc\x84\xec\xc9\x4f\x3f\x7f\x8b\x04\xa9\x91\x94\x77\xf3\x1e\x05\x91\x82\x49\xe1\x0b\x3e\xa0\x40\x6a\x27\x2a\x0e\x2d\xef\x7d\x6e\xdc\xa4\xef\x4e\xfb\xde\xf2\x47\x81\x53\xed\x7e\xee\x80\xa2\x36\x87\x23\xfa\xbd\xcf\x7d\x9c\xf6\xe9\xff\xdd\xdc\xe6\xb4\x95\x3b\x93\xc3\xdc\x51\x30\xc9\x1d\x0e\x6e\x72\x3b\x32\x58\x2e\x8e\x87\xdd\x78\x92\x5f\xce\xe1\xa5\xc0\x48\x78\x8d\xe5\x33\x5c\xac\x7d\xbf\x8c\x97\x02\x75\xe0\x7c\x2a\xc7\x1c\x8a\x5a\x34\x3d\xb9\xcb\xbb\xa3\x98\x3f\x2f\x22\x52\x1b\x26\x7d\xef\x57\xfd\x74\xf3\xac\xd2\x58\xde\xda\x26\xe0\xcd\x9d\xe5\xa6\x4b\x11\x87\x9b\x07\x75\x8e\x94\xf0\x4a\xc9\x6d\xb7\x47\xf1\x78\x82\xf4\x7e\x7f\x90\xdb\x19\xd0\x92\x28\x26\xc0\xc3\xcd\xd3\xd3\xa3\xcb\x83\xa3\xc3\xf3\x3d\x00\x7f\x5c\x76\x37\x23\xf7\x03\x4d\xd6\xfc\x17\xdf\xf8\x3f\x7d\x9d\x44\xee\x61\xe4\x7e\xa6\x38\x94\x7f\x76\xbe\x79\xb8\xb3\xf9\xf9\xe8\xb0\xfe\x3f\x2c\x20\xcd\x20\xfa\x53\x31\xa2\xc6\x6c\x45\x78\xe7\x70\x14\xb4\x81\xe3\x70\x14\x77\x41\x01\x6e\x3e\x91\x4f\xf2\x4f\x17\x5f\x44\xc4\x29\x1a\xf2\x85\xe0\x89\x90\x03\x1f\x4f\xb4\x1c\x44\xee\x7d\x64\xa3\xf5\xff\xa8\xfc\xbd\xa3\xd3\x73\x5d\xf4\xff\x55\x4f\xa7\x88\xfe\xaf\x15\xf9\xec\xb2\x5e\xff\xb4\xb3\xf9\x0d\x8d\xfe\xaf\x58\xc8\x42\xe6\x7f\x5e\x04\x5a\x91\xe4\x46\xe6\xdc\x01\xcc\x6f\x53\x99\xbb\x94\x61\xee\xbc\x3d\xcd\x11\x78\xee\x4c\x4c\x7e\x47\x86\xff\xbe\x00\xc5\x7d\x29\xda\x27\xcc\x75\x97\x91\x2b\x5b\xf8\xbb\x09\xb6\x9b\xe7\xd6\xbf\x85\x07\x32\x27\x17\x9b\xa7\xe7\xf5\x53\xd0\xe2\xa4\x4c\xcd\x3f\x59\xc7\x9f\x97\xf8\xf3\x8a\x18\xd8\x4a\x2e\x8f\x27\xb9\x6b\x62\xb2\x09\x38\x65\x79\xbd\x1f\x5a\x5f\x2f\x47\xf6\xd7\xab\x49\x3b\xf9\x6a\xba\x9b\x07\xc7\x07\xc8\xbf\x79\x40\x49\xc7\x07\x14\xb3\xb3\x79\x5e\xdf\x3d\x3a\x3d\xd8\x3c\x47\x7c\x9d\xfe\x73\x73\x07\xf4\x5f\x2e\x74\x73\xdc\x17\xd9\xb0\x0e\x3e\x5b\x3e\x58\x0b\xd7\xee\xef\xa9\x80\xf3\xfd\x03\xab\x80\x76\xa5\xd7\xab\x8c\xc7\x39\x91\xfb\x49\xff\x51\x1e\x2b\xc2\xfe\x5a\x76\x8f\x5b\xaa\xf2\x6c\xfe\x5f\xe5\xc7\xdc\x9f\x62\xf2\x67\xee\x57\xe9\x91\xe0\xe7\x3f\xdd\xd9\x60\xd3\xdd\xdd\x3f\x3d\x3b\x27\xe2\x1e\xed\x82\xca\x95\x37\x2e\x7e\xea\x87\x3b\x24\x90\x3e\xd4\x2b\x8d\xd7\xee\x1b\x0d\x83\xf8\xed\x8b\xf3\xa3\xdd\x5d\x82\xae\xbc\xb6\xd4\x86\x1b\x3d\xe1\xea\x07\x65\x7c\xfd\x98\x4c\xb9\x62\xd4\x00\xd2\x12\xfe\xf5\xea\xe1\x01\x16\x90\x7f\x95\x4b\x25\x52\x08\x38\xa6\x54\xaa\xad\x6f\x54\xd6\xdf\x56\x19\xfc\xb5\x7a\xaf\x65\x43\xfd\x94\x4b\xea\xf7\xa5\x29\xe4\xa5\xb9\xaa\x2b\xf7\xd2\xba\x9a\xda\x8f\xb2\xd7\x11\xd1\x9c\x40\x33\xf5\x8e\x98\xc8\xfc\x4d\x9c\xb7\x77\x9d\x3f\x42\xdb\x65\x57\x5e\x04\xac\x2b\xd6\x13\x23\xc5\xb5\x7d\x07\xa5\xef\x05\xaa\x68\x1c\x8b\xa6\xa9\xa6\xec\xb8\x77\x7a\xc5\xcb\x5f\x4e\xa5\xbf\x00\x5c\x15\xee\x8a\xc6\x5e\xa8\x7e\xeb\xb8\x83\x22\xcd\x6a\x22\x92\x2b\x29\xd5\x11\xe0\x14\x5f\x7d\x11\x0d\xbf\x88\xbd\x37\x98\x8e\xc6\xf9\x52\x26\xee\x20\xee\x4f\x27\x72\x36\xf6\x4c\x06\x34\xe8\xe7\x61\xbb\xdd\x78\x9c\x24\xd9\x8a\x88\x6e\x1b\x5a\x6d\x61\xa0\x62\xaa\x6a\x0f\x8d\xfa\xe9\x3d\xee\x8b\x6b\xdc\xe2\xec\x92\x6a\xd8\x6a\xf9\x6d\xa9\x64\x99\xa1\x2e\xbd\x5b\x6d\xa5\x39\x91\xb4\xa8\xe8\x17\xb3\xcc\x44\xf1\xa7\x56\x7c\x86\x81\xe6\x16\x31\x6a\x61\x02\x5c\x6e\xcd\x9d\x6f\x3e\xd6\x0c\x5c\x32\x3e\x29\x40\x9f\xa7\xe6\xf3\x34\x7d\xf0\x4e\xb0\x3d\x86\x54\xdd\x5d\xd2\x07\xbe\x49\xb1\xe8\xf6\x26\x5d\xa2\xee\x7d\x05\xfe\x1b\xd0\x0c\x1c\x09\xb6\xa7\x77\x5a\xa8\x4c\xee\x6c\x0d\x0b\x42\xfe\x06\x94\xbb\xff\xb1\x7a\xff\x9b\xc7\xc0\x09\x4a\x06\xea\x31\x70\x5d\xe2\xfd\x6f\x0a\xec\x5b\x78\x5e\x9c\x6f\xff\x03\x0a\x1c\x28\x14\x9e\x99\x2c\x7f\xd7\xba\x7a\xb6\x86\xbf\x69\xe0\x61\x98\x81\x66\x1e\xfe\x0d\x78\x2c\x33\xe0\x9a\xbd\x7f\x93\xa1\x6d\x65\x38\x8f\x7b\xf2\xe7\xa0\x2f\xd5\xe5\xce\xbf\xc9\x74\x6d\x32\x65\xc0\xcc\x7a\xcb\x1e\x84\x4f\x8d\x60\x9d\x79\x9e\xbc\x69\x21\x3c\x50\x84\x81\x9c\xa1\xaa\x05\x36\xb5\xc1\xb2\xd4\xb4\xa0\x76\x6d\x28\x34\x74\x21\xd4\x51\x60\x41\x2d\xec\xfe\x14\x78\x06\x84\xf3\x3d\x33\x19\x9f\x46\xf7\x7b\x98\xad\xe2\x29\x8c\xad\x64\x0d\x3f\xfb\xd8\x3f\x96\x3b\xc5\x7b\xaa\x7a\x4c\x2b\xf7\x62\x0f\x35\x8e\x33\x2f\xc9\x33\xc9\x0b\x26\xa9\x50\x5e\x7f\xa1\xe1\xf5\x2d\x85\x8d\x5d\xf4\x4d\x81\x6f\x1f\xf3\xd7\xca\xeb\xd8\xfc\xf7\xff\x55\x5e\xaf\x96\xde\xb3\x95\xa8\xe0\x51\x5c\xea\xc5\x12\xf7\xf3\x34\x33\x05\xe6\x32\x48\xdd\x93\xea\xad\x7b\x90\xb7\xac\xc3\xb7\xec\x11\xa6\xc2\x53\x3e\xa8\x99\xc2\xd0\xaa\x41\x14\x49\x6b\x1a\x27\xaf\xbf\x73\x03\xf3\x49\x28\xc5\xcb\x4d\xdb\x60\xd5\xe7\xe2\xfe\x06\x35\xa0\x0b\x1b\x6f\x5e\xd5\x5f\xbf\x50\xe5\x69\x18\x85\x87\x9b\xe0\xa1\xf9\x4f\xc7\x30\xab\xa8\x22\x2d\xf8\xa7\x67\x15\xf5\x2e\xfc\xed\x02\x9b\x43\x23\x15\x6a\xee\x7e\x9c\xb7\xc8\xcd\xfe\x55\x26\x4a\xa1\xbc\xee\x34\xf5\x91\x96\xc2\xd1\xe3\x53\x8f\xef\x2f\xe5\x97\xf4\x55\xe9\xaa\xf9\xb0\x30\x73\x40\x47\x72\xe9\x88\xe4\x80\x8e\xe4\xf2\x11\xa9\x47\x95\x53\xdd\xfc\x8d\x24\xa4\x96\xe4\x33\x97\xaa\xde\x19\x33\x87\x29\x88\x97\xb7\x09\xef\xa9\x09\x53\x24\x72\xa5\x60\x48\xf5\xce\xe7\x97\xa6\x1c\xbe\xf8\x1d\x17\x72\x1d\x45\xbf\x91\x16\x91\x12\x61\xe9\xd9\xae\xfe\xcc\xf6\x35\xf7\xe6\xaa\x11\xd3\xd6\xe1\xaa\xfe\xcc\xae\x97\xde\x50\xb2\xb7\xbf\xb0\xde\x4f\x17\xfe\x9a\x94\xe6\xdc\x68\x3b\x56\xd7\x92\xb4\xcd\xb5\x6a\xc1\x92\x17\xa6\x0f\xf6\x29\xce\xee\x31\x90\xc4\xaf\x02\x82\x07\xd6\xdc\xab\x7e\x81\x56\xc2\xae\xda\x15\x80\xac\xac\xc8\xe4\x90\xaa\xe7\xe9\x16\xa5\x0f\x2b\xa8\xd7\x61\xf8\x4a\x93\x9f\x41\x93\xdf\x20\xcc\x2f\xf9\x3a\xfc\xf0\xb0\x84\x96\x35\x22\x6c\xf6\x47\x4d\xc7\x49\x2b\x33\x05\xf0\x35\x04\x3e\x1f\x21\xe7\x4c\x2d\x87\x6f\xd6\x51\xc1\x14\x3c\x69\x2e\xa3\x36\x6a\x55\xb8\xc6\x8f\xcd\x25\x3e\xe1\x96\x2d\x16\xcf\x82\xe8\x5d\xb0\x42\x81\x37\x69\x15\x16\x7c\x1b\x76\xd0\x7c\xb2\xd4\x83\x56\x25\x1b\x51\x6f\xeb\x27\x02\xd5\xcf\x6d\x92\x5e\xae\x86\x32\x12\xd3\xee\xa4\x92\xdc\xdf\x51\x1f\x8d\x06\xa3\x1c\x5f\x5c\x93\x53\xef\x66\xe1\x36\x8f\xe5\x82\x28\x4c\xe0\xe3\xb7\x5c\xc9\xd1\xd2\xf3\x6e\x28\x83\x09\xad\x71\x60\xb0\xcd\x0d\xa2\xdc\xc0\xbf\x2a\x13\xcc\xb3\x00\x07\x27\xd3\xc3\x6c\x46\xe6\x71\x7f\x19\x39\x67\xe4\x46\x55\xcb\x6e\xc5\x6c\x33\xa7\x58\x35\x23\xe8\x7d\xb9\xab\x36\xdf\xb7\x35\x6a\xe9\x27\xdf\xb6\x02\xeb\x25\x35\x65\xc3\x65\xdb\xc8\xa8\x55\x6b\x34\x2b\xfa\x99\x59\x5f\xf5\x28\x2e\xa4\xf3\x80\x49\xc3\xba\x86\x2c\x78\x5c\x60\x61\xdd\x4a\x65\xf9\x79\x0c\xeb\x53\xe3\xd7\xa3\xe5\x92\xb3\xad\x59\x3b\xb8\xa2\xf1\x75\x1e\x93\xa2\x68\x3f\x80\x18\x46\xb3\xcf\x79\x29\x7e\xe8\x63\xe7\x3f\xc0\xc6\x3f\xfa\xad\xc6\x60\x49\x07\x56\x04\x9f\x5e\xa7\x3f\x69\x41\xd2\x14\xb4\xe0\xc1\xda\xbe\xbe\xba\xa3\xc3\x57\x1b\xf2\x76\xbb\xde\x24\xff\xf5\xe8\x72\x46\xf5\x1c\xad\x53\x49\x8c\xb1\x0a\x88\x5d\x0a\x92\x2a\x76\xfa\x19\xd7\xe1\xd3\x58\x35\xc8\x16\x70\x28\xcc\x57\x9e\x4c\xf3\x47\xe6\xeb\xe9\xa6\x66\xe5\x17\xdf\x08\x13\xe0\x2d\x64\x7e\xec\x08\x0f\xc9\x58\x4f\xa2\x65\x3c\xa8\xf4\x7d\xc0\x70\x92\x4a\x1d\x2e\x48\x96\x34\xf9\x3d\x43\x99\x5c\xd9\xa4\x36\x3d\xf8\x7e\x9e\xc9\xe3\x23\x4c\xc1\x99\x3d\x67\x6a\xd5\x88\x9f\x14\x0d\x88\x0a\xd8\x73\xdf\x82\x06\x5e\x3c\x9b\x7b\x4f\x25\x45\x83\x2f\xee\xc0\xab\xc3\xf2\x9d\xee\x5f\xe0\x24\x81\x13\x35\xc1\x7a\x77\x85\x12\xf8\xc9\x3b\xe1\xb6\x3c\xb6\x4e\x0e\xf0\x1c\xa9\x13\x7a\xd4\xe6\xd0\x8d\xdc\x96\xf5\x0c\x09\x3f\xe6\x4b\x65\x76\xde\x45\x6a\x88\x76\xcc\x85\x69\x0a\xb8\xd1\x69\x02\x3e\x69\x69\x17\x2f\x0e\x5b\x0d\x53\x68\x3d\x3e\x26\x00\x61\x7a\x15\x64\x98\x5e\x14\x14\xf0\x3b\xad\xe1\xdc\x93\x0e\x96\x85\x36\x48\x76\xf0\x5b\xb8\x5e\xab\x92\x79\xce\x59\xa8\xd6\xae\x96\xb1\xaa\x91\x55\xb9\xba\x9a\xbc\xb7\x8a\x0b\x8c\x75\x93\x3b\x9e\xef\x76\xbd\xb0\x4a\xed\xed\x40\xf4\x75\x3c\x42\x3f\x15\x8f\xb8\xe7\xcd\x94\xd1\xaf\xae\xae\xf6\x55\x19\x43\x34\xb5\xe5\x76\x1a\xfd\xa6\x8b\x4b\x1a\xd5\xfb\xb4\x91\x3b\x74\x1e\x53\x53\x63\xba\xe6\xfa\xd0\x4f\x7d\x05\xe7\x30\x1e\xe8\xcb\x45\x7d\x8f\x47\x6a\xda\x79\x99\x06\x84\xd5\x90\x1a\x90\xb6\xce\xb7\x9a\xb6\xba\x2a\x4d\xd3\xc0\xa2\xc8\xc6\x2f\x0a\xc8\xa6\x42\xed\xb2\xc7\x57\xe9\x2c\xb8\xc2\x64\xcf\x48\x2a\x3d\x69\x65\x3c\x14\x2c\xef\x17\xcf\xbb\x6d\xd9\xaf\x33\xa5\x3e\xf7\xe9\xe4\x26\xf8\xcd\x11\xf6\xf0\xf6\xbc\x83\x36\x5f\x3a\xee\x79\x5f\xa5\x15\xfb\xa1\x05\x7b\x6d\xd6\x49\x62\xbf\x9f\x7a\x6b\x7f\xec\x27\x3e\x0c\xe6\x61\xb8\xa4\xd2\x20\x66\x57\xec\x3c\x4c\xe2\x8b\x1e\x96\xfb\x38\x33\x55\x17\xcf\x68\x20\x33\xff\xef\xf5\xed\xeb\xd5\xff\x71\x8b\xcf\xed\x06\x1f\xc4\xd6\x3b\x46\xc9\x99\x66\xec\x4c\xe9\xfb\x59\xac\xde\xfe\xbc\xc0\x0f\xad\xd6\x61\x93\xc1\x79\x8c\x0b\x15\xfa\x4a\x4e\xcd\x10\x22\x8a\xc4\xef\x51\xbb\xb6\xdf\xee\x02\x52\xca\xb9\x7d\x11\x32\xa9\xdb\xa8\x45\xdd\xc3\x7f\x44\xdd\xd2\x22\xe2\xb6\x52\xa3\x01\xde\x91\x4b\x48\x4b\x38\xff\x8f\xca\x3b\x7c\xb2\xb3\x3e\xd9\x9d\x75\xa4\x1d\x24\xb8\xd3\xb2\x0e\x38\xca\xc5\x57\xd4\xc4\x0c\x15\x8f\xfb\x0b\x11\x3d\xea\xff\x37\x78\x5a\x3e\xf4\x1a\x83\xa3\x05\x18\xd4\x92\x5d\xc2\x19\x1c\x4e\x17\xe3\x70\xf2\x5f\xe1\x90\xba\x50\x2e\x62\xa7\x84\x19\x67\xaa\x3e\x4f\x25\x4d\x52\xea\x51\x3a\x4a\x19\x99\xc0\x3d\xb3\x89\x7c\xf1\x64\x5f\x64\xc0\xbe\x64\x2e\x35\x66\xa4\xf8\xf5\xef\x60\x96\x4d\xf1\x76\x3d\xe9\x10\x4d\x37\x3d\x6a\x13\x54\xad\x97\xda\x2e\x70\x86\x46\xdf\xcd\x1a\x66\x1a\x66\xa9\x50\x97\xb3\x0f\x98\x19\xd4\xbf\xd8\x38\x7d\x9d\xdf\xad\x53\x70\xe1\x22\x97\x50\x6e\x41\xe0\x64\xb6\xe5\xbe\x3d\xd9\xf8\x4c\x45\xed\xc8\xba\xfe\x4f\x75\xea\xf3\x40\xdd\xfd\xeb\xc6\xbf\x19\x03\x7c\xaf\x2f\x2e\xdb\x5f\xa4\x4e\xc4\xd1\xec\xce\xf6\x8c\xa0\x50\x9d\xbc\x50\x58\x7c\x9f\xed\x8d\x74\xf3\xdc\xef\x70\x33\x6b\xc1\x4c\x96\xe7\x4f\x13\xeb\x6b\xfe\x7b\x5f\x35\x26\xc8\xdc\x20\x37\x58\xd8\x09\x0c\xf8\x44\x16\x7f\x30\xcf\x7f\x7c\xc7\xc7\x0c\x0b\x66\x2c\x92\x03\xfb\xba\xab\x80\x1d\x18\x8c\x87\x5e\x32\xdb\xdb\xfd\xc9\xe6\x57\x7e\x4b\x50\x79\x7b\x88\xc4\x7f\x04\x0e\x95\x1e\xfa\x59\x39\x4b\x25\x1b\xb2\x3f\x05\x57\x4a\xda\x32\x06\x74\xd1\x72\x0a\xb1\x80\xf2\x7e\x71\x5b\x7a\x0c\xc5\x45\xb0\x97\x54\x92\x7a\x97\x14\x01\x59\x50\xb4\x9c\x46\xb2\x45\x4c\x85\x97\x56\x94\x71\x23\xc9\xc2\x7d\x6d\x29\xb8\xcf\x29\x5c\xe2\x58\x62\x41\xc2\x3d\x95\xb5\x83\x62\x70\xa2\x32\x40\x18\x16\x47\x77\xd9\xd2\x3e\xc4\x76\xe2\x4c\x55\x7b\x9c\x98\xe7\x07\x49\xb5\x4f\x8a\x93\xf8\x2f\x16\x95\x0f\xd0\xcc\xf7\x7a\xfa\x7d\x67\xa5\xdd\x5b\xe1\x3b\x0b\xe6\x7e\x9d\x37\x6d\x41\x7e\xf6\x08\x01\x16\xaa\x5c\xc7\xe5\x7d\xe1\x34\x66\xdd\x71\x9f\x05\xc5\x6f\x37\x8a\x40\xc6\xd1\x08\x60\xdf\xb3\x71\xeb\x88\xbb\x2b\x33\x06\x2e\x6f\x22\xb3\xbb\x11\x6f\x21\xa3\x76\x97\x37\x90\x51\xb7\xcb\xdb\xc7\xd0\x65\x8a\x4f\x3a\x1f\xe1\x96\xe6\x7a\xdb\x0b\xac\x81\x08\xbd\x5d\x6f\xee\xd3\x08\x66\xd6\x02\x53\xc1\x29\xe6\xba\xcf\xde\x43\x70\x4c\xd9\x6e\xe3\xeb\x18\xbe\x30\xfd\x04\xa4\x1d\x22\x72\x24\x09\x45\x30\x28\x85\xaf\x63\xfb\xad\x52\xeb\x16\xc5\x81\x3d\x50\x89\x40\xa1\x62\xae\x5d\xac\x57\xaa\x89\x33\xe9\x37\x7d\xeb\x61\xc8\x24\x68\x1c\x85\x4d\x2b\x91\xaf\x02\xe4\x44\x26\xa3\x98\x8e\xc4\x36\x48\x99\x29\x21\x1f\x14\xbb\x81\xa7\x2e\x91\x09\x15\x8f\x02\x50\x71\xa8\x13\x14\x4f\x6e\x05\x29\x91\x9c\x78\xc6\x63\x60\xd0\x9f\x1c\xe2\x06\x20\x4a\x13\xff\x3f\x6b\x6f\xde\xd5\x46\xae\xfc\x0f\xff\x9f\x57\x61\x7c\x33\xc4\x1d\x37\xc6\x06\x92\x99\x69\xa7\xe3\x87\x2d\x81\xb0\x83\x09\x49\x8c\x67\x8e\x7a\xb5\xb1\xb1\x8d\x17\xb6\xc0\x7b\x7f\xea\x53\x92\xba\xd5\xb6\xc9\xcc\xbd\xbf\x6f\xce\x09\x6e\x49\xa5\x5d\xaa\x2a\x49\xb5\x78\x94\xa4\x72\x35\x1e\x70\xc2\x5e\x5c\xfc\x94\xb4\x08\x03\x0b\xe1\x73\xa3\xb2\x2b\xcf\x4c\x2c\xb5\xc7\x30\x7b\x92\x6d\x4c\x9d\x1b\xa3\x00\x20\xed\x34\x84\x3e\x7a\x16\xe6\x2c\x74\x83\x79\x24\x2f\x9a\x46\x3c\x73\xd1\x80\x4a\xc3\x08\x67\x8e\x79\x57\x9a\x59\x31\x30\x9d\x2a\x60\x2e\x5d\xe0\x29\x9a\xa2\x0b\x9d\xec\xe3\x92\xca\xae\xcc\xbf\x54\xb5\xb8\x5f\x7f\x78\x2d\xc6\x8e\xdf\x38\xf4\x9a\x76\x1b\xbe\x23\x6e\x45\x97\x82\x9f\xbd\xa6\x41\xca\xba\xd9\xa2\x18\x67\x06\xd8\xa8\x26\x2b\x16\x58\x34\x5c\x89\x1c\x48\x20\x31\xba\x9d\x8c\x55\x37\x80\xc5\x2d\x5d\x44\xc0\xbc\x3f\x9d\xeb\x82\xaa\x54\x73\xf2\x3f\x04\x52\xf5\x92\xa2\x94\x59\x1b\xdf\x2a\xca\x4f\xbf\x58\xb1\x39\x83\x8f\x5b\x30\xd8\x68\x7e\x4b\xcc\x6c\x68\x2d\x57\xca\xe5\xe7\x14\x4b\x24\x4a\x4c\x06\x7f\x6b\xcc\xc8\x75\xa6\x13\xd4\xfe\x18\x83\xb6\xeb\x65\x19\xca\xf4\x20\xf7\x8f\x0c\xe5\x2f\x49\x0b\x0d\x59\x4a\x5b\x5e\xf1\x39\x2c\x22\x64\xbf\xfd\x20\x9c\xfc\xf5\xa4\x3b\x6e\x0f\xba\xb0\x21\xf3\x28\x9c\x8d\xd6\xb3\xdd\xea\xbb\x3f\x0f\x8f\x0e\xb7\x9d\x13\x7b\x7f\x22\x9c\xbd\xd8\xae\xd3\xcf\x63\xcb\x3e\x7d\x70\xee\xe3\x67\xbb\x8f\xbc\xbf\x02\x18\x30\xc0\xb9\x53\x8f\xed\xa3\x73\xe7\x54\xc7\xa7\x67\xce\x9b\x48\x68\x2f\x61\x0f\x3d\x88\xe4\x48\x31\xae\x35\x22\xec\xcf\x71\xbb\x70\x03\x0e\x20\x95\x41\x8a\xa6\x44\xd2\xfd\x92\x2f\xba\x5d\x4f\xf8\x9d\x6a\xfa\x39\x2d\x98\xe7\xc1\x65\xa8\xdf\x54\xb7\xba\x89\x87\xd6\x2a\xe4\xa7\x86\x6b\x50\x40\x2b\xf0\xc7\x08\x97\x9a\x2c\x31\x87\x96\x94\x2d\x47\xa8\x26\x25\x68\xad\xea\xb9\xdf\x0a\x71\xbf\x1f\x77\xc3\x46\x17\xe7\xc0\x76\x49\x86\xec\x1f\xbe\x48\x8c\x51\x21\x9b\xc5\x25\x6e\xf2\xb5\xb7\x34\xd3\x2b\x0b\xb5\xbd\xcc\xdd\x66\x7b\x7a\xae\x3c\x9a\xab\xaf\xad\x84\xb1\x7e\x7a\x62\xfb\x8f\x8d\x21\x6c\xc5\x3f\x3d\xad\x95\x0d\x03\x81\x57\xf3\xf2\x9e\xc6\x33\x79\xd7\x65\xde\x15\x33\x6f\xa7\x3f\xb3\x8d\xa5\x44\x28\x4c\xf1\xda\xea\xd8\xbc\x99\x9c\x9e\xb5\x69\x45\xcb\x56\x67\x38\x8f\xed\xe9\xae\x2a\x2b\x50\xb0\xfb\xea\xc1\x3b\x13\x7c\x2a\x70\x06\x36\x96\x6e\xcf\xa6\xd7\x3c\x67\xba\x1b\xdd\xa4\x29\x76\x38\xd3\x98\xf5\x7f\xdf\x18\xef\xa3\x5b\xa0\x03\xf1\x6a\xd9\x7a\xa1\x45\xaf\x31\x61\xf3\x81\x64\xb3\x32\x23\x34\x32\xd8\x52\x77\x4c\x9b\xc6\x97\xee\xc4\x99\xd0\x8e\xaa\x3e\xbf\xb6\xfb\xac\x0c\x4e\x1b\x11\x0c\x00\xae\xe3\x3e\x35\xad\x5a\x43\x34\x1d\x6f\xee\x89\xe7\xba\x9f\xbc\xc8\x86\xed\xc2\xb5\xff\x02\x73\xcb\xa9\x57\x7e\x22\xff\x28\x1d\x7b\x0f\x44\x62\xb5\x99\x92\xfb\x69\xb2\xc7\x7c\xf0\xad\x30\x6e\x0c\x8a\x37\x42\x14\x0d\x76\x78\xc2\x9b\x4c\x2a\x29\x84\xd2\xde\xe9\x49\x6c\x25\x6a\x3c\x42\x47\x7e\x8d\x2d\x69\xe8\x4b\x85\x6f\x65\xd8\x47\x18\x4e\x77\x4f\x60\x4b\x98\x8d\xbe\xb2\x4a\x91\x46\xf2\x69\x89\x65\xe3\xd6\xb1\xd7\x97\xe7\x3b\xf4\xba\x28\x0c\xa5\x0c\x05\xff\x5a\xb0\x9d\x45\xdc\x47\x7b\x5a\x2b\x83\xaf\xba\xd9\xa5\x62\x03\xfe\x1e\x82\x66\xe1\x1c\x97\xde\x66\xc8\x4d\x8f\xef\x55\x4f\x37\xcc\x6b\x41\x38\xb6\x35\x0c\x23\x57\x54\x21\xac\xd7\x75\x4f\x7c\x3a\x26\xc0\x3a\x40\x1d\x43\xc5\x23\x00\x5d\x28\x4f\xea\xea\xf7\xfb\x30\xc8\x66\xf8\xe9\x97\xd3\x9d\x32\xdb\x72\xbc\xee\x90\x4d\x0f\x52\xbf\x5f\x95\xd9\x7e\x4c\xe9\xc5\xf1\x7b\x8a\xd4\x1f\xca\xde\x79\x3b\x39\x5f\xf4\xa0\xb6\xde\xed\x8b\x20\x77\x20\x06\xa3\xdc\xfa\xf1\x6e\x09\x16\x08\xb8\xe4\x1a\xfd\x77\x0a\xfd\xbe\xf2\xc3\x5f\x71\xa9\x0e\xad\xe8\xbf\x4f\x18\xe5\x1e\x40\x08\x15\xdd\x08\xa3\x95\xa2\x9e\xc2\x84\x92\xfd\xc8\xfe\xa9\x91\x9e\xe3\xd9\xfd\x71\x2b\x1c\xfe\x3d\x10\x43\x71\x3d\x02\xe3\x6e\x1e\x1e\xb8\x24\xd5\x0f\x69\xcf\x50\x5b\x30\x5c\x58\x97\x37\xe9\x30\xc6\x29\x8d\x07\x56\xb4\xf1\xc0\x05\xf7\x22\x4e\x1f\x04\x84\xcb\x96\x09\xcd\x3c\x72\x3e\x97\xff\x12\x57\xe2\xfe\x52\xa1\x42\x31\x68\x8f\x2e\x69\x9b\x5c\x2b\x03\xad\xc9\xb2\x5c\xd6\x10\xd9\x54\xda\x83\xcf\x73\xbc\xa3\xf3\xf8\x24\x86\x19\x68\xc5\x77\xfc\x8c\x19\xc3\x41\x3f\xdd\x9e\x92\x9e\xb9\x09\x36\xae\xc2\xa9\x0c\x2c\xe0\x9e\x48\xcf\x33\xf4\x53\xda\xa7\x1d\x43\xdc\x3f\x44\x17\x89\x07\xee\x88\x38\x1c\x99\xdf\xb4\x69\xa5\x9b\x82\x52\x57\x02\xce\x39\x54\xde\x64\xf8\x4d\xf9\x98\xe0\xb9\x85\xd5\xca\x5b\xaf\xb8\x0f\x9a\x6c\xfd\xf6\xfe\xf7\x4a\xf9\x8f\x3f\xde\xaf\xcd\x7f\x2f\x12\x8d\x09\x0c\xeb\xe3\xa5\xc2\x32\x32\x6e\xc4\x46\x4e\xda\x7c\xa8\x47\xbe\x82\xd9\x8a\x7a\x40\x7a\x94\xf5\x15\xaf\xaf\xf0\xa6\xaa\xb4\x92\x70\xcb\x99\xd5\xb9\x53\x79\x09\xd1\xd1\x2f\x54\x4d\xad\x67\xbe\x1a\x4e\x5e\x86\xa4\xab\x6b\xdc\xa0\x0b\x7d\x83\x9e\xc9\xa3\xee\x3e\x02\x8b\x95\x57\x65\x5e\xfd\x9c\x63\xb4\x38\xbd\xaf\x4b\x1b\xfe\x3c\x3b\x60\xc3\xbe\x36\x7b\x11\x74\x4d\x93\x17\xe3\x68\x2e\x3f\x3f\x52\x08\xe3\x5b\xbb\x40\x67\xf4\x46\xd7\x17\x45\x61\xb7\xf9\xaf\x68\xce\xe5\x2e\xdb\xcc\x9e\xda\xc3\xf6\xcc\xfd\xd1\x8c\xbb\xe2\x49\x3f\x79\x89\xf1\x94\x56\x10\x21\xa8\x11\xed\xaa\xe7\xb1\x28\x4c\xfa\x19\x95\x61\xfd\xde\x28\x4a\x5b\xec\xa3\xa1\x6e\xa5\x5a\xdc\xb2\x88\x92\x47\x23\x0a\x21\x26\x35\x9a\xa5\x83\x82\x65\x3e\x48\x10\x57\xdf\xe4\x19\x80\x6b\x0b\xbe\xce\x73\xc3\x0f\x7e\x2d\xf2\x85\x13\x7e\xf4\x6b\x2d\xfa\x8d\x7d\x58\xdc\xdf\x65\x8b\x93\x9e\x7d\x4e\xfc\x5e\x64\x3d\x9b\xef\xb2\xb7\x6a\x3c\xd2\x1b\x61\x69\xfe\x78\xf4\x36\xd9\x3c\xb5\xb2\xb3\xfc\x57\xe3\xb2\x69\x3b\x3f\x9f\x2f\x47\x97\x93\x95\xf2\xca\x1f\xfc\xf7\xcf\x66\x02\xa4\x2c\x59\x5e\x36\xf2\x97\x97\x97\xcb\x5e\xd4\x1b\x8e\x27\xcd\xe5\xd8\xfe\x44\x7d\x97\x69\xf9\xc6\x5f\x48\xeb\x5d\x0e\xcd\x12\x2e\xef\xcb\xe5\x25\xfa\xf3\x07\xfd\x17\xf4\x51\x89\x9a\x6f\xf3\x4f\xe3\xe1\x24\x7c\x8a\x04\x2d\x4a\xc6\x11\x4f\x4b\xb5\xcb\xa0\x08\xf3\xaa\xa5\xcb\xe0\x2d\x9b\x56\x6d\x84\xdb\xcd\x46\xf1\x72\xa9\x89\x14\xab\x46\x35\x75\x62\x55\x11\xa5\xfe\xf5\xe4\x3c\xd9\xb0\xd9\xda\x98\x6e\xef\x65\xc3\x82\xb5\xcd\x23\x5a\x54\xc6\x95\x56\x48\x7c\x7f\xe1\x10\xa6\x3a\x60\x70\x5d\x5e\x6d\xd1\xe4\x3c\x27\x88\x76\xb7\x27\x2d\x82\x40\xa5\x43\x59\x78\x71\xf0\xb6\x68\x5a\x79\x79\xec\x9b\xab\x26\x53\x62\xfa\xda\x66\xac\x2c\x16\x44\x78\x20\x0c\xa4\x8d\x52\x96\x86\x18\xff\x14\xf8\x41\x92\x0b\xa9\x8e\x72\xee\x8a\x67\x8a\xc0\x83\xd1\x30\xce\xc8\x66\x48\xf4\x44\x14\x63\xbd\xaf\xb8\x4f\x43\x31\xd3\x4b\x0c\x5c\x1a\xb6\x3a\x13\x9e\x4e\x21\x10\xcd\xe2\x28\x3c\xb2\xdd\x72\x1e\x23\x75\x5b\x62\xec\xec\xba\xc3\x96\x04\x7a\x42\xbe\xe5\xb1\xb5\x15\xe2\x69\x5a\xad\x0c\xd4\x5d\x2c\xc1\xbc\x4c\xac\xa1\x2e\x23\x93\xa7\x72\x49\xd4\xa5\x1f\xdc\x7f\x66\x41\x9e\xa5\x96\xaf\x67\x69\x86\x5c\x52\x72\xc0\xdc\xc1\xb6\x71\xfa\xa8\x72\xc4\xc6\x3a\xa2\x0f\x84\xaf\xb4\xe1\x83\x10\xef\xed\x78\xfb\xb6\xb9\xdb\x82\x46\xb2\x86\x3f\x8d\x7d\x6a\xa3\xba\xa1\x2b\x44\x04\x64\x39\x21\x75\x98\x80\x4f\x43\x59\x76\x27\xd6\xf5\x73\xf0\x7b\x0b\xa7\xe1\x23\xae\x2d\x92\x6f\xa4\x3e\xa6\x03\x2f\xe5\xb2\x30\x7e\x7a\x57\x95\xa9\x21\x0d\x17\xdc\x03\xb8\xa6\xe1\x12\x08\xe1\x61\x5c\x23\x54\x23\xdb\x46\xf5\xce\x6b\x55\x94\xb4\x26\xa0\xd6\xe0\xd0\x07\xe8\x1f\xd9\x21\x3b\x88\x9d\x2c\xea\x4c\x16\xeb\x79\xaf\xd3\xeb\xdf\xf5\xf8\x91\x1b\xab\xf4\x55\x32\xbf\xd5\x67\xe6\x4b\x36\xe8\xc0\xf5\x26\xff\xc6\x79\x73\x79\x99\x7f\x63\xd3\xae\xcc\x3b\xed\xd8\xce\x2f\xe7\x1d\xfa\x5e\xce\x53\x8c\xc7\x9f\x1e\x3e\x23\xfe\x8c\xf0\xd9\xe3\xcf\x1e\x3e\x87\xfc\x09\x39\xdb\xcb\x31\x7f\x42\xdc\x9d\xf6\xf0\x06\x07\x26\xe5\x72\xd9\xcb\x3f\xdb\xeb\x74\x30\x5b\xbe\x9c\xc0\x34\x94\xc4\x13\x79\x19\xc8\xd3\x8e\x6d\x10\x32\xc8\xab\xed\x5f\x89\x2e\xef\x7f\x8f\x96\x64\x22\xa1\x0d\x67\x6e\xea\x3d\xa7\x19\x32\x1b\xfa\x4c\xcb\x8e\x3e\x27\xa1\x2d\xb1\x10\x55\x6a\x4f\xcb\x2e\x61\xbe\x36\xfa\x9a\xfb\xdd\xe8\xc3\x18\xbe\x56\xde\x85\x3d\xe1\x32\x26\x7e\xd3\x13\xd5\xca\xfb\x8f\x5e\x2d\x2c\xba\xaf\x43\x67\xe5\x9d\xfa\x1e\x0b\xe1\xac\x95\xff\x7c\xcf\x92\x4a\x14\xfe\x96\x12\x6e\x2e\xc9\x0d\x8b\x89\x21\x20\x22\x14\x93\xd0\x3c\x7c\x6d\x9a\x58\x81\xb6\xff\x16\xe6\x7b\xbb\x6f\xb2\x4d\x9f\x24\x97\xd1\x37\x5e\x28\x36\xa2\xac\xfd\x65\x19\x26\x34\xfd\xd9\x84\x7a\x01\xc9\x6c\xf5\xb5\x62\xbd\xe1\xdc\xe3\x05\xb1\x04\x99\x68\x88\x20\x98\xb4\xde\x10\x2b\xd1\x97\x17\xa1\xbb\xd5\xd7\xaf\xf5\xb8\x23\x00\xb3\xc3\x1a\xf7\x2e\xb5\x40\x72\xa7\x70\xf2\x32\x7b\x61\xf0\xd9\x1c\x07\x45\x2e\xf2\x05\x70\x29\x97\x85\xc6\x65\x60\x5f\x8e\x08\x39\x5b\x56\x9e\x90\xb3\x41\x21\xd3\x73\xe7\x3a\x91\x68\x3f\x73\xc5\xb3\xcd\x25\xb2\x88\x06\xf3\xb2\xd2\x65\xce\x31\x84\x32\xe8\x78\x34\x5f\x18\x90\x7e\x3d\x15\xff\x55\xfd\x1e\xa8\x74\xce\xd8\x74\x64\x29\x07\x52\xf0\x49\x06\xbe\xfa\x46\x80\xb3\xff\xd7\xe5\x37\x9d\x97\x72\x34\x6d\xe1\x1e\xd0\x41\x4a\x5a\x22\x3e\x0b\x2d\xcc\xa5\xa1\x47\x87\x41\xdf\xc4\xfd\xc6\xcd\xbd\x70\xee\x62\xfb\xf3\x83\x70\xea\xf6\xd5\xa3\x70\xb6\x5b\xf6\xe7\x89\x70\x36\x62\x7b\x48\xa1\x2f\x2d\x7b\x87\x42\x9b\xb1\xcc\xb2\x85\x2c\x8f\x04\xbb\x13\xd9\x17\xf4\x73\x45\x94\x7f\x9d\x7e\x3d\xfa\xfd\x46\x25\xd5\x85\xb0\x0f\xe8\x77\x12\xd9\x9b\x94\x7b\x4c\xd1\x9b\x94\xfc\x25\xb2\xcf\xe8\xe7\x38\xb2\x3f\x53\x6c\x6c\xde\xa1\xec\xf0\x70\x2b\x8a\x21\x14\xa9\xd8\x89\xb4\x8c\x77\x45\x21\x72\x4f\x24\x31\xdb\xab\x32\xce\x4b\xe3\xde\x6f\xaf\x29\x62\x22\x92\xb8\xd5\xf7\xdb\xef\x64\xe4\x24\x29\x8d\xc5\xed\x64\xe4\xd8\xc8\x5d\x5e\xfb\x43\x47\x7f\x49\x60\x57\xde\xaf\xfc\xf9\xfb\xda\x7b\x5d\xdb\x71\x92\x00\xc3\x9c\x2b\xab\x7f\xe8\x84\x38\x4e\x6a\xac\xbc\x7b\xf7\xfe\xcf\x77\x2b\xdb\xab\x9a\x9f\x2c\x1b\x1d\xdd\xc5\x01\xda\x78\x97\xd6\xfc\xa5\xf9\xb2\x6c\x88\x04\xed\xf6\xe9\x2c\x48\x27\x1f\x57\x99\x47\xc0\x0d\x5d\xa2\xaa\xef\xbb\x47\x42\x98\xbe\x51\x1a\x14\xb6\x61\xcc\xaa\x1e\x3a\x27\x61\x13\x16\xcd\x58\x05\x9f\x48\x6d\xc0\x44\x0f\x02\x92\xfe\x32\xcc\x61\x55\x20\xaf\xed\xff\xe6\xbe\x2f\x57\xcb\x7c\xc7\x17\x48\x9a\x01\x89\x3f\xdf\x5e\xe1\xbb\xc0\x40\x93\x77\xaf\x44\xcc\x81\xeb\x57\x21\xa7\x5f\x13\xee\x0d\x0d\x1a\xed\xf4\x06\xfd\x52\x6d\xa2\x76\x12\x3a\xf5\x10\x4b\x4d\x99\xbf\x51\x04\x88\x6b\x13\x49\x6d\xb6\x40\x6d\x76\x99\x5f\x67\x15\x85\xb2\x95\xf3\x32\x59\x0f\x0e\xc0\xd7\x6b\x6e\x03\xcc\x32\x7d\x1e\x6f\x81\xef\x48\x78\x72\x63\x40\xd0\x1a\x51\x6a\x07\x6a\x6c\x96\xf0\x44\x12\xfc\xdd\x67\x69\x5f\x59\x86\x68\xf8\xbe\x2a\x43\x94\xc6\x89\x3e\xf1\xc8\x14\x51\xdf\xed\x2b\x6d\x6d\x29\x4b\xcd\x96\x54\xd7\x83\xab\xc9\x68\x8c\xdb\xb5\x0c\x17\x24\xf8\xc4\x53\x3a\xaf\x6f\x12\x7a\x3a\x50\x7b\x71\x5b\xed\xb8\x43\xb5\xe3\x58\xb4\x90\x7e\x59\x12\xd9\x5a\xe6\x95\x97\x5e\x19\x94\xab\x9e\x94\xb2\x39\xde\xe2\xf3\xb1\x50\xde\x95\x29\xe8\x35\xab\x96\x57\x74\x57\xaa\xa9\x20\x9e\x47\x6c\x71\x92\xbc\x54\x69\x2a\xc1\xe6\xcf\x07\x75\xc9\x54\x4c\xb5\x8e\x41\x29\x5d\x0a\x3c\x17\x92\x6b\x96\xc6\xa9\xc0\x50\x62\xb0\xcb\x1f\x5d\x35\x53\xd2\x83\xba\x9c\x29\x99\x46\x73\x9e\x9d\x2c\x88\x7e\xca\xb5\x20\x7e\x7b\x5f\xe6\xe5\x30\xc3\xf2\x71\x83\xf6\xfb\xbd\x18\xef\x04\xee\x9c\xb3\x8d\xd4\x78\x5d\x63\x09\xd3\x52\x7b\xa4\x87\x18\x32\xcb\xe0\xfb\x57\x9d\xa4\x5b\xd3\x72\xda\x53\x65\xd0\x1c\x2f\xe9\x1e\xce\x4e\x94\x96\x57\xa6\xc4\xd3\x4f\x9b\x28\xfd\x47\xbf\x17\xce\x1d\xa6\xa5\x17\xc7\x09\xcb\x58\x6d\x9a\x7f\x35\x38\xff\x3c\x32\x67\xad\xfe\x70\xfc\x3f\x0e\xcd\x8a\x53\x6e\x1a\xa2\xec\xe8\xcf\xee\x8b\xd6\x2c\x68\x33\x00\x36\x5b\xca\xbc\x4a\xcb\x1f\xfe\x61\x10\x53\x31\x98\xbe\xa1\xca\x7c\x77\x8e\x6d\xc8\x9f\x93\x08\x57\x75\xe3\x5e\xd5\xc0\x56\xec\xa5\xbc\xd4\xaa\x43\xda\x80\x3f\x23\x2e\x0c\xe3\xba\x0d\x2d\x48\x3a\xed\xbd\xc1\x59\x89\x7e\x9a\x4f\x97\x6f\x2e\xdf\x58\x6f\x2f\xdf\x2c\xdb\x6c\x28\xee\x73\xf1\xe9\xa1\xf8\x74\x50\x7c\xea\x14\x9f\xce\x8a\x4f\xdb\xc5\x27\x51\x7c\x6a\x15\x9f\xf6\x8a\x4f\x3b\xc5\x27\xbf\xf8\xb4\x5f\x7c\x3a\x29\x3e\x05\xc5\xa7\xeb\xe2\xd3\xa8\xf8\x74\x5b\x7c\xba\x2b\x3e\x3d\x16\x9f\x7e\x14\x2d\x14\x81\x42\x3f\x3f\x1c\x74\xce\xb6\x45\x6b\x6f\xc7\xdf\x3f\x09\xae\x47\xb7\x77\x8f\x3f\x9a\xc5\xe5\x66\x75\x0f\xdb\x9b\x5a\x93\x19\x0a\xec\xc7\xaa\xa8\x5a\xd9\x7d\x49\x0d\x95\xb2\x6a\x86\xa3\x06\xd8\x99\x43\xbc\xa7\x5c\xf7\xf3\xfb\x33\x8c\xa2\xb0\x54\x5e\xd8\x94\xe6\x3f\x81\x12\x3d\x7e\x20\x71\x63\x21\x6a\xbe\x7b\x10\x3a\xec\x0f\x18\x10\x15\x5b\xfa\x07\xc0\x1d\xa1\xaf\xce\xb0\x6f\xd0\xf9\x83\xd0\xd2\x06\x26\xee\xce\xd9\x80\xda\x38\xbc\x1f\x3b\x3e\x33\xf6\x0e\xde\x1e\xe5\xd1\x00\xf6\x1a\xe8\x68\xbf\x37\xff\x68\xbf\x20\x52\xff\x72\xf5\x56\x98\x0b\x08\x45\xe5\xc6\xfd\x9c\x7c\x78\xca\x5d\xd3\xd4\xe6\xbc\x30\xd7\xeb\xf7\x96\x70\xf6\xc1\x9d\x9d\x52\x86\xaa\x11\xa5\x7c\x0b\xf7\x0c\x21\xcb\x2b\x67\x76\x84\xe5\xe0\x46\xc0\xaf\x19\x9a\x0f\x52\x48\xdd\xb7\x1c\xc1\xaf\x4a\x1e\x88\x05\x67\x85\x9c\x22\x7f\x60\x04\x8a\x6e\xf9\x83\x5f\x5b\x62\xe2\xea\xf0\x5f\x82\x9e\x53\x4a\x7a\xa4\x62\x7b\x72\xf2\x4c\xa5\xc7\x82\x67\x21\xd2\x5e\x58\x75\x6c\xd4\x6c\xb4\x83\x66\xb5\xe2\x9a\x31\x3b\xcd\x1a\x53\x91\x4f\x91\xb2\xa8\x16\xdb\x70\x4a\x11\xb2\xa4\x27\xa7\xc4\xa9\x50\x9b\xde\x9b\x56\xf5\x95\x5c\x17\xad\xfa\xec\x31\x17\xf3\xbc\xf6\x51\x58\xca\xfc\xc0\x24\x2a\x19\x6a\x7c\x60\xea\xf5\x0b\xdc\x1f\x19\x20\x43\xd5\xae\x21\x96\xd6\x52\xb0\xca\xca\x4c\x61\x59\xd8\x3f\xa4\xeb\x40\xac\x0c\x2f\x10\xf6\xdc\x5a\x09\xc8\x4a\xa0\x84\x01\x35\x5d\x94\xba\x67\xd3\xdb\xb1\x92\xbc\xac\x3d\xeb\x6d\xe9\x99\x7b\x7c\xdf\xbc\x0a\x24\x62\xaf\x0e\xab\x5e\x62\xdd\x87\xea\xe0\xbd\x6e\x3a\xe7\x0e\xf0\x98\x6b\x3a\x5d\x49\x26\x90\xbd\xaf\x44\xfa\xf6\x28\x86\x47\x30\x58\xfa\xa3\x46\x61\x26\xd6\xfe\xf8\xe0\xd2\x49\xf5\xdd\xef\x1f\xdd\x58\x49\x27\x35\x6e\xa1\x45\x81\xf2\x8a\xf1\xd2\xda\x1f\x3c\x65\x1e\x72\x58\xcf\xbe\x1b\xea\xf9\x9a\xf3\x04\x71\x90\x5c\xc9\x15\x98\x1f\xc6\xa3\xc5\x01\xbb\xf6\x05\x57\x6c\xfd\x72\x4f\xb4\x04\x6c\xb0\xe6\xe0\xfe\x2a\x57\x18\x0c\xfb\x9e\xf0\xba\x0f\x39\x91\xc3\xa5\x6b\x09\xb0\x25\xbe\xd9\x2c\xe5\xce\x69\x06\xf1\x99\xeb\x0f\xa7\x12\x81\x5d\x6d\x44\x4f\xf0\x24\x96\x53\xb6\x3b\x72\xc4\xb9\xb6\xfa\x93\xb1\x2c\x3a\x6a\x87\xdd\x60\xc4\x97\xe4\x69\xbb\x3f\xa5\x0f\xcf\xf0\xa6\xa2\x07\x8a\xaf\x1b\xb4\x82\xa4\x32\xda\xab\xf8\xdf\x93\x94\x8d\xf5\x69\x73\x05\x92\xc7\xaf\x55\x68\x87\xae\xd1\x78\xd6\x30\x45\x25\xad\x20\x0e\x7f\x51\x3a\x02\x01\xc9\x96\x5e\xb4\xd2\x12\x54\x7e\x30\x88\x8c\xb1\x96\x7c\xcb\x5e\x71\x5d\xbe\x41\xf8\xcd\x65\x16\x8d\x17\x05\x73\x80\x31\x38\x40\x94\xf0\x39\x72\xc6\x8e\xbe\x0b\xa6\x32\xe4\xf9\x22\x56\x4d\x7c\xe7\x08\x5e\x29\x25\x53\x7b\x1c\xb5\x2b\x79\x5e\x59\xc6\x9a\x86\x7a\x21\x7d\x55\xa7\x1b\x3a\xd4\x26\x90\xbe\x84\x10\x6e\xd2\xc0\x62\x05\x4d\x7c\x4e\xc5\xa9\x50\xce\xeb\x84\x09\xa7\x45\x12\xa6\xdd\x09\xe5\xb9\xe9\xe9\x69\x65\x2d\xed\xd8\x49\x94\x0e\x4d\x28\xb1\xd3\x6f\x74\xaa\x80\x15\x48\x99\xd1\x6f\xdc\xd3\x6c\x48\x7d\xa1\x55\xe4\xe3\x17\xf3\x15\xab\x58\x58\xfd\x10\xd7\xa8\xd8\xb2\x1d\x2f\xad\x5a\xce\x91\x2e\xf1\xd1\x28\xf1\x55\x20\x35\xf0\x8c\x99\xd2\xca\xca\xc9\x4c\x65\x54\xa5\x93\x29\xbb\x9e\xea\x44\xec\x86\xfa\xd8\x87\x4c\xac\x6b\xdc\xa8\xac\xf0\x86\x5a\x59\xfb\x18\x63\x3d\xa8\xac\x47\xbf\xee\xff\x6f\x95\x95\xa7\xa7\xca\x4a\x3a\x04\xdf\xd3\x05\xf6\x52\x86\x14\xf8\xec\x1f\x80\x53\xc8\x87\x38\xbb\x64\x7a\xfe\xdc\x25\xf3\x92\x32\xf7\xcb\xcb\x67\x56\xbf\xfd\x17\x4b\x69\xbe\x46\xfa\x3f\x2c\x2b\xbb\x32\xb3\xa8\x3e\xfd\xbb\x0d\x30\xdf\x90\x02\xaa\x7b\xf5\x4f\x9d\xf9\xc7\x5d\x31\xcf\xc6\xc0\xff\xb2\x3f\x8e\x8c\x05\xca\x3c\xad\xea\x0d\x6c\x04\x63\x25\xa5\xab\x52\x2b\xc5\x27\x6b\xd5\x88\x90\x65\xad\x27\x6b\x4d\xd7\x19\xa8\x5b\x8a\x64\x1d\x04\xad\x97\x16\xcc\xd7\xec\x82\xb9\x7f\x11\xf0\x20\xc8\x00\x1e\x27\x80\x02\x1e\xb9\xe8\xf4\xec\x4b\x06\x04\x9b\x23\xc3\x2d\x17\x54\x8e\xba\x81\x00\x13\x66\x24\x54\x98\x30\x54\x93\x19\x6a\xc5\x39\x4f\x0e\x78\x56\x5b\x99\x15\xbd\x89\xa0\xb1\x46\x8e\xd2\xd5\x2b\x14\x0a\x29\x64\x46\x7f\xf9\xe9\x69\x95\x58\xaa\xe2\xef\xd6\x6f\xaf\x7e\x5f\x2a\x50\xfb\x78\xf5\x17\xdf\x5b\xbf\xfd\x2e\xa3\x7f\x07\x3b\xc8\xa3\x2f\x8d\x7f\xfa\x4b\x85\x39\xea\x83\xc4\x27\x69\x74\x8d\x35\xa9\xd4\x81\x96\xb9\x76\x6b\xf9\x77\xa8\xe7\xcd\x41\xd6\xdf\x5e\x1e\x1f\x39\xbf\xe6\xc1\x04\x1a\x06\xc2\x3c\xc4\xe1\x9e\x80\x8b\x69\x25\x73\xeb\xcd\x2b\xc6\x9b\x7b\xd6\x42\x71\x92\xa9\xc8\x9c\x54\xd1\x93\x64\x81\xaa\x52\x8f\x9e\xe5\x3d\xd2\x67\xdc\x23\x7d\xdf\x5e\x3f\xfd\xfb\xd3\xf9\xfe\xbe\x73\xd1\xb2\x93\xc0\xdf\x17\xbb\xf5\x9d\xbf\x89\x96\x39\xf9\x87\xdc\xe7\xbc\x4c\xe0\x95\xff\xf7\xfa\xc6\xc6\xa9\xc3\x56\x13\x1e\x32\xf1\x5c\x86\xb4\xac\x40\x09\x32\x8e\x26\x44\xc2\xef\x46\x46\x8c\x01\x09\x07\x13\x69\x02\xaf\x7d\x07\x56\x18\xcc\xd8\x83\xed\xad\xdd\xf3\x03\x9d\xc1\x4c\x91\xb5\xa7\xc9\xca\x8e\x83\x42\x36\x7f\xcf\x16\xa1\x0d\x41\xa0\x98\x59\xa8\x4c\x71\x29\x28\x97\x99\xf4\x64\x3d\x7e\xb6\x0f\xfb\x2e\x8d\x9d\xfa\xe1\xa1\xdc\xc1\x50\xd6\xc7\xc2\xf9\x49\xf4\xcb\xf9\xc9\x0f\xe9\x4e\xbe\xbc\x97\x7f\xb6\x2b\xdb\x6b\x69\x84\x8a\x79\x67\xc4\xa8\xa8\xf7\x69\xd4\x01\x47\xfc\x6e\xc0\xc8\x98\x3f\xcc\x5c\x32\xea\xcf\x34\x6a\x83\x23\x2a\x65\x03\x48\x45\x55\xcc\x7c\x2a\x6e\x25\x8d\xab\xcb\x18\xa3\xd9\x3a\xca\x6c\x38\xe2\x9e\xed\xb3\x99\x2e\xe6\xc0\x78\xc1\x41\xc7\x4c\x57\xb3\x29\x99\x2e\x67\x93\x8c\xae\xe7\xae\x61\x1c\xa1\xdf\x9b\x19\x81\x4c\x42\x66\x20\x32\x29\xc6\x78\xe4\x3c\x23\x3e\x33\x2c\xd9\x94\xcc\xe8\x64\x93\x56\xcc\x6e\x0e\xcd\x94\xd5\x4c\x3f\xd3\xa4\x57\xd3\xa3\x66\x24\xd2\xf0\x1d\xf5\x5d\x5a\x29\xea\xc7\xb8\x95\x34\x45\x85\x8e\xfb\xa5\xed\x09\xa4\x85\x1a\xdf\xf8\x3a\xe4\x04\xcf\x10\x74\xf2\x5d\xfc\x5d\x9a\x0f\x15\xea\x09\x0d\xba\x6d\x59\x9d\x36\x91\x9a\x04\xff\x16\x26\xc4\x47\x1e\x5d\x96\xcb\xa5\x72\x79\x39\xb6\x93\xcb\x3e\x29\xba\x77\xd2\x77\x7f\xae\x6f\x6f\x39\x8d\x15\x3b\x1f\xc0\xa2\xcf\xe5\xa4\xfc\x7e\x25\x2a\xf1\xcf\xbb\x12\x45\x6c\xed\xc0\xc2\x0a\x6d\xd8\x46\xd9\xce\xef\x87\x9d\xbc\xfc\x4b\x71\xe7\x9c\x6d\x23\xb4\xf3\xeb\xe7\xaf\x29\x62\x63\xab\xce\xe5\x50\xde\x3f\x23\xd8\x77\xa9\x03\x6c\xe3\xf3\x21\xc7\x76\xc3\xdb\xbc\xfc\x4b\x71\xa7\xfb\x1c\x77\xfa\x3a\xcf\x7f\x9a\xf6\xe6\x7a\x52\xd8\x26\x87\xb7\x3e\x31\xc4\xa7\xe1\xe6\x16\xc1\x50\x10\x91\x3b\x32\x92\x7e\xf3\xf2\x2f\xc5\xed\x1f\xa3\x65\x9c\x71\x9f\x73\x1e\x7e\xd7\xad\x28\x8b\x77\x28\xff\x60\x43\x7d\x53\xe2\x51\x0a\x7d\x24\xc1\x4f\x37\xb9\x67\x78\x43\x16\x30\x4f\xb3\x79\xaa\x3e\x29\xed\xc7\x9e\xd3\x78\x47\x89\x7b\x54\x40\xa5\x4c\x38\x23\xf9\x6a\xda\x5b\x7b\x94\x58\xf9\xc3\xce\x77\xf0\x50\xd6\x81\x1d\x9a\x2d\x94\x2e\x3b\x71\xba\x85\xc2\xb7\x3f\x1f\xa7\x6d\xc1\x88\xec\x6f\x23\xb6\xbe\xc1\xb1\x1b\xed\x21\xb2\xf2\x0f\xc5\x9e\x9f\x2a\x58\xaa\xdd\xcf\x27\x1f\x4d\xfb\xf3\xc6\x54\x29\x9f\x37\xd4\x67\xd3\xde\xd9\x4b\xc6\x6d\x67\x0f\x55\xee\x9c\xee\x31\x70\x07\x2f\x79\xf4\x87\x62\xce\x3f\x71\x0f\x3f\xe1\x15\x8f\xfe\x34\xed\x57\xbb\x5b\xa7\x1c\x75\x3a\xc8\xf3\x9f\xa6\xbd\xbb\x7f\x96\xd6\x2e\x28\x76\x77\x5f\x7d\x52\xda\x61\xda\x32\x78\x0f\xca\x9f\x8e\x10\x7b\xaa\xca\x68\x0b\x58\x80\xa2\x20\x22\xcf\xf6\x38\x32\x1d\x93\x2f\x07\x49\x03\xbf\xac\xa3\x81\x5f\x8e\xbf\xab\x01\x57\xf3\xf3\xe5\x38\x99\x9e\xbd\xd3\x8b\x74\x32\x50\xd3\xde\xa9\xfa\x6c\xda\xfb\x7b\xb2\x15\x54\xb9\x9d\x3f\xdb\xe7\x36\xec\xd7\xe5\x3a\xda\x47\xd7\xf6\xd1\xb5\xfd\xaf\x2a\x06\x50\xfb\x80\x39\x38\xac\xa7\x65\xc2\x3c\xd5\xc1\xa1\xfa\xa4\xb4\x6f\x87\xba\x71\x07\xe1\x3d\x5a\x77\xf0\x5d\xd5\x72\xc0\x2b\x07\x86\xbd\x8e\xd4\x22\xe0\x3e\x1d\x1e\x71\xaf\x8e\xd7\xd5\x14\x2e\x63\x8b\xe0\x2f\xc5\x6d\xcb\x85\x7e\xc6\x71\x67\x32\x6e\xe7\x38\x1d\x3a\xac\xae\xe3\x16\x46\xfb\x78\x4f\x8d\x1d\x5a\x49\x81\x11\xc3\xee\x1f\xca\x8a\x1e\xb1\xc6\xd6\x60\x25\x49\x7f\x35\xed\xd3\x23\x59\x38\xfd\xe6\xe5\x5f\x8a\x3b\xdb\xe2\x52\x82\x36\xe6\x9a\x42\x88\x3b\xdf\x90\x85\x50\xce\xb5\xb5\x32\xff\x5d\xc5\xdf\xd5\x4a\x09\x06\x8e\xe6\x45\x37\xed\xb3\x75\xd5\x6b\x39\x97\xfc\x43\xb1\xdb\x6a\x29\x25\x93\x79\xf6\x39\x99\xcc\x33\x8c\x56\x7d\x67\x43\xaf\xcc\x10\x8e\xa4\xf2\x14\x81\xe8\x53\xde\x82\xdf\x23\x3b\xff\xbd\xbe\x8f\x88\x0b\x89\x61\x0e\xeb\xd8\xf0\xf8\x4b\x71\x3f\xce\xb8\xf5\xf5\x33\xa0\x1d\xfc\x6d\xda\xe7\xeb\x3b\xe9\x70\xad\x51\x34\x45\x20\xfa\x2c\xa9\xf6\x9c\xeb\x3d\xff\x7e\xae\x23\x5e\x9f\x53\xf8\xeb\xe1\x56\x3a\xc7\x78\xd8\xfe\x7a\xa8\x3e\x9b\xc4\xa1\x64\xd6\xa9\xea\xdb\x0f\xdd\x63\x8a\xa2\xef\x7c\x53\x72\x44\x5f\x40\xc6\xb7\xb6\x37\x77\x0f\xd6\xf7\xff\x3e\xdb\x3e\x76\xce\x43\xfb\xf3\xe9\xd1\xf9\x31\x07\x4e\x43\x3b\xdc\x77\xb6\x42\xfb\x61\xd5\xf9\x16\xda\x43\xa2\x85\x27\xa1\x7d\x43\x3f\x75\xfa\x09\x85\xf3\x18\xd9\x1d\xfa\x09\x03\x42\xdf\xab\x0e\x9a\xb3\x02\x7f\x9a\x3b\x43\xe1\xe4\x0f\x05\xcd\x9c\x2e\xfa\x78\xbd\x4e\xdc\xfc\xa1\x93\xff\x8f\xfd\x9f\xff\x94\x4b\xff\xf9\xcf\x7f\xf2\xf6\x35\x7b\x7f\xdb\x2e\xe7\x6d\xb1\xa6\x12\x7e\xcb\xdb\xdb\x70\x43\xca\x1b\x64\x4d\xc2\xc2\x0d\xd3\xe4\x86\x22\x69\x54\x88\xe0\x1c\xf7\x5d\x6a\xb4\xfa\x49\x29\xca\x69\x3f\x63\xe2\x79\x7d\x0f\x37\xc7\x44\x59\x28\xa7\xbc\xf8\xbc\xbe\x11\xb0\xd4\x57\x96\xa1\xfa\x99\xbb\xa6\x3e\xcf\xfb\xae\x12\xa1\xf6\x1e\x5d\x1d\xf7\xe0\xae\xaa\xb8\xba\xbc\x4f\xf3\xc7\x3a\xcd\x0b\xd4\xfb\xc7\x9d\x2f\x12\xe9\xeb\xce\x9e\xb2\x0d\xf4\xe0\x1e\x29\x63\xd2\xb7\x6e\x3d\x54\x66\x8d\xb7\x74\xe4\xf8\x4a\xd7\xf5\xa3\xa2\x6b\xf8\x76\xa6\xac\x8f\x1a\xc5\xdd\xed\xe9\xda\x44\x20\x0d\x83\xff\xcb\x2b\xf0\xb3\x3e\xca\xb8\x70\x4f\xfb\xd2\x1c\x92\xb4\xd4\xd4\xbe\x9e\x5c\x7f\x1a\x0a\x1e\xa9\xad\x76\xdc\x1e\x8f\xa6\xed\xa1\xa8\xbb\x7a\xef\x91\x6d\x64\x26\x77\x5a\xfb\x42\x9b\x5d\xa6\xfe\x27\x0f\xe1\x88\xd0\xd6\x65\xc4\xfd\x3f\x14\xae\xc7\x73\x2a\xb7\x34\xf8\x72\xd6\x8e\x7b\xed\xa8\xed\x8b\xde\xf8\x97\xed\xf2\xc7\x52\xc1\x72\x4e\xc3\x68\xd2\x66\x8b\x8e\xe6\x58\xd7\x61\x2b\xca\xcc\x19\xe4\x88\x2d\x78\xdd\x4a\xdf\x62\xd4\x6b\x03\xcd\x5d\xdd\x14\x3a\x4a\xaf\x8d\xe1\x7d\xc3\x0e\x5c\xd6\x72\x28\x1b\xbe\x87\x28\xa2\xcb\xe6\xca\x6d\x08\xaa\x57\x01\xf6\xa1\xbb\xb8\xd8\xe3\x2f\xe2\x4c\xf4\xfb\x32\x5f\xb3\xb1\x0b\x0f\x75\x8a\xbf\x0b\x9d\xf2\x87\xa8\x16\x17\x8b\x4e\x58\x2c\x42\x6f\xa2\x43\x1d\xfc\x18\x2c\x2e\x76\x28\x68\xc8\xc5\x7c\x0b\x1d\x1e\x85\x38\x75\xf5\x74\x9e\x1a\x7e\xc8\x97\xf3\x90\x6c\xd0\x77\x82\x79\xf8\x80\x9a\x80\x4b\xfa\x65\x99\xa7\xa1\x03\x85\x79\x23\xe6\x5c\xd5\xe2\x06\x69\x35\x07\x4a\xb3\x21\x17\x84\x7e\xfb\x5a\x74\x73\xa3\x10\x72\xb2\xe3\xfe\x70\x34\xb7\xce\xc0\x0d\x8b\x51\x31\x36\x8b\x7d\x8c\x1c\x6d\xb0\xf7\xdb\xd9\x9c\x92\xa9\x1f\x74\x9a\xeb\x8d\xdb\x28\xfd\xe1\xda\xeb\x77\xe7\x17\xad\xb7\xc9\x42\x39\xd9\x93\x72\xb0\x8b\x15\x0c\x77\x3a\xbc\xc5\x57\x15\x78\xc1\x0f\xd9\x4f\x3b\x66\xc0\x4e\x37\x6a\x59\x4e\xe8\xfc\x7c\xc8\xf6\x2d\xac\x5a\x66\x2e\xaf\x4e\xc3\x86\x5b\xf5\x8f\xd4\xb1\xa7\xa7\xca\x47\x15\x6b\x74\x44\x74\x71\xcf\x4b\x13\x61\xf6\x64\xa6\xf9\xac\x10\x31\x25\x18\x0a\x9f\x2e\x4b\x58\x35\x95\xe7\xb2\xeb\x46\x58\xdd\x21\x2f\xf1\x80\x7d\x51\x05\xb6\x8c\xa5\x89\xc4\x7d\xdc\x52\x44\x0b\x2f\xa2\xd5\x16\xb9\x15\xed\xbc\x1b\xd0\x31\xe1\x33\x99\x25\xf8\x10\x3e\x3d\x05\x68\xa9\xc5\xe6\xed\x3a\xf3\x5a\x39\xd3\xb2\x58\xcd\x99\xde\xa3\x28\xac\x16\x2f\x05\x4e\xb9\xaa\xca\xd5\x7b\x9f\xe0\x96\xa8\x51\x1f\x93\xdd\x98\xa4\x94\xf5\xcb\x12\xe1\x51\x5e\x42\xb5\xc0\x89\xad\xa5\x50\xcf\x9a\x06\x25\x8c\x1b\x16\x15\x20\x7a\xa7\xea\xa4\x6e\xe8\xef\xbe\x06\x05\x46\xd6\xa5\x12\x9e\x94\x4e\x17\x68\xbf\x69\x1b\xe9\x34\x9d\x94\x29\xa0\x0e\xbb\x6e\x5c\xf5\xdd\x57\x3c\x9c\x7e\x82\x89\x33\xbb\x98\x37\xa5\xf4\x05\x67\xec\x43\xca\x18\xd5\x32\x8b\x04\xf8\xda\xc8\x67\x73\x9a\xeb\xdb\x1a\x83\x9b\x89\xda\x6a\x1e\xe5\x51\x98\xa3\xa8\xc2\x1a\xbc\xe8\xaa\xc6\x48\x9b\xcd\xd9\xc7\x9f\x29\xb1\x93\x4a\x82\xc4\x89\x5e\x4d\x11\xcc\x8c\x90\xdc\x8a\x09\x48\xd4\x33\x93\xb8\x6a\x26\x8a\xb5\x4c\xda\x5a\x92\xb6\xab\x1e\xaf\x88\x40\x5a\x19\x90\x77\xce\x9e\x7e\xd7\xaa\x64\x12\xde\xa7\x09\x2b\xd3\xf2\xcd\x86\x90\xde\x68\x32\x18\xf4\x87\x63\x63\x95\x81\x60\xf1\x93\x84\x29\xad\xb9\xa7\xa5\xdc\x04\x68\x9c\x57\x15\x2f\x75\x5b\xbc\x48\xba\x0a\x65\x9d\x3a\x8f\xf6\x14\x56\x54\xea\x0c\x69\xa1\x94\xe7\x57\x2d\x2f\x63\x43\x2a\x63\xb0\x51\x79\xa0\x28\x2f\x28\xf2\xbe\x97\x3e\xed\x1c\x8b\xe1\x08\x06\x78\xe0\x43\x05\xd6\x78\xfc\x71\xae\x37\xb9\xf6\x42\xe0\xc2\x51\x6e\x42\xad\x24\x7c\x86\x77\xed\x30\xc8\xeb\x07\xad\xb6\xa8\x8a\x79\x14\x47\x3b\xd9\x57\x2b\xc7\xf6\xe5\x7a\xc4\x0f\x4c\x9e\xa4\x69\xb4\x9a\x8c\xb4\x2a\xe1\x87\x48\xef\x90\x93\x07\x5a\xd0\x1f\x15\x14\xd4\xb1\x22\xc2\x24\x4e\x9a\xf4\x21\x4d\x62\x29\xce\x05\xec\xa7\xb0\xe6\xf3\x9a\x4e\xc1\x9c\x88\xe5\xdd\x92\x48\xce\x20\x15\xb2\xb8\x19\x34\x31\xfe\xaa\xd9\x08\x4b\x02\x73\x3c\xc8\x5e\xe0\x06\x19\x81\x20\x18\x6c\x59\xa8\x10\x65\x5c\x00\x65\xa4\x3f\x3d\xb7\x62\x0f\x5c\x63\x82\x89\xad\xb4\x47\x88\x48\xb8\x4c\x7b\x82\x20\x71\x93\xff\xc5\xe0\xb3\x11\x7e\x73\x0a\xa0\x31\x92\x9d\x04\x4d\xbd\x6f\x89\xf7\x42\xab\x3f\xbc\x0a\xa4\xa0\x2d\x53\x66\x6e\xef\xa3\x1b\x30\x46\xe0\x9e\xd9\x1b\xee\x3e\x2d\xce\x47\xed\xb3\x64\x63\x71\xf1\xcf\x8f\xee\x86\x75\x5b\x74\x37\xd0\x97\xd4\x2e\xf6\xa3\xeb\x0e\x92\x87\x33\x0a\x13\x16\xee\x58\x72\x63\x10\xf0\x79\x48\x68\x75\xa1\xfc\x6c\x40\x8f\x14\x34\x0d\xf6\xeb\xd6\x42\x12\x7c\x7a\xf2\x25\x2d\x92\xea\x92\x54\x27\x1a\x90\x36\x89\xa8\x92\x35\x5d\x83\x59\xec\xc4\x6c\x84\xd1\x82\xc7\xa8\xda\x99\x6a\xc1\x09\x51\x07\xfa\xa9\x87\xe8\xce\xa3\xd9\x13\x1a\xfa\x70\xdf\x2c\xa8\xb2\xe0\xf6\x54\x59\x3d\x3c\xd2\x61\x38\xba\xb8\x81\xc1\xb8\x69\x39\x81\x6c\x01\x74\x04\x78\xb9\x84\xed\xd5\x97\x4b\x90\xdf\x81\xdb\x15\x85\x5b\x6b\xb9\x07\xd1\xe8\x50\x19\x97\x4a\x76\x41\x67\x4f\x2e\xc0\x05\xb9\x00\x15\xa7\x47\x9b\xcb\x58\xb7\x9d\x3d\x1a\xc1\xa4\x51\xd1\x74\x11\x87\x5b\xf6\xab\x7f\x2c\xe3\x10\x62\x52\xfa\x0a\x29\xaa\x11\x11\x0c\xf0\x7a\x3f\x9e\x36\x3a\xa7\xbd\x75\xea\x52\xa8\xff\x74\xdc\xd1\xbc\x64\xd3\xf6\xab\xa9\xb1\x23\x57\x91\x36\x62\xe2\x6b\xca\xc7\x06\x5e\xd4\x09\x03\x54\x35\xd5\xbb\xdb\xab\xf9\xee\x79\xdf\x29\x04\x4a\x0c\x28\x90\xbe\x2e\xf1\x09\x85\x6e\xf7\x20\x41\xcb\x1f\x89\xb6\x96\x9d\xaf\x7d\x88\xaf\x96\x82\xf6\x6d\x7b\xd4\x1f\x6e\x10\x8a\xb6\xc3\x65\xca\x30\xe8\xdf\x15\x2a\xd0\xb4\xb5\x2f\x14\xa5\xa2\xec\x41\x36\x25\x70\x75\x5a\x90\x29\xda\x2f\xa2\xd4\xd2\x24\x80\x7a\x4a\x55\x98\x99\xcc\x8a\x94\x80\x92\x5f\x1a\x0c\xc3\xa8\x7d\x0f\x9e\x8f\x3d\x96\x96\xd9\xc0\x5c\xf9\x63\x65\x59\x48\x88\xa0\xa6\xd0\x89\x46\x49\x52\x6b\x8f\x87\x8d\x4d\xce\x89\xb7\x04\xb3\x54\x71\x2a\xd6\x5b\x75\x2e\xb2\x35\x9b\xa8\x1c\x14\x59\xdf\x12\x7a\xab\x99\x06\x22\xca\x87\xba\xc5\xe5\x44\xcf\x07\x83\xd5\xed\x43\xd7\x60\x59\x7e\x40\x10\x21\x94\x0f\x1e\x61\x71\x65\x7b\xa9\xf2\x2e\xdb\xa5\x50\xa2\xe1\x48\x73\x1d\xcc\xe3\x29\x83\x54\x67\xca\x6f\x42\xfd\xec\xe3\x2b\x95\xac\x64\x78\x08\x31\x85\xbf\xa9\xb4\xaa\x25\xde\xba\x28\x69\x69\xa9\x4a\x1c\x99\x5c\x78\x8a\x3f\x3c\xef\xd7\xa8\xda\xa2\x4d\x35\x52\x43\x9c\x42\xb8\xa4\xeb\x21\xf6\x8d\xb2\x25\xcd\x48\x62\x69\xc4\xd3\xbe\x46\xe8\x57\xd2\x4b\xc8\x96\xc8\xd2\xe7\x8d\x86\x72\x6b\x86\x01\x67\x84\x6c\x65\x06\xff\x70\xcb\xd1\x2c\x88\x9e\xb6\xd1\x24\xe2\x69\x9b\x16\x20\x33\x14\x68\x2e\xb2\x0a\x5b\xba\xb1\x82\x38\x35\x2c\x1f\x08\xf5\xd1\x89\xab\xc6\x2f\x49\xde\x5b\xdf\x72\xf8\xeb\x08\xea\x13\x6f\x7d\x1b\x69\x12\x96\x16\x71\xb5\x07\x2d\x71\x1a\x0d\xf5\xf4\xb7\xec\x27\x0f\x51\xc1\x52\xf8\x16\xbe\xba\xa0\x5f\x60\x1b\x3a\xd9\x3f\x69\x05\x3a\xa1\xfd\x79\x24\x1c\xff\xd9\x10\x65\xf8\x66\xe8\xde\xb2\x8e\x91\x3f\xfe\xc8\xd5\x24\x34\x82\x38\x85\x1c\x1b\x54\x4c\xc4\x90\xba\xe1\x68\x44\x07\x42\xd1\xcb\x11\xf7\x28\xd3\xf2\x50\x3e\x53\x3d\x54\xa4\x78\xaa\x87\x91\xeb\x61\x17\x10\x15\xf3\x4a\xd4\x0a\x22\x64\xe0\xc3\xe5\xae\x8b\xf0\x06\xd6\x75\xa1\x02\xed\x8f\xc1\x78\xc7\xb0\x1e\xea\x05\xb4\xf4\x3b\x1f\xd0\xf3\x2a\x5e\xf3\xfc\x71\xb5\x2b\xb5\x67\x65\x52\x99\x93\x6a\xf8\xb3\xd4\x71\x90\x6e\x9a\xf3\x3a\xa2\x1a\xa2\x6a\x65\x7b\xa5\xfc\xa1\x53\xb5\x7a\x74\x06\x29\xf6\x28\x8a\x07\xb5\xb3\x8c\x95\xac\xcc\x7e\x51\xf4\x3f\x91\xd1\x8e\x7b\xd6\xaf\xad\xfd\xe1\x50\xe4\xc3\xaa\xd6\x03\x98\xb8\x3d\x50\x3d\x26\x69\x11\x1a\xad\x0c\xb2\x45\xee\x04\x42\x34\x2c\x41\xc3\x92\xb8\x86\x90\x4c\x47\x89\x4c\x49\x41\x9b\xc9\x7c\x98\x62\xe5\x6d\x4f\x0b\xd0\x58\x76\xe5\xc3\x64\x29\x92\x9d\xfd\x51\x59\x5c\xac\xb8\x6e\x81\x22\xac\xdf\x64\x90\x33\x8f\xd4\x4a\xee\x12\xdb\x3e\xa7\x42\x9a\x54\xe2\xeb\x9f\x9e\xba\x44\x25\x5f\x31\xc0\x00\x72\xa3\x47\xc5\x42\x5c\x54\xf7\xfe\x3e\x1f\xb5\xab\x92\xd6\xc0\x7e\x00\xce\x6c\x8b\x8b\xfe\x47\xaf\x58\xa9\x5a\x3e\x36\x23\xb7\xba\xf2\x72\xcf\xa8\xd5\x22\x69\xb5\x61\x00\x2a\x55\x92\xf7\xd5\x76\xba\x81\xcb\xd7\xf2\x47\x8f\x0e\x09\xee\x92\x67\x27\xd1\x63\x48\xac\x09\x1c\x29\x95\x50\x31\x45\x0e\x99\x15\xa7\xb6\x7a\xc6\xfb\x04\x4d\x06\x1d\xde\x79\x32\x6c\x69\x20\xad\x1a\x62\x2d\xd4\xd9\xe0\x9d\x52\xa1\xa9\x2a\xed\x22\xc3\x91\xab\xd6\x8d\xd0\xaa\x1c\x2c\x24\xf6\x07\x5b\xc2\x7e\x07\x39\x30\xfd\xde\xba\xb4\xf6\x47\x35\x79\x3f\x49\x26\x3c\xd9\xdb\x9c\x41\x7c\xa0\xa1\x29\xd7\xc4\x92\xe7\x2c\x55\x8c\xfd\x54\xef\xcf\x1a\xe7\x3b\xb2\xc1\x26\x62\x07\x68\x36\xe9\x43\x94\xe1\x96\x20\x3a\x94\x70\x4b\x68\x55\xec\xba\x07\xa1\xa5\x78\x98\x08\x2a\xc7\x06\xe7\x82\xb4\x9a\x0c\x14\xed\xa0\x08\x48\x87\x2a\x08\x13\xde\x23\xb4\x28\x36\x96\x41\x75\x20\x8a\xd3\xdb\x11\x7d\xf9\xa1\x2f\x2c\xf4\x35\x85\x94\x7d\x4f\xc4\x0a\x02\xf5\xf0\x4f\x68\x83\x1d\xa4\xbf\xd0\x14\x4a\xb7\xd2\xa6\x08\x3a\xfc\x64\xea\x15\xb8\x1c\x54\x75\x97\x1d\x82\xc0\x0b\x14\x01\x35\x1b\x95\x66\xf6\xfc\x25\xc7\x01\x69\xb4\xdd\x08\x2a\x66\x16\xb8\x88\xa1\xe8\x10\x70\x2d\x76\xe2\xe2\x28\x2c\x76\xd8\x3f\xb0\x91\xb3\x92\x29\x75\xa5\x69\xea\x98\x6e\xf1\xe5\x4b\x05\x86\x6b\xc6\x57\x09\x46\xeb\x43\x17\x4c\xf0\x85\x21\xf1\x60\x41\x51\x32\x6a\x66\x99\xa1\xec\xf4\x2f\x32\x12\xeb\x45\x19\x5f\x49\x0e\x6d\xea\xe8\x86\xc1\x4f\xac\x03\x06\x7c\x77\x48\xc7\xee\x9f\x92\xb2\x3b\x47\xb6\xa4\x15\xf4\x61\xd0\x7f\xc7\x54\x2c\x38\xc8\x1a\x12\x81\x63\x62\x30\x33\x47\xfd\x12\x5e\x85\xe9\xe7\x6c\xcc\x1c\xfd\xea\xc7\xc4\xe6\x2c\xd1\x5a\x4f\xd9\x43\xae\xac\xb1\xca\x0d\xf1\x63\x09\x06\xf6\xac\x66\xd6\x84\x17\x81\x13\x40\x89\x9f\x16\x13\x1d\x1c\xda\x75\x0b\xb4\xed\x69\x69\xb9\xcb\x85\xc6\x5f\xe5\xe6\x5b\xab\x50\x2e\x5a\x85\xd2\x5b\x6b\xb9\x31\xf6\xd8\xa5\x7e\x4d\x77\xc3\x87\x8b\x4d\xd5\x13\xbf\xb1\xda\xcc\x74\xc6\x5b\xa2\x05\xb2\xd2\x94\x12\xb3\xcf\x0e\xf1\x60\xe7\x7d\xc3\xc0\x58\xbf\x60\x08\x1e\x42\x6c\xb7\xf2\xc1\x2d\x48\xaa\x0e\xe9\xf9\xe2\x1c\x6d\xe7\xa3\x14\x8d\x48\x71\xd9\x44\x1a\xc6\x73\xbd\x25\x2e\x71\xa9\xc2\x7e\xa4\x3f\x2c\x25\xbd\xf4\x33\x1c\x1a\x63\x7e\x41\xa4\xf2\xad\x5f\x35\x52\x52\x15\x48\x09\x40\xd4\x73\xd9\x7f\xae\x26\xb2\xba\xfc\x17\x86\x5f\xac\xea\x5e\xbf\xf4\x89\x85\x0f\xdd\x9f\x2c\xd7\x00\xe1\x4e\xa7\x6c\xef\x1f\x1d\x7e\x96\xdf\x15\x5b\xbe\xf8\xcb\xd0\x8a\xf4\x59\x21\x03\xab\x36\x67\x81\xa4\xa7\xb3\x26\xb3\xf0\xf7\x3b\x9d\x85\x43\xef\x55\x16\x0e\xfc\x6e\x27\xb5\x70\xf8\x8f\xb4\x26\x0e\xff\x69\xd6\xc6\x31\xd4\x9d\xb4\x4a\x19\x53\x91\x8f\x11\xdf\xfb\xee\x61\xbf\x7a\x9a\x76\x60\x77\x22\xa8\xb9\x67\xf4\x77\x05\x0f\x11\xab\xf6\x16\x7d\xae\xd9\x9b\xf4\xf7\x9d\xbd\x41\x7f\xdf\xf3\x18\xf0\x65\xb7\x7d\x9a\x8e\x01\x15\x31\x0a\xc7\xdb\x3d\x9a\x3e\x3f\x5c\x1f\xf9\xed\xf6\x9c\xdb\xe5\xb3\x3e\xbc\x5b\x11\x68\x7b\xf4\x2b\xc8\x44\x9c\xfd\xac\x2f\x5b\xf9\xa3\x4f\x7b\xb1\xba\x4b\x1c\x17\x6d\x28\x29\x9f\x09\xa1\x14\xf7\x4b\x3f\xdd\x1c\xaf\x59\xeb\xe6\x75\x5f\xb9\x48\x96\x24\xe8\x2b\x78\x10\x77\xde\xe5\x03\x33\x6a\x5b\xa9\xa9\x65\x77\xbb\x95\xec\xe7\x51\x04\x7b\xbf\x09\x5b\x43\x87\x60\x36\xf7\x2b\xd5\x76\xed\xdc\x9d\x18\xe5\xf2\xc5\xd4\x90\x14\x8a\x82\x22\x35\x7b\xd6\x36\x3c\x60\x0e\xd0\x20\x31\x40\x83\x8e\xfc\x17\x55\x04\x8e\xcf\xb3\x82\xf9\xde\x40\x5f\x9f\x37\xf6\xa4\x85\xf7\xef\x05\x6f\x60\x0b\xa2\xcd\xfb\xc4\xf2\x0d\xb2\x72\xe2\x20\x5b\x10\x28\xda\xe8\x15\x1a\xac\x2f\x6e\x2b\xa3\x44\x75\x88\x99\xaf\xb7\x6c\xe6\xc2\x38\xb0\x19\x3f\x37\x53\x97\x87\x30\xb7\x33\x68\xa9\xf0\x48\xb9\x40\xe4\xc0\xc5\x80\x28\x21\xa8\x55\xe0\x0b\xfb\x38\xd2\x97\xfe\xc7\x3a\xfa\x82\xa2\x4f\x92\xe8\xaf\x14\xcd\x16\x3c\xbf\x7a\xc2\x5e\x50\x66\xd5\x4b\x27\xbe\x7a\x42\x51\x46\x27\xbf\x1a\x76\x42\x92\x0b\x15\x82\x99\x99\xd2\xc2\xfb\xf2\xdb\x25\xc1\xd6\xc1\x79\x9e\x06\x2e\xed\xb3\xf5\xa0\x89\x86\xb8\x3f\xcf\xee\x85\xb3\x1f\xdb\xbd\x07\x62\x56\x5b\xf6\x98\x7e\xa2\x96\x5c\xd9\xd4\xd5\x67\xb4\xca\xfd\xa9\x54\xda\xa4\x2e\x9b\x3d\x78\x14\xce\x6e\xcb\xbc\x0e\x3b\xd5\x48\x74\xea\x4a\x70\x23\x76\xa6\x7c\x98\xec\x27\x22\x52\xb2\x0d\xa5\x64\xdb\x49\x6a\xe0\xb7\xa6\xd2\x93\x6d\x28\xd3\xa3\xe9\x74\x63\x5b\x2a\x01\xbb\x69\x88\x74\x97\x3e\x33\xc0\xe6\x7f\xd1\x28\xec\xeb\x7f\x6a\x58\x0a\xf3\xab\xc6\xa5\x50\xbf\x68\x20\x80\x64\x23\x77\x5b\xff\xae\x91\xff\xd4\xc0\x7f\x6e\xdc\x3f\x36\x8c\x1b\x35\x25\x89\x36\x6f\x9c\xe8\xa4\xc3\x3b\xa9\x14\x77\x7f\x75\x4d\x1c\xc7\x8e\x70\xbf\xf7\x4b\x89\xc8\x9a\xc9\x0c\x1c\x47\x94\xd8\xf6\x84\x19\xf7\x25\x32\x32\xa4\xa2\x6c\x26\xc8\x04\x20\x33\xa3\x39\xc5\x2a\xcc\x81\xe0\x66\x27\x68\xe1\xa7\x76\x28\x49\xa7\x53\xb5\x75\x88\x55\xb0\x18\x37\x4f\xe3\x88\x14\xe9\xfd\xe8\x15\x68\x8f\xd8\xd2\x60\x84\x56\xe6\xdd\x88\x59\x99\x77\x33\x9e\x36\x1f\x71\x72\xc4\xa6\x3b\x5c\x36\x1b\xa1\x8c\x48\x07\xd2\x76\xb4\x3c\xcd\xb3\xf9\x88\x50\x9a\x8f\x38\x4b\x2e\x36\x6c\x76\xf7\x58\xbf\x47\x8a\x32\x16\x21\xc7\xfa\xf8\x7c\xf6\x85\x70\x14\x3c\x3d\x15\x34\x0e\xd2\xb5\x6a\x7c\x93\x2a\x5e\x25\xa5\x2b\x50\x9b\x15\xc2\x64\xb1\x27\x47\x73\xac\x19\x28\x34\x97\x31\x3e\x24\x77\xbe\xc6\x71\x69\xe1\xc0\x9f\x7b\xfd\xac\xea\xc4\x59\x86\xaf\x50\x17\x4b\x09\x03\x71\x94\x28\x50\xc0\x7e\x8f\xf2\x44\x87\x27\xa1\x39\x08\x4d\x8b\x55\x82\xf5\x4a\x45\x3f\xa5\x30\x3a\x06\x8a\x10\x28\x4c\xbc\x64\xfc\xfb\xa4\xd7\x05\x87\x6c\xc5\x28\x30\x9b\x16\x0c\x0c\x9b\x32\x59\xd4\xaf\xde\x0d\xcf\xf8\x61\xcf\xa9\xd3\x54\xc7\xc3\xfe\x64\x40\x54\x4b\x45\x9d\x43\xb5\x3d\x73\x79\x4f\x64\xbe\x17\xc6\x62\xdc\xbe\x0d\x8f\xc5\x30\xec\x8d\x1c\x3a\x91\xcc\xb2\xa4\x23\x98\x9b\xf9\x44\x19\xfb\x43\xa7\x92\xd0\x91\xde\xa3\x7b\x0c\x0b\xed\x21\xd0\x3b\x75\x03\x06\x8a\x4b\xd9\xf2\xe9\x6c\x89\xa1\x9c\x8d\x2d\xe8\x12\xda\x9a\x94\x74\x46\xc2\xad\xa3\xb8\xd7\x9e\x8e\xba\x5d\x95\x31\x03\x3f\x89\x09\x15\xd0\x50\x13\xaf\x3b\x1d\xf3\x59\xc7\x10\x3f\xee\x7e\x47\xcc\x43\x92\x6d\x12\x32\x99\xf2\xec\x47\x44\x25\x3e\x7e\xcf\xb9\xf0\x16\xcc\x1d\xaa\x28\x69\xa9\xba\x4d\xdc\x68\x24\x0c\x67\xc0\x14\x6a\x64\x20\xf4\x10\xb4\x77\xdd\x03\x14\xb2\xa7\xec\x64\x95\x95\xce\x67\x7b\x37\xbd\x29\x39\xc3\xe0\xe5\x22\x1e\xbd\x84\xab\x10\xb9\x41\x1f\x1a\xab\xb7\xfa\x52\x9d\x1f\x6e\xbe\x17\x02\x49\xeb\x59\x72\xee\x2b\x08\x9a\x9a\x54\xe7\x54\x62\x04\x62\xd0\x68\x36\x60\xc2\x13\x4f\x2d\x3a\x96\x18\x36\x7b\x10\x12\x43\xd5\x1b\xeb\xa8\x70\xdf\xf6\x27\x43\x9a\x52\xff\x41\x47\x11\x2f\x67\xe7\x47\x10\x0e\xce\xeb\xa8\x4d\x44\x75\xfb\xbd\x38\x89\x21\x26\xef\xd9\xbe\x88\x20\x19\x61\xd3\x12\x72\x7f\x64\xaf\x40\xce\x65\x54\x7a\x09\x12\x0e\x4c\x10\xf5\x9a\x04\x3c\x14\xcc\xc1\x43\x2f\x98\xab\x61\x77\x0f\x6c\x9d\xc6\xd7\xe8\x25\x90\xe8\xc5\x9f\xb2\x2f\xa8\x8c\x08\xf0\x18\x1f\xf9\x38\xcf\x33\xae\x21\x30\xdc\x32\xc2\xe4\x93\x5e\x02\x96\x7a\x8a\x97\xd6\x6b\x00\xf0\xa9\x65\x5f\x78\xa2\xa8\x01\x8a\x31\xb0\x13\x6e\x9c\x83\x79\xf8\xc9\xb0\xda\xe4\xb9\x62\x59\xcd\x6a\x35\x45\x07\x6a\x3d\xe8\xfb\x69\xb5\x9e\x93\x5b\xea\xd4\x20\x8e\x5e\x81\x7c\x49\xa5\x3c\xa6\x5b\x89\xa6\x5e\x72\x2f\xdd\x7b\x64\x9d\x1d\x3e\x6e\x40\xa2\x9a\x6d\xb2\xa4\x9a\x3c\x36\x5f\x29\xd6\x43\x2b\x75\x73\x63\xde\x6b\x52\xcd\xb8\xc5\xe6\xcc\x6f\xf9\xae\x59\x35\x40\x5e\xcb\x2e\x07\x16\x70\xb9\x8a\x0b\x7f\x93\x76\x42\x57\x59\xa9\x4b\x2f\xfe\x55\x9e\x91\x90\x0d\xc6\xfd\xb6\x6a\xf3\xfb\x78\x41\x5e\x64\xb2\xb2\x23\x2e\x72\x6d\x0d\x6a\x6b\x15\x48\x34\x48\x96\x83\xc7\x7c\x03\x78\x75\x0e\xb0\xbe\x31\x65\x57\x63\x69\xaf\x39\x4e\x23\x01\x8b\xcd\x55\x1a\xa9\x81\x3b\x11\xa2\x08\x73\x4f\x7c\x85\xc3\x05\xb1\x45\xcb\x64\xc8\x31\x58\xfa\x6e\xb5\xaa\xb1\x7f\x28\x88\x8d\xd7\x28\xc2\x98\x04\xf6\x6d\x46\x33\xf1\xea\x10\x7e\x3d\x60\xf9\x42\x99\x9d\x00\x36\x3d\xed\x27\xae\xb4\x6d\xe1\xbe\x70\x54\x21\x72\xf8\xd2\x79\xa7\xb0\x40\x5b\x07\x5a\x06\x6c\x14\x14\x36\x3c\xe7\x36\xe7\xe5\xfc\xc2\x30\xea\x95\x22\xfd\x6f\x33\xa6\xa2\xa1\xa7\xcf\x76\xa1\x87\x40\xba\x9f\x1e\xac\x9a\x70\xa4\xe9\xe8\xef\x0c\xeb\xa0\x37\xd1\x20\x63\x05\xe4\x87\x29\x03\xfc\xf3\x19\x2b\x80\xcd\x7a\x2c\xb0\x45\x0f\xe9\xac\xc4\x2b\xdd\xba\x59\xfb\x54\xb6\x57\x92\xe6\xa1\x94\x9b\x0a\x02\x30\xcc\xf1\x24\xce\xab\x45\xe9\x56\x59\x9f\x2f\xdd\xaa\xb5\x9d\xa4\x44\xa8\x2a\x93\xc9\x67\xa6\xa3\xd5\xb2\x32\x85\xe7\x24\x4b\xb2\x2d\xa3\x91\x2f\x6b\xaf\x4e\x9e\x52\xf1\xe4\x2d\x6f\x9e\x0b\x6f\xa2\x37\x96\x4d\xb9\x72\xa3\x01\xa1\xc9\xa8\x1d\x06\xb6\x81\x61\xe5\x89\x0d\x88\xd5\x68\xcb\x20\x31\x62\x42\x95\x0c\x5c\x44\x24\x55\x2f\x50\x8b\x16\x17\x33\xbe\xb9\x7d\xe3\x55\x74\xd8\x27\x1c\x3b\x6e\x87\x23\xaa\x78\xf0\x8b\x8a\x89\x43\x60\x1b\xc4\x8c\xd2\xd5\x3d\xfb\xad\x43\x03\x67\x47\xf4\x37\xb2\x07\xf4\x77\x60\xde\xb6\xbf\xce\xb0\x1b\xa9\xc5\xc8\x2b\x6a\xcd\xa3\x72\xb0\xc3\xb8\xd3\x67\x4b\x34\xf0\x35\xad\x60\x4a\x41\x38\xa2\x66\xdf\x19\xd2\x4a\xaa\x99\x0f\xb9\x3c\xd2\x58\x5c\xe9\x4d\xd1\x37\x0e\xb4\x5e\xbf\xdf\x0d\x45\x0f\xad\xa3\x32\xbf\x7b\xba\xcc\x05\x5a\x4a\x5e\x49\xfa\xbe\x09\xad\x79\x05\xaa\xb4\x39\x65\x8a\x9c\xee\x0c\x77\x3a\x33\x6d\x7e\xf1\x8d\x39\x36\x7d\x1e\x1b\x56\xa7\xa4\x6c\x54\x66\x77\x72\xdd\xcb\xe7\x06\xaa\x96\xd2\x1b\xab\x1a\x0f\x58\xc9\x44\x26\x99\x36\x5b\x44\x9c\x0c\x54\xca\x10\x15\xd8\x28\x67\xe2\xd0\xe8\x05\x65\xd5\x08\xbe\x3e\x62\x55\xa6\xdd\x75\x3d\xca\xd6\xc1\x1b\xb4\x47\x9c\x2a\x7d\xc8\x44\xee\x5f\x4d\x61\xf8\xae\xfe\xd8\xa8\x95\x9d\xa5\x8a\x93\x84\x2a\x4e\x02\x5b\xe8\xda\x1b\x96\xd3\x1a\x30\x5d\xa3\x62\x10\x54\xcf\xea\x1d\x4d\x0a\x3a\x6f\x0b\x31\x4f\x94\x7c\x80\x4b\x8d\x86\x10\x1c\x7b\x74\xb1\x02\xd7\x4f\x56\xa1\x9a\x5a\x1f\x24\x92\x07\x82\x5f\x71\x1a\x3f\x65\xcb\x1d\xff\xb9\x39\x07\x94\x56\x33\xde\x7c\xb9\x30\x7e\x11\xfe\xc8\xca\xeb\xc9\xda\x1d\x11\xd1\xdf\xe4\x02\xf8\xf1\x9e\xa6\x21\xbc\x1e\xd0\x94\x8a\xe1\x50\x3c\x94\x72\x07\x98\x9e\x96\x20\x66\x44\x8c\x73\xb4\x38\x28\x44\xcc\x6b\x2e\x94\xaf\xfb\xa5\xbc\x69\x24\x8b\x38\xcd\x08\xcf\xae\x31\x0d\x74\x2c\x07\x3a\xd6\x03\xdd\xa1\x81\xf5\x1b\x71\xd3\xf0\xa4\x81\x20\xba\xd2\xe1\x04\x9b\x7b\x84\x71\x72\x93\x0e\x51\xf4\xf3\x4c\x97\x38\xd7\x2b\xea\x96\xcc\xa7\xe7\x4d\xee\x14\x2e\xe9\xd0\x27\x12\x5e\xec\x28\xcf\x34\xb9\x5f\x74\x95\x3b\x69\xe7\xbc\xc9\x98\xa5\x16\x30\x73\xfd\x11\x21\x11\x38\x70\xea\x75\x1f\xd4\x8a\x1c\x41\xe5\x57\x09\x38\xa8\xbd\xd1\xc1\x42\x0f\xd3\x51\x94\xc5\x52\x64\x10\xde\xe7\xf2\xc5\x0e\x6d\x00\xaa\x21\x98\x0c\xba\x6d\x5f\x00\x2d\xb5\x61\x20\x30\xa9\x1e\xa5\x84\x8d\x4e\x13\xa2\x0c\x11\x68\x57\x17\x9a\xcf\x91\xdc\x1d\xaa\x27\xf6\x81\xcf\x16\x46\xa1\x75\x97\xdc\x0d\xa7\xa6\x77\x07\xe6\xf9\x4d\xb2\x48\xfc\xb2\x24\x31\x85\x74\x87\x47\xf8\x1b\x47\x9c\xf2\x47\xfa\xe3\x7d\x34\x31\x96\x36\x3b\x87\xa0\x6e\xb4\x57\xcc\x97\x72\x67\xad\xfe\xa4\x1b\x60\x43\xb6\x71\x0f\x15\xe6\x86\xa2\x17\x87\xb9\x46\x79\x29\x5f\xe4\x87\x9e\x62\xbe\x39\xbb\x91\xf3\x75\xe1\x11\x27\xab\x54\xac\x29\x6e\x5a\x01\x3a\x9e\x6a\xee\xce\xff\xd6\x5c\x3f\x3b\xcc\x53\x2d\x16\x48\x19\x87\x71\x38\xfc\x7f\x68\xbc\x9f\xce\x90\x61\xac\x78\x60\xfa\xed\xd0\xb7\x83\x0b\x5e\x0c\x53\xe8\x86\x69\xc8\x01\x31\x8f\x7e\xd1\x83\xd5\xa5\x22\xe3\xc2\xe9\x06\x67\x06\xc5\x8b\xc5\xb4\x6f\xb8\x69\xe7\x6f\x9a\x38\x55\xa7\x2e\x52\xea\x8e\xa4\x55\xf5\x34\x83\x71\x95\xb0\xdd\x72\x12\x7a\x39\x2f\xfd\x2e\x56\xe9\x89\xef\x9e\x6c\xfa\x46\xec\xe8\x5b\xa6\xb6\xf6\x55\x36\x0f\xee\x0b\xd7\xd3\x95\x86\xb2\x56\x94\x64\xdf\xbb\x8f\x82\x4d\xf3\xa6\x4c\xfc\x42\x62\x67\x72\xca\xef\x95\x50\x7e\xaf\x52\x9b\x76\xf5\xa7\x27\xfa\x2b\x39\x53\x08\xe8\x26\xe2\x9a\xec\x14\x8a\x18\xb4\x46\xb9\x89\x15\x22\xd8\xcc\xeb\xbb\x3f\x3f\xc8\x0f\x44\xac\xe8\x88\x95\xa6\xf4\x8e\xbf\xe6\xba\xb2\x45\x9c\x6f\x95\x92\xff\xfc\x13\xe9\xab\x4d\xb6\x59\xc1\xde\x82\xd8\xba\x87\xee\x9a\x61\xc8\x35\x9d\xa4\xd6\x60\xe6\xbc\xef\x59\x19\x76\xcb\x67\x1a\x90\xf2\xff\xc9\x6d\x40\xe2\x77\x4f\x5f\x1b\xd1\x78\x61\x54\x04\x0d\xc6\xea\x47\x51\x15\x18\x09\xb6\x19\x2c\x9a\x84\x2e\x85\x96\x86\x91\x85\x21\xe2\x83\x97\xc6\xe6\x2a\xcf\x9e\xbb\xf6\x11\x4f\x82\x54\xa1\x47\xdd\x20\xe6\x65\x8d\xb1\x39\x85\xf1\xa4\x92\x3e\x38\x32\x3d\xf1\xd9\xc3\x61\x79\x5a\x01\x33\x9b\x6a\x98\xa3\xf7\xf5\x72\x54\x9b\xb5\xaa\x37\x2b\xd6\xbb\x9d\xb8\x0c\x93\xf6\x40\xed\x98\xe8\xa2\x44\x3b\xe9\xfb\x74\x87\x09\x2b\x3f\x47\xf2\x19\x0d\x12\x14\xca\x54\x7d\x6c\xfd\x0c\xdd\xc0\x8d\x53\xc3\x8b\xea\x76\x44\xf5\xee\xe7\x75\xbb\x27\x99\xca\x6b\x71\xaf\xad\x9f\xa2\xe0\x62\x31\x29\x78\x4e\xa9\x3c\xb9\x34\x45\x3e\xb5\x07\x3e\xc1\xdc\xd8\x51\xe1\xd0\x8e\xa5\xd5\xc4\x38\xb9\xd0\xe1\x3a\x02\xae\x20\x34\x99\xac\x20\x9e\xf6\x54\xe7\x4a\x76\x22\x39\xf5\x65\xec\xd1\xa3\x0d\xec\xa8\xc4\xe6\x61\x21\x82\x17\xaa\xab\x30\x39\x0a\x61\xfa\xde\x1d\x59\xd5\xde\x15\xb1\x13\xe9\x9b\x80\x81\xc2\xc3\x97\xc6\x5b\xe3\xf2\x74\x29\xd1\x79\x2f\x7d\x1d\xe6\x0a\x71\xe7\xe6\x57\x8b\xc5\x50\x56\x94\xdc\xb8\x69\x81\x1a\x85\xa5\xb8\xf6\xec\x49\x5b\x3f\x5e\x0d\x68\x20\xf9\x65\x42\x57\x1c\x40\xea\x31\xc6\xd9\x32\x56\x27\x31\x79\xea\xab\xe0\x7a\x2f\xf1\x0e\x27\x7d\xbc\x05\x70\x4e\x47\x9c\x0c\x97\xd2\xb1\xe1\x88\x84\x33\x75\xc0\x51\x77\x34\x1f\x13\x1b\x83\x1c\xc5\x26\x27\x3b\x64\xab\x9b\x7a\x45\x32\x2b\xf3\x2f\x7c\xe4\xc1\x0c\xad\xa6\xf7\xb1\xbe\x06\x88\x2c\x5e\x89\x5b\x18\x6c\x2a\xf9\xa4\x25\x49\xf3\x4f\xc9\x6a\xa1\x85\x1d\x5a\x1c\x61\xa3\x1f\x18\xfe\x21\x13\x01\x35\xb9\x8e\x42\x3c\x84\xf2\x9b\x90\xb4\x1d\xcd\x31\xe2\x9e\x63\xac\x64\xad\xc6\x46\xa2\x02\xc7\xa1\x51\xd7\x90\x44\x5a\xb3\x85\x40\x1e\x23\x85\xd3\x25\xa7\xd6\xa9\xe5\x90\x84\x30\x65\x09\x13\xa8\xfc\x51\x88\x71\x67\x6a\x0b\xa3\xd5\x09\xa6\x32\x28\xab\x41\x44\x16\xe4\xb0\xf2\x67\x57\xfa\x18\x82\x8d\xa2\x0c\xbf\x27\x87\xef\x53\xbb\x3b\x86\xb8\x66\xca\xa5\xc3\x54\x90\xc1\xf9\xe5\x4d\x9d\x0b\x76\x4e\x92\x9d\x14\xe3\x34\x42\x13\x23\xcf\x89\x0b\x05\x75\x24\x69\x60\xa8\xa5\x99\x16\x39\x1d\x1e\xbb\x64\x8c\x8d\xef\xb0\x95\x42\xea\xb6\x7d\x23\xea\x19\x14\xdf\x34\x65\xab\x98\xe9\x1c\xa4\x27\xab\xe4\x3c\x20\x7a\x41\x2e\x2f\x85\x88\xec\x5c\x5e\x0f\x7a\x9e\x78\xb4\xbc\x1e\xd9\xfc\x1b\x63\x2d\xa0\x12\xc2\x04\xff\x5d\xed\xf2\xf4\xf6\x90\x0b\xdb\x78\xf2\xd6\xf5\x81\x11\x94\x3c\x85\xd1\xb0\x42\xda\x06\xb4\x6d\x79\xba\x21\xcf\xe9\x02\x56\x8b\x17\x6d\x0b\xa5\xcd\xeb\x97\x38\xc8\x70\x8a\x83\x4c\x99\x09\x35\x75\x60\x50\x5e\x31\xe6\x08\xad\x2a\xf3\x27\xb4\xfd\xa9\x0a\x5e\xe7\x55\x9f\xf6\x27\xe4\x4e\x9f\x61\x67\xa9\x1a\x18\x98\xda\xbc\xae\xd7\x7b\x92\x0d\x8b\x4b\x9b\xb6\x73\x0c\x6c\x76\x06\x19\x07\x1f\xd3\xac\x08\x11\x35\xe3\x02\xbb\xf2\xe7\xef\x65\x98\x2d\xb0\x41\xa9\x6d\x50\x67\x1b\x14\xd9\x96\x04\xb8\x0c\x39\xc5\xcd\x48\x4a\x35\x83\x60\x33\x35\x0e\x8a\x6e\x14\x55\xf1\x89\x3b\x9d\xa2\x7b\xc1\x2a\x2c\xec\x80\x67\x90\x3e\x68\x40\x04\x94\x90\x14\x2e\xf7\xb2\xe6\x83\x89\x5b\x49\xa1\x8d\x47\xce\xc8\x7c\xe4\xdc\x88\xd3\xec\x59\x61\xfd\xcd\x7f\x93\x7d\xf3\xc5\xec\x75\x95\x3b\x40\xee\xec\x0d\x7a\x5b\xcc\xc9\xa4\xa9\xb1\xef\xce\x7a\x6c\x3b\x9a\x67\xf3\xa8\x15\x8b\xac\xa3\x20\x66\x3d\xf9\x46\x27\x5d\x3d\x87\x74\x7a\xd1\xe7\x99\xbc\x62\xad\x45\xe2\x21\x21\x70\x17\x3c\xd8\x1d\x62\x27\x3f\x56\xe8\xc2\x87\x18\x8b\xb8\x67\x65\x69\xfb\x06\xa3\xf7\xb3\x2b\xbc\x10\x0e\xb4\x98\xaf\x31\xfd\x0b\xc6\x1d\x79\x75\x39\x65\x13\xb8\x15\x8a\x80\x36\x8a\x36\x0d\x0c\x03\xd6\x89\x54\x28\xc8\x17\xdc\x82\xca\x6a\xad\x1a\x5e\x88\xca\x90\xf6\x70\x7a\x2a\x6a\x71\xf1\x81\x51\x07\x02\xec\xda\x0a\x1f\x25\xf6\x6f\x25\x81\x4b\xd2\xe4\x5a\xe2\x5b\x98\x8f\x98\x11\x9f\x2f\x43\x69\x45\x0d\x15\x4b\x63\x55\xcf\x74\x98\xc2\x4e\x1b\xb9\x61\xf5\x08\x1c\x3a\xbc\xac\x11\xe9\xe0\x93\x7f\xe2\xa6\x94\x86\x15\x31\x20\xe1\x41\xed\x0a\x0e\xfb\x2a\xb0\x72\x26\x4b\x0e\x32\x87\xd7\x2e\xd1\x3b\x79\x74\xa5\x96\x75\x2d\x0b\x47\x54\xa7\x9b\x1e\x4d\x17\x30\x42\xdd\xa4\x13\x5d\x6b\xfe\x41\x8b\x85\x05\x22\xa0\x10\x0a\xe4\x8b\xd2\x13\x6a\x97\x7b\x46\x84\x2a\xcc\xa0\xe9\x53\x06\x79\x15\x13\x1a\x68\xb1\x58\x81\x84\xa3\xa0\x3a\xa0\xc8\x53\x6b\x8a\x29\x09\x65\xf0\x08\x11\x9c\x1b\x5f\xa1\x58\x60\x81\x63\xbf\x29\x8f\x97\x86\xa0\x63\xb9\xda\xa3\x91\xeb\xe9\xce\x0d\xe8\x94\x60\x0f\x5c\x94\xdf\x6b\x56\xa9\x23\x03\x8c\xfa\x31\x63\xc8\xc1\xd3\xd3\x27\xee\xd2\xc0\xaa\x0d\xdc\x41\xe9\xd6\x91\x60\xee\xcf\x5b\x67\xf0\x9c\xb2\xbc\x21\xc5\x35\x76\xb0\x7d\x65\x18\xee\x4f\x9f\x9e\xf0\x17\xb7\x22\x71\xe2\x53\x6c\xa0\xd7\xd9\xc0\xb2\x50\x6f\x32\x82\x37\x2a\xaa\x9e\xc4\x74\x54\xcc\x97\x14\x68\xa0\xa2\xee\xe2\x24\xea\x5a\x45\x25\xf8\x67\x60\x51\x5f\x40\xf7\x07\xd2\x32\x51\x71\x20\x0d\xce\xd0\x2f\xdb\x93\xa1\x5f\x69\xc8\x97\xb6\xfd\x46\x3c\x75\x41\x60\xda\xb7\xc6\x1d\x80\xbc\x4b\xa4\xee\xd3\x64\x15\x4f\xc3\x62\xcf\xaa\x72\x9f\x06\xcf\xcf\xcf\x3f\x88\x41\x3f\xf6\xa6\x9f\x31\xd4\x9e\xa6\xb1\x78\x7a\xf2\xc1\xd7\x74\x1a\x1e\x7d\xd2\x39\xec\x79\xae\x41\xb3\xef\x5a\xe8\xc0\x78\x72\x8c\x06\x05\xbd\xe7\x8d\x2b\xda\x76\x6c\xf8\xae\x4a\xef\x5c\x94\x75\x7e\x89\xdf\x0b\x41\x0d\x3e\x6b\x1c\xef\x43\x64\x69\x2f\xe3\xb4\x07\x2c\x65\xd0\x1f\xcc\x97\xed\x15\x5d\x29\xee\x9d\xd8\x7a\x96\xa2\x34\x57\xb1\x70\x7f\xae\x3f\x0a\xe7\x7b\x68\x6f\xd0\xcf\x8f\xd0\xb8\x65\x8e\x06\x86\x51\xc8\xa3\x07\xd7\xa3\x72\xbf\x87\xb5\xef\x21\x81\x55\x15\xe3\xc1\x69\x9f\x1e\x8c\xeb\xc1\xef\xfd\x49\x0e\x0e\x3e\xc2\x20\x27\x3d\x5b\x94\x6e\xdb\xa3\x09\x6d\x87\x47\xc1\xf7\x81\x34\x61\x82\xcf\xde\x05\x2b\xb5\xa1\x46\xa7\xf6\x3c\x8d\x42\x3e\xd7\x09\x1f\xee\xfa\xc3\x80\x08\xa8\xa8\x49\xd4\x54\x13\x2e\x5b\xb4\x76\x3a\x18\x0b\xf5\x88\x70\xcc\x57\x4e\x52\xcc\x3a\xfd\xbc\x1e\xe3\xfe\x56\xf2\x61\xb6\x9e\x14\x9a\xae\xc5\xc5\x1f\x05\xfe\xb0\xbf\x15\x66\xde\x9c\x3f\xb3\x95\x7c\x2e\xc0\xb2\xd2\x5c\x30\x33\x57\xd0\x15\x70\x38\x51\x3a\x7b\xb1\x72\xe9\xd9\x50\x96\x0a\x12\xfc\xfc\xbd\x10\x0d\xec\xd7\x7d\xcb\x10\x38\x91\xbd\xf8\xa9\xad\x85\x1f\x63\xa1\x34\xa4\x8d\x49\xaa\x83\xbf\x4d\xb5\x57\x56\xf1\x01\x13\xe6\x4f\xb3\xc5\xb4\xda\x98\xa3\x90\x4f\xf6\x61\xe6\xc9\x3e\x94\x3a\xb1\xe6\xc9\x44\x5d\x7c\xc2\x77\x7b\xc9\x57\x27\xf0\x58\x33\xf6\x71\xe9\xb6\x2a\xf7\x55\x47\x63\xfc\xc4\x03\x72\xec\x6e\xf6\x09\x92\x50\xe4\x27\xfe\x4d\x4a\xa0\x33\x16\xed\x88\xe7\x0b\x37\x1a\x48\x55\xe7\x63\x75\x75\x7f\x81\xc5\xa2\xbe\x0e\x93\x38\x35\x3e\xf4\xf5\xd9\xd7\x5f\x07\x2f\x99\x38\x3d\x84\x2b\x69\x28\xee\xed\xbc\x04\x71\xac\x21\xbe\x65\x4d\x9f\x12\x73\x24\xe5\xf4\x33\x02\x59\x00\x17\xcd\x52\x3b\x78\x7a\x3a\x7a\xae\xde\x4d\xab\x94\xa4\x52\x86\x0a\xf8\x05\x1f\x3f\x54\x80\xe1\x88\xd7\xaf\xea\x93\x3b\x5e\x0d\x2f\x4a\xa7\xe2\x1f\x5a\xa2\x68\x7e\xda\xa0\xc6\x05\xa6\x5c\x5a\x90\x7d\x3d\xf9\xd7\xfd\x68\xdc\x7a\xdc\xf5\xeb\xe1\x5c\xab\xc0\xa0\x6a\xb7\x2d\xc3\x17\xb3\xda\x47\xc4\x69\x50\xa6\xad\x7f\x5f\xcd\x0e\xd5\x12\xcf\xea\xeb\xb5\xd3\x3c\x3a\x7b\x72\x8e\xe5\xdc\x3b\x23\x06\x54\xb7\x07\xf0\x3b\x55\x80\xdb\xb3\x5b\x98\x19\x35\xbc\x78\x1b\xc7\x63\x0b\x53\x3d\x72\xe7\x9e\x59\xf5\x82\x10\x58\x76\xe8\x38\x0d\xf5\xb6\x70\xff\xe7\x36\x1d\xc9\xfb\x9f\xec\x13\xd4\x82\xbe\x74\xf3\x4b\x91\xa6\x5b\xf4\x89\x9b\x78\xf5\xec\xa4\xb0\x05\x2e\x68\xdc\xf4\x93\x37\xac\xf1\x08\xcd\x91\x70\x3e\xc5\x14\x80\xd8\x36\x7c\xb8\x3e\xfb\xbf\x2b\x05\x11\x2e\x2b\xf0\x0b\xc5\x0b\x53\x50\xd0\xd6\x68\xfb\xe9\x89\x86\x8a\x78\xef\xd0\x4e\x44\x12\x2d\x38\xbe\x0c\x22\x37\xb0\x52\x69\x61\xa8\xb4\x0e\x66\x1c\xbd\xcf\x1f\x04\x99\xa9\x20\xe0\xf0\xcb\x1c\x0a\xf8\xe2\x2f\x81\xec\xb3\x8b\x7e\x51\x83\x13\x7e\x75\x07\x73\x51\xba\xba\xfa\x1f\x07\xb8\xea\xb3\x73\x31\x62\x15\x24\x91\x92\x25\xda\x53\x93\xc8\xde\x49\x81\xaa\xa1\xcb\x44\xdc\x6d\x7a\x02\x29\x0d\x50\xfd\xa7\x87\x97\xf6\xfd\xf5\x98\x17\xc0\xfd\x1c\x6b\xae\xae\x02\x48\x6e\xc4\xa8\x83\x7c\xe2\xab\xe1\x42\x2d\xe9\xda\xb7\x5b\x31\x2b\x79\x04\xd2\x81\xc4\xef\xb7\xd3\x2b\x4b\x25\x6b\xc1\x24\x02\x44\x73\xd5\x37\x16\x83\xc7\x0d\x16\x33\xb3\xc1\x20\xbe\xaf\xe8\xb7\x64\x52\xb5\xcb\x48\x64\xa9\xdf\xff\x32\x8b\xca\xe0\x9b\x59\xae\xee\xfe\x4d\x16\x9d\xd3\x52\x26\x22\xf4\x83\xdd\x54\x5e\xb0\x14\x9c\x9b\xd9\x60\xcf\xa2\xe9\x77\x03\x1e\x5c\xdf\x9f\x01\xc5\x93\xda\xcb\x4b\x20\x32\x16\x7f\x15\x5a\xf3\x0d\x10\xdd\x02\x7e\x78\xb4\xa2\xec\x12\x89\x68\x30\x23\xdc\x2f\x4c\xaf\x8a\xc8\xaa\xce\xdd\x93\x9a\x14\x2b\x51\x91\xc5\xc5\xbe\x74\x83\x0b\xaf\x31\x3e\x9d\x2c\x4a\xb7\x70\x7e\xee\x13\x81\xbe\xd2\x0d\x03\xd7\x83\x78\x88\x4e\xcc\x2b\x93\xd5\xfc\x4b\xd8\x55\x89\xdf\x89\x88\x96\x62\x0f\xdf\xb5\xd0\xf9\xf9\xcc\xa3\x77\x31\xb3\x1c\x8c\x41\x30\x5a\x3f\x90\xab\xa0\xfd\x7e\xfe\xfc\xec\xee\xc1\x47\x19\x96\x3d\xa0\x0e\x86\x2f\x97\x69\x6c\x28\x2e\x59\xef\x5e\xe9\x1c\x8c\xb7\xab\xc7\xb7\x02\x35\x0c\x58\xb2\xa6\x77\xf7\xb2\x76\x3b\xd2\x02\x85\x59\x18\x73\x47\x05\x91\xdd\x72\x02\x5b\x8e\x66\xfd\xcb\x4c\x5f\x0d\xe2\x70\x22\x0c\xb2\xc5\x92\xcd\x17\xa5\xae\xff\x8b\x0c\x06\xd5\x55\x83\xb3\xf7\xc2\xe2\xdd\x1e\x9a\x83\x13\x4f\x23\x9e\x78\xee\xe0\x1c\xff\x17\x83\xb3\x3d\x7c\x89\xe4\x09\xb3\xb0\x5f\x0e\x0e\x7c\x82\xce\x6e\x1f\xb1\xe0\xba\x29\x37\xa2\x57\x29\xf3\x7e\x76\x5a\x8d\x85\xf3\x95\x72\xfd\xfd\xb3\x1d\x38\x60\x42\x6c\x79\xd2\xf6\xf1\xa9\xef\x3a\x8e\x52\x6b\xe0\x60\xfd\x24\x7f\xb7\xe0\x75\x0a\x9b\x70\xe5\x38\xe7\x78\x09\x70\x1b\xc2\xe7\xc5\x37\x36\x1f\x31\xd5\xc3\x53\xfe\x4d\x91\xd8\x15\xe6\x2d\x3c\xe6\x79\x84\x55\x7c\x93\x2f\xbd\x51\x32\x9e\x5e\x69\xd8\xef\x86\x44\xda\x3c\xf4\x98\xb6\xa1\xba\x94\xe7\x68\xd0\x6a\xfe\x70\x7d\x1b\x02\x11\x41\x3a\x95\xdd\x10\xc4\xaa\xac\x2d\xb3\x18\x1e\x0e\x98\x5d\xab\x7a\xc4\x28\xe9\xa0\x87\x1d\xad\x33\x4c\x11\x03\x5e\x3c\x9f\xe3\xf9\xab\x61\x10\xa5\x2b\x8d\x58\x58\xe5\xa1\x74\x86\xf3\x23\x9e\x2b\x3d\xa8\x74\xd3\x5b\x66\xdf\xfd\xc1\x38\xa1\xaa\x1f\xef\x4a\xb7\xa6\x5b\xcb\x8b\xd2\x63\x79\x6a\x7d\x25\x73\x78\x38\x3b\x87\x6d\x63\x0e\xa5\xd9\xec\xb6\xf6\x1d\x05\x51\xad\xa9\x47\x6a\x8f\x5d\x79\x80\x55\x54\x8f\x59\x7c\x15\xfb\xd1\x9b\x9d\x38\x79\xc4\x8c\xe4\x03\xf3\xd1\x70\x1d\x17\x38\x8e\x7e\xda\xdc\x8d\x8c\x58\x7e\xb2\x56\xcf\xd0\xb9\xf6\x38\x37\x4a\xdf\x3d\x71\x79\xab\x85\x35\xf5\x13\xa8\x14\x6e\xb9\xb9\x2a\x48\x49\x9d\x69\x07\x8f\xbf\xaa\x3f\xf3\xa6\xaa\x6b\x24\x08\x7d\xc1\x84\xa3\x31\x7f\x8c\xd8\x0e\x40\xd8\xed\x8e\x4c\x41\x00\xf3\x85\x22\xf3\x6c\x10\x41\xd6\x4b\x3d\x31\xa4\xd2\x72\x91\x95\x3e\x20\xa5\xb3\x2a\x1f\x7c\xf8\x66\x67\x6a\xc9\x98\x37\x04\x91\xbc\x66\x8e\xf8\x06\x25\xcd\x9c\xbd\x46\x89\x69\x54\xa4\x91\xee\xdc\xa8\xfd\x18\xe6\x82\x76\x14\x85\xc3\xb0\x37\x96\x2a\xa9\x70\x63\x95\xe4\x2c\xe6\x73\x05\x1c\x41\x75\xa7\x23\x7d\xdd\xa2\x5f\x94\xc7\x38\xaf\x5a\x66\x77\x61\xbf\xa7\xf3\x81\xdb\xdc\xd1\x6d\xc6\x32\xe4\xe5\xd2\xb1\xa3\x46\x87\xce\x8b\xd3\xee\x35\x6f\xc3\xe1\x03\x5f\x03\xc9\xc6\xe9\x6b\x78\x75\xdb\x8c\x8e\x9a\x03\xce\xd5\xe1\xe6\x2f\xc2\xe5\x4e\x55\x3f\x2d\x55\xb6\xd7\x5c\x57\xf9\x77\x8e\xdd\xc0\x9e\x10\x47\x7d\xa5\x29\x29\xed\x97\xb2\xc5\x8e\x83\x79\xf4\x70\x5c\x2b\x32\x30\x3f\x59\x41\xdc\x20\xa8\xfe\x2a\x83\x6f\xf8\x63\x0d\xd4\x36\x23\x7e\x60\x63\xda\x2a\x94\x61\x0b\xeb\xe9\xa9\x63\x5e\x14\x72\xb9\x8f\xe5\x42\xba\xa5\x6c\xf3\xe2\x70\x5d\xb9\x32\x56\x43\x30\xee\xe7\x44\x10\xd0\x7c\x8d\xa6\x47\x63\xde\x12\xc4\xeb\x3c\x90\xf1\xd9\xcd\x74\x7b\x66\x9b\xe0\x6f\x14\xf0\x8a\x6a\x3a\xab\x4d\xb7\x01\x56\xb2\x6a\x07\xed\xaf\xa9\xa6\xd8\xd8\x67\x86\x80\x92\x12\x17\xe9\xcb\x19\xca\x67\x91\x11\x55\x53\x61\x7c\x76\x36\x98\xa7\xd3\xe3\xeb\x25\x21\x18\x28\x98\x0b\x14\x98\x40\x7d\x6f\xea\x6c\x9a\xa2\x23\x5c\x12\x68\xd0\xac\x53\x2b\x2d\x7f\xee\x9b\x62\x23\xb5\xa0\x74\xab\xb8\x6f\xc1\x6f\x82\xc9\x94\x5b\x7c\xde\x9a\xd4\xff\xe1\x24\xc8\x0c\xf1\xa8\xfe\x12\x67\x91\x42\xed\x66\xce\xd3\xd3\xd7\x5a\x5c\xed\xc3\xa8\xc0\x6a\x3c\x34\x7b\x0f\xf3\x74\xbb\xb6\xfa\x05\x08\x00\x8d\x1c\x7d\x00\x87\x38\x89\xa3\x5b\x3c\x70\x34\xef\x0f\x5f\x67\xcf\xd5\xcd\xf9\x15\x06\xbd\x6c\x65\x17\xa5\x93\xfa\xbc\x01\x0f\xb3\xb3\x32\xde\x9f\x07\x14\x67\x81\x6e\xe2\x69\x66\xa7\xfc\x91\x35\x09\xe6\x92\x0b\xda\x76\xde\xc7\x0c\x55\xf1\x0c\x22\xb3\xa4\xaf\xb1\x0e\x35\x51\xc5\xa5\x1f\x06\x7b\x73\xf6\x64\x72\xc3\xc4\x4d\x2e\xb2\xc1\x4c\x23\xf8\x1e\x1a\x2d\xb1\x32\x2b\xc5\xe4\x71\x74\x4b\x8e\xb3\x2d\x39\x56\x2d\x99\x22\xef\x19\xb3\x6b\xb8\x03\x31\x08\xbc\x6f\x10\x78\x3f\x25\xf0\x44\x66\xd0\xb8\x70\x6d\xb6\xf1\x83\xa4\xf1\x29\xb1\x1e\xcc\x38\x35\xbd\x06\xe3\x75\x3d\x90\x5e\x97\x87\x42\x59\xd2\xa3\x08\x29\x1a\x80\x3b\xca\x61\x18\x38\xa3\x96\xed\x11\xdd\x72\xc6\xb1\x1d\x0f\xc3\xb0\xe7\x1c\x9a\x0e\xc5\x7a\x89\xc8\x46\xf9\x83\xa7\x5e\xb6\xd6\x85\xb0\xaf\x07\x84\xe3\xfa\x82\xcf\x47\xa1\xf5\x0c\x7b\x22\xdd\x7f\x12\x45\x37\xb5\x02\x3d\xdc\x5a\xe0\x95\x97\xa8\x9b\x8f\x57\x5c\xe5\x1d\x35\x25\x66\x81\xbc\x71\xa4\xd3\xbb\x85\x3b\xd9\xb3\x41\x21\x39\xd0\x87\x2c\x8c\x10\x21\x9b\x8e\x92\x9a\x21\x52\x09\xb7\x4c\x47\x14\xfa\x85\xbd\xec\x8f\x0c\x1b\xc1\xfa\xb6\x2e\x42\x65\xa4\xfa\x25\x54\x35\x90\x05\xc2\xf4\x56\x2d\x74\x2b\x4e\xf9\x03\x6d\x72\xb7\xec\x84\x6e\x59\x9f\xc3\xc2\xa5\x80\x48\xad\x9f\xb8\x7a\x8d\x95\xf1\xae\xc0\x96\x35\x42\x40\x02\x4f\xe7\x3e\xbb\x67\x87\x6f\xa3\x2e\x41\x13\x57\x71\xc7\x2f\x97\x4a\x7b\x05\x06\x14\xba\x89\xc5\x36\xf9\x80\x20\x6d\x97\xc7\x4b\x81\xb5\x1c\xbd\xed\xe0\xc2\xbd\xb3\xd4\xb3\x47\xb4\x46\x46\x4a\x58\x7f\xa4\x49\xfe\x44\xde\x3c\xe3\x78\x68\xdf\x62\x63\x4c\x66\x5a\x31\xa1\x56\x3c\x52\x99\x0f\x1e\x15\x3a\xd1\x85\x56\x6f\x31\x6b\x1b\x30\x2d\x48\xd3\x79\xdf\xb2\x2b\xf6\xad\xec\xd9\x86\xdb\x83\xd8\x95\x74\x65\x7e\xac\x54\x25\xec\x31\x11\xb8\x2d\x33\xe5\x50\xf1\x43\xf6\xa8\x65\xd9\x87\xb8\x6a\x19\x8a\xbb\x1f\xe1\xb0\xbf\x4f\xa7\xbf\xda\xab\x0a\xdb\x55\xeb\xd5\x26\x1f\xe2\x5a\x81\x6a\xa8\xb7\xec\x47\xaa\xc1\xa6\xcf\x2d\xbb\xb7\xc4\xdf\xe5\x0f\x87\x8b\x8b\x14\xf1\xad\x65\x1f\xaa\x34\x02\x1b\xd0\x27\x1d\x2f\x65\xa0\xf7\x02\xdc\x86\xfd\xb8\xd4\x4b\xf3\x74\xb8\x40\x99\x6b\x23\xa9\x28\x4d\x30\xfb\x48\x43\x56\x6a\x0d\x30\x64\xf6\x27\x4f\x69\x47\xba\xee\x84\xe6\x01\x29\xdb\x42\x0e\xa6\x54\x5e\x50\x40\x18\x43\x36\x75\xc1\x83\xf6\x9a\x3a\xcc\x1f\x88\xe5\x8f\x7b\x21\x94\x3a\x04\x32\xdc\x26\x56\x98\x33\xfe\x7a\x7b\xfa\x9d\x11\xd7\x43\xb8\x8a\x94\xfa\x2c\x1a\xb9\xd3\xde\xe3\x4b\x2e\x53\xf8\xbc\x3f\x48\x0f\x40\xa9\xbb\x44\xa1\x75\x98\xae\x13\xa7\xf7\x9e\x8e\xea\x24\x50\x03\x6c\x7e\x8e\x50\x30\x83\x01\x2b\x3f\xf0\x4e\x6b\x1f\xba\x4a\x30\xff\xea\x90\xb8\x6b\xfe\x3a\xa7\xa5\xaa\xcc\x79\x3e\xb8\xc1\xf3\xb1\x28\xf4\x67\x74\x5e\x8d\xcb\x9f\xf6\xa1\xad\xb6\xed\xd5\x61\x75\x46\xc0\x4e\x89\x6e\x79\xfa\x95\xc4\xaf\x5e\xab\x17\x06\xd5\x7a\x67\xa6\xa5\xea\x84\xa9\x32\xd2\xde\x04\xaa\x4d\x5e\xbc\xe8\xf8\x26\x3e\xf8\x20\x35\xdc\xaa\xd2\xd7\x17\x7d\x76\x9d\x77\x9e\x15\x4c\x6b\x1e\xf9\x53\x3d\x34\x46\xf9\x66\x60\x5e\xbd\x50\xd6\xfd\x66\x62\xfe\x8e\x62\x8f\xd4\x98\xed\xae\xba\xde\x92\xa8\x6a\x3d\xa3\xdd\x55\x7d\x80\xa1\x04\xad\x7e\xbb\x3b\x12\xee\xce\x75\x61\xf3\xba\x10\x58\xa5\xbe\x3e\xd0\x7d\x49\x62\x43\x8e\x7d\xfe\x5e\xb8\x19\xd8\x7d\x28\x1b\xdd\xcc\x34\x54\xf9\xdf\xb9\x31\xd9\xac\x23\xe2\x47\xf6\xaf\x0b\xba\x0a\x5b\x97\x6a\x57\x96\x0a\xca\x7d\x5b\xfb\xd0\x5a\x56\xad\x49\x96\xd4\xee\x75\x21\x2b\x25\x60\x12\x87\x21\xb4\xa4\x39\xc7\xe4\x0c\x0f\x28\x43\x6e\x09\xf8\x32\xc8\x5f\xbc\x74\x81\x35\x39\x63\x4f\xc2\xc4\x6e\x18\x6b\x93\x8a\x95\xb9\xc3\xdb\xd9\xa3\x3b\xc6\x74\x2a\x6b\x66\xc0\x2d\xe9\x87\x6b\xf8\xa2\xee\x64\x2a\x0f\xea\x33\x0f\xcc\x62\x97\xfc\x93\x28\x50\xf2\xcf\x97\x96\x25\x2d\xa7\x4c\xe9\x34\xa5\xc7\xa6\x44\xaf\xc9\x4e\x1d\x0e\xeb\xa6\x65\x85\xd6\x75\x6c\x24\x1f\x6f\x1a\xa7\xca\x91\x6a\xe4\xc6\xb4\xf2\xe0\xcb\x9b\x3e\x5a\x30\x60\x85\x3b\x38\xb8\x96\x85\x7e\x53\x04\xc5\xa6\x6a\x20\x23\x26\x71\x31\xe0\xb0\x12\xaf\xcc\x68\x43\x85\x59\x57\xde\xbc\x03\xf4\x02\x85\x6f\xc3\xb7\x98\xb7\x22\x3c\x89\x61\xee\x8a\x95\xed\xd5\xb7\x98\xbf\x62\x41\xc9\x5c\xd6\x20\xcc\xe1\x94\xcd\xf9\x1c\x0d\x32\xd6\x5f\xf1\xfa\x92\xe2\x91\x38\xe3\x1e\x09\x0e\x56\xb4\x24\x3c\x2c\x88\xc4\x8d\x68\xa9\xd2\x74\xdd\x75\x4f\xd4\x02\xc7\x03\x0e\x84\xa4\x77\x47\x10\xf5\xa8\x94\xad\x26\xfb\x40\x1f\xcd\x4c\x90\x5c\x16\xfa\x99\xac\xdc\x54\x3a\x9f\xfe\xe2\x62\x0b\x77\x86\x7c\x7b\x08\xa5\x26\x96\xd1\x90\x84\xbb\x6a\x78\x98\xcf\xfa\x44\x8f\xb4\x56\x97\x34\x22\xf8\xb3\x00\xef\xe0\xcf\xcb\x31\x0e\x5d\xd4\x7c\x6a\x38\xb3\x6e\x34\x6b\x91\xf6\x58\x5e\x28\x59\x94\xbe\x19\x52\xf9\x35\xed\x29\x3d\x64\x35\x58\x87\x71\xb1\x74\x05\x85\x81\x0e\xda\x85\x9e\x4f\x65\x0c\xf4\x0d\x6f\xaa\x25\xc7\x7f\xa5\x25\x05\xa9\x8c\x26\x25\x54\xa4\xfd\x82\x40\xd9\x10\x40\x01\xf9\xb9\x4f\xac\x87\x7c\x72\x92\xda\x31\xa5\xc9\x28\x3c\x64\x9a\xb8\xd9\x12\x90\x54\x09\x87\xa3\xdd\x68\xfd\x56\xb4\xbb\x38\xd4\xe6\x33\x98\x14\x7a\x7e\xe2\x39\x69\xcf\xbf\xab\xc0\x50\x07\xcc\x43\x45\xf0\xbf\xcc\x9e\xa8\x0e\xe6\xa1\x4c\xf8\x3f\xd6\xad\xf4\x0c\xf3\x76\x38\xf8\xe7\x12\x36\xc1\x29\xc8\x02\xf2\xf6\x30\x33\xfc\x72\xc3\x0f\xd3\xe1\x9f\x42\x40\xd9\x60\x9a\xfa\x79\x28\x02\x28\x61\x9a\x50\x84\x77\xaa\xaf\x5e\x6c\xc4\x86\x48\x9a\xd0\xcd\x34\x41\x32\xa7\x5d\x63\x05\xbc\x54\xc4\xfa\x90\x0e\x49\xba\x90\x49\xdf\x2c\x64\xc2\x06\x39\x26\xfd\x7f\x2e\xe4\x58\x5e\x3e\xea\x62\x46\x99\xb6\xc8\xed\x35\xfa\x17\x6d\x81\x18\x86\x2e\xc3\xcb\x94\x21\xf5\xcf\xbd\xb4\x0c\x6f\x66\x45\x7b\xc6\x8a\xfe\x37\x5b\xe2\xa5\x46\xb0\x58\xc1\x4b\xb3\xfb\xeb\x5c\xff\x7e\x3a\x5e\x9e\x52\x2e\xe8\xff\x64\x52\xb8\xa4\xff\xa3\x99\xe1\xb2\x5e\x98\x9e\xea\x5d\xbb\x17\xf4\xef\x4a\x32\xe3\xe2\x62\x26\x58\xea\xf6\x21\xdc\x35\x3f\x16\xab\xbb\xfb\x8b\xa4\x6c\x23\x08\xe5\xfe\x4b\x48\x93\x37\x62\x7f\xe4\xfa\xa2\x66\x04\x81\x31\x5c\x20\xd0\xbf\x84\x84\x8c\x07\x99\x97\x62\x51\xea\xf7\x50\xb2\x6b\x98\x04\x9a\x4c\x83\x04\xed\xd1\x40\x8c\xfd\xd6\xf6\x2d\x7c\xfe\x1a\x90\xb7\xd3\x90\x78\x3a\x13\xe3\x96\x09\x73\x37\x03\xe3\xe3\x24\xfa\xcd\x84\xb9\x9f\x0f\xf3\xdd\x84\x79\x98\xad\xab\x97\x69\xf6\xfa\x34\x40\x1c\x4a\xdf\xb2\x06\xcc\xe7\x69\x98\x4e\xf8\xb0\xd9\x0f\x32\x30\x3b\xd3\x30\x2d\xd1\x0b\xba\xe1\x4c\xe7\x77\xa7\xe1\xbc\x76\xb6\x41\x5f\xa6\x01\x44\x77\xbc\x17\x3e\x98\x20\x7b\xd3\x20\x2c\xd6\x6a\x42\xec\xcf\x19\xe2\xa3\x01\x92\x46\x04\x66\x78\x7c\x9c\xd3\x7b\x09\x67\x96\x76\x38\x53\xda\x98\x96\xb9\x09\x71\x34\xb3\x3e\x92\xca\x12\x98\xe3\x39\x75\x9d\x4d\x17\x74\x32\xbb\xd0\x88\x81\x0a\x1e\xb8\x46\xbf\xc5\x58\xdf\x00\x3f\x9d\x06\xf7\x45\xcf\x0f\xbb\x26\xc8\xd9\x34\xc8\x75\x38\x16\x53\x03\x5a\x9f\x29\x86\x35\xf8\xc7\x75\xda\x14\x61\x66\xfa\xce\x67\x20\xbb\x20\x47\x99\x75\xf9\x75\x3e\x4c\x66\x5d\x5e\xcc\x0e\x69\x7f\x60\x02\x7c\x9b\x06\x18\xb7\xc7\xdd\x4c\xdf\xbf\xcf\x2c\x14\xaf\x3f\x1c\x67\xa6\xf7\xc7\x34\x48\x16\x05\x18\x85\xbd\x9e\xa9\x6e\xa6\xeb\xe2\x66\x7a\x83\xd3\x91\x1f\xd5\xf1\xb1\xf0\xc6\xcd\x0f\xc3\x2e\x94\xf1\xe4\xa0\xe5\x6d\x9f\xa2\xfc\x6e\x28\x86\xb0\xc9\xd1\x9f\x50\x4c\xc0\x40\xb7\xc4\x18\x11\x3b\xf4\xda\xcd\x07\x62\x2c\x88\x93\xa0\xd8\x01\xa2\x7b\xe3\x2d\x29\xbd\x4b\xbc\x12\xc5\x65\xf0\x47\xde\x8e\x29\x4a\x21\x8a\xbc\xdd\xa2\xc0\xc1\xfa\xb7\xbf\xbf\xae\xef\x9f\x6f\xe7\xed\x36\xa7\xf5\x82\xbc\x7d\x45\x5f\x6a\x07\xe7\xed\x0e\x5a\x40\xcc\x18\xf6\x2a\x91\x1b\x0a\xa9\x8d\x9b\xb7\xaf\x29\xb0\x2f\xc6\xfb\xbd\x38\x6f\xf7\xe8\xdb\xd8\xad\x79\xbb\x2f\x0b\x91\x32\xe3\xbb\xd8\x5b\x79\x7b\x80\x2a\xfa\x93\xa1\x4f\x99\x6f\xe8\xdb\xeb\x4f\x7a\xc1\x88\x08\x1f\x7d\xcb\x1d\x4a\x94\x03\xf5\xb1\x19\x92\xbc\x3d\xa6\xef\xb1\x64\xfc\x26\xf8\xec\x7f\x39\x83\x7f\x97\xdb\xa4\xde\x0d\x55\xc0\x9d\xac\xcc\x30\x9c\x95\xb7\xef\x65\x5f\x93\x81\x7b\x40\x98\x16\x08\x04\x0c\x44\xcc\x93\x97\xb7\x1f\x25\x90\xda\xd6\x79\x7b\x9d\xc2\xd7\xe1\x68\x24\x62\x2a\x61\x03\x01\x31\xa0\xe8\x4d\x59\xbe\x04\xcb\xdb\x5b\x5c\x14\x37\x71\x9b\x3e\xfb\x3a\xf7\x27\x9e\x85\xfe\xb8\xef\xf7\xbb\x79\xfb\x33\x85\xc2\x1e\x9a\x4f\x63\xba\xa3\x5b\xc8\xb9\x76\x79\x12\xaf\xfb\xb7\xe1\x21\x8f\xe4\xab\x2f\x28\x86\x7d\x1c\x7f\xcb\xdb\x7b\x49\xe0\x7b\xde\xde\x47\x46\x11\x50\x5e\xaa\xe0\x80\x6b\x0b\xa9\x09\x87\x18\x26\xde\xa7\x79\xfb\x88\xbe\x4f\xc3\x9b\x49\x38\xa2\x99\x1d\xd2\xac\x81\x6d\xce\xdb\x27\x18\xe1\xc9\x78\x8c\x16\x9f\x72\xbf\x78\xcf\xe6\xed\x33\xe4\x35\x37\x27\x71\xc2\xdc\x20\xc2\x11\xaa\x81\xe7\x98\x91\x20\xe0\xb9\xdc\x6f\x8f\xc6\x61\x2f\x1c\xe6\xed\xaf\xe8\x9f\xe0\x95\x77\xa1\x46\x33\x6f\x7f\x03\x28\x76\x4d\xde\xfe\x8e\x82\xc7\xc3\x2e\xd7\xf2\x43\xf6\x58\xae\xb5\xd7\x14\xb8\x6d\x87\x77\x79\x5b\x0c\x31\xa7\xb2\x56\x8f\xbe\xb1\x01\x68\x9d\xd3\xd7\xa8\xd5\x8e\xe4\x1a\xc0\xcd\x71\xfe\xb2\x77\x79\xbf\xea\x2f\x13\x3d\x6a\x0f\xc6\x1f\x69\xc1\x70\x24\xb5\x62\x88\x8f\x5c\x83\x96\x0a\x7f\x40\xe9\xb7\xdd\x0b\x73\xb4\x5c\x38\x1c\xf4\x43\x69\xe0\x3b\x6a\x8f\xf5\xfb\x0c\x9e\xc5\x36\xfb\xbd\xf1\xb0\xcf\x8f\x56\x5f\xcd\x1d\xac\xb5\xe0\x7d\xc9\x81\xd0\x52\x9b\x2d\xc6\xcc\x9f\x01\xcf\xdd\xb5\xda\xac\x98\x49\x2b\x1f\x46\xc7\xdf\xf0\x20\xbe\xc9\xf1\x4e\xa4\xb2\x6e\xff\x8b\xb2\xe0\x80\x28\xa0\x71\x98\x31\xde\xf6\x86\x16\x38\x95\xf3\x26\x9f\x7f\x63\xdf\xf3\xc7\xc7\xcb\xde\x1b\xfb\x01\x65\xff\xb6\xb2\x42\xab\x58\x7e\xfd\x4e\xeb\x17\x5f\x8b\x43\x5a\x0c\x6d\x6a\xc9\x84\xf8\x81\xca\x22\x61\x07\x2a\xf5\x0d\x15\x1f\xd1\x6f\x89\x7e\x37\x00\x55\x5a\xa6\x3d\x8f\x88\x48\xb1\x5a\x57\x14\xa0\xb8\x4d\x24\xc2\x47\xd3\x16\x7f\x50\xcc\x36\x7f\x00\x09\x8c\x4b\xad\xf1\x35\xad\xb8\x4f\x46\xcc\x15\x2d\xb5\xcf\x1c\x8e\x6f\xdb\x8f\xcb\xe3\x1b\xc2\x19\x28\x09\x1f\xb7\xf4\xf1\x6e\xe5\x0f\x6a\x3f\x7d\xd0\xcf\x0e\xe0\x9c\x4b\x5a\x90\xbb\xf8\xaa\x8e\xda\xb1\x93\xb7\xbf\xf0\x37\x8b\x13\xd0\xb6\x25\xc8\x0f\x9b\xa7\xfb\x9f\x68\xca\xf7\x90\xf0\x61\xfb\xe0\xb8\xfe\x9d\x42\x0f\x48\xd9\x3e\x42\xc2\xa3\xfc\x3c\xa5\xcf\x7d\x0c\xc8\x07\xb9\x4a\x78\xb8\x68\x79\x85\xf7\xe3\xe5\x2b\x71\x2b\x64\x6c\x3e\x37\x1a\xfa\x34\x00\xf6\x3a\xe5\x5a\xef\xd1\x3c\x30\x86\x25\xbc\x80\x7b\x56\x1a\x0d\x44\xd3\x68\xe1\xc8\x49\xc3\xb0\x69\x06\x97\x68\x9b\xfb\x1d\x6c\xe0\x2d\x8a\x26\xbe\x5b\x01\x6d\x23\x34\xf1\xc0\xc1\xcb\x88\x4f\x14\xb1\xc9\xf8\x6f\x34\x6e\xfb\x1d\x15\x7b\x80\x0e\x50\x34\xe6\x1e\x3c\x4a\x4e\xe4\x7c\x35\xf5\xe3\x7e\xae\x3d\x1e\x85\xdd\x08\xd3\xfe\x19\xb9\x19\x53\xaa\x8c\x3b\x1c\x71\xed\xf5\x55\xf8\x90\x0b\xa2\xac\xb4\xac\x96\xa0\xee\x41\xbb\x9e\xa3\x68\xa9\xf4\xaf\x73\xc3\x70\x34\x20\x0c\xa4\x16\x62\x38\x9c\x6b\xda\xc0\x3e\x46\x8e\x2d\x31\x6a\x79\x7d\x31\xa4\x2e\x9d\x20\xfc\x79\xbb\x4e\xb3\x41\xd5\x7d\x16\x13\x20\xbd\x2f\xf8\x0c\x75\xbd\x7b\x14\xda\xa1\xfd\xdf\x8f\x09\xaf\xd0\x60\x53\x70\xf7\x9a\x90\xe3\xa9\x08\x92\xb1\x38\xd0\x91\x67\x84\x1b\x3a\x72\x4c\x4f\x51\xf4\x6e\x8f\xed\x0c\x8c\xdb\xd0\x5d\x06\x9d\x92\x4f\xd3\x0e\x6d\xd5\x33\x99\x2e\x1f\xf8\x21\x64\xfd\x95\x90\x83\x96\x08\x91\xae\x20\xec\xc3\x61\x0a\x92\xe6\x56\xbe\xb2\x1d\x0d\xfc\x1f\x42\x5e\x66\x61\x73\x20\x53\x0d\x84\xd5\x54\x77\xda\x3e\xff\xd7\xb9\x12\xb3\x02\x2b\x46\xf6\x23\x6a\x1d\xfa\xaa\x06\xe1\x2b\x4a\x3b\x38\xfb\x76\xb0\xbf\x52\xa2\x3f\x3b\xf5\xfa\x31\x21\xc9\xd9\xc8\xd2\x6a\xa9\x4c\x38\x73\x4e\xc2\x7b\x24\xbc\x3a\xa6\x62\x0f\x04\xa1\xd5\xef\x0c\xd2\xf6\x87\xfd\x51\x3f\x1a\xa7\x65\x9e\x00\xa0\x8f\x19\x55\x35\xff\x00\xa0\xa4\xd5\xaf\xf1\x79\xd4\x63\xb7\xe0\xd7\xfd\x61\x98\xa3\x09\xa1\xd5\xd8\x1e\x08\x3a\x92\xe4\x22\xd1\x86\x9c\x3b\x2d\x3c\xe0\xdc\x82\x45\xb3\x44\x65\x1d\x0d\x63\x55\xd0\x19\x85\x8e\x8f\xce\x68\x39\xd4\xf1\xd5\xd6\x5d\x13\x2d\x91\xd0\x17\x76\x20\x1e\xe4\x98\xa0\x9e\x13\xd4\x99\xcf\xe7\x3e\x3d\x08\x88\x19\x87\x83\x41\x18\x18\x1b\xea\x82\x62\xeb\x92\x8a\x7b\x28\x0a\x8e\xcf\x87\xb2\xb8\x30\x48\xf6\x03\x54\xe6\x8c\xe6\xe6\x7c\xb5\x6b\x60\xf2\x83\x88\x3c\x35\x9b\x48\x06\xe1\x72\x3b\x27\x46\x7c\x03\x9d\xbb\x63\x01\x90\x36\xb2\x07\x13\x1f\x6b\x3d\x08\x89\x36\x06\xb0\x1a\x95\xf3\x1f\x7c\x54\xe8\x73\x85\xba\xcd\x39\x11\x8d\xa1\x29\x67\x7f\x1b\xca\xd8\x2e\x2f\xd6\xef\x08\xd1\xa9\x87\xc7\x3d\xe0\x1c\xbc\xc3\x7e\x50\xfc\x45\x7f\x18\x20\x8d\x90\x28\x12\x2e\x2f\x7d\x1a\x66\x8a\xff\x8b\xb0\x29\x22\xfe\xe6\x45\xf3\x37\xf5\x66\xf8\xf0\xf7\x30\x8c\x68\x27\xb6\xfe\x86\x7c\xcb\xf0\x16\xfe\xd4\xe2\x19\x98\xc9\x90\xa2\x5b\x88\x16\x4a\xc4\x9a\x66\xbd\xcd\x61\x49\x44\xc5\x88\x49\x2f\x55\xda\x0b\xe4\x66\xf2\x64\x0c\x15\x4d\xa8\xf6\x8a\x41\xe9\xcc\xc5\x32\x06\xb6\x8f\x34\x8d\xd3\xc6\x49\x97\x3a\x0c\x35\x90\x9a\x79\xb4\x56\x96\xef\x97\xee\xee\xee\x96\xb0\xb6\x97\xa8\x05\x34\x44\xc4\x77\x04\x55\x60\x70\x62\x33\xdc\xc9\x38\x5a\x22\xf4\x1c\x50\x61\x9e\x20\x12\x1b\xe2\xa3\xdb\xf7\x3b\xd4\xcb\x91\xe4\xff\xc0\x3d\xe2\x93\x4a\xa4\xd8\x16\x3e\xfb\xf0\xa0\x01\x6e\xa1\x8b\xda\x7c\x85\x9d\xc6\x3c\x76\xd7\x3a\x6a\x08\x56\xa8\x3d\x4a\x02\xe8\x02\x87\x86\xa1\x2a\xb6\x07\xd0\x20\x45\x4b\x9d\x91\xe6\x6a\xbb\xea\x4b\xf1\x80\x7d\x09\x38\x0e\x9f\xf0\x07\x9d\x25\x56\x81\xe3\x88\xb3\xc1\xda\xfe\x3b\x61\xdd\x6e\x38\x9a\x98\xdf\x2e\x64\x95\x7a\xfd\x5e\x58\xa5\xd5\x15\x04\x34\xdc\x4b\xc4\xb5\x38\xb9\x95\x01\xf1\xa3\xd7\x28\xbf\x7f\x2d\xe0\x20\xb0\x97\x7c\xaf\xdf\xb7\xc1\x93\x72\x09\xcc\x9c\xf4\x47\xf2\x8b\xe7\x6a\x84\x78\xd6\x42\xd5\xb3\x37\xa0\xe4\x70\x38\xec\xd3\xb8\xdd\xd0\x67\xd4\xf7\x27\x23\x94\x38\xd4\x01\xde\x2d\x63\xe4\x53\x8c\x5c\xa9\xdd\x2f\x5d\x8b\x4e\xa8\x36\x15\x2d\x80\xc9\xcb\xa9\x6a\xdf\x52\xcd\x23\x80\x30\x92\x1e\xe3\x33\xec\xab\x01\xbc\xe5\xcc\xf2\xae\x02\xfc\x6a\x89\xf0\x37\xe6\x97\x1a\x74\x67\x24\x65\x6f\x5a\xf6\xfb\x82\x36\x69\x4c\x3d\xbd\x7f\x11\xe6\x04\x2b\x96\x08\xef\x8b\x00\xcc\xe6\xc0\x4b\x45\x90\x32\x89\x8f\xff\x02\x9a\x70\x94\xa4\xbf\x3a\xd3\xfa\x3f\x65\x92\xdc\xf2\x7a\xb7\xab\xf3\x50\xc3\x37\xfe\x5d\xa6\xb4\x96\xcd\x7f\xca\x40\x33\x1a\xc7\x80\x9c\x8c\x70\x9c\x19\xed\x43\xee\x71\x24\x29\x33\xb1\x00\xc8\xde\xa2\xe5\x7c\x8b\xd4\xf1\x98\xb0\xc5\x36\x47\xd1\xe7\x6f\xc4\x02\xe8\x6f\x67\x79\x39\x98\x5c\x5f\x3f\xc0\xcc\x0e\xf1\x46\x3a\x7a\x44\x30\x3b\x08\xb4\x03\x58\xc0\x1b\xd3\xc8\xbe\xba\xa3\x92\xda\xa0\x9d\x23\xd0\x4e\xb9\x77\xef\x39\x8e\x16\xd6\x2e\x03\x4b\x0a\x25\xb1\x07\xcd\x05\x25\x5e\x8d\xf8\xe8\x32\xe2\xa3\xd8\x40\xa2\x85\x75\x0a\xd1\xc9\xb1\x8b\x05\xb9\x81\xef\x76\xaf\xa3\xb6\xcd\xe6\x08\xc7\x18\x63\xb5\x7d\x41\xb9\x88\xf9\x5b\xa1\xe1\xbf\xf5\x12\xdb\x62\x50\xf4\x8b\x3f\x86\x1d\x1e\xe7\x3d\x86\xd7\x5b\x6b\x9f\x43\xfd\x00\x86\xa3\x68\xa4\x3e\x01\x92\xe9\x91\x5a\x8d\x9f\x39\x62\x32\x0a\x83\xfe\x1d\x35\x73\x47\x07\x79\x17\xec\x26\xa1\x5b\x64\x3e\xe0\xb2\x46\x84\xd3\x81\xfb\x78\x37\x1d\x22\xaa\xd7\xc7\x96\xe6\xd6\x1f\xc9\xf0\xf8\x6f\x55\x25\xb5\xf2\x18\x51\xc9\xa1\xeb\x0b\x15\xd9\x1f\xc6\xaa\xf6\x13\xa4\xa9\x9d\xae\x76\xf9\x1e\x01\x80\x2e\x70\xf1\xa7\x9c\x2e\xad\x0d\x12\xc9\xe3\x10\x3f\xd0\xf7\x7b\x0e\xb5\x62\x44\x53\x3d\x26\x5c\xc1\x38\xa2\x5c\x25\xba\x1f\x8d\xf9\xe3\x71\x89\xef\x87\x9c\x5c\xa5\x4a\xf4\x91\xb3\x4d\x3c\x1a\x8c\x91\x3a\x37\x11\x39\x44\xe4\xf4\x3d\x0b\xd1\x44\x15\xcd\x73\x76\x21\x03\x4c\x25\x68\xf6\x0f\x38\x77\x8c\xb1\xe3\x63\xe0\x61\x12\xa6\x7e\x7d\x93\xb0\x37\xbb\x01\x71\xc5\x47\x48\x69\xc7\x2d\x6a\xf3\xf1\x08\x47\xd6\x6e\xe8\xe3\xc0\x05\x98\x51\x38\x6c\x87\xa3\x52\xa5\x84\xe5\x73\xd1\x0e\x70\xde\xfa\x91\x49\x18\xf4\x89\x22\x9d\xb5\x1f\xc1\x22\x64\x12\x68\x13\x80\x39\xdb\xed\xed\x87\x31\x1f\xfd\x45\x1b\xc9\xcc\x95\x9f\xa0\x1e\x22\xc5\x34\x66\x23\x75\xdc\xd5\x7d\xf2\x18\x8a\xd1\x5f\x3b\x02\x11\xe2\xf0\xc4\xf7\x79\x29\x9e\x8d\x92\x53\x7b\x80\x04\x79\xda\x5b\xbf\xa7\x1a\x89\xc3\x09\xa7\xa2\x2a\x34\x9c\xa3\x34\x06\xa8\xf7\x7c\x24\x79\x78\x22\x3e\x0c\x4c\xfc\xc2\xdd\xb0\x4f\xa7\x2b\xad\xf4\x28\xa9\xc3\x57\x80\x31\x35\xba\xe0\x2f\x4d\xfb\x62\xce\xa4\x82\xa5\xb1\x18\x75\x0e\xc4\x15\xb0\x73\x4b\x27\xf0\x52\xfc\x86\x4c\xfd\x3e\x9c\x0b\x12\x81\xe2\xa4\x1b\x3e\xc4\x22\x9e\x28\x3e\xef\x83\x1f\x14\x98\xb4\x89\x64\x21\x7d\xd2\x2e\x49\xe2\xf6\x9a\x63\xf5\x68\x74\x38\x8d\xc6\xf4\x6f\x2c\x53\x1c\xba\xb0\xbd\xd9\xa6\x12\x0d\xe8\x98\x0e\xbe\xb2\x5b\x1e\x7d\xde\x89\x61\x4f\x92\xfc\x2e\x72\xa9\x7b\xe6\x50\x5e\x99\x5c\xcb\xa8\x71\x6b\x73\x18\x06\xd2\x3d\x20\x65\xf3\x29\xdb\x7d\x8b\x9a\x1f\xc8\x0f\x5a\xae\x20\x9a\x80\x7d\xa4\xd5\x4d\xd4\x3b\xff\x44\x34\x0a\x61\xf8\x41\x0d\x7e\xcf\x1b\xef\xf2\xe3\xe4\x45\x93\x98\x73\x77\xd0\x16\x89\x4d\xc7\xeb\x15\x57\xde\x41\x4e\x46\x32\x62\x0b\xc2\x2f\xf2\x73\x3b\xf3\x29\x4a\xaa\xd5\x23\xd6\x1f\xd2\xc0\xa2\xc4\x44\x4f\x46\xde\xb4\x95\x20\xf4\xf6\xad\x95\x06\xb6\x6e\x93\xca\x16\xdc\xc1\x48\xbf\xf6\x7f\xad\xa0\xea\x76\x2c\x1f\xe1\xc7\xae\xb6\xf6\xd7\x18\xdf\x28\xf5\xc4\x33\xd8\xb8\x4d\x6f\xcd\x6e\xb8\xdd\x19\xf3\xfa\x9e\xb4\xd4\xe3\xe9\xc7\x4f\x78\xfb\xf0\x9a\xa5\x69\x4e\x40\x6a\x4f\x25\x46\x39\x3d\x68\x3b\x41\xe0\x7e\xdf\x6b\x16\x86\x6d\x48\x4f\x2c\xc8\xc0\x88\x02\x35\xdf\xf1\xe5\xcb\xe8\xe2\x72\x6c\xef\x86\x96\x0c\x7c\xa0\xc0\x9e\x0e\x7c\xa4\xc0\x17\x1d\xb8\xa4\x33\xaf\xbd\x1f\x5a\xce\x51\x35\x98\xa9\xda\xf5\x9f\x9f\xe5\xbd\x1e\x55\xe4\x2e\xff\xd5\xf8\xeb\x43\xf3\x6d\xe1\x83\x28\x14\x72\x56\x51\xdd\x0c\x16\xde\xfc\xed\x75\x45\xaf\xf3\xc6\xaa\x15\xf2\xf2\x33\x6f\xd5\x28\x40\x20\x85\x16\x21\x0a\x82\x68\xfc\xf5\xa6\xf9\x96\x01\x1a\x7f\xe5\x9b\x6f\x91\xfe\x91\xcb\xfa\x70\xb9\x2c\xe4\x97\xf5\xf6\xf5\xb2\x3d\x42\x2d\xe9\xa9\xb7\x50\x18\x71\x39\x35\xeb\xad\xb3\x6c\xbc\x93\xb7\xb5\xc3\x90\x12\xee\x10\x29\xea\xe9\xe9\x47\x98\x28\x21\x75\x0a\x57\xb1\xb0\x59\xff\xee\x47\xf8\x7c\xe1\xde\x8c\xa5\xb6\x24\x4d\x99\xd2\x82\x4c\x14\x23\xbb\x57\x2f\x6a\x3d\xad\xb8\x34\xdb\xac\x74\xb1\xfa\x2b\x18\x6f\x6c\x3c\xbe\x8f\xe7\xce\x31\x2d\x21\x3d\xcd\x52\xe6\xed\x16\xb3\x2c\xd1\xa9\xeb\x12\x6d\x48\x8d\x3e\xa5\x52\xfe\x82\x56\x61\x26\xd7\xf6\xcb\xb9\x12\xbb\x25\xd4\x47\xf1\x52\x63\xc7\xa6\x11\xf6\xe1\x78\xea\x0a\xb7\x7b\x55\x60\xed\xb4\xad\x5b\xf9\x97\xed\x03\xa8\x0f\xaa\xb7\x96\x7e\x3a\x04\xbc\x2a\x81\xb7\x6f\xe5\x5f\x05\xbc\x9d\x02\xeb\x4f\x29\x0d\x7b\x51\x1a\x84\x99\x76\x61\x70\x84\x4b\x8d\x60\xf9\x1a\xa2\x2e\xa9\x2d\x68\x6d\xa3\x5e\x2c\xb8\x47\x35\x28\x91\x35\x58\xf1\xf2\xf1\xcb\x9c\x7e\xe9\x02\x88\xb6\x5b\xac\x66\x7a\x51\xfa\xb2\xf2\x0b\xb8\x81\x86\x43\xfd\xa3\xb1\xfb\x73\x67\xcd\x51\xac\xd4\x52\x86\x95\x5a\x92\x58\x21\xff\x5c\x1d\x8d\x4b\x84\x05\x5d\xfa\xd9\x59\x2b\xd6\x43\x84\x7b\xa1\x0e\x87\x11\xc2\xb7\x6b\x2a\x98\x5f\x12\xdd\xee\x52\x1e\x71\xc3\x8a\x2b\x21\xd9\x90\x40\x8f\x36\x55\x0f\xda\x04\x23\x29\xd0\x0c\x88\x16\xa1\x32\x3a\xa7\xf8\x1d\x58\x88\xee\x05\x4b\x2c\x4c\xe7\xe4\xfe\xe3\x97\xf1\xaf\x9a\x53\xe1\xbb\x56\x7b\x9c\xb2\xfd\xcc\x0c\x54\x39\xff\xd5\x0b\xf9\xa3\x28\x5a\xf3\x57\x92\xfc\xb4\x1d\xfd\x4e\x55\x16\xb3\x44\x94\xd0\x0f\x71\x92\xb8\x1b\x8a\xc1\x54\xa1\x74\x42\x1d\x12\xb7\x4d\xbc\xc1\xe0\x3e\x47\x1c\x44\x3b\x50\x79\xb9\xb6\x0e\x6a\x8b\xa8\x23\xc8\x3d\x84\x6b\xdc\x72\xe9\x8f\xf0\x3a\x27\x08\x2d\x74\xed\x91\xe8\x8d\x96\x40\x8f\xa3\x6a\x8e\x18\xae\xb8\xdd\x5b\xf2\xfa\xe3\x71\xff\xda\xc9\xbd\xd3\xed\x6d\xeb\x12\x96\xa0\x1c\x40\xd5\x94\x2a\xe1\x75\xd2\xcc\xff\xa0\xd3\xbe\x5f\xcd\x31\xc4\x5d\x08\x2e\x81\x1a\xdf\xef\x06\x04\x32\x19\x8e\x00\xc3\x0c\x40\x38\x4c\xcf\x40\x92\xaf\xa9\x94\xd1\xfa\x4c\x77\x41\x77\x69\x2e\xda\x31\xb1\x43\xcc\x70\x54\x73\xb7\x30\x22\xe3\x8b\xae\x8e\x26\xde\x88\xda\xf5\x8a\x1a\x16\xc3\xb5\x2a\x7f\x1d\x04\x73\xc4\x9d\x20\x84\x45\x69\xe1\x67\xd3\x0e\x08\xcf\x30\x34\x47\x14\x9a\x74\xa4\xcd\x39\x1f\x93\x7e\x33\x10\x05\x99\x57\x69\xa9\xfa\x92\xc6\x1c\x28\x64\xee\x41\x46\x52\xa1\x59\x1d\x07\xeb\xbc\xdb\x37\x4d\x25\x51\xaa\x75\x61\x21\x23\xba\xdb\xab\x4b\xf2\x5e\x5b\x58\x98\x8a\x71\x16\x20\x6c\x5a\xf0\x1b\x3b\x4d\xa0\xa1\x9a\x37\x76\x06\x23\x0b\x58\xab\x26\xd7\x97\x23\x97\x09\x01\xc5\x45\x02\xbb\x6f\xd6\xf0\xc7\x39\x82\x34\x2a\x4a\xe3\x93\x05\x78\x9c\x6a\xe0\x9e\x75\x0a\xba\xbd\x41\xe9\xaa\x70\x32\xb2\x7f\xb2\xc3\x49\x27\x7e\xb6\x83\xc6\x96\xc7\x76\xe2\xa8\x24\xb9\x1f\x8a\x72\xdc\x8a\x45\xbb\xcb\xe0\xc7\x36\xb4\xac\x62\x5b\x66\x91\xeb\xe5\x19\x06\x73\x3c\x48\xd8\xd6\xbe\x0d\xd8\x66\x96\x53\x88\xdc\x50\x34\xce\xa8\xb0\x93\x91\x65\x7f\x13\xd2\xc4\x58\xd0\xb8\x69\x16\xba\xb6\x2a\x47\x16\x41\x1c\xf0\xb3\x0d\x87\x55\x56\xb5\xc3\x52\x8b\xd9\x46\xc9\xf5\xa4\x5b\x46\x6c\x03\xb5\xcd\x2b\x11\x07\x8a\x83\xbd\x3b\x69\x63\x82\xbe\x54\xec\xae\x2a\x5c\x1a\xec\xa2\xb8\xee\x00\x22\x4d\x5d\x68\xc2\xca\x63\xd5\x96\xb6\xfb\x43\x74\x1d\x4b\x60\xa8\x01\x12\xcb\x5a\xc8\x76\xed\xcf\xc8\xe5\xcd\x5f\x12\xd2\x8f\x28\x06\xa9\xbb\x56\x60\x77\x1c\xd6\x29\x15\x48\xa3\x6e\x9f\x58\x76\xab\xcb\x9e\x46\x30\x76\x5b\x73\x84\xca\x7f\x51\xe4\x82\x67\x46\x4a\xb4\x92\x5c\x97\x6a\xac\xa2\x20\x15\x2a\xc7\x07\xa1\x69\x53\x0e\x53\x1b\xbc\x06\x36\x2e\x40\x2f\x1b\x56\x06\x15\x78\x81\x42\x85\xd7\xed\x82\x0f\x4e\x90\x90\x24\x7f\xd2\xd9\xcd\x4a\xed\x64\x13\x0e\x66\x37\x04\x1e\x21\x59\xce\xfe\x33\xbb\x1c\x83\xe7\xaa\x0f\x9b\xae\xb2\xc8\xda\x60\xe4\x78\x63\x8b\x78\x8a\xe9\x91\x76\x13\x8a\x95\xe3\x4d\xc7\x46\x38\x43\xb6\xb1\x4f\xe1\xcf\x53\xba\xc2\x02\x4b\xe6\x3a\x68\x1a\x76\x99\x09\x6a\x7d\x0d\x52\xa4\x72\x9a\x61\xa2\x62\xa1\x6c\x39\x44\xff\x78\x1b\x0f\xfc\x7f\x5d\x80\x68\x5c\x85\x4d\xfc\x57\x9a\x8b\x94\xb0\x7f\x3a\x5f\x27\xde\xa0\x2a\xe3\xe1\xc3\x4f\x91\x6a\xf0\x24\xf2\x12\xd6\xb3\x8f\x67\x4a\xf0\x6a\x6c\x20\xac\xe6\x41\x41\x56\xf6\x11\xee\xd4\xd6\x6f\x9a\x90\x05\xae\x72\xab\xe7\x28\x53\x73\x6b\xaa\x1d\xac\x92\x2a\xdb\x13\xfb\xe1\x35\x59\x81\x80\xd6\x90\x27\xd7\x10\x67\x5e\x5f\x9b\xab\xd3\xd2\x65\x41\x5a\x51\x6a\x07\x8b\x8b\x0f\xb0\x49\xdd\x0e\x6c\xb9\x5d\xb5\xbc\x30\x15\x3f\x0f\xe2\x76\x0d\xb1\x48\xad\x2d\x94\x93\x61\x24\x3c\x36\xa3\x2f\x98\xba\xf9\x94\x34\x9a\x38\xac\xc1\x48\x49\x51\xfe\x7c\x86\xad\xb8\x44\x76\x84\x58\x17\xe2\x8e\xe2\x9a\xc7\x62\x80\x10\xf2\xbf\x6a\xd5\x22\xd7\x73\x42\x95\xdf\xab\xd1\xb7\xb3\xea\xb2\x71\xc1\x4c\x24\x15\xe6\x43\x4b\x01\xe2\x95\x5b\xb0\x5e\x50\x0d\xf1\x9b\x18\xcd\xfa\x69\xe2\x53\x27\xb0\xa7\xb0\x29\x15\xa0\xce\xd5\x4e\x24\x47\x3b\xfc\x3c\x6f\xc0\x92\x6e\x04\xc9\xbe\xec\xae\x4d\x4d\xbe\x61\xa9\x10\xb3\x91\x5a\x67\x04\xbe\xb4\xa7\x2c\x1d\xb3\x31\xc9\xa8\xa9\x87\x57\x7d\xab\x11\xb6\x7e\x06\x6c\x03\xb9\x1a\x36\x76\x6f\xd8\x0f\x9e\x14\x08\x5d\x20\x60\x8f\xf7\x1f\xc3\xa5\x98\x95\xc0\xbb\x0a\xb1\x06\x0a\xb1\xde\x00\x2b\xb2\x1d\x07\x29\x5e\xca\xee\x01\xcf\xbd\xa6\x55\x0b\x4b\xe2\x6f\xb6\x7f\xe8\x84\x40\x78\x02\xd2\xb8\xa9\xad\x07\x9e\xcf\xee\x60\x5a\x93\x45\x76\x2c\x41\x56\x65\xab\x4a\x0b\x0d\x24\xc2\x0e\x47\x30\x6a\x74\xc3\x6e\xfa\x18\x5f\x4d\xfe\x39\xef\x8f\x02\x54\x82\x79\x94\xcc\xc1\xd6\x7b\x8d\x7a\x89\x51\x96\xe5\x0d\x5f\x68\xcb\x72\x3b\x70\xf3\xb5\x5f\x70\x64\x4b\x8d\xf2\xd2\x9f\x74\x7e\xa8\x2d\xd3\xf8\x4c\x08\x8d\xb1\x7d\x09\x29\x2c\x0a\x11\x6d\x9b\x8d\x60\xc9\x16\x9b\x86\x25\x25\xd6\x26\x9e\xd2\xd3\xa2\xbd\xc8\x2c\x40\xd1\xe2\x24\x73\x35\x66\x5d\x11\xb6\x73\x25\x58\x60\xf4\x07\x91\x0e\xde\xad\xa6\x84\xed\x78\x9c\x6c\x59\x65\x3e\x92\x10\x4c\x44\xd8\xe0\x24\xb6\xd8\x14\x98\xa7\x23\xbe\x52\x44\xb9\xa9\xf0\xa7\x8a\xbb\xe5\x38\x6a\xb4\xa6\x84\x31\x2c\xf2\x7f\xf2\x9a\x3c\x7d\xcf\x9e\x59\x58\x19\xa6\x47\x15\xdc\x43\xcb\x02\x7a\xf5\xed\x1d\x7c\x94\xf0\x1a\x08\xcf\xb3\x37\x30\x20\x69\xc8\x5e\xb5\x4d\x33\xf5\x49\xf7\x3d\x9e\x87\x6b\x36\x8f\xa6\xb1\x39\x90\x34\x0c\x85\x30\x39\x92\x6a\x48\xea\x1c\x41\x67\xbe\xb4\xb7\x93\x31\xbc\x68\x4d\x70\x84\x2a\xf5\xe0\xe4\xba\x2a\xbf\xbf\xc6\x2f\x1d\x34\x7a\x9d\x67\x05\xf3\xc3\x04\x51\x69\x5a\x7f\x0b\x65\x29\xcf\x09\x1b\xd0\x1d\x4b\x6b\xbc\x1d\x9b\x4b\x82\x88\xf9\xdd\x18\x8d\xa3\x13\xc8\x3e\x6b\x8b\x6f\xed\x43\xb1\x92\xc3\x6c\x3f\xb3\x5d\x50\xc2\x75\xb5\x6f\x85\xc4\x76\x83\x43\xa3\x22\x1b\xb1\x61\x36\x02\x8a\x94\x7c\xa8\xdf\x67\x21\x71\x75\x0f\xb0\xcf\xbe\x13\xf4\xf7\x88\x46\xdb\x2a\x98\x2d\xba\xe3\x19\x17\x89\xd1\x77\x41\x3d\x73\x0f\x62\xa0\xd2\x1f\x05\x63\xf4\x6f\x67\x8e\x7f\x74\x52\xcf\xa0\x44\x8f\x8d\x89\x7a\xc9\x61\x3e\x49\xf3\x9a\xd5\x2e\x1b\x6a\xa1\x32\x52\xd2\x12\x58\x0e\xd5\x1d\x58\xe6\x84\xdc\xab\xe1\xa1\xc5\xa0\x15\xce\x5e\xa7\xb6\x21\xea\x83\xd4\x4f\x4f\x43\x0c\xb5\x97\x14\x65\x0d\xef\x58\x4a\xd7\x84\xca\xd5\xcf\xe3\x23\xe6\x53\x2a\xf0\x05\x02\x76\x0c\xef\x67\x87\xec\xb9\x7a\x3f\x3b\x99\x3a\x72\x4a\x16\x65\x66\xbe\x51\x43\x59\x03\x67\x65\x7b\x66\x60\x67\xda\x48\x7c\x42\xda\x36\x53\xfb\xfc\x41\xce\x47\x23\xa4\xd5\x6f\xce\xd3\x23\xc7\x3f\x8e\x1b\xa3\xd0\x24\xf7\xe2\x59\x46\xb9\x51\x9b\x57\xff\x5d\x9b\xca\x5b\xa7\x95\xf8\xa5\x53\xf8\xd3\xb2\xef\xb3\xc1\x07\x0a\xae\x13\xd3\xb9\xb0\xdb\x29\x04\x91\x55\x5d\xd8\xa6\x24\xfa\xbe\x1d\x5a\xd5\x0d\x8a\xa7\xcf\x7c\xa5\xf4\xa7\x97\x27\x2e\x69\x5d\x86\xef\x86\xf4\xfd\xa8\xd2\xfe\x2c\xbd\x43\xd2\xb6\x0c\xea\x5c\x0b\x1a\x4c\x65\x41\xc9\xec\x8f\x9d\x6b\xab\xdd\x8c\x9c\xfc\xd6\xd1\xc1\x27\xbc\xb4\xec\xf6\xf2\xf6\xba\x8c\x1e\x1a\xd1\x47\x93\xb1\x71\x29\xb6\xae\x56\x01\x8d\x6c\xa2\xa6\x52\x83\x3d\x34\x62\xef\x93\xf5\x20\x4d\xfe\xd4\x33\x21\x1e\xd1\x8c\x80\x96\xe1\x7a\x4e\x09\xec\xb8\x46\xe0\x1b\xd1\xb8\x73\x55\x02\x61\xf9\xaf\xe9\xe7\x5d\xfa\x79\x9f\x7e\x4a\x0d\x3e\x96\xd8\xa1\x9c\x9f\xa7\x12\xb4\x10\x96\xab\xa6\x56\x09\xda\x60\x19\x7e\x51\xa0\x89\x0f\x3b\x2d\x4a\x83\xc4\x33\x23\xf1\x70\xb6\x3f\x67\x2b\xc9\x42\x3e\xd1\x8e\xef\xa4\x53\x15\xe9\xc3\x0f\x0a\x93\xdf\x0b\xeb\x63\xfb\x7e\xac\x94\xdb\x68\x7c\x1b\x15\x7b\xcd\x5e\x69\x56\x2f\xdc\x75\xbe\x20\x7a\xb5\x2f\x66\x0c\x2f\x49\x1c\x94\x6c\x35\x1a\xdf\x74\x74\x05\xf6\x17\x74\x07\x09\x17\x6f\x4b\x3b\xfd\xe9\x60\x7b\xda\x49\x8c\x68\x78\x37\x4d\x69\x10\x12\xd8\x67\xa3\xa3\x54\x25\xaa\x63\x87\x19\x49\x5a\xb3\x41\x63\x04\x5b\xa2\xa1\xab\xad\x7e\xe7\xc6\x8a\x93\x8c\x68\xa7\xc1\x45\xed\xb3\xb4\x52\xc4\x3d\x7e\xd6\xde\x52\xdc\xdd\x51\x0d\x2a\xc8\xd1\xb0\x7f\xad\xea\x77\x28\x76\x67\xc4\xdc\x84\x28\x8d\xfb\x49\xab\xe6\x4c\x7a\x50\xcd\x4c\x32\x16\xb9\x44\x9d\x0b\xac\x5a\x72\x03\xdd\x12\xfa\x8b\xdb\x1e\xf1\x10\x0e\xbf\x65\x17\xc8\x14\xf8\x1e\x83\xef\xa5\xe0\xdf\x93\x35\x63\x40\x6d\x05\x80\xa2\xbf\x04\x45\x18\x23\xfc\x96\x2e\x27\x03\x6a\x9b\xa1\xb6\x13\xa8\xef\xe9\x4a\x13\x8d\x5d\x4f\x5a\x37\xbd\x4f\x62\xf6\x54\x8c\xb9\xee\x44\xe3\x84\xc6\xfc\x73\x02\xd3\xbd\x31\x60\x92\x25\x28\x1a\x1d\xc4\xbf\x82\x3e\xd1\xe3\xa8\xc6\x60\x4e\x02\xa5\x16\xa6\x68\x7c\xa7\xa2\xbe\x24\x45\x0d\x6f\x9a\xd3\xcb\x53\x34\xfc\x61\x33\x59\xa1\xa2\x71\x9a\x80\xd0\xb2\xbc\xed\xd4\x38\xc6\x91\x05\x1d\x26\x50\x5b\x09\x14\xad\x58\x41\xd4\x6c\x1a\xfd\xa9\xf5\x2b\x71\x9c\xa1\x24\xb4\x91\xbd\xba\x23\x64\x56\x13\x54\x06\xba\x4c\x67\x06\x47\xf0\x75\x40\x3c\xaa\xe1\x04\xe1\x2c\x2c\x14\x74\xe2\x22\xad\x79\x22\x33\x06\xb9\xda\x1c\x1b\xbc\x02\x17\x5b\xc6\xc1\xb1\x00\xd4\x75\xdb\xc1\x91\xe0\x3b\x4e\x2c\x17\xbf\xc2\xf2\xeb\xc4\x5d\x37\x1e\x6e\x9a\x1a\x0b\x25\x7d\x42\x64\xcd\xf8\x2e\x58\xca\x31\xbe\x16\xcd\x95\x92\x47\x4c\x1e\x60\xed\xe5\x45\xda\xc0\x35\x84\x66\x0d\xf2\xf6\x50\x95\x26\x6d\xdc\x52\xba\xa5\xe8\x41\x62\xb7\x42\x94\x64\xd7\xa4\xc6\xc3\x42\x05\x98\xdd\xc2\x96\x2b\x70\xc7\x9e\x9e\x2a\x95\x95\x0f\x2e\x4f\xfb\xe2\x62\x65\x65\xf5\xa3\xfc\xa6\x21\x60\x31\x6f\x78\xc8\x95\xbb\x90\x06\x9b\xd5\xad\x6f\x47\x2f\x5e\xae\x9e\xb0\xe6\xfe\x14\xdd\x44\x3b\xb7\xc6\x10\x37\xe8\x8f\x26\xc3\xf0\xef\x2e\xbf\xe1\xb2\x18\x45\xbe\x58\xa8\x6c\xbf\x7f\xdb\x6a\xec\x40\x09\x12\x6b\x33\x99\x95\x6d\x63\x56\x16\x0a\x0b\xe2\xe9\x69\x81\x56\xcb\xb8\x29\x55\xb4\x37\xdb\xb8\xad\x4a\x80\xb7\xda\x62\x46\xc1\xee\x6b\x5f\x2b\x75\x1e\xd5\x0d\xdc\x0e\x8e\xd1\xab\x6a\x54\xe6\xab\x89\x6a\x6d\xbb\x0b\x0b\x0a\x17\xd4\xe9\xa8\xac\x3c\xc1\xd1\xb2\x2e\x16\xa9\x2e\x19\x0c\xb7\xe5\x68\x7f\xaa\x03\x17\x25\x95\x7f\x92\x64\x18\xc9\x84\xb9\x04\x2a\x96\xa8\x37\xa9\x98\x71\xa3\xfe\xac\x4b\xcc\x6c\xd0\xeb\xcf\xe9\xcb\x8e\xe4\x67\x25\x3b\xd8\x82\x09\x0e\x79\xc1\xbe\xef\x96\x9f\x2f\xdc\xcf\xea\x02\x5f\x04\xb3\x37\x74\xe8\xb6\xf6\x86\xd8\xc1\x60\x6a\x13\x43\x1b\x2d\x9c\xb6\x04\x58\x46\x23\x22\x35\x1e\xb9\x4f\x27\xb6\xaa\x3c\x0b\xec\xf0\x96\xe2\xb2\xaa\x4b\x15\x68\x2a\xe3\x30\x1e\x37\x6d\x58\x56\xf3\x64\xb7\xa1\x55\x2c\xfd\xfd\x61\xcc\x3d\x5b\xb7\xda\x8e\x6c\x1a\x40\x38\xe6\x62\x40\x9f\xb6\x36\xbb\x37\x37\xbd\x48\x4d\xa6\x09\x8b\xb2\x65\x94\x34\x99\x6d\x0a\x08\x69\xfb\x84\x5b\x6a\x98\x2c\x37\x4c\xdd\x51\x0f\x04\xf1\x90\x68\x6f\xa8\x0a\x49\x0c\x22\x7e\xf0\x6a\x05\x9a\x10\x18\xbf\xb3\xec\xe3\x36\x0c\x05\x60\xc7\x00\xae\x62\xd9\x65\x69\xf7\x16\x94\x21\x84\xb8\x4b\x2e\x2d\x4f\x0f\xc7\xd2\x52\x72\x8d\x62\x5a\xcf\xdc\xcd\x70\xe3\x89\x8d\xa4\x82\x34\x61\x37\xdb\x54\x3a\xd8\x5c\x15\x10\xdf\xf0\x61\xb5\x8a\xcf\xa9\xd4\x2e\x8f\xdb\xa0\xe2\x33\x2d\xd1\xb0\x42\xb6\xc1\x38\xb6\x5e\x4c\x5f\xbc\x09\xbe\x74\x50\x63\x96\x70\xd8\xd2\x51\xbe\x39\x78\xec\x89\x9a\x95\x41\x85\xa9\xf7\xa9\xfb\xec\x6b\xb3\x39\x89\xb5\x7d\x62\xc9\xed\x4f\x20\xc4\x21\xf4\x7a\xb2\x23\xe4\x37\xab\xc9\x08\x3d\xa7\x73\x7a\x51\x0a\xcf\xe7\x9e\x61\x93\x91\x95\xed\x94\x76\x60\xe4\x13\x5e\x6a\x2c\x34\x31\xda\x03\xcf\x02\x86\xd1\x9e\x6a\x84\x1d\x09\x7d\x69\x65\x7c\x26\x63\x80\xf0\xeb\xde\x3c\x8b\x58\x33\x35\xaa\x25\xb3\x54\x01\x13\x54\x08\xf5\xf2\xf6\x8d\x4b\x01\x5a\x2f\x21\x11\xa6\xe4\xe2\x0b\x06\x1e\xe7\x77\xc7\x87\x02\x32\x2e\x23\x6a\xaa\x78\x07\x5e\xf3\x7d\x5c\xe9\xe8\x99\xba\x50\x86\x4e\x36\x5a\x73\x4d\x7c\x4a\x4b\xcf\x42\xf6\x36\xb6\xe4\xea\xc1\x3c\xc6\xb0\x77\xb9\x00\x9d\xd0\x50\x06\xa9\xef\x38\xa1\xcf\x79\xd8\x32\xb9\x7c\xa3\x3b\x3f\xb3\x23\x2a\xa6\x46\x14\x1d\xe4\xd5\x1a\x11\x8e\x5a\x5c\x8c\x80\xa1\x30\xb6\x72\x90\x17\x16\x7c\x7c\x12\x5a\x4a\xbc\x63\xe4\xc2\xe7\xc4\xc0\x28\x8f\xe2\x17\x13\x7d\x5f\xcf\xa2\x6d\x7b\x0f\xc6\x09\xed\xed\x2c\x56\xde\x1f\x67\x8c\xf8\x69\x03\x56\x53\x1e\xb2\x3c\x7d\x6f\x24\xc1\xe1\x1f\x4b\xe6\x30\xdf\xc2\x9e\x7d\xf7\x60\x5c\x48\x8d\x04\x31\x75\x20\x82\x7f\x5d\xd0\xe5\x3b\x9f\x12\x1a\x40\x34\x0e\x31\x06\x86\x6e\x67\x14\x7e\xe5\x3d\xf3\x1c\xeb\x58\x4c\x7b\x59\x32\x21\xaf\x71\xe2\xc2\x42\x68\x77\xdc\x43\x54\x57\xc5\xa1\x9d\xc6\x76\xdc\x74\x3b\x8c\x01\x19\x6f\xb3\x07\x0a\xa0\xe4\x42\x5a\x3e\x2f\x73\xc2\xfe\xa9\xbd\xd6\xc0\xfd\x4c\x6d\xc0\x8d\x05\xd1\x84\xa0\x1a\x28\x44\x1f\x60\x2a\xfc\xaa\x68\x9c\x33\xe7\x78\x8e\xab\x26\xb9\xbc\xa8\xa4\x18\x8a\xbb\x62\x3c\x16\x4a\xe5\xa3\xb0\x03\x8c\x2b\x93\x2d\xe0\x3c\x1a\xee\xd4\x19\xbd\x69\xe6\x99\xeb\x52\xaf\x8b\xbb\x6d\xea\xb9\x4b\x87\xbb\x5a\xb2\x28\x4d\xe7\x22\x84\x1b\x3d\xc6\xdf\x1e\x35\x05\x37\x2f\x8e\x09\x86\x8b\xb5\x69\x88\xac\xa7\x7e\xff\x79\x9e\x37\xfc\xff\x6e\xe2\x8f\xfe\x87\x89\x5f\xdf\x9c\x3b\xf3\xe5\xa9\x99\x3f\x9e\xdf\x92\x17\x1a\x72\x3c\xdd\x10\x75\xc4\xe0\x16\xd8\xba\xea\x5b\x2f\xad\x5a\xf0\x95\x32\x2f\x0f\x69\x56\x82\xc8\xff\x1e\x27\x4b\x6a\x48\x91\x27\xc0\xfa\xc6\xe4\x9c\x8c\xd5\x35\x1c\xdb\x34\x00\x5b\x83\xc3\x53\xb8\x9d\xa5\x1f\x28\x89\x06\x1d\x83\xbd\x3d\x36\x9c\x97\x10\x1d\xf2\x4a\xdf\xbb\xa9\x51\x42\x30\xba\xec\x1c\xf9\xa8\x5e\xf5\xd4\x23\x43\x46\xd5\xa3\x36\x37\x16\xde\x7c\x89\xd6\xb4\xb6\x2d\xc7\xe3\x77\x38\xb5\xc8\x16\x17\x33\x41\x5e\x73\xbe\x5e\x6d\x4b\x4b\x55\x3a\x25\x1c\x72\x7b\x6a\x05\x6a\x0a\xbc\x51\x81\xa0\xf9\x44\x16\xe0\xe4\x28\xe1\x73\x68\x14\xb1\x4f\xe4\x25\xad\xc3\x1c\x92\xc6\x62\x65\x43\x5b\x4d\x0f\xc5\x42\x62\x28\xa3\xac\x7a\x9c\x5a\x7b\x10\xd4\xdd\x1a\xfe\xe0\xe2\x4e\x5f\x6b\x95\xab\x6a\xd4\xab\x53\xb9\xe7\x90\x43\xa6\xce\x86\xd9\x03\x45\x7c\x37\x70\xbf\x65\x52\x40\x60\xcc\x13\x45\xfd\x16\x17\x89\x16\xa6\x2b\x3b\x9d\xbd\x2f\xf2\x6e\x6b\xb6\x91\xdb\xe7\x85\xcf\xf2\x60\xae\x5b\xa6\xfa\xbb\x20\x58\x28\x40\x27\x1b\x1a\x92\x99\x4b\x4a\x66\x7b\xf6\xc6\xb5\x3d\x98\x76\x75\xf8\xaf\xdb\x69\x15\x85\xa1\xe5\xd8\x16\xd3\x76\x06\x2a\xf2\xa1\x4d\xae\x3f\xd8\xff\x93\xbd\x53\x48\xa2\x69\x49\x39\x0a\x4f\xf5\x15\xc8\x59\xc8\xd5\x2e\x52\x43\x03\x9e\x36\x9d\xca\xd4\xc0\x87\x6d\x53\x26\x13\x85\x70\x91\xf8\x3d\x3a\x8b\xee\xb7\xf1\x42\x09\xbb\x16\xaa\xa9\x57\xa2\x60\xee\xb1\xfd\xb6\xc8\x1a\xa8\x20\x34\x81\x61\xae\x0b\x75\x2b\x40\x4c\xef\xa7\x3a\x6f\x84\xf4\x32\xca\x07\x5e\x09\xec\xcc\xce\xd8\x6d\x0b\xc3\x24\x52\xba\x23\x78\x4d\x2c\x10\x0a\x4b\xd8\x2f\x22\x95\xed\x42\xb7\xcd\x14\x19\x98\x78\x1d\x4b\x91\x4f\x45\x36\x5f\x1f\x28\xe3\x54\xbe\x3c\xf2\xea\x53\xb5\x6f\x9e\x84\x60\xb6\xca\x51\x43\x20\x3d\xe2\x60\x1d\xf3\xc9\x07\x87\xa3\xcf\x70\xea\x44\x67\x9f\xa9\x9b\x88\x18\x46\x2f\x16\xd8\x61\x62\xa4\x0b\x76\xa7\x0a\xf6\xb3\x07\xae\xb2\x74\x8a\x22\xad\x0e\x06\x8d\x33\x3a\xfe\x46\x55\xd8\x6d\xc0\x33\x94\xaf\x6c\xeb\xa5\x08\x89\xf7\x73\x87\x7d\xdf\x12\xe7\xb2\x10\x94\x1e\x1f\xe1\xcd\xc7\xed\x54\x3b\xc4\x16\xd6\x07\xb8\x1f\x87\x8d\x3f\x9b\xa6\x07\x2b\x02\x01\x30\xdf\x65\xec\x51\x14\x03\x03\x81\x2a\x5b\x47\x32\x57\xb0\x13\xf8\x72\xc6\x8a\x9d\xda\x77\xd6\x74\x5f\xcd\xa9\x1a\x5a\x4f\xd9\xa8\x37\x14\x60\xc7\x8a\x0f\xc5\x2e\xaf\x1a\x2b\x78\x34\xc6\xa1\xb6\x1f\x11\x6d\x54\x5e\x5b\xa5\xd8\xd4\x19\x31\x10\x7f\xff\xad\x59\x08\x29\xa1\xfb\x77\xd4\x93\x9c\xc4\x9f\x9a\x93\xf8\xf8\xf1\xa3\x79\x04\x3c\xd0\xe8\x61\x68\x5a\x7f\x11\x44\x2e\xcf\xc6\x4d\xa6\xc5\xf4\xeb\x9a\xb7\xfb\x09\x59\xeb\xc9\x47\x9b\xf4\xee\x13\xa0\x06\xf3\x54\x1f\xeb\xeb\xd6\xef\x5d\x4d\xcb\x8d\x73\xfb\xb7\x91\x64\x27\x65\xe8\xf5\xa6\x3c\xb1\x7d\x2f\xd4\xc7\xf6\x04\xb7\x5b\x38\x88\xe1\x30\x8a\xb5\x76\xe1\xd6\xd5\xb9\x6c\x77\x7d\xd6\x0e\x19\xe5\xe5\x33\xf1\xb4\x02\xde\x1c\x0e\x76\x7f\x6c\xda\xd9\x09\xd8\xee\xda\x1c\xcc\x3d\x27\xe7\xf1\x4c\xce\x57\x93\xc1\x94\x35\x3f\x46\x8c\xda\x46\xd1\xeb\xcd\x94\x13\x67\xf7\xce\x3e\x64\x2f\x28\xda\xd2\x5e\x91\x0d\x26\x9e\x06\x03\xfb\x99\x9d\x4c\xf0\x3d\x83\x74\xdc\x22\x78\xdc\xf8\x1a\xde\x37\x6e\x1b\xcc\x45\x70\x3f\xb6\x58\x8f\x56\x5d\x11\x2a\x30\xed\x8d\xaf\x9a\x94\xc0\x1e\xcb\xae\x3a\x05\x38\x17\x52\xee\x8b\x68\x3d\xb3\xff\x18\xcf\x4a\xf9\x67\x4f\xed\x09\xa1\xf7\x44\x5c\x8d\x69\x4f\x44\xae\x54\x57\x26\xce\x19\xdb\xff\x7c\x0c\x6c\x85\x0d\x81\xd7\xb6\xb0\x0a\x68\x36\xfb\x5c\x57\x3e\x4c\x67\x40\x6c\x05\x92\x26\x54\x64\x82\x65\xa5\x4d\x00\xfb\xae\x6a\x8e\x25\x0e\x85\xbf\x96\x17\xea\x56\xf9\x53\x9f\x17\xd6\xf4\xb5\x48\x7d\x5c\x0a\x4b\x1b\x53\xd7\x45\xdf\xbb\xca\x05\x76\x86\xd8\x65\x17\x21\xce\x28\xd7\x73\xd6\x80\x79\x0d\x43\xd9\xc1\x90\x26\x9e\x7e\x08\x86\x9a\xa4\xd7\xd4\xfa\xe6\xff\x90\xbd\x9c\x64\xbf\xf5\xfe\x31\x7b\xe3\x84\xe8\x8d\x99\x5d\xe6\x4d\x95\xc6\x8d\xa3\x0b\x48\x16\x55\x48\x54\x4b\x65\xf0\x2c\x65\x7e\xd8\xf0\x01\xa9\x49\x98\xe1\xfd\x15\x0b\x24\xe5\xde\x8a\xc5\x48\xbf\x68\x7a\xda\x4c\x11\x51\xb2\x98\x29\x59\x2c\x29\x5b\xea\x73\x82\x08\x54\x97\x7e\x40\xa0\x62\x26\x50\x31\x13\x28\x9c\xf1\xc1\x5b\xc5\x7c\x09\x0d\xd2\xd7\xc1\x04\xe1\xfd\x89\x26\xf3\x39\x41\x92\x54\x30\x25\x06\x78\x90\x79\x9e\x73\xfe\x9d\x1a\xca\xf0\xdc\x1c\x0a\x8b\x27\x70\xee\x09\x76\x2a\x1f\xf1\x91\xb3\x43\x38\xe7\x7c\x3a\x95\x8d\x18\x0d\x3e\xab\x1a\x7e\x9e\x94\x59\x76\xcf\x9c\x82\xaf\xea\x3e\xa3\x3e\x9e\x5a\x83\xbb\xb7\xb0\x96\xa4\x5e\x11\x5a\x5b\xa0\xb5\x5e\x5b\x86\xee\x57\xdd\x6f\xf2\x88\x7b\xb3\x6a\x1b\x59\x86\xdb\xee\x6d\xbb\x80\xa7\x85\xaf\x63\xbb\x4e\xf8\xf1\xc2\xfd\xaa\x50\xa2\xd2\x99\x06\x85\xbd\x28\x45\x81\x96\x37\xbd\x59\x9d\xf3\x1a\xd9\xf8\x7c\xd3\xd4\xa7\x16\x94\xb7\xa4\x0a\xaf\x96\x3f\x80\x85\xfa\x50\xfa\xe3\xad\x6a\xa1\xbc\x50\x8d\xd4\x55\x46\x6b\xab\x71\x7f\xa3\xdc\xb6\xdf\xcb\x86\x11\xcc\x92\xd0\x5e\x53\xa2\x40\x0b\x2b\x13\xa4\xaf\x21\xa3\x40\x99\xc2\x54\xad\x92\xa1\x46\x44\xe9\x5f\x47\x2a\xf0\xf9\x26\x31\xcb\xfc\xeb\xca\x54\x51\x6a\x20\x60\xea\xae\xba\x37\x65\x29\x54\xde\x20\xea\xe1\x50\xef\x3e\x51\xa0\xdf\x81\xff\xab\xf2\xd9\x9c\xe9\xe0\x57\xe5\x57\xaa\xff\x4d\xd7\x67\xd1\xd3\xd7\x39\xe8\xa9\x71\xc1\xf7\xca\xe6\xbd\x50\x6b\xcb\x58\x52\x17\x63\x2d\x1f\x93\x90\x6c\x9f\x8f\x47\xdf\x18\xef\x1a\x34\x22\x7d\x41\x06\xa1\xc6\x1b\xb2\xc5\x50\x08\xe1\x64\x33\xdf\x76\x74\x57\x11\xc0\xc4\x84\x6e\x6a\x11\x77\xa5\xb2\xf6\xfb\xda\x1f\xab\xef\xd7\x7e\xff\xe0\xc1\xdb\x90\xd7\xe6\x51\xa4\xe6\xe0\xc1\xc3\x30\x22\xc1\x1c\x05\xa5\x62\x2c\x84\xb9\x1f\xbe\xf3\xfb\xfe\x77\x7e\xa0\xf5\x63\xf5\x78\x26\x83\x9d\x60\x46\x66\xb7\xaa\x2f\x53\x09\xd4\xe2\xab\xd5\x9f\xcf\xf6\x81\x12\x95\x67\x31\xa3\x46\x19\xcc\x01\xdb\x9a\x83\x39\x4b\x3b\x85\x77\x33\x16\x6c\x51\xdc\x8f\x71\xda\x8e\x43\x3e\xba\xd3\x56\xa2\x0f\xfb\xfb\xd8\xe0\x86\x8e\xcc\xe3\x02\xd5\x78\xc0\x61\xab\xc6\x4c\x9a\x0f\x3b\x5b\xdf\xa4\xb7\xf7\x82\x72\xba\x0f\x35\xd3\xf1\x78\xa0\x54\x85\xd2\x41\x38\x48\x8e\x30\x44\xcf\xae\x62\x91\x71\x34\x9f\xb8\xd1\xcf\xe6\x9e\x72\x46\xaf\x60\x32\xd5\x9a\x0f\xfe\x8d\x6f\xb1\x80\xc6\x2c\x54\x69\xa1\xfd\xda\x9c\x76\x6b\xa3\x1e\xfe\x3d\xbe\x56\x24\x76\x5b\x9f\xf8\x67\xfa\x42\x4b\x95\x1b\xe9\x06\x8a\x03\x0f\xf1\x0a\x61\xb8\x31\x84\xde\x28\x3b\xd3\x66\x3b\x13\xd9\xdc\x25\x1d\xcc\x5d\x43\xfc\x15\x0a\xa8\x41\x7b\xc4\x5b\x84\xcd\x2a\xb3\xd6\xae\x4a\x53\x0a\xaa\xcc\xbd\xc0\x87\x54\xea\x32\x3f\xc7\x0d\x78\xfe\x21\x95\x1b\x68\x5e\xd2\x39\x79\xcd\xeb\x69\x06\x87\x4a\xe7\x74\x23\x86\xef\x76\xd4\x56\xac\x03\xaf\xa6\xef\x10\x3f\x26\xc9\x2e\xf5\xeb\xca\x4b\x45\x60\xbc\x53\x7c\x7d\x90\x91\xd1\x8a\x7b\xa4\xac\x54\xaa\x98\x93\x8a\xfc\x3d\x3a\x93\xbf\x61\xfa\xea\x1b\xd6\xf5\x8b\x72\x60\xbe\x79\x3c\xf8\x42\x17\xe2\xaf\xc8\x4c\x81\x60\x61\x82\xef\x85\xd7\x12\x65\x63\x3e\x8e\x59\xb7\x81\xd5\xdb\x6a\xaf\x97\xdb\xf6\x09\x5e\x87\xcf\x86\x76\xfe\xf8\xbc\x9e\x6f\xda\xa7\x08\xe2\x9d\xf8\xb5\x42\xee\x83\xbe\x98\x91\x5e\xf8\x81\x97\xa7\xab\x02\xc1\x4a\x0a\x41\xe4\xee\x61\x30\xf7\xda\x5f\xcb\xa0\xec\x04\xe9\x45\x5c\x03\x32\x4f\xa5\x5e\x38\x2e\x7d\x6b\x0d\x77\xfb\xcd\x9c\x9c\x47\xb6\x45\xcf\x33\xa9\xbc\xf5\xd3\x64\xc1\x14\x84\x52\x79\x73\xf3\x45\x35\x54\xc5\x7c\x15\x6b\xe8\x7c\xd8\x76\xd9\x27\xa0\x07\x49\xba\x46\x07\x86\x45\x9d\x93\x58\x3d\xac\xd0\x88\x8a\x64\x8c\xd5\xb0\x18\x63\x88\x89\x51\x83\xb8\xa3\x90\x72\x54\xaf\x1d\x69\x3d\x98\xa8\x6e\x39\x08\xfc\xd0\xef\xc9\x7a\xf6\x08\x48\xfd\x12\xc6\xa0\xfa\x7e\x8c\xf9\xb7\x7a\x32\xd0\xfd\xb4\x15\xf5\xdc\xf1\xd5\xe0\x58\xbc\xf6\xf5\xa4\x6a\x39\xa0\x9d\xa0\x71\x80\xe3\x8b\x9d\x92\x7f\x60\x90\x04\xac\x92\xee\x04\x8e\x3b\x1f\x15\xde\xa5\xb7\x66\xcf\x02\x52\x83\x47\xa6\x77\x14\xb5\x1c\x1b\x1b\xfc\x60\x40\x24\xe1\xa6\x33\xe3\xa6\x37\x82\x45\x24\xaa\x93\x4d\x74\x07\xee\xb7\x76\x21\x2a\x1d\x40\xb8\xef\x8c\x4e\xd9\xf0\x0a\xd1\x2e\xc1\x8c\x17\xd4\xfb\xa5\x73\x9b\x84\xc9\x37\x52\xaa\x0b\xaf\xdb\x85\x13\x5c\x38\x12\x52\x7c\x45\xb4\x8d\x5a\x22\x0b\x3e\x24\x3c\xd0\x81\x7e\x43\xd4\xf8\x4a\x8c\x5c\xb6\x6e\xd5\x6b\x00\x2a\x74\xb3\xc3\x2d\x96\xcd\x31\x39\x0d\x5a\xc8\x9a\xa0\xed\x40\xa2\x56\x8a\xfe\x42\xc3\xdb\xd5\xe9\xb0\x03\x9b\x3e\x21\xed\x04\x06\xfc\x94\x3a\x56\xb2\x11\xe4\x34\xd4\x35\xfa\xb6\xcb\x1f\xd4\x66\x82\x6c\xa1\xde\x35\xe7\x7a\x01\xd0\x7a\xb5\x6a\x49\x99\x4a\x05\x4d\xed\xc4\xba\x9e\xc1\x52\xbf\xa7\x53\xd4\xa4\x77\x23\x35\xe7\x8e\xde\x9f\x17\xe3\x4c\x8a\xce\x6d\xa9\xa9\xa6\xed\x6d\xac\x88\x36\x13\xac\x34\xa5\x92\x5e\x48\xa4\x8b\x20\xce\xda\xd1\x3c\xcf\x5c\x30\x29\x89\x9b\x3f\x89\x3c\xe1\xe6\x51\xb7\x1c\x6e\x98\x10\x4c\x1a\x6c\x90\xcb\xb3\x4c\x01\xd0\x0c\xa7\x63\x20\x9b\xe9\x85\x43\x8b\x6e\x64\xee\xfe\x79\xf4\x41\xb4\xd5\x79\x26\x9d\x06\xda\x72\x7e\x4b\x14\x55\x87\x8b\x07\x2d\x91\xf2\x5d\xad\xb6\xea\x61\xe3\x1b\x85\xfe\x90\x96\xc9\xcf\xa7\x9d\x73\x4d\x63\xcf\xb4\x6c\x42\x90\xc6\x88\xa1\x0c\x35\x60\x48\xd0\xe2\x34\xd4\x00\xaf\xfa\x55\xcf\x75\x55\x4c\x0a\x0a\x4f\xa5\xac\xb1\x52\xab\x22\xa4\xc0\x82\x76\xc0\x0d\xa0\xe4\xdc\xc4\x91\xa5\xbe\x06\xb8\x10\xf9\x3e\x8f\x09\xdb\x51\x32\x0b\xd4\x48\xdd\x32\x6e\xae\xfd\x2f\x1a\x69\x0c\xc6\xc8\xe0\x48\xdb\x2d\x58\x76\x57\x4d\x9d\xc3\xae\x4d\x0d\xc4\xff\x50\x71\x52\x3c\x70\x8d\x55\x7d\x9d\xe5\xff\xf8\xd0\xb2\xe3\xcf\xa2\xfb\x54\x90\xf1\xa4\xf2\xf4\xa4\x56\xa7\xfa\x68\x3f\xd4\x2e\xf4\x38\xcb\x45\x7f\x31\x12\x05\x39\xab\x17\x59\x19\x82\x04\xce\x64\x27\x13\x36\x45\x70\x87\x5e\x5a\x60\xe0\x62\xfc\x3a\xfb\xe5\x5f\x5b\x70\xbd\x09\x5f\xaa\xaf\x2c\xb8\x3e\xbe\x2c\xa9\x34\x76\x74\xb6\xb8\xb8\xe6\xca\x44\x0b\x7c\x2a\xe3\xe0\x72\xc2\x6b\xb2\xf0\x04\x06\xfa\x1c\x03\x9d\x40\xfe\x14\x7a\xa1\x11\x7e\x20\x98\x6f\x92\xe5\x9a\x5e\x0a\x7e\x5b\x18\x37\x1b\x1e\x43\x7b\xee\xca\x07\x2e\xa4\x26\x18\xb5\xb1\x72\x66\x3d\xbc\x1f\x3b\x47\xa9\x78\xbc\xe7\x1e\x3d\x0b\x5e\x91\xc5\x61\x2c\x8a\xdc\xe2\x62\x27\xae\xca\x15\xf8\xfc\x4c\xbd\x25\x5e\xe4\xe1\xa7\x98\x70\xd0\xb8\x2a\x45\x4c\x72\x53\x4a\x18\x89\xb1\x57\xfa\x26\x00\x62\xc3\x6e\x19\xea\xc4\x87\xd6\xa2\xb6\xa3\x64\x0f\x34\x87\x81\x14\xf9\x05\xcb\xd2\xdc\x89\xfd\x91\x44\x83\x27\xb8\xf8\x0c\x2c\x93\xdb\x32\xec\xc2\xe9\xad\x81\xb5\x46\x85\xac\x80\xd5\xcd\xa2\x3b\x29\x8e\xc6\x18\x26\xa8\x83\x15\x06\xcf\x8d\x4f\x5b\x68\xa6\x04\xb2\x34\xa7\x9d\x59\x19\x92\x85\x05\xb5\x3a\x8d\x55\x20\x87\x5c\x69\x06\xf0\x00\xd9\x7e\x75\xec\x4c\x39\x85\x5e\x29\x97\x1d\xf5\x51\xd1\x1f\x2b\xfa\x63\x4d\x7f\xbc\x97\x1f\xab\x3a\xa6\xb2\xb2\xb2\xea\xf8\x86\xb8\x99\xe1\x2d\x99\x10\xac\x7c\xe7\x62\xb7\x3a\x6e\xd9\xa5\x35\x41\x87\x94\xd1\x75\x72\x28\x27\x3e\xc2\xb2\x78\xd9\xf1\x83\x07\xae\xf9\x61\x02\xa8\x71\xcf\x0e\x3c\x09\x54\x05\x1a\x9f\x70\xa8\x21\xc4\xd9\x22\xf2\x0b\x3c\x82\x4b\x2c\x28\xea\xb8\x0b\xc4\x70\xb1\xe7\x75\x88\x2c\x32\x5a\x85\xd4\x22\xd1\xda\x79\xae\x5b\x79\x31\xa5\x8a\x8a\x3b\x01\x2f\xac\x46\x1d\xc2\x5a\xe9\x04\xf1\x08\xfd\x34\x38\xea\x39\xab\xd0\x59\xaa\xa4\x12\x3d\xc9\x3b\xaf\x61\x47\x2f\x83\xf5\x71\xd9\x47\x4b\x14\x25\x7c\x7d\x70\x92\xce\x53\x8c\x31\x4b\xc1\xc4\x78\x01\xa8\x4e\x5f\x03\x06\x13\x25\x54\xdc\x93\x0f\xe6\x35\xcf\x11\x14\xb0\x43\x85\x71\x44\xe9\x90\x8e\xdf\x58\xb6\xed\x47\xc2\xa6\x8a\x0a\x4b\x1c\xf2\xe8\xfa\x76\x9c\xc0\x7d\xa1\x93\x70\x2b\x09\xed\xab\x73\x71\x23\x06\x71\x6c\xfc\xb8\xe1\x87\xd1\x76\x92\x7e\x7d\x25\x59\x1e\x59\x76\x6b\xba\xec\x16\x95\x6d\x9e\x49\x0b\xbe\x39\xbd\x50\xba\xfa\xa9\x9b\xbd\xb0\xe0\x55\x75\x6b\x7d\x9e\xf3\x23\x16\xf6\x97\xa7\x18\x9f\x7d\x8b\x1f\x55\x75\xf1\x55\xdd\xf4\xab\x09\x14\x1c\xe2\x24\xe3\x6a\x92\xb1\x95\xc4\xad\x29\xf9\x37\xee\x84\xdf\x78\x97\x80\xb4\x13\x90\xf7\x49\x1c\x14\xe4\x7e\x9f\x53\x57\x8b\xeb\xf2\x13\xbf\x3f\x49\xab\x95\x54\xcb\x15\x1f\x45\x3a\x13\x29\x4e\xad\xa8\xc0\x56\x8f\x36\xa2\x1b\x4c\x24\x33\x7f\xd8\x25\x5e\xf8\x02\xad\xc6\xcf\x97\x5b\xfe\xd9\xbf\xd5\x37\x36\xaf\x3b\x14\x41\x44\xa0\x25\xd3\x37\x6f\x85\xbc\xd3\x41\x35\x95\xea\xfa\xd4\x65\x87\xbc\xc4\x69\x34\x6d\xed\x7c\xa4\x0b\x15\x38\x16\x09\xea\x4e\x88\xad\xfb\x01\x4a\x1f\xca\x87\x72\x05\x42\x53\xfb\x93\x01\xb6\xe2\xac\xc3\xb5\xf6\x63\xd5\x4f\xf3\xfa\x32\xef\x27\x76\x31\xc0\x1a\x0a\xa2\x90\x5c\x1c\x5a\xe0\xf8\x39\xd3\xfe\xad\x32\xbf\xad\xab\x0d\x23\x3b\x05\x7b\x4e\xaa\x55\x8b\x46\xb5\x60\x71\xd1\x6b\x6c\x12\x7b\x5a\xb6\x16\xdc\xab\xa1\xca\x79\x35\xb4\xec\xb4\xe5\x1a\xc0\x25\x80\xda\xeb\xb6\x70\xc4\x15\x64\x00\x74\x2f\x68\xc9\xc9\xf7\x79\x95\xb9\x07\xd5\xbe\x24\xb5\xf5\xa8\xe3\xef\x42\x5b\x16\x77\x95\xda\xfa\xcf\x09\xe5\x29\x41\x7a\xab\x21\xee\xb6\xdf\xbd\x0d\xe7\x28\x48\x71\xc3\x79\x65\xd3\xc2\x5e\x58\xc0\xf6\xa9\xfa\xb5\x10\xe5\xf1\x56\x72\x64\x2c\x0d\x5c\x46\x63\x1e\x11\xb4\x6c\xa8\x3d\x1e\xa6\x39\xd0\x02\xb4\x80\xfd\x72\x4b\x25\xc4\xb2\x04\x9a\x89\xd4\x5d\x3c\x46\x12\x97\xff\x3c\x4e\xb2\xbc\x96\x04\xa3\xdd\x97\xec\x1e\x59\xc8\xeb\x0e\x63\xcb\xc0\x18\x43\x4b\x9f\xf2\x30\xb8\x12\xbd\x13\x54\x40\x29\xc5\xc0\x7c\x0c\xf0\x64\x05\x8d\x8b\x80\x07\xbc\xba\x54\x59\x60\x8f\x23\x41\x92\x22\xb1\x67\x58\xac\x58\x45\xa2\x4e\xa1\x1b\x28\x1f\xc4\xd1\x90\x7d\x10\x9f\xc3\xad\xdc\x51\xd2\xa0\x4f\xed\x42\x08\xd3\x78\xc4\x0a\xf0\xe7\x66\x2c\x2c\x53\x06\xea\x01\x91\x98\xd9\xd0\x0d\x1b\x43\x5f\xce\x32\xbb\x54\x96\x62\x3a\xec\xbc\x5d\x5f\x18\x87\x8d\xb8\x58\x6c\x56\x3b\xa8\xa5\x46\x84\x2f\xd6\x52\x64\x11\xa6\xf2\xc8\x72\x3a\x68\x46\xad\x50\xa8\xb0\x5f\xae\xa7\xa7\x0a\x85\x15\x40\xb9\xb9\xe0\x1e\x59\x78\x5d\x1d\xf4\x07\x10\xeb\x98\xcd\x0e\x85\x50\x7c\x75\x2c\xfb\x15\xae\x06\xad\xe7\x80\xb2\x63\x29\x50\xa3\xe4\x24\x05\x6e\xf8\xec\xd3\x49\x36\x66\x95\x29\x07\xe8\x4c\xaf\xb4\x05\x97\xba\xed\xd7\xda\x98\x14\xc2\x01\x69\x82\xa5\xd7\x41\x8b\x37\x10\x34\xdf\x14\x0e\xf4\x20\xa4\x47\x1b\x59\x98\xc2\x79\xbf\x70\xa5\x14\x68\x1e\xd9\x38\x5b\x84\x13\x7d\xd9\x17\x81\xbe\x54\xb1\xf0\x5c\xbf\x76\x85\xd2\x1d\x8f\x83\xcc\x1b\x50\x2c\xfe\x48\x1b\x0b\xce\xeb\x65\xfb\xc8\x7c\x47\x8c\x67\x4a\x21\xc4\x93\x94\x92\xc2\xb5\x14\x7d\x91\x50\xfc\x26\x43\xcc\x53\x4b\x28\x4f\x08\x91\x98\xf5\x78\xb7\x21\x82\xdc\xa0\x3f\x1c\x6b\x6f\x5e\xac\x99\x8c\x55\x4b\xe4\x95\xc7\x54\x68\xec\x46\xdc\x88\xb2\x6d\xf9\x92\x58\xeb\xeb\xce\x73\xf5\x76\xfa\x16\x83\x5b\x63\xe0\x60\xc2\x90\x1e\x5a\x2e\x2c\x47\x98\x9e\xba\x32\x62\x84\xed\xa9\x0e\x7b\x26\x9d\xec\x4c\x6a\x3c\x7f\xae\xc7\xc4\xab\x54\x5f\x85\x9a\x4f\x0f\x0b\x84\x25\x30\x5d\x46\x19\x3e\x50\x06\x03\x68\xa4\xee\x81\x93\x65\xc0\xf4\x62\xf1\xa2\xb4\xdb\x99\xff\x50\x90\xd0\x47\xe5\x4c\x73\xd8\x7f\xd1\xae\x83\x5a\x49\xec\x9e\xd6\x9f\x56\x09\xcc\x74\x9e\x5a\x8b\x63\xbe\xa1\x3e\x25\xfb\x6e\xb0\x08\x57\x22\xdb\xf5\x0e\xbc\x22\xb0\xcb\x5e\xfd\xf2\xe3\x5b\xac\xcf\x24\xcb\xe2\xd7\xf3\x11\x3b\x91\x4f\xd7\xc1\xf5\x64\xda\x76\xf1\x15\xe6\x0e\x4f\xbd\x17\xa5\xc9\x6a\x06\x57\x4e\x37\x90\x1f\xa5\xc4\x4b\xcd\xe3\x36\x49\x76\x9a\x68\x5b\xba\x8c\xea\xc3\xb6\xb4\xb3\xc7\x26\x8b\x1e\x72\x22\x07\xb3\x40\x4b\xfd\x5e\xf7\x21\x77\x3e\x6c\xe3\x96\x90\x70\x75\x7d\x75\xf6\xe5\x97\x28\xa3\xd0\x75\xab\x03\xa1\x9a\xd3\x97\xda\x10\x5e\x4d\x0b\x84\x18\x2c\x14\xb1\x88\x8c\xf2\x1d\xb5\x23\x13\x87\x05\xe9\xe8\x5c\x65\x58\xc4\x5a\x1f\xa5\x39\x86\xdf\x8b\x6e\x76\xf4\xa4\x73\x6e\x69\x3e\xee\xfc\x74\x97\x02\xbc\x4b\x3d\x3b\xba\xc2\x0d\x32\x76\x46\x3a\x3c\x57\xda\xd4\x48\x43\x84\x40\xee\xba\x0b\x5b\x61\xb1\x20\x3e\x7e\x5c\x5b\xac\xbc\xb3\x78\xb5\x54\xde\x5b\x14\x63\x06\xf9\x45\xf7\x07\xee\x16\x1b\xff\xb9\x5c\xbe\xac\xfd\x7f\xcd\xe5\xd8\x26\xb2\x49\xe1\xcb\xff\x5c\xd6\x1c\x04\x5f\xb7\x75\x10\x21\x3f\x49\x64\x58\x0f\xc1\xff\x2c\xc7\xe9\x48\x75\x92\x6d\xc4\xe3\x1a\x5f\x67\xef\x56\x99\xf7\x31\x99\xe7\xde\x24\xbd\xf1\x6e\xc7\x8c\x98\xda\xb1\xba\x9e\xa5\xad\x53\x87\xc4\x90\xa0\x62\x52\xc9\x30\x3c\x4b\xc6\xd7\x4c\x1a\xb6\x43\xeb\x17\xd7\xd7\x8d\x1b\x22\x59\xdd\x08\x94\x44\xfa\x8d\x94\x1c\x53\xf9\x83\x1b\xd4\x0a\xa1\x04\x09\x31\x64\x74\xa8\xb2\xa3\x34\x1c\x14\x21\x4b\x2d\x01\xaa\xa1\x4b\x93\x15\x2a\x43\x34\x45\xea\xf2\x08\x6f\xcf\x14\x3b\xe1\x37\x71\xda\x14\x78\x90\x0d\xed\x08\x93\x1a\x4d\xc1\xd1\xa1\x01\xce\xf0\x3b\x8a\x91\x43\xc7\x24\xcf\x46\xdd\x52\x5f\x81\x6f\xee\xf1\x9e\xde\x19\xe6\x66\xaf\x7b\xcf\x73\x44\xcb\x0d\x60\x3d\xd2\xf2\x00\x89\xa6\x49\x34\x92\x65\xd6\x62\xde\x8f\x82\xbd\x71\xeb\x18\x89\x19\x7c\x56\x57\xf4\xa5\x58\xb8\x92\xb4\xf7\x52\xf9\x45\xb9\x17\x5e\x4d\xa6\x3d\xe4\x27\xf5\x67\xaa\x34\x5b\x4e\x35\x78\x11\xeb\xc1\x9b\x4d\xb4\x55\x0d\x4b\x53\x0d\x83\x5f\x48\x15\xa3\x30\x82\x92\xf5\xbe\x9d\xf7\x60\xd7\x56\xce\x6f\x74\xbf\x55\xa1\x6e\x99\x32\x9c\x4f\x65\x98\x1e\xd6\xb2\x72\xef\x5a\xf7\xf8\xc2\xc6\x8b\xdc\xff\xad\x5f\xec\xa3\xff\x45\xaf\xe3\xe7\x22\x75\x9a\xf5\xba\x2d\xaf\x4c\xe1\xea\xb9\x33\x77\xc6\xf5\xf2\x16\xc9\xa8\x20\xbf\x66\xd3\x29\xc8\x77\xbe\xec\x53\x50\xfa\xa5\xe1\x25\x0f\xb7\x34\xe9\xcb\xbb\x68\x04\x4d\xf5\xf6\x1e\x6a\xc9\x49\x39\xad\x0d\xe8\x6f\xa5\x82\xa1\x84\x18\xcf\xc5\xfc\x4e\xab\x67\xa2\x66\x2a\x4e\xc2\x0d\xe0\xfe\xb2\x1c\x65\x74\xa5\x95\x0b\xd4\xcc\xa5\x83\x64\xa9\xa7\xc4\x9f\xd9\x4e\x4c\x79\x0f\x14\x7a\xaf\xaa\xb2\xe0\x64\xde\xca\x08\xae\xc3\x58\xe6\x7f\xbd\xd6\x33\xcd\x7c\x79\x89\xe9\x33\xa0\x5e\xfc\x50\x47\x78\x69\xcd\x33\xfb\x31\x57\xe8\x5c\xd4\xf4\x14\x13\x42\x6e\x24\x82\x56\x65\x16\xeb\xd2\x0f\xfc\x3e\xfc\x53\x38\xba\x47\x92\x6c\xce\xb9\x32\xd5\xe4\xaf\xcc\x53\xaa\x1b\x9f\xd9\x2c\xaa\xb5\x69\x6f\xed\xf8\x0a\xc7\x25\xbd\x95\x8a\x2c\x81\x83\xcb\xc0\xe9\xf3\x9e\xe6\xf2\x09\x83\x9a\x2b\x38\xbe\x66\x49\x0e\x55\x78\xea\xbe\x2b\x5d\x85\xe9\x11\x31\x5d\x7b\x19\x4c\x9b\xb2\xec\x9e\x54\x58\x48\xcf\x7b\x01\xa4\xa0\x93\x4d\x10\x68\x3b\x04\xc1\x94\xf3\xaa\xb0\x1a\x34\xa2\x26\xd8\x64\xf8\xad\x2d\xba\xdd\xa8\x68\x94\x41\x49\x58\x4f\x7c\x28\x8b\x93\xf5\x91\x50\x15\x66\xc3\x89\x00\xd0\x0e\x9e\x66\x90\x65\x07\x24\x0b\x56\x05\xb1\xd0\x98\x42\x4f\xbd\x26\x33\x1a\xdb\xc8\x13\x1b\x53\x1b\x35\xa0\x06\xbf\x66\xb0\xd6\x7d\xf3\x32\xc5\x4d\x4e\xad\xd0\xf4\xee\xf1\x2d\x85\x2f\x2f\x8b\xb2\xee\xa5\xa7\x58\x10\xa1\x8f\x5b\x9c\xa7\x97\xb9\xf8\x98\x9a\xf4\xe9\x17\x99\xe4\xc4\xa8\xea\xa9\xfa\x0b\xae\xbe\x5a\xe6\x55\xe4\xab\x72\x52\x2e\x2d\xc0\xb6\x7c\x4e\x1e\xb5\x34\xfb\xc3\xea\x21\xf7\x63\x78\x18\x99\xa7\x11\xa1\x2c\x7c\x65\x14\xc3\x69\xde\x6e\x3a\x05\x53\x21\xdc\x9e\x73\xfd\x2f\xc5\xed\x93\xc7\x21\xf9\x8c\x1e\x83\x4d\xb8\x5c\x1e\x0d\xc0\xa1\x8d\x5a\x61\x38\x5e\xb6\x5b\x32\xae\xe0\xfb\xfe\xd3\xf8\xe6\x69\x30\xf1\x2c\x3a\x83\xb4\x11\xfb\x97\x01\x38\xaa\xb1\x41\x85\xda\xa5\x72\x13\x73\x09\x73\x9f\x04\x78\xc5\x80\x41\xdf\x1f\x65\x52\x60\xa2\xad\xc3\x49\x05\x9a\x9d\xfb\x27\xb3\xa4\x27\x40\x3f\xdd\x85\x5e\x30\x6c\xdf\x86\x56\x61\xa9\x21\x96\x1e\x9b\x45\x8b\xca\x2e\xf8\xfd\xe1\xe0\x69\x24\x7a\x81\xd7\xbf\xb7\x32\x25\x2e\xdb\x5d\x59\xde\xe5\xdd\xdb\xcb\x92\xf5\xb3\x62\xaf\x3c\x03\x7a\xba\x41\xd7\x33\x7d\x1c\x15\x2e\x97\x83\xcb\xe5\xc6\x5f\xcb\xa8\x64\xd9\xee\xa9\x1e\x87\x41\x7b\xfc\x04\x2b\xee\x97\xcb\xd4\x71\xf4\xba\xff\x72\x67\x06\x46\x92\x6a\xdf\x0c\xcc\xcd\xbf\x6a\xe0\x90\xa1\x2e\x97\x05\x35\xa1\x71\x79\xb7\xd4\x2c\x12\x74\xf1\xf2\xae\x48\x95\x4c\x38\xff\x6c\x12\x9a\x3d\xe2\x7c\x72\xac\x2e\x83\xe2\xa5\x93\x7c\xe2\x25\x7a\x9c\x4d\xa5\x28\xe3\x4c\x75\x33\x49\x49\xe2\xe4\x9a\x6f\x88\x5d\x9a\x61\xbe\x59\x65\xbb\x18\x9d\x34\x10\xba\xdd\x34\xe0\xb9\x57\x69\x20\x72\x6f\xaf\xa5\x25\x0c\x6c\xe9\xd3\x30\xde\xbe\x1f\x14\x06\x93\xc6\xe0\xa6\x59\xa4\x55\x84\x5f\x00\xd1\x31\xba\x30\x0b\x10\x4b\x80\x04\xd0\xe2\x52\x23\x8b\xce\x37\xb1\xfa\x4c\x8e\xda\x8b\x8b\x50\xc6\x83\xb6\x0f\x24\x22\x17\x17\x23\xc3\x6c\xc5\x95\x98\xed\xca\xc0\xec\xca\x8d\xd9\xfa\x7e\x12\x20\x1a\xc5\xad\xaf\xce\x6d\xdd\xb5\x6a\x5d\x2f\xd3\xba\x84\xdb\x28\x78\xfc\x50\x0b\x21\x37\x61\xf0\xcc\xb7\x57\x89\x98\xc8\x58\x55\x24\xb2\x76\x94\x58\x71\x2f\x34\xc5\xf2\x20\x60\x7a\xa4\x38\x07\xa1\x39\x07\x2d\xef\xc9\x27\x87\x80\x0f\xec\xef\xdf\x7d\xa4\xde\xff\x59\xfe\x10\x4a\x1d\x93\xff\x9f\xb8\x37\xdf\x6a\x23\x49\x16\x87\xff\xf7\x53\x00\xe3\xeb\x56\x0d\x85\x2c\x81\xbb\x7b\x2c\xb9\xcc\x61\xb3\xc1\xac\x06\xc9\xd8\x66\xb8\x3e\x59\x8b\x4a\x42\x2b\x55\x5a\x10\xa0\x77\xff\x62\xc9\xcc\xca\x5a\xe4\x76\xcf\xdc\xdf\xf9\x3c\xd3\xa8\x72\xdf\x22\x23\x23\x22\x23\x23\x14\x81\x5c\x77\x65\xc0\x4f\x1c\x05\x62\x65\x4e\x95\x9a\x08\x94\x5a\x34\x50\xd7\x41\x3d\xd8\xd8\xb0\xd0\xc9\xf8\x3f\xe1\x08\xc4\xaa\x03\x6b\xe3\x8f\x37\x30\x49\xff\x74\x36\xff\xa8\x93\x59\x10\xa7\x8b\x4f\x14\xab\x09\xb7\xa2\x05\x05\xa8\xd6\x56\x79\xef\x6d\xe3\x38\x88\xa3\x3a\xee\x92\x2b\x44\xc6\x24\x33\x00\xb7\xa7\x56\x27\x8a\xc7\x68\xb4\xfb\x28\xe6\xeb\xe8\x5a\xca\xf8\x42\x34\x31\x75\x18\x5d\xe2\x14\x5e\xff\x3b\xda\xfe\xf7\xe0\xb5\x85\x24\xfd\x47\xe5\xc4\x79\x3d\x0e\xc5\x7a\xc9\x43\xc1\xd5\x21\x7c\xc1\x62\xa9\x24\x42\xa8\x3b\xb0\x30\xa5\x28\x58\x3f\xec\x94\xe2\xc0\xde\xa8\xa2\x8b\x5d\x3c\xfd\x6a\xbe\xb5\xfe\x32\xc2\x3b\xc6\x52\x34\xb1\xfb\xec\x67\x6b\x8a\x77\xd1\xf1\xb4\x7c\x81\xa6\xbe\x0f\xd8\x4e\x35\xa4\x2a\x45\xd1\x96\x0b\x79\xd1\x3d\xd7\x9a\x91\xc1\x38\x59\xe2\x49\x29\xeb\x01\xf9\xea\xae\x04\xa3\xcd\x78\xf5\x6e\x75\xf9\x38\xc7\xe1\x25\x48\x36\xd7\x01\x68\x3c\x4e\x1a\x7f\xd1\x76\x4b\xf1\x24\xeb\x22\x35\xb9\xbf\x60\xfe\xd1\x79\x88\xd0\xc5\xef\xc6\x86\x3d\x70\x46\x56\x3d\x76\x8c\x07\x0e\x1e\x9c\xaa\x23\x67\x90\x78\x4e\x8f\xd5\x5e\x88\x61\x2d\x65\xc9\xf5\x75\x28\x59\xc1\x92\x04\x83\x9a\xa0\xc3\xb7\x3d\xef\x1d\x4d\x64\xcc\x23\x82\x25\x94\x44\xa2\xfa\x7b\x7d\x00\x54\x17\x1f\xa8\xab\x55\xac\x2c\x0a\xb6\xf1\xe6\xa7\x06\x9f\xf7\xa8\x02\x55\xea\xbe\x0b\x49\x36\x8b\x05\x2c\x4c\x7f\xf5\x0a\x0a\xa2\x80\x35\x01\x1f\x6f\x5b\xb5\x6f\x3f\x44\x29\x01\x95\x5f\x52\x87\x66\x17\x70\xcc\xa4\x4e\xb7\x86\xf2\x3d\x23\xcb\x4d\x5b\x8e\x73\x1c\xea\x87\x2a\x8f\x91\x8c\x9b\x47\xcf\xcf\x2d\x1c\x9b\x7e\x7a\xb7\x5d\x72\x4b\x98\xd3\x3e\xb7\x6a\x3a\xdb\x24\x40\xc3\x49\xdd\x3a\x33\x99\xf2\x31\x01\xd6\xdc\x5a\x85\x2a\xea\xf4\x6d\xe9\xac\x24\x19\xed\x6e\x54\x6d\x8a\xb7\x39\x52\x16\x25\xca\x99\x73\x5e\x06\xd4\x76\xd2\x85\xa7\x16\xcf\xb2\x5b\xd2\x8e\x3a\x59\x10\x82\x3b\x04\x00\xfe\xb7\xe6\x20\x78\x18\x05\x1e\xd9\xfa\x57\x4e\x1d\x57\xd6\x7e\x5b\x7f\xd1\x5a\xff\x6d\x4d\x5a\xe4\xbf\x9f\x0c\xc7\x01\xda\x3f\xec\xfe\x66\x0b\xbb\x67\x0f\xf0\x15\xc5\x42\xbb\xc4\x0d\xac\x54\x95\x6b\x46\x95\x40\x27\x90\x9f\x14\x20\x19\x64\x5d\xe8\x1f\x87\x2b\x5c\xe3\xba\x0c\x59\x39\xa1\x09\x5b\x99\x6f\x5d\x43\xf3\xad\x13\x7c\x96\x82\xf6\x6c\x68\x56\x00\xb5\xae\xc2\x18\xe9\xe7\x21\x37\x47\x4b\x7b\x91\xf4\x7f\x2d\xe9\x3f\xcd\x16\xf9\x44\x26\xdf\xd4\xba\xfa\x07\x98\x3b\xd7\xc0\xee\xaa\x5b\x34\xad\xdb\xdd\x1a\x2c\x82\xec\xe0\xcd\xbf\xa3\x7f\x0f\x6e\x91\x67\x3f\x37\x44\x36\x01\x13\xcf\x19\xc8\xcd\xd0\xc7\xa8\x45\xe4\xae\x3a\x8f\x08\xd2\xf0\x6d\xc9\xa7\xd5\x09\xf1\x68\xe8\xfa\xb8\xe5\x1c\xde\x42\x7b\x64\xc8\xf5\x76\x1d\xf4\xb9\x5d\x21\xf0\x1d\xc1\x7f\xbc\x83\x6c\xd2\x10\x20\x67\xd9\x8f\xf8\x67\x57\x42\x18\xba\x77\x76\xa0\x7b\x10\x31\x25\x86\x46\x75\x6a\x1f\x63\xeb\xfb\x04\x77\xfb\xce\x0b\x08\x20\xe3\x84\x4b\xbb\x0b\x65\x76\x9d\x7d\xca\x0d\x83\xc2\x8f\x55\x67\x37\x33\xd3\x97\x01\x90\x0d\xfe\x4a\x5b\xc4\x2b\x6b\xeb\x98\x65\x7d\x6d\xa5\xd5\x09\x7a\x3e\x3e\x05\x71\xa8\xf4\xf6\x79\xed\xa1\x6d\xad\xaf\xd9\x2b\xee\x64\xbc\xa2\x17\x66\x6d\x7d\x17\x17\x04\xc0\x7a\x83\xcd\x01\xb6\x12\x52\xf2\x8c\x14\x30\xe1\xa8\x38\x7d\x87\x35\xd4\x4f\x61\xcf\x9f\xdd\x4c\x6f\x4e\x6f\x6f\xa1\xca\xd3\xdb\xfa\x23\xce\xd9\x99\x14\xa7\x53\x60\x5f\x53\xfb\x8f\x40\x7d\x6b\xe4\x45\x7f\x6f\xbe\xa0\x59\x0a\xbd\x4a\x0f\x89\xec\x92\x26\xd9\xbb\x67\xc2\x3f\x9e\x30\xad\xfb\xf1\x4a\x19\xab\xdc\xf6\x6a\x4a\x2f\xc5\xbd\x47\x83\x16\xd8\xc1\xcc\xbb\x2b\xba\x2f\xc1\x57\x57\xf6\xea\xfc\x8e\xd8\x52\x2d\x6d\x6c\x0e\xe2\xc9\x08\xa5\xd6\x28\x73\x44\x1f\x3a\x30\x68\x65\xa2\xc0\x87\xfa\xa4\x6f\xea\xcf\xc8\x3a\xd3\xaa\xcf\xf1\xa4\x62\x09\x77\x2d\x2f\x20\xe8\x09\x29\x2e\xa7\x73\x2f\x69\xe6\x6c\x08\x1b\x2c\x11\x8c\x9b\xf7\x00\x36\x9b\x02\x4f\x55\xa6\xe1\xcc\x5e\x73\x87\xc3\x5e\x20\x06\x6b\x85\xe9\xcc\x2e\x38\x8e\x73\xda\x5e\xd8\xe8\xd6\xa1\x28\x17\x99\x0e\x80\x34\x14\x6c\xd8\xca\xf7\xc3\x5f\x66\x24\xed\x82\x96\x2f\xe6\xc5\x0d\xe3\xe1\x7b\x19\xa4\xec\x43\x8d\x53\x5c\x94\x4b\x87\x1d\x0b\x61\x85\xc0\x6b\x68\x0f\xcf\x31\xf6\x06\xa0\x18\xfe\xfd\x11\xa4\x18\xd1\x7a\x71\xd1\x4a\x28\x44\x1f\x0a\xb9\xa3\xa4\xce\x60\x15\x8d\x93\x02\xd2\x3a\x0d\xc6\xed\x21\x10\x74\x71\x28\x35\x02\x87\x82\x8a\x3c\xb4\xa3\xeb\xb4\xca\x19\x3f\x6c\xe8\x96\x1e\xef\xa4\xd7\xea\xa0\x6a\x2c\xcb\x15\x22\xc0\x3e\x55\x46\xea\xa8\x1a\x16\x10\x0c\x54\x76\xd9\x84\x8b\x5d\x35\x3c\x01\x90\xb3\xb0\xf8\x07\x0d\x13\x1a\x61\x4a\x52\x5f\xfd\xc1\x31\x26\xc5\xc6\x40\x58\xbd\xd9\xda\xc2\x27\x6b\x27\xd3\x57\xaf\xda\x78\xa1\xca\x1a\x1b\xd2\x48\x2b\xdf\xb6\xd1\xb5\x18\x4b\x19\x5f\x23\x23\x01\x84\xfd\x47\xbc\x96\xf5\xe8\x06\x0a\x1f\xc6\x22\x79\xea\xa3\xa6\xe0\x6a\xa7\x53\x6a\x8b\x52\x8c\xc1\x9b\x37\x52\x1b\xc2\x92\x3f\xf5\x84\x62\x0d\x80\xbc\xf4\xf1\x12\x1d\x28\xa6\xed\x69\x5c\xbb\x0e\x91\x5a\xf5\xe4\x0d\x83\xba\xb7\xbb\x67\xbd\x1b\x7c\x1d\xa4\xbb\x1c\x2c\xeb\xb2\xaf\xba\x5b\x7f\xa1\x8c\xdf\x41\x7f\x81\xd5\x43\xf6\x2c\xb2\xea\x10\x00\x86\xef\xe5\x6b\x6a\xdf\x67\xeb\x9e\x3a\x1b\xa5\x60\x36\xdb\x2b\x7f\xf3\x4a\x8d\xb6\xb0\x45\xcb\x52\x43\xf4\xd5\xdd\xfe\x04\xbd\x94\xdb\xca\x2e\xa3\x1c\x69\x90\x1f\x29\x60\x7c\xc5\x66\xf8\x48\xa8\xf7\x74\x00\x1f\x54\xe2\x5b\xa0\x65\x43\xf7\x69\xac\xf7\x13\x9e\xce\xa9\x9c\xd6\x48\x97\xc7\x27\xb7\x1e\xcc\x9d\x45\xb6\x8f\x70\x29\x71\x71\xa9\x11\xca\x6c\x9b\x99\x6d\x99\x57\xa2\x20\x00\x44\xe9\xc4\x5e\x0c\x85\xba\x8e\xf0\xab\xce\xce\x1d\xbe\x1c\x9f\x4c\x10\x0f\x32\x71\x47\x46\xb8\x10\x99\x1c\x3c\x8a\x9a\x37\xb6\x3f\xc0\x8f\x3f\xb6\xbf\xcc\x45\x6d\x8d\x8d\x90\x1f\x0d\x50\x15\xb7\x83\xae\x0f\x46\x10\xbb\x17\xdb\x5f\x5a\xa2\x16\x87\x0b\x7b\xf7\x4e\x48\x59\x7a\xe9\x69\xed\xeb\x06\x6a\x82\x5e\x91\x67\xc0\x8d\x9d\xc9\xb8\xbd\x56\xeb\x87\x0b\xcb\x86\x26\xe1\xcc\x99\x4e\xc8\xa8\xc9\x84\xdc\xee\xb6\x84\xb3\xc5\x2f\x76\x27\x13\x3c\x7a\x66\x13\xc7\xed\xdc\x9c\xdc\xdf\x1a\xcc\xdd\xde\x1d\xea\xc3\x27\x07\x22\x62\x52\xe8\xb7\xf9\x84\x15\x58\xa5\x09\x19\x04\x29\x7f\xda\xc2\xe7\xcb\xad\x49\xc9\x32\xd4\x59\xf6\xef\xd2\xcf\x53\x49\x60\x3f\x0b\xf8\x8e\x59\x5e\x8c\x4a\x06\xc4\xb3\x12\x73\x55\x98\x6b\x40\x62\x7d\x8f\xec\x7a\xde\xdc\xd6\x99\x38\x87\x2a\x6a\x25\x93\x69\x41\xa1\x94\x16\xe9\x43\xce\x40\xdd\x1a\xe0\x3a\xca\x97\x9f\xfc\xcc\xb8\xa5\x0c\x6d\x48\xd1\x54\xeb\x26\xb8\xa5\xcc\x78\x7f\xd0\xc5\x99\x01\x0a\xbe\x6b\x87\x28\xd1\xab\x77\xcb\x57\x6f\x28\x47\xdd\xe7\xdb\xe1\x85\x9a\x85\x1e\xaa\xb7\xe2\x15\x1c\x9c\x22\xbd\xdb\x7a\x88\xb4\x66\xd2\x88\xb6\xe6\x41\x57\xf1\xd0\xc0\x9e\x7f\xeb\x38\x3d\xa0\x1f\x21\x80\x75\xf6\xd6\x59\x04\xd6\x42\x4b\x8f\x4a\xf9\x69\x11\xd2\x03\x38\x38\x45\xa1\x0b\x01\x9a\x0c\x0e\xd2\x79\x6d\xea\x05\x3a\xa8\xef\x39\xa4\xe2\x53\xa1\x96\xac\xa7\xde\xba\x33\x68\xd5\xbd\xf4\x48\x75\x27\x48\x30\x2c\x5b\xb6\xea\x90\xd7\xd3\x22\x35\xa5\x56\xba\xb8\x76\x08\x20\x50\x5e\x1c\x0f\xb3\x16\x31\xa5\xda\x9d\x4b\x56\xfc\x94\x86\x91\x92\x08\x42\x1c\x29\xad\x79\x8e\x8f\x1a\x51\x7e\x4a\x2b\xd8\x54\xb6\x23\x3e\x13\x02\x68\x40\x95\x4d\x18\xa8\xb3\x40\x3d\x83\xa6\xa7\x88\x00\x2a\x9e\xad\xce\x02\x5b\xa2\x7f\xdc\x61\x2d\x3c\xf3\x91\x2a\x28\xb5\xf0\x60\xb7\x24\x76\x6a\x8d\xc8\xa4\x19\x3e\x46\xe4\xc9\x48\x1e\x2b\xde\x20\xc1\xd5\xc2\x53\x5b\x12\x5d\x5d\x9c\x92\xde\xbb\x01\x4c\xc2\xba\x15\xe2\xb4\x3c\xd1\x11\xdf\x85\x35\xb4\x7b\xe8\x9c\x06\x6d\xbc\xf3\x71\x8d\xad\xca\xb7\xbc\x50\x32\xa4\x47\xbc\x50\xb2\x4b\x25\xbb\xb7\x37\xd7\xde\x2d\xcf\x6b\xe5\x16\x9f\xf4\xd6\xf1\xcd\x2f\xe6\xcf\xe4\xed\x39\x98\x1b\x10\xdc\xc7\xb0\xd4\xc3\x77\xc5\x3d\x2a\x89\x0b\x40\x17\x4c\x2d\xa4\x24\x42\x80\x02\xfc\xa8\x0f\x9c\x96\x83\x2d\x6f\x57\x6b\x15\xf9\x92\x98\x96\x71\xf0\xae\x8b\xec\x13\xcc\x60\xf9\xea\xde\x60\xf6\x7b\x44\x47\x86\x3c\xac\x11\x0d\x0b\x8e\x49\xaf\x34\xd8\x68\x01\xd9\x8c\xa4\x4d\x08\x43\x83\x66\xb1\xa3\x83\x5b\xf8\xc6\x87\x51\x3e\x82\xb9\x5f\x26\xa7\x22\x00\x0c\x13\x89\xbf\x95\x07\x03\xf2\x6b\xe1\xb3\xbd\xe4\xfb\x23\xc4\x8d\x0f\x88\x19\xa5\xae\x0a\xb9\x77\x78\xfd\xbf\xa5\xa7\xf2\x3f\x17\xd6\xcb\xd7\xd6\x36\x6c\xc4\xdd\x16\x59\x28\x78\x40\xfd\x27\xab\x76\xe7\x8b\xd2\xc7\x21\x7e\xea\x33\x85\x96\x71\x30\xb5\xe6\x52\xae\xfd\x00\xa8\xfe\x5b\x02\x52\x99\xd7\x46\xcb\x9d\x27\xe1\x29\x6c\x96\x33\x8d\x51\x1a\x22\x28\xc1\x3d\x07\x4c\x3c\x9d\xa0\x3d\x4b\xd2\x99\xa1\x4f\xa6\xb7\xbd\xf2\xfd\x41\x29\xf7\xc8\xe9\xb4\x13\xc7\xe8\x74\x92\x5c\x03\xa1\xdf\x3a\xf5\xb8\x61\xa5\xe3\x4b\xb3\xea\x8b\x6b\x18\x85\xba\xd1\x9b\x34\xd5\xd7\xb1\xfe\x3a\xb9\x53\x5f\x23\xed\xe2\x61\xba\xaf\xbe\x3e\x6d\xd1\x6b\xe5\xf2\x11\xac\x1b\x66\xfe\xa4\x12\x2e\xbb\xac\xca\xb5\x3b\xc8\x9a\xf7\x56\x5a\xb6\xab\x4e\x03\xc5\x25\xc6\xb5\xf8\x25\xfb\xbd\x59\x51\xde\xd1\x0c\x27\x85\x83\xe1\x60\x63\x10\xa0\x89\xb4\x69\x20\x69\xcc\x35\xf5\xb6\xb0\x07\xeb\xf9\xa8\x35\xae\x13\x2c\xbf\x33\x61\xb5\xd2\xe3\x26\x5e\xfe\x08\x7e\x9e\x05\x21\x14\x97\xcb\xf1\x19\x4c\xd3\xdc\x10\xbd\x08\x9c\xcd\x27\x09\x3c\xb5\xef\x68\xa7\x96\x74\x1c\xd1\x1e\x33\x99\xca\xad\xdd\x3c\xb1\xb3\x88\x9a\x6b\x2b\x33\xf5\x9e\x9d\x75\xf0\x51\xf3\x17\xb0\xf7\x50\x8e\xde\x9a\xe4\x5f\x7b\xc9\x8b\x26\x38\x43\xe5\xc5\x95\xa2\x25\x4f\xee\xb0\xbf\xe5\xf1\xbd\x12\xd3\xcb\x58\x6d\x2d\xfc\x6b\x5b\xac\x9b\x49\x7e\x55\xdf\x59\x9c\x7c\x22\xa3\x50\xde\xba\x73\x14\x8a\x75\x75\x64\x8f\xaa\x1c\xf7\x29\x94\x4a\xf2\x23\xb4\x41\x00\x2d\x3c\x30\xd6\xa5\xb8\xe9\xbe\x3a\xcd\x00\xcb\x04\x8c\x76\xf5\x93\x07\x48\x24\xa4\x1b\xac\x07\xad\x75\x19\x43\x06\x9d\xb0\x96\xb6\xc4\xbf\x61\xcb\x5a\x08\x47\x1d\x8d\x6a\x75\xe8\x30\x54\xfa\x05\x96\x8d\x06\xf0\x4a\xa4\x18\x01\xcb\x00\x34\xd2\xa0\x23\xec\xf6\xcd\xf8\xb6\xa4\x9f\xdb\xfd\x4b\xbd\xdc\xe7\xcb\xfe\xad\x3f\xac\xf5\x76\x59\xb8\x71\x69\x59\xb6\xff\xa5\xf7\x8b\x2a\x33\xea\xb1\x28\xe3\x5f\x48\x53\xa2\xb1\xb8\xc9\x4d\x66\xbe\x6e\xf9\x25\xbe\xbc\x60\x0e\x50\x7a\x83\x4f\x79\x3c\x38\x8b\xc7\x7c\x1d\x32\x06\x1e\xf9\x2a\x42\x9c\xec\xc4\x21\x45\xc1\x31\xf6\xfa\x66\xfb\xd5\xad\xe8\x8d\x1d\x94\x81\x97\x5e\xdd\xfc\xef\x2b\xf6\xad\x22\x05\x99\xdb\x81\xb3\x17\xd7\x80\xa0\x9a\xf7\x61\x0a\x5e\x74\xc8\xda\x7b\x1c\x92\x15\x65\x3c\x91\x03\x3a\xfa\x11\xc1\xda\xc1\x2a\xd0\x9e\xd0\x14\xfe\xfa\xe3\xe7\x67\x7c\xe4\xe2\xa3\x83\x1f\xd2\x5e\x29\xa0\xf2\xe9\xc1\x9f\xa4\xf2\x03\x8b\xce\xd5\x38\xb4\xb0\xbe\xa7\x84\x5d\x30\xcc\x73\x7b\x0b\x40\x16\x81\xc1\x4a\x10\xf9\x7d\x70\xcf\x6c\x34\x8c\x6a\x2f\x26\x91\x4e\x07\xe6\x04\xa8\x63\x79\x7d\x04\x2c\x80\xcd\x7c\xb7\x7b\x33\x9b\x94\x3b\xc3\x9b\xf3\xfb\xdb\xf2\xde\xf9\x59\xe3\xe0\xac\xf1\xa3\xf1\xed\xe2\x00\x6f\xf9\x96\xa6\x39\x14\x5f\x96\x7e\x48\xf1\x09\x4d\xb9\x71\xf0\xb5\x61\x15\xd4\xb9\xd3\x6c\x1c\x9e\x5f\x1e\x7d\xdf\x69\x1c\x9d\x9f\x65\x2b\x4d\x27\xca\x5a\x91\xee\x1b\x46\x12\x7b\x52\xdd\x57\x47\x1f\xcf\x0e\xf6\x75\xed\xe5\x73\x2c\xf7\xe3\xe0\x6c\x67\xf7\xe4\xe0\xc7\xc5\xe5\xd1\x97\x9d\xc6\xc1\x8f\xb3\x83\xc6\xf5\xf9\xe5\x31\xed\xa9\x9f\x65\xa0\x09\x4e\xd7\xb4\xb3\xbf\xff\xe3\xe0\x74\xe7\xe8\xc4\x28\xac\xe3\x28\x3f\xf7\xcc\x60\x99\x70\xdd\xe5\xe3\x9c\x68\x28\x5f\x64\xa1\x23\x86\x5d\x75\x0b\x9c\x39\x18\x8a\x3d\xfa\x75\xd8\x1b\xb0\x7c\x9a\x50\x5e\xb3\xb4\x84\x6d\x15\xa0\xcb\x43\xd0\xb1\x08\x99\x7a\x0e\xc1\xa7\xe5\x23\x91\x8b\x7a\xe1\x67\x1e\x3e\x8b\x2c\x69\xc6\xcc\x52\x2a\x9f\x25\xbd\x05\x2d\x65\x0c\xca\x21\xfe\xca\x26\x0d\x65\x0f\x7f\xfd\x9b\xad\x5b\xb4\x57\xb2\x75\x8b\x36\xd2\xaa\xf4\x5d\xa5\xef\x37\xf4\xfd\xe6\x16\xd9\xa3\x05\x1b\x5c\x85\xa3\x88\x84\xb4\xa8\xc9\x89\xc2\xcf\xab\x48\x92\xbd\x08\xe9\x48\xe4\x56\xdf\x91\x88\x88\x2d\xa6\x22\xf5\x69\x6f\xea\x18\x24\x75\xab\x78\xde\x09\x34\x5c\xe5\x7c\x2d\x4d\x3a\x3c\x69\xb1\x9c\x34\x42\x6a\x72\xc6\x1c\xc5\x00\xc3\x36\x59\x0d\x8a\x38\xe0\x84\xda\x7a\x39\xae\x5f\x76\x84\x34\x80\xe2\xa3\x8a\x64\xbf\xd4\x8e\xc9\x8c\x09\x9a\x77\x3a\x89\x6d\x54\x9a\xc4\x93\x12\xd1\x10\xbd\x58\x0c\xf0\x01\x59\x87\x5f\xf6\x02\xfe\x07\xc6\x83\x8f\xf9\x27\x93\xa0\x4b\x1e\x87\x5e\x7d\x59\x69\x01\x96\x8f\x57\xf0\x56\x95\x5e\x0c\xb2\x57\xc8\x78\x45\x44\x41\x9a\xc5\x2e\xaf\x5c\xa0\x5f\xd8\x60\x65\x02\xff\x19\xbb\x74\xe5\x37\x18\xc3\x6f\xf8\x58\xf4\x37\x31\x19\x0f\x7f\x23\xdf\xa6\x31\x9c\x79\xc1\xca\x1c\x78\x9c\x15\x94\x0b\x50\x23\x2b\x68\x7f\x96\x1c\x42\xc7\xa2\x1f\xc8\x86\xb4\x7f\x53\xb4\xe0\x8a\xb0\xf1\xc2\x4d\x1b\x40\x97\x02\x5d\xc7\xd1\x67\x82\x62\xdc\x00\xdf\xa0\xfe\x90\x34\x7b\xfe\x00\xa0\x79\x70\x27\xef\x0d\x02\xbc\x9a\x27\x9b\xe7\xa8\xfd\x53\xda\xd5\x97\xbb\xa8\x7c\x60\x3f\xea\x67\x42\xa6\x38\xe4\x20\x11\x61\xa1\x87\x10\x3a\x1b\xcd\x83\x6e\x97\x74\xf2\xc6\x64\x6a\xeb\x91\x9e\x9b\xd4\xc7\x23\xd4\x05\xfb\x59\x16\xb2\x94\x2f\x5d\x32\x28\x5d\xf8\xf5\x1d\xbc\xee\x50\xc2\x1b\xeb\x26\xa0\x47\x87\x64\x41\xcc\x41\x5b\x86\xd1\x50\x64\xc9\x8c\xc4\x91\xc2\xcd\xcb\x5b\x4b\x52\x70\xf4\x6d\x3e\xab\x71\xce\xeb\x64\x49\x89\x8f\x75\x69\x6c\x8b\x03\x09\x45\xab\x68\xbc\x4f\x40\xe3\x4d\xda\xa4\xe2\x68\x4c\x02\x8d\xe0\x69\x47\xaa\x9a\x02\x61\x01\xa4\x06\xbe\x13\x37\x06\x49\xb4\x45\x1b\x0e\x3a\xd1\x46\xb9\x53\xf5\x60\xeb\x9f\x02\x39\x55\xd3\x9a\x9c\xd4\x85\x03\x1a\xcc\xa4\x56\x26\x44\xad\x4c\x14\xb5\x92\x10\x37\x34\x57\x4f\x5c\xaa\x5e\x41\x9d\x6a\x3c\x69\x05\x71\xab\x02\xa8\x2f\xd2\x13\x98\x14\x75\x46\x30\x2f\x2b\x7b\x71\xd4\x83\x35\x9d\x67\xed\xba\x10\xbc\x20\x09\x27\xdf\xac\x02\x89\xa8\xde\xb9\x4e\x4a\xfc\x54\xcc\x40\x57\x45\x6f\xe9\x0a\x0b\x7f\x9d\x09\x38\x76\x12\x61\x93\x21\x40\xa3\x7a\xeb\x85\x4f\xdf\x98\x94\xdc\x51\x08\xf4\xc3\x9d\xd0\x9a\xc3\xd7\x40\xa8\xa5\x16\x7e\x27\x51\x80\x42\x68\xb9\xd7\xd6\xbc\xd8\x7b\x98\xac\x11\xc8\x54\xf6\xca\xc5\x57\x75\xa2\xfc\x45\xd9\x47\x93\x1d\xae\xbb\x64\xa1\x0e\xef\xa9\xa4\x0a\x4c\x43\xbe\x44\xfa\x19\x31\xdb\x12\xf4\x4c\xac\xf2\xde\x31\x75\x3d\xb9\xa0\x41\xcb\xb2\x3b\xc9\x1c\x1d\x8b\x92\x0b\xc1\x86\x3c\xa6\x39\x68\x4e\xda\x99\x85\x39\x82\x99\xbc\x52\x27\xf5\x2b\x71\x6a\x5a\xf1\x0b\x28\x75\x52\x9d\x48\x69\xf0\x66\xea\x3e\x68\x27\x75\x13\xcf\xc0\x54\x93\x51\x37\x0b\x72\x55\x97\x81\x37\xa0\x3a\x2f\x33\x1d\x96\x34\x26\x2c\xbb\xde\x85\x14\x75\x01\x33\x74\xd6\x96\xca\x64\x10\xc8\x00\x0e\x1e\x1e\x2c\x48\xfb\xf7\xeb\xd0\xee\x84\xf4\xd4\x3a\x13\xa3\xf3\xd4\x20\x22\x68\x0b\x23\x8f\x8e\xd1\x79\xea\x10\x73\x67\x56\xa3\x22\x24\x05\xab\x9e\x19\x02\x3f\x83\x1e\x51\x14\x5d\x2b\x6e\x1d\xd7\xd8\xe0\x7b\x00\x9a\x4f\x1f\xef\xf0\x82\x1d\xfe\xe2\x7b\x47\xb7\x53\xfe\x82\x4f\x96\xf9\xb7\xfc\x72\x26\x4a\x7b\x40\x96\x3d\x8d\x86\x3d\x74\xf2\x7f\x24\xf9\x97\x5a\xb5\x52\x59\x00\x52\x25\xf1\x13\x6c\xc8\x43\x14\x3b\x49\x49\x40\x0b\x1f\x2d\x2a\x73\xcb\xd7\x5d\x85\xb9\x29\xf1\xdb\x58\x38\xec\x6c\x82\x24\x68\xd4\x68\xb5\xbe\x47\xf2\xad\x2b\x98\xb5\xcd\x8a\x69\xa5\x78\x62\x3c\x75\x53\x4d\xa9\xaf\x72\x34\xf2\x16\x5c\x70\xbf\x25\x32\xe6\x51\xb0\xa4\xd2\x38\x92\x22\x32\x34\xb0\x81\x65\xca\xe8\x64\x34\x86\x51\x90\x4b\x1b\x33\xa2\x74\x0d\x08\x70\x4f\x1d\x91\x2b\xf2\x55\x33\xf4\x4a\x29\x7f\xc1\xe7\xc6\x86\x2d\xd1\x8e\xa4\x84\xa0\x6d\x49\x09\xc1\x8c\xe0\x5b\x4d\xee\xd2\x5d\x06\x6c\xb4\x8a\x6c\x30\x96\xe4\x7a\xd8\x26\x6d\x05\x57\xea\x0c\x29\x7b\x6a\x28\x46\x3b\x68\xd3\x5e\x53\xc1\x8f\x4c\xc4\x0e\x49\x7b\x9f\x6d\x09\x8f\x27\xac\xc4\x40\x15\xc2\x9a\x94\x5a\x04\x2e\xc0\x92\x96\x52\x8f\x14\xb8\x33\xee\x4c\x14\x39\xb2\x51\x0b\x42\x87\x57\x82\x7e\x69\x29\x97\x4c\x22\xb9\x30\xa2\x49\x0b\xf1\xed\x79\x4f\xcc\x9b\x51\xaf\xd4\x42\x07\x05\x1c\x1d\xa7\xa2\xd1\x2d\xb0\x61\x0d\x5b\x2f\x81\x91\x4b\xaf\x42\x51\xc9\xc5\x42\xaf\x3a\x76\x06\xb6\xda\xb8\xb4\xf6\xfa\x35\x7a\xf3\xc6\x9b\xce\x78\xe8\x01\x89\x24\x15\x6a\xd0\x09\xa9\x74\xc3\x4d\x0a\x42\x92\xfc\x7c\x0d\x75\xe3\x7f\xe5\x69\xf9\x2e\x86\xcd\x4d\xa3\x23\xd8\xfc\x88\xd2\xd3\xf2\x8f\x1f\xc8\xef\x84\x13\x11\xf9\x3f\x7e\x6c\x03\xcb\x30\x87\x86\x6b\x69\xeb\x0b\xb8\x7d\x0f\xf8\xf9\x81\x23\x6d\xb4\x1e\xa1\xe4\x2b\xd1\x28\xc3\x35\xf9\x80\x6b\xb2\xb0\x0f\x8b\xab\x7d\xfc\x79\xb5\xe7\x7f\x55\xed\xa7\xe2\x6a\xf7\x8a\xaa\xa5\x4a\xe9\x91\x2a\x56\x70\x44\x8f\x20\x50\xdd\xec\xb8\xb8\x8e\xdd\x74\x1d\x86\xc9\x14\x80\x7c\x5a\x33\x98\xc8\xe3\x60\x4e\x4b\xc5\x9f\x00\x18\xdb\x64\x9e\x10\x75\x3c\xec\x93\xe2\x7a\x77\xb2\xf5\xf2\x26\xa0\xde\x01\x07\x7a\x89\xcf\x10\xea\xe8\x23\x05\x8a\x92\x85\x3b\x76\x31\x80\xa4\x46\x2a\x42\x11\xe3\x09\x58\x27\xc0\x7a\x90\x12\x24\xa5\x8a\xd5\x25\xc3\x43\x94\x0f\x4e\x44\x63\x6c\x67\x6b\x36\x2e\x85\x1d\x43\x3b\xe1\xe8\x6e\x99\x3b\x1c\x17\x05\xe6\x9f\xc7\x62\x1b\x36\x63\xf9\x63\x6c\xd5\x44\x4a\x76\xfe\x21\x51\x18\xd9\x9f\xe2\x99\xf7\x81\x36\x20\x4f\xda\xb2\x67\x23\x90\xd3\x40\xc9\x47\x93\xbc\x87\x0e\x89\xbf\x3f\xc6\xd0\xc9\x6f\xa5\xa3\x09\xf9\xa3\x38\xa2\xaa\xa1\x2f\xcb\xea\xfd\x68\xbe\x95\x38\x4d\x7a\x36\x76\x44\xa2\x4f\x8c\x38\xe4\x30\xaf\x0c\xcc\x9a\xc0\xd2\xb6\x9d\xba\x43\x95\xb7\xa9\x9f\x62\x4d\xff\x1c\xc5\x86\x9a\xf7\x55\x45\x7b\xce\x75\xf1\xed\x3c\x74\xf5\x74\x62\xbf\x1c\xa2\x7d\xab\x53\xa9\x6c\xff\x53\x3f\xa3\xba\xb3\x9f\xee\x32\x0e\x71\x6e\x6e\xe9\x49\xea\xb8\x7c\x4a\xcc\x1d\xaa\x4b\x79\xa4\x2b\x45\x5d\xf4\x11\x64\xa0\x2b\xf8\x8c\x8a\x5b\x06\x4a\x23\x8c\x96\xe8\x50\x72\x6b\x58\x5f\xb7\x74\x7c\x27\xac\xa5\xea\x57\x3e\xc9\x22\xef\xd1\x83\x98\x15\x22\x6d\x1f\x24\x0f\xf8\x06\x14\x2b\x45\xe1\x01\xb0\x76\x78\x7d\xc3\xd7\xa0\x28\x8c\x28\x7b\xa2\xe7\x49\x5d\xed\x80\xd9\xd9\x55\xef\xf9\x19\x8d\x85\x92\x87\xbc\x20\xb9\xc5\xfc\xad\x39\xe8\x0e\x86\xb3\x04\xcc\x50\x3f\x24\x58\x9f\x40\x63\x4c\x61\xb4\x5e\xbd\xa2\xd6\x5b\xca\x85\x47\xce\xd0\x93\x47\xed\xae\x74\x06\xa3\xc9\xd8\x4e\xee\xff\x83\x0e\xb1\x70\xfa\xe2\x1a\x78\x32\x01\x7c\x1d\x5b\xfa\xc1\x87\x38\x6a\x5d\xdb\x5d\x56\x85\xe3\x99\x51\x4f\x42\x3f\xbb\x6c\x12\x36\xad\x5f\x8c\x0c\x32\xab\x16\x0f\xd0\xef\x90\xc5\xaa\x31\x3e\xb0\x29\x3d\x54\x99\xf1\xcb\xa3\x08\x50\x73\x34\xee\x04\x31\x52\xc0\x76\x40\x29\x4e\xcb\x36\x53\x9c\xa0\x8e\x65\xcc\x59\xc3\x17\xf0\x2d\xbc\x72\x0c\xd1\x3e\x20\x5e\x9f\xd0\x1c\x3a\xfc\xf3\xfc\x7c\x08\x67\x33\xb9\x09\xf4\xd9\xae\x62\x79\x1f\xd5\x05\xad\x85\x01\x6e\x06\x5a\x38\x49\xb8\xb7\xc4\x9a\x32\xca\x14\xf0\x36\xc3\xb0\x63\xdd\x22\x06\x94\x34\x40\x80\xe5\x8c\x80\x11\x1d\xb3\xbf\x55\x98\x28\x11\x45\x62\x6e\x03\xd7\x0b\xec\x2b\x1c\x2c\x7e\x3a\x83\x9a\xe5\xb5\x64\xeb\x64\x1e\x00\x74\x46\x68\x34\xc4\x4e\x29\xf9\x93\x7e\x38\x0a\x19\xa4\x6f\xbb\x06\x83\x46\x1b\xbb\x85\x21\xb3\x67\x45\xbd\x92\x4b\x69\xe7\xbb\xa4\xe8\xd8\x18\xba\x45\xae\xe2\x89\xf1\x66\x01\x33\x95\x29\xb3\xa3\x47\xf7\xbd\x67\x10\xf0\x05\x83\x2f\xf5\x3b\x03\x2b\xa9\xae\x8f\xc6\x9d\x22\x98\x26\x04\x1d\xd8\x17\xf7\x13\xd1\xc3\xe7\x5d\xc4\xb8\x67\x3b\x51\xea\x8b\x07\x8b\x1a\x92\x63\xd7\x5f\x1e\xc2\x97\xbc\xf1\x02\xf8\x81\x79\x72\x78\x03\x0b\xb9\x81\xb5\xce\x84\xee\xdc\x87\x4c\xc7\x0c\x89\xb9\x09\xcf\xb4\x4c\x24\x2a\x00\x66\xf9\x7a\x50\xc4\xb0\x01\x6a\x38\x51\xb2\x80\x44\x7c\x8b\x68\xac\x6a\xa2\x2b\xbc\x1b\x10\x45\xf8\xa9\x2d\xd5\xfb\x3e\xf3\x03\xc0\x38\xc8\x92\x9b\xb2\x3e\xf3\xde\x35\x51\xd4\x67\xa4\x25\xb7\x11\xed\x21\x21\xf1\xaa\x1e\x73\x02\x1d\xb2\xbf\xd4\xce\x63\x11\xeb\x11\x46\xa5\xab\x8e\xea\x8e\x6d\x1e\x4d\x92\x50\x06\xfc\x42\x6c\xbc\xd2\x2b\xd7\x63\xdb\x99\x16\x3b\xcf\x2b\x9c\x1a\xd8\x88\x9f\x14\x33\x6a\x27\xd3\x25\xd3\xaf\x07\xba\x13\x47\xb1\x9d\x27\x1d\x18\xc9\x89\x5c\x27\x00\x2d\x4f\x2f\x7f\xa2\xda\x2e\x87\x95\x71\x6e\xae\x62\xe5\xdd\x90\x43\x6f\xd7\x70\xc7\xbc\x7a\xe5\xa5\x70\x08\xfa\x6d\xd0\x44\x42\x62\x90\xff\xba\x7c\x7e\xb9\x94\xfe\xfd\x14\x6f\x57\xde\xa3\xe1\xe5\xf7\xc6\x6a\xa1\x49\x3c\x51\xfb\x9c\x0c\x91\xd9\xba\x59\xda\x1f\x64\x38\xd2\xc7\xb3\xd0\x9d\x14\xfa\xd5\x09\x99\x2b\x47\xa3\xbe\x1d\x7a\xfc\x42\x16\x3e\xcc\xde\xa2\x85\x08\x33\x5c\xe3\xbe\x4e\x1a\x19\xdf\x15\x54\xf3\xec\x63\x42\xd8\xe3\xb5\x3a\xba\xd0\x54\x08\x1b\x8a\xc8\x57\x4f\x93\x7e\x9a\x01\x1e\x15\xbe\x93\x82\x21\x8b\x9a\x1c\x19\xf4\x97\x40\xba\xb0\x51\xd2\xa8\x4e\x08\x24\xd9\x5a\xac\x5a\x3b\x5d\x76\x94\x43\x03\xc9\x5c\xea\x96\x3e\xdd\xb2\x55\x9c\xa5\xbe\x70\x5c\xca\x72\x5d\xfe\x1a\xfc\xfd\x69\x96\xed\x7d\x45\xed\xa7\x1a\x3a\x28\x25\x7f\xdd\xb3\xec\xe3\xb8\xbf\x0f\x6e\x1a\xd0\x3a\x7e\x0a\xbc\xd4\x74\xdc\x0c\xef\xb3\xaf\x64\x01\xc6\x59\xd8\x77\x5d\xbe\x14\xff\xf1\x50\x2e\xe9\x11\x93\xc0\x0b\x68\xe9\xa3\xfc\xe5\xe4\x3f\xae\xec\x25\x3d\xb3\x66\x7b\xb8\xd7\xe5\x7e\x54\xb4\xda\x80\x7d\x84\x3d\x6d\x1b\x0b\x3e\x94\x10\x7c\x4e\x0b\xb7\xff\x1f\xb7\xbe\xcf\x23\x39\x94\x00\x90\x7d\x6d\x15\xa6\x7d\x9f\x99\x2b\x90\x38\x4e\x35\x00\x52\xad\x4a\x82\x7a\xdd\x39\x2f\x2d\x23\x59\x63\x59\x11\xdb\x0e\x34\xba\x44\xd5\x41\xcd\xcb\x57\x20\x44\x2f\x2c\x35\x82\xaa\x2e\x64\xd3\x90\xe6\xde\x2a\x1f\x20\x4c\x32\x48\xd8\x60\xef\x8a\x66\x07\x5b\x92\x42\xa9\x0f\x91\x7e\xd9\x06\x5a\x08\x68\x4a\xf2\x88\xe0\xc8\xce\x8d\xc9\x49\xb1\x55\x8b\x24\x81\x03\x09\x48\xd9\x27\x2f\x8a\xc6\x48\x0e\xd6\x3d\xe7\x3b\x5d\xcc\xd7\xf1\x46\xed\xf0\x16\xd5\x6f\xcb\x53\xec\xc1\x0e\xd1\x59\x9a\x5c\x5c\x23\x77\x1b\xf9\xf3\xfe\x37\xe9\xc7\x39\x94\xc6\xe7\x55\x81\x91\x2b\xd6\x5b\xeb\xae\x48\xae\x4c\xd5\xf0\x1c\x6f\xe1\xe3\x29\x5c\x1e\x39\x48\xcb\x95\x47\xd6\x36\xfc\xa9\x3d\x2d\x12\xed\x32\x1a\xbb\xef\x3c\x4d\x6b\x12\xda\x8f\xd0\x35\x90\x67\xd9\x2d\x02\x26\x7b\x24\x61\xea\xa7\x74\x29\x5d\xf5\x74\x70\xbd\xf1\x62\xfe\x85\x6f\x7a\x98\x0d\xdd\x9c\x95\x00\x73\x27\x1d\xc6\x14\x57\x9e\xd2\x6e\x3a\x28\x3e\xc0\xcc\x9c\x75\xad\x37\xed\x95\x5b\x4a\x9d\x2f\xb7\xa3\x7d\x1c\x14\xf3\x5e\xf8\x32\x04\xb2\x6a\xe7\xe9\xd3\xed\xee\xa8\x04\x3f\xe8\x43\x33\x31\x8f\x71\xcf\xb4\x2e\x73\x06\x06\x28\x62\x49\x09\xe4\x07\xa2\x44\xce\xa8\xb5\x2d\xa2\x72\x0b\xf7\x5a\x7b\xe4\xe4\xb9\x7e\x2a\x72\x77\x47\x3d\xc6\xb7\x0f\xaa\x88\x3a\x31\xe4\x3e\xbd\xbb\xfb\xa5\xf1\xae\x7a\xb0\x74\x66\x1a\xbf\x84\xf1\xf5\xc9\x91\xb6\x31\x00\x7d\x85\xa6\x3d\xc3\x8a\x3d\x94\xa7\x57\x95\xd9\xe6\x8c\x3d\x9e\xde\x98\xa9\x7d\xee\xe9\x7d\x1e\xde\xd1\x9b\x10\x86\x95\x83\x08\x85\x10\xae\x54\xfb\x63\x57\x41\xd1\x7f\x8c\x42\xa8\x36\xf4\xec\x97\xe2\x2e\xb0\xd7\x0f\x8d\xa5\x67\xfb\x18\x12\xe5\x59\xf5\x61\x29\xf7\x3d\x86\x34\x36\xd9\x70\x1a\x2d\x9f\xee\xd4\x51\xa8\x0e\xb7\x48\x3e\x81\xb9\x2e\x1f\x1d\x2f\x3b\x78\x8b\x8e\x52\x59\xfe\xe8\x58\x76\xee\x6a\x54\x34\x04\x2f\x54\x74\x19\x65\xfa\x5c\x38\xce\x20\x9d\xc9\x2f\xac\xc9\x4f\x67\x1a\x9f\x14\x65\x0a\xcd\x4c\xb8\x58\x0f\x39\xbd\x0e\xc5\x20\x92\x4c\xe8\xe0\x41\xba\x07\x87\xaf\x92\x16\xf7\x8a\xf2\x3c\x4e\xde\x47\x1f\x12\xe1\x4b\x9f\xc4\xb8\xa3\xb3\x1f\x5b\xaa\x7a\x69\x66\x80\x98\x26\xe6\xbc\x5b\x1a\x0c\x7c\xb5\x55\x81\xc9\x0b\x9c\xb0\x4b\x0a\x75\x6c\x48\x99\x99\xeb\x24\x94\xe2\x22\x8d\x0d\x4b\x25\xc5\xcd\x05\xe0\x3a\x74\x9f\x6d\x62\xa8\x2b\xd4\xcd\x0d\x59\x3f\x6f\x91\x28\xe1\x79\x89\xae\x61\x0f\x4b\x7a\xb7\x37\x8a\x9e\x09\x34\x19\x13\xdc\x02\xeb\xfb\x37\x7a\xdf\x52\xd8\x93\x71\x27\x1a\x25\x4f\x77\xb2\xe5\xf4\xca\xde\x4d\x52\xb4\xa8\xaf\x03\xe9\xd5\x0b\x72\x3a\x83\x7a\x97\xac\x2b\x59\x0b\x51\x06\x0c\x1b\x3b\x61\xfd\x1c\xb9\xdd\xae\x71\x72\xb3\xae\x5d\x49\x2e\xe5\x3c\x36\x97\x32\xe1\x51\x80\x3d\x97\xa2\x95\x82\x63\x33\x83\x3b\x01\x4b\x11\xe2\x7c\xf5\x6a\x75\x88\x87\x05\xae\x81\xf5\xfc\x2c\xe5\x2f\x0b\x71\x47\x0f\xc5\x4a\xd4\x25\xd4\x05\x77\x12\x5e\x02\xc8\x17\xec\x9f\xc1\xdd\x98\x06\x9d\xf7\x8a\xed\xe8\xec\x0d\x39\x37\x82\x53\xca\x90\xce\x99\x94\x8f\x0d\x91\x83\x26\xd9\xde\x87\x21\xf9\xcd\x93\x27\x34\x8c\x9c\x64\x5d\x80\xff\x5c\xd5\x19\x1b\xcd\x46\x5c\xe0\x10\x08\xcb\xfb\x48\xcf\x01\x23\xe5\x2b\x11\x4b\x80\x11\xc0\xd4\x04\xe6\x13\x61\xac\xef\x18\x35\x7c\x83\xfe\x68\x2c\xaf\x8b\x6a\xf9\x8e\x9e\x2f\x58\x71\x2a\x27\x85\x95\xf7\xbb\x59\xd9\x10\x6a\xa1\x87\x70\x1c\x4e\xfc\x80\x90\x37\x1d\x2d\xcf\xcf\xab\x2c\x67\xca\x3e\x17\x3c\xc2\xab\xba\xe4\xc4\x64\x9c\xe8\xf1\x35\x2e\x99\x71\x75\x2e\xdb\xc0\x0b\xac\x07\xaf\xab\x95\xca\x3f\x81\x27\x58\x0f\xf8\xf8\x90\xef\x12\x3a\xad\x79\xae\x63\x5e\xa6\x53\x69\x5c\x2e\xf0\x24\xc3\x7c\x40\xf6\xd9\xad\x4e\xaf\xf7\x21\x1a\xf6\x1b\xc3\xd1\xdf\xac\xa6\x13\x26\x3e\xa6\x24\xe5\xa9\x6b\xdb\x1d\x8e\xc7\xc3\xfe\x7f\x5e\x61\x55\x55\xd8\x21\x2d\x89\xf1\xdf\x1e\x22\x4f\xab\x27\xab\x31\x04\x8f\xe7\x69\x3b\x29\x47\x17\xea\x7a\x77\x80\xc2\x45\xe7\xa2\x47\xd7\x2e\xab\xf8\x34\x1e\xfe\xee\xb7\x9f\x9f\x4f\x21\xca\xbe\x6f\x03\x25\x27\xe1\xfd\xf1\x98\x45\xa2\x9e\xa2\x34\x21\x82\x3d\xf2\xb3\x33\xfe\xab\xb6\x58\x98\x26\x9d\x4e\xd3\x46\x6c\x20\x3b\x1a\x35\x7a\x3c\x46\x77\x37\x78\xf7\x3d\x40\xa9\xfb\x80\xbc\xf3\x43\x2c\x5e\x99\xc3\x5f\x38\x09\x07\x8b\x73\x12\x00\x9f\xa6\xdf\x8a\x9f\x25\xdc\xfc\x28\x65\x1e\xf4\x42\xee\x9b\x33\x29\x1a\x73\x4d\xc3\xb5\x67\x89\xbc\x8c\xc1\x96\x7b\x05\x44\xe9\x13\x79\x54\xc1\x6b\xd8\x1a\x5a\x43\x45\x05\x5c\x6f\x51\x77\x9d\xa7\x8e\x5f\x8b\xe1\x0c\xf4\xd1\x29\x91\xcd\x8a\x9a\x96\x56\x18\x74\xb5\xc2\xe0\xa9\x8c\x39\x37\xb4\xb7\xea\x9f\xd0\xee\xd6\xd1\x05\xf4\x10\xcf\x4f\x1e\x47\xdf\xcb\x9f\x37\xa7\x4a\x04\x51\x57\x6e\xe8\x8d\x01\x7d\x4e\xd6\x0a\xed\x87\x22\x4d\xed\xa9\xcb\x26\x52\x74\xc4\xbe\xe1\x73\xd1\x94\x4a\xc3\x39\x4f\x37\x93\x28\xda\x77\xe8\x27\xf2\x50\x0a\x69\xd8\x93\xe3\x38\x4b\x67\xca\xc5\xf9\x5a\x4a\x8b\x7d\x56\x65\x59\xad\x2a\xaf\x5e\xe1\xd7\x3f\xf3\x5d\x3d\xb4\x60\xa2\x36\xf6\xd0\x4e\x16\x9a\xa0\x4f\xea\x29\xbe\xee\xda\x65\x22\xa2\x8f\x84\x13\x0d\x4b\x4a\xee\xdf\x9d\x12\x5a\x3b\x9f\x24\xcf\x60\x21\x87\x4c\x3c\x9d\x2a\x67\x3b\x97\x13\x72\xb6\x73\x49\xd3\x39\xf2\x96\x11\x3c\x11\x20\x5d\x71\x5f\xba\xcc\x3c\x3d\xe5\xa9\x54\x1d\xef\x4e\xed\xd4\x68\x29\xb2\xdf\x92\xd9\x94\xe5\x82\x85\x6a\xad\xdf\xca\x51\xb9\xec\x67\x4c\xf3\x04\xf8\xc8\x61\x85\x94\x98\x0b\x34\xc0\x30\x2f\x11\x15\x1f\xe6\x8a\x71\x71\x9d\x56\x07\xce\x34\xc2\x77\xae\x73\xd7\x16\xb5\x21\xcb\x51\x00\xe1\xb7\xf1\xea\x14\xea\xfc\x36\x9c\xac\x78\x64\x7c\x9e\xc4\x91\x7e\x24\x66\x25\x4b\x3d\x08\x22\xc3\xe7\x6b\xeb\xee\xfa\xda\x4a\x24\x48\x10\x4e\x32\x4c\x81\x6a\x36\xa2\x41\x1d\x19\x46\x14\xf8\xd2\x09\x66\x6b\x7a\x36\xd5\xb6\x3d\x9d\x12\x54\x54\x8c\x69\xc6\x35\x90\x10\x09\x13\xa4\x34\x78\xbe\xea\xfc\x00\x38\xb6\xfc\x56\x56\xb4\xfa\x68\xea\x81\xe7\xac\xfe\x82\xe7\xea\x7b\x2b\x67\x15\x38\xdf\xaa\x6d\xae\xad\xf6\x1c\x9d\xf2\x5a\x7f\x65\x68\xf5\x52\x3a\xaa\x2c\xd4\x15\xde\x92\x77\x35\x2e\x1a\x37\x57\x8a\x28\x03\xe5\xbd\xfb\x40\x3a\xd7\xd5\x06\x90\x0f\x24\x95\x76\xf2\x83\x6e\xe7\x7d\x4b\xfa\x96\x75\x5f\xbd\x8a\xda\x82\x9f\x4f\x3c\x3f\x4b\x6d\x0a\x60\xa4\x22\x40\x4d\xa7\x86\xb6\xc6\x17\x53\xfb\x9b\x79\xd3\xb6\x98\xa2\xac\x16\x17\x45\x2e\x09\xdd\x39\x5c\x3b\x57\xf2\x2a\x08\xda\x92\x0a\xd5\xad\x03\xf5\xf5\x70\xac\xbe\xa4\x7b\xf9\x93\x42\xf5\x1d\xf9\x18\x1b\xc0\x0f\x00\x39\xaf\x55\x33\x96\x3a\x19\x47\x17\xd8\x53\xc5\x85\x73\x49\x96\xcb\x9c\x16\x5e\xcf\xf3\x24\xe9\x29\x42\x19\x9b\xbb\x9d\x99\x9f\xc4\xf1\x69\x73\xdf\x29\x42\x07\x07\x5e\x4a\x8a\x3f\x18\xae\xe0\xad\xb4\xe8\xa0\x23\x8e\x99\x88\x49\x83\xae\xd7\x41\x87\x0a\x62\xc5\x83\x89\x1a\xf6\x57\xe8\x34\x87\x09\x1b\xf8\x3d\x53\x92\x2f\x33\x92\x59\xb3\x40\xd0\xf4\x25\x64\xb8\xd2\x52\x21\xed\x3e\x53\x0c\xac\x2c\x1a\xb7\x0e\xf0\x08\xf2\xd8\x10\xca\xfd\x01\xfe\xa2\x6a\x22\x4c\xb1\xc5\xd1\x0b\x62\x06\x32\x4a\x46\xc6\x44\x1c\x78\x75\xb7\x94\x98\xed\x19\xa3\xa3\x3a\xad\xe4\x51\x38\xb5\x54\xe1\x7e\x63\x89\xba\x5a\x46\x21\xc7\x00\x9f\xf3\x50\x21\x33\x80\x04\x41\x5c\xdd\xde\xdf\xaf\x65\x6d\x8f\x67\x73\x34\x84\xf9\x53\x8f\x5a\x72\xb3\x2a\xf4\x3d\x5b\x59\xed\x79\x00\x3a\x6c\xb4\x50\x41\x0b\x26\xf8\x6b\xd6\x93\x7a\x63\x62\xdc\x2d\xb4\x5a\x6a\xab\x5d\xc6\x78\xe1\x3b\x1f\x95\x1a\xb9\x47\xfd\x0c\x58\x59\x45\x33\xca\xf7\x33\xfd\xf9\x56\x4b\xab\xcf\xe3\x36\x4f\xab\xc1\x3b\xa2\x43\x22\x1d\x4f\x6a\xd4\x3f\xa0\x0f\x69\xad\xa1\x6e\xe9\x3e\xe9\x5b\x64\xe5\x8a\xe8\x40\xea\xab\xe0\x61\xca\x5d\xc8\xc0\xc0\xff\xa1\x7e\x99\x9e\xb3\xe6\x44\x5b\x40\xef\xeb\x5b\xe2\x3d\xe4\xa3\x12\x22\xe4\x42\xea\x09\xa2\x1f\xe8\x41\x9f\xb8\x4b\xcc\x2d\x20\x9f\x8d\x5f\x37\xfe\x3d\x1b\x04\xa2\x72\x06\xf5\xf2\x85\x0e\x4e\x2e\xae\x39\x0b\x28\xc0\x26\x44\x01\xe5\x34\x25\xca\xd9\x49\x99\x6e\xbc\xd0\xd4\x85\x22\xe5\xa5\xa4\x10\x1a\x5f\xe4\x8c\xc0\x99\x47\x28\xf4\xe5\xd3\xed\xba\x1c\x03\x49\xad\xb3\xb6\xcd\x54\x2f\xee\x74\x8d\x40\xc6\xc9\xc0\xde\xc0\x5a\x66\x3e\x2d\x37\x39\x56\xfd\x22\x2b\xc3\x4e\x6c\x97\xc9\x22\x36\x6a\x0b\xa9\x20\xce\x15\x56\x9f\xb3\x0b\xc7\x8b\xb4\xeb\x0b\xa3\x18\x69\x1d\xbd\x77\xb5\x29\x85\x3b\xa3\x8e\x7a\xe2\x0c\x5c\x15\x40\x97\xe0\x72\xae\x56\x2b\x6c\x74\xb7\x29\x8a\x59\xcb\xe4\xfa\x8b\xe6\x8a\x4d\x90\xb8\xf5\x8d\x0d\x97\x6f\xbf\x54\x92\x7b\x6b\xaa\x1e\x24\x33\x6a\xb3\x84\xde\xab\xaf\xaf\x9b\x25\x20\xcd\xbd\x35\xb9\x47\x0d\x03\xd7\x13\x89\x84\x83\x4e\x69\xda\x16\xc6\x25\x2f\xa9\x1d\xa3\x3e\x31\x12\x1e\x7d\xf9\x6c\x08\xe9\x05\xd6\x1b\x5a\xe9\x8b\x51\xbc\xb2\x73\x71\xa4\xd0\x41\xef\x80\xe0\x9f\x53\x6f\x76\xef\x6f\xcb\x1f\x83\x21\xda\x7c\x94\xcf\x98\x3f\x7a\xfa\x39\xcb\x47\xef\xc6\x1f\x94\x9e\x84\xef\x03\xbe\x89\x81\x61\xb2\x6e\x91\x60\x66\xd4\x53\x83\x39\x90\x8f\x6b\x0a\xea\xba\xa2\x94\xf2\xf7\x83\xcb\xf3\x1f\x97\x07\x57\xcd\x93\xc6\x95\xac\x74\x3e\xe0\xb7\xf2\xd2\x0f\xce\x7c\x9a\x72\x8b\x73\xbc\x4f\xc1\xe6\x64\x11\x76\x4a\xd7\x13\x03\x2d\x7d\x4d\xf3\x2e\xdd\x31\x1e\x92\x0a\x9a\x7a\x27\xca\xd1\xcd\xe7\x58\x21\xac\xbd\x2b\x7d\x01\xda\x6f\xa6\x1a\xe9\xc7\xe4\x14\x45\xd6\x83\x00\x7e\x39\x2a\x7d\x4d\xa3\x35\xd9\x0c\x56\x42\xb0\xf0\x95\xb1\x59\x67\xd0\x89\xdb\x85\x72\x34\x7f\xa0\x09\xda\x7e\x13\x4d\xc2\xa1\xfc\x40\x05\xd1\x8e\x1a\x0a\xd3\xf8\x5d\xa4\x3e\x4c\xf7\xae\x72\x8e\xd8\xa9\x3f\xea\x42\xa0\x77\x82\x6f\x27\x13\xb1\x4d\x0b\x5b\x51\xd9\x82\x5b\x2b\xa9\x89\x9b\x6c\x59\x16\xbd\xde\xac\x4b\x59\x0d\xc4\xa2\x09\xba\x96\xa1\x6b\x51\xc2\x47\x7d\x6a\x0d\xa5\xfd\xc5\x16\xf0\x15\xd0\xea\x3b\x35\x39\x92\xbe\xe8\x9d\xac\x53\xb4\x76\x4a\x06\x11\x64\x71\x47\xfa\x9e\x89\xb5\xe5\xaf\xde\xc9\x7b\xa3\xf7\x5c\xfc\xe6\x8c\x4c\x69\x9b\x58\xf2\x9b\xc6\x92\xb0\x7a\x7a\xe9\x0e\x24\x81\x4f\x13\x9c\x36\x38\xa9\x73\x93\x65\x6f\xa4\x31\x39\x17\x3b\x77\x2a\xa2\xc9\x79\x9c\xb2\x62\xc5\xed\x91\xf7\x2b\x05\x3e\xf2\xfd\xb3\xef\x97\x7c\xbd\x23\x60\x96\x08\x6c\xf5\xcb\xc2\x69\x4b\x94\x52\x0c\x02\x0b\xdd\x65\x76\x45\x33\x40\xd7\xaf\x27\xe5\x2f\x6e\x49\x9e\x47\x37\xb1\x7a\x8a\x90\xb0\x10\x75\x00\xad\x6f\x59\xd0\xfa\xae\x16\x31\x85\xc2\x04\x4f\x99\x52\x67\xa5\x39\x42\x72\x4e\xea\x58\x51\x0f\x53\x93\xf3\x1d\x4e\x10\xa8\xe3\x6b\x01\x81\xe4\xe3\x77\x3d\x71\xff\xff\xd1\xdb\x16\x12\x7a\x95\x21\x45\xd8\xdd\xde\xad\x72\x8a\x37\x9f\x2a\x90\x2d\xc9\x7d\x88\xc8\x88\xec\x8a\xd8\x2a\x03\x03\x31\x1c\x4d\x49\x14\x42\x97\x67\xf1\xea\x64\x0c\xbe\x5d\xfa\xa8\x3b\x06\x48\x94\xba\x0f\xa1\x0c\x39\x59\x59\x95\xf3\x09\x4d\xf9\x5e\x09\x35\x42\x55\xcc\x7c\x40\x31\x8a\x4d\x96\x9a\xaa\x32\x76\x7b\xaa\x44\x67\x03\xb2\xf3\x48\xe6\x0e\x55\x45\x3b\x43\x92\xce\xf2\x5e\x44\x75\x10\x63\x02\x52\x02\x6f\xd9\x77\x57\x0b\x70\x61\x36\xdc\xdb\xfa\x97\x89\x1a\xbe\x82\x8d\x06\x9a\x40\xd2\x1b\x06\x3e\x19\xe7\x29\x07\x44\x53\xb2\x80\xe7\x2a\x9d\x5a\x27\x3d\x02\x7c\x08\x6c\x8e\x71\xbb\x64\x34\x60\xe7\xba\x72\x8d\x6a\x05\x05\x67\x21\x90\x04\x57\x0b\x79\x57\x40\x1d\x22\x79\x04\xb1\x4e\x35\x3d\x17\x64\x03\xcf\xb2\x3f\x27\x02\x12\xe5\x69\x88\xfd\x08\xb1\xa5\xcc\x5a\x7a\x32\x5f\xbd\xfa\x69\xfe\x85\xa9\x74\xf4\x39\xa5\x74\x34\xd0\xf2\xc9\x76\x97\xcc\x8f\xdd\xdc\xdf\xdf\x5a\x89\x25\x5c\x08\xd5\xdd\xb2\x3b\x9c\x0c\xfc\x38\x73\xe0\xdc\x4c\xa5\xea\xa6\x11\xd5\x47\x23\x0b\xe5\xde\xb0\xdc\x13\x63\x9b\x3f\x06\xa1\x65\x17\xe6\x6a\x77\x64\x2e\xfc\x80\x5c\x28\x29\x36\xf6\x70\xda\x44\xf4\x65\x56\xf4\x43\x3b\x03\xdf\xe8\xab\x89\x37\xc5\xa4\xdf\xd1\xa8\xae\xb9\x25\x61\xe6\x51\x1b\x4b\xef\x1c\x94\x6d\x00\xc3\x31\x1f\xd0\xba\x93\x66\x9e\x84\x01\x1f\x9f\x8b\x12\xac\xf7\x1a\x39\xcc\xa4\xf4\xa7\x58\xc1\x63\xf9\x79\x79\xfe\xe5\xe0\xf2\xc7\xe7\xe6\xc1\xe5\xb7\x1f\x27\x47\xa7\x47\x0d\xcb\x77\x7e\xdf\xac\x18\x76\xf5\x7f\x56\xf6\x58\xdd\xe0\x31\xf8\xbb\xc6\x59\xed\xaa\xa3\xda\x4b\x8e\xf6\xe0\x16\x4e\xca\x4b\x53\x3b\x86\x81\xd8\x88\x4a\x2a\x20\x88\xd3\x75\x58\x86\x58\xa9\x7e\x3d\x56\xca\xe2\xb0\xc9\x25\xf1\xed\xe7\xa4\x3f\xdf\x11\xf7\x27\xcb\xf2\x52\x5b\x60\x2e\x49\x05\x12\x12\x90\x1c\xaa\x8f\x53\xcb\xd4\x63\x93\x17\xae\xbe\x16\xb2\x48\x5e\xfb\xbb\x24\x7c\xef\xba\x4b\x2f\xc9\x2e\x90\xc9\xdb\xde\xac\x91\x8e\xd0\x4b\x91\x5b\x19\xbd\xc5\x0e\x4b\xd6\x7b\x17\x58\x47\xc7\x11\x74\x6d\x6a\x8a\x22\xee\x0c\x4f\xeb\x89\xe1\xdb\xac\x75\x05\x01\xf5\x93\xaf\x7f\x72\x19\x9f\xb8\xab\x95\x1f\xd5\xc5\x75\xb9\x33\xf0\x83\x87\xf3\x56\xd6\x76\x7a\x5a\x39\x95\x14\x56\x3d\x55\xe7\x3e\xe9\xce\x69\x22\xd6\xab\x27\x9a\x3f\xba\x83\x62\xaa\x6d\xa9\xe7\x95\xf5\xd6\xd7\xb5\x7f\x78\x75\x75\x13\xbc\x67\xb5\x58\x56\x34\x0c\xac\x55\x38\xd6\xfd\x5b\x4b\x77\x54\x13\xc1\x86\xbf\x99\x69\x6e\xc6\xe4\x68\x1b\xd6\xb6\x37\xa5\xaf\x82\x35\x00\xb2\x58\x2c\x48\x8d\x5a\xd7\xe4\x15\x74\xb6\x5d\xee\x77\x06\xb8\xec\x80\xbe\x37\x2b\xda\x0d\xbf\x49\xf9\x08\xbe\x60\x4a\xee\xc0\x89\x9c\x59\xf5\x90\xe8\xc9\x77\xfc\xba\xfc\x79\x54\xf8\x2a\xe0\xaa\x4f\xa8\xe7\xa2\x5f\xda\x78\x5b\xb1\xdf\xa2\x2b\x4e\xbc\xf4\x39\xbe\x93\x97\x95\x97\x7f\x59\xac\xfa\xaf\x8a\x0d\xff\xa5\x0b\x26\xdc\x73\x56\xb7\x57\x94\x3f\x37\x4a\x15\xc4\xf6\xd9\x41\xc2\x1a\xd9\xb9\x9b\x39\x3d\x50\xb4\x32\xc6\xfa\xb4\xa8\x1b\xfb\xfc\xec\xaf\xaf\xcb\xe1\x95\xff\x78\xe7\xbf\xf6\x4c\x5b\xfa\x53\xf6\x11\xea\x4f\xed\xef\x40\x32\xfb\x53\xc4\x42\x17\x6e\x9a\x90\x52\x9e\x05\x43\xbf\x94\x7a\xb4\x90\x9b\x3a\x59\x3e\x4c\x13\x62\xb4\x61\xeb\x6a\x48\x87\xfc\xa4\x63\xd3\xf0\xb0\xd0\x44\x29\x47\x02\xc9\xe8\x80\x9e\x9e\xa3\xd3\x00\xdd\xd4\x00\xcb\xfd\x08\xef\xa2\x1e\x95\xc6\x08\xaa\x95\xf4\x63\xb4\xad\x57\xb5\x6a\x2d\xa7\x0b\xa7\xab\x2f\xe9\x52\x32\x5a\x82\x4e\x33\x20\xc3\x12\x84\x00\x6d\xf6\xc5\xb8\x26\x35\x3d\xa5\x52\x86\x92\x87\xf0\xbb\x4b\x44\x17\xc2\x69\x92\x9d\x1c\xb9\x7f\x9e\xee\x43\xe0\xee\xef\x43\x7b\x3a\xab\x35\xc8\xa7\x51\x50\x00\xbf\x4f\x63\x94\x01\x3c\x7a\xb6\xca\xdd\xfb\x59\xe6\xbb\xd3\x54\xe6\x05\x8a\xc1\xd3\x67\x68\x33\xa7\xf9\x0d\xe3\xee\xc6\x78\x47\xf9\xf4\x85\x58\x2a\x28\xfb\xb4\x58\xe0\xdc\x91\x79\x63\x32\xda\x87\x66\x8c\x45\xc6\x8c\x31\x29\xe1\x74\x9d\xcf\x08\x1e\x70\x50\xf6\xb4\x99\x79\x7c\x3f\xd8\x73\x9e\x1e\xbd\x5a\xcb\x7e\x9c\xd5\x42\xdb\xac\x97\x59\x62\xca\xd4\x45\x63\x9b\xc1\x86\xd3\xad\x2b\x77\xe6\x21\x5a\xd1\x44\x2f\xe6\x3e\x4b\x16\xea\x01\x24\xa2\xd1\x0f\x9f\x58\x5c\x69\x78\xa6\x87\xa6\x68\xbe\x04\xf2\x8e\x56\x3e\x25\xc2\xb3\x33\x44\x9f\x58\x80\xf9\xb6\x4b\xb2\xbc\x6d\x94\xb5\x65\x59\x3b\x29\x6b\xd5\x82\xf5\xaa\xb4\x3e\x2d\xcb\xae\x57\xa1\xb4\x59\x0a\xa0\xa6\xb0\x64\x2a\x53\x88\x44\x5e\x17\x26\x1c\x88\x57\xfc\xb9\x09\x49\xf3\xc9\x96\xdf\x0c\x49\x89\x36\x88\xe9\x61\x41\x6e\x9c\x80\x37\x4e\x50\xb4\x71\x96\x02\xbe\xda\x39\xda\xc9\xda\x3e\xfa\x41\xc0\x53\x7a\xd5\xd9\x0d\xe1\x24\x59\x75\xf6\x42\xc6\xb0\x55\xc0\xb0\x8d\xa4\x80\x81\xef\x6d\xb4\x65\xaa\xaf\xd8\xa5\x6a\x3e\x94\x60\xbb\xa8\x01\x2a\x4d\xe3\xa9\xa0\x08\x00\x88\x38\x68\xb3\xaa\x37\xcc\xcc\xe6\x3b\x2f\x41\x7d\x94\xa5\x60\x37\xf3\xa0\xee\x72\x6f\x07\x57\x93\xe3\x51\x9d\x2d\x15\x39\x4c\x74\x0e\x2f\xa9\x6e\x7a\xa1\x25\x6c\x68\xd4\xc6\xe1\xf3\xfb\x04\x51\xf6\x47\x72\xac\xbf\x57\xde\xb9\x96\x8b\x0f\x26\xe8\x65\x6e\x72\x38\xb6\xc5\x4d\xfb\x1e\xf5\xc7\xda\x50\xea\xe8\xec\xc7\x97\x9d\x93\xe6\x81\x1d\xc2\x68\x43\x18\x2d\x42\x19\xe6\xeb\x3a\x6c\x1f\x82\x70\x9e\x7f\x13\xe2\x72\x56\xac\x0d\x15\xc4\x00\x1d\x06\xef\x18\x60\xb7\xbb\xb5\x00\x2d\x6b\xbd\x6f\xc1\x57\x0b\x28\x9c\x0a\x51\x6d\xd0\x89\xd6\xeb\x60\x7b\xb5\x52\xd3\x23\x5f\xf1\x5e\xbd\x72\xb7\xb7\x6a\xc0\xe6\xbb\x70\xfa\x9b\x87\x65\x6b\xaa\x19\xcb\x1d\x17\x2d\xb3\x95\x48\xda\x6e\x95\x2f\x5b\x02\x60\xa1\xc5\xb0\xd0\xfa\x2b\x58\xa8\xd0\x93\x0d\x09\x0f\xd5\xf7\xc9\x4a\x24\x4c\xf9\x4b\x24\x1b\x2a\x36\xb9\xbd\x73\x61\xbd\x54\x9b\xec\x56\x02\xe5\x3f\x92\xd3\x7e\xc9\xf4\x05\xcc\x72\xdd\x42\x7b\xf0\xc9\xc1\xc8\x4e\xf9\xe0\x80\x30\x81\xc3\x4d\x80\x83\xcc\xe7\xa4\x2c\xdb\x40\xfd\xaf\x5e\x25\x70\xb2\xea\x67\x40\x84\x4b\xce\x42\x99\x0a\x07\x4b\xf9\xe5\x2c\xe9\x3c\x86\x94\x4b\x1c\x1d\xe9\xea\xb3\x67\x85\x4f\x5e\xc7\xf4\xc9\x17\x26\x13\x3a\xf9\x4c\xef\xb6\xcb\x0d\xa8\x17\x01\x7d\x6a\x3c\xf2\x81\xb9\x0d\xa7\x76\x6b\x6a\xd5\xc3\xe5\x73\x8b\x7d\x0a\xa7\xe5\x00\x52\x8d\xa2\xe9\xbd\x66\xec\x43\xd9\xa8\x95\xec\xa8\xaa\x56\x43\x57\xc9\x34\xb9\x1e\xad\xc2\x2a\x50\x31\x92\xb4\xf5\x8c\x4a\x93\xcd\x12\x16\x6d\x16\xf3\x2c\x67\x95\x1f\xb5\x11\xf0\xfc\x5e\x55\x18\xda\x25\xf4\x9c\x34\xd9\xe2\x85\x87\x8d\x6d\x27\xcd\xb6\xd8\xfe\x07\x39\xd5\xcc\x93\xa9\x55\x07\xe5\x52\x81\x94\x1b\x49\xf0\x81\x85\xdc\xae\xd6\x36\xdf\x29\x37\xa2\x93\xcf\x00\xd7\xd5\x55\xc7\x97\xd9\x20\x0c\xc9\x48\xe0\xea\x15\x69\x4b\xbc\xd6\x66\x58\x6e\xff\x1a\x5e\x93\xfd\xd9\x7a\xef\x3e\x3f\xff\xfe\x0e\xfe\xac\x66\xba\x91\x8a\xa9\xc2\xf0\x52\x11\x9b\x14\xb1\xf5\xce\xd5\x9e\xbd\x30\x76\x8b\x0b\xbe\xc9\x44\xbf\x41\xb2\x71\xb5\x5a\xc3\x49\x6f\x2f\xc1\x50\x06\x82\x92\x9e\x34\x53\x4b\x4a\x35\xa3\xb1\x65\xb4\x93\x96\xc2\xa8\xbf\x4e\x4d\x6e\x01\x9b\x04\x07\xe9\xf3\x33\x00\x0c\x7d\xa1\xb4\xcf\x75\xaa\x95\xf7\x1e\x6f\x01\x44\x86\x40\x3a\x20\x2a\xc9\xb4\x8c\x93\x2e\x3d\x47\x39\x95\x22\x91\x6d\x47\x2e\x42\x87\x17\xa1\xf3\x5f\x52\x65\x9d\x5f\xa7\xca\x56\xe9\x59\xe0\x16\xfe\xfc\x8c\x89\xd2\x94\x53\x72\xa1\xb9\x89\x97\xc6\x5b\x92\x88\x8a\xd5\x95\x1c\xec\x2a\x98\xd5\xcd\xfa\xa6\xc3\xef\x0d\xbd\x8d\x0d\xdb\xdf\xd8\x90\x5c\xe0\xb1\xab\xe0\xc3\x08\x7b\x99\xb0\x0f\xeb\xad\x28\xaf\xe1\x04\x2d\x2e\xf5\x45\xad\x62\xcf\xf7\x6a\xfe\x42\x8d\xed\xd8\x2d\xbc\x65\x37\x31\xa4\xf1\xba\xe9\x2c\x5a\x77\xd7\xfd\x68\xdd\x5b\x0f\xa2\x94\xf1\xad\xbb\x04\x1d\x45\xda\xe7\xd2\xe0\xa5\x94\x00\x2f\x8e\x47\xa5\xbb\x69\x46\x1e\x97\xd2\x1f\x18\x98\x97\x61\x5d\xb9\x88\x5d\x5e\xc4\xee\x7f\xb9\x88\xdd\xe5\x8b\x98\x7b\x0d\x78\x68\xbc\x05\x34\x78\x38\xa2\x9e\x35\x79\xe0\x9c\xf3\x1b\x41\x1c\x1c\x0c\xdc\xb7\x12\x7b\x33\xd5\xf7\xe4\x9e\x43\x03\xc0\xce\x78\x05\x4d\x9a\x8c\x57\xaa\x0c\x03\x26\xa5\xec\x0d\xfb\x00\xeb\x01\xf4\x01\xc0\x79\x30\x5f\xc1\x47\x6d\x32\x03\x02\xc1\x39\x0a\x7b\x60\x0e\x49\x04\xc8\x6a\xc0\x0c\x67\xe9\x16\x7e\x11\xc4\x8c\xd6\x09\xc4\xf0\x95\x78\xe5\x96\x9e\xfa\x57\x6f\x4d\x18\xba\x19\x91\xb5\x9b\x61\x5b\x98\xa0\xe4\xca\xe8\x04\xa0\xce\xbf\x03\x40\x01\x28\xb9\x48\x6b\x77\x7f\x06\x4b\x5f\x3a\x25\x8f\xed\x39\x8d\xad\x04\x00\xbc\x8c\x7b\x37\x91\x11\xe2\xfe\x25\xc8\xf5\x24\x94\xf4\x18\x4a\x7a\xbf\x4c\x47\xfe\x8e\xb8\xf6\x0f\xc2\xb5\xa5\x0c\xb2\x35\x49\x83\x2a\x1d\x25\x69\x54\x6b\x86\xb7\x32\x61\xc4\xae\x80\x74\xff\xa0\xed\x6a\x6c\xa0\xdf\x09\x65\xe6\xe8\x50\x37\x87\x31\xcd\xe7\x5c\xca\x68\x2c\x62\x4c\x0f\xd8\x52\xb2\x6f\x49\xdf\x9b\x68\xde\x52\x7e\x6f\x59\x64\x57\x9a\xbe\xdf\xd0\xd8\xfc\x55\x59\xad\xd4\x8b\x45\xe7\x07\x14\x25\x1e\x74\x54\x01\xe7\x2e\x67\xef\x2f\x45\x3a\x5b\xa9\x13\xaf\x8f\x2b\x90\x90\x1b\x48\x6c\xf4\x99\xd8\xe8\x17\x55\x67\x5c\xe9\x6a\x22\x4d\xd3\x73\xe8\xff\x60\x63\xa3\xe0\x78\xde\x7c\xef\xe5\x8e\xda\xc1\xb4\xa4\x5d\xae\x2b\x4d\xa5\x01\x83\xc1\xa0\x08\x0c\x94\xbd\x87\x2f\x77\x86\x3e\xf2\xa0\x08\x2d\x08\xc7\xc8\x53\x37\x54\x04\xd4\x59\x53\x57\x70\x29\x9b\x4f\x81\xe4\x97\xb4\x99\x53\x89\x1f\x48\xea\x20\xbf\x69\x25\xe5\x37\xad\xa4\xfc\xde\x52\x4e\x2f\xe0\xfb\x0d\x32\x71\xf2\xfb\x77\xe2\x32\xf9\xfb\x0f\xe3\x22\x1a\x36\xa5\xab\xf7\x2a\x01\xae\x8c\xf3\x0b\xe2\x02\x19\xb7\x1b\x26\x71\xad\x82\xb8\x50\x6f\x72\x1d\xd5\xcd\x47\xf5\x92\x16\xb6\x9f\xbe\x46\x02\xd0\x00\x1c\x2e\xbe\xfd\xf2\x23\xf0\x09\xdf\x3f\x02\x07\x7c\x0d\x91\xa1\xfd\x0d\xfe\x76\xed\x26\xfc\xed\x2d\x58\xc3\xe5\xc5\x60\x19\x9a\x28\xc4\x04\xc8\x5b\xa8\x69\x76\x4c\x34\x80\xda\x9a\xc6\xac\x0f\x25\x22\x18\x32\x04\x0c\xff\x02\x11\xd4\x5d\x93\x85\x00\xb8\xdb\x64\x6e\xaa\x9a\xd8\x39\x22\x7f\xd4\x9b\xf2\xdc\x75\x52\x0c\x03\xa1\x09\x94\xf3\x52\x7c\x42\x63\xba\x1b\x55\x12\x9c\xac\xba\x48\x03\x67\xa9\xd6\x8a\x83\xc6\x7b\xd0\xd6\xad\xd1\x52\x46\x6e\x93\x68\x7d\xa7\x0f\x60\x3c\xc5\x51\xfb\x14\x59\x02\xb2\x12\x0b\x6d\x1b\x3e\xb4\x86\xbf\xb6\x73\xab\xef\xa8\x27\xc0\x96\xa5\xf7\xf0\x48\x4e\xde\x88\x27\x0f\xfb\x73\x8d\x0a\xca\xcd\xb9\xa8\x9d\xc5\x76\x04\x3f\x07\xb1\x8d\x56\xe9\x6a\x4d\x6d\x6d\xb8\x3e\x2a\x9a\xe3\x0c\x9a\xd5\x73\x9b\xe1\xd9\x33\x73\xb9\x64\x9e\x11\xfb\x9a\x7e\xcc\x46\xbf\x38\x4c\x1c\xdc\x8b\x51\x7e\x6b\x1b\x5a\x9d\xb8\x14\x71\x28\x35\xed\x2a\x88\x14\x51\xe2\x13\xe2\x9f\x2e\xfe\xe9\xc1\x1f\xf2\x9f\x8d\x32\xd3\x1b\xdf\xf6\xd7\x81\x41\xbe\x69\xd8\x8d\x5b\xb2\x8a\xbd\x13\xa3\x7c\xa6\xde\x73\x20\x1e\x96\x0b\x48\x34\x5a\x70\xc7\x39\x33\x84\x65\x7e\x27\x1e\xf5\xc4\xfc\x74\xe8\x27\xa6\x86\xe0\x1c\xc7\x57\xce\xa7\x22\xea\x06\x51\xbc\x32\x6b\x07\x83\x95\x09\x69\x0e\xf4\xc4\xf8\x75\x6f\x08\x1f\xf2\xd6\x3f\xa0\x23\x1a\xeb\x24\x5b\x8a\xae\x73\x10\x27\xa6\x54\x65\xb7\xa0\x4b\x07\x6d\xec\x51\xc6\x0d\x7b\x1c\xd6\x02\xe7\x14\x9d\x75\x9c\xc5\xf8\x22\x9e\x81\xa6\x4e\x69\x67\x31\xa7\x65\xa2\x0f\x62\xf6\xc5\xde\xc4\x64\x37\xae\x87\x3a\x59\xf9\x62\x37\x8c\xe3\xb3\x61\x01\x63\x7c\xca\x32\x2a\x4c\x45\x35\x63\x4c\x40\xe5\x96\xc3\x22\x73\xfa\x8a\xbe\x1d\x48\xc7\x6e\xa9\xd1\xbc\x7a\xf5\x35\x46\x05\xe5\xf0\x0e\x4e\xab\x29\xa2\xb0\xd2\xc0\xc1\x2d\x41\x45\x46\xfc\x56\x2e\xce\x96\x6c\xd0\x13\xbc\x91\xf3\x02\xd9\xbe\x6c\x74\x4c\xe5\xb9\x82\xc9\xb2\x36\x9d\x74\x9b\x13\x6e\x33\x58\x85\xc9\x7a\xf5\x8a\x8f\x80\x11\x7f\xc0\x92\x50\xa5\x23\x82\x71\x02\x76\xe0\x0a\x8d\xe7\xef\x44\x81\x49\xf5\xbc\x78\xa5\x8f\xc4\x9d\x24\xbb\x58\x59\x54\x9b\x52\x28\x1d\xd0\x17\xae\xff\xda\xba\xbf\xbe\xa6\xb2\x59\xda\x12\xd5\xd3\xa7\xef\x80\x52\xfd\xdf\x6b\xae\xfd\xf5\x10\xf0\xea\xb7\x43\x40\xab\xee\x1e\x60\x55\x6f\xaf\xd6\xb3\x47\x47\xb5\x81\x3d\x9a\xd4\x46\x76\x6b\xaf\x16\xdb\x07\x3f\x6a\x93\x85\x24\x84\xa7\xc9\x8b\x1f\x7c\x86\x70\xea\x97\x2e\x43\xb1\x3e\x65\x83\x8d\xa6\x76\xc0\xbd\xdc\xfe\xf7\xbc\xfd\xef\xff\x4b\x52\xfb\x7e\x39\xa9\x8d\x84\xd7\x2a\x63\x87\xbf\x49\xbc\xfe\x6e\xd2\xad\x26\xf7\xd3\x30\x83\xd5\x74\x70\x33\x1d\xdc\x4a\x07\xdf\x10\xe6\x91\xb3\xfc\xf9\x0e\xb9\xa2\x4b\xf8\x5b\xb5\x2f\xe0\xef\xa6\x7d\x06\x7f\xb7\xec\x73\xf8\xfb\x66\xa1\x06\xf5\x7f\xc4\x28\x45\xc4\x28\x65\x65\x34\x11\x93\x4d\xd1\xcf\x65\x34\xd1\xff\x7f\x32\x9a\xe8\xef\xcb\x68\x2a\x3f\x11\xd1\x6c\xc3\xfe\xaa\x99\x51\x44\x86\x04\x69\xaf\x8c\x0a\xa5\x57\x98\x02\x7c\x8f\x26\xbe\x1d\x27\x00\x22\x34\x4d\x0d\xc6\x12\x86\x63\x86\xe1\x78\x39\x05\xb8\xf2\x35\x21\xee\x9e\x9f\xbf\x99\xd4\x60\xbc\x9c\x62\x35\x0a\xd5\x85\x63\x94\xd2\xd6\x83\x9e\x9f\xc5\xb6\x80\x3e\xa6\x8f\xd6\xaf\x8a\x1a\x7c\x49\x96\xb5\x78\x19\xdc\x44\x9a\xed\xa1\xe0\xc6\x4b\x2f\x21\xca\x79\xe9\x8a\x8f\x88\x63\x1f\x9f\x15\xc9\x08\x82\x6f\xf4\xc0\xc0\x2e\x14\x74\xfc\x26\x13\x24\x74\x51\xed\x5b\x46\xe9\x54\x49\x34\xd2\xfd\x15\xd0\xd5\xe7\x91\xb0\xe9\x1d\x13\x06\x2e\x39\x00\x27\xef\x94\xca\xd0\xa3\xf4\x29\x95\xf0\xd9\x73\x79\x35\x39\x81\x13\x85\xa2\xe5\xc3\x92\x99\xab\x38\xb4\xcd\x77\xf0\x67\x55\xf7\x87\x04\x52\x9b\xd4\xfd\x55\xdd\x2f\x24\x21\xa5\x3c\x4a\x57\x3f\x96\xab\x39\xe6\xd5\x1c\xff\x32\x5b\x47\x22\x34\xbe\x10\x20\xd3\x7c\x05\x57\x05\x55\x75\x55\xd0\xa0\x9b\x02\x79\x61\x70\xd0\x06\xde\x03\x65\xb7\xd0\xb5\xef\x74\x57\x84\x57\x80\x77\x6c\x9d\x10\x12\x1a\x78\xe3\x39\x25\x14\x53\x00\x52\x7c\x17\x99\x61\xf0\x3c\xa0\x0a\xb2\xac\x1c\x5d\x2a\x4b\x1e\x0d\xaa\xf4\x53\x9d\x34\x70\xe8\xf8\xd7\x28\x9d\x2c\xa3\xba\x2a\xba\x82\x29\xa0\x34\x14\x72\xb4\x3e\x0e\x96\x8e\xa3\xfa\xb6\x52\x79\x27\x5e\xbd\xda\xac\x56\x2a\xef\xc5\xc2\x34\x9e\xf9\xfd\xee\xd7\xaa\xf8\x73\x95\xec\xd5\xb2\x65\x47\xe9\x9a\x61\x0b\x79\x62\x76\xe9\xf5\x06\xd6\x25\x08\x8d\xd4\x3f\xec\x3f\x2d\x05\x00\x86\xf6\xc8\xcb\x5f\x6c\xee\x8f\xbf\x6e\xee\xbc\x25\x53\x31\xe2\x77\xa3\xb1\x64\x7e\x26\x12\xde\x26\x0c\x6f\x93\xbf\x73\x1d\x45\x92\xd7\xbf\xa0\x6f\xd3\x44\x2d\x1e\x3b\x5b\x85\x04\xaf\xdc\xc7\xc9\xb1\xcd\x97\xda\x0b\xd9\xa3\xbf\xc9\x9a\x4f\xe5\xa8\xa6\x92\xac\xff\xe5\x51\xfd\x35\xd5\x0e\x9c\x4e\x22\x06\x5a\x29\x62\x83\x64\x73\x3f\x15\x2e\x63\x53\x0e\x9f\x17\x96\x70\x0c\xde\xcb\x95\xaf\x44\x9c\xbc\x20\x7c\xf3\x77\x66\x62\x2c\x53\x7b\xc3\x95\xfa\x1b\xa7\x52\x7f\xc3\x5d\x4f\xa4\x26\x40\x04\xaf\x96\xde\xfe\x89\x62\xf0\x6a\x85\xf0\x43\x59\x86\xca\x18\x44\xf3\xeb\x78\x51\xb5\xf5\x53\x91\xf2\x4c\x4e\xe5\x8c\xa7\x72\xf6\xcb\x53\x59\x49\x34\x48\x52\xf7\x8f\xf9\x7b\x06\x64\xff\xdc\xf7\x9e\x79\x42\xaf\xa6\x8f\x68\xf4\x3c\xa7\x19\x40\xf5\x04\xdb\x74\x7e\x20\x3b\xf9\xc0\x9d\x7c\xf8\x2f\xe9\xb8\x17\x0f\x45\x84\x1c\x9b\xbd\xd2\x37\x03\x64\xa5\x9a\x5e\x94\x56\x6f\xb3\xa7\x1b\xca\xc1\xbd\x3c\x9d\xd7\xeb\x0c\xba\x8d\x25\x64\xde\x56\x11\x99\xb7\x1b\xdb\x6e\x9a\xd2\xa3\x98\x6a\x2e\x86\xe8\x3d\xf3\x72\x70\x95\xce\x9a\xcd\xe2\x7e\x0c\x80\x6f\x59\xd6\x8f\x2a\x8a\xe3\x37\x8b\x3a\x73\xd6\x86\xf3\x32\xe1\x5a\xf5\xfe\xd5\x49\xbc\xbf\x93\x8b\x44\x52\xc5\xb8\x21\x47\xdd\xc0\x5f\xba\x04\xa3\xad\x77\x61\x7d\x7d\x5d\xda\x91\xe8\x3a\x2e\xc2\x6a\xcb\xae\xa0\x9c\x47\x7e\x57\x81\x4c\x57\xdf\x9b\xc0\x85\x90\x9b\x12\x7e\x79\x0a\xa4\xff\x98\xac\x0c\x02\xf9\x3f\x45\xb7\xbf\xb5\x01\x62\x4e\xe9\x79\x24\xe4\xfd\xa4\x9b\xa0\x4b\xfc\xa7\x81\xe8\x07\x35\xa1\x9b\x19\xb8\x35\xea\xfb\xb6\x50\xad\xa1\x8e\xb9\xa2\x85\x71\x81\x80\x0b\xb4\x5f\xe0\x0c\xc5\x78\x4f\xa0\xc9\x4f\x5c\xd2\x34\xf9\xde\x08\x0d\x19\x71\x2f\xb6\xb3\x37\x12\x14\x55\xcd\x47\xd1\x5a\xb9\x4a\x3b\x9c\xb4\xb3\xc9\x49\x4f\x20\xc7\xd1\x92\xe3\x08\xde\xb5\x60\x1c\x81\x85\x32\xce\x19\x5a\xda\xc6\xfe\x77\x75\xa0\x8a\x32\x33\xb7\xcb\x0a\x51\x21\xa6\xa8\x40\x17\x67\x53\xde\x36\x6d\x4a\xaf\x39\x6a\x06\x43\x35\x83\x5d\x39\x83\xbd\xec\xe8\x7d\x9b\x07\xef\x99\x8c\x12\x56\x9d\x90\xfd\x82\x15\x77\xb5\x54\x50\xea\xe4\xd6\x85\x52\x3a\x27\xff\x7b\x6e\x32\xff\x1e\xce\x7b\x32\xcf\x2b\x2e\xa9\x51\x2c\x1e\x8a\x59\x0b\x54\x79\x33\x71\x00\x47\xe5\xc1\x98\x81\x17\x35\x31\xd6\xd6\xc5\xfa\x5a\x4d\x5d\x2f\xfc\x63\x0d\x18\x0f\xe0\x3e\xfc\x2c\xf7\x31\x97\x68\x62\xce\x68\x62\xfe\xf7\x0e\x3b\x13\x71\xcd\x42\x2b\x77\x63\x5a\x84\xec\xaa\x5a\xe3\x0a\x91\x5b\xa2\x8d\xa4\x88\xa1\x16\x5d\xa8\x03\xdf\x1e\x18\x1a\x17\x2d\x7d\x57\x8e\xba\x28\x80\x47\xfd\xe7\xe7\xea\xbb\x60\x89\xde\x05\xa2\xcc\x85\x56\x7d\x33\xb1\xe2\xa3\x1c\xee\x23\x0f\xf7\x71\xf9\x70\x13\x56\x66\xb5\x92\xbb\x08\x5a\x26\x93\x73\x73\x28\xd9\x5d\xc8\x46\xfe\x5a\x39\xf2\x3d\xb5\x91\x13\x6d\xef\xc8\x2e\xef\x70\x97\x77\xfe\x4b\x44\xbe\xf3\xcb\x17\x98\xd5\xf7\x7f\xf7\xde\x52\x24\x77\x5b\xc9\xad\x95\xc9\x9f\x03\x53\x67\x40\xc2\xcd\x6d\x4a\xef\x26\x7d\x4d\x69\x7b\x29\x9b\x7d\x78\xbb\x54\xb1\xbf\xf4\x04\x6d\xc2\x9d\xff\x4b\x06\x7c\x57\x4e\xf0\x2e\x4f\xf0\xee\x7f\x39\xc1\xbb\x3f\x95\x78\x6c\x65\x25\x1e\x29\x94\x99\xbf\xc1\xcd\x09\x31\x0c\x31\xc5\x70\x02\x53\xf2\xa9\x8f\xf2\x89\xf9\x5e\xad\xba\x50\x6d\xff\x1f\xcd\xcb\x9e\x9c\x97\x3d\x9e\x97\xbd\xdc\xbc\xe8\xe1\x9b\xe0\xba\x2f\x4b\xed\x73\xa9\xfd\xff\x72\x36\xf7\x97\xcf\xa6\x30\x91\x91\x48\x6b\x40\xca\x19\x1a\x4c\xfa\xd2\x6b\x64\x4d\xa4\xfc\x2e\x24\x97\xd3\xf4\xca\x17\x0f\x9e\xdd\x41\x09\xdf\xfb\x7d\x2b\x1d\x24\x82\x6f\xaf\x2b\x9c\x9b\xdd\xd0\x6e\xd8\x7b\xe1\x6d\xfd\xe0\xbf\xa5\xa1\x0e\xfe\x5f\xdd\x3b\x3f\x91\x46\x33\x9c\x53\x4a\xbf\xf0\xff\xf8\xf6\x39\xd6\xb7\xcf\xf7\x21\x6a\xac\x03\x15\xe0\xd1\xad\xb3\xa6\xec\x5e\xbd\x7a\x53\x4c\x58\xfd\x14\x61\x6c\x21\x65\xf5\x26\x77\x15\xed\x3b\x6f\x1c\xe5\x22\x51\x5e\x36\x57\x6e\xf1\x92\x89\xa0\xdf\x4f\x88\x2c\x4c\xa9\x26\x29\x66\xb4\x8f\xfa\x66\x9c\x04\xab\x98\x4d\xdb\xaa\x6d\x1a\x69\x12\x19\xbf\x21\x2a\xa8\x24\x9c\xd5\xa3\x81\x72\xb5\x1d\x76\x04\xda\x16\xb1\x71\xb3\xb9\x37\x28\xd2\xa9\x40\x5b\xbb\xf4\x5d\x81\x06\xf0\x92\xcb\xbd\xd9\xbc\xc5\x7b\x2e\xf7\x66\xeb\x76\x61\xd5\x38\x2b\x67\x23\xf1\xf4\x0b\xca\x53\x95\x79\x36\x6f\x01\x12\x0f\x96\x6d\xd4\x6e\x87\x9f\xff\x78\xa8\x79\xca\x42\xbe\x2b\xe3\x71\xc0\x2f\x6d\xdc\x13\xb9\x05\x4f\x18\x90\x4f\xfe\x4b\xb0\x3d\xf9\x29\x42\x93\xc7\xd6\xdf\x56\x3f\x58\x22\xc1\xdd\x0d\x73\xd8\x4f\x1d\x00\x33\x14\xca\x5e\xc0\x5f\xc4\x74\x27\xff\x2f\x27\xf0\x54\x4e\xe0\x29\x4f\xe0\xe9\xdf\x23\x8a\xde\xfc\x07\x12\x80\xcd\x77\x5a\x00\x90\xb0\xce\x9b\x16\xe4\xdc\x7a\x57\x20\x1a\xd8\x4a\xdd\x85\x25\x92\x81\xd3\xff\x44\x32\x70\x96\x20\xc3\xa0\xe7\x74\xa5\x79\xb8\xef\x77\x25\x1f\xf6\xc6\xe2\x8c\xaa\x8c\xaf\x0b\xc4\xa0\x40\xa0\x5f\xc9\xc7\xbc\x41\x2f\xa5\xc7\xc1\xcc\x4e\xd0\x15\xac\x3e\xed\xa3\x07\xa4\x33\xf7\x96\x7c\x06\xa1\xe1\xea\x3b\xb4\x05\x6d\xb3\xda\xa8\x9b\x38\x5d\xf4\xec\xb3\x40\x00\xaf\xb1\x1b\xd4\xfc\xf2\x6e\xb0\x60\x9b\x4c\x5d\x61\xd8\x96\x6b\x74\x4c\xf7\x37\xc6\xe3\x2c\x34\xfc\x68\x4a\x71\x5a\x2c\xe5\x1a\xa0\xfd\x3b\x03\x46\xbc\x44\xfa\x06\x6d\x6d\x78\xf8\xb7\x8e\xf4\x24\x7b\x59\x82\x56\x21\x6e\x57\x9b\x68\xda\xf0\x51\xee\x45\x25\xe0\x28\x78\x0a\x1f\x44\x6d\x27\xb2\xef\x27\xa2\xb6\x1b\xd9\x7d\x08\xed\x47\xf6\x03\xfc\x1c\x44\xf6\x23\xfc\x7c\x88\xec\x43\xf8\xf9\x18\xd9\x53\xc8\x72\x18\xd9\x0d\x08\x1d\x45\x76\x13\x7e\x3e\x45\xf6\x19\x44\x1e\x47\xf6\x37\x08\x9d\x44\xf6\x77\xf8\x39\x8d\xec\xfd\xb9\xa8\x7d\x8e\xec\x73\x48\x3b\x87\x1f\x08\x35\xa0\x05\xf8\xb9\x80\xca\xe0\xe7\x32\xb2\x2f\x21\xad\x19\xd9\xad\x47\x51\xdb\x8b\xec\x36\xfc\x7c\x81\xd6\xff\xac\x5d\x43\x46\x08\x7c\x8d\xec\x18\x7e\xbe\x41\x95\x90\xf1\x7b\xb4\xb0\x03\xec\xec\xce\x60\x30\x1c\x8b\x71\xe0\xa3\x07\x15\x74\x3d\x5e\x7b\x92\x1b\x11\x8f\xbb\x60\x8a\xd3\xbc\xb5\xb0\x77\x80\x5c\xdd\x6b\x8b\x68\x9c\x4a\x0e\xa7\xa5\xa7\xcb\x96\x20\xd9\x18\x66\xdc\x5c\xd8\xbb\x22\xca\xe7\x6b\x4d\x55\xea\xc4\x85\xad\x9e\xcf\xd0\x56\x19\xf6\xc8\x46\x42\x3c\xee\x78\xdd\x7c\xae\x9e\xce\x45\x68\xe1\x27\xed\xec\x0d\xfb\xee\x30\x9f\xde\x57\xe9\x1f\xc5\x24\x4c\x8f\x74\x48\x49\x55\x48\x0a\x0a\x0a\x8e\xd4\x3c\x1c\x76\xe2\xf1\x30\x8c\x44\x3f\x95\x1c\x4d\xed\x17\x9c\x8e\x33\x58\xd4\xaf\xdc\x3c\x1d\xf5\x45\x18\x5c\x0a\xbf\x68\xba\x66\xaa\x2f\x94\xe9\x6a\x24\xa2\x6e\x6e\x65\x1e\x55\x9e\x53\x31\x4a\x25\xc4\x6a\x8c\xa7\x43\x84\xe6\x7c\xed\x63\x35\x96\xf3\x28\xcc\xa7\x4e\x54\xf1\x8b\x4e\xc1\x40\xa6\x2a\xf5\x0a\xce\x82\x71\x50\xd0\xf7\xb9\xca\xb1\xa6\x41\x66\x23\x1e\x0b\xaf\x1b\xf8\x6b\x39\xd8\x69\xf8\xe6\x94\x5c\x8d\x83\xd1\x28\xf0\x97\x81\x9a\xcc\x45\xf2\x97\x54\xd2\x1e\x25\x55\x20\x09\x40\xb8\x97\x9d\xa8\x03\x5d\x30\x0a\x82\xec\x64\x9d\xaa\xc4\xeb\x61\xe4\x63\x86\x82\x55\xdf\x84\x83\xc4\xef\x2c\xf1\x2e\x4a\x1d\xbd\x0a\x7a\xca\xbd\xf2\xd9\xd4\x66\x17\x11\x56\x9d\x71\x22\x1a\xa7\x9b\xf4\x60\x83\x51\x4e\xb4\x93\x16\x3b\x0a\x5b\x12\xde\x0f\x71\x17\xaa\xca\x3d\xcc\x14\x97\x61\x13\xad\xd5\xfc\xd8\xce\x6f\x4e\x4f\x47\xea\xb5\x5d\x13\x3a\x82\x8a\xaf\x19\x9b\xf5\x2e\x4e\x36\x24\x7e\x1b\xdb\x0f\x82\xb9\xcd\x86\x71\xc6\xd6\xa2\xa0\xde\x48\x10\xe2\x6d\x13\xc7\xc9\x26\x19\xd3\x37\x4e\xeb\x5a\x18\x0c\xfb\x62\xb4\x66\x6c\x11\x28\x41\x10\x9c\xf4\x67\xad\x83\x61\x01\x61\xd9\x55\x4a\xd7\x5d\xe4\x64\x57\x44\x66\x6a\xae\x97\x9c\x2b\x95\x65\x49\x7c\xb2\x1b\x39\x0d\x81\xc3\x4c\xd7\x30\xce\xc9\xa3\x4e\x2a\x35\xd9\x78\x33\x18\x08\xba\x73\x89\x3b\xe3\x39\x8d\xb5\xa3\x42\x34\xe2\xa4\x19\x18\x31\xa6\xef\xc7\xa9\xdd\xf7\x21\x4e\xf6\xda\xa7\xd8\x7e\xa1\x9b\x85\xec\x97\x62\x00\x2d\x11\x00\x0d\x23\x8c\x48\xed\x2c\x0c\x63\x2f\x7a\x66\x0b\xb9\x7d\x02\x71\xbc\x2b\xae\xe2\x64\x0f\x5c\xc7\x1a\xe2\xbf\x61\x19\x34\xc1\xf7\xa1\xd3\x83\xaa\x6b\x40\x37\xa0\x83\x37\x6a\x3a\x89\x3a\x23\x53\xf6\x99\xc8\x3d\xc8\x17\x0e\xa3\xb9\x11\x83\x4d\x2e\x2f\x7a\x15\x8c\x55\x46\x82\x24\x3d\x34\x6a\x34\x6e\xbb\x43\x11\xf9\x10\x30\xed\xa0\x4d\x4d\xed\x37\x51\x9e\xc4\xc1\x07\xda\x84\x68\xa0\x0f\xad\x62\xd5\x47\x6c\xf9\x1a\xfd\x56\xac\xee\x00\xe9\x81\x64\x02\x92\x6f\xae\x73\x55\x7c\xd2\x53\x2e\xa0\x0b\xec\x7d\x1f\xe9\x02\xbb\xea\x38\xae\x72\x89\xd8\x46\x52\x81\x1c\x25\x8e\x49\x4c\x6e\x99\x26\xf0\xda\x4c\x10\x50\x71\xb4\x21\xa9\x7d\x65\xf9\xaf\x43\xfb\x6b\xc0\x4e\x4f\x29\xe6\x1f\x4f\xd5\x8a\xbd\x78\x0d\xe0\x5e\x9a\x05\x76\xb5\x62\x59\x85\xc6\x40\x3a\x5c\x21\xd3\x42\x77\x14\xb0\x0d\xd3\x90\x75\xb2\xfe\x78\x53\x01\x0a\x8f\xa9\x9b\x86\x8d\x18\x23\xb1\x22\x88\x0e\x3a\xa4\xf4\xeb\x02\xe7\x29\xb1\x0b\x29\xdf\x55\x6e\xbb\xe5\xf9\xf1\x3f\x5b\xe5\x87\x75\xb7\xbc\x77\x2f\x2d\xf6\x2e\x6e\xad\x82\x2b\xd8\x3b\xa3\x2f\x75\x57\x49\x7d\xb5\xa4\x05\x3b\x75\xdc\x4d\xa9\x94\x49\x7e\x92\x5a\x36\xdf\x5e\xa3\xef\xd4\x75\x20\xd1\x1e\x6c\xaf\x3c\xc7\x8f\xb9\xb5\x70\x65\x05\x98\xf6\xda\xc5\x84\xd7\xae\x25\xfd\x8a\xa3\x37\x4d\xd4\xeb\x97\x02\xda\x44\xb7\x5f\x8d\xc9\xb4\x79\x21\xab\x81\x21\x6d\xb8\xd0\x42\xab\x3c\x87\xdf\x39\x4c\xdb\xba\x03\x71\x30\xd4\xb9\xed\xab\xcf\x07\xbc\x8c\x79\x5a\xe0\xd3\xee\x63\xc7\x7b\x8d\x02\x3f\xf8\x86\x79\x70\xa0\xc8\x06\xc6\xfe\x13\xea\x48\x16\x46\xcf\xc5\x45\x1a\xe8\xd8\x0c\x23\xa9\x5c\xca\xef\x6a\x6a\xa2\xe9\xb1\x07\x7f\xf8\x6c\x6e\x48\x0d\x96\xcc\xa8\x26\x3a\xe8\xe6\x72\x8b\xb2\xeb\x49\xfd\x06\x34\x57\x45\xb2\x88\xae\x2f\x7d\x3e\xf9\xf5\x71\x0d\x6f\x75\x8b\x00\xde\x1e\x49\xfb\xa6\xbe\xe5\x6b\xbd\x3f\xdf\xb9\x11\x63\xbb\x11\xdb\x3e\x70\x9b\x01\xfc\x37\x88\x6f\xeb\xcb\x5f\x38\x07\x1d\xf2\xdd\xbe\xde\x89\x50\xe1\xc3\xb8\x07\x5a\x19\x2f\x7c\x7c\x3a\x81\x8d\xb3\xd2\xa1\x73\x10\x59\x5b\xef\x3d\x7e\x65\x0c\x61\x0f\x8d\xb4\x57\xf9\xf5\x58\x7b\xe7\xa1\xc3\xee\x53\x60\x9b\xfa\x36\xda\xbc\xb1\x65\xac\x83\x8e\xb2\x29\xef\x26\xbf\x38\x9b\xee\x3c\x48\x57\x2b\x3e\xa9\x89\x1b\xc5\x80\xcb\x22\xfe\x1c\xca\xc8\x7c\x68\x95\x55\x8e\x4b\x97\xbc\x81\xfc\x4f\x0b\x73\x54\x66\x07\x5a\xe4\xd3\x97\x3e\x43\x07\x1d\xa7\xd2\x27\x9a\xef\xb5\x7b\xf8\x67\xe0\x90\xd6\x12\x8d\x02\xdd\x9b\x57\xea\xa3\x77\x83\xfa\x88\xa7\xc3\x2b\xef\x97\x46\xec\xe6\x04\x6b\x8e\xb9\xe3\x23\xcb\x9e\xd4\x27\xce\x08\x89\xfb\xc9\x36\xeb\x79\xd5\x4a\x93\x8d\x0d\x7b\xe2\x94\xd0\x49\x42\x10\x49\xfb\xce\xd6\xcd\xe4\x96\x9f\x9e\xf1\x3d\x00\xf6\xea\x08\xe5\x29\xcf\xcf\x2f\xe0\xb0\x97\xda\x74\x13\xa9\x4d\x57\xa9\x91\x61\xdc\xd8\x32\xf5\xe5\xaa\xb5\x1e\x47\x2e\x60\xaf\x38\xfb\xd1\x36\x4c\x4d\x60\x77\xad\x5a\x09\x3e\x5a\x78\xfb\x00\xbf\xa1\xdd\x03\x44\x52\x79\x37\xc0\xa1\x28\xa5\x04\x52\xe6\xe3\x32\x2d\xe0\x7c\x64\xe7\x2b\x54\xc0\xb5\x6f\x62\xf4\xb6\x89\x73\xe3\xb4\xea\xe4\x50\x36\xac\xab\x49\xf6\xeb\x6a\xb1\x02\xc3\x37\x54\x8f\xa1\x14\x6f\x24\x6e\xf6\xd0\x0e\x4a\x9c\x5c\xce\x49\x50\x25\xd0\x75\x9c\x66\xf4\xea\x15\x6a\x5a\xe2\xac\x52\x2f\x3a\xc4\x68\xc1\x22\x7e\x68\xf3\xef\x71\xe9\x5b\x1b\xb9\x50\xfa\xfc\x0e\x9f\x15\xfe\x7c\x09\x9f\xab\x55\x8b\xbc\x75\x42\x03\x6c\x02\xc3\xe8\x43\x3f\xbd\x53\xc8\x9e\x1b\xee\x94\xc7\x6e\x9d\x2f\x0c\x3d\xcb\x4a\xbf\x90\xf7\x94\x3b\x1b\xd7\x39\x23\x47\x62\xe4\xce\x86\x64\xfa\xd2\x64\x3a\xf5\xf0\x4c\x3a\x19\x83\x86\xbd\xfd\x12\x1b\x2d\x94\xdd\x35\x94\x13\x06\xf9\x8d\x8a\xed\x96\x80\x1c\xd3\x96\xc2\x61\xfc\x77\x31\xf0\x9e\xab\x30\x0d\xf9\x9e\xd2\xcc\xa1\x75\x11\xad\xee\x9d\x7a\x26\x7f\xf3\x44\x88\xdc\xdb\x76\x3b\xa2\x16\xc3\x64\xa4\x1c\x6c\x48\xfb\xa5\x07\xed\x05\xb2\xbe\xae\xd4\x83\xf2\xc8\x7f\xbf\xf7\x2e\xa0\xeb\x5c\x5f\xfa\x66\x71\xd5\x71\x81\x3e\xf7\xa4\xb1\x60\x9c\xd4\x89\x9c\x54\x3d\x3a\x53\x78\xf9\x39\x85\xdf\xd8\x05\xe8\x90\x8f\x51\x38\x03\x3f\x90\x9b\x7d\x69\xcb\xf1\x10\xc0\x49\x1b\x06\x3c\xf2\x79\xec\x9c\x76\x7e\xa6\x1e\xe5\x9c\x86\x8e\x77\x23\xd6\xfd\xb6\xb8\x35\x33\xf4\x3b\x14\xfd\x3d\x4c\x47\x5f\xee\xb2\xca\xe4\x77\x69\x7d\xdc\x30\x1d\xf9\xf5\xdc\xf0\xd3\xd5\x42\xd7\x02\x28\x03\xba\xa2\xc9\x69\x46\x3d\xb3\x96\xb1\x91\x13\x46\xc8\x39\x89\xd2\xb1\xb4\x49\x49\xf4\xb5\x9d\x98\x95\x1c\x42\xc4\xbe\x8c\xe0\x65\xf0\xca\x23\x60\x3e\x80\x9a\x93\x66\x0a\x67\xe7\x8e\x87\xc8\x75\xdb\xaf\x25\x95\x9f\xdc\x41\x3e\x72\xc5\x69\x36\x7f\xd4\x73\xd0\x9a\x0c\x39\xff\x54\xce\x26\xcd\xf4\xc7\x2e\xb4\xf6\xf2\x3e\x35\xf0\xeb\x0f\x46\x9f\x7b\xff\x72\x6e\x00\xcc\x6d\x80\x35\x1b\x0e\x06\x1b\xb6\x9d\x7c\x33\x73\xff\x16\xaa\xee\xc4\xfb\xac\x27\x9b\x32\x59\x09\x24\x0e\xfa\x79\x58\x92\x8a\xa2\xe7\xcf\x53\x32\xae\x7a\xed\x7c\x46\x3e\x02\x4d\x9f\x45\x9e\x50\xc6\x2a\xa7\x4d\xf5\x25\x35\x65\x8f\x32\xc6\xdd\xd8\x4e\x0f\x31\x82\xd0\x93\x9b\x89\xc7\x5a\x81\x37\x13\x32\x01\x05\xb0\x04\x43\x90\x43\x49\x8e\x4d\x34\x54\xb9\x9b\xb5\x15\x7a\xf3\xcd\x45\x77\x91\x9f\x51\xbd\x70\x37\x79\xcd\x91\x33\x27\x77\x39\xd5\x9e\x64\x5f\xa4\x8d\x64\xf2\xcb\x89\x2e\x3e\xea\x3d\x67\x29\x9c\xdf\x33\x14\x05\x24\x78\xd6\x29\x8f\x6b\x66\x48\xb9\x8d\x4a\x8c\x5a\xfe\x83\x8d\xac\xa2\x55\x57\x18\x3a\x8a\x8d\x33\xd6\x5d\xd9\x47\x17\xbd\x34\x8b\xe6\x4f\xda\x41\x03\x03\x93\x57\xca\x54\xbc\xb6\x2e\x37\x01\xd4\x89\xdb\xb5\xd8\x5c\x6c\x2c\x6d\x1c\x51\x79\x4b\x0a\xd0\xc8\xfe\x9f\xf1\x30\xe0\xab\x52\x62\x11\xca\x60\x0f\x3a\x04\x1f\x97\x4f\x2e\x81\x82\x90\x89\x83\x7b\x6d\xcc\x47\x7b\x4c\x38\x4f\xbc\x48\xf8\x29\xa7\x0f\x44\x59\xa0\xaf\x79\x24\x46\x7b\x9e\xb0\xcf\xb1\x10\x62\xaf\x40\x01\xa4\x51\x32\x27\x77\x4d\x71\xb1\x34\x38\xd4\xc7\x86\x7d\xb5\x18\x32\xe9\x01\x84\x09\xa1\x57\xde\x45\x4f\x6a\x13\xd5\x7c\xa4\x4f\x7b\x2e\x04\xd1\xf7\x7d\xcb\x01\x32\x63\xe8\x09\x4b\x7a\x38\x94\x14\xdc\x54\x08\x72\x1e\x02\x9b\xec\x49\x67\x6f\x75\x16\xf5\x17\x64\xad\x9d\xc2\x4e\xf2\xf9\xfc\xdc\xea\x30\x2f\x6c\xb3\x4f\x6d\x38\xd4\xa1\xde\x19\xbe\x25\xeb\xa2\x5d\x26\x67\xd6\x2f\x75\xed\x8a\xbd\x0f\x68\x14\x0e\x56\x00\xd9\x87\x3e\x8a\x3d\x81\xb2\x9c\x63\x0a\xc4\x03\xe8\x96\x42\x27\x20\xa2\xa9\xdc\x03\x4e\x64\x02\xdd\xc5\x61\xe8\x80\x13\x02\x45\xd7\x12\xa5\xfb\x96\x20\x3b\x60\x76\x8b\x1e\xc7\xb1\x50\xbb\xa7\xac\x1e\xde\x03\xda\xc4\x73\xca\xfa\x89\x35\xf8\x61\x57\x18\xe6\x8f\xbf\x90\x8f\x59\xda\x22\x69\xeb\xf6\xb2\x40\x3a\x37\x6c\x55\x79\x01\x4e\xe5\x4c\x83\x13\xc3\xae\x48\x33\x42\xb3\x73\x58\x52\xe9\x71\x52\xce\x2f\x20\x72\x58\x99\x08\xb8\x1e\xf4\x7a\xb0\xed\x92\xc7\x03\xb2\x4c\x5f\x73\xd9\x40\x3d\x1a\xca\x36\xb0\x79\x0d\x88\x98\xc3\xe7\x67\xae\xc5\x4e\xa1\x5a\x48\x6a\xb5\x52\x49\xcc\x45\xfa\xda\x3e\x36\x93\xab\x3a\x0b\xda\x14\x42\x9d\x90\x43\x44\x15\x3a\x56\x83\x86\xec\xa2\xb7\xcd\x09\x35\xcf\xce\x20\xcf\x1a\x3a\xc2\xd6\xe5\x08\xdf\x42\x54\x34\x34\x2a\x9b\x76\x82\x19\x1a\xe6\xe8\xea\x98\x62\x3c\x08\x79\xbe\x79\x64\xb4\x0c\x8e\x1f\xdc\xa1\x78\x30\xc9\x73\x5c\x15\x55\x49\x78\x38\xc1\x71\x7d\x67\xf6\x1a\xf0\xdc\x57\x4f\x18\x9e\xcf\xbc\xc5\x35\xc6\x98\xeb\x47\xfe\x30\x9a\xcb\x0c\x6f\xb6\xc8\xa7\xca\x4f\x9d\x48\x5e\x43\x77\x96\x25\x9f\x86\xb0\xf4\x3b\xa3\x42\x10\x93\x27\x2b\x81\xd4\xe7\x37\x4b\x6a\xb8\xf9\xec\x93\x8b\xaa\xcf\x4b\x7b\x18\x1f\x62\x7a\x34\x5c\x96\x7e\x72\x87\xe9\x8d\xa5\xe5\x8f\x7a\x8b\xfa\xe9\x68\x99\x53\x9c\xab\xa9\xba\xfd\x62\x1f\x6f\x86\x09\x26\x6d\x34\x48\x38\x1b\xc4\x79\xa3\x61\x8a\x66\x80\xd6\xee\xdd\xdb\x5a\xd0\x21\x93\xac\x00\xa7\xe4\xcf\x68\xdb\xe3\x83\x38\xc5\xd5\xa2\xbd\x63\x5c\x91\xae\xbf\xac\x73\xee\xa2\x7e\xf1\x93\xd9\x1b\xd2\xe4\x7d\xf3\x96\x2e\xcf\xfd\x5b\x1c\xfc\x59\x27\x6f\xc1\x10\x68\x12\x72\xb7\x7d\x56\xe4\xf3\x0e\x0e\x47\x4a\x1c\x4f\x97\xd6\x7c\xfd\x81\xbc\xbc\xb4\xf3\x85\xc7\xce\xd7\x96\x74\x71\x7c\x5d\x9e\x4d\xf3\x19\x80\xc8\xa2\xda\x83\x61\x3e\x0d\x28\x2d\x4a\xfb\xda\xcc\xa7\x01\x09\x57\xe4\x75\x5c\xd1\x36\x94\xb6\x3b\xc8\xa7\x01\x85\x43\x69\xc7\x19\x23\x57\x23\x89\xb2\xd4\xe2\x1a\xef\xbe\x12\x7d\x26\xc9\x16\x6f\x77\x3a\x25\x5e\x71\x8b\x6f\xd4\x5c\x7a\xb4\x0b\xcb\x6d\x57\x89\x64\x27\xa2\xdc\x93\x66\x66\x84\x43\x79\x3d\x72\xfb\x0f\x79\x2c\xed\x4b\x05\x61\xc3\xaa\xf9\x1d\xd2\x5a\x82\x39\xfa\x2b\x73\xdb\xe4\x2f\xfe\x82\x7d\xf0\xcc\x0b\xad\x7c\x0a\xd5\x11\x36\xa4\x83\x7d\xd1\xae\x30\x6e\x62\x57\xba\xba\xf6\x9d\xfb\x2e\x3a\x58\xb5\x58\xf5\x92\x8c\x66\x5a\x3e\x56\x4e\x26\xf2\x09\x73\x4b\x56\x15\x2d\xd2\xa1\xca\x96\x4e\xb0\x6c\x9c\x0f\x3f\x19\x0e\x4e\x16\xad\xee\x9e\x97\x9f\xed\xa1\xec\x3b\x5a\xff\xfd\x94\x4f\x06\xca\x94\x16\xc3\xdb\xcf\xa7\x01\xa9\x49\x69\xdf\x33\x30\x29\xd8\x7e\x26\xe2\x02\x65\xe8\x12\xe8\x6b\xb6\x8e\x75\xf7\x47\xbe\x1e\xa0\x3b\xb9\x9e\xab\x02\xe8\xcd\xd1\x84\xd2\xe3\x09\xe4\x6f\x2e\x45\x12\x8f\x5d\xda\x2b\xcb\xb0\x14\x8c\x0a\xd3\x07\xf7\x85\x2b\x84\x2e\x8c\xd1\x2d\xc2\xf3\xf3\x28\x86\xa3\x8e\x9d\x38\xa0\x48\x0e\xdd\x32\xd0\xcc\x43\x3c\xba\x77\xf0\xb5\x3b\x07\x6f\xc1\xdb\xe7\xe1\xb2\xb0\xc6\x14\x31\xc6\x1e\xa9\xf2\xc4\x4f\x96\xae\xab\xa9\x18\x2e\x25\xa7\x11\x26\x54\x51\xae\xb6\xe2\x63\x64\x92\x65\x9b\xac\x8c\x92\xe7\x10\x30\x25\xcb\xa1\xbe\x70\x3a\x51\xe9\xc1\x77\x8c\x64\xb6\x9d\xe7\x97\x47\x1e\x79\x3a\x23\x5e\x5b\xd4\xd0\xa6\xcb\xb6\xa7\x33\xd5\x92\x0e\xb0\x74\x0e\xdd\x4e\x28\x93\x9d\xbb\xf2\xaa\xf7\x72\x97\x18\xdf\x48\x1a\x5d\xbe\xdc\x2d\x7f\x6f\x59\x3a\x0d\x02\x25\x5d\xc2\xf1\xea\x91\x22\x46\x94\x71\x55\x64\x1d\x5c\xa0\xd5\x76\x94\xb1\x5a\x1f\xa7\x80\x1f\x1e\x37\xa6\xa5\x27\x4f\x5d\x5b\xd4\x12\xb2\x33\x21\x15\x5c\x4d\x2a\xf8\x7c\x74\x2b\x98\xb0\x32\x92\x29\xc9\x0f\x29\xf9\x94\x0a\x06\xa4\xbc\xe5\x91\x01\x77\x9f\x39\x6b\x9f\xba\x40\x13\xcc\x84\x06\xaf\xf7\x87\x0c\xe4\x77\xe5\x78\x1f\xbb\xf2\x4d\xc3\x63\x97\x4d\x9b\xaa\x2e\x38\x92\x1c\x91\xc1\xed\x1b\x71\x5b\xbb\x91\x01\x5b\xba\x9a\x8c\xb2\xde\x35\x50\x1c\x46\x26\xc5\x35\x84\x96\x1f\x3f\x95\xd8\x81\xcf\xa7\x4d\xa2\xb8\x01\x48\xc3\x7d\xca\x9d\x05\xd2\x20\x01\xd2\x9c\xcf\x11\xbc\x21\x96\x8f\x1c\xa1\x07\x0f\x97\x58\x81\xa2\x00\x93\x47\x5e\x8a\x00\x8c\x49\x38\x51\x57\x0a\x70\xf5\xef\xa5\x9b\x93\xd8\xbe\xa0\x96\x2e\x63\xc3\x1c\x86\xe6\x09\x3e\xa2\xd0\xc3\x4f\x5d\xaf\xfb\x8e\x73\x12\x93\xe5\x72\xc9\x8d\x23\x14\xb3\x41\x76\x7f\x95\x92\xe0\xe7\x32\x06\x7e\x13\xc9\x49\x9c\x6b\xb2\x31\xb8\xe7\x71\x80\x4c\xa7\x5b\x34\x48\xd4\xb5\x23\x63\x9a\x9e\xf4\x53\x85\x6c\x22\x30\x9a\x1e\x3a\xb7\x06\x96\x66\xd9\x73\x7d\x92\x24\xe1\x94\x5a\xc6\xa8\x0d\xc7\xd5\x89\xfd\xdf\x56\xcb\x72\x15\x8f\x04\xab\xa2\x79\x24\x57\xf2\x48\x6e\x11\x8f\xc4\x8b\x79\x05\x89\xe8\x1a\x23\xfd\x84\x74\x8f\x2e\xc5\xd8\xe5\x03\x81\x70\x0d\xdd\x1f\x90\xb6\x89\x76\x53\x48\x0c\x21\x3a\xb7\xbd\x2a\x44\x25\x23\x54\x65\xda\x76\x61\x53\xca\x77\xf8\x63\x69\x0f\x16\x89\xe6\x73\x4b\xd9\x7d\x3e\xea\xa1\xc2\x02\xec\x40\x1f\x8e\x58\x34\x95\x57\x92\x9a\x1c\x48\xd7\x5a\x18\x7d\xd4\x25\x5f\x8a\xe4\x1e\x21\x65\x7f\xf0\x92\x74\x2a\x04\xa3\x0b\x34\xa5\x89\x5f\xbc\x7d\xd5\x67\x89\xdd\xd2\x13\xca\xa8\xd3\xfa\xb1\x1c\x2d\x79\xc5\xc6\x72\x2c\x54\xc8\x80\x25\x41\x9e\xe8\x3b\x7d\xa5\x8e\xce\xe3\x09\xdf\x86\x08\x25\x1e\x90\xea\x0a\xf7\x78\xf7\x48\x8a\xc6\x4f\xa8\xda\x4c\xf2\x04\xa4\x93\xed\x58\x85\x80\x14\x59\xb0\xa8\x2a\xc9\x01\x48\xc0\xc8\x30\x9b\x2e\x6c\x93\xdf\x30\xf2\x7d\x6e\x1a\xf9\xbe\x36\x17\x1a\x59\x18\x79\xba\x7e\x92\xe7\xe6\xf1\xfe\x76\x21\xb9\x0c\xa3\x43\x87\xa9\x0e\xed\x01\xdb\x99\x66\x63\x8c\xda\xae\xcc\x16\xcf\x3a\x0b\x03\x55\x19\xb9\xbe\x08\x23\xd7\x87\xf6\x22\xc7\xa7\x18\x79\x1b\x66\x8d\xbb\x83\x85\x64\x5b\x8c\x1c\xd1\xd0\xc8\x71\xd4\x5d\x30\x22\x34\x32\x34\xcd\x2a\xbc\x7d\x53\x4a\xd7\x20\x08\xf8\x9c\x3c\xeb\x6c\xc9\x97\x9d\x8d\xa9\xfd\x79\x8a\x32\x9e\xc6\x94\xcd\xa6\x02\xff\x2a\x27\xf5\x0d\xf2\x15\xe7\x32\x04\x04\x01\x1e\xbf\xbe\xa3\x16\x03\xa9\x47\xd7\x51\xeb\x84\xae\x03\xbe\x3b\x6a\x25\x11\x8f\x7a\x32\x88\xcb\x6c\xf8\x44\xc8\xf6\xa3\x8f\x0f\x13\xb0\x23\x4d\xd5\x91\xa6\xea\x48\xc3\xec\xc8\x09\xa0\x65\xa3\xe9\x58\x07\xa9\xed\x63\x1d\x84\xc6\x81\x15\x51\xc1\x74\xe3\x5f\x12\xd5\xa2\x76\xa0\x8d\x00\x05\x0e\x90\x4a\xdf\x4a\x5f\x58\xd8\x85\xd0\x3a\xee\x92\xdf\xee\x6b\xe7\x8b\xec\x4a\xbf\x40\xff\x5d\xd2\x1e\xd7\x53\x43\x99\x2b\x7d\x45\xf3\x75\xaa\x72\xe3\xd5\xda\x75\x12\x82\x8d\x1e\x18\x3b\xcb\x48\x09\xec\x96\xa1\x33\x86\x94\x56\x17\x1f\xb1\x00\xad\xd8\x45\x9b\x16\x64\x1e\xba\x6b\xe8\x67\xb2\x85\x46\x92\x57\x87\xea\xae\xab\xeb\x9c\x8c\x49\x68\x1d\xde\xda\x3e\x3e\x36\x1b\x00\x58\x07\x68\x7a\xcd\x6e\x21\xde\x6d\xc3\xb7\x7c\xb0\xdb\x95\x96\xe1\x05\xcc\xc2\x4d\xb7\xdc\x0d\xe6\xb7\x8e\xd6\x15\x17\xc0\x16\xed\xec\x2d\x1f\xf9\xa4\x2b\xb2\x43\x4f\x44\x0c\x93\xae\x48\x0f\x2a\x27\x6a\xcf\x74\x5d\x17\xa0\x6e\x53\x19\x16\x6b\xb9\xce\xf9\x98\x1f\x18\xe8\xb1\xe4\xc6\xe1\x26\xe6\x4f\x68\x28\x2e\x0f\xc5\x35\x87\x32\xcd\x3f\x62\xc0\x65\xe9\x28\x57\xf9\xaa\x5f\xf2\x51\xb0\xb2\xac\x49\x30\x32\x65\x45\x4d\xf4\x70\x4b\xa5\xf8\x0c\xf0\x94\xbf\x00\xee\x95\xa3\x4c\xb4\xb5\xe5\x07\x2c\xd6\x29\xbe\xba\x00\xac\xbe\xba\xea\xc3\x11\x73\x30\x26\x65\xb6\xf2\x97\xe3\x92\x6a\xbf\x26\x50\xc3\xf3\x0c\x13\xb2\x29\x7c\xf9\x87\xc7\x29\xaa\xdc\x7d\x26\x63\xe0\x92\x85\x91\x80\x2b\xc7\x99\x32\x1a\x47\xbe\x8e\x53\xc2\x00\xa5\x14\x37\x08\xec\xcf\x63\xcb\x04\xfa\xac\xac\xf5\x4b\x5a\xc0\x2a\x05\xef\x1e\x59\x6c\x3f\xcc\x79\x8a\x91\x07\xe0\xc1\x34\x18\x8c\x0f\xd9\xe3\x4c\x99\x3d\xcf\x50\x14\x09\x30\x3b\xfd\x51\x2f\x40\xf7\x60\x81\x8f\x67\xa0\xc1\xbb\x7f\x4b\xf6\xa2\xb6\xc7\xf5\x91\x4e\xbf\x2f\x53\x6d\xad\xe7\x9b\x12\x40\x7f\x93\x1b\x71\x99\x68\xf8\xdb\x5f\x89\x86\xb9\x7e\x1a\x0c\x9e\x73\x1c\xb4\xea\xed\x9e\x9c\x1b\x16\xab\x2d\x77\x20\x36\xc0\xc9\x12\xbe\x4f\x43\x3b\xe9\xc4\xe3\x00\x0e\xa1\x42\x80\x0a\xb6\x25\x4a\x28\x7f\xb4\x93\xe8\x9a\xea\x40\x29\xd9\x2d\x59\x3f\x4e\xe8\xf8\xa4\x50\xd2\x40\x6c\xa8\x9e\xb9\xef\xe6\xcc\x19\x1e\xd3\x0e\xbc\xbc\xc7\xb4\x81\x72\xf7\xe3\x21\x46\x83\x19\xfd\xae\x66\xf4\xfb\x5f\xcc\xe8\xf7\xbf\x9a\xd1\xa9\xdc\xfe\x52\x20\xa9\xef\x05\xbc\x1d\xf5\xe5\xaa\x8f\xaf\x9e\xfa\x1a\x1e\xa9\xaf\x97\xdf\x74\x9c\xfa\x38\x9c\xa8\xaf\xe5\xc2\xae\x39\x71\x95\x3f\x95\xd6\x00\x13\x78\x97\x4f\x66\x70\x3f\xe8\x39\x85\x32\x26\x77\x08\xfb\xee\x3b\x50\xd7\xec\x20\x6a\x54\x24\x5e\x25\xfe\xf2\xda\x2f\x90\xd5\xe0\xec\x32\x47\x7d\xb9\xac\x5f\x90\x85\xdc\x0d\xdf\xa7\xe5\x7e\x2f\x7e\x2a\x5a\xda\xfe\x30\x2c\x29\x9f\xa0\x43\x4b\x7a\x6e\xcc\xfa\xff\x32\xfd\x9f\xc0\x2a\xc8\xad\x04\xab\xe0\x26\xb7\x55\x30\xd9\xec\x12\xcd\xf0\xd1\x47\xbf\x1f\x76\x6c\xb5\x86\xc8\xfa\xec\x98\xbd\x53\xef\x61\xe7\x89\x58\x41\x56\x46\x55\x21\xde\x55\x6e\xc6\x87\xc6\x7d\xc6\x1e\x90\x68\xd1\xb0\xb7\x42\xd4\x55\xe2\x82\x6a\xb0\x32\x74\xef\x02\x6f\xac\x35\xac\x61\xb5\xe5\xaf\x44\x9b\x43\x75\xd5\xa6\x9e\x3f\xc8\x81\x48\x48\xbe\x43\x99\xea\xd3\x42\x39\x2f\x0f\xef\x55\xef\xa4\x27\x2e\x5b\xf6\xa4\xae\x01\x53\x7a\x0e\x6b\x68\xed\xf9\xbb\x8e\xcc\x3c\x8a\x13\xf6\xdb\x73\x00\x01\xc7\x43\x42\xc0\xd8\xb2\xf2\x15\xc4\xd3\x9d\xd8\x6d\xfd\x5a\xc0\xdf\x37\x3b\xe4\xa8\x4c\x0c\xbc\x40\x8f\x0b\x40\xfc\xa3\x9c\xe5\xaf\x9e\xfd\x52\xfb\xa0\x3a\xee\x8a\x94\x2b\x8c\xaf\x5e\xe2\x4d\x6c\xc8\xdd\x3a\xe8\x65\xc6\xa4\xf2\xca\x99\x87\x22\xc4\xa8\x6a\x7e\xf0\x44\xdf\x76\x1b\x47\xef\x94\x09\x75\x01\x3d\x81\x73\x03\x29\x72\xf8\xb2\x6c\xa4\xee\xe9\x43\xa8\x5d\xc8\x14\x3f\x0e\x8c\x84\xd4\xbc\xf9\x00\x23\x0a\x44\x87\xd7\xd8\xe1\x22\xd1\x52\x71\x4f\x2e\x95\xa3\xe5\x78\x6c\xc2\x50\x16\xde\x9a\xd2\x5b\x20\xcb\x7a\x62\x91\x45\x3e\x00\x0d\x4a\xbc\x04\x30\x2b\x63\x14\xa8\xa6\x79\xd8\x97\xda\xc6\x5a\xd4\x4e\x39\xf2\xb9\x1b\xa7\x82\x8f\xca\x97\x50\x42\x70\xcd\x12\xd9\xe2\x83\xfe\x24\x47\xbe\x51\x9b\x1e\x48\x8a\x19\x79\xaf\xc0\xb9\x4a\x62\xe0\x20\x87\xff\xcf\xe5\x13\x4e\x01\xed\x70\xc8\x83\xe2\x02\x9a\xb1\xd0\xeb\xd6\x4b\x42\xab\x85\xa7\x4f\xd4\x96\xa8\x55\xf6\xd2\x0c\x3d\x4e\x39\x04\xfb\x70\x89\x57\x2d\x55\x85\xef\x73\xb6\xeb\xf2\x64\x33\x35\x7b\xd1\x5c\x65\x7d\x54\x1b\x00\xd8\x55\x79\xeb\x24\x8c\xa7\x14\x3f\x77\xf3\x05\xe3\xf5\x3d\xf6\x0d\xde\x5c\x8a\x85\x21\x53\x93\xee\x44\x96\x39\xea\x52\xb9\xdc\x16\xce\x9c\xa0\x5b\xab\x04\x42\x93\x49\x07\xea\x8e\xe6\x3a\x31\x1c\x77\x37\xc6\x42\x2e\x59\x07\x81\x6f\x76\x82\x72\x73\x09\xd4\x2f\x2d\x81\x41\x36\xbb\x33\x2d\x4a\x59\x15\x94\xc3\x4d\xfb\x12\x56\xb7\x5b\x8f\xec\xd2\x83\x1a\x4a\xae\x61\xb6\x01\x95\x17\x7b\x56\x51\x9d\xa7\x42\xd6\x02\x00\x9b\x31\x2f\x1c\x64\xad\x65\x4f\x19\xb8\x87\x16\x12\x73\x72\x79\x55\x9b\xe8\x61\x85\xda\x12\xbf\xd2\x16\xad\x5b\x42\xfa\x19\xf0\xee\xcd\x94\x26\x8d\x06\x03\x39\xda\x9b\xdb\xba\x7e\x01\x71\xdf\x2d\xe1\xbc\x99\xc7\x83\x72\x95\xf9\x48\xde\x7c\x7c\xe5\xc0\xda\x6c\xd9\xb7\x68\x98\xca\x28\x40\xa1\xfd\x4e\xe6\x96\x57\xf6\x77\x3e\xae\xb4\x05\x5f\x4f\x47\xc3\xe1\x98\x9e\xaa\x97\x62\xab\xbc\x96\xbc\x1d\x36\xb4\x5f\x1e\xbb\x19\xdb\xf6\x3b\x18\x81\xbb\xc5\x96\x2f\x2e\x1b\xc0\x15\xe0\xd0\x0a\x9f\x51\xcc\xe4\x02\xd4\x2b\xac\x72\x66\x7a\xda\xe0\x77\xeb\x40\xab\xfb\x19\x2b\xf8\x3e\xfa\x3e\x27\x09\x92\x50\x03\x0c\xa5\x81\xad\xae\xa3\xa1\x2a\xa4\x2b\x5f\x98\xaf\x6e\xaa\x65\x57\x2e\x05\xb9\x6f\x09\x49\x0f\x86\xc3\x34\xe3\x78\xc5\x40\x29\xd0\xdf\x40\x79\x38\xb2\x16\xbe\x13\xa0\x96\x1b\x32\x33\xf8\xa0\x52\xee\xa1\x64\x0e\xbd\xb9\xd7\x0b\x56\x7c\x20\xdd\x3d\x49\x09\x67\x95\x25\x4c\x50\xa2\x96\xe8\x2c\x7a\x39\xad\xbd\x64\x9e\xb7\x91\xdc\x11\xc0\x6c\xf1\x39\x42\x58\x60\xd6\x28\x10\x8a\x71\x59\xb9\x9c\xda\x43\x2f\x2e\xab\x5a\xa2\x7a\xc6\xbd\x88\x91\x87\x54\x82\x76\x35\x73\xa7\x53\xbc\x5b\xdb\x35\xd6\xd8\xd8\xcf\xbb\xdd\x8c\x3b\x1d\x38\x4e\x70\x0f\xe3\xdb\x38\x98\x60\x3f\x35\xc1\x33\x85\x32\xad\x7a\xd2\x08\xd9\x55\x15\xc6\xe6\xa6\x95\x57\x22\x3e\xe9\xf9\x52\xb7\xed\x38\x77\x6d\xc0\x0f\x00\xc8\x8e\x73\x1a\x6e\x77\xda\xeb\x63\x54\xa3\xad\xb9\x37\x6d\x0f\x8d\xac\x54\xad\x75\x43\x01\x73\x9e\xed\x9d\x67\x6c\xcd\xba\x4f\xf7\xdc\xec\x7c\x0e\x1d\x39\xa9\x14\x7c\xcf\x5e\xf7\xc9\x81\x12\x23\x8e\xa4\xc2\xbd\x9f\x57\xc8\xf0\xc1\xc8\xc6\x57\x60\xe3\xa9\x58\x61\xd6\xb4\xaf\xe4\xb0\x12\x39\x2b\xf4\xc7\xa5\xc9\x12\x11\xef\xda\x6c\x17\x76\x4c\xa5\x32\x79\xda\xe1\xd6\xcf\xec\x7b\x97\xc6\xe3\xdb\xe2\x66\x97\xc4\x07\x0b\x73\xfd\x74\x65\xfe\x4c\x1f\xef\xf3\xb6\x82\x1d\x26\x82\x1a\x86\x92\x51\xf3\x58\xbb\x67\xcb\xb0\x1a\x8a\x03\xd9\x19\x28\x63\xa7\xfe\x4c\xb2\x19\xfe\xec\xe7\x6c\x86\x3f\xfb\x0b\x36\x43\x7a\x45\x6b\x1e\x17\xc9\x19\x73\x1d\x93\x3d\x90\x7e\xb8\xda\xfa\x50\xcd\x5c\x0c\x69\x5f\xd8\x74\x0d\x84\xec\xed\x51\xfe\xfa\x19\x76\xcf\x01\x4d\x33\x5e\xd8\x7d\x20\x6d\x44\xed\x2d\xac\x23\x9f\x1b\x8e\x51\x74\xc0\x0f\x4d\x49\x66\x5c\x3a\x0d\x95\x3a\x8e\xa7\x3b\x05\xfd\xe0\xd3\xe1\xf9\x99\xb1\x92\x95\x8a\x77\x55\x3c\x6c\x98\x99\xba\x0f\x9d\xb7\xe9\x42\x54\x29\xf0\x72\x14\x1c\xf9\x80\x18\x50\xa7\xb6\xa6\x84\xd4\x25\xb7\x4d\xe6\xb2\x56\xd9\x74\x94\x4f\x62\x8c\x8c\x16\xa3\x9c\x24\x6c\x02\x28\x53\x54\x66\x44\x72\x4d\x92\xa5\x0d\x25\x04\x27\x25\x47\x25\xec\x4e\xe7\x3e\xd1\xb9\xaf\x7e\x21\xf7\x48\xe7\xbe\xcc\xe4\x56\x62\x13\x35\xc2\x07\x42\x05\x38\x4e\xc0\xab\x7a\x57\x11\x61\xb5\x47\x64\x16\x7a\x59\xc3\xa3\x62\x9f\x33\xe2\x3e\xc2\xc3\x2f\xd9\x4a\x32\xc5\xcd\xa4\xb8\xa8\x27\x63\x5c\x83\xe0\x3c\xad\x8f\xd5\xd2\xe8\x38\xb1\xfe\x62\x1a\x12\x1c\xe5\xb4\xc5\xf0\x9c\x55\x56\x92\xe7\xea\xb8\x7d\x52\x9b\x82\x6f\xd7\x13\x90\xc3\x07\x6c\x12\x2b\xd7\x85\x23\x11\x34\x94\x33\x1f\x52\xa3\x6b\x4f\xf2\xd7\xe2\xc2\x92\xe0\x1d\x34\x6a\x1a\xca\x0a\x75\x55\x37\x73\x92\xdc\x9b\xec\xfe\x87\x94\x7d\x2c\xc3\x2f\x16\xb2\x0f\xca\x33\x16\x6c\x73\xed\xe2\xdb\x40\x13\x07\xa9\xb2\x5c\x93\x2c\x01\x18\x4b\x72\x6a\x48\xeb\x37\xa2\x02\x5a\x1f\x46\x26\x7f\xf9\x49\xba\x1e\xe2\x47\x05\xa5\x3b\xe4\x78\x15\x59\xc7\xab\xa8\xe0\x72\x86\x0d\x8f\xca\x4d\x84\xa4\x5e\x39\x6c\x48\xa5\x74\x8f\x0d\xc2\x91\xc3\x38\x9a\x6d\xd2\x34\x12\xa3\x51\x6f\x7e\x3e\x0a\x22\x31\x1e\x46\x70\x7e\xd6\x9e\x5c\x05\x2c\x68\x10\x1c\x0e\x3b\xf3\x71\x3a\x22\x5e\x24\x43\xed\x8c\x4e\xba\xf2\x8a\x79\x13\xd0\x83\xf0\xd6\x2a\xba\x9f\x00\x6a\x11\x88\x3d\x8b\x4e\x68\xf8\x76\xf9\xdb\xb4\x91\xb1\x32\x46\x75\x69\x20\x99\xa5\x8d\x7f\xba\xac\xba\xc2\x57\xbb\xd0\x34\xa6\x78\x0b\xe9\x19\x9b\x40\x67\x02\x90\x53\x2b\xfd\x74\xa2\xec\xf4\x44\xb1\x2b\xa9\xe2\x99\x96\xf7\xa8\x3b\x03\x25\x42\x43\xf7\xd8\xe9\x4b\x9c\x43\x75\x58\xb8\xdb\x74\x55\xa6\x98\xbf\x9a\xc0\x0e\xbd\x44\xe8\x16\x1a\x05\x27\x87\xf3\x91\x2a\xc6\x16\xad\x5c\x93\x0a\x40\xfb\x48\x86\xa5\x2a\x7c\x25\xee\x3b\x77\x77\xf4\x28\x41\xda\x81\x8e\xbb\xa5\x4f\x54\x03\xaa\x7d\x5b\x68\x11\xba\x2a\x49\x2e\xf9\x78\xf6\xec\x51\x67\x68\x61\x86\xd5\x40\xee\x16\x22\xc9\xea\x89\x58\x15\xe8\x35\x29\xf3\xa5\xb7\x19\x28\xf4\x0d\x08\x01\x1e\x77\xd9\x8a\x54\x88\x47\x5e\x0b\x51\x49\x88\x6e\x86\x64\xeb\x27\x46\xeb\xd2\x8a\x10\xba\x8b\x49\xf7\x40\x65\x0a\xd3\x3d\xc0\x36\xd8\x74\x4f\xe2\xce\x88\xf4\xf6\x8d\xd6\x4f\xcd\xd6\x7d\xd9\xba\x7e\x38\xe3\xe1\xc3\x99\xeb\x01\x7a\x4b\xf5\xa4\x46\x74\xfe\xb9\xcb\x27\x35\xc5\x19\x63\x22\xf4\xbc\x85\x06\x6b\x3c\x71\x39\x96\x78\xce\x7c\xe5\xa2\xae\x3b\x75\xd5\xc9\xf2\x1d\x27\xc4\x06\xfb\x87\x21\x2b\x47\x83\x46\xdd\xc2\x0d\x31\xe9\x23\x5b\xea\x3a\x7c\xc5\x5b\xd0\xb5\x93\x9f\x76\xed\x30\xdd\xb5\xd3\x5f\xe9\x9a\xae\xfa\x74\x49\xcf\x5e\xbd\xda\x20\xe3\x56\xdc\xc3\xd9\xc7\x54\x0f\x51\x4d\xcb\x23\xcd\x70\x96\x40\xe4\xab\x0d\x12\x6a\x64\x16\x2b\x71\x16\xd0\x25\x02\xf1\x30\x91\x31\x1c\xb5\x7b\x4f\xcf\x71\x14\x7e\x20\x4c\xb0\x0c\xdd\xca\x02\x37\x63\x42\x9b\xb7\xd6\xad\x73\x12\x2f\x8e\x45\x29\x98\x65\xbd\x96\x53\x4c\xf9\x22\x10\x09\xbd\x2d\x7e\x5e\x6d\xbf\xc5\x75\xa6\x38\xdc\x8f\xc6\xa6\x13\xc9\x41\xaf\x8d\x21\x0b\xd9\x1b\xd7\xba\x95\x0f\x39\x8e\xe3\x9a\xf1\x82\x63\x94\x0a\x0d\x51\x41\x52\x17\x80\xbe\xd7\xcf\x64\xfd\xe6\xab\x8f\x13\xcc\x05\x3d\x47\x3a\x22\x93\xae\xcd\x24\x63\x05\x8b\x73\x42\xc8\x70\x3e\xd2\x58\x0d\x7c\x53\x68\x0e\x4f\x53\x2f\xba\xf3\xe6\x6c\x9a\xfd\x57\xbd\x28\x1e\x41\xba\x94\x33\x8a\x8d\xb5\x23\xbc\x9e\x5d\xc1\xea\xcf\x57\x10\x2a\xc8\x0d\x4e\xf0\xe0\x98\x94\x34\x39\x94\x73\x93\x5e\xae\xd4\xbf\xde\xd1\x0a\xe4\x4e\x7c\x07\x6a\x25\x5f\x4b\xda\x96\x35\xea\x2f\x14\xd8\x9b\x25\x5a\x84\x10\x32\x00\x29\x59\x4f\xb7\x16\x1a\x74\x96\xd8\xa0\xcd\x71\x72\x44\xe4\x29\xf6\x0a\xf9\x61\x97\x8f\xb3\x0c\xf9\xa6\xdc\x34\x02\xea\xf5\xa4\xab\xc6\x55\x46\x5d\xe8\x37\x28\x48\x38\x84\x96\xd2\x0a\xe7\x79\x22\xa2\xeb\xd6\x39\x8e\x61\x26\xb8\x6f\xfd\x56\xfe\xe8\x49\x56\x64\x18\x4b\x31\x02\x6b\x42\x18\x34\x38\x91\x1a\x40\x47\x2b\xba\xce\x00\x19\xad\x24\x81\x1e\x3f\xdd\xd4\x15\xe0\x59\x56\xcb\x18\x16\x9a\xd9\x42\x3c\xfa\xb5\x53\x58\xa6\x09\x7c\x94\xac\xa3\x0e\x03\x49\x65\x18\x0c\x8a\xe7\x81\x68\xcc\x56\x1d\x1f\x6d\x03\x76\x60\x8e\x1f\x0e\xf4\x16\xce\x26\x6b\xe0\x85\xfa\x2e\xaf\x0b\x35\x74\xdf\x85\x58\x43\x97\x5f\x67\xb5\xe4\x80\xc3\x9b\x2e\x4c\x0e\xad\x2e\xd4\x63\x90\x00\x2d\xa4\x00\x58\xb9\xfc\x82\x06\x10\xc0\x49\x88\xa4\x5a\x0b\xa5\x81\xb0\xd9\x03\x24\x2d\x8d\xe7\x7d\xe9\x51\xa2\x41\x88\x19\x6d\x79\x14\x1f\xa6\x34\xe8\x14\xf9\xc3\xc4\x0e\x21\x98\xc4\x40\x1b\x86\x90\x0b\x12\x06\x8f\x76\xa4\xe0\xcb\x4b\x59\x92\x98\xe5\x2f\xce\x66\xec\x4d\x97\x18\x39\x7d\xbd\xf5\xf8\x43\x09\x17\x7f\x68\x89\xf4\x2c\x36\x88\xf9\x03\x4f\x92\xe7\x27\x28\x94\x56\xc5\xe6\xaa\xd8\x3c\x55\x6c\x94\x2f\x36\x42\x19\xc4\xb7\x52\x4b\xf1\x7a\xad\xbf\xe0\xf5\xcc\x8e\x99\xad\xa9\xef\x19\x90\x96\xad\xbf\xe2\x07\x8f\x27\x49\x25\xea\x5b\x77\x79\x16\x6b\x8e\xaf\x80\xa1\xeb\xea\xb7\xb6\x37\x02\xa8\x3a\xba\xf6\xa5\x67\x88\x19\x8f\xfc\x24\x10\x51\x82\x90\x02\xdf\xa9\x9a\xa7\x82\xe6\x04\xa2\x46\x12\x8d\xd0\x23\x06\xf3\x22\xb6\x80\xab\x50\xa5\x70\x3b\x89\x5f\xb8\x72\x04\xc2\xfa\xc0\xcb\xaa\x8e\x29\x91\x3b\x04\xe4\xeb\x31\xd3\xed\xda\x2c\xa3\x5f\x31\x20\xfd\x0a\x7c\x11\xaa\x5e\x66\x21\xea\x82\x39\xf8\x30\x4c\x74\xfc\x1e\xef\xf1\x11\x40\x04\xe4\x77\x10\xc5\xe6\x2b\xa3\xf9\x3e\xaa\xba\x77\x06\x7e\x67\x10\xa6\x12\x66\x53\x00\x4d\x5f\x3d\xb3\x46\xb5\xbd\xe7\xe7\x0b\x24\x41\xdb\x33\x7d\x7b\x1b\xce\xa4\x46\x47\x28\x01\x23\xa7\x4a\x99\x08\x37\x0d\x36\xa5\x05\xab\xb3\x90\x30\xc1\xea\x48\x42\x5e\x73\x1a\x1e\xf0\xd0\xd6\x05\x89\x69\xa4\x72\xd4\x7c\x1f\xfd\xfe\xdb\xd2\xc5\xfd\xe3\x3d\x90\x9a\x01\x3a\xa5\x97\x18\x80\xb6\x3f\x6d\xd1\x1e\x6e\xd1\x00\x76\x3f\xbd\x44\x03\xf6\x07\xb7\x97\x3d\xd0\xb1\x23\x11\x8d\x3b\x5e\x67\x24\x00\x27\xdb\xa4\x4d\x85\x4b\xdc\xb3\x07\xd6\x42\xe9\x66\x02\x79\x14\x22\x98\x3e\x5c\x26\x96\xce\x49\x79\x39\xa3\xd8\x4f\x97\x30\x6a\x56\x55\xc7\xb6\x1b\x4a\x9f\xf0\xbe\xd8\x70\xcc\x84\xdd\xbd\xd7\xf4\xf3\x01\x35\xfd\xc9\x40\x39\x89\xc0\xe3\x65\x91\xee\x38\x2e\xa7\x5c\x2c\xbd\x1c\x78\x47\xbb\x5c\x95\xfc\xf1\x9e\xb4\xba\x8b\x2a\x43\x10\x28\xa8\x6c\xb0\xbc\xb2\xf9\x3e\x66\x98\x68\x95\x1c\xd2\xdf\xb9\x48\x6b\xe8\x4c\x8b\x35\x74\xda\x86\xd8\x4f\x40\xaf\x92\x27\x8f\xe4\xb4\x88\x35\x35\x9e\xb4\xba\xe2\xd5\x5d\xea\x51\x3e\x49\xd2\x10\xb5\x4e\x48\xc5\x10\x80\xbc\xc3\x32\x39\x01\x8d\x92\xeb\x7b\x16\xbf\x90\x44\x19\xbd\x94\x28\x69\xe5\x7c\xbf\x7e\x37\xa3\x4b\x07\xf8\xf1\xf9\x2a\x08\x26\x91\xac\xfb\x00\xd2\xaf\xa2\x86\x20\xe6\xc2\x18\x7c\x57\xdc\x88\x05\xf1\x73\xd7\x90\x96\xbe\x11\x28\x6e\x1d\x8e\x0f\xf5\x80\xf2\xac\x53\x4a\x51\xbe\x82\x96\xb1\x11\x17\xe9\x36\x0a\x03\x46\x21\x60\x82\x26\x4e\x0c\x75\xf9\xf9\xf9\x8e\xee\x45\xb4\xac\xb9\x23\xe5\xf5\x12\x6c\x50\xe5\x98\x46\x4b\x83\xa1\xf5\x69\x85\xf2\x12\xae\x4e\xe7\x95\x97\x8d\x95\x17\xe6\xaa\xed\x9a\x6b\x9b\x2d\x93\xc5\xc3\x6b\xcc\x5e\xd4\x63\xe8\xe8\xeb\xff\x7d\x2a\xff\x73\xf1\xf2\x35\xad\x1d\xa3\x5c\x89\x75\xbc\x9b\xb6\x4f\x94\xa4\x1c\x3b\x71\xd8\x72\xb6\x5c\x9c\x2d\x57\x2b\x5b\xde\xb3\x40\x4c\x87\xd0\x1a\x29\xe0\x81\xcf\xfa\x6e\x57\x38\x3b\xa4\x36\xb9\x51\xad\x7d\xee\x30\xad\x0b\xed\x21\x7b\x21\xf2\x77\x17\x72\x13\xae\x90\x06\x22\xbb\x03\x29\xb0\xa0\xf0\x39\x25\x2d\x21\x97\xbe\xcb\x36\xe9\x1d\x6f\x52\xc3\xe2\xc1\xcc\x48\x97\x46\xab\xd0\xf0\x7a\xda\x76\x7c\x57\x5d\x59\x61\x6e\x3a\x05\x5c\xa3\x0e\x8a\x7d\x5a\x8a\xa9\xf5\x15\x99\x5c\x18\x44\xba\x74\x4b\x40\x3a\x75\xb5\x0c\x3a\xa6\x14\x3a\x0d\x6a\x52\xc3\x3a\x25\x4c\xe8\xcd\xd2\x22\x6c\x97\x0c\x9e\xd2\x0b\xe1\xaf\x01\x7e\xb5\xe0\xeb\x52\xb0\xf6\x92\x28\x7f\x0c\x51\x8a\x8f\xf4\x95\x28\xf7\x3c\x7c\x89\xe0\x96\x0f\xa2\xf4\x7d\x5c\x7f\x96\xa6\x77\x2b\x76\xe6\x28\x25\xcb\xd7\xde\x6d\x22\x82\x4e\xf4\x53\x53\x33\x8f\x05\x92\xb4\xab\x54\x1a\x35\xf2\x9a\x72\x18\x4f\xac\xf5\x60\x12\x99\x76\x4e\x5d\x8d\xdc\x52\x90\x3a\x95\x47\x8e\x64\x69\x03\x1b\x37\x49\xa4\xfd\xec\x66\x59\x82\x7b\xb2\x27\x2d\xaf\x7a\x34\x5b\xd0\xc6\x58\xbc\x85\x30\x77\x2a\x3e\xb7\xae\x9f\xb4\x05\x9a\xbb\x15\x52\x90\x71\xe3\xda\xfc\x3a\x7b\x82\x88\x83\x90\xc9\xd0\x47\x9d\xe0\xc8\x62\x65\x57\x34\x14\x66\xf7\x84\x1b\xf4\xe0\xf3\x1a\xe8\x88\x0e\x3e\xa4\xeb\xf8\xa8\xe7\x10\xf0\x1e\x90\x0e\x9a\x57\x01\x9e\x5a\x86\x65\xf1\x30\xb1\xed\x01\xa7\x5c\x58\x3e\x16\xc8\x3b\xf4\xa4\x8b\x8b\x01\x4c\xfd\xe0\x5d\xaf\x3e\x80\x79\xff\x5e\x6a\xa5\x86\xd5\xbd\x41\x9d\xc2\x5b\xb2\x8b\x0d\x75\x87\x28\xd7\xe8\xe2\x8e\x0a\x69\x3e\x46\x7c\xba\x8e\xec\x98\xe7\xc4\xf0\x6a\x4d\xf3\xa9\xec\x25\xec\x4b\x30\x01\xc2\x07\x7b\x8e\x2a\x79\x0c\x30\xa1\xc3\x28\x1b\x53\x60\x28\xdb\xf2\x17\xc6\x45\xa0\x55\x1f\x21\x38\xb1\xab\xb7\x7a\xac\x15\xbd\x49\x9b\x8e\x1a\x34\x2e\x65\x93\x07\x1c\x72\x82\xed\x17\x68\xf1\x21\xd5\x9c\xa7\x9a\xa3\xb6\x72\x0d\xb9\x38\xc3\x52\xad\x1c\xeb\x9a\xe4\x46\x05\x53\x32\x21\xab\x6f\xdc\x44\x0d\x9d\x0b\x24\xc4\xc6\x94\x3d\x1b\x4f\x2c\xfb\x11\x01\x65\x17\x26\x76\x97\x99\x92\x5d\x98\xdb\x47\x5a\x65\x49\x3e\x72\xda\x54\xa5\x3d\xa5\x87\x82\xf0\xf9\x08\xf0\x4f\xb0\x84\x20\x38\xbd\xd9\x05\xba\x51\x0e\x8c\x2e\x67\x42\x87\x3d\x05\x73\x25\x1b\x55\x8b\xc5\x56\xab\x15\x58\xd7\x4a\xbd\xf7\x0e\x49\x9a\x7a\x4f\x91\x32\x03\x27\xa9\x26\xb8\xe9\xdd\x5a\xf6\xbe\x8e\x41\x97\x50\x14\x47\x97\x80\xab\x4e\x7b\x54\x8a\x21\x68\x0f\xec\x7d\x80\xa1\x30\x31\x0c\x4c\x3e\xc1\x42\xae\xf0\xcc\x19\x95\xaf\xee\x51\xf9\xcb\x9c\x1e\xea\xf8\xa8\xfc\x41\x94\xce\x50\xef\x21\xe9\xb9\xa5\xa6\xf4\x94\x8d\x6f\xa6\x86\x9b\xe2\xfc\x44\x18\x46\x41\x48\xef\x29\xf5\x2e\x7c\x24\xaa\x5b\xd6\x7b\xba\xee\xf2\x0a\x19\x72\x3a\xa5\x19\xfa\x88\xae\xbb\x5f\xdc\xdc\x2e\x94\x0c\x6a\xf4\x13\x33\x59\xa8\x87\xbf\xc7\xa6\x95\xba\x33\x6d\x21\xeb\xa7\xd9\xd1\x16\x4a\x33\xea\xad\x15\xf6\x9d\xd8\xaa\x49\x09\x28\xed\x40\xdc\x3c\xc0\xe2\x9d\xa1\x81\x11\xdf\xe9\x4f\x60\xb0\x73\xe0\xda\x03\x29\x2a\xf3\xb7\x03\xc7\xaf\x95\x50\xaf\xd2\x86\x89\x28\xf7\xef\xca\xa7\xdd\x52\x9a\x05\x64\x5c\x41\x45\xf1\xf6\x20\x9a\x3f\x49\xc8\xa5\x97\x6b\x1f\x86\x74\xc7\xc7\x0a\x1b\xb0\xcf\x16\x01\x10\xc2\x8e\xbb\xb0\xec\xf3\x11\xac\x47\xbb\x8b\xac\x27\xb0\x2d\x33\x08\x20\x0d\xa3\x06\xf7\x62\xe9\xe8\x3c\x58\xe1\x71\x50\x30\xb6\xdc\xd9\x92\x48\x06\x61\x40\x64\x49\x87\xb0\x98\xc5\x76\x5d\x2f\xda\x22\x71\x91\x1b\xdc\xda\x21\x2f\x13\x66\x69\x59\xbe\xd3\x42\x95\x5d\x7a\xcd\x4d\x77\xa9\x7b\x43\xd4\x27\x60\x83\xc9\xe1\x7a\xaf\xb5\x0e\x88\x89\xad\x42\x61\xbc\x7c\x9d\xe2\x73\x4d\x49\x29\x7c\xa4\x44\xb4\xc0\xb6\xcf\x24\x70\xcd\xac\x27\xc8\xd7\x53\x87\x45\x18\x96\xac\xf5\x83\x50\xe0\x0b\x70\xb6\x95\xf4\xbf\xed\xf1\x78\x14\x6f\xd7\x5e\xdb\xe7\x88\x51\x70\xdd\x7c\x6b\x7d\xd0\x5a\xe7\x87\x73\x07\x01\xe1\x19\xce\xfb\xdb\xeb\xd0\x7e\x4c\xac\xf3\xae\xe8\x84\x35\x48\x98\x87\x7f\x67\x8a\xaf\x06\x1d\xa0\x2f\xc6\x6b\x45\xab\x8d\x7d\xfc\x00\xb4\x15\x7a\x32\xcd\xf5\x11\x62\x4f\x42\xb1\xee\xae\x3f\xc0\x28\x24\xc1\xc8\xc3\xaf\x6b\xfb\x4f\xef\xa0\x3b\xc7\x81\x11\xf1\x1e\x22\x3e\x25\xe6\x99\xa0\xe2\x75\xb1\x3e\x0a\xc5\xe2\xaf\xe1\x9d\xbb\x7b\xcd\xe4\xd0\x9a\xdd\xf9\x85\x2d\x42\xbb\x49\x97\x68\x24\x66\xe7\x80\x33\xa7\x37\x03\x36\xfd\x45\xc6\x9b\x38\x5e\x33\x0e\x6f\xa8\xd0\x2e\x84\x19\xb7\x8b\x37\x2a\x7b\xe9\x38\x5c\xf7\x7a\x83\x0d\xbb\x06\xe3\xab\x81\x18\xc5\xed\xe1\x98\x9f\x24\x94\xbf\x5f\x25\x49\xfb\xe6\x7b\x0c\x99\x7e\xd5\x4c\xa7\xd3\x25\x98\x4c\xfb\x22\x92\x34\x1a\xc8\x19\x50\x80\x32\xcd\xfb\x9e\x49\x43\xb2\x49\xa6\x05\x6e\xfd\x45\x3a\xd1\x51\x41\xa3\x50\xf2\x18\x45\xa6\x7e\x36\xba\x72\x21\x5f\xab\xcb\xa4\xb3\x37\x49\xd2\x67\x7c\xd9\x21\xe3\xa3\x61\x12\x7f\x99\x7e\x1d\x22\x73\x34\x8c\x4a\xbf\x74\x82\x99\x8c\x6e\x36\xf1\xcd\xb4\x39\x8b\x7b\xa9\x59\x3c\xe7\x27\x30\x32\x77\xd7\x47\xdd\x62\x33\xf7\x61\x2a\xf7\xde\x24\x1e\x0f\xfb\x97\xc1\xfd\x24\x88\x95\x36\xb7\x2c\x3a\x9e\xaa\x49\x2c\x7e\x21\x2f\xb3\x7d\xf3\x54\xb6\xd1\x24\x6e\x1b\x1d\xfd\xa0\xcb\xc7\xc1\xc0\x37\xc7\xfe\x78\xa5\x13\x0a\x57\xf6\xac\x93\x4e\x37\x57\xf6\x43\x3b\x49\x33\x17\xc8\x3d\xcf\xc4\x1b\x2b\xee\x7f\xcf\xa4\x19\x2b\x7e\xe6\xab\x15\x8f\x8b\x56\xf6\x6b\x33\x29\x7a\xf4\xb3\x69\xb8\xfb\x23\xc9\x98\x01\x81\x9d\x4f\x49\x92\x39\x0d\x47\xdd\x24\xbe\x18\x04\x76\x07\x49\x0e\x63\x66\xbd\xfd\x24\x9a\x97\x5b\x26\x1c\xd7\x4f\xd2\x8b\xfd\x98\x2c\x36\xe4\xbd\x42\x55\x2e\x99\x75\xcf\x33\xe6\x64\x39\x10\x9c\xc1\x22\x2e\x47\x11\xcc\x90\x68\x24\xd1\x4c\x21\x09\x7a\xcf\x63\x37\x53\x48\xc2\x8c\x23\x24\xb1\x97\xce\x47\x08\xa1\x99\x43\x08\x4d\x85\x10\x9a\xc5\x08\xa1\xa9\x10\x42\x33\x8f\x10\x9a\x0a\x21\xbc\x68\x9a\x1b\x18\xfa\x4d\x10\xc2\x91\x30\xe7\xf5\x6c\x32\x01\x09\x47\xc6\x05\xc9\x32\x29\x6c\xa4\x53\x14\xf8\x34\x15\x62\x68\xe6\x10\x43\x53\x21\x86\x66\x1a\x31\x34\x15\x62\x68\x2e\x43\x0c\x4d\x85\x18\x9a\x29\xc4\xd0\x34\x10\x83\x39\x9b\x7b\xa9\xd9\x54\x88\xa1\x69\x20\x06\x33\xf7\x61\x92\x3b\xd9\xb0\x4d\xb5\x61\x9b\xc5\x1b\xb6\xa9\x36\x6c\x33\xbf\x61\x9b\x6a\xc3\x36\xcd\xfd\x95\x9e\xf8\x63\x3d\xb3\x71\xd1\xc4\x9f\x64\x93\xd3\xd3\xfb\xb5\x99\xa4\x66\xa6\x17\x36\xdd\x8b\x66\x7a\xd7\x35\xd5\xae\x6b\x2e\xdb\x75\x4d\xb5\xeb\x9a\xa9\x5d\xd7\x54\xbb\xae\x99\xd9\x75\xcd\x64\xd7\x99\x33\xf9\x68\xce\xa4\xdc\x75\x4d\xb5\xeb\x96\xee\x26\x6d\xbc\x52\xef\xa7\x70\x66\xee\x27\x92\xa6\xda\xf4\x57\xef\x27\x33\x4e\xed\x27\x33\x8e\xf6\x13\x7d\x22\x04\xec\x2a\x89\x22\xc7\x0c\x60\x72\x75\x5a\x7a\x59\x39\x1a\x36\x54\x2a\x9d\x97\x95\xa3\xbe\xa4\xca\xca\x9e\xcb\xb4\xc9\xb4\x28\x91\x56\x9d\xa3\xa7\x66\x06\x73\x59\x39\xf2\xb3\xd1\xae\x5e\x56\x8e\x81\x5d\xa3\x93\x78\x55\x39\x08\xbb\xe6\x85\x4e\xc8\x2e\x2b\x27\x34\x8c\x5a\x69\x59\x39\xd4\x34\xa2\xaf\x95\xd0\x96\x63\xe6\xba\x9b\x71\x6e\xf2\x8e\xcc\xb4\xa2\xc9\x83\x3d\x91\x4a\x37\x27\x0f\xf6\x84\x91\x96\x9f\x9f\x0b\xb3\xf2\xfc\xfc\x7c\x6d\x26\xa9\x99\xf9\x01\xb0\xd7\x49\xe6\xfc\x00\xd4\xeb\xf8\xe2\xe9\x01\xa8\xd7\x39\x8c\xe9\x01\xa8\xd7\xd3\xa3\xf1\x31\xc7\x00\x3e\xd6\x25\x32\x33\xf7\xf2\x67\xc7\x06\x3e\x99\x2d\x8b\x69\xb8\x66\x5f\x75\xc5\x2f\xf0\x6a\x98\xdd\x1b\x4e\x06\x40\x67\x5f\xfe\x72\x81\x30\x1a\x4e\x46\x6b\xf6\x60\xf6\x0b\xc4\x3c\x15\xb8\x1b\x76\x06\x6b\x76\xfe\x65\x97\xdd\x52\xfa\xc5\x9e\xe3\x08\x76\xc9\x78\x12\xda\x5d\x0c\x9e\xc7\x2a\xd8\x53\xc2\x93\x01\x8b\x19\xfc\x02\x43\xf4\x24\x3a\x21\xbb\xb0\x01\xcb\xdd\x6e\xaa\xb7\xca\xf1\x62\x90\x08\x2f\x8f\x83\x39\x19\x8d\x88\x57\xfc\x21\xa9\x5b\xf7\x91\x33\xac\xa1\x2f\xde\xab\x00\x2d\x68\xf5\x66\xa5\x1e\xaa\xc8\x61\x55\xf5\x01\xfb\xa7\x59\x28\x4f\xc4\xc0\xcb\xc5\xb9\x2e\x00\x57\x32\x4a\x49\x3a\xa0\xe8\x42\x0a\x61\x92\x38\x94\x0a\x69\x61\x09\x09\x3f\x46\x96\x3d\x85\xae\xc2\x57\x9c\x15\x0e\x58\x4f\xb2\x1b\x64\x9a\x27\x2b\x6a\xa2\x34\xd4\xf5\x35\x04\x2a\x8f\xce\x6a\x15\xc5\x28\xf6\x3e\xfc\x77\x46\x22\x93\x09\xb9\x49\xdc\x67\xd1\x09\x4f\xd3\x29\x24\x5e\xe2\x00\x60\x5e\xf6\xdf\x3b\x98\x62\xd1\xdd\xee\x25\xbe\x87\x9d\xa0\x00\xe2\x14\xfd\x60\xb3\xb2\x16\x29\x02\x28\xe9\xdc\xee\x7b\x67\x22\xb3\x77\x21\x7b\xf5\x16\x4a\xef\xdf\xda\x2f\x4e\x9d\x5c\xf6\x27\x5d\x5b\x5d\x67\xd4\x1d\xbd\x82\xbe\x5d\xb1\x5a\xd9\x95\x92\xb9\x9c\xb2\x84\xe5\x92\x54\xa5\x6e\xae\x6e\x69\x19\xbf\xb0\x37\x34\xac\x81\x23\x61\x3d\xa1\x77\xed\x51\x69\x00\x21\xfb\xd4\xfe\xa2\xc4\x30\xa7\x56\x22\x75\x79\x7c\xf5\x8a\x62\x68\x3e\xf6\xa5\xd2\xc1\x93\x14\x62\x9f\xbe\x7a\x15\x3e\x3f\xf3\x47\xf7\xf9\xb9\x02\x1f\x30\x9b\x2c\x9d\xc1\x7e\xf4\x85\xfd\x49\xd4\x93\x9c\x15\xfa\xf0\x56\x01\x14\xb7\x4b\x7d\x60\x15\x21\xd9\xa9\x58\x35\xfc\x76\xf1\xbb\x6a\x65\x40\x01\xe5\x00\x04\xb3\xdb\x3d\x96\xc1\xb8\x76\x5f\x8e\xed\x93\xb8\xb5\x05\xfe\xb5\xac\x5a\xaf\xec\x79\x4b\x12\x21\xaa\x7c\x20\x72\x51\x77\x77\xe9\x2a\x16\x5a\x32\x9f\x74\x95\x27\xf3\x50\x38\x3e\x0b\x8e\xb2\xe2\x26\xd9\xaa\xb7\x7e\x28\xec\x64\xc2\xe9\x41\x0e\xb5\xa8\x02\xd4\x56\x45\xca\xa2\x16\xac\xe1\x66\xcc\x18\x34\xf0\x02\x65\x66\xeb\xd8\x8c\x9d\x06\xce\x6c\x33\xc9\x12\xa2\x39\x08\x6e\x46\x05\xa8\x19\x0a\xe0\x68\xce\xd6\xd7\x17\xd8\xce\x36\x2c\x5a\x6d\x17\x16\x8e\x27\xbf\x04\x0b\x59\xb1\xb4\x94\xaa\xf7\x0b\xec\x38\x21\x9c\xbe\x78\x58\xcb\x8a\x9d\x51\x6d\xdf\x50\xd4\xa3\xdb\x37\xc3\x9b\x31\x0e\x99\x3d\x26\x6b\xe1\xba\xc2\x2d\x28\x60\x97\x12\xa9\x57\xaf\xfc\xf7\x2c\x5a\xf2\xad\xc4\x01\xd8\xaf\xf6\x2a\x8d\x05\xff\x4f\x7b\xf5\xee\x3f\xef\x15\x9c\x81\xed\xb5\x25\x1e\x37\x50\xe7\x6f\xbd\xfa\x2b\x52\x1b\xaa\x2b\x9e\xf4\xd7\xec\x7e\x5a\x02\xf2\xe3\x47\x38\xed\x3c\x86\x13\x38\x86\x7f\xfc\x58\xb3\x57\x2b\x66\xea\x43\x5b\xd8\xe3\x89\x8e\x19\x4f\xf0\x84\xeb\x8b\x6e\x20\x39\x26\x27\x17\x23\xf3\x14\x9c\xb5\x9c\x00\x67\xad\xce\xc1\xa7\x34\x07\xe1\x94\x9e\x8f\x4a\xf4\x6d\xd3\x5f\x34\xe9\x61\xe5\x6a\x23\x4a\x82\x23\xbf\xc0\x41\xab\x93\xd1\x34\xfb\x70\x22\xfb\x73\xf3\x70\x7f\x9b\x24\x49\xae\x8e\x48\x6b\x8e\xbc\x34\x4b\xca\xe4\x0b\x11\x01\x11\x02\x5d\x95\x79\x2e\x5a\x98\x87\x5b\x8e\x47\xc0\x3c\x04\xce\xc3\xa4\xfe\x2d\xdd\xc5\xaf\xd8\xc5\xe5\x3c\x22\xf1\x96\x34\xc8\x35\xbb\x91\xcc\x22\x8c\xb3\x41\x95\x34\x92\x71\x2e\xad\x84\x8a\xab\x2e\xac\xd9\xf7\x63\x5d\xcd\xfd\x38\x47\x9f\x72\x14\xd0\xa7\xfc\xd1\x89\x59\xc7\x8d\x43\xbd\xbb\xfa\x0b\xfe\x6a\x8b\xf8\x5a\x44\x03\x20\xe9\x54\xd2\x56\x52\xdb\x65\x20\x62\xe4\x95\x38\x62\x14\x88\x24\x49\x1a\xdc\x91\x49\x8f\x9f\x8c\x2e\xa4\x4d\xf2\xc8\x1c\x9f\x36\x7f\x46\xf2\xcb\x4e\x03\x68\x8f\xf4\x98\x5a\x23\x2c\x27\x7c\x9f\x4d\xf9\x3a\x1c\xfe\x18\x26\x09\x97\xc3\x99\x8c\xbd\xba\x4f\xc5\xc6\x32\xda\xdb\x45\xf1\x1b\x7d\xdb\xf4\x97\xc5\x6f\x9c\x48\x34\x37\xd6\x0c\x04\x25\xc7\x7c\x0d\xea\xb3\x74\xf6\xe1\x7d\x3e\xfb\x09\x5e\x57\xc9\x12\x97\x22\x9b\x7a\x41\x5e\x05\x54\x6f\x5f\x4e\x72\xe9\xda\x92\x1a\xc7\xdf\x2d\xc9\xd0\x09\xd4\x20\x0e\xa2\x6c\x16\x72\x00\xa0\x46\x3e\xca\xa5\x0e\x7b\x2a\xb1\x1f\xd5\x5f\x64\x52\x09\xf4\x39\x6e\x3f\x29\xb9\xdf\x89\xc7\x1d\x40\x2a\x5f\xd0\xe5\xa6\x6a\xf8\x73\x23\xc9\xc0\x3e\x08\x02\x73\x72\xc7\x27\x46\x32\x99\x55\x1f\x07\x3e\x55\xa0\x3a\x6e\x4c\x0e\x7b\x2e\x38\x6f\x49\x07\x70\x32\xc7\x61\x3e\x83\xd1\xc0\x69\x92\x9a\x9b\x94\xbb\xbb\x5c\xa2\x9a\xd2\xb6\x31\x23\x50\x5b\x26\xf5\x34\x2a\x4a\x4d\x2a\x3e\x3a\x4e\xd2\xaf\x86\xd1\x38\x35\x64\xdf\xa8\x9a\x00\x36\x53\xf9\x43\xa3\x38\x3d\xa9\xfe\xc3\x3c\xc9\xd1\x1c\xf8\x41\xd4\x9b\xc3\xd6\xa3\xbc\x12\x18\xd1\xd6\xb9\xcc\x3c\x69\x2c\xcd\x0c\x9d\x32\x73\xc6\x8d\x7a\xe8\xa6\x20\xf7\xe8\xd6\x52\x6b\xdf\x01\x6c\x11\x8d\x53\xbb\x68\xd4\x52\x6b\xc3\x89\xc6\x18\x1f\x2b\x32\x25\x0a\xfa\xc3\x69\x90\x2a\x16\xbc\x29\x48\x53\x05\x47\xa1\x48\xa5\x26\xbb\x33\xde\xcb\x26\xa8\x32\xf7\xba\x0c\x72\x78\x41\x4f\xed\x2b\xcf\x33\xa2\x73\xbb\xee\xd3\x54\x64\x93\x73\x13\xdd\xf3\x96\xe5\x51\x8b\x75\x3c\x4b\x32\x14\xc2\x6f\xe3\x21\xc9\x90\x07\xc0\x59\x2e\x51\x56\x7c\x73\x04\xa7\xbd\x4e\x2b\x82\xb1\x6b\xb3\xff\x79\x10\xed\xfc\x91\xa4\x16\x43\xd1\x57\xb3\x82\x22\x40\xfc\x06\x19\x5e\xe8\x1c\xe6\xa0\x3e\x88\xfa\x30\x0d\x29\x5e\xc0\x02\x13\x33\x6e\xf2\xd3\x73\x08\xf1\x35\xf2\xc6\x6b\xf6\x69\x72\x92\x9d\x4e\xca\xad\x68\xd8\xff\x74\x75\x7e\xe6\x9c\x4d\x20\x98\xc5\xb1\x1c\xc3\x38\x96\xbe\x6d\xfa\xcb\x38\x36\x93\x9d\x57\x9b\x23\x01\xc7\x66\x52\x15\x8e\xe5\xe8\x97\xb9\xc6\xf4\x64\xc8\xf8\xbb\xff\x34\x03\xce\x38\xa7\x00\x12\xce\x64\x61\x24\xcc\x91\x80\x84\xb3\xa9\x88\x84\x39\xae\x9f\x2b\x4a\x38\x98\xe3\xf6\x93\xb4\x0c\x0e\xe6\x78\xc0\xc1\x3a\x43\x0a\x07\x73\x2c\xe0\xe0\x17\x49\x7a\x1a\x88\x65\xc7\x8d\xd9\xcb\x22\x61\x4e\x38\xcc\x67\x30\x5a\x38\x4d\x52\x73\x93\x72\x77\x97\x4b\x54\x53\xda\x36\x66\xc4\x84\x70\x59\x69\x54\x94\x9a\x54\x0c\x48\x58\xa7\x1b\x48\x98\xe3\x7c\xa3\xea\x1c\xe2\xe4\x94\xd9\xc7\x24\xcb\x4f\xb0\x2c\xe7\x99\x34\x32\xf5\x69\xdc\x2a\xd3\xfb\x4b\x2b\xcb\xe4\x8c\xb3\x35\x65\x86\xfd\xb0\x24\x3d\x19\x38\x1c\x0f\x80\xc7\xcd\xdd\x41\x78\x5c\x97\xc2\x5d\x97\x1f\xc1\xf4\xb2\x5e\x90\x43\xd5\x79\x2c\x44\x3a\x39\xd3\xeb\xf3\xcb\x5c\xb2\x2a\x1a\x07\xaa\x68\xbb\xe3\x07\xe9\x6a\x1f\xa7\x66\x9a\x51\x68\x47\x27\x68\xcc\xab\x92\xc2\x28\x49\x31\x4a\x5c\x0f\x64\xf4\x78\x98\xd0\xaf\x12\x7c\x1f\x10\x35\x99\x13\xf2\x73\xd4\x14\x20\x91\x1b\xaf\xd9\x71\x42\x1b\xc7\x63\xb2\x5c\x44\xd4\x2f\x59\x3e\xc5\x18\x3e\x89\x76\xe0\xc0\x81\x40\xdf\x4b\xa2\x74\xbe\x8f\x30\x0c\xa3\x28\xaa\x49\xa4\xe8\x6f\x36\x50\x89\x59\x4c\xe1\x2d\xc6\x8e\xa8\x3a\xbe\x6b\x86\x15\xe6\x57\xef\x7b\xca\x1c\x3b\x3d\x2f\xc0\x01\xcc\x81\x9f\xfa\x38\x31\x39\xac\x47\x88\x39\x9c\xa4\x18\xb8\x3d\x88\xfa\x94\xca\xb4\x0b\x31\xc7\xa9\x98\x1d\x88\x39\x99\xfc\x35\x0b\x49\xdd\xd7\x52\xf5\xab\xa4\xc4\xc9\xa8\x74\x45\x33\x4c\x7f\x59\x6e\x2f\xee\x53\x71\x24\x55\xbf\xd2\xab\x4a\xdc\x0c\xcd\x8b\xba\x27\xe3\xb4\x53\x98\x34\x95\x6b\xe0\xef\x0c\xfc\xfd\x48\xcc\x64\x5a\x73\x3f\x5b\xc1\xc5\x30\xd6\x1c\x55\xba\x9e\xbd\x46\x36\x6f\x71\xbe\xfd\x06\xb2\x61\x66\x47\x7f\xce\x86\x89\x28\x12\xf3\xc6\xd0\x60\x38\xbe\xb5\x7e\x51\x94\x3a\x19\x77\x7a\x71\xd9\x1b\xf6\x47\x22\x0a\x18\x47\xaf\xd9\xed\xd1\x2f\xb2\xdb\xd4\x5a\x63\xb8\x17\x4f\xd3\xec\x7b\x22\x3f\x38\x57\xfa\x82\xf4\x62\x8e\xa4\x07\x69\xe5\x7b\x91\xbc\x57\xab\xbc\x43\x0f\x99\xee\xba\x73\x19\xb0\x3c\x0c\x15\xd2\x0e\x04\x29\xa8\x69\x67\x05\xa4\xc8\x31\x0b\xd1\xb4\x84\x83\x4f\xd2\x02\x32\x0f\x0e\x25\xec\xd0\x08\x47\x01\xea\xcf\x25\xe1\x09\x3f\x22\x69\x3d\x3f\x87\xcf\xcf\x5d\x2b\x70\x26\xc1\x7a\xb0\x3e\x09\xea\xd0\x5a\xb0\x80\x3f\x51\xf0\x77\xc4\x16\x1f\x85\x0f\xdb\xe3\x30\xe8\x11\xcc\xed\x25\x30\xb7\x47\xeb\xc7\x9b\x84\x00\x13\x37\xd8\x45\x14\xb4\x62\x87\x93\xee\x00\x94\xf8\x8b\x94\x58\xd1\x8f\x9a\xda\x79\x1c\xed\xce\x44\xbd\x3e\xeb\x0c\xfc\xe1\xac\xcc\x6d\xbf\x7a\x95\x0a\x96\x7b\x43\x01\xe8\xba\x38\xb6\x1c\x40\xb5\x3f\x49\x4a\x8f\x03\x66\xfb\x17\x73\x9a\x5a\xe1\x98\x5a\x4a\x2c\x48\x54\xf8\x95\x1c\xfc\xc3\x25\x03\xea\x78\x32\x08\x62\x4f\x8c\x02\x7b\x34\x73\xe4\xd7\xfd\xcc\x49\x24\x18\x76\x34\x73\x06\x62\xda\x09\xf1\x3d\x70\xa2\xbc\x1a\xcf\x52\xc6\xbb\x44\xd9\xef\x44\xec\x17\xd1\x31\x94\x4a\xc7\xd9\x5c\xad\x4e\x0f\xb8\x72\x33\xcb\x24\x9b\x65\x16\x74\xc2\xf6\xd8\xcc\x32\xcd\x66\xf1\x86\xbd\x9e\x18\xc1\x22\x18\x99\x66\xd9\x4c\x31\x39\xa3\x4b\x37\xf6\x90\xcb\x34\x8e\x86\xdd\x74\x9e\x79\x51\x9f\xa1\x45\xc0\xc8\x46\xae\xc7\xe2\xe6\xcc\x2c\x3b\xd9\x2c\x53\x26\xaa\x8c\x2c\xbb\xf9\x5a\xc6\x97\xc2\xef\x4c\x52\xb9\xf6\x0a\x72\x69\x37\x94\x66\xc6\xfd\xdc\xa2\x04\xa3\x71\xdb\x31\x8d\xc1\x1c\x64\xb3\x48\x73\xa8\x66\x35\x1f\xb2\x79\x3a\xe3\xa0\x9f\xea\xd1\xc7\xdc\xa2\xb5\x21\xcf\xd5\x48\x78\xa9\x35\x39\x2c\x9e\xee\xfc\x0a\x1f\x15\xcd\xf9\xd5\x78\xde\x4b\x55\xf7\xa9\x60\x1e\xbe\x74\xe2\x8e\x9b\xce\x76\x9c\xcd\xd6\x07\xf0\xef\x0c\xae\x3b\xfe\x38\x35\xcc\x93\x1c\x58\x4d\xa2\x38\xbd\xca\xa7\xb9\x16\x3b\x8f\xa9\xb6\xce\x96\x77\x29\xf1\x9d\x68\x16\x38\xcf\xc3\xf2\x30\xf2\x87\x51\x07\x7a\x68\xe6\xbb\xc8\x4f\x5d\x66\x36\x3e\xe7\x6a\xea\x0d\x69\x4b\x24\x8b\x7d\x99\xcd\x82\x7e\x35\x53\x0b\x79\x95\xcd\x81\x54\xf4\x30\xee\x64\x21\xab\x91\x03\x89\xf8\x60\x80\xc7\x49\x6a\xeb\x34\x73\xc0\x95\x1d\xfe\x97\xe2\xb5\x39\xcc\x41\xc4\x75\xe1\x3c\x75\x06\x80\x82\x53\x03\xf8\x9a\xcd\x27\x72\xbb\xe2\x5b\x1e\xe4\x61\x95\xcc\x1c\xdf\xf3\x93\x8d\x9a\x49\x80\x00\xcd\x5c\x2f\xb3\xb9\xd0\xec\x92\x99\x41\x3c\x64\x32\xa0\x6f\xce\x1c\xd8\xb9\xd9\x5c\x2d\x14\xf4\xee\xc2\xe8\x82\x14\xec\x79\xd9\x7c\xe3\xe0\x61\x9c\x5a\x5e\x3f\x9b\x23\x71\x0e\x9b\x9a\xa3\x20\x9b\x8f\x4f\xbc\x3d\x31\xca\x4e\x55\x2b\xd7\x37\xa0\x29\x3f\x88\x7e\xa7\x37\x37\xb3\x85\xd9\x6c\x84\xd9\xcc\x1c\xed\x6c\x0e\x24\x6b\xcd\x0c\x9d\x6c\x06\x46\x0d\xb9\x3d\x7f\x97\xcd\x87\xf4\x2b\x5e\x28\x0f\x50\x24\x9b\xde\xad\xdd\xe2\x3a\x73\xb8\xbb\x97\xcd\x17\xe5\x50\x6e\x3f\x37\x65\xed\x4e\xcf\x8f\x82\xd4\x6c\x0d\x72\xed\x79\x11\x9c\x4c\x28\xc6\x36\x72\x0d\xb3\xb9\x60\xb3\xc3\x51\x2c\xe4\xdc\x27\xcb\x39\xca\x55\xc7\x34\x3d\x64\x36\xeb\xbb\xcf\x66\x0b\x0b\xb3\x45\xb9\x35\xca\x63\xca\xb8\x68\xb9\xaf\x73\x7b\x71\x5c\x3c\xce\xc6\x70\x94\x3a\xc8\xb3\xb9\x80\xf8\xce\x6e\xa1\x69\x61\xdf\x61\x79\x52\x93\x3f\xcb\xed\x23\x94\xc4\xa4\xb2\x3c\x14\x54\x54\x78\x24\xce\x73\x6b\x9d\x39\xa5\x1f\xb3\x19\xfc\x4e\x9c\x43\x6c\x3b\x45\x7b\x71\xa7\xd7\x09\x53\x6d\xed\x2e\x87\xd5\xd4\x42\xef\x15\x4d\x7b\x0e\xf2\xf7\x0b\x86\x78\x94\xea\xd5\x41\x7e\xff\x7b\xed\x34\xa8\x7f\xc8\xc1\x31\xa2\xd1\xf4\x59\x5e\x9c\x25\x73\xd0\x1d\x16\x00\x67\xd1\x41\x71\x94\x83\x02\x36\x3e\x9c\x3a\xc7\xb3\x79\x26\x23\x24\xad\x53\x67\x78\x6e\xc2\xe1\x28\x89\xd1\x5d\x77\xea\x04\xcf\xad\x5d\xe0\x4e\x70\xf3\x11\x71\x7b\xfa\xe0\xac\xf1\xc1\xba\x66\x9f\xd1\xb7\x8f\xf4\xff\x39\x7c\x6a\x62\x75\xcd\xbe\x80\x60\xdc\x06\xb2\x77\xcd\xfe\x0c\x9f\x48\x78\x10\x44\xae\xd9\x97\x10\x24\xad\x27\xd8\xf6\x63\xe0\x55\x21\xe8\xa1\x19\x65\x54\xc1\xc6\xef\x9e\x88\x63\x34\x43\xbc\x66\x37\xb1\x8e\xc4\x2f\xf8\x17\x08\x76\x58\x36\xb7\x66\x5f\x43\x00\x80\x05\x36\xc3\x9a\xfd\x15\xbe\x7b\x62\x0e\x54\x35\xf0\x7c\xba\x4c\x00\x29\xdf\xb1\x42\x49\xd5\x42\xf0\x25\x35\x3d\xec\x07\x63\xbc\xaa\x13\x73\xcc\x3a\x3e\xc0\x2a\x5c\xf8\x1e\x47\x9d\xfe\x9a\xed\x61\x2c\x21\x38\xd9\x5f\x1f\x22\xa2\x20\x44\xc3\xc8\xd1\x01\xcf\xfa\x9a\x1d\x40\xe4\x2c\x02\xe2\x6c\xcd\x0e\xe1\x93\xbc\xd9\x75\xb8\x9b\x77\x73\x1e\x6e\x03\xba\xb7\x66\x77\x31\x34\xf4\x26\xc0\x50\xf6\xe6\xaa\x6b\x6b\x76\x1f\xbe\xa7\x92\xd1\x1c\xc0\xf7\x48\xf8\xa8\x7a\xb5\x66\x0f\x21\x20\xd7\x16\x92\x46\x10\x42\x14\xdf\x18\xae\xd9\xf7\xdc\x5d\xc3\x51\x7a\x44\x2d\x8f\xf0\xda\x38\x9e\xd3\xa4\xee\xe2\xa6\x80\x72\x63\x4c\x11\x63\xbc\x06\x9e\xc0\xe7\xb0\xd5\x8a\x51\x87\x7f\x0a\xdf\x44\x74\xae\xd9\x9f\xe6\x38\x33\x84\xde\xae\x89\xfb\x59\xb3\x8f\xb1\xd0\x64\xd4\xeb\x78\x02\xc7\x75\x82\x53\x02\x88\x66\xcd\x7e\x71\x8a\x99\xf9\x58\x83\x35\xe7\x7e\x48\x72\x0c\x16\x1e\x13\x89\xc4\x83\x55\x87\xef\xf6\xb8\xdf\x83\x45\xc7\x01\x76\x82\x19\x34\x75\x89\x05\x00\xee\x61\xad\xe1\xeb\x54\x8c\x50\x46\x7a\x04\x93\xde\xc0\x92\x74\x66\xca\x79\x3d\xbb\x82\x45\x4f\x55\x9f\x50\x7b\xb0\xfe\x58\x39\x89\x08\x60\xf9\x31\x97\x98\xc2\xd7\x57\x1a\x08\xa9\x4e\x7d\x83\x4f\x24\x1e\xa0\xcd\xef\xb8\x68\xe4\xf7\x1d\x56\x5d\x4f\xa2\x6c\x86\x57\x46\x3c\x3a\x6b\x30\xeb\xca\xe2\x35\xc0\xc0\x23\x42\xdf\x10\xaf\x5f\xbd\x47\x1c\x3b\x10\x75\xb0\xfc\x8f\xb8\x3a\x0c\xab\xc1\x23\x4d\xab\xc0\x01\x00\xaf\xff\xc8\x80\x2c\xb7\x2b\x40\x02\x44\x68\x02\x6e\xcd\x6e\x43\x30\xe2\xae\x77\xb0\xea\xa0\xd7\x83\xfa\xee\xe0\xb3\x3f\xe9\x8d\x3b\x23\x1c\x47\xf7\x11\x81\x25\x62\xbb\xe2\x00\x22\x98\x2f\xa1\xc8\x00\x4e\x20\x02\xb8\x47\xcc\x3a\xc0\xea\x82\x18\xd8\x45\x08\x0c\xb1\xf3\x12\x0c\x46\x98\x47\x51\x56\x00\x27\x8f\x0c\x7f\x97\x04\x68\x11\x66\x1c\x03\x68\xbb\x13\xaa\x30\x7e\xe4\x39\x02\x18\xa1\xb6\xfa\xc0\x5c\x40\xb6\x09\x04\x34\x59\x05\x80\xa2\xa6\xe2\x42\x60\xf0\xc5\x0c\xc2\x3c\x6b\x0f\x34\xc6\xbd\x64\x4f\xcd\x71\x3c\x44\x6d\xae\xd9\x8f\xb2\x16\x04\xd7\x1d\xcc\xe8\x61\xff\x76\xa9\xe3\xa3\x1e\x70\x31\x7b\x78\xdc\xaf\xd9\x7b\xd8\xa9\x84\xa8\x5a\xb3\xf7\x79\x2a\xf7\x24\x1e\x38\x78\x54\x80\xb1\xa7\xa0\xee\x03\x44\xb9\xbd\x09\x24\x7e\x84\x2f\x1e\xdb\xe1\x23\x2f\xec\x9a\x7d\x84\xa9\x69\x0a\x06\x40\x1c\x57\x6b\xd8\x17\xd8\xb3\x63\xf8\x66\x74\x28\x75\x84\x01\xbe\x69\x79\x90\x42\x59\xb3\x4f\xe1\x3b\xb8\x07\x4e\x1f\xbe\xcf\xb0\x2e\xd8\xef\x03\x1e\xfb\x39\x77\x8d\x49\x69\x80\x70\x04\x07\x40\x36\x00\xe1\x04\x18\x98\xe5\x12\x1b\x0a\xc6\xc2\x83\xef\x2b\x39\x12\xdc\x5a\x38\x5f\x0d\x84\x24\x44\xb2\x3d\x82\xc5\x26\x04\x4f\xce\xaa\x15\x80\xe6\x47\x42\xa3\x8a\x64\x01\x90\x7e\x24\xc0\x97\x34\x07\x00\xb6\x51\x13\x41\xf7\x23\xee\x28\xb9\xe9\xbe\x43\xa0\x1b\xcc\xa1\xbb\x2f\xb9\xd8\x0e\x00\x03\xce\x84\xd8\x51\xe8\x8b\xe7\xc8\x85\x30\x51\xc2\x90\xd5\xdb\x61\x0c\x32\xa6\x47\x64\x3e\x84\x46\x52\x88\x0d\xa0\xbd\x23\x5b\xeb\x91\x8c\xb5\xb5\x83\x1b\x60\x8c\x4d\xbd\x08\x77\x10\xbd\x22\xa9\x00\x30\xcd\xd9\x0c\x24\xd4\xd9\x41\xac\x11\xc9\x41\xdc\x61\x13\xde\x10\xb7\x47\x77\x07\x97\x1d\xfb\xd0\xc3\xca\xda\x01\x24\xf7\xf1\x4b\x9d\xf1\x00\xd2\x10\x14\xbd\x51\x5b\x00\x40\xc3\xe7\x5e\x27\xf2\xb0\xc5\xd1\x8e\xb9\x9a\x00\xd1\x10\x86\x29\x40\x37\xd2\x00\xd0\xdc\x03\xc4\x1f\x31\x16\xa7\xb3\x19\xa0\x79\x87\x61\x81\xb0\xf9\x64\x47\x6e\x23\xc8\x3f\xdd\x91\x60\x1e\x61\xda\xc5\xb0\x43\x88\x75\xb6\x43\x9b\x9f\x86\x7b\x35\x1e\x8e\x00\xb0\x79\x72\x92\xdd\x3c\xdf\xd1\x98\x18\x20\x7b\x47\xa3\xcb\x7d\xc0\xe6\x1c\xb9\x83\x95\x3c\x74\xa0\xba\xdd\x1d\x05\x5e\x00\xdc\x18\x0b\xc0\x8b\x60\x8d\x9f\xa3\x11\x1d\x52\x07\x3b\x12\x10\xf0\xb4\x05\x78\xc6\x69\xc3\x63\x15\x00\x1a\x1b\xe2\xfd\xdf\xe8\x0a\x67\xed\xdf\xc0\x20\xbf\x86\x12\x4d\x19\x80\xd9\xf9\x22\x3f\xe7\xf0\x0f\x20\x85\x42\x0f\x95\x5d\xd8\x02\x50\x76\xa5\x04\xc0\x82\x51\x2b\x25\x42\x84\x16\xc0\x0a\x05\xff\xb9\x02\x80\x42\x5f\xeb\xf0\x75\x84\x59\x37\xe0\xe3\x25\x45\x6d\xac\x7c\x80\x93\xb6\xbd\x72\x01\xc0\x1c\x44\x2b\x47\x68\xec\x1b\x36\x35\x8f\x5d\xf4\x84\xf3\x62\x6d\xe5\x35\xe4\x76\x7b\x98\xbb\x02\x5f\x9f\x76\xe8\xa3\xb2\x52\x85\x80\x47\xd1\x0e\x7c\xf9\xf4\x75\xb3\x7e\x0b\x40\x44\x9f\x3f\x48\x80\xe6\x43\xe2\x38\x9a\x04\x75\x00\x26\x8a\x16\x3d\x98\x14\x7f\x9e\x78\x7e\xb5\x43\x8a\xf7\x87\x01\xdb\xdc\x6d\x03\x3e\x5f\x11\x2b\xbc\x65\x57\x58\x67\x13\x72\x1d\xef\x38\xbf\xad\x74\x7c\x67\xed\x37\xbb\x4d\x05\xb8\x7a\x7b\x05\x30\xda\xca\x34\x88\x3a\x2d\x3c\xb0\x88\x25\x20\x33\xec\xd0\xa5\x0e\xe4\xfb\x6d\x65\x38\xc0\x9c\x00\x56\x87\x3b\x97\x0d\xd9\xa9\x92\x05\xd5\x9c\xe0\x40\xc6\x43\xc8\x78\x47\x15\xce\x44\xc6\x27\xad\xdd\xa5\x0a\x1e\xfa\xbd\x41\x5c\x8b\xa7\x21\x1e\x6a\xe3\x51\xed\xf5\xeb\xd9\x6c\x56\x9e\x6d\x01\xab\x11\xbe\xde\xac\x54\x2a\xaf\x21\x0d\xea\xeb\x19\xb9\x1f\x00\xff\x75\x8b\xf2\x57\xdf\xbe\x7d\xfb\x9a\x52\xd7\xde\xff\x66\x9f\xc2\xa0\xd6\x56\x7e\xb3\xfb\x58\x74\x6d\x85\x88\x1e\x1c\xa3\xd7\x83\x9f\xda\xfe\xe6\x9f\x7b\xfb\xbb\x7f\x1c\x6c\xec\x1c\xfc\xb1\xbf\x51\xad\x7a\xad\x8d\xb7\x7f\xec\xfe\x6b\xe3\xcd\x9b\x37\xbf\xff\xbe\xf5\xfb\x1b\x68\xba\x02\xdd\x26\x16\x18\xda\x1f\x70\x25\x6d\xe6\x30\x20\x62\xc8\x11\x68\x13\x00\x83\x23\x0e\xc6\x91\x97\xea\x98\x14\x77\xc2\xe6\x78\xdd\x09\x5f\x77\x5a\xd1\xf6\x24\xea\x39\xbf\xd9\x2f\xee\x65\x7e\x22\x9d\xa1\xfc\x19\x75\x96\x99\x51\x08\x46\x9c\xac\x9b\x3f\xc7\x64\x18\xd3\x05\xfd\xbe\x7b\xed\x77\xa6\x10\x8a\x71\x6a\xff\x51\xfe\xc7\x3f\xfe\x01\xa8\x12\x26\xfc\x1f\xd8\x67\x7b\x4c\xb1\xd8\xff\x4d\x08\x5d\x72\x7c\x0b\xd0\x26\x7d\xb5\x20\xae\x81\x5f\xd5\xca\xdb\x3f\xaa\xff\x82\x2d\x80\x81\x4d\xfa\x07\xbb\x9a\xca\x6e\x6d\x6d\xc1\x7e\xd8\xe1\x2f\x0a\x5c\x73\xe0\xed\xdb\xbd\x3d\xd8\x08\x18\x78\xb3\x85\xff\x83\x6d\x40\x01\xfa\x07\x3b\x01\x03\x7f\xfc\xf1\x07\x6c\x00\xf9\x45\x81\x29\xd5\xfa\xe7\xdb\xb7\x5b\x02\xf6\xdc\x8c\x43\xad\xb7\xe2\x0f\x17\x70\x02\x85\xfe\x55\xf9\x57\xa5\x05\x7d\x14\xbb\x10\x78\xfb\xf6\xcd\x9b\xb7\x6f\x61\x5b\x70\x00\xbe\x3c\xf9\x45\x81\x39\x95\x78\xeb\xba\x3e\x1e\xb1\x3e\x26\xed\xd1\x3f\xd8\x1c\x18\xd8\xdf\xdb\x7a\x5b\x85\xb1\x3c\x52\xbe\xfd\xfd\x7d\xd8\x1d\x18\x7f\xf0\x01\x56\x1a\x32\x85\x18\xf8\xf0\xe1\xed\x5b\x9c\xac\x36\x07\xf0\x1f\x20\x1b\x2a\x21\x36\xbd\x37\xff\x82\x89\xd9\xe5\xd0\xdb\xb7\x9b\xd8\xeb\x3d\x0e\xf9\x7f\xfa\x7f\x42\x1f\xf6\x39\x14\x88\xb7\x7f\x56\x01\xef\x50\xc8\xfd\x13\xff\x07\x68\x87\x42\xde\xdb\xb7\x55\x1c\x51\x07\x1b\xf0\x3c\x0f\x36\xc2\x2e\xec\x77\xfc\xa4\xd0\x47\xce\xe5\x7b\x7f\xfe\xeb\x77\xc0\x31\x1c\x0a\xde\xfe\x6b\x0b\x6a\x3f\xa2\x90\xbf\xd9\x0a\x5c\xe8\xe2\x27\x0e\xfd\xe1\xbe\xf5\x61\xbe\xba\x58\x9f\xef\xf1\x10\x8f\x39\x29\x10\xd5\xb7\x90\x74\x22\x43\xf4\xba\xec\x1f\x5f\x4e\x4f\xe0\x58\xc0\xdc\x41\x05\xff\x07\x27\x03\x05\x02\x98\xb4\x53\xca\x09\x9f\xc1\xef\x50\xee\x4c\x87\x04\x74\xec\x5c\x87\x30\xe7\x00\xcb\xb4\x70\xa6\x2e\x28\xbe\xd5\x72\xbd\x37\xb0\xa4\x9f\x65\xc8\xaf\x7a\xd0\xe1\x4b\x19\x6a\x55\xb0\x8b\x57\x18\x7a\x89\x18\xac\x41\x5f\x80\x40\x62\x42\x79\x4d\x0c\xfe\x0f\x20\xed\x2f\xfc\xf1\x5b\xbc\x22\xfc\x3e\x50\xf5\x70\x9a\x32\x7a\x29\x4d\xf0\x86\x78\x05\x18\xd9\x11\xd0\x52\x80\x65\xaf\x39\xa7\xda\x4e\x68\x46\xbc\xe3\xd1\x7e\x22\x77\x69\xf1\xeb\xff\xa1\xff\x03\x50\x62\xc6\x57\x93\xd1\x0f\x00\x49\xf5\xf9\x63\x8c\x64\xe2\x0f\x72\x85\xf5\x03\x37\x1e\x40\x28\xa6\xfd\x66\xd1\xfd\x5a\x09\xb0\x3d\xfe\xd3\x57\x0e\x91\xbc\x21\xb1\x56\x9e\x64\x12\x39\x9b\x04\x68\xa6\x52\xa8\xec\xfe\xef\x01\xa5\x24\x82\xac\x48\xcc\x52\x0f\xf9\x4a\xba\x30\x99\xd0\x58\x7a\x91\x58\xfa\x0d\x8e\x7d\xd1\x87\x6d\xae\xba\xb1\x02\x68\x99\x8f\x3d\xe4\x97\x25\x1d\xbd\x3b\x3f\x82\x7e\xfe\x96\xaa\xe0\xdf\xbf\x59\x56\x59\x17\xa2\x2e\xe8\xae\xa7\x94\x18\x4b\x96\xbd\xc2\xe6\x62\x54\xee\x85\xfc\x5c\xc8\x71\xc8\xfe\xe1\x5b\xa4\xc1\x09\x60\x6f\x75\xcd\x5a\xca\x8d\x8b\x0b\xfe\xfb\x61\xcb\x7b\x1d\x7b\x51\x67\x34\x7e\x0f\xe1\x77\xaf\xdb\x70\xde\xd0\x97\x3b\xf4\xe7\xf8\xb1\xf2\x0e\x70\x13\x9d\x25\xa9\x3e\x6b\x54\x47\x28\xad\xb6\xf2\x7b\xa5\x32\x7a\xa8\x4b\x7c\xaa\x82\x0a\xb3\x51\xcd\xb2\x42\x68\x02\x98\x1d\x40\x76\x2e\xcc\xd5\x9a\xb5\xa2\x09\x3d\x38\x91\x3d\x8c\xb2\x2b\x36\x60\x01\xfc\xda\xd8\x00\x0c\x40\x1f\x55\xc4\x7e\x23\x54\x8c\xd6\x41\x0c\x85\x14\x12\x92\x8c\x6b\x53\xc8\x05\xea\xa0\xc3\x5f\x93\xf1\x98\xa8\xd6\x21\xc0\xfc\x86\xe6\xc5\xee\x28\xd1\x6b\x07\x5e\xd7\x1d\x42\x25\xdd\x24\x8c\xb4\x79\x8f\x83\x92\x58\xdf\xe8\x05\x2d\x64\x3d\xd3\x91\x11\xd3\xb5\x23\xaa\x57\xd1\x9a\x2f\xee\x31\x28\x77\x2b\xd0\x5c\x14\x92\x02\x1c\xa0\xbb\x28\x08\xa4\x23\xb0\x8d\x48\xc5\x51\x85\xc4\xe4\x62\xea\x90\x82\x6d\xa8\xb6\x27\xab\xe6\x08\x20\x76\x1f\xf1\x2a\x1d\x98\xc3\x7b\x19\x33\x45\x62\x7f\x8c\xb5\x75\x06\xc0\x82\x6d\xd0\x18\x22\x4a\xec\x0b\x18\x7b\x4c\x9f\x40\x4d\x42\x2b\x13\xcc\x06\x2c\xbe\xca\x36\xa6\xb4\x68\x0c\xd5\x4d\xe8\x33\xe1\xfa\xa7\x14\x96\xe4\xeb\x2c\x09\x6c\x48\xee\xee\xc1\x88\x02\x58\x0a\x43\xbe\x2e\x9e\x1b\xd1\x4c\xbc\x3f\x52\x0c\x6c\x27\x35\xa1\x3b\x32\x02\xed\xdd\x47\x7d\x24\x16\x00\x15\x53\xdc\x14\x75\x3d\x3c\x1c\xdc\x1e\x85\x67\x81\xdb\xed\x8c\x37\x60\x4a\x22\xd9\xb3\xda\x60\x38\x40\x6a\x68\x1f\xd3\xcb\xe5\xd7\xf0\x7f\x12\x90\xc4\xaf\x91\x4a\xde\xc0\x3b\x68\xc0\xd6\xb9\x44\xfe\x81\x41\xc1\xf8\xcb\xaf\x85\x8b\xe8\xc8\x1b\xff\x90\xb2\x95\x19\xc5\x7a\x92\x70\x7e\xa0\x10\xf0\x99\x9d\x11\x8e\xf3\x03\x55\xf6\x5a\xbe\x13\x9a\x53\x22\xb2\x67\x30\x30\xfa\x66\xee\xe5\x23\xe7\xc2\x80\xec\xc4\x8b\x1d\x4a\x66\xe2\xfd\x90\x93\x55\x37\x76\x29\x09\xe8\x1e\x99\x77\x8f\xc2\x3c\x5d\x47\x94\xd5\x60\xec\x80\x92\xfa\x44\x71\x61\x07\x4e\x9b\x63\xfe\x44\x9e\x0b\xf1\x08\x6a\x94\xc1\xb9\x90\x8e\x1c\x03\xe7\x78\x9a\x8e\x7a\x80\x43\xec\x2c\x13\x05\xc7\xcb\x79\x3a\x6a\x0e\xb9\x2e\x32\x51\x90\xeb\x33\x45\xdd\xa1\x14\x82\xbe\x7a\x2e\xf4\xf9\x8a\x3e\x95\x50\xa4\x41\x21\xc2\x00\x70\x0a\x50\x60\x4c\xfc\xfd\x17\xfc\x7e\xcd\xb8\x5c\x12\x4b\x62\xd4\x89\x13\x04\x0f\x27\x00\x65\x79\x0f\x18\x9e\x3e\x3c\xe0\xcd\x71\x22\x51\x83\x0d\xf1\xfe\xfe\xae\x8a\x1c\x0f\x87\xc8\xf2\x97\xbd\x18\xba\x72\x00\xd1\x40\x47\xc3\x61\x80\xa5\x90\xa2\x7e\xb3\x02\x04\xca\x07\x8c\xfe\x1f\x38\x06\x28\x16\x29\xa7\x03\xc8\xf3\x12\x43\xd5\x32\x9c\xf9\x62\x80\x5f\x50\xed\x47\xc8\x08\x68\x03\xb2\xba\x14\xb5\x39\x1a\xaf\x20\xef\x1f\xaf\x9c\x01\x5a\xbf\x84\x0d\x08\xfb\xe5\x10\x33\xfd\x8e\x98\xe5\x08\xbf\x02\x3c\x92\x3f\xe1\x17\x46\x79\x54\x6e\xf4\xb0\x12\x0f\xd1\x88\x54\x67\xd0\x1a\xf2\x12\xbe\x38\x86\x2c\x90\xd3\xc7\x0c\x9b\x8c\x99\x4e\x30\x0a\x00\xfd\x14\x7e\xa1\x9b\x01\x26\xbd\xd9\xac\xac\x03\x06\xa3\xcf\xb7\xe5\xb7\x6f\xa1\x2f\x21\x06\x7e\x2f\x03\xc1\xd0\xa6\x2f\xec\x5f\x87\xbe\x36\x21\xee\x8e\xbe\xb6\x60\x95\xba\xfc\xb5\x59\x86\xc1\xf5\xf8\x7b\xab\x5c\xfd\xb3\x0c\x47\xf5\x19\xb4\x00\xe7\xf7\x39\xfc\x00\xad\xd2\xc7\x44\x24\xbe\xfe\x05\x39\x07\x18\x78\x8b\x65\x86\xf4\x85\xb5\x5f\x40\xbe\x1a\x9c\x80\x23\x8c\xa9\x01\x30\x7d\xc6\x88\x3e\x7c\xdc\x53\xcc\x33\x20\x13\xfc\xa8\xd3\x55\x45\x6d\x45\x52\x8c\x75\x16\x57\xd4\x2a\x75\x14\x10\x6f\xd0\xca\xd7\x00\xd9\x50\x56\x8a\xe2\x9b\x54\x88\x1b\x53\x5c\xfb\xff\x23\xee\xcd\xbf\xd3\xd8\x91\x06\xd0\xdf\xfd\x57\x38\xf7\xf3\xf3\xa5\xe3\x86\x80\x93\xdc\xb9\x81\x74\x7c\xd8\x8c\x31\x78\xdf\xc3\x78\x72\xd4\x0b\x8b\x59\xcd\x66\x70\xec\xff\xfd\xd5\x22\xa9\xd5\x0d\x4e\xee\x37\xef\x3b\xe7\xcd\x9d\x18\xa9\x54\x52\x6b\x2d\x55\x95\x4a\x25\x15\x9d\x51\x14\xc9\x56\xb3\x37\x7c\x4a\x2e\x01\x34\x27\xd0\x04\x44\x48\xa0\x53\xc2\xeb\x4c\x11\xf8\x44\x40\xec\x51\xa0\xa1\x30\xfe\xfc\xdc\x3e\xac\x4f\x82\xf3\x2e\x03\x0b\x12\x63\x5f\xa1\xfe\xe7\x50\x6d\xb9\xa7\xc0\xe4\xa4\x08\xee\x34\x30\x35\x29\x4c\xdb\x18\x4c\x4d\x8e\xe0\x86\x03\x73\x93\x22\xbd\x0e\x04\x9f\xa9\x98\x0f\x2c\xfc\x40\x3c\x8f\x71\x73\x2f\x84\x69\x4a\xd8\x93\x91\x18\xe0\x54\xa5\xc8\x14\x8b\x2c\x70\xd6\x69\x1b\xc2\x1b\x45\x19\x19\xc3\xc6\x06\x53\x17\x62\x7f\x7e\xdd\x03\xa1\x66\x53\xb2\x48\x38\x0b\xd3\x7f\xec\xc1\x6e\x57\xa6\x34\xac\xef\x26\x77\xa5\x14\x05\x40\x26\xe1\xb8\x92\x44\xd2\x20\x1d\xec\x53\xb1\x72\x2b\x81\xef\x54\x28\xb3\xda\x87\x69\x1d\xe5\x41\x30\x0c\x05\x87\x83\x08\xc2\x38\x40\xa6\x0b\x6a\x10\x22\x54\x09\x21\xe8\xbb\x20\x63\xe2\x4a\x25\x19\xbb\x27\x85\xc0\x0f\x8b\xe4\xa4\x3d\xf4\xba\x4f\x20\x4c\x26\x9b\x28\xe1\x4a\xc1\xe7\x4f\xfb\x0e\x1b\x2e\x3b\xf3\x90\xca\xc0\xce\x94\x72\xdb\x1c\x04\xf8\xf1\x20\x3b\x01\x52\xdf\x17\x93\x64\xbf\xe3\x8d\x87\x93\x61\x73\x0a\x7b\x62\x3f\x3b\xef\xf7\x50\xc0\xa9\xc5\x32\xbd\x2d\xe6\x91\x0e\x14\x04\x4d\x9d\x81\xd8\x06\xc5\x8f\x6c\x7e\xa5\x4d\xe6\x5b\x85\x68\xca\x66\x84\x95\xd9\xcc\x9f\x56\x61\x10\x28\x9d\x50\x79\x10\x65\x43\x71\x4a\x7d\x78\x10\x73\xc1\xd0\x5f\xca\x74\x0f\x13\xa0\x56\x7f\x7c\x8b\x71\x45\xbf\x29\xf0\x9b\xc9\x79\xa1\xc8\xbc\xca\xdf\xd9\x9b\xff\xfe\x33\x83\x3f\x3f\x47\xf2\x62\x6e\x76\xb3\xf1\xef\x3f\x41\x6e\x3c\xa2\xe6\x76\x48\xdd\x64\x48\x8f\x04\x95\xb2\x39\xcb\xf1\x27\x04\x1a\xe1\x55\x1c\x2d\xa4\x9e\xae\xc0\x68\xf4\xe6\x02\x86\x3e\x94\x3d\xcf\x56\xb0\xfa\xc3\x79\x27\x30\x30\xce\x09\xe3\xd7\x8d\xfc\xd3\xbe\x60\x2c\x58\x11\xaa\xa2\x4c\x23\xfe\xb4\xbf\xe3\x2c\x21\xd8\xb7\xcd\xf9\xbf\xff\x9d\x7d\xbf\xf9\x73\xd3\x0d\xda\x62\xde\x81\x64\xe0\xd3\x13\xa6\x10\x63\xe5\x5e\x61\x5d\x11\x32\x50\x6a\xcc\x49\xeb\xea\x92\xe6\x3c\x2d\x2b\x51\x74\xfe\xc4\x6a\xb9\x45\xe7\x8f\x3c\xac\xf5\x2b\x4c\xca\xf3\x7b\xca\xb0\x3d\x5e\x73\x14\x64\x01\x90\x6e\xc7\x9b\xe3\x60\x84\xa7\xe8\x52\x27\xb8\x39\x6c\x6e\x4e\xdb\x01\x3f\xb9\xdc\x19\x50\x58\x65\x0c\xb0\xbc\x4b\x58\xda\x54\x80\xe4\x0a\xf0\x1e\xfe\xe4\x68\xe8\x07\xb0\xc9\xdd\x52\x02\xb1\x93\xb7\xb0\xd3\x50\xcc\xf7\x51\xed\xd1\xe1\x79\x07\x1b\x0d\x01\x7b\x3d\xfe\x00\x2b\x5c\x26\xea\xa3\x13\x1a\xc4\x00\x95\x6e\xfa\xa9\x3b\x33\x89\xf2\xf0\x46\xb9\xb1\xa5\x0b\x22\xdd\xcd\x6f\x33\x34\xb1\xf2\xb8\xe8\xed\x16\x85\x3a\xc8\x37\x89\x21\x14\x52\x80\xdd\x03\x40\x85\x7c\xb1\x56\x39\x3f\xb9\x3a\x06\xf9\xd8\x25\xf8\x49\xe9\x0e\xb6\x13\x4c\xc2\x09\x61\x7b\x04\xec\x00\xa7\x43\x6c\x30\xc0\x41\x78\xee\xe2\x4f\xb9\x8e\xa2\x25\x86\x4e\xea\x57\x47\xc7\xb0\x95\x21\x2a\x47\x7e\x54\x8f\x4b\x65\xe8\x8d\x3e\x25\x1f\x01\xf7\x42\x81\xab\xe3\xcb\xf3\x6a\xf9\x02\x3a\x95\x50\xf1\xcd\x3b\xf4\x2b\x45\x11\xec\xee\xcd\xa1\xd2\x19\xb7\x08\x26\xb9\xad\x36\x45\x80\xf0\x74\xa1\x66\x3a\x8c\x3d\x1c\x2c\x60\x62\xf9\x9b\x11\x15\xf7\x03\x63\x10\x03\xda\xa5\x30\x6b\xa9\x4b\x45\x0a\x62\xd7\x03\x67\x40\x91\x3e\x48\x4b\xf8\xcc\xa8\xd2\x98\x49\x1a\x88\x0c\x3d\x67\x1c\x4c\xa6\x3f\xa1\x15\x1c\x19\x2d\x93\xa7\x62\x22\x9f\x4e\x85\x51\xf4\x03\xac\x02\x4c\xec\x83\xcb\xa3\xfa\xe6\x48\xe0\xf9\xc3\x80\x50\x67\x63\x3c\xc6\xc0\x1d\x73\x88\xf1\xd2\xc9\xd1\xd1\x10\x18\xd4\x0b\x3a\x76\x86\x6d\x94\x80\x38\x4a\xfc\x0a\x96\x9a\x11\x30\xdb\x1e\x75\x12\x8d\xac\x7c\xab\x7a\x53\x4c\x37\x81\x27\x02\xc0\xf4\xc9\xc4\xde\xd8\x2f\x4a\x6c\x92\x71\x37\x3b\x11\xf5\x1a\x6c\xca\x54\x9a\xdb\x93\x7d\x37\xa1\x28\xc8\x74\x9d\x41\xeb\xc7\x3e\x12\x0f\x90\x93\xa7\x08\x2c\x0b\xaf\xcd\x2b\x7b\x22\x8b\x87\x0d\x66\x89\x13\xab\x09\x35\x1e\x3e\xc1\x06\xe0\x2e\x37\xa1\xb3\x36\x87\x63\xaa\x43\xd8\xe3\xba\x3a\x2a\xe3\x80\xec\xdf\xa1\xed\x33\x2a\x59\xf1\xc8\x15\xa8\x2a\xe9\x8c\xe7\x04\x1e\xf8\x97\x43\x8a\x3e\x51\x14\xad\x60\x37\x9f\xda\x1d\x68\x04\x12\x43\xa8\xe0\xa6\xa4\x2c\xb0\x99\x13\xc6\x62\x34\x84\x09\x42\x73\x1b\x3a\xad\x78\x71\x0d\xfb\xfa\x9a\x04\x1c\x0b\xd8\xaa\x21\xe5\xcf\x7d\xba\x41\xb7\xd9\x0a\x86\x30\x56\x58\x22\x50\x87\x3c\x66\xd9\xef\x8c\xa9\x6f\xb9\x9d\xea\x75\xc9\xa8\x3e\x14\xf6\xec\xf5\xa8\x6a\x48\x50\x07\x6d\x63\x77\x60\x60\x13\x67\x21\x9e\xe1\xc1\xa0\x14\x31\x5f\xe5\xba\xfa\x3d\x7f\x5e\x84\xda\x97\x38\xda\x79\xc6\xd1\xa9\xe0\x59\x0b\xe0\x94\x09\xa8\x2b\xd6\xe4\x9a\x36\xa1\x34\xa1\xa8\xc4\x48\x2a\xd0\xf7\x09\x75\xcd\x06\x06\xc3\x5f\x09\xd3\x7e\xc4\xd2\x0e\x28\x89\x05\x92\x2a\x86\x0f\xca\x79\x58\xe3\x87\x14\x3c\x00\xde\x6d\xf3\x08\xfe\xb7\xe9\xfb\xb6\xd4\x75\xd7\x74\x4a\x16\x59\xe7\xba\x19\x4d\x5d\x5c\xc0\xa2\x3d\x22\x10\xf5\xef\x31\x05\x91\x3f\xab\xc2\xb7\x4e\x74\xec\x04\x4f\x86\x4f\x31\x5a\xe5\xd3\xcf\x33\x0c\x1f\xea\x1d\x81\x56\x0d\xf0\x61\x04\x9d\xb0\xfd\xe7\x26\x99\x9b\xa3\x4a\x1d\x16\xd4\xff\x00\x5f\x86\x89\x75\xe8\xb9\x03\x98\x31\xf5\x2a\x10\x79\x02\xe0\xec\x97\x23\x14\x55\x64\x07\x83\xe1\xac\xd5\x8e\x92\xd6\x44\xbf\x33\x99\xd0\x90\xdb\x55\x2c\x85\x64\xb1\x43\x19\x82\x6a\x5d\x61\x91\x47\x90\x7a\x4d\x81\xf2\xe5\xf9\x09\x34\xb0\x06\x08\xd0\x29\xd0\x78\x0e\x98\xdd\x73\x43\x88\x8a\x0e\xde\x52\x0c\xd7\x74\x89\x24\xf3\x3b\x1d\xbf\x82\xfe\x3e\x82\xec\xc7\xfc\x80\x3f\xd0\x7e\x4c\x92\x31\x5e\xa5\xa3\x31\xec\xa4\x3e\xa9\xbf\xb7\x30\xf1\xa4\x06\x34\x79\x84\x81\x41\x8f\x17\x99\xd1\x96\xcd\xa7\xce\xb4\xbd\x09\x74\x23\xd8\xfc\x53\xca\x36\x7f\x6e\xa2\x1f\x5a\xb9\x63\xc0\xa4\x12\xbc\x42\x61\x3e\xb8\x54\x0a\x6c\x04\x40\xee\x3c\x0c\x9f\x9e\x9f\x5c\x57\x8f\x8b\x48\x72\x7d\x8a\x93\x20\x7a\x0c\xf5\x3b\x85\xbd\xdc\x0e\x08\xd6\x9b\xb5\x70\x14\x9b\x14\x19\x07\xb0\xff\xce\x26\xb2\xf2\x2d\x13\x86\xf4\xac\xcd\x80\x21\xf4\x2f\x6c\x91\x44\x05\x80\x6a\x82\x70\x33\x27\x62\xd8\x99\x82\x08\x8e\xfa\x4e\x42\x9b\xb9\xbd\xce\xa4\x8d\x70\x10\xd2\x25\x81\x7c\xc0\x94\xb3\x99\xf0\xc7\xaa\x2f\xbb\x08\x39\x2f\x57\xaa\x27\x78\x2a\x7d\x02\x75\x3b\x3f\xb9\x81\x59\xc4\x01\xb5\x93\xf4\x08\x8b\x8f\xf4\x39\x48\xb7\xa3\x61\xd5\xf4\xc5\x28\x9c\x11\xc1\xa2\x33\xc1\x05\x36\x20\x1c\x64\x8e\x25\xed\x1b\x22\xe0\xe2\x0a\x88\x2f\x07\x0a\xfa\x8b\x67\x45\x8a\x5f\xde\x9d\x96\x61\x66\x62\xc4\x23\xc1\x12\x88\x31\xa1\x2a\x32\x34\x96\x31\x22\xe1\x13\x8a\xa0\xa8\x1e\xfb\x36\xb3\x0f\x30\x2a\xa4\x0c\x80\x9a\x4c\x19\x53\x72\xca\x7c\x16\x04\xb4\x31\x02\x25\x60\x2a\x1a\x05\x42\xf9\x5b\x1c\x28\xfe\x69\x84\x07\x48\xbf\xc6\x02\x49\x6f\xf1\xfb\xb2\x40\x10\x5c\x12\x16\x39\x9f\xc9\xf3\x69\xe1\x73\x08\xa9\x8c\xc5\xa8\xdd\xf1\x60\x81\x62\x1f\xf1\xd1\x66\x9e\x92\x31\x4c\x14\x10\xb6\x4f\x49\xb7\x34\x59\xdd\x05\xa2\x53\xd0\x58\x92\xe6\x17\x0d\x80\x2c\xe9\x12\x0a\xbd\x04\xdc\xab\xa2\x3a\x00\x2f\x21\xd2\x25\x72\x62\x72\x51\x23\x4b\x13\xf6\x36\x79\x32\x61\xa6\x67\x36\x1a\xd1\xfd\x26\x5e\x37\x4d\xba\xc1\x95\xda\xbc\x08\x02\xad\x4b\xe5\x9d\x0a\xe9\x6b\x88\xcc\x78\xb8\x8d\x96\xd5\x97\x22\x0c\xb8\xda\x4d\x99\x35\x58\x06\x38\xad\xf6\x09\x93\x0d\xcb\x31\x01\x84\x18\x26\xdb\x2b\x9b\xd6\x35\xb6\x63\x08\xdb\x1e\xe5\x40\xc6\x02\x15\x42\x48\xd5\x18\xa0\x66\x7f\x15\xa3\x57\x40\x01\x0e\x29\x00\xb4\xf5\x06\x72\x5e\xc1\xbc\xbc\xa5\xdf\x24\x90\x25\x4a\xb9\xdc\x4f\xfe\x0d\x94\x89\xc2\x64\xf8\x80\xeb\x6a\x12\x4c\x37\xd9\x66\x62\xd3\x53\xdc\x0c\x9a\x91\x30\x16\x70\x47\xa4\xa8\x8b\xee\x6c\x48\x69\xe9\x17\x68\xed\x31\x23\x76\x07\x40\xc5\x60\xc6\x8a\x01\x32\xc7\x20\x5a\x43\x53\xef\xe0\xf3\x74\x43\x03\xd6\x24\x62\x5d\xaf\x3d\x00\x3c\xc5\xa4\x9b\x3c\xac\x22\x0a\x90\x81\x0b\xec\xce\xb0\x92\xbe\x43\x7e\x58\xb7\xe7\x08\x07\x8e\xf2\x82\x7e\x61\x22\x6d\xba\x63\x40\x41\xf5\xbe\x1a\x49\x39\x24\xcc\x71\xe3\x41\x3b\xe4\x04\xc6\xe4\x12\x73\xfc\xc8\x17\x2e\x2e\xcf\xf3\xc5\xcb\x1f\xe7\x65\x20\x04\xe7\xe5\xf3\x1f\xd5\x12\x24\x5e\x51\x22\x04\xae\x39\x50\xaa\x5e\x9c\x5e\x5d\x96\x4b\x08\xba\x89\x83\xf2\xb8\x62\x6f\x19\xda\x41\xc3\x87\x81\xe8\xe1\x09\x01\x41\x3c\xa9\xec\x9e\xfc\x80\x46\x8b\x12\x40\xa4\x82\xb5\x2e\x4f\xe2\x5d\x84\x29\x9d\xa7\x02\x7e\xa7\xbc\x53\x35\xae\x50\x69\x04\x70\x0b\xa4\x0e\x19\x4a\x7b\x0c\x61\xa1\xea\xd8\x35\xa1\xea\xca\x13\xd0\xeb\x18\x18\xe8\x0c\x8c\xa4\x6f\x42\xe9\x0e\x8f\x2e\x3d\x30\x92\x40\x82\x9b\xea\x04\xaf\xa4\xe1\x9d\x01\xd6\x2e\xe9\xf6\x86\x48\x03\xfd\xf5\x09\x30\x8c\x4d\xa3\x2c\x3c\x39\x0d\x3f\x12\x66\x81\x75\x34\x83\x1d\xc1\xc0\x44\x88\xc6\x6c\xc7\x12\x50\x06\x27\xff\xa0\x31\x38\x9a\x45\xc1\x36\xb0\x06\x9a\x14\x1e\xc9\x03\xdd\x75\x69\xfd\x41\xd0\x1f\x0e\x3a\x5e\x72\x12\xa0\x50\x3a\x45\x8e\xbe\x19\xad\x9c\x91\xd2\x33\x8b\x18\xfa\xa2\x37\x1a\x8e\x90\x13\xda\x68\x85\x59\x86\x52\xb5\xdf\x37\x70\x19\x66\x68\xb8\x07\x46\xa2\x32\x29\x1b\x46\x60\x63\x60\x7b\x28\x92\xec\xf4\x69\x87\x1b\x99\xc9\x3d\xd8\xe8\xc7\x86\x46\xff\x71\x4d\x22\x2a\xc6\xc9\x24\x6d\xbc\x9a\x38\x6d\x03\x37\x6d\xa0\xb4\x4b\xa1\x39\xd2\x04\xd1\x39\x32\x39\x82\xf6\x6b\xcb\x4f\xa4\x9f\x17\xac\x66\x9d\xc6\x71\xa6\x61\xda\x2c\x96\x56\x1e\x90\xb5\xde\x7c\x1d\x58\xee\xa2\x4f\xeb\xd2\x34\x1f\xb8\x78\x33\x95\xf8\xc2\xa5\x4a\x9e\x93\xf9\x46\x47\x36\x65\x1e\xf8\xc1\xc4\x83\x85\x24\x88\x76\x3d\x94\xc8\x60\x04\xb6\x1e\x42\xf7\x7d\xb2\x12\x01\xea\x4f\x9b\x42\x9e\x80\x90\xbb\x40\x81\x26\x2c\x66\xbc\x39\x09\x5b\x8a\x8e\x4f\xda\x68\x63\x57\xa2\x78\xe8\x33\xfa\x52\x8c\x5b\xa8\x84\xee\x62\xf1\xbd\x1e\xdf\x3d\xbb\x98\x35\x9b\x1d\x58\x92\x65\x42\x46\x36\x4a\xdf\x41\x24\x03\x3f\x31\x5e\x62\x5f\x16\x67\xcd\x21\x9e\xe2\xf6\x28\xef\x93\x40\x6b\xa0\x7d\xce\x82\x11\x68\xdc\x84\xea\x50\x21\xd8\x80\x44\xfe\x03\x0e\xc3\x9c\xc0\xb6\xf6\x4b\x2a\x42\x23\x37\x30\xa3\xa9\xd0\xa8\xa7\x1a\x66\xc2\x04\x90\xf8\x68\xd0\x0f\xa3\xe0\xbe\x58\x90\xf0\x36\x39\x0d\xc6\x17\x01\xd0\x0a\xe8\xac\x5a\x04\xa5\x2c\x33\xd6\x23\x50\xb4\x9c\x44\xbe\xe2\x28\x0a\xc5\xa2\x54\xd2\xb0\x64\xda\x8b\xc1\xfe\xc0\xa8\x0a\x00\x14\xf2\x24\x0a\x91\xf3\xe2\x34\x0a\xd5\x33\xe2\x6c\x0d\x9c\xe6\xc2\x79\x34\x61\x92\x8a\x75\xe5\xc6\x45\x1c\x01\x68\xa7\x9c\xb7\x97\xf1\x24\x32\xc0\x8c\x97\x70\xb5\x1e\x2b\x2c\xe6\x7a\x3d\x02\x9e\xa7\x91\xf3\x48\x81\x96\xb1\x37\xeb\x91\x80\xf1\xec\x4b\xb5\xc2\xed\xdb\x18\xf5\x60\xd0\x42\x7e\xfb\xee\x2d\x14\xaa\xc7\xf7\xf5\xa9\xc6\x42\xdd\x5a\xc1\xa0\xfd\xdc\x68\x0b\xd0\xbd\xb5\x18\x46\x3d\xdd\x5f\xa0\xa8\x8a\x7a\x6f\xe2\xd0\x57\xfc\x37\x92\x8d\xaa\x06\x71\x94\x68\x77\x36\xe3\xc9\x46\x05\x81\xfd\x00\x4e\x36\x9e\xa8\xaa\xd6\x5e\xcd\x49\x1f\x1c\x95\xa2\x60\xa3\x2e\x8f\x91\x24\xa6\x1f\x1d\x2e\x66\xda\x01\x36\x4f\xd0\x29\xea\x03\x43\x80\xf0\x8d\x11\x7f\x0c\x0c\xee\xa4\xc4\x86\x65\x40\x2d\x28\x11\x82\xc8\xc8\x4b\xe8\x09\x9f\x3e\x00\x39\xe0\xc4\x8e\x48\xae\x92\xb1\x59\x49\x26\x01\x75\xf2\xf1\x54\x75\xae\x00\x64\xe0\x07\x94\x54\xc6\x21\xd8\xa7\x72\xa6\x68\xd6\x28\xf9\xe3\x81\x09\x91\x0c\xf2\xa2\xa4\x6c\xe0\x86\x94\x0a\xc1\x42\xdc\x10\x73\xa4\x52\x88\x4d\x51\xae\x0c\x50\x92\x51\x09\x97\xa8\xef\x9e\x84\xb6\x77\x63\x95\x30\xa5\x75\xbc\x2c\x45\x0d\x02\x27\x98\x1c\x02\x92\x1e\x7f\xe7\xb9\xb4\xc6\x0a\x34\xbf\x0a\xa4\x6b\x70\xd0\x73\x5c\xca\x18\x3a\x71\x26\x83\xd2\xfc\xb5\x40\x79\x50\xcf\xb8\x51\xa4\x20\xec\xb1\xc4\x4e\x95\x8c\x98\x2c\xbf\x8c\xa0\x00\x98\xed\x00\xb7\x43\xa0\xc0\x3a\xce\x3b\x40\x45\xc7\x79\x07\x98\xd3\xa7\x02\xb2\x97\x7d\xa2\x70\x13\xff\x83\x9e\xa4\x08\x94\x70\x80\x39\xda\x10\xa8\x52\x00\x8d\xb5\x31\xd0\x13\xd8\x15\x35\x0a\x22\xfb\x5b\x2f\x29\x8b\xd8\x23\x0c\x0d\xd1\xb0\x76\x49\x65\x40\x10\x98\xa7\x63\x82\x4a\xe3\x7c\x1d\xe6\xc3\xf3\x67\xc6\x43\x40\x36\x9d\x53\x67\xd7\x49\x81\x66\x99\x59\x77\x08\xac\x53\x3f\x07\xe4\x93\x72\x61\x04\x48\xa6\x0e\x27\x27\x78\x1f\x11\x68\x65\x08\xc1\x02\x80\x97\xd6\x80\x1f\x6c\x69\x90\xe7\xaf\xd0\x90\x5d\x96\x64\x10\xd5\x1c\x14\x86\x6a\x14\x18\x41\x91\x8b\xa2\x8c\xca\x51\x28\xc9\x28\x6a\x46\xae\x31\x0b\x34\xe4\x06\x7f\x67\x2e\x9d\xd7\x97\x29\x9d\x22\xa9\xa1\x9a\xfd\xfb\x06\x90\xed\x60\x61\x08\x0c\x98\xb1\x10\x6f\x75\x59\xf0\x81\x3b\x8a\x30\xcf\xf8\xbd\x04\x2b\xde\x45\xef\x9d\x5b\x08\x9d\x43\xf2\x01\x16\x81\x3c\x79\xb5\xdf\x0f\xfc\x0e\xed\x9e\x55\x05\x73\x69\x64\x44\x19\x63\xac\x3b\x76\x39\xec\x43\xd1\x3c\x83\x0f\x19\x57\x43\x52\x4d\x41\x37\x9a\xe4\x24\xaa\xc5\x93\xdb\xa4\xdf\xac\x4e\xce\x3b\x72\xcb\x8c\x23\x8c\x29\x41\x66\xf7\xa2\x9f\x43\xab\x75\x86\xcc\xd1\x0a\x35\xa0\xf0\x34\x68\x0d\x91\x8f\x3a\xe2\x92\x38\x2a\xf7\xc9\x63\x13\x16\xea\xcf\x56\xa0\xb4\x47\x36\x8d\xe2\x48\xaa\x06\x1a\x69\x80\x26\xc1\x00\x57\xf1\x1c\x46\x83\x89\xd5\x29\x15\x23\x2d\xcb\xda\x65\x36\x84\x07\x92\x57\x0e\xef\x7d\x9c\x11\x0a\x45\xb4\x65\x71\x9e\xd6\x6b\x89\xf4\x3d\x0f\x65\x62\x40\xc9\x94\xbe\xcb\x61\x3c\xee\xc0\xac\xbd\xb2\x79\x88\x68\xf7\xcd\x68\xfc\x52\x1b\x50\xb0\x48\x72\x5b\xda\x74\x0f\x23\x50\x9e\xbb\x1b\xa3\x08\x90\x4c\x84\x1f\x23\xa0\x27\x9e\xa5\xe7\x63\xc5\x1d\xcb\xce\xbc\xd0\x80\x50\xc5\x7d\x19\xc2\x88\x48\x5c\x45\xe2\x44\x5c\xaf\x23\x20\x49\x5d\x6f\x34\x50\x8f\xca\x6d\x14\x44\x43\x72\xa7\x61\x86\xf2\xef\x7b\x14\x78\x44\x86\xf2\x5b\x51\x20\xaa\x05\xc5\x44\x81\xb4\x69\xbc\xab\x41\xa7\x9d\x01\x5a\xb5\x7b\x51\x00\x55\xd8\x8f\xc2\x64\x8d\x03\x0d\x35\xd5\x5c\x4d\x0d\x55\x9a\xaa\xb1\xea\x4b\xbe\x4b\x31\x51\x51\x9e\x33\x2d\x8d\x0f\x8b\x8d\x44\xa7\x29\x21\x78\x43\x98\x42\x9c\x06\x35\xe8\xc8\x10\x14\xf7\xc0\xc1\x00\x3f\x36\x2b\xcb\x20\xd1\x98\xb9\x8a\xe1\xae\xda\x65\x34\x64\x9a\x39\x84\xfb\x9c\x0c\xa1\xd2\xbf\x0c\x0b\xdf\x43\x8a\xbb\xa0\x5c\xd0\x9e\x01\xa7\x4e\x71\x9a\x70\x70\x81\x47\x25\x32\x88\xe2\x03\x62\xca\x13\xa1\xe7\xb2\xbc\xbf\xe4\x07\xf0\x89\x47\x42\xea\x05\x02\x77\x21\x4a\xe9\x8c\x92\x6c\x73\x33\xe6\xa4\xce\x48\xcf\xc1\x89\x86\xc8\x79\x35\xd5\x00\x68\xc4\x4c\x47\x50\x12\x52\x11\x56\x9b\x16\x64\xd1\x23\x6c\xe0\x13\xa7\x0d\x71\xb3\x2a\x96\xf5\x7d\x96\x92\x0a\xfa\xa7\x6d\x81\x80\x72\x99\x4e\x3c\x93\xb0\x2b\xd1\xcd\x9c\x05\xe5\x93\x36\x61\x40\x45\xcb\xf2\x40\x14\xda\x27\x53\x86\x63\x34\x5b\xd5\x91\xfc\x82\x2c\x61\xf8\xb6\x40\x3e\x0a\xee\x05\x2d\x60\x38\x52\x7c\xe2\xc2\xdb\x3d\x54\x73\x2d\xce\x48\x6f\xf9\xc5\xb5\xe9\x06\xb9\x2e\x45\x11\x40\xdc\x90\x7a\xa0\x72\x2c\xa1\x33\x90\x09\xfb\xd1\x04\x75\xdf\xaa\xb2\x0e\xcc\x9a\x41\xd4\xfb\xa8\x93\x14\x34\x4e\x44\x0e\xa0\xa2\xfa\xa2\x80\x03\x79\xa0\x33\xbb\x14\x55\x89\x80\x59\x95\x49\x7c\x94\x77\xc8\xb1\xc1\x20\xc0\x73\xd9\x60\x84\x08\x65\x79\x89\x60\x31\x65\xad\x45\x4d\xe2\x4c\x3b\x03\xbe\xef\x75\x48\x18\x63\x10\xf4\x50\xb2\xc0\xad\x14\xa9\x51\x6a\x0c\x53\xa0\xf6\x46\x12\x4c\x88\xfa\x4a\x12\x19\xf5\x51\xb6\xa3\xb7\xd2\x20\xdf\xb1\x91\x86\xb8\x27\x66\x1c\xd2\x4f\x8d\x38\x10\x40\x5d\x95\xb3\x75\x70\xc0\x3f\x8f\xc2\xc3\x4a\x5c\xac\x4d\x40\x6f\x99\x94\x30\x53\x77\x3b\xea\xdc\x1f\x32\xfe\x03\x19\xd4\xa3\x10\x84\x35\xa6\xd8\x78\x38\x99\xb4\x45\x67\x9c\x92\x53\xf4\x24\x0a\x95\x8a\x32\x95\x7a\xba\x3e\x55\x73\x0c\x67\x6f\xa4\x9b\x77\x73\x36\xce\xa3\x48\x3a\xf3\x45\x0c\x6e\x66\xba\x8c\xa6\x29\xed\x8d\xaa\xd7\xd5\x1b\xc9\xba\xec\xeb\xb7\x10\x22\xb7\x86\xa2\x48\xd0\x71\xad\x16\xee\x8b\xb7\x04\x47\x97\x34\x77\x14\xa2\x0b\x7a\x59\x69\xba\x90\x7b\xd3\x3c\x31\xd9\x1f\x3e\x27\x87\x93\x45\x92\x4d\xa3\xfa\xc3\xe1\xb4\x8d\x4f\x2d\x82\x14\xb4\xa4\x7b\x68\xc0\x16\x5e\x95\xa9\x3c\xdc\x4e\xae\x55\x90\xa9\xf8\x77\xfe\x14\x6e\x5c\x98\x00\x23\x7f\x8b\xbf\xd0\x96\xbb\x32\xde\x9c\x43\x59\x7e\x0b\x71\x50\x23\xae\x05\x16\x08\x33\x04\xd8\x97\xc9\x39\x70\xc6\x20\xbf\x73\x17\x7d\xa7\x5c\xd3\x40\xd1\x90\xad\xb2\xbe\xd6\xe8\xca\x4c\xb3\xbe\xdc\x62\x3c\x0d\xd0\x5b\xa5\x1f\x05\xd1\x56\x19\x30\x0c\x75\x25\x62\x1f\x42\x6e\xcf\x93\x5b\x14\x25\x04\xa1\x22\xa8\x35\x45\xc1\x4f\xde\xd1\x71\xf7\xe9\x92\x27\x9b\xc3\xb6\x19\x95\x62\x8a\x03\xe3\x74\x28\xb5\xc3\x89\xad\x31\x5a\xa8\x3f\x70\x04\x19\x51\x68\x68\x97\x63\xe8\x34\x8a\x2d\x93\x6c\x1f\xb3\x81\xb4\x35\x6c\x29\x2d\x5e\x8f\x70\x3a\xa2\x4f\xfa\x93\x80\xd2\x9b\xcd\xd4\x20\x78\x42\x56\x28\x9c\x1c\x7d\xc6\x33\x92\x94\x89\xe1\x68\x1c\x90\xf6\x68\xb0\x82\x41\x3b\xcb\x3e\xb4\x10\x6b\x3c\xd4\xc9\x20\x2e\x94\xd8\x01\x3d\x35\xa5\xb9\x1f\x83\xeb\x6f\x8e\x56\xb2\xc4\xbf\xd9\xa2\xbc\x13\xb6\xa7\x7d\x64\x74\xa5\x63\x1c\xcb\x28\xde\x9e\xcb\xd2\x91\x63\x12\x39\xc1\x9c\xbc\xfa\x9a\xdd\x4c\x2b\xc3\x3c\x08\x49\xd9\x04\x8d\x24\x27\x2b\xf9\x72\x6a\xd7\xc8\x0a\x77\x02\xf4\x76\x1a\xe8\x42\xd2\xa1\x71\x9f\x12\x6f\x60\x2b\x35\x4a\xc8\x9b\x36\x19\x33\x23\x01\xda\x13\x00\x85\xbf\x08\xb5\xb5\x1b\x73\x23\xb9\x4e\xfb\x51\x69\x48\x97\xc7\x56\xe0\xca\x67\xd4\xc2\x48\x39\xa2\x33\xe5\xf6\xbe\x06\xd0\x35\x56\xe6\x6f\x69\x63\x35\x70\xbf\x0f\x87\xfd\x82\x32\xf1\x7e\x56\x09\x33\xd2\xf5\x76\xa8\x04\x5c\x6d\x0f\x18\x1a\x96\x17\x68\x23\x34\x91\x17\xb6\x60\xf3\x25\x74\x62\xf9\xba\x88\x40\x0c\x66\x81\x80\x10\xbc\x1c\x9e\xa2\x35\x68\x31\x8c\xe3\xb7\x60\x37\x55\x00\xbe\x9c\xa6\x62\x13\xe6\xe2\xf6\x65\xfc\x49\xd9\xba\x54\x14\x40\x1b\x4e\x1c\x28\x08\x9f\x62\x57\x55\x94\x0f\x43\x0f\x55\xf4\x82\xed\x94\x6b\x2a\xce\x87\x68\x75\x8e\x22\x53\xdd\xc3\x3a\xc3\xd4\xe9\xe3\x2f\x4c\xb2\x01\xfc\xe2\x2d\x10\xc4\x00\xd6\xa9\xb7\x54\x32\xd5\x31\x43\x58\x1e\x3a\xa1\x48\x4f\xb8\x68\x5c\x89\xbd\x74\x1a\x05\xe0\x83\x4e\xba\x07\xcf\x62\x69\x7c\x7b\x1d\xf9\xaa\xf3\xf5\x29\x4b\xd4\xf4\xc5\x92\xc6\x20\x8e\xa1\x75\x3b\x56\x4f\xf5\xc1\x25\xe1\xf4\x47\xb4\x38\x30\x01\x7a\xfa\x91\x7e\x79\x05\x8c\x75\x98\xbc\x63\x13\x6d\xa1\x95\x74\x45\x19\x29\x85\x09\x5e\x2c\xfd\x3a\x4c\x67\x86\xf9\xa6\x1d\x60\x1f\x4c\xa8\x40\xa8\xc6\x94\x02\x24\x01\xdd\x10\x2e\x59\x1c\x61\x63\x67\xfb\x14\x03\xa2\xd6\xc1\x1b\xdf\x32\x36\x1c\x23\xea\x93\x11\x93\x1e\x5d\x60\xbe\xdd\xca\x02\x24\x98\x94\x39\x77\x2b\xb0\x14\x90\xe3\x08\xb0\x1b\x04\xa3\xea\x40\xdd\x38\xdf\x8a\xa4\x01\x73\x86\xd3\x0c\x89\xb0\x98\xad\x49\x20\x52\xec\x46\x52\x9e\x01\x5c\x0a\x7a\x28\xee\x79\x98\xd0\x0c\xb4\x21\xd4\x25\x5d\x9b\xc4\x06\xf8\x9c\xb2\x3f\x1b\x78\x79\xa0\x8e\x1c\xab\x88\xd9\x64\xd2\x11\x83\x02\x29\x43\x9a\x0c\x3c\x0a\xc6\x28\x2d\x2e\xf6\x75\xe4\x98\xd6\x63\x8b\x93\x4f\xa4\xf1\xf7\x92\xd2\x61\x8b\xc0\x4b\xd5\xcf\xfb\x40\xf0\x65\x4c\xee\x2a\xf9\x30\xfd\x80\xaf\x2b\x14\x42\x08\x8b\x54\x45\x04\xb4\xc6\x1d\xbc\xf1\x4d\x85\x77\xc8\x9c\xb8\xb4\xcf\xd7\xb0\x61\x71\xc9\x50\x32\x54\x52\x48\x88\x22\xb9\x1d\x99\xaf\x17\xd2\xda\x07\x05\x92\x1b\x4c\x57\xc5\xf5\xb6\x59\xa1\x42\x58\x41\x7e\xa0\xc3\xf9\x50\x9d\xdf\xe3\x2c\xe3\x89\xba\x4c\xcf\x6b\xaf\xcf\xe0\x45\xe0\x33\x41\x22\xfe\x7f\x00\xc0\x3f\xb5\xc1\x25\x1a\x2c\x56\xf7\xa5\xe3\x02\x75\x44\x31\xa4\x7c\xcc\x1d\xed\xab\x2e\x1b\x19\xc0\x23\x31\xee\x92\x56\x8f\x61\xc0\x3f\x34\xc9\xc5\x0d\xac\x83\x18\x04\xad\xad\x35\x88\x05\x90\xc3\x7d\x15\x65\x6e\xbf\xa6\xe2\x4f\x52\x40\x9a\xaa\x0c\x29\x55\xea\x4c\x43\xb8\x88\xb9\x8e\xab\x3c\x75\x59\x88\xec\xc3\x27\x85\xb0\x2f\x4b\x38\x92\xe9\xf8\x2e\x0d\x2c\xf9\x63\x19\xe5\x2e\x59\x28\xec\x1b\x59\xda\x09\x25\x8f\xbd\xa0\x4a\xe7\x1c\x40\x73\x18\x40\xac\xc9\x92\xb1\x31\xa2\xc5\xe8\xb3\xfd\x18\x48\xef\x93\xe7\x2b\x29\xc4\x5c\xa9\xbd\xf9\x62\x35\x59\x1e\x09\x3d\x87\x9f\x81\xc5\x8f\x22\x56\x29\xf0\x60\xc4\x51\x52\xc9\xaf\xa4\x5d\x74\x5a\x03\x3a\x1d\x1f\x4c\x4b\x40\xd8\x70\xef\x2a\x44\x91\x66\x03\xa4\x12\xc5\x18\x70\x12\x1c\x09\xc8\x39\x9d\x91\x2f\x85\x12\xa5\x6a\x2f\x2b\x91\xdb\xb4\x9b\x3f\x61\x7e\x63\x7a\xeb\xc7\xbc\x8f\xa7\xd7\xfb\x61\x04\x46\xb9\x12\xc6\xd0\x94\xf6\xe7\xdb\x86\xb4\xaf\x30\x89\x09\x59\x59\x9f\x85\x37\xe8\xf7\xe9\xc2\x37\x10\x4d\x0e\x78\x2a\xa1\x4a\xf8\xc3\x61\x0b\x3e\x7b\xa8\xc2\xc0\x55\x44\xcc\x25\x92\xc8\xa2\x80\xa8\x96\x74\x3b\xad\x24\xb3\x5a\x30\xb9\x7e\x8b\x8d\x36\xdb\x49\x34\xfd\x4a\x22\x81\x12\x03\x25\x07\xd4\x7f\x9b\x73\x02\x83\xd1\xd3\x5f\xba\xde\xff\x05\x3a\x70\x4e\xe8\x66\xf9\x57\x25\x02\x4a\x52\x1d\xac\x1e\xff\x43\xcc\x64\x8f\xbc\xa7\x9c\xfc\x16\x9d\xcf\xbc\x4f\xff\x11\x9e\x2c\xf4\xec\xb7\xc8\xc6\x71\xf7\xf9\xef\x91\x81\x56\x20\x19\xb9\x08\x31\x63\xf7\x11\x51\xd5\x26\x5f\xbd\xbd\x7c\x13\x09\xf8\x36\x89\x73\xf5\x26\x0e\xdb\xd8\x4a\xb4\xeb\x37\xd1\x90\x9b\x91\x48\x37\x6f\x22\x9d\x76\x14\xce\xc6\xed\x9b\x48\xd2\x5e\x4b\x22\xde\x85\x78\x3f\x22\x78\x3f\x70\xc6\x23\x0e\xcc\xe2\xef\xbf\x47\x22\x1d\x3a\x2c\x8f\x02\xeb\xc5\xb7\x7e\x9f\xa3\x2f\x46\xec\x4e\xe7\x06\xe7\xa2\xbc\x1c\x05\xfb\xf2\x5c\x84\xd1\xab\x01\x11\x07\x97\x61\x01\xf2\x31\xb7\x84\x8d\xbb\x9a\xc7\xd0\x8e\x34\x29\xb9\xdb\x0f\x63\xca\x45\x8e\x89\x81\x87\xa6\xbd\xe1\xd3\x51\x67\x40\x22\xdc\xbe\x99\x22\xf7\xbb\xad\x18\x90\xbc\xb7\x04\xd1\x42\xfa\x9d\xc1\x91\x78\x18\x8e\x71\xd3\x42\xf7\xd9\xc8\x05\xc2\xee\xbe\x8a\x84\xdf\x89\x22\xb5\x56\x90\x8e\x87\x53\xaf\x1d\x22\xb4\x57\x10\x2e\x40\x42\x1b\xb4\x70\xf0\x43\xac\xce\x1b\x58\x97\xc3\x9b\x40\x74\xa3\xb8\x1b\x0f\x2b\xc8\xab\x48\xdd\x15\x9c\xe1\xb8\x22\xa3\xe1\xf1\xdd\x1a\x24\x6c\x9e\x46\xe8\x47\x11\x40\xb8\x43\xcb\x2f\x1e\x9b\x41\x34\x0d\xa9\xfb\x65\x9b\x4e\x9e\x50\xbd\x39\x5c\x4d\x45\xb6\x4e\x54\x10\x4a\x26\xb9\x23\xc4\x68\xe7\x61\x6a\x01\xdc\xad\x50\x18\xd9\xc1\x47\x09\xef\x4c\xfe\x07\xe6\x03\xc2\x05\x7b\xf0\xf0\x29\x3c\x91\x76\x2c\x01\xc6\xc8\xc0\x46\x4e\x8c\xa6\x06\x28\xff\x29\x63\x2a\x29\x10\xec\xed\x68\xc2\x31\x79\xbd\xaa\x85\xd8\x74\x68\xd6\xa6\x50\x0b\xd5\xa0\x84\x11\x39\xad\xed\xc8\x44\x79\xbd\xf4\x81\xa2\x93\xe9\x10\x26\x33\xfa\x3b\xe2\x0c\x32\x9e\x72\x67\x5e\x37\x90\x3b\x7a\xd7\xc4\x24\xd7\xd6\x05\x4a\x95\x46\xc1\xf3\x68\x4e\x60\x86\xa6\x9c\x7e\x1a\x8c\xf1\x70\xa2\x43\xd7\x49\xa3\x48\xc0\xcf\x32\x0e\xbb\x57\x87\x89\xb0\x88\x21\x74\x06\x51\x84\x65\x34\x7d\x32\x1c\x4f\x23\xb5\x78\x8e\xa4\x47\x92\xf2\x6b\x92\x70\x4b\x8f\x80\xe5\xdd\x6c\xf2\x02\x8e\x14\xa2\x48\xa9\xcc\xbb\xf6\x2a\x32\x88\x8c\x79\x5f\x45\x88\x19\x2f\x11\x1a\xec\x7a\x6c\x0a\x5d\xe6\xe8\x74\x04\xc3\xb2\xaf\xc3\xeb\xfc\x46\x80\xe0\x1d\xec\xf5\x87\xfe\xac\x17\xf0\x2d\xf6\x4a\x0c\x7d\xd5\xff\x85\x3d\xa8\xfc\xd2\xa3\x86\x3d\x94\xe9\x13\xf8\xfa\x08\xc3\x4b\x97\x28\xd1\x23\x84\xf1\xf7\x00\x3f\x01\xc3\x07\x63\xd2\xec\x60\xc3\xc6\x98\xd0\x64\xae\xac\x4a\x89\x2d\x79\xc7\xe5\x90\x62\x6c\x02\x55\xd3\xe1\x0f\x23\x3a\x54\x0b\xe3\xf0\xd9\x9d\x05\xfa\xad\x9a\x60\x49\xd0\x3b\x53\xfa\xcd\x0f\x7c\xea\x9d\x23\xc2\x1c\xe0\x3a\x0c\x0f\xa9\x8f\x19\xd8\x1c\x7e\x88\x10\x65\xba\x6d\xba\x71\xa2\x13\x25\xfd\x25\xf0\xa9\x82\x9a\xa7\xd9\x33\xfa\xd4\x08\xbf\x33\xa7\x20\x5b\x8a\x9c\x31\xae\x21\x17\xca\x9b\x3d\x4f\x15\x09\x1f\x0d\xf1\xae\xf9\x31\xeb\xa9\x17\x0a\x3a\xc7\xc3\xfb\x73\x9d\x19\xbd\x18\xc3\x06\x6b\xc6\x71\x71\x2f\x11\x7d\xf2\xb1\x84\xef\x5e\x63\x12\x88\xcb\x68\x4b\x74\xc5\x91\x73\xbc\x56\xfd\x4c\x28\x20\x07\xcb\xbb\xcf\x18\x9d\xc2\xba\xf7\x60\xff\x24\x34\x8a\x6c\xc2\xc6\x02\xb1\x3f\xc3\xfb\x55\xd9\x3f\x40\x7c\xb8\x45\x8c\x87\x09\xcf\xa6\x3b\x8c\x74\xc5\x1c\x95\x88\xdd\xce\x12\x98\x81\x0e\xec\x0c\x04\x04\x21\x32\x3f\x41\x7b\xd0\x73\xdc\xb6\x60\x32\x57\xc8\xb1\x11\xcc\x5b\x0e\xb0\x62\xa3\xc4\x11\xa4\x31\x65\x08\x42\xe5\xf6\x2b\xd2\x29\x11\x4c\x38\x15\xac\x0e\x58\x1b\x03\x13\x44\x81\xb0\xe2\x55\x15\x81\x98\x0b\x25\x6f\xe1\x87\x7b\x01\x79\x0f\x3b\xc4\x34\x99\xa9\xa6\xc3\x29\xa2\x6e\xec\xe4\x47\x3c\x09\x0d\x46\x63\x81\x9e\xb4\xfc\x70\x0d\x38\x50\x01\x69\xc1\xbf\xe1\x19\x60\x20\xcd\xaa\x42\xbe\x09\x8e\x9c\x8b\x04\x46\x4a\x44\xb3\xdb\x34\x12\x46\x02\xed\xec\x0c\x03\xba\x7a\x58\xd7\xf0\x08\xa5\x65\xe4\x60\x5f\x92\xf9\x31\x5a\xb5\xa6\xd8\x10\x44\xd2\xe4\xf6\x5b\x58\x9d\x41\x04\xaf\xf3\x16\x5e\xa4\x96\x0f\x26\x56\x7b\xf8\x74\x0a\xab\x89\x68\x0f\x2c\x9a\xb0\x8e\xc6\x31\x4e\x37\xcc\x20\x2d\xfb\x7a\x31\x88\x14\xbd\xfb\x31\xb0\x56\xeb\x0e\xd6\x25\xd0\x32\x1d\x86\x29\xfb\x5a\x8e\x1b\x85\x40\xd6\xa5\x14\xe4\x31\xff\xe3\xfa\x04\xf9\xf9\x71\x98\x4a\xc6\x76\xdc\x29\xc7\x15\x13\x28\x9b\x74\x52\x71\x36\x24\x34\xe0\x26\x9d\x6a\x34\xee\x39\x65\x59\x70\x46\x70\x36\x7e\x39\xc7\x30\xac\x83\x8b\x0a\x3b\x4d\x03\xda\x43\x9f\x44\x03\x58\x34\xb1\xa0\x0d\xf2\x52\x26\xa2\xa1\x8f\x4a\x95\x55\x99\xa9\x38\x3e\xaf\x2a\x6b\x32\x57\x30\x6e\xfa\x93\x8e\xaa\xf2\x16\x0a\xa2\x84\xda\xab\x4a\xc4\xf1\xdb\xb5\x8c\xe2\xd9\xd6\x8d\x0e\x57\x34\xd7\x78\xcb\x30\x34\x31\x58\x72\x51\x93\x29\x5b\x94\x50\x6c\x88\xde\x68\xf2\x2a\x88\x8b\xef\x0e\x33\xa0\x24\xf4\x9d\x03\x17\xec\xcc\xae\xc0\x38\x1c\xbd\x85\xd5\xce\xf1\x49\x80\xae\x2d\x48\xb3\x50\x62\xc8\x13\xac\x57\xcc\x39\x45\x53\x1b\x04\xf5\x51\x32\x6d\xe2\x33\x1d\x15\x3c\x69\x4d\x29\x5d\xdb\xfe\xba\x44\x54\x2a\x29\xa1\x5a\x1c\xac\xa4\x17\xa4\x79\x8c\xbb\x9a\x74\x39\xee\x48\x93\xc9\x0a\x17\xfc\xc0\xc7\x85\xc6\x5c\x38\x78\xc2\x03\x02\x24\xef\xb2\xad\x1e\x15\x33\xe2\xb3\x90\x2a\x67\x1b\xa1\x3a\x08\xdd\xc0\x10\xfd\xf7\x09\x83\xd5\x24\x87\x8c\x80\x11\xb6\x1a\xd3\xf6\x2a\xb5\x37\x52\x14\xfb\x5c\x7f\x2b\x5d\x1e\x1d\x07\xfa\x2b\xea\xf8\x5d\x03\xa4\x12\xeb\x28\x2c\x81\x95\x58\xc7\x21\x40\x33\x9a\x2d\xca\x45\x3e\xf0\x38\x75\x3a\xee\x2c\x12\x30\xf0\x04\xc7\x31\xe7\x40\x52\x7e\xf6\x94\xb1\x16\xf9\x1e\xd9\xb2\x33\x7d\xc8\x33\x8e\xec\xb2\x33\x89\x42\x51\x79\x4a\x5b\x60\x8c\x12\x3b\xb2\x3c\x97\x18\xd8\xcf\x92\xa6\x16\x19\xa1\xd3\x87\x39\x0d\xbd\x7c\x41\x18\x74\x7e\x7a\xa9\x82\x2c\xc9\x5e\x99\xd1\xd0\x02\xe0\xda\x04\xe3\x4c\x86\x6d\xa6\x84\x65\x02\x5b\xc7\x82\xea\x0d\x63\xa0\xee\xb1\x4c\x09\xd0\x9d\x68\x4c\x8b\xe1\x8e\xb2\x1d\xa9\x70\x8c\xdc\x4f\x6e\x1c\x50\x04\x6d\x63\x39\xa0\xac\x2e\xa9\x20\x19\x95\xed\xbb\x93\x30\x43\xdb\xf6\x5d\x82\x88\x86\xa8\xa5\xb9\x25\x81\x2b\xf3\xec\xf0\x40\xc2\x2b\x71\x39\x4a\x2c\xc4\x9a\x24\x92\xa6\xdc\x35\x49\x8a\xe1\xaf\x51\x81\x78\xbd\xad\x8e\x2b\xb3\x4e\xd1\x05\xcd\x60\xca\x85\x96\xe9\x5a\x83\x71\x84\xa9\xfc\x36\xe5\x31\x05\x67\x93\x40\x6a\x9e\x4f\x54\x5c\x6e\xa6\xa7\x2a\xce\x4e\x19\xcf\x54\x14\xb7\xed\x73\x15\x79\x62\x4d\xf6\xc5\x81\xf2\xdd\x78\x29\x43\x3f\xd0\x21\x87\xc7\xc2\xe7\x15\xc0\x06\xc4\xcd\x5d\x53\x08\x48\x02\x72\x35\x37\x18\x81\xd1\xf3\xb1\x9a\xe8\xc5\x92\x97\xda\x2d\x81\x61\x3b\x05\x94\x80\x93\xd8\x71\xe9\x1d\x25\x3c\x8d\x05\x54\xa0\x89\x09\x7c\x41\xa4\x10\xb2\x6b\x30\xcb\x09\xee\x05\x78\x4a\xf2\xfd\x80\x7c\xa5\xc2\x58\x1c\x84\x4e\x53\x45\x15\xc2\xb0\x88\xdc\x2a\xac\x76\x90\xa3\x92\x7c\x07\xad\x4d\xf9\x06\xd4\x26\x66\x52\xbc\xaa\x06\x70\xcb\xfc\x10\x40\xbe\x69\x03\x23\x4e\xcb\xb0\x63\x94\x81\x9d\xf4\xc0\x71\xba\xda\x83\xde\xa4\x02\x6d\xf4\xc4\x09\xb3\x01\x53\xd8\x1e\x45\x79\x9d\xee\x42\xd3\xaa\x14\x7b\xc4\xd9\xd6\xa2\x30\xf9\x5a\x64\xa4\x29\xad\x9b\x33\xd4\x0c\xe0\xa2\x6e\x57\x19\x48\xae\x1b\xab\x31\x17\x94\x0f\x08\xc0\x9a\x0e\x28\xef\x6c\x9a\xf5\x26\xf3\x1c\xec\xab\x2a\x8a\x02\x02\xc4\x47\x32\x1e\xe5\x87\xbb\x9c\x9b\xb9\xd7\x47\x42\x21\x5e\x74\xcc\x41\x76\x9a\x91\x15\xb3\xe9\x70\xcd\x01\xde\x74\x38\xca\xa6\xa5\x6b\x8c\x0c\x39\x5c\x92\x62\x61\x86\x9d\x90\x4c\x22\x85\xb0\xf9\x6a\x58\xcc\x38\x40\xcf\x85\xf3\x40\xfb\xd6\x98\x9a\xe8\xb0\xbf\xcc\x54\xbc\x27\x96\x44\x14\x7a\x58\xd9\x27\xd4\xd2\xf6\x21\x04\x7d\x3f\x47\x8c\xd1\x47\xd8\x34\x29\xc0\xae\x0d\x60\xc3\x5c\x20\x91\x1f\xe1\x05\x6b\xe8\x96\xaa\x72\xf9\xb9\x64\x24\x3c\x1c\x57\x2c\xf7\xb3\x04\x21\xf1\x93\xfa\x94\x3c\x81\x80\x5f\x1e\x62\x46\x96\x22\xa9\xd4\x02\x25\xb0\x29\xce\x08\xd3\xf0\xda\xe3\x23\x07\xbc\xe0\xa9\x33\x09\xea\x72\x13\x2e\x12\x26\x1a\x58\xe9\x93\x3b\x86\x2c\x82\x1e\x5a\xda\xd7\x99\x07\x2e\x13\x10\x5d\xac\xa2\xa8\x4f\x22\x51\x55\x39\x2a\xdd\x97\x69\x4b\xe3\x6c\x60\x82\xa9\x6c\xbc\x57\xa1\x64\x0c\x03\x69\x38\x08\x23\xd2\xc3\x50\xd5\x80\xb0\xa6\x3e\x04\x68\x77\xa4\x35\x0d\x93\xe7\x7d\x53\x55\x3e\x13\xbc\x99\x8a\x62\xcd\xe6\x2a\x82\x47\xa9\x3a\x1c\x37\x1b\x5c\x50\x4a\x6f\xd9\xc2\xea\xd6\xb9\xfc\x09\xbe\x68\x88\xe2\x98\x8a\x46\xe7\x90\x3a\x24\x96\x8e\x96\x8e\xd7\x63\xa1\xb9\x4a\x56\x79\xe1\xa2\x79\x47\x53\x52\x4e\x3d\x63\xe2\x41\x30\x36\xe1\x50\xae\x8b\x14\xaa\xe7\xdd\x0a\xe2\x29\xe1\x21\x23\x73\x26\x43\x74\x27\x27\x22\xeb\x9c\xab\x14\x76\xa4\x5b\xa5\xc8\x14\x57\xe9\x33\x85\x61\xb4\xc6\x4b\xa0\xc3\xd0\x05\x20\xb4\xc1\xee\x4b\x1e\x98\x2e\x38\xd7\xf0\x41\x79\x60\xbd\x94\x00\xf2\xe4\xaa\x28\x46\x9e\x4a\x18\xce\x61\xe6\xd0\xcd\x62\xc2\x41\xcd\x27\x05\x66\x63\xf2\x3e\x7c\x43\x91\x05\x88\x70\x05\x44\x5f\xe4\xd0\x97\x36\x81\x42\x27\x37\x8b\x2c\x3a\xd5\x66\xa0\x6e\xf7\x66\x6c\xdd\x52\x9f\xa6\x73\xe8\x70\x1b\x30\x1f\x67\xc2\x9f\x92\xfd\xc3\x16\x46\xc7\x02\x9d\x2e\x89\xa5\x0c\xa2\xd1\x49\x52\x79\x54\x76\x15\x14\x2d\xd8\xd0\xf9\xb6\x8c\x86\x7a\x4a\x5f\x81\x60\x3e\x92\x9b\xea\x62\x55\xbb\x55\x0e\x38\x0d\xc2\x45\x6a\x36\x79\x51\xde\xef\x8c\x81\xb6\x9f\x93\x0d\x47\x49\xe1\xaa\x6e\x29\x57\x95\x53\xda\x26\xe5\x85\x60\x02\x5d\x78\x53\x18\x06\x61\x9f\xd2\xd9\x8f\xf9\xd5\x18\x85\x4b\x06\x8c\xc5\x13\xee\xfa\x55\x76\x05\x4e\x17\xcb\x38\x4f\x2b\xbc\x6d\x52\xa5\x54\x26\xfd\x1d\x4e\xc5\xc8\x05\xde\x88\x56\x32\xc7\xc3\x5a\xb8\x2c\xa0\xbb\x36\x51\xcb\x3d\xbd\xb7\x93\x49\xfa\xe9\x1b\xe9\xbc\x0a\x07\x21\x84\xee\x65\xa3\x7b\xf1\x28\x44\x09\x26\x23\x86\x2b\x5f\x3b\xf6\x61\xd5\x88\x6a\xaf\x63\x3a\xa0\x92\xd0\x2b\xb9\x99\xf1\x03\xdb\x1c\x7f\x50\xa6\xc7\xe3\xf5\xa9\xd2\xa8\x60\xb2\x36\x55\x9f\xae\x4f\xd7\x26\xb3\xa8\x34\x5b\x9b\xc6\xb4\x79\xbe\x36\x8d\x47\xfd\x69\x6d\x9a\x72\x6e\xb6\x58\x9b\x2a\x3d\x63\x2d\xa3\x89\x93\x79\x4b\x37\xe4\x79\x35\x49\xb7\x22\xbf\x9a\x26\x95\xad\x85\xd5\x14\x6e\x5c\x71\x35\x81\x5b\x56\x5a\x9f\xa0\x7c\xc7\xad\xa6\x72\xa3\xf7\x57\x13\x54\x8b\x2b\x6b\x92\x50\x03\x77\xb0\x16\x2e\x3f\x54\x5d\x4d\xe4\x3e\x3a\xe4\x84\x51\x80\x8a\x8d\x1a\x47\x88\x60\xd7\x68\x3a\xf1\xfe\x51\xe7\x30\x92\x0f\x5a\x48\x75\x89\x37\x43\x8e\xed\x88\x23\xe8\x72\x0a\xa5\x12\x23\xc6\x8a\xe8\xa3\xaa\x06\x14\xd9\xe0\x9c\x0c\x07\x4f\x08\xb1\xe5\x26\xd0\x05\x3d\x07\x05\x84\x8f\xab\x32\x98\xb6\xe9\x3f\x0b\x30\x11\x84\xf4\x5d\x5d\x63\x38\x23\x7c\x6d\xab\x7c\x39\x3c\xe7\x2a\x9f\x2a\x44\x69\x1f\xb6\x71\x56\x0d\x5d\xca\x9f\xeb\x30\x7c\xe5\x82\x22\x4f\xe8\xe8\x5e\x50\x48\x5b\xd5\x5e\x72\x8a\x72\x9e\x7d\xc5\x51\xbc\xce\x80\x21\xe0\x42\x6e\xf0\x17\xe8\xfd\x6d\x15\xdd\xd9\x0f\xe8\xe2\x26\xba\xca\xbb\xc0\x92\xe8\x48\x18\xca\xbf\xab\xca\xb0\x34\xb2\xe3\x28\x2b\x11\xb6\x28\xc2\x4c\xb3\x38\xa4\x30\x99\x57\x5f\x72\x01\xfc\x9e\x08\xf3\x0d\x57\x04\xa2\x8b\x79\xeb\xb6\x15\xf7\xd0\x7c\x38\xc1\x33\x62\xe7\x54\x65\xff\xd0\x78\x8c\x81\x6d\x9b\x02\x02\xe9\xe3\xbe\x6b\xfe\x00\xd1\x99\x1b\x1d\x96\xb4\xed\x56\x03\x34\x3d\xbb\x8b\x82\xf8\x72\xc1\xa1\x04\xa1\xb3\x1d\x1d\x56\x17\x7c\xda\x31\x08\xb0\xe2\xe3\x2e\x3a\xfb\x17\x31\xb8\x3c\x1a\xe8\x68\x7c\x74\x6a\x11\x62\xa5\xd2\xa9\xb5\x66\x39\xe2\x59\xa3\x70\x5f\x3f\x1c\x02\xf3\x47\xd3\xc1\xe5\xa4\x29\x0f\x6c\xf7\x90\x5e\xb7\xc0\x47\xe3\xb4\xc5\x46\x2f\x84\x29\xb7\xf2\x1e\x65\x62\xd8\x22\xa9\x04\x0a\xdf\x84\x2a\x43\x94\x7e\x98\x7b\xa1\x10\x03\x03\x71\xa9\xb3\x37\x4d\xa8\xca\x3e\x08\xb3\x2f\x15\xe2\xf0\x50\x3f\xc1\xd1\x92\x79\xd0\xa1\x64\xdc\x85\x64\xdb\x48\x53\x04\xad\x63\xc0\x34\x25\x7b\x30\x80\x92\x84\x75\x0d\x10\xd3\xae\x9e\x01\x61\xa2\xd5\x37\x20\x4c\x8f\x06\x31\x88\x24\x2b\xa3\x43\x0d\x55\xe4\x69\x68\x60\x32\x89\x19\x31\x04\x4f\x4d\xf4\x75\xad\x47\x0d\x63\x13\xd3\xb1\x8c\xcf\x7a\xfe\x81\x3a\x27\x32\x3c\xd6\x3f\xd2\x77\x70\xc1\x4e\x24\xe2\x13\x1d\xd2\x6a\x03\xbc\xe9\x33\xf2\xfc\x08\x67\x5f\x38\x81\x7c\x45\x1f\x37\x34\x99\x97\x8d\xde\x66\x2a\xff\xf9\x2e\xbe\x99\xa0\x22\xe1\x16\x3d\x51\xfb\xfe\x93\x4a\x94\xfa\xaf\x85\x8e\x83\xb4\x74\x2a\x06\xc8\xc3\x2f\x15\x0c\xc5\x2a\x60\x65\x90\x30\x3c\xaf\xc0\x78\xe9\x4d\x64\x3d\x2e\x91\x6b\x9a\xaa\x08\x9f\xaa\xa3\xe0\x41\xd9\xa0\xe8\x0b\xa2\x0d\x52\x91\x50\x60\xe8\x73\xc0\x16\xf6\x5a\x19\x57\x8c\xc0\xfb\x62\xc1\x4c\x7b\x29\x0e\x56\xf6\xf6\x51\x78\x67\xc0\xe8\xfb\x71\xb0\x44\xaf\x44\xe0\x06\x21\x3b\xa0\x84\x9e\x80\x35\xe8\xb3\x69\x52\x35\x06\xc9\xb3\x06\x6e\x86\xed\xa3\x8b\xe7\xf8\xa8\x03\xa1\xd0\x0b\x03\x73\x84\x2b\x13\x65\xa5\xe6\xab\x11\xc2\x40\x8c\xf8\x29\x50\x7c\xe7\x01\x01\x74\xcc\x46\x77\xbd\x0a\x4b\xae\xef\x11\xc1\x81\x7a\x75\x79\xe6\x3e\x61\x69\xd2\x1e\x61\x63\x81\x11\xbc\x74\xb9\x3c\xa4\xc7\x35\xe8\x96\x14\x65\x40\x01\x4e\xb2\x57\xcf\x9c\x86\xd7\x3b\x64\x08\xcd\x2e\x24\x16\x6e\x13\x41\x9e\xc2\x7e\x29\x98\x77\x94\x56\x9f\x41\xe1\xf5\x52\x15\x57\x37\x4a\x0b\x54\x54\x00\xc3\x5a\x94\xa1\x51\xe0\xf3\xe5\xa6\x52\x08\x40\x19\x89\x2e\x20\xb4\x39\x3f\xdf\xfa\x2a\x13\x02\x5a\x55\x76\x18\x3c\x1c\x29\xd2\xb9\x7f\x68\xc6\xd1\x34\xe7\x50\x3d\x14\x81\xaf\x36\x08\x15\x49\xe2\x12\xa2\xa7\x54\xf1\x05\x87\x10\x8c\x7d\xe4\xa1\x1e\xe5\x40\xe7\x0b\xed\xd9\xaa\x21\x4c\xea\x02\x0f\x35\x44\xe9\xaa\x7a\x61\x61\x86\x15\xb3\x01\x94\x39\x07\x21\x48\x76\xd1\x30\x84\x68\xdd\xe4\x28\x84\x29\x22\x40\x90\x99\x6b\x5e\xa7\x18\x4b\x58\x1f\x8d\x9c\x6a\x58\x25\xe4\x6d\xea\x18\x78\x82\x5d\xf6\x08\x02\x78\xf5\x06\xb1\xa6\x64\xe5\x26\x4f\xbe\x37\x8e\x0f\x43\x48\x67\x22\xcf\x33\x4e\x10\x88\x5e\x2f\x81\x39\xc0\x20\x5a\x96\x1e\xb2\x77\xc1\x64\xf8\x0c\x85\x90\x90\xd0\xf1\x27\xbe\x47\x21\xa1\xb2\x45\x73\x15\x0f\x4f\x29\x9e\x14\x28\xd4\xa7\x9c\xcb\xc2\xa5\x6e\x7f\xa1\x30\x98\xac\x5e\x1c\x86\x31\x54\x4f\x2d\x29\xb9\x0d\x13\x61\x10\xa0\xa7\xac\x67\x8a\x43\xf4\x02\xea\x01\xeb\x83\x15\xfe\x48\x1b\x54\x42\x8f\xd5\xab\x97\x87\xfa\xad\x9b\x02\x27\xf5\xd1\xa9\x8e\xf2\xb9\x02\x8c\xc3\xa1\x7e\x0b\xa4\xc8\x08\xd3\x9e\x1a\x9b\x6b\x95\x16\xb6\xa4\xa4\x71\xc2\xa6\xdc\x28\x34\xe3\xd4\xa4\xac\xf1\x6e\x81\x3d\x50\x08\x77\xc0\x17\x60\x78\xd8\x42\x93\x16\x29\xd1\xe3\x73\x19\x88\x2c\xad\xcd\x3b\xad\xc1\x70\x1c\x28\xcb\xd3\x4a\x24\x69\x72\x40\xcf\x0f\x1d\x98\xc0\x51\x67\x3e\x9c\xa2\xb9\x6f\x75\x15\xba\xc4\x77\x2d\x0c\x28\xed\x06\xd8\xb6\x22\xd1\xd9\x8d\x5a\x3c\x51\x99\x15\x4b\x43\xe6\x78\x72\x99\xad\x81\x8f\xe2\xf0\x4b\xee\xc0\x63\x13\x6e\x0c\xee\xf7\x43\x03\xac\xee\x70\x9c\x18\xc8\x61\xff\x9e\x1a\xd0\xd0\xa3\x41\x1c\xc8\xee\x0c\x0c\x28\xd7\xf7\x22\x06\x91\xc3\x78\x19\x03\xcb\x5a\x5d\x99\x60\x55\xab\x2d\xaa\x2a\x5e\x1c\xac\x51\x40\x31\xd2\x2e\x47\xe5\xdd\xdf\x6b\xce\x3a\xfa\x21\xfd\x8b\xdf\x70\x7c\xe6\xb5\x95\x3d\xf7\xad\x86\xd0\x09\xe9\x9d\x8e\xb2\x04\xed\xd5\x64\x54\xd2\xd5\xef\x94\xfe\x08\xa3\xe8\x63\x0a\x56\x84\x20\x63\xbe\x7c\x5b\x10\xc6\x3b\x3b\x09\x7c\x9f\x81\x00\xd2\x11\x0e\x2e\x6a\x8f\x21\xea\x58\xc7\x97\x51\x6e\x54\x40\x31\xf4\x07\x8a\x0f\x32\xe0\xf6\x8f\x6e\x9d\x7e\x90\x0f\xb8\x2c\x39\x5c\xc4\xb7\x19\x10\x27\x04\x5f\x88\x66\xc0\xb3\x2d\x80\x1a\xcd\x7a\xf8\x60\x03\x60\xcc\x06\xf2\xca\x73\x87\x63\xf2\x56\x62\x13\x71\xe8\x89\x79\xda\x6d\x5a\x14\x35\xcd\x58\x18\x5b\xdd\x03\xe9\x52\x14\xed\xe3\x29\x00\x2b\x11\x86\x61\x88\xe7\x04\x7d\x06\xf4\xa0\x91\xed\x1a\x87\xfe\x07\x3e\x56\xfb\x9d\x03\x5b\x7b\x40\x19\x27\x41\xfc\x02\xc1\x50\xc2\xeb\x48\xf0\x8a\xca\xc7\xcf\x48\x42\xe5\x7b\x5d\x1a\xfe\x50\x23\xf0\x98\x5e\xa5\x3d\x19\x5c\x91\x3f\x4b\x80\xcd\x93\x4c\x08\xd9\x2e\xa8\x87\x90\x2c\xdb\x3f\x3f\x62\x49\xf3\xac\x64\x19\xfb\x94\xc2\x9a\xe1\x01\x85\xe5\x95\x48\xc6\x62\x0e\x71\x48\x09\x92\x41\x9d\x70\x8a\xda\xac\xa6\x1c\x0d\x29\xe1\x08\x91\xf3\x64\xec\x32\xa3\x34\x49\xc5\xe7\x32\x42\x46\x4b\x8f\x35\x7a\x70\x8d\x2a\xf7\x44\x09\xc8\x9d\x00\xdd\xf6\x93\xa6\x62\x76\x63\xa1\xd3\x0c\x3f\x05\x4b\x0d\xe4\x73\xaf\x30\x8a\x47\x40\x79\x1d\x1d\x20\x53\x59\xd0\x51\xe6\x58\x8b\x1c\x1f\x1b\xef\xe2\x34\x41\xee\x42\x0d\xe5\x18\x2b\xa5\x1e\xa0\x98\xd4\xf8\xc5\x34\x3a\x95\x98\xca\x08\xbb\xae\x4a\xd1\x67\x67\x31\x18\x7e\xbb\x44\x85\x87\xc0\x01\x48\xd1\xe3\x8e\x77\x84\xf8\xe5\x37\xd2\x30\xdf\x3c\x52\x16\xf3\x94\x4f\x35\xfd\xc0\x54\x68\x49\xb1\xa8\xe9\x67\x11\xd0\x43\xb9\xd0\xb1\x7f\xad\x7d\x24\xc1\xae\x84\x28\xab\x6a\xfc\x50\x4d\xca\xa2\xe9\x9a\x73\x00\xaa\x40\x07\xcf\x2a\x94\x92\x1f\xba\x1f\xeb\x30\x1c\x4b\x9d\xe2\x33\xc7\xd0\xa0\x2d\x0f\x41\x74\x23\x80\x3f\x19\xe8\x69\xfc\xdd\x45\xd7\xe7\x50\x87\x45\xe7\xdc\xd4\xe3\x95\x20\x0d\x7d\xc4\x97\xf1\x77\x17\x9d\xa2\x03\xce\x92\x54\xec\x87\xb4\xde\xa5\xbb\x49\x04\x3f\x9f\xf0\xb1\xf0\x3e\xe0\x3e\x5f\x0c\x97\xcf\xe8\x03\x1d\xe1\x20\x47\xf3\xb5\x74\x43\x9a\x38\x52\x29\xf5\x60\x4e\xd6\x28\x90\xe9\xe7\x2b\xfa\x32\x07\xf8\xbf\x67\xe9\x34\x3e\x93\x72\xc2\x91\xdd\xcf\xae\xf7\x47\xf8\xd8\xf7\x41\x8d\xdf\x59\xc4\xc9\xe1\x39\xee\xcb\xcb\x69\x41\xe4\xe4\xa3\x8b\xc6\x53\xe3\xfc\x86\x3c\x7a\xef\x7b\x79\x71\x3b\xb6\xeb\xb8\xf4\x26\xf1\x6c\x1c\xfc\xe8\x83\xa8\x01\x9b\xc2\x0f\x0f\x5d\xbe\xfd\x78\x79\x49\xbc\x95\xe4\xfc\x7c\xc5\xd7\xe3\xbd\xc4\xb4\x93\x10\x96\xad\x1f\x2e\xb7\xd4\xf7\xdc\xc6\xb3\x77\x9f\x08\xac\x3d\xb7\x11\xdc\x67\xf1\x8f\x23\x1a\x17\x00\xc2\xef\x1a\xf8\xaf\xc6\x5b\xca\x05\xc1\xf5\x57\x6f\xd9\x7b\x4e\x43\xdc\xdb\xbe\xe3\x36\x0e\xef\x93\x99\x5c\xfa\xab\xe3\xe7\x92\x49\xdf\xf2\x1a\x45\x28\x07\x88\xc8\xb0\x09\xdf\xf1\xef\x6d\xfc\xa3\xbf\xec\x35\xfa\xc1\x7d\xe2\xa6\x2b\xac\x57\x7a\xef\xfe\x0c\xfa\xaa\xdb\x4d\x34\x26\x25\x9b\x7c\x6d\xa0\xf3\x07\x1b\xef\xd5\xfe\x81\x7f\xfb\x7d\x81\xd3\xf2\x0f\x72\xff\x0d\xbf\xed\x31\x5e\x5e\xb6\x67\x15\x1b\x0d\x84\x5a\xa8\x07\x71\xdb\x78\xa0\x6b\xff\x41\x5e\xa2\x01\x65\x42\x7e\x02\x69\xbf\xb0\xff\x78\x72\xc7\x7f\xdc\xf3\xc3\xfa\xe7\xf0\xa1\x0f\x5f\x1b\xff\xf9\x76\xff\xfe\xdb\xcb\x76\xe3\x3f\xb9\xfb\x9d\xdc\x87\x56\x38\x3c\xd5\x5a\xe4\x19\x4c\x77\x4f\xd0\xdb\xfb\x90\xcd\x3e\xb1\xb2\xe2\x15\xcb\xb8\xc0\x32\x1a\xf9\xe4\x77\x91\x7c\xc6\xc1\xf6\xd2\x49\xfc\xf1\xff\xa2\xbf\x7f\x53\xa4\x49\x91\x26\x45\x76\xdd\xbf\xe1\xef\xc7\x34\xa1\x7d\xfe\x92\x86\xbf\x7f\x53\x24\xd3\x6c\x36\x61\x82\xa4\xd3\x01\xfc\xf5\x08\xd4\x74\x33\x1e\xfc\x0d\x38\x12\xfc\xd5\xc4\xbf\x4d\x1f\x23\xf0\xbf\xfb\x0f\xf6\x25\x7e\xfc\x3f\x8d\xff\xfc\xff\xf2\xf9\xf7\x0d\x2a\x22\x83\x25\xfd\x4b\x66\x6e\x52\x2e\x42\xf1\x9b\x84\xff\x2f\xce\xdc\xf4\xa0\xba\x57\x54\x5d\xb2\xfb\xfb\xf7\x87\x7f\x7f\x48\xbd\xff\x60\x5f\x13\x28\x21\xc6\x2f\x5e\xd7\x7d\xf1\xe7\x2f\xed\xe0\xa5\xf3\xf4\xd2\x14\x2f\x83\xc7\xe1\xcb\x68\xf2\x32\xf1\x5f\x66\xad\x97\xd9\xf8\x65\xd9\x79\x49\xbd\x6f\x24\x7f\xdc\x27\xf2\x63\xe1\xbe\x1c\x04\xee\xf8\xe5\xb2\x2d\xc4\xcb\x71\x77\x38\x7c\xb9\x6c\x0e\x5a\x96\x95\xd8\x7b\x27\x71\xea\x62\x3a\x78\x29\x2e\xc7\x3d\x2b\xb1\xf5\x92\x7c\xf9\x61\xa9\xdf\x0f\x9d\x5c\xf8\x60\xec\x61\x2d\xa1\x47\x17\x6a\xd2\x68\xfb\xf7\x89\xd1\x30\xd1\x9a\x08\xeb\xe5\x65\xb4\x6f\xd1\x08\xdf\x60\x15\xff\x3d\xd9\xf9\x60\xdf\x52\xc8\xff\x10\xce\x90\xbb\xd5\x15\x90\x86\xf9\x9f\x86\x95\xf6\x2e\x63\x37\x1d\x39\x83\x1a\x63\x58\x47\x50\x8e\x65\xb7\x9c\x74\xae\xf5\xb5\x09\xeb\x23\xd7\xda\xd9\xe1\xa5\xdd\x75\x9a\x8d\xd6\x7d\xee\x52\x56\x00\xf2\x74\xed\xf9\xb0\xe3\x6f\xa6\x2d\x6b\x2f\xe1\xed\xec\xd8\x3e\xa0\x66\xaf\x64\x7a\xd7\xda\x83\xd2\xd3\xd9\x8b\xb5\xf8\x80\x9a\xbd\xd5\x98\xdb\xdb\x09\xc4\xb5\x5e\x65\x23\xd3\x8e\xe3\xef\x05\x7b\x99\x6c\x3a\x9b\xfa\xf4\xd5\xfb\xe0\xef\x25\x33\xd9\xcc\x6b\xd8\xa0\x1a\xf6\x08\xae\xf8\x54\xe9\x93\x73\x92\xa3\x10\x5e\xe0\xfa\x5e\x10\xaf\xb5\x5a\xa3\x76\x9f\x2a\x5c\x41\x81\x39\x0e\x3f\x5f\x39\x06\x99\x92\xdf\x90\xb9\x5f\x73\x79\x91\x20\x34\x7b\x15\x07\x36\xc2\x1d\x89\xb7\xf3\xbd\xfd\x6a\x85\x15\xd8\xc2\x1e\x0d\x5f\x9e\xdd\xec\x0c\xd8\x78\x1a\x28\x47\xad\xb6\xbd\x2d\x1a\x33\xef\xde\x71\x1c\x0a\x53\xcd\x1c\xac\xdb\x9e\x80\x92\xb2\xc0\xb7\xd1\x88\x01\x00\xc8\x5d\x58\x66\x5d\x37\xca\xd7\x8d\xc2\xcb\xbd\xa2\x28\x5e\xeb\x46\xa3\x30\x2f\xc0\x30\x6f\xfd\x37\xed\xf3\x3f\x19\xe5\xbb\x45\xaa\x33\x93\x69\x7c\x58\xa9\x5e\xcb\xb9\xf8\x2d\x4d\xcc\x5d\xaa\x97\x07\x65\x23\xee\x89\x65\xfb\x45\x5a\xb9\xc9\xd4\xff\xf3\xe3\xdd\xff\x6c\xc2\xe2\x85\x25\x9c\x4e\x7e\xb9\xdf\xd9\x32\x66\xd7\x91\xae\x77\xb1\xac\xea\x8d\x57\x8f\x03\xa8\xf7\x91\x51\xef\xa3\xdf\x54\xb6\x58\x7e\x95\x38\xd3\xa6\x08\x33\x8c\x9f\xd7\x64\xc8\x30\x0d\x0e\x8a\xd1\x2e\x3c\x5e\x53\x15\xbc\xc3\xd9\x2c\x0a\x8e\x14\xa0\x64\x74\x98\xf0\x7a\x6c\x7e\xe8\xf8\xed\x0f\xa9\x5c\xaf\x12\x89\x9b\x72\xfc\x0f\x9a\x12\xbe\xf9\x5f\x7b\x6b\xaa\x1c\x1b\x53\x85\xc2\x54\x59\x07\xab\x0b\x53\xa5\x58\xce\x02\x2b\x6f\xec\x63\x54\x4e\xa7\x99\x88\x95\x61\xa9\xa2\x73\x72\x68\xa1\x7d\x39\x81\x6d\x83\x75\xe5\x3a\x02\x1a\x96\xb0\xf4\x36\x76\x56\x4b\x94\x61\x6f\x85\x86\xc0\x27\x9e\xaf\x12\x56\xf6\x62\x8a\x72\x37\x94\x6d\x01\x0d\xa0\x19\xd0\xe2\x61\xd7\xe3\x9d\xc4\x01\xb7\xdb\x45\xda\xf0\xda\xb8\xcb\xd1\x8b\xc2\xdd\x89\xcd\xb7\xb1\x24\x8b\x71\xd5\xb2\xff\x80\x6d\xaf\xd3\x0c\x50\x0c\xc1\xd3\x67\xe2\x4a\x17\x87\x96\xdd\xe1\xbc\xb0\xe5\x2d\xdb\xf6\x7e\xdb\x32\xa8\xdb\x03\x4f\xcb\x70\x9a\x62\xac\x8b\xdb\xff\xde\x77\x22\x4b\xd9\x84\x70\xa8\xed\x40\x60\x1c\xea\x4c\x5b\xc8\x56\xd9\x40\x29\xbc\x3d\xcf\x11\xd9\xf4\x3b\x07\x9a\xeb\xd1\xdf\x84\x47\x7d\x60\x71\x63\x98\xd6\x9d\xe4\xa0\x30\xc5\x1d\x40\xa1\x46\x77\xf8\xb6\xc7\x98\xcd\xd8\x6c\x3a\x8b\xf0\x3d\xb8\x62\x8e\x6b\x39\x0f\xa7\x96\x80\x1f\x9c\x4a\xae\x66\x0e\xa8\x80\xf3\x9a\x03\x79\x4e\xec\xb4\x41\x29\x2e\x64\x21\xb7\x48\x82\xa1\xf6\x2e\x54\x2b\x4c\xed\x9a\x6b\x12\x18\x19\x60\x3a\xa0\x35\x8d\xa9\x77\x9f\xf3\x80\xcf\xea\x41\xe2\x3b\xe7\xb0\x05\x1c\x93\xe7\x5c\x75\x21\xd6\x68\x79\xc0\x16\xc0\x24\x78\xe7\xa9\x71\x77\x31\x5a\xe8\x5a\x58\x88\xef\x0c\xfb\x09\xcf\x42\xe6\x6b\xc7\x6f\x54\xee\x73\x01\x70\xf0\x9b\x87\xdd\xc4\xdf\x40\x64\xdf\xc1\xef\x17\x24\xb6\x1a\x2b\xe9\x20\x92\xee\x8c\xdb\x1e\x40\xf7\xbc\x46\xcd\xbf\x4f\x26\xdc\x1d\xd1\xc8\xbb\xf7\x56\xd6\x35\xea\x7b\x49\xad\xb1\x3d\xdb\xb7\x03\xbb\x69\xb7\xec\xae\xdd\xe3\xea\x0f\x9c\xab\x1a\x96\x39\x72\x9a\x7d\x1c\xa2\x89\x73\x8d\xb5\xcf\x4d\xb6\xb7\x47\xa9\xe3\xe7\x44\xad\x97\x98\x58\xcc\xd0\x4c\x9c\x0b\x6c\x8a\x3d\xc3\x5f\x8f\x5a\x03\x94\xce\x4b\x40\x53\x67\xf4\xcb\x25\xce\x1d\x86\x36\x2e\xa1\x57\x66\x90\x74\x56\x80\x11\x7f\xa6\x81\xa8\x75\xf1\xac\xcc\xb2\x0b\x8e\xdb\x4b\x40\xc7\xcc\x61\xf2\x96\x9c\x79\xce\x1f\x52\xd6\x63\xa7\xe0\x38\xb3\xbd\x9b\x5e\xa2\x64\x65\xab\x81\x80\x9f\xdc\x73\x6a\xb1\xe3\x1c\xa7\x16\x10\x58\x62\x60\xf9\x4a\x0e\xf3\x13\x85\xed\xed\x02\x7c\x18\xba\xa5\xe4\x14\x52\x64\x9c\x2f\xef\x26\x60\x57\x15\x9c\x42\xc3\x7f\xbe\xc7\x9a\x3b\xc7\xdd\xc4\xb3\x0d\x65\xc2\xc7\x72\xef\xf2\xdd\x97\x17\xea\xcf\x97\x97\x12\x36\x0d\x86\x88\x30\xe6\x76\x99\x5a\x6a\xe5\xbe\x8b\xc4\xc8\x1e\x41\xff\xee\xcc\x53\x0b\x2b\x37\x42\x97\x22\x3b\xce\x1c\x3e\x2c\x9c\x6b\x9e\x15\xb9\x91\x6a\x8d\xd8\xde\xdd\x23\xdc\x51\x63\x7c\x9f\xc5\x90\x2d\xb6\x33\x7b\x9c\x69\xd4\xc8\x03\x0c\x83\x98\x03\x3e\x32\xb2\x07\x56\x2e\x80\xea\x8d\xb0\x51\x94\x19\x77\x48\xeb\x7d\x90\x5a\xd8\x23\x6c\x5f\x02\x73\x2b\xd8\x92\xfb\xfd\x08\x7b\xba\x65\xc1\x9f\x9e\x75\xe4\xf4\x78\x6e\x40\xec\x08\x87\xca\xb3\xac\x23\xfc\x42\xd2\x19\xa4\x96\xf6\xa5\x48\x1c\xd9\x1b\x47\x0d\x0f\x66\xc2\x00\x6a\x6f\x1f\x21\xe0\xa8\x71\xe4\x61\x7c\x69\xd9\xdf\x39\x5e\xe1\x64\x35\x81\x6e\x6a\x50\x35\x9c\x1c\x4d\xfb\x08\x27\x87\x15\x52\xaf\xab\x9a\x9e\xe8\x58\x0d\xc1\xb3\x5c\x2d\x2e\xd1\xb8\x44\x2a\x78\x34\x14\x2f\x2f\x32\xec\x0e\x61\x95\x6d\x6f\xd3\x1a\x70\x9c\x52\x1b\xa5\x06\xe7\x06\x63\xb6\x47\xeb\x01\xfe\x7f\x8b\x51\x18\xa6\x42\x77\x2f\x29\x1a\x75\xef\x3e\xfb\x0e\xd2\xf2\xdd\xed\xed\x6a\x37\xf1\x34\x86\x41\x39\x01\x0c\xb4\xb2\x82\x22\x2e\xda\x7b\x8c\x23\x1a\x15\x68\x86\xa0\x69\x4e\x10\x58\x2e\xd0\xa9\xae\x2d\xc7\xc2\xb3\x01\x03\x38\x7f\xf8\x9f\xe2\x48\x40\xe8\xe1\x44\xe3\x1d\xff\x9b\xd8\x5a\xb0\x7e\x62\xa3\x0a\xc0\x43\x71\x77\x77\x81\xf0\xf4\x70\xa4\x01\xc7\xca\x79\x4e\xd0\x87\xc5\x9f\x6b\x39\xad\xbd\x16\x63\x65\x3d\x89\x0d\xfd\xe1\xbf\xbc\x00\x09\xeb\x59\x3d\x18\x4a\x91\x5a\x24\x9d\x16\xcc\x83\x9d\x84\xbf\xe7\xe3\x18\x64\xd3\x56\xd6\x87\xe1\x16\x38\xdc\xb4\x64\xed\x1e\x8c\xaf\x48\x2d\x11\x31\x2f\x11\x61\x70\x42\x44\x98\x03\x3e\xcf\x18\x28\xbd\x89\x1c\xd6\x5e\xa2\xeb\x08\x62\xfb\xfe\xfa\xec\x38\x00\xfb\xeb\x33\xce\xf0\x6e\x6a\xf1\x35\x80\x22\x5f\x5e\x20\xf4\xcd\x09\xf0\x7b\x08\x6f\x6e\x3b\xc9\x5d\xcb\xce\x7c\xdc\x25\x64\xf8\x65\xec\xe5\xd7\x00\xcb\x45\xf4\x25\xa2\xc3\x57\x15\xfa\x67\xcb\x56\xa5\x6d\x6f\x43\x16\x2e\xdd\xc1\xb8\xed\xbf\x38\x19\x33\x19\x42\x3b\xd8\xc6\x6f\xf4\x41\x42\xff\x0b\x27\xb4\x48\xb4\xec\x36\x2a\x12\x12\x98\x9a\x4c\x28\xbc\x24\x57\x0c\x16\xbd\x85\x65\x7d\xa2\xb2\xe2\x25\xc8\x0f\x72\x7e\x02\x27\x11\xc3\x0e\xa8\xcb\xb8\x0a\xcd\xed\x5d\x22\x81\xfe\x8b\x6e\xfa\x5e\xe6\x2f\xe8\xb8\x97\x44\xb4\xc4\xbd\x8f\xbb\x59\xfc\x1a\x36\x79\x83\xda\x8c\xdf\xf8\xc4\x9d\xe0\x10\x00\x8b\xdc\x65\x0c\x47\x62\x40\x78\x07\x87\xe4\x2b\xf5\x0c\xe6\xf8\x88\xdf\xbb\x30\xdb\x95\x87\x76\x11\x7a\xb2\x8b\x6b\x49\x7e\x24\x2c\xf2\x6f\x8a\x7f\x8b\x17\xf9\xed\x37\x45\x2a\xbc\x24\x0f\x8a\xea\x2a\x2e\x2d\x56\x82\x6a\x86\xea\x2a\x5c\xd8\x88\x61\xd3\x37\x2d\xd9\xb0\xe6\xf6\xdf\x61\x5f\xc9\x81\xdf\xfb\xeb\x93\xec\x2c\xb3\xcc\xbd\xcc\xee\xdf\xdc\x5b\x8e\x6f\x65\xbb\xce\xee\xe7\xbf\xec\xee\xf6\xa7\x2f\x7f\x59\x6a\x9b\xea\xe6\xce\x7a\xb0\x14\x60\x4b\x38\xc3\x25\xd6\x42\x8a\x29\x70\x53\x73\x51\xe2\x07\x1a\x4a\x9b\x82\x65\x13\x65\x85\xe5\xeb\x36\x01\x23\x50\x2b\x79\x0f\x16\xbf\xdb\x58\xdc\xdb\xb0\xd4\xdd\xd4\xd1\xf0\xb9\x30\xc4\xe3\x3f\x60\x5c\x9c\x93\x52\xb6\x8c\xc0\x1b\xf2\x15\x14\x81\xbb\xe4\xe4\x55\x45\x6d\x98\x5c\xae\x31\xb9\xa0\x83\x76\xae\x2c\xfb\xc2\x84\xe6\x25\x94\xb8\x8e\x0d\xfa\x22\x2c\x9c\xc0\x19\xe0\xe2\x05\x3a\x31\xa4\x5f\x91\x22\xc3\x46\x3a\xd2\xa1\x95\x9a\x74\x91\x14\x06\xfc\x07\xa7\x9d\x8b\x7f\x15\x1e\x5f\x2a\xa4\x95\x9a\x74\x69\xdc\x79\xf4\xb9\xdb\x5d\x1a\x2d\xf8\x5e\xbc\xd0\x35\xd9\xad\x90\x91\xeb\x86\xb4\xf5\x3a\xa2\x01\x48\xb8\x38\xba\x44\x1a\xf7\xdc\xff\xec\x66\x5d\x6b\x3b\xf9\xd9\xd8\xc3\x6f\x91\x49\x7e\xbd\x25\x16\xf6\x7b\x60\xb2\xb0\x06\xd2\x9d\x24\x6e\xd6\xcf\xea\x42\xea\x56\x2c\x66\xa1\xcb\x55\x60\x7b\x28\x84\xbe\x34\xbc\xd7\xbb\xc4\x5d\xcd\xbe\xad\x59\xb9\xbb\x95\x12\x65\x09\xc0\x34\x20\x7e\x63\x09\x9d\x2b\x8b\xb0\x31\x89\xa5\x41\x20\xa0\xaa\x34\x93\x33\xfa\x2e\xdb\x44\x69\xb7\x4e\x54\xc4\xea\xee\x89\xac\xda\x38\x91\x69\xbd\x4b\x7c\xe7\x3a\x7c\x5f\x5f\x07\xdb\xa7\x5a\x5c\xd2\xee\x91\xa6\x8f\x73\xb9\x90\x84\xac\x22\xa4\x1b\x9f\xde\xaa\x85\xb9\xa0\x51\x75\xa5\x5c\xc2\x0d\x9b\xb2\x7d\x3f\x05\xae\xf3\x73\x36\xcd\xb1\xe9\x27\x58\x1f\x2f\xdc\x18\xa8\xc9\x56\xcd\xbe\x83\x9a\x6c\x51\x4d\xf0\xd5\xe6\x37\x64\x84\xef\xa7\xaf\x12\x69\x6d\x75\x49\xbc\x71\xde\xea\x3a\xaa\xb4\x67\x67\x80\xb5\xb5\x65\x25\x88\xd0\x07\xb4\xe4\x28\x73\xd3\x11\xf5\x44\xa0\x72\x59\x39\x97\xe3\xd0\x86\x68\xb1\xcd\xb7\x0b\xa4\xd2\x90\xb6\x73\xd6\x26\x2e\x00\x59\x88\xfd\x66\x11\xb2\x71\x46\x39\xd6\xab\xd1\xb9\x90\x9f\xc6\x55\x6c\x7f\x42\xda\xe2\xfe\x07\xe8\x4c\x0e\x98\x95\x2f\xbb\x1c\xcb\x84\xaa\x3e\x53\x76\xad\xff\xaf\x66\x83\x5b\xa7\xd9\xe0\xd6\x7f\xdd\xbd\xd0\x13\xc4\x54\xe7\xb8\xbf\x02\xe4\x34\x01\x16\x20\x93\x0d\xbf\xb2\xcc\x26\xb2\x08\x40\x8a\x88\x53\x68\x22\x67\x80\x11\x64\x10\x72\x4d\x87\x2b\x04\xfb\x06\x70\x5e\x90\x45\x46\x97\x10\x5d\x52\xa9\x2d\x87\x18\x1f\xbb\xe9\x34\x93\x2d\x44\x81\x0d\x1b\x92\x80\x77\x50\xa5\xdb\x81\x65\x73\xb5\xa8\x03\x57\xa7\x63\x8f\x65\x04\x64\x9a\x1a\xe3\x47\xa0\xde\xef\x44\xe3\xee\xf1\x1e\x19\xa5\x73\xfc\xc9\x64\x76\xbf\x02\xe3\xd1\xc3\xa4\xcc\xee\xc7\x6f\x1c\x96\x64\xf7\x5d\x26\x37\x79\xea\x4c\xbd\x76\x82\xa1\x3f\x3d\x01\x4c\x5f\xe6\xef\x2c\xfd\xee\xa6\xf9\xf7\xcb\x47\xfe\xcd\xfc\x8b\x7f\x3f\x49\xf8\xc7\xcf\x12\x4f\xc2\x3f\xfe\x25\xd3\x25\xfc\xa3\x84\xef\xee\x7e\x92\x05\x65\x64\x41\x9f\x24\x20\xb3\x2b\x31\x65\xfc\xa3\xfa\xd2\x17\x99\xf3\xb3\x2c\x4a\x65\xf8\xf8\x45\x95\x20\x13\x32\xf2\x9b\x1f\xff\x8e\x7f\x6b\x37\xab\xdb\x48\x80\xb4\x8a\x17\xba\x39\xe9\xb3\x23\xab\xf4\x05\x7f\xfd\xf5\x8d\x3a\x00\xba\xeb\xef\x8f\x5f\x29\xf8\x6a\xf0\x72\xfd\xa2\x08\x99\x39\xea\xeb\x77\x09\xdc\x87\xca\xcc\x4a\x76\x06\xb0\x33\xa9\x1e\x4d\xe3\x42\x9b\x43\x42\xa0\xb6\x36\xaf\x8e\x93\x88\x96\xdf\xf6\x3b\x3f\xec\xf9\xc7\x0e\x6c\x16\x24\x84\xfb\x75\x14\xfc\x58\x6e\x03\x40\xe6\x5f\x0e\xea\xd1\x33\x7f\xd3\x0f\x96\xf5\x25\x03\x41\x2b\xcc\x0a\x98\xf8\x6d\xe0\xe5\x3c\x4b\x0d\xa0\x1c\xbc\x5d\x35\x6a\xbb\xba\x13\x77\x55\xb7\x7f\x91\xdd\x9d\xf9\xfb\x2f\x15\x50\xfd\xf9\xf7\xbf\x54\xe0\x6f\x85\x9c\x56\x81\x78\xf6\xdd\xdd\xb0\x6f\x5f\xa1\x2a\x79\xae\x8a\xeb\x38\x62\x75\x5e\xa9\x39\xf5\x31\xab\x3b\x48\x4d\x1a\x09\x28\x77\x5f\xcd\x9e\x32\xfa\x9d\xe2\xd8\xdd\x9f\xfe\xfe\x8a\xa2\xfb\xe7\x7f\xc1\xf4\x7d\x79\xf9\xf2\x17\xc5\x32\xe9\xbf\x28\xfa\xd7\x67\x8a\x7e\x49\x53\x0c\xfb\x25\x6d\xd4\x24\x1d\xaf\xc9\x47\xd9\x8a\xbf\xd4\x5c\x4b\xab\xa6\xa7\x55\x67\x64\x54\xd3\x33\x99\x58\x87\x7d\xfe\xf2\x56\xc7\xfd\x95\xf9\xdf\x75\x60\x7c\x8c\xd2\xe1\x60\xe9\x9a\x47\xa7\x29\x74\x76\xb8\xa9\xfb\xaa\x6b\x40\xb4\x17\xce\x80\x88\x80\x16\xd9\x70\xca\x94\xbb\xd6\x34\x1b\x6b\x3a\x2c\x64\xe1\x7c\xc9\xe4\xdc\x71\x20\xba\x9b\x53\xd5\xed\xc2\xe8\x72\x2e\xe9\x67\x2c\xe3\x5f\x19\xbd\x54\xfe\xfe\x57\x4e\xf5\x84\x06\xfd\x95\x93\xf4\xe1\x63\x08\xfb\x92\xd3\xeb\x51\xc2\xbe\xc4\x16\x22\xa6\xc5\x57\xa2\x30\x37\x83\x40\x92\xf5\xcb\xa9\xda\x65\xe5\x0e\xdb\x66\xea\x7b\x3d\x37\x81\xd5\xa7\x04\x0c\x3f\x3f\xc6\xee\x6e\x6f\x13\xec\x69\x9e\x20\x8a\x1f\xd4\xed\xcb\xa9\x95\xbb\x71\x02\xa4\xf9\xb9\x9b\xd4\x23\xeb\xc1\x6e\x52\x0b\x41\x3a\xbe\x9b\x54\x73\x4b\x81\xbe\x7b\x42\x07\x8b\x0e\x4c\xe5\x9b\x14\x3e\xd2\x43\x01\x3f\xed\x24\xf1\x17\x9f\x4c\x26\x00\xbe\x73\x43\xf9\x8f\x5a\xce\xdd\x21\xfc\xba\xde\x5b\x5b\xfa\x51\xeb\x15\xd2\x9f\xe6\xc6\x7e\x23\xb7\x2c\xc8\x2b\x30\xed\x4d\x6e\xe0\x11\x53\xab\x4f\x91\x9c\x43\x18\x29\xa3\xf9\x8f\x5c\x44\xf7\xf8\x57\x48\xd8\x5a\x42\xab\x9f\x44\x76\x3d\x59\x8f\x9b\x82\x23\x35\xa1\xe3\xa2\xe3\x22\xde\xf4\xcd\xd6\xb4\x83\x57\x43\x4d\x37\x0c\x77\x21\xe8\x34\x6b\xda\x1e\x0f\x9f\x36\xfb\x09\x7c\x86\x92\xdd\xd1\xd2\xcd\x05\x7e\xbc\x8b\xcc\xca\xd4\xa3\x9a\xe4\x73\x43\x3e\x4e\x88\x16\x26\xc0\x8b\xa7\xfe\xb0\x72\xaf\x37\xa9\xf3\x37\x59\xa3\xe2\x6b\xee\xf0\x29\x71\x63\xaf\xf4\xe3\x4d\x41\x8e\xfb\x4d\xa1\x71\xf3\x88\xb2\xb3\x6c\x8c\x04\x8f\x8b\x12\x2c\xf6\x28\x7e\xb5\x0b\x62\x36\xab\xf0\x4b\x09\xeb\xd5\xc2\x11\x07\x76\xa0\x93\xdb\xb8\x81\x34\xf3\xfb\x48\x9a\xe5\xc7\x65\x59\x87\x77\xa8\x89\xd2\xf0\x47\xb3\xcd\xbd\x5e\x30\x96\x0f\x1a\xe2\x93\x83\x93\x60\x2a\x75\x46\x9b\xec\x43\x7f\x73\x3a\xc6\x2b\xba\xf4\xc8\x14\xb4\x39\xec\x88\x3f\x14\x0b\x19\x48\x2d\x01\x89\x40\xf2\x03\x9c\x04\x33\x4f\xd6\xa0\x1d\xa4\xfa\x30\x78\xc5\x8a\xe4\x56\xfb\xc2\x7e\x97\xa6\x5d\x44\x8d\xb5\xa5\xc2\x12\xb5\x32\x61\xd4\xbc\x20\x54\x3b\xdf\x55\x3a\x17\xa8\xd0\x4f\x54\x31\x3e\xba\xf7\xaf\x1e\x3e\xfe\x95\x00\xce\xfc\x15\x0f\x84\x70\x2d\xb9\x8d\x89\x7f\xef\x38\x57\x42\xe4\xa0\xa7\x01\x95\x95\x89\x6e\xe3\x39\x0f\x5b\xa6\xdb\x38\x5c\xde\x37\xea\xbe\xca\x09\x3b\x24\x11\x98\x57\xe1\xf8\x39\x55\xe8\x2f\xaa\x91\x33\xd3\x9a\x53\xc1\x89\xcf\x50\xfd\x57\x22\x68\x66\x72\xbd\x14\xa6\xe6\xd4\xda\x81\x85\xb7\x97\xe8\xb8\xb2\x9f\x50\x28\xbb\x68\x5b\x76\xbb\x2f\x01\xf8\x0d\x39\xcc\x88\x7c\x79\x20\xfb\x8f\x3a\x59\x0e\x2a\xae\x61\x3e\x13\x49\x3b\x1b\xf3\x8e\x4a\xb8\x29\xec\x25\x4e\xa6\x09\x19\xb6\x27\xfb\xfc\xf5\x02\x56\x3c\x43\x61\xcb\x56\x13\xee\xf4\x19\x66\x96\xfc\x0e\x20\x24\x90\xaf\xbd\x81\x89\x15\x59\x8f\xc6\x3c\x7a\x79\xa1\x50\xa3\x09\x33\xf2\x27\x9e\x2b\x67\xf7\xa1\x71\x64\xae\x97\x15\xaf\xc6\x66\x2f\xdb\x6f\x8c\xba\x67\x56\x3c\x93\x0b\xeb\x3b\x2e\x86\xf5\x1d\x17\xb1\xbe\xb3\x0e\xc7\x7a\x81\x00\x19\x2d\x56\x6b\x58\x0f\x66\xad\x01\x07\x77\x11\xb5\xfd\x60\xf5\x01\xb4\x96\x5c\x61\x97\x53\x18\x28\xe3\xde\x8d\xfc\xe2\xbe\x27\x40\x7c\xa2\xf2\xb3\x0a\x90\x88\xf5\x7c\x38\x48\x28\xe3\x3a\x41\x5f\x8d\x63\xff\x07\xee\xfd\xf0\x49\xc8\x14\x59\x79\x91\x71\x6d\x59\x39\x63\x5c\x33\x94\xe1\xf0\xee\x0d\x4a\x41\x5d\x5b\x29\x11\x12\x8c\x88\x89\xa5\x93\x1f\x0f\x21\x19\x96\x7b\xff\xc7\x4a\x3b\x8d\x91\x69\x55\x8c\x91\xc1\xe2\xf2\x22\xda\x2f\xa8\xdb\x13\xe3\xfb\xdc\xa8\xa7\x2a\x47\xa7\xaf\x92\xfa\x52\x84\x07\xcc\x83\xd5\xfb\x4e\x61\x41\x8c\x92\x32\x9f\xd3\xdf\x70\x10\x93\x72\x0a\x4a\x64\x20\x4a\xdc\x25\xf8\x2e\xbf\xf9\xb5\x5d\x60\x10\x25\x4b\xaf\x11\xf1\xf3\xc8\x4d\x8a\x46\x80\x24\xce\x16\x8d\x25\xfe\x52\xfe\xe7\x58\x6d\x15\x59\x80\xcd\x4b\x9d\x2e\x18\x64\x06\x52\xc9\xc6\x8b\xdf\xb9\x7d\xe7\x48\x9b\x87\x80\x16\x32\xd3\x78\x58\xfa\x10\xb6\xdf\xc1\x86\x1b\x6d\x71\xa8\x9d\x95\xf3\xf7\x55\xf1\x24\x54\xc1\x77\xc0\xc5\x32\x3c\xf7\x76\x9b\x23\x02\xe1\xa8\x28\x22\xf6\x0b\xd7\x78\x3a\xd5\xdc\x7a\x79\x69\xdc\x47\xe8\xbf\x92\x0a\x1d\xc7\xe1\x4a\x91\xac\x07\xcc\x24\x0c\xbd\x39\xf0\x41\x3d\x15\xa4\x0a\x2b\xfc\x44\xea\x3b\x2c\xa1\x27\xbd\xd2\xc3\xf0\xb8\x68\x01\x8f\xd2\x0b\xe4\xcb\xc4\xa9\xc7\x48\xac\x1d\x44\xa2\xcd\x2d\xa3\xe6\x4d\x53\x28\x9d\x7e\x71\x3e\xe5\x24\xe5\x22\xa6\x9e\xf4\x01\x39\x60\x47\xb4\xfe\x00\xf9\x94\x66\xdd\x0e\xea\x56\xee\xe2\x09\x42\xeb\x0f\x9d\x65\x19\xcc\xe8\xc0\x8e\x75\xb0\x88\xa3\xaa\x55\x0a\x1f\x12\xfa\x43\x04\x39\x4f\x58\x06\xe9\xc3\x03\xeb\x15\x09\x38\x9c\x1b\xcf\x72\x6a\x00\x7b\x13\xcb\xec\xd2\x59\xcc\xe5\x81\xcd\xe6\x3c\x29\x81\x1b\x2a\xcc\x3c\x58\xa9\xae\x5c\xa4\x48\x7c\x5d\xa2\xbb\xaa\xd1\xf8\x49\xa9\x56\x99\x7e\xe1\xdf\xd9\x93\xa0\x8c\x8c\x9b\x89\x0c\x7b\xab\xae\xd4\x43\xbc\x51\x3b\xa8\xd4\x17\x7b\x17\xdd\xc4\x35\xe9\x01\xb3\x10\xb2\xa8\x01\xaa\xff\x18\x2f\xf5\x90\x38\xb5\x7f\x92\x3b\x89\xec\xd1\x02\xc9\xa8\x64\x7c\x5c\x25\xaf\x67\xec\x8c\x84\x9d\x0a\x82\x4d\xba\x39\xb5\xa3\xfa\x79\xa4\x7f\xd8\xb3\x30\x51\x25\xec\x74\xcc\x2c\x64\xab\x6e\x37\xeb\xbc\x29\xb7\xeb\x4e\x03\x98\x48\xa7\x25\x99\xc9\xa0\xc5\xfc\x62\xdf\x05\xa6\x44\xbd\x31\xa7\x5c\x23\x22\x53\x71\x7d\xe2\x7c\x4e\x23\x93\xd8\xd9\x72\xe8\xe7\x4d\x46\xef\x0a\x97\xab\x9f\x8f\xd1\x16\x6a\xb3\xaa\x74\x4a\xf8\x3e\x46\xeb\x53\xe8\xa2\xaa\x6c\x78\x77\xa8\x49\x3b\x27\x1c\xc8\x84\xe6\x55\x2c\xe1\xf4\x80\x13\x82\x40\xc4\x52\x6a\x2d\x4e\x29\xcd\x62\x09\x6a\xd3\x35\xca\x22\x9a\xe9\x07\xf8\x88\x52\x9c\xb2\x08\x4b\x56\xd8\x7e\x0c\xc9\x9f\x2d\x2b\xdf\x38\x73\xef\x95\xa4\xa2\xed\x4d\xe4\x3c\x82\xa6\x5d\xc1\x5c\xb2\x3d\xe8\x23\xa4\x30\x78\xca\xb9\xb3\x63\x19\xa5\xa8\x2e\x68\xdc\x41\x29\x91\xf9\xf2\xa8\xc8\xc4\xe9\x14\x26\x13\xf4\x8a\x90\x5d\x02\x99\x08\x74\x80\x20\x6e\x80\x02\x41\x4f\x08\xd5\x0d\x0a\x06\x7d\x20\x64\x07\x28\x10\xb4\x3e\xcc\x09\x7c\xe9\xe9\x38\xd2\xe2\x47\x49\xff\xb0\xe6\x4c\xad\x27\x99\x08\x82\xd1\x42\x5c\x29\x30\xaf\x2e\x6a\xa4\xe9\x5e\xc3\xd3\xaf\xe2\x76\x7b\x74\x2c\x84\x54\xab\xfa\x64\x10\x8b\x1c\x1f\xdf\xcb\x59\xaf\x0f\x42\xdd\xc6\x3e\x76\x30\xfc\x96\xbc\x7b\x26\xfe\x95\xf9\x9a\xc9\xb6\x08\x6b\x4d\x48\x17\xff\x7a\x6b\x46\x02\x46\x63\x00\xbc\x5d\x6e\xe3\x74\x64\xf2\xdc\x31\x1b\x88\xf9\x9e\xa2\x12\x7b\x9f\xb2\x19\xde\xf3\xb7\xaa\x7b\x1f\xb3\x1a\xbc\x9b\x4d\x13\x87\x1d\xdd\xae\x91\x21\x22\xa1\x0c\xe0\x9a\x2a\x47\x14\x1d\xb4\x15\x4f\xf2\xf7\x96\x9a\x2e\xd0\x3a\x9a\x21\xed\x7a\xc3\xbd\xcf\xb9\x30\x45\x90\xdc\xd3\x00\x68\x5c\xdc\x89\x8e\x97\xf7\x09\x20\x2b\xb9\xad\x4e\xa2\x5d\xe7\x69\xfb\xf2\x02\x99\x8a\x8a\xf6\x8b\xb0\xa7\x61\xe9\x32\xdf\xd9\x38\x44\xcd\x5d\xa7\x9e\x30\xe6\xbf\x5a\x64\x15\x11\x5f\x32\x6a\x95\xed\x9b\x29\x0f\x2a\x73\xc8\x48\xc5\x18\x0c\xd8\x86\x1e\x74\x9d\x72\xba\x5d\xba\x3a\x48\xf9\xa0\x89\x2e\x36\x51\xae\x02\x17\x9b\xb5\xbd\xcd\x1b\x1b\x35\x11\xd9\x72\xd5\x44\xca\x78\x20\x60\x4e\x74\xf9\xe3\x18\xa1\xf9\xfb\x46\xed\x4f\xdf\xac\x7d\x59\x2a\xf4\xa5\x31\x56\x2e\xed\x50\xb5\x1a\x07\xc8\x4d\x28\xfe\xad\x73\xe6\xe0\x67\x79\xe0\xfa\x3f\xf4\xc0\xe1\x54\xba\x8c\xb0\x8c\x6a\x07\xc4\x2a\x3b\x8e\x22\xb4\xb0\x84\xcf\xa5\x55\xa6\x6c\x8b\x2a\x57\x72\xc5\xa9\xe3\x27\xb1\xc7\xe9\xb2\x8d\xb6\x9a\x48\xb0\x11\x94\x17\x11\xba\xd2\x58\xe4\xef\x13\xae\x64\x20\x4e\x4f\x13\x78\xd0\x14\x66\x85\x98\x95\x8d\xb5\x4a\xf6\x58\x61\xee\x48\xc5\x3c\x52\xdd\xdd\xb7\x96\xc0\x29\x89\xcc\xf3\xfd\xb7\xd2\x83\x16\x8d\x30\xba\x61\x5f\xd9\x85\xb7\xaa\xf2\x13\x30\xdb\x1c\xd5\x5e\x68\x2e\x6f\x32\x32\xbb\x6a\x3e\x6c\x24\x7a\x0e\xa8\xe6\x84\x3d\x05\xc9\x96\xe6\x23\xb7\xd4\x4e\xbe\x05\x60\x06\xaa\x9e\x32\xb5\xc3\x63\x45\x17\xf9\x20\xbd\x8c\x0b\xe5\x0a\x66\x3e\x6c\x88\xa9\x05\xd0\xd8\x92\x7f\xbf\xe3\xa5\x16\x0c\x58\x02\xa0\x4c\x80\x25\xd0\xb9\xee\x70\x0d\x69\xea\xd5\x65\xcf\x13\xbb\x99\x53\xb5\x76\xc3\x15\xe3\xbe\x33\x9b\xa9\xfa\xdd\x95\xe3\x57\x98\xc3\xf0\xa9\xbe\x07\xb9\xe1\x96\x23\x30\x67\x6c\xc6\x53\x23\xc4\xe8\xd7\x27\x30\x94\x13\xa5\xc3\xb0\xc7\xe1\x56\x10\x51\x81\x2b\x4e\x0b\x24\x53\x25\xb2\xbe\x13\xaa\xeb\x80\x7c\x5a\x78\x3a\xf8\x10\xdc\x87\x67\x07\x5a\xc6\x95\x10\xe2\xa6\xa0\xd1\x41\x4c\xde\x19\xc7\x37\x1f\x9c\xf9\xbc\xa0\x4b\xb3\xd5\xd1\x86\xae\x10\x6b\xfb\x88\xb2\x99\xd4\xec\x9d\x03\x79\xc2\x79\x9c\x33\xf7\xc1\xd3\x44\xc6\x20\x41\xff\xa8\xdf\x84\xee\x61\xec\xb2\x9c\xee\x32\x92\x41\x4f\x4f\x9d\x35\xac\x32\x2a\x49\xf7\x12\x92\xe8\x2c\x5c\x36\x36\x20\x23\x87\x7e\x9d\x58\x2c\x0c\x0e\xea\x7a\xea\x19\x1d\x3e\x31\xce\x1c\x4c\xca\xbc\x4a\xb6\x80\x5e\xb9\xbc\x35\xaa\x75\xee\xc2\x94\x75\x40\xec\x41\x0a\x05\xd2\x00\xf4\x79\xf3\xea\xb7\x13\x0d\xca\x0d\x01\xee\xe3\x3d\x4d\x33\x8f\x76\xc0\x35\x6b\x88\x74\x80\xb6\x22\xc3\x76\x48\xb1\xec\x77\x21\x11\xa1\x72\x88\xa0\x86\xdb\x37\x15\xbd\x17\xa3\x15\x59\x49\x52\x2d\x66\x7a\x2a\x51\x41\x32\x4a\xb8\xd5\x82\x60\x43\xb3\x4e\xa4\x06\x38\x37\x58\xc0\x8d\x49\x63\xb1\x4d\x5f\x17\xe1\x9a\x95\x74\x65\xed\xd4\x34\x90\xcd\xb4\x8d\xca\x85\x36\x73\xa4\x1b\x16\x30\x55\xa0\x12\xb7\x53\x34\xe7\x9b\xe3\xa9\xb4\x26\x77\x86\xe1\x4d\x97\x70\x77\x51\x9e\x54\x14\x5e\x20\xd1\xa2\x39\x26\x90\xa6\xc1\xdc\xe2\xc1\x83\x12\x3a\x5b\x96\x91\xb7\x23\xbf\xb3\x55\x55\xdf\xd9\xaa\x22\x96\xa6\x79\x38\xba\x85\x15\xb1\x5b\x6d\x5a\x0f\xe6\x0c\x6f\x9c\x3f\x6b\x7d\x9d\xc0\x6a\x74\x0d\x0e\x25\x67\x36\x39\x22\x71\x5d\x31\x6b\x54\x30\x76\xa0\xf0\xd4\x46\x92\x85\xef\xd1\x43\x5a\xe0\xe5\xfb\x75\xfb\x7b\xcd\xca\x6d\xf4\xd7\x9f\x00\x5a\x3f\x5d\x87\x0e\x83\x61\x2a\x5f\x13\xff\xe5\x39\xde\x1e\x2e\x87\xfd\x5e\xc2\x23\x9b\xab\x4c\xda\xf6\xe8\x0c\xdf\xc3\xe3\x79\xf8\x5b\xb9\x07\x18\xaf\x19\x40\xca\xb0\xab\x06\x80\xe0\x59\x1e\xd5\xf4\x16\x3e\xfe\xc9\xf6\xa0\xfc\x2f\x16\x1f\x9c\xae\xa6\x7c\x36\xab\x3f\xa0\xde\x8d\x9c\x30\x7f\xc4\xca\x0f\xea\x74\x82\x3c\x78\xab\xee\xac\x9b\x53\xd2\x0e\xda\xc1\xe5\xde\x3a\x27\xf6\xe1\xab\xaa\x36\x26\xce\x2e\xa4\x66\x28\x35\x52\xa3\x61\xdd\xb0\x10\xa6\xe3\x5c\x1e\x90\x31\x99\x63\xba\x8e\xc8\x7a\x4a\x7f\x8c\x6f\x9e\xbb\x4a\x31\xed\xc9\xc0\x25\x1b\xd7\x0e\xa9\xe6\xee\x70\x95\x7c\x02\x86\xcc\xff\x08\x15\xea\x87\x8a\x85\xd7\x1c\x67\xba\x9a\xbd\xa9\x21\xdf\xbb\x0e\x84\x52\x61\x64\x65\x69\x2a\xdb\x8a\xea\x27\xf5\xa8\xd6\xd1\xa3\xa3\xea\x8b\xc4\x0f\xaa\xe7\x48\x8a\xf2\x78\xf9\xf2\x12\x56\x41\x82\x42\xfb\x0a\x06\x98\x8a\x8a\xba\x2a\xbb\xef\x83\x78\xf8\x7a\xe3\x8c\xa4\x78\x78\xf9\xb0\xda\xd2\xbe\x8f\x6c\x28\x36\xac\xbd\x88\x68\xb2\xb5\xc6\xe0\xf2\x21\xf1\xc8\x13\x98\x15\xd3\xfe\x3a\xae\x0a\xb1\x58\x43\x75\x51\xb1\xd1\xa3\x5b\xf6\xe7\x22\x2b\xec\x65\xd6\x7d\x65\x3d\x55\x61\xb4\x72\xba\x8d\xe6\x68\xf1\xdc\x57\x65\x95\x3b\x83\xd9\x33\x59\x10\x98\xdc\xac\x67\xd7\xdd\xac\x6f\x2f\xb2\x01\x94\xd8\x94\x25\x2e\x9a\x6b\x4b\x44\x03\xb7\x68\x99\xe3\x92\x2c\xf3\xa1\x08\x65\x76\x8b\x50\x66\xa5\x03\x65\x1e\x74\xa0\x4c\x81\x85\xd6\xc7\xd9\xa6\x3d\x70\x45\xb6\x45\x65\x87\xa7\x09\x63\x2d\xfd\xc3\x16\x93\x7e\x47\x57\x71\x50\x97\x8d\x5b\x16\x76\xdd\xe1\xfd\x1e\x90\x2b\x20\x18\x6e\x23\x7d\x9f\x5a\xd8\xf4\xb3\xb4\xb2\x02\x7a\x29\x06\x83\x42\xd4\xee\xe4\x3b\x99\x9c\xff\x15\xcb\xca\xed\xec\xf8\x16\xd0\xc3\x51\xc2\x6b\xf8\xc9\xcc\x7d\x23\x83\x39\xc2\xf0\x12\xc3\xf7\x5c\x8e\x0a\x2d\xe9\xbe\x0f\x15\xec\x63\xc1\x7c\xd8\x86\x65\xaf\x94\x4b\x95\x30\x71\x5f\xcf\x9e\xa2\xa2\x53\xb4\xa7\x8a\xb2\xf7\x59\xa5\x63\x5e\x24\x90\x33\x40\xce\x74\x39\xd2\x07\xf1\x91\x0e\x29\xf2\xa4\x1e\xb7\x49\x1e\xd5\x73\xe9\xaf\x02\xea\x06\x24\x1a\xba\xd5\x43\x9e\x19\x36\x16\xaf\xe1\x92\xe2\x37\xb4\x50\x26\x0e\x64\x8a\x36\xce\xd7\x33\x91\xcd\x1f\xe2\xdb\x26\xd9\x4e\x19\xdf\xa4\xc8\x4e\xf6\x8d\x89\x3e\xd5\x83\x23\x0f\x09\x3d\x79\x48\x98\x3f\xa4\xf5\x2f\x76\x60\xe5\xd3\x01\x00\x1f\xf7\x4d\xf6\x11\x9c\x8c\xc0\x3a\x65\x86\x7d\xd8\x25\x74\xf8\xe1\x44\x75\x1a\x08\x89\x4e\x47\xc8\xf3\xc9\x9f\x74\x77\x16\x66\x4e\x30\xf0\xb3\xc2\x68\xed\xac\x1e\x5a\x6c\xf8\x64\xd8\xed\xc1\xea\xcd\x1f\xee\xd1\x27\x1d\x67\xb2\xbf\x87\x75\xb2\x72\xb1\x8a\x42\xb2\x36\x8e\x56\xd5\x91\x80\xc3\x07\xb6\xbc\xfd\xd5\xb1\xe4\xdc\x54\xec\x8d\x85\x22\x59\xa3\x92\xa2\x78\x4f\x53\xa6\x8b\x14\x39\x6b\x3a\x07\x35\xd8\x4b\xa3\x8b\x37\x42\x45\x4a\xac\xac\x94\x9a\xf9\x28\x22\x1b\xfa\x34\x04\xcd\xe7\xfb\xdc\xc5\x03\x4c\xad\xcc\x7d\x0c\x29\x60\x62\x92\xa3\x5f\x54\x7b\xaa\x61\x0d\xe8\x56\xda\x56\x11\x41\x2c\x56\xcd\x99\x06\xdf\x25\xe6\x75\x7b\x36\x35\xa6\xda\x13\xd2\x2f\xb7\x93\xfa\xf1\x83\x9d\x8e\x5f\x9b\xef\x30\xe4\xa5\xb7\x95\x73\xe9\x2e\x49\x1e\x67\x4d\x8a\xe8\xa6\xf3\xc7\x0f\xe7\xbf\xcc\xf7\xf2\x22\xef\xab\x38\x97\x23\xb1\xf3\x5f\x16\xd2\xe8\x92\x95\xec\x7f\x99\x7b\x67\x27\xa7\xc7\xf8\xc6\x99\x13\xc9\x1e\x09\x58\xad\xb0\x6d\x6e\x5c\xc8\xc0\x4d\xea\xb1\xef\xac\x8e\x8b\x27\x99\xb6\x73\x9e\x33\x1e\xec\x69\x89\x5e\x2b\xba\x45\xc0\x5c\xf0\x48\xba\x24\xa6\x85\x9e\x83\x81\x8f\xaf\x39\x53\xf9\x24\x75\xfd\xcd\xde\x6c\xd2\x8e\x9a\xdd\xcd\xc5\x1a\xea\x31\x69\xcb\x13\xcb\x28\xb6\x39\x01\x69\x03\x58\x49\xc4\x8c\xb9\x79\x9c\x6b\xba\x49\x8d\xde\x3c\xea\x1d\x93\xfc\x1b\xd9\xb0\xd9\x46\x0b\x4f\x1b\xe8\x7e\xca\xb0\xbe\x27\xb0\xf5\xae\x95\xbd\xec\xcb\x4d\x0b\xb2\x5c\xcd\xd6\x09\x1e\xd7\x74\xcc\x44\xe7\xdd\xa3\x11\x8c\x4a\xb1\xdd\xe9\xf9\xb1\xb2\x81\xd8\xab\x4e\x46\xa9\xc9\x55\x9f\x61\x85\x91\x0b\x7b\xbc\x3c\x46\xf0\x1c\x92\x2f\xf8\x98\x01\x22\x39\x52\x04\x35\x80\x95\xf5\x58\xf8\x19\x07\xe4\x50\x72\xf5\x23\x48\xc1\x18\xb9\x80\x3b\x09\x5e\xf3\x40\xfe\xfe\xd8\x5b\x51\x68\xc2\xd7\xd4\x1d\x8c\x90\x43\x7f\x98\x01\x2a\xf2\x86\x04\x7b\xe5\x33\xa6\x98\xde\x96\x85\x7c\xb1\x27\xb2\x78\x4a\xa7\x6f\x56\x01\x1f\x25\xe5\xb7\x89\x3c\x2e\x83\x52\x5e\x5e\xa8\x21\x86\x79\xdb\x4d\xaa\x9c\x8f\x4e\x84\x9b\xd4\xdd\x3a\x25\x04\x8f\xb5\x5e\xc9\x8b\x7a\x74\xab\x67\x43\x33\xb9\x19\xb4\x78\xdf\x44\x9b\xf3\x16\x6e\x54\x68\xd0\xa4\x57\x40\xaa\xe0\x25\x5a\x90\x85\x4e\x4d\xbc\xd8\x90\x18\xf7\x63\xf1\x7a\x6c\x1a\xf6\x3c\xb9\x19\xe7\x7c\x75\x0b\x30\x70\x3c\xbb\xc9\x7b\xb4\x7f\xaf\xc8\x6e\xb3\x71\xa0\x2c\xcb\x2e\x0e\xb2\xc0\x3e\x34\xb6\xee\xb9\x0f\x07\x3e\xda\x0d\xc2\x3e\xd9\xc4\x0d\xd5\xd8\x1f\x2e\x2a\x11\xbc\x85\x78\x03\xef\xaa\x1c\xc1\xeb\x8d\x19\x2f\x83\x88\xf8\xe7\xc0\x85\x3f\x75\x77\x6d\xde\x71\x29\x92\xf7\xa6\x4f\x79\x1f\x8a\xf0\xa7\x8b\x7f\x2a\x1d\x2c\x00\xff\x08\xcc\x5c\x1f\xc3\x1f\x60\x56\x22\x65\x14\xcb\xcc\x6a\x9e\x75\x12\x01\xcc\x01\x73\xd1\xf4\x32\xb0\xd9\xba\x34\xcd\x87\xab\x26\x86\x68\x46\x26\xc5\xc6\x93\x27\xbd\x8b\xb1\x24\x04\x73\x37\xb0\x45\x38\x2a\xb4\x38\xbb\x6f\xf0\x71\xb2\x90\xfa\x27\xa3\x64\x5d\x4c\x33\x5a\x0c\x8c\x6a\xdb\xfd\x75\x39\xcd\xde\x3f\x28\xe7\x26\x75\x58\x7f\xb3\x98\x45\x5d\x8b\x5a\xbf\x2d\x66\x22\x56\x57\x24\xd7\x03\x26\xa2\x36\xa8\xa5\xc5\x1c\xcf\x7a\x11\x5f\xcc\xd1\x3b\x47\xb2\x98\xd6\x22\x96\xd8\x0b\x8b\xec\xc6\x8b\xac\x76\x7e\x51\xa4\x3d\xd0\x85\x3e\xd7\x57\x92\x07\x61\xb1\xbd\x68\xb1\x21\xb3\x62\xda\x10\x9a\xa5\x22\x55\xb9\x9e\x24\xe2\x29\x4a\xff\x2a\xb0\xd0\x81\x4d\x9a\x92\x7e\xcf\x79\x9b\x8d\x38\x6b\xca\x6b\xba\xf7\x74\xe4\x5b\x5c\x25\x14\xef\x32\x4c\xe1\xf6\x9d\xe5\x83\xc1\xce\x14\xcd\xcb\xaa\x79\x9c\x00\x6b\x88\xb6\x00\x42\xda\x84\xfd\x73\xe0\x05\xe4\xe9\xf6\x15\x4f\xf7\x42\x56\x6c\x69\x88\x86\x54\x20\xeb\xbe\x64\xe6\x3b\x79\x1c\x1b\x7e\xf4\x59\x31\xaa\xf5\x35\x06\xd4\x0f\x33\xbe\x02\x26\x45\xc1\x53\x47\x11\xdc\x96\x36\x7c\xe8\x8e\xf1\x08\x8e\x82\x15\x69\x0b\x06\x3c\xcd\x73\xdd\x9e\xd7\x4d\x9e\x26\xec\x73\xec\x67\xc4\x6b\xa1\xa9\x25\xdf\x0e\x85\x7e\x87\x32\x1f\x12\xa7\x24\xdf\xd3\xf5\xe6\x71\x80\x4c\x14\x74\x38\x26\x35\x4a\x2e\x4c\x3c\x60\xbb\xac\x50\x47\xdf\x04\x5e\xbf\xf9\xd5\x63\x5e\xbf\x69\x69\x5c\x28\xe6\xba\x64\x59\x76\x3c\x73\x13\x33\x1f\xf5\x60\x41\xc3\xea\x76\xd5\xd6\x14\x60\xf8\xfa\xc4\xc9\xa4\xd3\x10\xe8\x6c\x51\x40\x40\xa3\x24\xff\x76\xe3\x3c\x4b\xd9\xf1\xae\xb9\xca\x2a\x40\xe1\xd5\x47\xe2\xf7\xce\xa7\x09\xf6\x37\xb0\x86\x3f\xa8\xb0\x99\x88\x3a\xc7\xae\x58\xd1\xde\xca\x3d\x03\x07\x80\xe7\x68\x21\x0f\x60\xe1\xe4\x88\x72\x13\x88\x04\xa0\xf0\xb8\xfc\x7b\x42\x76\x7f\x64\x8e\x3c\x51\x3d\xa0\x51\x0f\x2a\x39\xb2\x49\x4a\x26\x42\xd5\x20\x5e\x31\x9c\xae\xb3\xde\x1a\x95\x18\xcf\x4c\xbd\x23\xe2\x25\x0f\x39\x93\x6c\x81\xf7\xa5\x04\xab\x2b\xf7\x51\xc7\x08\xe2\x59\x6a\xb1\x23\xf0\x5e\x04\x44\xf0\x72\x22\x06\x16\xa8\xc6\x94\x9c\x50\xdb\x5b\x25\x36\x8a\xad\x40\x4e\x86\x37\xf7\xb0\x92\x12\xe9\xb7\x3c\x04\x75\x24\xb0\x10\xe6\x44\xc6\xed\x15\x06\xc7\x33\xa7\x7c\xde\x90\x56\x78\x57\x4b\x2b\xd1\x61\x99\x56\xa2\xc3\x22\xa3\xb4\x25\xcb\x8c\xe3\xbf\x56\x45\x22\xff\x86\x21\x00\xb6\x3c\x2f\xb5\xb3\x0b\x66\x23\xa0\x1c\x5b\x96\x22\xe3\x19\x1c\x95\xad\x95\x42\x44\x94\x72\x2c\x48\xae\x5e\xa4\xe5\x91\xc2\x92\xa2\x4b\x15\x85\x2a\x61\x6a\x46\xa5\x52\x74\x99\x31\xc5\xd4\x45\xe4\x9e\x2a\xe0\x26\xb1\xb8\x9c\x20\xc4\x24\x96\xa5\x06\xb1\xdd\x78\xf6\x61\x8a\xbf\x77\x77\xc4\x7b\x61\xd0\x8f\x42\x44\xd0\xdd\x94\xda\xab\xe2\x03\xde\x69\x4b\xdb\x58\x24\x8e\x3a\xc5\x97\x18\x5f\x66\xec\xe8\x55\xd9\xa2\x29\x94\x2d\x74\xc7\x3a\x2e\x90\x85\x62\xdd\xae\x75\xd1\xfa\xb3\x48\xab\xaa\x2a\xd6\x9e\x63\xe2\x37\x8b\xaa\x43\x65\xff\x31\x87\xdd\x6b\xad\x3b\xaf\xe7\xa6\x30\xfa\x7b\xfe\x61\x77\x00\xcb\xf7\x2a\x73\xee\x18\x3f\x55\xeb\xc2\x57\x1b\xfd\xe7\x7b\x2c\x4b\xf8\xfe\xea\x8a\x5e\xec\x60\xaf\xc9\x2a\x63\x78\x69\xca\x10\xc4\x5a\x7e\x5a\x93\x2b\x69\xe4\x4a\xae\xcb\xc5\xce\x5d\xd7\xac\xac\x76\xca\x1b\x4e\x70\x6d\x09\x08\x4e\x3a\x03\x75\xcb\x41\x4a\x34\x4b\x18\x1f\xd9\x30\xd9\x91\x0b\x79\x4c\xf0\xde\x4d\x4a\x0c\xdd\xc3\x5e\xf4\xab\x5b\x22\x66\x99\x69\xa4\x92\x6d\xce\xbb\x77\xea\x14\x70\x41\x13\x4b\xcd\x2b\x9a\x56\xaf\xe6\xdd\xef\xd2\xea\xa4\xc0\x61\x86\xee\x82\x95\x8d\x93\x00\x7e\x97\xc6\x24\x2a\xbf\x85\x9f\x94\xf8\x49\xc2\x0f\x27\xcd\xbe\xcc\xf0\xbc\x6e\x17\x1a\x48\x2b\x60\xee\x97\x0b\xbc\x89\xd6\xb8\x00\xa2\xee\x97\x2d\x25\xf0\xb3\x98\x21\x7d\x31\x04\x02\x36\x91\x0b\x60\xae\xeb\x05\x09\xf2\xae\x94\xb0\xbd\x5f\xb7\x9f\xcd\x8d\xa9\xa2\x34\xe7\xbe\x40\xbb\x16\xf8\x56\xe3\xf8\x99\xac\xb6\x10\x44\xce\x2e\x6e\x9c\x7d\xb9\x07\x88\xf3\xb5\xb2\xe7\x45\x57\x13\x56\x5d\x2f\xaf\xf1\x74\x9f\xb8\x6e\x23\x0b\x42\xc1\xf3\x96\x6e\xce\x58\x98\xb5\x1d\x98\x95\x35\xfa\x0b\x44\x13\x26\x79\x47\x9f\xde\x38\xe5\x78\x9a\x86\x32\xd0\x40\xa4\xbc\x5e\x20\xc6\xf8\x5a\x36\x79\x27\x26\xfa\x8b\xb4\xd7\xec\xe5\x83\xba\x31\x0d\x70\x63\xd7\x55\xbe\x9c\x9a\x34\xa0\x5a\xd7\xb2\x9f\x70\x9c\x33\x75\x7d\xe2\xb8\x9a\x73\x21\x4a\x87\x3d\xe1\xf5\x9f\xd3\xa5\xd8\x39\xc0\x2d\x60\xe7\x3c\xd8\x71\x77\x4e\x02\xc3\x86\xfd\x50\x16\x14\xb1\x62\x53\x66\x6c\x22\x35\x09\xe8\x4d\x16\x7c\x70\x68\x2f\x12\x43\xf1\x55\xa4\xd0\x7d\xa7\x8b\x12\xd0\xb2\x13\x95\x04\xf9\x58\x08\x1a\x6d\x63\x4d\x61\x53\x80\xd1\x7a\xec\xc0\x8e\x51\x7d\x8a\xa6\x78\x2e\x8d\xe4\x69\x60\xa9\x73\x3d\x18\xe1\x5e\x68\x57\x04\xcd\xb9\x2b\xef\x1d\xd6\x75\xae\xc6\xdf\xf6\xee\xbd\x95\xed\xe2\x85\x10\x13\x0e\xf5\x31\xb1\xee\xc3\xe2\xe6\x3e\x7a\x02\x48\x1d\xb4\x50\x3a\x96\x05\x4b\xd5\xbf\x12\xbb\xdc\x54\xd5\x45\x13\x65\x12\x54\x9e\xab\x59\xb9\xb6\x1f\x4f\xd5\x6c\xb1\xd5\x6c\xf9\x24\x83\x30\x5b\x20\xe8\x87\x33\xc3\x86\x96\xf9\xb0\x8d\xb6\x27\x09\xbc\x2c\xda\x78\x04\x30\x0e\xf3\x27\xc4\x83\xfe\xc0\xb4\x6b\x9f\xd3\xe4\xfc\x45\xe0\x2e\xc4\x53\xf4\xc6\x93\x18\x39\x4f\x87\x90\x38\x5a\xde\x27\x76\xf1\x46\xbe\xdf\x78\x06\xbc\x4f\x84\x42\xd0\x34\x07\x11\xba\x4b\x5f\x6f\x6c\xa1\x6d\x0f\xd6\xe2\xd5\xe8\x57\x3d\xdd\x40\xf6\x9a\x06\xa7\xfc\x3e\x05\x7c\xea\x70\x89\x47\xc1\x24\xfc\x73\x2f\x78\xa1\x59\x8c\x46\xaf\x47\x9e\x7f\x4a\xe0\x81\x77\xc6\xc6\x53\x6e\xfa\x0b\x32\x22\xfc\xad\xe3\xfd\xcd\xc6\x53\x1e\x6b\xb4\xe1\xa5\x1e\x5a\x2a\x9a\xb1\xbd\xd4\x79\x93\xba\x22\x1c\x16\x20\x9c\xe1\x6c\x10\xa9\xe3\x08\x6f\xbb\x54\x67\xee\x6e\xaa\x07\xd5\xc1\xbf\xef\x9c\xb3\xbd\x44\x87\x84\x11\x88\x51\x37\xe1\x69\x8e\x95\x25\xd8\x71\x95\xe6\x10\xcd\x1e\xb7\xb1\x8f\x56\x3c\x27\xfe\xfd\x1e\xfd\xcd\x66\xe0\x63\x34\xa1\xd5\xf0\x7b\xce\x09\x30\x8d\x97\x1e\x29\x3c\xaf\xe7\x28\x90\x36\xaa\x78\xc3\x39\xe1\xed\x38\x4b\x64\xb3\xe0\xd7\x6d\x2c\xbd\xfb\x9d\x9b\x85\x00\x12\x29\x50\x29\x82\x4f\x40\x43\x97\xde\x80\xb8\xb9\xe6\xbe\x9b\x6c\x0a\x0f\xa2\x24\xec\x9d\x84\x1f\x2e\x73\x31\xf6\x24\x36\x0c\xd8\xfb\x76\xea\xb4\xaa\xd3\x1a\xf3\x30\x13\xc4\x3a\x9e\x19\xa3\xc1\x54\x6b\xf6\xa0\xae\xb4\x4d\xb0\xba\xea\x9f\xd6\x0a\xc5\x2a\xe3\xcd\xd2\xac\x49\x10\x96\x78\xf9\x7c\x2f\xd5\x6d\xdf\xfc\x3d\x35\x06\xb8\xbb\xc2\x48\xf9\x1f\xb0\x6f\x1d\xcf\xca\x46\x12\xbc\x0f\xbe\x9d\xc1\x84\x58\x83\x88\x62\xe9\x06\xd9\xda\x90\xe6\x8d\x56\xa8\xd8\xe0\x79\x6d\x9b\x50\x75\xf7\x76\x93\xa2\x8d\x78\xe4\x46\x84\x42\x3f\x02\x45\xde\x00\xae\x29\x7e\x98\x5e\xc3\x85\x98\x08\xbd\xcc\xba\x23\xa2\x25\x52\x95\xdf\x37\x8c\xf6\x9d\xcc\xba\xef\xb6\x16\x6f\x9e\xf8\x98\x5c\x24\xc8\xb0\x2a\x35\x2d\xd3\x69\xa0\x9f\xd7\xeb\x0a\xc8\x01\x04\x51\xac\x9e\x33\x83\x79\x8f\x6e\x21\x80\x9f\xc7\xb0\x47\xba\x04\x7b\xe4\x20\x5f\x29\xf9\x5c\xd5\x9b\x51\xed\x2a\x7d\x13\xa4\x68\x7b\x64\x57\x1e\x34\x8e\x2c\x9c\xbe\x7e\x3d\xf9\xc5\xd7\x97\xd2\x4c\x02\x57\x71\x37\xec\x15\x9e\x7b\x81\x53\x7a\xc0\x31\xf3\x1d\xf7\x3d\x33\x49\xc9\xc0\xda\xf1\xde\x33\xef\x94\x44\x19\x8e\x52\x64\x2c\xe9\x85\x58\xba\xa4\xef\x4b\x12\xf6\x5a\x74\x2a\xe1\xef\x38\x9f\xde\x77\x71\x61\x7e\xf8\x9c\x05\x50\xa7\x8c\x20\x06\x7c\x44\xc0\x64\x1f\xaf\xd3\x27\x25\xe8\x33\xf0\x0b\xef\x20\x1f\xdd\xb0\x45\x64\x37\x29\x29\x38\x9e\x17\x74\x51\xd0\xff\xb0\x9b\x6d\xca\x6c\xab\x89\x56\x38\xd9\xd9\xe9\x24\xba\x44\xa5\x3e\x30\xe6\xdc\xc3\xf2\x5e\x81\xba\xa9\x8b\x40\x19\x51\x68\x7e\x24\x90\x95\xc9\x7c\x46\xf7\x3a\xc1\x4e\xc6\xce\x7c\x0b\xc8\x21\x57\x86\xa8\x98\xea\xbd\xc0\x52\x24\x9a\xa8\x3a\x16\xa8\x01\x48\xdb\x55\x4d\xfa\x81\x40\xbf\x7e\x5c\x15\xac\xe5\x0e\xa1\x1a\x7b\xab\xc2\x44\xaf\x9b\xe4\xc0\x35\x2c\x88\x66\xeb\x6f\xd7\x21\x0a\xb1\xbf\x5b\x29\xe5\x7c\x5c\xc9\x2b\x8f\x7e\x95\xd9\xba\xc6\xd6\x9c\x9c\xc8\xad\x21\x4d\x9a\x64\x1a\xbb\xc3\xb1\x41\x1a\xbb\xb8\xa4\xc9\x5b\x0b\x39\x6f\x08\xd9\x23\x83\x7f\xea\x8c\xd6\x53\x93\xa8\xaa\xd7\xe0\xc0\xbc\x2b\x55\x29\x35\x5c\x92\xd1\xb4\x23\x3d\x13\x55\x6e\xcd\xd6\x29\x8e\xcd\xcf\x0d\x56\x25\xdb\x4a\xa4\x0f\xf4\xd0\x32\x83\xb8\x58\xd5\xdd\xad\xe0\x3f\x3f\x87\xf8\xbd\xf1\x9b\x54\x24\x9e\x2f\xe5\x06\xcf\x9d\x60\x5c\x9c\x8d\xe7\xc1\xe5\xd0\xd4\x8c\xf1\xf0\x9e\x75\xcc\xb6\xac\x7c\x95\xf6\xa3\x57\xba\xa4\xf7\x8b\xb5\xaf\xb3\x35\x71\x9d\x37\x93\x5f\xd2\xb8\x4e\x21\xd8\xa2\xa0\x90\xbe\x2f\xb4\x02\x73\x75\xe4\x2f\x95\x22\xdd\xdc\x6b\xfc\x0f\xb0\x18\x3e\x88\x75\x1b\x0d\x7e\xf8\x5d\x37\x36\x7f\x69\x36\xf6\xe3\x6a\xfe\x65\x6b\x45\xf1\xff\x10\x87\xb4\x2e\xe2\x90\xf6\x2a\xc4\x8f\x43\x1e\x4b\xb1\x3d\x42\xd3\x40\x10\x60\x0c\xcf\x57\x48\x76\x4f\xbb\x3a\x65\x75\xe1\xda\xc4\x62\x50\xfd\xbb\xeb\x2c\x27\xcd\xb9\x35\x7a\x88\x1f\x68\x8d\x37\x6b\x75\xc3\xb7\x9d\x64\xd8\xc9\x39\xe5\x7d\x62\xde\x46\xce\x57\x34\xae\x3c\x0c\x1b\x12\xc2\x91\x3e\x7a\xee\x75\x40\x4e\xe1\x23\x5f\x3a\xe2\x9c\x28\x5e\xdb\x77\x1e\x5b\x3b\xe4\x43\x08\x4f\x80\x4f\xd4\x05\x08\x07\x98\x82\x5a\x1d\x64\xad\x5a\xdd\xf9\x29\xa6\xc3\x7e\xc7\xcb\xa2\x41\xf7\x6c\x3a\xf4\x86\xfd\x11\x9e\xcd\x65\xcf\x6c\x1f\x9f\x9f\x6a\x36\x41\x9a\x81\x88\x7a\x10\x1c\xf1\x7a\x9d\x79\x90\xfd\x7e\x60\xf7\x67\xbd\x69\x07\x39\x5b\x04\x52\x84\x3d\x1d\xe3\x2b\x1c\x08\x32\xde\xa1\xcb\x9e\xb7\x6d\x7c\x02\x6f\x38\xe8\x2d\x31\x69\x0c\x88\x73\x31\x98\x66\x9f\x1f\x05\x44\x1e\x67\x9d\x71\xe0\x63\x02\x3a\xf5\x87\xcf\xb9\xb3\x09\xe1\xf9\x9d\x09\x96\x46\x49\xec\x3b\x16\x43\x9d\x01\xba\xfd\xf5\xb3\x95\xd6\x2b\x1a\xc3\xd5\xea\xb6\xbb\xd9\x19\x6c\x7a\xdc\x61\x20\x0c\x34\xd0\x17\x17\x77\x99\x2f\x6d\x13\x54\x92\xd1\x81\xc7\x11\xfb\x00\xd1\xb8\xf5\xef\x13\xd8\x5f\xe1\xb0\x13\x19\xf4\x8c\x6e\xdb\x3b\x51\x2e\xe0\x22\xda\xac\x93\xba\xd6\x43\x0c\x14\x6d\x34\x34\xb1\x27\x7c\xba\x7c\xe3\x9c\x48\x21\xf6\xed\xd3\xc5\xc1\x1b\x0a\xcc\x56\x25\x11\xd3\x59\x92\x32\xa6\x55\x31\x0b\x6a\x4b\x2b\xb1\xc1\xaf\x94\x8b\xab\x67\xa0\x54\xf6\xc9\xea\x19\xe8\x1a\x1d\xa1\x2a\x56\xab\x03\x75\x17\x9c\xfe\x4a\x7b\x50\x1c\x19\x36\x00\xdd\x33\xf4\x1c\x47\xc1\x87\x1f\x3a\x08\x5b\x75\x69\x28\xec\x9f\x4d\xe9\x14\x3d\xfb\xb7\x2d\xdc\x6c\xab\x68\xbb\xc3\x1e\x0d\xff\x25\xce\xd1\x57\xb4\xf9\x3a\x8d\xe9\x0f\x9e\x95\x88\x21\xf0\x43\x22\xf5\x5d\x24\xbc\x7d\x3c\x8a\x2c\x8e\x70\xd0\x1f\x2b\x36\x47\xf9\xc3\x42\x7e\x15\xe4\xc5\x2d\xfc\x75\x59\x49\x5d\x1c\xa1\x96\xe1\xf4\x2d\x2d\xc3\x28\xb4\x7c\xbd\x10\xca\x8a\xd7\xd4\x12\xc1\x47\x6b\x87\x6f\xe9\x1c\x3c\xbc\xe1\xa7\x1c\x25\x3b\x17\x2d\x4e\x9b\x97\xec\xab\x81\x88\x6b\x24\x9e\x95\x91\xad\xb7\x4e\x17\xb1\xb1\xa2\x1d\x8e\x3b\x39\x74\x3b\xa9\x8b\xeb\x8a\x3c\xd8\x47\x9f\x89\x97\xde\x7d\x63\x04\x54\xc1\x02\xb1\x7f\x50\x0d\x15\x93\xad\x60\x5a\x28\x0c\x17\xc6\x29\x6b\x6a\xf9\xe2\xa6\x16\x2f\x2e\xec\xc9\xf0\x67\x7c\xbf\x17\x53\x28\xbb\x4a\xa1\xec\x2a\x85\x72\xf6\x14\xa7\xcd\xac\x67\x5e\xdc\x52\x3a\x89\xd5\x94\x15\x4d\x4a\xcc\xd8\x9f\xb5\x29\xe8\x38\xa5\xf1\xdd\x45\xef\x7e\x64\x46\x94\xf9\xea\xe5\x2c\x58\xcc\x3e\x5b\x38\xc1\x8a\x4f\x26\xc3\x5e\xe2\x62\xb7\x46\x6f\x5e\x22\x82\x8e\xa5\x1b\x1b\x37\x6f\xa8\xe2\xda\x8d\x32\x48\x4b\xe9\xf4\x7b\x61\x7d\x80\x1f\x5a\x56\x6b\xc5\x42\x3e\x26\x51\x83\xbd\x2c\xe3\xe1\x08\x8c\xe2\x4d\xd9\x16\x32\x78\x5b\x26\x97\x31\x18\x9c\xb4\xf5\x5e\x38\x7a\xe0\x03\x0f\x65\x85\xf2\x2b\x81\x8f\x4f\x55\xd4\x37\x86\x30\x6d\x9b\xe1\x37\x9a\xe1\x37\x28\x78\x5d\xc5\x6f\x30\x42\x55\xf3\xb1\xf0\xb9\xa6\x71\x8c\xdd\xfc\x85\x2c\x16\xfd\x1a\x3a\xbe\xa1\xc2\xf2\x35\xfd\xb5\x9b\x76\xf8\xb5\xb6\xfe\x1a\x4c\xea\x5f\x7d\xcd\x14\xcd\x62\xcc\x8d\xeb\x4c\xe6\x62\xc7\xdb\xb9\x05\x59\x3c\xd1\xdc\x13\x87\xd9\x8b\x96\xb5\x33\x1b\x40\xac\xa5\x62\x0b\x88\xb9\x3b\x77\x0b\x01\xc2\x06\x7d\x43\x9c\x33\xe3\x81\xce\xf8\xd0\xb8\x92\x6c\xd8\x02\x27\x4d\xee\x1f\x61\x82\x04\x30\x41\x82\x9d\x1d\x0b\x91\x71\x11\xf9\xc0\x55\x06\xf7\x92\xee\x1b\x40\xe4\x63\xbc\x5e\x78\x25\xce\x7d\xb5\x7d\xe3\x94\x83\x57\xa0\x3e\x62\xf9\xc9\xf6\x18\xd9\xc6\xbd\x1d\xe0\x1b\x84\x93\x6c\x83\xb0\xef\x5f\x69\x00\x57\xc4\xcb\x28\x2d\x80\x85\xa6\x4d\xcd\x68\xb1\xe7\x5b\x50\x2b\xdc\x9c\x4f\xac\xb0\xeb\x3c\x83\xc7\xf0\x7e\x29\x5d\x22\x93\xf6\x6b\xf9\x92\x64\xbc\x5f\x0a\x98\xa1\xfb\x49\x25\x62\x02\x04\x04\x4b\x25\x64\x62\x6c\xf2\x0f\xc5\x4c\x14\x32\x27\xab\x62\x26\x14\xf1\x3b\x41\x33\xac\x85\xd7\x49\x74\x51\xab\x63\xed\x75\x59\xb9\x63\xb3\x8b\x47\x77\x90\xf8\x89\x02\x4f\xb6\x8b\xea\x9f\x62\x90\x1d\xbc\xd2\xe0\x63\x74\x7b\x1b\xff\xbe\x43\x0d\x68\x97\x14\x4a\x5d\x56\x28\xa9\x32\xd7\xe7\xb7\x59\xe6\xcb\x22\xb2\x7d\xdb\x02\xc0\x4c\x64\x3f\xbe\x62\x73\xa9\x49\x05\xad\xc4\xbd\xab\xae\x1e\x67\x43\x43\x7b\x16\x8e\xe1\xac\x64\x1f\xb5\xdf\x46\x1c\x11\xa2\xea\x2b\x32\xd6\x8e\x18\x41\xdc\xae\xcb\x22\x3b\xec\xb6\xfa\x9b\xe3\x76\x5f\x4f\xad\xab\x09\xf2\xe6\xd3\x3a\x30\xd2\x24\x8e\xc2\xba\x82\x38\x0c\x62\xab\xb1\x84\x48\x0a\x26\xad\x3d\x01\xca\xd1\x4a\x3a\xa9\xcc\x67\x96\xb1\x73\x6c\xf2\x52\xc4\x4c\x88\x4e\xb2\x38\x49\xf4\x78\xdc\x2b\x93\xd8\xf7\x22\xdd\xa8\x6c\xa1\x3c\x8f\x57\x61\x80\xa5\x4c\x2d\x73\x3e\xae\x0c\xa5\x30\x2d\xd1\xa5\x45\x6d\x47\xd8\x0c\x0d\x1e\x7d\xec\xa4\xb3\x43\x3b\x7f\x68\xc5\xec\x1b\x55\x4a\xe5\xc0\x8a\x59\x43\xaa\x14\xa8\xf1\xab\x2f\xa9\x0f\x9a\x1c\x4a\xea\xe3\xc9\xe0\xe3\x0c\x04\xf9\x94\x50\x29\x13\x8c\x62\xc3\x5e\x5e\x40\x3c\xe9\xb2\xca\x8f\x52\x6a\xfb\xf6\x51\x09\xe5\x77\xd4\x09\x12\xe4\x70\xdf\xce\x57\x94\x44\x4f\x90\x69\x1e\xe4\x0f\xb4\x1a\x97\xf1\x52\xcb\x7e\x82\x71\x4d\xbf\x73\x14\x46\xad\x6d\x9f\x57\x77\x82\x9d\x09\xaa\xd3\xe1\x8f\xb7\x73\x12\x84\xcb\xd6\x37\x86\xd9\xa7\xe1\xbb\xfb\xf5\xf0\xd9\x23\x6d\x2f\xb1\x66\x12\xf4\x20\x59\x5b\x4c\x0c\x56\xcc\x42\xd6\x89\xef\x6a\x2e\x1c\xb7\xac\xb8\x3c\x1b\x31\x7c\x47\x3b\x46\x3b\xdc\xb4\xe6\x13\xe4\x4b\xf6\x12\x9e\xb9\xc5\xb0\xba\x1b\xb6\x18\xf4\xcb\x47\x7b\xfc\x87\x5d\x09\xc4\xcd\x86\x2c\xfc\x71\xc3\xd7\x50\xd8\x77\x22\x58\x37\x18\xa7\x74\x2b\x6b\x14\x0d\xfb\x09\xa7\xe3\x88\x92\x53\x49\x4f\x6d\x29\xec\x37\x51\xf1\x4a\x58\x58\xa8\x74\x77\xc9\x75\x1f\x1b\x1e\x78\x72\x37\x05\x16\xce\xd7\xac\xa4\xb4\x19\x90\x47\xd4\x30\x4f\x4f\x72\x85\x2e\x29\xba\x5d\xd1\x58\x00\xb3\x73\x0c\xff\xd0\x7e\xe1\x29\xb0\x90\x5f\xc8\x11\xeb\x9f\x2f\xe3\x2b\x2b\x30\x9a\x4f\xc1\x8e\x4f\xa3\x69\x76\xf2\x1a\x79\x5f\xa0\xf9\x41\xa5\x09\x39\xce\x61\xfc\x79\x95\xae\x11\xf3\x09\x6d\xdf\x40\xfb\xa5\x70\x4f\xd8\x0f\x45\x89\x8d\x7f\x7c\xfc\x13\xe0\x9f\x26\xfe\xe1\xf1\x3c\x8b\x1e\xb6\x50\xae\x76\xeb\xf7\x62\x3c\x5a\x85\x7f\xf5\xb7\xb7\xd3\x5f\xe5\xee\xde\xcb\xf5\x9c\x02\x48\xf1\xf6\xc7\xbf\xd2\x56\xb2\x80\x9b\x35\x86\x72\x99\xbf\xd3\x5f\x7b\x7b\xbd\xa4\x03\xb1\x6c\x12\x62\xdf\x9c\x1e\x74\x61\x0f\xe3\x3b\x3d\x66\x6c\x07\x0e\xab\x82\xe1\x4f\xbf\x33\xe0\x2d\x38\x95\xf9\xd6\x86\x55\x38\x49\xf4\x3e\x00\xe6\xfb\x81\x45\x99\x12\xa9\xcc\x87\xc1\x7b\x00\x24\x65\xa2\x65\xbd\x3f\x78\x80\x9f\x0f\xbb\x76\x33\xe9\xf4\xec\xd6\x8e\x03\x74\xae\xe9\x84\x15\x68\x85\xd5\x92\x1f\x2b\xb3\xb2\x01\x15\x60\x23\x67\x5f\x46\xe0\x93\x3d\xa7\xbb\xd7\x4a\x36\xb3\xcd\x64\x2b\x97\xfe\x46\xb5\xdc\x71\x28\x1f\x75\xcb\xb0\xa9\xba\xd0\xeb\x03\x17\xc1\x0d\xcb\x64\xd3\x74\x14\x96\xe8\x86\x41\x77\x67\xc0\x01\x6f\x67\x24\x6f\x2f\x95\xe3\x7d\x89\x5d\xcd\xab\x5f\xd0\x5c\xb9\x90\x2b\x3f\xae\x85\x60\x69\x43\x4d\x5f\x2b\xae\x92\x08\x93\x89\xfd\x8f\xeb\x27\xc2\x64\xa2\x75\x71\x65\x45\x98\x7c\xa3\x0a\x6f\xaf\x9b\x9e\x80\x50\x3d\x44\x02\xe9\x22\x97\x0f\xb1\xca\xa1\x44\x5f\x51\x6b\x18\xbc\xc9\xa8\x94\x7b\x04\xf9\xa8\x71\x05\x0c\xb6\x50\x5a\x02\x94\x4f\x72\x4d\x3e\xc2\x42\x1a\xbb\x8f\xa6\x90\x7c\x6a\x72\x05\x84\x9e\x12\x90\xc6\xee\x1d\x95\xb2\x27\x56\xae\xc8\x98\x97\xde\x5e\xbe\x82\xf1\x73\xb2\x9c\x9c\x28\x4b\x22\x72\x8a\x6d\xa3\x32\x62\xcb\xbf\xe7\xc4\xb3\xb8\x2a\x25\x50\x16\xa6\xdd\xb8\x67\x21\xe3\x2e\xe8\xf1\xdc\x32\xe9\xdd\xf1\x5c\xda\x47\x07\x3d\x34\x53\x12\x6e\x42\xa0\x87\x85\xf1\x42\xdf\x18\xe4\x84\x2d\xbc\x20\xe6\x0f\x04\xfe\x93\x26\x63\xc8\x96\x0b\xbc\x13\x2e\x59\x3c\x14\x31\xf2\xae\x74\x6c\x9c\xeb\xf6\x0c\xcb\x1a\xf9\x29\xf6\xf8\xf4\x5d\xac\xb3\xd9\x55\x3b\xe1\x25\x6c\xa2\x83\x0a\x89\x20\x1b\x51\xbd\x0e\xf5\xfa\x60\x80\x27\x98\x09\x3d\x36\xa9\x31\xba\x2f\x94\xe3\xe6\xe2\x39\x99\x4d\x28\xdb\xdb\x99\xaf\x8e\x9b\x7a\xec\xec\xb1\xca\xe2\xe0\x10\x95\x17\x4f\x18\xb0\x11\x0c\x12\x51\x6a\x00\x7d\x52\x6c\xb3\x82\xe3\x01\xb6\xaf\x3c\x70\x69\x08\xe5\x72\x94\xb2\x03\x52\xc8\x1b\xab\xfc\xe2\x59\xf8\x39\xbc\xe5\x3b\xa2\xfa\x30\x66\x79\x5f\x7e\xa3\xbc\x0f\x45\x9c\x06\x4a\x96\x75\x53\xd7\x07\xe8\x8b\x0f\xf5\x49\x22\x14\x32\x30\xe1\x26\x9a\x70\x43\x09\xd2\xf7\x91\x3c\x7b\xd5\x52\xd2\xe3\x30\x81\xa7\x4c\x6c\x8d\x6e\xcb\xa9\xf7\xf0\x03\xd8\x72\xe9\x8f\xfd\xa7\x47\x7b\x53\x2e\x4c\x70\xbc\x5c\x54\xc2\xba\xa9\xa0\x2b\x48\x1f\x8f\x27\x5b\xf0\x73\xe0\xa2\xbf\x5c\x3c\xa6\xec\xc1\x4f\xdd\xb5\x07\xf0\xf3\xd0\x02\x62\xe1\xa7\xce\x9b\xc0\xc9\xf9\xa9\xbb\xf9\xcb\x4b\xc6\x9e\x41\xe8\x3b\x85\xe6\x10\x9a\x4f\xf7\x9a\x0b\x91\x7d\xa8\xe9\x9d\x44\x6d\x2a\x85\x9a\xdd\x94\xc1\x52\x0d\x4f\x3c\x28\x58\xac\x21\x83\x44\xc1\x72\x0d\xf7\x79\x0a\x8a\xb9\xb0\xe7\xa8\x1d\xdd\x3f\xdc\x19\xec\xcc\x41\x42\x99\xe4\x46\x18\xd9\x18\x51\x6c\x96\x9b\x85\xfb\x1e\x70\x3f\x33\xcc\xb4\x75\x60\xef\x17\x64\x78\xbf\xcd\x1f\x83\xe9\x37\x03\x1e\x26\x75\x5e\x26\x67\xc1\x46\x1e\xdb\x97\x79\x9a\x03\x21\x23\x94\x89\xad\xe8\x7c\x3c\x04\x5e\x87\xdd\x36\xb1\x47\x1a\xdb\xca\x45\xd0\x73\x0a\xbd\x52\x90\x61\xc2\xce\x49\xec\xe8\xd6\xfa\x4a\xe3\x5b\xda\xb7\xdb\x35\x49\xfe\x94\xdb\x1a\x79\xb6\x9e\x9a\xc3\x40\x07\xf4\x8b\xbe\xba\xe9\x68\x7d\x67\xab\xb8\x13\xd0\xf9\x37\x87\xf0\x94\x9c\xc6\x3a\xe1\xa1\x6e\x4e\x6a\x7e\x2c\x64\x64\x49\x15\x24\xb9\xc7\x20\x76\x2e\x1f\xd6\x7a\xd4\x96\x35\x7d\x5e\x08\xfb\xa1\x26\x23\x40\x31\x6f\x83\x90\x3d\xd4\x61\xa0\xc3\x47\xaa\x69\x40\x74\x75\x78\x52\xb3\xef\xd0\xab\xd2\x28\x22\xe6\x8e\x8c\xa2\x46\x46\x51\x23\xa3\xa8\x91\x51\xd4\x48\x76\x08\x37\xcb\xca\x6d\x10\x43\x3c\x32\x8b\x05\x4e\x8c\xd1\x60\xdd\x71\x3f\xc8\x78\x17\x56\xeb\xd3\xa1\x95\x0b\x27\xf6\x45\x25\x9c\x81\xb5\x42\x38\x05\x6f\x83\x70\x0e\x1e\x15\xc2\x49\xa8\x71\x60\x1d\xd7\xa8\x36\xcc\x01\xad\x2f\x51\x97\x52\x32\x72\x16\x8d\x70\xd9\x28\x3d\x56\xa2\x6a\x96\x69\x54\xbe\x14\xd1\x41\xb1\xcd\x41\xb1\x8d\x41\xb1\x8d\x41\xb1\xd5\xa0\x1c\x17\x64\x18\x7a\x52\x87\xe5\xa0\xd8\x91\x41\xb1\x8d\x41\xb1\x8d\x41\xb1\x8d\x41\xb1\x8d\x41\xb1\x63\x83\x62\xcb\xca\xdb\x91\x31\xb1\x63\x63\x62\x9b\x63\x62\x47\x7a\xd0\x36\xc6\xc4\x36\xc6\xc4\x56\x3d\xb8\xa1\x23\x65\x03\x89\xbb\xd0\x96\x5d\xf8\x46\x91\x47\x46\x91\x3a\x67\xd1\x08\x97\x0d\x9c\x58\x89\xb2\x5d\xaf\x01\x53\x4c\x5f\x92\xb1\x20\xb2\x6a\xd5\x1a\xee\x9e\x35\xbc\x7b\x27\x78\x95\x24\x97\xa2\xb9\xf5\xeb\x59\x41\x5d\x32\xd1\xd1\x9e\x7e\x52\xee\x17\x22\x4d\x2e\x2a\x08\x2f\xe8\xfd\x69\x92\x21\xd6\x92\xf4\x83\x2d\xa0\xdc\xf2\x8d\x01\x92\x35\x42\xa8\xe3\x19\x7d\x51\x6d\xc9\xb6\x11\xfd\x35\x86\x28\x98\x09\x39\x26\x93\x8a\xbd\x1c\xa9\x48\x00\x03\xe4\x37\xea\xcf\xf7\x92\xa0\x45\x86\xb5\xa5\xf3\xf4\xf6\x6d\x3f\x95\x7f\x12\x28\x05\x32\xa4\x8f\x90\x82\x84\xa8\xac\xdc\x32\x1f\x95\x0c\xe8\x36\x5f\x17\xe4\xcd\xe8\x65\x0d\x15\xf5\x29\x8a\xa5\x1c\xb7\xed\xeb\x8a\x0c\x1f\x3e\x0b\x7b\x83\xf2\xca\x21\x99\xe9\x82\x4d\x9a\xdc\x9c\x45\x26\xf4\x62\x7f\xdd\x84\x44\xa8\x6a\xec\xf3\x48\x84\x28\x8a\xc6\x47\xe8\xb0\xda\xbd\x5b\x7a\xe0\x22\x16\xb4\x4a\xeb\x8d\x9a\x11\x52\x8b\x29\x81\x86\xd4\x4c\xe7\x81\x15\xf7\xf5\x5a\x6c\xab\x1b\x7c\xb7\x01\x2f\xee\x3b\x7d\xd5\x4f\x9e\x6a\x7c\x7a\xef\x12\x93\x2c\xa3\xab\x77\xff\xf0\xab\x45\x62\x4b\x5f\xc9\x76\x7e\xe5\x50\x96\x15\x6c\x7f\x88\x71\x47\x24\xe9\x91\xfc\x3f\xb2\xd7\xc0\x8a\xb1\xc6\xed\x18\x9d\x50\xc5\xb4\x6d\x2a\xb6\x46\x21\x0e\x3c\xaa\x54\xbb\xa0\x63\xc4\x35\xd7\x08\xce\x7e\x75\xe8\xd0\xd4\xb7\xfb\xce\xf8\xc0\xe0\xc6\x39\xfb\xaf\xd5\xfb\x9d\x00\x39\x4b\x0a\x5e\xa0\xde\x2e\xf9\xb9\xfc\x89\xff\x90\xe0\x3e\xbe\xdf\xc9\x94\x3f\x73\x38\x4f\xe1\xb8\x5a\x9f\x19\x25\xad\x6d\x82\xb5\x41\xda\xc4\xdc\xc9\x13\xf0\xc2\x65\xa0\xc1\x95\x05\x5e\x74\x21\x8d\x03\x12\x67\xe9\x12\x10\xbe\x80\x8f\xa3\x60\xdc\x86\x30\x1e\x25\x30\xa9\x0e\xd5\x0f\xff\x67\x4a\xf5\xdf\xe8\xc8\x85\xf5\x8f\x74\xe3\xd0\x53\xfd\x1a\x72\x6e\xbb\xef\x3d\xdd\x61\xd0\xb2\xa4\x67\xbb\xf0\xaf\x89\x7c\x90\xa1\x17\x27\x43\xa3\xff\xa5\x6a\x9c\x3f\xa1\x0b\x6f\xca\xc2\x7d\x1b\x3e\x09\xff\xa2\xba\x69\xf3\x03\xff\x50\x19\x0e\xe5\x8f\xf9\x69\x37\x60\x99\x03\xe6\xcf\x7d\xfa\xeb\x6d\x6f\xf3\xa1\x60\x80\x1c\xaf\xf9\x95\x16\x71\x3b\x03\xc4\x7f\x79\x69\x59\x9e\x3c\x31\xf7\x92\x19\xb2\xf4\x53\x07\xe8\x14\x35\x6b\x1e\x33\x71\xfa\xbd\x02\xdd\xd4\x60\xff\x53\x65\x7a\xa1\x8a\xf7\x11\xd4\x75\x3b\x37\xa6\x4a\xe7\x57\x9f\x48\x95\xee\x7d\xf5\xc9\x53\x89\xd2\x46\xa1\xa3\x0d\x2f\xae\x4a\x77\xed\x55\x25\x39\xdd\xe6\x08\x35\xe5\x6f\x29\xc9\xc3\x6b\x73\xaa\xa3\x87\x35\x4d\x45\x21\x36\xa8\x85\x6a\xf3\x65\x27\x71\x42\x2f\x5b\x56\x60\xc6\x58\xc2\x79\xc0\xdb\xc8\x68\x55\x8b\x2f\x51\xca\x7d\xf0\xb4\x1d\xd7\xaa\xd3\xea\x4c\x4b\xcf\x9b\x78\x5e\x25\xd7\xa4\x5c\x39\x7e\x44\xf9\x6e\xce\x8d\x5f\xeb\xdf\xb1\xe7\xa7\xac\x35\x0f\x50\x1c\x9a\xa2\xce\xbc\x45\xea\xd7\x26\xca\x05\x9d\x32\x00\x51\x91\x8e\x3a\x58\x8f\x74\xb0\xcd\xa8\x48\xc9\x97\x7c\x28\x19\xb6\x5c\x44\xf0\xfe\x97\x86\x61\x2b\xba\xed\xff\x2f\x6a\x71\x53\x23\x3e\x13\xd9\xdd\x57\xbd\x4f\xfd\x46\x19\x3e\x7a\x3b\x91\x14\x99\xb2\xcd\xa3\x7f\xa2\xfe\xee\x91\xba\xe2\x97\x56\x69\xa1\xe1\xd9\x54\xd9\xc5\xc9\x99\xac\x34\xd6\x61\xe7\x00\xc4\xa7\x0e\xb6\x40\x46\xec\xb1\x0f\x9f\x54\xe1\x13\xda\xaa\xb3\xed\x19\xe9\xb6\x5d\x43\xe5\xed\xf3\x40\xf0\x9d\xa7\xb7\xf1\x57\xc6\xb1\x97\x5a\xc0\xbf\x25\x8c\xf4\x02\xfe\x2d\x4d\x1b\xbb\x5f\x6a\xf2\xd5\x78\x18\xb3\x5f\x4f\xdb\xc1\xfa\x69\xdb\x7a\x07\x93\x0b\xd8\x96\x98\xca\xdf\x8e\xab\xfc\x3b\x65\x84\x19\x5a\x7e\x5b\x6b\xf9\x8d\x63\x1a\x0b\x59\x37\xa3\xf7\xec\x40\x77\x05\x1e\xe2\x28\xed\x3f\xb0\xcb\x32\x40\xc7\x00\x36\x1d\x03\xc0\x3a\xc5\x37\xb3\x02\x87\x5e\xc9\x72\x1d\xda\x15\xa8\x37\x29\x84\xaa\x7a\x0e\xa1\xcd\x05\x87\xc8\xdc\xcf\x5c\xdc\x2d\xb9\x6a\xb5\x62\x75\x67\x5f\x2b\xf0\x9e\x9b\x32\xfd\xe2\x90\xce\x59\x5c\x9d\x73\x5a\x20\xc3\x5e\xe4\xdc\xdb\x94\xe4\xd3\x03\x37\xac\xa7\x92\xe7\x00\x27\x16\x6b\xb0\xf0\x94\x80\x62\x6f\x9c\x4f\x74\x6b\xb6\x68\xaf\x3d\x9f\x80\x14\xe8\xc4\x75\xe7\x13\x90\x72\x32\xb1\x5e\xe5\x39\x03\xe9\xc3\xc2\x43\x06\xd2\x86\x6d\xe0\x11\x03\xd5\xb0\x4c\x87\xff\x03\x24\x36\x2d\xf9\xeb\x86\x44\x67\x00\x8b\xc4\x20\x3a\x03\x52\x1d\xfe\xee\xec\xe7\x17\x47\x07\xff\xf8\xe0\xc0\xe0\x08\xa0\x43\x1f\x0b\x22\x9c\x78\x62\xfd\xc4\x7b\xcb\x60\x2e\xae\x51\x24\xd6\x08\xe6\x46\x83\xb9\x5c\x37\x01\x7c\xca\x8e\x54\xf1\x47\x40\xea\x78\x21\x06\xd6\x07\x0c\xab\xe8\xd6\x3d\x9b\x4e\xa0\x5d\xa0\xd3\x5c\x8a\x1d\x9f\x88\xfd\x45\x60\x01\x37\xbc\x9e\xde\xaf\xf2\x61\x7c\x4c\xe0\x3b\xda\x8a\x22\x17\x39\x13\xa6\x52\xda\x2e\xba\x42\xa5\xff\x22\xa4\xf2\xaa\x0d\x74\xd1\x37\xf7\x88\x8d\x5f\x1e\x16\xc8\x25\x81\xf3\x59\xae\x89\xb7\xcc\x03\xd5\xb9\xc1\x1b\x39\xfe\xc1\x19\xc2\x6a\x4e\x1d\xf4\xc3\x60\x10\x06\x9b\x61\xb0\x65\xbd\x79\xce\xf0\xbd\xc8\x74\xec\x97\x07\x0d\xbf\x52\xe5\xf7\x78\xe9\x97\xd9\x8e\x10\x7a\x0f\x0d\x99\x09\xb4\x2f\x41\x28\xda\x8c\x34\x56\x4b\x61\x4d\x34\x96\xd4\xfd\xaf\x27\x28\xeb\x08\x0f\x5a\xab\x8e\x80\x37\x43\x3f\x27\xf8\x5a\x17\x30\x6b\x7f\xa7\xbf\x61\xbd\x92\x5c\xcb\x97\x97\x77\x21\xb0\x99\xe4\xea\x92\xe3\x33\x68\x72\xa2\xbb\x77\x3a\x12\xd9\xa0\x68\xed\x24\x80\x8d\x94\xc7\x04\xc9\x40\x1d\x1c\x28\xc8\x8e\x86\xf4\x14\x64\xa0\x20\x23\x05\x99\x58\x2b\x66\x8c\x7a\xc8\x25\x53\xaf\xa6\xb9\x47\x0f\x1f\x92\x12\x5b\x81\xa4\xaf\x88\x95\xc3\x86\xd1\x7a\xbc\x95\x53\x87\x8b\xf5\x78\x2b\xc7\x0f\x6b\xbf\xbb\xb1\xf6\x20\x22\x56\xe9\x37\x4f\x24\xc8\x3e\x6e\x81\x37\x37\x80\xc0\x65\x13\x1c\x02\xde\x17\xfd\xb6\x2e\xf8\xa2\xea\x01\xc2\xe4\x0c\xff\xbf\x39\xa4\xd0\xb5\x52\x87\xc1\xff\x57\xc7\x15\xea\x1a\x49\xf0\xde\xc9\xa4\x32\x96\xba\x64\x02\xd1\xd4\x97\xf5\x87\x19\xff\xdd\x59\x86\xc9\xce\x57\x0a\x5a\x3c\xe6\xeb\x74\x82\x2a\xab\x00\xf8\xbe\xda\x24\x74\x5d\x63\x9e\x60\x44\xb1\xa0\xfa\xeb\x8e\x34\x68\x80\xbf\xbb\xeb\x4e\x34\xa4\x80\xb7\x43\x1e\x97\x3b\xc1\xaf\x0e\x3d\x2e\x5c\x76\xd5\xb5\x7a\xe2\x81\x93\x20\x74\x2f\x25\x1a\x4b\xe8\xd6\xc0\x49\xe7\x82\xaf\xe4\x17\x03\x4d\x74\x08\xd8\x08\xee\xd1\x28\xed\x9d\x53\xda\xc7\xb3\x04\x13\x52\x39\xc4\x25\x89\x52\xa9\x4f\x26\x3c\x9e\xf4\x1a\xe2\xed\x79\x59\x76\x19\x49\x27\x26\xd4\xb9\x7a\x82\xd1\xac\xe2\xf3\x14\x9e\x68\x74\xd0\xe2\x39\xef\x12\xd1\xe3\x15\xdc\xa4\xd4\x49\x0a\xea\xac\x7c\x2b\x14\x59\x27\x28\xef\xa1\x74\xe7\xc2\x68\x4a\xed\x87\xb6\x0c\xa3\xcc\xd6\x4e\x09\x95\x71\x38\x07\x52\xbe\x98\xb4\x69\xc8\x9c\x82\x3c\x87\x21\x65\x0d\x6b\xcf\xd9\xf9\xca\xf6\x36\x1f\xb7\xc4\xaa\x99\xd1\x75\x24\xa5\x9b\x95\x55\x0b\x26\xe7\x91\x2f\x77\xd8\x74\x02\x1f\x7d\x8b\xcb\x5c\x74\xf2\x62\x5e\x6c\x23\x7f\x7c\xaa\xd6\xbd\x9a\x64\x3a\xf6\xcb\x36\x5d\xd3\xe2\xd8\x72\x22\xf8\x9e\x16\x47\x7b\xd0\x5a\x3e\x1b\x51\x80\x05\xa6\x7f\x67\x88\x5c\x5c\x78\xcc\x12\x38\x74\x0d\xac\xe9\xe0\x3d\x30\x32\xfd\xa8\xbb\x39\x79\x53\xd0\x77\x9c\x72\x7b\x7b\x7b\x23\xe1\x3b\x5d\x5c\x22\x19\xf2\x1b\x2b\x9d\xe1\x73\x5a\x22\xc0\xa4\x20\x92\xd4\x94\x49\x4d\x4c\x6a\x46\x92\x3c\x99\xe4\x61\x92\xc7\x49\x9e\x53\x41\xf3\x0a\xdc\x67\x88\x29\x07\x62\xbd\xfb\xaf\x34\x48\xf7\xb4\xbb\x50\xe5\x2b\x8f\x82\x0e\x3d\xa5\x9e\xee\x66\x5f\x1f\xf1\x71\xcf\xe3\xa9\x04\x5a\x38\xe0\xaf\x1d\xe9\x2a\x5b\xe5\x41\x2d\x76\xd8\x6d\xac\x17\x36\x3a\x8e\xd5\xc9\x9e\xd3\x1f\x26\xac\x9d\xdb\x3e\x88\xd8\x7c\xc2\x71\xd8\x17\x8c\xb6\xc0\x63\x57\x5b\x7e\xd5\xca\xf2\x58\x3a\xce\xd9\xde\x54\x51\x3f\x1e\xfb\xe5\x53\x38\xd2\xda\x32\x42\xd6\x05\x26\x9a\xb7\x66\xa2\xe1\x35\x49\x9a\x68\x77\xd8\x27\x32\xaf\x2d\x95\x48\xec\x9c\x3a\xbe\xe8\x94\xff\x14\xa4\xd4\x39\x7a\xbd\x7e\xd4\xe2\x8d\xc5\xa4\xee\x39\x11\xdf\x7a\x46\x26\x06\x9e\x18\x5d\x98\x80\x40\x3e\x96\xb0\xce\x73\x46\xda\x74\x4f\x57\xd0\xee\x4f\xd7\x68\x21\x27\xbf\xd2\x42\x16\xdb\x71\x2d\xe4\xe3\xb3\x88\x2b\x1c\x0b\xa4\x70\x8c\xb8\x37\x3f\x37\x7c\x07\xc8\xd7\xc7\xf6\xd2\x5f\x9d\xc3\x4e\xe2\xa0\x6b\xb7\x06\xc2\xca\x16\x0c\xc0\x56\x1f\x00\xcf\x06\x60\x80\x18\xf4\x30\x96\x82\x04\xf4\x64\x99\x7e\xb2\xa6\x32\x16\xa3\x76\xc7\x9b\x6c\x76\x26\xf4\x5c\xcf\x64\x36\x1a\x0d\xc7\xd3\xc0\xff\x23\x74\x7d\x81\xec\xc8\x14\x06\xad\xfc\xf9\x7d\xbb\x71\xe0\xd1\x0d\x13\x57\x34\xdc\xfc\x7d\x63\x32\x14\x3b\xc1\x7d\xce\x02\x7a\xc7\xb4\xba\xdc\x75\x08\x96\x53\xfe\x65\xd1\x4d\x1a\xfb\x16\x8d\xba\x11\xc1\xab\xce\xb9\x5b\xa1\x6e\x32\xdb\x27\x92\xd8\x9f\x75\x95\x47\x84\x7a\xdf\xbc\xe9\xcc\xb0\xc9\x0f\x2e\xf5\xba\x67\x18\x59\x0f\x27\x8e\x7a\x2c\xe5\xf9\x4c\x7b\x07\x59\x74\x0d\x94\xe0\x51\x38\x09\xd7\x81\xce\x63\xca\x12\x88\x46\x33\xb8\xdf\xfb\xf2\x8d\x03\xd9\x77\xd5\x6e\xc2\x6f\x5a\x59\x98\xcf\x7b\x67\xf5\xec\x69\x3d\x7c\x4c\xe7\x0c\xdd\xb1\xfa\x96\xd4\xdb\xd4\xfb\xb4\x29\x8c\xf1\xbc\xd6\x55\x7b\x72\xb9\x8b\xf7\x5e\x3b\x12\xa5\xdc\xc5\x07\x45\x65\xd2\x59\x17\xf8\x74\x3e\x47\xa0\x17\x45\x43\x70\x5e\x83\x5d\xdc\xb3\x81\x68\x6e\x0c\x30\x70\x73\x60\xd9\xd7\x4f\x0c\xa9\xc9\x5f\x3f\x25\x7a\xbd\xe1\xd3\xe5\x58\x0c\x26\x23\x81\x9d\xb8\x74\x8e\xda\xe4\xce\x0f\x2b\x51\x9f\x2b\x3f\xfb\x50\x3d\x65\xbd\x06\x7d\x4a\x07\xa9\x3e\xbf\xd5\xe3\xab\xb7\x7a\x6c\xbf\x71\xc4\xef\x84\xa0\x3b\x27\x17\xcf\xec\x81\x2d\x3c\xc4\xa3\x55\x0a\xdd\x15\x64\xe0\x7b\x81\xcf\xd7\x21\x58\xd2\xa9\x35\x1d\xea\xf6\x54\xa8\xd7\x33\xf2\xca\xd0\xb9\xc6\x2b\x16\x54\xa8\x34\x53\xa1\x40\xe7\xf8\xde\x96\x81\xbc\xce\x70\xa9\x2a\x50\xd6\xa0\x8e\xc6\xef\x37\x65\xe0\x40\x27\x9e\x2b\xfc\x2b\x3a\x73\x0b\xf0\x62\x1b\x2d\xc8\x71\x40\x27\x65\xe4\xef\x30\x57\x0c\x4d\xcd\x5f\xef\x12\xe7\x31\x1f\x78\xc5\xa8\xb7\x6c\x74\x80\x3b\x98\xd1\xbb\x39\x3e\x45\x86\x14\xc9\x5d\xa0\x26\xcc\x27\x97\x3c\xce\x39\xe9\xd7\x81\x33\x80\xb4\x18\x2b\x24\x27\x8e\x14\x44\x73\x30\xf5\x94\xb3\xa6\x7e\x4a\xce\x78\x98\x32\x68\x9e\x40\x43\x23\xd4\xd0\x64\xb5\xdb\x01\x57\x4f\x73\x68\x0a\x70\x08\xa3\xa5\x20\xdb\x97\x84\xbb\x6e\x19\xa9\xa5\x71\x09\xc4\x82\x1e\x03\x90\x73\xcc\x7c\x46\x09\x8a\x32\x27\x30\x48\xb1\x47\xf2\x06\xc5\x75\xcf\x7e\x6c\x43\x16\xcb\xde\x0a\x21\xaa\x04\xe9\x5a\xba\x97\xf2\x3b\x63\x67\x4b\x3e\x38\xc5\x8a\x7e\x99\x22\x51\xf8\xf3\x6a\xe6\xa9\xec\xe1\x02\x4d\x9b\xaf\xc5\xd7\x63\xee\x0c\x84\xbc\x7c\xce\x15\x0b\x60\xce\x2e\x88\xcf\x0b\x90\xbd\x2b\xe0\x2f\x92\x79\x7a\x1c\xd7\x71\x49\xd8\x4d\xef\x5c\xd1\x59\x01\x19\xd4\x51\xd4\xca\x55\xf0\x78\xe1\xee\xc0\xca\x1d\xa1\x86\xe7\xa2\x45\x3c\x85\x6f\x9c\xaa\xe0\x9e\x4f\x9e\x84\x58\x3d\x6a\x07\x64\xdf\x49\x37\x88\x08\x22\x0c\xf1\xd7\x47\x47\x00\x83\x95\xa1\x7d\xa7\xc6\x56\x6d\x0f\xcc\xda\xca\x5c\x89\x5f\x0c\x35\x8c\xf1\xcb\x8b\x0b\xac\x6a\x6c\xd0\xd9\x4f\x0d\x5a\x9a\xa4\x7e\xf4\x86\xc2\x0f\xe8\x98\xe3\xc1\x8d\x5f\x7c\x78\x27\xbb\xd2\x32\x2e\xec\x10\x89\x36\xbd\xcd\xa5\x15\x19\x04\x26\xf4\xab\x83\x8f\x76\xf1\x6c\x52\x84\x14\x86\x4b\xf6\x32\xfa\x26\x72\x71\xe0\xb1\x67\xe9\x05\x66\x72\x18\x4c\xf6\x44\x95\x02\xd9\x4e\xc8\x1c\x52\xab\xc3\x8a\x48\x45\x4d\xd5\x93\x2e\x93\x1f\xc0\x55\x4d\xf5\x29\x92\xfa\x3a\x7b\x33\x8a\xa8\x12\xcf\x1a\x82\xfc\x53\xf5\xf2\x6b\xbb\x34\xd6\xb0\xb0\xab\xbb\xe1\x32\x8a\x4e\xe0\x90\xcc\x43\xbd\xe8\x56\x52\x6e\x0d\x0d\x94\x48\xa9\x91\x97\xb0\xa2\x35\x5a\x74\x59\x48\x78\x8c\x8b\x95\x75\xd3\x69\x67\xc4\xd7\xde\x3b\xb5\x2c\x95\xcb\x4e\x76\x6e\x75\xb8\xea\xc9\x17\xeb\x7f\x26\x3b\xfd\x0c\x1d\x8e\xe9\x17\xd9\xce\xf0\xb5\xf5\x08\x85\xf0\xd6\xcc\x18\x7c\xe2\x1e\x1f\x3d\xf7\xd6\x6f\x23\xde\xea\x36\x62\x2e\xf6\xe1\x64\x7b\x7b\xcd\x62\x56\xab\xf1\xe5\x45\x53\x43\x37\xe2\x75\xf6\xc2\xe0\x36\x04\x1e\x33\x5a\x7b\x2e\xfd\x64\x4b\x86\x43\xad\xf0\x56\x99\x09\x95\xe7\x62\xf2\xfc\x79\xcf\xcf\x66\xd2\xc8\x25\x2c\x90\x9b\x33\xbb\x53\x7f\x03\xc4\x07\x0b\xff\xac\xbb\xa6\x05\x7d\x61\xba\x8f\x52\xb7\xba\x60\x32\x28\x47\x54\xcf\x67\x6b\x1d\x51\x9d\xbf\xe9\x14\xfc\x6a\xc5\x4d\xf3\xd5\x3a\x37\xcd\xfa\xf6\x3c\x3b\x6a\xfe\xe9\x8e\x67\x93\x76\x16\x28\xc3\x8f\xac\xfb\xfa\x6b\xaf\xcd\x74\x13\xf7\x57\xae\x9b\xf5\xad\xb2\x4b\x54\x44\xae\xb8\x6f\x76\xed\x65\xd6\xfb\xb5\xfb\x66\xd3\xd9\xb2\x2a\xc1\x74\xe1\xec\xa2\x0b\x67\x0f\x5d\x38\xfb\xe8\xc2\x39\xb0\x17\xd9\x26\x94\xda\xfa\x9d\x0b\x67\xd4\x73\xc5\xcb\x35\xdd\x38\xbb\xe8\xc6\xd9\x43\x37\xce\x3e\xba\x71\x0e\xd0\x8d\x73\x13\xdd\x38\xb7\xc8\x8d\x73\x97\xca\x3f\x8b\x3f\xcd\x68\xec\x64\xd0\x9b\xe9\xfb\x94\xff\x43\x7b\x5d\xf4\x69\xe6\xa0\xa7\x64\x76\xb6\x14\x32\xd9\xe5\xe8\x43\xa4\x11\x1f\x92\xca\x47\xa4\xf2\x01\xa9\x18\x70\xd8\x26\xb7\xee\x6d\xf5\xd8\x33\xfb\xfc\xb1\xb4\xb7\x47\x4e\x96\x1b\x6b\x01\x5d\x49\xd5\xc7\x2c\x65\x45\xbd\x4e\x89\xd4\x43\x71\xa7\xfc\x90\x70\x51\x25\x27\x52\x95\x0e\x3a\x73\xe9\x16\x77\xf6\x35\xe8\x00\xbd\xbe\xc4\xb8\x76\x99\x19\xc9\xe7\xeb\x8a\xff\x4c\xcb\x78\xeb\xa8\x71\x2f\xfd\xa6\x4b\x27\x9a\xaa\x63\xa2\x7e\x34\x15\x14\xb6\xf1\xa6\x03\xe2\xf7\x0f\xa4\x85\xe8\x49\xd3\x71\x2e\x0e\x2c\xcf\xc1\xee\x69\xca\x77\x94\xa6\xd9\x9f\x21\x93\x1e\xa4\x68\xae\xda\x2d\x28\xbc\xc5\x5e\xa9\x5b\xaa\x58\x60\xaa\x1b\x2d\xb2\x47\xdc\x0a\x70\xd7\xec\x32\xae\x85\x67\x4e\x5d\xfd\x2a\xec\x6b\xd7\x91\xf3\x3d\xb0\xfb\x7e\x96\x1d\x87\xda\x41\x53\x7a\x52\x73\x89\xed\xc3\x6d\xb4\xfb\x5a\xef\x26\x82\x54\x80\x92\xeb\xcb\x4b\x80\xd5\x45\xe7\xa2\xf2\x84\x08\x77\xea\xbe\x8f\x53\xa9\x69\x91\xcd\x5c\xd0\x94\xb5\x7e\xc5\x47\x83\xc5\x03\xca\x68\xd2\xc7\x92\xb2\xb6\xc3\x67\x8e\xd1\xd7\x37\x5a\xba\x17\x3c\x76\xe5\xdd\xf7\xd9\x97\x37\x57\x95\x5b\x8c\xbe\x6f\xe8\xd0\x8e\xfd\x6f\xa7\x95\xff\x6d\xec\xc0\xa6\xe3\x72\xaf\x51\x11\x4d\xcc\xdf\x94\x99\xa5\x54\x89\x07\x6a\x02\x98\x00\xe3\xb8\x4e\x98\xf2\xdd\x3e\x4f\xbd\x70\xc8\x64\x17\xe0\xe3\x16\x9e\x76\x7a\x4a\xaf\xf2\xd0\x4a\x41\x80\x87\xd3\x7a\xed\xe3\xe4\x95\x28\x53\x29\xcb\xf2\xc9\x4b\x6a\x8e\x9d\x9a\x63\x79\x2f\x2f\x19\x0e\xe8\x67\xa3\x0d\xc9\xab\x81\xbd\x84\x6d\x4a\xe7\x9a\xac\x5a\x6a\xaa\x31\x6d\x41\xa6\x26\x8c\x31\x4c\xed\xed\x6d\x72\x00\x2d\x67\x22\x42\x60\x24\xe8\x67\x89\xfb\x02\xa5\xd1\xf3\xb8\x2a\x9f\x4f\x07\xcb\xf7\x34\xab\x8a\x65\x9c\x68\x0d\x88\xf1\x43\x20\x5d\x88\xec\xaa\x48\x0f\x22\x01\x22\x7f\x54\x90\x81\x82\x28\x9c\x5c\x6b\x2f\x11\xc0\x38\x39\x03\x5b\xa6\x64\xee\x1d\x90\xa5\xea\xf8\x88\xf9\xc0\x92\x89\x3d\x23\xb1\x0b\x72\x05\x01\x0b\x75\x75\xfd\x4a\xfa\x69\x85\x89\xb9\x80\x7f\x4b\xcb\x4e\x66\x2c\x23\x47\x88\x38\x00\x84\x01\x20\xca\x53\x49\x42\x0c\x45\xd5\xae\x93\xfe\xe6\xda\x7c\x03\xd7\x9e\xf0\xcf\x80\x7f\xb0\x25\x58\x6b\xd9\x97\x4e\x8f\x7a\x12\xf7\x69\x9c\xcb\xd0\x93\xf0\xb9\xe6\x4e\xe6\xde\xe2\xde\x45\x2b\x57\x84\x52\x97\xcd\x1d\x4e\xb3\x9f\xed\x82\x93\x98\xa7\x96\xc9\x19\x7c\xfa\x03\x84\x16\x10\x5a\x58\xb9\x67\x67\x63\x20\x12\x05\x6b\xef\xe7\x55\x2f\x5b\xb0\xef\x86\x59\x40\x48\x16\xde\x43\xe2\x6b\x16\x61\xbe\x60\xe0\xe2\x35\x57\x70\x9e\x53\x57\x3d\xc8\xf2\x9c\xba\x1b\xe2\x3c\x28\xc0\xf0\x0b\x6b\xe6\x84\x78\xe9\x6f\xf2\x1b\x7b\xcf\x3b\x6e\xf6\x39\x09\xb3\x8a\x66\x3f\xd6\xa5\x84\xbe\x47\xc8\x03\x5d\x66\xa7\xf0\x1e\x6d\x6e\x1d\xfd\xd1\xf4\x57\x59\x23\xc8\x57\x82\x7c\xa5\xd7\xd7\xd1\x5e\x62\xee\x5c\xd7\x13\x23\x7b\x06\x63\xd7\x49\xcc\x61\x40\x0a\x08\xb8\xa9\x27\x26\xd8\x64\x34\xf5\xb2\xec\x67\x09\xa2\x8e\x98\x10\xa8\xe0\x5c\xf4\xa9\xd7\x4f\xfb\x89\x02\xf4\xf6\x33\x34\xd4\x86\xf2\x81\x55\x35\x13\x96\x90\xb0\xc4\x04\x98\x6a\xd9\x82\x33\xc7\xc6\xc0\x08\x14\xb6\xb7\xe7\xc0\x07\x88\xbd\x79\x76\xa5\x64\x0f\x17\xcf\x01\xde\xbd\xb3\xd1\xb0\xac\xf0\xf2\x92\x18\x98\xdf\x97\x03\x81\x35\x06\x92\xd2\x24\x20\x1e\xc6\xe2\xcf\xd2\xe6\x7b\x17\xae\x15\x06\x32\x7f\xa7\xf1\x5e\x07\x74\xcb\x02\x65\x25\xe8\x02\x99\x63\x04\xbd\xc8\xb9\xac\x0f\xe4\xe9\x27\x8a\x39\x08\x31\x07\x71\xcc\x2e\x9d\xdb\xcc\x60\x12\x51\x95\x06\xb4\xd8\x60\xde\x46\x60\x8f\x78\x08\x4f\xf9\x37\x7c\xce\x6c\xbd\xb6\xf0\x12\xa4\x6b\x7a\x28\xf1\x42\x86\xe9\x20\x4a\x12\xda\xe4\xec\xf4\xd7\x3b\x1d\x2d\x66\xc7\xc5\xfb\x69\xb4\xa0\x21\xb8\x8c\x79\x42\x5e\x8f\xa3\xcc\xd5\x17\x49\xc1\x04\x01\xad\x98\x97\x1c\x59\x32\xe2\x22\xb3\xe3\xf8\x32\x0f\x04\x03\x0e\x1e\xb8\x1a\x5a\x87\x60\xf0\xba\xda\x8e\x9b\x88\x04\xa7\x3c\xed\xc1\x8a\xa0\x2f\xe0\x7c\xf0\x73\xb0\x20\x3c\x6b\x0f\xc9\xdd\x32\xe9\xbd\x07\x14\x54\x0b\xc2\xdc\x40\xc8\x42\x1b\xd5\xc0\xd4\xf5\x70\xea\xfa\xe6\xb3\xfb\xd7\x51\x6f\x05\xb0\x5c\x28\xd7\xdd\x90\xda\x00\x31\x20\xf5\xb8\x78\xe8\x13\x64\x90\xe9\xe3\x39\xb4\x20\x83\xa4\x44\x40\x31\x76\x04\x11\x00\x75\x2d\x27\x3f\x7f\x73\x78\xb2\xe0\x41\x97\x22\xb3\xbe\xe3\x34\xa3\xa9\x7e\xb2\x09\x15\xe6\xe7\x18\x64\x7e\x5f\xfb\x85\x91\xc4\x15\x18\xa6\xf7\xfe\x4e\x93\x9f\xf5\x5f\x93\x0e\x5b\xe2\xfb\xe6\x8e\xaf\x48\x6d\x90\xf4\x62\x4c\x46\x32\xd1\x4c\xfa\xd6\x87\x96\x9d\xf0\xdf\x43\xea\xfb\x26\x84\x2d\xf6\x8c\x71\x5b\x8f\xd8\xb6\xa9\xde\x08\x6d\x1f\x93\xb0\x53\xe0\x0b\xac\x30\x77\xaf\xc2\x86\xb8\x39\xe5\xd5\x01\x6f\x82\x3d\x8c\xf1\x62\xe3\x68\x38\x4a\xe8\x1b\x0b\x0a\x4e\xb7\x09\x38\x05\x2f\x30\x20\x05\x76\x1c\x28\xc8\x6f\xf4\x82\xfb\xc6\x05\x7a\x90\xb0\x1b\x69\x1b\x77\x02\x97\x74\xb0\xd1\xd7\x1a\x07\x4e\x1a\x6f\x20\xe0\x26\x34\xf8\x3a\xca\x0d\x98\x7c\xfa\x8d\x01\x16\xd3\x1c\x5b\xf2\xab\x36\x15\x07\x6b\x1b\x28\xf8\x20\x99\xe4\x2d\x5e\xbe\xf2\x80\x96\x27\xe8\x83\x0e\xef\x3f\xa2\xe6\x28\x14\xb7\x49\x63\x03\x75\x0c\xe7\x98\x4b\x86\x1c\xad\x70\x3b\xee\x22\x07\xd5\x83\x4a\x0c\x1c\xf2\xc3\xdb\xfb\x3a\xc8\xf5\xa0\x12\x5d\x2c\xca\x6f\xa0\x4c\xea\x35\x7a\xf7\xd6\x3d\x4a\xfd\xee\xbd\xd3\xa2\x26\x91\x98\xd3\xb5\x5e\xa9\x8f\x60\x1a\xa1\x1b\x84\xc4\x73\xd9\x6e\x44\x7c\xab\x1a\x9d\x8d\xcf\x5f\x87\x75\x40\x97\x23\x2e\x9d\xe4\x99\xe3\x28\x42\x14\xcf\x38\x37\x8a\x88\x31\xe3\xe1\xd3\x9f\x42\xbe\x41\xb0\xd9\x0f\xa6\xed\xa1\xbf\xf9\xc7\x9f\x3b\x62\xe7\xcf\x3f\x48\xd5\xda\x41\xef\x23\xe8\xb8\x20\xf0\x53\x7f\xe6\x36\xcc\x27\xfe\x0d\xb9\xa2\x7a\xa3\x05\xdb\x5e\x01\x44\x68\x16\xad\x23\x9e\x37\x75\xbe\xde\x4a\xbe\x98\x0d\x1a\x95\x60\xf3\xad\x04\x3c\xae\xc2\xe3\x0f\xbe\x55\xde\xa4\x23\x2b\x9c\xf3\x68\xce\xec\xa0\x4f\x41\x1f\xe8\x01\x3f\xe7\x1d\x91\x80\xf1\xc0\x81\x06\x98\x5c\xab\xbd\x4b\xa3\xd2\x34\xac\xc2\xe0\x9f\x56\xa1\x71\xbf\xae\x02\x34\x2b\x3c\x3a\x0e\x93\x17\xdf\x8d\x24\x39\x47\x95\xae\x41\xd6\x2a\xfd\xb5\x19\x7e\x7e\x14\x51\x96\xc0\xb7\x9e\x3d\xba\xc0\xcb\xa3\x41\x16\x7b\x9b\x28\xdc\xe8\x81\x98\x0d\xba\x83\xe1\xd3\x00\x06\x80\x26\xc8\x04\xa7\x07\xd4\x7c\xec\x78\xa2\x31\x79\x44\x8d\x0d\x44\x6b\x6d\x60\x1a\xe1\xb7\xd4\x16\x6f\xb1\xf6\xfb\x53\x61\x57\xe0\xdf\x01\xfc\xab\xc2\xbf\x43\xf8\x57\x83\x7f\xfd\xa5\xb0\x8f\x9f\x85\xfd\x38\xc1\x56\xcb\x26\xbb\x91\x26\x3b\x1b\x2e\x1a\x96\x0b\xf4\x15\xeb\xdf\x3b\x1e\xae\x0e\xf8\xd8\xf1\x4d\xcc\x5e\x01\x1f\x5c\x04\xba\x4c\x81\xb9\x0b\xfc\x0b\x85\x9a\x9d\x71\x50\xc6\x76\x39\x03\x06\x54\x6f\x9c\xd1\xab\xbe\x98\x8d\xb6\x90\x89\x16\x54\xa0\xf1\x5c\x8e\xfa\x01\x36\xe6\xb8\xf2\xe7\xd2\x2b\x38\x3f\x85\x4f\x6e\x00\xbc\x5e\xc7\xeb\x62\xa0\x15\x4c\x3d\x7c\xbb\x62\x31\xc5\x58\x7f\x38\x9b\x04\xfd\xe1\x3c\xd0\x11\x9c\xbf\x63\x1d\xeb\x05\x82\xd3\xdc\xe1\x02\x7f\xc6\x81\x3f\x16\x4f\x1c\x52\xd9\x46\x3d\xb1\xcc\x0f\x3a\x7d\x76\x96\x83\xcb\xb0\x33\xe8\x4c\xda\x26\x48\xfa\x49\xe9\x4a\x9d\xe5\x52\x18\xaa\xfc\xa5\xaf\xfd\xa8\xec\x57\xb4\xb6\xff\xf1\x58\x07\xeb\x30\x4a\x40\x0d\x3c\xe5\xb9\x5a\x1f\x27\x0a\xfd\x20\x50\x80\xd7\x74\x84\xe5\x69\x4b\xea\x80\xdd\x28\x44\x56\x35\xf9\x25\x32\xbd\x8d\x78\xfc\xf2\xaa\x2b\x15\x2e\xfa\x88\x60\x09\x5f\xe3\x35\xa3\xbc\xad\xe7\x0c\xb8\x3c\xcd\x68\x0e\xe5\x93\x59\xea\x58\x69\xc3\x58\xee\xc6\x9c\x3d\xb8\x31\xad\x9a\xd3\xea\x54\xef\xf1\x18\xe7\x8c\xf8\xea\xe6\x84\x34\x59\x4d\x1d\xb5\xd5\xb3\x57\xc7\xf0\x1d\xcb\xe8\x87\xd7\x57\x54\xd0\xbd\xe1\xf8\x99\xfd\xfb\xbc\xa3\x37\x00\x55\xef\x0a\xf3\xed\xf6\x25\x1e\xcc\x9f\x3e\xc5\x0b\x30\xfc\xeb\xea\x22\x5c\xa4\x05\xa6\x35\x3a\xbb\xf4\x6d\x74\x81\xfd\xa9\x54\xed\x06\xc3\xa5\xb1\x93\x95\x15\x7b\x61\xbf\xc8\x6f\xf9\x38\x41\x71\xda\xc2\x3c\x2b\xf2\x3c\x5b\x51\x06\x75\x7b\xf2\x99\x4b\x2c\xf6\x6a\x9f\x8b\xbd\x8f\x9e\xf8\x77\x49\x3e\x85\x72\x4c\x8f\x31\xf2\xc8\xcc\xd0\xdc\x35\x87\xf2\x19\xcd\x87\x02\x3e\x35\xb7\x26\x85\x3f\x52\x52\x1f\x89\xe1\x48\x4a\xf2\x87\x27\x06\x48\xc2\xfd\x00\x26\x7f\xbf\x33\x80\xfd\x6d\x38\x1b\xf8\x9d\x41\x0b\x02\x0b\x20\x2a\xd3\x4e\x0f\x67\x4e\x80\x27\x69\x10\x98\x0e\x37\xc5\xe6\xc4\x0b\x06\x41\xea\x8f\xdc\x86\x59\xef\xe6\x50\xd6\xfb\xa1\xb0\xe6\xf0\x31\x23\x13\x8f\xda\xeb\x9f\x71\x87\xc9\xa2\x66\x40\x51\xbf\xae\xac\x4c\xdf\xf6\x2b\xc4\x28\x08\x14\x91\xbe\x2a\xcf\xcb\x00\x44\xda\x4d\x87\xf3\x69\xf5\xe2\x19\x00\x0f\xff\x5f\xde\xfe\xb4\xab\x6d\xa4\x6b\x14\x40\xbf\xe7\x57\x84\x2c\x0e\xaf\x15\x0b\x37\x43\x3a\xe9\x96\xa3\x78\x61\xcc\x8c\x4d\x02\x09\x84\xf8\xe1\xf6\xd2\xe4\x01\x1b\xdb\x78\xc2\x10\x7c\x7e\xfb\xdd\x53\x95\x4a\xb2\x4c\xd2\xcf\x7b\xee\xed\xd5\xc1\x52\xa9\xe6\xda\xb5\x6b\xd7\x1e\x55\x44\xf9\xa9\x9f\x3b\xdc\xb7\xd5\x46\x02\x4c\x74\x24\xa0\xe4\x21\x1a\xcc\x3d\x8c\x3c\x92\xaf\xd6\xae\x8c\x53\xc8\x27\x2c\x73\x7c\x84\x48\xc6\x06\x64\xb3\x1c\xd1\x18\x4e\x47\xbf\xe8\xe8\x70\xb0\x5d\x8b\x4b\xf1\xcf\x6f\x63\x9c\x0c\x54\x33\x9f\xab\x8e\x7a\x88\xbb\x17\x7a\x7c\x8b\x78\x71\x5a\xb6\x93\xa8\x91\x74\xb7\x63\x3c\xe0\x6b\x66\x28\x41\xb3\x52\xaa\xbe\x6b\x22\xc2\xa1\x68\x35\x0c\x12\x83\x61\x84\x5e\xc3\xba\x80\xc3\x00\x0c\xbc\xd7\xcd\x61\x7f\x32\x40\xb1\xea\xa4\x67\x9e\xf4\xb0\xfe\xcc\x85\x2d\xbb\x5d\x03\x49\xf1\x72\x76\xdd\x5e\x3a\xad\x57\x76\x07\xe9\xb4\x83\x03\x77\x14\xa7\x25\xe8\x06\x89\xcd\x79\x41\x7e\x00\x13\xb0\x0a\x13\x8b\x40\xd8\xf2\xe0\xf4\x23\x78\xe4\x0e\x8e\x5b\x1e\x7c\xeb\xa2\xc3\xb2\xc7\xd7\x2d\x6f\x04\x1f\x04\xdf\x43\x57\x65\xa4\x02\x5c\x5e\xe1\x0e\x77\xb5\x74\x9f\xdf\x9b\x12\x49\xf8\xb0\xcb\xef\x2a\xc8\xb8\x7a\xaf\xa5\xde\xcf\x52\xef\xdf\x04\xd6\x7a\x52\xdf\x91\xd4\x7f\x20\x61\x0b\x68\x3b\xde\xc2\x76\x44\x5d\x83\x9b\xa5\x74\x8f\x49\xb3\x69\x3f\xe9\x54\x16\x6f\x55\x36\xe2\xc7\x14\x91\xe0\xa9\xd3\x25\xc6\xc8\x3a\xc3\x28\xcd\xbc\x6c\xca\x4e\x22\xae\xcd\x27\x59\xf1\xd7\xa3\x81\x07\x7d\x86\x0d\x93\x9c\x14\x48\x48\xce\x0a\x24\xc0\xb4\xbc\x4a\xa6\x24\x27\x06\x12\xce\xd2\x09\xc9\xa9\x81\x04\x73\x6e\xa8\xfb\xf1\xa1\x08\x3d\xc4\x6d\xed\xdb\x9b\x56\xc6\x78\x26\x02\x17\x1b\x9f\x92\xc3\x31\xc7\x41\x93\x05\x2d\xd0\x51\x62\xce\x72\xd7\x27\xe5\x8c\xa3\x61\x0e\xc9\x0b\xd8\xfc\x7b\xa8\xad\x76\x72\xc3\x0e\x54\xee\x5a\xee\x61\xdf\x2b\x62\x42\xa1\x35\xa1\x6b\x23\x86\x5d\x0c\x43\x78\x9c\x4a\xc6\x4c\x7b\x1d\x7d\xb2\x41\x6f\xd2\x27\x1b\x24\x79\x37\xa9\x89\xb5\xf5\x8a\x1e\xc9\xc1\xc2\xd9\x6e\x12\xfb\x71\xe1\xf4\x49\x0d\x06\x0e\xb6\x74\xa7\x8c\xb8\xb8\x1f\x53\xcb\x3d\xb7\x78\x38\xfd\x9a\x3b\x29\x4e\xa4\xe0\x44\x12\x4f\xaf\x96\xf9\x2a\xb9\x6b\xce\xe3\xab\xbf\x55\x7c\xe5\xe7\x5a\xbf\x89\x68\x98\xc1\xdf\x74\x9b\xcf\xcf\x40\xe3\x34\x0b\x43\x97\x2d\x70\xfc\x12\x3c\x3b\x3e\xa4\xcc\x24\x25\x84\x94\x99\x13\x42\xca\xa3\xa4\x34\x20\xe5\xd1\x69\x14\x63\x54\x05\xd7\xca\x5f\x2e\x5e\x53\x2d\x5e\xf2\xfc\x89\x35\xa8\xeb\x33\x74\xf0\x65\xc9\x6a\xe1\xdb\xce\x89\x32\x89\xc4\xb7\x2b\xe5\x24\x08\x08\x1c\x94\x61\xac\x63\x68\xc2\x00\xfe\x3e\xb4\xc3\x71\xcb\xd9\x7a\xeb\xd9\xad\xa8\xdd\x6c\x8d\xf1\x71\x1e\x03\xa7\x39\x43\x7e\xae\xfd\x2f\x26\xc8\x1e\x59\x3f\x47\xee\x88\xa6\x68\x54\x18\xce\xf4\x1c\xe1\x8b\x83\xf4\xfa\xf0\x51\xcf\x12\xbe\xc0\x34\x8d\xf4\xc4\x35\x20\x69\x06\xd3\x34\xd2\x13\xd7\x84\x94\x47\xa7\x69\x4c\xdc\xe8\x37\x26\x6e\xf2\x3b\x13\x77\x79\x64\xd9\xaf\xe2\x99\xbb\x3a\x32\x67\x6e\x47\x5b\x03\x65\xcc\x63\x40\xf3\x18\xae\xfb\x59\xf3\xe8\x2f\x9d\xc7\xce\x7f\x3d\x8f\xb3\x4d\x63\x1e\x51\x92\x54\xa4\x88\x1f\xf1\x3c\x3e\x6e\xf2\x3c\x6e\x99\x13\xb9\xc5\x33\xb9\x65\x4e\xe5\xd6\xbf\x9e\xcb\xa3\xdd\x5f\x4f\x65\xf9\xc4\x84\xc1\x4a\x02\x06\x77\x13\x33\xb9\x77\x92\x98\x49\xf6\xe8\x82\x17\x78\x98\x50\x7e\x21\xcf\xc3\x3c\xaf\x8a\x2d\x04\x54\x92\x4c\xaf\x62\x05\xa1\x60\x77\xc9\x2c\x37\x0f\x97\x73\x0f\x0c\x87\x44\xaf\xfc\xff\xa3\x99\x3f\x1b\x9f\xc2\xb7\x41\x29\xcc\x07\x4e\x98\xe0\x2e\x90\x91\x0f\x4a\x35\x72\xa2\xf7\x17\xba\xa8\x24\xc4\x8f\x1f\x51\x08\x1c\x8a\x07\x98\x86\xeb\x29\x2d\xf4\x06\x7d\x68\xc8\x07\xc5\x7b\xf8\xe8\x86\x2a\x6e\xe6\xa0\xe6\x78\x76\xf3\xc1\x73\x74\x1f\xb1\xa1\xae\x78\x32\x9b\x58\x3f\x07\x50\xd9\x80\x2b\x1b\xc1\xe3\x28\xd6\x68\x9f\xba\x83\x3f\x88\x43\x8a\x4c\xd0\x27\xf3\xa5\xec\x06\xf9\xae\xb8\xbd\x9e\x5a\xe8\x70\x22\xdf\x13\xcf\xd7\xf0\x5a\x31\xbe\x3e\x21\x3f\x39\xfe\xfa\x64\x15\x27\xcf\xcf\xb9\x89\x3b\xb0\x07\x2e\x40\x84\x3b\x41\xa6\xb5\x9f\xc3\xbe\x6c\x58\x25\x28\xe7\xb0\xc5\x60\xd9\xae\x70\x27\x6a\xf2\xf5\x6f\xf8\x0c\xf5\xc8\xe7\xa9\xfd\x44\x3a\xa2\xf4\x09\xba\x05\x45\xd7\xbb\xb2\xa4\x54\x34\x94\x6f\x5b\x1f\xb0\xdc\x7a\x4f\xbe\x51\x39\x99\x99\x19\x8a\x47\x11\x94\x51\x46\x3a\x41\x19\x69\x6d\x3e\xb7\x5b\xe6\x54\x69\x81\xb6\x5e\xa7\x28\x37\xe0\x35\x9d\xba\x9b\xeb\x03\x18\xdb\xf4\xed\x14\xa6\x63\xf0\x76\x00\xc3\x7e\x82\xe7\x27\x77\xfb\xed\xe0\xed\x13\xcc\xc9\xf6\xdb\x57\xd3\xb7\xe5\xe2\xe0\xad\x5b\x2e\x36\x88\x6e\x2a\xcc\xde\x56\x30\x6c\xc9\xdb\x27\x0c\x3f\xf0\x76\x9a\x0f\xe1\xef\x00\x5d\x65\xd0\xd7\x47\xfa\xfa\x48\x5f\x1f\xe9\xeb\x23\x7c\x9d\xb3\x85\x66\x1d\x45\x99\x90\x1f\x4e\x1d\x7c\x7e\x84\xe7\xc7\x1b\x68\x65\x0b\xd9\xa9\xeb\xef\xde\xa2\xa3\xca\xad\xb7\x28\x76\x7b\x62\x46\x2f\x3c\x95\x5d\xfc\xc9\x6f\xd3\x47\x28\xbb\xbe\x4d\x19\x2a\x6e\x6e\x7d\x9a\x67\xc1\x01\x74\x1f\x0a\x3f\xbd\x2d\x5b\xd6\x1f\xb9\x2d\xf8\x81\x2a\xe1\xeb\xfa\x92\xaf\x45\xde\x12\x15\xeb\xd3\x51\x19\xe0\xae\xe2\x16\xfe\x54\x69\x53\x49\x9b\x52\xda\xc6\xc7\xca\xda\xda\xe6\x27\xf8\x13\x41\x6e\x78\x9d\xe2\xeb\x14\x5f\xa7\xb0\xb0\xd4\xed\x47\xea\xf6\x23\x75\xfb\xb1\xf8\xe4\x0a\xc3\xb8\x48\xdd\x7e\xa4\x6e\x3f\xe2\x24\x50\xb7\x1f\x8b\x2f\x76\xbb\xf8\xff\x8f\x6e\x57\x5c\x04\x1a\x82\x24\x62\x3f\x91\x9f\x92\xc7\x64\xca\x04\xd0\x3c\xc0\x13\x81\x69\x9c\xe9\x34\x99\x32\x01\x84\x32\xf0\x72\x15\xbb\x52\x38\xf4\xd7\x2b\x80\x64\x49\x0d\x15\xdf\x4f\xf1\xfd\x31\x36\x95\xaa\xcc\xe7\x84\x68\xba\x1a\x9d\xdb\xcd\xc3\x24\x46\x27\x05\xf4\x98\xf0\xf7\xcd\x3b\x8a\x6f\x22\xc0\x4d\x62\x67\x63\x8f\xe9\x17\xba\x49\xbf\xa7\xf2\xcb\x68\x70\x43\x61\xbf\x0d\x61\xad\x7c\x1e\x20\x1f\xa1\xeb\x93\x35\x41\x02\x73\x87\x88\xb9\x43\xf4\xeb\x02\x98\x3b\x04\xd2\x31\x7c\xe9\xfa\xda\x9a\x71\x81\x0c\x8d\x89\xcf\x03\x52\xda\xeb\x7b\x79\x65\x09\x9e\xa4\xd4\xa8\x5e\x74\xb9\x9c\xa5\x9d\xc1\x85\x2f\x96\x14\xe6\xb2\xde\x30\xe5\xd4\x97\x95\x1d\x3a\x80\x0e\x7e\xa2\xde\xf7\xa0\xa6\x10\x6a\x87\xdf\x3a\xfc\x06\xe8\x03\x19\xda\x6b\x6b\xf8\xd3\x29\x19\xed\xf9\xbb\xf9\x10\x9b\x8b\xf2\xc7\x3b\x79\xc0\xcc\x9e\x95\x7f\x45\xad\x3b\x80\x8e\xb8\x0c\x17\x5e\x5e\x8a\xba\x9b\xf3\x51\x0e\xe1\x48\x91\xbf\x7f\xab\x44\x1e\x4b\xfc\x2d\x45\xb8\xb9\x17\xfa\xe6\xa1\x69\x0f\x77\xcd\xc8\xb3\xab\xe7\x0b\xff\x48\xf6\x11\xba\x63\x83\x3f\x1d\xfc\x03\xb7\xe4\x27\x2b\x35\x99\x5f\x1e\x52\x6b\x98\x58\x83\x56\x33\xbd\x70\x5a\x83\x0e\x41\xf8\xee\xbf\xa7\x48\x4c\x82\x84\xe9\x11\x93\x1c\x01\x6a\x64\x80\x27\x97\xa6\x46\xea\xc3\x1b\xa7\x41\x5b\x4a\x25\x02\x39\x52\xdf\xb9\x71\x9a\xd6\xbf\xa4\x47\xba\x83\x4c\xda\xce\x20\x2a\x4c\x1a\xee\xd5\xa3\x63\x10\x71\xb2\xa1\x34\x05\xd8\xd2\x84\x85\x4a\x3a\x6f\x26\x28\x8b\xa3\xc5\x5b\x92\x21\x68\x60\x25\x28\xd5\x94\xd9\x8e\xd9\x82\x51\xb5\x7e\xb6\x8c\x68\xd0\x4c\xb6\xf4\xff\xcb\x5b\xc8\xcc\xb8\x85\xcc\xe8\x16\xf2\x68\xdc\x42\x70\x21\x82\x59\xae\xa9\x17\xa2\x59\x6f\x87\xb4\x12\xff\xee\x26\xf2\x6d\x37\xd9\xdb\xc1\xb1\x5d\xdf\xbf\x83\x7b\x44\xd9\x9e\x95\xed\x47\xe8\x76\xd9\xde\x29\xdb\xbb\xe5\x34\x1e\x54\x94\x8d\x0e\x96\x1e\x5c\x02\xf5\xb3\xdb\x1e\x06\xe8\xf7\xd6\xae\x1c\xc0\x89\xdf\x9d\xc0\x89\xff\x70\xe5\x74\x6d\x8c\x58\xe5\xf4\x6c\x74\x67\xef\x0c\x18\xcb\x1e\x3e\x7a\x2f\xd0\x73\xa6\x21\x3f\xf9\x0e\x18\x36\x27\x14\x47\x9a\x7d\x08\xbc\x62\x27\x02\x31\x93\x59\x7f\x0e\xb4\x42\x87\x99\x96\x41\xfd\x8d\xf8\x81\x2c\x63\x88\xfc\xc3\xe5\xdb\x27\xa7\x2a\xf0\x70\x3b\xf1\xe4\xa9\xb2\x1f\x1b\x94\x84\x2b\x6c\x51\x62\xbc\x7e\xc5\xe0\xee\xec\xe6\x26\x4c\x70\xb2\x7d\xa5\x9d\xd7\x50\x95\xb7\x75\x9d\x1d\xfd\xb4\x67\xd4\xde\x48\xd6\xde\xe0\xda\x7d\xf1\xa1\xd6\x48\xb0\x9c\x70\x05\x68\x10\xf4\x20\x76\x3c\xb8\xb6\x50\xe7\xf1\x31\xfa\xba\x84\x87\xde\x8e\x27\x4f\x07\xc7\x86\x55\x4c\xb2\x99\xc0\x68\xe6\xe0\x38\xe1\xbe\xbe\x6b\xd2\xd5\x52\x79\x57\xd7\xd9\xd7\x4f\x87\xc7\xbf\x9a\x22\x5f\x9c\xcd\x99\x53\xd4\xcb\xa8\xfd\x4e\xd7\x39\xd0\x4f\x47\xa9\xda\x5f\x2d\xa9\xfe\x28\x59\xfd\xc0\x14\x66\xfb\xd4\xf5\xd6\x2f\xe6\xc0\x53\xb6\x4c\x56\x82\x2b\x95\x54\xb5\x0c\x4b\x07\xc7\x0e\xac\x76\x83\x2b\x8d\xf2\x27\x77\xe4\xc8\x43\xde\x4e\xd1\x17\x58\x28\xbe\xfe\xd9\xa5\x34\x9c\x1c\xcd\x58\x21\x8c\x72\x55\x21\xd7\xf3\xf3\x7e\xd9\xee\xaa\x94\x33\x95\xd2\x53\x29\x35\x4a\x39\x28\xdb\x03\x95\xf2\x59\xe5\x89\xdc\xba\xe1\xf9\xf5\x86\xa4\xb8\x68\xdd\xea\x17\x8e\x87\xc4\x1d\x75\x47\xa5\xf3\x7a\x74\xe3\x54\x51\xbe\x02\x54\x3f\x47\x1e\x38\x10\xd1\xb2\x8f\x96\x18\xe2\x5a\xf0\xea\x80\x89\xff\x89\x1b\x3c\x7a\xf9\xdc\xa8\x74\x99\xcf\x3b\x17\xb0\xb7\xd8\xfe\xe9\xfe\x00\x59\x2f\xbe\x38\x99\xea\xc8\x63\x85\xfc\xd6\xf9\xe2\x62\xaa\xa7\xec\xd2\x4f\xd0\x3b\x43\xc7\xa8\x1c\xfd\xc2\x75\xf0\x53\x1b\xfd\xe1\xca\xb3\x38\xad\x6b\xa4\xf2\x35\x54\xbe\xa6\x3c\x8b\x2f\x39\xf2\x9e\xdf\x41\x86\x0e\xc5\x34\x66\x11\x25\x0f\xcf\xf5\x69\x80\xae\x0f\xe7\xc6\x28\xbc\x81\x45\x3c\x39\x2e\x5a\x68\x67\x79\x1b\xdd\x90\xc3\x85\x73\x94\xa8\xef\xc3\xa4\x05\x90\x65\xdf\xa7\x00\x22\x68\xf3\x69\xcd\x03\xb7\x75\x92\x9f\xa0\x91\x37\xc2\x50\x20\x2e\x07\x61\x5d\x03\x51\xe9\x0d\xd1\x51\x6f\x2b\xc0\x00\x65\x7f\x5a\x70\xec\xb7\x4e\x30\x0f\x7a\x36\x8c\xac\x04\x93\xcf\xf4\x86\xcb\x70\x76\x0c\x0d\x6e\xa0\xd2\x04\xed\x75\x7a\x23\xd1\xff\xf3\xb3\xf6\x02\x43\x9f\xc2\x27\x5c\x4f\x7a\x0c\xe2\xc7\x3b\x2e\x2e\x10\xd5\x88\x3f\x44\xf1\x63\x8f\xf3\x74\xdc\xba\xa8\x92\x2a\x18\xe8\x12\x0c\x00\x10\x75\x4b\xc7\x5e\xbd\x73\xe3\xdc\xe1\x5f\x92\xc6\x59\xbe\xdb\x4b\xc2\x41\xcf\x58\x82\x23\x72\xc8\x1c\x22\x0c\x74\x4b\x97\x1e\x00\xc1\x21\x72\x06\x8b\x3d\x81\x02\x71\x56\x34\x30\x8a\xa0\x67\xad\xa2\xe9\x59\xab\x18\x7b\xd6\xc2\x3d\x10\xe7\x44\x7f\x5a\x6c\x13\xd0\x45\x44\xc6\x8f\x77\xfb\xca\xa5\x0d\x1b\x07\xf1\xd4\x8c\x8c\x62\xe4\x3d\xeb\xd5\xc4\x48\x41\x07\x5a\x45\xc3\x81\x56\x51\x3b\xd0\x8a\xd4\xed\x2d\xce\x4c\x0e\xb3\x9a\x46\x02\x3a\xc7\x9a\x26\xdf\x8b\x53\xc3\x59\x16\xfb\x52\x18\xc8\x6f\xa8\x1c\x96\x61\x00\xa6\x91\xf8\xe5\xa2\x2f\x18\x40\xbe\x21\xee\x17\xe8\x77\x2a\x45\x04\x3a\x65\xee\xdd\x1e\xcf\xbe\xdb\xfb\x7d\xf8\xec\xc5\xf0\xc9\x28\x84\xd7\x05\x60\x15\x83\x2e\x16\x11\x51\x29\x67\xac\x47\xe4\xf9\x95\x65\x4f\x85\x96\x37\xda\x19\x8f\x87\x6d\x7f\x32\x8e\xb0\x8c\x82\x55\x78\x9c\xf3\x1d\xfa\xe7\x1b\x34\xfd\x2c\x04\xfd\x6e\x7f\xf8\x06\x4e\x68\x7c\xdb\xc5\x17\x79\x86\x1f\xce\xd1\x94\xc0\x7d\x85\xc6\xb0\x7f\xf7\x66\x31\x79\xdc\xcf\x48\x9c\x6d\x66\x24\x3e\x66\x25\xce\xb6\xb2\x72\x1a\x89\xfd\x81\x17\xb4\xc7\x8f\x6f\x80\x80\x78\x85\x09\x67\xfc\x0e\xaf\xf4\x7d\xdd\xf8\x2e\x8f\xce\xc0\x7e\xc3\xde\x66\xd4\xf0\x42\xf1\x3e\xc3\x03\x54\x6f\xf0\xa0\xf2\xa5\x06\x99\xf1\x01\x87\x99\x91\x8c\x03\xcd\x48\x7e\xcc\x4e\xc6\xc1\x66\xe5\x4e\x24\xeb\x01\x75\xa5\x9f\x6a\xc4\x5d\x95\x65\xdd\xc8\xa2\x4a\x11\xc5\xfb\x46\x7b\x9e\xbf\x22\x02\xb8\xa7\x4b\xe8\xcf\x33\x27\xcb\x08\xde\x17\xe2\xb6\xa8\xbc\x04\x03\xda\xb3\x1f\x97\x67\x45\x46\xa9\xf2\x18\x0c\x59\xe7\xf6\x93\xfb\x73\x6e\x97\xf1\x4f\x05\x08\xb4\x1a\xfc\xab\xe2\xcb\x39\xfe\xb9\x80\xb7\x4b\xf8\x77\xe7\xe1\xdb\x31\xfd\x3d\x44\xe1\xc3\x25\xfc\x51\x3c\xa1\xbd\x96\xe7\x4c\xec\xeb\x07\xb3\xcd\x08\xef\x22\x78\x70\xbf\x42\x2f\x0c\x92\x50\x44\xad\x00\xf4\xcf\xa3\xde\xbb\xfc\xde\xe3\x9f\x89\x4a\x56\x2a\xa3\xc8\x3a\x1f\xc1\xce\xaf\xf2\xf3\x70\xc4\x12\xa4\xe9\xda\x5a\x95\x87\x04\xdd\xa2\x2f\xe3\x91\x47\x58\xf4\x9c\x5f\x27\xf2\x7a\xe1\xd6\x81\x00\x3e\xb7\xa7\x76\x55\x61\xd5\x4b\x37\x92\x93\x35\x72\x2f\x4b\xe5\xfa\xc5\x8d\xf3\x04\x7f\xac\x63\xac\x29\x81\x52\x23\x03\xbd\x90\x2f\x74\x6c\x10\xb2\xf9\x88\x58\x2f\x4b\x35\xc0\xab\x15\x44\xab\xca\x55\xe1\xb1\x64\x81\xe9\x31\x8e\xc3\x23\xab\x78\xa8\x16\x06\xe9\x89\x43\x35\xf5\xe7\xea\xf9\xb2\x85\xde\x62\x0f\x95\x0b\xe8\xaa\x38\x5a\x3d\x14\xd5\x1f\xee\xa4\x1b\x51\x37\xdd\xa8\x38\x32\xf0\x0f\xdc\xf5\x08\xff\xe0\xaf\xc6\x3f\x23\xc8\x82\xf8\x07\x66\x92\xf1\x8f\x72\x69\x0e\x98\xe7\xd8\x33\x5c\x3a\x26\x31\xcd\xce\x9e\xc6\x34\xf0\x38\xb7\xdb\xe5\x05\x8e\x1e\x9a\x0e\x47\xa8\x11\xf8\x53\xdd\xbf\x80\x3c\x89\xea\xfe\xcd\xf3\xf3\x14\xa3\x28\x95\x72\x4a\x42\x6d\xbf\x12\xbd\x26\xfb\xa0\x65\x70\x06\x0d\xf9\x15\x2a\x90\xc0\x7c\xc0\x3a\x00\x62\x15\x25\x23\x11\x19\x42\x82\x77\x03\xc4\x02\x8c\x8c\x7d\xce\xa1\xc5\x00\xc6\x99\x7a\x4d\x5f\xe6\x08\x7f\x45\x02\xc8\x58\x37\x0a\xab\xab\x5a\x52\x15\xc5\xb7\xf2\xdc\x2a\xdc\x16\x6c\x4f\x57\x83\x74\x3a\x57\x53\x25\x37\x65\x00\xda\xc5\xaa\x59\x09\x2a\x1a\xbc\x7e\xb2\x9e\xa8\x8e\x90\x63\x64\x3d\xa1\x42\x7c\xa0\xeb\x08\x74\x1d\xf8\x01\x79\x5b\x1b\x45\xdc\x3e\xc2\x6e\x7a\xc4\x8b\x50\xb9\xfc\x92\xf8\x5e\x91\x17\x41\x62\xd7\x5e\xed\xa5\xae\x1c\x7a\xd3\x86\xa9\x4d\xfb\x3d\x99\x33\x5c\xd8\xde\x23\x95\x93\xa2\xca\xcc\xd9\xc9\x0a\xec\xda\x9e\xfb\x13\xd1\xa7\xb2\x92\x29\x7a\xf7\xb9\x6e\xdc\x4f\xa4\x3e\x27\xd6\xcf\x89\x3b\x01\xca\x46\x43\x2f\xc6\xad\xf1\x73\x13\xa4\x10\x03\xfe\x09\xf9\xc7\x2b\x5c\x3f\xe0\x13\x12\x8c\xbd\xb5\xb5\x09\x4e\x10\xd2\xf3\xf0\xdc\x13\xb7\xc5\x72\x75\x9b\xc0\xc4\x74\x0b\x6d\x23\x36\x3e\x83\x52\x03\x25\xc8\xed\x32\xaa\x7b\x12\x63\xa9\xa7\xef\xf4\xaf\xbb\x34\x97\x4f\x59\x73\x29\x08\x87\x14\x15\x92\x15\xa2\xba\x5d\x68\xf6\x1d\xe3\xe1\xf0\xe0\x35\x82\x0c\x65\xaa\xbb\xe8\x03\x46\x4f\x6b\x28\xd3\x1a\xa7\x5e\x1e\x29\x47\xc1\x47\x66\x5e\x95\x7a\x75\xa4\xa7\x20\xe4\x80\xf5\x14\x3d\x82\xa7\x20\x40\xed\x65\x26\x39\x34\x1b\xc7\x6e\xb7\x52\xbd\x45\xe7\x5e\x34\xfc\x2e\x0f\xdf\x12\x00\x2a\xff\x4b\x00\x2a\x2b\x00\x02\x8a\xfe\x65\x00\xaa\xa8\x9c\x95\x93\x5f\x00\xd0\xae\xca\xb9\x7b\x92\xba\x42\xa6\x73\xee\xa9\x9c\x70\x5d\x78\x25\xb0\xd6\x43\x58\x1b\xb8\x6c\x4b\x35\xdb\x02\x88\x23\x83\xaa\xc7\x2d\xa7\x4b\x30\xd7\x8b\x87\x86\xc2\x94\x29\x54\xe8\x4e\xcd\x75\x43\xf7\xc4\x7e\x6e\x8a\x90\x15\xf2\x4f\xc0\x3f\x5d\xfe\xa1\x79\x9f\xb2\x6f\xb9\xc1\xda\xda\x54\xe6\x1d\x1e\x07\x42\xbf\x29\x25\x2b\x98\xd1\xde\x6f\x40\xde\x20\x86\xbc\x1e\x2d\x42\x05\x17\xa1\x79\x68\x97\xcb\x2f\xb1\x79\xd0\xb5\x86\x5f\xf8\x3c\x88\xd1\x07\xaa\x64\x36\x5c\x26\xf7\xd1\xce\xe4\x63\x33\xb6\x35\x81\x0b\x1d\xda\x42\x00\xba\x1b\xd5\xa3\x08\x6f\x22\x7f\xe1\x4d\x64\xb7\x2f\x8a\x12\x13\xc0\xe0\xa8\x64\x3c\x8a\x90\xae\xcd\x4f\xea\x68\x2b\x81\xbf\x5b\x37\x70\x19\x84\xdf\xed\x1b\x38\xa2\xe1\xf7\xdd\x0d\x9c\xd2\x1e\x32\x5b\xe1\xe5\xcf\x1b\x62\xb8\xc2\x99\xad\x52\xde\x4b\xca\xc4\x5d\x59\x81\xd7\x0f\x28\xec\x98\xe6\x59\xaa\x54\xd3\xa2\x28\xeb\xed\x08\x6a\x7f\xca\xb3\x78\xc9\x4c\x2f\x43\xed\x93\x52\x6d\xbd\xe2\x54\xd6\x6b\xc5\x0d\xe4\xe9\xe7\x2a\x22\x27\x83\x31\xec\xe6\x47\xc8\xe4\x2c\xe7\xfd\xae\x87\xac\x4e\x8c\xa0\xf0\xaa\x62\x09\xe3\x73\x42\x0f\x53\xfc\xf3\xc4\xfa\xc9\x23\x6d\x26\x14\x2a\x17\x0f\x4a\xc4\xd6\x7f\x6f\x9e\x2f\xda\xab\xe6\x00\xcf\x97\x18\x1a\x30\x34\x12\x24\xb0\xbb\xe7\xa6\x1d\x90\xef\x09\x1f\x41\x60\x60\x87\x86\x13\xb3\x01\x90\x25\x70\xd2\x04\xbc\x8d\x76\x71\x05\x0f\xe0\xe8\x5f\x5c\xc2\x97\x30\x08\x06\x3a\xeb\xbf\xcf\xf1\x8e\xc4\x4d\xed\xa7\x36\xb5\xa9\xff\x94\xd8\xd4\x9e\x3a\x1e\x7d\x84\xac\x08\xde\xbc\x78\x53\xf7\x48\x7b\x34\x1b\x93\x1d\x99\xc7\xa3\x56\x9a\x41\xef\x1c\xb9\xcf\x7b\x44\xc3\x04\xfc\xf6\x85\xdf\x42\x7e\x3b\xdf\x93\x7b\x29\xbd\x5d\xf0\xdb\x80\xdf\x8e\xf9\x6d\xc4\x6f\x27\xfc\x36\xe1\xb7\x53\x7a\x2b\xb2\xff\x8f\x5c\x95\xdf\xd4\x90\xe0\xea\xf2\xfc\x8c\x38\x14\xe6\x1b\xc8\x88\xe7\x67\x38\x0b\x3c\x38\x38\x8c\x85\x4a\xee\x7f\xea\xe1\x2b\xec\x94\x6f\x74\x51\xd0\xa5\x74\x51\x78\x20\xba\x8b\x7e\xa2\x8b\x7e\xa2\x8b\x7e\xdc\x45\x00\x5b\x3f\xee\x22\x4a\xe7\x14\xab\xb6\x2c\xd5\x37\x51\x64\xaa\x50\x3b\xec\x00\x85\xcf\x91\x88\xfd\xe8\x3e\x95\x00\x82\xf3\x4f\x48\xcd\x7e\x74\xcb\xa5\x9a\x53\xcb\x97\xa1\x16\x96\x5e\x3d\x61\x2d\xfc\x58\x66\x3b\x87\x7c\xf7\xd3\x93\x85\x23\xab\xba\x4f\x7f\xe0\x2b\x4a\xc7\x83\xb7\x55\x74\xff\x00\x7f\xbb\x6e\x17\xfe\xf6\xdc\xde\xdb\x6a\x71\x90\x9f\x7c\x7a\x82\x5d\x41\x39\xe1\xc5\xb2\x07\x6f\xdd\xaa\x3d\xc2\x3f\x13\xfc\x33\x85\x3f\x80\xbb\xf2\xa3\x4f\x65\xca\x56\xfe\x23\x07\x2f\x50\x21\x7e\x0c\xf1\x8f\x2e\x00\x08\x2a\x3f\x8d\xb3\xc1\x0b\x5c\xfb\xf1\x63\x2f\x55\x9b\x50\x5b\xa4\x39\x9f\xf3\x99\x3b\x6d\x91\xc9\x20\x0c\x72\xbd\x6b\xd7\x2c\x8a\x96\x2a\x2f\xf9\x1e\x71\x93\xb6\x3e\xa0\xab\x3b\x20\xc4\x48\x08\x94\xa3\xe9\xc8\x97\xd7\xa7\x71\xde\x09\x27\xd8\x13\xa0\x90\x37\xec\xbf\x13\x99\x07\xf8\x4d\x65\xa5\x97\xf5\x91\xcd\x32\x65\x94\x1d\x13\x85\x27\x79\xe1\x63\xa8\x72\x06\xf8\x42\xbb\x01\x33\x61\x17\x20\x1f\x9b\xf3\xc8\x76\xd8\xc3\xcd\x59\x81\xcd\x99\xb5\x41\xf1\x7c\xcb\xdc\xa2\x21\x7b\x37\x64\x14\x41\xfc\xd6\xda\x1e\xf2\xc9\xe8\xf1\x6c\x0f\x31\x5e\xa8\x40\x64\xca\x8f\x08\x22\x4f\xfc\x88\x20\x52\xe6\x47\x04\x91\x27\x84\x8a\x49\xe9\xc9\x79\xca\x4f\x20\x1d\x5e\xa6\xa5\xb2\x53\xce\xc3\x4c\x08\x5c\x4c\xb0\x16\x25\xeb\x54\xac\xc6\x01\x60\xec\xaf\x9a\xd3\x38\x72\x89\xd3\xb8\xe2\x15\x60\x13\x03\x5e\x2a\xe5\x00\x40\x4c\xdc\x85\x7e\xea\x7b\x42\xfa\x3f\xc9\x23\x10\xfe\x65\x79\xbc\x24\xb1\x67\x4f\xc8\xfe\xa9\xf2\x3c\x3e\xd0\x0d\x48\x73\x3d\xa1\x44\xb4\x6f\xf2\x51\xb2\x0b\x92\x03\xa8\x12\x04\x32\x44\x8d\x3d\x22\x30\x2c\x27\x87\x36\x3f\xbd\xf7\xe8\x2b\x1c\xb6\x21\xa2\xb6\x2e\x51\x5a\x70\x96\x62\x21\xc6\x6d\xf0\x48\x1e\x0a\x7a\x86\x9f\xc9\x04\x6e\xd3\xd2\x01\x0a\xc6\x81\xf8\x6d\x60\xbf\x92\x8a\xc4\xf2\xaa\x2b\x66\x57\xb5\x3d\x36\xbb\x3a\x93\xdf\xcf\xf2\xfb\x45\x7e\xcf\xe5\xf7\x42\x7e\x8f\xe5\xf7\x44\x7e\x4f\xe5\xb7\xba\xe7\x0c\xe2\x50\x94\x2e\x86\xa2\x2c\x19\x83\xa1\x18\x22\x34\xe7\xb6\x3a\x18\xe0\x58\x70\xd0\xaf\x5f\x6d\xaf\x34\x90\xf9\x52\x40\xc2\x1f\xce\xf6\x90\x40\xe0\x79\x52\x30\x93\x70\xdf\xd9\x3d\xe6\xb6\x3b\xf2\x1b\x3e\x79\xfc\x10\xa8\x87\x3b\xf9\xd2\x50\x09\x91\x7a\xe8\xc1\x97\x02\xdc\x82\xe9\x50\xea\xa9\x6a\x95\x99\x33\xdb\x4e\x88\xa1\xc4\xeb\x01\x46\xca\x1d\x8e\x1f\x5f\x03\x19\x31\x8c\x82\x31\x5a\x52\x74\xf3\xff\xf3\x06\x2d\x28\x64\x87\x1c\x31\x15\x68\xef\xdd\xbd\xa8\x09\x9c\xa0\x04\xc7\x13\xbc\xf2\xd2\xe3\x43\xfc\x58\xdd\xb7\x0c\x9f\x5c\xc4\x27\x6f\xcc\xd8\x99\xdf\xcb\xe4\xe2\x64\xa2\x19\x94\xb5\x64\x1d\xaf\xbe\xb2\x4e\xcd\xb7\x85\x9a\xf7\xbd\xc5\x9a\x17\xc9\xcb\x69\x5c\xf3\x0c\x59\x80\x2f\xb2\xf1\x47\xd2\xd9\x0c\x3a\x74\x65\x83\x4c\xb9\x70\x73\x1f\x58\xe4\x58\x95\x72\xc2\xcb\x82\x31\x4d\x9c\xb5\x71\x42\x57\x43\x72\x53\x18\xcd\xc6\x95\x28\xe8\x0f\xc9\x66\xc2\x85\x2f\xa6\xc0\x41\xd4\x7c\xd8\x5e\x74\x40\xb3\xfa\x80\xfd\xa6\xc7\xd1\x03\xb3\x17\x6a\xfc\x05\x63\xec\x49\xb7\x6b\x32\x15\xb9\x9a\x5b\x23\x7a\x6e\xa8\xa2\x2b\x57\x39\x2f\x62\x9f\x73\x77\x65\xa3\x88\x86\x68\x35\xd2\x1a\xa7\xbc\x1b\x37\x98\x2c\x1e\xd6\x2e\xdc\xf3\xd2\x99\x53\xb3\x2f\xb9\x0c\x5e\x5d\xe0\x62\x86\xd7\x2c\xd8\x13\x68\x71\x36\x2a\x4d\x9c\x18\xcf\x60\xfb\x13\x1a\x0f\x19\x00\xf4\xc6\xee\x05\x33\x53\x3d\x80\x23\x74\x80\x3b\x11\x24\xc4\x02\xc6\xcb\x92\xaa\xd5\xb9\x94\x6f\x80\x95\xf8\x5b\xb5\xa4\x7a\xe9\x54\xe3\x60\x34\xd7\xc8\xfd\x78\x35\xc1\x59\x7b\x88\xfc\x4e\x7b\xbc\x8f\x71\x77\xef\xfa\xfd\x71\xab\xdd\x6b\xba\xed\xa1\xa7\x2e\x84\x03\x66\xea\x4c\x90\x38\xef\xf1\x8f\xcf\x3f\x01\xff\x84\xfc\x53\x75\x27\x45\x40\x63\x55\xc1\x41\xf0\x48\x5c\xd9\x2a\x12\x99\xac\x15\x7e\x4e\xb6\x26\xc8\x7e\x9a\xd0\x3c\x15\x2f\x3e\x4e\x8a\x28\xcc\xf8\x79\x69\xf2\xad\xd1\x35\xed\x65\x62\xec\xb5\xfa\xc5\x4d\xf1\x52\x46\xac\x46\x6a\x71\x0a\x8c\x53\x8d\x8f\x67\xfa\xce\x73\xab\x71\x6c\xdb\xfa\xce\x4d\x71\xe3\xe3\x05\x2c\xc9\x9d\x97\x77\x2b\x52\xe8\x6e\xdf\x86\x57\x00\xf7\x2a\x76\x11\xa6\x6c\x84\x94\xed\xa5\x35\xaf\xc0\x32\x8d\x9c\x7a\xf5\xa6\x58\x13\x8f\xed\x1b\x36\x2b\x4c\x6d\x72\x33\xc1\x81\xc5\x5e\x26\x51\x72\xe4\xe5\x6a\xe8\x58\xb4\x87\xbf\x16\x90\x25\x30\x52\xca\x74\x7f\xc2\x86\x30\x06\x46\x27\x54\x3b\x5a\xa8\x73\x64\x59\x36\x54\x33\x92\x6a\xe0\x75\xe4\x6e\x30\x2f\x67\xe4\xee\x56\x8a\x17\xe6\x58\x00\x62\xd4\x50\xd7\x2f\x0a\x8f\xc5\x4b\xb7\x52\xaf\x88\xd1\xba\x89\x59\x61\x06\x4b\xf1\x97\xa1\x8f\x5e\xad\xc7\xfd\xc1\x7a\x35\x7e\x76\x5e\xe9\x0c\x71\xfd\x85\x47\xaa\xf6\x5c\xb7\xb2\x30\x88\x73\xf7\x3c\x3f\x59\xbf\x80\x49\x7d\x3b\xd2\x6e\x0a\xf0\xd3\x6e\x45\xbe\x5d\x2a\x57\xf1\xa8\x65\xff\xad\x07\xd8\xb0\xdf\xec\xb5\x9f\xa2\xf0\x35\x86\xec\x6e\xf6\xf0\x67\x12\x39\xaf\xdf\xe4\x47\x30\xf9\x9a\x6d\x36\x42\xfb\x73\x02\x0e\xec\x55\x71\xf4\xf1\xa2\x38\x02\xc0\x98\xc0\xeb\xe8\x86\xe3\x70\x74\xf7\xed\xf5\x09\x9b\xc4\xdc\x0d\x26\xe3\x28\x44\x71\xf5\x69\xd4\x6b\x8e\x5b\x39\xeb\x6d\x0d\x56\xd3\x9e\xc4\x15\xca\x0e\xff\x72\xa4\xc4\x04\x70\xeb\xd9\xa0\xbf\xd4\x2a\xc7\x77\xac\xe0\xb5\x46\xc1\x93\x7e\x86\x81\x9b\xf1\x01\xab\xda\x08\x0e\xc0\xf6\xe7\x1b\x8c\x4f\x5d\x68\x78\x77\xed\xee\x23\xf1\xe9\xe1\x75\x9f\xde\xe4\xa5\xe6\xdd\x45\xc4\x2c\xc7\x7c\x23\x18\x39\x72\xc2\x75\x50\xeb\x40\x3e\x3c\x90\xfa\x03\xb2\x99\xf1\xf5\x8a\x95\x21\x42\xbb\x3d\x86\x49\x0a\x9c\xae\x3d\xe9\x85\xd1\x90\x42\xab\xf7\xe8\x8a\x3d\xc2\x1d\x36\xca\xbe\xf9\xe2\x19\x9e\xb8\xfd\x4e\xc8\xb1\x4e\x40\x58\x05\x0e\x0d\xf8\x0d\x0e\xf8\xf7\x15\x40\x26\xf1\xeb\x8a\x0d\x38\x35\x90\x95\x58\xb4\x1a\xc4\x05\xa3\x17\x94\x65\x0c\x94\x93\x75\x04\x70\x94\x67\x88\xc5\x44\x34\x1c\xf6\x87\xaf\xd9\xa0\x04\x8d\x39\x70\x7f\xbe\x29\xce\xe3\xd5\xfe\x9f\xac\x1c\xaf\x23\x36\xf2\x78\x0d\x44\x45\xeb\x75\xd0\xf2\x7a\x4d\x00\x05\x7d\x5e\xc2\x39\x19\xc8\x39\x99\xb4\xce\xdb\xc1\xe3\x72\x41\xcb\x21\x83\xb4\x8c\x15\x1d\xd2\x32\x61\xd4\x20\x0d\x4c\xda\x8d\x22\x34\x21\x4e\x0b\x38\x48\x88\x8f\x37\x40\x46\x56\x3e\xde\x0b\x39\x4e\x87\xd6\xb7\x20\x66\x24\x4c\xbd\x87\xf8\xcf\x4b\x4c\xbd\xd4\xef\xbb\xaa\xa9\x58\xf2\x43\x46\x26\x86\x81\x86\xcf\x26\x1a\xe8\xc2\xe3\xae\x59\xbf\x0d\xd1\x04\xde\xab\x87\xf7\x86\x29\xbc\xd6\x00\x7f\xed\xd1\xd8\xf7\x71\xec\x83\x63\xfb\x5f\x29\x7a\x20\x6b\x9e\x99\x0e\xd0\xeb\x49\xdd\x2b\x04\x97\x85\xbb\x16\x0a\x5f\xe1\xa5\xde\xdf\xb9\xa1\xb7\x57\x01\x7d\xab\x1c\xd0\x5b\x48\x2f\xdd\x09\xbd\x74\xe9\xe5\xe1\x8a\x5e\x7a\x54\xea\xe0\x89\x4b\x0d\xe8\xed\x41\xde\x46\x26\x1b\xd0\xcf\x1d\x60\x6f\x8f\x8f\x50\x1d\x0f\xfa\x7c\x98\x49\xff\x33\x73\x2c\xa9\x5a\x90\xb4\x20\x92\x20\x18\x46\x0c\x8e\xd1\xd4\x94\x0d\x9e\x1c\x2f\x8b\x42\x7d\x81\x75\xfc\x84\xdc\xe8\x8a\x88\xe5\x7d\x86\x88\x12\xf5\x37\x94\x64\x5a\x99\x0e\x55\xd2\xa6\x43\x67\x57\x70\xc2\xa4\xd2\xfa\x65\xb7\x9c\x61\x62\x34\x4d\xa7\xdd\xbf\x37\xcd\x8e\xb4\xc9\xd2\x53\x3a\x6d\xf8\xde\xad\x1a\x69\xb0\xdd\x50\x40\x69\x98\xc4\x70\x8a\x69\x2a\xc4\x29\x47\x0b\x79\x0e\x8d\x14\xb6\x1a\x1b\x68\x3b\x4f\xd9\x6e\x78\xe2\x26\x75\x2d\x5e\x19\x62\x70\x29\x64\xda\xef\x7c\x74\xc3\x94\xc3\xe2\x7a\xff\x11\x4d\x6f\xe9\x32\x74\x3c\x14\x24\x70\x41\x96\x52\xd1\xac\x3d\x1a\x8f\x5e\x7b\xbd\x50\x79\xc8\xf4\x5e\x8f\xc6\x1e\xee\x6c\x32\xa5\x2a\xbc\x29\x62\x19\xe5\x80\x52\x6a\x72\x7d\xc3\x19\xd7\x97\x01\xdb\x4f\xd9\x3a\x03\x9b\x70\x7b\xf5\x49\x80\x60\x86\xb8\x6b\x17\xdd\xbf\xdd\xa1\xdd\xa1\xac\x52\xb6\xb5\xd5\xad\x7c\xbf\x7f\xcf\xef\xfb\x33\x71\x25\x36\x7c\xbf\x68\x3e\x15\x48\x9d\x86\x19\x91\xde\x7b\x49\x04\xa2\x09\xdc\x92\x02\x47\xe7\x3c\x36\xeb\x14\x63\x32\x3b\x40\xab\x5a\xe9\xf3\x4d\xdd\x1f\xde\xb0\x55\xfc\xc0\x30\x00\x0d\xec\x95\x15\x1f\x09\x2f\x23\x29\xab\xd5\x89\xf6\x68\xe0\x15\x4e\xaf\xac\x58\xc1\x0a\x31\x47\x96\x5d\xb8\x38\xbc\x41\xcb\x70\x74\x62\x50\x6f\x26\xfa\x81\xe2\xe7\xe2\xab\xb8\x23\x4d\x09\x3c\x30\x31\x53\x2c\xc3\xc0\x7e\x9a\x32\xf0\x4a\x02\xc8\x27\xc3\x90\x57\x75\xd1\xb0\xf5\xa6\x3e\xb2\x2e\x98\x6f\xc6\x91\x89\x4d\xa8\xfc\x7a\x70\x73\xa3\x63\x3a\xe8\xca\xe7\x08\x29\x62\x65\x8a\x60\xe0\xdf\x68\xc1\x8c\x91\xa6\x01\x3d\xb6\xe8\xd2\x5f\x75\x0a\x1b\x88\x25\xa0\x25\xcb\x0e\x2d\x69\x31\x96\x65\x53\x96\x84\x28\x48\x48\x81\x94\xb2\x32\x5b\x34\x2a\x7b\x4a\x5a\xc0\x7b\x75\x6f\x78\xa3\xe2\xaa\x91\x24\xd2\x43\x9f\x95\x16\xda\x4b\xa3\x8c\x2f\x76\x01\x40\x23\xa1\x19\xc1\x22\x6a\x4f\x06\x31\xf3\xf0\xf8\xfe\x86\x18\x85\x27\xf7\x37\xc4\xea\x3b\xc4\x1f\xd7\x3d\x1a\x95\x3c\xb7\x76\xe8\xe0\xf3\xe1\x88\x44\x64\x67\x87\xb0\xee\x81\x9e\xe6\x00\x43\x28\x90\xd1\x9f\x5d\xff\x49\xee\x31\x95\x5b\xb5\x70\x6e\x93\x4f\x33\x18\x9b\x37\x04\xba\xca\x09\xe6\x37\x26\x40\x94\x13\xfe\x46\x18\xe2\x79\xa5\x00\x1a\x8d\xbd\x80\xbb\x20\x7e\xa5\x80\xdd\x7a\x4b\xc0\xb1\x19\x7b\xb6\xd3\x35\x57\x12\xc6\x86\x71\x7a\x4d\xdb\x6a\x72\x71\x38\x54\xc3\x81\x24\x21\x12\xe2\xd9\x88\xfd\x20\x0e\xde\x6b\x67\xd8\x83\xf7\x78\x5a\x88\x13\xc4\x32\x33\xd4\xc8\x8d\xa3\x5f\x17\xff\xf5\x8d\x3b\x0f\xbd\x63\xd2\x87\x06\x8a\x6d\x0f\x1e\xf8\x05\xbd\x63\xf2\x20\x93\xe7\x8d\xa2\x08\xe2\xc0\xb1\xbe\x35\xd7\xcd\xa1\x2b\x4e\x2a\x8e\x2e\xd9\xb3\xd0\x80\xcf\x92\x5a\xf6\x06\x9e\x98\x2f\xe5\x77\xde\xa0\xec\x3d\xd2\xa1\x65\x35\xd9\x08\xa3\x70\x88\x7e\x6c\x04\xa4\xb6\x3d\x73\x30\xec\xca\x23\xfc\x7d\x9c\x13\x66\x85\x75\x56\xad\x7f\xb1\x12\xa2\x4c\xcb\xf4\x18\x53\x4d\xf1\x17\x3a\x40\x12\x91\x63\x98\x0e\x36\xb8\x7f\x50\xbf\x84\xe9\x32\xe8\xc9\x2e\xd3\x92\x0d\xf4\x17\x82\xc2\x74\xf8\x45\xcf\x31\xf0\x83\x6a\x4b\x68\x2b\x5c\x68\xd7\x6c\xbf\x70\x8b\x7f\x2a\x1d\xb4\x1e\x0a\xf1\x63\x90\xc7\x57\xcb\xee\x7c\x72\xf1\xdd\x22\x46\xb4\x5f\x18\xbd\xa7\xbc\x96\xdd\x5c\x5f\xb7\xb1\x52\xb8\x23\xc3\xac\x20\x2c\x1e\xee\x13\x6d\xa4\x02\x4b\xc5\x05\xb0\x31\xe8\x27\xaa\xe9\x36\x19\xf1\x5e\x5c\xb9\xbd\xc2\xf8\x3d\x4e\xdf\x25\x80\xa3\x93\x53\xa9\x6c\x70\x8f\xfe\xe7\xae\xe0\xa4\xb1\xbd\xb8\xe2\x1b\x2b\xf6\x6c\x42\x2e\x35\x48\x88\x03\x47\x24\xe7\xdd\x10\x37\x34\x1e\xdb\x78\x17\xb3\x9a\x89\x61\xf2\x5c\xc1\xa4\x18\x86\x27\xbc\xf8\xc3\xa9\xa0\x5c\x70\xc6\xe8\x52\x5b\x37\x79\xe4\x58\xd9\xd1\xfb\xdb\x33\xce\xe4\x8b\xc5\x40\x6d\x50\x99\xed\x17\x3d\xa6\xca\x39\xf8\x1d\xf3\x06\x82\x7d\xf2\xb1\x80\x3e\xe4\xd9\x37\xbe\x27\xc4\x3a\x12\x9c\x09\x7a\xe7\x15\x11\x3c\x2f\x10\x05\xc5\x6e\xe1\xa0\x85\xae\xe2\x7a\x85\xfd\x96\xc7\xa3\x95\xf1\xf3\x9c\x5d\x2e\x31\xe0\x9c\x53\x99\xf1\x7b\xf7\xb2\x30\x8c\xee\x27\xd1\x68\xac\x7d\x53\xec\x0f\xe1\xca\xf3\xfc\x0c\xf4\x66\xff\xe9\x7c\xd9\x37\x66\x32\x2c\xfd\x7c\x37\x5a\xf2\xc9\x64\x95\x5d\x92\xe3\xcc\x0c\x37\xa4\x31\x1d\x59\xf1\xc6\x51\xa1\x87\x11\x2b\xad\xb9\xbd\xb9\xb7\xfd\x07\x46\xf9\x98\xf3\x68\xa1\xeb\x01\x7a\xad\xe8\x2e\xed\x05\x7f\xce\x1c\xd8\xee\xcb\x25\x75\x8e\x65\x23\xff\x45\x79\x33\x53\xd6\xec\xbc\x58\xfc\x55\x9c\x63\xa1\x6c\x3d\x80\x03\xa3\xeb\xe7\x7a\x69\x3d\xf3\x1e\xea\x99\xa3\xa8\x5f\xac\x94\x33\x6c\x7f\x4d\x9c\x85\xea\xb7\x74\x02\xa0\x6f\x6c\x65\x4c\x8c\x5e\x2c\x3c\xcb\x19\x19\xa4\x0d\x00\xe9\x9c\xeb\xec\x47\x0b\x86\x26\xe8\xa5\x9e\x14\xf8\xf1\x42\xa2\x13\x13\x3e\x2b\x5a\x13\x0a\x2e\x41\x35\x0c\x3a\x19\xa6\x2a\xba\x0e\xb8\xc5\x18\xa9\x4b\x2b\x69\xf9\x2f\x55\x82\x77\x9c\xdf\xa9\xe5\xf8\xf4\xc5\xae\x74\x27\xbf\x53\xc9\x45\x98\x31\x23\xa1\x74\xe4\xe1\x69\xf9\x8c\x84\x7a\x4e\x6b\x69\x97\x17\xcc\xe3\x7b\x95\xf4\x6e\xb0\x33\x1e\x47\x77\x03\x74\xb3\x31\xee\xbf\x66\xcf\x0f\xca\xc9\x01\x7a\x36\x08\xfb\xd1\xa8\xf7\x3f\xe3\xd7\x2d\x0f\xd2\x4d\xd7\x06\x7a\x3b\x19\x76\xef\xd2\x72\x6d\xd1\xdb\x46\x7c\x2f\x40\xa7\xf9\xb0\x77\xa0\x4a\xba\x06\xc4\x2e\x15\xa0\xb5\xff\x19\x69\x4f\x0a\x7c\x47\x28\xbc\x21\xf2\x66\x7d\x73\xc5\x4d\x61\xce\x7f\x55\x19\x72\x19\x7a\x58\x17\x5f\x35\x36\x8a\x89\x7b\x45\xd1\xbc\x57\xb0\x9b\xc7\xac\xbb\x84\x41\xfa\xa1\xb7\x31\xde\x14\x17\x56\x52\x77\xe0\xc7\xec\x25\x53\x08\xbc\x56\xe1\xa9\xe9\x3f\x3f\xfb\x85\xd9\xe6\x27\x94\x63\xd0\xf3\x23\x3d\x9f\x2a\xfe\xc9\x1e\x71\x47\x60\xae\x47\xe3\xe1\x24\x20\x7f\x18\x5f\x26\x5e\xf8\x75\x18\x45\xce\xeb\x76\x0f\xb9\x63\x21\x7b\x4c\x19\xbd\x6e\xb6\xa7\x51\x4f\xb9\x9a\xe8\xd6\x90\x8d\x21\xe3\xe3\x0c\xca\x7f\x4e\xaf\x1f\x46\x23\xf7\x55\xd3\xcb\xbd\x53\x16\xff\x65\xbc\x75\xed\x3f\xf0\x76\xac\xdf\x24\x5c\x87\x79\xd2\x57\xc9\x99\xb8\x0e\x1e\x5f\xe5\x28\xa8\x86\xec\xe4\xfa\x35\xdd\xd9\xe8\xae\x32\x47\x47\xf2\x64\xaf\xc7\x54\x70\x7d\xfa\x68\x46\x07\x23\x4f\x60\x3f\xd9\xb1\x4b\x96\xdc\xbb\x30\xe9\xe6\x62\xbf\x40\xaa\xd9\x40\x37\xeb\x6b\xab\x65\x6c\x33\xb8\x21\xaf\xe7\xf7\x80\xb5\x78\x3a\x31\xfe\xfb\xda\x1a\x4e\xea\x47\x0a\x02\x8f\xcf\x8f\x94\xfe\x48\xe9\xa7\x94\x7e\xea\x97\x82\x02\xf7\x01\x9a\x76\x54\x37\x19\x18\x74\xf8\xf2\x64\xb2\xfd\xee\x93\x4c\xf0\xda\xda\xbb\x8f\xfa\xdb\xf1\x8d\x78\xca\x18\x92\x23\x4f\x4f\x38\x93\x62\x67\xcd\x39\x92\xae\x19\xa4\x5d\xfd\x1d\xbd\x45\xa8\x25\x30\x0a\x7d\xe2\xab\x24\xbd\xf1\xa5\xc5\xf8\xb8\x0e\xa4\x0d\x2e\xd7\xdc\x0e\xba\x91\x37\x34\xf5\xeb\x8c\xd5\x4c\x4c\x63\x4c\x3e\xbc\x52\x8e\x23\x68\x0a\x53\xdd\xa3\x34\xef\xa6\x7e\x8d\xbc\x5f\xa5\x75\xa7\x3e\x98\x70\x94\x06\x23\xe8\x0b\x1c\x37\xc3\x47\x27\xe3\x68\xd0\x80\x82\x3b\x03\x66\xd8\x3e\xbe\xca\x58\xfb\x15\xb4\xe5\xdd\xfc\xc4\x33\x03\x4b\x8a\x0e\x15\xf5\x33\xec\x8c\x3f\xb6\x2c\x72\x23\xeb\xe1\x4a\xc7\xb9\x66\x46\xae\x43\xcc\x55\xc2\x6b\xf8\xa6\xb3\xe5\xf8\x44\xbe\x6e\x1b\x5c\x3a\x7b\x34\xe8\xb6\xc7\x4e\xca\x44\xde\x77\x73\x46\x0d\xeb\x46\xcd\x50\x1b\x34\x99\x33\x7a\xb1\x6e\xf4\x0e\xbf\x8a\xd1\x3c\x67\xb7\x1b\xae\xf1\x59\x45\xc8\xec\xd6\xf2\xc2\xda\xc0\xb9\x45\x2f\xaf\x24\xc4\x47\x05\x29\xd2\x8d\x6a\x90\xb3\xe9\xbc\x8f\x06\xa5\x8d\x3c\x74\x52\x62\x66\x52\xf6\xcd\x44\xf6\xbc\x6f\x16\x58\x52\x64\x2b\xab\x48\xfe\x55\x90\x2e\x95\x2e\xb7\xbd\xd8\xb3\x7c\x90\xec\x9b\x51\x84\x56\x7d\x63\xae\x5c\x05\x2d\x2e\xa7\x06\xd7\x14\xa1\xfb\x11\x7d\x5e\xa5\x40\x5b\xdc\xe0\x49\xbd\xa5\x15\xdd\xa7\x66\x64\xde\x39\xb4\x59\xac\x5f\xff\xc2\x71\xa5\x48\xc5\x74\x6e\x25\x59\xa2\xc3\x05\x6b\xb4\x4c\x85\x02\x76\x4f\x56\xaf\x91\xa3\x51\x9f\xb4\x17\xc4\xef\x35\xfc\x8b\x26\xf6\x86\xbd\xc5\x66\xfb\x2b\x14\x09\x69\xca\xf9\xea\x6d\xdc\xe8\x73\xbb\x53\xce\x54\xb0\x16\x3f\x9e\x36\x3b\xed\x44\x27\xa2\x3a\x66\x16\x9a\x58\x07\x6f\x83\x7c\xf8\x36\xb4\x3e\xba\xd8\x84\x48\x7b\x47\xff\xaa\xbf\x57\x8f\xdc\x0f\xe9\x77\xfd\xeb\x13\x99\xc8\xaf\xa3\xb7\x6d\xec\xfc\x3a\xf9\xd8\x86\x0f\x77\xf4\x01\x12\x5f\x49\x0a\x0d\x91\xc3\x16\x26\xc6\x76\x04\x57\x5b\xbb\x57\xd6\x83\x83\xdf\xde\xd3\x4b\x83\xcc\x89\xa5\xbc\xf5\x07\xd5\x1f\xba\xda\x69\xe9\x1f\xd8\x94\x1a\x32\xe0\x5d\x19\xaf\x0c\x74\xfc\xbf\x1a\xe8\xe0\x91\x06\xba\x89\x83\xa4\x15\x79\xa2\x01\x1e\xfa\x90\x70\xea\xc7\x4b\xd4\x9e\xc1\x70\x2e\x67\x14\x03\x74\xd5\xff\xad\xf1\x60\x8d\xeb\x54\xcb\x1f\xd4\x04\xce\xa1\x56\xf5\x2a\xfc\xf9\x49\x7c\x5c\x90\x43\x00\xce\x4c\xee\x58\x37\xad\x75\xf2\xbd\xce\xa3\x9b\xbc\x68\x04\x49\x22\x06\x19\x4b\xac\x30\x88\xfa\x83\xc4\xad\xeb\xb1\x57\xd0\xe8\x63\x2f\xe6\xd6\xa1\x9a\x0b\xdc\xd5\x45\x2b\x50\x39\xb9\x1d\x60\x00\x6e\xd6\xb6\x38\x68\x38\x01\x4d\xcb\x00\xb5\x05\x07\xb0\xf3\x13\x0a\x0d\xfb\xf8\x19\x27\x89\x3e\xbf\x5a\xf8\x7e\xbb\xeb\x04\x05\x3f\x7a\x6a\x47\xc3\xdd\xc9\x70\x1a\x7d\xed\xc7\x15\xc1\x9f\x6d\xfc\xf3\x0e\xff\xfc\x89\x7f\xde\x27\x0b\xb7\x9a\x50\xf9\xd4\x70\xd2\xbb\x4c\xdb\xc1\x43\x51\x4e\xff\xee\x0e\x19\xc0\x6f\xfe\x27\x8f\x43\xd2\xca\x0e\xcb\x74\xf1\x70\xaa\x78\xf9\x79\xe6\x10\x44\x03\xfb\x7c\x07\x1d\x07\x31\x88\x06\x59\x4b\x6a\x70\xad\x85\xbd\x13\xee\x59\x44\xeb\x9e\x96\xb9\x2a\x43\x29\xb7\xd0\x1e\x7d\x46\x06\xd7\x51\xef\x33\x74\x51\x7b\x5e\x7f\x7e\x86\x2f\x0f\x9e\x7e\x97\xc5\x9d\xfe\xaf\x40\xb7\xb3\x73\x13\xe3\x16\x64\xd8\x78\x14\x33\x95\x36\xde\xc5\xce\xef\x6c\x3c\x75\x92\x16\x66\x9f\xa0\x22\x24\x65\x66\x1f\xd1\x49\x05\xd6\x46\x44\x0e\x24\x3f\xd2\xc3\x47\x74\x02\x81\xf5\x53\xcf\x5f\xf9\xb9\xd9\xbf\xe9\x7a\x01\x25\x8c\xae\xdf\xf3\x50\xfd\x9e\x36\xdc\x49\x64\xab\x70\x00\x2f\x60\x3d\x22\xdb\x8c\x4e\x06\xaa\x93\xf0\x90\x0f\x74\x27\x03\xd5\x49\x78\x80\x64\xe9\xa4\x9f\x7b\xc8\x94\xe0\x65\x8b\xaf\x74\xff\xc5\x40\xd9\x43\x03\x65\x1f\x0d\x94\x03\x34\x50\x0e\xd9\x40\xb9\xcb\x06\xca\x3d\xae\xff\x1e\xeb\x47\xd2\xdc\x94\x3d\xfd\x52\xf0\x84\x29\x18\xcb\x3b\x66\x57\x52\x42\x91\xcd\x3f\xe9\xb4\x82\xbb\xc7\xd4\x1b\x19\xe0\xc6\x76\x91\x97\x2d\x04\xb5\x8e\x08\x9e\x9a\xf2\xb8\xdf\xb2\x77\x91\x97\x18\x88\x19\x24\xd5\xf0\xe3\xc1\xed\x68\x18\xe5\x6b\xc9\x95\x71\x10\x6f\xe0\x41\xbc\xa1\xe3\x51\x34\x55\xc8\x47\x0f\x6e\x72\x75\xe4\xd6\x8a\x68\xc8\x90\x2b\x59\x06\x57\x6f\xa0\x5d\x93\x42\x01\xc3\x0b\x1d\xdc\x6d\x26\x46\x09\xd5\x70\x4c\x15\x67\x4b\x3a\xd4\xe1\xfe\x73\xe6\x30\x97\xf9\xd1\x21\x2e\xf3\xbc\x88\xb1\xb0\xd2\x9e\x6a\xa1\x3e\xa2\x09\x69\x20\x78\x2a\x3e\xe2\xcf\x23\x0e\x06\xdf\x4e\xf1\xe7\x11\x43\xe6\xba\xa8\xc9\x4a\xe2\x8a\xf0\x63\x14\x87\x72\x40\x11\x46\x78\x53\xec\xd6\x1b\xc8\x2d\xad\xef\x86\x37\x37\x85\x0e\x4a\xae\x7d\xb2\x54\xd9\x45\x41\x1d\xc5\x43\x20\x32\xdc\x77\xd7\x37\xd1\x70\x1a\xf0\x63\x31\x14\x3a\x3c\xe2\x40\xf5\xaa\x56\x91\x16\xe2\x54\x30\xfb\x3c\xbc\xb1\xec\xc6\x27\x0a\x0b\xe5\x36\x48\xd3\x36\xa4\xd8\xef\x78\xa5\x6d\x8e\x4c\xfe\xf6\x84\x5d\xc8\x4a\x3f\x44\xe2\x94\x33\x39\xb1\xb2\x9a\x85\xbb\xc8\x1b\x4d\x86\x11\x82\x1f\x6d\x1f\xcb\xe0\xd0\x6e\x6e\xd9\x30\x73\xc4\x9f\xf5\x70\xe8\x73\x62\xb6\x04\xc8\x6c\xf1\x7f\x8b\xd9\xd2\xad\xeb\x3e\x28\xd6\xb1\xb4\x6b\x69\xb7\x98\x86\x3c\x69\x19\x7b\x25\x50\xdc\x88\x50\x33\x57\x30\x2e\x2e\xbe\xa4\x6b\x5d\x5e\x69\x9a\xe3\x12\xc4\x3c\x9b\x50\xf1\x5b\x30\xad\xd8\x85\xb7\xdf\xaf\x36\xcd\x83\x31\xab\xd5\x1c\x18\xae\x17\x5f\x7f\xbf\xe2\x34\x5b\x26\xd1\x5f\x61\xca\x48\x7f\xbb\x93\xdf\xaf\x36\xc5\x66\x31\x84\x62\x1a\xce\x16\xa5\x62\xb2\x3f\x84\x8e\xd5\x5b\x3a\x96\x4f\x0d\xc4\x35\x2d\x23\x18\xdb\x78\xc6\x98\xd8\xc6\x45\xf3\x95\x2e\x6b\x5c\xe5\xcc\x5b\x33\x7e\xf2\x6e\x50\x98\xd9\xad\x07\x49\xe0\x09\xf4\xf8\xe6\x0b\x8e\xba\x98\x9d\x71\x57\x79\xd9\xef\xb1\x78\x84\x19\x09\x92\x19\xbd\x77\x3d\x1e\x4c\xbb\xa6\x7c\x92\xde\xd6\x5c\x89\xbe\x5d\x01\x80\xe1\xa7\xe3\x96\x87\x5e\x4a\x82\xd8\x6b\x69\x86\x0b\xe3\x94\x7a\x62\x6c\x22\xd0\x00\x82\x73\xdd\xb3\xfe\x00\x64\xec\x36\xde\xae\x47\x79\xaf\x98\x76\x1f\x6e\x78\x14\x7f\xeb\xe5\x9b\xb1\x1f\xd3\x84\xfb\xd2\x55\x64\xd6\xa0\x4e\x02\x9e\x0f\x70\x28\xdc\x55\x52\x67\x42\x48\xe1\xab\x63\xc5\xc3\x80\xec\xf4\x9f\xb8\x1b\x65\x0a\x24\x7d\x72\x5c\x2a\xbb\x1e\xa9\x98\x86\x18\x79\xbf\xec\xfa\xa8\x39\xb2\xef\x96\xe1\x6f\x23\x82\x59\x18\x14\x2e\xfe\x74\x7b\xa6\xf3\xf3\x72\xee\x09\x20\xad\x63\xa5\x5c\x6e\xa6\x07\xa1\xe9\x99\x48\xa0\x1f\xd9\x7e\xa8\xd2\xed\xa3\xb5\x0d\xfa\x90\x6d\xa1\xc3\x7e\x51\x84\x88\xf8\x10\xf6\x00\x20\x31\x51\xee\xee\x8d\xc2\x2c\x7e\xd4\xb7\x91\xc6\x7c\xce\x14\x66\x90\x19\x1e\x94\x2b\x5c\xca\xdb\x47\x77\x05\xc8\x39\x8a\xd6\xd6\x22\x22\x18\x46\x6b\x6b\x8d\xc2\x55\xe4\xa3\x5a\x60\x49\x7e\xeb\x5d\x80\xfc\x9f\xcd\x7e\xbf\x09\x67\xf4\x4f\xd2\x81\x6a\x47\x23\x47\x0a\xcc\x6d\x0f\xea\x36\x2f\x8e\xd6\xcf\xe6\xda\x5a\x33\xd7\xd5\x3e\x1a\x80\xdc\xc0\xac\xed\xde\x62\x4e\xcd\xfa\xeb\xf7\xa2\xd7\xfd\xe1\xeb\xbb\xfe\x10\x86\x87\xf5\x02\xa9\x39\xe9\x86\xa4\x66\xe0\x47\xaf\x39\x1a\x1c\xf2\xfd\x80\x0c\x70\x3a\xc8\xf8\x13\xda\x61\xdc\x8a\x7a\x71\x8d\x11\x47\x24\xb5\x1a\x24\x33\x88\xe8\x60\x6c\xd8\x46\x57\x30\xb0\x1b\xf1\x85\x9a\x6e\x04\x24\x4b\xbc\xb2\x8d\x07\xcf\xed\x98\x6e\x62\x72\x46\x30\xb0\x6b\x23\x18\x18\x4b\x84\x3d\xb5\x3d\xbe\x70\xd0\xb5\xcf\x1c\xf5\x88\xd3\xaa\x81\x87\x16\x6c\xda\x27\x69\xbd\xbc\x43\x4e\x0e\x30\xdc\xe2\xf5\xa9\x7d\x7e\x6a\x15\xaf\xdc\x6b\x09\xb9\x65\x86\xb7\x4b\x3a\xcf\xbc\x7a\x58\x0c\x12\x27\xa3\x9e\xe3\x97\x85\x70\x6d\xd7\x18\xf1\xeb\xc7\x7d\xc2\x0d\xf5\x42\x48\xb6\xac\x80\x6c\x3f\xd5\x50\x3c\x89\x63\x13\xe3\x3e\x15\xfa\xce\xf0\xb0\x7a\xd1\x17\x07\xc9\x17\x7d\x61\x2f\x91\x39\xc3\x77\x0c\xb9\x38\xc4\x68\xdc\x44\x15\xe3\xef\xc9\xb1\x8a\x92\x68\xab\x89\x29\xfd\xa4\xe5\x75\xd4\xfb\xdc\x61\x89\x9e\x65\xd5\xbb\x3b\x06\x8f\xc0\x43\x1a\xf6\xea\x01\xa6\x19\x7f\x0a\x5f\x1a\xee\xf7\xd3\xc2\x6a\xe0\x1e\x9e\xe4\xe0\xe1\xe2\xcf\x1c\x26\x5b\x76\x16\x11\x8b\x32\x46\xa0\x1d\x90\xa6\xc2\x70\x9e\x17\x67\xb5\x7a\x13\x8d\x4f\xeb\x18\xd1\x46\x2f\x30\x59\x31\xad\xee\xa2\xcc\xd1\xc7\xf1\xfd\xc4\xc0\x5d\x48\x68\xa7\x82\xb0\x19\x51\x8c\x7e\x9c\x9a\x7b\x8b\x46\xf0\xd0\x74\x57\x56\x00\x55\x8b\xb7\xef\xd9\x8e\x84\x4e\xac\x08\xf7\x4e\xf9\x07\x8f\x4a\x11\x0f\xf9\xba\x83\x8a\xa4\x45\x29\xbc\xb6\xa6\x32\xae\x6f\xbe\x65\xf6\xe3\xa3\x52\x7b\x18\x7e\x73\x57\x02\x80\x98\x1f\xa7\x76\xed\x16\x21\xe6\x07\x41\xcc\x2a\x86\x16\x63\xde\xf6\x15\xd4\x06\xc7\x07\xc0\xd0\x36\xee\xe2\xc3\x74\x3c\x36\xc4\x3a\xab\x0f\x5a\xfe\x8c\x3e\xdb\xa5\x0f\xee\x7d\x1b\x23\x15\xfb\xce\xa6\xa8\xfd\x8c\xe0\xfc\xed\x84\x37\xa5\x0d\x47\x7a\x56\x5a\xdf\x74\xe0\xf4\x82\x7c\x68\x83\xab\x7a\x19\x70\x30\xb7\xda\x79\xe2\xa4\xd4\x6d\x60\x35\xd2\x7b\x68\xc3\x83\x3f\x7a\x22\x3c\x63\x64\x0f\x28\x85\x7d\x68\xea\x61\x7a\xf0\x87\xbc\x3f\x5d\x2d\x71\xfd\xf4\x83\xc3\x69\x62\xf5\xb6\xd4\x60\xaf\x48\x69\x5b\x9a\xb3\xf5\xf4\xe1\x22\x56\x52\x95\x11\xc7\x54\xf3\x51\x6f\xb7\x63\x37\xf3\x58\xa9\x78\x42\x1f\x7e\x23\x47\x67\xba\x22\xc6\x4e\xd5\x5b\x11\xf6\x62\x4e\x33\x24\xa9\x4c\x92\xae\x15\x86\xec\x26\x03\xda\x43\x0e\xaf\x5e\x09\x6e\x1c\x16\xef\x06\x25\x0d\x24\x81\x70\xab\x19\x60\x60\xf1\xc5\x6b\x44\xce\x2c\x79\x4b\x25\xc3\xe0\xc6\x5a\x52\x10\x55\x00\xb8\xb0\x9e\x67\xd5\xf9\xbc\x74\xe9\x6d\x2e\xb1\xa0\x66\x68\x44\x84\x9a\x0d\x73\x6c\xe6\x94\xc4\x83\x37\x58\x72\xab\x5e\x0a\x95\x68\xd1\x11\x94\x70\x75\x45\x00\x67\xc6\xd4\x7a\x34\x31\xd2\x1d\x8b\x77\x18\xb2\x6f\x83\x68\x09\xb9\x45\xcb\x1c\xcf\xc3\xa6\xb3\xbe\xa9\x61\x0a\x0d\xf8\xf4\x6c\xc3\xc8\x03\xfb\x77\x07\x1e\xc3\xde\x8a\x3c\x14\x69\x43\xd5\xef\x81\x90\x3a\x4d\x68\xed\x99\x79\xe2\x9b\x50\xb7\x9d\x8b\xbd\x57\x6d\xc0\x9a\x98\x6f\x8e\x7e\x21\x41\x06\xaa\x58\x17\x51\xbd\xae\x18\xae\xaf\x5b\xb7\x40\x6f\xa0\x58\xc5\xa7\x00\xfd\xbe\x19\x8a\x71\x15\x43\x31\xce\x57\x4f\x29\x92\x45\xe8\x65\x7b\x0e\xe4\xcf\xcd\x20\xe3\xa0\xf8\xd6\xc1\x30\xd8\xd4\x59\x0c\xeb\xc9\xbb\xf7\xfe\x16\x05\xe1\x52\xec\x4b\x86\x3b\xc2\xd7\xbe\x44\xc4\x6c\x06\x46\x4e\x94\x08\x7a\x70\x6f\xac\xf5\xc3\xb4\xa3\x41\xf3\x58\xfa\x52\xc9\x1d\x51\x70\x38\x3b\x31\x92\x63\x15\xcf\x09\x66\xd5\x38\x80\x48\x34\x7c\x9d\x83\xaf\xf6\x8f\x53\xe3\x48\xf5\xaa\x0b\x74\x4a\x8c\xa0\xbc\x48\x05\x06\x5d\x0d\x5d\x09\xaf\x7a\x00\xf3\x2a\x54\x6e\xe8\x86\xf6\xa6\x0b\x87\x15\x60\x2c\xbc\x3f\x7e\x0d\x6e\x56\xdc\x41\x83\xf4\xa0\xbc\xfa\x0f\xff\xc6\xce\xa1\xf2\x14\xf9\x31\x50\xf5\xf9\xba\xbe\x0d\x0a\xe5\x4c\xf6\x1a\xea\xe3\x19\x85\x30\xb7\x1b\xa8\x6c\x61\x61\xd5\x01\x57\x9d\xcb\xe9\xa6\xb1\x5a\xbc\x53\x96\x54\x17\x04\x53\xe2\x37\x80\x2d\x63\xd0\x51\x49\x3e\x38\x52\x3d\x10\xd6\xe8\x0a\x0c\x35\xab\xad\xf1\xf0\x91\xc5\x4c\xf7\xc4\x7d\x0e\x3c\xe4\x04\x36\x09\x1b\x35\x57\xdc\xea\xad\x6c\xbb\x26\xd0\x39\xd7\x39\xaf\x6a\xc3\xbc\x21\xea\xf7\xaa\x4c\x2c\x78\x1c\x55\x14\x9e\x0e\x42\xf5\x84\x43\x42\x6a\x80\x7f\xee\x6f\x97\x91\x13\x5e\x44\x44\x43\x77\xd9\xf7\x03\x8a\xb6\xdb\x18\x64\x00\xa1\xc2\x17\x72\xca\xe9\xcd\x0e\x65\xd4\x5e\x87\xf6\x9f\x9f\xe5\x34\xa1\x7d\xbe\x88\x83\x15\x9e\x84\x26\x94\xcc\xda\xc4\x2f\xd5\x42\x94\xd8\x8b\x59\x27\x8d\x86\x0e\xf8\x53\x54\xf3\xef\xc1\x9f\xa2\x5a\x5d\x0f\xfe\x14\xd5\x1a\x79\xf0\x87\x5f\x76\xfb\xf0\xb2\xdb\x2f\x62\x2b\x50\x69\xe2\xf2\x97\x3e\x78\x58\xba\x46\x9c\x9b\xaa\x02\x11\x05\x3d\x0a\x16\x15\x24\xda\x52\x3b\x11\xf1\xe7\x82\x44\x0c\x8c\x19\x5f\xb1\xaa\xb8\xd1\xfd\x2a\x6d\xc9\x8a\x9b\x45\xb7\xf8\x6b\x6b\x2b\x5e\x7d\x86\x8c\x43\x12\x3b\x9c\x00\x89\x09\xe0\xa2\x08\x96\x92\x72\xca\xde\x43\x4b\xbe\x0d\xb8\x5b\xc2\x69\xf5\xc9\x48\xda\x04\x02\xd4\x49\x65\xda\x58\xcc\xb4\xa9\xc0\x8e\x89\xe5\x95\x9d\x8e\xac\x45\x54\xd4\x28\x67\x5e\xe4\x9e\xfe\x3e\x4a\x08\xaa\x0a\x23\x70\x49\x6f\x9c\x01\x46\xe6\x9c\x22\x92\xe2\xd9\xbb\xed\xa9\xa7\x1f\x5d\xf5\x74\xda\x27\xc4\x14\x5b\x9f\x55\xf5\xf2\x9f\xc0\x26\x87\xcd\x11\x56\x6d\xbf\x6a\x4c\x70\x54\x8d\x4f\x91\x6f\x18\x4c\xae\x3e\x26\xb5\x7b\x18\xe2\xb6\xe0\x0a\xcb\xaf\x07\x74\xde\x6e\x40\x4f\xeb\x1e\x72\x45\x6d\x62\x39\x69\xa3\x96\x46\x95\xbc\x97\x68\xa4\x8f\xeb\x50\xc4\x98\x6a\xa4\x7a\x05\x97\xa3\x2a\xca\xcb\x2d\xd8\xf3\x45\xae\x0b\x63\xd2\x4b\x00\x4e\xc9\x08\xc7\x7d\x3a\x23\xb6\x44\x18\x2b\x24\x1a\x2b\x24\x5c\x72\x7c\xe3\x50\xa4\x4b\xa5\x2a\xc8\x87\xb9\xe7\x7e\x01\x8a\x8b\x70\x18\x4e\x27\xb5\x11\xf0\x23\xd6\x02\x8f\xf9\x4d\xe3\xee\xab\x47\xdf\xac\xa6\x5d\xe2\x99\x73\x10\xc9\xb8\x7d\x7c\xe4\x7a\x62\x06\x7a\x34\xbf\x72\x43\xc2\x2f\x2f\x50\x60\xb4\xef\x27\xc2\x66\x84\x25\x28\x04\x5d\xb8\xb2\x9d\xa3\x61\x47\x4e\x22\xfc\x0e\xb2\xce\x27\x9d\xbd\x7f\x77\xd7\xef\xed\xf4\x82\x68\x34\xee\x0f\x77\x19\xac\xa2\xe1\xfc\x45\x8c\x05\xe5\x46\x63\x6f\x38\x36\xb2\x03\xed\x70\xdb\xfb\x55\xfe\xb3\x46\x63\x14\x8d\x5f\xc6\x76\x90\x37\xea\x85\x89\x8e\x9c\xf6\x5f\xce\x1c\x57\xdb\xeb\x2d\x70\xe1\x16\xc7\x3b\xf0\x86\x51\x19\x15\x37\xbc\xe1\x23\x09\x28\x46\x18\xda\x35\x28\x61\x7c\xd7\x92\xdf\xae\xaf\x06\x37\x85\x8b\xaf\x3b\xe7\x5f\xff\xf9\x7a\xf6\x0f\x3d\x38\xe9\xd4\xbd\x5a\xc5\x31\xb3\xc3\xfb\x42\x66\x49\x83\x1f\x42\x66\x57\x85\xf6\x68\xb7\xdf\xed\x7a\x83\x51\x14\x2e\x1f\x4f\xfd\xc7\x8c\x42\x90\x1f\x4c\x5f\xc8\x43\xc1\x9d\xe6\xc5\xa7\xec\x60\xc6\x40\x43\x7c\xeb\xc4\x7b\x59\x11\x58\xde\x09\xdc\xb4\x5a\x3b\x88\xc4\x3c\x06\x0c\xef\x24\x19\xbe\xab\xc0\xa2\xe6\x9d\x6e\x97\xe0\x67\x44\xbc\x0e\x2f\x0c\x19\x9a\xa4\x71\xd4\xcc\x49\xb7\xab\xfa\x35\x11\x99\x71\xbc\xf9\x5b\x0b\xe8\xa1\x55\xb5\x43\x40\x0f\x2d\x46\x46\x27\x29\xe4\x25\xaa\x3b\x4c\x49\x93\x0a\x55\x0b\x0f\x06\xef\x24\x71\x77\x56\x6a\xaa\xd8\x5e\x16\x7e\x02\xe4\x71\x35\xbb\xc9\x42\x67\x26\xea\x6a\x57\x0d\x67\xcd\x27\x9a\x71\x70\x75\xeb\xfa\xd0\xcf\x76\x0a\x8d\xdd\x2e\xa0\xb1\xaf\x21\xe0\xe1\x61\xe4\x8d\x89\x13\x2d\x5b\xae\xc8\x81\x82\x15\x5a\x5b\x7d\x24\xd5\x16\x42\x5f\x74\x8a\x30\x86\x41\xfb\x26\xec\x3c\x0a\x87\x13\xf1\x0b\xc5\x7f\x6b\x11\x28\x29\xbc\x65\x14\xb5\x1f\x4d\xac\x4f\x50\x66\x64\x05\x79\x11\x66\xc6\x91\x89\xd1\x31\x06\xb5\x16\x8a\x10\x71\x3e\x0f\xd1\x06\x98\x3a\x80\x18\x0c\x65\x5f\xd4\xa4\xf2\xbb\x81\xae\x0d\x3a\x7b\x36\xa9\x19\x8d\x77\xe8\x99\x70\xee\x5c\x23\xb1\x2b\xb7\x2d\xe4\x4d\x34\x56\x44\xcd\x12\x42\x07\xa8\x6a\xa2\x74\xe0\x77\xf9\xa9\xdd\xae\x2a\x20\xaa\x9f\xa0\xfc\xce\x96\xf9\x46\x30\x83\x16\xe8\x2d\x1a\x23\xcc\x49\x88\x69\xa0\x25\x90\x86\x50\x24\x8d\x79\x7e\xbf\x4a\xe3\x35\xad\x85\x1e\x8d\xcd\xb8\x0c\xd8\x58\x1b\x49\x7c\x37\xd9\x34\xe2\xf5\x07\x98\x8e\x3f\x5e\xe7\x57\xff\xb0\xcf\x2c\x3c\x23\x70\xf8\xeb\x78\x47\xb0\x70\x7e\x64\x4e\xd6\x03\x72\xe8\x5f\x40\xac\xd1\x1b\xef\xb1\xee\x2e\x4a\x12\x21\xad\x35\xbe\xeb\xe2\xda\x73\x4d\xb9\xff\x0c\xff\xd3\x7b\xfe\xcf\xf0\xf9\x3f\x3d\x2b\xff\x47\xd3\x1e\x45\x16\x2e\x92\x52\x74\x22\x70\x86\x43\xff\xa3\x9f\xd0\x59\x86\x81\x73\x30\xe5\xa2\xff\x29\x28\xf4\x27\xe3\x68\x78\xf8\xb5\x7a\xfa\x62\x95\xda\x2b\x22\x95\x23\xb2\x58\xc1\x15\xaa\x5d\x01\xda\xc4\x5e\xb9\xee\xc9\x2e\x7a\x8a\x8d\x4f\x48\xd6\x53\xa6\xd2\x78\xed\xdd\x70\x5d\xa1\xb7\x03\xf7\x54\x45\xdb\x0f\x14\xbe\xc0\x8e\xcd\x93\x3d\x35\xe3\x50\x9f\xaa\x6b\x45\x0c\xba\x3e\x1d\x8f\xbf\x90\x35\xf1\x61\xde\xb0\x94\xbd\xcc\x2d\xbe\xd8\x1d\xb7\xa9\x67\x73\xc5\x6d\xc4\xf3\x40\xd6\x2d\x6a\xee\x3a\x48\x6a\x79\x48\x2f\x35\x89\x5e\x22\x12\x4a\xbf\x03\x91\x85\xb4\x59\xfd\x72\x86\xbe\x26\xd5\x24\x73\x3f\x31\xae\x77\x0c\xd7\xa9\xa3\x4d\x60\xed\xf9\x59\xdf\x3b\x3a\x0c\xa9\xa8\x36\x63\xae\x9d\xbe\x75\x48\xbe\xa4\x17\x72\x21\xe4\x93\xc7\xa0\xc4\x33\x5a\x0d\x55\xe9\x55\x29\xdd\xd9\xcb\x65\xd6\xfe\x43\xbe\xaf\x86\xa9\xda\x57\xc3\xc5\x83\x33\x01\x5b\x09\xb0\x42\xb4\xa7\x08\x71\x35\x30\xe8\xb8\x1a\xd8\x46\xaa\x72\xbc\x63\xbc\x4a\x9f\xb4\xcb\x6b\x47\x54\x5a\x94\xa1\xfd\x08\xd3\x5d\x87\xa1\x6d\x64\x0d\x4d\x0d\xfd\x47\x7a\x68\x3f\xc2\xdf\x3a\xbc\xeb\x53\xd8\x92\x14\x86\xbd\x74\xb1\xeb\x1c\xec\x5a\xf9\xcb\xdd\x3c\x9f\xdd\xfc\x4e\x07\x6d\x0c\xa2\x9d\x6a\xc2\xf4\xd4\xa3\x9b\x38\x31\x53\xe0\x6d\x85\x77\x83\x22\xe2\x0d\x95\x11\x6c\x40\x1b\x78\xf1\xbe\x4a\x1b\x79\x85\xa5\xc8\x69\xac\x47\xeb\x9b\x00\xb8\x9c\xa7\x79\x63\x77\xe9\x56\xd0\x75\x81\xe2\xee\x28\x52\xbe\x07\x6d\x13\x8b\x7d\x12\x89\x3c\xa0\x8b\xd7\x87\x18\xa8\x29\xba\x77\x03\x4b\x70\xf8\x2b\x97\xe1\x79\x40\xf0\x8d\x67\xf2\x2a\xdf\x96\xdc\xa6\x42\xeb\x74\x5e\x40\xd6\x2e\x52\xf7\x9e\x5e\x17\x19\x6c\xc7\xd2\x19\x3c\xcc\xd0\xb5\xc4\x8a\x84\x9b\x08\x4b\x54\x63\xd3\xe1\x3a\xf3\x9b\xc9\xf0\xa9\x71\x25\x24\x4e\xd3\x5d\xa1\xdb\xca\x47\x79\xc5\x1b\xce\x62\xab\x71\x04\x66\x80\xa3\xce\x5e\xe6\x45\x0a\x0f\x46\x34\x49\x43\xb5\xc1\x92\x06\x53\x47\x1f\xe1\xea\xf4\xa4\xd3\x2e\xc6\x2c\x78\x18\x22\x66\x89\xe8\xd4\xc3\x65\x21\xde\x93\xdd\x84\x87\x0d\x27\x62\x8e\x0e\xca\x36\x00\xdd\x34\xf3\x6e\x43\xb9\x8f\x0e\x61\x55\x8a\x7a\xf0\x9a\x85\x68\x42\x92\x97\x82\x24\xf5\x6e\xd3\x22\x22\xb9\xa3\x21\xa4\xd4\x74\x60\xbe\x64\x98\x18\xe5\xb8\x09\x8d\x37\xe7\x51\xf2\x60\x29\x36\x10\xa3\xc1\x19\x1b\x15\x80\x26\xdd\xeb\x85\x44\x61\xc2\x70\xa7\x7d\xcf\xd9\x1d\x90\x63\xe7\xc8\x8d\xf0\x4c\x42\xb8\xd2\x95\x53\xb4\xfb\xc8\x89\x0c\xfa\xe4\x84\x23\xfd\x4b\x16\x75\x57\x2a\x79\x75\x3f\xbc\x81\xf5\xd3\x78\x7e\xfe\x2b\xd2\x32\x35\xee\xf2\x40\x78\x38\x27\x4c\x97\xbe\x48\x6a\x42\x3f\xd3\x84\x66\x4c\xef\x75\x71\xc4\x78\x18\xff\x82\x22\x2c\xaa\x38\x9e\x31\xea\xb4\xd3\xc8\xce\xd1\xc8\x37\x71\x93\x37\x70\x86\x49\x57\x76\x17\xe8\xca\x2e\xd3\x95\xdd\x45\xba\x92\xb4\x0a\xfc\x6c\x72\xb0\xa8\x61\x4f\xe6\x08\xbf\x8b\x14\x05\x49\x49\x49\xc5\xbc\x68\x72\xa1\xa9\xca\x14\xc1\x49\x47\x69\x61\x88\x24\xe0\x2e\xdc\x2c\xc6\x68\xd6\x9a\x41\x38\xeb\xee\xdf\x2d\x74\xff\x8e\xbb\x7f\x47\xdd\x5f\x8e\x09\x8f\x3a\xb9\xe9\xd0\x2a\xdd\x21\x51\xdc\xeb\x25\xf8\x79\xc2\x80\xfe\x5f\x5f\x72\x12\x77\x99\xcc\xec\x78\xfb\xc9\xbe\xe4\xdc\x65\x53\xf5\x59\x37\x0b\x1f\x30\x11\xec\x90\xb2\x37\x8a\x76\x7a\xe1\xde\x0c\x3d\x8b\x64\xcd\xad\x9d\xb5\x6c\xce\xb2\xb2\xff\x8e\x79\x41\xbc\x11\x44\x8f\x3b\x1d\x20\xce\x8f\x3b\xb9\xbf\xb5\x87\x54\xa1\x57\x89\xea\xb7\x89\xde\xb7\x8a\xff\x92\x0f\x81\xb0\x1c\xc2\xcf\xaa\xd2\x95\x79\x81\x15\x81\x3b\x03\xf3\xfe\xa0\xe3\x27\x83\x1d\x01\xdf\x80\x20\xf3\x98\x29\x41\x55\x53\x19\x4e\x25\x0e\x05\x35\xf4\xa5\x9d\xc3\x24\xcd\xa7\xc0\x0a\xf1\x03\x20\x7a\x4f\x59\x7c\x7b\xee\x5e\xa7\x84\xe3\x03\x28\x24\xe6\x8c\xe5\x94\x39\xa1\xa5\x13\x9e\x38\xa1\xab\x13\x48\x3c\xae\xde\x32\x54\x97\x68\x62\xb4\x7c\xbd\x9b\x43\x13\x25\x85\xb2\x8c\x19\xef\x11\xb7\xed\x3a\xd7\xab\xda\xab\x24\x6d\xed\xc9\x0d\x63\x7f\xba\x78\xc3\x58\x0d\x17\xef\x1a\x3f\xf4\xd3\x6e\x1f\x65\x6b\xcb\x6f\x1b\xbd\x2a\x5a\x55\x4e\x25\x7c\xec\x54\x05\x97\x9d\x8a\x24\x35\x75\xcb\x58\xd5\x98\x28\x79\xe5\xf0\x34\x8e\xfa\x81\x2f\xd0\xa8\x30\x16\xcd\xcb\xc8\x55\xc1\xcf\x94\x01\x8c\x4c\x6a\xa4\x1f\x5f\x20\xe9\x50\x42\x56\x38\x74\xc7\x62\xa7\x88\x44\xaf\x29\x5d\x3f\x82\x5d\x3a\xf7\x11\x74\x91\xab\x8a\x90\x5b\xcc\x00\xd4\x06\x90\x2a\x70\x0c\x02\x19\x12\xda\x5d\x37\xb2\x7b\x38\x27\x00\x41\x0d\xe1\x93\x37\xe1\x49\xc8\x13\xf8\xd4\x84\xb3\xb3\xf9\xfc\xdc\x40\x00\x84\x1f\x28\xb9\xa1\x1c\xd5\x13\x19\x5e\x6c\xa2\x07\x2f\xb9\x18\xb2\xbb\xf9\x86\xeb\x42\x93\x4d\xd7\xed\x5a\x03\xbe\x3f\x2a\x41\x7d\x0f\xf3\xca\x25\x96\xda\x45\x46\x5a\x47\xda\xed\xb8\xd0\x74\x87\x9a\xee\xde\x00\x28\x74\xb8\xc9\x8e\xc4\xc6\x5f\x69\x22\x53\xff\x16\xcf\x58\xbb\xc1\x95\xf4\x2c\xbb\x8b\x4e\x50\xe4\xda\xd5\xb5\xec\x41\xe2\x04\x85\xf3\x13\xcf\xce\xae\xda\x99\x03\xdc\x95\x3e\x3a\x5a\xa3\xcd\x00\x3f\xab\xb8\x93\xba\xbc\x93\xba\xb8\x6c\x11\x5c\xd2\xba\xb2\x63\x0c\x98\x6f\x56\x73\x4a\xbe\x61\x42\x7e\x22\x39\x86\xff\x44\xb2\xec\x02\x33\xad\xc8\xcb\x08\x9b\x4b\xdf\x2f\x16\xee\xa6\xf2\xa5\xcf\xc4\xb7\x45\x74\xe8\xcb\x1c\xb6\xc4\x6d\x44\x97\x13\xf9\xd1\x12\x56\x9b\x11\x05\x7a\x35\x2c\xc9\xaf\xa3\x4e\x51\x5d\x09\x02\xd7\xaf\x04\x0e\xc6\x8d\x41\x97\x23\x02\x6d\x29\x3b\xce\x68\xfc\x47\xa8\x64\x31\x8e\x3a\xe4\x75\x25\x08\xc7\x58\x47\xa6\x48\xed\xb5\x6c\x2d\xcc\xb0\x84\x15\xef\xc1\x4e\x8b\xf5\x60\x03\x72\xd4\xa5\x2b\x07\x72\xb7\x2f\xdc\x6e\x07\x3e\xdd\xb5\x80\xec\xc0\x22\xe1\x16\xec\xa2\x9c\x5f\xba\x6c\x3b\x57\x6d\x2b\x17\x64\x49\x4a\xa9\x69\x93\xab\x4e\xad\xce\x39\x2a\x38\x19\x41\xfc\x92\x83\xa7\xfa\xc1\x84\x3d\xdd\xa7\x32\x49\x2b\xdd\xdf\x83\x29\x4f\xc6\xff\x1b\x96\x7c\x9a\x48\xd3\xdd\x41\x2a\x4d\x66\x16\x69\xa8\x05\x5a\x4d\x18\x25\xb0\x24\x39\xab\xb4\xe2\x39\xc2\x07\x33\x51\xe6\xff\x4b\x32\x4e\xcb\x7d\x60\x4e\x0d\x8a\x8e\x45\x97\xd0\x19\x3a\x94\x8b\xf1\x29\x0c\x78\xdc\xc7\x0d\x86\x0a\x27\x8c\xf3\x17\xb9\xec\x55\x66\x46\x30\x9b\x9d\xad\xc3\x03\x45\xb8\x87\x1f\x7d\xb6\xf0\x37\x59\x73\x6b\x6b\x3e\xd9\xd4\xb3\x58\x12\x25\x92\x1e\x60\x4f\x1f\x0e\x6a\xc5\x53\x1b\x74\xc9\x40\x4f\x29\x14\x6e\x48\x69\x11\x40\x86\x5c\x5a\x4b\x1f\x03\x28\x1d\x26\x4b\xa3\x74\x20\x56\x47\xd4\xc6\x39\x39\xb8\x6f\x51\xcd\xcf\xcf\xfe\x7a\x68\x52\x23\x03\x3a\x1b\x9b\xed\xdc\x00\x08\xc1\x01\x51\x52\x7b\x53\x52\x43\x54\x39\xee\xcd\x43\x36\x6a\xa0\xa5\x04\xe4\x80\x6b\x29\x71\x84\xb7\xdf\x9b\xb5\x0d\x29\xef\xd7\x71\x4a\x84\xfe\xcd\xf5\x9e\x9f\x2f\x3a\x8a\x39\x30\xb8\x77\x6b\xbb\x4a\xa1\x30\x30\x74\x89\x2a\xbe\xf2\x17\x53\xb8\x37\x92\x9f\x26\x62\xe8\x2f\x84\x73\x4f\xa8\x66\x59\xde\x6b\xf9\x9d\x99\x6a\x49\xc7\x1f\x70\xa9\xaf\x73\xc3\xaa\xfd\x75\x0c\x7b\x97\x46\x76\x31\xf2\xdc\x41\xb5\x70\xe9\xcb\xb1\x07\xbd\xe0\x22\x7a\x00\x67\x8a\xc1\x24\x66\x19\x9e\xd8\x64\x6c\x3a\x6a\xfd\x4b\xcd\x7d\xe7\x7e\x9f\xad\x25\xb6\xe2\xd4\xf6\x81\xd3\x3c\xe1\xd4\x77\x71\xea\xe3\xbd\xe7\x34\xc6\x1e\xa7\xff\x15\xa7\x7f\x1e\x39\xb7\x65\x49\xde\x7c\x1f\xa7\xdf\x8e\x3c\xa7\xad\x3e\x6c\x1b\xd5\x9f\x34\x9d\xd3\x0a\x27\xbf\x37\xea\x6f\x1e\x39\xbb\x7b\x73\xad\x37\x77\x24\x26\xa4\x48\x8a\xf7\x7b\xe8\x72\x6b\x34\xf6\xc6\x11\x2a\xca\x5d\xb9\x34\x05\xc5\xca\x2c\x53\xaa\x23\x6b\xa1\x50\x30\xac\xca\xbd\xa0\x81\x0b\x0c\x6c\xcf\xbc\x4f\x7f\xb6\x28\x7e\xbd\x0e\x65\xc3\x5e\x87\xb0\x30\xe8\x42\x52\xa4\x00\xf4\x6e\x4b\x6d\x40\x4f\x24\x92\x3d\x41\x71\x1a\x06\x3c\x42\x49\xcb\xb0\xf3\x3d\x7e\xbd\x18\x67\xd9\xa7\xf3\x77\xc6\xfd\xdf\x20\x8f\x52\xee\xbd\xb7\x28\x8c\x23\x09\xb1\xff\x5a\x5a\x10\xf3\x13\x36\x1c\x07\x0b\xbc\xb9\xa7\x89\x9a\x0d\x80\x3f\xc4\x09\x97\x53\xa5\x56\x6f\x56\xf1\x34\x31\xe0\x7f\x54\x8d\x1d\xf8\x68\xb7\x69\xb0\x32\xa7\x03\x56\x16\x46\x6f\x0d\x34\x65\x70\x93\x0e\xf8\xb9\xf0\x50\xce\xe1\x9b\xc5\xaf\x2b\xe9\x52\x98\x08\x94\xc6\x10\x2f\x5f\x47\x3b\xb8\xb1\xe8\x8c\xb8\x42\xc7\x21\x9f\x89\x3d\xbc\x6c\xd6\xae\x99\xbd\x76\xb4\x93\x36\xda\x4e\x2f\xdc\x8a\xeb\xc5\x66\xd7\xd5\x68\xdc\xea\xb3\xaa\xe5\x68\x32\x18\xf4\x87\xe3\x28\x7c\x63\x99\xed\xf3\xe5\x8f\xa5\x4b\x4b\x97\xec\x1b\x51\x0c\x0b\x93\x7a\xcf\x5b\xf5\x9b\x78\x69\xc1\x4c\xbb\x8b\x40\x75\xf4\x24\xcb\x72\xf4\xb4\x28\xaa\x11\x4c\xa1\x7b\xbc\xb7\xab\xdc\x70\x89\xe2\x16\x12\xb5\x5e\xc9\xa3\x60\x19\xfc\xc1\xf6\x59\xff\x52\x2e\xab\xdf\x48\xd3\x45\x39\x74\x11\x70\x29\xea\x59\x59\x51\x80\x5a\x11\xa1\x50\x61\xdf\x97\xa3\xb5\xba\x60\x00\x9f\xd5\x1b\x5c\x7d\x99\xdc\x1f\xad\x9c\xd6\xa8\x44\x94\xb4\x51\x34\x84\x39\x82\x1c\x25\x2b\xf7\xca\x25\x46\x95\x60\xcd\x0b\xbe\x02\xd2\xdb\x5e\x43\x97\xa0\xee\xc4\x4e\xf7\xcc\x9d\xaf\x5c\xed\x8d\xfb\xaf\x43\x76\x82\x4a\xbb\x1f\x29\xaf\x56\x86\x3a\xd1\x06\x7e\xd9\x6b\x2c\xae\xc0\x3d\xef\xc8\x7d\x7f\x61\x05\x11\x47\x03\x22\x16\x96\xae\x59\x70\xc5\x83\x8f\xc4\x84\xc8\x11\x30\x53\x37\x69\x19\x0f\xa3\x44\x35\x19\x65\x55\xd1\xc3\x88\x78\x3b\xb2\xb3\x64\x66\x9e\x26\x85\xbb\x40\x1d\x1e\x74\x46\xcc\x17\x14\x33\xe5\x9b\x94\xc0\x6a\xe2\x4a\xd4\x2e\x2e\xfc\xc8\xe9\x38\x1f\x92\x64\x65\x8e\xc4\xc3\x9c\xd0\x8d\x15\x59\x37\xa9\xf5\x7e\x6d\xad\xd3\x4d\xc3\x8b\x3e\x7b\x4c\xf8\x36\x8e\x28\xf6\x12\x85\xbb\xa7\x1c\x2b\xb3\xc4\x18\x63\x62\x9e\xae\x1e\xd4\x03\x3b\x7b\xea\x65\x45\x76\xed\x3c\x2a\xdc\xd6\x6b\xe6\x58\xb9\x02\x99\x9e\x8f\x0b\x5c\x1b\xe2\xc2\xe2\x54\xe4\x90\xe3\xac\x00\x34\x0d\xa1\x1b\x9f\xd0\x43\xc1\x27\x5d\x61\x8c\x01\x76\x5b\xed\xae\x79\x86\xb4\x7b\x61\x34\x7b\xdd\x9f\x8c\x5f\xf7\x1b\xe2\x9d\xe0\x8d\xe2\x61\xf5\xd4\xd4\x68\xea\xfd\x07\x45\x8a\x50\xa3\x17\x7b\x75\xaf\x7e\x3e\xbb\x51\x8c\x2d\x1d\x50\xb0\x3e\x44\xc1\xb0\xaa\x09\xdd\xc3\x79\xc5\xe8\x56\x26\x18\xa3\x00\x30\x90\xab\xa3\x03\xcf\x0d\x2e\x82\xfa\xab\x84\x6a\x99\xc6\x08\x8c\x32\x28\xa8\xf5\x62\x40\x20\xa8\x32\x1b\x2f\x29\x9d\xca\x6b\x0f\x05\x72\x84\x24\x08\x62\xed\x40\x88\x32\x41\x15\x40\xcd\x0b\xe1\x69\xe0\x15\x25\xd1\x7b\x00\x54\x9e\x87\x1b\xa8\x87\xa8\x2a\xae\xce\x2f\xf9\x85\x7b\x47\x8a\xeb\xf6\xf5\xbe\xb8\xa7\x3f\xc8\x37\x59\x5b\x43\x9a\x90\x9f\x45\x6f\x4d\x90\xcc\x15\xd4\xf4\xc2\x31\x08\x2b\xde\x4a\x6c\x64\xf6\xfd\x21\x64\x95\x02\x75\x20\xb0\xbe\x77\x15\x6a\x12\x9e\x77\x1a\xf5\xa5\x8e\xb1\x01\x9d\xb1\x83\x87\xdf\xc1\x6f\xaa\x0d\x42\x11\xbd\xe6\xd2\xee\xca\x95\xec\x1e\x59\x49\x0e\xa1\x9a\x87\x72\x66\xfd\x08\x46\x49\x1b\x9b\x1f\xbd\xa2\xe7\xe6\x28\x9a\x10\x4c\x6a\xdd\xbb\x51\x8a\xe1\xbc\x3a\x8a\xa7\x64\xb8\x60\x7b\x4d\xbd\x79\x68\x2c\x27\x12\xe2\xee\x78\xb2\xc8\x42\x22\xe8\xcd\x38\xd6\xb2\x1b\x58\x1b\x38\x09\x7e\xe4\xf0\x97\x52\x0c\x1f\x79\xd5\x84\xca\x13\xe7\xf4\x4b\x5f\xda\x92\xd9\x72\xd6\x37\xf1\x36\xce\xdc\x47\xda\x4c\x8b\x87\x98\xa7\xee\x96\x7d\x54\x36\x2c\xc1\xfd\x47\x36\x83\xdc\x8b\x80\x28\xe0\xf8\x33\x9e\x41\x52\xc1\x06\x40\x4a\xca\xdc\x21\xb6\x4f\xe6\x6a\x88\xef\x6c\x4f\x10\x14\xfc\x5a\x96\x4d\xfb\x83\x41\x71\x4e\xde\x61\xd3\x1b\x5c\xdc\x36\xb6\xd1\x98\x17\xc9\x88\x78\xc7\xbf\x31\xdd\x92\xea\x71\x7f\x56\xa4\xb1\x56\xf3\x25\x37\x54\xb8\x17\x36\x2c\x26\x49\x6a\x41\x62\xf6\x63\x27\x78\xca\x0b\x15\x4e\xd5\xc6\x8a\x1b\x83\x45\xd1\xf2\x51\x2d\xff\xb3\x12\x04\x1b\x7c\x3e\xdf\x68\xfb\xa1\xaa\xbd\xc2\x7d\x9d\xc5\xe1\x63\xf1\x85\x3c\xe1\x1d\x87\x5a\xaa\x41\x13\x8a\x9b\xfe\x14\x65\xd9\xff\xb9\xc8\xff\xd1\x04\xa0\x31\x5d\x61\x7e\x51\x03\xb9\xf3\x99\x96\xd2\x5f\x66\xa9\xa5\xc5\xfa\x4b\xf4\xb7\x7e\x1e\xa0\xeb\x37\x67\xb5\x9d\x7b\x50\xba\x6d\xba\xd8\xa3\x14\x33\xf2\x23\x23\x1e\xf3\x4b\x8d\xcf\xcf\xd4\x16\x75\x34\x9f\xdb\xf8\x48\x0f\x30\xfc\x12\x86\x9c\x76\x00\x39\x1b\xee\x03\x0d\x12\x92\x06\xfb\x23\xe7\xc7\x87\x13\x7c\x90\xd6\xe6\xa2\xc4\xc1\x60\xf4\x73\x5e\xfc\x21\x3d\x33\x57\x20\x00\x50\x47\x7f\x0e\x56\x31\x51\x4b\xe2\x0b\xf5\xec\xcc\x4a\x86\xcb\x0a\xac\xe5\x1d\x0e\x9d\x30\xe9\x63\x6e\x27\xdd\x65\x9e\x32\x34\x82\x53\x6a\x33\x32\x0f\x6b\x6b\x54\xed\x45\x3b\xa3\xaf\x6a\xd2\x81\x02\x9e\x5b\x2a\xaa\x8c\x31\x31\xe5\xc4\x2c\xa7\x67\x65\x47\xcd\x8a\xf3\xab\x16\x56\x60\x0d\x7d\xd2\x46\xca\x68\x64\x37\x96\xde\x96\x64\xa2\x1d\x55\x75\x0c\x8e\x15\x9d\xcb\xbc\xea\xae\x0e\xb4\x71\x05\x01\x78\xcb\xeb\x85\xdd\x08\xe9\x39\xb9\xeb\x1e\x6c\xa1\x44\x18\xaf\x12\x47\xdd\x5c\xdb\xb3\xd5\xff\x8a\x7e\x6d\x98\x64\xe1\x41\xe2\xce\x51\x9c\x8e\x63\xc5\xf6\xc2\x81\x55\x3c\x15\x5f\x33\x97\x8f\x37\x76\x3d\x38\xb1\x0f\x46\x62\x0c\xb1\xb3\x6a\xaf\x6c\xf2\xc1\x08\xd7\xdf\x0a\x5f\x7f\x71\x5d\xf7\xaa\xee\x4e\xe7\xf9\xb9\xdc\x59\x5b\x3b\xea\xe4\xde\x6c\x16\xfe\x2e\x6c\xbf\x41\x6e\x78\x85\x2e\x86\xdf\x06\x70\x31\xdc\xb0\x8a\x97\xf2\xfb\x20\xbf\x33\xf9\x05\x3a\x71\x42\x3a\xc5\x70\xde\xe0\xcf\x2e\xbf\x35\x46\xf4\x33\x6e\x22\x55\x08\x17\x82\x7b\xbc\xc1\x5f\x15\x46\x9e\x47\xe9\xb3\x33\x56\x47\xbe\xf3\x38\xbd\xf5\xc8\xbf\xc3\xc9\x22\xcd\x09\xdf\xbc\xc5\xbb\x58\x82\x47\x68\xac\xc1\xbe\x02\x07\x9c\x56\x3f\x73\x5a\x01\x23\x9d\x7a\x8b\xed\x40\x5f\xbd\x45\x02\xb2\x92\x24\xd1\x8a\x9f\x7f\x63\x82\x65\xa5\x98\x3a\xdd\xab\x2a\x5a\xa8\x01\xb8\xbf\x1b\xc1\x5d\x7d\xd7\x1b\x40\xe7\x91\x16\x55\xb0\xc1\xa6\x3a\x26\x78\xa8\x5b\xaa\x7f\x64\xf6\x26\x68\xab\x93\xdc\x52\x84\x55\x7c\xa8\x93\x7b\xd0\xc5\xe3\x1b\x46\xb4\xb3\x9a\x61\x45\x81\x8e\x42\x5d\xf7\x60\x14\xfb\xcc\x1c\x37\x85\xa4\x69\x03\x6d\x83\x14\xca\xee\x98\x5d\x6f\x41\xdd\x0d\xf4\xd7\x3f\xf6\x04\xbb\x1c\x54\x95\x99\xab\x10\x19\xb0\xb0\x96\x52\xd1\xc0\xac\x38\xed\x87\xd5\xdc\x0e\xdb\x76\x01\xc2\xa8\xa0\xc7\xa8\xfa\x1e\xfe\xb5\x2c\xf1\x8d\x74\x8f\x5e\x1f\xbd\x7a\x44\x1e\xaf\x09\x1f\x70\xdf\x95\x4a\x1d\x7f\x30\x8e\xff\x7b\xb4\xda\xf6\xeb\x4d\xf2\x04\xb5\xb2\x57\xd5\x13\x0d\x3b\xb7\x7e\xbd\xe3\xd9\x9f\x0f\x65\x35\xfa\x55\x3b\xb4\x12\x9f\xbf\xc3\xe7\x2f\xea\x73\xe7\x1c\x3f\xef\x55\x81\xec\x43\xc6\xbe\x5a\x90\x15\xd1\x82\xa1\x32\x81\xbd\xfb\xe0\xa9\xec\x8a\x70\xa3\xca\xd0\x3c\xc3\x3e\xad\xe8\x6f\x45\x94\x84\xf0\x51\x7c\xa7\x6e\x78\xdc\xea\xde\xd8\xb3\x1f\xc7\x4a\xe9\xb1\x67\x7e\x54\x49\xb6\x27\xf6\x6f\xab\x77\x64\x14\xf6\x6d\x60\xec\xe8\x3d\x0c\xe4\x54\x41\x2b\xf5\x4b\x33\x19\xf6\x1a\xcd\x25\x6d\x47\x99\xe0\x23\x54\xa7\x9a\xe9\xd7\x13\x7c\x65\x6b\x61\xd8\x92\xb2\x91\x4a\x1d\x39\x50\x09\x54\x1c\xf5\x54\xbf\x08\xe5\x20\x86\x6d\xab\x13\xaf\x03\x49\xbc\xdd\x70\xf7\xba\xb9\x0b\xa5\xc6\xd9\x50\x57\x4f\xd8\xc4\xd3\x36\xc6\xf9\x01\x30\xed\x64\xa8\xe0\xff\xce\x06\x50\xa4\x5e\xfb\xde\x12\xa0\xd2\xa0\xb1\x29\x2b\x7f\xae\x88\x00\x19\x0c\xea\xcb\x5d\x24\xd2\x1a\xb2\xe5\x4c\xc8\x1b\xed\x67\x40\x1e\x21\x67\xc3\xba\x49\x43\xb5\x81\x40\x0e\xaa\xc9\x2d\x52\xf4\x5d\x37\x38\x81\xfd\xe0\xba\x00\x61\x70\x8c\x9f\xa0\xb7\xb3\xc2\x17\xf8\xe6\xa3\x83\x27\x74\xf8\x7c\x0f\x93\xe9\xaf\xb8\x00\x62\x40\xf2\xad\xb8\x57\x3b\x1e\x0a\xe8\x55\xc6\x82\xf8\xb6\xff\xda\x9f\x04\xad\x68\x14\x97\x41\x72\xb0\x5f\xcd\x24\x7d\xc7\x4d\x35\x1f\x86\xcf\x2a\x58\x41\x99\x4a\xff\x28\x67\xb1\xc9\xd2\xdb\x1c\x8d\x90\x3d\x55\x21\xa4\x90\x36\xe1\x9e\x4a\x81\x07\x0d\x51\x29\x48\xfa\x2d\x08\xd2\xb8\x01\x17\xc8\xf0\x09\xb7\x37\xd1\x2d\xda\xc2\x5e\xef\x76\xe3\x26\x31\x66\xf6\xdb\x30\x1f\xbd\x8d\x3e\xfd\xef\xd0\x03\xa3\x1b\x7a\xef\x75\x04\x3b\x75\xce\x63\x8f\x15\xf3\x79\xe0\x7e\x55\xc0\x40\x6e\x0d\x7c\x37\x28\xcc\x30\x44\x73\xe1\x51\xc1\x92\x58\xa4\x18\x0d\xef\x55\x96\x42\x07\x10\xce\xdf\x34\xd9\x49\x49\x0a\x45\x21\xa4\xc7\xd4\xcd\x57\xc5\xe6\x57\xf3\xc2\x7b\xc4\xe3\x0d\xe2\xe7\xd1\x3b\xdd\xba\x07\x9b\x07\x7b\x83\x6f\x8f\xfc\xf6\x58\xc4\x1f\x97\x04\xb8\x93\xbc\xeb\xa3\x7f\xdf\x51\x1e\xe5\xee\x04\xe9\x80\x0f\x10\xc6\x81\x7c\xbd\x90\xb7\x46\x6c\x2c\x82\xbd\x3f\xe9\x30\x99\x72\x85\x08\x23\x03\xad\xeb\xd9\x20\x53\xe3\x6f\x03\xe5\x99\x4f\xad\xbd\xbc\xd2\xda\x9b\x03\x2d\xcc\x6c\x72\x6f\x14\xef\x84\x6f\xa6\x20\x03\x2e\xa2\x33\xb6\x08\xf0\xcc\x89\xec\xec\x63\x59\x9a\x45\x9f\x66\x51\x59\x73\xeb\x5a\xce\x15\x59\xad\x84\x66\x07\xe8\x47\xad\x81\xca\xa0\x07\x37\x16\xbb\xc1\xc5\x47\x80\x5b\x4a\x04\xc4\x54\xda\x70\xf0\x57\x3b\xd3\xa2\x80\x28\x2c\xd4\x0b\x4b\x61\x3e\x70\x42\xcf\xe6\x68\x29\x3a\xd1\x59\x0f\xb1\x11\xd3\x19\xca\xc5\xd2\x86\xd1\xe7\xb3\x6a\x19\x9f\x55\xd3\x3b\xd2\xf4\xce\x7f\xd7\xf4\x15\x4c\x51\x16\x87\x26\xb9\x6b\xbf\xc6\x18\x18\x9d\x34\x63\xa8\x19\xe7\xc7\x62\x5a\xd1\x48\x20\x1f\xd5\x7e\xfe\x9b\xb1\x36\x87\x86\x65\x1c\x46\x91\xb7\x7e\xce\xc6\xa6\x1b\x69\xb5\xe7\x83\x78\xbf\xab\xf3\x30\xc0\x28\xca\xc5\x1f\x4a\xc5\xb6\x9d\x6b\x58\xa5\x86\xe3\x13\xd4\x31\xee\x81\xd6\x20\xb9\x69\x95\x9a\x90\xdc\x10\xeb\xee\xde\x3f\xa4\x8a\x7e\x58\xb5\x67\x63\x53\x54\x96\x2d\xda\xb9\x77\x3d\x00\xe1\x9d\x4e\x69\x38\x42\x09\x05\xa5\x45\xd0\xf0\xa9\xd2\x8d\xb1\xe1\xdb\xfd\xc8\x39\x69\xf2\x46\x44\x03\x23\x39\x82\x12\xb9\xbc\xf8\x33\x34\x7e\xc4\x64\xeb\xe1\x00\x9e\xd0\x6d\xca\x22\xf4\x23\x58\xee\x8c\x09\xed\xc2\x3d\xd9\xc7\xad\x42\x64\xce\xfd\x08\x31\x32\x3e\x9d\x34\xb1\xdd\xa1\x79\x64\xd0\xad\x89\x6a\x4c\xd2\x7e\x47\x29\xda\xef\x8b\x74\x2b\x42\xb7\x3e\xea\x85\xfc\x85\x9b\xdc\xc3\x7b\xd3\xde\x51\xdd\x1c\xab\x71\x38\x0b\x19\xe7\x51\x0f\x68\xdf\x15\xb9\x02\xac\x96\x99\xe0\xbb\xce\x1d\x57\xed\x61\x15\xc9\xef\x63\x51\x46\xb9\xff\xae\x94\x4c\xa2\x88\x89\xe4\xdd\xae\x4e\xb9\x55\x4f\xad\xbe\x7a\xba\xfc\x87\x73\x05\x59\xfc\xa2\xee\x3d\x91\xd2\xdf\xb3\xcc\x3d\xf9\x78\xed\x2e\x30\xe8\x8f\x71\x16\x6e\xe3\x59\x30\xf4\xd9\x89\xb9\xe5\x56\x84\x28\x0d\xd0\x62\x4f\x3b\x30\x93\x0b\x6b\x71\x82\xb2\x4b\x54\xd4\x68\xdd\xe1\xc3\x26\x00\xa4\x60\x1d\x18\xa5\x7a\x32\xa6\xec\x92\x65\xaf\xc4\xad\x3c\x42\x8a\x69\xc5\x83\x71\x2a\x65\x15\x54\x70\x68\x43\x3b\x85\xdb\xdc\xf0\xc0\xfe\xd9\x40\x57\xc6\x7e\x7f\x18\x46\x43\x67\xc3\x1e\x8d\x1f\xbb\x91\xf3\x34\xf4\xec\xd1\x30\x70\xae\xa6\xa8\x0e\x83\x85\x01\xc9\xe2\xed\x0f\x9e\x00\x9d\x62\x2f\xf3\x2d\x5c\x34\xec\x10\xa6\x61\x9f\x9a\xf2\xbc\x81\x51\x07\x76\xbb\x40\x5c\xe3\x4f\xdc\xd8\x67\xb3\xa4\x4d\x25\x77\x29\x68\x82\x89\x71\xae\x44\x6c\x0c\xab\x41\x15\xb4\xfa\x52\x01\x89\x35\xbe\x8c\xa4\x60\xab\x8f\x05\x6d\x9c\x18\x7a\xde\xb0\xec\xb2\x47\xcf\xe2\x98\x1e\x51\x49\xc7\xf3\x16\xf8\xd8\xb4\xb4\x69\xa6\x7d\x7c\x81\x5d\xf1\xc4\xce\xd5\x75\xa7\x8d\x0c\x0e\x3e\x2d\xe4\x5e\xc3\x44\x13\xde\xf2\xc5\xd3\x0b\xec\x65\xae\x18\xce\x9e\xce\x02\xc3\x59\x22\x16\x88\x6e\xd7\xd6\xda\xc2\x73\x84\xe9\x55\x25\x80\xb0\x90\x44\x98\xc5\x38\x91\x7a\xb8\xef\xc7\xb0\x76\x2b\xb9\x60\x9a\xe2\x5c\xbc\xcb\xbe\xd3\x5e\x3f\x92\x8e\xd2\x32\x91\xa1\xb2\xe0\x30\x78\x54\x44\xf6\xfd\x77\xfb\x5e\x28\xc5\xcf\x78\xab\x3e\x11\xd6\x3e\xf5\xfa\xd5\x82\x18\x02\xf3\x9d\x2b\xc5\xcb\x7a\xed\x91\x2d\x63\x1e\x14\x4a\xfa\x2e\xdd\x3c\x8c\xe2\x6e\x76\xf4\x08\xe3\xe7\xdd\x6e\xfc\xdc\xea\xa3\x8b\x8d\x05\x5d\x07\xe1\x78\x45\x91\x62\xd0\xee\xce\xe4\xa4\xd8\x9d\xd5\xaf\xee\xb5\x55\x4a\xb4\x2b\xc9\xd1\xae\x99\xdc\x51\xb9\x3b\x89\xdc\x47\x65\x49\x3e\x2a\x9b\xc9\xc8\x6b\x56\x23\x07\x10\xf6\x44\x36\xba\xa5\x74\x9e\x2b\x15\xb6\xd1\x8b\x55\x7e\x63\xf6\x0d\xdd\xa7\x9f\x2a\x04\xd4\x4f\x15\xe2\xde\x9b\x31\x48\xda\xc4\x27\x07\x8a\xeb\x7b\x03\x0e\x57\xcd\x49\x26\x25\x84\xf0\x23\x5b\x5f\x28\x7d\xf5\x88\x2d\x2f\x22\xe2\x73\x3f\x3f\xd7\x4e\x73\x91\x7d\x81\xac\xb8\x5c\x95\x1f\x69\x3f\x60\x33\xc8\x00\x44\x26\x8c\x76\xd1\x8b\x89\xcc\x3d\xe4\x8a\x29\x93\xd4\x4d\xcf\xe1\x0d\xc5\xb3\x9f\x54\x70\xdb\x43\x3f\x09\xa5\x22\x91\x7d\x7a\xb6\xe0\xf8\x46\x16\x7a\x77\xa6\x4c\xad\x3a\x33\xe5\x3a\x39\xda\x75\xc5\x55\xd1\x51\xd9\x25\x6b\x80\x6f\x5b\x59\xa6\x08\x78\x74\x1c\x54\x50\x8c\x27\xf6\xda\x88\xc6\x93\xd0\x58\xbf\xf7\x6f\x44\xfb\x1e\x16\x7c\x4e\x1f\x77\xae\xb5\x70\x43\x8b\xa3\x4c\x70\xa5\xc2\x5f\xca\x30\xa5\x27\x12\x8e\x64\xe7\xda\x2a\x7e\x57\xa4\xda\x8a\x38\x06\xa9\x77\x1e\xb5\x94\x04\x4f\x06\xd1\x82\xd0\x20\x14\xed\x96\x72\x67\x63\x05\x57\xb6\xdc\x87\x0a\x8d\x2f\x9a\x4d\xa1\x80\xab\xfe\xf9\x49\x43\x09\x00\x1e\xbd\x09\x50\x34\xbe\xd0\xfd\x0e\xa6\xb0\x52\x59\x36\x05\xfb\x15\x25\xc9\xa4\x51\x4c\xfd\x97\x86\xa1\xbb\xbb\x59\x4c\xc2\xf0\x51\x39\xee\x6e\x27\xee\xee\xd1\x59\xaa\xbb\x00\xd4\x46\x77\x3b\xc9\xee\x1e\x9d\xe1\x8c\x38\xb4\x20\xc6\x31\xd5\xe6\x73\xca\xd3\xa0\x89\x77\x24\xbd\x3e\x70\xb5\x8b\xaf\x39\xab\x65\xb9\x64\xc0\x52\xba\x8a\x80\x93\xd3\x99\xcd\x13\x5e\x8f\xe7\x18\x3f\x0d\xd9\x77\xc4\xfd\xd5\x48\x90\xee\x0e\x92\x9f\x17\x47\x56\x3e\x54\x2b\xaf\x4e\xf9\xb9\x71\xdc\x7d\x57\x54\xaa\x47\xb8\x52\x9d\x49\x24\xae\xda\xed\x4a\x02\x20\x49\x5f\xce\x2b\x1a\x8a\x3c\x03\x56\x24\xfe\x7a\xe3\x4b\x1a\x81\xd1\xc2\xdc\x1f\xb3\xb0\xfc\xcc\xfc\x1a\xc3\xd1\xa6\x41\x01\x35\x0f\x28\xeb\xf9\x32\xb2\x20\x8a\x08\x08\x1a\xfd\x60\x32\x5a\x40\x96\x23\x20\x9e\xa9\xf8\xce\x75\x26\xfe\x57\x27\x85\x1c\xb5\x82\x1d\xe3\x74\x3e\x48\x8b\xa9\x05\xa3\xf5\xc1\x55\xeb\x22\xc3\x85\x82\x88\x7a\xf8\x0f\x31\x0d\x53\xe0\x3e\xb9\xda\xa3\x47\x0e\xc3\x72\x10\xe0\x5d\xae\x19\xd0\x13\x5a\x5e\xea\x8c\x3b\xc9\x8c\x5f\x7d\x95\x11\x9e\xb4\x8d\x19\x74\x35\x67\xf6\x15\xf0\xd0\x6a\x7c\x74\x91\x0a\x55\xdc\xf9\x9c\xd9\x7b\x23\xe7\x6e\x97\x73\xd2\x7c\xfd\x48\x9c\x2c\x4b\x06\xa8\x47\x87\x50\xf8\xb9\xab\x01\xca\x72\xdd\xe3\xa6\x25\x38\x56\xa9\x73\x05\x78\xcd\xd4\x55\xe0\x10\xc9\x75\x29\xdd\x76\xc5\x3c\x25\x3e\x97\xd5\xf4\xf1\xb4\xa9\xd9\xf0\xf2\x38\x71\x7f\x6c\xad\x87\xf4\x83\x76\xee\x6a\x46\x83\x3c\x4e\x15\x7d\xda\xe1\x4f\xc5\x2f\x5d\x83\x12\xc0\xeb\xc4\x97\xf8\x48\x26\x0f\xf0\xb0\xee\x9f\xdb\x19\xec\xd4\xcb\x7f\xf8\x84\x01\x42\x06\x8e\x18\x8a\x5d\x24\xbc\xc2\x56\x7f\x6d\xed\x4a\xb6\x3a\xc0\x0e\x5c\x54\x85\x06\xbc\xc2\xd7\x04\x08\xc1\x3e\xd6\xbc\xb5\x18\xa9\xe2\x12\x76\x62\xa3\x4d\x24\xb0\xcc\xfd\x86\x98\x16\x2b\x4b\x10\xb9\x0f\x1a\x15\xaa\x45\x9c\xf1\xa6\x7e\xd0\x48\xc7\xd2\x07\x41\xe2\x43\xa4\x44\x9b\x70\x2e\x24\x3e\x1c\x29\x17\x9e\x47\x82\x1f\x8e\x97\x8a\xf3\x4f\xb5\x64\xe0\xb8\x6a\x06\xb6\x53\x51\xe1\x6e\x51\x13\x2e\x98\xc9\x51\x74\xdb\x76\xe9\x7e\x5d\xad\x5a\x85\xe1\x6d\xae\x56\xa5\x40\xdd\xf0\x74\x56\x45\x6c\xc8\xce\x52\x4e\xab\xf6\x31\x5d\x14\x4e\xe5\xa2\x70\x8a\xcc\x74\xe2\xc4\xef\xf3\xaf\x2f\xbf\x5f\x3e\xf0\xaf\x57\x73\x0b\x7f\xe2\x69\xd6\x70\xcf\xe0\xa7\xdf\x54\x57\x86\x73\x7d\x8d\x78\x3c\xe2\xcb\xc3\x7e\x47\xa5\x7c\x6f\xab\xa7\xb0\xa6\x9e\x3e\xeb\xb4\x43\x9d\xef\xa8\xa5\x9e\xf6\x4e\xdd\x37\x61\xdb\xeb\xf6\x9b\x6f\x96\x5d\x43\x64\xd0\xb4\xe2\xd1\xf8\x6b\x7b\xdc\x8d\x16\x01\x08\xba\x29\xf3\xf1\xbd\xbd\xb6\x76\x2f\x60\xf7\xbd\x2d\x3a\x46\xcd\x85\x82\x29\x4d\x23\x20\x81\x07\x69\xaf\x66\xf4\x05\x06\xee\xb9\x5f\x4e\x94\x1c\x54\x96\x00\xc0\xec\xe2\x24\x27\xcf\x6c\x95\x7e\x9f\xad\x14\x67\xa8\x17\xf7\x9b\xa5\x33\x29\xd4\x6f\x5a\xce\x19\x2b\xc4\xed\x2d\xd5\xbd\xda\x3b\xc5\xae\x3f\xbd\x5b\x1c\x2d\xcc\x5a\x42\xaa\x5a\xe5\x9b\x84\x47\xb6\x3e\x85\xdd\x1c\xe2\xf9\xa4\x0a\xc0\x67\xd1\xa9\x4d\x30\xfc\x0f\x3b\x46\x25\xd7\x7c\x1f\xa1\xba\xb4\xe8\x16\xab\x9c\xa7\xaf\x80\xe9\xba\x4e\x11\x92\xbf\x67\x82\xf2\x17\x2d\x60\x01\x78\xf2\x39\xe0\x1b\xe2\x1a\xcd\x66\xf9\x5e\xce\x91\x88\xba\x89\x2c\x74\xcc\x65\x3a\x56\x3d\xd7\xa5\x01\x3a\xa5\x74\xc5\xe0\xd1\xd0\x51\x1d\x4a\x2d\x64\x6d\x10\xdd\x16\xfd\x52\x2e\x42\x6b\x62\xef\x9f\x1c\xba\x27\x26\xcc\x46\x6f\xa1\xbc\x59\x4e\x2e\xa8\x1f\xa1\x33\x3f\xd4\xd7\xc0\x07\x64\x41\x79\x4c\xc6\x0b\x1d\xcb\xaa\x71\x95\xa1\xd7\x6c\x7a\xfe\x72\xb0\xf9\xf2\xc1\x64\xf2\xfd\x48\xf2\x90\x2a\x28\xcc\x3f\xbc\xcd\xcf\xe0\x12\xa8\xef\x4a\xa2\xd8\x94\xf3\x4b\x78\xe5\x85\xad\x83\xd6\x4f\x65\xfd\xa8\x14\xfc\xe0\x1a\x7b\x2e\xd7\xd8\xb0\xc8\x91\x5d\x50\x5e\xc8\x88\x15\xb2\x62\x45\xb0\x11\xc3\x62\x5c\x0b\x4a\xf3\x30\xd1\xde\x39\x46\x3e\xe0\x3f\xb8\xf9\x45\xfb\x65\x85\x34\x47\xce\x6f\x49\xcc\x7f\x7e\x4b\x2a\x4c\x9e\xda\xc8\xc4\x58\x4e\xdc\xe1\x4f\x7f\x75\x87\xd7\x18\x56\x54\xc9\x3a\xae\x4f\xb7\x5e\xd9\xa9\xf9\xe9\x9d\x88\x42\x00\x1f\xe0\x97\x2f\x23\xfb\x67\xd0\xf5\x46\x23\x8a\x69\xab\x72\x3d\x42\xae\x36\x6b\xda\xb3\xde\x82\x68\xfc\x7c\x6b\x58\xea\xfe\xa5\x4a\xab\x22\x0f\x77\x78\xac\x36\xbb\x4a\x89\x69\xbf\x23\x9f\xd2\x3d\x18\x94\x15\x05\xd8\x4a\x7d\x69\x53\x15\xa7\xa7\x1a\x41\x0c\xa7\x5e\xfc\xfe\xb9\x6d\x5f\x57\x88\x0d\xa1\x5e\x91\x82\xae\xc6\x5f\xf7\x0f\xec\xdb\xbe\x12\x3c\x00\x92\x93\x5a\x0a\xed\x10\xeb\x90\x6e\xed\x8d\xf1\x6a\x59\xc5\xf7\xa3\x03\x5b\xb2\x3e\x3f\x9f\xa9\x90\xa0\xcd\x04\xf6\x50\x08\x41\x5f\x92\xa1\x19\xfa\xed\xee\x5b\x0a\xc5\x93\x23\x2a\x79\x46\x1d\x0d\x57\x06\x67\xd3\x6e\x8f\x8b\x42\xca\xca\x8a\xe4\x83\xd3\xb7\x6a\xc8\x3d\x70\x6b\x11\xbe\x49\xde\xf3\x4f\xb3\xee\xf9\x6a\xad\x4d\x71\x1a\xcd\xaa\x42\x7f\xee\x55\x87\x78\x9a\x36\x72\x97\xd1\xab\xb2\xa4\x2b\x39\xe3\x61\xc7\x20\x5d\x70\xfa\x7d\xcb\x7e\x69\xec\xb6\xa7\xb5\x28\x0f\x3b\x56\xba\x5d\x84\xa7\xc0\x35\xe1\x26\x74\x0d\x90\x28\xe6\x14\x18\xa6\x7a\xa5\x9c\x75\x01\x18\xaa\x2f\x81\x02\x1c\xfc\xae\xc1\x4c\x7d\x0d\xcd\xaf\xca\x22\x60\x3f\x63\x2c\x86\x62\x68\x0c\x83\x8a\xe2\xfb\xde\x96\x76\xe1\x50\x9a\xe9\x93\xc8\xb2\x63\x58\x51\xd3\x44\x2f\x6e\xbc\x03\x2c\xd5\x26\xf4\x38\xe8\xa6\xf6\x4d\x90\xda\x2d\x96\xea\xac\x9e\x3a\x68\x24\x13\x32\x5f\x2d\x05\xc5\xcf\x6d\xd5\x15\x98\x05\x73\x94\x5f\x90\x05\xbc\xd0\xc0\xe7\xb6\x95\x0d\xa6\xf1\x5a\xb5\xf5\x7a\xc0\xd6\x5b\xb2\x1e\x40\xb2\x30\xc5\x62\x12\xa7\xf2\xa5\x50\xf5\x54\x71\x3d\x1b\x50\x53\xc6\x0a\xa8\x4e\x41\x46\xfb\xf7\xb6\x89\x9d\xb9\x4d\x96\xec\x93\x24\x7f\xea\x34\xcd\x6c\xa2\xbc\xe6\x4d\x1c\x51\xe3\xae\x4c\xf1\xf9\x87\x44\xf2\xd3\x48\x27\x2f\x96\x83\xbe\xa8\xf0\xbd\x83\x5b\xd8\x7d\x3f\x12\xd2\xca\x2f\x59\x45\x60\xe6\x55\x91\xfb\x5b\x2f\x8d\xa0\x17\x10\x51\x0c\x09\x2b\xae\x7b\xb6\xb6\x96\x80\x06\x4a\x97\x3c\xfe\xfe\xf3\xf3\xb9\xc9\xef\xfa\x4d\x76\xd7\x0f\xf3\x9a\x78\x9a\xe2\x77\xbd\xc0\xcb\x3a\x8f\x3d\x2c\x68\x35\x69\x58\x27\x1b\xab\xc0\xca\x0d\xa4\xc4\x7e\x7f\x92\x77\x57\x6a\xa9\xf1\x25\xb9\x26\x74\x43\xdd\xbd\xf7\x78\x11\x93\xd7\x59\x2a\x70\x74\x96\x51\xa0\x7c\xaf\x70\xfa\xe3\x91\x92\xce\xf3\x35\xb5\xf1\xcf\x6f\xdc\xca\x96\x5f\x3b\xe3\xbb\x26\xde\xa3\x8c\x7b\x95\xbe\x5a\xe2\x25\x0a\xa9\x18\xf3\x2a\x56\x4c\xdf\xec\x4a\xfb\xb2\x57\xe0\x7c\x17\x25\x15\x74\xf6\xcc\x75\x6d\x50\xdd\x74\x43\xb3\x8c\xa4\x9d\x1b\xba\x99\x21\x52\xc9\x2e\x1d\x50\x11\xdb\x93\x6c\x6c\xd7\x97\xa0\x1a\x2f\xaa\x0b\x14\xdd\x85\xd6\xa2\xc3\x8d\xaf\x63\x73\xc1\x7e\x23\x77\x73\x7e\xe1\xdb\x3f\x48\xc3\x04\x18\x9b\x16\x69\xa8\x1c\x89\x44\x95\x10\xf0\x6b\x15\xc8\x3c\xdf\x22\xdd\x3a\x05\x3d\xa2\xbf\x21\xaf\x73\x64\x67\x5f\x2e\x92\xbc\x70\xd9\xc8\x50\xb8\x49\xa0\x07\x75\xd3\x38\x4d\xdf\xac\xae\x70\x67\x25\xab\x74\x88\x35\xe8\x25\x22\xeb\x22\x47\x7c\x45\xa1\x8c\xa2\x52\x45\x43\x0e\xf9\x7d\xc3\x12\x76\x0e\x69\x0a\xde\x46\x37\x73\xd6\x1b\x9d\xb3\x9a\xfe\x8a\x57\x3f\x47\xbf\x0f\xf8\x71\x37\x4c\xb8\x74\x05\x8c\x86\xb3\xe0\xa5\x94\x0e\xbe\x32\x9d\x99\xda\x49\xcc\x3d\x3b\xff\x90\x21\xa9\x05\x6a\x2e\xc0\x3f\xa1\xc6\x6f\x91\x74\x9e\xba\x89\xc2\xaa\xdd\x03\x25\x36\xc7\xeb\xdd\xda\xda\xd6\x07\xb4\x19\xeb\xde\xdf\x28\x8b\xdb\x70\x6d\x2d\x84\xf5\xb1\xd1\x8d\x03\x8d\xeb\xa2\x01\x7d\x8f\xb0\xef\x45\x7a\x42\xc5\x66\x8c\xad\xea\x86\xd4\xe9\x86\x22\xf6\xcc\x6e\x63\x88\x05\x00\x29\x34\xf3\xa4\x50\xa2\xda\x6b\xc7\xdf\xd2\x1a\xae\x6d\x80\x51\x3d\x22\x57\xe3\x24\x43\x26\xb1\x51\xd4\x1c\xd0\x56\x3f\x71\x15\x6f\xc2\x55\x5c\x5d\xf5\x3b\x5e\x7c\xd5\xd7\x3c\xdd\xcd\x6d\x3d\x20\x0a\x2b\x2b\x6b\xa3\xc6\x60\x35\x60\x5c\x38\xfd\x2a\xbf\xea\x00\x1c\x5b\x0a\x92\xf5\xb7\x50\xfb\xda\x28\x7c\xbf\xb6\xbb\x68\x2b\xfc\xad\x9a\x43\xa7\xee\x30\x3d\xaa\xee\xef\x8d\xe7\x67\x3d\x55\xfa\xb1\xdf\xb0\xf4\xb4\xad\x74\x9f\x9f\xbb\xf8\x04\x5f\x61\x46\x1a\x2e\x7a\x6e\x87\x69\x26\xd7\x44\x2b\x1b\x99\xf3\x77\x31\x1e\xb6\x7b\xcd\x9c\x9a\x63\xfc\x4f\x94\xd4\x5d\x71\xd9\xff\x19\x4e\xb2\xed\x2d\x3d\x9f\xba\xf3\x78\x39\x80\xab\xbf\xe5\xd5\x1f\x89\x57\xaf\xb4\x9e\xfc\x14\x18\xc5\xdb\x55\xe0\xec\x67\xe0\x8b\x5c\x57\xd1\x94\x9d\xe8\x51\xdd\x98\x03\x6f\x80\x79\x49\x62\xfb\x35\x25\xb1\xad\xc6\xfe\x1e\x62\x03\xbc\x6e\x27\xde\x5c\xd7\xb9\x6a\xd5\xee\x76\x90\xb7\x50\x15\xde\xc2\xe1\xad\xfb\x26\x68\x79\xc3\xf1\x68\xdd\x9f\x8c\xc7\xfd\x1e\x5c\xdb\xf1\x76\xff\xfd\x5a\xdd\xfa\xef\xd5\xc3\xb7\x7f\xd4\x13\xe4\xc9\x60\xbb\x43\x4b\x27\x37\xf8\x2d\xe9\x45\x4d\xbb\xec\x85\x2a\x51\xa0\xaa\x5e\xa1\x3a\x2f\x71\xc5\xc5\xbd\x3f\xbc\x7d\xd1\x3b\xcf\x08\x77\x27\x4e\x07\xcc\x66\xf5\xf1\x86\x15\xb5\x71\x1b\xee\x66\xf0\xb0\x0b\xf7\x80\x14\x4f\x94\xbc\xf9\xfc\x44\x9d\xbd\x5a\xdf\x49\xb6\x79\x2a\x20\xb2\x56\xfb\x00\x44\x99\xbb\xae\xd8\x3f\x7b\x44\xd0\xcd\x69\x2c\x02\xa4\xdf\xaf\x49\xb1\x35\xd4\x37\x95\x7b\xc5\x31\xba\xaf\xd3\x1d\x75\xae\xb6\x43\x31\xcb\x86\xc8\x63\x73\x00\xf6\x3f\xc3\xc5\x48\xaa\x2e\x35\x34\xe0\xfe\x89\x37\x9b\x58\x9d\x7a\x83\xf5\x01\x28\x2c\x8a\x7f\x53\xf4\xf3\x79\xc4\x1e\xe8\x97\x76\x17\xa1\x39\x00\xb2\x00\x76\x02\xd0\xaf\x68\xf0\x19\xd4\xfb\xe1\x8d\xf2\x04\xd9\x70\x37\x5c\x25\xfe\xc0\xd9\x63\xad\x82\x80\x83\x9f\x78\x7b\x16\xe2\x92\xc7\xaa\x8a\x20\xc1\x23\x99\xcf\x7f\x6d\x9c\xf7\xa2\x21\x58\xac\x68\x52\x4d\x7b\xef\xf2\x64\x7c\x80\xa5\xd9\x87\x57\x51\xe4\x46\x21\x8f\x29\xe2\x9e\xc1\xce\x89\x90\xdc\x76\xb5\x1b\xb3\xa8\x68\x30\x69\xe6\xaf\xc8\x9a\xb3\xea\xfe\x04\x58\x70\xbc\x23\x5b\xb6\x85\xb3\xda\xf7\xe6\xf6\x99\x4a\xdf\xd3\xe9\x11\xa6\xaf\xee\x7a\xfc\xe1\xcd\x63\x34\x7a\xa3\xbf\xbd\xb9\x86\xb7\xb9\xed\x55\xe4\xeb\xd5\x61\xfc\xa9\xd6\x87\x2f\xbe\xfa\xf2\x66\xe4\x4d\x23\xa3\xe0\x05\xbe\xce\xed\x40\x7f\x57\x5e\x98\x8c\x3c\xbb\x2a\x69\x5e\x7c\x33\xe9\x85\x51\xa3\xdd\x8b\xc2\x37\x70\x74\x3d\x0e\xa2\x7e\xe3\x75\x84\xfa\xfe\x0b\x3c\x41\x62\x3c\xff\x82\x53\x98\xf8\x0e\x43\x53\x19\x60\x1c\x4b\x72\xc4\x9f\x5f\xaa\x0a\x46\x43\xbf\xbe\xfc\x9e\xa9\x0e\x19\x98\xe6\x52\xd6\xd5\xd4\x0e\x51\x2a\x90\xe1\x0e\x73\x65\xae\x73\x97\xac\xd4\x71\xe5\x5e\x2a\x8d\x07\xcd\x97\xbc\x50\x4f\x57\x9b\xea\xe9\x42\xa7\x85\x77\xec\xe9\x6f\x32\xe5\xdf\x01\xf9\xb7\xa7\x25\x0f\x71\xaa\xb7\x9d\xcd\x6d\x7b\x73\xcb\xd9\x7c\xf7\xce\x7e\xbf\xbd\xb5\xbd\xe5\x6c\xff\x45\x0f\xdb\xce\xbb\x0d\x7a\x78\xe7\x6c\x7f\xa0\x87\x3f\x9d\xed\xbf\xe9\xe1\xbd\xb3\xb9\xb9\x45\x4f\x1f\xe0\x69\x9b\x9e\xfe\x82\x27\xae\xe1\x6f\x78\xfa\x13\x9f\xde\x6d\xc0\xd3\x7b\x7a\xda\x84\x27\xaa\xe4\x1d\xb4\xb4\x49\x0d\xbc\x83\x96\x37\xa9\xbe\x77\xef\x9c\xcd\x2d\x6a\xeb\xdd\x9f\xf0\xb4\x49\x4f\xd0\xc6\x16\xb5\xf1\x0e\xda\xd8\xa2\x36\xde\xfd\xe5\x70\x27\x3f\x6c\x39\xef\xa8\xde\x0f\xdb\xce\x36\x3f\x40\xdf\xa8\xcd\x0f\xef\x9d\x6d\xca\xfc\xe1\x83\xb3\x4d\x99\xff\xfa\x5b\xc6\xb6\xbd\x01\xc5\xfe\x9c\xdb\x11\x0e\xfb\xdb\x00\xc7\x59\xe9\x3f\xf4\x70\x98\xa7\x51\x63\x8c\xa3\x3c\xa7\x80\x44\x30\xca\xbd\xde\x38\x1a\xe2\xcc\xec\x6f\xd2\x58\xf7\xb7\x68\xa0\xfb\xdb\x34\xca\xfd\x77\x34\xc4\xfd\x3f\x69\x7c\xfb\xef\x69\x70\xfb\x1f\x68\x64\xfb\x7f\xd1\xb0\xf6\xff\xa6\x31\xed\x6f\x6e\xd0\x88\xf6\x37\x37\x69\x3c\xfb\x38\xd3\x30\x9a\x37\xdf\xf2\x1b\x1b\x1f\xf6\xdf\xe0\x38\x0e\xfb\x80\x12\x61\x18\x7b\xbd\x10\x07\xf1\xd9\x6b\x46\xd8\xbb\x6d\x7a\xa2\x1e\xc2\x40\x8e\x38\x3a\x2c\xf6\xbf\x51\xf1\x48\x17\x7d\x8f\x75\xd1\xdb\x3d\xa0\xba\x9b\x90\x36\x85\xf7\x72\x47\x43\x08\x20\xf2\xcf\x77\x09\x64\x89\x05\x72\x9b\x1f\x04\xed\x86\x77\x44\xbe\x5d\xdf\x03\xce\xdb\xfc\x2b\x99\x38\xc4\x44\xac\xef\xef\xcd\xe4\x87\xf3\xfb\x1b\x7d\x73\x99\x4c\xd5\x27\x80\x2c\xab\xb8\x6e\x66\xcd\x51\xc5\x80\x99\x3f\xac\xf0\x59\x5e\x52\x59\x37\x3f\x38\x54\x3f\x7c\xfb\x6b\xe1\xdb\x5f\x0e\x35\x81\xed\xae\x28\x1a\x20\xa7\xbe\xfe\xbd\x29\x0e\x7d\x2a\x48\x78\xde\x21\xcf\x11\x73\xc8\xdd\xfe\xce\x26\xe2\xcb\xa6\x86\x6d\x6a\x42\x74\xb2\x7b\xf7\xe4\x09\x21\x76\xd6\x0f\x1d\x0f\x4f\xb9\x30\xcd\x9c\x36\xfc\xda\x76\xb9\x1c\xe2\xe4\xda\x20\x43\x5a\x93\x18\x72\x31\x51\x08\x4e\xce\xc3\x41\xa6\x73\x57\xd4\xb2\xe2\x23\xc7\xf5\x31\x27\xe9\x41\x33\xe1\xfa\x14\x5b\xd4\x4d\xa6\x80\xc2\x37\xb7\x57\xd0\x2b\xff\x16\xcc\x5a\x50\xf2\xb1\x83\xce\x86\xe5\xec\x2d\xcd\x8f\x81\x43\xeb\x1d\x9c\x25\xda\xba\x9f\xe4\x25\x38\x85\xb3\xab\x44\x2f\x58\xfe\xa9\x93\x2c\xa5\x3e\x4b\xf5\x39\x54\x16\xef\xde\xab\xc8\x0d\x94\x85\xca\x62\xd8\x11\x9e\x1e\xd1\x5d\x1d\x6c\x5b\x36\x42\xc5\x7b\x20\x47\x81\xf4\xd8\xda\x7a\xc7\x41\x04\x02\x77\x93\x16\x47\x7c\x46\xe2\xec\xc2\xe5\xa7\x09\xf7\x20\x40\xe4\x47\x61\x04\x48\xbb\xd1\x8e\x86\xc5\xa0\x44\xdd\xfc\x88\x85\x02\x34\x94\x01\x0c\x54\x02\xea\xbc\x02\x4b\x77\xe3\x6c\xfd\x49\xb5\x09\x0d\x0d\x14\xe5\xdf\x96\x83\x2e\xe2\x30\x63\x44\xdd\x00\x32\x17\xb2\x36\x29\xd4\x53\x43\x43\x5b\x51\x2d\x49\xa3\xc8\x9a\x6d\xad\x8a\x07\xc4\xa6\x98\x33\x1e\x0f\x80\x0c\x89\xd2\x6a\x6c\x2f\x9f\xc8\xb0\x75\xc2\x9d\x2c\x1d\xc5\x8b\x0b\xa1\x37\xcf\x9f\xb4\x56\xc1\xbd\xa2\x26\x01\x0f\xc7\x1a\x79\xc2\xf9\xd0\x7a\x6c\x80\x9a\xe3\x8f\x8a\x5b\xf2\xf9\xce\xf6\x4d\x5b\x88\x0b\xb3\x86\x8a\x64\x02\x40\x54\xb9\x10\x2e\xc3\x68\xec\x05\xad\x45\xde\x04\xf4\x2c\xa7\x94\xed\xce\x2f\x2c\x5b\x3d\x5f\x6d\xc6\xcf\x17\x17\xc2\x30\x82\x86\x54\xaf\x54\xd7\x0d\x21\x8f\xe9\x3d\x22\x01\xf1\x0b\xe2\xc2\xcb\x94\xea\x5f\x3c\x37\x06\xdd\x82\xcb\xa1\xe9\xda\x9d\x98\xa0\x0d\x49\xf5\x90\x1e\xcb\x07\x56\xf1\x20\x65\x00\x84\x84\xf4\x2e\xfa\x4a\x17\x82\x6b\x18\x0d\x22\x0f\x1d\x9c\x5e\xe7\xa0\x46\x7b\xc7\x24\xd6\xaf\xc8\x0f\x07\x82\xdf\xf7\x6a\xb1\xd9\xce\x5d\x99\x6e\x80\xdb\x15\x2f\xa9\xf9\x78\x8d\xee\x49\x32\x25\x6e\xde\x3c\xb6\x9f\xc3\xfc\xb7\x78\x54\x30\x29\xef\x9c\xcf\x60\x17\xb7\xa2\xa0\xe3\xf7\x67\xce\x74\xcf\xbe\x8b\x7a\x93\xf6\x38\xba\x73\xfc\x63\xfd\x9c\xf5\x7d\xe8\x85\xed\x3e\x26\xe8\x87\xb1\xe7\x63\xa1\xf1\x30\x8a\xa4\x02\x98\x58\xf7\x4a\xce\xf5\xef\x1d\xb3\x63\x29\x3d\x43\x03\xa9\x68\x9e\x20\xaf\x28\x72\x61\x94\x49\x16\xa0\xbf\xef\xa4\xef\x51\xfc\x51\x35\x2e\x0f\xb1\x69\x60\x52\x48\xe6\x99\xe3\xbf\x2a\xfc\x18\x66\x1a\x45\x63\xa0\x80\x12\x09\x62\x1c\x4f\x51\xf5\x48\x3f\x93\x7f\x2b\x38\x87\xce\xca\x78\x32\x84\xee\x6a\x55\x1b\xf9\xd9\x21\x6a\x27\xa1\xc7\xa7\x5c\x50\x7a\xaa\x3a\xe5\xaa\x45\x21\x7d\xe6\x2f\x99\xd4\xa7\x1d\x05\x70\x08\xce\x36\xb9\x7d\xf0\x67\x39\x9f\xb8\x76\x46\x60\x98\x6b\x2f\xc7\x17\x23\xf2\x0e\x0a\x3d\x3c\xdc\x61\xb7\xb9\x18\xed\xa5\xd4\xbc\x65\x17\xf0\x96\xc3\xce\x43\x1d\xfa\xce\xc0\xce\x63\xd8\x50\x9a\xf9\xa8\xdb\x27\xd1\xaa\xf9\xb9\x89\x6c\x87\x8e\x66\x40\x74\x5d\xa8\x0c\x86\x86\xe3\xf9\x91\xeb\x26\x30\x7d\xf3\xf9\xd9\xc3\xc8\x44\x1d\xfa\x6d\x94\xc2\x67\xae\xa7\xf2\x0f\x7c\xa5\x20\x5b\x4e\x0e\x8d\xbc\xa0\x7e\x37\x22\x67\x5b\x48\x03\xca\xc5\x06\xc3\x93\xb9\x61\x11\xea\xc8\x75\x59\x9d\x2b\x99\xad\xd8\xc1\xab\x36\x45\x76\xa4\x3e\xf7\x90\xf0\xef\x17\x7b\x18\xbc\x4e\xe2\xca\x63\x08\x50\xed\x6c\x8c\x17\x43\xc5\xcb\x85\xf5\x80\xb1\x6e\x7c\x1c\xb0\xdf\x60\xa3\xc8\x00\xb9\x75\xc8\xc8\x00\x2c\x8b\xe5\xa0\x42\x74\xb3\x8a\x16\x9e\xbe\xdd\xd5\xf6\x7d\xcb\x81\xe8\x28\x49\x5f\x78\x85\x56\x4b\xbb\x62\x1c\x3c\x88\xd4\x0e\xe5\x48\x80\xb4\xd9\xab\x2c\xc3\x6a\x8f\x34\xf6\xcf\xc9\x07\x52\x2c\x45\xf4\x6a\x09\x70\x23\xf7\xaf\xdf\xe1\xd6\x6d\xe1\xf9\xf4\x3d\xbc\xc9\x4d\x5b\x62\xc0\x6c\x7b\x74\x4c\x9e\x9e\xb2\x8e\x7f\x2c\x87\xd4\xfa\x03\x3e\xd6\xfe\xfc\x5c\x85\x83\x88\x94\xe5\xe8\x1d\xdd\x66\x53\x3f\xa8\xe6\x01\x7c\x02\x82\x5d\x92\xe0\x5b\x0d\x6a\xfb\x8b\x7c\x2f\xd0\xb7\xbf\x6c\xbf\xd0\x38\xd7\x5f\x36\xdf\xc7\x9f\x80\xe8\xf3\x0b\x3b\x77\xfa\xdb\xfb\x77\xf1\xb7\xf7\xef\xec\x40\xd2\x50\x98\xda\x3a\x4c\x81\x72\x87\xf4\x7b\x7d\xd4\xd5\x86\xe9\x7e\xea\x58\x0b\x96\xe3\xfa\xb4\xf9\x31\x54\xec\x6c\xd2\xa9\x1d\xdf\xb1\x21\xe5\x55\x61\x3a\x5c\xc4\x08\x7a\x61\x70\x16\xb7\xb7\x48\xd4\x8a\x81\x2f\xd0\x39\x41\x69\x8a\xb6\x58\x6b\x6b\x0f\xf8\xe3\x88\x03\x88\x8b\x5e\x96\xbb\x2e\xe2\xb4\xc4\x55\x04\xaa\x0a\xf1\xf3\x0e\xbb\x4c\x3e\xb2\xda\x49\x50\xdf\x7f\x4a\xaa\x70\x05\xba\xb0\x57\x28\xb3\xfe\xbf\x35\xcf\x4d\xbb\x14\xfb\xea\x01\x7f\xac\x15\xe4\x97\x4e\xba\xc4\x10\x9d\x2f\x70\xc9\xb1\x2b\xa4\x04\xed\xd3\x35\x88\x78\xf6\xb4\x84\x7c\x6e\xef\xa6\xa3\xf3\xc5\x1c\x06\x8f\x2d\xa5\x74\xd8\x06\x9a\xba\xe8\x88\xcc\x68\x15\x6f\x1b\xa7\x34\xd2\x1a\x25\xb0\x62\x62\xa0\x4e\xfa\xde\x83\x85\xaa\xbf\x57\x61\x53\x7e\x87\x2b\xf0\xa6\x73\x3f\xf6\xec\xbf\x10\x6f\x6f\xbe\x47\x24\xfe\xfe\x9d\x73\x35\xa6\xd8\xea\xee\xf7\x2a\xe2\x41\xe5\x96\x21\x01\xa9\xc4\xa1\x09\x5d\x38\x47\xea\xc8\x5b\xf0\x51\x91\xc9\x75\xa7\x7b\x64\x28\xe5\x1f\x97\x42\xc7\x27\x26\x56\x55\xc2\xa1\xe1\x86\x18\xa4\x63\x8f\x25\xe2\x60\x5d\x7b\x62\x53\x88\x84\x57\x0b\xe7\x13\xd9\x92\xf0\xde\xc7\x30\x64\xd6\x3d\x4f\x6b\x6c\xdd\x1c\x2e\xf0\x4b\x0c\x97\xf8\x81\xc4\xdd\x65\x3b\x7a\xbf\x5e\x21\xa7\x61\x80\xdf\x61\x3e\x3a\x14\xd6\xec\x07\x05\x88\x76\x56\xba\xf8\xf6\xfc\x1c\xce\xc4\xab\x00\xd9\x67\xff\xc8\x01\x46\x44\x34\x4f\xd1\xde\xae\x00\x52\x32\x0f\x95\x82\x28\xbe\x65\x1e\xb9\x01\xeb\xda\x5f\x74\x33\x0e\xb9\x18\x15\x07\x78\xd4\x28\x16\x30\xa6\x14\x43\x82\x22\x0a\x4b\x17\x92\x47\xbf\xfa\xe1\xbd\x8a\x23\x8e\x9e\x33\x8a\xbe\xf6\xc4\xef\xaf\xad\xfb\x45\x3a\x8a\x14\x44\x90\x13\xc0\x35\xf7\xff\x46\xf3\x40\xa1\x43\x32\xda\xa1\x53\xee\xbe\x6f\x71\xc5\x92\xee\x59\xc9\x33\xce\xf8\xb4\x8a\xfe\x40\x8d\x40\x87\x06\x36\x5b\xad\x26\xe2\xe8\xdd\x14\x7d\x89\xa9\x54\x86\x39\xae\x93\x3e\xdd\x8f\x9c\x19\x82\x1a\xc0\x76\xe5\xaa\x0d\xf0\x38\x69\xe7\x56\x51\x7d\xc7\x62\xeb\xd2\x55\x4c\xf3\x89\x15\x85\x63\x55\xb1\xf6\x2c\x33\xc0\xe2\x15\x0c\x6a\xf1\xb6\xe2\x7f\x7b\x7e\xee\x54\xbc\x0c\xfd\x17\xff\x5b\xdd\xa3\x98\x15\x95\x7f\x16\x8b\xd5\x1a\x9e\x92\x8d\x26\x6a\xb0\xd5\x57\xb7\xdd\x51\x9f\x2d\x24\xc5\x3b\x22\xb8\x84\x4f\x50\xad\xbd\xb9\xa1\x1b\x6b\x20\xb0\x96\x36\x1c\x53\x67\xa7\x63\x92\x63\x6c\x2e\x50\xdc\x07\xe8\x62\xf7\xf9\xff\x99\x79\x1b\xcf\xff\x19\xb1\xe3\x7c\x9b\x15\x47\xfc\x6f\xb8\xff\xfc\xfc\xb0\x6c\x6f\xc1\xcf\x3d\xe0\xc1\x77\xf0\xdb\xbc\xa3\x0d\x99\x9f\xc0\x2f\xec\x49\x3f\xdf\xb9\x43\xcc\x03\x0f\x3d\x78\x78\x8f\x59\x46\x77\x9e\xa9\x45\x1a\xd6\xe2\x90\x15\x86\x47\x07\xed\xf8\x0b\x25\xce\xaf\x91\x43\xf9\xfa\x4d\x9e\x37\xd9\xca\x90\x76\xd5\x42\x56\x71\x0f\xd4\x1f\xea\xc0\xa4\x50\x04\xb7\x5d\x0d\x3d\x03\x18\x6e\xee\xba\xc6\x68\x61\xaa\x88\x32\x2a\xa6\x42\x47\xa0\x76\x76\xf0\x31\x2c\x06\xcc\xb5\x43\x58\x46\xb1\x99\xeb\xd3\xcd\xa7\x56\x82\x4a\x31\x34\x24\xbb\x46\x51\x68\x3e\xc1\xc1\xc3\xca\xee\x90\x56\x9d\xdb\x51\xcd\x35\xe3\x2c\xf6\xcc\xd9\xe6\xce\x14\x49\x5a\x55\xf5\x0c\x75\x27\xd3\x5b\x44\x43\x1f\xc3\x86\x39\x4e\xc0\xb3\x81\xa4\x18\xf3\xf5\x27\x41\x1c\xd9\x3a\xa4\xbd\x06\x9b\x13\xe7\x8a\x30\xb0\x7b\x47\x08\x8f\x65\x47\x14\x77\x21\x2a\xc1\x3f\x2c\xc5\x5e\x43\x7c\x37\x2c\xc1\xd4\x86\x85\x4b\xc0\x31\x21\xf9\x94\x63\x4f\x9d\xfc\x99\xc0\xa9\xa9\x28\x7f\x24\xe8\xc4\xd1\x07\x1f\x27\xd7\xb9\x46\x4d\xec\x7f\x1a\x35\xa6\x9a\x63\x35\xbd\x3e\xd9\xcc\x07\x47\xee\xf6\xdf\xc8\x03\x1f\xb9\x5b\x7f\xa2\x3a\xdf\x57\x36\xb5\x67\x1d\xf0\x2b\xd8\xe4\xda\x26\xa8\xc6\x29\xc7\x35\x56\xea\xdb\x3b\x4d\x79\xb5\x6b\xd6\x94\x32\x16\x1a\x07\xf8\x2b\x00\xb4\xad\xda\xda\x5a\x9f\xaf\x35\x08\xa0\x50\x05\x86\x28\x38\x59\xea\xcc\xa5\x89\x87\xa8\xbe\xc2\x0d\x3f\x2f\xcb\x57\x69\xa8\x9d\x57\x69\xb0\x07\x83\x2a\x3b\x0f\x5d\x1a\xd8\xb4\xc9\xb6\x19\xfe\x6f\xb9\xd6\xa2\x34\x2f\x96\x3d\xdf\x9b\xb7\xbe\x26\xfb\x0f\xa8\xf5\x92\x34\x9d\xce\xdb\x2f\xad\xb6\xd5\xa3\x8d\x12\x5f\x79\xe6\x00\xea\x12\x2d\xaf\xef\x22\x06\x90\x31\xc3\x61\x2b\x74\x23\x11\xbb\x8b\x57\x0b\x80\x26\xe6\xfd\xd4\x7a\x74\xec\x28\x0b\xe8\xfe\xda\x9a\xf6\xd3\x82\x6d\x41\x1f\x94\x05\x3d\xb4\x17\x87\x9b\x93\x45\xb4\x32\x1a\xdc\x14\xaf\xab\x4b\x64\xd8\xcd\xc2\xad\xa9\xce\x40\x12\x83\x1a\x57\xda\xb4\x17\x75\x08\x8e\x6b\x32\xdc\x26\x10\x74\x62\x9f\xc5\x17\xe7\x9c\x9a\x88\x26\xc9\xa0\x3c\xa5\x3e\xf0\xdf\x2b\x37\xbe\xe4\xc3\xa8\x89\xc7\xbf\x5a\x45\x51\x9e\xce\x32\x72\x52\xb9\xc9\x81\xda\x0b\x5e\xca\xd4\x64\x54\xbd\x58\x07\xea\xbf\x99\x86\x08\x45\xb2\xb3\x9b\xfa\x77\x8c\x1e\xf8\x65\xd1\xc8\xa9\x51\xcb\x52\x22\x69\xc2\x05\x22\x96\xef\xf1\xd1\x7e\xb4\xb6\xbe\xa5\x96\x57\xed\x32\xea\x1a\x72\xd6\x7d\xee\x1b\x91\x9f\xc9\x88\x31\x4d\x26\xfd\x92\x94\xc3\xf0\x33\x4a\x08\x89\x87\x9e\xd4\x25\xf1\xed\xb2\x30\x57\xae\xdb\xf8\xee\xd9\x62\x60\x59\xa8\x4c\xf8\x5d\xb9\x2d\x28\xcf\x48\x80\x63\xb8\x84\xae\xa4\xcc\x65\xb1\x4a\x5b\x51\x9f\x3e\x7a\x4a\xb8\x83\xf3\xfa\x08\xe6\xb2\xd0\xe9\x5b\xf4\x72\x80\x2f\x5e\x83\x5f\xbe\x1c\xc2\xcb\xd7\x01\xbf\x1c\xe2\x97\xf1\x19\x79\x1f\x3a\x82\x7b\x63\x1b\xf5\x37\xa9\xfc\x1e\x25\x59\x36\x52\x1e\x9c\xe4\xed\x43\xd2\xf4\x6f\xd2\xe2\x44\xf3\x11\xa3\x11\x7a\xd3\xad\xd0\x9b\x6e\x86\xde\x32\xdb\xe1\x3a\x92\x0d\x51\x9a\x6e\x69\x9e\x56\x83\xa1\x75\x34\x4d\xba\x04\x57\x29\x7f\x61\x0d\x93\x31\x16\xab\xcb\x98\x97\xbf\x26\x5e\xff\x78\x45\x79\xa7\x94\x17\x1a\x28\x67\xd4\xaf\xb0\xe2\x82\x17\xba\x4a\x23\x69\x57\x2a\xa1\x70\xef\xfb\x4a\xf5\x58\x7c\x84\x2c\xd1\x52\x96\x4c\xa8\x91\x9c\xad\x06\xdd\xac\x5f\x3d\x19\xe6\x2b\x0a\x92\x0e\x11\xa8\x88\xe8\x3d\xdc\x59\xdc\x5a\x7d\x41\xa6\xe5\x6e\x36\xfe\x61\xf6\x4c\x91\xe9\x10\xe9\xc9\x19\x90\x07\xca\x9f\x55\x87\x7e\xbf\xc2\x5f\xfb\xa9\xcb\x6c\x9d\x33\xcb\x99\x75\x8d\x23\xfb\x2e\xf4\x64\x6f\xa7\xdc\x8e\xd1\x14\x0e\x1e\x4c\xbd\x46\x63\x4f\x78\xb1\xd0\x1c\x96\x02\x2e\xe9\xbe\x28\x8a\x27\x2e\xaa\xca\xe7\x62\x0d\xf0\xe2\xd2\xc2\x80\x02\x54\xe1\x17\x2d\x62\x32\xee\x77\x2c\xce\x97\x1c\xa4\x7f\x42\xb3\x82\xec\x59\xaf\x74\x7f\xec\x34\x0f\xac\x64\xb8\x7e\xd6\x95\x36\x10\x6d\xa0\x56\x62\x09\x70\x79\x06\x66\x2a\x6a\xe6\x92\xf2\xed\x8b\xcb\xfd\xf5\x21\x0b\x20\x56\x02\xc1\x31\x9b\xbc\xba\xa7\x59\xce\x03\xa8\x5d\x72\x8b\x47\xd3\xc1\xc2\x47\x62\x24\xb8\x6e\xb5\x09\x34\xbb\xe6\x33\xac\xb4\x54\x75\xf6\x0a\x9e\x99\x39\x45\x5a\xd7\x57\x9f\x6e\x62\x47\x2a\xe7\x2d\x7c\x56\x2f\x99\xc3\x11\xc3\xb3\x20\x47\x35\xf1\xac\x27\x51\xbf\x6a\x6a\x8b\x4e\x4c\x95\x7d\x4b\x2d\x51\x27\xeb\xf2\x25\x45\xde\x59\x62\x64\xb0\x13\x60\x58\xf9\xcc\x6a\xdf\x25\xaa\x7d\x27\xd5\x36\xb2\x96\x5e\x55\xfb\x17\x9f\xc1\xfd\xcc\xfa\xfe\x4a\xd4\xf7\x97\xd4\xb7\x73\xf7\x42\x7d\x9b\xef\x99\x8a\x68\x66\x56\xb8\xf9\x3e\x51\x23\xbd\x32\x75\x54\xc9\xcc\xbf\x9d\x9c\xa8\x6d\x35\x53\x3b\x61\x66\xf6\xf7\xc9\x09\x78\xcf\x33\xf0\x79\xf0\x02\x5a\x31\xed\x44\x83\x9a\xe9\x1d\x6d\x65\x25\xe7\x15\xfa\x6b\xa4\x6f\x9f\xe2\x68\x00\x51\x54\x53\x8b\x4e\xe4\x66\x60\xbc\xca\xd9\x8c\x1d\x10\x4a\x47\xeb\x17\xbb\x42\x4b\xf5\x9f\x3d\x26\xc6\xfa\x6b\xff\x37\xe1\xb2\xc5\x5f\xec\x01\x1c\xb7\xd4\x85\xa0\xb9\xe8\x64\x4f\x08\x48\xe2\xf8\xe8\xf6\x57\x92\x04\xe5\x4a\xea\xb3\x9a\x1c\x83\x34\x00\x42\x5c\x3a\x16\x1c\xa9\x9e\x41\xb3\xff\xd7\xbc\x12\xb6\x17\x7b\x36\x1c\xad\x21\xc7\x4a\xfa\x6c\x58\x8f\xb7\x6a\x29\x5d\x16\xc9\x22\x9c\x29\xdf\x22\xd6\x60\x0e\xeb\xf8\x8a\x75\xa0\x01\x22\xe2\x95\x33\xe2\x6a\xc2\x6d\x9d\x82\xfa\x15\x7a\x1d\x54\xb7\x4b\x42\xe6\xca\x80\x0e\x77\x4d\x5f\x19\x58\x69\xbc\x9f\x3a\xcb\xda\x6a\xb3\xa9\x51\xe3\x16\xde\x60\x6f\xc8\x67\xbf\x5b\xeb\xea\x94\xd6\xb4\xad\x77\xa1\x7c\x53\xb8\x21\xb3\x11\xa1\x6c\xef\xe1\xc2\xdf\x36\x3c\x91\x57\xbc\xe4\x1c\x7a\x75\x1f\x45\x81\x83\x2e\x39\x77\xf0\x51\xaa\x79\x05\xe4\xc1\x02\x92\x57\x03\xca\x2d\x19\x91\x4d\xde\xad\x96\xf6\x72\x43\x13\xdf\x53\x26\xbe\x55\x69\x24\xc9\x58\xc9\xcd\xd2\xae\x60\x81\x9e\x93\xda\x44\x7f\x8b\xb6\xe7\xd7\xc1\xbf\xef\x14\x3f\x77\x34\xa6\x1c\xb3\xdf\xc2\x65\x33\xc9\x5c\xd3\xbf\x97\xb6\x13\xd7\x41\x0b\xd8\x4e\x5e\xa6\x62\xec\xa3\xb8\x88\x4d\xb1\x83\x65\x1e\x70\x5b\xa3\x3b\xf9\x7e\xdb\xa7\x98\x1b\x6d\x8d\x39\xd4\x87\x9d\x30\xa7\x0f\x18\x64\x10\x1b\x3e\xf3\x67\xe3\x5c\xab\xa2\xe4\x01\x30\x72\x92\x5b\xb2\x38\xda\xf6\x0b\xc1\x78\xd8\x3d\x41\xc5\x35\x92\x6e\x5f\xf0\xb7\x73\xfe\x36\x6a\xb5\x1b\x63\xfe\x88\x02\x70\xbf\x70\xb1\x05\xe4\xe8\xc5\x56\x82\xe5\xa3\x44\x9f\xc8\xf3\x99\x24\xf4\xbb\x62\x9a\x5a\xb9\xff\xad\x28\x48\x2e\xcf\xb2\x72\xa6\x27\xb7\x98\x5d\x85\xb8\x0d\xb8\x6e\x2f\xbd\x9f\x64\x13\x88\xdf\x6f\x91\xf6\xc9\x09\x84\xd8\x4a\xe3\x0f\xba\x24\x21\x1d\xbe\xdf\x66\xd5\xa8\x55\x24\x93\xab\x29\x3c\x9c\x46\x2d\x83\x89\x13\x3b\xe9\x65\xce\xcf\x9b\x3c\x64\x53\x25\xae\xaa\x19\x25\x86\x51\x2f\x8c\x86\xd1\x50\x17\x40\x41\x23\xae\xe1\x7d\xc5\x43\xf6\x07\x96\x47\xd6\x07\xbc\xde\xb8\x57\xd5\x62\x58\xcb\x05\xf7\xde\x92\x38\xc0\x8d\x9a\x70\xc7\xcd\x90\xa5\x35\x25\xd0\xed\x6f\xbb\xf5\x9b\xf9\x75\xee\xb6\x66\x63\x23\xcd\x36\x3c\x19\x19\x3b\xb5\xe4\x35\xa4\xbf\x8d\x3c\x68\x0a\x94\xa7\xdd\xef\xfb\xe2\x7e\x7f\xc3\x09\x84\xd1\x96\xef\xdf\x79\x6c\x9f\x2d\xde\xf3\xe3\x2f\xb7\xc9\x2f\x5b\xf1\x97\x41\x79\x2e\xf5\xc7\xd1\x25\x83\xf9\x95\x7b\x5b\xcb\x12\x58\x4a\x86\xaf\x0f\xde\x7f\x27\xba\x1c\xaa\x0b\x9f\xc8\x30\x6d\xce\x8e\x51\x63\x6a\xfa\xcc\xb3\x09\xe9\xff\x85\x1c\x52\x7c\x80\x9d\xf9\x5b\xd2\x4d\xc4\x3b\xdf\xfc\x9b\x6c\x19\x23\xcf\xe4\x1d\x79\xad\x0b\xdd\x8e\x46\x3c\x48\x78\xce\xaa\xc4\x1f\xc6\xe8\xac\x00\x8c\xba\x8b\x1c\x3d\x53\x77\x70\x86\x31\x66\x9a\x15\x8b\xac\xcd\x1a\x9f\x63\x44\x05\xcf\x12\xbe\x5f\x77\xf3\x16\xa9\xf4\xaa\x97\xd0\xee\x5c\xb0\xc4\xcc\x62\xfd\x43\xdf\xee\xf4\x89\x5b\x22\xa1\x26\x71\xc5\x8a\x58\x23\xde\x55\x92\x0a\xa3\xe8\x91\xfd\xce\x38\xa1\xd9\x67\x73\x68\x53\x41\x71\xd6\x6c\x02\xe0\xb0\xa2\xfd\x75\x79\x2e\x01\x59\x8c\x47\x02\xf6\xf0\xc2\x56\x82\xfd\x1f\x0b\xc2\x12\x74\xeb\xb6\xb6\x66\x2e\x13\x1b\x3e\x37\x3e\xff\x66\x56\xdd\x8b\xbb\x14\x74\xb3\x8c\x97\xb4\xeb\x25\x8d\xfa\xcf\xeb\x04\xeb\xaf\xba\xb8\xb2\x02\x8b\xd5\x63\x59\x93\xac\x59\x4c\xf3\xc7\x34\x44\xb7\x66\x78\xec\xc2\xe7\x00\xb0\x26\xf3\x39\xb4\x08\x91\xf8\x98\x2b\x2e\xf5\x24\x20\x01\xcb\x2e\x56\xd8\xac\xa0\x79\x90\xf4\x29\x40\xd1\x87\xa7\xfa\x20\xfe\xb0\x7d\xc3\x19\x8e\x95\x98\x67\xb1\x4d\x27\xcf\xbf\x2c\x8d\x5e\x64\xdc\xa7\x22\x67\xe8\x20\x16\x0a\x1e\xe1\x58\x51\x71\x2f\x92\x61\x31\xee\xee\x3d\xb8\x07\x37\xbc\x49\x77\xec\x98\x30\x16\x1d\x99\x51\x07\x32\x78\xfe\xbc\x29\x8d\xfa\x53\x5d\x80\x8a\x55\x85\x9b\xef\xb9\x71\x5f\x25\x6c\x65\x36\x59\xf9\x27\xdd\x64\xa6\xe4\xa7\x7d\x6f\xd2\x80\x3d\x63\x4d\x1a\x35\x03\x88\xc3\xe7\x67\xa8\x15\x39\xc4\x5a\x6c\xb7\x8f\xe0\x80\x21\xc9\x6a\x36\x62\xdc\x2b\xb7\x47\xa8\xa8\xe9\x67\x05\x16\xa3\x12\xb3\x6e\x31\x61\x96\xec\x95\x84\x14\x2d\x77\x73\x7c\xd1\xdb\xcf\x50\xf7\x9a\x75\xf9\x1a\xbf\x40\x1e\xf7\x70\x98\x41\x33\xb9\xd5\x52\xf3\xf6\x97\xa3\x49\x04\xa4\x9b\x0d\xd2\x61\x33\xa1\xbf\x60\xde\x6d\x6f\x61\x94\xb0\xb3\x84\xe7\x8e\x95\x9a\xc8\xfa\xbd\x93\x8b\xcb\x58\x66\x11\x40\x30\xba\x08\x4d\x78\x62\x77\xca\x68\x82\xa6\xbe\x65\x25\x76\x64\xfc\x39\xbe\x32\xfd\x82\x71\xa1\x80\xb2\xcd\x47\xb5\x4b\x9c\x8a\x0c\x8c\xdb\xeb\x32\xed\x48\x0e\x8c\x6f\xef\xf1\x06\x4c\x8f\x1d\x78\xb4\x4a\x67\xce\x53\x37\xa7\x5d\x09\x9f\x59\x36\xf3\x34\x2c\x87\xa6\xb7\xdc\x4d\x18\xb2\xa4\xa8\xc4\x85\x8b\x38\xfb\xdf\x91\xa8\xc6\x85\xb1\x8f\xb1\x87\xe0\x2f\xf3\xf2\x59\x5c\x7a\xdf\x66\x2f\x90\xd0\xa3\xd3\x0e\xec\x65\xf1\x13\x68\x78\x37\xb4\x54\xf8\x9f\x39\x75\xe1\xeb\x20\x15\xb1\x23\x9b\xf4\x20\xb2\x43\x05\xec\xdc\x30\xe9\x8f\xd2\xca\x06\x0f\xe6\xfb\x6d\xaa\xa6\x71\x7f\x29\x93\xf7\x64\x63\x8e\x84\x43\x7b\x29\xe1\xd0\x8b\x09\x07\x02\xfc\x6c\x66\xb3\x1f\x93\xad\xa5\x6f\x0f\x9e\xe3\x6b\x2a\xb5\x74\x09\xaf\xd4\xad\xbd\x71\x96\xed\x7a\xdf\xd8\x8a\xab\x27\xc9\x88\x95\xcf\xcf\x21\x23\x62\x7c\x60\x88\xfe\xec\xbe\xff\xf3\x39\x17\x96\xb6\xb7\x9c\x4d\x20\x01\x61\x5f\xf6\x6b\xf6\xaa\x58\x08\x0c\x6a\xf6\x7d\xad\x78\x5f\x73\x07\x35\xe5\xab\x74\x58\x73\x27\x9d\xe2\x10\x2e\x03\xb9\xf5\xcd\x15\x77\x58\xab\xdf\x03\x42\x7c\xb3\xdf\x1e\x46\x8d\xfe\xec\x0d\xc0\x88\x99\xbc\xeb\xdd\xb5\x7b\x7d\x4c\x4d\xe4\x6e\x7f\x6e\x01\xe9\x96\xce\xdc\xfe\xdc\x0f\xdf\x58\x25\x6c\x6b\xc3\x49\x7e\xf0\xf0\xc3\xfd\xc2\x87\x5d\x20\xf1\xee\x16\xea\xd9\xe9\x85\xc3\x7e\x3b\xc4\x64\x95\x74\xe1\x35\xbc\x61\xfb\x8d\x25\x44\xfb\x08\x08\x3e\x18\xdb\x18\x7e\x60\x7c\x7a\xea\x46\x35\x0e\x96\x38\xd2\x54\xdb\x88\x10\xd4\xe8\x25\x5a\xe9\xba\xb2\x44\xfb\x20\x45\xc7\xfd\xe5\x28\x3c\x40\xea\x02\xa4\x90\xa6\x30\x84\xc2\xc3\x2a\xc8\x91\x90\x77\x23\x02\xbe\x41\x2a\xea\xe8\x7c\x19\x69\x46\xd9\x4d\x50\x15\x91\xd1\x2d\xde\x37\x0a\x3f\xe8\xb6\x23\x67\x72\xfd\xe8\xc6\x40\x5c\xfb\x7c\xb9\x2e\x2a\x72\x4c\xd1\xf2\x03\xd2\x9c\x81\xb2\x7c\x53\x32\x69\xb4\x45\x25\x2f\x6e\x3e\x45\x14\x19\xa8\x12\x9b\x24\x79\xdb\x03\x86\x0d\xf4\x0a\x97\x65\x66\x52\x40\xbf\x7c\xeb\x5f\xb4\xcd\xe7\x44\x5b\x61\xfd\x36\xb2\x94\xee\xb2\x37\x76\x63\x87\xa9\x45\xef\x36\xd5\x59\x8f\x5c\x19\x7c\x1f\xb0\x93\x73\x8f\x3c\x6a\x7d\x3b\xe6\x8b\x66\x67\x92\x49\x5a\xb2\x7a\x94\xa9\xc4\x90\xef\xde\x79\xa6\xf6\x59\xfe\x0e\x88\x70\x0f\xc5\x58\x41\x29\x72\x42\x7b\x65\x25\xe7\xaf\xa1\x62\xad\xa4\x85\x4e\xc4\x69\x5b\xd6\x72\x85\x8a\xd5\x81\x79\xac\x8e\x05\x20\xc7\x35\x1b\x21\x11\x00\x72\x4c\x00\x39\xce\x04\xc8\x45\xb8\x20\xe1\x27\x9e\x58\xc4\x92\x71\xd7\xb7\xfe\x7c\x0f\x8f\x70\x56\x6c\x6f\x51\xb2\xd6\xf1\x10\xa2\x07\x6d\x7c\xde\xd0\xed\xe8\x8d\x93\x41\xdd\x87\xed\x11\xba\x95\x08\x9d\x15\x51\x09\xb3\xc7\xe8\x9d\xc4\x61\xe0\x7a\x7e\x3e\xb3\xe1\xa2\x35\x81\x77\x02\x2f\x78\x9f\xc3\xfa\xe1\x19\x8d\x96\xdb\x4b\x7d\xfa\xbd\xd6\xd6\x8a\xc8\xed\xa1\xc7\xbd\x06\x29\xa1\xa3\xd2\xf4\x75\x45\x39\xb5\x1c\xb2\xc7\x61\xf2\x6f\xf9\xc8\x78\x78\x01\x0a\x7f\x35\x60\x3c\x67\xd8\xe6\xd1\x38\xc3\xa3\xa3\x1c\x7c\x7a\xa4\x18\x93\x96\x8e\xc0\x9f\x49\xe2\x67\x68\xcd\x89\x54\x8a\xd5\xe5\x9a\x24\xaa\x69\x6b\x9e\x7c\x5b\x38\xfc\xed\x45\xbd\x2f\x3d\xf8\xa6\x8e\x5e\x88\x4a\x5d\xed\x6c\x2d\x29\xea\xce\x6e\x90\x42\x05\xac\xf2\xc2\xf4\x04\x46\x0e\x5e\x5b\x7b\x9a\xe5\xd8\x63\x51\x92\x9c\x32\xdb\xeb\x87\x37\x8b\x34\x93\xec\x8a\xe6\x2c\xa7\x06\x8a\x18\xcd\x60\x51\x4d\x34\xe7\x2e\x41\xdf\xa1\x20\x40\xd3\x77\x00\xa9\x13\x45\xd4\x4d\x32\x89\x3a\xf3\xa4\x7c\x08\x97\x92\x6e\x0f\xa1\x52\xcb\x26\x02\x69\xdf\x33\x45\x38\xf3\xd4\x8e\x4f\xd6\xda\xe2\x70\x6a\xb7\x8b\x95\xb6\xbc\x44\xa5\xde\x6d\xba\xd2\xcb\x72\x76\xa1\x05\xac\x20\xdf\xa8\x9a\xce\xc4\x24\x0c\x12\xe2\xb0\x49\x4a\x1c\x66\x0a\xba\x1e\xc2\xc4\x6b\x2b\x23\xe4\xd4\x24\x2d\x76\x65\xe5\x3e\xc5\xac\x59\x14\xa1\x2a\x09\xbc\x82\x48\xad\x84\xfe\xfd\x56\x4c\x74\x7f\xc9\x7c\xe1\xed\x55\x3e\x78\x7e\x36\xec\x38\x39\xb1\x72\x50\x8a\x49\x23\x47\x7f\x26\x6a\x67\x75\xb0\x8c\xda\x99\x64\xb0\x49\xa6\xb5\x58\x46\xf5\x0d\xa6\x17\xd0\xda\x94\x60\x66\xfa\xd2\x39\x2b\xf9\xcd\xc8\x28\x35\x0d\xb7\x21\x85\x33\x29\x21\x75\x80\xd7\xb2\x6c\x42\xef\x25\xce\xc5\x42\xf8\xa1\xb4\x5a\xf5\x4b\x98\x8b\x3d\x91\xfe\x2b\xbd\xe7\x80\x7d\x00\xad\x6c\xc2\x09\x42\x5a\xc9\xa8\xe4\xf8\x23\x17\x25\x02\x7b\xa0\x57\xf6\x52\x88\x44\x8f\xba\x80\x3c\x6c\x28\x4d\x43\x61\x36\xc2\xfd\x4a\x10\x57\x71\xa2\x79\x2f\xb6\x62\x38\xf8\xa9\x53\xfb\x61\x63\x01\xb1\x60\x1b\xf9\x61\xb9\xe4\x15\x4e\x3d\xbc\xdc\x38\x94\x30\xb8\x43\x6d\xf1\xbb\xa3\xdc\xd7\xa6\xa4\x94\xd1\x34\x9b\x92\xce\x5b\x09\xc5\xdf\x49\xcc\x73\xa0\x2b\xbe\xd6\x2b\x92\x5b\x7e\x84\x5c\x8c\x10\x8d\xcf\xa1\x9a\xa2\xf5\x33\x72\x43\xd4\xed\x96\xf0\x9e\x21\x5b\x7e\xb2\xed\x09\xd0\x06\xff\xa0\x3e\x20\x62\xff\x46\xe1\xde\x0d\x6d\x2d\x8a\x6b\x48\xf7\xe0\xaa\x3f\xf5\xd0\xc2\xbb\x81\x6a\x0f\xa1\x32\x41\x0e\x31\x46\xff\xda\x5a\xa5\x9d\xa3\x27\x6b\xc5\x3d\x43\x95\x3b\xbc\xab\x43\x7d\xa1\x1b\xa1\x7d\xfe\xc3\x3f\x59\x6b\xc8\x6a\x55\x59\xa8\x5d\xd4\x02\x58\xe7\x77\xc3\x2e\x77\x58\x95\x10\x9d\x12\xb6\xc3\x68\x9f\xfc\x04\xae\x6c\x24\x04\xb4\xa8\xf1\x8c\x52\x45\xf2\x65\xc1\x78\xf4\xbf\x51\xab\xf4\x7f\x5b\xad\x12\x8e\x9b\xc9\x08\x03\x7c\x7d\x6d\x96\x7c\x5c\x36\xc7\xc7\xa5\xba\x51\x4a\xdb\xa2\x78\x88\xea\x77\xa6\xa6\xa3\x5e\xbd\xd9\x12\x7d\x31\x16\x0b\xa0\xf1\xe9\x94\xd1\x3b\xa7\x74\x7d\xb4\xa6\x3e\x6f\x01\xa6\x9f\x29\x25\xae\x99\xec\xda\x43\x6d\x27\x8d\xea\x4f\xfc\xa4\xf5\xba\xa0\xa0\xe1\xe1\xd9\x0c\x9b\x72\xbd\xc5\xbf\x27\x0d\x36\x71\xec\x6a\x27\x6b\x97\x3d\xd6\xe9\xfa\xd2\x93\x08\x2a\x03\xe5\xfd\xad\x36\x54\x79\x96\x6b\x6d\x1d\x5e\x6b\x75\x97\xff\x5a\x7d\x2b\xa7\x91\xab\xf5\x6b\x4d\xae\xe5\x8a\x5c\x5e\xce\x5a\xd4\xe4\x12\x25\x83\xa5\x71\x22\xb5\x92\xd3\xbf\x53\x2a\xfa\x3d\x9d\xa2\x45\x87\x4a\xc9\xa6\x4d\x95\x22\x51\x0d\x72\xdd\x2f\x4a\x82\x49\xbe\x4d\x33\xbc\x21\xcf\x16\x14\x85\x96\x86\x3b\x9c\x6a\x64\xa5\x51\x59\xca\x1d\x8c\xf4\x44\x2b\x19\xd1\x1d\xa2\xa6\x42\x2b\x47\x91\x76\x12\x6b\xfa\x98\xb1\xc7\xe2\x53\xf5\xea\x4a\x27\xb5\xe5\x14\x9c\x1d\xe8\xa4\xe6\x89\x84\x40\x89\x73\x35\xc5\x81\xeb\x55\xcb\xd3\x69\xbb\x7b\xe2\xda\x8b\xd3\x3c\xd4\xd2\xe1\xfe\x91\x3a\x10\x45\x2c\x42\x5d\x1d\x4a\xbb\x54\x99\xea\x90\x0b\x12\x8f\x46\xa8\xb8\x73\xb4\x27\x0a\x75\x5f\x5b\xea\x3e\x36\x1d\x22\x4f\xe9\xc1\x50\x8d\x32\xd1\xe9\xc3\x52\x15\x25\x3a\xe3\xfd\x12\xeb\x13\x9d\x34\x61\xe7\xb3\xbe\x53\x88\xfa\x4e\xa8\xae\xcf\x64\x28\xea\x4d\xa1\x86\x94\x87\xea\x51\x8e\x28\x05\xe9\xec\xf4\xa6\xf3\x4f\xfd\x74\x81\x05\xa5\x21\x9e\xa7\x46\x6e\x5d\x89\x84\xbb\x2d\x39\x8b\xba\x2d\x92\x88\xa9\x74\xde\xad\xb3\x5a\xda\x8d\x4e\x8a\x28\x9a\xfd\x96\x8e\x90\xde\x86\xa6\x86\xa3\xb4\xca\xbf\x80\x02\x64\x9b\xeb\x30\x42\x57\x57\x4b\x6d\x92\x66\x07\x19\x98\x74\xaa\x2c\x63\x28\x52\x0c\x1e\x48\xeb\x9b\x1f\x59\x49\x94\xf7\x7d\x43\xad\xc2\x63\x4d\x7a\x8b\x86\x4a\x22\xc7\x2d\x4a\x1e\xd7\x2f\x1a\x19\x64\x2a\x90\x55\x2f\x12\x56\x31\x34\xd5\x41\x73\x70\xfe\x82\x15\x57\x3f\x23\x4d\x87\x86\x27\x16\xac\x2c\xce\xe7\x86\x68\x63\xea\xe9\xb5\xe6\x86\x02\x8f\x30\x40\xb1\xc7\xac\x0b\x5a\x45\x33\x9a\x76\xc5\xd6\x49\x48\x69\xe0\x6c\x1c\x5c\x25\x4f\x33\x76\x4e\xaa\x3a\xaa\xe6\x9b\xb0\x6e\xac\x5b\x4a\x37\xe1\xee\x90\xcf\x43\xd8\x0a\x89\x2a\x94\xdf\x19\x2b\x76\x38\x83\x03\x48\xc4\x98\x54\xf5\x2e\x42\x89\xad\x96\x8f\x2b\xff\x96\xaa\xdc\x74\x9e\x4a\xd3\xa2\xb2\x33\xf9\x48\xd7\xf8\x0c\x8c\x35\x6e\xaa\xac\x08\x7f\xc9\xc3\x98\x37\x0c\xe0\x1a\xc3\x7e\x06\xed\x6a\x51\xac\xed\x68\x19\xf6\x15\xee\xdc\x05\x88\x27\x68\x26\xce\x65\x2b\x43\x87\x08\xfd\x2f\xfb\xb1\x1f\x1b\x01\x48\x2b\xd6\x0c\xd7\xeb\xc5\xe0\x44\x84\x0f\x13\x45\x48\x09\x92\x74\x02\xd5\xc3\x55\x41\xd1\xcb\x86\x47\xf4\xff\xa0\x5c\x30\xfb\xae\x4f\x3e\x7b\x7c\xed\xb3\xc7\xb7\x14\x9b\x1a\x48\x72\xe1\x2b\x1d\x8c\x1c\x1f\xa6\x86\x54\xc3\x63\x76\xf3\x97\x43\x48\xfd\x3a\x48\xa5\x1e\x61\xde\x4e\x3f\x95\x7a\x88\xa9\xe3\xb3\x74\xde\x3d\x48\xbd\x3f\xca\x29\xb9\xc3\x24\xcd\x6a\x48\xca\x97\x17\xf0\x04\xe3\x83\x25\xc0\xf0\x0b\xe1\x72\x42\xa4\xcc\xee\xb6\x54\xe8\x44\x8c\xd7\x2a\x07\xfb\xe1\xf5\x6f\x4a\x9d\x17\x6f\x3e\x0c\x25\x7a\xd7\xb2\xf7\x4a\xa5\x0a\x86\x1d\x23\x4d\x30\x7c\xca\x69\x65\x69\x63\x14\x64\xbd\x22\xd9\xd5\xc0\x54\xa1\xf8\x3d\xe7\x25\xa3\xd9\x93\x84\x1f\x59\x18\x64\xb5\x4f\x1a\x00\xf8\x83\x4a\x02\x4a\xcc\xa5\xc5\x10\xec\x2e\x88\xa5\x48\x1f\x1c\x05\x63\x78\x74\x58\x1a\xb6\xd9\x7a\xcb\x0c\x2a\x06\x15\x18\x2b\xb8\xfd\xde\x99\x69\x03\x12\x33\xfd\x4f\xe7\x31\x33\xfd\x2f\xdd\x10\x90\x6b\x2e\xd0\xf9\x4f\x6a\x82\x96\xb7\xf1\x21\x51\x06\xae\x0b\x7c\x9f\x6d\xe5\xac\xd2\x8e\x94\x76\x7e\x5d\xcd\xbb\x8d\x74\xd3\x3b\xbf\x6e\xfa\xef\xe5\x4d\xab\x16\x9d\x57\x2f\xd6\x93\x94\x7f\x01\xa8\xc4\x87\x46\x7c\x5b\x4d\x1e\xc8\x7e\x41\x05\x02\x20\x7f\x88\xf8\x83\x8e\x01\xc8\x0d\x62\xd1\x83\x1d\x4c\x01\x04\xe0\x74\xfa\x39\xe7\xf7\x7a\x70\x43\xf6\x05\x0b\x91\x8d\xe9\x24\x9c\x2e\x72\x98\x32\xc2\x1a\xa3\x36\xd4\xb3\xbb\x55\xe4\xdf\xf7\xef\x44\x25\x87\x29\x09\x7a\x04\x1a\x19\xed\x22\x63\x4e\x97\xe6\x84\x51\x33\x9d\xc7\x34\xe7\x28\x15\x28\xd8\xa0\xc7\x8a\xfe\x47\x75\xfe\x29\x6d\xa0\x46\x3e\x4f\xbb\xe8\xe5\xb8\xae\xa2\x00\x4b\x45\x30\xb2\xbb\x36\x35\x0e\xe2\xa3\x16\x3d\x4d\xac\x88\xdb\x01\xd5\x4a\x09\xdd\xbb\xb6\xe2\x33\x82\xcf\x24\x27\xf8\x98\xee\xc5\xfa\x3a\xda\x22\x6b\x8e\x57\x40\xf7\x6b\x41\x9c\x70\xc7\xec\x28\x44\x6c\x07\x74\x08\x7a\x2e\x8e\x1d\x2f\x81\x49\x9e\x34\x4f\xcd\x86\x95\x88\x9e\x9b\xf4\xf9\x6e\x12\xcd\x5d\xba\x3a\xdf\x1d\xfd\x3e\x69\x8f\xb7\xa4\xff\x9f\x29\xd6\x2a\x0a\xdc\xcb\x10\x43\xa2\xc3\xf6\x40\xab\x9b\x0a\xa1\x59\x8b\x6f\x31\xb6\x3e\x33\xa5\x16\xcb\x96\x06\x59\x4f\x8e\x13\x4b\xbb\xf7\x9e\x83\xae\x05\xad\x7f\xa3\x7b\xfb\x5a\xea\xce\x52\xbc\x95\x4f\x0b\x43\xda\x77\x9a\xfb\xa4\x70\x21\x1e\x36\xe9\x4e\x68\x67\xdf\x1a\x06\xa1\x57\x12\x96\x19\xbd\x38\xcc\xb1\x00\xea\x99\x1c\x6e\x66\x95\xe1\x63\x24\x66\x6d\x50\x39\x8a\xfc\x6a\xab\x23\x4a\x37\xbb\xb9\x7c\xd2\xbc\x78\xba\x16\x0c\x78\x93\xa3\xbf\xde\xa2\x6b\x7b\xca\x08\x47\x4e\xae\xeb\x2d\x63\xbf\x3d\x18\xfb\x4d\xbe\x2a\xee\xa4\xb1\x3c\xe9\x8e\x30\x61\xd7\x48\x53\x65\xbc\xe3\x90\x04\xc0\xc1\xb2\x92\x9d\x03\xb4\xac\xde\x3f\xea\xa0\x93\x6d\x96\xa1\x7e\xac\x8e\xef\x78\xa3\x26\x6e\x25\x8f\xb5\x04\xef\x02\xdb\x42\xf2\x78\x1e\xf3\x11\xd8\x52\xad\x5c\x4b\x88\x92\x63\x45\xcf\x9c\x97\xdf\xb4\xfe\x4f\x80\x02\x01\x3c\xc1\x91\x4d\x17\x57\xbe\xb4\xac\xb7\xbe\xae\x36\xe9\xc6\x27\xaf\x14\xac\x6f\x3a\xde\x1c\xe3\x17\xe9\xb2\x3b\xb5\xdf\x6d\x36\xd1\xdd\xa7\x65\xc5\xb2\x5b\x4c\x95\x2e\x6b\xa6\x49\xe0\x6e\x7c\x0a\x4a\x14\x16\xdb\x83\x43\x1f\x90\x96\xb2\x24\xa6\x61\x16\xd1\xf8\xfd\xf4\x86\x74\x54\xc2\xd8\x72\x30\xc2\x48\x07\x1f\xdd\xb0\x68\x30\xbe\x90\x75\x46\xfe\x71\x90\xcb\xf6\x14\x21\x8f\x0b\xa1\xbe\xb9\x99\x53\x52\xc2\x79\x94\xcf\x27\x2b\x44\xa6\x16\x64\xcd\xe6\x2f\x11\xd9\xa4\x4d\xf7\x7d\x56\x06\x22\xa7\xf2\x9b\x99\x2b\x9f\xd0\x36\xde\x15\xc1\xd3\xae\x96\x84\xee\xd6\xac\xe2\x2e\xc9\xab\x33\x39\x56\xad\x84\x3a\x48\x25\x5b\x58\x10\x3c\x3f\xef\x8a\xb0\x40\x79\x56\x41\xbd\x05\x43\xdd\xb8\x99\xdb\x4a\xbc\xbd\x4b\xbc\x6d\x1b\x1f\xfb\xee\x26\xc6\xf8\x65\x71\x43\x58\xcb\xb5\x96\x0a\xdc\x2b\x19\x2c\xe8\x3d\x19\xdf\x9e\x1e\xdf\x1e\x54\xb3\x47\xe3\xfb\x2d\xe6\x71\xc0\xdc\x16\x2e\xf1\x6b\xce\x2f\xc9\x9d\x88\x57\x5c\xd1\x97\x4a\x5f\xb9\x1f\x46\xe2\x15\x63\x45\xd1\xb9\xdc\x41\xfd\x27\x66\x6a\x12\x63\x37\x6e\xcd\xe0\xe4\x0e\x66\x39\x6a\xd9\x1c\xf1\x5c\xf5\x3f\x73\x7d\x1a\x15\x33\x7e\xb0\x30\xce\x8d\xc5\x61\xc7\x0c\xcf\xcf\x7b\xff\x6f\xd7\x67\x9f\xd7\x67\x9f\x3a\x96\x64\x16\xed\xa7\x99\x45\x59\xee\x80\x23\x0c\xef\x02\xab\xdb\xa8\x2c\x59\xdc\xfd\x9a\xb9\xac\x07\x49\xc9\xc2\xf3\xf3\xc5\x83\x07\xbd\x38\xa8\xd9\x53\x16\x9f\x1e\x90\x9c\xe1\x40\x38\x96\x2f\x32\xf5\x8f\x07\x50\xfe\x00\x3b\xf9\xa3\x95\x52\xff\xc8\x66\x24\x7b\x6a\x81\x4b\xdc\x31\x87\x0a\x3f\xfc\x93\x2a\x3c\x1a\xa5\x80\x45\x8a\x0f\xba\x3a\xf2\xcd\x52\xbe\x70\x54\xc9\xe0\x53\x53\x33\x47\x77\x49\x57\xe8\xcc\xba\x26\x4d\x83\xf0\xc0\xae\xb6\xfe\xd5\x34\x1e\xd6\x14\x85\xaa\x2b\x3d\x6f\x21\xa5\x70\x20\xd0\xa1\x0e\xad\x8b\x1e\x1d\x27\xd7\xb9\xc3\x9a\x3d\xa3\xa9\x3d\x94\xa9\x1d\x1e\x31\xa7\x76\xcf\xf7\x5e\x08\xd5\xc7\xe0\x8f\x62\xb4\x40\xd8\xe1\x89\xd9\x89\xc9\x2c\xca\x33\x1a\xe9\xb3\x49\x5f\xab\x12\x8e\x21\xe3\x1b\x22\xd0\xb0\x01\xf9\x86\x34\xe3\xb9\x3e\x34\x44\x0f\x51\x6e\x6e\x21\xb6\x46\x77\x36\x7c\x32\x6f\x6b\x31\xb9\x83\x16\x25\x19\xb2\xc4\xa9\xc7\x24\x24\x51\x86\xd3\xd4\x82\x52\x8e\xce\xa3\xd2\x1a\x25\xae\x73\xb8\x94\x27\xfb\xd0\x10\xf1\x43\x94\xe1\x52\xe7\xb5\x1e\x11\x29\x7e\xcd\x16\xf5\xba\xea\x37\x8b\x5c\x56\x8a\x14\xbf\x2b\xce\xb2\x62\x22\xf7\xd5\xe1\x8b\x0a\xaa\xe7\x78\x5e\x3d\x3f\x27\x62\xde\x6d\x28\x3f\x3b\x3a\x09\x08\x4f\xbb\xe1\xfa\x76\xd3\xbd\xea\xa2\x6c\x25\x7a\xdd\xee\x8d\xc6\x5e\x2f\xc0\x19\x3d\xe9\xb0\x9f\xaf\xc2\x23\x3a\xeb\x2d\xcc\x28\x92\x4e\x68\x87\x18\x7c\x39\x9f\x8b\xd6\x9b\x90\x04\x6f\xd7\x01\xbc\x35\xe0\xed\xd1\x5a\x6c\x92\x4c\xb7\x2e\x5e\x20\x31\xa1\x9f\xa5\x2b\xc3\xd1\x34\x1b\x9d\x5b\x8b\x04\x35\x9e\x3f\x39\x1f\x40\x32\xed\x96\x5b\x5c\x39\x1b\xe4\x18\x3d\x0c\x8f\x16\xac\x1f\x84\x22\x03\x20\x86\xdc\xac\x84\x16\x90\x12\x5a\x49\xd4\xcf\xe8\xcd\x0e\x48\xfd\x8c\x35\x79\x35\x96\xb6\x52\x2c\x49\x05\x3b\x59\xcd\x48\x21\xec\x2a\x94\x49\x61\x8c\xec\x23\x9e\x27\x60\xcf\x27\xa5\x08\xf6\x82\x43\xe1\x32\x12\xa7\xfd\x22\x9f\xdf\xf4\xf1\x4c\x52\xfb\x62\x60\x04\xc6\x50\x3c\x2a\x51\x1d\x87\x6f\xdf\x61\x8c\x18\x93\xfc\x33\xba\x64\x8b\x49\x18\x94\xee\x1d\x63\x58\x64\xa4\x64\xc2\x22\x90\x26\x16\x0a\x02\xf9\xbc\x82\xf9\x88\x6e\xac\x22\x8d\x26\x11\xa3\x21\x43\x0b\x8f\xfb\x73\xb8\xa0\x66\x57\xc4\x8b\x49\x1a\xb0\x61\x41\xc9\x68\x09\x15\xf0\xf0\xe7\x64\xc3\x4d\x38\x1a\x4c\xf2\x8d\x5a\xe4\x5e\x05\x6e\xea\xcc\x8a\x51\x72\x86\xf8\x18\x7d\xb5\x40\x4c\x53\x3f\x0e\x12\x61\x25\xe8\x66\x6b\x50\xd8\x5a\x0f\x1e\xe7\x2b\x15\x73\x22\xc0\x4d\x41\x1a\xe8\x57\x28\x5c\x86\xe9\xe9\xdf\xe1\x6f\x03\x23\x58\xad\x63\xb0\xe4\x88\xa3\x00\x07\x85\xc7\x75\x8c\x96\x1c\x51\x68\x5e\xf4\x22\xb1\x1a\xde\xac\xfb\xf5\x1f\xc1\x0d\x39\xc8\x3e\x85\xdf\x26\xfc\x1e\x50\xe8\xe9\x28\xcf\x31\x7a\x1b\xe2\x26\xbd\xb1\x9e\xf3\xea\x27\x54\x60\xc7\xbf\xb1\x80\x20\x46\x77\x57\x4d\xc9\x15\x48\xae\x60\x3d\xa4\x2f\x6c\xa1\x02\xb0\x1a\xd9\x4d\xbc\xf7\x8f\x82\x61\xbf\xdb\x45\xa7\x99\xb0\xd0\xb3\xe2\x98\x54\x3e\x30\x2a\xb2\x41\x21\x1c\x09\x7d\x74\xa4\x15\x8f\x8e\x08\xbd\x1f\x09\x7a\xcf\x5a\x43\xad\x39\x14\x56\xf2\x7c\x3a\x98\x02\xf6\xb9\x9d\xb0\x1d\x10\xc2\x66\xf5\x73\x6e\xc1\x52\x80\x67\xd4\x54\x5a\x5b\xea\xc2\xea\x05\x85\xbc\x97\x8d\x08\xd8\x90\xe0\x0a\xda\xcf\x3e\x8c\x39\xf8\x0a\x0c\x24\xa7\xe9\xaf\xfc\xa4\x8c\xd2\xe7\xc5\xf4\x71\xd9\xb2\xbd\x97\x44\x6f\x86\x96\x40\x96\xe9\xc2\x13\xed\x1b\x44\xb5\xf2\xa4\x34\x8c\x91\xcb\xac\xe2\x05\x15\x7a\xb5\x9c\x9f\x40\xc6\xd2\x27\xd1\x8e\x15\x7d\x79\x71\xfa\xa4\x4a\x04\x49\x85\xb5\x71\xd9\x8e\xb3\x5a\x78\x7b\x81\x13\x54\x71\x9b\xd1\x4b\xda\x3c\x10\x23\x09\xb5\x38\x29\x1b\x89\x27\xa4\x48\xeb\x41\x25\xa6\x4a\x6f\xf4\x82\x1c\x2d\x51\x98\xca\x3c\xf8\xc3\xc4\x75\xe1\x49\xb1\xd8\xc8\x09\x40\xcc\x45\xf7\x4b\xb4\x58\x8e\x57\xaf\xc0\x7e\x08\xd9\x4d\x1c\x29\x12\x78\xe4\xb2\xc4\x2f\x05\xa8\x4a\xe0\x40\x22\x2b\x14\x6c\xbb\x80\x96\xb4\x42\x01\xba\x53\xf6\x39\x50\x7b\xa5\x9d\x8b\x2c\xd7\x3d\xb3\x3c\xd6\xdf\x17\x17\x4b\x41\xa1\xd7\x0f\xa3\x4b\x54\x5a\x83\xca\x22\x76\x62\xf3\xff\xa9\xff\x67\x84\x8e\x6c\x6e\xf2\x7f\xd8\x67\x96\x23\xa9\x3a\x71\x15\x53\xe5\x46\xc6\x74\xba\xf0\x24\xdd\xd0\xdc\x41\xc7\xb2\x83\x8e\x6b\xf6\x11\xef\xa0\x63\xda\x41\xc7\xb2\x83\xb2\xe1\xf3\x18\x27\xf1\xda\x98\x44\x81\xd7\x6c\x6d\x37\x41\x39\x9d\xdc\xe7\xc8\x8e\x2a\x90\x82\x21\x6d\xd8\xce\x82\x18\x41\x08\x49\xe4\x27\x8a\xa2\x36\xdc\xd3\xb8\x19\x82\x28\xb2\x79\xad\x18\xa2\xa0\x97\x98\x81\xc7\x77\x39\x6d\x6d\xc1\xbd\xc8\x58\xca\x65\xbb\x85\xf2\xaf\x7e\xd6\xf9\xeb\x84\x8b\xf7\x9e\x6e\x72\xb1\x85\xeb\x19\x00\x93\x75\x43\x15\x45\x8b\x64\x88\x54\x74\x52\xcb\x19\x3e\xd3\x6c\x3f\x19\xab\xb5\x96\xb2\x1d\x0d\xf4\x66\xf4\xf3\x7d\xda\x84\x70\x1f\x3e\xfb\x9c\x7d\x7d\x5b\xdc\xb7\x23\x28\xb2\xda\x5a\x0e\xa3\xcd\x04\x8c\x9e\x6a\xb5\x6a\x3b\x42\xdd\xac\xe4\xb5\xf6\x58\x08\xe3\x30\xbe\x0c\xbd\x7f\x17\x4b\xa8\x1f\x3e\xd3\x8c\xf7\xf9\x26\x6a\xff\x19\x1b\xe2\x1f\xa3\xf6\xab\x64\xea\x78\x86\xeb\xce\x06\x2f\xd2\xe5\x38\xf7\xe7\x06\x54\xb3\x32\x22\xbf\xb9\xe3\x0a\x1c\xf7\x47\x9d\x5c\xb7\x47\xf6\xe8\x94\xf3\x6e\xc7\xd5\x0d\x95\xfb\x9e\x1b\x69\x3a\x1d\x23\xe8\xd5\xec\x09\xc1\xdd\xa9\xc0\x1d\xe6\x46\x7a\xbc\xdf\x12\xc2\x3c\x15\x30\x26\x7d\x2b\xdb\xa9\xa4\x62\xb2\x16\x56\xd7\xd6\xaa\xa2\x86\xc6\xef\x89\x60\x53\xf7\x78\xdf\x90\x28\x35\xab\x19\xb1\x58\x4e\xd3\x4e\x28\xe2\x06\x36\x63\x4f\x22\xab\x42\x2b\x99\x02\xe6\x55\x28\x86\x77\x9a\x54\xdb\xc9\xa8\x9a\xab\x7c\x2c\xaf\xad\x75\xba\x2c\xb9\x4a\x87\xde\x38\xcd\x92\x3f\xaf\x2a\x21\xe2\xea\x82\x87\x8a\xd5\xa4\xde\x5e\xbb\xed\xa9\xf5\x51\xa1\x56\x52\x62\x49\x6a\xc0\x6b\x2c\xa8\x61\xb3\xbd\x6b\x4e\x0f\xcb\xb0\x24\xd5\x1c\x5b\xa3\x1f\x97\x3d\xd7\xb4\x35\xcd\xb2\xa2\x38\x5d\xb0\x72\xd0\xa3\x59\x59\x68\x72\x95\x05\x72\x0b\x26\xb2\x62\x4a\xab\xac\x41\x63\x01\x08\x6a\xe2\x64\x70\x71\x57\x55\xfc\x57\xa6\x34\xb9\x21\xbc\x3d\x89\x64\xd8\x58\xb6\x8c\xfb\x5c\x7c\x0c\x0f\xcc\x98\x9b\x4a\xc4\x16\x57\x4e\xf7\xb1\xe7\xe7\x6c\xe9\x1d\x62\xfa\x2d\x33\xa6\x46\x2c\xf8\x3b\xbc\x59\x71\x2b\x07\xf1\x45\x4e\xc7\x55\xa6\x2f\xe5\x83\x58\xd2\xa6\x41\xcd\x1c\x50\x82\x3e\x5e\x65\xc2\x51\x1d\x70\x3a\x2e\x49\x29\x67\x0c\x92\x84\x8c\xbe\xc2\x9c\xef\x14\x41\xfa\xfc\xbc\xfd\x57\xfc\xb8\xa5\x1f\xb5\xae\xa5\x51\xc9\x06\xae\xbf\x61\x21\xbb\x28\x57\x8d\xe7\xf3\x2e\x43\x56\x8d\xcb\x2c\x13\x18\x67\x34\xa5\xb3\x6a\xed\xee\x76\x12\xd9\x8a\xbc\x17\x66\x29\x02\xfd\xb8\xb1\xd0\xc2\xaa\x94\x03\x6c\xc5\x27\x47\x4e\x5f\x19\x6c\x85\x77\xac\xa4\x93\xba\x55\x36\x9b\xa3\xe5\x3b\xbe\x5b\x76\x05\x59\x25\xf2\x9a\xc4\xa9\x28\x81\x4d\x4c\xac\xbe\x9c\xa9\x1d\x4f\xa4\x51\x6a\x73\x1a\xb9\x92\x08\xc8\x23\xa2\x4c\xba\x0f\xf4\xc2\xa8\x2a\x47\x0b\x6a\x34\xa9\x18\x3e\xc6\xed\xf7\x6e\xa7\x88\xba\x30\x47\x6e\x40\xd7\x28\xe4\x6c\x28\x84\x67\xf6\x81\x6f\xfd\x26\x0d\x9a\xc5\x1e\x38\x6e\x60\x90\xe8\x5f\xf2\x08\x28\xdb\x6f\x33\x0a\x56\x4b\x02\x95\x74\x0f\x71\x94\xd6\xcb\x72\xb6\x81\x2e\x80\xfc\x03\x67\x23\x53\xe4\xc4\x33\x70\x9a\x75\x45\x46\x72\x6b\x45\xdd\xb8\x13\x1b\x3b\x56\x24\xa4\x50\xa0\x29\x61\x0f\x41\xd5\xa9\x97\x46\x4b\x4a\x1f\x31\x05\xa7\xb7\xc1\x22\x40\xb3\x1a\x0c\x7e\x0d\x1f\x96\xee\x85\x57\x29\x5f\x1f\x38\x1a\x6a\x7a\x27\x4c\x5d\xdf\xd4\x36\x37\xf0\x29\x6c\x42\xe5\x4e\x33\x0e\x8b\x8d\x0e\xd7\x54\x76\x38\x1e\x95\x4f\x55\x43\xc4\x06\xc4\xf5\xb4\xdf\x0e\x5f\x6f\xac\xc0\x0d\xae\x17\xcd\xc6\x7b\xdd\xe8\x2e\xea\x8d\x2f\xda\x7e\xb7\xdd\xfb\xff\x72\xf7\xa6\xdd\x69\xec\x4a\xa3\xf0\xf7\xfc\x0a\x27\xaf\x1f\xef\x6e\x23\x08\xe0\x21\x09\xa4\xc3\xf2\x1c\xdb\xb1\x01\x3b\x89\x07\x0e\xe7\x2c\xf5\x40\x83\x19\xcd\x64\xe3\x98\xfb\xdb\xdf\xaa\xd2\xd0\xea\x06\x92\xbd\x9f\x73\x3f\xdd\xb5\x77\x4c\xb7\x5a\x43\x49\x2a\x95\xaa\x4a\xa5\xaa\xb0\xb4\x2c\xb1\xf0\x18\x00\x8f\x85\x7c\xaa\x6d\xab\x09\x39\x7d\xb1\x88\x91\xc5\x28\x9a\x32\xe9\x40\x93\x43\xfc\x20\x35\xc0\xfa\x9b\xf2\x78\xba\xe3\xfc\x34\x34\x1f\xd2\x39\xf9\x8e\xd3\xe8\x26\x13\x81\xc9\xd7\xdb\xe6\x09\xfa\xfe\x7b\x7d\xdd\x06\xa8\x5d\x21\x2c\x6f\x7d\x94\x8f\xa5\x74\xae\xa0\x62\x21\xc5\xf6\x01\x73\xcf\x20\x96\x32\xba\xba\x48\x6e\x79\x5b\x87\xc0\x05\x33\x7a\xec\x9c\x22\x43\x6c\x04\x8c\xad\x5e\xa8\x95\x5c\xbd\x90\xe3\xc5\x54\x05\xeb\xf2\xec\x76\x1d\x3d\x9d\x96\xa1\xa0\x2d\xdc\x05\xae\x6b\x07\x6c\x4c\xe8\xe8\xc4\x9c\xf4\xda\x28\xa5\xd0\x23\xda\xc1\x49\xee\xf5\x0d\x47\x2b\x38\xb2\x6d\x2b\xd2\x64\xcb\x98\x2d\x51\x6c\x33\x65\xa8\x07\x5b\x58\xc4\xb8\x74\xf7\xd0\x10\x39\xca\xbe\xae\x1d\x85\x75\xd1\x38\xcf\xfc\xd4\xf0\xd9\x4f\x59\x45\x0f\xbf\xf1\x92\x4c\xae\x91\xf1\x90\x7a\xb9\x21\x13\x22\xb2\x8f\x79\xbe\x30\x31\x55\x63\x9d\x0e\xfc\xaa\xc2\xaf\xb5\xb8\x5c\x02\x46\x4c\xd2\xa7\x4a\xf1\xf4\xd9\x92\x8f\x46\x28\xcb\xf5\xc8\x10\x72\x5d\x38\xab\xb3\x5a\xae\x85\x06\x99\xec\x3a\xa4\xb0\x80\xc2\x39\x9f\x34\x07\xc0\x71\x97\x95\x64\xa6\x1d\x1e\xbd\xdc\x57\x36\xb6\xf2\xc6\x9c\x04\xa8\x94\x40\xe7\x6a\xf7\x01\xc9\xfe\x47\xa7\xff\x16\xf1\xe7\x91\x07\x95\x01\xfc\x2e\x12\x0d\x8b\xc6\xd0\xad\x89\x82\xa0\x69\x4b\xfe\xaa\x17\xdf\x93\x44\x6f\x1b\xf1\x10\xdd\x26\xda\x32\x0f\x17\xd2\xdb\x6f\x32\xe9\x66\x47\xb8\x4b\x55\x28\x72\xbb\x83\x8e\xad\x65\xfc\x79\x8f\xae\x9a\xa3\xc2\x67\xe0\xe0\xcd\xd0\xfe\x00\x65\x40\x8f\x02\xe3\xe0\x0f\xbe\x5d\x78\xf4\x06\x3f\xf8\x76\x42\x2f\x27\xe8\xa2\x55\xc7\x5b\x82\x25\xa2\x42\xbb\xee\x38\x52\xf5\x80\x2b\xc4\x3c\xf2\xba\xd0\xe2\x85\x3a\xc1\x23\x8c\xf3\xd0\x04\x1f\x90\xcd\x47\x64\xa3\xfb\x37\xe8\x73\xb8\x89\x16\x94\xb7\xcf\x76\x94\xd2\x42\x03\xca\xe7\x13\x23\x25\x3c\x87\x94\x93\x1b\xf3\xb0\x72\x99\x6d\x67\xd1\x72\x35\x36\xdb\x02\x05\xb9\x8a\xca\xc8\x33\x4f\x1d\x92\x6a\x96\xda\x2f\x6a\xb2\x24\x1c\xbc\x2b\x03\x40\x55\xfd\x25\x2a\xff\x5b\x87\x88\x4d\x64\xa9\x5a\xeb\x92\xe4\xfb\xfa\x8a\xb7\xd4\x84\xf1\x8a\x33\xb8\x90\x0a\x7d\x34\x63\x79\x14\xfe\x70\x3d\xa7\x4c\x3e\x4c\x48\x91\xe0\x13\x67\x4f\x16\x86\x9e\x7c\x84\xf5\x4e\x1f\xc4\xe4\x03\x80\x31\xd0\xdc\x05\x77\x22\xa8\xe6\x54\x3c\x56\x9c\x79\x94\x76\x5a\x49\x6b\x45\x41\x93\xe5\x99\x35\xec\xf1\xb1\x05\xa4\x8f\x35\x88\x02\x89\x47\xa2\x40\x73\x3a\xe1\x08\x57\x1e\x03\x7e\x5b\x72\x0c\x78\x49\xe7\x45\x66\xe8\x1e\xb1\xe1\x8f\x50\xad\xbe\x6f\x98\x28\xdf\x59\x97\x97\x32\x82\xcf\xa5\x14\xa4\xa6\x33\x1d\x0c\xbc\xa2\x6d\xdb\x57\xee\xc5\x87\xa3\xda\x59\xfd\x0f\x1b\x3c\xe4\xe1\x75\xc5\x36\x45\x87\xcd\x0a\x69\x90\x3f\x42\x87\xce\x0b\xdc\xc6\xe9\x81\x58\x9a\x73\xe4\x23\x5b\x0f\x18\x6d\x1a\x43\x57\x20\xde\x2c\x63\x4e\xba\x53\x25\x64\x07\x4d\x69\x32\xbe\xc0\x9e\x68\xc7\xa1\xaa\x6e\xe6\xc9\xeb\x52\x87\x52\x7f\x4e\xfa\x80\x95\x11\xa6\xa7\xb3\xc5\xf3\x0a\x25\x56\xeb\x8a\xa8\x8e\x4a\x7b\xa9\xb1\xc4\x74\x66\x40\x20\x53\x58\x64\xa4\x31\x53\xeb\x59\xc0\x97\xb5\x8d\x10\x21\x95\x91\xe0\x0e\x66\x83\x45\xaa\x24\x4b\xeb\x43\x91\x52\xb5\x15\x75\x0b\x6d\x26\xe8\x78\xaf\xb3\x38\x68\x15\x69\x5c\x34\xf4\x49\x95\x0c\x1b\x51\xfc\x80\xc2\x8d\x7a\x55\x54\x20\xca\x73\x89\x84\x00\x7a\xf9\x9b\x5b\x61\x87\xa3\x78\x61\x3c\xec\x3b\x58\x36\x35\x86\xe9\x21\x60\x9f\x73\x11\x96\xe4\xb3\xb8\xd1\x2a\xbf\x73\xf4\xde\x46\x07\x5c\xf8\x64\xb9\x31\x7a\x57\x8e\x29\x34\xbe\x5d\xc6\x0d\xc4\x30\x15\x50\x11\xd6\xcd\xc9\xa5\x35\x7b\xe2\x8a\xaf\x18\x5f\x9a\x9e\x04\x28\x29\xfc\x8f\xa1\xb6\x78\xd9\xa6\xdc\xb0\x60\xca\x97\xec\x1b\x69\x1e\xca\x72\xc1\x0c\xb8\x5a\x26\x71\x95\x43\x39\xa9\x72\xa8\x28\x93\xbd\x03\x65\xa5\x88\x03\x91\x38\xc7\x28\x2f\x1c\x2e\x14\x95\x9e\x1e\x6f\x9c\xaa\x98\xbd\x00\x2f\x67\xaa\x42\xc5\x6c\x05\x9a\x0f\x7d\xea\x58\xd9\x45\x1b\xf5\xf2\x32\x1d\xc1\x20\x8a\x34\xc4\x23\x1b\x75\xd9\xa9\x68\x74\xd4\xbc\xdd\x2e\x91\xbf\x2a\x6d\x29\x26\x17\xa9\x85\xdb\xe7\xd8\x99\xad\x20\x86\x11\x1e\x37\x0f\x85\xb0\xbe\x2a\x92\x2b\x76\x43\x54\x74\x9c\x50\x18\x9e\x92\x31\xa2\xea\xf5\x6a\x11\x8c\x0a\x9f\xc5\x4f\x8e\x85\x2c\xa6\x7b\x2c\x1f\x6a\x77\x6e\x5d\x58\x42\xa9\x4f\xa5\xf1\x45\xc2\x6b\x44\x15\x89\xa9\x1a\x2b\xa0\x3c\x96\xbe\xda\x51\xb8\xd2\x3e\x6c\x12\x17\xd2\x12\xf4\x49\x54\x41\x60\xed\x2d\x5e\x64\x1f\x48\x2e\x4c\xd5\xae\xab\xa5\x54\x14\xa6\xec\xe2\xf5\x65\x84\x31\x0b\x54\xcd\xa8\xbe\x3b\x8d\xcb\x3a\xc9\x06\x88\x48\xba\xcb\x9a\x58\x42\xb4\x14\xb7\x37\x48\x08\xb7\x81\x15\x8d\x07\xce\xbd\x1a\x5e\x3d\xc5\x0f\x47\xc2\xb8\x7a\x19\xc5\xd1\xa3\xaf\x48\x0f\x54\xa2\xa8\xcf\x9b\x85\x6b\xb3\x00\x82\x8e\x06\xab\x60\x89\x9d\x8d\x2b\x31\x46\xd4\x82\xbe\x49\x84\xbf\x72\x4f\x1b\x32\x7b\x80\x37\x82\x5a\x78\x84\x41\x24\x23\x29\x08\x3c\x35\x6f\x73\x95\x22\xed\xf2\x7f\xe3\xb6\x85\xfa\xaf\x29\xad\x40\xcb\x82\x26\x8a\xab\x37\x0f\x63\x1a\xb0\x0a\x2d\xe9\xc6\x09\xfa\x8a\x12\xb3\x81\x25\xe8\xb8\x26\x74\x57\xea\x9a\x28\x2d\x56\xa0\x68\x97\x97\xa4\x7e\xbd\x48\xec\xa5\x4b\xf1\x97\x0b\x2a\x64\xc6\x29\x11\xef\x54\x1d\x12\x56\x7d\xff\x7b\x00\x84\x86\xae\x7f\xff\xc7\xf4\x78\x58\xb9\xb4\x0c\xdf\x59\x34\x24\x9c\x9c\xd2\xba\x25\x97\x28\x55\x01\x4a\x5c\x6a\xc7\x0c\xc2\xd2\x01\x7d\x45\x09\x61\x0e\x43\x6a\x09\xb9\xe6\xac\xc3\xc9\x33\x12\x0d\x3c\xcc\x0d\xd0\x5d\xba\x8b\x08\xe4\xf7\x12\xc5\xb0\xe3\x13\x62\xb4\x2d\xd7\xc1\x9a\xb9\xf2\x38\x5f\xba\x44\x9e\x0d\x3e\x16\x30\xab\x90\xd8\x8e\x4f\x50\x2d\x7f\x7d\x49\xc8\xa4\x21\xbd\x8e\x41\x8a\x70\x48\xbb\x78\xac\x32\x02\xc9\x8e\xd8\xd7\xc7\xa2\x2b\x18\x49\x57\xb2\x8f\x92\x9d\xb4\xc9\x7a\x07\xb8\xe4\x53\x62\xd0\x48\x5a\x14\x76\x50\x62\xd0\x88\xb5\x84\x31\x6e\x3c\x93\x29\xf5\x81\x0f\x3d\x5b\x7a\x57\xdd\xb4\x2d\xe8\x5d\xce\x49\xe0\x74\x99\xfb\x82\xa6\x7a\xe2\xf9\xdb\x33\x67\xb9\x14\x57\x33\x8f\x22\x89\xee\x10\x4d\x28\xcc\x13\xec\x49\x89\x9a\x4a\xcd\xd3\x02\x9a\x16\x2d\x51\x21\x94\x93\x2a\x04\xd2\x84\x44\x9a\x83\x92\xa6\x04\x28\x57\xd3\x0b\x35\x5c\x88\x28\xcf\x1b\xe0\x43\x7b\x2b\xf9\xd0\xf2\x12\x3e\xf4\xfb\xa5\xa1\x15\xfa\xe1\x50\xb4\x5a\x21\x7c\x2a\xa3\xd0\x89\x2b\x4c\x3d\x88\x81\x43\x3b\x96\xf9\x77\xb2\xa9\x7a\x3e\x10\x9b\x6a\x84\x70\x87\x71\x21\x03\xeb\x62\x14\xea\x54\x64\x5c\x70\x51\x25\xce\x19\xbe\x5d\x58\xdf\x26\x78\xbe\xef\x1c\x9c\xa6\x7c\x61\xcf\x8e\xf1\x48\xe9\xdc\x84\x0e\x2d\xc4\xa3\x3e\xe4\x3d\x9f\xf0\x39\xeb\xf6\xd1\x49\x16\x7c\xf8\x79\xc8\x84\x2f\x77\xca\x05\x73\x62\x16\x69\xf9\x85\xc6\x1c\x23\x7b\x63\x50\xbf\xf8\x8d\x83\xa8\xf5\x33\x6c\xfd\x9f\x37\x28\x16\x4e\xb8\x50\x4e\x81\x20\x5b\x15\x81\x52\xf0\x00\x7c\xee\xd3\xea\x0b\x6a\x3d\xbf\x8e\xb2\x8e\x5f\xac\xa0\xd8\x53\xbc\x05\x1c\xcc\xdc\xb6\xd8\x31\xb4\x90\x4c\x3e\x6d\xa2\xa8\xe1\x0b\xb5\x61\x56\x98\x69\xe2\xf9\xa3\xe7\xfc\x6c\x63\x58\xa7\x06\x5a\x41\x38\xb9\x62\x48\x9d\xe9\x5d\x14\xc3\xcc\x41\xdf\xb9\x38\xe0\x20\x07\x36\x80\x97\x0a\xa8\x48\x0f\xed\x65\x36\x36\xde\x36\xf0\x57\x87\x71\x26\x35\x50\xc3\x01\x3e\xb4\x4d\x67\xad\x74\x5d\xb9\x3d\x97\x6e\xd0\x30\x33\x2d\xfa\xb6\x23\x14\x46\x41\x94\x13\x96\xc0\x1b\xcf\x69\xdb\xd4\x5a\xc9\x0a\x33\x1c\x86\x8f\x85\x99\x75\xdf\x81\x8e\x66\x4e\x7c\xc7\x87\x9f\x7b\x40\x70\xbb\x20\xbe\xfa\xe2\x6b\x43\x7c\xf5\xc4\x57\x00\x2e\xac\x75\x28\x9e\xf5\xfc\x8d\x40\xaa\x6e\x9c\xd5\xe2\x68\x49\x57\x8b\x85\x07\xef\x29\x63\xab\x1f\x45\x2f\x73\xe9\x49\xbb\x2a\xc3\xbf\xec\xb8\xa1\x94\x35\x38\x1d\xd5\x91\x44\x8f\xc0\xa9\x19\xef\xac\x01\x83\x2d\x91\x1a\x11\x59\xac\x8e\x40\x3a\x83\xc7\xed\x4b\xd8\x97\x50\x8c\x8d\x40\x59\x73\x09\x44\x86\x31\xe3\xb5\x00\xad\x24\x1a\x19\x9f\x8f\xf9\xa8\x3f\x19\x7a\x01\x83\x8d\x39\x13\x72\x3f\x0c\xc6\x0c\xf6\xd4\xcc\x64\x14\x0c\x07\xc3\xa0\x01\xed\x39\x8d\x5a\xd5\xaf\x33\xd8\x43\x6a\x4f\xcf\xbc\xce\x46\xf0\xf0\x0c\xe2\xd6\xf1\x3e\x57\x8b\xa2\x11\xdd\xaa\xba\x1d\xf1\x42\xc3\xf9\x21\xd7\x7d\x80\x61\x5d\x62\x52\x2e\xaf\x5d\x00\x42\x91\x36\xdc\x9f\x20\x1d\xcd\xdc\x79\xd6\xfd\x1e\x60\xdd\x33\x60\xe8\x49\x1f\xf7\x8e\xd0\x66\xcf\xfd\xf8\xa5\xaa\xc3\xe9\x6f\xaa\xc5\x45\x8b\xab\x37\xcf\x7e\x75\x83\xd1\x88\x87\x41\xe1\xa2\xc7\x53\xa3\xd4\xa0\xc3\x53\x1c\x37\x9d\xd4\x9d\x78\x72\xed\xd4\x11\x64\xec\xd8\xa9\x69\x30\x87\x96\xda\xd8\x56\x6b\x10\x6f\xeb\xf6\xf7\x6d\xa1\xa6\x03\x5b\xdb\x62\x6f\x74\x73\xdf\x7a\xaa\xfa\x75\x6c\x28\x75\x2f\x9a\xf3\xec\x14\xef\x72\x6c\x28\x64\x03\xd6\xb3\x59\x35\xd1\xad\x9f\xe1\xff\x6e\xb0\xfa\xb1\xc1\x9a\x25\x6a\x3d\xfd\x73\x07\x64\xd5\xc7\xd3\xe5\x03\xe4\xd9\x62\x70\x18\xa0\xde\x5d\x8f\x27\xdd\x2d\x69\x0f\xa1\x97\xfd\xb5\xd1\xc4\x6b\xae\x8d\xfb\xfd\x8e\x8b\x64\x53\xfb\x16\xe5\xa3\x02\x7a\x16\xcd\x8c\xfb\xd7\x84\x60\xb8\x27\xcf\xd5\x8d\x94\xe7\x03\x64\x13\x1a\xf6\x5c\xc5\x7d\x7c\x3e\x40\xcd\xd0\xad\x7c\xe9\xc8\x03\x07\xa5\x92\x3d\xc8\x1c\xa0\xc5\x1c\x91\x22\x8c\xcb\x34\x2f\x4a\x1a\xde\x59\xa2\x3f\x53\x45\x70\x73\xd1\x5b\x40\x8d\x6b\xa9\x0b\x3e\x81\xf0\x92\x8e\x45\x4d\xff\x71\x19\xb9\xfe\x12\x84\xb5\x77\x69\xd1\xae\x8b\x65\xd1\x03\xa8\x62\xc7\x7c\x83\x43\x39\x12\xfc\x4c\xc2\x9d\xbd\x94\x10\x80\x71\xc4\x75\x48\xf1\x3e\xb9\xed\xa6\x9c\x5b\x18\x60\x2f\xd5\x69\xd0\x78\xd7\xbc\xfa\xd2\x28\x34\x77\x17\xc2\xf8\xe1\xee\x42\x99\x57\xdf\xc1\xcf\xdd\xc5\xa2\x79\x75\xc2\xa9\x68\x75\xb4\xcc\x37\x47\xf1\x58\xfb\xec\xc4\xc8\x73\x03\xb3\x4d\x51\xe9\x12\x77\x54\x77\x17\x2b\xdd\x51\x91\xc3\x0d\xf2\xbe\x51\x5c\x6f\x01\xeb\xf1\xf3\x32\x32\x82\x06\xc9\xd1\x27\x02\x53\x88\x7d\x42\x15\x83\x70\xc5\x11\x4f\xce\xd9\x22\x6e\xa2\xf0\x39\x74\x35\x80\x8d\x83\xf8\x92\xe9\x11\x13\x7c\x9a\x5f\xfa\xf6\xb5\xf0\x36\x8b\x0f\x17\xcd\xc2\x49\xb8\x08\xfb\x52\x23\xa6\xc9\x91\x69\xaf\x1d\x73\xb1\xe1\x2a\x0d\xe5\xcf\x4b\xba\xb3\x20\x3c\x97\xa2\x7f\x53\xeb\xfa\xc1\x3a\x39\x8c\x4b\x65\xdc\xf9\xa9\x85\xaf\xe2\x01\xe6\xe4\x8c\x03\x34\x42\x5b\x14\x87\xd5\x53\xb0\x7a\x12\x56\xd8\x12\x04\x8c\xcb\xe3\x6d\xa2\x81\x44\x84\x47\x3f\x2f\xe3\xca\x4d\x4f\xaa\x26\xb1\x42\x1d\xbb\xdc\xc3\x38\x4f\x94\x9a\x8b\xa5\xbe\x88\x54\x01\x87\x91\xbe\xd7\x45\x06\x28\xe9\xfa\x57\x06\xea\x5c\x03\x96\x6e\x1c\x14\x44\xf0\x26\x63\xbc\x6e\x8c\xfb\x19\xde\xeb\xeb\x9d\xe0\x4a\x8b\x49\x73\x77\x4f\x0b\x7e\x30\x6f\x2a\x46\xd1\x5b\x34\x5b\xbf\x11\x66\xeb\xd8\x93\x13\x0c\xcc\x74\xf4\x0c\x1f\xb2\xec\xe9\x05\xbf\xb3\xe7\x17\xae\x64\x12\xe7\x46\x2a\x37\xca\xda\xbf\xc5\x32\x1f\xf8\x6f\x55\x00\x9c\xab\x01\x99\x89\x85\x4b\x75\x5e\x57\x03\x25\x5e\x03\x3c\x9c\x29\xa4\x17\x76\x9a\x4a\xf9\x29\x9d\x67\x0f\x84\x20\xba\xdf\x5d\x14\x1c\x0f\x5d\xa9\xfb\x40\x73\x09\x69\x7c\xe3\x2a\x7d\xd9\x31\xb2\xe7\x05\x9d\x28\x9c\x19\x86\x61\x67\xf1\xce\xff\x7d\xa8\x60\x29\xbd\xcd\x15\x84\x97\x82\xa4\xea\xe6\x66\x89\x8b\x22\x2a\xd4\xbc\x8c\xd1\x31\xd2\x73\xcb\x46\xc9\x8b\x8c\x25\x5f\xd0\x61\x16\x3d\xde\xde\xda\x46\xea\xa9\x4c\x15\x31\x58\x54\xea\x57\x99\x3a\x2e\x9b\xa9\x71\x9f\x0c\x2a\x55\x79\x65\xf8\x3e\xc0\x75\x69\xd8\x17\x1b\x0d\xce\x35\x44\xaa\x98\x90\x66\xa2\x17\xa1\xeb\x22\x66\x38\x75\xd5\xc5\x23\xe5\xc8\x10\x9a\x34\xcf\xa7\x27\x2c\xca\x2d\xa6\x24\x71\x1a\x7a\xb3\x78\x1a\x6a\x71\xd3\x0f\x28\xb9\x2e\xa2\x76\xc4\x6d\x35\xe1\xc3\x08\x35\x48\xb7\x89\x0b\xf2\x42\x3f\x64\x70\x61\x30\x35\xad\x7d\x5e\x78\x18\x71\xe3\x84\x95\x22\x7d\xf3\x61\xbd\x76\xe9\xd5\x0d\x55\x83\x4b\xf7\xec\xa4\x9d\x84\x18\x46\x9a\x77\xf9\xa6\xd4\x11\xf6\x32\x7b\x0b\xc3\x17\x94\x1c\xbb\xc8\x2c\x02\x6d\x16\x30\x32\xdb\x4a\x79\xe7\x26\x76\xb5\xe0\x56\x12\x89\x05\x9d\xfb\xa3\xbe\xd0\xd8\x93\xe7\x42\x8f\x52\xd6\x7a\x94\xd1\xa9\xe4\x1b\xda\xb2\x15\x22\x85\xe3\x11\x08\xf5\xe4\x38\xf8\x16\x39\x65\x91\xf6\x6d\xdd\x88\xc4\xbc\xdf\x2e\xf5\xfb\xbc\x70\xf5\x55\x85\x74\x86\xf5\x7d\x2b\x94\xf9\x18\xf3\xfb\x36\x7e\x8f\x46\x6f\x49\x78\x9d\x00\xe3\xbb\x65\xe9\x32\x45\x95\x17\xa5\x11\x89\xe3\x5c\x7d\x45\xba\x92\x13\x01\x5b\x45\x20\x77\xeb\xa9\x4d\x66\x59\xed\x1e\x6a\xb8\x3c\x67\x3b\x0b\x4c\xfc\xdd\xa5\x95\xe6\x99\xa7\x66\x10\x74\x0e\x83\xce\x98\x48\x35\x52\x19\x23\xe9\xd6\x2e\x81\x70\x9d\xcc\x78\x8b\xac\xbd\xb7\x90\x7c\x87\x9e\x8c\x0b\x68\x66\x28\x5c\x1e\x01\x58\x18\x4e\xba\xd5\x61\xb9\x6c\xf6\xb3\x0f\xbb\xd3\x16\xa0\x4e\x36\xfb\x45\x44\xad\x4c\x6f\x41\x25\xe8\x33\x75\x6f\x8f\x3c\x36\xe0\xaf\x83\x7a\x83\xaf\xe5\xab\xd3\xfb\xf2\xe5\xf7\xbd\x6f\xff\xd9\xbb\x3d\xbd\x2e\xb9\x8e\x8f\xb5\x16\x1f\x5b\x8a\x6c\x70\x11\x7f\x74\x0f\x6d\x70\xd3\x2a\x8d\xe9\x8f\xb6\xce\x7a\x2a\xb2\x7a\x98\xd5\x93\x59\x4f\x55\xd6\xd3\x40\x6b\x8d\x8f\x48\xea\x77\x9d\x34\xea\x9d\x84\xf1\xe1\x21\x0a\x47\xf2\x2e\xb2\x81\xa4\x26\xae\xdc\x5d\xc6\x8c\x03\x69\xa0\xa7\x30\xd0\xcf\x6d\x68\x34\xfb\xd6\xe1\xff\xe3\x02\xc1\xe6\xef\xdd\xf9\x1b\x9a\xc5\xb8\x12\xf7\x36\xa1\xc4\x55\x61\xb4\xbf\xad\x47\x58\x92\x38\x6a\xf9\xba\x22\xd6\xb5\x1b\xc5\xba\x86\xc9\x17\xa5\xc5\xd0\x2b\xf1\xfc\x60\x02\xbc\x15\x3d\x35\x46\x30\x41\x77\xd6\xd7\x64\x90\xeb\x7b\xb4\x07\x5d\xc0\x7a\x0c\x77\x77\xff\x64\x70\x1f\xc5\xc9\xb3\xf1\x06\x15\xdd\x0b\x54\xbd\xa7\x0e\x5e\x4f\x96\x6c\xc3\x2a\x72\x7f\x7f\x2e\x73\xdd\x9c\x2e\x10\xf3\xfe\x83\x35\x25\xaf\x1e\x32\xc7\xa2\x89\x11\xe4\x18\x1d\xeb\x0c\xfd\xc5\x73\x23\x71\x67\xd7\x64\x37\xd7\xb1\x4b\xf7\x97\x89\x2e\x4d\x47\xc2\xf5\xfd\xfa\x25\xbb\x87\x3d\x74\x9d\xea\xe3\x7e\xfc\xd8\x4b\x05\xa3\x9b\x8e\x58\x64\xc8\x38\x1d\x89\x68\x74\x0c\x16\x2f\x67\x27\xd2\x93\xcf\x41\x83\xac\x02\x04\x27\x3d\x2f\x4e\xb8\xb5\xbe\xb0\x64\x55\xbc\xb9\xa9\x70\x93\x5e\x59\x55\x7e\xae\xe0\x89\x61\xca\xbd\x2e\x1c\xa3\xb7\x64\xdf\x67\x17\xdb\xae\xfe\x9c\xc5\xe2\x31\xac\x32\x46\x83\x97\xa1\xaa\xf5\xe4\x68\xfc\xc8\x39\x59\x18\x0c\x5e\x66\xeb\x30\x18\x6f\x78\x19\x5b\x07\x79\x6e\x96\xd4\xde\x2a\x0e\x61\x8a\x07\x85\x31\x2b\x35\x10\xbe\xd5\xc7\xbe\xad\x2b\x95\xde\x8a\x4e\x95\x03\x08\xb5\xf3\x5e\x4f\x2c\x3b\x2a\xae\xa6\x76\x78\x8a\x17\xef\x55\x2d\x92\x8c\x43\xfa\xb7\x99\x0e\x30\x65\x7e\x7e\xcb\x35\x56\x4e\x5b\x28\xf2\xc4\xb0\x52\x5f\xf0\x2b\x2e\x19\x39\x8f\x0e\x2a\xe9\x92\x7f\xa6\x8f\xde\xc7\x2a\x2f\x84\x36\x31\xd3\xc2\x81\x45\x03\x11\x1b\xef\x25\x75\xc1\xda\x47\xde\x11\xeb\x71\xc9\xd6\x82\xea\xd1\x0b\x47\x01\x25\x40\x54\x5d\x3a\x3a\x53\x76\x31\xcf\x34\x7f\x62\xc8\x01\x0b\x16\x50\xfe\x47\x2e\x95\xd2\xb3\x64\x8c\x3e\x90\x99\x58\xd5\x2a\x44\x8f\x1c\x73\x68\xe3\xe4\x58\x26\x62\x1b\xb1\x28\x3d\x65\xed\xb0\x13\x3f\x77\x47\x8a\x40\x9c\x4e\xd1\x9a\x21\x2b\x5e\x9a\x81\xa2\x16\xd5\x91\x23\xa5\xc5\xbb\x73\x89\xa2\x77\x96\x5b\x66\x13\x3a\x6a\x76\xcb\x82\xb9\x6c\x79\x14\xfd\x32\x86\xb4\x6e\x79\x49\xf0\x7e\xb2\x47\x89\x9d\x28\x76\x47\x71\x3f\x93\xc1\xbc\x78\xce\x97\x44\x4a\x93\x45\x29\x13\x34\x77\x23\x89\x25\xc8\x63\x8a\x31\x96\xdd\x20\x7f\xeb\x89\xb0\x49\x82\x19\x21\x63\xd3\x5b\x59\xb0\xe5\x45\x95\x65\x49\xdf\x7f\xff\x7d\xc1\xe8\xd4\x68\xf3\xee\x5c\xd8\x01\x2c\x0d\x74\xa5\x7c\xbf\xb4\x3c\xba\xd9\x71\xbe\x30\x93\x34\x40\xb2\xbf\x12\xb9\xbb\x23\x35\x36\xd0\x69\x3a\xb0\x05\xde\xa2\x8c\x31\x56\xfd\x72\x22\x44\x68\x50\x16\x82\x12\x79\xb6\x54\xc3\xe5\x95\x41\xd8\x2e\x7a\x6d\xcb\x2b\x23\x93\x56\xc6\x7f\xd2\xde\x47\x17\x3c\x85\xfd\x02\x24\xed\x32\x10\x30\xac\x14\xb6\x35\x98\x7f\x03\xb6\x33\xfc\x3e\x67\xf9\xac\xad\x6c\x94\xfd\x32\x4a\x89\x64\xaf\xc9\xc9\x94\x28\xaa\x8c\x32\x4b\xa6\x19\xd1\xae\x08\xc2\x9c\x57\x8e\x2d\x86\x73\xba\x1f\x42\x8b\x40\x00\x06\x4c\x07\x35\x61\x84\x3b\x2d\x47\x3b\x98\x49\x9a\x51\xe2\x6a\x0b\x67\x36\x6f\xdb\xf1\xa8\xb8\xd7\x63\x3e\x1c\xaf\xf1\x9e\xbf\x16\xc0\xbf\x01\x1f\xf2\x2e\x0c\xc0\x70\xb4\xd6\x9d\x8c\xc6\x6b\x6e\xb0\xc6\x87\x43\x3e\x1b\xbd\x13\x6a\x39\x58\x1f\x68\x3b\x06\x34\x6a\x55\x05\xfd\x56\x6f\x1c\x15\x1e\x37\x83\xb5\x11\x06\xe5\xed\x04\xbd\x70\xdc\x7c\xa7\xcc\x8a\x5a\x5a\xb3\x3d\x54\x91\x62\xfd\xc9\x90\x63\x27\xf4\x56\x0a\x6b\xd6\x2f\x1e\xcb\xa5\x58\xab\xcb\xa2\xcd\x99\x43\x42\x5a\x58\xa6\x0d\xe6\xc6\x09\xe5\x32\x19\x2e\xf1\xd1\x0a\x99\x85\x7b\x8f\x1e\x60\x08\x70\xb6\xcb\x48\xef\x22\x81\xc5\xdc\x4c\x35\x2c\xe1\xfd\x2d\x9d\x05\x14\x12\xe3\x2c\xe7\x4e\x51\x4f\x1e\x27\xbb\x2a\x99\xb0\x7f\xf0\x52\x27\x8e\xa9\xd6\xda\xab\x6f\xca\x66\x23\x4a\xab\xb2\xa4\x54\x16\xa5\x05\xea\xc9\xa3\x6b\x22\xfd\x7f\x8b\xbe\x6b\x72\x2d\x45\x87\x96\x84\x95\x22\x14\x7b\x88\xbd\x80\xec\x6e\xdd\x11\xa9\x84\x51\xc5\x73\xc3\x3f\x45\x8c\x70\xc7\x49\x87\xee\xb7\x26\xca\xfa\x88\x18\xc6\x10\x4d\x8c\x55\x3d\xba\x83\xab\xe8\x74\x82\xbe\xe9\x19\x91\xfe\x49\x70\xe9\x45\x97\xcb\x1f\xac\x87\x31\x40\x16\x96\x13\xbb\x71\xa4\x8d\x38\x57\xc7\x20\x1c\x21\xb1\xdc\x34\xc7\xd1\xb4\xdf\x03\xff\x0d\x58\xfa\xbd\xd5\x0d\x64\x4a\x31\xf7\xd9\xc1\x3c\x74\x98\x16\x01\x8d\x0e\x1d\x10\xdc\x9c\x43\x5f\xd1\x47\x0d\xee\x00\x44\x2b\xe0\x93\xdc\x04\xb8\xd8\x01\x0a\x9c\xf0\x01\x45\xdb\x30\x6b\x2e\xea\x6f\x3a\xb0\x17\x32\xfe\x80\xd0\x2a\xb2\x3f\x3c\x92\x77\xd6\x63\xbc\x7d\x17\xe2\xd9\xda\x7a\x0b\x17\x55\x2c\xbc\x74\xd1\xfb\x2c\xd3\x29\xba\x34\xaf\x4d\xf6\xea\xe8\x4e\x08\x01\x45\xbf\x42\x69\xfa\xea\xd5\xed\x4d\x37\x25\x1f\xe7\x37\x00\xc1\x32\xe6\xee\xeb\xa3\xb0\xee\x5e\xc5\xd9\x21\xf5\xba\xd0\xb1\xce\xe2\x96\x71\xaa\x13\xcf\x63\x53\x8c\x55\xeb\xc3\x45\xb0\x94\x56\xd2\xa1\x37\xbc\x87\x44\xef\x33\xf9\x9e\x93\xef\x2f\xf2\x3d\x5f\x4f\x2c\x79\x17\x51\x5c\x61\x38\x6c\xf9\x93\x5e\xf1\x72\x20\xeb\x87\x55\x09\xcb\x1d\xa0\x60\xcf\x26\x47\xdd\x2c\x9b\x06\x2c\x40\x04\x34\xbb\x2e\xd3\x94\x51\xa5\x30\xe0\x6a\x96\x59\x58\x46\x72\xd1\x94\xe4\xe2\x72\x26\xbc\x6d\x37\x63\x46\x5b\x9e\xe4\x4c\x07\x8f\x9a\x2f\x1d\x3c\x3a\xb7\x42\x26\xad\xcd\xf6\xea\x09\x3b\xf7\xc1\x23\xf9\xd4\x58\x1c\xf3\xcb\x19\x2c\xa3\x26\x22\x68\x98\x8d\xb9\x43\x5c\xc2\x7c\x47\x79\x6f\x9e\xe3\x79\x17\x59\x79\x23\xef\xe9\x32\x3e\xb4\x15\x1b\x16\x20\x57\x79\x41\xaf\x5f\x5f\xe1\xc1\x33\x09\xf7\x1e\x1e\x18\xc0\x68\x60\x34\x7c\x31\x4e\xc3\x70\x82\x96\xcb\xc4\x85\xb4\xca\xac\x09\xe3\xd5\x22\xf6\xe9\x72\xb6\x42\x43\xdd\x9c\x49\x62\x43\x6e\xb7\xca\xa3\x02\x6f\x16\xd5\x48\xa1\xe3\x50\x5e\x77\x9a\xb5\x23\x51\xbf\xc4\x0c\x3b\xf5\xc3\xcc\x42\xa6\x9d\xf1\x3c\x39\xcc\x63\x2e\xe6\x87\xff\x4b\x7d\x7a\x10\x7d\x7a\x58\xd2\xa7\x01\xb7\x0c\xa0\xd8\x12\xa0\x61\x47\xfe\x5d\x1e\x02\xda\x9c\x88\x76\x0c\xe8\x66\xd9\xd0\x44\x03\xb5\x65\x18\x25\x1e\xbf\x00\x58\x6d\x01\x56\xfb\x7f\x07\x96\xd1\x64\xe7\x6f\x37\xd9\x11\x4d\x76\x96\x34\xf9\xdb\x5e\x2e\x34\xd9\x2d\xc7\xe5\x5a\xa8\xbb\x5b\x96\xa6\x92\x5d\xb9\xd2\x9e\x7c\xe2\x5f\x6f\x44\x70\xf7\x17\xa0\xb1\x59\x7c\x68\x74\xe9\x7d\xf4\xe0\xe0\x3d\xb4\xfb\xb6\xb8\x8f\x76\x3a\x93\xf7\xd2\x12\xfe\x21\x9d\x5e\x39\x6e\x0e\xf4\xe4\x93\xb5\x8b\x25\x5f\x1c\x2e\x6e\x1d\x37\xba\x5f\x04\xa9\xe9\x95\xe4\x6f\x5a\xa6\x17\xb8\xf0\x88\x74\xd3\x2f\xc9\xdf\x82\x54\x55\xdc\xb7\xe5\xa6\x7a\x3a\x33\xdc\x61\x09\x75\xd8\x0a\x17\xf6\x0a\x1a\xd9\xba\xd8\xc1\x7e\x5e\xff\x01\xe6\x46\xd7\x80\x19\xfb\xff\x85\x97\xb2\x05\x59\x47\x8a\x2f\x87\xfc\xc9\xff\x3b\x70\xde\x64\x2e\x56\x84\xfd\x81\x86\xcc\xf8\x49\x72\x63\x1d\x3d\x00\x53\x4f\x93\xcb\xdf\xcb\x04\x7b\x53\x3e\x90\x12\xf0\x65\xbc\xd4\xc8\xe9\xa6\xff\xd6\x89\xdb\x39\xdd\xb7\x8b\xf2\x17\xef\x13\xcb\x4c\x18\x93\x3d\x39\x21\x46\xc7\x63\x1d\xbc\xe9\x03\xe3\xf4\x45\xf6\x35\x8a\x49\xc2\x75\x6a\xac\xa8\x14\xc3\x7e\x3c\x5a\xea\xda\x1c\xe5\xb5\x8b\x96\x82\xc2\xb5\x57\x0c\x93\x88\xae\xd4\x58\x22\x62\xc4\xa6\x13\xe0\x21\x17\xa5\x8f\xab\x67\x53\x8d\xc6\x4b\xef\x6f\x8c\xc6\x0b\x9a\x71\x48\xe4\x83\x69\x96\x1d\x31\x3a\xaa\x30\xd4\x2e\x6a\x14\x5d\xec\xf0\xcb\xd8\xec\xb0\xac\xd8\x36\x8a\x44\x15\xaf\x1e\xe6\xbf\x35\x46\x68\xd3\xff\xc7\x41\x82\xb6\xe9\xde\xc3\xd9\x2a\xa3\x2c\x44\x23\x58\xfb\xd7\x8b\x4c\xf9\xe8\xc1\x58\x05\xb0\xfc\xb9\xd2\xab\xdf\xb7\x59\x34\x76\x7a\x9a\xe9\xb7\xd7\xd0\x92\xf8\xcf\x6b\x91\x74\xd1\xd1\x49\x72\x40\x84\xe5\x23\xd3\x9d\xe4\xab\x3a\x69\x52\xb0\x5e\x39\xa6\x66\x54\xe6\x55\xb0\x3e\x5c\xe0\xeb\x60\x58\x69\x91\x20\x07\x89\x23\xf8\x9e\xd3\x42\xe1\xd4\x3d\x5d\x47\x5f\xd5\x71\xb1\x60\xb5\x78\xc6\xcd\x6b\xbd\x97\x01\xc9\x89\xdd\xb2\x78\xdd\xef\x72\xd4\x0b\xcc\x1e\x8a\x4a\x61\x7d\x19\xb0\x07\xe9\x76\xfa\xbb\x67\x68\xae\xee\xac\x7e\x59\x3a\x5c\xef\x4b\xb2\xda\x71\x9d\xef\x21\xfc\xf6\xae\x04\xc5\xbc\x68\x2b\x3f\xe9\x48\x61\xf1\x26\xdf\x35\x11\xd8\xe1\x27\xe1\x8b\xe7\xb9\x4c\xaf\xdf\x20\x5b\xee\x68\xab\x18\xb9\x60\x3f\xee\x88\x72\x31\x5f\xe4\xfd\xb2\x19\x4d\x28\x76\xc9\x76\xc1\x15\x16\xfd\x76\x5c\xad\xee\x55\x2e\x6d\x12\x36\xbb\x54\x65\xdc\x66\x77\x76\x61\xdc\xf8\x4e\x54\x33\x6d\x27\x5c\x6c\x90\x4b\xa8\x09\xc8\x0d\x97\x91\x61\xf0\xc2\x99\x14\x35\x12\x73\x42\x8e\xc5\xf7\x3a\x34\xee\x87\xd2\xa5\xfb\x81\xba\xa8\x7d\x3c\x88\xa5\xdf\xb4\x74\x7e\x10\x27\x45\xda\x71\x47\xe7\x5d\x4c\x83\x7c\xc7\xcf\x8e\xfa\x0c\x8f\xc0\x52\xd2\x5b\xc2\x87\x3c\x19\xf3\x95\xcd\xbb\xd4\xbe\x1b\x1d\x4a\xc1\xeb\xa0\xbc\x28\xc3\x94\xb5\xe9\x3f\x8a\x1f\xda\xd0\x70\xaf\xc3\x8e\xf0\xfe\xc9\x71\x45\xbc\x1f\x0f\xe2\xef\xf0\xbd\xb6\x77\xc6\x46\xc7\xe8\xb9\xe1\x7c\xa2\x33\x2d\x26\x1e\x36\x84\xe3\xef\x4a\x37\x11\xc2\xe6\x6b\x25\x4a\x38\x91\x09\xf0\x77\xf8\x69\x63\xa3\x72\x28\xef\x35\xda\x05\x05\x14\xb9\x11\x37\xa1\xa2\x04\x13\x2c\x95\x23\x0e\x82\xca\xb6\x24\xd5\x84\x8c\x12\x62\xa0\xe9\x94\xe5\xb0\xe5\xec\x45\x3f\xe6\x84\x16\xe6\xbd\xf3\x69\x4b\x22\x1c\x80\x25\xe7\x4f\xb9\x1d\x97\x97\x0c\xba\x12\xbd\x2a\x4b\x2d\x16\x7a\xff\x91\x1b\xe9\x5e\xa7\x24\x71\xaa\x20\x71\x88\x49\x05\x86\x70\x65\x5b\x32\x2e\xcf\x19\x6e\x5e\x3c\xc7\xf2\x80\xa4\x00\xf7\x6b\xbf\xf7\x36\x23\x22\x27\x68\x75\x1f\xc9\x5d\x2a\x7a\x34\x83\x07\x46\xae\x5f\x30\x94\x65\xed\xa4\xfe\x37\xca\x17\xbd\x04\xc8\xc2\x57\x8c\xf4\x14\xc3\xa2\x8c\x4c\xd3\xd1\x54\x44\x64\x0b\x8b\xb9\x25\xa9\x8d\x68\x73\xf1\xb1\xac\xc5\x2f\x11\xf8\x62\xb2\x6c\xdc\xe8\x08\x6d\xef\x0c\x4d\x11\x34\xfa\x3f\x3e\x92\x71\x06\x24\x89\x93\xcb\x9f\xb3\x3a\x1b\x8a\x34\x1e\x07\xbb\x28\xcf\xb6\x85\xc8\x7a\x6c\x9c\x5d\xf2\x52\x37\x2c\xcc\x42\xf2\x05\xaa\xd2\x8e\xc3\x58\x86\x71\x58\xd8\x0b\xe5\x09\x67\x65\x99\x3d\x3c\x10\xc3\x25\xfe\x97\xb7\x76\x0b\x43\x73\xe3\x13\xe3\x19\xf7\xa7\x1c\xcb\xd0\x5b\xc8\xb0\x55\x18\x99\x19\x06\xbd\xf8\xe7\x6d\xfd\x39\xbd\xf4\xfb\x87\x82\x71\x51\xf9\xb8\x63\x4a\x5c\xb9\x42\x3a\x57\x54\xa5\xc9\xc1\x74\xc9\xdb\x94\x95\x14\xe4\xd3\xc5\xcc\x4e\xf8\x5a\x8e\x17\x50\x8d\x16\xd2\xcb\xb2\x6f\x7d\x2a\x2c\x6d\x39\x9d\x2b\xfc\xd3\x96\xb7\x3e\x26\x5a\x56\xd9\x13\x99\x95\x7d\x96\x8b\x8a\x3e\x37\x1e\x6f\xfc\xeb\x92\xe0\x97\x5c\xf8\xd1\x92\xd0\x71\xed\x55\x4b\xa1\x1c\xba\x69\x57\xfe\x06\x0e\x7c\x86\xac\x8f\x7a\x85\xc5\x8a\xaf\x96\xc2\x4c\x20\x31\xe8\x0d\xb9\x65\xd9\x82\xab\x7a\x2e\x8b\x65\x00\x9b\x26\xe6\x52\x2a\x01\xd8\x4a\x8d\xa3\x01\xd8\x78\x4b\x0a\x03\xaa\x91\xe2\x4c\xa2\x62\xe6\xfe\x4e\x33\x6e\x6e\xcf\xb9\x52\x19\xcc\x9c\x32\x0c\xfb\x27\xc7\xa4\x1b\x02\x99\x9e\x3f\xcb\x92\xe8\x36\xad\x20\xd3\xbe\x8c\x4d\x7c\x72\x7b\x72\xb1\x42\x26\xa4\x0a\x74\xe1\x4f\x6f\x3b\xf2\xb4\x5f\x05\x85\x52\x96\x11\xd5\x3b\x24\xe2\xa6\x69\x44\x45\x7e\xb9\xbf\x93\x65\xfc\x89\xea\xaf\x3f\x51\xde\x48\xf2\xd9\x6c\xbc\x46\xf9\x5d\xdf\x97\x6d\x7f\x52\x4d\xb6\x3f\x59\xba\xa2\x9a\x88\x25\x2f\xe6\xf0\x3e\x1e\xcb\x5d\xe1\x84\x95\xfd\xac\x8e\xb4\x09\xbb\xec\x08\x89\x0c\x6f\xfd\xed\x4f\x0b\x52\x4e\x31\xe1\x3b\xdc\x64\xc7\x7b\xcf\xca\x54\x55\x8c\xa0\xbc\xb3\xf4\xa9\xe4\x7e\xc6\xeb\xa1\xdc\x99\x2c\x1d\x49\x58\x82\x05\xf7\x8b\xa7\x87\xf5\x1e\x8d\x29\x96\xe4\xd6\x0b\x56\xba\x02\x32\x1b\x4d\x64\x65\xba\x65\xa3\x5e\x98\xae\x3f\x41\xb1\x02\xce\x88\x54\x78\x22\x7c\xfe\x63\x3c\x83\xf4\xe6\x50\xbd\x5b\xd0\x20\xf9\x13\xb9\x52\x60\x5a\x6e\xb4\x4d\x49\x1c\x69\x8a\xd1\x14\xe3\x66\x9b\xc4\x9a\xa9\xbb\x14\x6d\x4c\xe6\x65\x5a\x36\xcd\xc1\xee\x3a\xe4\xcf\xcb\xf4\x63\xca\x15\x9e\x7b\x99\x19\x30\xda\x48\x5d\x44\x90\xc5\x12\xd7\xbb\x9c\x97\x79\x2e\xc0\x3f\xd8\xcd\xef\xef\x16\xd7\x7d\xef\xd9\x99\x6a\x91\xcc\xe0\xc6\xab\xc9\x7b\xb6\x48\xb2\x29\x86\x0a\x92\x66\x3a\xc6\x88\xa1\x4a\x00\x5f\x0e\x7c\xda\x95\x1b\xc2\xb1\x1b\xed\xd3\x01\x0b\x1c\xd9\x8b\x74\xf0\x3e\x2f\xe1\xb6\xfc\xb4\x67\x6f\x5a\x8d\x74\x60\xbf\x6f\xa4\xbc\xb9\x2c\x0c\x13\x59\x54\x85\x11\xf2\xa0\xb8\xba\x70\x40\x05\x35\xb8\x93\x72\xe4\xfe\xdb\xa1\xda\x6c\x3d\x44\x97\x81\x08\xd5\xa9\xbe\x01\x83\x9a\xfc\x96\xc2\x27\xda\xa7\x0d\x4b\xb9\x4e\x27\x08\x79\x07\x04\xb1\x49\xd7\x5d\x0b\x84\x43\x82\xcc\xda\x65\xd0\x1a\x37\x83\xe1\x1a\x6c\xe6\xdf\xe9\x4b\xaf\x0f\x2f\xfc\x99\x5e\xde\xd9\x45\xc3\x2a\x74\x24\x81\x6a\x66\xb8\x3b\xb2\x5c\x1b\x96\xe6\xf3\x99\x25\xd4\xd7\x5f\x1f\x20\x61\x53\x24\x28\x9b\x4a\xea\x04\xc1\x9e\x72\x61\xa8\xe5\x2b\x80\x0b\xaf\xd2\x3e\x44\xce\x83\x98\x05\x60\x7d\xce\xae\x71\x52\xe0\x93\x2f\x3f\xa5\x30\x4d\x7e\xb7\x8b\x4f\x65\xe1\xe6\x18\x46\x2c\x1a\xab\xc7\x72\xfc\x96\x36\x0a\x6f\x28\x33\x79\xe4\x6b\x59\x8c\x5e\xc9\x2f\x44\x03\xe7\x3a\x72\xdc\xcc\x54\x63\xc8\xbc\x2f\x12\x3f\x36\x36\xdc\x2f\x8e\x47\x20\x20\x22\x22\x0c\x5f\xf0\xb2\x96\x04\xc3\x8d\x81\xf1\x54\x8e\x5c\xf3\x63\xe1\xcf\x98\xd3\xfd\x2c\x31\x2c\x4d\xb7\x76\xce\xae\x3f\xa3\xa3\x7b\x4f\xa7\xd2\x55\x9a\xb7\x8e\x8a\x8e\xe9\xc1\xa3\x60\xaf\xe8\xe8\x01\x00\x42\xd5\x57\x96\xd1\x23\xc8\xb8\x59\x5b\x3c\x52\xbc\x6c\x9d\xea\xc9\x47\x52\x93\xc1\xe3\x77\xe1\x89\x78\x85\x5a\x83\x96\x09\xe4\x46\x18\xc9\x95\xe4\x78\x71\x15\xc1\x67\x52\x2d\xac\x96\xfb\x55\xb6\x9e\xac\x25\xa1\x18\x51\x9f\x49\x23\x63\x5e\xbc\xd2\x87\x1f\xd2\xe2\x15\x47\x62\x61\x06\xde\xe7\x4b\x38\x69\x28\x6a\xb7\xa0\x1b\xdf\xe3\xa6\xa6\x4a\x2c\x8a\x44\xbe\xc8\x5a\x08\x95\x15\x06\xc1\x19\x94\xd5\x79\x1e\x54\x87\x36\x0c\x20\x18\xab\xad\xe0\x19\xe7\x2b\x42\x51\x34\xaf\x32\x93\x00\x4d\xe3\x64\x81\x96\xb4\xd4\x4d\xbb\x99\x59\xea\x07\x65\x52\x29\x9e\x4c\x99\x86\xb4\x1c\x66\x65\x0b\x52\xd0\x87\x22\x53\x74\xc4\xa6\xaf\xba\x86\xda\x64\x56\x87\x12\xd7\x78\xce\x43\xc9\xcc\xad\x5d\x61\x92\x2d\x1d\xd1\x29\x97\x03\x06\x11\x14\xba\x74\x09\x48\xcd\xaf\xa3\xb3\xc6\xd4\x8f\xa2\x84\x03\x13\x3c\x99\x10\x81\x01\x59\x18\xa4\x32\x45\x91\x34\x18\x54\x5e\x42\x31\x58\x02\xc5\xdc\xb8\x36\x35\x4b\x2c\xb1\x66\x6d\xe6\xd6\x2d\xef\x7d\x5e\x51\xee\x5f\xfd\x46\x63\x14\x8c\x0b\x3c\xe5\xb3\x51\xeb\x25\x28\x08\xb9\xc0\x4d\xf3\x94\x97\xce\x6f\xa2\xd7\xc9\xb9\x41\x49\x9e\x63\x1b\x81\xf0\x45\x59\x94\xd3\x14\x39\x5b\x20\xd2\x10\xc8\xa5\x02\x64\x01\xe6\x01\xe3\x06\x3a\x4e\x50\xca\x16\xa0\x6e\xdf\x7e\x6f\x05\x69\x32\x66\x57\x62\x95\x41\xb6\x83\x18\xd9\xf6\xc5\x79\x82\xbf\x19\xe0\x65\xa1\x67\xdc\x89\xe5\xc4\xc3\xeb\xcc\xc1\x6a\x0a\x56\x60\x10\x6b\x35\x5e\x0b\x25\x7d\x2a\x40\x9f\x81\x77\xd0\x8e\x7f\x3c\xa3\x7b\xc3\xb2\xb2\x38\xdf\x13\x3e\x2b\x0d\x22\x87\xd0\xf6\xae\x70\x4a\xcf\x85\xf1\x80\x72\xa8\x2b\xc6\x81\x97\x51\x1d\xef\xa8\x75\x42\x57\x5a\x70\x71\xa0\xeb\x4f\x5a\x1b\xac\x2d\x08\x29\x40\xd3\x11\x08\xdb\xc6\xeb\x41\x82\xf2\x16\x25\x69\x4e\xb7\xed\xcf\xbe\x32\xd8\x6b\xa7\x2c\xf7\x4b\x1b\x68\x1d\xf4\x31\x01\x0b\x49\x68\x50\x17\x8a\x55\x6d\x03\xfd\xd1\xc0\x1e\xeb\x94\xc3\x5a\x1b\xcb\x16\xdb\x99\x59\xbd\x50\x6b\x03\x3a\x05\xd8\xf9\x7a\x51\xa8\x50\x5a\x65\x2b\x60\xb5\x0e\x24\x77\x20\x03\x74\x20\x87\xfe\xe9\x48\x5d\xc2\x49\x2f\xe2\xa1\xb5\x97\xd5\xb1\x25\x66\x5e\x53\xef\x02\xd6\x60\x21\x6b\x8b\xc8\x23\x67\x1c\xb5\x7f\x38\x01\xf0\x94\x39\x78\xe2\x56\x03\x10\x0e\xeb\x61\xb1\x10\x98\x78\x49\x8d\x2a\x43\x93\x07\x2c\x78\x5e\xa6\xd0\xd1\x92\xf3\xf4\xd8\xe8\x18\xc3\x9a\xe1\xc5\x0e\x4e\x5a\xb0\x6c\x51\xd8\x1b\xa1\x33\x84\x68\x86\xae\x23\xb3\x3e\x84\x43\xe0\x5c\x28\x46\xc0\xc3\x31\x16\x4f\x29\xbc\x9b\xe1\x84\x78\xfd\xaa\xa8\x76\x12\xcf\x09\x0a\xbe\x13\x18\x48\x47\xeb\x0c\x86\x86\x85\xb1\xe5\x1e\x62\xb2\x0f\x49\x5e\x2c\x39\x50\x43\x86\x63\xc1\x6a\x12\x11\xa7\x20\x97\xd2\x6a\xac\xc7\x92\x42\x91\x44\xe3\x20\xac\x24\x3b\xb2\x20\xad\x53\xf8\x8e\x7f\xf1\x33\xa0\x2f\xc1\x11\xc2\x2c\xb4\x63\xeb\x3d\x14\xd4\xe8\x99\xf9\xb1\xe4\x04\x1c\xd4\xb8\xa0\x0d\x38\xb3\xac\x16\x26\x12\x0c\x18\xda\xab\x60\x28\x06\xd1\x9c\xbb\xd1\x63\x83\x66\x2c\x50\x0f\x2e\xee\x4d\x30\x45\x0b\x5c\x28\x69\x2d\x69\xcf\x59\x11\x5a\xa5\xe3\x26\x55\xeb\x86\x8a\x90\x45\x71\x54\xb9\x11\x75\xa5\xa8\xb8\x52\x62\x99\x35\x8b\xfa\x7c\x41\x0b\x0c\x12\xf7\xc4\x13\x23\xbd\xa3\x67\x6b\x17\x3c\x71\xd9\x96\x68\xaf\x34\x1f\x24\xf2\x2b\xad\x23\x8c\x5d\xa1\x2c\x8f\x0a\x5a\xe6\xe7\x68\x8b\x90\x9f\xa7\x3a\x3c\x99\x20\xc3\x2a\x63\xb4\x37\x94\x99\x3c\xe2\x93\x24\xf9\x3a\xf6\x56\x86\x65\xcb\xd4\x1e\x28\x8e\x2f\x7e\x1f\xa8\x26\xe9\xee\xb0\xbf\xc4\x4c\xcc\x14\x00\xd0\xc8\x31\x66\x21\xe6\x4f\x44\x9e\xf3\xb2\x72\xdf\x52\x5e\xc8\x73\x5e\x8e\xbd\x1e\xc4\x63\x19\xdf\x48\x0d\x28\xf6\xdd\x4c\x9f\x86\x4a\x05\xbe\x50\xe1\x65\xa0\x94\xa6\x89\x38\x80\x31\xe7\x18\x0d\xa5\x17\xd6\x27\x1c\xd3\xee\x42\xae\x69\x57\x6b\x66\xb5\x3f\xb9\xce\x42\xae\xbd\x48\xa7\xab\x72\x1d\x0f\x16\x72\x1d\x0f\xc4\xb9\xda\x8c\x0e\x28\x57\x9f\x74\x40\x8f\x90\x20\xaf\x3a\xee\x80\xcf\x4f\xd7\xc4\x1a\xfd\x2e\x1c\xb6\x64\x8c\x96\xc5\xc4\x8e\x49\x76\x07\xbe\x94\xec\xe2\xc7\x7d\x09\x78\x70\xf7\x20\x6c\x48\x1c\x49\xc6\xaa\xba\x69\x31\xb3\xe9\x14\xd6\x9b\xf0\x11\x47\x9e\x64\xf5\x3a\xe2\xe4\x5a\x53\xab\xaa\x4d\x4f\x3a\xe2\x12\x99\xe9\x1b\x1b\xd9\x5d\xba\x5f\xf4\xb2\xcf\xe5\x56\x24\x2f\x1c\xcd\x28\xa1\x17\x25\xec\x61\x82\xd4\x28\x52\xc2\x3e\xe5\xd8\xef\xe2\x1d\x33\x4a\xc6\x08\xf2\x06\xff\x5d\x89\x69\xc6\xa7\x5d\x0a\xba\x35\xed\x12\xc1\xc2\x2b\x06\xe2\xa6\x3a\x33\x94\xe6\xd3\x2e\xbb\xfa\x8a\x1e\xa5\x3f\x91\xb9\x4e\xa4\xb7\x36\x3e\xcc\xff\x71\xe0\x22\xf9\xdd\xe1\xac\x1c\x69\x73\x98\x72\xf1\x55\xbd\x43\x37\x4e\x86\xa2\x73\xf0\xc8\xd9\x5b\xf2\xe0\xf0\xc7\x18\x4a\xba\xab\xe3\xf8\xf1\x14\x12\xd9\x52\xfb\x00\x65\x82\x82\x8b\x7e\xf5\xe7\x45\xbf\x65\xbd\x0b\xfb\xfd\xb0\x13\x64\xa6\xad\xd1\x84\x77\x5a\x2f\x64\x54\x93\xf1\x87\xfc\xe9\xbb\xb8\xd2\xf8\x2e\xe1\xf7\x0f\x07\x4a\xde\x3a\x9f\x33\xe1\xa3\xcd\x68\xf3\xa5\xac\xbd\xed\x09\x4e\x65\x24\x0f\x35\x79\x27\xf6\xba\xd7\x92\xaf\xf3\x1b\xe7\x85\x4e\xa5\x92\x7e\x71\xfe\x51\x25\x76\xf1\x94\x2f\xf3\x26\x81\x9f\x5f\xd0\x72\x52\x57\x24\x17\xb6\x97\xf9\xc1\x05\x97\xa5\xeb\x94\x83\xdd\xd1\x5f\x74\xf5\xb2\x4c\x4b\x7e\xd1\x71\x11\xec\xe2\x7a\xd2\x22\xd6\x9c\x8d\x3d\xaf\x76\x81\x26\xcc\xf0\xa0\xdc\x58\xf1\x8e\x4c\xe2\x1d\xed\x18\xb1\xa5\x72\xb5\x62\xeb\x62\x2f\xc6\xfc\xd6\xea\xc5\xea\x03\x0a\xf2\xd7\xa7\x25\xac\xb0\x80\x55\xc4\xf9\x1d\x34\x81\x6f\x23\x72\xe7\x60\x8b\x9d\x1b\xae\x16\x23\xab\xd3\xb2\x01\x22\xd5\x7f\x7d\x6a\xb2\x3b\x67\xe5\x68\x25\x8a\x06\x11\xaa\xc4\xa5\x40\x5e\x1b\x7a\x75\xeb\x0a\xb6\x69\x17\x5b\xfc\x35\xec\x3f\x15\xb0\xd9\x5a\x16\x77\x77\xd8\x5e\xfb\x9d\x49\xb7\x27\x92\x72\x94\x34\x37\xa0\x71\xe7\xcf\xcf\xf1\x89\x52\x56\x6b\xe8\xa5\x00\xf6\xd4\x53\x49\x22\x50\xf4\x97\x14\xe7\x25\x44\xb6\xfe\x4c\x7d\x10\x37\xbb\xdd\xc4\xcd\xee\x5f\x20\x3e\x66\x00\x16\x10\x56\x82\x3a\x3c\x0a\x30\xc4\xf9\x29\x85\xb4\xc0\x30\x4c\xfa\x5e\xb8\xa7\x4a\x43\x41\xec\x00\x5d\xe7\x60\xba\x14\x46\x21\x60\xb2\x54\x31\x2a\xe5\x1b\xa5\x30\x37\x36\xe7\x43\x56\x7c\x88\x0a\x53\x8a\x78\xd6\x75\x18\x28\x13\xd9\x19\x26\x97\x27\xe0\xcb\x15\x0c\xed\xf5\x78\xd8\xea\x85\xe4\x73\x29\xba\x03\x92\xcc\x0b\x88\x94\xc8\x1b\x4d\xe3\x7a\xd9\xbc\xf3\x49\x28\x43\x6d\x79\x68\x83\x83\x31\xd9\x5f\xc2\xd2\x7d\x94\x80\x73\x6c\x56\x86\xa9\xa9\xab\x20\xe5\xa1\x61\x92\x61\xa9\x1a\x21\x1f\xb1\x67\x46\x6e\x5b\xd5\x8a\x70\x2d\xf9\x88\x2d\x24\x93\xa3\x16\x22\x2b\xd1\x9b\xcc\xf5\xe3\x32\x1f\x67\xeb\x12\x11\xae\x4f\x59\x8d\x0b\x8f\xe6\x27\x4b\x63\xa3\xaf\x6b\x8c\x91\x19\xa3\x3b\x16\x95\xb8\x68\x2a\x07\x9f\xbc\xa4\x08\x17\x45\x45\x1f\xc0\x1f\x1d\x20\x75\xe4\x00\x07\xb2\x9f\x91\x71\x7e\xa2\xf4\xfd\xf2\xd2\xc1\xb6\x28\x7d\x12\xc6\x4a\x7b\x95\xc8\xb2\x5a\x29\x0d\xe3\x43\xee\xd2\x68\xa0\x34\x15\x55\x18\x40\x85\x53\xb4\xf5\x44\x57\x9f\x34\xa5\xcd\x23\xe0\xbf\x19\x0a\x93\xb0\x3b\x8f\x0e\x92\xac\xef\xdb\x73\xad\xd1\x4c\x5c\xe3\x00\xc4\xaa\xba\xba\xb1\x58\x74\x3e\x74\x3d\xb7\xbd\x50\xd3\xfd\xaa\x9a\x00\xed\x7e\x53\xd3\xb4\x91\xbc\x4c\xad\xdd\x71\xc6\xfb\xcb\xb1\xbf\xae\xbd\x00\x67\x2b\x56\xbb\xcc\x64\x34\xf1\xe6\x20\xc9\x63\x08\x62\x25\xc8\x34\x53\x34\x9e\xf9\x6a\x9b\xc0\xa3\x17\x24\x2c\xc9\x08\x6a\x49\xbf\x10\xe8\x10\x42\x3a\x22\xa5\x65\xbd\xb1\xa1\x5e\xc4\x42\x2e\xf9\x26\xfe\x52\x16\x84\x4e\x7d\x96\xa1\x64\x64\x61\x74\xa2\x93\xc8\x6c\x64\x10\x25\xd0\x33\x65\x2c\x93\xaa\x68\x2e\x44\x4c\x37\xd3\xea\xaa\xad\x0a\x05\x4d\x4f\xbf\xc3\xce\x01\x22\xbd\x1f\x7d\x6f\x69\x4b\x87\x3d\xca\xe5\xa2\x37\x14\xb5\x97\xc1\xbb\x87\x6e\x46\xd4\x0e\xd6\x42\x6f\xfd\x0a\x2b\x94\xf9\x3c\x6c\x81\x9e\xde\x51\x7d\x79\xcf\x0e\xb6\x4d\x17\xf3\x84\xf0\x03\x19\xda\xf8\xd6\x72\x3a\x45\x4f\x7d\xf5\xf0\x2b\x47\xa1\xbd\x03\x72\xae\x87\x5f\x1b\x45\xe3\xfa\xe6\xf7\x43\x81\xbc\x31\x77\x35\x8a\xfb\xa2\xd6\x5e\xbe\x2a\xb9\x6b\xef\xab\x63\x7a\x01\xf8\x61\xdc\x68\xa8\x65\x61\x0f\x61\x39\x96\x87\x7f\xb9\x8f\xec\xd3\x0e\xdb\xda\x62\x39\xf8\x9f\xed\x7c\xda\x66\xb9\x5c\x9e\xe5\x3f\xec\xb0\x0f\x2c\xbf\xbb\xc5\xb6\x77\x30\x93\xcc\x4c\x05\xd8\xce\x2e\x83\xc4\x1c\xfe\xbf\xfd\x91\xe5\xe1\x61\x17\xd3\xb3\x39\x28\x82\xdf\x77\x21\x1f\xe6\xdc\xa6\x6a\xe9\xbf\xad\x2c\x54\xc9\x3e\x51\x99\x1d\x68\x91\x6d\x6d\xc3\xe7\x1c\x3c\xc0\x37\xac\x92\x6d\x6f\xe1\xc3\xd6\x2e\xdb\xa2\x12\x1f\xd8\xd6\x07\x59\x16\x73\x7c\xa4\xdc\x58\xe9\x07\x78\xc6\xea\xa1\xd9\x8f\x22\x09\xb2\x7e\xd2\x30\xee\xb2\x5d\xaa\x16\x2a\x14\x50\xd0\x9f\x1d\x01\x39\xe5\xcc\x63\x3b\x79\xf8\xfc\x11\xb3\x7e\x10\xef\xdb\xfa\x73\xac\xbd\x2c\xd6\xf1\x29\xd1\x4c\x9e\xba\xb8\x0b\x8d\xec\xaa\x46\xa8\x9b\xbb\x62\x34\xb7\x15\xd4\xb9\xbc\xec\xe0\x36\xf5\x91\x7a\x04\x43\xc2\x76\xa8\x0f\x5b\x50\x0e\x7b\x82\x23\x13\xeb\x83\x68\x40\x0c\x0a\xf6\x51\x0c\x91\x91\xf1\x23\x7d\xcc\x53\x3d\xa2\x81\x5c\x56\x7d\xcf\xe7\x71\x4a\xde\xec\xc8\xb1\x80\x0c\x9f\x04\x7c\xdb\xbb\x72\xf2\x72\x34\x40\x39\x6c\x7c\x27\x6b\x26\x7f\xc2\xb9\xd9\xc5\xa1\xc8\xe3\x14\x21\x0e\x68\x88\x72\xd4\xd1\xed\x4f\x62\xa0\xb6\x25\x94\x3b\xd8\x16\xb6\xbf\xf3\x81\x66\x3a\x4f\x5f\x76\xe9\x9b\xc0\x80\x1c\x56\x2f\xc6\x68\x9b\xa0\xc6\x8e\x40\x66\xcc\xb8\x65\xcc\x19\x3d\x11\x3e\x40\x85\x00\x36\x40\x07\xbd\x84\xf6\xb6\xd8\x27\xc4\x07\x39\x7f\xdb\x0b\x4f\x3b\xf4\x3f\xd4\xbd\x23\xa6\x52\xe0\x07\x56\xfa\x49\x75\x0a\x31\x18\xda\xda\xa1\xd1\xfc\x80\xe8\xb5\x45\x20\x7d\x22\x58\xb7\x70\x92\x71\x90\x3e\xb1\xed\x6d\xc4\x4b\x31\xbd\x90\x40\x63\x0e\x39\xa1\x78\x34\x48\x1f\x35\xd0\x84\x3d\xd8\x69\x81\x2a\x39\x8d\xec\x3b\xc6\x5f\x04\x67\x8b\xa0\xc8\x4b\xe0\xf2\x5b\x72\x30\xd5\x7f\x39\x39\xbb\xaa\x0d\x42\x47\x39\x52\x39\x4a\xff\x18\x61\xbc\x68\x8f\x32\x6c\x51\x75\xdb\xb2\x36\xc4\xd5\x2d\xf6\x66\x77\x9b\xed\xe4\xb7\xd4\x04\x6c\x63\x86\x4f\x38\x09\x30\xa6\x00\xdd\x56\xf6\x43\x96\x90\x9d\x46\x06\x92\x60\x0a\x77\xb6\xb1\x1f\xd9\x1d\x42\xa0\xdc\xae\x58\x95\x80\x4f\xd4\x99\x8f\x84\x52\x1f\x14\x3e\xd2\x92\xd8\x92\x53\x0b\xb5\x03\xc6\x6d\xd3\xbc\xca\x51\x21\x90\x77\x71\x69\xd3\x5a\x40\xfc\xf9\x88\xf9\xf2\xdb\xb4\xda\xf2\xd4\x79\xbd\x36\xb6\xf2\x12\xc9\x71\xe1\x6f\x09\xac\xd9\xd6\xb8\x0f\x33\xb0\xb5\x23\x29\x89\x5c\xc7\x7a\xf4\x3f\x8a\xfa\xb7\x08\x71\x08\x09\xd5\x80\x21\x4e\x8a\x61\xdc\x12\x13\x2c\x92\x68\x5c\xb3\x39\x81\xdb\x02\x2d\x3e\x6a\x7a\xa6\xa6\x16\xab\xcd\xe5\x3e\x6e\x23\xdc\x38\x6a\x59\x18\x69\xf8\x03\xe3\xf3\x69\x9b\xe6\x0e\x09\xd2\x2e\xfe\x0f\xb3\x28\x16\x3b\x2d\x93\x8f\x88\x34\x3b\x34\x1f\xf9\xec\x0e\x21\xeb\x76\x56\x50\xc2\xed\x0f\xaa\xf2\x1d\x49\x63\x76\x04\x92\x12\x4a\x6e\xeb\x19\x87\xee\xee\x8a\x41\xd8\x61\x82\x7c\x7e\x10\xfd\xd8\xc6\xc9\x96\x84\x21\xbf\xf3\x31\xb1\x62\xf2\xf9\xdd\x8f\x90\x3d\xcf\xde\x40\x55\x3b\xd9\x6d\xd9\x73\x39\xac\x02\x6d\x3e\x88\x59\xca\x51\x4d\x1f\xb3\x9f\x90\xa8\xb3\x0f\x9f\xb2\x59\x5c\x2e\x3b\x3b\x28\x1e\xd4\x24\x36\xd1\x10\x67\xf5\xbf\xfc\x6f\xfe\x2d\x7e\x4f\xa6\xfc\xa9\x86\xe8\xdf\x36\xfc\xdd\x91\x73\x9f\x15\x74\x86\x08\x6b\x96\xa6\x4e\xe4\xda\x31\xf2\x65\x65\x5e\xcc\x15\xcf\x93\xac\x6d\xd7\xf8\x6a\x96\x37\x4b\x67\x57\xd4\x9c\xac\x37\xaa\x35\x2a\xb9\x6d\xb4\x1a\x6f\x2d\xd9\x56\xf4\x6f\x31\x57\xb2\x3f\xe6\xb7\xdd\x58\xe9\xac\x51\x12\x6b\x7a\x13\x07\x70\x5b\x17\xde\x59\x32\xd0\xdb\xc6\xb0\xc4\xbf\x44\x20\x64\xe5\x8e\xb6\x23\x53\xb7\xe5\x82\x52\xef\x3b\xf2\x3d\x6a\x4b\xb5\xf4\x81\x36\xaa\x68\xa0\x76\x13\xbf\x59\x5d\xcf\xe2\x70\x24\xa1\x89\xe7\xc8\x1a\xd0\x64\x8d\xe9\x55\xe9\xdb\x0b\xbd\xda\x5e\x82\x58\xdb\xc6\x20\x27\x51\x22\xaa\x61\xdb\xe8\xe9\x22\xa4\x66\xde\x6c\xac\x96\xfc\xc2\x0c\x88\x55\xbd\xb8\x98\x92\x63\xbf\xec\xdf\xae\x1c\xab\xed\x58\x3f\xa3\x7f\x6f\x14\xd8\xbb\x4b\x31\x74\x97\xa6\xc3\x2c\x1a\xef\x7e\x3c\x25\x3e\x14\xd9\xd8\x54\x2f\x82\x16\x01\xa5\x6a\xca\xc6\x90\x25\xfe\x35\x97\x33\xb0\x62\x19\x71\x88\x13\x89\x5d\x5d\x49\x56\xcf\xe7\x36\xcb\x1a\x4b\xd2\x2c\xb1\xbd\x34\x4f\x76\x01\xb7\xb6\x63\xb3\x24\xf7\xca\x24\x3c\xdb\x62\xca\xa4\x3d\x52\x3f\x94\x46\xe2\xf1\x2b\xb6\x86\x49\x7a\x94\x8f\x1b\x57\x04\x73\x78\x45\x50\xdd\x0f\x94\x96\xeb\x35\xaf\x5e\xc2\x3f\xf8\x94\xce\xd5\x53\xb9\x02\xbe\xa5\xe4\x6b\x71\x4f\xde\x41\x75\xe5\xa5\x68\xbf\x92\xb8\x0e\xfd\x53\xfb\x03\xdb\xde\xce\x6e\xe5\x3f\xa3\xee\x73\x67\x07\x36\xfb\x2f\x8e\xf6\x0f\x96\xdb\x85\x86\xfe\x27\xff\xb1\x94\xcb\x16\x72\xb9\xa2\x5f\xc1\x2b\xd0\x22\xc8\x15\x70\xfd\xb6\x11\x96\xd5\xaf\x80\x40\xe7\x22\xe0\xe8\x4c\x85\x05\x74\x5d\xab\xf8\xf1\x73\x90\x8e\xc2\x5f\x07\x29\xff\xcb\x17\xe8\x4a\xad\x51\x87\xd6\x4a\xbe\xd3\x28\x04\x4e\x83\x14\x3d\x45\xff\x73\xb0\xb1\xf1\xd6\xe2\x9f\xbd\x1a\x3a\x6c\x4c\xe1\x29\x1d\x77\xfc\x74\xce\x0c\xd3\x4d\xfe\xba\xdc\x5a\x77\x86\x17\xce\xe6\xc5\x66\x66\xd0\x7f\xb2\x68\x27\x4d\x6f\xd9\xb1\xd7\x7c\xec\x35\xfe\x16\xcf\xba\x1d\x7b\xdb\xb1\x8b\x7b\xed\x8d\x8d\xd3\xb6\xf5\xd1\x10\x84\x6e\xc4\x50\x09\x8b\xab\x09\xc8\x6f\xd2\xef\xb6\xe3\x7c\x2f\x65\x3f\xf3\x52\xae\x80\xd0\xa5\x73\x24\x36\x16\xe4\xfc\x08\x68\x29\x39\x37\x87\x1a\xc8\xbf\x16\x14\xbe\xdb\x17\x1e\x70\x82\x0a\xea\xa5\x6e\xd1\xef\xd4\x9c\x35\x2a\xa4\x13\xd3\xd7\xbb\x2b\xa4\x53\x95\x56\x3e\x87\xfd\xb5\x5e\x7f\x2c\x5d\x9b\x8e\x5b\x7c\x1c\xac\xf9\xad\x61\xe0\x8d\x3b\x33\x34\xe6\x09\x2b\x58\x75\xfb\x9b\x98\xdf\x3d\x6e\x51\xc2\x0a\xad\x73\xed\xc5\xad\x9b\x32\x5e\x53\x2b\x4b\x6e\x51\xd8\x6b\x55\x2c\xd7\xf2\x5e\x5f\x1f\x2a\x52\x5b\xac\x94\xc6\xa6\x7e\xab\x5d\x31\xfd\xcf\x59\xfe\xeb\x2b\x7a\x1f\xb5\x6b\xd7\x6e\xdd\x9a\x36\x70\xde\xa0\x1a\x8e\x56\x94\x51\x35\xa8\x2f\xb9\x25\x5f\x30\x5a\xbf\x96\x73\x1c\x1f\x3d\x5c\x0a\x57\x0c\x30\xd9\x18\x01\x8f\xe1\x45\x5c\x8a\xed\x57\xe2\x05\x3f\x6a\x13\x6b\x14\x1a\x8a\x1e\x45\xf9\x94\x75\x68\xdd\x06\xad\x28\xd3\xfb\x6b\x58\x91\x46\x22\x27\x8f\x8e\xe3\x04\x15\x6d\x4f\x85\x23\x50\x8c\xbe\x34\xf4\x97\x23\xf4\xa2\xf3\xe2\x46\xc7\xff\xc7\xe7\x24\xdf\x3f\xc4\xe7\xe6\x4e\xaf\x1b\xe9\x89\xd9\x56\xc6\xc4\x30\x07\xd2\x96\x38\x57\x50\x7d\x14\x16\xb1\x69\x95\x90\x96\x09\x59\x95\x41\xc5\x20\xa6\xc5\x1f\x75\xb7\x83\x08\x10\x56\xcc\xeb\x76\x9d\x0a\x83\x3e\x15\x3b\x34\xdb\x00\x7a\x50\x31\x6e\xe7\x55\x0c\xbd\x9a\x76\x10\xad\xfb\x8e\xee\x73\xcc\xb1\xb9\x3c\x2f\xf5\x2a\x56\xf9\x5c\xdc\x71\x1e\xbe\x50\x74\xdd\x8a\x05\x03\x20\xc7\x33\x52\x19\xd9\x4c\xf4\xd7\x98\xfe\xfe\x22\x6c\x7d\x01\x5b\x5f\xc1\x66\x8e\xd7\xa0\x62\x28\x11\xbc\x7e\x6f\x1c\xf4\xc6\x4e\x34\x6f\x94\x2c\x91\xf7\x2d\xfa\x34\x16\xea\xdd\x3b\x6b\x20\xea\x1c\xa8\x3a\x1b\x15\xc3\x08\xe8\x5e\x4c\x42\xa4\xf3\x43\x47\x84\x1d\x17\x0d\x33\x20\xbb\x46\x31\x43\xbf\xa5\xd5\x79\xe4\xbf\xa1\x18\x2c\x01\x45\xc5\xfc\x41\x8b\x14\x2b\x40\xa0\x7c\x5d\x53\x30\x27\x5c\xe8\x55\x1c\x6c\xba\x03\x80\xe1\x6f\xbf\x62\x2c\xa5\xc7\x4a\xd2\x00\xe6\x7b\xdb\x92\xcb\x47\x2c\x11\x20\x8d\x8b\x2b\x43\x2d\x30\xd5\xd2\x41\x87\xe2\x76\x46\xe3\x3d\x94\xf5\x46\x2a\x4a\xd9\x59\x8f\x71\x33\xd0\xa3\xc7\x02\xa1\xfe\xc6\xfb\xfe\xae\x8d\x9a\x6d\xa1\x5f\xd7\xce\x20\x31\xef\x28\x6e\x58\xfd\xcf\x46\x10\xd7\x5f\x84\x1b\x31\x27\x92\xff\xc5\xc0\xd2\x70\x46\x73\x3b\x26\x64\x5e\x82\xc5\x40\x23\x54\x9d\xb4\x4e\x29\x62\xe7\xfa\x21\x67\x65\xf1\xc8\x8f\x38\x3b\x0f\xd0\x7b\x9b\x6e\x9a\xd2\x5d\x48\xf7\x8e\xd0\x50\x9b\x3b\x11\x8e\x73\xf3\x70\x28\x32\xd2\x5c\xda\x38\x50\xe9\x12\x1e\xa6\x40\xab\x22\x4c\xa8\x55\xfb\xf7\xbb\xbf\xfe\x35\xaa\xdb\xeb\xef\xd9\x75\x87\xe3\x1d\x99\xa8\x51\x00\xc0\x3f\xe2\xb5\xa6\x5f\x17\x2e\x55\x8e\xcf\x97\xb5\x34\xfd\xdd\x9a\x6d\x54\x4a\xc7\xe7\x05\x3e\x7f\x43\x43\x7b\x04\x7b\xc4\xbb\x7f\x3d\x67\xb3\xef\x0a\xc7\x01\x7b\xf7\xaf\xf1\xbb\xc2\xbb\x8d\xff\xef\x53\xf1\x1d\x3c\xf7\xe8\x39\x97\xa5\x97\xe7\xec\xbe\x78\xcd\xd1\x6b\x43\xbc\xe4\xe9\x65\x28\x5e\xb6\xf0\x65\x8d\x9e\xb7\xf0\xc3\x5f\xef\xfe\x2a\x7c\x83\x4a\x37\xde\x15\x4e\xe1\xe7\xaf\x77\x85\xaf\xf0\x93\xa6\x0c\xdb\x3b\x98\xf9\xbd\x78\xfe\x80\xcf\x9f\xdf\x15\xce\xe1\xb3\x43\x49\xbb\xd4\xca\x97\x77\x85\x33\x04\x6a\x92\xcd\xee\x66\x05\x60\xbb\xd4\x20\x24\x7c\xdc\x91\x8d\x6e\xa9\x14\x2e\xb2\xe4\x76\x05\xc0\x93\x3c\x08\xc3\x94\xf2\x31\xbf\x95\xd7\x49\x9f\x54\x12\x94\x33\x48\x09\x4c\xa2\x31\x66\x30\x2c\xc8\x06\xd0\x10\xc1\x14\x3b\xef\x6b\x38\x44\xff\x7a\xce\xe7\xe1\xdf\x87\x7f\x3d\x6f\x79\xf0\x2f\xa8\xbf\x0f\x99\x8f\x5f\xff\x6d\x95\xde\x8e\xc6\xb3\x4e\xf0\xda\xef\xbd\x72\xaa\xf0\x95\x0f\xbd\x66\x6b\x1a\xbc\xba\xdc\x6b\x87\xc3\xfe\xa4\xe7\xbf\x7a\xad\x71\xf0\x4a\xbe\xa8\x5b\xf0\xd2\xf7\x03\x17\xe8\xf5\x2b\xba\x1e\x7e\xf5\x47\xb3\x9e\xf7\xda\x1c\x06\x8d\xd7\x4e\xbf\x17\xfa\xc1\xc8\x7b\x1d\x0d\xbd\xd7\xc9\x28\xe8\xf2\x81\x6d\x95\x0a\x35\x9e\x7e\xc9\xa6\x3f\xfd\x67\xbd\x90\xae\x6f\x02\x6e\xb4\x18\xa0\xa7\xf3\xfe\x33\x7c\x7a\xfb\xfa\xaf\xf7\x25\x0b\x33\xec\xa5\xef\xeb\xf2\x17\xf2\x16\xfe\x85\x59\xa9\xf0\xbf\xbf\xfc\xf5\xae\xfe\xfa\x0e\x50\xab\xbe\xf9\xee\xf5\xaf\xda\xbf\xff\xaa\x6f\xfe\x65\x6f\x7e\x81\x1e\x70\xec\xc1\xe7\xf7\x61\x34\x16\x4f\x15\xad\xb4\x8f\xd1\xf6\xa7\x8a\xf0\x6d\x72\x86\xb6\x5e\xed\x43\xcb\xb0\x3c\xf4\x44\x84\xaf\x0e\x6d\xa0\xe3\xc2\x2f\x23\xc8\xb7\x93\x05\x0e\x8c\x38\x4c\x1f\xf5\xec\xb8\xce\x31\x1b\xf2\x62\xaf\xaf\xd9\xcf\x74\x74\xe2\xd7\x89\x63\x25\x77\x9b\x78\xc2\x24\x03\x0a\x27\x75\xf5\x94\x8d\xd4\xf5\x58\xcb\xa3\xa8\x05\x03\x85\x27\xca\xa1\xff\x51\xe1\x23\x5e\x14\xb1\xe7\x00\x05\x54\x3f\xa7\xc8\xb6\xaa\x0f\x21\xfa\xe7\xd7\x2e\x59\x62\x3d\xad\xb4\x75\xae\x06\x22\x46\x6d\x0f\x8f\x01\x31\xec\x86\xca\xfe\x28\x2d\xe6\x5b\xe4\x16\x11\x38\x35\xfc\xe3\xc6\x4b\xe1\xc9\x90\x0c\xc2\x96\x70\x3f\xaa\x5c\x0a\x58\x23\x7b\x0d\x3a\xb9\x76\xc1\x61\x81\x3f\xaf\x21\x79\x1b\x4e\xbc\x71\x7f\x88\xcc\x17\xd5\xf5\x20\xce\xae\x55\x04\x87\x33\xbf\x96\xc5\x1e\x31\xf5\x86\x9d\x33\x0c\x25\x35\xcb\x15\x4d\x00\x0d\x7f\x86\x03\x65\x87\x5e\xd0\x1c\x24\x86\x55\x7c\x1b\x8a\x81\x75\x55\xfc\x28\xa8\x9b\xc6\x96\x2c\xde\xcc\xe0\x05\xb3\x85\xbd\x08\xf1\x85\x2a\xb1\x8b\x04\x80\x26\xec\xd2\x58\xce\xc3\xca\x82\x3a\xf0\xe6\x0e\x55\x2f\x77\x27\xfa\xca\xf8\xf2\x23\x6a\x35\x80\xbf\x22\x49\xa5\x56\x67\xb2\x37\x02\x93\x90\x9d\xc7\xe3\xe9\x78\x77\x5c\xea\x86\x27\x80\x77\xb2\x91\xbd\xe5\x8d\xf3\x54\x11\xb7\x5e\x93\xae\xe4\x10\x99\xaa\x72\x80\x1f\xd0\x6a\x84\xfa\x12\x79\x27\x92\xb3\x33\x9a\x74\xbb\x5c\x70\x8c\xa3\xb5\x7e\xaf\x33\x83\x94\xc1\xa0\x3f\x1c\x07\xfe\x1a\x9e\x2c\x92\x8f\xa3\x35\xc0\x9e\xe0\x71\xc2\x3b\x6b\x68\xd7\xfa\x4e\x77\x0d\x46\x8d\x64\x26\xdd\xae\x64\x72\xd5\x71\x78\x8a\x46\xdc\x43\x33\xdb\x79\xcc\x26\x39\x3c\x32\x22\x5b\x03\x78\x30\x89\xc0\xcb\xa8\xf9\x8c\x80\xfc\xde\x0c\xd6\x42\x20\x38\xc0\xb1\x09\x70\x9b\x7c\xb4\xd6\x0c\x5a\x61\x73\x8c\xde\x6d\x45\xc9\xd4\x3b\xb6\xe6\x4e\xc6\x6b\x6b\xbd\x20\xf0\x47\x6b\xe3\x3e\xe4\x9a\x06\x51\x36\xd9\x40\xea\x47\x60\x1a\x99\xd2\xfc\x3e\x88\x45\x80\xbf\xc3\xba\xa8\x0f\xd7\x43\x7c\xc2\x11\xf9\xd4\x84\xbb\x34\xe1\x78\xd2\x0d\x79\xdc\x95\x79\xe4\xa8\x63\xa5\x94\xdd\xe0\xe2\xbd\x79\xc2\xac\x42\x0e\x43\x54\x04\xed\xdf\xe9\x41\x9a\xcb\xc8\xe1\x91\xd0\x46\xa7\x8a\x46\x40\x70\xa0\x39\x12\x8d\xa2\x12\x4b\x56\x45\xd4\x86\xa6\x37\x96\xb0\x96\x55\x2b\x8f\x10\x2c\x1d\x2d\x14\xfb\xb3\x83\xe2\x4d\xee\x28\xbd\x6b\x1e\x68\xea\x43\x4b\x0a\x74\xf9\xd8\x8f\x99\x31\x26\x3a\x13\x41\x14\xcd\xeb\x1e\xa0\x5b\x6f\x1a\x0c\x81\x8c\x78\xbc\x27\xf0\x0e\x9d\x62\xf1\x76\xd0\x23\xb4\x5b\x1b\x01\xba\x0d\x03\x39\xed\x19\xe1\x64\x4b\x39\x72\x92\x4b\x5b\x9d\xa1\xbd\x48\x2c\xcc\xe2\x7d\x61\x25\x26\x68\x81\x52\xce\x75\xad\x96\x7b\xcf\xeb\x75\x7b\x1e\x59\x64\x44\x80\xa1\xea\x15\x2f\x8d\x92\x67\x21\xd2\x19\xfc\x72\x51\x53\x60\xac\x43\x73\x91\xba\x02\xa5\x61\x17\x70\x7c\x94\x65\xe7\x5c\x61\x14\xf9\xf1\x6c\x02\x72\x23\x82\xab\x43\x66\x05\x53\xeb\x08\x8f\x0c\xb3\x0a\xdd\xd2\x39\x26\xa7\x34\x9d\xb3\x85\x95\x8c\x5d\x12\x79\x64\x0e\x15\xe2\x25\x5a\x37\x4d\xb1\xa1\x47\x6a\x04\x85\xc9\xb6\x76\xcb\xea\x7f\x96\xcb\x02\xd5\x03\xde\x17\x47\x23\x35\x91\x97\x08\x1f\xfc\x22\xf9\x10\x14\x44\xcc\xab\x17\x11\x1b\x00\x29\x58\xe0\x38\xba\x02\x0b\x63\x23\xc0\x70\x30\xcf\xd1\xf5\x28\x2e\xd6\x2d\xca\xc3\x65\x16\x42\x26\x8c\x2f\x40\x55\x15\xe5\xaf\x78\x0f\xe5\x7b\x58\x77\xda\xc5\x40\x34\xe7\x53\x73\x08\x48\xc3\xf1\x8a\x8d\xcf\xb2\xe2\x62\x03\x47\x56\x66\x68\xd4\xdf\x3b\x81\x61\x9b\x22\x21\x52\x58\x1b\xbc\x05\x86\x18\xbf\x86\x46\x0f\xd8\x8a\xea\x88\x46\xa7\x9d\x70\x33\xaa\x1c\xa7\x38\x0a\x56\x0b\xb4\xd3\x5b\x65\x32\xf8\x60\xc6\x3a\xdf\xab\xc4\x0f\xe5\x15\x09\x19\xd6\xd5\x4c\x2e\x92\x0e\xf2\x38\xa3\xe0\xf0\x05\xe9\xd0\x2d\x47\x13\xfb\xa2\xf7\x38\x85\xc0\xf2\xea\x0c\x57\x73\x91\x95\xb7\x66\x64\x8b\x25\x2e\x49\x8d\x27\xbc\xfe\x42\x2f\xba\x93\xce\xb8\x35\xe8\x2c\xfa\x71\x4b\xb0\x3b\x8b\xd4\x66\x81\xee\xaa\x2d\x9d\x96\x9f\x17\x8c\x68\x3f\x97\xf5\xb7\x3c\x61\x45\xb7\x76\x1d\xc0\xd6\xee\x2b\xca\x3c\x6a\xf6\x27\x1d\x5f\x90\x5e\xed\xdc\xae\x37\xe9\xba\xc1\x10\xb7\x0f\xa8\x78\xb4\x06\xc4\x1b\x3f\x35\x5a\xc3\xd1\x98\x48\xb9\xb0\x0b\x18\x65\xa2\x2d\xe5\x21\x5a\x38\x73\xc5\x91\x28\x94\x6b\x47\xdf\xa2\x2b\x5d\x7b\x0a\x00\x93\x90\x28\x50\x61\x13\x73\x67\x40\x4d\x14\x1c\xb0\xec\x7b\x7d\x71\xd5\x4b\x13\x16\x61\x1c\xbc\x68\x26\xf2\xb7\x36\x4f\x77\x3c\xe4\xde\x3f\xdb\x3e\x33\x7f\x7f\xff\x4c\xc7\xf7\xcf\x1b\xe0\x4f\x57\x21\xea\x99\x6f\xfa\xba\x3a\xe2\x49\xa3\x1c\x89\xaf\x96\x57\x42\xeb\x3a\x45\x76\xd2\xd9\x54\x8e\x59\xe2\x66\x98\x24\x4a\x76\xda\x4d\xe5\x08\x8f\xcd\x1b\x07\xa2\xaa\x40\x83\xe3\x68\xc6\x2d\x05\xef\x6e\x0a\x00\x34\xf6\xb8\xc0\xc0\xec\x87\x23\xbe\x94\xb5\x92\x84\x57\x13\x73\x6c\xd1\x8c\x76\x24\xb8\x2c\x45\xaf\x42\x87\x03\x21\x08\xcd\x1d\x2c\x44\xd7\x6f\x29\x4d\xfd\x31\x88\xcd\xe6\x0b\x6e\xca\x21\x14\x24\xc7\x8e\x16\xac\x99\x60\x63\x23\xf8\xec\x19\x8b\xa8\xb1\xb1\xd1\x10\x09\x48\xcc\x0c\x8c\xf7\x83\xe7\xb5\x3e\xb0\x11\x30\x59\x2e\x4a\x36\xa3\xb5\xa7\x26\xec\x46\xa3\x60\x3c\x06\x31\x55\x61\x19\xac\x8b\x49\xc0\xd6\xac\x77\xa9\x80\x6c\x64\x52\xef\x6c\x54\x1f\xe0\xc4\x62\xa2\x6c\x89\x2c\x9e\x24\x03\x50\x0e\xf0\xee\x87\x66\x16\x13\xcc\x40\xa4\x24\x3c\x8a\xdf\x0a\x9b\xc5\x09\x49\x64\x1d\xb7\xe9\xce\x63\xbe\xad\x62\x32\x9e\x21\x2f\xef\x2b\x0d\xa0\xe0\x4c\xd1\xc7\xb5\x5a\x48\x50\x86\xee\x06\x6b\xb5\xec\x45\xa8\xd5\x7d\xf1\x0f\x47\x4d\x3b\xa9\xd8\x30\x2e\xae\x91\x56\x99\x86\xf0\xdd\x3e\xf7\xd7\xb0\x18\x51\x0a\xd8\xd9\x5d\xde\xc9\x04\x38\x58\x1c\x18\x7f\x0c\x45\xc0\x8b\x11\x68\x5d\x01\x33\x6a\x08\x1e\x40\xe8\x87\x6d\xbb\x0b\x62\x8b\xb6\xb7\x5d\xec\xcb\x41\x8c\x3d\xdf\xa7\x8d\x56\xe6\xfa\xd1\x4a\xf0\x6a\xd1\x58\xa4\x30\x00\xcf\x1c\xaf\x5d\xe9\x8a\x0e\x2b\xb1\x2c\xb2\xde\xf7\x28\xc9\x45\x99\x7a\x47\x86\xd1\xb6\x80\x55\xb6\x56\xcb\xb2\x4c\x7e\x87\x65\xe0\xff\x0f\x3b\x2c\x57\xcf\x80\x1c\x1b\x8b\xe9\xc2\x37\xe9\x84\x42\xab\xe1\x2d\xb7\xd6\xac\x8d\x71\x6b\x07\xf6\xb2\x26\xae\x8c\xc1\xb3\xfd\x3e\x3f\x37\x35\x84\x89\xb9\x6f\xd6\x5e\x60\x58\x06\x32\xd5\x94\x85\x06\xf1\xd5\x44\x23\x01\xdb\xfe\x61\x12\x59\xb8\xe3\x45\x50\x03\xce\xc0\xb6\x03\x3b\x3b\x65\xd3\x21\xeb\xd6\xc4\xfd\x34\x3f\x1d\x6c\x06\xb1\x41\x7a\x34\xfb\x0f\x4d\xc8\x79\x41\x0b\x34\xd4\x98\xdf\x2f\xb4\xe5\x62\x5b\x78\x63\x94\x82\xe7\xae\x10\x7e\x8e\x2a\xcb\x2a\xd5\x9b\xa1\x75\xbc\x1c\xe1\xd3\xae\xb8\xe6\x14\x55\x74\xbc\x88\x0c\xb8\xcd\x2e\xc0\x25\x9a\xa2\x71\xf0\xbf\x20\x8f\x6c\xf9\x8e\x8b\x57\xe2\x0c\xf8\x82\xa8\xda\x93\xd5\x38\xb6\x0a\x34\x8f\x40\x23\x35\xe1\xf0\x88\x3b\xb9\xf7\x62\xe2\xf2\x9b\xcd\x4c\xe5\xd4\x54\xd1\x8d\x8e\xcc\x48\x25\xd9\x2f\x9e\x1d\xad\x9a\x5e\x7f\xd8\x85\xad\xc1\x6f\x8d\x80\xc0\x80\x1c\x03\xf9\x0b\x40\x4f\xc2\x2e\x5f\x73\x60\xdd\x78\x20\xb7\x14\x85\x23\x6c\x4f\x2f\x52\x60\xc7\x4a\x3e\x2f\xa0\x13\x7e\x8b\xa7\x01\x81\x75\x04\x1b\x80\x03\x5a\x0f\x9e\x07\x56\x3a\xb3\xb3\x09\x13\x0f\xdf\xa2\x3e\x8e\xcd\x99\xfd\x35\x2f\xf2\xda\x4f\x40\x48\xb3\x67\xb8\xa6\x1d\x62\x19\xd6\xdc\x12\xbe\x14\xb2\x76\x2a\x67\x32\x2d\x91\xea\xcf\xac\x4c\xd4\x0c\x28\x82\xc8\x73\xff\x60\xb9\x86\xb6\xb0\x0d\x6f\xb5\x41\xa2\x21\x83\x86\x40\xcf\xe6\x76\x7c\x29\x45\x6b\x41\xd1\xa2\x5a\xb6\x8e\xc7\x47\x29\xb7\xe0\x9a\x4b\xe7\x6b\x45\x9f\x34\xb5\x29\x20\xd7\xaf\xb9\x74\x83\xd7\x94\x57\x8a\x9a\xb0\x71\x34\xa4\x9b\xfa\x9b\x9e\x29\xf4\x9f\xca\x19\xbf\x7e\x48\x88\x72\xb0\xef\xc8\xcd\xbf\x8d\xb3\x26\x02\x1e\x8a\x63\xc1\x29\xcc\x73\x33\xd3\xe9\x87\x56\xce\xbc\x19\x70\x66\x2a\x27\x39\x45\xe8\x79\x0a\x04\x66\x3c\x41\x89\xda\xbb\x6e\x0b\xe6\x39\x1c\xb6\xfc\x4e\xab\x17\xbc\x63\xde\x94\xb3\xd1\x21\x3b\x3c\x63\xfe\x88\xcd\x9e\x39\x3b\x38\x64\xcf\x27\xec\xfa\x84\xb9\x47\xec\xe6\x90\xf5\x0f\xd9\xd3\x29\x1b\x9d\xb2\x1f\x67\x0c\x78\x08\xf6\x8e\x3f\x03\x7e\xb4\xc6\x1d\x28\x1b\x1e\xb1\xc7\x43\x76\x76\xc2\x2a\x27\xac\x7c\xc2\xbe\x8e\x38\xbb\x1d\xb1\xe6\x61\xdd\xb0\xbe\x36\x4e\x9c\xe4\xe5\xd4\xe6\xb8\xdb\x29\x3c\x8b\x59\x3a\x0e\x28\x60\xcb\x09\xfc\xf8\x0c\x18\xc3\x26\x90\x68\x8f\x1d\xc1\xab\xcb\xd6\xf7\x0a\xf9\x2c\xeb\xf2\x61\xd8\xea\x15\x76\x8c\xfb\xaf\xa2\xac\xf4\xc9\xce\x6b\x8f\x7b\xf5\xe8\x28\xf6\x57\x0f\xb8\xbd\x42\x85\x49\x55\x76\x01\xa4\xa9\x6b\xaf\xf0\x8b\xd4\x82\x97\xf8\xe9\xe7\xf1\x7c\x2e\xfd\x8e\xdc\xa1\x86\x0b\x4a\x2f\xdd\xdc\xc8\xd9\x48\x70\x36\xc7\x60\xe8\xe8\xb8\xd7\x2d\x79\xce\x8c\x94\x55\x50\x82\xbc\xfd\xe0\xdb\xc3\x83\xac\x22\x8b\xe4\x91\x81\x08\x68\x26\x22\xff\x82\x98\xd8\xc0\xcb\xf5\x0a\xb2\x38\x38\xd5\x09\x9f\xcf\x0d\xd9\x2c\x09\xbf\xb7\x04\x7c\x43\x59\x64\x6e\xb9\xa2\x68\x70\x9e\x28\x51\xc1\xb0\x7c\xaa\xba\xef\xad\xa5\xf4\x43\x14\xbd\x3a\xd1\xf9\xf6\xa8\xa7\xeb\x75\x3b\x51\x59\x19\xc1\x9d\xc7\x6e\x0f\xbf\xfc\x0d\x18\x2e\xff\x09\x0c\x2d\xbf\x00\x48\x5c\xc3\x08\xee\x00\x41\xa6\xe5\xd7\xed\x3f\xc2\x75\xa1\xe0\x8a\x44\xa4\x18\x37\x82\x6d\xd6\xa6\xb3\x7a\x8c\x91\xb4\x7f\x69\x67\x42\x3a\xac\xdc\x8f\x51\x41\x5e\x78\x86\x56\x6a\xcf\xf5\xd8\xb4\x54\x47\x8c\xf4\xd0\x85\xe1\x84\xa7\xfc\x0c\x77\x53\xc3\x1e\x4f\x59\x7e\xe6\xbb\x57\xda\x3b\x29\x54\xed\xd4\x93\x78\xbf\x0e\x4a\x8d\x73\x7c\x1f\xd1\x7b\xed\xd4\xaf\x97\x2e\x0e\x31\x21\x6c\xb0\xe3\x1e\xe0\xfc\x5b\x5e\xab\x00\x38\xaa\x5f\x44\x54\x4b\xe5\xc2\x28\xb0\x53\xd4\x72\x0b\xef\x0d\x11\x44\x4f\x67\x85\x38\x6a\x08\x10\x26\x61\x8a\x46\x22\xe3\x0e\x27\xa3\x26\x6a\x79\xd5\x73\xc6\xc3\x10\x42\xd8\x52\x7c\x8c\xae\x68\x8c\x62\x2c\xdb\xb7\x8a\x79\xef\x96\xee\xff\x76\x04\x1d\xed\x39\xbf\x5a\xe3\xa0\x3b\x82\x05\x34\x97\x16\xdb\x01\x89\xe1\xc0\x49\x20\x3f\xcc\x7a\x38\x9c\x74\x33\x05\xe9\x62\xe1\x09\xe8\x07\x1f\xf3\xc2\x2f\xba\x6f\xee\xd6\x66\x5e\xfd\x7d\x9e\x11\x3c\x85\x60\x8e\x97\x83\x45\x25\xe1\xc6\x86\x2e\x79\x51\xb1\x42\x5c\x36\x45\x7d\x22\xeb\xe9\xd3\x59\x0c\x80\xa5\x59\xe2\x6f\x40\xa9\xd6\x88\xe6\xa0\x70\x33\x1a\x04\x5e\xab\x81\x12\x15\xcc\x5e\x13\x19\x65\xbe\x36\x0e\x9e\xc7\x6b\x34\x30\x28\xd4\x78\x0e\x54\xed\xa5\x82\x06\x06\x6b\xd4\xcd\x79\xa8\xa7\xbe\x10\x3d\x6e\xc7\xd2\x25\x6c\x78\x1f\xb1\x87\x41\x85\x3a\x6c\xff\xd9\xea\xb1\x5f\x02\xfc\xc7\xde\x3c\x5a\x9e\xd4\x59\x20\x8e\xd4\xd9\x9e\x81\x6f\xfb\x47\x5c\x0b\x42\x22\x57\xa0\x86\x44\x54\x33\xea\x59\xdd\x7d\x96\x8b\xdd\xe4\xbf\xd0\xc2\x36\x77\x44\xa1\x1f\x23\x59\x08\x7b\x54\xe0\x72\xb2\x5d\xa0\x59\xe4\x64\x26\x83\xc4\xd3\x79\x6b\xb2\xa6\xd1\x4a\xbc\x5c\x3a\x9b\x30\xa0\x6d\xb5\x5d\x13\x35\x0e\xe0\x7b\x23\xb2\x00\xe9\x39\x6d\xd8\x97\x7a\x9f\x15\x21\x2d\xf6\x94\xbd\xfe\x40\x12\xd7\x1e\x9d\xba\x0f\x88\x22\x5e\x9f\x68\x4d\xde\xc0\x19\x00\xce\xb1\x11\x94\x1e\x7d\x1e\xd0\x68\x42\xe9\x91\x2a\x3d\x71\x44\xda\xa8\x5e\x9c\x50\xd1\x1f\x23\x0a\x93\x29\x78\xbd\x36\x9b\x88\x05\x86\x98\x82\x17\x67\x61\x01\xb4\xe9\x7b\xf8\xfa\x2a\xef\xe0\x4f\x8b\xa1\xd3\x26\x38\x47\x4e\xcf\x19\x50\x3b\x1a\x4a\x6c\x47\x2e\xdf\x89\x84\x73\x54\x67\x93\x68\x25\x5f\x9f\x14\x26\xce\x01\xcc\x0a\x36\x84\x67\x05\xbd\x94\x33\x41\x89\x08\x84\xb1\x51\x69\x92\xf9\x3a\x2d\xa0\x57\x3f\x09\xcf\x00\x8a\xa2\xec\x67\x38\xc3\x0a\xce\x0a\x50\x24\x07\xcc\x4b\x98\x9a\x44\xab\xeb\xd2\x9d\x47\x85\xf2\x9b\x21\xd5\x81\x3e\x09\x06\x29\x78\x7b\x9f\xcb\xec\xe6\x3e\xda\x00\x39\xa5\xf5\xcc\xb4\xa9\x3a\x6b\x18\x80\x84\x58\x14\x63\xff\xf5\x01\xc8\xc5\x73\xba\x91\x79\xb6\xd9\x40\xbc\xcd\xe0\x6d\x66\xb3\x17\x11\x45\xf3\x05\xe8\x82\x70\xc9\x80\x19\x53\xbd\xcd\x36\x83\x2c\xa9\x37\x83\x4d\xab\x9d\x9a\x42\x7f\xde\xe7\xd1\x06\xc0\xcc\x31\x85\x9e\xc0\xe2\xc3\x6c\x83\x4d\x99\x05\xa6\xe9\x05\xda\x91\x9f\x26\xce\x28\x85\x8f\x6c\x1f\x52\x67\x69\x91\x87\x1d\x3a\xfb\x54\x23\x00\xff\x4b\xe0\x9b\xf2\x06\x61\x41\x59\x76\x40\xc0\x31\x28\xc0\xda\xef\x8d\xc6\x09\x54\x91\x0d\xb2\xbc\xc8\xab\xed\x20\xbf\xe3\x55\x7b\xe1\xa5\x81\xc6\xc2\xc3\x3e\xa2\xb7\x06\xf9\x86\x7d\x54\xdf\x5e\xf0\xdb\x8b\xfa\xf6\x82\xdf\xc2\xcc\xfa\x83\x03\x1b\x6f\x6f\x73\x50\xaa\x21\x4e\xbf\xd4\x0b\xb5\x17\xf8\xc5\x90\x86\x61\xa6\x21\x54\x9d\xc7\x1d\x8b\x8a\xec\xdb\xc2\x0f\xf2\x44\xfe\x1e\xca\xdf\x11\xf9\x4e\x08\x6a\x27\xf5\xd4\x0e\xd0\x85\xa0\xe6\xf9\xf5\xf4\x8e\x10\xca\xb1\x12\xf8\xf0\x05\x0f\xb7\xe9\x19\xbe\x7d\x06\x1a\x64\xff\xea\x39\xcd\xb6\x45\x33\xdb\x13\x79\x8a\xf7\xdc\xc2\x47\x1c\x04\x98\x2b\xd6\x93\xd9\xb1\x9b\x76\xf1\x7b\xfc\xe3\x40\xa4\xe2\x9a\x81\xf2\xeb\x0f\xf6\x08\x96\x42\xb6\xce\xf0\x0f\x3c\xe5\xf1\x29\x5f\x77\x46\x94\x00\x23\xa0\x8a\xd1\x1b\x0d\xdc\xa0\x96\x8b\x7d\xc8\xa9\x0f\x6f\xb0\xa4\xf9\x25\x2f\xbf\x14\x7b\x46\x67\x7a\x51\x67\x4a\x96\x18\x2a\x04\x8f\x46\x94\x00\xc2\x70\xb3\xeb\x0f\x30\xc1\xc2\xb9\x66\xa5\x6b\xf9\xa9\x6d\xe6\xa5\xb7\x11\x4f\x64\x0a\x66\x14\x10\xd1\x13\x36\x64\xb3\x89\xfa\x1a\xea\xaf\x61\xf4\xf5\x2d\x10\x89\x19\xb4\x8a\xce\xc4\x36\x36\x06\xe8\xc7\xff\x8b\x33\xc1\x1f\x1b\x5e\xe9\xd3\xc8\xfc\x34\xc2\x1f\x80\x62\x19\x88\x88\x00\xa2\x17\x5f\x10\x13\x61\xfc\x43\x91\x81\xba\x99\xb6\xd4\xd7\x34\xfa\x08\xf8\x2e\xbf\x7a\xaa\xd8\x49\x9d\x3c\x6e\x7c\x37\x4b\x41\x66\xd8\x8b\xd3\xf2\x3b\xe4\x54\x75\xfa\x68\x23\x05\x48\x82\xd7\xfd\x01\x4b\x02\xc0\x92\x0b\x2f\x86\x25\xf8\x25\x42\x13\xf8\xf8\xd9\x09\xe8\x54\x54\xa0\x49\xcf\xf1\x64\xa6\xa2\x7a\x10\x33\x84\xde\x26\x44\x01\x9a\xa3\x0b\x8c\x55\xac\xf0\x64\xc6\x7a\x1a\x4f\xb0\x02\xe8\x33\xcc\x06\xe2\x09\xfe\x81\xa7\x3c\x3e\x01\x9e\x0c\xd8\x1b\x4c\x81\xc5\xa1\xca\xd1\x1b\xe1\x43\x0f\x51\xc3\xf8\x90\x8b\x3e\xe4\x63\x1f\xf2\xf2\x83\x06\x90\xba\xe3\x45\xdd\x91\x88\xe2\xe9\x59\xf0\x14\xa2\x88\x2c\x5f\x02\x39\x51\x58\x38\xed\xa8\xe4\x74\xc0\x2e\xe4\x30\x06\x72\xf0\x31\x03\x8d\xfe\x85\x39\xfa\x90\x57\x8d\x3e\xb9\xd4\x8c\xf2\xc2\x4e\xaf\x2e\xf5\x63\xc3\x20\x16\x91\x8a\x1e\x48\x50\xdb\x69\x08\xda\x09\x4f\x72\xb1\xab\x42\xa9\xb6\x9e\xd4\x74\x5b\xb7\xa0\x1e\x61\xb5\x93\x1f\x16\x19\x13\xf9\xd2\x69\x63\x19\xd6\xd3\xd2\x02\xbb\x70\xe4\xb9\x95\x38\x6b\xe9\xd1\x59\x0b\xd9\x76\x3e\x52\x08\x87\x4c\xe3\xdc\xfe\x75\x81\x0e\x4b\x68\x47\x20\xf9\xe9\x0a\xcf\x66\x06\xea\x2c\x26\x51\x70\xea\xa8\xa2\x6c\x4a\xdb\x1d\x6e\x95\xb4\x11\x5e\x3b\x53\xb1\x4f\x42\xc1\x01\x32\x1c\x23\xbb\x78\x88\xa2\x20\x54\xf2\xe2\x5c\xab\x8d\xf3\xf0\xf3\x4b\xf1\x50\x6d\x9e\x3f\x9d\x43\xd8\xb9\xc4\xb7\xc3\x3a\x7b\x03\xdb\x17\xc5\xde\xfa\x09\xfb\x06\x80\x06\x83\x7b\xf8\xe5\x8a\xd4\x3b\xa5\x2b\x4a\xa7\x43\x9a\x2b\xc8\x2b\xb7\x26\x7c\x64\x94\x0a\x7b\x2b\x35\x3d\xc1\x3f\xfb\xd0\x2e\x00\x7b\x61\xff\x9d\x1e\x60\x07\x2e\xa8\x28\x71\x6b\x62\xcb\xea\x72\x51\x05\x82\x41\xb5\xc8\xee\x41\x8f\xd8\x92\xde\xfc\x04\x82\xb7\x4f\x7d\x98\x3a\x08\x53\x1a\x61\x62\x17\x58\xe1\xd4\x06\xe1\x2e\xe5\x4c\x45\xcf\xba\xdc\x2e\xee\xa7\x52\x73\x01\xd8\xbe\x01\xda\xaf\x08\xb0\xe2\x95\xf3\xeb\xa4\x59\x98\x4a\x1e\x09\xb8\x22\xc9\x02\x4c\x63\xfb\xbe\x00\xa9\x78\x01\x2d\xc2\x0f\x40\x8c\x6c\xc0\x35\x85\x97\xa5\xc1\x1b\x70\x68\x0e\x1a\x47\xa5\xe8\x08\xc0\xb3\x8b\x64\x28\x61\x5d\xa6\x9c\x2e\x07\xc6\xc0\x2e\x5e\xd7\x06\xa8\xa5\x05\x36\xf0\x82\xfd\x6a\xf0\x82\xc4\xbe\xcb\x34\x7d\x87\xbd\x52\x21\x1f\xbb\x4c\x75\x49\xcf\x4a\x1f\x14\xf6\xd1\x65\x3c\xc9\x26\x9d\xd1\x8d\xeb\xaf\xdc\x69\xc3\x87\x55\xc3\xf4\xeb\x1a\xf1\x5d\x0f\x96\x84\xf3\x0d\x00\xfa\x93\x66\x11\x18\x10\xfa\x80\x90\x1e\x02\xa4\x5f\x61\xe0\x7e\x66\x5a\xdf\xc5\x9c\xfc\xe4\xce\x65\xca\x22\x38\x60\x7c\xf7\x50\xa9\x57\xbc\x4e\xee\x90\x3f\xb9\xdc\x12\xa1\x2c\x21\x06\x93\xc9\x29\x2a\xa2\xbe\x01\x41\x42\x3e\xf8\x27\xc2\x8b\x8b\xcb\xba\x96\x14\x17\xc1\xb7\xd3\xea\x8d\xa6\x11\x08\x28\xbe\x33\x99\x98\xc2\x26\xbe\x9b\x69\x48\x72\x7f\x62\x95\x67\x74\x43\xfb\xda\x2e\x12\xe0\x50\x76\x7e\xfc\x04\x43\x7b\x06\x93\x4e\x83\x8e\x5c\x07\xcc\x7e\x82\xfd\x3a\x14\xa8\xf5\x02\xbd\x6b\xa4\x0e\x35\xff\x05\xc3\x8f\x13\x9b\x41\x05\x06\x75\x71\xef\x9b\xda\xcb\xd9\x4b\x34\x33\x2f\x36\x4c\x0e\xf1\x6f\xf1\xc2\x73\x1f\x61\xb9\xb2\xe7\x01\x6c\x3f\xe3\x61\x2b\x18\x39\x7e\x31\xc8\x3c\xaf\x3b\x6f\xdf\x76\xb4\x07\xad\xc9\x18\xab\x2f\x84\xec\xc7\x29\x0a\x30\x11\x97\x7d\xb0\x68\x3a\x91\x95\x96\xd3\x59\x86\x81\xe6\x1b\x9f\xb9\x9a\x5e\x3c\xfa\x13\x87\x06\x87\x24\xb8\x62\x72\x03\x99\x51\xe6\x39\x5e\xca\x0a\x71\x66\x81\x1d\x6d\x94\x42\x98\x4b\x60\x47\x51\x83\x2a\x75\xa1\x2c\xa4\x59\x09\xe4\x7b\x40\xef\xef\xf3\xa9\x90\xf0\x53\x42\xf9\xd4\xf2\xc7\xcd\x82\xc7\x84\x85\x41\xc1\x67\xc0\xd4\x06\x69\x1f\xfa\x68\x28\x9a\x15\xbc\x2b\x85\x5d\x2f\x29\xec\x8a\x6a\xdd\x92\xab\x2d\xee\xa4\x48\x0a\x70\xe3\x11\x49\x21\xab\x5a\xf4\x90\x7d\xc7\x56\xe9\xe1\xfd\x56\x26\xbf\xb5\xcb\xa0\x2b\xc6\x6b\x24\xc6\x2a\x8b\x25\xaa\xed\x6a\x56\x5f\xd1\x0b\x0f\xeb\xf3\xb1\x16\x7f\xae\x3d\xcd\x2a\x4b\x48\xa3\x38\xfb\x5d\xc1\xb9\x21\xe5\x96\x23\xcd\x5c\x55\xc7\x7b\x5b\x87\x59\x97\x8f\xc3\x23\x0a\x22\x2a\xfd\xa7\xe6\x76\x60\x51\x8d\xf5\xf1\x1e\x85\x3a\xfc\x39\x52\x31\xc3\x1f\xb7\x62\x21\xc3\x1b\xbe\xc3\xe7\x77\x56\xb9\x42\x01\xe1\x22\xef\x27\x95\xb8\x7b\xcb\xf5\x51\x11\xff\x38\xc2\x4b\x33\x3e\x22\x31\xfa\xf6\x40\x8f\x76\x09\x1e\x3c\x0c\x38\x06\xd5\x91\x1b\xd6\x02\x3d\x89\x58\x66\x65\xb2\xa2\x7d\xdc\x5a\x8c\x1c\x41\x71\xac\x64\x5f\xd2\x8e\x0c\x51\x30\x3c\xd2\x7d\xe2\xc5\xec\x17\x47\x7e\x57\x9e\x50\xaa\x23\xe5\xf1\x95\xfa\xcf\x64\x27\x44\x5b\x31\x0f\x9d\x95\x65\x1e\xb9\xa4\x22\xa0\x14\x14\x72\x52\x13\xac\x8e\x6b\x7e\x9d\xa2\xaa\x6d\x1c\xa0\x36\x2f\x6c\x16\xb2\x73\xd8\xc1\x61\xe7\x70\x9d\x23\xb2\x23\x40\x99\x33\x64\xf2\x6e\x76\xa9\x81\xb9\x96\x68\x58\xc5\x45\x66\xa4\x0e\x1a\xc3\x61\xf1\x61\xad\x6e\x26\x1c\x63\xbd\xf0\xdb\x34\x17\xe3\xd1\xd1\x52\xcf\x61\x0d\x69\x57\x1e\x7e\x36\x54\xd5\x1b\x1b\x2d\xf2\xff\x56\x6b\x7b\x75\x3c\xe9\x83\xbf\x43\xe4\x59\x7e\x85\x63\x09\x75\x38\x27\xe3\x8e\xcf\x7e\xb4\xb8\x41\x36\x66\x1d\xf8\x17\x3a\xb9\x62\x28\xec\xec\x42\xb5\x49\x23\x3b\x71\xe0\xd6\x91\x03\x24\x1e\xce\x19\x05\xaf\xaf\xf0\x03\xb5\x4a\xf9\x19\xf9\x89\x26\xb4\x03\xe5\xa5\x40\x80\x00\xc1\x6f\x07\xb8\x3a\x10\x75\x99\xc8\x2d\xa8\x1e\xd9\xb2\xa1\x42\xa8\xd5\x9b\x04\x92\xed\xc0\x93\xe7\xec\x67\x2d\xbf\x93\x2b\x10\x55\x65\x9b\x9c\x63\xd1\x08\x50\x4a\x3b\x05\x7c\x1f\x0d\x45\x3a\x87\x61\x09\x1a\xa2\x6b\x6a\xe8\x04\x1d\xe9\x30\x1c\x42\x9b\x2a\x0e\x28\x0c\x6d\x04\x63\xce\x4e\xfd\x44\xb7\x7a\xd0\x7f\x31\x00\xa1\x42\x58\xe4\x98\x76\x28\x10\x57\x58\x0c\xd3\x69\xec\x81\x1f\xef\x1c\xf3\x8d\xa1\x8e\x81\x19\xaa\x21\xce\x22\x14\xb0\xa4\xe5\xcc\xea\xa4\xec\x7c\x8e\x95\x41\xd3\x64\xe5\xa8\x46\x3f\x74\xf2\xb1\x06\xb9\xf3\xa6\x61\xbd\xcb\x64\x32\xef\x8c\x8a\x79\xb2\xd5\x64\x86\xa8\x19\xbe\xb4\x65\xd1\x12\x17\x27\x65\x66\x73\x81\x13\x75\x00\x86\x05\x90\x00\xd2\x6c\xd6\x49\x36\x18\x98\x6d\x74\xe6\xc2\x5b\x0b\xf6\x25\xd9\x98\x6f\xd0\xe4\xe3\xd8\xe9\x47\x64\xc3\x5a\xa8\x4c\x39\x1b\x70\xdf\x07\xa2\x5b\x38\xdb\x67\x6e\x7f\xe8\x07\xc3\x82\xd7\xe3\x4a\x09\xc7\x91\xb0\xc2\xbc\x1d\x93\x75\x0e\xbe\xa4\x7e\xc0\xac\x67\x84\x9a\xdc\x51\x29\x2a\x77\x86\xbb\x1b\x1b\x8d\x67\xe1\xda\xd7\x35\x43\xdb\x6b\x58\xae\x2a\xca\x0b\xd0\x75\x5f\x90\x8b\xa7\x6d\x27\x7e\xa7\xe1\xc4\x04\x17\xc9\xe4\x55\xa5\xe8\x62\x36\xbe\xe4\x30\xe6\xeb\xd2\xcc\xd7\xfd\xa5\x99\xaf\x2b\xf1\x1b\x19\x50\x69\xe4\x3e\xf7\x69\xdb\x30\xae\x70\x47\x64\xe0\x70\x05\x12\x63\x30\x0c\x86\x74\xaf\x66\x14\x8c\xd1\x6c\xe2\x8a\x48\xe4\xcd\x53\xc2\xf4\x4b\x54\x29\x7b\x66\x9b\x26\x0a\xd7\xfd\xa8\xe2\x2b\xbe\xdf\x31\x2b\x33\x9c\x28\x98\xd7\x1f\x2e\x42\xb5\x71\x9c\xb9\xea\xc6\x03\x88\x83\x78\xa0\x84\x27\x3d\x51\x8f\x7e\x98\xe7\x2f\x3f\x2b\x14\xb6\x0d\x6a\x2a\x1f\xd8\xac\x72\x10\xb3\xf4\xbc\x89\x6d\x12\x51\xd6\x0e\x64\xf5\xfb\x1c\x37\x1f\xdd\xd0\x4f\x34\x49\xa8\x1e\x30\x77\xd9\x79\xe6\x6d\xfc\x28\x19\xf2\x46\x95\xb5\x45\xbb\xae\xaa\x32\x2a\x75\x57\x11\x47\xa6\xd3\xbe\x71\x3e\x2b\x4b\x71\xe8\x2f\x1a\xa9\xba\xf6\xfc\x94\x5b\xdf\x57\xdc\x4a\xba\x13\x06\x0f\x99\x61\x68\x91\x27\xa4\xf5\x85\xac\xd2\x80\x45\xb9\xdb\xba\x08\xc9\xa3\x6e\x18\x99\xef\x49\x77\x64\xca\xfc\xd6\xc0\x50\xb2\x58\xc6\x2f\x04\x06\xbc\x61\x90\xfb\x9b\x96\xf5\xbd\x05\xc8\x7c\xbb\xf4\x7c\x4e\x54\x81\x2e\xfc\xd0\x39\x24\x3d\xcd\xe5\x6e\xcd\x5e\x1e\x10\xc2\x68\xe3\x38\x8d\x9f\x3f\x32\x4f\xc8\x74\x78\xda\x48\x0d\x92\xd5\x1d\x55\xe2\xd5\x97\xe0\xed\xcf\x48\x71\x2b\x9b\xf4\x22\x8d\xac\xe7\xae\x1c\x32\x39\x0c\x00\x0a\xe5\x80\xa1\x5b\x62\x46\xe3\xf7\x54\xa4\x91\xe8\x54\x4f\x80\xab\x82\x5c\xc3\x84\x3d\x4a\x0b\x24\x11\x86\x3a\xba\x5e\x23\x71\xa1\x2f\x0c\xa8\x2d\xc1\xd6\x88\xe2\x92\x5b\x18\x3e\x2a\x54\xee\x3f\xd2\x1e\xad\xa2\x51\x3e\x22\xe9\x32\x3d\xea\x9c\x93\x4e\x9b\x3e\x5e\x91\x0c\x29\x56\x4f\xf4\x38\xbb\x26\x17\x91\xba\xc0\x3a\xd2\x92\x27\x15\x2e\x9b\xfc\x97\xc8\x46\x0f\x5a\x62\x25\x9e\xf4\xc4\xef\xb0\x21\x68\x0c\xa0\xd7\x7a\x72\xac\x22\x9f\x62\xeb\x95\x22\xd4\x26\xa3\xef\xdf\x3d\xd7\x6b\xfb\xb8\x75\xa3\xd3\xb0\x61\x43\xd5\x53\x92\xbf\xe2\x9b\x08\x3c\xcf\x75\x3b\x27\x32\x54\xd7\x49\x2f\xfe\x5d\xc1\x73\xd0\x92\xb1\x41\x5a\xe6\x77\x3d\x95\x84\xd4\xeb\x0b\x48\x6d\x5e\xcb\x43\xb0\xc8\x66\x12\x9f\xb4\xcb\x39\x03\x2e\xe1\x76\x6c\xd8\xb0\x0b\x6f\xe9\x47\x65\x31\x40\x13\x59\x4e\x7a\x94\x05\x7e\x54\x16\x03\x3a\x91\xe5\xa0\x45\x59\x0e\xe2\x3e\xcc\xbe\x1d\x45\xb7\x1c\xfb\x46\x2c\xa3\x70\xaa\x67\x6a\x04\x42\xf4\xfc\xc6\x81\x9c\xc2\x48\xdb\x3b\x5f\xea\xd2\xb3\x2f\xcd\x3f\x15\x57\x37\xbb\x46\xd6\xe8\x6a\x44\xe7\xa8\xe2\x30\xc8\x70\xf7\x19\x4e\x95\x4b\x9c\x9f\x6d\x83\x88\x88\x9a\xce\x85\xef\x3a\x0c\xba\xd6\x4e\xb6\x65\x46\x39\x9b\xca\xb6\xa4\xae\xc6\x75\x7e\xc8\x00\x8f\xa3\xa9\x69\x8e\x86\x77\x98\x90\x7d\xf3\x45\x5b\xc6\x56\xc6\x6a\xc2\x5e\xdf\xd6\x9d\x76\x55\xb4\x53\x2e\x26\xd5\xd8\xf6\x6e\x00\xb0\x84\xf3\x24\x23\x74\xc7\xd5\x14\x0f\xa5\x7d\xfd\xe2\xa2\x00\xe6\x09\x6f\x3e\x20\xb2\xf9\xc2\xcf\x8f\xf4\x7b\x04\xab\xa3\xe8\xe3\xc2\x10\xab\x62\x8a\x2e\x55\x7d\x5c\x1d\xea\x3d\xb2\x6f\xf1\x29\x72\xf2\x34\x11\xad\x6c\xc5\x41\x28\xae\x7f\xd3\x32\x44\x3a\xc7\x93\xfe\xbf\xaf\x93\xb5\x70\x72\x97\x57\x34\x0e\x3a\x13\x36\x31\x82\xc0\x73\x5c\xed\xf8\x15\x7e\x97\x35\xba\x48\xf9\x4d\x77\x6a\xa6\x8b\xaf\xaa\xb1\x2d\xee\x0f\xb8\xa3\xe1\x93\x2b\x3d\x4a\x72\x63\x91\xb7\xab\x04\x4e\xd5\x0c\x79\xd8\x39\x61\x5d\xd4\x96\xdc\x59\x6e\x95\xf1\xaa\x5d\x74\xab\x48\x15\x3b\xf1\x29\x8a\x5c\xac\x75\x4e\xe4\x86\x42\x68\xea\xe1\x6a\x52\x1b\x3b\xbe\x38\x18\xf6\x68\xae\xee\x90\xc8\x23\x45\xcc\x64\xe6\xa1\x53\x95\xb7\x59\x65\x39\x0e\xe4\x4b\x34\x9a\xc0\xd2\xf8\xf5\x2e\x5c\xcf\x35\xec\x15\xd0\xd7\x73\x1c\x20\xa8\xb4\x4e\xcb\x21\x3a\xcb\x23\x62\x69\xde\x79\xaa\x5a\x46\xac\x47\x1a\x9b\xd6\xa1\x22\xbd\xc7\x0a\x49\xdb\x81\x83\xec\x95\x2b\x47\xef\x70\xa8\x7c\x44\xbd\x8c\x8c\x95\xfc\x32\x73\x2e\x8f\x64\xd1\x31\xea\x2b\xe8\xe9\xf9\xda\x91\x7e\x59\x2f\xc5\xb2\x87\x81\xf4\xaa\x0c\x20\xc1\x28\x64\x1e\x76\xab\xc8\x1f\x97\x04\x13\xc7\xca\x7f\xc5\x96\xf2\x31\x30\xae\xc2\x21\x9a\xaa\x4f\x02\x9c\x79\x9c\x4a\x02\x0c\xb0\x69\x17\x58\x97\x7d\x32\x97\x84\x57\x37\xf3\xd8\xb5\x84\xe5\x31\x99\x1d\xc7\xa3\xe3\x4a\xe0\xd5\x05\x78\xe9\xd7\x4d\xa5\x92\x5f\x70\x37\xb3\x4f\xce\x48\x6b\xe8\xb8\x13\x83\xc2\x4a\x00\xd1\xb6\x33\x98\xcb\xd6\x6a\xee\x30\xe6\x20\xd7\xcb\x89\x25\x72\x93\x09\xce\x17\xfd\x81\xbe\x50\x4c\xe9\xa3\xa4\x13\x33\xfa\x36\xf9\x06\x38\x7e\x3d\x62\x3a\x54\x31\x25\x5c\x89\x90\x5f\x0b\xad\x89\x6b\x05\x93\x6f\x09\x92\x91\x08\x01\xac\xba\x17\x99\xe8\x73\xd1\x37\x9f\x16\x1b\xe9\x84\x02\xa5\x0f\x52\xe3\xf7\xd4\xb3\x02\x54\x06\xf9\xb0\x21\x4b\x42\xe9\xe5\x96\xc4\x3c\x52\xd3\x93\x69\x7a\xd0\xf8\xe9\x11\x9b\x8d\x6d\xfd\x26\xfd\xc4\x3e\x5f\x5b\x42\x3f\x51\xeb\x3d\x0a\x62\xc8\x60\xa9\xd8\x3a\xdf\xd7\xd5\xf9\xba\x66\xbe\x70\x75\xbe\x70\x44\xc1\x61\xbe\x0e\x16\xae\x8c\xb8\xb5\xd9\x23\x88\x24\xf4\x63\xa9\x8b\x2d\x02\xea\xcc\x8f\x89\xe5\x62\x74\x1f\xbb\xe8\xbd\x75\x3a\x21\x1d\x29\x02\xdb\xe8\xa9\x08\x35\x23\xba\x0a\x2b\x66\xf2\xc1\x5d\x65\x52\xdc\x0e\x70\x74\x0e\x83\x04\x55\xc0\x3d\x41\x5d\x3e\x16\x53\xb9\x4d\x10\x89\x18\x3c\xfd\xbe\x34\x16\x26\xb2\xd9\xef\x2f\x90\x14\x01\x22\xa2\x9d\xc2\x38\x98\x33\x45\xc5\x8e\x33\x2e\x96\x77\x25\x73\x8b\x6e\x9d\xb7\x13\x48\xd0\xef\xa0\x35\xd9\x3e\xee\x97\xa4\x5a\x4e\xf6\x3b\x5e\x93\x08\xb9\x75\xd7\x58\xc4\xd6\x63\x48\xb5\x94\x55\xd7\x25\xda\x68\xcd\x0e\xd9\x8f\x53\xf6\xfd\x94\xb9\x87\x8c\x9b\xd6\x54\x7e\x55\x97\xf2\x5f\x34\x17\x27\x96\xbe\x4f\x54\xec\xc0\x5b\x6c\x40\xef\x83\xf3\xa2\xc8\xf4\xf8\xb4\x0a\xcf\xfa\x45\xae\x19\x1a\x97\x18\x1a\x23\x2c\x63\x45\x72\x9b\x45\xb1\x7d\xa3\x03\xf6\x16\x6a\xad\x24\x77\xe2\x22\x5b\xb2\x2c\xbb\xd2\x82\x0d\x1b\x18\x36\x00\x7f\x60\x53\xa5\xc3\x35\x6f\x63\xc3\x7f\x7d\x85\xbf\x6f\x85\x0f\x57\x54\x3c\x08\x68\x82\x53\xd6\xa0\x2c\xbe\xdd\x00\x1a\x7e\xe6\x66\xae\xca\x37\xff\x39\xbd\x3c\x3c\xba\xd5\x97\x04\xdf\x7a\xb6\xeb\xf8\x90\x11\xd6\x99\x99\x01\x17\x9e\xce\xe4\xd7\xbe\x42\xcf\x41\x94\xf0\xe8\xe1\xf5\x35\x9e\x17\x3f\xc4\x12\x16\x9b\xf3\x84\xef\xd2\xc6\xbc\x28\x2c\x60\x02\xfc\x7c\xb8\xf7\xfd\x88\x45\x76\x31\x5e\xc6\xe7\xe3\x00\x0f\x05\xa3\xe8\x17\xe4\x94\x2f\x39\x01\x93\x81\x45\x73\x90\x58\x43\x67\x32\x6c\xa1\xff\xc2\x88\x6b\x32\x98\xbb\xc0\xdc\x6f\x4d\xee\x6e\xa4\x19\x1d\x57\x08\xda\xa4\xe7\xd4\xba\x4b\xf9\x05\x37\xd7\xa0\x4a\xea\xc9\xe0\x77\x18\x32\x97\x9f\xc3\x65\x4e\xb4\x13\xc4\x40\xd0\x81\x60\x49\x3f\xe2\x62\x37\xf0\x76\x92\xbb\x02\x51\xef\x7e\x91\xab\x43\x2f\x14\xc8\x42\x90\xcf\x4a\x4e\xf3\x03\xac\xaf\x8f\x2c\x04\x25\x91\x43\x78\x1f\x66\xb7\x43\xcc\xa4\x8c\xee\x46\xca\x73\x98\x47\x5b\x0a\x77\x68\xa9\x50\x91\xa2\xa8\xeb\xb2\x1d\x0c\x6e\x61\x8c\x5f\xa3\x1a\xd7\x10\x46\x1b\xb1\x8a\x5f\x2e\xb0\x54\x50\x90\x73\xe9\xca\x56\x6f\x7f\xdd\x17\x4b\xed\x49\x43\x5f\x70\x36\x82\xdd\x2e\x02\x39\x92\x54\x32\xd3\x11\x7e\xba\x29\xe8\xa2\xde\xa4\x31\x2b\x4c\x5e\xc0\x92\x93\x32\x56\xbb\xd8\xa3\x1f\xb5\x73\x34\xa3\x3b\x17\x32\x03\x4c\x83\x65\x33\xe5\x4f\xfd\x22\x4f\x95\xc1\xea\xf7\x71\x3a\x1b\x62\x3a\x61\x67\x6f\x2c\x99\x02\x1d\x95\x5d\x09\x4b\xaa\xca\x03\x4f\xcc\xe2\xe1\x63\x5d\xd7\x1b\x4f\x34\x48\x18\xf4\x15\x19\xed\x44\x01\x00\x98\xf6\x46\xb2\xdd\x56\x03\xa6\xf2\x48\x5e\x5b\xd6\x4c\x4b\xe0\x9b\x92\x4f\x61\x3e\x04\x67\xd7\x5a\x45\x79\xb0\x41\xef\x7c\x49\x83\x99\x61\xd0\x18\x06\xa3\xa6\x26\xa8\x8b\x4d\x4a\xdf\xdf\xd8\x9f\xc7\xa7\xa8\x0a\xe1\xc8\x34\x39\x46\x12\x03\x3a\x2d\x4b\xed\xf8\x54\x13\x52\xbd\xc7\x59\x5d\xb3\xb1\xf8\x3d\x87\x80\x3f\x3f\x27\xab\x48\x8a\x30\x93\x73\xa4\x7c\xe6\x86\x35\x39\xa7\xfa\x9a\x7b\x51\xec\xae\x28\x27\x23\x83\x67\xc5\x58\x4a\x5a\x82\xe1\x41\x04\x0d\xd1\x49\xb6\x99\x47\x93\x23\xca\x88\x1e\x91\xe3\xc9\xfa\x5e\x40\xdc\x49\x4c\x48\x1b\xc6\xd5\xc4\x88\xe8\x0a\x08\x14\x56\xd9\xd5\xc4\x2e\x86\x34\x25\xdd\x97\x65\x81\x84\xe9\xba\x9f\xc8\x30\x8a\x85\xdf\x7f\x92\x61\x70\xab\xca\xbf\x69\xd5\x17\xfb\x4f\x11\xc6\x3a\x5c\x3e\xd6\x55\x15\x33\xba\xea\xcb\x31\x16\xe3\x1a\x26\xc7\xd5\x1c\xc3\xaa\x5f\x52\x65\x68\x1c\x91\xdb\x36\xdd\xdf\x54\x4d\xe9\xcd\x2d\x95\x8f\x78\xa1\x72\x84\x3e\x8c\xc8\x7f\x91\xc0\x87\x7e\xfc\x02\x73\x2e\x45\x57\x20\x2c\x9e\xce\xd9\xef\x7d\x0c\xe7\x22\xef\x41\xbc\x0f\x30\x30\x07\xc8\x91\x68\x0a\xd7\xfe\xec\x17\xdb\x74\xc9\xb9\x8d\x41\xe3\x3f\x37\x36\x36\x42\xb2\x13\xc4\xf7\xac\x64\x71\x45\x46\x4e\x19\x25\x0c\x61\xcd\x2d\xb5\xff\xa7\x51\xa0\x36\xda\x50\x65\x9d\x75\x1c\xe1\xa1\xc8\x2d\x65\x3e\x14\x32\x1f\x77\x98\x5b\x92\x5f\x1b\x76\xa1\xfd\x3f\x8a\xb0\x5c\xf4\xa1\x6a\x14\xce\xbc\x25\x92\xd9\xff\xf9\x3f\x56\x67\x93\xa7\xf2\x3b\x3b\x9b\x56\x2e\xdd\x41\x66\x69\x2e\x5c\x27\x54\x90\x57\xa8\xd5\x76\xd1\xe9\xe4\x16\xcb\x6f\x6f\xd7\x59\xb6\xce\x6a\xb5\x7c\xee\x13\xdb\xfd\xc8\xd0\x93\x9f\x78\xdf\xde\x66\xb9\x8f\x59\x7c\xa1\x77\xf2\x90\xf9\x81\x7d\xfc\xa8\xde\x3f\xe4\xd8\x07\x74\x76\xa8\x12\xb2\x2c\x87\x5e\x0a\x3f\x6d\xa9\x0a\xd0\x51\x66\x2e\xcf\x76\x3f\xe8\x1a\x3e\x52\x15\x5b\xbb\x32\xe1\x13\x64\xcf\xa2\x67\xd1\xbc\x6e\x33\x8b\x8e\x3b\x73\xdb\xbb\x51\x9d\xe8\x15\x36\xab\xab\xf8\x44\x4e\x20\x3f\xe5\xf0\xbd\xce\xca\xb2\x2f\x1f\xd0\xcb\x23\x54\x5d\x67\xbb\x98\xeb\xe3\x16\xcb\x41\x57\xf2\x3b\x90\xed\x23\x35\x84\xb0\x67\xd9\xc7\x6d\x74\x79\x2e\x1a\x42\x1f\x8b\xe8\x9e\xb4\xce\xf2\x94\x80\xce\x41\xd1\xef\x24\xd4\xb1\x43\x2d\x6d\xed\xa0\xff\xc6\x0f\x50\xc5\x36\xbe\x43\x1b\x39\x74\x42\x9a\xd7\xe3\x85\x03\xb8\xc3\x3e\x7d\x82\x3a\xa9\x00\x4c\x14\x82\xf7\x01\xbe\x7e\xa2\x0c\xe8\xf6\x71\x1b\xaa\xa8\xe3\xff\x38\xc0\x39\xb6\x83\x5e\x40\xeb\x6c\xab\x5e\x2f\x36\x69\x99\xac\xbe\xba\x09\xd3\x7b\x86\x4e\xaf\x84\x98\xe9\x2f\x13\x33\xcb\x33\x19\x8b\x1d\xf2\x72\xbc\xa9\x65\xde\xb5\x6d\x55\x17\xdc\xc8\xc8\x3b\x4b\x78\x92\x95\xdb\xb5\x8b\xe4\x7a\x49\x3a\x63\xba\x0d\x52\xc6\x7d\x9b\xb9\x0a\xdf\x04\x15\xbb\x5a\x93\xf9\x14\xa4\x2c\xcf\x42\x67\x07\x76\x0a\x7f\x73\xf2\x37\x5f\xb7\xed\x5a\x3b\x20\x4e\x25\x3a\x0a\x34\x55\xa5\xa8\x2f\xc4\xc5\x70\xc0\xa1\x91\x2b\x71\x47\x98\x5d\x1f\x71\x53\xf0\x83\xc6\xc8\x63\x0e\x5e\x01\xf6\xc8\x21\x98\xca\x98\x64\xc1\xc5\x09\x9b\x2f\x3c\xc7\xaf\xef\xe3\x9d\xe5\xa3\x16\x30\x9e\xa7\xb0\x44\xe0\x7b\xaa\x6c\x8b\x4f\xe5\x94\x2b\x9f\x6e\xf7\x91\x76\x10\x08\x33\xce\x0d\x75\x31\x5e\x74\x28\x1b\xba\xcb\xab\xe8\xa2\x0b\x15\x6c\x1b\x26\xaf\xc8\x85\x7e\xb5\x94\x8b\x7b\x1f\x40\x0c\x6c\x37\xd3\x1d\xc2\x4e\x0f\x6c\x6d\x79\x63\xc3\xa3\xa2\x81\x6c\xf3\x20\x76\x57\xe3\x3a\x51\xf1\x77\x8a\x6e\x24\xa0\x44\xe0\x33\x57\x9c\x4e\x73\xdd\xcc\x6d\x00\x0f\xb6\xfc\xb8\xdf\x8b\x85\x5e\x7b\x58\x24\xcc\x82\x16\x9c\x68\x49\xfe\xa1\xca\xc2\x2a\x0a\xf2\x0f\x55\xa1\xb3\x3b\x9a\x2d\x11\x80\xf4\x56\xe4\x9a\x57\x08\xc7\xc1\xb0\xc7\x3b\x6b\xc1\x70\x88\x77\xde\xba\xad\xd1\x08\x6f\x0e\xf6\xa7\xc1\xb0\xc3\x67\x7b\xc3\x80\xbf\x43\xd9\x9d\x4e\x5f\x4c\x35\x93\x57\x55\xaa\x19\x57\x8a\x4e\x37\x99\x6e\x77\x41\x72\x1a\x8d\x33\x5d\x4f\xea\x39\xf1\xbe\x15\x71\x27\xfb\x3d\xab\xe6\xe1\x59\x88\x8c\xb1\xfb\x60\xd1\xc9\x48\x5d\x39\x3a\x6a\xf5\x55\x09\x8c\xe9\x14\x38\x0f\xb1\x77\x5f\xd9\xc6\xa2\xb2\x04\xbe\x9e\xf6\x80\x18\x96\x8f\xe5\xa0\xb4\x7c\x72\x40\xa6\xb5\x03\x27\xfd\xcc\xfd\xa3\x62\xbe\x66\x43\xc1\x7c\x09\x1e\x0f\x9d\xf8\x10\xdc\x50\x66\x01\x70\x83\x37\x3d\xe9\x4b\xed\x6b\xbf\xb6\xbf\x57\x37\xe4\x46\x9c\x00\x3c\xb5\xfa\xa6\xc1\xe3\x32\x62\x32\x88\x91\xb3\xe1\x92\x29\x10\x9b\x8b\x02\xec\xc1\x45\xce\x4d\xbf\x76\xf6\x30\x86\xa1\x78\x3d\x7c\xa4\x42\xb7\x56\x90\xa9\x36\xb0\x9f\x9e\x9d\xb9\x6d\xc2\x77\x73\x53\x15\x27\xd8\x81\x79\x55\x7a\xfa\xad\x84\x3a\xa2\xc0\x2e\x7c\xa5\x9f\x68\xe3\x05\x40\x1b\x72\xce\x42\xd6\x50\xe3\xe0\xdb\xd2\xb9\xf8\x7a\x45\x65\x25\xb6\xcd\x23\x97\x29\x99\xcb\x63\x29\xc7\x5c\x1e\x13\xc3\x0d\xec\xd3\x2d\x54\xcb\xc4\x42\xa7\xc1\x8b\xef\xf9\x0f\xd5\x4c\x00\x49\x51\x90\x22\x05\xef\x49\x3f\x81\xb5\x11\x82\xb7\xab\xea\xe8\xe0\xc2\x14\x5a\xdc\x6f\x22\x6e\x96\x0c\x2d\x32\x3a\x92\xaf\xf3\x36\x51\xc7\x8b\x97\x84\x90\x2d\x0b\x65\x5c\x14\x91\xe5\x31\x12\xbc\x8e\x82\xb1\xd2\x4a\xc1\x9b\x4f\xce\x51\xf4\x61\xd9\x5b\x59\x35\x16\x72\x55\xfc\x0f\x78\xc5\x42\x52\x88\x80\x37\x2a\x34\x2f\x8a\x76\x1b\xfb\x89\x76\x0d\xf6\xee\xa2\xaf\xd4\xf1\x17\x02\x35\x9a\x55\x2b\xd6\xb2\x62\x9c\x5b\x55\x95\x4d\x43\x16\x22\x9c\xe2\xe8\x3f\xff\xc5\x6c\xf9\xf5\x55\xad\x5a\xa5\x9b\x94\x95\x7c\x95\x1a\x66\x95\x19\x6b\x30\xee\xff\x75\xad\x6f\x18\x57\x8d\xb6\x64\xf9\x0f\x76\xad\xb4\xff\x3e\xd6\xad\xd8\xb5\xdc\x6a\x4c\xe1\x71\xdd\x55\x7a\x83\xe7\xa1\xe3\x9a\x3c\xfb\x4d\xc7\xf1\x8c\x72\x5d\x3d\x81\x77\xa3\xd8\x9c\x4d\xaf\x8d\xf9\x7c\x74\xb9\xf3\x36\x3b\xef\xd2\x28\x7e\xf3\xf9\xe2\x1e\x88\x4a\x52\x10\x55\xba\x0b\xac\x61\x9c\x89\x9e\x5e\xcb\xd6\xb0\x7a\xd1\x9a\x21\x1d\x40\xcd\x48\xaa\xee\xe9\xec\x4f\x0c\xb2\xb4\x5e\x61\x12\x0d\xa0\xbc\xb8\xe5\x26\x4b\xdc\x9e\x8b\x5b\x80\x66\x68\x99\x3b\x8c\x04\x8d\xa8\x72\x6f\x5e\xb3\x73\xd5\x0a\x76\x61\x48\x48\xdf\x53\x14\x81\x1c\x34\x7b\x86\x8d\x33\x59\x03\xc5\xe3\x11\xab\x40\x0d\xc0\xc6\x46\xf5\xc1\x64\xdd\xe2\x67\x0a\xd0\xa8\x9c\x43\x8e\x8a\x1e\x0f\x66\x40\x16\xbd\x1b\x51\x33\xba\x42\x54\x36\x8a\x81\xbc\x58\x42\xbb\xa4\xf5\x94\x82\x91\x34\xa7\x58\xb1\x2f\xe5\x57\xbc\x5f\x9e\xf9\x99\x47\x47\x64\xd0\x0c\x3e\xa2\xb1\xef\x4d\x87\xae\x2b\x3a\xeb\x07\x25\xab\xd9\x85\xe4\xeb\x2e\xaa\x3e\x19\x7e\x77\x10\x16\x78\x7a\x18\xa2\xdd\xef\x4d\x07\x63\x40\xf5\xa9\x24\x24\x3e\x0f\xc5\x17\xdb\x2e\x04\x6f\xc9\xdf\x93\xd4\xfa\x04\xaf\xaf\x01\x64\x26\xc5\xc9\x4d\xa7\x64\x69\x25\x88\x6c\x17\xba\x27\x2a\xa2\xda\x11\x5e\x86\x19\x29\x3e\xc9\x61\x60\xc9\x36\x63\x9f\x98\x4b\x6b\xd3\x47\xfb\x6d\xf3\x00\x5e\x59\xae\xfd\x10\x0a\xf2\xc8\xa3\x0a\x9e\x0e\x97\x94\x16\xaa\x94\x2d\xf0\xc2\x8f\xd6\xc2\xcd\x49\x7d\xf9\xda\x8d\xdf\xbc\xfe\x99\xa8\x56\x18\x32\x99\xee\x5c\xb9\x5c\x8b\xd7\xf1\x4a\x93\x87\x02\x73\x13\x24\x4f\x81\x54\x10\x60\x7b\xf6\x7b\x2f\x76\x97\xfb\x87\x60\xa3\x62\x77\x83\xed\x5f\xb1\xa3\x95\x5e\xa4\xde\xfb\xde\x72\x1e\x1f\xac\x5f\x73\xcd\x17\x84\xdb\x3a\xc1\xb8\xae\x5d\x8d\x63\x07\x87\x72\xa4\x67\x06\x46\x87\x9e\xe9\x60\xda\x25\x16\xc7\xb5\x39\x54\x82\x29\x03\x2c\x85\x5d\x2e\xfd\x9a\x17\x44\x62\x3a\x87\x9e\x43\xa8\x80\x69\xa1\x60\x72\x7e\xcd\x96\xc1\x2c\xb8\x6f\x9d\x87\xe6\xc6\x06\xfc\x0c\x43\x60\x75\x1c\x7a\x1b\xe2\x25\x3b\x20\x28\x40\xdc\xba\x98\x39\xaa\x68\x50\x35\xce\x71\xb0\x56\x64\x90\x6e\x68\xf8\x5f\x5f\xa1\x62\x0f\xf8\xae\x61\x18\x91\x42\xc8\xd5\x44\xd7\x5f\x58\xaf\xea\x1b\xd9\x5a\x14\xaf\x1f\xe2\xbe\x19\xa0\x4a\x74\x04\xe1\xd0\xc9\xbd\xab\xe2\x89\xe0\xa9\x7d\x69\x50\x55\x8a\x10\xd2\xeb\x16\xc8\xdf\x81\x38\x1d\x22\xef\x64\xae\xcd\x56\xd5\x96\x28\x6a\x3a\x4a\xf0\xe7\x3d\x5a\xa2\x5e\xbf\x3b\xe0\xde\x78\x09\xcf\x5f\x96\xe7\x97\xe1\xb6\x39\xb7\x8f\xa6\x1a\xaf\xe5\x29\x22\xdc\x6d\x39\x2e\xf0\x7a\x8f\x42\xa5\x83\x3d\xbd\x45\x49\x08\xd8\x3d\xe7\x51\xb2\x7d\x77\x42\xc0\x86\xa7\x47\xfd\xe4\x3e\x2f\x2a\xf1\xb0\xd2\x79\xf1\xf0\x79\x75\xdc\xb2\x96\x07\x28\xbb\x37\x58\x9d\xa1\xdb\x22\x4d\x3c\x90\x95\x0a\x1f\xa2\x27\xc8\x15\xf9\xee\xe8\x40\xb3\x7b\xb2\xf8\x5d\xec\xbd\xbd\x50\x04\xdb\xbb\x5d\x19\xac\xf8\xd1\x7f\x7d\x85\x9e\x52\x44\xbe\xc6\x32\x89\x48\x10\xf1\x86\x65\x83\x3c\x24\x36\x4b\xcc\xdb\x5b\x66\x2f\x11\x65\x45\x31\xcb\x75\x97\x45\x28\xd3\x79\x56\x79\x6b\x88\x1c\xde\x08\x43\x39\x0c\xdb\x54\x7e\x21\xab\x48\xbc\x37\x41\x37\xcf\x23\x91\xec\x2e\x21\x13\xd1\x82\x03\x19\xec\xea\x99\xf4\x51\x45\x5b\x98\xc0\xe1\x8d\x60\x95\xa8\xcf\xa0\x2b\xc9\x60\x66\x7e\x7f\x2d\xca\xf6\xd4\x6c\x75\x02\x0b\xfd\x49\x0a\x46\x35\xf2\x47\xc3\xd5\x91\xd7\x30\x79\x82\x6d\x08\x86\x74\xd6\xf8\x36\x87\xa6\x33\xc8\xae\xb9\x74\xf8\xb8\xb1\x71\x6f\xf9\xd4\xfb\x78\x28\x33\x3c\x6f\x4b\xa1\x92\x6b\xee\x49\xc7\x55\x34\x6b\x8d\x56\xcf\x5f\x7a\x46\xae\x8c\x09\x86\xe7\x96\xa9\xc3\x55\x2d\x41\x3b\x14\x1d\xcd\x8f\xb9\x5d\xc0\x80\x45\xdf\x97\x70\xcd\x91\x5a\x86\xca\xfb\x62\x0f\x04\xce\xb9\x56\x67\x61\x34\x5f\x52\x25\x13\x22\x59\xd3\xca\x96\x8e\x13\xd6\xda\x75\xa8\x57\x57\x57\x6c\x60\xcb\x1d\x7b\xce\x85\x13\x3c\xa1\xec\x45\xd5\xb0\x17\xd5\xce\x4c\xc1\x18\xd9\xf9\x69\x3c\x98\x20\xc7\xb5\x86\x19\x95\xf2\xd1\xd1\xb8\xaa\xba\xfe\xe8\x8b\x89\x35\x4c\x84\x8d\x45\x3e\xd4\x74\xee\x31\x3a\xe7\xf6\x34\x0d\x1f\xd3\x5a\x1f\x56\xd9\x23\xc9\x75\x43\xb9\xc0\x7f\x2e\xe1\x9a\x64\xa0\x41\xa3\xee\xfb\xb8\x7b\x95\x0c\xbc\xa2\x77\x5a\x5e\x7b\x20\x3b\xe1\x9b\xcc\xc5\x70\xe5\x3a\xfa\x96\x93\x81\x10\x21\x13\x5b\x8c\x73\xb9\x2a\x37\xc8\xe1\x4c\xe2\xdc\x11\xff\x1b\x95\x1f\x71\x29\x7b\x7d\xcb\xad\xb4\xb1\xa8\x0d\xf7\x8c\xd5\x20\xcf\xe8\x4b\x16\x20\x17\x90\xda\x16\xd2\x63\xbc\x3e\x2f\x1d\x38\x8e\x18\x5e\xa0\xe7\xb5\x6b\x4f\x1e\xd2\x8d\x91\x45\x28\x24\x44\x8d\x51\x24\x6a\x0c\x34\x8e\x9e\x3f\x3b\xbf\xe6\x30\xda\x23\x41\x59\x6f\x9c\x91\x1c\x6d\x7e\xb8\x44\x05\xcd\x25\x58\x5a\x86\xb0\x64\x25\xb8\x5f\x62\x9f\x92\x54\x25\xa2\x22\xb2\xe1\xe5\xcc\x87\xa2\x25\xae\x49\x4b\x56\x2c\x62\xad\x3f\x51\x35\x4a\x0d\x8a\xf2\xed\x89\x4e\x17\x71\xe9\x29\xb3\x9a\x25\xcb\x34\xe1\xcd\x51\x55\x94\x08\xab\x47\xa3\x4c\xe1\xf3\xb0\x0a\xe1\xd9\xe5\x9f\xac\x57\xdd\xe3\xf8\xc1\x36\x9e\x66\x9b\x4b\xd2\x98\xa1\xb1\xdc\xfc\x46\xd5\x48\x86\x24\x91\x88\xa3\x1e\x26\x52\x5c\x1c\xf2\x31\x5f\x1b\x73\xb7\x13\xc4\xbc\x78\xf1\xf1\x5a\x27\xe0\xa3\xf1\x5a\x5e\xf9\xe9\x7a\x27\xa3\xc1\x1f\xc2\x1a\x78\x8b\xbe\x81\x74\x15\x07\x94\x61\x2d\xbb\xd6\x9d\x40\x01\x37\x40\x2f\x4a\xe4\x0e\x68\x44\x57\x19\xa2\x82\xb9\xe5\x05\x73\xab\x0b\x26\x66\xe8\xf6\x51\xb8\xbc\xf1\x32\xc3\x0f\x64\x26\x34\xfa\x80\x27\x53\x99\xf1\x07\x46\x81\x0b\x0d\x85\x32\x69\xc4\x4c\xf2\xc5\x85\x8a\x2b\x4b\xd0\xe8\x2b\xf7\x8d\x5a\xa7\x5e\xec\x49\xc6\xb6\x27\x50\x12\x6f\x73\xba\xcf\x56\xdb\x2e\x58\xf8\xd9\xe9\x91\x44\x03\x84\x06\xd8\x75\xd6\xc6\x98\xd4\x40\x8f\x7a\x42\xc4\xec\x40\x21\xa8\x37\x67\x6b\xfb\x73\xac\x70\xf0\xfa\x2a\x8a\x0e\xcc\xa2\x24\x34\x88\xd2\x03\x79\x09\x51\xec\x40\xc4\xa3\x05\x86\x87\xb1\xfe\x10\xfd\xa8\x91\x4f\xb3\x00\xbd\xa7\xd1\xb5\xfb\xc8\xb3\x5a\xcb\x47\x77\x53\x3d\x41\x86\x52\xef\x6c\xbc\x80\xff\x26\x32\xc2\x79\xeb\x0c\x40\x22\xef\xd1\x79\x1e\x34\x34\x00\x9a\x0b\xe0\x46\xc7\xb3\x89\xc9\x47\xfb\x77\xde\xea\x8d\xd6\xe0\x71\xe6\x75\x02\x74\xd8\xb4\x0e\xa4\xae\xf1\x60\x0d\x18\xee\xba\x50\x87\x4d\x0e\x34\xe7\xc2\x78\x5b\x2c\x92\x50\x3b\xc0\xed\xc1\xd6\xe0\xd3\x85\x75\xa0\xfd\xad\x96\x25\x87\x31\x42\xb2\xbf\x8e\x39\xec\xb0\x3e\x7a\xe7\x44\xf4\x8f\x7a\x04\x1d\x79\xf7\x97\xee\xc8\x5f\xef\x32\x7f\xa1\x93\x00\x1a\x13\xa1\x2a\xe2\x87\x00\x39\xc6\xa5\xef\x31\xb9\x04\xa4\x01\xb8\xda\x0b\x02\x69\xd6\x00\x19\x03\xbc\x77\x77\x67\x8d\xab\x6c\x54\x35\x4e\x2d\xd6\x17\xbc\x52\x2c\x77\x3e\x22\x68\xba\x2d\xae\x2a\xcc\xc7\xc4\x71\xde\x3e\x2e\x21\x5c\x38\xa3\x20\x36\x80\xac\x07\xb2\x00\xfa\x74\xfc\x35\xfc\x80\x06\xe7\x23\xfa\x3b\xc6\xbf\x73\x7d\x90\xb4\xb1\x41\x99\x72\xcc\x54\x9c\x8e\x5f\xe2\xea\xde\x89\xde\xc3\xcc\xd5\x8a\x76\x66\x17\x83\xa4\x13\x4a\x3d\xea\x72\x23\x3f\x56\x6e\xf1\x60\x0a\xa8\x8e\x62\x6c\xa0\x8a\xd1\x40\x15\xa3\x81\xc2\x71\x9a\x24\xc6\x09\x6b\x4a\xe8\xd7\xe4\x3e\x4e\x8e\x2d\x5d\xc1\xca\x29\x68\x04\x21\x72\x15\x21\x92\x97\x40\x64\x1d\x68\x63\x43\x1c\x02\xc7\xe6\x42\x54\x80\x01\x0a\x86\x3a\x56\x40\x60\xf4\x7d\xaa\x77\x92\x56\x5b\xef\x24\xdf\x5d\xfd\xf8\xd0\x85\xc7\xf9\x94\xa6\xe3\xf8\x51\x30\xe3\xe2\xed\x47\x68\xbe\xdd\xcd\xf0\xe6\x28\xcd\xd0\x31\x70\xf3\x79\x26\x82\xd0\x65\x91\xad\xa7\x1c\x0b\x61\x78\xdb\xc2\xb2\x17\xda\x45\xa2\xa0\xde\xbe\xbb\xe6\xdb\x43\x17\xdf\x62\xf1\xaf\x1f\x63\xaf\x3f\xc2\xd8\xeb\xdd\xcc\xb4\xc8\xa4\x5d\xa7\xdb\x9f\x06\xdf\xfb\x89\x5d\x03\x44\x41\x25\xb3\xb4\xda\x76\xc9\x68\x4e\xfe\xe2\xed\x88\x3c\x60\xbe\xcc\x82\x93\x99\x95\xa8\xfe\x9d\x18\xdd\x9c\x3a\x66\x86\xbc\x07\xd2\x1e\x46\x42\x24\x2d\x62\x1e\x9d\x1a\xa4\xd6\x63\x00\x21\x07\x86\x97\xec\x62\x00\x29\xc4\x36\x20\x2a\x2e\xd3\x71\x57\x38\x2c\x59\x8f\xf7\xc8\x74\x7f\xcc\x87\x63\xb1\x88\x45\x7d\x40\x82\x72\xc6\x36\x2e\x40\xce\xc5\x40\xc6\x93\x7a\xc4\x1f\x17\x70\xc7\xfd\xac\x19\x0e\xc4\x21\x37\xe5\xe4\xf5\xdd\x2d\xfd\xc1\xc5\x1d\xd5\x78\x4d\xe5\xea\x66\x9f\x69\xc7\x53\xf5\xab\x5f\xbc\x55\x52\x4f\x39\xee\xfb\xbc\x1e\x0e\x74\x65\xb0\x38\x0c\xc3\x06\xff\xbf\x37\x06\xde\x64\x38\x45\xdf\xc8\xf9\x85\x21\xc8\xff\x83\x21\xd8\x5d\x32\x04\xa9\xed\xe4\x20\xec\xc4\x06\x21\x36\x5a\xf1\xb1\x8a\xbd\xe6\xe3\xaf\x5b\x62\x85\xae\x1e\xbe\xdd\xdf\x0d\x5f\xf5\x69\x99\xc0\xb7\x74\xec\xf8\x9f\xc7\xae\xd3\x1f\xe1\xd8\x6d\x13\xb9\x34\xc7\x6e\x3b\x81\xf1\x2c\x81\xe0\x76\x62\xb1\xc1\xac\xf2\xa1\xb7\xc0\x48\x09\xd7\x2c\x20\x6b\xa4\x9c\xa3\x07\x2b\x40\x1a\x09\x83\x7d\x8c\x8f\x40\xa3\xc2\x92\xac\x15\xe4\x3f\xa9\x18\xfd\x11\xd6\xb2\x68\x5e\x17\xbd\xe6\xa4\x3f\xe6\xda\xcb\x8b\x71\x70\x51\x1b\xcc\xe4\xca\x33\x99\x73\x00\xe1\x7b\xdf\x52\xc6\x2f\xc8\xdc\x51\xca\xef\x4f\x31\xa8\xc9\xf4\xd1\x03\x19\xe7\xa5\xf0\x37\x45\x07\x2b\x0d\x03\x84\xf4\xf1\x03\x9d\x27\xa4\x8e\xc5\x67\xb5\xe2\xc5\x60\x6d\xd9\xc5\xd8\x60\x25\xa8\x83\xb6\xc6\x91\x8a\xd0\x99\xa3\x62\xd3\xe2\x14\xc3\x87\xc5\x15\xd2\x98\x26\x55\xa2\xbf\x03\x7a\x29\xa8\xc0\x91\x1d\x3e\x60\x5c\x56\x5f\x9e\xfb\x0b\x8f\xd3\xa1\xfd\x1e\xbd\xe4\x6d\xc2\x1e\x1a\xbe\x77\xfc\xa2\x87\xb9\xbc\x68\x77\x31\x6d\x02\x24\xfb\xd6\xcc\x78\xfd\x11\xea\xe9\x7b\xf0\x38\x6a\xf5\xf0\x71\xe0\x6c\xbf\xdf\xda\x14\xaf\xe1\xfb\xbc\xfd\xde\xca\xa5\x44\x3e\x7c\x43\xc7\x1a\x41\xca\xea\xa4\x07\x9b\x3d\x7b\x93\xb3\x89\xd3\x48\x59\xbd\xd4\x60\xb3\x63\x6f\xba\x45\x2f\xe5\x84\xc5\xa8\xda\x62\x54\xad\x14\xb8\x1b\xdc\x1a\xb1\x09\xc3\x1a\x52\xb2\x06\x2c\x9f\x16\xe5\x21\xbd\x43\x29\xbd\x4d\x57\xef\x6b\x62\xe4\xf4\xd6\xf6\x54\x4d\x8a\x08\x1c\x29\x7c\x74\x71\x99\xe3\xd4\xa1\x84\xf0\xb9\x11\x85\xec\x0d\x45\x72\x80\x8c\x2c\x6c\x65\xb5\xb0\xbe\xc9\x71\x52\x03\x20\x11\x56\xc8\x3c\xf2\x9a\xe9\x33\x3f\xd5\x46\x3f\x2b\x29\xa7\x3d\x9f\xbf\x59\x1d\x22\x9e\xd0\x74\xe2\xd5\x8b\x58\xa9\xa3\xd0\x65\x9f\xcc\x8e\xb1\x5a\x47\xe1\x8c\x4a\x82\xfd\x56\x21\x8e\x4a\x82\x9d\x44\x2e\x38\x79\xb0\x73\xfc\xa8\xbf\xa9\xc5\x88\xcb\x47\x4d\xbf\xfa\x06\x38\x96\xd8\x14\x51\x7f\x8b\xb0\x3d\x57\xd1\x1e\xe7\xb9\x8a\x8a\x72\xda\x9c\x71\x25\xe1\x7b\x4e\xbd\xc3\x3a\xc3\xf7\x6d\xf5\xee\x8a\xf7\xbc\x7c\xc7\xe9\xc1\xf7\x2d\xf5\x0e\xb8\x6a\x98\x81\x1f\x2b\x6f\x75\x08\x44\x14\xcc\x48\x9c\xbc\x44\x5c\xdc\xb4\x5a\xa4\x39\x32\x90\x1c\x10\x1c\xaa\xe5\x75\x92\x7f\x51\xc1\x12\x73\xd9\x7c\xfe\x6c\x4d\x97\x1d\xaa\xbc\x95\xfd\x8c\x68\xdd\x65\xbf\x97\x1e\xb5\xba\x03\x10\xab\x06\x40\xf6\xf0\xec\xb7\x76\xb4\x57\x8f\xb8\x0a\xb6\xf0\x04\x98\x00\x58\x5b\xd4\x43\x6d\x14\x38\x7e\x54\xd9\xe8\x29\xa7\xb7\x7a\x3d\x21\x6f\xa3\x69\x30\xca\xfd\x08\x55\x39\x7a\xca\x25\x09\xe6\x0f\x9e\xec\x4f\xe4\x83\xda\xd1\xd8\x72\x16\xb3\x02\x9a\xc5\x6c\xec\x87\x17\x5a\xe9\x02\x1c\xe6\x20\xf2\xd1\x7c\xcd\x55\x48\x35\x01\xeb\xa0\x8f\x16\x84\xc6\x29\xd6\x57\xc7\x97\x4a\xc6\x3b\x6b\x56\x65\xc3\x0b\xd4\x18\xcc\xa4\xc6\xc0\x0d\x95\xda\xf5\x69\x02\xb4\x00\x98\x96\x67\x64\x38\x15\x0c\x2f\xd5\x98\x5e\x66\xd0\x2f\xc9\xa3\x6c\x7c\x66\x1c\x2a\xc7\xa3\x8f\xf3\x36\x29\x69\x56\x5b\x89\x50\x06\xa8\xfc\xbc\xbd\x2a\xc7\xa1\x5b\xf2\x55\x74\x6a\x0c\xfc\xf4\x28\xb6\x38\xf4\xe5\x40\xa1\x32\xe8\x65\xaf\x6e\x97\x8c\x90\x16\x68\x98\xaf\xd2\x93\x7a\x93\xbd\xaa\xa1\x00\xa1\xf6\x35\x76\x95\x5c\x74\x14\x45\x3d\xa3\xfb\xfe\xf3\x05\xd3\xe5\x76\x07\xa3\x52\x48\xdb\xe8\xfe\xa2\x69\xb6\x30\xb6\x34\xc1\x1f\xb4\xe5\xb7\x68\x37\xc2\xfb\x2c\xfe\x8a\x2d\x12\xbd\x97\xb1\x1e\x1b\x08\x08\x47\x4e\x1b\xef\xfc\x03\x23\xe5\x39\xa1\xe3\x54\x0e\x4b\x5e\x2a\x48\x8f\x0a\xf0\xdc\x3a\xc2\xe7\xf7\xf9\x82\x97\x1a\xc5\xf6\xbe\xd3\x96\xac\xd1\x85\xfd\xc9\x83\x3a\x55\x8d\x08\xf2\xfe\xb2\x89\x10\xeb\xd0\x18\xa2\xfd\x84\xf1\x28\x2c\x2f\x0c\xac\x67\xb0\x4a\xc2\x9e\x7f\x14\x8c\xbf\x0f\x79\x6f\x04\xd4\xb5\x1b\xdf\xe0\x28\x86\x0b\x1e\x31\xbd\x4d\x16\xd3\xc6\x1a\xa3\x49\xa3\xd1\xf2\x5a\xf0\x45\xf9\x76\x1e\xf0\x21\x88\xd6\xe3\x60\x88\x8a\x0e\x6a\xa0\x21\xe9\x65\xb3\xed\xc8\x9d\x72\xf2\x20\x2f\x61\xc9\x2f\xbe\xfc\x0d\x60\xbf\x9a\xcf\x6f\x9c\x7d\xc2\xde\x24\x31\x36\x3a\xba\x2f\x8f\xab\x1b\x6d\x26\x2b\x64\xb2\x42\x26\x9b\x62\xb2\x62\x26\x2b\x16\x9a\x2b\xb3\xaf\x2b\xa6\x9d\x1c\x27\xc5\x63\xb8\x3c\xe2\x29\x0f\xfd\xf8\xe2\x27\x10\x3f\x0d\xdb\x5e\xf4\xf6\x3e\x56\xf5\x2f\x1f\x09\xae\x47\x40\x1a\x40\xc3\x18\xc8\x5b\x33\xcd\xb6\xba\x1c\x03\xe3\x21\x2f\xc7\xc0\x88\x34\x16\xf8\x89\xcb\xab\xc5\x13\x14\xac\x1a\xfe\xe8\xda\x39\xfc\xd1\x0d\x70\xf8\xa3\xdb\xe0\xf0\x47\x37\xc3\xe1\x8f\x6e\x89\xc3\x9f\x78\x63\x97\x8b\x51\x36\x64\x6b\x9b\x51\x4f\xf4\x63\x08\xa9\xae\x6a\x07\x1f\xe3\x44\x32\x70\x97\x57\xe6\xb7\x53\x0e\xdf\x94\xf5\xa6\xdc\x4d\x59\x97\x02\x4b\x7f\x9c\x3c\xa8\x8f\xcd\xf6\x22\xc3\x3a\xec\x8f\xd1\x04\x75\xf9\xd1\xb3\xc0\x19\xf2\x48\x82\x6c\x0a\x5a\x3d\x49\x36\x85\xa3\x4c\xee\xc7\x17\x41\xc0\x38\x4b\xa3\xb3\x41\x37\xed\x6e\x06\x29\x0f\xf8\x13\x0f\x9e\x78\xda\xdb\x0c\xb4\x41\x0c\x8c\xb5\xef\xc4\x40\x85\x29\x70\x71\x64\xbc\x94\x8b\xa3\xe2\xeb\xe1\x77\x71\x64\x30\x15\x46\x45\xcf\x30\xc8\x06\xf0\x97\x92\x03\x4c\x96\xd5\xc2\xac\xf9\x6a\xb9\x44\xa8\xb2\x58\x6d\x73\x69\xb5\xc1\x42\xb5\xb1\xe9\xdc\x5b\xbe\xa2\xca\x4f\x3c\x55\xfb\x87\xeb\xa9\x4e\x56\x6b\x36\x9a\xfb\xc1\xf0\x9f\x3f\x27\xa6\x56\x6d\x6b\x42\xc5\xe1\x0a\x59\x0d\x64\xd3\xcd\x00\xb5\x1d\x45\xfb\x17\x1e\x9d\x34\x52\xa9\xba\xb4\x19\x92\x2f\x5e\xcd\x87\x1f\x27\xd0\xd8\x10\x2a\x6c\x48\xc9\xf6\x13\x59\x00\x27\x42\x85\x13\x29\x09\xda\x5c\x5c\x7d\x5d\x79\x48\x80\xe7\xee\x6f\xb3\x05\x5e\x52\xb3\x46\x2b\x47\x72\x00\x21\xbd\x86\xea\xd5\xa7\x57\x5f\xbd\xc2\x5c\xd0\xca\x92\xaf\x4d\xfa\xda\x54\x5f\x03\x7a\x0d\xda\x85\xb7\x39\x73\xa3\x3f\x90\xec\xeb\xf7\x71\xa4\x93\x12\x5b\xb7\x5a\x38\x2f\xbe\x5c\x37\xb5\xc3\x71\x1d\xaf\x25\xdf\x59\x07\x55\xf6\x9d\x74\xff\x07\x72\x27\x7f\x89\x8e\x52\xd5\xc3\xcd\x4c\x3d\xad\x3c\x85\x79\x24\x73\xb2\x70\xe5\xf7\x17\x3a\x0d\xe5\xbe\x7f\x34\x05\x1a\xfe\xad\x35\x1a\x07\xbd\x60\x99\xa1\xd8\x37\x69\x36\xf5\x18\x33\xb0\x1b\x06\xa8\x95\xf9\x53\xd9\xca\xd2\xb2\xfb\x26\x4c\x07\x68\xa6\xb5\x1f\x8d\xcf\x95\x2a\x62\xaa\xf7\x0e\xab\x51\x9d\x07\xe6\x65\x4c\xc5\x1b\x35\x7d\x2d\x76\x94\x03\x71\xe1\xe0\xb0\xca\x0e\xe8\xc4\xea\x90\xc6\xf1\x05\xf1\x42\x18\x9d\x20\xf4\x6a\xfc\xca\x41\x8c\xa2\xbe\xf0\xb8\x61\xe3\x8b\x9f\xb9\xd9\x8a\xce\xcc\x6e\x32\xde\xaa\xfb\x5e\xb5\x96\x57\xc7\x0c\x4d\x7f\x91\x44\x43\x73\x7a\xbe\x33\x07\xb1\xfa\xce\xbd\x95\x33\x34\x34\x95\x7c\x47\xc6\x08\x1c\xc6\x46\x40\x0c\xeb\x9d\x75\x54\x65\x87\xa6\x36\xf2\x58\x22\x5f\x62\xbc\x20\xe7\xb1\x18\x19\x9d\xf3\x64\x65\xce\x93\x44\xce\xaf\x7f\x84\xe2\x6b\x02\x8a\xd3\x3f\x96\x38\x4d\x94\x38\xfb\x63\x89\xb3\x44\x89\x73\x62\x09\x0d\xe8\xe9\xb6\x2c\xd7\xb7\x31\x50\xfd\x79\x67\x9d\x57\xd9\x71\x15\x65\x17\x78\x4a\x30\xec\x32\x9f\x30\x46\x56\x9a\xc4\x47\x9f\x29\x7d\x21\xcc\x5a\xab\x29\xdc\x45\x9c\x0b\x55\x69\x60\x4e\xda\x5c\xa6\xf2\xc1\x20\xe8\xf9\x07\xcd\x56\x67\x09\x0e\xa8\x33\x58\xb2\x2b\x5b\x80\x20\x0a\xab\x94\x65\xae\x13\xc1\x53\xe4\x40\x33\xb9\xba\x80\x09\x70\x1c\x06\x0a\x3a\x10\xb1\xe2\xf7\xe9\xab\x49\x56\x74\x61\xfc\x30\x4d\xee\x42\xe8\x35\x51\xee\x1c\xf0\x28\x37\x91\x6f\x5b\x8a\xfb\xb8\xd8\x02\xee\x83\x9e\xd6\xdb\x4a\xd0\xbb\xa8\x9a\x24\xec\x72\x8b\xd2\x2f\xab\xa4\xa5\x52\xf7\x9c\xd6\xdb\xd4\x08\x0c\xf7\xb7\x2a\x3b\xaa\x9a\xd6\x07\x17\xe2\x2a\x35\x64\x91\x77\x76\xe9\x91\xf4\x3f\x08\x0e\x6a\x6c\x30\xb8\xd3\xb7\x2d\xb4\xc4\x02\xa0\x50\x47\x83\x09\x17\x5b\xb6\xc8\x2b\xd5\x42\x98\x85\x92\x41\x1c\xdb\xda\xcd\xca\x7a\x5c\x3a\x10\xf8\x26\xee\x7e\x04\xe3\x83\x00\xad\x89\x97\x99\x65\x62\xcf\x79\xd4\x73\x77\xa1\x5b\xb5\x50\x5d\xae\x5c\x87\x8e\x14\xf7\x9f\xac\x6f\x4b\x2e\x2c\xa9\xf1\xe2\x7a\xbc\xfe\x54\x13\xdd\x7d\x4a\x56\x25\x2b\x82\xbc\x74\x43\x29\x36\xa1\xe5\x7f\x32\xa1\x95\xa9\x9a\xcf\xea\x54\x4d\x67\xf8\xa2\xa6\xb3\xf1\xe2\x34\xd0\xe3\x57\x95\x9d\xc2\x9c\x7c\x7d\x86\xa7\x15\x5d\x82\x7a\xb8\xae\x47\xb2\x74\x47\x4a\x6b\x21\xd7\x01\x00\x49\xe5\xe1\x03\xaa\xc0\xde\x94\x17\xd6\x44\x54\x5f\xa8\x6f\x7c\x02\x0c\xab\xea\xc3\x91\x49\x42\x24\xcb\x63\x13\x59\x90\xfc\x2f\x5f\x08\x65\x08\x5f\x24\xa0\x4c\x82\x89\xc9\xa8\x54\x4c\x24\xa7\x64\xab\x89\xcf\x29\x09\xd6\x3f\xcc\x86\x9f\xa7\x84\x63\xc6\x0c\x5d\xc6\x04\xf9\xc4\xdc\xf8\xea\xc0\x88\xd0\xc0\xc3\x35\x71\x59\x65\x5f\x61\xfc\x2f\x8d\xc1\x9b\x0e\xac\xcb\xe5\x3d\x5f\x47\xb6\xfc\x6e\x56\xe2\x05\xa1\x8c\x59\x39\x17\x6f\x60\xf4\x56\xd4\x11\x1f\xbd\xa7\xaa\xc2\xc6\x58\xc8\x24\xed\x64\xcf\x95\x1e\xf6\x80\x43\xa2\x71\xf6\xd0\xaf\xab\x87\xf7\x2c\x4c\x17\x87\xb9\x42\xfc\x3c\x4d\x1e\xf5\x3b\x79\x5b\x0c\x20\x9e\xf8\x33\xe4\xd5\x12\xe5\xf2\x85\xe8\xe4\x53\x95\xd9\xb5\x79\xc6\x0d\x5e\x5a\xc1\xf0\x00\xd5\xff\xa8\xf4\x8d\x4a\xd3\x4f\x5e\xfc\x6c\x89\x9f\x6d\xf1\xb3\x13\xaf\x79\xab\x10\x9d\x87\x73\x10\xc6\x46\xa4\x30\x1a\x29\x45\xb9\x3c\x9d\x5d\x03\xf2\x81\xf2\x18\x15\xd9\x2e\xa8\xe9\x9c\xc7\x5d\xec\x54\x16\x16\x1d\x8a\xdf\xea\x68\xda\xeb\x58\xd3\x06\xfb\x25\xfc\x9b\x8f\xc6\xa8\x8c\x33\x66\x7d\x00\xf3\x8e\x99\xa5\x2d\x47\xa0\xf0\xfd\x71\x5d\xad\xcd\xab\x8e\xa6\xb5\xc3\x75\xb5\x38\xaf\x21\x51\x12\xdb\x0a\x3c\x86\xaf\xaf\xbc\x29\x97\x20\xbc\x4a\x59\x60\x50\x8d\x37\x3e\xa4\xc6\xa5\xe8\xf0\xb8\x5e\x94\x72\xf4\x70\x5d\x09\x11\xd0\x54\x51\x2a\x99\xa1\x81\x62\xc7\x51\x0d\x14\xa5\x96\x19\x2a\x2f\xca\xad\x86\x5b\x36\x3a\x52\x0c\x9d\x3d\x89\x21\x2f\xe8\x82\x5e\x7a\x3c\xf0\x8b\x42\x95\xd1\x13\xca\x96\x9e\x33\x2a\xa1\x62\x06\xf5\x2c\x3d\x0c\x7b\x56\xc8\x02\x18\x4e\xbb\x64\xb9\x74\x2e\xf6\x95\xdc\x1a\x3a\xfd\x9e\x34\x3e\x1e\x54\xa1\xea\xcc\x34\x18\x8e\x5b\x1e\xef\xec\x75\x5a\x61\xcf\xe9\x90\xfe\xe3\xe4\x6b\x01\x4f\x37\x9a\x25\xff\x73\x50\x5a\x3f\x2b\x54\x0e\x0b\xf8\x04\x3f\xeb\x67\x6c\x0f\xdd\x7f\xb5\x8e\xd0\x92\xaa\x81\x3a\x94\xcd\x90\xb9\xe4\x77\x97\x3c\x7e\x0a\x0f\x6f\xb8\xc2\x36\x7b\x76\xea\x07\xfa\xf4\x74\x85\x2f\x50\xcb\x4b\xb7\xdf\xe7\xed\xcd\xd0\x46\x17\x63\x03\x9d\xde\xa6\xf7\x6b\x7a\x27\x05\xba\x9f\x86\xc2\x6f\x7a\x98\x4a\x6e\xc9\x32\xbb\x9b\xa2\x21\x48\x7a\x46\x03\xe2\x78\x7f\x4e\xf6\x57\x77\x47\x81\x4b\x36\xc1\x1a\x46\xcb\xf2\x53\x81\xfd\x3e\x9f\xce\x8b\x8a\xdf\x6f\x2d\x00\xeb\x2d\x80\x29\x60\x6b\xa7\x3d\xd5\x03\x82\x78\x14\x4a\x20\x63\x10\x16\x47\xcf\x94\x24\xe3\x34\xdc\x7e\xb5\x8b\x07\x94\x22\x23\x3b\x60\x42\x43\x24\x34\x78\xb7\xd5\x99\x69\x7c\xc1\x58\x0b\xc5\x3b\x72\x5c\x98\xf9\xe9\xa3\x5d\xbf\x97\x39\xfb\x84\x36\xe6\xbe\x3c\x0c\xa7\x83\x67\xc0\x8a\x47\xb4\x7f\x28\x0e\xb4\xbf\x81\x41\x15\xe9\x58\xa5\xca\xce\x80\x8e\x55\x88\x8e\x55\x86\x8b\xcc\xce\x39\x32\xbc\xba\xae\xb9\xcc\xb9\x9a\xd7\x36\x4c\xe0\xc9\xad\xc6\xc6\x06\x42\x07\x23\x0d\x1b\xbd\x00\x90\x0b\x00\x55\x55\x26\x97\x8d\x0c\x18\x90\xc0\x4a\x92\xa7\x8a\xad\x6b\x5f\x28\xb4\x6f\x39\x2a\x38\xab\xa8\xe0\x5c\x47\x91\x6d\xb8\x5e\x22\xf7\x32\xe7\x01\xb9\x56\x2c\xdb\xcb\x44\xc7\x23\xb2\x0b\xb6\x49\xee\x7d\x68\xd8\x85\x23\x51\xc2\x0c\xaa\x54\xad\x26\x8f\xca\x96\x8a\x29\x7f\xde\xa5\xe5\x2d\x87\x11\xd0\x01\x18\xe8\x6a\x95\x9d\x90\x0c\x53\x55\xb7\xa9\x68\xd3\xf8\x9a\x14\xba\xff\xd9\xe6\x7d\xf3\xdf\xee\xd5\x4b\x3c\x94\xfc\xf4\x79\x49\x5a\x10\xbf\xc8\x12\x8d\x17\x34\xaf\xf7\x87\xfc\xe9\xb4\xcb\x43\xc9\xb7\xfe\x54\xfe\x3b\xa3\x8d\x9a\xc5\xb6\x5a\xd8\x89\x59\xb4\x77\x51\xa4\x73\xe4\x33\xa9\x0a\x36\x1e\x00\xb8\xf2\x2e\xc5\xd1\x48\xdd\xa5\x40\x6b\xbb\xcc\x68\x28\x91\x1b\xc6\x4e\x7a\x40\x81\x1c\x8b\xa8\x09\x00\x18\xc2\x98\xe8\x92\x9e\xc6\xe0\x38\xe1\x0e\xe7\xca\x34\x80\xfe\xa1\x95\x78\xb3\xae\x23\xcf\xb5\x4b\xb9\x02\x9a\x47\x5e\x55\x19\x94\x05\xe9\x75\xe1\xba\x64\x5c\xa6\xfb\xd1\x36\x2a\xbf\x8e\xb1\x0f\xb3\x05\x59\x07\x52\xa1\xea\xeb\x2a\x9b\x11\x0e\x5c\x4b\x1c\xb8\x89\xb9\x55\xa5\x6a\x45\x37\x6e\x40\xb6\x5c\xf1\x49\xb7\xd9\x38\x8e\x45\x40\xe3\xb5\x6b\x62\x0d\xbc\xda\xcd\x4c\x9d\xec\xe0\x45\xc3\x9b\x59\x09\xff\x28\xf7\x62\x4a\x89\xe6\xa3\x1e\x08\x3d\x57\x04\xed\xa2\x15\xbc\xbe\x36\xc8\x7a\xf6\x3b\x54\x41\x6a\x63\x72\x7b\x30\x79\xa0\xc4\xfb\x19\x51\x33\xd4\xb4\xf9\x36\x1e\x22\x3c\x2c\x3a\x83\x15\x43\x92\x79\xb0\x2a\x6a\x5b\x2b\x3f\xe3\xb6\x26\x36\x35\xed\x2a\xc4\x8b\x32\xfa\x47\xc8\x88\x29\x6a\xd4\xd7\x17\xfa\xff\x23\xb2\xe0\xa1\x07\x3a\xb9\x8a\x31\xe2\xf7\x1d\xf4\xfe\xfd\xbd\xaa\x88\x11\x99\x8a\x1f\x60\x0c\x9b\xe7\xf1\xc2\x70\x71\x4b\x5d\xd8\x7a\x50\x57\x8c\xda\x9d\xd7\x57\x4b\x3e\x49\x87\x23\x1e\x0d\xdb\xb7\x7d\x89\xaa\xed\x8e\x18\xbe\xf8\x29\x76\xbb\x43\x3a\xdb\x85\xb5\xb6\xfc\x88\xe7\x7b\x0c\x66\x35\xa1\xf1\x73\x95\x68\xd4\xf0\x84\x44\x10\x4c\x0c\x03\xe9\x39\xd2\x73\x5e\x3a\x87\xce\x36\x1f\xfd\xba\x75\x18\xa0\x95\x5f\x5f\xa8\xb1\x31\xd9\x55\xc9\x45\x7d\xda\x76\x88\x86\x16\xe4\x94\xc2\x36\x2c\x5b\x09\x07\x60\x3a\x29\x96\x46\x10\x31\x08\x0f\x01\xc6\x88\x0d\xba\x68\x3b\xc6\x9d\x0e\x92\x53\xd8\xd8\x86\xf5\xf7\xb9\x2c\x1a\xf8\x88\xdb\x79\x72\xec\xa2\xfc\x8d\xd7\x57\x51\xc4\xc5\x22\x2e\x16\xd9\x93\x45\x0c\xad\x7e\xa5\x2d\x0d\x44\x35\x9e\x7e\x27\x69\x71\x5d\x9e\xd7\x30\xc3\x57\x53\xec\xe8\x07\x7b\x40\x99\xfa\x1e\x73\x69\x50\xc8\x01\xf5\x80\x47\x49\xb4\x87\xca\x37\xfc\xc6\x71\x1a\x85\x83\x87\x37\x77\x4b\xad\x30\x68\x58\xaf\xa5\xc0\xd1\x7b\x89\x4e\x3c\xc5\xde\x46\xed\x42\xc5\xe8\x3d\x08\xfd\xad\xf3\x8c\xd7\x09\xf8\xf0\x2a\xf0\xc6\x20\xb0\x66\x0d\x38\xa0\x38\xe1\x05\x9d\xd9\xc6\x5b\x12\xdc\x5a\x80\x37\x88\xe4\x94\xbb\xa1\x94\x8b\x13\x21\x96\x71\x43\xcc\x7d\xe6\xb5\x7b\x97\xbc\x73\x03\x97\xfd\xc3\x47\xc7\x23\x87\x5e\x5d\x10\xf3\x56\x33\xe1\x43\x54\xcc\xee\xd5\x93\xf2\x30\x71\xe8\x26\xda\x53\x8e\xf3\x06\xfd\xd8\x4a\xa4\x9e\x45\x9d\xaf\x75\xc9\x41\x20\xcc\xb0\xcc\x4c\x13\x20\x5e\x1e\xbf\xda\x73\x51\xc7\xd3\x44\xce\x79\xe7\x59\xde\x5a\x94\xa5\x91\x2a\xa4\x65\x16\x96\x56\x59\x8a\x0d\x65\x6e\x27\x3b\x1d\xf5\x5e\xf9\xaf\x82\xf9\x89\x81\xd1\x13\x7c\x3a\xae\xa5\xc3\x20\xe9\x94\xef\x6d\x22\x48\x7f\xd5\x36\x1d\x74\xc8\x59\xd4\x6d\x72\x69\x48\xeb\xb9\x38\x6d\xe7\x1e\x8f\xbc\x5d\x13\x4f\x84\x06\x98\xe8\x47\xd7\x33\xeb\xbc\xaa\xda\x59\x74\xc9\x36\xeb\x92\x1b\x8b\xb0\xd3\x77\x91\xf3\x1b\x34\x39\x25\xb2\xd3\x27\xcd\x48\x21\xa2\x62\x37\x5c\xc0\x77\x54\x08\x5a\xc8\x11\x9a\x05\x72\xf2\x6c\x4d\xd1\x59\x0f\xa4\x98\x71\x80\xa1\xa2\xf8\xf0\x64\xc8\x7d\x3c\x4f\xb3\x80\x19\x7b\x42\xa4\xf7\x32\xdf\xe4\xef\xb9\xfc\xbd\xc0\x5f\x58\x6c\xb5\xa7\x3d\x74\xf2\xab\xb9\x36\x7a\xcf\xc1\xfb\xa9\xc8\x40\x20\xa1\xf5\xa0\x84\xa6\x28\xa1\x41\x07\xca\xe4\xd4\x28\xb0\x35\xa0\xad\x67\x13\x7c\xe8\x52\x17\xef\x02\x2f\x10\x94\x1f\xc2\x31\x27\xad\xfb\xf7\x52\x4e\xc0\x02\xe4\xa6\x17\xbb\xbb\x8e\xc8\x2b\x4c\x68\x75\xb3\x4b\x66\xf1\x26\x33\xee\x2d\x61\x3e\x6a\x87\xf2\x3e\x33\xcd\xb3\xd0\xa4\x25\xb2\xb9\x18\x84\x52\x22\x8b\xf4\xbc\x66\x17\x15\x25\x93\x5f\x80\xd6\xbf\xbe\xba\x6f\xd5\x6e\x40\x97\xbd\xe4\x0e\x21\x73\x1c\x06\x96\xd0\xbc\x0e\xda\xab\xcd\x9c\x84\xc7\x1c\xa9\xda\x8a\x6f\xc9\xca\xfe\x47\x02\x1c\x9a\x97\x33\x6e\x32\x4d\xf7\x0f\x95\x96\xff\x17\x95\x6a\x16\x6a\xc5\xc1\xa5\xa8\xb9\xba\xb4\xe6\x58\xbd\x8d\x78\xbd\xa7\xad\xdf\x9e\x62\xab\x8a\x2b\x55\x2b\x09\xad\x0c\xd3\x65\xd6\xdd\x4b\xdc\x52\x19\x2d\xb3\x7c\xe2\x31\x9d\x61\x54\x6b\xac\x26\x3f\x0e\xe5\xfe\x32\x23\xc3\xd8\x2e\x4f\x81\x2b\x15\x62\x90\xd3\x6d\x35\xff\x20\x37\x28\x77\x37\xff\xb1\x15\xa7\xe0\x46\x8d\xb9\xa6\x51\xf1\xc2\xd1\x84\xda\xf3\x69\x57\xbc\x8e\x9f\x53\x60\xe6\x63\x77\x05\x4b\x43\x84\x94\x0a\x1c\xbb\x86\x35\x32\xb0\x11\x6a\x97\x17\xe6\x0d\xe8\x6d\xe8\xfc\xd4\x8e\xed\xf9\x7a\x07\xfc\x61\xb2\x9e\x55\xc5\x0c\x01\x0f\xea\xce\x7f\x08\x1f\x38\x2b\x5d\xcf\x55\xe7\xc5\x1f\xff\x84\x11\xfd\xb9\xf2\x00\xe0\xa7\x56\x9a\xff\x4c\x8a\x57\xcd\x4e\x64\xd5\x01\xfb\xd0\xcf\xe5\x4a\xc0\x9b\xaa\xce\xa5\x42\x1f\x70\x15\xfa\x20\x1e\x89\xf9\xf6\x8f\x7a\xff\x5b\xa1\x52\xbe\xfd\xad\x92\x37\xd6\xa0\xf7\x0c\xad\x79\x33\xd1\xd2\xfe\x93\x75\xbb\x44\xed\x19\x2b\x30\xc4\x02\x43\x51\xc0\x50\xf4\xdd\xfd\x11\xb6\x3b\xad\x5a\xbd\xfb\x53\x1b\xd8\x84\x6a\xe1\xee\xbf\x1d\xb5\xfb\x3f\x42\x76\x2f\x94\x8e\x6f\xa6\x03\x78\x4c\x6a\x09\x63\x0d\xf9\x85\xf0\x58\xdc\xd7\x33\xfb\xbe\xfe\xc7\x16\xd6\x85\x3a\x60\x7d\x99\x3a\x40\x7a\x7c\x26\x8e\xf0\x87\x5b\x8f\xdf\x3c\xe3\x57\xab\xf0\x8e\x5f\x91\xe0\x0b\xc3\xc9\xaf\xfe\xc1\x70\x52\xe6\xff\x66\x38\xdd\xab\x3f\x8a\x64\x62\x1d\x1e\x0c\x1c\x15\x2a\xf7\xf6\xc6\x39\x6a\x6f\x6c\xbc\x3d\x6d\x5b\x3b\xf9\x5d\x75\x20\x29\x82\xbc\xfc\x9c\x4a\x72\x41\x6c\xc6\x55\xf1\xce\x72\xaf\xa4\x38\xe7\x5e\x09\x71\xee\x9e\xaf\x76\xed\xfb\x23\x13\x62\x7c\xf7\xef\xc0\x44\xf6\x4e\x90\x56\x01\xdf\x02\x9d\xf1\x62\x2e\xd5\x23\xe8\x6f\x92\xe6\x92\x74\xbf\x18\xb6\xfa\x27\x72\xa3\x51\x43\x8e\x71\xc9\xfe\x6b\x45\xfb\xaa\xad\xb4\x3e\x91\x99\x94\x29\x6e\x9a\x92\x23\x31\xa6\xe8\xe1\x36\xc1\x2b\x79\xd8\xda\xe1\x31\x30\x3e\x82\xa5\xa0\xf7\x23\x7c\x9f\x75\xe5\x15\x1a\x95\xa5\x2a\x76\xfb\x83\x3f\xb5\x60\xff\xa2\x12\x27\x67\xaa\x52\x2d\xa7\x22\xaf\x52\xec\x0b\xf3\x1c\xe4\x55\x7c\xc9\xab\x94\xa8\xc0\xe9\x19\x03\x7e\xc5\x37\xf8\x95\x82\x4a\xf7\x25\xab\xa2\x2a\xae\x52\x5f\x57\xc9\xa8\xf7\xdc\x3a\x3f\x53\xa8\xa3\xe4\x2f\x89\x40\x4a\x08\x43\x3f\x35\x8d\x4e\xff\xa9\x70\x1d\xce\x6d\x75\x88\x07\x05\x2f\x15\x8b\x7b\x7a\xab\xd3\xbc\x63\xcd\xf6\x0a\x34\xa9\x4a\x1f\x1f\xa6\x74\x7b\x7a\x2b\xdf\x5c\x43\x22\x8e\x58\x77\x39\x67\x26\xff\xad\x57\x1a\xf4\xa9\xfa\xcc\xa1\x53\x4c\x62\xa8\xb0\x78\x98\x5e\x5a\xd2\x5f\x8c\xcc\x34\x3a\x67\xb2\x92\xd4\x28\x48\xc9\x6a\xf0\x51\x35\x52\x92\xbf\xfa\xf3\xe3\xd7\x42\xd9\x16\xd3\x36\xbd\x4c\xc8\x1d\x91\x50\xb9\x08\xe2\x5b\x05\xe3\xe2\x46\xa9\x42\x22\x83\xa8\xd6\x72\x23\x6a\xf1\x5c\x67\xd7\xa1\x32\x45\x8b\xa7\x97\x95\x40\xa6\xe5\x0b\xcf\x51\x12\x06\x9a\xfa\xc7\x64\x16\xc7\x94\x5a\xd4\xa8\xab\x01\x38\x6f\xb2\xeb\x19\x4f\xf9\xd8\x3f\x9e\x72\xbb\xf0\x0f\x1f\xbd\x54\x19\xaf\xf8\xcc\x97\xa9\xca\xd6\xa3\x7d\x8f\x69\x86\x35\x2e\xa7\xa3\x5c\xb2\xdf\xb6\x7f\x67\x06\xe9\x5e\x01\x77\x70\xde\x8e\xb8\x83\xff\xf7\x65\xfb\xa5\x22\xb0\x96\x7a\x15\x3b\x81\x58\x1f\x51\x58\x12\x70\x7f\xcb\xa9\xab\x25\xd5\x3f\x36\xb6\x7b\x06\xfb\xb8\x87\xfb\xb8\x8f\xd6\x67\xb4\xc4\x88\xbd\x20\x52\x1e\x99\xf0\x8f\x31\x2c\x70\x68\x44\xb3\xc7\xa9\xfc\x2d\x0b\xaf\x5a\x3b\x3a\xd5\x1b\x0f\x4b\xc6\xb3\xd2\x4d\xde\xfd\xad\x26\xff\x0e\x7f\xaf\x9a\x3d\x9b\xf2\xd5\xed\xb2\x77\x2d\xac\x24\x3d\xa4\x68\x23\x78\xfb\xb3\xd0\x05\x22\x30\x40\xa9\x7f\x38\x0d\xf6\x30\x04\xf1\xf8\x8a\x43\xfd\x85\x2a\xee\x95\xc8\x42\xed\x8d\x45\xd4\xfc\xe0\xf2\xda\x3a\x81\xca\x7f\x84\xb8\xc3\x09\xf0\x69\x77\x16\xc8\x19\x81\xde\x48\x8c\xd6\x1f\x65\x08\x71\x70\x46\x87\x1b\x27\x0f\x96\xda\x44\x01\xa9\xd2\xc0\x88\x07\x69\xc7\x83\xd6\xc4\xd1\x07\x05\xff\xf7\x37\xfd\x54\xb0\x19\x48\x12\x3f\x72\x42\x8a\xb9\xe5\x3b\xbf\xde\x35\xfa\xbd\x71\x5a\x1c\x64\xbc\x2b\x84\xf2\x48\x83\x89\x64\x8c\xdf\xfc\xae\x30\x12\xde\x88\x27\xa2\xbe\xcc\xc7\x9d\xcd\x11\xde\x60\x10\x47\x2d\xe9\xd1\xfb\x7c\x6a\x82\xc1\x40\xdd\x62\x83\xce\x9f\xac\x49\x4a\x7c\x0b\x30\xd4\xac\x5f\xab\x9e\xd5\x9d\x93\xaf\x76\x01\xbe\x96\x31\xf6\x14\x7c\x0e\x64\xf2\xe8\x18\xbd\xe4\x3f\x3b\x13\xf8\x3b\x73\x46\xc5\x10\x0f\x5d\xd0\xcd\x6b\xed\xfc\xb8\xee\x5c\x1c\x62\x6c\xd7\xef\x1e\x25\x9c\x41\xc2\xde\x89\x5d\xcc\xd2\x1d\xd2\x73\x0c\x8a\x76\x75\x9a\x1a\x20\x55\x89\x48\x4b\x31\xda\x1e\x30\x76\xb2\x74\x24\x6e\x6e\xf9\x87\x2e\x45\x34\x90\x5e\x8b\x81\xbd\xd8\x87\x7f\xd3\x36\xc9\xe0\x67\x87\xac\x13\xdf\x74\x85\x68\x2e\x37\x5c\x61\xb0\x01\xe2\x43\x8e\x42\xb4\x77\x84\x53\x2d\xb5\xc3\x44\x82\x1b\x4e\x68\xc7\x90\xdb\x3a\xbf\x93\xdb\x14\xb8\xbd\x53\x93\x4f\x94\x1e\xbb\xee\x35\xa2\x47\xd7\x27\xc7\x22\xfe\xc1\xb2\xe0\x3d\xa2\x74\xe4\x87\x62\xc9\x0d\x02\x15\xf6\x4d\x9f\x48\xd3\x95\x9c\x13\xc0\xbe\x10\x63\x41\xc0\x8b\xbe\x5e\x10\x3f\x9b\xa6\x7c\xc7\x7f\xca\x97\x17\xf9\x1e\x0e\xfe\x90\x6f\xab\x20\xee\xea\xf8\xb5\x2d\xe9\x42\xb0\xdf\x60\xe8\x81\x90\xa1\xfb\x41\xbc\x0f\xf0\x31\xfb\x59\x9c\xd9\x05\x76\x29\x57\xc8\xb2\xec\xe7\x80\x7e\xfd\x1a\xde\x3a\xab\x25\x4e\xaa\xb7\x45\xbb\xcd\x90\xbc\xfd\xc6\xdc\x00\x8e\x02\xe4\xcd\x96\x0a\xbb\x26\x27\x61\xf1\x45\x5e\xcd\x8d\xd1\xdb\x88\x97\x20\x77\x27\x9d\xf8\x41\xd9\x9b\x3f\x89\xad\xb4\x31\x25\xc4\x56\x53\x58\xd5\x1c\xc8\xed\xcd\x4a\x85\x74\x11\xaf\xa0\x03\x62\x82\xf0\x7d\xd4\x4c\xec\x5c\x1b\x1b\xf2\xa3\x1b\x7d\x74\x8d\x8f\x82\x79\xce\x74\xad\x26\x9e\xc5\x60\x10\x3b\xc9\xba\x48\xbc\x42\x1e\x86\x36\xe6\xaf\x31\x1b\x2c\x02\xfb\x6b\x90\xb0\xb3\xbc\xbd\x89\x6a\x9c\xba\x8b\x55\x2e\x88\xfc\xe6\x4d\xd4\x83\x41\xec\x62\xea\xe9\x6d\xec\x15\x75\x50\x57\x09\x95\x80\xc6\x70\x6a\xe8\x97\x77\x05\x12\xbf\x77\xa5\x62\xf4\x6d\xc3\xc6\xc8\xbc\xab\x5a\xec\xa4\xc0\xbb\x32\x8a\xf9\x57\x49\x23\x4e\x75\x06\x0f\x64\x41\x0a\x52\x2d\x4f\x1d\x50\x3c\x46\xc7\x8f\xc1\x55\xc2\x4f\x4f\xa6\xe5\x17\x17\xa5\xaa\xe0\x8a\xa4\xf9\x80\xa4\x24\xee\xf8\x57\xb8\x27\x07\x57\xbf\x17\xec\x83\xe5\x32\x95\x21\xa5\x70\x72\x9c\xe9\xa1\x09\xc1\x00\x5d\x1e\x36\x00\x1a\x3c\xbc\xc6\xe3\x0d\x7a\x73\xe9\xed\xe4\x19\xfd\x16\xd1\x37\xa0\x83\x94\x1c\x59\x59\xba\xa1\x50\xd4\x6d\x6c\x94\x9f\x20\xdb\xd1\xbe\x39\x9c\xe1\xd5\xa2\x25\x54\xac\xab\x2b\xcd\xa2\x1e\x0e\xd4\x81\x6b\xfb\x40\x1d\xb8\x9e\xb4\xd4\x81\xeb\xd7\x16\x99\x45\x85\x57\xa4\x57\x08\xa3\x61\x11\x8f\xbf\xb5\x23\x83\x9a\xb9\xae\xd9\x2d\x36\xaf\x0c\xae\x30\x2d\xdb\x61\x6e\x5a\xb6\xc3\xf2\x9b\x2a\x4d\x3e\x7d\x6d\x21\xe7\xb8\xff\x64\x85\x4b\x04\x5c\x05\x27\xd7\x70\xc6\x5b\x90\x10\xa4\xe5\x59\x6a\xfb\x20\xed\x42\xbd\x1c\xfe\xc5\xdd\xb0\xb7\xae\x22\x1a\xfe\xbb\x01\x93\x82\x7c\xeb\x8a\x94\x18\xad\x68\x20\x40\x00\x6f\x2d\x81\x2f\x3e\xf9\x38\xf1\x28\xd4\xb0\x87\x2b\xda\xb3\x3c\x32\x82\x78\xc0\x09\x9e\xab\xda\xfe\x80\x3f\x12\x77\xbc\x18\xee\x78\x1a\x77\x4c\x17\x8d\xff\xac\x4b\xed\x2b\xd2\x7e\xb4\x0d\x94\x1f\x58\xed\xab\xa4\x1e\xa4\x63\x0c\x2e\x6c\x71\xad\x63\xe1\x54\xd2\x18\xca\xee\x3f\x6b\xb7\x7b\x45\x3a\x91\x6e\xd4\xee\x1b\xf1\x9c\xd0\x8f\x18\x0d\xd3\x09\x0f\xec\x2a\x47\xcd\xb8\x96\xa4\xf7\xf7\x16\x77\x4f\xa8\x4c\x7a\xb1\xc9\xeb\xfd\x97\x93\xd7\xfb\x47\x93\x27\xab\xb8\x96\xcf\x6e\xcc\x31\x5e\xff\xef\xaa\x56\x92\xaa\x93\x3b\xab\x2f\x74\x26\xc4\x4a\x5e\x39\x01\xaf\x35\x02\xe0\xbe\x3e\x7e\x96\x8f\x86\x83\xda\x63\xd3\x53\x85\x14\x9c\x3a\xe4\x86\xb1\xc4\x0b\x28\xd7\x08\xe7\x14\x80\x53\x11\xf1\x7c\xbc\x32\xca\x10\x43\x08\x22\xcc\xa6\x65\xe4\x4e\x67\x76\x4c\x63\x8f\x07\xb3\xc0\xa3\x40\xd8\xe8\x6b\x63\x69\x75\x46\x6d\x46\x4d\x9d\x2b\x75\x5b\x65\x70\x55\xe2\xe4\xf8\xae\x40\xda\x1a\xf2\xdd\xaa\xb3\x0d\xaf\xe2\x7a\x91\x1f\xb5\x6b\x60\x0f\x8f\x27\x1c\x3d\x0c\x7b\x80\x0e\xce\x29\x3c\xbf\xf8\x3c\x95\x5a\x12\x69\x6f\x44\x00\x0d\xae\xf0\xc8\x0b\xc5\x42\xb2\x81\x21\x3a\x45\x93\xd7\xf3\xeb\xf6\xbc\x4f\xf3\xfc\x0f\x34\x43\xc5\xd1\x95\xda\xf5\xde\x88\xc2\xbf\xd5\x13\xcd\x90\xa8\x97\xed\x62\xd2\x74\x50\x1e\x6a\x1a\xee\x38\x44\x9a\x5f\x2f\x06\xb5\xef\x5e\xdd\x71\x0e\x8f\xd1\x9a\x00\x8f\x3c\x81\x41\x4a\xe8\x9a\x4a\x42\x1d\xe4\x38\xdf\x9a\xa5\x31\xb6\xf0\x36\x67\x17\x90\x9f\xc8\xcc\xba\x25\x4b\xa4\x64\x71\x6f\x1a\x0a\x60\xd9\xe1\x31\x2c\x6f\x17\x36\x25\x3d\x2f\xa4\x95\x4a\xa1\x44\x7d\x87\x9b\x55\xa4\xb4\x7a\xa4\xc0\x1e\x85\xa8\x16\xea\xc2\xff\xcf\xde\x9b\x3f\x27\x8e\x2c\xfb\xa3\xbf\xf7\x5f\xe1\x76\xf4\x75\x20\x23\x30\xd8\x6d\xbb\x47\xb4\x9a\xc0\x1b\x78\x5f\xf0\xce\xe1\x4d\x68\x43\x60\x30\x60\x16\x1b\xdb\xcd\xff\xfe\xf2\x93\x55\x25\x95\x30\x9e\x99\x7b\xce\x8d\xf7\xbe\xf7\xc5\x8b\x99\x36\x52\xa9\x2a\x6b\xcf\xca\xcc\xca\x45\x7e\x37\x2c\x55\x9d\x36\x0e\x62\x18\xfe\x81\x30\x6b\x22\x41\x26\xa4\x58\x82\xa3\x17\x72\x2c\x3b\x96\x63\xb1\xfc\xca\xf2\x97\x95\x04\x0b\x3e\x7b\x6a\x0d\x0f\x32\x2b\x83\xe8\xd0\x42\xfe\x97\x5f\x14\xcc\xb9\xea\x23\x7d\x40\x1f\x61\x99\x6f\x8e\x5f\xe8\xf7\x60\x8b\x3b\x17\x24\x3b\x17\xa0\x73\x41\x3c\xb6\x66\x7b\x12\xf7\xcf\xac\xa0\x89\x3e\x61\x5e\x29\x26\x9b\x7c\xec\x6e\xac\x5b\xd5\xbc\xf8\x68\xf8\xe3\x00\x29\x6c\x39\xa9\x86\xd9\x27\xaa\xf5\x1e\x0f\x02\x23\x14\x1a\x0a\xc1\x78\x6c\xed\xda\x00\x92\xf7\x15\xca\xe7\xb7\x80\xdf\x1c\x31\xff\xbd\x83\xa5\xa5\x32\xbc\x51\x89\x6c\x82\x72\x48\xe8\x5e\x8d\x12\xbb\x43\xee\x15\x1a\x4e\x36\x04\xc5\xb1\xe9\x99\xb8\x96\xf7\x41\xa2\xfa\x7c\x2d\x1f\xed\x91\xd1\xe0\xf5\x3d\x78\x76\x3a\xa9\x45\xbf\xe7\xb1\x99\x63\xb6\xeb\x3c\x06\xc3\xbe\xe3\x05\xc3\x45\x63\xea\x39\xe0\x42\xda\x7b\xb4\x7f\xa6\x37\x36\x4f\x30\x28\xe8\xcf\x55\x59\x42\x8e\x2f\xa5\x01\xc9\x86\x7f\x3e\x3f\x76\xfe\x24\x42\x10\x3b\x5c\xff\xe0\xf8\x7e\x6a\x77\xec\x98\xad\x43\xf3\xa8\x03\x4f\x8f\xf3\x3f\xd2\x36\x75\x71\x63\xcd\x17\xc5\x55\x28\xc9\x54\x9b\x01\x6e\xf1\xcd\xf2\xd8\x31\xfe\x4a\x6e\x24\x9b\xa4\x69\xd7\x0c\x27\x4e\x5a\xa0\xc8\xf4\xa8\x2b\x1e\x19\xcb\x4b\x5a\xd3\x93\x0b\x52\xad\x24\xa7\x8c\xe5\xe6\xcb\x99\x0c\xd4\x4c\x06\x66\xc0\x53\x98\xe3\xf9\x0b\x4c\x59\x37\xcf\x5f\x10\xd9\xed\x82\xdc\xf3\x4d\x25\x46\x6c\x5c\x44\x1a\x07\x72\x0a\xa5\x40\x8e\xd8\xed\x19\x8a\x90\xe8\x3f\xdf\xf4\x5a\x4a\xbb\xc0\x88\xca\xd2\xb3\x5e\xb6\x33\x31\x2c\x22\x13\x0b\x72\xab\x26\xe4\xa9\x44\x0f\x4b\xd7\x7c\x08\x85\xed\x99\x87\xfb\x4a\x6b\x6c\x70\x23\x83\x6b\x0a\x0f\x26\x37\x1f\x67\x52\x17\xd3\x29\x31\xae\x14\x18\x4e\xd8\x45\x13\x4b\x2a\xfb\x22\x94\xed\xa0\x1e\x29\x69\x72\x40\xfd\x2b\x29\xb0\x14\xae\x15\x15\x1c\xc4\xfa\x70\x6a\x3e\x0e\x2d\xfe\xa9\xdd\x7a\xf5\xaf\xf6\x79\xc1\x80\x70\xf2\x81\x0e\xb0\xf8\x7b\xcc\xff\x38\xe6\xe5\x44\xd2\x77\x83\x1b\xe1\x66\x44\xf1\x60\xff\x50\x2e\xf9\xb9\xfa\x50\x56\x0b\xbe\xa7\x64\x74\xd0\x6b\xed\xb7\x26\x41\xe7\x06\x72\x25\xf8\xe8\x2b\xb9\xf5\xdf\xbf\xf3\x66\xfc\x45\xe8\xc2\xe2\xd3\xbd\x87\x4f\x7f\x27\xd4\xfb\x3b\xe9\x9d\x70\x54\xa1\x96\xdb\xd3\x44\x6c\xd7\x36\x11\xd0\x84\x89\x32\x3e\x91\xb3\x1e\xfd\x83\x1e\x03\xcf\x6a\x88\x6f\x49\x92\x41\x97\xab\xcd\xdc\x9b\xff\xb5\x28\x2f\x59\xf5\xee\xbe\xaa\x59\x79\x66\x14\x35\xb6\xa2\x1a\xff\xaa\xa6\xbf\x97\xe0\x09\x53\x47\x55\xdb\xc1\xb3\xe8\x68\x18\x57\xd7\xc1\xdb\xe4\x80\xbd\xf7\x0b\xf7\x58\x48\x48\x0a\xdf\x66\xee\xef\xff\xb9\xf0\x6d\x24\xeb\xed\x1d\x40\x1c\xa6\x5a\xd1\xdd\x87\xf8\xa6\xdc\x48\x3f\x31\x91\x7d\x11\xe0\xc1\x33\xd2\x7b\x9c\xe2\xab\x14\x42\xc6\x6f\x0d\xb4\x6f\x68\x9e\x35\x71\xef\xc4\x8f\xd5\x03\xf3\xb8\x89\xf2\x0a\xda\xa4\x84\xdb\x29\x90\x2e\xed\x26\x7f\xf2\x6c\xe8\xef\x16\xf6\x40\x0b\xb2\x10\x2f\x3a\xc2\x58\x2b\x99\x12\x23\xad\x64\x19\x61\x1d\x02\xeb\x5a\xfb\xb0\x6e\x43\x7a\x23\x04\x6c\x43\x64\x8c\xc5\x6b\xdb\x78\x85\x70\x8d\xda\xe0\x0a\x3a\x59\xe8\x26\x0f\xe5\xaf\xab\x86\x8f\xa8\xf5\xfe\x1c\x71\xd7\x8c\x9a\xc2\x27\xd2\x2e\xe9\x9f\x25\x1e\x35\xd4\x17\x68\x7c\x81\xac\xa4\x7d\x21\xf1\x5d\x52\xec\x35\xa3\xc1\xa0\x85\xc4\xf8\x77\xe5\x5e\x7e\xf3\x83\x9c\xea\xb2\xc5\xac\xb5\x31\x4f\xfc\xb5\x5b\xfe\x67\xd9\xa5\x14\xec\x35\xfc\x67\xd9\xa5\xf0\xaa\x74\xf8\x89\x88\x6c\xb5\x9e\x86\x9c\x0c\x17\x03\xb4\x7e\x6a\xdf\xd9\xaf\x4d\xc0\xe2\x32\x03\x07\x09\xa7\xae\xb3\x63\x9b\x80\xe5\x67\x06\x9c\xdb\x70\x2a\xe5\x80\xa2\xff\x85\x88\xea\x81\x08\x34\xa0\xcf\x32\x1b\xeb\xeb\x6b\x1b\xcb\x1c\xe1\x03\x4e\x6b\x12\x69\x6b\x75\x19\x51\xa3\xf4\x44\x83\x48\xcb\x5e\x2d\xfa\xff\x96\x64\x2d\x3e\xe9\xfe\x81\x64\x2d\xb8\xf8\x5c\xb2\xa6\x7c\x7e\xcc\x91\xb0\xf5\x66\x25\x6a\x12\xa7\xa7\x74\x6a\x6a\x9e\xea\x89\x72\xe1\xd1\xfb\x54\xce\x34\xbe\xf8\xc4\x93\x88\x3a\x0f\x8f\x04\x2f\xe5\x8f\xa1\xad\x7b\xfd\xa8\xac\x88\xfc\x7d\xfb\x54\x3c\x9d\xfa\x91\x9f\xb8\x49\x29\x7a\x74\xce\xe3\xd4\x71\xf4\x58\xea\x38\xd1\xf3\x8e\xf6\xbc\xbf\x1f\x3d\x5e\xdf\x47\xd7\xe2\x5b\x94\x43\x3d\xbb\xe7\xd1\xe3\xb6\x96\xfc\xf2\x1c\xd9\x35\xdd\x05\xa9\x78\x13\x95\x1d\xfb\x59\x8e\x4c\x31\x67\xf9\x0e\x7c\xed\x5d\x48\xff\x26\x63\x79\x6d\xbe\xbd\x69\xaf\xe6\xbe\xff\xa0\xa7\x4b\xd6\xef\xbd\xc9\x5e\xc9\xdf\x9e\x6b\x67\x7c\x07\x09\x0d\x65\xe5\x3b\xbe\x53\x4f\x9f\x91\x6e\x1c\x18\x54\x97\xb9\xb5\x68\x09\x10\xed\x34\x19\x12\xf1\x34\xf0\xac\x17\xd9\x1e\x73\xd1\xeb\x38\xc3\xe1\xa2\xd5\xa3\x65\x27\x55\x09\x20\x0f\x96\x97\x30\x0e\xad\xdf\x29\x4f\xe7\x6e\x63\xc6\x4b\x2f\x14\xd4\x15\x94\xe8\x3e\x57\x47\x0f\x2f\x17\xd1\xc2\x24\x12\xd2\xdf\xff\x6a\x9f\x16\x5d\x7b\x82\x29\xc6\x2b\x2c\x52\xc4\x5b\x77\xcf\x30\x88\xa0\x94\x6f\x93\x26\xb6\x29\x0e\x65\x50\x07\x1c\x85\x00\x78\x86\xa6\x5e\xf1\x9b\x11\x32\xa2\xb4\x98\x6c\x7e\x4c\x6a\x82\xd3\x0c\xde\xcf\x38\x8e\x27\x9e\x85\xf6\xb9\x2d\x7e\x7e\xff\x9e\x0c\x1c\xc4\xb0\x7e\x82\xfe\xe0\x13\xbd\x36\x0b\xec\x38\xb9\x26\xbe\x23\xbc\xec\x13\xd1\x0a\x7b\x75\xe9\x20\xc0\x60\xfb\x24\x8f\x5f\x82\x11\x7b\x33\xf2\x52\xed\x21\x07\x95\xbc\xa1\xa9\xff\xa8\x9a\x7f\x14\x20\xcb\x64\x57\x9a\x46\xbb\xf3\x9c\x9d\x3c\xca\x98\x83\x47\x81\x39\xd9\x9d\x4f\x08\xc9\xfe\x50\x8b\xd7\x72\x39\x93\x46\x26\xbf\x9e\x13\x6d\x02\xea\xd2\x6a\x7a\xd9\x95\x01\x2e\xe7\xfa\xb7\xd1\x6a\x7a\xd9\x35\xd8\x3c\x84\xca\x23\xfb\xfd\xe9\xc7\xb6\xd3\x92\xe5\x03\xe5\x6e\xce\x37\x5a\x90\x89\x89\x7e\x95\x0c\x8b\x83\xcd\x85\xb9\x16\xcd\xe9\x0c\x31\x88\x93\xb1\x1a\x31\x8d\xc5\x79\xbb\x90\xc1\x93\x68\x50\x62\xca\xcd\xb1\xed\xeb\x1d\x56\x71\xab\x88\x9f\x7d\xf1\x73\x2f\x7e\xbe\xed\xc4\x00\x9e\x3f\x03\xf0\xb8\xcf\x79\x9f\x27\x0e\xff\x96\x26\x4e\x5c\xa8\x2b\xce\xab\x7f\x50\x6d\x5c\xa6\xf7\x77\x65\xf6\xa3\xc6\xd1\x60\x79\xf3\x24\xab\x62\x34\x14\x09\x3b\x5e\x9b\xbb\x50\xc6\x6b\x52\x8d\x13\xfe\x3b\x5a\xa3\x4e\xf0\x31\x17\x6d\x7f\x47\x9f\xee\xae\x34\x18\xa1\x0f\xb5\x17\x22\x4f\x57\xfe\xd5\x5d\x09\x4d\x1e\x68\xcd\xbd\x50\x34\x37\xfb\xfb\x22\xb2\x7c\x34\x3f\x7d\x9e\x1f\x4a\xc6\xfc\x5c\x04\xfa\xbe\xa2\x44\xb8\xfd\x9b\xc6\x73\xbc\x15\x49\x76\x1c\x42\x8a\x32\xa4\x81\xdd\xe7\x3d\x87\x14\xf3\xa9\xeb\x98\x62\x5b\x08\xe8\xbd\x21\xf7\x38\x02\xb0\x7d\x31\x43\x90\x14\xe8\x8c\x75\x74\xef\xa1\x74\x78\x0a\xef\xa1\x3f\xc3\x42\x3a\xdd\x50\x34\x2d\x7c\x87\x4a\x92\xaa\xbd\xb4\xd4\xfe\x29\xe2\x7f\xb6\x89\x91\xff\xe9\xd0\x32\xc5\x55\x21\x56\x2b\x5f\xf3\x02\x4f\xb2\x1f\x52\x82\x3a\x03\x4d\x00\x32\x63\x40\xbf\x14\xa0\x42\xf0\xcb\xa1\x35\xcd\x80\x68\x69\x0b\xad\x03\xaf\xc5\x71\x50\x59\xbb\xda\x39\x27\x40\x54\xd9\xa9\x9f\xf0\x19\xb4\xad\xfb\x2d\x24\x06\x17\xc1\x9d\x3a\x41\x18\x74\xfd\xe1\x02\x6c\x31\x16\x9c\xc6\x28\xa0\x9e\xb5\x06\xc3\xd1\x42\xd0\x09\x98\x1d\x5f\x64\x4b\xb4\x73\xe1\xa1\x3d\x1a\xac\x16\x4f\x05\x25\x47\x5b\x85\x6b\x53\xf3\x35\x29\xb1\x73\xcb\x38\xff\x68\xd7\xe4\x54\x35\x73\x53\xb6\x01\x81\xef\xde\xc4\xb2\x51\x72\x01\xc8\x0d\x8b\xf2\x78\xac\x39\x75\x4b\x3e\xea\x7b\x78\x72\x31\xa3\x6a\x25\x9c\x57\xc3\x2f\x9d\xec\x78\xc1\xff\x19\x70\x1c\x31\x29\x11\x21\x8a\xd7\xf6\xcd\x76\x01\x46\x44\xaa\x54\x47\x64\xf6\x69\x9c\x6d\xcc\x8a\xd9\xb7\x31\xa6\x44\xa5\xbb\x26\xce\x5d\xf3\x99\x20\xbe\xd9\x1d\x80\x7b\xfe\xf9\x46\xe0\x9e\x8d\x31\xfa\xf6\x44\x0b\xa9\x53\x7b\xae\xc3\x33\x94\x09\x92\xba\x6d\x0b\xbc\xd1\xc6\xd9\x6e\x1f\x1f\x14\x2f\x02\x0b\xf2\xb6\x5a\x58\xb7\xdb\x53\x85\x87\x5d\xfe\x14\x8c\xac\x0b\x76\x67\x23\xfd\x4b\xd2\xf1\x58\x7c\xf5\xc1\xc3\x06\x0d\x5a\xb1\x96\x78\x46\xb2\x48\x88\x86\xb1\xc9\xd8\x5b\x3f\x4e\xc4\x11\x23\xa6\x7b\x7b\x33\x5e\xbd\xfd\x8f\xae\x70\x6b\x75\x53\x2d\x35\x60\x07\xde\x32\xb4\xda\x1c\x5e\x6d\x58\x6b\x4b\x4b\x01\xba\xd6\x48\x7b\x69\xbc\x72\x83\xfd\x78\x97\x05\x6a\xb2\x59\x97\x6e\xb0\xe7\xc8\x30\x85\x1b\xdf\xcd\x55\x23\x93\xd7\xe6\xe6\xe9\x63\xe5\xbe\x6d\x77\xf7\x62\x97\x9a\x50\x18\xfe\xca\xd3\xfc\xfb\x77\xc3\xe1\x1f\xe7\x27\xce\xd0\x5f\x9e\x52\x97\x09\x8a\x57\x7d\xc7\xfa\xb6\x8d\x42\x3e\x86\x4d\x7d\xa8\xb2\x67\x6d\x10\x2e\xbe\x9d\x5d\x2f\x78\xbf\x5c\x8e\xf7\x9a\x72\x32\xae\xb1\x92\xf2\x32\xae\x70\x4c\x1d\xc8\xfc\x8b\xa5\xad\xed\x9d\xdd\xbd\x72\x65\xff\xe0\xf0\xe8\xf8\xe4\xf4\xec\xfc\xa2\x7a\x79\x75\x7d\x73\x7b\x77\xef\xb8\x9e\x1f\x34\xc2\x66\xeb\xa1\xdd\x79\xec\xf6\xfa\x4f\xb4\xf0\xc7\xcf\x2f\x93\xd7\xb7\x5c\x7e\x75\xed\xfb\xfa\xc6\xe6\x8f\x3f\x32\xd9\xc5\xda\x36\xbc\x3e\x22\x02\xa3\xbf\x4c\xdd\x5e\xd9\xf8\x6e\x18\xe9\xff\x71\xb0\xff\x05\xb0\x70\x8e\x04\x2a\x7b\x23\xbf\x1c\xf1\x30\xff\x61\x4d\xa2\x1e\xc2\xd5\x5f\x98\x72\x4b\x92\xb9\xe3\x24\x65\x9b\xb8\x60\x9d\x8c\x13\xaf\x44\x7c\x26\xde\x77\x66\xde\x2f\x67\xde\xaf\x66\xde\x27\xa5\xc4\xab\x73\x9e\x78\x3d\xf5\x63\x7a\x19\x84\xa2\xfe\xad\x9c\x04\xd4\x93\x96\x91\x8a\xba\x4c\xdc\x11\xef\x27\x5e\xaf\xef\x13\xaf\x5b\x33\x4d\x72\x93\x6d\x20\xca\x58\x8f\x80\x25\x0e\xd2\x49\xe4\x3a\xc8\xec\x6c\x29\x62\x79\x3c\x68\xd9\x20\x8a\x29\x8f\x39\x19\x69\x97\x54\x3b\xd1\xa9\xc3\xf9\x8e\xc3\xc8\x57\x57\xcf\x51\x16\x9d\xc7\x41\x44\x7f\xef\x0c\x9c\xc8\x87\xe9\xbd\x1e\xf0\xec\xb9\x07\xf7\x20\x74\x4c\xdb\xdd\x7d\x5a\xdd\xd2\x52\x97\x8a\x42\xa5\x70\xa2\xbd\x95\xe4\x5d\xe4\xbd\x08\x32\x76\x7b\x94\x6d\x04\xd9\x97\x1b\x95\x01\x98\xd6\xde\x61\x8a\x7d\xd6\xd4\x4a\x35\x20\x0a\x53\x16\xd8\x9e\xc3\x41\x5c\x06\xbd\x51\x0f\x3a\x02\xa7\x0d\x0d\x0c\x24\x49\xd5\xc7\x19\x25\x3b\x2d\x12\xd7\x7d\x64\xca\x34\xdc\x73\x6a\xb2\xf7\x2c\xae\xfb\xea\xe8\x3e\x25\x17\x20\xaa\x59\x18\xf4\xc6\xa3\x56\x37\x58\x20\x64\xb4\xb0\x28\x63\x58\x86\xec\xa0\x5d\xf5\x86\xc3\x7b\x44\x56\x0a\x68\x83\xee\xa2\x94\x72\x80\xf6\xa8\x06\x9f\x3a\xef\x39\x4e\x38\xef\x89\x88\x8a\xe3\x20\x3b\x89\xdd\xa3\x69\xb4\xd6\x9e\x9e\xe5\x55\xcf\x82\x00\x7e\x61\xe2\x98\xea\xc7\x13\xe0\x24\xfd\x51\x82\x00\x7d\x48\xe4\xad\xfe\x55\xde\x99\xbb\x48\x6f\xf2\x69\xde\xad\x97\x19\xa3\xdf\xce\xa7\x79\x75\xc7\x42\xb3\x34\x0c\x1c\x56\xd2\xe2\xdb\x63\xbf\x13\xc2\x4d\x4f\x04\x34\xa2\xdc\xaf\xe9\x19\xe6\x4a\xbf\x7f\x07\xf8\x21\xdc\x7c\x4e\x27\xd0\x29\xe2\x52\xd2\x99\x75\x4e\x5f\xb3\x8d\x56\xa7\x73\xda\x77\xbc\xd6\x28\x12\x1f\x79\xb8\xde\xda\x6e\x8a\x4c\x0c\xe2\x9b\xcb\x20\xe8\x27\x91\x47\xb8\x8a\x72\xed\x53\x00\x1a\x8e\x06\xbd\x76\xc0\x12\x4f\x2d\x8e\x86\x93\x7d\x6c\xeb\xbc\x3f\x3c\x50\x82\x66\x98\xf1\xed\x34\x49\x8c\xad\x5c\x17\x52\x84\x7b\xdf\xab\x4d\x58\xb1\x78\x76\x24\x69\x3a\x1f\xdb\x1f\x89\x55\x9a\x75\xad\x2d\x6a\xdb\xce\x80\xeb\x97\x9c\x39\xb3\x38\xdf\xac\x7e\xfe\x8c\x6f\x37\xe7\x56\xad\x8d\x27\x55\x9d\x28\xd3\xfc\xc4\xd6\x9c\x5a\x54\x79\xfb\xe8\xbb\x99\x37\xaa\x3f\xab\xd2\x2e\x4b\xb0\x43\x85\x8f\x45\xa8\xc4\xa4\xf1\xa9\xa4\x56\x95\x75\x06\xde\xcc\xa7\xc2\x7c\xa7\xc1\x23\xc5\xd8\x36\x26\x29\x6c\x27\xad\x3a\x6d\xc3\x55\xe4\x86\x63\x5e\xf9\xb3\x4c\xe3\x19\x6b\x69\x8c\x95\xd7\x1b\x74\x83\xc1\x10\x48\xd4\xcb\x0e\xb0\x9b\xe9\x87\x76\xac\x46\xfc\x3f\xab\x62\x5c\xa0\xe9\xb0\x97\x88\x79\xbb\xfe\x25\x91\xf1\xf9\x43\x46\xd6\x81\x24\x4a\xe7\xdd\x6b\x0d\x10\x57\x62\x0e\xb1\x1a\xa1\xdd\x5a\x0f\xd6\x53\xb5\xa3\x37\x38\x4d\x98\xd0\xbf\x57\xf3\x1d\xf3\x6a\x39\xec\x9a\xcc\x98\x9a\x18\xfd\xbf\x04\x91\xed\x8c\x53\xaa\xac\x93\xad\x80\x06\x3c\x72\x39\x94\xd8\x20\xf0\x46\x7f\x5d\x7b\x19\x8b\x41\x95\x55\xd6\xba\x5c\x16\xb4\xfd\x5f\x97\x7d\x49\x94\x6d\xf9\x5c\x4e\x9b\xd1\xfd\x8b\x68\xb1\x3e\x86\x71\x5c\x83\xc8\x90\xbf\xbd\x66\xe7\xa6\xfb\x17\x7f\x1d\xd0\xf8\x81\x4e\x57\x91\xe7\xe8\xe6\xb3\x3c\x8f\xa1\xca\xf3\x21\x96\x61\xac\x8c\x4b\xa8\x9a\x10\x3a\x5a\x4f\xc7\x6d\xb5\x6c\x12\x2d\x79\xa0\xa4\x43\x44\x43\xbe\xee\x18\x1c\x1b\x16\x64\x33\xd0\xfd\xaa\x1d\x88\xa7\xd7\x55\xe5\xde\xe1\x31\x94\xf1\x98\x62\x29\x71\xd4\xd7\xc3\x8b\xd9\x0d\xe0\x26\x6b\xdc\xdd\x47\x2d\x07\x18\x12\xd3\x13\xd5\xf9\x86\x19\x18\x74\x4a\xa4\x1a\x06\xe1\x7f\x84\x8b\x70\x64\x1d\xae\xa6\x80\x29\x3a\xe6\x8e\xff\xa6\x63\xaa\x9e\xab\xe1\x9c\x9e\x19\x74\x66\x70\xa8\xcf\xb8\xc6\x4f\xbb\x14\xef\x87\x83\x8b\xa4\xe5\xde\xe5\x59\xaa\xb9\x6d\x14\xae\xcf\xe8\x18\x38\xdf\x36\x6f\xfb\x4e\xda\xa1\x49\x44\xb3\xdb\x6b\x69\x3b\x3f\x4f\x69\xf4\x28\x71\xcb\x2b\xe4\xd5\x0f\x7e\x1d\xc7\x74\xe4\xa2\x56\xa8\xa1\x0d\x59\x9f\x9c\x4e\xfe\xc5\x71\x97\xc8\x53\x5a\xf4\xfe\x22\x51\x09\x42\xeb\x50\x0b\xdd\x52\x0b\x7b\xbd\x30\x2b\x02\xe5\x64\xe1\xfe\xd3\x19\xd5\x17\x2e\x83\xc7\x7e\xc7\x21\x92\x6c\x10\x3c\x8d\x5b\x03\x2a\x1a\x07\xd1\x13\x52\x83\xff\x4a\xd5\x72\xff\xca\xfc\x6b\xe1\x5f\xe9\xfa\xb2\x91\xfa\x97\x9f\x36\x8a\xa9\x7f\x65\xf9\x81\x9e\x6a\xff\x35\x6c\xf8\xad\x71\xdd\x58\x09\x93\x6e\x31\x7d\xe5\xc8\x97\xd8\x35\xa6\x5d\x6c\x7b\x47\xf1\x08\x0b\x3b\x81\xd4\x5c\xfe\x9b\xd6\x8f\xff\xa6\xf5\x27\xc4\x5f\x07\xdd\xde\x38\x6c\x2e\x44\x83\x02\x0e\x3a\xf2\xe1\x9b\xab\xdb\x63\xd5\x9f\xe3\x8b\x5a\x57\x08\xfc\x85\xbf\xbc\x68\x14\x09\x57\x70\xa8\xf6\xe3\x0b\xfb\x7d\x68\x25\x57\x4b\xb4\x5f\x1a\x22\x1e\xa2\x67\xdb\xa7\x90\x3d\x1e\xd4\x7f\xd9\x5e\xd1\xb1\x1c\x3b\x93\xff\x29\xf4\x39\x2f\x03\x33\x67\x14\x9d\x74\xa5\x95\x1a\x06\xa6\x97\x41\x26\xc3\x4a\xbc\xa5\x9d\xa9\xd9\xb0\x3e\xae\x47\xe3\xdd\x97\x81\xc2\x89\x9a\x40\xf0\x60\x3a\xc8\xb9\xa2\x14\xd2\x27\x1c\xe6\x54\x5c\x7d\x37\x20\xbf\xf8\xe5\x14\x2f\x03\x2b\xf7\x53\x2a\x92\x9e\x07\x46\xf1\x5c\x7b\x1f\xd2\xfb\x90\xd8\xe1\x02\xa5\x38\xcc\xac\x35\x88\x2d\xc7\x18\xcb\x4e\xf8\xa2\xf9\x6a\x36\x7c\xe2\xec\xb8\xd6\xa2\x50\xed\x75\x64\x48\x1b\x2b\x7a\x15\x2d\x20\x02\xd9\xcb\xa0\x6c\xa6\x01\x5e\x36\xaa\x4f\x74\x9c\x6b\x91\x9d\x77\x58\x78\x1b\x65\xb8\xe5\x0c\xb7\x81\x45\x9f\x90\xad\xd2\x62\x4b\xd4\xb4\xaf\x05\x6c\x34\xfd\x39\xe3\xa2\x94\x1f\xa3\x19\xcc\x36\x52\x6d\x1c\x21\xf9\x9c\x21\xf3\xe4\x64\x1e\xc2\x9f\xf4\xb9\x65\xd3\x1f\x1f\x4f\x63\xf1\x14\xed\xa7\x13\x7d\x3f\xe1\xb6\xae\x55\x9b\x78\xf5\xda\x89\x57\xa7\x97\x52\x8b\xc7\x25\x35\x44\x5c\x5f\x0e\xdd\xc0\x0e\x13\xbe\xda\xcf\xc3\xe2\x4d\x68\x3d\x47\x2e\xab\x69\x57\xde\x74\x1c\x44\x8b\x4b\xba\x6f\x98\xa8\x83\x0d\x02\x21\xfe\x0b\xe1\xd2\x57\x0e\xf8\x1e\xaf\x61\xaf\xd7\xe9\x0d\x86\x55\xcf\xe9\x04\x0b\x4e\xd7\x5f\xa0\x03\x70\x1c\xc8\x77\x3d\xa0\x95\x8a\xda\xd4\x09\xba\x21\x7b\x82\x8f\x22\x35\xb1\xf2\xf0\x67\x20\x19\x84\xf2\xfe\x15\x4c\x1c\x6f\xd4\x79\xe5\x78\x50\x52\xb8\xb4\xf0\xd2\x0c\xe8\x18\xea\x89\x7a\x45\x99\xd6\x70\xa1\x3f\xe8\x3d\xb7\x7c\xde\xf9\x8c\xda\x6e\x22\xb7\x2f\x9d\x67\xfb\xf2\x93\xe8\xaa\xdb\x8f\xf4\x92\xed\xf9\x53\x21\x9e\x78\x45\x04\x9d\xc6\x96\x79\x49\x67\xe0\x1b\x9e\x83\x2d\x53\xbc\x6a\x68\xf1\xf4\x22\x1a\xa3\xaf\x0e\x55\x13\xb9\xd9\xa7\x8a\xa0\xdb\x83\x51\xfb\x65\xe3\x4b\x8d\xff\x70\x64\x91\x44\x26\xfe\xc3\xc9\x9c\xf9\xa7\xc8\x9c\xab\xcf\x42\x12\x48\xb3\xfd\x90\xc2\x77\x53\x86\x8f\xfd\x19\xaf\x78\xce\xe7\xd5\xa5\xfe\x47\xc6\xcb\xac\xc2\xa2\xca\xcb\x44\x98\xf8\x96\xba\x27\xf2\x98\xfc\x4b\x47\x74\xca\xcd\x70\x6d\x3e\xe1\x3a\x86\x4b\x1f\xa3\x14\x43\xa3\x86\x4a\x6a\x2d\x10\x65\x9d\x13\xf3\x55\xcc\x8b\xd8\xb5\x70\xa8\x60\xd7\x68\xb0\x70\x85\xe2\xd2\x1f\x42\x10\x2e\xf6\xe8\x9a\xcd\x4b\xa5\x48\x63\x67\xd1\x67\xc1\xc7\xfd\xfe\xbd\xfa\xcb\x89\x23\xde\xbe\x8b\xe5\xc2\x0e\xe2\xcd\x60\xcd\xaa\x9d\xc2\x22\xaa\x3e\x2d\x28\xd7\x36\x39\x8e\xfb\x52\x73\xc4\x08\x41\x95\x25\xe3\x49\x6b\xb3\x60\x06\x06\x3a\xa4\x83\x40\x9c\x37\xd1\x04\x43\x08\xac\x58\xba\x17\xac\xa4\x44\x7c\x17\x15\x85\xdf\x55\xd1\xe9\x38\x5a\xbe\x97\xf6\xe1\x26\x3a\x09\xd9\x01\x5c\x77\xaa\x8b\x86\x93\x44\x25\x37\x1f\x51\x70\xab\xa9\xbd\xa1\x70\x50\xe1\xd3\x40\x71\xe4\x3b\xe3\x9d\x75\xc1\x78\xa0\x7c\xbb\x26\x2d\x0f\x30\x4c\xec\xf9\x44\xf0\xbf\x3e\x87\x5a\xe1\x5b\x54\x1a\xd4\x57\xdc\x95\xca\x74\x5f\xf4\x9c\x3f\xca\x67\xdb\xcd\x06\x5d\xdf\xd0\xc2\xcb\xf0\xed\xab\xda\x3f\x65\xb4\x00\x3d\xf6\xe8\x14\xf6\x44\xf4\x3d\x0f\xca\x79\x5a\x76\x6f\x26\x3b\x1a\x4c\x89\x94\xd9\xc3\xfa\x4c\x6e\xc5\xd2\x04\xe2\x04\x1e\x8a\x68\x4b\x3b\x0b\x8f\xbd\x2e\x31\xf9\x5d\xb8\x50\xa3\x2d\xd9\xea\x42\xbb\x89\x83\xfd\x0f\x83\x41\x0b\x9a\x57\x85\xa9\x67\xfb\x53\xcd\x55\xc6\x09\xb0\xe0\x2e\x55\x47\x23\xcf\xcf\x3b\xb2\x6a\xc1\xb4\xf9\x2a\x88\x6e\xb0\xb4\xe4\xff\x0a\xe6\x35\xe2\xb1\xd5\xbd\x46\x3b\x10\xf8\xcd\x4f\x2f\x1a\x71\x73\x46\xd4\x1e\xc6\x14\x51\x56\x67\x12\x65\x0d\xd8\x5e\x87\x46\xff\x2e\x70\x64\x64\x52\x78\xc2\xf0\x30\x1b\xaf\x34\x1b\x18\xce\xba\x31\x15\x13\x58\xd9\x85\x54\x10\x4f\x6f\x43\x56\x03\xf8\x42\xb8\x94\x55\x20\xfc\xc4\x4d\x32\xd0\xa3\x57\x7b\xa4\xf2\x5e\x36\x58\xd3\x11\xe7\x59\x52\xd5\xb3\x76\x86\x3c\xf6\x2d\xd5\x5d\x05\x4b\xca\x91\x77\x6a\x4f\x52\xb8\xbd\x17\x88\x28\xf8\x84\x7e\x91\xb1\xf6\xe6\x4a\xff\x38\x3e\xc4\xd0\xb5\x61\xa9\xce\x21\x52\xca\x81\xc3\xad\xda\x0d\x1c\xe5\x74\x3b\xfb\xad\x64\x12\x5a\xab\xbd\x12\xb7\x20\x0c\x84\xce\xda\xd4\xa2\x43\x76\xbe\xf8\xcd\xe7\xfb\x76\xa2\x58\xd3\xa9\x30\xdd\x81\x51\xdf\xaa\xb1\x5c\x79\x48\x51\x4a\xa6\x91\x7d\xc5\x1c\x94\xf0\x36\x11\xdf\x07\xf1\xf7\x09\x7d\x9f\x18\x19\x91\x46\x4b\xb5\x5c\x4f\xb7\xe9\xc7\xf3\xeb\x99\x36\xa7\x62\x7c\xa8\x6c\x37\x23\xc0\xd2\xf8\x8d\x7a\x7d\xce\x73\xec\x89\x3c\x25\xce\xc3\x0e\x1e\xda\x22\xbe\x10\x74\x8b\x61\xf6\xc9\xed\x4b\xe7\x95\x76\xb8\x48\xa2\xc6\x22\xe1\x5e\x26\xf8\xd4\xa8\x2b\x28\x85\x4d\xea\xac\xa4\xe6\x53\x27\xae\xe6\xd9\x4a\x9f\x47\xa2\x32\xa5\x85\xb9\xe5\x70\x80\x72\x27\xdb\x1b\x8f\xc0\x2a\xd1\xd8\xa1\x15\xfd\x23\x53\x28\x95\xed\x75\xa8\x83\x0d\x87\x1b\x9c\x5d\x37\xf1\x8c\x8e\x45\xcf\xd4\x81\xe8\xb9\x8c\x47\xe8\x34\x04\xd9\x6f\x0f\x85\x06\xb3\xca\x21\x52\xf3\x66\x88\x8c\x50\x83\x9c\x34\x12\x49\x99\xbc\xc9\xff\xfd\xc8\x99\xab\x9b\x39\xd6\x0f\x6d\x10\x1b\xc2\x79\xcc\x90\x6b\xcd\xcf\x14\x13\x89\x5c\x0c\x45\x44\xa1\x68\x4f\xe0\xd2\x86\xf6\x76\xf6\x95\xd0\x9d\x6c\xb7\x11\x5f\x3c\xe4\x0a\x6b\xbf\x3a\x85\x74\xba\x63\x70\x2d\xed\x5a\xa7\x4e\x43\x47\xed\xe7\xa7\x57\x34\x5f\xd5\x8f\xd9\x93\xb5\x45\x0d\xd0\xd2\x64\x0b\x72\xe6\x1f\x89\x56\x53\x0e\xd5\xb1\xd9\x52\x5a\x77\xff\x60\x1b\xaa\xbf\x6c\x38\x8f\x17\x1a\xfe\x0f\x1b\x2d\x7c\x01\x17\x02\xbb\x86\x59\x73\xbb\x29\xc1\x06\x5f\x35\xcd\x2f\x42\xc4\x62\xb5\xb6\xcc\xb1\x63\xe5\xa7\xb4\xca\xf5\x1c\x22\x39\x67\x6e\x07\x56\x76\xe3\xaf\x3e\x7e\x9f\x1a\x75\x79\x67\x16\x30\x5a\x05\xed\x17\x16\x32\x99\x10\xd7\x66\xd9\x21\xf4\x58\x83\x5a\x58\x07\x9b\xe4\x66\x77\x1f\x53\xf0\x8a\x1c\x8a\x78\x84\x57\xfb\x5c\x52\x44\xff\x73\x6a\x4f\xa5\xba\x8a\x00\x28\x75\x7f\xb0\x2d\x91\xda\x40\x44\xe1\x76\xb6\xdc\xe4\xa0\xf9\xbc\x38\x79\xe7\x03\x03\xd1\x10\x56\xea\x52\x47\xa8\x5a\xb6\x42\x3b\xac\x7d\xab\x17\xda\x76\x9b\x7f\x6a\x7d\xb8\xa5\x72\xb3\x4d\x37\xc5\xcf\x62\x41\x9a\xea\x19\x73\x16\xbd\x88\xad\x39\x27\x97\xd8\x8f\x7a\x91\x90\x5f\xdc\xc1\x78\xd8\x84\x9e\x9a\x9a\x91\xce\xcf\x76\xed\xf9\x95\x7b\xd1\x51\x6a\xdc\x88\x67\x89\xb4\x4e\xdd\xec\xdb\x6d\xf9\x58\x90\x1d\xec\xc6\x6d\xbf\x1a\x5a\x6e\xb6\xea\x53\xd2\xb7\xba\xe0\xfb\xb3\x93\x6f\xc5\xbe\x6c\x97\xd5\x97\x6d\xea\xab\x26\xe4\xcd\xd2\x01\xfe\xe7\xfc\xb4\xdb\x03\x2e\x90\xd0\x47\x7a\x39\xb0\xb8\xe7\x1f\xca\x7e\x51\x60\x33\xfa\x27\xee\x66\x94\x07\x70\xa3\x1e\x4e\xa7\x62\x39\x86\xd9\x16\x2c\xa0\x43\xfb\xe0\x2c\x55\x6b\xee\x98\x78\xaf\x63\x62\xdd\x1e\xdb\xf2\x26\xaa\x0f\x0e\xe4\x6c\x98\x62\x36\x24\x76\x25\x24\xd2\x61\x24\xd0\x66\x19\x58\x76\x92\x33\xe5\xd3\x2b\x51\xee\x1d\x5e\xcc\xf2\x4b\x3e\xfa\x92\x47\x25\xb4\x98\x3a\x54\x65\xd4\x28\x81\xfd\x4d\x9d\x55\xd0\xdc\x15\xea\xa6\x22\x13\xdc\x72\xe5\xa4\xc3\x42\xf8\x4e\xca\x4d\xf7\x9d\xd4\xc5\xac\xb9\x97\x76\x2c\x5d\x48\xd5\xda\x89\x10\x7a\xbf\x26\x0c\x60\xaa\x1a\x13\xcf\x3e\x33\xf7\x3f\xc8\x6e\x7d\x71\xe8\x14\xf9\xaf\xf5\x3e\xa1\xed\xf2\x6a\xe5\xa6\xb4\x80\x47\x47\x29\x97\x76\x2a\x61\x67\x13\x34\x93\x09\xe7\x5b\x6c\x05\x8b\xf4\x57\x4a\x87\xc0\xc9\xa5\xf3\x88\x09\xcc\x03\x4f\xbb\xf5\x7b\xad\x03\x0d\xd0\x29\xfb\xfb\xb7\xcb\x2f\x4c\xc1\x70\xbc\x59\x4b\xa2\x65\xa4\x9b\x9c\xc7\xe4\x8f\x26\x4a\x19\xec\x85\xa1\x0a\x7a\xfd\xa1\x15\xc1\xbb\x7f\x4c\x25\x18\x95\x6d\x45\x8c\x29\x83\x0d\xc1\xe2\x65\xf4\xab\xf8\x1d\x75\x9f\x28\x49\xf5\xdf\xbf\xbf\xba\x92\x7e\x94\x01\x33\x7d\x44\x66\x22\x50\x11\xb9\xfc\x90\x9a\x8d\xd3\x2e\x0e\x5e\xf8\xe0\x90\x99\x70\xff\xc8\x2e\x39\x7e\xff\xce\xe6\xd6\x7f\xd9\x3e\xab\x95\x4e\xb5\x7a\x77\x13\xf5\xc2\x47\x42\x76\x42\xb3\x88\x11\x98\x28\xfa\x55\x8c\xb1\xfc\x48\x64\x23\x7f\x2c\xe6\x2c\x91\x50\x74\xb2\xaf\xb4\x1d\x5e\x8d\x65\x6f\x65\x63\x0a\x75\x1c\x8e\xf6\x06\xe7\xb9\xb2\xa3\x04\x49\x3a\xc4\x05\x50\x4c\x09\xa5\xbd\xae\x50\x7a\x9a\xca\xad\x20\x71\x65\x55\x75\x2b\xf7\x13\x30\xdf\x61\x5b\xff\x6a\x79\xcb\xee\x14\x73\x9c\xc1\x4b\x06\x6f\xda\x6d\x46\xdc\x72\xb9\x2e\xb2\x9d\x50\x1c\xaf\xae\x78\x92\x74\xb8\xcf\xfd\x89\xe4\x20\x98\xcf\xed\x23\x78\xd1\x13\xf1\xee\xd8\x22\x7c\x85\x39\xed\x9d\xa3\x94\x0c\x3f\xc6\x7e\xe9\xf2\x2b\xc0\xad\x5a\x02\x68\x5a\x87\x9f\xa8\xab\x9a\x18\x2a\xa6\xbb\x2f\x13\xca\x72\x34\x16\x45\x1a\x60\x8b\x9a\xaa\x29\x55\x70\x18\xf7\x5c\x21\x14\x51\x62\xd3\x69\xa5\x29\x6c\x76\x0a\x41\x91\x50\x73\x99\x3b\x16\x12\x22\xf2\xa1\xa6\xa8\x5e\x33\x78\x27\x1e\xbf\x6d\xfb\x45\x22\x89\xf2\xc6\x7f\xa1\xbc\x45\x4f\x94\x89\x92\xf0\x96\x0e\x33\x51\x3a\x8e\xc4\xe8\xac\x13\x0f\x1d\xf5\x80\x78\x75\xf1\x73\x47\x7b\x6e\xd7\xd1\x04\x2f\xb5\x8b\xa1\x08\x21\x61\xed\x10\x1e\xe2\xb7\x36\xde\x42\x60\x25\xc3\xe4\xa0\xf2\x35\x95\xa9\x6d\x98\x3b\xd1\x63\x5d\xc6\x21\x17\xb5\x14\x45\x4e\x3c\x8a\x81\x34\xe3\x47\x62\xc4\xf8\xab\x70\x94\xa8\x64\x3e\xf1\x0c\x97\x3f\xde\xb1\xbb\x69\x8f\x47\x52\xb8\x8b\x48\x05\x69\x66\x9f\xb8\xc7\x74\x1a\xf3\xc5\x0a\x1d\x93\x44\xa0\x07\x62\x74\x23\xa6\x02\xad\x09\x22\x9e\x35\x20\x86\xca\xf6\x0a\xf3\xa0\x4c\xf5\x0b\x99\x78\x62\xaf\x22\x52\xce\xc3\x3e\x54\x5b\xf2\x2e\xc1\xaa\xc7\x5b\x1c\x9b\xee\x97\x13\x69\x89\xb2\xb9\x4d\x51\xf0\x75\xd8\x36\x7e\x11\x5a\xb7\x7e\x9d\xd9\xd9\x9f\x84\x09\x6a\x3e\xb1\x35\xf4\x56\xf4\x2d\x7a\xd2\x6e\x10\x66\x16\x39\xad\x58\x2c\xe7\x82\x6c\x04\xb3\xd8\x82\xc9\x75\x7e\xda\xcc\x58\xaa\x2e\x7a\xb6\x6c\x32\x2d\xa2\x9a\x70\xcc\x43\x15\x0a\xf6\x3b\xb0\x45\x53\x68\x5b\x35\x44\x29\xf0\xa6\xc0\x1c\x01\x32\x41\x4d\x36\x13\xb2\x86\xec\xa8\x9e\x22\x44\xd5\x30\x56\xda\x4c\x59\x64\x1a\x99\xce\x72\x9b\xc8\x1e\x42\xce\x0f\xf0\xb4\x10\xcc\x73\x66\x5c\x43\x94\xe3\x4c\x88\x78\x74\x8e\x68\x05\x64\x51\x72\x28\x6a\xa2\xea\x74\x67\xd9\x4b\x23\x32\x23\xc1\x4b\x07\x08\xe5\x47\x1c\x67\xdc\xef\xeb\x68\xb8\x63\x6b\xae\x5a\x5d\x72\xc4\x0e\xb3\xc3\x88\xd3\x6e\xb3\xc6\xab\x67\x06\xda\x49\x15\x4b\xf4\x13\x86\x7a\x72\x11\x80\xef\x2a\xf2\x5f\xcb\x01\x8e\xd2\xa6\xf8\x40\x5f\x6e\x9e\x94\x4e\x79\x30\x41\x61\xc5\x23\x29\x18\xc4\x42\xf3\x6c\x37\xe3\x15\xe2\xb8\xef\x88\x12\x09\x51\x07\xcd\x2a\x73\xda\xb4\xbd\x11\xdf\xdc\x14\x6e\xdd\x88\xcd\xe1\x5b\xef\x68\x49\x0a\x8d\x79\xac\x47\xb4\xc0\x1c\xda\xdc\x52\x2c\xcf\x0c\x51\x40\x76\x98\xee\x63\x62\x43\xc8\x4e\x04\xc6\x08\x68\x8f\x8f\x6d\x81\x53\x3d\x9a\x99\x21\xa8\xfe\x30\x3d\x26\xc8\xfd\xf4\x98\x33\xff\x72\xa3\xb5\x4d\x68\xbe\xf8\x7e\xd7\xb3\x02\xb3\xe3\x0c\x47\x16\xd5\x7f\x64\xb9\x99\x54\x98\xe9\x1b\x53\x4b\xea\xa6\x34\xc4\xd9\x86\x6c\x0d\x91\xad\x8b\x6c\x5e\xa6\x3d\x2d\xa8\x9a\x5c\xae\xa9\x10\xa6\xed\x71\xa1\xc3\x15\xd1\xb0\xcb\xed\xf1\x11\x7e\xa8\xa1\xe6\xc3\x78\xd5\x3a\x7c\x8e\xe3\x12\xe1\xed\xc1\x28\x3c\x3e\xa4\x1c\xdd\x40\xcf\x9b\x1f\x2d\x1b\x2b\xc4\xa7\x31\x4d\xf1\x42\xf2\x8c\xe5\x80\x05\xa9\x3f\x6d\xd7\x00\xbf\x8a\x10\xda\x19\xbb\x21\xac\x60\x3c\x84\xc1\x0d\x0a\x1c\xaa\x17\x24\xd2\x54\xb5\x70\x3c\x74\xe8\x0c\x41\xdb\x74\xc1\xc8\xcd\x87\xeb\x62\x7d\xda\x59\x06\x14\x24\xbc\xd9\xb8\x44\x18\x74\x8f\x68\xca\x1f\x70\xde\xe6\x88\x04\xb8\xeb\xe1\xe0\xb8\x6a\xc1\x76\x38\x71\x03\x19\x1d\xef\xb4\xba\x90\x92\xbd\x61\xb9\xe1\xd4\x94\x66\x78\x0d\x8c\x85\x67\xee\xc3\x89\x73\xee\x67\x43\x88\x5c\x1a\xb5\x86\x94\x9a\x04\x59\x8c\x67\x3c\x3c\xe2\x90\xf0\x69\x02\xd2\x88\x68\x75\xc8\x3c\xfe\x5c\xc1\xa0\x83\x9a\xc2\x3a\xa8\x2f\x43\x35\x38\x19\xa4\x95\x85\xc7\x88\xd3\xda\x20\x34\x9e\x96\x13\x1c\x64\xc7\xd0\x71\xa3\x94\xa8\xbc\x3a\x33\x5d\x43\x0c\xe6\x47\xa4\x7c\x9b\x10\x1e\xc8\xe1\x7c\xee\xb5\xfc\x85\x9c\xfc\xc1\x0d\xc9\xfb\xb4\x70\x9f\x24\x4f\xdc\x38\x6e\x6a\x3b\x78\x95\x27\x93\xcf\xb5\xa6\xf0\x43\xdb\x9b\xda\xce\x51\x1b\x96\x96\x90\xc0\xd2\xae\x9a\x5b\xd7\x62\x7b\xfa\xda\x44\x1e\x45\x37\xb0\x91\x76\x1c\x66\x48\x5d\x30\x98\x79\x34\x23\x42\x19\x9e\x10\xa2\xa9\xf0\xd5\x0d\xb5\x99\x10\xc0\x95\xf7\x34\xed\xbb\x28\x89\x83\x32\x73\x62\x43\xcc\x3a\x5f\x04\xb7\x1e\x60\xaf\x10\x9d\x0f\x1a\xa2\xb9\xbb\x90\xf2\x67\x10\x44\x6a\xf1\xe4\x38\x08\x9c\x90\xe5\x47\x93\x81\x55\x9a\xdf\xf8\xe5\xd2\xa9\x2f\x64\xb2\x8a\x14\x64\x8d\x28\xc7\x30\x7e\xe6\x77\x33\x9b\xcb\x11\x10\xb7\xe0\x2c\xdb\xf9\x9c\xaa\x33\xbf\x11\x57\x7a\xaf\x91\xca\x01\x23\x8c\xdc\xaf\xb8\x76\xb7\xd6\xf4\xe0\xbd\xd5\xad\xdd\xc0\xc6\x33\x30\xf4\x36\x7c\xf8\x48\xc4\x84\x89\xad\xe8\x11\x6a\x85\x24\xce\x4d\xdb\x2f\x41\x7c\x41\x16\xd5\xf9\xed\x22\xb1\xd0\xd9\xf6\xb9\x58\x73\xd2\x57\x41\xda\xad\x5b\x9f\x06\xed\xe7\xef\x3a\xd1\xe9\x54\x67\x2e\x7a\x72\xbf\xc0\x3a\xfc\xf2\x04\x56\x82\x91\x32\x1d\x57\xda\x64\x1f\xc7\x7b\x54\x37\x76\xaa\xe1\xa8\x22\x60\x94\x4c\xd4\x11\x1d\x02\x44\xe9\xf0\x1d\xe1\x7b\xef\xca\x6a\x9b\xed\x47\xab\x9d\x6d\x3f\x12\xf2\x7c\x3a\xc2\xb1\x6a\xf6\xaf\x04\x7e\x1e\x1c\x89\xdf\x27\xf1\x4e\x0b\x2c\xa5\xe0\x98\x01\xd1\x4d\xc6\xe7\x60\xb8\x9c\x06\x87\xb2\xeb\x60\x3c\xad\x39\x02\x10\x6c\xf9\x70\xb8\xd3\x68\x07\x10\x5d\x6a\xa0\x3d\x80\xf6\x08\xb4\xd6\x3e\xc0\x8b\xc1\x82\x16\x60\xac\x19\xce\x47\x35\xb4\x97\x1e\x33\x2e\xfd\x89\xf7\x48\xee\x67\x08\xa1\x36\x62\x3e\x5b\xa8\x84\x1b\x4a\xf5\xe4\xe6\xb5\x3e\x31\x0a\xda\x78\x9f\xcc\xd2\xd6\x84\xbf\xe7\x37\x80\x50\x05\x68\xfe\x5a\x7d\xe6\x38\x74\x44\xc4\x64\x5b\x86\x4c\xc6\x46\xb3\xf1\xe7\xf7\x6f\x2d\xab\x38\x27\x59\xc0\x4d\xa7\x5d\x9b\x31\x1d\x32\x01\x1d\xc4\x53\x0e\xb3\x1b\xdf\x98\xb2\x49\x87\x8b\x3f\x6d\x98\x27\xd7\x09\x6d\x49\x29\x32\x66\xa7\xd0\x2e\x18\x92\xda\xcd\x3e\x1d\x41\x6f\xb8\x86\x87\x3a\xbd\xf6\xaf\x0c\xa5\x62\x9c\x1d\xe0\x93\x5b\xc3\x03\x3e\x3d\x5d\xe1\x24\x6d\x67\x7b\x4a\x7c\xf7\x8e\x19\x31\x4f\x7f\x58\x8e\x79\xf6\x23\x79\x72\x9c\xc6\x63\x12\xa5\xf9\x1a\xef\x24\x4e\x56\x2f\xde\xff\xec\x07\xd9\x96\xa4\x96\xb8\xdd\xd2\xf0\x83\x32\x84\x6d\x08\x06\x4d\x93\x95\x47\x39\xd2\x79\xea\x2f\x7f\xe7\x38\x37\xda\xa9\x84\xa0\x00\x9e\xba\x2a\xcc\xf8\xc6\x4f\x3b\xe6\x29\xe9\x03\xe5\x9f\x46\x5c\x24\x73\x3f\x3c\x1f\xe2\xc9\x8d\x6f\x37\xc4\x09\x17\x4f\x1c\xab\xcf\xf2\x51\x4d\xe8\xd0\xc3\xe4\x10\x4f\xe2\xfd\x14\x65\x43\x71\x13\x61\x88\x77\x04\x31\xb3\xb1\xb6\x3d\x36\xb1\x92\x44\x68\xaa\xc3\xed\x0d\x91\xa6\xf2\xa9\x6f\x6d\xdb\xee\x14\x53\xac\x7e\x2b\xee\x2d\x68\x6b\x79\xbb\x34\xda\xfe\xae\x05\x6f\x86\x84\x78\x4c\x2c\x00\x2b\xaa\x40\xfa\xa5\xa2\xaa\x45\xab\x7f\xff\x6e\xff\xec\x18\x9f\xc1\x10\x5b\x10\x60\x0c\x2b\x6a\x8f\x00\xd1\xe1\x3b\x64\xd1\x8d\xce\xcf\x36\x64\xeb\x3a\x8c\x0e\x60\x88\x2b\x12\xd1\x14\x34\xa3\xf0\x45\x08\x99\xc4\x96\x11\x14\xdc\x3d\x9c\x93\xa9\x6d\x40\xb3\x2e\xa7\x3c\xeb\xed\x16\xf1\x87\xd8\x6b\xaf\xd6\x83\x84\xc9\xec\x12\x0f\xc4\x1f\x0a\x2a\x8f\x8f\x3c\x7e\x9c\xc7\x35\xfb\x86\xd5\xe7\x0f\x53\xcd\xdf\x59\xb4\xb4\xdc\x6a\xea\xa3\x9f\x4d\x07\x8e\xc3\xbf\x7e\x6b\xb1\x1d\x93\x12\x0f\xa8\x0b\xb4\xaf\xb9\xb8\xf4\x99\x4e\xcb\xc6\x13\x9c\x67\xf5\xe8\xfc\xee\xda\xaf\x06\x8b\x03\x25\x1e\x3d\x8f\xf7\x1a\xf6\x43\xfc\x0a\xb9\x91\xbd\x23\x19\x50\x1f\xdf\xc4\x4b\x5b\xd2\x4a\xc4\x50\xb6\x05\xa5\x40\xa7\x5d\x58\x08\x96\xed\xec\x1f\x7f\x4c\x3f\xea\x20\x9d\x7f\xe4\xe4\x68\x1f\x57\x13\x12\x0c\xd6\x43\x89\xa9\x16\x22\x4b\x59\xf0\xe7\x2a\xa1\x9f\x98\x0e\x3e\xb6\x88\x25\x8d\x5b\xe4\xa5\xda\xb0\xb8\x0c\x84\x16\xba\x36\x94\xf1\xd6\xf5\xaa\xda\x3e\x8d\xaf\xe0\xab\xa9\x2a\x8e\xac\x87\x16\x58\x5a\x75\x2f\x99\x97\x48\x25\x27\x17\x3e\x1f\x88\x9a\x52\x37\x16\xfc\xbb\x2f\xe8\x02\x9f\xce\x04\x0f\xc4\x20\x81\xf2\xe5\x95\xa7\xc0\x34\xf1\x2e\x06\xcb\xe6\x11\xf2\x52\x05\x62\x62\x46\x4c\x70\x3c\x48\x32\xe1\x3d\xbe\x48\x4d\x50\x7b\x1a\xd6\xed\xf0\xb7\xec\x84\x5d\xdf\xcc\xdc\xb2\x52\xfb\xb2\xaf\xaa\x33\x29\x0f\x15\x46\x62\x10\x5f\x5e\x37\xea\xbb\x9f\x09\x6a\x5c\xee\xfa\x4c\x59\xab\xd6\x6d\x1d\xb1\x8e\x4e\xe9\x28\xe5\x65\x27\xa6\x97\x7d\xc5\xad\x07\xfd\x7b\x35\x70\x29\xeb\x41\x64\x93\xa2\x14\x7e\x32\xb2\xaf\xba\x7c\x90\xfd\x52\x49\x74\x1a\xc5\x2b\x9e\xa7\x9c\xe5\x4c\xcd\x56\xf7\x39\x18\x0c\xe7\x6a\x8c\x39\x53\x8d\xa3\xa8\xea\x66\xad\x97\x22\x56\xd9\x5f\x56\x21\x06\xe0\x8a\x23\x1a\xcd\xa7\x4a\x6a\xfd\xa7\xfa\x74\x06\xab\x12\xe7\xe4\x58\x7e\xcd\x19\xd4\xd3\xc0\xab\xc8\x62\x2c\xfb\xd9\xbd\xdd\xf9\x2d\xfd\x07\x95\x10\xa8\xb9\x95\x60\x42\x08\x6e\x91\xeb\xb0\xf8\xaf\xa8\x92\x0a\x18\x2b\x5c\xa5\x7e\xf8\x88\x2e\xbf\xc7\x34\x5c\x0d\x57\x76\x39\x53\x84\x6d\x55\x7c\xb1\xba\x29\x8e\xfc\x63\x04\xe0\xea\x1b\xd9\xb0\xeb\x70\x8c\xab\x57\x36\x9c\x65\xe9\x65\xc7\x0e\x57\x52\x8d\x4c\x5b\x79\xff\xe3\xe5\xf1\x15\x21\xb6\x88\x78\x1f\xf6\xc6\x03\x0f\xb8\x75\x44\xf4\x74\x30\xb2\xda\x69\xcf\xdc\xdb\xb5\x3a\x53\x53\x98\x0a\x43\x0c\xe5\x13\x4a\x76\xe5\xad\x37\x9a\x6b\x77\xa4\xad\xac\x2a\xdd\xd0\x4a\xa7\x43\x94\x07\x2d\x43\xec\x5a\x98\x11\x15\xd3\xd9\x37\xfd\x48\x63\x5e\xc5\xc7\xac\x2b\x36\x81\x02\xe8\x2a\x80\x2e\x80\xe5\xa6\x73\xb8\x0b\x3a\xbd\xa0\xb2\x46\x87\x97\xa6\x95\xd6\xf8\x19\x16\x33\x79\xab\xf1\x2b\x84\xd7\x3c\x6a\x43\x8e\xcd\x29\x5c\x3b\xe3\x66\x56\x63\xba\xe9\x97\x1b\x53\x9f\x9a\x20\xe2\x1f\xaf\xe6\x66\xb6\xd3\x83\xc9\xc6\x4a\xb3\x76\xf5\x56\xff\xcb\xa5\x2d\x8c\x4a\xf2\x39\x56\x41\xd4\x99\x53\x5d\x62\x31\xaf\x36\x4d\xc0\xf4\xcb\x29\x8a\x1a\xdd\x15\x55\xa7\xe5\xfe\xcc\x38\xc5\x8c\x48\xce\x68\xe9\xb9\x39\xad\x89\x41\xe5\x7e\xba\xc5\xa8\x45\xae\xb1\x4c\x8b\x93\xc6\x22\x13\x25\x65\x44\x1a\xb5\x14\x43\x7c\x0b\x55\xd1\x93\x57\xc7\x7a\xda\x37\x1f\xe9\xe7\xae\x6c\x6e\xd1\xcf\x61\x45\x0f\x71\x34\x43\xdf\x83\x2c\xee\x41\x0a\x60\x52\x69\x03\x14\xca\xbe\x98\xb4\xe2\x5d\x99\xe0\x68\x9c\x54\x3c\xf9\x33\x56\xea\x4f\xfb\x96\xda\x53\x0f\x84\xc2\x8b\x8c\x65\x2c\xa0\x05\x4f\x86\xdb\x23\x50\x32\x07\xcf\x99\x48\x3c\xac\xa8\xc4\x1b\x76\x44\x52\xf0\x83\x86\x33\xee\x8c\x54\x2a\x83\xd1\xd5\x40\xef\xc5\x14\x40\x53\xe9\xa9\x9e\x4a\xd8\x12\xe0\xb6\xdf\x29\x80\x9b\xe7\x81\x68\x54\x35\x35\x9b\x6f\xbc\x4c\x84\x71\x80\xdb\xca\x1e\x07\xc3\xa1\x13\x06\xdb\x4d\xa7\xdb\x0d\x3a\x85\x84\x9a\x9d\xd2\xb3\x73\x96\x96\xb4\xf4\xaf\x51\xba\x4b\x1f\x5c\x87\x06\x7f\x38\x92\x60\xf0\x5e\xbb\x7a\xaa\xb3\x07\x4e\xad\x49\xa2\xba\xc0\x61\x4f\x4d\x83\xb2\x51\xb8\x70\xd8\xc5\x86\x79\xce\x9e\x57\x07\x9e\x7d\x5a\xa0\xaf\xa1\x57\x97\x81\x2c\x04\xea\x20\x34\x41\x88\xc0\x81\xec\x8c\xf0\xbd\x53\x3b\x7e\x12\x51\x68\x82\x57\x04\x27\x43\x3c\x8f\x28\x1c\x8d\x67\x57\x06\x4e\xba\x59\xab\xb0\xe4\x16\x5b\x1e\xfa\x5b\x7b\x4f\x75\xdb\x6e\x8e\x9d\xe2\x19\x6d\x4a\x95\x92\xde\x09\x9d\x34\xbf\x65\x9b\xd4\x74\x82\x7f\x9b\xd2\x97\x3e\x3b\x35\x39\x9e\xd4\x19\xd3\x38\xb5\x6f\x75\xd0\xca\x7c\x05\xd4\xef\x0d\x46\xf9\x6c\xaf\xfb\x28\x7a\x9b\x82\x3a\x2f\x5b\xea\xb8\xe8\x74\xea\xb0\xe9\x10\x72\x85\x5f\xa0\x38\x77\x64\x5d\x82\xb7\x55\xfb\x5d\x1b\x2c\x4b\x1b\x20\x57\x1f\x45\xbe\xd0\x9a\x4e\xa7\xb3\x8a\x8f\xf1\xc8\x27\xf4\x47\x69\xb5\x52\x2d\x50\xf6\x2c\xb8\xb3\x4d\xb4\xbf\x68\x95\xc0\xee\xed\x49\xea\x35\x21\xb4\x89\x1f\x12\x13\x8d\xbf\x82\x66\xc4\xfa\x8a\x30\x91\x36\x1e\x3b\x70\x05\xf5\x4e\xd9\x2c\x88\x89\x7d\x78\x63\x22\x20\xa2\xaa\xd5\x44\xbb\x69\xbd\x49\x3c\x39\xb7\xd5\xd0\xcf\x78\x98\x20\x42\xcd\x82\x5c\x0a\xaf\x4d\xa3\x38\x7b\x4c\xb9\x76\xfc\xb1\x70\xde\xd7\xa5\xd6\xc6\x3b\xbf\x8b\xb8\xd5\x2e\x7c\xc5\xb0\xbb\x26\x97\x3d\xaf\xca\x2e\x14\x44\x6f\xe0\xaa\x31\x5a\x50\x44\xbb\x24\x90\x9b\xdc\x33\x0e\x36\x88\xee\x58\x51\x92\x35\xcd\x2a\xcd\x7b\x99\xaf\x65\xe8\x29\xd5\xac\xd2\x8a\x6a\x55\x11\x7f\xad\xf0\x50\xe5\x6b\x00\x5c\x85\x97\x85\x54\x47\x6c\xb1\x66\x55\xf3\xe3\x8f\xa2\xac\xe4\xd7\xca\x9e\x0d\x7a\x8f\xad\x21\xf6\x45\xf4\x8c\xb8\x43\xbd\xce\x73\xa0\x6d\xc2\x99\x2f\xf0\xff\x5c\xd5\xb7\x8f\x53\xeb\x94\xea\x29\xaf\x0c\x24\xcc\xba\x7e\xc9\xcf\x72\x3e\xcb\x4e\x61\xd0\x42\xa5\xc3\x60\xb4\xff\xf8\x18\xf8\x2d\x67\x14\x18\xc5\x99\x84\x14\xb4\x2f\x1b\xe8\x57\xa3\x6a\x33\x32\x30\xcc\x46\x95\xfd\xfb\x71\x4f\xd0\xd1\xbc\xf9\x50\x65\x46\x39\x22\x4b\xb9\x4b\x38\xd3\x31\x02\x91\x68\x98\x68\xc5\x6a\x41\x66\xd5\xe4\x46\xae\x38\xdf\x5d\x75\xbe\x83\x70\x73\xeb\x05\xb8\x97\xf2\xb2\x9d\x67\x36\x26\xf2\x6a\x0f\xa5\xba\x72\x29\x45\xa4\x36\xb0\x19\x2f\x7a\xae\x5f\x63\x2e\xe4\x30\xbf\x4b\x95\xc3\x48\xcb\x7d\xe8\xf5\xfa\x81\xad\xeb\x44\xfb\x65\x61\x6c\xcd\xbe\xdb\x9a\x41\xd7\x66\xad\x68\x1a\xb9\x02\x27\x7d\x83\x8a\xf0\x9f\x97\xf4\xc1\x71\x3b\x81\xad\xf3\x20\x81\x28\x29\xcc\xa3\x22\x5e\x05\xed\x95\x2f\x5f\x9d\x99\xe2\xb2\xe1\xd1\xd1\x44\x4d\xd6\xbd\x32\x56\xb5\x36\xf7\x6c\x79\xeb\x7c\x3b\xb4\x85\xd8\x51\x5a\x95\xc9\x90\xa2\x77\xbe\x66\x6a\x76\x5c\x15\x89\xa7\x79\x5b\xb6\x20\x76\x2e\x58\xe0\x81\x4b\x8a\x55\x3b\x90\xe1\xac\xb2\x61\xc1\x87\xe4\x35\x93\x83\x57\x44\x43\x4c\x89\x6c\x39\xb7\xc6\xd8\xa5\x5d\x8d\xc6\xe9\x33\x9d\xe6\xb2\x8c\x13\x35\x68\x09\x8f\x81\x42\x16\x83\x4b\x98\xa2\x2b\x5e\xe0\x30\x00\xc3\xde\xae\x12\x4a\xef\xa7\x18\x66\xa2\x21\x39\x69\x90\xd6\x23\xee\xba\x9a\x9a\x59\xb3\x02\x7d\x3d\x62\xf1\x15\xc2\x72\x14\xfc\x4d\x22\xd5\x44\xc0\xca\xb0\x1c\x6b\xd0\xf2\x65\x6e\xcf\x60\xe3\xea\x3b\x3f\xb6\x46\xb9\xf3\x59\x90\x41\x03\xab\xdf\xc5\xc0\x06\x39\xc3\xdc\xa4\x19\x16\x88\xdc\xa2\xcf\x30\x09\x6f\x08\x5e\x29\xb4\xc3\xec\x5d\x15\x4f\x3e\x98\x7a\x9b\x35\xa2\x03\xbb\x61\x98\xe2\x72\x2e\xff\xd3\x97\x5c\xa3\x78\x47\xe5\x1e\x7a\xc3\xd7\x64\x68\x15\xa2\x4f\x80\xc6\x64\xc0\x1d\xd8\xe4\x9a\x79\x83\x7d\x60\xf0\x47\x9f\x86\xdb\x85\x97\x43\xb1\x71\x3b\x58\x19\x6b\x09\x66\xaa\x55\x8e\xac\x5e\x9e\xbb\xb0\xb6\x22\x38\x60\xff\x57\x71\x07\x44\x35\xad\xf1\xef\xef\xdf\x0f\xbc\x48\x0b\xf8\x4e\x9b\x17\x3f\x2c\x88\xe6\xfc\x6c\xdb\xa0\x91\x67\x8d\xf2\x47\x2e\xf6\xae\x2a\xe6\xec\x3e\x90\x33\xf9\x4d\x3e\x4c\x0b\x01\x8d\x81\xf0\xe1\xa3\xcd\x11\xee\xdf\xdf\x83\x2c\x65\xb7\xdd\xa2\x2e\x4b\x50\xab\x32\x10\x77\x5a\x3e\xdb\x44\xc3\x1f\xa1\x58\x69\x34\xfa\x61\x0a\x8e\x67\x2c\x87\x00\x53\x25\xb6\x57\xd4\x69\xb9\xb8\xb8\x27\x8a\x13\xfa\xc6\xed\x3f\xfc\x1d\x27\x3c\x1a\x3e\x56\x8b\x44\x33\x1a\xd6\x5c\xd8\x21\x10\x3c\x35\x1b\xdb\xc7\x29\x88\x31\x8c\xef\xd6\xf0\x45\xae\xf0\x0b\x6f\x4e\xd8\x4b\xec\x49\xb5\x1d\x78\xf7\x14\x44\xe6\xea\xdf\x65\xe6\x3d\xa5\xad\xcb\x4e\x75\x56\x27\xa1\x27\x08\x08\xd0\x0c\xae\xbd\x46\x47\x33\x9b\x78\xd0\x01\xb8\x3b\x18\xd0\xa2\x6c\xf6\x1d\x15\xc5\xa1\x91\x02\xde\xf1\x0c\xcc\x7c\x0f\x0a\xa6\x8c\xe5\x1d\xb4\xd8\x74\xd0\x94\xd8\x62\x0d\x32\xb2\x2e\xee\xf9\x0c\x35\x7a\x30\xed\x00\x6a\xa3\x0f\x03\xe1\x6c\xa0\xcd\x63\xa0\xe9\xc2\x4c\xe5\xa0\x05\xe0\x4f\xd0\x92\x60\x3a\x75\x80\x85\xbc\x02\x2a\x74\x0b\x72\x45\xd1\x02\x73\x7f\xff\xf6\x92\x43\xff\xfb\x77\x47\xc0\x33\x34\xde\xb6\x5d\x9e\x27\x58\x84\xe8\x07\xc7\x09\xa1\x54\xd1\x6e\x76\x75\x1a\x23\xd7\x99\x0c\x17\x32\x83\xe8\xb4\xe0\x85\x24\xae\xf3\x04\x82\x83\x9a\xa3\x6c\x3b\x2d\x41\x3f\x15\xea\x6d\x78\x90\x58\x9e\x50\x24\x6f\x03\x60\x4a\xda\xda\x34\x0f\xd9\xc6\x18\x43\x46\xfb\x40\x4c\x26\xbd\xea\xa7\x24\x9f\x5e\x12\xf3\x4a\x3b\x42\xde\x69\x85\x84\xe7\x9b\xe7\x6e\x84\x9d\x3f\x3f\xd5\x9a\x0a\x59\xe1\x5c\x13\xda\x41\x3d\x19\x5b\x64\x28\x7c\xd3\x09\x04\xae\xfb\xc0\xd6\x77\xa4\xd0\xa7\xa6\x05\x82\xdd\x05\x4f\x0e\x91\x97\x3c\xf6\x7d\x47\xa7\x00\x2b\xc7\x11\x72\xc3\x33\x46\xc7\xc5\x46\xe2\x03\x32\x5e\x7a\x31\xde\x40\x9e\x5c\x21\x89\x60\x91\xba\xb4\xf4\x58\x8e\x4d\x77\xe1\xdc\x90\x8f\x78\x4a\xb4\xef\xa1\xe8\xa1\x40\x31\x0a\x7e\x9f\xb4\x62\x27\xb4\xec\xb4\xb7\x6a\x4e\x5a\x46\xa1\xe1\xd2\x13\xf0\xba\xb3\x6b\x14\x56\x96\xbf\x2c\x9c\x11\xdd\x47\xa5\x86\xc2\x18\xa1\x35\x5c\xf0\x7a\x7e\xb0\xe0\x0c\x82\x85\x06\xd1\x31\x0b\xc7\x3d\xaf\xd9\x3a\x6c\x8d\xcc\x85\x41\xe0\x05\xad\xe7\xc0\x5f\x70\x5f\xbf\x2c\xd0\xc9\xb9\xb0\xdd\xe9\x0d\xc7\x94\xaf\x34\x1e\x35\x7b\x83\xe1\x02\x88\xc4\x01\x1b\x34\x1c\xef\x5f\x2e\x74\x5a\x5e\xd0\x25\x2a\x68\xa1\xd4\xe9\x2c\xf4\x28\x75\x20\x20\x53\x0d\xdb\xbd\xfe\xeb\x00\x2e\x85\xbe\x2c\xac\xe6\x72\xeb\x19\xfa\xf3\xc7\x3c\x88\xa2\xec\x05\x72\x0e\x17\x2e\x44\xa4\x07\x3f\xfb\x65\x79\x25\xde\xb1\x5d\xfd\x6c\xf6\x1a\x91\xfd\xdc\x49\x1c\x09\xf7\x86\xb0\x80\x2b\xc4\xe0\xd2\x79\xd3\xa1\x34\xab\xde\x89\x0c\xc4\x67\x0e\x73\x77\x4d\x3a\x4e\x7a\x92\xeb\x68\xb0\x1a\x65\x1d\x5c\x2a\x0a\x20\x71\xd4\xf7\x57\xed\xdc\xf4\xc6\xee\x62\x6c\x71\x78\x26\x2d\x8a\x95\x5f\xf9\xfb\x1d\x43\xd6\xa7\xef\xcf\x6e\x55\xae\xe0\xdb\x61\xed\x84\x99\x22\x85\x52\x64\x3d\x09\x67\xf9\x74\x30\xea\x96\xf5\xe2\x9c\x74\x0c\x97\x8b\x4a\x74\xb4\x40\xf4\xfc\x6a\x26\x63\xe6\x7e\xd9\x78\x42\x34\x4f\x06\x3c\x55\x83\x53\x54\x0f\x6a\x91\x60\x98\xc4\x49\x6d\xa9\x21\xf8\x2a\xfb\x09\x97\x3b\x3d\x89\x31\x59\xdf\xaf\x6a\x88\xd8\x25\xed\xf9\xb6\xb0\x62\xb0\x9e\xaa\x9a\x07\xe7\x78\x71\x3e\x55\x63\xdf\x31\x98\x80\x5c\x21\x42\x62\x34\x2f\x5f\xdd\x42\x97\x31\x02\x2c\xc3\x9f\xc7\xf3\x62\xf0\xd0\x10\xc6\x71\x40\xdd\x35\xa9\x0d\x8f\x76\x0d\xaa\xd1\xec\x31\x01\x77\x93\x0d\x1b\x73\x0e\x80\xe7\x31\x0d\xb0\x6a\xdd\xd7\x5c\xd2\x1f\x75\xaf\x1a\x9d\xde\x32\x1b\x58\xc0\xc4\x09\xdf\x53\x3b\x75\x28\xba\xc2\xbb\x51\xde\x40\x6b\x4e\x42\x12\xb9\xc4\x8e\xfd\x98\x4b\x82\x10\x71\x28\x68\xfd\xb2\xce\x12\xbf\x33\x2d\x70\xbf\xb3\xb4\x24\xc7\xe3\x66\x3e\x71\x27\x15\xe2\xa5\x3a\x77\xf2\xc0\x77\xd9\xd2\xac\x00\xb2\xda\x28\x0c\x65\x87\xfd\xa4\x17\x2c\x7d\x19\xf6\xab\xc5\x86\x58\x26\x56\x20\x22\x60\x28\xd2\x51\x1c\x65\x5c\xa3\xa0\x10\xbb\x44\x21\xf2\x52\xcf\x76\x1e\xe6\x79\x99\x49\xc0\x7d\xd4\x8f\xd8\xa7\xb2\xae\x1c\x73\x0d\x5d\x4b\xaf\x31\x4f\x84\x09\x32\x15\x0e\xf3\xa6\x3a\x25\xd4\x8d\x48\x7b\x87\x36\x22\x90\x2b\x86\x48\xc0\x54\x9b\x04\x5f\xe0\x21\xb6\x0a\x2e\x05\x71\x4b\x88\x3f\xf4\xa0\x57\x8a\xf0\x02\xa6\xda\x3a\xf8\x8a\x21\xc6\x76\x9e\x02\x39\xb3\xcb\x9f\x3b\x5f\xec\x1b\x99\x8b\x91\xb6\x76\x6c\x60\xa9\x82\x33\xc7\xfa\xe6\xe9\xc2\x5d\x0f\x71\x13\x83\xd5\x42\xa4\x43\x82\x64\xb6\x73\x44\xd0\x21\x50\x8e\xd0\xa3\x66\x0b\x9d\xa0\xb6\xca\x27\x3c\xcc\x16\xb6\x0e\x8b\xa1\xd5\x88\xce\x7f\x08\x49\x69\x23\x06\x88\x05\x8f\x8d\xe8\xb2\xee\x0f\x5f\x18\xf1\xbe\xc0\x1f\xbe\xf9\x02\x26\x73\x68\xd0\xe9\x1b\x7c\x5c\xd3\xce\x71\xd9\x6b\x51\xd9\xe1\x80\x49\x44\xb9\xf2\xa9\x8c\x2d\x98\x53\xa7\x6e\x07\x14\x43\xc7\x14\x1b\x2c\x67\x8a\xd1\x62\x15\x23\xe4\x11\x44\x84\xcb\x96\x2e\xa0\x9c\xdb\xf6\x2d\xd5\x49\x5b\x1b\xc2\x0f\xd6\xa9\xd0\xde\xa1\xb5\x9b\xc4\x5c\x06\x2d\x2c\x97\xef\x65\x4c\x97\xf1\x25\xed\x68\x81\x81\x78\xd1\xf0\x85\x0d\x4f\x02\x2f\xd0\x01\xb7\xd3\xc4\xe8\xd3\x6c\xd4\x6d\x58\x61\xd3\x0c\xe0\x45\x9f\xe6\x61\xd9\x49\x1a\xd5\x76\xab\x85\x5e\x75\x26\xa2\x65\x94\x7b\x40\x1c\xbd\x76\xdc\xe1\xb0\x1b\x88\xc3\x8e\xc0\x0c\xf8\xb0\x5b\xdc\x09\x1a\xc1\x60\x40\x87\x57\xd3\x19\x2e\x38\x1d\xe2\x01\xfc\x57\x78\x63\x62\x4b\x38\x3a\x13\x65\xb6\x92\xf8\xb2\xed\x74\x3a\x81\xcf\x24\xde\xa2\xa6\x25\xdc\xff\x58\x51\x3f\xaa\xa8\x3f\x53\xd1\x0b\x55\xe4\x61\x98\x3a\xaa\x0e\x99\x63\x5b\x26\x7e\x00\x3f\x10\xbd\x66\x24\xd5\x12\x46\x8b\xb4\x6c\xa5\x6f\xdf\x8a\x74\xf0\x65\x40\xa9\x87\x53\xae\x86\xb6\x33\xa5\x32\xd8\x85\x95\xa1\x33\x2f\xd2\x47\xb5\x26\x81\xe1\x54\x04\x9a\x94\x05\x0b\xc2\x8e\x6c\x54\xb5\xf5\x78\xf0\xa3\x72\xc2\x76\xcb\x85\x3b\x0b\x36\x3a\x3e\xf2\xe1\x6c\xc2\xc1\x12\xee\xa4\x2e\x1a\x58\xd9\xb4\x05\x1d\x28\x62\x35\x2c\x81\xd3\xa6\xd2\x8e\x84\xce\xe3\x71\x19\xce\x5c\x11\xa9\x07\x48\x4f\xa8\xa2\x21\xc4\xf0\xa8\xf5\x18\xf4\xc6\xa3\x62\xf4\x64\xad\xef\xae\x11\x23\xd6\xe1\x85\xed\x3a\xb3\x82\xcf\x71\x95\x98\x2f\x48\x69\x68\xe6\x43\x3e\x78\x9e\xab\xa9\xbc\xb9\x07\x83\x6a\x03\x16\xff\xd4\x8e\x6c\xa7\x81\xe5\x3f\xea\x53\xd6\xf3\xbe\x7e\x4b\x4a\xcc\x4e\xed\xf2\x89\xfd\x2e\xd1\xcf\x57\xbb\x84\x88\xd1\xf2\xb9\x39\xa4\xd5\xcf\xe0\xbd\xec\xa5\x8f\xcb\xea\x3c\x54\x49\x43\x9c\x17\x42\x29\x94\xb0\x0e\x18\x92\x5e\x37\xc0\x24\xd9\x1f\x5b\x85\x20\x1c\x7a\xbb\x72\xe6\x4b\x4f\xb4\xab\xf0\x0d\x96\x3d\xef\x10\x92\x59\x95\xa6\xe9\x35\x9d\xc1\x30\x18\x59\x87\x7d\xc7\x84\xaf\x45\x08\xdd\x9e\xcb\x20\xfe\x84\xa3\x72\xb5\x9e\x43\x6d\xf9\xbf\xc8\x43\xc8\x6d\x65\x3d\x41\x11\xfd\xf9\x1c\x0c\x5a\x8d\x96\x87\x00\x57\xe0\x17\x3f\xf9\x42\xd3\xa9\xe4\xa7\x9f\xe4\x90\xee\xcc\x58\xbf\x49\x5d\xc7\x61\xb7\xc9\x6e\xac\x99\xa7\x7d\x84\x89\x6b\x74\x9c\x28\x10\xa1\x58\x16\xef\x34\x50\xd6\xd7\xdc\x14\x6a\xce\x72\xa2\x6f\x53\x3e\x8e\x0b\x68\x07\x17\x70\x28\xfa\xb3\xd1\xc6\xb1\x76\x80\x83\xc1\xd1\x14\x53\x01\x0f\xaf\x1f\xa1\x60\x6e\x83\xd5\xc3\x78\xca\xda\x57\xcd\x27\x4c\x6e\xba\xd9\x41\x1b\x1e\x3a\x22\x4a\x45\x3f\x09\xda\x11\x3a\x92\x28\xbc\xb4\xa4\x81\x2a\x30\x24\xfd\xd8\xd2\x2e\xb5\x9f\x75\x84\xe2\xb0\x8f\xf9\xfd\x5e\x84\x4c\xa0\xab\xe0\x3c\x40\x10\xc2\x32\x46\x0b\xc6\x9a\x9a\x9f\x0c\x25\x00\xc4\xe6\x91\x84\x1a\xad\xfe\x04\x9f\x41\xef\xc2\xcf\x35\xbb\x75\xbf\x68\x2c\x2d\x8d\x99\x72\xc8\x09\x3e\xa2\xd3\x30\xf4\xeb\x96\x71\x44\x03\x45\xae\x5b\xd4\x19\xc5\x6b\x99\xf6\x4f\x0b\x67\x53\xb4\xfc\x5a\x90\x9c\x8a\x54\x97\x85\xf2\x33\x5b\xa5\xdd\xc1\x79\x6d\xea\x94\xc5\x73\xe2\x52\xf7\x02\x8b\x33\x7d\x1a\xb0\x65\xa5\x97\xb6\xcf\xb6\x10\x5d\x41\x63\x11\x94\x77\x52\x90\xe8\xec\x7e\xe9\x59\x20\x36\x14\xff\xf3\x4f\x5a\x0e\xc3\xe6\x9f\xe3\x6e\xa7\xe7\xf8\x15\xa7\xeb\x77\x82\x81\xa9\x52\x87\x0e\x11\xe5\x57\xfa\x27\x66\x2b\xaa\x37\x7b\xa7\xee\x43\xe0\x8d\x16\x9e\xf3\xd9\x75\x6b\x61\x0f\x99\x17\xce\x3a\xce\x2b\x31\x02\x3e\x4d\x9a\x94\xae\x76\xfd\x85\xe0\xd1\x25\x7c\x99\xf9\xb2\xd0\x1c\x8d\xfa\xd6\xca\x8a\xdb\xe9\x85\x59\x3f\xf0\x7a\x84\x27\xfb\x23\x6a\xd2\xe3\xca\xf0\xa5\xd1\x63\x68\x2b\x5f\x74\xd0\xc4\x4b\xd0\x90\x81\x89\xd8\x5c\x28\xd3\x79\xd4\x58\xa8\x8e\x02\x67\x40\xcc\x0c\xe0\xd2\xd7\x01\xad\x0f\x67\x48\xd0\x93\xbc\xc9\x91\xe0\x4d\xac\xa8\xca\x97\x97\x97\x6c\xaf\x4f\x69\x7c\xe3\x97\xed\x0d\xc2\x15\xc9\xbf\x0c\x57\x1e\x5b\xa3\x8c\x62\x66\xfa\xcd\xfe\x97\x04\xff\x31\xa9\xce\x1a\xb0\x0b\xe7\xd4\x10\x07\x38\xb5\x47\x22\xe3\x04\x3e\x1f\x0d\x1c\xbb\x5b\xec\x5a\xed\x11\x71\x25\xd6\xbb\x14\x16\x52\xaa\x08\xfc\x01\x21\x39\xee\x33\xb6\xd9\x33\x90\x23\x6e\x33\x68\xc0\x62\xed\x9c\xae\xd1\xb5\xfb\x11\x5f\x10\x1b\xbb\xf5\xed\x7e\x2d\x08\xea\xa9\xbc\xf0\xe2\xb9\x1b\xc0\x0d\x76\xae\x30\xfc\xd9\x07\x7b\x3b\x14\x72\xb1\x7e\x6d\x58\xe7\x5c\x39\x93\x1f\x61\xa7\x4f\x6b\xd2\x00\x58\x6a\x4b\xf4\x59\xff\x88\x0b\x7c\x96\x95\x2d\x8c\xa6\x5d\xfb\x74\x2a\x58\x87\x27\xf4\x43\x3a\x26\x89\x7d\xdd\x7e\x7b\x8c\x1e\x1d\x15\x74\x6f\x08\x5e\x4c\x46\xe9\x87\xeb\xec\xa3\x03\x19\xe3\x55\x25\x3c\x95\x99\xcc\x89\x13\xae\x9b\xac\xd4\x10\x27\x5c\x40\xd3\xa2\x10\xc4\x09\x83\x43\x46\x15\xaf\xb4\xd3\xa5\x73\x3e\xf4\x19\x5a\x86\xb4\x7c\x2d\x16\xd4\xc8\xef\x35\x58\x0c\xc2\xf3\xf2\xe0\x25\xdb\xef\x8c\x43\xa2\x59\x96\x96\xe8\xf9\x91\x8e\x1e\x88\x6f\x86\x50\x47\x20\xa2\x24\xfe\x5c\x1b\xf5\x1d\xa0\x14\x97\x96\xde\xd0\x1b\xb4\xfa\x98\x5f\xbe\xf9\x92\x20\x13\x1f\x84\xbb\x8c\x54\xcd\xc9\xbc\x95\x32\xf7\xf5\xdf\xff\x1a\x1a\xe9\x15\xf3\xcb\xa9\x21\x3f\xfc\x6b\x98\x1e\x50\x62\x9a\x50\x49\xe6\x8f\x7a\xda\x58\x31\xa9\x95\x5a\x6b\x95\x8d\xff\xe0\xa5\xf6\xec\xd5\xd9\x78\x40\x3c\x0a\x27\x0f\x7d\x42\x7d\x98\x61\xd7\xce\x13\x29\xbb\x56\x70\x0b\x4c\x2a\x42\x55\x49\x10\x44\x25\x5a\x7e\xcf\xc1\xad\xd8\x07\xa9\x67\x42\x9b\x1e\xa2\x5b\xaa\xde\x7b\xa2\xf7\x92\x00\x1c\x83\x00\x64\xd9\x20\xaf\x1f\x79\xbb\x02\x80\xf3\x80\x4d\xa8\x72\x59\xf0\x59\xc8\xf7\xe6\xe5\x7a\xa1\x5c\x5a\x85\x1b\x54\xe1\x6a\x9e\x2d\xc7\xaa\x2f\x8e\xdd\xd9\x91\x10\xde\x78\x2b\x6c\xb0\x28\x6d\xd7\x50\xeb\xe9\x33\xa0\xe3\xb8\xea\x2d\xe3\x5d\xd9\xa8\xb9\xc9\x59\x28\x07\xa3\x6b\x67\xd0\x82\xdc\x3e\x75\x49\x67\x04\x8f\xea\x30\x80\x2b\x07\x7e\x84\x0f\x4c\xc9\xe8\x5e\x5c\x12\xff\xf3\xd5\x75\xb0\xb7\xe1\x8d\x2d\x70\xb2\x44\xd9\x2d\x2d\x6d\xfe\x94\x9f\xa9\x51\x04\xfc\xa5\xec\xf0\x75\x50\x43\xf9\x6b\x6b\x3b\x59\x37\x64\x93\x69\x5b\xf9\x80\xa1\xa4\xa7\xb1\xd3\x81\x13\xa9\x90\x48\xf7\x66\xb9\xa0\x16\x65\x77\xcb\x31\xbf\xa8\x6b\x42\x24\x3c\xec\x99\xfa\x6b\x85\xbe\xb7\x8b\x6d\xcb\xe5\x6d\x1d\xa7\xef\xed\x23\x68\x4c\x27\x5e\xdd\x94\xd0\x91\xd7\x36\xd4\xa2\xc2\x97\x8e\x9b\x9a\x54\xcd\x77\x3d\x92\xa5\xf5\x91\xdd\xae\x0d\xde\xea\x35\x87\x48\x69\x22\xc1\xe6\xe7\x4c\xb8\x01\x92\xd9\x39\xf3\x99\x33\x70\x1e\x87\xfa\xc5\xa5\xee\x2f\xa8\xed\x4c\xcd\x97\x41\x6b\x06\x94\x3c\x07\x6b\xb7\x3e\xf7\x9c\x36\xcc\x9b\xe0\x2c\x69\x34\x4d\x7d\x35\x6c\xac\xd7\xa1\x86\xfa\x55\xfb\x1c\x15\x1c\x1c\xd2\x14\xbd\xeb\xe3\x95\x53\x97\xc4\xfd\x97\x18\x3e\x8d\x9c\x8a\xa2\xf6\xed\x31\x7b\x7c\x4c\x64\x75\x0b\xce\x9a\xae\x2e\x8e\x88\x61\xb9\x25\x7a\x8f\x68\x52\x3a\xcd\x4b\xec\x2d\x87\x90\xdb\xf7\x4d\x23\xfd\xad\xed\xe8\x65\xfc\x1e\x35\x1d\x2e\x74\x45\xc6\xa9\x12\x23\x10\x22\x93\xb1\xff\x50\xd3\xc3\x1e\x31\x44\x9f\xb7\xd4\xb1\xf5\xa0\x7f\x45\x81\xd9\x71\xf5\xe6\xc0\xd7\x1a\x4b\x6d\x3f\x41\x33\x1f\x91\xce\xbb\x5e\xa9\x5a\x70\xdc\xd4\x3e\x1f\x8e\xc8\x68\x7f\x09\xfa\x82\xdc\x97\x98\x53\x88\x98\x46\x8a\x28\x73\xed\xfd\xae\x93\x8e\x00\x1d\x1d\x18\xe9\x41\x47\x4b\xb8\x6e\x1a\xe9\xae\x9e\x70\x11\x1a\xe9\x27\x3d\x61\x8f\x72\x8c\x03\x42\x26\x6e\x3a\x75\x58\x8a\xd3\x9f\xca\x46\xba\xa7\x67\x44\xc2\x71\xc9\x50\x21\x57\xa2\x55\x83\x6b\x79\x61\x11\x85\x0b\x60\x0f\xaa\xdb\x35\xbf\x9e\x76\xb6\xd3\x1e\x7e\x8f\x4b\x05\xdf\x9e\x48\xc1\xaa\xc1\xde\x4d\xe9\x68\x2a\x08\xcf\x0f\x60\x07\xd3\x84\x84\x10\x9b\x78\x8c\x80\xa1\x69\xfb\xe6\xd1\x11\xc8\xe9\x9f\x8c\xce\x6d\xf7\xb3\xc1\x71\xed\x93\xee\x4c\xe3\x1f\xff\xfb\x03\x73\x5a\x42\x93\xce\x67\x87\xf8\x39\x28\x7c\x1c\x85\x99\x31\x38\xed\xa2\x53\x27\x25\x31\x0a\x54\xe2\xef\x46\xe1\x8c\x0b\x3c\x8b\x51\xf8\xf2\xd6\x75\xa6\xb7\x82\x0b\x8b\x95\x2b\xe3\xb6\xed\x1b\x5f\xed\x53\xa0\x31\x26\x16\x70\xd2\xe8\xdf\xa2\x22\xf9\xa9\x6e\xdb\x3a\x29\x27\x22\x33\x98\x1e\x4b\xa3\xbf\x3d\x0a\x7d\x43\xa1\xdd\x29\x54\xaa\xea\xb6\x97\xee\x34\xd2\x4e\x6c\xc7\xa9\xb3\xd9\xaf\xd5\xf8\x0e\x65\xd7\x56\xb6\x6d\xb9\x7a\x11\x4e\x7a\x20\xe8\xc8\xe7\x0c\x4b\x8a\x0c\xf7\xaf\xa2\x0c\x79\x99\x21\x9f\xc8\x30\x08\x9e\xa3\x1c\xab\x32\xc7\xaa\xcc\xa1\xb9\x06\xaf\xce\x68\x9d\xf7\x76\x7f\xba\xf4\xa7\xf8\x35\x6f\xe1\xe5\x97\x78\xc9\xd1\xcb\xfe\x15\x7d\xd9\xbf\x12\x5f\xf6\xaf\x7e\x89\x17\x7c\xa1\xaa\xe8\x13\xfd\xc5\x37\xfd\x9e\xf8\x35\xba\x06\x8f\x14\x5a\xc0\x18\x84\xae\x03\xe3\x5a\x27\x32\x7e\x77\x0b\x6e\x26\x63\xbc\xb3\x92\x8b\x5b\x97\x7a\x2e\x49\xf5\x58\x70\x23\x0a\x45\x08\x23\x02\xdb\x3e\x0e\x59\x1b\x5c\xbc\x69\x38\x76\x0a\x5e\x80\x50\xc6\x0b\xfc\x55\x7f\x7d\x2b\x43\x83\xc1\x01\xdd\xe4\x78\xcd\xdd\xe7\xa0\x3b\x4a\x2d\xf6\xba\x6e\x40\x15\x04\x82\xe2\x5e\xd4\xf9\xaa\xb9\xc4\x78\x32\x0c\xea\xe7\x94\x79\x32\xdf\x4c\xad\xed\x89\x63\xbe\x96\x99\x81\x42\xc7\xde\xf8\x50\x9c\x7e\x15\xc8\x2e\x3e\x3b\x09\xe9\x62\xfd\xef\x0a\x37\x43\x5b\xaf\xfb\xfe\x3c\x01\xa0\xc8\x8d\x83\x46\x5b\x89\x25\x4d\xc0\xd1\xc6\xdd\x3f\x9f\x75\x5b\x54\xd1\xc9\x45\x6a\x71\x10\x84\x94\x09\x0c\xc8\x60\xd1\xbc\x0d\x8c\xf4\x62\x18\xf4\xf0\x3a\x5c\x34\x4b\x49\x49\xc5\x76\x74\x59\x62\xef\x40\x4c\xd8\x67\x9f\xfc\x58\xd7\x4e\x2a\x72\x61\xac\x38\xe1\x52\x95\x9a\x51\xd0\x14\xe5\xdf\x39\xc5\x06\xcf\x28\x72\x50\x0b\xd2\x0f\x03\x62\x90\xce\x1f\x1d\xd3\xb7\xc7\x0d\x61\xcd\xab\x29\xae\x78\x88\x39\x56\x69\x42\x26\x00\xf5\x26\xaf\xe0\x4b\xee\xfd\x86\x88\x96\x56\x6a\xa7\x0c\xe9\x18\x4b\x0e\xcc\xf5\xdd\x35\x19\x57\xac\x89\x2b\x3e\xdb\x1e\x84\xc5\x6f\x2d\xbe\x58\xfe\xfd\xdb\x13\x77\xbb\x96\x28\x06\x16\x30\xc1\xb4\xed\x68\xf7\xe2\xb1\x0f\x1d\x90\x49\x42\x6e\xe6\xc7\x9d\x69\x82\xa9\x06\x70\xd5\x9d\x84\x5d\x60\x21\x10\xee\x6d\x94\xbd\x62\xca\x53\x57\xd6\xec\xf1\x99\x4b\x98\x31\x08\x94\x14\x50\x34\xad\xce\x24\x00\x61\x2b\x1b\x33\x3e\xbb\xaa\xa9\x2e\xa6\xc0\x55\x53\x10\xdb\x87\x3c\xb3\x3e\x23\x2b\xb3\xef\xd1\x0c\xd7\x16\x4b\x3b\x8b\xe6\x62\x69\x17\x7f\xf6\xf0\xa7\x8c\x3f\x47\xf8\x73\x8c\x3f\xa7\xf8\x73\xb1\x68\x06\xdb\xf4\x7b\x85\x97\x7b\xfa\xb3\x55\xc2\x9f\x2d\xfc\x41\xf1\x2d\x14\xdf\x42\xf1\x2d\x14\xdf\xaa\xe0\xcf\x3e\xfe\x1c\xe0\xcf\x09\xfe\x10\xa0\x7e\x83\x7e\xab\x78\xb9\xc4\x9f\x1b\xfc\xb9\xc3\x1f\x80\xdc\x06\xc8\x6d\x40\xdb\x06\xa0\x6d\x00\xda\x06\xa0\x6d\x00\xda\x46\x8b\xb6\xd1\xa2\x6d\x40\xdb\x46\xb3\xb6\x2f\xf0\x07\xf0\xb6\xd1\xb0\xed\x6b\xfc\x01\xbc\x6d\xc0\xdb\x41\x9b\x76\x50\xff\xce\x21\xfe\xa0\xec\x0e\x8a\xed\xe0\xeb\xee\x36\xfe\x20\xcb\x2e\x2a\xda\x05\xa8\x5d\x80\xda\x45\xd3\xf6\x50\xe5\x1e\xca\xee\xa1\xd8\x1e\xbe\x96\xd1\xbe\x32\xba\x5c\x46\x23\xcb\x28\x5b\x46\xfb\xca\xc8\x52\x46\xab\xca\xe7\xf8\xc3\x99\x01\xa5\x8c\x0e\x96\xd1\xa0\x0a\x7d\xdd\xa1\xce\x57\x90\x5c\x41\x63\xf7\x01\x63\x1f\x30\xf6\xd1\xb3\x7d\x14\xdf\x47\xf1\x7d\x14\xdf\x47\x4b\xf6\x91\xf9\x00\xc0\x0f\xd0\xec\x83\x33\xfa\x73\x88\x12\x87\x68\xf1\x21\xaa\x3e\x44\x3b\x0f\x91\xe5\x10\x00\x0e\x39\x0b\x00\x1c\xa2\xea\x43\x74\xf4\x08\xcd\x3e\xa2\x66\x57\xb6\xcd\x2f\x8b\x47\x18\x8a\x23\xe4\x38\x42\x15\x47\xa8\xe2\x08\xed\x39\xc2\xe0\x1d\xa1\xad\xc7\x28\x70\x8c\xe6\x1d\xa3\xb2\x63\x54\x76\x8c\xca\x8e\x51\xf6\x18\xad\x3d\x46\x8d\xc7\xa8\xf1\x18\xa0\x8e\x01\xe5\x18\x50\x8e\x01\xe5\x18\x75\x1f\xdf\xe2\x0f\xc3\x43\x2b\x4e\x00\xf4\x04\xf0\x4e\x00\xef\x04\xed\x3e\x01\xa8\x13\x74\xed\x04\xed\x3e\x01\xa8\x13\x64\x3e\x05\xf8\x33\x94\x38\x43\x89\x33\x94\x38\x43\x0b\xce\xd0\x82\x33\x14\x3b\x43\x95\x67\xa8\xe8\x0c\x75\x9c\x23\xf3\x05\x40\x5d\xa0\x5b\x17\x68\xcb\x05\xbe\x56\xf1\xa1\x8a\x49\xab\x62\xc2\xab\xe8\x56\x15\x40\xab\x00\x5a\x05\xd0\x2a\xda\x52\x05\xe4\x2a\x20\x57\x51\x79\x15\x7d\xab\x02\x5e\x15\xad\xaa\xa2\xb6\x2a\xfa\x56\x45\x6d\x55\x6a\xe4\x25\x6d\x87\x4b\xc0\xb8\x04\x8c\x4b\x5a\x2a\x77\x34\xbf\x97\x28\x7c\x89\xc2\x97\x54\xf8\x1e\x29\x28\x7a\x89\xa2\x97\x68\xcf\x25\xfa\x77\x85\x46\x5d\xa1\xf0\x15\xe5\xbf\x21\x48\x57\x00\x7b\x85\x6f\xd7\x68\xe6\x35\x5a\x78\x0d\x30\xd7\xe8\xc9\x0d\xfa\x74\x87\xb4\x3b\xbc\xde\xa3\xf8\x3d\x6a\xba\xbf\x59\xac\x17\xfc\x56\x6a\x31\x7c\x6e\xbd\x65\xc7\xa3\x56\x27\x7b\xc1\xd8\x7a\x1b\xd8\x3a\xeb\xb7\x18\x27\x38\x83\xd7\x0b\x48\xcf\x69\x09\x12\x3e\x94\x77\x5d\x8c\x62\xcb\x65\xe8\xee\x5e\x59\x97\xa1\x79\x7a\x65\x5d\x34\xf5\x0b\xa1\xad\xea\x47\x0b\x0d\x08\x98\x21\x51\x26\x96\xfb\xdb\xef\xdf\xc2\xca\xd0\xad\x5d\xbf\xd1\xa9\x7a\x19\x2a\x8d\x6b\x37\xeb\x3a\xec\xd2\x88\xbd\xc2\xc1\x20\x2f\xe9\x4c\x4e\x4a\xa4\xfd\x7e\xea\xbd\x4f\xe7\x5c\x30\xe8\xb2\x8d\x4d\x60\x87\xd9\x53\x8f\x83\x42\x8a\xa7\x36\xcb\xb3\xf7\x42\xeb\x9d\x9d\xb9\x06\x32\xf2\x8d\x5f\xf4\x21\x4f\x26\xf6\xb2\x6e\xe5\x54\x08\x9c\x06\x9c\x78\x4c\xcd\x3b\x95\xb9\xad\x65\x6e\xcf\xcf\x3c\x85\xbe\x79\x76\x2f\x84\x4b\xa8\xef\x05\x21\x3c\xdd\xef\xa4\x38\x69\x50\x4f\xc3\xa9\xa1\x4b\x0f\x99\x28\xa5\x91\xbd\xe3\x5f\x04\x87\xa3\x4f\xd0\xab\x63\xcc\x1d\x15\xcd\xc9\x22\xe2\x23\x3c\xf5\xaf\xad\x2d\x07\x08\x4d\x2e\xae\x92\x56\x97\x53\xfe\x8a\xf0\x2f\xb1\xc6\x61\xa8\x64\xb9\x80\x3d\x56\xad\xac\x8a\x10\x87\x69\x18\x91\x04\xa8\xb9\x6d\xa2\x70\xc6\x87\xeb\x37\x04\x6d\xe8\x3c\x73\xc4\x86\x9b\x36\xcc\x8f\x6a\x5d\x31\x9a\x99\x2e\x06\x79\x28\x6d\x3a\xfa\xc6\xd0\xae\xbd\x4f\x9a\x96\x04\x1d\xfb\x71\x32\xd1\x76\x13\xbd\xa5\xc6\xc3\xaf\x8b\x95\xf0\x34\xd4\x81\x68\xd5\x98\xd6\x0b\x5f\x98\xda\x1f\xea\x6a\x19\x7d\x1b\x65\x57\xfa\xe6\xd8\x66\x78\x22\x3e\x44\xae\xf0\xf6\x53\xb4\xa1\x90\x4e\xbf\x19\xcf\xf6\x38\x9d\xea\xd6\xde\xd2\xdc\xa4\xb7\xba\xb1\xdc\x37\x87\xf4\x6b\x6b\xad\x19\xcb\xa6\x3c\x67\xc6\x73\x5b\xb2\xdb\xb4\xde\x27\x79\x6b\x6c\xbe\x22\x9a\x7d\xc5\xb5\x9e\xcd\x23\x97\x9e\x1e\x42\x6a\xdf\x5b\xdd\xbc\x68\xe0\x97\x6a\x98\xc2\xb3\xf0\xd8\x7e\x9e\x86\xf6\x30\xb6\xb1\x09\x21\xae\x09\x05\x05\x9f\xfb\x05\x83\xc7\xec\xa4\x49\x2d\x87\x25\xa9\x7a\x2b\xc5\xe2\x75\x16\xb6\x74\xec\xa0\xd0\xa5\x25\xeb\x7d\x83\xef\x26\xd1\x67\x21\xa7\xf3\x84\x33\x8e\xa1\xd1\x87\x83\xd4\x3a\xdb\x68\x8d\xe5\xf0\xff\x1c\x83\xbe\xee\xdb\x39\x2b\xf5\x6c\x77\xc4\x5c\xf5\x7f\x8d\x6b\x63\x31\x27\xf4\xe5\xd9\x4a\xbd\xd9\x51\x42\x06\xf9\x69\xd6\x68\x86\xde\x8a\xd9\xf5\x65\xfa\xda\xe7\x34\x63\xe5\x6d\xf9\x99\xd6\x42\x9f\xa0\xd0\x22\xe8\xf3\x32\xe8\xdb\xb5\x7e\x06\x0f\x1d\x1e\x2d\x91\x28\x9f\xc5\x6f\x9a\xdb\x92\x98\xc0\xae\x29\xfd\x4c\x75\xb1\x97\xa8\xc1\x36\x76\x57\xd3\xea\xcb\x31\x1e\x4f\x0b\x1c\x3c\x2b\xda\xae\x42\x79\xdc\xe4\x18\x22\x1e\xdc\xf8\x7d\x91\x7e\x5d\xb0\x7a\x33\x8e\xd8\x19\xc2\x8f\x32\xbf\xc0\x53\x92\x88\xe8\x89\x0d\x3e\xa5\x32\x79\x4c\xae\xc5\x9b\xc4\x11\x7b\x23\x2e\x7d\xa7\x97\xbe\xfb\x58\xda\xb1\xa1\xce\x66\xbf\x3f\xdc\x5b\xa1\xd9\xbe\xc7\x95\xd5\xbd\x05\x97\xc4\x34\xc2\x0f\xf7\x9a\xc9\x55\x43\x4c\x83\x67\xd0\x6e\x85\x27\x48\xd9\xfe\x8b\x26\xdf\x4e\xf9\x98\x53\x5a\x92\xf7\x0e\x8c\x8f\x9a\xb0\x49\x6a\xb2\xcb\xb0\xe8\xc9\x6e\x9b\x32\x1b\x35\xaf\xaf\x65\xe3\xf5\x57\x95\x09\xb8\xb5\xd5\x61\x60\x32\x5c\xfa\x13\xc3\x49\xd3\x22\x61\x1f\x56\x04\x8c\x47\x54\x7a\x2f\x91\x6f\x54\x8d\x6f\xb7\xb3\x95\x30\xd1\x40\x3f\xfb\x9a\x47\xe5\x79\x80\xc9\xc3\x3c\x27\x7b\xe4\x52\x42\xc5\x35\xf1\xc7\xce\x29\x43\x54\x9f\x33\x4f\xf2\x54\x0b\xba\x83\x72\xaa\x42\x64\x8c\x92\x8f\x5c\x99\x6c\xf0\x48\xb5\xe7\x8e\x14\x73\xbe\xec\xb6\xcc\xe7\x58\x30\xc9\x21\xc3\x28\xd6\xce\xdf\xea\x35\xc2\x63\x75\x53\x7b\xfb\xe2\xd7\x13\x1f\x61\xf5\x3e\xf3\x6e\x03\x27\xeb\xe5\x65\xc3\x66\xb2\xc9\x36\x72\x13\x3b\xf3\x9b\x08\xab\xb4\x89\x56\x3a\xfb\xaa\x0a\x45\xd6\x5e\x8c\x35\x2b\x38\xa1\xf6\x27\x8e\x75\x38\x74\xcc\xf6\x9b\x63\x3d\x95\x1c\xf3\x80\xde\x2f\x77\xcd\x8b\x57\xc7\x2a\xed\x9b\x13\xfa\xd9\xd5\xad\x4d\xb6\x63\x86\xd8\x85\x3b\xaa\xf7\xe9\x74\x9b\x75\x22\x4e\x6f\xe7\xf8\xe0\xce\x67\x37\xf2\x3f\xa6\x05\x91\x63\x18\x8c\xe6\x69\xce\xb8\x42\x90\x27\x33\xb5\xfd\x39\x60\x9a\x6d\x21\x13\x49\x28\xd5\xec\x54\x63\x0e\x3f\xc7\x16\xf5\xac\x21\xe1\xf6\xc6\x5d\x44\x22\xda\xea\x4d\x0c\xe5\xaa\x48\x4b\xcb\x76\x7a\xa6\x37\x93\xd4\x6c\x11\xeb\x9b\xc2\x3e\xcd\xb0\xef\xcc\x95\xd5\x34\x3b\xe6\xf4\x90\x98\x47\x62\x5e\x26\xb2\xe5\x5e\x6d\xf5\x8f\xec\xba\xf9\x7d\x3d\xbb\x5e\x87\x89\x74\xdf\x19\xe0\xe6\xbc\x33\xb4\x7c\xb3\x37\x68\x85\xad\xae\xf5\xde\x71\x60\x38\xd5\xe9\x86\x96\x37\x9d\x72\xe4\xcc\xe3\x09\x5b\x7f\x4c\x08\x7f\x3e\xb4\xd9\xbf\x23\x3d\x1b\x05\x7a\xe6\x0b\x7e\xe2\xe9\xb9\x28\x1b\x40\xb8\x8f\xec\x57\x15\x87\xfd\x23\xcc\xcb\x57\x7f\xc9\x27\x48\x4f\xf0\x44\x8b\x45\xb9\x78\xa2\x37\xd5\xec\x5f\xb3\x69\xd4\xea\x22\xbe\x58\xfc\x08\xe4\xf0\x68\xcb\xb0\x28\x72\xee\xa4\xcc\x30\x27\x1a\x98\xa5\x66\xaf\xa4\xf2\x3f\x72\x2b\xcd\xec\xd9\xbe\x0a\xc0\x5b\x55\x1f\xbb\xe1\x87\x8f\x67\x3d\xf6\x9f\x9b\x8d\xc6\x60\xae\x5d\x9e\x56\x6c\x0a\xfd\x81\x9d\xaa\xb9\x5d\x35\x0a\x5f\x76\x78\xc6\x5f\x77\xe7\xf1\xd2\xf0\x6f\x10\xb9\x97\x48\x1a\xb7\xc4\xde\x60\x35\xc0\x26\x62\xf7\x2c\xa7\x9a\xd9\x61\xab\x9b\x92\x6d\xc3\xa0\xa4\x93\x29\x88\x51\x49\xa8\xd1\x5f\x66\xe1\x8c\x56\x3e\x23\x3b\x6b\x48\x9f\x3d\xcd\xac\xd7\x1b\xea\x80\xc0\x1b\x2f\x07\x20\x50\x96\x3f\x54\x42\x2b\x45\x90\x1e\x41\x26\xfe\xee\x19\xc6\x8a\x6f\xfa\x73\xbe\xc8\x41\xc7\xf7\x42\xe4\xf5\x4b\xb5\x44\xe6\x71\x8c\x65\xb8\xe1\x8a\x52\x53\x7e\xc6\x5b\x16\x8d\x62\x3b\x87\x28\xe8\x71\xcc\x9c\x7e\xdc\x99\x77\xa9\x5d\x31\xd4\xbb\x9f\x6f\xd1\xd5\xec\xea\x54\x7e\xff\x07\x33\xf1\xb7\xf3\x00\x79\x44\x72\x64\x97\xd7\x56\x52\xab\xcb\xe2\x51\xcb\x17\x75\x5c\x8c\x8f\xec\xfa\xd9\xfe\xca\x1a\x75\xd4\x33\x96\x1d\x78\x24\x03\x2d\x12\xf7\x70\xef\xff\xbd\x1d\x9f\x33\xd7\x73\xff\xff\x6e\xff\xb7\x76\xfb\x9e\xdc\xed\x7b\xff\x83\xbb\xfd\xe3\x2a\x93\x7a\x1b\xc2\x1c\x33\xbf\x92\xdc\xbe\x34\x1e\xcb\x1f\x36\xb4\xb1\x22\x32\x13\x05\xe2\x74\x53\xd9\xd5\x75\x5e\x7e\x69\xc2\x22\x7a\x31\x86\xf5\x59\x06\x40\x01\x62\xf8\x00\x7b\x59\xd8\x73\xfe\x65\x49\xe2\xfd\x08\x3f\x78\x84\x55\xa4\xf1\xe7\x9c\x8a\x64\x60\x86\xbf\xcc\xa3\xb0\x49\xac\x35\xff\x11\x9b\x00\xdf\x45\x18\x4e\x60\x96\x20\xa3\xe5\x41\xf3\x67\xf3\xcc\xc3\x31\xe5\xaa\x36\x69\x31\x6e\xa2\xa5\x88\x56\x35\xb3\xc1\xa4\x9f\xd2\x17\x80\x61\x64\x78\x4f\x7f\x37\x96\x57\x35\x3f\x6b\x55\x15\x2e\xea\xe0\x89\x78\xde\x69\x45\xd8\xf1\x0c\x1c\x2f\x19\x47\xe7\xfe\xd3\x45\xf1\xd1\x4f\x83\x53\x7b\xf3\xea\x6c\x89\xc0\x69\x12\xfa\xef\xdf\x29\xf9\x04\x79\xf4\xfb\x23\xed\x56\xdf\x31\xe1\x8f\x2c\xe3\x3b\xc2\x38\xf1\x6b\x9c\x01\x2e\x89\x60\x2e\xe9\xd5\x7f\x26\x13\x8d\xe4\x2b\xfb\x25\xf8\x50\xd6\x99\x88\xb2\xbf\x92\x89\x46\xf2\x95\xcb\x6a\x43\x2b\xfa\x1e\x06\xa3\x2d\xa0\xa7\xe1\x9c\xcd\xc1\xad\x56\x40\x1c\xe1\xc5\x0c\x3d\xd0\x93\x9c\x49\x22\xba\xca\xbc\x93\x60\x5f\x6c\xc3\xfd\x7f\x07\xd3\x47\xcb\x8a\x6f\x34\x5e\xf5\xd5\x15\xef\x20\xde\xa2\xf4\x65\x39\x2b\xd7\xa6\x9c\x79\x83\x91\x38\x66\x6b\x1f\xf4\x66\x40\xf4\xe5\xa2\xd3\x71\x83\xc1\x70\xd1\x0c\x61\xd3\xfc\xec\x98\x0f\xf4\xbb\xd8\x71\x1e\x29\x75\xb4\x68\xbe\xd0\xdb\x4e\x65\x6a\x1e\xb0\x00\xfc\xa0\x9a\x7d\x0c\x06\x9e\x33\xea\x0d\xec\xfd\x2a\xbd\xd6\xa8\x44\xdd\xde\xc5\x63\x56\x00\xb2\x77\xf8\x45\x02\xb0\xf7\xaa\x5c\xdd\x01\x0b\x60\x4e\x4f\x76\xad\x73\xf3\xf2\xf4\xec\xcf\xa3\xdd\xbd\x4b\xcb\x3d\xe4\xe7\x8b\xfd\x72\xe5\xd2\xba\x26\x7a\x77\xeb\xf4\xf2\xf2\xf4\x58\x7c\xac\xee\xa8\x57\xf1\x7d\xd1\xed\x8d\x46\xbd\xc7\x3f\x59\x6f\x7f\x71\x6a\x1e\xea\x10\xa9\x91\x95\x7d\x73\x04\x72\x79\x87\xc8\x65\x6b\x12\xea\xc1\x4d\x12\x1a\xbf\x7b\xa0\x77\xab\x13\xc7\x7c\xef\x3a\x8f\x01\xf7\x4d\x1f\xde\xae\x88\x5b\x48\x2c\xa3\xf8\xee\x44\x0a\x6d\x4e\x6d\xdb\xaf\xc7\x4c\xb8\xb7\xb4\xf4\xd5\x6d\xa7\x68\x1c\xcd\x2a\x13\x18\xb1\x5b\x74\x58\x12\xf4\x07\xbd\x07\xa9\x62\xf4\xda\x1b\x2f\x0c\xfb\x81\xd7\x6a\xb4\x02\x56\x0a\x42\xa0\x4e\x84\x23\xf2\xb3\x8b\x9a\x2f\x4d\x15\x17\x04\xfd\x12\x57\x11\xd6\xdb\xa1\xc9\x36\x9c\x63\xc0\x01\x27\xe0\xf7\x1e\x1d\x5a\x81\x8f\xdb\xa6\xdf\x1a\xe2\x42\xf2\xb8\xe7\x07\xd6\x30\x34\x87\xcd\xde\x4b\x59\xdc\x56\xdc\x38\x83\x2e\x1d\xad\x43\x0b\x6a\xe3\xb4\x8d\xc3\x01\x56\xf3\x36\x94\x09\xac\xc8\x59\xb3\xe4\xa1\xef\x4b\xa6\x16\x18\x0b\xe6\xf2\x3e\x61\x8f\x4e\x30\x1c\x2a\xf1\x1a\x4a\x2d\xee\xad\xe3\xbf\x45\x53\xda\x90\xcb\xd4\xd5\x8d\xcd\x7c\xfe\xfb\x22\x6d\x80\x41\x3b\x18\xc8\x08\x57\x56\xde\x1c\x06\x1d\xd1\x73\x6e\xdc\x56\xd3\x6c\xf4\xba\xa3\x13\x0c\x66\xb8\x6d\x8a\x2b\x15\x6a\xdf\x36\x25\x82\x6b\xc6\xbc\xf5\x7a\x9d\x51\xab\x6f\xbd\xb7\x86\x95\xd1\x63\x07\x0d\xc7\xa7\x2a\xb3\xd1\xef\x7a\x69\x3c\x57\x5b\x6f\x81\x95\x5f\x33\x59\x3d\xc2\x3a\xd8\xa1\xfd\x4b\x6b\x22\x0c\x06\xd6\xa1\x18\x87\x1d\x1a\x9a\xf1\x28\xf0\x2f\x01\x9e\x60\x21\x8d\xa3\xd8\xe2\xf2\xcd\x8c\x1c\xd1\x5b\xef\xca\x69\xbd\xb0\x5f\x53\x7e\xe9\xc5\x9b\x16\xfe\x60\x6a\x0e\xa9\xca\xbf\x2f\x42\xdf\xb8\x6d\x6b\x48\x17\xad\x5c\x9d\x9a\x22\x08\xab\x05\x4b\xed\x16\x4f\x23\x2d\x6c\xa2\x38\x68\x5f\x3b\x62\x56\x43\xf3\x8b\xd6\x5b\xd5\x2b\xd3\x19\x0f\x1c\x31\xd0\x57\x4d\xc2\x51\x62\x90\xad\x77\x21\x5b\x78\x97\xf3\x27\xb3\xb7\xb6\xa4\x18\x30\x3f\xa5\xac\xf1\xd2\xa3\xd5\x6d\xb6\x83\xa0\x5f\xc2\xf2\x1b\x5d\xa0\x42\x1a\x03\x82\x15\x76\x5b\x8d\x57\x9a\x84\x32\xc2\x6d\x5b\xef\xc2\x08\x15\x9f\xde\x7a\xbd\xc7\x3d\xc7\xa3\xfd\x6d\xad\xeb\x68\xec\x30\x46\x63\xbb\x9e\x32\x6c\xb9\xde\xd1\xec\x4f\xb6\x3d\x27\x32\xd8\x38\x38\xd4\x3e\x8c\xfb\x2c\xc0\xb9\x1b\x8b\xd7\xee\xd0\xb1\x57\xfe\xaf\x48\x71\x29\x52\x60\x9a\x4d\xf8\x57\x46\x3e\x41\x7f\x29\xf5\xfb\xb3\x17\xc3\xf8\xfd\x2f\x1f\xff\x19\xdf\x56\xe4\xd5\xef\x00\x15\x88\xc4\x6f\x2b\x84\x6d\x0f\xab\xe6\x78\x84\xe8\xe6\x87\x55\x11\xdd\xfc\x71\x4e\xd4\x63\xea\x8b\x23\x7d\xf3\xf1\xfb\xfd\xc8\x51\xd1\xe1\x46\x6c\xff\xa0\x05\x77\x29\xcf\xf8\x64\x73\xb8\xf3\x81\xf2\x20\x98\x3d\x4e\x19\xc6\xcd\x48\xd7\x8f\x6c\xa4\x6a\x75\x93\xfe\x87\xbe\xbb\xd4\xbd\x92\x6e\x1e\xbc\xec\xc1\xbd\xf4\xf4\x50\x1a\x5a\x4e\xd6\xbb\xe3\xe8\x7d\x8d\x84\xdf\xeb\xe3\xa1\x75\xaa\x55\x9a\xfc\xe8\xa2\x98\x2b\x8a\xb1\x9f\x3e\x98\xae\x78\x77\x1f\x2c\x35\xe6\xf9\x13\x45\x53\x93\x8e\x53\xf6\x61\x71\x4a\xf4\xea\x36\xe4\xb6\xd1\xab\xb7\x6d\x14\xd8\xed\xa8\xb8\xc2\x6c\x28\xa7\x5e\xa1\xf4\xa6\x09\xaa\x7b\xab\x95\x6a\x18\x4c\x79\xd3\x13\x6c\xec\x92\x43\xe0\x61\x08\x7c\x31\x02\xda\x60\xea\xfd\x0a\xe2\x46\x6a\xce\x82\x79\x3c\xd9\x43\x1a\x5b\xa7\xb8\x68\x53\x68\x7a\xd9\xdb\x0a\xb1\x8f\x7e\x76\xd2\xb5\xed\xdd\xca\xef\xdf\xe2\xe9\x70\xe8\xa8\xc7\xa7\x92\x53\x74\xb2\x77\xb7\xd0\xdd\x25\xd0\x34\x48\xf7\xea\x19\xd1\xb1\x6f\x3f\x0c\x90\x63\xbf\xc2\x1a\x64\xfb\xd9\xbc\xd9\x36\x60\xda\x21\x40\x17\xe6\x0c\x9c\x3b\xe3\x70\x66\x0b\x37\x90\x01\xec\x39\xe4\xa2\xa1\x45\x58\x6b\x12\x2b\xd5\x80\x0e\x49\xc3\xbe\xdd\x4e\x37\x30\x82\x88\xc0\x5b\x6b\x8b\x00\xee\xb3\xc3\xe3\x47\x0b\x84\xe3\x18\xde\x7f\x6c\xa0\x62\xa8\xa8\x85\x08\x58\x2d\x1a\x58\xda\x67\xe5\xbd\xf6\x43\x6a\xaf\x8c\xa8\x18\x45\xdf\x3a\x1a\x3a\x82\x1b\x53\xdf\x7d\xdb\xa6\x2e\x89\x58\x2b\xb9\x82\x23\x9a\x9f\x4e\x3b\xd1\x4d\x06\xee\x74\x57\x69\x5e\x25\xa7\x03\x29\x10\x37\x79\x8a\x8b\xee\x40\x46\x21\x6d\x25\xc8\x3e\xa9\x78\xbc\xff\xa7\x60\xa3\x66\x7c\xa9\xc1\xff\xbe\xab\x7c\xef\x47\x57\xdf\x4e\xad\x51\x57\x3e\xec\x39\x92\xb6\x70\x46\x16\xae\x5a\x5d\xf3\xda\x73\xac\x86\x79\xe5\x39\xca\xa5\x20\x32\xdb\xdd\xa9\xf3\x80\x58\x51\x88\x4e\x28\x86\xc7\x4a\xa9\xe7\xbc\x61\x9e\x29\xcb\xc9\x80\x96\x8f\xc7\xd6\x9a\x06\x07\x2e\xdf\xff\x73\x46\xbc\x35\x1b\x4a\x5a\x79\x5f\x8d\x62\x48\x07\xb8\x46\xde\x6a\xb1\xe7\x55\xc3\x10\xd7\xc9\xd4\x11\x77\x69\x09\x37\xcd\xec\xf0\x37\xb0\x1b\xc5\x86\xa5\xb0\x18\xcf\x2f\x35\x2d\x10\x13\x6a\x09\xa7\x52\xe8\x50\x1c\xce\x54\x8f\x89\x71\x14\x59\x76\x11\xb6\xc0\xf2\xda\x25\x12\xe2\x0c\x31\x01\x77\x71\x37\x8f\x5d\xeb\xce\xee\x5a\x3d\xc0\x33\x5c\x1f\xd3\xd4\x63\x9e\x84\xaf\xd0\x14\x1c\x70\x70\xdd\x26\x9e\x58\xef\xb3\xbc\xb5\x62\xee\x43\x33\x32\x4a\xb9\xb8\x5a\x31\x7b\x89\x94\xcb\xb3\x15\xf3\xae\xa1\x39\xc6\x94\xe1\x12\x78\x9f\x69\xce\xd1\x78\x30\x68\xb3\x35\x08\x01\xdc\x61\xb3\x9d\xab\xd1\xf6\xb0\xaa\xc3\xb4\x3d\x0c\xd2\x9e\x11\x4f\x62\xc8\xd3\xd7\xe0\xa9\x94\x61\x3d\xb5\x09\xc2\x0e\xaf\xd5\xf5\xbd\x7f\x5e\x4e\xba\x87\x77\x6d\xfb\xed\xf0\xf7\xef\x6d\x76\x09\xc0\x7a\x34\x74\x90\xd8\x76\x05\x51\xf4\xc5\xe3\x44\xb7\x52\xb8\xd0\xf5\x8a\x7c\xb8\x2d\xf1\xa1\x3d\x41\xdc\x84\x29\x82\xaf\xc7\x1e\xb0\x09\xbd\x0b\xc6\x1e\x4f\xb5\x73\x0e\xa8\xa0\xae\x47\x88\xb3\x91\x89\x49\xcb\x34\xe4\x1d\x15\x5c\xe5\x13\xd8\x74\xb2\x0f\x4d\xf0\x8a\x34\x0f\x89\xa4\x3c\x5f\x81\x09\xdf\xb7\x3e\xcc\x89\x5a\x9c\x2b\x48\x26\xb1\x21\x99\xf9\xde\xe9\x25\x45\x14\x66\xb3\x25\x12\x7c\x4e\x08\x74\xd7\x5f\x67\x7f\x8f\x1a\xd9\x81\xa4\x9a\xb1\xb6\xfd\xee\xf8\x3e\x11\x8c\x43\x0b\x9e\x08\xb3\xe1\xea\xb4\x70\x2e\xad\xae\x21\x11\xcf\x0a\xaa\x92\x2f\x24\x68\x38\x69\x34\x2e\x77\xb0\x0e\xf9\x71\x12\x12\xd1\xdb\x16\x82\x99\xa1\x2d\x86\x16\xe1\x3e\x68\x6a\xdb\xc6\xd4\xb5\xc3\x07\x76\x22\xc4\xb6\x58\x17\x7f\x9a\x22\xe8\x5e\x60\x0a\x97\x01\xe3\x7e\x6d\x08\x83\x00\x4a\xca\xf3\x42\xbe\xf8\x73\x4e\x1c\x44\xbd\x0b\x88\xec\x21\x3b\xd1\xd0\x7b\xc0\xae\xd4\x3b\x76\x9b\x1a\x6f\x76\xe9\x87\x96\x12\x82\x5c\x64\x69\x61\x71\xdc\x6f\x76\xdf\x8e\xbf\x18\xe3\xf7\xb6\x2d\x1f\xe3\xa9\xee\x0a\x48\x43\xbb\x6b\x8e\xa9\x9c\x1c\x90\x3f\xbd\xde\x63\xbf\xd7\x65\x66\x4a\xe8\x7d\x15\xf2\xb6\x3d\xe6\x6d\x44\xc8\xf3\xbc\x95\xc2\x25\x55\x16\x1a\x54\x43\xf3\x78\xe8\x18\xc5\x67\x9b\x53\x88\x76\x1c\x8c\xfe\x64\x4e\x60\x55\x15\x18\xd3\x64\x6a\x1f\x80\x5b\x69\x78\x9f\x81\x31\x67\xca\x20\x54\xce\xb0\x6e\x3f\xd3\x4f\x17\xee\x7e\x8f\xa4\x0d\xe4\x5b\xcf\x49\x77\xa0\x79\x68\xe2\x83\xdd\x31\xa4\xa2\x71\x9f\x1d\x49\xf6\xd1\x73\xfa\xc7\xeb\xa2\x5b\xfb\x36\xa9\xb3\x3a\x3e\xbd\xa5\xc4\xf9\xaa\xa5\x75\x43\x78\x0d\xf2\x6b\x1d\x42\x95\xf2\x9a\x56\x8e\x03\xf0\x03\x80\x0b\xa5\xa0\x18\xbe\x5f\xeb\xab\xc4\x0f\xcd\x99\xfa\xc2\xd5\x33\x9d\x55\x08\x23\x0f\x9f\xd5\xb4\x72\x6e\xa0\x3c\xd4\x6a\x89\x27\x5f\x3c\xa9\xa2\xbb\x30\x62\x71\xd9\x31\xc5\x17\x87\x31\xef\x7d\x6b\x1e\x3b\x4b\xcb\x46\xba\xe1\xa0\x2c\x89\x28\xe5\x92\x46\x94\x76\xc7\x87\xd5\x44\xcc\x72\x0d\x59\x54\x35\x67\x01\xb1\x37\x0e\x1d\x8d\x73\x64\x12\xa0\x6f\x79\x57\x26\x1f\xf9\x72\x49\x25\x0f\xa2\x64\x0e\xa0\x8a\x47\x11\xfc\xc3\xd3\xb4\xa0\x2e\xff\xb6\x2a\x89\x94\x45\xf0\x11\x42\x80\x1c\xac\x17\x6e\xed\x71\x37\x94\x13\x80\xf9\x19\xc8\x21\x40\x00\x92\x28\x65\x55\xfb\xba\xf6\xe1\xeb\x77\xed\xeb\x3a\xbe\x4a\x9f\x54\x1c\xaa\x24\x98\x69\xb0\xe6\x3b\xee\x1f\x0c\x4e\xd5\x17\xd5\x70\x24\x18\x1e\x03\xf1\xf3\x1a\x05\x7e\xe1\xcf\x88\xfb\xa4\x8f\xfb\x71\x35\xe1\xd6\x0f\x2a\xa4\x57\x41\x82\x1c\x8e\x8c\x89\x84\x6a\xaa\x0a\x85\x7e\x4e\x64\x8f\x90\xf8\x84\xf4\x2c\x68\x88\x50\x4a\x2f\x27\x51\xd4\xbf\xe6\x59\x64\x32\xdf\x70\x6d\x4f\x3c\x8d\xfc\xc8\x9c\xe3\x55\x7a\xbc\x18\x49\x99\xe8\xbd\x20\x3b\xca\x2f\xe2\xf7\x42\xfe\x9e\xcb\xdf\x23\xf9\xdb\x1a\x8b\xdf\xdb\x92\xb0\x3b\xb8\x4b\x9d\x08\x2e\xe0\x84\x65\x2e\x8f\x33\xd4\xc1\xd1\x28\x25\x6b\x93\xe6\xe2\xf1\x29\x73\x5d\x9e\x89\x52\x1c\xd2\x6e\xbe\x73\x95\xa3\x30\x78\x6a\x79\x7a\x4c\x69\xea\x10\x8e\x6c\xbe\x74\x4a\xc2\xc1\x85\x0a\x37\xc2\xa3\x08\xac\xb5\xe7\xe9\x50\xb0\xbe\xbe\xf4\xe3\x27\xa2\x11\xc1\x5d\x78\xc8\x1a\x22\x5c\xde\x41\xcf\xe4\xb3\x1e\x66\x0a\x6e\x42\xc5\x71\xc6\x81\x9b\x6e\xcb\xc2\x49\xa9\x6b\x8a\xe4\x8e\x20\x93\xee\xe4\xf2\x50\x89\x80\x47\x23\x24\xe1\x9d\x62\x02\x91\x40\xe7\x7c\xe5\x8d\xad\xcd\xb3\x9d\x36\x91\xdc\x35\xc6\xe9\xf1\x13\x1a\xa1\xbd\xb4\xc6\xf4\x42\xec\xce\x43\xd3\x29\xa0\xdd\xe3\x3d\x4e\x7e\xdb\x4e\x19\xc5\xf9\x6a\x19\x1c\x9e\xaa\x84\x98\x55\x16\x87\xd1\xa5\xd9\x93\xe3\x73\x2f\x47\x99\x12\xcb\x51\xe2\xb7\x38\xf1\x3c\x4a\x74\x2a\x32\xd1\x53\xf1\x9a\xc4\x13\x38\x31\xf5\x04\xc8\xda\x4b\x59\x7f\x39\x7f\x01\x3c\x5a\x17\x6e\xc1\x65\x50\xbe\xae\x55\x78\x16\x2d\x66\x0e\x34\xc1\x66\xd6\x61\xf6\x84\x48\x4e\x51\x50\x55\x0e\x2b\x46\xfa\xfc\x46\xeb\x87\x60\x65\xfb\x25\x1a\xb3\x7e\x49\xd8\xcc\x44\x25\x68\xb4\xa4\x77\x71\x6d\x92\x3c\x23\x39\x1b\xb0\xc8\xf0\x2a\x51\x47\x65\x51\xb4\x5f\x1b\x13\xf7\xfe\xab\x9d\xa2\x91\xde\x2b\xe2\x4f\xf6\xa0\xcb\xf4\x95\xb0\xce\x96\x25\xa8\x93\xa6\x1a\x30\xd5\x43\xcd\xbf\x60\xf9\x43\xcc\x18\x39\xfb\x1e\xa2\xf8\x78\xd9\xd3\x79\xf7\x07\xdf\xf8\x86\xa1\x84\xb9\xf6\x39\x5c\x51\x42\xc1\x53\x2a\x8e\x04\x86\x2f\xc6\x11\xe0\x05\x13\x94\xe5\x35\x82\x01\xc0\xe8\xc6\xae\x5b\x2a\x1f\xb6\xd2\x7d\xaa\xd3\x49\x61\x29\x65\x85\xe7\xb0\x84\xc4\x19\x9f\x92\x69\x5e\xf6\xae\xc1\x96\x86\xe2\x74\x00\xe3\xf1\xc9\xea\x15\xc2\xb4\x46\xc5\x89\xb4\x47\xc6\x8e\xe5\x35\x94\xe0\xeb\x60\xc7\xbc\x0d\xad\xc5\x5c\x76\x75\x11\x6e\x8f\x93\xd9\x9c\x8f\xd9\xf2\x8b\xba\x1e\xb1\xe8\x70\xe4\x36\x01\x2b\x9e\xcd\xd9\xbd\x6c\x58\xaa\xf9\x88\x60\x95\xed\x07\xe6\xb9\x58\x4b\x3e\xda\x44\xff\xd7\xa8\x31\xa8\x89\x06\xa9\xe5\xd5\x69\xcf\xd3\xf9\x8a\x00\x87\x28\x1a\x67\xcd\x71\x56\x8f\xd2\x29\xc7\x2c\x04\x8f\xe8\xb3\x81\x1f\x0c\x70\xd5\xa1\x2d\xda\x6f\x33\x76\xd3\xb4\x44\x78\x81\xc6\x73\x5d\x7e\x61\x45\xb5\x10\x5e\xae\x6b\xdf\x9e\xea\xd9\xbb\x37\xf8\x47\x85\xf6\x47\x43\x44\x13\x6c\xdb\x0d\xd6\xfe\x68\x88\xc8\x81\x1d\x5b\xa6\x77\x6d\x99\x02\x8f\xcd\xfb\x9b\x74\x68\x0c\xc5\xc3\xeb\xac\x62\xce\x63\xd7\xe1\xf8\x6d\xab\xeb\x34\xa2\xcf\xea\x6c\x7c\xe6\xb3\x11\x71\x99\x0b\xcf\x38\xe9\xe8\x29\x9d\x6a\xff\x1a\x16\xbb\x56\xa6\x6b\xa8\xc4\x74\x2a\xfc\xd5\x2f\x76\xac\x0c\x51\x25\xc8\x29\x4f\xbd\xbe\x1d\xe0\xdc\x7b\x36\xc7\xb8\x50\xb9\xc0\x68\xf4\x4d\xb7\xc2\xd6\x3a\x7d\x7b\x26\x00\xdd\x54\xe4\xef\xb7\x53\x61\x14\x0d\x3a\x2e\xe5\xcc\x96\x92\x33\xfc\x32\x70\x38\x5c\x5d\x76\xfd\x1f\x96\x0f\x24\x12\xa6\x07\x42\x78\x7d\x85\xcf\x79\x2c\xd7\xb2\xeb\xa6\x18\x46\x7e\x02\xc6\xdb\x34\x31\x7e\x99\x4d\x83\x8b\x07\x02\x67\x35\x50\x7e\xa6\x21\x67\x7a\x43\x7c\xad\x21\x19\xc0\xea\xf2\xdf\x06\x47\xbd\xe4\x16\xf9\xaa\x45\xbe\x98\x51\x79\xc2\xf4\xb1\x5c\x30\xbb\xf8\x74\x1b\x27\xf1\xfb\xa9\xe8\x8a\xc7\xfb\x24\x27\xb1\x3c\x90\x0b\xcd\xe8\x41\x57\x50\x8f\xfc\xca\x47\x66\xb4\xbc\x14\xd2\x7b\x47\x84\xaa\xe6\x99\xe0\x3d\x39\x48\x59\xf3\xcc\xfc\x20\x48\x0b\xd5\x16\x85\x79\x9e\x38\xde\x51\x09\x3d\xe4\x7e\xba\xd9\xf6\x00\xd7\xaa\x7c\x73\xd9\x1e\xcc\x77\x1c\x7c\xf6\x5a\x2f\x72\xa0\x4e\x49\x29\x64\xfb\x1e\xa1\x06\xeb\x3c\x4a\x0a\x4d\x79\xe4\x1b\x40\x1a\xa8\xc8\xaa\x69\xe6\xd2\x4d\xd5\xdc\x2a\xb1\x2c\xb4\x21\xe7\x78\xcb\xc5\x5e\xe8\x07\x85\xaa\x24\x62\x5d\xf3\x75\xcf\x0c\xb0\x2b\x0d\x2d\xed\x6d\xe4\x70\xd8\x33\x3d\xed\x64\x87\x92\xc4\x1e\xe4\x8a\x35\x3f\xcd\x9a\x16\xa9\x6b\x1f\xb3\x09\x24\x1c\x7c\xc0\x67\xc7\xc8\x87\xaa\x7f\xc4\xa2\xb8\x46\xac\x28\xe4\xaa\x43\x01\xf8\xb8\xff\xc0\x2e\xf1\x93\x27\x92\x3b\x8b\x34\x67\xe4\x30\x82\xfd\x6d\x55\x22\x17\x52\xf0\xa3\xcc\xfa\xaa\x30\x25\xed\x9e\xab\x82\x0f\x80\x53\xab\x80\xe0\xa8\xd4\xd9\xa5\x69\xf6\x86\x70\xa6\x1d\xb6\xa9\xd2\x6f\x98\x23\x4a\x27\x66\x7b\x48\x47\xcc\x45\xd7\x06\xfb\xcd\x09\xfb\x43\xbe\xfb\x46\x52\x0e\x74\xe8\xc4\xb5\x5f\x8f\x52\xca\xc4\xed\xd5\xab\x35\x68\x49\x0b\x6f\x03\x9e\x79\x33\x26\x46\x16\x57\x08\x16\xc2\x5e\x4c\x0d\x0e\xbd\x1b\x16\xfc\x6c\xd3\x23\x76\xf9\xac\xc2\xf6\xb5\xe2\xa5\x32\xd4\x5e\xf6\xf5\x97\x70\x98\xa0\xc6\x1f\xd4\x00\x48\x89\xa9\x2b\xc5\xa5\xaf\x7b\xd6\x8c\xab\xdc\x70\xa8\xbc\xdb\xbe\xed\x09\xd9\xe8\x59\xe4\x05\x77\x4b\xa6\x54\x86\x16\xff\xee\x47\x79\x4b\x7b\x53\x4e\xf1\x2b\x9f\xc3\x0b\x2a\xb3\xf0\x8e\x5f\x9c\xcf\x00\x36\x2a\xd3\x4f\x62\x69\x5d\x68\x8b\xe4\x52\x3c\xd7\x4a\x0d\x08\xae\x68\x67\x17\x9d\x86\x75\x1b\x98\xa7\xe6\x2d\x9d\xa1\x1a\x33\xa2\x53\x24\x4c\x7e\xbf\x04\x82\x50\x70\x7b\x6c\xc0\xa1\xb9\xfe\xfb\x70\xbe\x66\xaf\xc6\x29\x41\xad\x7c\xf5\x38\x14\x40\x27\x4c\x68\x85\x8a\x8c\x1e\x9b\xad\x12\x58\x76\xb6\xc1\xae\x62\x3c\xe2\x53\x6c\xdb\x69\xc0\x82\xe9\x6b\x9e\x8f\x8d\x35\x2d\x41\x45\x9b\xf4\x98\x0d\x17\xd2\xeb\x86\xa5\xdc\x37\x63\x2d\xd0\x8e\xe2\xc5\xd0\x3d\xb7\x02\xb1\x22\xde\x87\x07\x56\xc3\x9c\x0c\x2c\x8f\xb8\x9c\x22\xfe\xc8\xa8\x1c\x15\x4a\x59\xd7\x80\x43\x6f\x03\x10\xcb\x49\x88\x7e\x65\x3e\x44\x22\x86\x00\xcc\x3c\x6d\x59\xc7\xf0\xcb\x40\x6c\x93\x79\xf5\x46\x69\x1b\x49\x98\x33\x0e\x90\x45\xe4\x8f\x68\xec\x6e\x92\xc2\x16\x97\x47\x8f\xf8\x49\x5f\xe8\x23\xb2\x82\x22\xc8\x75\x1f\x7c\xa3\x97\x3d\xda\x05\x61\x26\xe7\x33\x9c\xc0\x59\xa0\x36\xcf\xb7\x9f\x49\x6e\x14\xd5\x25\x45\x1f\x7e\xf6\x34\x19\x09\xcf\x76\x70\xf2\xd2\xa1\x8b\x2f\x21\x34\x69\x03\x3e\x6f\x89\xac\xe8\x4a\xb2\xa2\x40\x44\x81\x38\x9e\x68\x5e\xfa\x66\x6d\xc8\xd4\x04\x61\x30\x5a\x14\x0f\xa9\x6e\x4c\x50\xc8\x4c\x39\xce\x04\x7a\x02\x18\x8d\x69\x8a\x44\x71\x45\x52\x10\x6e\x63\x2f\x7a\x4c\xba\xb9\xb8\x47\x88\xfb\x73\x3e\xe3\x64\x40\xb5\xd6\x2f\x82\x50\xb1\x88\x2a\xdb\xa6\x76\x7b\xd4\xc2\x42\x2a\x94\x66\x75\x61\x11\x48\x30\x34\x89\xdb\xd0\x88\xd5\x11\x47\x3c\x92\xbf\x08\x89\x92\x0c\x75\x2a\xd9\x18\x21\x22\x2e\x74\x6d\x44\x9e\x95\x0e\x0a\x24\x3d\xd1\xae\x80\x86\xe8\x66\x4f\x0e\xcc\xeb\x4a\x4c\x91\x0a\x55\xe6\x6e\xf6\xf8\x40\x79\x1d\x50\x19\x29\x65\x58\x37\x8f\x5f\x09\x63\xc1\x81\x01\x47\x0d\xe8\x66\x1f\x7d\x15\x7d\xbc\x4f\x25\xfb\x4a\x61\xb3\x0f\x59\xf5\x90\xa7\x89\xe8\x8e\x2e\x9d\xdd\xfd\x3a\xe8\x69\xde\x84\x43\xde\xac\xb4\xb0\x3d\x42\xab\x72\xb7\x06\xf2\x17\x7d\x57\x5b\x18\x31\x95\x20\x57\x1b\xa9\x60\x4e\xc3\x84\xf3\x8d\x76\x45\xf3\xf3\x4e\xc7\xa0\x64\x23\xf9\x24\xc0\x46\x4d\xe5\x7f\xd9\xbe\xa1\x0e\x2a\xda\xb3\xd7\x95\x62\x8e\xa3\xe4\xf8\xf2\xcd\xb7\x32\x79\x48\x83\xf9\x25\x6f\xc9\xc8\x0d\x52\xb0\x56\x68\x7c\xb5\xfd\x42\x23\x6d\x6b\x61\x31\x1b\x75\x61\xa0\xc0\x4f\xf9\x3a\x11\x1f\x36\x35\x5c\xc4\x4d\x26\xfe\xce\x72\x38\xa8\x30\x3d\x4d\xa5\x0f\xec\x44\xf8\x97\xaa\xbe\x96\xa3\x75\x4c\x0d\x08\xe1\x90\x1c\x41\x7a\x3e\x89\x07\xe6\xd6\x2e\x5e\xeb\x19\x07\x7f\xa7\xb3\xd1\xbd\xbc\x99\x85\xef\x09\xc1\x5f\x43\x50\x57\x3c\xde\x1d\xb3\x56\x26\xbc\x58\xd1\xb1\x63\x9b\x08\x15\xfa\x73\xda\xa2\x3f\x57\x6f\x6a\xbc\x0b\x0d\xb1\x68\x3b\x40\x8c\x0d\x37\xeb\xaf\xdb\xb6\x7d\x35\x2c\x36\x20\xf4\x68\xd7\x6e\xe8\x4c\x6d\x13\xe5\xda\x26\xa2\x75\x35\x67\xb6\x76\xf1\xff\xbb\xe3\x12\x1e\x89\x2e\x94\xdb\x68\xa5\xbc\x53\x6e\x0b\x11\x4b\xd6\x73\x69\xa7\xf6\xe4\xbd\xb6\x4a\x3c\x0b\xcc\x8e\x67\x9d\x9a\x6e\xaf\xe3\x03\x35\x56\x03\xfc\xbd\xf4\x80\x64\xa8\x01\x56\x23\xdb\x0b\x52\xaa\x36\x01\x55\x16\x45\xf3\xda\x4c\x1a\x50\x9f\xd0\x11\x29\x2c\xa8\xb5\xeb\x76\x87\x49\x19\x3d\x72\xc7\x07\x5c\xce\x67\x29\xf1\x9a\x83\x12\x71\x4d\xfe\xac\x77\x3f\x8e\x8d\x42\xdf\x70\x07\xf2\xee\xa8\x5a\x1c\x54\x61\x13\x1f\x25\xc5\x2a\x35\xa7\xae\x47\xa1\xcb\xeb\x12\x22\xc1\x5b\xe1\xf6\x63\xca\x8c\xd5\xbd\x80\x37\xa7\x1e\x7f\x5e\x25\x71\x0d\xd2\x42\xfc\x11\xdc\x1b\x7c\x00\x75\x83\x93\x9e\x1f\xa4\x40\x3e\x78\x4c\xe3\x98\xc4\x09\x81\xde\x10\xae\xb4\x93\x74\xd4\xbd\x6e\x81\x98\xdd\x6d\xc5\x4c\xcd\x6e\x4b\x50\x13\xcc\xc9\x5c\xbc\x14\x20\x10\xf4\xb2\x0f\xf7\xbc\x2e\x0b\x97\xfc\xd6\x96\x6f\x57\xfc\xd6\x11\x6f\x34\xac\x42\xea\x93\x90\x3b\x5e\x44\x22\x1f\x43\xbf\xf7\x3d\x6a\xa9\x2b\x3c\x26\x64\x55\x9a\x24\x77\x42\x29\xf9\x79\x91\x85\x6f\x4b\xf2\x83\x94\x33\x15\xa4\xf0\xe9\x03\x08\xc9\xe0\xaa\xef\x5a\xe6\xa3\x97\x8f\xf5\xbd\x68\x99\x8f\x5e\xb4\xcc\xe7\x1f\x33\x9f\xeb\x99\xcf\xf5\xcc\x17\x1f\x33\x5f\xe8\x99\x2f\xf4\xcc\xe5\x8f\x99\xcb\x7a\xe6\xb2\xcc\x7c\x32\x2b\xa0\x15\x43\xfb\xb7\x52\x5f\x91\xed\x6d\x7b\x8e\xd6\xab\xac\x16\x5c\xb4\x26\x56\xbc\x8a\x35\x0e\x22\x85\x12\x3e\x04\xde\x4e\x45\x8b\xf6\xa4\x88\xef\xfa\x41\xda\xc4\xef\x4b\x57\x99\x0d\xd1\xd2\xf8\xf6\x47\xba\x3c\xb8\x9a\xd4\x6b\x4f\xaf\x10\xd4\x5e\x4d\xea\xca\x8f\x01\x20\x6e\x75\x53\xbc\x31\x54\xf1\x2b\xdc\xed\xf4\xc6\xd1\xa4\xef\x8b\x94\x3e\x52\x22\xa8\x7b\x48\x3a\x1d\x89\x9d\x70\x82\x97\xea\xc8\x51\xba\x42\x07\x78\x3f\xc3\x71\xeb\x8b\x6f\xe7\x23\xb6\xe9\xe6\xe7\x0b\xe4\x93\x4d\x53\xf1\x67\x7d\xf5\xe0\xaa\x07\x4f\x39\x1f\xa0\xfe\xbd\x13\x6d\xe3\x30\xa1\x14\xe9\xb9\x4e\x88\x12\x7a\x45\x9c\x2e\x38\x39\xdf\x77\x52\x57\xd5\x99\xc8\xd3\xc2\xa4\x1c\xdd\xbb\xaa\x22\x28\x42\x34\x86\xd1\x58\xb0\x5d\x07\x3c\x10\x36\x6c\xa5\xd4\x3f\x68\x20\x81\x6a\x54\x09\xd7\x0f\x48\xa0\xa1\x56\x09\x7b\x63\x5d\x65\xa9\xf0\xed\x43\xcd\xf1\xec\xfb\x42\xbb\xda\xb0\x6d\xbf\x2b\xdc\x39\x46\x93\xdb\x49\x62\x37\x19\x69\x3a\xb3\x6e\xaa\xff\xe5\xd0\x9f\x3e\xda\x32\x0c\x31\xd4\x19\x9d\xae\xcf\x41\x2f\xec\xd5\xe5\x8b\x36\x02\x8e\xac\x8b\x5c\x6f\xdf\x18\xc2\x19\xb4\x7b\x89\x1e\x26\xe0\x58\x6b\x37\xdf\x3e\xb9\x40\x77\xb3\x07\xd7\x1c\x2b\xf9\xee\x2d\xeb\x78\x10\xae\xdb\x1d\x6a\x0e\x2e\x58\x18\x5b\xf2\x73\x17\x02\x4a\x22\xd0\xf8\x82\xaf\xe8\xa4\xed\xb5\x8d\x9c\xe5\xfc\xf2\xc5\x5d\x1e\x68\x99\x0c\x92\xd0\x9a\x0b\x39\x34\x6f\xdf\x8c\x95\xd5\x15\x6f\x25\x05\x6b\x36\x04\x09\xe2\x9b\xc0\x8c\x2f\xef\x0d\x23\x8d\xd0\x41\xcb\xaa\xb9\x69\x22\xfa\xd3\x74\x2e\x3d\x34\xe9\x25\x43\x2f\x19\x36\xd5\x8b\x46\xe8\x31\x39\x42\xb7\x60\xb7\x89\x6d\x9f\xc7\x31\xd3\x69\x68\xb3\x8b\x4d\x26\xf3\x63\x87\xf3\x52\xf8\xa3\xe4\x3d\x9e\x7d\xdc\x66\x37\x6b\x87\x6d\x15\xda\x48\x44\xe1\xa7\x77\x50\xb9\x69\x5f\x48\x7c\x7c\x61\x78\xc5\x52\x1f\x03\x0b\x98\xfa\xe7\xf3\x40\x69\xc1\xaa\xbd\x9f\xd9\x3f\x96\xf5\xe0\xe8\xd7\x1a\x6b\x23\x8e\x82\xd0\xfe\x2a\x44\x63\x4b\x4b\xfb\x58\xf6\xbb\x2f\x6a\x43\xf5\x94\x9c\xdf\x75\x95\x56\xf4\x78\x47\x6e\xe6\x03\x21\x7c\xa8\xf4\x53\xd7\x33\xeb\x4a\x1e\x0a\x5f\x25\xf4\xb8\x9f\xd8\x92\x11\xfb\x6b\x08\xa7\x2a\xd9\xf3\x5b\x21\x09\x55\x4e\x2c\x94\x12\x1f\x31\xbd\xb6\xfd\xba\x17\xad\x61\xc4\xa4\x1f\x1e\x2c\x2d\x79\x92\x4f\x30\x0a\x5c\x2f\x95\xb7\x3f\x54\x0d\x86\xf8\xab\xdd\xa8\x24\xaa\x66\x08\x17\x5d\xe9\xee\x1f\x2f\x57\x6f\x89\x0c\xb4\xa3\x31\x99\xae\xc9\x1f\x4f\x5b\x5a\x9b\x7a\xb2\xd9\x72\x5c\xa8\xf3\xd2\xb5\xda\x07\x85\x0b\xa5\xa5\x74\xa0\xa1\xec\x1e\xf6\xe5\x3b\xb1\x3f\x0c\x98\xe8\x22\x60\x09\x51\xc7\xb4\x70\x76\x26\xcd\x74\x5c\x18\xf8\x1b\xe6\x5a\x2e\xa7\x79\xf4\x88\x2b\x8e\x3c\x76\x68\x57\x1e\xdd\x4a\x7c\x06\xd3\x1c\xa2\x9e\xb8\x47\x8a\x0b\x87\x14\x41\x70\x7e\x41\x45\x70\xc0\x6f\x7b\x16\x0f\x72\xc1\x15\x83\x5a\x84\x9b\x52\x2b\x75\x03\x44\x6e\xb2\xaf\xcf\x68\xf5\x08\x06\xaf\x21\x0b\x96\xf6\x2c\xb6\xaf\x95\x03\xe9\xb1\x68\x82\xb0\x46\x45\x91\xc6\xfc\xea\x56\x14\xe0\xa5\xa5\xaf\x7e\xf1\x16\x60\x2d\xf6\xec\x29\x06\x5d\xa6\xdc\x88\xe0\x13\xd1\x55\x28\x42\x97\xd1\xf2\x62\x75\x09\x05\xd7\x4c\x49\x48\xc4\x13\xd3\xf2\xec\x57\xc4\x6d\x77\xd4\x47\x6e\xd5\xd6\x9e\x62\x15\x55\xfd\xc5\x94\xc8\x29\x3a\x63\xa1\x7b\xa6\x37\xc3\x57\x82\xd5\x8c\x06\x52\x64\x7f\xe7\x86\xe1\x9a\x7c\x47\xcd\xaf\x33\x6f\x72\xc7\x52\x9d\xee\xa6\x2a\xcf\x56\xc3\x5c\xcf\xe9\xde\x19\xb8\x6b\xef\x62\x42\x44\x56\x9a\x65\x47\x4e\x71\x94\xab\x27\x2a\x95\xe1\xd8\x08\x9b\x1f\xc4\x2e\x68\xf1\x06\xb1\x9c\x5c\x47\x09\x9e\xb5\x9a\x28\xc5\x23\x16\x95\x1a\xef\xa0\x94\x6c\xa0\x31\xbd\xfe\x67\x67\x7e\x04\xfb\x49\x97\x97\x0b\xda\x63\xcd\x16\x5a\xf4\x8e\xb9\xaa\x68\x17\x95\xe4\x46\x49\xd7\x43\x47\xdd\x26\x56\xd7\x6c\xe9\x87\xf4\xc9\xf6\xf8\x7a\xe9\xec\x91\xd0\xd6\x2e\x02\x99\xd4\x5e\x21\xd0\x12\xcf\x88\xf1\x25\xe3\xb0\x1b\x45\x59\x00\x69\x19\xf9\x4c\x79\xad\x78\x0b\x35\x1b\x8e\xad\xc5\xb3\x1d\xcc\x1c\x4b\xc8\x37\x73\x2c\x3b\x28\xc3\xee\x64\xf9\x89\x2b\xc5\x85\x4b\x2c\xdd\x8b\x73\x56\x9e\x0c\x8e\x40\x49\x8d\x5f\x5a\x72\xf9\x89\x1b\x40\x1b\x03\xf7\x49\x6b\x69\xa2\x63\xd7\x08\xa9\x5a\xee\x4f\xed\x13\x12\x2d\xf7\x17\xa7\xa0\xe5\xbc\x72\x91\x3d\x76\xda\xf6\x15\x20\x95\x0e\x5e\x14\xff\xda\xc1\x78\xa9\xb0\x8b\xdc\xc4\xd2\x03\x2b\xa9\x30\x64\x53\xc1\xc3\xf2\xdd\x7e\xc0\x1d\xd3\x1a\xae\xc3\xd6\x10\xd6\x4e\xe6\x31\x56\x00\x38\xf6\xa2\xc1\xc1\x79\x85\x4d\x90\x97\xb8\x71\x18\x26\x07\xea\x0c\x38\x72\xf7\x8d\xc9\x1d\x7e\xde\x7e\x13\xa4\x92\xf7\xcb\x8f\xd5\xa2\x95\x16\x6d\x56\x2a\xca\x2e\xa4\x16\xd3\x5e\x7a\xd1\x58\x78\x1c\x0f\x47\x0b\x6e\xb0\xe0\x8c\x16\x1e\x7b\xf4\x18\x67\x14\x7a\xb4\xc8\xe8\xa7\x4f\x03\x65\x0f\x76\x82\x2a\xf6\x50\x5d\x43\x3c\xef\xbc\xe9\x94\x59\xa0\x66\xa0\xb1\xb4\x14\xfc\x6a\xcc\x6f\x00\xeb\xed\x02\x70\xf0\x77\x2d\x88\x72\x36\xb8\x09\x81\x7d\x17\xb0\x3e\x98\x90\xe2\x73\xc4\xaf\xad\x37\xc7\x2c\xa3\x0d\x0d\x1b\x81\xbc\x1a\x66\xcb\x61\xcd\x18\x25\x6a\xa2\xd5\x8a\x2d\xa0\x14\x46\xb5\x9d\x71\x37\xcf\x3c\xe0\x4e\x98\x07\xdc\xfd\x85\x2d\xe7\x54\x7e\xfd\x0f\x8d\x07\x60\x27\x90\xb4\xeb\x1a\x55\x66\x94\x5b\x55\xdb\x0a\x82\x77\x17\xca\xf4\x62\xf7\x5c\x5e\x33\xdd\x75\x50\xad\x85\xd0\x8d\xaf\xa7\xd4\xf5\xfe\xb9\xda\xb5\x4f\x8e\xed\x49\xa7\x00\x41\x37\xe5\x21\x14\xda\xdb\x0e\xbb\x04\x70\x33\xb0\x57\xf6\xe8\x2f\xa2\xed\xd3\x32\x43\xd4\x75\xda\x0b\x44\x92\xc8\x77\xfa\x86\x77\x01\xe8\x65\xa0\x9c\x08\x40\x74\x05\x51\x45\xa1\x63\xcb\x2f\x98\xf9\x03\x2c\x83\xfb\x67\xc2\xe2\x42\x5a\x04\x5b\x75\x82\xd4\x81\xb4\x6e\x68\xcb\xd6\xd2\x58\xa6\xe2\x78\xd7\x7d\x93\xeb\xe9\x2e\x0f\x0d\xb8\x62\x10\x95\xf6\x45\x23\xd2\xb0\x52\x37\xfb\x32\x67\x57\xe4\xec\xaf\x20\xa7\x6a\x6e\x37\xd3\x17\x39\xc5\xed\xb6\x6a\x1e\x64\x6b\xa1\xd9\x97\x7b\x35\xa4\x16\x08\x32\x9b\x9b\x70\x33\xb2\x43\xc9\xd5\xf9\x8a\xf2\x19\xd9\x41\xa4\xfe\xd0\x90\x1f\xd7\xc5\x2e\x3a\xd9\x13\x15\x0b\xb4\xb8\xba\x9c\x92\x1d\x86\x73\x06\xf5\x08\xe5\x81\xfc\xca\x9a\xa1\xf8\xb4\x49\xd3\xb1\x6f\x50\xb8\x76\xf8\xe2\x98\x07\x2f\x4e\xdd\x6c\x6d\x29\x61\x3d\x7d\x63\xc0\x47\xf4\x29\x6f\x14\xbe\x08\x54\x7c\x6d\x5f\x22\xf1\x78\x4f\xcd\xde\x93\x3d\x4e\x12\x26\x97\xbb\xf6\x73\x94\x02\x26\xbc\x9a\x3a\x28\xcb\x6f\xcf\x2d\xc7\x96\x8e\x7c\x1e\x9a\x92\x61\x3a\xb5\xbf\x71\x35\x65\xf3\x00\xe6\x11\x3b\x32\x6b\x63\xd3\xbe\x40\xba\x83\xea\xa9\xcd\x32\x55\xe6\x0e\x28\xb5\x4c\xd9\x2f\xd5\x2a\x0a\x37\xed\x06\x56\xcc\x71\x99\x85\x35\xb2\xb1\xb1\xc8\x46\x8e\xd5\x54\x51\x95\x37\x60\xd3\x1c\xd3\x8f\xe8\xcc\x6e\x4b\x8e\x85\x33\x72\xe0\xea\x50\x2c\xe5\x13\x91\xd6\xd4\xd2\x26\xeb\xf6\x4b\xb2\xc7\x6f\x34\x54\x13\xad\xcb\xdc\x90\x93\x12\xa2\x1b\xd8\x37\x22\xc8\x86\x98\xbd\x92\x68\xfc\xfd\x81\xd9\xec\x99\x87\xaa\xe9\xa3\x91\x94\x87\x94\xbe\xda\xe7\x32\xe8\xc3\xc0\x7e\xef\xf6\x06\x8f\x4e\x87\x38\x37\x16\x1e\x05\xf0\xcc\xc1\xf1\x00\x0f\x4b\xaa\xc9\xf7\x54\x2f\x27\x1d\x47\x49\x77\x94\xe4\x17\xaf\x3b\x8e\x75\xd5\x91\x4a\x33\x8f\xb7\x22\x53\x39\xca\x74\x41\x5d\xcd\x4b\xed\x7b\xe7\x46\x56\xde\x97\x3b\x44\x97\x4d\x04\x25\xfb\x4b\x6b\x4b\x6e\xaa\x3d\xed\xc3\x0b\x55\xc3\xb3\x73\x12\x8d\xdf\xb7\xa6\x60\x20\x3b\x72\x20\x68\xfd\x32\x1f\x60\x4a\x7e\x2d\x27\x43\xe5\x6a\xc4\xc7\x6b\xe5\x43\x70\xfa\x1c\x8b\x6d\x5e\x4a\x1c\x52\xf6\xa7\xcf\x61\x65\x63\x45\x02\xfe\xe2\xd5\xb3\xfd\x5b\xa8\x20\x20\xaa\x12\xeb\x06\x16\x1a\x3f\xc3\x58\x17\x15\x7a\x7e\x0d\x96\x8e\xb6\xb3\x2d\x5f\x3b\xf2\xda\x89\x8b\x96\xd8\x6d\x5b\xf2\x78\x2a\xf1\xab\x83\xf5\x10\x85\xe8\x77\x3f\x28\x7c\x42\x0f\x34\xa9\x05\xe1\xd7\xa0\xf8\x00\x07\x13\x81\x15\x99\xe0\x4d\x35\x1f\xf0\x7a\x58\xfe\xad\x8f\x3d\xc7\x30\x55\xaa\x26\xe4\x6c\xf9\xdc\x2f\xbf\xe0\xab\xfe\x04\x38\xff\x99\x91\xcc\x28\x15\xd2\x95\x7c\x6e\xd9\x4f\xcb\x37\x1a\x88\x94\x54\x24\xcd\x28\xb5\x53\x2d\x43\xae\xce\xec\xeb\xeb\x6e\xaa\xd6\x50\x3a\xa8\x75\x93\x9f\x19\x28\x3d\x47\xf9\xf8\x99\x21\x99\x10\x94\x7a\xc2\xb4\xaf\x56\x85\x81\x1e\x64\x63\xb8\xf1\x19\xbe\xd6\x53\xa5\x43\xb0\xb2\xe2\xf9\xa6\x99\xe0\x55\x3d\x9c\x82\xc4\x16\xd2\x5f\xc1\xaf\x7a\x6c\xf7\xe6\xe3\x2f\x9d\x1e\xb4\xda\x98\xe1\x86\xd2\xfa\xf5\xc6\x1c\x05\xe6\x78\xb2\xb7\x15\x9b\x76\xe2\x3b\xa9\x33\xa8\x3f\xdc\x6d\x1b\xe6\x99\xd4\x83\x80\x57\x5a\x6a\xfd\x2f\xd9\x8b\x82\x81\x37\xe6\xb2\x59\x64\xc9\x1f\x7f\xca\xee\x8a\x8f\xcc\x95\xab\xa6\xb6\x7c\x0b\xaa\x17\xa6\x47\xa7\x5e\x30\x10\xd8\x61\xf7\x3e\x15\x85\x77\xbe\xdb\x46\xa0\x7e\x54\x69\x4a\xbd\xb4\xad\x40\x90\xaa\xa6\x10\x0f\x18\x66\xd0\x15\x59\x82\xee\xa7\x59\xba\xe7\x5c\xcb\x57\xfb\xa6\xef\xe8\xfc\xfa\x76\x72\xc9\x61\xd1\xe7\xd8\x58\xe0\xfc\x61\x26\xc6\x1a\xd6\xd9\xc9\x41\x52\xad\x25\xcd\x46\xb5\xb4\x40\xec\xad\x07\xe1\xaa\x90\x65\x0b\x41\x3a\xfd\x71\xd5\xd5\xbc\x95\xc0\xf4\x57\x82\xfa\xf4\x06\xcd\x9b\x33\xe0\x72\x40\x4e\x0e\xc4\x20\x94\x1a\xd1\x91\x4e\x15\x1b\xe6\xf1\x81\xe8\xe5\xf1\x81\xea\x25\xe5\x48\xf4\x72\xca\x16\x08\xa5\xc6\x5f\x00\x6f\x33\x0c\x05\x60\xf7\x7e\xb6\xfc\x0d\xa5\x7d\xaa\xcc\x8e\x49\x64\x27\x90\x83\x56\x41\x59\x20\xc0\x69\x8f\x0d\x65\x38\xbe\xa7\x28\xc3\xc0\x5b\xf8\xc9\x80\x5a\x0d\x2d\x75\x1f\x51\xd0\xd4\x10\xb4\xd3\x8d\x65\x08\x31\x32\x01\xef\x1d\x1e\x32\xf1\x6c\xba\xe9\x70\x39\x95\xcf\xd0\xd7\xd7\x4c\xc0\x1b\x87\xad\x21\xc5\xb3\x51\xd7\x9d\x56\x24\xa7\x0c\xde\xa2\x81\x33\x35\x87\x40\xbe\xcd\x6a\x0e\x2f\xa5\xf9\x72\x97\xfe\x2d\xbb\x73\x8a\x0c\x42\xa0\x0b\x15\x59\x54\x70\x04\xe2\xf7\x4e\x4f\xb8\xbd\xb7\x1a\xe6\xe1\xad\x45\xd4\x5d\x4c\xa6\x12\x6d\xd5\xb0\x77\x2b\x42\x2f\x90\x35\x3b\x5a\x7c\x93\x12\x0b\xe8\xdb\x04\xba\x2d\xae\xa6\xda\x0a\x75\x40\x31\xa7\x5d\x2f\x84\xd9\xc3\xdb\x5a\x07\x77\x08\x76\x07\x11\x34\x46\x7d\x5c\x34\x85\xc6\x74\xaf\xc2\x81\x61\x23\xfb\x83\x18\x41\xed\x55\x66\x22\x29\x27\x23\x2b\xc6\x68\x8b\xa3\x50\xf9\xf6\xac\xa8\x88\x3a\x2a\x0d\x3b\x1c\xcd\xb0\xc3\xe5\x8e\x08\xda\x10\x16\x1b\x34\x7b\xc7\x6d\x5a\x18\xb2\x74\x48\xa5\x43\x2a\x6d\x50\x47\x3c\x5c\x86\xa4\x43\xfc\x85\x17\xc7\xb4\xad\x25\x10\xad\x37\xf5\x88\x89\xb7\x83\x5f\x9c\xaa\x5f\x85\xec\x56\x3e\x44\x9f\x73\x70\x40\xc3\x21\x21\xae\xa2\x26\xeb\xa9\x38\x02\xb9\x4d\xcd\x91\x8b\xa4\x2e\xd7\xd6\x8c\xa2\x8d\x03\x1a\x09\xaa\x36\x0e\x08\x22\x93\xb5\x87\x1a\xd0\x5c\x72\x70\x06\x42\x1b\x0c\x22\x40\x8f\xc5\x81\xd4\x1b\x36\xbc\x10\x09\x90\x09\xd2\x3a\xf1\x4c\x2f\x4d\xdb\xd3\xf4\x32\xf4\xb7\x3e\xa3\x8e\xe9\x27\xef\x30\x6d\xa8\x66\x13\x21\x49\xb0\xf7\xf0\x34\xb4\xbb\xd9\x83\x6b\x71\xcf\x17\xfe\x1c\x0a\x2c\xfd\xfb\x77\xf8\x6b\x28\xed\x06\xe2\x89\x18\x13\xbc\xb1\xba\x27\x1b\x0b\x78\xcf\x34\x66\x63\x79\x4d\xf8\x2c\x8a\xe7\xa9\xf8\xb3\x28\x0e\x87\x1a\x32\x9b\x03\xd4\xd7\xcd\x5e\x8f\xcc\x2e\x64\x7f\x7d\xb3\x16\x9a\xcf\xb4\x3b\xde\x6c\xe9\x9e\xd2\x4d\x5f\x06\x69\xdc\x29\xe3\x77\x6c\x98\x5b\x10\xb7\x28\xc6\xb5\xe1\x66\xfb\xc2\xac\x48\x3e\x17\xb7\x70\x67\x9b\xdd\x65\x31\x96\x48\x12\x3c\xb6\xcc\x7d\x57\x89\x73\xdf\x55\x3e\xe4\xbe\xab\x24\x72\xdf\x6a\xb9\x6f\x3f\xe6\xbe\xa5\xdc\x5f\xb4\xec\xee\x76\xcc\x52\x37\x60\x8b\x16\x97\x76\xb5\x67\xa4\xa7\xb6\xec\x32\x56\x4b\x76\x04\xc3\x15\x09\x0f\xb6\x6c\xc9\x14\x6f\x1b\x87\x4d\x9b\xed\x56\x0e\xba\xd6\x9b\xd9\x71\xdc\xa0\x63\x6d\x41\x82\xe6\x9a\x13\xeb\x19\xc7\xe5\x2b\xfd\x10\x22\x06\x2b\x68\x05\xd2\xb9\x54\x03\x9a\x05\x90\x12\x4e\xa7\x7c\x91\x8c\x1b\x6b\xe1\x54\x3c\x52\xf9\x68\x6b\x2b\xb7\x52\xf9\xa0\x75\x39\xea\xd3\x46\xf2\xa1\xe5\x03\x0d\x32\xda\xc4\x42\x33\xe8\x6b\x23\x16\x1b\xc6\xaa\x19\x40\x88\x50\xcd\xb8\x64\xe7\xe2\xec\x61\x8e\xa8\x25\xbe\x28\xe5\x05\x15\x82\xc7\x39\x86\x0e\xaa\x6b\xee\x11\xd9\xc6\x0b\x8d\xa8\x36\xaa\xa2\x9f\xbd\xf9\x96\x0a\x60\x24\x60\xb6\x09\x51\x99\x5d\x43\x86\x68\xa2\x4d\xd9\xa0\x4d\xd9\x60\xe9\x2f\x65\x3b\x7d\xa4\x52\xfd\xec\xdb\x37\x5a\x9b\xf4\xa1\x30\x4c\xf7\x09\x17\xff\xa2\x63\x06\x4e\x57\x53\x9c\x98\x41\x92\xe0\xbe\xc7\xf4\xfe\x4a\xef\xa5\x3a\x2d\xce\x2e\x10\x34\x65\xe2\x44\xa5\x5c\x47\x4c\xd0\xd0\x1c\x9b\x7d\xf6\x43\xc5\x1a\xd1\x1d\x1b\xc4\x51\x80\xfb\x4f\xcf\xc6\x39\x1d\x62\xd1\x79\x69\x22\x86\xcd\xeb\x91\xd5\x31\x0f\xae\x69\x84\xef\xde\xac\xbe\x79\x8a\x63\xa5\x4d\x74\x18\xec\x4c\xae\x37\x4c\xe0\x46\xa1\x63\x77\x57\x85\x65\x57\xa8\xd0\xb3\xc0\x8d\xbe\xc2\x8d\x1d\x1b\xd7\xa8\xdc\x5d\xb1\x54\x3a\x4b\x4b\x84\x4e\x43\x53\x20\x0f\x70\x65\xd0\xb4\x8d\xe8\x1a\x9a\x75\xd7\xdc\xdf\xa4\x09\x7d\x6e\x05\x2f\x96\x67\x56\xde\xac\x50\x47\x3a\xfb\x49\x19\x28\x71\x39\x4a\xde\xe2\x10\x83\xf4\xfb\xf7\x57\xfc\x64\x6f\xda\x73\xd4\x69\x1c\xe2\x5c\xe0\x79\x4f\xd0\xbd\xe0\xd6\xf8\xca\x92\x99\x35\x78\xfa\xa3\x31\xb3\x72\x66\x27\x68\x8c\xe8\x47\xd8\xed\x3a\xe0\x82\xec\xcb\xb0\xe8\x2f\xd3\xe3\xa6\x15\xf0\x8f\xf2\xe3\x97\x87\xf7\x89\x84\xd1\x30\xf2\x9b\x2e\x50\x58\xb8\x69\x7a\xdf\xa0\xa7\xea\x7f\x83\x47\xe2\x1b\x3a\xdf\xd8\x1b\x98\x03\x2e\xcc\x76\x0f\x61\x3a\x85\xa7\xeb\x92\x53\x5c\x5b\xf6\x64\x4d\x17\xcd\x62\x90\xf1\x32\xd0\x50\xb4\xc4\x03\xcd\xe7\xbd\xc3\xfa\xdb\xc9\x72\xd5\x1d\xf8\x71\xd3\xca\xf9\x32\xbb\xe5\x4b\x00\x86\x28\xc8\x0a\x90\xdc\xcb\x32\xee\x98\x85\x2b\x31\xbc\xeb\xce\xae\xe0\x6b\x91\xc6\x8d\x8e\x3b\xec\xc4\x23\x5d\x39\xf8\x60\x0e\xfd\x0c\xf5\x20\x69\xc7\x40\x18\x02\xe6\x69\xb8\xa8\x56\x47\x00\xef\x68\xc4\xfb\x34\x3d\xfb\xee\x91\xc9\xd9\x79\xe7\xde\x4b\x45\x0f\xbd\xc2\xc8\x6b\x5c\xd0\x66\xed\xab\x1e\x8f\x34\x36\x6c\x64\xe8\x9a\x1f\x6c\x99\xd7\x29\x9e\x5e\xc8\x8b\xd7\x27\x68\x1e\x4a\x9e\x72\xfa\x99\x13\x7b\xfa\x14\xf7\x71\xf2\xa1\x29\x8d\xed\x7f\xa7\x29\x03\xc5\x90\x5d\xee\xe2\xf2\xfc\xb3\xba\x89\x29\xd4\x2a\x1f\xcf\x1b\x87\xe8\xd4\x74\x13\x0b\xd9\xb5\xd5\x74\x44\x33\x87\xf0\xf0\x84\x66\xf4\x40\x74\xcf\x73\xba\x63\xba\xb6\xea\x89\x02\x21\xe4\xad\x2a\xd6\x4f\x25\x82\x13\x4f\xd1\x61\x92\x12\x7b\xef\x97\xac\x5a\xdd\x1c\xe0\xef\x54\x09\x60\xb3\x03\x44\x47\xf0\xb2\xfd\x92\x5d\xc3\x4b\xdd\x88\xbe\x84\xfb\xfc\x65\xc0\x5f\xc2\x7d\x66\x73\xda\x03\x5b\x12\x00\x8c\x75\x47\x42\xfb\xa8\x64\x0b\x4b\x37\xf9\xf8\xd6\x84\x9a\xc3\xfe\x29\x71\x83\xb8\x12\xfe\xe0\x51\xc9\xb5\x8f\xa2\x8b\x25\x36\xa4\x08\xa4\x92\x80\x4f\xfb\x58\x72\xf5\x59\xc1\xd4\xf3\x86\x0f\xed\x88\x33\x16\x4b\x24\x93\x37\xa5\x1c\x8c\x9e\x72\x86\x39\x56\x9c\x39\xd4\x24\x1c\x62\xf2\x64\x98\xc7\x9b\x1a\x87\xfe\x78\x8d\xaf\xb1\x0a\xe2\x1c\xe7\x2d\xf0\x26\xa3\x91\x17\xb9\xfb\x38\xb5\x58\x21\xdf\xf4\xd9\xec\xec\x4d\xa1\x75\xa7\x56\x9d\x48\xeb\x23\x3c\x80\x18\xc6\x38\x20\xff\xc9\x19\x4b\x2c\xbf\xe6\xcd\x37\x93\x08\x01\xe9\x1b\xd5\x94\xc2\x04\x3a\x0c\x0d\x6b\xbc\xb4\x54\x7d\x48\x8d\xe9\x48\xd2\xef\xdc\xda\xd0\xb9\x1f\x94\x84\x19\x20\x42\xa3\x7c\x84\xa8\x6a\xa7\x63\x02\xe8\xe3\x35\xd3\x20\x12\x4a\x4b\x45\x9a\xf1\xa1\xc6\xa9\xf9\x25\x66\x6c\x62\xe1\x39\x2e\x9c\x45\x74\xbd\x4f\xa6\xec\x30\x8c\x54\xa3\x8e\xc4\xaa\xa1\x22\xd0\x07\xe2\xdf\x7e\x45\x90\x84\xf3\xa6\x85\x5a\x83\x3c\xec\x51\x69\x62\x46\x8f\xaf\x62\xb5\xc8\x3e\x05\x8c\x96\xb4\x6e\x85\xdc\xad\x50\x74\x2b\x9a\x5d\x87\xa7\xd6\x89\xe6\x35\x54\xfd\x73\x44\xe7\x74\x42\x6a\xcc\x21\xa0\xdf\xd9\xa1\x84\xa5\xe8\x10\xd9\x68\x99\x83\x46\xc1\xcb\xee\xb6\x6c\x71\xe8\xc0\x86\x42\x81\x70\xb3\x7b\x63\x5e\xdc\x0f\x7b\xb6\xa4\x26\x28\x05\x97\x7d\xfc\x8b\xdb\xc4\x18\xe7\xc5\x36\x5b\xba\x8a\x19\xe8\xa3\xa2\x67\xb9\xb4\xde\x84\x9b\x2a\x87\x4d\x58\x6b\x23\x0e\xd6\x29\x76\xc8\x46\x0e\x0e\x87\xd8\x53\x25\x7f\xf0\xd9\xa4\x15\xb2\x47\x7c\xf1\x33\x8e\x56\x4d\xfa\x64\x0b\xb1\x9c\x8e\x03\x0e\x9e\x90\x76\xb5\x7d\x5c\xae\x24\x0d\x7a\x45\x3b\xce\x1b\xe6\x51\xc3\x48\x0f\x83\xf4\x31\xdf\x83\x06\xa1\xf9\x96\x50\x2f\x3c\xfa\x48\x26\x35\x5c\x3e\x33\x47\x38\x2f\xe9\xd4\xa3\xa3\x6f\x08\x64\x60\x86\xf1\x5a\xf1\x41\x84\x86\x44\x44\x31\xe5\xc8\x6f\x09\xcf\x0a\x7e\xc2\xb3\x82\x67\x07\x82\x00\xf4\x41\x0f\x16\xc2\xf8\xd5\xe3\xd7\x32\xcb\xe7\xc3\x59\xb7\x0b\x1a\x7c\x22\x4b\x39\x90\x60\x68\x1f\x5d\x20\x52\x63\x13\x11\xad\x67\x3d\x31\x68\xf9\x89\xe8\x95\x1f\xd5\x0d\x61\x68\x9f\x12\xab\x76\xdf\x74\xf8\x4a\xe7\xe8\x8c\xc8\x13\x2c\xd5\xda\xbe\x0f\xdc\x53\x7b\x2a\xb1\xb6\xa0\xa7\xdf\x26\xf9\xd9\xdd\x3f\xc1\x66\x79\x31\x5c\x4a\x30\x83\x6c\x08\xa1\xc9\xee\x9f\xe6\x35\xb5\x21\x2a\x4a\x20\x3d\x53\x5b\xfd\x6a\x55\xfe\xd5\xcf\xd7\x9c\x8a\x06\x24\xe2\xfd\x08\x65\xe0\x01\x2b\x03\xe3\xe4\x65\xce\x16\x92\x2b\x6e\xb1\x5b\x83\xf5\x60\x5c\x43\xa2\xdd\x05\xcd\xfe\xd4\x17\x0b\x1f\xe3\x71\x01\x7f\xa3\xb4\xc8\xcd\xa8\x13\x5f\xd4\x7b\xd4\x60\x8c\x81\x19\x7e\x0a\x39\x72\x1f\x4a\x27\xcc\xd2\x12\xfe\x7e\xac\xa1\xb1\xad\xd5\xa0\x5e\xff\x71\x05\x51\xa8\xd1\xe9\x3f\x30\x61\x8d\x56\x6e\x29\x79\x70\xe1\x8e\xef\xbc\x58\x5b\x5d\x5f\x37\xe5\xbf\xba\x55\x79\x4c\x31\x85\xb2\xf7\x98\x3a\x06\x91\x92\xcd\xc7\x54\xa8\x70\x68\x9b\x64\x4f\x3d\xc1\x91\xba\x53\x16\x47\xcd\x7c\x3c\x37\x95\x27\x69\x7c\x70\xba\xa9\xb7\x7d\x18\x92\x81\x28\x0d\x4a\xc5\x37\xe0\x97\xa0\x84\x8b\x63\xa1\xd4\xfb\x01\x36\x18\x97\xb8\xf5\xf7\x73\x62\x87\xc9\x0b\x9f\xb7\x8e\x32\xd0\x74\x23\x7b\x4e\xa5\xb5\xf1\xe4\xa8\xbb\x8b\xf8\xca\xa2\xa7\x2e\x36\x76\x1e\x35\x99\x72\xe3\x36\x8a\x5a\x7c\xf7\xe0\xd8\x6d\xf1\x78\xd5\xb5\xe5\xf7\xe7\xeb\xe8\xfb\xcb\xb5\xae\x13\xb7\x11\xa5\xbb\x42\x45\xeb\xf4\x2c\xd2\x89\x10\x62\xec\x81\xba\xf0\x38\xd9\x12\xe1\x00\xcf\x53\xea\x42\xa1\x73\x66\xd7\x84\xc1\xd4\xd7\xbc\x34\x2d\xbd\x16\x87\xe4\x48\xd1\x4d\xae\x3c\x9f\xd5\xe9\x6c\xca\x4e\xc3\x50\x55\xba\xbb\x68\xb8\x12\xdc\xf1\x06\x97\x95\x0a\x2e\xd2\xf8\xc4\x55\x5f\xcf\x36\x6d\xd6\x6e\xb9\x1a\x39\xc4\x53\x41\xf1\xf4\x44\xdd\x21\x9c\xdc\xa6\xe0\x73\xef\x5e\xb9\x9f\xb9\xaf\x4a\x29\x69\xc2\xff\x4c\xb4\x7a\x54\x6c\x97\xeb\xb7\xc8\xb0\xd4\xa5\xa3\xe9\xa5\xc4\x22\x08\x08\xeb\x35\xc9\x94\x72\xb3\xc1\x4e\x5a\xa4\x6d\xe1\x8c\xc8\x5c\xa4\x37\xea\xac\x99\x7d\x79\x9d\x6d\xfb\x44\x3f\x77\x74\xd7\x8b\x10\x4f\x59\xed\xec\xf5\x28\xfb\xd0\x84\x23\x02\x7e\x1c\xb4\xa6\xc4\xb0\xa1\xc7\x28\x55\x1b\x13\x32\x00\xdf\x06\x76\x73\x9b\x1f\x85\xac\xc3\x63\x23\xf5\xbe\xdd\x80\x48\x43\x70\x7d\xdd\xec\xa4\xe5\x2c\x77\xb2\x37\x23\x5c\x50\xf1\x6f\x99\xd8\xb1\xec\xab\x4a\x2d\x89\x54\xbe\x30\xeb\xd6\x1e\xdf\xea\x2a\xb3\xfe\x86\x0b\xad\xb1\xdd\x41\x7d\x7d\xb8\xe0\x06\xeb\xc8\x82\x8c\x31\xee\xde\xc0\x3d\x4a\x09\x46\xdf\x00\xf3\xf8\x0c\xe6\x91\xbf\x13\xff\x38\x14\xfc\x63\x97\xf9\xc7\x0e\xf8\x47\x42\x81\x26\x71\xa3\x60\x1d\x03\xd9\x7e\x0c\x29\x73\xfe\xa7\x16\x18\xcd\xfe\xad\x05\x47\x15\x44\x75\x0a\x56\xcc\xa3\x55\x21\xf9\x2e\x0f\x2b\xe3\xa1\xe9\xd0\xc3\xcd\xc8\x3c\x7c\xb3\xbe\x75\x89\xdf\xf0\x0f\xcc\x6e\xc3\x31\xb7\x9a\x86\xf9\xf0\x82\x6f\xa3\x92\x79\xb4\x6b\x79\x3d\xfa\xf6\xb6\x63\x98\x37\xdf\xad\x3b\xe4\xbb\xdb\x33\x4c\x8e\xfc\x24\x5d\xb5\x5f\x22\xf1\xcb\xd5\x81\x01\xc6\xad\x81\xdc\x37\x07\x7c\xb1\xe5\x25\x6e\xb5\x3c\xbe\xd2\x32\xf7\x41\x01\x3b\x9d\x56\xd8\xb5\x4a\x07\xe6\xd0\xb5\x4e\xa7\xcc\xaa\x0e\x89\x53\x0e\x4b\xd6\x1b\x1f\x57\xe0\xf8\x63\x52\x19\x3c\x2c\xfd\xdd\x6d\x09\xbb\x8a\x87\x3d\xf1\xdb\x69\x73\x0d\xd2\x9e\x7a\x7f\x8f\xc8\x17\x15\x6c\x11\xfb\x2f\xa7\x36\x65\xaa\xf2\xc2\x04\xbf\xa6\x0c\xfb\x72\x5d\x94\xbf\x29\xc9\xe9\x04\x83\x54\xc2\x3a\xfa\x64\xf6\xba\xd8\x91\x9b\x5e\x4a\x04\xe7\xe9\xb9\xd0\xee\xf6\xb5\xdb\x7a\x99\xaa\x10\x87\xd0\x5b\x54\x3b\xc1\xe1\xfb\x51\x47\xdd\x49\xb2\x1a\x8d\xbc\x8d\x74\x14\x8d\x14\x45\x4d\xeb\xd9\xd2\xcc\xfc\x78\x03\xcf\x91\x56\x32\xc3\x71\x6e\xf4\xfd\x13\xc2\xbf\x7f\x97\x0e\xb8\xae\xc6\x5a\x4a\xdf\x11\x7d\xdb\xad\x75\xeb\x5c\x04\xeb\xa4\xaf\x1d\xc7\x7d\xe5\x5d\x82\xa5\x8e\x5d\x35\x58\x30\x91\x0a\xe1\x57\x01\x8a\x9a\x5d\xb3\x1f\x58\xe2\x60\x80\x0e\xcf\x74\xea\xd8\xef\x34\x63\x21\xa6\x47\x88\x9c\x3d\x03\x93\x24\x89\x3d\x78\x44\x51\x33\x93\x37\xd5\xd5\x1b\x8f\x33\x3a\xfb\x7c\x5d\x0c\x53\xd0\xd0\x27\x04\x19\x4e\xb7\x5f\x66\xe2\xba\x8b\x7e\xc7\xaa\xad\x86\xae\xf8\x95\x07\x88\xc9\x44\x2f\x92\x64\x10\x45\xc1\x66\xa9\xce\x95\x11\x66\x4a\x46\xe8\x51\xa1\xca\x9e\xaf\xf9\x59\x30\x8a\x72\xb2\x7e\xff\xfe\x2a\x9f\x6a\xc7\x6f\x52\x61\xad\x67\x28\xb5\xd3\x43\x85\x68\xaf\xdf\x4c\xf9\x29\xea\xe4\x2a\x58\x56\x39\x33\x27\x5b\xb5\x11\x5b\x7a\xaa\xaa\x3a\x67\x10\x82\x5e\x4b\xaf\x31\x84\x91\x4d\x27\x56\x7b\x51\x39\xf2\xf5\x44\x3c\xfa\xb7\x4e\xa1\x29\x14\xec\x28\xab\x7a\x38\xe3\x68\xcd\xec\x4f\x89\x8b\x9f\x55\x75\x88\x9f\x9d\x13\xb4\x08\xe5\xc0\x88\x5b\xfb\xaf\xf2\x18\x93\xba\xd1\x47\x1b\x6a\xa9\xd1\x71\x96\x32\xcc\xe8\x90\xcb\xc9\x2b\x93\x51\x3f\x19\xef\x9d\x15\xe6\x55\x1c\x7a\x43\x42\x39\xdb\x8c\x03\xc1\x7e\x23\x5e\x64\x20\x57\x91\x88\x33\x28\xb4\xe0\x8a\x72\x44\xa1\x9c\x8b\x03\xfe\x54\x71\x86\xae\xac\xb5\x07\x2d\x5d\xc5\x69\xbf\xb3\xdc\xb2\x5f\x11\xea\x7f\xfd\x8a\xa6\x25\x2c\xaa\x70\x89\xe3\x79\x8d\x9e\x5f\xa7\x53\xa1\x20\x65\x69\xb5\x30\xae\x48\x82\x36\x4c\x6d\x31\xad\xe7\xe4\xbd\xce\xcb\x4c\x1f\xe3\xfe\xc1\x6d\xe2\x4c\xf3\xc3\x7d\x5b\x69\x27\xc6\xb0\xdf\x63\x45\x45\x34\x9a\x26\xe0\x6f\xdb\x1b\x37\x95\x20\xfe\xa3\xa6\x52\x4b\xc7\x7f\xd1\xd2\xb3\x98\xd5\x46\xd6\xc9\x4c\xd6\xc4\x67\xcd\x3d\x80\xa2\xf7\x14\x83\x87\x06\x30\x9f\x8a\x07\xe5\x49\x98\x83\x05\xc4\xdd\x70\xa3\x6e\x98\x4a\x5f\x6f\x0d\xfe\xbf\xb2\xc3\x7f\x7f\xb5\xd8\x1c\x88\x5d\x61\xee\xe6\xab\x63\x2a\x9f\x91\x50\x04\x4e\xac\x17\x49\x5f\xbd\x70\xc3\x79\x06\x9f\xff\x62\x5c\xe2\xcc\x4a\x5d\x95\xe7\xfc\x65\x1e\xc5\x92\xdc\xc3\xd9\xc3\x37\xdb\xde\x6a\xea\x76\xae\x8e\x9c\x13\xc6\x33\xcc\xe0\x99\xaa\xc9\x67\x43\xf3\x5d\xb9\xc2\xd3\x70\x91\x30\xaf\x90\x13\xb9\xb4\x94\x9c\x54\x8d\x74\xfd\x56\x4d\x5a\xc7\x44\x88\x24\xba\x9c\x3b\xde\xa8\x75\xd9\x28\xc8\x2b\x82\x7b\xb6\xa4\xbe\xe3\x0d\x91\x65\x1f\xdc\xcf\x10\xe1\xf7\x98\x7a\xdb\x33\x13\x24\xe6\xb0\x1f\x05\x7f\xe4\xef\xa5\x99\xef\xa3\x99\xef\x5b\x33\xdf\xc7\x33\xdf\x83\x4a\xf2\xfb\xf3\xcc\xf7\xc6\xcc\xf7\x97\x99\xef\xc7\x2f\x4e\x32\x03\xe2\xa4\x26\x5c\xe9\x69\x22\x6b\xb5\x46\xe6\x8a\xa7\x67\x07\x8b\xed\x0b\xdd\x7a\x51\xfe\x66\x4f\x05\x05\x41\x2b\x74\x7f\x6f\x66\xde\x7b\xe7\x29\x39\xe9\xec\x28\x45\x21\x52\x38\x8c\xfb\x9a\xfb\xe0\xdb\x47\x99\xc9\x44\xd4\xb2\x2b\x43\xbf\xaa\x0f\x6f\x9d\xa8\x87\xc9\x0f\xd7\x6f\x46\x4c\xb9\xe3\xc3\xfd\xac\xdd\xc9\x3f\x60\xd3\xd0\xdf\xf3\x0a\x1d\xbf\xdb\xa7\xc7\x16\xfd\xb9\x3a\xb9\xbc\xd8\xdf\xad\x5a\xb5\xc5\x5c\x6e\x75\xd1\xa4\xbf\xeb\xfc\xf7\x0f\xfc\xcd\xe7\xf9\xef\x1a\xff\xfd\xce\x7f\xf9\x6b\x7e\x93\xff\xfe\xe0\xbf\x9c\x73\x95\x73\xae\xf2\xf3\x5a\x8e\xff\x72\xfe\x35\xce\xbf\xc6\xe9\xeb\x0c\x67\x9d\xd3\xd7\x19\xc2\x06\x4a\xe5\xbf\xaf\xf2\xdf\x35\xfe\x8b\xfc\xf9\xf5\x1c\xff\xe5\xaf\x9c\x3f\xbf\x8e\xf4\xb9\xc1\xca\x10\xc0\x69\x4e\xc4\xb2\xc5\x52\x55\x0f\x5b\x86\xf0\x4b\x25\x44\xa5\xfa\x37\x02\x98\x01\xf8\x16\x80\x47\xa1\xcc\x16\xb7\xce\x3f\xc4\x33\x43\x94\xa7\xb9\x41\xcd\x10\xd3\xe9\xf3\xc8\x66\x08\x3d\xf5\x79\x78\xb3\x38\xb2\x19\x20\x6f\xa3\x03\xff\x5e\x8c\xb3\x2f\x8b\xbb\xa8\xf3\xf3\x48\x67\x80\x20\xc2\x9d\x01\xc2\xe7\x31\xcf\xd0\x87\x32\xfa\x20\xa2\x9f\x01\x40\x19\xcd\xd7\xe2\xa0\x21\x9e\x97\x16\x0c\x0d\xb5\x89\x88\x68\xe8\x8d\x16\x16\x0d\x55\x56\x50\xec\xef\x03\xa4\x21\x97\x88\x92\x86\xd6\xcd\x0d\x95\x86\xcc\xff\x51\xbc\x34\xb4\x29\x19\x34\x6d\xf1\x68\x9b\x23\xa7\xfd\xf3\xc0\x69\x18\x73\x2d\x7a\x1a\x06\xeb\x6f\x42\xa8\xa1\xb1\xc7\x68\xc9\x31\x3a\x25\x22\xaa\xa1\x8e\x7f\x1c\x56\x0d\x55\x8a\xd8\x6a\xa8\x2d\x19\x60\xed\xcb\x87\x08\x6b\x00\x38\x37\xcc\x1a\x0a\xcf\x8d\xb5\xc6\xf9\xd0\xd4\x33\x00\x38\x43\xdb\xe6\xc6\x5f\x03\x94\xff\x28\x08\x1b\x96\xe1\xdf\x44\x62\x03\x64\x2d\x1c\x1b\x86\x23\x8a\xc9\xb6\x78\xb9\x2d\x03\xb3\xa1\x2b\xc9\xe8\x6c\x8b\x97\x87\xff\x63\x21\xda\xf0\x4d\x8b\xd3\x86\x5c\xd7\x68\xbf\x16\xb1\x0d\x0d\xe0\xb0\x6d\xb7\xe8\x8e\x88\xdd\x86\x6a\x12\xb1\xdb\xcc\xb7\xc3\xba\x79\xbc\x7b\x79\x71\x4a\xc8\x97\xeb\xa8\x66\xd6\x73\x40\x7c\xfc\x90\x57\x0f\xab\xea\x61\x4d\x3d\x7c\x57\x0f\xeb\xea\x61\x43\x3d\x6c\xaa\x87\x1f\x98\x7c\x7e\xfa\x43\x26\xe5\x15\xe8\xbc\x02\x9d\x57\xa0\xf3\x0a\x74\x5e\x81\xce\x2b\xd0\x79\x05\x3a\xaf\x40\x33\xd6\xe7\x07\x05\x79\x55\x41\x5e\x55\x90\x57\x15\xe4\x55\x05\x79\x55\x41\x5e\x55\x90\x57\x15\xe4\x55\x05\x79\x55\x41\x5e\x55\x90\xd7\x14\xe4\x35\x05\x79\x4d\x41\x5e\x53\x90\xd7\x14\xe4\x35\x05\x79\x4d\x41\x5e\x53\x90\xd7\x14\xe4\x35\x05\xf9\xbb\x82\xfc\x5d\x41\xfe\xae\x20\x7f\x57\x90\xbf\x2b\xc8\xdf\x15\xe4\xef\x0a\xf2\x77\x05\xf9\xbb\x82\xfc\x5d\x41\x5e\x57\x90\xd7\x15\xe4\x75\x05\x79\x5d\x41\x5e\x57\x90\xd7\x15\xe4\x75\x05\x79\x5d\x41\x5e\x57\x90\xd7\x15\xe4\x0d\x05\x79\x43\x41\xde\x50\x00\x37\x14\xc0\x8d\x75\x35\xf1\x1b\x0a\xe2\x86\x82\xb8\xa1\x00\x6d\x2a\x40\x9b\x0a\xd0\xa6\x02\xb4\xa9\x00\x6d\xaa\x96\x6d\x2a\x38\x9b\x0a\xce\x0f\x55\xea\x87\xea\xd8\x0f\x55\xfc\x87\x2a\xfe\x43\xb5\xfe\x0f\x95\xe7\x0f\x05\xe7\x0f\x05\xe7\x0f\x99\x67\x43\xad\xfa\x0d\xb5\xd8\x37\xd4\x62\xdf\x50\x8b\x7d\x43\x2d\xf6\x0d\xb5\xd8\x37\xd4\xca\xde\x50\x2b\x7b\x43\xad\xec\x0d\xb5\xb2\x37\xd4\xca\xde\x50\xeb\x78\x43\xad\xe3\x0d\xb5\x8e\x37\xd4\x3a\xde\x50\xab\x76\x43\xad\xda\x0d\xb5\x6a\x37\xd4\xaa\xdd\x50\xab\x76\x43\xad\xda\x0d\xb5\x6a\x37\xd4\x62\xdd\x50\x8b\x75\x43\x2d\xd6\x0d\xb5\x58\x37\xd4\x62\xdd\x50\x8b\x75\x43\x2d\xd6\x0d\xb5\x58\x37\xd6\x22\x80\xaa\x61\x6a\xb1\x6e\xa8\xc5\xba\xa1\x16\xeb\x86\x5a\xac\x1b\x58\xac\x5f\xc4\x93\x02\xa4\xd6\xe6\x86\x5a\x9b\x1b\x6a\x6d\x6e\xa8\xb5\xb9\xa1\xd6\xe6\x86\x5a\x80\x1b\x6a\x01\x6e\xa8\x05\xb8\xa1\x16\xe0\x86\x5a\x77\x1b\x1b\xaa\x94\x5a\x52\x1b\x6a\x49\x6d\xa8\x25\xb5\xa1\x96\xd4\x86\x5a\x49\x1b\x6a\x25\x6d\x6c\x2a\xc8\x9b\xaa\xb8\x5a\x49\x1b\x3f\x54\x9e\x1f\xaa\x19\x7f\x28\x80\x6a\x25\x6d\xfc\xa1\x20\xab\x05\xb4\xa9\xd6\xcd\xa6\x5a\x25\x9b\x6a\x71\x6c\xaa\xc5\xb1\xa9\x16\xc7\xa6\x5a\x0a\x9b\x6a\x29\x6c\xaa\xa5\xb0\xa9\x56\xc0\xa6\x9a\xf8\x4d\x35\xf1\x9b\x6a\xe6\x36\xd5\x84\x6d\xaa\x09\xdb\x54\xd3\xb3\xa9\x26\x63\x53\x61\x8e\x4d\x85\x39\x36\x15\xe6\xd8\xfc\x1e\x95\x52\x2d\x54\x73\xb1\xa9\xe6\x62\x53\xe1\x89\x4d\x85\x27\x36\x15\x9e\xd8\x54\xd3\xb4\xa9\xa6\x69\x73\x5d\xa1\xfa\x4d\x35\x4f\x9b\x0a\x51\x6c\xaa\x79\xda\x54\xf8\x61\x73\x43\x01\x52\xe8\x61\x53\xa1\x87\x4d\x35\x85\x9b\x6a\x0a\x37\xd5\x14\x6e\xfe\x50\x90\xff\x50\x79\xd4\xd0\xff\x50\x7b\xf7\x87\x3a\xb1\x7e\xa8\xc9\xf8\xa1\x36\xf1\x0f\xb5\x89\x7f\xa8\xf3\xe9\x87\x9a\x95\x1f\x6a\x56\x7e\xa8\x9d\xfa\x43\x6d\xc7\x1f\xea\x58\xf9\xa1\x8e\x95\x1f\x6a\x32\x7e\xa8\x3d\xf7\x43\x6d\x91\x1f\x6a\x80\x7e\xa8\x2e\xff\x50\x1d\xfc\xb1\xa1\x32\x2b\xbc\x55\x3a\x94\xbf\x47\xf2\xf7\x42\xfe\xde\x8b\x5f\x26\xdb\xf1\x7b\x2a\x7f\x2f\xc5\xef\xce\xb6\xfc\xdd\x15\xbf\x7b\xb2\x7c\x59\xe6\xaf\xec\x8b\xdf\x7d\xf9\xce\x44\x2c\x7e\x65\x3e\x26\x60\xe9\xf7\xb0\x2a\x7f\xef\xc4\xef\x91\xcc\x7f\xac\x7e\x65\xb9\x63\x59\xcf\xb1\x84\x7b\x2c\xcb\x1f\xcb\x76\x81\x4e\xe4\x99\x3f\x96\x0d\x3c\x91\x0d\x3c\x91\x00\x4e\x24\x80\x93\x8a\xfc\x3d\x90\xbf\xc7\xf2\xf7\x5a\xfe\xca\x86\x9c\xca\x7c\xa7\x72\x80\x4e\xe5\xc0\x9c\xc9\x86\x5d\xc8\x86\x54\x65\x3d\x55\x59\xcf\xa5\x6c\xd8\xe5\xad\xf8\xbd\x92\xed\xb9\x96\xe5\xae\xe5\xfb\x8d\x7c\xbf\x91\x70\x6e\x64\xfd\x37\x77\x8b\x75\xf3\xec\xe2\xf4\x7a\xff\x64\x9b\x59\xd1\xff\x07\xa3\x52\xcf\x63\xe5\xfe\x67\x42\x53\xff\xc7\x51\xa9\xff\x8a\x61\xfb\xf2\x8f\x62\x53\xcf\x30\x66\xff\x27\x07\xa8\xfe\xef\xf3\x5a\xff\xad\x20\xd5\xff\xcb\xe2\x53\x7f\x12\x9a\xfa\xcb\xdf\x71\x44\xff\x41\x80\xea\x04\xe3\x23\xf9\x91\xff\x2f\x61\xca\xff\xed\x88\xf2\x8b\xc4\x94\xe6\xdf\xc4\x0b\x67\x76\x33\x19\x25\xdc\xbc\xd8\x2d\xef\x9f\x9e\xe8\x42\x3e\x21\xde\xc3\x5f\x29\x7e\x03\x69\x08\x8e\xb4\x7a\xb5\xf5\x31\xf7\xff\xb1\x22\x41\x6a\xf1\xd4\xdc\x3f\x99\x2f\xc8\x8c\xfb\xf8\xb1\xfe\x79\x35\x00\x36\x9f\x37\xe2\xfc\xc0\x5c\x30\x4e\xe7\xd5\xc8\x08\x85\x51\x01\xef\x73\xde\xc4\x2c\x5a\xc0\x44\x60\xe0\xe2\xf3\x8b\x80\x2c\x6c\xed\x2c\x6c\x5d\x2e\x6c\x9f\x2c\xec\x9f\x2c\x1c\x1f\x2f\x9c\x9c\x2d\x9c\x1d\x2e\x5c\x5c\x2d\x5c\x1e\x2c\x50\x81\xec\xb0\xdf\x69\x8d\x52\x8b\xff\x37\x75\x6f\xde\x95\x48\xd3\x2c\x0e\xfe\xdf\x9f\xc2\xee\xdb\xd7\x53\x25\x49\x09\xda\xf6\x02\x56\x7b\x44\x40\xc1\x5d\xc1\xa5\x19\xe6\x3d\x59\xab\x08\x02\xb2\x29\x28\xdf\x7d\x22\x22\x33\xab\xb2\x00\xfb\xb9\xf7\xfd\xdd\xb9\x73\xe6\x59\xa4\x2a\xb7\xca\x25\x32\x32\x22\x32\x96\xb5\x2f\xe6\x3f\xaf\xcd\xa7\x0f\x97\xe5\xdf\x18\x20\x4e\x98\x10\x02\xf3\x1a\x5e\xf7\x3a\xf4\xd7\xad\x89\xfb\xa3\xab\x23\x6e\x9f\x5d\x19\xa3\x21\x73\x02\x93\x79\x35\x1b\x12\x34\x6f\xf3\xb1\x4a\x1a\x64\xf1\x3d\x9e\x7a\x1c\xe4\xb0\x04\x35\x92\xf7\x6b\x4a\x25\x73\x78\x6d\xbc\x5c\x1b\x5e\x2d\x75\x3e\xe1\xec\xeb\x78\xc1\x5f\x71\x00\x75\xf3\x0e\x3a\x29\xd5\xa4\xe2\x2e\xde\xb6\xe6\x0c\xc8\xbb\x3c\x82\x6f\x18\x09\xcb\xfa\xda\x92\x10\xdf\x89\x0d\xd8\x0f\x78\xa7\x83\x21\xbd\x28\x88\x18\x64\xae\xf5\x06\x6b\xe3\xae\xe7\x07\xad\xae\xef\x7d\x51\xce\x87\xea\xe2\xa2\x1c\xb5\xc6\x5a\x86\x53\x23\xbd\x77\xa9\x58\x77\x67\x38\xa4\x49\xc5\x44\x72\xfe\xf9\xc5\xf0\x98\xba\x22\x15\x15\xb8\xa8\x40\x3f\x14\x6f\x47\x5e\xd2\x50\x82\x2d\x4c\x83\x60\xb8\x27\x57\x46\xe5\x85\xae\xb2\xe5\x0c\xb0\xfb\x31\x4f\x89\x08\x23\x35\x9f\x15\x7c\x73\x95\x3a\xed\x9b\x50\x61\x40\xab\x2a\xb2\xbf\xbc\x39\xc2\xfb\x35\xea\x8c\xed\xe4\xff\x88\x8f\x27\xc3\x70\xa0\x8b\x30\x33\xef\xf9\x1d\x7f\x24\x3b\x91\x98\xcc\xd5\x75\xc4\x65\xcf\x42\x35\x4d\x73\xb9\xae\x6b\x2e\x9f\xe7\x79\xa3\x3a\x6b\x7e\xb6\x9f\x0e\x84\x63\x07\x7c\x4b\x7d\x3d\x88\xee\x47\x9c\x14\xc6\xdc\x81\x94\xd4\x2d\x69\x2f\xbf\x76\xf5\x15\xbb\xd5\xfd\x6d\xb8\x35\x74\x04\x0d\x30\xe2\xf6\xba\xa3\x16\x05\x9c\xc8\xb5\xfb\x9c\x0d\xc7\x8e\x96\xd2\x87\x14\xb7\x37\x96\x7a\x8d\x07\x07\x18\xb2\x6b\xd2\xea\xba\xf0\xe2\x42\xd6\x93\x3f\x1a\xf4\x86\xb9\x9b\x1e\x7a\x58\x52\x77\x34\xb5\x06\x6f\xce\xc9\xa0\x89\xe0\x26\x06\xd5\xbb\x84\x16\x36\xf6\x9d\x42\xac\x1e\x4c\xf2\xdc\x8e\xfa\x4b\x8e\x68\xec\xa0\x06\xeb\x47\x56\x5b\x14\xf2\x47\x5d\x0e\x89\xf0\x41\x08\xec\xb1\x3b\x18\x52\x32\x92\x50\x1e\x7b\x2b\xd0\x87\xea\xd7\xf6\xb8\xe1\xd7\xcc\x5c\xb4\x05\xce\x60\x0b\xfc\x49\x6c\x01\x80\x63\x68\xc4\xa1\x50\xa5\xec\x0f\x79\x7d\xc3\xf5\xd4\x17\x30\x5a\x2c\x6d\x4a\x6f\x16\x4d\xd5\xc8\x0c\x2f\xf0\x39\x74\xce\x1f\xb2\xaf\x47\xe4\x83\x05\x36\xf3\x5f\x42\x32\x49\x0b\xbc\x00\x9d\x52\x4e\x5b\x46\xc8\x6e\xfa\xdc\xdc\x43\x37\x83\x76\x90\x13\x91\x98\x00\x20\xe0\x0b\xa2\xba\xa7\xaa\x07\x36\x06\xba\x62\xa8\x08\x09\x35\x52\x58\x1f\xa0\xcb\xf2\xbb\xb6\xb3\xe7\x58\xf7\x07\xb9\x06\x19\xec\xa0\x55\xe2\xbf\xfe\x55\xac\x5c\x5f\xd4\x6b\xa5\xe2\xbf\xfe\xb5\x0f\x63\x40\xe7\x23\x36\x39\xc3\xf4\xa4\x42\xa4\xd4\xf3\x3b\xcf\x79\xa8\xab\xc4\x2b\x7c\x21\x44\x2e\x7b\x6d\xa1\x11\xc7\x6b\x2f\x08\x86\xfe\x88\x4d\xe9\x6d\x2a\xdf\x86\x2e\xef\xf8\x39\x8e\xaa\x51\x9a\x1a\xff\xd7\x23\x2d\x9a\x21\xaa\x43\xa1\x2e\xb8\x34\x6e\xe5\x56\xbf\xd7\x99\x86\xbd\x2e\x20\xb5\x0a\x27\x05\xc2\x86\x5e\xd7\xa9\xe8\x91\x10\x3b\x18\xea\x70\x0f\xcd\x44\xc3\x1a\x7a\xb5\x39\xad\x62\xe9\x9c\x4a\xb0\x86\x0f\x3e\x5e\xac\x0b\x73\x51\x6e\x3d\xf4\x3a\x30\xf7\x61\x4d\x8f\x3b\x41\x15\x75\xaf\x13\x2b\x0c\x25\x1b\x18\xa8\x94\x82\xac\xa2\x67\x2d\x54\xde\x68\x26\x16\x9b\xeb\x9d\x22\x83\x63\xac\x60\x3d\xb4\xa2\x3a\xf8\x8c\xd5\xc8\xf8\x98\x32\x3b\xbd\x38\xb3\xd3\x13\x6d\x6a\x3e\x04\x13\x53\x74\x30\x81\x29\x12\x97\xe3\xec\xb5\x4b\xcf\x2a\xa4\xa2\x8a\xa7\x28\x76\xcd\xf0\x99\x8b\x91\x6a\x2b\x04\x23\x86\xfe\x25\xb4\x26\xdd\xca\x92\x39\x62\xad\x6b\xb8\xec\xa8\x42\xbb\xcc\xff\x6c\x0f\x43\xd3\x33\x1e\x6a\x86\x8f\xb6\xb0\x91\xf6\x8a\x63\x55\xff\x7c\xb6\xf7\x87\x22\x6f\x76\x1c\x65\xea\xfe\x61\x7b\xd0\xd0\x49\x85\x1d\x1d\x72\xb4\x43\xac\x63\xbb\x4f\x43\x61\x86\x98\x88\xd9\x86\xa6\xa6\xc2\x7e\x0d\x83\xc4\x24\xc2\xb6\x61\x84\x18\x3d\x70\x1b\xe0\x10\xdc\xb7\x0b\x8a\x06\xa8\x3b\x94\x5b\x65\x0c\x9a\x4a\xc5\x4e\xb2\x35\xb7\xd5\x14\xf4\xcd\xa7\x88\x62\x41\x1c\xd0\x2b\x84\x34\x9c\x3b\x78\x8a\xb7\xeb\xd0\xfe\x9c\x61\xc2\x7a\xb1\x1d\x59\x2f\xaa\xcc\x89\xdd\x6e\x8c\x9b\x6c\x86\xbe\x93\x0a\xe8\xde\xfd\x99\xb3\x22\x94\x2d\xee\x16\x44\xd9\x22\xb6\xee\x55\xd0\xeb\x7b\xa1\x51\xc4\xa3\x6b\x86\x4a\x6a\xc2\xc8\x0e\x35\x24\x66\xe6\xdb\x10\x35\xcc\xa4\xd9\x1d\x3a\x6c\x45\x4b\x19\x5c\x67\x1f\x43\xa3\xc1\x1a\x63\x3f\xd5\xda\x52\xff\xe6\xa2\xf4\xda\x68\x8e\xea\x58\x74\xb9\xad\xcc\x79\x3c\x74\x1a\xa5\x2d\x89\x38\x0b\xbd\x08\x2b\x69\x90\x0a\x65\x34\xa5\x83\xaf\xa8\xf6\x29\xd6\x8a\xd5\x4a\xa8\x2e\x5d\xc3\x14\x5c\x2e\x97\x7a\xc3\xb1\x2b\xae\xea\x87\x37\x57\xa8\xfc\x8e\x4c\x74\xdf\xdf\x5d\xed\xd4\x71\x2d\x51\x0c\xde\x98\xc8\x07\x5c\x95\x4b\x7a\x35\xf0\x2a\x49\xed\x7a\xf2\x58\xf7\xdb\x11\x36\xa4\xe8\x70\x16\x5e\x77\x1d\x61\x47\xba\xbe\x7e\xd3\x32\x1a\x68\xa0\xca\x32\x68\x4b\xae\x1d\x90\xae\xde\x40\x37\x4c\xb9\xa2\x89\xac\x68\x02\x13\x44\x23\xd9\x66\xc2\x31\x4c\x8b\xb6\xfa\xd5\x58\x5d\xc1\x47\x6a\x54\x5c\xea\x4c\xdd\x71\x3d\x1a\xe4\x54\xd8\x5c\x48\xad\xab\xf6\x44\xf9\xb7\xc8\xd8\xd2\x7d\xe3\xb9\x54\x01\xbb\x7b\x52\x11\x5a\x5a\x35\x76\x35\x46\x45\xd9\x56\x4d\xc6\x69\x7c\x5a\x61\x41\xde\xed\x19\xc5\x82\x99\x1f\x8e\xac\x27\x57\x3a\x2d\x54\x3d\x81\xa6\x78\xa4\x41\x70\x30\x35\x3f\xec\x0a\xc7\xd8\x1e\x40\xc6\x71\xbb\xdc\x33\x0e\x7a\xe4\xfc\x4b\x80\x7c\xe4\x0e\x92\x9d\x1e\xf2\xa6\xb2\x99\xac\x5f\x47\x0e\x3f\x54\xb7\xf7\xc7\xea\xe3\x68\x76\xe6\x21\x34\xf8\xec\x75\xc4\xd9\xed\x23\x9c\xf6\xa1\x29\x15\x20\xc9\xe1\x5e\x7f\x62\x5a\xa1\x87\x5a\xe9\x2c\xea\x42\xa4\x25\x13\x3b\x53\xee\x1a\x6f\xbd\x3e\x0e\x76\x08\xa0\x13\xa0\x8e\xfa\x28\x17\x0a\xfb\x53\xf9\x69\x8a\x0c\x20\x87\xba\xb8\xa1\xa5\x71\x62\x44\x2c\x3e\xf5\x51\x1d\xae\xa2\xd4\x80\x58\xc8\x7c\xd6\x66\x01\x8b\xa2\x67\xe4\x11\x91\x89\x74\x4f\xaa\xaf\xb5\xdb\xf6\x92\x07\xc9\xeb\x76\x34\xcb\x8d\x6b\x20\xee\x2e\xd0\x8f\x65\xed\x44\x39\xe3\x3f\xa7\xa3\x98\x54\xb4\xd1\x2b\xbc\xb4\x1b\x2f\x9f\x10\xa4\x32\xa9\xa1\xc7\x9f\x64\x99\xb3\x6b\x72\x82\xe4\xa0\x46\x4b\x40\xf9\x4e\xac\x8d\x82\x5a\x7f\x18\x09\x8f\xb4\xf9\xe8\xc1\x57\x0f\x17\x58\xcf\xa1\x20\x06\xe2\x31\x56\xf4\x69\xfc\x71\x9a\x14\xbb\xab\x57\xe4\x23\x5e\xbf\x3a\x31\x8e\x27\x42\xa7\x6b\x7f\xbc\x52\x69\xa9\xd5\x23\x60\x4a\x67\xb1\xb3\x8f\xd1\x4b\x3e\x9d\x25\xb7\x59\xf8\xe3\xed\xc1\xf9\xbe\xb3\xf3\x1d\x0a\x6c\x7f\xfb\x61\xe6\x28\x6b\xcf\x15\x16\x31\x90\xbe\xe1\x6d\x46\xe9\x68\x84\x25\x6d\x65\x20\x6d\xc3\xdd\x84\x7c\x33\xe1\xfa\x89\xfc\x52\x7a\x09\x3d\x32\xbf\xc2\x57\x7b\xd4\xae\xa0\x92\xf0\x48\xba\xb3\xe2\xb8\x5d\x6c\xdf\x0c\xa8\x34\x20\x4c\x0a\xb1\x42\x7a\xfa\x18\xc5\x52\x1c\x1e\x5a\x90\xbb\x3b\x6e\xe2\x9f\x46\x61\x1f\x2d\xc4\xce\xd1\xe5\xc9\xdd\x93\x2c\x26\xb4\xb6\xa9\xf9\xf3\x32\xc5\x87\x11\xbe\x5d\x60\xbe\x38\x02\x71\x54\x9e\x75\xd0\x0b\xf8\x1d\x7c\xfb\xd9\xb8\x33\x96\xc0\x41\x6e\x75\xeb\x11\x7d\x23\x77\xa2\xd7\xce\x3e\xbc\x72\xb5\xc6\x1d\x86\x9c\x81\xae\x49\xcc\x9f\xd6\xd7\xd5\xce\xe4\x4f\x91\xf3\xa6\xf3\x78\xbf\x62\xaa\xc2\x27\xd8\xcc\x1f\x11\xe5\x82\x1c\x39\x91\x1b\x27\x0a\x8b\xaa\x1c\x4e\x14\x7b\x52\xcb\x47\x25\x5c\x3a\x32\xc1\xcc\x07\x0a\xe8\xe1\x18\x4a\xce\x98\x0c\x4a\x01\x93\xa2\xa3\xf5\x60\x71\x31\x84\x1d\x04\x61\x78\x38\xd6\xc7\x1c\x63\x4d\xd3\xf1\x2e\x4c\xfa\x5d\x1b\x23\xe7\x91\x3b\x7d\xfb\x35\x24\x9b\xeb\xc4\x76\x14\x6c\xe3\x99\x52\x81\x05\xe0\x57\xad\xb7\x45\x0f\x86\x76\x62\x62\xcf\x94\xb6\xeb\xc1\x34\xea\x41\x5f\x18\xc6\x01\x19\x3f\xc5\xc8\x87\x6e\x9e\x74\x43\xf1\x4d\x06\xdd\x65\xc8\x28\x06\x8c\x2f\x62\x02\x75\xac\xa9\x6f\x5b\x4f\xdb\x48\x95\x99\xac\xab\x54\x57\xa1\x0d\x4c\x83\x6e\x60\xc4\x1d\x85\x95\x3b\x52\xc1\xbb\x3d\xb1\x4e\x3d\x42\x1e\xd8\x01\x98\xcd\x2e\x6a\x75\xea\x1f\xc6\x6a\xcb\x8a\xc8\x89\xb5\xde\x93\xbf\x52\x27\x59\x6f\xb9\xd4\xe7\xab\xb4\x92\x23\x28\x56\xb0\xa0\xab\x29\x43\x43\xa4\xa3\x9c\x5f\x68\x47\x79\x03\x41\xef\xe2\xb7\x08\x12\x4b\x8a\x7d\x00\x15\xc6\x09\x69\x1a\x12\x7e\x83\xd7\x05\x94\x50\x1d\x2b\xf3\x4e\x87\x70\xc6\xf0\x61\xa9\x0d\x3a\xb2\x56\x42\xa9\xae\xb0\x76\x17\x1d\x42\x92\xbe\xc8\x7b\x2d\xe3\x4b\xd8\xeb\x85\x1d\xdf\x9a\xb4\x86\x63\xde\x69\xcd\xc8\x78\xdb\x3a\xf4\x7b\x07\x0f\x1c\x83\xab\xc3\x89\x27\xac\xb0\x60\xa5\x9f\x0d\x3a\xf6\x18\xfd\x6d\x38\x14\xc4\xa3\x26\xe3\xd1\x57\x9e\x78\xe8\xd7\xaf\x2a\xe2\x64\x04\x34\x9d\x87\xf9\xd7\x8b\xc3\x3c\xd3\x9c\xea\x69\x0f\xfb\x51\x13\x6e\xc7\xe7\x03\xfa\xa6\x6c\xe1\x4f\xf0\xcf\xdd\xb3\x9e\x78\xbf\xf4\xda\x1a\x8e\x86\x5f\x56\xac\x34\x17\x31\xd2\x51\x47\x7d\xf1\xd0\x94\x9e\x95\xc9\xa9\x18\xee\x9a\x84\x81\x33\xd0\x50\x0e\x9d\x41\x6a\xe0\xff\xdc\x0f\xe0\x85\x4e\x79\x7f\x78\xdd\x1b\x0f\x5c\xff\x0b\x5b\xdc\x68\x42\x54\xa3\xad\x1a\x06\x3e\x59\x14\xb9\xac\xaf\x93\xd4\x25\xfe\x6c\xb4\xfb\x1f\x6b\xba\x7b\x7b\x5a\xc2\x56\x51\x19\x3f\x95\xd1\x65\xe8\x4b\x04\x79\xbe\xb2\x85\x9a\x0d\x35\x5a\x67\x36\xb5\xc3\x8a\xac\x30\x1a\x2a\xdb\xa8\xd7\x6b\xe5\xd8\xed\xac\xa7\x28\x9c\xc7\x1a\x3b\x2d\x71\x24\x71\x1e\x89\xc4\x81\x45\x5f\xa1\xce\x0f\x8d\xab\xe8\x77\x65\x5d\x21\x16\xda\x91\xdd\xb3\x9e\x27\xd0\x69\xa2\x50\x55\x96\xf0\x64\x1c\x87\xf8\x95\x3d\x43\x9a\x9a\x2b\xa6\x58\xe9\xcb\x0f\x1b\x2a\x97\x37\x9b\xb4\x7a\x77\x27\xc0\x5d\x5b\xee\x8d\x68\xcd\xcd\x22\x93\x2e\x1b\x46\x50\x94\x6e\xd0\x1e\x24\x62\x4d\xb8\x72\x7e\xa8\x24\x8c\xc0\xdb\xbe\x98\xb0\x3f\xc6\x1f\xf4\x31\x39\x1b\x26\xc5\x40\x8e\xf5\x30\x96\xd1\x81\xe6\xb7\x96\x7f\xbc\x1c\x88\x1b\x66\x93\xcf\xf3\xa5\x95\x86\x0e\x63\x3c\xac\xae\x87\x14\x2d\x2f\x4e\xb8\x1a\x12\x61\xb0\xd4\x5f\x61\xd2\x30\x3e\xf9\x30\x12\x30\x06\xe0\x21\x9e\x47\x77\x49\x86\x1e\x93\x5d\x64\xb6\x3c\xab\xf7\x2c\x1d\xde\xf8\xca\xe1\x8d\x9a\xec\x17\xa0\xf6\xd0\xb4\xca\xb3\x06\xcf\x12\x73\xb8\xd9\xc4\x58\x62\x9e\x3b\x41\xb3\x47\x45\x00\xd6\x38\x79\xe1\x72\x18\xad\x06\x7a\xe7\x42\x47\x3e\x4f\x46\x08\xd4\x9a\x91\xec\x72\xbb\x26\xb0\x54\x28\x11\x95\x3a\xe9\xb0\xf8\xc5\xd1\x87\xc5\x3b\x87\xcb\xc5\xcf\x3f\x2e\xfe\x94\x2c\xae\xd1\xfe\xed\x5a\x4c\x7f\xbb\xb6\x87\x21\x86\xf2\x14\x7d\xf8\x6b\x13\xdd\x3b\x8b\x5f\xab\xe5\x5d\x8f\x06\xf8\xfa\xd9\xee\x84\x64\xe2\x7a\x7f\x01\xdc\x06\xfa\x5e\x19\x12\xcd\x86\x4b\xfe\xe8\x7c\xe4\x01\xbe\xed\xe3\x34\xf6\x7a\x1f\x85\xbd\xa6\x8f\x10\xd9\xee\x89\x4f\xa1\x4f\x80\x10\x3d\x98\x63\x8e\xa2\xcf\x01\xb8\xdd\x26\x86\x7d\xa5\x98\xed\xb0\xfe\x45\x7f\x05\x13\xe1\xa0\x8f\x5b\x14\xf6\x49\x25\xfb\xfb\xc0\x88\x0c\x2b\x90\x22\xc4\x42\xb4\xaa\xf7\x41\x62\x55\x55\x6c\x80\xb2\xd5\x3b\xa3\x0f\x10\x95\x5f\xe1\x76\x63\x5a\x64\xf5\x0a\xab\x55\x98\x53\x64\xbc\xd8\xd4\x5c\x9d\x7f\xc4\x37\x5d\x47\x68\xa1\x53\x63\xe1\x25\x62\x85\xce\x47\x8c\x0f\xb0\xbc\x49\x7e\xc7\x8d\x90\x2e\x71\x32\xa2\xeb\xdd\x47\x31\x41\x4d\x65\xd6\x0d\xa4\xae\x62\x52\x5c\x74\x5e\xf0\x98\x78\xf7\x94\xd7\x74\x0a\x99\x10\xf5\x89\xd0\x81\x11\x07\xbb\x39\xae\xb2\x24\x9b\x75\xdd\x6b\x74\xe0\x38\x96\x84\xd7\x74\xc0\x24\x87\x81\x28\x94\x8b\x69\x9b\x0e\x56\xc6\xff\x55\xdf\xf0\x95\x65\x56\xf1\x99\xb2\x8f\x8e\x0d\xc0\x40\xd7\x3b\x86\x2c\x60\xae\x88\xd9\xe5\xda\x70\xbe\x38\x40\xe9\x37\x45\x90\xed\xea\xf5\xf9\x59\x23\xf4\x30\x20\x7c\xb6\xa9\x99\xa7\x53\x88\xa4\xaf\x28\xf6\x80\x31\x5a\x77\x0f\x14\xe2\xf0\xa8\xc4\xa3\xb6\xa5\x35\xab\x18\x7d\x70\x29\x23\x5a\xb3\xc8\xa8\x04\xc3\xa5\xa1\x09\x05\x66\x7f\xbd\x50\xa5\x09\xad\xac\xa6\x12\x3a\x35\xcb\x87\x24\x4d\x37\x1d\xc0\xae\x34\x5d\x01\x76\xe2\xa8\x7c\xac\x29\x9a\x23\x43\xc9\x79\x43\x22\xe6\x93\x00\xe3\x2d\x20\x1b\xee\x1f\x1b\x1a\x8b\x83\x9f\x3c\x09\x12\xd4\x8d\xce\x98\x03\x02\x96\x53\x7b\x2f\x6c\x31\x3b\xd2\xd0\xf6\x5e\x34\xfb\x28\x27\x7b\x72\x2d\x00\x0e\x18\xec\x0a\x17\x80\xf6\xd2\x4d\x36\x0a\xfd\xae\x2e\xa3\xe4\x7b\x75\x1c\xde\xfb\x80\x6e\xc9\x13\x3c\xed\x0d\x7f\xb9\x28\x7c\x8b\xba\xcb\xdd\x8f\xb6\xf9\x23\xe4\x2f\x9d\x7b\x71\x2c\x06\xe8\xfb\x1f\x69\x62\x65\x3d\x85\x09\xa9\x85\xb2\x8a\x1d\xf7\xb8\xd8\xf8\x72\xcc\x96\x13\xc0\xf6\xdf\x73\xad\x6b\x29\x89\x80\x24\x20\x9a\x20\x0d\x52\x72\x9c\x50\x82\x35\xe9\x71\x81\x16\xb0\x18\x46\xb5\x70\x90\xae\x00\xd0\x77\x23\x7e\xf8\xf2\xd1\x50\xd5\xf9\x08\xc3\x95\x2c\x9c\x5c\x8e\x16\x7a\x52\x7d\x1b\x08\x02\x71\x00\xea\x47\xe2\x13\x6d\x79\xd8\xcc\xf1\x96\x87\x5d\xfe\x54\x63\x9d\x9a\x99\x7f\x22\x02\xec\x79\x62\xaf\x1e\x3f\x2c\x0d\x74\xad\x54\x35\x62\x2f\x93\x8e\xb6\xd8\xdd\x5a\x44\xda\x0e\xb9\x8d\xfb\x46\xf4\xd9\x1b\x47\xec\xcf\x48\x72\x3f\x32\xc7\x8f\x72\xe6\x61\xcb\xe8\x42\x0f\xba\xd4\x03\x48\x5f\x38\x18\xf5\x55\x82\xd6\x31\x7a\xcb\xb9\x8b\x94\x80\xac\xe1\x8d\xf9\x2a\x83\x0b\xb2\x31\xef\x1b\x6f\xca\x32\x9d\x33\x72\x75\x51\xc3\x98\x5d\x95\x87\x84\x0c\xa9\x57\x53\xe8\xec\x92\x27\x91\xa1\x83\x8e\xbe\xf7\x5f\xe5\x66\x14\xae\x96\xcc\x79\x8f\xbe\xfb\xe4\x24\x4f\xd6\x48\x66\x89\x85\x31\xb8\x4f\xe4\xb1\x20\xf6\xbb\x28\xbc\x16\xec\xfa\xd2\x73\x81\x08\xc5\xee\x32\x2e\x1c\x18\xc8\x4f\xea\xbe\x33\xe2\x4e\xf6\x6b\x8b\xac\xb9\x98\x11\xb5\x09\x5e\x3d\x45\x05\x1e\x05\xca\x24\xbe\xf8\xa2\x88\xbd\x83\x2e\x57\x36\xf1\x57\x4f\x91\x75\xed\x55\x18\x45\x39\xde\xcf\x28\x0a\xb1\xd3\xd1\x88\x48\xef\xd0\x96\x65\xef\x9f\x38\xca\x55\xc5\xfd\xa2\x0a\xa1\x7c\xa6\xf8\x5d\x40\x4c\xc5\x69\x38\xe0\xfd\x07\xab\xdf\x72\xdb\x45\x3e\xf2\x6b\xf0\x7b\x38\xe0\x50\x81\x0f\x5a\xa3\xa9\x34\x0e\x92\xb2\xa6\xa3\x40\x99\xba\xab\xa9\x1e\xf5\xa2\x16\x60\x97\x60\x03\xe8\xe9\x7a\xa9\x96\xa3\x55\x40\xf9\xca\xa4\x11\x00\xb2\x35\x7f\xcb\x72\x8a\x9b\x84\xcc\x1e\x20\xdc\xb7\x49\x4e\x35\x20\x7c\xa9\x9d\xcf\xe5\x79\x7a\x15\x52\x01\x84\x12\x58\xfe\x73\xe4\xc5\x22\x5f\xc5\x9e\x74\xb0\xbc\xfc\x19\x19\xfc\xd1\x8b\x23\x0b\xf5\x1a\xea\xb7\xda\x4c\x67\xa3\x82\x79\xfe\x5b\xf6\x58\xbc\xab\x7e\xc1\xda\xa8\xfe\x3f\xc9\x98\xd1\x97\x9b\x2a\x2b\x1d\xb5\x2e\x5c\x20\x8f\x1f\xc8\xfb\xa3\x2d\x1c\x8d\x3a\x76\xfc\x25\xa0\xa4\x1d\x22\xa0\x65\x39\x3c\x79\x08\xec\x9e\x94\xd1\x2b\x14\x03\xcc\x32\xc1\x4b\x5c\x40\x6b\xfd\xda\x62\xd0\x0a\x84\x76\x65\xbb\x7a\xf5\xb4\x68\x48\x0b\x50\x4e\x02\xbb\x2f\xc3\x11\xb0\x3a\xf7\x91\x23\x72\xc0\x4d\xf0\x03\xbd\xf1\xd7\x5c\xde\xe9\xb4\xba\xe1\x9a\x37\xe0\x40\x58\x5b\x5f\xe4\xd9\xae\xcf\x06\x45\x35\x03\x92\x26\xba\x90\x50\x33\x9f\x11\x6e\xe6\x9e\x1c\x83\xee\x13\x1a\xd2\x6f\xbe\x1a\x4c\xa6\x99\x0e\x36\xb7\x58\xfc\x9a\x82\x57\xb3\x29\xbc\x1e\x26\x0b\xed\x4a\xe0\x4d\x4b\x78\x87\x79\x86\xed\xea\xb3\xfd\xaa\xc9\x8e\xb9\x41\x9f\x8a\x6b\xc0\xc7\x70\x31\xfd\xae\xec\xa7\x6c\x5c\x49\x59\x55\xf7\x3c\xbd\x7b\xc2\xe9\x80\xd6\x3b\x2f\xd9\x3b\x4f\xf4\x2e\x0f\x7f\x52\x5a\x11\xb5\xeb\x04\x18\x5c\xa6\x64\x3f\x55\xff\x86\x65\xea\x5f\x87\xe9\xad\xc2\xc7\x12\x7d\xf3\x80\x62\xba\x7a\x82\x42\xd8\x6b\x73\x8f\x2e\x56\x3c\x33\x17\x4a\x8f\x01\xe2\x96\x30\x8b\xb7\x84\xf1\x0d\x63\x37\x1a\x85\xdf\xcc\x7f\x92\x3e\x67\xba\x8d\xa7\xfd\x28\x20\x62\x35\xd7\x5d\x1c\x92\x1f\x4f\x92\xdf\x4c\x75\xc5\xc8\x13\x3e\x64\x5a\x25\x11\x13\x03\x61\x64\x55\xfd\xb4\xac\xa4\x4d\x4c\xdc\x12\x4e\x8f\xd6\xd6\xb0\xfc\xb7\x16\xb4\xfa\x8b\x8e\x6a\x22\x85\x83\x71\xb7\xdd\xed\xbd\x00\x09\x82\x8e\x08\xd0\x9d\xfc\x5a\x0b\x0e\x08\xc0\x37\x6b\xb4\xcb\xad\x2f\x66\x7e\xae\xf0\x71\xdf\xa6\x40\x91\x19\x58\xc8\x50\xb8\xa3\xe8\x28\x27\xa1\x30\xb7\x21\xb2\x4b\x5d\xd3\x7c\xeb\xc7\xb7\x39\x7d\x31\xd3\xbe\x9c\xe9\xae\x39\x0f\xe4\x16\xec\xd8\x6d\xbd\x89\x78\xae\xdb\xd0\x4c\x93\x5d\x62\x6c\xbe\x73\xb4\x22\x47\x6e\x40\xd6\x09\xf5\x6d\xeb\xed\x86\x84\xfa\xe1\xe3\x7d\x1d\xdc\x3e\x2b\x3c\xf7\x5b\x15\xf6\x70\xf3\xae\xaf\xf7\xf1\x20\x89\x0f\x97\xb6\xed\x28\x67\x5f\x04\x1f\xca\xdf\x57\xa7\x93\xca\xe2\x08\xfb\xb8\xd0\xef\xef\x9f\x5a\x25\x72\xa2\xe8\x70\x74\xa2\x98\x38\x8b\x86\x78\x65\x37\x86\xe9\x98\x40\x46\x15\xbd\x25\x4e\xf2\x63\xe8\xd1\x90\x7c\x69\x19\x7d\xbc\x05\xc3\xf3\x25\xbb\xc3\x3a\x18\x7c\xbf\x8b\x0a\x13\x29\x3b\xbb\x93\x6f\xdb\xc3\xbc\x2f\x07\x15\x88\x89\xf0\x77\x03\x82\x3c\xd7\x68\x23\x0c\x11\xad\xca\x25\x8b\x8e\xc7\x4c\x76\x0e\xf4\xc7\x19\x5f\x42\x3f\xea\x90\x36\x78\x84\xf2\x36\x24\x4e\x54\x1b\x05\xb9\x64\xaa\x86\x67\xcc\x7f\x85\x85\xf5\x81\x84\x82\x33\xea\xfd\x9d\xa8\xe1\xd8\x10\x18\x4e\xde\xcf\x78\xf4\x76\x6b\xd6\x8d\x63\x98\x8d\x33\xa7\x99\x5f\x08\xa8\xda\x1f\xf0\xdc\x22\x23\xcc\x55\x54\xc1\x36\xeb\xe4\x5d\x3c\x07\x7d\xba\x46\xdd\x8d\x4e\xa9\xda\x51\xe5\xaa\x76\xff\xaf\xeb\xd2\xc1\xf9\x59\xf1\xe4\x5e\x89\x06\x3b\xb6\x63\xbc\x3e\xa0\x3c\xd5\xc5\xc5\x3d\x88\xce\x98\x0e\x7b\x4b\x44\xe8\x13\x41\xfd\xaa\xc0\x97\x39\xb9\xf0\x20\xf6\xb4\x91\xdd\x16\x61\xfb\x44\x08\x3f\x38\x96\x44\x43\x88\x50\x53\xe7\xab\xfb\x70\x5a\x39\xab\xd7\x4a\x7a\x1f\x2e\x0b\x8c\x62\x7c\x34\x6e\x5c\x62\x4f\xbd\x3d\xa3\x8d\xf3\xd0\xb1\x0f\x02\x33\xd7\xc6\x3d\xe1\xe1\x1f\xec\x6d\xe7\x9f\x3a\xdb\xfe\x1f\xe9\xeb\x75\xe5\xee\x5f\x47\xe7\xf5\x2b\xbd\x9b\xe7\x21\x7a\x0f\x6d\x38\xd8\x49\x86\x47\x85\xec\xf0\xfa\xfa\x27\xa3\x93\xb2\xfb\x5d\x8e\x97\xcc\xd9\x2d\x18\x4a\xfb\xfd\x3d\x23\x7e\x3c\x8c\x38\x89\x7b\x85\x8b\xb3\x55\x06\x83\x6d\x03\x6e\x85\x3a\xf5\x36\x21\xed\xff\xb5\x61\x15\xf7\x2b\xfa\x88\x66\x81\x9c\xf8\x6e\x34\xf1\xd0\xa9\x5a\x9b\xb3\x36\x45\xe7\xf9\xff\x64\xea\x6f\x4b\xa5\xe3\xb8\x93\x6d\xdb\x8b\x7b\x50\x09\xfe\x77\xba\x50\xa8\xec\x9f\x9d\xd5\xf7\x4f\xe2\x99\x3a\x3e\x80\x29\x11\x73\x75\xe4\x89\xb9\x62\x9f\xfe\xb6\xb2\x37\xff\xcb\x2b\x7b\x50\x3a\xab\x95\xce\xce\x2a\x7a\xa7\x1d\xa3\x5a\xe0\xff\xaf\x6d\x6e\x71\xc0\x9d\xf5\x79\x5e\xc6\x1a\x2e\xbe\x46\x98\x69\x27\xa3\x6b\x7b\x3c\xd7\x04\xb7\xdd\x22\xae\xad\xfb\x01\x57\xab\x0a\x1c\x4d\x97\x0b\x60\x6c\x2d\x91\x5b\x71\xf8\x07\xd9\xea\x6b\x83\x5a\x02\xd5\x66\x7e\x3b\x7b\x7c\x53\x84\xff\x80\x63\x27\xed\x98\x39\xbe\x11\xbd\xea\xae\x38\x87\x35\xe1\x2f\x54\x78\xf8\xb3\xbe\x6d\x7f\xdb\xfa\xf5\xed\xdb\xcf\xec\xaf\xcc\xf6\xd6\x4e\xf6\x27\x54\xea\xf4\x42\x2d\xc8\xd5\x5a\xb6\x94\xfe\xf1\x5b\xfa\x03\x4c\xd3\xed\x25\xd7\xe3\x38\x8c\x74\xc5\x1e\x72\x09\xf8\x97\x36\x35\x1f\xa3\xc9\x6a\x53\xe7\xef\xf5\xe2\x81\x4f\x68\x9a\x6f\xed\x09\x49\xc0\x4e\x78\x42\x3e\x20\x88\x68\xc1\xb4\x29\x2e\xec\xba\xac\xb8\xb0\x87\x67\x5b\x7a\x3b\x00\xbe\x31\xf3\xdb\x15\x97\x4f\xe5\xaf\x86\x99\xdb\xda\x75\xf7\xdc\x74\x36\x97\xcd\x5f\xbd\x08\xd6\xb2\xa1\xc2\x3c\x0e\x5d\xdb\x93\x4d\x3d\xbb\x76\x1a\x9f\x25\x4b\x4a\x41\x44\x28\xa3\xca\x8d\x8b\xb2\x49\x82\x53\xa9\x3c\x00\x29\xaf\x05\xbe\x28\x9e\x8a\xf8\x74\x15\x67\xa5\x20\x04\x2d\x24\x7f\x6e\x1d\xac\xbc\x85\xf6\xaf\x13\x9e\xc8\xa0\xe1\x3f\x87\x66\xf4\x7c\x5f\x11\x4e\x00\x3f\xf3\x47\x60\xc0\x49\xa4\xfa\x5c\x89\xf5\x40\xcf\x7a\xdd\x34\xf0\x04\x3e\x2a\xdb\xa0\x92\xd8\x1a\x1c\xb3\x0f\x6b\x21\xef\x0f\x49\x33\xb4\x37\x5a\x1b\x8e\xfb\xfd\xde\x60\xe4\x7b\x48\xa2\xc5\xa2\xed\x8f\xb4\xe5\xf2\xa3\x5c\x14\x2c\xd8\xc7\xf8\xc0\xd4\x91\x7e\xc6\x08\xad\xcb\xb6\xf4\x12\xd9\x16\x89\x07\x55\xf4\x89\xe9\x21\x3b\x11\xbf\x1f\x05\xa6\x88\xac\x4c\xba\x41\xed\x54\xb0\x1b\x9a\xed\x14\x30\xc2\x42\xbf\x49\xf0\xb9\x4a\x05\x27\xb0\xdf\xc2\x2e\xcf\x65\x18\xf1\x3c\x80\x43\x80\x14\x47\xe7\xcb\xc1\xfa\xba\xd2\xcb\x53\xd3\x88\xd1\x94\x5c\x06\xbb\x22\xcb\x08\x22\x4d\xba\x47\xbf\x85\x29\x5a\x25\x89\xf8\x2a\x3d\xf3\x5e\x97\xa5\x57\x97\xf2\xd7\xe5\xfd\x96\x4e\x84\xba\x7b\xd4\x95\xb9\x3c\xba\x63\xed\xba\xc6\x8b\xd8\x86\x28\xba\x56\x6f\xae\x80\x03\x00\x1b\x80\x1b\x14\xd1\x01\xd4\x20\xd8\x50\x95\x21\x0a\x1e\x28\x29\xab\x17\x12\x39\x98\x8e\xa9\x7a\x85\x67\x4c\x1e\xba\xaa\x30\x26\x40\x7a\xc6\xa6\xd4\x3d\x51\x4f\x38\x18\xc5\x26\x73\x99\xdd\x38\x7d\xd3\xde\xa2\xf4\x0d\x7b\xcb\xcc\x51\xca\x86\x4c\x81\x1c\xea\xe3\xb8\x42\xc9\x94\x86\xe2\x45\x6e\x5d\x6e\x2d\xa6\x9c\x56\x28\xf4\x27\xec\x1d\x21\x1a\x81\x6f\x35\xdc\x59\x93\xf0\x23\x8a\xe9\xc7\x95\x45\xc1\xe0\xa0\x9f\x98\x72\xb5\xa1\xb8\xbe\x8b\x5f\x05\x16\xb2\x86\x1e\xfa\x6b\xa5\x6f\x44\xaa\x46\x43\x2d\xce\xda\x4b\x42\x91\x6a\x2a\xde\x62\x4d\x33\x37\xe1\xb5\x04\xa7\x6a\x5a\x10\xd1\xdd\xe2\xcb\x44\x54\x91\x52\x1a\x52\xf1\x72\x4e\x93\xf8\x53\xf9\x47\xe2\x08\xa5\xd2\x11\x31\x0c\xae\xeb\xda\x2b\x2e\x34\x95\xe4\x60\xe8\xea\x52\x89\x21\x79\x59\x53\x78\x42\x4c\x96\x7c\x53\xc2\xee\x7e\x7f\x15\x30\x52\xa1\x7a\x59\x0a\xc9\x0b\x56\xab\x3b\xf1\x07\x43\xdf\x90\x95\x2a\x5f\x57\x4b\xdf\xf8\xae\xb3\x07\x18\x8b\x03\xe6\xcf\xe6\x32\xfa\x1d\x8c\xb8\x67\xa3\xe6\xfe\xf4\xf1\xfe\x55\xf8\xc1\x23\x0a\xbc\x53\x01\x56\xa8\x3b\x7e\x72\xfc\x41\x6e\x35\x6e\x82\x3a\x06\x6f\xf4\x30\xba\x33\x6b\x79\xc0\xc9\xb5\x82\x56\xa2\x70\xdc\x03\x8c\xe5\x35\x67\x5f\x52\x5f\x56\xf8\x95\xfe\xd3\xe6\x90\x95\x5e\x95\x55\xd9\xc7\x9c\x95\x59\x35\x1f\xb2\xec\x55\x39\x6e\x07\xdb\xdb\x58\x95\x75\x4f\x9f\x32\x56\x65\x9d\x61\x7b\xe6\xaa\x9c\x73\xcc\x61\xab\x72\xae\x31\xe7\xff\x5e\x95\xf3\x75\x00\x07\x7e\x9b\x44\xe2\xd6\xc1\x47\xe1\xd4\x56\x45\x00\x81\x59\x6f\x70\xab\xf2\x6c\x98\xcd\xc8\xe9\x8c\xf8\xa1\x4b\x88\x73\x7d\x6b\xcc\xe8\x80\xbb\x37\x66\x35\xf6\x5c\x33\xf3\x33\xe2\xb8\x2a\xcf\x2b\xe8\x09\x98\x2c\xcd\xc1\xa8\xac\xb6\x2f\xaa\xed\x7f\x5c\xed\x52\xaf\x56\xa8\xc5\xf7\xa9\x0f\x36\x87\x06\x0a\x35\x16\xb4\xcc\x7c\x81\x1a\x78\xec\xb5\xba\x2b\xe4\xcf\x8d\xa6\x92\xbd\xcf\x1e\x34\xc9\x3b\xa2\xc6\xcc\x2e\x20\x47\x87\x5c\x4f\x2b\x21\x0e\xc6\xc9\x5c\x6b\x75\x01\x89\x77\x5d\xbf\x17\xc0\x37\xd7\xd7\xb3\xbb\x2e\xd4\x05\x2c\x22\xef\xc9\x26\x27\x86\xf9\xdb\xa5\x1f\xf2\x82\x8c\xf7\xb4\xbe\x6c\x08\x09\xba\x83\x1a\x45\x3d\x01\xfc\x6b\x95\x49\x2a\xaf\x67\x16\x6b\x91\xb4\x3d\x96\x84\x8b\x01\x24\x09\x31\x40\x1c\x59\x5b\x0a\xd4\xe8\xeb\x09\xed\x91\x19\xca\x9e\xa4\x5b\xc1\xd5\x23\x74\xf0\x2e\x16\x4d\x1d\xa0\x5d\xbc\xdb\x88\x62\x80\x01\xb1\x91\x24\xf2\xd4\xfc\x96\x96\xe6\xb7\x54\x63\x05\x18\x4c\x89\xba\x37\x39\x59\x1d\xb3\x4f\xe4\x96\x9f\x96\xb5\xec\x3e\xec\x98\x74\x2c\x0b\x94\x25\x20\xd3\x0c\x5d\x57\x63\xb0\x5a\x83\xab\x59\x9a\xd5\x50\x8d\x8e\x1e\xcb\x35\x0c\x45\x29\x06\x91\x53\x65\xa3\x82\xfb\x35\x14\xa6\x06\x8f\xc2\x87\xf4\x93\x18\x68\x7c\xc5\x14\x8d\xad\x28\x41\xae\x28\x40\xae\xf8\x31\xc8\x9d\xeb\x20\x77\x48\x53\x12\x38\xda\x8d\xc7\xa1\x68\xe1\xf0\xe3\x16\x8e\x26\xfa\x97\x0f\xe4\x97\x0f\x44\xbd\x83\x8f\xeb\x9d\xe9\x5f\x3e\x92\xd5\x8e\x44\xb5\xa3\x8f\xab\x75\x02\xad\x5a\x65\x69\x0d\x2b\x62\x0d\x2b\x1f\xaf\x21\x20\xe4\xca\x8a\x35\xd4\x80\x84\x76\x3e\x05\xfe\xaa\xe9\xdb\xbf\x2a\xfb\x58\x15\x7d\xac\x7e\xdc\xc7\x0b\x7d\x68\xc7\xb2\xda\xb1\xa8\x76\xfc\x71\x35\xef\x49\x9f\xc9\x27\xed\xb0\x80\xc1\xa1\xe9\xc8\xbd\x01\x89\x34\xbe\xa8\x54\xb9\xb6\x5c\xa8\x5c\x63\x50\xce\xcc\x97\x57\xec\x33\x4d\x03\x90\x36\x15\x41\x9a\x50\x54\x44\xf0\x14\x7a\xe5\x3a\x4a\x28\xd7\xe2\xd8\xa4\x62\x1b\x2e\x96\x38\x89\x4a\xe0\x9c\x9d\xd4\x8c\x34\xa9\xae\xd3\x0d\x81\x24\x76\xeb\x52\x06\x39\x9a\xf6\xfd\x35\xa8\xd2\xf5\x43\x3e\x6a\x4d\x7c\x12\x3e\x6a\x95\x69\x34\x73\xd9\xf1\x95\xeb\x03\xb0\x4f\x12\xf0\xe3\x9a\x14\xc3\x8a\x51\x88\xbd\x20\x2b\xae\xe2\xe0\x04\x1e\xc1\xc1\x26\xc6\xa6\xcd\xf7\x29\xcd\x64\xf8\xaa\x01\xff\xa9\x58\xb2\xd3\xbf\x20\x7a\xad\x81\x93\xe5\x06\x4e\x04\xc6\x3e\xf9\x70\x3c\x34\x96\x53\x71\x99\x4c\x27\x7b\x73\x2e\x4b\xaf\x1c\x44\xe6\xb7\x2a\x38\xcf\x87\x8e\x71\x52\x5b\x08\x18\xaf\x03\x31\x16\x52\x9f\x5e\xcd\xb5\xea\xa4\xc9\x99\xa4\xba\x62\xac\x29\x58\x30\x87\x47\x1e\x2a\x1d\x64\xc2\xef\x8d\x33\xb1\xc3\xce\x3e\xde\x61\x5b\x73\x99\x9b\x04\xbd\x33\xbc\x63\x7f\xee\x46\x77\xec\x12\x9f\x03\x13\x8c\x3c\x0d\x10\xc9\xab\xd0\x27\x92\xf4\x04\x99\xa4\xa2\xab\x50\xa4\x27\x51\x24\xc3\x6b\x9d\xbc\x87\xe3\xa3\x12\x40\x47\x7b\x04\x7b\xa8\x18\x41\xaa\x55\xea\xc8\xf3\x10\x53\x66\x3f\x93\x7a\xb0\x87\xa7\x15\x2a\xd5\x4b\x78\x75\x4d\xa5\x6c\x41\xba\xaf\xa8\xdd\xa6\x06\x0f\xe8\xf6\x3f\xb7\xe8\xd3\xf1\x97\xe3\xc8\x81\x72\x98\x1f\x22\x12\x6c\x61\x2f\x78\x24\x1d\x21\xa1\xf0\xd9\x5a\x1e\xa1\x1e\x8d\x0c\xc1\x78\x6e\x0a\x65\xcb\x08\x0b\x55\x11\x0b\x9d\xad\x00\x0a\x39\x7f\x1f\x9c\x3a\x8e\x9c\x36\x98\xa2\xe8\x90\xf8\xfc\xd9\x80\xf1\xe8\x48\xad\xab\x0c\x12\x04\x8d\xcb\xa3\x5b\xa3\x91\xcf\xa3\xdb\x52\x78\x74\x62\xca\xff\xbc\x16\x59\x37\x22\x53\x33\xc5\x33\x2a\xf6\xe2\x38\x45\x7a\x8a\xd2\xd2\x59\x8a\x64\xe1\xd9\x4e\xda\x45\xa4\xe1\xfd\xe6\xd8\x6a\xac\x6b\xed\x6d\x52\x82\xc9\xb2\xbb\x30\xad\xb1\x5b\xec\x85\x5b\x9a\xc0\xf6\x37\xbd\x0d\x03\x5a\x31\x53\x6e\x9e\x1a\x87\x05\xa5\x50\x89\xd0\x33\x60\x35\x85\xd6\x95\x4c\x76\x64\xb2\x83\xc9\x5d\x41\x11\x0e\x3f\x5c\xa0\xa9\x8e\x71\x7b\x3a\x23\xc9\xed\x7e\xf4\xfa\x36\xe0\xdd\xd0\xcf\x79\x8d\x87\x59\x93\x55\x5d\x9e\xf3\x2c\xf8\xcb\xda\xfb\xb9\xec\x3c\xa1\x1b\x89\x02\xba\xf7\x77\x8c\xd5\x67\x0d\xfb\xe6\x1e\x5d\x00\xbd\x79\x7c\xc4\xc9\x0f\x2a\x1b\xf6\x73\x98\xc1\xea\xc0\xaa\x0b\x03\x31\x78\x3f\xaa\x52\xa4\xaa\x63\xf1\x98\x6d\xce\x75\xd1\xd5\xc5\xf2\x89\x7c\x21\x70\xca\xc5\xdf\x71\xca\xa1\xc4\x29\x07\x02\xa7\xec\xf7\x8d\x8b\xbf\x21\x8b\x03\x42\x16\xd1\x67\x2f\xe5\x99\x75\x29\x10\xe0\xe5\xc7\x08\x10\x08\xef\xb8\xda\xd5\xd2\x71\x7c\x25\x90\xc5\xd5\xc7\xc8\x62\x7b\x2e\x73\xff\xf9\x38\xbe\x4c\x1c\xc7\xcf\xda\xf9\x38\xad\xa1\xda\xe2\x7e\x4a\x3a\x9c\x3f\x06\xd0\xc5\xb5\x92\x1e\xb2\x9f\x31\x4c\x21\x2c\x98\x74\x73\xbf\x25\x8e\xbf\xa3\x2d\x75\x5b\x4f\x50\x3f\x7f\x16\xb0\xc2\x3d\x6f\x81\xab\x23\x38\x97\x05\x75\x50\x4f\xab\xb4\x38\x0f\x2f\xb5\x5f\x81\xc4\x73\xa3\x2b\xec\xad\x14\xb0\xc2\x73\xf9\xe1\x94\x92\x77\x09\x58\x45\x57\xb9\xe8\x5b\x36\xa1\x5f\x31\x48\xea\x62\x42\xe7\x85\x1e\x01\x1a\x07\x1c\xf3\x38\x8a\xda\x31\x47\x06\x77\x7d\xfd\x04\x55\x34\xc5\x8b\x99\xcc\xe5\xaf\x5a\x2e\x7f\x35\x49\x6a\x21\x9e\xd3\x51\x95\xcd\x6c\x26\xf3\xfe\x2e\x34\x6a\xe3\x38\xe9\x27\x28\xb2\x7a\x7f\xa7\x08\xe9\x47\x5b\x9b\x46\xb4\xa3\x4d\x8d\x8e\x8f\x05\x97\x0b\x46\x4d\xf5\x16\x55\xd0\x25\x6c\x5e\x8c\xe4\x52\x42\xf8\xe9\x61\x00\x17\x60\x0e\x32\xba\x1d\xe1\xe8\xdf\x6f\x69\xc3\x43\xe7\xbc\x7a\x10\xfd\x71\x65\xc1\x02\xb5\x21\xac\x6a\xa7\x35\x19\x16\xc3\x15\xd1\x5c\x63\xc4\x13\x72\xc3\x4d\x65\x4d\xa9\x31\x6a\xbb\x74\x71\x89\x4a\xa2\x76\xb0\xeb\xee\x89\x61\x7a\xa9\x00\xf0\xb3\x78\x34\xf3\x8e\xb8\xfc\xd4\x69\x98\x97\x0b\x23\x11\x60\x49\x5f\xcf\x87\x12\x37\x44\xb7\xa2\x79\x84\x23\xa1\x8f\x8b\x34\xad\x99\xab\xce\x84\xd9\x05\xf9\xc0\x96\x50\x2e\x94\x6e\x63\x19\x4c\x85\x27\x5d\xe8\x4e\x6b\xf9\xa5\xbb\x39\x7d\x80\x2a\xfa\xa3\x1c\x19\xc0\x23\x0c\x6e\x43\x45\xf1\x0f\xa2\x4e\xf9\xba\x6d\xc5\x6b\xf2\x2b\xea\xa3\x30\x89\x02\x56\x63\xa1\x8f\x47\xb8\xcf\x03\xc8\xf9\x0c\x10\x84\xbf\x78\x65\xe1\x2d\x39\xb0\x15\xa7\x29\x1e\x3d\x9e\x50\x6a\xc4\x45\xce\x3f\x3d\x1a\xfe\x6a\xa9\x2c\x60\xf4\xdf\x8e\xf5\xba\x97\x45\x3b\xdb\x5d\x7c\x4a\xa3\x60\xc5\x94\xc1\x21\x39\x6c\xad\x4d\xd4\xef\xc5\x48\x0a\x00\xd8\xf9\xff\xfa\x7e\x09\xf1\x77\x17\xe3\x8a\x5a\xb0\x5b\xe0\x64\xf3\x18\x25\x25\x02\x78\xb2\x0e\xfc\xdf\xc5\x1b\xc1\x3e\xcc\x5e\x5f\xa8\x12\xf7\xd5\xf1\x34\xb4\xfd\x46\x1f\xc3\x11\x8d\xc5\xc3\x94\x4d\x6c\xd7\x18\x62\x64\x3e\xf8\xdc\x04\x26\x60\x9c\xa7\x86\x81\xe2\x69\xa7\x6c\x31\xd9\xe3\xf4\x84\x6d\x99\xf9\x4e\xfc\x1e\xc0\xfb\xdc\xb5\xbb\x30\xc8\x6c\xba\xbd\xd9\xf9\x70\x10\xcb\xdb\x3a\xc4\xdf\xdf\x7e\xc3\x57\x18\x28\x1e\x09\xe4\x2b\x03\x66\x3a\x86\x3c\x38\x0b\x81\x3a\x82\x83\xc8\xd5\x97\x78\xaa\x03\xa9\x80\x58\x86\xc1\x2c\x12\x71\x54\x1d\xa1\xa7\x92\xd9\xb5\xbd\xbc\x97\x4e\x2b\x3d\x15\xd4\xc6\x4a\x04\xee\xc7\xab\x49\xdf\x7c\x13\x86\x78\x40\x5e\xf9\x52\xae\xec\xa9\xe3\x9c\xd4\x19\x6a\x14\xae\x38\x8b\x32\x09\x43\x24\xc1\xe9\x01\x87\xba\xac\xe4\x99\xa8\x10\xea\x2b\x8a\xac\x01\x90\xd1\x24\x4f\xf0\xae\xdc\x71\x73\xa1\x3e\x0b\x1c\x60\x43\xb6\x77\xfb\x20\xa2\x3b\x95\x90\xa2\x6b\x22\xa3\xac\x20\x77\x21\xfc\x9b\xe8\x22\x9e\xc8\x30\xa2\xbd\xb7\xa3\x6a\xce\x61\x2b\x0f\x69\x97\x88\x4c\xe1\x68\x5d\xd7\x2e\x5b\xb6\x1e\xc6\xef\xe2\x81\xe4\x91\x0a\xe2\xd5\xa3\xc1\x97\x5d\x27\xc0\x0c\x52\xf0\x03\x80\x0e\xae\x0c\xab\x3c\x5a\x4b\x2f\xc6\xdc\x62\x6d\xe1\xdd\x27\x4d\x47\xd4\xc6\x8d\x49\x0c\x5c\x26\x5f\x6a\x2c\xcf\x50\x5c\x78\x52\x39\x2b\xed\x5f\xe5\x6e\x0e\xd9\xe5\x2b\xcf\x7d\xf1\x5f\xfb\x3d\xf4\x4e\xd0\xe2\x9d\x2f\xec\x62\x0a\x29\x68\x4b\xde\xed\x3d\x61\xc2\x9c\xed\x63\x15\x71\xe7\x90\x4b\xde\xcc\x08\x82\x47\xa7\x7f\xe2\x4d\x6d\xf3\x85\xb0\x72\x1f\x4f\x7b\x43\xad\x96\x5c\x44\x6e\xd5\x47\xd6\xf4\x58\xe4\x8b\x15\x6f\x9a\x4c\xcb\x6c\x8c\xa7\x40\x9e\xe0\x62\xe9\x40\xba\xb8\x0c\x42\xa6\x33\x9f\x33\x6d\x7c\x2b\x06\x10\xa3\x39\x8f\xab\x28\xb7\x71\x30\x95\x10\x66\x3f\xc0\x0b\x72\x17\x7e\xe4\xec\xb7\xd7\xd7\xdb\xbb\x3e\x49\xb5\xda\xe6\x1c\xd0\xe3\xae\x2f\x68\x36\x1f\xe0\x3c\x9e\x0f\x7d\x21\xe5\xea\x69\xc6\x9a\xfa\xe4\x44\x7b\xc0\xe0\x69\x3b\x0e\x65\xa8\x6e\xcb\xe6\x7f\x9f\x58\xb9\xdb\x54\x80\xde\xaf\x4d\x65\xb2\x10\x0a\x60\x0d\x88\x9e\xfe\xd4\x06\x9c\x01\x33\x61\xa8\x34\x0c\x12\x17\x7f\x18\x50\x8c\x6f\x32\x3a\x97\x1a\x21\x6b\x63\x1c\x47\x7b\x61\x59\x64\x75\x35\xff\x62\x45\xae\xe2\x15\xed\x96\x45\xd2\x3f\xac\x24\x6e\xc7\xa6\xf8\x51\xfe\xec\x7d\xa0\x19\xc4\xe7\x4a\xfa\x66\xf6\x69\x33\x07\x82\x7d\x5b\x00\x9d\xa0\x29\x79\xb9\x04\x08\x38\xfa\xfa\x07\x48\x12\x03\xf0\x5a\x31\x34\x23\x71\x4e\xdb\xa0\x80\x30\x7d\x76\x7e\x56\xca\x5d\xb2\x53\x80\xf8\x7e\x85\x9d\x8e\x79\xee\x34\x64\x97\xf0\xf3\xa7\xc2\x26\xb0\x31\x6e\x8b\xec\x0c\xde\x1e\x0f\xe7\xec\x40\x2b\x7f\x1f\xf0\xdc\xf5\x21\xeb\x43\xd6\xb0\xc8\xc2\x19\xcf\x1d\x54\xd9\x00\xde\x0a\x45\x36\x85\x6a\x6e\x49\x35\xf2\x02\x6f\x77\xc5\x39\x2b\x62\x6d\x59\xa2\x05\xe5\x1f\xf6\x39\x1b\x43\x5e\x71\xc0\xd9\xc5\x79\xe5\xac\x76\x9d\x9b\x54\x16\xda\x15\x1f\x9b\xb3\x12\xd6\x3d\x86\xc2\x0f\x55\xd6\x81\x9e\xfe\x01\xba\xe6\x10\x5e\xc3\xea\x9c\x95\x31\xef\x16\xaa\xf9\x25\xe6\x84\x3c\x77\xf9\xc0\xf6\x21\x2b\x28\xcd\xd9\x21\x66\x5d\x42\xf9\x69\x85\x0d\xe1\xe7\xe0\x88\x1d\x43\xc3\xe3\xf2\x9c\x1d\x69\x63\xb9\xaa\x1c\x1e\xd5\x72\xe7\x43\x76\x52\x2a\xd7\x72\xfc\x81\xd5\xce\x2f\x72\x5f\xab\xac\x70\x5e\xab\x9d\x9f\xe6\x2e\x8a\xec\x0e\x9a\x1f\x1e\xb2\x16\xb4\x71\x74\xc8\x06\xd0\xfc\x15\x8c\xa8\xa2\xb5\xf1\x41\x95\x39\xbb\xae\xd9\x6f\xe7\xf5\xdc\xd5\x03\x3b\xab\xe7\x6a\xe1\x9c\x55\xb1\xd6\x0d\x74\x03\xe3\xda\xc0\x4f\xab\xc4\xaa\x38\x5a\xe8\x54\xad\x16\xb5\x27\xbf\x58\x85\x2f\x3e\x56\xe6\xec\x18\x2b\x0d\xe1\xbb\xfb\x30\x5b\x13\x9c\xbd\x02\x9f\xb3\x13\x1a\x3a\x4e\xcb\x21\xeb\x41\xc9\xe2\x0b\x24\x9e\x6a\xbd\x7a\x80\xc4\xf2\xa1\x9a\x96\x0b\xf8\x4c\xaf\xc2\x3e\xcd\xa0\xfe\x0b\xd6\x3f\xc3\xa2\x57\xd3\xdc\x6b\x98\x2c\x32\x67\xe7\x98\x53\x2c\x95\xf7\xeb\x27\xb5\x9c\x53\x66\x67\xf0\x91\x16\xf4\xf0\x82\x30\x27\xbc\x7c\x2d\x31\x39\xe7\x75\xa8\x12\xc0\x3a\x5c\xd2\xb8\xb0\xdb\x61\x32\x2b\x5a\xc5\x7a\x3c\x3c\x09\x67\x27\xd0\xbf\xc2\x2b\x67\x65\x84\x03\x58\xb0\x2b\xc2\xb2\xf0\xd2\x85\x61\xb6\xe1\xf7\x69\x00\xdd\xbc\x81\x7a\x6d\x28\x79\x79\x28\xc1\x63\xce\x6e\x6b\x76\xe3\x4d\xe8\x3e\x7c\xf9\x8f\xed\xed\xef\xdf\xd1\xf5\x7a\x07\xa3\x16\xf9\x98\xf2\x6d\x67\xbf\x5c\xda\x02\xb4\x2d\xcb\xf8\x05\x2d\xb3\x5c\xde\xde\xce\x64\xe2\xcc\x30\x99\x79\x70\xa0\x67\xd6\xf6\xb5\xcc\xec\xb7\x83\xad\x6c\x31\xce\xfc\xf2\x1f\xbf\x7e\x65\x32\xbf\x7e\xe9\x9f\x2e\x96\x77\xb2\xe5\x44\x19\x2c\x71\xf0\x5d\x2f\x93\xdd\x39\x28\x94\xcb\x7a\x99\x62\xf1\xdb\x37\x74\xba\xab\x77\xe4\xd7\x8f\xe2\x96\x5e\xe6\xfb\xf7\xfd\x7d\x74\xc1\x19\x97\xf9\xf5\xa3\x5c\xd0\x3b\xfb\xe5\x3f\x0a\x3f\xb7\x4a\x5b\xa5\x44\x7f\x0a\xdf\xd1\x05\xec\x9c\x7d\x8a\xe7\x2b\xfb\x7d\xfb\xd7\x8e\x5e\x68\x27\xfb\xb3\x00\x5d\x8c\x1a\xe2\xfa\x94\x14\x8a\xdf\x0f\x0a\x89\x11\x6d\x6d\xed\xef\x27\x47\xbd\xbd\x53\xfc\x71\x90\xe8\xed\x3e\xfc\x83\x0e\xc4\xe2\x32\xa5\x5f\xa5\x5f\xd9\x72\x72\x44\xdb\xdb\xc9\x85\xfb\xf5\xf3\xc7\x8f\x62\xe2\x5b\xa5\xef\x3f\xb6\x93\xa3\x2e\x97\x7f\x96\xb7\x12\xa3\xfe\x59\xc8\xfc\xc8\x24\x66\xaf\xb8\x95\x29\x64\x0a\x89\x6f\xed\x64\x33\xdf\x13\x65\x0a\xdf\xb3\xc5\xc2\xbe\x5e\x66\x7b\xeb\xd7\x16\x3a\x15\xd5\x00\x29\x53\x28\xfe\x28\xe9\x65\x76\x76\x7e\x7c\xdb\x4f\xac\x26\x2c\xcb\x8f\x83\x6f\x89\x76\x0a\xdb\xa5\xfd\xc4\xb8\xbe\x17\x7f\x64\x0e\x12\xe3\x2a\xfc\xf8\xb1\xbd\x95\xf8\x56\x71\xff\x57\x76\xfb\xbb\x5e\x26\xfb\xbd\xf8\x7d\x2b\x31\xf6\xad\x62\x69\x3f\x59\xa6\x00\x95\xd0\x27\xb3\x36\xcf\x3f\xb3\xa5\xfd\x44\x99\xf2\xb7\xed\x9d\x5f\x00\x15\x9f\xb4\x49\xdc\xd9\xf9\xb9\x9f\x18\xd8\xaf\x83\x9d\x5f\xdb\x09\xa8\x38\xc8\xfc\x40\x77\x62\xfa\xa2\xfe\x3a\xf8\x96\x4d\x7c\x0c\x66\xa7\xb4\xb3\x9d\x00\x8e\xfd\x1f\x3f\x7e\x16\x13\xc0\x51\x82\x09\xfa\x9e\x5c\xf8\x9f\xc5\x6c\x72\xe1\x7f\x14\xb3\x5b\xbf\x12\x03\x2b\xed\x2f\x7c\xab\xf4\xeb\x60\x3f\xb9\xfd\x32\xd0\xe7\xe4\x24\x66\xbf\xfd\x42\xaf\xca\x5a\x99\x1f\xdf\xb6\xbf\x25\x01\xf1\x00\xd6\x10\xdb\x69\xb2\x6b\xc4\x37\x11\xa4\xd1\x3f\x09\x48\x2b\xe1\xbf\xd0\x58\x0d\x4d\xdc\x1a\x3b\x4d\xd6\xd8\x62\xfa\xdf\x6f\xec\x3b\xfb\xb9\xf0\xb4\x0d\xcf\x3b\xf0\xf6\x23\xf9\xb6\x98\xcb\x7e\xb2\x5f\xcd\x26\xab\x63\x0f\x28\x4c\x5a\xcd\x7f\x1d\x5d\x8f\xa6\x18\x2f\x4d\xf4\xa8\xbe\xcf\x5a\x23\xde\x69\xb9\xb9\xcf\x99\x39\x0b\x07\x2d\x0f\xe9\xcf\x61\xee\xcd\xe1\x43\x1f\x1f\x11\xd3\x02\xbf\xd5\x1b\x60\xd5\xf3\x3e\x77\x5b\xa3\x69\xce\xfa\x21\xd2\x0e\x65\xf9\x28\xfd\x1b\xfb\x04\xa4\x43\xad\xf5\x24\xea\x7e\xce\x32\xde\xe9\xf4\x5e\x4e\xb1\x30\x7c\x01\x6b\x5d\x8f\x06\xbd\x6e\x78\x02\xd9\xc5\x96\x10\xf4\xe7\xbe\x51\xc6\xad\xcf\xdb\x2b\x92\x45\xf9\x5a\x6f\x29\x7b\x07\x73\xcf\x7a\x23\xf7\x21\x4a\xca\x52\x8d\x53\xfe\x28\xba\xbb\x98\xae\x86\xa1\x35\x31\xee\xb6\x46\xb5\x87\x81\x3f\x7c\x40\x5d\xb7\xac\x25\x52\x60\xfc\x4f\xad\x4e\xa7\x35\xf4\xdd\x5e\xd7\x1b\x92\x0f\x1f\xf4\x14\xd2\xf8\xf2\x90\x7b\x7a\xca\x0d\x87\xd6\xf5\xf5\xf5\x1a\xff\xd2\x64\xad\x2e\xac\xe2\x04\xc8\xdd\x46\x16\xa6\x1c\xbe\xb3\x93\x81\xbf\x19\xb6\x95\xc1\xc7\x4c\x73\xce\x3e\x6c\x63\x75\xfd\xec\x0e\xdb\xc6\x6a\xd0\xdf\xf1\xc8\xd7\xaa\x5d\x84\xc9\xd2\x5b\x58\x5e\x16\x7e\xe8\x8d\x07\x89\x2f\x2c\xb5\xbd\x05\xe0\x90\xdd\x82\xa2\x1e\x9f\x6a\x25\x2b\x01\xdb\x5f\x6a\xf7\x07\x7e\xbe\xd7\x1d\x3d\xe8\x4d\x9e\x9e\x9e\xae\x4d\xc9\x6f\x21\xfc\xc2\xc3\xf1\x41\xb2\xda\xa7\x6d\xf6\x1d\xea\x4d\x81\x77\xd1\xaa\xdd\x3e\xac\xe8\x34\xce\xce\xc2\x3c\xb1\x6c\x69\x1b\x05\xab\x49\xb0\x82\x86\xfe\xba\x1a\xb7\xbe\xde\xfa\x3f\xcf\x7c\x10\xac\x9c\xf0\x55\xb3\x7d\x59\x58\x35\xdb\xff\xd5\xa9\x5e\x9a\xe7\xc5\x49\x5e\x35\xc5\xc7\x07\xca\xcd\x2c\xfe\xb3\xd0\xe8\xf6\xff\xf9\xdc\x02\x8d\x83\x78\xe0\x01\x80\xbf\x17\x0e\xf8\x53\xee\xed\x01\x8d\x92\xe2\xad\x7e\x40\x18\xe1\x52\xc7\x02\x02\x49\x5c\x42\x5d\x07\x78\xd2\xb7\x70\xd0\x1b\xf7\x6f\x29\x84\xe3\x61\x01\x5b\xfc\x74\x8b\x4d\x4e\xa8\x1d\xc0\x32\xec\x21\x7a\x42\x97\x3a\xa2\x79\xdc\xc3\xa8\x2d\x0a\xfb\x95\xbf\xd2\xd3\x36\xa0\x1a\x54\x22\x3d\xe3\x4f\x3e\x2a\x94\xae\x46\x4d\xaf\xbe\x54\x40\x85\xd2\xce\xd8\x71\x54\x90\xc7\x85\x42\xd0\x0b\x97\x77\xbd\x8e\x3f\x44\x9b\x09\x18\x54\x0f\x31\x4e\x65\x78\xd5\x1a\xb6\xba\x21\x5e\x89\x31\xde\xed\xf6\x44\x50\xff\x21\x49\xfb\xc7\x4f\x2b\x5a\x42\x32\x7f\x38\xf2\x9f\xc4\x2c\xb8\x85\xb9\x72\x2a\xb5\x5c\xb4\xbe\xbf\x50\x14\x16\x13\x71\x0e\x8e\x17\x87\x71\xa0\x50\x2b\x41\x73\x32\xf5\x7e\x9f\xa1\x77\x49\x9c\xc9\xae\x27\x92\x44\x88\xda\x99\xcf\x64\x04\xd9\xaf\xfb\xf2\x49\xcc\x34\x0c\xdf\x45\x1f\x0d\xfb\x03\x9f\xe3\x62\xad\xaa\x8c\x2b\x34\xea\xf5\x3a\xa3\x56\xff\xa3\x49\x4a\xae\xf2\xcd\x7e\xb4\xcc\x22\xe1\xb1\xc0\xfa\x2d\xff\x1a\x4e\x02\xbf\x40\x71\x6d\x45\xf2\xbe\x8f\xc9\x57\xfe\xb0\xe5\x8d\x45\x6e\x54\xfc\x93\x2a\xbf\xb4\x72\xfb\x3e\xcc\x39\xf4\x36\x3a\x16\xb6\x23\x40\x85\x05\x18\x52\x51\x60\xd0\x44\x61\xe4\xb6\xa0\x17\x62\xac\x59\x0a\xcc\xab\xd5\x03\xb0\x13\x39\xd6\xd6\x0e\x03\x24\x3d\x18\x15\xa2\x94\x2c\xc0\xc7\x6b\x9c\x8b\x7c\xa9\xaa\x99\x65\xfd\x5e\x4b\x6a\x29\x7f\x87\xce\x90\x78\x60\x78\xea\x77\xc7\xab\xa7\x87\x79\xad\x21\x07\x08\xf3\x96\xc6\xf2\xe5\x3f\xdc\x0c\xfe\xfb\x05\xa6\xb0\xe3\x87\xa8\x46\xf9\x06\x47\xdc\x89\x78\x84\x03\x6e\x25\x74\xf4\x79\x08\xc0\xb7\xa2\xb1\x4c\x26\x9b\x75\x5d\x38\xed\x87\xee\x00\x00\x75\x7f\x30\xe8\xbd\xc0\x9c\x60\x07\x27\x72\x6a\xa3\x42\x30\x69\x7a\xfa\x23\xc2\x19\x0f\xc3\x01\xdd\xcd\xf7\xba\x35\x3e\x08\xfd\x11\x9e\xcf\xd4\xb8\xd8\x6c\xaa\x8b\x2b\x61\x60\x79\x17\x03\x9a\xd8\xcc\x5a\xdf\xb3\x3f\x53\x45\x98\x04\x0d\x35\x74\xf8\x70\x54\x18\xbb\x6d\x7f\x74\xe1\x0f\x5c\x14\xe9\x40\x53\x19\x28\xe1\xf9\x22\xb9\x02\xf0\x3f\xc4\xf1\x7f\x72\xe8\x9d\xa6\x3a\x9d\x45\x90\x17\x05\xce\xc6\x4f\x40\xdf\xd0\xa6\x8f\x12\x50\x75\x2e\xa9\xfa\x7d\x97\xf0\x96\xa8\x04\xdd\xdb\x9a\x0c\xfd\x3e\x51\x22\x9b\x96\xaa\xd9\xe9\x64\xa9\x3f\x89\x52\xdb\x1b\x7c\x83\xa7\xb7\xf0\xef\x06\x17\xe2\xb8\xaf\x49\x71\x1c\x9f\x12\xeb\x5b\x21\xd6\x97\x05\xf0\x33\x3a\xd4\xba\xc5\xab\xd4\xdc\x82\x69\xcd\xcd\xa1\xd2\x5f\x9f\x3d\x4a\xeb\xaf\x28\x05\x06\x22\x92\x1e\x2b\x2a\xe9\x5e\x25\x8d\xa2\x52\xd0\xcd\xc8\x00\x2c\x6a\x4a\x77\x1e\x59\xd5\x82\xca\x5f\xa0\xec\xac\x5b\x94\x6a\x9b\x9f\x97\xe3\xcc\x79\xa2\x48\xf5\x19\xe6\x02\xdd\xdb\xa0\x33\x25\xce\x2a\xf0\x0a\xa3\x65\x14\x69\x5e\x0c\x24\x12\xdd\x8c\x07\x04\x3a\x39\x87\xcd\x76\x72\x9c\x9d\xdf\xe4\xbc\x84\xdb\x45\x31\x6c\xbc\x9d\xab\x7a\x4d\x25\x1d\xeb\xb5\x48\xe0\xc9\x1b\x27\x4e\xd3\xd8\xfc\xbf\xae\x53\x9b\xa1\xf9\xfe\xde\x68\x6a\x5e\xf3\xaa\x7c\xd1\xef\x87\x68\x0a\xbd\x7f\x3d\x1a\x00\xa8\x63\x34\x6c\x1b\xb2\x2c\x5e\x26\xb8\x52\xf8\xe7\x29\xf1\xd9\xd7\x96\xe1\x33\xaf\x11\x34\x4d\x74\x75\x88\xca\x00\xf8\x9c\x47\xe7\x17\x78\xb5\x38\xf4\xcd\x3c\x5a\xd3\xa1\x19\x79\xf4\x49\xbf\x9a\xb8\xf4\xf8\xf0\x73\xae\x1d\x54\x39\xe9\xd7\x7d\xdc\x56\x50\x4d\xde\x6a\x5d\xaf\xd6\x45\xfc\xfc\xb5\x25\xfc\xea\xe8\xd7\x81\x77\xf2\x26\xf6\xae\xc6\x86\x67\x66\x3e\x6c\xc1\x13\xba\x99\xb8\x93\x6e\x26\x1e\x57\xe8\x00\xbe\x7d\x71\x61\x7f\x0d\xbf\xe4\xbc\xa2\xb0\x10\xbb\xee\x40\xa6\xea\x1f\xec\x52\x9b\x5b\x2d\x6e\x98\xd6\xa3\x71\x81\x36\xc2\x8d\xbb\x99\x54\xd7\x81\xb2\xa8\xad\xce\xb8\xf5\x87\x54\xf9\xfe\x9c\xc6\xae\x95\x34\x05\xbe\x5b\xeb\xae\xbd\xe2\xb2\xf6\xbe\x48\x21\xfd\x1e\x56\xe9\x5f\xf2\x46\xcd\x6d\xda\xf6\x24\xc0\x22\xa7\x8b\x66\xeb\xd3\x53\xd4\x1f\x2c\x46\xdf\xb8\x43\x55\x91\x53\x1e\x1b\xdf\x93\xd3\x86\xd0\x59\x19\x06\xf7\x9c\x5c\x47\xb9\x2b\x34\x5c\xd6\xfc\x67\xd8\x9e\xde\x99\x01\xbf\x2b\x2a\xa2\x14\x72\x7c\x26\x34\x33\xee\x84\xc5\x5b\xc2\x07\xc0\xbd\x9c\xfb\xfb\x1a\xc3\x49\x87\xb9\xbf\x87\x9f\x7b\xe1\x8e\x69\xd5\xe7\x02\xf9\xb9\xe0\x1f\x3f\x77\xbf\xe2\x73\x7f\x92\x8a\xcf\x5f\x85\x0d\xbb\x7e\xa3\xf9\x35\xb2\xbd\x8f\x6f\x65\x48\xcb\x92\x8f\x7c\x83\x37\x7c\xb4\xa2\xc2\x1d\x40\x46\x9c\x8e\xb8\x10\x6b\xa0\xe5\x07\x23\x3b\x8e\x26\x3a\xc5\x69\xc3\xde\x68\xef\x06\xf9\x54\xaa\x6d\x4a\x8f\x72\xbc\xf1\x58\x4d\xf1\x7a\xa3\x0d\xbc\x5c\x17\xde\x6a\x65\xf9\x46\x8a\x2b\x18\xa0\x1a\x1a\x6b\x37\xd9\xd0\x0e\xab\x1c\x1e\xe8\x3a\xc7\xb6\xfb\xa6\x8f\x02\xdf\xcc\x67\xbc\xe7\x82\xbf\x2e\xeb\x50\x05\x8f\x35\x86\x4d\xe9\xb2\xce\xdf\x8b\xd3\x52\xfd\x0d\x23\x9b\x22\x43\x14\xa3\x9b\x1e\x9a\x9b\x7d\xd3\x6c\x9a\xb9\x44\x81\x30\xca\x52\x06\xad\xf3\x79\xa4\x6e\x13\xcd\xc3\x43\x72\x73\xa2\x32\x09\x6c\xcd\x90\x6e\x5d\xfc\x7c\xd2\x21\x30\x74\xcd\x16\x16\x11\xe8\x6f\x15\xfd\x02\x43\x96\x18\x80\xaf\x30\x9e\xd7\xc8\x34\x51\xae\x0f\x3f\x9b\xe8\x9e\xc4\xdc\x70\x48\x73\x45\xde\x2f\x66\xf2\x30\xb7\xe9\x6c\xf3\xb7\xdd\xaa\x8a\xa7\xbd\xc0\xb6\x7e\x90\x7a\x26\xbe\xd1\x0d\x96\x95\x35\xf3\xd4\xba\x6b\xe0\x52\xa0\xa5\xf4\x26\x7e\x16\xdb\xf2\x9b\xb1\xce\x90\x66\xb7\xa0\xb0\x21\x2d\x7c\x23\xc3\xc4\xbf\xd9\x66\xac\xd2\x69\x3b\x75\x3d\xcb\xf8\x91\x92\xb6\x72\xe9\xac\xf9\x9f\xc0\x9c\xa3\xa2\x7f\x8c\x5d\xeb\x49\x6f\x3b\xe4\xb0\x79\x79\x2b\x36\xc4\x6d\x84\x57\xc7\x5b\x68\xd4\xfa\x40\xe4\x1f\xa9\xeb\x73\xbb\x7e\x65\xa8\xfb\x0a\xc0\x6a\x0c\x9d\x4c\xa3\xf7\x95\x32\xd7\x92\x05\xf2\x77\x51\x1b\x30\xd2\x79\xb7\x3d\xba\x1f\xdc\xc3\x0a\x39\x5c\x21\xbf\x2e\x6f\x1a\x5c\xf2\xee\xc2\xce\x5b\xa8\xda\xaa\x1d\x46\x51\x7f\xf9\x32\x14\x8b\x03\x28\x2f\xfd\xdb\x8a\xfb\x7a\x47\x78\x97\xf5\x4c\x61\x2a\x8f\x17\x8f\xe6\x9b\x17\xf9\x91\x5d\x1b\xcd\xd1\x7c\x15\xbd\xc9\x46\x57\xce\x3c\xff\x0f\xd5\xa5\x97\xdc\xba\xb0\x0f\xa6\x9d\xe0\xa3\x81\x0d\xed\x02\x5f\xee\x00\x32\x39\x0a\xd4\xb3\x9f\x72\x37\xb0\x72\x33\xba\xf6\xe7\xba\x27\xc2\x7a\x7c\x23\x45\x08\xb5\x1d\xe0\x79\x47\xa3\x92\x6e\x22\x0a\x4a\x0d\xe4\x7e\xc8\x95\x23\x89\xbb\xed\x68\xe3\xb9\x4d\xfd\xb3\xc2\x58\x60\xc8\xa3\x5d\x0a\xd9\x52\xb7\xf9\x35\x9e\x36\xf5\x25\x73\x5e\xe4\x46\x50\x5f\xd0\xf4\xd1\x95\x3e\x5f\xff\x52\x59\x75\x25\xa5\x7c\xb0\xf0\xe8\xf3\xd4\x23\x59\x53\x78\xbb\x82\x72\x1a\xa4\x22\x22\xc3\xcf\x5a\xfb\xbd\x8f\x74\xad\x66\xaf\xbb\x72\xfc\x7b\xf2\x7d\xf1\x62\xb5\xad\x76\xc4\xfd\x07\xda\xfa\xb0\x6c\x9a\x3f\x75\x61\xc9\x91\x49\xa8\x44\x10\x58\xbf\x2d\x5d\xcf\xa5\xb3\x79\xcd\x4f\x32\xaa\x81\x20\x76\x54\x6a\x20\x08\x14\x4e\x0a\xd2\xbc\xe6\x46\x88\xa0\x10\x9f\x75\x9a\xbf\xcf\xfa\x0a\x6d\x12\x28\xad\x2e\xc5\xdd\xbc\x9b\x4e\x9b\x0e\xba\xc1\x27\x1c\xc7\x37\x43\x5c\x2c\x93\xf1\xb4\x8d\xa9\x1b\xf4\xba\x42\x7d\xe6\xa1\x2e\x06\xdd\xaa\x6b\x0e\x63\x68\x1c\x71\x99\xc7\xba\x36\x0b\xd4\x93\x86\xf7\x8c\x21\xdf\xa3\x12\x2d\xd9\xca\xb7\xdf\x38\xb4\x3d\xd2\x11\x7f\x7e\x84\xd9\xf9\x96\x26\xad\x25\x33\x47\xf8\x31\xf6\xb9\xba\x50\xbf\xa3\xe6\x5e\x74\x23\xf6\x66\x43\x20\x92\xfd\xf5\x83\x70\x93\x44\x44\x19\xd4\x7c\x79\xf1\x9a\x88\xea\xbe\x37\xe1\x0c\x30\x53\x58\x02\x53\xc7\x90\xca\x1b\x3b\x94\x08\xaf\x65\x51\xe8\x9b\x2c\x24\x7d\xf6\x1c\xa1\x94\x03\x92\xb7\x65\x31\xf2\x0f\x28\x64\x24\x90\xba\xa5\xa5\x5e\x0b\x21\x0b\x39\x1d\xd7\xcb\xc6\xf2\x1a\x42\xdb\x94\xb5\x3c\xb5\x4f\x0b\x94\xd7\x47\x56\x20\x7c\x03\x95\xb0\x3e\xd1\x3e\xa9\xdb\x5f\xf4\xe6\xd7\x64\x0f\xd6\x64\xff\xd6\xa8\xef\x34\x2b\x6b\xa7\x28\x62\x59\x2b\x03\xa4\xdd\xfb\x7c\x90\x08\x93\xd1\xae\xdb\x8d\x2f\xba\x58\xe9\x0b\xfb\x12\x3f\x49\x79\x10\x3c\x91\xbc\xe7\x0b\xf3\x47\x1c\x52\x49\x62\x03\x89\x24\x89\xf9\xd2\x64\x9d\x3a\x3a\x47\xf8\x63\xb4\xeb\x0b\x7a\x31\x9d\x3a\x46\x6b\x76\xa4\x06\xcc\x13\x7c\x0b\xa6\x07\xcf\x09\xf1\x37\xfe\xd5\x9f\x92\xcf\x8b\x6f\xf8\x0e\xf4\x42\x95\xdb\x71\x71\xfc\xdb\x64\x2d\x4c\x43\x41\xcf\x36\xfd\x97\xdd\x42\xb9\xe0\x77\xcc\x09\xe1\xc3\x59\x94\xff\xb0\xef\xa5\x6f\x6c\xfb\x7b\x69\x87\xfd\xfc\xfe\x0d\xfe\x6e\x7d\xdf\xfa\xf5\xe3\xdb\xf6\x4f\xac\x91\xdd\xd9\xf9\xfe\x6b\xeb\x7b\x69\x5b\x73\xa8\xd6\xad\xaf\x60\x7f\x0a\xa1\x70\x9b\x71\x10\x4a\xde\xe5\x8d\xb7\x73\xdd\x2a\x67\x85\x69\xae\x57\xe5\xd2\xca\xb7\xfa\xa0\xe5\xf6\x45\xee\x73\x94\x5b\x13\x4d\x94\xf4\x42\x03\x51\x68\x88\x85\x92\xcc\xd1\x42\xae\xc6\x28\x0d\xaa\x09\xbe\x91\x27\x36\xe3\x30\x91\xc9\xe3\x8c\x6e\x32\x43\x20\xfd\x38\xbb\x97\xc8\x8e\x8f\x3c\xad\x48\x3f\xf9\xdd\x24\x12\x78\x4e\x64\x12\x4a\xd0\xb5\x57\xeb\x09\x2b\xdb\x8b\x7f\x45\x1e\xbf\x2e\xa3\xf3\x26\x63\xbb\x40\xcf\xf6\xea\x6c\x42\x4c\x44\xaf\xfe\xa1\xa5\x6e\xaf\x6e\xf9\x8d\x63\xb7\xa9\x93\xe0\xe2\xd4\x2f\xeb\xb6\xb5\xd3\x31\xf9\x3e\x41\xd5\x05\x61\x59\x64\x69\x30\x6f\xaa\xb4\x85\x57\x01\xfd\xd1\x2b\x6e\x81\xe8\xc5\xe3\xd3\xb8\x1c\xee\x87\xe8\x0d\x37\x85\x19\x8d\x63\x04\x1f\x6f\x38\x88\xe1\x48\x45\xf4\xcc\x69\x32\x3c\xdf\xa5\x99\xdf\x3d\xd0\x70\x3a\x69\x3d\x52\xc8\xed\x45\x53\xc6\xe6\xba\x0e\xde\x4a\xb4\x70\xf7\x11\xba\x98\x23\x93\x76\x6b\x5d\x7f\x60\xff\x67\x5d\x1b\xc2\xc9\xdc\x41\x75\xa5\xb7\x2d\xea\x0d\xe6\xd7\xcb\xab\xf2\x7b\x51\x7e\x3f\xb3\x92\x97\x22\xef\x74\x41\x66\x59\x17\x3c\x82\x29\x64\xd7\x09\x41\x67\x92\x2e\xe8\x74\x9b\xd0\x04\xb1\x28\xcd\xb0\xc9\x83\xb6\xf4\x87\xfd\x5d\x59\x89\x19\x4e\x9a\x9b\x9b\xe4\x49\xa2\x0e\x9c\xb4\x04\x2f\x39\xd3\x97\xc0\x48\xef\x19\x44\xc4\x6a\x10\x4d\x94\xa3\xfd\x55\x4b\x43\x85\x41\x60\x98\xd1\xde\x35\x91\xce\x45\x3a\x94\xfe\xb3\x50\x9a\xf4\xbf\xe0\xac\x43\x2f\xd9\x36\x11\x94\x4c\x79\x88\xec\x79\xdc\x46\x75\x1d\x0f\x73\xf7\xfc\x9c\x24\xa2\x9e\x06\x91\xce\x7a\xd1\x43\x6f\x64\xae\x66\x10\x2a\xb7\x63\x64\x07\xea\x48\x4a\x13\xa7\xe5\x72\x6b\x69\x5a\xb8\x52\xc7\x91\xae\xa4\xa0\xed\xbc\xb3\xab\xda\xce\x9b\xc2\xda\x4c\xf1\x5c\x0e\x52\xea\xd2\x6c\x00\x3a\x07\x03\xa2\x00\x23\xef\xef\xce\xae\xad\xea\x2c\x54\x59\x6d\x8f\xaa\xb2\xc5\x28\x06\x7d\x43\xba\xc0\x3c\xad\x2c\xaf\x36\x92\x4b\xea\x8b\xe8\xb9\x5b\x82\x3e\x12\xec\x62\xd0\xb0\xac\xd3\x3e\x1a\xba\x70\x58\xd4\xc7\x87\x3d\xe9\xe6\x8d\x9b\xb9\x25\x87\x6f\xe4\x5d\x19\x9b\x1d\x23\xb6\x5f\x79\x62\x6c\x69\xcf\x3f\xfe\x72\x92\x6c\x27\xde\xbe\x27\x4b\x6e\x2d\x1d\x3a\xc9\xf7\x9d\xc5\xfc\xcc\x42\xc2\xd6\x62\x89\x9d\xc5\x12\xd9\x4c\x06\x4e\xb2\x09\x8e\xc3\xed\x5b\xa7\xa5\x62\xa5\x7e\xfa\xaf\xe2\x7e\xad\xc4\xfe\x4f\x5e\xef\x7b\xd6\x7d\x69\xff\xea\x5f\xa7\xe7\x67\xb5\xa3\x7f\xed\x17\x0a\x57\x0c\x6f\x48\x5e\x68\xba\x70\x14\x38\x32\xec\x1b\xf5\x78\x0b\xff\x50\xcf\xb0\x37\xf8\x2e\x12\x32\xda\x29\x2d\xa6\x42\x0c\x47\x0e\x33\x2b\xde\xb6\x33\x0b\xc7\xb8\x9a\x35\x35\xf6\x68\x56\xb2\x2a\x65\x3b\xb3\xe2\xc4\x8f\x27\x3b\x5e\x93\x6f\xd1\x93\x5a\x99\x4f\x0b\xcb\xf2\xff\xdf\x35\x7f\x4d\xae\x79\xad\x72\xaa\x2f\xa3\x7a\xbd\x3e\x3a\xbf\xaa\x89\xb7\x08\xfe\x93\xc9\xe4\x6b\x5b\xd2\x7b\x74\x3f\xf4\x5f\x82\x85\xf8\xb8\x99\x56\x97\xbc\xd1\x2b\x59\x0b\xa0\x52\x92\x3e\xfc\xb6\x3b\x09\x79\xab\xe2\x2b\xba\x82\x79\x10\xac\x76\xc7\xdc\x14\x0f\xd9\x8c\x89\xde\x5c\x6e\xae\x8c\x9d\x15\xe7\xd1\xdb\xa3\x9f\x8b\x3c\x8a\x74\xd3\xe8\x26\xae\x9e\xdb\x99\xcf\x51\x70\xd3\x40\xb1\xcd\xe7\xac\x8c\xe5\xd2\x89\x62\xb9\x88\x38\x2e\x1d\x11\xc7\x65\x86\xfd\xdd\x34\x26\xd6\xa3\xbf\x31\xb1\xc2\x3a\xe0\xb3\xc4\x5b\xec\x47\x91\x5c\x64\x15\x30\x3e\x58\xcb\x98\xad\x12\x2e\x4c\x18\x6f\xce\x85\xe3\x8b\xa1\x29\x3c\x92\xc1\xf7\xf9\xa3\x31\x8b\xb8\xe5\x7a\xcb\xe8\x2f\xd0\xb3\xb1\x5c\xd7\x91\x26\x43\xb8\xa5\x7c\xe1\xac\x3e\xb0\x3d\xeb\x18\xb0\x6f\xb0\x0b\x0f\xd5\x01\x5f\x5f\xf7\x3f\xa3\x5b\x0a\x3b\x40\x67\x5b\x9e\x75\x32\xe0\x8a\x8f\x27\xb3\x22\x17\xfa\xbc\x81\xfe\xe1\xb4\x57\x23\x48\x85\x1b\x9e\x75\x3a\x40\xff\x13\x5d\xbb\x0d\x67\x49\x87\xb9\x30\x42\x33\xdf\xfd\xcd\xad\xf6\x13\xaa\x6c\xda\x6f\xed\xa7\x5c\x97\x3d\xe0\x3d\xd8\xd7\x56\x8e\x6a\xfb\xe6\x06\x16\x63\xe3\x81\x78\xef\x88\x77\x98\xdc\x98\xf9\x67\x9f\xb0\x62\x1a\xd0\x3e\x56\x15\x6e\x43\x2c\x78\x8c\x29\xb7\xd9\x22\x40\xe8\x5e\xca\x60\x89\x08\x2e\xa0\x5f\x5e\x2a\x80\x19\x16\x4e\x57\x3a\x9b\x46\x36\x6d\xb8\x29\xdf\x34\x37\x43\x31\x9a\x91\x4c\xed\x62\x4a\xbe\xbf\x8b\x9e\x28\xfa\xbb\x76\x07\x96\xb4\xaf\x3c\xda\xf5\x37\x42\x58\x71\xd1\x84\x38\x5a\x78\xda\xdb\xe8\x32\x27\x0d\x15\x61\x34\xe8\xa3\x6c\xac\x80\x0c\x5d\x24\xf0\xb4\xab\xb2\x03\x91\x3d\xb1\x91\xa1\x75\xd6\xd7\x33\xbf\xf9\x5e\x76\x17\xfd\x40\xab\x16\x87\x9b\x7d\x73\xa3\xaf\x1a\x18\x8b\xb7\x89\xdd\x47\x5b\x65\x9b\xef\x0d\x6d\xc5\x93\x0f\xcd\xdc\x58\xfa\x60\x48\x77\xd9\x18\xed\x9e\xed\x71\x7a\xb8\xbe\x2e\x22\x1e\xc1\x42\xe4\xfa\x0c\x56\x2e\x37\x61\xb0\xb6\xb9\x21\x83\x85\xcd\x8d\xe3\x59\x6d\x6b\x34\xb1\x62\xe9\x33\x9a\xca\x6c\x26\x0f\x9d\xa3\x45\x4b\x0b\x75\x5c\x6b\xe7\xb7\x96\x89\xb3\x9b\x87\xf2\xc2\x2b\xce\x7f\xc2\xfe\x81\x13\x5b\xbe\x6d\x66\x63\xa2\x28\x4b\x06\x5b\x3b\xf0\x77\xcf\xda\xc9\x69\x5b\x8f\xeb\x5b\x2f\xa5\xfb\xf7\x79\xae\x2b\xf7\xad\x0f\x5f\xed\x0c\x90\xd3\xcf\x8a\x9c\x7e\xae\x0b\x99\xfc\x2a\x97\x25\x6b\xdf\xe6\xab\x09\xed\xe7\x0f\x08\x6d\x75\x82\xc7\xee\x45\x5b\x15\xfb\x54\xa7\xbd\xaf\xca\x26\x53\x4e\xd4\x8b\x97\xb6\xee\xe0\x66\xb6\x0f\x48\xa0\x81\xb7\xf5\x78\x69\xdf\x94\x6e\xd4\x57\x50\x39\x44\xfc\x29\x1c\x85\x84\x1c\xc6\x17\xdc\xaf\xf2\xd8\x95\x32\x34\xcd\x24\x71\x48\x62\x78\xd8\x95\xe9\x6c\x29\xfd\x0d\xb6\x65\x76\x53\xa3\x5d\x20\x7b\x1b\x1d\xca\xf8\xac\x6d\x07\x40\xe5\x61\xb1\xe5\x7c\xf4\x2d\x28\xcb\xa8\xd6\x61\xc3\x6f\xa0\xa3\x94\xbf\x7e\x59\xf9\xf1\x90\x64\x92\x89\xb7\x37\x8a\x64\x85\x3e\x2b\x84\xab\x42\x7f\x90\xef\xef\xf7\x77\x03\x81\x12\x1d\x0a\xd9\xce\xfb\x3b\xc5\x7f\xf1\x6c\xdc\xd9\x1c\xb7\xb3\x33\xcf\x19\x5e\xe4\x3a\x45\x80\xaa\x0b\xfd\x20\x20\x01\xfc\x87\x44\xef\x06\xba\x8c\x61\x6e\xda\xf6\x18\x97\x45\x1d\x20\x84\xd3\x7c\x93\x7c\x6f\x63\x5b\xb0\x7b\xa8\x39\x6f\x83\x23\xde\x43\x81\x9e\x63\x03\xbb\x32\x1e\xa4\xb9\xf5\xb5\x65\x6e\xaa\x6e\x46\xd6\x14\x42\xea\x14\x75\x1f\x85\x4f\xae\x60\x71\xbe\xb6\x52\xce\x86\x17\x7b\x37\x92\x9d\x8a\xfc\x72\x0e\x15\x5c\x44\x64\xa3\xdb\x70\x85\xd1\x47\x34\x33\x11\xe1\xe8\x0a\xc2\x71\xc1\xe7\x0b\x82\x1b\xa4\xe9\x9e\xcc\x55\xf0\x30\x61\x46\x8a\x2e\x64\x16\x34\xde\xa9\xc5\x3e\xd2\x8d\x30\x34\x39\x0b\xec\xfe\x0a\x76\x92\x84\x4b\x33\xe9\x52\x19\xf6\x05\x5d\x12\xad\xa2\x59\xa3\x13\x37\x62\xdb\x82\x81\xb8\x3e\x2f\xb6\x42\xd4\xc5\x51\xe9\x42\x11\x5f\xb6\x27\xe2\xe8\x95\xa1\x60\x6f\x90\x93\x1f\x65\xfd\x81\x1f\xb4\x5e\x73\xf5\xee\xa2\x17\xa6\xcb\x32\x2c\xda\x70\x1c\xac\xce\xbd\x2e\x23\xcd\x1f\x6d\x2f\x20\x84\xbd\x7e\x92\x93\xde\x5f\xc6\xd6\xc8\x3e\x00\x9c\x1a\x5e\xda\x35\x37\x8d\x10\xce\x13\xc0\xa5\x18\xc9\x89\x1e\x36\x1d\xe9\xbd\x32\x9b\x0f\x77\x1d\x58\xd1\xd0\x04\x98\x41\x91\x95\xb4\xad\x02\x14\xe6\xe3\x01\x04\x1b\xd6\xda\x02\xd8\xc5\xcc\x2d\x3d\xf3\xa3\x8c\x40\x66\x48\x24\x42\xf9\xdb\x5a\xbe\x6c\x71\xfe\xe9\x43\x66\xf4\xac\x1b\xb9\x3c\x5f\xcd\x8d\x3e\xfc\x9d\x19\xe5\x7f\xe5\x43\x17\xd9\xd0\xd8\xc7\x42\x34\x9b\x85\x6a\xe4\xdb\xbc\x7c\x62\xbf\xcd\xc9\xd9\xcd\xa0\xbe\x10\x96\x72\x58\x8f\x6b\x0f\xea\x7b\x83\x7a\x0e\x8b\xa0\x7f\xfc\x2a\x9f\xc3\xff\x64\x4e\xbe\xea\x66\xd1\x90\xf0\x59\x3e\xc1\x68\x98\x7b\x3c\xe6\xef\x1b\x4d\x73\x51\xc0\x3c\x8a\x70\xf7\x61\xd6\x46\x63\xf6\x91\xc2\xdd\x23\x89\xbb\xff\x91\xa5\x5f\x72\xfa\x23\xef\xa0\xea\xe2\x7e\x18\x7e\xe3\xab\x52\x77\xd7\x43\x4b\x35\xf7\xb7\x27\x1c\x01\x7d\xb8\x04\xf5\xbf\x2e\xc1\x63\xfd\x9f\xc4\x01\x1f\x2c\x03\x54\xcc\x98\xff\x26\xdb\xef\x45\x6c\xbf\x8f\x6c\xbf\xc7\x0e\x00\x37\xab\x10\x1d\x30\x7b\xc8\x7c\x12\x67\x4e\x3c\xb8\xb4\x19\x6f\xb9\x6d\x54\xd4\xb0\x35\xbc\x2a\x0c\xbd\x61\xb3\x6c\xf8\x42\x50\x20\x85\xe3\x9e\xb9\xe1\x01\xdb\x2c\xc8\x0a\x87\x5e\x49\x36\x20\x12\xb4\xfc\x51\x94\x2d\xbf\x1d\xf1\xf8\x3d\x67\x91\xc5\x8f\x99\x7b\x19\x2c\x68\x4b\x9f\x15\x45\x72\x21\x6b\xaf\xc2\x9a\x1d\x46\x5c\x7d\xcf\x51\x4c\x3d\x90\xbf\xf2\x06\x44\x0d\x28\x2f\x33\x12\x5c\xf9\x6a\x04\xb7\xc8\x59\x47\xf8\x4c\x3d\xe4\xb2\xbb\x72\x0e\xf7\x0e\x82\x5c\xe4\xf4\x06\x5e\x8f\x7b\x3c\x77\x42\x01\x63\x15\x76\x7a\x3b\x77\x73\x09\x9b\x7e\x1b\xc5\xf4\x5a\x58\x01\xe9\xdd\x5d\xc6\x48\x3e\x90\xbc\xbb\x14\xdc\x22\x8f\x19\x3d\xed\x44\x4f\xd9\x4c\x9c\x1d\x3f\x6e\xc7\x8f\xd4\x80\xe2\x38\xe3\x34\x2d\x3b\x4e\xdd\x8e\x53\xff\xfb\x9c\x27\xf1\x86\xcd\x3c\xee\x7d\xd8\xbf\x30\xdb\x4f\x7e\x2f\xf0\xf8\x2a\xcf\x17\x38\xad\xa3\xfa\x3c\x2a\xeb\xf1\x91\xff\x41\xb1\x5e\xdd\x18\x03\xac\x6e\xa3\x08\xc0\x4c\xd6\xc0\x2f\x7c\x5c\xeb\x85\x6a\xbd\x26\x6a\x09\x87\x5c\x1f\xd4\x79\xae\x6b\xb8\x65\x5c\x17\xee\x0f\xc7\x12\x93\x78\x97\x2b\x54\x33\xb8\xd5\x77\x50\x6d\xc6\xea\x3a\x32\xd2\xf3\xa4\xae\xa2\xfb\xc5\xf2\x48\x5a\xfe\x4e\xc3\x69\x5a\x6d\x8c\x84\xe2\xf9\xd6\xc3\x0b\x50\x33\x82\x28\xc2\xd0\x36\x7b\xea\x91\x37\xad\xb3\x11\x9c\x4c\x39\xe1\x6c\x5f\xf3\x00\x94\xbc\x22\x77\xe0\xbb\x80\x9d\x26\x75\x0a\x8c\xe2\xc0\xe7\x35\x18\xea\xe0\x47\xda\xe8\x45\x19\xbe\x74\xf0\x84\x7e\xdf\x30\xa9\x11\xec\x37\x31\xc0\xcf\xbf\x56\x22\x1d\x68\x02\xb7\xc0\xed\xdd\x8a\xdc\xb7\x5b\x8c\x81\xdb\x75\xd8\xcc\xcd\xc9\xb1\xe0\xc0\x9b\xd6\x78\x34\x27\x34\x77\xb6\x62\x6a\x84\x58\xf1\x19\x4a\xce\xa0\x3b\x63\x37\x69\xb4\xe9\xec\xbd\xf5\x9d\x9c\xc3\xba\x8e\x68\xf1\x0c\x0b\xde\x02\xaf\x29\x51\x3c\x20\xe6\xc3\xbf\xc4\x42\xe8\xe0\x4c\xb5\x71\x46\x3d\xdd\x37\xcf\x4b\x5d\x73\x7e\x11\x79\xa3\x2c\x0e\x14\x86\x71\x5e\x64\x54\x8f\x67\xf1\x3b\x95\xe1\x38\x4e\x95\x7f\x79\x99\x3f\x92\x98\xf4\xfc\x59\x85\xe7\x78\x91\x50\xe0\xf6\x17\x7a\xa5\xca\xab\xf0\x50\xd0\xc4\xca\x48\x51\xc5\x81\x7c\x2b\x55\xb9\xa6\x84\x13\xfb\x6a\x86\x4e\x30\xf9\x54\xb6\x9e\x9f\x80\x14\x1c\x34\x99\xdb\xc0\x88\x61\xe5\x6a\x14\x32\xd2\xd5\x81\xa2\x14\xab\x7f\x69\x66\xd8\x97\x06\x10\x18\xbd\x4b\x8c\x22\x8e\x5f\xa0\xa7\x2c\xc9\xfa\x71\x9c\x9e\x88\xec\xa8\x5d\x84\x96\xe3\x56\x78\xc3\x9b\x22\x87\x0d\x27\x3c\x0b\x86\xea\xe0\xc0\x7a\x64\xd4\x5d\x26\xde\xfd\xa4\x94\xff\x0c\xa3\x0f\xcc\xf5\xf5\xcf\x5d\xfc\xc5\x20\xb4\x0f\x8e\x81\xfb\x3f\x0e\x51\x13\xe0\x17\xa1\xf0\xcc\xb6\x1f\x2b\xa4\x51\xc1\xad\xe2\x08\x55\xb5\x20\x13\x23\x10\xd1\xa7\x02\x56\xaf\x92\x83\x44\x58\x11\xdf\x2a\x70\x0c\xf1\x91\xc7\x8f\x1c\x70\x48\xac\x96\xd0\xb6\x33\x58\x5f\x0f\x1a\x4f\x6e\xf3\xb3\x3d\x3c\x44\xdb\xce\xc6\x73\x13\xc3\x46\x40\x15\xd5\x0a\x3e\x53\x9f\xab\x87\xd4\x18\x2c\x73\xa2\xb1\x52\x2b\x7f\x48\x83\xfc\x4b\x6b\xce\x0b\x45\x45\xf2\x2c\xd2\x7f\x74\x38\xc0\x0c\xa4\x61\xab\xd8\x22\x00\x8a\x68\x91\x9c\x49\x5e\xff\x24\x43\x77\xdc\x58\xe1\x2d\x3d\xe6\xa3\x76\xa6\xf7\x58\x02\x00\xc7\x41\x22\x2e\xbc\x5d\x49\x5d\xbc\xe9\x2e\x72\x61\x77\xb6\x63\x27\xb9\xb0\xb1\x9e\x22\x4f\xba\xba\xbb\x5c\x79\xcf\xff\x68\x9c\x1e\x30\xfc\xd0\x7e\x63\xd0\x8c\x57\x68\xdf\x1a\xf5\xfa\x29\xc1\x10\x43\xd6\x7e\x13\xfd\xce\x4b\x60\xaa\xb4\xb0\x0e\x26\x1f\x36\x31\x1e\x10\x3d\xa4\x44\x0b\xf0\xde\x2a\xe1\x7f\xae\x24\x2a\xab\xa5\xc4\x5e\x16\x61\x89\x15\xb2\x3b\x1f\x51\xd0\x72\x39\x0c\x5c\xb6\xa3\x3d\xf4\x53\x80\xda\xbb\x39\xc3\xfd\x48\x45\x65\xed\x48\xdc\x80\xc8\xf0\x90\xae\xfd\xe7\x89\x9c\xf4\xb8\x14\x91\xea\xb8\x83\x11\xa9\x64\x5f\x01\x8e\x5c\xec\xa6\x8b\xe3\x61\xd1\x1e\x60\xcf\x5d\x26\x77\xae\x29\x6c\xf9\x45\xa8\x30\x47\x85\x0a\xab\x44\x5b\x84\x82\xe8\x57\xa3\x4d\x06\x5d\x34\x13\x2e\x58\x44\x5f\x62\xf7\x7a\xe4\x2b\x6b\x9f\xab\xa5\xb9\xbe\x12\xaf\xd8\x39\x47\x84\x0c\x9f\x03\x66\x52\x6f\xd5\x8e\x81\x6f\x8d\xce\x4c\x0b\x70\x04\xc3\x71\xf4\x1d\xf5\x5a\x5f\xe4\x37\x84\x64\x08\x76\x90\x75\x5f\xa6\x20\x9d\x41\xe3\x08\x95\xb3\x80\x58\x0f\xac\x61\xcb\xf3\x87\xca\x86\x59\xb8\x34\xe8\x22\xb7\xdb\xb5\x77\xc4\x02\xf7\x45\xb9\x81\xd4\x4a\x57\x45\xfb\x54\xb4\x8f\x45\xfb\x36\x80\x7a\xdf\xee\x6f\x66\x7f\x66\x80\x9b\xb8\xa8\xa4\xf1\xcf\xe6\x56\x9e\x7c\xf0\x16\xf8\x9e\xd1\xb1\x5f\x2b\xf0\xc1\x6d\x33\x87\x49\x2f\xd5\x28\xe5\x1b\xeb\xa3\xd7\x02\x28\xfd\x4d\xe4\x75\x46\x28\x88\x51\xb9\xa2\x07\x43\x1b\x73\x66\xd5\xfc\x4e\x26\xb3\xdb\xa5\x6c\x1b\x0a\xbc\xbf\x8b\x64\x93\x52\xa6\x25\x51\x78\x2c\x78\x01\x98\xd8\x85\x52\x6f\x81\x18\x08\xfa\xba\x54\x83\x08\x68\x10\x88\x44\x8c\x9d\x5d\xbb\xbb\x07\x88\xe2\x01\xf6\xe0\xd0\xa0\x2e\x75\x01\x0f\xa5\xa5\x4f\x85\x07\x98\xa8\x6e\x94\xbc\x85\x02\x9d\x28\x61\x2b\x2d\xd3\xcd\x5c\x60\x5b\xdb\x00\x22\x1b\xc0\xb8\x8b\xcf\x42\xdf\xba\xe8\x99\x35\x2f\xa2\x59\xf4\x4f\x08\x7e\x84\x00\xb5\x4b\xfe\xff\xa5\xf4\xd4\xcb\x0f\xd7\xd7\xc7\xe4\x1f\x6a\x62\xcb\xc0\x18\x33\x7b\x6b\x43\x34\xbd\x31\x4e\xf5\x59\x41\x76\x6e\x66\x6e\x4c\x52\x0e\x9b\xd8\xa2\x0f\xf0\xfa\x69\x92\x72\xf3\x99\xdd\xf1\x5e\x07\x28\x13\xa3\xc0\x26\xa8\x09\x77\x04\xa8\x16\x1f\xe7\x70\xf8\x53\x3c\xdd\x31\xc1\x40\xc1\x35\x3a\x18\xfa\x94\xc2\x5a\x8b\xa4\xf3\x17\x43\x85\xe4\xca\x8f\xd7\xd7\x43\x74\x67\x5b\x46\x9c\x12\xa2\xb0\x0d\x4b\x94\xf6\x8d\x76\x04\x71\x63\x0d\xda\x2a\x8a\x34\xa0\x80\xe6\x57\xb1\xf7\x90\xb2\xc4\x58\x40\x28\x54\x2f\x8c\xc6\xf9\x21\x6c\x8e\xbe\xdb\x44\x57\x0a\x1a\x9e\xf7\xd8\xf9\x21\x49\xdc\x3c\xfb\x88\x88\x51\xd3\xc3\x2d\xe9\x21\x3a\xa4\xfd\xe8\x11\xda\xa0\xfd\x18\xa3\x77\xd8\x8f\x2e\x2a\x6f\xec\x93\xe3\x5d\x40\xec\xf8\x88\x49\xd4\x89\x5b\x97\x22\x86\xd3\xc9\x81\x84\x0f\x7d\x96\xd1\x5b\xfd\xdb\xfa\x3a\x30\x26\x9f\x3d\xab\xf8\x00\x4f\xd6\x65\x29\x72\x3c\x21\xf7\x15\x7e\x2e\x88\xdf\x06\xa8\xf5\x18\xbd\xed\xa3\xc6\xa3\x8f\x51\x47\x50\xc8\x2a\x53\x09\xf7\x85\x00\xed\x9e\x75\x33\xa1\x99\xc3\x7e\xa3\x48\x18\x36\x1f\x94\xc4\x64\xec\x9b\x90\xa8\x5a\x3b\x1b\x18\x21\x16\xce\x26\x37\x0f\x5b\xc8\xe8\x5b\x67\xce\x6f\x84\x69\x92\x85\xd3\x9d\x62\xdf\x7a\x6a\x1b\x5d\x53\x4c\x41\xf5\x84\x9a\x82\x8f\xc2\xdf\x3e\x85\x88\x87\xf3\x09\xa5\xa8\x06\x46\x24\x84\x01\x00\xec\xfa\xf6\x1b\xde\xcd\xe5\xa6\xa5\xb9\xc9\x68\xff\xb7\xa1\xb4\xf8\xf8\x01\xc6\x73\x8e\xc2\x98\xcb\xde\xe9\xa3\xd5\xc7\xc1\xf4\x81\xeb\xc3\xc6\x67\xcb\x19\x8c\x87\x0f\xec\x13\x1e\xad\xd2\x81\xb3\x55\x82\x9e\xe0\x5f\xeb\x0a\xbd\x05\xd8\xf8\x48\x6d\xbd\xd2\x04\xc9\x97\x29\xc6\x5f\xc2\x42\xa2\x01\x8f\x0e\xf3\x10\x7a\x5f\x20\x10\xc0\x0e\x61\x7f\x51\x17\x64\x0b\x3a\x1b\x42\x9a\x38\xd0\x42\x14\x10\x8a\x6d\xc3\x7c\x82\xe7\x76\x0a\xa6\x3e\xb5\x05\xe9\x08\xe8\xed\x54\x76\x2b\x8d\x09\xf8\x63\x46\x45\x64\x62\x5c\x2a\x2e\xd2\x16\x2c\x55\x97\xb5\xad\x07\xcf\xd8\xf7\x21\x05\x67\x7b\x0b\xbb\x31\xc4\x4b\xe1\x36\x7d\xde\x0e\x09\x3a\x43\x02\xdd\xde\x94\x2b\xd8\x95\x47\xbe\x07\x85\x68\x5f\x60\x37\xf1\xfc\x47\xca\x28\x96\x31\x57\xd5\x9e\xc0\x18\xbd\xc7\xe2\xc5\x6a\xfd\xa1\x08\xd3\x8e\xf5\xf0\x27\x02\xda\x87\x3f\x92\x92\x50\x85\xc2\x3f\x78\xab\x1d\xb7\x74\x1c\x53\x47\xf1\xd1\xe7\xd9\xc3\x13\xc3\x69\x5c\xc2\x21\x20\xe6\x12\x7b\x8e\x31\xb4\xc5\xf4\x52\x8b\xb0\x34\x85\x31\xc6\x33\xa4\x11\x5c\x1c\x32\x57\xeb\x3c\x2a\x4e\x6a\x5b\xf8\x50\xdf\xc2\x11\x8d\xdf\x08\xa7\x4d\xb9\x54\x3e\x51\x23\xf9\x6b\x0c\xc7\x6d\x3d\xfe\x11\x78\xa2\x46\x6f\x6d\xf9\x56\xa7\xb7\x8e\x7c\x13\xfb\x9f\xe0\xec\xf2\x48\xc0\xd8\xe5\x91\x84\x2f\x48\x18\x88\x04\xb9\x93\x89\xfa\x51\x48\x81\x1d\x0d\xe1\xa8\x06\x46\x61\xf6\xf8\x81\x90\xc1\x69\x4c\xdd\xa6\x0a\x02\x55\xb6\x9e\x3a\xc2\x29\x0b\xff\xed\x0a\x5f\x70\x91\xa8\x00\x59\x7d\x2c\xbb\xe1\x6e\x52\xdc\xe2\x48\x69\x56\xbb\x5a\xab\x27\x3d\x1e\x8d\x3c\x20\xea\x89\x30\xa0\xc3\x32\x40\xd2\xc0\xf3\x3b\xfe\x08\x37\x0e\x65\xa2\xa2\xc6\x51\x79\x25\x59\xc5\x1b\x17\xd3\xe6\xde\xc5\x95\x12\xaa\x17\x07\x56\x1f\x23\xe3\xe5\x2e\xa3\xa4\xb2\x74\xbd\x74\x6f\x22\x78\x11\x85\x24\x87\x2d\xc8\x9f\xe2\x68\x69\xd0\x06\xb7\x4f\x62\x9a\xdd\xc5\x68\x80\x92\xbc\x7f\x6e\x1a\x3a\x9b\xc7\x75\x2f\xe6\x27\x8b\xb4\xb9\x63\x55\x48\x35\xd7\x23\x2f\x4a\x9e\xe6\x12\x57\x86\x15\x83\x01\xe7\x15\x26\x74\x38\xa1\xc0\xe3\x67\xd8\x00\x92\x61\xb2\x0e\x9d\x3d\xfc\x93\xcb\xc0\x16\x72\x1a\xc3\xfd\xe6\x1e\xfd\xcd\xbd\xbd\x42\xd2\x14\xed\xbe\x70\xc3\x0f\x1d\x74\x6d\xf4\xb9\xf3\xfe\xee\xbe\xbf\xa3\x3f\x60\x68\x17\x37\xb9\xd4\x91\xb6\x01\x5b\x04\xa2\x4b\x7d\xa4\x75\x84\xb1\x48\x5f\xb9\x3e\x12\xd2\x9a\x3e\x00\x4c\x7a\xdb\x4c\xa1\x79\xab\x90\xd8\xf4\x11\x74\x60\xf3\x40\x12\xba\x28\x77\x8c\x21\x1b\x8b\x05\xee\x37\x5c\xaf\x99\xa2\xc2\xe9\xa1\x4a\x3a\x75\x9b\x29\x2a\x9c\x1e\x13\x23\x30\x9f\xc7\x8e\x50\x22\x33\x0e\x40\xc1\x18\x80\x88\x3a\xb5\x07\x44\xb5\x07\x15\x5b\x5e\x13\x90\xef\x6b\xaa\x0d\xe8\xab\x6f\x4d\xe1\x77\xca\x30\x54\x0f\x40\xeb\x31\xf2\xb9\x55\x97\x50\x69\x6e\x7c\x80\xb3\xfb\x97\xf2\xe1\x42\x0d\x72\xd3\x62\xbe\x75\x23\xd2\x84\x3e\x6b\x1a\x72\x12\x90\x80\xe9\xda\x34\x32\x1c\x3c\xa3\xf1\x32\x1a\x5b\x5a\x24\xe0\x98\xd2\x22\x99\xce\x3e\x2d\x86\xfb\xc4\xfe\x54\x7c\x34\x42\x92\xa6\xb7\x71\x46\x71\x99\x50\x2d\x5f\x38\x48\x39\x38\x31\xb0\x7b\xd0\x35\xd3\x6c\xfc\x01\x58\x4b\x4f\x80\x0b\x44\x99\x3b\xf9\x69\xb9\x8a\x73\xf3\x2b\x66\x29\x6e\x04\x67\x0b\x4a\xd2\x8f\xd6\x14\x8c\xb1\x42\x39\x36\xb6\x23\x5f\xa6\xf0\x32\xa5\x95\x95\xe3\xf3\x44\xa0\x31\x68\x26\x1e\x9f\xf0\xfe\x42\x49\xae\xf7\x41\x1a\x0e\x5b\x4b\x53\x33\x61\x36\xd9\x1f\x40\x63\x89\x7b\x05\xea\xd0\x04\x83\x7c\x12\x7a\xf4\x30\x24\x30\xda\x1f\x08\xdc\x48\x93\x36\xef\xac\xaf\xc3\x49\xfb\x42\xab\xd7\x85\x03\xa7\x5c\x42\xa9\x63\x74\x4b\x48\x14\xc9\x7c\x45\x80\xd8\x84\x7c\x53\xe0\x08\xe9\x70\x49\x86\x96\x68\x14\x66\x4d\x43\x04\x89\xcd\xc5\xbb\x93\xab\x9b\x37\x6d\x8f\xe3\x1d\x8a\x1f\xb6\x86\x23\x7f\x50\xea\xf8\x68\xf8\xb3\xac\x2b\xa4\x64\x90\x65\xcb\xe9\x09\xe7\x68\xf1\x87\x6d\x68\x34\x8a\xb4\xf7\x02\xdc\x86\x92\xe4\xd0\x0b\x70\x14\x26\xfb\xda\xd2\x52\x18\x7a\xde\x8b\x5f\x85\xe0\x31\x11\x68\x63\xf6\x6f\xe1\xc0\x71\x67\xb5\xbb\x70\x15\xd8\x0e\x0a\xf2\xc8\xb9\xa1\x1c\xcd\xb8\xa3\xe7\x25\x58\x1c\x25\x00\x81\x0c\x34\xd6\xd2\xfc\x84\xe1\xed\x16\x57\xba\xf6\xc6\xca\xb6\x48\x7b\xde\x8c\x5a\x4b\xf2\x45\xda\x45\x4c\x7d\x41\x08\x7f\x83\xe7\xf0\x8d\x38\x35\x91\x9b\x96\x0f\x0e\x90\x4c\xf1\x09\x5c\xa8\x2f\x05\x10\x40\x67\x4b\xd6\xd7\x81\xb8\x53\xc2\x27\xac\x73\xe2\xc6\x75\x0e\xea\x09\xc5\xcd\xa3\xa6\x6d\x5f\x1f\xc2\x17\xe8\x69\x58\x54\x4f\x7f\x2a\x71\x95\xe2\xf2\x67\x3e\xc3\x89\x72\x3f\x6b\xee\xd1\xdf\x9c\x63\x1d\x9d\xc4\xc5\x4f\xab\x0b\xbe\xfa\x50\x1a\x45\xa7\x35\x3c\xa4\x49\xdb\x81\x1e\x53\x59\x4c\x45\xac\x0f\x24\xef\xcd\xfb\x3b\x10\x8c\x3e\x9a\xf4\xf8\x90\xe0\x63\x82\x0f\x09\xca\x9d\xab\xf1\x19\x91\xb6\x8b\xc9\x2e\x24\x9b\x44\x2a\xfb\x9a\xf3\xc1\x7a\x6c\xee\xc7\x49\xa2\x18\x29\x49\x5b\x5f\x01\xb3\xbb\xc0\x7f\x5b\xa5\x1d\x13\xe5\xf2\x94\x0f\x2f\x42\xe8\xc8\x94\xdf\x5f\x0e\xa8\xf6\x26\xb0\x7a\x30\x6f\x4c\xa5\xb4\x1f\xa1\x5a\x9b\xf1\x0f\xbc\xf5\xa5\x1d\x51\x63\x6e\xe6\x00\xf5\xba\x1a\xdd\x72\xb6\xa0\x8f\x4d\x2b\xaa\x9c\xdb\xdd\x34\x4e\x70\xee\xc4\x6f\x4e\xcd\x27\xa5\x51\x8a\x63\x71\xcd\x06\xa8\x94\x9c\x7e\xd5\x72\xca\xef\x1a\x12\x6c\xcc\xcd\x2d\xcd\x69\x6d\x52\x35\xd7\xaa\x79\x08\x4a\x6d\xc7\xb6\x4f\x91\x77\x6a\xdc\xcc\x60\x79\x6b\xa1\x2e\xe6\xaa\x2f\xea\xa6\x20\x56\xab\x9f\xa8\x18\x69\x9f\xd1\x99\x22\x5d\x34\x89\x23\x57\x5a\x56\xe1\x22\x02\xec\xb7\x15\x9b\xd8\xa1\x65\x15\x46\x53\x80\xcd\x3a\xf1\x88\xe1\x11\x5d\xf5\xc5\x2f\x53\x11\xbe\x24\xb0\xdb\x14\x72\x4a\xf1\x1f\x90\x05\xec\x07\x40\x35\xa9\xac\xfa\xc2\x1d\x28\x40\x74\x7f\xcf\x70\x89\x7c\xee\x02\x1e\xef\x42\x6d\xb2\xfc\x32\x01\xbe\xf9\xfd\x9e\x6b\x15\xfa\x46\x9f\xe1\xb7\xc3\xa6\xe5\x0e\xa1\x48\xfc\x3c\x65\x1d\xcb\xc1\x24\xfa\x99\x32\xd5\x40\xce\x45\xe2\xbb\x1f\xbd\xe7\x43\xbb\x2d\x98\x10\x68\xd9\x01\x58\x9c\x7f\xf6\x60\xd6\x5a\x8f\xc2\x89\xaf\xb3\x17\xe6\xc4\x70\xd3\x64\x70\xb6\x17\x00\x61\x11\xf9\xb5\x8b\xd8\x75\x4e\xb2\x65\xf1\x1b\x34\x89\x6f\xc2\x2d\x4a\x6f\x18\x98\x63\xb1\xbf\x9e\xd6\x5f\x4f\xf6\x57\x94\x16\x9d\x8e\x9f\xa3\xf4\x9b\x38\xf9\x86\xc6\x41\xec\x73\xdf\xd4\xa3\xc3\x6a\xd4\xf3\x82\x25\x87\x5c\x57\x17\x97\x54\xa2\x2f\xb1\x88\x9e\x5a\x44\xb1\x37\xa1\x33\x37\xca\xc5\x5b\xbc\x72\xbe\x35\xdd\x23\x4d\x4f\xe2\xe3\xc5\xc0\x3c\x1a\x98\x6f\x4d\x4e\xe1\xcf\xcb\xa9\xc9\xb0\x00\xbe\x62\xf1\xd1\x29\x3e\xbf\xd0\xf3\xf8\x94\xb0\x20\xae\x22\x66\x30\x4a\xc1\x9e\xc0\x3a\x62\x7f\xe6\xcb\x36\x0d\x17\x31\xa1\x28\x6f\x40\x5d\x9b\xb6\xaf\xeb\x93\x15\x2d\x46\x50\x6a\x52\x44\xf7\x27\xb7\x69\x95\xfc\x84\x37\xd2\xcb\x8f\x2a\x1f\x7b\xff\x5c\xf9\xea\xbf\xf5\xe5\x41\x3b\x51\xf9\xfa\xbf\xf5\x65\x51\x39\x5e\xb2\x5a\x95\xaf\x72\xf4\x07\x38\x2b\xde\x84\x1e\xf1\xd0\xb4\x9a\xc7\x6d\x94\x8e\x20\x35\x81\x3e\x3b\xc9\x5f\x67\x77\xb7\x9f\xef\xea\x3e\x3b\xbb\xb4\x25\x3f\x0f\x01\x11\x9a\x24\xd3\x43\x64\x60\xf7\x2b\xe6\x9b\x0c\xa4\x34\xb6\x51\x60\xe3\x02\x59\xe6\x49\xd1\xce\xd0\x3a\x9f\x59\xaf\x40\xa3\x16\xc4\xe3\x34\x3d\x61\x45\x3b\xb3\x9b\x9e\x6d\x18\x32\x01\x0d\xa9\x00\x02\x53\x05\x99\xf2\x2a\x52\x5e\xa5\x0f\xcc\x34\xa4\x4e\x47\x94\x7a\xf4\x00\xa9\x1b\x85\x94\x48\x99\x8a\x94\xa9\xb9\x31\x5b\x5f\x2f\xc2\x26\x99\x01\x21\x3d\xf3\x50\x1d\x09\x65\x59\x89\x5a\x6c\xcb\x4c\x69\xc9\xaa\x2a\x24\x9b\x6c\x45\xa5\xf1\x52\x79\xf4\x3d\x6a\xee\xce\x52\x6d\xd3\x7c\x1b\x46\xb1\x3c\xd7\x46\x73\x54\x15\x9c\x93\xea\x5e\x7c\x91\xd3\x9d\x13\x0a\x78\x1b\xcb\x70\x96\x13\x18\x7b\x5b\x8f\x86\x09\xe5\x8d\x36\x25\x8e\x9b\x91\x23\xcb\xb6\x75\x63\x4a\xfb\x8e\x36\xbe\xb0\x21\x1c\xa0\xd2\xd0\xe3\xfa\x50\x58\x69\xdc\x15\xc5\xef\x9f\x4a\xae\x6d\x9f\xb6\x01\xbf\xb5\x4d\xc0\xa0\x9f\x3c\x74\xcb\x18\x12\x26\x7c\xbb\x3c\xc9\x8d\x19\xf5\x02\x56\xb8\x9d\x08\x8d\xea\xca\x30\xab\x85\x62\x6e\x26\xc8\xf4\x21\x1d\xd2\x76\xa1\xb8\x37\x13\x5e\x2a\x3b\x46\x1b\x49\xd0\x36\x91\xe1\x6d\xe4\x62\xdb\x78\x41\x92\x93\x05\xdd\x12\x4d\x74\xdb\x42\x0f\x11\x24\xab\x43\x7d\x1b\xc0\xd6\xfb\x42\xb4\x32\x13\x14\xae\xd6\x18\xe4\x60\x83\x05\x26\x1e\xa1\x41\xc1\xbd\x46\x75\x52\x22\x03\xf8\x64\xaa\x9c\x9a\xe1\xf7\xd2\x05\x40\x44\x08\x46\x33\x7b\x66\x79\xd2\x3b\x10\x46\xa5\x85\xb9\x99\xfd\x6e\x0b\xb2\x64\x66\xfe\xe3\xb0\x13\xb1\x5d\xa3\xc0\xae\xe4\xbd\x43\x84\x56\x80\xf5\x59\x0b\xfd\xd1\x05\x3a\xa7\x28\xa2\x23\x12\xeb\x4b\x7e\x1e\x31\x2f\x49\x7b\x5a\x3d\x8e\xc6\x91\x3c\xeb\x5e\xea\x09\x93\x6b\x79\x85\x10\x68\x4a\x68\xcf\x5b\xe8\x2b\xfb\xde\x38\xaa\xb3\x97\xba\x66\x61\x51\x89\x8d\x39\xa1\x0c\xe9\xf8\x41\x6f\x5b\xdd\x16\xe6\xe6\x1c\xd6\xf2\x80\x10\xd0\xd0\x41\xb5\xae\xdf\x13\x08\x31\x77\xfe\x0f\x86\xd5\xda\x62\x77\x86\x4e\xa8\xd2\x67\x8f\xca\x06\x27\xf1\x06\x9c\x3e\x1e\x79\x41\x8e\x84\x9c\x0e\x05\xe6\xa2\x6e\xdd\xda\x47\x74\xed\x86\xda\x30\x3f\x17\x38\xfe\xd8\x4c\x56\x5c\xa4\x27\xc8\xa1\xcf\xdc\x7a\x04\x8a\x0b\x10\x71\xf3\x33\x52\x79\x88\xcd\x81\x78\xab\x57\x79\x42\x4b\xca\x53\xb4\xac\xbc\xd9\xd1\xd9\x7a\x4f\x63\x1c\x3c\x12\x45\x0d\x4b\x66\xfe\x5a\xc6\xa3\x9f\x05\x49\xde\xc7\xaa\xa3\xab\x4c\xfc\xd1\x9b\x34\x5c\xf4\x77\xed\x7e\xc7\x9b\x32\xfa\x5d\x50\xac\x22\x01\x8d\xbc\x97\x91\x57\x38\xf2\x62\x87\x89\x4b\x1c\xf8\xb9\xff\x26\xa2\x83\xe1\x45\x1a\xde\x58\x09\xc1\xc6\x08\xa6\x0f\x2f\xd2\x64\x67\xf0\x19\xbe\x8d\xe5\x5a\x65\xad\x0c\xbc\xa9\x22\x16\x7f\x05\x40\x45\xcf\x39\x54\x10\x97\xa6\xb8\x48\xf0\x41\xff\x81\x25\x38\xae\xab\xab\x93\xba\x2b\xb4\xf7\x9c\xa8\xdb\xd7\xe8\xa8\xd8\xf5\x13\x81\x09\x6e\xf4\x0b\xcd\x44\xc1\x63\x2f\x51\xf0\x76\x55\xc1\xd8\xdf\x6e\xa5\xb3\x38\x17\x9f\x12\x93\x11\x4d\x1a\x00\x89\x1f\x3b\x74\x0e\x50\xfb\x23\x04\x64\x16\xee\x22\x0c\x00\x22\x0b\x29\x2a\x6f\x68\xe2\x4d\x1f\x02\xee\x79\x09\xef\xd8\x90\x56\x3a\x2f\xb1\x56\xd7\xf3\x5f\x73\xe1\xdc\xcc\x77\x1f\x8d\x60\x35\xc5\xdb\xc1\xce\x43\x59\x07\xfe\x90\xdd\x11\x29\x83\xe1\x17\x02\xd5\xbe\xbc\xd1\x09\xa0\x55\x94\x4b\xe6\x4f\xa2\x49\xeb\xa0\x69\x7d\x1b\x2f\x8d\x1e\x89\x26\xed\x34\x32\x4d\x81\x9e\xfe\x54\xd6\xd7\xef\x12\xb7\xbf\x71\xc3\xb8\x1a\xaa\x6d\x7a\x86\xde\x0e\x1d\x42\x1e\x28\x3e\xbc\x1b\xb2\x10\x18\xcb\x4a\xf4\x15\x55\x82\x05\x26\x92\x75\x72\x66\x68\xd7\x2d\xad\x11\x00\xe8\x7d\x0c\xf9\x1f\xae\xd0\xea\x62\xf1\x9c\x87\x66\xbe\x5a\xd7\x42\x7d\x74\x92\xbb\x87\x45\xa0\x3f\x2e\xd3\xf5\x86\xb6\x9d\x48\x24\xf9\xc7\x78\x29\xf1\x25\x2f\xca\x92\x9f\x04\x18\xe6\x08\xc2\x64\x66\x23\x89\xb4\x28\x84\x77\x5c\x02\x89\x09\x65\x5e\x58\xca\xf9\x76\x47\x3f\x40\x26\x87\x90\xe2\xe9\x29\xed\x0a\xa4\x38\xf3\xb8\x23\x3e\x09\xa3\x12\x11\xac\x30\x6c\x4a\x4c\x98\xd4\x15\x47\xc3\x11\x4f\xbe\xcd\xf3\x8a\xbd\x9b\x05\xf9\xbb\x17\xc3\x65\x6f\xfd\xde\x50\x20\xc1\x76\x05\x40\xc3\xb5\x62\x6f\x51\x76\x9c\x57\x28\xcd\x13\x59\xe8\x5f\x47\xcb\x9e\x1c\x52\x36\x74\x74\xa9\x0e\xde\x3c\x2f\xa7\x09\x5f\x4c\xcb\x19\xe4\xe7\x6a\x29\xd9\xe5\x23\x3f\xec\x0d\xa6\x43\xbf\x8b\xe9\x93\xd6\x68\xba\xf2\x5b\x9a\x23\xac\xa5\xbc\x07\xe5\xdc\x67\x29\x47\x39\x82\x5a\xca\x50\x4e\x9b\x96\x32\x56\x96\x26\x67\x57\x1f\xb6\xd5\x9b\xf8\x83\x0e\x9f\x3a\xbd\xd7\xa5\xac\x3e\x87\xe5\xfb\xe8\x53\xe4\xc7\x29\x31\xd3\xcc\xfd\x4e\xd7\xe7\x32\x6f\x71\x4e\x3e\x2d\xae\xca\x70\xe4\xf7\xfb\xbe\x87\x99\xab\xd6\x42\xba\xcd\xb2\x13\x70\x90\xbf\xeb\x27\x40\xc3\x91\xe8\x7a\x0f\x40\x52\x81\x09\xa1\xdf\xc4\x44\x4b\x28\x50\x78\xd9\xd6\xeb\x9f\x96\xb4\xfa\x79\x25\x41\x3e\xe0\x78\xd7\x73\xc0\x71\x1b\x60\x3e\xec\x39\x6f\x0f\x6f\x1b\x88\xbd\x06\x66\xc7\x13\x35\x70\xce\xc9\xb3\x93\xfd\x56\xf7\x73\x3e\x8b\x1a\xf6\xe6\x51\x96\xf0\x28\xe5\x8c\x47\x23\x84\xdc\x0f\x8b\xf9\xdd\xd1\x60\xba\x22\x9f\xee\x93\x5a\x74\xf5\xd4\x52\xdd\x41\x90\x52\xda\x13\x54\x63\x0f\x6f\x16\x44\xdf\xa2\xba\xbe\x1c\x94\xc6\x0d\x9c\xd4\xf5\x2b\x16\x42\x96\x77\x45\xf3\x4f\xc4\x61\x90\xa8\x75\x2d\xca\x2b\x14\xcd\xaf\x1f\xe5\x1d\x54\x3f\xce\x73\x4b\x66\x52\xaa\xe5\xc4\x6c\x21\x3f\xe6\x52\x95\x8a\xb8\x3d\x6f\xb1\xee\xb0\x18\x73\x8e\xa7\x8e\x55\xf3\xd0\xbb\x04\x3e\xbd\x3e\xe6\xa5\xff\x09\x6a\x2c\xe6\x66\x02\xe4\x95\x3f\xfb\xe8\xb2\x05\xef\x2c\xdf\x44\x64\x55\x9a\x0b\x74\xb9\x25\x0e\x56\x94\x77\x09\x8d\x27\xc9\xa9\xda\xce\x02\xab\xda\xb1\x45\x97\xf2\x1d\x68\xad\x63\x5d\x0a\x8f\xe6\x18\x0c\xbc\x31\x6d\xee\x41\xaf\xdb\x28\xf2\x34\x3a\x76\xc7\xf2\xcb\x48\xe7\xdc\x4c\x98\x2a\xa1\xe4\x69\x5f\x7d\x28\x26\xef\xa6\x3a\xe6\x1e\x3c\x23\x68\x78\x4c\xa6\xd9\x1d\x68\x80\x02\x3a\xb7\xcd\xb8\xa7\x5e\x3a\x4b\x1d\xf5\x64\x2f\x3b\x18\xc8\x08\xe3\xc1\x02\x45\x25\x3a\x89\x2a\x0a\x71\x5f\x22\x39\x06\xb5\xfe\xfe\xae\x1a\x54\xd3\x4c\xb7\x93\xfa\x2c\x7c\x5a\x35\x0d\x40\x21\x75\xd4\xd5\xb5\xa9\xa9\xd7\x87\x89\x49\x69\xdb\x21\xae\x52\x57\x0d\x11\x98\x42\x79\x47\x39\xb4\xd1\x9a\x05\x19\x3d\x1f\xe8\x7c\xec\x17\x6b\x8b\x1e\x01\x3f\xf0\x39\x03\xec\x9d\xe2\x2c\x80\x45\x1f\x43\xc7\x66\x28\x62\x28\xde\xb0\xe8\xb9\x74\x13\xd3\x16\x67\xf6\x2c\x7f\xb6\x6b\xb7\xf3\x67\xea\xcb\xa7\x36\x16\x3c\x6b\xb2\x2b\xfb\xd4\xba\xc9\x9f\xc2\x82\xc0\x34\x0c\x51\x56\x70\x85\xe2\x81\x2b\x12\x0f\x5c\x01\xef\x6f\xdb\x98\xb0\xbe\x7e\x65\x8d\xe9\xf9\xe5\xf4\xfd\x5d\x96\x1b\x61\x39\x14\x0c\x08\xde\xea\x2a\x16\x3e\x5c\x59\x53\x98\xa7\x02\x5a\x78\x15\xed\x33\x98\x0c\x64\x69\x0b\xc8\x92\x4d\x08\x76\xcf\xb0\x2f\xbf\xb1\x57\xe9\xb4\x79\x25\xfb\x82\xdc\x98\x68\xb8\x7c\x03\x0d\x1f\xde\x60\x07\x8a\x37\xf8\xd1\xf2\x0d\x76\xa0\x44\xcf\x87\x37\x51\x07\x8a\x58\x0e\x07\x4a\x40\x2e\xda\x29\xae\x6a\x67\x28\xf5\x16\xe4\x15\x67\x1f\x85\xf6\xe6\x5c\xe8\x13\x0c\x8b\x78\xa5\x09\x59\x45\xdf\xe0\x44\x61\x02\xca\x84\x23\x9c\x79\xac\x23\xf4\xa6\x30\xa4\x38\x7a\x74\x39\x24\x25\x6a\x9f\x6a\x5d\x1f\xb2\x4f\x6e\x53\xe8\x65\x15\x5c\x94\x70\x23\xfd\xe2\x1c\xcb\xc8\x0e\x50\x25\x30\xdf\x10\xe8\x4f\xba\xf9\x2e\xfc\x54\x5b\x24\x69\x03\xe8\x32\xdf\x42\x3b\x44\x29\x71\x39\xba\xd0\xea\x98\x31\x84\x74\xac\x8a\x1f\xed\x66\xd1\x5d\x4a\xf2\x9a\x78\x4f\xcb\xe4\xb3\x84\x17\xa0\x65\xba\x42\x51\x00\x8a\x75\xa9\x40\x37\xca\x9a\xeb\xda\x17\x01\x0e\x37\xdc\xa3\xdb\xe8\x5c\x10\x87\x79\x88\x87\x8d\xe7\x17\x0e\x9b\xcc\x99\x4f\x15\x2a\x13\x72\x36\xf7\x58\xc9\x39\xa0\x9d\xc5\x24\x89\x3f\xa4\xce\xc4\x24\x40\x64\x3a\x09\xac\x72\xcb\x14\x76\xca\xf2\x8d\x30\x83\x8c\xcb\x81\x22\xf8\x0c\x0a\x9a\xf0\xa3\x62\x53\x05\x0a\xf4\x07\x27\x40\xcf\x8a\x1c\xf8\xf9\x53\xc7\xdb\xf8\x53\x17\x8a\x88\x0c\x7c\x86\xf4\xf6\x03\xda\x13\x46\x5b\x8c\xc9\x39\xc0\x9a\x6a\xfc\x70\xaa\x88\xcb\x77\x41\x7b\x4e\x5f\xe9\x5e\x05\x6f\xaf\xa3\x31\xeb\x67\x30\x8e\x1d\xaa\x9b\xba\x7c\xc7\x3b\xd6\x4c\x2e\x80\x3d\x93\x78\x5b\xb0\x64\x88\xa5\xe1\x64\x38\xf4\x23\x95\x97\x9c\x42\xd0\x7b\x0a\x0f\x6b\xa9\x77\x45\x28\x5c\x39\x8a\x0b\x9f\xe9\xea\x55\xa2\x3b\x78\xb2\x23\x5f\xa3\x79\xf8\x5b\xbc\x7f\xa5\x82\x82\x60\xa2\xd5\x42\xeb\x4b\x81\x99\x3e\x70\x09\x90\x77\xac\xfb\x10\x0e\xdc\xc5\x38\x36\xda\x8d\x6e\x1b\x48\x52\xd2\xac\x68\xc7\xae\x60\x0c\x7f\xcf\x97\x32\xef\x8c\x99\x36\xbc\x3d\x2f\x7a\x9b\xeb\x5c\x0b\xde\xf2\xf9\xea\x96\x4f\x86\xb4\xc0\xd8\x44\x78\xbb\x4b\x92\xdd\x7c\x9b\x6e\x80\xe4\xc8\x49\x2b\x42\xa8\x90\x5d\x7b\x46\x9b\x6e\x3e\xdb\x24\x28\xc5\xbf\x53\xf8\xfb\x27\xe4\x52\x97\xaf\x8d\xf7\xc7\x9e\x52\x9e\xb8\x85\x7d\x4a\xdc\x03\x17\xf7\x59\xd8\x92\xae\x2b\x11\x9f\x97\x6f\x1f\x1f\x8f\x6a\xb5\xa2\xf3\x11\xb5\x1b\x0f\x17\xaf\xe9\x50\x9a\x87\x04\xfc\xfa\xba\x6b\xdd\xa8\x03\xd3\x55\xc7\xd0\x7e\xdd\xa0\xc8\xcd\xe8\x97\x49\xc0\xc3\x9e\x37\xcc\x15\xab\xb2\x9f\x01\xb4\x80\x50\xd6\x86\x1a\x37\xd6\xd5\x33\xde\x81\xdc\xc4\x5c\x45\xb0\x5a\xf8\xc3\x7c\x52\x29\xc1\x63\xa4\x43\x15\x7b\xe3\x11\x6d\x81\x2e\xbc\x9d\x74\xe1\x64\x70\x35\x1c\xf2\xfe\xde\x37\xdf\xda\x1a\xe3\xa2\x73\x29\x6d\xe6\x4b\xac\x22\x85\x8a\xd0\x80\x8b\x08\xe7\xc4\x85\xb6\x87\x27\xc0\xd5\x7c\xce\x44\x1c\x11\xe2\x17\x36\x44\x4e\x8f\xae\x96\x71\xea\x86\x30\x6d\xc3\xdd\xae\x44\x44\x43\x98\xb7\x8e\x4d\x6f\xc3\x26\x4a\x91\x34\x1d\xc7\x0e\x8e\xa4\x43\x23\xe9\xe0\x48\x3a\x38\x12\x59\x54\xee\xc3\xb6\x89\xda\x49\x71\x95\xbe\x12\x56\xf5\x23\x79\x56\x5f\x09\xad\xfa\x4a\x48\xd5\x8f\x2a\xcf\x7d\xbb\xbd\xd7\x26\xac\xe5\x4b\x0d\x64\x3f\x62\xa4\x02\x64\xb5\x58\x48\x8a\x22\x0b\x6c\xa6\x58\x03\xc5\x68\xba\x8a\xc5\x74\x13\xa2\x81\x4f\xf8\xca\x48\x48\x82\x53\x1e\x0c\xd6\xd7\xfd\xe3\x98\xb1\x45\x87\x62\x94\x6c\xea\x8a\x97\x0a\xc7\x4b\xb6\x4f\x52\xac\x74\x1c\xff\xa1\xfb\x27\x0d\x96\xe0\x0c\xc0\x0b\x36\xfc\x36\xea\x88\xc2\x11\xeb\xea\x8b\x06\x54\x05\x24\x79\x36\xec\x36\xbc\xf7\xb3\x06\x3e\xa3\xdf\xe7\x16\x64\xc9\x8b\x3c\x79\xe9\x5a\xb6\x7a\x88\xb3\xc4\x8d\x02\x6e\x14\xa7\x31\x9e\x35\xc9\xe5\x19\xc9\x9d\x56\x5d\x28\xc4\x28\x3a\x0a\x08\x24\x8f\x2e\x3c\xb9\x84\xb9\x37\x35\x63\xd2\xd5\x2d\x40\x60\x84\xf6\x63\xad\x80\xc0\x2e\xd7\x85\x1c\x09\xcf\x70\xfe\x68\x04\xd6\x93\x67\xe2\x71\x08\x93\x1d\xa8\xb3\x0f\xaf\xf8\x84\xbc\x70\xe1\x08\x94\x31\x6e\x10\x84\xdb\xd1\x31\x08\xc7\x5f\x1b\x5a\xa0\xb1\x2b\x0c\x4e\x15\xc2\x88\xb2\xed\x00\x0c\x76\x76\x43\x09\x83\x9d\xf8\x30\xa4\xa4\x8e\x38\x0c\xe5\xb3\xd2\x06\x33\x11\xd5\xc8\x62\x6d\x2a\xd0\x8e\xb2\xe6\x5e\x74\x18\x7a\x78\x88\xc1\xb9\xbd\xe7\x25\x0e\xc3\x60\xf5\x61\x18\xe8\x87\xa1\x4e\xed\xdf\xad\xc4\x37\x84\x46\x49\x7c\xe3\xed\xfa\x80\x73\xec\x2d\x15\x5e\x0a\x93\x3d\xa1\x04\x08\x0f\x78\x9f\xda\x86\xf9\x23\xd4\x24\x28\xef\xb6\x36\x78\xa1\x5b\x66\xbc\x49\xdf\xc8\x81\x75\x10\x5a\xae\x03\x67\xd9\x5d\x28\x5e\x2e\x7c\x36\xe6\x18\xe7\x11\x2f\x13\xf2\xdd\xdd\x76\x7c\x8b\xd0\xa7\x66\xbb\xe4\x18\x91\x1e\x70\x03\xf6\xf1\x82\xef\x73\x1f\xe8\x3c\x31\x45\xd5\x13\xa3\x4f\xd0\xd4\x27\x68\x1a\xd2\xf3\x90\x9e\x3b\x62\xa4\xf1\x15\x71\xfd\x1f\xf1\x6a\x74\x94\x29\xbc\xba\x78\x9e\xdd\x02\xfe\x5f\x81\x64\xcf\xea\x9a\x71\x31\xd4\x52\x42\xbe\xe8\x7c\x33\x75\xa1\x46\xb0\x0c\xcf\xd2\x12\x1f\x01\x8b\x69\x60\x76\xfa\x83\xc0\x0f\xa8\x77\x84\x34\x3f\xa6\xc4\x3f\x02\x10\x9f\x84\xde\x4e\xe3\xe2\x15\xef\x0a\xda\x80\xd7\x01\x38\xdb\x9a\x32\x24\x2a\xdc\x93\x3e\x64\x00\xf3\x14\xc0\x2c\x05\x78\x18\xa2\x6a\x51\xa0\x70\x95\x44\xbb\x02\x86\xc5\xc1\xa8\xe0\x17\xcf\x46\xaa\x1d\x42\xed\x10\x6a\x53\x46\xd0\xc4\x36\xd4\xb3\xde\x8c\x63\x0b\xdd\x6b\x5a\x15\x87\x56\x05\xa7\xa7\x4d\x51\xcc\xb9\x92\x01\xc5\xc6\x32\x78\x56\x23\x2c\xeb\x8e\xe1\x12\xe4\x85\xda\x89\xd4\x41\xa4\xfb\x3c\x82\x07\xbc\xc5\x37\xe5\xbd\x52\x1b\x28\xd9\x1b\xa0\x61\x4b\x75\x52\xec\xcb\xab\x5b\x62\x20\xee\xf6\xb1\x5a\xdb\x7a\x4d\x87\xbf\xed\x0e\x2a\xd4\xc0\xac\x5a\xaf\xa9\x70\xd7\xc6\x03\x00\x5f\xa6\x22\xeb\xd4\x15\x6f\x94\x45\xb7\x14\x21\xfa\x41\x24\x64\x42\xf7\x31\xd6\xab\xde\x82\xa8\x8f\xa8\x11\xea\xe8\xf5\x55\x6d\xa0\x95\x37\xec\x50\x5e\x38\x63\x07\x3a\x42\x9d\x47\x3e\x1f\x22\x8c\xe3\xc7\xa9\x26\x71\x48\xf0\x2c\x8e\x23\xbb\xbb\x81\xa7\x66\x7f\xa3\x0f\x65\x86\x1b\x43\xcc\xdd\x68\xd3\xb9\x98\x1a\xfe\x46\xfd\xb1\x4e\xaa\x4d\xbf\xfd\xe8\x17\xd3\x91\x3c\xd7\x5c\x37\xce\x43\xbc\xee\x44\x52\xda\x10\xc7\x7b\x44\xcc\xdd\x16\x73\xc3\x0a\x4c\xaf\xdf\x24\x5c\x8d\x73\xb6\x47\x08\x04\x6d\xbd\x05\xa8\x7a\x0c\xef\xff\x31\x87\xed\x8b\x12\xc0\x7b\x12\xae\x0d\x49\x4d\x34\x71\x62\x89\x96\xe8\xc2\xc2\x93\xc7\x15\x3c\xc8\xe3\x8a\xd3\x23\x96\xc1\xc4\xf8\xa8\x12\x2b\xec\xb3\x4f\x22\x51\xd7\xf8\xe4\xfa\x6e\x59\xa2\x66\xb8\x20\x45\xf0\x7c\x23\x1a\x9c\x6c\x15\xc4\xb3\x30\x59\x50\x19\x83\x38\x03\x4f\x66\xa4\x25\x88\xf4\x89\xea\xab\xf3\x5c\x3e\xaa\xda\xea\x4c\x57\x8f\x54\xf7\x62\xa6\x13\xed\xf9\x88\x3b\xf1\xb5\xe7\x40\x30\x5c\x44\xf6\x68\x5b\xc9\xd7\xb6\x92\x84\x57\x5f\x6e\x22\x68\x3e\x2f\xd5\x44\x57\x93\x56\x89\x0d\x06\x8c\x11\xb5\x5e\x6d\x99\xb1\x8e\xb5\x1a\x84\x1f\x0d\xc1\x57\x03\xf0\x55\xf7\x63\xce\x42\xf2\x80\x4e\x49\x90\x19\x1a\xef\xa8\x89\x22\xc5\xf1\x11\x0a\x16\x52\x92\x27\xce\x12\x79\xc2\x05\x6d\xb2\xa0\x48\x7b\x5c\x4f\x2c\x9d\x13\xeb\x96\x1f\xee\x28\x89\x0d\x6d\xca\xcf\x06\x6a\xe0\xf8\xb0\x95\x02\xda\x89\xf0\xf4\x3b\xc0\x3d\x62\x12\x68\x39\x8d\x70\xbf\x49\xd7\x36\x68\x9b\xa0\x4e\xe3\x46\xaf\x08\x9f\x97\xc7\x1e\x82\xc5\x23\x4c\xbb\xcb\xa4\x66\x07\x81\x39\x11\xe9\x3e\x29\x5f\xfb\xa8\x89\x41\x97\xd5\x74\x67\x5d\x46\x4e\xc1\x57\x8a\x29\x7b\x8d\x2e\xcb\x36\x31\x0e\x43\x57\xa8\x0a\x11\x54\xc8\x0b\x4b\xd6\x4e\x61\x08\x4b\x53\x7a\x31\x00\xca\x16\xde\xb3\xf4\xce\x9d\xa1\xa1\xf2\xc4\x73\x56\xea\xe7\xe1\xa9\x47\xce\xfd\xfb\xe4\xb7\x20\xe6\xca\x23\x21\x74\x44\xf3\x69\x78\x1d\x06\xf5\xfc\xd1\xa0\xda\x4a\xc5\xdc\x19\xe3\xe2\xc0\x6c\xa8\x47\xeb\x6b\x9d\xa6\xa9\xa1\x12\x1a\xb7\xa8\xe0\xdf\xb6\xd3\xe8\x11\x32\xbe\x00\x44\x28\x14\x04\x49\xa0\xa8\x11\x24\x96\xed\x00\x88\x0f\x98\x14\xa1\x23\xdb\x45\xaa\x5a\xf8\xf8\xb4\x1e\xb8\xa2\xbd\xa3\xcd\xed\xb1\x0e\x40\x0a\xad\x38\xe6\xb3\x21\x5e\xad\x48\x44\xfe\xa9\x0f\x7c\x3c\x3a\x0a\x46\x7e\x9e\xe4\x4d\xef\xef\x1d\x4c\x82\xda\x5d\xa5\xd1\xdc\x67\x5d\xaa\x22\x2f\x17\x5d\xb1\x4c\x2b\x67\x08\xc5\xf4\x38\x4b\x80\x19\x08\xfc\x12\x74\x8b\x9f\xe4\x69\xa3\x10\x99\xc8\xa6\x2b\x5a\x25\x9a\x57\xc9\xbd\x3f\x97\x23\x8e\x4f\xdc\xf3\xf8\x0b\x17\x48\x3e\x5e\x20\x21\x6f\xd0\x41\x07\x66\x78\xa7\xd3\x2f\x47\xba\x45\x8d\x57\x34\x53\x2b\xaa\xa7\xeb\x43\xe5\x14\xa6\x23\x76\x94\xd4\x63\xc5\x0d\x4b\x6e\x91\xe9\x32\x1c\x25\x81\xfc\x74\x73\x8b\x65\x76\x3b\x24\x73\x93\xe6\x25\xda\x0e\xef\xc0\x8c\x30\x39\x89\x01\x1c\x8e\xb1\xb0\x53\xb6\x46\x2a\xca\xb2\x35\x29\x5d\x10\xc6\x2c\x71\x23\x26\x23\x43\x17\x4c\x48\x09\x8c\x21\xaf\xcb\xf7\x9b\x91\x50\x01\xbe\x83\x58\x49\x99\x3d\x88\xcf\xf1\xbf\xf0\x72\x5d\x62\x4c\xad\x67\xb2\x0b\x43\x08\x78\x3d\x94\xa2\x07\x24\x99\x85\xb8\x42\xae\x5a\xe3\xd0\x69\x8a\xa5\x0a\x92\x28\xe0\x66\x91\xf1\xd7\xaf\x9f\x63\x02\x48\x98\xad\x5b\x77\x68\x8c\xa5\x74\xd3\xaa\xa8\x9a\x56\x45\xcd\x34\xba\x7c\x45\x0e\xb2\xfa\x68\xdd\xa1\x9d\x16\x6d\xc4\x2e\xeb\xa6\x30\xa9\x71\xfe\xda\xdc\xe8\x24\xcd\x7b\xa5\xc9\x09\xec\x6a\x98\x5e\x1e\x93\xcf\xa4\x38\xf4\x6f\xf6\x01\xcf\xe6\x55\x9d\x48\xff\x1b\x9d\xc8\x87\x9a\x64\x45\x9b\xae\xdb\xff\x99\xe9\x1a\xfc\x3b\xd3\xd5\x65\x68\x58\x93\xfd\x9f\x9a\xae\xc3\x7f\x67\xb6\x56\xf7\xe1\xa3\xd9\x0a\x97\x29\xe9\x44\x5f\xd5\xc1\x13\x79\xb0\x52\x1c\xb7\x4b\xc0\xda\x95\x94\xd0\x01\xd0\x62\xc8\x4a\xfe\x49\xf8\xa3\x54\xc4\xe6\x58\x2f\x85\x01\x35\xf3\x0f\x31\x73\x8d\x44\xe9\x18\x31\x9a\xb8\xc4\x9c\x53\x6f\x7d\x60\x83\x31\x84\xc3\x84\x14\x9e\xf1\xad\xf6\xc0\x06\x03\x0a\x69\xad\x24\x5f\xf2\x0e\x11\xef\x58\x7d\xed\x03\x07\x45\xd9\x3e\x52\xcd\x25\x85\xdd\x34\x6f\xc6\xc7\xfc\x43\x72\xd8\x41\x89\xe5\x95\x89\xfc\x83\x3c\xe1\x6d\x38\x57\x61\x28\xa1\xb4\x0d\x46\x1b\x9d\x90\x8e\x6f\x97\x58\x61\x69\xff\x42\x8e\x7d\x12\xf2\xc2\xfb\x45\x6d\xda\x59\x40\xba\xb4\x68\xa3\x23\x2c\x86\x93\xfa\x0b\x4c\x1f\x42\xbd\x1a\x99\xb4\x79\x92\x97\x70\x50\x3e\xa6\x90\x72\x7c\xf9\x46\x27\xa0\x56\xb3\x7c\x48\x8b\x40\xa5\x17\x44\x7c\xa4\x42\x76\x95\xd0\x3b\x27\x8d\x8a\x7d\x5c\xa6\xc4\xe7\xcb\x42\x2c\x10\x6b\x8b\x90\x01\x15\x2d\x0c\x9a\xd1\x3c\xed\xac\xb2\x18\x77\x4e\x0d\xe5\x9f\xfb\x61\x4b\x7a\x74\xf9\x74\x0b\xc9\x1f\x59\xd2\x9f\x3f\x4b\xd3\xdb\x48\x7f\x75\xad\x85\x6a\xbf\x9d\x58\xbe\x89\x46\xfe\x54\xe8\xda\x70\xe8\x85\xf1\xb6\xf1\xd6\x56\x17\x2b\x31\x2d\x24\x1c\x04\xb0\x40\xd8\x1b\x60\x3b\xbe\x2e\x81\xa4\xc5\x05\xe2\x4a\x9d\x51\xf2\x28\x7e\xe0\xa8\x88\x8e\x06\x9c\xe8\xcc\x7f\x2a\x39\x50\x21\xff\x0a\x81\x63\xae\xbb\x31\x1f\x8e\x6d\x86\x44\x43\xd1\x5f\x94\x35\x3c\x70\x3a\x8d\x96\x1b\xc3\xbf\x1d\x0c\x24\x1c\x37\x09\x50\xab\x20\xde\x93\x45\x3d\xa1\x5f\x4a\x35\xa4\x28\xfd\x2d\xea\xbe\x1a\x92\xa9\x1e\x90\x6a\x25\xc2\x71\x75\xef\x13\x9f\x52\xaa\x1b\xf2\x4b\xd2\x58\x85\x0e\x5a\xd1\x76\x91\x23\xd5\x82\x4e\x17\x8a\x1c\xc5\x03\xee\x72\xd3\xdd\x85\x46\x01\xca\x50\x44\x26\x56\xeb\x9f\x67\xe3\x13\xb1\xe3\xd4\xce\xca\xd9\x38\xd6\xf5\x3e\xba\xcd\x48\x31\x87\x6a\x98\x73\xa5\x96\x41\xce\x18\x1e\xb6\x16\x35\xa5\xfe\x6d\x80\x89\x14\x33\x13\x73\x2c\x77\x55\xc2\xd7\x40\x80\xb6\xff\x30\xed\xc0\x89\x89\xd7\x2c\x8b\x96\xc2\xa7\xdb\x9e\x40\xf8\x1d\x58\x5e\xd8\x00\x7f\x7d\x65\x1d\xa9\xb5\xcb\x54\xbb\xf2\x49\x35\x89\xf6\x25\xb2\x35\xb6\xb4\x76\x11\xb5\x15\x2d\x9d\xa3\x6b\xd3\xb8\xda\x9a\x85\xa6\x26\xe8\x8c\x4b\xa1\x60\x30\x7a\xad\x0b\x13\xf5\x44\x9f\x5c\xe8\x13\x8f\xf2\x65\x52\x56\xab\x82\x0a\xbf\xae\xec\xa0\x5a\xb9\x78\xc1\x42\xd4\x62\x8e\x56\x2c\x16\x8f\xb6\x8e\x79\xa4\x1e\xf7\x0a\x8b\xf3\x0a\x44\x98\x40\x10\x53\x8c\xa7\x1f\xbd\xf5\x65\x74\xf5\x2b\x21\xcd\x7d\x95\x06\x6d\x40\xae\x3b\x12\x48\xf0\x1a\x3a\xef\xbe\xaa\x37\xc4\x84\xda\x77\x1e\xc5\x77\x92\xf9\xd2\x3d\x06\xea\xef\x3a\xd2\x57\x46\x05\x9e\x2b\xe2\xf1\x18\x31\xf2\xb1\x2b\x5e\xaa\xf8\x52\x95\x2f\x43\xc7\x9e\xf4\x5a\xde\x1a\x05\x60\x87\xb7\x3d\xfc\x93\x3b\x97\x81\x11\x90\xcf\xf0\xa4\xf4\xf9\xd0\x51\x67\x36\x1a\xb2\x71\x32\x64\x43\x2b\x28\xea\x44\xdc\x06\xd9\xb5\xd1\x5f\xe1\x02\x45\xa2\xc8\x03\xfb\xf3\x67\x0e\x3f\x73\xe8\x3d\xba\x8e\xba\xfd\xba\xec\xa9\x47\xac\x23\xfa\x20\x10\xfd\x4f\xe8\x9e\x49\x90\xd7\x9a\x8f\xcd\xe6\xe0\x94\x3e\x81\x0d\xf0\x9a\xf2\x50\x68\x84\xfc\x1a\x8e\x16\x69\x78\x4a\x9f\x42\x3a\x6a\xa6\x3b\x1c\x6d\x19\x19\x0e\x3e\x96\x1f\x35\xa6\xc0\xce\xf9\xe2\xc6\xdb\xa1\x17\x07\x5f\x84\x48\x17\xd7\xa9\xdc\x41\x1b\x48\x64\x82\xf1\x0e\x9a\x32\x19\xd6\x42\x3b\x29\xc7\xbe\x46\x87\x09\x8f\xad\x0f\x2d\x66\xda\xc7\xd2\xd1\x35\xc6\x18\x6a\x0c\xdc\xa6\xf1\xe7\xc1\x5c\x75\x5f\x15\x85\x9b\x2f\x62\xf4\x25\x98\xc9\x73\xed\xb2\xc9\xb1\xdf\xe6\x4c\x38\x4c\xe0\xca\x61\x42\x34\x23\x6e\x93\xda\xbd\x7f\xc0\x53\x0d\x26\x0f\x83\xa7\x50\xca\x15\x1c\xb3\xc5\x16\x92\xde\x83\x27\xa3\x88\x19\x18\xf6\x03\xbd\x30\x12\x53\xbb\xf7\xd8\x26\xf9\x7c\xee\x8f\x91\xd4\x35\x73\xc8\x97\x3d\xd9\x11\xbd\xcd\xf3\x58\x0a\x6f\xc9\x02\x33\x76\x06\xe9\x08\x8d\x96\x73\x74\x87\xcf\x3a\xc7\x1c\xe5\x46\x31\x2d\xf0\x24\xc6\x8c\x4c\x3a\xe4\x45\x41\x90\x48\xb3\x64\x98\x53\x21\x96\x8f\x3b\x40\xdd\xf0\x41\x3b\x77\x00\x0f\x14\x1e\x35\x77\xd9\xe1\x51\x8c\xd5\x43\x95\x5d\x8c\xb2\xcf\xb4\xec\xaa\xca\x2e\x44\xd9\x57\x5a\xf6\xbe\xca\x7e\x89\xb2\x2b\x5a\xf6\x85\xca\x3e\x8a\xb2\x4f\xb5\xec\xa9\xca\x9e\x44\xd9\x65\xc8\x6e\x2e\x47\xf2\x0b\x07\xdc\x6b\xf9\xdd\x91\x8c\xba\x96\xcd\xbd\x42\x0d\x7a\xdc\xca\x8d\xe0\xf1\x35\x9b\x2b\x17\xd8\x94\xfe\xbe\x6e\xe5\x0e\xe1\x79\x8b\x42\x29\x7e\x10\x03\xb1\xfe\x30\x97\x31\x15\x57\x44\x21\x7c\xf8\x4b\xad\x39\x9b\xfc\x7b\xd5\x3e\x0c\x20\x47\xb9\x7f\x0b\x44\x28\x25\xf4\x9d\x02\x8b\x42\x12\x7e\x4a\x44\x01\xfc\x39\xcf\x9f\xd7\x2d\x0a\x7d\xd5\x82\xc3\x17\xb6\xa3\x08\x4a\x7b\xa1\x34\x89\x86\x87\x0c\x09\xbb\x1a\x26\x0e\xf5\x54\xd5\xa9\x7e\x9c\x96\xe8\xcb\x8b\x0c\x49\xc9\x1e\x7c\x5a\x1d\x98\x51\x7d\xfc\x17\x7a\xb5\x87\xd5\xe9\xd4\xb7\x27\xf8\xfc\x53\x6b\xe6\x7b\xa2\x77\x7e\x17\x63\x02\x56\xf0\x5a\x9c\x02\xf1\xe1\x28\x3e\x67\x97\x7b\x73\x89\xb1\x46\x07\x2d\x7f\x58\x43\x21\xf9\xb0\xa8\x07\x34\xb4\xbe\xff\x3b\x1d\x5d\x19\x84\x73\x21\x84\xe3\xe5\xea\xb1\xfc\xd7\xaa\xd2\x70\x87\x7d\x00\x6a\xd2\xd6\x73\xf2\xb4\x6b\x23\x73\x96\x73\x8c\x5f\xa1\x91\xf3\x17\x9a\x36\x38\xe0\x80\x7b\xbc\xc9\xe3\x8d\x32\x60\x04\xae\x5c\x1e\xd5\x01\xd3\x41\x0a\xca\x63\xec\xcb\x3d\x40\xb3\x2f\x28\x37\xc2\x6d\xe3\x0f\xde\xdf\xf1\x42\xa4\xf5\x88\x24\x8a\x08\x7c\x0c\x29\x26\x3a\x98\x39\x42\xc7\x31\x6c\xa1\x70\xf9\xc9\x38\x85\x74\x66\x6d\xed\xd0\xd1\x9d\xac\x08\xb9\x67\x51\xae\x1e\xf5\x2c\x36\xa2\x59\x0a\xf1\x13\x46\x0e\xa3\x94\x0f\xa9\xc1\x93\x8a\xec\x73\xe2\xd9\xf2\xf0\x3b\xe2\x76\xd0\x53\xee\x28\x0f\x81\xdb\x7a\xe3\x4e\xce\x4b\x78\xf3\xf1\xd0\x9b\x4f\xc7\x85\xdf\xbb\x89\xf2\x03\x37\xf0\xed\xdb\xc8\x8b\x65\x19\xaa\xb5\x0a\x32\x67\xfa\x64\x5f\x45\x39\x25\xc8\xb1\x7e\xaa\x03\xf0\xc6\x96\xc7\xff\x5d\xc9\xce\xca\x28\x3e\x25\x7b\x4b\x3c\xdd\x3c\xdb\xdb\xe2\xe9\xf6\xd9\xfe\x26\x9e\x82\xbe\xe0\x1b\xc2\x1d\xf1\x1b\xc8\xdf\x96\xfc\x7d\xd8\xb1\xe5\x31\x3d\xbb\x11\x29\x8e\x75\x6d\x1c\x95\xd8\x6d\x4d\x51\x03\x67\xf6\x45\x5d\x5e\x19\xdf\xa0\xc8\x11\x96\x4b\xe4\xd4\x4a\xa2\xc6\xa5\x74\xa3\xb5\x2f\x5b\x98\xca\xdf\xdb\x99\xf8\xad\xcd\x34\x4b\x83\xe9\x23\x7a\x9d\xba\xa4\xa0\x42\xd3\xc7\x84\x1f\xbf\x48\xf2\x4e\xeb\x20\xa5\xee\xd6\x91\x61\xee\xc6\x0e\x82\xcf\xf3\x4a\x9b\xa0\x68\x08\x0f\xc1\x40\xcf\x61\x88\x3d\x64\xf9\x4c\xb2\xa0\x58\x7b\x32\x86\x41\x8a\xa7\xbe\xac\x3d\x8d\x87\xa3\x35\xc7\x5f\xeb\x05\xc2\x8e\xe2\x4b\xca\xa3\x70\x79\x8f\x03\x53\x06\x47\x5c\x5f\xff\xa0\xaa\x4b\xd2\xc0\x0f\x2b\xab\x73\x7f\xae\xb1\x66\x83\x27\xe5\xb8\xab\x1d\x62\x50\x05\xec\x39\x7e\x65\xfb\xb7\x17\xb5\xfe\xa5\xc8\x47\x7c\x6d\x84\x08\x62\x6d\xf8\xd0\x1b\x77\xbc\xb5\x07\x3e\xf1\xd7\xf8\x68\xad\xe3\x73\xe8\xed\xf6\x1a\x6c\xbe\xf1\x53\x77\xf8\x05\x78\x59\xe9\x62\xf7\x86\x7d\xce\xb0\x46\xe9\xa1\xa9\xd4\xe4\x65\xc6\x5d\x89\x01\x5e\xa1\x0c\x14\x6a\x1b\x12\x1c\xa2\xc4\xbc\x5a\x61\xd7\xba\x8a\xaa\xc8\xd4\x96\x9e\xfa\x07\x52\x9f\x25\xbd\x74\xf3\xac\x1c\x1b\xdc\x3c\xef\x7a\x7b\x86\x82\x22\xae\xb2\xa9\x33\x35\x46\x5f\x55\x99\x76\xe9\x41\xd9\x42\xc3\x62\xbf\x09\xa1\x04\xae\x7f\x23\x2a\xa4\x7f\x0f\xbe\x61\xe6\x3e\x29\x98\x8d\x02\x53\xd2\xc5\x91\xea\xc7\x6d\xd4\x8f\x5b\xea\x07\x57\xc9\xe2\xfb\xaa\xdd\x50\x6f\x17\xea\x00\xc7\x55\x89\xf6\xce\xc9\x8c\x93\x50\x39\xa7\x36\x85\x14\x64\x17\x29\x0a\x84\x63\x9d\x3d\x23\x5a\x8a\x75\xc7\x5c\xeb\x14\x59\x93\x58\x2c\xeb\x5a\xe3\x27\x03\x23\x9c\xa0\x63\xba\x76\xd3\xf6\xe6\xc0\x7b\xd8\x0d\x71\xad\x79\x57\x64\xb7\x61\x2e\xfe\x5a\xe3\xeb\x94\xb3\x41\xb9\x89\x9f\x64\x47\x27\x18\xb8\xfc\x3e\xe4\xb9\x90\xb5\x73\x8d\x26\xf3\x5e\x78\x4e\x4e\x10\xf3\xd5\xf3\xed\x6c\x8e\xfd\x28\x8f\x6c\x1f\x7e\x06\x65\x1b\xd9\x6e\xd8\x80\xa4\x72\x8e\xbf\xf2\x26\x77\x08\x9b\xdd\xb1\x8e\xbb\x68\x0d\xa3\x85\xdb\x39\x5e\x71\x83\xce\x11\xfa\x64\x9c\x3c\x1a\x8e\xaf\x86\x13\xd8\x5e\xa3\x82\xe2\x72\x8e\x60\x80\x96\x75\xea\x15\xd6\x1f\x00\x68\x5a\x03\xf4\xeb\x93\x5c\x23\xc4\x17\x17\x5f\x42\xcd\x41\xd3\x55\x9d\x28\x3d\x99\x10\x52\x82\x4b\x32\x8e\x18\xe5\xf7\x8e\x57\x5a\xf4\x61\x77\xb0\x67\x0b\x3d\xa2\x40\x70\x80\x64\xa5\x96\x03\xea\xfc\xe0\x8d\x09\xeb\xe2\x15\x3c\x7a\xe7\xe9\x62\x17\x3b\x2c\x80\x4d\x60\xb2\xa1\xdd\xb5\x4a\x3c\x7a\x1d\xc7\xb9\x38\x9e\x49\xfc\x8a\xe3\x99\x45\x2e\x1e\x64\xff\x01\xd4\xc8\x2c\x2c\x2a\x05\x50\x28\x55\x64\x67\x26\xfa\xa4\x12\xc0\x21\xef\x2d\xb1\x47\x85\xa5\x26\x6e\x9f\x49\x2d\x33\x6a\xe2\x36\x6a\xa2\xb0\xdc\x04\x0e\xe2\xc4\x33\x86\x50\xee\x88\x9b\x8d\x01\xf1\xd8\x01\x6d\x97\x9a\x19\x20\x96\xbc\x7f\x32\xf0\x97\xcd\x62\xc9\x7b\x20\xb7\x93\x98\xa0\xa2\x3d\x63\x67\xd0\x4c\x6d\xd6\x28\x0a\xbb\xc6\x33\x91\x71\x66\xb7\xaa\xa9\x62\xaa\xee\xb3\x53\x3c\x45\x00\x4e\xd8\x59\xaa\x5c\x82\x4f\x01\x8e\x86\x7e\xcd\x80\x32\xff\x4f\x7a\xa9\xa2\xb3\x9c\x53\x44\xe1\xa8\x90\x8a\x9b\x43\x14\x7e\x39\x26\x38\x3d\xb3\x6b\x2a\xe5\xf0\x90\x15\x31\x41\x1e\xff\xa7\x78\x55\x55\x9e\xe5\xae\x58\x69\x96\x3b\x03\xb0\x13\xbd\xb0\xcf\xf2\xd4\xfe\x41\xd3\x28\x92\x94\x1e\xb0\xfe\x27\x1a\xc8\xfe\x0d\x2b\xa0\x6b\xab\x97\x9a\x11\x22\xe8\x8c\x01\x5d\xe1\x4b\x1b\x5f\x26\x02\x6c\x80\x69\x18\x47\x1a\xc2\x93\x3d\x31\x63\x39\xe3\xba\x4e\x0e\xae\xd6\xd7\xe1\xa1\x0d\x65\xf1\xb6\xd8\xea\xba\xc6\x18\xbd\x02\xc1\xef\x84\x44\x29\x81\xe5\xde\xa2\xb2\x15\x02\xeb\x5b\xcb\xcb\xf5\x29\x8a\x72\x6e\xc8\xfe\xc0\x36\xeb\x02\xb1\x92\xc3\x99\x66\x9e\x0f\x7b\xee\x26\x40\xce\x6e\x0c\x9c\xdd\x44\x46\x8c\x9e\x51\x70\xf1\x5c\x01\x7d\xfc\x73\x40\xd6\x64\x91\x63\x91\xdf\xfa\x80\x84\x57\x5c\x2e\x0d\xc7\x03\xad\x50\x06\x38\xb6\x30\x64\xea\xf4\x06\xa5\x4e\xfc\xbb\x81\xe9\xf1\x42\x71\xb5\x50\x71\x5c\x4a\x2e\xe6\x9d\xe0\x1b\x09\x13\x78\xf3\x31\x9a\x1c\xc7\x99\x73\x50\x60\x54\x9e\xe1\x95\x29\x7c\xfb\x98\xae\xa9\xde\x84\x15\x92\x8f\x66\x74\x8e\x18\x8c\x6b\x95\x66\x4a\x11\x5a\xbf\xcd\x73\x61\x35\x80\x55\xbc\xc2\xb8\x15\x78\x69\x05\x67\xef\xf0\x48\x75\x71\xff\x26\x3a\x52\xdd\xd5\x9e\x06\xf5\x63\xa9\xc4\x95\x17\x1c\xdc\x36\x7e\x22\x05\x77\x8e\x87\x08\x0e\x89\x69\xe9\xa6\x7b\x87\x4d\x78\x67\x0c\x44\x0c\x70\x36\x5a\x7a\x4b\xa5\xfb\x73\x75\x6d\x28\x31\x3a\xfa\x53\x4c\xb4\x8a\x3b\xcd\xa3\x01\x6b\xf5\x83\xb8\xbe\x69\xea\x0d\xdc\x8a\x7b\x1f\xbd\x81\xdb\x55\x0d\x84\xaa\x01\x77\x1e\x9d\xc8\x32\xdf\x61\x95\x64\x88\xe2\xfe\x71\xe4\xad\xfa\xfe\x49\xd1\x50\x03\xe9\xf6\x93\x3f\xdb\x69\x49\x4c\x85\x43\x95\x59\x3d\x82\xc4\xf9\xa7\xbe\x10\x34\xb8\xb0\xa7\x47\xcb\x6a\x8e\xf2\x02\x30\x23\xae\x20\x28\x6e\xc1\x07\x51\x80\x15\x67\x0e\x6b\xf8\x44\x01\x4d\x65\x1d\x93\x8c\x94\x31\x50\x29\xbc\x72\xe1\xf4\xdd\x54\xfd\xcc\x32\xd5\x3f\x1e\x39\x8b\x87\x4e\xc7\x2f\xd0\xc9\x8c\xae\x6a\x26\xfc\xf6\x58\x3b\x1b\xd4\x74\x3a\x0b\x9b\x46\x46\x83\x10\xd6\xfc\x22\xdf\xc8\x66\x32\x69\xc7\xdc\x84\x1f\x55\x10\xaf\xab\x55\x8c\x07\xe5\xbb\x59\xcf\x06\xbe\xe6\x99\xf8\x71\xa5\xd6\x02\x07\x55\x5a\x35\x0d\x8f\xd4\xa5\x2c\x7c\x58\xbd\xb6\x51\x46\x40\x57\x33\x99\xa6\x22\x0d\x60\x72\xb3\xcc\x21\x1f\x81\x22\xe8\x85\x69\x2a\x67\x08\x58\x2b\xa5\xda\x93\xd3\x90\xc6\x44\xd5\x68\x28\x5e\x4d\xdc\xfb\x1f\x4d\x31\x47\x97\x84\xfc\x77\x47\x51\xd8\x30\x83\x40\x4d\xb8\x80\x4d\x32\xbb\xee\x9e\x9b\x1b\x1c\xcb\xbb\x48\xf2\x24\x24\x1c\x64\xa9\x09\x96\x15\x36\x8c\xac\x74\xdc\x1c\x0e\xf7\x3e\x89\xd0\x20\x9b\x32\xcf\xcc\xc9\x50\x1d\xea\xdd\xcc\xc7\x85\x25\xad\xc2\x9f\x77\x17\x46\x4c\x11\xb6\x55\x74\x5c\x59\xc6\x8c\x9a\x48\x02\x22\x7c\x9f\xa7\x64\x99\x08\x0a\x65\x4a\x38\xd4\xe1\x59\x2c\x86\xe6\xec\x20\x93\x77\x84\x50\xc7\x11\x97\xeb\x9f\x8f\x01\xca\xd0\x45\x8c\x24\x9c\x81\xb2\x8a\xec\xdc\xa2\x56\x86\xc7\x49\x1f\x98\x18\x36\x83\xc6\x42\x0e\x5c\xa6\x5d\x9e\x02\x04\xc3\x9f\xad\x51\xef\x62\xe0\xbb\xad\x21\x4e\x77\x36\x63\xa6\x33\x66\x2c\x54\x22\x31\xe0\x51\x1a\xeb\xa9\xc0\x9b\xa9\x2c\xd1\x50\xd4\x88\xe1\x6d\x70\x18\x57\x0a\xdb\x31\x97\x1b\x4a\x5d\xfa\xab\x02\x3c\x8e\x16\x87\x47\x51\x39\x51\x70\x45\x5f\x83\x0f\xb8\xd1\x07\x5c\xfa\xb6\xa9\x7d\x66\x55\x98\xcf\xc1\xe2\xfd\x15\x6e\x3b\xdb\x8e\xa2\xa3\x67\xe5\x25\x7a\x14\x31\x17\x23\xfa\xb8\xd2\x58\xdf\x55\x9a\x1d\xd2\x35\x04\x02\x94\x2f\xd5\x8d\x89\x32\xca\xec\x62\xe0\x1a\xa0\x88\xda\x7b\xc1\x6f\x7f\x6f\xff\xd1\x70\xe9\x2b\x39\x37\x17\xee\xc9\x90\x0e\xa8\xb2\xde\xde\x93\xb1\x1f\x28\x0f\x00\x43\x38\x63\x07\xe2\xcf\xb6\x7e\x6e\x70\x68\x23\x6b\x6d\xc1\x6f\x40\x31\x4d\x84\x82\x0a\xff\xed\x03\xbf\xbc\xeb\xbc\xbf\x3b\xbf\x6d\x60\x54\xde\x5c\x8c\x47\x00\x44\x93\xd7\x93\x97\x35\x1c\x55\x9e\x51\x1b\x12\x85\x72\xe1\xfb\xfb\xe7\x13\xd4\x84\xa0\x00\x19\x9d\xf7\x77\xd8\x6d\x38\xb0\x70\x2f\x1b\x47\x13\x12\x5b\x3c\x2d\x42\xa1\x08\x0d\x92\xd0\x34\x37\x1f\x1a\xf5\x19\x6d\x77\x73\x23\x2e\x2a\xb1\x42\x07\x43\x15\x6d\xd8\x99\x5d\x6c\x48\x61\x16\xc8\xd9\xd9\x68\x1b\x9d\x8d\x70\x73\x07\xa3\x96\x6c\x76\x4c\x5c\x99\xf9\xcb\x43\xab\xe3\x43\xdf\xc3\xdf\x78\x39\x18\xee\xda\xe8\x49\x62\xe7\x37\x05\x1a\x84\x1f\x74\x30\x12\xc5\x7f\xde\xb3\x76\x76\xf9\x9e\x70\x59\x6b\xe6\xb2\x90\xa3\x39\xdf\x8e\x29\x5c\xc5\x7e\x4b\x8e\x7c\xc6\x6d\x77\xef\x6b\x17\x08\xd2\xc2\x90\xb3\x0a\x05\xae\xcf\x5d\xea\x0c\xb9\xc3\x0e\x86\x82\x17\x5f\xe1\x59\xb7\x23\x3d\x58\x43\x33\x68\x5f\x07\x14\xf1\x24\x77\xa9\xf0\x46\xef\xd6\xae\x63\xcb\xfb\x43\x75\x37\xf7\x24\x6f\x70\x03\x57\x39\x82\x1e\xd3\xb9\x90\xbf\x7e\x59\x19\xbb\x5c\xb6\x8d\xc6\x03\xab\x83\x9b\x23\x56\x93\x7d\x45\x69\x32\x85\x3a\x0f\x7d\x12\xf7\x7c\x14\x67\x37\x70\xf1\x5a\xa7\x95\x8c\xfb\xa1\x7a\x45\xc1\x02\xf8\xf7\xe5\x3c\xe8\xb9\x88\x2b\x58\x78\xd1\x1b\x46\xc8\x92\x75\x01\x5e\x64\xc9\x84\x23\x3a\x21\x4c\x7f\x1b\xf5\xfa\xf2\xb8\x16\xae\x78\x3b\x7e\x30\x52\x09\x78\xd3\x2e\x44\x53\x2a\x01\xfd\xa4\x69\x99\x52\x5c\xa5\x52\xd0\x75\x9a\xde\x56\x6f\x80\x42\x4f\xd2\xb8\xc9\xd5\x42\xa4\xdf\xe4\x94\x30\xf7\x2b\x3a\x45\xf6\xbe\xe6\xe4\x7a\x60\x70\xfb\x82\x8c\x83\xf3\x04\x1c\x0b\x6b\xa8\xd3\xf0\xc9\xfa\x1a\x8b\xe1\x63\x9f\xe2\x4a\xac\x25\x17\x42\x04\x1a\xc9\xa9\xfa\x97\x47\x39\x24\x13\x63\x3f\x06\xf3\xc5\x88\x12\xb5\x64\xd4\xcd\xdb\x2d\x05\x77\xcf\x5c\x89\x82\xee\x6a\x36\x4f\x3b\x9b\x52\xf6\x72\xfd\x08\x00\x99\x3f\xee\x8b\x8b\x8c\x8c\x39\xaf\x11\x39\x16\x8e\x3f\x5a\xce\xbb\xda\x3c\x2f\xca\x3c\x74\x97\x97\x0d\x1b\x57\xf9\x00\x17\x07\x3e\x4a\x13\x3f\x6e\x2a\x25\xfb\xb6\xb9\x35\x47\x88\xab\x2d\x46\x8a\xd6\x4b\x3f\x73\x3d\x84\xe6\x44\x69\xe3\x53\xde\xa4\xaa\xc6\x39\x99\xd9\x8e\x86\xe3\x33\x14\xbc\x0b\xef\x0c\x76\x3d\xc2\xbd\x30\x52\x74\xb1\x8c\xaa\xce\xb1\xdb\xf5\xa5\x43\x89\x89\x9a\x1c\x9a\xd3\x2b\x63\x50\x66\x4c\x72\x9b\x8d\x73\xba\x0d\x44\x31\xce\x6f\x48\xaa\xc6\x82\x92\xb3\xde\x68\xcd\xef\xf6\xc6\xe1\xc3\xda\xb0\xcf\x5d\xe1\x04\xa3\xc3\x1d\xa0\x76\xac\xb5\x33\xdf\xf7\x72\x6b\x5f\x52\x4e\xea\xcb\x5a\xd8\x1b\xe1\x23\xd5\xce\x8b\x66\xfd\xa6\xb1\xd2\x2f\x24\xac\x23\x8e\x03\x7e\x22\x75\x7f\x1b\x2d\x67\xd1\x74\xff\x37\x39\x16\xc5\x80\x1e\x32\xb0\x07\x50\x7f\x28\x95\xcc\x48\xf9\xc0\xe2\x18\x22\x27\x17\x34\x0e\x20\xa3\x5f\xa5\xf2\x44\x38\x36\x30\xbc\x3a\x0d\x0c\x25\x07\x0f\x5d\xc3\x37\xe7\x14\x26\xc8\x59\x6a\xcd\x81\xd6\xf0\xc4\xa6\x48\x41\x0d\x4a\x75\xd0\x33\x2f\x05\xba\x9a\x0a\xe5\x13\x33\x6f\xe6\xb5\x93\x6c\xaa\x56\x4c\x5b\x1d\xe9\x02\x3b\x9d\xd5\xef\x74\x1c\xd1\x2f\xf8\x41\x65\x79\xe4\xfe\x45\x28\x77\xc9\x87\x02\xd4\x04\x00\x0c\xbf\x51\x8d\x90\x3a\xad\xdb\xac\x72\x0a\xe7\x24\xd8\x9a\x50\xf1\x34\x44\x81\x87\xe2\x22\x37\x0a\x73\x86\x1a\xfb\x61\x14\x96\x9f\xca\xb5\x53\x36\x86\xcc\xc7\xd9\x0e\xc5\xa3\x5c\xe6\xb6\xdd\xde\xa4\x3e\xa0\x93\xde\x36\xcd\x58\x40\x16\x4d\x0b\xc1\xfd\xa9\x95\x80\x6a\x22\xaf\xdf\x25\x83\xd4\x94\x1d\xc8\x66\x9c\x46\x07\x56\x18\x46\x85\xda\x89\x11\x55\x33\x57\x84\x4e\x0c\x90\xaf\xc7\x0b\xce\x89\xd6\xe0\x64\x76\xe8\xde\x76\x52\x4d\x27\x7c\xe8\xd7\x17\x85\xbf\xab\x8e\x9a\x93\x43\x76\x94\x38\x69\x5a\xe7\x36\x65\x1c\x1f\xb2\x6a\x45\xf2\x2a\x78\xa4\x5c\x14\xf7\x5a\xa5\xdc\x7e\x15\x01\xa8\x16\x46\xbe\xf8\x30\x8b\x3f\x48\x8b\x14\x7c\x39\x1f\x6a\x2f\x47\x87\xda\xcb\x55\xd1\x74\xed\xab\x07\xf1\x99\x8e\x93\x94\x35\x3b\xec\xf4\xf0\xdf\x3a\xd9\xce\x07\x28\x62\xa3\x47\xef\xa7\x68\x29\x78\x91\xfd\x3e\x52\x87\xdd\x09\x82\xe7\x57\xf9\xc1\xf0\xc8\xd6\xce\xa9\x3c\x9a\x96\xc3\x1c\x62\x24\x81\x2d\x38\xac\x65\x05\x69\x49\x15\x1e\x6d\x48\xe1\x78\x77\x2c\x82\xb2\x69\x55\x37\x8d\xac\xf5\x3d\xfb\x73\x83\xfe\xaa\x40\xa8\x57\xe5\xc4\xb9\x2a\x12\x1f\xef\x51\x4a\xe1\xb0\xc7\x17\x1e\x1b\x5a\x15\x01\xbf\xd2\x54\xb7\x20\xf5\xba\xc6\xe4\xbc\xc8\xdc\x02\x62\x5f\x1c\x4d\xf8\xa2\x46\x71\xa0\x92\x1e\xa2\xa4\x40\x10\x70\x79\x21\x79\xbc\x38\xb7\x65\x5f\x65\xc4\x86\x57\xf1\x3e\x96\xbf\xad\x7b\xc5\x0a\x3e\x7d\xb7\xa3\x29\xfd\x5a\xdd\xbb\xc0\x6e\x38\x2f\x18\x0d\x56\xcd\xc0\x5d\xd9\xce\xcc\x81\x16\xa8\xff\x0d\xf1\x12\x3d\x50\x57\x28\xfd\x9f\x8e\x7a\x51\xf0\xe3\xe3\x3e\x76\x1b\x29\xef\x86\x71\x32\x91\x33\x12\xe2\x85\x95\xfc\x91\x75\x85\xe1\xd0\x45\xcb\x1f\xd2\x03\x09\x2a\x20\x86\xdc\xcf\xf6\xa5\xa9\xde\x00\x1e\x01\x36\xcd\x7d\xa9\xc3\x21\xad\x9d\xb4\x38\x3c\x59\xf6\x8b\xfd\xfa\x85\x21\x64\x34\xce\x24\x95\x8a\x22\x06\xe0\x4d\xa7\x8d\xec\x89\xee\x7f\x67\x99\x7e\x40\xc7\x77\xf9\x2c\xa9\x23\x1b\x5e\xda\xde\xda\x30\x24\xbc\xa5\xe4\xca\x99\xc2\x61\x5f\x26\x2a\x72\xa3\xf4\x2c\xcc\xa8\x88\xa0\xdd\x03\xfb\x56\x66\x49\xc0\x93\x16\x59\x40\x19\x23\x3b\x68\x6a\xdb\x83\x06\xa3\x00\x46\x73\x81\x29\xdd\xab\x5c\x95\xf3\x19\x81\x13\x05\xef\xbf\xeb\x4a\xde\x2f\xc0\x44\xe4\x20\xde\x5c\xdd\x02\x42\x8b\x08\x59\x50\x4a\x2f\x01\x29\x60\xa3\xb6\x6f\x36\xdf\xd9\x95\x20\x04\x84\x32\x34\xf0\xd9\x8e\x74\xa4\x43\xfb\x11\x95\xb0\xa9\x7f\x2c\x1e\x40\x88\xaa\x30\x24\xb7\x5a\x68\x0f\x11\xec\x81\x4a\x6a\x47\x40\x2f\x0c\xf0\xf3\x9f\xf4\xe6\xf2\xc9\xe6\xe6\x6a\xf8\x32\x88\x11\x0d\x65\x4e\x9e\xea\xc8\x11\x8b\x70\x31\x25\x0b\x29\xe6\x16\x36\x08\x6d\x72\x43\xa3\xe9\x52\x4b\xb4\xde\x49\xdb\xdc\xdc\x52\x8e\x53\x5f\x97\x57\xfa\xa4\xcd\x12\xdb\x6e\xf4\x9a\x96\xdb\x33\x99\xff\x78\x4f\xe2\x95\x1b\x7d\x15\xa9\x9b\xa6\xaa\x9f\x56\xac\xf2\xc5\xb9\x19\x79\x32\x0d\x42\xe4\xce\xe2\xd2\x7b\xea\x51\x06\xd7\x89\x20\xfc\x7c\x80\xee\xa3\xf4\xf1\xab\x58\x84\xad\xfb\xbc\x97\x40\x4f\xe4\x25\x91\x77\xe5\xd7\xa8\xac\xb2\x4f\x1d\xbf\xa6\x54\xaf\x83\x68\x3c\x3e\xc6\x14\x24\xe9\x9e\x17\x11\xb9\xde\x4f\x76\x2c\xdd\x75\x54\x72\x8d\xb7\xd7\x9c\x70\x66\x3f\xcd\xb9\x4c\x96\xec\xf8\xdd\x10\x48\xeb\x60\xde\x64\xc7\x6e\xae\x55\x62\x55\x17\x4e\x14\x86\x7a\x35\x8c\x77\xdd\x87\xde\x40\x54\x47\x0d\x9a\xb9\x62\x50\x23\x5c\x09\xfb\x93\x49\xb4\x0c\x7d\xf9\x24\x83\xa6\xb6\x71\x29\xba\xaa\xab\xac\xaf\xba\x08\x9d\x15\xb6\x60\xf9\x70\x0f\xce\x61\xec\x4f\x37\xd5\xc6\xde\xa4\xda\x73\x46\x6f\x1d\x7c\x13\xcf\x32\x1d\x69\x0a\x2c\xd9\x8f\x72\xfa\xa2\x8e\x7c\xee\xa8\x72\x14\x36\x72\x55\x9b\xed\x85\x36\x3b\x1f\xb7\x09\x79\x4c\xa5\x53\x9b\xb0\x3a\x6f\x85\x71\x4e\xa1\x7f\x56\xbc\xc8\x29\xbc\x3f\xc7\x5b\xf8\xd6\x9f\x1c\x06\xeb\x7a\xc8\xf9\x0c\x8a\x7d\xce\xb2\xbe\x0f\x73\x2b\x24\xab\xae\x55\xbc\x98\xb3\x50\x95\x08\xb0\x84\xa3\x17\x70\xd0\x71\xe5\x58\x96\x7b\xf8\x83\xb2\x44\x92\xfb\x0a\xe5\x25\x25\x6b\x5c\xe2\x32\x28\xfe\x89\x84\x70\x16\x84\xf2\x31\x64\xe7\x23\xe0\x37\x4e\x8e\x80\xcf\xd0\xcd\xf1\xf6\x75\xe9\x8b\x8c\xe9\xaa\xb6\x06\x17\x18\x30\x8d\x3e\xed\xdb\x40\xdb\x22\xaa\xcb\x98\x24\x4b\x96\x9b\x8b\x2b\x2e\x4a\x79\x5a\x77\xd3\x5b\x1b\x1c\xce\x60\x2c\x87\x1a\x57\x57\x65\xb2\x74\x19\x3c\xe5\xd1\x49\x2a\x1a\xd0\xfa\x0d\xef\x19\xe9\x27\x01\x2a\xb5\xd6\x82\xc2\x0e\xb7\x2f\x2f\x24\x82\xf5\x84\x3e\x98\x22\x0c\x50\x58\xc6\x49\xe5\x87\x5b\x15\x29\xe8\xb4\x2a\x76\xe3\xbc\xa9\x39\x3d\x67\xe2\x3a\x96\xd3\x59\x81\xb4\x4c\x60\xf5\x6e\xd0\x5a\x61\x7d\x5d\x3c\x0d\x8b\x42\x7f\xf2\x8e\x0c\xb8\x28\xf8\x0f\xa2\x9c\xe2\x31\x27\x7f\x4c\xf4\x96\x28\x01\x68\xce\x6d\x51\x9c\x4c\x14\xe1\x01\x8e\x47\x95\x24\xe5\x5b\x85\x4b\xec\x9c\x11\xb6\x14\x78\xfb\x52\x92\xca\xda\x64\x0d\x25\xf0\x5e\x10\x3b\xd3\xa6\xa6\x82\xa8\xa9\xa0\x49\xd5\x52\xa9\x20\xaf\x10\x23\xc2\x54\xf4\xe9\xbc\x8f\xa9\x28\xc4\x99\x73\x81\xf4\x78\x84\xf1\xb4\x45\x08\x8f\xb0\xe3\xe3\x57\x5b\xae\x18\x06\x0f\xc2\x17\x40\x04\x72\xe9\x2e\x60\xbb\x12\xd2\xf8\x04\x58\xe3\x06\x9b\xe7\x0a\x71\x61\x59\x20\x90\xa9\x50\x1c\x17\x22\x3e\x85\xd6\xf4\x31\x31\x31\xe2\xa0\xa9\xb2\xca\x94\x15\x26\x33\x63\xe2\xf7\xae\xbe\xe8\xf8\x40\x10\x62\x4c\xc6\x53\xf6\x36\x05\x29\xc6\x02\xf5\xbe\x6d\x6d\x6d\x7f\x47\x11\xcd\xa1\xa4\x9b\xbd\x14\xa0\xae\x54\x10\x2d\xf2\xdd\x15\xf1\x23\xf1\x37\x8e\x92\xb6\xdc\xf7\x8f\x82\xfc\x70\x7d\x11\x0f\x81\x2e\x59\x9c\xa6\x54\x28\x4b\x98\x76\x2b\xa2\xe4\x33\x47\xcb\x7a\xe9\xce\x26\x27\x9d\x7c\x6a\x76\xda\xc2\x8f\xb8\x7b\x8d\x20\x62\xf9\x01\xf3\xc8\x53\x46\xd2\x07\xb4\xb7\x57\x11\x30\x04\x05\x4c\xd8\xab\x5a\x4c\x14\xd5\x3f\x29\x97\x47\x15\x3b\xd1\xd5\xb4\xd1\x7e\xa4\x31\x7e\xe8\xf9\x0d\x58\xb9\x57\xf8\x7a\x2a\x8b\xdb\xee\x11\x13\x32\x2c\x12\x35\x00\x90\xfe\x69\xa1\x18\xef\x23\x41\x3f\xea\x6a\xce\x4d\x13\xf0\xc8\x54\xc8\x16\x34\x0f\xc4\xab\xaf\x48\x17\xf7\xbe\x5a\x17\xf9\x6a\x2a\x0f\x42\x14\x57\x9a\xe6\xf6\x60\x66\xdb\xad\xb2\x34\x60\x26\xbe\x49\xb3\x61\xf6\x84\x05\x33\x6c\x69\x8e\xfb\x59\xf8\xc8\x47\x18\x60\x3e\x70\xa7\xdd\x26\x6d\x64\xbc\x44\x7d\x9b\xe7\xc7\x56\xcb\xb3\xfb\xf0\x07\x9e\x84\x2b\x20\xe9\x40\x40\xc4\x41\xa1\x29\x9b\xd8\x21\x2e\x0c\x72\x09\xf7\xdc\x98\x30\x59\x92\xac\xaa\x4d\xa8\xb7\xcf\xe5\x19\x27\xbe\xe4\x50\x08\xe8\xf8\x84\xa3\x43\x0c\x8e\xaf\xe8\x10\x83\x63\xc7\xdf\xa3\xb2\xab\xce\xb3\xfc\xc4\xea\x00\x5d\xa5\x3e\xf2\xe0\x19\x98\x80\xfc\xde\xd8\xba\x42\xd7\xa6\x6a\xde\x66\x30\xf8\xd9\xee\x90\x46\x93\x9f\xc1\xf0\xb1\x27\xf0\x86\x77\x45\xf2\x04\xf5\xe5\x35\x21\xa4\xce\x50\xd2\xd6\xa1\x6b\x60\x9c\x15\x43\x16\x06\xb4\x82\x7d\x9e\xe0\x25\x2d\x0c\xac\x14\xa2\x0a\xc3\xed\x8b\x81\x8f\x78\xea\x04\xa9\x59\x6a\x07\x00\x71\x1c\x85\x4e\xb1\x65\xcf\x44\xd2\x15\xb9\x75\x3e\xee\x1b\x63\x98\xe7\x3e\x5a\x01\xcc\x6c\xb1\x35\x3e\x8d\xe9\x1d\xb5\x76\x27\x0b\x9f\xc4\xcf\xed\x37\xf3\xc2\x65\x51\xad\x6e\xcc\x98\xcc\xaa\x36\x37\x26\x78\x79\x4a\x08\xac\x0f\x44\x1d\xfe\x8e\xcd\x39\x8a\x57\xb0\x2c\x8a\x6c\x5c\x8a\x7b\x82\x93\x20\x26\x20\x54\xc3\xc7\xa4\xbe\x1d\xc2\x48\x19\x87\x55\x24\x61\xc4\x18\x1e\xae\xe1\x88\x74\x6c\xf1\x05\x09\x31\x8e\x82\x18\x02\x87\xa9\x80\xb6\xee\xc6\x24\xc5\x4d\x01\x21\xaf\x76\xc0\x70\xb2\xc6\x51\xf8\x18\x5b\x14\x8d\x36\x60\x5b\x03\xeb\xd2\x6a\x6d\x04\x79\x7c\xb1\x65\x00\x4f\x0b\xe7\x59\x12\x2b\x85\xe2\xfb\x81\xc2\x4a\x6d\xf5\x2e\xb0\x12\xc6\xca\x4a\x85\xa8\x18\x90\x42\xd2\x8a\x76\x42\x86\x82\xaa\xeb\x5b\x44\x78\xde\x70\x95\xdb\x0d\x69\x46\xe3\x36\x86\x30\xdb\x18\x2c\xa3\x19\x7b\x0b\x98\x88\xdc\x59\xb4\x43\xc6\xfa\x0e\x99\xa0\x3e\x01\xba\xfd\xc3\x9d\x81\xdb\x03\x9e\x22\x08\x1f\x2b\x08\xa7\xc2\x09\x20\x57\x80\x2c\x34\xb3\xfb\x78\x16\x2f\xc0\xfd\x0c\xe1\x7e\x2c\xe1\x5e\xc1\xfa\xad\x8b\x1f\x03\x88\xc3\x47\x26\xbd\x60\xf6\x59\x1b\x43\xc8\xe0\x1f\x38\x65\x4c\x2a\x96\x84\x3e\xb9\x3d\xb1\x1b\xb4\x5d\xe2\x12\xb8\x63\x64\x32\xd9\xa5\x26\x37\x4d\x01\xa6\xa9\xb0\x3b\x13\x9b\xa6\x00\x13\x95\xd9\x2d\xa0\x1d\x42\xca\xee\xc2\xb8\xe3\x0d\xf4\x0a\x64\xe8\x34\xd7\x66\xc9\x8d\x84\xf5\x0a\xb8\x91\x3e\x01\xc4\x03\xa4\x0a\x88\x87\xca\x9d\x3c\x39\xda\x9c\x98\xf3\xb9\x13\x2f\x0c\x59\x09\x62\x2c\xbc\xc1\xfb\xbb\x11\xda\xed\x74\xb8\x92\x8c\xe1\x28\x4c\xb1\x87\xe5\x3d\x27\x65\xbb\x69\xf4\x40\x8e\xef\x2d\x74\xe5\x0b\x29\xe2\x02\x0d\xd2\x91\x99\x90\x90\x2f\x16\x3b\x50\x8b\x3d\x01\xc6\x09\xd7\x59\x0f\x06\x85\x1e\xc0\x60\x38\xa8\xe8\x6d\x4d\xe1\x2d\x1f\x39\xc9\x8d\xbd\x86\xaf\xc6\xc6\xf5\x64\x08\x3b\xed\x6c\x90\x94\x1a\x85\xd8\x00\x0c\x3a\xc7\x35\xd6\x9c\x8f\xfa\xba\x59\x27\xdd\xbb\xb8\x39\x0f\x8d\x8b\x16\x5a\x43\x5f\x9f\x82\x96\x12\xde\x49\xdb\xfe\x14\x68\xd0\xa7\x56\x37\x97\xa1\xe8\x2c\xf0\xd7\xd9\xd3\xe4\x27\xb0\x0c\xb7\x0e\x80\xd8\x9c\x0c\xd3\xe6\xcb\x03\x29\x26\xcf\x62\x71\x89\x1a\x05\xc4\xdf\x15\x17\xd4\xd9\xdf\x28\x15\x44\xe6\x2e\xde\xb8\x07\x0b\x15\x57\x50\x98\x1a\xed\x80\xd7\x6d\x77\xe5\x0d\xdc\xbb\xd0\x28\x3c\xee\xf9\x9b\xff\x0f\x73\x6f\xde\xd4\x46\xb2\xf4\x8d\xfe\xcf\xa7\xb0\xe7\xfa\x10\x6a\xd4\x92\x25\xbc\x8c\x47\xa2\x4d\x20\x04\x18\xcc\x62\xb3\x08\x6c\x05\x71\xa2\x77\x84\x84\x10\xb4\xc4\x22\xd0\x77\xbf\xf9\xcb\xac\xea\xae\x96\x04\x33\xf3\xbc\xef\x7d\xe2\x9e\x33\x46\xdd\xb5\x75\x55\x56\x55\x56\x66\x56\x2e\xb0\xc6\xdb\x2c\x55\xad\x1a\xa2\xc0\xd3\x2c\x15\x0a\xa0\x1a\x96\x58\x24\x19\xc1\x61\x3f\x1f\x5b\x53\x40\x48\x29\x5f\x2c\x94\x78\xda\x08\x0e\x02\x0d\x73\xe2\xdc\xfc\xb4\xd2\xea\x83\x68\x91\x88\xb7\xce\x65\xa1\x0b\x80\x18\x38\x29\x33\x6a\x9c\x21\x81\x32\x6c\xa4\x2e\x9b\xe9\x1c\x25\xa4\xbf\x54\x58\x2e\x09\xde\xa1\xbe\x4a\x94\x98\x70\x25\x50\x92\x90\x36\x82\x1c\xed\x30\x90\x4c\x9f\x11\xa7\x8a\x18\xca\x00\xd9\xf8\xc7\x07\x7b\xd6\x11\x85\xf6\x44\x36\xa6\xc1\x6c\xe9\x63\xbe\x02\x03\xc6\xdc\x46\x22\x94\x57\xa9\x0f\x04\x77\x0f\x32\xbf\xe7\x7e\x7b\x40\x27\x57\x8a\xcb\x92\x0c\x97\x79\x94\x53\x8a\x4a\x85\xca\xca\x60\x35\xae\x55\x70\x4b\x47\xa8\xad\xb2\x32\xe2\xd5\xb7\x3a\xe2\xb3\x88\x50\x91\x3a\x11\xef\xb8\x16\x1f\x84\x0d\xe6\xc4\x7a\xc5\x08\xe6\x11\x1a\x07\x8c\x05\x07\xdc\x11\xa7\xd6\x04\xce\x6a\x02\x41\x26\x40\x90\xcd\x0c\x41\x26\x2f\x20\xc8\xbb\xd5\xc6\x2c\x92\xac\xc0\x0a\x79\x0a\x49\x8e\x80\x24\x93\x1c\x92\x6c\x0a\x0a\x6b\x2a\x5c\xd9\xcc\x90\x61\x32\x1f\x19\x36\x5f\x42\x86\x84\x66\x9b\x06\x9a\x85\x46\x80\x89\x66\x09\xa9\x35\x09\x80\x82\xd4\x44\xcd\xa9\xde\x2b\x3a\xe3\x22\x9d\x3f\x13\x4f\xd3\xf9\xf5\x05\x71\xbf\xd3\x23\x74\x66\xa2\xae\xb0\x14\xcc\x45\x5d\x94\x6e\xa0\x2e\x99\xc4\xae\x9e\xc4\xa6\xd3\xc5\xfc\xfd\x76\xb9\x63\x58\xe6\x76\x33\x8b\x0b\x57\xf4\x2c\xbb\xa9\x37\xc3\x83\x81\xc5\x8c\x95\xbe\xf3\x7d\xc6\xcd\x99\xb1\xd4\xe7\xac\x30\xdd\xc6\x71\x9e\x8a\xd5\x0d\x68\xd1\x01\x01\xce\x64\x04\xb1\x2e\x8a\x01\x2d\x4c\xd9\x3d\x9e\xcd\x9e\x22\xbb\xa5\x5e\x9d\xc5\x60\x05\x82\x53\x7a\x9f\xff\x04\x5c\xd6\x63\xa4\xd5\x3d\x17\x33\xc8\xcc\x38\x7b\x26\x08\xc7\x59\x58\xaf\x56\x56\x68\x6c\x96\x5f\xa4\x17\xdb\x7b\xef\x54\x2b\x59\x2c\x63\xea\x88\x5f\xbc\xbc\x2d\xc2\x5b\x5e\xf0\x05\xdd\x30\x24\xa0\xbf\x4e\x4c\x7d\x1c\x91\xfb\xad\x69\xe9\xfd\x89\xe2\xd9\x0f\xd4\xd5\x9c\x16\x19\xbf\xf3\xb5\x4c\x7d\xe3\x52\x06\xbb\xae\xf4\xf7\x94\xe4\x68\x5f\x7e\xc2\x3f\x79\x51\x71\xf1\x01\x3b\x25\xb1\xea\x47\x8c\x0b\x90\xdc\xf5\x44\x2a\xbd\x7f\x61\x37\xb6\x5d\xfb\x27\xd2\x7a\x5d\xe8\xd4\x79\xf6\xde\x26\xde\x06\x57\x0e\x0b\x8c\xf7\x37\x25\x68\xba\x5c\xac\x2f\x43\xa7\x85\x60\xe9\xb2\x9d\x7c\xf5\xfd\x07\x8b\x9d\x35\x5c\xb7\xa4\x39\x77\xec\xda\xeb\xd4\xde\xd1\x16\x52\x4f\x63\x11\x88\xdf\x6e\xb2\x3c\x9c\xda\xbc\x95\x84\x2d\x04\x28\x75\xcb\xdf\xc7\x52\x2b\xd8\xb1\xfb\x91\x6b\x37\x2e\x90\x78\xf2\x51\xca\xf8\xf7\x5c\x66\x77\x43\xa4\xe1\xe3\x26\xde\x7e\x7d\x94\xb7\xab\x0d\x09\x11\xf7\xeb\x23\xdb\x07\xef\x6e\xd0\xdb\x80\x98\x1b\xf0\x2d\x20\xec\x6b\xf4\x12\x58\xab\xd7\x9c\x74\x76\x55\x90\x54\x62\xc2\xf8\xc7\x2f\xff\x08\x89\xdf\x92\x92\x02\xba\xf2\xf7\x5d\x07\x01\x61\x87\xb1\x0b\xbd\x44\xcf\x6e\x36\xed\x03\x1e\xc3\x47\x79\xff\xb5\x29\xef\x67\x20\x87\xbf\xef\x3e\x3f\x1f\xe0\x8a\x04\x39\x27\x3b\xca\xbf\x39\x8f\xa5\xb9\xe6\xda\xc7\xc7\xf6\xe5\x36\x2c\x97\xf9\xa2\xe2\x74\x27\xbb\xf2\x58\x98\xb9\xf3\xd0\x9e\xd1\xb3\x0b\x8f\xb3\x01\x4d\x92\xe0\x23\x1f\xb8\x28\x78\x81\x1d\x49\x36\x5f\x94\xa9\xb9\xf0\xbf\xcb\xdd\xb9\xb9\x4d\xbb\x43\xcc\xba\x2f\xa0\x7d\xe4\xd9\xf9\x3e\x94\xb7\x93\x3b\xd7\x96\xb8\xc0\x2d\x05\xfa\x5b\x51\x3f\xa6\x94\x87\x4b\x49\xb9\xe7\x1a\xeb\x6a\x8c\x3f\xa9\xc6\x01\xcd\xb2\xb7\xa9\xd6\x64\xf0\xa7\x8e\x45\xf7\xdd\x57\xd7\xa2\xae\xe2\xf2\x68\x73\xbd\x75\xcb\x47\x11\xb8\xe5\x23\xf1\xaf\xf5\xd6\x11\x47\xe7\x96\xa1\x5d\xbe\xdd\xda\x78\xd3\x31\x2d\x4f\xde\x5c\x5d\x07\x61\xef\x4d\x27\x79\x73\xdd\xef\x3d\xbe\x49\x46\x83\xc1\xf5\xed\x30\x0c\xde\xdc\x5f\x84\xb4\xb1\x7a\xbd\x37\x62\x83\xf2\xc6\xbd\xcd\x54\xdd\xd9\x40\xfc\x0f\xab\x3e\xf9\xc5\x57\x05\xe1\x9f\x2f\x04\x4a\x1f\x9d\x4c\xea\x52\xa4\x31\x7e\xe9\x2e\x63\x7f\x52\x5f\xd8\x75\x0b\xbf\xa6\x6f\x46\x32\x63\xbd\xf2\x7e\xfd\x7b\x7a\x93\x60\xe8\xd3\x3f\x7e\xc1\x1a\x93\xe7\x07\x3c\x8b\x14\x56\x22\x2a\x79\x75\xe5\xdc\x9f\xc0\xe0\x0c\xb6\x17\x17\x43\xf6\xf0\xbf\xea\x72\x64\x51\x33\xf1\xb4\xc9\xf2\xda\x65\x5a\xa9\xda\x50\x62\x5d\x6c\x27\xf9\xce\x8f\xc1\xbd\x71\x73\x6e\xa7\xbe\xfe\x81\x10\x78\x74\xdf\x5d\x33\x5f\x85\x10\x2b\xdf\x53\x57\xea\x63\xd5\x61\x6a\x2a\xd7\xe7\x7d\xbe\x70\x85\x1b\x7e\x65\x26\xe8\x6b\xdc\xa2\x29\xa8\x48\x27\xb4\x23\xb6\x0c\x55\x32\xdb\x8d\x4b\x5d\xa0\xab\x13\x54\x01\x5c\x58\x4b\xf8\xec\x55\x6e\x59\x9d\x8a\xbd\x54\x5a\xf7\x0e\x88\x4f\x7f\xd4\x56\x5e\x18\x02\xd7\x12\xe7\x07\x44\xab\x2e\x0b\xe6\x09\x15\x2b\x05\x1a\x22\x97\xe1\x2b\x9e\xcb\x4a\x95\x7a\x54\x46\x9c\x66\x24\xf9\x0c\x39\x4c\x3c\xda\x7b\x16\xd8\x4b\xa2\x90\x46\x29\x11\xfb\xb3\xc9\x54\xec\xb2\xbd\x00\xd4\x9f\x94\x96\xc1\x2a\x64\xd9\xee\x77\x21\x72\xf9\x60\x08\x5c\x64\x56\xe0\xb4\x95\xc9\xd3\xac\xd8\xc9\x0e\x17\x0b\x8b\xcb\x9a\xec\xe5\x5b\x6b\x5c\xc0\x99\xf7\xd4\x0a\x96\xd4\x3f\x35\x6e\xe2\x02\x20\xf9\x1c\xe3\x7a\x23\xb2\xef\xa0\x2c\xdc\x70\xaa\x75\xbe\xe7\x29\x5f\x7d\x86\x54\xf2\xea\xf3\xd7\x86\xb5\xb8\x88\xfb\xf7\x95\x3b\x25\x04\x6c\x50\xc5\xcb\x4b\xa2\x7e\xc6\x2c\x15\x31\xaa\xd7\x13\xa7\x61\x04\xe4\x4b\xea\x45\x22\x6d\xb3\x7e\xee\x6c\x71\x3f\x7d\xd5\xcf\x01\x0f\x77\xd2\x45\x3f\xcd\xe1\x6c\x6d\x70\x31\x3d\xb3\x7c\x8f\xad\xaa\xc4\x02\x21\xf9\x44\x95\x3e\x21\xc0\x60\x47\x4d\x2f\xc2\xa3\x2f\x95\xba\xce\xd9\x61\x61\x84\x39\x17\x2e\x2b\x24\x42\xc2\xfd\x7e\x4e\x14\x1d\x24\x0e\x3d\x7a\xa3\x55\xc1\x71\xdc\xfa\xaf\x2f\x97\x9e\x5c\x0a\xa5\xc3\xec\x67\x7d\x08\x89\xb1\x83\x22\xa6\x54\x11\xc6\x90\xb1\x6a\x9f\x63\x0c\xda\x0f\xda\xe9\xc6\x23\x31\x88\x8a\x4a\x94\x56\xc1\x22\x4a\xad\x84\x0e\x61\x90\x74\x41\xed\x80\xd0\x79\x57\xf9\x14\xe7\x8e\x55\x58\x72\xa5\xef\x94\x68\x9f\x9c\x6d\x72\x54\x4c\xda\x39\x61\x11\x46\xa8\x25\xdf\xa6\x2e\x6c\x5f\xb6\x8f\x08\x27\x8a\xb7\x48\x75\xe5\x43\x85\x3b\x83\x82\xb2\xae\xf5\x79\x28\xf0\x6e\x16\xda\xd2\x21\x1c\xa9\x3e\x7d\x8c\xd5\xbf\x1b\xee\xad\xfa\x9c\x2f\x9f\xa3\x36\x21\x4f\xb6\x25\x4e\x14\x35\x10\x96\x72\xb3\x33\xdb\x9c\xad\x37\x2a\x7d\xd4\xe3\xe3\x7a\xdd\x4d\x77\x77\xe3\x9e\xc9\x84\x8d\x4e\xba\x9d\x91\x42\x10\x10\xfc\x18\xfc\x39\xdf\x50\x99\x08\x15\xd5\x83\xbd\x91\xb2\x67\x5a\xfe\xea\xc1\x72\x68\xae\x26\x8c\xb2\x0d\x7a\x13\x77\xee\x08\x7b\x0f\xaf\xdf\x04\xb7\xee\x3d\xe1\xd9\xf0\xcd\x6d\x78\x33\x0a\x13\x20\x76\xb6\x1b\x04\xf6\xa6\xb6\x94\x71\x0a\xe3\xaf\xbd\x6d\xcb\x24\xb8\x40\x87\xc3\x11\x56\xc1\x22\x2e\x91\x28\x2f\xb7\xee\x96\x4a\xa2\x87\xe2\x42\x6d\xe5\x14\x67\xfe\x44\x93\x50\x5e\x2e\xa6\xa9\xc9\xe7\x28\x9d\x2b\x22\x86\x3d\x27\x60\x8d\x17\xa1\x37\x3d\xad\xd3\xed\x22\x22\x0a\xb8\x42\x0f\x04\x30\x2b\xc3\x6e\xc8\x37\x34\x0f\x56\xf4\x32\xc1\xaa\xf2\x0c\xee\xb2\xcf\x71\x2f\xe7\xd3\xcb\xbc\x2e\x71\x09\xd3\xfa\x4e\x7c\x4d\x54\x14\xc6\x76\xb3\x41\xcb\xf3\x96\x5d\x02\xa4\x69\x7d\xa4\x81\xba\x0a\xb3\xb4\x81\x4e\x8b\xb2\xb4\x6b\x5d\x37\x36\x7d\xb8\xe8\x49\x42\x96\x60\x41\xdb\xe7\x97\x12\x1a\x58\x12\x0c\x58\x4a\xf5\x4f\xde\xc8\xa0\xbe\xfa\xab\x6e\x8d\x06\xb4\xbc\xe4\x5b\x44\xd3\x4d\xc4\xcd\xed\x2e\xeb\xb9\xf8\xfc\x19\x78\xae\xf3\xd5\xc0\x23\x18\x84\x47\x30\x05\x17\xc7\x46\xb0\x09\x8f\x9d\xa8\x04\xc5\xd0\xb9\x5d\x59\x33\xbb\xb2\x86\xae\xdc\xfe\x9b\xae\x10\x7a\xd8\x65\x41\x79\xc0\x50\x40\x4a\xa0\xba\x12\xa6\xb6\xe9\x28\xc5\x0f\x88\xea\xed\x3c\xb1\xbe\x9f\x6f\xdf\xb2\x22\x5f\xa4\xd4\xfd\x62\x1b\x6a\x81\xd4\xca\xf5\x70\x78\x7d\x45\xdb\x5e\x29\xfa\x11\x93\x63\x2a\x29\xff\x36\x74\x6a\x0c\xaa\x61\xcf\x58\x3e\x86\x97\x4c\x73\x51\xc9\xd6\xf8\xa1\x55\xed\x92\x80\xb7\x48\x30\x28\xe0\xc2\x8e\xa8\x9b\x7e\xcd\xd5\x2a\x2d\x51\xe2\x6a\x42\x3e\xa4\xc7\x60\x32\x74\x0b\x7b\xac\x9c\x99\x97\x26\xbc\x57\xfb\xed\x47\xce\xf7\x4f\x12\x94\x0f\x7c\xca\x2f\x16\x92\xb0\x48\x5b\x4f\x74\x61\x5d\x6b\x55\xb7\x5d\xd3\x2d\x5b\x96\xa9\x36\xf7\xee\xa4\x90\x2a\x58\xba\xdc\xb9\xa6\x3b\x54\x2e\x0e\xe2\x5e\xe1\x5b\x64\x4d\xde\x89\xa6\x47\x3e\x3c\xa7\x8a\x64\xe2\xaa\xe0\x25\x71\x5c\x73\x9d\x5f\xd7\xe5\x5f\x1b\x6b\x87\xff\xdd\x3c\xd9\xdd\x35\xa3\x96\xfc\x88\x28\xb3\xe3\xb9\x66\xda\x4e\x64\x54\xd8\x3b\xd8\x3f\xfe\xf6\xdf\xb5\x46\xe3\xd0\x2c\x32\x42\x91\xef\xd7\xed\xb5\xe0\xbc\x7c\xf4\xed\xe0\xf0\xf8\xbf\xcd\xb5\xe3\x8d\xa9\x50\x53\x73\x4a\x1c\x6f\xef\x6d\x4c\x4c\x70\x7b\x26\xb8\xed\x61\xe7\x2a\xfc\x7d\xdd\x0f\x41\x18\x4f\xea\x04\xe4\x77\x27\xd3\x30\xd6\xf0\x68\x1f\xf8\xbc\xc1\x67\x01\xad\x4b\xe4\x60\xe9\xb6\x34\x2c\x4f\x3e\x18\xf7\xec\xa3\x0d\xd0\x15\x72\xbf\x7b\x26\x93\xd7\x53\x06\xa5\xf1\xae\xa8\xe1\x66\x3e\x85\x5b\x05\x1d\xb9\xe8\x43\xc6\x1f\xbb\x59\x01\x3f\x2d\x40\x75\x8d\x02\x6e\x0b\x93\xd4\x9b\xa3\x65\x43\xdf\x72\xcd\x11\x98\x08\x70\x3f\x27\x31\xa3\x43\xe6\xf7\x61\xe1\xa6\x43\x28\x6f\xd5\xab\x7d\xc0\xa1\xd3\xfe\x0d\xcb\xb8\x54\x87\xba\xfa\xc9\xb2\x2f\x07\x2e\xfe\x59\xf6\x54\xd6\xb2\x65\x7f\xa3\xac\x6f\xb3\x59\x7f\x11\xa6\xb8\x86\x1f\x80\x99\x9c\xcf\x96\x7d\x4a\x39\xf4\xcf\x82\xe7\x46\x82\x94\x3f\x67\xcc\x41\x2b\xc5\x97\x84\x6b\xa5\x8b\x9f\xac\xd5\x4f\xe8\xa2\xc7\x5d\xf4\xf2\x5d\x3c\x88\xe8\x3f\xfe\x96\x97\xef\xe0\x69\x44\xff\x4d\x67\x50\xf7\x5c\xea\x84\xab\xba\xe7\xe5\xba\xb7\x15\xd1\x7f\xba\x73\x33\xf0\x4e\xae\x66\x4e\x43\xcd\x75\x37\xce\x56\xd5\x56\x57\xaf\x56\x6d\x7a\xeb\xcb\x48\xd4\x82\x51\x3b\xf5\xe4\x43\xad\xfa\xd9\x10\x02\xa2\xce\x41\x4a\xbf\x53\x27\x94\xb5\xe8\xae\x52\x1c\x1b\xe7\x1c\xe3\x1e\xcc\xe0\x9e\x1b\x42\x25\x6e\xba\x0e\x3d\x26\x1d\xf4\xd2\xf3\xc5\x80\xad\xae\x97\x49\x20\xef\x40\x3c\x07\xb3\x88\x47\x69\xc2\x7e\xc5\x08\x35\x76\x49\x95\x4e\xe2\xdd\x9c\x81\x56\xbc\xab\x2e\x27\x5c\x2d\xc6\x61\xe1\x91\xa9\xa6\x4f\x78\xe8\xfd\xdd\x06\x21\xac\x6a\x3d\x20\x14\x5f\xc0\x59\xa2\xc0\x1e\x94\x70\x89\xae\x8e\xd7\xf7\xbe\xb5\x24\xb6\xf2\x69\xbe\x5f\x0a\xb2\x7c\x9c\x0a\x70\x53\xac\x14\xef\x32\x1b\x58\x35\xe6\xa9\x38\x99\x3a\x35\xe0\xeb\x13\xf7\x2b\x1d\x11\xfd\x1f\x50\x74\x0a\xdb\xfb\x9e\x9c\xe6\x12\x85\x4e\xae\x64\xc5\x5d\x8e\x86\xa4\xa0\x58\x4b\x03\x8c\xf5\x78\xd4\x73\x39\x79\xbc\xf2\xae\xe1\x00\x5c\x27\x8c\x92\xf0\x87\x1b\x04\x9d\x7e\xbc\x9a\x84\xc4\xe7\xf8\x3a\x47\xa2\xcb\x1c\x24\xab\x7e\x31\x28\xba\x35\x97\xfe\x66\x9a\xdf\xde\xea\x71\x58\xf4\x61\x09\x96\xe1\x95\xb0\x95\xb7\xf8\x10\xee\x2d\x30\xd4\x3a\xd5\xf1\x72\xf3\xa0\x4f\x90\xe1\x48\x9b\xf7\x1f\x78\x8e\x21\x5b\xff\x31\xa3\x48\x8a\x05\xa6\x3e\xf0\xb6\x82\xff\x2a\xb9\x8b\xf1\xa8\xf5\x4a\xf9\x2a\xfe\xe3\xf2\x47\xf7\x85\xb0\x35\x5f\x65\x30\xd3\x9f\x1c\x33\xba\x8c\xbd\x17\x8b\xaa\x81\x51\x21\x2e\x51\xf6\x82\x97\x98\xf1\x03\xa2\xe3\xa4\x4c\xe3\x6a\x16\xe5\xd1\x98\x4d\xc5\xc2\xb8\x65\x68\x86\x07\xbb\x1a\x6e\xfe\x2e\xf6\x43\xa5\xae\x71\x9f\xca\x2e\xaa\x4c\xac\x8f\xea\x8a\xe3\x5b\x30\x53\x49\x4d\xd3\x02\x22\xb6\xbb\x2c\xd3\x80\xb6\xb2\xac\xa9\xa0\x7d\x13\x10\x45\xbf\x69\xd5\x4b\xd5\xb7\x4e\xb8\x4a\xb4\xba\x5b\x08\xda\x17\x54\x2c\xc4\xad\x7b\xb5\x62\x21\x90\x17\xaf\x44\x55\x18\x21\xeb\x50\x18\xf1\x74\xfd\x92\x13\x96\xaa\x25\xf8\x9e\xcf\xd6\x78\x49\xd3\xac\x97\x61\x4a\x16\xd0\x44\x57\x26\xa7\x4e\x8c\x71\xd7\x9b\x6e\xde\x1e\x43\x95\x28\x16\x4d\x5c\x0f\xf3\x5e\x8b\x6d\x32\x7e\xc6\xce\x6c\xe1\x52\x69\xb6\x30\xe6\x67\x9e\xa1\x87\xa1\x21\x37\x76\x97\xa6\x60\x65\x2d\xe9\xbe\x2a\x8b\x30\x7a\xa2\xcf\x26\xb9\x3e\xba\xe9\x77\x95\x28\xd9\x2d\xe9\xea\xef\x55\x7b\xd6\xbc\xce\x2f\xdc\xbe\xdc\x0c\x5b\x01\xfe\xc3\x76\x4e\x5f\x6e\x66\xe3\x9f\xb7\x92\x79\xd9\x98\xc1\xb5\xbd\x0c\xd5\xc6\x7a\x4b\x66\x1a\xcf\x44\x8c\x18\xe1\xa1\x0f\xf3\x77\x55\x9e\xbe\xcf\x5d\x11\xa7\x73\xf5\x12\x11\xcf\xd0\x21\x3a\x92\x72\x6d\x1f\x21\xb8\x71\xe5\xf5\xaa\x1d\xdc\xd1\xb4\xf4\xfc\x58\x7d\x06\x9a\x2b\x5a\x09\x3f\xbd\xfe\x63\x34\x4c\xbd\x2e\x77\x3c\x3a\xf2\x4b\xfa\xd1\xb7\xac\x95\x42\x50\x0c\x73\xf1\xa9\x8f\xa7\xef\xd6\x92\x80\x11\x66\x76\x8d\x44\x27\x64\x5c\xf6\xef\x10\x12\x03\xfa\xcc\x59\xd5\x93\xac\x53\x1c\xd6\xd2\x2d\x0f\x23\x8e\x8a\x99\xbe\xcc\x74\xaa\x64\xd6\xbf\x68\x4d\xcb\xd8\xe1\x85\x40\x3c\xcf\x4f\x61\x77\x8e\x29\xc3\xac\xdf\x0f\xe6\x0f\xf4\x90\x58\xaf\x48\xf5\x38\xb4\x8c\xf8\xfc\x06\x5b\xd6\x69\xe5\x5d\x2d\x67\x26\x74\x50\xef\x85\x5e\xf1\xee\x25\xd8\x65\x95\xe6\x9f\xab\xdd\xaf\x14\x6b\x69\x68\x62\x6e\x4a\x27\x08\x61\x8d\xba\x15\x4a\x64\x7c\x1b\x19\x37\x8c\x31\xaa\xe2\x68\x8a\xfd\x47\x32\xb7\x4f\x88\x29\x78\x4f\xd8\xc1\xc2\x76\x80\x1f\x18\xc2\x1e\x6c\x74\xa9\xea\x1a\xee\x39\x0c\x7f\x67\xad\x99\x4b\x82\xad\xef\x7a\xe1\x0d\x8e\xf5\xc2\x1b\x9e\xe8\x85\xb7\xf5\x41\x9f\x05\x0f\x1b\x4e\x48\x60\xef\xb6\xd2\xa8\xa1\x5e\xfa\x82\x05\xa0\xda\x18\x3b\x05\x1c\xc1\xef\x55\x4b\x83\x5d\x47\xa5\x2f\xb9\x25\x7f\x72\xc9\x68\xb7\xe3\x39\x73\x54\x86\xb2\x96\x97\x54\x95\x92\x6a\x62\x52\x97\x7a\xc3\x28\x8f\xae\x6b\x9a\x91\x70\x0a\x4a\x0d\x75\xa0\x37\xe0\x60\x6c\xab\x5e\x2b\x26\xa3\x52\x73\x15\x82\xbc\x28\x6f\xd8\xfa\xa8\x7e\x33\x14\x76\xa1\x5a\xd3\xaf\x19\x6f\x20\xa5\x15\xba\x7a\xd8\x80\xa1\xc5\x7b\xdd\xe6\x24\xa5\xe5\x0c\xf7\x64\x6a\xa9\xe9\x4e\x99\xdf\x4e\x57\x28\x68\x18\xf8\x5d\x96\x8f\xea\x73\x3b\xfd\xaa\xd2\xab\x92\x4f\xc3\xa8\x9d\xda\x20\xa6\xf6\x3d\x1e\x4c\xa6\xb2\x37\xef\x54\x0f\x86\xa9\xdd\xd2\x77\x3d\x93\xa7\x6b\x7a\x26\x8f\xd7\xf4\x4c\x7e\xbf\x73\x14\x93\x16\x04\xae\x13\xd5\x75\x65\x47\xd5\x5d\x55\x94\x4e\x30\x7c\xbf\x5c\x8b\x94\x88\x97\x8a\x5a\x94\x71\x7b\x5c\xa8\xda\xc3\xe3\x82\x2a\x5a\x52\x05\x89\x1e\xab\x6e\x7c\x80\x86\xab\x2e\xcc\x3e\x97\x55\x2e\x9b\xc2\x0b\x8b\xad\x52\xa0\xa7\xad\x3d\xb3\x5c\x61\x5d\x7d\x55\x8e\x78\xae\x94\xaf\x95\x8b\x98\xb9\x2f\x63\xbd\xaa\xae\x2b\x01\x54\xb3\x63\xd8\x56\x5c\xc4\xd8\xa7\xaa\x01\x78\xc7\xa7\x4d\x54\x7a\xa9\xbd\x92\x67\x97\xe0\x39\xd6\xff\x17\x2d\xda\x91\xb3\xbc\xa4\x4a\x95\x08\xe4\xc6\x9b\x6a\x66\xba\xfd\x88\xe6\x45\xb7\x6f\xd5\x68\x78\x53\xfd\xd1\x5f\xf3\xad\xe9\xfa\xaa\x1c\x8d\x5a\x15\xb4\x17\x02\xa3\x29\x1a\xda\xfc\x96\x02\xeb\xf5\x7e\xe9\x76\x4b\x6e\xda\xb0\xd9\xc5\x69\x30\x65\xdd\x20\xee\x27\x03\x95\x9a\x60\x81\x4f\xc9\x9d\x82\x9d\x5f\x0c\xdf\x33\xd9\xb2\xc4\x48\x80\x90\x12\x0d\xdc\x5d\xfd\xdb\x11\x66\x03\xc4\x12\xfa\x1f\x0f\x42\xdf\x4d\xc4\x4e\xb0\xe2\x13\xb1\xd3\x63\x62\xe7\xb4\xfc\xce\x7b\x89\x14\x0c\x86\x30\x19\x0d\xfd\x97\xf2\xef\xbe\x23\x7f\xf3\xfa\xa5\xfc\xd3\x35\xe4\x47\xfd\x97\xf2\x8f\xd7\xd8\xec\x74\x0a\x71\x69\xc6\xc7\xd8\x73\x56\xbe\x57\xe6\x6d\xca\x7d\xbc\x5a\xaa\xd6\x52\x25\x16\x77\xc9\xfb\xaa\xc6\xbe\xe4\x69\xd0\xe2\x20\x74\x69\x9d\x2d\x79\x2b\x59\x5e\xc9\xc8\xcc\x60\x4a\xc5\x2a\x6c\x43\x3b\x17\x09\xcf\xe0\x02\x39\x54\xd5\x60\x4b\x6a\x50\x74\xba\xd3\x9a\xd6\xeb\xd0\x58\x11\xe8\xc3\x4a\xba\xd4\xb3\x8f\xe6\x17\x4d\x4d\x25\x1b\x08\xed\xaa\x95\x12\x55\x17\xe0\x3a\xdb\x0d\xef\x5c\xc7\xa3\x7a\xf7\x9d\xf5\x78\x72\x74\xec\xd5\xff\x2e\x1d\x2b\xb2\x47\xa6\x3c\x55\xb5\xf7\xaa\x6b\xe9\x31\x7b\xab\x90\x22\x75\xbf\xad\x9b\x56\x87\xc7\xbb\xef\xe7\xa2\x9c\xf3\x22\x4d\xab\x8a\x2d\x8d\x8e\x0d\xc6\x98\xfb\x02\x36\x98\x89\x3a\x2e\xf2\x33\x2e\x58\xc4\x44\xcf\x25\x2e\x5f\xa4\x74\x75\xe3\xc3\xd7\x1b\x17\x42\x63\xe5\x85\xd6\x17\x5e\xa4\x80\x5f\xef\xfb\xd3\x9c\xce\x83\x79\x2e\xa5\xa5\x56\xb2\x8f\x97\xdc\xdc\x3e\x40\x85\xc9\x6b\x64\x74\x7f\x96\x9c\xb9\x48\xdd\xd5\x7d\x5f\xd6\xc7\x5c\x72\xc3\xf8\xe3\x67\xea\xc6\x5c\xab\x3f\xec\x25\x9c\x41\x8b\xaf\x5d\xb5\x97\xed\x4f\xe7\xd6\xa4\xcf\x94\xc6\xfd\xb7\x17\x6e\x2a\xbe\x57\x71\x29\xa2\x6b\xb3\x0f\x76\xab\x1e\x5c\xbf\x91\xeb\x0b\x30\x8b\x20\xda\x88\x1c\xf4\x34\xea\x22\xec\x53\x48\x91\x3c\xa1\x1a\xf8\xed\x87\x04\x42\x37\x21\xe4\x9d\xf2\x15\x70\xa8\x6f\x54\x93\x1b\xdb\x20\xe1\x2e\x5a\x46\xea\xa4\x2e\x7d\xfc\x5e\x7d\xa1\x8f\xf4\x99\xcd\x6b\x74\x33\x7d\x8d\xfa\x7c\x89\x7c\x62\xb6\x5e\x52\x40\x02\x81\x1f\xe4\xb2\x5c\x5b\x51\x53\xdf\x97\x95\x98\xde\x7d\x28\x20\x46\x98\x16\x50\xc8\x46\xae\xd0\xc0\xbf\xc2\xcb\x2a\x02\xb5\x66\xe2\x0c\xc1\x37\xb9\x72\xb3\xad\xf9\x1c\xe4\xde\x9c\x6b\x82\x04\x28\xe0\x9c\x39\xea\x75\x6b\x8a\x49\x9a\x47\xab\xb6\x3e\x68\x0a\xe7\x32\x72\x35\x89\x03\x32\x54\xa7\x95\x54\x31\xeb\x7d\x41\x55\x2d\xa9\xc6\xac\x19\x1a\x55\x65\xe8\x2a\x84\x68\xae\xd5\x19\x32\x85\xc2\x15\xa1\x36\x4b\x76\xbe\x8c\x5a\xdd\x59\xb2\xf6\xb5\xa3\x85\xbe\xfe\xea\xd1\x42\x23\x9b\xbc\x7a\xb6\x6d\x7d\x7f\xfd\x6c\x1b\x1c\x9b\xae\x81\x4c\x31\xc7\xf5\xb1\x06\xf3\xc6\x77\x15\x68\x00\x9c\x86\xb2\xf6\x25\x2a\x53\x5d\x12\x7e\x97\x94\xae\xaf\x6d\x44\x87\xc7\x0e\x21\x19\x39\x32\x3c\x7d\x1c\xfb\x4a\x5e\xdd\x19\x2e\xa9\x42\x06\x26\xcf\x94\xa1\x72\x76\x40\x12\xdc\x80\xb0\x2c\x71\x60\x43\x70\x7b\xd5\xca\x12\x27\x14\x5d\xfa\x6c\xc9\x5b\xe2\x74\xca\xbd\x3e\x66\x83\x1c\x5e\x7e\x55\x13\x17\xb3\x17\xf9\x53\x67\xc0\xd3\x37\x8d\xce\xf5\xf7\x8d\xc3\xad\xab\x8d\x25\xfd\xb1\x6e\x45\xd1\xaf\x5d\x7f\xb5\xa5\x35\x33\x6a\x95\xaf\x3a\xad\x64\x24\x12\x4e\x9a\x7b\x14\x75\xfd\x7f\x71\x14\x75\xfd\xb9\x47\xd1\xc2\xcc\xa1\x61\xd0\x06\x1b\xdf\x21\x1a\x3c\xce\xc4\xa2\xc0\xad\xfa\x65\x25\x93\x08\x29\xc0\x5b\x39\xf4\x8a\x79\xfb\xea\x82\xb8\x90\x02\xfc\xc1\x7a\x65\x45\x11\x6c\x5d\x3f\x9d\x37\x5f\x89\x37\xc6\x34\x7e\x57\xdf\x52\xeb\x7c\x5f\x2d\x68\x94\x23\x9c\x53\x52\xc8\x55\x9f\x00\x99\x10\xf4\xfa\x78\xc9\x7d\xcf\x0c\xc4\xc8\xe8\xb1\xc2\x8d\x04\x2a\x99\x76\xdf\x2a\x79\xff\x50\x94\xf3\x7f\x13\x10\x34\xea\xff\x1f\xc1\x41\x50\xe1\x4b\x80\x98\x39\x8a\x15\x20\xfe\x0f\x86\x2f\xf2\x23\x37\x5d\x8a\xe9\x90\x3d\x3d\xe4\xf4\x64\xe7\x03\xeb\x6b\x7a\x52\x1b\x27\xb9\x62\xe2\x70\x6c\x2b\xaa\x5f\x0a\xd7\x32\xa8\x66\xe7\x7a\x1a\x65\xe7\xeb\xf4\x57\x0d\x40\x7a\xe9\x25\x01\xea\xac\xcc\xfb\x68\x8e\x7c\x58\x4d\xcb\x4e\x7d\x53\x0a\x4c\xa6\x26\xc4\xfb\xc7\x13\xc2\x77\xf9\x1a\xed\xbd\x2e\xdb\xbb\x99\xc7\x9b\x67\xe2\xbd\x24\xd0\x27\xd7\x28\xd6\x27\x57\xcf\xd3\x07\xd7\xef\x4b\xcd\x90\xdf\x5f\xbb\xff\x13\xfa\x65\xe1\xe6\x75\x02\xe6\xf7\x25\xa1\x72\x4d\x1a\x30\x35\x23\x1e\xfd\x07\x20\x59\x5c\xbc\x11\xf1\xa2\xf8\xae\x9e\x6b\x10\x2f\xf4\xc2\xc4\x8b\xa7\xf4\x33\xa0\x41\x62\xcd\xd2\x27\xbe\xd6\x04\x63\xbd\x12\x48\xbc\xc5\xd5\x06\x34\xf9\x99\xf3\xf9\xf0\x4a\x4d\x80\x01\x55\x96\x61\x76\x9d\x9f\x10\x4f\x14\x59\x98\xd2\xf0\x97\x9c\xf4\x38\xd2\x74\xc3\x7b\x29\x16\x94\x70\xee\x10\x41\xc6\x52\x38\x55\x82\x17\xc4\xbf\x1f\xa7\x86\x12\xf5\x2d\x80\xd8\xf0\x6d\xa1\xfa\xd5\xf1\x39\xd6\xbb\xb2\xc3\x44\x04\x53\x48\xdb\xf8\xb9\x9e\x29\xbb\x57\xed\x88\x0b\xd6\x43\xb8\xc4\x2a\x16\x2d\xc8\x56\x69\x49\x00\x24\x3e\x5c\x87\x3c\x3f\xab\x7a\x21\xdb\xf0\x06\x93\x39\xf4\x9f\x3f\x97\xfe\x03\x81\xa4\xe6\xf8\x45\x02\x50\xe4\x96\x74\x64\xaa\x19\x9f\xa2\x58\xab\x8a\x62\xd5\x49\xbc\x35\xf4\x60\xa7\xeb\x2e\x15\x3c\x08\xa0\x3c\x4d\xa2\x66\x42\x56\xb5\xdb\x69\x9d\x4e\x53\x72\xb2\xc1\xb3\x1d\x71\x9a\x73\xaf\xf3\x38\xd6\xc1\x0f\x56\x5d\x62\x6b\xab\xcb\x2b\x2a\x59\x23\xd4\x60\xe8\x6a\x6a\x3a\xe3\xb8\x1e\xc7\xef\xab\xcb\x29\x8b\xef\x53\x11\x2f\x8d\x02\x71\x7d\x95\x57\x3e\x40\xa5\x0a\x4e\xff\x53\xf1\x4f\xf5\xc2\xad\x84\xaa\xdb\x0e\x7d\xd9\xc1\xd3\x47\xb8\x01\x51\x2a\xb5\xc1\x50\x72\xb5\x79\xfd\xe3\x58\x7f\xbb\xfd\x3b\x98\xbe\xe8\x7f\xf5\x9c\x57\x35\x72\xed\x96\x54\x9b\x73\x5a\x99\x43\x00\xe8\xaa\x4a\xc3\xa0\x3a\x0d\xc0\xb9\x5f\xc8\xbf\x16\xab\xcb\x25\x0d\x49\xeb\x3f\xaa\xfe\x7f\x70\xcd\x9d\x9b\x0f\x57\x4b\x02\xdd\x74\x22\xa8\x85\x3d\xf0\xe6\x6a\xbb\x5c\x5f\x95\x93\x70\x78\x72\xbc\xbe\x49\x73\xfa\x2b\x74\x6f\x19\x75\xd6\xf3\x79\x98\x19\x2c\xbb\x7c\xea\xb7\xeb\xd1\x6d\x52\xc0\xa5\x21\xfd\xff\x9f\xb1\xb4\x66\x19\xe6\xbd\x56\xe6\x9f\x33\xf3\x6e\x6c\x66\xea\xf2\x19\xf0\x6f\x4e\x12\x13\xcb\x9f\x65\xbe\x34\x95\x48\xe2\x4c\x16\xdb\xff\xf6\xdd\x9a\x48\x64\xa5\xde\xeb\x32\x86\xe3\x17\x56\xe9\x8b\x82\x83\xd1\x4b\x35\x5e\x20\x40\x34\xc6\xa6\x15\x00\xe5\x2c\x3a\x68\x52\x4a\x9f\x4f\xd0\xf2\xc7\x0f\x1f\x97\xff\xfa\xf8\xf1\x4b\xf5\xaf\xca\x87\xe5\x4f\xd5\x2f\x4b\x22\x10\x77\x4b\xfe\x8a\x47\x20\xf7\x6b\x9e\xf5\xfa\xd9\xfa\x4b\xb9\x79\x51\xb2\x4f\xbf\xeb\xb4\xab\x1b\x1f\xec\x4f\xf4\xaf\xba\xf1\xd1\xae\xe2\xe1\x03\x3d\x7c\xa6\x7f\x1f\x36\x3e\xd1\xef\x27\xfb\x2f\xfa\x57\xfd\x42\x7f\x3e\xe0\xad\x5a\xc1\xe3\x72\x15\xcf\x1f\x3f\x2c\xd3\xdf\x2f\x9f\x3f\xa2\x64\xe5\x23\x67\x7c\x5e\xfe\xeb\xcf\x8f\x9f\xa9\x99\x3f\xbf\x7c\xf9\x6b\xf9\xc3\x17\x34\x58\xfd\xf4\xe9\xf3\x5f\x9f\x96\x37\x3e\x28\x13\x10\x3f\x9a\x3e\x76\xb5\xfc\x54\x77\x88\xbf\xff\xf9\xff\xa4\x71\x5a\x4d\x6a\xbf\x5c\x1e\x2b\xb2\x28\x4a\xc5\xd3\x7e\x97\x0f\x1c\x39\x13\x96\x75\x36\xaf\x56\xa5\xa0\x71\xa3\x76\x6e\xb2\x5c\x54\x8c\xb0\xe2\x7a\x93\x65\x4b\x7b\x6b\xfb\xd5\x74\x74\x6b\xfa\x57\x3c\x63\x19\x9f\xd3\x9b\xd6\x0f\x54\x83\xbf\x9a\x4b\x3a\x5b\x24\x17\x42\xaa\xdd\xa4\xd9\xea\x7b\x54\xa1\xa4\x52\xf0\xc1\x5b\x75\xb9\xb3\x6c\x9a\x8a\xdd\xa6\xfa\x48\xc3\x65\xa7\xea\x00\xa3\x7f\xa4\xbf\xf5\x65\x58\xfd\xb9\xbc\xaf\x6a\x1f\xd2\x67\x57\x77\xb0\x56\x95\xb4\xe1\xa5\x53\xad\x7d\x14\x92\x80\xdf\x5c\x7c\x8c\x76\xe2\xaf\xbf\x47\xfb\xc3\x65\xd9\xe0\xc3\xcb\x74\x38\xdb\x1a\x83\xa4\x00\x19\xb3\x62\xf6\xcc\x86\x82\xf8\x6a\x45\x01\x55\xd3\x31\x7a\x7c\x55\x4b\xcf\xa2\x92\x0d\x89\xa2\x88\x06\xc9\x74\xf1\x8f\xda\x27\x4c\xd6\x0d\xe6\xb6\x55\xa2\xd0\x14\x19\xec\xd2\x7b\x12\xa3\x87\x75\x6b\x2e\x86\x41\x91\x52\xc9\x18\xc6\x2c\xfb\xc4\xe3\xd0\xcb\xe4\x95\x81\x3c\x7a\xd9\x48\xf4\x94\xfe\xfd\x38\xb8\xd6\xfc\x81\x7c\xa0\x81\xac\xbc\x3c\x90\x3c\xf6\x43\x91\x62\xd1\x18\xc8\x0c\xf2\xc9\xe6\x83\x96\xfd\x2b\xe3\xd8\x98\x9e\x90\xce\x6c\xf1\x39\x03\xd9\x78\x6d\x1c\x4a\x46\x30\xc6\x49\xb2\xf2\xda\x88\xa6\xf2\x8a\xf0\xec\xbb\xa2\x25\x29\x46\x1d\xe5\x46\x69\xde\x74\x9a\x93\x39\xf7\x94\xa1\x45\x5d\xc8\x6d\x4e\x5b\xbb\xe6\x1d\x5e\xaa\x76\xd5\x3a\x57\xc9\x97\xc7\x8b\x8b\xd9\xea\xd2\x48\x0c\xdf\xce\xbc\xb8\x65\xa8\x81\xb6\xd9\x34\x98\x34\x92\xb0\x73\x9f\x9d\x8f\xc4\xe7\x9e\x75\x46\x97\x85\x4a\x57\xdd\x75\x34\x3a\x59\x5c\xd4\x63\x50\x5d\xcf\x7a\xfc\xc1\xe8\x71\xa9\x64\x97\x74\x41\x4c\x46\x61\xfe\xfc\xeb\x5d\x6b\x9b\xdf\x9c\xd7\xdd\xec\xc8\x49\x5a\xe2\x16\x86\x2f\xdd\x71\xfe\x20\x96\x82\x5a\x4b\xaa\x5a\x8a\xd7\xbf\xba\xab\x82\xea\x1d\x22\x6e\xb5\x40\xd8\xfe\xf0\xf1\x13\x1d\x05\xa2\xc2\xc7\x12\x62\x7e\x02\x51\xac\xb4\xd4\xd2\xfa\xb9\x30\x90\xbf\xb3\xd0\x4f\x7d\x3c\xe9\xa5\x1a\x3e\xb8\x8a\xc5\x4a\x89\x5e\x4f\x93\x82\xae\x73\x50\x1c\x12\x87\x23\x24\x9a\x28\x1b\xd1\x64\xd5\xb5\xa2\x88\x10\xb1\xf0\x8a\xb8\x1f\xe0\x89\x58\x95\xb7\x0e\xac\x98\xbd\x76\x27\x14\x43\x1c\xaf\x7d\xc1\x4f\x88\x80\x1f\x33\x9d\x76\x14\xfa\xd7\xfd\x20\x61\x1e\x41\xa7\xed\x75\x7a\xbd\x4e\x92\x66\xf4\x1c\xe2\x88\x22\xe6\x8b\x62\xfe\xdb\xe5\xbf\x9e\xd2\xe4\xf3\x9f\x9f\x43\x04\x23\x06\xf5\x7c\x1c\xa2\x87\x70\x5c\xa8\xfb\xb7\x2c\xa6\xc6\x5c\xa0\xe8\x1c\x87\x36\xfd\xa5\x22\x41\x96\x0d\xff\x0b\x94\x78\x1a\xa9\xac\x28\xcd\x42\x42\xa8\x93\xe3\xf9\xc9\xdd\x5c\xf2\x89\x6e\xdf\x53\xc9\x1f\x2c\xc3\x7f\x4f\x06\xfe\x51\xcb\xd4\x59\x39\xb0\x83\x0c\xdc\x81\x06\xb7\x56\xe1\x12\xb0\xc2\x57\xa3\x80\x15\x51\x25\x3a\x0a\x8a\x81\x82\x67\xcf\x09\x66\xe0\xd9\x4f\xd3\xa6\xe0\xe9\x3b\x7e\x91\x41\x30\x35\x8f\xa2\x5b\x12\xc7\x7a\x2d\x40\xf5\xcc\xd7\x20\x0d\xa7\x41\x4a\x45\x77\x22\xa3\x28\x80\x8b\xbf\x39\x08\xaa\x82\xa3\x7c\xc1\xd3\x48\x15\xcc\x60\x8a\x84\x50\x27\x77\xe7\x27\xf7\x72\xc9\x27\x61\xea\x61\x94\x73\xfb\x29\xc4\x0d\x27\xd7\x33\x0a\x3a\x12\x95\x6d\xc5\x63\x2f\x9e\xae\x73\x16\x16\xdd\x79\xf3\x73\xd7\xd2\xb8\xdf\x71\x68\x4b\xe8\x78\x0a\xf0\xa4\xe3\x38\x07\x7a\x30\x1d\xbd\x57\xb4\x17\xd6\x2a\xfc\x79\xd2\x54\xc1\x48\xbf\xc2\xee\x33\x3c\x68\xdc\xb9\xac\x71\x57\x01\x62\x83\x68\xe1\xa3\xf2\x14\x50\xf0\xb3\xcc\x4f\x58\x40\xf0\xd7\x5d\xb5\xff\xd4\xd9\x41\x96\xfd\x45\x65\xd3\x3f\x9d\x1b\x66\xb9\xd5\xaa\xce\x8e\x8c\xc4\x8f\x3a\x31\x36\x12\xff\xd4\x89\xdd\x2c\x71\xb9\x42\x40\x43\xa2\x81\xac\xb0\x14\xcb\xb4\x74\x0a\xa9\xac\xc9\x8e\x11\x81\x34\x85\xd0\xbd\x02\x2d\xfb\xd6\x47\x34\x3e\x57\x42\xf3\x55\x0c\x8f\xdf\xae\x42\x0d\x05\xce\x2b\xa1\x9c\xb5\xe4\xd9\x10\xc3\xe0\x99\x7e\x2a\x5f\x83\xd5\xd2\x3b\xc2\x45\x25\x5c\x01\xd5\xdc\x5d\x97\xef\x82\x74\x10\x1e\xb6\xd7\x80\x20\x39\x5c\x2d\x21\xaf\x04\x2f\x56\xb5\x77\xca\x9d\x95\xa9\x89\xfc\xe3\x8a\x2b\x1a\x53\x88\xf2\xba\x87\x90\xe2\xeb\x4e\x55\x4c\xbf\xea\xd0\xd6\xa2\x39\xa3\x89\xac\xac\xf8\x75\x1d\xc4\x85\x98\x19\x1f\x60\x63\x96\x23\x62\x6c\xb5\x8b\xa0\x97\x58\xcd\x9f\x56\xba\x0c\xfc\x4f\x4b\x71\x11\xca\x1a\x0f\x2d\xf6\x60\x65\x87\x2b\x60\xf8\xc2\xaf\x10\x5e\x88\x33\x3f\x98\x8a\xa1\x50\x3d\x2d\x24\x4e\x0f\xb2\x72\x52\x2c\x42\xb1\x7a\x50\x74\x68\x9d\x97\x9c\x68\x92\x6a\x56\x65\xa6\x10\xdf\xff\xbf\x19\xca\xd7\x97\x87\x52\xf4\xd0\x49\xfa\xd4\xdf\x8d\x25\x2d\xa8\xcb\x15\xba\x50\xd1\xf8\x27\x65\x5f\x1c\x78\x36\x89\x0f\x39\x3c\xc9\x83\xc8\x2e\x80\x72\xc6\x38\xac\x6d\x6d\x98\x2b\xec\xba\x39\xd9\x35\xdf\x9c\x72\x7d\xe8\xf7\xbd\xe7\x30\x72\xd2\x92\xb2\x95\x2a\xc1\xfb\xda\x5b\x90\xfb\xd5\x8d\x52\xb5\xf2\x55\x2e\x1d\x55\xa6\xf1\x2d\x26\xbc\x8d\x13\xdc\xdf\xcd\x79\xbd\xc7\x2e\xb1\x7b\xa9\x83\xdb\x54\x30\x7b\xf2\x2e\xbd\x52\x7c\xa7\x05\xb3\xa3\x58\x0b\x66\x83\x58\x4b\x63\x7b\xa9\xce\x54\xeb\xa7\x13\xa7\x02\xdc\xae\xba\x75\xfe\xaf\xa3\x94\xe2\x6f\xa8\xe9\x6f\xd7\x69\x64\xe3\xb3\x9f\x78\xd3\x92\xdb\x20\x86\x85\x8c\xfa\xae\xb1\x67\x83\xdd\x19\x17\x06\x5a\xc7\x92\x6d\xd4\xb5\x96\x25\x6d\xcc\x02\x54\xbf\xdf\xa7\x4e\x9c\xa1\x6c\xad\x54\x22\x03\x3a\xe2\xe1\x22\x20\x56\x5a\x96\x26\x30\x1e\x5b\x79\x58\xcc\xc8\xa7\x6f\xba\xb3\xf2\xe9\x20\x05\x03\x0d\x39\x4c\x87\x1c\xa5\x43\x56\x60\x38\x7b\xe7\xb4\xc7\x8a\xf0\x1a\x45\xa0\xbd\x8c\xb7\x3f\xb3\xb7\x9d\x5c\x1e\xbd\x2d\xe7\xde\x3e\x64\x6f\x3f\xa6\x4b\x7e\xce\xde\xe2\xd8\xcc\xa3\xb7\xe5\xdc\xdb\xa7\x7c\xc9\x4a\xbe\x68\xfe\xf5\x53\x65\xaa\xf0\xd4\xfb\xc6\x87\xa9\xf7\x8f\x53\xef\x7f\x5a\x86\xd3\xb9\xf1\x3c\xbd\x77\x5e\x85\x04\x5d\x06\x3e\xf4\x5d\x79\x86\x58\xcb\x14\x4e\xde\x7e\xb2\xe6\x2b\x82\xad\xfe\x97\x50\xe4\xe3\x1c\x21\x7e\xe6\x59\xf6\x9b\x0a\xb4\x77\xd3\xb5\x94\x6b\x59\x05\x7d\x1d\xfa\xc2\x34\xa7\xa0\x54\x51\x41\x25\x76\xc3\xa7\x55\x08\xbd\x49\xad\x8d\x4e\x18\x25\x48\xa5\xdf\x91\x3c\x43\xf8\x5d\x0f\xd4\x02\x0d\xb0\x41\x04\x39\x38\x4e\x64\xf9\x4e\x3b\x02\xbe\x50\xb2\x76\x14\x87\xa6\x41\x89\x9f\xa0\x64\x00\xcf\x31\x81\x5e\x78\xa1\x65\x9d\x67\xca\xef\x70\x78\x94\x66\x11\xc2\x11\x9d\xae\x90\x48\x11\x3b\xad\x6e\x58\x11\x18\x5d\xa0\x0d\x62\xb8\xda\x26\x2a\x3f\xa0\x1d\xba\xb8\x18\xd0\x60\xbe\x06\xd8\x66\x44\x5b\x11\x95\x8e\xf7\x25\x64\x81\xae\x52\xef\xa0\xa4\xda\xe7\xf6\x80\x70\xae\x9d\x38\x3d\x66\x4a\x39\x60\x7a\x5f\x3d\xd6\x09\xe9\x21\x6a\x45\x5f\x71\x2e\xca\x59\x56\x90\xea\xfe\xaa\xb1\x27\xda\xc7\x4c\x4f\x71\x56\x77\x44\x36\x8f\x9d\x81\xdd\x70\x42\xbb\xe9\xdc\x29\xfd\xe5\x3b\x3d\xc0\x31\x5c\x48\xf5\x3c\x44\x92\x9a\xc9\x6b\xa8\xbc\xec\x8e\xee\x4e\x7d\x6e\x6c\x95\x16\xf4\x73\xc3\xb2\x4a\x85\x66\x71\x9f\x40\xba\x72\x47\xeb\x03\x76\x26\xb9\xc8\x5a\xdd\xd5\x42\xe4\x16\x06\xd6\xf3\x33\x2b\x2d\x07\x7c\x30\x0f\xa0\x59\x69\x73\x82\x02\x2f\x22\xe4\x6b\xb0\x72\x14\x61\x70\x4d\x03\x47\x74\x9c\x47\xb9\xd9\x92\x7a\x03\xc2\xa5\x03\x27\x94\x0b\xba\x99\x96\xaa\x66\x4b\x13\x3a\x9d\xa2\x95\x90\x83\xd9\x04\x1c\xb7\x8c\x20\x49\xd0\xef\x65\xf3\x0c\xb0\x2b\x00\xf4\xed\x1e\x83\x84\x1a\x67\x26\xcb\x86\x8d\x25\x33\x7d\x21\x95\x49\x95\xad\x07\xe9\xcb\x00\x54\xb3\x7e\x89\x90\x43\x34\xee\x00\x6b\xac\x57\x1a\x7c\x4d\xde\x2f\x2f\x2e\x4a\xe4\x2a\x2c\xa2\x81\xdd\xb7\xe4\xde\x33\xc0\x1e\x7a\xa2\xe5\x5c\xef\x13\x62\xea\x11\x12\xeb\xaa\xc0\xcc\xf5\x4e\x8d\xb7\x51\xd7\xe9\x89\x63\xa8\xca\x0a\xe1\xed\x6e\xa9\x64\xa5\xe1\xcd\x88\x82\x85\xed\x08\x96\x42\x97\x5f\x14\xbc\x3b\x13\x89\x74\x32\x91\x62\x5d\x1e\x73\xa4\x46\xd6\xe5\x1a\x76\xc4\xc3\x4b\xd2\xe4\xbe\x99\x2c\x33\xdd\x15\x7f\x06\xa5\xbe\xfc\xd2\x14\xf7\x8a\x89\xf5\x7e\x61\x79\x25\xa2\x39\xa6\xf1\x94\x1b\x57\x05\x01\xae\xe8\xa2\xc7\xd6\x04\x68\x18\xbd\xee\x3b\x11\xbb\xac\x8b\xb5\xcb\x3a\x15\x82\x0e\xde\xe8\xf0\x21\x9a\x8b\x62\x51\x2e\xe7\xb0\x55\x03\x8e\x73\xa5\x26\xc2\xd7\xdb\x5c\xa2\xb1\x9b\xa9\xd8\xf0\xe0\x09\x03\xf0\x11\xb1\x38\x58\x8c\xd4\xc9\xeb\xa7\x5b\xdc\x4f\xb7\xb8\xed\x63\x78\x57\x1e\x1d\x33\x5f\xa3\xe2\xc7\xca\xf3\x73\xac\x26\x81\x36\x59\x5a\xa1\x98\x56\x00\x4a\x60\x81\x70\x2c\xc8\x80\xe6\x00\x51\x43\x39\xac\xcb\xf2\xd7\x80\x7d\x77\x60\x78\x60\x9a\x2a\xf8\x34\xcc\xff\x03\x6d\x78\xff\x44\x3c\x92\x0a\xc3\xff\x49\x19\xa6\x2a\xd8\x95\x62\x05\x43\xb8\x8c\x96\x3b\x5d\x0e\x49\x87\x4b\x39\x38\x49\xd2\xf3\x46\x88\x66\x42\x09\x55\x38\x71\x0e\x90\xa7\x94\xee\xc5\x53\x19\x5f\xd3\xc5\xec\x69\xdf\x6f\xc7\xb0\x44\x1e\x8e\x16\x17\xdf\x46\xe5\x9b\x07\x75\x49\x17\xc9\x0d\x1d\xfd\x2f\x5d\x24\xa9\x7b\x70\x5f\x3b\xdc\xcf\x85\x24\x5c\x6b\xcd\xd2\x1b\x76\xdf\x1e\x58\x4f\xa1\x44\x05\xb3\x65\x76\x04\xbb\x98\x01\x78\x62\xa5\x3d\xbf\x5c\xf4\x69\xb5\x0f\x94\x59\x99\xdd\x66\x4b\xaa\x98\x5a\x80\x17\x2e\xc2\x80\x11\x4b\x17\x0c\xfd\x28\x16\x29\x18\x5a\xe1\x38\xd9\xc5\x73\x0a\x26\x9d\x49\x7f\x4c\xb3\xa7\xcd\x91\xfc\xd4\xf5\x17\xab\x8a\xa9\xa9\xad\x07\xa9\x0b\xde\x5c\xb2\x5e\x0e\xca\xe0\x02\xd6\xd1\x46\x42\x60\x29\x33\x76\xaa\x18\xc1\x23\x90\x60\xca\x8a\x3d\x72\x5c\xa5\x28\x06\x87\xb6\x5f\x47\xcf\xcf\xa3\xaf\x81\x95\x68\xc3\x6f\x14\xf5\xa5\x48\x82\x16\x34\x9d\xe3\x39\x21\x08\x60\x1b\x31\x81\x76\x39\x5a\xae\xd6\x02\x2c\x94\x3f\x7f\x5a\xf1\x78\xec\xac\xfa\x47\x7b\x9e\x69\x39\x1e\xfd\x8d\x91\x02\xc7\x90\x74\x7c\x16\x0c\xca\x2a\xdc\xcd\x1b\xcd\x88\xca\x2c\x3b\x16\xc1\x53\xb1\x5a\x99\x32\x24\x09\xf2\xb1\x11\x1a\xa6\x86\x54\x77\x94\xd2\x4b\x97\xf4\xe8\x4d\x1a\x7c\x60\x5f\xcd\x57\xfc\x82\x33\x4b\x5d\x8d\x43\x93\x34\x5e\xb3\x61\xa3\x06\x27\x56\x5d\x1a\xf4\xef\xa6\x02\xd9\x69\x8b\x01\xc7\x39\x8e\x45\x82\x7d\xc5\x5a\xb7\x2c\xb9\x82\xcb\x86\x1c\xe5\xbb\x6e\xf6\xb9\xf5\xa0\xbb\xfc\x0d\x3d\x5e\x7f\xa5\xc7\xaa\x7c\xc1\x35\x5d\x5e\x71\xcf\xd7\x5b\xd3\xa6\x9d\x2f\x57\x59\x83\xa4\x72\xfd\xff\xc6\x38\xa2\x5d\x77\x8e\x4e\xc5\x8f\xff\xea\x01\xfd\xfa\xa9\x69\xd6\xd4\x62\xea\xf4\x8b\x26\x59\x2f\xba\x2e\x9c\x4f\x51\xdd\xc2\xc5\x5d\x6a\x81\x79\x99\xa5\x5e\x66\xa9\x9d\x2c\xb5\x93\xa5\xc6\x59\x6a\x9c\xa5\x46\x59\x6a\x98\xa5\x1e\x7c\xd6\x89\x51\x96\x38\xea\xa7\x45\xfb\x59\x6a\xeb\x0b\xfc\x21\x21\x31\xc8\x12\x1f\x23\x4d\x60\x1f\x7e\x33\x8d\x2f\xe3\x5d\x77\xae\x1f\x01\x80\xe6\x62\xd7\xb5\x3b\xf4\x2f\xf5\x27\xb0\x40\xa9\x00\xbb\xdb\x71\xe7\x44\xeb\x03\x00\x3d\xe7\x72\x57\xf9\xc8\x17\x52\x15\xa6\x3d\xda\xd6\x43\xe9\xae\x9e\x7e\x29\x5c\xdf\x11\x47\x58\xee\x0d\x58\xf7\xa2\x77\xd2\xc6\x33\x50\x50\x57\x57\x7e\xda\x8c\x6b\x5e\x79\x33\xb6\x7f\xe1\xf7\x57\x6c\x7f\xff\x52\x43\x21\x7b\xe7\x4b\xcd\xb7\xbf\x7d\xa9\x5d\x9d\x20\x00\xcb\xf6\x97\x9a\x0b\x64\x66\x6f\xfc\xa2\x87\x2d\x7a\x68\x7e\xa9\xe9\xd9\xb1\x1b\xc3\x5a\x58\x6e\x0c\xed\x51\x40\xbf\xa3\xc0\xde\x50\x79\x04\x61\xbb\xf9\x0b\x7e\xaa\xd6\xbf\xd4\x2a\x13\xa0\x35\x89\x58\xec\xb2\x10\x03\x7e\xb8\xdd\x4c\x97\xe4\x69\xdb\x45\xd1\xbd\x0e\x1c\xe5\xc8\xf1\xa2\xc0\xcc\x32\x64\xb7\x7d\x39\x3e\xe7\x20\x78\x1c\xa4\xb4\xa9\xa8\x77\xfe\x60\xf5\xad\x64\xaf\x56\x6a\x55\x1b\xad\xc2\x0d\xde\x8f\xcc\x42\x99\x9b\x58\xe1\x22\x22\x4e\x29\xb7\x2e\xdd\xf7\xfc\xbe\xa2\x57\x88\xc5\x07\x0b\x23\x57\xd0\x35\x8d\x61\x5d\x45\xbb\xe1\x59\x3a\x29\x70\x67\x2b\xe7\xe5\xa1\x6b\x6b\x41\x62\x01\x10\x2b\xaa\xc9\x26\x5a\x47\xc1\x17\xee\xf9\xb2\x70\x0b\x74\x90\x95\xc7\x0f\x2b\x5e\x39\x68\xd4\x75\x9c\xc5\xf8\x3f\xaa\x2f\x42\x12\x7b\x8a\x26\x5d\x20\x2a\x8c\x28\x0c\xd6\x67\x50\xe4\xc3\xd3\xd0\xad\x75\xed\xb3\x5a\x8f\x83\x66\x2a\xc7\xee\xa9\x87\x9a\x4f\x13\xa2\x2e\x8a\x45\x3a\x1e\xfd\x09\xad\x94\x4b\xee\x24\x16\x90\x38\xe1\x66\x00\xd7\x33\xe8\xba\x00\x6e\x34\x99\xf8\x25\x0e\xbe\xd6\xc5\xd4\x22\x9c\xcd\xec\xba\xf1\x1e\xdc\x22\xfb\xe6\x7d\x7d\xa5\xc4\xb3\xcb\xa4\xab\x97\x49\x37\xb7\x4c\x2e\xf5\x32\xf9\xb5\x2b\xcb\xe4\x62\x33\x5d\x26\x07\x9f\xb1\x4a\xb8\xeb\xeb\x2a\x89\xf6\x71\xb6\x5c\x44\x30\x98\xca\x37\x83\xfc\xdc\x2f\x1b\x13\x6e\xf3\x28\xf1\x4a\x03\x0d\x26\xf5\xa9\xa2\xb9\xb5\x11\x1a\x79\xd4\x99\x2a\x51\x0e\x94\x17\x51\x1e\x5c\x68\x31\x34\x23\x29\xbd\xed\x02\x10\xd1\x25\x87\xd8\x9e\x03\x4e\xc3\x06\xff\xd2\xdc\xe5\x22\x61\x93\x9b\xf3\xea\xa7\x25\x76\x1e\x43\xa7\x63\xc9\x61\x21\x2e\xfd\x39\xa1\x16\x7b\xd8\xf7\x84\x00\xf1\x49\x4a\x10\x0f\x33\x2e\x30\xce\x7b\x8c\xec\xc7\x7f\x55\xae\xc8\x9a\xae\x58\xe6\x42\x45\x7f\x75\x0a\x57\x27\xf3\xf0\xf8\x35\x7c\x7c\x47\x99\x13\x01\x9e\x36\xcc\x99\x6f\xf7\x06\xb5\x2e\xc7\xb6\x37\xa4\x3f\xdd\xdd\xb9\xde\x3e\x8f\x3b\xb4\xb6\xb7\xbf\xcc\xf5\x0c\x3e\xed\x54\x63\x02\xef\xe6\xe2\x70\xc9\x2b\x6f\xfc\x92\x20\x29\x91\xa5\xc2\xfa\x71\x52\x24\x8e\x8e\x7b\xce\xd5\x0e\xd1\x03\xe5\x6f\x5f\xe0\x40\xa6\xe7\xfc\x3e\x2e\x18\x5b\x69\x33\x2e\xba\xb2\x8f\xe0\xb9\xe7\xfb\x17\x42\x10\xe1\xd0\x65\x3a\xfd\x92\xaa\xf5\x8c\x70\x8d\x7d\xbd\x29\x7b\x53\x7b\x51\x1a\xf0\xca\x3b\xea\x0b\xcc\x3b\xd2\xbe\x49\x1c\x9f\xbf\x00\x3f\x5f\xc4\x36\xf4\xb1\x23\xfb\xb2\x23\xc5\x2d\xb8\xe2\x1f\x89\x25\xf4\x0b\x77\xb2\x03\x4b\xdc\x58\x1d\xd7\x52\x44\x51\x8e\xbf\x3a\x09\xbc\x48\x3b\xe2\x64\x4a\x45\x56\x2e\xaf\x5d\x17\xac\x2c\xb6\x72\xc3\x7a\x6a\x50\x03\x8d\x5c\x03\x94\xdb\x58\x19\x17\xab\x4a\x24\x87\xd7\xd2\x98\x40\xd5\xfc\x62\x3d\x0d\xd2\x18\x2b\x13\x0e\xb1\xd2\xc0\x7b\x17\x99\xbf\x24\x1e\x80\xc4\x4f\xe6\xf7\xee\x79\xc6\x70\x36\xcb\x67\xa5\xb1\x45\xe5\xd6\xbf\xe0\x93\x9a\x5a\x06\x85\x4b\x59\x5f\xc7\x60\x7e\x74\xcc\xc3\x2e\x47\x3e\xe5\xec\x2e\xe1\x8a\xc6\xf3\xf3\x42\x4f\xa3\x96\x3b\x42\x2d\x63\x13\xb5\x78\xc0\xe3\x0a\xbb\x30\xbb\xc4\x41\x85\x89\xf2\xad\xae\x8c\x64\x2a\x2e\x09\xe8\x23\x44\x57\x24\xcc\x31\xc8\xfc\x2e\x88\x1f\xe3\x50\x66\x9f\xb8\xed\x11\x31\x89\xc9\x79\xfd\x0e\x7d\x1b\x6b\x92\x5d\x5c\x76\xf7\xa4\x50\x5f\x46\xd7\x20\x88\xf6\xe1\x87\x75\x04\x0f\x0b\x0d\xc2\xaf\x60\xba\x83\x42\x93\xa6\x71\x14\xe0\xd9\xa5\x43\x75\x75\x9f\xc8\x91\xda\xbe\x8a\x3f\xdd\x2f\x56\xb9\x95\xc5\x45\xaa\x5b\xac\x9e\x13\x34\x1a\xe5\x33\x2c\xbf\x2f\x45\xc4\x96\xce\xa0\x3a\xce\x3c\x7d\x35\x25\x74\xf2\xbe\x0c\xe9\x0e\x47\x09\xfb\x49\xa3\x49\x48\x68\x2c\x63\x3d\x0f\xe9\x6c\x0e\x70\x6d\x18\xb8\x53\x3d\xa7\xe5\x83\xbe\xbb\x9a\x00\xb7\xd3\x2e\x60\x1c\xe5\x33\x13\x43\x10\x1d\xfb\x83\xd0\xf7\xd5\xa8\x37\xec\x0c\x7a\x1c\xd1\xf9\x92\xf0\x06\x78\x11\xbd\x9b\xf2\x5e\xf5\x9b\x53\xba\xa7\xb2\x87\xda\xe7\x46\xf8\x6e\xcb\x88\x5a\x46\x4b\x25\x12\x60\x76\xa5\x2c\xb1\xb4\xe0\x7f\xd7\x5c\x66\xe2\xe1\x14\x57\x1c\xb0\xf7\x69\x9b\xf7\xcb\x0f\x76\x1f\x3e\xc9\x7a\xe5\xef\x90\x60\x1d\x7c\xe6\x00\x33\xb4\xbc\xfd\xd5\xb5\x9d\x5a\x67\xa3\x8e\x4d\xcc\x3e\x8e\x7b\xce\x32\x52\x25\xd2\x5a\x4d\x78\xb9\x0c\x08\xd9\xdc\x89\x83\x7e\x74\x6e\x50\x3e\x84\xe5\x72\xff\x3c\xc3\x22\x89\xa0\x3e\x6e\xa9\x10\x28\x20\x15\x07\x04\xa1\xf7\xcb\x35\xfc\xd8\x58\x23\xfd\xf3\xf6\xe1\x23\x3c\xde\xa1\x8b\x89\x3d\x82\x6e\xe7\x98\xdd\x7c\xeb\xf0\x44\xb2\x48\x62\xc5\x44\x1e\x5e\x15\xee\x6c\xc4\x29\x1f\x67\x93\x8c\x2d\xd5\x7e\x3c\xff\x7a\xc7\xae\x9f\x9e\xa2\x74\xe9\x47\xd9\xd2\x27\x5e\x74\x32\x56\xf2\x06\xac\xfc\x01\x0e\x72\x5e\xf8\x67\xb5\xc4\x5e\x73\x6b\xb2\x48\xb8\x43\xca\xef\xaf\xa7\x82\xda\x24\xec\x3a\x38\x9f\xad\xb6\xc8\x48\xe2\xda\xb8\xca\x05\xe7\xdd\xbd\x9b\x15\x99\x71\xc5\x49\x0b\x4f\x4f\xbb\xe9\x72\x5e\x70\xba\x46\xaf\xc7\x2f\x84\x05\x56\x0a\xee\x13\x83\x23\xea\x9b\xb8\x9b\x48\x80\x0e\xbc\x9c\x06\xb5\x0a\xd4\x6c\xd7\x76\xe0\x55\x85\x8e\x16\xc7\x2f\x7a\xe2\x41\x85\xe5\xec\x88\xf5\x98\xf9\x4f\x29\xe2\x6d\xfa\x92\xc7\x2f\x05\xb6\x5b\x04\x15\xca\x2b\x6a\xd7\x75\xda\xed\xea\xb9\xdd\xfe\x54\xe1\x3f\xf8\x5b\xb1\xab\xf2\xf7\x13\xff\x7c\x90\x34\x9d\x9a\xa6\x1b\x39\x59\x5e\xc5\xfe\x9c\xa5\x2d\xa7\x8f\x66\x81\x8a\xfd\xa7\xf1\x9c\xcf\xa1\x36\x73\x6f\x9f\x73\x6f\x28\x7b\x6e\x5f\xa4\x7d\x46\xfb\xe8\x4b\x15\xfd\x58\xae\xe8\x51\x54\x2b\xf2\x3e\x3b\x22\xe9\x90\x74\xbf\x5a\x79\x75\x90\xba\xef\x7a\xac\xd5\xca\x3f\x1a\x7d\x36\xe4\x6c\x20\x1f\xff\x0d\x6c\x96\xff\x47\x70\x9a\xce\x35\xfa\xab\xff\xff\x49\x12\x16\xcc\x22\x15\x02\x27\xb1\x26\xce\x87\x8c\x99\xdb\x98\x7f\x03\x71\xb4\xa9\x59\x37\x8f\x98\x39\x1d\x43\x14\x8e\x4d\xc4\x10\xdb\x66\x6f\xb1\x5c\x80\x4e\xf3\xfd\x0b\xcb\xde\xdc\x76\x39\xde\x97\xb0\x80\xca\x85\xe8\x66\x6c\x78\xcf\xba\xda\x4c\xbd\x67\x5d\xdc\x1a\xe9\x87\xb1\x0b\x8b\x0f\xf8\x90\xf5\xdc\xdb\x44\x3b\xdf\xd5\x8d\x9f\xec\xb0\x28\x84\x1d\xdf\x1a\xee\x74\x29\xe9\xe5\x70\x83\x4c\x2d\xb2\x8b\x5e\xdd\xca\xe9\x8e\x85\xee\x9f\xa9\x91\xbc\xea\x84\xf7\x6f\x03\x5b\x09\x60\x5a\x69\xe0\xc2\xbd\x8e\x31\x9c\xfb\x2b\x27\x07\x9c\xfb\x35\x42\x82\xca\x51\xaf\xdc\x02\xb4\xbf\x9d\xbf\x75\x7e\x5e\xc0\x6f\x6e\xd7\x63\x17\xb1\xec\x87\x78\xeb\xde\xb5\x0f\xac\x1a\x3f\xbf\xe3\xe7\xba\x32\xf1\xa3\x26\xcd\x91\xfb\xce\x13\x3b\x90\xa4\xfe\xbf\x06\x01\x61\x76\xa7\xe0\x70\x48\x70\x58\xe0\x1b\xab\x1f\x66\x27\x7b\xcc\xf3\x06\xce\xd9\x55\x41\x55\x6b\x6f\xc2\x5b\x3b\xdc\x21\x8f\xc3\xd4\x0d\xed\xc5\xe6\x6c\x6b\x3e\x47\x5f\x51\xd9\x69\xc9\xd3\xd8\xcd\x83\x61\xf0\x40\x60\xf8\x4e\x8b\xe4\xa2\xa1\x2f\xe1\xbc\x4f\xf9\x22\x7b\xd4\x09\x7b\x97\x8a\x34\xe1\x20\xda\x17\xef\xcc\x3a\xb3\xd9\xe4\xe0\x44\xb1\xae\xdc\x8a\x45\x2f\xdd\xeb\x17\x9e\xa2\x4e\xaf\xc7\x8e\x96\xa6\xea\xfc\xde\x44\x9d\xd3\x8f\x3a\x24\xe3\x70\xb6\x06\x67\xdc\x0d\xf2\xd0\x70\xd1\xd7\xca\x0c\x90\xba\x0c\x24\x17\x40\xf2\x73\xb0\x71\xf3\x9f\xdd\x41\x00\x26\xbd\x13\x76\xf3\xdf\x4c\x9d\x04\xc6\x03\xed\xfa\xd7\xfd\xa4\x8e\x38\x95\x6e\xa7\x9e\x0f\x0c\xaf\xbd\xda\x51\x6e\xfd\xf0\x5e\x56\x70\xfb\x3c\xe3\x88\x4f\x3a\x50\xf4\xf1\xca\x2a\x1c\x31\x75\xe1\x98\x36\x8d\xa5\xf3\x8e\xb5\x6b\xb2\x8e\xbd\x30\xab\x27\xfc\x34\x21\x02\xfd\x0e\x07\x8e\x5b\xbe\xb3\x68\x8d\xdd\xd5\xdc\xfa\x35\xde\x10\xa0\x8b\x08\x6d\xc4\x06\x88\x8c\x08\xe6\x5a\xe2\xb2\x99\x1a\x1a\x5e\x39\x7b\xb9\xa9\x8a\xe1\xd2\xbf\x9e\xa8\x9e\xaa\x32\xaa\x5a\xa8\x3c\xe4\x1e\x87\xc6\x9e\x89\xd6\x94\xbd\xc3\xbd\x6e\x73\x4c\x1d\x83\x77\xd9\x52\xe0\xda\x04\x9b\x5a\xe0\xaa\x05\x1d\x98\xa8\x23\xba\xc0\xf5\x6f\xe4\x84\x47\x39\x9e\x17\x53\xbf\x65\xa5\xcf\xbf\xb6\x53\x89\x12\xca\xd3\x5e\xfa\xfe\x4d\xa1\x9e\x31\xbf\xfe\xd2\x61\x4e\x29\xbf\xae\x76\xa8\x43\x3b\x54\x69\xc3\x5d\xb5\x94\x59\x9b\xb2\xca\x80\x7b\x45\x60\x03\x75\xed\x97\x5f\xc4\x0d\x6c\xf7\x66\xe4\xda\xdf\x22\xd5\x83\xdf\xbb\x44\x77\x2a\x65\xd6\x93\x8e\x8e\xd6\xbd\xa1\x4c\x59\x77\xdc\x79\x32\xbf\x77\x87\x05\x85\x87\x21\x6f\x35\x78\xd2\x43\xe5\xa6\x9e\x7d\xfb\x71\xdc\x30\x5c\xc1\xbf\x25\xa6\x1f\xaf\x34\x69\xf4\x35\xa1\x65\xf5\xbd\xbf\x8d\x34\x22\x0e\x4f\xcb\x9d\xf5\x59\x07\x5b\xa1\x4b\xc9\x05\xd5\x4f\x18\x23\xb9\x70\x2c\x67\x8a\xfb\x36\x5b\xf9\x3b\xf0\xe4\xa4\x60\x95\x6f\x2e\xd8\xef\x4f\xf9\xe0\xc1\xd9\xef\xf3\x6e\xa0\xa1\xbf\xdb\xb4\x32\x4d\x94\x51\xc2\x57\x49\x6f\x89\x6d\x22\x4a\xcd\xbb\xa6\x42\x77\x9b\xe8\xe2\x5b\x7e\x3e\x23\xce\xe0\xf9\xf9\x24\xad\xfb\x6b\xe8\x16\xd9\x0d\x09\x55\x38\xe9\x40\x30\x8f\x60\xf1\xf8\x80\xd6\x25\x72\xf0\xb2\xb8\x88\xf6\x64\xa4\x34\x2d\x6f\x11\x37\x97\xfa\x00\xca\x30\x60\x0f\xe5\x68\x0e\x40\xa3\x54\xf4\x2f\x84\x11\xb2\x5b\x0e\xdc\xa1\x7b\xfc\x38\x08\x39\x6a\x07\x1d\x4a\x01\x6d\x15\xf5\xe1\xf8\x82\xfd\xe6\xfe\xca\x25\x86\x92\x48\xc7\x94\x4f\x89\x9c\xb4\x4e\xf8\xe7\x74\x9b\x76\xc7\xda\x03\x76\xe9\x6d\x27\x80\x4b\x72\x5a\x72\x6e\x12\xe2\xc9\x54\xa5\xd9\x4a\x55\xa9\x69\xb5\xba\xd7\xec\x3b\x86\x9a\xb8\xfb\x6e\xd9\x5b\xdb\xae\x21\x06\x71\x50\x02\xe7\x00\x95\x73\x46\x9b\x4a\x3b\x48\x16\x5f\xe6\xa0\x29\x74\xf9\xf2\xe8\x48\xb7\xb3\xd1\x00\x1e\xba\x01\x85\xc8\x01\x1f\xee\x8f\xa9\xdf\x46\xfe\xe8\x3b\x6b\x26\xc9\x4c\x18\xe9\x4d\x5d\x2f\x44\xbd\x70\xa6\xde\x50\xea\x09\x6b\x12\x30\x8c\xc7\x1e\xd6\x92\x13\xe8\xd4\x30\x4d\x75\x1f\x9c\x30\x8d\x0f\xa7\x8a\x31\x16\xd0\x5d\xb0\x75\xb2\x7e\xa2\x1a\x59\x81\xe1\xf7\x2c\x19\xa0\x96\xa2\x5f\x75\x12\x2b\x7b\xe9\xd4\xb4\x25\x47\x67\x67\x2d\x42\x56\xca\x50\x56\x45\xde\x3a\x84\x31\x00\x51\xc9\xa7\x71\xb8\xab\xa3\x4d\x3a\x16\x09\x55\xd4\x35\x68\xb1\x8a\x04\xe2\xc6\x20\xb9\x26\xbf\xd3\x9e\x48\xb2\xaf\x67\xfd\x44\x63\xba\xc0\x8d\x9f\x76\x86\xf6\x96\x31\xf7\xd7\x39\x06\x60\xce\x77\x9c\x7c\x0f\x1d\x20\x87\x8c\x0d\x18\xec\x6a\x3d\xd3\xac\xb3\x6f\xf1\xc5\xcc\xf9\x32\x16\x20\x3b\xc5\x7f\x8f\x65\x2d\xee\xf1\xaf\x3a\xc9\x95\x3b\xf4\x2f\x38\x24\x39\x22\x8f\x1f\x6d\xe6\x22\x74\xdf\x4c\xcb\xec\x5d\x20\xe0\xa0\x58\x60\x59\xec\xc1\xc3\xf9\x6a\xf9\x53\xad\x54\xfe\xc4\x61\x0a\x89\xf6\x23\xbe\xd8\x05\xaa\x0e\x8a\xfe\x12\xe7\xf3\xdd\x90\xfb\x8e\xbd\x84\x71\x17\xd5\x16\x7c\x7e\xde\xc6\xbd\x95\x9a\xd5\x2b\x9c\x90\x92\x05\xf2\xa8\x22\x17\x49\x5e\x6b\x35\x51\xdf\xc7\xb7\x6b\x43\xe3\x45\xf3\xd7\xc3\xce\x90\x58\x6a\x17\x27\x9e\xdd\x77\xaf\x40\xc8\x78\xef\xa0\x81\x4c\xa3\xab\x01\x14\xb6\x3b\xa8\x61\xef\xdb\x7a\x2f\x53\x6a\x38\x3e\xb7\x87\x57\x94\x3c\xbc\xb2\x8f\x51\xe5\x38\xb4\xc3\xa8\x86\x9e\xdb\x67\x41\xed\x69\x23\xac\x9d\x21\xfa\xcc\x5f\xe0\x43\x6f\xbb\xfc\x32\x18\x00\xa3\xda\x69\xa0\x4c\x5d\xe8\xe4\x9b\x51\xe8\xe0\x4f\x2e\xb4\x73\x49\x24\xd6\x86\x57\xf3\x08\xf5\xdb\xdb\xc4\x43\x42\x84\x78\x0c\xb9\xca\xf1\x85\xb0\x90\x44\x95\x76\xcc\xd9\x1f\x9a\x5c\x9c\x9b\x1e\x23\x23\x06\x99\x0d\xd4\xb6\x7a\xc7\xcf\x35\x00\x6f\x55\x40\xb9\x7a\xaf\x6e\xc3\x6a\x0f\xfa\xe1\x91\x33\xac\xda\x58\xb5\x87\x59\x29\x56\xf5\x9e\x5e\x93\xe6\x54\x70\x90\x19\x9c\x11\xe1\xc4\x77\xdb\xfe\x78\xde\xdd\xd0\x93\xfb\x17\x5c\xe7\x42\xb2\x4a\x3c\xf3\x19\xfd\x9c\x09\xe7\x6c\xc8\x89\x94\xf8\x48\x11\x4d\x1c\x28\xc5\xe6\x90\xe1\x31\x82\x78\x8e\x57\x1b\xdc\x2b\x9a\xc9\x75\xf5\x60\x71\xec\xce\x78\xde\xe7\x86\xca\x5f\xf1\xc1\x9f\xe8\x32\x7d\xef\xd5\xaf\xfd\xda\x95\xaf\x75\x2e\x0b\x7c\x69\x7a\xd8\xa1\xdf\x69\xf3\x82\xf2\xd9\x92\xdc\x4c\x3d\x28\x81\xff\x71\x98\x26\x3c\x3f\x7f\xd3\x9e\xcb\xca\x67\x96\xe5\x72\x20\x3c\x3b\xbc\x14\x7a\x0a\x20\xa1\x65\xfc\x17\x9d\x16\x61\x2f\x1c\x02\x75\xb9\x7f\x71\x1c\x18\xc5\xa8\x98\x8b\x79\x8d\x4e\x72\xac\xe5\x88\xfe\xc5\x4e\x4c\x3d\xb2\xe8\x44\x5b\x5c\xa4\xbe\xc5\x38\x24\xed\x05\x18\x8c\x72\x24\x96\x53\xa5\xf6\xc9\xba\x02\x38\x4d\x4e\x33\x77\x7a\x10\x1d\x45\x58\x35\x31\x96\x52\x68\xae\x96\xc4\x5c\x2d\xdb\x2d\x6d\x10\x21\x08\xe8\xab\xa3\x10\x8d\x71\xa3\xc2\xe0\x3a\x56\x60\xa3\xd6\x98\x96\xc8\x2d\x8a\xfa\x15\xee\x0d\xae\x36\x33\xf1\x2a\x6d\x62\x84\xce\xaf\xd6\x11\xde\xeb\x6a\x53\x24\x4c\xb1\xbe\xad\xe0\xa4\x18\x81\xa0\xf0\x0b\x7b\x23\x28\x53\x44\xe9\xad\x70\x97\xb0\x1b\x48\x24\xc6\x7c\x91\x53\x91\x25\x88\x68\x8f\xa7\x7b\x34\xc6\x76\x6b\x4c\x0b\x0f\x91\x7d\x71\x37\x82\x0e\xbf\xe9\xf4\x93\x21\xf1\x4c\x21\x22\x77\x9c\x30\xe8\x32\xb9\x70\xf5\xaf\x3f\x99\x13\xb5\x2c\x7d\x2f\x22\x32\x31\xbe\x4f\x23\xb8\x9f\xf1\x59\x8b\x05\x80\x4b\x63\xbb\xeb\x3c\x8d\x10\xbb\x68\x14\xe0\xba\xc1\x85\x34\xf3\x02\xb8\x9c\xf8\x8c\x5f\xbb\xf4\x4b\xab\xc5\xee\x0b\xfe\x02\xb5\xe9\xda\x6a\x87\x0c\x9c\x18\xb7\x6d\x1a\x92\xb6\x02\x24\xf1\xb7\xf8\xc0\x66\x88\x0f\x74\x6d\xaf\xfc\xce\xb7\xa4\x5e\x5f\x24\xc3\x4e\x9f\xfa\x4b\x4b\x6e\xc0\x97\x07\xc6\xaa\xa3\xb5\xe4\xec\x18\xeb\x8a\xd7\x28\x17\xdc\xeb\xbc\x5a\xb0\xee\xea\xd8\x8a\xe5\x07\x67\x21\xcb\x49\x13\xb9\x29\x5e\xe7\x73\xda\x1a\xba\x9a\xe0\x24\xb4\x85\xeb\x7d\x57\x83\x8d\x96\x49\x2f\x73\x3c\x9f\xb6\x96\xfb\x5c\xf6\xfc\x68\xa4\x3f\x3a\x1e\x6f\xb1\xfa\xfc\x71\xbe\xfa\xc9\xff\xd9\xce\xe3\xaf\xb8\xe2\xee\x5d\x44\x89\x87\x80\x39\x18\x98\x17\x40\xf8\x4f\x3f\xb2\xca\xad\x53\x7d\xc2\xa7\x89\x96\x05\x1a\x78\x4d\xa1\xe8\x35\x09\x18\x75\x58\x93\x68\xf3\xb6\x9b\xdb\xb3\x68\x60\xde\x9e\x1d\x28\x64\xaf\xf7\x5a\x6e\xe7\x8e\xa7\x34\x43\xeb\xfa\xa0\x5f\xcd\x9f\xf3\xab\xe9\x9b\x6c\xa8\x4a\x4a\x4c\x20\x36\x9d\x49\x03\x98\x84\x95\xb0\x83\x5e\xb9\x89\x0b\xd5\x94\xfa\x21\xfc\x2f\x31\x6c\x55\x03\x29\x81\x52\xcb\xbe\x99\xb5\xef\xe8\xea\x81\x7e\xc2\x20\x0f\x63\x97\x15\xe5\xa5\x37\x81\xad\x82\x18\x52\xd3\x12\x09\x4c\x0e\x92\x68\x43\x17\xa2\x6e\x54\xed\x80\x2f\x08\x5c\x70\x69\x4d\x75\x65\x05\x4e\x0d\x67\xd2\xfb\xa0\xce\x93\xd9\x3a\x4c\xbb\x3b\xcd\x61\xfa\xda\xae\x2a\x5a\xab\x67\x67\x02\x97\x76\xcf\xdb\xef\xce\x69\xae\x44\x56\x14\xe2\x80\xe0\x29\x53\x99\xe5\xfd\x21\x74\x90\x0e\x6b\x95\x15\xb8\x6f\xf6\x57\xa0\xf8\x83\xed\x62\x1a\x1e\xec\xe6\x42\x30\x84\xae\x20\xc0\x93\xce\x54\x04\x31\xcd\xbd\x96\xb7\xdf\x81\xcf\x25\xb2\xf7\xce\xe2\x38\x2f\x28\xab\xe3\x47\xf7\xfd\x02\xd1\xc4\x1e\x9f\xd3\xd8\x2b\x77\x16\xce\xec\x5c\xaa\x2a\x4e\x88\xb2\xcc\x3e\xee\x04\x6b\x7b\xe5\xd1\x36\x01\x20\x41\xc4\x0f\xc2\x33\x88\xb9\xc4\xf8\x04\x94\x09\xb7\x0c\x0e\x5d\xfa\x25\x54\x80\x84\xbd\xd6\xa6\x40\x38\xae\xf3\x5d\x4e\x3b\x7c\xaf\x1c\x99\x85\xb8\x58\xbc\x93\xc5\xeb\x95\x6f\x07\x05\xa5\xf4\x1f\x38\x0f\xc7\x8c\xe7\x2c\x99\x88\x79\x4d\x69\x3e\xe2\x8e\x90\x34\x8f\xc4\x4f\x63\xfc\x10\xd0\x63\xf1\xdf\x1a\x31\xcf\x6f\x71\x64\x0c\x76\x8c\x9f\x79\x3c\xc0\x7c\x11\xc7\x86\x18\x0b\xbc\xa1\xf8\x04\x9f\x99\x09\x21\x59\x9e\x2e\xb7\x05\xef\xda\x60\xb4\x70\xdd\xc9\xaa\xb5\xb4\x37\x1e\xb7\x9f\x9f\x85\x38\xe6\x85\x48\x4c\xe1\x86\x2c\xa6\x6c\xee\x70\x3e\xd7\xaf\x35\x79\xe9\x21\x40\xb2\x37\x0f\x28\xda\x64\x50\x16\x3d\x8c\xfd\xb2\x77\xf7\x41\x30\xea\x0d\x00\x41\x4c\xe0\xe2\xe2\xf2\x57\xe1\x1c\xa9\xc1\xcb\xcb\x02\x5c\x28\x72\x86\xb0\x87\x00\xa5\xa7\x1e\xf7\xb6\x0b\x7a\x46\x52\xa0\xca\xfc\x66\xa0\x0d\x67\xe9\x2a\xc3\xf1\x8d\xc2\x9a\x20\xcd\x7c\xc0\xd0\x33\x41\xe8\xcd\x59\xe9\xd1\x7c\x58\x6e\x98\xab\x9a\x8e\x6f\x51\x36\x05\xed\x9e\xc2\x49\x22\x58\xe7\xc3\xa5\x07\x90\xa3\x96\xfc\xd5\x6a\x0d\xf4\xbb\x13\x2c\xf1\xf6\x0e\x96\x20\x4d\x13\x59\x81\xbb\x84\x07\x14\x62\x78\xe8\x98\x79\xda\x8f\x84\x6f\x58\xb4\xd0\x8a\xa1\x0d\xe2\xbd\x55\xc8\x49\x75\xe1\x30\xff\x4d\x08\x8c\x55\x74\x69\x71\xb0\xce\xee\x9f\x7e\x74\xda\xbd\xf0\xbc\xbd\x7b\x4e\x65\x59\x2d\x3c\x6b\x9f\xed\x04\xcc\x7e\xda\x3e\x42\x9a\xfb\xc5\x60\xc9\xb3\x63\xa0\x38\x56\x43\x9b\x18\xd3\x93\x63\xad\x35\xa9\xac\xc8\xa5\x1c\x8b\xac\x68\x92\xba\x8f\xdd\xe8\x63\x37\xfa\x7a\x37\x0a\x89\xf4\x00\xe3\x8e\x7a\x08\x45\x66\x28\x7f\xeb\x7b\xf8\xa0\x7c\xba\x06\x2b\xb1\xf2\xf1\x1a\xf5\xa7\xcb\x02\xbb\xf5\x56\x01\xf4\x01\x74\xc3\x03\xa5\xc7\x7a\x1f\x5b\xea\x56\x0e\xb1\x5a\xa8\x42\x0f\x7a\xff\x28\xfc\xd8\x2a\x28\x0d\xc0\xec\xab\x20\x5f\x6d\x56\x31\xef\x12\xa3\x03\x5f\xf8\xa0\x95\xd0\x19\xd1\x85\xab\xa7\x87\x20\x08\xb5\x90\xa8\xa7\x50\xf4\x2c\x43\x56\x7f\x0c\x88\xb6\xb4\x23\xa5\x49\xca\x13\xae\xcf\x37\x1f\x4b\x4c\xac\x2f\x41\x4f\xeb\xa0\x5d\xb2\x9c\x44\xc7\x95\xd7\x94\x09\xb5\x75\xc3\xb6\xe7\xad\xf7\xfc\x5c\xfd\xca\x7e\xaa\x59\x71\x87\xf0\xc2\xc0\x32\x2e\x30\xb5\x0d\x92\xd7\xe6\x7b\x50\x0f\x88\xf0\xcc\x42\x40\xd5\xbb\x01\x7c\xa0\xb3\xf7\x15\xbe\x2b\x70\x24\x4f\x0d\x20\x52\xbe\xc0\xe3\x12\xf8\x30\xb8\xf2\x47\x20\xfc\x7a\x58\x2a\x69\x5a\x93\xf3\xe3\x92\xbf\x14\xc2\x4d\x86\x52\xc1\x95\xd2\x8b\x8b\xac\xdd\x09\x83\xa9\x14\x1a\x9e\xdc\xcf\x86\x2a\x84\x34\x3e\x17\xd2\xe7\x94\x76\x02\xba\xc3\x3a\xa9\x71\xd1\xa1\x63\x1c\xb5\xa5\x7d\x0b\xda\xec\x07\x10\x8f\xa1\x6b\xda\x41\x39\xb1\x84\x88\xd4\xeb\x6b\x70\x57\x95\xae\x39\x35\xa0\x3b\x56\x44\xc7\x6c\xb3\x63\x61\x94\x75\x4c\x6f\x0b\x33\x96\x7b\xe3\xdf\x80\x35\x33\x3d\xf2\x94\x33\x1e\x10\x2a\x21\x1b\x7c\xb6\x39\xda\x34\x48\x74\x35\x68\xe8\xc0\xa2\x60\x7c\xce\x25\x54\x61\xec\x60\xc8\x65\x92\x63\x16\xfd\x10\x2f\x42\x4f\xe1\xfb\x00\x6c\x0a\x87\xec\xc5\xf0\xd8\xe1\x74\x5b\xda\x39\x07\x03\x1e\xb1\xff\x7b\xe9\xda\xcc\x44\x43\x5f\xc9\x98\x67\x5b\xb9\xe4\x46\xa8\xd7\x3a\x86\xa0\x50\xc4\xf1\xb6\x22\x45\xee\x38\xa4\x17\x5e\xf1\x0c\x7e\x81\x4b\x85\xfa\x56\x59\xf4\x78\x79\x72\x44\x8f\x57\x9c\x4a\x84\x34\x12\xeb\xbd\x3c\xc3\xf8\x43\xeb\xf2\x66\x55\x8c\x81\xb3\x92\x3f\xc6\xce\x93\x8d\x1d\x49\x2f\xb8\x70\x1e\xba\xef\x39\x99\x40\xf1\xb6\x50\xf9\xda\xb5\x18\x00\x5d\xd1\x58\xae\x7e\x15\xce\xa5\x54\xe5\x80\x77\x5c\xe1\xcc\xca\x2a\x63\x88\xdc\x64\x8f\xbe\xd7\x93\x2e\xf6\x00\x66\x74\x25\x2c\x46\x4b\xdd\xa5\xa0\xdd\xcb\xc2\x90\x9a\x1e\xc5\xd7\x4c\x7c\x2c\x61\x25\x0d\x51\xd2\x86\xc7\xc8\x54\x88\xcf\x0d\x4f\xd3\x9f\xf4\xf4\x22\x6b\xed\xe2\xfe\x62\x62\x08\xd5\x33\x4b\x57\xf9\x94\x72\xca\x53\xbe\xb8\xc5\x17\x2e\x6e\x69\xe6\x93\x18\x8f\x42\x8d\xa8\x13\xf6\xe2\x36\x95\xd7\xe1\xb8\x9d\xc9\xdf\x8c\x8d\xfc\x5f\xb3\xf9\xbf\xe2\xdc\xb1\xb3\x9d\x85\x67\x71\x76\x2f\x53\xaa\xd2\x4a\xa9\xd8\x9a\xe6\xa8\xfc\x2c\xdf\x7d\xd0\xf9\xee\x43\x4d\x71\x5a\xb4\xea\xe4\x40\xf0\x4a\x34\x7f\x7e\xd1\xa9\x9a\x34\x23\xab\x45\x65\x27\x0b\x13\x96\x62\x80\xc1\x97\x10\x34\x28\x63\xcc\x96\xe7\xe4\xc6\x6b\x06\x70\xc8\x32\xe8\xab\x51\x05\x08\xd1\x73\xd6\xa0\xda\xc5\x4a\x94\xec\xe5\x9d\xa3\x80\x55\xac\x09\xe6\x43\xa6\x8e\x93\x95\x80\x91\x8e\x62\x8f\x4e\x6b\x58\xf8\x81\xf2\x41\x19\x99\x46\x39\xc9\x3d\x60\x58\x7f\x92\x03\xd2\x83\xb1\xe9\x35\x65\xb3\xb8\xd8\x4f\xb9\x4d\x2b\x7b\xb9\xf1\x2d\x4d\x7d\xdd\xcb\x11\xf1\xe3\x6a\x9a\x29\xb5\xec\x32\x03\x87\xe6\xc5\x87\xbd\xa7\x7a\x64\xe5\x87\x49\xfe\x90\xe3\xd3\x8d\xcf\x39\xaa\xf9\xd8\x28\x77\xfa\x77\xe1\x6d\x12\xa6\x1f\x56\xd4\xc1\x4c\x16\x7d\xa4\xce\xf7\x06\x81\xfa\x0d\xf5\xc9\xc7\xd2\x1c\xa8\x59\xc6\xb3\x87\x1e\x34\xb7\x21\xbc\xab\xcb\x81\xe8\xb6\xea\xa2\xac\x75\xd2\x2f\xf4\x44\x40\xf2\x03\xf2\x7e\xef\x5a\xbf\x3e\x8e\x5c\x4b\xf3\xdf\xfb\x69\xa1\xc3\x4d\x8e\xd5\x98\xd5\xfa\xb9\xc9\x01\x1a\x4f\x0c\x49\xcb\x11\x1a\xea\x3f\x3f\x0f\x9e\x9f\x93\xe7\xe7\xd1\x6a\x17\xe1\x95\x52\x9d\xb4\xbe\x9d\xf8\x6e\x2f\xdc\x74\xfd\xe1\xf5\x6d\x6d\x60\x0f\x6e\xc3\xa8\x03\x45\x8e\x64\x14\xe1\x61\x34\xa9\x15\xfa\xc6\x17\xc7\xe8\x87\x4d\xf4\x5f\x9f\xa6\xc2\x6b\x15\xba\x88\xe6\x6c\x16\x58\x33\x0b\xf8\xaa\x40\x01\x3a\x36\x4a\xd6\xdf\x18\x89\x18\xb3\x5b\xee\x0d\x0a\x4f\x12\x0f\xa6\xd6\xd7\x81\x61\x16\x52\xd9\x61\x1f\x01\x60\xec\x2c\x3c\x0c\x95\xc9\x5e\x26\x96\xbd\x9d\x7e\x72\x7d\xc4\xb2\xa4\xa0\x05\x6c\x05\x2d\xcd\x72\x72\x45\x34\x00\x74\xda\xb0\x1e\x03\x8b\xd5\xb1\xd6\x5a\xd0\x4a\x24\xfa\x81\xe8\x11\x5f\xa8\x11\x9f\xc8\x0e\x3a\x6b\x71\x87\x63\xfb\x4c\x41\x7c\xac\xb0\x65\xf1\x14\x01\x01\xaf\x81\xbe\x28\x63\xc1\x52\x3b\x70\x7a\x6d\x8e\x8d\x1e\x88\x71\x4f\xa4\x57\x46\x7b\x63\x8d\x8d\xae\x72\x24\x45\xc8\xf8\x8a\xf6\x42\xa4\xe8\x88\x20\x47\x47\x9c\xd2\x8a\x9c\xb9\x39\x4a\xf1\x9f\x42\x2f\x8b\x8b\x47\x27\x3a\x64\x80\x76\x7d\x15\xf2\x5a\xd6\x7e\xc9\xaf\x36\x25\x92\x5f\xee\x72\x69\x46\xdc\x6d\xf2\x72\x84\x66\xca\x95\xea\x52\x01\x4c\x55\x09\xec\x15\x48\x0a\xfc\x02\x3f\x18\x5c\x36\x5f\x53\x26\x7e\xca\x37\x27\x7e\xc9\xb7\x2b\x04\xa2\xca\x57\x54\xd5\xa5\x53\x46\x1b\x89\x9a\xf6\xa5\xc7\x22\x17\x26\xf6\xfe\x94\x60\x30\xef\x36\x4e\x7b\x48\x53\xd2\x88\x62\x21\xe5\x68\xad\x54\x32\xb1\xa4\x2e\x30\x95\x4c\x2e\x1d\xe1\x4e\x66\xf7\x2d\x77\x3e\x5e\xee\x0c\x36\xc5\x56\xbe\x72\xc5\xe6\xad\x12\xde\x64\xb2\x48\x64\xef\xef\x81\x3a\x8b\x40\x93\xb5\xac\x8e\x11\x5d\x8f\xa7\xce\xc7\x3c\xed\xfe\xf5\x92\x01\x81\x16\x45\x9b\xfc\xa4\x55\x63\xa7\xb5\x83\xc1\xdf\x8d\x59\x57\xce\xf1\x38\x35\x57\x0d\xf5\xb4\x7c\xf0\x67\xae\x05\x37\x75\x29\xa7\x01\x85\xa1\x68\x40\xbd\x57\x80\x2a\x2a\x10\xca\x98\xe6\x41\x5a\x3e\xa3\x3f\x72\xf2\xed\x45\xe3\x08\x1a\x3e\xff\xee\xfe\x25\xcb\xcb\x50\xc1\x93\xf5\xa5\xa3\x40\xd0\x40\x54\x14\x88\x70\xa3\x96\x42\x4f\x56\x52\xa9\xfc\x69\x32\x95\x64\x84\x63\x39\xc9\x59\x4a\xa4\x92\x7d\xef\x6b\x7a\x4f\x44\xb8\x66\x25\x15\xce\xd4\x28\x43\xfb\xcd\x95\x33\x14\xd9\xe2\x4a\x34\x3d\x36\xb3\xe6\xbf\xb5\xf2\x86\x18\x32\xef\x5f\x41\x81\xca\x63\x56\xf4\x36\x77\xbf\xa4\xcf\xf6\x50\x5f\x4c\x99\xe2\xd7\xeb\x13\x5c\x33\x4d\x8b\x64\xcd\xed\xb7\x35\xcf\x18\x9b\xb0\xa1\xdc\x0d\x47\x5e\x6a\x57\xf3\xeb\x42\xdb\x74\x34\x6e\xd2\x28\x46\xdf\x07\xa9\x8b\xe7\x9f\x41\xea\x1f\xf3\xe4\x58\x9b\x22\x9f\xf5\x5d\x6d\x8b\x7c\x4a\x8f\xca\x26\xbb\x45\x8f\xea\xfa\x3e\xa4\x0f\x18\x40\xfe\x66\x8a\xc3\xd5\x94\x05\x6a\xbe\xae\x6e\x5d\x1d\x8f\xc3\x2b\x55\x4b\xae\xf5\x1f\x7f\x2a\x4e\xc7\x1b\x77\x92\x35\xf5\xbd\x95\x05\xaa\xd1\xb1\x85\x68\x10\xa0\x31\x2b\xc4\xcb\x78\x4b\x86\x3f\x47\xc8\x07\x38\xeb\xf9\x79\xf9\xab\x67\x92\x43\x26\x74\xd0\xd2\x37\x31\x80\x92\xd2\x6c\xd5\x4d\x43\x34\x25\xed\x55\x2c\x07\xce\x25\x92\x88\xc0\x57\xd3\x86\x59\x94\xc6\x24\x28\x3f\x31\x43\xb5\x14\xd0\x0b\x81\x85\x4d\xfc\xea\xde\x8a\xaa\x57\xf7\x8a\x4e\x90\x09\xe7\x29\xcd\x23\x52\x9c\xce\x8b\x43\xbe\x07\x24\xe0\xad\x6a\xd1\xfc\xf2\x52\x97\x08\x4c\x84\x6d\xc7\xa7\x4a\x5d\x48\x5d\x6b\x11\x04\xe2\x00\x6c\xa1\x2b\xaa\x8d\x36\x1b\x71\x22\xd4\x2d\x11\xbd\xb8\xca\x18\xe4\xf2\x61\xf7\x45\x79\x96\x68\x96\xb2\x81\x82\xe8\x52\xd2\x17\xe9\x54\xc0\x17\x4e\x3e\xd7\x7c\x39\x16\xa4\x8a\x04\xdc\xec\x97\xe3\x0b\xbb\xe7\x3e\x5e\x8f\x86\x74\x42\x0f\xc3\xda\x60\x92\xba\x87\x8f\xb3\x89\xd8\x99\xd5\xa1\x27\xe0\x13\xe3\x5c\x5d\xf1\x88\xff\x0f\x0c\xe0\xb5\xcf\x6d\xc5\x0a\x30\x17\xa0\x60\x20\x93\xe0\x62\xdd\x15\xe3\x25\xdf\x8e\x97\xb0\x54\xc1\x93\x5f\xf2\xf5\xc4\xe4\xea\x32\x77\x45\x64\xee\x52\xd0\xfc\xe5\xb3\x8c\xcc\x8e\x8c\xc9\xdd\x4d\x57\x88\xeb\x64\x9d\x74\xb1\xa8\xd3\xf2\x27\x79\xf5\xcd\xac\xe9\xa7\x64\x54\xd3\xb6\x79\xc9\xc8\xf6\xda\x67\x0f\xe7\x1c\x9e\x18\xe7\x27\x24\xd0\x21\xd4\x71\x86\xe1\x64\x62\xa3\x28\xf4\x4d\x6b\x6f\xab\xa6\xba\xe7\x1e\x93\xda\x7a\xf0\x1e\xa8\x64\x9a\x97\x93\x63\x62\x22\x89\xc2\x4b\x3b\x07\x56\xa6\x1e\x50\x4b\x40\x1f\x2e\xb6\x59\x9d\x16\xa2\x18\x96\xa6\x6b\x3c\x75\x25\x41\x45\xa5\x2a\xbc\x7d\x4c\x3c\x65\xd7\x89\x66\x25\xb0\x00\x1a\xa2\xfa\xbe\x51\x3f\xcc\xea\xa3\x7c\x5a\xdf\xd3\x93\xf9\xf4\x78\x86\x68\xaa\x84\xd1\x88\xde\x22\xc2\x20\x19\x2d\x85\xc6\x46\xdb\xcf\x39\xfd\x37\x41\xc9\x61\x5b\xe7\x40\x30\xb5\xf8\x0b\xa1\x02\xab\x2f\xe2\xf0\x9e\x9e\x67\x45\x7f\x42\x27\xf2\x0a\x3b\x9f\x59\xd2\xc9\x4f\xe1\x41\xcd\xb5\x0f\x42\x37\x2f\x89\xff\x9e\xdf\xa4\xb2\x94\xb4\x39\x25\xc1\x0b\xfd\xc8\x04\x5d\x91\x18\x39\x02\xce\xbe\x61\xd6\x93\x1b\x05\x58\xc6\xfa\xdb\xb8\x7c\x00\xa4\xea\xad\x44\x2f\x43\x1c\x05\x55\xe5\xae\xaa\x3c\x89\x66\xa0\x2e\x4d\x4d\xc1\xbd\x9b\xb5\x82\x1a\x69\x2b\x91\xb4\x92\xc1\xbe\x0b\xd8\xd3\x2e\x3d\xa8\xc5\xe5\xf0\xc0\x0c\x3b\x74\x30\xa3\xba\xb9\xd1\x82\xcc\x4d\x88\x30\xca\x89\x2e\x0b\xed\xc1\x9d\x5b\x24\x76\x68\xeb\x9c\x23\x06\xa8\x82\x4a\x6d\xeb\xcc\xd9\x31\x35\x97\xbe\x8d\x45\xbd\x2d\xa7\xf3\xb6\x4d\x89\xf6\x07\x31\x1a\xad\x7c\x75\x9f\x9f\xff\x82\x63\x6a\xd7\xf9\xa0\xf4\xb4\xfa\xdd\xf4\x8c\x18\xfc\x70\x9a\x97\xa9\x87\x8d\x9f\x9f\xa7\x34\x0c\x47\xa9\x55\xdd\xe1\x54\xd6\xe1\x3d\x4c\x3f\x53\x0f\x8b\x67\xf9\xdc\x1f\xc8\x5d\x56\x99\x9b\xfb\xf9\xcc\xc7\xb1\x68\xea\xc9\x71\x72\x96\x57\xc5\x1a\x23\xf3\x70\xdb\xb5\xfb\xb7\xba\xf1\xa3\xa9\x4f\xff\xbe\xd7\xd4\xe9\x28\x80\x9a\x9d\x2a\xf6\xe3\x33\x8c\x01\xb3\x62\x1b\x37\x54\xec\x6d\xd5\x9a\xfc\x2a\x1c\xb4\xec\x8d\x96\x55\x3f\x75\x0e\x94\x02\x97\xf7\x6e\x8e\x4f\xff\x9b\x3b\xf1\x4c\xdb\x1e\xf8\xe7\x1c\x74\xe6\xee\xf7\x94\xed\x5f\x56\x34\x33\xfd\x73\x25\xf2\xb9\x72\x9d\xc6\x6a\x19\x2e\x07\xfa\xc6\x25\x16\x47\xfe\xf6\xc4\xe5\xf0\x69\xf9\xdd\xe9\x8c\x2d\xa1\x76\x77\xa3\xbf\xab\xf1\xad\x0b\x96\x4e\x69\xdd\xc9\x28\x95\xf4\xdf\x50\x2f\x64\x07\x63\x2a\xda\x7f\x4f\xe9\xda\x5e\x6e\xaf\xea\x52\x2a\xc0\x7f\x9f\xab\xe1\x38\x21\x86\x90\x69\x07\x74\x37\xbd\x59\x57\xf3\x6e\xab\x49\xb6\xd5\x74\xda\x6a\xe6\x6c\x35\x49\xb6\x9a\x09\x5b\x81\xda\x7e\x01\x30\x3f\x7f\x20\xee\x9b\xdd\xc7\xf5\x2f\x8f\x1b\x7c\xa4\x6a\x0b\x68\x72\x64\xdf\xa5\x1a\x90\xd0\x90\xbd\x24\x36\xfc\x6d\x90\x39\x0f\x50\x8b\xdc\x52\xbf\xab\x77\xce\x0f\x6d\x23\x66\xd5\x46\x0e\x61\xe0\x81\x48\x13\xde\x68\x67\xea\x60\x89\x08\xe3\x44\x2a\x36\xc5\xe5\xd9\x52\xc2\x58\xe8\x56\x0c\x0d\x55\x1d\x7b\x54\xbe\x78\xf8\x9a\xb0\x94\x6f\x44\xf8\xd0\x32\x1b\x26\xce\x96\x09\x56\x6e\xd7\xcc\x60\x0a\x7f\xec\xf0\xa0\x44\x75\x50\xc7\xbb\x57\xb3\x4e\x1b\xc0\x6e\xa8\xa0\xab\x03\xbb\xa9\x98\x99\x86\x68\x83\x46\x12\x65\x9b\xd8\xd6\x85\xfd\xe9\x1c\xa5\x19\x6a\xef\xcd\xae\x43\x8e\xd3\x7f\x2c\x71\xfa\xef\x80\x02\xbf\x71\x54\xec\x62\x83\x75\x2a\xef\xd0\x4e\x9a\x82\x18\xfe\xcd\x52\xe3\x9c\xce\xac\x43\x90\x24\x87\x69\xa0\xff\x9f\x4d\x6e\x40\x8a\x04\xec\xf2\xb0\xb2\x32\xe6\xf3\x6e\x71\x31\x2b\x76\x22\xdf\x89\x8b\x66\x41\x4f\xc4\xd3\x8e\xf3\xa3\x69\x96\xdd\xd9\xe2\xb2\xdd\x5c\x59\x7f\x7e\xd9\xad\x0d\x2e\xeb\x4b\x10\xfc\x5c\x0d\xc0\xf4\xc8\x39\xe4\xd8\x81\xcf\xcf\x23\x5c\x6d\x60\x46\x56\xb3\xca\x6a\xf0\x91\x39\x40\xab\x76\xa7\xda\xdf\xd3\x77\x70\x2d\x69\x04\x93\x9c\x9a\xe4\x5c\xb9\x4e\xb5\x7e\xe5\x72\x8b\xf4\x4b\x24\xc9\x8b\xcd\xee\x73\xb3\x84\xc9\x0f\xb5\x1c\x54\x57\x16\x30\x4d\x57\x9f\x02\x15\x4f\xba\xfb\x49\x1a\x91\x13\xe9\xec\xb0\x70\x48\x4c\xfa\x1a\x34\x33\xd6\xda\x7b\xb4\x9b\xed\x85\x1d\x22\xa7\xb1\x46\x59\xf9\xe4\x9b\x5b\x87\x0d\xd7\x37\xd7\xc1\x09\x38\xa0\x45\xf9\x78\xc6\x2b\xd3\xde\x61\x51\x6d\xc5\xb2\x85\xdf\x54\xcb\x7f\x71\xf1\x9b\xcb\xeb\x56\x2a\xc9\x32\xb5\x73\x4b\xf7\xb0\x7d\x74\xee\xec\x81\xef\x77\x76\x37\x09\x2d\xdb\x15\xbb\x45\xe7\x85\x78\xeb\xe0\x60\xf4\x33\x9d\xd2\xe0\xc3\x0d\x22\xa7\xd8\x66\x27\x25\x8e\x01\xf7\x47\x68\x1d\x0d\x15\x4e\x12\xa0\xd0\xe3\x95\x7b\x5e\x74\xf8\xb7\x24\xee\xe9\x03\x98\x71\xb5\xdc\xe2\x0e\x6c\x74\x35\x38\x2b\xa8\x18\xa4\xf5\x12\x27\x40\x45\x58\x47\x6d\x3c\x14\x12\x3b\x69\x27\x6b\xf4\x51\x60\xa6\xc3\x43\xf8\xb1\x86\xd8\x09\x69\xe5\x47\x67\x90\xaa\xe9\x07\xb2\x31\x47\xab\x3a\xe1\xb8\x43\xd0\xa0\x83\x75\xce\x8d\x1e\x2b\x51\x31\x61\x97\x65\x1a\xf8\xe9\xe9\x81\xe8\x3a\x5a\xc9\x90\x84\x9f\x7c\x2e\xfa\xa9\x19\x91\x20\x45\xbe\xc7\xa6\xbd\x84\x0f\x99\xb7\x80\xae\x90\xd7\x2e\x91\xd7\xa9\x9d\x92\xab\x8d\x94\x14\x8e\xb6\xb7\x89\xda\x4a\x0d\x11\x92\x4d\x7b\x21\xf1\x6a\xd2\x17\xa2\x9a\x5c\x85\x8d\xb5\x61\x82\x8c\x18\xfa\x0e\x2d\x42\x21\x62\x9c\xa4\xbe\x8b\x85\x0e\xd8\x31\x20\x6d\x7d\xed\x4f\x70\x6e\xd8\xc6\xe6\x57\x27\x20\x41\x63\x57\x9f\x45\x21\xb5\x55\xa4\x72\x01\xd1\x0c\x77\xb4\x6c\x68\x9e\x29\x01\xd7\x2a\x3b\xae\x35\x09\x60\xc0\xb5\x66\x4c\x31\xfb\x0d\xc1\x3c\x0d\x5e\x43\x70\x42\x1f\xeb\x8c\xc4\x73\x06\x18\x4e\x8f\x86\x32\x3b\xbd\xf8\x1a\x4f\x70\x56\x61\xc7\x77\x08\x14\xe9\xeb\x36\xef\xa6\x87\x9a\x9c\x90\x45\xf9\xc8\xfb\x65\x9a\x92\x96\x9b\x4e\x85\x7c\x99\x81\x3c\xa0\x1a\x57\x8c\x35\x7a\x4e\x5c\xee\x85\x31\xbb\xdf\xa3\x11\x54\x94\xf5\x61\x01\xdf\xec\x01\x50\x5e\xb9\x33\x60\x71\xed\x66\x8f\x12\x4b\x5d\x5b\x1f\xbf\x2d\x19\xcc\x16\x2f\x7c\x8f\x9a\x61\x3b\x8c\x86\x7b\xab\x1a\xf2\xb2\x86\xf8\x92\x47\x4c\x14\xa4\x15\x85\xbf\xe6\xb4\x65\xfb\xf8\x1e\x24\x17\xa6\xe8\xe2\x87\xf6\xc5\x98\x7a\x4e\x13\xd9\x8a\x57\x90\xe5\x12\xc0\x0d\xc4\x52\x54\x0c\x97\xe2\xcc\xdb\x9a\x78\x07\x9e\x68\x6f\x65\xa3\x80\x45\x80\x38\xd5\x41\x14\x27\x4c\x14\x0f\x7e\x60\x2f\x5f\x50\xdf\x13\xf5\x06\x4e\x73\x73\xbf\xde\x7d\x7e\x2e\x74\x1d\x62\x87\xd5\x41\x48\xf4\xb9\xe2\x9d\x43\x02\x6f\x3c\xb0\xde\x47\x2a\xb0\x83\x94\x10\x8e\x96\x1f\x99\xa5\x35\x6c\x7a\x7b\x4e\xc5\x16\x03\x43\xdd\x58\xbd\x5f\x74\xba\x56\x4f\x87\x9c\x52\x4d\xf4\xcf\xd9\x42\xb8\xef\xf8\xca\xae\xb3\x15\x66\xc6\xce\xe9\x79\x55\x93\x75\x0b\xc9\x84\x9d\xae\xda\x5a\x0f\x94\x71\xd7\xe4\x05\x76\xe7\xf1\x02\x6e\x46\xf4\x98\x10\xe8\x32\x37\x5f\xb1\x75\xff\x6c\xc4\x98\x0d\xcf\xc4\x97\x5b\x29\x5a\x32\xe0\x63\xbd\x8f\xeb\x2a\xee\x79\x60\x0e\x91\xa6\xbc\x9b\x8d\xaf\x5b\x74\xd4\x37\xa1\x92\x86\xc4\x2e\xec\x95\x69\x3f\x78\x76\x5f\x6c\x08\x31\x1f\x01\xee\xc3\x13\x47\x46\xdb\xd7\x1b\xdf\x95\x5d\x4f\x78\x9d\xf6\x2f\x61\x57\x22\xab\x81\x00\x68\xbd\xa7\x96\x48\xbc\x59\xfa\x73\xf7\x7e\x9f\xe6\xa1\xfc\x69\x29\x5e\x8a\x98\x3c\xac\xac\x0c\xd4\xe1\x9c\xa4\xbb\xa4\xc2\x66\x8f\x6a\x5b\x04\xd9\x8e\xa8\xf0\x86\xd0\xbc\x7f\x5f\x90\x53\x5f\x90\x53\x92\x71\xf4\x3d\x08\x47\x7f\x9d\x4e\x07\x4e\x9c\xa1\x36\x3d\xa1\x36\xfd\x1c\xb5\x19\xfc\x5f\xa6\x17\xcf\x0a\xa6\x6e\x8f\xe1\x82\x83\x61\xad\xe3\xeb\x07\xe2\x7d\x43\x10\xa1\x05\xce\x47\x3a\xe5\x7d\x4a\xed\xb4\x9c\x64\x8b\x5d\x00\x11\x59\x17\x28\x24\xe8\xb5\x44\xfd\x71\x2b\xd5\x4d\xd4\x14\x59\x77\x9e\x95\x8e\x9f\x52\x5f\xbd\xf9\xd9\x9a\x6c\xeb\x39\xa6\x20\xb5\x4b\x8b\xb7\xaf\x2a\xc4\xd3\x2d\x0d\xec\x24\x67\x84\x02\xf5\xcb\x8b\xad\x55\xc2\xad\x58\x08\xb4\x89\xe0\x31\x8c\x56\x46\xe2\x94\xe4\x99\x8e\x89\x04\x9a\x99\x11\x5b\x66\xa7\x44\x86\xfb\x5d\x88\x0c\x83\x5e\xc2\xcd\xaa\x25\x3e\xb7\x60\x6e\x1c\x82\xb2\xe9\xe2\x9a\x76\x9a\xb0\xf1\x8b\x52\x0d\x33\xbc\xd0\x25\x1c\xdd\xb7\x4a\xb1\xa6\x4e\x46\x20\x04\x22\x5b\xc9\x37\xd7\x88\x1e\x80\xf2\x58\xfe\xd0\x1f\xa5\x67\x7e\xd7\x81\x11\xfc\x48\xb6\x48\xd1\x1a\xd1\xb6\x28\x3a\xf4\x17\x67\xbd\xcf\xc4\x0b\x6d\x56\x10\x2f\x21\x88\x17\x94\xb3\xa1\x87\x6e\x1c\xd0\x7e\xee\x7c\x36\x22\x6d\xf3\xe1\x4c\x64\x23\x2b\x53\xd5\x59\x8f\xca\x9f\xab\xf7\xa5\x36\x40\x69\xd4\xf6\xf2\x67\xb5\x97\x1e\x0f\xee\x9c\xb3\xda\x93\xed\xe0\x99\x67\xb5\x37\x7b\x56\xfb\xd8\xaa\x83\x6c\xa7\x7a\xfa\xa4\xf6\xe6\xee\xd6\xa4\x88\x8b\xe1\x94\xac\xcb\x1d\xd8\xf4\x40\x2c\xe5\xe9\x9e\xf3\x82\x9d\xd6\x7d\xec\x94\x0c\xf6\x90\x52\x4e\xd7\x1c\x39\x46\xe8\xf9\x58\x9e\xe9\x74\xa9\x5f\x3f\x68\xf6\x15\x86\x38\xc6\x45\x33\x35\x3f\x4a\xe6\x70\xac\xc7\x31\xf3\x95\xee\xbb\x79\x52\x76\x63\x9f\xaf\x3e\x9d\xd5\x34\xad\x17\x74\x6e\x43\x2e\x5a\x2b\x55\x27\x35\xc9\x28\x0f\xaf\x07\x46\x46\xd5\x94\x58\xec\xe5\x65\xd7\xb8\x71\xdc\x55\xfe\x44\xcb\x0f\x96\xad\x9e\x1e\x2d\x43\x4e\xb6\x9f\xab\x02\x71\xd2\x6d\x3c\xba\x0a\xfb\xc3\xc4\x6e\xee\xda\xaa\x09\xa6\xf6\xb2\x3a\x07\x2f\xd7\x99\xab\x14\xc8\x17\xb3\x5d\x46\x4e\x45\x1f\x0b\x02\x24\x2e\x3d\xad\x9d\x13\xfa\x50\x99\x53\x9f\xf8\x39\xcf\xa9\x24\x06\x23\xa7\x06\xbc\xf6\xaa\xc3\xc6\x5a\xf2\x8d\x7a\x3f\xe6\x41\x80\x89\x33\x97\x8e\x53\xf3\x03\xfa\x96\x39\xb3\x24\x6f\x13\xa1\xf9\x50\xf2\x84\xca\x21\x30\xd1\x23\x76\xde\xb9\x8d\xf4\xe2\xdf\xa7\x17\xcd\xf4\xd2\x6c\xfa\xb9\x4d\xbd\x33\x6f\xba\x0f\x5f\xf0\x72\xb4\xdd\x2b\x68\x77\x09\x3e\x74\xbb\x44\xb4\x16\x68\x35\x2f\x1f\x91\x88\x8d\x00\x50\xc6\x02\x38\xfc\x27\x22\xab\x51\x03\x22\x2b\x77\x38\x2b\xb2\x4a\xef\x1c\xb5\x69\x61\x49\x6f\x04\x48\x66\x0e\xb5\x64\xe6\xf0\x35\xc9\xcc\x5d\xc3\x94\xcc\xfc\x0b\xc1\xcc\xda\x8c\x60\x06\x4b\x3d\xdd\x0b\xf3\x25\x33\xaf\x9e\x8a\xd3\x32\x98\xf0\x45\xc1\x4b\x94\x9e\x42\x31\x44\xaa\xe9\x09\x3a\x77\x39\x2b\xc1\xb4\xed\x15\x7c\xc6\x55\xea\xa3\x20\x17\x69\x3d\x4b\xd8\x39\x16\x72\x16\x5a\xa1\x99\x29\x27\x1c\xcd\x65\x57\xdc\xad\xf0\x69\x1a\xce\x50\xf2\x6b\x22\xaa\xe8\xa7\xc6\xdc\x22\x7b\x21\xd2\x44\x9f\x21\x07\xdb\xc2\x1c\xf3\x09\xe2\x97\x22\x70\xdc\x33\xb9\x95\x9c\x34\xa1\xa7\x08\x96\xfe\x34\x8b\x1c\x14\x23\xa3\x60\x4e\xd6\xd3\x9f\x3e\xb4\xba\x54\x16\x72\x8d\x38\x57\x47\x6e\xc7\xab\xb8\x1d\x17\x5e\x1c\xf7\xe3\x2f\x7e\x47\xb3\xe2\x91\x3e\xec\x02\x1c\x76\x7d\xdb\xc4\x80\x5a\x26\x47\x30\x2b\x29\x7c\x4b\xdc\xf9\xc0\x31\xcb\x54\x84\x0d\xec\xc1\x5f\xa2\xc9\x29\xf5\x34\xa7\xd4\x7f\x05\xbe\x5c\x08\xab\x2d\x6d\x8f\x46\x4b\x9d\xe7\x73\x2e\xc7\x41\xe1\x5e\x67\x35\xa4\x15\x32\x75\xff\x3f\x28\xb2\x02\xc0\x92\x49\xa1\xb1\xba\xa5\x51\x7d\xcb\x73\x4a\x7f\x55\x72\xfc\x95\x59\x3a\xd9\xc4\x71\x36\xc3\x6e\x0d\xe8\x1c\x55\x6b\xbf\xa8\x0f\x7f\x93\xdd\x5a\x53\xe7\x29\xfa\xeb\x2b\x9a\xc3\x98\x36\x2d\x94\x0c\x14\xdb\xf0\xfc\x5c\x81\x6f\x45\xe2\x62\xe6\x74\x55\x3b\x27\x8c\xed\xb0\x14\x65\x24\x41\xb2\xd2\x5d\x6d\x9f\xd7\x8e\xe7\x6d\x04\xc3\x50\x75\x76\x30\x21\x91\x4a\x99\x79\xba\xb3\x76\x8b\x5b\xd3\x8a\x68\x2a\x85\x8e\xb9\xbb\xd7\x76\x88\xf6\x86\x9b\x4c\xc7\x10\x0c\x96\xaa\x33\xe5\x16\xb8\xe1\xec\x7c\x3d\x32\xfd\xb8\x11\x21\xc7\xf8\xab\x62\xa5\xa7\x7b\x7d\x96\x8c\xfe\x1b\x04\x81\x4d\x1f\xbe\x4e\x7a\xfa\xaf\x93\x9e\x7e\x8e\xf4\x0c\x6b\xac\x9b\x9a\xa3\x30\x15\x5d\x2c\x64\x66\x04\xda\x32\x26\x5e\xa6\x46\x8f\x04\x34\xa2\x38\xe4\x99\xc8\xcc\x58\x1b\x00\x85\xff\x2b\x68\x28\x14\xaf\x4f\x8a\x3f\x31\x90\x47\x30\x0f\x27\x80\x98\xef\xcd\xe2\x84\x80\x71\x42\x58\xf4\xb9\x8e\xde\xd6\x3e\xb6\x75\xcf\xd6\x52\x03\xe0\xb3\x79\x5b\x5c\x51\x53\xe6\x1a\x4e\xb6\x34\x01\xea\xe7\xd6\xb0\x74\x3a\xb4\xfd\x52\x80\xd6\xfa\x45\x3a\x08\x07\x56\x7e\x59\x2f\xf0\xba\x36\x69\xdb\x39\x2b\x38\x85\x60\x6e\x31\xf5\x69\x39\x99\x4d\xf1\x0a\xe5\xa3\x31\x5b\x5c\x99\xba\xc2\xec\xbd\x3e\xee\xaf\x81\x71\x78\x9d\x65\xec\x68\xa8\x95\x4f\x7a\xca\x4d\xd8\x3c\x1b\xbe\x29\xf6\x31\xcc\x28\x66\x37\x67\x23\x20\xe4\xb2\x6f\x92\xcb\x7e\x8e\xc3\xcd\x3c\x6d\xf4\x40\x33\x47\xa0\x99\x63\x26\x99\x81\xc7\xfc\xb9\xe4\x32\xf1\x71\xc4\xde\x76\x53\x42\xf9\x7f\x42\x1e\x03\x5b\x65\xf4\x31\x1d\xd7\xff\x9e\x3e\x3e\xbc\xf8\x77\xf4\xf1\xd6\x79\x8e\x0a\x56\xd4\x31\x4b\x7e\x72\x64\xb3\x39\x6b\xb3\x01\xd4\x6f\x6e\x05\x09\xdc\x1c\xc8\x6f\x43\xb9\x22\xb8\x54\x14\x41\x4f\x23\x09\xf5\xde\x54\xfc\xea\xc8\x33\xbc\x24\xfc\xb8\x77\x94\xa3\x92\xc7\x03\x49\xfe\x75\x92\xa3\xba\xd4\xd5\xe5\xaf\xc2\x51\xcb\xfe\x75\x02\x12\xea\x88\x49\xa8\x85\xdd\x17\x83\x30\xb6\x37\x6e\xd4\xf1\x3f\x1c\xc2\xc4\xdd\xb5\x7f\xef\xd8\x17\xd7\xd6\x5b\xe7\xa7\x24\xef\x97\x83\x0e\xae\xe3\x5c\x7b\x7b\xd3\xfe\xb1\xed\xda\xef\x36\xb2\xb3\x80\x33\x9d\x70\x43\xc5\x41\xda\x2f\x77\xbd\xb7\xce\x5e\x9c\xd9\x38\x6f\x5e\xfb\xa3\xe4\xcd\x90\x08\xf7\x70\xf8\xe6\x8f\x62\x5a\xa9\xf8\xc7\x9b\x4e\xf2\xa6\x7f\x3d\x7c\x93\x8c\x06\x83\xeb\xdb\x61\x18\xb0\xc9\xf3\xf0\x22\x7c\x43\x8b\x26\x09\xfb\xf4\xe3\xde\x0e\xd9\x2a\xba\xfc\x87\xa5\xfb\x72\x19\xe0\x42\x4f\x77\xdc\x3e\xbe\x73\xd3\x2c\xb8\x60\x39\x6d\xae\x6a\x70\x73\x6c\xd7\x13\xe5\x30\x43\x96\x08\x57\xe1\x84\x77\x2a\x46\xe9\xbe\x8e\x75\x34\x02\xe6\x3e\x2a\x7c\xdb\xb0\x4f\x8f\x2d\xfb\x58\x6d\x58\xbe\x46\x55\xc1\xa8\xf6\xb5\x5f\x1b\xc2\x12\x46\x8a\x7b\x1b\xba\xf9\x94\x64\x18\x0e\x06\x61\xb0\x46\x19\xba\x6b\xc7\xf9\x5e\x8f\xb7\xa0\x18\xab\x33\xcf\x3e\xe6\x32\xef\xc6\x2e\x5b\x3a\x28\xfb\xbd\xfd\xba\xd6\x79\xa2\x01\x2a\x1d\x9a\xbd\xb8\xc6\xbf\x97\x5b\xb5\x6b\x60\xe6\x77\x46\xf5\xce\xb6\x7d\x74\x6c\x1f\x58\xca\xa5\x27\x34\x0d\xb3\xd9\x38\xe9\x27\x83\xd0\xef\x44\x1d\x82\xf6\xf5\x6d\x87\x38\x29\x17\x0b\x02\xf0\x5d\xd0\xcb\xf1\x49\xf9\xe7\xa0\x15\xa8\x1f\x63\x4e\xe5\xed\x29\x4b\x2c\xed\x13\x37\x2f\x9d\x3a\x8e\x6b\x81\x73\xd0\xaa\x87\x7a\x01\xd7\x3d\x22\xe0\x95\xa7\x1c\x6a\x42\x3c\x7e\xd5\xb9\xec\xe1\x05\x95\x25\x32\x3f\xd4\x99\xb6\x47\x55\xf5\xb1\xd9\x8c\x27\x99\x32\x89\xda\x2d\xe5\x13\x97\x23\x00\x41\xad\x24\x9a\x32\x7d\x8d\xa0\x5d\xdf\x13\xf7\x2c\xca\x53\x2e\x83\xa2\x9d\xac\xb9\xc5\xae\x7d\x9c\xd0\x51\x64\xff\xbc\xb0\x1f\xb7\xc5\xde\x52\xb9\xed\xc9\xc0\x72\xcc\xcb\xb3\xe4\xc2\x1e\xff\x6a\x94\x0c\xdf\x78\xe1\x1b\xa8\x58\xc1\x20\xff\xce\xed\x8d\x42\xbd\xfe\x2e\xe1\xc7\xcd\xe9\xd5\x7d\xfe\x61\xe9\x6c\xbf\x2e\xce\x7f\x9c\x4b\x88\xa0\xa0\xb3\x03\xc9\x73\xf9\xc8\x2f\x53\x85\xe1\x75\x7c\xeb\x5e\x35\x46\x7e\x37\x1c\x26\x12\x88\xd7\xcf\x76\x5d\xea\xf5\xc5\x2b\x37\x0b\x15\xcb\x71\x36\x2e\xac\x4e\x4d\x2b\x4c\x9d\xa4\x6b\x50\xe0\x9b\x34\x6b\x50\xb6\x51\x8b\x86\x4d\xf4\x56\xa3\x8d\x5a\xb8\xa1\x5d\x72\x0b\x68\x8f\xb6\x64\x6d\x34\x9a\xf2\xbb\xbe\x23\xbf\xfe\x06\x55\xcf\x0a\x4f\x02\xe3\x7a\x33\x70\x16\x7e\x5e\xd4\x35\x1e\xd2\x70\xf4\xed\x76\x9f\x40\x57\xa1\x09\x5f\xff\x06\xcb\xda\x90\x06\xa6\xb1\x95\x39\x9b\xbf\xb7\xe5\x13\xa7\xcd\x5a\xba\x72\x2a\x8c\xf5\x59\xb3\x21\x9b\x0f\x34\x26\xf3\x20\x47\x1d\x2f\x2c\x29\x79\xf8\x62\xc9\x49\x4b\x03\xa2\x7e\xd4\x2a\x87\x70\x0e\xa2\x71\x1e\x87\xed\x4e\xb1\xee\x71\xde\x82\x70\x5f\x14\x71\x3c\xb6\x9b\x54\xee\x99\x66\x4f\x83\xdf\xdb\x93\x9a\xa7\x27\x70\x4e\x7e\xa3\x39\xa9\x99\x62\xca\xcc\xb1\x8b\xb9\xe7\x76\x8a\x6e\xf1\xe4\xca\xb5\xd7\x09\x3d\x7a\xe5\xeb\x96\xd8\x15\xe3\xc3\x97\xc1\xea\x29\xbb\xdd\x0e\x6c\x7c\xc6\xaa\x9d\xc9\x1b\x8c\xff\x9a\x2e\x6b\x8c\x95\xf7\x6f\xb0\xbd\x32\x37\x9f\x41\x79\xd4\x55\xc6\x31\x7e\x79\xaf\x60\x89\xc7\x76\x11\x62\xfa\xe5\xd1\x55\x81\xc3\xd9\xf8\x50\x08\x8e\x70\x3d\xd8\x9b\x35\x20\xd3\xa6\x0f\xe5\x0d\xb7\x00\xa5\xe3\x98\x96\x0b\x93\x38\xd6\xf3\xf3\xc1\x84\x0d\xb2\xe1\x7e\xa1\xd6\xb5\xf7\x21\x7f\x1f\x0d\x6b\x31\x3b\xf7\xed\x39\x98\x64\x2a\x4e\x07\xed\x35\xdc\x23\x5a\xdd\x72\x10\x3a\xc7\x2d\xf6\xa8\x08\x3f\xf2\xd2\x71\x65\x4a\x83\xbe\xd3\xe6\x73\xa2\x89\x57\xee\x69\x77\x92\xd2\xf3\xa0\x1c\x9c\x69\x6f\xf3\xa1\xf3\x4b\xfc\x0b\xd8\x9c\x1a\x9d\xc3\x19\x28\x53\x78\x44\x18\xfa\xdd\x02\x75\xf3\x16\x46\xf9\x50\xf1\xa7\xf4\x08\xdb\xc7\xd1\x89\xf4\x91\x1f\x37\x04\x93\x8d\xcf\xb0\xce\xec\x32\x74\xea\x0b\x5e\x79\x73\x48\x8f\x9b\x43\x18\x51\x6e\x0a\xd1\x70\xc4\x68\xca\xc5\xd9\x8a\x25\x95\x74\xe9\x99\xce\xdb\x5c\xb7\xd0\xbe\x76\x85\x8a\xf9\xc1\xd7\xb8\x4a\xd9\x0d\x82\x42\x50\xbe\x41\xf0\x0a\x07\x6d\xb6\xf1\x72\x9e\xb9\x78\x09\xad\x2c\x15\x56\x5d\xe3\xf3\x54\xe7\x20\x7c\x2b\x09\x86\x6b\x8f\x5e\xef\x4d\x12\x12\x86\x4d\xde\x20\x22\xd3\x9b\xb8\x73\x47\x27\xda\x0c\x82\xa1\xc3\x2e\x71\xaf\x68\x03\x6a\xff\x1f\x7f\x58\x3c\x8e\x76\x40\x38\xea\xdc\x29\x64\xcf\x74\xc4\x58\xc5\x6a\x1d\x92\x85\x9b\x03\xe9\xc4\xf3\x33\x8f\x56\xbf\x3a\x21\x6d\x50\x55\x2f\x34\x2b\x99\x17\x2b\xbf\xcd\x3d\xf2\x34\xe1\x2d\xb2\x5f\xf7\xcb\xdf\x59\x0a\xa0\xd8\xe4\xc2\x34\x51\x06\xab\xa5\x5e\xdb\x65\x60\xf8\xb4\xa4\x61\x4b\x05\x8e\x83\xb6\x54\xea\x0c\x53\x6f\x06\x3a\x44\xa3\x4d\x08\x7e\x6d\x23\x25\xdc\x24\xea\xf4\x9c\xc3\xb6\x6d\x9e\xd3\x7f\xfc\x45\xa6\xf0\x3b\x41\x2d\x28\x77\x02\xad\xad\xbe\x31\x56\x76\x35\xda\xd7\xd6\xc6\x45\xed\xe9\x32\xa6\x75\x7a\x18\xd1\x9f\x5f\x77\xb5\x18\xab\xf0\x37\x7e\xab\xe7\xf6\x43\xb5\xb6\xd5\xb0\x1f\xab\xb5\xcd\x86\xfd\xcd\xc3\xdf\x5d\xfe\x7b\x37\x84\xb5\xce\xe1\x06\x9b\x64\x5a\x76\xa7\x1f\x84\x0f\x6c\xee\x4a\x2b\x66\x3c\x51\xde\x6e\xe2\xbc\x43\x2f\xd5\x35\x2a\x4e\x8b\x74\x73\x71\x31\x2e\xaf\x5f\x14\xf0\x88\x6b\xbd\xbf\xe9\x6d\x3c\xf3\x89\xba\x47\xf0\x72\xe8\xf3\xa0\xac\x7f\x23\xe2\xc3\x14\x73\xe5\x11\x53\x0d\xa7\x3f\x88\x52\xa5\x95\x7f\x4f\x88\x8e\x0a\x60\xf6\xbb\x61\x89\x81\xb0\x00\xdb\xe7\x23\x45\x20\xde\x68\xe2\x3d\xeb\x4e\xa9\xaa\x0c\x06\x07\xee\x14\xe4\x78\x50\x47\xdb\xae\x8c\x69\x41\x3a\x48\xc5\x67\x6c\x0a\xdf\x69\x09\x65\xfe\x82\x52\xeb\xf0\x39\x1c\x6c\x77\xc9\x2d\x1a\x71\xb9\x02\xbe\xc1\x84\xcb\x64\x5d\xea\x3d\x97\x9a\x64\x48\xcc\xf4\x15\x51\x61\x5f\x11\x2a\x22\xb5\xf2\x18\x61\x4b\x40\xde\xc3\xeb\xc2\xef\x2b\x78\x25\xd1\x6f\x49\x0f\x3e\x1d\xf8\xad\xbb\xed\xce\xc3\xbc\x6c\xfe\x4a\x67\x6d\x75\xe3\x93\x32\xf1\x83\xb5\x73\xb9\x52\xfd\xaa\xdf\xac\xd5\x48\xc5\x78\xa8\xc5\xea\x61\x62\xb1\x3a\xd4\x3e\x7b\x60\x55\xa7\x01\x9d\x5b\x47\x5b\xc4\xf0\x55\x38\x9a\x0a\xf0\x82\x3d\x22\x24\x31\x5a\x49\xea\x23\x8d\x71\xef\x38\x67\x44\x34\x9b\xe3\x35\xdc\xe2\xa8\x78\x12\x66\x5e\x5f\x3d\x22\x97\xf9\x00\xe0\x2c\x3a\xa8\x07\xc5\xa2\xf2\x41\x0c\x82\x59\x68\xbd\xe2\xfe\x85\x3d\xa6\x73\xa1\xb5\x65\xd9\x4d\xc7\x55\x3b\x62\x5c\xdc\xdc\xb0\x37\xfb\xec\x55\xb7\x49\xf3\x4a\x8f\xf5\x7d\x1a\x14\x82\xde\xac\xc7\x65\xdf\xd3\x0a\x2d\xfb\xce\xa1\x6e\xaa\x3d\x2e\xf6\x2e\xec\xde\xc5\xb9\xbd\x0f\x2f\x3f\x55\x68\x0a\xfd\x30\x32\x87\xdb\xf6\x70\x9b\x15\x46\x0e\x89\x68\xdd\xab\x57\xbe\x3a\x7b\xd4\xe4\x9e\xf3\xd9\xaa\xef\xbd\x77\x96\xeb\x95\x95\x05\x4e\x60\x33\x2e\x51\xb9\x21\x14\x22\x63\xb9\xc3\x19\xf1\xee\x7c\x71\xf1\xc6\x2d\x1c\xd9\xea\x4d\xeb\xd4\x98\x5f\x39\xd9\xb2\x4f\x88\x27\x5a\xb6\xea\xc6\x18\x5b\x1b\xf6\xc9\xb1\xfd\xd3\x62\xbf\x2b\x2a\xed\xfe\x7b\x6a\xb1\xdb\x74\x7e\x9c\x14\x9a\x50\x8b\x5a\xa3\x05\xd9\x38\x87\x9e\x80\x4b\x74\x02\xf6\xf2\x0e\x1e\xe3\x08\x0a\x22\x4c\x9c\x69\x47\x24\x6c\xa3\xfb\xcd\x75\xae\xe0\x37\xce\xd9\x71\x51\xf0\x9b\x8b\x32\x57\xa2\xb5\x9f\xda\x98\xb4\x50\x08\x86\x10\x5b\x21\x95\xc3\xc3\x8e\xa7\xc7\x83\x2f\xfc\xf4\x9d\xf1\xa5\xdd\x0f\xe9\x2f\x9b\x9d\xec\xc1\x14\xf7\x8a\x98\x64\x9c\xa0\xbc\x24\x09\x28\x3f\x11\x3c\x84\xca\xf8\x56\x9d\x3e\xc7\x2e\xeb\x7e\xfa\x85\x96\xd8\x63\x41\xf0\x20\x6f\x37\x10\x0e\x37\x9c\x46\x81\x9b\xc9\xfb\xbb\x70\xb8\x41\x17\x6a\x8c\xae\xf3\x78\x5c\x80\x62\x40\xca\x90\xfe\xc4\xa6\x9a\xcc\x3b\xa4\xa9\xe4\x56\x68\xab\xba\x3b\x90\xb3\xdb\x4f\xb7\x6e\x3f\x0e\x6b\x34\xf4\xee\x5a\x6d\x2f\x03\x69\x87\xf8\xf2\x0f\xd6\xc4\xf0\x6d\x0d\xe7\xd6\xd4\xdf\xe3\xac\xcc\xc9\x8e\xdd\x2d\xaf\x17\x1a\xe5\x93\x61\x79\xf3\xaa\x80\x53\x75\x61\x6b\xe0\x16\x07\x56\x9d\x20\x48\x94\x42\x03\xbe\x1a\x66\xf9\xee\x7e\xc8\xf7\x17\xb0\xbc\xd3\xd6\x2b\x34\xde\x93\xcd\x82\x27\xa6\x1b\x70\x2e\xd0\x86\x99\x68\x6a\x14\xb2\x15\x22\x5b\x59\x76\xa8\x71\xb6\x3d\x5b\x14\xba\x08\x89\xa9\x4d\x55\xa7\x49\x4c\xfa\x85\x26\x1c\x51\xb6\x08\xa7\xf5\x0b\xdf\x5c\x7b\x5f\xb9\x10\xf1\x9d\x5b\xc9\xb2\xea\x89\x0f\x8c\xab\x32\xc2\xc0\x1c\xd3\xd6\x96\x8d\x80\x59\xc6\xe2\x1a\x09\x97\x04\x39\x5e\x50\x74\x6e\xc3\x22\xc6\xcc\x38\x67\xfb\xb8\xd0\x66\x5c\xa2\x7e\x7f\x1c\x17\x92\x0b\x8b\xaf\x7f\x76\x8f\x0b\xcb\xd6\x79\xfa\xdc\x28\x27\x03\x7a\xb5\x04\x4c\x56\xbd\x27\x34\x09\xd0\xea\x1d\x61\xf9\xe2\x6f\xc2\xa9\xe2\xce\x8a\x26\xe2\x5d\x8c\x23\x85\x89\x26\x5a\x8b\xa9\xef\xaa\x3b\xf6\x5d\x75\x1a\xd7\xb6\x8d\x2d\x72\xbb\x69\xdf\xd2\x60\xdf\x56\xc4\xf2\x0a\xe4\x55\xc5\x8e\xdd\xda\x91\xbd\xf1\xa9\x36\xb2\x4f\xa9\x5a\xf9\x34\xb4\xef\x22\x11\xa2\x88\x0f\xd0\xa6\x1d\x6c\xd6\xf6\xed\xf5\xb8\x96\xf8\xf6\xae\x5f\x23\x20\xb5\xee\x54\x81\x4d\xf9\x65\x1f\x5a\x7d\xfb\x60\xc3\x5c\x13\xdf\x1b\x2e\x13\x81\x9d\x7e\x78\xca\x0a\xfd\x2d\xdb\x0d\x6a\x7b\xf6\xef\x8f\xb5\xea\xb2\xbd\xe0\xdf\xd7\xe6\xec\x53\xfb\x60\xb7\x66\x6e\xea\xbb\x1d\xfb\x6e\x07\x21\x12\xec\x6f\xbb\xb5\x43\xbb\x0b\x05\x86\xdf\x27\xf8\x7b\x83\xce\xde\x84\xf6\xe6\xb8\x36\xb3\xb7\xed\x8d\x71\x2d\x0c\xe0\x40\x79\x62\x12\x19\x67\xe9\x81\x92\x5a\x4a\x6b\x5b\x64\xf1\x15\xa9\x1c\x5e\xa9\x58\xa1\x30\x51\x56\x96\xbc\x30\xa7\x2f\x16\x7b\xa9\xf6\x05\xf1\x45\x3d\x58\x3d\x10\x82\x80\x83\xf3\xbb\x0b\x90\x88\x15\xc7\xe9\xad\x5e\x25\xb5\x6e\x22\xca\xcc\xf4\xba\xb8\x38\xa0\xad\x70\x95\xa4\x04\xd8\xda\xb5\xb8\x60\x1a\x70\x2a\x6b\x38\xac\x64\x52\x89\x3d\xda\x0e\xbd\xe2\x01\x93\x7a\x4f\x34\x2f\x44\x08\xa5\x13\xda\x27\x4a\xdc\x79\x1a\xf9\x02\x71\x9a\x2a\xa8\x32\x4d\xea\x81\x50\xab\x13\xfa\x5a\x4c\x5f\x23\xec\xd3\x4d\x58\xc1\x00\x91\x8e\x60\x41\x0f\xa2\x9c\x5a\xe3\x29\x8a\x8d\xe6\x6c\x6e\x9f\x36\x3e\x37\x1a\xa1\x45\x66\xbc\x24\x2a\x58\x88\x93\x2f\x86\x8d\xed\xc6\x2a\xcd\x97\xee\xb3\x34\x1e\x97\x4a\x76\x9f\xc6\x15\x32\x6d\x99\xf6\xfe\x77\x3f\x1d\x9b\x73\x46\xe5\x42\x60\xba\x41\x46\x7c\xba\x30\x7c\x50\x89\x8e\xfa\xe5\x7b\x0b\xf1\xb2\x8d\x5e\x94\x47\x3e\x3a\x12\x61\x15\x8e\xef\x6b\x03\xfb\x37\x4d\xa4\x94\xc4\x68\xd3\xea\xa8\xd0\x63\xc7\xec\x26\xf8\x8e\xaf\xdd\x62\xac\xc0\xb7\x50\xa9\xf7\x39\xc2\x14\x13\xc4\x98\x70\x99\x4b\x5f\xa8\xec\x1e\xc3\x1e\x20\x5c\x21\x02\x3a\x25\x8f\x8f\x84\x34\xfe\x7f\xfe\xa0\x69\x88\xe9\xc0\xaf\xc3\x65\x79\x58\x24\xec\x02\x80\xf6\xce\x05\x77\xf3\x20\x09\xd8\x19\xf7\xb2\xe2\xe0\x9c\x20\xd0\x14\x8b\x21\x83\x06\xde\x15\xf2\xd0\x79\x07\xe8\x70\x1b\xa7\xa1\x13\x6a\xfd\xfb\xe0\xac\xe6\xdb\xa3\x6e\x2d\xb0\x37\x61\xe5\xb2\xf1\x19\xfa\x46\xe9\x82\x75\xf7\x0c\x4b\x60\x38\xe2\xcc\x7a\xba\x7e\xdd\x1b\x5d\xf5\x99\x36\xcf\x48\x77\xff\xba\x9f\x10\x73\x1f\xf6\x87\xb5\x37\xe1\xcd\xc8\xed\xb1\xe8\x2a\xb8\xbe\x72\x3b\x44\x3c\x71\x8d\xe4\x8d\xdb\x17\x89\x96\x7e\xef\xf4\x33\x7a\x9f\x59\x03\x48\x5d\x8c\x5d\x73\x3a\x1d\xa3\x92\xb7\x0b\x47\x0d\x53\x9b\x45\xae\x9e\x7c\x45\x77\x67\x0e\xe7\x79\xdf\x94\x96\x69\x17\x4d\x3b\x58\x7b\x2b\x2b\x89\xc7\xb4\x9d\xe7\x4e\x74\xb7\xf4\x98\xc2\x0e\xf5\xee\x56\x38\x11\xea\xf5\x75\x2f\x28\xf1\xb3\x2a\x87\xbe\x12\xed\x24\x5c\x23\xf7\xe7\x0f\x5d\xe4\x0f\xb5\xa0\x23\xde\xaf\x15\xec\xd7\x4a\x7d\xf9\xeb\x80\xa6\x7f\xa0\xe3\xfb\x21\x67\x20\x26\x1b\xb4\x93\x07\xd8\xc9\xf5\x1e\xbc\x1c\x00\xf4\x91\x4d\x3b\x39\x99\xd9\x89\xc9\xa4\x9e\x80\x13\x15\xb8\x3a\xb4\x1c\x89\xc1\xa1\x05\x49\x85\xfb\x44\x3c\x3b\x03\x65\xea\x44\x0b\x79\x80\x55\x7c\x95\x60\x19\x13\xb6\xf5\x75\x8c\x04\x51\x64\xac\xd4\x07\x2b\xdd\xac\x33\x23\x67\xb9\x38\xb0\x5f\xe9\xd2\xe0\x3f\xcb\x04\x32\xea\x57\xd0\x86\x5f\x04\x46\xf0\x89\x9c\x4a\x88\x48\xe1\x9f\xb3\xd6\x17\x7a\xc8\xb1\xf4\xb2\xfe\x32\x62\x57\xfb\x9d\xbb\x8e\x5e\x12\xed\x28\xc8\x23\xb1\xb2\xfe\xde\xd9\x0b\xd4\x61\x3f\xed\x2f\x4c\xae\x26\x9a\x9b\xc4\x04\xef\xc5\x88\x15\x11\x65\x81\x1c\x06\x4e\x8f\x07\xa2\x71\x24\x0d\x66\xee\x10\x04\x3f\x3a\x83\x3c\x82\x74\x68\x1b\xf9\xf3\x31\x24\xbe\x96\xa2\xc8\x5e\x0e\x45\x0e\x78\x8f\x47\xf3\x26\xa6\x9b\x43\x91\x21\xa3\xc8\x50\x5c\x41\x4c\x40\x9f\xf7\x9e\x9f\x7d\xb5\xf8\x7c\x5e\x7c\xac\x91\x18\x70\x9c\x03\xc2\x95\x5d\x90\xff\x02\xc3\x9e\x09\x40\x85\x2b\xa5\xf5\x6e\x86\x2b\x95\x97\x09\xc4\x2d\xd4\xb8\x12\xfd\xf6\xb6\x57\x97\x15\xd2\xf4\x19\x69\xd2\x57\x39\x19\xb6\x03\x3d\xc2\x9e\x09\x7d\x3b\xca\x71\xe6\x1a\x79\xfa\x0a\x79\x46\x32\x4d\x79\xe4\xa9\x12\x1d\xf5\xcb\xc8\x33\xd6\xc8\xb3\xab\x90\x67\x57\x21\x4f\x9e\x45\x55\x52\x90\xa7\x7e\xe1\xa8\x8f\x93\x29\xc0\x02\x79\x2e\xc8\xe1\x03\x5d\xd9\x88\x05\x2e\x29\xf2\x94\xd5\x1a\x08\xf2\x1c\xf0\xac\x84\x8c\x3c\xdd\x79\xc8\x73\x20\xc8\xd3\xa3\x36\xdc\x22\x6b\x61\xd1\x92\x65\xe4\xe9\x6d\x9f\x23\xce\xde\xc0\xc0\xa4\xde\xe2\xa2\x67\x62\x52\x5f\x63\x52\xd7\x8e\xf8\x90\x71\xe7\x61\x52\x6e\x83\x30\xa9\x3b\x31\x50\x69\x00\x54\x1a\x02\x95\x46\x40\xa5\x31\xee\x72\x3a\x5b\x53\xa6\xc3\xae\xea\xc7\x94\x45\x30\x7b\x2d\xe2\xf5\x92\xa1\xbe\x5f\xd3\xa8\xcf\x87\x9f\x50\xb8\xbc\x8d\x5d\xf6\xc0\x44\x90\x8e\x85\x75\xa2\xb5\xd1\xd9\x29\x7a\xc4\x86\xd9\x90\x55\xbd\xa3\x61\x86\xf8\x0a\x5b\x4b\x9e\x78\xe5\xfb\xad\x42\x8f\xa9\xd8\x81\xbc\x1f\xba\xf2\xfe\xfc\x7c\x40\xdb\x36\x60\xbe\xaf\x52\x5b\x26\x46\xef\x07\xae\xa3\xdb\x5d\xcd\x35\x49\xd6\x9f\xb5\x0a\x07\x21\x75\x9c\xa3\x2d\x02\xa0\xe3\x24\x4d\xfe\x41\xad\x95\x11\xd1\x72\xf5\x0a\xc7\x9d\x29\x8c\x1c\x5d\x81\x98\xab\x91\x30\x57\x9c\xce\xbc\x15\x34\x8a\x8f\x0a\x5d\xf0\x78\x6e\x79\xe4\xb5\x89\xa7\xdf\x17\xb9\x09\x57\x62\x85\x3b\x04\x79\xa8\x79\xd6\x7f\xb8\xc0\xce\x39\x7b\x78\x21\x2e\xc9\xd3\x06\x26\xda\x25\x68\xd6\x89\xf5\x1d\x6b\x0c\x6e\x50\xba\xdd\xb4\x87\xcd\x73\x44\xe5\x80\x25\x2d\x68\xeb\x71\x1a\xff\x26\xab\xe9\x6f\x58\x2a\x4d\x49\x05\x92\xe1\xed\x75\x97\x30\x17\x2a\x8c\x5c\x02\x04\x8b\x09\x3c\x11\x12\x34\xff\xa6\xd8\x38\x9c\x80\x5f\xdd\x46\x17\xbe\xdf\xba\xe0\x3f\xf7\x57\x1b\x44\xb9\x36\x9c\xa7\xf5\x4f\x35\xff\x5a\xba\xb6\x7b\xeb\xda\xf4\x0f\x6c\x6a\xb3\xd6\x20\xae\x2f\xcb\xda\xa1\xac\x85\x1d\xe4\xed\x11\x1f\x95\xa4\x93\xa0\x98\x4a\x42\x58\x4d\xf0\x0a\xfc\x5d\xc1\x5e\xfb\x0c\x4a\x2a\x32\xba\x77\x6d\xfa\x77\xce\xd2\x12\x7b\xb7\x6f\x59\xcd\x72\xbf\xe7\xec\xd7\xf7\xd3\x56\xde\x25\x44\xa7\x27\x2e\x87\xfa\xda\x33\xc1\x40\x40\x67\x08\xea\x59\x25\x88\x5a\x7b\x60\xdf\xb9\xda\xf7\x07\xd7\xa6\x7f\xe7\xb6\x60\xa4\xc7\x0d\x1a\xe5\x75\xa7\xb0\x67\x31\xf3\x2c\x89\x7b\xea\xba\xf9\x30\x73\xd5\x9a\x4d\x69\x2a\x07\x3b\x42\xb4\xc5\x2d\x88\x74\xf6\x9d\xa3\x55\x37\x27\x0f\xab\xb9\xa6\x30\xac\x7e\x04\x0f\x95\x0e\x4c\xd1\x8e\x1c\x9e\xdb\xd5\x71\x4d\xcf\xe4\xbe\x95\x7d\xc0\x52\x23\x68\x34\x2d\xe1\xc5\x01\x8e\x6b\xe2\x03\x8f\xb6\x69\x02\x5a\x58\x32\x2d\xfc\x3e\x79\xae\xdf\x8d\x6f\xaf\x47\xfd\xa0\xf6\x44\x4c\x04\xb5\xd5\x92\xb6\xe8\x30\x52\x52\x7e\x74\x14\x3e\x14\xb8\x8b\xf4\x7d\x44\xe4\x91\x61\x11\x0b\xe9\x31\x11\x14\xb2\xe9\x78\xe6\xee\xac\x03\xb7\x9d\xb4\x8f\xce\x42\xb5\xaf\x84\x21\x1a\x64\x58\xdb\xe7\x03\x52\xf3\x39\x4c\xef\x86\x4c\x5c\x2a\xae\x88\x41\x4c\x1c\xd1\x82\x66\x89\x88\xed\x21\x7e\x4a\x98\x1e\x2f\x65\x7a\x8e\xc0\xf3\x34\xed\x9f\xc4\xdb\xd8\x4d\x30\x31\xc4\xfc\x8c\xc1\xf9\x34\x84\xed\x09\x14\xdb\x43\xdd\x9b\x65\x79\x12\xb0\x3c\x23\xc5\xf2\x08\xc7\xc3\x9f\x25\x76\xa7\xb5\x71\x9e\x63\x79\x38\x3d\xc7\xee\xdc\x4d\xb1\x3b\xba\xd0\xfe\x8e\xbd\x2f\xf6\x37\xc4\xfb\x08\xf6\x3a\x5c\x3d\x94\x21\x75\x99\x03\xaa\x30\x07\x74\x2c\x09\xc4\xa3\x0e\x72\x0e\xa4\x05\xa0\xe9\x35\x70\x9a\x1e\xe5\xf4\x01\x63\x7e\x6b\x37\xbc\xf3\x42\x3b\x28\x7a\xb6\x67\x2a\x0f\xc6\x66\x51\xca\x3e\xbc\x73\x71\xd3\x10\x52\xb9\xa0\x78\x84\x28\x82\xb6\x91\xc4\x09\xe7\x13\xed\x0d\x6a\x4b\x02\x54\xbf\xed\xe6\xfc\x54\x78\xb4\x55\x3d\xd6\x4f\x7f\xc0\xdf\xd1\x0f\xfc\x65\x00\xe0\x26\x33\xc1\x03\xab\xaf\xdf\x6c\x32\x19\x93\x29\xc9\x3f\x4d\x94\x21\x40\x57\x07\xca\x55\xc1\x86\xba\x08\x14\x95\x38\x7a\x99\x20\x74\xb2\x46\xbd\x78\xf6\x36\x11\xb1\x14\xae\xe2\xe3\x42\x62\x6f\x12\x2b\xde\x84\xeb\x74\x75\xcb\x35\x52\xb7\x5b\x8d\x66\xcd\x2b\xaf\x7b\x72\x66\x9a\x97\x4b\x17\x6b\x50\xdf\xdd\x7a\x98\xcd\x69\xde\x22\x67\xf4\x63\x36\xe7\x6e\x1b\x77\x3a\xb3\xe9\x09\x7d\xa4\xbd\xbe\x76\x3e\x9b\x73\xb4\x05\x9f\xd0\xb3\xe9\x3f\x6b\xf2\xa2\x3d\x14\xa4\x87\xf0\x76\xff\xce\xed\x75\x02\xa2\xea\x87\xe1\x2d\x3d\xbe\x49\x86\x8f\xb4\x2f\xde\xfc\x51\x5c\x18\x11\xa9\xcc\xe4\x7e\x6f\xb5\xd7\x4e\xd4\xc7\x6a\x78\x04\x0d\x3b\xa9\xae\xf0\x40\xa1\x24\x47\x67\x09\x0f\x8d\x6d\x4d\xf0\xe4\xb4\x39\x8f\x2d\x57\xe8\x57\x15\x24\x22\x54\x62\x44\x20\x4c\xbf\x94\xff\xcf\xb2\x41\x0f\x0c\x3b\x7e\xb7\xa4\x3b\x92\x51\xf4\xd4\x67\xda\x20\xc1\x1b\xef\x91\x78\x91\x37\x21\x2e\x20\xfa\xa3\x2b\x8f\x88\xfc\xeb\xc8\x20\xeb\x55\xbb\x0c\x97\x7c\xc3\xb8\xc1\xfe\x9f\xb7\xcb\xe1\xc7\x18\x0c\x08\x3b\xc6\x71\x3a\xb1\x00\x4e\xa0\x90\xdf\xc7\x31\x26\xef\x5d\x36\x27\x1e\x38\x67\x3a\x61\x73\xc3\xb2\x7f\x5f\x16\x36\x80\xde\x0e\x90\x73\xd2\x2a\x20\xfe\x76\xbd\x3f\x7d\x3a\x0d\xe4\x54\x1a\xd8\xeb\xe0\xb3\xe9\x98\x1a\x4d\x50\x3e\xfd\xd4\xe8\x36\xb5\x83\x96\x84\xc1\x58\x3b\x36\xea\x66\x89\xeb\x28\x05\xfb\x39\x9d\x30\xdc\x66\xbf\x46\x33\x4b\x96\x8e\x5a\x0e\x2c\x1a\x51\xda\x3d\x8d\xc2\x66\x29\xaf\xbc\xb7\xa8\xd3\x0b\x82\x66\x9a\xd2\x12\x52\xef\x76\x10\x3f\x83\xda\x7a\x92\xd5\x31\xd2\x22\x7a\xfb\xb6\xeb\x52\xbf\x87\x5d\x84\x2b\x4c\xba\xb8\x87\x73\xf7\x08\x11\x3d\x5c\x02\xe7\xdd\x13\xce\x23\x64\xd5\x9c\x50\xdf\xb1\x6c\x8c\x28\x5f\xae\x0e\xd2\x46\xe4\x0d\xb6\x9d\x57\xbe\xd9\x04\x9b\x3f\x9a\xcc\x3a\x20\x3b\x31\xef\x7a\xda\x47\x5b\x76\xd2\xb4\xd7\x77\xec\x46\xd3\xf6\x09\x27\xfa\x10\xfd\xfe\xce\xb9\xe5\x04\xaa\xf1\x71\x6d\x81\xd0\x20\x2e\x9b\xfc\xd3\x11\xd4\x9b\xef\x93\x41\x6b\x85\xf9\x6d\x0f\x57\x4d\xd0\x04\xcb\x94\x6f\x10\xce\x30\x43\x84\xad\xa9\x8b\x59\xbd\xf7\xbd\x4c\xa3\xc1\xb8\x42\x06\xa9\x8a\xcb\x3d\xdc\x86\xa7\x4b\xf1\x4c\xee\xe1\x13\xb5\xbe\xde\xf8\x6e\x1f\xba\x23\xc6\x3d\x3d\xad\x89\x4e\x3f\xfe\x43\x2b\x85\xf1\x5d\x5d\x45\x33\xcc\x66\x53\xcd\x8c\xab\x25\x9e\xec\xef\x5a\x0a\x52\x39\x75\x68\x8a\xa9\x83\x59\x1d\x02\xe2\xed\x1f\x5e\x57\x21\xd8\x84\x57\x28\x8c\xcd\x66\x52\x40\xac\x38\xe6\x36\xf4\xf8\xb7\x0d\x85\xf0\x71\x21\xad\x18\xe8\xca\x50\x0c\x01\x53\xd8\x0b\x78\xfc\xa9\x43\xa6\xb9\xa0\x6d\x9a\x62\x8b\x17\xc1\x61\xbf\xe9\x0c\xdf\x24\x17\xd7\xa3\x5e\x80\x4c\x48\x32\xd2\x39\xe1\x1b\x4e\xff\xba\x3f\xec\xf4\x47\xd7\xa3\x44\x0b\x42\x30\x04\x28\x96\x50\x6f\x7d\x73\xd8\x93\x23\x78\x9c\xbb\x8c\xa6\x2e\xc4\x04\xda\x3c\x6f\xfe\xb9\xa2\xdb\x5e\x99\x37\x88\x56\x18\x48\xc4\x07\xf9\xc5\x3f\x5e\x9b\x47\x0e\x7c\x12\xa4\xf7\x91\x69\x34\xa6\x9b\x03\x7c\x29\x0d\xe0\x01\x0f\x7d\x30\x81\x4c\x95\x7c\x82\x54\xb9\x27\x30\x95\x7a\x24\x2c\xc2\xc5\x2d\x9c\xd1\xc1\x1d\x36\x0f\xa7\x99\xf7\x99\x2f\xd1\x1f\x68\x1b\x71\x66\x1c\xcd\xcd\x34\xb6\x88\xbf\xa7\xdd\x67\xa9\xee\xb4\xe0\x56\xc4\xd2\x51\xd0\xeb\x99\x7f\x11\xde\x93\xa3\xae\xdc\xd2\x83\x99\xe3\x30\x2f\x58\xa0\x4a\xca\xca\xe4\x71\x28\xaa\x0f\x72\xe7\x1d\x4e\x2b\x11\x84\xa2\x3a\xe0\xe1\xa2\xed\xb4\xc5\x8e\xff\x8d\x1b\x85\x40\xbb\x02\xeb\x8a\x54\xe0\x6b\xd7\x9a\x39\xf6\x62\x77\x20\xb3\xff\xa6\xf0\x47\xb1\x5b\xfc\xc3\x02\xa2\x67\x79\x11\x0a\xd2\x94\x44\xc5\x3f\xca\x6f\xb6\xd2\x52\x7a\x25\xf7\xaf\xfb\xa5\x7e\x18\xbb\xc3\xce\x1d\xcb\xbf\x24\x9a\xee\x43\x40\xe4\xdd\xb7\xa8\x16\xdb\x3f\x81\x0b\x27\x6c\x98\x3a\x49\xdd\x37\x9e\x96\x1f\xbf\xcc\x51\xe4\x53\x8a\x5e\x4a\xf5\xec\xe6\xb6\x1c\x0d\x1c\xe7\x78\x15\x7d\xaf\x19\x8e\x03\x62\x11\x19\xe6\x53\xaa\xe7\xab\xef\x76\x6a\x33\x69\xee\x45\xed\x20\x81\xe6\xe0\xc3\xbf\xf8\xa0\x6a\xc8\x64\x68\xcf\x5a\x26\xc2\x13\x16\x5c\xe3\xc6\x55\x9c\xef\x35\xcd\x1d\xc3\x6e\x2f\xbb\x56\x95\x55\x90\x4d\x76\x4e\x8b\x05\xfb\xd9\x56\x1e\x55\x45\xff\x87\xbd\x9e\x3e\x65\xba\x52\x86\x82\x83\x31\xdb\xa2\xe4\xc0\xb6\xa1\x97\x51\x3b\x86\xae\x00\x71\xd3\xac\x3e\x12\xda\xd4\xd3\xd8\x82\x10\xfa\xf1\xb8\xd0\xc5\xd5\x59\xac\xfd\x4c\xc6\x8b\x8b\x87\x27\x6c\x42\x30\x09\x52\x7b\x0d\x16\x78\x73\xc5\x0a\x44\x38\x54\x29\x40\xa5\xc8\xb2\x0f\x11\x36\x37\x82\xe9\x6b\x3a\x9c\x70\xef\x25\x85\x1c\x85\x53\xeb\xd9\xd5\x5f\x76\x71\x8c\xf1\x89\xda\x8b\x76\x18\xfb\x8f\x06\xc7\x03\xc9\xc6\x05\x55\x11\x1a\xeb\x69\x78\x6e\xe8\xbe\x68\xad\x99\xd0\xee\xaa\x21\x07\x32\x64\xca\x78\x54\x2e\x28\xbb\xf9\xf1\x07\x19\x40\xba\x9c\x80\x12\xec\x61\xee\x3e\xb7\x44\x32\x85\x4a\x3a\xdf\xa2\x3d\xad\xb1\x44\x6d\x1e\x07\xa0\x87\x2f\x03\x1d\x25\xce\xb9\x84\xf6\xdf\xd1\xa5\x72\x4d\x11\x4d\xf9\xcc\xef\xfb\x85\x8a\xba\xe1\x53\xe5\xf7\x62\xb3\x6a\xa0\xdb\xb6\x95\x26\x56\x3a\x37\xea\x1d\x61\xa0\x7c\x5d\xc8\xb2\xb7\xc4\x2d\x00\xd6\x4e\x8a\x00\xed\x17\xbf\x4e\x75\xad\xfa\x96\xa9\x8b\xa5\xb5\x92\x33\x77\x9d\x9e\xd6\xd2\x13\xa4\x93\x6d\x32\xa5\x09\x77\xda\x5c\xed\x7f\x57\x81\xe4\x6e\x6e\x59\xac\x53\xd3\x01\xf2\x16\x17\xc3\x14\x36\x5e\xfa\x35\xcf\xc0\xcd\x7e\x9a\xea\x1b\x7d\x48\x83\x0a\x2e\x2e\xc6\xaa\x01\x22\x64\x14\x94\xf2\x3a\x97\x8c\xb4\xf2\xb0\x31\x69\x65\x2e\xf7\x06\x88\x5d\x2b\xe8\x10\x31\x72\xa1\xd0\x94\x71\x72\xcd\xa8\xa7\xb2\x92\x64\xfa\xf1\xf5\x1d\xd5\x29\x3a\x77\x82\x5e\x98\x80\x06\xa7\xce\x5d\xa4\xa3\xe3\x4c\x70\xa8\xb4\x69\x3a\xe9\x9c\x5d\xee\x65\x8a\xa5\x5a\x7b\x74\x71\xb1\x9b\xaf\x95\xf8\xec\x30\x13\x9e\x24\x5f\xac\xe8\x8d\x3c\x8f\x3e\xbb\xb8\x78\x6d\x80\xda\x98\x97\x6c\x56\xe4\x71\xe3\x92\x17\x63\xaa\xc2\x3a\xd3\x77\x76\xd5\x0a\xed\x5d\x56\x64\x54\xf0\x4b\x1f\xd2\x45\x76\x65\x74\xd5\x0f\x9d\x96\x5a\x48\xcd\x79\x21\x63\xde\xb8\xe5\xbb\xdf\x4a\x4f\x58\x7a\xb1\x1e\xa5\xbd\xd1\xcb\xca\x2d\x7f\x0f\xd2\x66\xa6\x0e\xca\x7f\xd1\x4c\x3f\xed\xd7\x75\xfa\x34\x30\xb7\xa1\xda\x4a\xf0\xc1\x2d\x1a\x06\xc7\xb1\x82\x02\x00\x42\xa3\xbf\x49\x4b\x1b\x8b\x7c\x5d\x7b\xe5\x5e\xf0\x75\x82\xf6\xae\x23\x27\x2d\xbc\xdf\x1e\xd0\x34\xd0\xcf\xb7\x2d\x89\x70\x66\x9e\x28\x1c\xd6\x4b\xb9\x0e\xd0\x36\x95\x6c\x6e\xe4\x6b\xbb\x51\xed\x46\xa0\x08\x47\x76\xd4\x8a\x7b\x31\xdd\x4a\x65\x7e\x2b\xac\x9a\x6e\xb4\x83\xfa\xac\x99\x45\x8d\x7d\x75\x02\xca\x54\xb3\x47\x5d\xee\x0c\x60\xf0\x7e\x9b\x8e\x30\x49\x9f\xd4\xd2\xa1\x2f\xbc\xd3\x46\x0a\x4a\x27\x95\xb8\xb0\xdd\x14\xd5\xa4\xab\xcf\x3c\xe5\xa2\x79\xf8\xfd\x9d\x4f\x90\xf9\x25\x24\x91\xa5\xcd\xa1\xb4\xdd\x8b\x67\x5a\xc9\x89\x9f\x26\xbe\x36\xca\xa0\x1a\xf3\x9b\x02\x3a\x8e\xac\x8d\x4b\xd3\x9d\xd1\xc6\xa5\xca\xea\x13\xe6\xdf\x1d\x73\x30\x4d\xcf\xb0\xaf\x1b\x38\x10\xf3\x1e\xb0\xbc\x9b\x4d\xf0\xb4\x91\xc7\x68\x9e\xa9\x4e\x57\xc5\xd9\x81\x13\x63\xb6\x9a\x98\x67\xbc\x41\xc7\xf4\xb9\xfe\x42\xe6\x81\xee\xc5\x88\x06\xb4\x1c\x26\x56\xfb\x2a\x3c\x2f\x1c\x85\x10\x71\xbe\xc6\xea\x0c\x9c\x91\xc0\xa9\x9e\xf0\x53\x1c\x4d\x53\xf3\x28\xf1\x54\x41\x68\xd0\x80\xbd\x26\x8d\x98\x72\xa6\x03\x48\x44\x2f\x83\xc5\xc5\x64\x75\x50\x74\x7b\x6e\x31\xa9\x0d\x56\x07\xb5\x64\x35\xa9\x1d\x88\xb9\x15\x81\x7b\x59\x2c\x88\xc2\xd4\x82\xe8\x2e\x9f\x91\x39\x23\x1a\xe7\x33\xba\x69\x46\x83\xe0\x0c\xcb\x9a\xd2\xc2\xf2\x12\x31\xeb\xb0\x3c\xf1\xed\xbe\xad\x27\xd2\x6e\x08\x83\x5b\x59\xe9\xb2\x4d\xde\x6a\x97\x5d\x11\x50\x1f\x9a\x8e\x5f\x18\xa5\xe5\xd8\x1e\x68\x5f\xe2\x1b\xeb\x2f\xf1\x27\x96\x42\xfe\x88\xf2\x84\x54\x6a\x96\xf6\x41\x59\xf8\xf2\x9d\x01\x51\xed\xfc\x81\x7d\xfa\x80\x2f\x1f\xf0\xf5\x07\xf6\x70\x1f\xba\x37\xed\xdb\x68\xd9\x30\x28\x2a\x8c\x9e\x9f\xf7\x69\x67\xef\x4d\xdb\x08\x86\x45\x29\x96\x94\x96\x51\x2e\x16\x93\xa3\xbd\x69\xa7\x46\x91\x2a\x76\x27\xc5\x7a\xd3\xc5\x94\x3f\x23\x5e\x95\xe2\xd2\x48\xca\x8f\x75\xb3\x67\x87\x85\x3d\xb1\xae\xf7\x52\xeb\x7a\xd6\x2e\x15\x3b\x96\x9e\xe1\x7d\x25\xf5\x5d\x12\x2a\xd7\x25\xb8\x4c\xf0\x0c\x83\x3d\xd6\xf2\x1b\xd9\x0f\x35\x4f\xdc\xa4\x20\xfc\x75\xa8\x0d\x79\x9a\xb4\x38\x3c\x6d\x4a\xd8\x65\xff\x12\xb5\x03\x02\x1b\x8b\x95\x3a\x9b\xca\x49\xc5\x60\x7e\x94\x5c\xf1\x4d\x01\x3f\x04\x1e\x2c\x7f\x42\x5a\x46\xf9\x60\xb9\x0b\x6c\xb0\x03\x67\x2a\x9b\x66\x67\xf6\x55\x67\x08\xdf\x94\x72\xbd\x69\x4c\x2c\x8e\x41\x3b\xe5\x9c\x25\x48\x07\x18\xb0\x9d\xb4\x42\x4c\x0a\xaf\x85\x25\x62\x48\x94\x5d\x4d\x68\x7b\xa9\x73\x96\x68\xd6\x39\x4b\x94\x36\xc4\xe7\x9b\xe7\xa4\x4d\x64\x53\x31\xdb\x96\xcd\xb8\xa4\x03\x5f\xe0\xa6\x84\x55\x5f\xfd\x6b\xdf\xdc\xfb\xac\x74\xb9\x3a\x52\xe9\xb5\x3b\x2d\xc5\x25\x42\xce\xa8\x77\x95\xc7\x7d\x44\x5d\xf9\x88\x72\xe2\xb2\x6a\xfe\x7c\x89\x49\xe5\x2d\x98\x2d\x46\xb1\x9e\x56\x10\x0f\x08\x37\x42\x3d\x74\x4a\x91\x0c\xc1\x5d\xd8\xb3\x2f\xeb\xe0\xf9\x08\xf4\x98\x8f\xf6\xa3\xc2\x70\x70\xa0\x4d\x5c\xce\x41\xd1\x4c\xbb\x9f\x76\x9d\xe0\xfd\x32\x8d\x9a\x28\x49\x4f\x1c\x8a\xc3\x8e\x3b\x7b\xbf\xf1\x8b\x53\xa1\x77\xf6\xa6\xae\xdf\x80\xcb\x53\x0e\x92\x07\x07\xb4\xbc\xaf\x69\x50\x42\x03\x44\x38\x63\x41\x97\xaa\xd6\xfb\xfb\x3d\x51\x6f\xc7\x85\x26\x95\xb9\xba\x07\xe5\xfc\x40\x89\x5d\x3b\x55\x18\xea\x6e\xe5\x5d\xca\xd4\x7b\xc4\x52\x0b\x0b\xd3\x33\x88\xfc\x2e\x4c\xf7\x98\x21\xed\x01\xc3\xb7\xa6\xe5\x04\xa9\x24\xbc\x62\xc3\xdd\x09\x61\xfb\x52\x15\x1e\x33\xea\x09\x35\xc7\x9c\x41\xa2\x39\x83\x91\x83\x94\x44\x3c\x81\x31\xf5\xe2\x89\x7a\xe6\xdb\xaa\x98\x89\xf6\xdb\x23\xd6\x9a\xe6\xb6\xf4\xed\xfe\xa8\xdc\x45\x85\xae\x75\xc7\xe1\xf9\x39\x08\x5c\x4a\xf7\x8e\x1d\xd4\x20\x64\xc5\x7c\xd4\xf8\x9c\x50\x1c\x33\xd2\x3d\x7b\x94\xea\x1a\x42\xfc\x77\x0f\xcd\x32\x9a\xbc\x26\xf0\xd6\x2f\x19\x4d\x3d\x02\xf8\x95\x6e\xdb\x1e\x61\xb3\x26\x7b\x6b\x3f\x74\xfa\xd4\x50\xfd\xe8\x84\xb8\xf1\x7d\x76\x65\xbf\xda\x40\xc1\x66\xf1\xb0\xbd\x77\x6e\xd5\xe4\x05\x91\x54\xd8\xa9\xfd\x8f\x7b\x47\x3b\x2b\xfd\x71\x6f\x23\x88\x87\xbe\x2c\x9c\x75\x21\xe8\x39\x4f\xad\xa8\xf6\xd4\xbf\xad\xf5\xec\xc7\xfb\x1a\x91\xd8\xdd\x9a\x6f\x5f\xf4\x6a\x6e\x71\xa1\x40\x5b\x32\x5e\xc5\x27\x70\xdd\x79\xdd\xa3\xad\xdc\xda\xac\xfd\x56\x8b\x73\x64\xf7\x6c\xe4\xe1\x7e\x63\x32\x51\xf2\x11\xf1\xb6\xfd\x33\xe4\x58\x90\x02\xd0\xf5\x1d\xf6\xbd\x7f\x87\x4b\x7d\xaf\xdc\x22\x42\xea\xb3\x43\x6b\x9c\x80\x7b\xd7\xf6\x4b\xc4\x4d\xcb\x0f\x72\x2e\x84\x23\xb7\xea\xef\xf4\x06\xa0\xaf\x24\x80\x0b\x03\x9a\xce\x5f\x7c\xb0\x88\x85\xdc\x70\x7c\x02\xcd\xc0\x3e\x72\xfc\xb4\x93\xfa\xca\x2d\x66\xd7\xb9\x58\x63\xe9\x92\x69\xd1\xec\xb7\x56\x9a\xf5\x16\x4d\xfc\x74\x15\x7b\x0c\x43\x11\xd7\xae\xd2\x21\x72\x84\x38\x02\x7c\x0d\xa6\x12\x9b\x2a\x71\x32\x99\x50\xad\x59\x91\x94\xf5\xb4\x39\x2b\xa6\xd1\x58\xc1\xd0\x6c\xc3\x5e\x09\x64\xaf\x84\xb2\x57\x22\x20\x82\xbc\xc2\xf7\x94\xbf\x69\x6f\xa2\x4d\x99\x7c\xb5\x0b\x0c\x6b\x26\xbd\x05\xd8\x74\xff\x97\x3c\xd5\x43\x2c\x84\x5e\xb6\x87\xfa\x0e\xad\x99\xd0\x66\xe5\xb8\xb6\xb7\x6d\x77\x93\x73\xb5\x11\x94\x71\x54\x92\x92\x3d\x6a\x13\x74\xad\xa7\x91\xdc\x89\xc8\x4c\x48\x87\x52\x85\xed\x3b\x59\xd5\xbc\x27\x88\x1a\xb8\xc3\x02\x6e\x50\x83\x8d\x95\x81\x34\xd8\x90\x06\x9b\xce\x00\xfa\xbb\xfb\xe2\x8f\x3e\x96\xa5\xdf\x94\xa5\xbf\x8f\xa5\x3f\x56\xb7\x97\x4a\x8e\xb5\x3f\xff\xb3\x7d\x5a\x24\x6a\x47\x4c\x2f\xeb\x04\xe1\x31\x9b\xce\x93\x88\xca\x9b\xac\xe5\x31\x2a\x37\x2f\xda\x03\x3a\xde\xd6\x63\x99\x59\xb5\xb4\x63\x2c\xed\x04\x4b\x9b\x53\x2f\xb0\x92\x69\x39\xf7\xec\xeb\x8e\x8b\xaa\xdd\x44\x2d\x6c\x97\xd6\x5b\x6c\x57\xd4\x92\x7e\xd7\xe2\x05\x80\x25\x48\xb0\x55\xfd\x6b\x62\x29\xfc\xc3\x75\x70\xf1\x8a\x64\x83\x85\x34\x20\x0f\x5f\x5b\x01\xfe\xc6\x04\x66\x01\xde\xec\x61\x61\x2e\x02\x75\x56\x50\xc1\x5c\xa8\xa6\x90\x59\xdc\xae\xe5\x9a\x80\x4d\xd1\x54\xa4\x25\x4e\xda\xc9\x26\x4d\xab\xcb\xa6\x2c\xda\x86\xd4\x30\x32\x27\x78\x87\x3a\x1c\xe9\x48\x84\x23\x84\xf3\x79\x36\xef\xb2\xd7\x2a\xeb\x19\xa4\xaf\xcb\x4c\xb5\xa7\xaf\x1f\xce\x41\x01\xd2\xd4\xb3\x33\xfa\x11\x6a\xea\x97\x3b\xd4\xd3\x2f\x63\xd4\xd2\x2f\x91\xb9\x48\x46\x69\x68\xe8\x28\x7d\xba\x4b\x9f\xc6\x2f\x0c\xb4\x81\xdd\xa1\x41\x14\x60\x35\x35\xb4\xb6\xf9\x78\xe5\x0e\x48\x95\xa8\x47\x20\xd5\x04\x79\xd4\x2f\xfe\x85\x45\x51\xe2\x3c\xfd\x18\xd7\x9a\xab\xc4\xc2\x6e\x96\x1b\x9f\x6a\xfc\xbb\xfe\x09\x37\xd0\xb7\x38\xb2\xd8\x10\xc4\xd2\x8b\xcc\xb3\x17\x68\x95\xd1\x0c\x5c\xba\x44\x80\x81\xa5\x3f\xbe\xae\x45\x76\x4c\xaf\xcd\xd5\x71\xed\xce\xbe\xe0\x27\x5c\x57\x87\x78\xc2\x0a\x6c\xc8\x2a\xe3\xde\xc1\x34\x17\x7e\x98\xeb\x6a\x18\xec\x1c\x48\x99\x7a\xdb\x66\xc8\xe0\xc7\x19\x5a\x64\x06\xb3\xc0\x14\x44\xae\x75\x23\x5e\x47\x47\x5b\x56\x86\x8a\xa2\xf2\xbb\x78\x35\xa2\x99\xaf\x01\xad\x68\x0c\x83\xed\x6b\xb8\xe1\xe6\x6d\x1e\xf1\x36\xef\x89\x82\x93\x28\xc9\xf7\xb2\xea\xed\x18\x2e\xe1\x6a\x6a\x87\xf7\x80\x87\xee\x95\x74\x10\xe7\x72\x26\x2a\xee\xe9\x2b\x60\x41\x53\x98\x54\x46\x54\x03\xa2\xbd\x15\x86\x1a\x58\x08\x6a\x4e\x2d\x73\x14\x0e\x41\x62\x5d\xf9\x14\x0b\x6a\x79\x6f\x46\xbc\x37\xfb\xca\x2e\xa7\x8f\x70\x93\x5d\xe1\xae\xbb\xe9\x29\xc6\x5b\xbd\x02\xd8\x0e\xec\xbd\x7b\xda\xe2\xb4\xb1\xbb\x13\x3b\xb9\x70\x07\x50\x64\xfd\xb9\x61\xaf\x7f\x86\xf2\xae\x2c\x9a\x1e\x4d\x7b\x57\x1f\x57\xef\xb4\x47\x66\x0f\xdb\x3d\x92\x59\xe8\xe6\xee\xea\x3b\xf3\x25\xaf\x70\xc5\xa1\x64\x8e\x70\xc6\x21\x13\x44\x07\xc9\x78\x4f\xa2\x27\x9e\x16\xcc\xf9\x1b\xcf\x36\xc2\x74\xa1\xdc\xa2\x05\xd4\x5a\x20\xd3\x11\xe8\xe9\x08\x69\x17\x89\x57\x02\xbe\x08\x12\xfd\x14\x79\x4a\x9a\x12\x15\x3e\x6c\x8f\xc6\xe7\x99\x0b\x3c\x9a\xbc\x50\x49\x70\x61\xf4\x57\xee\xce\xc1\x31\x6f\x39\x2a\xf5\xcf\x50\x89\xc2\x89\x38\xfe\x4e\x9c\x2e\xce\xe1\x6b\x38\x4a\xa0\xdf\xbd\x7b\x6b\x22\xec\xf5\x7e\xf9\xe1\x12\x9a\x56\x47\x34\xd3\x88\xb1\x80\x3b\x01\x9a\xf0\xfa\x30\xb5\x43\xf5\xb2\x58\x0b\xd1\x46\xad\x47\xdc\x8b\x8e\x7b\xa9\x6c\x49\x87\x75\x1d\x88\xc1\xc8\x2c\x7f\xd2\xb9\x93\x2c\x75\xd2\x95\x0f\xf5\x20\x65\x65\x8a\x28\x54\xbf\x98\x0d\x63\x3a\xba\xff\x44\x10\xee\xa1\xeb\x5a\x2e\x2c\xc7\x68\x64\x10\x93\xf1\xcb\xf4\xe3\x9b\x0a\x8f\x3e\xee\x16\xf8\x90\x95\x5f\xb9\x60\x55\xb3\x6d\xa8\x37\x20\xa5\x2f\xba\xc8\x7a\x62\x94\x52\xeb\x00\xe4\xe0\x48\x26\x85\xce\xdf\x3b\xb9\x7a\x11\xcd\x2d\x3a\x3c\x07\xd9\xe6\x6a\x6a\x6b\xcd\x86\x22\x10\x47\x79\x02\x31\xb2\xec\xbd\x0c\x1f\x36\x9f\x9f\x23\x17\x64\x9f\x47\x3c\x07\xab\xe9\x74\xd1\xfe\x98\xd8\xc5\xe4\x9c\x7d\x0e\xde\x7f\x06\xf7\xf5\x99\x70\xcf\x08\x4f\x77\x9f\x09\xf7\xac\xe1\xa9\x81\xa7\x47\x3c\x8d\x29\x77\x42\x4c\xf2\xdb\x6a\x86\x31\x0f\xed\xa3\x3a\x88\xcf\x68\x55\xba\x43\xd4\x73\x43\x59\x6f\x08\x2d\xa5\x0c\x4e\x4b\x55\x55\xa0\x98\x15\x40\x5f\x56\x0b\x0d\xa7\x59\xec\xc9\x60\x8d\x3e\x11\x1d\x8b\xb7\x62\x93\xa8\xb6\x58\x1e\x22\x3a\xe3\xa4\x29\x2d\xce\x72\x5a\xc0\x04\x6e\xa1\x65\xad\x72\x61\xa7\x59\x93\x6a\xf6\x42\x25\x45\xfc\x54\x6c\x4f\x8a\xed\x59\xab\xb1\x2a\x26\x8d\x5a\xb5\xc2\xa1\x73\xe4\x50\x0f\x5e\x6f\xfc\xd0\x69\xd4\x42\x22\x97\x45\x53\xcb\xb2\x5f\x68\xfc\x48\x15\x3b\x92\x62\xea\x04\x21\x7a\xa4\xb0\xe7\xf0\xd1\xb1\x0f\xb3\xa0\x91\x3a\x56\x46\x0e\x23\xaa\x01\x21\x11\x1e\xfe\x9e\x55\x57\x93\xc3\x7a\x1d\x0d\x3e\x53\x98\x90\xde\xc3\xed\x3d\xe1\xab\x48\xf0\x95\x9e\x95\xa3\x74\x56\x0e\xed\x79\xb3\x47\xd8\x6c\x34\x99\x24\x8c\xee\x12\x85\xd5\x06\x0a\xab\xed\x29\x8a\x25\xa1\xef\xf7\x73\x27\x67\xba\x52\x12\xc1\x75\xf5\x41\x76\xc4\xcc\xc7\x51\x43\xd9\x59\xbf\x67\xaf\xf6\x11\x40\x81\xd0\x32\x18\x48\x6d\xdc\xb9\xba\xa6\xc5\xdd\x10\xe1\x4b\xea\xd1\xd6\xe2\xe2\x63\x96\x6c\x37\xb2\x67\x39\xce\x8c\x60\x6b\xaf\x9e\x67\x22\xa7\x8e\xf4\x0d\x10\xae\x6e\xf8\x70\xc3\xc6\x2c\x9f\xb2\x95\x5d\x9c\x5a\x99\x66\xbc\x63\x8c\xa3\x23\xc6\xbe\xda\xa1\x23\x8a\x8d\xb0\x64\xe7\xf6\xcc\x4d\xeb\xe3\xfa\xa7\x6b\xdc\xfd\xd0\xae\x91\x1b\xa2\x81\xd1\x42\x1f\x39\x72\xce\xf5\x6d\xf8\x03\xcf\xe7\x55\xd3\xbc\x04\xbb\x8e\xb6\x6d\x88\x6d\x3b\x40\x23\xf4\x12\x09\xb9\x63\xd0\x31\x49\x4a\xb3\x0c\xac\x78\x9a\x66\x29\x8c\xe4\x44\x84\xac\x99\x19\xbe\x01\x16\xd8\xdb\x58\x60\xce\xe7\x26\x7d\x26\x92\xf3\x93\x77\x39\x4e\x3e\x84\xc7\x7a\xac\x0d\xf4\x41\x17\x63\x49\x8c\x3a\x50\x75\xb1\xd5\x9a\x88\xe1\x53\x86\xf8\x89\x6c\xe6\xd3\x09\xe8\xfd\xa3\x53\x6d\x4d\x9f\x6a\xb2\x54\xb2\xf9\xe3\xf7\x4c\x6f\xcd\x33\x4e\x98\x82\x3e\x63\xac\x49\x46\x7f\xcc\x1a\x0e\x6b\x53\x32\x1c\x3a\xab\x7c\xf2\xf4\x6f\x4d\x6b\xb1\xa7\x77\xf7\x35\x5d\xe2\xdd\xfd\x2a\xfe\x10\x57\x9c\x3c\xa4\x89\xc9\xc3\x2a\xfe\x20\xd1\xbf\x1e\x84\x3a\xbd\x7d\xb9\x76\xbe\xca\x7f\xa1\x76\x38\xec\xb9\x35\x6d\xb2\x96\x51\xcd\x72\x29\xab\xe4\x2c\xe6\xad\xba\xba\x43\xe5\x0d\x90\x5e\xa2\xea\xf3\x15\x69\x7c\xba\x46\xe5\xd6\x9d\xdd\x65\x0a\xa9\x1c\x5e\x0d\x2e\xdc\xa4\x93\xb0\xbf\x6e\x45\x35\x5d\x1a\xce\xc0\xde\x3a\x05\x2e\xe7\x87\xb7\x43\xb7\xd3\x1f\x3e\xca\x9d\x3c\x07\x90\x7c\xeb\x74\xf5\x43\x8f\x1f\xde\x06\x86\xbc\xe3\x77\x87\x6a\x42\xdf\xd2\x86\xe7\xdc\x2e\x4c\xba\x2d\x65\x0d\x05\x3a\x45\xc9\x47\xd4\xa2\x46\x4a\x4f\x5b\xc5\xbc\x1d\x00\xfa\xea\x24\xf2\xd9\x9b\x3d\x15\xd8\xf5\xeb\x89\x74\xad\x2f\x3f\xd4\xfc\xaf\xbf\x1c\xfc\x79\x7e\x1e\x95\x7b\xdf\x0a\x52\xee\xd7\x5f\xf6\xa0\xfc\xee\xd6\x21\xae\x08\x97\xba\xe5\xb3\xbf\x9c\x05\xfc\x25\xfe\x59\x0a\x0d\xca\xe1\xa6\x83\x14\x71\x24\x52\xfd\x9a\xd0\xdc\x20\x30\x66\x9f\x7e\xad\x91\xe3\x9d\x16\x46\x6c\x02\x26\xcd\xd4\xab\x6f\x9d\x84\x26\x6a\x71\x91\x1e\xfa\xfc\x50\xd0\xa1\xb2\xf1\x6a\x23\x13\x9f\x5e\xa7\xc5\x36\xc2\x7a\x95\x7a\x16\xf4\xa9\x93\x32\xcd\x20\x91\x87\x34\x28\xd0\x6c\x08\x6d\x83\x4c\xd9\x3a\x7d\x27\x21\xb2\x61\x90\x23\x0f\x9a\x26\xfb\x25\x86\xce\x4f\xb4\x43\x44\x2b\xec\x49\xef\x95\xa7\x89\xb6\x6d\x85\xf0\x42\xaf\x9c\x5f\xe3\xf3\xc5\xc5\x5b\x38\x0d\xe2\xe7\xd4\xf8\xba\x7d\xf8\x48\x19\x7b\xf7\x9c\x41\xcf\x59\xc6\x26\xa5\xff\x22\xca\xa8\xdd\xf1\xcf\x6d\x7e\x78\xe7\xc1\xcd\x23\xb1\x08\x59\xa1\x83\x00\x3a\x06\x9e\x2a\xc5\x0f\x52\x8a\x32\x8c\x62\x3f\x1f\xcc\xc6\xf8\x3d\x33\xff\xc6\x40\x0e\x06\xae\xdf\x19\x3e\x1a\x6d\xe5\xd2\xb3\x96\xfc\x47\xdd\x92\x7c\xc7\x37\xba\x5c\x16\x50\xe4\xdb\xe2\x62\xf9\x9c\xe9\x0a\xac\x4c\xbb\xb8\x38\x70\xa7\x8a\x73\xba\x51\x18\xe0\x85\xee\xef\xe2\xa2\x8f\x96\x7f\x3c\x70\x51\x9d\x3a\x55\xf0\xa8\x13\xe0\x9e\x52\xca\x95\x13\xbc\xe5\xb2\xa6\x8a\x1f\x5e\x8b\x4f\x9a\xb4\xc6\xad\x4a\x70\x16\xa6\x4a\x4c\x55\x6c\x86\xfd\x61\x5a\x29\xa0\x17\x33\xc3\x9a\x17\xa1\x73\x63\x5a\xee\x29\x0e\xf2\xeb\xa9\x01\x2c\xf6\xf9\xc3\xf9\xaa\xfa\xc5\x59\xa1\x4a\x64\x16\xe0\xb8\x35\x65\xff\x2d\x9e\xe5\x40\x5f\x89\xe5\xaf\x48\xc2\xc1\xe1\xf3\xc6\x96\x4e\xaa\x00\x92\x21\x21\xa3\x26\xe2\x73\xa3\x8d\xad\xab\x42\x60\x59\xa1\x5e\xc2\xa2\x12\x1d\x64\x2b\x59\x27\x4c\x52\x4f\x13\x41\x7b\xdd\x3b\x67\x5f\x31\xce\xaf\x0b\xeb\x69\x78\xfb\xa8\x30\xd7\xdd\x35\x35\x35\xf1\x5d\x50\xec\xb1\xf5\x34\x91\xaf\x46\xec\xe7\x2e\xb2\x26\xca\x85\x05\xbd\x6e\x76\x88\xb6\xa1\xba\xab\x05\xbe\xbd\xed\x7e\x77\xe1\x32\x99\x76\x94\x65\x1f\x40\x89\x07\x65\x2e\xbb\x74\x4e\x85\xed\x03\x5a\x51\x01\x1e\x0f\x68\x05\xff\x08\xa7\x72\x7f\x84\x3a\xfb\x07\xc4\xd0\xb5\xd0\xc1\xb6\xbc\xe5\x21\x41\xfa\x1f\x4e\x52\x28\x05\x96\xe1\x74\xb4\xd1\x2f\x10\xcf\x93\x73\x40\x90\x0f\x3d\x54\x1e\xf2\x3c\xc2\xef\xc8\xa6\x1c\x4d\x9c\xa1\x43\x5d\x6e\xa8\xb4\x10\x1f\xd9\xca\x5e\x84\xe6\xff\x96\x25\xb8\xce\x76\xf6\x12\x3a\x1b\x27\xec\x53\x50\xa9\x7f\xfa\xe5\xf5\x38\x9b\xc6\x48\x73\xc7\xdd\x76\x83\x9d\x13\xf4\x66\x7c\x89\x7a\x8e\xf7\xfc\x7c\x50\x87\x35\xd3\xd6\x0e\x6b\x80\x1d\x84\x85\x53\x84\xef\x6a\x7b\xc5\xcd\x4d\xdb\x2b\x36\x37\xb1\x0d\xd8\x72\x1f\x97\x0d\xeb\x17\x85\x43\x64\x7b\xc5\xce\x08\x0e\x21\x19\x4a\x5c\xbf\xb9\x29\x1a\x64\x41\x5a\x7f\x67\x87\x8a\x6d\x71\x5c\xde\x5b\x5c\x88\xf9\xf8\xac\xaa\xdd\x5b\x43\xed\x9b\x0e\x37\x7a\xd5\x2d\xec\x49\xf2\x15\x27\xef\x7b\x16\xee\x64\x7b\xc0\x67\x21\x14\x4f\x23\x7b\xfb\xc1\x4d\xa1\xd5\x87\x8d\x43\x64\x7f\x7b\x70\xb5\x12\x4b\x5f\x42\x2c\x62\x5f\x38\x7d\x60\xd7\x1d\xd4\xd9\xc9\x15\x60\xec\xd8\x87\x35\x5c\x37\xd5\xd3\xf6\x33\x2e\x50\x7b\x18\xd2\x17\x99\x49\xb3\x46\x25\xed\xad\xac\x0d\x9f\xce\x21\xfe\x0e\x61\x71\xfe\x8b\x20\x5a\xbb\xfe\xf3\x33\x32\x2c\x05\xe2\x85\x1e\x67\x89\x39\xc7\xd6\x0e\xc1\x5c\xde\x8f\xb7\xf0\x96\x35\xd5\xba\xe3\xa6\xe8\x38\xe2\xbf\x59\x53\xad\x3b\xdd\x54\x8f\x73\xa4\xa5\xe6\x66\xfa\xde\xbd\x75\xf1\x9a\xbb\x53\x5d\xdf\xe1\xce\xaa\x2c\x7b\xaa\xbf\xbb\x08\x97\x3d\xd3\xd3\x1e\xa7\xe5\x3b\x4a\xef\xba\xa3\x5a\x7f\x1d\xed\x0e\x11\xa0\xc8\xf8\x9c\xbf\x51\xf3\xca\x3f\xc6\x0e\xfe\x18\xad\xfd\x18\xeb\x56\xf4\x3b\xd7\xcc\x5a\xb6\x26\x5e\x99\x05\xa0\x4e\x77\xe2\xb2\x5b\x1c\xa6\x7f\x1c\x17\x3e\xf4\x5c\xd7\xe1\xbf\xcf\xcf\x5d\x39\xac\xbb\xf2\x6e\xa7\x75\x2c\x9c\xc7\xb1\x4c\xf5\x83\x13\xdb\x7e\x2a\x5c\xf0\x15\x0f\xab\x9f\x88\xb6\x66\x1c\x21\x17\xc5\x4b\x17\xed\x71\x80\xd0\xdb\x4b\xd5\x8a\xf5\xbe\x5a\xb1\x65\x61\x69\x1a\x20\xb0\xd2\xeb\xec\x77\xf7\x4e\x60\xcf\x59\x14\x49\x33\x5d\x1c\xba\x37\x44\x2a\x74\x21\x78\x95\x55\xba\x20\xd2\xc7\xb0\x14\x22\x66\x27\x97\xb0\xde\x2f\x73\x90\x4f\x03\x6e\x86\xf7\xaa\x7c\x33\x55\x93\xbe\xdd\xdc\x33\xfc\x1a\x83\xc1\xf0\x4f\x0b\x2a\x62\x99\x48\x57\x3c\xc3\x93\x51\x9d\x70\xd7\x5b\x4f\x71\x38\xe2\xd1\x28\xe4\x60\x1a\x20\xc3\x09\xa7\xf9\xe2\x70\xe5\xa6\xe7\xbc\x7d\x8b\x9f\x2c\x7c\x74\xe6\x61\xaa\x35\x7d\x4f\x76\xe2\xb1\x0e\xdb\x7e\x79\x00\x75\x9d\xa0\x7c\x31\x00\xd2\xb7\x5b\xb1\xf5\xfc\x1c\xc0\x28\x93\x9f\xd9\xf3\x17\x5c\x31\xf9\x86\x65\xcd\x4d\xaf\xf6\xf6\xad\x6b\x77\x3b\x35\x6f\xf5\x6d\xa5\xf6\xb6\x6a\x43\x85\x16\x36\xc5\x1e\xeb\x97\xf9\xd3\x81\xa1\x32\xc5\x26\x75\x13\x07\xa3\x26\xb0\x6c\xba\x3b\xda\xd5\x9d\xf2\xaa\xb6\xaf\xe3\x40\x8a\x96\x14\x95\x23\x02\x17\xac\x8d\x7f\x2e\xfc\x96\x7e\xa9\x9e\xdb\xd9\x71\x11\x39\xdd\x41\x01\x8e\x9a\x9a\x54\xe7\x14\x38\xcb\x4e\xf5\xe1\x0a\x31\x32\x63\xa2\x36\xd8\x50\x90\xd6\x5d\xc8\xfe\xff\x9c\x70\x63\x35\xae\x45\xc5\xa3\xb0\x18\x03\x75\xe6\x82\x31\x89\x15\x93\xb2\xe8\xcf\x34\x94\xb4\x4a\xc5\xf3\xf3\xef\x75\xe2\xa7\x32\x65\x97\x2c\xe3\x70\xe0\x22\x32\xdb\x7f\x96\x57\xbd\x52\xb5\xe6\xc1\xce\x91\xa8\xf3\xee\x79\xbd\x2b\x0f\x62\x2f\x1e\x32\xab\x97\xd7\xf4\xc3\xdd\x3b\x22\xf4\x52\xb6\x82\x7b\x84\xfb\x78\xf5\x1c\x43\x04\xd9\x2f\xfe\x68\x14\xb9\xcb\x03\x3c\xc5\xba\x25\x6f\x5e\x4b\xde\x2b\x2d\xb1\xf7\x89\xe9\xd6\x44\x92\xa9\x9a\x74\xf3\x4d\xda\xdc\xa4\x0b\x69\x78\xda\xa4\x9d\x36\xb9\xc0\xda\x88\x02\x4b\x5a\x5b\x4f\xb4\x3e\x8c\xa5\xd1\xb5\xd7\xaf\x88\x13\x27\x10\xd9\x17\xf7\xb5\x9e\x32\x1a\x76\x9d\x9d\xbd\xd4\xc3\xa8\x9f\x85\x93\x35\x95\x75\x76\x66\x2f\x79\x15\x23\xce\xce\xe4\xd8\x6b\x35\x76\xc7\xaa\x97\x2e\x91\x76\x17\x08\xab\x16\x96\xf7\x87\x02\x16\x56\xab\x51\xf7\x17\x9a\x65\xf2\x94\x7a\xab\x9b\x0e\x06\xb7\x07\xc5\xed\xb5\x62\xfa\xfe\x81\xde\x69\x38\xe9\x7b\x75\x2a\x7f\xf9\xdc\x4a\x8d\x9f\x5d\x63\xb9\xc4\xd2\x38\xac\x3b\xd3\xef\xb0\xd0\x52\x53\x57\x58\x47\x56\xdd\xa4\xb7\xf8\xe3\xc6\xfc\xf0\x6b\x94\xeb\x9a\xc1\xaf\x13\xc7\x31\xee\x14\x20\x9a\xd6\x4a\xe0\x9c\x10\x69\xc5\xeb\x29\xe0\x8b\x96\xaf\x4b\x93\x43\x33\x2e\x53\xfc\x94\x01\xa0\x9b\x07\x5f\xf5\xbc\x36\xdd\x2d\x77\xba\x84\x02\x30\x53\x90\xaf\x74\xd0\x7d\xb5\x3f\x5d\xe9\xc1\x96\xa7\x9d\x3c\x40\x39\x62\xa1\xd0\x85\x7c\x78\x9e\x74\xf8\x8d\x02\x06\xfb\x44\x72\x69\xf5\xc6\x6e\xb1\xab\x15\x96\x8a\xdd\x38\x8d\x59\x98\xff\x98\x8b\x05\x17\x62\xf9\xb1\xa2\x89\x0d\xf4\x95\x73\x2d\x76\xa9\x84\x0d\x73\xc4\x05\x90\x8c\xb9\xe5\x07\xc8\xc6\xdc\xf2\xa3\x81\xc0\xfd\x39\x3e\xf4\x45\x48\x0d\x09\x75\xde\xdd\x54\xea\xc2\x16\x2d\x3d\x4e\x35\x14\xce\x6b\xe8\x01\x4e\xf1\x25\x86\x0e\xb3\xf6\xac\xc5\xd0\x0b\xa0\x2c\x5c\x98\x21\xef\xca\xa3\x8e\xab\xc3\x5d\x33\x82\x92\xe8\xed\x0f\x96\xa1\x4a\x29\x49\x8f\xca\x39\x97\x3b\xa7\x99\x58\x8a\x5c\xf7\x20\x1f\x5c\xff\xac\x34\xf0\xf4\x0d\x9c\x64\x62\x68\xb6\x8a\x06\xdf\x83\x3b\x60\x4d\x63\x45\x39\x25\xb1\x9e\x13\xc2\xb5\x46\x7d\xe0\x74\xa7\x94\xc2\x7a\x8e\x0f\xfd\x37\x98\x38\x4f\xb2\x18\x20\x91\x48\x33\x10\x9a\x03\xfb\xc8\x89\x18\x57\xda\xae\x3a\xe6\xe9\xa8\xd0\x37\x46\x94\xfd\xae\x53\x68\xef\xc5\x76\x83\x68\xc5\xe6\x06\x93\xad\xf7\x56\xea\xab\x41\xd5\x00\x6b\xe3\xdf\x13\xb9\xba\xc1\x42\x6e\x3c\xee\x11\x4a\x2a\xbb\xbf\x9c\xff\x97\xb6\x37\x6d\x6a\x1c\x59\xf6\x87\xdf\xf7\xa7\x18\x9e\xe0\x4f\x58\x83\xd0\x40\x9f\xd3\x77\xce\xb5\x5b\xed\x60\xdf\xf7\xc5\x34\x0e\xc7\x09\xed\x36\x16\xb6\xf1\x02\x18\xf0\x77\x7f\xf2\x97\x59\x25\x95\x6c\xc3\xf4\xdc\x7b\x6e\x04\x58\xb5\xef\x95\x95\x95\x95\xcb\x97\x85\x55\x72\xb4\xee\x3d\x77\x50\x19\xb8\x57\x17\x25\x98\xd8\xfa\x85\xb7\x88\x94\x9f\x21\x78\xe1\x39\xa7\x47\xfc\x00\x1b\x3b\x2f\xf7\xf2\xae\x2d\xba\xb7\x3c\x21\x7b\x2c\x2f\x8f\xb4\x02\x2e\x84\x8c\x18\xf6\x0c\xe8\x6b\x29\x5e\x8c\x0e\xfb\xf8\xa5\x72\x43\x7b\xd6\xc0\xc8\xe1\xec\xfe\xe9\xbe\xd2\x67\xef\x4f\x77\xa3\xd2\xa3\x89\x79\x82\x64\xb4\x38\x36\xf0\xcc\x20\x20\x13\xdd\xa0\x05\x9c\xaf\xdf\x6e\x26\x82\xe1\x65\x6a\x6d\xa7\x18\x7c\x7a\xf7\x8a\xc1\x07\x6a\xdd\x2b\x9d\x7b\xda\x45\xc5\x25\x90\xad\xc1\x94\xe2\x6a\xda\x8a\xba\xad\x9d\xbe\xac\x1c\x2d\x59\xe4\x3b\x57\x11\x43\xdd\x28\x66\x79\x97\x1f\x91\x25\x6b\x35\xa4\x4b\x22\x62\xe2\xdc\xb2\xa9\x9d\x69\x84\x2c\x30\xc0\xd3\x52\x80\x02\x43\x42\x00\x6b\xc2\x67\x92\x5d\x69\x44\x78\x63\x0f\xcc\xd5\x6d\x0d\x3f\x58\x1c\xb4\xd4\xfe\xdd\x87\x4e\xe5\xef\xa8\x5e\x9c\x34\xf5\x89\xab\x14\xb4\xd2\x00\x41\x66\x08\x60\xd1\xca\xb9\x0d\x42\xf0\xe2\x69\xdd\x3d\x49\xa1\x19\xea\x8a\xb7\xb4\x14\x7f\x0f\x19\x7f\x08\x55\x4a\x70\xcc\x71\xeb\x12\x97\x6b\x06\xd5\x9e\xa5\x19\xad\xb7\x90\x5b\x4b\xd8\x49\xa4\xb0\xbe\x49\x4f\x7a\x40\xe9\x97\xd7\x4c\x10\xd8\x13\xf2\x65\x87\x80\xee\xd7\x4a\x47\xaa\xed\xc8\x12\xcf\xb2\x74\x32\xca\x47\x0f\x4a\x1d\x3b\xaa\x48\xb3\x8c\xd9\x0a\x27\x7a\x74\xbe\xf4\xac\x79\xf1\x74\x33\xa2\xdb\xb1\xdd\xa3\x5b\xa6\x8e\xeb\x00\x6f\x00\x25\x2a\x87\x5f\xb5\x29\x02\x37\xde\x5d\xe5\x81\x4a\x1f\xc2\x9a\x75\xba\xaa\xae\x1a\xe0\x26\x5d\x6c\x54\x43\xe7\x7a\xaf\xa4\x3c\x42\xaa\x84\xe2\xc0\x88\x30\x0d\x03\xec\xd5\x72\xec\xd6\x80\x74\x5a\xd8\x20\x80\xbe\x07\xba\x03\x7b\x39\x84\x53\xbc\xc1\xc2\xad\x25\x6c\xc1\x6d\xe5\xde\x15\x06\xda\x13\xc5\x16\xc7\x8a\x6a\x43\xd1\xad\xad\x71\x00\x1f\x1c\xfc\x27\xc2\x1e\x7d\x95\x54\xd7\x5c\xb7\x53\x2d\x85\xdf\xe9\x6a\x14\x31\x43\xdd\xf5\xb9\xe6\xb4\x83\x71\xdb\x04\x14\xff\x32\xad\xda\xb9\xf1\x74\xf6\x02\xb3\x2e\x7f\x52\x48\x40\x83\x1a\x62\x71\x7e\x50\x48\x48\xf1\x01\xe2\x8d\x4d\xda\x9f\x62\xbc\x80\x7c\x95\xef\x1c\x86\xe6\x43\x06\x8d\x56\x54\x33\x58\x99\x09\x74\x43\x73\x39\xa5\xaa\x6b\xed\xf5\xfb\x3d\x4f\x60\x30\x67\x0f\xa2\xcf\xb2\xd3\x61\xc0\xd9\x83\x28\xcb\xbe\xa7\xb2\xe7\x53\x35\x98\xdb\xae\xbf\x5d\x70\xff\x71\xba\xe0\xc8\x58\x03\xac\x56\x7d\x69\x29\x78\xa1\xa1\x03\x8b\x11\x6b\x64\xbf\xa5\x71\xc2\x1a\xa4\x61\xaa\xa1\x61\xee\x2c\x3b\x49\xa0\xef\x03\x00\x39\xeb\x5e\xb6\x32\x9d\x5d\xbe\x79\x94\x42\xf7\xf2\x02\x54\x9b\xaa\xe7\x3c\x3f\x2c\xb8\x03\xba\x26\x6a\xae\xcc\x40\xad\xa8\x40\x2d\x9b\x40\x33\x9b\x2b\xfe\xcc\xfa\x45\x00\x5b\x6a\x72\x81\x81\x62\x49\xa8\x56\xa7\x5e\x7c\xd2\x0a\xb9\x8d\x48\x45\x0a\x2e\xd1\x69\xa2\x21\xe2\x3a\x6b\xf8\x43\xd3\x8a\x71\x91\xb4\x91\x21\x58\x34\x9d\x2d\x54\x2c\xe5\x74\x8f\x8c\x33\x66\x50\x6e\x77\xc4\xac\xf5\x21\x7d\xd1\xea\x08\x1c\xf3\x21\x21\xdb\x0c\x57\x13\x10\xb4\x02\x5a\x16\x9a\xf8\xd3\xf4\x08\xe8\x65\x5a\x99\x13\xe8\x7a\xce\xec\x11\x2c\xd0\xf5\xb7\x84\xc4\x14\x88\x71\xaf\x1a\x6e\xbc\x44\xd1\xfd\x55\x43\x64\x6a\xa8\x19\xb9\x0a\xd3\x96\xa0\xef\x53\xf8\x69\xcb\x8c\xb2\x10\xc1\x4a\x0f\xdf\xdf\x3b\x0c\xae\xd3\xa5\xa5\x3d\xec\x9e\x94\xae\x8f\x1d\xe5\xee\x68\xe8\xbd\xb0\x56\x49\xab\xb4\x99\xb4\x59\x85\x14\x7b\xba\xc3\xac\xad\xda\x66\x59\x2a\x7b\x9b\x0d\x99\xd0\xb6\x6a\xbb\xa9\xec\x7b\x0e\xe7\x80\x8e\x04\x48\x12\xd4\x2d\xac\xa4\x3c\x32\x6d\xeb\x7b\xf8\xfe\xae\x03\xc0\xd6\x9b\x52\x48\x56\xfb\x44\xab\x80\x51\xd3\xbc\xff\x57\x8b\xed\xd7\xd6\x10\x9f\x80\xeb\xd0\xf3\x12\xe5\xd3\xc8\xd3\x1d\xcd\x4c\xb7\x5a\x3a\x6a\x4a\x42\x5e\x7d\x91\x31\x3e\xe1\xbc\xd9\x8f\xcd\xd9\x8f\xf5\xed\x88\x8e\x23\x4c\x14\x70\x59\x10\x00\xf6\x52\x16\x5f\xa3\x95\x0f\xcd\xc3\xad\x9d\x2a\xcf\x62\x6b\x47\x60\xb3\x4e\x10\xd0\x4a\x5f\x2b\x97\x72\x59\x90\x24\x1a\x42\xe6\xa8\x64\x15\x53\xf0\x08\x65\x7b\xf8\x71\x1e\xb7\x58\x8a\x63\x52\xb8\x63\x23\xf7\xcd\x83\xe5\x84\x94\xce\x78\xc2\xb6\x2f\x5b\xaf\x11\xf9\x7a\x0f\x76\x1a\xd0\xf7\xf6\x09\xaa\xb5\xe2\x2e\x15\x5e\x0f\xfb\x9e\xdd\xdb\x6a\xd8\xac\x36\x2e\xe0\xa0\xc5\x47\xcf\xbe\x7c\xf4\x58\xb8\xad\x06\xde\xe0\xba\x47\x89\x62\xa8\x58\x39\xc5\xc2\x38\xe6\x30\x9f\xc2\x12\x84\x7d\xc3\x4a\x5c\xe4\xb0\x80\xc2\x9a\x08\xbb\xb9\xb2\xcf\x77\xc1\x65\x36\xcb\xbd\x9c\xd9\xfa\xaf\xc3\x04\x22\x5d\x2f\xc0\xb3\x36\x6a\x4f\xb1\x2b\xf3\x68\x1c\x1d\x01\x12\x41\x63\x4f\x87\x6d\xfa\xc3\x0c\xe3\xe0\x84\x9d\x90\x56\x01\xdf\x54\x26\xad\xa3\xd4\x1a\xbd\xbf\xf7\xd8\xba\x9c\xe0\x9d\x9a\x9b\x2b\xc4\xe3\x67\x80\xc3\x70\x80\x17\x23\xc5\x2d\xbf\x2c\x2c\xf4\x95\x48\x98\xbf\x47\xae\x7a\x1a\x1d\x11\xbc\x74\xae\x03\xf7\x50\xdf\x80\x47\xf6\xb9\x7d\x6a\xd3\xcd\x45\xd6\x21\x8e\x33\x65\x3a\x03\x6c\x27\x84\x09\x4e\x15\x20\x1a\xa6\xb8\x8c\xa3\xbc\x0c\xbc\xf4\xe3\xe8\xc9\x30\xf5\x9e\xab\x95\x12\x0c\xa0\x06\x80\xc6\xef\x86\x46\x3e\xc2\xf8\x41\x0f\xc8\x48\x05\x5e\x51\xe0\x97\x8b\x47\x84\xae\x81\x13\xee\x3e\x86\x59\xbc\xfa\xdd\xa3\x4c\x1c\x14\x19\x80\x95\x8e\xa7\xee\x3a\x9b\xba\x0d\xa8\x3f\xa0\x90\xda\xa3\x9a\xba\x1e\x26\x6f\x4b\x4d\xde\xed\xa3\x9a\xbc\xb5\xaf\xe0\x18\x91\xd9\xfb\xf9\x38\x6f\xf6\xa6\x85\xf5\xb1\x61\x32\x8a\x9f\xb8\x36\xb6\xf2\xab\x80\x76\x69\xfd\x35\x81\x28\x57\xda\x7f\x80\xc8\x0e\x77\x28\x58\x1e\x3e\x79\x78\xff\x8e\xb5\x7f\xe7\x91\x99\xfc\x12\xd5\xb5\x60\xf9\xe2\x80\x9a\xfb\x64\x55\x7e\x12\xf8\xb4\xaf\x6f\x4a\x09\xd4\xce\xc8\xf3\x98\x26\xb6\x73\x77\x83\xe5\x0d\xb4\x17\xa4\x4f\xe9\x6e\xb0\x1c\xaf\x83\xa7\x62\x03\x6b\xf2\x58\x42\x92\x75\xe6\x8b\x49\xa1\xf5\x21\x95\x52\x2a\x8b\xaa\xe2\x26\xfa\x7a\xa2\x0d\x41\xe1\x15\x3b\xbb\x2c\x04\xb9\xb5\x70\x84\x05\x99\xc0\xaf\xf8\x9c\x1b\xe9\xdf\x81\xaf\x02\xa0\x13\x56\xaf\xda\x40\x56\xed\x09\xf4\x82\xba\x07\xbe\x73\x63\x0f\x02\x17\x03\xe8\x6c\x26\x38\x13\x95\x3a\xde\x72\x54\xa5\x7d\x79\xbe\x0e\xe5\xb2\x07\x8a\x28\xb9\xb4\x44\xe9\xb4\xc7\xaa\x7e\xd1\x4e\xc9\x30\x08\xb0\xd0\x0f\x20\x53\x37\x00\x7e\xa3\x16\x7a\xa0\x18\x8e\xa2\xd0\xad\x3b\x6b\xb6\xf3\xd5\x76\xfe\xd1\xb0\x9f\x63\x77\xef\x81\x12\x5b\x76\xbf\x0d\x97\x22\x9d\x1d\x6d\xcb\x8b\x82\xfd\xd0\x64\x86\xaf\xd0\x1e\xb5\x4a\xc7\x0f\x94\xdc\xe2\x12\xb2\xb0\x13\x15\x46\xe5\xec\x3c\x94\x4e\x1f\x4a\xfd\x36\x1b\x61\x7b\x8e\x1b\x94\x97\x92\xe2\xf5\x81\xa6\x68\x10\x20\x9d\x5c\x82\xd0\x94\xca\x79\x40\xdb\x54\xf6\x84\x1a\x2c\x73\x37\x75\x22\xbe\x41\x52\xa7\xd5\x7e\x72\xae\x42\x73\x67\x71\x6e\x1a\x30\xba\x9f\x74\x68\x83\x45\x10\x01\x46\x91\xd8\xee\xd3\x85\x1e\x19\x85\xaa\x24\xd8\x95\x16\xf3\x43\x82\xf3\xa0\x46\xd3\x31\x43\xf4\x9c\xa6\x6d\xfa\x0e\x4b\xfa\xf3\x13\x20\xb4\xc8\xa1\x18\x48\xb2\x0c\x4e\x60\x14\xc8\xd4\xd7\xae\xf0\x1c\xba\xd8\x14\x32\x5d\x45\x2f\x43\x26\x95\xe4\x9c\x62\x60\x94\x8c\xa6\xf8\xb0\x23\xb1\x2a\xd1\x5e\x5e\x03\x83\xc9\x77\xf7\x1c\x12\x5f\x29\x34\xa2\xb1\xa2\xde\x36\xe8\xe6\xa9\x92\xac\x61\x92\x0a\xc2\xec\xe8\x5f\xe5\x4e\x55\xb8\xdd\xed\x7e\xf7\x79\x5f\xd4\x82\x4f\x0a\x26\x3a\x4e\x1e\xbd\xe5\xf6\xf2\x15\x6d\x32\x5a\xcf\x81\x85\x8d\x58\x15\x59\x51\xd1\xb7\x59\x8e\x31\x23\xec\xcc\xec\xb6\xc6\xe6\x81\x72\x78\x3c\x63\x15\xc8\x66\x4a\x02\xdd\xa7\xb3\x6b\x73\xbd\xfe\x5f\xff\xb4\xf9\xaf\x61\xd7\xd7\xbe\xfe\xcb\x56\xff\xe4\xfb\xfa\xed\x9b\xad\xfe\x1b\x0d\xc5\xb0\x46\x6b\x14\x58\x1c\xee\xf3\x01\xab\x9b\x12\x65\x62\xf6\x16\x5f\xbc\xf9\x62\x7a\xe2\x2a\xa3\x81\x3e\x90\x08\x9f\x8f\x58\xb6\xbb\x09\xbb\x83\x50\x06\xb6\xe5\x4a\xe0\x85\xbb\x21\x56\x76\x91\x50\x19\x2e\x54\xdc\xf7\xcc\x86\xe6\x42\xaa\xec\x45\x65\x18\x2b\x4d\xd4\xc7\x2b\x1d\xfb\xc6\xbd\x84\xb2\x67\x72\xb1\xf5\xf1\x03\x58\x47\x77\x3b\xcb\x6d\x60\x05\xbf\x1f\x78\x95\xe3\x95\x3d\xef\x7b\x76\xcf\x59\x5a\x3a\x5e\xd6\x7e\x9c\xf0\x34\x21\x54\xcc\x32\x14\xe7\xd2\x47\x65\x43\x79\x9d\x4c\x1d\xd8\xda\xf7\x03\x66\x06\x70\x2f\xa8\xf6\x1b\x4a\x27\xdc\xe4\x2e\x53\xa4\x5b\x40\x15\x53\x0f\x75\x42\x8e\xb1\x74\x83\x09\x0d\x94\xd2\xf5\x3d\x88\x6d\xfe\x40\x5f\xaa\x25\x98\x2c\x05\xee\xe5\xae\x1f\x58\xc0\x06\x3a\xe4\x6c\x6d\xb3\x16\xae\xc5\x6b\x10\xcd\x52\xcf\x8f\x52\x65\x38\xe9\x06\x52\x57\x6d\x48\x5b\x4d\x9b\x5f\xda\xcb\x0d\x8c\xdf\x4c\x58\x14\xab\xa3\x24\xb1\x8a\x86\x93\x02\xfb\xcb\xb1\xb6\x9a\x64\xab\xe7\xd1\x9b\x7a\x2d\x60\x69\xaf\x56\x97\xf5\xb0\x41\xb1\xb2\xb6\x74\x20\xfc\x50\x34\x5c\x19\x43\x14\x3a\xd8\x81\xa5\x6a\xd5\x31\xbe\x39\x50\xe7\xa8\xa7\x6f\x13\xa8\xcd\x56\x35\x6d\xd8\x97\x16\xe0\x1b\x8f\xd5\x9e\x47\xf8\x98\xbb\xd5\xa5\x5b\xf0\x76\xd7\x92\x65\x80\x03\xe5\x84\x50\xaf\x51\x06\x4f\xf7\xf0\xe0\x0b\x70\x2a\x50\x87\xe0\xc4\x93\xc5\x65\xc4\x2c\x63\x0b\xed\x08\xa7\xd8\xf1\x79\x41\xaf\x98\x80\xc8\x49\x03\xf7\x1c\xec\x14\x0c\x0c\x08\x68\x0c\xcb\x1a\x3c\x4a\xf3\x22\x20\x73\x00\x67\x54\x24\x15\x77\x02\xb8\xc8\xe2\xa5\x1d\x10\xad\x87\x43\x40\xc4\xc7\x56\xe9\xab\x55\xfd\x4a\x43\xfa\x12\x1b\x1e\x6a\x4d\xbf\x0d\x48\x47\x50\xcf\x3e\x7b\xb4\x17\x51\x88\xe3\x05\x25\xab\x72\xf6\xe8\x9e\xc3\x34\xe8\x77\x77\x31\xa6\xcf\xd2\xd2\x39\xcc\x83\xb2\x6f\x5d\x0c\x20\x2c\xc2\x8a\x84\xdd\xbc\xc7\x68\xd2\x55\x6b\x31\x26\xe8\x46\x67\x10\xe4\x84\xdd\x88\x15\xaa\x3c\xa3\x6b\x8b\x07\x16\x7d\x79\x95\x1f\xf8\xf5\x2d\xc8\x9c\x81\x58\xf8\xc2\x55\x01\x5f\x79\x89\xa9\x5e\xe7\x30\x80\xb9\x35\x72\x1c\x04\xb4\x5a\xb2\x87\x11\x2e\xe2\x74\x60\x71\xf7\xb0\x49\x50\x48\xbf\xb1\xf2\xd0\xe4\x22\x8a\xc5\x8e\x2d\xfb\x8b\x14\x45\x4b\x43\x8a\x6a\x6d\x4b\x51\x33\x8a\x39\xb0\x9a\x7e\xf3\xd3\x6e\xd0\xfe\xad\xd7\x1d\xb4\xb4\x75\x1f\xe0\xd1\x67\x8f\xef\xef\xdc\xf7\x1f\x59\x5d\x14\x2c\xfd\x3f\xe0\x2d\xcc\xea\x26\x43\xc8\x5e\xd2\xe1\xc1\xc3\x67\xeb\xa4\x36\xa7\xf8\x43\x92\x2f\x7f\xa5\x29\xa6\x11\x8a\x42\x67\x9f\x12\x39\x43\x75\xb4\x9d\xde\xd3\x41\x87\xa1\x6a\x6e\xc2\xf4\x41\x46\xd4\xe7\xbc\x3f\x22\x16\xf8\xfd\xe3\x1f\x16\x27\xe3\x11\xbe\x89\x1a\x73\xbb\xab\x3b\x69\xeb\xb2\x84\x87\x55\xaf\x4c\xcd\x59\x4c\xb1\xfb\x4a\x2b\x6e\xf3\x5e\xdb\x63\xa4\x0e\xd0\x1a\x5a\xc5\x72\xe1\xc0\x4a\x14\x7e\xef\xb7\xe9\x97\x36\x03\x32\x30\x57\x1e\x2d\xf7\xd6\xa1\xa7\xed\x69\x53\x6b\xd4\x96\x3c\xc8\xed\x08\x53\xe6\x08\x12\xbf\x84\xf0\x05\xcb\x2e\xf7\x5b\xc6\xfc\x83\x42\xb2\x6d\xcd\x63\x2c\x65\x0c\x02\xca\x8f\x01\xd9\xf5\x69\x4f\x6e\xf3\x6a\x52\x5b\xed\x39\xa6\x9e\xe3\x99\x3b\x5a\x5a\x3a\xbd\xa7\x2d\x41\xa9\x42\xba\x09\x30\x5d\xdd\x16\xda\xfb\x17\x4d\x7c\x3f\xbd\x9f\x58\x95\x03\x11\x74\xbc\xa7\x2a\x17\x21\x02\x0c\xc9\xb6\xf7\xf7\x05\xb0\x64\x2c\x1c\xf8\xef\xef\x04\xdb\x7c\x96\x91\x7d\x7f\x27\x47\x73\xd3\xd2\xaf\xb5\x71\x6e\xa1\x89\xf6\x34\x5b\xdf\xaf\xa0\x9f\x3f\x6e\x3c\x06\x67\xbb\x91\xf3\xe2\x6e\x10\x30\x90\xd5\x4a\x20\x8d\x43\x4e\x00\xe3\x24\x90\xe0\xdc\x94\xf9\xa6\x2c\xc5\xf2\x09\xac\xed\x7e\xcd\x12\xda\x52\x05\xcd\x1d\x25\x19\x53\x12\x35\xa9\x6a\x35\x70\xbe\x8b\xac\x2e\x3b\x6b\x10\x2f\x13\x3c\x45\x4b\x97\x16\x54\x17\xde\x58\x43\xcc\x81\xd2\x8a\xe9\x25\x58\x57\xbc\x16\xe6\xf6\x8d\xcb\xac\xe4\x9d\x2c\x34\x79\xa6\x85\x13\xda\xde\x38\x2c\xf8\x2e\xae\xc0\x5d\x1b\xdf\xc3\x47\x37\xc5\x6c\xed\xc1\xa4\x00\xc7\x60\x11\xae\xc1\x41\xeb\x6d\x7a\xbe\x6f\x0c\x30\xce\x42\xe2\xd0\x78\x2f\x33\x4e\x00\xf7\xc6\x89\xfe\x55\x11\xa0\x2d\x18\xe9\x0d\x0e\x20\x4a\xa0\xcd\xea\xdc\xd0\x9f\xa3\x51\x05\x4b\xa9\xc4\xd9\xa3\x5b\xc7\x97\xcb\x15\x97\x8f\xb0\xc9\xa4\xe3\x7a\x49\x75\xb5\xfc\xe0\x55\x3c\xf7\xa2\x59\x81\xde\x5a\xb6\x91\xc0\x47\xd9\xaa\xed\x11\xa0\x85\xa4\xb6\x3e\x6d\xe9\xe6\xa0\xa4\x8e\xf9\xe2\xa4\x25\x8f\xd5\x0b\xca\xee\x37\xb0\x95\x6e\x50\x17\xb6\x74\x17\x3a\xb6\x61\x0d\xac\xac\x95\x33\xf6\x26\x72\x90\x0d\xca\x81\xed\x8f\xa0\x2a\xa2\x7c\x5c\x3d\x56\x7c\x95\x86\xb1\xfe\xe3\x39\xc6\xfa\x71\xbe\xe3\xfd\x6e\xcc\x46\x5f\xa8\x13\x84\x84\x19\x28\x97\xa1\x24\x3c\x63\x70\xec\xb0\xea\x6f\xb1\xb4\x8f\x33\x1d\xa0\x9e\x4f\x02\x5c\x2b\x4f\x44\xde\x14\x36\x87\x72\xbd\xba\xea\x61\x5a\x48\xc4\xa9\xdb\xe1\x42\x7d\x5d\x68\x8f\x06\x24\x6d\x64\xe6\xd9\x09\x3d\x72\x12\xe8\x78\x06\x42\x51\x49\x84\xe3\x21\x59\x49\x81\x9a\x24\x26\x52\x51\x4a\x72\x52\x2a\x28\xbe\xc9\x72\x5a\x69\xff\x30\xb1\x8c\xb6\x41\x5f\x4d\xdc\xf6\x4a\x9a\x59\x94\xc9\x69\xb0\x46\x9a\xac\xd7\x03\xa9\xb4\x94\x2c\xb7\x2d\x98\xaa\x1c\x81\xaa\x4d\x97\xc4\x4c\x03\xfe\x07\x03\xe2\xcb\x47\xf0\x89\x8e\x48\x71\x0b\x3e\x31\x02\xf4\xd2\xb3\x88\xfe\xc9\x3a\xec\xb1\x90\xbc\xe0\x14\xb4\xc9\xc4\xa0\xb9\x29\xd2\x4d\xc8\xc4\xd7\x3f\x57\x27\xc0\xfd\xa6\xd7\xe7\x2b\xf3\x5f\xea\xd5\xf9\x6a\x77\xcc\xc5\xf9\xe5\x49\xe9\x48\x1c\x2d\xcb\xb4\x4e\x0a\x8b\x2a\xa6\xe6\x24\xba\x39\xed\x95\xa4\xb0\xac\x2e\x9a\x6a\x5d\x45\xd9\xba\x7a\xd2\xeb\x4a\xd6\x54\xb6\xa4\x36\x66\x38\xc7\x85\x35\x3c\x74\x8f\x35\xb3\x72\xe0\xb4\x97\x96\x60\x58\xa7\x48\x8c\xc8\x19\x3e\x3d\xe7\xc6\x0d\xe5\xbd\x29\x63\x14\xdc\xfd\x93\x23\xfc\x01\xc7\xec\xfe\x99\x73\x66\x3a\x7b\x12\x15\x48\xd4\xde\x9f\x20\xa8\xa2\x96\xa7\x98\xb5\x82\xc1\xa1\x80\xab\x78\x94\xbe\x44\xba\x05\x9c\x40\x00\xda\x20\xd9\xf6\x3e\x63\xb1\x37\xd8\xe5\xa7\xb8\xe5\x4f\x66\xde\x4f\xb3\xfe\x47\x20\xcd\x87\x51\x1a\x0d\xa3\xdf\x22\x25\xff\x45\x17\xca\xb5\xef\xd9\x3d\x0b\x70\x92\xd7\x26\x7f\x94\x1d\x7d\x96\x12\xf3\x1b\x4e\xf0\xbc\xe0\x9e\xeb\x8b\x94\x0a\xe1\xb7\x3c\x5f\x7c\xa7\x47\xd4\xcf\xbb\x6b\xbc\xe3\xa9\x5b\x99\x4f\x7b\x8e\xce\x1f\x68\x87\x55\xe5\x62\xa0\x9b\x1e\x27\x51\x56\xb2\x75\x0a\xe8\xc1\xa1\xb1\xd9\x69\x61\x65\x04\x56\xf1\x75\x57\xd1\x20\x16\xa0\x5d\x5a\xf7\x26\x26\xb7\x5c\x93\x15\x47\x54\xc8\x41\xf5\x17\x6c\xa6\xb7\x49\x25\x71\x7a\x3b\xae\x47\x1f\x34\x05\x40\x83\x35\x20\x13\xd6\x0d\xee\xb7\x55\x42\x76\x41\x67\xa8\x83\xc0\xc9\x06\x43\x56\x69\xfb\x2a\x16\xa1\xa0\x82\x7a\xdc\x64\x82\x4f\x76\xa1\x52\xef\xc1\xf9\xa5\x05\x32\xf3\xa8\x90\x3b\xa6\x5d\x53\x29\x05\x8e\xe6\x00\xd4\x9a\x7e\x8e\xf6\x74\xa3\x33\x6e\x0b\x45\x64\xc1\x75\x6e\x22\x44\xb3\x37\x51\x8a\x4f\xa3\xf3\xb8\x53\x51\xa3\xe4\x16\x2e\x9e\x5f\x56\x19\xf6\xb4\xa7\x84\xf4\x28\x63\xca\x94\x8a\x44\x8c\xe2\x2c\x2d\xa5\xce\x0d\xff\x38\x71\xdf\x10\x86\x90\x00\x2d\x00\xa1\x75\x43\x2a\x76\x71\x88\x2d\xd1\x50\x56\xc2\x12\x84\xf0\x4a\x6d\xe8\x89\x5c\x58\xb5\x83\x52\xcf\x46\x54\xbd\x2d\xbd\x82\xd6\x71\x66\xed\xb4\xda\x6c\x28\x22\x86\xc6\xef\x97\xfb\xf7\x77\x68\xb7\x37\xa3\xc5\xaf\x07\xe1\x58\x6f\xd1\x59\x31\xb1\xbb\xfd\xb2\x1a\x93\x5b\xec\xb2\xa1\xc7\x0f\x14\x72\x0e\xdf\x6e\x99\x71\x5b\x85\xb8\xcb\x5d\x33\x6e\xa7\x10\xb7\x51\xc8\xb7\x59\x88\xdb\x3c\x30\xe3\xf6\x0a\x71\xc1\xb6\x19\xb7\x5d\x88\x1b\x14\xca\xdc\x50\x71\x13\x43\x5b\xee\xa4\x86\xe6\xbb\xf3\x9e\x78\x09\xda\x19\xbc\x02\x78\xb9\x03\xfa\x3f\x2e\x1b\xdc\x02\x1c\x38\x56\xc6\xa2\xb7\x66\xca\x31\xa8\xe5\x8f\x7d\x6d\x24\xba\x58\x5c\xe4\xce\x16\x67\xc7\x30\x92\xa1\x74\xcf\x9d\x62\xcb\x9e\x3f\xda\x50\x1b\x8d\xfd\x80\xd0\xed\x66\x35\x70\xae\x5e\xeb\x08\x83\x20\x2b\x05\xfb\x27\x95\xb8\x68\xed\x2c\x86\xd2\xd4\xc0\x19\x3f\x68\x66\xe3\xc0\xe9\x47\x00\x78\x6e\x7f\x8f\xc0\x99\x73\xb5\x4d\x65\x82\x0d\xbe\x92\x75\x37\x64\x1d\x1f\x22\x96\x1d\xdb\x7d\x2f\x6c\x8d\x80\x19\xdc\x9f\x95\x83\x09\x74\xe6\xed\x7c\xd0\xc3\x58\x3f\x84\x43\x5c\xce\x07\x7b\x87\x0f\x1e\x08\x82\x39\x71\xdf\x4d\x6a\x99\xf5\x5a\x2b\xe7\xb8\xa3\xd2\x36\x3f\x28\xad\x99\x67\xc0\xf6\x6c\xd3\x4f\x33\xcd\xb3\x56\xdf\x60\xcb\x3f\xe0\x23\x38\x8d\x62\xd8\x2d\xa6\x6d\xff\xcc\x5a\xa2\x19\x2f\x6f\x46\xad\xa4\x89\xe0\xf5\x86\x1d\xf7\xcb\x66\xfd\x13\xad\xc7\xaf\x86\x85\xf2\x0b\xb5\x27\xf7\xe0\xb9\x6c\xde\xb3\x88\x49\x31\x2a\x46\x54\xfd\xf5\x55\x1e\x59\x16\x02\x96\xfb\x30\xf5\x30\xf7\x40\x3c\x25\xd4\xe3\x0e\xdf\x90\xaf\x80\x68\xdf\x0a\xff\xfe\xbf\xaf\xd5\x7f\x94\x09\x65\x03\x6e\xa2\x39\x19\xa3\x7b\x6f\x5a\x60\xb9\xd2\xe9\x88\x66\x90\xc8\x8d\x9c\x13\xff\x8f\xaf\xf6\x25\x38\x7b\xd0\xb7\x95\xaf\xbf\x47\x96\xdd\x13\x6f\x5f\x79\xef\xc4\x4b\x75\xc1\xee\x22\xc3\x36\x97\xf0\x5b\xce\x24\x48\x12\x0f\x0b\x70\xc5\x9e\x19\xd6\x87\xaa\xec\x6c\x25\xc0\xe6\x31\xcd\x3b\xd3\xdd\x42\x59\xdc\x7b\x9f\x2d\xee\x4c\xfe\x5c\xc8\x4c\x98\x34\xe6\x4c\x1d\xb6\x21\x45\x15\x40\x8a\x2a\x70\xb6\xc9\x9f\x73\x46\x68\x8d\x75\xda\xbc\xbc\xef\x74\xfa\x0d\xe7\x96\x39\xe6\xd2\x67\x3b\x11\xf4\x36\x5a\xe1\x07\xec\xdf\x63\xe0\x52\xea\x16\x19\x2d\x1b\x61\x6d\x79\x46\xe0\x15\x42\x33\xd4\x52\x33\x94\xd8\x2a\x78\xd8\x06\x11\xd5\x08\x67\xbb\x14\xda\x8b\x07\x00\x36\x4f\x54\x31\xcd\xf3\x1e\x0c\x3c\x10\xfc\x35\xb6\xe4\x3b\xfe\x7f\xb1\x1a\x8c\x99\xc2\x7d\x58\x74\x6f\xcb\xa1\x68\x89\xed\x9d\x48\x7d\xb3\x47\xa8\xb7\x8b\xc7\xf2\xc5\x11\xad\x00\xc2\x96\x43\xc2\x95\x63\xfa\xc6\xd8\xe3\xdd\xd1\x90\xc7\xb7\x3d\xb3\x46\x4d\x3a\x60\xb3\x36\x8b\x78\x67\xea\x5a\x68\xd8\x7d\x1e\x76\xd0\xbc\xc7\xa7\x8a\x9f\x3a\x64\x5d\x62\x34\xee\x09\x6b\x3e\xcc\xc6\x9d\x2d\x3b\x8e\x9f\x7f\x40\x56\xf7\x5f\x60\x7f\xee\xf4\x7f\xd0\x09\x27\xf6\xf2\xe9\xba\xa1\xd5\xd4\x9a\x4b\x38\xd6\x56\xfd\xd1\x61\x3c\xab\xe2\x1b\x31\xf3\xbf\xac\x9c\x99\x88\xc4\x2d\x45\xa6\x26\x19\xab\x0a\x45\x31\x09\xe6\xb4\xa0\x2b\x06\xca\x51\xca\x52\x38\x08\xe4\xbf\x97\xc2\x15\xdc\x95\x61\xc9\x24\x79\x7f\xe7\x89\x8e\x97\x13\xeb\x3b\xbb\xa0\xf4\x26\x0b\xfa\x21\x2e\x0b\xe6\xef\xb3\x40\xec\x4e\x49\x69\x95\xe3\x65\x37\x51\xcf\x12\x99\x11\x2d\xc2\x50\x6d\xe7\x1f\x78\xd3\x38\xcd\xd0\x4b\x17\x6c\x5c\x2d\xaf\xda\x2e\xaf\x59\xbf\xfb\x8e\x77\xf6\xc7\x57\x1a\xc9\x52\x54\x6d\xd6\xc7\x7e\xa3\x8c\xf2\x2c\xba\x3e\x70\x52\x2e\x3c\x59\x0e\xc0\x6a\xd8\x92\x39\x89\xc1\x1f\xc6\x6e\x66\x47\xd6\xb6\xc7\x69\xae\xd5\x1c\xdb\x19\x7f\x1a\xed\x9f\x8d\x99\xfd\x33\x9f\x45\x4e\x70\xd5\xaa\x47\x28\xb4\xb1\x51\xf4\x06\xa3\xa5\xfc\xac\x54\x5a\x86\x6a\x62\x81\x5b\xcd\x07\xbf\x78\x53\x2c\xc6\x8c\xfe\xcb\x86\x86\xa0\xa7\xff\x62\x7d\xa0\x53\x91\xcf\x12\xf9\xc2\x8b\x7a\x3a\x72\x2c\x91\xaf\x88\x4c\xa7\x23\xd7\x25\x72\x03\x91\x9d\x79\xf0\x1e\x47\x0b\xb3\xf4\x61\x07\x6c\xdd\x94\x31\x40\xdb\xf8\x8c\xed\x9d\x9b\x72\x42\xbe\x5d\x7c\xc6\xf6\xf0\xb8\xdc\x26\xdf\x08\x9f\xb1\xfd\x74\x5c\x4e\xc9\xf7\x8c\xcf\x18\xdb\xa4\x53\xd8\x1b\x49\xcd\xe0\x9a\x5e\x08\x9c\x9b\x9d\x5c\x9b\xae\x66\x80\x85\x19\x63\x73\xa7\x08\xa8\xe5\xdd\x92\xed\x87\xc8\xd8\x0f\x61\xb6\x1f\xc2\xe2\x7e\x30\x70\xba\x38\x5b\x43\x6c\xb1\x89\x06\x6b\xd5\x4e\xc1\x09\x45\x2d\x60\xde\xe5\xfc\x76\xe7\x63\x5b\xa4\xce\x66\xdb\x83\x44\xa9\xf2\x6d\xb5\xf9\x89\xb1\x94\xf1\x0d\x71\xa5\x40\xf6\x75\xed\x12\x52\x5f\x23\x80\xb8\x22\x4e\x42\x0e\x6e\xcb\xab\xe5\x88\x56\xa9\xf5\x7b\xea\x6c\xb7\x3d\xba\x5a\xca\x3b\x7e\x67\x85\xc5\x55\x79\x25\xc6\x2b\x03\x3a\x22\x64\x5b\xf5\xc0\x57\x40\xf3\xd1\xa3\x21\xec\xd1\xef\x98\xea\xe4\x44\x78\x41\x50\xc6\x6e\x18\xd0\x2b\x92\x3f\x3f\x2e\x38\x90\xe3\x23\xe8\xd4\xdb\xa1\x31\xef\xed\x4c\x32\x5c\x29\xc9\xf1\xc2\xd3\xe9\xab\x9b\x3c\x74\x63\x4c\xd5\xc3\xbb\xd6\x47\x5d\x55\x80\xb2\x9b\x12\xe6\x62\x82\x79\x6b\x25\x74\x76\x53\x6f\x99\x96\xb2\x77\xb6\xcc\xdb\x6f\xfc\xbc\x1c\xf2\x1e\x34\x2e\x4c\xd7\x37\x05\x04\xd4\x53\xd8\x67\x33\xc3\x06\x69\xd5\xfa\xca\x42\xf5\xd8\xcb\x03\x5b\xf7\x12\x98\xe4\x09\x61\x92\x56\xab\xf8\xcf\x98\xa7\xf3\x3e\xb5\xb2\xb5\x94\xd9\x62\x3f\x29\x5a\x3e\xcf\x56\xb2\x4f\xeb\x98\xf0\x17\x4d\x73\xca\xc2\x03\x0a\xf7\x27\x93\x19\x7a\xed\x94\x15\xf6\xbc\xce\xd8\x60\xfc\x51\x4d\xe2\x66\x60\x40\x31\x6e\x01\x78\x28\xef\xf9\xfe\xc6\x40\xd6\x40\xcd\xfd\x22\x57\x9a\xdc\xb2\xb0\xa2\x09\xb8\xc0\xee\x47\xc0\x4f\x8a\x0b\xee\x7a\xa4\x2f\x85\x98\x64\xaf\x53\x7a\xdd\xb7\x03\x65\x7a\x94\xae\xb8\xa1\x1b\x56\x16\x3a\x92\xc5\xe7\x1b\x60\x33\x2c\xa9\x78\x9b\x2f\x63\xb8\xfc\x89\xca\x0e\x49\x45\xb1\x9d\xd4\xfd\xb9\x6d\xcd\x91\x9d\xd8\x9c\x5a\x17\xaa\x55\x5c\x4e\x40\xc8\xcb\xef\x26\xfe\x97\x4f\xf2\x6e\xce\xb6\x2e\x7c\xde\xfc\x98\x37\x2d\x6b\x9b\x2b\x9e\xe7\x27\x47\x14\x2f\xe2\x77\xcc\x1f\xaa\x38\xef\xf0\x96\xbb\x55\xe2\x20\xd7\x7d\x4e\xaa\x41\x75\x8d\x36\x4d\x50\x5e\xcb\x1b\xb9\xff\x41\x6d\x99\xb4\xef\xaf\xd5\xb3\xb0\x10\x80\x05\x24\x2b\x76\xef\xa3\x4e\x98\x82\xc5\xff\xc3\x3e\x7c\xa5\x93\xb2\xd0\x87\xda\x8d\x39\xce\x2c\xf1\x6c\x9a\x60\x82\xfd\x2c\x61\xc6\xd5\xec\xe9\x68\x57\x9e\x9d\x33\x18\x8a\xc8\xb1\xde\xc0\xc2\x9b\x86\xf3\x50\x00\x11\x7e\xd1\xea\xc8\xe9\xaf\x67\x76\xc5\xbb\xa7\xb2\x54\x65\xa0\x47\x19\x76\xa8\x6f\x3e\x36\x8d\x62\xc7\x9a\xfd\x3f\xd3\x3a\x23\x23\xe1\xb1\x20\xcd\x54\xa0\x6f\x19\x0a\x9b\x33\xa1\x4c\x3a\x8d\xdd\xd0\xf6\xf1\x13\xb1\x2a\x98\x4e\x80\x27\x77\xfe\xfa\x00\x7c\x0c\xe0\x08\xd6\x96\x13\x9b\xe0\x2f\x6d\x5b\x02\x9a\x74\xab\x21\xc8\xe6\x4d\x2c\xe1\x19\x07\xf9\xf2\x89\x39\x73\x17\x92\x42\xa7\x0d\x45\x3a\xbe\x52\xa4\xc3\xc2\x14\x1d\x7d\xb7\x87\x61\x2f\xef\x7b\x22\xa6\x3a\x2a\xde\xb2\xfb\xd5\x8a\x4b\xec\xf5\x1a\xb6\x7c\x97\xd7\x60\x59\x26\x3b\x35\xc4\x08\x71\x02\x6b\x26\xe0\x90\xad\xf4\xbe\xbb\x83\x4a\x6f\x79\xd9\x1e\xac\xac\x58\x9e\x44\xf4\xa0\xea\x90\x5d\x03\xba\xba\xf0\x48\x25\x30\xff\xe0\x35\x9c\x41\xdb\x93\xb2\x40\x74\xf6\xbf\x27\x42\x50\xf0\xe9\xa8\x41\xde\x36\x48\x67\xc8\xe0\xe9\x2a\x75\x32\x36\x2f\x92\xa5\x83\xc5\x91\x06\x2b\x48\xe0\x52\x75\x16\x17\x92\x8f\x84\xaf\x25\xda\x1a\x49\xb5\xe7\xb0\xfd\x0a\xc2\x9f\xd9\x74\xe3\xaa\xd8\xfa\x70\x13\x45\x13\x9b\x6d\xff\x17\x89\x92\x1e\xb0\x33\xeb\xc2\x54\x8b\xf6\xcd\x06\xed\x17\x1a\xae\xa7\x00\x47\x60\x47\xae\x6a\xd9\xc2\xe9\x4c\xf3\x5f\xb2\x02\xd8\x4c\xdb\xb1\x3f\xad\xed\x98\xae\x63\xad\x56\xe9\xf6\x43\x2d\x5d\x9a\x2a\xf8\x14\x4f\x34\x63\x5f\x20\x4a\xbd\x7e\x5d\xbb\x63\xe0\x9e\xa1\x55\xcc\x3a\x0e\x9f\xba\x4d\x41\x9f\x69\xe8\x3e\xc4\x9e\x42\x3e\x03\x46\x4f\x39\x2e\x44\x5c\xa4\xb0\x6a\x56\x86\xc6\x98\x65\x29\xa4\x43\x10\x14\x7c\xc2\xd9\x08\x13\x86\xc2\xae\x3f\xa2\x4a\xf0\x43\xd8\xad\x15\xc2\x0b\xf5\x52\xe3\x53\xf7\xed\xf5\x5f\x74\x49\xf7\xce\x68\x2d\xd3\x11\x0a\x33\x38\x82\x69\x13\x46\x5d\x82\x3e\x17\xeb\xf7\x08\x4a\x1b\xbf\x16\xe4\xe9\xcf\x4c\xfb\x97\x50\x87\xab\x97\xbb\x70\xdc\x65\xf6\x23\x4c\xad\x77\xf1\x4e\x6e\x6b\x80\x55\xd2\xcf\xa8\x52\xb8\xde\x23\x40\x15\x31\x83\x73\x25\x63\x12\x2f\x05\xaa\x7b\x81\x52\x62\x19\xaf\x28\x79\xe1\x38\x57\xf8\x9f\x99\x18\x61\x2d\x97\x28\x68\xcd\x5a\xe1\xef\xaa\x79\xce\xfd\xfc\x48\x1c\x8f\xf0\x3a\x2f\x57\x59\xef\x43\x25\x61\x00\xc9\x9b\x00\x92\x37\x7e\xae\xf4\x03\xab\xcf\x66\x88\xc2\xaa\xdf\x7d\x53\x4a\xbc\x92\x0b\xb6\xb0\x1a\x0c\xc6\xb4\x8f\x3b\xae\x27\x6a\xd4\xe2\x35\x6c\x76\x76\xb6\x2f\xf1\x36\xc4\x4e\xaf\x45\x13\x20\xd4\x6c\x7b\x7b\x84\x27\xa2\x94\x7e\x2e\x0e\xe8\xe7\xf2\x00\xcf\xf7\xf7\xb5\xfa\x61\xc3\xf1\xe2\x19\x2e\x17\x55\x28\xac\x0e\x8a\x91\x39\x56\x52\xa9\x0a\x75\x5e\x23\x57\xf1\xdf\x90\x67\x1b\xd2\x18\x2f\x99\x37\x05\xf4\x19\x67\xde\x8b\x83\x42\xec\x25\xbc\x74\xc9\xa8\x8c\x7a\x25\xae\x7c\x6a\xf5\xaa\x6e\xd5\xe3\x47\xa8\x75\x85\xa1\x2d\x31\x6e\x4c\xc8\x0a\xe8\xdf\xb9\x46\x26\x03\x1d\x99\x1a\x8a\x1d\xd7\x17\xc7\x56\xdf\x0d\xc4\xe5\x37\x09\x77\x60\xd7\x78\x2c\x4f\xb6\x92\x60\x55\x5e\x30\x31\xa0\x12\xd2\x3c\xe7\xe8\xc9\xcf\x52\xbb\x66\x8f\x86\x56\xa5\xe6\xb6\xd1\xca\x0a\xdd\x89\x4c\xf5\xfa\x52\x51\xfd\xa7\x0f\x9c\x41\x55\xa6\x7c\xcf\xc3\x92\x2a\x8a\x6e\xd7\x35\x27\x72\x36\xa0\xe0\x51\xd4\xab\xe5\xed\x3f\x2f\x02\x88\x1d\xe7\x79\x58\xb9\xe0\x65\x5f\x90\xe0\xd0\xbd\xdb\x71\x9a\x01\x34\x41\x50\x80\x48\x6c\x50\x2d\x1e\x57\xe1\x71\x9b\xa9\x17\xb7\x27\x20\x52\x3a\xbd\x00\xe8\xd2\x91\x44\xdb\x17\x7b\x36\xd3\x3c\x7b\x30\xfd\x6d\x2c\xd5\xcb\x62\xf5\x5b\x7d\xce\xf7\x59\x0b\x28\x49\xb1\x09\x86\x18\xaa\x59\x58\xe4\x55\xae\xff\x4e\x29\x06\xfe\xac\x77\xbd\x5f\x3a\x93\x66\xa7\x23\x4f\x0e\xd9\xd2\xb9\x04\x3c\x8c\xa6\xfa\x71\x91\xe7\xd9\x1f\x70\x92\xe7\x58\xe7\xd9\x93\x80\x97\xa1\x0e\x50\xa5\xe6\x29\x54\xa9\xcf\x59\x8a\x5d\xc9\xf2\x94\x05\x24\x12\x30\xcc\x02\xf6\xb7\x39\x60\x9c\x05\x78\x3b\x1c\x30\x92\x80\x49\x0d\x8d\x9e\xa3\xdb\xfb\x2e\x2d\xa9\x89\x94\x09\xf2\x10\x02\xa1\x2d\xe7\x65\x05\x8f\x93\x80\x96\x2b\xcc\x7d\xa4\xcd\x19\xd0\xf9\x83\x0d\xb8\x2a\xb6\xb8\xf2\x9d\xe4\xe7\xdb\x88\xdc\xed\x4b\x3a\x4d\x78\xb7\xdc\xf4\x3d\xfb\x8d\x39\x75\x79\x83\xda\x2f\x3e\x5e\xc0\x7c\xd9\xa1\xc0\xf6\x65\x73\x4e\xa0\x9a\x99\x61\xc4\xaa\x2d\x19\xaf\x3e\xce\x78\x71\xa0\x33\x5e\x1e\x4c\x26\xac\x6d\xbd\x86\x49\xf8\xeb\x0e\xd2\xf9\x22\x1d\x0c\x74\x07\x83\xd9\x0e\xc2\x82\xfb\xf9\x63\x43\x3a\xea\x35\x00\xb6\x56\x45\xea\x11\x2d\xe4\x7e\x33\x30\xb3\x75\xff\x03\xa3\xff\x01\xfa\xcf\x1d\xb8\xfe\x3b\x1d\xa8\x61\xfe\xe7\xb4\x7f\x7c\x54\xe2\x33\x52\x48\x7d\x43\x9e\x1b\x86\xd9\x67\x7b\x22\x35\xc7\x55\xdd\xa1\x2a\x2a\xdf\xb7\xa9\xbe\x60\xc2\xfa\x13\x14\x5c\xc9\x74\xba\x64\xfe\x9b\x63\x53\x83\xfd\x78\x2c\xa2\x7b\x5c\x4e\x4d\x97\x03\xf5\x3a\x8a\x04\x71\xd2\xe5\x5b\xba\x06\x53\x01\x37\xf6\x65\xe8\xb9\x73\x98\x9b\x55\x03\x5d\xa3\xf2\xac\x36\x2f\x2f\x83\x79\xc5\x0d\xa8\x73\xa3\xb7\x8b\xc7\xad\xb8\xa5\x56\x28\xc9\x28\x80\xd3\xd3\x2e\x53\xf4\x60\x4b\x64\xf8\xe1\x10\x55\x0a\x2d\xc8\x3a\xb4\x68\x0e\x8c\x37\xe1\x12\xb9\x35\x3f\xbb\xd8\x18\xe8\xca\xd3\xc7\x85\x16\xc7\x3d\x2b\xf4\x67\x61\xb4\xed\x5e\x1f\xc6\xdd\x86\x5b\xea\x62\x4c\xdb\xae\x1e\x11\xc2\xc2\x76\x8d\x74\x75\xb7\x3c\x88\x1a\xbc\xd3\xc9\xc6\x02\xf8\xbc\xcc\xb8\x11\xc3\xbf\xdd\xb3\x8b\x8f\x7a\xd6\xcc\x7a\x36\xfe\xdb\x3d\x8b\x06\x53\xeb\x48\x17\xda\xe9\x71\xfb\xc7\x48\x8e\xa2\x47\x7f\xbb\xbd\x97\x1f\xb5\xb7\xaf\xda\x4b\xf3\xbb\xdb\xfb\xbb\x0d\x8e\x0b\x0d\xb6\x9f\x9b\x51\x94\x6e\x45\x29\x1d\xcc\xe0\x1c\xa1\x9b\x6f\xfa\x4b\xd3\xd3\xe7\xee\x99\x74\xb1\xb4\x56\x9a\x32\xb5\xdb\xa7\x8b\xf8\x73\x94\x69\xfa\x80\x72\x76\x45\xd8\xb8\x1d\x94\x85\x24\x16\x98\x66\xfb\x09\x74\xd2\xf9\xee\xf6\xf6\xab\x01\x44\x66\x42\x88\x5d\x96\xff\xe9\xb2\x75\x67\xf0\x46\x22\xa0\x9a\x45\x28\x14\x91\xfd\xa2\x38\x96\x9d\xff\xc0\xfb\xed\x3f\xf2\x4c\x3a\xbd\x91\x14\x2a\x65\x74\x30\xe1\x87\xb0\xbd\x1c\xd8\xf1\x3d\xa1\xb7\x7b\x2f\xe5\x78\x52\x51\x7b\x6a\x00\x63\x98\x45\x93\x91\x5b\x65\x4a\x7e\xfb\x5c\x46\x56\x9d\x6e\xf4\xe8\xcd\x24\x3c\xdd\xa5\x84\x59\x15\x6c\xeb\x2a\xb4\x94\xc1\x47\xf7\xed\xee\xbc\x1c\xea\xdc\xed\xe7\xd9\xdc\x67\xc8\xfd\xb6\xdb\xf5\xca\xba\x08\x9d\xba\x37\x27\x75\x77\xec\x99\x95\x4d\x95\xdf\x1a\x17\x72\x68\x5a\x94\xe7\xdc\x86\x9e\x5c\xd0\x27\x84\xc0\xd5\xfe\x87\xc8\xdb\x83\x81\xbc\x11\x7a\xa5\xd0\x23\x5b\x85\x41\xea\x58\xe9\x06\xd6\x58\x5b\x67\xd5\xad\x69\x93\x1f\x84\x9b\x3d\xd4\xec\x76\xcd\xaa\x3c\x30\xf2\xda\xf9\x56\x58\xca\x2a\xa3\x37\x27\x63\xde\x80\x5a\x11\xfd\x39\x93\xeb\x19\xac\xcd\xc0\x22\x8b\xb8\xee\xf6\xb5\x94\x3b\x64\xec\xdf\x26\x86\xcd\x33\x5c\xd2\x94\xda\x3a\xad\xb4\x4e\xad\x5e\x5f\xd9\x8a\xdb\xbc\x06\x09\x2c\x37\x22\x15\x3a\x5a\x5e\x36\x9a\x32\x18\x15\x41\x22\x55\x74\x89\x27\x78\x53\x5f\x48\x32\x3d\x6a\x6d\xf7\xe0\xac\x54\x1f\xec\xd3\xa0\xc4\x10\xd7\xaf\xb7\x1b\xee\x5b\x10\xc1\x00\x66\x99\xd2\xea\x27\x4f\xce\xa6\x48\x0e\xce\x8d\x73\x7f\x56\x95\x4f\x59\x87\x71\x08\xf9\x43\xe7\xee\x9f\xb6\x5e\xb5\xf1\x24\x93\x9f\xfa\xcd\x9b\x7c\x91\xb1\x4c\x87\x73\xc0\x82\x3a\xd6\xaf\x47\xb4\xa1\xbd\x7e\x03\x10\x42\x43\x8a\xdb\x9c\x7b\x24\xbf\x99\xed\x0d\xb2\x63\x6a\x3c\xce\xf9\xdf\x3d\x7d\x89\xf3\x2b\x01\x58\xba\x3d\x45\x88\xc9\x19\xa7\x98\x1c\xf5\xf3\xd8\xd3\x36\xa7\x43\xf6\x04\xb8\x12\x79\x3f\xc2\xaa\x4f\x80\x52\x66\x57\x49\x43\x0b\xe3\xb3\x02\x17\x62\xfc\x89\x8e\xe3\x50\x6c\xbc\xd7\xb6\xf8\xe3\x6f\xf3\x67\xb0\xcf\x9f\x67\xf9\x6c\x1d\x58\xe5\x00\xf7\x9a\xec\x95\xd6\x2f\xc7\x83\x82\xc1\x34\xe3\x06\xba\x50\x52\x34\x67\x5a\x28\x62\xeb\x62\xcd\x66\x27\x3f\x58\x2a\x37\xbf\x69\x2a\x27\x5e\x3b\x95\x28\x62\x7e\x75\x65\x48\x95\x91\x6b\xd1\x05\x05\xd4\x16\xb7\xcb\x72\x87\x05\x8b\x5a\xc8\x2c\x6a\x91\x06\x6f\xa1\x67\xca\x06\x7a\xb4\x9c\x73\xb5\xc9\x9d\x55\x25\x10\x50\xbf\x7c\x69\x50\xd6\x8e\x72\x8d\x6d\x98\xc0\x3d\x7a\x6d\x54\xd2\x95\xe0\x3b\x4c\xb2\xd0\xf7\x87\xbb\x42\x8e\xce\x4a\xc8\x01\xf4\x95\x80\x52\xea\x96\x28\xd6\xfa\x9d\x7f\x97\x4b\x14\x41\x6e\xfc\xda\x29\xa5\xfc\x1d\x99\xbf\x2b\xad\x5d\x58\x8b\xcf\xfb\x36\x9b\x9b\x6f\x3b\xf1\x3d\xc3\x4e\x43\x22\x20\xca\xd4\xee\x0e\xcb\xac\xfc\xe6\xcc\xd9\xf2\xb8\xf1\x53\x9a\x86\x59\xbb\x30\x2b\x1a\x76\xae\xcf\x2d\x70\xbc\xa8\x91\xa2\x5c\xa8\x24\xd9\xb6\x43\x6d\x46\xf2\xb7\xe1\x44\x60\xfd\xcc\x65\xbc\x48\x6f\xf9\x29\x1b\x1a\x08\xa5\x3e\x3e\x54\xba\xf3\x56\xe9\x79\x1b\x96\x2b\x56\xa1\xe3\x4b\x96\x39\x01\xb1\xb9\xcf\xc3\xfe\xf4\xd9\x13\xe4\x67\x4f\x38\xc8\xcc\xe4\xf0\xd7\xdf\x56\x0a\x86\x94\xd6\xa9\x67\xf5\xdd\x3a\x28\xcb\xda\x25\xd0\x1a\xf0\x09\x12\xf0\x51\x11\x62\xd3\x71\x18\xd4\x8b\x18\x88\xd3\xf6\x32\x9f\xf8\x06\x68\x4e\xa8\xe8\x2c\x7b\x45\xb2\xcb\x82\xb8\x07\x2d\x3f\x47\x22\x66\xb3\x3e\x6e\x09\x50\x87\x60\xa7\x65\x1c\xdf\xdd\x2d\x4a\xfa\x0f\x11\x78\xaf\x9a\xe5\x65\xad\xa4\x33\x2c\x9c\x94\x11\x95\x05\x19\x0d\x96\xe8\x69\x13\xc5\x9a\x6b\x65\x7e\x67\x45\x90\x2d\x6b\xc2\x0d\x1d\x29\x7c\xf8\x1b\x70\xb8\x53\x33\x0e\x8e\x97\x27\x40\x59\x76\x9e\xe6\xce\x87\x6d\x4d\xd8\xa8\x1f\xbe\x36\x38\x79\x3e\xed\x77\x39\x6b\xdb\xc3\x76\x81\x6e\xb6\x58\xc0\xbd\x4f\x9f\xc0\xef\xc5\x0c\x6e\x1d\x5e\x01\xa3\x1e\x9d\x4b\xd1\x69\x0f\xc9\x07\xee\x9c\x53\x6c\xcf\x83\x88\xa3\x67\x0f\x1f\xf9\x65\x90\xc3\xe8\x86\x25\x81\x03\x09\xbc\xcb\x4f\x16\x29\x35\x89\x86\xdb\x9d\x21\x8c\xb8\x99\xb4\x02\x7d\x0a\x78\x78\x7e\xf3\xdd\x55\x8d\x61\x3d\x6c\x33\x6d\xf1\x7b\xc0\xf4\x45\x53\xae\x88\x62\xfc\x86\x66\xb6\xa1\xb6\x8b\x4a\xee\x85\x08\x0a\x22\xa1\x8f\xfb\x27\x58\x98\x35\x61\x4b\x81\x8a\xa8\xbe\xfb\x48\x57\xc5\x05\xfe\x96\xac\xea\xd1\x59\x29\x12\xb5\x45\xa7\xb6\x6e\xbd\xa8\x0c\x9b\xf7\x43\x77\x2c\xbe\x08\x94\x9b\xed\x92\x9a\x0c\x28\xc5\xa3\x33\x87\xd9\x03\x8c\x93\xc2\x00\x92\x8b\x26\x90\xf4\x9d\x56\x98\xdb\xb5\x3b\x6e\x0d\x06\xad\x4e\xf2\xdb\x83\xd7\xa1\x81\xee\xf6\xc7\xbf\xed\x6f\x89\x89\xd4\x40\x3f\x2d\xc9\x96\x53\x08\x1c\x75\x12\x05\x34\xaa\x00\x1c\xda\x03\x51\x96\xdc\xe7\xc2\xf6\x3b\x5c\xc2\x52\x2a\x9a\x0f\xed\xa7\xd6\xa0\xe5\xa7\x91\xf6\x46\x1d\x8f\x7c\xa1\xf6\x4a\x6d\xca\x07\x59\x15\x1a\x59\xd8\xf7\x40\x5b\xad\x0a\x2b\xd9\x62\x3d\xf8\x2f\xba\x0e\x1a\xb5\x40\x8f\x9a\x47\x8b\xe0\xd3\x11\x0b\x50\x8c\x5a\x50\xdd\x66\xe1\xe4\x2c\x79\xae\xb1\xf0\x58\xc3\x57\x13\xd6\xbd\x4c\x5d\x48\xb9\x5e\xdb\x13\x7d\x2b\x73\xae\xf7\x41\x35\xdc\x87\xde\xd5\x8a\xa6\x6c\x5e\xef\xd3\xdd\x39\x52\xeb\x2a\xa8\x3f\xe2\xe9\x87\xa2\x03\x71\x57\xa0\xb4\x81\xd5\x38\x64\xa1\x3e\x05\x3a\xbb\x4d\x17\x3f\x1c\xa8\x61\x27\xf9\x27\x5f\xa4\xbd\x1b\x83\x79\xda\xbc\x16\xbc\xfa\xd9\xb8\x91\xdb\xbe\xbd\x24\x84\xef\xd9\x20\x96\xd2\xf1\x0c\xc5\x2a\xd7\xfb\xa8\x79\xbe\x69\xbc\xdd\x66\x7d\xb1\x41\x03\x43\xa8\x34\xdd\x6d\x57\xd6\x16\xc4\x56\x0b\x75\xe4\x44\xb4\xfc\xd8\x8f\xc2\xf5\xb3\xd8\x10\xed\xb2\x1b\xe0\xe8\x59\x6c\x70\x08\x6c\x6a\x48\xa8\xf6\x29\x4e\xca\x7e\xa7\xf4\x9a\x7a\xe0\x81\x35\xc6\xcd\x3f\xf1\x72\x4a\xa8\x0f\xe5\x33\x99\xee\x94\xc2\x8b\xe3\x5b\x8b\xa5\xde\xde\x26\x76\xb7\x1f\x12\xee\x44\xdb\xf0\x64\xc8\xea\x58\xef\xa6\x8c\xa6\x19\x08\x0f\xed\xe5\xc3\x68\xac\x14\x63\xaa\x77\x1c\xfd\x76\x7f\x32\xac\xbf\xaa\x23\x4b\xf6\xa0\xce\x71\xd5\x1a\xa6\x50\xfd\x53\x89\xf9\xf1\x11\x7a\xaa\x1a\x50\x77\x19\xd4\x7b\x41\x43\xe5\x81\x48\x37\x7b\x29\xaa\x8e\x6e\x9f\xbc\x34\xc4\xe8\x0c\x98\x5b\x25\x02\x7e\x4f\x09\xfb\xe6\x4c\x68\x39\x47\x6f\xad\xd8\xef\x9f\xa5\x5e\xcd\xa6\xd1\xb0\x2a\x3d\x0d\x87\xa8\xed\xee\x9c\xf9\x51\x79\x9c\xe8\xdf\x7c\xbf\xcc\x92\x73\xc3\x3f\xcb\x10\x9e\x73\x86\xc7\x97\x52\x6f\x86\x6a\x9b\x5f\xde\xb6\x0e\x94\xf1\xc7\x63\xdf\xd0\xfb\x15\xf0\xfa\x0e\xc1\x7f\xe6\xf3\xce\x5a\xa0\x9d\xe9\x74\x3b\x62\xd4\x13\xa5\xa7\xf5\xc0\xe9\xf9\x8d\xc2\x25\xe1\x71\xa6\x93\x8f\xaa\x93\x8f\x7f\xd1\x49\x8f\xca\x9a\xe4\xa9\x3e\xec\x9b\xd9\x5a\xd5\xb9\xc7\xb9\x9d\x53\x00\x5b\x86\x21\xb0\xa0\x77\x53\xf1\x59\x04\x80\xb3\x59\xbf\x3c\xe7\x19\xc8\x3a\x00\x87\x5c\x34\x1b\x66\x87\xfa\xc6\xad\xc7\x97\x83\xe4\x64\x9d\x6e\xd5\x2c\x6b\xef\xf9\x86\xac\x3d\x33\xb2\xab\x43\xe7\xbc\x0f\x41\x67\xcf\x3e\xa0\xa4\x01\xeb\x00\x92\x70\x1a\xbe\x3c\x02\xda\x0c\x05\xc8\xb7\x55\xe8\x91\x19\x4a\x87\x99\x22\x89\x3f\xef\xbb\xb5\x88\x11\x6c\xf6\x0e\x22\x30\x60\xe5\x04\xf1\xce\x7f\xbb\x57\xc8\xfd\x30\x24\xc8\xd7\xd5\x44\xf1\xae\x0a\xed\x51\x68\x02\x55\x23\x7d\x1e\xda\xc7\x91\x79\xca\x19\xcb\x73\x60\xb2\x0a\xcc\x5c\xef\x70\x81\x1b\xd4\xec\x3e\x5d\xe0\xbe\x0c\xb8\xa0\xcd\xff\xfe\x40\xc8\xd6\xc3\xcc\x44\x6c\x39\x0b\x30\x8d\x1c\xfb\xbb\xb9\xd2\xd4\x18\x94\xc1\x44\xce\x3f\x31\xcf\x01\x45\x12\x02\xab\x9c\x7b\x98\x9e\xa4\x5f\xd1\xde\x71\x1f\x5a\xac\xf0\x87\x16\x5e\xdb\xad\xab\xae\xda\xaa\x73\x60\xe3\x87\x8d\x0b\xfa\x40\xb4\xd2\x4a\xdc\xba\xd2\x74\x1b\x69\x59\x6b\xdb\x4b\x7b\x4d\x4f\xfc\x67\xd1\xc4\xce\xe2\x33\x33\x40\xc5\x64\x79\x30\xa5\x6e\xe4\xda\x72\x45\x79\x7c\x98\xeb\x10\xc4\xd5\x46\x36\x00\xe4\x4a\x32\x37\x5e\x63\xf3\x66\x84\x53\xe5\x87\x53\xcd\xf0\xa7\xe2\xfd\x62\xc5\xb9\xc5\xf2\x56\x1c\xff\x16\x34\xbd\xfe\xb0\x68\x49\x96\x0f\x66\x58\x50\x0f\x9a\xdd\x41\xd4\x51\x49\x70\x7f\xc7\x39\xed\xbb\x6f\xea\xf0\xd1\xf2\xcc\x81\x23\x0a\xf0\x59\x59\xc5\xd2\xd2\x50\x6b\x93\xb2\x45\x7b\x85\xad\x6d\x26\xef\xeb\x27\x38\xf0\x3d\xee\x43\x8d\x79\xec\xfa\x34\x01\x5f\x4a\xb8\xb5\x20\x29\x76\x4f\xbb\xde\xd5\xea\x66\x68\xf7\xa4\x4a\xa3\x8d\xda\x40\x8a\xcf\xa0\x0d\x8e\x3f\x3a\x72\xc4\x50\x8a\x74\x2b\x70\x9a\xcf\x84\xef\x04\x4e\xbb\x55\x2d\x19\x6d\xa0\x60\xcb\x1e\x19\xfe\xcd\x07\x6a\x18\xed\x50\x80\x1d\xb5\xa5\x72\x29\x65\xe1\xda\x7f\xd0\x05\xfd\x75\x3e\xf2\x48\xc6\xb2\x56\xa0\x44\x49\x96\x96\xf2\x8c\xdc\x6c\x95\x71\x2d\xcf\xa8\x4d\x9b\x8e\xf0\xfa\xe1\x3c\xb5\xcd\xa7\xbd\x1c\xa5\x0a\x4f\x0c\x0d\xa2\x9a\xd3\xf6\xd8\x57\x6a\x64\x08\xee\xb3\xa6\x0d\xb8\x1f\xd9\xad\xcc\xd2\x84\x7c\x1d\x6e\xbb\x31\xa1\xe2\x6e\x7c\xc0\x22\x41\x89\xd2\xe8\x26\xc6\xb6\x52\xb7\x0b\x7d\xa5\xca\xe8\xd8\x5b\x08\x6f\xac\x77\x52\x07\x3e\xe8\x4f\x82\xad\x03\x08\x24\x55\xd6\x40\x09\xc3\xc1\x74\xc0\xac\x5e\x9d\xcc\x4d\x05\xc7\xb4\xcd\x42\x4b\x59\xfc\x2c\xac\x8d\xbb\x52\x8a\x84\x85\x23\x55\xcf\x4c\xcf\x4e\x71\x1e\x7a\x4a\xc9\xa0\xc5\x89\x71\xda\x79\x8d\x39\x47\x70\x84\x9d\x0e\x38\x4e\x63\xd5\x81\x39\x54\x73\x72\x7a\x32\xc6\xfe\xcc\x18\xd3\xd6\xf1\xf8\x1c\x29\xf7\xd4\x6a\xa9\x5f\x52\x65\xec\xb1\xdb\xf5\xdb\xd7\x86\x9e\x24\x3c\xd5\xe4\x26\x8f\x08\x03\xa4\x79\xe9\xd9\x3e\xcd\x8b\xbd\xca\x37\xd5\x6c\x7a\x7a\x13\x05\xa5\xb6\xfe\x7b\xee\x9d\x91\x61\x54\xa8\x6d\x45\x00\x58\x85\x91\x22\x4c\x16\x81\x13\xd4\xfa\x02\x2a\xe1\xb7\x22\xce\x92\x18\x50\x3a\xc0\xc6\x28\xf9\xcb\xf1\x1f\x74\x0a\xb6\x22\x27\x6a\xa1\x01\xff\x2f\x56\x26\x28\x62\x10\x36\x32\x50\x90\xeb\x73\xc8\xa0\x81\x04\x01\x20\x24\x3a\x5d\x32\x9b\x2e\x31\xd2\xd1\x3e\xfc\x11\x57\xeb\x81\x9d\x34\xca\x75\x9a\x78\x86\x36\xd3\x60\x91\xaf\x9e\xe6\xf4\x12\xf8\x7b\xc8\x26\x21\xb0\xe1\xb5\xa3\xe9\x1d\x12\xc2\xc3\x9b\xcb\x2a\xe7\x69\x85\xea\x3a\x3d\x61\x61\xbe\x29\x82\xe2\xa6\x08\xcc\x4d\x11\x9d\x4c\xa9\x0a\xf5\xe5\x5c\x98\x5a\x7b\x45\xe5\x77\x20\x06\xe0\xe0\xf0\x84\x8d\x12\x70\x36\x8c\xa0\x04\x31\xef\x02\xb8\x41\xa9\x0b\xfe\x74\x17\xf8\xe4\x2c\xe7\xa9\xe6\xaf\x36\x4f\xbd\xc4\xf2\xda\x89\x78\xed\x64\xcd\x8f\xf4\xa2\xd9\xf8\x8b\x45\xc3\x5a\xce\xb0\x62\x22\x1c\x66\xf1\x0c\xa8\x65\x03\xca\x54\xb1\x35\xca\x98\xc0\xb9\x35\xa1\x6e\x0d\x44\xa2\x32\x7b\x3a\x89\x8b\xf3\x6d\xcd\x4e\xd5\xb2\xaa\x9c\x1e\x78\xc2\x08\x97\xa8\x90\x15\x44\xb6\xdd\x95\x35\xd3\x74\x1f\x83\x90\x64\xc1\xa5\x9f\x65\xe8\xe9\x93\x9d\x8d\x0c\x09\x0e\xa5\xa7\x6b\x68\x2e\xc5\x45\x09\x98\xf0\x82\xdb\x83\x1a\x5e\xc5\x32\x0a\x37\x6b\xc7\x91\x8e\xd0\x06\xef\x34\x2a\xeb\xad\xd2\x80\x90\xa4\x61\xd6\x64\xda\x65\x30\x04\x03\x65\x61\xf2\xa5\x1e\x1b\x4e\x81\xa0\x74\x3a\x66\x21\x76\xde\xdd\x10\x53\x14\x4e\x4f\x51\xcf\xd6\xf7\xbf\x79\x9f\x90\xa0\x05\x8e\xff\xc7\x14\x87\x11\xdb\xd8\xcb\x18\x68\xe8\x28\x59\xfd\x8e\xaf\x32\xda\xea\x66\x58\x12\x4d\x63\x5c\x5c\x85\x11\x75\x42\x61\x55\xd5\x58\x0b\x63\x64\xcb\x72\x58\xcb\x99\xe8\x70\x6f\x64\xf4\x0f\xf2\xa0\xea\xa0\x32\xd5\xa6\x05\x27\x1f\x68\xc8\x80\xa6\x43\x45\xa7\xad\x26\x65\x56\x19\x15\x42\xef\xd9\x7e\x19\x58\x24\x5f\xe7\x40\x93\xea\x2b\x85\xf2\x03\x37\xaa\xc6\x62\x0f\x4e\x99\x41\x32\xd8\xcc\x18\x17\x9d\xbe\xb6\xd2\x18\xd2\xe1\xe9\x84\x3b\x56\x99\x2f\xb7\xd0\x30\x6d\xab\x54\x59\x9c\x24\xed\xe1\x49\x09\x98\x16\x53\x1c\x5d\x48\xf8\xae\x99\x16\xdb\x06\xaa\xa5\xed\x2a\x04\xc1\xd0\x84\xa8\x7a\x2e\xc7\xb4\x2f\x37\x67\xac\x97\x42\xdd\x85\x0c\x9d\xf5\x86\x79\xa8\xa7\x55\x2c\xb0\xb2\xaa\x1a\x32\x2a\x87\x6e\xc7\xf6\x94\x01\xce\xec\x9e\x9c\x8d\xe1\xa8\xf6\x91\x92\x11\xc2\xa7\x4d\x78\xcf\x1e\x5b\x86\x7c\x5e\x6a\x4b\xef\x4e\x13\x83\xd5\x7a\x57\xd9\xc8\x99\xab\x98\x1e\x4b\xb2\xa0\x5c\x18\xf2\xc4\x3e\xf2\xf4\xdc\x6e\x6c\x43\xc7\x96\xdd\xba\x2f\x71\x10\x6b\xd2\xcc\x11\xe0\xa7\x6c\x65\x4c\xa3\xbf\x6a\xa9\x5d\x2c\xba\x0a\xe1\x11\xff\xe5\x39\x74\xf0\x68\xcc\x07\x6a\x71\x54\xb0\xbd\xb8\x6e\x55\x76\x72\xaf\xfa\xe2\x82\xb0\xf2\x15\x98\xf4\x93\x60\xd2\x4f\x1f\x21\xd2\x19\x7e\x09\x65\x8a\x04\x38\x59\xf7\x0d\x01\x42\x56\xce\xe1\x3b\x3b\xaf\x50\xe6\xee\xf2\x25\x06\x5a\x74\x55\xeb\x70\xff\x56\x57\x52\x8e\xf4\x78\xff\xe9\xc8\x8a\x8a\xac\xf0\xba\xf7\x08\xe1\xd2\xed\x52\x51\xd9\xad\x35\x03\x67\x90\xc8\x7a\x9a\x39\x46\x33\xd9\x35\x03\xea\xe9\x74\x1b\x7f\x99\x2e\xe7\xd2\xcc\xcf\x07\x6e\x47\x38\xd0\xd7\x9d\xd3\x07\xb9\x0d\xed\xe0\x36\xb4\x66\x55\x95\x36\xb6\x95\x10\xef\x52\xf8\x23\x97\x55\x56\xa1\xab\x2c\x99\xc4\xd2\x4a\xb6\x86\x09\x5b\x2f\x02\x1d\x03\xf7\x04\xe5\xec\xad\x7b\xfa\x69\x82\xfd\xfb\xeb\xb9\x8d\x81\xa5\xa5\xc7\x16\x03\xdb\xa3\x7b\xfe\x64\x54\x13\x0a\x0e\x25\x98\xcd\x21\x67\xe5\x8a\x1d\x3c\x60\x7a\x96\x61\xe2\x63\x10\x01\x40\xe1\x6b\x90\x13\x4b\x30\xde\x53\x7d\x49\xca\x87\x89\x82\x55\x37\x50\xbb\xe5\xd9\x77\x07\x76\xb3\x5b\x20\x89\x3e\xd7\x32\xad\xb1\x60\xb5\xeb\xed\xe7\xcf\x5c\x84\x5b\xe0\x85\xa0\x62\xe8\x25\xa6\x06\xf8\xcc\x53\x31\xb6\x26\xbe\x98\xc9\x0f\x22\xb3\x39\xdb\x7e\x15\x3f\xce\xad\x12\x7f\x61\x1d\xb1\xd0\x10\x8b\xd9\xe7\xf4\x87\x21\x9c\x1a\xbe\x52\x7a\x2f\x4b\xcf\x26\x54\xaf\xa0\x78\x2d\x8a\xad\xe9\x6a\x0b\x6a\x25\x93\x9c\x04\x46\x73\xe6\x1b\x5c\x41\x2f\xb5\xe9\xb3\xff\x86\x9a\xa7\x8d\x67\x78\x2e\xf7\x97\x42\xd6\x96\x59\x10\xa6\xe4\xff\x21\x36\x03\x72\x05\x03\xba\xc6\xd0\x79\x01\x0b\xff\xcb\x0f\xb0\xd1\x54\xfd\xf2\x8a\x6f\x41\xc8\x09\x61\xe3\xef\x60\xa7\xa9\xae\xd0\x4d\xdc\xe4\x2e\x6a\x9e\x14\x78\xc4\xb7\xa0\xc4\x59\x0d\xa2\x7d\x7e\x53\x2a\xc1\xee\xc0\x63\xf5\x9f\xdf\xca\xe4\xb8\x0e\x97\x7d\xa7\x17\x82\x2f\xf2\x8f\xb5\x7f\xad\xae\x38\xdf\xac\xdf\x09\xd9\xda\xb7\x39\x8b\x13\x84\xca\x11\x86\xcc\x1c\xa3\x67\x9f\xda\xe4\xd7\x47\x63\x3c\xe0\x04\xd4\x16\x71\x8f\x99\x6d\xc6\x5d\xbf\x47\xbc\xbd\x6a\x43\xa1\x03\x82\xc6\x12\x34\xe6\xa0\xf5\xc6\x3c\xb6\xf6\xd6\x89\xf9\xb2\x59\x1f\xb0\x5d\xaa\x01\x00\xaf\x54\xb8\x2a\xe6\xec\x3d\x16\xc8\xe7\x1b\xa7\xe8\x38\xd4\x45\x7d\xfd\x73\x15\x3c\xd6\xbb\x7e\x35\x5f\x1e\xcb\x68\x65\x88\x45\xb2\x0c\x26\x1e\x9c\x07\xd4\xcb\xf2\x54\x02\x09\xce\x52\x85\x26\x6b\xd7\xfd\x34\x06\xe7\x65\xe8\x32\x5d\xbc\x69\x77\x11\x8e\xa1\xe0\x63\xf6\x44\x96\xe9\x9e\x3e\x4e\xe4\xa1\xe1\x7e\xb7\xac\x22\x23\x15\x63\x58\x65\xd0\x3a\x44\xf1\xd2\x0a\x7d\x6a\x70\xdc\x38\x17\x8f\x30\x7b\x70\x03\x9e\x4a\x2c\x13\xa5\x03\x12\x6b\x81\x05\x1c\xf1\x4b\x5b\xed\x85\x0e\xba\x10\x43\x4c\xcb\x01\x4f\x7a\x25\xfe\x50\xc4\x98\x23\xd6\xd9\xb4\x80\xd0\xb0\x28\xc9\xcc\xeb\x87\xaa\x9a\x17\xaa\xae\x7d\x46\xda\x57\x37\xcc\xb9\x81\x9c\xf3\x07\x0d\x0a\x59\xa5\x13\xb5\x27\xf3\x95\xe1\xb2\xf3\xf6\xb0\xab\x2c\xcd\xe4\x96\x19\x0d\x9b\x4c\x09\x3b\xcf\x6b\x10\x5e\xaf\x54\x4b\x68\xcf\x04\xb4\x97\x42\xf7\x25\x93\x0a\x63\x5a\xc9\x0b\x61\x47\x78\xe5\xc4\xc8\xbd\xfc\xf0\x44\x49\xa6\x85\xcd\xe3\x7e\xfd\x1d\xb3\xbd\x42\x6e\x95\x76\x8c\xb4\x68\x0c\x12\x8f\x39\xf1\x71\x80\xc4\xe3\x65\xf7\x0b\xa7\xa6\x85\x80\xe5\xac\x47\x61\x52\xdc\x92\x58\x8d\xf9\xda\x6d\x9f\x4c\x89\xea\xac\xd3\x09\xc5\xdb\x00\x30\x8a\x05\x67\x03\xd1\x13\xea\xcb\x56\xc0\x5b\xa9\x88\xd6\xb2\x12\x00\xa3\xa8\x74\xf6\x1e\x6d\x70\x8c\xd0\x6d\xe7\xa7\xe8\xc3\xc5\x8d\xf7\xa7\xa8\xec\x65\xcb\x9b\xce\xf0\x01\x0f\xa9\xf8\xf4\xdc\x90\x70\xb9\x1b\xc8\x3a\xf1\x67\x81\xd5\x47\x95\x3a\xd0\x06\xd6\x16\x43\x80\xcc\xce\x0b\x49\x29\xc2\x7e\x43\x66\x2c\xa6\x0a\xda\xf5\x07\x9a\xe6\xed\x08\x56\xf3\xca\xda\x64\xe0\x9c\x94\x91\x9b\x18\x29\x99\x4f\x38\xc4\xf1\xcf\xbb\x11\xdb\x5f\x09\x3c\x44\x55\xf2\x94\x23\xde\xfe\x2a\x28\xa6\xa0\x71\x39\xae\x44\x60\x88\x5b\x49\x7f\xf7\x58\x02\x7b\xbc\xdc\xf9\xdd\x9b\x82\x79\xd0\x7f\x67\xec\xc3\x87\xff\x24\x40\x5b\x71\xd6\x32\x98\x46\xee\x19\x78\xfb\x11\x6c\x33\xb8\xe4\xff\xcf\x80\x55\x0e\x88\xa6\xe1\x54\x0e\xa0\xa8\x63\xa6\xba\xf5\x1c\x44\x99\xe0\xc8\x04\x57\xb0\x9a\x22\xe0\x4a\xef\x65\xe6\x1b\x11\x15\x96\x3e\x0c\xd0\xf3\x47\xdb\xa2\xc0\xec\x00\x00\x05\xd8\xf1\xf4\xa9\x40\x71\xc6\x2e\x4a\x89\x68\x67\xab\x92\x83\x65\x9f\x35\xcd\xb2\x7a\x58\x8a\x58\x67\x5b\x7f\xcb\x11\xad\x4b\x39\xd9\xf0\xa4\xad\x35\x60\x27\x3f\xda\x04\x03\xf4\xf0\x2e\x43\xc0\x3a\xc1\xc8\x97\x0b\x41\xf1\x32\x82\x82\xef\x6d\x02\x24\x59\x04\xcd\x15\x95\x6a\x80\x6d\x9e\x3e\x09\xd2\x46\x3b\xf2\x79\xc3\x7c\x19\x28\x78\x3e\x4a\xe3\x02\x0e\x6e\xca\xe5\x04\x99\xad\xc9\x30\x73\x45\xd6\xdc\xf8\x5c\x37\x26\xb0\xa6\x2c\xf4\x4d\x2e\xf6\x6c\x1e\x23\x05\x80\x8a\x5c\x1c\xc0\x50\x83\x4b\x61\x0f\xda\x29\x17\x5d\x49\x02\x4c\x36\xa1\x6b\x1e\x78\x67\xda\xad\xaa\xe7\xbe\xa2\x7d\x09\x63\xab\x31\xed\x3e\x5f\x36\xd5\xd6\x7f\x33\xb6\x60\x7b\xee\x09\x6e\x48\x21\x54\xf9\xd0\x65\x12\x88\xc9\xe9\x03\x5d\x0e\xb2\x6b\x63\xaf\x4f\x3f\x87\x43\x2b\xb7\xff\xa1\xdb\x39\xb7\x77\xba\x6b\x1a\xd9\xa3\xab\x1b\x58\x52\x84\x3a\x11\x2b\x6d\x22\xb1\x9b\xaa\x9b\x48\x04\x30\xcd\xa6\x46\x5f\xaa\xa7\x6d\xbe\x6c\x6e\xbd\x58\xe5\xc8\xe6\xeb\x39\x43\x06\xea\x90\x85\xce\xcc\xef\x52\x94\x77\x69\x03\x5d\x0a\xd1\x25\xd5\x08\x5f\xd8\x69\xb8\x83\x01\x77\x90\xa6\x57\x3a\x18\xe9\x0e\x06\xe8\x60\xc0\x1d\xb4\xca\x92\x53\x88\x07\xd2\x68\x35\xb4\xba\x29\xd7\x74\x9f\xa3\xdb\x4e\xd4\xb0\xbf\xc0\x04\x2a\x0d\x75\x1b\x52\xcc\xc0\x30\x12\xa6\x42\x8a\xa3\xcd\x8d\x6d\x1b\x8d\x6d\x73\x63\x13\xd6\xef\x8c\xc6\xd2\xce\xcd\x31\x77\x5c\x35\x70\x23\x99\xaa\x43\x91\x01\xa8\x34\xba\x00\x35\x26\x36\x50\x60\x75\x47\x6f\xe3\x66\x1e\x0a\x81\x45\xa6\x30\x9c\xee\x61\xf2\x49\x0f\x65\x2a\x33\x3a\x2a\x50\x91\x88\xcf\x05\x96\x4a\x2f\x4e\x45\x37\x8f\x14\x9b\x3e\xb4\xc4\x34\x49\xe2\xb3\x7e\xaa\x49\xd9\xfc\x6f\x65\xee\x49\xaf\xb4\x48\xad\xb4\xe9\x66\x46\x68\x66\xc4\xcd\xac\x64\x66\x5b\xd4\x04\xb4\xd9\x52\x86\xae\x38\x9f\x84\x94\x8e\x25\x9a\x83\xb4\x4a\xab\x05\x73\xc0\xca\x00\x3a\xe2\x48\xb9\x6d\xa9\xd1\xb6\x54\x46\x93\xda\x96\x7e\x3c\x07\x73\xaa\xd1\xf3\x90\xaa\x79\xf8\x92\xce\x19\xfd\x58\x8d\x7e\x22\xdd\x6a\xeb\x6e\xc5\xe8\x56\x5c\x1c\xfd\xd9\x7b\x7c\xef\x43\x1a\xb7\xaf\x9f\x42\x20\xb1\xcf\x53\x11\xeb\xa7\x9e\x07\xe5\x15\x3b\xe3\xc1\xbc\xb7\x67\x26\xff\xa2\x03\x13\xab\x72\xd3\x2a\x25\xf3\xdf\xa7\x31\x50\x84\x5c\xb6\xc0\xcc\xe2\x32\x65\x11\xa3\x63\x3e\x57\x16\x66\x2e\x9c\x82\x11\xf9\xcc\x19\x50\xf1\xf1\x64\xae\xc6\x31\xea\x53\xc2\xeb\x0d\x54\xac\x1e\xe0\x0e\x48\xd9\xa1\xdb\x9d\x0e\x92\x69\x9f\xe9\x97\x9c\x8b\x4f\xd7\xbc\x3c\x33\x52\xb8\x56\xc0\xaa\x89\xdd\x2c\x4e\x97\xf5\x7a\xae\x85\x9d\xa9\x5e\x87\x46\xaf\xed\xa8\xd8\xef\x58\xf5\x5b\x4d\x6d\x38\x3b\xb5\xa6\xf5\x83\x8f\xfa\x0d\x2a\x96\x12\xa8\x15\x98\x22\x20\x10\x66\x1a\x08\x83\x63\x3a\x24\xf3\x9c\xea\xfd\x97\xa8\xfd\x17\x7e\x34\x14\x59\xa7\x09\x6c\x78\x7f\xd5\x5b\x74\xd5\xe8\xb0\xa8\x26\x62\x5d\xe1\xc5\x42\xef\x4a\xb1\x29\x6d\xc7\x67\x7f\xca\x82\x98\x3d\xbf\x1c\xd8\x1d\x1f\xec\xd3\xcc\xb9\x5a\x18\xb3\xd4\x18\xb3\x39\xc0\x77\x6a\x73\xcc\x1b\xc1\x6c\x00\x5f\x73\x42\x91\x10\x38\x9a\xc3\x07\x36\xbc\xa9\x0c\xaf\xd9\x97\x01\xf9\x52\x6f\x30\x38\xf1\x1e\xa2\xf2\xcd\xce\x64\x62\xef\x44\x1e\x8c\x0c\xef\xd2\x27\xd0\x3a\xd4\x02\x7b\x3b\x02\x27\x36\xd5\xb7\xb8\x5e\xfe\xba\x6a\x3f\x78\xfd\xa4\xd5\x29\x7f\x33\xc9\x24\xeb\x53\x67\xb7\x7e\x01\x8e\xf1\x7c\xd4\xda\x51\xb4\xce\x41\x54\x35\xc4\x18\x40\x8d\x50\x0e\xc5\x7e\x15\x58\x65\x9d\x11\xf8\x02\x73\x70\xb1\xd2\x09\x2e\x84\x11\x8e\x27\xb9\x50\x44\x82\x6b\x0c\x94\xcf\x56\xd9\x14\x65\xe5\xaa\xc3\xf9\x63\x75\x36\x9a\x24\x8c\x8d\xa9\x2b\xff\xdb\x24\xe7\xc1\x08\x9c\x4d\x42\xf8\x36\x09\x59\x20\x87\x8b\x9f\x8c\x57\x06\x60\x64\x13\x7a\xfb\x55\x9a\x0a\x62\x9d\xd3\x21\x01\xf2\x38\x01\x97\xad\x2c\xc5\x78\x79\x6d\xf9\xbe\xbf\xcc\x81\x07\x0d\x86\xf3\x47\x7b\x4e\xeb\x0e\x2a\xef\xbe\xc7\x40\xc2\xe0\x4f\xee\xa0\x90\xe2\x3b\x4a\x94\x84\x2b\x6b\x52\xde\xd1\x9e\xfb\xd6\xba\x2b\xbf\x89\xde\xa1\xb4\xda\x76\x7a\x91\xb3\x31\x2a\xf3\x77\xeb\xcc\x26\x67\x3a\xb1\x93\x2c\x45\x5c\x8d\x54\x8a\x28\x4f\x11\x4f\xec\xe6\x9d\xd2\xc7\x9b\xd8\xfb\xe5\xb7\x55\xed\x01\x57\xee\xc4\x73\x36\x06\xda\x70\x60\x76\x73\x5a\x67\xb2\x58\x78\x3f\xcb\xed\x8c\x49\xd2\xfc\x6e\xe4\x11\x26\xff\xf5\x79\x6c\x49\xda\x96\xc4\x20\x53\x46\xad\xbc\x94\x90\xf9\x3b\x24\x57\x70\xff\x51\x2e\x93\x43\x66\x10\x55\x3c\xb0\xa5\x12\x62\xfd\xb4\xb4\xa4\xd4\xc1\xc1\x83\x37\x17\x15\x73\x6a\xc6\x9c\x4a\x0c\x6b\xae\x06\xbf\x1e\x61\xb7\xab\xdf\x45\xda\xe7\x61\xbb\x9e\x46\x58\x5e\x6b\x05\x0e\x9f\x4d\x26\x66\x3d\x3f\x6b\x35\xdd\xcf\xbf\xbd\x9e\xaa\xf5\x73\xe9\xb9\xd8\xa6\xf2\x1a\xe2\x0d\x47\x0f\x8a\xb4\xec\x2b\x3a\x7d\xf8\x22\x99\xde\x2e\xc5\x18\xb7\xbd\x78\x24\x31\x2a\x3f\xad\x1e\x44\xbd\xed\x36\x15\xa3\xe2\xee\xa6\xca\xc9\xd1\xd7\x4d\x89\xbe\x7d\x56\xba\x00\x2b\x47\xaa\x15\x6f\x5a\x8f\xad\x14\x3b\xba\x2d\x14\x1b\xb7\x64\x70\xce\xd5\xb3\x8a\xb6\xe1\x55\xff\xf9\xd2\xa8\x3f\x8e\xa9\x8b\x70\x41\x57\xc2\x65\x66\xde\x8b\xba\xb2\x55\xd3\x4e\x8e\x81\x6d\xd5\xfa\x26\xae\x9e\xba\x1b\x2a\x01\x02\x25\x4a\x6c\xba\x66\x65\x6c\xe6\x65\x6c\x7a\x1c\xc3\x09\xae\x9b\x3a\x01\x75\x48\x27\xb8\x6e\x72\x0c\x27\x38\xef\xe8\x04\xd4\x62\x9d\xe0\xbc\xc3\x31\x9c\x20\x6e\x2d\x2d\xe9\xf0\xb8\xc5\x01\x20\xa0\xef\x7b\xa5\xcd\x22\xaf\x8c\x36\x03\xc4\x4a\xeb\x6a\x15\x9a\x34\xe1\xef\xe1\x9e\x6f\xc8\x9b\x2f\xfa\xe6\xae\x77\x74\x5f\x2d\xcc\x92\x67\xab\x00\xe9\x55\x05\x6d\xcf\xd2\x6c\xf2\xe3\x2c\xb5\x5d\x07\x50\xb3\x31\x13\x79\xa6\xd3\xb1\x64\xa2\xe6\xeb\x34\xd4\xf2\x0a\xda\x99\x05\x50\x93\xf3\xcb\x8c\x55\x59\x9c\x69\xbb\x71\x27\x0e\x68\x71\x5a\x55\x1f\x4f\x31\xc6\x16\xe1\x4e\x1c\xbf\xea\xe9\x5b\x5a\x7a\xed\x14\x27\x2c\x0b\x31\x66\x28\x4f\xa5\xa7\x24\x0f\xd1\x73\x00\x3e\xb1\xf7\xf7\xd7\xbc\x33\x30\xd1\x3d\x66\x13\x20\xaf\x9d\xe2\x6c\xe4\x21\x7a\x1e\x4c\xee\xa2\xad\x02\xcb\x1b\x83\xe6\xf3\xd2\x57\xab\xd2\x3d\xa7\x53\x6f\x15\x7b\x8d\x5d\x6b\xa6\x5e\xb3\xfa\x10\x8c\xa4\xc6\x7e\xdb\xae\x81\x93\xe7\x67\x69\xbb\x66\x8f\xae\x21\xfc\xba\xad\x84\x5f\xc3\xf3\x39\x82\x01\x8c\x94\xe0\x7a\xde\xf1\xcd\xb1\x72\x1e\x9e\xab\xdb\x10\x7c\x0d\xcf\xf3\xc7\x0f\x75\x6a\xe0\x1a\xed\x5c\x06\x0e\xb9\x87\xdd\xa4\xef\x3d\x6c\x8c\x82\x76\x34\xdc\x1f\x46\x0f\x03\xd8\x20\x84\x12\xf1\xe6\x33\x04\x9f\xa2\x7f\x7f\xc8\x8e\xa6\xcb\x8f\xfe\x3d\xa7\x7c\xc1\x89\x3e\xaa\x02\x6d\x6d\x38\x35\x0f\x35\xd4\x6e\xe7\x42\xb9\x87\x67\x0d\x1b\xb9\x92\xda\xad\x51\x49\x26\x72\xf5\x2b\xd5\xe8\x37\x90\x1a\x4e\xe6\x9a\x67\xbf\x06\xf4\x7d\x0d\x44\x43\xd9\xf5\xc9\x47\x92\x16\x67\x8f\x75\x24\x6b\x38\xa3\xa0\x52\x90\xfe\xf7\xab\x85\xde\x5f\x9f\x98\xbd\x07\x2c\xf4\x01\xfd\xe6\x0f\xf3\x76\x1a\x3d\x10\x46\xc1\x6a\x53\x23\xb4\xaf\xe6\x35\xb4\x7a\xb9\x9a\xb3\xbf\xfb\xb1\xb6\x34\xe0\xd4\xfc\x54\x0d\x34\x73\x7a\x9a\xdf\xa0\xf5\x75\x08\xfe\xba\xf2\x59\xd7\xb3\x9f\xbc\x74\x14\x95\x43\xe7\x26\x76\x9a\xe9\x0a\x7f\x87\xed\x09\x55\x14\x7c\x38\x52\x3e\xcf\xb9\xb1\x04\x77\x0a\x3a\xc4\x2e\x6f\xa6\xd9\xc7\x28\x94\x16\xe8\x4e\xcd\xbe\xbc\xb1\x2a\x3b\x7c\x5c\x45\x7f\xce\x3e\x15\x31\x11\x6a\xbb\x46\x63\x2d\x69\xc2\x3f\xe7\xb3\x64\x0b\xd3\xc3\x3a\xf3\x61\x6d\x89\x21\xf3\xed\x26\x2d\x6a\x1f\xca\x58\xa8\xdf\xf5\x06\xdf\xd8\x8f\xf9\x22\xef\x39\xb0\x6e\xac\xcc\x33\xf0\x93\xa8\x2e\xa8\xed\x06\x30\x79\x98\x6b\x53\x4a\x45\x5d\x0a\xd8\x20\x2a\x8f\xad\x12\x2c\xf6\x2c\x74\xbc\x12\x1b\x52\x12\x9c\x91\x10\xd4\x05\xae\xfd\x84\xb5\x5b\x86\x6c\x60\xe1\xfd\x7d\x55\x2b\xfb\x38\x36\x94\xbc\x8d\x9e\x3c\x65\x93\x24\x0b\x7a\x42\x50\xbb\x10\xf4\x82\xa0\xb4\x10\xf4\xfc\xc4\xba\x9c\x4c\x85\x71\xe3\x27\x56\xe8\xc4\xfc\x44\x87\x5e\x65\x50\x1f\x3c\x36\xe8\x4e\xd7\x51\x6c\x4d\x95\x04\x2a\xcd\x06\xce\xcf\x87\x0a\xeb\x0f\x49\xdd\xc1\xa1\x57\x1a\x58\xca\x96\x51\xdc\x23\x34\x68\x37\x29\x5d\xd9\x3b\xbb\x96\x7a\x28\x0e\x68\x38\xe2\x6c\x38\x70\xe7\xbf\x00\x65\x60\xf9\xb6\x0d\xfa\x33\x27\x6e\x43\xc5\x49\xb2\x12\x34\x94\x0a\x2a\x1a\xac\xcc\x3a\xa4\x44\xa0\xfb\x75\x36\x4a\x3a\x94\xfa\xa4\x6c\x0c\x75\xaa\x1f\xa0\x43\xe7\xf2\x11\xfa\x59\x9d\x1d\xa8\x5c\xc5\x23\x48\xd2\x30\x13\xe6\x73\xe2\xb9\x5f\xd4\x76\xe9\xac\xcb\x3c\xac\x5a\xe5\x53\xdb\x9c\x26\xe8\x31\x75\x0b\x49\xa8\x91\x0b\xa5\x5f\x98\x2c\xc5\xf6\x3b\x72\x57\x5d\x17\x03\xf5\xfe\x9e\x7e\x1f\x38\xde\x63\x75\xb5\x9c\xfe\xa0\x90\xfe\xcf\xea\xc0\x39\xd8\x2b\x8b\xb2\x8c\x74\x05\x71\xd6\x1f\x48\x69\x2d\x0f\x9c\x64\x60\x3f\xc1\x8a\xc7\x4a\x50\xe1\x8e\x8c\xec\x27\xbb\xc4\xea\x1f\xc8\x65\x61\x01\x2c\xaf\xd1\xa5\x45\x37\x0d\x63\xd9\xa6\xe0\x9f\x9b\x95\x4e\xbd\x8d\x81\x1a\xf1\x58\x01\xac\x24\x80\x29\xed\xcc\xba\x03\xef\x43\xb6\x8b\xea\xc1\x2e\xea\x53\x66\x2b\x35\x15\x9e\x2b\x3b\xdf\xad\x4f\x6a\xaf\x62\xc1\xd1\x06\x9d\x88\x62\x55\xf4\xea\x55\x66\x28\x1f\xa7\x57\x88\x9d\x29\x45\x32\x66\x38\xdd\x4c\xef\x4b\xd2\x24\x5a\x62\x20\x92\x07\x84\xc1\xcd\xe5\x76\x61\xb0\x0e\x1a\x2e\xb3\xfa\x41\x4a\xce\x0c\xc8\x8e\xa3\xef\x61\x75\x65\xad\x1c\xfc\x08\xb1\xf7\x26\x98\xe7\xc3\xe7\x12\x95\x6f\xbf\x3e\xa1\x34\xbb\xc8\xad\x8d\xf2\x5f\x05\x54\x0a\x3c\x73\x7d\x3a\x0f\xbf\x4c\x37\x33\x2b\x64\x83\x0a\x41\x5f\x70\x57\x51\x4b\x8c\xe3\x56\xed\xf5\xa7\x5c\x66\xf8\x5a\x94\xda\x1f\x8f\x4a\xa1\x79\x30\xbe\x68\x51\x07\xd5\xd6\x7f\xfe\xa0\x7b\x87\x6f\xbc\xba\xe6\x1a\x95\xf4\x40\x2a\xd8\xc1\xba\x48\xc4\x44\xa7\xa8\x23\x09\xeb\x51\xc3\x2d\x28\x68\x83\x58\xa0\x2f\x0c\x3b\x86\x60\xa0\xcf\xac\x5f\x2c\x1a\xa8\xec\x24\x65\xb2\x5f\xb4\xd0\xe8\xd2\x06\x5d\x26\x34\x35\x25\xe5\xe0\x95\x13\x60\x1d\x45\x76\x22\x36\x80\x59\xe6\x69\xc2\x53\x4b\x40\x8c\x9b\x12\xea\x76\x20\x50\xaa\xe6\xfc\xaa\x6e\x4f\x6b\x7e\x41\x58\xdc\x30\xf8\xcf\x4d\x81\x85\xdd\x29\x4e\x0c\xeb\x6d\x7d\x86\xcd\x97\x62\x12\x35\xa6\xad\x33\xd7\x03\xb7\x73\x6d\xe0\xd9\xdd\x58\x73\x15\x3f\xb6\x3d\x79\xc3\xae\xdf\x50\xf8\xe5\x00\x56\xa6\x62\xcf\x7e\xd1\xb9\xae\xb2\xf8\xf3\xb9\xf1\x5d\x8a\xff\xc9\xf1\x57\x14\x7f\x42\xf1\x9a\xb9\x22\x8b\x38\x2d\x46\xf4\x28\xe2\x82\x23\xae\x29\xe2\x02\x25\xae\xe9\xdb\x44\x16\x75\x36\x1d\x15\xff\x94\x66\x6c\x3d\x7a\xf6\xf9\x3e\xfd\xeb\xf6\x1f\x43\xf7\xff\xcf\xd2\x6e\xcd\x5e\xaf\x59\x95\xdd\x8f\xc4\x2a\xf2\xc4\xf9\xdb\xe6\xe6\xab\x7a\xc1\xf4\x77\xd4\x6d\xfa\x9f\xfa\xc1\xc1\x90\xb0\x6a\xed\x94\xe9\xde\x6f\x72\x8f\x10\xee\x20\xf5\xa4\xdf\xe6\x2a\x01\xfe\xcd\x63\x24\x55\xe9\x66\x79\x3c\x36\x97\xf0\x50\x1e\x5b\x54\xc2\x1b\xc8\x71\xcc\x55\x35\x44\x7b\x29\x99\x98\x54\x9e\xbd\x9c\xcf\xc9\x01\x31\x31\xe5\x1b\x37\xeb\xb5\xa9\x80\xeb\xcb\xf5\xb4\xf0\x89\xcf\x4e\x30\x6b\x82\xd3\x44\x05\x91\xab\x02\xb1\x58\x96\x8d\x35\xc5\x51\xe0\x37\x54\x9d\x99\xfa\x11\xb5\xbc\x45\xa6\xca\x3a\x6b\x83\x18\x46\xc3\x0f\x8a\x62\x1f\x35\xe5\x40\x51\x21\x0a\x91\xd9\xca\x25\x7f\x5e\xcf\x61\x4d\x33\x1a\xe4\x7d\xc9\x54\x03\x4e\x09\xd3\x64\x78\xb2\x6f\x34\xf4\x20\x2b\x60\x0b\x63\xb0\xe5\x15\x8a\xd8\xf2\x7e\xa5\x8c\xa3\xac\x8c\x4d\x94\xb1\x59\x2c\x63\x93\xca\x00\xdd\x02\x3f\x5a\xa8\x87\x9c\x9f\x14\xfc\x45\x56\xc5\xe0\x9f\x1f\x30\xd2\xbf\x1d\xfb\x74\x26\x3c\xb5\x35\xe9\xa6\xc0\x5a\x62\xef\x42\x7d\xee\x7a\xbb\xec\xd3\x85\x64\xc2\x16\xad\xae\x9b\x05\xd1\x9f\x68\x69\xe9\xf6\xb9\xa4\x82\x6d\x83\x64\x10\x59\xf5\xee\x6b\x23\xe7\x25\x54\x22\x6b\x57\x1d\xe7\xf1\x06\xcf\x5a\xae\xfb\xda\x7c\x7f\xa7\xcf\x4b\x02\xc2\x8a\xeb\x1e\x26\xda\x9b\xb8\x6a\x77\x2d\xb8\xe7\x74\xde\x64\x84\x8c\xd5\xef\xa1\x10\xfe\x09\x93\x39\x38\x2d\xf9\x72\x5d\xee\xb8\x6b\x8c\x06\x80\x95\xf1\xfd\xbd\x0d\x9c\x66\xb5\xd2\xd3\x2a\xc6\x7b\xda\x64\x5f\x0a\x95\x5e\x23\x3a\x82\x83\x6e\x3a\x7a\xe8\xd0\x41\x3b\x80\xb5\x00\xfb\x15\xe2\xa8\x8f\x74\x72\x12\xe2\xf3\x0a\xc4\x9a\xd6\x18\x0c\x39\x5f\x9f\x94\xde\xe8\x08\x1d\xd9\x74\x98\x3e\x4d\x2c\x6d\xa0\xe4\xd5\x79\x7d\x56\x1b\xb4\x3d\x28\x1f\x67\x2a\x42\x9f\x70\xe1\x79\x22\xdc\x1e\x6b\x2d\x06\x92\xb0\xb4\x74\xa2\x62\xc3\x3c\xb6\x28\x67\xbf\x55\xce\x16\xf4\xa0\xba\x80\x97\xc4\x01\xdd\x40\x92\xf2\x02\x36\x9a\x92\xee\x47\xab\xee\x5e\x2b\x23\xda\xa2\x79\x1d\x03\x55\xcb\xe9\x6c\x0d\xe0\xa8\x9c\x50\xd4\x17\x6a\x00\x95\xf3\xf0\xcc\xaf\xcb\x97\x2d\xd8\xbd\x36\x29\x9a\xc6\xa6\x56\x5d\xf5\xf5\xd0\xd4\x20\x27\x40\x63\x03\xfa\xa6\x7d\xdf\xb2\xec\xd5\xef\x62\x89\xf0\x49\x83\x9c\xd0\x4e\xaa\x3d\x08\x4b\xf5\xea\x3d\x45\xb2\x85\xb5\x8a\x75\x35\x29\xf6\x6b\x22\x13\x3f\x35\x15\x23\x99\x85\x7c\xc8\xa5\xef\x30\xe3\x20\x83\xaf\x02\x06\x4b\x4b\xcf\x39\x74\x43\x67\x51\xba\x70\x2d\xb9\xb5\x2d\xc2\x3e\xf7\xf5\xf4\x13\x4e\x0a\x1e\xf4\x7c\xfa\x8d\x7a\x3b\xba\xde\x27\xb7\x83\x7a\xd9\xce\xc5\x63\xfd\x89\xd6\x4f\x95\x2a\x5c\xb5\xf3\xe9\x1b\xd8\x60\x80\x07\xcf\xe3\x42\x62\x4e\xdc\x40\x8c\xfe\xbe\xe4\xad\x31\xd3\x8d\xf3\xf1\xf0\x71\x35\x77\x46\xb7\x6c\xb7\x31\x81\xf8\x74\x35\x2f\x05\x32\x4d\x54\x71\xa7\xde\x91\xc1\x6a\x58\xe5\x98\x59\xbc\x69\x4e\x3a\xf3\xe7\x84\x92\xd3\xe6\xc5\xd0\xc7\xdc\xb9\xd7\x39\x55\xc5\xd0\x46\x16\x8b\x2c\x5e\xcf\xaf\xf4\xd8\x55\x1f\x8e\x1b\x95\x2f\x32\x8e\xbd\xaa\xc7\x98\x02\xad\x26\xaa\xee\x2c\xeb\x6d\x6c\xf7\xd0\x8b\xc8\xec\x69\x0c\x46\xcb\x75\x45\x8b\xef\xb1\xc1\x64\x29\x24\x06\xb5\x3c\x2b\xe5\xdc\x28\x24\x90\xda\x37\x41\xe5\x70\x76\x9b\x95\x5f\x4c\x7f\xc9\x54\x01\x23\x31\x61\x40\x31\xe6\x6f\x23\x1f\xe5\x58\xb5\x0f\x27\x53\xe8\x1c\xfb\x20\x86\x4c\x8f\x36\x58\x24\xf0\xec\x93\x9d\xa2\x6b\xa2\x1c\x9a\xea\x00\x8d\xc5\x59\x3c\xb2\x62\x97\xce\x8e\xc0\x8e\xb1\xb4\x62\xa7\x77\x43\x33\xe7\x88\x19\x0f\x57\x3b\xf8\xac\xd0\x1e\x67\xf1\x1a\x87\x71\x56\x04\x53\x6f\x22\xde\x41\xbc\x64\x63\xa0\x94\x04\xae\x7a\x5c\xa0\x2c\xa7\x18\x08\x26\x2b\xa6\xbd\x7b\xb5\xd5\x6e\x8e\x78\xe0\x23\xde\xcc\xbc\x97\xcd\xad\x1a\xf1\x58\x5b\xc2\x20\xe0\x83\x58\x13\x80\x22\xe5\x0b\x94\xdf\x3c\xf1\xdc\xba\xf3\xf5\x9b\x0d\x7b\x8b\xab\xdf\x1a\xf6\x16\x07\xfc\x23\xf3\x6f\x67\xfe\x6f\x1c\x60\xb0\x1d\x9f\xcd\x51\xb2\x2d\x4f\x79\xe0\x1c\xe0\xe7\x3c\xa5\x4f\x82\x55\x49\x28\xb5\x12\xa5\x85\xcd\xeb\x12\xec\xc9\xae\xd2\x7c\xd4\x47\x90\x23\xde\xba\xc6\x1b\x99\x56\x27\xd8\x76\x63\x85\x66\x56\xa9\xf2\x32\xb5\xb0\x12\xe1\xd8\x95\xe7\xd0\x4a\xe4\x1c\x75\x5c\x3e\x8a\xe0\xa2\xf3\x69\x3f\xd2\x48\xac\x88\xf7\xb7\xb5\x78\xbf\xba\xfe\x16\xb4\xfb\x9f\x6b\xad\xfe\x07\x5b\xf6\x6d\x52\x46\x1b\xed\x91\x57\x5e\x63\x8b\x26\xfb\x6c\x15\x43\x13\xd4\x09\x1e\x69\x53\x4a\xb9\x05\x07\x83\xd1\x4b\xf3\x55\x79\xac\xec\x02\xfc\x15\x89\xf0\x54\xb1\xa3\xe2\x6b\x9b\x80\x1e\xd8\x85\x3c\xe6\xab\x60\x7b\x48\xc2\x30\x37\xa7\xbd\x9e\xcb\x4d\x08\x95\xa8\xa9\x73\xe2\xdb\xe3\x97\x92\x0a\xb3\x0d\x0b\x83\x2b\x1e\x73\x95\x50\x89\xe2\x82\x9d\x29\x8f\x6d\x0d\x2e\x83\xd8\x7a\x07\xc5\x28\x92\xce\x52\xc9\x5c\x0f\x1a\xef\x7d\x49\xfa\xf5\x77\x0a\xbf\x14\xef\xba\x78\x3f\x10\xa7\xd7\x7c\x5c\x99\x81\x8a\x17\x9a\x85\x2f\xe0\x53\x07\x5b\x10\xba\xcd\xda\xb4\xd8\x35\x16\x1b\xc4\x84\x62\xe3\x54\x85\x62\x54\x76\x1e\x26\x56\xe8\xae\xcb\x04\xd3\x85\x6b\x00\xf5\x8d\x84\x17\x83\x4d\x8b\x45\x42\x20\x38\x00\xc2\x25\x94\x3b\xef\x9c\xa0\x51\x09\xd8\x13\x28\xe8\x0a\x3a\x34\x23\xe7\xa0\x55\xa5\x4b\x34\xbe\x20\x8d\x40\x9d\xc4\xb2\x97\x0d\x10\xd8\x48\x98\x07\x33\x61\xde\x8c\x5f\x1a\xd3\x34\x1f\x53\x7f\xd9\x83\x36\x7c\x7f\xd9\xf5\x0a\x6a\x1f\xcf\x6b\xb3\xef\xc2\xbc\xae\x63\xa5\x52\x05\xbc\x11\xab\xdf\x23\x2c\x5f\xba\x67\xb9\x84\xca\x85\x0c\x6f\xd4\xda\x8c\x5d\xb8\xc8\x2b\x6b\x93\xaf\x51\x95\x84\x65\xfb\xd8\x62\x8b\xef\x5c\x85\xd5\x5d\x14\x53\xde\xa1\x5f\x70\x04\x8b\xc3\xc7\xa5\x9e\x52\xee\x6c\xb2\xc5\xed\x9c\xa8\x43\x6b\x3d\x10\x43\x06\x62\x0f\x89\xb6\xe9\x94\x45\xa4\xcf\x96\x39\x52\xa7\x7a\xa1\x13\xf0\xd8\x45\xf1\x76\x7b\xb9\x23\x43\xc8\x0d\x35\x96\x7e\x87\x16\x0b\xac\x26\xd1\xa6\x68\x2f\xbb\x48\x44\x67\xbc\x5b\xe2\xbf\xd0\x01\x51\x22\xa6\xc1\xc0\x87\x30\x6a\x83\xe8\xa1\x6d\xce\x26\x16\x1a\x0c\x4e\x7b\x7b\x81\x90\xef\x36\x6d\xfe\xf7\xf7\x12\xed\xf2\x36\x01\x8a\xf7\x77\xb0\xfa\x53\x9c\xfc\x42\x85\x00\x95\x94\xc1\x92\x84\x75\xfd\xb0\x50\x92\x0c\x97\x7b\xb7\xcf\xa8\x45\x6b\xb7\x44\xd8\x22\x20\xa4\x9e\x9d\x95\x35\xc8\x70\x0a\xc2\xd9\xda\x9d\x52\x4e\x46\xf8\xff\x7e\xa3\x48\xb6\xf4\x58\xe0\x82\x9a\x68\xca\x4e\x6c\x98\x3c\x00\x39\xf6\xc8\xda\x4f\x73\x35\x39\xcb\xcb\x99\xea\xdd\x27\x30\xfc\xf2\xe9\xe2\xe7\xe7\x8e\x12\x9c\xc8\xfa\x11\x73\x3f\xcc\x25\x75\xfc\x7f\x05\x2c\xd5\xde\x22\x78\x98\xc3\xc8\x80\x76\x0b\xd6\x21\xa8\xa5\x07\x2d\xf5\xee\xec\x3b\x87\x47\x04\x49\xd7\x94\xb5\x89\x94\x95\xae\x5c\x37\x41\x19\xc8\x98\x5d\x3f\x87\x74\xc8\xac\x84\xbc\xdc\xc7\x8e\x7a\x56\xd7\x52\x5f\xcd\xb0\x94\xd2\x4a\xe2\x39\x0b\xb6\x59\x44\x7f\xef\xa1\xb4\xf9\x50\x6a\x8b\x62\x6c\xa7\x1b\x42\x7f\x8e\x84\xa5\xe2\x8d\x95\x37\x71\xce\x5e\x8d\x54\x46\x91\x62\x3b\x33\xb6\xeb\x34\x78\x84\xf5\x41\x32\xbd\x53\x52\xf1\x78\xfd\xd6\x49\x59\xe7\x36\x28\x86\xf3\x40\x71\xdb\x6d\xd3\x1a\xae\xe0\x95\x56\x43\x81\xca\x18\x4a\x65\x15\x4c\x4d\xc0\xe4\xda\xfe\xe3\xeb\xf2\x9a\xf3\x0d\x10\xc1\x4e\x98\xad\xb5\x10\xc2\x16\x48\xda\xcb\xff\x20\x08\x4b\x9e\xf5\xcc\x43\x2d\x2a\xad\x42\x01\x3e\xd5\x46\x69\x68\xa6\x7e\xb8\x5f\xc4\xb7\x8e\x85\xad\xde\x1c\x79\x1e\x7e\x19\xc8\x06\x2c\x31\x1d\x66\x30\x36\xfc\x1c\xc6\xbe\x36\x35\x10\x60\xf0\xda\x05\x78\x6d\x17\xc0\x6b\x0f\xb0\x54\x83\x57\xc2\x7b\x61\x82\x80\x82\x26\x7a\x36\x0b\xc0\x23\x85\x05\x9c\x48\x43\x10\x55\x90\x3a\x24\x53\x0c\x9b\x82\xb7\x3c\x38\xa1\x09\x8b\x0b\x40\x74\xa7\xc8\x93\x81\xab\xe3\xf1\x9f\xd0\x39\x40\x1f\x5a\x9c\x72\x86\xf8\xd9\x19\xe2\x73\xff\x02\xd5\xa0\x50\x9d\x9f\x87\xed\x92\x30\x01\x0b\x23\x60\x68\x06\x8a\xc9\xfc\xb1\x66\xcc\x31\x98\x06\x3d\x6d\xa3\xce\x9b\x0a\x65\xe6\x5c\xaa\x04\xf0\x8d\x2e\xb0\xe7\xd8\x50\x4c\x7f\x3e\x62\xcb\xeb\x6a\x58\x23\x36\x21\xa8\x08\x53\x83\xa3\x52\x3d\xb6\x61\x8b\x5c\x94\x57\xc7\xce\x43\x28\xaf\xf0\x1e\x01\x5f\x2e\xc3\xb9\xba\x2f\x71\xb0\x27\xca\xd2\xcc\x72\xae\x12\xb1\xbd\xc9\xe5\xf8\xd0\x27\xa4\xca\x89\xe6\x97\x13\xe9\x72\x38\xa4\xee\xf3\xbb\x58\x3e\xa8\xcf\xf3\x58\x96\x52\xa5\xeb\xab\x14\x65\xd6\xcb\xa3\xcc\xb6\x79\xa4\xed\x98\x1b\x27\x96\x0c\x58\x7e\x6a\x09\xb4\x90\x50\xf8\xec\xff\xd9\x69\x35\xb5\x98\xd4\x02\xe2\xa3\xab\x1f\x61\x05\x69\xc3\x25\xd9\x69\xc6\x0f\x87\x32\x1b\x72\x26\xad\x94\xb2\xb8\xe5\xaf\xcb\xb1\xb9\xb8\x84\x32\xac\x80\xb2\x3e\x6a\x62\x2b\xe1\xa3\x26\xa6\xa3\x26\xc1\x6e\xd7\x47\x4d\xc2\x47\xcd\xf1\x81\x30\x6b\x11\x54\xe5\xc6\x2e\x2d\x65\x70\x38\xfe\xeb\x83\x26\x1b\x6c\x39\x69\x72\x1a\xec\xff\xfc\xcc\xc8\x0e\x8a\xe3\x8f\x0e\x8a\x5d\xb3\x70\x06\xea\xbe\xb3\x3b\x04\x3f\x21\xd8\x29\x35\x93\x56\x94\xc9\xc5\xac\x13\x44\x81\xb9\xe3\xb0\x12\xe1\x76\x33\x88\xc0\xb2\x01\x36\xb9\x75\xba\x3b\x52\x84\xd1\xee\x93\x19\xb4\x06\x5c\xb4\xce\x55\x47\xed\x52\xd1\xc0\xa9\x1b\x90\xf1\x1e\x85\x13\x3c\x75\xe5\x32\x65\xc5\x06\x32\xcb\x59\x5e\x86\xe7\xc4\x3f\xf3\x32\xc2\x82\x06\xfd\x57\x33\x27\xc4\xf7\x91\xbf\x9f\xe7\x0f\x59\x65\x05\xf2\x87\x20\xa4\x71\xbf\xc3\x7a\xa8\xb9\xb4\x66\xfa\x1d\xa2\xdf\x81\xd9\xef\x40\xfa\x1d\x72\xbf\xf3\x8a\xc7\xb3\x15\x4b\x61\x59\x2d\x96\x62\xc8\xd7\x23\x6a\x8c\x8c\x30\x76\x28\x69\x7a\x3d\x83\xac\x84\x3a\xe2\xfa\xed\x78\xa6\x7e\x44\x58\x85\x59\x3d\x9d\x73\xfc\xef\xeb\xa9\xc5\x4a\x7c\x7e\xa1\x53\x2e\x06\xef\x23\xab\x9d\x01\x0a\x09\x0f\x1d\xa8\x51\xc3\xc5\x4f\x46\x98\x8b\xd9\x6b\x27\x1f\xb5\x57\xea\xa0\x6d\xd5\xf4\xf0\x20\xb6\xb4\x14\xcc\xb4\x0f\x71\xc6\xbc\xac\x4f\x0d\x8f\xe7\x6c\xb7\xf4\x08\xc1\x4d\x60\x74\xe3\x92\x80\xcb\xc3\x2b\xdd\x46\x9d\xf3\x3d\xbb\xfe\x26\x8f\x36\xc2\x8d\xae\x58\xd0\x21\x0d\x3a\xc1\x4d\x67\x31\xc0\xd9\xb5\x4d\x30\x25\x8c\xe2\x56\x47\x58\x54\x80\x60\xe7\x02\x94\x66\x85\x1e\x06\x22\x14\xbb\x37\xcf\xe0\xc2\xf0\xf2\x51\x00\x1e\x87\x51\xf0\x40\xb6\xf5\x34\xd9\x36\x60\x27\xce\x0a\xa0\xf7\xbe\xd0\x2c\xef\xfd\x12\xdc\x38\x39\x8d\x71\x1f\xcc\xc2\x4b\x90\x20\x7d\x90\x20\xeb\x0d\x10\x1c\x43\x10\x1c\x85\xf1\x06\x0c\x5b\x4c\xdc\x60\x79\x77\x45\xdc\xf0\x99\xb7\x25\xd1\xab\x34\x13\xd1\x63\x4a\x84\x47\x27\x3a\x5b\x4f\x14\x51\x3d\x2b\xb3\x80\xc0\x84\xc7\x9c\x59\x2c\xd6\xdc\xe5\x49\x0e\x30\x52\x3a\x80\x14\x5d\x81\x95\xe6\x29\x74\xb2\x4d\x95\x5f\x16\x08\x35\x33\xca\xf7\x27\x9a\xea\x98\x30\xb1\x26\x81\x5d\x42\x3a\x46\xbf\xa7\x15\xab\xb7\xbc\x0c\xcd\xc5\xbd\x2a\xa1\xe4\xe5\x9e\xcb\xa6\xe2\xc9\x2d\x7c\x63\x60\xc1\x4d\xbf\x1f\xdc\x13\xc2\xd3\xa3\x1d\x85\x3c\xb6\xce\x6c\x55\x29\xa8\xdc\xa3\xca\xcf\x51\x79\x42\xf7\x05\x11\x29\x07\xa5\x63\xa2\x78\x88\x0c\xcb\xb2\x62\x4e\x7d\x0f\x33\x87\x77\x17\xbb\x0f\x3b\xb2\x34\xf6\x76\x1b\x77\x3e\x26\xf5\x78\xea\x4d\xc6\x96\x21\xa4\xe4\x47\x9c\xdc\xb2\x3b\xce\x76\xe2\xbe\x5d\x94\x7d\xe7\xf6\x9f\x13\x4b\x59\x69\x54\x0f\x4f\x30\xcd\xde\xe1\x11\x2b\xa9\x7c\x89\xe4\xeb\xc0\x5c\xd6\xba\xe7\xbe\xf9\x5e\x59\x2b\x21\xd8\x80\x12\xe9\x44\x4e\x32\x8a\xff\x92\xf2\x28\x76\x60\x4b\xe2\x28\x70\x53\xfa\x51\xbc\xef\x01\x8c\x71\x1d\x05\x30\x66\xa5\xa8\x36\x41\x81\x6a\x13\xfe\x6d\xaa\x0d\x90\x75\x55\xc8\xa5\x67\x61\xfa\xce\x1e\xeb\x09\x53\x6c\x08\x94\xa0\x30\xbc\x9c\x9d\x20\x0c\x14\x1b\x1a\x41\x83\x62\x13\x57\xb3\xcb\x03\x0d\x82\xa6\xd8\xa8\x01\xa3\x9e\x88\x1a\xd0\x4d\xe6\x48\xdb\xf4\xb0\x44\x5c\x77\x6f\x57\xdf\x33\x82\x8c\x08\x26\x68\x55\x4e\x12\x93\x91\x02\x94\x32\x47\xd8\x78\xe1\xd3\xac\xd6\x90\x88\x76\x63\xc1\x3f\x56\xbf\xbb\x9d\x4a\x67\x65\x85\xf5\x21\xd2\x65\x84\xc6\xcf\x9a\xba\x86\xa8\x55\xef\x2b\x13\xbe\xbe\xc2\xbe\x7c\x65\xea\xd7\x67\x14\x4d\x69\x9a\x54\x18\x57\x22\xcb\x0b\x58\x1d\x2e\x2b\x03\xaa\x83\xf1\xdf\x49\x46\x74\xd5\xeb\x27\xb0\x07\x1f\xae\x1f\xc4\x59\x86\xed\xfe\xe2\x22\x09\x78\x75\x7c\xf9\x6c\x79\x18\xab\xe3\x97\x16\x87\xc9\xf4\xb7\xa7\x85\x94\x84\x75\xaa\xaf\x75\xb9\x5e\x3d\x67\x62\xbd\xf7\x10\x97\xf6\xb4\x0e\x39\xd0\x77\x16\xa0\xbc\x91\xe0\x14\xc8\x3c\x70\x13\xf4\x5a\x60\x08\xbc\x8e\xc9\x5c\x17\x0d\x64\xac\xa6\x93\x61\xb7\xa4\x65\x5d\x9d\xe2\x5f\x57\xfe\x5d\xe5\xdf\x15\x3f\xc6\x9d\x03\x04\xb1\x55\xb5\x8b\xde\x1b\x88\x7d\xf8\x25\x23\x08\x70\x70\x35\x4b\xe4\x04\x91\x66\xad\x63\x8f\x7b\x73\x6f\xf8\xec\xa4\xad\x88\x9a\x27\x2d\x0f\x51\x10\xbc\xcd\x81\x0f\x9f\x57\x0a\xfc\xec\x33\x10\x0c\x22\x1c\x3f\xbe\xfa\xe6\x05\xc1\xb7\xb0\xca\xea\xe8\xb4\x4a\x93\xbc\x09\x87\xa1\xd1\x84\xc3\xd0\x6c\xc2\x61\x98\x37\xe1\x54\x37\x81\x02\x3f\x69\xc2\x61\x28\x4d\x90\x6f\x5e\x10\x37\x61\x0d\xad\x98\x6e\x42\xd0\x95\x87\x9d\x03\xa5\xa7\xe6\x40\x51\x77\x55\xf4\xf3\x9f\xee\x17\x76\x3c\xfd\x29\xf1\x87\x3a\xde\x38\x4b\xf6\x8b\xaa\x13\x94\x9e\xba\xf7\xf7\x05\x7f\xc6\x08\x4e\x22\xcb\x02\x5a\x6c\x78\x79\xb4\x9d\x83\x7b\x9a\xbc\x83\x7b\x72\x5d\x01\x53\xbc\x8a\xc8\x15\x61\x3f\x46\x71\x45\xa9\x2f\x8a\x79\x1a\x03\x63\x02\x0d\x1b\x23\x60\x6b\xd0\x2e\xaf\x1e\x41\x0e\x8b\x16\x57\x04\x6c\x1e\x62\xce\x58\x5b\xf8\xa5\xdb\xf6\xb6\xcf\xd2\xd2\x6c\x3a\x12\xd5\xe3\x0b\x3b\x8b\xce\x6d\x08\x2f\xbe\x56\x65\xc3\x2b\xd1\x41\x43\x3e\xc0\x16\xb6\x6a\x25\xb1\x81\x8e\x0d\x10\x1b\xa8\x58\x2d\x49\x48\x35\x8a\x43\xee\xa1\xfb\x0c\x9f\xf6\xe9\x7c\x6a\xd3\xaf\x9b\xdc\x97\xf0\x65\x4a\x2a\xfb\x02\xf6\xc9\x59\x87\x18\x02\x39\x08\xaa\xe4\x78\x7c\xce\x6a\x00\x68\x88\x06\xe0\x4b\xe0\x4b\xf9\x3a\xec\x13\x35\x20\xac\x7f\x66\xe0\x42\xf3\x33\x8b\x2a\xb2\x15\xbf\x01\xf5\x95\xfc\xfd\x36\xb8\x28\x7a\xce\x6d\xd6\xc2\x12\x1e\xa6\xb8\x95\x57\x18\x3b\xfa\x15\x9e\x20\x72\x48\x43\x29\x80\x86\x48\x7c\x01\xfb\xd0\xc8\xab\x26\x37\x92\x3e\x5f\xa6\x5a\x58\x68\xa0\x5d\x68\xa0\xfd\x0b\x8d\xb3\xa7\x1a\x27\x73\xdb\x0a\x59\xa8\x13\x66\xf6\x59\x8f\xd5\x0b\x66\x85\x5a\xc7\x21\xd4\x3e\x90\x02\xd0\x3e\xe5\x1f\xb8\x1c\x03\xf5\xc2\xfc\xbd\xa8\xa1\x64\xfa\xc5\x23\x11\x37\x77\xa0\x9b\x7b\xa4\x16\x2b\xd7\x81\xc6\xf9\xda\x31\xc0\x0f\x73\xaf\x69\xd1\xb2\x42\x3b\x14\x47\xd1\xc9\x8e\x27\xe1\x92\x71\xbe\x69\x1f\x8f\xba\xc9\x76\x4b\xc1\xcc\x4a\x8d\x4d\x6c\xc2\x5c\xbc\x8f\xd3\x0b\xe8\x1f\x39\xa7\xff\xe2\xe7\x26\xce\xd3\x46\x9e\x4f\xea\xd0\x79\xce\x8c\x3c\x3c\x28\x89\x0c\x4a\x85\xba\x2f\x4e\xb8\xda\x99\x4b\xc6\x4c\x49\xfd\xd4\x13\xbb\x6d\x5a\xd9\x3a\x9a\xd6\x82\xa2\xa9\x69\x11\x1d\x21\x6c\xb5\x4a\xe6\x31\xe2\x79\x4c\xb3\x79\x4c\x05\x25\x55\xb3\xc8\xb1\x60\x2c\xd0\x01\xa9\xe8\x5b\x04\x1e\xb9\xce\xf2\xa3\xce\xcb\x0a\xa4\xb3\xd8\xe5\xfa\xcb\x74\xe7\x64\x7b\xd3\xf0\x8f\xdd\x50\x27\x1a\xab\x47\x3c\x23\xdf\x38\xcb\x37\x9e\xca\xf7\x92\xe7\x7b\x29\x18\x20\xa9\x29\x05\xb4\x53\x72\x24\x8c\x3a\x03\x0a\x81\x64\xcb\x8c\x11\x90\xb8\xc6\x49\x99\x40\x14\x35\xd7\x23\x01\x37\x0b\x53\xa3\x6c\x8d\x2c\xb3\xa7\xb2\xad\x89\x65\x17\x17\xd4\xe9\x17\xba\x04\x8c\x71\x52\x9a\xc0\xf1\xa0\x20\x41\x4b\x87\x25\xf3\xe3\x5e\x3d\x0b\x26\x93\x42\xdb\x54\xaa\x99\x00\xb0\xb6\x58\x73\x79\xd1\x08\xbc\xb9\xae\xa0\xb6\x13\x8a\x50\x71\x07\x00\xd0\xbe\x9c\x36\x48\x35\xb3\x42\x42\xbd\xaa\x28\x03\x41\x7b\xca\xf0\x61\xf1\x3a\x83\x5a\x52\x15\xb1\x05\x75\x9c\xc0\x1c\x16\x5c\x77\xfb\x55\xbc\x95\x65\xd2\xae\x7c\xd6\xad\x36\xca\x7c\xe0\x88\x76\xef\x2c\x2e\x50\x71\x81\x8a\xcb\xa1\x74\x60\x40\x6e\x81\xd7\x01\xbe\xd5\x63\x59\x7b\xb2\xc2\x6c\xb5\xb2\xac\xf2\x09\x0f\xa0\xa5\x0c\x53\x41\x69\xf8\x29\x87\x98\xb7\xc8\x93\xe9\x41\x86\xd1\x2d\x19\x67\xf0\x7b\x60\xa8\xa9\xde\x5c\x5a\xc5\x56\x96\xd6\xdf\x26\x62\x40\x7e\x96\x6f\x4d\xdd\x28\xea\x8b\x78\x11\x8d\xeb\x70\x34\x5c\x1f\x64\x99\xa2\x8c\xd2\x4c\xda\xa4\x98\xf6\xd3\x72\x43\xb0\x8b\xa8\x0c\xf3\x8b\xce\x2e\x16\x48\x63\x98\xc3\x47\x8e\x4a\x48\x2b\x16\x9a\x70\x18\x75\x12\x1a\x45\xc4\x0c\x28\x93\xbf\xac\x3a\xaa\xab\x6a\x75\x01\xdc\x14\x2e\x63\x62\x3e\xaf\xac\xe2\x59\x85\xcd\xd4\x11\x2c\xaf\x37\x2a\x6d\xd6\xa7\x0f\x76\x4a\xd6\x39\x64\x89\x5f\x5f\xe2\xc2\x7a\xbb\x51\x2d\xf5\xf8\xc5\xe4\xe7\x4b\xf9\x6d\xd0\x2a\xd3\x9d\xff\x15\x96\x0d\xed\x3b\xf1\xa7\xec\x5f\xc3\xf5\x44\x2c\xea\x89\xf5\x01\xca\x48\xad\xa1\x40\x30\x04\xd2\x75\x8c\x8b\xd7\xc5\x46\x74\xe7\x9a\x29\xf6\x8b\x94\x53\x2c\x77\x75\xaa\xdc\x80\x72\x72\xb9\x54\xe6\x2f\x34\x6b\x3a\x7b\xb1\x59\x36\x1e\x95\xa0\x09\xf9\x1e\x7c\x45\x1d\xa5\xed\x69\xee\x46\x82\x05\xbc\xaa\xc7\x5b\xe3\x87\x8b\x97\x95\xea\x29\xc1\x7f\xab\x7c\x49\xb0\xa8\xee\xd3\x15\xd3\x06\x1b\x96\xed\x7c\x83\x01\x08\x2c\xd7\xfb\xb0\x7a\xc6\xcb\xbf\x37\xa5\xda\xd4\x30\xe6\x49\x28\xd1\x2b\x15\xea\x3b\x83\xd6\xef\xc1\x72\xd8\x28\x0f\x78\xbb\x88\x8f\xa6\xad\x7c\x55\x9b\x29\x60\x5e\xe6\x3c\x23\x44\xe7\xcc\xa7\x98\x59\x1d\x20\xb2\x93\x22\x73\x27\x81\x2e\x88\x1b\xd1\xaa\x98\xe2\x78\x7f\x5f\xc5\x0c\x1d\x34\x2c\x3d\x32\xb4\x56\xb8\x25\xf5\x82\xe8\x89\xa9\x14\xde\x50\x88\x16\xcf\x93\x21\xf0\x4b\xbc\xdc\x27\xda\x1e\x6e\xbd\x21\xf0\xf7\x00\xc0\x82\xeb\xca\x69\x05\x78\xf4\x0b\xf5\x93\x5f\x5b\xcf\x71\x8a\x89\x4d\x71\x07\x36\x16\x43\x89\x6e\xf8\x28\x26\x85\x16\x88\x52\xc4\x37\x79\x4b\x35\x86\x4a\x3a\xdd\x81\xfc\x3a\x8b\xb0\xde\x95\xd2\x39\x72\x9e\x04\x3f\xb7\x45\x0b\xc4\xb6\x52\xdc\xa8\x00\x66\xdd\x6f\xe8\x2b\x68\x54\xf7\x1a\xfc\x80\x94\xd5\xe6\xab\xda\x3c\x79\xa6\x51\x9a\xb5\xf8\xd8\x52\x8d\xf5\xd1\x58\xaf\xd8\xd8\x74\xc2\x4d\xd3\x63\x9a\x4c\x2d\x93\xf6\xc7\xcb\x84\x26\x99\x97\x87\x5e\x10\xed\x0f\x8e\x12\x06\xf1\x05\x52\x9c\x00\xd1\xcc\xef\xcb\x83\xa1\x20\xea\x9e\x73\xc3\x2e\xe7\x86\xdd\x8a\xa2\x9d\xb9\xd4\x9b\x57\xe6\x77\x36\x9b\xa5\x55\x7e\x93\xca\x82\x80\xb7\x43\x3d\x84\x14\xe3\x43\x2d\x93\xcf\x0e\xc3\x52\xa3\x37\xd1\x1c\x76\x07\x6c\x20\xb4\xcd\x2a\x25\x82\xae\xb8\xf1\x66\x4c\x40\xbb\xde\xd0\xeb\x82\x21\x77\x38\x1f\xcc\x01\x28\xb6\x68\x8c\x71\x64\x36\xa0\xd2\x59\x39\x29\x27\x8c\xac\xb3\x5b\x69\xd0\xa2\x71\xbe\xbc\xff\x04\xf4\xe6\xea\x4e\x5a\xb4\xf8\x55\x5e\x1c\x76\x38\xcb\x06\x6c\x52\x2e\x80\x62\xa9\x6a\x52\x98\xd1\x80\x66\x20\xd2\x7a\xa2\xb9\x8a\xf6\x94\x70\xab\x57\xf0\xc7\x48\xcb\x6f\x1c\x2c\xd1\xca\x93\x97\x7c\x36\x79\xea\x72\x7d\xd5\xc2\x93\x03\xb0\x31\x72\xc5\xa2\x2e\x5d\x86\xef\x65\xc3\x8d\xef\x29\x32\x95\xb3\x3f\x0f\x0a\x08\x8b\x37\xcd\xc3\xd5\x66\x59\xa3\xc1\x2d\xc0\xe5\x68\xa6\x91\x9c\x9e\xcf\xc1\x61\x83\x0d\xa6\x70\xb9\xa1\x50\xe7\xd4\x5e\x55\x2f\xf1\xfe\xd4\x3b\xbc\x8f\x97\xf6\x1e\xed\x8b\xc8\xee\x38\x3f\x5f\x40\xdd\x0a\xa8\xb9\x1d\xe7\xee\x85\x6e\x28\x4b\x4b\x0b\x3d\xa6\xab\x80\x5f\xae\xc3\xae\x12\x0f\x67\x4f\x99\xc4\xef\xd0\x3c\xa9\x8a\xdd\x6b\xd0\x74\xd9\x09\x0e\x66\xd5\x04\x09\x65\xa7\xdd\x2e\x2c\xec\xb3\x93\x39\xac\xdf\x33\xfd\xfb\xa5\xbe\xb1\xc9\x1f\xee\x9a\x01\x82\x44\xad\x15\xe0\xd2\x1f\x1c\x43\x3d\x93\xa0\x38\x0f\x12\xba\x24\x8f\x49\xcf\x1c\x4d\xba\x0a\x09\x47\xe4\x6a\x65\xf4\x3d\xad\x8c\x74\x4b\x9e\x78\xa0\x06\x34\x50\x76\x0a\xfb\xda\x4f\x34\x2c\x4f\x42\x78\xc2\x68\x3c\xc9\xa3\x8f\x64\xeb\x70\xb6\xd2\x13\x8f\xe7\x80\xc6\xd3\xee\x50\x16\x2b\xcb\xd1\x56\x39\xfe\xd6\xf0\x65\xa3\x77\x5d\x10\x5b\x13\x68\x10\x80\x7f\x78\x8e\x6e\xab\xc3\x8f\x90\xdd\x9c\x66\xe7\xc4\xa0\xbc\xb3\x37\xd0\xde\x12\x83\xb9\x4d\x4f\x21\x20\xf9\xcc\xdd\x98\x2c\xc7\x1e\x50\x15\x9c\x3c\x10\x1f\xaf\x8f\x40\xfa\xf3\x3b\x6c\x68\xda\xd7\x3e\xcb\x2b\xbe\xd8\xde\x3e\xa0\x4f\x78\xa6\xf5\xd5\xb3\xef\x0a\xdd\x08\x37\xa3\x32\x0a\x76\xce\x80\x65\xd2\x0f\x05\xa9\x27\x39\x4e\xdf\x47\x30\xfd\x70\xda\x91\x27\x69\x4f\x7c\x0a\x3c\x61\xfe\xe6\xdb\x44\x82\x1e\x5b\x14\x44\x3f\x30\xd5\x7a\x5e\xf6\x9c\x4e\x6a\x6f\x37\xa1\x14\x32\x01\x9b\xc8\x30\xea\x77\xc8\xf3\x14\xea\x03\x06\x4a\x7e\x81\x04\xd0\x7c\x40\x80\x91\x3b\xc2\xfd\xf2\x67\x24\x12\x94\x39\x57\xb0\xd8\xca\xea\x51\xaf\x67\x7c\x81\x65\x31\x24\x34\x40\x2e\xaf\xd0\x3d\xcb\xca\x89\xc2\x89\xd6\x12\xe3\x57\xb4\xba\x18\xd4\xf7\xfe\xde\x61\x81\xc9\xf3\x6c\x17\x94\xbb\x12\xde\xe5\x70\xaf\xfc\x28\xcd\x7a\x14\xef\xef\x25\x74\x7c\x99\x0e\x11\xd1\x5f\x39\x47\xc7\x4c\x5e\x94\x90\x7a\x72\xbb\x41\x6c\x67\x22\x63\x0a\xaf\x64\xd2\xe1\x04\xfc\x0c\x60\xc7\x44\x22\x88\x71\x82\x48\xc0\xc8\x67\xdc\x70\xa7\xbb\x34\x31\x24\xab\xf3\xcb\x5c\xf1\xed\xdc\x77\x17\xf0\xac\x19\x54\x09\xcd\x62\x35\x53\xb4\x16\xbe\xbb\xac\x6a\xaa\x0c\xbd\xab\x52\x40\x69\x21\xe4\x44\x1e\x25\xaa\xef\xd2\xf1\xec\x21\x4d\x10\x72\x1a\x98\x2a\x37\xba\x76\x59\xac\x80\xaf\xb4\x58\x6e\x72\x91\xc5\x52\xe3\x00\x3f\x0b\x10\x5a\x10\x68\x40\x59\xf7\x72\xfc\x49\xdf\x7f\x59\xfc\xde\x37\x7c\x9a\xc7\x5f\xc8\xbc\x11\x1f\xf5\x42\xec\xf2\xe5\x73\xa7\xe8\x5d\xfb\xf9\xa8\xc9\xbb\x22\xdd\x73\x65\xa4\x10\x09\xe8\xf4\x62\xfb\xa6\x27\x12\x35\x74\xc5\x34\x63\x33\xcd\x58\xd5\x67\x52\xc7\x02\xd6\x08\xc8\xb9\xd8\x65\x8b\x4a\x41\x4a\x89\x84\x9a\x9e\xc5\xcd\x02\xbd\xca\x68\x53\x82\x36\xa9\x9c\xfb\x10\xf7\xe2\xcc\xda\xc5\xad\xb9\x70\x61\x05\xfe\x96\xae\xb5\xb7\x52\xb1\xa6\x3c\x49\x79\x57\xcd\x8f\xca\xbb\x6a\xea\xf2\xb4\x6b\x7e\x79\x07\xf7\x28\x0f\xbf\x14\x7e\x70\xef\xf2\xfa\x24\x87\x8d\x40\xee\x83\x56\x7e\x78\x15\x65\xba\x58\xd9\xfd\x05\xf5\x47\xaa\x36\xec\x7b\xfa\x31\xd3\x47\x71\x9e\x3e\x12\x93\x11\x51\x2c\xc9\xa3\x98\xb5\x2c\xca\x10\x19\x84\x22\x99\xbb\x02\xd9\x86\x7b\x95\x3f\xaf\xb6\x5d\x21\x3e\x51\x8f\x98\xa8\xe2\x1b\xbe\x0e\x93\x3a\x2a\x04\xd7\x3a\xa0\x30\xe0\x31\x40\x51\x37\x6e\x6a\x9a\xd0\x61\xa7\xea\x1b\xe1\xb6\x22\xb4\x90\x2c\x76\xac\x62\xc7\xdc\x30\x14\xc6\x2a\xc1\x57\xbf\xc3\xc9\x0a\xdf\x6d\x19\xc1\x52\xbb\xaa\x82\x80\x16\x94\x21\x9a\x94\xd1\x4f\xec\x42\xe4\xb8\x10\x39\x43\xe1\xb8\xac\x15\x80\xc1\x5c\xba\x6f\xa8\x0e\x0e\x0c\x42\x8b\xb1\xc8\xf7\x77\x00\x00\x72\x58\x21\xa1\x96\x3c\xa2\x37\xfc\x9c\xe4\xab\x2f\xac\x5c\x3b\x37\x6a\xb0\x6f\x62\x1d\x17\xab\xc8\x0a\x97\xe3\x0f\x68\xff\x72\x41\xec\x02\x07\xd4\x40\x72\xf8\x03\x1b\x81\x0c\x1c\x39\x69\x90\x25\x0d\x54\xd2\x40\x25\x0d\x90\x34\x30\x92\xfa\x5e\x56\x2a\x5c\x08\xc0\xd9\x43\x1f\xa9\x22\xc7\x61\xed\x9f\x1e\x07\xd8\x7c\x72\xf8\x5e\x7d\x07\xe4\x77\xf9\x02\x8c\xd2\x04\xf9\x92\x80\x6a\x52\x65\xd7\x4f\x09\x21\xad\x6a\x57\x79\xcd\x56\x35\x49\xb8\x6f\x84\x5b\xc6\x4a\xbc\x0e\xf2\x95\x78\xcd\xef\x26\x4a\x23\xd0\x6a\x03\xcb\x07\x54\xef\x62\x48\x35\x84\xa8\x0d\x77\xf0\x1a\xcf\xdb\xf4\x43\xa0\x5f\xb1\x5d\x21\x2e\x07\xaf\x5f\xf6\x4e\x3c\x66\x16\x84\xe1\xba\x5e\x37\xf5\x86\xd1\x47\xb2\xcf\xa7\xf7\x42\xb8\x0a\xa2\x8c\x1a\x91\x23\xa8\x99\x96\x14\x05\xa7\xf9\x55\x5d\xde\x3e\x2c\x3e\x03\xfc\xc2\x13\x8a\x9f\xbf\x3d\xeb\x77\x16\x70\xfb\xd1\xb6\x04\x14\x06\xf5\xc8\x8e\xea\x74\x57\x66\xfb\xa0\x99\x36\x78\xae\xfe\x30\xd4\x30\xf6\xaf\xab\x5f\xe3\xa7\x6f\xa9\xde\x7c\x3e\xc9\x2e\xba\xda\x8c\x53\x8b\x49\x80\x73\xaa\x0f\x8b\xd5\xab\x07\x13\xa5\x77\x25\xe8\xd2\x39\xe4\xa4\xa6\xc0\xa0\xc8\x14\xaa\x64\xc2\xf2\x12\x15\x0c\xd1\x50\x28\x73\x2a\xa8\x02\xe0\xe1\x17\x91\x44\xde\x60\x09\xc9\x03\x13\x28\xc8\x64\x09\x33\x1e\x22\xd0\x69\xb3\xc2\x31\xbc\x29\xb4\xcd\xca\x04\xdb\x8e\x85\xf1\x87\x2f\xc1\xe4\x4c\x1b\x2e\x6d\xcb\x98\x5d\x76\x22\x1f\xd9\x7e\x31\x5d\x01\x50\xd0\xcb\x06\x63\xb0\xa9\xfb\x45\xb2\xbf\x6c\x98\xf9\x09\xc5\xe0\xfc\x14\xca\x05\xc8\x97\x0d\x3b\x3b\x4f\xac\x92\xfa\x29\x76\x76\x5a\x28\x08\xde\x44\x7b\x4b\x6d\x72\xc9\x6b\xca\x53\x0c\xcd\x63\x1c\x8e\x55\xa8\x72\xd8\x2a\x29\x97\xe5\x33\x77\xbe\xdb\x9e\x4c\xf0\x1c\x48\xe3\x0e\x3e\xbc\x1b\xad\x24\xa3\x5f\xd7\xea\x8e\xaf\x9e\xe1\x64\x6b\xce\xf5\x3e\x54\x94\x4f\xa5\xeb\xe7\xe9\xfa\x2a\x1d\x3f\x28\xd2\xaf\x9b\x27\xa3\xb5\xa0\x52\x91\xcb\x93\xe7\x6e\xf5\xb6\xa5\xa6\xf2\xf9\x4f\xc1\x51\x15\xa6\x7a\x3a\x54\x2c\x6a\x22\x21\xca\x21\x99\x90\xa8\x12\xb9\xa0\x90\xa8\x51\x51\x33\xf9\xf4\x27\x3c\x4a\x54\xea\x99\x3d\x3c\xe2\x80\xc1\x31\x83\x53\x0c\x15\x7c\x89\xf2\x2d\x78\xf7\x25\x71\x03\x2f\xe4\xa8\xb6\x78\x73\xe5\xef\x92\x93\x6e\x10\x92\x10\x8f\x1d\xe2\x18\xb9\x3d\x91\xc2\xc2\x0c\x76\x0a\xd7\xad\x27\x37\xfd\x3e\xaa\xf6\x68\xd2\xca\xbd\xfa\x68\x65\xad\x51\xe9\x90\x5b\x4e\x91\x27\x82\xef\x03\xf6\xd9\x5f\x70\x0b\x87\x73\x2c\x11\x63\x89\x18\xb3\xe6\x5f\xa7\x16\xa0\xd9\xb5\xa0\x9e\x42\xcf\x49\xc2\xfe\x24\xf3\xb7\xd9\xdf\xce\xfc\xb4\x94\xa8\x0c\x1d\x6f\xeb\x08\xd8\x93\xaa\x3d\x97\x50\x8e\x66\x2b\x4d\xc1\x19\x92\xf2\x83\x79\x8a\x09\x4b\x59\x81\x2b\x38\x73\xb6\xb1\xee\xe9\x57\xd7\xb8\x9d\xc8\xaf\xae\x11\xfe\x76\xe6\xe7\x62\xb7\x13\x9b\xab\x95\x40\x5b\xc7\xf2\xfa\x9a\x63\x9a\xbf\x96\xdb\x2c\x0a\x5f\x5d\x42\x6a\x6b\xa2\x67\xfc\xd9\x9d\x25\xa8\xc8\x56\x66\x9a\x03\xc4\x65\x58\x1b\xdd\xa5\x27\x53\xda\xf3\x61\xb7\xb3\xe7\xbf\xbf\xc7\xe0\x86\x21\x0f\x3e\x96\xe2\x02\xa1\x08\xd0\x58\x69\x17\xdd\x12\x86\xb7\x6f\x27\xcc\x3b\x83\x14\x5c\xb2\xa5\x04\xac\xe2\x42\xba\x68\x1f\x6c\x16\xbe\x1d\xe7\xe9\x68\x48\x3a\x5c\x51\xc7\xcf\x8c\x57\x2b\x4f\xc2\x0e\x5b\xd8\xd3\xd9\x92\x2b\xd5\xc3\xa4\xa3\xb7\x7e\xf7\xb9\x9c\xd8\x22\x45\xa6\x74\xe3\x18\x55\xaa\xdc\xf1\x54\xee\xe8\xd3\xdc\x2c\x32\xa4\x78\x3a\x68\xb5\x7b\xda\x09\xde\x42\x06\x07\x35\x8f\x60\x15\xfd\xc2\xfd\x1a\xc0\xfd\x1a\x80\xc7\xf2\x83\xd6\x41\xdb\x86\xaa\x22\x61\x8d\x1b\x56\x65\x81\x4e\xf6\xe4\x97\x8a\x2a\x34\x35\x36\x8a\x8a\x55\x51\x99\x38\x14\x9a\xaa\x5c\xb1\xb3\xdb\xc4\xe0\xed\x36\xb3\x91\xfc\x22\xbe\xc2\x3c\xed\x36\x15\x43\x5b\x61\x9a\xcc\x64\x3c\x4d\x85\x64\x00\x4b\x45\xed\x33\x85\xe6\x9e\x0d\x98\x1c\x1f\x4d\x19\xbf\x60\x75\x0f\x30\xbb\x88\x97\x6c\x5b\x11\x3c\xe5\x69\x7e\x52\x81\xe9\xde\x39\x0a\x70\x0e\x46\x25\xb5\x74\xc1\x16\x26\xba\x0f\x0a\x3a\x66\x6e\x6b\xc5\xeb\x11\xde\x03\xa0\x3c\xac\xb7\x2f\x7a\x2f\x47\x43\x28\x34\x46\xae\x72\xc8\x5e\xad\x02\xc5\xb4\x05\xcc\xe3\x1a\xe8\x41\xa5\x7b\xa5\xb1\x7f\x7e\xd6\x0a\x84\xa8\x75\xf0\x24\xbc\xb0\x50\x0d\xff\x2c\x03\x40\x43\x45\x07\x85\x2e\x2d\x71\xec\x58\x44\x6d\xe4\x77\x19\x80\x5e\xe2\xc7\xd5\x85\x55\x50\xf0\xf3\xb2\xaf\x0a\x6c\x25\x07\x23\xcd\x56\xb2\x3f\x72\xcd\x2d\x7c\x3d\xcd\x6e\x20\x8c\x05\x9e\x3c\x38\xc1\x24\x02\x8b\x18\xf2\xb3\x13\xfb\x52\x89\x4b\x1a\x4c\xbc\x3d\xc4\x2b\x85\x32\xaa\x93\xe2\xe1\x89\xf0\xaa\xeb\x12\xbb\x2c\xc7\x6b\x13\x9c\xf5\xb2\x50\x4f\x87\x2a\x81\xf2\x4c\x6d\xfd\xf3\xd8\x2d\xce\xa6\x46\x78\xab\x4a\x01\xd0\x23\x5b\x9b\xdb\x5b\x7f\x69\x0d\x6e\xc0\x12\x08\x5a\x1e\x54\x2e\xaa\x29\x96\x52\x5e\x3e\x28\xa5\x57\xed\x99\xa5\xdc\x98\xa5\xb4\xcd\x52\x14\x52\x26\xc9\x36\x61\x14\x6a\xbd\x1f\x79\x1b\xdd\x51\x27\x6c\x75\x92\x8d\xee\x4b\x49\xd5\xd4\xee\xa8\x43\x69\xcc\x82\x52\x2a\x34\x55\xa1\x2f\x14\x9a\xcf\x8e\xc4\x1d\x74\x0b\x39\x64\x62\x25\xea\xb0\x5b\xcc\xa6\xed\xa0\x5d\xb8\xaa\x2e\x25\xe5\xaf\xfc\xa9\xf2\x8f\x94\xff\xa0\xbb\x52\x48\x37\x54\xe1\x87\x2a\x9c\xd2\x6b\x11\x43\xba\xc2\x0b\xfb\x49\xd8\x03\xcf\x26\x3b\x5f\xd7\xb4\xcd\xe9\x28\xf0\xdc\x48\x59\x55\xbb\x70\x63\x63\x89\xdc\xd5\x0a\xb2\xfd\xb7\x7d\x9d\xf9\xc4\xd3\x8b\xea\xe4\x5e\xcf\xe5\x99\x70\x8c\x4e\x6a\xee\x1d\xeb\x52\x3a\x2b\x98\xcd\x2e\x2a\x36\x3a\xc1\x83\x7e\xcd\xd9\x7e\x9e\x63\xd1\x9a\x96\x20\x54\xf5\x78\xaf\x45\xa3\x6b\x35\xe7\x6e\x3c\x1d\xb2\x38\x13\xd2\xd9\x9e\x49\xb3\x35\x1d\xe2\xcd\xa4\xb9\x9d\x49\x53\x9b\xcd\x15\x17\x43\xbe\xd4\x3e\xb2\xad\xaa\xf5\x83\xbd\x35\xb1\xe0\xca\x6f\x4f\xad\xe8\xb9\xd6\xea\x84\xdd\xe7\xe3\x6e\x18\x95\x47\x3b\x76\x1e\x02\xe3\x8c\xf6\xd3\xaf\xa5\x9b\xe8\xb1\x87\x0a\x30\x35\xfc\xb7\x7d\xda\xe0\x78\x5a\x55\x4a\xf1\xce\x08\x49\xed\x80\x4c\xef\x39\x5c\xbb\x93\x17\xe1\x74\x46\x0f\x51\xbf\x15\x1c\xb7\xd4\x72\x95\xb4\xb6\x91\xf5\xa0\xfb\x17\x59\xbd\x17\xd7\x48\x6b\x65\x6d\xd8\x9f\x6a\x43\xaa\xda\xf0\xf4\x0b\x6d\x48\x8b\x6d\x38\xec\xfe\x45\x56\xa3\x0d\x94\xd6\x54\xfc\xb0\x98\x2d\xd7\xbb\xf9\xd6\x48\xce\x95\xaa\xd6\x9f\xa5\xc5\x9a\x7d\x57\x83\xde\xaf\x45\xa5\xf7\xcb\x5c\x6e\xc5\xab\xda\xc9\x7d\xc9\xfa\x04\x2e\x28\x48\x9e\x29\x97\xa3\x79\x7f\x29\x03\x98\x8f\xcb\x00\xda\x5b\x61\x79\xd5\x4e\x23\xa8\x79\x99\x5e\xc3\x86\x2a\xae\x73\x83\xda\xfb\xc2\xe0\x75\x9c\xb5\xf8\x8d\x8a\xf0\x57\x94\x0f\x54\x0b\x3a\x60\x32\xef\xd8\xc6\x2b\x09\x55\xa5\x16\x47\x6b\xbb\x04\x16\xc3\xe9\xad\x51\xe8\xfd\xd4\x62\x9e\xd6\x83\xf5\x2b\xfd\x85\xd9\x0f\x1f\x0a\xd5\x68\x17\xb4\xb6\x67\x97\xbe\x9a\xa0\x8a\x10\x67\xa7\x06\x13\x5c\xbf\x38\x01\x8c\x3a\x6f\xfb\x62\x6e\xef\x60\x54\x48\x8d\xfe\x66\x5d\xdd\x0a\xf9\x15\x8b\x00\x69\x16\x67\xad\xb0\xdf\x17\x65\xd3\xed\xce\x4a\xc8\xcf\x0d\x04\x19\x43\xdb\x57\x0a\x5e\xa0\xfb\xfa\xfc\x02\x5c\xbc\x42\x0e\x8e\xd9\xbf\xec\x11\x1c\x15\x26\x29\x02\x7a\xb8\xe3\xe0\x49\x14\xd2\x55\xa1\x58\x91\x72\x5d\xc2\xa3\x56\xbf\x87\xb4\x18\x17\x90\xc4\x42\xf9\x2e\x0a\x23\x88\x1e\x4f\x02\x59\xf2\x79\x3b\xc7\x59\x3b\xd3\x88\xa9\xf5\x2f\x79\x3b\xc7\x68\xe7\x0b\xb7\x93\x35\xac\x77\x56\x02\x6e\x30\x41\xea\x20\x6b\x27\x44\x1b\x2e\x8c\x76\x46\xec\xa7\x76\x0e\x2f\xa0\x0b\x24\x6b\x64\x88\x46\x06\xba\x91\x68\xf2\xf7\x20\x6b\x24\xbf\x01\xd0\x71\x84\xc2\xe8\x78\x51\x2a\x48\x59\xa1\x69\x81\xf3\xd4\xbb\xfd\xe5\x9d\xe2\xdd\xaa\x9d\xe2\xdd\xfe\xe7\x77\xca\xf6\x88\xb7\x0a\xac\xe3\xd3\x52\xde\xfc\x4a\x7b\x65\xeb\xab\xec\x95\x2f\xbf\xb0\x59\x7e\xa1\x56\x3b\x5f\x61\xfc\x5d\xff\xca\x8d\xd0\xbd\x74\x36\xbf\xf2\x96\xcb\x16\xd9\x57\xde\x7b\xd9\x62\xf4\xd4\x6c\xe8\xf8\xed\x91\x9d\xe7\xd4\x9c\x4d\x4d\xc7\xf3\x07\x46\x92\x15\x23\x49\xf6\x98\xc0\xe6\x2d\x98\x77\x17\xfc\x8b\x23\xe0\x91\xc5\xa2\xd3\xd4\xce\x5b\x61\xf1\xba\x30\x8b\x4d\xd3\x15\x23\xda\x2a\x33\x1e\xca\x08\xa1\x9b\xa3\x1b\xf5\x3d\x98\xc4\x86\xfc\xfd\x5b\x1a\xc5\x43\xc2\x44\x61\x45\x23\xb0\x9f\x5b\xe1\xb0\x59\x0e\xed\x66\xd4\x4a\x9a\x50\xb7\x2b\x0c\xcc\x87\x5b\x76\xb7\xe7\x05\xad\xe1\xb8\xec\x7c\x9d\x7c\x0c\x37\xf4\x94\x01\xba\xd8\xe6\xfa\xf8\x0b\x08\x70\xdb\xb7\xb5\xae\xbf\xc4\x36\xc0\x4b\xc5\x07\x04\x08\xd4\xf0\x15\x1a\xce\x5a\x59\x68\x4f\xc3\x1c\x88\xc5\x37\x46\xe5\x59\x16\xc3\x25\xe8\x35\x6d\x25\x36\x0c\x82\xed\x94\xfb\xc4\x4c\x08\xcb\xc7\x2d\xb8\xe0\xef\x0f\x16\x58\xd9\xbe\x56\x32\x35\xba\xf8\xdd\x27\xac\x47\xf6\xbc\x06\x34\xed\x6c\xb7\xc5\x96\xbc\x18\x31\xc8\x88\xad\x4a\xb4\xd2\xfe\x9e\xb0\xdd\xb4\x52\x7b\x39\xb2\xfe\xf8\x0a\x05\xba\x2b\x09\x7d\xa3\x65\x37\x81\x54\xb3\x0f\x88\xd0\xa6\x0f\x41\x84\x68\x82\x2a\x86\xaa\x0a\x4f\xa0\x83\x5e\x3c\xac\x28\x3d\x50\x85\x8b\x67\xc5\xd3\x85\x7b\xcb\x01\x0a\xf7\x54\xe1\x81\x1b\x2d\x27\x2c\x34\x8e\x7d\x0c\xfe\x12\xda\xc7\xc1\xd4\x3e\xae\xd1\x32\x9e\x02\xe0\x9e\xd8\x0f\x99\x73\x8b\xa0\xd6\x8c\xdd\x8f\xae\x10\xa6\x91\xe9\x5f\x87\x09\xbe\x86\x09\xbe\x82\x09\x26\xda\xf5\x9f\x3c\x3d\x07\x81\x87\xe3\x8e\x0a\x18\x10\xf2\x28\x12\x42\xfb\x01\x8b\x8a\x4e\xe3\x76\xff\x53\x00\x31\x1f\x2c\x50\x25\x1a\xb4\xa3\x52\x8d\x49\x93\xd7\x2e\xb4\xc6\x9a\x3a\x76\x8b\xb8\xe5\xff\x72\xfb\xd0\xa6\x99\x73\x6c\x9a\x67\xea\xda\x4a\xc9\x68\xf1\x8a\xd1\x62\x31\x27\x52\x38\x2c\xf9\xf0\xa1\xb3\x31\xa8\xf0\x59\x16\xac\x94\x68\x19\x02\x05\xfc\xc3\xaf\xf0\xb1\x16\x2c\x87\xe4\x9c\x39\xbc\x58\x7d\xf9\xa1\xe4\x4b\xb3\x7c\xa9\xca\x77\xa8\xf3\xfd\xdf\xaf\xd0\xe0\xe3\x15\x4a\x8b\x32\x90\x45\x19\x60\x49\x4e\xe1\xef\x45\xa4\x84\xef\xbd\x6b\x96\x8c\x02\x90\x01\xe9\x7d\x86\x16\x48\x37\x71\xfa\x4a\xf7\xb2\x73\xd8\xec\x62\xde\xaa\xf0\xd3\x56\x85\xd2\xaa\x90\x5b\x65\xde\x33\xa6\xd1\x2e\x82\x95\xe1\x2f\xad\x57\x9a\x7f\xde\x35\xa1\x65\xbd\xf9\x10\x90\x37\xb1\xad\xd5\x1f\x34\xe9\xcd\x28\x4a\xb7\xa2\x74\x28\x5b\x22\xc4\x72\xf8\x01\x73\xad\x3d\xfd\xc2\x5c\x61\x13\x23\x1c\xf1\x7b\x88\xfb\x9f\x1c\x53\x59\xea\xef\x94\xfa\x75\x6d\x36\xf1\x1f\x2a\x71\x01\x57\x23\x18\x16\xd2\xf8\x2d\x87\xbc\x94\xbe\xda\xd0\xe1\x40\xb0\x56\x32\x7c\xad\x84\x8c\x37\xad\xc4\x95\x90\xe1\xe4\x72\x86\x3b\x05\xc8\x77\x88\x7c\x29\xe7\x83\x45\xd9\x61\x96\xcf\x0e\x65\xad\x45\x50\x8e\x88\x25\x36\x8d\xcb\xa0\xea\x1b\x28\x8f\x79\x6b\x0d\xb6\x3b\x9e\x9f\x46\x61\x79\x4a\x45\x83\x73\x59\x7a\xde\x99\xd2\x60\x0f\xd1\x75\x79\xa7\x5f\xa4\x8f\xbd\x41\x83\xa4\x08\x28\x50\x22\x39\x18\xf6\x47\xc1\x90\x4e\xc6\xc5\xda\xc4\xfe\xd5\x82\xcd\xf2\x36\x3f\x28\xcf\xbb\xfd\xf5\xf2\xe6\x36\xf4\x7c\x3c\xbf\xe0\xe0\x6f\x14\x5c\x68\xe8\x8b\x67\xd9\xd3\x85\xf9\xff\xdb\x56\x5e\x7d\xd0\xca\xf0\x76\xd2\x30\x88\xc7\xd3\xe2\xb2\x54\xf2\x49\x13\xe4\xac\xde\xbe\x95\x19\xf1\xde\xf4\x3a\x30\xde\x3d\x82\x4d\x93\x97\x1e\xa1\x2b\x51\xff\xb7\xe7\xd6\xb0\xf9\x9b\xf7\x5b\xaf\x15\x89\xed\xee\xff\x4f\xc1\x5f\x7f\x96\x30\x71\xdb\x17\x49\x9b\x69\x2a\x85\xa6\x7a\x28\x72\x85\x78\xc6\x5d\x3c\x05\xdd\x66\x42\x39\x35\xb7\xc6\x4f\x79\x53\x34\x0a\x0d\x49\x94\xe2\x59\xc7\xb7\xbd\x91\x67\xff\xd3\xaa\xac\xfd\xf0\xf8\xbc\x5f\xfb\x43\xb1\xbb\xfb\x46\x9a\xc5\xa1\x67\x3b\x5f\xbf\x51\xaa\xef\x3e\x23\xf1\x6b\x7f\xf8\x9a\xe9\x2c\x4f\xe5\x53\x49\x6b\xce\x37\x40\xe9\xfd\x2c\xf0\x6e\xc8\xe6\x1c\xf3\x16\x47\xcf\x4c\xb7\x13\xbf\x9d\x81\x8b\xcc\xe4\x7c\xe5\xae\xa4\x3a\x54\xe0\x89\x23\xac\xf4\x59\xdf\xb0\xb3\x27\x38\x43\x4b\xc9\x6d\x91\xe1\xe8\xcc\xa0\x01\x06\xec\xcf\xa9\x80\xa1\x8e\xf7\x45\x61\x30\xc7\x41\x46\xcf\x5d\x50\x11\x6b\x2b\xe0\xe3\x0c\x73\x7b\x60\x0b\xa1\xe3\xf5\xa8\xa0\x05\x95\x7a\x6d\x25\x68\x64\x52\xf1\x9c\x20\x42\x02\x94\xe6\xd3\x52\x78\xda\xb1\xea\xeb\xeb\xb0\x8a\x24\x1c\xf0\xee\xc2\x5a\x59\x54\x26\xf0\xe8\x2d\x30\xe8\xc6\xf4\xd2\x60\x5c\xb1\xce\x89\x00\xfd\x26\x60\x50\xec\x73\x3d\x51\x66\xb0\x1d\x20\x18\x6a\x58\x98\x07\x8e\x32\x32\xe7\x53\x49\xad\x19\x3d\x90\xb6\x5a\x39\x16\x5b\x3c\x9e\xcc\xdc\x75\xe6\x0c\xae\x8f\x57\x4b\xef\xb5\x94\xbf\x6c\xce\xde\xf2\x3f\xca\x76\x37\x2e\x66\x5b\xfc\xb5\x6c\x8b\x53\xd9\x6a\x5b\xbf\x94\xad\xb6\x65\x66\xfb\x52\x9b\x3d\x8d\xe6\xe4\x0c\x98\x8d\x64\x8b\xe3\x8d\x2a\x67\xe8\x07\x1f\x65\xf5\xe2\xe9\xac\x05\x54\xf1\xb3\xac\x9d\xed\xe9\xac\x8b\xbf\xda\xe0\xc5\xd9\x06\xff\x6a\xad\xde\x54\xad\xd8\x12\x3f\x3f\x39\x66\x32\x89\x12\x5e\xb7\xf3\x60\x1f\x41\x12\x13\xf8\xdd\x99\xc0\x4f\x01\x2f\x05\xb2\xba\x1a\x48\x11\xb8\x0a\xa6\xc0\xd5\x2b\x43\x28\x49\x2f\x46\x4b\x2b\x8b\x19\xb8\xca\x29\x60\xb2\x8f\x69\x1f\x81\x7d\xe6\xe7\xbc\x1d\x01\x2e\xac\xd9\x8d\xf1\x3a\x6f\x63\x74\x8b\xfb\x42\x29\x5b\x3d\xd3\xbb\xc3\xbd\xd3\x30\x72\xfe\xc2\x7d\x9d\xbf\x70\xad\xca\xd9\x99\xaa\xdd\xb7\xd7\xbe\x7d\xb2\x61\x66\x0a\xb8\x9b\x2d\x40\xf2\xcf\xdf\xa7\x33\xf9\x65\x9f\xce\xc9\xff\xd1\x56\x78\xfd\x68\x2b\xcc\x94\xf1\xe5\xa3\x7d\x38\xd3\x08\xd9\x87\xf3\x3a\xf1\xc1\xa6\x9a\x69\x84\xde\x54\x9f\xee\xa7\x99\x5c\x7a\x3f\x7d\xba\x95\x66\x72\x2d\x7e\xd4\xe1\x8f\xf7\xd4\x6c\x7b\xb7\xe7\x94\xa1\x66\xbe\x78\xbc\xce\x29\x41\x9f\x5e\xdc\xf0\x6c\xa1\x47\xb7\xc5\xb7\x2b\xb5\x59\xbc\x0c\x0b\x50\x3b\xe9\xb8\xa3\x77\x52\x33\xd6\x5b\xc9\x17\xd5\x3f\xa7\x67\x25\xd8\x1a\x1f\x0a\xc2\xae\x62\xb4\x44\x71\xd7\x8d\xb5\x0b\xe9\x55\xac\x2a\xfd\xb6\x04\xcc\x3e\xba\xb5\x47\x43\x5c\x82\x23\x75\x09\xde\x30\x7b\x72\x21\xe5\x52\x03\xac\x4a\x74\xeb\x44\xce\x86\xbe\x1b\x70\xb7\xcf\x1e\xbd\xc2\x62\xd9\xf0\xf4\x59\xa4\x4c\x63\x2c\x36\x9c\x17\x7f\xce\xa0\x9f\x9b\x19\xe5\x65\xe2\xf2\x17\xcb\x52\xc3\xc0\x8f\xa5\xc1\xbe\xfd\x36\xf4\xfa\x74\xcb\xd8\xdf\x2a\x73\x8a\xd7\xc8\x7e\x29\xab\xb4\x72\xff\x56\xee\xb1\xac\x98\xab\xa9\x5a\xcc\xd2\x5a\x2f\xde\xdf\x2b\x8e\x76\xcb\xc5\x54\x79\x82\x7b\xfc\x7a\x29\x85\xee\x34\x5f\xf2\xdb\x3b\xcd\x18\x6d\x10\x9f\xfb\x5d\x8f\x1e\x1b\xdc\xfa\xc3\x4f\x5a\x9f\x0c\xfe\xee\x58\xdc\x4e\x95\xe6\xfd\x4f\xdb\x0d\x23\xa3\x79\xb3\x05\x32\x50\xf9\x47\x9f\xb4\xd6\xdb\xf9\xbb\xad\xfd\xf9\xbf\x1b\x69\x3b\xbf\x4f\x4a\x60\xee\x2f\x76\xc6\x3b\x30\xe7\x80\x20\x65\x61\x0e\x68\xca\x4f\xfe\x53\xc3\xb6\x4d\x68\xb1\x31\x6e\x02\xd6\xa9\xa7\xa7\xff\xa9\x0a\xda\x3b\x66\xf9\x72\xec\x50\xf9\xc7\xff\xa9\xf2\xb7\x8a\x1d\x58\xd4\x15\xdc\xcc\x9b\x78\x4a\x40\xb0\xfb\xd7\xe7\x4b\x91\xa7\x24\x64\x3b\xf4\x26\xc5\xad\x50\xfb\xa0\x0e\x82\xf4\xff\xa1\x3a\x60\xf5\xe5\x83\x4a\xbc\xff\x60\x47\xf6\xe7\xd5\x71\xe2\x89\x46\x5e\x16\xd0\x74\xe2\xfb\x02\x04\x5d\xe5\x7c\x07\x45\x10\x3a\x05\x2e\x45\x00\xb4\x58\x16\xa3\x5b\xb3\x05\xed\xcd\xdd\x58\x72\x14\x55\x8c\x32\x9d\xd1\xad\x6b\x78\xc1\xbf\xae\x05\xbd\xb2\x66\xde\x4c\x0b\x20\x4f\xa9\xa9\xc7\xf5\xf2\x2c\x6b\x28\xb4\x52\xfb\xca\x44\xe0\x68\x08\x22\xf1\xab\xeb\x6e\x34\x2d\xdb\x68\xe4\xaa\xc5\x8d\x7c\x0d\xe7\x8c\xd2\x99\xd3\xf6\x17\x58\x08\x58\x17\x99\x29\x79\x91\x16\xdd\x9d\xdb\xc5\xfe\xca\xb4\xae\x87\xde\x0c\x7d\xf3\xb3\xb2\x98\xb9\xc7\x28\xe8\xeb\x37\xd5\x2a\xbf\xff\x79\xab\xbc\x53\xad\x3c\x59\x5a\x33\xaf\x67\xc1\x54\x19\x42\x91\x30\xda\xb0\xbb\x59\x6c\xd3\xee\xa6\xbb\x9a\x4f\x2d\x07\x2c\x4b\x77\x77\xbb\x5e\xa5\x50\x01\x1b\x66\xf2\xbc\xb9\xe4\x65\xdd\xcc\xe2\x84\x3b\x9b\xaf\x95\x3c\x45\xd8\x72\xdd\x58\xac\x24\xb7\x76\x2c\x63\x35\xf5\xd4\xca\x1c\x05\x53\x03\xcc\x44\xd3\x5d\xbf\x30\xbe\xf3\x6b\xf4\x3e\xad\xd1\x9b\x53\xe3\xbc\x69\x10\xeb\x4c\x57\xff\xfa\x6c\x1a\x0a\x45\xcf\xcc\xca\x28\x98\x37\x2b\xf1\xbc\x99\xa5\x45\xa8\x20\x5c\xd2\x9f\x5d\x41\xb4\xaa\x4a\x1c\x19\xce\xcb\xab\x40\x66\x67\x4c\x38\x46\x0b\x66\x9d\xca\x6a\x4d\x28\x4c\x76\x1e\x14\xd0\x6d\x16\xcb\x38\x34\x91\x90\x1a\x2e\xcd\x9f\x06\x23\x94\xcd\xeb\xe9\x2d\x39\xbb\x01\x08\xe5\x9d\xd3\xfa\x62\x5d\x34\x83\x25\xaa\x2a\xbe\x15\x5c\x6f\xce\xe2\xc7\xc3\xe6\x67\x80\x83\x19\xb3\xa5\x48\x99\xc6\xab\x7f\x81\xe5\x3f\x13\xf5\xc5\x0b\x98\x6c\x77\x02\x1f\x6f\xb0\xdd\xa9\xda\xdb\x53\xce\x51\x30\xc9\x54\x2e\x28\xfb\x5d\x95\x50\x94\xa6\x6b\xe1\xff\xea\x14\x2c\xf1\x44\xd5\x7f\x39\x74\x16\x93\xf7\x77\x56\xe4\x5d\xbb\x85\x82\x99\x62\x0f\xfd\x69\x08\xf4\xca\xcc\xf0\xc1\x74\x70\xcd\xd3\x71\x96\x35\xb5\xaf\x78\x95\x2f\xce\xb3\xb1\x86\xa6\xef\xbd\x54\x56\xd6\x16\x58\x92\x5e\x97\x28\x1c\x92\x2e\x1b\x17\x53\x1d\x85\x76\xff\xa9\x95\xc8\x57\xf6\x79\x83\x9e\xcd\xdc\xd4\x66\x46\x35\xaa\xca\xd9\xca\x3e\x00\x5b\x34\x73\xbb\x9f\xcc\x9c\x9d\xcf\x0c\xa8\x64\xaa\xb1\x91\x5e\x68\x1a\xd8\x53\x1f\x7d\xad\x4e\x9d\xaa\x5e\x59\x73\x5d\xaf\x6a\x36\x60\xf1\xc8\x7d\x1b\x05\xe5\xc8\xee\xdd\x94\xc3\xc9\xf4\xe8\x86\x76\xd6\x77\x18\xc0\x64\x69\x8b\x19\xd0\xd5\xec\xcf\x80\x2e\x65\xdf\x49\x35\xc1\x7a\x53\x1a\x79\xb3\x09\x56\x6a\x79\x17\xb7\xcb\x1f\x6d\x88\xca\xdc\xfd\x63\x6a\x9d\x8d\x0f\xca\x7f\x99\x26\x2a\x54\x90\x1f\xd4\x93\x29\x70\xc8\xef\xe6\xb2\xa5\x16\x19\x76\xe0\xa5\xec\x7f\xd3\x2d\xbd\x3a\x3e\x6d\x30\x9f\xf4\xc5\xd6\xce\xc3\x0f\xec\x59\xfc\xc0\x6c\xff\x9f\xc5\x0e\x78\x9e\x86\x7e\xdb\x1f\xa0\x2c\xda\x0c\x89\xf4\xe3\xf6\x79\x0e\xb2\xb1\xf3\x38\x0b\x7a\xcc\x9c\xd3\x38\xca\x57\x95\x6f\xeb\x93\x7c\xb0\x69\xa2\xa0\xbc\x19\x54\xb2\xe6\x15\x54\xbc\xa9\x6b\x84\x8e\x6f\xe6\xf9\xbd\x3c\xbe\x95\x0b\x7b\x71\x40\xbd\xc2\x72\xe2\xd1\xca\x69\xcf\x58\xce\xda\xec\x0e\xe8\xc9\x0a\x76\x15\x15\x02\xfa\x16\x73\xce\x40\x1b\x64\xe2\x39\xfc\x32\xe0\x21\xb7\x88\x68\x82\xc9\xdf\x77\x57\x2b\xfe\x77\xcf\x19\x29\x49\x11\xc9\x31\x6a\xcf\x66\xd1\xf2\x3a\xb0\xca\x83\x5b\xc9\xed\x2c\x81\xdf\x64\x27\x45\xc3\x8e\xb2\xdb\xbc\xed\xd9\xb7\xa5\x40\x33\x18\x2b\xfe\x51\xaf\x54\xeb\x2b\x22\x32\x5d\xec\xe1\xbf\xd5\xfe\x73\xf1\xdf\x69\xff\xa5\xf8\x17\xb5\xff\x4a\xfc\x3f\xb5\xff\x42\xfc\x17\xda\x7f\x28\xfe\x68\xa0\xfc\xb7\xe2\xbf\xd4\xf1\x47\xe2\x8f\x75\xfc\x4f\xf1\xdf\xe8\xf8\x13\xf1\x5f\x69\xff\xa9\xf8\xaf\xb5\xff\x58\xfc\xa1\xce\x7f\x23\x7e\x5f\xfb\x6b\xe2\x0f\xb4\xff\x5a\xfc\x27\x3a\xff\xbe\xf8\x4f\xb5\xff\x40\xfc\xc7\xda\xbf\x27\xfe\x87\x67\xe5\x27\x4c\x00\xfe\x8e\xf6\xaf\x8b\x3f\xd5\x7e\x42\x0c\xe1\x7f\xd4\xfe\x40\xfc\xb7\x63\xe5\xa7\xb3\x9c\xc7\x4b\xfb\x77\x7d\xf6\xd7\xb4\xff\xea\x5f\xf0\xb6\xb5\x37\x96\xec\xa9\xf6\x27\xe2\xbf\x27\xbf\xe2\x88\x95\x80\x60\xa8\x12\x2c\xaa\xf1\xd0\x7e\x4f\xe2\x7d\xed\xbf\x93\x78\x9a\x66\x55\xff\x22\xbc\xe7\xda\xeb\x49\xf3\x4e\xb3\x68\x95\x7c\x5d\xf9\x9b\x52\xdc\xb9\xf6\xb7\xc4\xff\xac\xd3\x6f\x4b\xfa\x17\xed\xdf\x11\xff\x93\xf6\xd3\x6e\x36\xb7\x9b\x77\xea\x99\x0f\xc9\x9e\xa0\x0f\x81\x6c\x94\x5a\xa2\x85\xbb\x02\x7d\x2c\x45\xae\x8a\x1b\x0d\x21\x7c\xee\x33\x47\x3b\xe1\x02\x9e\x3e\x5d\x22\x3b\xb4\xca\xfe\x54\x80\xc9\x39\x96\xf0\x06\xbf\x18\x99\xb6\x42\x65\xe2\x9a\xc6\x7b\x5a\xea\xbb\x57\x89\x38\x6b\x4a\x56\xeb\x5c\xbd\x73\xeb\xd3\x52\x3e\xeb\xdf\x8c\x5c\x0f\xc7\x19\x8d\xfb\x48\x89\x02\xdd\x2a\x64\x77\xf0\xac\x11\x7b\x23\xfd\xb1\x58\x25\xb8\x1a\x8a\x77\xd7\x88\x6a\x8a\xbe\xee\x5a\x4d\xc1\x7c\x59\xab\x1d\xcd\xc0\x92\xdc\xda\x17\x23\xd0\xee\x92\x79\xb4\x3b\xa9\xb1\x49\x60\xf0\xd9\xa0\xe2\x25\x73\xa8\x78\xaa\xcf\x74\x71\x3f\x9a\x11\x7c\x31\xb4\x0a\xea\x01\xe2\xe1\x6e\x32\x2b\xc0\xcd\x51\xfd\x32\xd0\x43\xd8\x4f\x46\x30\x5a\x3a\x50\xb6\x5d\x39\xe5\xfd\x2e\x9b\x18\x2f\x58\x09\x65\x33\xe3\x97\x37\x46\x08\x1f\x8b\x67\x37\x73\x2a\x17\xad\x63\x1f\x37\xe0\xec\x66\x6e\x03\x50\x43\xc1\xea\xdd\x2a\x15\xc3\xe7\xc8\xda\x1c\xd1\x9e\x8f\x8b\xdf\x5a\xfb\xb0\xf8\x87\x5c\x4d\x34\x13\xb0\x8f\xe7\x2b\xff\x99\x53\x68\xe7\xf8\xc3\x42\xf7\xae\x85\xc6\x4c\x05\x9e\x84\x73\x5a\xaa\x4b\xf3\x94\x24\x68\x86\x62\xb6\x06\x1e\x9d\x2e\x2a\x34\xd0\xa1\xb4\x80\x33\x5d\xcc\x99\x6a\x49\x5a\xac\xd2\xe4\x87\x64\x8a\x0e\x24\x87\x28\x5e\x4e\x16\x5c\xb7\x79\xab\x33\xfc\xfb\xdf\xbd\x7e\x77\xd8\xfd\xf7\xbf\xab\x53\x7e\x97\xfb\x63\x6f\x2b\x44\xae\x79\x2b\x18\x05\x0a\xc8\x36\x16\xe7\xe8\x43\x65\x97\xac\xfc\xb0\xd4\xdb\x67\x2c\xd4\x7b\x34\x19\xeb\x4d\x06\x7d\x6a\x57\x89\xb5\x14\x68\x6d\x8e\x78\x50\xaf\xd0\x66\x3d\x6c\xd4\xfd\x7e\x63\x9a\x3b\xc5\xc2\xe2\x79\x78\x98\x33\x5a\x9d\x6e\x69\x6b\x03\xc2\xf6\x81\x52\x88\xbc\xd3\x2d\x6d\x76\x4b\x2c\xd9\xab\xb1\x4f\x68\x61\x36\xdc\x5d\xb0\xb6\xb1\xde\x32\x65\x5f\x3f\xf5\x21\x37\x3d\x6c\x46\x0f\x80\x3a\xfc\x55\x31\xeb\xdf\x34\xc8\x58\x70\xcf\x97\x96\x22\x2a\x25\xc8\xc5\x08\x11\xda\xdb\x5f\x5a\xda\xeb\x94\xa0\xd7\xfd\x29\xea\x0f\xa2\x4d\x6f\x18\x25\x5d\x58\x71\xb3\x34\xd3\x89\x52\x91\xe6\x5e\x34\xab\xde\xb0\xec\xef\x56\x02\xc8\x40\x06\x5a\x93\xf5\xe0\xb9\x04\xb7\xbd\xb2\x46\xcd\xd4\x36\x12\x66\x4a\x9b\xc4\x52\xf7\x60\xe8\x3c\x04\x25\x3d\xe2\x4a\xfd\x82\xe6\x44\xd8\xd9\xb4\x40\x9e\xe9\x41\xf0\x75\xaf\x64\x59\xf3\x88\x34\xbe\xf3\xd0\x27\xaf\xeb\xfa\xfb\x4c\xab\x09\x68\x5d\x6d\xb5\xe2\xd8\x5d\xd0\x14\x87\xfe\x33\xdd\x0e\x60\x78\x77\xc1\xbd\x82\xd9\x4f\xc5\x38\xd6\xa2\xd0\x63\x82\x34\xc9\xa9\x56\x18\xca\x00\xbc\x35\xb8\x1c\x7a\x41\x3b\x0a\xa1\xde\x83\x59\xe1\x33\x87\xe3\x13\x62\x9a\xb6\x3a\xd1\x0c\xab\xc4\x20\x1a\xfe\xe6\xfd\xd6\xe9\x76\x56\x5e\xa3\x7e\xf7\x37\xa4\x5b\x41\x42\xe0\x47\x14\x31\x90\x12\x33\xce\x89\x2f\x22\x49\x9b\xcd\x0d\xf4\x92\xb5\xd8\x1a\x48\x29\x76\x59\x31\x66\x2e\x88\x2b\x76\x44\x60\x85\x25\xd6\x36\x58\x84\x7f\x12\xcd\xed\x52\x2e\x18\xa8\xb5\xda\xee\xc3\xa1\x27\xee\x4c\x59\x47\x27\x8f\xc4\xb7\xa2\xd0\x62\xd5\xf2\x2b\x54\xfd\xdb\xa0\xd9\x1d\xa5\xe1\x6f\x7e\x44\xad\xe4\xc6\xfc\xd6\xf1\xe8\x07\xad\xee\xfc\xd6\x15\xf9\x8a\xdf\xba\xfe\x7d\x14\x0c\x9d\xff\x0f\xda\xd9\x36\x1b\xa5\xb6\x35\x81\x9e\xbc\xbd\x46\xbd\x17\x01\x63\xbd\xd9\x87\xd8\xb1\x92\x2f\x13\x8f\x4a\x59\xdb\xcf\xce\x28\x3e\x14\x36\x3a\xa5\x28\x3f\xb4\x16\x33\x66\x8b\x93\xa6\xbd\x61\x98\xbd\x3c\x77\x5b\x5d\xbd\x24\x14\x6e\xa2\x0d\x62\x7a\xee\xfd\x6c\x94\xd8\x22\x3f\x6b\x2b\xce\x39\x65\xc8\x0b\x37\x77\x83\xa1\xe3\x74\x47\x56\x97\x3a\xdc\xd4\x86\xb8\xa5\x5b\x44\xdb\x1a\xf6\xc7\x6f\xfa\xd0\x63\x65\x88\x47\x59\x1d\x01\x6d\x59\x02\xf6\x81\x87\xbb\x4d\x8a\xdd\x2e\xe3\x77\xd9\xa3\xf2\x8d\x9b\xc6\xad\x57\xdf\x58\x6f\x94\x82\xec\x54\x3e\xd1\x66\xea\x4b\xa1\x0a\x19\xba\x5f\xd4\x3b\x16\xd5\x7a\xf7\x58\xba\x55\x0f\xe1\x7d\xc1\x65\x6d\x75\xd5\x1a\xf7\x3f\xe2\xe9\xf5\x9c\x7b\xd6\x04\x93\x79\xd3\x75\xb0\x59\xeb\x73\x1b\x8c\xcd\xca\xe9\x1c\x7c\xd3\x48\x2e\x6d\x9b\x72\xa0\x29\x1c\x39\xdb\x2f\x8d\x88\x92\x1a\xbf\x51\x9d\x1d\xd2\xa1\x43\x28\x86\x73\x1e\xdb\x9a\xfc\x90\x0f\xa5\xb3\xf1\xca\xe6\xa9\xd1\xa5\x3b\x66\x4b\x53\x9d\xb4\x55\x2f\xee\x7b\xaa\x17\x51\x7e\x76\xef\x5a\x19\x7a\x40\xd9\xa2\xdb\x52\x94\xe5\x52\x67\xbb\x42\xcd\x62\x5d\x4a\xda\xe2\x10\x56\x17\x1d\x5b\x45\x34\xe6\xec\x46\xa9\xaa\x9c\x9d\x68\xfb\xcd\xf3\xcb\x91\x93\xb6\xed\xb8\xdb\x19\x5e\xb6\x5e\x61\x9b\xa2\xf7\x30\xb1\x23\x67\xf3\x95\x7e\xc2\x16\xfd\x40\xdf\xab\xc2\xac\xe3\xaa\xfa\x3a\x83\xa8\xfc\xd4\x6d\x85\xbf\xad\x66\xfc\x3b\x0f\xc7\x53\x62\x8e\xac\x6b\x46\x32\x04\xf7\x25\x6d\x05\x3e\xbc\xcf\x79\x3a\xac\x19\x24\x4a\xa3\x5c\x9d\x63\x3c\xc5\x58\x15\xd0\x75\x0e\x30\x6a\xab\xf6\xcd\x2e\x34\xb6\x40\xf3\x16\x63\x81\x11\xfd\x56\xbf\xa8\x5b\xb3\x90\x3f\x42\xf7\xa9\xa5\xd9\x55\x31\x7f\xb6\xc6\xcb\xde\x82\x67\xaf\x1c\xd8\xfb\xdf\xca\x91\xed\x35\x3d\x39\x7d\x4f\xa0\xd1\x37\xb2\xec\x83\x6f\x14\x45\x80\xa6\x3f\xbc\x6a\x3d\x44\x65\x42\x20\x3a\xa1\xb8\x96\xfd\x7a\x6b\xbd\x61\x1f\x7e\x2b\xaf\xda\x43\x0a\xe9\x73\xc6\x9b\x61\x69\x8d\x46\x79\x31\x81\x91\xc6\xd7\x6f\xf6\xe9\x0d\x7d\x4f\x6f\xec\xbd\x6f\xcc\x47\xc1\x75\x9e\x7e\xa3\xda\xf5\x0d\x8c\x56\x15\xe7\xb6\x6f\x06\x7a\xba\x4e\xbf\xa9\x01\xb0\x0b\x29\xea\xe3\x86\x6e\xf5\x99\x1b\x69\xf2\x1f\x39\xed\xa6\x86\xb5\x76\x4b\xbb\xc0\x52\x74\xb2\xc3\x3c\x5c\x70\x94\x2c\xcd\x18\x31\x5c\x5a\xba\x05\x8e\x7d\xae\xce\x6a\x67\x68\x15\x5f\x52\x8f\x34\x76\xb9\xab\xee\xc2\x35\xe7\xfa\x69\x0a\xa3\xc9\x8f\x36\x39\x92\xd5\xa1\xd1\xba\xd5\x4c\xc7\x45\x38\x1e\x74\x1f\x7a\x23\x68\x97\xa0\x03\x84\x61\x37\x32\x0b\xd8\xfe\x0d\x02\xa6\x80\x81\x26\xf7\x96\x2a\x47\x5d\x02\xc4\x78\x39\xb3\xc6\xc3\x98\x3b\xf8\xe9\xf7\x94\x51\x77\x75\xfc\x40\x89\x6c\x00\x73\xe5\x12\x62\xb3\x19\xf3\x55\x2b\x87\xf7\x89\x1b\xb3\x55\xf8\xb6\x9b\x54\xda\xdf\x23\x02\xf7\x6d\x8b\x33\x28\xf9\x56\xca\xd6\xb6\x94\x35\x6e\x4f\xec\x76\xdb\xfd\x6e\x1a\x95\x71\xfa\xd9\x46\x4a\xdf\x4c\xe9\x9b\x29\xdb\x03\xb6\xd0\x13\x6c\x00\x30\x4d\xa9\x21\xa4\xfa\x08\xc6\x29\x4d\xda\x31\xeb\x5d\xf1\x61\xee\x39\xb5\x57\x51\x7a\x10\xc0\xc5\xa6\x29\x73\xe9\xfe\xa4\xd0\xd8\x37\x51\xe9\xec\x49\xae\x36\xd7\x84\x5c\x1d\xbb\x47\x58\xdd\xb2\xbb\x06\xf3\x92\x1f\x46\x4e\x26\x99\x4a\xae\x7c\x90\x03\x7d\xd5\x52\x14\x26\x3f\x37\x65\x75\xb9\x4b\xa3\x40\xf8\xd9\x71\x62\x5f\xee\xda\x57\x09\x95\xe8\x97\x7c\xf5\x92\x64\x10\x93\x06\x5b\x59\xba\xc1\xd6\x27\xe9\xf6\x07\x5e\x96\x70\xe3\xb3\x84\x1b\x5b\x66\xba\x8b\xe6\x47\xe9\xee\xf6\x25\xdd\xdd\xfe\x47\x29\x7a\x2a\x05\x2d\x4e\x3b\x4f\x91\xa9\x11\xf4\x9b\x74\xbc\x01\x57\xcb\x34\xa4\x2a\x02\x33\x0d\xc2\xfb\xfb\x39\x44\xa3\x11\xa9\x64\xa2\xf9\x84\x0b\xc0\xf7\x97\xa3\x28\xd7\x9d\x41\x2f\x0a\x5a\x71\x4b\x23\x20\xd9\x4a\x06\xbe\xb3\xb4\x14\xb2\xbc\x86\x91\x61\xbf\x83\x6d\xe0\x0d\x5b\x7e\x1a\x19\x39\x06\xc8\xc2\x2d\x24\xd4\x34\x34\xf5\xe7\x84\x7a\x82\x40\x40\x67\xec\xf7\x38\x31\x54\x0e\x0e\xbc\x0f\xba\x40\xd0\x17\xa8\xe0\x15\x15\x3e\xbf\x2b\x7f\xd9\xba\x30\x8a\xbd\x51\x0a\xfc\x0b\x05\xe5\xcd\x34\x8b\x06\x26\x1d\x9a\xda\xf4\x80\xf5\x32\xa9\x8c\x85\x2d\x5d\xf5\x15\x8b\xd3\x82\xe8\xb9\xea\x9b\x59\x66\xf1\x75\x2a\x66\xca\xe4\x38\x25\x86\x9e\x19\xdc\xce\x17\x25\xcd\x39\x5d\xfc\xcd\x39\x3e\x86\xf5\x4e\x79\x7c\x55\xc5\xe7\x1e\xd6\x06\x14\x16\x82\x26\xb8\xf7\xdc\x03\xb4\xec\xed\xc1\x44\x6e\xd3\xb2\xd9\x37\x86\x2f\xd2\xbe\xbb\x5d\xf2\xdd\xed\x42\x78\x5f\x27\xdf\x78\xc6\x3d\x82\xc2\x24\xc5\xf6\x3a\xbc\xd7\x07\xb8\x3b\x2c\x2d\x71\xd0\xed\x01\x61\x34\x14\x42\x3d\x1d\x3c\x74\xbb\xc3\xe6\x11\x61\xa9\xb4\x5e\x44\xc1\xd0\xa8\xff\x14\x61\xc8\x44\x9a\x2d\xf3\x62\x3a\x2b\x9c\xfd\x89\x2a\xf0\xec\xeb\x5d\xe5\x3d\x19\xc3\x7b\xbc\xcf\x3a\xf8\x34\xcf\xbc\x6b\xb8\xc5\x7e\x0b\x92\x76\xfb\x90\xdf\xc8\x22\xec\xd7\x2d\x73\x05\xc5\x32\x25\x6d\xa4\xdc\xa4\x56\xdf\x1c\xd8\x35\x6a\x24\xfb\xfb\x54\x67\x97\xfe\x4f\xa8\xd6\xf4\x56\xcb\xc8\xe6\x10\xc8\xff\xad\x85\xa7\x5a\x0a\xa5\x3b\x8a\x4e\x10\x0d\xa0\xb6\x54\xd2\x3f\xe5\xe9\x55\xda\xa7\x3c\xed\x53\x96\x16\x73\x3c\xec\x76\xd3\x61\xab\xa7\x0c\xe9\x09\xcf\x30\x9b\x00\x57\x11\xb8\xaf\x72\xa3\x2e\xa9\x91\xa7\xf4\x7f\x05\x2d\xdb\xdc\xc1\x2b\x1e\xec\x8b\x03\xe5\xbd\x90\xb1\x1f\x28\xef\x35\x7b\xc3\x0d\x68\x15\x77\x86\xfd\x56\x92\x44\x7d\xd7\xdd\x7c\xf2\xf8\x69\x48\x07\x1c\x26\xd2\x8c\x34\x4a\xe8\xf4\xae\x64\x44\x76\xdf\x52\xcd\x90\x08\xad\x1f\x0f\x87\x1b\x4d\x4f\x37\xa6\xf5\xe9\x6e\x37\xf5\x96\xf3\x2b\x48\x5d\x31\x52\x6f\x08\xab\xee\x44\x26\x6d\x57\xb5\x13\x35\x79\x9d\xd6\x83\xd0\x66\x55\x4d\x55\xdd\xe3\x2c\x86\x6a\x2f\xe7\xd5\x5c\xf1\x36\x5e\xdb\xfe\xc7\xef\xbe\x3d\x9b\xd2\xf6\x9d\x70\xd4\x17\x4f\xa0\xba\x7e\xf8\x88\xae\x9f\x0c\x3d\x73\xc2\xd3\x5b\xe3\x15\x81\x35\x94\xf2\xb0\x8e\x68\x98\x9e\xe8\xff\x42\x4f\xbe\xb1\x18\x3c\x27\xe9\xb7\x42\xdc\xaa\xb0\x81\x32\x77\x61\x8f\x66\xa1\xbc\x4f\x3b\xa3\x07\x3f\xea\x9f\xc6\x97\x11\x57\x3a\xa8\x2c\xb0\xca\xbe\xdb\x71\x43\xb4\x63\x41\x96\x53\xf5\x2c\x90\x9e\xc1\x74\xf5\xa8\x33\x74\x83\xe5\x35\x66\x11\xc8\x0a\xdc\x84\xd4\x9e\xca\xbf\xa3\xb2\x83\xf7\xfe\xa7\xc7\x08\x9e\xa1\x6d\xb2\x7d\x9b\x5f\xe6\xa1\x0d\xca\xc5\x0f\x37\x32\x64\xa7\x0c\x0a\x54\x32\xed\x6c\xab\x11\x02\xb9\xe7\x64\xc7\x60\x26\xbd\x37\xca\x40\x45\x58\x9f\xb2\x49\x03\x2a\x81\x6f\xb9\x52\x32\x85\x4f\x6a\xce\xa0\x39\x43\x43\x03\xde\x68\xdc\x6c\x35\x46\x7e\x4b\xeb\x4f\xf1\xc7\x99\xc4\xcc\x44\xb6\x1f\xcb\xe7\xed\xb2\xa9\xb4\x5d\x5c\x8b\x32\xae\xf4\x5d\x70\xe0\xf9\xce\xe2\xc0\x0d\x3d\xfa\xc6\x61\xbd\x06\xa1\xc1\x09\x15\xeb\x01\xcb\xe7\xef\x7e\x87\xcb\xf6\x40\xb2\x03\x75\x3f\xbc\x9f\xe1\x11\x58\x70\xa7\xf1\xef\x30\xc7\xa8\x1f\x8e\x95\xaa\xd9\xbc\x5d\xf7\x45\x22\x2b\xf0\xab\xd7\xd3\x4a\x50\x7f\x1c\x43\xed\x6d\x06\x01\x02\x58\x71\x87\xb6\x35\x77\x61\xcd\x16\x65\x47\x41\xa6\xe6\x48\x5d\xb5\x45\x5d\x55\xac\x4d\x93\xc3\x1a\x1e\xac\xb6\x27\xcc\x47\x7f\xf6\x08\x75\x64\x67\x6c\xe7\x87\x35\x1e\x2d\x24\x0a\x53\x5c\x58\x53\x86\x9f\x12\x3c\x75\x12\xa6\xa2\x28\x53\xed\x6a\xca\x39\xd3\x7a\xbb\xc1\x46\xea\xca\x1d\xf6\xb3\x09\x6a\x2e\x21\x85\x1a\xd8\xbc\x14\x18\x15\x72\x5e\x9f\x5d\xb7\xbb\x25\xb2\x41\x79\x54\xa8\x8c\x0e\x2d\x94\xd2\xf7\xf7\x8e\xe5\x5c\x07\x59\x9c\xc6\x87\x16\x56\x27\x5f\x36\x9f\x0b\xc4\x27\x2e\xe5\x3e\x7b\x8c\xb5\xf4\x6c\xe9\xd7\x1b\xc1\xb9\x99\xa1\x80\x50\x8b\x79\x23\xe8\xcd\x1b\x41\x68\x95\x0d\xa6\x54\xca\x62\xb1\xd9\xfa\x16\x86\x41\x8a\xd4\x30\x2a\xed\x50\xba\x5b\x3e\xbf\x9e\xb2\xb9\xa5\xde\x0d\xdd\xc0\x60\xfa\x5d\x99\x06\x9a\x4c\xd4\xfd\xae\xb4\x90\x33\x82\xb0\xce\x19\xd5\x92\xe9\x87\xe7\xc5\x23\x57\x5f\xfa\x91\x69\x8d\x35\x10\xd3\xaa\x4a\x5b\x1f\xbd\x02\x0f\x9e\xf3\xfb\x3d\xad\xac\xf4\x5b\xa9\x70\xd9\x1c\x3c\x5b\x45\x61\x7b\x28\x73\xb0\x19\xc8\x06\xd6\x5b\xa8\xf5\x20\xf8\xce\x55\x8b\x2d\x01\x80\xac\x60\x5e\xbb\xb5\x37\xbf\x2e\xab\x6b\xf4\x6d\x29\xc0\x9d\x39\x98\x7f\x67\xd6\x37\x94\x33\xcd\x0d\xbb\xdf\x71\x3a\xdf\xd4\x15\x87\xdd\xa0\x82\x85\xee\x86\xd2\xf2\x55\xa3\x92\xf4\x2d\x59\x4b\x9f\xe8\xac\xe7\x81\xe3\x1f\xab\x89\xb5\x4c\x21\xfe\xf3\x40\x5f\xe6\xcf\x40\xf8\x63\x85\xa5\xf4\x7d\xc6\x77\xfb\x80\x2f\x88\x62\x3c\x76\xc7\x11\x8a\xdc\x26\x5d\x93\x41\xc1\xe5\xd9\xd8\xe1\x14\xa1\x8d\xe8\xe7\xa1\x24\x8b\xd3\x11\x93\xe1\xf3\xa1\x12\x02\x3e\xf3\x42\x14\x5a\x2b\xd5\xe6\x4d\x9e\xdf\x2c\x5c\x82\xda\xa5\xb7\x94\xf5\x31\xd9\x5b\x9e\x7c\x37\xd5\xd7\xef\xc9\x77\xbb\x25\xdf\x58\xbe\x30\xe0\x70\x49\x97\xe6\x2f\x30\xf3\x48\xae\xc0\x39\x7d\xb4\x63\xab\x5a\x7a\x85\xa5\xd8\x4d\x02\x9c\x14\x40\x5f\x8b\x6d\x8f\xee\x38\x27\x01\x7d\x8e\x1e\x35\x9d\xa2\x73\x5e\xfa\x6a\xd9\xdd\xf3\x52\x4c\x77\x96\x88\xd2\xb1\xe5\x39\x09\x58\xb3\xc3\x2c\x00\x66\xf7\x86\xaf\x6c\x2e\xca\x39\xd8\x2e\xc5\x74\x9d\xe5\x0a\xb6\x5b\x52\xc1\x76\xab\x50\x81\xff\xfc\x41\x05\xdb\xad\xa9\x0a\x74\x40\x5e\xc1\x2e\x0f\x35\x6a\x08\x9c\x87\x6f\x25\xcc\x8a\xd4\x15\xab\xba\x62\xae\xeb\xf5\x9a\x52\x8d\x20\x27\x06\xd1\x3c\x8a\x8b\x95\x56\x60\x3b\x76\x4e\xa3\x52\x84\x23\x88\x9c\x9b\x4d\x72\x42\xe7\x22\xbf\x2e\xed\x38\x4d\x9f\xfc\xbb\xb0\xe4\x07\x49\xce\x08\x9a\xc9\x22\xe8\x9d\x8b\xf5\xd4\xda\xb4\x93\x69\xbb\x45\x5c\xb6\xc5\x35\x12\x6a\x5d\xa6\x5b\x58\x8f\xdb\x32\x51\x3b\x25\xe3\x99\x63\x5e\xb9\x89\x22\xb2\xd3\xbd\xdb\x79\x7c\x2e\xf9\x7a\x3f\xd9\x19\x88\xd1\x2e\x88\xd5\xbe\xbc\x7c\xac\x7c\x66\xf0\x5c\x55\x5f\xde\xfa\xcd\x75\x2a\xbd\x5c\x6f\xc8\xce\xee\x36\xe7\x69\xd2\x9f\x3e\x30\xba\x4d\x1c\x18\x42\xb3\x61\x56\xb4\x5f\x39\x65\x82\x79\xa7\x0c\x9d\x50\xa3\x87\xde\xe7\xb4\xb6\x4c\x77\xb0\xb3\xd8\xf3\xaa\x9e\xd3\xf7\xea\x9d\xb0\x51\x3e\x35\xce\xa8\xe6\xa9\x21\xc0\xb5\x01\x65\x95\x35\x28\xba\x38\xb3\x3d\xde\x0e\x1e\x76\x2d\x0d\x2f\x42\x58\xb1\x39\x8d\xae\x97\x0f\x6d\x4e\x49\x38\x2d\xc8\x81\x69\x5a\x5f\x20\x6e\x10\xfa\xf2\x53\x16\xbf\xa0\x29\xac\xf1\x61\x2b\xda\x25\x01\x11\xce\x8f\x3d\x95\xe2\x32\x73\x5d\x69\x17\x8e\xe4\xd3\x6f\x1f\x74\xf7\x28\xa9\x18\x14\x28\x11\xd4\xdf\xfb\x66\x4d\x91\xa0\xce\xa8\xd2\xfd\x6f\xf3\x88\x38\x76\x81\x2e\xf3\x68\x32\x4d\xf9\x42\xcd\x0a\xdc\x92\xbf\xe2\xd5\x7b\xaf\x0d\xeb\x0f\xe8\x9e\x15\xe2\x94\x0a\x41\x85\x6b\x3f\x44\xff\x2a\xa5\x72\x0e\xbf\x7d\x27\x0c\xf3\x0f\x4d\x54\x3a\xbd\x51\x07\xa2\xd0\x5b\x09\xfd\xb4\xd1\x3c\x1c\x9b\x18\x1f\xaf\xe9\x99\x8a\x3f\xa9\xf4\xc5\xc4\xe3\x17\x13\xcf\x39\xf8\xe6\x42\x78\xfa\xf0\x9b\x16\x4b\x90\xd9\x08\x6c\xd8\xa0\x34\x1b\x8d\xd7\xf8\x89\xd1\x4b\x61\xbc\x9f\xc1\xab\x8e\xc0\x38\xf4\x3c\x45\x11\xcb\x29\x74\x4a\xb4\xbc\xe6\xb4\x8b\xec\x6a\x05\xe6\xc1\x75\xad\xb2\x4c\x14\x45\x60\xc7\x42\x57\x84\xc7\xbb\x56\xf4\x45\xc0\xdc\x9c\x56\x19\x01\x73\x73\xc2\x32\x38\x4a\xe7\xed\x10\x83\xf9\xf2\x3c\xa8\xc2\x57\x2e\x69\x11\xfa\x80\xf2\x50\x52\xab\xfa\x69\x5d\x41\xd8\x58\xe1\xa8\xac\xc6\xe3\x80\x42\x90\x66\x52\xd6\x8a\x6b\xee\x3f\xda\x2a\x67\xba\x3b\x1f\x08\x4e\x97\x15\xb1\xb0\xad\x28\xf6\x96\x4d\x09\xe7\xc4\x8f\xd2\x3c\xfa\xf6\xa8\x1b\xf0\x2d\x82\x22\xcf\x0e\x3c\x51\x55\xe7\x71\xd4\x4f\x23\xea\xbc\x18\x95\x2b\x2b\xa3\xb8\x8b\x62\xdc\x8d\x19\x77\x59\x8c\x3b\xeb\xd2\xf2\xd9\x02\x87\x0c\xc5\x5d\xe5\x71\xcc\x32\xb7\x51\xd0\x86\x65\x42\xa5\x33\x9e\x94\x76\x7b\x8a\x6f\x54\x30\x10\xdf\x78\x23\x62\x12\x0a\xc8\x8b\x61\xdf\x7b\xee\x80\x3e\x21\xc3\xf7\x01\x31\xdb\x77\x2f\xdb\xd9\x8b\x58\xfd\xd2\x6f\x94\xce\x60\x5a\xfa\xea\x88\xaf\x1a\xb6\xe4\xdb\x51\x3e\xc1\xe9\x4e\x8f\xa0\xe2\xc6\xcb\x88\xce\x81\x44\x7d\x72\x4c\x7b\xd8\x06\x2a\x30\x57\xe7\xed\xd7\xef\x7c\xa8\xdf\xa5\xa9\xa7\xf1\xf0\xae\x2f\x8e\x4a\x87\x4f\x05\x94\xfc\x81\x2f\x6e\xc9\xed\x0c\x17\x82\x49\x5d\x9b\xfc\x2c\x3d\xdc\xda\xc9\xad\xa1\xd7\xaf\xf3\x79\xbe\xcd\x03\x95\xaf\x33\x95\xaf\xfb\x79\xbe\x73\xca\x66\x1f\xbf\x7a\xc8\xda\x9d\xca\xda\xfb\x3c\xab\x10\x0c\x29\x5f\x6f\x2a\xdf\xe3\x27\xf9\xee\xf6\x91\xe3\x51\x72\x3c\xf2\xd3\xf8\x0c\xcd\xb9\x48\x63\x36\xc6\xae\xff\x49\xc1\xb5\x2d\x14\xdc\x9f\x6a\xca\xe0\xf3\x2e\x08\xe9\x91\xf2\x0d\x24\xdf\xe0\xd7\x1a\x94\x5f\xc3\x87\x9f\x97\x1f\x6c\xab\x21\x1a\x4e\xb5\x6b\xf4\x97\xed\x92\x7c\x23\xc9\x37\xfa\x9b\x03\xf5\xf4\xd7\x93\x8e\xd2\x9f\xa6\x5a\xf5\xfc\x49\xb6\xfb\xdd\xbc\x55\xcf\x53\xf9\x5e\x38\xdf\xd5\x30\xe3\x30\x51\xef\x75\x8c\x47\x0b\x68\x37\x18\x5c\x9e\xdb\xee\xdb\xe2\x90\x15\x3f\xb2\xff\x6e\x47\xb6\xdd\xa2\xfa\xee\xca\x47\xb1\xd1\x9c\x24\x05\xae\x9b\xfd\x7b\xf9\x0e\x8d\x02\x33\x95\x72\xc1\xae\xfb\x4d\xbd\x4e\x5f\x7d\x73\x95\x2b\x38\x71\xd7\xc4\x15\xfe\xff\xd4\xbd\x69\x57\x1b\xb9\xf2\x3f\xfe\x3c\xaf\x22\xf0\xcd\x65\xda\x58\xee\xd8\x64\x99\x19\x9b\x0e\x87\x1d\x12\x0c\x01\x12\x62\xf0\xe1\xdc\xa3\xde\x6c\xe3\x15\x6f\x60\x27\x7e\xef\xff\xfa\x94\xa4\x6e\x79\x61\x32\xf7\xff\xec\x77\x33\x17\xab\x4b\x5b\x95\x96\x52\x49\x2a\x55\xfd\x50\x79\x23\xfd\x5b\x83\x03\x5f\x15\x75\x55\x56\xa0\xef\xfa\x37\xba\x51\xbf\xf1\x8d\xfd\xd4\x3e\x4e\xd2\x47\xa1\x05\xef\x7a\x3f\xfb\xb2\x53\x8b\x94\xec\xdd\x3e\x57\xbf\x61\x5d\xb3\x7e\x4e\xf3\xe5\xc1\xfb\x79\xdc\x2c\xfe\x6c\x37\x3a\xc5\xbc\x68\xcb\xe7\x62\x7e\x26\x94\xab\xe8\x39\x98\x4e\xde\xfc\x61\x95\x5f\xbb\x49\xea\x95\x23\xa3\x07\xf4\x5c\x11\xdf\x86\xfa\x26\x7c\x52\xf1\x7e\xf6\x02\x59\x3c\x39\x11\xc4\xdb\x8b\x93\x13\x71\x35\x29\x3e\xd7\x66\x62\x4a\x11\x8f\x1f\x8a\xeb\x8c\xde\x35\xed\x5c\xf0\xac\xb7\xdc\xe8\x9c\x48\xb8\xeb\x5d\x17\xbd\xa5\x38\xf9\x6c\xe2\x06\x2b\xf2\x5d\x07\xfd\x28\xea\xac\x8b\xfe\x8a\x7c\x3a\x6e\x26\x9a\x17\xd2\xfb\x79\x31\x92\xc5\x8b\xbe\x78\xa4\x9f\xbd\xbe\x18\xd3\xcf\x49\x5f\x5c\xd1\xcf\xf7\xfe\x4c\xb4\x90\x82\xdd\x73\x34\xf6\xe0\x8b\xc3\xfd\x30\x13\x6d\xc0\x92\xe3\xcd\xe2\x4f\xac\xb2\x95\xc8\xac\xa8\xc7\x7b\x33\x11\xf1\x1b\xe6\x53\x08\x2a\x92\xc6\xdd\x18\xb6\x9f\xd6\x0a\x42\x1d\xd2\x15\x7f\xf6\xba\x03\xe5\x4f\xfb\x72\x26\xb4\xf9\xc2\x61\xf4\x4c\x6b\x93\x06\x0f\x8e\x13\x73\x85\x73\xf0\x4b\x91\x1c\x7a\x19\xef\xb8\x97\xb4\xdd\x16\x9d\x05\x84\x58\x00\x20\x8c\xd4\xa2\xff\x3f\x22\xb4\xaa\x62\x20\xb4\x0a\xd1\x97\x10\xda\xa5\xce\x64\x3f\x4a\x45\xe3\xe1\x44\xfb\x2c\xb9\xdc\xa5\x1d\x1e\x5a\x73\x1a\xd1\x66\x49\x9e\x16\xf5\xba\x58\xc8\x8b\xc2\xc7\x8c\xb8\x6d\xc9\xe2\x3b\x5a\x89\xbd\x67\xd6\x18\xfb\x07\x25\x9c\xbb\xd8\x49\xae\xda\x8d\xe5\xd5\x07\x0f\x56\x50\xf9\xb6\x6d\x6e\x5a\x5b\x52\xd3\x9b\x23\x73\xf6\x40\x53\x58\xbf\x4f\xd5\x32\xc9\x69\x4b\xcb\x2c\xda\x8e\xbd\xce\x71\x97\xe4\xb8\x5b\xcc\xd1\xbe\x4d\x6e\xb0\x71\x32\x6f\xd4\x1e\xaa\x3e\xb6\x82\xc6\x68\x51\xe5\xd1\x31\x87\x1b\x91\xbe\x8e\x6f\xbe\x71\xfc\x54\xed\xe7\x58\x9b\xc9\x3d\x13\x67\xc9\x65\xeb\x89\xc6\x85\xf5\xce\x35\x03\x30\x68\x98\x79\x3f\xc4\xcd\x5a\x1e\x97\x75\x73\x6c\x81\xc1\xca\x08\x56\x5e\xc5\x0c\x71\x43\x99\x2b\x64\x90\xd4\xf7\x78\x0a\xeb\x82\x78\x22\xeb\xdc\x33\xda\x30\xd6\xa1\xa8\xdc\x35\xe7\x4c\xbe\x82\xe8\xf2\xa3\xd0\x0d\xbb\x6d\xd9\xe8\xf0\xad\xc6\x32\x88\xef\x36\x96\xc1\x96\x6d\xc9\xe4\x90\xe7\x0c\x6a\x52\x8e\x51\x35\x0d\xb5\x8a\x54\xe5\x71\x59\x69\x9b\xb8\xe4\x57\xf4\x7b\x34\x91\xd0\xd0\x4e\xf8\x25\x03\x6f\x9f\x52\xff\xc8\xad\x1b\xa8\x7f\x48\xd1\x1e\x59\xa6\x3c\x88\x69\x32\xf0\x6c\xcf\x02\x12\x47\x65\xe0\x97\xa9\x05\x0c\x35\xf0\xb2\x6f\x01\x89\xa1\x06\x5d\x02\xee\x52\x4a\x3d\x8c\x89\x1b\x98\x0e\x21\xb6\xfb\xd8\xd1\x0f\xcc\xd2\x11\x69\x9d\xcb\xe9\xcb\xa2\x37\x28\xb7\x7f\x08\x56\x23\x4e\xfa\x19\x7d\x6f\xb4\xd7\x2f\xaa\xf1\xd2\xd6\x3d\xde\x99\xbb\x28\x3c\x31\xd1\xe3\x95\xd1\xdf\x4d\xf4\xe3\xca\xe8\x0b\x13\xdd\x5b\x8c\xd6\x77\x68\x4b\x85\xcf\xf4\xca\xe7\x27\xab\x07\xa3\xdd\x38\x15\xd7\xdf\xb0\x90\x42\x01\x8c\xb7\x3a\x6f\x16\x5e\x66\xee\x76\x9c\x23\xa4\x94\x03\xc9\x7b\x30\xa5\x88\xa6\x0b\xd9\x21\xbe\x54\x24\x66\x99\x7a\xe5\xb1\xc4\x91\xde\xfc\x79\xef\xcd\x15\x36\xb8\x4e\x66\xee\x19\x7f\xe2\x40\x8c\x86\x34\x3f\xba\x80\xa0\x0b\x9f\xa0\xe2\xa1\x91\xc8\xb1\xdf\xf0\xed\xe3\x6c\x9c\x66\xcd\x1c\x7a\x67\x66\x66\x65\xe6\x57\xf3\xfc\xac\xf4\x98\x1e\xa6\x26\x07\xe6\x35\x33\x6c\xf4\x3e\x59\x6f\xcc\x0b\x2f\x29\xb9\xdc\x8c\xb5\x2e\x48\xac\x14\x12\x5a\x6f\x5e\xaa\xdd\xae\x6d\x4f\x35\xba\x78\xae\xcd\x49\x67\x8f\xa6\x39\x24\x6f\x4a\xcf\xd4\x81\xa2\x84\x4c\x21\xd1\x94\x89\x79\x98\x62\x62\x38\xc6\xb8\x2b\xa7\x05\x5b\x84\xa5\x50\xcd\x6c\xed\x8d\x89\xf2\xc1\x3b\x0c\xff\x46\x71\x86\x27\xba\x62\x0a\x8b\x51\x38\x3d\x3c\x6e\x7a\x61\x49\x95\xc4\x66\xc8\xce\x6b\xec\xfd\xa7\xdf\x34\xa9\xd5\xc0\x8e\x96\xa3\xa8\x80\xf9\x9a\xa1\x2e\x6b\xd5\xa6\xb4\x67\x6b\xca\x20\x1f\x57\xf1\xed\x83\xb2\xa0\xe5\x05\x19\xa9\x04\x1e\x7d\xce\x98\x57\x16\xd0\x1e\x08\x1b\x94\xb4\xa2\xc6\x90\x0f\xe3\x30\xb7\xda\x0d\x27\xca\xec\x38\xea\xa8\x8c\x76\x2f\x91\x88\xab\x17\x01\xdc\x9a\x45\x98\x90\x59\x62\x9b\xc5\xd8\x8b\xb2\x01\x95\xa9\xbc\x9b\x29\x33\x8f\x49\x69\x87\x91\x13\x67\x72\x30\x5a\x1f\x24\x96\x41\xd9\xe2\x0d\x61\x14\x6c\x27\x68\xc8\xe7\x9c\x85\xd2\x4e\x50\x2c\x28\x6f\xd4\xd1\x0f\xb8\x73\x0f\x7f\x64\x02\x46\x50\x84\x1e\x0f\x67\x77\x28\x8c\x83\x25\x75\x9c\x43\x1d\x57\xf0\xa0\xfb\xd7\xde\x09\xab\x21\xee\x51\x8a\x61\x91\x20\xaf\x14\xa8\xa8\x81\xd4\x19\x24\x45\x05\x25\xe5\x1c\xd5\x07\xd7\x15\xdf\x9f\xa8\xbc\xae\xe8\xf3\xb8\xe8\xb0\xc7\xbe\xa0\x3a\xb9\x57\x02\x9b\xfe\xc6\xd1\x0a\x03\xe0\x1a\x12\x5a\xa6\xf1\x0b\xfb\xf6\xc4\xc4\xdd\x57\x46\xeb\xb1\xed\xc0\x24\x9c\x60\xd3\x6f\x7c\x21\xbd\x27\x1d\xb6\xf8\x53\x85\xd5\x02\xd5\x55\xbe\xbb\x4b\xed\x51\xf7\xb1\xc6\x88\x24\xb9\x66\xda\x37\x48\x93\xdc\x96\xc3\xdf\xf9\x31\x5c\xf5\xe0\xa4\x21\x40\xd2\x60\x3e\xa9\x88\xbc\x41\x72\x7e\x14\xa9\x2c\x2b\x8f\x2f\x35\xe3\x15\x89\x1e\x5d\x58\x9d\x56\xdc\xc1\x87\x7b\x2f\x2a\x11\x5f\x49\x2e\xb9\xfe\xf7\x32\xfa\xba\x8c\x91\x99\x8b\x4a\x1e\x46\x5b\xbb\xe5\x3a\xeb\xfe\xcd\x67\x78\xe4\x0c\x72\x65\x86\xb3\x55\x19\x7a\x94\x41\x79\x11\x8b\xbd\xef\xcd\x84\xf3\x2a\x8e\xe1\xb6\x9d\xb8\xfa\x2d\xbc\x17\x5f\x4f\xcc\x22\xff\xad\xa6\x17\x79\xcd\x9c\x32\x4b\x69\x2f\x93\xb4\xe3\x0f\x8b\x49\x43\x2f\x74\xa5\x63\x4c\x8e\x23\x4f\x68\x95\xfd\xfd\x1f\xca\x0e\xc5\x49\x22\x68\x1c\x1d\xcd\x25\x13\x4a\xa1\xe8\xcd\xa9\xb8\xea\x60\xd7\x43\xd9\x1c\x23\xd7\xef\xb6\xe6\xbc\x57\xa6\xdc\xd9\xf3\x18\x5b\x4a\xac\x15\x2d\x55\x25\xff\x84\xbc\x5e\xb3\x7f\xfd\x72\xc6\xe9\x33\x3b\xda\x12\x9c\x9c\x64\x44\x02\x61\x25\x88\xc9\x89\x8d\xba\x2f\x8e\x13\xd4\x1b\xe5\x05\xd4\x69\x17\x43\x1b\x89\xf9\xe4\xa7\xff\x8e\xd2\xfc\x42\xb6\xff\xa5\x81\xb4\x9b\x03\x48\x6f\xc6\xda\x64\xba\xb9\xbd\xb0\xcc\x10\x49\x9b\x04\x09\xfc\xa1\x26\xa1\x31\x0f\x67\xbc\x7e\x5a\x58\x4b\xd4\x6d\x52\x70\xad\x41\x8a\xab\xb4\x11\x7d\x29\x25\xd0\xb3\xee\xe1\x47\x17\x73\xde\xe2\xd4\x40\xdd\xad\xb8\xf2\x54\xd4\xf0\x4b\xc2\xb7\x68\x22\xa0\x3c\xa0\xb6\x68\x80\x69\xb6\x10\x82\x2d\xb0\x67\xce\xc8\x73\x3f\x6c\xc6\x30\xaf\xab\x14\xc2\x98\xc5\x61\xf2\x17\xeb\xd5\x21\x2d\xd2\xb9\x28\x93\x75\x3f\xb0\xba\x01\x45\xd8\xb0\x22\x73\x87\x52\xe8\x1e\xb6\x9d\x16\x46\xae\xe8\xa8\x43\x72\x4a\xe7\xf8\xc4\xa5\x0f\xa9\x0a\x08\xa8\x83\x33\x87\x81\xd5\x9f\xb4\xc9\x14\x93\xa2\x3f\x13\x08\x65\x99\xaf\xe0\xf3\xbe\xb8\x10\x85\x50\x16\x1c\x67\x06\x6e\xe6\x0e\x70\x4f\xdf\x24\x6c\xa1\x44\x41\x63\xec\x89\xe9\x26\xbc\x1d\x14\x91\x8b\x99\xe9\xe5\x45\xcc\xd7\x25\x28\x94\xf8\x37\xa7\xcf\x14\x5f\x44\x04\xd6\xbf\xf3\x5c\x9b\x6f\x10\xc9\x6b\x44\xac\x28\x84\x7e\x8b\x48\x5e\xa3\xb2\x6b\x50\x61\x1c\x18\x9b\x04\x11\x23\xdb\x70\x43\x59\x5d\xf8\x74\xb1\xe0\xf1\x9e\x93\xd3\xe2\xe9\x67\x43\xea\x9b\x20\x1b\xe9\x7e\x21\xdc\x19\xb7\x6c\x4c\x38\x05\x8c\x5d\x98\xb3\xc2\x08\x65\xe3\x24\x1c\xe5\x62\x2b\x4d\xa4\x09\xb5\xc2\x56\x1a\x5f\xe7\xbd\x67\x49\xb9\x06\x2a\x3b\x8c\x46\x29\x86\xca\x9f\xea\x50\xb9\x80\x41\xd6\x2e\x9f\x73\xeb\x16\x4e\xd3\x2c\xe0\x90\x43\x9a\x4c\xf1\xa5\x92\xd2\x3c\x76\x49\x69\xf9\x4b\x25\x29\x4c\xa5\xc2\xb4\x96\xf6\x4d\x7a\x2d\x33\xb8\x58\x30\xcf\xb7\xcb\x8b\xa5\x59\x22\xd2\xfb\x21\x48\xb6\xca\x39\x90\x32\xb1\xaa\x8c\xa9\xf2\xb2\x97\x53\x3e\x26\x8a\xcb\xf1\x14\xa5\xec\xb1\xc2\xda\xaa\x75\x2a\xf7\x4f\x95\x9e\xbd\x5c\x69\x60\x96\x64\x1c\xdf\x07\x49\x85\x41\x82\x0d\x0e\xfa\x03\x5d\x5d\x7a\x2a\x79\xb1\xe4\x34\x3b\x91\x6e\x94\xb1\x74\x23\xf7\x90\xa4\x85\x27\xd3\x90\xf1\x86\x6d\x56\x13\x99\xc4\xd6\xa3\x1e\xdf\xb3\x45\x29\x9f\x06\xf1\x4e\xa8\x05\x29\x38\x4a\x2b\x1a\xb7\xa0\xbe\xe5\xa0\x30\x30\x8a\xbf\xb5\xd4\xb7\x24\xe5\x4b\x3c\x88\xe2\xe9\x95\x29\x84\x0d\xaf\x9a\xcb\x86\x32\x8c\x6a\x9f\xd5\x69\x2c\x92\x90\xdf\xbe\x7c\x41\xc6\xe1\x26\x4b\x4c\xf9\x5a\x62\x6a\xb9\x9e\x1c\x97\xdb\xe0\xb3\x3a\x64\xb4\x82\xb1\x65\xa1\xe9\xd4\x5b\x17\x53\x35\x2b\x59\x17\x83\x1d\xbf\x28\xa1\x64\x4d\x21\x49\x5c\x47\x19\x5f\x19\xcb\x65\x05\xe4\x35\xbd\x4e\xb8\x6f\x86\xf3\x5a\x25\x81\x85\x64\xaa\xec\x15\x10\x72\xca\x31\x0e\xc2\x84\x51\x92\x27\xf0\xfa\xe9\x3a\xc8\xa7\x05\xfb\x7a\xe3\x10\xb0\xb8\x02\x11\xe4\xd9\xec\x58\xba\x6e\xa8\xdf\xc8\x25\x2a\xb5\xe9\x89\xe7\xbe\xa5\x60\x64\x64\xea\x04\x8d\x88\x0a\x63\xe5\xb7\x88\x0a\x24\x1c\x52\x04\xb4\xfc\x89\xc6\xf7\xd1\xf8\xc1\x8c\xf7\x2e\x2c\xf4\xa4\x8a\x2a\x49\x2d\x7b\x95\xf9\x27\x92\x34\x5c\x79\x69\xa1\xf1\x57\x54\x81\xfe\x3d\x4b\x9a\x49\x44\xdf\x44\xec\x32\x26\xfe\x9a\x47\x6b\xbd\xc6\x50\x4d\x45\xd6\xa6\x4e\x24\x40\xd6\xdf\x49\x44\x33\x75\x6f\x39\x89\x13\x03\xe3\x58\x6a\x58\x12\xcc\x42\x08\xcc\x11\x8f\x0d\x79\x29\x92\x6e\x0d\x4b\x4e\x8d\x75\x99\xf9\xab\x7e\xed\xc4\x4a\x68\x54\xdf\xb7\x0f\xf8\xe6\x89\xc2\x77\x8e\xa6\x30\x58\x4e\x86\x54\x89\xb2\x02\x94\x25\x92\xb2\x9a\x82\x15\xba\x6b\x6e\x8d\xcb\x62\x2b\xea\xf8\x9c\xd4\xf8\xb3\x4f\x45\x11\x3d\x27\x27\x6c\x7c\x7c\xb8\x48\x4c\x7f\x8e\x18\x12\x1b\x85\x62\x9a\x36\x15\x09\x01\x62\x8e\x00\xb1\x40\x80\x98\x27\x80\xf8\xa5\x85\xfd\xff\x2f\xc4\x33\xd8\x49\x9f\xb6\xe6\x8d\xf7\x54\x6c\x09\x98\x06\xdb\x9c\x90\xf3\x3c\xcf\xc2\x56\x6e\x9d\x44\x60\x78\x09\x0d\x02\x27\x65\xaa\x76\x1a\x58\xba\xa6\x5e\x75\x0b\x9f\x8c\xc2\xd4\xcf\xb0\xd1\x57\xfa\x7c\xc5\x5c\x61\x33\x10\xc3\x37\xc5\xf0\xad\x5b\x98\x91\x54\xee\xcc\x57\x64\xf8\x25\xca\x50\x79\xa9\x18\xb9\x63\x15\xa0\xf3\x4b\xe4\x57\xa7\xdd\x09\x01\x07\x95\x44\x23\xae\x56\x36\x84\xac\x61\x29\xe3\x89\xe5\x3d\xd7\x36\x36\x14\x91\xca\x34\x6a\x9e\x55\x98\x88\x25\xca\x11\xad\x74\x7c\xd0\xad\x1e\x59\xd0\xf6\xf1\x18\xed\x09\xd9\x0c\x70\xf5\x7c\x82\x3a\xba\x0d\x43\x54\x88\x91\x23\x7e\x30\x91\x29\xae\xf9\x50\x43\x93\x23\x75\xc5\x8c\x90\x8a\xd6\xd7\xca\xd8\xcd\x51\xae\x55\x66\x6a\xe4\xc8\xb0\xbd\xe7\x64\x4b\xa5\xb9\x5e\x70\xfc\x76\xff\xc1\x29\x1c\xbe\x13\x1f\x0f\xdf\x43\x93\xf5\x4d\xe2\x99\xe1\xf4\xc1\x95\x4d\x73\x80\x98\x31\x46\xb0\x2d\xe8\x55\x19\x3b\x33\x27\xa4\xc5\x84\xd5\x3d\xff\xf1\x28\x8f\x5d\x06\x60\x95\xa8\xd9\xe5\xf8\xdc\x8b\x46\x7b\x4c\xc1\xe2\x4c\x29\xff\x49\x56\x2f\x9e\xef\xb5\x2f\x06\x62\xee\xb5\x1c\xbb\xb1\x26\xea\x72\x14\x0e\xd4\x2a\xaf\xfd\x86\x64\x23\x65\xc6\xbf\x96\x75\x64\x2e\xc6\xb2\x9d\x94\xb6\x37\x81\xfa\x94\xb4\xbf\x59\xc5\x96\xf2\x79\xb5\x12\xe3\x43\xfb\xaf\x55\xc7\xa9\xad\x37\x4a\x88\x57\x5b\x65\xfb\x10\x52\x6d\xdf\x92\x93\x48\x7d\xa0\x73\x0b\x5d\x29\xbe\x11\xfe\x5e\x5b\x64\xf2\x92\x58\xbb\x71\x6e\x9a\xcc\x07\x73\x36\x5b\x23\x29\x6f\x92\x9c\x9f\x66\xc4\xd9\x13\xad\xd6\xb2\x7f\x5f\x7d\xbe\x17\xd7\x27\xda\xba\xc9\xb7\x7f\x5b\xa6\x55\x92\xc5\xcf\x27\x8b\xaf\xd1\xbb\x25\x7d\x72\xab\x97\x59\x3d\xb5\xe6\xbf\xcf\x68\x9d\x21\x96\x1e\x30\x43\xb7\x27\xe6\x99\xf5\x29\x9f\x67\x46\x61\xff\xae\xc5\x0e\x5f\xd4\x6c\x25\xe6\x14\xba\x93\x62\x08\x5f\x30\x81\xdb\x3e\x67\x5e\xa6\xd6\xdb\x9a\x99\xf1\xa2\x99\xa8\xc7\x2b\x16\xa1\x0e\x3a\x9f\x6b\x24\x0b\xd4\x50\x53\x2e\x86\x10\x05\xed\x4a\x4c\xd9\x18\xc2\x8d\x7d\xe2\x79\xb2\x98\x0e\x29\x72\x38\x90\x51\x00\x2b\xed\x04\x69\x01\xcc\xea\x68\x5a\x0b\xed\x72\x67\x11\xec\xdc\x43\x42\xe6\x67\x27\xed\xf3\x2c\x6d\xe4\x03\xc2\x09\x4b\x0c\x2b\xd4\xaa\x16\xca\x7a\xec\xa1\x19\xf0\x93\x14\x7e\xa6\xe0\xcc\x14\x60\xa1\x83\x3a\xe7\x48\xf0\xcc\x56\x5f\x77\xfa\x0b\x53\xb4\x51\xf6\x16\x6f\x27\x98\x8d\xa0\x3b\xf7\x87\xd0\x4b\xf9\x29\xd1\x94\x41\xc6\x7e\x8e\xd7\xa5\x5d\x50\xfb\x3c\x39\x25\xa5\xf6\x85\x33\x06\x02\x12\xb3\xf1\xe9\x0f\xea\x56\xc7\x1c\x01\xcc\xb0\x39\xda\x8a\xd4\xf8\xc3\xa2\x59\x16\x55\x91\xd1\x00\xe9\x6a\x0f\x80\xd4\x23\xd4\xfc\x29\xc3\x88\x7e\xcc\xe9\x4e\x36\x7f\x80\x19\x9b\x63\x8c\xd0\x7b\xd3\x66\x13\x82\xaa\x49\x30\xf5\x18\x40\x18\x1b\x81\x23\x64\x9d\x23\x30\xfd\x44\x13\x5d\x9d\x99\x9b\xd5\x9a\xef\x70\x88\xe3\x99\xb3\x14\x53\x38\xd8\x4c\x84\x33\xaa\x5c\x54\x85\x93\x48\xed\x39\x8d\x47\x0b\x31\x90\x04\x9d\x9a\x57\x71\xae\xdb\x4a\x13\x83\x77\x5e\x95\x86\x83\x77\xf5\x14\x71\xa7\x42\xa9\xc4\xe4\xf9\x46\x5e\xf2\x6a\x19\x1f\xb8\x62\xdd\x9a\xb0\x17\x13\xf5\x81\x0a\x91\xd5\xf7\x62\xed\xdc\x05\xf1\x39\x3f\xb3\x6d\x3e\x19\xa5\x38\x43\x42\x5d\x4c\x9b\xa6\x14\x43\xda\xb6\x7e\x7e\x20\xda\x6b\x99\x5c\xf4\x76\xab\x94\x10\x46\xec\x10\x86\xf1\xbf\x48\xda\x03\x6b\xdf\x25\x4c\x0f\xb3\x3b\xda\x13\xa3\x00\x0f\x20\x6c\xc2\xf8\x43\xbb\x3b\x41\x18\xc9\xe4\xb3\xce\xad\xea\x0a\xd3\xb6\xe5\x82\x54\x3a\xab\x89\xf5\xed\xc5\xc6\xc6\x2b\xc9\xa3\x13\x0b\x90\x13\xfe\x86\x25\xeb\xe6\x6d\x5f\xd2\xd6\x3a\xb9\xc3\x09\xc1\x68\xff\x89\x25\xea\xeb\xe0\x60\x96\x3c\xec\x5b\xc5\x17\x2d\xc6\xc8\xa7\xa4\x46\xdc\x34\x03\x75\x66\xcb\x03\xdd\xc5\x4d\x86\x5a\x2a\x20\x77\xce\xad\x13\x61\x02\xe0\x83\x5d\xea\x83\x52\xde\x63\x9f\x32\x4e\x94\xf3\x0a\x22\xa4\xed\x24\xc1\xb5\x03\xa0\x9a\x87\xe3\x4f\xdc\x9a\xb9\xd6\x7b\x89\x35\xaf\x96\xf0\xb9\xc4\x5f\xb9\x2e\x95\x06\x50\x2b\xf9\x60\x1d\xdf\x56\xae\xa9\xcb\x72\x0b\x9b\xb1\xe8\x78\xee\xc7\xcd\xb8\x14\x7c\x42\x21\xc1\xb6\xd7\xf9\xf5\x8b\xc4\x27\xa7\x99\x6d\xb1\x87\x85\xb7\x9e\x13\x6c\xd7\x76\xdc\xbf\x37\x49\x7a\xa0\x0c\xb5\xcc\xdb\x40\x6b\x67\xd2\xa0\x68\xe6\x62\x78\xab\xc9\xc6\x70\x23\x43\xe9\x28\x6f\x4a\xa1\xd4\x8b\x6c\xfa\x4d\xcb\x6b\x46\x4c\xa9\x65\x62\xa1\x0b\x88\xd8\x69\xa7\xce\x43\x6b\x59\xcc\xa3\x58\xa6\xdf\x6a\x20\xab\xf5\x0d\xde\xde\x79\x7d\xb3\x9f\x1f\x4c\x93\x3b\x03\xca\xba\xed\xd3\x1f\x7e\xcb\x43\xd9\xb2\x1e\xbe\x72\x80\x8b\x2f\x9c\x08\x85\xa3\xe7\x28\xf2\x93\x8f\xbf\x94\x94\x63\x90\x26\xa7\x72\xe5\x38\x82\xe5\x14\x7e\x4b\xc2\x5f\x25\xab\xf0\xb4\x28\x30\xbf\xa3\xa3\x25\xe6\xa7\x18\xd2\x9a\xb5\x86\x9d\xc1\x42\x80\x5e\x01\x7d\xf7\xaa\xb3\xa3\x1e\x8d\xbd\x39\xdd\xb9\x3e\x29\x1a\x0e\x78\x35\x91\xc5\xc3\xc3\xa2\x7f\xa4\xec\x3e\xdc\xbe\xa4\xf6\x8d\x22\xed\x71\x6e\x59\x2e\x5a\x18\x05\xa1\xb5\xab\x4b\x4e\xe8\x0e\x4e\x85\xd9\xd0\xf1\xb4\xc3\x7e\x8e\xa7\x1e\x03\xf7\xeb\x98\x09\x61\xd1\xf7\x3c\x87\x76\x85\xe1\xce\x84\x64\x73\xa8\x28\x54\xdc\x6e\x00\xbd\x63\x8a\xa0\xf0\xd5\x04\x19\x57\x25\xee\xaa\xc4\xbd\xf9\xc4\x8d\xce\xd7\x7e\xb7\xd6\x8f\x06\x83\xa2\x9c\x29\xa1\xe2\x2e\x5e\xd6\x35\xa4\xee\x48\x2f\x8c\x84\xb9\x70\x7a\x73\xa4\x67\x25\x6e\xab\xc1\x1e\x4d\xc4\x9d\x89\xb8\xd3\x11\xe9\xbe\x13\x0f\x23\xd2\x2b\x2d\x6d\x90\x67\x3e\xf7\xb1\x06\x1f\x5b\x79\xcf\xf8\x02\x53\x87\x15\xdc\xbc\x1e\xb1\xa5\x8f\x43\x65\x7a\xea\xd2\xb2\x72\x51\x6d\x1d\x8b\x36\x6d\x24\x66\xb7\xce\x61\x45\xc8\xcb\x4c\xe9\x90\x75\x80\x5a\x5f\x56\x2d\x8e\xd4\x30\xad\x63\xed\x7d\x9f\x9d\xd0\x06\xee\x31\x71\x51\xb3\x71\xa5\x0f\x4f\x0a\xda\x5a\x26\x96\x0d\x54\xb7\x22\x91\x9d\x86\x11\x5c\xcb\x97\x92\xd7\x13\xba\xd2\x9b\xe6\x4b\x7a\x93\xf0\x4b\x7f\xdc\xd9\xa9\xf2\xb3\xf6\xaf\x4e\x85\x50\x77\xfb\x71\xe6\x1e\x4a\xc9\xcc\x15\x76\xa1\x45\x11\xca\x49\xf1\xaf\x8f\xef\x0f\x3f\x88\x7a\x77\xd4\x2f\xbe\xfb\x48\x21\x9a\x80\xa3\x61\x54\x84\x4c\x3d\x88\x82\x2e\x0d\x1b\x88\xd8\xed\x46\xab\xd5\x30\xdf\x56\x0b\x1d\x55\xd2\x51\x7b\xcc\xe6\xfd\x82\xd2\xb0\xf8\x13\x6b\x6e\x3f\xb8\x77\x06\x11\x0f\xdb\x2d\xe2\x74\x78\x7b\x41\x62\x92\x57\x97\x34\x47\xf2\x4a\x35\xf6\x51\x3d\x55\x5a\x8b\x59\xab\x95\x85\x9e\xd7\xc3\xe4\xed\xf2\x1f\xa7\x9d\xb1\x6c\x35\xc2\xd7\xea\xb9\x13\x3f\x5b\x6e\x74\x82\x7e\x04\x1b\x2d\xc5\xd7\xeb\x7f\x64\x65\xf6\x8f\x75\xf7\x8f\x4c\x69\x16\x78\x85\x99\xef\x11\x4d\x70\xaa\x3b\x6f\x6a\xe3\x1f\x4b\xb1\x0b\x31\x0d\xbe\xe9\xa7\x4c\xe7\xb8\x62\x5b\x13\xfc\x7c\x9f\x2b\xb0\xc9\xbd\x7d\x1f\xcf\x74\x88\xa8\xe7\xfa\x8e\xac\x46\x11\x54\x13\xfc\x4c\x51\x72\xa4\xa1\x5b\x97\xb7\xc5\xa6\xe4\x3e\xdf\x53\xc2\xc2\x7d\x51\x12\xe9\x69\xf1\x7b\xb6\x9d\xb2\xba\x64\x09\x9f\x44\x50\xda\x25\xfc\x87\x1a\xd6\x4f\xb5\xb4\x93\xab\x3f\x8a\xf4\xed\x13\xb5\xfd\xe5\x12\xa8\xed\x73\x01\x95\xa3\x4a\x08\xfe\xe3\xf9\x69\x31\x58\x72\x82\x9d\xb4\x30\x75\x94\xa6\xc2\x59\x9f\xea\xb5\xba\xf6\x64\xb5\xf2\x58\x6c\x6b\x58\x3d\x7a\xa0\x79\xb7\xf9\xeb\xd7\x61\x93\xfa\xf1\xb4\xe9\x3c\x74\xb0\x71\x94\xd5\x6f\x01\x31\xbe\x4a\x3c\x7f\x85\x6c\x97\x83\x6d\xa3\x2a\x43\xc8\x9d\xea\xfe\xb1\x78\x7e\x96\xe2\x6e\x20\xc5\xd9\x50\x8a\xd1\xf1\x7d\x71\x74\xac\x34\x54\x68\xa6\x9d\x28\x9d\xaa\x93\x1e\x85\xe6\x5d\x2f\x2b\xc9\x90\xb9\xec\xe8\x38\xb3\x4b\x48\x9c\x42\xbf\x86\x50\xc8\xa3\xd9\x5b\x8f\xf7\x3a\xd4\x7c\xbc\xa7\x45\xeb\xd4\x98\x73\x9c\x36\xb5\xea\xff\xe3\x5a\x72\x7d\xf5\x98\xa9\x3e\xfa\xda\xd4\x8c\x32\xa9\xcc\xdb\xe0\x4c\x6a\x78\x04\x15\xad\x79\xfb\xc7\xbf\x7e\xb5\xf6\x39\x2a\x19\x1a\x40\x60\xff\x58\xe9\xe5\x3f\x56\xbb\xa1\xba\xba\x2c\x01\xa1\xad\xad\xbf\x13\x54\x1c\xdf\x7a\x28\x1c\x78\xaa\x82\x92\xc1\x2a\x69\xe0\x1f\x43\x67\x91\x67\xce\x37\x3b\x6a\xe0\x75\x20\xc1\x95\xba\x4e\xe4\x75\x83\x41\xc5\x24\xe9\xc6\xd3\x4a\xfa\x7c\x40\x52\x31\x84\x44\x05\x7b\xf0\x38\xc4\xd2\xa7\x8b\xb5\x4e\x4d\x0f\xf4\x23\x62\xee\xb2\x5d\xa4\xbc\x94\xfc\x3c\x1a\xbd\x92\x8e\xc8\x19\xf7\xc4\xbc\x91\xab\x93\x79\x73\x56\xa6\x9f\xef\x1c\x8b\x44\x6d\x38\x47\x91\x61\x8d\xb6\xcf\x89\xcb\xab\xd1\xb9\x6d\x54\xe8\xd7\xaf\xd3\x73\xf7\x86\x5f\x0c\x60\x24\x7c\xae\x88\xd1\x39\x95\x72\xee\x84\x8f\x72\xc5\x6b\x0c\x20\x4d\x45\x29\x9a\x2c\x4d\xc8\x2f\xfa\xc4\xae\x5f\x4e\x0a\x4f\x0c\x8b\xfb\x70\x39\x74\xc1\x0f\xd3\xcf\x2a\xa5\x5b\xe7\x4b\x45\xf4\xcb\xb0\xe4\xf5\x45\x5b\xf2\x6a\x3e\x1a\x9b\x5c\x57\x6d\xe9\x15\xf2\x69\xb1\xe5\x8a\x63\xda\xf6\xac\x42\xe3\xeb\xac\xe2\x1d\x3e\x4b\xbc\xc5\x8d\x24\x2b\x38\x8f\x8e\xd3\xfb\x8d\xb3\xca\xec\x87\x7b\x71\x82\xc3\x96\x1f\xee\xc3\xd2\xaa\xf8\xa8\x56\xf1\x86\x74\x32\xee\x03\x65\xd4\xb7\x5b\xdf\x07\xca\x28\xed\x61\x3c\xc7\xeb\xbf\xa0\xad\x0f\xe3\x25\x8d\xd0\x0b\x6a\x31\x27\xa1\xab\x5a\x09\xef\x9d\xa3\x63\x5a\xa2\x2f\x32\xa5\xbd\x96\x43\x43\x9d\x46\x2d\x0d\x47\xb3\x87\x07\x3a\x79\x73\x60\x8c\x7b\xaa\xdd\xb2\xd1\x55\x1a\x9f\x12\xea\x20\xd0\xa4\x05\x62\xbd\x96\x0c\xa2\x7a\xb7\x15\x46\x7d\x4f\xd7\x92\x9c\x52\xe0\x82\xb6\x7c\x46\xd9\x8f\x8e\x85\x89\xe3\xbd\xdc\x91\x6f\x13\xcb\x98\x1f\xf9\xe9\x30\x49\x75\xc6\x13\x0e\x21\x0d\x73\x00\x4a\x5f\x6a\x5a\x85\xfc\xcf\x85\x88\xb3\x03\x15\x11\x5e\xf0\x6a\x02\x5c\x33\x9a\xdf\x48\xa5\x68\xb1\xd7\xc4\xc1\x93\x95\xa5\x3a\x1d\x08\xe2\x35\x07\xc7\xc6\x62\x4a\x23\xf1\xae\x64\xd8\x00\x25\x53\xf5\xf8\x7c\x2a\x30\x35\x66\x03\x2b\x0d\x99\x68\xc4\xc8\xd2\xa1\x39\x8e\x52\xda\x44\xe3\x91\xd1\x8c\x42\x2b\x7d\x69\x70\x8b\xb0\x41\xef\x68\x89\xf6\x93\x68\x71\x8a\x98\x16\xe6\xb9\x62\x4b\x2b\xf3\x65\x2a\xb5\xd5\x54\x3a\x51\x33\x75\x8d\x04\xd8\x96\x04\x9d\xc7\x7c\xca\x06\x9f\x97\xdd\x7e\x9b\xa5\x63\x7d\x36\xa7\x41\xa2\xbf\x8b\x8b\xd3\xb8\x25\x59\xea\x6d\x49\x9c\xee\xcd\x16\x2c\xd5\x7d\x59\x39\x89\x5f\xc6\x10\x44\x8e\x4f\xbd\x75\x36\xc8\x91\x6b\x74\x7a\xa3\x61\x8e\xc3\xeb\xe8\xfa\xc7\x3f\x97\x2d\x7c\x62\xc8\x95\xac\xbb\x0c\x8c\x9b\xb9\x61\xc7\x2b\xb8\x1a\x79\x6b\xe7\x9a\x71\x18\x41\xbb\xdc\x9e\x93\x92\xc5\xdc\xa9\xa1\x8f\xb2\x36\x36\x6a\xcf\x0e\x87\xc4\x05\x61\xb7\xdb\xdc\x21\x76\x2a\x05\x2d\x0a\x45\xa9\x1d\x09\x86\x17\x76\x2e\xd4\x64\x26\xcd\xb1\x3b\xf6\xd3\xd1\x52\x1b\x24\x23\x4f\x05\x34\x27\x30\x73\xed\x24\xd1\xff\x45\xff\xb3\x25\xfc\xc6\xbc\x56\xd6\xd6\x9f\x29\xef\x9f\x5f\x25\x9a\x8f\x09\xf5\xbc\x5e\xa8\xd8\xe9\x60\x87\xb0\x4f\x10\xd0\x29\x33\x3a\xf6\x20\xe9\x07\x83\x08\xed\x68\xf8\xd0\x44\xd9\xc9\x9e\x3f\xc8\x36\x4d\x47\xb4\xd9\x65\x5e\x64\xc4\x0f\x2d\x1a\xf7\x3b\x68\x17\x61\xe4\xde\x1f\x00\xac\x2e\x61\x09\xa9\x0b\x65\x18\xaf\xd2\x58\x36\x05\xab\xda\x22\x5d\x81\xce\x2b\xa9\x70\xba\xb6\x26\x55\x1f\x49\x43\xf8\x9a\x77\x31\xf7\x25\xa9\x68\xe2\xc5\xf3\x6f\xed\xe6\xf1\x2f\x59\x87\x87\xcd\x47\xab\x49\x2e\xc0\xf3\x6f\x9f\xe6\xf3\xa6\x23\x88\x7f\xab\xb7\x7e\x62\xc4\x07\x98\x66\xd8\x6d\xfc\xd1\xb2\xdd\xf7\x55\x15\x10\x07\xb0\x51\x31\x0c\x41\x51\x5c\xf3\x57\x3e\x10\x9c\x2b\xcb\xf4\x7d\xd1\x60\xb5\x33\x37\x08\x2e\x18\x99\xbd\xf6\x4b\x7b\x42\x66\xb1\x34\x5c\x77\x1c\xbe\x97\x9c\x63\xc7\x32\xe9\x19\x0a\x16\xad\xce\xf7\xd5\x8c\x40\xc7\x27\x09\xf4\xed\x86\x64\x66\x47\x09\xca\x78\x75\x33\xc7\xb7\x7f\xb8\x7e\xf8\xd2\x03\x21\xea\x21\x3e\xa3\x1b\xbd\x70\x3b\x99\xa0\xb9\x6a\xdd\x58\x33\x0b\xc7\xef\xd6\x95\x62\xc2\x63\x97\x96\x95\x52\xd2\x7c\xce\x8b\x6b\x97\xb6\xce\x44\x0c\x43\x6b\xea\x5c\x9c\xc0\x0b\x7c\x9a\x7c\x32\x97\x5c\x28\x36\x60\xa6\x06\x35\x8d\x56\x35\x6e\x4b\x6b\x82\x9c\xcd\x8f\x93\xa9\x35\x18\xd6\x92\x95\x24\x69\x83\xfd\xb2\x79\x54\x3a\x3e\xcd\xf6\xf7\x90\x64\x56\xfa\xf6\xb4\x6a\x98\xac\x25\xe3\xe0\x0a\xda\x45\x54\x55\x57\xce\x4d\xad\x24\xc1\xaf\x5f\x69\xdf\x26\x74\xad\x9e\x9f\xc9\x14\xbc\xd0\xe2\x0f\x47\x9d\xa9\xb3\xbe\x70\xe4\x98\xf1\xbb\xdf\x97\x9e\xbf\xe3\x17\x4f\xfb\x5a\xbb\xbc\x15\x7b\x1f\x0e\xdf\xb1\x48\x74\x44\x1b\xc5\x7c\x69\xd2\x73\x2e\x16\x44\xef\x44\xd3\x07\xe2\x13\xcb\x47\x21\x3c\x89\xbf\xd9\xcf\x3a\x94\x27\x9b\xcd\x54\x9b\xb4\x13\x7a\xf7\x31\x93\xc5\x3b\x49\xf3\x51\xf2\x1b\xee\x7f\x03\xd9\x6a\xf9\x32\x68\x0e\xfe\x8b\xe1\x39\x07\xf0\x7e\xce\x8c\xfe\xa5\x46\x56\xab\x1d\xb3\x8f\x5a\xf3\xac\x3f\x66\x73\x27\x19\x59\x9d\xc2\x3e\xdf\x1a\xff\xb2\x99\xc1\xf0\x01\x27\x8f\xb1\x90\x6c\x6c\x90\x27\xc9\x5c\xf1\xb0\x2e\x71\x7c\x01\x83\x65\xf0\x9c\xce\x89\x4d\x0b\x88\xdb\x9e\xcc\x86\xac\xdb\x3e\x3c\xa6\x08\xc6\x38\x43\x52\x58\xa3\x1d\x75\x47\xc3\xa2\x6e\x18\xf1\x2d\x94\xac\x97\x54\xea\x1d\x43\xad\xe2\x84\x4b\x93\xac\xbc\xae\x2f\xf2\x1a\x41\x31\x14\xb7\x21\x5f\x9e\x67\x4a\x57\xcb\x4d\xc7\xe6\x3d\x69\x61\xa6\x34\xe0\x7d\xf4\x53\x3d\xd7\xaa\x91\x8d\x60\x63\xe3\x2b\x6b\x4c\x05\x50\x39\xc9\xcc\xc9\xf2\x27\xe9\x6e\x4f\x4f\x47\x6b\x80\x20\x17\x6b\xa9\xc0\x04\x1b\x49\x2e\xd6\xd9\xd9\xb1\x39\x3b\x5b\xcc\x15\x98\x6c\xb8\xe5\x63\x43\xa8\xea\x01\xb2\x65\x0a\xd5\x2a\xe6\xab\x1e\x45\x0b\x4d\x2a\x79\x63\xb3\xa3\x25\xfb\xa5\xc8\xe2\x12\xc4\x8b\x1b\x34\x38\x4b\x4f\x7c\x94\xeb\xd6\xba\xdd\x5a\x2b\xda\xd8\x98\xfb\x74\x5b\x5d\x49\xbc\x60\x35\xd4\x8d\x68\x47\xff\x0f\x51\xee\xb8\x31\x18\xd1\x9e\x7f\xca\xcf\x29\x71\xe9\xf8\xef\x52\xda\xd3\x0d\xb1\x4e\xd2\x0a\x38\xb0\x40\x4f\xd0\xff\x30\xfc\xba\xb7\xd2\x5b\xf7\xbb\x7d\x2a\xa6\xf8\x3a\x5f\x7a\xdd\x93\x21\xde\x7c\x72\xb8\x4d\x99\x1a\x1d\x04\xd7\x45\xef\x5f\xa5\x7b\xad\x5e\xae\xbc\x5e\x17\x8f\x48\x5f\xc3\x73\x1d\x36\xcb\xb2\x2e\xfa\x09\xe0\xa8\xdf\x6d\xaf\x8b\x41\xf2\xfd\xad\xbb\x2e\x86\xf8\x6a\xcb\x87\x6e\xff\x5b\x83\x9a\x76\x5d\x8c\x18\xd0\xe8\x24\x80\x31\x00\xfd\x28\xd4\xc5\x3d\xe9\x4f\x55\xd8\xb3\xfe\x42\x51\x13\x84\x27\x51\xab\xd5\x7d\xd2\x69\xa7\x29\x44\x25\xdf\x4d\x01\x94\xc3\x1a\x95\x32\x6f\x6b\xda\x2d\x1d\x18\x24\xaf\xc0\x2e\x8d\xc6\xfd\xa3\x34\x86\x1f\xe4\x91\x07\x0b\x87\x4f\x07\xa9\x7d\xc3\x50\x3b\x92\xbf\xd9\x15\xad\xa0\x78\x21\x7c\x5a\x14\xf0\x7a\xe7\x5b\x80\xbf\xd7\x51\xfa\x3e\xad\xf3\x20\x5f\xcc\xfd\xf9\xe0\x77\xb9\x47\xf5\xe5\xdc\xf9\x7f\x5d\xf7\x90\x72\x47\xfa\x85\x46\x3c\x6f\x57\xda\x76\x02\x3b\xfe\xe1\x55\xef\x69\xdb\x2a\xf3\xe9\xa3\xb0\xbd\x5b\xe9\x99\x87\x42\xfc\x3a\xe8\x61\x4f\xe8\x07\x43\x54\xef\x88\x3d\x91\x8b\xfd\xc5\x44\xeb\xff\x17\xff\x89\x7f\xeb\x26\x6d\x6b\x0f\x69\xb7\x28\xed\x81\x95\x56\x47\xbe\x49\x0a\x3a\x5c\x8e\x54\xb5\x20\xe7\xd1\x62\x2d\x4d\xf5\xec\xeb\x4f\x53\xc9\xfa\xff\x05\x1f\xdf\xbd\x2b\xe4\xd7\x4d\x71\xc7\xcb\x78\xbd\xff\xf8\xd7\xfb\x28\x4a\xf0\x4a\xaa\xa6\x0d\xb4\xcc\xab\x0d\xf4\xb1\xf4\x1a\x12\x4b\x9a\xaf\x7e\xf7\xfe\x54\xbf\x97\x53\xf5\xfb\x04\x85\x78\x12\x9e\xef\xcc\x3e\xfb\xf2\xc8\x84\x3e\x57\x4c\xa8\x7b\xe9\x6d\xfd\x89\x64\xcd\x3f\x39\x75\xfb\x4d\x92\xe6\xd4\x84\xf6\x9f\x4c\x48\xbf\x59\x47\xbe\xf8\x25\x31\xe6\x58\xb2\x37\xa3\xe1\xf2\x53\x1c\x42\x98\xe3\x3a\x2f\xe6\xed\xfa\x7c\x63\xbe\xe2\x19\x0f\x11\x29\xd5\xb6\x57\x2e\x1d\x09\x73\x02\xa2\x56\xcf\x08\x22\x58\x4f\x09\x36\x6b\x44\x8b\x70\x3e\xd9\xcd\x5b\x62\xe3\xe7\x53\xe2\xe8\xda\xde\xf3\x99\xf2\xd8\x5b\xbb\x70\xaa\x3a\xee\x5e\x10\x4b\x15\x01\x9b\xc2\x0c\xdc\xe9\x07\xdb\xb0\xa5\xa8\x8e\x69\x61\x3b\x79\x94\x62\x70\xa4\x77\xbc\x30\xcb\x4f\x83\x99\x27\xa8\x9d\x72\xa0\x74\x7f\xdd\xc0\x8e\xd7\x91\xd5\xaf\xd3\x7b\x5c\x86\x19\x99\x8a\x1a\x9c\x16\xbc\xbc\x63\x6d\x1c\x7a\x0b\xb7\xfc\x9c\x8e\xfa\x59\x5d\x21\x16\x12\x51\x99\xba\xdc\x80\x94\x94\x79\x77\xb3\xdc\x84\xd4\x8d\xd2\x76\x87\x9e\xb7\xf5\x8a\xc7\x3f\x60\xe8\xe2\xe7\x61\x54\xf4\x45\xbf\x59\x0c\xf4\x9c\x0d\x67\xd8\xca\xd6\xff\x9a\x77\x65\xb8\xb8\x91\x48\x1b\xdb\xb6\x1c\x65\xe6\x2f\x8f\x98\xc4\x8c\x54\x66\xc5\x93\x3c\xdb\xde\xd0\x0a\xbb\xbc\x56\xa7\x55\xb4\x07\x16\xcb\x7e\x6e\x31\xa9\xc7\x32\xc5\xdb\x61\xe5\x7a\x3f\x41\xe2\x05\x03\xba\x99\x7f\x69\x41\x97\xdf\x3b\x2c\xa2\x25\xdd\x7a\x00\x4d\xeb\x43\x31\x19\x26\xef\x7e\xa4\xad\xaa\xf7\x2d\x5e\x78\x17\xc1\x97\xe2\x7c\xb9\x24\x22\x2a\x56\xdd\xf1\x2e\x94\x2b\xb4\x02\xb1\xfb\xfe\xc3\xa6\x9f\xa8\xc2\x5c\xbe\xdd\x32\x9a\x32\x8f\xf2\xed\x16\x14\x8b\x22\x27\xce\xb9\x1f\x44\x0d\x7f\x7c\x41\x0c\x10\x85\xfb\x39\x8f\x42\xee\x39\xac\xba\xa9\x62\xfe\xde\x64\x1d\xe9\x85\xe4\xfb\x49\xf2\xad\xcd\x7d\x95\x21\xf2\xdc\x3f\xa9\xca\xc4\xca\x53\x93\x18\x42\x73\x5b\x73\x5c\xd8\x78\x6a\x1a\x1b\x4f\x2d\xcf\x40\x9b\xf7\xa2\xe3\xb5\xdc\x7e\x53\xf4\xbc\x48\x4f\xb3\x16\xbf\x5d\x19\x24\xdf\x9d\x8c\x50\xf6\xff\x7b\x67\x82\xf6\x36\xd9\xc3\x07\xa7\x07\x41\x71\xec\xd5\xb2\x47\x2a\x5c\xea\x54\x4f\x68\x32\x8c\xc4\x98\x82\xee\x73\x8c\x1b\x7b\x42\xd2\x17\xbd\xec\xdf\x79\x31\xc0\x1f\x08\x53\x3a\xf7\x00\x56\x83\x75\x6e\x0e\x77\xdc\x50\x2e\x64\x8e\xe8\x1f\xe7\xe3\x12\xd0\x01\x9d\xaa\xcf\x1e\x53\xa4\x52\x37\x7e\x35\xc7\x70\x5b\xd5\xa3\xfb\x19\x9f\x86\x1a\xdd\x84\xcb\x23\xbd\x11\xf8\x5c\xc9\x68\x00\xab\xe2\xd5\x72\xaa\x59\xdf\x71\xef\x48\xf7\xb4\x61\xd2\xc3\xaa\x8f\x31\xea\x14\x89\xc6\x21\xfe\xd3\xeb\x31\xe4\x58\xa1\x4b\x53\xa5\x64\x57\x97\xf2\xb9\xf2\x9b\x52\x4a\x56\xfb\x5f\x4e\xa9\xd5\xdd\xbf\x36\x7d\x6a\x6c\x74\x33\xb5\xae\x66\x10\x9b\x2d\x6a\x5d\xbd\xe5\xf2\x73\x9a\xf9\x66\xde\x8e\xc4\xd4\x74\xc4\x9e\x09\x1c\x78\x66\xe1\x16\xe7\x7a\xc4\x14\xde\x63\xc8\x1c\x49\xe7\x40\x9c\x2b\xa3\x5f\x6a\x28\x78\xa3\x74\x08\x94\x93\xee\x6d\x6e\x8e\xb3\xa6\x06\x71\x85\xcb\x90\xe6\x7f\x5a\xe2\xda\xbb\xda\xe9\x15\xa9\xf3\xe9\x77\x5a\xdc\xa3\x5d\x0c\x77\x5d\x59\x5c\xe3\x05\x00\x77\x1d\x87\x55\xc7\x43\xc6\x49\x93\xf8\x56\x12\x5f\xf7\x2e\xa7\xb8\xd2\xd7\x0b\xfb\x4f\xd4\x88\x1d\x4f\x87\xab\xac\xad\xd8\x7c\xdb\xca\xb0\xad\xbb\xb4\xa6\xdc\x39\x2e\xd6\xd3\xda\xe8\xfb\x15\x01\xae\x3d\x6a\xd2\xad\xbf\xf2\xdb\xe5\x5f\xbf\xfe\xce\x7f\x2a\xef\x38\xd7\x1e\xf1\xe9\xb2\x97\xcf\x14\xff\xce\x6f\x7b\xe5\x8d\x8d\xad\x8f\x1a\xbe\xfb\x99\xe0\xa1\xd1\x75\xbb\x24\x56\x7d\xe5\x99\x57\x6a\x0a\x94\x0b\x33\x48\x92\xbb\x82\xb2\xc1\x95\x88\xb2\xaa\x11\xcf\xdf\xbe\xcf\xe8\x8e\xed\x88\x32\xb4\xa0\xe8\xff\xd7\xe8\xcc\x03\x74\xe3\x8c\x47\xe1\x1e\xa4\x0c\x4c\x43\xfe\x9a\x42\xac\xc0\x57\xca\x4e\xcd\xca\xa5\x57\x38\x1d\x45\x4b\xb5\x5f\x32\x0b\x45\x22\x39\x69\xcf\x6c\x83\x15\x8e\x8b\xb0\xb2\xb8\xcf\x49\x16\x36\x84\x34\x58\x3e\x62\x42\x95\xff\x64\xc8\xe6\x2a\x59\xd7\xd2\x35\x0c\x96\xfd\x68\x76\x89\xa7\xe5\x38\x73\x92\x99\xac\x38\x7e\xde\x66\xf6\x6c\xba\x07\xa3\x12\xda\x5e\x3a\x2c\x8c\x7e\x5f\x20\x72\x6e\x7e\x2b\xbd\x3e\xd4\x8d\x1e\x88\x02\xc0\xb6\x75\xd6\xb9\x32\x75\x0d\xa9\xca\x7b\xf7\x72\x33\xc8\xee\x3d\x38\xb4\x49\xce\x43\xc7\xf3\x32\xf3\x76\x0b\x0c\x81\x3e\xed\x52\xa8\x65\x12\xf5\xcd\x54\x0d\xb5\xf9\x27\xeb\x9c\xd6\x58\x0b\x03\x0c\x18\x9a\x16\xe0\xbe\x4a\x79\xed\x72\x53\x52\xcb\xbe\x54\x3a\x71\x6b\xcd\x7f\x79\x8a\x37\xf5\xd7\x3b\x7c\xb4\xbc\xc3\x07\xa3\x9e\x74\xa4\x43\x1d\x05\x6b\x22\xe9\x91\x0e\xc5\x1e\x15\x1e\x27\x25\xd2\x64\xcf\xff\xc9\xb3\x9d\x93\xf6\x00\x39\xd2\xa1\x58\xcf\xe7\x52\xac\x26\x54\xb6\x45\x43\xb1\x46\xb3\xd7\xdd\xeb\xd1\x17\xb1\xc9\x6c\x4f\x84\xb9\x4e\x76\x00\x3a\x72\xcd\x6c\x8f\x7e\xe9\x1b\x61\x93\x2a\xd7\xc9\xe9\xd8\x9c\x8a\xa5\x5c\x39\xca\x65\xca\x6a\x19\xfe\x00\x8a\x4a\x0e\xf4\xf6\xda\x6f\xf0\x86\xf0\x3c\x70\x6a\x99\xa2\xfa\xf6\x02\xac\x78\x18\xd2\x3f\xee\xf8\x6a\x2e\xd2\xac\xee\x4f\x6e\x87\x00\x33\x02\x71\x78\x11\x48\xf3\xe3\x92\xfe\x2a\x26\x27\xb1\xf5\xa0\x96\x80\x3e\xdd\x00\x4a\x2e\x24\x47\x43\x6f\x2b\xc0\xd2\x15\x62\xd5\x8a\xf0\xa7\x05\x69\x99\xe1\x58\x50\x25\xad\xb1\xf0\x7b\x62\xdf\xb0\xde\x2e\xfa\x6d\xff\xa7\xbd\xd2\xa4\x6c\xbc\x4d\x3f\x3d\x27\xf6\xd8\x6f\x82\x24\x48\x42\x93\x09\x8e\x6f\x93\xe0\xa4\x99\x04\x8f\xa5\x31\xbd\x41\x22\x6a\x21\xaf\xc3\x0f\x6f\xb4\x55\x31\x6d\x59\xe3\x54\x3f\xad\x3f\xd1\xbf\x15\x0d\x3f\xd3\xdf\x5f\xf4\xef\x8d\x86\x1f\xea\xef\x69\xd9\xda\xf7\x3c\xf7\x70\xc6\xaf\xe0\xb7\x5e\x7e\xf6\xc3\x23\x5a\xd5\x5e\x80\x04\xc0\xad\x17\xa5\xee\xb5\xf4\x66\x0a\x22\xb8\x48\x0b\xe3\xe9\xfe\x3b\x51\x7e\xb5\x38\x6e\x15\xda\xf5\x97\x0b\xfd\x9d\x8c\x5f\x5f\xe1\xcf\x92\x1a\x4d\xc9\xf8\x83\x68\xc8\xb6\x97\x06\xab\x45\x7d\xaa\x45\xff\xea\x25\xfa\x06\x6a\x10\x6b\xac\x10\xa0\x21\x93\x26\x43\x02\x86\xac\x75\x1f\xb4\xe8\xd7\x4c\xd8\x2b\x75\xb1\x4c\xba\xd5\x4f\x7a\x35\x58\x21\x3c\x17\x94\xaa\x01\x6b\x49\x56\x2f\x04\x94\x0d\xc4\xc5\x7d\xa6\x64\x4a\xdd\x7f\x12\x32\xb9\xea\x80\x90\x3d\xdf\x16\xc9\xc0\x8c\xf3\x0b\xc7\x4c\x8a\xa7\xf1\xea\x05\xfe\x12\x64\x84\x0e\x13\x8f\xf1\xb1\x46\x3c\x2e\x9b\xf0\xd4\x45\x67\x4e\x6f\xd3\xf7\xe0\x89\x6b\x35\x0c\x45\xb9\x9d\x36\x49\x49\x9a\xe5\x5a\x1f\x9f\x3e\x3d\xd3\xae\xa6\xe4\x63\x27\x68\x9a\x89\xbf\x8f\xb4\x39\x4b\xca\x25\xf5\x8e\x66\x7c\x9b\x04\x1f\xde\x2c\xde\x7e\xdf\x26\x5a\x63\x7c\xee\x9f\x3c\x23\xe7\x5a\x89\x5d\xc2\xae\x2a\x1b\x31\x2d\x6c\x07\xe9\xf1\xa2\x7a\x56\x50\xaf\x4e\x43\x26\x78\x93\x09\x0d\x58\x83\x2d\x69\x84\x18\x3a\x6f\x69\x33\xc4\x99\xd2\x9a\x13\x6c\xdb\xf1\x9b\x76\x6c\xa6\xa4\xe8\xab\x79\xdc\xba\xb4\xc8\x66\x0b\xe0\xa0\xea\x2b\x5b\x80\xd4\x50\xfb\xe4\x35\xa9\xf3\x62\x8f\xa4\x42\x6a\x8f\x52\x93\x95\xf5\xe8\xbb\x29\x60\xb5\x74\x16\x27\x79\x89\x11\xe6\xbc\xf7\xa5\x26\x2c\x6a\x51\x3a\xf0\x35\xe9\xb2\x05\x3d\xc5\x1c\xf0\xea\x3c\xd1\x0f\x6b\x79\x4d\xf7\xc1\xb9\x1e\x40\x21\x6c\xd2\x8a\x8a\x5d\x2c\xde\x51\xab\x65\x8e\xa3\xb6\xf8\x6b\xd0\x93\x01\xbe\xf2\x42\xb6\x1a\xb5\x4e\xb1\x71\x38\x03\xaf\x47\xd6\x8b\xcf\xda\xbc\x7b\x13\x9c\xac\x45\x72\xb2\x65\xd7\xbf\x7a\x4f\xcc\x9d\x44\x5f\xea\xd1\xc1\x76\x58\x1a\x98\x8e\x1c\x71\xd6\xf0\x8b\x55\xeb\x4c\x97\xd0\x11\xa3\xb4\x84\x31\x65\x1c\x6f\x47\xa5\xb1\xc9\x38\xe5\x8c\x5f\x3f\x9b\x8c\xbd\x5b\x99\x8d\xb3\x7b\xa7\x94\xbb\x56\xed\x65\xb3\xf7\xde\x54\x15\x43\x42\x22\x75\x77\x53\x71\x57\x92\x93\x5b\x19\x7e\x01\xcf\x8c\x7f\x33\x46\x63\x80\xf9\xd0\x8f\x62\x47\xa8\x50\x1b\xd1\x65\x0b\xba\x50\x9e\xa4\x61\x16\xdd\xf3\x82\x24\xf3\x4e\x0d\xb6\x74\x63\xfa\x17\xda\x9e\x32\x8c\xbf\xd9\xdb\x6c\x36\xe1\x68\xc9\x18\xe5\xc9\x96\x4c\xa2\x42\x66\xc6\x4f\x1f\x9a\xc4\xde\x1c\x25\x26\x34\x89\x29\xb1\xd8\x80\x20\x0d\x66\x89\x91\x4c\xd5\x40\x59\x93\xa6\x23\x6d\x49\x30\x0e\x9b\xb4\x81\xa6\x11\xd8\xd9\xe9\xe4\x0a\x45\x3c\x66\xb8\x9c\x66\x44\x7e\xbb\xb3\xb1\xd1\xa4\x39\xee\xb4\x90\xf9\x08\x6f\xee\x6f\xd8\xde\xaf\xc4\x98\x8f\x8c\xe3\x48\xa3\xdb\x31\x2d\x1b\xbd\x40\x49\x5c\x79\x63\x83\xb6\xcd\x4d\x01\xb0\xc0\x37\xfd\xb9\xb9\x49\x13\x7f\xb1\x12\x9f\xa5\x89\xbf\x20\xdd\x19\xfe\x54\xac\xc4\x27\x56\xe2\xd3\x34\xf1\x09\xd2\x9d\xe2\xcf\x0f\x4a\xdc\x64\x5d\x5a\xac\x94\x93\x32\x75\xcb\xe2\xce\xdb\x74\xb7\x35\xf3\xb9\xfd\x4a\xd9\xac\xcc\xa4\x53\x5e\x4f\xd3\x74\x9d\xb3\xb5\x38\x6a\xf9\x17\x3c\xc5\x7d\xe7\x79\x00\x2f\x6c\x79\xe3\x85\x4d\x1f\x3d\x5d\xf2\x59\xd1\xa3\xe4\x1f\x5a\x42\x69\x1c\xac\xf2\x50\x65\x14\x29\x8d\x55\x9b\x40\x5b\xb5\xd1\xdb\xe3\xbe\xd4\x77\x12\x8d\x2e\x5b\x0c\x20\x21\xe6\x41\x87\x6a\x30\xa6\x12\x1a\x2f\x3c\x91\xde\xfd\x5f\xfe\xfa\x15\xaf\x99\x4d\xf0\xaf\x5f\x35\x1d\xa6\x96\xe1\xdf\xf2\x89\xde\x1f\x94\x4f\xec\xfb\xc8\xf2\x09\x23\x00\xb9\x20\xd0\xee\xd6\xb4\xec\xee\x45\x66\xd7\xed\x69\x93\x77\x44\x4b\xcd\xa0\x57\x3e\xa1\x6d\x48\x19\x68\x9c\x9c\xc0\x4a\x4c\x80\xf1\x17\x65\x0c\x70\x72\x22\x68\xb9\x07\x98\xc6\x22\x83\xab\xd7\xc3\x3e\xcd\x75\x87\x24\x96\x18\xee\xa7\x2e\xf8\x5f\x02\xec\x00\x78\x5f\x82\x8d\xd6\x6b\x67\x78\x8b\xc7\x8a\x94\x99\x06\x62\x5a\xe6\x88\xa0\x5b\x80\x5e\x4e\xd7\xbc\x88\xdd\x53\xd1\xca\x1e\x91\xd4\xa4\x56\x13\xdd\x5e\xe7\x48\xdb\xbf\xe5\x17\x61\x1c\x1e\x20\x5c\x53\xe1\x29\xc2\x4d\x15\xde\x45\xb8\xa5\xc2\x4f\x08\x77\x54\xf8\x19\xe1\x9e\xf7\x03\xe1\xc7\x5b\x58\xa3\xc7\x86\x9d\x3f\x27\x90\xae\xf6\x32\xb4\x97\xe4\xcf\x31\xf0\xdc\xd3\xce\xae\xa6\x65\xc2\xea\xd7\xaf\x80\x06\xfe\x9a\x17\x23\x70\x73\xb3\xe6\xbd\xea\x21\xf4\x85\x40\x35\x04\xce\x28\xd0\x44\xa0\x42\x71\x03\x04\x4e\x08\xd2\x42\xe0\x94\x02\x1d\x04\x7e\x50\xd4\x28\x83\x02\x99\x38\x92\x76\x60\x74\x96\x84\x9f\x9e\x40\x49\xc4\xa9\x51\x0e\x31\x68\x94\xe2\xe1\xc1\x22\x09\x4e\x2d\x08\x8f\x24\x0f\x09\xe4\xf7\x46\xa6\x51\x88\x3b\x29\x67\x39\xef\xf3\x79\x31\x3c\x46\xeb\xd5\xff\x82\xb3\x92\x10\x2c\x3b\xc2\x9f\x58\x33\xef\x2d\x4f\xf9\x58\xd9\xd8\x50\x1e\xbe\x60\x06\x5f\x85\x0b\x14\xfe\xc6\x2b\x95\x72\x9e\xa5\x7d\x7d\x11\x3f\xd3\xca\xc1\xb0\x1f\x53\x13\x50\x81\x9b\x03\x14\xb0\xe3\x8c\x71\x74\x96\xa4\xa0\x05\xcc\xfa\x2e\x60\x79\xe3\x6f\xf7\x50\xaa\x6f\x6b\xc1\x56\xfb\x6a\xc6\x89\xb7\xd6\xec\x52\x1a\x9e\x58\xfe\x15\x36\x4d\xde\xee\x5a\x95\x35\x17\x2a\xc3\xb7\x42\x4e\x79\x74\x51\xb2\xb5\x11\xae\xf8\x79\x4b\x0c\x41\x9a\x6d\x29\xad\x32\x43\xb0\xd2\x58\xfc\xd2\x34\x9b\x95\xc2\x86\xb3\xae\xef\x81\xe6\xee\x7e\x88\x59\x8f\x6a\xd1\xba\x20\x06\x62\xfc\x26\x91\x50\xc3\x5c\x44\xf0\x5f\x54\x4d\x94\x21\xe8\x06\xad\x48\xf6\xd9\xfa\xa5\xe2\x33\xee\x5d\xac\x63\x60\x2a\xb4\xdb\x19\xca\x46\x27\xea\xeb\xb8\x5e\xf0\xff\xea\x55\x57\xc2\x77\x5b\xf9\xb9\xeb\x43\xc9\xd6\x61\x3d\x7f\xc6\xf7\x19\x83\x3b\xe9\xad\x6b\x37\x12\x2e\x0c\xa6\xad\x8b\x21\x40\x83\x56\x23\x80\xd3\x12\x31\x4a\xbe\x6e\x1a\x83\x86\xdf\x68\x35\x86\x93\x6f\xf5\x7e\x34\xc0\x7d\xff\xba\x68\xe7\x75\xec\xba\xe8\x20\xd8\x98\x52\x68\xcc\x79\xd8\x87\xdb\x49\xa3\x56\x6f\xc1\xd8\xdc\x49\x77\x1c\xe1\x12\x0b\x51\xbd\x46\x74\x0d\x3d\xf6\xdd\x4e\x0d\x36\xf1\x9e\x0d\x0c\xe5\x7c\x23\x1c\xae\x21\x39\xac\x8b\x6e\x7e\x1e\xbc\x2e\x7a\x16\x64\x8f\x6f\xe6\xf4\x7d\xd7\x44\x17\x71\x15\x0d\x1a\xe1\x48\x25\x38\x63\x3d\x26\x31\x5d\x11\xa5\x73\x3d\xaa\xe2\x4e\xba\xa8\x6d\x17\xe9\x94\x95\x39\x97\x55\xa0\xa2\x90\xc7\xaf\xaa\x79\xcf\x8a\x6d\x04\xdd\xce\x0f\xdc\xfa\x5d\x07\xb2\x15\x1d\x49\x98\xea\x5b\x17\xfb\x48\xd1\xe8\xc0\xc2\x5c\xce\x6f\x75\x83\xe6\xba\x38\x00\x28\x6c\x0c\x7a\x2d\x39\xf9\xd6\xe8\x4c\xb8\xee\xc1\x69\xe7\x8c\xcb\x59\x17\x87\x2a\x3e\x8e\x5d\x6a\x4b\x58\x36\x75\x1b\x9d\xfd\x08\x96\xef\xd6\xc5\x51\x12\xd7\xe8\xd0\x70\xdc\x6f\xf4\x69\xdc\xd2\x52\x16\x36\x46\x03\x53\xe5\xf1\xca\x34\xea\xca\xd2\xa4\xe9\x13\x8d\x41\xd4\xc7\xa0\x1e\x4e\xd6\xc5\x09\x65\x79\xb5\x9e\x3a\x3f\x56\xd4\x9d\xa2\xa0\xbf\x23\xfc\x5b\x17\x03\xca\xf1\xf1\x1d\xfe\xad\x8b\xcf\x88\xc0\xe0\x6b\xb0\x4d\x3e\x83\xf8\x17\x06\x0f\xd3\xae\x3a\x63\x40\x9d\x1b\xb2\xcc\xe1\x15\x66\xfc\xd6\xc5\x39\x47\x05\xaa\xf5\x87\x54\xcf\xff\xfd\xfd\x77\x9e\xfe\xb7\x2e\x2e\x10\xf3\x7f\xef\xdf\xbf\x5f\xb7\xcc\x79\xea\x81\xfb\xf4\xdd\xd6\x29\xd5\x42\xc3\xf4\x3c\x39\xfb\xd6\xb6\x1b\x47\x79\xf1\xf4\x3d\x53\x1a\xf1\xbc\xbd\xfe\xcb\x5b\x75\xf2\xcf\x59\x8e\x94\x61\x67\xc9\xbe\xd7\xd2\x67\xe4\xa6\xb8\xf4\x64\x1a\xe7\x31\x34\x3e\xdc\xa8\xc1\x47\x32\x48\xfe\x36\x84\xc4\x17\x13\xbb\x8c\xb7\x43\x25\x00\xc5\xa9\x78\x54\xf3\xc2\x6a\x4c\x1c\x26\xa4\x85\x91\x43\x61\x08\xe3\x24\x08\xdd\x96\x69\x51\x8c\x37\x23\x5a\x0e\x3b\xd9\xa8\xd4\xd9\xee\x6d\x6c\x14\xfe\xca\x33\x16\x1d\xe2\x33\x61\x29\x33\x36\xf7\x47\x0c\x82\xc5\x0c\x5a\x48\x61\xa8\x82\x78\x88\x89\x6b\x31\x98\x31\x6c\x79\xbd\x1c\xc5\x7d\xf2\x3a\xa5\x5c\xae\x35\x97\xbb\xa5\x72\xcf\xa4\xeb\xf7\x8c\x88\x4b\x0d\xa6\x8e\x4c\xc4\xd7\x3b\xb3\xa7\xa3\x68\x58\x5f\x7f\xd4\xaf\xa8\xbe\x69\xe9\x64\x7a\x9e\xb1\x5e\xce\xdb\x46\x62\xac\xbb\x1c\x5e\x43\xae\xd2\x87\xfa\x47\xaa\x70\x1c\x59\x95\x7d\x76\x6a\x41\x4d\x57\xbd\x7e\x26\xf9\x98\x16\x92\xd1\x44\x3d\x9d\x77\x2b\xbe\xd9\xd6\x70\x02\xf7\x60\x4a\xed\x02\x30\x1a\x46\x1d\x2d\xf5\xf8\x68\xa9\xe9\x3e\x67\x3b\x6e\x33\x76\x9f\x49\x7c\x9e\xa8\xe0\x24\x53\xea\xe1\x94\x76\x65\x5c\xb6\x85\xd8\xe7\x98\x63\x6b\x3a\xaa\x06\x38\xdf\x6e\x77\xdc\xef\xf8\xd3\x0b\xf9\x88\xdf\x2a\xe6\xa4\x9e\x14\x43\xc1\xc9\xea\x42\x74\x11\x3d\x5d\x8e\x7a\x5b\x76\x84\x03\xa4\x1e\x41\x94\x19\x9a\x88\x4f\xf5\x7d\x77\x7f\xf8\xeb\x97\xef\x76\x9e\x32\x73\x34\xea\x73\xf0\x4e\x42\x9c\x55\x3a\xf5\xb3\xc1\x67\x0e\x71\xbc\xa9\xea\xf0\x21\xb4\x89\xf6\x53\x74\x39\xc8\x89\x5e\x8e\xcd\xa0\x84\xfd\xe1\x7c\x09\x49\xbb\xf9\xa6\xdd\xc4\xaa\xd8\x57\x2a\x9a\x8f\x97\x8f\xd4\x65\x86\xef\xfe\x38\xe3\x8b\x10\xea\xb1\xda\xd3\x0e\xfe\x28\xda\x8b\xbe\xfa\x85\x3b\x96\xc7\x9d\x3c\xe4\x9f\xe6\x11\x2b\xef\x53\xd7\x4e\x77\x50\x40\xaf\xe9\x80\xb6\xa4\x2d\x61\x43\xc3\x31\x7d\x2e\x54\x9f\xeb\x04\x38\xeb\xe6\x4e\xb0\x33\xe4\x05\x4d\x17\x76\xc1\xb8\x14\x85\x88\x77\x1f\x75\xe4\x5c\x41\xa8\x7d\x21\x03\x30\x13\x80\x73\x16\x2e\xb3\xf0\x62\x12\x44\xeb\x04\xea\x5a\x47\xa4\xbd\x0e\x7b\x21\x4b\x14\xa8\x36\xbc\x98\x26\x2d\x4c\xc1\x09\x8a\x7f\xa9\xf5\x75\xd5\xab\x86\x9b\x8f\x91\xe6\xeb\x11\x6b\x17\x31\x19\x26\x45\x50\xf0\xa5\x22\x52\x2a\xb8\x0c\x5f\x8f\xdb\x05\x0a\xa8\xc7\x3e\x37\x36\x36\x62\xf7\xe6\xfd\xc6\xc6\xe5\x1d\x0e\x5c\x5e\x01\x24\xd4\xe3\x1f\x18\x57\x3b\xeb\x64\x7e\x92\x80\xec\x2b\x2f\x68\x8a\xda\x90\xa9\x05\x54\x11\x64\x42\x13\x58\x13\x22\x44\x57\xc4\x60\x9c\x85\x40\x94\x21\x17\x75\x13\x77\x51\x57\x73\x14\xe1\x20\x54\xbf\xa1\xfe\xfd\xae\x7f\x75\x1b\xa4\x45\x9f\x24\xd9\x79\x98\xbf\x58\xf0\xea\x62\x7b\x69\xf1\x56\x8b\x68\xa0\x99\xcc\x7a\x33\x82\xd9\x1c\x60\x36\x2f\xd1\xde\xdd\xe5\x9a\xe8\x27\xa5\x3a\x2a\x33\x8c\x7e\x56\xc2\x54\x1b\x30\xd4\xca\xbd\x1a\x3a\x87\x97\x9a\x77\xaa\x7f\xe0\x58\x73\xe6\xbb\xc3\x1b\xa8\x9f\x1d\xb9\xd7\x21\xc9\xe5\x8d\x10\x8f\x16\x47\x37\x34\x06\x68\x1c\xa8\xe0\x84\x82\x18\x06\x71\x19\x16\x4d\x76\x3f\xe3\x3f\x22\x8f\x37\x84\x4d\xef\xf3\x57\xa7\xda\x86\xb9\xbc\x5e\x70\x0f\xcf\xb8\xde\xab\xc8\x55\x07\xea\x07\x91\x3a\xef\x6e\x22\xa1\xef\x0e\x7c\xbe\x4a\x44\xfa\xca\xc0\xa4\xc7\x01\xc2\x91\x83\x48\xb4\x94\xa5\x66\xa6\x50\x4c\x9e\xd0\x11\x3b\xc8\xe8\xd9\xaf\xbb\x46\xf7\x0b\x77\x0a\xf7\x88\x69\xf1\xc0\x72\xcf\x60\xda\xba\xa4\xda\x5a\x0f\x25\x3d\xc2\x4a\xdc\xd9\x2f\x17\x67\xcd\x9a\x52\xd2\x84\x69\x2d\xb6\xd3\xbd\xaf\x77\xfa\x84\x31\x75\x39\x04\xf5\xbd\x83\x21\x2c\xd5\x87\x08\xc3\x35\x89\x90\xea\xf5\xeb\x11\xaf\x6e\xd3\x73\xed\xf9\xd8\x9f\xf7\x7c\x4c\xab\x5c\x0d\x47\x43\x91\x5a\x08\x3b\x26\xb0\xb4\xae\xbd\x69\x50\x2f\xb9\x1f\x04\x87\x26\x14\x4a\x96\xa3\xe8\xe3\x3f\xc3\x47\xfd\x79\x38\x7d\x3f\x2f\xc4\x44\x6a\x6e\x37\xdd\xb3\x00\x27\x7d\x11\x6e\x35\x56\x54\x49\xa1\xf0\x23\xfd\x19\xd4\x25\x92\x05\x94\x46\xee\xc2\xde\x14\x42\x3e\x87\x22\xc8\x05\xb1\x15\xea\x98\x61\x73\x71\x2c\x9a\x7a\xd8\x84\xda\x42\x5a\x13\xcd\xaa\x44\xaf\xf6\x87\x15\xc6\x86\xa6\x1d\xea\x30\xbf\xa7\xd5\x5b\x1f\x21\x78\xe8\x6d\x1e\xfb\xaf\x31\x62\x47\x29\x55\xd0\x60\x37\x36\xa5\xee\xa5\x13\x10\x07\x86\xa4\xc2\x5e\x6b\x14\xa0\x80\xee\xd4\x00\x38\x7d\x66\x37\x36\xa5\x44\xae\x09\xf4\xbb\x0e\xbf\x9c\x28\xc9\xd6\xb7\xb4\x35\x77\x85\xa3\x5f\x7e\x49\x49\xfb\xe2\x91\xe5\x94\xe4\x34\x39\x80\xb2\xaa\xef\xb6\xf4\x70\x6e\x55\x83\x7b\x1a\xf4\xe6\xc4\x49\x4f\x0a\x3c\x8b\xcc\x50\x6b\x4c\xbe\xeb\xb7\xec\x99\x59\x2a\x3b\x56\x61\xa5\x93\x65\xc7\x04\xf2\xf9\x7e\x27\x5f\x2c\xdc\x97\x6c\x99\x2d\xb8\x27\x1e\x40\x83\x98\x18\x41\x88\x8b\x26\x85\x68\x7d\x6b\xa1\x31\x97\xf1\x4a\xe7\x4b\xd2\x64\x21\x37\x59\x8b\x5d\x5e\xf3\x27\x1a\x4c\x7d\x1a\x71\xed\x77\xb8\xd1\x50\x8f\x80\x0e\xac\x0e\x84\x61\x82\x69\xa8\x5d\x06\xc5\xe0\x41\xd6\xa5\xc3\xd5\xdd\x0a\x8b\x7d\x96\x0f\x8f\x9a\x57\xe3\xc7\xf3\x4d\xf5\x5b\xba\xa5\xe1\x8b\x6d\x07\x5b\x87\xac\x4e\x82\xfb\xb7\xef\xdc\xad\x77\x1f\xb5\xda\x41\x0d\x90\x6c\x88\x03\x6c\x1d\xea\x79\xd7\x5c\x43\x4c\x75\xc0\x36\x10\x1b\x6f\x1d\xe0\xf8\x7a\x54\xda\xc2\xb3\x48\x27\x50\xd5\xe1\x59\x3a\x2a\x1c\x79\x83\x23\x5a\x9e\x03\xf5\x25\x75\xe4\xc8\xdb\xfd\xbc\x74\x78\xad\xa6\xf1\xd8\x9c\x5f\x47\xd5\xf1\xbd\xd8\xf3\x7a\xf4\x93\xbe\xda\xde\x53\xb1\x07\xde\xe5\x57\xc7\x17\x53\x4c\x96\x1a\x21\xb3\xe7\x5e\x9c\x66\xc4\xb9\x81\xd2\xc4\x69\x32\xf4\xf2\x14\xb7\xf5\xe5\x33\x12\x9a\xe0\x6d\xfb\x8c\xc6\xec\x1e\x44\xa9\xd2\x80\xd5\x9f\xc2\x8f\xc5\x2d\xf1\xa6\x51\x44\x82\xa9\x7b\xfe\xd1\xd9\x7d\x70\x28\x9e\x4a\x98\x9c\xe3\xbd\x37\x7e\xd5\x03\x77\x62\x3c\x1f\x8b\x52\x8c\xfa\xc5\xb2\x18\x68\xe7\xca\x89\x36\xc9\x20\xaf\x14\xfe\x66\x19\x71\x16\x2c\xda\x2f\xa7\x48\xa8\xf2\x89\x4a\x4d\xa5\x98\x3e\xc9\x62\x28\xe4\xae\xb2\x8b\x5e\x64\x12\x7c\x59\xac\x09\xd9\x09\xea\x5d\xe5\x7d\xf9\xea\xca\xc1\x5a\xc5\x8b\xd7\x69\xf1\x5b\xc3\x39\x70\x4f\x17\x34\xa8\xb4\x96\x34\x6c\x19\xbe\x9a\x14\x1d\x3f\x47\x49\xb0\x8d\xda\x6c\x89\x56\xd4\xa9\x0d\xeb\xc5\x03\xb7\x56\x17\x5c\x87\x9c\x51\xbd\x5f\x82\xe2\x48\x7c\x0e\x8a\xb4\xf8\x0c\x7c\x8a\x1c\x46\x3b\xa8\xbb\x78\x21\x8e\x7d\x58\x23\x7c\x7a\x02\x12\x7e\x8a\x97\xcf\x78\x35\xff\x11\xaf\xf3\x7f\xc2\x0b\x68\x65\x0b\x99\xcd\x8e\xc1\xe8\x7c\x35\x46\x83\x23\x60\x74\xae\x30\xf2\x53\x8c\x26\x4f\xa8\xfe\x99\xfe\x8e\x44\xa3\x13\x46\xcf\xc5\x29\xb8\x1d\x9e\xc4\xeb\x33\x94\x81\xb5\x84\x5c\xdf\x2d\x18\x3a\x34\xcb\x01\x0f\xeb\x6c\x8c\x15\x41\x87\x3a\x1e\xa1\x5e\xb3\x11\x4f\x12\xd3\x00\x82\xe9\x12\xea\x93\x10\x5e\x18\xf9\x38\x55\xc3\xa8\x3d\x22\x05\x4b\x4c\xbd\x7d\xa1\x16\xbb\x2d\x14\xa5\x1b\xfe\x2d\x2a\x13\xf5\x7b\x71\x5a\x6c\x72\x57\x88\xcb\xd3\x62\x4b\x85\xde\x5c\x17\x63\x21\xbf\x15\x63\xdc\xab\xb5\x1f\x48\x82\x5f\xd5\x68\xaf\xa5\x5b\x61\x51\x79\x32\x83\x68\x5f\xa3\x74\xff\x94\xba\x56\x95\xee\x00\xe7\x68\x7f\xe7\x6a\x55\x5f\x07\xb5\xde\x7f\x0f\x27\xa0\xf9\xed\x0e\x5f\xad\xf4\x30\xd6\x69\xcf\xd4\xed\x39\x96\x6b\xe6\x81\x7a\x10\x3f\xf2\xf2\x62\x5c\x1a\x7b\x4f\x79\x65\xe9\x90\xa6\x53\x8f\x85\xb1\x35\x07\xef\x9c\x3b\x7c\xa3\x3a\x76\x87\x5f\x68\x9b\xfc\x61\x7b\x94\xa1\xed\x31\x7d\xec\x38\xa3\x6c\x56\x0c\x36\x36\x22\x28\x74\x0d\x48\x00\x1f\xf1\xed\x95\xae\x45\x70\x95\x83\x8c\x68\x23\xfa\xb7\xb4\xaa\xe2\x07\x10\x6f\x54\x71\x62\x19\x1f\x28\x76\x26\xb0\x57\x0c\x64\xb1\x62\xf8\x05\x26\x61\xbd\xa4\x53\x5e\x8f\xab\x95\x67\xeb\x75\xf8\x53\xde\x1e\x15\x99\x9f\x79\xe6\x33\xa8\x0a\x8e\x6c\xde\x5c\x13\xda\x17\x30\x0d\xed\xca\x6f\x5e\xde\xbe\x91\x83\x64\xc1\x2c\xa9\x66\xae\xd4\x9a\x34\x80\x94\x64\x51\xad\xe5\x0a\xd0\x84\xa3\x40\x96\x03\x9d\x9d\xb0\xda\xe1\x2e\x50\x0c\x23\xf7\x41\xb9\x49\x2a\x35\xdd\x72\x24\x8d\x01\x10\x75\x01\xdc\x74\x6f\x0b\xa2\x45\x19\x5a\x3a\x03\xcc\xc0\x7c\x50\x4e\x97\x32\xda\x5a\x0c\xa7\xe9\xe0\x4e\xd8\xfb\x96\x8c\x6b\x3e\xbd\x85\x17\xcb\x52\x0c\x1f\x05\xe9\x79\xf1\x0b\x68\x4a\xfc\x74\x3c\xa7\x55\x1d\xec\xde\xe7\x5a\x6c\x23\x8e\x04\x8f\xeb\xcc\x5b\x6c\xf2\x09\x0c\x43\x90\x2a\x92\xa4\x8e\x6f\xb0\x55\xd2\x51\x37\xaf\x9d\xac\x8b\xad\x96\xfa\xe8\xf1\x07\xf5\xed\x76\x93\xb8\xec\xaf\x5f\x3d\xfa\xbd\x3c\x55\xef\x54\x06\xa5\xb8\xda\x04\x19\xde\xcf\x49\x91\x8b\xc2\xf8\xef\x60\xe8\x93\x8c\xf1\xa5\x38\x30\x53\xf5\x67\x4b\x4e\xf0\xfe\x23\x06\x74\xce\xdf\xf2\xb7\x55\x2b\xd6\xcd\xc3\x4a\xcb\xc1\x3f\x35\x2f\xc2\xe0\xd1\x9e\xaa\x68\x14\x91\xa0\x78\x71\xba\xe9\x67\x25\x68\x13\x7e\x77\x38\xec\xb6\x39\x26\x8b\x2b\xe4\xd3\xcd\x80\x62\x88\x3c\xb0\x1c\x5c\xb4\x96\x6a\x18\x9c\x49\xe1\xb6\xd5\x19\x08\x15\x30\x39\xab\x87\x52\x1e\x0b\x1a\xfb\xea\x30\x86\xd0\xd1\x84\x21\xcc\xca\x17\x2d\xb0\x5f\x2d\xc3\x04\x03\x0d\x09\x6e\x51\xc4\xbf\xdd\x9a\xf1\x45\xeb\xca\x8a\x22\xae\x88\x87\x47\xa2\xef\xe4\x85\x6c\x18\x61\xe7\xa7\x46\x5f\x1b\xb8\xe4\x02\x23\x55\xe1\x5c\x8c\xae\x93\x46\x1f\xe3\x14\xbd\x50\x27\x36\x29\xb1\xb9\x32\x97\xa8\x15\xbd\x2d\x0d\x9d\x52\xab\x5f\xe5\x6a\x7c\xe1\x45\x48\x04\xf7\x89\x79\xf3\x40\xb5\x6a\x40\xad\x9a\xd3\x56\xd8\x60\x0a\x10\x93\xc4\x73\x64\x36\xd8\x74\xa2\x9d\x42\x31\xce\x50\xc5\xa5\xf9\xee\x89\xb9\x6f\x72\xf1\x2a\x7c\x5e\xf9\x36\x42\xbe\x6a\x32\x0e\x10\x66\x0b\x08\xf9\x84\x90\x0f\x1b\x4b\xba\x9d\x55\x67\xfa\xd4\x99\xab\x10\xf2\x5f\x46\x28\x17\x9b\x61\xb1\x12\xa7\xd4\x32\x9a\xc6\x03\x8e\x15\x51\xf3\x7c\x29\x24\x1c\xd0\x24\xc4\x84\x56\x26\x98\x28\xc0\xc2\x41\x2e\x40\xa1\xd1\xc6\xc6\x52\xb9\xa9\xf2\x87\x29\xc3\x41\xb9\x34\xb9\x13\x92\x33\x9b\x9c\x5b\x4d\xdc\xaf\x47\x92\xb5\x59\x57\x2e\xa9\x66\xec\x23\x57\x96\x06\x00\xfd\xfc\xfa\x05\x5f\x1e\xc6\x63\x5b\xd6\x61\x4b\xae\x0c\x34\xb3\x00\xcd\x8b\xc4\xf4\x03\xf8\x6c\xb6\x9a\x1b\xab\xe6\xd4\x16\xef\x79\x8c\x70\xf9\x60\x47\xca\x08\x3e\x06\x99\x6f\x38\x94\x4a\x85\x8e\xe3\x82\xf9\x7d\x55\xea\x5a\x21\x5c\xa9\xeb\xfd\xaa\x69\xae\x4b\xfd\xcc\x62\xc3\x06\xdc\xe6\xa0\x43\xd9\x83\xd7\xc8\x07\x28\x9c\x1a\x27\x65\xe6\xdf\xef\xe6\x0c\xd9\xdd\x36\x1c\xb9\xd2\xbe\x38\xc4\x04\xcf\xf3\x67\x19\xe5\x38\xc0\xd8\x28\xd5\xae\xa0\xd9\xc3\x0b\x86\xba\x07\x01\xf0\xfd\x8b\x32\xdb\x96\x91\xd9\x66\x86\xba\xd0\x92\xb4\x9f\xe7\x1e\xec\x28\xa5\x5a\xdf\xf3\xdd\x6b\xe7\xe4\x50\xfc\xf8\x66\xde\x7c\xff\x85\x9b\x5e\x1f\xf7\x2d\x89\xe7\x91\x1f\x0f\xd2\xcb\x7f\x62\xf0\x01\x6e\x08\x4b\xb7\x73\x07\xeb\xba\x48\x78\x41\xca\x8b\xdb\xef\x99\x12\x09\xa7\xcf\xf9\xb9\xb7\x6f\xba\xbe\x73\x37\x6c\x78\xf1\xe7\x92\xfe\x78\x08\x71\x8b\x8e\x8f\xea\xe1\xe3\xbd\xf8\x36\x4e\x1c\x5c\xb9\x5f\x83\x0d\x6f\x2d\x49\x96\x66\x48\xdc\xea\xba\x07\x75\x2f\x09\xa5\x8e\x59\xf0\x85\x0d\x89\x37\xf7\xb5\x1c\xef\x36\x3f\x78\xa6\x62\x6a\x81\xc3\x3b\x7e\x0d\xb7\x90\xa6\x7f\x63\xa7\x39\xa2\x34\xee\x47\x4b\x20\xb1\x74\x1a\xbe\xab\x1b\x50\xa9\xae\x48\xf3\x9f\x34\x10\xb7\x9e\x12\x57\xaa\x89\xf3\xbc\xf3\xa8\x26\x87\x8d\x71\xf4\x9a\x9d\x4d\x0d\x5e\xcb\x7e\x44\xfb\x31\x65\xaa\x06\x36\x6a\xe4\x6b\xaa\xf8\x35\xfb\x39\x82\x63\xbd\xe7\xbc\x1b\x55\xbf\x10\x17\x34\x8f\xab\x66\x80\x61\x7f\x37\xf9\x6b\x85\xfe\xda\xc5\x60\x56\x7a\xa5\xe2\x9f\x57\xc5\x2b\x53\x02\x3a\xc5\xd3\x5f\x2f\x3c\x2b\x38\x4f\xfc\x2d\x7f\x57\xd7\xd0\x6b\xf0\xc6\x9e\x90\xf0\xd5\x20\xf8\x5a\xdd\xd4\xbd\xae\x4b\xa2\x47\xbe\x8e\x1b\xfd\xc1\xf0\xb5\xf2\xa4\xfc\xba\x1b\xbf\x86\x1d\x8b\xd7\x03\x9e\x42\xda\x45\x20\x74\xfe\x75\x0d\x5a\x1d\xd6\xdd\x35\xaa\xcb\xfb\x71\x35\xe6\x0d\x62\xa4\xc4\x3c\x75\x3b\x63\x94\x54\x0b\xee\xc7\xc2\x5f\x9b\xbe\xdb\x6b\x2b\x65\x2c\x02\xc1\x44\xf9\xa6\x53\xc8\x15\xde\x72\x64\x26\x57\x83\xac\xe1\xc9\xba\xf1\x99\x71\xd4\x72\x8c\xb7\x06\x58\xb9\x15\x3c\x3b\xf9\x83\x2b\x99\x4f\x81\x3d\x9e\x4a\x10\x23\x9c\xad\x65\x60\xa8\xd9\xbb\x18\xac\x28\x2d\x4d\xcb\xe1\x5c\xb4\x54\x5e\x0c\xcb\xb4\x35\xbb\x46\x2e\xed\xea\x60\xc7\x59\x5d\x33\x73\x43\x4d\x09\x0c\xa7\xb3\xc5\x6b\xe6\x61\xb5\x8c\x46\x39\x41\x23\x62\x16\x59\x5b\x40\x84\xeb\xf8\x07\xb2\x38\x85\x7a\x8a\x16\x90\x08\x99\xd8\xef\x53\x14\xb0\x8f\x09\xb5\x76\x2b\x9e\x49\xdb\x6d\x25\x4c\x85\x50\x51\xd7\xfa\x55\x2a\x75\x96\x4d\xea\x2a\xcd\x75\x03\x06\x46\x2a\x27\xc1\x4b\x3e\xa6\xef\x86\xd3\xdc\xf4\xdc\xbf\x60\xe7\xf4\x2d\x54\x63\xbd\x00\x51\x7c\x16\xf2\x10\x9a\xab\x9c\x9f\x41\x58\xac\x51\xbf\x26\x13\x4e\x84\x61\xb1\x69\x03\x66\x34\x04\x38\x15\xc7\xcc\x68\x04\xfd\xa4\x88\xe2\xcf\x80\xaf\x3b\x8b\x7a\x97\xcc\xbb\x7a\xa4\xe2\x83\x10\xfc\x86\xa1\x38\x98\x16\x69\xf9\x6b\x14\xfd\x74\xce\xef\x54\x69\x48\xdd\x17\xab\x35\xd1\xba\x9f\xc1\x5f\x33\x2d\xaf\xac\xec\xf0\x9b\x62\xb9\xf2\xa4\xc0\xaa\x85\x90\x29\xa6\x74\x73\x97\x58\x32\x2d\xc5\xf3\x63\x9a\x1a\x64\x5f\xbf\x0b\xda\x8f\xdd\x46\x0f\x57\x3d\x12\xde\x5b\xbc\xaf\x07\x36\xf8\x87\x2e\x82\x3d\xbb\x78\x27\xc7\x1b\x1b\x95\xf4\xc6\x8d\x36\xb7\xc2\xa4\x3d\x91\x73\xa6\x16\x6e\xef\x96\x4c\x9e\x9f\x53\xe7\x10\xcf\x8b\xa1\x24\x23\x99\xbb\xf6\xf2\xb0\xa1\x20\x3d\x38\xfc\xd7\x16\x02\x7d\xf7\x09\x53\xd2\x77\x1b\x0f\x6a\x3d\x2f\x85\xd4\x73\x3b\x0e\x15\x80\x01\x00\x03\x96\x99\x22\xed\x47\xbd\xb8\x14\xb9\x9d\x6e\xbf\x2d\x5b\x8b\xaf\x0a\x43\x75\x56\xc0\xa7\x0a\x12\x87\x0a\xda\x96\x19\xfb\x91\xc1\x29\xe2\x93\xbf\x98\xa5\x69\x65\xa9\xad\xca\xd2\x78\x58\xcc\x12\x5b\x59\xfc\xe5\x2c\x9a\xbb\x45\xe9\xba\x8b\x96\xb4\xec\x35\x9f\x0b\xb8\x9c\x81\x90\xe0\xee\xb2\x18\x0b\x13\x84\xdc\x8e\xd8\x60\xeb\x35\x96\x04\x6d\xd6\x55\x61\x4f\x3f\x5b\xe2\x87\x5f\xac\x86\xf2\x3e\x79\x97\xce\x97\xb6\x69\x02\x99\xb5\x93\x04\xde\x8f\x2b\x1c\xb7\xa7\x0f\x02\x28\xf5\xa7\x68\x87\xaf\x41\xb8\xca\x2c\xab\xf0\x99\xe9\x99\xa3\xee\x22\x38\x4f\x4f\x0e\xf1\xf4\x65\xf6\x9c\x76\xeb\xcd\xdd\x82\x15\xdc\x73\x56\xf4\xff\xee\x53\xdf\xfa\xc9\x25\x69\xac\xc2\xb8\x2b\xac\x79\x21\xfb\x97\x22\xb9\xec\xbb\x93\x74\xfc\x94\xd6\xad\x8b\x0c\xce\x05\xd4\x38\x69\xd2\x82\x84\x2b\xe5\xae\x8e\x7f\xa6\x78\x3c\x89\x0d\xdc\x56\x33\x7d\x14\x1b\x10\xaf\x9d\x61\x4b\xf5\xc6\x94\xd3\xcd\x8b\xf2\x29\x9c\x94\x3f\x84\x3b\x97\xc5\xee\x29\xb6\x58\x49\xe4\x80\x0a\x39\xa7\xd8\xe7\x1a\x34\xb3\xae\x0c\x78\x44\xe0\xc2\xdb\x3f\xb7\xf2\xd8\x21\x9f\x1a\xe8\xc1\x9d\xcc\x88\xa9\xf7\xcd\x7c\x4f\x28\x95\xdf\x23\xd8\x5e\x9a\xf3\x11\x6e\xdf\x4a\x1c\xae\xee\xdd\xc9\x7b\x6f\xab\x44\x08\xa2\x93\x02\xf7\x4b\x07\xbf\x7c\xac\x26\xce\x45\xb9\xc4\x28\x39\x07\x9e\xd4\x2b\xf5\x31\x56\xea\x3c\x51\x79\xe0\x05\x29\x27\xa1\xc5\x22\x7b\x30\x07\x03\x3f\xc8\x8b\x03\xe2\x07\x07\x22\x7f\x2f\xce\xbd\xea\x5a\x81\xc4\x80\x7b\x51\xf6\xaa\xa6\xac\xf8\x48\xb8\x1f\x60\x70\x45\x7d\x46\x47\xd4\x7a\xf7\x99\x22\xd5\x56\xd5\x59\x54\xfa\x02\xd4\x06\x59\xf2\x30\x3c\x24\x02\xbf\x88\xc1\x3e\x54\x07\x29\xce\xa4\xc2\xc4\x9d\xc0\x47\xee\x67\xa5\x54\xf9\xf8\x55\x65\x85\x88\x1f\x12\xb6\x2d\xe8\x40\x43\xf3\x80\x24\xc4\xcc\x24\x0f\x75\x3a\x58\xa8\x4f\xee\x3c\x22\x95\x26\x57\xbb\x2f\x99\x58\x5c\xc0\x50\x38\xd2\xe1\x19\x14\x54\xc5\x95\x67\xd7\x60\x66\x47\x60\xce\x6f\x25\xed\x07\xa1\x6d\x10\xa6\xa0\x3c\x00\xa5\x02\x5b\x8e\xf2\x77\xa8\x40\x5f\x80\xbf\x15\x0b\xdb\xd0\xad\xf7\x37\x36\xa8\xd9\x0d\x14\x5a\x91\xba\x7a\x84\x33\x45\x1f\x8c\xe4\xe7\x64\x17\x5e\x1a\xc3\x98\xfe\xce\x84\x95\x96\x16\x44\x7e\x7d\xb1\x94\x20\x29\x80\xb5\x6a\xc5\xb5\x37\xdf\x2c\xe6\x58\x84\xfb\x1c\x43\x81\x67\x64\x23\x24\xee\xc3\x07\x75\xbe\x98\x77\xca\x78\x58\x2f\xfe\x7c\xa8\x11\x9f\xba\x8a\x61\x9e\x61\x5c\x2c\xa3\xdf\xee\xf0\x5b\xa0\xb1\x5f\x28\x1e\xef\x89\x49\xa1\x78\xb4\x27\x4e\x7c\xfc\x3d\xe3\xbf\x63\xb8\x50\x13\x57\x87\x30\xf9\x40\xb3\x40\x1d\xe6\x45\xe2\x8a\x18\x3d\xfc\xcb\xff\xb6\x56\xe6\x54\xe1\x62\x4e\x26\xe8\x26\x69\x5e\xd1\x96\x7a\xee\x52\xf8\xd5\x67\xe9\xb5\xa1\xc6\x2f\x4e\x48\xae\x14\x37\x10\x2e\x6f\xe4\xf6\x67\x59\xca\x66\x6f\x64\x7a\x7c\x7f\x1c\x21\xd9\x8d\xbc\x17\x9f\x95\x55\x39\x71\x19\x78\xc7\x3c\xba\x28\xea\x98\x87\x56\x27\xf2\x0e\x38\xc9\x20\xf0\xce\x39\x10\x85\x54\xe6\x53\x4c\x7f\xfa\x4d\xfa\xd3\xae\x53\xe9\xed\xfa\x76\x8d\xfe\x90\xc8\xda\x6f\x66\x89\xbd\x91\xac\xda\xae\x53\xc5\xd9\x42\x86\x76\x5e\x3c\x30\xd3\x74\xd9\x6c\xbb\xae\x46\xcc\x73\xbc\x94\x56\x7c\x7d\x24\xce\x73\x28\x13\x98\x78\x93\x26\xa2\xa9\x5f\x7f\x48\xa2\xe9\xeb\xe2\xc1\x7b\x8a\xdf\xf6\x9b\x42\xd6\xbc\x8b\x87\xec\x33\x87\x2b\xb4\xb9\xae\xe5\x2e\x1e\x3e\x79\xa3\x52\xa5\xb6\xf3\x14\x67\xbd\xe7\xb8\x18\x85\xf8\x51\xab\x55\xdf\x1b\xde\xc9\xec\x89\x14\xd3\x5e\x32\xd1\x6b\xfd\xec\xf9\x1d\x8c\x5b\x8d\xfc\x6a\xbb\xfe\x1f\xfe\xfd\x8c\x4b\x46\x4a\x43\x2c\x70\x4a\x82\x4c\x63\xa2\xd9\xde\xb4\x27\xca\x68\x0b\x92\x66\xf6\xb1\xc5\x51\x6c\x86\x4a\xb8\x6e\x4b\x46\xb2\x9f\x32\x1f\x82\x9e\x51\xb9\x7b\x99\x6c\x27\x12\xb7\xb5\x94\x57\x52\xc4\x97\x3b\x5c\x7c\xd1\xe6\x2f\xe5\x67\x55\x02\x97\x09\xdc\x3f\xba\xe7\x5d\x04\x35\xd1\x1d\xd7\x49\xd8\x12\xcd\x17\x0f\x44\x2a\x01\xa9\x99\xa8\x29\x88\x54\x1a\xc1\x97\x01\x75\x17\xd5\x29\x5e\x85\xfb\xa2\x47\x75\x00\xbf\x06\xce\x88\xc0\x46\x5a\x18\x5e\xcf\x71\x86\x9a\x22\xad\x85\x2a\xf9\x4c\x95\x0c\x20\x5a\x55\x6a\xbf\x7e\x8d\x69\x2b\x72\xed\xbc\x89\x51\xe6\xb4\x47\xab\x3a\xaa\xab\x90\x14\x4c\x63\xc7\xfb\x4c\xb3\x79\x63\x23\x76\x08\xf4\x99\x76\x55\x27\x32\xeb\x15\x66\xf9\xed\x08\x93\x8e\x3a\xa0\x90\x8b\x42\xdd\x05\x05\xa0\x1b\x85\xe8\x43\xbd\xdf\x8d\x42\xee\xb2\x29\x46\x98\xa2\x23\x57\xc0\x7f\x0b\x74\xac\xe5\x13\x3a\xf6\xd0\x4e\x79\x01\xcd\x00\x9c\x76\xe2\x34\x16\x68\xae\x8d\x37\x36\xae\x9d\x0b\x24\x6e\x02\xbf\x5c\x81\xfd\x88\x96\x6e\x78\xf6\x10\x63\xa4\xdc\xc4\x12\xa9\x80\xdb\x72\xf1\x33\x76\xbf\x29\xea\x57\xce\xe7\x79\x43\xc0\x5a\xa7\x4b\x1b\x60\xf7\xb5\xed\xf5\xee\x69\x31\x75\x1f\xb3\xab\x6c\xa7\x5f\xd6\x53\x58\x18\x97\x8c\x8d\x76\x0b\x96\x3d\xd9\xcd\x22\x7d\xf6\x22\x32\x27\xf3\x17\xd6\xc2\x7b\xb7\x78\x32\xcf\x54\x75\x88\xbe\x81\x18\x89\xb1\x98\x8a\x3d\xc1\x2b\x8f\x9a\x11\x57\x58\x9a\xc1\xa0\xaf\x48\x7a\xfa\xf5\xab\xb0\xed\x8d\x32\x23\x4f\x19\x3b\xbb\x86\x14\x76\xe3\x45\xb9\x10\x26\xa4\xae\x71\x20\x7a\x4d\x08\x78\x35\x5c\x64\x5d\x8b\x03\x7c\xf6\x22\xef\x9c\x7e\x98\x83\x78\xf8\xd4\xb2\x56\xa9\xd2\xa3\x24\xcd\x4c\xe9\x0b\x7e\x7d\x24\xfd\x51\xf3\xca\xf4\x33\x1a\x7a\xf9\x6d\x12\x7f\x20\x0c\xb8\xa3\xb6\x13\x28\xd9\x81\x62\xae\xbc\x16\x49\x74\xbd\xcd\x51\x69\xb4\xe9\x0d\x08\xd0\x3c\xf2\x7c\xfa\xa9\x4c\x69\x62\x5d\xbb\xdf\x43\xef\xdd\xc7\xfc\x66\x48\xd4\x1f\xff\x85\xaa\xd5\x77\xa4\xbe\x25\x76\xfa\xec\x9f\x0f\xef\x05\x91\x5a\x98\x2c\x39\xa4\x15\x9c\x21\x50\x0e\x05\xbf\x9e\x6e\x3a\x88\xcd\xfd\x9d\xcf\xbc\x2d\xfc\x45\x0c\x23\x01\xf6\x52\xe0\x35\xb5\xb2\xde\xc2\x1d\xbe\xdb\xbc\x21\x60\x3e\x7b\x10\x95\x9a\xde\x85\x31\xa5\x3f\x4d\x7b\xb2\xe9\x21\xb9\x6d\x06\xff\xe8\x18\xc0\x6a\xbc\x7b\x6f\x43\xa9\x83\x9b\x70\x87\x90\x42\x9e\xf6\x24\x40\xe8\xd7\x6b\xdd\xaf\xc1\xb3\x6a\x3c\x5c\x22\xb7\x8c\x5d\xdd\x6b\xb4\xb3\xf4\xf6\x58\x00\x7c\x13\x38\xd7\xac\xff\xf0\x6a\x2f\x03\x77\x5f\x7b\xde\x1e\x8b\x83\xd7\x6e\x5c\x36\x4f\xfd\xc1\x04\x08\xf0\xe6\x11\x5e\x74\x6e\x50\x18\x67\xc1\x2e\x1f\xd0\x0c\xf5\xc5\x8d\x77\x78\xe6\x74\x84\xde\x32\xe0\xf5\xe5\x1e\xed\x74\x68\xe5\x72\x87\x37\x50\xff\xe6\x75\xfa\xc6\xeb\xe5\xf6\xa8\x86\x41\x0e\x75\xa3\x86\x52\xe2\x30\x5f\x52\xe5\x6f\x6f\x48\xc4\xd8\xbd\x7f\xbb\x07\x6f\x10\x1a\xbe\x45\xc0\x2d\x40\x5a\xde\xe5\x8d\xe3\x04\xd9\x18\xcf\x37\xd1\xc8\xa2\x80\x53\x98\x46\xf1\xe7\xd4\xbb\x4c\xaf\x0a\xd9\x51\xae\xc4\x5d\x7b\xa1\x74\xa0\xf6\x77\xcc\xc5\xcf\x69\x2c\x9e\x6f\x4f\xd5\x6d\xe5\xb9\x1a\xb3\xb4\xf4\x4c\xab\xe7\xf7\xa5\xb2\xd7\x72\x9f\x37\xdb\xd2\x7d\xce\xb6\xdc\x09\x02\x93\x12\xc5\x95\x37\xcb\xd9\x42\xce\x01\x5c\x45\x22\x82\x63\xe1\xeb\xa2\x2d\x77\xd4\xb3\xbf\x22\xa5\xf0\xd4\x7b\xa9\xb6\xc4\xc5\x65\xb5\x9c\x23\x6e\x5a\xa6\xe4\xf7\xb6\x41\xfb\x32\x2d\x12\x9f\xb0\xe0\x66\x08\x63\x1e\xa9\xca\xea\x6f\x63\xd6\xf4\x0e\x9c\xa6\xe0\xa8\xd9\xd4\x6b\x42\x0f\xce\x7d\xff\x69\x9a\xd1\x56\x19\xb8\xed\x5a\x5e\x4b\x5b\x83\x6a\x55\xdb\xb4\x9f\xca\x4d\xb1\x8f\xb9\x38\xc3\x24\xad\xb1\xe5\xfc\xe2\x4f\xc9\x0d\xd1\x02\xf9\x35\x7e\x94\x9a\x0b\xc4\xd6\x26\xda\x2a\x53\x9a\x42\x89\x9d\xc6\x0b\xda\xe2\x80\xc2\x07\xdb\x52\xb5\xc5\x41\xe6\xe7\xb9\xf7\x8a\x52\xd7\xab\xcf\x78\xf2\x55\x3d\xb8\x77\x27\x82\x7f\xe0\x05\x22\x29\x80\x90\x3a\xff\x84\xc7\x03\x79\xcf\x3b\x87\xe9\xab\xb5\x82\x45\x80\xda\x48\x9f\x63\xac\x19\x2b\x17\xe7\x78\xa2\x44\x2d\x9c\x6b\x6e\xa3\x04\x0a\xca\x9d\x96\x12\xef\x6f\x20\x4b\x99\xb1\x42\xad\x7b\x83\x97\x33\x9b\x7b\xc6\x88\x84\x77\x43\xf3\x4f\x8f\x1c\xc1\x83\xeb\x1c\x1d\x2c\x6e\xcc\xf8\xca\x5d\x2b\xb5\x1c\x1a\x66\x2a\x48\x83\x66\x0b\xc2\x12\x6f\x63\x55\xce\x02\x8d\xd8\x6e\x1c\x0f\xa2\xa1\x35\x70\xc0\xbd\x32\xdc\x7e\x63\x18\x27\xa0\x88\x98\x41\xe0\x11\xb1\x77\x80\x21\x4c\xb0\x80\x61\x00\x9e\xd4\x15\x90\x52\x0f\x54\x6a\x1f\xef\xb7\xae\xdd\x8b\xa9\x95\x1a\x30\x00\x27\x43\x05\xa4\xf2\xae\x78\xf7\xbf\xf5\x67\xfe\x93\x07\xfe\xb0\xb1\x81\x37\xeb\x60\x0a\x44\xd9\x00\xec\xf0\xef\xfc\x27\x44\xec\x38\x03\x30\x17\xd8\x4f\x00\x06\x9a\xbe\x0e\x0d\x36\x68\x46\x4e\xa0\x23\xc7\x09\x98\x0f\x71\x12\x60\x9a\x11\x54\xf2\x36\x8a\x43\x7e\x62\x47\xf4\x49\xb1\x84\x6d\x5a\x40\xce\x2a\xa0\x17\x72\xdd\x2a\x09\xa8\xa2\xa5\x49\xb3\xda\x57\xcc\x6b\x9f\x7c\x6a\xe7\x8a\xef\x71\x4b\xec\x0f\x3d\x85\xbe\xfb\x61\x3b\xa4\xef\xce\x53\xf2\xfd\x29\xe2\xd9\xcf\x6a\x5d\x88\xa0\xa9\xff\xe3\xcc\xd3\x45\x98\x6d\xdf\x75\xba\x60\x4d\x2c\x95\xd7\xc0\xa3\xe5\x0b\x1e\x7c\x4b\x68\x84\x20\xeb\xf5\xa3\xec\x34\xcf\xe6\xc8\xd8\xd5\x00\x6d\x1a\xf6\x71\xf6\x1d\xc3\x98\x0b\xed\xc0\x60\xe9\x3a\xb0\xef\x9c\x2a\x77\x72\xd9\xc3\xd5\x39\xab\x5a\xe8\xad\x45\x4d\x07\x43\xa8\x10\x07\xc9\xee\xb0\x95\x6e\xd1\x76\xf5\x16\x0d\x3b\xb7\x8e\xe6\xd5\xef\x36\x9d\x38\x5b\xcb\xe4\xd4\x1c\xa6\x4f\x7c\x01\xf6\x6e\xb3\x06\x1d\x02\xbe\x96\xe5\xc7\xc6\xe9\x2d\x2c\x1e\xfc\x45\x10\x81\x79\x0e\x0d\xcc\xb3\x3f\x06\x0d\x78\xa3\x32\x32\xea\xbd\x63\x3e\xce\xa6\xf5\x10\xe7\xdb\x99\x31\xa5\x69\x55\x39\x7c\x9f\xee\x5e\xa6\x1a\xf1\xa8\x41\xa3\x72\x5a\x9d\xf2\xb5\x12\xf6\x1d\x6c\x87\x6e\x4f\xcf\x28\x42\x69\x4c\x6b\x19\xc6\x31\x1e\x6a\xc7\xd8\xc7\xe9\x98\x1a\xc5\x54\xa6\x26\xa6\x06\xad\x0a\x67\x4c\x5d\x4e\xe0\xef\x21\xc0\x53\x30\x84\x73\xf5\x44\xbd\x0c\xf7\x17\x71\x6e\x4f\xd4\x72\x07\x99\xb7\x9d\x4d\xa8\x72\x5e\x89\xeb\xd2\xd6\x66\x79\x1b\x99\x72\x63\x1e\x99\x57\x1e\x7e\xb3\x65\xda\x7e\x30\xb4\x0c\x85\xce\x4f\xd3\x9d\x6b\x3d\xdb\xaf\xf1\x9d\x29\x5e\x69\x1c\xae\xf8\x33\x53\xbc\xf6\xae\x3c\x75\xb6\x79\xb3\xca\x44\x3b\xcd\x90\x26\xa6\x8d\x84\xfc\x80\xfd\x4d\x79\x55\xaa\x1b\x5c\x6b\x0c\xa8\x92\xdd\x07\xc7\x91\xb9\x57\x4d\x1a\xca\x6f\x0f\x20\x3c\x15\x78\x53\xd4\x96\x2f\xe5\xfa\x7a\x9a\x9b\xcb\xba\x98\x73\xe4\xfd\x0c\xff\x2e\xde\x38\x07\xd4\x1c\x58\xa1\x33\xc4\xed\x26\xe7\x45\x7d\xd9\xcb\xf0\x2b\x03\xe7\xaf\x6b\xfd\x95\x81\xfa\xc7\x48\xe9\x0a\xee\x16\x69\xe4\x8e\xe1\xf1\x31\xf8\xbb\x38\x86\xfd\x4a\xbd\xc9\x19\xb3\xae\x43\x49\x35\x14\x8d\x81\xf3\x8f\x5e\x59\xdd\xab\x8f\x30\x15\x19\x40\x8b\x43\xa0\x21\x24\xdb\x79\x3e\x33\xb2\x5c\x9c\x63\x95\x87\x52\xe4\x41\x1b\x48\x9f\x91\x58\x4e\xfe\x94\x0b\x40\xed\xf0\x2f\x86\x0a\xe1\x1b\x62\xce\x24\x9c\xf5\x70\xe5\xb6\x22\xcf\x31\x94\x26\x4c\x26\xe5\xff\xeb\x0d\x94\xbf\xf8\x84\x86\x4f\x7a\x1a\xca\x79\x0e\x5b\x9e\x39\x77\xfd\x9e\x67\xdf\x94\xec\x26\x0f\xa1\x9b\x3f\x16\x2e\x3a\x7a\xa7\xb8\xe7\xd8\xcd\x8b\xe6\x8f\x4c\x69\x97\xcf\xd1\x5b\xc3\x55\xfd\xa1\x55\xd4\xbe\x8f\x68\xf6\x49\x38\x4b\xd3\xa9\x2b\xe1\xa2\x67\x24\x7d\x14\xce\x16\xe4\x9f\x68\xdf\xae\xe5\x22\x36\x97\xaf\x44\xa3\x76\xbe\xa8\x2d\xe8\x17\xee\x93\x1b\x22\x25\xfd\xf0\xfd\x04\x2c\x81\xdf\x4c\x64\x56\x8a\x9f\xa3\xa0\x18\x88\xf8\x41\xad\x35\x73\x8a\x56\x7b\xf9\x45\x6d\x93\xdd\x45\xe2\x10\x53\x33\x57\x7b\xec\x2c\xbe\x7f\xc4\x5a\x0b\x4a\x29\xae\x25\xe1\xc2\x3c\x5e\xe5\xbe\x9c\x13\x63\x7f\xe6\xf3\x46\xa8\x89\x7b\x0a\xce\x14\x50\x26\x8e\x1c\xab\x1b\x16\x6a\xbc\xbd\xbc\xd8\xa5\xc6\xdb\xe3\xe6\xd8\x7b\xe1\x09\xfd\xe0\xbd\xfe\x9c\xe9\x84\xad\x45\xe5\xc0\xe4\xea\x0c\x0e\x16\x7c\x31\xff\x94\x7d\x3f\x6f\xbc\x4e\xe1\xc5\x6d\x0b\xf7\x3f\xc9\x1b\xf0\x16\x1e\x94\xdd\x7b\xf8\xc3\xf0\xe4\xc4\xce\xbf\x9f\xbd\x52\x95\x0d\xde\xbf\xf0\x50\xf4\x67\x19\x5e\x12\xc7\x4d\x65\xd3\x69\x10\xe1\xe5\xd7\x61\x87\xb6\x4d\xd1\xc0\xc9\x88\x63\xe2\xda\x62\xb7\x59\xf4\xdd\xef\xf5\x19\x1f\xd2\x7d\xaf\xbb\xd7\xd2\xad\x3c\xe9\xd5\x3d\xda\xd8\xa8\x3c\x39\x1a\x2c\x4c\x19\xdd\xba\x13\x65\xaa\xdd\xe9\x7d\xc6\x3a\x0d\x52\xef\x2a\x3a\xee\xe3\x0d\x15\x14\x7b\xde\xb4\xfe\xeb\x57\x0c\x3f\x6d\x78\x21\xe1\x79\x5f\x6a\xe6\xb3\xe9\xe9\x72\x36\x36\xf2\xdb\xa1\x3b\x6e\xaa\x77\x26\xa7\x17\x8e\x5f\xbd\x7d\xbe\xc7\x69\x60\x61\x3b\x66\x15\x12\xda\xc5\x10\xf7\x6e\xf1\x17\xb1\x6e\xad\x02\xd8\xf1\x62\xbc\xfb\xe8\x79\x96\x26\x1f\x34\x44\xb2\x5a\xc1\xaf\xb7\xe9\xf4\x72\x24\x6e\xbe\xe1\x35\xa8\xc3\xea\xb6\xb4\xb7\x83\x8d\xed\xff\x26\x2e\x78\x3a\x24\x80\x50\x05\x1b\x1b\x7e\x0a\xa3\x91\x52\x8d\x15\x3b\x57\x83\x6a\x60\x9f\xe5\xf8\xda\x9e\x89\xb9\x0c\x08\xf4\x43\x19\xdd\x1f\x55\x5f\x38\x7e\x36\xb0\xd5\x0b\x33\xff\x21\xfe\x62\x62\xef\x67\xda\x4a\x56\x34\x57\x28\xae\x36\x53\x8f\x29\xe9\xb1\x49\xec\x0d\x1c\xb6\x72\xb2\x56\x78\xa1\x11\x5e\xa1\x15\x52\xbd\xbd\x8e\x7e\x43\x48\xa3\xbe\xda\xa1\x89\xd8\xc4\x9b\x51\x92\xe6\x13\x9c\xcd\x1d\xd9\xf0\x49\x1f\xa5\xf5\xbc\x8e\xb8\xf2\x02\x5a\x32\x40\x48\xcf\x2a\xeb\x1a\xaf\x58\x54\xa2\x1b\x4f\x6f\xf4\xb4\x44\x7b\xe3\xd6\x43\xa7\xd2\x76\x34\xd4\x0d\x60\xcf\xeb\x39\xa2\xa5\x0c\xfb\x64\x77\xbf\x9e\xc4\x7c\x8d\xa0\xd6\x52\xa2\x91\x7d\x45\x7c\xcf\xad\x3d\x79\x3f\xd5\x99\xd3\xcd\x6c\x36\xb3\x7c\x2a\x05\xb0\x0a\x1e\xfc\x37\xe9\x2b\xfd\x94\x27\x00\x93\xe3\xeb\x68\x68\xd3\x42\x53\x07\x1d\x56\xe3\x3e\xb3\xfa\x11\x06\x44\x55\xc3\x02\x7d\x9c\x2d\xc7\x8d\x4c\x40\x7f\x70\x07\x40\x23\x97\x46\x73\x8f\x27\x1b\x7f\xed\x4b\x00\x8e\xeb\xd8\xf1\xdb\x17\x12\xaa\xfa\xb9\x0b\x09\xea\x45\xfd\x16\xca\xb7\x5a\x26\x52\x2d\x13\x78\xfb\x5a\x3e\x0a\xdc\xb3\x0e\x6e\xbb\x71\x2e\x79\xd6\x29\x69\xe5\xeb\xc5\xfb\x80\xc8\x6e\xad\x91\x2c\x7e\x74\x3f\xf0\xd5\xf7\xbb\x19\xee\x5a\x2e\x54\xfa\x2f\x4d\x27\x84\x0c\x44\x02\x25\x57\xe3\x3e\x0b\xf5\x3d\xd1\xdf\x13\x24\xfe\x0e\xff\x5d\xdf\xc3\x12\x14\xbf\x21\x89\x84\xfc\x12\x85\x42\x6f\x1e\x4b\x0e\x3c\x31\x7d\x6e\xb0\xdd\xea\x9b\xf7\x30\x3a\x1c\x90\xa8\x95\x0d\x74\xed\xe7\x3e\x09\x17\x48\x12\xce\xc3\x58\x7b\x34\xb2\x13\x49\x2f\xe4\x8c\x94\x3a\xe4\xd4\x58\x85\x7c\x2b\x45\x09\x6a\xe8\x9e\xcc\xa2\xf6\x90\xb6\xd8\x14\x90\x1e\x2d\xc0\xbe\xde\x60\x93\x0c\xc6\x5f\x6a\x67\x5d\x82\x3e\xbb\x77\xa1\x34\xe3\x95\x40\x91\xa8\xb1\xf3\xc3\x0c\x12\x75\xad\xd8\x60\x2e\x56\xcd\x86\x88\x44\xde\x52\xcc\xd6\xa4\x2b\x3e\x3f\xa3\xe2\x3b\x72\x3f\x79\xc7\xe0\xf5\x3b\x4e\x6c\x37\xb3\xfb\x2e\xa3\xa2\x2f\xe0\xc1\xed\x42\x0f\x60\x05\xa2\x46\x7c\x15\x2b\xf5\x79\x7e\x24\x81\xe7\x4b\xfa\x23\x00\xa1\x44\xbb\xfe\x0c\xf1\x19\xe2\x53\xd3\x57\x31\x24\x8a\x20\x01\x28\x2a\x55\x06\x43\x68\xc5\xa6\xb5\xa2\x09\xaa\x28\x9a\x54\xc8\x10\x5d\xb1\xe9\x5e\x48\xc9\x57\x71\x43\xa2\x7e\x7f\x58\xc2\x0b\x29\x0a\x75\x9e\x4a\xf3\x8f\xaf\xf0\x56\x09\xd4\x47\xf4\x6b\x93\x7e\xd4\xc2\x71\xed\xfe\x70\x47\xe2\x16\x70\xf5\x6a\x74\x01\x3f\x58\x1a\x4f\x64\x80\x1b\xbd\x30\xeb\x6f\xca\xb9\xd1\x80\x06\x98\x87\x41\x3a\xf3\xdd\xee\xae\x47\xb3\x8a\xe4\x35\x54\x17\x95\xf9\xa3\x30\xf7\xec\xe0\xcd\xf2\x4d\x1f\x4d\xac\x12\x18\xff\xc1\x94\xed\x5c\xab\x19\x66\x6c\x38\x60\x9c\xf3\x31\xbb\x9e\x5f\x02\x2f\x74\xb0\x07\x43\x9f\x7f\x6e\x98\xc7\x0d\xde\xa0\xe3\x48\xbb\xb3\xb7\x32\x62\xd5\x3c\x92\x0b\xf3\x48\xea\x79\xc4\x6f\x27\x70\x35\xa5\x1e\x50\x00\x2b\x84\x68\x1e\x91\xe0\xf5\xc8\x0e\xbf\x52\x5a\xb3\x5b\xee\x87\xac\x3d\xf8\x79\x78\xaa\x19\x22\x79\x94\xaa\x49\x22\x45\x68\x0f\x7a\xb1\x38\xe8\xad\xe9\x61\x0f\x70\xb1\x38\xfc\x43\x3b\x36\x63\x29\xe7\xc8\x45\x2e\x45\x8d\xe4\xbb\xc7\x43\xc1\x27\x5c\x93\x1f\x78\xcc\xd2\x61\xc1\x88\xcf\xd9\x95\x2d\x94\xd0\x1d\x10\x6f\xa2\xc1\xb3\xcb\x4e\x26\x68\xf9\xde\x1b\xf0\x48\xdb\x6d\xc2\x1d\xfa\x9c\x9b\x1e\xff\xbf\x4b\xbb\x36\x53\x45\x88\x2a\x7a\xe7\x32\xad\x23\xe4\x27\x18\x2f\x96\x1d\x71\xd9\xa9\x84\x53\x67\xf3\xfa\xb5\xca\x92\x51\x8c\xf3\xd0\x51\x42\x6a\xbd\x22\x6a\x15\x18\xc5\xa8\x6b\x87\x26\xed\x9a\x9c\x37\x93\xf9\xc3\xbd\x39\xf3\x16\x4d\x7b\x63\x05\xb5\xdc\xaa\xcc\x69\x0d\x21\xcb\xd7\x9b\x15\x59\x94\x40\x69\x65\x5b\x92\x36\x91\xf5\xa0\xb0\x24\x56\x59\x59\x12\xa9\x9b\xcd\x33\x95\x57\x4f\x30\x24\xd4\xcf\x7b\xd9\xf4\xd3\x78\x75\xb2\x46\x45\x27\x79\xf1\xe1\xff\x7e\xb7\x1f\xf1\x5b\xfe\x75\x6a\xa5\xb9\xc7\xff\x6c\xb5\x9b\xff\xea\xc7\xff\x15\xfd\xc4\xff\xb4\x2d\x6b\xd1\xf7\xab\x53\x4f\x41\x9a\xcd\xd2\xf3\xf3\x5c\xf2\xfa\x2e\x25\xdf\x7f\x9a\x83\x3d\x4e\x92\x22\xc2\x51\xbb\xe7\xa5\x41\x0d\xb5\xad\x0a\x54\x8c\x55\x01\x53\x25\xc3\xcf\x58\x13\x95\x5f\x44\xc7\x32\x88\x74\xb2\x87\x9e\x95\x2c\x35\x3e\x50\xd1\xc6\x07\x54\x60\x10\x0d\x77\xb9\x75\x4c\xbd\x0f\x69\xa6\xb9\x88\x6e\x5d\x47\xf4\xa3\x76\x77\x1c\xcd\xc5\x05\x0f\x68\xc6\xeb\x91\x14\xed\xb9\x96\x6a\x33\x99\xed\xb4\xa5\xda\x4b\x2d\xd5\xb6\x5a\xca\x4e\x6e\x5a\xca\x86\x71\x4b\xb5\x17\xd0\x6e\x1b\xb4\xdb\x0b\x68\xb7\x0d\xda\xaf\xda\xcb\x78\xb7\x2d\xbc\xbf\x11\xde\x83\x14\xef\x81\x8a\xea\xb6\x7b\xa3\x61\x74\xd0\x88\x49\x30\x64\xc8\xf7\x31\x48\xe2\xb0\x18\xa4\x24\x0d\x96\x48\x1a\x58\x24\xd9\xc9\x0d\x49\x36\x8c\x49\x1a\x2c\x90\x34\x30\x24\x0d\x16\x48\x1a\x18\x92\x06\xcb\x14\x0d\x2c\x8a\x56\x0f\xe8\xbd\x91\xef\xb7\xcc\x90\xee\xcf\x75\x54\x9f\x51\xea\xa7\x54\xf5\x97\xa8\xea\x5b\x54\xd9\xc9\x0d\x55\x36\x8c\xa9\xea\x2f\x50\xd5\x37\x54\xf5\x17\xa8\xea\x1b\xaa\xfa\xcb\x54\xf5\x7f\x4b\xd5\xbe\xec\x84\xad\x68\x30\x6c\x04\x4d\x4d\xda\x30\x25\x0d\x86\x7a\x87\x8c\xd8\x30\xa5\x6d\xb8\x44\xdb\xd0\xa2\xcd\x4e\x6e\x68\xb3\x61\x4c\xdb\x70\x81\xb6\xa1\xa1\x6d\xb8\x40\xdb\xd0\xd0\x36\x5c\xa6\x6d\xf8\x5b\xda\x4e\x1a\x83\x61\xb7\xd6\x97\xed\x75\xf1\x34\xd7\x5f\x4f\x8c\xd0\x53\x4a\xd3\xd3\x12\x4d\x4f\x16\x4d\x76\x72\x43\x93\x0d\x63\x9a\x9e\x16\x68\x7a\x32\x34\x3d\x2d\xd0\xf4\x64\x68\x7a\x5a\xa6\xe9\xc9\xa2\xe9\x3b\xcd\xab\x51\x8a\xf6\x68\x69\x5e\x8d\xac\x79\xc5\x61\x31\x4a\x29\x1a\x2d\x51\x34\xb2\x28\xb2\x93\x1b\x8a\x6c\x18\x53\xf4\x6a\xb4\x40\xd2\xc8\x90\x34\x5a\x20\x69\x64\x48\x1a\x2d\x93\x34\xfa\xfd\x10\xec\xb6\xfd\xae\x1e\x7c\xe3\xb9\x7e\x1a\x33\x4a\xe3\x94\xaa\xf1\x12\x55\x63\x8b\x2a\x3b\xb9\xa1\xca\x86\x31\x55\xe3\x05\xa2\xc6\x86\xa8\xf1\x02\x51\x63\x43\xd4\x78\x99\xa8\xb1\x45\xd4\x0d\xf5\x53\x6f\x0e\xed\x1e\xd7\xd9\x4b\xd1\xee\x2d\xa1\xdd\xb3\xd0\xb6\x93\x1b\xb4\x6d\x18\xa3\xdd\x5b\x40\xbb\x67\xd0\xee\x2d\xa0\xdd\x33\x68\xf7\x96\xd1\xee\x59\x68\xff\x20\xb4\xeb\xd6\x54\xaf\x2f\x8d\xaf\xba\x35\xbe\x38\x2c\xea\x29\x49\xf5\x25\x92\xea\x16\x49\x76\x72\x43\x92\x0d\x63\x92\xea\x0b\x24\xd5\x0d\x49\xf5\x05\x92\xea\x86\xa4\xfa\x32\x49\x75\x8b\xa4\x0a\x91\xf4\x98\x92\xf4\xb8\x44\xd1\xa3\x45\x11\x87\xc5\x63\x4a\xd1\xe3\x12\x45\x8f\x16\x45\x76\x72\x43\x91\x0d\x63\x8a\x1e\x17\x28\x7a\x34\x14\x3d\x2e\x50\xf4\x68\x28\x7a\x5c\xa6\xe8\xf1\xb7\x13\xe6\xba\x27\xfb\x4d\x98\xb3\xd1\x93\xa6\x3b\x37\xfa\xba\x8c\x55\x37\x25\xac\xbb\x44\x58\xd7\x10\xf6\x8a\x28\xb3\xd3\x1b\xca\x6c\x18\x53\xd6\x5d\xa0\xac\x6b\x28\xeb\x2e\x50\xd6\x35\x94\x75\x97\x29\xeb\xfe\x9e\xb2\x61\xd4\xeb\x45\xe1\x6e\x3f\x92\x9a\xb6\xce\x1c\x6d\x1d\xc6\xab\x93\xd2\xd6\x59\xa2\xad\x63\x75\x9a\x9d\xdc\x90\x66\xc3\x98\xb4\xce\x02\x69\x1d\x43\x5a\x67\x81\xb4\x8e\x21\xad\xb3\x4c\x5a\xe7\xb7\xa4\x5d\xc1\xd9\xef\x75\xd4\x8a\x94\xf5\x9f\xe7\x39\xba\x9e\x19\xa9\xe7\x94\xae\x67\x53\x37\x67\xf3\xd4\x67\xfb\x52\xc3\x07\xf3\xf0\xef\x63\xf9\xff\xa8\x2d\x2c\xab\x0c\xe7\x8f\xb9\xdc\x7f\x88\x3f\x0a\x7f\x88\x9f\x3d\x19\x34\xa9\x63\x07\xc5\xd7\xd5\x3f\x02\xda\x51\xb0\x5e\xfc\x1f\xe2\xf5\x1f\x35\xd8\x15\x43\x20\x8c\x62\x39\x6a\x31\x0c\xce\xf8\x24\x87\x46\x0d\xfc\x1d\xc2\xd0\xd1\x1f\x50\x1f\x7d\x35\x8f\x2c\xff\x84\xce\xcf\xf5\x76\x37\x1c\xb5\xa2\xf5\xe2\xfa\x5c\xdd\xeb\x62\x7d\x1c\xf5\x07\x08\x15\xd7\x0b\x6e\x9e\xbe\xc1\x45\xba\x1d\x20\xbf\x5e\xac\xae\x8f\x1a\x0c\xd2\xe8\x50\x58\x23\x41\xa1\x9a\xb2\x77\xb6\xae\x70\x59\x5f\x51\xf9\x72\x4b\xbd\xf6\x2c\x87\x43\xaf\x57\x34\x56\x69\x56\x6a\xc4\xaf\x9d\x15\xe5\x0c\x82\x7e\xa3\x37\x1c\xbc\xde\xd8\x78\xfd\x72\x6c\x75\xa1\x69\xef\xa9\x12\xc7\xae\x91\xcf\x8e\x75\x49\xde\xff\x52\x10\xce\xd3\x5f\xf3\xf9\x6f\x83\x32\xe6\x4b\xf4\xb3\x6d\x4a\x72\xd5\x1b\x5f\x82\x65\xb3\x54\xc7\xef\x1a\xc1\x31\x75\x34\x40\xef\x2c\x03\x7b\x77\xff\x1e\x11\xaa\x9d\xf5\x19\x54\xc6\x57\xff\x5f\x00\x00\x00\xff\xff\xb7\x00\xe1\x6b\x79\xa1\x0a\x00") +var _pagesAssetsJsGchartsJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\xfd\x7b\x7b\xd3\xba\xd2\x38\x80\xfe\xcf\xa7\x68\xb5\xd8\x59\x36\x51\xd3\xa4\xdc\x4a\x5c\x35\xbf\x16\x0a\x14\xe8\x85\xb6\x50\xc0\x78\xef\x47\x37\x27\x6e\x9c\x38\x75\x9c\x5e\x20\x3d\x9f\xfd\x3c\x33\xf2\x45\x4e\x53\xf6\x7a\xdf\xf3\x9e\xc5\x7a\x1a\x5d\x46\xd2\x68\x34\x1a\x8d\x46\x23\xd9\x09\x67\x63\x99\x45\xc9\xd8\x71\x57\x7e\x3f\xba\xe2\xe9\x0a\xe7\x4c\x8f\x65\xa2\xf4\x97\x93\xfd\xd7\xc9\x68\x92\x8c\xf5\x38\xa3\x82\xb3\xeb\x68\xac\x92\x6b\x2a\x39\x3b\x12\x17\x5a\x66\x54\x71\xb6\x3f\x0e\xa3\x71\x94\xdd\x52\xcd\x99\x4a\xe4\x6c\x04\xb0\x21\x67\xd1\xf4\x90\x1f\xd2\x01\x3b\xe0\xd9\x80\xf6\x39\xdb\x49\x53\x7e\x4b\x07\x9c\x1d\xce\x46\x42\xa7\x34\xe2\x0c\x00\x46\x6c\x2f\x4d\x93\x94\x5e\x70\xb6\x9b\x24\xb1\xe6\x63\x3a\xe4\x6c\xc2\xd3\xa9\xde\x1f\x67\x34\xce\xc3\x6f\xe3\x84\x67\x74\x0c\xd5\xbe\x85\xe6\x34\x4d\x38\x53\x7a\x11\x49\xaf\xe8\xcb\xca\x84\x3b\x9c\x0a\xf7\x77\xaa\xb3\x59\x3a\x5e\xe1\xad\xeb\x48\x65\x03\x26\xee\x4a\x88\xcb\x45\x08\xc5\x33\x6e\x03\xa4\x8b\x00\x52\x47\xb1\x0d\x30\x5d\x04\x08\xe3\x24\x49\x6d\x88\xec\x1e\x44\x92\x8e\x78\x66\x83\xcc\x16\x41\x52\x3d\x4a\xae\xb4\x0d\x72\x75\x0f\x91\x58\xf3\x5a\x3b\xd7\x8b\x10\x7d\x9d\xbd\x4e\xe2\xd9\x68\xbc\x3f\x56\xfa\x86\x89\xbb\x47\x25\xec\xcd\x22\xec\x34\x4b\x93\x61\xad\xc1\xdb\x25\xd5\x9d\x45\xa3\x1a\xcc\xaf\x7b\x5d\x8b\xe2\x1a\x75\x76\x16\x01\xb2\xe4\x34\x4b\xa3\x71\xdf\x06\xda\x5d\x04\x9a\x24\xd3\x08\x72\x6c\xa0\xd7\xf7\x6b\xfa\x70\x7a\x74\x68\x83\xbc\x59\x04\x19\xeb\x9b\x1a\x99\xf7\xee\xd1\x30\x19\x4f\xb3\x74\x26\xb3\xfa\x88\xbd\xbd\x3f\x62\xe3\xec\x34\xfa\x55\xeb\xfb\xbb\x45\xa0\x91\x9e\x4e\x79\xbf\x06\xb3\x7f\x7f\xd0\x92\x71\x0d\xe2\xe3\xfd\x81\xe0\x69\x0d\xe9\x4f\x8b\x10\xc0\xfa\x36\xc0\xc1\x22\x80\x48\xb2\x2c\x19\xd5\xc6\xfb\xf0\x5e\x33\x92\xc7\x35\x44\x8e\xee\xb1\x60\x72\x3d\xb5\x01\x8e\x97\x10\x2f\xe3\xd1\xb8\x06\xf4\x79\x11\x28\xe6\x42\xd7\x38\xe2\xe4\xde\x8c\x8b\xa6\x93\x98\xdf\xda\x30\xa7\x8b\x30\x03\x1d\xf5\x07\xb5\x4e\x9f\xdd\x43\x77\x11\xe2\xcb\x3d\xba\x4d\xf7\x46\x93\xac\xd6\xd0\xf9\xfd\x4e\xcf\xc6\xca\x86\xf8\x76\x9f\xfa\x63\x9d\xbe\x3f\x3b\xf8\x64\x43\x7d\xbf\x4f\x9b\xb8\xce\x52\x3f\xee\x11\x46\x87\x35\x74\x1f\x2f\x02\xe8\xcb\x19\x8f\x6b\xc4\xe5\x62\xb1\x95\xe9\xf4\xcc\xb0\x78\x35\xd2\x62\x11\xa8\xaf\xb3\xf7\xf7\xc8\x27\x17\xa1\xb2\xdb\x49\x8d\x1d\xd4\x3d\x00\x2e\x0a\x31\x52\x02\xe9\x7b\x40\x29\x1f\x4f\x63\x9e\xd5\xaa\x0a\x17\xa1\xc6\xbc\x2e\x45\xfa\x4b\x50\xfe\xca\xe3\x59\x0d\x68\xb0\x08\x84\x4b\x82\x0d\x11\x2d\x42\x5c\x45\xd3\x48\x44\x71\x54\x1f\xf3\x8b\x45\x30\x91\xc4\xb5\x21\x1f\x2e\x02\xc4\x7a\xdc\xaf\x2f\x1b\xf1\x3d\x64\xd2\x24\x4b\x16\x69\x38\xba\x37\x5e\x31\x9f\x4e\x0f\x17\x7a\x3f\x5e\x84\x4a\x26\x5c\x1a\x9c\xab\x51\x4d\x16\x81\xa6\x09\x4a\x09\x5c\xaa\x2f\x19\xe1\x93\x89\x1e\xab\xd7\x83\x28\x56\x84\x4e\x04\x23\x61\x14\x67\x3a\x25\xf4\x52\x30\xc2\x65\x16\x5d\xe9\xbd\x58\xc3\xb2\x4c\x68\x2a\x18\xe9\xeb\x6c\x17\x58\x3d\x1a\xf7\x5f\xc7\x91\x1e\x67\x27\x5a\x66\x84\x4e\x05\x23\xd3\x41\x14\x66\x84\x66\x82\x11\x7d\xa3\x25\xa1\x29\x23\xb8\x6e\x12\x3a\x13\x8c\xc8\x24\x8e\xf9\x64\xaa\x09\xbd\x12\x8c\x4c\x78\x96\xe9\x74\x4c\xe8\xb5\x60\x24\xd5\x93\x98\x4b\x4d\xe8\x8d\x60\x24\x4b\xde\x46\x37\x5a\x11\x7a\x0b\x85\x74\x14\x13\x9a\x31\x82\x8b\x23\xa1\xbf\xb0\xa2\x71\x86\xf8\xec\x08\x46\x92\x30\x9c\xea\xec\xdc\x34\xb3\x6b\x72\x25\xcf\x08\x7d\x0d\xe1\x01\x4f\x77\x32\x42\xdf\x40\x38\xd5\x3c\xd3\xc0\xf5\x87\x89\xd2\x84\xee\x99\xce\xbc\xe1\x99\x26\xf4\xad\x60\x24\x1a\x4f\x75\x9a\xed\xea\x30\x49\x35\xa1\xef\x30\x25\xd3\xe9\x15\x8f\x09\x7d\x0f\x78\xf1\x14\x16\xb2\x64\x26\x07\x7a\x4a\xe8\x3e\xf4\x58\xa6\x5a\x8f\xbf\x11\xfa\xb1\x8c\x7c\x27\xf4\x93\x60\x64\xc4\x33\x39\x20\xf4\xc0\x34\xf2\xe5\xec\xf5\xdb\x59\x1c\x7f\xd7\x3c\x25\xf4\x10\x88\x8c\x0b\x39\xa1\x47\x05\x45\x6f\x8c\x4a\xf4\x16\xfa\x78\x6c\x88\x35\x25\xf4\x33\xd2\x06\x16\x74\x42\x4f\x04\x23\x97\x33\x9d\xde\x9e\xea\x58\xc3\xba\x43\xe8\x69\xd9\xad\x72\x88\xce\x0c\x22\x49\x1c\x9b\xa9\x4b\xe8\x17\x1c\xd3\x74\x9a\xe5\x63\xfc\xe8\xab\x69\x7f\x8f\x03\x82\xe7\x50\x05\x8e\xe3\x27\x0d\x83\x77\xcd\xc8\x54\x67\x3b\x59\x96\x46\x62\x06\x94\xf9\x56\x02\x9c\x25\x13\x42\xbf\x63\x14\xfb\xf1\x03\x09\x1c\xc5\x0a\xe8\x39\x25\xf4\x31\x34\x8d\xca\x00\xa1\x5c\x32\x22\xa2\xb1\x22\x54\x48\xec\xe1\xfb\x64\x96\x4e\x09\x95\x92\x11\x98\xc4\x53\x42\x15\x04\xf5\x4d\x76\x1a\x89\x38\x1a\xf7\x09\xd5\x06\x12\x34\x05\x42\x43\x13\xc9\xfb\x35\xdd\xbd\x3d\xe3\x7d\xe0\x7f\x42\xfb\x92\x91\x42\x53\x2c\xbb\x3d\x90\x8c\x4c\x67\x62\x9a\xa5\x84\x46\x12\x99\x38\x26\xf4\x42\x32\x32\x49\xf5\x55\x94\xcc\xa6\x65\x33\x43\x09\x2c\x66\x74\x09\x42\x63\x04\x49\x26\x3a\xcd\x6e\xf7\xa7\x7b\xe3\xd9\x48\xa7\x5c\xc4\x9a\xd0\x11\xe4\xe4\xea\x04\xa1\x63\x99\x73\xcb\x2d\xa1\x09\x34\x96\xcc\x52\xa9\x51\xae\x11\x3a\x91\xc0\x2b\x18\xbc\xcc\x7b\x45\x68\x0a\x50\x93\x38\x82\x19\x21\x0b\x3e\x3d\xe6\x29\xe2\x3b\x93\xc8\xa8\x85\x0a\x41\xe8\x95\x64\x64\x36\xd5\xe9\x4e\x1f\xf3\xaf\xa1\x70\xc6\xe5\x90\xd0\x1b\xc9\x48\x9c\x48\x6e\xf0\xb8\x85\xce\xe5\x3a\x05\xa1\xbf\x24\x23\x03\x3e\x3d\xba\x1e\x1f\xe7\x7d\x20\xf4\x06\x4a\xde\x42\x0f\x76\xa0\xd9\xeb\xb1\x4e\xdf\xe4\xe4\x22\xf4\xd1\x2e\x34\x0c\xaa\x04\xa1\xaf\xa1\x0d\xcd\x53\x60\x83\x37\xd0\x08\x2f\x79\x64\x4f\x16\x6c\x7b\x90\x8c\x61\x62\xbd\x35\x09\x86\x81\xdf\xc9\x82\xc7\xf2\x69\x77\x8b\xc8\xa6\x19\xa1\xef\x25\x23\x29\x1f\xab\x64\x44\xe8\x3e\xd6\x9f\x55\x98\x7d\x30\x95\x54\x33\xe1\x23\xd2\x0d\x28\xf4\xa9\xac\xd2\xb0\xe1\x01\xf0\x0f\x2a\x23\x84\x1e\x42\x27\x53\x1d\x12\x7a\x64\x6a\x34\x1c\x72\x0c\x4d\x25\xd7\x53\x42\x4f\x0c\x31\x51\xa5\x20\xf4\x54\xa2\x50\x8b\x6f\x09\x3d\x83\xa1\x2e\xf8\xe6\x8b\x2c\xe6\x92\xc5\xdd\x5f\x0d\x4a\x07\xd1\x78\x96\x01\x53\x9e\x23\x1d\x84\x8e\x09\xfd\x06\x7c\x66\x34\x0c\x42\xbf\x97\x23\x88\xb3\x60\x87\x91\x41\x3e\xbd\x7e\x94\x39\xc5\x84\x7b\x2c\x19\x39\xe1\xe3\x3e\x4c\x03\x65\x44\xe1\xa9\x4c\xa3\x49\x46\xa8\x50\x8c\x8c\x13\xa5\x71\x8d\x22\x54\x2a\x46\x52\x53\xe8\x35\x23\x93\xd9\x74\x40\xa8\x52\x8c\xe4\xfa\x06\xa1\xa1\x62\xe4\x0a\x60\x8f\x42\x42\xfb\x0a\xe7\x57\x34\xee\x47\xe1\x2d\xa1\x03\xc5\x48\xa6\xa7\x19\xa1\x11\x86\x80\xe7\xf6\x80\x24\x33\x98\x76\x17\x00\x1c\x47\x20\x53\x87\x8a\x3d\xc2\x56\xcf\x6e\x27\x9a\xd0\x58\x01\x3f\x71\x45\xe8\x48\xd9\x73\x6c\xf7\x76\x5f\x11\x3a\x86\xe6\x0b\x45\x85\xd0\xa4\x40\x80\xd0\x09\xe4\x64\x7a\x44\xe8\xa5\xca\xd9\x1d\xb0\x7a\x8b\xb2\x0a\x58\x38\x55\x10\x1c\x4d\x78\xaa\x0b\x86\x3b\x2e\xe7\xcf\x34\xef\xb9\x19\x8b\x4c\x15\x82\x2b\x27\xd4\x3b\x46\x62\x1c\xf8\x99\xc2\x21\xce\xd9\xee\x4a\x31\x12\xa6\xc9\xe8\xf5\x80\xa7\xaf\x51\x6a\x5f\x9b\xfc\x8a\x87\x6e\x14\x23\x3c\xe3\xe3\x0d\x42\x6f\x55\x2e\x90\x52\x3d\x26\xf4\x17\x40\x5e\x02\x53\xee\x28\x46\xde\xe6\x02\xf7\x3d\x23\x19\x92\x61\x57\x31\xa2\x74\xc8\x67\x71\xf6\x35\xd2\xd7\x84\xbe\x56\x46\x34\x11\xba\x8f\x64\xc9\xc7\xe8\x8d\x2a\xe4\xdf\x37\x42\xf7\xca\xc8\x77\x42\xdf\x1a\x54\xcc\x02\xf2\x4e\x15\x0c\x8c\x0c\xf2\xde\x90\x36\xef\xc6\xbe\x02\x6e\x86\x89\xf5\x01\xfa\x09\x3a\x01\xa1\x1f\x51\xf0\x98\xb5\x9f\xd0\x0f\x58\x73\xbe\xc8\x13\xfa\xb1\x6c\x28\x9f\x62\x9f\x54\x25\xf5\x08\x3d\x30\xd5\x9f\x6a\x99\x8c\xd5\x94\xd0\x43\x55\xcc\x57\x83\xcd\x91\x62\x24\x57\x06\x08\x7d\x74\x9c\x23\x13\xc5\x71\x34\x2d\x8a\x7c\x86\x91\x8d\xa6\x33\x1e\x47\xbf\x72\xd9\x72\xa2\x90\xe3\x41\xfc\x29\x42\x4f\x55\xc1\xd8\x66\x4a\x9e\x61\x27\xd4\x2d\xa1\x5f\x54\x31\x93\x72\x71\xf1\x89\x11\xc9\x41\xe0\x7e\x05\x2a\x24\xd0\x81\x73\x65\x04\xca\x7e\xc1\x27\xdf\x0c\x12\xd6\xdc\xfb\xae\x16\x16\xb4\x1d\xa8\xe2\x87\xa1\x6a\x25\x7a\x1e\x97\xa4\x28\x26\x18\xd7\x66\x65\x07\x8e\x80\xd5\x5d\xe8\x9c\xf1\xb2\x03\xe4\x11\xa9\x01\x0b\x18\x79\x05\x39\xb3\x14\x64\xee\xa9\x91\x89\x5a\x17\x0b\x05\x8a\xff\x50\x57\x64\x35\x85\xfb\x9a\x11\x7d\xa5\x53\x98\x61\xba\x94\x82\x85\x7c\x88\xca\xa4\x7c\x41\xbb\xd0\xa0\xca\x40\x03\x46\xab\x18\x6a\x58\x5d\xbe\x4c\x26\x3a\x7d\xcd\x41\xd7\x89\xb5\x59\x06\x60\x26\x8e\x34\x23\x17\x49\x34\x26\x34\xd1\x8c\xcc\xc6\xb9\xc2\x34\xc1\x32\x9f\x92\xeb\xa2\xcc\xa5\x2e\x57\xc2\x5f\xc9\x58\x1f\xe1\x28\x10\x7a\xc4\x08\xa1\x9c\x73\x46\x7e\xde\xb4\xdb\x84\xa6\x9a\x91\x9f\x30\xb7\x34\x23\x2b\x84\x66\xf0\xc3\xc7\x6a\x85\x50\xc1\x39\x7b\x44\x56\x54\xa2\xa7\x2b\xe3\x24\x5b\x41\x6d\x64\x05\x38\x6d\x85\x50\xc9\x39\xfb\x7b\x05\x55\x69\xf2\x37\x55\x18\x43\x05\x94\xfc\x4d\x67\x9a\xfd\x4d\xfe\xa6\x57\xf0\xb3\xb2\xbe\xfd\x37\xbd\xd6\x8c\xfc\x45\xa8\x86\x56\xff\x7a\xdc\x79\xdc\x79\xbc\xf1\x78\xe3\xf1\xd3\xc7\x4f\x09\xbd\x81\xac\x36\xfe\x47\xe8\x2d\x44\x36\xdb\xf0\x8f\xd0\x5f\x10\x09\xc3\x90\xd0\x9d\x3c\x84\x91\x5d\xcd\xc8\x63\x42\x5f\xc3\x4f\x87\xd0\x37\x9a\x91\x7f\x11\xba\xa7\x19\x69\x10\xfa\x16\x7e\xfe\x6a\x7b\x84\xbe\xc7\xd0\xd3\x57\x1e\xa1\xfb\x10\xe4\xa3\x89\x47\x68\x08\x18\x34\x0c\x23\xb0\x7e\x92\xf4\x63\xbd\xd6\xbf\x8a\x7e\x11\xfa\x01\x80\xfa\x99\x47\xe8\x47\x08\xc5\x10\xfa\x04\xa1\xcb\x59\x02\xe1\x03\xe8\x19\xa1\x7d\xa8\xe0\xef\xbf\x09\x3d\xd4\x8c\x38\x84\x0e\x20\xee\xfc\x9b\xd0\x23\xcd\x88\x4b\x68\x04\x71\xd7\xf1\xf9\xda\xaf\xc0\x25\xf4\x58\x33\xf2\x84\xd0\xcf\x9a\x91\x26\xa1\x27\x9a\x11\x4a\xe8\x29\xfc\xac\x10\x7a\xa6\x19\x59\x23\xf4\x02\x8a\xac\x8d\x92\x5f\x84\x0e\x4d\x70\x4a\x68\x8c\xa1\x84\xd0\x11\x06\x70\x63\x03\xea\x1e\xa1\x63\x4c\xb8\xd6\x62\x08\x4b\xde\x17\xcd\x48\x8b\xd0\xaf\xf0\xd3\x6a\x11\x7a\x0e\x81\xd3\xd3\x53\x42\x13\x18\x92\xd6\x64\xdc\x27\x2b\xf9\xf6\x95\x74\x36\xc8\x8a\x31\x41\x91\xbf\xe9\x04\xea\x59\x5f\xe7\x17\xfc\xa6\x65\x28\xc1\x27\xd1\xb4\x25\x93\x11\xa6\x11\xfa\xe8\x12\x21\xa6\x19\xcf\x22\xb9\x3e\x4a\xd4\x2c\xd6\xd3\x75\xa0\xd6\x3a\xa1\x29\xe6\xcd\xb2\x28\x5e\x17\x3c\xfd\x0f\xa1\xd3\x2a\xc1\xa8\xa5\xb0\x3b\x24\xf4\x9b\x66\xa4\x4d\xe8\x77\xf8\x69\x3d\x27\xf4\x07\x06\x5e\x10\x9a\x01\x3c\x8c\xf9\x63\x48\x81\xc0\xcc\xa4\xd4\xff\x23\x94\x87\x8c\x74\x08\xbd\x82\xdc\x4e\xab\x4d\xe8\xb5\x09\xbd\x22\x54\x40\x56\x9b\x50\x19\x32\xf2\x94\x50\x15\x32\xf2\x8a\x50\x1d\x32\xd2\x25\x34\x84\x1f\x40\xa1\x1f\x32\xe2\x11\x3a\x08\x19\xd9\x22\xf4\x06\x4a\x6f\xad\x4f\x27\x7c\xbc\xfd\x73\xd6\x6e\x73\x60\x3b\x93\x96\x81\xcc\xda\x26\xf4\x57\x1e\x4d\xb7\x09\xbd\x80\x52\x02\x42\x3b\x40\xcf\xad\x68\xd4\x5f\x41\xc5\x08\x26\xac\x82\xfd\x4b\x77\xa5\x4d\x56\xa6\xa0\xa7\xfd\x4d\x77\x11\x06\xea\xbe\x0f\xe4\xad\x84\x71\xc2\xb3\xee\x0a\x2c\x51\xde\xca\xf5\x20\xca\xf4\xda\x74\xc2\xa5\xee\xae\x8c\x93\xeb\x94\x4f\x3c\xb2\xfd\x37\x7d\x8d\x8d\x17\xa8\xbc\x31\x31\xb5\xdd\x18\x8b\xe9\xc4\xdb\x5a\xcf\xd4\x36\xa1\x7b\x45\x6a\x1e\x1f\x02\x92\x88\x6e\x1c\x32\xc2\x08\x1d\x85\x8c\x6c\x13\x3a\x0e\x19\xe9\x11\xfa\x16\xc0\xff\x1f\xa1\x49\xc8\xc8\x0e\xa1\xef\x20\xba\x73\x7c\xfc\x69\xef\x8c\xd0\xf7\x18\x39\xd9\xdb\x21\x74\x1f\x82\xbb\x3b\xa7\x7b\x84\x3e\x9a\x84\x8c\xec\x9e\x10\x7a\x09\xbf\x5f\xce\xce\x8e\x0e\x09\xfd\x00\xf9\xaf\x8f\x3e\x11\xfa\xd1\x84\x0e\x0e\x76\x0e\xdf\x10\x9a\x86\x8c\xbc\x3e\x3d\xed\xbc\x46\xe1\x49\xe8\x27\xcc\xe5\xe3\xbf\xb3\x15\x99\x8c\x44\x34\xd6\x2b\xd3\xa8\x3f\x8e\xc2\x48\xf2\x71\xb6\xa2\xa2\x7e\x94\x4d\x51\xc4\x8c\xa2\x71\x34\x9a\x8d\x56\xc2\x94\xe7\xbb\x7e\xcc\x23\x74\x0a\x55\xa2\xe9\x10\x24\x12\x46\x50\x31\xd3\xe9\x4a\x64\x64\x91\xd2\x61\x34\x86\x05\x66\x16\x32\xf2\x66\xe7\x3b\xa1\x57\x10\xd8\xff\x4a\xe8\x01\xb4\x0f\x2b\x98\x43\xe8\x2d\x24\x6a\xa9\x47\x02\x36\xa3\xbf\x42\x46\xf6\x08\x3d\x04\x80\xbd\x83\xdd\xbd\x37\x84\x1e\x61\x38\x93\xeb\xef\x0e\xce\x08\xdd\x09\x19\x79\x4b\xe8\x31\x24\xbe\x3d\xd9\x39\xd8\x23\x74\x17\x92\xb4\x48\x67\x1c\x84\xf9\x67\xc8\x79\x47\xe8\x09\xfe\x42\x91\x53\x08\xbd\x27\xf4\x75\xc8\xc8\xfb\xf7\xdd\xd1\x88\xd0\x33\x4c\x3a\xfa\x72\x42\xe8\x1b\x48\x3d\x21\xf4\x0b\x24\xed\xe7\x55\x7e\xc5\xc8\xc1\x3b\x42\xf7\x42\x46\xf6\x0f\x8f\xbf\x9c\x11\x7a\x8e\x89\xa7\xfb\x87\x6f\xf6\xbe\x11\xfa\x0d\x62\x1f\xf8\x15\x2f\x74\xbe\xef\x90\xf0\x91\xd0\x1f\xf8\xbb\xf7\xfd\xdd\xde\x21\xa1\x6f\x43\x46\x3e\x11\xfa\x18\xd2\x3e\xed\x1f\x7e\x24\xf4\x5d\xc8\xc8\x01\xa1\x5c\x70\x46\x0e\xf6\xce\x76\x08\x7d\x0f\x29\xfb\x9f\x3e\xed\x9f\xee\xbd\x3e\x82\xe1\x12\x98\xb7\x7f\xf8\xe5\x6c\x8f\xd0\x7d\xc8\x3d\x38\x58\x01\xa5\x22\x64\x8f\xc8\xc1\xd1\xe1\xd9\x7b\x42\x3f\x42\xf2\xe9\xfe\x1e\xa1\x12\xa1\x41\x36\xa9\x3c\x74\x54\x68\x04\x9f\x42\x46\x0e\x09\xd5\x90\x7e\x78\x84\x7d\x3b\x25\x34\x34\xd1\xd3\xd7\x27\xfb\xc7\x67\x84\x1e\x00\x50\x72\x95\x0f\xc0\x61\xc8\xc8\x11\xa1\x7d\x80\x39\xda\xfd\xb0\xf7\xfa\x8c\xd0\x01\x44\x8e\x77\x4e\x76\x0e\x08\x3d\x0a\x19\xf9\x4c\x68\x04\x49\x9f\x57\x6e\x6f\x6f\x6f\x09\x3d\x86\xb4\x2f\x3b\x27\x67\x7b\x27\x84\x7e\x0e\x19\x39\x25\xf4\x04\x7e\xf2\x16\x2e\x00\xb8\xe8\xdc\x29\x64\xec\x7d\xc2\x8a\xcf\x20\x7c\xf4\xe5\xe4\xf5\x1e\xa1\x43\x04\x3a\xfb\xfe\x69\x8f\xd0\x18\xc3\x5f\xdf\x11\xfa\x05\x20\x78\x36\x4b\x15\x68\xe7\x5f\x21\xa6\x27\x59\x8e\xeb\x08\xc1\xcc\x7a\x7f\x1e\x32\x72\x46\xe8\x37\xf8\xd9\xfb\x76\x66\xe6\xcb\x77\x88\x7d\x22\xf4\x07\xfc\x9e\x10\x3a\x86\x02\x67\x27\x3b\xaf\x3f\x12\x2a\xfa\x8c\x9c\x0d\x66\xe9\x14\x6b\x4e\x30\x27\x49\x56\x46\x7c\x7c\xbb\x32\xd1\xa9\xd4\xe3\x6c\x7d\xa2\xd3\x11\x6e\x30\x27\x98\x0d\xcb\xea\x28\x9a\xe2\x22\xdb\x5a\x41\xbd\x71\x85\xd0\x4b\xc8\xfb\x72\xf6\x9a\xd0\x14\x43\x63\x7d\xa5\xc7\x2b\x63\x3c\xbe\x58\x49\xc2\x15\x9e\xf6\x51\xed\x98\x12\xaa\xfb\x8c\x9c\x13\x3a\x05\xb8\x73\x98\xbc\x19\x86\xf6\xf6\x3e\x12\x3a\xc3\x60\xbe\x66\x84\x00\xa8\xd5\x58\x1b\xec\x1e\x5d\x61\xa6\xd1\x10\xfb\x7d\x46\xbe\xef\xed\x9c\x10\x3a\xe8\x33\xf2\x83\xd0\x6b\xc8\xf4\x09\xbd\xc1\xdf\x04\xed\x0b\x2b\x78\x8e\x12\x10\x7a\x6b\x27\xbe\xcd\x8d\x45\x01\xa1\xbf\xec\xf4\x73\x3c\xb0\x09\x08\xdd\x81\xd4\x9f\x3f\x09\xdd\x35\x01\x58\xbe\xa3\x3e\x84\x20\xf1\x02\x43\x53\x42\x5f\x9b\xdc\x19\xa1\x6f\x4c\xe8\xa6\xbd\x49\xe8\xb0\xcf\x48\x40\xe8\x1e\x24\x05\x4d\x42\xdf\x42\xe0\x3f\xb0\xf6\x98\xe5\xe6\x3f\x49\xac\xfe\x93\x6f\x32\xe2\x3e\x23\xff\xc9\xd5\xf2\xff\x10\x3a\xea\x33\xc2\x09\x9d\xc0\x8f\x98\x26\x31\xea\x8d\xef\xa0\x3c\x8f\x27\x03\xee\x14\x06\x2f\x42\xdf\x63\xe2\x68\x42\xe8\x25\x00\xa7\x11\x5f\x23\x34\xc5\x60\x0a\xa4\x9a\x42\x70\x96\x25\x84\x66\x7d\x46\x04\xa1\x33\xf8\xe1\x72\xd8\xc7\x0d\xd3\x1a\xee\x61\xba\x84\xee\x43\x3d\x82\xa7\x2d\x48\x9f\xe4\xa4\xbd\xea\x17\xaa\xef\x35\x86\xf0\xa0\x89\xd0\x0f\x08\x9b\xa4\x4a\xa7\xbb\xf9\x5e\xf5\xe3\x62\x52\xa1\xbe\x57\xe9\xf9\x06\xb7\x9e\x90\x83\x1d\x56\xa9\x27\x46\xd7\x3d\x5a\x48\xc9\x01\x1f\x1d\x57\xe9\xb8\xe1\xf8\x5c\x8b\xe7\x50\x37\x88\x2d\xee\xd0\xfb\x8c\x48\x42\x4f\x00\xca\xa8\xea\xa7\x45\x50\x6b\x42\xcf\x30\x02\xdb\x0f\x42\xbf\x94\x61\xb3\x15\xf9\x6a\xe2\x9a\xa7\xd5\x2e\x19\x93\x72\x8a\xfd\xea\x63\x78\x36\x1a\x13\xfa\x2d\xcf\x98\x8d\xc6\x6f\xd1\x8c\x38\xf5\x09\xfd\x6e\x12\x71\x63\x48\xe8\x4e\x9f\x11\x45\xe8\x0f\x48\x54\x3c\x83\x61\xda\xed\x63\x50\x13\xfa\x3a\x0f\x65\xb8\xc3\x7f\x8c\x30\x5a\x46\x23\x1e\x9f\xde\x8e\x44\x12\x13\xca\x25\xa6\x4d\x25\xa1\x6f\x00\x38\x4a\xb5\x34\xbb\x97\xbd\xbe\xb5\x5f\x3f\x86\xf0\x15\xa1\x02\xc1\xcb\x7d\xd3\xdb\x3e\x23\x21\xa1\xef\xe0\x87\xc7\xa0\x6a\xef\xf7\x2b\x8b\xe7\x07\x0c\xa3\xe9\xf1\x23\x04\x13\x39\x43\x93\x15\x47\x7b\x19\xa1\x2a\x0f\x8d\x78\x66\xb6\xd2\x1a\x13\xf2\x25\xf0\x4d\xbe\x02\x7e\x82\xa2\x33\x20\xf1\x01\x86\xc6\x39\x7e\x87\x7d\x46\x60\xc7\x01\x65\x72\xfd\xb5\xb6\xff\x5a\x33\x35\x03\xd1\xd6\x78\x9a\x26\xd7\x6b\x2a\x25\xb4\xff\xcf\xc1\xb5\xb1\x19\x3c\x1a\xfc\xf3\x22\xb3\x3e\xa1\x51\x05\xde\x82\x5d\x55\x36\x6d\x11\x7a\x61\x25\xc6\x09\x57\x3a\x6d\xbd\xc3\xd8\xce\x24\x9a\xee\xe2\x26\x65\x68\x81\x8c\xf8\x64\xda\x7a\x53\x8c\xc5\xf4\x54\xa7\x57\xb8\xe1\x89\x2d\x98\x1a\x2a\x2d\x42\x47\x0f\xe6\x1d\xa0\xc2\x7a\xcc\x81\x71\xc7\x0f\x42\x99\x83\xe0\x62\x5f\x9f\x3c\x08\xf7\x55\xa7\x53\x1c\x80\x09\x82\xc0\xb4\x8e\xc6\xfd\x82\x9f\x2e\x31\x11\x26\x5a\x9f\x91\x01\xa1\xc7\xf0\xd3\x1d\x8d\x56\x38\xa1\x9f\x21\xac\xb9\x22\xf4\xa4\x5f\x19\x7c\x52\x28\x31\xd0\x37\x84\x9e\x42\x6a\xa4\x94\x1e\x13\x7a\x06\xe1\x24\x8d\x7e\x81\xba\x13\x13\xfa\xa5\x5f\x18\xad\xbe\x42\x28\x1b\xc5\x84\x9e\x63\x28\x9b\x4c\x09\xfd\xd1\x67\x24\x1a\xc7\xd1\x58\x13\x3a\x85\x0a\xd1\xe6\x72\x86\x46\x9c\xc7\x7d\x46\x86\x84\xf2\x41\x61\x13\x11\x10\x8a\xc6\x43\x42\x25\x84\x12\xd8\xb8\x66\x50\x28\x86\x2d\xee\x80\x91\x11\xa1\x8f\x66\x90\x00\xe3\x40\xa8\x86\x24\x7e\x93\x1b\x30\x42\x88\x69\x15\xcd\x46\x84\xf6\x21\x1c\x8d\xf3\x9c\x2b\x2c\x32\x25\xf4\x1a\x02\xb0\x21\x54\x84\xde\x98\x70\x16\x5d\xe9\x15\x89\x5b\xda\x5b\x4c\xd1\x7d\x4c\x7b\x6d\x6c\x3d\xbf\xec\x34\x34\x6a\x4e\x09\xdd\x31\x89\xd7\x2b\x84\x7e\x66\x64\x8c\x46\xc6\xc1\x80\x91\x31\xce\x86\x33\x08\x98\x05\x3a\x1a\x30\x92\x10\x7a\x01\x3f\xb8\xd2\x10\x3a\x84\xf0\x98\xd0\x78\x60\x59\x2e\x76\xa1\xc2\x64\x96\x95\xd6\x28\xc8\xbc\xd2\x69\x18\x27\xd7\x84\xbe\x86\xdc\x5c\x4b\x2f\xe4\xef\x1b\x2b\xcd\x08\xda\x3d\x2b\x25\x97\xa9\x6f\xad\x24\x14\x9e\x93\x81\x75\x1e\xf1\x0e\x73\xa3\x1b\x5d\x5a\xd0\xdf\x97\x29\xa6\xca\xfd\x32\x9e\xcb\xd9\xcb\x81\x6d\x2a\x4e\x07\x68\x75\x0e\xa3\x1b\x42\xbf\x30\x32\xb9\x21\xf4\x03\x94\x80\xed\x28\xa1\xd3\x01\x23\x29\xa1\xb0\x93\x4b\x75\x8c\xf4\x23\x74\x06\xb1\xbe\x20\xf4\x0a\x02\x09\x28\x2e\xd7\x10\xca\x62\x42\x6f\x06\x8c\x4c\x09\xfd\x08\x55\xe0\xd9\xeb\x5b\x6e\x4c\xc6\xb7\x03\xf6\x88\x4c\x73\x2d\xf3\x17\x40\xa1\x1d\x05\x71\xf8\x84\xd0\x7a\x3c\x4d\x52\x96\x4b\xba\x1d\x80\x18\xa0\x59\x64\x17\x82\xd1\xb8\x0f\xed\xbc\x86\x70\x12\x47\x8a\xd0\x03\x2c\x94\xa4\xf9\xd9\xff\x94\xd0\xc3\x85\x14\x9f\xd0\x23\x93\x64\x59\xbf\x8f\x31\x25\x37\x71\xbc\x19\xa0\x2d\x38\x8b\x24\xa1\x7b\x83\xc2\x60\x49\xe8\xdb\x41\x69\x96\xfe\x8c\xf0\x10\x9e\x0e\xb4\xce\x08\x7d\x07\x79\xb3\x10\x09\x76\x02\x99\xc5\x89\x21\xa1\xa7\x79\x34\xb7\xae\x9f\x61\x54\xdf\x64\xeb\xb8\x45\x7d\x3f\xc8\x63\x17\xfc\x8a\x17\x94\xf8\x52\xc0\xbc\x2e\x8e\x89\xf6\x01\x0c\x57\x94\xaf\x98\x17\x8d\xf4\x0f\x64\xce\x0f\x79\x46\x12\xa2\x3a\xf5\x11\xa2\xd5\x76\xfd\x53\x11\x9d\xe4\x46\xfb\x03\x4c\x80\x99\x73\x38\x28\xcc\x88\x47\x03\x34\xe4\x20\xe5\xcd\xb9\xc1\xf1\x80\x91\x2b\x42\x3f\x0f\x4a\xcb\xe9\x39\xb4\x8a\x61\xb3\x6c\x7c\x33\xf1\x74\x85\xd0\xef\x45\xf0\x3f\x3a\xfb\xcf\x0a\x5b\xe9\x78\x84\x9e\x40\x49\x9d\x66\x91\x04\x41\x72\x3a\x40\x3b\x5d\x84\x75\xff\x40\xf0\xba\xd5\xee\xd1\xd9\x80\x91\x6b\x42\xbf\xc0\x0f\x6c\x4d\x09\xfd\x3a\x28\x0f\xde\xce\x07\x8c\xdc\x12\xfa\x6d\xc0\xc8\x2f\x42\x1f\x43\xf9\x5f\x49\x32\xda\x9d\x65\x59\x32\x9e\x1e\x81\xbe\x40\xe8\xf7\x01\x23\xbf\x09\xe5\x8a\x33\xf2\xbb\x7d\x47\xa8\xc0\x50\xe7\x8e\x50\x09\xa1\xb9\x4f\xe8\x8f\x01\x23\x77\x84\x3e\x1e\x30\x52\x6c\xbe\x15\xe4\x61\xe4\x19\xa1\xda\x44\x36\xda\x4f\xdb\x84\x9e\x53\x1e\x31\x1e\xcd\xe7\xbf\xef\xa8\x88\x58\x36\x88\xa6\x95\x6f\x8d\x8c\x1c\x5e\x9e\x47\x5e\x25\x91\x5a\x69\xaf\x32\xc6\xad\x13\xe4\xc8\xe1\x54\x50\xe9\xfe\xe6\x8c\xfb\xa9\x0c\x9c\x2f\xda\xf5\x24\x93\xf3\xb9\x88\x3c\xee\xb7\x83\x68\xbc\x22\xe7\xf3\x55\xe9\x73\x15\xcc\xe7\xf8\xe3\x7c\x93\xbc\x09\x79\xae\x17\x26\xa9\x03\x34\x55\x1e\xf7\x3f\x04\x8d\x86\xa3\x18\xf7\xa7\x22\x70\x5c\xd7\x73\x57\x4d\x9a\x8c\x1c\xe1\xf6\xa4\xaf\x02\x26\xba\x92\x41\x00\x63\x5d\x4c\xfa\x7d\x67\x1d\x55\x47\xe6\x00\xb5\xa8\x55\x56\x38\x51\xc5\x04\xe0\x44\xb5\xa7\x99\x34\x4d\x78\x6e\x14\x3a\x20\xf1\x56\x99\xf2\x75\xe0\x2a\xfc\xf1\x74\x3c\xd5\x2b\x79\x9f\x21\xd7\xcb\xc3\xca\x3a\xed\x8e\x1c\xf7\xb7\x75\x72\xdb\x47\x3a\xf1\xd6\x57\xc1\x2a\x1f\x2b\xeb\xf0\x39\xe4\x3d\xfc\xdb\xc5\xbf\x0c\x04\x2f\xb7\xf0\x1e\x60\x71\xc0\x58\x30\xe0\x55\xd8\x72\x78\x51\xe8\x08\xc6\x2e\x06\x80\x24\x77\x7f\xc3\xdf\x95\x68\x3c\xcd\xf8\x58\x02\x40\x9f\xbb\x79\xfd\x69\xdf\x5b\xcc\x94\x65\xa6\xf0\x0c\x21\x24\xf7\x3f\x06\xfe\x50\x06\xfe\xa7\xc0\xe1\x2e\x94\x90\x8c\xfd\x12\x25\xe0\xc5\x20\x4f\xbb\x11\x7c\x3e\x2f\xb0\xf0\x3f\x04\x8c\x9d\x35\x1a\x64\x36\x2e\x8c\x01\xab\x25\x8a\x7e\xac\x83\x07\xb3\x64\xd0\x68\xac\xe2\xaf\x73\x2c\xb9\x5b\x47\x56\x32\x76\x0b\xcd\x2c\x2f\xfb\xe9\x1f\xd5\x7a\x22\xaa\x5a\x0f\xfa\x77\xf6\xa8\x0d\x06\x66\x10\x0d\x09\x0f\xfa\xb5\xea\x98\xdd\x90\xd5\xfb\x82\x60\xd6\xb0\x46\x36\xfb\x03\x2b\xb0\x1a\xf3\x5f\x2c\x66\xaf\xda\xb9\x43\x3b\x17\x47\x98\xb1\xb4\x6f\xb9\x17\x58\x83\x8e\xd9\x25\x06\x00\x37\x9f\xe3\xe0\x37\x1a\xf5\x91\xb0\xfc\x0e\x6a\x8d\x43\xc4\x86\x95\x01\xf4\xbb\x82\x4e\x6c\xe8\x02\x8c\xb1\xbd\x41\x05\x32\x59\x0e\x72\x6d\xd5\x72\xb9\x1c\xc4\xc2\x2a\x5d\xd2\x69\x1b\x8f\xf1\x32\x4e\xaf\xfa\x0d\x1d\xce\x09\x89\x04\xb0\x8b\x66\x76\xd5\xdc\x0f\x15\x0f\xe6\x73\xc7\x04\x58\xb3\xd9\x57\xdc\xbd\x83\x8a\x43\x85\x9b\xa0\x64\x3a\x4b\xf5\x7f\x66\x91\xfa\x0f\x69\x3a\x9d\xbd\x57\x4f\x06\xfe\x7b\x19\x38\xee\xf6\xf6\x76\xdb\xa5\x7d\xc5\x59\xdb\xab\x46\x7a\xa0\x78\x21\xc8\xca\x16\x3e\x05\xfe\xa9\x0c\x1c\xee\x73\x19\xd0\xd2\x04\xe0\x5a\xbe\x28\x55\xa1\x28\x74\x56\xb9\x9b\x0d\xd2\xe4\x7a\x65\xe4\xe0\xf4\xda\xd8\x2a\xcb\xf8\x1f\x02\xd3\x69\xc5\xfa\x38\x0f\x2f\x94\x99\x87\x05\x00\xdd\x28\x47\xdf\x92\x1f\x66\xe6\x2e\x2f\xe1\x7a\x26\x3d\xd1\x06\x4b\x49\x55\x59\x05\xc7\x14\xc0\xeb\xee\xee\x7e\xad\x0b\x40\x56\xc7\x2c\x87\xa8\xa2\x5f\xdf\x58\x61\x70\x80\xc6\x38\x4c\xbf\xb5\xce\xea\x62\x22\xc8\x15\xc7\xf5\x2f\x55\xe0\xdc\x48\xee\xf6\x06\x8a\x77\x23\x55\x0e\xec\x37\x6c\x0a\xc6\xd5\x6e\xad\x22\xfe\x2c\x17\xdb\x7f\xea\x2f\xed\x3c\x44\x21\xc1\x24\x40\x3b\xae\x27\xfc\xd7\xc1\xbd\x5e\xd5\x89\x02\xcb\x1b\x15\xee\x1d\x72\xca\x55\xc4\xde\xf0\x4c\xb7\xc6\xc9\xf5\x7c\x7e\x8f\x42\x4d\x90\xd2\x90\x7f\x57\xad\x87\x17\x30\xe2\x38\xda\x22\x82\x95\xcc\x35\x3f\x0e\xa7\xdf\x38\x77\x2b\xa1\x13\xb5\xf4\x15\x8f\x8b\xe5\x85\xb1\xeb\xa8\xd1\x28\x52\x9d\xef\x92\xbb\x74\x99\x7c\x13\x51\x0b\x74\x8b\x9e\xa3\x74\xac\x33\x5d\xc4\xe9\x75\xc4\x56\xdb\x6e\x17\x7e\x3a\x2e\xbd\x8e\xdc\xa2\xa6\xbc\xc9\x9c\x0c\x22\xf2\x3f\xa9\x80\x4a\x26\xfc\x53\x11\x38\xb7\x03\xd7\x93\xc2\x91\xf4\x3d\x04\x5a\x4a\x87\x3a\x65\xab\x1d\x4f\xfa\x97\x81\x23\xfc\x37\x02\xd6\x01\x20\xda\x99\x0a\x20\x49\x16\xe1\x2f\x0a\x22\x46\xa0\x16\x1c\x8d\xfb\xb5\x56\x3f\x4e\x04\x8f\xf7\xae\x78\x8c\xe6\x61\x7e\xc5\xa3\x18\x35\x29\xd7\x43\x82\x5e\x47\x0c\x17\xcc\x6a\x68\xbf\xe7\x0b\x72\xa9\x50\xc0\xba\x19\x03\x56\xc2\xff\x18\xb8\x1e\x6f\x69\x06\x21\x0f\x9d\xad\x80\xe2\xd2\xf5\xf6\xb8\x03\x3c\x40\x39\xe4\x5f\xe8\x6a\x49\xe5\x54\xd2\xd0\x8c\x7a\xff\xbf\xcf\x24\xa8\xd7\x97\xf9\x24\xa6\x7d\xf7\xee\x0e\xd7\x42\xb3\xf3\xcc\xcf\xa5\xe6\x73\xc1\x5b\x45\xf0\xb7\x35\xd2\x37\x51\x3e\xd0\xa3\x96\xe4\x93\x6c\x96\xea\xd3\x8c\xcb\xe1\x59\xca\xa5\x76\x97\xa4\x19\xce\xba\x89\x6a\x23\x32\x72\x5c\xff\x5a\x06\x9e\x68\x34\x30\xbf\x85\x7e\x22\x4c\xb8\x77\xbc\xd1\x78\xc7\x4d\x19\xe3\xde\x02\x63\x71\xf7\xdd\xb9\x89\xe8\xc8\xf5\x42\xe1\xdc\x44\x40\x01\xf2\x7a\x36\xcd\x92\x11\x3a\x4e\x13\x17\xd1\x1f\x2a\x5e\x61\x79\x1b\xd5\x3c\xc6\xda\x8c\x71\xff\x5c\xc1\x04\x68\x5b\x72\x2a\x36\x5c\x6b\x70\x82\x85\x64\xad\x53\xd0\xa8\xbd\xc5\x44\xa3\xc1\x71\xea\xbe\xd1\x54\xb8\xac\xe6\xf9\x6b\x89\xdc\xf5\x7f\xfb\x3f\xa7\x3f\x6f\x78\x3b\x78\xf2\x78\xdd\x1f\x00\xd3\x5b\x4d\xec\xd8\xc2\xf9\x57\xe4\xec\x46\xd8\xa1\xca\xb1\xd7\xca\x5f\x5d\xf7\xff\xdd\x5e\x7b\x15\xdc\xaf\x65\x64\x10\x2d\x67\xec\xb5\x08\x9c\x75\xff\x67\xf6\x33\xfd\x39\x5e\x09\x9a\xeb\x7d\x3a\xd5\xae\x49\xfd\x77\x95\x3c\xaf\x82\x8f\xd7\xfb\xf4\xc8\xaa\xf0\x4d\x74\xbf\xbe\xb2\x1f\x50\x30\x0f\xe5\xe5\x2a\xbe\xdd\xcb\x09\x0b\x93\xd9\x05\xd5\x16\x8a\x8e\x15\xa7\xfb\x39\x02\x89\xe2\xf4\x63\x1e\x9e\x28\x4e\x3f\xe4\xe1\x4b\xc5\xe9\xa7\x3c\x9c\x2a\x4e\xdf\xe7\xe1\xa9\xe2\xf4\xad\xce\xb9\x03\x56\x8b\x4c\xf1\xbc\xff\x85\x0e\xc2\x3d\x10\xad\x66\x2c\xf6\xb4\xdb\x68\x38\x0b\x0d\xbb\x16\xc0\x20\xb4\x01\x72\x6c\x6c\x80\x51\x0d\x20\x47\xd1\x06\x98\xd5\x9a\xc8\xf1\xb6\x01\x0e\x6a\x00\x79\x67\x6c\x00\xce\xb9\x0d\x91\x77\xd1\x2d\xd6\x1c\x8e\x32\x61\xac\x38\x5b\x6f\xac\xf7\x69\x02\x81\xad\xf5\x3e\x9d\x40\x60\x7b\xbd\x4f\x2f\x21\x40\xd6\xfb\x34\x85\xc0\xdf\x30\xbc\x10\xf8\x79\xd3\x6e\xaf\xf7\x69\x06\x61\x1f\x22\x8d\xad\x6d\xf2\x77\xb0\x5e\xb1\xfd\xac\xc6\x27\x6f\x61\xac\xf6\xb4\xdb\x13\x12\x94\xe0\x15\x11\xf5\xae\x10\xa0\x7b\x6d\x7e\xb8\x35\xb0\x57\xf6\x5c\xf8\x9d\x9f\x58\x77\xf7\x34\x35\xa7\xd1\xdd\x41\x48\xcd\x09\x75\x77\x04\x21\x73\x2e\xdd\x9d\xe9\x3b\x2a\x3d\x99\x8b\x58\x14\xaf\xc7\xd6\xca\x02\xbd\xbf\x51\x9c\x5a\x82\x4a\x9b\x36\x42\x26\x7c\x1e\x80\x3a\x10\x16\xc3\x1c\x42\x4c\xfb\xaf\x45\xe0\xb4\x5d\xc6\xae\x75\x21\xd0\x06\xdc\xf9\xa6\x9b\xda\x1f\xc8\xc0\xe9\xb8\xae\x17\x72\xa7\xef\xce\xe7\x4e\xc8\x8c\x88\xf0\xaf\x54\xe0\xf4\x61\x56\xcd\xe7\xce\x37\xee\x48\xca\x9b\x53\xed\xd2\x90\x49\xff\x8b\x08\x7c\xa1\x50\x1c\x3a\x6d\xba\x06\xc5\x4b\x29\xc8\x03\x16\xde\x59\x93\xe2\x7a\xd9\x2c\x6b\x38\xfe\xbf\xbd\xa0\xe9\x7a\xeb\x7d\xbb\x1b\xd2\xfd\x3d\xbd\x8e\x32\x39\x70\xa4\xfb\x5b\xf2\xa9\x5e\x79\x2f\x78\x37\x2f\xba\xa7\x3d\x4c\xca\x64\x99\x34\x08\x4d\xd2\x65\x95\x34\xca\x93\x3e\x54\x49\x33\xed\xe5\x07\x07\x5d\xd8\x0c\xdc\xa3\x85\xca\x69\x21\x4b\x5a\xc0\x8c\x09\xb9\xa3\xca\xc9\x62\x91\x44\x59\x1c\x77\x67\x74\xc0\x1b\x64\x3a\xe8\xd2\xcf\xe9\x56\x03\xba\xd5\x5b\xef\x5b\xcb\xd2\xbb\x7c\x7a\x83\x30\xdc\x16\x39\x0f\x6b\x0d\xb4\x13\x6b\x4f\xdd\xe6\x57\x5d\x8d\xae\x75\x63\xa0\x26\x6d\xab\x79\x20\x2c\xe2\xbe\xaf\x4b\xe4\x3e\x77\x44\xb3\xe3\xfa\x23\x5d\x97\x74\xfb\x35\x95\x47\x46\x8e\xd9\x5c\xbb\x3d\xee\xdf\x88\xa0\x88\x75\xcb\xb5\x81\x2a\x26\xb1\x2d\xd8\x5e\xaf\x75\x18\x53\xb8\x57\x96\xa0\x59\x16\x98\xbe\x8f\x9c\x6f\x9a\x0e\x5a\x23\x7e\x83\xfd\x50\xae\xdb\x94\xd6\x05\x8c\xfb\x9b\x19\xde\x3b\xaa\x9a\xb0\x2e\x85\xd4\x18\xc4\xac\xb3\x23\xbd\xb0\xce\xd6\xc4\xe5\x87\x7b\x1b\xef\x36\x55\xec\x4d\xe4\x54\x8b\x5b\xb9\x11\xd7\x56\xba\xb0\xd2\x43\x66\x50\x57\xfe\x87\x80\x6a\xe8\x18\xed\xb3\xb6\xd7\x66\x4c\x36\x1a\xfd\xad\xd0\xeb\x37\x9b\x86\x60\x43\xa6\xfc\x7e\x30\x9f\x1f\xd1\x98\xe9\x3c\x34\x66\xeb\xce\x4f\xf5\xc4\x75\x7e\xbe\x79\xe2\x82\x90\xa9\xc7\x3d\x95\x60\xd1\x29\x1b\xfb\x99\x08\x9c\xa1\x3b\x9f\xfb\x47\xf4\x88\x1e\x05\x74\xc6\x26\x98\x16\x57\x69\xc0\x6f\x6d\xc6\xa6\x7e\x3b\x40\x13\x44\x9b\xb1\x99\x09\xbb\x22\xd5\x7c\xe8\x49\xf6\x31\x32\x10\x1d\x48\xed\xb5\xbb\x43\xee\x40\x84\x76\xda\x2e\x45\x70\x2b\x63\x96\x67\xb8\xf3\x79\x51\x6c\x03\x72\x0d\x20\x06\x4d\x16\xa4\x53\x48\x71\xef\xae\x07\x51\xac\x01\x56\x96\xec\x6d\x0d\xe6\xc7\x3a\x9b\xf1\x2d\xd1\x5b\xeb\x74\xf9\xb6\xe8\x75\xba\x6d\xeb\x5a\x09\x8e\x79\x31\x2a\x82\xb5\xa9\x64\x6d\x4f\x6e\x01\xdf\x7b\xcd\xa6\x74\x05\x7b\xda\x79\x22\x9a\xdc\xe7\x1a\x94\x3e\x2a\xfe\xc5\x9e\x6d\xbc\x7a\xf6\xea\xc5\xcb\x8d\x57\x2f\xac\x2d\x31\x14\xff\xa5\x38\xdb\xe8\x3c\x7b\xf9\x6c\xf3\xe9\x8b\x67\x9b\xc5\x7e\x6a\xde\xae\xe4\xf2\x81\xbd\xa5\xe5\xd6\x96\xb6\xcd\x40\xcd\x40\x75\xa2\x17\xf1\xae\xa5\x62\x1c\xda\x5c\x59\x72\x8b\x91\x49\x3f\xd7\x72\x17\x9f\x7b\x32\xa9\x20\x88\x3f\xd4\x81\xe3\xda\xc2\x6d\xc7\x96\xef\x49\x35\xaf\x2c\x7d\xdb\x54\xee\xf8\x6b\x8e\xfb\xd3\xff\x19\xfc\xbe\x6b\xf6\x9e\xb4\x1e\xff\xfc\xf7\x9c\x76\xff\xda\x5a\xfd\xf9\x13\xdb\xdb\x15\x25\x16\x37\xed\xcd\xf5\x3e\x7d\x23\xb8\xdb\xbd\xe8\xd7\x85\x3e\x28\xac\x27\xba\xbf\x77\x33\x71\x06\x9c\x37\x1d\xd1\x93\x8a\x37\x45\x73\x4f\xf0\xee\x91\xdb\x8c\x38\xa7\x87\x7d\xd7\x46\x5e\xc0\xca\x50\xd0\xb5\xa9\xcb\x0e\x54\x44\x3c\xaa\xeb\x2c\x46\x5f\x0b\xcc\x10\x1c\x47\x46\xed\xa5\x9f\x23\x76\x1c\x81\x40\xe8\xd5\xea\xae\x48\x63\x72\x71\xca\x62\xfa\x5d\x77\x11\x50\x32\x23\x04\x64\xaf\xdd\x6d\x6f\xcb\x5e\x21\x38\xa0\xc1\xa6\x74\xbb\x12\x26\x01\xda\x0d\x0a\x99\x9b\x44\x8e\x70\x1b\x8d\x0e\x63\x02\x58\x3b\x17\x7e\x54\xba\xdd\xb5\x0e\x5a\xf2\x0a\xce\x92\xcd\x26\xec\x7d\x24\xac\xc6\x1c\xd4\x4b\x19\x30\xc6\x44\x51\x8f\xf4\x0a\x09\x7a\x47\x77\x15\x87\x9e\x9c\xff\xb1\x27\xe7\x55\x4f\x0a\x9c\x0d\x59\xba\x7f\xee\x58\x01\xe4\xb5\xb7\x65\xa3\xe1\x48\xb6\xd0\x47\xf7\xbf\x77\xf1\x7c\xb1\x8b\xed\x2d\x26\x3d\xb9\xb6\xf6\x4f\x3b\xf8\x03\xba\xf7\x55\xdc\xef\x9e\x49\xfe\xd3\x08\x95\xc6\x51\xf6\x88\xa3\x50\x64\x88\x6b\xcf\x18\x35\x8f\xdc\x2e\xa7\x21\x6b\x7b\xe1\x96\xf2\xc2\x66\xd3\x0d\x01\x1b\xdd\x68\x08\xa8\x53\x52\xed\x87\x01\x0d\x29\xb7\x79\xeb\x24\xba\x5f\xf7\x43\x55\x2b\xa6\xd6\x3a\xd0\x5d\xe5\xad\xad\x29\x57\x2d\xd6\xae\x02\xaa\xa0\x76\x64\xcc\x53\xe4\xc7\xc9\x92\x6e\x56\xa3\x38\xf9\xa7\xbd\xcd\x31\xf2\x03\xe8\x1e\xed\xdf\x47\x6d\xc8\xda\xde\x70\x4b\x79\x43\xc3\x67\x43\x40\xad\x6f\x26\x7d\xcc\xfa\xfe\x30\xf0\x72\x2c\x63\x3a\xa4\xa8\xa3\x6a\x3f\x6c\x36\x03\x16\x97\xb2\x54\xdf\xd1\x33\xc0\xb9\x35\xe2\x93\x87\x71\x86\xdc\xff\x11\xce\x7d\xd0\x51\x68\x78\x1f\x65\x58\xca\xfa\x5b\x0a\x17\xb1\x3e\xe0\x1b\x22\x56\xfd\x80\xe5\xa8\x86\x7e\x3f\xa0\x7d\xca\x2b\xcd\x4d\xdf\xd1\x2f\x88\x62\xaa\xd5\x4c\xea\x05\x2c\xa9\x72\x7f\x83\x12\x20\xd8\x37\x47\x50\x55\x15\x2b\x0b\x3c\x8c\x38\x94\x05\xb4\x35\x93\xde\x0f\xc7\xd2\x5b\x25\xed\xbb\xbf\xb5\x41\x49\x51\x4d\x25\x62\x74\x67\xa3\xf4\x15\x47\xfa\xab\x0a\x7a\x8f\x1e\x1e\xea\xaf\x7f\x16\x3d\xff\x9d\xf9\x6c\xbe\x06\xe5\xf9\x01\xd6\xce\x27\xdc\x6a\x3b\x47\x70\xb5\x73\x47\xcf\x11\xc1\xbe\xfe\x13\x2b\xf6\xf5\xff\x7f\xf0\x5b\x7d\x08\xc1\x62\xc3\xbd\xda\xb6\x66\xe3\x6b\xc5\x6d\x2d\xb0\x5d\x1f\x0b\x4e\x35\x0d\xdd\xdf\x58\xa3\x59\xc5\xa8\x49\x6a\x34\x9a\x4d\x79\x47\xf3\x95\xcd\xbb\xaf\x1c\x7c\x2b\x67\xb9\x60\xdf\x8b\x70\xb9\x14\x6f\x8b\x1e\xc8\xc7\x6e\xd1\x27\x50\xbe\x85\xdb\xe5\xbe\x08\x2c\x8d\xee\xfb\xff\x40\x52\xfc\xcf\x06\x6b\x25\xac\xa4\x63\x75\x73\xd2\xd6\x87\xbd\xac\xfb\xbb\x6a\xd1\x93\xf7\x5a\x44\x49\xac\xd6\x58\x2e\x9e\x94\x91\xc6\x28\xa1\x64\xde\x6e\x4e\x31\x59\x88\x29\x58\x16\x94\x87\xca\xdb\x4a\x76\x27\xd9\x5a\xe7\xae\x24\x88\xbc\x4f\x10\x09\x04\x91\x81\x75\x73\x73\xc1\xd2\xb2\xc5\x3e\x9b\x14\xeb\xe6\xe6\x85\xb5\x70\xa3\x29\xe6\x83\x55\x81\xb8\xc8\x0d\x4a\xab\x78\x30\xe0\x56\x4a\x59\x6e\x91\x69\x6f\x31\xe1\x89\xb5\x35\x37\xb7\xfe\xc1\x80\x78\x78\x4d\xd1\xb6\xe5\xc8\x8b\x62\x5c\xd4\x05\xda\xc3\xda\x80\x43\x35\x6e\xfa\xc2\x66\xa9\x1c\x47\xaa\x3c\x47\x31\x58\xb9\xdc\x46\xe3\x38\xf2\xe3\x82\xfd\xa5\x65\x56\xb5\x8f\xb7\xec\x9e\x1c\x47\xfe\xae\x30\x56\xb4\xe3\x68\xa9\x1d\xbc\x7f\x51\x37\x2f\xa1\xf6\xbc\x55\xdb\x0e\xc0\x3e\x08\x36\x31\x6d\x4f\x6d\x09\x4f\x35\x9b\x2e\x1e\xde\x71\x5f\x05\x15\x03\x9b\x80\x6f\x11\x2d\xba\x58\xdc\x57\x74\x40\xc7\xb0\xec\xea\xa8\x6b\x14\xdc\x52\xa6\xcb\x80\x6a\xc0\x62\x18\x39\x0a\xb6\xd0\x9a\xc5\x10\x72\x1b\x0d\x73\x0e\xf6\xcb\x9c\x83\x29\x7a\x2a\xb8\xeb\xf2\xc2\x6e\xcc\xa9\xaa\x8c\xb8\xba\x1c\xa2\xd0\x70\x7e\x9f\xe1\xd6\xc4\x2c\x3e\x7d\x5c\x7c\xb8\x1f\x36\x87\x01\x53\xb0\xe4\x60\x39\xa8\x0a\x36\xa4\xd6\x09\xe9\x45\x25\x73\x2b\x8a\xc6\xba\x68\xf1\xe2\xa2\x66\xe4\xb6\xc7\xf2\xe2\x62\x41\x72\x6d\x6c\x33\xbb\xef\xbd\xe3\xa8\xb4\x7f\x52\xe1\x76\x6b\x51\x10\x6c\x95\x1d\xcc\x68\xc5\x15\xcf\xfd\xbe\xa3\x66\x8f\x06\x03\x82\x63\x56\xac\x08\xdc\x57\xcd\x26\xac\xbc\xe3\xc8\xd1\x6e\x2f\x1a\x34\x33\x08\x74\x9d\xdc\x48\xad\xdd\x7c\xbb\xde\x84\xdd\xbf\x45\x4c\x41\x43\x20\xb5\xf0\xc3\x80\xad\x82\x8a\x25\x61\xc5\xd5\xee\x1d\xf2\xb0\x8d\xcd\x70\xb1\x5f\x7b\x28\x08\xe5\x7c\x1e\x5f\xd0\xd5\x4e\x6d\x52\xbd\xbd\x77\x30\xb3\x97\xa7\xac\xb6\x69\x31\xc9\x2d\xf8\x22\x57\x52\x05\x9a\x76\x35\x84\xa0\x48\xe0\x30\x0e\xbd\x70\xab\xef\x15\xda\x42\xd8\xec\x6f\x6f\x77\xe8\xd8\x1b\x33\xd9\x43\xc9\xa1\x29\xf7\xe3\x80\xc6\x94\xbb\x5d\xe1\x28\x8c\xb9\x5e\x7b\x6b\xdc\x0b\x59\xdc\xec\x74\x9d\x3e\x8b\xe9\x90\xad\x8e\x4b\x5d\x62\xd8\x0b\xbb\xff\x9f\xd0\x32\x63\x5e\x14\xd6\x05\xa9\x03\x47\x40\xb7\xec\x61\x1d\xdf\x63\xea\xb6\xad\x38\xa3\x32\xf9\x1b\xbd\x28\xba\x92\xa2\x2f\x82\x91\x45\x9e\xe1\x72\xac\xcf\xc3\x36\xec\x75\xab\xa4\x8f\x72\xb8\x9f\xa8\x80\x0a\xf8\xeb\xce\xe7\xdc\x9f\xc8\x60\x4d\xc0\xdf\x3b\x73\xe0\xbe\xac\x41\xf8\x03\x05\xac\xa7\x0f\xec\x9d\xd4\x92\x16\x2b\x7e\x16\x0e\x6f\xdd\x50\xd5\xba\xa9\xed\xc4\x92\x8b\xd2\x84\xba\x8a\x67\x9d\xf3\x39\xfc\x0a\x44\xe9\x43\xb0\x8a\x1a\x76\xb5\x3e\xda\x67\xf6\x1f\x02\xaa\xd8\x7b\xc5\xa9\x66\x6d\x4f\x6f\x49\x4f\x9b\x95\x65\x15\xfa\xa6\xa1\x6b\x3a\x58\xb6\xb4\x56\x16\xef\x8b\xfa\xf6\x18\xf7\xc5\xf9\x26\xd9\x02\x7b\xaf\x16\xee\xe3\x83\x12\x6f\x8d\xd4\x7e\x91\x5f\x21\xf7\xfb\xce\x9e\x34\xaa\x10\x3e\x38\x6f\x60\xd6\xd8\x8b\x8f\xc6\x95\xc7\x93\x91\x83\xb6\x58\xe9\x87\xc1\x7c\x8e\x3f\xcc\x0f\x5c\x17\x44\x85\x5e\xb6\xb9\x9f\x58\xf2\xd4\x37\xd2\x74\xbb\xf3\xc4\xe1\x6b\xed\xa2\xd3\x7e\xe0\x2d\x70\x8f\x27\x9b\xac\xe3\x0a\xa8\xb3\x5a\xeb\xed\x37\x50\xee\x31\x9d\x1f\x2c\x91\xc7\x4b\xb4\x89\xab\x8b\xba\xe8\xf0\x83\xc2\x88\xf0\x0f\xc4\xb0\x87\x12\xb8\x67\x9d\xcc\x5d\x5d\x54\xa7\x81\xca\x75\xbb\x22\x97\x98\x4b\x8e\xdf\xaf\xcb\x25\xb3\x76\x92\x7a\x8f\x04\x25\x4e\x06\x8b\x4a\x61\xf1\x83\x9c\x83\x6a\xa8\xea\x02\xd5\xd0\x42\x55\x23\x9d\xe5\x36\x0b\xab\x26\x56\x84\xa7\x00\xbb\xd0\x97\x81\x7b\x57\x20\x6a\x1f\x12\xd9\xeb\xe4\x92\x23\x56\x73\xcc\xf8\x41\x71\x76\x73\xe1\xac\xb6\x5d\x7a\x7b\x01\x21\xe8\xbb\x5b\xd5\xf2\xcb\xae\xc5\x32\x37\x7e\xb4\x26\xa0\x27\x60\xde\xb7\x97\x1c\x81\xde\x3f\xde\x7c\xe0\x60\x0c\x14\x05\x7b\x61\xfa\xa4\xb8\xf3\x30\xf2\xab\x51\x54\xd5\x68\x9f\x11\x57\x78\xef\x2c\x8a\xf1\x41\x6b\x14\x8d\x1d\xb3\xc7\x46\xb5\xc3\x16\xcc\xbb\x35\xc5\x84\xff\x4b\x54\x0a\xa9\x7c\x22\x7a\xb2\x29\xba\x16\xd3\xbd\x5e\xac\x9b\x37\xe5\x13\x47\xac\xd9\x66\xca\x37\x35\xba\x3d\x19\xb4\x8e\xf7\xd7\x3b\x9b\xd6\xf4\xde\xab\x4b\x01\xf1\x64\xd0\x92\xc9\xd4\xc1\x72\xf6\x12\x73\x1f\x6c\x1a\x8d\xef\x81\xbd\xbb\xbf\x90\xef\x5e\x38\x9d\xcd\xf6\x93\x81\x7f\xa3\x02\x47\xad\x09\x2a\xd7\xb8\xbb\x0e\x88\xd0\xa7\x2f\x6c\xad\xed\xfd\xa2\x6a\x88\x36\x17\x0e\xe2\xc8\x52\x82\xf7\x6d\xa8\x2f\x91\x35\x76\x4b\xad\x5f\x1c\x76\x01\x76\x2b\x1f\xec\xf2\xfb\x17\xcb\x4e\xdd\xd7\xed\x99\x60\xb1\x9a\x5d\x72\xcc\xd1\x99\x04\xd0\xfc\x57\xc7\x9a\x8e\x9f\x96\x00\xad\x86\xf0\x6b\x96\xa6\x83\x0b\x46\x4e\xb3\x64\xb2\x9f\xe9\xd4\x38\xbc\x99\xc3\x18\x11\xb5\x6a\xc9\xdd\x91\xb3\x00\x67\x4d\x86\xc3\x0b\xc7\xfd\x7d\xf7\x86\x3b\x87\x17\xfe\xc7\x80\x5a\x7c\x69\x8e\xa2\x0f\x2e\xbc\x3b\xd7\xc3\xcc\x16\xcf\x96\x78\x5b\x01\xc3\x5a\x4c\x7a\x7c\xb1\xcc\x79\xea\xf0\xa2\x3a\x74\x8b\xc2\x42\xb5\xe1\x50\x23\x3b\xe8\x97\x79\x2d\x9e\x39\xab\x1d\xb4\x12\xe1\x0a\x56\x08\xe5\x36\x95\xe8\xc3\x75\x78\xe1\xbd\xe1\xb0\x77\xaf\xb0\x40\x1b\x91\x67\x0e\x0e\xb7\x71\x29\x73\x4b\xc4\x21\x0d\x2d\x46\x65\x03\xbe\x68\x36\x03\x4f\x34\x9b\x77\x77\xd6\x46\xae\x3c\x74\x3f\x4c\xb2\x95\x68\x34\x31\x97\xbe\xb5\x22\xae\x67\x0d\xc7\xe7\x0b\xcb\xf9\xc4\xa0\x97\xa5\xb7\xbf\x7f\x14\xca\x9f\xe4\x99\x1c\x38\x0a\xb3\xd5\x2a\x63\x07\x17\x39\x26\xca\xc3\xb3\xfd\xdf\x9c\x21\x71\x3c\x28\x95\xa3\x9d\x6f\xd9\xb8\x7f\x29\x03\xc7\x2d\xf4\x2b\x5e\x54\xa6\xb1\x32\x6d\x57\xa6\xbd\x3b\x4b\xa6\x9c\x94\x38\x19\x01\xdc\xa6\x9a\xc1\xfe\x50\xce\xe7\x1d\xaf\x53\x13\xc3\xc6\xd7\x8f\x6a\x26\xdc\xdc\xda\x1e\x96\xfe\x33\xe6\x4e\xfe\xca\x34\xd3\x93\xf2\xee\xcd\xca\x68\x36\xcd\xd0\xed\x40\xe8\x95\x5f\x3a\x4d\xf2\xf3\xf0\xbe\x35\x12\x7d\x7b\x24\x70\x13\x12\x36\x1a\x6a\x9b\xe9\xf9\xbc\xbd\x0d\xc1\x2d\xa6\xab\xe1\xc0\x07\xd0\x60\xfb\xd8\x64\x61\x75\xda\x53\x8e\x83\xe5\x7a\x74\x50\x29\xa1\xa6\x5f\x86\x70\xdc\x6a\x9a\xd3\x05\xb7\x14\xce\x94\xa1\x62\x75\x10\x67\x68\x5b\x50\x55\x59\x76\x15\xfb\x84\xf2\xd0\xd6\xbb\x8e\xad\xdd\x81\x5b\x72\x1d\x55\xc6\xcf\xe2\x0f\xcc\x67\x4c\xa0\xaa\xc0\x45\xe4\xb8\xe4\xa8\xdf\xc1\x98\x17\xfa\xa2\xc9\xca\x87\xd8\xb0\x93\xb4\x87\x58\x7a\xa6\xb9\xbb\x1a\x93\x56\xf6\xea\xd2\x27\x26\xb6\x2d\xa9\xfd\x9c\x44\x86\x54\xa5\x32\xf3\xb9\xae\x45\xba\xbf\x71\x59\xb5\x6d\x4c\xf6\x6b\x54\xa6\x6a\x0b\x59\xac\xad\x86\x70\x7e\x48\xbf\x5a\xe1\x5b\xae\x2c\x06\xe9\x4a\x16\x9c\x5e\xdc\xb3\x69\x98\xe9\x58\xb2\x7d\x61\xd3\x2c\x8b\x7c\x5d\x60\xe8\xdf\x77\x54\xa3\xde\xa1\x4d\x49\xe5\xeb\xd2\x82\x87\xaa\xa9\xa6\x7c\xd9\x8e\xfa\x7c\x51\xfd\x32\xc5\x01\x73\xdb\xbe\x03\x1b\x57\xb9\xdc\xae\x55\x59\x77\x1e\xea\x05\x28\x4a\x8b\x3d\xf9\x93\x92\xfc\xd9\x66\xb4\x36\x95\x66\x6f\x90\x53\xa4\xd9\x5c\x32\x1e\xdf\xeb\xaa\xe0\xa2\x2c\xb3\x16\x94\x1f\x35\x15\xd6\xec\x35\x8d\xd5\xa6\xa0\x38\xee\x0e\xed\xfd\xbf\xfd\x06\xd6\xf0\x1f\x95\x56\xcb\x7c\x36\xc5\xf0\x21\x4a\x1b\x2b\xbd\xf8\x13\x6d\xe5\xf0\xc1\x0e\x2e\x25\xa1\xca\x1b\x13\xf9\x41\x80\x65\xba\xb1\xbc\x92\x87\x96\xa0\xce\xeb\x2c\x24\xdd\xdf\x67\x03\xbd\x92\x5f\xe1\xe3\x71\xaa\xb9\xba\x5d\x29\xde\x47\x59\xc9\x06\x7a\x65\xa8\x6f\x57\xc8\xdf\x4d\xd1\x9c\x69\xd7\x83\x7a\x99\x35\xf5\xc2\xe1\x82\x96\x64\x6a\xef\x01\x5c\x77\x11\xb8\x6f\x11\x15\xb6\xff\xb5\xe1\x2e\xb6\x80\x4b\x06\x63\x30\x5c\xf4\x53\x2d\x3c\x93\xd1\x45\x33\xed\x9b\xe5\xd5\xdf\x95\x41\xc5\x0b\xbb\x28\x6d\x72\xbf\x34\x00\xea\xf9\x41\x77\x69\xab\x50\x3d\xe8\xd7\x55\xcb\x4b\x64\x62\xf4\x47\xdc\xa1\x7c\xc0\x64\x55\x03\x00\x9e\xa0\x1b\x68\xf5\x6e\xcf\x4a\xfd\xf1\x9d\x95\x68\x7a\x5c\x3c\xe9\x71\x14\xae\x2c\x7b\x57\x68\x25\x4b\x3e\x25\x92\xc7\xda\x1c\x4b\xae\x14\x2f\x11\xad\x14\xcf\xbc\xb4\xf0\xcd\x20\x87\xac\xd8\x0a\xcc\xc5\x22\xff\x51\x45\x35\xeb\x2c\xdd\x84\xa8\xfa\x06\xa4\xec\x94\x32\x7b\x72\x05\x03\x62\x59\x30\xbc\x70\xeb\x44\xe1\xbe\x33\x84\x0d\x1b\x83\x48\x18\xd0\x05\x93\x96\x44\x9f\x9c\xa2\xbc\x7b\x67\x91\xf1\xb4\xe6\x08\x66\xa3\x13\x85\x4e\x07\xcf\x68\x87\x96\xda\xe9\xb7\x83\xca\xdf\x42\xf1\x25\xfa\x24\xfa\xf0\x03\x3b\xfc\x6b\xa3\x64\xe9\x54\x70\xd7\x5b\xb2\x61\x86\x6d\x26\xdb\x70\xa5\x5f\x95\x56\x41\x60\xa1\xa1\x9a\x9d\x60\xc9\xfa\x32\x1c\xfe\x6f\x71\x1e\x0e\x1f\x42\xf9\x01\xf4\x9a\xf7\xb0\x2b\xa5\xc4\x8a\xb4\x16\x92\x38\x1f\x63\xf4\xe9\xeb\x03\x4b\x7a\x18\x1c\x6b\x58\xe2\x30\x78\x74\x8b\x57\x29\x5a\x67\x82\xb5\x73\x17\xfc\x7b\xc8\x6f\xe5\x8b\xed\x43\xc4\x33\x88\x49\x43\x37\xe3\x3f\xa8\x33\xc7\x46\x90\xd6\xa9\x97\x3b\x6d\xf2\x46\x03\xa1\x2f\xde\xc0\xc2\x7a\xce\xe2\xa1\xff\x31\xf0\xce\x5b\x4a\x3e\xa0\x2f\xb7\xce\xc4\x9d\x77\xde\xfa\xc2\xed\xfc\xd1\x10\x37\x7f\x15\x3a\x1c\x64\x31\x74\x47\x6c\xe5\xbd\x85\x8e\x08\xb4\x20\xbd\x36\x3b\xc5\x56\x5f\xf8\x45\x9e\x08\x02\x4b\xbf\xf1\xce\x5b\x07\xc3\xa5\xd5\xdb\x78\x8c\xb5\xbf\x2b\x60\x6d\xf7\xce\x5b\x22\x64\xb6\x9e\x50\xac\xe9\xc3\xa2\x21\x3c\xd9\x3c\x6f\x3d\x3e\xab\x81\x59\xbe\x0e\xf7\xf1\xcc\x37\x9f\x15\x86\x30\x0c\x56\x8d\x30\x75\x8a\x6e\xc0\x5a\x51\xca\xfe\xf6\x5d\xb9\x56\x78\x8f\x1e\x73\xe7\x7c\xc1\xf4\x06\x7b\x88\x41\x34\x65\x76\x11\x2f\x4f\x6c\x9d\x89\x55\xc6\x5b\x4a\x3a\xd6\x6a\x6c\x10\x11\xf3\xf9\x99\xe2\xde\x3d\x4a\x2b\x34\x5b\xa8\x12\x51\x1d\x94\x16\x30\x99\x23\xab\x33\x47\xb9\x94\xe7\x81\x65\xeb\xbc\x25\x93\xce\x96\xda\xb9\xbe\xd4\xfa\x61\x6f\x4f\x0b\x9e\x00\x09\x5e\x87\xb1\x38\x7e\x28\x9c\x1c\x3f\xda\x76\xef\x33\xfd\x9d\xeb\xcd\xea\x84\x5a\x3e\x86\xa5\xb7\x73\x41\x78\x1e\xd0\xbc\x92\xb5\x35\x9a\x57\xdb\x6c\xd2\x6a\x28\xb7\x37\x9e\xe4\x00\x8d\x46\x41\x3a\xba\xda\x76\xbb\xab\x9d\x3b\xd7\x72\xf2\x1a\x0d\x8b\xad\x5f\x3e\x04\x58\xfa\xbe\x3b\x8c\xd8\xca\xb3\xbc\xd2\x82\x95\x73\xc7\x78\xe8\x70\xc0\x52\xa1\x48\x85\x44\xa3\x77\xb8\xb8\x65\x1b\x0a\x4c\x83\xbd\xd6\xc3\x8d\x68\x63\x6a\x17\xf5\x76\xca\x26\xe8\x78\xe8\x68\x8a\x67\x14\x56\xfd\x78\xba\xce\x3a\x2e\x05\x35\xcc\x6a\xe6\xee\x1c\xc6\x9b\x2d\x35\xfb\xd6\x89\x5a\x11\xb3\x8b\x53\x7b\x7a\xaf\x58\x0d\x7e\x3e\x2f\x58\xd5\xa2\x34\xea\xe5\xd5\x08\xe4\x63\x8c\x95\x32\xac\xf4\xe2\x4d\x6d\xea\x19\x43\x55\x6d\x9f\x1d\x0f\x7b\x8e\x60\xbc\x75\x30\x74\x5c\xca\x19\x6f\x7d\xe1\x8e\xeb\x76\x21\x0d\x06\x87\x72\x86\x8a\xa2\xbb\x60\xcd\x14\x85\x45\xb1\x14\x7a\x30\x1f\x51\x3d\x76\xef\xbc\x47\xe7\xad\xfc\x4d\xc4\x85\x2e\x55\x95\x60\x39\x6c\x34\x97\xa1\x0b\xc6\x5a\x69\x8c\xb5\xe5\x54\x42\xdd\xca\x9c\x61\x50\x8d\x5d\x76\xef\xee\xbc\xfd\xe5\x13\x04\xf6\x60\x71\xce\x77\x77\xae\x77\x6e\x1e\x44\x9d\x24\x53\xcd\x16\xf6\x62\x46\x6a\x1a\xf8\xe5\x92\xf3\xbe\x44\xe2\xd8\xdf\x4a\x0a\x51\x69\xb9\x37\x7a\xe7\x35\xa3\x07\xb7\xc4\x68\xc5\xd1\xc5\xac\xcc\xe5\x47\x5f\x50\xcd\xf2\x51\xcc\xfb\x4c\x1f\xdc\x34\x5b\x3b\x48\xbd\xca\xc2\xd6\xd1\x6d\xb5\x29\x07\x55\x75\xc4\x27\xa0\x48\xad\xc8\x01\xec\xd0\xd5\xca\x34\x1a\x4b\x8d\x8a\x6a\x84\xd6\x9c\x24\x5d\xb9\x86\x6c\x7c\x30\x4e\x11\xa3\x1c\x6c\x1b\x3f\xc5\xda\xc6\xbb\xcf\xa4\x31\x7e\x14\x7d\xeb\xf5\xbb\xca\xef\x07\x77\xf6\x06\xdc\x9a\xcc\xe3\x61\x8d\xdb\x6b\x3a\x0f\x1e\xc3\x56\xd2\xee\x4b\xcd\x7d\xb1\xb4\xed\x28\xc9\xd8\x41\xbf\x67\x24\x71\x37\x3f\x91\x28\xce\x7c\x3f\x04\x5d\xb3\x1d\xb2\xce\x2f\x0a\xf1\x51\xd6\xf0\x85\xd7\xad\x43\xc0\xcc\xf7\x3c\x88\x8a\x53\x6a\xcb\x68\xb4\x60\xa7\xce\xcf\x37\x8a\xb5\xbd\x69\xac\xf6\xb0\x15\xba\xaf\x04\xe3\xf4\xb0\x4e\x06\xee\xe1\x74\x30\xac\xe3\x04\x4c\xef\xd5\x91\x5e\x05\x80\x72\x7f\x9e\xf7\xd9\x3a\x5f\xe0\xe6\xd0\xf6\xfe\x81\x42\xf3\xfe\x79\x42\xd1\x0e\xe0\x61\x6b\x96\x97\xf6\x1e\xa7\xbc\x86\xf6\x55\xe0\x35\x34\x17\x43\xe8\x46\x55\x9e\xae\xd6\x70\x29\x6c\x56\x26\xb7\x52\x7f\xb0\xbb\x54\x33\x1c\x0a\x1a\x32\x6d\x8e\x61\xdb\x5e\xe1\x0e\x5a\xba\x18\xf4\x03\xaa\x1a\x0d\x60\xa0\xfa\xf6\xbd\x76\x43\xab\xc4\x6b\x92\xe3\x55\x0e\xd9\xa4\x40\x6f\x11\xb3\x42\xfb\x2d\xbd\x28\x8a\xe5\x79\x92\xa3\x64\x50\xeb\xe3\xb1\x01\x3a\x76\x83\x56\xff\xfb\xae\xa4\xa6\x7d\x5a\x5c\x7a\xfa\x0c\x03\xaa\xe1\x0f\xba\x26\x29\x1f\xc2\x01\x83\xe4\x5c\x81\xc3\xad\x2e\x30\xcb\x43\xa5\x4b\xc3\x1c\xf4\x19\x4f\x28\x86\x81\x65\x76\xa8\xc6\xe5\x7c\x29\x01\x5a\x23\x3e\xa9\xb3\xcd\x88\x4f\xfe\x48\x80\xb3\xff\x13\x02\x14\x5d\x5d\x42\x88\x3f\x74\x5c\xf9\xc3\x7a\x91\xb2\xf7\x4b\x0c\x2d\xdf\x96\x8f\x78\x5f\x2f\x8c\x78\x5f\xff\x79\xc4\xcf\xcb\x0e\xff\x0f\xd8\xd1\xb2\xc0\x2c\xb0\xe4\x1f\xfd\x80\xa6\x38\xab\x0b\xd5\xca\x2c\x17\x5e\x5d\x89\x2f\x61\xb3\xe1\x7f\xbd\x40\x59\x5c\x9d\xcc\xcf\xee\xb9\xdb\x15\xe8\x47\xdf\xa6\x1d\xb7\xc9\xef\xce\xd9\xf4\xbf\xee\x07\xfa\x02\xa5\x24\xae\x37\x4a\xd5\x16\x9c\x22\x1f\x57\x29\xb3\x88\xbb\x4b\x94\x01\x6e\xa8\xe4\xd5\xdd\x5c\xf2\x93\x43\x51\x2d\xee\x5c\x29\x27\x5f\xd7\xcf\x5b\x23\xf9\xbf\xa9\xc3\xff\x2c\x82\xa2\x8e\x87\x54\xce\x62\x3d\x05\x50\xc4\xda\x7d\x58\xb9\xf5\xbf\xe3\x16\xc4\xf5\x1e\x50\x90\x0b\x30\xa5\x0c\xd8\xf1\x9f\xdb\x6c\x89\xb0\x6a\xf2\xd1\x79\xeb\xf0\xd7\x7d\xad\x09\x07\x7d\x3a\xf4\x16\x7b\xbc\x70\x52\x5f\x7a\x45\x49\xb3\xcb\xf4\x4f\x64\xe0\x80\x72\x2a\x90\x8e\xf6\x29\xaa\x77\xde\x8a\x46\x4b\x1a\xc2\x62\xc6\x3a\x23\x5a\x23\x69\x5f\x3b\xbe\xbf\x05\x5c\xe8\x08\xac\x77\x7f\xd4\x8a\xa6\x95\x56\xf4\xf8\x4f\x44\x01\xde\x62\xcc\xac\xd3\x39\x9b\xdf\x7c\x31\x46\xe0\xf3\xd6\xcd\x97\x25\x68\x1b\xd8\x72\x4b\x05\x15\x6c\x8b\x6a\x52\xad\xd6\x8f\x77\xa6\x43\xb7\xd1\x78\xbe\x65\x2e\x76\xe4\x88\x59\x8e\x95\x20\x23\x50\x0d\x2a\xdb\x11\x25\x69\xbd\xba\xda\xa0\x80\xc4\x38\x99\x30\xe4\x08\xb7\x5b\xe4\xc0\xce\x13\x33\x5a\x8f\xcf\x20\x3d\x36\xbe\x46\x09\x1e\x78\x3f\x8e\x1c\x45\x85\xdb\x15\x43\xfc\xbd\x33\x6a\xeb\x83\x07\x56\x40\x5d\x73\xd6\x64\x8e\xd2\x66\xc3\xc2\x07\xee\xbb\xe2\x4c\x44\xad\x31\xbf\x8a\xfa\xa0\x5e\x01\x09\xbe\xab\x9c\x2e\x3f\x14\x67\xdf\x15\xf7\xaf\x24\x8a\xde\x1f\x90\x3e\x1b\xb2\x1f\x8a\x97\x9e\x6e\x77\xb3\x21\x3b\x32\x95\x5e\x0d\xe9\xf5\x90\xde\x0c\xe9\xe3\xda\x15\xc2\x61\x85\x8a\xdd\xd0\x7c\x8e\xe6\x73\x74\xfc\x1f\xb2\xb7\x91\x33\x1b\x52\x72\x34\xd1\x29\x27\xee\x7c\x5e\xc4\x8f\x4f\x88\x4b\x77\xca\xfc\xb3\x34\x52\x7a\x9c\x55\x10\x1f\x43\x97\xee\x96\xd9\xef\xb4\x1c\x26\xc4\x6d\x34\x56\x31\xc1\x9f\xe8\xc0\x71\x29\xc9\x9f\xd9\x84\x74\xe7\x0f\x15\xb9\x74\x2f\xaf\x69\xb1\x20\xe5\x9a\xb3\xbd\x61\xa3\x91\x97\x3e\x48\x44\x14\x6b\xe2\x52\xa1\x39\x83\x0e\xd2\xb7\x43\x26\x34\x6f\x34\x84\xe6\xad\x49\xcc\xb3\x30\x49\x47\xf3\xf9\x91\x77\x85\x35\xbe\x85\x32\x5c\x12\xd7\xbb\x2e\xe3\xe7\xd1\x98\xb8\xde\x4d\x19\xff\x14\x8d\x67\x37\xc4\xf5\x1e\x2b\xce\x56\x57\xa1\x52\x6c\x0e\x02\x2d\x3e\x99\xe4\x4f\x17\xcd\xe7\x47\x94\x7c\xeb\x74\xf2\xc3\xa9\x77\x43\x36\x1b\x7a\xef\x0c\x66\xef\x86\x94\xec\x8c\x55\x9a\x44\xa0\x18\x5b\x89\xd1\xf1\x20\x19\xeb\xc5\x34\xae\x6c\xb3\xa2\xd4\xbc\x3c\x58\x32\xb7\xd0\x2a\xcd\x99\xfb\xa1\x0e\xba\x66\x55\x34\xee\xd8\xef\x6b\xa6\x16\x53\xea\x88\x0a\x60\x92\x5f\xc3\x46\x43\x44\xad\x04\x46\xb2\x5c\x0e\x59\x91\xd2\xba\x32\xfd\xa0\xa9\x51\x8c\x1d\xb7\xcb\xbd\xdd\x61\x4f\xb0\xf5\xf4\xea\x67\xd7\xf1\xff\xfd\xd3\xf5\x82\xa6\xeb\xfc\x74\xe7\x9e\xbb\xde\xdd\xc1\xac\x9f\xc2\xe9\x75\x0f\x4e\xf7\xf7\xe6\xe9\x95\xeb\x77\x57\x82\x7b\x70\x30\x38\x8e\x60\xeb\xe7\x5a\x7c\x8c\xb2\x9f\xeb\xce\xcf\xd3\xa6\xbb\xee\x7a\x66\x8a\x3a\x9c\x09\xbc\x82\x33\x1b\xba\xa0\x8d\x77\x82\xee\x51\x39\x5b\x77\x4c\x51\x24\x00\x15\xdb\x31\x08\x02\xb7\x57\x5e\x20\xea\xf2\x3b\xd8\xe6\x69\xce\xec\xeb\xbb\xfb\x43\x4b\xe6\x28\xcd\x7d\x7c\x2c\xc0\x04\x58\x7b\x8b\x7d\x88\x9c\xf7\x43\x5a\x3b\xdf\xff\x60\x17\x81\x46\xb5\xe6\xdb\xcc\x5c\x62\x0c\x75\x41\x75\xaa\x35\x67\x21\xb0\xd2\xce\xb0\x87\x38\xcd\xe7\x4e\xa8\xb9\x2f\x40\xc3\x48\xc3\xde\x90\x43\xcd\x9d\xb6\xdb\x7d\xee\xe6\x63\x52\xa1\xf5\xd1\x36\x1c\xde\x30\x69\x88\xdc\x6d\x9b\xad\xf5\x2d\x33\x4f\x9d\x88\x6e\xfb\xee\x9c\x7d\xc4\x55\xfa\x0f\xd2\xf6\x63\xbe\x83\xbf\x31\x7b\xf4\x5b\xd7\x36\xf9\x7c\x1a\x2e\x5a\x7c\x44\x6f\xb5\xdd\x85\x29\xd0\xe3\xad\x1b\xc6\x44\xeb\xa6\xd1\xe0\xad\x5b\x08\xdd\x76\xed\x43\x90\x83\x61\xcd\x53\xa3\x75\xb3\x26\x5a\x37\x54\x31\xde\xba\x5d\x13\xad\xdb\x62\x5c\x06\xfe\x2f\x15\x38\xf2\x89\x6c\xaa\x27\xca\xa2\xe3\x61\xbd\xe5\x1c\xd3\xa2\x9a\xbc\x12\x0b\xfe\xe8\x21\xf8\x66\x0e\xdf\x44\xf8\x74\xd9\x62\x7d\xc3\x06\xfe\xad\xc8\x6d\x8f\x37\x6e\x41\x46\x2b\xf1\xb6\x66\x60\xbc\x73\xbd\xe9\x43\xf5\x64\x4b\xaa\xc9\x1e\xaa\xe5\xd1\xf9\x43\xd5\xec\x2d\xa9\x66\xef\xa1\x6a\xb4\xb8\x67\x4a\xac\x2d\x64\x1f\x87\xbd\xbc\xb6\x26\x0c\x44\x3e\xd0\x10\xbe\x75\xbb\x55\x0e\xbd\x34\xd7\x56\x9c\x22\x5f\xb8\x8b\x2d\x1d\xde\x37\x5a\x9a\xf1\xbd\xcc\x59\x8e\x1b\x74\x6f\x9e\xb0\x3c\x74\xfb\xa4\x3a\x52\xc9\x2b\xa9\x0e\x66\xf3\x31\x9b\xe4\x0b\x29\x77\xbd\x53\x5e\x3e\xae\x50\x9d\x30\xfe\x89\x09\xfd\x34\x60\x4c\xf8\x69\xd0\x68\x70\x7f\x07\xc3\x3b\x01\x30\xe2\x39\x3b\xfe\x6f\xac\x7f\x6c\x58\xdf\x4f\x8d\xad\xd0\xdf\x09\x6a\xcc\x7f\x62\x4f\x65\xe3\x95\x04\xcd\x51\x8e\x80\xe7\x2d\x9e\xea\x87\xf4\x1c\x3f\x0d\x9e\xe4\x55\xde\x3d\xa0\x00\xae\x1a\xc5\x35\x85\xc9\x7f\xe7\x7a\x8b\x8c\x59\xd0\xa4\x62\x42\x3f\x0d\xdc\x8a\x40\x56\xfa\x4e\x70\x6f\x9c\x16\xd9\xb3\xaa\x2d\x5b\x5e\x59\xf6\x70\x5d\x8b\x3c\x5a\xd5\xb5\xb7\xbc\xae\xbd\x87\xeb\x7a\xf4\x0f\x18\xa8\xa8\xbf\xa0\xa3\xc5\x15\x79\xb5\x4f\xe4\x62\xbd\x68\x0b\xd2\x9c\xad\xee\x0c\xe7\xf3\x0f\x43\xe7\x95\x4b\x07\x10\xdd\x1d\x36\x1a\x98\x06\x92\x18\xd3\xe7\x73\x48\xdb\x1f\x3a\xa4\xd3\x7a\xd5\xea\x10\x97\x46\x9a\x33\xc8\x5e\xdd\x1f\x3a\x2a\x74\xe9\x05\xc6\xe7\xf3\x5f\xc3\xf9\x7c\x6f\x68\x9d\xfb\xdb\xec\xc0\x7b\xc0\x40\x67\x43\xe7\x0b\xea\x84\xdd\xa1\xe2\xf3\xb9\x33\x54\x46\x51\x3c\x1b\xda\xd6\x03\xbb\x9c\xb1\x14\x69\xee\x8f\xf0\xd2\x7e\xd7\x72\xd4\x3b\x5f\x3c\x86\xfd\x36\x74\x34\xa7\x8b\x4e\xd8\xdf\x6b\x72\x55\xcc\xe7\xba\x72\xb7\xf4\xbf\xab\xa0\xd1\x90\xfe\x89\x08\x7a\x18\x71\xbe\xe8\x26\x77\xbb\xa6\xa6\x63\x4d\xeb\x57\x0d\x7e\xdc\xaf\xaa\xf0\x09\x31\x35\xe2\xdd\xe0\x5a\x9d\x27\x62\x69\x9d\x7e\x3b\x70\x73\x55\xaf\xb2\x1a\x7c\x1b\x56\xae\x6e\x9c\xa9\xf9\x9c\x7b\x82\x89\x46\x43\xac\xb2\x63\xdd\x13\xe6\xd2\x62\xf7\x08\x9f\x9d\x32\xad\x70\xa8\x1f\xd6\xe9\xf9\x5c\x5a\xa6\x30\xe8\x88\x68\x3a\xb2\xf7\x45\x37\x65\xf7\xc8\x5c\xb8\x93\xb0\xee\xd4\x3e\x18\xf3\xba\x78\xc2\x14\x9f\x11\x7b\x20\xcf\x31\x9b\x75\xb1\x60\x5f\xd0\xac\x6d\xae\x89\x79\x7d\xc6\xfd\xd0\x9c\x8d\x0a\xc6\xfa\xfe\x54\x05\xc6\xbc\xd2\x6c\x06\xac\xef\x7a\x43\xe1\x28\xaa\x2d\xa3\x41\x69\x56\xe5\x50\x52\xa2\xab\xf6\xb1\x36\x38\x5a\xad\x84\x4c\xc3\x1e\xdf\xae\xbd\xef\x7f\x50\x01\x2d\x9e\x6d\xf1\x53\xb3\x47\x68\x34\x1e\x47\x0e\xc6\x9c\xf5\x9f\xd3\xe6\xba\x6b\xce\x62\xff\x09\x06\x15\xed\x1f\xe7\x43\x7b\x7a\xe1\x08\x6b\x83\x82\xd7\xbd\x18\x7b\x3b\xe8\x71\xe1\x70\xff\x26\x80\xdd\x85\x62\xec\x4c\xf0\x5e\xfe\x09\x2a\x88\x4a\xc9\x7b\xbc\x35\xc8\x46\xf1\xdb\x24\x65\xa2\x8b\x0e\x13\x43\x0d\x3a\xe2\x75\xe0\x0c\x35\x3a\x86\x08\xb7\x7b\x0b\xfb\x93\xcb\xbe\x3b\x9f\x63\xe8\x87\x40\x2b\xe8\x75\x60\x76\x2d\x1c\xdf\x5a\xcb\xef\xd2\x0f\x41\xb5\x92\x3a\x8e\x8b\x57\xd6\x09\x44\x8e\x4d\x84\x50\x88\x4c\x27\x5c\x96\x39\xa7\x26\x42\xa8\x4c\x20\x63\xdc\x25\x32\x81\xc4\x31\xa1\x61\xca\x47\xda\xbc\x7c\xdb\x25\x18\xd9\x4d\xcc\xb3\x76\xe6\xc5\xce\xee\x49\x9f\x8e\xf8\x8d\xf9\xec\x46\x97\x8c\xf8\xcd\xa7\xfc\x0b\x1c\x69\x12\xeb\xee\xd5\x80\xa6\xc9\xb5\xa9\x33\x4d\xae\x4d\x9d\x30\x08\xdd\xc3\x01\x9d\x4d\xf5\x88\x4f\xba\x64\x36\xd5\x07\x7c\x42\xe8\x15\x8f\xa3\xfe\xb8\x4b\xae\x76\xe0\x97\x50\x7c\x64\xaf\xfb\x75\x60\x29\x89\xf8\x82\x0e\x3e\x5c\x07\xea\x34\xfc\x16\x4a\x1c\xf7\xfb\x32\xe8\x72\xff\xac\x52\xb3\xf3\x65\x87\xfb\x1f\x15\x2c\x24\x8f\x55\x60\xbf\xb0\xa2\x6d\x93\xf3\xde\x70\x3e\xc7\xba\x56\x4d\x5d\x67\x2a\x80\x04\x53\x65\x5f\xda\xd7\xac\x44\x5c\x13\x4d\xf8\xc1\x33\xfc\x92\xc8\x58\x25\xd7\x50\x68\x57\x05\x5d\x61\xc9\x1a\x19\x2f\xc8\x9a\x91\xe6\x28\x6c\x96\xdc\xcb\x81\x2c\x5b\x4c\xf8\xed\x80\x2a\x26\xfc\x0e\xee\x16\x57\xfb\xa0\xc5\xe2\x3b\x02\xfe\x6b\xc0\x50\xf9\xef\x03\xbc\x27\xe5\x0f\x42\x2a\x03\x0f\x93\x41\x80\xbc\x0e\x1c\xc9\x39\xdd\x8b\x0c\xa4\x4b\x67\x66\x92\x60\x81\xdf\x98\xaf\x8a\xfc\xf7\x79\x76\x71\xf6\xe5\x5d\x98\x03\x2e\x2f\x3f\xe5\xd3\xfe\xfb\xc0\x53\x4c\xdf\x61\xb1\x51\x88\x8f\x05\xe2\xf3\x08\x47\xee\x9d\x64\x1c\xdf\xd6\x90\xae\x07\x78\x99\xad\xf4\x48\xe0\xe3\x56\xdd\xa1\x15\xc3\x02\x53\xed\xba\xdd\xc7\x43\xcc\x75\xbd\x0d\x3c\x35\x6a\x34\xc6\xd8\x69\x49\x85\xf5\x12\x90\xe5\x4d\x60\xb2\x73\xd9\x56\xb9\xe8\xe0\xf3\x16\x8d\x86\xf0\x2f\x03\x68\x56\xc2\x6c\x78\x63\xee\x81\x81\x08\x4f\x52\xe7\xde\x29\x52\x88\xa7\x48\x5e\x6c\xbc\xfb\x57\x55\xec\x84\x6e\xef\x87\x93\x68\x0e\x81\xfe\x85\x13\xba\xdd\x90\x6a\xb7\xab\x9d\xb0\x66\x2b\xd7\xf6\x98\x6b\xd3\x63\xdb\xc4\x17\xc6\xb9\x91\x1f\x1f\x98\x18\x2a\xeb\x92\x44\xfe\x16\x07\xf7\xcf\x64\x90\xbf\xc7\xf1\x8e\xf3\xae\x79\x98\xa3\x08\xec\x17\x81\x49\x68\x7e\x3f\x14\x09\x1f\x8b\xc0\x61\x11\x38\x2e\x02\x6f\x72\xd8\xaf\x45\xc2\x5e\x9e\xf0\xa5\x48\x38\x2f\x02\x3f\x8a\xc0\xe3\x22\xa0\x45\x1e\x08\x8b\x00\x2f\x02\xfd\x22\x30\x28\x02\x27\x79\xc5\x67\xf9\xef\xb0\xc8\x18\x17\x81\x69\xf9\xc4\xc8\x6a\x71\x4b\xcf\x76\xba\x9a\x14\x6c\xcd\xf1\x25\x2b\xfb\x22\x5a\x9c\x9f\x6d\x6a\x6e\x96\x77\x6a\x4d\x0c\xda\xb1\x20\x07\x71\xcd\x59\xc0\x13\x8c\xfb\x5f\x44\xe0\xb9\x1c\x9f\xbf\xb2\x2b\x8d\xf2\x4a\x85\x7f\xa1\x03\x60\x91\x0b\x1d\xf8\x6f\x45\x7e\xec\x64\xdd\xd6\xfa\x03\x9c\xaf\xa4\x2d\x2e\x86\xb5\x59\x0f\xab\xe7\x85\x0e\x7a\xf8\x17\x9b\xe7\x6e\x17\x57\xe4\x4a\xbe\xd8\x05\x06\x30\x6f\x8b\xc7\x38\xb9\x7f\xab\xa0\xe8\xad\x0a\xba\xa7\x91\xc3\xfd\x1f\x22\x58\x66\x77\xeb\x30\xc3\x4b\xf6\x0d\x9d\x51\xbc\xe4\x75\x4f\xde\xc2\x2f\xd0\xe5\x0b\x30\x7e\x35\xa8\xb7\x24\xad\x7b\x09\xa3\x00\x34\xb3\x2a\xbc\xd4\xe5\x35\x33\x8f\x37\x1a\x05\xff\x7a\xf8\x82\x92\xaa\xbc\xcb\xec\x07\x44\xe3\xfb\xcf\x18\xb6\xb7\x0c\xaa\xd5\xa4\x5d\x02\x54\x76\xc8\xfa\x7e\x62\x5c\x1d\x43\x47\xa1\x73\x01\x74\x5a\x75\x76\x8c\xd6\xa8\x70\x96\xee\x0f\x1d\x01\x01\x11\xb5\x4e\xbf\xbe\xcb\x3b\xd4\x68\xd4\x36\x5d\xb5\x3c\x17\x8d\x0f\x85\x5c\x2e\x12\xab\x0b\x22\xc0\x38\x17\xba\x5a\x25\x62\xa3\x0c\xd7\x87\x6f\x12\x97\x6e\x22\xdc\x3f\x91\x41\xfe\xc0\x40\x35\xb5\x71\x6b\x04\xe2\xde\xd8\x18\x01\xfb\xe5\x0f\x60\xa6\x8b\x45\x2e\x60\x14\x52\x64\xd9\x46\xe7\x85\xb1\x1c\x7b\xa2\xd1\xe0\xab\x4c\x78\xae\x60\xc2\xc6\x4e\x30\x66\xab\x1a\x69\x31\x91\x00\x2f\xeb\xf9\x82\xb6\x51\xec\xec\xb6\x8a\x26\x36\x7a\x9d\xee\x5a\x07\xf2\x51\xf1\x46\xc5\x1c\xcb\xbf\x62\x35\x59\x65\x60\x5e\x2d\xf4\xb2\x73\x17\x85\xce\x91\x79\xa5\x89\x43\x77\x71\xa6\x14\x09\x10\x2b\xd6\xaa\x62\x74\xa9\x62\x05\xa9\x72\xd5\x51\x55\x38\x25\x78\xaf\x2d\x91\x81\x57\x5c\xc1\xba\xd0\xe6\x0e\x96\xd5\x67\xcd\x58\xd8\x9b\xe6\x3d\xed\xae\xca\x46\x63\x12\x3b\x9a\x0a\xb7\xb7\xd6\x79\x92\x95\xe9\x0a\xd3\x43\xf4\x9d\xd0\xdc\x11\x94\xbb\x5d\x47\xf6\xb0\x91\xae\x86\xbf\xee\x9a\xa3\x7a\xd8\x5c\x37\xc4\xf8\x9d\x62\x28\x64\x3c\xc9\x94\x9f\xe1\x0b\x84\xb2\x65\x9e\x17\x3e\x4c\x94\xc6\x1c\x7f\x26\x02\x67\xb5\xed\x7a\xaa\x84\x51\x36\x8c\x70\x3d\x55\xc2\x14\xab\x55\x2b\x7f\x81\x1f\x3f\xde\xc9\xd3\xdb\xe3\x24\x1a\x67\x53\x47\x44\xfe\x63\x19\xb4\x4e\xcf\x76\x4e\xce\xfe\x73\x76\xf4\x9f\xbd\xc3\x37\x54\xd9\x12\x28\xab\xaf\xf7\x86\x31\xcd\x6b\xab\xa2\x1a\x97\xea\x3c\x4b\x78\x0a\x40\x56\x99\xf4\xf0\xed\x5b\x8b\x6a\x40\xb0\xba\x27\x74\x41\x42\xcb\xcb\x42\xe0\xda\x7d\x21\x03\x7c\x48\x57\x56\xce\x4f\xd5\xfb\x72\x96\x59\xe9\x8b\xbd\x9b\x2a\xd8\xa5\xc7\xbb\xdc\xdf\x91\xa8\x1f\x7d\xb2\xa7\xfc\x65\x35\x65\xbe\xe4\xfc\xe1\xf2\x96\xf5\x56\x34\x13\xe5\x59\xf2\xd3\x82\xf7\xf2\x0f\x7d\x97\x19\x28\x9f\x1a\x0d\xcc\xff\x22\x02\x84\xc9\xa5\x93\xff\x46\x06\xab\x75\xa1\x8f\x69\xae\x77\x99\xcb\x35\x90\xee\x78\x4f\x02\xd7\x8a\xdc\x63\xcb\x0c\x38\x2e\x3c\x12\x15\x84\xea\x21\x23\xfb\x6e\xd5\x4c\x17\x3e\xf1\xbb\x05\xf2\xe5\x51\x6b\xf9\x48\x7a\xee\xb2\x81\x55\x16\x4f\x8a\xa1\x02\x92\x7f\x41\x1a\x19\x64\xb5\x6d\x3f\xe5\x35\xae\xc9\xbb\xab\xfa\x78\xfb\xe5\xe8\x65\xb9\x92\x48\x57\xdb\x6e\x4f\xfa\xed\xd2\x38\x5c\x16\xbd\xbe\x57\xb4\x2a\xd3\x59\xa6\x37\x95\xd9\xaa\xbc\x5e\xb0\xca\x38\x5e\x91\xe6\x39\x19\x79\x7e\xed\x05\xc5\xb3\x23\x73\xff\x21\xe5\xce\xe7\x56\xe1\xca\x3d\x2e\x5f\x13\x2a\xcf\x3a\x40\xe5\x06\x36\x1b\xe6\xa3\x33\xdd\x0e\xc5\x6f\xc9\x74\x3b\xf4\xfd\xde\xce\x9b\x6e\x87\x9a\x4f\xfb\x74\x3b\xd4\x7c\xd5\xa6\xdb\xb9\xa3\xb7\x00\xbf\x7f\xf0\xae\x3b\xd5\x74\xf7\xa4\x9b\xda\x8f\x75\xce\x8a\x05\xb9\xa7\xcc\x2d\xfa\xae\x83\x81\xb5\x8e\x4b\xb9\xff\x45\x06\xce\x89\xac\x59\x80\xaf\x8a\xfd\x40\xcb\xfe\xfa\x1d\x0e\xc3\xa9\xac\x0e\xca\xf2\xbe\xc3\x2e\x76\x3a\xd1\x32\x0a\x23\x6d\x1d\x40\x5f\x97\x95\x14\x4f\xa3\x17\xe5\x2e\x8b\xd5\x0d\xca\x3e\xdd\x78\xf9\x62\x73\xdb\x96\xc6\x37\x85\xda\x17\xc1\xba\x35\x2d\x99\x9e\xe5\x9f\xa3\x3e\xd3\x37\x59\xfe\x74\xd1\xcf\xf4\xe7\x78\xfe\x33\x9d\xff\x1c\xbb\xeb\x7d\x9a\xea\xda\xa3\x93\x7e\xe0\xdd\xc6\xf9\x0d\x69\xd7\xe3\x4c\x14\xda\x75\xf1\x4e\xdf\xfa\xca\xcf\x9b\x9d\x37\x2b\xf6\x6b\x8a\x90\x80\x4f\x20\x7a\x25\xd0\xcf\xd9\x46\xbb\xbd\x6b\x12\x23\xcd\xe7\x73\xa7\x2a\x9f\xbf\xc4\xe8\x7a\x7c\x95\x4d\xb5\xf5\x04\xe0\xfa\xbf\x7f\x4e\x9f\xac\xd3\x23\x77\xd9\xf3\x69\xbf\xe2\xda\xb5\xd6\x02\xc9\x8e\xc5\xdf\x39\xa6\xd5\xe1\x54\x6c\x1d\xe6\xaf\x3a\x1c\xf6\xf4\xd1\x18\xb8\xc4\x75\xed\x89\x2f\xf1\x86\x69\xf9\xda\x98\x2f\x54\xe0\x2e\xa5\xd5\x51\x71\xe3\xd4\xc0\x58\x92\xc2\xd4\x7c\xab\xb9\x71\x7a\xb9\xd5\xdc\xc7\xc4\xc0\xf2\x4a\xb1\x38\xbd\xc4\x8c\x16\x7c\x6c\xe9\x21\xe5\xec\xe7\x8b\xef\x37\x9b\xc9\x63\x3b\x1a\x54\x4e\x29\x0a\x8d\x08\xd6\xdb\xdb\x98\xb2\x87\xef\x72\xa7\x7f\x2a\x52\x4d\xa1\x8a\xd6\xb5\x0d\xe9\x4e\xbc\x70\xe9\xa6\x5c\x42\xa7\x50\x43\x2c\x40\x51\x6a\xdf\x01\xc3\x58\x2f\x69\x95\xb4\x97\xf9\xe0\xc3\xfa\x5c\x5e\x20\xb7\x66\x7b\x75\x97\x2e\x87\xf2\x64\xb3\x79\x67\xcd\x16\xeb\x16\x68\xbc\x70\xa1\x07\xb5\xdf\x4b\x11\x54\xb7\x79\x96\x17\x3c\xab\x7c\x24\x2e\x43\x7c\x1d\x1a\x8f\x63\xe6\x73\xcd\xef\xce\xd9\x59\xee\xd1\x10\x71\x76\x3a\xf4\xce\x5b\xfd\x07\x3d\x1b\x2e\x43\x74\x6a\x58\xe6\x5a\x6c\x2c\x7c\x39\x54\x65\xe6\xf3\x1e\x9d\xb7\x4e\x1f\x70\xba\x34\x76\xb8\xf9\x3c\x2f\x84\x4e\x0c\xe1\xe6\x3f\x87\xbd\xb8\x66\x8f\x01\xdf\x8b\x5a\x91\x85\xdd\x7d\x5e\xc0\xde\xe2\x7b\xe7\xad\xda\xc7\xa4\x97\x75\xa7\xe8\x48\xbe\xbd\x2c\x8b\x14\x9f\xd5\xfe\x53\x19\x6b\x65\x03\x09\xe9\x9d\xb7\x74\x9f\xdf\xc3\xd1\x68\x11\x05\x7a\x9a\xad\xae\x4a\x4f\x32\x7f\x18\x2e\xde\x5a\x10\xe6\xc2\x02\x5e\x78\xef\xbd\xe1\xbc\xbb\xc7\x51\x39\x7a\x1d\x38\xbf\x30\x54\x9a\x00\x3c\xc1\xfc\xd7\x9c\x07\xb9\xe1\x0d\x0a\x73\x63\x73\xcb\x3d\xd1\xcc\xe4\xe4\x78\xb5\x4c\x61\xdf\xae\x42\xd7\x33\x1f\xf0\xcf\xeb\xb0\x1e\xe6\x34\xcb\x3a\x6e\x52\x2c\x5f\xc2\xd7\xb1\xfd\xd8\x4c\xe1\xf2\x7b\x19\xa2\x22\x97\x2f\xc4\x3b\xc3\x9e\x79\x63\xf3\x22\x6c\x0a\x97\x4a\xf3\x2a\x32\x56\xe5\x76\x31\xc3\xa8\xe9\x1d\xc6\x24\xec\xb9\xfc\x0f\x81\x0b\xdd\xa8\xc0\x8c\x4c\x36\x1e\x4d\x2a\xa7\x7d\xf1\xb1\xdd\xb7\x29\xef\xc3\x2f\xa8\x8c\x46\x05\x51\x46\xa5\xc0\x82\x92\xa9\x25\xaf\x02\xbc\xa9\x6d\x1a\x61\x94\x72\x6b\xd5\xdd\x79\xeb\xf3\xee\xfd\xf3\xde\x7c\x5c\x4a\x62\x2c\x33\x2d\x59\xab\xe5\x9e\x25\x9d\x91\x18\x9c\xc5\xa0\x08\xc3\x90\x88\x85\xb2\x02\xca\xda\xe7\xb3\xe5\xb6\xaa\x35\xe1\x7d\xfd\xdd\x7c\x05\x15\xd4\xab\x77\x2a\xe8\x15\x27\x7a\xfe\x27\xf4\xe1\x7d\xa7\x02\xb7\x9b\xa7\x19\xf8\x6f\x06\x1e\x75\x40\x19\xd0\x5a\x25\x90\x08\x25\xee\xce\x5b\x57\x6f\x97\xb1\x2c\x48\x94\xfa\xa4\xb2\x3e\x93\xcf\x26\x9a\xa3\xe3\x05\x26\xb1\x7e\xec\x9d\xb7\x0e\x25\x1b\xc0\x2f\xff\x0f\x8b\xe0\xf7\x34\xe2\xec\x02\x02\xe6\x3b\xb9\x38\x35\x86\x10\xff\x16\xb2\x18\x7e\xc7\x87\x6c\x04\xbf\xea\x80\x29\xf8\xfd\x10\x73\x36\x8e\x8d\xdb\xcf\x24\x76\x01\x72\xc2\xd9\x25\x64\x5d\xa5\x4b\x3c\xa2\x61\xff\xe8\x9f\xc9\x80\xb1\x24\x84\xee\x60\x70\xaf\x0a\x7e\xab\x82\xa7\x55\xf0\x32\xec\xad\x72\xff\x04\x6d\xd8\xab\xa8\x99\xcc\xe7\xa8\x5b\xb8\x5d\x8c\x35\x1a\x26\x86\x07\xd1\x0e\x67\xb0\x42\xf8\xa9\x08\xf0\x9d\x24\x11\x38\x6e\xf7\x77\x6e\x54\xe5\xfe\x0f\x19\xe4\xf6\x4f\xee\xef\x88\xe0\x8e\x72\x56\x2a\x31\xb0\xd9\xde\x09\xcc\x6f\x1a\xb8\x5d\xce\x84\x75\x6b\xa3\x5a\x0d\xb4\xf5\x5a\xc0\xde\xb0\x37\x13\xbc\xbb\x3b\xec\x49\xc1\xbb\x3b\xc3\xde\x95\xe4\xdd\x5f\xc3\xde\x61\xb8\xb0\xf1\xdd\x5d\x28\x35\xe6\x58\xea\x82\x63\xa9\x21\xc7\x52\x31\xe7\xa6\x58\xd5\xda\x5b\x4b\xdb\xc4\xa1\xcd\x92\x09\xe3\xde\x59\x79\xc6\xe8\x1d\xe4\x41\xe9\x7a\x3f\xf2\xa0\x72\xef\xce\xd9\xdb\xd8\xac\x04\xa3\x65\x5f\xe2\xc0\x53\x28\xa9\x82\x35\x0c\xbc\x0b\xee\x3c\x21\x1e\x74\xf1\xf2\x0f\xa4\x01\x84\xc6\xef\xdc\x3f\x1d\x47\xbe\x8d\x9d\x02\x90\x16\x6d\xd0\xa2\x0e\x9a\x37\xf6\xdf\x5c\xc5\x1a\x0d\xde\xab\xd9\x21\xde\xc6\x3d\xee\xbf\x0b\xb6\x59\x5e\x01\xbe\x33\xa8\x82\x2d\x56\x34\x01\x1a\x68\x96\x4c\x0c\x00\x84\x00\xe2\x40\x16\x10\x07\x32\xe8\xf2\xd6\x8d\x5d\xbe\x75\x53\x2f\x7d\x5b\x2b\xdb\xba\xb5\x4a\x9a\xcb\x14\xe7\x2d\x7d\x33\xe1\x63\xb5\x20\xfb\x61\x5c\x50\x8b\xe9\x95\x1d\x5f\x63\x88\x0c\x3d\xb3\x4f\xfc\xa4\x0a\x9a\x88\xb4\x4b\x0f\xec\xf4\x03\x09\xe9\x07\x32\x70\xe9\x0f\x3b\xfd\x5d\xb0\x06\x5d\x76\x8b\xc3\x6d\x53\xef\xfd\x3a\xc5\x92\xfa\xe4\xfd\xba\xd4\xc2\x31\x66\xc5\x60\xef\xf2\x25\xe0\x07\x2c\x1c\xc5\x09\xf1\xbb\x80\x0a\x6c\xdd\xc3\xae\xb0\x3c\x1d\xbb\x25\xe0\xaf\x0b\x1c\xc8\xf3\x27\x76\xb1\x5f\x54\x60\xef\x90\x1f\xab\x0c\x18\x75\x81\xdd\xb3\xdf\x80\x88\xeb\x87\xe1\xfe\xbb\x60\x8b\x09\x33\x12\x02\x23\xdc\x1a\x54\xc8\x3a\x90\x90\x65\x62\x58\xe9\xdd\xa3\xa5\x5e\x10\x88\x6b\xe5\xf2\x50\x20\xba\x78\xda\x5c\x22\xba\x98\x81\x88\x96\xd3\xc8\xca\x78\xf7\xdf\xcf\xa7\x2d\x04\xb2\xe5\xed\x67\x0f\x34\x9f\x3d\xd0\x7a\xf6\x70\xe3\x4b\x9d\x2e\x4c\xe3\x7b\xcb\x1b\xdf\x7b\xa0\xf1\xbd\x07\x1a\xdf\x7b\xb8\xf1\x47\xff\xc4\x59\x63\x81\x03\x9b\xbc\x75\xe3\x2e\x99\x12\x90\x5a\xa0\x8b\xde\x1c\x4b\xa6\x47\xeb\x16\xa6\xc1\xbd\x0a\x97\x55\xe7\xd6\x1d\x40\xb0\x52\x71\xbf\x4a\xe1\xfe\x6f\xdc\x42\x16\x30\x78\xc2\x2b\xfa\x16\x18\x40\x5a\xd1\xf2\x13\x26\xbd\xc5\x96\xef\x1f\xfb\x57\x8e\x5a\x96\xa4\xff\x51\x79\x93\x94\x23\x2b\x4a\xaf\x02\x59\x79\x13\xa0\xa4\xdf\x8f\xff\x8b\x93\xc8\x7e\x5c\x8c\x25\xad\x4b\xe7\x07\xbc\x46\x3e\xd4\xac\xcc\x46\xac\x9b\xc9\xcf\x91\xf2\xe8\x41\x82\xc4\x85\x15\x13\x13\xad\xe9\xfd\x71\xb1\x34\xf4\x0c\xda\x2e\xaa\x80\x75\xc7\x24\xe0\xca\x82\xc9\x56\xf9\x4f\xf1\x9f\x7c\x65\xde\xa1\x7f\x8c\x59\x03\x2c\xbf\x19\x24\x11\x13\x85\xec\xb7\xbd\x68\x1e\xf2\x34\x36\x32\xaa\x20\x0c\x76\x82\xca\x5c\xd4\x15\x4c\x56\x50\xa9\xec\xb7\x39\x79\xdf\x62\xa5\xd2\x5f\xd5\x62\x7a\x67\xe6\x1d\xb7\xea\x41\x42\xe5\x64\xb6\xc8\x66\x0e\x0e\xb7\x4a\x53\xe1\xca\x8f\x72\x4d\x2f\x47\x89\x29\x5a\x0e\xfa\x9a\x70\x69\x31\xec\x7c\x4d\xb9\xb4\x76\x17\xb3\x52\xe9\xeb\xf6\xac\x42\x10\x17\x12\x9d\x2a\x56\x09\x79\x33\x92\x90\xde\x14\x45\xdf\xe4\x16\x2b\xdf\x44\xcd\x0b\x5b\x62\xdf\xbc\x4d\x5e\xac\x05\x66\xf8\x31\xa7\x29\x8a\x2e\xe9\x2d\x56\xbe\xf0\x9f\x8f\xbe\xa4\x9a\xaa\x35\x49\xc3\xb5\xea\x95\x2f\xe3\x68\xf1\x80\x6f\xf6\x6b\x5d\x4d\x00\xa0\x37\xac\x0b\x3b\xb8\x3a\xa4\x41\xed\x39\x84\x92\xee\x66\xf7\x05\xe8\x68\xb6\x38\x78\x21\xbb\x37\x0c\x7d\x56\xf5\x7f\xc8\xaa\xce\x98\xf5\x6e\xbb\x52\x05\x1c\xdc\x66\xfd\xb7\x49\x84\xa5\x4a\x15\xc9\x05\x3e\x32\x54\x53\xb9\x32\x50\xe5\x79\xc3\xad\xf0\x81\x6a\x87\x65\x7d\xe1\xda\xd0\x85\xa1\x1a\xae\x49\xd7\x43\xd5\xa7\xd4\x5c\x96\x15\x94\xc8\x9f\x85\x2e\x87\x87\xc0\xfd\x2d\x5d\x87\xed\x53\x49\xf5\x5a\x1f\x33\x39\x13\xf9\xfd\x68\x86\x97\x94\x8d\x1b\xbc\x75\x28\xe5\x3d\x7a\x48\x3f\xab\xc9\xf9\xfd\xb8\x97\xb7\xb9\x85\xf4\x34\x1e\xec\x16\xe9\xb7\x2b\x32\xe7\xde\xed\x66\x09\x37\xb4\x5d\x1c\x95\x6d\x6b\x20\x1e\xd4\xd7\xaa\xca\x1f\x56\xdb\xec\x4a\x6d\xb9\xf6\x66\xc1\x0d\xa0\x75\xb3\x05\xf8\xa1\x54\x59\x13\xad\x9b\xae\x61\x78\xd1\xba\x59\xab\xe6\x87\x4b\xdb\xf8\xcd\xbc\xd6\xed\x16\xa2\xd7\x33\x03\x2a\x5a\xb7\x25\xf8\xed\x9a\x35\x1f\x00\xbe\x34\x1b\x1b\x9f\xd0\xbb\xf3\x96\x8a\x0c\xd5\x96\x6d\xdc\x8c\xff\xe8\x9b\x8a\xe7\xcd\xe6\x6d\x99\xe5\xe6\x21\x97\x3f\xd0\x4f\xfb\x3a\x7b\xad\xc7\x99\x4e\x1f\x28\x97\x7b\xc9\x5a\x14\x5c\xdf\xa0\x8b\xe4\x5a\xdf\x70\xef\xee\x39\xf2\x3d\xa4\x10\x3d\xa8\x73\xfd\xdf\x7a\xfe\x3d\xa0\x11\x3d\xa4\x70\xfd\x5f\x3a\x0a\x3e\xa0\x0f\x3d\xa4\x6e\xfd\xff\xe4\x57\xf8\xbf\xd6\xaa\x6a\xfa\xd3\x72\x4d\x69\x89\x56\xf4\x7f\xa4\x01\x2d\x71\x75\xb4\x15\xa0\xff\xea\xf6\x58\x39\x5b\x97\x56\x56\x7c\x7a\xbe\xb7\x57\xb8\xaf\xb8\x5d\xf4\x00\x9b\x45\xce\x9e\xe6\x75\x4f\xf5\x3d\x5d\xde\x71\x73\x24\x7b\x6b\x4a\xb8\xe6\xd9\x8f\x9b\xc0\x97\x01\xab\xbd\xa0\x5a\x9f\xfe\x87\x51\x7e\xc0\x6c\x8e\x84\x18\x63\x79\xa1\x62\x69\xc7\x9d\x7e\x73\x47\xf1\xdc\xe1\xae\xfa\xec\x27\xc0\x55\x87\xb9\xcb\x6c\x54\xef\x16\x4f\x20\x6f\x02\x1f\x1b\x2c\xa4\x6c\xed\x54\xbb\x38\xd6\x96\x3d\xd9\x45\xd0\x02\xd5\x60\x3e\x3f\xb2\x1c\xca\x6d\x73\x5d\x7e\x02\x57\xfa\x4d\xee\x1a\x17\xa5\x5d\x15\xa0\x24\x48\x46\x93\x59\xa6\xd5\x69\x76\x1b\x6b\x7c\xf1\x7f\x79\x96\xc3\xf1\x43\x02\xae\xdb\x93\xbe\x08\xe6\x73\x09\x10\xc5\xd3\x30\xf8\xc9\x65\x7c\xa7\xf4\xa8\x6b\xa1\x71\x54\x57\xd0\x72\xac\xf0\x13\x84\x0a\xbd\x37\x94\x0e\x7c\x11\xa0\x29\x03\xdf\x38\xbd\x41\x6d\xed\x26\xa8\x3f\xac\x7d\x6c\xeb\x89\x58\xe7\xe5\xc0\x76\x99\x8e\x6b\xd6\x55\xaa\xd9\xee\xb0\xd1\x70\xae\x86\xf3\xf9\x63\xc5\x5d\x34\xb5\x5d\x73\xee\x7a\x62\x71\x92\x80\xb0\xbe\xa1\x02\x44\xb6\xdb\x85\x18\x15\xcc\x58\x47\xd0\x5d\xf0\x24\x46\xdf\x43\x58\x58\x6f\x02\x9c\xc5\x27\xb1\x23\xa8\xb6\xda\x3e\x5d\x54\x61\xd1\x6a\x77\x8a\xfe\x6e\xdf\x6b\x0e\x2c\x67\xc5\x21\x57\x0f\x87\xa3\x5b\x7a\xb2\x56\x6e\xbc\xf3\xf9\x9b\xd8\x41\xcf\x5b\xd7\x76\xa7\xb3\xce\x83\x2d\x6f\x8d\x2c\xbd\xfd\x2d\x58\x6e\xb8\xaa\x5e\x22\x33\x75\xfe\x8e\x75\x98\x75\xdb\x34\x4b\x26\xdd\x36\x4d\xd1\xa6\xd5\xa6\x02\x3f\x23\xdd\x6d\xdf\xdd\xed\x0c\x51\xf7\x95\x01\xd4\x9f\x1f\x46\xed\xc8\x80\xfe\xe0\x8e\x40\x35\x0f\x96\xb5\xbe\x0c\xfc\x73\x01\x6b\xdb\x99\xc2\x90\xeb\x1a\x15\x6e\x8d\x99\xcc\x6f\x65\xe6\x37\x61\x5f\xc4\xae\x46\xee\x7d\x79\xac\x53\xf8\x3e\x6c\x5a\xae\xae\x59\xee\x86\x90\x1f\xe8\x52\xc9\x8a\xc1\xa5\x8a\x49\xc6\x3e\xf4\xe7\x73\xc9\xd8\xa4\xef\x15\x27\x49\x17\x3a\xf0\x78\xee\xa9\x51\x1c\xaf\xe0\x39\xba\x55\x50\x35\x1a\x92\xb1\x37\x03\x03\x06\x88\xe6\xa1\x33\x15\xd0\x55\x85\x53\xfe\x9d\x0c\xb6\xd1\x2d\x11\x6d\x87\x02\x22\x8f\xf1\x5b\xbb\x56\xa3\xf8\x93\x0d\xac\xa3\x9a\x9a\x42\x5a\xb9\x3c\xd7\xfd\xa2\x58\xbe\x0d\x6a\x53\xc5\xe1\xff\x36\xf4\x0b\x07\x15\x3a\xd5\xea\x4b\xc7\x45\x4c\x74\x11\xe9\x4b\x50\x3c\x63\xcd\x1d\xd9\xba\x0c\x41\xe7\x32\x54\x43\x0f\x01\xe3\x8b\x83\x2f\xa3\x23\xb6\x7b\x45\xec\x31\x9a\x3d\x18\x53\x2e\xf6\x4e\xe1\x5f\xdd\x68\x20\x21\x92\x81\xbb\xca\x4e\x07\xc5\x57\xb2\xce\x01\x43\x3a\xf4\x86\x0c\x9f\x6e\xdc\xcd\xfd\xbf\x61\x4e\x14\x6f\x3a\xc7\xdc\x39\x8c\x9d\x21\x3d\x10\xdc\x78\x1c\x7f\x8b\x9d\xa1\xeb\x42\xe6\x98\x0d\xfd\x1d\x11\xac\x0d\x01\x83\xb5\x78\xad\x00\x3d\x02\x50\x1a\xb3\xb8\x39\xf6\x86\x2c\xe7\xfd\x98\x16\xd9\x9f\x21\x3b\xbf\xa3\x5c\x66\x0f\x81\x8d\xe8\xd0\xf0\x4b\xbf\x75\xd3\x64\xc3\xd6\x8d\xd7\x6f\xdd\x42\xe0\xd6\x13\x85\x0d\x09\x95\x25\x50\x8b\xfb\xad\x5b\xdc\x3b\x8b\xdc\xe2\x84\xc6\x1f\x0a\x25\x91\x20\xc6\x40\x51\x65\x1e\x48\xc8\xbc\x6d\x1a\x67\x53\x9c\xc9\x22\x37\x31\x01\x57\x43\x41\xd7\xbd\x53\x2c\xf4\x3f\xc9\xc0\x0b\x59\xe8\xbf\x53\xc1\x3d\x28\xd0\x7c\xef\xa3\x82\x7e\x97\x8f\x64\xeb\xf3\xae\x03\x21\x1e\x3b\x72\x3e\x17\x7c\x09\x7a\xaa\x29\xcd\x72\x7e\x0f\xb7\xb0\x29\x6b\x2b\x7a\x7b\xab\xd8\x89\x42\x28\x57\xdb\x0f\x64\xb0\x9d\xa7\x62\x7d\xdb\x90\x51\x38\x48\x59\xf7\xd4\x2b\x61\x40\x73\x19\x4f\x55\x35\x11\x8c\x14\x94\xfe\x91\x30\xdf\xff\x4d\xe1\x57\x01\x63\x9b\xbb\x61\x90\x61\x8c\xe1\x4e\x7b\x5b\xf8\xfb\x20\xd3\x21\xf0\x51\x04\xb0\x79\xcb\x07\xac\x0d\xfc\xdb\x67\x67\x71\xbe\xb2\x71\xc6\xfa\xb5\xaf\xb2\x19\x03\xba\x60\x28\x9a\x28\x67\x7b\x28\xc1\xa4\xeb\xd2\xb0\x75\x83\x5d\x02\xd5\x83\x86\xad\x5b\xd3\xd3\x26\x6f\xdd\x96\x47\xc8\x05\x76\xda\xad\x10\xa2\x3c\x0f\xf6\x8b\x2a\xf6\x45\xb0\xc6\xe1\xaf\xa9\x05\x30\x5c\xe3\xf0\xd7\x1c\x17\x09\xc6\x3d\x95\xfc\x0e\x81\x9b\x04\x88\x5e\x2f\xc4\xfb\x3c\x20\x7f\x3d\x81\x06\x7b\x27\xcf\x3c\xc7\x4e\xd2\x3c\xff\x1b\xc6\xb0\x5b\x30\xad\x8e\x63\x47\xb8\x30\xff\x5d\x53\x97\x44\xc9\x86\x7c\x02\xf0\x26\x0a\xec\x82\xf7\x44\xef\x04\x13\x20\xc0\xf2\x8f\x4e\x19\x4f\x7f\xb3\x09\x35\x77\x29\x72\x62\xbb\x61\xeb\x76\x2d\x2f\xfc\x3d\x7f\x9b\x0c\x30\x76\x04\x4e\x73\x01\x03\x20\x56\x0d\x00\x86\xfa\x9e\x1b\xb6\x6e\xd6\x98\xc0\x83\x1d\xbc\x7a\x68\x4e\x37\x1e\xfd\x08\xe7\x73\x07\xab\x13\xe6\x7c\xa7\x18\x07\xeb\xbe\x44\x6d\xdd\xff\x11\x1b\x9e\xf8\x01\x3d\xf3\xea\x8b\x94\x6c\xdd\xac\xa9\xd6\x0d\x95\xad\xdb\x35\x55\xbb\x5c\xb6\xaf\x79\xcd\x27\xb0\x3e\xc2\xa2\xe0\x0c\x9c\x29\xb9\x89\x37\x1f\x87\xbd\x62\xf5\xca\x3d\x7f\x90\x43\xbd\xb2\x84\xcc\xef\xb3\xc9\xe2\x3e\x9b\x25\x8b\x3a\x1b\xae\xfb\x3b\xea\xfe\x46\x65\xeb\xe3\x60\xa9\xb6\x85\xca\x89\xad\x6a\xd1\xba\x9e\x25\x8d\x2b\x36\x1e\xa0\x34\x47\xbc\xb8\xd0\x1b\xdd\x49\xf6\x71\x70\x87\x57\x26\x71\x76\x48\x50\x53\x20\xf0\x71\xe0\xba\x3d\x5c\x57\x3e\x89\xc0\xf9\xa0\x61\xdd\x2d\xe4\x18\xa8\x00\x9d\xc0\xa5\x18\xd8\x08\xdc\xf2\xfc\x0d\x66\x84\x1d\xf6\x38\x3b\x1a\xa2\xf3\x5b\xb1\x53\x16\xcb\x9e\x28\xfd\x51\x7a\x28\xd7\xbd\xfe\x72\x72\xe7\xeb\x60\x1a\x39\xbc\x75\x35\xc5\xb5\x90\x7b\xdc\x7f\x2f\x82\x1e\xe8\x84\xef\x45\xe0\xb7\x83\xae\x80\xad\xeb\x67\x8c\x22\x31\x8a\x08\x3e\xd0\xb6\x30\xbe\xfe\x1b\x15\x50\xe9\xef\xd5\x9c\xee\x1f\xc7\x0b\xef\x2a\x96\xea\xd0\xf1\xd0\x95\x68\x08\x03\x75\xc8\x4f\x83\x72\x8e\x16\xa3\x20\xab\x57\x6d\x46\xd1\x74\x1a\x8d\xfb\x2b\xe6\xb0\xac\x7c\x6e\x96\xb8\x1e\x1f\x19\x6f\x32\x39\x5a\xf8\x7e\xc1\x49\xce\x98\xd6\x17\xb0\xcd\x35\x56\xd1\xc3\xbd\x0e\x77\xbb\xdc\x6d\x7e\x59\xe6\x03\x23\x47\xf9\xed\x8e\x4a\x2b\x43\x3f\x1d\xfb\x33\x22\xa3\xf2\x6e\xdd\x43\x20\x6a\x64\x7b\x90\x43\xc4\x76\x2f\x1f\x55\x16\xa5\x8f\x1a\x17\x49\x64\x90\xbd\xbe\xbb\xca\x3e\x97\x9e\xab\x95\x4f\x1b\xb6\xa2\x98\xf4\xbf\x49\xb3\x92\x5f\x45\xd3\x48\x44\x71\x94\xdd\xe2\xb7\x25\x47\x32\xf0\x22\xe1\x48\x7a\xda\x77\xbd\x5d\xee\x48\x3a\xe9\xbb\xde\x09\x04\x7e\xf4\xd1\xac\x02\x75\x61\x5c\xe5\x00\xa1\x6b\x4a\x2c\xfd\x8c\xe2\x47\x5d\xfb\x1c\xed\x8e\x30\x8f\xe2\xfc\x90\x80\x05\xc8\x9a\x55\xd1\x68\xac\x96\x77\x0f\xa5\xd9\xc4\xad\xaa\xf9\xdc\x48\xfe\x5e\x6e\x0e\xc0\xcf\x72\x39\x3c\x9f\xcb\xe5\xfd\x8c\xa5\x76\x56\xdb\xbd\xde\xa2\x8f\x99\xd4\x9c\x21\xcd\xbc\xba\xf9\x0e\xb5\xe9\xd6\x2d\xb5\x6e\x0e\x56\x8e\xe6\xa3\xc5\x6d\x8e\x17\x0f\xf0\xf3\x33\xbd\x31\x7e\xdc\xd8\xed\x2a\xc1\x4d\x82\x6c\x1d\x24\xbf\x8e\x26\x5c\x46\xd9\x2d\x13\xdd\xfd\x7e\xfe\x99\x1a\x47\xb6\xc2\x28\xce\x74\xca\x04\x63\xec\xa8\x77\xd4\x7d\x27\x78\xb3\xd3\x6e\x3f\x11\xcd\x23\x5b\x2d\x1f\xe4\x8d\x9d\xe4\x0c\x21\x7a\x47\xdd\xcf\xf6\x88\x47\x56\x8f\x4e\x87\xc5\x27\xef\xa8\xf9\x0e\x1a\x95\x4c\xa0\x6e\x56\x38\xed\xca\xdc\x17\x01\x37\x42\xa7\x03\xad\x33\x58\xb0\xd8\xfd\x64\xc7\xa5\x08\x1f\x39\xa2\x25\xa7\xd3\x33\x7d\x93\xb9\x3d\x2e\x8c\x6f\xec\x37\xe3\x23\x5b\x39\x9e\x29\xf6\x6d\xe8\x88\xd6\x65\x48\x3f\xf7\x8b\x17\x5a\x72\x4c\xfc\x76\xe0\xa9\xf9\xdc\x91\x25\xc8\xd5\x12\x10\xb4\x36\x5d\x38\x9f\xfb\x2e\x95\xa5\xef\xbc\x82\x8d\x6d\xee\xde\x2b\x31\xff\xed\xc0\xf5\x72\xb4\x74\x0d\x2d\x9d\xa3\x85\x2f\xf0\xa2\x1f\xa5\xa2\x4b\xbf\x9d\xf8\xcd\xde\xe6\x5c\x0f\x98\x11\xa4\x6f\xfa\xe6\xba\xd3\xc5\x88\xed\x0e\x7b\xe4\x20\xf9\xf5\x65\xaa\xd3\x53\x74\xd5\x25\xdd\xbd\x61\x8f\x9c\xe3\x6b\x03\x76\xea\xc2\xc7\xae\x87\xa3\xd2\x63\x8a\xe5\xdf\x14\x32\xf7\xca\xf2\x4b\x65\x17\x23\x23\xaa\x98\xe8\x7d\xee\x1e\x51\x94\xf3\x17\xa3\x80\x61\x11\xce\xda\x95\x6b\xae\x07\xd3\x91\x07\x1e\xc7\xe7\x6f\x0a\xb0\xbb\xbb\x42\x8e\x99\x5b\x8e\x6e\x5e\xd9\x70\x80\xb5\x5d\x07\xce\xd1\xc0\x3c\xbb\x6f\xb6\x18\xed\x7a\x35\x45\xbe\x75\xad\xc0\x62\x9c\x62\xd7\x62\x76\x53\x4a\x17\xfe\xd6\x66\x17\x87\x4b\x3b\x28\x82\xab\x6c\xda\x87\xd0\x4e\x1e\x5a\x95\x2d\x91\xdc\x9c\x46\xbf\xa2\x71\xa9\x4b\x09\x36\x42\x91\x09\x13\xe7\xeb\x80\xee\x4b\x54\x84\xf2\xb4\x9d\x80\x9e\xf4\xe9\x3b\x59\x4d\x59\xe4\x23\xf3\xb4\x35\x4e\x60\x10\x08\x28\x0e\x70\xb9\x1d\x99\x19\x9a\x2c\xce\xd0\x63\x58\x16\x52\x33\xd5\xd7\x84\xf9\x63\xa6\xbe\xc4\xb5\x62\x27\x9f\xfa\x6b\x66\x97\x27\x8c\x30\xc0\x03\x3f\x6b\xea\x8c\x46\x35\xb7\xd6\xf5\x7f\xff\x54\xcd\xc9\x4d\x2f\xff\xc2\xb5\xa8\x9e\x12\x05\x76\xef\xb4\xdd\xd2\xd3\x1c\x97\x68\x1a\x32\xde\x4a\x67\xe3\x2c\x1a\x99\x79\xe3\xcb\xc0\xbb\x97\xc2\x8c\x69\x00\xb2\x0a\xf3\x0c\x5e\x1b\x40\x6b\x4a\x99\xa6\x97\x14\x0c\x97\x3c\xc7\x3b\x59\x10\x3d\xf7\x6c\x0f\xa5\xdc\xec\x19\x8a\x53\x3e\xa0\xef\x25\x77\xed\x0f\x9f\x20\x55\xcd\x4e\xb6\x18\x7f\xac\xf7\x8d\x44\x1e\xc0\xf0\x9e\x44\x7d\x0b\xc3\x6f\x25\x0e\x02\x86\x5f\xcb\xfa\x40\xbc\x8d\x61\xa2\x99\x0b\xaa\x82\xa1\x59\x04\xaa\xf1\xa4\x09\x43\x35\x9e\x32\xe1\xbc\x1a\x0c\x2f\xa9\x26\xc6\x8f\xe7\xc5\xa8\x0d\xe1\x33\x0f\xf0\x57\xb8\x66\x5e\x7e\xd2\x9c\xfd\xce\x06\xd1\xb8\xbb\x41\x47\x5a\x45\xb3\x51\xf7\x19\xcd\x06\x91\x1c\x76\x5f\xd8\xce\x5d\x97\xa3\xd2\x71\xbc\x6e\x99\x69\x8e\x04\xcf\xad\x33\xac\x5a\x07\xcb\xc7\x59\x6b\xa0\x57\x05\x68\x49\x4c\x10\xda\x9f\x34\xef\x7d\xd2\xdc\x97\x41\xb7\x4e\x5a\xeb\xd1\xb8\xd1\x82\x89\xe0\x55\xf9\xd2\x1a\x22\xf6\x49\x20\x81\x31\x7c\x28\x90\xc0\x18\x3e\x16\x48\x19\x0c\x7f\x10\xff\x95\xc0\xb0\xb3\x2d\x08\x0c\x5b\xd7\x82\xc0\x9f\x45\x45\xe0\x8f\xf7\xab\x79\x90\xc0\xd5\x95\x90\x91\xfd\xd0\xb2\xf7\xc3\xe1\xc5\x75\xd6\x27\xde\xcf\xe9\x93\x75\xb7\x76\x3a\x02\xda\x66\x91\xdd\xc5\x6c\x6f\xc3\x7c\xf7\x0c\xcf\x7a\x0e\x23\x87\xfb\xed\xc0\xbc\xd6\xe2\xc2\x3c\xe8\x04\xb5\x87\xde\xa1\x9d\x0f\x9a\xb3\xf5\x11\xcf\xd2\xe8\xe6\xa7\xe3\xb7\xd7\x5e\xfd\x6c\xfd\x5c\x0b\x9a\x74\xe5\x9f\x84\xad\x02\xee\xa4\x77\xd3\xbb\x9f\xf2\xd3\x5d\x37\x1f\xa7\x80\x66\xfe\xed\xf4\xba\x8e\xff\xef\xee\x7a\xef\xaf\x56\xd0\x74\xbb\x6e\xcf\xe9\x75\x7f\xae\xff\x5c\x37\xe9\xeb\xbd\xbf\x82\x27\xee\xff\x73\x7b\x10\xfe\xab\x17\x3c\xe9\xb9\x4e\xaf\xdb\xc5\x2a\x83\x26\xa8\xd7\x3d\xe6\x43\xc6\xfc\xb1\x8b\x40\xbd\xbf\x82\xa6\xa9\x03\x62\x50\x18\x63\x7f\x39\x2d\x08\x3d\xb6\xbe\x58\x3e\x2d\xf8\x22\x1b\xb9\xbf\xb3\x11\xcb\x9f\x80\x15\x4c\x44\xfe\x8d\x79\xbd\xc7\xba\xa7\x79\x28\x0b\xe9\xeb\x48\x36\x1b\x39\x68\xdc\x95\xab\x4c\xb4\x06\xc9\x34\x1b\xf3\x51\xf1\x15\x03\xa8\xa9\x4d\x47\x8e\xeb\xdd\x95\x77\x89\x51\xff\x3f\xd0\xdc\x4c\x9b\x6c\xc4\xec\xab\xf0\x33\x4b\x73\x74\x38\x43\xb4\xfc\xa7\x81\xb9\x01\xee\x36\x1a\x49\xfd\x0d\xc4\xab\x65\xe0\xcf\x17\xc1\xad\x2f\xf6\x58\xe2\xb4\xba\xa0\x8d\xf7\x26\xdb\x5b\x0c\x1d\xe1\x2e\x55\x80\x0a\x12\x6c\x15\xb7\x94\x57\x7e\x89\x07\xbf\x40\x2c\xd6\xcc\xd7\x36\x9e\x6e\x32\x16\xce\xe7\x2f\x9e\x32\x16\xe2\x27\x05\x8b\xfc\xa6\x76\xe9\x2a\xe4\x74\x10\x20\x87\x7b\xfa\x9c\x55\xa7\xaf\xc2\x13\x4d\xa6\x9b\xc5\xcd\xc1\xb5\xfc\x62\xc1\x88\xad\xff\x35\xb7\x87\xe4\x76\x41\x90\xbe\x96\x81\x73\x33\x82\x19\x89\xbd\x68\xd3\xe2\x79\xb8\xf6\x76\x79\xe7\x08\x45\x42\xb1\x04\x98\xef\xf4\x83\xce\x8b\x40\x7a\x3e\xd7\xdb\xd2\xd5\x0c\x1f\x6c\x16\xfe\x87\xa0\x59\x5e\x83\x01\x3a\xe1\x1b\x6c\x8a\xea\x35\x55\x38\xdd\x17\x6e\xf4\x88\xe0\x21\x30\xa8\xdf\x6b\x04\xce\xe3\xf9\x5f\xae\x85\xe7\xaf\xd1\xe2\xbd\x1b\x1b\xd7\x36\xd5\x34\x64\xbe\xa1\xaf\x36\xa8\x2b\x44\xdd\xf5\xdc\xd0\x78\xba\x6b\x1d\x18\xdb\xaf\x75\x0c\x9e\x23\xaf\xdd\x66\x67\x3e\x97\xf8\xce\x9d\x01\x46\x2c\x2b\xa3\x4e\x98\x3b\xd5\x22\xca\x87\x9a\xd3\xd7\xda\x1e\xf0\x9d\x52\xe5\xe1\xcc\xcf\x31\xa5\x7b\x9a\x8a\xc0\x33\x1e\x86\x12\xb4\x89\xd7\x81\x13\x87\x94\xf3\xc2\xa7\x58\xba\x68\x87\xee\xe4\x1b\x3f\x50\xfe\x44\xfe\x7d\xf3\x6b\xed\xd2\xf6\x16\xc3\x77\x81\xd0\xe5\x17\x11\x12\xae\x4b\x01\x0c\xf4\xd4\xfc\x2d\x3b\x48\x2a\x0a\x8d\x43\x97\xb6\xb7\x05\xbe\x1c\xc4\xc6\x61\x57\x30\xe4\xb9\xb5\x0e\xd6\xd2\x09\x58\xae\x65\x5a\x9e\xc1\xf9\x4d\x03\x1c\xcc\xdd\x11\xfb\xcd\xe3\x48\x6a\x11\xcf\x74\x97\xfc\x15\xb6\xc3\xcd\x30\x24\x94\x8f\xb3\xe8\x72\xa6\xaf\x07\x51\x86\xc9\x5c\x0b\xf5\x92\x50\x7e\x39\xe3\x5d\xf2\x57\xbb\x1d\x86\x08\x75\x39\xe3\x23\x9e\x46\x63\x80\x79\x19\x86\xa1\x7a\x46\x28\xff\x35\x4b\xf3\xaa\x10\x48\xe8\xa8\x8f\xf1\xe7\xe1\x73\x25\x09\x15\xd1\xf4\xd2\xb4\x15\xea\x67\xf2\x19\xa1\x22\xe6\x72\xd8\xbd\xd1\x10\x18\xcb\x81\x56\x3c\x1e\x25\x63\x65\x20\x84\x54\x00\x81\x05\xda\x6d\x68\xd8\x44\xaf\xa2\x24\xd6\x59\x97\xfc\xb5\xc9\x37\x84\xde\x20\x54\xa4\xc9\xf5\xb8\x4b\xfe\xe2\xcf\x37\xf8\x06\x27\x54\xcc\xd2\xf8\xf6\x3a\x49\xa0\x1e\xa5\xc5\xe6\xe6\x4b\x42\x25\x57\x3a\xcb\x2b\x7b\x1e\xbe\xd2\xbc\x4d\xa8\x1c\xf0\x34\x4b\xf5\x6c\x5a\xf4\xa1\x8d\x89\x89\x4c\x62\x8e\x7d\x57\x1b\x2f\x5e\x75\x34\xa1\x32\x49\x79\x8c\x48\xbd\x0c\x9f\xb7\x31\x3e\x0e\xe3\xe4\x5a\xa7\x79\x8d\x2f\x9e\xbd\x7a\xae\x95\xc9\x98\x46\xf1\x10\x61\xc3\x4d\xe8\xb3\x4c\xa3\xd1\x34\x01\xf4\x94\xec\x3c\x7b\x0a\x29\xb7\x7c\x6c\x51\x52\xf1\x74\x68\xf5\x72\x53\x98\xa4\x12\x6a\x53\x14\x49\xfd\x24\x56\x7a\x9c\x62\xbf\xc4\xe6\xe6\x8b\x76\x91\x9e\xf2\x5b\xe8\xfe\x2b\xf8\x57\x24\x69\x6d\x8a\xbf\x78\x06\xbd\xca\xd3\x6c\xb0\x47\x90\x36\x1c\xf0\x61\x04\xd5\x29\xf1\xf2\x45\x5e\xdd\x88\xf7\xf5\x38\x83\xc1\xde\x14\x15\x3e\x49\x1c\x5d\xe9\xa2\xda\xe7\xcf\x5f\x88\x8d\x1c\xf7\x24\xe5\x63\x33\xca\xe1\xa6\x2c\xda\x4a\x52\x39\x88\x00\xcf\x57\xaf\x9e\x6e\x48\x69\x12\x53\xad\xf2\x4a\x0b\xb0\x29\x8e\x77\x97\xfc\xa5\x5f\xbd\x7a\xf1\x92\xe7\x89\x9a\x17\xed\x6c\x86\x42\x6e\xe6\xed\x4c\x61\x50\x72\x42\x3d\xdb\x7c\xaa\x0a\xc4\x30\x3d\x27\xc1\x46\xf8\x2c\x7c\x16\xd6\xd2\xf5\x62\x7a\x36\x4b\x2f\x67\x49\x34\x35\x04\x97\x5a\x75\x4c\x7a\xc9\x56\xaf\x9e\xb5\xdb\xea\x29\xa1\x4a\xeb\xc9\x24\x1a\x9b\xc1\xec\x3c\x7b\x95\x27\x4d\x87\xb7\xe5\x70\x09\x33\x82\xd1\x28\x6f\xff\xc5\x2b\xf8\x97\xa7\xe8\x5a\x4a\xa2\xfa\x25\xbb\x74\xf4\x2b\xe4\xe6\x30\x4a\xb5\x48\x41\x99\x23\x7f\x89\x0d\xf8\x8f\xd0\x30\x06\x66\x2b\x67\x5f\x18\xf2\xb0\x4d\x68\x98\xa4\x7a\x9a\x15\x64\xd9\xd8\xd8\x14\x08\x3b\x93\x83\x69\xc4\x11\xce\xcc\x8f\x3e\x8f\xc6\x53\x91\xa4\x09\xf2\x1b\xfc\x23\xb4\x0f\xcb\x67\x59\xe1\xa6\x99\xe5\x8f\x80\x99\xb0\xa0\x7a\x09\xa3\x61\xf3\x96\xe2\xfc\xf9\x06\xa4\x41\xa7\x6e\x35\xad\x98\x69\x13\x47\x0e\xe3\xb7\x3a\x8e\x93\x6b\xe0\x27\x15\x86\xc0\x0b\xd8\xe1\x5b\x4d\x07\xc9\x58\xdf\x2a\x7d\x5d\xc8\x81\x36\xa1\x83\x24\x2b\x09\xf9\xe2\x95\x78\x46\x68\x34\x56\x11\x1f\x1b\x86\x90\xea\xb9\x7c\x2e\x4d\x5a\x1f\x10\x7f\x06\x6c\xb7\x41\x68\x74\x95\xa4\xb7\x86\x08\x58\x4d\xc1\xac\x61\x5b\xbf\xd8\x94\x84\xc6\xfc\x4a\x8f\xf1\x55\x8d\xbf\xf4\x0b\xfd\x22\xe4\x55\x92\x88\x67\xd3\x81\x29\xda\x0e\x9f\x43\xfa\xf5\xb8\xe8\xc6\x4b\x19\x22\x9f\xc6\x7a\x94\x8c\xe5\x20\x0a\x43\x64\x41\x20\x35\x48\x9c\x38\xea\x0f\x0a\x49\xc1\x95\xda\xd4\x2f\xf2\xb4\x52\x0a\xb4\x37\xdb\x9b\xed\x22\xd1\x4c\x53\x9d\x4f\x66\x4c\x2b\x69\x59\xd2\x28\xe4\x21\x57\x1b\x45\xb6\xe1\x15\xf5\x14\xfe\x95\x69\x06\xb7\x57\x6d\xad\x5f\xb5\xab\xc4\x7b\x80\x25\x1d\xc5\x0b\xd9\xc9\xd3\xca\x59\x14\x86\xbc\x0d\xb3\xc8\xa4\x56\xd3\x68\xa3\x2d\x36\x78\x99\x5e\xf2\xef\xe6\x4b\xa9\x81\x68\x8f\x4c\xba\x35\x8f\x5e\xbe\xdc\xdc\x7c\xf5\xaa\x28\x60\x4d\xa4\x7a\x46\xa6\x75\x9c\xd7\x25\xda\xf2\x99\xd2\x79\x46\xd5\xef\x30\x0c\x35\x76\x67\xa4\x73\x91\xd7\xce\xa3\x05\x6e\x4f\x37\xa4\x7a\x8a\xa4\x19\x63\x1c\xf8\x1d\x48\x5e\x49\xa1\x82\xb7\x47\x3c\x4d\xb0\x9b\xc0\x85\x50\x8d\xd9\x10\xd5\x56\xa2\x17\x2f\xa4\x82\x9e\x9a\x2c\x4b\xac\xc2\xc8\x9a\xc4\x52\x34\x09\xfe\xfc\x39\xd0\xd5\x24\x4f\x66\xe9\x24\x06\xe8\x57\x4f\x5f\xb6\x95\x28\x92\x2d\x2a\x3e\x95\xe2\xe9\xcb\x4e\x99\x61\x89\xa3\x97\xe2\xc5\xa6\xd6\x65\xce\x04\x96\xfb\x6a\xd2\x84\xfc\x55\x89\x91\x2d\x7c\x9e\x6d\xaa\x0e\x88\x46\x93\x63\xc4\x4f\x3e\x23\x5e\x76\x9e\x6f\x3e\x27\x74\x14\xa9\xb1\xc5\x8d\x9d\x57\x9d\x57\x2f\xa1\xdf\xd1\x38\x93\xa9\xe6\x23\xb3\xb4\x86\x30\x86\xa3\x68\x9a\xdd\xa6\xc9\xb4\x58\x5d\x35\x20\x9a\x48\xc9\xa7\xd1\x38\x4f\x12\xcf\x09\x1d\xf3\x2b\x7e\x91\x54\xd2\x45\x69\xae\x08\x7d\x34\xe6\x57\xb7\xc5\xfa\xd3\x26\x34\x89\x55\xcc\x25\x42\xa8\xf0\x39\x8c\x06\x4a\x7f\x24\xbd\x11\x01\x18\x57\x29\x17\x40\x73\xb1\xa9\x37\x9e\x12\x6a\x2d\x04\xfc\x39\x02\x61\x82\xe9\x52\x18\x3e\xcb\xd3\x72\xea\x2b\xfe\xb2\xad\x5e\x10\x3a\xe1\xb1\xb6\x85\x8f\xd6\x7a\x13\x46\x10\xd3\x8b\x59\xb1\x19\x8a\x57\x9b\x26\xcd\xa6\x20\x0f\xb5\x06\xba\x43\xba\x4d\x3f\x25\x5e\xb6\x41\x5c\x4f\xf8\x84\xdf\xf2\xeb\x41\x34\x31\x24\x08\xd5\x73\x42\x27\x9a\xcb\xc1\x64\x16\x86\x86\x00\x5c\xbc\x82\xb4\x74\x86\x92\x68\xf3\xf9\xd3\x90\xd0\x72\x92\xc9\xb6\x14\x84\x4e\xe2\x19\x90\x5a\x29\xde\x56\x8a\xd0\x49\x72\xad\x4a\x51\x2e\xda\x1a\xd9\xb5\x64\x9f\xcd\x9c\x86\x45\xb7\x0d\xab\xa6\xc9\xf4\xb6\x50\x53\x60\x49\x83\x45\x2d\x4d\x6e\x79\x31\x7d\x9e\x75\x5e\xbc\x82\x21\x9b\x72\xa5\x62\x5d\x40\x6e\x8a\x67\xcf\x3b\x4f\x21\xb5\x98\xe0\x7c\xb3\xfd\x72\x03\x12\xc6\xaa\xac\x2f\x7c\xc6\x9f\xbd\x68\x13\x6a\x4f\x78\xbd\x29\x9e\xbf\xc4\xa4\xe9\x40\xc7\x46\x77\x09\x9f\x03\xad\xa6\x91\x1e\x8f\x61\x5a\xf1\xf6\xf3\x8d\x0d\x18\xfc\x69\x14\x5f\xa1\x10\x95\x6d\xf8\x47\x68\x5d\x42\x68\x41\xa8\xcd\xec\x2f\xf8\x73\x94\x93\x35\x79\xd1\xde\x6c\x83\xd8\xaa\x89\x8a\x22\x6d\x5c\x88\x02\x0e\x8c\x7a\x6f\x76\x84\x2f\x43\x42\x6d\x51\xf2\xec\xc5\xe6\x06\xac\x11\x19\x4a\x56\xb5\x21\x9e\x81\xb0\xcf\x34\x0a\xdf\x76\x2e\x7c\xb3\x41\x34\xcd\x90\xe0\x6a\x53\x84\x6a\x93\xd0\x2c\x19\xf1\x2c\x31\x6b\xcc\xd3\x67\x2f\x09\xad\xcd\xb5\xb6\x6e\xab\x36\xa1\xe5\x22\xaf\xf5\xe6\x06\x90\xe3\x7a\xa0\x79\x86\xf3\x48\x69\xf1\x14\xe2\x30\x35\x76\xb4\x09\x4c\x47\xc9\xb0\x50\x60\x61\x19\xa9\x09\x36\x18\x57\x93\x50\xf2\x29\x47\x59\x66\x7b\xe8\xd6\x2d\x0b\x9c\x95\xf7\x0b\x4b\x0b\x8c\xf9\xae\x34\x63\xd7\xba\xc7\xbb\xd7\xba\x89\x67\x17\x6f\x46\x68\x8a\xab\x5e\x15\x13\xad\x44\xb1\x3d\xd8\x14\x53\x29\x1c\x41\x53\xc9\x5d\x2a\x3c\xc9\x8e\x74\xf1\x46\xb0\xb4\xbf\xe1\x0a\xe0\x6f\x2b\xf0\xd9\xc0\x35\x0f\xa1\xee\x8e\x70\xf7\xb1\x3b\xf2\xb9\xb1\x50\x04\xf5\x26\xa4\x81\xbf\x36\xd5\x17\xe7\x45\xbc\x49\x56\xa2\x29\x7e\x87\x90\xaf\x5c\xf1\x38\x52\x2b\x32\x89\x93\x74\x65\x8a\xdd\x21\xae\x67\x79\x43\x59\xbb\xe7\xd5\xd5\xa2\x27\x4b\xfa\xe9\xce\xe7\x06\x79\xff\x43\x30\x9f\x03\x62\x36\x56\xb8\x3d\x3c\x86\xed\xe1\x5f\x4e\xcb\x35\xff\x5b\xfb\xc3\xbd\xc2\xb4\xb0\x5a\x34\xe0\x96\xa7\x5b\x07\xba\xc9\x9b\xe4\xef\x45\x8c\x07\xfa\xc6\x60\x4d\x5c\xef\x59\x69\xb0\x29\x2e\x71\x1f\x6b\x4e\x35\xe7\xf6\x6e\x09\x31\xb1\x5d\x61\x46\xc6\xfc\xb3\x67\x59\x65\xfd\x61\xb1\xc9\xed\xd0\x0d\x97\x76\x5e\xb8\xb4\x4c\x79\x7a\x2f\xe5\x79\x9e\x62\x39\x04\xed\x5b\x7b\xc9\x01\x37\xa7\xad\x03\xbc\x81\x28\xe1\xd7\x6c\xc6\xf1\x7b\xa3\xf3\x79\x7b\x9b\xcf\xe7\x1b\xcf\x9f\x6f\xf1\xf9\x3c\xe4\xe8\xac\xd5\xde\x16\x26\x49\x60\x92\xc4\x24\x69\x92\xaa\xf3\xbe\xbf\x89\xf3\x77\x93\x37\x4f\x74\x53\xc0\x1f\xd9\xfc\x9b\xb8\x8b\xe4\x39\x79\xb7\x6b\xc8\xf3\xb7\xeb\x71\xf6\x61\xe4\x70\x7f\x08\xdd\x7a\xe1\x02\x4a\x1f\x46\x8e\xa8\xe2\x12\xe2\xb2\x8a\x17\xc7\x0a\x40\x78\xd1\xb4\x4e\x1d\xde\xda\x67\x76\xd0\x55\xd8\xf5\xc2\xe6\x94\xe2\x91\xac\xfd\x61\xcf\xfa\xf9\x58\x3b\x58\xdf\x78\xfe\x1c\x8f\xc8\x3a\x18\x44\x67\xa1\x0d\x13\xb4\xbd\xf1\x05\x7e\x3a\x90\xea\x7c\x8f\x9f\x47\xcd\x97\xcf\xdb\x74\xc8\x5a\xcf\x9f\x38\xaa\xa9\x5d\x4f\xa1\x73\x8d\xa3\x18\x13\xbd\x90\xbd\x68\x3f\x71\xf0\xbb\xb5\x8e\x5a\xd3\xe6\x11\xb9\x3c\x95\xaf\x89\x3c\xb5\xd9\xd9\x68\x43\x0e\xba\x1f\x60\x9e\x58\x93\x45\xde\xc6\x33\x74\xab\x68\x6f\x0d\x1b\x8d\xd6\xf3\x6d\x36\xec\x61\xfa\xba\xb3\xf1\x64\xe8\x76\x8b\xf0\x1a\xc4\x4a\x5e\xc1\x73\xd2\xb0\xf9\xf4\x45\xdb\xfd\xd7\xd3\x17\x6d\xda\xa7\x43\xfb\x73\xb4\x25\x27\xb4\xb7\x65\x4f\x36\x59\xa7\xdb\xd9\x42\x6b\xd8\x1a\xab\x9e\x0b\xe8\x6c\xbf\x78\x22\x7b\xbc\xf9\xc2\x7c\x18\xf8\x89\xec\x76\xb6\x37\x9e\xc8\x9e\xe8\x6e\x6c\x3f\xc5\x1c\x93\xee\x6c\xac\x3f\x5d\x93\xee\x93\x17\x5d\xfb\x0c\xfb\xa4\x4e\xe5\x8e\x39\x84\xdc\x08\x8c\x4d\xc5\x3c\x2a\x88\x94\x6e\x07\xeb\x4f\x5f\xb4\xf3\x6f\x94\x0a\x57\x31\xcd\x42\xb6\xf1\xfc\xf9\x13\x69\x8e\x95\x8d\x5b\x92\x21\x73\xeb\x39\xe0\xfb\xc4\xe9\x34\x85\xdb\x95\x4d\xb1\x26\x9e\x48\x1a\xb2\x8d\x27\x72\xad\x4f\x15\x96\xfa\x38\x72\x42\xda\xa7\xbc\xd9\x59\x7f\x0a\x83\x65\xa7\xc1\x68\xd9\xf1\x35\x80\xa9\x91\x4c\xb9\xc6\x9d\x56\xe7\xbf\xa1\x1b\xa0\x78\x78\x33\x62\xeb\xff\xfe\xcb\xe9\x75\xfd\xf6\xda\x2b\xbe\x16\x06\xbf\x9f\xde\xb9\xbf\x3b\x74\xe3\xee\xf1\x7a\x44\x4f\x0b\xe3\x67\xda\x17\x6e\xef\xa7\xe3\xb4\xe7\x7e\x67\xed\x55\xf0\x53\xfd\x6e\xd3\x8d\x3b\x97\xfe\x9c\xf6\xfe\x49\xda\x4f\xf7\xf1\x7a\x54\x49\x9e\xa3\x3a\x09\x3f\x89\xc0\x39\xd5\xbc\x78\xa5\x11\x27\xb1\xf0\x3b\x41\x21\xe0\x31\xba\x11\xb8\xd4\x4c\x6b\xff\xa9\xb9\x39\x61\xde\xc3\xd8\x78\xfe\x7c\xdb\x5c\x47\x65\x32\x8f\x49\xe3\x48\x94\xc7\x8a\x17\x6c\x7c\xf4\x8e\x2d\x9e\x0d\xf1\x6d\xd7\xca\x0f\xa3\xc5\x07\xaf\x3e\x04\xbd\x6f\xba\xc9\xed\xc7\x3a\x3f\x59\x87\x74\x3b\x17\x8e\xa4\x6d\xda\xa9\xd3\x58\x3e\x81\x41\x6f\xfe\x7f\x69\x7b\xd7\xb6\xb6\x71\xe6\x71\xf8\x3d\x9f\x22\xf8\xee\xa6\x76\x23\x8c\x03\xdd\x6e\xd7\x46\xcd\xc5\x21\x2d\x94\x33\x84\xd2\x36\xf8\xde\x4b\xb6\x65\xc7\x24\xd8\xc1\x71\x80\x40\xf2\xdd\x9f\x4b\x23\xc9\x96\x93\xd0\xdd\xbd\xff\xbf\xe7\x05\x41\x96\x46\xa3\xd1\xe8\x34\x92\x46\x33\x7a\x93\x75\x1a\xaf\x6b\xb9\x82\xd7\x2c\xbe\x59\xc6\x37\xd5\xf8\x8d\x32\x7e\xc3\x55\x27\xb5\xe3\xbb\x8a\xd6\xe8\xd1\x9d\xde\xb5\x90\x85\xd8\xd8\xaf\x5c\xc5\x9d\x2c\xc2\xb1\x51\x2f\xfe\xe6\xa1\x4f\x17\xce\x04\x4b\x6f\xee\xd2\x48\x1d\x3c\xaf\x7f\x81\x79\xcc\xf6\xba\x81\x8b\xf6\x7a\x76\x87\x32\xc6\x07\x2e\x22\x46\xe3\xaa\x0c\xcf\x0c\xc7\xef\xfa\xd4\xd5\x97\x1a\x2e\xf0\xcc\xbd\xde\x1a\x31\xf7\x7a\x8a\xfb\xd7\xae\xe5\x76\x3f\x2b\xd5\xec\xd0\xaa\x87\xb1\x9e\x49\xbc\x91\x0e\xec\xd1\x37\xfe\xfc\x93\x73\xf4\xf7\x8f\x7f\x70\x16\x36\x9b\xef\x81\x67\xc6\x7a\xb3\xbd\x69\xac\x95\x60\x9e\x04\xf3\x24\x98\x57\x80\xa9\x53\xe4\xd5\xd2\xe2\x58\x21\x6b\xd0\x60\x0d\x19\xd1\x64\x11\x4d\x25\x62\x83\x45\xb0\xf9\x56\x31\x66\x2c\x98\x79\x28\x5f\x22\x6c\x79\x2d\x62\x7b\x42\xa3\x9b\x26\x01\x66\x31\x9e\x4d\x66\x07\x44\x3f\xbb\x9b\x73\x4b\xad\x5e\x49\xde\x71\x35\xf7\x89\x78\x2b\x43\x13\xf0\xf1\x0b\x59\xcc\x88\xe6\xdc\x98\xe5\x6b\x96\x29\x68\x12\xac\x89\xec\x0a\x71\xe7\x25\x71\xe5\x43\xd5\x89\x8b\x3c\x78\xa5\xca\x88\x93\xcf\x95\x68\x12\x54\xfa\xc8\xc5\xdd\x1c\x8b\xf8\x93\x28\x96\xb7\x3b\x71\x8d\xad\xe2\x49\x13\x64\xe4\xc4\x96\xaa\xc0\x77\x73\x8f\x55\x27\x2e\x0c\x45\x80\xfe\x84\x3d\x85\xc2\x8e\x00\x25\xe0\x23\x6d\x90\x46\xb1\x4f\x06\x09\xb9\xa3\x15\x2d\xf4\x6f\xaa\x41\x12\x9d\xe0\xd7\x4c\x92\x88\x77\xe9\x2a\x1e\xb0\x4b\x62\xb4\x2a\x71\xf6\x20\x52\x3d\x3e\xa9\x03\x9f\x60\x7c\x3e\x9d\x12\x8c\x4f\xe1\xf7\xa8\xd7\x3a\xb7\x41\xf8\x34\x53\xc5\x4c\xcf\x37\x29\x35\x11\xe5\x32\xf0\xdc\x21\x78\x5f\x5c\x38\xf3\x4e\x09\xfd\x16\xfa\x2c\xef\xaf\xc5\x74\xcc\xa5\x15\x52\x31\x91\x75\xcd\xeb\x48\x30\xb8\x5a\x75\xb8\x0b\x66\xd2\x3d\x08\xdc\x7a\xfd\xd6\xd3\x09\x52\x8c\x7c\x29\x33\xd2\xf7\x39\xa5\x79\xf3\x56\xf7\xba\xbb\x81\x8b\x3c\xf3\xd2\x67\xad\x7c\xfb\xa8\xfb\xe8\x65\x94\x4f\x06\xd4\xf6\xba\x4f\xee\x0c\xe6\x4d\xce\x29\xaf\xfb\xec\x15\xaa\xfb\xfd\x58\xe7\xdf\x2d\xf8\x67\x77\xe1\x9f\xeb\xfc\xd4\x83\x8a\xaf\x0b\xee\xb3\xca\x33\x0c\x6e\xc8\x0a\x71\x5b\x97\xac\x4b\xc1\x8a\xe6\xe1\x54\x22\xaa\xd7\x3d\xf3\x73\x42\x5a\xdc\x64\x06\x44\xd9\x92\x5e\x24\x72\x83\x7b\x0b\x41\x8d\x19\x07\xf5\x7a\xe7\x8e\xc5\x9a\x71\x60\x2c\x73\x9e\x79\x2d\xfb\x0b\x26\xd3\xe9\xcb\x8c\x55\x65\x03\x57\x9c\x63\x16\x9c\x28\xe2\x9a\xae\xea\x00\xd8\x37\xe2\x50\xef\xc7\xba\xdf\x0d\x5c\x56\x87\xc0\xc5\xd1\x2d\xff\x2a\x34\xbd\x0a\x1b\x39\x81\x8b\xb9\x5b\x1c\xd1\xb3\x18\x14\xc4\x32\x3a\xba\xa0\x2a\xb0\x24\x9f\x3f\x9f\xcf\x57\xf3\xbd\xcc\xe6\x72\xc9\xa6\x0e\xc4\xd5\x98\x0a\xcf\x42\x85\xe2\xc6\x46\xc5\x0b\xac\xc1\x8d\xe9\x34\x51\x50\x75\x0e\xea\x6f\x05\xe0\xef\x85\x00\x91\x8a\x93\x4f\xdf\x5d\xda\x81\xee\xe6\xac\xc6\x70\xad\xf2\xf3\x16\x57\xe4\x3c\x6f\x7d\xbe\xd3\x8f\xee\x74\xe8\xd9\x68\xff\x4e\x07\x15\x11\xc3\x26\xb6\xaa\xdd\xfe\xa3\xbc\x37\xe7\xb5\xf1\x4a\x5d\x71\xde\x1c\x62\x8a\xf3\x50\xa9\x7f\xc9\x8d\x69\x9f\xdd\xe9\xca\xcc\xe4\xb3\xd9\x05\xa9\xb3\x92\x0f\x93\x8b\x61\x2b\xd2\xf0\x0f\x3a\xe7\x51\x5d\xf4\x1f\x36\xcd\x16\x2c\xaf\xd7\xfd\x2d\x86\xb2\xe5\xdb\xa4\xc5\x02\xfc\x4a\x5e\x1a\xaf\x80\x67\x23\x12\x98\x55\xf5\x13\x14\xc7\x50\xb4\x20\x54\xb9\xc1\xe7\x60\x41\xd1\x0f\x24\xe5\x01\x5a\xb0\xb6\xf9\x53\xce\x0d\x16\x97\x21\x2a\xb7\x7f\xaa\x33\x22\xcb\xe5\x6f\x08\x91\x8f\x9b\xaa\x9f\x9e\x2f\x03\xdd\x43\x73\x5e\x8d\x15\x0b\xcf\x95\x8b\xc7\x3e\xf7\x0c\x2e\x24\x21\xbf\xbc\xc5\xf4\xf1\x9a\xee\x37\x9a\xd2\x3b\xbe\x5f\x3e\x35\xb0\xa4\x55\x3f\x95\xb8\xd3\x58\x6e\xa5\xc1\x41\xd0\x9a\x10\x68\x4b\xa3\x9b\x7c\x05\xf4\xd6\x02\x98\xfa\x79\xd8\x37\x5a\x81\xad\x0e\x4e\x52\x18\xf7\x81\x35\x69\x12\x48\x6f\x00\x57\x7d\x7c\xc5\x7a\x0e\xff\xda\x9e\xb0\xaf\xb2\x19\xb6\xa9\x31\xbb\xc6\x24\xe1\xb6\x37\x0e\x5e\xb3\xbd\x61\x4e\x82\x99\x73\x6d\x7e\x0b\x5e\x4b\xbf\xea\xb3\xf4\xde\xe8\xb5\xf4\xed\xc9\x2f\xfd\x0f\x11\xf1\xf4\x78\x12\x20\x81\x0e\x89\x6c\xdc\xb5\xd0\x60\xff\x95\x47\x82\x4a\xc6\x6f\x7c\x11\x37\xaf\xfa\x46\x11\xde\x9e\x18\xaa\xc0\xe0\x49\xe5\x07\x98\xbf\x00\x62\x77\x17\x9f\x3b\x72\x86\x89\x7d\xf9\xee\xf3\x94\xea\xf0\x29\xd8\x76\x46\x71\x53\x42\x99\xbb\x54\x00\xed\xf6\x74\xf6\x25\x60\x32\xaa\x60\x7a\xe3\x49\x4c\xbd\x40\x87\x4f\x01\x75\xe2\x29\x98\xc6\xd2\x57\xd8\x5d\x5f\x67\x5f\x02\xe6\x3e\x56\x60\xbe\x47\xf5\xba\x9f\x08\x01\xc7\xfc\x1e\x09\x98\x64\x80\x77\x7b\x05\x90\x7f\x2e\x1f\xcb\x25\x03\xf8\x14\x50\xdf\xf6\xa5\xbd\x18\xf3\x4b\xdc\x62\x3f\x7c\x68\x41\xe2\x75\x99\xb8\xcf\x12\xf7\xd5\xc4\xfd\x88\x5b\xa5\x27\x66\xbb\x27\x71\xef\x47\xb0\x40\x9a\xed\x9e\x78\xc4\xb7\x1f\x99\xb7\x11\xeb\x50\xe5\x57\x99\x72\x11\xaa\x29\x17\xa1\x7c\x87\xf8\x20\xec\xdd\x93\xee\x03\x28\x10\xcb\x48\xf8\x16\x30\xde\x9f\x00\x33\xbb\xc6\x1e\x74\xcd\x95\x6b\xf3\xf6\x76\xb1\x0b\xbc\x84\xf1\x60\x60\x43\x0e\xdf\xd3\x0d\xb4\x4b\x6d\xd1\x5c\x68\x94\x67\x69\x5f\x7c\x66\x14\x8d\x89\x2d\xd8\x8f\xbe\x47\xb6\xe0\x32\xf2\xcf\x6d\xc1\x34\xf4\x25\xb6\x05\xc7\xd0\xbe\x08\x5e\xef\xa3\x76\xcf\xee\xf5\x65\x1d\x0c\x34\x24\x79\x4e\xb3\xa4\x88\x7b\x08\x8c\xd9\xcc\x59\xd9\x9d\xeb\xd8\x8a\x19\xa7\xfd\x88\xaf\x2b\x0e\x08\x59\x98\x4b\xf5\x4d\x9b\x98\xb7\x11\x82\xf0\x86\x4d\xcc\x8b\x10\xa5\x5c\xcd\x94\xa5\xfc\x78\x90\x5f\x2c\xed\xe7\x03\x7a\x62\xb1\x4f\x4d\x04\xa9\x93\x26\x7a\x62\xf1\xfb\x1e\x82\xf4\x23\x0f\x8d\x47\xf4\x14\x1c\xd1\x83\xd9\xd1\x38\x89\x76\xd2\xa7\xab\x24\xce\x47\x36\x31\x1f\x72\x34\xea\x91\x6c\xd8\xc9\x48\x32\x8a\x19\x7d\xac\xbc\xf6\x4c\xaa\x7a\x8b\x6a\x08\x22\x3d\x78\x94\x21\x05\x16\xf3\x80\xf1\x54\xec\x43\xcc\x6f\x81\x6e\x20\x2f\x92\x9f\xbd\x11\xf8\xd0\x20\x78\xbe\x0d\xd8\xa7\x50\x9a\x7d\xad\x31\xf8\xe7\x35\xd8\x35\x92\xad\xc2\xe3\x2a\x19\xef\x63\x11\xbb\x47\x46\x3d\x50\xad\x2b\x5a\x2b\x7b\x2a\x5a\x2b\x9b\x14\xad\x15\x65\x24\x88\x69\x92\xdb\xa4\x68\x29\x6f\xf6\xab\xf7\x8b\x5f\x2f\x4f\x4f\xea\x75\xf6\xdb\x8d\x02\xb7\x25\x03\x3a\x31\xec\x20\xe1\x6e\xcd\x7e\x31\x69\x79\x62\xee\xb9\xbd\xd5\xa5\x8b\xb8\xea\x3c\x55\xf6\x03\xe1\xb8\x8d\xb0\x79\x45\xce\x4d\xbb\xbb\xb0\x13\xe8\x05\x45\x4c\x46\x8d\xd2\x53\xda\x7e\x24\x37\xe8\x51\xd9\x03\x1d\x8f\x0d\xb8\x6f\x95\x01\xe7\x78\x6c\xa8\x7d\xab\x0c\x35\x18\xb6\xd8\x9b\x89\xe6\x85\x66\x15\x61\x73\xb0\xaf\x1b\x88\xb0\x11\xe7\x19\xcb\x0c\x46\xfd\xac\x58\x20\x14\x02\x12\x48\xe4\xe7\xb3\x6b\xf3\x94\x2e\x3a\x15\xdc\xdd\xc5\x20\xc8\x83\xa9\xba\x57\x97\x90\xdd\x5d\x96\xbe\xdb\x5b\xcc\x7f\x46\xd9\x86\x9e\xc0\x86\x1e\x96\x91\x60\xce\x10\x9f\x9c\x5f\xa1\x14\xa7\x90\x1b\xe4\xd4\xe9\x41\xae\x43\xff\x55\x17\x78\x19\x05\x27\x85\xfd\xc5\xa2\x4f\x3c\xac\xd6\x9d\x56\x76\x34\x09\x38\x79\x32\x4f\x3c\xdb\x52\xa4\x00\x5f\x3e\x76\x66\xf3\xf4\xf6\xad\xee\x71\xba\xe1\x41\xfb\x65\x8f\x04\xe9\xe3\x6b\x64\x78\x7f\x2a\x45\x55\x36\x4f\xd6\x16\x31\xcf\x68\xbd\xae\xaf\x02\xf7\x59\xdf\x90\xf2\x28\x29\xe6\x10\x16\x7e\x50\xf7\x7a\xc9\x3c\x8a\x13\x0f\xcc\x81\x99\xf7\x71\xbd\x2e\x30\x65\xaa\x42\xfa\xb0\x62\x35\x31\xe1\xe6\xb8\xb7\x30\x2b\x1b\x0e\xa3\xee\x13\x2c\x3a\xf6\xcb\x2e\xb5\x2d\x18\xcb\xf6\x55\x8f\x4d\x99\x96\x1c\xc4\x57\x3d\xf5\x15\x74\x96\x2c\xf8\x80\x62\xb9\x05\xec\x39\xc7\x40\xd8\xc4\x5c\xca\x89\x4d\xd5\x94\xf9\x48\x31\x4c\xb5\x1c\x09\x61\x93\x37\x4c\xdb\x42\x12\x6c\x05\x76\x93\x23\x2e\xc5\xcd\xd6\x33\xb5\xcf\x67\xea\x49\xc3\x9b\xca\xe6\x4c\xbc\x1a\xc3\x9e\xe1\xe3\x55\x6b\x5e\xfc\xe7\xfc\x15\xa9\x4d\xae\x1a\x0f\x82\x1a\x6b\x09\x8c\x3d\x73\x77\x97\xed\xa0\xcf\x28\x0b\xb3\x76\x62\x7c\x65\xe1\x0c\xc2\x27\x1e\x0b\x9f\xc0\x2e\xfb\x3e\x66\x61\xd6\x00\x84\xad\xc5\xd8\x33\x93\x01\x0b\x7f\xdb\x67\xe1\x6f\xfb\x2c\x7c\x0d\xe1\xeb\x7d\xe3\x85\x95\xd0\xee\x09\xe1\xcf\x63\x41\x1f\xfb\x18\xe3\xa0\xb5\x6a\xd9\x9c\x26\x5f\x12\x17\xb4\x56\x9b\xb6\xcf\xc6\x3f\x0e\xcc\x5b\x26\x15\xb0\x71\x8f\x03\xf3\x22\x64\xe1\xa7\x26\x0b\x3f\x35\x59\x78\x02\xe1\x09\x84\xf7\x3d\x16\xde\xf7\x58\xf8\x08\xc2\x47\x10\x7e\xc8\x59\x39\xe6\x43\x3e\xf3\xc5\x2b\x9e\x87\x00\x34\xf9\x1f\x02\xf4\xb7\x44\x6c\x4f\x58\xde\xed\x09\x43\x74\xd5\x67\xe1\x2b\x78\xa0\x30\x09\xa0\xe0\x40\xd1\xde\x87\xca\xe5\x09\x1a\x27\x58\xfb\x4a\x92\xda\x67\xea\xd5\x8e\x49\x56\xdb\x1e\x66\xb5\x63\x32\xa9\x7d\x1d\x27\xb5\xaf\xe3\x41\x6d\x7b\x1c\xd5\x2e\xe9\xb0\x76\xea\xe7\xb5\x93\xf4\xa1\xb6\x47\x7d\xcd\x1c\x0d\x07\x71\xae\x6b\x35\xcd\x40\x24\x24\xb8\xab\x5d\x8e\x93\x80\x4c\x34\xa4\x1d\xa7\x22\xd0\x19\xd3\x11\x84\xc2\x08\x79\x11\xd2\x3e\x67\x31\x7c\x5e\x85\xae\xb3\x92\x27\xf8\xa5\x7d\xb1\x7d\x69\x77\xb5\x9d\x5d\x0d\x69\xdb\x7b\x9a\x8b\xda\x17\xdb\x27\xdb\xc7\x6d\x88\xa4\x61\x9a\xd1\xda\x6e\x2f\x8b\x47\x39\x4b\x4f\x92\xb4\xb6\x97\xde\xc5\x49\xac\xb9\xe8\x64\xfb\xe2\xe2\xf4\xfa\xf8\xf4\xa4\xb3\xcf\x80\xbf\x6a\x68\x3b\x44\x5f\x42\x94\xc2\x2f\xfb\x66\x7f\x69\x88\xce\x43\x74\x12\xa2\xa3\x10\x69\x0c\xff\x65\x67\xfb\x64\x6f\xfb\xe8\xf4\xa4\xfd\x3f\x22\x28\x33\x90\x64\x4c\xb2\x89\x86\x76\x42\xa4\x1d\x93\xcc\xef\x31\x1a\x87\x59\x3c\x60\x1c\x80\xea\x7f\x1d\x27\x14\xfe\x0d\xd8\xd7\xf6\x38\x1a\xb3\x8a\x7c\x0b\x91\x76\xea\xe7\xa9\x47\x33\x0d\x1d\x87\x68\x12\xaa\x64\xfd\xff\x84\x7f\xff\xf4\xa2\x23\x50\xff\x3f\xb5\x74\x49\xe8\xff\x19\xca\x95\xeb\x76\xfb\x70\x6f\xfb\x07\xab\xf4\xbf\xea\x42\x0a\x31\xff\x3b\x0a\x56\x8b\x22\x37\xcb\x5c\x3b\x4e\x93\x5a\x67\x4c\x6b\xd7\x34\xa8\x75\x7a\xe3\xda\xe7\x2c\xae\x5d\x92\xfc\x57\x6c\xf8\xf7\x08\x78\xef\x2b\xc9\x3e\x87\x5e\x77\x1d\x22\x1a\xb1\xdf\x6d\xd6\xed\x16\x7b\xeb\xdf\xc2\x33\x62\xce\xaf\xb6\x2f\x3a\xed\x0b\xc6\x8b\xf3\xa6\x86\xb4\xf3\x0d\xf6\xb3\xc9\x7e\xde\x6b\x2e\x52\x92\x9b\xa3\xbc\x76\x3f\x26\x59\xce\x7a\x8a\xb6\x91\x04\xca\xd7\x66\xa6\x7e\xbd\xcf\x7b\xc5\x97\x8b\xb6\x8f\xcf\x8e\x59\xfe\xed\x63\x0d\x69\x67\xc7\x9a\x8b\xf6\xb6\x3b\xed\xcf\xa7\x17\xc7\xdb\x1d\x16\xdf\x6e\xb7\xdb\xa8\x76\x7c\x7c\x7c\x5c\x0b\x50\x0d\xda\xa2\x1a\x16\xc1\x15\xed\x78\x3d\x58\x9f\x4c\x34\x17\x75\x0e\x8e\x15\x04\x3d\xfb\xee\xce\x1e\x8d\x6a\xa4\xf6\xfc\xfc\xfc\xac\x21\x35\x42\xfd\xd2\xd0\x59\xc4\x0b\xaf\xe6\x7f\x69\xce\x6a\x6f\x49\xfe\xb6\xf6\x62\xcd\x34\xb4\xe4\x13\xcd\x07\x5d\xf4\xf9\xe0\xe2\xb2\xb3\xb7\xfd\xe3\xf4\x33\xe3\xb2\xfd\x01\xb1\x7f\xed\x93\xbd\x8b\xed\x93\x2f\x6d\xbb\xfb\x3b\xfa\x20\x60\x58\xfc\xee\x55\xe7\xf4\xf3\xe7\xbd\xed\x1f\xf6\xef\x8a\xd8\xf0\x20\x16\x5c\xe1\x50\xc6\x13\xce\x64\x9a\xb6\x14\x03\x56\x31\xf9\xed\xfd\x74\x6a\x61\x4c\x7e\x6b\x5a\x56\xbd\xce\x63\x2c\xab\xb5\xf1\xd1\xde\xf8\xd3\x01\xf0\xdf\xb9\xbf\x96\x8f\xfc\x5f\xd3\xe2\xff\x37\x25\x92\x4d\x69\xaa\xab\xb6\xa9\x98\xa6\xf6\x42\x32\xe7\xbc\x8c\xad\xd4\x7b\x24\xa7\xfa\x43\xac\xab\xb7\xce\x5f\x99\xb4\x0b\xaa\xbc\x2c\xa0\x98\x58\x2f\x0e\x29\xee\x55\x1b\x94\x1e\xf6\x39\xea\xe9\xd4\x42\xfe\x74\xda\x34\xd0\x93\xd8\xf1\xc2\x97\x61\x27\x4b\xc0\x39\x72\x44\xba\xfb\x01\xff\xdf\xf6\x5c\xdd\x28\xb3\xca\x88\xc2\x24\x25\x7f\x02\x5c\xd2\x2b\x0c\xd1\x80\x47\xec\xfd\x74\x9c\x8d\x74\xab\x12\x77\x1c\x27\xe3\x9c\xce\xc7\x5e\x52\x3f\x4d\x82\x45\xd8\xc1\x20\x1e\x15\x49\xaa\x20\x22\xea\xc6\x6a\xad\x50\x20\x7c\x94\xf3\x3b\xb4\xa6\x65\x7d\x22\xf5\xba\xd7\x7d\x0c\x5c\xdd\xe3\x15\x5b\x6b\xfe\x69\x59\xca\x31\xd4\x35\x7e\x14\xa7\x34\xe7\x94\xe0\x3c\x31\xab\x9d\xc9\xb9\x36\x2f\x94\xf8\x4a\x07\x5a\xd8\xc4\xf0\x8d\x09\xa3\xe5\x51\xda\x7c\xf3\xd8\x9e\x01\x30\xb3\xcf\x73\x4a\x1c\xc2\x11\xb2\xcf\x8b\xd2\xe1\x1d\x81\xf3\x98\x88\xe6\x9f\xc7\x83\xc1\x0f\x4a\x96\x59\x6f\x12\x18\x45\xeb\x73\xf0\x5f\x80\x56\xe0\x8e\xd3\xe4\xf5\x9b\x96\xdc\xe3\x8d\x2d\x60\x19\x23\x7f\x01\x0a\xcd\x3f\x73\x26\xbf\x70\x06\x9e\x7b\x5d\xea\x73\x67\xe0\x02\xe3\xe4\x17\x08\x13\x85\xce\xab\xce\xee\x3f\xe0\xc0\x31\x27\x61\x45\x66\xf9\xbb\xda\xb5\xab\x25\xfc\x4d\x05\x4f\x82\x0a\x34\xf4\xe1\x5f\x80\xc7\xb4\x02\x2e\xba\xf7\x2f\x32\xf4\x94\x0c\x9d\xf8\x8e\x3e\xa7\x09\xe5\xc6\x9d\x7f\x91\xe9\x5e\x66\xaa\x80\xc9\xfd\x96\x3a\x08\x5f\x1b\xc1\x22\xf3\x22\x7b\x4b\x24\x30\x50\x88\x84\x9c\xe3\xaa\x02\x36\x56\xc1\xaa\xdc\x54\xa0\x3e\xab\x50\xac\xa2\x4b\xa1\x4e\x7d\x05\x6a\x69\xf3\x97\xc0\x73\x20\x90\x6f\x45\x66\x7c\x9d\xdc\x9f\x41\xb5\x88\xd7\x28\x56\x92\x05\xfc\xbc\xb3\x7f\xb6\xdd\x31\x27\x94\x64\xa3\xe9\x94\x98\x77\xac\xc4\x51\xc5\x93\x3c\xb0\xbc\x21\x93\x1a\xcd\x8d\x77\x02\x5e\x58\x29\xec\x7e\x66\x6d\xd3\x00\xeb\x63\xde\x7a\x73\xc3\x40\x1e\xf6\x7e\x6b\x6e\x38\xd6\x27\x38\x25\x6a\xe0\xe6\x86\x51\x6a\xb1\xc4\x89\xfe\x90\xc0\x95\x12\x37\x9d\xc5\x5b\x92\xfb\xba\x67\xec\x6d\x8a\xf0\x23\x68\x84\xf1\xf0\x18\x1e\x6a\x96\x30\x81\x31\x23\x66\x40\x26\xa3\xc2\xfb\x3b\x54\x50\x2f\x42\x25\x5d\xa8\xac\x83\x52\x1e\x6a\x6e\x18\x06\x1f\xd0\x8d\x8f\x1f\xde\xb7\x7f\x7f\xc7\xf1\x09\x18\x4e\x07\x2a\xe8\x10\xfd\x4f\xc4\x40\x57\xe1\x28\x15\xf8\xd7\x57\x15\xee\x17\xfe\x71\xc9\x99\x43\xb7\x9c\xd4\xd0\x41\xac\x2b\xec\x06\xfd\x2a\x19\xc5\x49\xde\x30\x5c\xf1\xa4\xa5\x71\x3a\x7b\xcd\xf9\xfe\xaa\xbe\x2a\x4c\xa5\xf3\xea\xaf\x62\xc2\x03\x22\x12\xb0\xb3\x48\x08\x88\x48\xc0\xcf\x22\xc5\xa8\x32\x9c\xed\x5f\xcc\x84\xe4\x91\x3b\xc5\x2d\x96\xad\x27\x79\xcc\x21\x11\xc1\xf6\xb6\xe8\x7b\x7c\xc1\x24\xc5\xbc\xd2\x90\xac\xda\xf2\xc0\xd3\x94\x01\x86\xdf\xc9\x60\x4c\x4f\xc3\x5f\xcc\x16\x21\x9f\xc2\xca\xb7\x5d\xc9\xdc\xf5\x35\xb4\xe6\x9a\x9c\xa6\x95\xc7\x55\xc9\xdc\xad\x97\xb8\x50\x52\xaf\xbf\xd8\x7e\xbf\xdc\xf8\x0b\x56\xca\x77\xa3\xbd\x98\x9b\x25\xe9\x49\xb3\x6a\xfe\x2a\x0e\x4a\x87\x7d\xbc\x67\xdf\x01\x10\x65\xff\x39\x50\xb0\x8a\xe9\x82\x57\x3f\x5f\x08\x61\xb7\x3d\x9b\x81\xd4\xeb\xb4\x78\xa4\x8a\xb1\xa8\x51\xe9\x58\x81\x7b\x87\x01\x93\x26\xcf\xbe\x0b\x3e\x08\xf5\x55\x4f\x84\xa7\xd3\x55\x56\xb3\x6e\xe8\x22\xaf\x1b\xba\x86\x51\x16\x26\x11\x80\x19\x02\x0f\x9e\x90\x43\xa6\xc8\x00\xcb\x3a\x3c\x58\x82\x17\xd5\x05\xd2\xb2\xc8\x86\x12\xbf\xba\xab\xf0\xc2\xad\x8a\xd6\xc7\x96\xbc\x05\x6b\x34\xe0\x92\x96\x53\x01\xd6\xb0\x7d\xf7\x55\xac\xc7\x91\x5d\x8d\x68\xf7\x84\x8b\x40\xfe\xef\xb1\x48\x6f\x3a\x01\x0d\xc9\x78\x90\xdb\x85\xfd\x8e\x76\x96\xa5\x59\x0d\x0c\xd7\xd4\xb8\xdf\xac\x38\x89\x6a\x5a\x83\x34\x72\xda\xf0\x1a\x9a\x5d\x1b\x27\xf4\x69\x48\xfd\x9c\x06\xe0\x39\xa5\x96\x86\xb5\xd4\xbb\x6d\xd6\xb4\xc6\x8a\x6f\x38\x8a\xd7\xa6\x6d\x39\xe7\x41\x7b\xc9\x79\x4e\xce\x1b\x8e\x98\xbb\x79\x67\x9b\x7b\xc5\x2a\x3a\x82\xb8\x97\xbb\xed\x81\xbd\xad\x2c\x12\x2e\xdf\x76\x7c\xc5\x93\x1a\x3f\xc3\x85\xb3\x91\x2c\x6a\x75\x5d\x5b\xb8\x99\xf5\x78\x8b\xfa\x5d\xcf\xc5\x8c\x92\xae\x62\x86\xcc\x9f\x2d\x39\x61\xdd\x29\xe7\xf2\x4e\x8c\xc9\x74\xda\x7d\x99\x29\x2a\x39\xbb\xa2\x6b\xfb\xb7\x3a\x31\x3b\x31\xf2\x2a\x0e\x10\x83\x70\xde\x9d\x17\xef\x0f\x49\xac\x43\x5b\x81\xb1\x79\xb7\x05\x60\x45\x03\xda\x04\x5e\xaf\x77\x7d\xa5\x18\x2a\x11\x2d\x71\x58\x9b\x08\xd3\x1d\x7d\x30\x6d\x08\xd7\xed\xe2\x92\xfc\x65\x86\x20\x23\x77\x47\x6b\xd8\xc5\x61\x2c\x07\x02\x95\x82\xa2\x88\xbd\xa4\xa2\x3a\x7c\x11\xf3\x0a\xa9\x13\x1c\x43\xe6\x71\x4d\xa6\xc5\x27\xf3\xed\xf2\x52\xd3\x7e\x01\x8b\x30\xbe\xab\x5f\x51\x70\x76\x34\x9d\x7a\xb1\xe2\x12\xad\xa2\x41\x25\xec\x01\x7b\x5d\xee\x7c\x4e\x5e\xca\x51\x17\xfc\x19\xd2\xc2\x64\x13\xbf\xf4\x00\xfb\x3c\xf9\x6c\xe6\x61\x32\xab\xdc\x39\x7b\xf5\x7a\x06\x2e\x45\x7d\xdd\x33\x6c\x6f\xb6\xb2\xc3\x24\x70\xf3\x72\xc1\x9f\x4a\x49\x06\x18\xee\xa0\xd8\x72\xe8\x96\x68\x5f\x46\x13\x65\x34\xe5\xb6\xea\x77\xa5\x13\x77\xc1\xe5\x1d\x41\x11\x86\xd3\xc9\x34\xd6\x43\xc3\x08\x70\x3b\xd1\x03\x14\xa2\x48\x71\x43\x02\xce\x7c\xb1\xe5\xf4\xb7\x42\x3e\x44\xfb\xd2\x60\x1a\x07\xee\xf6\x5d\x06\x5f\xd4\x74\x60\xbc\x04\x58\xa9\x18\x27\x6b\x36\x2b\x00\x82\xd2\x14\x64\x50\x1a\x0a\xf2\xc1\x4f\x6b\xb0\xe0\xd2\x41\x39\xa1\xf5\x8b\x1b\xfc\xa8\xaf\xfb\x86\x5d\x71\xe7\x4c\x78\x6d\xd7\x9a\x6c\x57\x43\x1d\xba\xb6\x56\xf8\x5b\x45\x11\x4f\xa5\x2e\xea\x63\x0f\x0d\x70\xe0\xa4\xb1\xde\x67\x53\x5f\x1f\x77\xfb\x6e\x39\x3d\x26\xb8\x5f\xe0\x48\x9c\xb5\xb5\x84\xe3\x18\xb2\xaa\x46\xa8\xdf\x4d\x5c\x34\x30\xe0\xfa\xf6\xb6\xaf\x87\x68\x68\xcc\xca\xa3\xc6\x72\xcf\xf5\x25\x29\x75\x05\x17\x28\x4e\x85\x71\x51\x0f\xc3\x48\x2d\x1b\xaf\x52\x81\xc0\x09\xd6\xd6\x8c\xb2\x76\x9e\x52\xb5\xb5\x35\x2a\xab\xc6\xba\x28\xcb\x06\x1e\x05\xa8\xcb\x49\xbb\xbe\x03\x53\x3a\x4b\x4c\x98\xec\xcb\x99\x4a\x2c\x5a\x15\x0d\x05\x45\xfb\x05\xe3\xc7\x48\xf5\xce\x54\xea\xdc\x97\x8b\x1b\x01\x9f\x23\xa0\xe1\x8d\xf1\x71\x0f\x8c\x8e\x63\xfc\x9d\x2a\xb1\x5f\xa2\xd6\x6a\x73\x4e\x49\xe2\x20\x29\xb5\xb5\xbf\x26\x85\x0e\x83\x74\x0c\x57\x14\xea\xc7\xa0\x8a\xad\xfb\x78\xb9\x63\xb9\xaf\x73\x4b\xb5\x79\xa9\x7b\x60\x9c\x13\xed\x27\xaa\x79\xf5\x7f\x5c\xe3\x8e\x5a\xe1\xe3\x58\xf1\x63\x54\xbc\x69\x26\x3a\x31\x84\x7d\x16\xa5\xb5\x8f\x96\xe8\xa1\xb5\xfa\x70\x64\xd0\x89\x75\x82\x0e\x13\x3e\x4f\xcd\x31\x22\x0c\xc9\xaf\x49\xbb\x8f\xe7\x7c\x64\x71\xe5\xf6\x65\xc4\x94\x6a\xa3\x0a\x77\x4f\xfe\x11\x77\xad\x65\xcc\x8d\xca\x43\x03\x82\x15\xd6\x86\x21\xf9\x9f\xf0\x9d\xbc\xda\x58\x87\x6a\x63\x9d\x0a\x05\x09\x68\xb4\x05\xb7\x79\xd6\x16\x26\x2d\x32\xc7\xc5\xb3\x64\x29\xa1\xa7\xc9\xbf\xa1\x53\xd1\xa1\x17\x14\x9c\x2e\xa1\xa0\x55\xdc\x12\xce\xd1\x70\xb1\x9c\x86\xf3\x7f\x45\x43\xa9\x42\xb9\xac\x3b\x15\x9d\x71\xae\xe8\x4e\x39\xd3\x14\x58\x4f\xcb\x51\x0a\xc4\xf8\xe8\x52\x65\xf2\xd5\xab\x6d\x51\x01\xfb\x56\x31\x6a\x0c\x44\x81\xf7\x6f\x7f\xbe\x9b\xbe\x89\x75\x6f\x3a\xed\xba\xa8\x7c\x6a\xe3\x3b\x8a\xa7\xb6\xab\x3b\xdd\x97\xb6\x59\x83\x4a\xc5\x14\x11\xea\x7a\xde\x81\x99\x24\xfd\x9b\x4a\xd3\xf7\xc5\xdb\x3a\x0e\x17\x2c\x53\x09\x85\x1a\xf8\x46\xe5\x5a\xee\xc7\xab\x95\xaf\x14\xd4\x0b\x15\xf3\x7f\xbc\x51\xdf\xf8\xdc\xf6\x2f\x8a\x7f\x31\x06\xc0\xae\xaf\x87\xbb\xee\x32\x71\x22\x0e\xe7\x6f\xb6\xe7\x26\x0a\xde\xc8\x4b\x27\x8b\x9f\xf3\xad\x51\x5e\x9e\x7b\x7d\xa8\x66\xcb\x9f\xcb\xf2\xe6\x75\x66\x7d\xd7\x7f\x26\xbc\x32\x7e\xc5\x82\x5c\xba\xb4\x11\x00\xf0\x95\x2c\x5e\xba\xd8\xff\xc0\xc6\xc7\x5c\x17\xac\x9c\x48\xa6\xaa\xb9\x2b\x1f\x14\x18\xa4\x86\x5e\xb1\xda\xab\xed\x09\xc7\xaf\xe0\x4b\x90\x6b\x7b\x90\x42\x7f\xe4\x65\x86\x7c\xcc\xda\x99\x2b\x4b\x15\x17\xb2\xcf\x04\x0a\x75\x7c\xcc\x06\xb4\xa9\x28\x85\x28\x40\xba\x67\xee\x52\x0c\x50\x80\x02\xb4\xa4\x8a\xd4\xa7\x02\x05\x9b\x0b\x4c\x45\x69\xa4\x8a\x62\x4c\x70\x59\x50\x45\x8d\xa4\x0a\xf7\x3d\xe2\x70\x47\x25\x5c\xa1\x58\xa2\x40\xf6\x19\x1b\x21\x83\x7f\xce\x33\xb0\xc9\xd0\xcc\x9e\xaa\xd8\xbe\xc4\x6a\xe2\x5c\x51\xfb\x90\xa8\x83\x43\x52\xa1\x93\x62\x14\xfa\x8b\x26\xd7\x01\x9a\xfb\xde\x28\xbf\x9f\x94\xb4\x89\x12\x7e\x52\x60\x26\x1b\x70\x69\xcb\xd8\x0f\x1a\x21\x8c\x0a\x8e\xd7\x40\x70\x2f\x5c\xc6\x6c\x18\x68\xc5\x37\x7f\x3c\x70\x06\x49\x45\x23\x06\xf6\xb3\x1a\xb7\xc1\xe2\x9e\x9a\x40\x01\x82\x4b\x64\x50\x37\x82\x2b\x64\x56\x3a\x82\x0b\x64\x56\x36\x82\xeb\x63\x26\xcb\x98\xaf\x2a\x1f\x19\xc8\x33\xdb\x3d\xec\x2b\x03\x91\xc9\xed\xe2\x72\x9f\x18\x0e\x74\x2d\xd6\xa9\xcc\x53\xaa\xdf\x27\xa0\x3d\x64\x20\x62\xee\xf6\xd8\xd7\x19\x35\x0c\x27\x29\x40\x7a\x01\x8b\xcc\xa8\x81\x40\xfd\xe2\x3e\x31\xef\x63\xd5\x57\xa9\x62\x45\x31\x55\x07\xea\xcb\x0c\x05\xbc\x73\x7d\x66\xfb\x15\xa7\x50\x26\xfd\x21\xac\x1e\x06\xc0\x82\xee\x69\xe0\x2a\x89\x60\x0a\x10\x12\x81\x8d\x64\x9c\x91\x5d\xc6\xca\x0a\x06\xdd\x37\x07\x3e\xe6\x46\x64\x02\xde\x47\x19\x20\xef\xa1\x86\x6f\x9e\x3f\x12\x1c\xf0\xc4\x4b\x18\x03\x69\x92\x9f\x90\x3b\xca\xd2\x88\x87\x03\x47\xe4\xea\x4e\xd8\x0e\xbb\x5e\xff\x5c\x50\xc4\x18\xdb\x3d\xa8\x50\x74\xeb\xa9\x89\x66\x9c\x93\x41\xec\x57\x89\xe9\x00\x31\x02\x60\x9c\x04\x34\x1b\xc4\x09\xad\xc2\x5c\x52\x1c\x2c\x5b\xf2\xc2\xf9\x89\x67\xe9\x34\x20\xd2\x18\x87\x2b\xdb\xbc\x5b\x29\xac\x28\x33\x9d\x40\xb0\x74\x5d\x80\x26\x9a\x5b\x17\xfa\xd5\xcb\x25\x91\x5d\x98\x7f\x71\xa4\xba\x5f\x9a\xdd\x91\xdc\xf6\xbb\x27\x9e\x8b\xe2\x24\xa7\xd9\x03\x19\xd8\x7e\xf7\x8b\xe7\x2a\x4b\xd9\xa0\x8a\x0a\xe6\xcc\x80\x0d\x54\x55\x14\x0b\x0c\x1f\x07\x85\x1e\x48\xc0\x67\x74\x54\xf0\x6a\x10\x10\x3d\x30\x24\x8a\x00\x64\x7f\x44\x71\xe0\xf0\x67\x4e\xfe\x56\xc0\x9f\x5e\x52\x1c\x08\xb3\x36\xbe\xd1\xe0\x41\xbf\xd1\x44\x90\xc1\x5f\x6b\xc2\x3b\x43\xf2\xee\x38\xd6\xa9\xb1\xde\xb4\xac\x59\x39\x4b\x14\x8f\x98\x14\xf9\x56\x69\x91\xbb\x4a\x25\x50\x80\x23\xc6\xb4\x03\xaf\x2a\x50\x96\x1b\xb9\xbf\x15\x28\x7f\xb9\xb4\x0c\x42\x52\xae\x2d\x2b\xb0\x0f\x0b\x09\x7e\x69\x4f\x88\xad\xdd\x8d\x07\x79\x3c\x1c\x50\x0d\xf9\xcf\xc4\xde\xe9\xcd\x50\x2f\xc5\x2f\x27\xa7\x27\x6d\xfb\x1c\x1d\x8d\x89\x7d\x18\xa1\xce\x98\xd8\xcf\x3d\x74\x31\xb1\x9f\xa2\x19\x4a\x59\xde\x5f\x01\x0c\x01\xe0\xca\xee\x44\xe8\xf4\xca\xbe\x90\xf1\xe5\x9e\xf3\x3e\x24\xd2\x4b\xd8\x24\xc1\xab\x4d\xa1\x61\xfb\x1e\x77\xdd\x59\x14\xeb\xf7\x4c\x02\x28\x75\x90\xc2\x39\x95\x74\xdf\xf4\xc9\x60\xe0\x11\xbf\xef\x94\xc1\x79\xc5\x3c\x0f\x07\xdd\x4b\xdf\x15\xa7\xba\x85\x87\x56\xc7\xda\x22\x66\xf6\xbe\xfb\xd5\x6d\xe9\x10\x18\x79\xae\x6e\x80\xc6\x1c\xa3\xc4\x32\x6c\x22\x48\x2a\xa6\x35\xc7\xc3\xdf\xf5\x28\x4d\xa3\x01\xed\x0e\xd8\x3e\x30\x36\xf9\x17\xfa\xe9\x93\xc2\x18\x15\xcb\x66\x00\xc6\x5d\x38\xf6\xe6\x66\x7a\x39\x52\xe4\x55\xce\x36\xe3\xf9\xb6\xf2\xcc\x4b\xfd\x5b\xaf\x10\xac\xa7\x53\xb0\xff\xd8\xcd\xdc\xe9\xd4\x9f\x4e\xdf\x5b\x8a\x81\xc0\xdb\x65\x79\x2f\xa2\x85\xbc\xdb\x3c\xef\x86\x9a\xb7\x9f\x2e\x0c\x63\xae\x11\xea\x75\x33\x17\x89\x6d\xf3\x6e\xb1\x7b\x96\xa6\x15\x0d\x24\xf6\x70\x1e\xd8\xd3\xdd\x14\x56\xa0\x56\x83\xe9\xd4\xdb\xc2\x81\x61\x4c\xa7\x04\x32\x80\xb1\x74\xb4\x98\xde\xf2\xec\xf9\x6a\x0c\x0a\x52\x10\x5d\x20\x66\xfb\x9f\x13\xe3\x7d\xc2\x3a\x9d\x4e\x37\x2d\xe3\x15\x8a\xde\xb0\x06\x5b\x0e\xc4\xc9\xaa\x70\x68\xa4\x88\xa5\x38\x0f\x09\xf2\xb9\x3b\x71\x58\x68\x47\x8e\x0f\xb7\xed\x3e\x3c\x06\xd7\x7d\xcc\x04\x80\x7a\x9d\x2d\x3d\x46\xab\x4b\x5c\xdb\x5b\xba\xe3\xb9\x4b\x8b\x1b\x59\x1a\xeb\x77\xfe\x2b\xc2\x2d\xa4\xde\xfa\x85\xfe\x23\x77\xec\x3d\x24\x85\xd5\x66\x1a\xeb\x69\x99\xec\x81\x1c\xfc\x40\x94\x13\x83\xc6\x3d\x21\x0d\x45\x1c\x1e\xc3\x20\xe3\x8f\x14\x28\xb7\x77\x7a\x1e\x19\xc5\x33\x1e\x22\x23\xbf\x45\x06\x37\xf4\x25\xbe\x1f\xf8\xb7\xcf\xbe\x2f\x3d\xc8\xe4\x10\x30\xfa\x0a\x4f\x8a\xe4\x24\x5f\x62\xb4\x94\x53\xc7\x24\xe5\xfb\x3b\x56\xeb\x06\x51\x1e\x65\x08\xf8\x37\x04\xec\x2c\x5a\x8e\xcf\x8f\xf3\xfc\x46\x83\x1f\x75\x83\x4b\xc5\xae\xef\x76\xbf\x07\xae\x7e\x15\x19\xd5\x2f\x5c\x6e\xdf\x1d\x4f\x12\xe6\xf5\x0c\xc7\x33\x7b\x19\x0d\x31\x71\x3c\x33\xa3\x03\x7c\xee\x13\x07\xac\x03\x74\x18\xab\x80\x03\xdd\x7b\x36\x1e\xe1\x30\x38\x4d\x71\xd7\x55\x4c\x52\x3e\xf0\xe6\x2e\x85\x6d\xce\xaf\x47\x96\x4d\x32\x29\x4d\x1d\x9e\xed\xe7\xdc\xbb\x38\xb8\x4f\xe1\xef\x87\xaa\x67\xde\x76\xcd\x27\x49\x92\xe6\xb5\x41\x4a\x82\xda\x31\x19\x8e\x6a\xdb\x67\x07\xa6\x66\x38\x33\xc0\xdc\x22\xba\x61\xeb\x69\x2a\xfc\xf0\x37\x31\x4e\x53\xf9\xd0\xff\xc8\x27\xe8\x89\x01\xb1\xaf\x06\x0e\x19\xb7\xca\xa9\x47\x1f\xfb\x04\xf9\x21\x7a\x91\x93\x9e\xed\xa1\x34\xef\xd1\xec\xaf\x21\xc9\xc8\xdd\x88\x09\xee\xea\xe6\x01\x30\x89\x7a\x70\x7b\x86\xd2\x82\xe1\xea\x36\x3f\x49\x8f\x43\x5d\xe7\xc6\x03\x9b\xd2\x78\xe0\x2a\xbe\x8e\xca\x0b\x01\x82\xc1\x32\xa1\x9a\x87\xb7\xe7\xfa\x7f\xc9\x2d\x79\xba\x11\x53\x21\x19\xc6\xa3\x1b\xd3\x4f\xef\x84\x81\xd6\xa2\x5b\xae\x4b\x88\x6a\xea\x74\xea\xcd\x96\x78\x47\x07\xfe\x14\x86\x19\x68\xac\xf7\xfd\x8a\x19\xc3\x61\x5a\x0e\xcf\x44\xd8\x50\x96\xb3\xb1\xa3\xfb\xb0\x74\x77\xcf\xb9\xe7\x99\xf3\xc0\x35\x8f\x52\x9f\x0c\xa8\x51\xaf\xfb\xe6\x90\xf8\x7d\x12\xd1\x91\x1a\xee\x12\x97\xbb\x29\x30\x07\x1c\x70\xc9\xa6\xf2\xbe\x22\x6f\xf2\xcb\x04\x0f\xeb\x9b\xcd\x77\x5e\xe3\x88\xad\xc9\xc6\x6f\x1f\xfe\x68\x5a\x1f\x3f\x7e\x78\xbf\xfc\xbe\x88\x74\xc7\xbe\x8b\xf1\x1e\xc9\xa9\xa1\x64\xdc\x89\x94\x9c\xc8\xc3\xac\x1c\x7e\x0b\x86\xc4\xea\xf1\xe2\x63\x02\xef\x15\xef\x6e\x75\x5f\xbe\xd5\xee\xf7\x75\xdf\xa8\xbe\xb9\x13\x79\x03\x17\xdd\xa7\x7a\x80\x3c\xc3\x98\xc1\xd1\x70\x71\x33\xc4\x5d\x5d\x5b\x4e\xc0\xaf\x80\x82\x46\xa3\x9a\x47\x9c\x7d\x04\x06\x3c\x5e\xe5\x79\xe5\x75\x8e\x42\x71\x79\x5e\x57\x12\x3e\x5b\x64\x58\x96\x4a\xb3\x17\xc1\x40\x35\x79\x91\x87\x4b\xe5\xf9\x91\x98\x30\xbe\xc7\x7a\x27\xd6\xbb\x03\x9f\x34\x08\x8a\xe1\x97\xb8\x4b\xa5\xcb\x18\xc4\x53\x94\xc5\x0b\xe7\x47\x0b\xee\x8a\xc7\x69\x71\x13\xe3\x89\x57\x41\x49\xaa\x8f\x08\x31\x66\x39\xd1\xc7\x69\xe5\xc9\xb0\xbc\x6f\x24\xe6\x1e\xf8\x68\xe8\x18\xe5\x2b\x6e\x8e\xc2\xf4\xc8\x88\x4e\xa7\x96\x78\xd1\x4d\xcc\x63\xdd\x50\x2f\x24\x48\xf7\xc0\x85\x16\x40\x21\xef\x9e\x21\xa6\x5b\x7e\x2b\xf4\x89\x4d\x3f\xf9\xad\x9e\x4f\xec\xc8\x27\x0e\xe9\x1e\x80\xc5\x49\x0f\x5d\x79\x04\x85\xc6\x4c\xbd\x97\x7d\x10\xfc\x28\x4f\x84\xb9\xf9\xe3\xd1\xbb\x62\xf0\xb4\x2c\x7b\xfd\xbf\xdd\x1b\x17\xd9\x2f\xb3\x9b\xd1\xcd\x78\xc3\xda\xf8\x08\xbf\x7f\xba\x05\x90\xb0\x64\x79\xd3\xd5\x6e\x6e\x6e\xd6\xbd\x30\xc9\xf2\xb1\xbb\x1e\xa1\xcf\x84\x08\x2b\x97\x5a\xf7\xbf\x2c\x2d\xb9\xc9\x54\x0c\x37\x4f\x96\xb5\x76\xf3\x64\x7d\xbc\x79\xb2\xc8\xda\xcd\x53\x33\x74\xdf\x69\xd3\x3c\x1b\xd3\x69\x48\x06\x23\x0a\x73\xc4\x74\xad\x75\x13\x34\xf4\x96\x7d\x63\xde\x04\xef\xc0\xb4\x6a\x97\xb6\xdd\x6e\xe3\x66\xcd\x65\x29\x46\x6b\x3d\x42\xfd\x48\x14\xa4\xb7\xec\xff\x4e\xed\x29\x32\x18\xd8\x3c\xbd\x37\x5d\xa3\xb1\x1e\xa1\x53\xc3\x30\x94\x23\x2d\xfa\x40\x06\xfa\x09\x6d\x10\x30\xb8\xce\x8f\xb6\x3c\xe3\x65\x56\x4c\xb4\x07\x09\xb7\x08\xf2\xf5\xf2\xf4\x44\x58\x78\xb1\x6b\x5a\x83\xa8\x56\x5e\x9e\x53\xb5\xd7\x54\x30\x96\xb7\x6d\x4a\xcf\x02\x45\x84\x49\x48\xa4\x9d\x76\xc3\xcc\xa2\x8a\xd1\xd5\x09\x5f\x2e\xf8\x73\x94\x2b\x4c\x66\x93\x90\x74\x0f\x5d\x33\x8b\x96\xf8\x8c\xec\xba\xce\x76\x2a\xa4\x4f\xe5\x61\xa6\x57\x18\xb8\x54\x6c\x75\x16\x32\x9d\x98\x40\xa4\x88\x23\xe6\x91\x76\xcf\x7e\x0e\xc5\x69\x89\x32\xb2\x3b\x36\x58\x12\x48\x08\xbf\xcb\x03\x6b\x2b\x2d\xcf\xee\xf5\x2a\x50\x8f\x11\x07\xf3\x2a\xb1\xca\x73\x19\x9e\x3c\x97\x8b\x4f\x5d\xf2\xc2\xfd\xa5\x0a\x32\xe3\xaf\x7c\x3d\x43\x0a\xe4\x7c\x25\x67\x30\x8f\x1e\x31\x94\x2b\xa3\x53\x30\xd6\x11\x6e\x05\x4e\x28\x0d\x1f\x50\x03\x51\xec\x75\x43\x17\x41\xb5\x89\x79\x7d\xd5\x62\x3f\xdd\x23\x57\xf7\xc4\x09\x9d\x1e\x1a\x88\x1a\x36\x45\x3e\x03\xbe\xa0\x1c\x77\x3f\x92\xe5\xc3\xe7\x8f\x1e\xdb\x0d\x9f\x42\x69\x21\xbf\x23\xf5\x59\x73\x74\x9f\x7d\x97\x23\x83\xab\x77\x51\x98\x60\x29\x5d\xc5\xc7\x11\xdb\x9d\x31\x0c\x81\x81\x18\x5f\x43\x56\x0c\xa7\x2d\x34\x96\x52\x15\x16\xd4\x04\xf8\x82\xb2\x4d\x1f\x83\xfe\x59\x65\xd9\x71\x64\x57\xa7\xce\xa2\xb3\x5e\x25\xfd\x24\x7d\x4c\xe0\x92\x9b\xf5\xd2\x95\xa2\x7d\x9d\x19\xc8\x25\x3b\x29\x7e\x79\xab\xbd\xb5\xdf\xde\xdc\x68\x6f\x91\x76\x73\xa3\xd9\x71\x84\xb4\x75\xcd\xd6\x6e\x6e\xd6\x35\xa4\xdd\x78\x10\xf4\x58\x30\x84\x60\xc8\x82\x09\x04\x13\x16\xcc\x20\x98\xb1\x60\x0e\xc1\x9c\x05\x9f\xac\x1d\xf8\x18\x5b\x96\xe5\x69\x33\xb4\x1d\x12\xbc\x7e\x33\x0e\xc3\x30\xe4\xf3\x84\xc6\x3f\x34\xa3\xb5\xde\xbd\xb9\xb9\xd1\xc4\xf0\x6f\x86\x37\x4f\x7f\x84\x6b\x3c\xd1\x5d\x8f\xec\xa5\xa9\x4f\x90\xa6\xe8\x6c\xc8\x3d\x2d\x38\xfa\x1c\x53\xc4\x67\xa1\xed\xb0\x2a\x38\xb1\x29\x96\xb5\xd7\x4e\x2a\xa5\xdf\x9d\xb4\x4b\xa4\x93\x2e\x6e\x4f\xd8\x62\x0d\xbf\xeb\x11\xa7\xf9\xe1\x93\xd7\xa2\x0d\xfc\x86\xda\x1b\xbf\x8b\x70\x4e\x88\xfd\xde\xfa\xf3\x03\x68\x2a\xd1\x06\xfe\x5e\x2e\xdc\x80\x09\xd3\x46\x61\x08\x68\x66\xa0\x31\x55\x37\x5f\xbb\xea\xac\x10\x24\xfa\x1e\x6b\xef\x76\xaa\x8a\x4d\x9f\xb9\x94\x91\x2a\x37\x14\x3b\x61\xd5\xfe\x32\xff\x7e\x21\xf8\x8b\x0a\xf5\xca\x24\xb3\x97\xca\x87\xf5\x8a\x73\x8f\x57\xd4\x12\x78\xa2\xa2\x82\xa0\xae\xf5\x8a\x5a\x89\x3c\xbc\xa0\x78\x2f\x95\xb7\xf5\x8e\x1f\xeb\x4c\xd8\x81\x17\xf7\x98\x1a\xc2\x2d\x81\x8f\xc9\x92\x03\x83\x2f\x2a\x1f\xc4\x72\xa1\xe9\x4c\x4a\xb9\xd1\xbb\x37\x01\xba\x19\xb9\xef\x6e\x0c\x43\x5b\x8f\xd4\x15\xb2\xdc\x77\x6e\xfb\xa4\xe1\x57\x8e\x78\xda\x80\x11\x54\x34\x40\x96\xe5\x2e\x73\xce\x02\x57\x67\xdb\xa3\xe5\xca\x80\x88\x74\x3d\x11\xff\x4d\xfc\x3f\x16\xe9\x90\xd1\xb5\x39\x96\x63\xae\xf8\xc4\x3f\xbe\xf9\xca\x07\x64\xff\xd7\xf8\x5d\xfb\xb5\x1c\x2e\x22\xf8\x98\x90\x06\xb7\x44\x7c\x49\x0d\xd6\x96\xca\x3b\x3a\xc6\xf4\xdd\x90\xe0\x97\xfb\x27\x62\x3f\x46\xe8\xcb\x84\xd8\x1d\x74\xfb\x4c\xec\x76\x0f\x7d\x19\x13\x7b\x27\x42\xd9\x33\xb1\xbf\xf6\xd0\xfe\x98\xd8\xbb\x11\xcf\xb2\xc7\xb2\x3c\x4f\x88\xbd\x1f\xa2\xeb\x09\xb1\x6f\x3d\x82\xb6\x27\xc4\xf6\x3c\x82\xbe\x3f\x11\xbb\x43\x08\x3a\x7e\x22\xf6\x38\x44\xbb\xcf\xc4\xce\x3d\x82\x76\x27\xc4\xfe\x1a\xa2\xcb\x09\xb1\xcf\x42\xf4\xe5\x99\xd8\x91\x7a\x86\xb2\x0f\xec\x16\x2b\x06\x11\x4b\xc5\x7e\x28\x75\xbc\x9b\x62\x22\xf7\x48\x11\xd3\xde\xe4\x71\x5e\x19\xf7\xa1\xfd\x5e\x2c\x26\xa4\x88\xdb\xfc\xd0\xfe\x9d\x47\x8e\x0b\x6c\xa0\x6e\xc7\x23\x73\x25\xb7\xf5\xfe\xa3\x8c\xfe\x5a\xc0\x6e\x7c\xd8\xf8\xf3\x8f\xf7\x1f\x64\x69\x67\x45\xc2\x1f\x1f\x3f\xfe\xb9\xb1\xf9\x51\x26\x44\x51\x51\x62\xf3\xf7\xdf\x3f\xfc\xf9\xfb\x46\x7b\x53\xca\x93\x96\x52\xd1\x03\xb6\x81\x56\xee\xa5\xa5\x7c\xa9\xde\x2c\x2b\x2a\x41\x07\xa9\xe3\x99\x4f\x21\xc1\xc2\x3c\x82\xe3\x73\x87\x74\xf0\x54\xdf\xc7\xa7\x84\xa8\xbe\x51\xba\xa7\x84\x20\xeb\x93\xdf\xea\x50\xfb\x9c\xba\x8e\x2f\x9e\xe0\xfb\x86\x13\xc0\xa2\xd7\xcd\x5d\xdd\x5f\xff\x60\x19\xbf\x35\x2d\xcb\x70\xfc\xdf\xf0\x07\xcb\xb1\xe0\x8c\x2f\xe0\x6b\x06\x3a\x88\x75\x1f\x6d\xc0\x59\x60\x20\x97\x77\xcf\x9c\x84\x04\xfb\x8e\x85\x99\x5c\x8a\xef\x3d\x62\xeb\x3e\xee\xde\x7b\xac\x34\xd2\x3a\xa7\x76\x87\xb2\xae\x26\xcc\xdf\x88\x05\x08\x4a\x23\x45\x69\x88\xb0\xd2\x90\x05\xb7\xb3\x62\x85\x42\xc2\x79\x19\x2f\x87\x6d\x80\xef\xde\xe3\x2e\x13\x96\x1d\xcf\x3c\xdb\x63\x72\x47\x21\x93\x2b\x0c\x61\xd4\x10\x33\x0e\x04\x6f\xd6\x88\x39\xca\x83\xbf\x52\xd0\xf6\xe5\x38\x48\xd7\xf7\x05\x0e\x62\xe6\xc5\x7b\xe2\x91\xaa\xa2\x7e\x90\x8a\xd7\xda\x5c\x97\x1a\x2c\xa9\x6e\x07\xb7\xe3\x51\x7e\x47\x93\xaa\x3a\x30\x81\x1d\x8f\x79\xd5\xd9\xd5\x09\xd7\x93\x66\x23\x4c\x8c\xb8\x13\x31\xe2\x40\xb5\x10\x11\xae\x89\x6c\xac\x43\xcf\x2b\x8f\x0c\x2c\xc7\xe3\x5a\x36\x67\x7b\xb0\x3f\x26\xc2\xbb\xf2\xd9\x5e\xd7\x73\x1d\xc3\x6b\xe0\x0d\xa7\x54\xc4\xf3\x5a\x96\x5d\x24\xaf\x35\x5d\xa1\xd8\xfc\xe5\xb8\xc3\x85\x8a\x39\xea\x00\x34\xa2\x39\x57\x78\x2e\x9d\x63\x75\x2f\x08\x63\x25\x63\xb6\xf5\x09\x8b\x96\xe2\x1e\xd4\x79\x4b\xf1\xb4\x83\x78\xae\xb1\xd0\x86\x81\x78\x5f\x20\xbf\x7d\xb0\xa0\x3b\x2c\x88\x7c\x40\xd0\x51\x9a\x44\x27\xe4\x6e\xa9\xeb\x65\xfe\xe2\xf5\x3d\x68\x98\x9a\xf1\x48\xb2\xb8\x13\xdf\x51\x26\xf7\x6f\xda\x45\xb5\xe6\xf5\xb4\xe7\x70\x3c\x85\x64\x4d\xd6\x70\xb1\xa1\xa4\xbe\x72\x44\xf3\x8b\xcf\xbb\x0c\xfb\xcf\x34\xa1\x4b\xd9\xb4\xf6\x2a\x9f\x58\x37\x16\x83\xe6\x1f\x31\xe7\xef\x39\x73\xd9\x4b\xb3\xfc\x7f\x64\xcd\x86\x6d\xb9\x8a\x2a\x3b\xab\xcf\xc1\xab\xd6\x2c\x26\x21\x61\xb0\x55\x2c\xcb\x0a\xb5\xb6\xfe\x86\x89\xa5\x1a\x4c\xaa\x3c\x65\x7e\xbc\x62\xc3\x10\x82\xe3\x10\x7b\xd3\x69\x9e\x38\xca\x6c\x05\x5e\xca\xcd\x5e\x47\x27\x06\xef\xb1\x21\x20\x63\x7c\x6d\x87\x04\x77\xd7\xff\x7b\xf3\x96\xed\x95\xfe\x7b\xf3\xd6\x9d\xde\xbc\xbd\x79\x6b\xbc\xbb\x79\xbb\x8e\xc0\x50\xdc\x97\xc6\x74\xd2\x98\x1e\x37\xa6\xfd\xc6\xf4\xb2\x31\x6d\x37\xa6\xa4\x31\xed\x35\xa6\x87\x8d\xe9\x7e\x63\xea\x37\xa6\x47\x8d\xe9\x79\x63\x1a\x34\xa6\x77\x8d\xe9\xa8\x31\x7d\x68\x4c\x1f\x1b\xd3\xe7\xc6\xf4\x67\xc3\x60\x28\x18\xd2\x2f\x93\xe3\xfe\x65\x9b\xf4\x0e\xf7\xfd\xa3\xf3\xe0\x6e\xf4\xf0\xf8\xfc\xd3\x6d\xac\xbb\xce\x21\x1b\xde\x66\x58\xed\x56\x6c\x3c\x3a\xc4\x31\xaa\xe3\xb2\x1d\x0a\x75\x52\xc5\x51\xc3\x91\xe7\xea\x2c\xde\x13\xae\xfb\xe1\xfe\xb9\x6b\xb9\x60\xad\x8f\x52\x97\x9b\xff\x64\x53\xa2\x07\x17\x24\x38\x22\xa4\xe5\xe3\x63\x6a\x83\x3f\x60\x06\xd1\x44\xdc\x3f\x80\x81\x58\x0c\xdf\xc3\xbe\x65\x95\x3f\xa6\x86\x34\x30\xf1\x78\x05\x06\xd4\x72\xfa\x94\xdb\x3e\x08\xf6\xb6\x37\x93\x5b\x83\xd9\xcc\x59\xc9\x89\x7e\xb8\x7c\x6b\xbf\x4a\x4a\xff\x72\x9d\x1e\xad\x05\x24\xa7\xb5\x3c\xad\xf1\x8b\xa7\xda\xdd\x78\x94\xd7\x3c\x5a\x4b\xd2\x64\x8d\xed\x7d\x4c\x4d\x4a\x6b\x5e\xeb\x43\xfb\xfd\x3b\x9d\xf0\xe7\x0f\x6b\x5e\x65\x44\x18\xb6\x85\x02\xec\xb7\x94\x97\x0f\x5c\x49\xdd\x37\x6c\x02\xb7\x4a\x1e\x5b\x2c\x20\xeb\x2a\x16\x38\x18\x07\x1a\xd8\xda\xf2\x5b\x6b\xb0\xb8\xda\xf0\x8b\x28\x5e\x82\xa5\xdc\x52\x81\x3d\x39\xbe\xa7\x92\xbc\x80\x56\x08\xa5\x17\x56\x19\x1b\xba\xdd\x38\x70\x9d\x26\x56\x63\xf6\xdd\x16\xac\x22\x9f\x43\x61\x51\x2d\x42\x04\x05\x88\x82\xa6\x27\xa4\x44\xa5\x52\x9b\x1c\x9b\x86\xb3\xc2\xfb\x45\xaf\xb3\xb8\xcd\x65\xed\xfc\xfe\x13\x31\x84\xf9\x81\x71\x68\x2a\xcf\xf8\x98\x50\x2f\x6f\xe0\x3e\x56\x80\x94\xa7\x76\x5d\xb2\xf6\xbe\x04\x6b\x6e\x2c\x20\xab\xc2\x7e\xe4\xae\x03\x59\xcf\xf0\x02\x82\x96\x96\xba\xf6\x11\x6c\x19\x72\x28\xa2\x40\xcd\xa3\x12\xe7\x6c\x72\x38\x36\x8b\x9b\xb5\x99\x1c\x96\x9e\x3a\xc6\x8f\xd4\xa3\x40\xc7\x97\x47\x34\x5e\x61\xdd\xc7\x1c\x87\x30\xd6\x55\xe7\xdc\x81\x19\xe7\x44\x75\xba\x52\x34\x20\x78\x5f\x09\xe5\xe9\x51\x84\x7d\xd8\xf9\x84\x86\x43\x59\x4b\xbc\xff\xb8\x85\xa3\x7a\xfd\xf7\x3f\x3e\xe1\x48\x68\x27\x75\x1f\x02\x57\x07\x7c\x8d\x68\xed\xfd\x47\x68\x32\x8f\xe5\x30\x66\x3e\xa6\xb2\xbd\x96\x5c\x41\x1c\x17\x47\x72\x3a\xc8\xc3\xf5\x3a\x88\xc1\xec\xdf\x37\xdf\x35\x7e\x39\x26\x7a\x64\x54\x4b\xd2\x5a\x1e\xdf\xd1\x9a\x3e\xcc\x52\x8f\x78\x83\x49\x8d\xd4\xa2\x34\x8d\x4c\x06\x6b\xc2\xc9\xa6\x59\xbb\x1a\x51\xe8\xb7\xb5\x34\x9b\x4b\x64\xb3\x2b\x62\xd1\xe3\x11\xad\x91\x9a\xb0\xdd\x51\x7b\x8c\xf3\x5e\x3a\xce\x39\xea\x30\xa6\x83\x60\x04\x87\xe4\x25\xdd\x9f\xcb\x8b\x67\x44\x51\xd1\xc7\xe1\xb8\x41\x3e\x90\x14\x46\x7b\x85\xfc\x7b\x5e\x8a\xb1\x3e\xb6\xb6\x02\x2e\xe3\xb7\x9a\xb6\x85\xde\x6f\xe1\xa8\xc5\x9a\xc8\x94\x0f\xc4\xbb\xbe\x6b\xcb\x08\xf6\xc1\xc5\xd2\xeb\x5e\x89\x41\xe4\x67\x02\x22\xcc\x58\x6b\xbe\x81\x36\x30\x86\x13\x84\xdf\x30\x88\x68\xd0\x29\x40\x02\x8c\x98\x04\xc8\x30\x7c\x09\xed\xdc\x96\x67\xc1\x38\x10\xfb\x8b\x48\x90\xf8\xbb\x4d\xa0\xa7\x98\xea\xeb\x71\x56\xba\xd0\xe7\xe5\x38\xde\x4b\xa8\x57\xd2\x37\x65\xba\xf2\x86\x5a\x05\x92\x87\x10\x04\x17\x04\x36\x9a\x8c\xc4\x59\xa9\x4e\xc5\xf0\xbc\x29\x84\xf0\xe3\x54\xa7\x65\x75\x28\xdf\x37\x4d\xa7\x1b\xef\xcb\x8a\x9d\x87\x25\x6b\x28\x9f\x9d\x7e\x6b\xb6\x37\xd7\x9b\xed\x4d\x9e\xd1\xef\x3e\x79\xae\xb0\x39\xb6\xc9\xf2\xc1\x8d\xf9\x86\xd1\xd0\x37\xb7\xa2\xd6\x41\xac\x5b\x28\x5a\xdb\x34\xec\x53\x89\xf1\x59\xc1\xb8\x12\xf0\x17\x78\x4a\x4b\xc9\xc7\xca\x45\x4b\x55\x9e\x4a\x17\x4d\x76\x37\x57\x89\x08\x53\xb9\xed\x63\x99\xe0\xad\x71\xb7\xb9\x01\x03\x6a\xe3\xfd\xa7\x88\xf5\x07\x91\xf5\xf4\xd7\xf5\xff\xad\xb9\x31\x9d\x36\x37\x4a\x16\xfc\x28\x3b\xd8\x6b\x19\x4a\xe0\xcb\xbf\x01\x2e\x21\x27\x51\xb5\xcb\x24\xfe\xd2\x2e\xf3\xda\x63\xee\xd7\xbb\xcf\xe2\xfb\xf6\x5f\x74\xa5\xe5\x2f\xd2\xff\xa6\x5b\xa1\xe6\x42\xa7\xfa\xfc\xcf\x06\xc0\x72\x43\x0a\xac\xb8\x95\xbf\xab\xcc\xdf\x8e\x8a\x65\x36\x06\xfe\x97\xf1\x71\xaa\x74\x50\x90\x69\x45\x6d\xd6\x37\x0d\xc4\x7a\x52\xd9\x2b\xe5\xa3\xf8\xa2\xaf\x2a\x11\x1c\xd7\x76\xd1\xd7\x64\x99\x81\x38\xa5\x28\xfa\x41\xd0\x7b\xad\xc3\x7c\xab\x76\x98\xa7\x57\x01\x8f\x83\x0a\xe0\x59\x01\x48\x70\x38\x9d\x7e\x4d\x75\x9f\x0b\x20\x6c\x70\x54\xa4\x65\x5d\xe4\xe8\x28\x13\x60\x21\x8c\x50\x31\x13\x52\xd1\x98\x54\x3e\x9c\xf3\x38\xc3\xab\xaf\x95\xe1\xa1\x37\xf6\xf9\x8b\x1c\xf1\x56\x4f\xd7\xf5\x12\xb2\xf2\x7e\x79\x3a\xdd\x34\xd6\xbc\xc6\x1f\xc6\x6f\x2b\x7f\xac\xe9\xba\xcf\x7b\x7f\xe3\x83\xf1\xdb\x1f\x3c\xfa\x0f\x26\x0e\x02\xf7\xb9\xf1\x4f\x7f\x4d\x5f\xf2\x7c\xd0\x37\x0c\x39\x5d\xb3\x3e\x29\x9e\x03\xad\x43\xe9\xc6\xfa\x1f\x46\xa3\xb9\x6c\xb2\xfe\xfe\x3a\x7f\x78\xfb\xaa\x1b\x13\x9d\x49\x74\xea\x26\x4e\xf7\x05\x9a\x5e\xd1\xb6\xde\x32\x34\xde\xd2\xbd\x16\x43\xc7\x85\x8a\xca\x4e\x95\xd5\xa4\xe8\xa0\x02\xeb\xe9\x8c\x9f\x23\x7d\x09\x09\x7e\xf9\xd1\xde\xbe\xf8\xeb\xf3\xd5\xd1\x91\x7d\xdd\x43\xc5\xc7\x5f\xd7\x07\x9d\xfd\xbf\xda\x17\xdb\xb6\x36\xa9\x7d\xd1\x78\x02\xf4\xfc\xbf\xb6\x77\x76\x2e\x6c\xb0\x9a\x30\xa9\xc4\x03\x0e\x6e\x59\x61\xa2\x71\xbb\x24\x7f\xed\x6d\xff\xe0\xf0\x07\xa1\x12\xa3\x40\x06\x81\x0a\x0a\x7d\xdf\xd6\x8e\xd7\x2b\xb1\xc7\xed\xbd\x83\xab\x63\x99\x41\x4d\xe1\xa5\x97\xc9\xc2\x8e\x83\x98\x6c\xfe\x5a\x44\x21\x0d\x41\x30\x34\x8b\x50\x15\x74\x25\x28\xe0\x2c\x6a\xb2\x1d\xcd\xd0\x49\x8a\xbf\x84\x44\xfc\x03\x56\xee\x33\x56\x76\x72\x62\xbf\x34\xdb\x9b\xf6\x0b\x5c\xa4\xdb\x9a\x75\xa8\xcd\x50\xb3\xfd\xbe\x8c\x10\x31\xbf\x2b\x31\x22\xea\x43\x19\x75\x0c\x11\x7f\x28\x30\x3c\xe6\xa3\x9a\x8b\x47\xfd\x59\x46\xed\x40\x44\xd3\x52\x80\x44\x54\x53\xcd\x27\xe2\x36\xca\xb8\x0e\x8f\x51\xc8\x96\x51\x2a\xe1\x2c\x6e\x86\x2e\x17\xaa\x58\x63\x82\xd7\x88\x24\xc1\x42\x55\xab\x29\x95\x2a\x57\x93\x94\xaa\xd7\xee\xe2\xc1\x20\x4e\x93\x05\x0e\x54\x12\x2a\x8c\xa8\xa4\x28\xfc\xa8\x79\x4a\x7c\x85\x2d\xd5\x94\x0a\x77\xaa\x49\x1b\x6a\x35\x33\x35\x65\xb3\x52\xcf\x32\x69\x65\x9e\x6b\x4a\xe2\x6c\x86\x4e\x53\xbc\x1f\x12\xf1\x4f\x39\x95\x54\x55\x85\xce\x52\xb3\x3d\x26\xc8\xc7\xdd\xef\x70\x1c\x72\x9e\x76\x89\xdb\xb5\xdc\xfa\x1f\xdc\x7c\x28\x11\x57\x68\x57\xd4\x98\x7b\xd3\x46\x4a\x93\xe0\xdf\x69\xb1\xf8\xf0\xad\xcb\xba\x65\x5a\xd6\x7a\x84\x8a\xc3\x3e\xae\xba\x77\x9e\xe2\x97\xed\xf6\x9e\xdd\xdd\x40\x5a\xd0\xd3\x90\x76\x33\xb6\x3e\x6c\x84\x26\xfc\xfb\xdd\xd4\x90\xb6\xb7\xaf\xb9\x68\xfb\xe8\xc8\xee\x5a\x48\x3b\xa2\x7d\x8d\xff\xba\x68\xfb\x0a\xb2\xed\x50\xa4\x6d\x5f\xbd\xd1\x5c\xb4\xb3\xd7\x01\x3c\x37\x63\xeb\xcf\x70\x53\x43\x5a\x87\x81\xed\x7c\x39\x81\xd8\x01\x7d\xd0\xf8\xaf\x8b\x76\x2e\x8e\x20\xee\xe2\x8d\x06\x3f\x2e\xda\xdd\x2e\x90\xed\xc2\xf7\xde\x67\x80\xf8\x9c\xed\xee\x69\x48\xdb\xdd\xfb\xcc\x22\xf7\x79\xe4\xee\xfe\x67\x8d\xff\xba\x68\xf7\xe8\x8c\x51\x06\x19\x8f\x20\xe7\xc9\x0f\x49\x85\x45\x7e\x67\xf8\x8f\x77\x44\xd8\x45\xbb\xa7\x25\xf4\x29\x07\xbf\xd8\x85\x9a\xdd\x8c\x37\x2c\xd2\x64\x68\x2f\x44\xd0\x45\xbb\x3f\x0f\xed\xee\xef\x16\xd2\x0e\x6f\xc6\x56\xd3\x0a\xb4\x32\xe4\xa2\xbd\xc3\x43\xbb\xdb\xfc\x88\xb4\x7e\xa6\xc1\x8f\x8b\xf6\x18\x76\x5e\x89\x8b\x3d\x86\xbc\xfd\xe5\xac\xa4\x85\x71\xe4\xa8\xcd\x62\x3b\x3b\x10\xbb\x13\x67\x2c\x2b\xfc\x73\x51\xfb\xea\x42\xc0\x6e\x58\xc4\xd7\x8a\x80\x8b\xbe\xec\xcc\x61\xf9\xb2\x23\x82\x2e\xda\x3f\x2c\xf8\xb6\x7f\xc8\x8a\xdc\xbf\x38\x04\xe0\x7e\xa2\xc1\x8f\x8b\xf6\xaf\x3e\x43\x0d\x3f\xe7\x1a\xfc\xb8\x68\xe5\x60\xef\x02\xa2\x2e\x86\x1a\xfc\xb8\xe8\xe0\xe8\xb2\x2c\x9d\x68\x48\x3b\x38\x12\x41\x17\x1d\x9c\x94\x94\x79\x7f\xb2\x1c\x23\x16\x7b\x21\x70\xc4\x64\xc0\xe0\x2f\x2e\x58\xe4\xe5\x21\x44\x96\x3c\xf9\x7a\x5c\x10\xf8\x75\x9b\x11\xf8\xf5\xec\x87\x60\xb8\x68\x9f\xaf\x67\x45\xf3\x1c\x5e\x5c\x97\x8d\xc1\x4a\x3a\xbc\x10\x41\x17\x1d\x1d\x72\x2a\x2e\x46\x1a\xd2\x2e\x8f\x80\x86\xa3\x0e\xef\x47\x47\xac\x6a\x47\xac\x6a\x47\xdf\x44\x0c\x83\x3a\x62\x30\xc7\x27\x9d\x12\x27\xd5\x90\x76\x7c\x22\x82\x2e\x3a\xfe\x7e\x22\x89\x3b\xa6\x4f\x8c\xba\xe3\x1f\xa2\x94\x63\xe8\x39\x9a\x8b\x4e\x4e\x45\x27\x80\x3a\x9d\x9c\x42\xad\xce\xb6\x45\x13\xae\xb3\x21\xc2\x7e\x5d\x74\xd6\xe6\x1d\xfd\x12\xe2\x2e\x79\xdc\xfe\x59\xc9\x3a\xd6\xbb\xce\x7a\x8c\xdb\x67\x87\x82\x77\x8c\xca\xb3\xc3\x8b\x11\xc0\x1e\x9d\xf0\x82\x9e\x59\x1f\x7b\xbf\xa1\x95\x21\x17\x5d\x9c\x72\xe4\x17\xa7\x27\x1a\xff\x75\xd1\xc5\xe5\x1e\x60\x09\x62\xd6\xd6\x17\x97\x7b\x2c\xee\x6a\x87\x23\xb9\x19\x5b\xef\xdf\x5b\xf0\xbb\xc9\x7e\x37\x9b\xa6\x86\x56\x96\x46\xbb\xe8\x72\x5b\xd4\x9a\xb7\x25\xfc\x73\xd1\x65\x5b\x74\xa5\xa2\x31\x2f\xbf\x14\x8d\x79\xc9\xb8\xd5\xd9\xdf\x91\x3d\x93\x6e\x86\x6c\xc4\xef\xef\xb0\xe8\x0b\x18\x82\x3f\x42\xa4\xfd\xe8\x1c\xb1\x88\x6b\x3e\xc3\x9c\x74\xd8\x80\x67\xbf\x2e\xea\xfc\xbc\x04\xea\x3b\x97\x6c\xda\x61\xbf\x2e\xba\xda\xde\x2f\xd9\xf5\x5e\x43\xda\xd5\x36\x9b\x7d\xae\x2e\x8b\x62\xaf\xa0\xdc\xab\x1f\x57\x32\xe2\xcd\x95\xe6\xa2\x6f\x27\x7b\x65\x1b\x7b\x1a\xd2\xbe\x9d\x88\xa0\x8b\x7e\xb4\x2b\xfd\x54\xd4\xed\xa7\xac\xb1\x86\xb4\x9f\xdb\x17\x9a\xcb\x25\xa2\xaf\x6c\x19\xdf\x6b\xef\x1e\x1c\x6f\x1f\xfd\x75\xd9\x3e\xb3\xaf\x28\xfa\x72\x71\x7a\x75\x06\x1f\x17\x14\xd1\x23\x7b\x8f\xa2\xc9\xa6\xfd\x9d\xa2\x2c\x27\xf6\x39\x45\xf7\x39\xb1\x3b\x14\xdd\x53\x62\x3f\x87\xa8\x4f\x89\x4d\x03\x82\xfc\x4d\x9b\x91\xb3\xd1\xa4\x1a\xda\xcf\x88\xad\x9d\x90\x13\x0d\x49\xd4\x67\xdb\x9d\x4e\xfb\xe2\xc4\xd6\xfe\x83\xfe\xf3\x1f\xcb\xfc\xcf\x7f\xfe\xa3\xa1\x3b\xf0\xfe\xd6\xb6\x34\x44\xde\x8b\x84\xdf\x34\xd4\x1e\x13\x9b\x8f\x95\xf7\x1c\xd6\xb2\x34\x34\xbe\x27\xb6\x76\x75\xb9\xa7\xcd\xd0\x59\x8a\xbf\x86\x44\xfc\x2b\x57\x94\x8b\xb4\x62\xe2\x79\xfb\x10\x7b\xd3\xe9\x59\x6a\x8e\xef\x85\xa9\xe7\xbb\x7b\x82\xfd\xe9\xd4\xe2\x5f\x9d\x4b\xfc\x5e\x04\xaf\x52\x2c\x54\xa8\xbd\x67\x2c\xe3\x26\x78\x53\xc4\x75\xf8\x79\x9a\x9f\xcb\x34\x2f\x10\xf7\x1f\x8f\x3e\x29\xb4\xaf\xfb\x87\xc2\x36\xd0\x04\x9f\x0a\x63\xd2\x0f\xb8\x43\x85\x59\xe3\x3d\x19\x99\xdf\xca\xb2\x7e\x36\x65\x09\xdf\x2f\x85\xf5\x51\x05\xdd\xe3\xa1\x2c\x8d\x04\xdc\x30\xf8\x3f\x3c\x02\xbf\x4c\x19\x8e\x6b\x7c\x91\x72\x73\x48\xdc\x52\x53\x7c\x37\xbe\xfb\x9c\x11\xe0\xd4\x5e\x1c\xc5\xf9\x68\xde\x1e\x8a\x38\xab\xf7\x9e\xc1\x46\x66\x71\xa6\x75\x44\xa4\xd9\x65\x3f\x2f\x2f\xc2\x59\x84\xb4\x2e\x43\x9e\xfe\x06\xb9\xe4\xe7\x5c\x6e\x6e\xf0\xe5\x32\x8e\x92\x38\x8c\x7d\x92\xe4\xbf\xa4\xcb\xcf\xf9\x03\xcb\x25\x84\x79\xcf\x4b\x50\x87\x4b\xac\xeb\x80\x15\x65\x90\x0c\x6a\xeb\x11\x7a\xd3\x2b\xef\x62\xc4\x6d\xc3\xf9\x04\x77\x54\xa5\xa3\xf2\xd8\xd8\xeb\x5a\x2e\x0a\x30\xbc\x72\xb0\x14\xdf\x43\x6b\x4d\x34\x00\x73\xe5\x28\xc1\xab\x96\xc3\xc0\xb6\x06\xf5\x7a\x02\xa1\x46\xc3\x90\xf7\xcb\x70\xcc\x06\x2e\x3c\xc4\x2e\xfe\x91\xda\xd6\x56\xd8\x8a\x1a\x0d\x9b\x36\x1a\x8e\xb5\x85\xfb\xf5\xba\xf5\x29\xa8\xd7\xfb\x8d\x86\xaa\x17\xf3\x9d\xda\xc0\x85\xa8\x74\xf5\x74\x55\x1a\x7e\xd0\x2c\xad\x16\x27\xc5\x99\xa0\xf6\xb6\x41\x1a\x63\x26\x25\xfd\x12\xe7\x05\xb5\xfb\xd8\x52\x63\xae\x44\x29\x38\x28\x8b\x39\x16\x2f\x1b\x6a\x01\xf5\xe3\x3b\x32\xa8\x8d\xe8\x90\x64\x24\x4f\xb3\xd1\xd2\x32\x03\x4c\x1b\x61\x23\x52\xd1\x3e\x87\xb6\x34\xd8\xfb\xfd\x72\x09\x66\xfa\x34\x4c\x13\x9a\xe4\x31\xc3\x3e\xb9\xf3\xd2\xc1\x72\xd4\x72\x98\xac\x5a\xc5\x98\xe4\xcc\x6e\x34\x19\xbb\x4b\xf6\x36\x56\x9a\x06\xc6\xe7\x14\xfc\xb4\xb3\x16\x40\xe5\x40\xb5\x78\x83\x2e\xcf\xc7\xb2\x7d\xa7\x8e\xa1\xe6\xf2\x3a\x8d\x06\x13\x40\x9b\x9f\x68\x23\x9c\x4e\x9b\x9f\x44\xac\x52\x11\x32\x08\xd3\xec\x8e\x06\x95\x9a\x2c\x90\x0f\x0f\x22\xe6\x14\x43\xbb\x96\xbb\xb6\xc6\x7a\x4d\x73\x66\x61\x1c\xb2\xde\x4d\xa1\x8b\x07\xe0\x8b\x2a\x40\x3c\x36\x6c\x34\x50\x84\xe9\x5a\x88\x28\x0e\xd7\x9a\x28\xc4\x4d\xe9\xbc\x9b\x41\x47\xd3\xa9\xc8\x12\x6c\xd1\xe9\x34\x60\x94\x1a\x60\xde\xae\xbf\x8c\xca\x05\xca\x22\xd1\x66\x72\x8c\x32\x64\xad\x68\x2d\xb0\x2d\x47\xe0\x95\x63\x9f\x36\xc2\xb5\x00\x59\x9f\x8a\xd1\x58\xa4\x58\xf2\x66\xe9\x2a\xc5\xd0\x85\x5a\x81\x1d\x19\x6b\x54\xb6\x9a\x04\xed\x5c\x62\xda\x10\x80\xac\x76\xa2\xcc\x7a\xbd\x08\xa7\x12\x94\xcd\xc8\x12\xeb\xcf\xa6\x70\x05\x63\xa1\xbe\xb4\x91\xee\x13\x6c\x61\x1c\x4c\xa7\x01\xc6\x91\xe3\xe3\x15\x60\xa7\x5f\xcc\xc4\x95\x51\x0c\x83\x92\xfb\x82\x53\xc6\x21\xc6\x51\xd8\xaa\x74\x12\x36\x5f\x2b\xf9\x10\xa4\x61\x1f\xc9\x19\x5c\x4d\x94\x56\xf3\xb6\x1f\xe4\xac\xdf\x10\xdf\x12\xbc\x81\x05\x31\xdc\x66\x73\xf5\xf2\x67\x4e\xed\xa4\x59\x4c\xe2\x67\xa9\x39\xb7\x60\x56\x94\xe4\x36\x54\xc0\xbb\x9c\x54\x12\x37\xd5\x44\xf2\xbe\x92\xf6\xbe\x48\x3b\x10\x97\x57\xe6\xf6\xa1\x51\x01\xf9\xdd\x3e\x94\xf7\x5a\xcd\x4a\xc2\x87\x32\x61\x63\x5e\xbf\x59\x51\xd2\x1b\x8d\x87\xc3\x34\xcb\x95\x5e\xc6\x16\x2c\xb8\x92\x50\xb5\x35\x0f\xa5\x96\x1b\x61\x6b\x9c\xe7\x90\xd7\xaa\x4d\x5e\x5d\xba\x74\x4b\xa6\x2e\x5b\x7b\xf4\x0d\x91\xba\xb0\xb4\xe8\x1b\xc6\x6c\xa5\xe7\x55\x6c\x48\x55\x0c\x36\x0a\x0f\x14\xd6\xaa\x58\xde\x0f\xcb\xab\x9d\x33\x92\x8d\xe2\x24\xaa\xa5\x21\xb7\xc6\xe3\xe7\xb5\x64\x7c\xe7\x51\x36\x17\x8e\x6a\xe3\x24\xbe\x1b\x0e\xe8\x1d\x4d\x72\x1a\x68\xf2\x42\x2b\x26\x0e\x59\xb6\xe2\x48\x27\xfb\xa2\xe7\x20\x9f\xf7\x47\xf6\x0f\x85\x6a\xda\xf6\x83\x9a\xe6\xd0\x7a\x3d\x94\x23\xe4\x7c\xd2\xfd\xea\x7e\x12\x50\xdd\xaf\x6e\x2b\xc4\xab\xa2\x1b\x41\xd2\x56\x99\x04\x5a\x9c\xab\x6c\x3c\xd1\x96\x0f\x7d\xba\x04\xb3\x43\xd0\x77\x2b\x22\x21\x03\x7f\x90\x05\x64\x9c\xa5\xa6\xbf\xa9\x12\x61\x70\x60\x88\x67\xcb\x5e\x80\x83\x8a\x42\x10\x41\x11\x5e\x6d\xa2\x3e\xfb\x19\xb0\x9f\x04\x37\xd1\x10\x2b\x0d\x7c\xd9\x3e\x43\x23\x16\x51\x48\x99\x68\xcc\x3e\xef\x29\xf9\x17\xcc\x07\x23\xfc\x6a\x13\x24\x69\x5e\xab\x36\x82\x5c\xbd\x1f\xf0\xa9\xc3\xa8\xde\x5a\x09\xb8\xa2\x2d\xac\xcc\x40\xef\x33\x0e\x60\x46\x80\x9a\xa1\x1d\x7c\x14\x12\xfd\x59\xfa\x2c\xd9\xa9\xd7\xff\xfc\x84\x77\x8c\x87\x06\xde\x61\x75\x29\xed\x62\x3f\x63\x3c\x2c\x2e\xce\xe2\x50\x8f\xa6\xd3\xbe\xc1\x07\xc6\x43\x03\x5f\x51\x27\xc2\xab\xd6\x4c\x81\x1e\x09\xe8\x7a\x5d\x7f\xd3\x5b\x2d\x3e\xa7\x53\x9f\xaf\x45\xfc\xb9\xa4\xb5\x05\x04\x94\x24\x35\x9a\x86\x31\x5f\x82\x8a\x76\xac\x12\xa1\x50\xf0\x1c\x3a\xfd\x39\x0a\xce\xe9\x74\xfa\x8c\x71\x87\xb2\xea\x3c\xab\x35\x39\x4b\x4d\x7a\xa4\x22\x6a\xae\xe2\x44\xe0\x4a\x70\xd3\x02\x17\x81\x03\xe3\x85\xf3\x4d\xea\x09\x54\x11\xf4\x29\x79\x1d\x43\x7b\xf3\x75\x0c\x3c\x1c\xe0\x01\xd1\x1f\x8c\xf5\x64\x16\x87\x3a\x15\xc6\xa5\x8a\x51\xd0\x3f\xe4\x1d\x70\x95\x77\x40\x21\xe9\xc5\xc4\x51\xfa\x6d\xff\xb0\xfb\xb5\xf4\x46\x14\xce\xa3\x38\xd9\x43\x2b\x7f\x8b\xe3\x64\x8f\xe1\x90\xe6\x4b\x5a\x6b\x81\x1d\xcc\x0c\x50\x87\xb8\x9e\x57\xc0\x85\xc3\x2b\x89\xe5\x2c\x35\xf7\x33\x22\x65\x49\x17\xf9\x4e\x69\xec\x08\x8b\xa5\x8d\x04\xa4\x25\x7c\x6c\x90\x80\x20\x8a\x89\x23\x57\xbd\xc7\xc3\x96\x8f\xaf\x52\x5b\x0f\x84\x1a\x50\xc0\x7d\x5d\xb2\x20\x35\x90\x8f\x8f\x8b\x69\xf9\x13\x0e\x5a\x96\xfd\x2d\xd5\x03\xc3\x30\x83\xf8\x21\x1e\xa5\xd9\x0e\x19\x51\x44\xd7\x71\xcf\x1c\xa6\x8f\x7a\xd3\x42\xbe\x81\xae\xc5\x4a\x45\x0d\x14\x54\x53\x02\x2c\xd3\x82\x0a\x6a\xbf\xc1\xb0\x9a\xe3\x80\x18\x86\xe1\x10\x35\x93\x5a\x90\x50\x50\xf2\xcd\x61\x46\xc3\xf8\x89\xc9\x7c\xe0\xb1\xd4\x02\x03\x73\xd6\xa7\xe6\x3a\xe1\x10\x41\x4b\x4c\x27\x72\x4a\xe2\xaf\xf6\x80\x6d\x60\x72\x8e\xbc\xd3\x83\xd6\x5a\xd3\x6e\x1a\xef\xc4\xbe\x08\x49\x31\x51\x38\x28\x32\xbe\x17\xeb\xad\x14\x1a\x3c\x03\x9d\x48\x8a\xad\xe2\x9d\x0f\x63\xd6\x20\x8d\x74\x62\xac\xf3\x40\xd3\x32\x1c\xca\x2f\x3c\x68\x63\xa3\xbd\xd6\xfc\xbd\x5a\x25\xca\xa7\xe1\x50\x4a\x1d\x20\xe3\x09\x83\x54\x97\xc2\x6f\x42\xe7\xf2\xd3\x8a\x48\x16\x3a\x3c\xd6\x2a\xa6\xbf\x89\x34\xc7\x20\xef\x30\xc3\xb4\xb6\xe6\x84\xb8\xc9\x3b\x9e\x90\x0f\xaf\xd2\x96\x4e\x1b\x0d\x44\xd6\x71\xd3\x32\x6c\x9d\xae\xc9\x72\xd6\x9a\x88\xbc\x2b\xc9\x28\x62\x0d\xc3\x29\xeb\x1a\xb2\x7a\x15\xb5\xa4\xc8\x13\x8f\xe4\x96\x71\x43\xb8\x35\x63\x0c\x87\x09\xd9\xa8\x30\xff\x64\xcf\x96\x22\x88\x6c\xb6\xd1\x38\x84\x66\x9b\x57\x20\x53\x1e\xd0\x5c\x57\x1f\x6c\x49\x62\x89\x79\x35\x61\xdd\xc7\xfa\x84\x89\xe9\x3d\xb7\xe0\x26\xc9\x7b\xe7\x1b\x36\x84\x4e\x43\xc2\xbe\x10\x4b\xe3\xb0\x06\xa2\x4e\x42\xf4\xc0\x68\xe9\xa2\x2d\x82\x75\xbf\xb8\x88\x0a\xd6\xe8\x3b\x9f\x49\x51\x14\x7b\x48\x79\x93\xfd\x32\x0e\x88\x4d\xd1\x97\x11\xb1\xfd\x99\xa2\xca\xf0\x5d\x79\x7b\x0b\x6f\x8c\xfc\xfc\x13\x14\x53\xac\x11\xc7\x71\x52\x03\x83\x8a\x85\x1a\xd2\x80\x8e\x46\xb5\xbc\x47\x92\xda\x1d\x79\xe2\x69\x9a\xe1\x78\x58\xd4\x50\x2c\xc5\x73\x35\x0c\xb1\xc7\x46\x01\x8a\xb0\x67\x7e\x19\x11\xd4\x67\x82\x66\xc8\x47\x5d\x68\x34\xd8\xa2\x66\x6d\xb1\xe2\x99\xe0\x1d\x4d\xa7\xc4\xf4\x02\x52\xaf\xf7\xb7\x58\xcd\x1d\x0f\xb3\x24\x67\xc0\x5f\xcf\xf2\x24\x0b\x92\x5a\xec\x67\xad\x6f\xb3\x74\xd5\x9c\xd7\x29\xea\xe3\xd0\x69\xb6\x37\xac\xad\xbe\x63\x24\xf8\x3b\x6d\x24\xa8\xcf\xbd\xf4\xf5\xd7\x59\x4f\x16\x66\xbf\x1a\xc9\xdf\x2e\xa3\x7d\x7c\x99\xb6\xde\x7f\xb4\xcf\x52\x73\xb2\x29\xdf\x01\x8c\x71\xc2\x56\x3d\x58\xd2\x42\x46\xb4\x30\xc8\x16\xe2\xb1\x13\x6e\xf9\xa0\x41\x03\x9a\xb8\x8a\x92\x4c\x5f\xa8\x4c\x71\x45\x9b\xf1\x72\x98\x46\xf3\x5d\x22\x15\x68\x0c\xd4\xdc\x1a\xaf\x85\xbc\xb2\x3f\x9b\xf5\x7a\x13\x63\x7d\xbc\x16\x1a\xbf\xf1\x4f\xc8\x3c\x12\x3d\x79\x30\x9d\x2e\x2b\x50\x27\x4c\xae\x9f\x4e\x07\x46\xbd\xbe\x02\x00\x43\xc3\x21\xf8\xb4\xa1\x47\x0d\x71\xee\xef\xc3\x56\xdb\xe1\x6b\x8d\xbf\xc6\xf7\x6c\xf5\xba\xff\xc9\x6b\x34\x1d\xc3\x67\x83\x11\xa8\x6e\xbe\x5e\xb3\x46\xf3\x1d\x29\xa8\x56\x0c\x40\x95\x8f\xe4\x7d\x31\x9c\xee\x29\x31\x1c\xeb\x93\xd7\xd2\x3d\xbc\xe6\xa1\x22\x3a\x27\x86\x61\x13\xb6\xa5\x14\x4a\xc5\x67\xa9\x99\x81\x28\x8e\x4f\x1b\x9e\x72\x3f\x71\x99\xb6\xbe\x53\xde\x18\x88\x1b\x48\x73\x28\xeb\x0b\x1d\x30\x78\x27\x9e\xd0\x38\xe2\x75\x91\xe2\xc8\x55\xbe\x8d\x90\x4f\x39\x40\x49\xec\x23\x58\xc2\xfe\xfd\xe3\xa7\xf2\xcd\xf3\xda\xfb\x8f\x4e\x71\x7f\x52\x34\x78\x31\xb6\x21\x03\xd9\xf2\x1a\x4d\xab\x45\xd6\x3c\x7b\xad\xa9\x8c\xa7\x4e\xba\x68\x9c\xef\x14\x31\x31\x91\x8d\x00\x29\x26\x6d\x85\x15\x69\x29\xc2\x5e\x29\x2d\x31\xaa\x22\x8c\x8f\xa9\x21\x64\x98\xb0\x5e\xf7\x54\xc9\x85\xa5\xb5\xf8\x47\x03\x05\x0d\x06\x69\x53\xbc\x4a\x0b\xd9\x83\x1a\x41\x03\x47\xfc\x53\x6c\x88\xa2\xf2\x74\x44\x1e\x7e\xc8\x03\x0b\x79\x4c\xc1\x75\xdf\x0b\xb5\x82\x40\x5c\xfc\x07\xc4\x06\x07\xe9\xaf\x90\x12\x04\xc4\x28\x49\x21\xe6\xf6\x61\xa5\x5c\x62\xde\xdd\xcb\xcd\x98\x65\x07\x0d\xb8\x81\x32\xb7\x0f\xdd\x6e\xd3\xad\xee\xbf\x38\x1f\x58\x1a\xea\x33\xa8\x08\x44\xe0\x06\x63\x45\xbf\xdb\x74\x5b\x91\x1d\x35\x46\xb4\xd1\x07\xff\xc0\x4a\xce\x66\x05\xeb\x86\xab\xbe\x31\xdd\x83\xc3\x97\xe6\x2a\x26\x66\x7e\x5b\xcc\x68\xa9\x47\xd8\x46\x26\xbf\x05\x19\x2c\x68\x70\x41\x4d\xc5\x49\x79\xa5\x7f\x91\xb1\xbd\xc9\x32\xae\x70\x09\x6d\x6e\xeb\xc6\x98\x5f\x58\x07\x0c\xe0\xec\xf0\x2a\xc5\x2f\x7c\x65\xb7\x4f\x11\x5f\x2b\xec\x53\xa4\xac\xff\xb6\xfa\xb0\xe0\xb8\x6a\x48\xa4\x89\x31\xdb\xd2\xb5\x4e\x53\xb3\x93\x13\xfb\x34\x35\x2f\x73\x90\xe8\x37\x3f\x15\x36\x67\xaf\x52\xc7\x13\xf6\x90\x9b\xef\xe1\xc9\x0d\xf6\xbb\xc5\x0c\xec\x19\x6e\xd5\x84\xd7\x55\xca\x00\x4c\xb8\x5a\x2c\xde\xe0\xd4\xeb\xfe\x2a\xfe\xce\xba\x16\x5e\xd7\xbb\xff\xb5\xdc\x77\x86\x6e\x35\x0c\xdd\x7c\x67\xac\x77\x73\x0f\x5c\xea\xb7\x64\x35\xfc\x6e\xd3\x95\x35\xf1\xbb\x9b\x6e\xa5\x32\xde\x9a\xee\x77\x37\x5c\xae\x31\x3b\xb3\xaf\x52\xfb\x2a\x55\x0c\x8c\xa5\xba\xa2\x78\xe8\x61\xcb\x69\x6e\x61\x9d\xaf\xea\x8e\xe1\x35\x1a\x4b\x5e\x3b\x9f\x96\xd3\x08\x57\x97\x2d\xb4\x61\x3c\xec\xad\x01\xc6\xb5\x26\xf8\x91\xde\x5a\x2b\x6a\xe9\x57\x24\x34\x98\xf9\xc9\xba\x6f\xbc\xf3\x1d\x25\xa5\x7c\x02\xc9\x01\xde\xf9\xc6\xba\x3f\x73\x0a\x5d\x5d\xf8\xed\x9e\x78\xae\xe1\x1c\xa6\xe6\x67\x50\x3e\xc4\x2f\xa0\xd7\xb0\xb7\xdd\x69\xdb\x16\x3a\x3a\x3d\xf9\xc2\xc3\x4d\xc4\x6f\xfc\xf9\xd7\x06\xf7\x59\xc1\x3f\x36\x11\x64\xe9\x1c\x1c\xb7\xed\xf7\x3c\x0b\x84\x7f\x97\x59\xe0\xeb\x83\xc8\x02\x1f\x7f\xa0\xa2\x14\xf8\xfe\x58\x96\x04\xdf\x7f\xaa\xa5\x41\x4c\xd3\x52\x8a\xe4\x31\x4d\x7e\x19\xf1\x23\xc5\x27\xa9\x73\x51\x56\xe0\x60\x4c\xec\x26\xba\x1c\x13\x7b\x03\xd1\x23\x7b\x13\xed\x8d\x89\xfd\x1e\xed\x8e\x89\xfd\x3b\xda\x19\x13\xfb\x03\xf0\x00\x0e\xbb\xd1\x45\xc9\x83\x8b\xd4\x1c\xd1\xbc\x9d\x84\x69\xe6\xd3\xed\x91\x1f\xc7\x4b\x4e\x97\x2f\x53\x4c\x66\x0c\x34\x1e\xfd\x0a\xb2\x50\x67\xbf\x4c\x39\x95\x3f\x53\x7c\x96\x3a\x07\xa9\xe9\x67\x54\xe8\x67\xfe\x4c\x13\x8a\xbf\xa6\xe5\xe0\x78\x03\xaf\x6e\xde\xa4\xc2\x45\x32\x5f\x82\xbe\x31\x19\x04\x2f\x3b\x7c\x00\x41\x6d\xaf\x34\xb5\x8c\xdb\xbd\x62\x3c\x8f\xc2\x86\xd7\xd0\x0a\xb1\x26\x0d\xb9\xb9\x5f\xfe\x6c\x17\xd5\x1e\xc9\xa8\xa6\x35\x4a\x43\x52\x0c\x55\xf7\xc0\x05\xec\xaa\x07\xcc\x21\x23\x88\x0c\x19\x41\xa7\xfe\xab\x4f\x04\xce\xae\xaa\x8a\xf9\xde\x50\x1e\x9f\x77\x0f\xb9\x85\xf7\x1f\xba\x37\x44\x64\x68\x38\x47\x44\xf7\x86\x55\x3d\x71\xb6\x6c\x25\xf4\xb1\xb6\x93\xe8\x5d\x78\x2f\x8e\x84\x51\xa2\xce\x64\x48\xed\xed\x1e\x02\x29\x0c\x3e\x76\xa3\x99\x5b\xba\x3c\x24\xe6\xa5\x3e\xec\x89\xef\x91\x70\x81\x08\x1f\xd7\x43\x82\xc1\xf0\x5b\xe0\x13\x74\x16\xca\x43\xff\x33\x19\x7d\xed\x13\x74\x5e\x44\x7f\x1b\x12\x0c\x16\x3c\xbf\x79\x04\xad\x0a\xb3\xea\xe6\xb9\x2f\xae\x50\x84\xd1\xc9\x6f\x8a\x9d\x90\xe2\x40\xc5\x27\x78\xa1\x49\xf5\x0f\xd6\xbb\x35\x02\xd6\xc1\xa1\x9d\x86\xf8\x30\xed\x6e\x07\x2e\x23\x04\xbf\x5c\x3e\x11\xfb\x28\x42\xc9\x84\xd8\x7e\x0f\xe5\x13\x62\x87\x3d\xde\xb3\xed\xed\xde\x8c\x51\x85\x5f\xc4\x93\x36\xfe\x96\x0d\x0d\x9f\x89\x7d\xd0\x53\x8f\xc3\x2e\xe4\x24\x3a\x77\x24\xb8\x13\xd9\x73\x3e\x4c\x8e\x0a\x15\x29\x4e\x83\x59\x0c\x3b\xbe\x1a\xf8\xbd\xb9\xf4\x62\x18\xf2\xf4\x70\x3e\x5d\x19\x96\x42\xc1\x6e\x1e\xa2\x1c\xa5\x33\x00\xd8\xfd\x17\x44\xb1\x71\xfd\x77\x84\x95\x30\xbf\x22\xae\x84\xfa\x05\x81\x0c\x88\x13\x79\xd0\xfb\x67\x44\xfe\x1d\x81\x7f\x4f\xdc\xdf\x12\x06\x44\xcd\x69\xa2\x2d\xe3\xd3\x6c\xb6\x02\x23\xc9\x8c\x06\xbf\x3a\x26\x8e\x22\x9b\xe0\x1f\xa9\x59\xa8\xac\xa9\xc2\xc0\x59\x68\x13\x1c\x7b\x44\x8d\xfb\x1a\x2a\x19\x4a\x55\x36\x15\x64\xcc\x40\x16\xb8\x39\x27\x2a\x2c\x81\x00\xb2\x8b\x69\xe1\x45\x3a\x94\x24\x28\x17\x43\xc7\xb6\x66\x06\xcc\xcd\xf3\x73\x44\x39\xe9\xfd\x4c\xf4\xf3\x90\x20\x6e\x30\x42\x3e\xe6\xdd\x89\xe0\x31\xef\x6e\x34\x6f\x3e\xe2\xfc\x14\x4c\x77\x60\x30\x1b\x21\x8c\x48\x07\xdc\x76\x34\xdf\xcd\x83\xf9\x08\xca\xcd\x47\x5c\x16\x07\x1b\x08\xdc\x3d\x76\x9e\x58\x8a\x30\x16\xc1\x79\x7d\x76\xb5\x78\x43\x38\x0a\xa6\x53\x5d\xce\x41\xb2\x54\x39\xdf\x94\x0f\xaf\x0a\xec\x02\x14\xc1\x83\x30\x8e\xf6\xfc\x74\x89\x35\x03\x31\xcd\x55\x8c\x0f\xf1\x91\x2f\xe7\xb8\x12\x39\x9b\x3f\x0f\xd3\xea\xd3\x89\xcb\x8a\x5c\x21\x0e\x96\x0a\x01\xe2\xb4\x78\x40\x71\xee\x13\xe1\x9e\x1d\xae\x84\x96\x4c\x68\x52\xad\x92\x89\x5e\xa5\xea\x27\x57\x46\x67\x8c\xfa\x36\x64\xdb\x9a\xaa\x7f\x9f\xf2\xb8\xe0\x04\xac\x18\x05\x2a\x69\xc1\x50\xb1\x29\x53\x9d\xfa\xc5\xbd\xe1\x25\x5c\xec\xd9\x9d\x90\xa0\x28\x4b\xc7\xc3\x38\x89\x44\xd4\x55\x48\x50\x58\x39\xbc\xb7\x37\x50\x42\x23\x92\xc7\x0f\xf4\x8c\x64\x34\x19\xd9\xab\x4d\xb4\x28\x92\x8e\x7c\x32\xa0\x9f\x89\x9f\xa7\x99\xdd\x2c\xd6\x91\xe4\x19\x9f\x25\xba\x87\x28\x9b\xde\x49\xbd\x7e\x1f\xeb\xc4\xac\xe2\x37\xea\x75\xc6\xca\xc5\x58\x5d\x62\x88\xe5\x52\xd2\x1f\x11\xdc\x61\xe8\xde\x78\x32\xea\x61\x93\xc7\x0c\xfd\x22\x86\x0a\xa0\x4c\x2e\x5e\x8f\x32\xe6\x8b\x8c\x49\x3d\x82\x7f\xb0\x98\x49\x91\x6d\x4c\x61\x99\xf2\xd0\x33\x8b\x2a\x7c\xfc\x5e\x01\xf2\x9e\x61\x88\x43\xa8\x87\x80\x5b\xaa\x8e\x93\xda\xb7\x90\x28\xce\x80\xbf\x85\xa4\x5b\x81\x90\x2c\x88\x0f\xf0\x31\x43\x72\x28\xec\x64\x59\xe2\xcd\x67\x7c\x50\x9e\x94\x5c\x32\xe6\xd5\x42\xe0\x5e\x21\x55\x90\xda\x30\x1d\xc5\x8c\xef\xe2\x50\x1d\x2e\x6e\x7e\xe8\x01\x5f\xeb\x41\x73\xee\x1b\x5b\xd0\x44\xa3\xda\x17\x7c\x46\x38\x18\x13\x34\xf2\x63\x9a\xe4\x71\x18\xfb\x32\xf6\x72\x4c\xd0\x90\x66\x3e\x4d\x72\x19\x45\x8f\x90\x3f\xce\x32\x9a\xf8\x13\x19\xb5\x37\x26\x48\x1b\xf5\xd2\x2c\xd7\x64\xd4\x2e\x8b\x1a\xa4\x49\x54\xc4\xec\x8c\xc9\x0c\x5d\x87\x84\x6d\x4d\x3b\x21\xc1\x3f\xab\x47\x20\x57\x3c\xaa\x3c\x04\xa1\x43\x15\x44\xdc\x26\xb1\x79\x28\x58\x32\x0f\xbd\x62\xae\x06\xdc\x3d\x80\x75\x1a\x5f\x4e\x2f\x01\x9f\x5e\xfc\x39\xfb\x82\xc2\x88\x00\xf0\xf8\xd4\x67\xfb\x79\x98\x6b\x7c\xe4\x21\x6a\x38\xab\xdb\xdc\x99\x09\xeb\x02\x86\xb8\x8a\xe7\xd6\x6b\x18\xc0\xe7\x1e\xba\xf6\x48\x43\x02\x34\x22\x36\x3b\xcd\x0c\x67\x25\x58\x36\x3f\x29\x56\x9b\x3c\x4c\xd6\x45\xab\x3a\xe5\x74\x20\xfa\x83\x3c\x9f\x16\xfd\xb9\x38\xa5\x2e\x0d\xe2\xc8\x1e\x08\x87\x54\xc2\x63\xba\x51\xbc\xd4\x2b\xce\xa5\x93\x67\x78\xb3\x03\xdb\x0d\xdf\x30\x1c\xb0\xc9\x52\xbe\xe4\x41\x70\xa4\xd8\xa1\x46\xe9\xe6\x46\x3d\xd7\x4c\x9e\xe1\x14\x1b\x32\xbf\x83\xb3\x66\x41\x00\x3f\x96\x5d\x0f\x0c\x36\x97\x8b\x38\xfa\x1b\xb7\x13\xba\x09\x8f\xba\x64\xe7\xdf\x84\x16\xa1\x60\x30\xee\xb7\x4d\x04\xf7\xe3\x3a\x3f\xc8\x84\xc7\x8e\x16\xa2\xc2\xc9\xd8\xc3\x26\x7f\xf0\xc8\x62\x19\x41\x1c\x8f\x63\x54\x80\x37\x97\x00\xcb\x13\x53\x70\x35\x56\xd6\x1a\xe2\xe4\x24\x60\x80\xb9\x4a\x25\x35\xc0\x63\x42\x1a\x81\xc1\x39\x10\x00\x22\xb0\x68\x59\xb0\x9c\x31\x4b\x9e\xad\x3a\x72\xf6\xa7\xa4\xe1\x35\xe4\x14\xa1\x34\x02\xf8\x36\xd3\x3d\xbc\x72\x42\x1b\x1e\x58\xbe\x10\x66\x27\xd8\x6c\x7a\x91\x16\xae\xb4\x11\xc1\xaf\x6c\x55\x74\x03\xbd\xb6\xdf\xd1\x57\xaf\x43\x62\x20\x0f\x83\x51\x50\xdd\x63\xc1\x25\xe4\xbc\x9e\x9f\x28\x46\xbd\xca\x49\xff\xfb\x82\xa9\x68\x8c\x09\x37\xf6\x9e\xb1\x49\xf7\xf3\xc4\x68\x11\x9b\x9b\x8e\xfe\x01\xb0\x36\xab\x4d\x38\xac\x58\x01\xf9\xa9\xea\x00\xbf\xcc\x58\x0f\x00\xb3\x1e\xab\x60\xd1\x83\x3b\x2b\xf1\xcc\x07\x5c\xb5\x4f\x85\x3c\x93\x9b\x87\x12\x6e\x2a\xcc\x07\xac\x98\xe3\x29\x9c\x57\x13\xf3\x41\x58\x9f\x37\x1f\x44\xdf\x2e\x52\x42\x56\x54\x25\x93\x0f\x42\x47\xaf\x67\x54\x90\xd7\xb8\x48\xd2\xe6\xd1\x2c\x5f\xd5\x5e\x1d\xdf\xa5\xe6\x34\x10\x27\xcf\xfa\xdb\xf0\xad\x81\x6a\x71\x58\x1b\x0d\xa9\x1f\x87\x31\x0d\x90\x32\xc3\xf2\x1d\x1b\x9b\x58\x15\x5a\x86\x85\x11\x13\xc3\x33\x87\x98\x45\x14\x45\xaf\xe2\x5e\xaf\x5e\xaf\xf8\xe6\xf6\x95\x5b\xd1\x2c\x1d\xd2\x2c\x8f\xe9\xa8\xa6\xbf\x1d\xfe\xa2\xe0\xa4\xc6\x6d\x10\xc3\x94\x2e\xce\xd9\x1f\x6c\xcf\x7c\x40\xa1\xed\x99\x21\x1a\xda\x9e\x39\x54\x4f\xdb\xdf\x54\xc4\x8d\xd2\x62\xe4\x6d\xaf\x5e\x7f\x16\x0e\x76\x60\xee\xf4\xc1\x12\x8d\x57\xaf\x4b\x18\x33\xa0\x23\x7f\x15\x3f\x2a\xda\x4a\x82\xcc\x49\x4d\x63\x69\xa0\xae\xf4\xb6\xe1\x2b\x1b\x5a\x2f\x4d\x07\x94\x24\x8c\xba\x38\xd4\x7f\x78\x12\xe7\x6a\x16\xeb\x9e\xc9\x7d\xdf\x50\x63\x19\x42\x91\xb6\x04\x27\xa9\xc9\xca\x40\xa5\x2b\xcd\xe6\x37\xde\xaa\xbc\x49\x81\x37\xf0\x9c\xb2\x46\x18\xce\xc1\xf8\x2e\xd1\x6a\x43\x51\x8a\xf9\xd6\x70\xa2\x21\x3c\x32\xe1\x49\xaa\xcd\x16\x12\x15\x8c\x2a\x05\x22\x1d\x8c\x72\x16\x0e\x8d\x5e\x79\xac\x1a\xba\xa8\x8f\x23\x81\x13\x0d\xb0\xa7\x07\xa8\x6f\xa0\x1d\xec\xe9\x94\x05\x78\x22\xd4\xaf\x25\x66\xf8\x81\x0c\xec\xb4\x2c\x7b\xad\x69\x17\x5f\x4d\xbb\x80\xd5\x07\x68\xc7\xb0\x7b\x43\x58\xd7\xfa\x06\x62\x9f\xe2\x5a\xbd\x2f\x97\x82\xfe\x3b\x3d\x82\x86\xe2\x17\x70\xa5\xd1\x90\x38\xd4\xc1\xa3\x8b\x11\x60\xbf\xe8\x85\xa2\x69\x7d\xb6\x44\x02\x23\xe0\x16\xa7\xfb\xc2\x29\xb7\xfd\x99\xbb\x04\xf4\xb6\x67\xc4\xa1\x3e\x00\x64\x70\x23\xfc\x09\x1e\xaf\x17\x7d\x77\x94\x66\xf9\x2e\x20\x80\xcb\x7b\x92\xd4\xe8\xdd\x30\x9f\xd4\x48\x96\x91\x89\x59\x3b\x66\xcd\xd3\x23\x0f\xb4\x46\xf2\xda\x80\x92\x51\x5e\x4b\x13\x5a\xa3\xfc\x76\xdf\xd4\x54\x23\x59\x2f\x33\x14\xe2\xae\x8b\x22\x6c\x39\x11\x67\x74\x24\x19\xdd\x47\x03\xec\x77\x23\x57\xf1\xa4\xc1\x3e\x59\x55\xfa\x90\x80\xa0\x46\x8c\x4f\xb8\xa8\x50\x37\x72\x67\x0b\x55\x82\x5c\x2b\xb7\x3d\x91\x4f\xb6\x1b\x1f\x29\x80\xe9\xc4\x27\x8d\xa8\xd1\x17\x9e\x69\x6a\xbf\xa8\x2a\x54\x12\xd5\xbc\x71\x0e\x5a\x0b\xac\xe5\xd2\x11\x0d\xc0\x81\x53\x32\x98\x88\x1e\x39\xaa\xa5\x99\x54\x70\x10\x63\xa3\xcf\x3a\x3a\x2d\xb9\xc8\xd1\xd6\xe2\x24\xa0\x4f\x35\xad\xd1\x6f\x68\xac\x84\x60\x3c\x1c\xc4\x3e\x61\xd3\x52\x9c\xd4\x94\xe2\x19\x16\xda\xed\xbb\x78\xd5\x72\x42\xb6\x76\x0d\x8c\x99\x8f\x43\x3e\x3a\x44\x4d\xd0\xb1\x0f\x16\x46\xbb\x7e\x61\x08\x25\x50\x5c\x04\x0c\xd5\xfd\x1b\x17\x91\xe0\x66\x89\xcf\x14\xdc\x1d\x9e\xb1\x8a\xd9\x16\xc7\xfa\xe4\x4d\xa7\xde\x27\x75\xc6\x92\x66\xe7\xd8\xa7\x24\xda\x6b\x68\x66\xed\xb2\x97\x8e\x07\x01\x1b\x90\x71\x52\xcb\x7b\xb4\x96\x91\x24\xa2\xb5\xae\xb5\xa6\x35\xe0\xa2\xa7\xa1\xb9\x8b\x03\x59\xeb\x10\x6f\x40\xe5\x13\xeb\x2c\x7d\x9c\x7f\x00\x1d\xcd\x91\xbb\xff\xbf\x91\xeb\x57\xd9\x3c\x47\x31\x61\x29\x39\x8d\x68\xf6\xff\x40\xbc\x5f\xb6\x90\x62\xac\x78\xa8\xfa\xed\x90\xa7\x83\xab\x5e\x44\x74\x1f\x29\xa6\x21\x87\x1e\x69\xf8\x0d\x8f\x90\x06\x69\xc0\x5c\x38\x4f\x70\x85\x29\x5e\x44\xe6\x7d\xc3\xcd\x3b\x7f\x93\x8b\x93\x33\x77\x90\xd2\xb1\xf9\x5a\xd5\x29\x33\x28\x47\x09\xed\x9e\x5d\xac\x97\xcb\xd2\x1f\x23\x91\x5e\xf8\xee\xa9\xa6\xef\x44\xb6\x3c\x65\x2a\x7c\x95\x2d\x83\xfb\x0a\xe5\x0c\xb8\xa1\xac\x0d\xa1\xd9\xf7\xfb\x27\x02\xa6\x79\x4b\x21\x7e\xb5\xb0\x33\x39\xe7\xf7\x8a\x08\xbf\x57\xa5\x4d\xbb\xce\x74\x4a\x57\x85\xc2\x80\x61\xbc\xf8\x85\xba\x26\x38\x85\xb2\x3e\x91\xae\xe5\xb2\x1e\x42\xc0\xcc\xeb\xef\x7f\x6e\xf1\x00\x8b\xd8\x90\x11\x1b\x2e\xf7\x8e\xff\x1e\x63\x4e\x11\xe4\xdb\x74\xa7\xd3\x3f\xff\x64\xe9\x9b\x2e\xd8\xac\x00\x6f\x41\x60\xdd\x43\x56\x4d\x31\xe4\x5a\x36\x52\x6f\xb8\xb0\xdf\xf7\x8c\x8a\xb8\xe5\xc3\x1a\x50\xca\xff\xc5\x69\x40\xe1\x77\x4f\x1e\x1b\x7d\xed\x81\x09\x53\x82\x2d\x67\xf3\x13\x71\x08\xe3\x04\xd8\x0c\x26\xee\x96\xdf\x25\x52\x1b\x86\x23\x63\x11\x5b\x5e\x19\x5b\x6b\xce\x3c\xfc\xfe\x93\xd7\xfd\xea\xb6\x2c\xdb\xeb\x6e\xba\x8e\x8f\xdf\xc3\x6c\xde\xb2\xe0\x4a\xa5\xbc\x70\x84\xf5\xc4\x07\x0f\x87\xd6\xfc\x03\xcc\x6a\xaa\x62\x8e\xde\x97\xdd\x51\x0c\x56\x47\x0e\x56\xd6\xdf\x51\xe1\x32\x8c\xdb\x03\x45\x11\xea\x8b\x69\xa7\xbc\x9f\xee\xc3\xc2\x0a\xd7\x91\xb0\x47\x0b\x51\x61\xaa\x3e\x32\x5e\x28\x0e\x70\x54\x1a\x5e\x14\xa7\x23\xa2\x76\x2f\x77\x71\xc2\x85\xca\x3b\xf2\x24\xad\x9f\x32\xc4\x8d\x46\x81\x78\x09\x56\x68\xdc\xde\x50\xf7\x51\x84\x02\xa3\x15\xe0\xc8\x16\xdf\x14\x45\xdc\x6a\x62\x54\x1c\xe8\x40\x19\x01\x14\x40\x55\x21\x2b\x88\xe6\x3d\xd5\x61\x2e\x4e\x14\xbb\xbe\x8a\x3d\x7a\x46\x03\x38\x2a\x41\xc0\x96\xae\x8b\xa8\x38\x0a\xe3\x5c\xa0\xe5\x7d\x77\x68\x38\xc9\xad\x1e\xa0\xf2\x4e\x40\x99\xc2\xe9\x6b\xfc\x96\x73\x79\xd9\x95\xba\xae\x72\x9b\x0d\x05\x5a\x0e\xdd\xf2\x9d\x46\x83\xf2\x82\x8a\x13\x37\xa9\x50\x23\x66\x29\x28\xbd\xba\xd3\x96\x97\x57\x43\x3d\x04\x05\x5a\x79\xa2\x8e\x83\xae\xc5\xd6\xee\xae\xeb\x44\x62\x27\xc6\x77\x7d\x4d\x87\x82\x5a\x5c\x79\xc2\xd7\xc7\x41\x97\xba\x8e\xb5\x8a\x01\x4b\x1f\xf9\x46\xbd\x0e\x99\xfa\x4c\xa2\xee\x4b\x39\x26\x52\x98\x1c\x46\xaa\x24\x9b\x81\xd5\x4d\xd9\x23\x41\x94\xf9\x07\x3e\xf2\x50\x88\xa9\x5c\xef\x23\x79\x0c\x10\x1a\xd0\x13\xf7\x18\xb3\xe3\x50\x3f\xef\xf1\xa5\xf9\x85\x8b\x5a\x8c\xc2\x3e\x8a\x10\xed\xa6\x81\xe2\x1f\xb2\x50\x50\xe3\xfd\x88\x9a\x77\x71\x02\x77\x42\xdc\x76\x34\xc4\x90\x27\x88\x31\x8a\xbe\x1a\x29\x89\x02\x9c\x6d\x1a\x65\x09\x45\xa4\xb1\x88\xa4\x5e\xb7\xb6\x4a\x38\x89\xb9\xb4\x4e\xcd\x59\x42\xbb\xbd\x80\x4d\x4e\xab\x10\xd0\x23\xe4\xa3\x10\x11\x85\xea\x62\xa6\x52\x56\x56\x65\x11\x59\xe5\x6c\x85\xe0\x80\xfb\x18\xb2\x30\x77\xa3\x59\x2c\x76\x9c\x7d\x9f\xe3\x41\x4e\xb3\x91\x22\xa5\x27\x69\xb2\xa6\x48\x7e\x9a\xfa\xe6\x02\x9c\x93\x54\x1b\x45\xd9\x8d\x74\x03\x97\xef\x13\x57\x75\xb1\x25\xe9\x32\x56\x73\x33\x2d\xbc\x39\x3c\x70\xc9\x18\x29\x61\xda\x2b\x21\x25\x6d\xdf\x3d\xd2\x08\x1a\x6f\x5d\x4e\x15\x08\x9d\xc3\x72\x67\x55\xec\x07\x48\x12\xd4\x34\xae\x44\x84\x6a\x9a\x64\xba\x96\x66\x35\x4d\x72\x56\x7b\xab\xf4\x05\x56\x48\xbd\xae\xff\xbb\xd2\xf9\xee\x6d\x52\xa3\x71\xde\xa3\x99\x2c\x8f\x09\x82\x5c\xa6\x50\x08\xd3\x4b\x1a\x18\x6d\xeb\xf3\x84\xcc\xca\x0e\x2c\x3a\x2f\xa3\x8d\x72\x9b\xd7\xaf\x49\x90\x74\x4e\x82\x2c\x85\x09\xd1\x74\x4c\x40\x59\x81\x99\x83\x1a\x0e\xc8\x27\x14\xb1\x22\xa0\x9f\x3b\x7e\x97\x32\xe1\x72\x36\xf3\xd9\x78\x0e\x94\x99\x5a\x3d\xae\x97\x63\x12\x0c\x8b\x73\x9b\xb6\x4b\x0c\x6c\xf6\x87\x15\x07\x1f\xf3\xa2\xc8\xd7\x9e\xad\x1c\x60\x37\xff\xfc\xc3\x42\x16\x6a\x22\xb6\x52\x23\xb6\x3a\x23\xb6\x22\x23\xbe\x00\x5b\x86\x13\xe0\xdd\x90\x6b\x35\xb3\x05\x1b\x56\xe3\xa0\x81\xc3\xd0\x61\xc1\x7a\x5d\x0f\x1a\xf8\x1a\x9e\xb0\x80\x03\x9e\x61\x79\xa1\x11\xcc\xc0\x2e\xa1\x79\xea\xeb\x55\xf3\xc1\x3b\x91\x5d\x42\x2b\x97\x9c\xa1\x7a\xc9\xb9\x13\x95\xd9\xab\xca\xfa\xbb\xff\x24\xfb\xee\xab\xd9\x3b\x22\x77\xc0\x72\x57\x4f\xd0\x63\xb2\x24\x93\x5c\x8d\x7d\xbc\xe8\xb1\xed\x74\x99\xcd\xa3\x5e\x44\xaa\x8e\x82\x40\xf4\x84\x13\x9d\xb2\xf7\x9c\xa4\x79\xb1\x9f\xd1\x84\x68\x4d\x0a\x0f\x09\x01\x5e\xf5\x10\x45\xc0\xf7\xc0\xa0\xb8\x13\xeb\xd0\x3c\x73\xba\xb4\xa9\x22\xe8\xbd\x0c\x88\x47\x07\x36\x81\xd2\x12\xd5\xbf\x60\xd4\xe7\x47\x97\x73\x36\x81\x7b\x94\x04\x34\x2b\x4c\x03\x13\xc3\x99\x15\x5a\xa1\x6c\xf9\xc2\x96\xd3\xe7\xc5\x1a\xad\x10\xb3\xff\xdd\xaf\xae\x9d\x88\xa8\x7a\x7d\x02\x53\x07\xfb\x00\xd7\x56\x2c\x60\x82\x7f\x2b\x0e\x6c\x72\x93\x6b\x85\x6f\x61\xd8\x62\x86\xb0\xbf\xa4\xdc\x8a\x1a\x2b\x98\x1b\xab\x9a\x19\x33\x9f\x8d\xb4\x11\xa6\xce\x29\x93\xd0\xbb\x2c\x27\xa6\xb0\xf3\x2f\xdc\x94\x46\x44\x67\x31\x6c\x09\x0f\x5a\xb7\xb7\x3a\x41\x4d\xc3\x26\x62\xf3\x1a\x54\x36\xaf\x03\x1c\x88\xad\x6b\x3f\xd6\x07\x86\xc1\xb6\xa8\xf6\xa0\xdc\x9a\xae\x32\x0e\x0d\x8a\x4a\x0c\x8c\xe5\x1b\x2d\x50\x16\x08\xd9\x14\x92\x3e\xd6\xb4\x06\xf7\x84\x3a\x80\x9a\xad\x62\x20\xaf\xcc\x77\x01\x20\x2b\x51\x43\x83\x8d\x89\xd6\xe0\x70\x0d\x4d\x6e\x50\xf8\xae\xb5\x9c\x29\xb5\x06\x20\x70\x06\xa6\x8f\xa3\x5b\x86\x96\xcd\x02\x67\xbe\xcb\xb7\x97\x8a\xa2\xa3\xe5\x24\x5b\xa1\x93\xc8\xca\x0d\x71\xbb\x87\x86\x98\xe1\x4f\x5c\x27\x89\xf5\x21\xe3\xfa\x19\xcc\x90\xc3\xe9\xf4\x33\x54\x69\x68\xb4\x86\x78\x68\x3e\xd8\x1c\x0c\xbf\x3c\xd8\xc3\x59\x29\xf2\xd2\x6e\xe2\x76\xf7\xd9\xf0\xe5\xdf\xfd\x6e\xe2\x4e\xa7\xec\x17\x63\xbc\x13\x15\x3e\xc5\x86\xb2\x9f\x0d\x0d\x83\x95\x5b\x70\xf0\x5e\x44\x75\x8a\x98\xbe\x88\xf9\x5a\x02\x0d\x45\xd4\x63\x54\x44\xdd\x89\xa8\x62\xfe\x19\x1a\x68\x08\x06\x7b\x87\xdc\x32\x51\x63\xc8\x0d\xce\x34\x86\xdc\x9e\x4c\x63\x28\x0c\xf9\xee\x46\xf6\x4e\x34\x77\x40\xa0\xda\xb7\xae\xa5\xa1\x38\x4b\x8c\x13\xd6\x58\x8d\x0b\xda\x48\x0c\x07\xea\x34\x9c\xcd\x66\x3f\x75\xbf\x7b\xe6\xcd\x5f\x63\x88\x31\xdd\xdd\x77\xa7\x53\x9f\xc9\x35\xfd\xae\xe7\x4e\xa7\xed\x9e\x31\x5b\x6a\xd0\xec\x87\x54\x3a\x50\xae\x1c\xc3\xa1\x2e\xc7\xbc\x72\x44\x1b\x47\x8a\xef\xaa\xf2\xcc\x45\x58\xe7\xe7\xf3\xbb\x1e\xb4\xac\x2d\xec\xd9\xde\x56\x68\x48\x2f\xe3\x98\x3a\x86\x30\xe8\xcf\x84\x2f\xe4\x35\x30\x57\xf7\x2e\x6c\x3d\x73\x55\x9a\xdb\x88\xe0\x97\xed\x67\x62\xff\xa0\x68\xe7\x99\xd8\x3f\xa9\x72\xca\x1c\x0e\x15\xa3\x90\xa7\x13\xec\x61\x8c\x7f\xd0\xd6\x0f\x6a\xff\xa4\x8e\x10\x3c\x20\xed\xf3\x44\x39\x1e\xfc\x91\x8e\x6b\x3e\x19\x0c\x68\x50\xe3\x9e\x2d\xcc\x87\x78\x34\x26\x83\xf8\x99\xc0\x79\xe0\x1e\xc9\x09\xec\xbd\x75\xa3\xb4\xa1\xd6\xa3\x35\x2d\xa1\x8f\x5a\xad\x4f\x27\x8f\x69\x16\xbc\x35\x1c\xd2\xe2\x53\x53\x8b\x60\xb0\x68\x6d\xf7\x19\x2f\xc4\x25\xc2\x19\x1c\x39\x71\x35\xeb\x32\x78\x97\x63\x62\x0e\xb9\x1c\x86\x64\xa3\x9c\x79\x6e\xbd\xfe\x53\x87\x00\xfa\xae\x2f\xdc\x39\x7f\x01\x2b\xf9\x80\xc0\x30\xca\x5c\xbe\x2b\xef\xfb\x4e\x42\xfe\x5d\x3c\x3a\x7b\xb5\x70\xee\xd9\x90\x63\x65\x4b\xf0\xec\x87\x1e\x0e\xd1\x9b\xd4\x50\x14\x4e\x78\x2d\x5e\xa4\xb5\xf0\x33\xd6\x51\xba\xdc\xc6\xe4\x99\xcf\xc3\xea\xb3\x57\x78\xe2\xc3\x84\x30\x7f\x5e\x2c\xee\xee\xc3\xdc\x44\xf9\x95\x3d\xad\x5c\xd9\x53\xfe\x26\x56\xdd\x99\x88\x83\x4f\xd2\x0d\xd9\xac\xca\x77\xe0\x91\x14\xec\x23\xf3\xc1\xe1\xe3\xaa\x2f\x67\xfc\xc2\x03\x72\x84\x77\x53\x3d\x32\x50\xc4\x9a\x21\x32\x50\x81\x01\x47\xc6\x6c\x36\x9b\x5d\xe3\x70\xc8\x9f\x3a\x9f\x89\xa3\xfb\x6b\xd6\x59\x44\xe8\xa4\x88\x13\xfc\x71\xae\x19\x6f\x44\xe8\xf8\x35\x13\xa7\x27\x61\xf7\x2b\x18\x44\xdd\x7f\x0d\xe2\x4c\x42\x7c\xaf\x9a\x3e\x8d\x86\x42\x4f\xbf\xa2\x90\xc5\xc0\x89\x6b\xc6\xc1\x74\x7a\x3a\x73\x1e\xe7\x9f\x94\x94\x5a\x86\x02\xf8\x15\x1f\x3f\x66\x1c\x28\x8e\x78\x7d\x47\xee\xdc\x67\x86\xb3\x72\x6d\x5e\x90\xbf\xa1\x44\xac\xf9\x25\x41\xdd\x6b\xd6\xe4\xdc\x82\xec\x9b\xf1\x3f\xae\x47\xf7\xc1\x83\xaa\xdf\x65\x4b\xad\x02\xb3\x55\xed\xa1\xa7\xf8\x62\x16\xe3\xc8\x3e\x65\x99\xf6\xfe\x79\x31\xfb\xee\xcc\x89\x16\xdf\xeb\xc5\x65\x1e\x99\xbd\xd8\xc7\x42\xee\xfd\x11\x00\x8a\xd3\x03\xc7\x87\x4b\x3b\xdf\x7c\x40\x01\x56\xbd\x78\x2b\xdb\x63\x83\x35\xf5\x08\x2f\xdd\xb3\xca\x0e\x41\x58\xb7\x63\x15\x5f\xb9\x36\xdb\x04\xff\xcf\x34\x9d\xf2\xf3\x9f\xea\x15\xd4\xaa\x3c\x74\xf3\xcd\x50\xae\x5b\xbe\x19\x1a\x8c\xee\x50\xb1\xb3\xf9\xc5\xef\x12\x17\x97\x41\x18\xb0\xca\x25\x34\x44\x22\x1f\x53\x58\x01\x5e\x66\x0e\x0b\x60\x1f\xfc\xdf\x99\x41\x68\xb4\x18\xc2\x20\xb4\x75\x0e\x2f\x15\x05\x91\x9c\xb6\xa7\x53\x3d\xc0\xfd\xa1\x4e\x51\xa1\x92\x68\x18\x88\x65\xc1\x81\x51\x6a\x0b\x3b\xd7\x66\x6f\xb8\xe0\xe8\x7d\x39\x13\x78\x26\x9d\x60\x9d\x54\x58\x61\xd4\xeb\xc4\x64\xcb\x3e\xb8\xe8\x27\x2d\xd2\xf5\x5d\x71\x06\x73\x6d\xde\xde\xfe\x8f\x0c\x76\x7c\x70\x2e\xf6\xf2\xc0\xcf\x75\x42\x8e\x11\xcd\x35\x22\x78\x27\x65\x53\xb5\xee\x9b\x43\xfc\x52\xba\xd7\xf7\xcd\x21\x2b\xfe\xf3\xe4\xb5\x71\x7f\x97\x43\x07\x78\x5a\x62\xcd\x15\x0b\x80\xe2\x44\xac\x5e\xe7\x77\x59\x2d\xaf\x4b\xca\xaa\x7d\x7f\x20\x8b\x9a\x47\x6c\xe9\x60\x89\x3f\x1e\xe6\x7b\x96\x48\x96\x8a\x49\x77\x39\x90\x2b\xc2\xac\x33\x78\x40\x30\x59\x68\x0d\x00\xf1\x7d\xb1\x7e\x73\x21\x55\xba\x8c\x64\x59\x3a\x4f\xbf\xcc\x22\x32\xf8\x6a\x96\xdb\xc7\x7f\x92\x45\xe6\x34\x84\x89\x08\x79\x61\x37\x97\x97\x89\x14\x90\x1b\xc4\x60\xcf\xe8\xfa\x2e\x0e\x80\xb9\xbe\xbf\x00\x8a\xe8\xaf\xba\x40\xa8\x74\x7e\x27\xac\xd7\xc3\x2e\x5b\x74\x75\xf6\x0f\xb8\x15\x56\xbb\x48\x38\x9d\xea\x21\x7e\x59\xec\x15\xa1\xe1\x2c\x1d\x93\x72\x29\x16\xaa\x22\xf5\x7a\xca\xdd\xe0\xae\x86\x44\xf7\x8d\x56\x68\x3e\xe0\x1e\x0b\xd9\xfa\xad\x24\x8c\x49\x3d\x2c\xde\x37\x96\xe3\x84\x67\xfe\x26\x1b\x55\x85\xdf\x89\xd0\x1c\xe2\x84\x85\x5b\xd4\x7e\x99\x01\xf7\xae\x17\xba\x83\xc2\x04\x85\xfa\x21\xef\x05\xf1\x87\xe5\xed\x73\x70\xa8\x13\x03\xba\x3d\x83\x3a\xce\x5e\xc7\xa9\x0c\x28\xc0\x2c\x47\x2f\x77\x0e\x06\xc3\xd5\x83\x53\x81\x16\x63\x58\xd1\xa7\x0f\x0e\xab\x76\x3b\x4a\x84\x44\x45\x06\xd2\x91\x4e\xaa\x43\x8e\xb0\x21\xb7\x72\x6d\x7e\x5d\xa8\xab\xb2\x38\x9c\x13\x65\xd9\x02\xcd\xe6\x6b\x73\xe0\xff\x22\x83\xb2\xea\x0a\xe6\x1c\xbe\xd2\x79\xdb\x99\xca\x9c\x68\x7e\xe2\x89\x96\x32\xe7\xec\x5f\x30\xa7\x9d\xbd\xb6\xe4\x11\x15\xd9\x2f\x99\x33\x0c\xe7\x07\x38\x1b\x3e\x64\x15\xe3\x52\x1a\x91\xbd\x14\x64\x3f\x54\x16\x63\xb0\xfd\x95\x70\xfd\xfd\x12\x07\x36\x13\x42\x10\xdf\x69\xfb\x2c\x28\xcf\x3a\x4e\x4b\x6b\xe0\x4c\xf4\xe3\xf2\xdd\xaa\xd7\xd7\x77\x43\x82\xfc\x25\xdb\x4b\x06\x8e\x6a\x5a\xc3\x6f\xbc\x45\xb0\xc5\x14\x17\x4f\xda\xdb\x86\xee\x71\xd9\xc2\x03\x99\x87\x18\x8d\xb7\x9a\xf9\x56\xe8\x78\x7a\x66\x96\x0e\xa8\x11\x60\x8f\xd5\xf8\x65\x26\x16\x9f\x00\xa2\xd9\x5a\x0d\x01\xec\x23\xcf\x1c\xb2\xf1\x21\x6b\x38\xa0\x2e\x38\xb8\x17\x96\x59\x14\x0f\x07\x20\xae\x39\x5e\xa3\x61\xc8\x4f\x8f\x8d\x68\x99\x61\x6e\x31\x80\xce\xf3\x25\x5a\xde\x1b\x86\x61\xd9\xd3\xbe\xba\x48\x78\x28\x5d\x90\xfc\xd6\x9a\xca\x46\x65\x50\x9e\x32\xfb\xf8\x27\xcc\x09\x8e\xbc\xbc\x33\x1f\x54\xb7\x96\xd7\xe6\xb3\x35\xd7\xbf\x8a\x36\x3c\x59\x6c\xc3\x58\x69\x43\x6e\x36\xbb\xf0\x1d\xe5\x63\x6f\xfe\x92\xda\x03\x57\x1e\x4c\x54\x14\x97\x59\x70\x14\xfb\xc9\x5b\x6c\x38\xbe\xc5\x0c\xf9\x05\xf3\x69\xb6\x9d\x65\x64\x62\xcb\xab\xcd\x83\x50\x89\x85\x2b\x6b\x71\x0d\x5d\x8b\xf3\xda\xa8\xbc\xf7\xac\x25\x69\x22\x95\x35\xe5\x15\x28\x57\x6e\xb9\xbf\xd5\xb9\xa6\xce\xbc\x83\xc7\x5f\x95\x5f\xb9\x53\x95\x25\xa6\x59\x71\xc0\xc4\xb6\xc6\x10\x18\x81\x1d\x00\x3a\x18\x8c\x54\x45\x00\xf5\x86\xa2\x72\x6d\x10\x62\xbf\x4b\xc5\x15\x43\xa9\x2d\x17\x1a\xe5\x05\x52\xd9\xaa\xfc\xc2\x07\x4e\x76\xe6\xba\x8c\x7a\x42\x10\xf2\x63\xe6\x10\x4e\x50\xca\xcc\xd5\x63\x94\x28\x7e\xa0\xdc\x48\x77\x6d\x14\x3f\xd3\x5a\x10\x87\x21\xcd\x68\x92\xf3\x27\xa9\x5a\x63\xa5\xcc\xd9\xd0\x6a\x3a\xdb\x82\xca\x4a\x87\xf2\xb8\x45\xde\x28\xe7\x6c\xbf\x6a\xa8\xd5\xed\x63\xcb\xe9\x6f\x01\xcd\x7d\x49\x33\xeb\x86\xd0\x5d\xfa\x28\xec\xf6\x5d\x63\xc1\xbd\xe6\x03\xcd\x26\x70\x0c\xc4\x89\x93\xc7\xf0\xe2\xb4\x99\x55\x54\x65\x38\x14\x87\x5f\x66\x4e\x68\xfa\x38\x72\xe4\xd5\x52\xb3\xfd\x1e\x63\xe1\xdf\x39\xc2\x01\x1a\xc7\x7a\x70\x2b\x57\x52\x44\x90\x65\x80\xe3\x60\xe0\x1e\xdb\xae\x35\x00\x18\xae\xac\x8c\x99\x8f\x03\xe7\x57\x19\x7c\xc5\x1f\x6b\x20\x86\xd9\xb5\xe9\xef\xcc\x5b\x85\x52\x6c\x61\x4d\xa7\x7d\xf5\xa0\x10\xf0\x3e\x5b\x7a\x39\xa4\x90\x7a\x70\xb8\x2d\x5c\x19\x0b\x16\xe4\x69\x8d\x04\xc1\x45\xfa\x38\x9a\xe7\xc6\xb2\x2e\xa8\x19\x0e\x4c\xc6\x97\xf7\xf3\xf4\x2c\x92\xe0\xef\xe8\x5d\xe2\x56\x9c\xd5\x96\xc3\x80\xf5\x64\x41\x47\x3c\x9a\x27\x05\xb1\x71\xa6\x28\x28\x09\x75\x91\x94\xb7\x90\x56\x9d\x8c\xfc\x1d\xbd\x09\xf3\xd9\xe5\x70\xd9\x9b\x1e\x5f\x76\x09\x02\x40\xc1\x52\xa0\x40\x05\x4a\xbd\xb9\xbd\x69\x39\x1d\x39\x04\x6e\x28\x01\xb4\xea\xd4\x4a\xea\x9f\xfb\xaa\xda\x48\x2b\x30\x1f\x84\xf4\x4d\xe0\x4e\xb0\x68\x72\x03\xf6\x5b\xe3\xce\xdf\xec\x04\x41\x20\x1e\x75\x5e\x93\x2c\x4a\xa8\x83\xca\x7e\x7a\xfe\x58\x0b\x8a\x9d\x8c\x74\x78\xc6\xb3\x72\x6d\x4e\x96\xbd\xed\xda\x4b\xf5\x17\x3f\x1d\x8c\x6c\xb9\x01\xcf\xd2\x47\xf1\x71\x12\xa2\xa1\x2d\x65\x7f\xd4\x4e\x8d\x99\xb3\xbb\xbc\xc0\x20\xa9\x16\x76\x6d\x9e\x77\x96\x31\x9c\x56\x5b\x25\x3f\x5a\x06\x14\x55\x81\xee\xa3\x79\x61\xc7\xfa\x04\x2f\x09\x96\x2e\x17\x88\x34\xbc\x4f\x95\x55\xc5\x53\x16\x99\x35\x79\x8c\x75\x22\x17\x55\xcf\xe0\xc2\xfa\xee\xe2\xce\xe4\x1e\x16\x37\xde\xc9\x86\x0b\x44\xc0\x39\x34\xa3\xc4\xa8\xf4\x14\x55\xc6\x91\x94\x9c\x55\x29\x39\x13\x94\xcc\x2d\xef\x15\xb3\x6b\x96\xe3\xab\x0b\xbc\xaf\x2c\xf0\x7e\xb9\xc0\x7b\xc6\x8c\x11\x47\xdf\x2f\x12\x3f\x2c\x88\x2f\x17\xeb\xe1\x82\x53\xd3\x3b\x26\x78\xdd\x0d\xb9\xd7\xe5\x8c\x08\x4b\x7a\x77\x43\x7e\xce\x79\x17\x11\xfc\x92\xd1\xc0\x1e\xf5\x90\x37\x18\x53\x3b\x8f\x50\x94\x51\x9a\xd8\x27\xaa\x43\xb1\xa4\x50\xd9\xb0\xb6\x3c\x71\xb3\xb5\x4d\x08\xba\x1b\x22\x82\x52\x02\xfb\x23\x6a\xcc\x56\x72\xa2\x0f\xfe\x4e\x15\x5d\x7d\x15\xe8\x21\xb6\x65\xbf\x8b\x13\x44\xd9\x7f\xf2\x24\xbc\xa3\x96\x8b\x59\xc0\x4f\x1c\x31\xa6\x46\x88\x89\x79\x39\xd4\x8b\x0d\x3d\x05\x65\x84\x90\x65\x93\x51\xfc\x65\x08\x7f\x84\x6b\xa1\x90\xfd\x37\x0c\x27\xf8\x04\xb0\x21\x0e\xa7\x53\x89\x42\x64\x44\x01\xe6\x50\x4e\xc0\x11\x5a\x18\x07\x2d\x8a\x9b\xb6\xb5\x15\xb4\x02\x6c\xd9\x14\x5b\x72\x1f\x46\xd7\x02\x14\x61\xbf\x70\xf5\x1a\x09\xe3\x5d\x01\xe2\x25\x52\x14\x19\x06\xea\x63\x1f\xdc\xb3\x37\x2d\x0b\x0d\xb0\x6f\x8e\x7a\xe9\x23\xdc\x5c\x8a\xd7\x2b\x83\x7a\x5d\x1f\x14\x16\xdb\xf8\x05\x02\xb7\x5d\x1e\xad\x05\xc6\x7a\xf8\xae\x6f\xa0\x21\xee\xaf\x25\x68\x84\x2d\x67\x24\x94\xf5\x47\x72\xc9\x1f\xf3\x93\x67\xb6\x3d\x44\x0f\x6c\x60\x8c\x17\xa8\x18\x1b\x06\x7a\xc6\xbd\xee\xc4\x73\x75\x7d\x2c\x91\x3a\x0f\xac\xd5\x76\x08\x9b\xaf\x86\xfa\x53\x0f\x35\xd1\x03\xaf\xd9\x0e\x4e\x22\xa2\xfb\xdc\x95\xf9\x99\x78\x2a\x81\xf2\xc8\x40\x7b\x6a\xca\x89\x90\x87\xd0\xa8\x67\xa0\x13\xec\x9b\x41\x46\x1e\x7f\xd2\x2c\x3d\x8a\x13\xda\x5a\x69\x82\x5d\xb5\xa4\x35\xde\x8a\x5a\x7a\x32\xd4\x3b\x3d\xf4\x8c\x1e\x0c\x94\x0c\xf5\x3d\x94\xac\x41\xd8\xda\x3a\xa9\xd7\x93\xa1\xfe\xbd\x87\x4e\x44\x5a\xa7\x87\x86\xe8\xc1\x30\x6c\x91\x27\x79\x05\x6e\x07\x3d\xaf\x25\x65\x9e\x3e\x20\xe4\xb9\x76\x8a\x82\xca\x04\xb5\x8e\x63\x4c\xcc\xde\x90\xb1\x0c\x7d\xf6\xc4\xeb\x48\x8c\xc7\xf5\xba\xce\x52\xda\x84\x33\x93\x3f\x5e\x10\x40\x8c\x87\x60\xea\x02\x98\xf6\xa6\x67\x20\x08\xb0\x58\x08\x3c\x11\x22\x9e\x43\xb0\x0c\x0f\x85\x15\xe6\x8a\xbf\xde\x44\xde\x33\x12\xac\x93\xe9\xf4\xd4\xe0\xef\x59\xe4\xe4\x7e\x17\x11\x38\xe4\x52\x95\xcf\xd3\x61\xb9\x01\x2a\xdd\x25\x12\xf9\x86\xe9\xae\x70\x7a\xef\xc9\xa8\x7e\x01\x35\x64\x83\x1f\x22\x04\xcc\x70\x08\x8f\x1f\x60\xa4\xc5\x27\x58\x28\xe6\xdf\x9e\x60\x4f\xd8\xb4\xeb\x63\x61\x56\x6e\x7b\x82\x83\xd9\x19\xd1\xd3\x85\x37\xaf\xca\xe1\x4f\x7c\x82\xc4\xb0\xbd\x3d\x71\x16\x14\xec\x84\xea\x96\x27\x6f\x49\x7c\xe7\x4e\xdc\x30\x08\xea\xed\x05\x4a\xc5\x0e\x53\x64\x9c\x4e\x09\x9b\x6a\x8b\x1b\x2f\x7f\x3a\x25\x5b\x3e\x5b\x6a\x80\x2a\xf3\xdb\xab\x3e\xbb\xae\xfa\x33\x01\xd3\x5b\xb6\xfc\x89\x1a\x2a\x5c\xbe\x1f\xaa\x47\x2f\xe9\xb0\x7b\xe4\x16\xe6\xef\x90\x8f\x4e\x05\xcf\x0e\x36\xb1\xb7\x46\x1c\xf9\xce\xe8\x60\x53\x6e\x60\x0e\x36\xb1\x7c\x7e\x7b\x30\x22\x78\xff\x4e\xdf\xbd\xd3\x03\xc3\x4c\xe5\x86\xee\x6b\x11\x4b\x21\x76\xf6\x43\xbf\x1f\xa2\x74\x68\x38\x2b\xf7\x0b\x84\x0a\xff\x3b\xf7\xaa\x98\x75\xea\x10\x7c\x74\xa7\xcb\x22\x90\xc4\x8a\x9a\x6b\xba\x70\xdf\x16\x9f\x18\xeb\x82\x9a\xa2\x4b\x1d\xdc\xe9\x55\x2d\x01\x75\x71\xc8\x86\xba\x58\x1b\xc6\x97\xb8\xeb\xce\x32\xa0\x84\xc9\x65\x24\x89\xe8\x6b\x07\x58\xe3\x4b\xf0\x24\x4c\x1f\xd5\xbe\x69\xcc\x1c\x9e\x9b\x3e\x2c\x6e\xdd\x19\x4f\xe7\xb2\x56\x18\x6e\x70\x3f\x5c\xd9\xab\x6f\x27\x4b\x7d\x50\x1f\x64\x60\x50\xbb\x84\x7f\xc5\x03\x4a\xf8\xf7\xb5\x67\x70\xcb\x29\x73\x6f\x9a\xca\x6d\x53\xf1\xae\x09\x95\x0e\x87\x25\x69\x55\xa5\x75\x19\x1b\xf2\xcb\x9b\xee\x85\x70\xa4\x1a\xe2\xc8\xfc\x16\xe8\x6c\x7d\x88\xcc\xde\x48\x0f\x0c\x27\xe4\xae\x65\xaf\x3d\xd2\x08\x1b\x51\x68\x38\x01\x8f\x18\x47\x8d\x00\xbe\x85\x7a\x65\xe5\x35\x14\xad\xba\xf2\x86\x11\x20\x3b\xe8\xe6\x87\xf6\xef\xef\x58\xbb\x35\x3e\xb4\xdf\xbf\x63\x6d\xd7\x68\xb6\x37\xdf\xb1\xf6\x6b\xe8\x42\xe7\xb2\x45\xba\x9b\xae\x6d\xa9\xed\x39\x1a\x56\xac\xbf\x4e\xa7\xa7\xe5\xdd\x66\x1a\x55\xdc\x23\xa1\x48\xf1\x5b\x17\xd6\xeb\x51\x37\x5c\x6b\xba\x18\x6f\x7b\xa4\x15\xd8\x1e\x9b\x03\x09\xf2\xbb\x7d\xa2\x53\xd4\xb4\x0c\x17\x7c\xa0\x8f\x16\x1a\x88\x77\x0b\x79\x4d\x66\xb9\xe2\xcd\xa7\x5f\xaf\xf7\x62\xdd\xe7\xa7\x87\x3a\x85\xf3\x67\xb9\x70\x3b\x8a\x87\xf9\xaa\x4f\xf4\x50\xbe\xea\xe2\x46\x04\x5f\xf4\x9b\xa0\x61\xcc\xd6\x23\xb6\xe9\x4a\x23\x82\x02\x6e\x8c\x12\x85\x38\x94\x1e\xcb\x75\xd3\x58\x8f\xd0\x2e\x35\x1c\xbf\x25\x3d\xa5\x53\x78\x06\x6b\xc3\x5c\xcc\x5d\x41\x31\x46\x07\xb1\x9e\xf8\x04\x05\x43\x79\xc2\x5b\xbe\x92\x83\x5f\x6e\x49\x81\x3f\x46\xe3\x1a\x2a\xdc\x7e\x41\x20\x6c\x08\x30\x04\xda\xd2\x2b\xd6\x13\xd8\x39\xf1\xd7\x31\xe6\x78\x44\x4f\x60\x4d\xdc\xed\x91\x8c\xf8\x39\xcd\x46\x07\xe1\xf6\x03\x89\x07\x6c\x53\xab\x55\x66\xd2\xeb\x90\x60\x32\x2b\xe8\xf9\x67\x05\x28\xcf\x01\x35\xd4\x09\xc9\xbf\xcc\x5e\x3c\x1d\xd4\xd0\xd5\xbf\xce\x3c\xf7\xce\x50\x43\x74\xf8\xf7\x18\x76\x99\xa4\xc0\x11\x68\x28\xab\xb0\x9f\x0f\xf8\xac\x64\xff\xdc\x04\x54\xfd\x2c\x53\xbf\x64\x24\x88\x69\x92\xab\x50\xf4\x81\x38\x2b\xaf\x12\xb1\x43\x0a\x12\x06\x15\x12\xb8\x70\x3a\x50\x7a\xc0\x6b\x28\xb6\xb3\x2c\x7d\x94\x48\xc6\xa9\x8a\x64\x0c\x06\x39\xc6\xe9\xdf\x23\x39\xe3\x87\x8f\x12\xcd\xa8\x42\x0b\x1f\x5e\xa3\x7f\x40\xcb\x1e\xc9\xa9\xc4\xe1\x55\x70\xf0\xf7\xe7\x5e\x89\xc3\x5b\xe8\xd1\x9e\xd2\xa3\xff\xc9\x90\x78\x8d\x08\x50\x2b\x78\xad\x75\x7f\x9d\xeb\x9f\x37\xc7\xeb\x4d\x0a\x88\xfe\x4f\x1a\x05\x30\xfd\x1f\xb5\x0c\xe0\x7a\xa5\x79\x9c\xc7\x38\x09\xd2\x47\x93\x67\xac\xd7\x2b\x9f\xe6\x20\x25\x01\xcd\x96\xc7\xb2\xde\x3d\xf8\x45\x52\x95\x88\x7a\x5d\xff\x87\x90\xaa\x6c\x04\xfe\xc8\xe5\x41\xcd\xa8\x6b\xb9\x70\x80\xb0\xb2\x52\x2a\x53\xe4\xc3\xca\x4d\x31\x31\xd3\x84\x61\xc6\x8a\x49\xa0\xf1\x3c\x48\x10\x8f\x86\x24\xf7\x7b\xed\x07\x9a\xe4\x2a\xe4\xc3\x3c\xe4\x88\xe6\x67\x24\xef\xa9\x30\x8f\x0b\x30\x3e\xdb\x89\x7e\x57\x61\x9e\x96\xc3\xfc\x50\x61\x26\x8b\x65\x25\x15\xb2\xb7\xe7\x01\x22\xca\x7d\xcb\x2a\x30\x5f\xe6\x61\xfa\x74\xb2\x9b\x06\x15\x98\xfd\x79\x98\x1e\x49\x82\x01\x5d\xa8\xfc\xc1\x3c\x9c\x17\x57\x09\xfa\x3a\x0f\x40\x06\xf9\x21\x9d\xa8\x20\x87\xf3\x20\xa0\xd6\xaa\x42\x1c\x2d\x61\xf1\xe9\x90\x25\x8d\xb0\xa7\x7a\x7c\x5c\x52\x7b\x0e\xa7\x62\x3b\x59\xc0\x96\x93\xbc\x52\xfb\xd3\x85\xfe\x51\x14\x56\xc0\x9c\x2d\x29\xeb\x72\x1e\xd1\xf9\x62\x47\xcb\x28\x09\x26\x50\xa2\xdf\x83\x59\x5f\x01\xbf\x98\x07\xf7\x49\xe2\xd3\x81\x0a\x72\x39\x0f\x72\x47\x73\x32\xc7\xd0\xce\x02\x1a\x78\xc1\x9f\x77\x48\x16\xd1\x4a\xf3\x5d\x2d\x40\x0e\xd8\x72\x54\xe9\x97\xdf\x96\xc3\x54\xfa\xe5\xf5\x22\x4b\xd3\xa1\x0a\xf0\x7d\x1e\x20\x8f\xf3\x41\xa5\xee\x3f\x16\x3a\x8a\x97\x66\x79\xa5\x79\x7f\xce\x83\x54\xa7\x00\x05\xd9\x9b\x85\xe2\x16\xaa\x4e\xee\xe7\x07\x78\x46\x1e\x59\x71\xb0\x2d\xbc\xc7\x5a\x46\x07\x24\xa7\x01\x67\x9a\x86\xfc\x7b\xac\xf9\x03\x4a\xb2\x4e\x7c\x47\xd3\x71\xae\xa1\x00\x80\x1e\x68\x36\xa2\x1a\x7a\x83\xb5\x80\xe4\x44\x43\xf4\x1e\x6b\x43\x16\x9d\xe4\x7b\x5c\x7b\x57\x43\xe1\x3d\xd6\x2a\xf3\x87\x86\xa2\x7b\xac\x89\x89\x42\x43\xbd\x7b\xac\x1d\x6f\x7f\xff\xeb\xdb\xf6\xd1\x55\x5b\x43\x31\xa4\x25\x81\x86\x6e\xef\xb1\x26\x46\xb0\x86\xfa\x8c\x82\x1e\xc9\xd8\x58\xd5\xd0\xe0\x1e\x6b\x62\xe0\x6a\xe8\xee\x1e\x6b\x47\x24\x3f\x4a\x22\x0d\x25\xf7\x58\x53\x46\xab\x86\x52\x8e\x84\xeb\x8c\x1f\xb0\xb1\xa5\xa1\x21\x2b\x22\x1d\x67\x3e\xd5\xd0\xfd\x3d\xd6\xbc\x74\x9c\x04\x23\x0d\x65\xf7\x58\xe3\x23\x54\x43\x23\x56\x1e\x98\x21\xd1\x50\x7e\x8f\xb5\x9c\x0b\x7e\x63\x16\x4c\xbf\x5e\x9e\x9e\x68\xe8\xa1\x28\x77\x47\x20\x78\xe4\x85\x29\x86\xb3\x34\xf4\xc4\xeb\x5a\x30\x6e\xc2\xbe\xf3\x74\x78\x96\xa5\x43\x12\x41\xe3\x69\xe8\x99\x03\x89\x61\xad\xa1\xed\x7b\xac\xdd\xd1\xd1\x88\x44\x54\x43\x3b\xec\x83\x0c\x47\x1a\xda\xe5\xf8\x39\x98\x86\xf6\x00\x15\x90\xd8\xbe\xc7\x5a\x2a\x73\x7f\x86\x56\x48\xf3\xd4\x4f\x07\x1a\xfa\x72\x8f\x35\x9a\x30\xf2\x03\x0d\xed\x4b\x0a\x21\xd7\x01\x34\xe2\x5d\xfa\x40\x4f\x80\x93\x2b\x5f\x19\x1a\xf0\x71\xfc\x5d\x43\x87\xc5\xc7\x0f\x0d\x1d\xb1\x8c\x24\x88\x68\x3e\xd2\xd0\x31\x94\x46\x13\x0d\x9d\x30\x36\xc1\x38\xd5\xd0\xe9\x3d\xd6\x2e\xe8\xfd\x98\x8e\xf2\x33\x92\x91\x3b\xca\xc4\x66\x0d\x9d\x33\x0e\x8f\xf3\x9c\x51\x7c\x01\xf5\x82\x31\xab\xa1\x4b\x96\x57\x1d\x9c\x1a\xea\x00\x41\x24\x98\x08\x02\xaf\x58\x8b\x04\x01\xb4\xe5\x51\x3c\xca\x69\x42\x33\x0d\x7d\x63\xf5\x23\xd0\xf3\xae\x05\x37\x35\xf4\x9d\x81\xb2\x51\xa3\xa1\x1f\x0c\x71\x9e\x0d\xa0\x94\x9f\xbc\xc6\xbc\xaf\xbd\xb9\xc7\xda\x43\x4c\x1f\x35\x44\x32\xd6\xa6\xbc\x54\x2f\xc3\x1a\x1b\x00\x1a\xf2\x33\xac\x8d\x7a\x71\xc8\xfb\xc0\x30\x22\x58\xbb\x49\x6e\x9e\x36\xfd\xf5\x91\x9f\xc5\xc3\xfc\x93\x86\xee\x21\x32\xd3\x50\xc6\x02\xb5\xae\x86\x46\x10\x20\x79\x6d\x10\x27\xb4\xa6\xa1\x1c\xbe\x83\x94\x72\x03\xdf\x61\x9c\xcb\xfb\x99\xbc\x47\x6b\xbb\x69\x92\x67\x29\x5c\x5a\x7d\x53\x47\xb0\x7c\x05\xef\x73\x09\x44\x43\xe3\x45\x34\x6a\xfe\x0a\x78\xed\xb1\x17\xc3\xc3\xcc\x24\x18\xc4\x49\x54\x7b\x0b\x4c\x7c\x5b\x83\x91\x68\x6a\xe8\xe1\x5f\xe0\x32\x35\xb4\x12\x64\x78\xd1\x78\xdb\x5b\x0d\x3d\x46\x04\xbf\xd5\xb4\xb7\xe8\x09\x02\x9f\x6e\x92\xb7\x68\xc2\x70\xff\xb6\xb1\xa1\xa1\x67\x1e\xfa\x43\x43\xdb\x2c\x54\xcf\xe8\xfd\x38\xce\x28\x19\xe7\x3d\xdc\xac\x6b\x88\x66\x58\x7b\x6b\x6a\x28\xcc\xb0\x66\x9a\x1a\xda\x61\x50\xe6\xba\x86\x62\x16\x11\x0a\x51\xeb\x36\xc3\xda\xba\x86\x76\x59\xe2\xba\xa9\xa1\x3d\x08\xac\x6b\xa8\x0d\x01\x36\x09\xe4\x66\x2f\xbf\x1b\x68\xe8\xb3\x12\x73\x3b\xd2\xd0\x17\xf8\x8e\x1e\xe2\xe7\xf5\xfc\x5e\x43\x7d\x86\x89\x05\x1e\x32\xac\xfd\xbe\xf1\x51\x43\x8f\x19\xd6\x3e\x6a\x68\x9f\xc1\xd9\x37\x89\x86\x0e\x58\xc8\x19\xc5\x91\xad\xa1\xaf\x10\x06\x75\x02\x0d\x3d\x65\x58\xdb\xda\xbd\x38\xfa\xfc\x49\x43\x87\x2c\x61\xab\x7d\x7c\xd6\xf9\xf1\x49\x43\x13\x96\xd2\x3e\x65\x09\xcf\x3c\x78\xf1\x49\x43\x47\x8c\x21\x5b\xbc\x97\x00\xbb\xb0\x96\xd3\xa7\x7c\xfd\x96\x3c\x10\x1e\xab\xd5\x46\x99\x8f\xb5\xb7\x68\x3b\xc3\xda\x76\x92\xa4\x39\xcc\xb0\xf1\x1d\x3d\x8a\x13\x36\xcc\x59\x74\x46\x09\xdb\x72\xe6\x1a\xda\x55\x3f\xd7\x46\x39\xf1\xfb\x6c\x00\xef\x65\x58\xdb\x21\x99\x00\x6a\xb3\xaf\xb1\xc7\x24\x78\x1e\xf1\x39\xc3\xda\x2e\xcc\x7f\xa3\x3c\xf6\xfb\x22\xf6\x98\x55\x60\x97\xb0\x32\x6b\x4c\x46\xa9\x91\x9a\x2f\x9a\x3e\x4f\x6b\x71\x3e\xa2\x83\x90\x35\xfb\x17\x96\x1b\x66\x4a\x91\x71\x1f\x22\xee\xbc\x54\x7c\x9f\x00\xa2\x34\xc9\x69\x92\xaf\x75\x26\x43\xaa\xa1\x53\x88\x1a\x8f\xf2\xf4\xae\x96\xd1\xd1\x30\x4d\x46\xa2\x23\xd2\x6c\xa9\x69\x03\x74\xc6\x72\xec\x91\x51\xcf\x4b\x49\x16\x68\xe8\x9c\x7d\x7f\x69\x77\x34\x74\x90\x61\xed\x0b\x19\xb3\x49\xef\x2b\x0b\x52\x59\xee\x61\x86\xb5\xfd\x78\x94\xa7\x51\x46\xee\x34\x74\x94\x61\xed\xe0\x8e\x44\xf4\x82\x04\x05\x2f\x8e\x65\xe4\xe5\x90\x64\x7d\xce\xd3\x0b\x86\xfa\x20\x01\x3b\x03\x79\xec\x0d\xc0\xd5\x35\xe1\x57\xd3\x76\x4d\x43\x97\x3c\x9d\x5f\xf0\xef\x91\x9c\x7c\x8b\xe9\xa3\xd4\x08\xe1\xae\x20\xd0\x49\x56\x82\x94\xb9\x85\xaf\x6c\x5b\x02\xff\x47\x43\x1d\x15\xd9\x12\xc8\xf2\x05\xc2\x66\xf9\x76\x1a\x5d\xfd\xe3\x5c\x85\x59\x81\x0d\x25\xfb\x69\x86\x35\x56\x57\xc1\x84\x6f\x0c\xdb\xf1\xe5\xf7\xe3\xa3\x0d\xf3\xfb\xf1\xd1\x7e\xa7\x73\xa6\xa1\xeb\xc5\x48\x73\xd3\xb4\x34\xf4\x7d\x49\xc2\x07\x96\xb0\x72\x96\x61\xed\x98\x0c\x35\xf4\x03\x40\x62\x3f\x4b\x47\x69\x98\x97\x38\xcf\x19\x40\xca\x5a\x54\x94\xfc\x93\x01\xf2\xb5\xfa\x0d\x0b\x9e\x26\xe0\x16\xfc\x2e\xcd\x68\x6d\x48\xb2\x3c\xf6\xe3\x21\x49\xf2\x51\x2d\x24\xf1\x80\x06\xac\xe3\xb1\x39\x57\x37\x34\x74\x91\x61\xed\x34\x8b\x04\xa2\xcb\x0c\x6b\x67\xa7\x97\x1d\x0d\x75\x58\x28\x96\x55\x23\x3d\x52\xac\x2f\xe0\x40\x3c\xa8\xc1\x82\x7a\x95\x61\xed\xd2\x87\x7d\x9f\x64\x02\x8b\xc9\xe9\x70\x48\x03\x65\x40\x5d\x67\x98\xbf\x5f\xd7\x90\xc7\x50\x75\x7a\xb4\x96\x71\x74\x34\x28\xc6\x03\x49\x02\x95\xdc\x9a\x2f\x46\x0d\xad\x81\x94\x50\xcb\xd3\x88\xb2\xb9\x1c\xd5\xc8\x08\x4e\xa0\x6b\x8f\xa0\x00\x12\xb3\xec\xc1\xd8\x67\x7d\x3d\xa0\x43\x9a\x04\x34\xf1\x27\x35\x7f\xe2\xb3\x02\x7d\x28\x50\xd2\x5c\x23\x61\x4e\xb3\x9a\x86\xbe\x67\x3c\x76\x00\x9d\xf5\x07\xfb\xca\x28\x05\xbe\x07\x90\x03\x46\xd8\xcf\x0c\x6b\xd7\x69\x16\xb0\x34\x0d\x51\x96\x70\x73\xe3\x6b\xe8\x4d\x86\xb5\xff\x6a\x28\x64\x11\x7f\x41\xa7\xf9\xeb\x7e\x4c\xb3\xc9\x5f\x19\x0d\x33\x3a\xea\xfd\x15\x27\x39\xcd\x1e\xc8\x40\x43\xd1\x02\xcc\x38\x1b\x68\xa8\xc7\xa2\x89\x50\xb1\xd6\xd0\x4a\x0c\xdf\x7c\x11\x25\x23\x58\x7a\x3b\x19\x4d\x02\x3e\x98\x3c\x1e\x93\xd1\xd1\x48\x43\xb7\x00\x9a\xd4\x40\x0d\x46\x43\x3e\x4b\x93\x73\x5a\x5e\x54\xa9\x0f\x50\x43\xfe\x32\x2f\x4e\x93\xf5\xa7\xb5\xc7\xc7\xc7\x35\xd6\xb7\xd7\xc6\xd9\x80\x26\x7e\x1a\xd0\xc0\x61\x33\xf8\x88\xe6\x78\x9c\x87\x6b\x1f\x35\x14\x8c\xb0\xe6\x91\x4c\x43\x94\x05\x06\xa9\xdf\xd7\x50\x38\xe2\xf2\x1f\x93\x1e\x59\x70\x10\xb3\xd8\x1e\x0b\xa6\x77\xc3\x01\x65\xd2\xc2\x80\x95\xe6\x8b\xd9\x29\x07\xde\xdd\xc9\xa8\x8c\x89\x42\xf1\xa8\xf8\x60\x55\x80\xaf\x8c\x0a\xb4\x09\x03\x0d\xca\x69\xa9\x3f\x92\x52\xed\x40\x84\x84\x0c\x98\x72\xc0\xff\x8f\xb8\x37\xed\x6e\x1b\x47\x1a\x85\xbf\xe7\x57\x48\x7a\x7c\xd9\x44\x0b\xa6\x25\x3b\xdd\x33\x4d\x1a\xd1\xeb\x45\x89\x1d\xdb\x71\x6c\xcb\x76\x12\x86\x93\x03\xae\xa2\x76\x91\x94\xbc\x49\xff\xfd\x3d\x28\x00\x24\x28\xc9\xe9\x65\x9e\x7b\x6e\x9f\x8e\x45\x82\xd8\x51\x28\x54\x15\x6a\xc9\x82\x05\xfb\xc3\x06\x5b\xc3\x13\x48\x0b\x32\x80\xed\x1f\x39\xe9\x36\x85\xe4\x38\x9d\x0c\xe8\x93\x59\x19\x8d\x47\x81\x55\x99\x50\xdf\x8f\x47\xd1\x76\x36\x9e\x98\x95\xdd\xc9\x63\x0d\x0f\x59\xfd\xe3\x21\x8d\x47\x35\x3c\xca\x9f\x0f\x1e\x63\x46\x93\x42\x0d\x40\x9c\x8c\x53\xfe\x04\x6b\x95\xb2\x74\xb0\x42\x95\xab\x37\x49\x49\x2d\x48\x92\x71\x52\xc3\xd3\x94\xd4\xc2\xb1\x37\x4b\x59\x8d\x89\x7c\x81\xdd\x92\xb1\x72\x82\x90\x33\xe2\xb1\x31\xa4\xfd\x40\x6c\xaa\x1a\x7e\x33\x7b\xfd\xab\xd8\xb7\x35\x9c\xa6\x2c\x0b\x20\xe9\x8c\x3d\x06\x63\x31\x81\x73\x28\xcc\x65\x15\x8c\x5e\x35\x3e\x04\x63\xb6\xbe\x49\x0d\x3f\x28\x9f\xca\x92\x96\xf3\x31\xf5\x0f\x92\x28\xad\xe1\xc7\x57\xf3\x5c\x31\x88\xad\xe1\xa7\x57\x33\x00\x99\x93\x1a\xd4\xf7\x0b\x22\xf1\xf9\x2f\xe4\xbe\x1c\x05\xfc\xfc\x95\x85\x0e\xfe\xac\x10\xa7\x96\x0f\x06\x03\x59\x26\xad\xe1\xc3\xbf\x56\xa8\x68\xe5\xe8\xcf\x0a\x64\x49\x1c\x45\x2c\xe7\x2c\x65\xec\x4c\x7a\x4e\xdd\x60\x90\xf2\x93\xb9\x86\x8f\x59\xf1\xee\xa0\x86\xe7\xec\x6b\x96\x4d\x6a\xb8\x0d\x49\x59\x36\xf9\x3f\x35\xfc\x5e\x3e\x9b\x3b\x3b\xfe\x6c\x38\x7c\x32\xbc\xf1\xb0\x86\x3f\xc8\xe4\xf4\xff\xd4\xf0\x09\x7b\x89\xfd\x60\x94\xc5\xd9\x53\x0d\xbf\x79\x48\x49\x2d\x66\x67\x67\xca\xce\x4e\xbe\x77\x1f\x21\x2d\xaa\xe1\x53\xc8\xcc\x4f\x28\x8e\x3d\x6a\xf8\x29\x25\xb5\x5e\x0a\xac\x4b\x0a\xac\xd8\x84\xa3\x85\x83\x94\xd4\x06\x34\x1b\x30\x80\x3c\x64\xcf\xf1\xa8\x2f\xb6\xcd\x51\xca\xd8\x18\x05\xda\x3e\xb2\x7a\x59\xca\x0f\x81\x86\x7f\x48\x10\x3b\x86\xac\x6c\x5c\xf0\x90\xf4\x61\x9e\xcf\x20\xbf\xdc\x5a\xe7\xf0\x36\xf6\xe3\x30\x66\x33\xf5\x9e\xe5\x84\xf3\x48\x40\xe3\x07\x48\x98\xa5\x81\x3f\x7e\x18\xd5\xf0\x89\x7c\x85\x5d\x70\x9a\xbf\xcd\x59\xe1\x0b\xa8\x2b\xc5\x15\xc0\x7d\xb0\x9b\x3e\xb1\xa4\xd1\x98\x6d\x69\xe8\xfd\x25\x7f\xcf\x7e\x88\x26\xfd\x1a\xfe\xcc\x92\x72\xa6\xeb\x63\x4a\x6a\xe3\x24\x12\xad\x5f\xb1\x6f\x62\xa7\x8b\x5d\x7e\x96\x92\x1a\x3b\x17\xa0\xfa\x6b\xf8\xce\xbd\x0d\xd6\xf0\x0d\xbc\xc1\x05\xfd\x78\x64\x56\xa8\x9b\x8e\x07\xb3\x2c\xb0\x2a\x80\x23\x1a\x56\x65\x10\x84\x19\x3c\x3c\x6f\x83\x7c\xc8\xac\x34\xad\x1a\xee\x40\xb1\x99\x5b\xc3\xe7\xa9\xe0\x9b\x6a\xf8\x96\x25\xae\xca\x59\x6a\xf8\x4e\x24\xc3\x9a\xdd\xf3\x17\x38\x25\x6a\xf8\xcd\x05\x94\x8e\xd8\xdc\x01\x1b\xf8\x29\x7f\x4f\x6b\xf8\x0b\xcf\x3b\x3d\xf5\xcd\x1a\xbe\x64\x5f\xe2\xa8\x9b\xd5\xf0\xe7\x94\xb1\xac\x83\xc0\x63\x0c\x17\xcb\x93\x06\x49\x1c\xa4\x46\xd3\x60\xe0\x73\x1f\xfb\x8c\xdf\xfa\x56\xfa\x30\x19\xc7\xa3\xec\x26\x7e\x66\x24\x42\xe9\xc3\x3c\x4e\x19\x71\x76\x3a\x3a\x0f\x22\x60\xfd\x69\xcc\x3e\x03\x55\x7e\xc5\xda\x99\x50\xc6\x3c\xa6\x82\xdd\x95\x63\x72\x21\x17\xa0\xbf\x38\x64\x87\x10\xbc\xcf\x3c\x0f\x40\xf1\x26\xcd\xb9\x76\x9f\x7d\xe0\xdc\xde\xc1\x63\x90\x32\x0a\x27\x58\x49\x6a\xd6\x70\x27\x2d\x52\x18\xea\xbd\x4d\x39\x0d\x5f\xc3\x21\x64\xee\x06\x95\x87\x64\x3c\x8a\x72\xa3\x47\x7e\x3a\xdc\xb1\x6c\x70\x1a\xdd\xc3\x93\x3c\xfb\x22\x28\x24\x5e\x8d\x8c\xa6\xfd\x0b\xda\x63\xd8\xb9\x2b\x3f\x00\x28\x7e\x61\x85\xc6\xe3\x41\x16\x4f\x6a\x38\x86\x4f\x53\x60\x62\x59\x7a\x12\x04\xb0\x0f\xbe\xa5\xa4\x36\x8b\x6b\xb8\xc7\xbe\xcf\x62\x83\x1f\x6e\x5b\x90\x2a\x67\xa3\x0f\xdf\xd2\x20\xf9\xc1\xc0\x94\x31\x5d\x6c\x7b\x83\x4f\xa5\x1a\xa6\x19\xa9\xcd\xf9\xb0\xdc\x8c\xd4\x1e\x68\x32\xe2\x47\xfe\x80\x95\x12\x72\xe6\x80\x8b\x4c\x86\x3c\x29\xeb\x1e\x25\x81\xcf\xc3\x03\xa6\x35\xec\x65\xa4\xf6\xd8\x4d\x6a\xd8\xe7\x0f\x93\x31\xdb\xc3\x23\x96\xf7\xf9\xb1\x86\x83\x8c\xd4\x16\x35\x3c\x66\xef\xdf\x67\x8d\x86\xff\xaf\x9a\x72\x2f\x9f\xe5\x37\x9a\x37\x13\x4a\x26\x31\xcd\x7d\x3a\x0e\x77\x09\x97\x41\xce\x52\x9e\x70\x3c\x27\xb6\x08\x6d\xd9\x2e\x3d\x52\x43\xf4\x3a\x05\xfb\x21\x99\x99\x1a\x70\xe8\xf1\xc4\x69\x2c\x14\xa1\xdb\x73\x54\xbc\x1c\xcf\xf3\xc6\xaa\x64\x92\xca\xdb\xfe\xbb\x26\x6b\x3a\x8e\xf8\x25\x7c\x46\xa4\xb7\x3f\x3b\x9b\x0a\xf3\xc4\x9b\x09\x55\x0d\x4b\xa7\xd0\xef\x92\x7b\x7d\x97\x7b\xea\x71\xe5\xe5\xa7\x47\xa8\xed\x3a\xc6\x2a\x25\xc0\xad\xa7\x72\xa7\x9c\xae\x83\x3d\xe2\xb5\x3c\xfb\xdc\x75\xf4\x24\xa6\x48\xd3\xaa\xfc\x25\x8d\x29\x6a\x79\xa6\xc7\x6f\x46\xb5\x9d\x08\x9f\x06\x88\xbf\xec\xef\x44\xf8\x4c\xbe\xbc\xdb\x89\xf0\x47\xf9\xf2\xbd\xb6\x13\xe1\xf3\x00\x99\x97\x96\xbf\xd6\x34\xf1\x96\x4b\x2e\xd7\x4b\x62\x4a\x76\xfe\x63\xff\x67\xdf\xf9\x55\xdf\xa7\xba\x5e\x41\x75\x21\x19\xd4\x7f\xf9\xe1\x0e\xe8\xa8\xff\x0b\x6a\xe9\x35\xfe\x58\x43\x2d\xd4\x62\x59\xf4\x6e\x12\x84\x44\xff\xc5\xfe\xcf\x2f\xce\xaf\x90\xc1\xfe\x4f\xcd\xf9\x95\x7d\x7f\x07\x75\xed\x7f\xdf\xa1\xfc\x09\xfd\xba\xb5\x83\x53\xd6\x4a\xc1\xf5\xea\x7a\x0a\xf5\xb4\xd0\xaf\xe6\x8e\x72\x4f\x1e\xcb\x80\x21\xc6\x3c\x48\xd2\x78\x3c\x5a\x2c\xbe\x05\xb9\x11\x52\x5f\xef\x45\x14\x83\xfd\xdd\xb7\x60\x79\x4f\xa6\x19\xb7\x96\xbc\x6b\x4a\x2b\xc8\xdc\x30\x72\xd0\x7b\xd5\xea\x69\x97\x90\x09\x84\x7c\x1d\xec\xfd\x2c\x8f\x9b\x29\x97\xef\xd9\xc6\x35\x36\x8e\xe7\x72\x99\xb9\xce\xdb\x9c\xad\x32\x47\xa7\x84\x5c\x76\x15\x6f\x54\x85\x96\x3f\x35\xda\xe5\x52\xed\xd7\x4b\xe5\x7e\x4b\xee\x8d\x3b\xfa\x5a\x67\x33\xd5\x09\x7b\x92\xad\x88\x70\x07\x3d\x1d\xac\xd3\x8e\xe7\xfc\x2f\xf8\x07\x10\x0f\xb6\xeb\xb4\x8a\x47\x93\x1a\x83\x3d\x9e\xb9\x3d\xe7\x7f\x45\xe6\x76\x91\x59\x3e\x72\x6d\xd8\x7b\x63\x12\x94\xfa\xc5\x26\x87\x92\x24\xe3\xfa\x35\x77\xdd\x42\xb7\x35\xf7\x51\x4f\xab\xe4\xb2\x65\x53\xc7\xb4\xc1\xf0\xf2\xf9\xe3\x86\x71\xc9\x0a\xce\xba\x14\x81\x99\xe9\xbd\xf1\x71\xf7\x27\xf9\x26\x32\x1f\x6b\x3f\xcd\xc8\xcb\xc9\x5b\x53\x90\x52\xdb\x25\x52\x6a\x9b\x63\x85\xda\xd2\x4a\x33\x23\xf6\x28\x49\x33\xe3\xe4\x6d\xbd\x13\xb0\xf7\x51\x20\xdf\x83\x90\xbd\xcf\xdf\x8a\xd7\xda\x36\x1d\x0c\xb6\x6b\x2c\x2d\x69\x12\x9e\x13\x1c\x09\x8c\x32\x1a\x8f\x82\x04\x82\xf6\xcd\x06\x03\xc8\xd1\x9d\x50\xc6\xa7\x78\xfd\x28\x61\xac\xe1\x36\x28\xd3\x99\x95\xff\xf1\x1a\xec\x3f\xab\x22\xde\x1f\xba\x71\x56\x90\xfd\x40\x0c\x58\x50\xbe\xf7\x4a\xf9\x30\x0c\xdf\x7a\xbb\x79\x79\x77\x40\xbd\xbe\xc5\xab\xd9\x4e\x27\xd4\x0b\x18\x27\xf1\x90\xd0\xc9\x4a\xa5\x15\x77\x9c\xf8\x41\x62\x56\x9a\x93\xc7\x4a\x3a\x1e\xc4\xbe\x28\x0b\xad\xf5\x59\x6b\xe1\x78\x94\xb1\xd2\xc9\x90\x0e\x2a\x0d\xe3\xdf\xc1\xb0\x42\x93\x98\x0e\x70\x4a\x47\xe9\x36\x3b\x8f\x43\xab\x32\xa4\x49\x14\x8f\xb6\xdd\x71\x96\x8d\x87\x66\xe5\x37\xd9\xdf\x58\xd6\xb0\x9d\xc6\xcf\x81\x59\x69\x1a\xcd\x60\x98\x77\xf3\x7f\xd8\xa0\x3d\xcf\xaa\x40\x8e\x87\x80\x51\x09\x66\xc5\x1d\x0f\x7c\xab\xe2\xcd\x92\x94\xe5\x01\x02\x20\x48\x0a\x1e\x88\xd3\x35\xcd\x06\xeb\x7d\x69\xb8\xec\xdc\xdd\xa6\x83\x38\x1a\x99\x15\x20\x38\xac\xca\x3c\x60\x5c\x39\x1d\xc8\xe4\x6c\x3c\xb1\x6a\xd6\x9b\x34\x33\x22\x8f\x92\x06\x3c\x5d\xf8\x1b\xd4\x9d\xe2\x50\xaf\xa6\x99\x11\x7c\x50\xfd\x80\xc0\x0a\xd7\x6b\x46\x45\xa0\x49\x93\xfb\x9c\xf3\xd8\xa2\x4f\x27\x54\xe7\x65\x85\x95\xaa\xc7\xcf\x98\x0b\x81\xcc\x5d\xe2\xe5\x68\x56\xa6\x79\xc4\xb3\xdb\x53\x47\x68\x94\x4a\x5b\xd8\xb4\x3b\x7e\x38\x1d\x75\xf8\xf1\xde\xaa\x56\x57\x52\xcc\x6a\x03\x47\x44\xf7\xec\x13\x87\xa1\xa1\x96\x9b\x99\x93\x14\x31\xac\xd5\xe2\xf0\x65\x72\x30\xc1\x11\x89\xea\xba\x67\x3f\x3a\x2d\xf6\xc7\xbc\x44\xb8\x4f\x58\x6d\xc0\x59\x30\x1a\xc7\xf2\xc9\x4d\x5f\x97\xfd\xf5\x8d\x9e\x7e\x95\xe2\x17\x08\x38\x69\x46\x4b\xec\xdb\xc7\x2e\xf8\x89\xc3\x11\xe1\xfb\xa1\xce\xe7\xad\x5e\xc7\x03\xc8\xfe\x19\xbf\xc4\xbe\x19\x61\x5e\x84\xc3\xcb\x12\x07\xc8\x72\x35\x4d\x0f\x5b\x5f\x26\xe0\x33\xcb\xd4\x43\x12\x50\xfb\xc6\x75\xf4\xab\x14\xe1\x2f\x94\xbb\x18\xf3\xed\xa9\xa3\x0f\xb0\xa8\x87\x57\x71\xd5\xa5\x4b\x1c\x22\x84\x90\xd5\x07\xad\xc5\x72\xa7\x38\x3c\xc9\x9e\x8d\x63\x8a\x10\x76\x8d\xf1\x08\x18\x7b\x32\x8b\xd9\x02\x7d\x6c\xe2\x81\xa8\x9c\x3b\xec\x4a\x33\x63\x30\xa1\x3a\xc5\x03\x64\x89\xc1\x07\xc7\xd2\xef\x4f\xaa\x69\x0c\x04\x12\x99\x21\xf7\xac\xc5\x8a\x0d\xbd\x35\xbd\xbc\xcd\x20\xc1\xe3\x88\xb2\x49\x1a\xbc\xd5\x21\x1c\x07\xba\xa6\x3a\xb5\x1f\x1d\x7c\x85\x70\x77\x00\x91\x46\xd8\xdc\x1d\x6f\x50\x2a\xff\x49\x95\x55\x57\x4d\xe4\x68\x25\x17\x97\x4a\xac\x22\x72\x0a\x54\xce\x1e\xf6\x74\xa4\xea\x61\x4a\x87\xd7\x0c\x1b\xeb\x08\xfb\x10\xbf\x5b\x64\xd7\x7d\x52\xd5\xb7\x62\xdd\x63\x94\x20\x5a\x2c\xe0\xf1\xb4\x0b\xc1\x11\x65\xb1\xe7\x8f\x10\x86\xc0\x35\x3e\xee\x42\xf1\x97\x32\x38\xfa\x4b\xcb\x73\x75\x1f\xf3\x2a\x5b\x93\xd4\x74\x33\x64\xf9\x6b\x33\x4d\xf2\x13\xab\x02\x9b\x0e\x9c\x70\x06\xe0\x63\x3f\xcd\x8c\x0f\x2b\xb6\xc2\x94\x81\xcc\xd0\x77\x14\xbf\xcc\x69\x66\x1c\xbc\xd5\x29\x6a\xf1\x65\xd6\x29\xc2\xd5\x06\x32\xab\xcd\x25\x6c\xe3\x89\xf7\x97\x2b\xa0\x76\x2f\x70\xd8\x3f\x61\xb9\x98\x66\xc6\xf9\xf5\x66\x9b\x78\xe5\x54\xc9\x92\xa7\x17\x5a\x58\xf0\xe4\xfa\x12\x68\xe9\xd1\xcc\xeb\x32\x5a\x0d\x1c\x84\xb5\x5c\xdd\x43\x26\x1f\xa3\x8b\x3d\xfb\x60\xea\xa0\xe5\x12\x5a\xf9\xd8\xdc\x60\x4c\x0d\xbd\xb1\xfa\x0c\x4a\x2c\xf0\x27\xf6\xcd\x75\xc0\x80\xe0\x9a\xea\x2e\x87\x21\x28\x7c\xf0\x76\xa3\x4d\xcb\x00\x14\x69\xa9\x11\xfb\x9a\xf6\x14\xeb\xec\x01\xf3\xed\x2a\xf5\x85\x7b\x81\xb3\x29\xc7\xfc\x2d\x4b\x65\x5f\x5b\xd5\x46\x3e\x8d\xd3\xc9\xba\x81\x75\x11\xe6\x93\x9f\xd1\x2d\x6a\x4e\x52\xa1\x45\xf9\xb2\xc4\x11\x29\x74\x47\x3e\x3a\xd6\x2e\x21\x51\xcb\x05\x35\x40\x17\x11\xd2\xeb\xb6\x42\xe2\x9a\x81\x28\xef\xb6\x5c\x33\x30\xf7\x08\x38\x17\x2c\x25\xe2\x90\x78\x8b\xc5\xcb\x12\x59\x3e\x39\x8e\x75\x1f\x59\x01\xfb\xcd\x9d\x66\xbd\xa8\xf8\xd4\xf4\xf1\x0a\x36\x35\x03\x2c\xf8\x6a\x33\xe4\xb3\x1d\x7c\xd8\x34\x61\xf9\x30\xfc\x7c\x5f\x0e\xde\xae\x2c\xbe\xe2\xa9\x90\xad\x46\xe1\x9d\x91\xe1\x4b\xbc\xe2\xe9\x18\x9c\x49\x86\x8e\x9c\x5e\xf1\x2c\x66\x18\xbd\xf8\xe0\x03\xd9\x0a\xec\xd3\x29\xc4\xc1\xe3\x0a\xa1\x55\x5f\xd3\x5c\xd8\x7f\x90\xaf\xc0\xac\x3e\xf1\x06\x02\xb1\xfa\x02\xb1\x4e\x19\x56\x04\x3f\x0e\x5c\xbd\x14\xc2\x03\xde\xba\x0e\x6a\x05\x06\xfd\x01\xfe\x0f\xcd\x80\x21\x3c\x8a\x7d\xa4\xf8\x7a\x80\xf5\x1c\x4c\x56\x2d\x59\xf8\xc0\x72\x64\xd5\x40\xd6\x35\x85\x73\x02\x07\x29\xb2\x3c\x56\x91\x2b\xf0\xd5\xec\xcf\xcb\x7e\xd3\x3d\x4d\xf3\x60\x96\xd4\xc9\x96\x7b\x4d\xd3\x5c\x36\xcb\xbc\xbe\xe4\x95\xbe\xec\xc4\x3e\xa9\xb5\x7e\x42\x91\x6d\xdb\x8d\xed\x3f\x9c\x5f\x6b\xad\x1d\xec\x93\x59\x40\xb9\xc7\x4c\xae\x2c\xea\xe1\x4b\x86\x9e\x6c\x47\xf4\x58\x75\x2c\xc9\xb1\x36\xad\x12\x57\xaa\xf6\xb2\xc2\x94\x9d\x68\x51\x5e\xd8\x8a\xc0\x56\x04\xfc\x5c\x51\x50\x18\xfd\xa6\x07\x18\x76\xab\xaa\x61\x9b\x65\xf9\x96\x15\xee\x23\x03\x6a\x87\x9e\xa3\x5f\x45\x08\x5c\x81\xb9\x32\xe1\x2e\x42\x76\xc3\x11\xf8\x53\xa4\xcd\x21\x0d\xfb\xf9\x49\x18\x21\xcb\xb5\xdf\xbb\x0e\x2c\xdf\xd2\x55\x2b\x6b\x38\x96\x27\xf3\x3d\x75\x11\x43\xaf\x1e\x3e\x61\x0f\x46\x9a\x78\x84\x5a\x2e\x5b\x23\x4f\x61\x32\x67\xb1\xea\xa6\x3e\x1f\xbe\x0b\xeb\x30\x04\xf7\x68\x12\x9b\x33\x24\x6d\x79\x9a\x06\xc7\x11\x37\x43\x12\x7c\x84\xb7\x54\x46\x3b\xcb\x74\xf4\xb2\x9c\x31\x16\xca\x18\xf5\x49\xb5\x69\xf1\xe7\xbb\xe8\x35\x46\x63\xd4\x5f\x8a\x3c\xdf\xd4\x2c\xe2\x9b\xb4\xdf\x62\x75\x89\xc8\x09\x87\x3a\x52\xe7\x77\x9e\xa9\x20\x31\x8b\xf5\x87\x8c\x75\x8e\x1a\xc7\xe7\x60\x2d\x7e\x7c\x4e\x6c\x87\xbf\x83\xff\xcc\x58\x17\xca\x75\xad\x2f\x7a\xee\xbb\xc1\xf4\x90\xe8\xf4\xa1\xda\x89\x38\x14\x4c\xfd\x39\x28\x89\x0b\x39\xc0\x39\xc4\x4e\x90\xcf\xa9\xeb\xe8\x48\x57\x7b\xf4\x00\x2b\x4e\x73\xa7\xef\xd4\xf8\x46\xc8\x45\xc4\x50\xe9\x37\x5d\x99\xfd\xf9\x1a\xfb\x87\xbd\x32\x4a\x74\xc1\x99\xa8\x9b\x33\xf3\xf9\x37\xd7\xb1\x06\xe0\xa8\x65\x1e\x2b\x47\x8b\x8f\xcc\x87\x4c\xf7\x91\xba\x20\x8f\x62\x7a\x3c\x37\x37\x38\xdb\x2a\x7c\x43\x74\x26\x45\x9c\x1e\x9b\x26\x32\x4a\x8a\xf0\x86\xf7\x99\x6b\xd7\x04\x22\xd4\xcf\xf3\x33\x5b\x4f\x6e\xc0\xe7\x53\x52\x6d\x2c\x1f\xd7\xa7\x6c\x69\x3d\xae\x2f\xa6\x4c\x5c\xd1\x45\x59\x5b\x6f\xd6\x42\x43\x66\x2e\xeb\xf6\xac\xe5\x5d\xeb\x63\xb5\xa1\xf4\x4d\xb5\x3e\x7f\xe2\xeb\x61\x07\x53\xa7\xb4\x4e\xcf\x90\xfe\x9c\xd9\x69\xa0\x1e\xf7\x74\xc9\x93\x48\x18\x03\xf4\x3f\xc4\x94\x54\x0f\xfa\x8b\xc5\xc7\xbe\xfe\x07\xc2\x8f\xe5\xd7\xa7\x98\x92\x83\xbe\xa6\x55\x4f\xfb\xba\x1f\x22\xab\xda\xee\x2f\x16\xa7\x7d\x7d\x9e\x20\xeb\xb0\xaf\x69\xa7\x7d\xbd\xd6\x34\xfe\x70\x6b\x68\xb1\x38\xe0\xef\x0f\x09\x5a\x2c\x9e\xc5\xb7\x3f\x8c\xdf\xd8\xa7\x36\x7f\x95\xa5\xaa\x32\x9b\x28\xc2\x6a\x86\x78\xec\xd0\x5a\x6b\x9a\x9a\xb5\xe3\xcb\x8b\xf7\x63\x6f\x96\x9e\x8e\x6a\xf8\x80\x27\x27\x4a\xf2\xe5\x2c\x53\x84\x62\x07\x02\x0a\x1e\xb3\xc2\x4c\xa5\x45\xed\x13\x46\xde\xe7\xf0\xc0\x5d\xfe\x74\x4a\x6f\x30\xa3\x25\x05\x2d\x25\xf4\x9c\x50\xd8\x21\xca\xcb\x17\xd2\xb0\x6e\x45\x0d\x0d\x64\xdd\x15\x8f\x0f\xc5\xe3\x63\xf1\xc8\x2d\xf8\x40\x63\x87\x34\xac\x0f\x2b\x1f\xa4\x12\x16\x11\x4b\x2b\x14\x6d\x18\x18\x7e\x14\x59\xf3\x18\x76\x52\x95\x86\x7d\xbc\x51\x3e\x7e\x5a\x1f\xcf\xcd\x6e\x0e\xc8\x57\x32\xf0\x1d\x0f\xaa\xc2\x63\xf8\x61\x17\x2d\xbf\xea\x07\x19\x7e\xcc\x84\x71\x5b\x4c\x89\xdd\xc4\x6f\xf1\xae\x63\xdd\x93\x03\x10\x10\xbd\x39\xa7\x6b\x8e\x97\x38\x0e\xca\xb7\x9a\x7d\xe2\x14\xb3\x4b\xd9\xfe\x5a\x2c\x28\xc3\xc5\x6d\xee\xa7\xbf\x98\x6c\x57\x06\x89\xa1\xb6\x3b\x75\xb8\x43\x48\x86\x7d\x0e\xfb\xc2\x54\xc2\xca\x4c\x20\x24\x9f\x33\xdd\xb7\x53\xdf\x61\x44\x8e\xf4\xfa\x5d\xc9\x04\x25\x19\xa2\x97\x65\xc0\x60\x9f\x7b\x29\x82\x11\x2f\x65\xb4\x14\x72\x9a\xb6\x7c\x42\x8d\x30\x19\x0f\x45\xfb\xa6\x47\xc8\x49\x0a\xd4\x04\x35\xb2\x71\xde\xab\x0d\x8b\xee\x5b\xa5\x45\x66\x40\xce\x51\x67\x15\x4c\x4b\xa6\x4e\x0b\xfe\x9a\xd4\x18\xd0\xa7\x20\xf9\x52\x06\x90\x95\xec\x67\x90\xfd\xac\xc8\xfe\x35\x87\x19\x25\xd7\xb1\xcf\x72\x1d\xfb\x2c\xd7\x84\x46\xc1\x97\x02\x9c\x94\x5c\x6d\xc8\xd5\xce\x73\x7d\x2d\x20\x8d\xda\xa7\x2e\xf7\x6e\xfa\x98\xa7\x9c\x89\x14\x15\xee\xa8\x7d\x35\x75\x72\xd8\xa3\xf6\x60\xaa\xe4\xc9\x41\x90\xda\x7d\x96\xfe\x46\xf7\x08\x79\x4e\x5b\x90\xcd\xcc\x73\x09\xc0\xa4\xf6\xd7\xa9\x93\xc3\x26\xb5\x93\xa9\xb3\x0a\x9e\xd4\xf6\x12\x27\x87\x50\x6a\x5f\xe7\x59\x6e\x76\xc9\xbc\xdf\x82\x14\x93\x57\xf4\x29\xcf\x75\x9c\xe7\xba\xa2\x84\x5a\x74\x0d\xfd\x09\xf8\xe5\x38\x4e\x31\x12\x3a\x2c\x8b\xee\x1e\x62\xda\xa2\xc6\x15\x0c\x99\x10\xd7\xa4\x20\x0e\x88\xd2\x16\xe3\x20\xcc\x6a\x55\x97\x1f\xb5\xc3\x98\xda\xae\xa3\x1c\x57\x47\x99\x42\x2b\x40\xb5\x0d\xc6\x38\xea\x0c\x75\xcd\xfb\x8c\x25\xf8\xca\x38\x96\xfb\x9f\x61\xf9\x83\xcc\x08\xec\xa7\xa9\x23\xb1\x50\x3e\x26\x96\xd8\x52\x9e\x75\x24\x02\xe3\x4b\xd5\x5c\xae\x79\x04\xc7\xc3\x9b\xfb\x9f\x9c\x0d\xd0\x42\xa0\xb6\xc0\xa5\x87\xa2\x36\xee\xe3\x36\x98\x3a\x48\x9c\x07\xb9\xdf\x0a\x6a\xf0\xa1\x71\x8b\x87\x6a\x93\x61\x76\xc4\xb6\x9c\x0e\x03\x5b\x2c\x9a\xcd\xdd\x7d\x02\xcb\xae\x69\xcd\xdd\xbd\x77\xfc\x19\x69\x1a\xa8\x79\x6f\x37\x25\x3f\xe7\xa2\x17\x30\xb7\x9e\xa7\xaf\x0a\x57\xaf\xc0\x72\x7f\xe5\xdc\x64\xfd\x3c\xce\x48\xcd\x1b\x8c\xd3\x59\x12\xfc\x18\xc0\x1d\x2e\xa8\x51\xd4\xea\x7a\xb3\xfd\xfb\xaf\x5d\xfb\xc4\x73\x74\xc4\x60\x33\x5f\x95\xb6\xb2\x2a\x55\xbd\x4a\x17\x8b\x2a\xb5\x8f\x33\x87\x9b\x68\x1f\xc5\x94\x31\x1d\x32\xf3\x71\x4c\xd7\x0c\xec\xee\xc6\xd2\xa8\xf3\xb2\xa3\xe0\x76\x46\x31\xba\x96\x44\x65\x9e\x58\xa8\x6e\x9b\x54\xab\x02\x17\x74\x28\x09\x44\x24\xb8\xe0\x89\xd4\xeb\x47\xb1\xa8\x27\x68\xf3\xd9\x7e\xdf\x61\xb8\x28\x6f\xfc\x3d\x3f\x86\xd9\xe7\x6a\xc3\xa2\xac\x61\x8e\x7a\xf3\x86\x01\x37\xca\xc7\x0e\xc7\xcc\xca\x79\xfd\xa1\xb8\xd9\xe1\xf4\x2c\x27\x07\xbb\xe4\x65\x29\xae\x5c\xce\x49\x63\x79\x4f\x3e\x08\x01\x3e\xf5\xd7\x25\x74\x6c\xd8\x32\x1a\x62\x9f\x4d\xa6\x74\x31\x74\xd8\x65\xdc\x16\x65\x24\xa3\x92\x50\x38\x8f\x3c\xaf\xd7\x39\x28\x45\xe4\x04\xb6\x14\xd4\x65\x6d\x37\xf7\xa3\x96\xce\x98\xf1\xc8\xc1\xde\x62\xa1\xbb\x7c\xd8\x08\x99\x3a\x8f\xf7\xc7\xe6\xdc\xc5\xb2\xd7\x38\xc4\xd5\x2a\x2b\x89\x21\xa3\x87\x29\x0f\x6f\xae\x46\x91\x9a\xad\x1e\x2c\xc2\x97\x51\xde\x65\xf0\x29\x40\xb9\xef\x13\xe8\xa9\xe2\xb2\x5c\x71\x75\x77\xd8\xb5\xa9\x63\xb9\xac\xbf\x81\xa8\x24\x77\x88\xb8\xef\xb6\xf4\xf7\x99\x1e\xb0\x2d\x8e\x3f\xc7\xf6\x20\x80\x1d\xc3\xf2\x35\x11\x6e\x70\xbf\xb7\xec\x64\x08\x06\x41\x16\x54\x8a\xfa\xe4\x74\x6c\x6f\xe7\x62\x14\xd5\x7b\xe6\x69\x89\x1a\xcf\x7d\x24\xe9\xdc\x85\xdd\x7a\x57\x7d\x12\xf4\x74\x96\x6e\x7b\x0e\x3b\x05\x19\x9f\xfa\x3e\x63\x7c\x5a\x83\x10\x91\x5e\xea\x89\xcc\x4b\x79\x1f\x14\xb6\xf5\x7e\x55\xf0\x46\x41\xe8\x20\xe6\x2c\xa7\xb0\x79\xa0\x7c\x75\xf2\x20\x12\x35\x18\x83\x52\xd5\xee\x53\x8e\xd9\x93\x6e\x73\x72\x6f\xfb\xf5\xba\x8b\xdf\xb3\x83\x38\x70\x90\xb5\x32\x43\x9e\x63\xe5\x33\xb4\x2c\xd6\xf4\xde\x08\x6e\x5f\x0f\x6c\xcc\x66\x96\xf7\x93\xfb\x81\xe1\x57\x78\x85\xb3\xd0\xdc\x69\x4f\xbd\x1e\xa8\x4e\x7b\xac\x90\xed\x48\xe2\x6a\x9a\x70\x3e\x53\x72\x40\x78\x77\xb6\xc9\x23\xd6\x5a\x8b\x02\x64\xb6\x9b\x8c\x08\xd2\x03\x09\xde\x9e\x22\x14\xd8\x6e\xee\x07\x2d\x6a\xe7\x82\xaf\x37\xf7\x46\x7b\xf3\x70\xbc\x98\xb1\xc9\x3e\xf1\x5a\xa2\x7a\xf3\x12\x07\x2c\xb5\x88\xcf\x7d\x2f\x1c\x9d\x1c\x76\x37\xba\xf8\xe4\x9e\x9e\x29\x1f\x6d\x84\x38\xf4\xb0\x75\x8c\x1c\xfb\xc4\xa9\x12\x7f\xb1\x08\xf8\xab\xd1\x6d\x33\x0e\x7d\xc3\xc5\x96\x4a\xe5\x2b\xc3\x79\x29\xcf\x28\x5d\x99\x51\x36\x40\x80\xd6\xd0\x08\xda\x9a\x16\x32\x0c\xc5\xe6\x96\x4f\x72\xb5\xea\xb1\xc7\x0e\x2d\xa2\x63\x54\x82\x65\xee\x60\x14\x66\xf1\xa3\x8a\xbe\x87\xeb\x68\x1b\x9f\x65\xe4\x65\x89\xdb\x65\xac\x7c\x9e\x95\x9c\xf8\x49\x07\x56\x2b\x11\xb2\x5c\x29\x37\xe2\xd9\xed\xd0\x11\x25\xd4\xbb\xb0\xa5\x47\x2e\x32\xbd\x70\x12\x04\xa7\x43\x8b\x1a\x43\x5d\xd6\x6f\xbe\xcf\xcf\x80\x6a\x13\x52\x14\x0c\x1d\x97\x0c\x7e\xb9\x9c\x79\x83\x77\x2c\x38\x7b\x41\x33\xa1\x26\x71\x62\xb5\x1a\xe0\x3e\xf9\xc4\x9a\xb3\x18\xd3\x4e\xed\x8f\x99\x43\xfa\x80\x01\x01\x6f\x43\x04\x0a\x86\x92\xf5\xa2\x7e\x00\x73\xe3\xb2\x53\xf8\x6b\xf5\xc9\x87\x98\xea\xc8\x62\xa9\xc4\xb7\x7c\x81\xe8\x7d\xb6\x14\x9e\x45\xed\x5b\xa0\x1c\x6f\xa7\x8e\xee\x72\xf0\xc2\x3e\x8e\x90\x49\x0d\x9a\x65\x54\x98\x7c\xe8\x27\x0c\xe3\xf2\xcf\x88\xe1\xbc\x76\x4c\x8b\x60\xf4\xaa\x9b\x67\x68\x4b\xdc\x2e\x9e\xc6\x14\xbb\xe4\x31\xa6\xad\x1c\x28\xd5\xe0\x22\xe7\x8e\xee\x02\xfe\x76\x8d\xbb\x31\xf6\xd0\xd2\x54\xb3\x79\x64\x3d\x47\x39\x52\xbf\xb7\xdc\x14\x0d\xff\xef\x2d\xfc\xe5\x3f\x58\xf8\x83\xa3\x8d\x2b\xdf\x58\x59\xf9\xcf\x9b\x7b\xf2\x4a\x47\x3e\xaf\x76\x44\xb0\x18\xd0\x03\x2c\x9b\x9e\xbb\x45\xd3\x14\x44\xca\x00\x1e\xdc\xad\x04\x35\xee\xce\xe0\x33\x3f\x0d\x91\xa6\x5d\x31\xac\xaf\x2c\xce\x55\x26\xc4\x70\xe0\xd3\x80\x91\x35\x8c\x79\x0a\xda\xe5\xf3\x83\xd5\x94\x26\xe0\xf6\xad\x9d\x29\xc1\x4b\x4e\x33\xdd\x35\xbe\x0e\x0a\xa7\x84\x8c\xd0\x85\xe0\xc8\x97\x1d\xcb\x15\x97\x0c\x25\x53\x8f\xd6\xc6\x54\x9d\x0d\x80\x1a\xdd\x36\x32\x5d\xb8\x87\x13\x40\xa6\x69\xa5\x57\x80\x39\x4f\x42\xdb\xf6\xb6\xa5\x7b\x6c\xb4\x2e\x42\x2d\xfd\x34\x83\x68\x54\xec\x40\xf3\x8c\xe1\xb9\xa6\xe9\x5e\x4e\xe7\x60\x17\xf6\x09\x17\xd2\x9a\x40\x21\x49\x2c\xd6\x50\xac\xd5\xe4\x54\x54\x73\x47\x19\x0d\x31\xe2\xc2\xdb\x03\x35\xbe\x0e\x5a\xec\x8f\x31\xf4\xa4\x88\xcb\x6c\x58\x62\xd6\xad\x95\xd2\x1b\x8e\x43\x38\x9d\x15\xb7\x07\xe2\xf0\x3d\x74\x9d\x22\x9c\xb4\xc4\x98\x57\xe2\xf4\xd3\xb4\x7a\xdd\x2d\x20\xbb\x58\xbd\x8f\x5c\xb6\xb5\xde\xc9\xf6\xad\xfe\x81\x33\xe6\xb2\x67\x62\xbc\x55\x0a\x4a\x01\xf2\xb3\x62\x21\x59\x12\x52\x02\xd9\x73\x96\xb5\xce\x32\x9b\x3a\x26\xfc\x25\xfd\x6e\x9d\x2a\x56\x8e\x31\x5d\xf5\x33\xd0\xe4\x17\x6d\x1c\xfe\xe2\x10\xe0\xef\xb0\x6b\x0b\x24\xe1\x20\xae\x47\xe1\x8a\xb1\x32\xe4\x4c\x39\xb4\xd3\xc2\xd1\x80\x2b\x5d\xa7\xc2\x69\xe0\x69\x9a\x38\x26\xf4\x40\x23\xd5\x66\x95\x90\xf3\x98\xea\x21\xf8\xb5\x10\x5d\xed\x51\x5d\xdd\x63\xe7\x31\x2d\x3b\xa8\xb8\x1b\x03\x40\x76\xa8\x90\x0a\x58\xd4\x78\xdf\x81\x8d\x50\x08\xa3\x3c\x86\x57\x7c\x5c\xda\x19\xa7\x31\x55\x5c\x22\x15\x3b\x02\x60\xa2\xfa\x18\xd3\x9c\xfc\x5a\x2c\x82\x58\x1f\xc4\x70\x22\x33\x4c\x7c\xc0\x40\x11\xb8\x22\x0c\xe2\x03\xe1\x9c\xca\xe3\x2c\xaf\xe4\xaa\x3d\x95\x13\x42\xe8\x25\x33\xc5\x14\xf0\x88\x38\x0c\x8e\x81\xf3\x61\xcc\xd1\x87\x89\xee\x31\xde\x67\x45\x12\x11\xa1\x97\x90\xf1\x6a\x71\xa8\x87\xb2\x62\xb2\x52\xb1\x57\x66\xb8\x1a\x3c\x28\x0a\xf7\x3a\xe8\xdb\x37\x53\xc7\x0a\xad\x90\x84\x70\x0d\xe5\x09\xdf\x7a\x05\x42\x82\xfd\xdc\x87\xd8\xb7\xdb\x4d\xab\xea\x1b\xcf\xcf\x9a\xd6\xd8\x27\x7d\xab\xbf\xbd\x8d\x3a\x13\xdd\xc7\x9e\xdd\x77\x10\x0e\x34\xc2\x20\x82\xbd\x30\xe2\xbb\xc1\xf6\x28\xab\xa6\x4f\x1a\xb2\x58\x9f\x13\x57\xfd\x7a\xfd\x27\x05\x9b\xb8\xf0\xef\x2c\xcf\x7d\xb1\xa6\x62\x6a\x5d\xe1\xa3\x5e\x31\x80\xcd\x04\x1d\xca\x76\xb9\xa5\x40\x70\x9a\x31\xa6\x76\x1c\x56\x3e\x64\x22\x6a\x2b\x57\x9b\xba\xc9\x48\xed\xc7\x0f\x49\x42\x70\x0d\xdd\x1f\xe1\x88\x53\x12\x7f\x48\x4a\xe2\xdd\xbb\x77\x2a\x0b\x78\x21\xd1\x43\xa2\x7a\x7f\xa1\x16\xb5\x6f\x32\x07\xce\xe2\x9b\xcc\x21\xaa\x74\x3f\x3f\xd6\x46\xfc\xd2\xa6\x90\x7d\xb2\xac\x0a\xf1\xd4\xc9\xa4\xb8\xf5\xeb\x40\x9e\xe5\x0a\xdf\xfe\x25\xe5\xe4\x24\x7f\xdb\x3a\xe2\x1c\xdb\x57\xbd\x93\xe1\x59\x86\xac\x0e\x63\xc4\x18\x33\xca\x60\xed\x9e\x74\x04\x5f\x76\x7a\xb0\xee\x87\x6c\xeb\x88\xbb\x77\x5e\x35\xc0\xdb\x40\xc1\x9e\x67\xaa\x9f\x1d\x1f\xfc\xae\x6d\xc0\xdc\x1b\x4a\x7e\x5e\x2b\xf9\x66\x36\x59\xf1\xe6\x07\x88\x51\xfa\x28\xda\x3a\x2a\x28\x71\x08\xef\xec\x59\x1e\xf1\x8c\xad\x23\x24\xa3\x22\x2b\x44\xfc\x97\x94\xb2\xfd\x0c\x41\x26\x40\xce\xc0\x03\xb7\x50\x98\x37\x10\xc3\x7b\x8a\xb4\x41\x05\x82\xc7\x0c\x81\x1d\xad\x10\x11\x8a\x6c\x32\x1a\x9f\x95\xd7\x00\x11\xcb\x7a\x7d\x08\x2e\x24\xc2\x17\x55\x1b\x3c\x7e\x8c\x8b\x0a\xfa\xd9\x15\x7b\x82\xca\x3d\x11\x59\xd1\xf6\x36\x0a\x09\x37\x57\xb6\x23\x06\xdc\xe4\x36\x63\xd8\x8a\x6d\x08\x8a\x34\x2d\xb0\x58\x6e\x70\xfb\xdc\x11\x31\x4c\xd7\xb2\x60\x91\xa5\xf8\xd0\xe4\x1f\x10\x2a\xba\xc0\xc8\x77\xd1\x72\xc4\x71\x68\x54\xaf\xbf\xd6\xb6\x28\x5f\xc4\xbc\x40\xab\x62\x91\x4e\x66\x04\xc6\xe1\x8a\xb8\xe8\xeb\x40\x84\xc0\x2e\x1d\x76\x65\x20\x64\x3c\xca\x70\x03\x0c\xa8\x62\x98\xaf\x03\x20\x48\xf3\x48\x3f\xd8\x65\x5d\x92\x30\x75\x70\xf4\x0f\x8a\x37\xf2\xe2\x73\xf7\x4f\x8b\xdb\x57\xae\x53\x2a\xce\xcb\x16\x46\xe3\x0a\xeb\xc2\x8e\xac\xaf\x03\x76\x6a\x89\x02\x2e\x12\xee\x87\x95\x18\x90\xf2\x08\x53\xa2\xbf\x32\x00\x29\xa8\xb7\x7a\x3d\x94\x37\x9a\xae\x74\x53\xa4\x69\xd5\x08\x4e\xb2\x88\x9f\x6c\x45\xcc\x89\xbb\x31\x1e\x90\x08\x0e\xa8\x08\x0e\xa8\x08\x0e\x28\xc6\xe3\x33\xda\x2a\x02\x21\x34\x3b\xfa\xfa\x6c\x81\x06\xd8\x67\x8b\xb9\xcc\x91\xa4\xa6\xb1\x8f\xbe\xf1\xe4\xd3\xe5\x06\xfe\x77\x65\x2a\x83\x5b\x75\x2a\x10\x2c\xe0\x46\x0e\x76\xa5\xdc\xdd\xd9\x86\x29\xdc\xc0\x9f\xae\x14\x6b\xdf\xea\xc0\xab\x2a\x71\x9e\x84\x5b\x76\x57\x5d\x82\x3b\x21\xcf\xe8\x64\x2b\x30\x78\x3a\x27\x74\xb1\x10\xb7\x08\xdd\x63\x76\xd6\xba\x31\x7f\x7b\xdc\x23\x5f\x38\x8b\x3b\xdd\xc3\x4a\x91\xa4\x4d\xe6\xb1\x8e\x96\x5f\xf5\xbb\x0c\x77\x32\x64\xdd\x93\x3b\x81\x12\x85\xcd\x34\x3b\x61\xef\x8d\xd0\x97\xfa\xa6\xd3\xbd\x0d\xb7\x91\xf6\x87\xa9\x23\xb9\x16\x56\xdf\xb6\xa8\xdc\x6a\xec\x33\x12\x6a\xdf\xf8\xf7\xaf\xa2\x87\x5c\xa0\x1a\x0a\x51\x46\xf7\xd8\x7e\x9c\x8a\xb0\xed\x8f\xbc\x63\xc6\xe9\x7c\x9b\xca\xa8\x29\xa1\x2f\x95\x95\xbb\xc7\xb6\x27\x73\x86\xbe\x70\x85\x29\x7a\xc5\xdf\xec\x70\xea\xe8\x77\xa9\x78\xf9\x30\xcd\xdd\x32\xff\xbc\x31\x51\x95\x98\x08\x84\x96\x4b\xeb\x6c\xc5\x53\x28\x97\x20\xca\xe9\x10\xf7\x3e\xa1\x2f\xef\x81\xff\x56\xfd\xe0\xce\x74\xf2\xb3\xfa\x9b\xd6\xdf\x19\xfa\x3a\x7a\xba\xdb\x80\x9e\xec\x7b\x90\x2b\xab\x72\xa1\xee\xb1\x02\x52\xf7\x99\x5e\x8a\xb8\x48\x11\xf2\x80\x3d\xfa\x02\x78\x57\x39\x23\x8a\x1b\x64\x76\x50\x13\x72\x11\x21\xc8\xc5\xde\x18\x67\xb3\xd9\x77\xf4\x40\x1c\x80\xb9\x0b\xdd\xc2\x23\xee\x6e\xf3\xed\xbf\xde\xfe\x7b\xef\xf7\xb7\xff\xda\x77\x5b\xdb\x4d\xd3\x8d\x61\x16\x29\x76\x17\x8b\x86\x42\xb7\x7c\x01\x8a\xc2\x8d\x61\x2e\xa8\xba\x1f\xbe\xc2\xfd\xfe\x57\xb8\xa0\xf5\x22\x71\x79\xc6\x5f\xfb\xfe\x9a\xce\xae\x25\x85\xa9\x5e\xc4\x58\x38\x9d\x92\x97\x25\xbe\x10\xaa\xf2\xa0\x66\x64\x37\x18\x71\x00\xbe\xe6\x48\xb5\xc1\x68\x6f\x99\x9f\x94\x3c\xd8\xb2\xea\xbe\x65\x45\x3f\x3e\x01\xeb\xbe\xfc\xaa\x7f\x8a\x29\xfe\x9a\x29\xd4\xd0\xa5\xca\x2e\xe8\x94\x5c\xc0\x3b\x6a\x01\x91\xe6\x65\xf1\x3c\xf8\xc2\xa3\xbd\xcb\xa0\xfb\x5f\x2e\xce\x4f\xb2\x6c\x22\x4c\x85\x8a\x49\xb8\xc8\x59\x98\x2a\x35\x7a\x11\x2d\x05\x9a\xcf\xc3\xe8\x97\x4b\xaf\x04\xa3\x17\x79\x4a\xcd\xaa\x17\xfe\xf6\x97\x88\xe2\xfb\x88\xe2\xbb\x88\xe2\xaf\x11\x04\x26\x29\x85\xb5\x11\x17\xff\x2e\x88\x15\x93\x27\xd5\x71\x6f\x79\x2c\x3e\xc2\xd0\x49\xe2\x0b\x0a\x3c\x40\x2f\xcb\xa5\x12\xc6\x70\x36\xf0\x79\x30\x6d\xf0\x33\x51\x2e\x6d\xc8\xd7\xca\x30\x8e\xba\x60\x80\xea\xc7\x29\x6c\x11\x70\xab\x0c\x56\xbb\xe2\x9b\x30\x50\x05\xea\x65\x30\x08\xfc\x22\x64\x7e\x05\x3a\xb0\xfc\xc6\x8d\x1b\x3e\xc5\xb4\x58\x93\x2d\x80\xa7\x35\x1c\xca\x83\xd3\xa5\x90\x7f\xd0\x17\x5b\xb1\xc3\xf0\x6a\x71\x0f\xf1\x6d\x96\xef\x52\xaf\x23\xa2\x54\xf8\xca\x3d\xc5\xdd\x13\x4f\x0c\x77\xc9\xa5\xf0\x52\x29\x52\xae\x9a\xfc\xf7\xf2\x86\xff\x06\xc5\xad\x6f\xd0\x91\x37\xca\xbe\x7a\xe7\xf1\xe4\x51\x59\x89\xb7\xcb\x0b\xf9\x14\x94\x09\xbe\xea\x5b\x1c\x65\xb3\xf5\xf8\x0c\xb6\x0d\x60\xde\xd6\xda\xda\x89\xf1\x55\x4c\x89\x7d\x93\xe0\xda\xe7\xdb\x4e\xcd\xc1\xd7\xec\xd5\xb1\xee\xc9\x96\x40\xee\x93\x31\x5d\xd3\x5e\xf8\xa6\x23\x2b\xe8\xe9\xd7\x31\x77\xcb\xc8\x8e\xbb\xa7\xc9\x46\xb1\xbf\xd4\x41\x39\xf1\x0b\x41\x9c\x1d\x8d\xc7\x91\x31\x0a\x32\xe3\x4b\x37\x39\x1d\x3b\x15\xbe\x8e\xe0\x8b\x1e\x56\x52\x44\xeb\x1f\x8d\xc1\x15\x84\x30\x79\x23\xb5\xba\x98\xaa\x7a\xcd\x62\x30\x74\x9b\xc4\x04\x62\x02\xba\xc4\x6d\xb9\x76\x3f\x70\x74\x64\x5e\x45\xe2\x62\x25\xdc\x95\x57\x2c\x77\x4f\x72\x5a\x94\x39\x64\x0b\x23\x26\xf1\x44\x20\xe5\xb0\xd3\xba\x94\x76\x30\x61\x07\x99\xec\xe5\x9b\xbc\x4f\x96\xab\x17\x76\xc4\xb1\xd4\x31\xfa\xbe\x8e\xcc\x6f\x19\xfc\x5a\x57\x13\x39\x4e\x2c\x4e\xcf\x13\x4f\x4c\x0e\x02\xd8\x97\x8b\x2a\xf5\x80\x4e\x7c\xfb\x82\xb1\x2f\xb8\x38\xfe\x19\x06\xc9\xb3\x35\x8b\x9d\x00\x69\xb7\xa9\xfe\x5b\x21\x35\x5b\x52\xe2\x2d\x16\x97\x6a\x74\x14\x01\x8e\xf6\x21\x5c\x18\xf8\x9a\x36\xed\xaf\x85\xe9\x0d\x8d\x34\x60\x9c\x1e\xb8\xe8\xf6\xc9\x97\x58\x0f\x8d\x8b\xbe\x8e\xf0\x4d\x4c\x21\x2a\x44\x6c\xbc\x1f\x27\xc3\x63\x9a\x51\x1e\xdc\x26\x27\xf2\x95\x2f\x56\x75\x2b\xd6\xaf\x62\x56\xe1\x62\xf1\xc6\x5f\x2c\xbc\xc5\x82\x57\xfc\x29\xa2\xb8\xdf\xa5\xc8\x0a\xed\x3b\xd7\xd1\xcb\x6d\x8b\x51\xb3\x8c\x02\xdd\x9c\x40\x8f\x79\x77\x54\x4a\xe3\xc9\xa3\xf2\x40\x3b\xf1\x0d\xa9\xfa\xdb\x79\x9a\x88\x9b\xa1\x27\x8f\x22\x6b\x18\x17\x57\x48\x27\xbe\x92\x7f\xc5\x1c\x2b\xdf\x08\x7c\x19\x3a\x12\x7d\xe3\xc6\xbe\xd8\x4c\x9a\xa6\xeb\x72\xd7\xdc\x4a\x00\x38\xf1\x11\x6a\xe5\x75\x0a\x13\x34\xb1\x13\x3b\x72\x05\x8d\xf1\x48\x7e\x11\x8b\x3e\x08\xc5\x9a\x9b\x72\x7f\xde\x67\xa5\x2f\xb2\x34\x12\x4b\x7d\x79\xa3\x42\x44\x0c\x07\x56\xf1\xa5\x59\x08\x24\x0a\x20\x88\xca\x7e\x34\x6f\x4b\x02\x26\xa1\x71\xf3\x07\xd2\xb4\x69\xac\x53\xd9\x73\xa4\x69\x8c\x5e\x2c\x3a\xac\x1c\x97\x37\xa5\x0a\x06\x5d\x4a\x08\xe5\x6e\x7a\x97\x6f\xee\x8d\x41\xa8\xee\xfe\x4d\xe7\x03\x8d\x05\x3f\x53\x2c\xc3\xdd\x13\xf1\xba\xb4\x2e\x06\x5c\xbf\xe8\xd2\x82\xee\xea\xc6\x62\x84\xf6\x97\xa9\xa3\xff\x9b\x7b\x26\xbf\x5d\x0d\xce\xb5\x8a\x3d\x8b\xba\xe3\x27\x75\xc6\x58\x1d\x62\xc2\xd8\x07\xa9\x4e\x73\xf7\x44\x5c\xeb\x4e\xae\xb5\x45\x67\xba\xc0\x53\x05\x69\x2c\xcc\xaa\x8c\x60\x17\x14\xed\x18\x6e\x60\x27\x39\x74\x31\x45\xe2\x69\x92\x22\xb4\xfc\xba\x89\x08\x3b\x11\x3a\x0b\xc6\xb7\x99\xec\x19\x74\x17\xff\x85\x4e\x2a\x93\x91\x2a\x14\x69\xdc\xa5\x08\xcb\xae\x6e\x20\xd7\x56\x26\xe2\x1f\x34\x9c\x57\xcf\x70\x0d\xb2\xb6\xca\xf4\x1f\x30\x2d\x27\xde\x3a\xba\x2f\x14\x19\xaf\x9a\x8b\x85\x80\x4e\xf1\x10\x3f\xb5\xee\xe5\x3c\x73\xa0\xbf\x4f\xa9\xce\x57\xf5\xbe\xac\x43\x90\xe7\x53\xc9\xc9\x9c\x4c\xa1\x30\xa0\xd7\x00\x8c\x51\x31\x5e\x07\xe2\xf2\xbf\xad\x12\x77\x06\x42\xf5\xdd\x2a\xf1\xd8\x13\xe2\x46\x63\x97\x37\x9a\xf6\x96\xf0\x8f\x88\xd1\xa9\x80\x83\x1b\x39\xad\x09\xca\x13\x6c\xa2\x6f\xd9\x44\xe7\x39\x5f\xa8\x04\xb4\xe4\x89\x75\xe4\x0b\x27\xb9\x56\x41\xc1\x8b\xa9\x22\xd9\x70\x21\xb7\x4b\x76\xf7\xa1\x92\x16\x05\xd4\x06\xc6\x99\x9d\xe0\x31\x33\x2f\x0b\xf5\x78\x97\x5c\x2e\x29\x40\x64\x3d\x89\x68\x1d\x7a\x5c\xef\x47\x16\x87\xc0\xe5\x32\x8c\x47\x74\x30\x78\x7a\xa1\x33\x78\x55\x44\xa5\x2c\x25\x97\x94\x9e\xf8\x08\xb0\x57\x71\x27\xc0\x0e\x1b\x08\xcb\xd0\xb1\x1b\x4e\x2b\x8c\x4d\xa1\x7b\x20\x29\x0c\xf6\x85\x3f\xb9\x8b\x05\x1f\xc4\x79\xca\xd1\xe0\xd5\x44\x07\x56\x53\xa1\xb6\x14\xbf\x70\x72\x6b\x30\x58\xa3\x86\xb7\xcb\x48\xdd\x32\xba\xe3\xea\x68\x80\x61\xfc\x0e\x23\x85\x19\xcd\xcd\x1e\x31\x95\x44\x09\x5a\xde\x1b\xd7\xfd\x75\x1d\x92\x6a\x55\x40\xa7\x02\x05\x7c\xca\x85\x65\x00\x4c\x10\xf6\xac\xcc\x5c\x09\x0a\xbd\xdb\x68\x98\xe2\xa1\x29\x1f\x76\xe5\xc3\x5b\xf9\xf0\x3b\x7f\xd8\x93\x29\xcd\xdd\xdd\x3d\xd3\x53\xd4\xcd\x94\x68\xc9\xd5\xe6\x92\xdf\x73\x41\x58\x1d\xd2\x20\x84\xb8\x88\x92\x74\x98\x33\xe5\x46\xb8\x8b\x10\x80\x1d\x5c\x78\x54\xa9\xa6\xa5\xc1\x20\xb4\x1f\x21\x80\x27\x25\xf2\xc5\x7e\xcf\x98\x1a\x42\xed\xae\xe7\xe8\x0c\x8f\x7c\x74\xb6\x9b\x08\x61\x97\x54\x3f\xc7\x14\x22\xaf\xd3\x96\x40\xab\xe6\x25\x9c\xb5\x9b\x42\xb7\x02\x30\x15\x86\x8a\x27\x3e\x00\x96\xdd\x99\x3a\xa6\x72\xa3\x02\x33\xf4\xa2\x50\xd4\x1b\xa0\xd0\xdc\x6e\x16\x1a\x3d\xf9\x3d\xaf\xe2\x47\xaf\x84\xf5\xc7\x6c\x25\xef\x9e\x58\x0d\x77\x4f\x66\x3e\xf8\xbb\x27\x75\xaf\xfa\x33\xe5\x06\xc0\x5a\x15\x03\xfa\x33\xa1\x54\x3c\xe2\x17\xe6\x2d\xd7\xa4\xc6\xf1\x08\x07\x02\xe3\x50\xe3\xd3\x00\x61\x06\xb6\xf1\x33\x0e\x05\x96\x13\xb8\xe9\x99\x78\x38\xca\xf3\x7d\x9c\x23\xdc\xcd\xdf\xce\x05\x5f\x6c\x47\xec\x70\xb4\xbf\x4d\xe1\x62\x34\xce\xbf\x0f\x7b\x9c\xe4\xe1\x75\x77\x57\xeb\xee\x3e\x13\x4f\xe5\x49\x75\x4f\x5d\x5e\x84\x64\x60\x8b\xe3\x11\xa9\x56\x5d\x4b\xf6\xd6\x83\x35\xbf\x04\x65\x7f\xce\xc5\x78\x10\x5b\xfc\xd2\x92\xd5\x5b\xb2\xeb\xbd\x99\xee\x23\x2b\xca\x0b\xee\xe5\x05\xbb\x79\xda\x5b\xa1\xff\x06\x83\xf0\xec\xdf\xf2\x2c\x71\x9e\xe5\xf7\x3c\xcd\x23\x9e\xfd\xaf\x0d\x6d\x75\xa1\x2d\x2f\x8f\xfb\x93\xf7\x5a\x68\xb5\xf4\x80\x15\xe9\xcf\xb8\x3a\xb5\x38\x05\x8e\x47\x68\x79\x4f\xfc\x19\x27\xe6\x3f\x0d\xc8\xa5\x75\xcf\x7a\xcd\x7e\x3e\xce\xe1\xe7\x7c\x2e\x25\x36\x5b\x7d\x72\xc9\x0e\x81\x2e\xff\x7e\x34\xa7\x5c\xa6\xc3\x9a\x69\x5a\x07\x2b\xc2\x0e\x2e\xc4\xb1\x1d\x2c\x83\x8f\x0c\x2c\x57\xd3\x40\x25\x68\x30\xd3\x5d\xfc\x8d\x9d\xf4\x01\xbf\x28\x17\x59\x3e\xce\xd1\x0b\x64\x38\x8e\xca\x01\xd7\xe2\x67\xcb\x2b\xca\x7a\xbc\xec\x7b\x08\x31\x00\x16\x0a\x54\xcf\x05\x87\x88\x51\xfc\x50\xe8\x7c\x2e\xdc\x6f\xcb\x66\x83\x10\x17\xd9\x96\x79\xb3\x02\x68\x44\x0f\x34\xcd\xb5\x8f\x5c\x47\x6f\xa0\x2a\xe9\x25\xa2\x64\x2f\x41\xb8\xe8\xb9\xcc\x40\x48\x2f\x69\x6d\xc5\xd4\xa4\x3d\x8a\x90\x25\x47\x31\xec\x89\xfb\x79\x51\x78\x14\x62\xb7\xf8\xda\x7d\x96\xe9\x0f\x01\xe6\xd5\xf5\x0a\x5f\xff\x15\x2a\x22\x25\xf0\x68\x35\x49\x90\x8e\x07\xf3\xe0\x95\x68\x93\x1c\xb2\xb1\x47\xaa\x55\xb6\x7d\x2c\xaf\x15\xb0\xfa\x60\x2b\x99\x3c\x35\x7e\x2e\x5b\xcc\xb3\x84\x70\xa6\xbb\xc8\x72\xd9\x32\xfb\x52\x81\x96\xe5\xfd\x38\xb7\xbc\x56\xc4\x6b\xf8\x38\x47\x45\xb8\x78\x36\x93\x3e\x11\x9b\x8b\xd7\xd7\xe5\xd9\xce\xe7\xc5\xe1\xc9\x2b\xd9\xea\x03\xb6\xf4\x95\x39\x44\x92\xcb\x63\x93\xcb\xd1\xfb\x56\x1f\xf9\xa4\x97\xd4\x7d\xf5\x32\xc0\xe5\x0d\xd8\xf7\x3e\x4c\xb8\xb5\xdd\xac\x42\xc4\x11\x3f\xff\xc2\xb1\x67\x50\x6f\xa2\xba\x8f\x96\x01\xf1\x45\x0c\xe2\x30\x81\x18\xc4\xb7\x01\xf2\xc9\x65\xde\xa1\xf7\xb1\x1e\xe0\x43\x10\xce\xc0\xe3\x51\x44\x91\xaa\x03\xf5\xc4\x12\xd9\xca\x06\x24\xb0\x13\x8f\xaf\x32\x84\x54\xe6\x6a\x3a\x10\xbc\x5d\x0a\x8c\x03\x3b\xaa\xd7\x1d\xab\xcf\x5a\x69\xf9\x9a\x16\x49\x2d\xb2\x90\x2d\xe5\x25\x32\xfb\xac\x1b\x2d\x5d\x6f\x42\x5c\xae\xc5\xa2\x49\x48\x28\x32\x34\x9c\x2a\xb9\x44\x9a\x16\x1a\x93\xf1\x44\x47\x78\x43\x71\x64\xea\xf0\xd4\x47\xf8\x8d\x4f\xaa\x0d\xb4\xf4\x49\x08\xa0\xd0\x4b\xc4\x8e\xf6\x49\xb0\xf4\x5a\x2e\xe0\x08\x9f\xad\x0e\xcd\x21\xad\x4a\xc8\xa5\xe5\xb5\x62\xb6\x28\xbd\x99\x5e\x7c\x40\x12\x0e\xba\xb0\x81\x74\x9a\xe3\x40\x17\x61\x97\x6d\x64\xaa\x2a\xe7\xfd\x24\x94\x92\x2f\x69\x64\x85\xb7\x08\x66\x52\xd8\x17\xb2\xf3\xc5\x62\x80\x47\xbc\x56\x8f\xd5\x6e\xba\xf0\x0a\xb4\xc1\xa7\x01\x61\x7f\xb8\x8f\x05\x73\x6b\x07\x5f\xaa\xf7\x88\xd1\x5a\x2d\x1f\xe7\x45\x2d\x45\xbe\xae\x38\x5f\x78\x2e\xb8\x93\x79\x71\x49\x97\x8a\x48\x08\x21\x5d\x8f\x78\x77\x48\xfd\xca\x64\x9c\x64\x32\x9a\x17\x58\x26\x33\xa8\x25\x2e\x9f\x53\x2a\xb1\xdb\xf2\xde\x10\xbe\x2d\x5f\x53\x6b\xdd\xea\x2f\xad\xf9\xaa\x14\x03\x7a\xa3\xe0\xe0\xad\x3e\x71\x59\xcf\x29\x32\xa9\x1a\xa9\xab\xa4\x46\x18\xaf\x0c\xd8\x55\xcf\xc9\xfe\xac\x05\xeb\x47\x5c\x38\xbc\x8c\xce\x9e\xce\xce\x49\x06\x20\xa0\x81\x49\x00\x65\x78\x0c\x65\x40\x06\x89\xd4\x5d\x46\xc9\x42\xc6\x42\xb0\x78\x6f\x9c\xf6\x37\x5f\x14\xe4\xe7\xa3\x08\xa6\x99\x8c\x5f\xf5\xeb\x20\x20\x09\xc2\xd3\x7a\xab\x26\x81\xa5\xc1\x0f\x7b\xc0\xe6\x2b\xe6\x53\x7c\xec\x0a\x89\xd0\xa3\xe5\xa1\xf7\x63\xdd\x43\x10\xb2\x57\xde\xfc\x78\x08\xec\x99\x78\x5d\x70\x7b\x9e\x42\x10\xf9\x02\x0e\x86\xb3\x55\xdf\xc5\x3d\xb6\x76\xba\xcb\x48\xca\xd9\x5e\x09\x57\xae\x76\x10\x2e\xa5\xe8\x6b\xdd\x83\x3e\x71\x72\xfa\x68\xae\x44\x6c\xeb\x24\x31\xf7\xb3\x07\x2e\x8b\x9e\x2a\xb4\x92\x04\xd4\xdf\x1e\x8f\x06\x4f\x95\xdb\x24\xae\x21\x8b\xb1\xc2\x9d\xbd\xf5\x9b\xdf\xe3\x91\x14\x33\x0d\x7b\x82\x21\x14\x6b\xfa\x5a\x1f\x82\xde\xaa\x42\x88\x42\x42\xb5\x28\x47\xf9\xa6\xd8\x91\x79\xc0\x82\x62\x76\x7a\x25\x12\xb1\x35\x66\xb5\x99\x4a\xdc\x8b\x41\x79\xf6\x78\x70\x6e\xee\x3e\xee\xf6\xfa\x54\xa7\xdc\x13\x8a\x8b\xc3\x1e\x45\xfc\xee\xbe\x98\x9e\x9e\x74\x35\x62\xd3\x80\x21\x77\x39\x84\xe3\xa0\xae\xd3\x77\xef\xde\x6a\xcd\xdf\x10\x40\x4b\xf3\x77\x54\xd7\xa9\xfa\x0a\x37\xba\xdf\x62\x4a\x76\xec\xff\xf9\xbe\xf3\xbd\xf5\xff\x39\x3b\x11\xa6\x3d\xf6\xfe\xfd\x7f\xbe\xb7\x4c\xf6\xba\x15\xcb\x57\xf6\xe6\xe5\x1f\x21\xaf\xcb\x5e\xff\x67\x27\x2a\x66\xaa\x3f\x2b\x85\xee\x8c\x86\x65\xd9\x2a\xd0\x3e\x2a\xf1\x3c\x9a\x15\x12\xef\x38\x02\xc4\x14\x47\x42\x3c\x8b\xa9\xd1\x71\x09\xdb\x41\xd1\xb0\xd0\x0c\x73\x09\x7b\x87\xa3\xa1\x1d\xa0\x9f\x88\xaf\xed\xa9\xef\xe8\x83\x90\x9d\x24\x3c\x6e\x24\xa7\x98\x1a\xfb\xc4\x6f\xe9\x01\xcf\x12\xb0\x29\xc3\x3e\x3b\x61\xf2\x77\xbf\xde\x44\xc8\xe4\x19\xac\x80\x8c\xa9\x1e\x08\x47\x34\xf5\x9d\x08\xa7\x01\x42\x2c\x75\x06\x77\xe2\x16\x85\x0b\xd9\x00\x87\x6c\x51\xc3\x95\x7c\xe6\x25\x5a\x2e\xef\x49\x5f\x10\x72\x6c\x60\x9c\x66\xeb\xb8\xf2\xc9\xf7\xd4\x3d\x3e\x92\x3b\x43\xdd\xec\x1d\x77\xb9\x41\xb5\x5c\xc9\x2c\x67\x9a\x33\x90\xac\x6b\xd9\x7a\x74\xdc\x38\x82\xfd\x48\x21\x1a\xb7\x4c\xe1\x98\xc1\x03\x73\x45\x8f\xab\x85\x0b\x4d\x7b\xb7\xd0\x5f\xe4\x7b\xe1\xcd\x6c\x35\x42\x7e\xde\x7e\xa9\x49\xb5\xe7\x71\x64\xb8\x21\xd8\xc1\xab\x5d\xc4\xa2\x85\xed\x95\x8e\xd9\x1f\x85\xaa\x77\x1c\x09\x8c\x20\x74\xbd\xe7\x9b\x2e\xec\x62\x11\xfc\x46\x8e\x5b\x54\x4a\x1a\x4b\x64\xdd\xae\x14\x58\x9d\xd6\x86\x08\xef\xda\x71\x41\x60\xe3\x86\xe4\x9f\x8d\x0b\x62\xf4\xbf\x1a\x75\xfc\x96\x16\x41\xb3\xb6\x62\x2e\x32\xb5\xee\x8d\x8b\xfe\xc6\x15\x97\xe0\x4d\xf3\x59\x61\xe5\x25\x99\x1e\x47\x5c\xe6\x0b\x31\x05\x79\x5c\x1a\x00\x79\xbf\x5e\x57\x94\xb6\xa9\xed\x3b\xe2\xee\x3d\x90\x9a\x93\x7c\x59\x6d\xdf\x51\x62\xde\x32\x22\xf6\x96\x6e\x1e\xb4\xb8\x26\x72\x0a\x75\x12\xe8\x00\x8c\x17\xf4\x28\xc3\x9e\x34\x2e\x10\x2b\x57\x4c\x12\x12\x57\x89\x2f\xe5\x41\xac\x44\x0f\xa4\x72\xaf\x8a\xba\xa8\xed\x39\xa8\xa4\xb8\x9e\x06\xd9\xdf\x87\xf5\x52\x37\x5f\x07\x31\xc9\x03\x4a\xe0\xb7\x5d\xe7\x55\x98\x07\xf2\x63\xa3\xd2\x39\x6d\xc9\x25\xa6\xc8\xb4\x73\x45\xab\x06\xa8\x75\xc9\x0b\x7e\xcf\x6e\x38\x8c\x58\xe2\x23\xe2\xc7\xe6\x06\x91\xa9\x3c\xfe\x1a\xb0\xa4\xb2\xf3\xa5\xcd\x22\x7a\x5b\x8c\x16\x47\x3d\xc6\x2e\xc9\xad\x54\x07\x0d\x1c\xb4\xb4\xde\xac\xf2\x7b\x92\xca\x8f\x86\xa5\x50\xa8\xd1\x10\x34\x39\x44\xe5\x45\xf8\xae\x02\x0a\x0b\x16\xb1\x80\xbd\x12\xa6\x2d\x48\x76\x97\x1b\x2c\x14\xfc\x9e\x8f\x10\xf6\xf3\x4d\xe0\x4b\x3f\x04\xfe\x4a\xf0\xaa\xc0\xf2\xed\xd0\x61\x64\xb2\xa6\xe9\x51\x9d\x0c\xc2\xba\x52\x87\x1d\x3a\x0c\x9e\x80\x29\x8b\x72\xf8\xc8\x4f\x15\x20\xc3\xdb\x01\x23\x7d\x57\x09\x64\x3e\x00\x4e\x82\x59\xec\xb0\x90\x98\x42\x2e\xbd\x3c\x66\x24\xb6\xe1\x1c\x1b\x9c\x36\x62\x42\x15\x7a\x4d\x21\xad\xc7\xaa\x30\x85\xe4\x5c\xab\xc5\x48\x3c\x90\x52\x78\x5c\x58\x54\x0e\x2f\xbd\x42\x82\x50\xc9\x6e\x41\x99\x51\x49\xf0\xb1\xb2\xe8\xab\x37\x32\x39\xc7\x28\xda\xb1\xbc\x2a\x91\xa2\x65\x80\x22\x4f\xd4\x53\x50\x69\x3e\xdb\x96\xcb\xfc\x52\x4b\x92\x3f\x60\x1e\xf2\x98\x05\x23\x9f\x6c\xb2\x88\x10\x1e\xbe\x4a\x86\xe1\xf5\x3a\x9a\xf6\x75\xd5\x20\x1c\x6f\x10\xff\x73\x75\xfb\xfc\x72\x88\x5f\xa3\x47\x8c\x4c\xf8\xbe\x93\x4e\x18\x85\x96\x76\x83\x20\xdb\xc1\x5d\x9e\xa6\x7b\x9e\xb7\xc8\xa6\x8b\xc9\xcc\x45\x5b\x3b\x38\x66\xa9\xff\x51\x32\xa6\x2d\x70\xa8\xd0\xfa\x2e\xc2\xc4\x7c\x37\xbc\xf1\x70\x6b\x07\xf7\x20\xa3\x3f\xf6\xd2\xd2\x97\x5f\xb7\x76\x70\x1f\x3e\xe9\x59\x12\x3f\x2e\xd4\x9a\x16\x2c\xf7\xe2\x21\x70\xfd\x24\x9e\x07\x48\xdf\xb6\xe9\xf6\xb3\x53\x47\xad\xef\x86\xee\x8d\x93\xc9\x22\xa5\x23\xdf\x1d\x3f\xa2\x52\x8d\x3b\x78\xc0\xeb\xfb\xfe\xf0\xeb\x77\x03\xbd\x34\xf1\xee\x92\xe5\x5e\xed\xd0\x70\x6d\x8c\xa9\xfe\x7d\xc7\xff\xbe\x63\xff\x67\x87\x35\xb2\x83\x47\x62\xc4\x81\x1f\x67\x8b\x68\x1e\x3f\x7f\xdf\xc9\xa6\x0b\x36\xea\xf1\xeb\x83\x99\x28\x9f\x44\xff\xd6\xf2\x4c\xff\x52\x07\x13\xc8\xf5\x7d\x87\x7e\xdf\xd1\xed\xef\x0f\xdb\x4e\xfd\xbb\x81\xea\xdf\x1f\xea\x3b\x78\x32\x83\xf2\xeb\x9f\x58\xb7\x53\x28\xc7\xe7\xea\xbb\x5f\xff\x6e\xe6\x8f\x5b\x3b\x31\xce\xca\x5f\xb7\x76\x62\x85\xa7\x9a\xce\x8a\x23\x71\x36\x04\x09\x31\x89\x7b\x5c\xb2\x0a\x7e\x31\xfa\xc5\x4b\x40\x06\xc5\x8b\x4b\x7a\xc5\x4b\x48\xe6\x43\xee\x09\x83\x6d\xe9\xeb\x20\x6a\x3f\x4e\xf4\xc9\xcc\x9e\x4c\x9d\x7a\xb7\x47\xd9\x2f\xcb\xa4\x53\xa2\xaf\x67\x88\x78\x86\x3c\x23\x82\x5a\x43\x84\x16\x8b\x48\x3c\xe6\xac\xb6\xa6\xd1\xc5\x42\xf7\x17\x8b\x60\xb1\xf0\x90\xa6\x85\x8a\xdb\x8a\x1e\x5d\x1f\xca\x44\x1d\xca\x54\xed\xfd\x38\x7f\xb1\x28\xef\xbd\xb5\xb1\x77\x43\xd1\xbb\x51\xa9\x77\x39\xb5\xa1\xbb\x70\x51\xeb\x23\x4d\xa3\x0a\xcd\x3c\xef\xe5\x6a\x22\x99\x68\x88\x96\xfd\x28\x81\xe1\x5e\xa0\xaa\xe5\xb9\xd8\x23\x97\x82\x72\xa0\x92\x72\x90\xfa\x9e\xc0\x39\xf8\xc0\xb0\xff\xfe\xdb\xbb\x60\xb1\xf8\xa3\xb1\x1f\x70\x1b\x13\x49\x20\x5b\xae\x78\xf1\x8b\x40\x81\xac\x32\xd2\x84\x26\x02\xa9\x16\xdd\xd8\x27\x81\x15\x6c\x6f\x23\x5a\x27\xfe\xaf\xba\x07\x55\x07\x68\xfb\xf7\xb7\x08\xfb\xbf\x92\xdd\xdf\x2d\x70\x0b\x42\xfa\x54\x77\x71\xb3\xe0\x56\x72\x41\x01\x71\xd9\x5f\xaf\xc5\xc6\x01\x1c\xd5\x59\x1f\x42\x21\x72\x4c\xf2\xd0\xa3\xe4\x25\x8c\x93\x34\x3b\x8f\x47\xc1\x69\xca\xaf\xa3\xcd\x92\xf3\x85\x64\xa6\xea\x30\xba\xc0\x29\xec\x7c\x4f\x5a\xdf\x47\x3b\x88\x91\xf4\x1f\x64\x10\xe7\x7a\x1a\xd1\xba\xee\xd5\x9b\xa8\x7e\x12\xd1\xba\x8b\xf2\x4f\x80\x50\x0f\xa6\x4e\x5d\x4f\x82\xfa\x49\xac\xa7\x01\xde\x6e\x12\xe2\xb7\xd8\xe9\x67\xfa\xa8\xbe\x95\x20\xb4\xfc\xaa\x27\x33\x3c\xe4\x71\xb6\xe6\x71\x6a\x78\xe9\xdc\xf8\x4c\x93\x34\x68\x73\x3f\xd5\xc9\x2c\x8f\xaa\x15\xba\x7a\xc2\xb8\x00\x5c\x53\x32\x28\x27\x4b\x3a\x5b\x8b\x80\x7c\xd3\xd3\x1f\x7a\x74\x25\xaa\x77\xd8\xe7\xc7\x39\x1b\x5e\x81\x64\xd7\x3a\x90\xd4\x70\x5a\x34\xfe\xa6\xeb\xea\xe9\x6c\x35\x44\x6a\x71\x7f\xc1\xf9\x47\xf2\x98\x68\x9a\x3e\xd8\xde\xc6\x23\x32\x41\x56\x4a\x14\x03\x07\x4f\x47\x2f\x13\x32\x2a\x22\xa7\xa7\x72\x2f\xa4\x96\x2b\x4b\xd6\xeb\x78\x44\x1a\xac\x24\xc0\x60\x4e\xd0\xc5\xa1\xde\x7f\x47\x72\x22\xe3\x29\x01\x58\x3a\x72\x1d\xbd\x5f\xaf\x23\x6b\x54\xaf\x0b\x3e\xa5\xda\x64\x95\x25\x41\xcb\x23\xd5\x86\xe9\x12\x32\x8d\xa8\xa6\xe9\xfd\xfd\x08\x64\xb3\xac\x00\x62\xdf\x35\xad\x5f\xaf\x63\x0f\x82\x11\xcb\x83\xb6\x25\xdb\xc7\x8f\x49\x49\x40\xe5\xeb\xf2\xd0\xec\xe3\x80\xcc\x2c\xb8\x35\x14\xf6\x8c\x5c\x6e\x1a\x12\x72\x16\xe5\x86\x2a\xcf\x89\x48\x7b\x4a\x16\x8b\x90\x8d\x2d\x37\xbd\x6b\xe9\xae\xce\x72\xe2\x4b\x64\xe6\xd9\x66\x01\x7a\xf1\x49\xdf\xe2\x4c\xa6\x30\x26\x60\x35\x87\x55\xf2\x94\x58\xf0\x8c\xf2\xac\x20\x19\xed\x6f\x37\x31\xa4\x63\x9e\x28\x8a\x02\xe5\xcc\x73\x5e\x07\xd0\x76\xd1\x85\x97\x90\xcf\xb2\xab\xe7\x81\x3a\xb9\x20\x84\xed\x90\x64\xa6\xff\x72\x3b\x0a\x1e\x27\x81\x07\xbe\xfe\x65\x50\xc7\x4a\xed\x97\xfa\x9b\xb0\xfe\x4b\x4d\x78\xe4\x9f\xce\xc6\x59\x50\x19\xd2\xa4\xff\x0b\xa6\x78\x80\x47\xdb\x4d\x64\x2d\xf3\x90\xb8\x01\x2a\x55\x59\x53\xaa\x0c\x46\x3e\xc4\x49\x09\x1e\xa5\x77\xff\xf1\x24\x18\xf1\x0a\x6b\xbc\x2e\x45\x56\x0e\x68\x02\x4b\xf7\xad\xb5\xda\x4e\x84\x67\x01\x5a\x82\x3f\x1b\x98\x15\x4d\x0b\xab\xe4\x3a\x80\x9f\xc7\xb5\x39\x7a\xb5\x17\x45\xff\x6b\x45\xff\x61\xb6\x20\x26\x32\xc4\xa6\xce\xab\x7f\x4c\x16\x0b\x57\xc1\xee\xb2\x5b\x30\xad\xad\xbe\xd9\xdf\x6e\x8a\x0e\xda\xdf\x93\xef\x23\x87\xf1\xec\x97\x8a\xc8\x26\xe0\xc4\xf3\x0a\xe4\xae\xd0\xc7\xbe\x8e\x2c\xb7\x4a\x9e\x19\x48\xfb\x3a\x42\xc2\xb4\xba\x20\x1e\x15\x5d\x1f\xd7\x58\xc3\x5b\x38\x82\x20\xa9\xb8\x4f\x1a\x78\x40\x1a\x00\xbe\x13\xd2\xc0\x7c\x07\x61\xd0\x10\x80\x60\xd9\xcf\xec\xcf\xa1\x80\x30\x4d\xd3\xe7\x24\xd0\x11\x3e\x24\x73\x60\x68\x64\xa7\x8e\x59\xaa\x75\x0c\x70\x77\x4c\xde\x04\x3a\x62\x8c\x13\x5b\xda\x43\x4d\xd3\x0f\xc9\x31\xe4\x8e\x43\x9d\x3d\x54\xc9\xe1\xca\x4c\x5f\x07\xde\x38\xf1\x2b\x5d\x9a\x56\x6a\x75\x96\xa5\x5e\xab\x84\x71\x30\xf0\x6b\x75\xbd\x49\xa0\x74\xeb\xd2\x7c\xec\xa2\x7a\x0d\x57\xdc\x59\x56\xc9\x17\xa6\x56\x3f\x64\x0b\xb2\xdd\x04\xbb\x1c\xb6\x90\x05\x29\xf9\x09\x14\x30\x49\xc3\xba\xd8\x67\x35\x58\x17\xf5\x3a\xfa\x64\xcf\xed\x0b\xc7\x21\xc7\xf6\x85\x63\x3d\xb3\x39\xfb\x24\xc4\xe9\xf0\x72\x9c\x53\xfb\xcf\x4b\x64\xe5\xc8\x0b\xfe\xda\x77\x53\x47\xc1\x9b\x8f\x85\xec\x12\x26\xd9\x9b\x72\xc2\x3f\x9d\x71\x5a\xf7\xc3\x8d\x74\x56\xd9\xf2\x4c\xa9\x97\xe2\x4e\x29\xa1\x30\x6b\x2b\x76\x57\x70\x5f\xe2\xda\xd4\xc1\xd5\xa7\x1e\xb0\xa5\xb9\xb4\xf1\x76\x94\xce\x26\x93\x71\xc2\x86\x0b\x31\x74\x2a\xb5\xba\x74\x51\xe0\x4f\xa9\x8c\x4d\x7d\xc5\x58\x67\x58\xf5\x27\x76\x52\x71\x09\xb7\xb9\x2e\x20\x18\x50\x21\x2e\x87\x73\xaf\x68\xe6\xd3\x38\xab\xd0\x42\x30\xae\xde\x03\x60\xee\x0a\xbc\x54\x59\x0e\x67\xb8\xe6\x8e\xc7\x83\x80\x8e\x6a\x1b\xbf\x73\x76\x81\x10\x72\xd1\x5d\x62\x9f\x66\xc1\xa6\x5c\xe0\x3a\x80\x66\x81\xce\x0e\x16\x19\xfb\xe1\x4f\x33\x82\x76\x41\xe8\xd3\xa7\xcd\x0d\xb3\xc3\xf7\x3a\x28\xf9\x87\xca\x4a\x5c\x94\x0b\x87\x1d\x17\xc2\x52\x4a\xbc\x58\xf7\xd8\x39\xc6\xa3\x01\x48\x86\xff\x78\x42\x89\x9a\x9c\x2f\x6e\xb5\x0a\xc9\x27\x54\xec\x28\xa1\x33\xd8\x24\x1e\x84\x4f\xbc\x08\xb2\xee\xd8\x5f\x2c\xd2\x48\x68\x04\x8e\x29\x14\x79\xec\x26\xf7\x65\x95\x33\x6e\xd8\xd0\xd7\x9f\x7b\x22\x6a\x75\xd0\x54\x96\xe5\x86\x21\xc0\x21\x54\x06\xea\xa8\x39\x2c\x30\x30\x90\xd9\x45\x13\x2e\xeb\xaa\x12\x09\x00\x82\x85\xa5\x3f\x60\x98\x71\xa8\x73\x4a\x32\xbf\xfa\xc3\x1e\x11\x62\x63\x1f\x59\x6f\xf7\xf6\x08\xf1\x8c\xf3\xb9\xa6\x75\x67\xba\x27\x1c\x08\x09\x27\xad\xfc\xb6\x0d\xae\xc5\xb8\x94\x71\x87\x31\x12\x5b\x3b\xf8\x43\x44\x91\xe5\xc1\x0d\x54\x80\xac\x80\x91\xa7\x3e\xb2\x7c\x52\x8d\x63\xbd\x4b\xf5\x94\xbd\xda\x6f\x85\x36\x04\x12\x3f\x56\x41\xb1\x06\x48\xd3\x7c\x2b\x60\x0d\xfa\xad\x79\x6a\xde\x47\x8c\x5a\xf5\xc4\x0d\x83\xbc\xb7\x9b\x72\xbd\x9b\x80\x50\x2b\xef\x72\xf0\x5a\x97\x7d\xd9\x5d\xeb\x8d\x74\x7e\xb7\xf3\x7d\xc7\xf3\x3c\xc6\x9e\x25\xc8\xda\xf9\xbe\x33\x99\xb9\x5b\x3b\xd0\xbe\xcf\xbd\x7b\xe6\xd9\xe0\x0b\xcb\x86\x3d\xe3\xab\xa7\x77\xba\x14\xd3\x10\xc9\x21\xfa\xf2\x6e\x7f\x36\xd4\x03\x29\xdb\xad\x12\x31\xd2\x60\x7d\xa4\x38\xcc\xd9\x0c\x9f\x11\xea\x83\xfc\x45\xd3\xaa\xa1\xa6\x05\xaf\x0e\xdd\x87\xb1\x4e\x67\x7c\x3a\xe7\x62\x5a\x93\xbc\xbc\xc5\x38\x7e\x4d\xf3\x11\xf8\x3e\x62\x4b\xc9\x16\x17\x1a\x81\xcc\x58\xcd\x8c\x45\x5e\x81\x82\xc6\x54\x06\xb1\xa7\x63\x2a\xaf\x23\xfc\x26\x39\xe8\xd1\x7a\xdd\x9a\xcd\x18\x1e\xe4\xc4\x1d\x38\xe1\x62\xc8\xa4\xfd\x4c\x4d\x2f\xc3\xef\x9f\xa9\xe9\x67\xf8\xee\x89\x9a\x35\xee\x84\xfc\x74\xd4\x0b\x60\x6b\xd5\xf0\xe4\x89\x9a\x47\x29\xbe\x0b\xa9\x99\x46\x4b\x7c\xd8\xa3\x42\x96\xae\xbf\xd4\xbe\x6c\x1f\xd3\x8c\xde\x40\x64\xc0\xed\x83\x59\xd6\xad\x99\xc3\x68\x89\xf0\x41\x8f\x92\x06\x9e\xcf\xc0\xa9\xc9\x0c\xc2\xee\x86\x94\xec\x71\x8b\xdd\xd9\x8c\x1d\x3d\x0f\x33\xe2\xc6\xf6\xf9\xd4\x51\x98\xbb\xa3\x1e\xd5\x0b\x34\xcf\x31\xe9\x6c\x56\x32\x61\x75\xc9\x6c\x06\x0e\x41\x8c\x8f\x7b\x9a\xe6\x1a\xe1\x4c\x47\x8a\x3a\xcb\x71\xaf\x6c\x9e\x0a\x02\xfb\x87\x80\xdf\x31\x8b\x8b\x51\xc1\x80\x78\xa8\x70\x57\xc5\x72\x8d\x40\xac\xef\x81\x5f\x4f\xdb\xb1\x38\x71\xee\x11\x6a\xea\x2a\xd3\x82\x03\xc9\xb4\xd4\x9b\x0c\x0e\x02\x79\x6b\xc0\xd6\x51\x58\x7e\x72\x33\xe3\x50\x3a\xda\x10\xa2\xa9\xd0\x0e\x1c\xc8\x3c\x08\x11\xee\xb3\x99\x09\x5d\xbd\x8f\x23\xbb\xe1\x20\xab\x6f\xdc\xbc\x85\x1c\x96\xcf\x6f\x87\x97\x72\x16\x06\x95\x78\x54\x71\x19\xb5\xe6\xda\x03\xc7\x8a\x18\xad\x59\x34\x92\x7b\xf3\x80\xab\xf8\xc0\xb1\x8f\x7c\x87\x90\x01\x7a\x61\x2f\xac\xce\x41\x9d\x8b\xc0\x42\xc4\x8a\x0a\xe5\xa7\x65\x04\x06\x70\x2f\x4b\x1c\xba\x7a\x80\x07\x08\x07\xe5\xbc\x18\x7a\x11\x20\xb4\x1c\x10\x50\xf1\x69\x40\x4b\xe8\x65\x50\x27\xa3\xd0\xf2\xca\x23\xcd\x3b\x01\x82\x61\xd1\x32\xb2\x06\x75\xe2\xe5\x22\x35\xa9\x56\xba\xbc\x27\x00\x10\xd6\x9b\x7b\x23\x1d\xaf\x7a\xc4\x14\x6a\x77\x2e\x78\xf1\x93\x1a\x46\x52\x22\x48\x13\x6e\x3e\xe0\x11\xdf\x38\xf1\x5b\x7e\x49\x2b\x58\x55\xb6\x03\x3e\xf3\x72\xe9\x91\xe3\x58\xe7\x2e\x0c\xe4\x59\x20\xcd\xa0\xc1\x14\xb1\x47\x85\x1d\x31\x3b\x0b\xb0\x40\xff\x6c\x87\x85\xec\xcc\x67\x54\x81\x1e\xb2\x83\x1d\x09\xec\x14\x4e\xc0\xa5\x99\xa6\xc9\xc9\x28\x8c\x15\x6d\x46\x70\x85\xec\xd4\x16\x44\x57\x9f\x4d\xc9\x60\x7f\x64\x0d\xea\x75\x14\xb1\x69\x79\x81\x23\xbe\x6f\x0f\x1c\x3c\xa0\x6e\x30\x30\x6d\x67\xc9\x8f\x6b\xd6\xaa\xb0\xe5\xc5\x23\x12\x81\x11\xef\xfe\x08\x0c\x79\x23\xbb\xef\xd8\xf7\x9e\xc3\xe7\xb5\xe1\xd8\x7d\x06\x2b\x84\xfb\xcc\x5f\xc9\x3b\x20\x2c\x37\xf6\x8c\x0f\x91\x3e\xb0\x4f\x1c\x3c\x80\x92\x6c\x01\xe0\x82\x29\x64\x94\x44\x64\x45\x84\x3d\x58\x23\x12\x12\xd6\x72\xab\x69\x36\x84\x25\x31\x2c\xe3\x68\xbf\xcf\xd8\x27\xf4\xe2\x19\x37\x53\x85\xd9\x1f\x00\x1d\x19\xf1\x61\x4d\x60\x58\x9e\xe1\x79\xfa\x68\x3b\xc4\x03\xcc\x48\x9b\xc8\x1e\x38\xf6\x89\xc3\x3a\x3a\x72\xec\x81\x83\xd0\x72\xe9\x33\x30\xf7\x0d\x08\x2a\x42\x3c\x7b\x26\xf0\xb7\x8c\x60\x00\x71\x2d\x7c\xee\x2f\x79\x7a\xca\x70\xe3\x23\xc3\x8c\x42\x57\x05\xc2\x3b\xec\xfc\x47\x7f\x31\x7e\x5d\xa2\xad\x1d\xd4\xd2\x3d\x72\x18\x82\x87\x82\xc7\x99\xee\x21\x64\xf6\x7c\xaa\x7f\x18\xb3\xc7\xfc\x4c\x81\x65\x1c\xcd\xd1\x93\x90\x6b\x3f\x76\x29\xfe\x5a\x80\xd4\x8a\xb5\xd1\xeb\xc1\x93\xd8\x29\xac\x96\x53\x9d\x51\x2a\x22\x28\xca\x7b\x8e\x3d\x32\x9f\xd9\xae\x70\x79\x03\x8f\x9c\xde\xf6\x8c\x69\x5b\x5f\x33\x72\xba\x88\xd3\x34\x1e\x45\x15\x08\x0d\x54\x09\xc7\xb9\x71\x43\x25\xf6\x85\x5b\xf5\xe5\xbd\x31\xca\xf5\xb1\x66\xb7\xf2\xe9\x2c\x7f\x3a\xef\xc9\xa7\x49\x1e\xe2\x61\x7e\x2c\x9f\x3e\xee\x81\xb5\xb2\x71\x3a\x20\xec\xe7\xfc\xa3\xfc\x70\xdd\xe7\xaa\x5c\x87\xa3\x55\xf7\xde\x52\xcb\xb6\x4a\x3a\x8b\x45\xe3\x9d\x72\x2d\x7e\xcd\xe3\xde\x54\x64\x74\x34\x25\x48\xe1\x68\x3c\xda\x1e\x05\x11\x05\x73\x0d\x4e\x63\xd6\xa4\x6d\xe1\x80\x50\xeb\x39\xd7\xb8\x2e\xb0\xfc\xc1\x8c\xab\x95\x9e\xdd\x6a\x9a\xee\x52\x6e\x9e\x65\x9c\xdd\x22\x4c\xe5\xf8\x14\xa6\xe9\x49\x11\xbd\x50\x36\x9b\x2f\x02\x78\xcc\x6f\x01\x16\x3a\x8e\x93\x14\x73\x57\xb9\xa6\xfd\xc2\x83\x45\x98\x2e\x96\x6e\xea\x3d\xbc\x1a\xe0\xc3\xf4\x97\xce\x12\xb4\xda\xc3\xd9\xba\xb5\x97\xb8\x68\xa2\x63\x2a\x2e\xae\x24\x2d\x79\xde\x63\xfd\x35\xb2\xa9\x14\xd3\x8b\xd4\xdc\x5b\xf8\x97\x2e\xad\xab\x9f\xfc\x66\x7e\x67\x71\xfe\x11\x9c\x42\x79\x75\x72\x1a\xd1\xba\x3c\xb2\x27\x4d\x9e\xf6\x31\x12\x4a\xf2\x93\x26\xb2\x58\x0b\x8f\x1c\xeb\x42\xda\xfc\x58\x9e\x66\xb6\x83\x03\x8e\x76\x73\x93\x87\xf9\x31\x47\xba\x41\x3d\x08\xeb\x22\x05\x1c\x3a\xb1\x5a\xba\x02\xff\x46\x21\x5a\x52\x22\x8f\x46\xb9\x3a\x70\x18\x4a\xfd\x02\x84\xdb\x7d\x4d\xd3\x41\x31\x02\x53\x46\x23\x8d\x62\x8a\xbb\x76\xe6\xe8\xb9\xb9\xdd\xbf\xa5\xe5\x3e\xbf\xec\xdf\xfb\x1d\xd5\xbb\x06\x75\x53\xfd\xb5\x6c\xff\x01\xfb\x45\x99\x19\x21\x9c\x3b\xff\x62\x34\xe5\xcb\xd2\x9a\xcf\xec\x95\xf9\x72\xb8\x25\xbe\xb8\x60\x0e\x9a\x96\x4b\xae\x22\x46\x32\x11\x3f\xe3\xd7\x21\x19\x76\xc9\x4d\xc2\x70\x32\x49\x23\x48\x7a\x59\xe2\x1d\xbb\xa5\x39\x74\x90\x91\x68\x1e\x3f\xeb\x9a\xfd\x1f\x8d\xc7\x56\x11\x82\xcc\x56\x40\x8e\x52\x53\xf7\xc9\xd3\x50\xa7\xf8\x4d\x0c\xde\xde\xd3\x08\xbc\x28\xb3\x13\x39\x80\xa3\x9f\x21\x58\x1c\x54\x09\xf1\x32\x4d\x63\xbf\x7e\xb6\x58\x54\xb7\x62\xdd\xc7\x43\x28\xa1\x6f\xa2\xf2\xc1\xe0\x4f\x50\xf9\x01\x82\x73\x35\x8d\x10\xab\xef\xa5\x60\x17\x14\xf7\xdc\xde\x12\x7b\x24\x50\x58\x09\x20\xbf\xdb\x53\xce\x46\x7b\x84\x1c\xa5\x20\xd2\x89\xf5\xac\x4b\x11\x12\xd7\x47\x9e\x4b\x31\xe7\xbb\x5d\xfb\x61\x66\xc4\x63\xfb\x72\xea\x18\x47\x97\x9f\x3a\xed\x4f\x9d\x1f\x9d\xaf\x9f\xdb\x0e\x03\xce\xd7\xbe\x11\x48\x37\x44\x1c\xd2\xce\xd3\x24\x30\x3a\xed\x2f\x1d\xb4\xa1\xce\x83\xdb\xce\xc9\xe5\xf5\xe9\xb7\x83\xce\xe9\xe5\xa7\xd5\x4a\xcb\x1f\x45\xad\x8c\xee\x1b\x27\x02\x7b\x42\xdd\x37\xa7\x1f\x3e\xb5\x8f\xf3\xda\x8d\x4b\x56\xee\x47\xfb\xd3\xc1\xe1\x79\xfb\xc7\xe7\xeb\xd3\xbb\x83\x4e\xfb\xc7\xa7\x76\xe7\xfe\xf2\xfa\x0c\xf6\xd4\xcf\x32\xc0\x04\x97\x6b\x3a\x38\x3e\xfe\xd1\xbe\x38\x38\x3d\x57\x0a\xe7\x69\x90\x9f\xf7\x4c\x61\x99\xd8\xba\x0b\xe3\x9c\x64\x2c\x2c\xb2\xb0\x8b\xf0\xa1\xbc\x05\x5e\x39\x18\x36\x47\xf4\x8b\x79\x34\x60\x61\x9a\x60\xd4\x50\x2e\x61\xab\xea\x3e\xf1\x18\xe8\x20\x40\xa6\x1e\x01\xf8\x44\x3e\x23\x72\x1f\x3d\xc7\xfe\xe4\x39\xd8\xe3\xf2\x7a\x60\xcc\x90\x54\xf9\xd4\xf3\x2d\x88\xa4\x33\x28\x02\xfc\x15\x06\x0d\x65\x8f\xfd\xfa\xf6\x9e\x43\x88\x67\xef\x39\x9a\xe6\xdb\x4d\x78\x6e\xc2\xf3\x5b\x78\x7e\xeb\x30\xf6\x68\xc9\x1d\xae\x7a\x84\x0b\x69\x2d\x1f\xa4\xe2\xe4\x26\x11\x64\x2f\x83\x74\x46\xe4\x36\xf7\x41\x44\xc4\x3d\xa6\x32\xea\x13\xef\xe6\x29\x8c\xd4\x6d\xb2\xf3\x8e\x12\xdf\xf2\xc9\x17\x7d\x16\xf3\x49\x4b\xc5\xa4\x01\x52\x13\x33\x46\x24\x03\xbc\x58\x54\xab\xc1\x26\x0e\xb8\xa0\xb6\xb6\x32\xeb\x3a\xa6\xc2\x01\x8a\xaf\x69\xa1\x31\xd4\xbb\x29\xb8\x31\x31\x0e\x8e\xf4\xf3\x14\x87\xc6\x64\xcc\x4e\x4a\x86\x86\xc0\x62\x31\x40\x56\xc8\x4d\xa1\x00\xff\x1f\xf6\x28\x3f\xe6\x5f\x54\x82\xae\x30\x0e\xbd\xb9\xab\x84\xf1\x20\x48\x2b\xe3\x51\x85\x5b\x0c\xf2\xa8\x90\x69\x85\x26\x41\x99\xc5\x36\x2a\x9f\x07\x01\x4d\x83\xca\x2c\x0d\x2a\xca\x2e\xad\xfc\xf2\xd8\x4d\x7e\xa9\x8c\x93\xca\x2f\x74\x96\x8d\x7f\x81\xd8\xa6\x69\x90\xcc\x83\xca\xd3\x78\x96\x54\x0c\x2f\x9d\x43\x23\x95\x30\x19\x0f\x21\x20\x74\x4a\x87\x81\x68\x28\x8f\x6f\x3a\xa1\x51\xc0\x60\xe3\x8d\x5b\x76\x80\x2e\x04\xba\x84\xe4\x67\x82\x64\xdc\x34\x2d\x68\xe9\x81\x74\x7b\xfe\x98\x22\xdc\xee\x89\x7b\x83\x00\x53\x84\xc1\xe7\x79\x80\x90\xa9\x1f\xe6\x97\xbb\x19\x43\xd5\xcf\xb9\x99\x90\x2a\x0e\x69\x17\x22\x2c\xd7\x18\x8f\xe0\x6c\x54\x0f\xba\x43\xd0\xc9\xcb\xc0\xd5\xd6\x33\x98\x9b\x58\xd9\x44\x77\xf1\x4f\xb3\x80\xa7\x7c\x11\x92\x41\xea\xc2\xd7\x0f\x22\x5a\xd7\xa5\xf0\x06\xd9\x01\x18\x1d\x82\x07\x31\xe2\x2f\xef\xd9\x56\x5b\x25\x33\x8a\x40\x0a\xf6\x96\x83\x04\x05\x07\xcf\xaa\x59\x0d\xb9\xb4\xc0\x93\x12\x3f\xd6\x85\xb3\x2d\xfe\x52\x50\xb4\x92\xc6\xfb\xd8\xa5\x78\xd6\x05\x15\x47\x65\x12\x60\x04\x2f\x07\x42\xd5\xf4\xec\x96\xb8\x14\xec\xc4\x95\x41\x02\x6d\xd1\x8d\x29\xa6\x5d\x8a\x96\xb8\xd9\xde\xfb\x95\x32\x4e\x55\xf5\x26\x27\x74\xe1\x8c\x59\x89\x5a\x99\x01\xb5\x32\x93\xd4\x4a\x41\xdc\xc0\x5c\xbd\xf0\x52\x56\xa3\x4a\x28\x9c\xb4\x14\xb8\x55\x6a\x5c\xf7\x41\x4f\x60\xb6\xa9\x33\x94\xf3\xb2\xa2\x17\xa7\x03\x84\x96\x4f\xab\x7e\x5d\x00\x5e\x18\x09\x27\x6c\x56\x47\x73\xc9\xe7\x43\x59\x64\xdd\xab\xe8\x6a\x93\x2d\xdd\xc6\xc2\x5f\x1e\x28\x39\x4a\x0b\x61\x93\x22\x40\x83\x7a\xad\x8d\xa6\x6f\x9c\x94\x3c\x90\x08\xf4\x7d\x8f\xe6\x9a\xc3\xf7\xc6\xb4\x5d\x5a\xf8\x83\x42\x01\x8a\x41\xcb\x34\xf7\xe6\xc5\xa3\x87\x89\x1a\xcf\x3f\x12\x1e\x95\x8b\x5f\xd5\x51\xe3\x4e\xfa\x47\x13\x1d\xb6\x5c\xf0\x50\x87\x29\x5a\x0a\x15\x98\x8e\xb0\x44\xfa\x19\x31\x1b\x52\x30\x13\x6b\xbc\x23\xaa\xae\x27\x2f\xa8\xd0\xb2\x3c\x9c\xe4\x1a\x1d\x7b\x19\x52\x42\xb9\x23\x8f\xf9\x1a\x34\x17\xed\x3c\x44\x6b\x04\x33\x44\xa5\x2e\xea\x97\xe2\xd4\xb2\xe2\xd7\xc7\x3d\xae\x3a\x51\xd2\xe0\x5d\xa9\xbb\xdd\x2d\xea\x06\x9e\x81\x53\x4d\x4a\xdd\x5c\x90\x2b\xbb\x7c\xde\xe3\x75\x5e\xaf\x74\x58\xd0\x98\x84\x5a\xf9\x2e\x84\xa4\xcf\x21\xd5\x3f\x75\x85\x32\xd9\xe7\x70\x95\x2b\x67\x87\x07\x17\xa4\x7d\xdf\x89\x70\x1c\x81\xa9\xf5\x4a\x4a\x9e\xc7\xdc\x89\x70\xd0\xa5\x4a\x9e\x3c\x25\xcf\x63\xed\x44\xb8\xa7\x56\x23\x13\x04\x05\x2b\xcd\x0c\xe7\xc7\xe4\x65\x99\xa7\xda\xd4\x21\xae\xb2\xc1\x8f\x66\x3a\x7a\xf9\xd0\xa3\x8b\x85\xfe\xa1\x47\x49\xb5\x81\xdd\xd8\xb8\xcb\xa8\xa6\xf1\x5f\x63\xeb\x81\xea\x47\x3d\x8a\x5f\x26\xe3\xc1\x20\x1e\x45\xa7\x82\x7f\x31\x9b\x8d\xc6\x12\x61\x2e\x7e\xd2\x34\xfd\xa4\x47\xa5\x79\xe4\x71\x48\x75\x19\xfe\x87\x92\xfb\xbe\xc4\xdc\xf0\xf1\x6b\x46\x09\x0f\x36\x01\x12\x34\x68\xb4\x69\x1d\x81\x7c\xeb\x26\xa4\x64\xb7\xa1\x7a\x29\x9e\x29\xa6\x6e\xb2\x29\xf9\x64\x24\x13\x6f\xc9\x0b\x1e\x87\x74\xc5\x3d\x0a\x2b\x29\x35\x8e\x84\x88\x2c\x89\x75\xca\xca\x18\x49\x10\xc5\x69\x16\x24\x10\xd2\x46\x4d\xd0\xef\xbb\x14\x1f\xc9\x23\xb2\x22\xac\x9a\x6f\xc2\xdc\x84\xfa\x26\xa4\xdb\xdb\x58\xa0\x1d\x41\x09\x1d\x87\x92\x12\x6a\x36\x1a\x08\x2d\xc5\x58\x7a\x2b\x60\x93\xab\xc8\x06\x99\x20\xd7\xa3\x2e\x68\x2b\xb8\x42\x67\x48\xfa\x53\x9b\xfa\x8e\xde\x86\x78\x73\xf9\xeb\x07\x4e\xc4\x8e\x41\x7b\x9f\xfb\x12\xce\x66\x5c\x89\x01\x2a\x3c\x1d\x65\x7a\x08\xe0\x62\x1c\x8e\xf4\x92\x91\x02\xef\x8c\xfb\x40\x37\x05\xb2\x91\x0b\x02\x87\x57\x81\x7e\x61\x29\x5f\x99\x44\x08\x61\x04\x93\x16\x05\xd9\x75\x30\xa0\x4f\xb7\xc9\x40\x0f\x13\xb4\x58\xf0\xe4\xb4\x94\x8c\xdf\xb3\x43\xa1\xb0\x9d\x93\x4b\xa0\xe4\xca\x57\x61\x53\xc9\xe5\x32\x5f\x75\xd6\x19\x4d\xcb\x32\xbd\xb6\xb3\xf3\xf0\xf0\xb0\x3d\x9e\x04\xa3\x74\xec\xc5\x74\x20\x14\x6a\x66\x69\x90\x88\x30\xdc\xa0\x20\x24\xc8\xcf\x9d\x64\xe2\xb1\x7f\xc6\xdc\xe8\xa5\x35\x64\xc1\xe8\x00\x36\x3f\xcc\x88\x1b\x1b\x3f\x7e\x30\x7e\x27\x9a\xd1\xc4\xff\xf1\xa3\x15\xc4\xfa\x53\x97\x22\xb3\xec\x7d\x81\x6d\xdf\x36\x37\x3f\x20\xc2\x47\xeb\x69\x8f\xea\x5e\xa1\x51\xc6\xd6\xe4\x3d\x5b\x93\x25\x3e\xd9\x5c\xed\xf3\xcf\xab\xbd\xfc\xb3\x6a\x3f\x6e\xae\xf6\x68\x53\xb5\x50\x29\x18\xa9\xb2\x0a\x4e\xc1\x08\x02\xa1\x25\x3e\xdb\x5c\xc7\x61\xb9\x0e\xc5\x65\x0a\xd5\x34\x58\xb3\x28\xc8\xce\x82\x27\x58\x2a\xfe\xa8\x23\xd4\x02\xf7\x84\x66\xb5\xb9\xc4\xe7\x9b\xeb\x3d\x58\xad\x97\x6f\x02\xe8\x1d\x76\xc9\x75\xc6\x60\xf8\x21\xd3\xa9\xf1\x83\x7b\xb8\xe3\x21\x06\x18\xa9\x51\x4a\x90\xc4\x78\x01\xd6\x05\xb0\xb6\x4b\x82\xa4\x52\x31\x4b\x30\x3c\x40\xf9\xb0\x89\xe8\x64\x78\xb5\x66\xe5\x52\x98\x28\xda\x09\xa7\xbd\xd7\xc2\xe1\xb8\x9a\xe6\x1a\x57\x19\x6d\x51\xdd\x35\x3e\xa4\xc8\xa4\x25\xd9\xf9\xfb\x42\x61\xe4\x78\xce\xce\xbc\xf7\xb0\x01\xf9\xa4\xbd\x66\x36\x72\x3c\xa7\x0a\x4a\x3e\x9d\xad\x47\xe8\x10\xf8\xfb\x43\x4a\xdc\xe5\x57\xfd\x74\x06\xf1\x28\x4e\xa1\xea\xab\xec\x55\xe7\xf2\x1f\x54\x5b\x89\x8b\xa2\x67\x19\xa1\x85\x3e\x31\xc3\x21\x27\xeb\xca\xc0\x5c\x13\x58\xf8\xb6\x93\x77\xa8\xe2\x36\xf5\x63\x9a\xd3\x3f\xa7\xa9\xa2\xe6\x7d\xd3\xc8\x23\xe7\xba\x4f\xa4\xda\x58\x7e\xd5\x2f\x66\x78\x6b\x8c\xac\x7b\x72\x21\x94\xed\x7f\x1a\x67\x34\xef\xec\xc7\xde\x4a\x40\x1c\xdb\x01\x93\xd4\xcc\xb8\x00\xe6\xae\x61\xf9\xfb\x1e\xe8\x4a\x41\x17\x7d\x06\x32\xa7\x29\x71\x2d\x2a\x5a\x7e\x73\x6f\x44\xc9\x2b\x3a\x94\xbc\x35\x56\x5f\x5f\x3f\xeb\x51\xf4\xaa\xfa\x95\x0f\xb2\xc8\x69\xcc\xb8\x86\x88\xd1\xf6\x41\x61\xc0\x37\x82\x54\x21\x0a\x0f\x8c\x14\xae\x6f\xf8\x35\x28\x0e\x48\x60\x78\x74\xe0\x09\x5d\xed\x80\xb3\xb3\x55\x6f\xb1\xf0\x34\xad\x0a\x11\xf2\x82\xe2\x16\xf3\x97\xdb\x51\x7f\x34\x7e\x28\xc0\xac\x52\xfb\xa5\x1e\xd4\x67\x01\x12\x14\x46\xa8\x69\xd0\x7a\x28\x43\x78\xac\x39\x7a\xf2\xa0\xdd\x4a\x3c\x9a\xcc\x32\x5c\xdc\xff\x07\x31\xb0\x70\xf9\xc5\xf5\x38\xa9\xd0\x51\x65\xcc\x3d\xfd\xd4\x90\xb5\x94\xeb\xda\xed\x73\x55\x38\x3e\x33\xd2\x24\xf4\xca\xe5\x2e\x61\xcb\xfa\xc5\x8c\x41\xe6\xaa\xc5\xa3\x98\xf1\xe0\x5c\x35\xc6\x37\x92\xf1\x20\x40\x01\xf1\x8d\x49\x32\x9e\x04\x49\x16\x07\x29\xa3\x80\x71\x00\x5f\x48\x88\xd5\x2f\x24\xb0\x58\x19\x75\xd6\xac\x69\xac\x87\x48\xd3\xf4\x68\xa2\x53\x1c\x22\xec\xc3\x1c\x12\xfe\xb3\x58\x9c\x74\x29\x86\x30\x81\x3e\xf7\xab\x68\x1c\xeb\x21\x42\x68\xa9\x80\x9b\x82\x16\xce\x0b\xee\xad\xf0\xa6\x1c\x87\xba\x17\x33\xf4\x5a\x4c\x60\x08\x0c\x28\x68\x80\x54\x26\x34\xa1\xc3\x20\xe3\xf1\x56\xe9\xa8\x42\x93\x84\x3e\xe1\xca\x68\x5c\x49\x03\x6f\x3c\xf2\xcb\x19\xe4\x2c\xd7\x8a\xad\xb3\x62\x00\x10\x4f\x74\x6a\x64\xb8\xa4\xe4\x0f\xfa\xe1\xcb\x38\xd4\x45\x6c\xbb\x0e\x07\x8d\x2e\xeb\x16\x7b\x53\x7b\xb6\xa9\x57\x62\x29\xf1\x7a\x97\x24\x1d\x9b\x4e\x02\x0f\x42\xc5\x03\xe3\xcd\x05\xcc\x50\xc6\xe0\x81\x1e\xdd\x77\x9e\x42\xc0\x6f\x18\xbc\x3e\x8c\x47\xa8\xa8\x6e\x48\x07\x83\x20\xa9\x64\x5d\x06\x3a\x49\x25\x98\xce\xe8\xa0\x92\x8d\x39\xe3\xbe\xda\x09\x7d\x48\x1f\x11\x34\x24\xc6\x9e\x3f\x79\x0c\xbe\xc4\x8d\x97\x4f\x5c\xcb\xdf\x27\x7c\x03\x53\xb1\x81\x73\x9d\x89\xbc\x73\xef\x57\x3a\xa6\x48\xcc\x55\x78\x86\x65\x02\x51\xc1\xf2\xde\xb8\x1f\x6d\x62\xd8\x4e\x53\x72\x2e\x65\x01\x85\xf8\x96\xa1\xb1\xa6\x8a\xae\xac\x7b\xe3\x8c\x6e\xc2\x4f\x5d\xa1\xde\x77\xc5\x0d\x00\xd3\x60\x95\xdc\x14\xf5\xa9\xf7\xae\x85\xa2\x3e\x47\x5a\x62\x1b\xc1\x1e\xa2\x02\xaf\xe6\x63\x2e\xa0\x43\xf4\x17\xda\x79\xde\xc4\x7a\x44\x89\x7e\x13\xcb\xee\x60\xf5\x68\x12\x84\xf2\x56\xcc\xe3\x16\x49\xbd\xf2\x7c\x6c\x07\xf3\xcd\xc1\xf3\x36\x4e\x8d\xa6\xe9\x1f\x25\x33\x8a\x8b\xe9\x12\xdf\xef\x47\x79\x27\x4e\x53\xbc\x4e\x3a\x70\x24\x47\xd7\x3a\xf1\xe6\xde\x98\x5f\xff\x44\xb5\x5d\x0c\x6b\x25\xb8\xb9\x4c\x15\x77\x43\x04\x6c\xd7\xd8\x8e\xd1\x34\xaf\x84\x43\x08\xc9\xf5\x05\x5d\xc5\x21\xff\xbd\x71\x79\xfd\x2a\xfd\xfb\x31\x6d\x35\xde\xd1\xc5\x82\xbe\x53\x56\xab\xb5\xdd\x34\xa9\x79\x55\x0c\x91\xb3\x75\x0f\xe5\x78\x90\xd1\x24\x3f\x9e\x69\xde\x49\x9a\x5b\x9d\x80\xbb\xf2\x16\x35\x47\x31\x18\xbf\x80\x87\x0f\xb5\xb7\xa8\x55\x7e\x37\x79\x5f\x67\x9d\x95\xd8\x15\x50\xf3\xc3\x87\x82\xb0\xdf\x6e\x12\x42\x5b\xd4\x94\x08\xdb\x98\x75\x84\xd5\xd3\x6c\x58\x66\x80\x27\x1b\xed\xa4\x3e\xa6\x2d\x6a\x8a\x91\xd9\x14\xc2\x64\xa7\x1b\x1b\x05\x8d\xea\x82\x40\x12\xad\xa5\xb2\xb5\x8b\xd7\x8e\xf2\x8f\x69\xab\x98\xcb\xbc\xa5\x8f\x0e\xf7\x8a\xf3\x6a\x2c\x1c\x17\xb2\xdc\x1b\x5f\x82\xbf\x3f\xcd\xa2\xbd\x2f\x01\x98\x13\x1b\xb1\x0f\xf1\xba\x1f\x56\x8d\xe3\xfe\x3e\xb8\xe5\x80\x16\xfb\x25\xf0\x92\xd3\x61\x8f\xa7\xab\x56\xb2\xc6\xfc\x9a\x0b\xfb\xee\x8d\x6b\xfa\x8f\x87\x72\x0d\x46\x4c\xd4\xbe\xf7\x1c\x11\xa3\x7c\x6b\xf6\x8f\x2b\xdb\x02\x33\x6b\xee\x0f\xf7\xde\x18\x26\x9b\x56\x3b\xea\xe9\x14\xcf\xbb\xca\x82\x8f\x05\x04\x5f\xc2\xc2\x1d\xff\xe3\xd6\x8f\xf9\x48\x4e\x04\x00\xac\x5a\x5b\x45\xe5\xd8\x67\xea\x0a\x14\x81\x53\x15\x80\x94\xab\x52\xa0\x5e\xf7\x89\x2f\x2d\x47\xb2\xca\xb2\x32\x6c\x3b\xca\xd1\xa5\xed\x39\xb9\x15\xda\x4d\xc3\xf6\x1c\xb0\xb0\xcc\x11\x54\x73\x29\x9a\xbe\x69\xd8\xae\x23\x63\x80\x70\x92\x41\xc0\x06\x8f\xae\xa8\x76\x30\x14\x14\x8a\x35\x66\xf4\x4b\x4b\x0f\xc9\x59\x8f\x42\x44\x04\x22\x3a\x97\x41\x90\x62\x64\x26\x82\xc0\xf1\x48\xc8\x28\xfb\xc2\xa2\x28\x63\xe4\xa0\xe5\x91\x6f\x70\x31\x6f\xf9\x84\x91\x38\x56\x48\x3c\x63\xce\x7a\x70\x00\x74\x56\x4e\x2e\xd6\x20\xdc\xc6\xfa\x79\xff\x8b\x88\xe3\x1c\x09\xe7\xf3\xb2\xc0\xc4\xa5\xf5\xb0\xee\xd2\xe2\xca\x54\x0e\x8f\x78\x4b\x9f\x9d\xc2\xc6\x84\x30\x5a\xce\x98\xa0\x96\x6f\x4c\xcc\x97\x65\xa1\x5d\x06\x63\xf7\xc9\xcb\xdc\x14\xd0\x7e\xea\xe8\x01\xf6\x10\x0e\x01\x98\xf0\x44\xc0\xd4\x4f\xe9\x52\xb8\xea\x89\xd9\x7a\x9b\x95\x5a\xfd\x8d\xaf\x46\x98\x8d\xdc\x35\x2f\x01\xea\x4e\x3a\x49\x21\xcd\x98\xc3\x6e\x6a\x6f\x3e\xc0\xd4\x9c\x56\xae\x37\xed\x19\xa1\x54\xe7\x5b\xdb\xd1\x3e\x1b\x14\xe7\xbd\x74\x17\x61\xcf\x28\x82\xa7\xcf\x5b\xfd\x89\xee\x19\x73\xec\x23\xb3\x70\x8f\x31\xe5\xb4\xee\xbc\x88\xa9\xc4\x41\x91\x95\x14\x40\xde\xa6\x3a\x04\xa3\xce\x7d\x11\x19\x21\xdb\x6b\xdd\xc9\x5a\x34\x64\xb1\x5f\x7a\x3d\xe8\xb1\xed\xe5\x9b\xc6\x93\x27\x86\xd8\xa7\xbd\xde\x5f\x1a\x6f\xd5\x33\x26\xa5\x6f\xdc\x12\xc6\xcf\x4f\x8e\xb2\x8f\x01\x23\x63\x4d\x7b\x8a\x17\x7b\xcf\x98\x80\x55\xe5\x6a\x73\xca\x1e\x2f\x6f\xcc\xd2\x3e\xf7\xf2\x7d\x1e\xf5\xc0\x26\x84\xc3\x4a\x3b\xd1\x29\xb2\x5d\xa1\xf6\xc7\x43\x05\x25\xff\x18\x85\x40\x6d\x26\x5d\xe1\x2e\x58\xaf\x1f\x3b\xaf\x9e\xed\x99\xf1\x28\xcf\xaa\xf7\xaf\x72\xdf\x99\xf1\xfe\x89\xbb\x6c\xb8\x48\x5e\x9f\xee\xd2\x51\x28\x0f\xb7\x44\x98\xc0\xdc\x1b\xa7\x67\xaf\x1d\xbc\x9b\x8e\x52\x51\xfe\xf4\x4c\x74\xee\x66\xb2\x69\x08\x5e\x24\xe9\x32\xc8\x74\xb5\x71\x9c\x41\x39\x93\xbf\xb1\x26\xbf\x9c\x29\x3b\xdf\x94\x29\x52\x33\xb1\xc5\x7a\x5c\xd3\xeb\x90\x0c\x22\xc8\x84\xda\x8f\x22\x3c\xb8\xd1\x7e\xd4\x73\x71\x2f\x35\x9e\xd2\xc2\x3e\xfa\x04\x08\x5f\x78\x04\xc6\x1d\x07\x38\xc4\x42\xd5\x2b\x67\x06\x80\x69\xe2\x9c\x77\x98\x83\x81\x2f\xb7\x6a\x88\x50\x40\xa2\x3e\x28\xd4\x71\x47\xca\x9c\xb9\x2e\xde\x4a\x5c\xa4\xb2\x61\xa1\x24\xb5\x3f\xbb\x0e\x84\xcf\x56\x31\xd4\x4d\x44\x91\x15\x71\xfd\xbc\x65\xa1\x84\xe7\x15\xba\x86\x03\x56\xd2\x73\x6c\x49\xcf\x04\x39\x19\x13\x38\x0e\x1e\xfd\x8d\xde\x87\x12\x7b\x72\xdc\xe9\xa3\xe5\x4a\x27\x43\x32\x30\x3c\xbb\x28\xba\xa9\xaf\x23\x11\xd5\x6b\x60\x78\x64\x64\xf5\xc1\xbb\x12\x5a\x52\xc3\x1b\x0f\x52\x12\x59\x97\x8c\xdb\xed\x2b\x27\x37\xd7\xb5\xd3\xc5\x52\x3e\xa5\xea\x52\x16\x3c\xca\xcb\x12\x0b\xd1\xca\x86\x63\x73\x05\x77\x7a\x8e\x05\x88\x53\xd3\xaa\x63\x76\x58\xb0\x35\x40\x8b\x85\x90\xbf\x2c\x69\x0f\x0c\xc5\x74\xe8\xd2\x6c\x38\x4a\x49\xc1\x4b\x2c\x16\xd0\x3f\x85\xbb\x51\x1d\x3a\x1f\x6d\xf6\xa3\x73\x34\xe6\xb9\x19\x38\x95\x1c\xe9\x7c\x12\xf2\xb1\x31\xe3\xa0\x41\xb6\xf7\x7e\x0c\x71\xf3\xc4\x09\x1d\x3c\x70\x59\x17\xf6\x89\x2b\x3b\x83\x03\xe2\xb2\xe5\x14\x12\x15\x9f\xd1\x73\x51\xc2\xd8\x4e\x9e\x10\xb0\x84\xfb\x51\x11\x2a\xbe\xe2\xf1\x30\x1c\x67\x3d\x4a\x5e\x82\xe1\x24\x13\xd7\x45\xe6\x7a\x47\x2f\x97\x5c\x71\x6a\x4d\x0a\x2b\xee\x77\x57\x65\x43\x9e\x31\xa4\xd1\x28\xce\x66\x7e\x00\xc8\x1b\x8e\x96\xc5\xa2\xca\xe5\x4c\xab\xe6\x82\xa7\x8e\xee\x16\xe1\xfa\x04\x4e\xf4\xf8\x35\x2e\xb8\x71\x25\xd7\x5d\xda\xa2\xf5\x60\xa7\xd9\x68\xfc\x4a\x4d\x5a\x0f\xf8\xf1\x21\xec\x12\xe2\xf0\x69\xad\x63\xde\x4a\xa7\xca\xb8\x9c\xb2\x93\x8c\xe5\x33\x2f\x97\x38\x8c\x07\x83\xf7\xc9\x78\xd8\x19\x4f\xfe\x66\x35\x71\x54\xc4\x98\x12\x94\x67\x5e\xdb\xe1\x38\xcb\xc6\xc3\x7f\x5e\x61\x53\x56\x18\x83\x96\x44\xf6\xb7\x87\xc8\xa7\xd5\x13\xd5\x28\x82\xc7\xcb\xb2\x9f\x94\xd3\xcf\xf2\x7a\x77\x44\x5c\x8b\x92\xcf\x03\xb8\x76\xa9\x92\x4b\x4d\xa3\x55\x72\xdc\x5d\x2c\x2e\x06\xba\x8b\xa7\x5d\x9c\x75\x05\xbc\x3f\x9f\x71\x91\xa8\x27\x29\xcd\xe7\x33\x11\x91\x9f\x07\xe3\xbf\xe9\xd2\xa5\xea\xd2\xe9\xa2\xec\xc4\xc6\x78\x3e\x6b\xe9\xec\xaf\xdd\x0b\x9c\x2a\xa1\xc6\x48\xd3\xa8\x31\x82\xe8\xfc\xc6\xf3\x19\xc2\xf0\xd7\xa4\xc6\x68\x79\x09\x02\xe0\x8b\xb2\xad\xf8\xa7\x82\x9b\x9f\x94\xdc\x83\x7e\x16\xfb\xe6\x93\x10\x8d\xb9\xaa\xe3\xda\x4f\x85\xbc\x8c\x83\x2d\xef\x95\xe5\x91\x17\x88\xa8\x42\xdd\x41\x60\x56\x1b\x18\x14\x70\xbd\xa5\xe5\x92\x97\xd8\x37\xd3\xcc\xb8\xf0\x75\x1f\xbb\x98\x2b\x6a\xa2\x5c\x61\xd0\xcd\x15\x06\x2f\x44\xca\xa5\xa2\xbd\x65\x7d\x9c\xe9\xd4\x38\xfd\x8c\x27\x8c\xe8\x17\xe3\x18\x7a\xeb\xe7\xcd\x85\x14\x41\x58\x32\x0c\xbd\x32\xa0\xab\x62\xad\x92\xa7\x17\xb8\xd5\xf6\xe4\x65\x13\x28\x3a\xb2\xbe\xd9\x07\x53\xa7\xa4\xd2\x70\xc9\xa7\x9b\x93\x28\x79\xec\xd0\x8f\x10\xa1\xf4\xb2\x47\x59\x4f\xce\xd2\x55\x3a\x53\x2c\xce\x17\xbd\x2c\xf6\xa9\x8a\xb2\xb9\xaa\xbc\xb4\xc2\xb7\xae\xf8\x5d\xbd\xd1\xf6\x54\xd4\xc6\x23\xb4\x83\x87\x26\xb4\xcc\x4d\xf1\xf3\xae\x5d\x17\x22\xfa\x84\x92\x64\xac\x4b\xb9\x7f\x7f\x0e\x68\xed\x72\x56\x98\xc1\x1a\x89\xfc\x78\x31\x97\xc1\x76\xae\x67\x10\x6c\xe7\x1a\xa6\x73\xe2\xbd\x46\xf0\x24\x74\x69\xd1\xa9\x7e\xbd\x62\x7a\xca\xa7\x52\x76\xbc\x3f\xc7\xa5\xd1\x42\xe2\x30\x14\xd9\xa4\xe7\x82\xa5\x6c\x6d\x18\xae\x51\xb9\x3c\xce\x58\xce\x13\x1c\xd3\x8c\x56\x40\x89\x79\x83\x06\x18\xcb\x0b\x44\xc5\xfb\x27\xc9\xb8\xb8\x24\x8c\x29\xee\x03\xbe\x73\x49\xaf\x4b\xcd\x71\x2c\x7d\x9d\x74\xbb\x14\xe1\xa1\x5e\xfb\x3a\x9e\x55\x3c\x70\x3e\x0f\xe2\x48\x3f\xa1\x0f\x3a\x92\x06\x41\xe0\xf8\xbc\x56\x77\xeb\xb5\x4a\x42\x41\x10\x0e\x32\x4c\x5a\x61\x3d\xe9\x40\x47\xc6\x09\xbc\xdc\xc5\xc1\x43\x2d\x9f\x4d\xb9\x6d\x2f\xe6\x00\x15\x0d\x65\x9a\xd9\x1a\x08\x88\x34\xfa\x73\xa9\xc1\xf3\x25\xcf\x7f\x96\x0a\x05\xaf\x8b\xb9\xf4\xa2\x35\xd4\x7d\x2c\xe6\xcc\x7a\xc3\xe7\xea\x5b\xb8\xe6\x15\x78\xbd\x55\xac\xae\x6d\x1e\x39\xba\x14\xb5\xfe\x46\xd1\xea\x85\xef\xe7\x3d\x09\xce\xa7\x9f\xe5\x5d\x8d\x4b\xbc\x42\x11\x65\x24\xa3\x77\xb7\x45\x70\xdd\xdc\x01\x72\x5b\x50\x69\xe7\x3f\xe0\x76\xde\x47\x22\xb6\xac\xab\x69\x49\x97\x72\xf3\x89\xc5\x42\x68\x53\xb8\xb6\x9b\x38\x55\x72\xa1\x68\x6b\xdc\xa9\xda\xdf\x9c\x37\xed\xd2\x79\x50\xa1\xb0\x28\x62\x49\xe0\xce\xe1\x9e\xdc\x88\xab\xa0\xf3\x1f\x52\xa1\x3a\x6c\xcb\xa7\xc7\x33\xf9\x24\xc2\xcb\x9f\x6f\x54\xdf\x11\xc6\xd8\x4b\xc4\x00\x79\x5d\xab\x26\x13\x3a\x19\xa7\x9f\x59\x4f\x25\x17\xce\x4b\x72\xb9\xcc\xc5\xc6\xeb\x79\x3e\x49\xf9\x14\xd1\x16\x35\xdd\xd6\xca\xfc\x14\x81\x4f\x6f\x8f\xc9\x26\x74\xd0\xf6\x4a\x52\xfc\xd1\xb8\xe2\x8d\x47\x19\x8d\x47\x41\x52\x79\xa0\x29\x68\xd0\x0d\xe2\xc0\xc7\x15\x5a\xf1\x66\x69\x36\x1e\x56\xe0\x34\xaf\x74\xe9\xc8\x1f\xa8\x92\x7c\x91\x11\xdc\x9a\x05\x14\xa6\xaf\x20\xc3\xa5\x96\x0a\x68\xf7\xa9\x62\x60\xe9\xd1\x38\x6c\xb3\x23\xc8\xe3\x8e\x50\xa6\x6d\xf6\xab\xb3\xf4\xc7\x33\xc4\x93\x97\xc0\x0c\xac\x28\x19\x29\x13\xd1\xf6\x2c\x57\x71\xdb\x93\x11\x6a\xdc\xe5\x4a\x1e\x1b\xa7\x16\x2a\x3c\xee\xbc\xa2\xae\xb6\xa2\x90\xa3\x80\xcf\x65\x24\x91\x59\xd8\x26\x14\xb8\xba\xa3\xbf\x5f\x4b\xed\x88\xcf\xe6\x64\x9c\x66\x15\x69\xd4\xb2\x36\xab\x34\xbf\x67\x33\xe4\x9e\x7f\x3c\x83\x46\x37\x2a\x68\x9d\xf7\xb8\xe7\x6f\x95\x02\xed\xcc\x94\xbb\x85\x30\x94\x5b\xed\x3a\xa5\x84\x2e\x9f\x26\x7a\x67\xcd\xa8\x9f\x03\xd6\xaa\xa2\x19\xe4\xfb\x99\xfe\x7c\x18\xe6\xea\xf3\x6c\x9b\x97\xd5\xe0\x09\x8d\x41\xa4\xe3\x09\x8d\xfa\x47\xe2\xe1\x42\x43\x1d\xe5\x7d\xca\x6f\x91\x65\x28\xa2\xb6\xd0\x57\x61\x87\x29\xef\xc2\x0a\x0c\xfc\x2f\xea\x97\xe5\x73\x76\x3b\xcb\x3d\xa0\x0f\xf3\x5b\xe2\x23\xc6\x47\x29\xb1\x47\x85\x9e\x60\x4f\xa7\xc6\x68\x08\xdc\x25\xcb\x4d\x8d\xa3\x11\x66\x4f\xb6\x3f\xe5\x0e\x81\xa0\x9c\x42\xbd\xdc\xc1\xc1\xc9\x8b\xe7\x9c\x85\x31\x1a\x72\x17\xa2\xcb\x7b\x72\x2b\x50\xce\x41\xc9\x75\xe3\xe7\x9c\xba\x90\xa4\xbc\x90\x14\x8e\x86\x9c\x99\x7e\xf5\x08\x1d\x0d\xed\x8f\x4e\x5d\x8c\x01\xa4\xd6\xab\xbe\xcd\x64\x2f\x7a\x79\x8d\x9a\x26\x5f\x8e\x46\xe8\x35\xf7\x69\x6b\x93\x83\xac\xcf\xab\x32\xec\xc2\x77\x99\x28\x82\x29\x5a\x2c\xe4\x2b\x9b\x2b\x56\xfd\x9a\x5f\x38\xbe\x48\x87\x3e\x55\x8a\x81\xd6\xd1\x3b\x37\x77\xa5\xd0\x53\xea\xb0\x8a\x60\xe0\xb2\x80\x8b\x9b\x4a\x54\x52\xb4\xea\xaf\x6c\xf3\xf5\x17\xcc\x15\x77\x41\xe2\x5a\xdb\xdb\x2e\xbf\xfd\x92\x9f\x5c\x47\x55\x3d\x28\x66\x14\x73\x09\xbd\x67\xd5\xeb\x6a\x89\xa3\x11\x94\x28\xb8\xc7\x1c\x06\xee\x67\x02\x09\x07\xb1\x3e\xef\x52\xe5\x92\x17\xd4\x8e\x27\x34\x02\xc2\x63\x28\xcc\x86\x18\xbd\xc0\xf5\x86\x2a\x43\x3a\x49\x2b\x07\x9f\x4f\x25\x3a\x18\xb4\x01\xfe\xf9\x57\xfb\x70\xea\x18\x1f\x82\xb1\x37\xce\xcd\x98\x3f\x78\xb9\x39\xcb\x07\xcf\xf6\x47\xfa\x0b\xf5\xfd\x24\x48\x53\xf3\x72\x89\x1c\x46\x30\x73\xd4\x63\xda\x8e\x34\xae\xd9\x50\xd7\x0d\x7c\x31\xbe\xb5\xaf\x2f\x7f\x5c\xb7\x6f\x6e\xcf\x3b\x37\xa2\xd2\xa7\x11\xb7\x95\x17\x71\x70\x9e\xe6\xa5\xb0\x38\x67\xc7\xf0\x7a\x3b\x5b\x46\xb1\x7e\x3f\x53\xd0\xd2\x97\x32\xef\xd2\xcf\xd8\x21\x29\xa1\x69\x70\x2e\x03\xdd\x5c\xa5\x12\x61\x1d\xdd\xe4\x17\xa0\xc3\xdb\x52\x23\xc3\x14\x82\xa2\x88\x7a\x18\x80\x5f\x4f\xf4\x2f\x65\xb4\x26\x9a\x61\x95\x00\x2c\x7c\xe1\xd8\x2c\x1e\xc5\x69\x77\xa3\x1c\xcd\x1f\xe5\x04\xed\xf0\xd6\x70\x43\xf0\x66\x2a\x5f\xd3\x20\x03\x61\x1a\xb7\x8b\xcc\x0f\xd3\xa3\x9b\xb5\x40\xec\xd0\x1f\x79\x21\x30\x38\xb7\x82\x7d\xbf\x10\xdb\x84\xac\x15\x99\x2d\x70\x50\x51\x13\x6f\x32\x44\x08\xac\x37\x2d\x21\xab\x19\xde\x82\x0b\xba\x50\xd1\xb5\xd0\x43\x12\xe6\x36\x91\xc2\xff\x62\x88\x96\x9e\xfd\xd1\xd9\x97\x93\x23\xe8\x8b\xc1\x79\x1d\x92\xf3\xa0\x64\x83\xf3\x3a\x78\xdc\x11\xb1\x67\xd2\xdc\xf3\xd7\xe0\xfc\x9d\xd2\x7b\x5e\xdc\xfe\x04\xae\xb4\x55\x2c\xf9\x35\xc7\x92\xfd\x2c\x47\x04\x83\xb6\x20\xf0\x61\x82\xcb\x0e\x27\xf3\xdc\xe0\xd9\x9b\xd1\x98\x3c\x17\x0f\xee\xb4\x89\x26\xe7\xe3\x14\x15\x4b\x6e\x0f\xa2\x5f\x49\xf0\x11\xf6\xcf\xbe\xaf\xfb\xf9\x8e\x30\x22\x0e\xb6\xb9\x65\xe1\x3c\xa4\x7a\x89\x41\xe0\x42\x77\x91\x5d\xd2\x0c\x83\x36\xb9\x9f\x19\x77\xae\x2e\xce\x23\x3b\x95\xa6\x08\x05\x0b\x61\x5d\x4f\xf4\xaf\xab\xa0\xf5\x4d\x2e\x62\x09\x85\x51\x3e\x65\x52\x9d\x15\xe6\x88\x91\x73\x42\xc7\x0a\x7a\x58\x9a\x9c\x6f\x3a\x65\x75\x7c\xd9\x40\x20\xf9\xec\xd9\x2a\xc2\xff\x7f\xf0\x5a\x54\x40\xaf\x74\xa4\xf8\xc1\xb3\x3d\x47\x06\xc5\x7b\x9a\x4b\x90\xd5\xc5\x3e\x64\xc8\x08\xfc\x8a\x60\x99\x81\x03\xb1\xed\xa0\x22\x89\x41\x97\x87\xf8\xea\xac\x38\x7c\xbb\xf6\xa9\x0e\xf2\x39\xe8\xfe\xb5\xbf\xaa\x54\xd0\xa8\x8a\xf9\x3c\x3b\x36\x7c\x4f\x47\x8b\x45\x9e\xf2\x34\x82\x14\xc9\x26\x0b\x4d\x55\x91\xda\x9a\x4b\xd1\xd9\x08\xfc\x3c\x82\xbb\x43\x59\xd1\xc1\x18\xa4\xb3\x7c\x2f\xc6\xa1\xee\x2a\x13\x50\x12\x78\x8b\xbe\xbb\xb9\x00\xf7\x83\x67\xbb\x8e\x75\x37\x93\xc3\x97\xb0\xd1\xd1\x29\xf6\xf2\x0d\x83\x3d\x11\x34\x41\x06\x20\x9a\x83\x07\x3c\x57\xea\xd4\x92\xf2\x08\x34\x4d\xf4\x5d\x8c\xb1\xa5\x2b\x0d\xe0\xb5\xae\xdc\xc7\xba\xb7\xe9\x2c\xa4\xc6\xd1\xcd\x52\xdc\x15\x40\x87\x40\x1e\x01\xac\x93\x99\xcf\x05\xf8\xc0\x43\xf8\xaa\x10\x90\xc8\x48\x43\x3c\x8e\x10\xf7\x94\x69\x96\x27\x53\xd3\x7e\x9a\x7f\xa9\x2a\x1d\x5d\x95\x94\x8e\x46\xb9\x7c\xb2\xdb\x07\xf7\x63\xf6\x74\xea\xa0\xc2\x13\xee\x74\xea\x58\xae\xe1\x8e\x67\x23\x3f\x5d\x39\x70\xec\xb9\x50\xdd\x54\x92\x86\x53\x47\xf7\x8d\xc1\xd8\x18\xd0\x0c\xf3\x87\x51\x84\xf0\xc6\x5c\xdd\x58\xe4\x62\x0f\xa3\x08\xa1\x25\x55\xf7\x70\xd9\x45\xf4\xf5\xaa\xe8\x07\x76\x06\x0e\x08\x95\x13\xaf\x8a\x49\xbf\xe9\x41\x79\x4b\x1a\x47\x37\x8b\x85\xb2\x73\x3c\xb6\x3d\xa9\xf1\x34\x82\x75\x07\xcd\x3c\x01\x03\x3e\x5a\x0a\x58\x1f\x74\xd6\x30\x93\xd4\x9f\xe2\x0a\x1e\xaf\x9f\x97\x97\x77\xed\xeb\x1f\x57\xb7\xed\xeb\xaf\x3f\xce\x4f\x2f\x4e\x3b\xc8\x27\xbf\xed\x36\x14\xbf\xfa\x3f\x2b\x7b\x26\x6f\xf0\x38\xf8\xbb\xca\x59\xed\xca\xa3\xda\x2b\x8e\xf6\xc0\x21\xae\x75\xad\x6a\xc7\x70\x20\x56\x92\x8a\x0a\x00\xe2\xf2\x3a\x90\x22\x56\xb2\xee\x33\xa9\x2c\x7e\xed\x4b\x65\x71\x7f\x4d\xfa\xf3\x8d\xe1\xfe\x62\x59\xb6\x72\x0f\xcc\xba\x50\x20\x01\x01\xc9\x89\x7c\xb8\x40\xaa\x1e\x9b\xb8\x70\xf5\x73\x21\x8b\xe0\xb5\xbf\x09\xc2\xb7\xd7\x7f\xf5\x92\xec\x33\x63\xf2\x5a\xbb\x26\xe8\x08\x6d\xd1\xb5\x95\xc9\xb7\xd8\x89\x8e\xde\xb9\x9a\xe6\x11\x42\xe1\xda\x54\x15\x45\xf4\x94\x48\xeb\x85\xe3\xdb\x55\xef\x0a\xd4\xd8\x02\xd1\x32\x86\x90\xf1\x45\xb8\x5a\xf1\xd0\x5c\xde\x1b\xf1\xc8\x0f\x1e\x2f\xc3\x55\xdf\xe9\x65\xe5\x54\x50\x58\xf5\x64\x9d\xc7\xa0\x3b\x97\x13\xb1\x9e\x55\x68\xfe\xe4\x1d\xa4\xf3\xdc\x97\xfa\xba\xb2\x5e\xbd\x9e\xc7\x87\x97\x57\x37\xc1\x3b\xae\x16\xcb\x15\x0d\x03\x54\x25\x9e\xed\x3b\x28\xef\x68\x4e\x04\x2b\xf1\x66\xe6\x6b\x33\x26\x46\xdb\x41\x2d\x6f\x0e\x4f\x1b\xd6\xa0\xb1\x4f\xe8\x12\xd4\xa8\xf3\x9a\xbc\x0d\x9d\xed\x1a\xc3\x78\xc4\x96\x5d\x47\x78\xb7\x91\x87\xe1\x57\x29\x1f\xca\x2f\x98\x8a\x3b\x70\x20\x67\xaa\x1e\x23\x7a\xd6\x3b\x7e\x6f\x5c\x4d\x36\x5a\x05\xdc\x0c\x01\xf5\x7c\x1e\xea\xdb\x7f\x34\xf0\x1f\x0d\x04\xa1\x99\xab\x67\x3d\x71\x59\x79\xfd\xa7\xc5\x9a\xff\x6e\xe0\xe6\xbf\x57\x0a\x16\xdc\xf3\xaa\x6e\x2f\x35\xae\x3a\x7a\x83\x61\xfb\xd5\x41\xfa\xa4\x81\xd7\x6e\xe6\xf2\x81\x36\x91\x15\x72\x7d\x5a\x17\x87\x68\xb1\xf0\xeb\x75\x31\x3c\xe3\xf7\x7d\x7f\xc7\x53\x7d\xe9\xcf\x79\x8c\x50\x7f\x8e\xbf\xcd\x90\xe5\xcf\x19\x16\xfa\xec\x96\x09\x29\x19\x59\x30\xf2\xf5\x92\xd1\xc2\xda\xd4\x89\xf2\x51\x99\x10\x83\x0d\x6b\xc9\x21\x9d\x70\x93\x8e\x5d\x25\xc2\xc2\x6d\x44\x55\x5e\xa7\xda\xc0\x3e\x98\xa3\xc3\x00\xdd\xd2\x00\x8d\x61\xa2\x07\xc8\x7a\x96\x1a\x23\x2d\x3d\x24\xc3\x14\x7b\xa4\xda\x44\x66\x48\xfa\x29\xe2\x3e\x4e\x42\xd0\x25\xf5\x21\x68\x06\x19\xa6\xaf\x20\x84\x70\x9c\x0c\x69\x66\x0a\x4d\x4f\xa1\x94\x21\xe5\x21\xdc\xee\x92\xa1\x0b\x4a\x6e\xc1\x4f\x8e\xd8\x3f\x2f\xd3\xc8\xa4\xc6\x34\xc2\xf3\x07\xb3\x03\x31\x8d\x82\x0d\xf0\xfb\x92\x0d\x4c\x6a\x3c\x7b\x58\xe6\x1e\xfc\x2c\x73\xef\xa2\x94\x79\xb9\x44\xf0\xbf\x72\x86\xde\xae\x69\x7e\x0f\x53\xdc\x4f\x1d\xec\x91\x97\x3b\x60\xa9\xa6\x91\xf9\xb2\x5c\xb2\xb9\x03\xf7\xc6\xe0\xb4\xaf\x61\x85\x5c\x7f\x5b\x71\x63\x0c\x4a\x38\x7d\x72\xc5\xc0\x23\x42\x78\x90\xbb\x99\xef\x6b\x9a\x3e\x20\x2f\xcf\x9e\x19\xe2\xe7\x07\x33\xc2\x6a\xbd\x9c\x25\x86\x4c\xfd\xfd\x00\xbd\x04\xdb\xa4\x6f\xc9\x70\xe6\xd1\x3e\x09\x20\x8a\xb9\xcf\x25\x0b\x56\x40\xfa\x56\x9f\xf8\xb6\x0f\x2c\xae\x70\x3c\x33\x40\x56\xdf\xb8\x0b\xc4\x1d\xad\x30\x25\x62\x67\x67\x44\x08\x71\xed\xc0\x69\xe9\xa2\x3c\x56\xca\x62\x51\x16\x17\x65\x91\x19\xd4\x9b\xc2\xfb\xb4\x28\x5b\x6f\x3a\x2d\x5d\x2d\x15\xd4\xeb\x1b\x4b\x96\x32\x45\x8c\xc8\xeb\x1b\xd3\x68\xb1\xd0\xd9\x8f\x1d\x81\xe6\x13\x16\xcf\x1c\x92\x0a\x6d\x10\x35\xc2\x82\xd8\x38\x01\xdf\x38\xc1\xa6\x8d\xf3\x2a\xe0\xcb\x9d\x93\x07\x59\x3b\xd6\x1b\xdc\x42\xbf\x4a\x0e\x23\x4d\xf3\xaa\xe4\x28\xe2\x18\xb6\x89\xaa\xa4\x53\x14\x50\xf0\x3d\xf6\x49\xb3\xb8\x62\x17\xaa\xf9\xc6\xb1\xf0\x8b\x1a\x10\xd2\x41\xec\x54\x90\x04\x40\x40\x48\xbb\xcb\x55\xbd\xeb\x75\xbc\xbb\xef\x15\xa8\x0f\xb2\x6c\xd8\xcd\x7c\x50\xbd\x35\xdb\xc1\x6a\x71\x3c\xca\xb3\xa5\x21\x86\x59\x6d\x62\x4f\x50\xdd\x60\xa1\x45\x71\xbb\xcb\xc8\x6a\x2a\xec\x13\xa8\xe1\x4f\xc4\x58\x7f\x6b\xec\xbb\xc8\x25\x55\xde\x45\xe5\x70\xec\x52\xbb\x3b\x75\x70\x48\xba\xd4\xb8\x38\xfd\xf4\xe3\xee\xe0\xfc\xb6\x8d\x23\xd2\xb4\xa2\x7d\x17\xa0\x6c\x0e\xc1\x74\xb8\x7f\x08\xc0\x79\xbe\x1d\xb1\xe5\x6c\xa0\x6d\xf9\xca\x5e\xe0\x30\xd8\xe7\x00\xdb\xea\x9b\x01\x0e\x49\xff\x5d\xd8\xea\x9b\xa1\xe5\x92\x06\x50\x6d\xbf\x35\xf6\xc3\x9d\xa0\x55\x6d\x98\xf9\xc8\x2b\x9e\xa6\xb9\xad\x3d\xd3\x5b\x2c\xdc\xd6\xae\xa9\x1e\x96\xe1\x3c\x67\x2c\x0f\x5c\x4a\xaa\x55\x1d\xa4\xed\xc8\xb8\x0e\xe9\xf2\xab\x1e\x72\x58\x08\xff\x0c\x16\x1a\x60\xb2\x21\xe0\xa1\xf9\xae\x58\x89\x82\x29\xdf\x62\x64\x43\x03\x43\xd8\x3b\xb7\x5e\xc7\xb2\x4d\x1e\x56\xc2\x72\xf7\x3d\xc1\x69\x6f\x71\xfa\xa2\xdd\x45\x16\x72\xeb\x75\x45\xe5\x9e\x07\xe5\xdb\xf7\x2c\x15\x38\xdc\x02\x38\xc0\x7d\x4e\xc9\xb3\xcd\x81\x4b\x35\xad\x80\x93\xaa\xbf\x02\x22\xbc\xe4\x43\x24\xbe\x2e\x16\xbe\xb1\xf5\x50\x74\x9e\xbd\xc9\x90\x38\x79\xa2\x9b\x9f\x3d\x15\x7e\xf2\x12\x35\x26\x5f\x54\x4c\xe8\xec\x0a\xec\xb6\x8d\x8e\xbf\x58\x30\x40\x9f\x2b\x46\x3e\xcb\xaf\x7a\x34\xc7\xe1\x1c\x59\xd1\xeb\x73\xcb\xfa\x14\xcd\x8d\xc0\xf8\xec\x2a\x45\xcb\x7b\x4d\xd9\x87\xa2\x51\x54\xec\xa8\x66\xae\x86\x2e\x3f\xc3\xe4\x7a\xb0\x0a\x55\x77\x2e\x49\x5b\x4f\xa9\xb4\xd8\x2c\xd1\xa6\xcd\xa2\x9e\xe5\x5c\xe5\x47\x6e\x04\x76\x7e\x57\x25\x86\x76\x01\x3d\x17\x4d\x86\x7c\xe1\xfd\x7a\x1d\x17\xcd\x86\xdc\xff\x07\x04\xd5\x5c\x27\x53\x9b\x84\x78\xe0\x08\x5a\x05\x9f\x76\x17\xb5\x9a\xe6\xee\xbe\x0c\x23\x3a\xbb\x6a\xed\x99\xcd\x2a\xf1\x45\xb6\xd9\x15\xfb\xcc\x08\xdc\x7c\x45\xba\x02\xaf\x75\x39\x2c\x77\xff\x1a\x5e\x13\xfd\xd9\x7b\xe7\x2e\x16\xbf\xed\xbb\x8b\x45\x75\xa5\x1b\xa5\x94\x26\xee\x94\x13\x76\x21\x61\x6f\xdf\xcd\x23\x7b\xb1\xd4\x3d\x5e\xf0\xed\x4a\xf2\x5b\x46\x36\x56\x9b\x26\x9b\xf4\xee\x2b\x18\x4a\x41\x50\x22\x92\x66\x69\x49\xa1\x66\xf4\x02\xde\x77\xca\x18\xf5\xaf\x53\x93\x7b\xc8\x72\xed\xd0\x59\x2c\xbc\x7a\x1d\x9e\x48\xb5\xb1\x74\x49\xb3\xf1\xce\xe3\x5b\x80\x21\x43\x8b\x12\x86\x4a\x56\x5a\x66\x93\x2e\x22\x47\x91\xc6\x26\x91\x6d\x2c\x16\x21\xe6\x8b\x10\xff\x97\x54\x59\xfc\xd7\xa9\xb2\x2a\x98\x05\xee\xb1\x9f\x9f\x31\x51\x39\xe5\x54\x5c\x68\xee\x56\xc6\x49\x65\x4f\x10\x51\xa9\xbc\x92\xf3\x48\x13\xfb\x64\xd7\xda\x25\xdc\xde\xd0\xdb\xde\xc6\xfe\xf6\xb6\xe0\x02\xcf\x5c\x09\x1f\xca\xbb\xb7\xf2\xee\xe3\x4e\x4e\x79\x8d\x67\xa6\x87\xfd\x21\x35\x1b\xf8\xe9\xc8\xf4\x97\x72\x6c\x67\xee\xc6\x5b\x76\x15\x43\x2a\xd6\x4d\x9f\x92\xba\x5b\xf7\x93\xba\x57\x0f\x92\x92\xf3\xad\x5e\x81\x8e\x92\x3c\xe6\xd2\x68\x4b\x48\x80\x97\x67\x13\xbd\x37\x5f\x91\xc7\x95\xf4\x07\x46\xea\x65\x58\x5f\x2c\x62\x9f\x2f\x62\xff\xbf\x5c\xc4\xfe\xeb\x8b\xb8\x66\x0d\x78\xa2\xd8\x02\x2a\x3c\x1c\x50\xcf\x39\x79\x40\x2e\xb9\x8d\x20\x1b\x5c\x6f\x0e\x37\xdb\xd2\x01\x4a\xf3\x1d\x84\xe7\xc8\x01\xe0\x20\xab\x0c\x02\x9a\x66\x95\x26\x87\x01\x95\x52\xf6\xc6\xc3\xa0\xe2\x06\xe1\x38\x09\x2a\x74\xf4\x54\x49\xc6\x83\x40\x64\x60\x40\x70\x19\xeb\x2e\x32\x46\x5b\x20\x02\xe4\x6a\xc0\x1c\xce\xca\x2d\xfc\x45\x10\x53\x5a\x07\x10\xf3\x88\x6b\x37\x1c\x30\xf5\x6f\x3a\x2a\x0c\xd9\x13\xf0\x76\x33\xee\x52\x15\x94\x5c\x91\x5c\x00\xd4\xe5\x37\xd3\x63\xa0\xe4\x32\x5a\xbb\xff\x33\x58\xba\x8b\x75\x8f\xfb\x73\xca\x50\x01\x00\xde\x4a\x78\x37\xba\x22\xc4\xfd\x53\x90\x1b\x08\x28\x19\x70\x28\x19\xfc\x65\x3a\xf2\x37\x86\x6b\x7f\x07\x5c\xab\xaf\x20\x5b\x95\x34\x68\xc2\x51\x52\x46\xb5\xea\xfb\xde\xca\x3b\xc3\xae\x68\xb1\xf8\x1d\xb6\xab\xb2\x81\x7e\x03\x94\xb9\x46\x87\xba\x6b\x18\x53\x35\xe7\x92\x4e\x63\x19\xc6\xf4\x70\x93\xfb\xb7\x84\xe7\x5d\x84\x43\xf9\xbc\x87\xc0\xaf\x34\x3c\xbf\x85\xb1\xf9\x55\x51\xad\xd0\x8b\x45\x8b\x45\x04\x49\xf4\x31\x4f\xda\xc0\xb9\x8b\xd9\xfb\x53\x91\xce\x5e\xe9\xc4\x1b\xb2\x15\x28\xc8\x0d\x46\x6c\x0c\x39\xb1\x31\xdc\x54\x9d\x72\xa5\x9b\x13\x69\x39\x3d\xe7\x2e\x16\xde\xf6\xf6\x86\xe3\x79\xf7\x9d\xb7\x76\xd4\x8e\xe6\x7a\x1e\x72\x5d\x6a\x2a\x8d\x38\x18\x8c\x36\x81\x81\xf4\xf7\x70\xd7\x53\xf4\x91\x47\x9b\xd0\x02\x25\x4a\x1e\x4b\x51\x11\x90\x67\x8d\x25\xe1\x52\x34\x5f\x02\xc9\xbb\xb2\x9b\x53\x81\x1f\x40\xea\x20\x9e\x61\x25\xc5\x33\xac\xa4\x78\xde\x93\x41\x2f\x7a\x73\xfd\x2d\x63\xe2\xc4\xf3\x6f\xc0\x65\xf2\xe7\xdf\x95\x8b\xe8\x33\x57\x77\xf3\xbd\x0a\x80\x2b\xd2\xfc\x0d\x69\x81\x48\x3b\x8c\x8a\xb4\x70\x43\x5a\x94\x6f\xf2\x3c\xa9\xbf\x9e\x34\x28\x5a\x68\xbd\x7c\x49\xa8\xe9\xe1\xf1\xcc\xf4\xf1\xd6\x07\x33\xc0\xdf\x3e\x98\x21\xbe\x4f\xa8\x19\xe1\xaf\x09\x35\xfb\xf8\x36\xa1\xe6\x60\xc9\x35\x5c\xde\x8c\x5e\x43\x13\x1b\x31\x01\xe3\x2d\xe4\x34\x13\x15\x0d\xe0\x6a\x53\x95\xfe\x8c\x05\x22\x18\x73\x08\x18\xff\x09\x22\xb0\x5c\x95\x85\x70\x17\x8b\x5d\xce\x4d\x35\x0b\x3f\x47\x10\x8f\x7a\x57\x9c\xbb\xa4\xc4\x30\x00\x9a\x40\x96\x4b\x20\xbd\xa0\x31\xdd\xed\x26\x08\x4e\xaa\x2e\x82\xc0\xb6\x65\xaa\xb5\x41\x88\xbb\x58\x34\xab\xc4\x53\x5a\x5a\x91\xdb\x14\x5a\xdf\xe5\x03\x98\x9d\xe2\xe8\x85\xc7\x4c\x00\x2f\xb1\x2e\xf1\x94\x18\x5a\xe3\xbf\xb6\x73\x9b\xfb\xd0\x93\xd6\xae\x59\xde\xc3\x13\x31\x79\x13\x3e\x79\xac\x3f\xf7\x3d\x4a\x5e\x6e\x9f\xa8\xf9\x29\xc5\xc9\x13\x35\xdb\x29\xee\xb4\xbf\x74\xcc\xdb\xdc\xdb\xb0\x35\xd9\x34\xc7\x2b\x68\x36\x9f\xdb\x15\x9e\x7d\x65\x2e\x5f\x99\x67\x86\x7d\xd5\x38\x66\x93\xbf\x38\x4c\x36\xb8\x37\x93\xf5\xad\xad\x68\x75\xb2\xa5\x48\x23\xa1\x69\xd7\x60\x48\x91\x6c\x37\x71\xc4\xfe\xf4\xd9\x9f\x01\xd9\x06\x7e\x12\x04\xbc\xb6\x8f\xfd\x7a\xd3\xc1\x76\x07\x77\x1c\xf0\x8a\x7d\x90\x5a\x7d\xe2\x5b\x03\xe2\xd7\x9b\x96\x5f\x27\xbb\x3c\x80\x32\x21\x9f\x14\x61\x99\x1f\xa7\x93\x01\x7d\xba\x18\xfb\x85\xab\xa1\x34\xc8\x2a\xd9\xb8\x72\x41\x93\x7e\x90\xa4\x95\x87\x6e\x30\xaa\xcc\x40\x73\x60\x40\xb3\x9d\xc1\x78\x14\x55\xc4\xad\x7f\x00\x47\x34\xab\x13\x7c\x29\xba\xa4\x9d\x16\xae\x54\x45\xb7\x1c\x6c\xb7\xbb\xac\x47\x2b\x61\xd8\xd3\xc8\x0c\xc8\x45\x6a\xb9\xe4\x53\x6a\x85\xc4\xe7\x40\x63\xc1\xb7\x4f\x29\xff\xb6\x92\xdc\x4e\x79\x2c\xf6\x5b\xf6\xd9\x4d\xad\x28\xff\x2c\x63\xb1\x2b\xce\xf1\xb9\x63\x01\x65\x7c\xd2\x33\xaa\x5f\x27\xcd\x15\x67\x02\x32\xb7\x18\x16\xb8\xd3\x97\xf4\xed\x48\x04\x76\x2b\x8d\x46\xd3\xbe\xa4\x55\x42\x8d\xa8\xa7\xfb\x78\xce\x50\x98\x3e\x22\x6c\x4b\x40\x91\x09\xb7\x95\x4b\x57\x4b\x76\xc0\x04\x6f\x42\xde\x30\xb6\x6f\x35\x39\x85\xf2\xbc\x82\xd9\x6b\x6d\x92\x72\x9b\x33\xde\x66\x50\x25\x17\xa9\xa6\xf1\x23\x60\xc2\x1f\x08\x49\xa1\xd2\x09\xc0\x38\x00\x7b\x95\xf8\x8a\xf9\x3b\x50\x60\x42\x3d\x2f\xad\x0c\x19\x71\x27\xc8\x2e\xae\x2c\x9a\xbb\x52\xd0\xdb\xf0\xc4\xd6\xbf\x56\xf7\xeb\x35\x99\x0d\xe5\x9e\xa8\x5e\x3e\x7e\x33\x03\xec\xff\x66\xba\xf8\xcb\x89\x19\xe2\xaf\x27\x66\x84\xdd\x23\xb3\x8f\xbd\x23\x73\x80\x27\xa7\xe6\x08\x4f\x66\xe6\x04\x87\x47\x66\x8a\xdb\x3f\xcc\xd9\x52\x10\xc2\xf3\xc2\xe2\x47\xd3\x3c\xe3\xc2\xd7\xaf\x23\x5a\x9f\x73\x87\x8d\xaa\x76\xc0\x54\x6c\xff\x29\xdf\xfe\xd3\xff\x92\xd4\x9e\xbe\x4e\x6a\x33\xc2\xab\xca\xb1\xc3\xdf\x24\x5e\x7f\x53\xe9\x56\x95\xfb\xe9\xa8\xaf\xcd\xf2\xeb\x6e\xf9\x75\xaf\xfc\xfa\x16\x30\x8f\x98\xe5\xab\x1e\xe3\x8a\xae\x7b\xd4\x6c\xe2\xcf\x3d\x6a\xee\xe2\x4f\x3d\x6a\xee\xe1\xcb\x1e\x35\xdf\x2e\xe5\xa0\xfe\x97\x18\xa5\x04\x18\xa5\x55\x19\x4d\xc2\xc9\xa6\xe4\xe7\x32\x9a\xe4\xff\x9d\x8c\x26\xf9\xfb\x32\x9a\xc6\x4f\x44\x34\x2d\xbf\x5e\x37\xd5\x24\x20\x43\x82\x72\x54\x46\x89\xd2\x1b\x9c\x02\x7c\xe7\x6b\x5a\x83\x90\xa0\xb5\xb7\x42\x0d\xa6\x02\x86\x53\x0e\xc3\xe9\xeb\x14\x60\xe5\x4b\x41\xdc\x2d\x16\x5f\x55\x6a\x30\x7d\x9d\x62\x55\x0a\x59\x94\x28\xa5\x72\xef\x41\x8b\x05\x6d\xd1\x56\x73\xe5\x68\xfd\x22\xa9\xc1\x2d\xf0\xac\xc5\x97\xc1\x2d\xa4\xd9\xde\x62\xb1\xa7\x08\x93\xa5\xd7\x7b\x7e\xc5\x07\xc4\xb1\x4f\x7c\x46\x76\x41\x02\xc0\xf7\x1e\x01\x6f\xf9\x6a\xfa\x2e\x27\x48\xe0\xa2\xda\x47\x4a\xe9\x52\xc9\x96\xee\x91\x2f\x3a\x35\xae\x26\x14\x83\x1d\x13\x7b\xb9\xe6\x2f\x1e\x81\xab\xc4\x06\x06\xa3\xf4\x39\x94\xf0\x79\xe4\xf2\x66\x71\x02\x17\x0a\x45\xaf\x0f\x4b\x64\x6e\xb2\xa1\xed\xee\x7b\x8b\x45\x35\xef\x0f\x08\xa4\x76\xa1\xfb\xd5\xbc\x5f\x8c\x84\x14\xf2\xa8\xbc\xfa\x4c\xac\x66\xc6\x57\x33\xfb\xcb\x6c\x1d\x88\xd0\xf8\x85\x00\xb8\xe6\xdb\x70\x55\xd0\x94\x57\x05\x1d\xb8\x29\x10\x17\x06\xed\xee\x62\xe1\x11\xd2\xee\x6a\x5a\xf5\x1b\xdc\x15\x69\x5a\x75\xab\xc7\xbd\x13\x7a\x84\x65\xae\xc2\xfd\x69\x73\xd3\x65\x2b\xbf\x8b\x5c\x61\xf0\x3c\xb2\xbb\xc6\xca\xc1\xa5\xb2\xe0\xd1\x3a\x9a\xe6\x97\x3a\xa9\xe0\xd0\xec\xaf\x51\x3a\xab\x8c\x6a\x95\xf6\x29\xa7\x80\xca\x50\xc8\x93\xf3\xe3\xe0\xd5\x71\x34\xff\x68\x34\xf6\xa9\xa6\xed\x36\x1b\x8d\x77\x74\xa9\x3a\xcf\xfc\xd6\xfb\x6b\x55\xfc\xab\x0a\xfe\x6a\xb9\x67\x47\x11\x9a\x61\x8f\xf1\xc4\x3c\xa4\xd7\x5b\x54\x25\x41\xa4\x7c\xfd\x1d\xff\x0b\x49\x00\x50\xb4\x47\xb6\xfe\x62\x73\xbf\xff\x79\x73\x97\xa1\xf8\xca\x12\x7e\x53\x1a\x2b\xe6\x67\x26\xe0\x6d\xc6\xe1\x6d\xf6\x77\xae\xa3\x40\xf2\xfa\x27\xf4\x6d\x99\xa8\x65\xc7\xce\xde\x46\x82\x57\xec\xe3\xe2\xd8\xe6\x97\xda\x4b\xd1\xa3\xbf\xc9\x9a\xcf\xc5\xa8\xe6\x82\xac\xff\xcb\xa3\xfa\x73\xaa\xdd\xdd\x6e\x16\x62\xa0\xca\x26\x36\x48\x34\xf7\x53\xe1\x32\x6b\x8a\xf0\xf3\x02\x51\xa2\xf0\x5e\xae\xb0\x12\x21\xeb\x82\xf0\xdd\xdf\x38\x13\x83\x54\xed\x0d\x57\xe8\x6f\x5c\x08\xfd\x0d\xb7\x5e\x48\x4d\x2c\x97\x54\xf5\x3f\xfe\xb5\xef\x6a\x5a\xb3\x01\xf8\xc1\x10\x6f\x06\x7b\x45\x4b\x4a\x5c\xc6\x11\xfd\x54\xa4\xfc\x20\xa6\xf2\x81\x4f\xe5\xc3\x5f\x9e\xca\x46\xa1\x41\x52\xba\x7f\x5c\xbf\x67\x60\xec\x9f\xfb\xce\x53\x4f\xe8\x6a\xf9\x88\x46\x2f\x7e\xc1\x00\x4a\x13\x6c\x35\xf8\x81\xe8\xe4\x23\xef\xe4\xe3\x7f\x49\xc7\xbd\x79\xdc\x44\xc8\x71\xb7\x57\xf9\xcd\x00\x78\xa9\x06\x8b\xd2\xa6\xb3\x7a\xba\xed\x55\x09\xf1\xd6\xe9\xbc\x41\x3c\xea\x77\x5e\x21\xf3\xf6\x36\x91\x79\x87\x29\x76\xcb\x94\x1e\xa4\x34\xd7\x52\x80\xde\x53\x2f\x07\xab\x70\xd6\xec\x6e\xee\xc7\x68\xec\x07\xaf\xf5\xa3\x59\x19\x27\x95\xdd\x4d\x9d\xf9\xd4\xa5\x58\xe1\x5a\xf3\xfd\x9b\x7f\xe2\xfb\xbb\xb8\x48\x04\x55\x0c\x1b\x02\x75\xe3\x88\xb8\x00\xa3\xe1\x7e\x64\xd5\xeb\xc2\x8f\x44\x9f\xb8\x0c\x56\x43\xdc\x40\x78\x20\x9f\x9b\x08\x8f\xe4\xf3\x2e\xb2\xe0\xfe\xfd\x85\x5b\x9e\x9a\x7d\x9c\x81\x97\x41\x73\x80\xe7\x74\x30\x0b\xcc\x11\xc3\x9c\x22\xf2\x48\xc4\xf7\x53\xde\x04\x5c\xe2\xbf\x8c\xe8\x30\x30\x69\xde\xcc\xc8\x35\xa1\xef\x2d\x2a\x5b\x33\x2f\x97\x39\x2d\xcc\x16\x28\x35\x03\xfc\x86\xcd\x50\x6a\xfa\xcb\x65\x4e\x7e\xb2\x25\x2d\x93\xef\x9d\x48\x91\x11\x0f\x52\xbc\x7a\x23\x01\x49\xcd\xf5\x24\x58\x2b\x57\x6a\x87\x83\x76\x36\x04\xe9\x09\xc4\x38\x42\x31\x8e\x60\x3f\xb4\xea\xf5\x00\x45\x84\xda\x0f\x53\x47\x0f\x58\xff\xfb\xf9\x4b\x13\xb1\x49\xed\x73\x85\xa8\x88\x7d\x91\x2f\x7d\x36\x9b\xe2\xb6\x69\x57\x44\xcd\x91\x33\x18\xc9\x19\xec\x8b\x19\x1c\xac\x8e\xde\xc7\x7c\xf0\x9e\xca\x28\xb1\xaa\x0b\xb2\x9f\x72\xc5\xdd\x5c\x2a\x28\x74\x72\x2d\x2a\x95\xce\x21\xfe\x9e\x5b\xcc\xbf\xc7\xe6\xbd\x98\xe7\x8a\x0b\x6a\x14\xcb\xc7\xcd\xac\x05\xf6\xcb\xcc\x05\x4f\x5a\x07\x63\x0e\xbc\x95\x78\x54\xa9\xd5\x69\xbd\x66\xca\xeb\x85\xff\xa9\xd5\x3d\xc6\x7d\xf8\xab\xdc\xc7\x93\x40\x13\x4f\x1c\x4d\x3c\xfd\xbd\xc3\x4e\x45\x5c\x0f\x11\x5a\xbb\x31\xdd\x84\xec\x9a\xb9\xc6\x15\x43\x6e\x85\x36\x92\x24\x86\x42\xb8\x50\xaf\xd7\xf9\x7d\xa1\x10\x71\x84\xf9\x5d\x79\x50\xaf\xe3\x06\x21\xfe\x62\xd1\xdc\x0f\x5e\xd1\xbb\x60\x28\x73\x99\xab\xbe\xa9\x58\xf1\x59\x0c\xf7\x99\x0f\xf7\xf9\xf5\xe1\x16\xac\x4c\xb5\xb1\x76\x11\xf4\x9a\x4c\xce\x5d\x43\xc9\xee\x52\x34\xf2\xe7\xca\x91\xef\xa0\x8d\x35\xd1\xf6\x81\xe8\xf2\x01\xef\xf2\xc1\x7f\x89\xc8\x0f\xfe\xf2\x05\x66\xf3\xdd\xdf\xbd\xb7\xa4\xc5\xdd\x56\x71\x6b\xa5\xf2\xe7\x87\x91\xaa\x9c\x66\x3b\x25\xbd\x9b\xf2\x35\x25\xf6\x4a\x3e\xfb\x5e\x2e\xbf\x99\x0d\x7c\x37\xa0\xb0\x09\x0f\xfe\x37\x19\xf0\x43\x31\xc1\x87\x7c\x82\x0f\xff\xcb\x09\x3e\xfc\xa9\xc4\x63\x6f\x55\xe2\x51\x42\x99\xeb\x37\xb8\x6b\x42\x0c\x45\x4c\x31\x9e\x99\x0d\xfc\x71\x48\xcd\x5d\xfc\x74\x64\x36\x97\xb2\xed\xff\xa5\x79\x39\x12\xf3\x72\xc4\xe7\xe5\x68\x6d\x5e\xf2\xe1\xab\xe0\x7a\x2c\x4a\x1d\xf3\x52\xc7\xff\xe5\x6c\x1e\xbf\x3e\x9b\x54\x45\x46\xb4\xac\x01\x29\x66\x68\x34\x1b\x8a\xa8\x91\x26\x2d\xc5\x5d\x98\x97\xad\x7c\xd9\xc1\x73\x38\xd2\x6d\x07\x2d\xbf\xea\xed\x42\xf0\xed\xf5\x29\xb1\x0f\x23\xdc\xc1\x47\x91\x63\xb5\xff\x5b\x1a\xaa\xfd\x7f\xeb\xde\xf9\x05\x34\x9a\x4d\x3f\xd7\x2f\xfc\x5f\xbe\x7d\x4e\xf3\xdb\xe7\x69\x64\x07\x0e\xf1\x97\x4b\x0f\x6e\x9d\x73\xca\x4e\xd3\xde\x6e\x26\xac\x7e\x8a\x30\xf6\x18\x65\xf5\x76\xed\x2a\xda\x27\x6f\x89\x0c\x91\x28\x2e\x9b\x1b\x8e\x3d\xf1\x1c\x80\x7e\xbf\x20\xb2\xd8\x97\x66\xf1\x45\x4d\xf6\x5b\xbb\xa6\xf8\xe4\xf5\xe9\xea\xb7\x3d\x73\x57\xf9\x26\x90\xf1\x5b\xa0\x82\x74\x4a\xaa\xa7\x23\x19\x6a\x3b\x8a\x29\xae\x36\x10\x66\x9b\xcd\xb5\x29\x23\xcd\x1d\xdc\x3e\x84\xe7\x86\xd9\x74\xf0\xd6\x07\xd3\xb5\x77\x1d\xfc\x8d\xfd\xee\x39\x4b\x64\xf2\xac\x3c\x1b\x88\xa7\xdf\x40\x9e\xa6\xc8\xb3\xeb\x2c\x97\x02\x94\x36\x6c\xd4\x7e\xcc\xcd\x7f\x3c\x62\x7b\xc2\xb2\xec\x46\x31\x0e\xf8\x4b\x1b\xf7\x5c\x6c\xc1\x73\x0e\xc8\xe7\xff\x25\xd8\x9e\xff\x14\xa1\x89\x63\xeb\x6f\xab\x1f\xbc\x22\xc1\x3d\x8c\xd6\xb0\x9f\x3c\x00\x1e\xa8\xd9\xc0\x9f\x1f\x28\x60\xba\xf3\xff\x9b\x13\x78\x21\x26\xf0\x82\x4f\xe0\xc5\xdf\x23\x8a\xde\xfe\x03\x09\xc0\xee\x7e\x2e\x00\x28\x58\xe7\x5d\x84\x34\x6d\x6f\x7f\x83\x68\x60\xaf\x74\x17\x56\x48\x06\x2e\xfe\x89\x64\xe0\x53\x81\x0c\x83\x01\xe9\x0b\xf7\x70\xdf\x7a\xba\xdf\xa7\x68\xf9\x09\xaa\x4c\xef\x37\x88\x41\x6d\xc7\xba\x11\xc6\xbc\xc1\xa0\xa4\xc7\xc1\x99\x9d\xa0\x4f\xb9\xfa\xb4\xaf\x69\xbe\xfd\xc9\x75\x20\x66\x50\x40\x02\xa3\xd7\xd7\x29\xc2\x5c\x6d\xd4\x2d\x82\x2e\x7a\xf8\x53\x40\xcd\x00\x1f\x06\xa6\x6f\x1c\x06\x4b\xee\x93\xa9\x4f\x15\xdf\x72\x9d\x58\x0d\x7f\xa3\x46\x1b\x3e\x71\x4a\x52\x9c\x90\x4b\xb9\x46\x3d\x7d\x35\x8e\xbe\x94\xbe\x7d\x0a\xe8\xb6\xc7\xfe\x5a\x8c\x9e\xe4\x51\x96\x8c\xc3\x60\xdb\x33\x0e\x73\x17\x4d\xdb\xfe\x12\x71\x27\x4d\x7e\x9f\x92\x97\xe8\x91\x9a\x07\x09\x9e\xce\xa8\x79\x98\xe0\xe1\x23\x35\x8f\x13\xfc\xf8\x48\xcd\x76\x82\x9f\x1f\xa9\xf9\x3e\xc1\x27\x8f\xd4\xfc\x90\xe0\xf9\x8c\x9a\x27\x09\xee\x3c\x52\xf3\x34\xc1\xb7\x8f\xd4\xfc\x98\xe0\x4f\x33\x6a\x9e\x25\xf8\xeb\x23\x35\xcf\x13\xfc\xed\x91\x9a\x17\x09\x3e\x7e\xa2\xe6\x55\x82\x2f\x67\xd4\xbc\x4c\xf0\xe5\x13\x35\x3b\x09\x9e\x3e\x51\xf3\x73\x82\x4f\x9e\xa8\x79\x9d\xe0\xeb\x19\x35\x6f\x13\x1c\x3e\x53\xf3\x28\xc1\xdd\x67\x6a\xde\x25\x78\xf8\x2f\xf3\x3e\xc1\xd3\x67\x6a\x7e\x49\x70\xfa\x4c\xcd\xaf\x09\xfe\x36\xa3\xe6\xb7\x64\x89\x03\xd6\xd9\x83\xd1\x68\x9c\xd1\x2c\xf0\x3b\xf1\x30\x38\x8f\x47\x81\xf9\x22\x36\x22\x3b\xee\x82\xf9\xff\xcf\xda\x9b\x77\xb7\x6d\x3b\x8d\xc2\xff\xfb\x53\x28\x68\x9e\x44\x7c\x3c\x56\xec\xb4\xbf\xfe\x1a\xa9\x6c\x8e\x2c\x79\x8b\x77\x4b\xf2\x5a\xdf\x1c\x90\x84\x28\x5a\x14\x49\x93\xd4\x1a\xfb\xbb\xbf\x67\x06\x00\x17\x49\x4e\x7b\xef\x79\xd3\x1e\x0b\xb3\x00\xc4\x3a\x18\x0c\x80\x01\x56\xf3\xaf\xaf\xd0\x8c\x05\x6f\x0d\x78\x9c\x96\xc8\xee\xa4\xfa\xe3\xaa\xcf\xc9\x36\x86\x8c\x9f\x5f\x61\x97\xc7\xab\x7c\xfd\x89\xa6\x8e\x2d\xcb\x17\xab\x0c\x03\xcd\xd0\x22\x1f\x09\x49\xea\xd9\xc3\x55\x2e\x3f\xe3\x22\xb1\xf0\x93\xef\xb4\xc2\x91\x15\xae\xd2\x47\x9a\x7e\xc0\xc7\x6e\xb9\xa4\x21\x91\x76\x5e\xe1\x40\xac\x89\x18\xe9\x7a\x38\xf4\x92\x34\x74\x63\x3e\x2a\x91\xe3\x09\x6c\x48\x3a\xd6\xe0\xba\x7c\xad\xd4\xd3\xd1\x88\xbb\xe2\x8a\x3b\xeb\xaa\x6b\xaa\xf3\x42\x4c\x9d\x88\xc7\xc3\x95\x96\x59\x68\x9e\x53\x1e\x95\x08\x89\x2e\xe3\x69\x88\xbd\x79\x35\xf5\x54\x97\xe5\x3c\x76\x57\xa9\x63\x1d\xfd\xc2\x5b\x53\x90\x89\xa6\x76\x6c\x9e\xa6\x62\x4d\xde\xe7\x9a\x83\x65\x5d\x66\x2b\x49\xb9\x3d\x14\x0e\x5b\xe9\x3b\x5d\xa7\x58\x25\x9d\x54\x44\x91\x70\xde\xea\x6a\x8a\x8b\xec\x2f\x25\x52\x8b\x48\xdb\xaf\x80\x5d\xd8\x5f\xae\xa8\xbd\x2c\x62\x2c\xc4\x72\x65\x9d\x6a\xe2\x4d\x18\x3b\xc8\xb0\xa6\xd5\x3f\xbf\xbe\x36\x1c\xef\x8d\xd7\x45\x29\xa3\x1d\xe1\xeb\xe7\x95\xcf\x26\x20\x9f\x88\x30\x1a\x52\x26\xda\xdc\xb7\xc7\x3e\x4f\x65\x65\x76\xe7\x91\x48\x4c\x2d\x2d\x49\xee\xbb\x38\x0a\x75\xe2\x36\x32\x25\xb5\x5d\x1e\xb3\xba\x93\xc0\xea\xe0\xb4\x33\x64\xd6\xb6\x8c\x67\x08\x8a\xce\x0a\x83\xf5\x29\xc9\x07\x24\x86\x0b\xc3\xef\x29\x59\x1d\x6c\x88\x2b\x0c\x2d\x02\xb3\x81\xf4\x94\xa8\x61\x93\x24\xf9\x20\x49\x29\x8c\xd5\xca\x5c\x11\x8e\x78\xc4\x0a\x43\xe4\x29\x91\x3d\x38\xcf\x0f\xf3\x10\xe6\xb1\xe0\x2a\xab\x44\xcf\xb2\x28\xc9\x16\x8f\x8b\xd4\x95\x5c\x4a\xae\x12\xcb\x1b\xf8\x7c\x34\x4a\x1a\x76\x8e\x22\x3d\xeb\xe3\x92\x1c\x79\x25\x6a\x3e\xf0\xa6\x09\x1c\x05\xa9\x08\x12\x2f\x9d\x53\x59\x3d\x0d\x51\x89\xf3\xcf\x3c\x25\x34\x1e\xdb\x49\x69\xf4\xed\x27\xf9\x58\xfb\x96\xc0\x46\xf6\xd9\xa7\x04\xae\x78\xe0\x0a\xd9\x81\xc2\x18\x11\xa5\x91\x85\x30\xe6\xc2\x2f\x7e\x61\x65\x9c\x3c\x25\x6a\x54\x74\x92\x7c\x0c\xdc\x24\x59\x8f\xbf\xc3\x38\xb1\x17\xb8\xfb\x9e\x9f\x8a\xb8\xee\x25\xd0\xe6\xa9\xa0\x4f\xe7\xa8\x33\x72\x65\xbf\x84\x6c\xf1\x54\xb8\x61\x3c\x2f\x60\xf0\x93\x6f\x47\xed\x88\x54\x33\x52\x4f\xca\x8a\x46\x1f\x4d\x06\x56\xc8\x63\xa7\xee\x15\xdf\x03\x39\x9f\x94\x1e\xf9\xae\x8d\x13\xb1\x4f\x83\x70\x3f\x0e\x47\x6d\x9e\xf2\x46\x24\x3d\x5f\xbf\xb3\x5f\x5e\xde\x35\xbd\x2a\x47\x35\x01\xd5\x37\xcb\xec\xac\x9f\xe9\x89\xcb\x78\x35\xa0\xed\xa0\x5e\x00\x3b\xa6\x69\xe9\x27\x11\x07\xa8\x2a\xd0\x43\x89\x29\x99\xc9\x8d\xa2\x0b\xbc\x81\x54\x08\x28\xfa\xcb\x4b\x35\x7f\x2b\xcb\xf9\xe4\xc2\xad\x90\x8f\x9e\x12\xe6\x97\x1f\x3b\xdb\xf0\xfa\x09\x0e\xbd\xea\x54\xc0\xce\xb6\x61\xac\x75\x06\xe2\xc9\x04\xa5\x2e\xf4\x44\x00\x14\x5c\x43\x36\xc8\xfb\xe3\xc3\x36\xec\x80\xd4\x6e\xba\x80\x12\x23\xf7\x22\x68\x83\xd0\xd6\xaf\x0b\xac\xa7\xdc\x2f\xa4\xba\x57\xf9\xd5\xaa\xcd\x8f\xff\xb7\x5f\x9b\x6d\x5a\xb5\xd6\xb3\xf2\xd8\xfb\xfa\x68\xac\xd9\x82\x7d\x2a\xe4\xa5\x61\x69\xab\x6f\x66\x69\xc1\x4c\x1d\x0f\x4b\x47\xca\xd4\x7a\x92\xbe\x5c\xbc\x7b\x5d\xb5\x6b\xb3\x4d\x53\xd4\x66\x60\xd7\xe6\x18\x98\x1b\xaf\x96\x4a\x00\x69\x9f\x2c\x24\x7c\xb2\x0c\xf5\xae\xb8\x63\xd2\xcd\x28\xb5\xdf\x52\x38\xdb\xaf\xcb\x54\xf4\x79\xa1\x92\xe9\xd7\x66\x5b\x56\x6d\x06\xfd\xda\x7c\xcb\xaa\xcd\x0d\xb0\x37\xcd\x7e\x6d\xf6\xbf\xfd\xda\x1c\x1c\x1d\x9c\x19\xaf\xdc\xfc\xf1\xda\xe0\xb5\xf9\xb1\x69\x7f\x72\x5e\x5e\x76\x1a\x1c\xeb\xc1\xb4\x6a\xf3\x2d\xc4\xfe\xaf\x55\x9b\xe5\x0d\x93\xd5\xc5\x45\xb9\xd3\x49\x37\x8c\x74\xe4\x52\x85\x77\x4a\x15\x4d\x97\x3d\x64\xc0\x91\xee\x86\x74\x61\xc9\x8d\x6a\x7e\x06\xbd\xd8\xdc\xbc\x66\xd9\xea\x7c\xc3\x35\xaf\x4a\x5b\xc4\xd0\x51\x6f\x3e\x39\x8d\xb4\x4e\x2f\x98\xac\xe9\xf0\x10\x29\xff\xa6\x8e\xe1\x64\xe7\xfe\x1c\xf3\x81\xa7\xd0\x4d\xc0\xf1\x38\x08\x8f\x43\x90\x3c\x36\xde\xbe\xe1\x2c\x3c\x7a\xbb\x7d\xd3\x8b\x81\x97\xf6\x81\x2a\xe9\xab\x63\xbe\xdb\x96\xef\x8b\xca\x33\x68\x7b\xb1\xf1\xeb\x5f\xb6\xbc\x65\x5c\xb5\x4c\xbb\xf6\x7e\x5c\xdd\x91\xb7\xc7\x06\xcd\x99\x27\x9f\x4f\x39\x9f\x54\x1d\x78\xb0\x1e\x0d\x50\x58\xd3\x01\x5b\xf2\x7e\x96\x37\xce\x26\xcd\x99\x7a\x6a\xc5\xa1\x63\xe2\x85\x68\xf6\xa3\x41\xeb\x73\xd3\x01\xc5\x67\x5a\x86\x2e\x57\x16\xf3\xe1\xc7\x2b\xfc\x78\x2d\x96\xaa\x98\x81\x3e\xbd\xe9\x4b\x41\xd7\x74\x1e\x76\x64\x70\x68\x3e\x3c\x82\x8f\x7f\x02\x93\x4e\x2d\x51\x29\xb6\x21\x32\xb7\x1b\xd1\x9f\x41\x23\x92\xd5\x61\xd7\xda\xd5\x48\x3e\x73\x82\x29\x27\x32\xe3\x91\x01\xe3\xc6\xd8\x8c\x50\xb9\x1f\x7f\x95\xe7\xbc\xea\xd5\xf1\xd6\x16\x8c\xcd\x6a\x95\xd7\x12\x11\x2b\xff\xce\xc6\xc3\xf8\x51\x5e\x3d\x93\xfb\x00\x98\xab\xa3\xc0\x11\xb3\x97\x97\x8d\x6d\xa3\xa1\x4e\xd3\x8d\xd5\x69\xba\xed\x3a\x39\xc6\x4d\x8c\xe2\x79\xb9\x9d\xba\x2f\x91\xaf\xaf\x96\x69\xb6\xe3\xaf\xe7\x93\xaa\x80\xa1\x51\xaf\x9e\x4f\xaa\x7d\x18\x1a\x58\x57\x2e\xf8\x86\xd1\xd8\xfe\x33\xc0\xa2\xe8\x43\x09\x74\x98\x4f\xc6\xe9\xd7\x05\xa8\xcc\x6f\x53\x04\x0b\x1e\x92\x47\xc3\x68\x60\xdd\x98\xfd\x06\x3d\x28\xeb\x36\x74\x25\x3b\x0d\xdd\x58\xa2\xf0\x36\x94\x2f\x7b\xa9\xd7\xaf\xf2\x87\xd6\xf3\x63\x95\x27\xf9\xe6\x9c\xea\xaa\xd4\x75\x4d\xb3\x17\x7f\xf8\xf0\xd9\x94\x1b\x74\x94\x0b\x8f\x16\x5a\xc0\x6b\xfb\x03\xf9\x7b\x5c\xbd\x1b\xe0\x2a\x94\x82\xf7\x03\x8e\x83\x08\x83\xef\x07\x1c\xde\xed\x18\xf4\x5a\x67\x95\x27\xd2\x05\x46\x21\x0f\xa3\xf2\x48\x21\x7f\x6e\x38\x52\x16\xc3\x86\xdc\x30\xb4\x0d\xa3\x7c\x43\xde\xd6\xcf\xd9\x58\xe6\x19\x3d\x24\x46\xcf\xd9\x90\x4d\x5f\xb9\x4c\xa7\x1c\x9e\xa9\x47\xc6\x1a\xbc\x66\xb7\xab\xd2\x69\xa1\xca\x6e\xe1\x70\x42\xb0\x3a\x50\xf1\xbb\x55\x77\xc8\x33\x4f\xe1\x86\x69\x3e\x25\x1f\x3e\x58\xef\xcc\x5e\xbc\x9a\x53\xaa\xb9\x71\x52\x38\xee\x5d\xba\x26\xff\xf0\x83\x04\xb9\xfd\xd5\xf2\x78\x3d\x19\x70\x28\x3d\xb0\xa1\xfc\x97\xee\x0d\x5e\x71\xe9\x6b\xa9\x73\x50\x36\xbd\xdf\x6f\xff\x29\x68\x3b\xd7\x51\x6f\xb3\x58\x7a\xba\xb0\x8c\x86\xa5\x9c\x05\x63\xa5\x8e\x55\xa5\x66\xa5\x2b\x1a\x2f\x2f\x4b\xf2\x4d\x3e\x01\x1a\xca\x69\xb4\x6a\x9b\xfb\xf4\xcc\xbe\xf2\xe5\x78\x68\xda\xb5\xcc\x31\xe0\x91\x23\xcb\xae\x5e\xcb\x3c\xd3\x97\x72\x4e\x5d\xd3\x7e\xe0\x9b\xce\x80\x3f\x16\x19\x46\x1e\xa1\xef\xdd\x32\xfa\x6a\x57\x1e\x99\xbc\x57\xde\xc7\x0b\xae\x23\x6f\xcf\x0b\xef\x74\xf5\xfb\xa6\x5d\x73\x78\xca\x3b\x54\x39\xbd\xd8\x2f\xa6\x92\x16\x38\xf7\x07\x55\xc9\x49\x9a\x8e\x91\xb9\x94\x7c\xd8\x7b\x7e\xcc\xdd\x4a\x86\xa6\xfd\xd0\x56\x88\x89\x72\x7a\x1c\x71\x7b\xc8\x5d\xa1\xdc\x14\x4e\xcf\x4d\x1b\x85\xeb\x57\xa7\x9e\x27\x7e\xf2\x64\xda\x35\x7a\x8a\xb3\xf8\xf9\x23\xdf\xb4\x6b\xb1\x7c\xfc\x53\x3f\x36\x59\xa4\x2f\x86\xa6\xfd\xf0\xfe\xb9\x54\xf0\x9b\xfd\x42\x9e\xfd\x3f\xcc\x87\xd1\x90\x43\x30\xe4\x30\x1c\x72\xf0\x87\x5c\xdd\x99\x79\xfe\x62\xda\x35\x2f\x69\xcb\x73\xb2\x25\x97\x95\x2f\x2f\xf4\xce\xc3\x1b\x54\xe3\xf5\xae\x7a\x39\x21\xe7\xaa\x37\xe6\x25\xae\x23\x1a\x1b\x37\xb5\xd8\xe6\xda\x59\xe5\xa4\xa7\x43\xea\xa4\xec\xd1\x92\x73\x37\xe9\xa7\x87\x16\x82\x03\x2f\x79\x18\xdb\xf2\x54\xe0\xc3\x98\x5c\x40\x35\x38\x16\x41\x15\x25\x9f\x36\x8d\xc6\x4d\x6d\x77\xd9\x57\xe8\xc3\x9d\xf5\x58\x35\x1a\x97\x93\x9a\xa8\xed\xe6\xb7\x39\x56\xdc\xc9\x5d\x4d\xb2\x97\x64\x37\xca\x4e\x32\xe5\xcd\x89\x61\x95\xbf\xbc\x9c\x4b\x2b\x9c\xe3\x17\x0e\x0a\xa8\xee\xd9\x20\x1e\xab\xc8\x50\x7a\x36\x2a\x77\x6a\xf9\x8b\x74\xb2\xea\x25\x24\x10\x2a\x61\xbc\xec\xdd\x55\xbe\xd1\x45\x37\xcd\xe2\xf9\x8f\xec\x81\x06\xd9\x99\xec\xea\x52\xc2\x6c\x53\x0d\x82\x4d\x46\x67\x90\xd7\xbb\x8b\x4d\x94\x8f\x23\x8a\x6f\x28\x03\x1a\xf9\xff\x2b\x5c\x0c\xb8\xd5\x87\x58\xb8\x76\xd8\x03\xb6\x99\xa4\xb5\x93\xab\xaa\xad\x9d\xf9\x04\xcf\x99\x33\x9f\xec\xc5\x84\xf3\xfc\x15\x09\xa7\xf4\xe8\x03\x69\x16\xc2\x14\xa4\x8c\xfa\x36\x87\x73\x8c\x84\xd2\x4b\xe8\x0e\x59\x88\xb9\x62\x77\x2d\xad\x62\xa9\x70\xf5\x0a\xdb\x14\x46\xe3\x35\x94\xaa\x47\xd5\x31\x49\xbc\xca\x51\xf4\x43\x0f\xa2\xba\x83\xfa\xa9\x6f\x71\x7b\x58\xb7\x71\x4a\x16\x5e\x35\xb4\xb9\xa1\x5e\x38\x54\x1a\xdc\x84\x73\x7a\x3c\xe4\xab\x53\xff\x91\xb1\xf7\xbd\xd7\xc6\x06\x79\x6b\x27\xd8\xcc\x83\x2f\x2f\x7d\x4f\xae\x85\x41\xbe\xa9\x0d\x43\x4c\x77\x3a\xe0\x46\x63\xf8\xe1\xc3\xf6\x9f\xe6\x74\x54\x1d\xc2\x36\xb4\x07\x1c\x86\x0f\x2d\xfb\xb1\x3a\x1b\x19\x06\x99\x09\xe7\x48\x69\x0f\xb8\x61\x34\xaa\xae\x29\x48\x69\xaa\xf9\x3c\x70\xc7\xdc\x45\x45\x35\x07\x4c\xd7\x68\xc4\x7d\x5e\x7d\xee\x73\xf2\x03\x06\x7d\xba\x1c\x27\x8d\xda\xbe\xf6\x7a\xf8\x5c\xe5\x80\xf3\x94\xf1\x13\x6f\xf0\xe1\x90\x17\xdc\x1f\x5f\xd3\x1b\xb3\x34\x44\xca\xde\xed\x55\x84\x32\x77\x6c\x73\xb5\x01\x4e\xf1\x8a\x0e\x27\xc2\x21\x2f\x2f\x84\xa6\xe7\xe0\xe8\x17\x27\x55\xfd\x5a\x2f\x2f\x55\xc7\x8c\xbd\xaa\x55\xdb\x9b\x19\x5f\x2d\x7a\xf1\x80\x3c\xd3\xd7\x2d\xe9\xa0\xbe\x61\x9b\x3f\x0a\xd2\xbc\xce\x6b\xc9\xe1\xcb\x8b\x4c\x05\x4a\xa2\xb6\xce\x6b\xfd\x7e\x89\x24\x57\x91\x4e\xe6\x1f\x5b\xaa\xab\x19\x4b\x92\xf2\x54\xd4\xf9\xc3\x21\x8a\x8a\x0c\x9b\x75\x0d\x95\x45\xfb\xab\x24\xd4\x6d\x58\x12\x9e\x75\x5e\x3b\xf2\xb3\x78\x24\x6f\xeb\xbc\x16\x87\x85\xc4\x26\x9e\x98\xd6\x51\x09\xc8\x30\xeb\xe5\x60\x9d\xd7\xee\x6c\x72\x5a\x66\x3f\x70\x1c\xa1\x38\x31\xa9\x79\x5c\x47\xd5\x24\x9c\x9c\x4c\xfe\xf0\x54\xcc\x75\x83\xd7\x6e\x6d\x5e\x78\xf9\xcc\x7e\xbd\x41\x4c\xb1\xfd\xe8\x3d\x8c\xde\x5b\x8e\x37\xfb\xf4\xa6\xca\x4f\x1f\x91\xbc\xa9\x59\x6f\xfa\xed\x3c\x75\x5f\x1b\x1b\xcd\x68\x6d\x17\x53\x33\x2b\x75\xa9\xcb\xdf\xde\x48\xe1\xe1\xd2\xa1\x27\xaa\x2e\xdf\xcc\x61\x72\x88\xf4\x38\x7c\x8b\x7e\xf2\x84\xf4\xee\x9b\xf1\x8f\xfc\xd7\xc6\x69\xf4\xd6\xa3\x38\x9d\x89\xde\xfd\x92\x6f\xbc\x15\x5c\x30\x4d\xf2\xe7\x65\xb6\x68\xe5\xfd\xec\x3c\x56\x7b\xc2\xf8\x8a\xaa\x55\x5d\x78\xe4\x92\xb5\x61\x9b\xf4\x9e\xd1\x57\x5b\x4e\xc4\xa5\x55\x2d\xff\xca\xeb\xd8\x22\x43\xe7\xad\xcc\x59\xaf\x8d\x8b\x9f\xd4\x5e\x48\x95\x77\x67\xbf\xd9\x3c\xcf\x5f\xb0\xf0\x67\xde\xaa\x07\xc3\x7e\x5f\x3e\xb7\x7d\xb6\xee\xcd\xbb\x9b\x7d\x49\x4c\x27\x6f\xa6\x7c\xb3\x4f\xaf\xbc\x0c\x56\x23\xa7\xe6\x6d\x9f\xeb\x97\x30\xa6\x93\x55\x86\x53\x57\xa6\x2e\xc2\x55\xda\xc8\x93\xb4\xdb\xde\x2a\x2d\x39\x5c\xfb\xea\xb8\xd6\x6d\x88\xb6\x1b\xac\xd2\x8e\x7c\x49\x3b\x5e\x72\x72\x15\x29\x91\xa5\x1b\xb7\x70\xef\x2b\x3f\xcf\xa4\x96\xc5\x5f\x3d\xaf\x2a\x5b\xdc\x90\x3b\x6a\x16\x5d\xda\xed\x09\x03\x76\x48\x65\x27\xa5\xdc\x56\x6e\x66\xb8\x49\xbc\x36\x3d\xfb\xdf\x13\x86\x91\xbd\xa5\x82\x7d\xc3\xa8\x3b\x1e\x9d\x5a\xe2\xc6\xeb\x3f\xb9\xdb\xa6\xf7\xe2\x2f\xe4\x1b\x3c\xf3\xb5\x5e\x3e\xb9\xce\x88\x74\xa4\x83\x79\xc9\x9e\xc2\x78\x48\x2c\xf5\xd4\xb5\x63\x3e\x0f\x39\x4e\x75\xf2\xe8\x25\x39\xcd\x34\x1c\x4c\x9c\x5c\xe4\xa7\xea\x39\x30\x5a\x66\x38\xa6\x53\x73\x0b\x04\x03\xb0\x3e\x9c\xbc\x38\x58\x59\xd4\xba\x2d\x7b\xb5\xb6\x43\x95\xf7\xc6\x4d\xad\xf9\x6d\x95\x3c\x3d\x97\x8d\x61\xb7\x57\x69\x8b\xa1\xa4\xdd\x2f\xf5\x49\x2e\xfd\x67\xa2\x2c\xd0\x8e\x2e\x6f\xcf\x4d\xe9\x1d\xeb\xe9\xf7\xd5\x74\x9e\xbf\xa8\x74\x3a\x6b\x7a\xef\x8a\x4e\xa8\x5e\x3c\x69\xdc\xd4\x7a\x6f\x0a\x89\xc5\x90\xc6\xca\x5b\x52\xaa\x36\xa5\xf7\xe2\x82\xe7\xb5\x2d\x64\x7d\xf8\x60\x3d\x34\x51\x83\x8e\x12\x70\x4c\xf9\x88\x03\x07\xdb\x68\x7c\x53\x0f\x0c\x44\x09\xfc\xf0\x9c\xba\x93\x3d\xe7\x60\xbf\xca\xe1\x33\xbb\x5a\x9b\x62\x49\x19\x93\x2f\x52\xad\x2a\x3f\xcb\x7a\x5d\x5d\x63\x64\x2c\x55\x8d\x1f\x3e\x54\xb5\xe6\x0a\x7a\x1d\xa3\x48\x06\x14\x97\x32\xda\x9e\x43\x9d\x29\x6f\x0e\x1d\xc2\xea\x34\x4d\xdb\x70\xcc\x02\x59\xfa\xce\x73\x6a\x91\x4d\x2f\x9d\xd1\x5a\x9b\xd7\xdf\xed\x34\x9c\xaf\x76\xc6\x54\xcf\x33\x20\xad\x73\x36\xea\xbe\x7a\x85\xa5\xb6\x7a\xaf\x76\x69\xe1\x1b\x2b\xa7\xcb\x57\xbb\xb5\xfb\xbe\x91\xd1\x6a\xf7\xfd\x6a\x16\xc3\xb4\x1b\xb1\x56\x46\xb4\x73\x55\x5c\x3a\x58\x0d\xc7\x6c\x6a\x67\xb5\x0e\x56\x81\xbc\x78\xdc\x9d\x54\x7f\xd8\x7a\xdb\xa2\x9e\xab\x9d\xb9\xaa\x60\x65\xaa\x82\x23\xa7\x6e\xdd\x27\x8c\x25\xcb\x94\x5a\x0f\x69\xfb\x94\x06\x05\x1d\xde\xb2\xc9\x81\xbb\x23\x57\xd6\x0e\x65\x81\x2a\x58\x2a\x1a\xb2\xbd\xf7\x97\x7a\xfe\x50\x95\x77\x31\x54\x77\x1a\x16\x43\xe9\xda\x54\x67\xc1\x54\xea\x88\x02\xbf\x3e\xf0\xc7\xfa\x83\x02\x40\x3d\x35\x19\x2f\xbf\xae\xe1\xf5\xab\x16\xb9\x14\xcf\x7a\x68\x6d\xf1\xad\x2a\x1f\xf0\xf9\xf6\x99\x34\xee\x24\xad\xb9\x6d\xf9\xe0\xd9\x52\x27\x15\x79\x27\x5d\x79\x73\xc4\x79\x35\xf4\x25\x47\x2f\xa9\xcd\xae\x30\x01\xad\x01\xe6\x97\xbc\xb4\x02\x98\x90\x71\xa2\xa1\x0f\xc0\x35\xee\xab\x0f\x27\x09\x5c\xd0\x97\xae\x92\x82\x3b\x8c\x6c\x4d\x70\x30\xae\x5a\xe0\x94\xb6\xd7\x1d\xd3\x3c\x49\xc8\x73\xb9\x5a\x8d\x63\x2f\x96\x0e\xd9\x9d\x77\x44\x72\xde\x99\x57\xc9\xcb\xcb\x3b\x54\x27\xb1\xae\xc9\xc7\x60\xcb\x96\x00\xb9\x4e\x37\xa8\x90\x1c\x1c\xe9\x4c\xd3\x56\xef\x54\xe1\x32\x71\xd2\x33\xed\xd7\x8d\x1b\x5c\xd2\xbc\x75\x5d\x9f\x2c\x49\x58\xa5\x46\xa1\xd4\x85\x87\xab\x73\xff\xbf\xfd\xbe\x61\xe9\x35\x52\x12\xe7\x6b\x24\x4b\xad\x91\xac\x75\x6b\x24\xd9\x98\x9d\xaa\x05\xef\xb6\x8d\xa5\x77\xff\x5a\xb4\x29\x26\x9f\x7c\xa0\x2e\x5c\xaf\x04\xa1\x3c\x6d\x92\x3d\x53\x48\x0b\xc2\xc6\x4d\x6d\xd1\x59\x2b\x4a\x22\xaf\x6a\x19\x5f\xad\xfa\xbb\x1d\x75\x0f\x3f\x55\xfe\x60\x51\x69\x3e\x37\xb4\xdf\xe7\x23\xbf\x21\x3e\x7c\xb0\x3f\x7c\x70\x6a\xbb\xf4\x6c\x53\x55\x9d\xe4\x40\xbd\xd6\x40\xf4\xd1\x90\xde\x52\xa4\xe7\x11\x4a\xfe\x07\xaf\x26\xd2\x95\x30\x89\x8b\xd8\xab\x52\x48\x0e\x5f\x1d\xac\xca\x67\xe9\x49\x64\x34\xa8\xfd\xa4\x1d\x2d\xbf\xc5\x26\xed\x58\x43\xaf\x8a\x4d\x82\x6b\xa2\x7b\x0a\x95\xa6\xce\xe3\xb1\xdc\x0d\xe1\xda\x3c\xa0\x8e\x2b\x3c\x0f\xb9\x29\x0f\x1a\xff\x70\x45\x5a\x27\x7b\x02\xea\xc9\x90\x68\xa8\x26\xc2\x57\x69\xaa\xca\x39\x6a\x96\x5d\x60\x98\x4e\x5e\xa1\xb8\xde\x28\xf0\x5d\xf6\x0a\x7c\xb7\xbd\xd7\x4c\x58\x14\x78\x86\x4e\xce\xf3\xb0\x78\x7e\x7c\x55\xab\x8c\x42\x86\x0e\x4b\x19\x6a\xd9\xaf\x4b\xcb\x98\x42\x6a\x9d\xe2\x17\xcf\xbc\xd7\x82\xa8\x2a\x70\x5d\xf3\x02\xd7\xfe\xe0\x75\x65\x9d\x52\xe0\xed\x16\x53\xdc\x0d\x5e\xd5\xb2\xa5\xc0\x11\x87\x05\x8e\xa3\xe1\xab\x14\x84\x05\x86\x5e\x31\x09\xbb\x5d\xb4\xd2\x75\xa9\x07\x5c\xe6\xd7\x3a\xfb\xea\x66\x67\x77\x02\x97\x13\xa3\x71\x63\x76\x27\xd2\x6d\xaa\x2b\x4c\x55\xa9\xbf\xe1\xba\xe2\x5c\x41\xf7\x13\x8e\xd3\xaf\x63\xea\xc6\x40\xed\xd1\x32\x75\x3b\x35\x6e\x6a\xce\xbd\xa9\x5b\x12\xe5\xa8\xad\x40\x6c\xe6\xc2\x9b\x08\xcb\xf9\x18\x0d\xb8\xcc\x48\x4f\x67\xa4\xa7\x33\xd2\x2d\x66\xe4\x64\xc2\x8b\x9f\x4e\x32\x90\xbe\x7d\x9c\x81\x22\xc4\xa5\x88\x06\xcb\x1f\xbf\xce\x8f\x16\x0d\x44\xe6\x04\x48\x98\x3f\x5e\x5f\xef\xaa\xd7\xd2\xd8\x85\xbd\x35\x1d\xd2\xbb\xdd\x37\xe6\xb5\xca\xca\x68\xcd\xf9\x77\xa5\x7b\xdc\x4c\x0a\x87\xb9\xca\x5b\x34\xb7\x13\xcd\x0d\xc2\xf8\x71\x93\x43\xef\x76\x40\x14\x46\x56\x81\x22\xa0\x5f\x38\x33\x86\x9a\xd6\x90\x3f\x6c\x3f\x9a\xf6\xc3\xd0\xc6\x19\x0a\x6c\x33\x1d\x16\xce\x67\x4a\x0f\x8d\x64\xaf\x76\xf5\x5e\xd7\xd0\x3c\x49\xc9\x68\xed\x3e\x82\xf3\xf2\xc2\x1f\x82\xe7\x47\x10\x2f\x2f\xef\x76\xa0\x8f\x72\x77\x20\x5e\x5e\xd4\x85\xdd\xa1\xf2\x0c\xcf\x6b\x81\x78\x18\xd6\x86\x62\xfe\x68\x66\x67\xc5\xf9\xeb\x4d\xad\xd9\x7a\xbb\xe4\xe3\x21\x5f\x2e\x7a\x6e\x62\x18\x0f\x79\xb9\x50\x2b\xa6\xf6\xa5\xac\x67\x11\x28\xdb\x14\x47\x9a\xb5\x2c\xf3\x3c\x95\x17\x0c\xb2\xb2\xac\x94\xc3\xca\xdd\x9f\x50\x51\x2c\x59\x14\xab\x58\x94\xc9\xea\x25\x06\x6c\x96\xec\xa9\x7c\x9d\x2f\x75\x29\x58\x7b\xd6\xa4\x3e\x32\x91\x07\x35\xfb\x8f\x2a\x96\x9c\x03\x6c\xfd\x5e\x80\xcc\x95\xa9\x5d\xb4\x0d\x54\x00\x6c\xf3\x34\xad\xda\x38\xa9\xbf\x7b\xe7\x80\x65\xee\xa5\x74\x98\xad\x76\x7d\x5c\xd5\xdf\xaf\xf3\xaf\x55\x6e\x9e\x21\x61\x99\x22\x37\xff\x70\x3a\xb5\x3e\x7c\xa8\x5e\x92\x33\x70\xb5\x84\x51\x1d\x57\x95\xb3\xe4\x34\x8e\xde\x3a\x2e\x19\x03\xf4\xa1\xb8\x40\xc0\x65\x6a\x14\x3b\xfd\xb2\xad\xf5\xba\x6c\x60\x55\x86\x77\x9b\x3c\xb6\x1f\xae\xbc\x14\xa3\x26\xc0\xbd\x89\x08\xd2\x43\xf9\xe2\x4c\x4d\xbe\x3c\x43\x28\x32\x60\x7a\xa3\xc8\x17\x23\x11\xa4\xc2\xc1\x39\xb0\xb0\x76\xbf\xcb\xc7\x62\xe6\x8f\xeb\x80\x66\xbf\xeb\x49\xe6\xad\xe7\x4e\x1b\xa0\xef\xd4\x40\x7c\xcb\x34\x7c\xf7\x4f\xa6\x61\x99\x3e\x15\x06\xe7\x39\x09\x1a\x8d\x81\xaf\xea\x46\x9a\xd5\xde\x7e\x40\x2c\xc0\xca\xe2\x8e\x43\x45\x3b\xf1\x92\x54\x04\x22\x5e\xdb\xa1\xc4\x57\x25\x12\x6a\x07\x90\xa3\xeb\x3a\x03\xd5\x7c\xb4\x2c\xbf\xe3\xf4\x6a\xbc\x61\x69\xa0\x65\x68\x56\x73\xf7\xc5\x9a\x2b\xbc\x98\xb6\x67\xaf\xbe\x98\x16\xe8\xe7\x7e\x6c\x94\x68\xaf\x77\xd5\x7b\x5d\xa3\xf7\xff\x50\xa3\xf7\xff\x54\xa3\x13\x35\xfc\x95\x41\x32\xdb\x17\xb0\x9b\x3a\x64\xe9\xc0\xad\xad\x43\xe1\x91\x0e\xbd\xbf\xcb\x70\x3a\x70\x38\xd6\xa1\xb7\x8d\x5d\x73\x5a\x55\xfe\xd4\x5a\x73\x53\x0b\x9e\x56\xc9\xb2\xbb\xef\xf9\xe6\x5a\x1b\x93\x15\x56\x2d\xb8\x4f\xe0\x87\x7c\x20\x2a\x5a\x67\x5e\xa5\xf5\xe5\x8d\xb3\xc6\x56\x83\xb5\x2b\x57\xd4\x57\x6f\xe5\x6b\x66\x13\x83\xfb\x5c\xb6\xfb\x6d\xfc\xd4\xb4\xf4\x75\x3f\xac\xea\x37\x41\x43\x43\xbd\xdc\xb8\xfc\xfe\x57\xf1\xfd\x93\x39\xd7\x43\xc9\x6e\xaa\xad\x38\x82\xde\xdf\xa9\x27\xd1\x0a\x6f\xf4\xd1\xef\x7e\x13\x74\x1b\xe2\xd2\xa7\xb9\xf4\x1c\x83\x4a\x34\x33\x2b\xa8\xc4\x28\x29\x94\xbb\xfa\x99\xf1\xb0\xb0\x9f\xd1\x0a\x83\x34\x0e\xfd\x0a\x69\x57\xf9\x13\x54\x41\x25\xb4\x9e\x84\x9d\x66\x27\xac\x0f\xc7\xea\xbd\xdc\xb1\x12\x9b\xa1\xde\x6a\xd3\xd7\x1f\x54\x41\x54\x4f\x7e\xaa\x1a\xf8\x5d\xfd\x78\xb9\xfb\xac\x73\xa7\x5e\xe2\x02\x95\x93\x46\xd6\x31\xd5\xcb\x61\xdd\xec\xf4\xfc\x93\xa7\x98\xa3\x24\x5f\x7e\xdb\x66\x95\xe3\x6a\x1e\x05\x30\x7e\x59\xbf\x15\x24\xab\x3b\xf7\xdb\x7a\xbb\x66\x7d\xdf\xf3\xe8\xa1\x32\x1e\xd8\x22\x2b\x57\x78\x84\x6b\x24\x15\x05\xde\x67\x6f\x50\x1d\x0f\x79\xe9\x29\x8c\x5b\x3b\x7f\x4d\x2c\x94\xd9\xda\xf3\x97\xca\xa4\x79\x55\xcd\xdf\xda\x72\xa1\x9a\xad\x07\x4f\xb2\xdd\xee\xc2\xd4\x3b\x91\x8a\x3a\xaf\x85\x47\x1f\x3e\x54\x51\x23\xaf\x85\x47\x06\xa0\x76\x4f\x01\xae\x47\xa1\xd4\xf8\xb1\x60\x64\xa4\x96\x83\x6f\xe0\x57\x39\x8a\xc3\x1b\xcc\xf0\x3a\xd3\xd2\xfa\x9c\x5c\xe9\x87\x96\x93\xb4\xd8\x87\x96\xfb\x5b\x4f\xbd\x16\x28\x6d\x3d\x09\x5f\x16\x3e\xb5\xc3\xb1\x36\x2f\xbd\xbf\xd3\xfd\x43\x77\xd5\xf2\x1a\xf6\x7d\xe6\x63\x2d\x1e\x94\x1e\xf2\x79\x4a\x4b\xe0\x42\xbf\x25\x94\x2b\x5c\xd3\xdc\xb6\x38\xcb\x82\xf4\x90\x6f\x3c\xa0\x0b\x92\x7c\x4a\xaf\x57\x60\x5d\xe5\x18\xdb\x00\xdb\x80\xb9\xba\xc2\xc9\x6b\x4f\xa9\x84\x6c\xb0\x80\xd7\x16\x13\xc3\x78\xbd\x31\xdf\x93\x58\x5d\x3b\xfb\xc4\x03\x25\x5a\x55\x2e\x8b\xd0\x62\x22\xa1\x57\xe3\xad\x57\xb5\x74\x12\x8e\x23\xd9\x6e\x6a\xe3\xcf\xa5\xda\x8b\xe7\x9a\x75\xa1\x07\x00\xbc\xdb\x56\xbb\x4e\xbc\x70\x95\xe2\xe7\xcf\x7c\xc5\x03\x7a\x03\x84\xda\xe7\x4d\x29\x1c\x0f\xe8\x95\x95\xd7\x37\x1f\xea\xd2\x5c\x56\x1f\x6b\x8e\xd3\xae\x55\xde\x43\xf3\x4a\xff\x61\x99\x54\xd7\xb9\xe3\xb8\xa7\x14\x23\x59\xe4\x1d\xe4\x29\x55\x8f\xa0\x3c\x5c\xd9\x8f\xb2\x09\x0a\x6a\xb3\x35\xcd\x4c\x29\xef\x38\x71\x58\xe5\xb7\x84\xf5\xee\xd6\x42\x3e\xe9\x41\x1f\xca\xb7\x61\xbe\xde\x38\x7c\xfd\xcb\x2a\x3a\xf3\x14\xc9\x78\x05\xae\x24\xef\x4d\xed\xb6\xff\xd6\x55\x06\x99\x43\x03\x95\x39\xd5\xbc\xfa\x9b\xdc\x30\x0c\xfa\x16\xff\x37\xdf\xa2\x76\xcb\x55\xbf\x42\x7f\xb7\xa7\xfa\x24\x4d\xd6\x0d\x54\x69\x1f\x1e\x1b\xd9\x0d\x88\xe7\x61\x15\xeb\xad\x38\x3d\xe8\xa7\x32\x17\xf4\x9a\x8f\xa3\x1f\xb0\x2e\x7e\xd9\x31\xa8\x98\xda\x29\xc0\x5a\xff\x9d\x72\xb5\x5c\x69\x37\x0f\x2a\x03\x2e\xb7\xa7\xe3\x30\x4c\xe9\xaa\x7a\x35\x31\x6a\x2c\xbf\x3b\x5c\x38\xfd\xb2\x18\x2e\xf9\xb6\x6f\x22\x02\x47\x0b\xa8\x1b\x97\x5d\xaf\x4a\x45\x5b\x7b\x8d\x62\xaa\x1a\xa0\xb1\x2d\x8f\x9c\x15\x5f\xda\x90\xf7\xd6\x1b\x7d\x49\x29\x78\xc1\x77\x1e\xfa\x8f\xd2\x82\xc4\x75\x01\x5d\xe5\x60\x6b\x68\x66\xbd\xca\xa5\x2d\xdf\xe7\x61\x75\x58\xfa\xb2\xa5\x9a\x82\x9e\x6f\x71\xe9\x1c\x8c\x84\xa9\xc6\x3f\x7c\xa8\x5a\x44\xe1\x06\x08\xfd\xc2\x91\xf1\xea\x98\xe2\xd5\xeb\x57\x71\x31\xf3\xce\xe4\x7a\x0c\xe5\x75\x68\xcf\x6d\x5f\x54\x1c\x91\x92\x67\x2d\xd4\x84\x97\x0f\x4b\x14\xbb\x12\x7d\x89\xe6\xa2\xf7\x93\xfa\x7b\xb9\xe6\xed\xe6\x7b\x04\xf6\x54\x8e\x6e\x29\x05\xa6\xdd\x35\x46\x31\x19\x57\x35\x67\xf6\x42\x2f\x36\xab\x6e\xa2\xc6\xd2\xf3\x22\x05\x1e\x3a\x12\xb4\x9b\x2d\xee\x32\x8a\xfd\x08\x56\xa1\x8d\x0b\xe3\x79\x77\xb8\xf4\x9c\x0e\xaf\xdd\xe2\x18\x6e\x38\x54\xc1\x4e\xa9\x82\xa7\x5a\x64\x1a\x8d\xfc\x23\xe4\x57\x95\x17\x06\x37\xb5\xbc\x36\xf1\xa9\x97\x2f\xb3\x6f\x9b\xe6\xd3\xe0\xc3\x07\xfe\xf2\x62\x99\xe6\xa9\xfb\xd5\x1b\x6c\xa6\x5e\x95\x1b\x75\xeb\x61\x60\x3f\x56\xb7\x61\xc7\xd8\x2c\x1c\xc0\x9c\x2f\xe7\xce\x2e\x0c\xcd\x86\x43\xfb\xdc\xf2\xf1\x39\xb0\xb5\xac\xe7\x06\x38\x48\xa4\x07\x94\xa4\xe0\xc8\x13\x6c\xfd\x3c\x41\xd9\x3f\xa4\xb0\x71\x74\xb7\xb1\x35\x96\x17\x53\x6a\x6b\x3b\xac\x12\xce\x5a\xfc\xc9\xd8\xe4\x89\x48\x8e\xda\xe5\x2c\x34\x8b\x87\xca\xd4\x6c\x87\x43\x7f\x69\xdc\x5b\x54\x1e\x07\xf8\xc3\x2e\x99\x0f\x5e\x8b\xed\x97\x25\xe6\x4c\xb3\xe9\x7d\x3e\xd0\x7d\x47\x2a\x41\xdd\xc2\x21\xa3\xde\x71\xf6\x3c\xdb\xd2\x52\x43\xaf\x40\x9a\x81\x76\x76\xea\x4c\xd5\x32\xc3\x99\xfe\x7c\x99\xe1\x4c\xff\x61\x99\xa1\x5e\x45\xeb\x1d\xaf\xb3\x33\xae\x64\x4c\xe5\x40\xbd\xc3\x35\xc8\x26\xd5\xa5\x8d\xa1\xec\x2d\x6c\xda\x06\xc2\xe5\xed\xd1\xea\xf6\xb3\xd7\xaf\xee\x51\x35\x1b\x5e\xbf\xba\x4f\xa7\x11\xb3\xd7\xc2\x3c\x75\xdd\x30\xf5\xaa\x96\x21\x2f\x9a\xca\x33\x1d\xa7\xae\x3e\x8e\x63\x67\x99\x9a\x0f\xd4\xec\xf0\xf2\x22\xa5\x92\x51\xc2\x5b\x1a\x6f\x19\x8d\xa9\xde\x0f\x9d\x0f\x68\x43\x54\x1f\xe0\x95\xa8\xda\xf8\x73\xd5\xf8\xea\x98\x99\xdf\xd1\xe0\xb9\x6a\x0d\xc8\x5d\xd6\x3b\xe9\x3a\xca\x21\x33\xc6\xd2\x29\x46\x55\x49\xf8\x89\x83\x71\xd5\x7e\x70\x1e\x51\x5d\x53\x6a\x69\x57\x1b\xc1\xe9\x90\xa3\x36\x76\x97\xb9\x4f\x32\xee\xce\xbf\xe0\x8e\x32\xee\xab\x25\x6e\x6d\x36\xd1\x25\x9c\x91\x28\xc0\x72\x7e\xf8\x50\xcd\x46\x15\x29\x56\x2d\x52\xb3\x38\xd8\x34\x55\xb4\x25\x23\x8e\x23\x9c\xfc\xf2\xa1\xa4\x28\xd6\x12\xc5\x32\x0c\xe3\xb5\xb0\x0d\x82\xf5\xb4\x99\xea\xa6\xc9\x70\x7c\x73\x63\xe2\x52\x3f\x5a\x39\x2d\x86\xf3\xac\xf6\x92\x3c\xd7\xd3\xed\x0f\x3d\x28\xe4\xee\x7a\xde\xe5\xc4\xb4\x22\x94\x54\x6e\x70\x53\x09\xe8\xda\x7c\x50\xbc\x48\xbd\xdd\xb0\xe4\x7b\x2d\xd6\xe6\xa6\xc1\x1f\xac\xc7\xda\xfe\x40\xb5\x62\x37\x4b\xea\x61\x4e\x96\xfb\xe2\x72\x7f\xbf\xe4\x1f\xab\xf0\x2e\x16\x2e\x1f\xf4\xcb\x58\x89\x48\xb3\x27\xbe\x0b\x62\x62\xaf\x14\x57\xa6\xa4\x62\xb8\x22\x55\x2b\x35\xd4\xf5\xbb\xf1\x1a\x5d\xbf\x19\x98\xea\x57\x5e\x49\xcf\x8a\x78\xa0\x7b\x69\x93\x1e\x5e\xc5\xa5\x63\x27\x5e\xb3\x39\x23\x1d\x8f\xaa\x41\x84\xaa\x5e\xcd\xed\xaa\x43\xe9\xb6\x74\x08\x47\x0f\xc6\x51\x6d\xd3\x49\x23\x1e\x45\xfe\xfc\x3c\x12\x31\x4f\xc3\xd8\x30\xd2\xfa\x0f\x4b\x77\x96\x86\x6d\x5a\xb5\x69\xb7\x78\x39\x1d\x05\x2f\xaa\xa1\xb0\x74\x26\x5d\xbf\x8a\xf9\x20\xe8\x42\x78\xff\x9d\xc9\x3f\x7c\xb0\xa6\xa8\xec\x19\x34\x43\x5b\x53\x7a\x3e\x89\xb6\xe9\xad\xe2\x71\xf5\x57\xcb\x7c\xb7\xad\x7d\xfc\xd3\x66\x55\xc7\x7e\x24\x5f\xe4\x48\xb1\x5f\xd5\xcb\xd8\xd4\x75\xc6\x2e\xd7\x0f\xed\xbd\x55\x51\x50\xae\x28\xf9\x94\xd4\xfa\x9a\x56\xfb\xa8\xcd\x40\x9b\xd0\xe2\x38\x8c\xcb\x9b\x38\x87\x7a\xb2\xb0\xbe\xd2\x56\x99\x5e\xfc\xd5\x39\x66\xe8\x3d\xf6\x6e\x9e\x89\xe0\x7c\x72\x3e\xd2\xd1\xa4\x47\x2b\xab\xa8\x05\x3c\x6c\x3f\x16\x14\x01\xba\x25\xee\x98\x4f\x4f\x74\x29\x41\xf9\x81\x4e\x86\xd5\x6f\x94\x82\xf3\xb0\xfd\x68\x18\xd0\x37\x77\x94\xca\xa5\x2e\xcf\x9e\x2d\x32\x86\x3e\x32\xbc\x13\x6a\xb4\x90\x4a\xd6\xc8\xcd\xaa\x0f\x8f\xa0\x6c\xbe\x74\x37\xc3\xdd\xdc\x34\x04\x09\xc0\xe3\xa1\xf4\x22\xe5\xe2\x94\xd7\x47\x51\xe2\x1a\x8d\xec\xeb\x27\x85\xaf\x2b\x2f\x42\x3b\x0d\x77\x29\x07\x9a\xc9\x2d\xe7\x00\xbf\x21\x5d\xf7\xe4\xcf\x19\xd1\xb9\xfd\xc2\xd7\x4f\x8b\x5f\x77\xd4\xd7\xb3\x8b\x33\xb6\xd1\xb0\x6b\x37\x41\xb5\xaf\x2e\xd0\x38\xeb\xae\xbb\x7c\xd3\x55\xbc\xe4\x4c\x84\xae\xb7\x50\x61\x0b\x57\x5c\x8e\x95\x9c\x2b\xde\x72\xd1\xdb\x9d\x59\xd2\x79\xf3\x1d\xe7\xca\x86\x7c\x1f\x86\xbc\x1c\x05\xdd\x86\x81\x03\x62\x3c\xc2\x65\xa9\x65\xca\x2d\xde\x35\x59\x3b\xf9\x69\xd6\x0e\xcb\x59\x3b\xfd\x37\x59\xcb\x92\x3e\x7d\x23\x67\x1f\x3e\x6c\x91\x73\x2b\x99\xc3\xe9\x41\x29\x87\x5b\x3b\xd2\x43\xa4\xad\x2c\x10\xab\xc9\x8a\x5c\x1b\x99\x26\xda\x9c\x35\x1f\x98\x1c\xe5\x30\xa9\x31\x12\xb5\xfb\x4c\xd7\x71\xb4\x7c\x20\x49\xf0\x96\xb8\x55\x11\x1e\x52\x12\x9b\x8f\xc6\xa3\x79\x92\xbc\x1e\xf3\xaa\x98\x2e\xbf\x5a\x4e\x98\xda\x85\xe0\xb9\xbe\xcd\x7f\x9e\xec\xa8\x2f\xd3\x2c\xad\x70\x0f\x0a\x83\x8e\xe7\x13\x7d\xe6\x0c\x99\xab\xdc\x58\xc6\xa3\xba\xc8\x71\x9c\xd4\x0b\x37\x38\xa2\x12\x14\x26\xf5\x42\x04\xf3\x24\x69\x9c\xa9\xf4\x8b\xb7\x3e\x4e\x90\xeb\x42\xd0\xf5\xf4\x25\x7a\xe6\x26\x19\x13\x78\x3d\x27\x81\xfc\xfa\x2a\xcb\x5a\x90\x37\x6b\xdd\xe1\x65\xda\x4b\x96\xf9\x62\x6d\x16\xf3\xaf\x73\xb1\xbe\x04\xe5\x58\x66\x94\x14\xda\x8e\xe4\xfa\x72\x0b\xee\xfc\xbc\x05\xa3\x64\xb5\x70\x5c\x16\x4e\xaa\x92\xc5\x15\xca\x79\x51\x5f\xde\x6e\xdc\x3e\x51\x0b\xac\xcc\xf8\xa6\x19\x25\xf4\xd6\x52\xe6\xcb\xfa\x9d\x79\x92\xac\xf1\x37\x4b\xba\x08\x09\xe4\xda\x34\x21\xef\xe9\xc6\x6b\xd6\x75\xde\xf0\x41\xbb\xb2\x92\x23\x25\x4f\x2f\xaf\x70\x3d\x6c\xc9\xe9\x6c\x49\x7d\xd3\xcf\x34\x42\x9f\x1e\x64\x24\x8b\xa4\x14\x5d\x7d\xe3\xe5\x45\xe4\x2b\x84\xbe\x3e\x15\x2e\xeb\x89\x94\xae\x47\xf3\x38\x79\x7d\x6d\xc8\xbc\x8d\xfa\xab\x53\x4f\xde\x22\x61\xa2\xcc\x08\xf2\x24\x44\x41\x07\x27\x55\xa3\x6a\xbc\x6a\xbd\xae\xd0\x65\xb2\x43\x12\x8d\x9b\x94\xde\xc7\xcc\xeb\xfc\x6c\xf9\x94\xf1\x7c\xa0\x96\x85\x38\xf5\x67\x8f\xc2\x4a\x9d\xc0\xa9\xdd\x38\xfc\xc3\x07\xfa\x41\xa1\xbb\x46\x8d\x55\xf5\x40\x3a\x66\xbf\x91\xd6\x7f\xf4\x4d\x2e\x0f\x73\xe3\x84\xde\xc7\xda\x94\x27\xf0\xdc\x6c\x2f\x6f\x68\x6e\x37\x86\x7f\xba\x98\xc2\x50\xde\xce\xea\xab\x02\xbb\x0f\xc3\x47\xe3\x91\x5a\xf7\x47\xbf\xa8\x02\xf4\x51\x03\x90\x87\xcb\x2f\xa8\x00\xc2\x00\x81\xaa\x5a\xdf\x00\x8e\x83\x5d\xa0\x6a\x59\xb8\xde\x57\x2e\x65\xd7\xab\x5a\x53\x1a\xf2\x60\x19\x4b\xf7\x0f\x94\xfa\x23\x95\x1d\x12\x30\xb9\x83\x36\x84\x70\x15\xc4\x0b\x6b\xb4\x23\xdd\xbf\xec\x92\x27\x89\xe9\xea\xc6\xd9\x54\xbe\xa6\x4b\x0b\xb9\x6c\x7b\x6b\xf1\x5d\x1b\x17\xbf\x67\x16\xe9\x69\x52\x50\xe6\xf7\x6c\xa5\x9e\x9f\x24\x46\x1e\x6d\xae\xa3\xcd\x4b\xd1\xa2\xd5\x68\x51\x62\x18\xaf\x77\xd5\xbe\x5e\xeb\xf5\xff\x61\xad\x57\xcc\x58\xf1\x6b\x3a\x3c\x4d\x8c\x46\xff\x9f\xd6\x83\xc7\xe3\x3c\x11\x1d\xce\xb2\x3c\x4d\xb2\x15\xdf\x9a\x05\xdd\x30\xbb\x6b\xfb\xc0\x1f\x8d\x06\x6d\xfb\xd2\x35\xc4\xa5\x17\xf9\xc9\x20\xa2\x0d\x21\x6b\xde\x4e\xcd\xd6\x54\xd3\xe4\x81\xa3\x68\x24\xd3\x08\x5d\x62\x28\x6e\xc4\xae\x59\x55\xe8\x58\x38\x9c\xf8\xbf\xd8\x72\xdc\xb8\xc1\xda\x5e\xda\xb2\xd2\x26\x77\x0e\x96\xba\x3d\x56\x7c\x76\x6d\xba\x74\xbe\x22\xa0\xf3\x15\x0d\x2e\x8f\x84\x36\x42\xb9\x7e\xa8\x72\x73\x3f\xcc\xcf\xf8\x2d\x9e\x4d\x5e\x9b\xc6\x3c\x8a\x44\x9c\x14\x6f\x19\xcd\xdb\x26\xaf\x59\x5e\xe0\x78\x81\x5b\x22\x4c\x27\x55\x5e\x73\xf4\x35\xeb\xee\x3c\x12\x2f\x2f\x17\xa8\x82\x0e\xa6\xd9\xee\xad\x3b\x55\x27\x3a\x5c\xd5\x31\x56\x8e\x52\xe6\xc6\xcd\xc2\x32\xa5\xff\xc0\x1f\x5f\x55\x9f\x90\xc7\x91\xb8\xda\xe6\x2c\xbc\x80\x27\xa6\x72\x20\xe8\xc3\x51\xf3\xf6\xcb\x0b\x19\x04\x55\x79\xc0\x35\xc5\xc3\xb7\x47\x50\x12\x80\x86\x3f\x0d\x51\x1f\x87\xa8\x78\x18\x3e\xd2\x4d\xb4\x38\xf4\x71\x78\x41\x90\x61\x23\x1e\xa7\x9e\xed\x45\x3c\x48\xe9\xec\xa2\x43\x4d\xec\x43\x60\xbc\xea\xb3\x99\x8e\xd1\x70\xb1\x9b\xce\xae\x72\x4f\xe7\x74\x78\x79\xe9\x60\x3f\x6d\xc2\xe8\x5a\xd5\x19\xfb\xda\xd5\xe7\x09\x9f\xd7\x3b\x8e\x19\xcb\xe7\xde\xeb\xd9\xf5\x01\x5d\xfd\x79\x41\x25\x89\xba\xc7\xfb\x75\x67\xc7\xb1\x39\x55\x63\x65\xcd\xd1\xb8\xa9\xcd\xdf\x3e\x4a\xbe\x78\xa6\x53\xdd\xeb\x12\xc3\x2e\xb0\x26\xb1\xe0\xed\xc4\xe6\x6d\x64\x18\x67\x47\x72\xe8\xfc\xce\x45\xf9\x84\xce\x64\xfd\x09\x9d\xc1\xb4\x78\x57\x72\xf1\x9c\x5f\x79\xa4\x47\x8b\xe4\x49\x8d\x1f\xd9\x71\xc5\xce\x53\xe9\x52\x3e\x59\xd2\x50\xb4\x8e\xe9\x88\x61\x95\x9b\x9e\xb4\xc9\xf1\x9a\x08\xe9\xe9\x7b\x69\x7e\x21\x8b\xb2\x65\xda\xaf\xda\x5a\x39\x6f\x37\x9e\xa6\xb4\xe9\xf0\x34\x25\x0b\x79\x15\x3f\x4e\xc2\x1c\x85\xfe\x0e\x70\x14\xfe\xf3\x36\x62\x1c\xe0\xb5\x6e\xc2\x69\x3d\x77\x53\x1b\xed\x94\x77\x04\xd6\x7f\x7d\x7f\x90\x5d\x0f\x3d\xf3\xaa\x25\xcd\x97\x53\x33\x76\x93\x75\x67\x1b\x79\xa1\x8f\x9a\xbc\xd4\x35\xb1\x62\x28\xcb\x2f\x2f\x4f\xb4\x2f\x92\xd9\x9a\x3d\x65\xaf\x57\xdd\xa6\x5e\x61\x9b\x54\x5a\x2a\x0c\xb5\x4f\xdf\x55\x9b\x70\x0d\x9a\xaf\xec\x65\xac\xda\x30\xd7\xdf\xae\x5b\x50\xfc\x32\x79\x3c\xbc\x41\xf6\x75\x39\x06\xdb\xfc\xf4\x7f\x7e\xd4\xfe\xf7\xf5\xfd\xa7\x86\x7c\x10\x1e\x45\xae\x92\x3a\xf6\xc3\xc0\x79\x2c\x3c\x2d\x4a\x2b\x6c\x55\x5b\x16\xd6\x96\x95\x1d\xb6\x7c\x96\x06\xb1\x0c\xfa\xf6\xb8\xb5\xd3\xe0\xe6\x65\xb6\xb7\xcb\xcd\x26\x1d\x9b\xdc\xda\xa9\x5f\x7a\x52\xd7\xf5\xfa\x55\x5c\x5e\xf0\xd5\xbd\x0b\x35\x08\x2b\x74\x02\x51\x3e\x07\xb2\xc6\x83\xc2\x65\xc9\x5a\x42\x4f\xfa\xbe\x35\x48\x9f\xe4\x20\x2d\x78\x3c\x98\x16\xe8\xca\x69\xd5\x53\x95\x1b\x65\xdf\xf1\x43\xbd\x65\x85\xdc\x34\x0b\x58\x85\x34\x08\xfb\xe3\x4d\x49\x9d\x6d\x91\xa9\x86\x41\xa1\x4b\xbb\x04\x74\xa6\xae\xbe\x24\x8e\x89\x42\xb3\x41\x5d\x9d\xb0\x2e\x19\x13\xfc\x69\xd9\x84\x6d\x91\xc3\x53\xba\x21\x7c\x2b\x30\xd4\x37\xad\xda\x15\x97\xa7\x97\x78\xed\xc0\xad\x3a\xd0\x47\xfd\x8a\xd7\x7c\x9b\x57\x1d\xb0\x6a\x7b\x71\x79\x3f\x6e\x34\x2d\xeb\xbb\xdb\xb0\x34\x95\x92\xe7\x6b\xfb\x31\x37\x41\xe7\xe7\x53\x4b\x35\x8f\x11\x72\x5a\xa7\x44\xa3\x8f\x7c\x22\x8e\xc2\x15\xeb\xac\x30\xb9\x4d\x7b\xe5\xb8\x1a\x3d\x4b\x41\xc7\xa9\x6c\x7a\x48\x96\x06\x70\x61\x27\x89\x4e\x3f\x5b\xcb\x4b\x82\x67\xf2\x27\xad\xb6\x7a\xb2\x65\xc1\x00\xb1\xa6\xf9\x34\x28\x8e\x54\x7f\x3c\x0a\x1a\x27\x03\x5e\xf1\x82\x0a\x57\x86\x8c\x07\x0b\xe4\xed\xec\x31\x0a\x0e\x12\x26\xa1\xe3\xf5\x3d\x11\x1b\xf2\xb0\x2b\x7f\x38\x7c\x04\x9f\x5b\xc2\xaf\xf3\x87\x1b\xfb\x11\x3c\xa7\xce\x6b\x9e\xf3\xfa\xa8\x1c\x2b\x5b\x86\x7a\xa0\xf9\x1d\x7f\x42\x0d\xff\x47\x7e\x7e\x2e\xf3\xed\x01\x43\xd3\xad\x1d\x73\x5c\x3b\xf8\xea\x89\x8b\xc0\xdc\x6e\x04\x7f\xfa\x8d\x60\x73\xd3\xb8\xaf\xf6\x4b\xc5\x1a\x3e\xf0\x87\xed\xc7\x47\xf2\x8b\xfd\x6a\x34\xdc\x9a\x1b\x57\x87\x38\xa2\x5c\xaa\x8f\x48\xce\xae\x11\x24\xb2\x4e\x0a\xaf\x5a\x53\x7d\x4e\xb2\x27\x67\x65\x37\x79\x70\x1e\x31\xe7\x2f\x2f\x5c\x75\x18\xd7\x94\x22\x1b\x29\x35\xcf\xf9\xaa\x7e\xeb\x5c\x76\xad\x46\x84\xdd\x49\x3e\xf5\xd6\x48\xb2\x83\xde\x74\x9a\x8e\x3e\x58\xd8\x94\xcd\x2f\x70\xa8\x0a\x86\x0d\xc7\xb4\xca\x9f\xb3\xf5\xe7\xe8\x5b\x2b\x1f\xb2\xb0\x86\xd5\xb1\xf2\x09\xbd\xb1\xb3\x5c\x2a\x6e\xfc\x18\x93\xd7\x37\xf9\x89\x3a\x7f\x35\x0a\xd7\x0a\x26\xf2\x65\xe3\xb1\x01\x0b\xec\x28\xbb\xe6\x76\x63\x57\x2e\x4a\x76\x37\x37\x8d\x05\xb5\xb2\x52\x1f\x25\x6d\xa2\x69\x3f\xca\x45\xc1\xfe\xb9\x78\xb0\xe9\xe9\x69\x72\xfd\x31\x79\xd8\x7d\x04\x5d\x30\xda\x9c\x71\x4d\xf9\x52\xb0\x4c\x64\x6b\xc7\x90\x66\xab\x77\xdb\xe0\x9b\xdb\x0d\xff\x4f\x54\x69\x1a\xbe\x56\x65\x02\x33\x4f\x46\x3c\xf8\x8f\x06\xb4\x33\xcc\xe6\x8e\xc2\xd1\x26\xe0\x3b\x73\x10\x55\x93\x07\xff\x11\x02\x68\x1b\xc6\x0f\x37\x77\x0c\x4c\x6f\x82\xb9\x32\xc1\x33\x33\xaa\x75\x9e\xab\x46\xb9\x7a\x28\xe3\x51\x6d\x9f\x57\xcf\xc0\x86\x42\xce\x0d\x5d\xa5\xa7\xd2\xf9\x66\xa9\xb8\xa5\x95\x1f\x77\xdd\x58\xb8\x74\x9f\x32\x1b\x85\x0b\xd2\xba\x55\xba\xa7\x9b\x96\x6c\xa1\x82\x9d\x4e\x9f\x0c\x5d\x3c\xb8\x8f\xe6\xc6\xc3\xe3\xab\xb6\x41\x45\x3f\x71\x93\xe5\xc4\x7c\xda\x92\xae\x95\x86\xd3\xcc\x43\xd6\x4f\xd9\xf7\xe3\x70\xd4\x8b\x7d\xb6\x36\xef\xb4\xac\x1a\x57\xad\x97\x17\xc1\x1f\x66\xf6\xe3\xc3\x99\xfd\x88\x22\x71\x34\xae\xda\x30\x4f\x0c\x10\xca\x54\xe6\x7c\x15\xa6\x53\xaf\x0a\xf3\xc7\x2b\xdc\x57\xed\xda\xe8\xa9\x76\x3a\xac\x96\x97\x80\x52\x56\x50\x54\x6e\xd0\xc5\x70\xd5\x73\xe9\xe6\xda\x7e\x48\x7b\x7c\xf2\xc0\x86\x63\xfc\x78\x15\x0f\xfc\xd1\xb4\x5e\x0d\x38\x8f\xaa\x02\x06\x43\x5c\x7a\x1a\x8d\xe1\xb4\x2a\x00\x75\x18\x5d\xb8\x8d\x37\x4b\x67\xc7\x82\xa7\x62\x4d\xd9\x56\xe6\x96\xdc\x32\x08\x42\x7a\xd2\x21\x29\x66\x48\xbf\xae\x17\x03\x9e\x3f\x91\x2b\x1e\xc1\x95\xcd\x84\x2c\x7d\xc3\x31\xfb\x0f\xee\x23\xd0\x6d\x6e\xda\x4b\x6d\x85\x55\xc7\x50\x0e\x93\xdd\x4d\xbf\xbf\xc9\x79\x55\x7a\x85\x42\xbc\xba\x9d\xe2\xc8\x94\xf2\x58\xb1\x57\x75\x48\x17\xf8\xea\x48\x15\xb8\x5e\x4c\x47\xac\xa6\xd3\x70\xcc\x51\x58\x35\x36\xf7\x5c\xde\x70\x4c\x47\xfa\x4a\xfa\x3f\x83\x34\x8d\x92\xaf\xf5\x4f\x70\x8e\x12\x05\xdb\xcd\x31\x36\x83\xfe\xa6\xbc\x38\xb7\x27\x48\xce\x48\xde\x8f\x9f\x5c\x58\xe4\xde\x79\x2b\x19\x81\x7d\x72\x61\xee\xfe\xdf\x54\x71\x27\xf0\xa2\x48\xa4\x6c\x5d\x6b\x63\x1e\xf7\x5d\x0e\x96\x69\xad\xe6\x11\x2c\xf3\xc4\xe5\x9b\xd6\xe6\xcc\xe5\x0d\xa5\x30\xca\xe2\x37\x32\xff\x4f\x7f\x7e\x72\xe1\x58\x14\x10\x7f\x7d\x72\xe1\x5b\xee\x9e\xc9\x32\xad\x4d\xbe\x19\xb9\xfc\xf5\x9f\xfb\xbb\xcc\xee\x8d\x54\x87\x18\x78\xff\x62\x88\xd0\x68\xca\x62\x74\x73\xb7\x73\x13\x5e\xa5\x3b\x03\x40\x7f\x71\xe1\x4d\x2b\xde\x22\xce\x8a\x1f\x8d\xc6\x51\x99\x6f\xd7\x7e\xa4\x2b\xef\x45\x1c\xb6\x7b\xa3\x2b\x1d\xbb\x8a\xb4\x13\xf0\x28\x19\x84\xa9\xbc\x92\x50\xbb\xef\xe4\xa4\x76\xf1\x3e\x86\xa2\x77\x7a\x65\x3a\x6d\x82\x29\xda\x35\xcf\x69\x54\x90\x33\x3e\xd2\x34\xfb\x7e\x89\x86\x6a\x93\xa2\x09\xab\xb1\x51\x26\x9a\x1a\x2c\x44\xca\x2f\xa3\x28\xea\x65\x21\x2b\x17\xea\xb6\xba\x22\x9d\xfd\x96\x93\x2e\xc7\x22\x9e\x2b\x7c\x1c\xe6\xf8\xab\xf2\xed\x10\xc5\xd1\x2d\x24\x7a\xed\x89\xa9\x42\xf7\x7a\x8d\xd3\xa8\x54\x8b\xad\x52\x2d\x9e\xcb\x2b\x30\x8a\x7b\xe8\x34\x2e\xca\xdc\x87\x25\xee\xd6\x38\x49\xc3\xd1\x95\x78\x1e\x8b\x44\x9f\xe6\x56\x51\xd3\x89\xae\xc4\xf5\x37\xe4\x15\xdb\x9d\xad\xd9\xa2\x71\x32\x28\x64\x74\x3f\x8b\x9f\x88\xc0\x29\x96\x7d\xd1\xc9\x08\x6b\x5b\xf6\xcc\x2b\xd3\x8b\x2d\xbb\x3f\xc8\x69\xc5\x06\xb2\xce\x97\xf0\x85\x16\x77\xee\x97\x68\x85\x16\x3f\x73\x74\x8b\x27\xeb\x5a\xf6\xb6\x97\x47\x3d\xfa\x59\x35\x3c\xfd\x9e\x33\x2e\x75\x81\xe6\xb7\x9c\x54\xac\x86\xa3\x61\x8e\x5f\xdf\x05\x76\x83\x9c\xa3\x50\xb3\x76\x3b\x47\xcb\xe6\x56\x84\xe3\xc6\x49\xb9\xb1\x17\x79\x63\x27\x22\xed\xa4\x3c\xd5\xe5\x6e\xd9\x85\x3a\x79\xbb\x13\x9c\x4d\xf8\x4f\x44\x84\x5c\x90\x64\x42\xa2\x57\x12\x12\x74\x9f\x07\x7a\x25\x21\x51\xc4\x91\x90\x68\x95\xf9\x48\x20\xf4\x56\x04\x42\x4f\x0b\x84\xde\x7a\x81\xd0\xd3\x02\xa1\xb7\x2a\x10\x7a\x5a\x20\x6c\xf4\x8a\x03\x38\x0e\x7d\xea\x21\x12\x19\x4f\x78\x63\x99\x4c\x9d\x44\x22\x93\x35\x64\x45\x72\xbb\x65\x8a\xee\x3e\x3d\x2d\x18\x7a\x2b\x82\xa1\xa7\x05\x43\xaf\x2c\x18\x7a\x5a\x30\xf4\xde\x12\x0c\x3d\x2d\x18\x7a\x25\xc1\xd0\x2b\x08\x86\x62\x6d\xb6\x4a\xb5\xa9\x05\x43\xaf\x20\x18\x8a\xdc\x87\x39\x77\x3e\x60\x7b\x7a\xc0\xf6\xd6\x0f\xd8\x9e\x1e\xb0\xbd\xd5\x01\xdb\xd3\x03\xb6\x57\x1c\x5f\xe5\x8a\x3f\xce\x6a\x36\x59\x57\xf1\x27\xcb\xe4\x72\xf5\xde\xf6\x72\xea\x52\xf5\x36\xbf\xe9\x06\x4f\xca\xf5\x7b\x34\xcc\xe3\xac\xaf\xdf\xdd\x20\xe7\x28\xd4\xaf\xdd\xce\xd1\x6a\xd4\xf5\xf2\x51\x57\xac\xc9\x45\xb1\x26\xd5\xa8\xeb\xe9\x51\xf7\xe6\x68\xca\x9c\x57\x66\xe3\xc9\x9d\x16\xc7\x13\x59\x53\x81\xfe\x66\xe3\xa9\x88\xd3\xe3\xa9\x88\xa3\xf1\x44\x41\xec\x01\xbb\xda\xa2\x28\x31\xc1\x84\xe7\xb4\x72\xb3\x4a\x74\xa7\x57\xa6\xcb\x66\x95\xa8\xeb\x52\x5c\x95\x73\x45\x1b\x4f\xd6\x11\xa9\xd5\x25\x7a\x52\x64\x28\x36\xab\x44\x5e\x16\xbe\x9b\x35\xab\xc4\x9c\xfd\x96\x93\x64\xab\x4a\x30\x0e\x1b\x1b\x19\x61\xb9\x59\x25\xa1\x5b\x48\x95\x9a\x55\x42\xbd\x02\xfa\x46\x1b\x6d\x25\x66\x9e\x65\x33\x59\xa9\xbc\xa3\x22\x6d\x5d\xe5\x9d\x79\x65\x7a\xb1\xf2\xf6\x07\x45\xda\x6a\xfd\x5c\x14\x13\x5f\xad\x9f\xdb\x5e\x4e\x5d\xaa\x9f\xe6\xb7\x9c\x54\xac\x9f\xa3\x61\x8e\x5f\x5f\x3d\xbb\x41\xce\x51\xa8\x1e\xbb\x9d\x57\x4f\x26\x8f\x25\xe6\xbe\x93\xc7\x58\xaa\xb9\xf7\x3f\x9b\x36\x1c\x9e\xf2\x1a\x9f\xb8\x0c\x3a\x43\xfe\x2f\xd6\x6a\xc8\x6e\x87\xe3\x20\x65\x70\xf5\xaf\x23\xb8\x71\x38\x8e\x18\x04\xd3\x7f\xa1\xcc\x53\x84\xa7\xd0\x0b\x18\xac\xde\xec\x82\xbe\x3e\x5f\x6c\x9b\x26\x97\x4f\x32\x9e\xb8\x30\x44\xf0\x3c\xd1\xa0\xaf\x8d\x27\x81\x34\x33\x38\x6b\x1c\xd1\x93\xe9\x84\xfc\xc2\x0a\x69\x77\x7b\xd8\x79\xd4\x0f\x2f\x8a\xdc\x78\x79\x2c\xe6\xe4\x34\x22\xa9\x38\x21\x1d\xb7\x1e\xe1\xca\xb0\xce\x36\x9d\xcd\x8e\xd8\x14\x46\xc3\x9f\x56\x7d\xe0\x40\x49\x35\x02\xf9\x3e\xcd\xab\x7e\x89\xf8\xe1\x51\xdb\x6f\xca\xc7\x6f\xa3\x92\xa5\xe3\x61\xfb\xf1\x55\x19\x61\x72\xdc\xce\xe3\x6b\x6e\x2c\x21\xe3\x47\x64\xc0\xc4\xb4\x30\x94\x2c\x1b\x07\x8c\x1f\x2a\x1b\xe4\x9a\x67\xd9\xd4\x44\x34\x0b\x78\xd1\xa0\xb2\x30\xdf\xed\xc0\xae\xb9\x0d\x6d\x73\x1b\xce\xc8\x64\x32\xa6\x67\x12\xdb\xd2\x74\x22\xab\xe9\xd4\xdc\x86\x2b\x2c\x80\xd7\xaf\xb6\xff\x32\x91\x62\xd0\xde\xee\xd5\xc3\xf6\xa3\x39\x7e\xd8\x7d\x84\x53\x73\x4b\x7a\x2c\xad\xc8\x83\x00\xda\x3a\xb7\xfb\x97\x39\x56\xec\x43\xe3\xea\x61\xe7\xd1\x9c\x3c\xb4\x1f\x61\xe3\xd4\x5c\x61\xff\x91\xa5\xd6\xc8\x18\xb3\x8c\x76\xcc\xed\x46\x47\x1e\x2b\xeb\x68\x9b\xcb\xa9\xb4\xb0\x5c\xd1\x51\xa9\x87\xce\x23\x35\xe3\xb5\x7c\x0d\x0d\x53\x90\xc8\x9d\x47\x03\x4e\xcd\x41\x54\x0d\x1e\x3a\x8f\x70\x0a\xd7\xda\x0c\x73\x6a\xe4\x56\x97\xc5\x87\x0f\x84\xa1\xfa\x68\xab\x43\x07\x3f\x94\x11\xfb\xf4\xc3\x07\xf7\xe5\x45\x06\x86\x2f\x2f\xdb\xa6\x79\x6a\xfc\xf0\xa5\x75\x06\xf3\x31\xe2\xf0\x8d\x37\x72\xce\x6d\x0a\xd8\xef\xcc\xf3\xe4\x6b\x75\xc4\x4d\x24\x9b\xdb\x46\x1d\xc3\x16\x86\x77\x8c\xa5\xae\x00\x96\xf1\x83\xfa\xec\x57\x5f\xda\x60\x2c\x18\xa9\xb2\x7d\xe3\x8f\xc0\xf1\xaf\x61\xd4\xfd\x9a\x6d\xbf\x41\x84\x11\xaf\xed\xf1\x15\xd4\xd3\x53\x39\x89\xd7\xcc\x32\x9f\x67\x55\x56\xe6\x21\x37\x1d\x69\x38\x5a\x36\x37\xa9\xaf\xda\x9b\x87\x1c\xf2\x0a\xa7\x0b\x39\xf4\x45\x0d\xd0\xb7\xb6\x95\x2d\xea\x55\x9e\x70\x2b\xd4\xd8\x21\x37\x37\xc4\xc3\xb7\xc7\x4d\xfc\x0c\x94\x3b\xe7\xf2\x67\xf2\x26\xe4\x06\x58\xf2\x33\x1a\xa0\xcf\x10\x80\xa5\x39\xdb\xdc\x7c\xc5\xef\x7c\x6d\x6f\x6e\xd6\x77\x37\x37\x1b\xb2\xf2\xab\x0b\xf3\xdd\xb6\x91\x59\xa9\xfc\x7f\xb1\x1c\x27\x81\x33\xe2\x33\xb6\x6c\x76\xde\x36\xe9\xe9\xd0\xd2\x75\x96\xc2\x6b\xc6\x58\x64\xf9\x62\x72\x66\x5c\xd7\xb2\xe5\xc1\x7e\xd4\x16\xa9\x0f\x1f\x9c\xbf\xa4\x69\xc9\x31\xf2\x07\xc0\xfe\x6d\xae\xca\x52\xf0\xff\xd7\x5c\xfd\xf9\xff\x9e\xab\x30\x48\x07\xec\x8d\x17\x37\x9c\xc7\xaa\xb1\xb9\xf3\x6f\xac\x36\x94\x56\x32\x1e\x31\x18\x95\x2d\x20\xdf\xbf\xbb\x13\x6f\xe1\x8e\x79\xec\x7c\xff\xce\xe0\xdd\x76\x91\x3a\x1b\x70\x48\xc7\x19\x26\x1d\xe3\x0c\x37\xe2\x43\xa1\x56\x4c\xe6\x0a\x46\xf1\xac\x99\x6b\x25\x61\x37\xc8\x39\xe4\x2c\x2d\xc1\xa3\x61\x63\x1e\x55\x29\x0c\xf4\xf7\xc1\x43\x05\x6e\x39\x35\xd2\x24\x24\xf2\x7a\xc2\x73\x72\xd7\x1b\x89\x70\xac\xf2\xf3\x30\x7b\x7e\xcc\x49\x6a\x55\x47\xaa\xb5\x44\x5e\x15\x63\x2a\xf2\x05\x8f\xf9\x48\xa4\x22\x56\x3c\x17\x7d\xe4\x91\x5f\x4e\xa2\x30\x48\x84\x39\x1b\x37\xee\xca\x59\xbc\xc5\x2c\xbe\xbd\x46\xa4\xb5\x25\x15\x92\x41\x37\xaf\xc5\x79\x54\xed\x52\x22\xdd\xbc\x9c\x6f\x26\x42\xd1\x75\x16\x18\x3c\xa7\x59\x32\xcf\xe9\x8a\x7e\x2a\x51\xd7\x5c\xd1\xbc\x44\x9e\x71\x93\x90\xff\xd4\xd8\x90\xa1\x01\x4f\x6e\x78\x1c\x78\x81\xab\x49\xbf\xe6\xa9\x5d\x09\x9e\xe0\x5a\x49\x22\x22\xc1\x73\x92\x72\xb8\xa3\x48\x8b\x6f\x85\x2c\x94\x5d\xf2\x28\x8e\x6f\x9f\x7f\xa6\xf2\xab\x4c\x33\xe8\x47\x59\x99\xfa\x11\xc6\xe3\x8e\x23\x5d\xf9\x9a\x12\x3e\x70\x73\xc2\x55\x38\x55\xd8\xce\x73\x09\x9b\x28\xb4\xbd\xdb\x38\xe2\x55\x0a\x03\xfd\x95\xe6\x37\x49\x24\x9d\x1b\x53\x3e\x72\x14\xfb\xad\x68\x4c\xcb\xec\xe1\xf3\x2a\xfb\x09\xb7\x84\xaf\x62\x5c\xf1\x65\xea\x05\xbd\x2a\xa0\x73\xfb\x7e\xbc\x42\xcf\x3c\xa9\x49\xfc\xd3\x1b\x0c\x9e\xd0\x85\xd8\x8b\x97\x59\xe8\x01\x00\x5d\xf2\x68\x85\x1a\xfa\x9a\x38\x8a\x1b\x1b\x4b\x54\xea\xfa\x12\xd7\xce\x63\xb6\xbd\x24\xf5\x02\x3b\xbd\xe6\xfe\x38\xfb\xf0\x65\x37\x67\x90\x6f\x10\x88\x62\xe5\xa6\x27\x05\x32\xb9\x55\x4f\x85\x43\x09\xe8\x8c\x17\x2a\x47\xbe\x5c\x70\xde\x57\x0f\xc0\x29\x8e\xc3\x55\x86\xc2\x07\x4e\x73\xea\x4a\xa5\x3c\x3d\xad\x10\x75\x95\x0e\x0a\x35\x72\x15\x4e\x97\xa8\xa7\xf1\x3a\x6a\x9e\xf0\xd1\x71\x4e\xef\x84\x71\x5a\x2a\xb2\x53\x48\x9a\x3a\xec\x52\xe2\xb3\xee\x7a\x7a\x9e\xfc\xfe\x3c\xe7\xe8\x05\x8e\x88\xfd\xb9\x17\xb8\xc4\xab\x3a\x63\xe0\x88\x99\x62\x1e\x77\xdf\x64\xbe\x0a\xa7\x45\xce\xa4\xdb\x70\xad\x52\xcf\x3d\x7a\x34\x74\xdb\x7b\x41\x22\xe2\xb4\x34\x8a\xa2\xbe\x6e\x1b\x49\x2c\x94\x71\xb1\xad\x28\xb1\x18\x85\x13\x51\x8a\x26\x7e\x5b\x43\xd3\x11\x23\x97\x97\xa8\xf9\xe8\x4c\x5a\xcb\x04\x1d\xe7\x39\x8b\x83\x2b\x3c\xe1\xeb\x71\x65\xdb\x05\xf4\xca\xa8\xfb\x36\xe1\xcb\xe4\x95\x8a\xf6\xed\xb7\x78\x74\x63\x1d\x4f\x73\x86\xb5\xfd\xb7\x3b\xcb\x19\x56\x3b\xe0\x74\x85\xa8\x12\x7e\x38\xb2\x1f\x73\xda\xba\x3e\x76\x53\xcc\xff\x6a\x17\xf5\x7e\xcf\xa9\xeb\x7b\xd1\x6d\x31\x81\x75\x1d\xf1\x6e\xc2\x75\xeb\xe3\x3a\xb6\x50\xa8\x7d\xde\x08\xcb\x3d\xc5\x16\xd2\x60\x52\xc4\x8d\x7f\x3a\x0f\xa1\xbc\xc6\xb5\x31\x83\xd3\x7c\x26\x3b\x1d\xd7\xfa\x71\x38\xfa\xd6\x39\x3f\x33\xcf\xc6\x8d\xd3\xf1\xb2\x8c\x95\x18\x29\x63\x29\x0c\xf4\x57\xca\xd8\x25\x76\xd9\xda\x12\x79\xc5\x97\xa9\x5a\xc6\x4a\xf4\xfb\x95\x8f\x65\x95\xa1\xf0\x4f\xff\xaf\x0c\x58\xe3\x92\xb2\x17\x2f\xb3\x48\x21\x2c\x91\x9d\x68\x85\x8a\x42\x58\xe2\x46\x2b\x51\x49\x06\x4b\x5c\x3b\xa7\x2d\xc9\x60\x89\xbf\xec\xe6\x0c\x25\x19\x2c\xb1\xe9\x49\x63\x23\xa7\x97\x3b\xb1\xca\x78\xa1\xf6\x96\x85\xb0\x24\x1c\xae\x32\x14\xbe\x70\x9a\x53\x57\x2a\xe5\xe9\x69\x85\xa8\xab\x74\x50\xa8\x91\x62\x0f\x57\x89\xc6\xeb\xa8\x79\xc2\x47\xc7\x39\xbd\x20\x84\x25\xce\x29\x24\xbd\x22\x38\x25\x65\x7a\x90\xb3\xfc\x44\xca\x4a\x9e\x71\x77\x29\xbd\x4c\xb6\x2a\xfa\xe8\xcd\xc4\x96\x38\x93\xe5\x94\x96\x8a\x3d\x7b\x83\x9e\x17\x7c\x7f\x8e\x72\xbc\x38\x3a\x48\x8e\x67\xb1\x70\xd4\xad\x96\x60\x72\xd5\x58\xc3\xa1\xd3\x3c\xe6\xbc\x4c\x5e\xca\xf5\xf9\xd5\x0a\x59\x47\x4d\x84\x8e\x3a\xf0\x1c\x51\x4e\x76\x31\x29\xd2\x0a\x91\x9a\x19\x21\x93\xbc\x9a\xe4\xc6\x39\xa5\x10\xe3\x26\x50\xe8\x34\xcc\xf5\x57\xd5\x7d\x67\x28\x9a\x8a\x15\xf2\x73\xd1\x24\x50\xc9\x4d\x18\x24\xb9\x6e\x9c\xa4\xe4\xb9\x88\xb4\x5f\xf2\x7c\x8a\x18\x39\x13\x35\x7d\x1f\x51\x23\x3b\x47\x65\x7c\x07\x13\x5e\x8c\xba\x1f\x2b\xf5\x3d\x5b\x02\x90\x83\x4a\x64\x29\x1a\x6f\x11\x1b\x51\x72\x72\xaf\xf9\x22\x0e\xe5\xad\xf7\x96\x76\xc7\x4e\xd7\x0b\xb0\x00\xf3\x01\x87\x83\x71\x71\x85\xb5\x18\x70\x38\x1c\x97\x16\x70\xad\x01\x87\x6f\x25\xa6\xdd\x01\x87\xe3\x12\xa6\x39\xe0\x70\x32\xfe\xe7\x25\x24\x65\x3f\xb3\xaa\x77\xf2\x18\x27\x51\xb5\x43\x35\x4c\x7f\xa5\xdd\x9e\x3f\x97\x70\x64\x55\xef\x64\xad\x4a\xab\x19\xaa\x17\xbd\x4f\x26\x69\xa7\x13\x9e\x71\x05\x4e\x33\x70\xda\x31\x9f\x2a\x5a\xaf\xbd\x9c\xc0\x45\x98\x64\x2b\xaa\x72\x3a\xad\xee\x32\xef\x7a\xbe\x76\x17\x97\x61\xc5\x8c\xfe\x7c\x19\xc6\xe3\x98\xcf\xbb\x61\x61\xc1\x71\xd7\xff\x97\xa6\xd4\x71\xea\xf9\x49\xcd\x0e\x47\x11\x8f\x85\x94\xd1\x0c\x06\xd1\xbf\x5c\x6e\xd3\xd7\xba\x61\x2b\x99\x94\x97\xef\xb9\xfd\xe0\x5c\x9f\x17\xa4\x1b\x73\x64\x3d\x28\x1f\xbe\xe7\xf9\x7d\xb5\xed\x3f\x9d\x0f\x1f\xaa\xd6\xa6\x79\x25\xa4\x3d\x4c\x98\x64\x19\xb2\xc1\xc9\x1f\x2b\xa0\x83\x1c\x53\x97\x1b\xd0\x37\xb7\x76\xde\x99\x82\xdc\x83\x5f\x09\x03\xdc\x02\x1c\x0b\x03\x86\x05\x78\x2c\x2f\x91\xf4\x5f\x5e\xdc\x97\x97\xa1\x21\xcc\xb1\xd8\x14\x9b\x63\xd1\xb0\x36\x4d\xf1\x6a\x6d\x9a\xb1\xf8\xbf\x31\x5b\x1c\x70\xc7\x15\xe9\xa1\xf0\xa9\xcf\xb5\xf2\x3e\xd7\xa2\xf6\x93\x83\x84\x3a\x26\x0e\xb0\x8b\x58\xf4\x13\x53\x92\x9e\x26\x5c\x31\xd1\x21\x56\x9e\x8a\x6c\xe4\x49\xb4\x35\xe5\x8d\xc6\xd4\x0b\x9c\x70\x5a\x93\xdf\xfe\xf0\xa1\x04\xd6\xfc\x90\x3b\x22\x5e\x8f\xad\x89\x09\xf7\x7f\x42\x2a\x97\xe3\xc3\x87\xea\xbf\xe4\x2c\x9e\x0a\x47\x6a\x35\xf7\x20\xb1\x2d\x6f\xc9\x6d\x6c\x90\x4f\xd0\x70\x6a\x8e\x03\x91\xd8\x3c\x12\x10\x4d\x4d\x15\x7a\x9e\x9a\xb9\x05\x03\xe2\xa9\x19\xf0\x89\xe7\xf2\x34\x8c\xf3\xc3\xab\xc9\xb4\xe4\xbc\x8b\xd7\x1c\x2f\x96\xef\x22\x9a\x85\x43\xa5\xe9\x32\x57\xdf\xf3\x7d\xe1\x14\x59\xc6\xcb\x2c\x53\xe1\xb9\x83\xb4\xc8\x32\x59\x66\xb1\x43\xdf\xe7\x51\x22\x8a\x4c\xd3\x65\xa6\x84\x1e\xa3\x2b\x7f\x6c\xb6\xc2\x94\xc6\xe1\xb0\xcc\x33\x5f\x97\x67\x3b\xf4\xc3\xb8\xc8\xb5\x58\xff\xb9\x22\x4b\x73\x99\x65\x22\x95\xaa\x02\xcb\xee\x6a\x2a\xe9\x15\x77\xbc\x71\x89\xab\xb5\x86\x2b\x7b\x86\xb2\xc8\xd8\x5e\x69\x14\x11\xa5\x03\xb3\xe8\x0c\x66\x6f\x99\x45\xb9\x43\x2d\x26\xb3\xbf\xcc\xe3\xa5\x62\x54\xca\xd1\xc1\x4a\xa3\x0d\xbc\x54\x74\x22\x6e\x97\xda\xe4\x70\x7d\x75\xaf\xb6\xf0\xd1\xba\x3a\xef\xa4\x73\xbf\x94\xdc\xb7\x35\xf5\x70\xed\x25\x9e\x55\x66\x3b\x5e\x66\x1b\xf1\xd8\xf5\x82\x1b\xcf\x49\x4b\xc5\x3c\x59\xe9\x56\xe3\x38\x29\xb7\xf2\xe9\xca\x17\xbd\x45\xe9\x5b\x67\x6f\x67\x29\x7f\x3b\xb1\x18\xe1\x7c\xb5\x2f\x87\xb1\x13\xc6\x9e\xeb\x95\x9a\xf2\x62\xb5\xea\x96\x6a\xe3\x72\x25\x25\x3f\xa4\x21\x91\x37\xf6\xd5\x32\x4b\xea\xd9\xc3\x52\x43\x76\x96\x39\x50\x8b\x0e\x13\x6f\xb9\x67\x75\x57\xba\x44\xb2\x17\xe0\x74\x52\x1a\x3a\xbd\x95\xce\xb5\x5c\xfc\xeb\xf5\x6d\x73\xb8\xd2\x23\x6e\xd6\xd6\x93\x17\xf0\xb4\x3c\x82\x6e\x97\xf9\xf8\xca\xa8\xb8\x5b\xed\xf2\x89\x28\x7d\xec\x7e\xb5\xb2\x79\x4c\x02\xb0\xc8\xf5\x7e\x99\x2b\x08\x9d\x12\x03\x9f\x2d\x31\xf8\x5e\x20\x56\xba\x9d\xb5\xcc\xd5\x8f\xf9\x48\xec\x86\xb1\x23\x4a\x7d\xcf\x5e\xe6\x4b\xc5\x2c\x2d\x35\xaf\xb3\xcc\x91\x3f\x0e\x5b\xaa\x23\xb1\xcc\x27\x67\xbc\x16\x8f\x96\xab\xaa\xbf\x92\xb7\x30\x48\xf7\xf9\xc8\xf3\xe7\x45\x36\x77\x99\x8d\x24\x5b\x91\x63\xb0\xcc\x81\x6a\x6d\x91\xc1\x5b\x66\x90\xa2\x61\x65\xcc\x3f\x2d\xf3\xa1\xfe\xea\xc6\xe1\x38\x70\x5a\xcb\x32\x79\xb8\x3e\xcd\x15\xd9\xed\x2f\xf3\xc5\x2b\x22\x77\xb4\x52\x65\x03\xcf\x77\x62\x51\xaa\xad\x60\xe5\x7b\x76\x1c\xfa\xbe\x17\xb8\x45\xae\x70\x99\x2b\x8c\x3d\x11\xc8\x66\x2a\x35\x67\xb4\x92\x9c\xd4\xe9\x45\x50\xea\xac\xcf\xcb\x6c\xee\x5a\xb6\x78\xa5\x8d\x56\x25\x65\xb2\xae\xb9\x6f\x56\xc6\x62\xba\xbe\x9c\xdd\x30\x2a\x4d\xe4\xcb\x5c\x22\x70\x96\x87\xd0\x64\x6d\xde\xfd\x30\x2e\x55\xfe\x74\x65\x1c\x71\x4b\xf8\x25\x96\xd9\x9a\x84\xd6\x4e\x89\xf3\x95\xb6\x5e\x9a\xa5\x17\xcb\x0c\x8e\x97\xac\x08\xb6\xe6\xba\xb1\xd8\xf4\x3d\xb7\xf4\xad\xdd\xb7\xfb\x6a\xa9\xa1\x5b\xeb\xaa\x7d\xa5\xe7\xb7\xd7\x14\xf1\xa8\x94\xab\xbd\xd5\xf1\x6f\x0f\xca\x5d\x7d\x7f\xa5\x1f\xa3\x18\x2d\xcf\xe5\xeb\x59\x96\x26\xba\xc3\x35\x9d\x73\xdd\x44\x71\xb4\xd2\x0b\xa4\xf3\xe1\xd2\x3c\xbe\xcc\x33\x8e\x50\xb5\x2e\xcd\xe1\x2b\x15\x1e\xf3\x20\xe9\x87\xf1\xa8\x34\x83\xaf\xb4\x9d\xb0\xc6\x38\xf8\x48\xb9\x3d\x9d\x99\x4c\x4e\xac\x0c\xce\x28\xec\xa0\xfe\x7f\x3e\x33\x59\xa6\xac\x32\xb8\x98\x99\x2c\x19\xf0\x48\x30\xb8\x9c\x99\x0c\x15\x0f\xea\x91\x0c\xae\x66\x26\xa3\x53\x4f\xb1\x08\x52\x06\x9d\x99\xc9\x6c\x11\xa4\x74\x04\x1b\xc3\x3e\x4f\x92\x13\x2f\x49\x19\xf4\x30\x8d\xfc\x5d\xf0\xeb\x99\xc9\x3c\x69\x9b\x63\x70\x33\x33\x99\x98\xa5\x22\x70\x18\xdc\xce\x4c\xe6\xf3\x79\x38\x4e\x19\xdc\x65\x71\x84\xc3\xe0\x1e\x13\x54\x5a\xad\xc3\xe0\x3d\x7d\x3a\x1c\x89\x34\x9e\x33\xe0\x73\x64\x4d\xf7\x30\x09\x6b\x6e\xb2\x34\xf6\x46\x0c\x6c\xc4\x92\x80\x53\xf9\x75\xe6\x26\x8b\x85\xeb\x25\xa9\x88\xf7\x64\xad\x33\x10\x73\x93\x4d\x63\x2f\x15\x0c\xdc\xb9\xc9\xe8\x35\x3b\x4f\x66\xf3\x69\x2e\x8b\xdb\x15\xb3\x94\xc1\x10\xa1\xd0\x1e\x27\x0c\xfc\xb9\xce\x1a\x83\xd1\xdc\x64\x13\xb5\xd0\x0c\xe6\x26\x8b\xb8\xe3\x78\x81\xcb\x20\x9c\x9b\x4c\xb5\x6d\xc2\x20\x9a\x9b\x0c\x45\x7c\x37\x64\xf0\x2c\xb3\x5b\x78\x28\x3d\xa6\x2f\x47\xe9\x80\x41\x32\xa7\x4a\xdd\xc5\x41\x91\x30\x48\x91\xc2\xd3\xf1\x88\xc1\x78\x6e\xb2\xb0\xdf\x4f\x44\xca\x60\x32\x37\x19\x29\x9d\x0c\xbe\xcd\xb1\x66\x48\xbc\xdd\xd0\xea\x87\xc1\x31\x46\x1a\x47\xbe\x67\x73\x2c\xd7\x09\x56\x89\x37\x12\x0c\x36\x4e\x91\x59\x4e\x6b\x0c\xce\x64\x3e\x94\x3a\xc6\xe0\x1c\x89\xa4\xe2\x31\xb8\x98\x9b\x6c\x90\x8e\x7c\x06\x97\x58\x40\x4f\x4c\x13\x06\x57\x18\xc1\x5b\x08\x06\x9d\xb9\xc9\x4e\x79\xd4\x9d\x47\xe2\xc8\x61\xd0\xc5\x98\x34\x67\xaa\x7a\x3d\xeb\x30\xe8\x95\x92\xcf\xb5\x3d\x06\xd7\x98\x38\x99\x08\x18\xdc\x20\x17\x9f\x08\x06\xb7\x54\x10\x3a\x3a\x75\x37\x37\x19\x2a\x0f\x09\x83\x7b\x6c\x34\x7a\xf7\x9d\xc1\xfb\xac\x12\xd5\x67\x64\xcb\xf0\x85\xc9\xb8\xe3\x68\x8f\xd7\x0c\xac\x05\xf6\xbe\x30\x11\x0c\xec\x05\x96\xdd\x1e\x26\x0c\x9c\x05\xb6\x8e\xec\xab\x62\x41\xd5\xca\xb1\x00\x0c\xfa\x0b\xd9\x91\xd5\x70\x65\xe0\x2e\x4c\x96\x29\x70\x0c\x06\x0b\x93\xc5\x32\xeb\x1e\x26\x2d\x7c\x3f\x61\xf0\xb4\x30\xd9\x68\xec\xa7\x5e\x84\xe5\x18\x2e\xb0\xb3\xc4\xd2\xaf\x38\x03\x1f\xf9\x72\x8d\x8c\xc1\x68\x61\xb2\xc4\xe6\xc8\x1a\x60\x72\x22\x49\xc3\x58\x30\x08\x31\xf3\xaa\x1b\x44\xc8\xa3\x35\x2b\x06\xcf\x0b\xd9\xff\xae\xa8\xa3\xc5\xc8\x98\xa6\xb1\x67\x8d\x29\xc1\x64\x21\xeb\x88\x41\x4a\xdf\x1a\x45\x1c\xd9\xc6\x0b\x93\x65\x6a\x15\x83\x89\xae\x8a\x0b\x8e\xe0\xc6\x74\x61\x32\x59\x6b\x33\x2a\x63\x2b\x1f\x53\x73\x2c\x0f\x69\x9b\x0c\x16\x2a\x15\xec\xae\x4d\x64\xb4\x31\x7f\xbb\x94\xf1\xc8\xe7\xb6\x68\xe1\x74\xcf\xa0\x85\x99\xca\x95\x2a\x06\x6d\x59\x95\x2d\x25\x07\xf6\x16\xba\x63\xb4\x74\xaf\xdb\x5f\x98\xcc\xf2\xc7\x31\x83\x83\x85\xc9\x64\xd9\x0e\x17\xb2\x61\x19\x1c\x21\xb5\xac\xc1\x30\xf8\x86\xad\x15\x8e\x38\xe6\xec\x78\x61\x32\x29\x0e\xd5\x19\x61\x06\x27\xd4\x3c\xa8\xa1\x30\x38\x5d\x98\x4c\x3c\x8f\x39\x36\xd0\x19\xa6\x25\x5c\x2f\x90\x65\x3f\x97\x59\x93\xaa\x34\x83\x0b\xec\x0e\x3e\x9f\x33\xb8\xa4\x8e\x81\x2c\x57\xf8\x21\x91\x72\x7b\xc0\xa0\xa3\x4a\x82\x43\x0b\xeb\xab\x8b\x3d\x09\x85\xac\x4f\x7d\xb1\xb7\x30\xd9\xc9\xd9\xce\x36\x83\xeb\x05\x89\x51\xad\xb2\x30\xb8\x59\x50\xc7\x57\x3a\x07\x83\xdb\x42\x4a\xd4\xbb\x17\x38\xa2\xd4\xa0\xbb\x5f\x98\x6c\x28\xe6\x09\x83\xf7\x32\x5a\xd3\x4e\x3d\xac\x09\xde\xd4\xe2\x4b\xd6\x91\xd5\x34\x19\x69\xc2\x09\x03\xbb\x29\x25\x48\x4a\x97\xc8\x9c\xa6\xc9\x22\x65\xc4\x66\x20\x9a\xea\x6b\x3e\xd9\x58\xfb\x4d\x1c\x00\x29\x7e\x6a\xc3\x6d\xa2\x78\x45\x55\x81\xc1\x40\xb2\x15\x84\x90\xd7\x44\xa9\x11\xab\x42\x3c\xe1\x27\xec\x10\x87\xc7\xb0\x89\xcd\x8e\x79\xf0\x31\xb1\x81\x08\x18\x8c\x30\xa4\xe7\x78\x06\x41\xd3\x64\xdc\x8f\x06\x9c\x41\xd8\x34\x59\xcb\x8b\x6d\xfc\x62\xd4\x2c\xb6\x26\x83\xe7\xa6\xc9\x44\x90\xc6\x1e\x16\x22\x96\x39\x40\xf9\x91\x60\x74\x9a\x9b\x19\xa4\x4d\xd9\x17\x48\x9a\x8f\x9b\x6a\x18\x25\x0c\x26\x4d\xd5\xcd\x63\xa4\x5d\x84\x1e\x09\xd6\x69\x93\x06\x3f\x15\xb7\x93\x86\x11\x83\x99\xac\x9c\x7c\x34\xcf\x9b\x99\x24\x66\xb0\x68\x66\xe2\xb2\x1d\xda\x63\x89\x6c\x62\x22\x33\x2f\x61\xb0\xdb\xd4\xdd\x8b\x41\x0b\xb1\xb1\xe0\xd8\xad\x31\x18\x45\x34\x49\xed\x35\x55\x47\xc0\xd9\x96\xc1\x3e\x56\x1b\x4e\xab\x0c\x0e\xf0\x43\x72\xfc\x77\x87\xdc\x64\x7f\x07\x95\xd3\x4f\x0e\x83\x9e\x02\x38\x83\x6b\x15\x9c\xcf\xe7\x73\x06\x37\x04\xcd\xb6\x77\x19\x1c\x36\x4d\x56\xa9\x32\xb8\x45\x54\xa5\x4a\x82\xd0\x60\x70\x47\xe0\xff\x56\x18\xdc\x53\x68\xb3\xc2\xe0\x08\x59\xb7\x2a\x0c\xde\x13\x6a\xab\xb2\xef\xf3\x64\x50\xb9\xf0\xf9\x5c\xc4\x95\xa3\x20\x49\xb9\xef\xab\x66\xe4\x3e\x37\x37\x58\xe5\x53\x85\x81\xe5\x23\xf7\x76\x85\xc1\xb7\x26\x05\xb6\x2b\x3b\x15\x06\x36\xa1\xcd\x0a\x03\x87\x42\x0f\x9b\x8f\x0c\x04\x05\xbf\x93\x01\xcd\xa9\x98\x95\x34\x1e\x8b\x06\x83\x3e\xa1\xb9\x1f\x0b\xee\xcc\xf3\x97\x5f\xc1\x25\xbc\x13\x0a\xe9\x73\x77\xc0\x27\xa2\xc2\x2b\x72\xc8\x56\xe4\x99\xcd\x1a\x83\xe3\xa6\xf9\xb1\xe2\x39\x26\xfb\x08\x03\x8a\x20\x93\x87\x8a\x35\x4e\x2b\x13\x11\x7b\x7d\x9c\xb0\x68\x49\x40\x6e\xd8\x2b\x0c\x3c\x9f\x9b\x1f\x2b\x61\x80\x9c\x26\x6b\x1d\x36\xaf\xba\x2a\x53\x55\x83\x7d\x84\x13\x2c\x48\x1a\x56\x18\x3c\x51\x82\x53\xbe\xf4\x26\x2d\x0c\x29\x81\xd9\xc8\x0f\x92\x7a\x32\x71\x71\x52\x4b\xa3\xfa\xa7\x4f\xd3\xe9\xb4\x36\xfd\xb5\x16\xc6\xee\xa7\xcf\xdb\xdb\xdb\x9f\x92\x89\xcb\x3e\x82\x5f\xe0\x9e\xf9\x5e\x30\x5c\xc7\xbf\xf3\xe5\xcb\x97\x4f\x44\x65\x7f\x7d\x84\xd3\xa6\xf9\x91\x55\x3e\xc2\x08\xa3\xb2\x0a\x29\x3d\x58\x46\xdb\x4f\x3c\xa7\xde\xfe\xfc\xdf\x56\x7b\xf7\xf7\xbd\xad\xe6\xde\xef\xed\xad\x9d\x1d\xbb\xbf\xf5\xe5\xf7\xdd\x3f\xb6\x7e\xfb\xed\xb7\xff\xfc\xe7\xd7\xff\xfc\xb6\xbd\xbd\xbd\xcd\x2a\x53\x5a\x02\xb3\x8f\x10\xc8\x44\x06\x72\x85\xc1\x3e\x42\x28\x11\x01\x1f\x09\x04\x23\x09\x26\xb1\x5d\xca\x98\x32\x77\xda\xe1\xe8\x93\xe7\x7e\xf2\xfa\xf1\xd7\x71\xec\x9b\x1f\x61\xe3\x59\xf1\x93\xea\xcc\x3e\xc2\x19\x65\x56\x2e\x46\xd9\x47\x88\x25\x39\xfb\xfc\x39\x92\xff\xfa\x08\x17\xf4\xfb\xe7\x27\xc7\x9b\xfc\xf5\x11\x12\xac\xda\x5f\x6a\xbf\xfc\xf2\x0b\x83\xcb\xa6\xc9\x7e\xc1\x3c\x43\x4a\x58\xcc\xff\xe7\x6d\x06\x57\x12\xdf\x67\xd0\xa1\x50\x7f\x9b\x41\x17\x43\x3b\xdb\x5f\x7e\xdf\xf9\x83\x41\x0f\x81\xcf\xf4\x8f\xc1\x98\xe2\xfe\xfa\xeb\xaf\x0c\xae\x9b\x32\x44\xc0\x8d\x04\xbe\x7c\x69\xb5\x18\xdc\x22\xf0\xdb\xaf\xf8\x1f\x83\x3b\x02\xe8\x1f\x83\x7b\x04\x7e\xff\xfd\x77\x06\xef\x55\x88\x80\x09\xa5\xfa\xdf\x2f\x5f\x7e\xe5\x0e\x83\xa9\x84\xfa\x5f\xf8\xef\x16\x83\x19\x41\x7f\x6c\xff\xb1\xdd\xef\x33\xe0\xbb\x26\xfb\xe5\xcb\x97\xdf\x7e\xfb\xf2\x85\x81\x25\x81\x2f\x0c\x6c\x15\x22\x60\x4e\x31\xbe\x58\x96\x83\x53\xac\x83\xa4\x16\xfd\x63\x20\x10\x68\xb7\x7e\xfd\xb2\xf3\x99\xc1\x82\xf8\xda\xed\x36\x83\x3e\xe2\xf7\xf6\xf7\x7e\x6f\xb7\x18\xb8\x08\xec\xef\x7f\xf9\x82\x95\x35\x90\x00\xfe\x63\xd0\xa4\x18\xfc\xb3\xfd\xdb\x1f\x7f\x30\xd8\x95\xd0\x97\x2f\x9f\x31\xd7\x2d\x09\x39\xff\x75\xfe\xfb\x85\x41\x5b\x42\x82\x7f\xf9\xef\x0e\x83\x3d\x82\xac\xff\xe2\x7f\x0c\xf6\x09\xb2\xbf\x7c\xd9\xc1\x12\x79\xf8\x01\xdb\xb6\x19\x3c\xed\x9a\x1b\x14\x24\xe8\x40\x72\x39\xf6\x7f\xff\xf8\x0f\x83\x43\x09\x89\x2f\x7f\xfc\xfa\x85\xc1\x11\x41\xce\xe7\xbe\xb0\xb6\x19\x7c\x93\xd0\xef\xd6\x17\xc7\x62\x30\xc4\xf4\x1c\x5b\x16\xf1\x58\x92\x04\xdf\xf9\x62\x31\x38\x51\x10\xdd\x2e\xfb\xe5\xfa\xf4\x84\x81\x8f\xdc\x62\x1b\xff\x63\x30\x22\x40\x08\x06\xa7\xc4\x29\x84\x10\xff\xb1\x18\x9c\x65\x10\xb7\x19\x9c\x67\x10\x72\x06\x18\xa7\x8f\x35\x75\x41\xf8\x7e\xdf\xb2\x7f\xfb\x9d\xc1\xa5\x82\x9c\x1d\xfb\x0b\x83\x2b\x05\xf5\xb7\x31\x8b\x1d\x84\xde\xa3\x04\xeb\x52\x68\x22\xe2\x84\x44\x5e\x0f\xc1\xff\x49\x18\x5c\xcb\xc0\xc7\xa4\xc2\x9d\x91\x17\x78\x49\x2a\x27\xb7\x4a\x75\x1c\x38\x22\xae\x38\x5e\x12\x8d\x53\x61\x30\xb8\x91\x9c\x7a\x38\x25\x38\x93\xdb\x34\x9e\xe8\xb9\xb4\xe4\xd3\xff\xd0\xff\x0c\x6e\x91\xf1\xc3\x38\xfa\xce\xe0\x4e\x07\xbf\xa7\xa8\x26\x7e\xa7\xa7\xb0\xbe\xe3\xc0\x63\x70\x8f\xb4\x8f\x06\xed\xaf\x55\xff\x0e\x2a\xf8\x2f\xdb\x72\x88\xd5\x0e\x89\x51\xf9\xa1\x48\xf4\xd8\x24\x83\xf7\x14\xeb\xf1\xd5\x68\xfc\x1d\x10\x25\x37\x64\xc5\x7c\x5a\xba\xc8\x57\xcd\x22\x93\x0b\x8d\x37\x37\x12\xab\x1f\x19\x6c\xf0\x11\x37\x3f\xea\x6c\x54\x2a\x8e\x9a\xf6\x70\xbd\xac\xf4\xe8\xdd\xf9\x91\x53\xfd\xfb\x63\x29\x81\xbf\x3f\x1a\x46\x2d\x8b\x44\x59\xc8\xb2\x5e\x3a\xc4\x58\x35\xa0\x22\xdd\xc5\x68\xee\x57\x15\x7c\x55\xe5\x50\xf9\x4b\x44\x7a\x1e\x9c\x84\x3c\xdb\x66\xad\xae\x94\x4b\x46\xfc\x7b\xf6\xab\xfd\x29\xb1\x63\x2f\x4a\xff\xfa\x3b\xa8\xfc\xf9\x69\x20\xb8\x43\x21\x2b\x74\xe6\x18\xa8\xfc\xe9\x78\x13\x9a\x4b\x4a\x79\xce\x44\x1d\x89\xb4\x7a\xe5\x3f\xdb\xdb\xd1\xac\xa1\xe4\xa9\x06\xb5\x64\xa3\x94\x55\x82\x7f\x7e\xc2\xc5\xce\x5f\x1f\xc1\x1a\x71\x93\x19\x95\x4c\xd1\xab\x32\xb0\x11\x05\xdb\xc0\xc0\xc1\xd0\xd6\x16\x03\x41\x81\x1d\x94\x7e\xd1\x8c\x41\x3f\x03\x11\x72\x09\xe2\x4a\x8d\x1b\x10\x64\xb9\x0c\x3c\x19\x1a\xa7\x29\x69\xad\xe1\xae\xc9\xb6\xb2\xb5\xd8\x13\x11\xed\x81\xb0\x87\x56\x38\x63\x30\xcc\x61\xd4\xcd\x7d\x09\x2a\x65\x7d\xcb\x17\x7d\x5c\x7a\x96\x91\xb1\xd4\x6b\x23\x4a\x57\xeb\x9a\x1b\xcf\x08\xaa\xd1\xca\x20\x26\x48\x19\x70\x18\x24\x04\xc6\x61\xe4\x84\x53\xd4\xe2\x28\x41\x5a\xe4\x22\x35\x24\x70\xe0\xb9\x03\x5f\x25\x2d\x11\x61\xec\x2d\xc2\x20\xe5\x3e\x83\x67\x85\x99\xa0\xb2\x9f\x62\x6a\x5e\x10\x88\x78\x8b\xca\x10\x13\x71\xc4\x5d\x06\x09\x05\xc3\x08\x55\xc7\x31\xb2\x85\xe3\x54\xb3\xa5\x44\x8b\x53\x9f\xc1\x98\x82\xf9\xaa\x7f\x42\xb0\x52\x5f\xa7\x39\xb0\xa5\x56\x77\xb3\x02\xca\x89\xb9\xeb\xca\xed\xe2\x79\x01\x2d\x95\xf7\x05\x61\xc6\x41\x56\xa1\x4d\x85\x70\x44\x2a\xe2\x11\x2a\x0b\x0c\x76\x09\x37\x11\x71\xea\xd9\x58\xb8\x16\xc1\x53\x61\x0d\xbd\x74\x6b\x9c\x88\x58\xe5\xac\x1e\x84\x01\x6a\x43\x6d\xa4\xd7\x6a\x9f\x6a\xb5\x4f\x64\x20\x49\x3e\xa1\x96\xbc\x35\x4e\x3d\x9f\xc1\xde\x0a\x51\xfe\x30\x98\xec\x9a\xac\xf6\x89\x5b\x28\x8e\xec\xf4\xbb\xb2\xad\x4c\x09\x6b\x2b\xc5\x79\x46\x90\xf0\x7d\x2f\xc2\x72\xee\x53\x62\x9f\xd4\x3d\xa1\x39\x11\x71\x79\xc6\x60\x41\x61\xb9\x7a\x39\x90\x5c\x08\xa8\x4c\x6c\x34\x89\x2c\x95\xf7\x43\x49\xd6\xd9\xd8\x25\x52\x32\x71\x15\x6f\x8b\x60\x59\x5d\x47\xc4\x5a\x58\xd8\xd5\x18\x7c\x23\x9c\xeb\xf5\x19\x1c\xcb\x20\xae\xb9\x50\x8e\xf4\xe3\x70\xc4\xe0\xa4\x8c\x4c\x43\x06\xa7\x65\xd4\x6c\x87\xc1\xd9\x12\xea\x33\x83\xf3\x32\x6a\xbe\xc3\xe0\x62\x09\xf5\x99\xc1\x25\xa1\x9e\x12\x06\x57\x14\xf2\x2d\x9f\x41\x87\x82\xda\x28\xd2\x25\x88\x24\x00\x83\x1e\x01\x29\xad\xef\xaf\x31\xfc\x49\xca\x72\xa5\x2c\xf1\xc8\x4b\x72\x01\xcf\xe0\x86\x58\xfe\x62\x70\x4b\x01\x3b\x8c\x05\x56\x64\x2a\xe2\x00\xe5\x7e\x7b\x57\x23\xd3\x30\xc4\x25\x7f\xcd\x4e\x12\x06\x7b\xbb\x26\xdb\xae\x6c\x33\xb8\xc3\x58\xa8\x51\xff\x56\xf9\x8d\xc1\x3e\xa2\xff\x87\xc1\x3d\x61\x51\x73\xda\xdb\x66\xf0\x1e\xa1\x9d\xda\x1f\x0c\x78\x80\xa1\x4f\x0c\x0e\x76\x4d\xb6\xb3\x8d\xac\x16\xa1\x3e\x47\x69\x05\xd7\xfe\x49\xe5\x4c\x4c\x2b\x57\xe1\x88\x07\x0c\x0e\x91\xe9\x3f\x28\x59\x8e\x30\x24\x70\x4a\xfe\x86\x21\x44\xd9\x14\x2f\x9a\x55\x92\xd0\xf7\x9c\x8a\x17\xf4\x43\xd9\x84\x1b\xc7\xbb\x26\xfb\xcc\xc0\x41\x86\xcf\x52\x32\x9d\x20\xca\x61\x70\xba\x6b\xb2\xdf\x18\x08\x24\xfd\xf6\x79\x7b\x93\x41\x9f\x82\x5f\x6a\x5f\xbe\xfc\x0f\x03\x17\x81\xff\xd4\xfe\xc3\x60\x40\x21\xcc\x9f\x47\xa1\xcf\xff\x61\xf0\x44\xa1\x5f\x77\x18\x0c\x65\xe8\x73\x6d\x9b\x81\x2f\xc3\xbf\xd6\x76\xfe\x5b\xfb\xc2\xe0\x6c\xd7\x64\xbf\x33\x38\xdf\x35\xd9\x7f\x19\x8c\x90\x88\xca\xd7\x1f\xdb\x0c\x02\x04\xbe\x60\x9c\x90\x42\x98\xfa\xc5\xae\xc9\xea\x15\x06\x11\x62\xea\x23\x06\x97\x88\x18\x8d\x18\x3c\x13\xe6\x85\x41\x8c\x81\x06\x6d\x55\xd4\x2b\x4a\x63\x6c\x48\x73\x45\x7d\xbb\xd1\x0f\x83\x74\x8b\x5a\xbe\xce\x20\x21\x56\x42\xc9\x9d\xd4\x3a\x83\x94\x70\x03\x0d\x8e\x09\x44\xb1\xd5\xf7\xc3\xe9\xd6\xbc\xce\x60\x42\xa8\x24\x0d\xa3\xad\x30\xe2\xb6\x97\x22\x72\x4a\x48\xac\xd1\x2d\x47\xd8\xa1\xd4\x1f\xea\x0c\x66\x84\x97\xb3\x0c\x83\x39\x42\x7f\x56\x18\x5c\xed\x9a\x4c\xcd\x29\x0c\x3a\x04\xe0\x4c\xc3\xa0\x4b\x61\x9a\xc6\x18\xf4\x24\x80\x13\x0e\x83\x6b\x02\x7c\xef\x2f\x06\x0b\x4a\xe6\x93\x5c\xfc\xfc\xc5\xa0\x19\xd0\xea\x30\x9f\x0b\x19\xdc\x10\x77\x12\xf1\x00\xbb\x2a\x01\x29\x26\xb9\x2b\xa3\xa6\x83\xbf\x18\x6c\xb4\x14\x10\xff\xf5\x77\xc0\xa0\x1d\x70\xf3\xe3\x9f\x5f\x67\x23\xbf\xa2\x54\x24\xec\x85\xdb\xec\xeb\x5f\x1f\x61\x8f\x68\x98\xdf\x8a\xac\x4a\xb5\x14\xd8\x66\x0a\xd6\x2b\x91\x6d\xf6\x11\xf6\x29\x59\x35\x95\xfc\xc5\xe0\x80\x22\xeb\x79\x98\xc6\x51\x33\x16\x3c\x5f\x38\x1c\x96\x18\x62\x81\x4a\x97\x88\x93\x9c\xe1\x88\x18\xc4\xc8\x12\x0e\xdd\x22\xa4\x35\xb6\xaf\x16\x81\x9f\x66\x5b\xc9\x20\xb4\x87\x53\x3e\x11\x5b\x7d\x5c\xe1\xaa\x85\xcf\x47\xb8\xc3\x82\xab\xca\xfc\x46\x69\x60\x65\xaa\x75\xdb\xc4\x64\xe3\x38\xa8\x27\xf6\x40\x8c\x78\xb2\x35\xf2\xec\x38\x4c\xc2\x7e\xba\x65\x87\xa3\xfa\x64\xe4\xe3\x02\xe7\x78\x29\xd2\xdb\xcb\x3c\xb2\x81\x7e\x84\x93\x2c\x02\xa9\x0d\x5a\x1f\xa9\xfc\x49\x93\xcc\x5f\x07\x24\x53\x2a\x25\x55\xa6\xd2\xbc\x38\xfa\xf3\x93\xa4\x13\xab\x6c\x44\x55\x50\xec\x52\x9f\x9e\xf8\x84\x4b\xec\x4f\xd7\x74\x4f\x09\x8f\x3c\xf6\xd7\x92\x56\xf4\x0f\x09\xfe\x55\xd4\xbc\x70\xc9\xbc\xaa\xdf\x41\xe5\xef\x8f\x3b\xf8\xf3\x23\x52\x17\x73\xeb\x95\x87\xbf\x3f\x7e\x84\x8d\x53\x2a\xae\x47\xe6\xa6\xc2\xea\x91\xb0\x6a\x6d\x2e\xd7\xf1\xe7\x84\x8a\x78\xcc\x47\xd9\x22\xf5\x62\x05\x47\xad\x37\xe1\x71\x52\x58\x7b\x5e\xae\x70\x8d\xc2\x89\x27\x0a\x1c\x57\xc4\xf1\xf3\x42\x7e\x84\x8e\xe4\x8a\x78\xa0\x33\x2a\x65\xc4\x47\xb8\xc7\x5e\x42\xb8\xbf\x2a\x93\xbf\xff\xae\xff\x6f\xe5\x47\xc5\x12\x03\x3e\xf1\xc2\xb8\x3e\x8e\xfd\x6a\x71\x11\x63\x34\x5e\xff\xfc\x24\x99\x19\xbc\xc7\x98\x34\xae\xba\xd4\xe7\x69\x58\xf1\x96\xf9\x11\xb3\x65\xb5\x4c\xd6\xac\x30\xe8\x21\xa9\x29\xdf\x53\xae\x31\xb8\x96\x60\xca\xad\xb1\xcf\xe3\x4a\x2c\xa2\x58\x24\xda\x26\x58\x09\xfb\x95\x74\x20\xe4\x93\xcb\x5e\x40\x61\x1d\x51\x60\x7a\x5d\x06\x37\x94\x80\xd2\x0a\x3a\x29\x4f\x93\xd3\xd0\x11\x3e\x83\x5b\x22\x90\x3a\x79\xcb\xe0\x8e\x20\xc7\xa9\xa4\x61\xc5\x93\xfd\x8e\xc1\x3d\x21\x7d\x5f\x7e\x40\x1a\x5c\x12\xfd\xd1\x84\x1a\x51\xc4\x9e\x48\xb2\xa7\xee\x8a\x24\x8a\x23\x27\xca\x8d\xf7\x59\x42\x64\xbb\xf9\xc7\x08\x7d\xcc\x3c\x0e\x7a\x70\x29\xe4\xa1\xde\xc4\x43\x6e\xb2\x5d\x06\x83\x96\xc9\x76\x9b\xad\xe3\x83\xab\xf3\xde\x59\x9b\x81\x45\xf8\xf3\xf6\x1d\x03\x0f\x49\xd8\x21\xc0\x26\xa4\xe7\xfb\x52\x0d\x6e\x99\xac\xc5\x60\x88\x3f\x7b\x27\xb8\xb4\xc4\xd0\xf9\x49\xef\xf4\x8c\x81\x83\xac\x12\xf8\x7e\x74\xd6\xde\xbb\x65\x30\x22\xf2\x29\x83\x16\x05\x7a\x67\xdd\xab\xa3\xbd\x0e\x03\x41\xac\x3c\xb0\xb1\x02\xfb\x04\x60\x75\x57\x42\x6d\x33\x76\x09\xa7\xb4\xad\x01\x01\xbe\x67\x0f\x19\x78\x59\x18\x6b\x58\xcc\x22\x1e\x38\x95\x92\x89\xfb\x49\x72\x90\x02\x3a\xa4\xb0\xb4\x52\xb7\x5b\x14\xc4\xaa\x67\xb0\x47\xc0\x28\x0a\x03\x11\xa4\x99\xc5\x4c\xc9\x40\x54\xe8\x65\xc4\x20\x49\x7f\x30\x18\x49\x20\x9a\x6f\x5d\xf0\x44\x3d\x9d\x5a\xb1\x43\x47\x60\x16\x78\x50\x39\xec\x9e\x9e\x54\x22\xee\xe2\x4a\x99\x58\xc7\x71\x2c\x82\x14\x67\xcc\x10\xe1\xf6\xf9\xe9\x69\x38\x4e\x44\x87\xb6\x9d\x19\x44\x84\xc4\x56\x92\xaf\x60\xe9\x1e\x51\x63\xf0\x9c\x91\xa8\x65\xd5\x5b\xd5\x15\x9e\x56\x7c\xc1\x93\xb4\x92\x4e\x8b\xdc\x1b\xfb\x2d\xc5\x4d\x6b\xdc\x8a\x57\x32\xaf\x31\x88\x29\x35\xcb\x57\x75\x97\x10\x18\xf3\xa9\x17\xb8\xdf\xf7\x51\x78\x7c\x67\x90\x22\x72\x8f\xdb\x03\x39\xb2\x13\x95\x7c\x65\xc4\xe7\xd8\xb1\xfa\xa1\xef\x87\x53\xe1\x54\xac\x79\x25\x0c\x44\x25\x8c\x29\x0f\x79\x8d\x67\xd9\xd1\x11\x03\x3a\xff\x5e\x61\x30\xa6\x94\xb5\x8e\x7c\xd0\x32\x19\xd9\x8c\x27\x84\x0e\x9c\x6e\x48\xe0\x94\xc0\x38\x0e\xe3\xca\x74\xe0\xf9\x82\xac\x8e\x5e\xe0\x56\x94\x64\x61\x30\x23\x8e\x59\x14\xc6\xa9\xec\xdb\x3c\xa9\xb4\x3a\xd7\x0c\xe6\x6b\x08\xd8\x16\x0c\x16\x21\x37\x3f\xee\xd3\x0d\xba\x8a\x2b\x42\x3b\xa4\x14\xd9\x47\x68\x62\x94\x7d\x2f\xa6\xba\x95\xe5\xd4\xaf\x4b\x96\xed\xa1\x0c\x76\xd7\xb3\xea\x26\x71\x78\x2a\x00\xab\x03\x03\x15\xec\x85\xa9\x37\x12\x35\x06\x2d\x8c\x77\x70\x7d\x74\xdf\xbc\x6a\x55\x18\xb4\x25\xe8\x2d\xb0\x75\x0e\x62\xc1\x51\xa8\xec\x11\x32\xcb\x58\x5f\xe6\xb4\x1f\xc6\x15\xae\xa5\x44\xa4\x0c\xe8\xfb\xc4\xba\x66\x02\x63\xb0\x71\x90\xd3\xbe\x2f\xd1\x0e\x89\x24\x17\x24\x47\x18\x3e\xdc\x6b\xb6\x19\x7c\xa3\xe0\x61\x7d\x34\xaa\x9c\x9e\x9e\x9e\x56\x1c\x07\x94\xad\xfb\x38\xa3\xd4\x51\x75\x3e\x29\x82\xb5\x4e\xa7\xc3\xe0\x94\x50\x54\xbf\x67\x14\x44\xfd\xec\x28\x60\x70\x9e\x41\xe7\xe3\x94\xc1\x05\x82\x47\x72\xf7\xf3\x12\xc3\xdf\xb2\x19\x81\x46\x0d\x83\x2b\xc2\x26\xf2\xfc\x67\x85\x8e\x9b\x57\xaa\x34\xa0\x7e\x61\xd0\x41\xe2\x49\x85\xc1\x61\xcb\x64\x27\x47\x0c\xba\x84\xc0\xde\xaf\x5a\xa8\x6c\xc8\x16\x41\x38\x76\x07\x65\xd1\x5a\x1d\x79\x49\x42\x4d\x0e\x47\x98\x0a\xad\xc5\xbe\xa9\x50\xc2\xa0\x87\x49\x9e\x56\x18\x5c\x53\x60\xaf\x7b\x75\xde\x61\x70\xdc\x32\xd9\xe9\xe9\x29\x83\x13\x19\x28\x56\xcf\x0d\x31\x6a\x39\x78\x4b\x10\x8e\xe9\x36\xad\xcc\xef\x32\xb8\x17\x31\x38\x6d\x99\xec\x4c\x3e\xe0\xcf\xe0\x1e\x49\x0a\x92\xa3\x34\x8a\xc3\x89\xe7\x90\xf9\xfb\x3d\x12\xcf\x8f\x19\xf0\x08\x03\x81\x2f\x07\x59\xa1\x2c\x95\xa9\x97\x0e\x2a\x71\xe8\x8b\xca\x47\xb5\xb6\xf9\x58\x89\x44\xac\x67\x0c\x2f\xc1\x2e\x83\x23\x94\xc1\x86\x45\xa9\xa4\x03\x5c\xed\xdb\x18\xbe\xb8\x3a\xbf\x3e\x3a\x6b\xa1\xc8\x75\x08\xa6\x85\xe8\x59\xcb\x64\x17\x9e\x60\x20\x08\xe7\x8f\x5d\x6c\xc5\x3e\x01\xb1\x98\x78\xe1\x38\x51\x99\x77\x8b\x38\x94\x67\x03\x89\x08\x47\x5e\x22\x2a\x36\x49\x81\x4a\x2c\x92\xd0\x9f\x90\x30\xf4\xd2\x44\xf8\x7d\x06\x1e\xb1\x8d\x2d\xdf\x4b\x06\x88\x9f\x0a\x4b\x09\xc8\x27\xa4\x5c\x8e\xb9\x13\xeb\xba\x1c\x22\xe6\x6a\xef\xe0\xe8\xfc\xac\xc3\xe0\xbc\x65\xb2\xab\xf3\x1b\x06\x17\x32\xa0\x67\x12\x9f\xb8\xe4\x96\xbe\x0c\xd2\xed\x68\xe1\x54\x46\x3c\xca\x7b\x84\x98\x79\x09\x0e\xb0\x80\x78\x50\x39\x56\xb2\x2f\x44\x44\xa7\xc7\x20\x92\x81\xdd\xec\x8b\x97\x2d\x82\xbb\x77\x17\x7b\x0c\xae\x10\xb0\x69\x61\xc9\xe0\x99\x58\xb5\x18\x8a\x15\x44\x22\x3c\x21\x00\x97\xea\x4b\xdf\x96\xea\x83\x97\x54\xc8\x18\x50\x63\x90\x4a\x4e\xa5\x29\xcb\xbd\x20\x06\xe3\x12\x96\x90\xb5\x32\xc8\x60\xf2\x8f\x3c\x35\x06\xd3\x88\x9b\x1b\xff\xc0\xf5\x3b\x83\xd9\x3f\xa7\xf5\x5f\x06\x73\xe2\x22\xe7\x33\x4d\xb9\x5b\xb8\xc8\x31\x07\x31\x8f\x06\x9e\xcd\xa0\x83\x75\x24\xb7\x36\x9b\x44\xc6\x30\x49\x40\x11\x38\x4a\x6e\x65\x62\xf5\x73\x9b\xc1\x6e\xc6\xa5\x64\x7e\xab\x80\x50\x29\x75\x5b\x26\xeb\xb6\x19\xf4\x5a\x7a\x03\xbc\x8d\x4c\x5d\xd4\xc4\xd4\xa0\x46\x95\x26\xaf\x6d\xf2\x64\x22\x95\x9e\x71\x14\xd1\xfd\x26\x39\x6e\xfa\x74\x83\xab\x56\xe9\x08\x91\xd9\x52\xe5\x4c\x85\xf2\x35\x67\x96\x7c\x38\x8d\xee\xe9\x2f\x95\x14\x70\x3d\x9b\x4a\xd5\x60\x2e\xb0\x5b\xed\x13\xa7\x3c\x58\x8e\x04\x7b\xa0\xc4\xf6\xca\xa4\x75\x8d\xe5\x08\x19\x1c\x50\x0c\x54\x2c\x7c\x2f\x10\x28\xd5\x24\x42\xf7\xfe\x23\x04\x7b\xc7\x0c\xbe\x51\xe0\x84\xc1\x4d\xcb\x64\xbd\x0e\x83\x5b\xfa\xdd\x62\x70\x4c\x94\xee\xfe\xd6\x1f\x0c\x4e\x28\x4c\x07\x1f\x70\x5c\x25\x22\xad\xc8\x33\x13\x15\x5b\x6b\x33\x0c\x36\x4e\x25\x97\x98\x45\x64\xa8\x2b\xcf\x6c\x28\x69\xe9\xf7\x17\x06\x67\x92\x71\x18\x84\xd3\xa0\xe2\xc6\x3c\x40\xe5\xd8\x4b\xe7\x35\x06\x77\x2d\x93\xd1\x0d\x0d\x06\xe7\xc8\x75\xbd\x76\x03\xf0\x02\x49\x37\x4d\x06\x97\x14\xa0\x03\x2e\x49\xa5\xb5\xc7\xe0\xbe\x65\xb2\x5b\x06\x57\x88\xbf\x63\xd0\xa1\xdf\x70\x1c\x57\xac\x38\x9c\x26\x22\xce\x5b\x52\x35\x89\xd4\xb8\x13\x06\xef\x5b\x26\xfb\xce\xa0\x8b\x31\xbe\x37\x77\x3b\xdd\xab\x66\xab\xfb\xfd\x6a\xef\xac\xbd\x77\xb5\x77\xf5\xfd\xa8\xfd\x9d\x41\x8f\x88\xdf\x19\x5c\xcb\x40\xfb\xa8\x73\xd1\xeb\xee\xb5\x11\x75\xb3\x8c\x6a\xe2\x88\xbd\x95\x58\x2f\x48\x45\x1c\x70\xff\x3b\x83\x3b\xc2\xd8\xca\xd8\x9d\x7c\xaf\x31\xe0\x6d\x93\x7d\x57\x06\xd6\x13\xb5\x13\x6f\x21\x4e\xdb\x3c\x35\xf2\x9e\xe2\xa6\xba\x5d\x19\xbc\x47\x84\x2c\x81\xb2\x21\x33\xe0\xcf\x39\x2e\x37\x1d\x5b\x45\xac\xbe\xf2\xc4\xc0\x5e\x42\xc7\xa1\xcf\x60\xc3\x29\x62\xe9\x0e\x4f\x96\xba\x28\x90\xfa\x3e\x4f\x33\x82\xdd\xce\xf0\x5e\x80\xb9\xdb\xb2\xfc\x10\x65\xa0\xb3\x9e\x50\x61\xd0\x2f\xa4\xe5\x7b\xc1\x30\xff\x48\x1e\x65\x24\x82\x31\x03\xb7\xc0\x89\x98\x8c\x73\xb0\x44\xc0\x35\x38\xf9\x07\x5d\xc2\x7b\xa9\x18\x31\x78\x5a\x83\xdd\xe2\x36\xad\x07\x86\xeb\x68\xa3\x40\x8c\xc2\xc0\xb3\xb7\x12\x81\x8b\xd2\x14\x35\xfa\x7e\x39\x73\x05\x8a\x5f\x4c\x22\x74\xb8\x1f\x85\x11\x6a\x42\x1b\x6e\x1e\x25\x54\xa6\xfd\x51\x81\x57\xe2\x0a\x16\xee\xa0\x40\xd4\x47\xca\xc2\x12\x2e\x9e\x88\x98\x80\x2d\x6f\x44\x33\x5c\x54\x24\xfb\x9e\x23\xe2\x82\x45\xff\x79\x0d\x31\xe6\xae\x4b\x47\xd2\xe2\x55\x62\x3a\x18\x8f\xac\x02\xcb\xa0\x9d\x1f\x47\x4a\x90\x5d\x02\xc9\xa9\x08\xc6\xd9\xc9\x4f\x94\x9f\x1d\x69\x66\x4d\x97\x79\xd2\x9c\x36\x5e\xa2\xed\x05\x74\x5a\x6f\xb2\x0e\xad\x66\xd1\xe9\x3a\x5a\xa6\x07\xce\xde\xa4\x92\x5e\x38\xd7\xe4\x09\x1d\xdf\xf0\x54\x51\x26\xc2\x11\x89\x2d\x02\x87\x93\xec\x7a\x6a\xd3\x81\x11\x06\x0b\x62\x77\x1c\x3a\x25\x92\x54\xa4\xd9\xb4\x49\x48\xc1\x60\x97\x02\xfd\x54\xc4\x03\x0f\x55\xca\x56\x06\x27\x83\x70\xca\xa0\x4d\x70\xee\x33\xba\xcb\x63\x57\xa4\x0c\x86\x98\xbc\xef\xcb\xbb\x67\x9d\x71\xbf\xef\xcd\x18\xec\x11\x33\xaa\x51\xd9\x1d\x44\x3a\xe0\xc7\xe3\x39\xd6\x65\x6b\xdc\x0f\xfb\x7d\x06\x3e\xc5\x9d\xf2\x39\xaa\xe5\x32\x0a\x02\xe7\xe3\x34\xa1\x3c\x1c\x10\x2e\xa0\x25\xff\xa1\x0c\x7b\x23\x2a\xeb\xa8\xad\x01\x6a\xb9\xa0\x08\xd6\xf2\x43\x3d\x47\x79\x24\xba\x87\xc9\x13\x6a\xf4\x6f\x65\xf4\x88\xcf\x68\xf1\x96\x5c\x88\xb8\x23\xec\x10\x67\xd4\xe3\x12\xcb\x9e\x8a\x78\x52\xc2\xf6\xbd\xc0\x43\xbd\xe2\xb4\x8c\xc5\xa4\x34\x29\x6c\x17\xcf\x8b\x31\x38\x93\xac\x1a\x51\x63\x70\x5e\xc6\xa8\x7e\x71\x51\xc6\x66\x3d\xe2\x72\x0d\x9e\xfa\xc2\x55\x99\x90\xd4\x96\xaa\x72\xa3\xb3\xcc\x60\x85\x33\xd5\x6f\xbb\xcb\x24\x3a\x80\xb9\x9c\x42\x6f\x3d\x57\x9e\xcc\xf5\x7a\x86\x81\xe7\x0e\xc8\x79\x24\x4f\x52\x06\x37\xeb\x99\x92\x54\x8c\x94\x59\xe1\xf6\x6d\x8e\x13\x11\xb8\xa8\x6f\xdf\xbd\xc5\x42\xf9\xb8\x5f\x4f\x2d\x0c\xd4\xf7\x2b\x1c\x34\x9f\x17\xca\xc2\xe3\xf5\x1c\x85\x7c\x5a\x3f\x61\xd1\x19\xb5\xdf\xe4\xa1\xaf\x38\x6f\x90\x0b\x59\x15\xcb\x2c\xe5\xea\xec\x2f\x93\x0b\x19\x74\x63\xd4\x64\x97\x89\x3a\x6b\x83\xd5\x98\xf4\xc1\xa8\x5d\x46\x17\xf2\xf2\x5c\x22\x49\xf9\xe1\xc9\x64\x52\x8f\xfb\x1e\xa7\x5d\xd4\x27\x89\x99\x33\x88\x91\x3f\xb6\x19\x24\x6d\x79\xb0\x8c\xc1\x90\x88\xb1\xe0\xa8\xc8\x2b\xec\xb9\xdc\x7d\x60\xe0\x4b\xa2\xc7\xb7\x56\xc5\xd8\xb8\xad\x48\x03\xcf\x71\x44\xc0\x60\xa2\x11\x74\xc0\x8f\xc1\x54\xc1\x3e\x83\x11\xa5\x93\xa6\xdc\x1e\x28\xfd\x38\x28\x62\x94\x82\x3c\x6b\xeb\x33\x70\x21\x51\x67\x5e\xb2\xbb\x7c\x10\x33\xd2\x14\x52\x53\xb4\x2b\x03\x5c\xc9\x68\x42\xd7\x4b\x7d\x91\xe4\x67\xef\x62\x4d\x48\x69\x1c\xcf\xdb\xe5\x03\x81\x09\x92\x73\xc4\x96\x2d\xbf\xb3\x68\xaf\x39\x05\xda\x5c\x45\xd2\x35\x38\x06\xa9\x4c\x25\xae\x31\x18\xab\xa0\x3a\xfe\xba\x4b\x71\xe2\x84\xc1\x46\x8b\x82\x89\x90\xea\x54\xbb\x00\xa9\xf4\xf7\x10\x25\xfa\x61\x2c\x70\x3a\x64\xb0\x9f\xc1\x72\x06\x38\xc8\x60\x39\x03\x4c\xe8\x53\x82\xce\xcb\x4e\x29\xdc\xc7\xff\x18\xcc\x08\x70\x19\x1c\x62\x8c\x81\xcb\xe0\x88\x02\x09\x83\x6f\x18\xf0\x39\x56\xc5\x31\x05\x51\xfd\x3d\x69\xeb\x13\xb1\xa7\x18\x0a\x7d\x87\xc1\x9c\xd2\x08\x7d\xa7\xc2\xe0\x8c\xb0\xea\x70\x7e\x16\x96\x9b\xe7\x0b\xc9\x87\x88\xfa\x76\x43\xef\x5d\x6f\x71\xdf\x73\x83\xba\x15\xa6\x69\x38\x6a\x30\xb8\xa0\x58\x08\x30\xb8\xcc\xc2\x5b\x49\xc4\x6d\xc1\xe0\x2a\xc7\x60\x02\x0c\x3a\x19\xe2\xbb\x3c\x69\xd0\x94\x5f\xa1\x26\xeb\xb6\x55\x30\x61\xd0\xa3\xf0\x8c\xc1\xae\x64\xd0\xe2\xa2\xa5\x40\xd5\x0a\x6d\x05\x8a\x84\xc1\x35\x46\x89\x19\xdc\xe0\xef\xd8\xa2\xfd\xfa\x3d\xa2\x13\x50\x0b\x75\xef\xdf\x2f\x20\xe5\x39\x58\x06\x07\x05\x5c\x61\x20\xde\x66\x69\x25\x0c\xee\x08\x90\x3a\xe3\x7d\xdb\xdc\x60\xd6\xc4\x65\xf0\x1e\xb1\x93\x84\xc1\x21\x26\x81\x3a\xf9\xd1\x68\x24\x1c\x8f\x66\xcf\x23\x8d\xb3\xa8\x65\xf8\x1e\x42\xd2\x76\x6c\xc9\xb0\xe3\x0b\xd5\x83\xbf\x49\xde\x0c\x53\xeb\x73\xba\xd1\xa4\x3a\xd1\xf1\x32\x79\x40\xf6\xcd\xa3\xe4\xca\x53\x53\xe6\x32\x43\x4c\x04\x15\xdd\x2e\x7f\x2e\x61\xe0\x48\xcc\x84\x27\x0c\x04\x85\x53\xe1\x86\xa8\x47\x9d\xca\x94\x24\xa8\xe6\xc9\xb3\x22\x2e\xb7\x9f\xad\x60\x69\x8e\xec\x17\x92\xa3\x55\x35\x03\xb7\x80\x4a\x44\x80\xa3\x78\xe2\xa5\x73\x29\xac\x2e\x28\x19\x75\xb2\x6c\xb0\x27\x0f\xc2\x33\xf0\xf6\xf2\x7b\x1f\x97\xc4\x42\x40\x76\xb2\xb8\x49\xe3\xb5\x4d\xf6\x9e\xa7\x3d\x52\x40\xe9\x28\xfd\x50\x86\x63\x6e\x53\x54\x7f\xaf\xb8\x89\x08\xa3\x22\xb8\x7c\xa9\x8d\x41\x50\x22\x0f\xd4\x99\xee\xb0\x84\x95\x7d\x77\x23\x2a\x21\xe9\x88\xf0\x73\x09\x35\x95\xbd\xf4\x2a\xd6\xda\xb1\xaa\xcc\x4e\x86\xc8\x4d\xdc\xdd\x1c\x47\x42\xa2\x57\x82\x49\xb8\x5e\x97\x50\x4a\xba\xde\x64\xc8\xac\x55\x6e\xcb\x28\x6a\x92\xbb\x0c\x57\x30\xfe\xdd\x97\x91\xa7\x74\x50\xfe\x7d\x19\xd9\x8b\x18\xf0\x44\xa3\xb2\xa3\xf1\x56\x86\xba\xf0\x02\x1b\x67\xe0\x32\x82\x32\xec\x94\x71\x2a\xc7\x22\xc3\x16\xcd\x5c\xfd\x0c\xab\x2d\x55\xb1\xae\x4b\x79\x97\x22\xd1\xa0\xec\x33\x6e\xc6\x2f\x1c\x8f\x96\x4e\x29\x31\xd8\x21\x83\x81\xa4\x39\x0c\x3c\x15\xf2\x19\x3c\xc9\xa0\xc0\x8f\x8d\xf7\x54\x90\x64\xcc\x44\x43\x38\xab\x0e\x25\x1b\x2a\xcd\x32\x84\xf3\x9c\x0a\x39\x0c\xa6\x7b\xe6\x06\xb3\x51\xe2\xce\x28\x56\xca\x20\x90\xd4\x14\xbb\x89\x0c\xce\x7c\x06\x91\x0a\xe2\xf2\x01\x39\xd5\x8e\xd0\x62\x4f\xdd\x5f\x72\x44\x9f\xc1\x33\x31\xf9\x82\xe3\x2c\x44\x14\x2f\xda\x92\x67\x6e\x62\x49\xf2\xa2\xac\x0f\x26\x19\x46\xf5\xab\x34\x43\xcc\x18\x8c\x33\x00\x57\x42\x1a\x90\x66\xd3\x5d\x95\x74\x84\x05\x9c\x4a\x5a\x88\x93\x55\x6b\x2f\xbb\xcf\xd2\xd6\x41\xe7\x62\xc0\x11\xb1\xb7\x47\x3b\x9e\x5b\xb1\x90\x37\x73\x66\x14\x4f\x9d\x09\x63\xb0\xbf\xa7\x36\x44\x19\xcc\x15\x25\x8c\x3f\x33\x58\x64\x40\x73\x46\x27\x61\xe4\x6d\x81\x66\x19\xed\x0b\x57\x04\x4e\x4d\xee\xb8\xc8\xe9\x9e\xc1\xee\x5a\x9e\x28\x9b\xf2\x5b\x6b\xe9\x05\x71\xdd\x2e\x33\x8c\xf8\x4c\xd9\x81\xf6\x96\x08\x5e\xa0\x08\xfb\x65\x82\xbe\x6f\x75\xb0\x0e\x2d\x2d\x83\x41\x98\xef\xa4\x04\x63\xba\xaf\xb3\x71\xa0\xeb\x62\x17\x1b\xf2\x30\x8b\x6c\x11\xa8\x89\x09\x83\x23\x45\x92\x5b\x79\xdf\x24\x14\x04\xc2\x4e\x3b\xa9\x88\x90\x61\x4f\x5d\x22\x98\xa5\xd2\x6a\x71\xac\x78\x52\x2f\x90\xf7\xbd\xbe\x11\x47\x1c\x88\x18\x57\x16\x38\x95\xa2\x34\xaa\xc5\x33\x06\xc7\x6f\x90\xe6\x0c\x4e\x56\x48\x74\xa8\x8f\xa2\x9d\xbe\x45\x9b\x33\x38\x2b\xd0\x90\xf7\xbc\x08\xcf\x19\x5c\x14\xe0\x34\x8c\xb2\xac\x5c\xae\xc3\xcf\x19\x5c\x95\xf1\x79\x26\x3a\x6b\x09\x73\x06\xdd\x3d\x75\x79\x4b\xde\xed\x38\x91\xf5\xa1\xe0\xef\xa8\xa0\x9e\xe6\x28\xcc\x31\x41\x71\x98\x24\x03\xee\xc5\x35\xd5\x45\xcf\xcb\x58\x65\x28\xd3\xd4\x8b\xf5\xd4\x4c\x63\xb8\x7c\x83\x5e\xbc\x9b\xb3\x71\x55\x66\xca\x22\x77\x96\xf0\xc5\x48\xdd\x32\x4d\x5b\x6f\x74\xbe\x7a\x6f\x90\xb3\xb4\xaf\xdf\x62\x28\xdd\x1a\x2a\x33\xa5\xb1\xe7\xba\x38\x2f\xde\x12\x3e\x99\x30\xb8\xa3\x10\x5d\xd0\xab\xab\xa3\x0b\x8d\x37\x8f\x27\x6e\x8d\xc2\xc5\x56\x98\xcc\xb6\xe4\xd1\xa8\x51\x18\xa6\x03\x2f\x70\xeb\x6e\xcc\xe7\x74\x0f\xad\xc1\xa0\xb7\x47\xe9\xe1\x74\x72\xad\x83\x52\x8a\xdf\xcb\x4f\xe1\xc4\x85\x84\x19\x83\x5b\xfc\x9d\x33\xb8\xdb\x33\x99\x43\xdb\x07\xef\x91\xc7\xe1\x69\xbe\x60\xe1\xa9\xc2\xf8\x22\x49\xae\x84\x8b\xeb\x77\x59\x45\xf7\x14\x2b\x15\x5a\x86\xbc\xdf\xcb\xae\x35\x5a\x2a\xd2\x78\xa4\xa6\x18\x3b\x43\x64\x53\xa5\x53\x46\xd1\x54\x29\x24\x6e\x9e\x30\xe0\xfb\x26\x73\x2c\xdf\x56\x53\x14\x11\x44\x6e\x08\x72\x53\x5c\xf8\xa9\x3b\x3a\xd6\x3e\x5d\xf2\x94\xc7\x61\x07\x92\x95\x20\xad\x81\x49\x7a\xc2\xc0\x93\x44\x37\x16\x82\xc1\x93\x04\x50\x11\x9d\x33\x18\x4a\x28\x15\x76\x2a\x4f\x26\x81\x83\xd1\x3c\xee\x87\xae\xb6\xe2\xf9\xc4\xe3\xf1\x11\xd9\x4f\x04\xd1\xfb\xfd\x5a\x20\xa6\xa8\x0a\xe5\x9d\x63\x24\xf9\x0a\x24\x7d\xc4\x30\x8a\x05\x59\x8f\x82\x15\x0e\x9a\x59\xf6\xb9\x4d\x13\x6a\x98\x91\x43\x9f\xd4\x2c\xdd\x2f\xfb\xfb\x4b\xf8\xec\x9b\xd1\x4a\x94\xe5\x6f\xba\x14\x37\x91\xe7\x69\x9f\x25\xbb\xb6\x31\xc6\x0a\x8c\x7c\x3e\xaf\xd3\x96\xe3\x16\x6a\x82\x0d\x75\xf5\xb5\x5e\xd9\xd6\x07\xf3\x2a\xdb\x0d\xb5\x36\xa9\x6c\x33\x48\x56\xe2\x35\xf4\xac\x51\xe7\x56\x12\xfa\xe3\x54\x64\x89\x6c\xe7\x87\xfb\xf4\xf2\x86\x41\x5a\x48\xa1\x59\x3c\x93\x31\x2e\x10\xda\x3c\x15\xbb\x3c\xee\xe4\xd6\xda\x8d\x49\x81\x7c\x42\xf3\x51\x3b\xa4\xcb\x63\x2b\x78\xed\x33\x6a\x56\xa0\x9c\xd2\x9e\xf2\x60\x3f\x43\xd0\x35\x56\xa9\xdf\xd2\xc4\x5a\xe0\xbd\x0f\xc3\xd1\xae\x3e\xe2\xbd\xd0\x84\x31\xd9\x7a\x3d\x4a\x01\x47\xdb\x13\x86\xc2\xbd\x59\x14\x8b\x24\x51\x17\xb6\x18\x34\x89\x9d\x54\xbe\x21\x32\x90\x82\xb9\x4b\xc8\x98\xbb\xdd\xf0\x82\xe3\xec\x9a\xc3\xf8\x2d\x06\x6d\x8d\x90\x97\xd3\x34\x94\x48\x2d\x6e\x5f\xc1\x53\x7d\xd6\xe5\x40\x23\xb2\x83\x13\x87\x1a\x23\x77\xb1\x8f\x34\x28\x37\x43\xbf\x69\xb0\x23\xcf\x29\x1f\x6b\x58\x6e\xa2\x9d\x48\x10\x95\x6a\x1f\xf3\x3c\x63\x30\xc2\xdf\x39\x83\x60\xdf\x64\x82\xc1\x29\x72\x08\x1e\xfb\x73\xbd\xa6\x3a\x93\x18\xb9\x1e\x3a\x27\xc0\xe7\x56\x18\x73\xaa\xa5\x8b\x32\xa2\xe6\x25\xed\xac\x06\x2f\x97\x68\xf2\xf6\x3a\xea\x55\x57\xeb\x29\x73\x06\x1b\x9d\x25\x52\x1c\x4e\x8f\x1c\x06\x21\x66\x4f\xd7\x41\x97\x78\x46\x11\x0d\x0e\x24\x04\x0c\x9e\xe9\x57\x8e\x80\x38\x0b\x93\x77\x6c\x92\x2d\x34\x92\x7a\x14\x91\x28\x52\xe0\x2d\xd1\xaf\x73\xba\x54\x98\x6f\x06\x02\xeb\x20\xa1\x04\x1d\x06\x29\x05\x68\x05\x74\x43\xbc\x74\xe2\x08\x0b\x3b\xde\x27\xc8\xf7\x6c\x2f\x65\x30\x51\x50\x18\x23\xeb\xb4\x00\x29\x8f\x2e\x09\x83\x5b\x95\x80\x42\x93\x31\xe7\x6e\x05\x57\x63\x70\x5f\x42\x0e\x85\x88\x8e\x02\x7d\xe3\xfc\x7d\x89\x36\xe2\x33\xec\x66\x28\x84\xf9\x78\x0d\x81\x44\xb1\x55\xa2\x2c\xc2\x70\xd4\x16\x3e\x2e\xf7\x6c\x24\xf4\x45\x76\x10\xaa\x4b\xd7\x26\xb1\x00\x8e\xa4\xec\x8f\x03\xbb\xc9\x40\x48\xe8\x80\x8f\x93\xc4\xe3\xc1\x2e\x19\x43\xfa\x12\x79\x2a\x62\x5c\x2d\xce\xf6\x33\xe0\x8c\xc6\xa3\x2b\xc9\xe7\xea\xf0\xf7\x9c\xe8\x3c\x1d\xc7\xa8\xbe\xef\x9b\x1b\x1a\x52\xb3\x4a\x33\xa7\x1f\xca\xeb\x0a\xbb\x39\x46\x2e\xa9\x5a\x88\x70\x63\xcf\x61\x30\xa0\xc4\x3d\x3a\x4e\xdc\xde\x97\xd7\xb0\x19\xec\xa9\xd0\x56\x6e\xa4\x50\x18\x2d\x72\x3d\x15\xcf\xcf\x65\xed\x93\x46\xa9\x09\x66\xa8\xe1\x6c\xda\x3c\xa0\x44\xa4\x81\xfc\x30\x0b\x37\x73\x73\xbe\x2f\xa3\xc4\x89\xbe\x4c\x2f\xc7\xde\x48\xa2\x67\xc2\x91\x02\x89\xf4\xff\x60\xcc\xcd\x8f\xd9\x81\x4b\x93\x7d\x84\xa3\x7d\xe5\xb8\x40\x6f\x51\x84\x14\x4f\x6a\x47\xfb\xba\xca\xa2\x02\xf2\x94\xc7\x43\xb2\xea\x49\x5c\x90\x6e\xf5\xc9\xc5\x0d\x83\x78\x09\x53\x67\x90\x64\x28\xb9\x00\xf9\xb6\xaf\x41\xa9\xed\x1f\x6b\x78\xaa\x16\x48\xa9\x8e\x50\xd3\xa9\x8e\x33\x8c\x4c\x62\x92\xc1\x3a\xce\x89\x4a\x44\xd5\xe1\x54\x33\xec\xab\x14\x4e\x15\xfd\x8c\x93\x9b\x83\x33\x05\xca\x2a\x99\x69\xee\x1b\x95\xda\x39\x91\x63\x5b\x1c\xd1\x3e\x07\x83\x0b\x89\x20\xd5\x64\x2e\xb9\x11\xc8\x96\xd1\x97\xfb\x4b\xa8\x6c\x9e\xbc\x5a\xa1\x90\x72\xa5\xe7\xe6\xce\x2a\x59\x6d\x09\x2d\xf2\xcf\xa4\x22\xc6\x25\x56\x5b\xd8\xde\x88\x2e\xae\x37\x57\x68\x1d\xcf\x0d\x68\x77\x3c\x48\xdb\x9e\xeb\xe1\xdc\xb5\x5b\x66\x1a\x07\x28\x25\x5a\x4b\xc8\x44\x9c\x72\x37\xf0\xd2\x31\xf9\x52\x68\x13\x35\xf3\xb2\x52\xba\x4d\x5b\xf9\xc1\x60\x0f\xe9\xee\xf7\xc9\xc8\xff\xce\x60\x3f\x07\xea\x0c\x0e\x72\xe8\xef\xbf\xeb\xff\xfb\xe3\xed\x83\xb4\xaf\x0c\x0e\x89\x59\x9f\x3e\xcb\x6f\xd0\xef\xd3\x85\x6f\x06\x3d\x19\xb0\x35\xe1\x88\xf8\xc3\xd0\xfd\xce\xe0\x9b\x0e\xfb\x62\xab\x74\x5c\x62\x0b\x55\x14\x8b\xc7\x5b\x96\xe7\x6e\x49\x55\x8b\xc1\xf1\x3f\x72\x0f\xd2\x91\xbf\x65\x87\x8e\xd8\x42\x01\xc5\x03\xbd\x0e\x38\xf9\xc7\x98\xc9\x88\xfb\x7e\xf6\xa5\xeb\xfd\x9f\xb0\xa7\x5e\xc4\xe0\xf4\xa7\x29\xa6\x5e\xb4\xa5\x37\x56\xcf\xfe\x25\xe7\x96\x4f\xde\x53\xce\xff\x91\x5d\xee\x79\x5f\xfc\x2b\x3e\x95\xe8\xe5\x3f\x32\x17\xb6\xbb\xaf\xfe\x99\xf9\x79\xcc\x51\x8c\x74\x72\xce\xa5\xfb\x88\xcd\x58\x70\xf5\xea\x6d\xf7\x4d\xa6\x5d\x1e\x2b\x9e\xde\x9b\x3c\xf2\x8c\xad\x62\xbb\x7e\x93\x0d\xb5\x19\xc5\x74\xf3\x26\xd3\x85\xa7\x79\x36\x6e\xdf\x64\x52\xe7\xb5\x14\xe3\x5d\xce\xf7\xbd\xc4\xf7\x1d\x7b\x3c\xf2\x7c\x67\x70\xff\xcf\x4c\x64\x43\xf7\x02\x77\x57\xda\xc5\xdf\xff\x73\x8c\x11\x8f\xa4\x3b\x9d\x1b\xec\x8b\xea\x72\x14\x03\x3e\xe1\x39\xd8\x0b\x48\x38\x58\x12\x27\x50\x8f\xb9\x25\x6e\x9c\xd5\x6c\x89\xf5\xd4\x91\x92\xbb\xfd\x1c\xd2\x2e\x72\x8a\x1c\x49\x8d\xb6\xac\x4f\xbd\x80\x96\x70\xfb\x45\x8a\x9a\xef\xde\x2f\x21\xc9\x7b\x8b\x28\x27\x32\xf2\x82\x53\xfe\x14\xc6\x38\x69\xb5\xbd\x24\x45\x2d\x90\x41\x7f\x95\x09\xbf\x53\x66\x72\x57\x98\xce\xc2\xd4\x1e\xe4\x0c\x83\x15\x86\x4e\x1a\x87\x81\x8b\x8d\x9f\x73\x79\x6f\x70\x75\xc3\x1b\xc1\x87\x65\xde\x8d\xa7\x15\xe6\x55\xa6\xe1\x0a\x4f\x18\x1f\x28\x30\xdf\xbe\x5b\xc3\x84\xc5\xcb\x18\x46\x65\x86\x40\x4c\xbb\xde\x48\xed\x4f\x05\x65\x1a\x4a\xf7\xee\x80\x76\x9e\x7c\xd4\x5d\x57\xa9\xa8\xd6\xf1\x03\xc4\xd2\x91\xdc\x08\x39\x06\xcd\x99\x40\xbc\x75\x40\x61\x54\x07\x9f\x15\xde\x4b\x7e\x61\x60\x23\x9e\x4b\x0f\x1e\x0e\x85\x13\x75\x8e\x45\x20\x44\x07\x6c\x54\xc7\xe8\x67\x08\xed\x3f\x25\xa6\x94\x04\x97\xde\x8e\x12\x09\xa9\xeb\x55\x2e\x72\xd3\xa6\xd9\x80\x42\xee\x80\x41\x4a\x1c\xa5\xdd\x5a\x4f\x11\xd5\xf5\xd2\x27\x02\x93\x34\x74\x63\x3e\x62\x30\x96\x11\x14\x5c\xb3\xc6\xf6\x50\xa8\x19\x7d\x58\xe4\x24\xd7\xd6\xbb\x44\x55\x87\x82\x27\xe5\x98\x3e\x4f\x52\x49\xbf\x10\xb1\x2d\x82\xd4\xa3\xeb\xa4\x65\xa6\x11\x9f\x49\x1e\xe9\x5e\x9d\xc1\xc6\x6c\x89\xc1\x0b\xca\x0c\xf3\x32\x3d\x09\xe3\xb4\x94\x8b\x45\x89\x5e\x22\x35\xd7\x90\x70\x4a\x2f\xa1\xd5\xdd\x6c\xf2\x02\x8e\x12\xa2\x45\x54\xa9\xbb\xfa\x07\x2a\x88\x8a\xf9\x48\x03\xa4\x8c\xb7\x89\x2d\x1d\xf9\xf2\x28\xf4\x9e\x04\xd3\xa8\xce\x60\x3f\x0b\xaf\xf3\x1b\xc1\x1d\x47\x7c\x1d\x85\xce\xd8\x17\xf2\x16\xfb\xc1\x12\xfb\xaa\xff\x0b\x08\x0e\x7e\xea\x51\x03\x42\x45\x4f\xea\x0c\x22\x0c\xcf\x2d\x92\x44\xcf\x07\x26\xc3\xdf\x43\xfc\x84\xe7\x60\x9b\xf4\x3d\x2c\x58\x8c\x84\xbe\xd4\xca\x8e\x88\xe8\xaa\x3b\x2e\xdf\x08\x92\x47\xa0\x8e\xb3\xf0\xa7\x88\x36\xd5\x72\x38\x99\xb8\x9b\xb3\x11\xae\xb0\x30\xa5\x80\x41\x4a\xbf\xcd\xc0\xa1\xda\x39\x25\xce\x00\xc7\x61\xbe\x49\x7d\x26\x91\xfd\xf0\x53\x49\x28\xd3\x6d\xd3\x8d\xf3\x8c\xa8\xe4\x2f\xa1\x2f\x34\xb6\xb8\x9b\x3d\xa6\x4f\x45\xf8\x9d\x09\x05\xe5\x49\x91\x4b\xc9\x5b\x58\x17\xaa\x9b\x3d\xd3\x03\x85\x8f\x42\x9f\xa7\xe2\x4c\xda\xa9\x67\x1a\x3b\xe1\x3e\x83\xab\x2c\xf2\x84\xfb\x35\x06\x9d\x22\x8c\x83\x7b\x8e\xec\xc9\xaf\x6d\x06\x5d\x22\x25\x6d\xaf\xdf\x67\xd0\x93\xc0\x55\xea\x33\x58\x10\x4b\x27\xe5\xea\xee\x33\x82\x29\xf7\x3d\x9b\xc1\x35\xb1\x11\x50\x61\x70\x33\xe1\xe6\xc7\xfc\x7e\x55\x9d\xb1\x8f\x70\x8b\x1c\x4f\x89\xec\x4d\x77\x08\x0c\xf9\x24\xe6\xf3\x64\xe8\xcd\xb7\x26\x9e\xc7\xe0\x9e\x90\x42\x44\xcd\x24\x12\x76\x7a\x85\xd3\x16\x83\xdd\x03\x72\x6c\xc4\xa0\x25\x03\xd2\xb0\xd1\x96\x00\xca\x98\xbd\x03\x93\xf9\x0c\xf6\x0f\x94\x53\x22\x06\x07\x3a\x78\x14\x48\x6b\x0c\x83\x43\x8d\xc2\x8c\x1f\x69\xc0\x17\x8e\x35\x67\xf0\x1e\x3f\xec\x0b\xf2\x1e\xf6\x0d\x69\x2a\xd2\x71\x16\xae\x91\x74\x93\x4e\x7e\xf8\x94\x67\x68\x8b\xc7\x35\x5f\x9d\xfc\xb0\x0a\xf8\x11\x9f\xa9\x13\xfc\x1b\x76\x01\x1d\x88\xa9\xce\x90\x53\x44\x97\xf6\x45\x44\x81\x52\xb2\xec\xf6\x0b\x84\x88\xbb\x5e\xe0\x16\x0e\xd0\x9d\xe4\x79\xcd\xb7\x50\xdc\x42\x0c\xe9\x4b\xb2\x19\xc7\xe1\x34\xa9\xc9\x83\x20\x4a\x26\x0f\xde\xe2\xf2\x82\x12\x9f\xf7\x16\x5f\x29\x97\x4f\x45\xae\x41\x38\xbd\xe0\xae\x20\xd9\xc3\xe0\x34\xcf\x63\x61\x1b\x67\x98\x47\x50\x27\xfb\xfc\x25\x8c\x5a\x7a\x8f\x96\xd0\x99\x59\x37\x58\x47\xa0\x61\x1a\xe6\x94\xfd\x6c\x1d\x17\xe5\x48\x69\x4b\xd9\x55\xdb\xfc\xcf\xeb\x09\xea\xf3\x71\x4e\xa5\xc3\x76\xb2\x52\xce\x0e\x8a\x48\x55\xa4\xf3\x03\x73\x43\x61\x85\x2c\xd2\x45\xc6\x26\x6b\x4e\x9f\x2c\xb8\x24\xbc\x3c\xfc\x72\x85\x61\x8f\x41\xe7\x40\x3a\x4d\x63\x90\xd0\x27\xbd\x40\xd0\x11\x0b\x9a\x20\xbb\x8a\x58\x63\x90\x6a\xaa\xca\xca\x58\xc3\x6d\x9e\x0c\x54\x4e\x26\x1a\x27\x8b\x3e\xcd\x40\x9d\xde\x4c\x63\xf4\xa2\xb6\x77\x50\x72\xfc\x76\xad\x40\x1e\x33\xb8\xc9\xc2\x07\x99\xd6\x78\x2b\x71\xc3\x84\xc1\x5c\x26\x95\xa4\xf2\x44\x09\x41\x21\x47\x41\xa1\x83\x38\xf8\xee\x30\x02\xae\x84\xee\x65\xa0\x23\x9d\xd9\xed\x4a\x1e\x09\xde\x32\x68\x49\x38\x11\x36\x8f\xa4\x65\xa1\x2d\x31\x53\x06\xef\x31\x66\x1a\x33\xd8\x43\xd4\x08\x57\xa6\xfd\xb9\x17\xb8\x07\x3e\x4f\x92\x9a\xb6\xb5\xed\xaf\x23\x2e\xc2\x70\xa4\x17\xd5\xfc\x70\x85\xbe\xab\x8e\xc7\x58\xab\xa4\x6e\xec\xa9\x23\x93\x07\x32\xe1\x27\xb9\x5d\x58\xe8\x0b\x87\x53\x6e\x6e\x30\x14\xef\xaa\xac\x36\x25\x13\xc9\xbd\x90\x23\x19\x2d\xea\x7b\xbe\x48\x3e\xfd\x8f\x9c\x16\x1c\xe2\x90\x66\x92\x6f\x92\x01\x01\x79\x6a\x2c\x3b\xaf\x72\xfc\x06\x45\xab\xcf\x27\x6f\xd1\xd5\xd6\xb1\xc8\xbe\xa2\xb7\xdf\x33\x84\x32\x62\x9d\xe6\x29\x48\x23\xd6\x59\x8e\xc8\x14\x4d\x97\x62\x91\x0f\x3c\x49\x4d\x63\x6f\x56\x65\x30\x27\x3c\xb6\xb9\x0c\x6c\xa9\xcf\x5e\x48\xae\x59\xd3\xa7\xb3\xec\x52\x3e\x34\x25\x8f\xaa\xb2\x4b\xc5\x42\xa0\xda\xa5\xdd\x95\x1c\x6d\xe9\xc8\xf2\x4a\x71\x60\x3d\x2b\x99\xda\x92\x0c\xde\xc8\x5b\x60\x2d\x77\x88\x83\xf6\x4f\xbb\x3a\x28\x57\xb2\xbd\x22\x98\x9f\x00\xb8\x2e\xa2\xb1\x27\x87\x0c\xda\x98\xa6\x88\x6d\xb9\x50\xbd\x91\x1c\x29\x67\xb0\x47\x84\x34\x0e\x13\x06\xfb\x18\xf6\xf4\xd9\x91\x03\x09\x91\xfb\xc9\x8d\x43\x02\x02\x06\x47\x32\xa0\x4f\x5d\x52\x42\x0a\x54\xe5\xbb\x53\xb8\x82\xb5\xed\x5e\xa1\x48\x86\xe8\xa1\xf9\x5e\x21\x57\xfa\xd9\xb7\x43\x85\x3f\x58\x5e\x47\xf1\x19\x5f\x43\xa2\xd5\x94\xb5\x86\xa4\x15\xfe\x63\x4a\x30\x8e\xc3\xf8\x04\x47\xe6\x09\x81\x33\xea\xc1\x14\x2b\x74\x78\x6e\xc1\x38\x45\xaa\x7c\x9b\xf2\x8c\x82\xe3\x44\x28\xcb\xf3\xb9\x86\xd5\x64\x7a\xa1\x61\xe9\x94\xf1\x52\x83\x38\x6d\x5f\x69\x60\x2a\x2d\xd9\x9d\x43\xed\xbb\xb1\xab\x42\xdf\xc3\x7e\x3f\xb1\xe5\xe2\xb3\x77\x68\xb2\x80\xb4\xb9\x6b\x0a\xa5\xe3\x18\xb5\x9a\x1b\x04\x42\x06\x0e\x66\x33\x08\x1d\xb5\xed\x78\x4b\xe8\x78\x84\x2c\x42\x92\xa4\xe3\xd2\x3b\x22\x4c\x63\x1e\x31\xe8\x23\x41\x5e\x10\xd9\xcd\xd5\x35\x06\x2e\xe1\x6d\xc1\x03\x06\xf7\x87\xe4\x2b\x95\xc1\xfb\xc3\xdc\x69\x2a\x3f\x32\x59\x38\x64\x60\x1d\x99\x1b\x2c\xf4\x9d\x2d\x79\x07\x6d\x40\xf1\x02\x2a\x93\x54\x52\xec\xa3\x0c\x21\x4b\xe6\xe4\x08\xf2\x4d\x2b\x0a\x30\x0d\x43\xaf\x90\x06\x56\xd2\x93\x84\xe9\x6a\x4f\x92\xf2\x54\x64\x87\x9e\x24\x61\x1c\x48\x09\xeb\x13\x28\xc7\xe9\x67\x06\xfd\x23\x82\x9e\xb1\xb7\xb9\x14\x26\x5f\x8b\x92\x29\xa5\x71\x73\x39\xe6\x3e\x0d\xea\xc1\x91\x44\x92\xeb\xc6\xa3\x25\x17\x94\x4f\x88\xc0\x9c\x06\x14\x77\x9c\xd6\xed\x64\xd2\x60\x10\x6a\x10\x17\x08\x0d\x06\x91\x82\xcb\xfa\xf0\x50\xc6\x96\xda\xeb\x33\xb1\x90\x2e\x1a\xcb\xa0\x74\x9a\x51\xe7\xe3\x34\x5c\xb3\x81\x97\x86\x51\x7d\x5b\xb9\xc6\xd8\x21\x87\x4b\x6a\x59\xb8\x23\x9d\x90\x24\xa5\x44\xe4\xf1\xd5\x3c\x99\x58\xf8\x1c\x55\x97\xcc\xb7\x46\x5a\x64\xbf\x65\x30\xd6\xb0\xcf\xe7\x24\x14\x7c\xcc\xec\x34\x48\x18\x8c\x8e\x4c\x16\x31\x98\x20\x47\xf4\x2b\x83\x29\x05\xa4\x6b\x03\x06\xb3\x19\x0a\xf9\x88\x27\x29\x2e\xaf\x8f\xb4\xcb\xcf\xb9\x64\x4a\x07\xb9\xca\xbd\x50\x28\x14\x7e\xca\x9e\xd2\x24\x94\xcd\x20\xc4\x88\x72\x15\x49\xa9\xee\x12\x41\x1e\xc5\x89\x90\xe6\x61\x95\xc9\x80\x2d\xa6\x5e\x22\x4e\xd4\x24\xdc\x22\x4e\x2f\xb0\x07\xd9\xce\x9d\xc4\xcc\x84\x9f\x5c\x88\xf8\x44\xea\xc0\x7b\x84\xf4\xb9\x2d\x70\xa9\x4f\x4b\xa2\x23\xed\xa8\x74\x5f\xd1\xe6\x85\xbd\x81\x04\xa9\xf2\xf0\xde\x01\x91\x31\x5c\x63\x70\x98\x03\xca\xc3\xd0\x51\x01\x23\x2d\xf5\x39\x22\x73\x47\x7a\x9c\xe1\xd4\x7e\x5f\xaa\xd3\x97\x02\x6f\xac\x41\xcc\xd9\x44\x03\x09\x83\x69\x16\x5e\x3e\x36\x38\x23\x8a\x3f\x77\x31\xbb\x27\x32\xfd\xc4\x0b\x68\x48\x9e\x6a\xb0\xdc\x87\xf4\x26\xb1\x72\xb4\x74\xb6\x9e\xcb\x17\xfd\xb4\xae\xbd\x70\x51\xbf\xa3\x2e\xa9\xba\x5e\xa1\xe3\x45\xb3\xc6\x52\x87\xc3\x75\x5d\x29\xd1\xac\xdf\xad\x30\x5e\x10\x5f\x4c\xee\xaf\x65\x88\xee\xe4\x94\xd6\x3a\x57\x9a\x22\x1d\xe9\x1e\x11\x90\xe2\x28\x5d\x50\xd8\x1b\xf1\x78\xee\x78\xdc\x0d\x03\xee\x27\x69\xec\x91\x07\xa6\x8e\x8c\x15\x3e\x69\x0f\xac\x5d\x85\x20\x4f\xae\x5a\x62\x34\x29\x85\x70\xe2\x05\x36\xdd\x2c\x26\x9e\x94\xc1\x35\x05\xc6\x31\x79\x1f\xbe\x21\x60\x56\x61\xb0\x8b\xec\xb3\x06\x83\x5b\x89\xca\x9d\xdc\xcc\xea\x0c\xee\x14\x32\x2b\x77\x65\x69\xdc\x52\x9d\x6e\x37\x18\xdc\x23\xe7\xf3\x98\x3b\x29\x9d\x7f\x78\x8f\x60\xcc\x2d\x9f\x01\x9f\xab\xe0\xd6\x38\x11\x5b\xda\xa3\xb2\xa5\xb1\xb6\xef\x45\x0c\x6c\x0d\xe6\x76\x4a\x47\xa3\x92\xc1\xff\x47\xdc\x9b\x37\xa7\xd1\x2b\x0f\xa3\xff\xfb\x53\xc4\xbc\x79\xf9\x49\x46\x4c\xc0\x59\x9e\x64\x26\x0a\x65\xf0\x0a\x78\x5f\x88\x33\x67\x4e\x4a\xb3\x01\x66\x58\xcc\x66\xc0\xf0\xdd\x6f\xa9\x25\xcd\x68\x00\xe7\x79\xce\xb9\xbf\xba\xb7\x52\x31\x52\xab\xa5\x91\x5a\x52\xab\xd5\x6a\xb5\x18\xb8\xa9\xae\x9c\xc5\x6e\x95\x03\x91\xd6\x6b\x06\x15\x68\x36\x78\x51\x3e\x6e\x0f\xdb\xbd\xe6\x0d\xd8\x70\x1c\x2a\x5c\x45\x96\xa3\x33\xe5\x94\x36\x84\xbc\x81\x37\x46\x19\xd2\x14\x61\x3f\x43\x8e\x21\x5d\xf8\x31\xbf\x1f\xf2\xcd\xa5\x00\x0c\xd9\x0b\x5f\xf5\xcf\x84\x2b\x70\xb8\x58\x26\xf2\x34\x93\xdb\x26\x67\x90\x2a\x58\x7f\x5b\xa4\xf2\xc8\x6d\x30\x6c\x07\x6a\xcf\xf1\xb4\x15\x2e\x0b\xe8\x6c\x4d\x8c\xf7\x3d\xd1\xdb\xc9\xb0\xfb\xe9\x6a\xe9\x62\x16\xf6\x12\x08\xdc\xcb\xce\x90\xfe\x1a\x44\x6d\x4c\x06\x02\xae\x7c\xed\x90\xea\x99\x16\x8d\xbd\x8e\xc5\x01\x95\x94\x21\xcf\xa9\x8c\x1f\x84\xcd\xf1\x07\x65\x7a\x3c\xdc\x9e\x2a\x8d\x0a\x46\x5b\x53\xe3\xd3\xf5\xf1\xd6\x64\xb1\x55\x9a\x6c\x4d\x13\xbc\x79\xba\x35\x4d\xf4\xfa\xcb\xd6\x34\xe5\xdc\x6c\xb6\x35\x55\x7a\xc6\x9a\xa7\x13\x47\xd3\x66\xdc\x90\xc5\x66\x52\xdc\x8a\x83\xcd\x34\xa9\x6c\x2d\x6f\xa6\x88\xc6\x55\x36\x13\x44\xcb\x0e\xb7\x27\x28\xdf\x71\x9b\xa9\xa2\xd1\xc7\x9b\x09\xaa\xc5\x27\x5b\x92\xa6\xcd\x0c\x39\xdd\x0a\x97\x1f\x3a\xdb\x4c\x14\x34\xaa\x8a\x84\x41\xc0\xc6\x19\x52\x13\x11\x60\xd8\x35\x18\x4e\x62\xfd\xa8\x8b\x30\x67\x1f\x30\x91\xea\x12\x6f\xc2\x25\xb6\x73\x11\x99\x06\x43\x4e\xbb\x0b\x2d\x26\x14\xd1\xe7\x67\x31\xa0\x22\x0c\xce\xc1\x70\xf0\x12\x10\x9b\x2e\xca\x90\x2b\x19\x64\x28\x43\x2e\xce\x64\xb0\x40\xe0\x1f\xce\x90\x4b\x0e\xe2\xfc\x5d\x5d\x63\xb8\x06\xfc\xd8\x56\xf9\xae\x7f\x23\xaa\x7c\xa5\x10\xa5\x7d\xd8\xce\xf5\x59\xe2\x52\xfe\x26\x0e\xa3\x0c\xb9\x85\xc8\x4b\x86\xdc\x40\x51\xfd\x97\xd8\xaa\xf6\x4e\xa4\x28\xe7\xd9\xf7\x22\x3a\xca\x90\x07\x1e\x9a\x65\x48\x83\xff\xce\x33\xe4\xe7\x19\xcd\x8c\x58\x0f\x2e\x6e\xb6\xc3\x0c\xb9\xe5\x25\xc1\x91\x30\xca\x90\xc7\x33\x19\x96\x46\x76\x22\x2a\x94\x08\xef\x21\x22\x84\x66\x56\x85\x30\x98\x57\xdf\x89\x02\xc4\x7b\x22\x42\x6e\xb8\x07\x10\x5c\xcc\xdb\xb6\xac\xb8\x55\xfd\xe1\x04\x4f\x8b\xdd\x40\x95\xfd\xaa\xf6\x18\x83\xb0\x6d\x0a\x00\x14\x1f\xf7\x3d\x88\x0f\x00\x9f\x69\xc4\x61\xc9\xdb\x7e\xc6\x80\x98\x9f\x3d\xa6\x41\xe2\x72\x41\x55\x82\x46\x19\xd2\x8c\xc3\xea\x82\x4f\x6b\x0d\x92\xf7\xd9\xb0\x93\x21\xbf\xe2\x82\x14\x5c\x1e\x0d\xb4\x63\x7c\x23\x43\xde\x27\x58\x46\xc1\xd8\x6a\x96\xc3\x16\x31\x8a\xa0\xf5\x53\x95\xee\x64\x60\x38\xb8\x22\x69\x2c\x3a\xb6\x53\x85\xd7\x2d\xfc\xfe\x4b\x62\xb1\x11\x25\x30\xe5\x56\xde\x83\x4c\x02\x36\xcb\xab\x0d\x85\xaf\x43\x95\x21\x4a\x37\xc9\x3d\x53\x88\x81\x86\x38\x8f\xb3\x87\x3a\x54\x65\xef\x25\xd9\xe7\x0a\xb1\x5f\x8d\x9f\xe0\x68\xca\x3c\x83\x60\xb4\xe1\x42\xb2\xa5\xa5\x29\x86\xd6\xd6\x60\x31\x27\x7b\xd2\x80\x92\x85\x75\x34\x90\xe0\x5d\x91\x06\x11\x4c\xab\xab\x41\x04\x3f\xea\xad\x41\x24\x5b\x19\x54\x63\xa8\x62\x4f\x7d\x0d\x53\xb0\x98\x81\x80\xf4\x87\xe3\x72\x7c\x5d\xeb\x39\x86\x09\x13\xd3\xa1\x8c\x4f\x22\xff\x54\x9d\x13\x69\x1e\xeb\x9f\xe1\x3b\x7c\xc2\x8e\x24\xe2\x0b\x1c\xd2\xc6\x06\x78\xe3\x05\x97\xf9\x39\x5c\xf8\xc2\x09\xe4\x2b\xfa\x7c\x41\x93\x79\x85\xd1\xdb\x44\xe5\xbf\xd9\xcf\x90\x69\x1c\x49\x96\xe8\x91\x5a\xf7\x5f\x54\xa2\xd4\x7f\xcd\xe2\x78\xdb\x0f\xae\x58\x8f\xcb\xf0\x73\x05\xe3\xdb\xaa\xa3\x69\xc0\x19\xc3\x62\x03\x26\xa6\xde\x48\xd6\xe3\x8e\x4b\x4d\x63\x15\x11\xa7\xea\x7c\xe3\x01\xd9\xda\x7e\x70\x0b\xbc\x41\x2a\x12\xca\x02\xba\x08\x84\x85\x7d\xac\x8c\xab\xa4\xe0\x5d\x36\x13\x42\xfb\xe1\x3a\x58\xd9\xdb\xa7\xe1\xed\x9e\x40\x3f\x5e\x07\x4b\xf4\x93\x14\x5c\x63\x64\xa7\x90\x10\xb1\xde\x58\xdc\x0d\xcf\x90\xb3\x35\xc8\x81\xd0\xc0\x4d\x78\xfb\xe0\xe2\x79\x86\x54\x05\x0a\xbc\x30\x30\xe5\x70\x65\xa2\xac\xd4\x7c\x35\x40\xe8\xb1\x81\x78\x0a\x34\x43\xea\x00\x80\x63\x36\xb8\xeb\x55\x9e\x8b\xfa\x9e\x03\x7c\xc0\x86\x1d\x31\x72\x5f\x78\x69\xd2\x1e\x61\x67\xc6\x23\x43\x2f\x43\xe6\x55\x78\x5c\x03\x6e\x49\x41\x06\xbe\x81\x93\xe2\xd5\x42\xa4\x0d\x33\xe4\x40\x86\xc6\x19\x72\x29\xb1\xf8\x32\x11\x1c\x40\xd8\x3f\x0c\xa6\x6d\xa5\xd5\x17\xa0\xe4\x7a\xa9\x8a\xab\x1b\xa5\x65\x28\x2a\x18\x64\x48\x45\x86\x06\x81\x2f\x2e\x37\x1d\x26\x00\xbe\x47\x82\x0b\x08\x2d\x91\x5f\xdc\xfa\x3a\x02\x84\xfe\x20\x43\xda\x02\xdc\x1f\x28\xd6\x79\x5c\xd5\xe3\x66\x86\x9c\x54\xd5\x43\x11\x19\xf2\x24\xb0\x79\x24\xcf\xa7\x10\x3c\xa5\x9a\x21\x1d\x0d\xcc\x69\xe4\xb1\x41\x86\x9c\xc6\xf9\x12\x7b\xb6\xb3\x04\x26\x75\x81\xd5\x18\xa2\x74\x55\x51\x52\x98\x66\xc5\xac\x01\x65\xce\x5e\x02\x92\x24\xea\x27\x90\x58\x37\x39\x48\x60\x8a\x09\x00\x64\xe2\xea\xd7\x29\x86\x12\xd6\x6d\x73\x19\x84\x57\x89\xcb\x36\x75\x1e\x78\x09\x33\xe4\xbc\x4a\x33\xe3\x0c\x19\x71\xac\x31\x58\xb9\xc9\x93\xef\x9d\x8b\x6a\x02\x69\x8f\xe4\x79\xc6\x25\x07\xba\x7d\x7f\x9e\x21\x57\x3c\xe8\x67\xc8\x75\x55\x78\x17\xcc\x27\xcf\x50\x30\x09\x49\x1c\x7f\x66\xc8\x44\x41\x65\x8b\xa6\x2a\x9e\x9c\x52\xbc\x28\x50\xa2\x4f\xb9\x91\x85\x4b\xdd\xfe\x4c\x61\x08\xb6\x7a\x5b\x4d\x62\xfd\x4e\x86\xcc\x21\xb9\xd5\xf6\x3a\xbd\x60\x34\xca\x90\x05\xc4\xdb\x5e\xe7\xd6\xeb\xf3\x0d\x91\x50\xf8\x73\xde\xa0\x12\x22\xa1\x5e\xbd\xab\xc6\x6f\xdd\x94\x45\x52\x37\x38\x49\x7c\xae\x64\xc8\x7d\x35\x7e\x0b\xa4\x22\x10\xc6\x91\xea\x9b\x07\x95\x96\xb4\xe4\x30\xc6\x49\x9a\xd2\x50\x68\xda\xa9\xc9\x51\x8c\xf7\x33\x43\x7e\x2a\x84\xc7\x0c\x79\xe4\xe1\x7e\xb3\x19\x05\xbf\xe5\x8e\x3e\x43\x8e\x01\x59\x5a\x9b\xb7\x9b\xbd\xfe\x30\x50\x96\xa7\x27\xa9\xa4\xd1\x29\x3c\x3f\x74\xaa\x03\x07\xed\x69\x7f\x6c\xcc\x32\xe4\x6c\x13\x3a\xcf\x90\xaa\x0e\x85\xd5\x80\xb7\xad\x02\x7c\x76\xa7\xb6\x9e\xa8\xcc\x8a\xa5\x21\xf3\x7a\xf2\x91\xb0\x06\x3e\x5f\x87\xdf\x09\x02\x5e\xe8\x70\xad\x73\x7f\x55\x35\xb0\xba\xc3\x71\xa9\x21\x27\xf4\xbd\xd2\xa0\x89\x47\x83\x75\xa0\x70\x67\xa0\x41\x45\x7d\x6f\xd7\x20\xb2\x1b\xef\xd6\xc0\xb2\x56\xf7\x3a\x58\xd5\xea\x3d\x54\x75\x90\x21\xac\x06\x01\x25\x48\xbb\x22\x2a\xef\xfe\x3e\x88\xac\x83\xdf\xd2\xbf\x78\x43\xc4\x27\x5e\x4b\xd9\x73\xff\x8c\x21\x70\x42\xfa\x18\x47\xc5\x0e\xda\xab\xc9\xa8\xe4\xab\xbf\x20\xfd\x79\x96\x21\x3e\x4f\xe1\x15\x01\xc8\x50\x5c\xbe\x2d\x33\xed\x9d\x1d\x94\x21\xae\x00\x48\x47\x38\x7c\x52\x7b\x02\xa2\x8e\x75\x7c\x19\x15\x8d\x0a\x20\x36\x1a\x30\xce\xa2\xcb\x7c\xf9\x1f\xcf\x07\xc1\x6f\xf0\x01\x67\x82\xc3\xc5\x0c\x69\x02\x4e\x02\xbe\x65\x61\x20\x46\x5b\x50\xa3\x99\x49\x94\x21\x2d\x8e\x31\xe9\xc9\x2b\xcf\x6d\x11\x93\xb7\x12\x43\x8e\x03\x4f\xcc\xc3\x6a\xd3\x84\xa8\x6e\xc6\x22\xb0\xd5\x3d\x90\x0e\x44\x07\x19\x12\x41\x60\xd8\xe6\xdd\xd0\xef\x35\x33\xa4\x2b\x00\x11\xca\x90\x56\x4d\x84\xfe\x4f\x86\xb4\x6b\x7f\xe7\xc0\x96\xf4\x20\xe3\x28\x58\xbf\x40\xd0\x97\xf0\x3a\x67\x78\x15\xe5\xe3\x67\x20\xa1\xf2\xbd\xae\x18\xfe\x54\x03\xf0\x10\x5e\xa5\xbd\xec\xdd\x83\x3f\xcb\x1a\xcd\x4c\xf3\x82\x11\x0a\xbb\xa0\x88\x43\x4c\x61\xff\xfc\xcc\x4b\x9a\x9a\x52\x64\xec\x42\x8a\xd0\x0c\xf7\x20\x2c\xaf\x44\x0a\x2c\x21\x21\xf6\x21\x41\x0a\xa8\x23\x91\xa2\x16\xab\xb1\x88\x26\x9c\x70\xc0\x91\x0f\xc0\xd8\x65\x02\x69\x92\x8b\x4f\x65\x04\x8c\x96\x9e\x6b\xf0\xe0\x1a\x54\xee\x05\x12\xb8\x74\x92\x67\x3d\x3f\xaf\x2b\x66\x77\x66\x71\x9a\xe6\xa7\x60\x1e\x03\xc5\xb9\x57\x12\x6d\xf7\x32\xe4\x20\x8e\xf6\xb8\x50\x59\x8e\xa3\x42\x62\xad\x88\xf8\x50\x7b\x17\x27\x64\xd1\x28\xb0\x32\x64\xc8\x2b\xa5\x1e\xa0\x18\xd5\xc4\x8b\x69\x70\x2a\x31\x96\x11\xe1\xba\xca\x80\xcf\x4e\xd6\x60\xfc\xdb\x87\x50\x78\x02\xec\x4d\xba\xc1\xb0\xed\x9d\x73\xfc\xa3\x37\xd2\x78\xbe\x69\xaa\x2c\x21\x53\xbe\xd4\xe2\x07\xa6\x12\x4b\x8a\x59\x2d\x7e\x16\x21\x43\x8e\x79\x89\x32\xf6\xd7\xd6\x47\x12\xc8\x49\x82\xb2\xa9\xc6\x4f\xd4\xa4\x62\x6b\xba\xe5\x1c\x00\x2a\xd0\x8e\xda\xe3\xb9\x52\xf2\x67\xc8\x9c\xd7\xa1\x3f\x94\x3a\xc5\x85\x88\x45\x7e\x86\x1c\xd4\x68\x66\x96\x21\x65\xfe\x53\xcc\x90\x0a\xff\xdd\xcf\x90\x53\x5e\x87\x59\xfb\x46\xd7\xe3\x1d\xd6\x68\x66\x5e\xcc\x90\x23\xfe\xbb\x9f\x21\x67\x1c\x67\x0e\x2a\xf6\x2a\xcc\x77\xe9\x6e\x92\x83\x17\x97\xe2\x58\xf8\xb8\x46\x33\x8b\xdb\xfe\x7c\x91\x21\x75\x80\xf7\xfb\x5d\x71\x2d\x5d\xdb\x4d\x9c\xab\x94\x7a\x30\x05\x6b\x94\x1a\xcd\xbc\xae\x32\xe4\x82\xc3\xff\x35\x29\x14\xdc\x42\x86\x5c\x8a\xc8\xfe\x67\xd7\xcb\x24\x8f\x7d\x9f\xd6\xc4\x3b\x8b\x7c\x70\x78\xd4\x5d\x2e\xaf\xca\xcc\x92\x8f\x2e\x6a\x4f\x8d\x8b\x37\xe4\xc7\xad\xf6\x68\xb9\x74\xdb\xc4\xa5\x2e\xbc\x49\x3c\x19\x06\xbf\xbb\x41\xb7\xdf\x5e\x04\xbf\x3d\xe6\xb5\x82\xdf\xcb\x25\x7a\x2b\x89\xbe\xae\x30\x09\xa8\x87\xc6\x6d\xc4\x30\x89\x1f\x2e\xc7\xea\x7b\xae\xbd\xf0\x1c\x14\xe0\x92\x6b\x07\x8e\xc9\xff\x50\x66\xdf\x7a\x0e\xe2\xdf\xd5\xf0\x57\xda\x5b\xca\x65\x26\xea\xaf\xde\xb2\xf7\xa8\xcd\x1c\xe2\x53\xd7\xae\x3a\xf9\xa2\x55\xf8\x4e\x7d\x2b\x9f\xf7\xb1\x67\x57\x1c\xc4\x19\x67\x3f\x7c\xe7\xda\xbe\x43\xf8\x9f\xf8\xcb\x9e\xdd\x0d\x1c\xd4\xe8\x30\xbc\x82\xf7\xee\xaf\xcb\x8c\x76\x3a\xc8\x1e\x1d\x12\xf0\xb5\x91\x21\x0f\x87\x24\xe3\x71\xde\x93\xf1\xfa\xdd\x2e\xe3\xc3\x32\x03\xee\xbf\x33\x24\xd3\x1a\x66\xc8\x6c\x44\x26\x27\x24\xd3\x09\xe6\xcd\xa0\x97\x21\x6e\x8b\x34\x5e\x18\xc9\x80\x97\xe8\x0c\xc9\x8c\xc0\x4f\x20\xac\x17\x24\xf3\xe2\x0e\x33\x8e\x78\x58\xff\xa6\xcc\xe8\x87\xef\xf6\xbf\x7f\x38\x7b\x3f\x96\x59\xfb\xdf\x96\x93\xb3\x3e\x34\x93\xee\x39\xab\xa5\x9e\xc1\x74\x4b\x0c\xde\xde\xbf\x29\x33\x72\x89\x4d\xb6\xe2\x65\xdc\xf2\x32\xec\x83\xfc\x2f\x96\x5f\xf0\xce\xf6\x0a\x79\xfe\xe3\x7f\x81\xbf\x5f\x21\x12\x42\x24\x84\xc8\xbe\xfb\xf5\x5f\x93\xc2\xc7\x02\xa0\x7d\xfe\x56\xf8\xd7\xa4\xf0\x15\x22\xc5\x30\x0c\xff\x35\xd9\x2f\x14\x82\x7f\x4d\xf6\x3d\x00\x85\x6e\xd1\xfb\xd7\x24\x0c\x44\x24\xf8\x12\xf2\xbf\xa1\xcf\x23\x61\x18\x3a\x1f\xc8\x1d\xff\xf8\xbf\xed\x7f\xff\xff\xf2\xf9\x3d\x1b\x8a\x28\xf2\x92\xfe\x92\x99\x43\xc8\x05\x28\x7e\x08\xf8\x7f\x89\xcc\xa1\xe7\x7c\x20\xf7\x50\x5d\xb0\xfb\xfb\xd7\x87\x7f\x7d\x30\xf6\x3e\x90\x07\x00\x21\x36\x5c\x7a\x1d\x77\xe9\x4f\x97\xad\x60\xd9\x7e\x59\x86\x6c\xd9\x7b\xee\x2f\x07\xa3\xe5\xc8\x5f\x4e\x9a\xcb\xc9\x70\x39\x6f\x2f\x8d\x3d\x3b\xff\xdb\x41\x07\x43\xe6\x2e\x4f\x03\x77\xb8\xbc\x6b\x31\xb6\xbc\xe8\xf4\xfb\xcb\xbb\xb0\xd7\xc4\x18\x95\x76\x25\x4e\x9d\x8d\x7b\xcb\xca\x7c\x18\x61\xf4\x7e\x99\x5f\xfe\xc6\xea\xf7\x43\xdb\x4a\x1e\x8c\xad\xd6\x50\xdc\xbb\x0f\x65\x66\xb7\x7c\x07\x0d\xfa\xa8\x39\x62\x78\xb9\x1c\x1c\x63\xe8\xe1\x06\xaf\xe2\xbf\x46\xb9\x0f\xe4\x27\x84\xfc\x0f\xc9\x08\x79\xdc\x9c\x01\x05\xe2\xd3\x02\x09\xe8\x6e\x91\x84\x54\x8e\x20\x7b\xe8\x39\xa8\x51\x66\x98\x34\x69\xc1\x6a\x7e\x0f\xed\xaa\x63\x35\x73\x39\x31\xb5\x3b\x34\xb4\x9b\x8e\x75\x27\x2b\x70\x56\x43\x1d\x32\xed\xb7\xfd\x77\x05\x8c\x4b\xc8\xcb\xe5\x88\x9f\xcb\x61\xf3\x5e\xa6\x77\x70\x29\xa0\xbb\x05\xf3\x76\x2b\xbe\x9f\xcb\x99\x3f\x63\xcc\x6c\x16\x71\x5c\xbc\x92\x8d\x2c\x50\xea\x97\x82\x52\xd1\x2c\x98\xc6\xa7\xef\xde\x07\xbf\x94\x2f\x9a\xc5\x55\xd2\xa0\x1a\xa7\x08\x9f\xf1\xc6\xe1\x27\x7a\x69\x41\x88\x4d\x18\xfd\x55\x66\xab\x5a\xcd\xae\x39\x46\xf9\x9e\xee\x16\x2c\x11\x5e\xdc\x53\x8d\x4d\xc9\x6f\xc8\xdc\x2b\xeb\x80\x21\x40\x23\x9b\x38\x51\x9f\xe5\x24\x5e\xee\x57\x6b\x85\x93\x0a\xbc\xe7\x14\x4d\x5e\x9e\x7d\xd7\xee\x09\xe3\xe9\x7e\xf8\xae\x56\xcb\x66\x99\x3d\xf1\x1c\x4a\x29\x84\xa1\x66\x94\xd7\xad\xc4\x8c\xc3\x4f\x66\x58\x16\x73\xf2\x57\x99\xd1\x57\xad\x51\xf5\xb8\x51\x7e\xdc\xa8\xe6\x98\x51\x56\x61\xab\xba\xd6\x28\x9e\x97\x55\x20\x6f\xfd\x6f\xda\xe7\x7f\xd2\xca\x77\x2b\x50\x67\xc1\xa6\x7b\xc1\xcb\xbb\x7a\xcd\x72\xf9\xb7\x62\x66\xee\x42\xbd\xbc\x0a\xa3\x1c\xf7\x12\x13\xbf\x02\x33\x37\x6f\xfc\xdf\xdf\xbb\xff\xe7\x1d\xcb\x2f\x0e\xf2\xbf\x0a\xf9\x6f\x4e\xee\xbd\x36\xba\xce\xe3\x7a\x57\x8e\x54\xbd\x5b\x63\x46\x83\x0a\x5b\x9d\x6b\xf5\x3e\xff\x9b\xca\x56\x8e\x56\x12\x67\x1c\xb2\x24\xc3\x70\xb1\x25\x43\x51\xf0\xe0\xa0\x92\x26\xe1\xc5\x96\xaa\xd4\xc7\x8c\x86\x15\x26\x22\xe5\x90\xd1\xde\x24\x8a\x56\x17\xfa\x87\x2e\xde\xfe\x90\xca\xb5\x92\x48\xa2\x29\x17\xff\xa0\x29\xc9\x9b\xff\xb5\xb7\x86\xca\x85\x36\x54\x20\x0c\x95\xa5\xbc\xba\x25\x66\x54\x8e\xcc\x66\x99\x69\xeb\x18\x94\xd3\x0e\xd1\x5a\x19\x58\x15\x6d\xc9\xae\x9d\x44\x91\xc5\x78\xdb\xb2\x59\xe4\x52\x66\x0c\x17\x08\xc7\xcb\xd8\x75\x0d\x1d\xb5\x11\x33\xca\xf7\x25\x66\x2c\xee\x11\x36\x6f\xc7\x7c\xdf\x8d\x18\xc6\xc4\x15\xbc\xa4\x29\xba\x3d\xee\xef\x3c\xef\x70\xd2\xaa\xc0\x82\xd7\xe2\xab\x1c\xbc\x28\xdc\x19\x11\x71\x1b\x4b\x8a\x18\xf7\x4d\x92\xe9\xb2\x5e\x3b\x0c\xf8\x36\x24\x33\xe8\x8f\x40\x2a\x9d\x55\x31\x69\x8b\xbc\x6e\x8b\xcc\x5b\xe4\xb8\x85\x35\xee\xf6\x24\x86\x65\x32\x4c\x79\xac\xc3\x97\xff\xd2\x2f\x60\x4b\x26\x62\x14\xda\x4e\xfc\x1c\x05\x62\x12\x26\x5b\x45\x0a\x94\x7a\x25\x8f\x32\xb3\xb0\x4b\x59\x36\xeb\xc1\x5f\xe4\x01\x0d\xb0\x68\x8c\xe0\x75\x97\xd6\x2f\x14\x4b\x07\xc4\xd5\xc9\xe1\x13\x4f\x60\x86\x6b\xa3\xe9\x3a\x25\xf7\xf0\x19\x73\x51\xb3\x3c\x3e\xb4\x98\xe5\xc1\x50\x72\x63\xe1\x00\x0a\xb8\xa9\xd1\xeb\x1a\xba\x24\x05\x8d\x53\xdc\xca\x42\x7e\x72\x16\x7c\x59\x43\x2e\xc6\xda\x27\x3a\xfa\x9c\x64\xf6\xad\xef\x10\x8f\x32\x7b\xec\x39\x96\xb7\x5c\x5e\x45\x88\xe1\x5d\x5a\x6d\x2e\x97\xc8\xa3\xf7\x1d\xc4\xb0\xdd\xf4\x1c\x6c\xb5\x43\xb4\xeb\xa9\x7e\x77\x79\xb4\xdc\xc1\xbc\x10\x9f\xf6\xbb\xc8\xc3\x5c\xf8\xca\xf9\xf6\x89\x63\x05\xd1\x28\x78\x57\xed\xa0\xaf\x38\x9b\xdd\xad\x76\xd0\x37\xce\x6c\x63\xac\x3c\xe5\x48\x31\x31\x7e\x46\xc8\xc3\x25\xcf\xae\xf9\x4e\x1e\xb9\x39\x66\x1f\xb8\x0e\x36\x5d\xad\xbe\x77\xd0\x1a\xe2\x11\x9f\x04\x24\x24\x4d\xd2\x21\x91\xa8\x7e\x8f\xde\xd7\x78\x99\x03\x1a\x76\x79\x17\x8d\xe8\x03\xaf\xbd\x35\xca\x66\x07\xc6\xc5\x02\xd5\x22\x34\xc2\x42\xa0\x19\xd1\x5b\xde\x14\x32\xe1\xbf\x1e\xb4\x66\x64\x34\x3d\x84\x77\xe9\x04\x7e\x45\x89\x53\x2a\xa0\xf6\x9d\xef\x90\x09\x9d\x18\xd7\x65\x84\xc9\x02\x3a\xa2\xd6\x41\x05\x52\xc0\xa4\x4c\xdd\x08\xdd\x77\xd0\x14\x63\x72\x48\xa7\x96\xdf\x87\xac\x17\xb4\x4c\xe9\xa4\xd4\x88\xd0\x21\x36\xcf\x02\x86\x0e\xb1\xb5\x30\x66\x39\x7a\x61\xcc\xac\x85\x31\xe7\x81\xf9\x0a\x1c\xe6\xa3\x72\x36\x5b\xde\xa5\x93\x6c\x16\x1d\xd2\xb2\x01\xc6\xf9\xf2\x6e\x02\x27\x55\x99\x96\x6d\x7f\xe1\xf0\x9a\xd3\x8b\x0e\x5a\x90\x46\xc4\x3f\x66\xed\x1e\x74\x96\x4b\xa0\xe7\x72\x79\xc8\x9b\xb6\x5c\x22\xc0\x98\x92\x23\x68\x29\xb6\x7e\x31\x34\x20\x03\xfb\xc4\xc9\x4d\x8d\x19\xb6\x06\xc6\xb8\x3f\xc8\xd1\xa9\x31\x5f\x31\xfa\x20\x46\x85\x35\x50\xad\x61\xd9\xfd\x12\xe0\x0e\xec\xa1\x63\xf2\x10\x61\xd9\x62\x49\x64\x1a\xd8\x07\x8e\x09\x41\x9e\xe3\xa2\x83\x06\xa4\x87\xad\x20\x9b\x45\x03\xde\x28\xc8\xcc\x57\x48\xbc\x17\x18\x33\x32\xe0\xed\x43\x3c\xb7\x82\xcd\x05\xdd\xcf\x39\xa5\x9b\xb8\x1d\xa2\x08\x9f\xd3\x48\x8c\x8d\x76\x88\xce\x79\x57\x79\x18\x9f\xf3\x2f\xe4\x69\xcf\x98\x93\x3b\x86\xce\xc9\xce\xb9\xed\xf9\x4e\xbe\x67\xcc\x30\x39\xe7\x80\x73\xfb\xdc\xe3\xf1\x39\x26\xbf\x44\xfc\x44\x24\xab\x01\xd4\xa8\xa1\x01\x0c\x8e\x90\x9c\xf3\xc1\x81\x13\xee\x75\x5f\x8b\x07\x3a\xaf\x06\x13\xa3\x5c\x4d\x2e\x66\xdf\x71\x2e\x78\xde\x67\xcb\xa5\x0c\xbb\x7d\x66\x79\xd9\x2c\xcc\x01\x4a\x0f\x5b\x7c\xd7\x40\x1b\x3c\x46\x3c\x98\x0f\xc8\xa3\x3f\x79\x14\x67\xb3\xe5\x4e\x29\xcf\xec\xba\xe7\x98\xbb\xde\x72\x79\xd0\xc9\x66\xcf\x3a\xe8\x65\x88\x97\xcb\xcb\x08\x31\x32\x9e\xf1\x22\x6e\x5b\x25\x81\xc3\xec\x13\xcf\xc9\x33\x18\xe6\x00\x21\x2e\x27\xaa\x4b\x64\x5f\x78\x84\xd9\x27\xbe\x83\x31\x8e\x25\x12\x77\xb9\x14\x89\xda\x3b\xfe\x8d\xb5\xb9\x80\x5f\x79\xa3\xca\x9e\x83\x04\xb9\x3b\xb4\x40\x22\xde\xd3\x2e\xf1\xb0\xe5\xd1\xa0\x8b\x5c\x6c\x35\x69\xb3\xd4\x14\x58\xa6\x27\xb1\xdb\x21\xf2\x97\xcb\xc2\x2e\x8d\x70\x94\xdd\x2f\x31\x63\x96\xa7\x4d\x7b\xe8\xe4\x90\x5f\xf2\x79\x1f\x98\x05\x6c\xfa\xd9\x2c\x62\xbc\xbb\x61\xca\x92\x28\x5b\x2c\x31\x63\xce\x11\x0f\x24\xe2\xb9\xa7\x21\xce\x73\xd4\x17\x23\xa6\x1d\xa2\x90\x4b\x58\x25\xd4\xa1\x0c\xc4\xbe\x2f\x9f\x29\x45\x61\xf6\xcb\x67\x3e\xc2\x3b\xc6\xec\x7b\x60\x9f\x38\xcb\x65\xc7\x98\xfd\xa0\x01\xff\x1e\x87\x87\x59\x9a\xdf\xc7\xa4\xf8\x71\x1f\x90\x8b\x1f\xf7\x05\xf6\xfc\x7b\xc0\xcb\xe5\xe8\x73\x8e\x7e\xee\xc5\xe8\x9f\x31\x51\xa5\x65\xb3\x61\xb6\x28\x4a\xa7\x3c\x4e\xfc\x25\x2d\xea\xc9\x1d\x63\x96\xe3\x6d\xfc\x01\x1f\x04\xf4\x2f\x7c\x40\x33\xd4\x24\x2d\xa3\xcb\x66\x88\xa7\xe6\x91\xc2\xcb\x8b\x8a\x91\x02\xc6\xbc\xac\x4f\x50\xd6\x7a\x09\xf2\x83\x22\x3f\x80\xf3\x1c\x83\x04\x40\x32\x51\x85\x30\xbb\x0f\x2c\xd0\x5f\xc6\x4d\x2f\x15\xbf\x98\x05\xbc\x44\xe9\x12\x4b\x1f\xf7\x4d\xfe\x35\xde\xe4\x1d\x68\x33\xff\xc6\x27\x41\x04\x0a\x00\x5e\xe4\xbe\xc0\xa0\x12\xa3\x63\xcc\x73\xbc\x4b\xbe\x03\x65\x78\x8e\x8f\xfc\x7b\xb7\x7a\xbb\x0e\x9c\x3c\x02\xf4\x7c\x87\xcf\x25\xf9\x91\xa4\xc8\xaf\x10\xff\xb1\x5e\xe4\x8f\xbf\x29\x52\xe1\xe5\x45\xa7\x28\x52\x89\xd2\xd6\x4a\x50\xcd\x50\xa4\xe2\x13\x9b\x63\x10\xf8\x26\x96\x0d\x0b\xb3\x5f\x13\x5a\xc9\x8e\x2f\x7d\xf9\x24\x89\xa5\x97\x59\x2a\xee\x7f\x15\xd4\xa2\x3e\x36\x3b\x74\xff\xf3\x17\xd2\xc9\x7e\xfa\xf6\x05\xab\x65\xaa\x63\x5d\x47\xc8\x25\x0c\x5b\xd7\x7c\x8a\x35\x39\xc7\x64\x7c\x51\x73\xf9\x8e\xff\x30\x42\xb0\x28\x60\x02\x9c\xf5\xac\x83\xdc\x10\x2f\x97\x81\x9a\xc9\x25\xe4\x52\xd7\x9e\x39\xa4\xdc\x29\xb9\xc6\x79\x7f\x51\xee\xcf\x6e\xdb\x8b\x76\xaf\x49\x2f\x0f\xcd\x23\x0e\x6c\x80\xaf\xa0\x14\xdc\x05\x27\xaf\x2a\x4a\x06\x0c\xb9\xda\xe0\x22\x05\x9c\xbb\xc7\xe4\x56\x87\x1e\x48\x28\x48\x1d\x3b\xf0\xc5\xa0\x84\x02\xda\xe3\x93\x97\xb8\x7c\xe1\x74\x31\x61\x06\x18\x36\xc2\x91\x0e\xcc\xd4\xbc\xcb\x59\x61\x20\xfe\xf0\x61\xe7\xf2\xbf\x0a\x4f\x5c\x2a\x84\x99\x9a\x77\xa1\xdf\x45\xef\x0b\xb2\xbb\xd0\x5b\x26\xda\x28\x74\x4b\x76\x9c\x08\x72\x9d\x84\xb7\x3e\xa4\x34\x00\xc8\xe5\xbd\x0b\xac\xb1\xe4\xfe\x7b\xdf\x74\x71\x36\xff\x59\x5b\xc3\x7f\x72\x21\x79\xf5\x13\x44\xd8\x5f\x81\x2e\xc2\x6a\x48\x8f\x92\xb9\xe1\xd7\xb3\x99\xd4\xad\x60\x21\x42\x1f\x9d\x51\x57\x84\xde\x8f\x19\xf5\x56\x8f\xe8\xb1\x46\x7e\xd6\xb0\xf5\xb8\x51\xa2\x2c\xe1\xae\x06\x25\xd8\xf3\x03\x87\xc8\x22\x08\x4f\x12\xbb\x41\xe2\x11\x55\x9a\x2e\x19\xfd\x92\x6d\x82\xb4\x9f\x34\xbd\xc5\xea\x94\x98\xa9\x16\x4e\x2e\xb4\x3e\xa2\x5f\xa2\x0e\xbf\xb6\xd7\x81\xf8\x50\x8b\x3b\x58\x3d\x0a\xf0\x71\x51\x2e\xf1\x08\x17\x15\x89\xaf\x7f\xfa\x7d\x2d\xc9\xf5\x58\xb3\xeb\x4a\xb9\xc4\x17\x6c\xc8\xf6\xeb\x8a\x7a\xa5\xcf\x66\x41\xc4\xc6\x9f\xa8\xbf\x5c\x8a\xc6\xac\x1e\xd1\xfb\x1a\x79\xac\x61\xeb\x3d\xd4\x64\x1a\xb1\xb7\xf6\x08\xbf\xae\x56\x12\x69\x6b\x75\x61\x7b\x43\xdf\x22\x1d\x54\xda\x23\xc5\x02\xf1\x89\xac\x04\x30\xfa\x00\xa6\x1c\x64\x0e\x29\xab\xa3\x40\xe5\xc2\x96\x2b\xe2\x2e\xb6\xd2\xc5\x86\x6f\x17\x08\xa5\x71\xde\x2e\xb2\x86\x7c\x02\xc8\x42\xc8\x9b\x45\xc8\xc6\x69\xe5\xe0\x95\x46\x5c\x56\x17\xfd\xca\xb2\x9f\x38\x6f\x71\xff\x4d\xf7\xb1\xc5\xb2\xc5\x6f\xfb\x22\x56\x4c\x54\x7d\xfa\xde\xb5\xfe\x1f\x8d\x06\xb7\x0e\xa3\xc1\xad\xff\x99\xbc\x56\x20\x84\x6a\x4b\xd0\x2b\xe0\x92\xa6\x15\xd0\x80\x0b\xd9\x56\xa0\x44\xb3\x90\x8b\x08\xcb\x65\x00\x92\x42\xc8\x25\x03\x1e\xe1\x02\x82\x15\x52\x51\x21\x63\x96\x0b\x8c\x99\x15\xa8\xe8\x3c\x17\x18\x73\x28\xb5\x49\x41\xf0\x21\x21\x0d\xf3\x4d\x8e\x92\xa7\x4d\x63\x6e\x35\x6a\x48\x95\x4e\x02\x4c\x44\xb5\x80\x80\x9b\xc3\x31\x12\x7b\x04\x2e\x34\xd9\xc3\x67\x27\x9b\xdd\x65\xf6\xe3\xb3\xc3\x05\xa5\x1b\xfe\x53\x2c\xee\x7f\xa7\xcc\x8e\x78\x52\x71\xff\xe3\x0f\x11\x96\x6c\x77\xb7\x68\x8d\x5e\xda\x63\xaf\x85\x04\xf4\xd5\x63\xa3\xe0\x5d\xf1\xab\x09\xbf\xfb\x05\xf1\xfb\xed\xa3\xf8\x2d\xfe\x25\x7e\x3f\x49\xf8\xc7\xcf\x12\x4f\xc2\x3f\x7e\x91\xe9\x12\xfe\x51\xc2\xf7\xf7\x3f\xc9\x82\x8a\xb2\xa0\x4f\x12\x50\xdc\x97\x98\x32\xfe\x51\x7d\xe9\x9b\xcc\xf9\x59\x16\xa5\x32\x7c\xfc\xa6\x4a\x90\x09\x45\xf9\xcd\x8f\x5f\xd7\xbf\xb5\x6f\xc6\x6d\x04\x40\x41\xc5\xcb\x1d\x4b\xfa\xec\x30\x95\xbe\xe0\xcb\x97\x1f\x40\x80\xe5\xb2\xf8\xf5\xe3\x77\x08\xae\x34\x59\xae\x5b\x61\x89\x30\x07\xb4\xde\x45\x7c\x1d\x3a\x12\xa2\x64\xbb\xc7\xb0\x5a\xc8\x76\x0b\x7c\xa2\x4d\x3b\xd9\x6c\xa0\x96\x36\xaf\xce\x07\x11\x4c\xbf\xec\xae\x9f\x50\xfe\xb9\x8d\x5c\x0c\x9b\x70\xbf\xce\x37\x7e\x62\xdf\x96\xcd\xa2\xe2\x5f\x94\xba\xbc\x2a\xf0\xc3\xcb\xfa\x56\xa4\xd4\xc5\x49\xd6\x76\x88\xf8\xb7\xfd\x6c\xd6\xc3\xaa\x03\x65\xe7\xed\xab\x5e\xdb\x8f\x89\xb8\xaf\xc8\xfe\x4d\x92\xbb\xf8\xf5\x8b\x0a\x28\x7a\x7e\xfd\x4b\x05\xbe\x2a\xe4\x82\x0a\xac\x67\xdf\xdf\x4f\x68\xbb\x6a\x87\xe8\x40\x54\xc5\xa5\x94\x6d\x8e\x2b\x35\xa6\x3e\x9a\x31\x81\xd4\xa0\x91\x80\xa3\xce\x4a\xa7\x94\x46\x77\x88\x73\x72\x7f\xfa\xfa\x9d\x6f\xdd\x3f\xff\xf5\x83\xb2\xe5\xf2\xdb\x17\x88\x15\x0b\x5f\x20\xfa\xe5\x33\x44\xbf\x15\x20\xc6\xe9\x52\xd0\x6a\x52\x58\xaf\xc9\x47\xd9\x8a\x2f\x6a\xac\x15\x54\xd3\x0b\x8a\x18\x45\xd5\xf4\x62\x71\x8d\x60\x9f\xbf\xbd\x45\xb8\x2f\xc5\xff\x8c\x80\xeb\x7d\x54\x48\x3a\x2b\xae\x79\x7a\x98\xee\x16\xb5\x63\x0b\x5f\x91\xa6\xdc\xc1\x8c\xf6\x80\x09\xc4\x5b\x36\x3e\x64\x8e\x3a\x78\x6c\xae\x35\xfd\xdb\x47\x93\xd1\x6f\x45\xcb\x1d\x06\xac\xf3\x6e\xac\xc8\xce\x34\x92\x8b\x92\x5e\xd7\x32\x7e\x29\xc6\x53\xe5\xeb\x5f\x96\xa2\x44\x0c\xfa\x62\x49\xfe\xf0\x31\x81\x7d\xb3\xe2\xf9\x28\x61\xdf\xd6\x26\x22\x4f\x5b\x9f\x89\x4c\x5f\x0c\x02\xc9\xd6\xef\xc6\x6a\x95\x95\x2b\x6c\x4b\x70\xdf\x87\xa9\x0e\x3c\x7b\x41\x6c\xb9\x14\x8f\xb1\xbb\xd9\x2c\xc0\x5e\xa6\x08\x38\x7e\x50\x27\x77\x63\x6c\x35\x68\xc0\x79\xbe\xd5\x30\x9e\x85\x1e\xac\x61\xcc\x18\xe8\xf8\x1a\x46\xf8\x5e\x81\x7e\x79\x2c\x0e\x56\xe8\x6e\xd1\x6a\x18\x97\x03\x26\x02\x7e\x81\xe6\xf9\x6f\xa3\x2b\x01\x8f\x03\x99\xff\xbc\x49\x1f\xab\x56\xc3\x70\xbd\xb7\x96\xf4\xf3\xe6\xca\x6a\x18\x2f\x53\x6d\xbd\x91\x4b\xd6\x79\x93\x32\x9e\xf6\xa6\x34\xf0\xcc\x53\xcf\x5e\x52\x39\xfb\x15\xa6\x37\xff\x59\x14\xd1\xb9\xf8\x13\x12\x6f\x2d\xa0\xd5\x2f\x53\xab\x9e\xac\x47\xa3\x4c\xa5\x26\x74\x58\xa1\x2e\xc7\x1b\xbf\xd9\x9a\x56\xb0\xd2\xd4\x74\xfd\x64\x15\x32\x7e\x55\xf0\xb8\x35\xec\xbf\xbc\xeb\xa2\x4c\x85\xf5\x84\x3b\x5a\xb8\xb9\x20\x1e\xef\x02\xb3\x32\xf5\xa8\x26\xf8\xdc\x90\x8f\x13\x8e\x5a\xfd\x97\x76\xaf\x69\x64\xb0\xb5\x6a\x18\x37\x6f\x8a\x46\x95\x95\x55\x7d\x41\x0d\xb2\x41\xc7\x46\x59\xf6\x7b\xa3\x6c\x37\x9e\xf9\xde\x59\x36\x46\x82\x87\x15\x09\x66\x25\x88\xdf\xef\x23\x6c\x0a\x15\xfe\x21\xc2\x2b\xcc\x7b\x3c\xa0\x61\xdb\xda\x69\x18\xf7\xfb\xfa\xf7\x39\x6b\x96\x1f\x97\x65\x55\x1f\x11\xd6\xe0\xcf\x7a\x9b\xa3\x28\x18\xca\x07\x0d\x59\x14\xbd\x1b\x05\x63\xa9\x33\x7a\x27\x7c\xe8\xbf\x1b\x0f\xe7\xed\x5e\x13\x1e\x99\x6a\xf5\x5f\x12\x42\x64\x94\x08\x19\x48\x2d\x01\x6c\x81\xe4\x07\x44\x52\xa3\xcb\x64\x0d\x5a\x81\xd1\x45\x8c\x54\x4e\xa4\xb4\xda\x65\x64\xb7\x00\xab\x88\xea\x6b\xac\xc2\x12\xf5\x64\x24\x50\x0f\x18\xa0\x92\x83\x8e\xd2\xb9\x8c\x87\xf3\x57\x97\x32\xfb\xd9\x75\x56\x1e\xe3\x53\xdf\xc3\xaf\xab\xb0\x3f\x44\x7c\x2e\xb9\xf6\xc8\x77\x28\xbd\x67\xcc\xc2\xaf\x1c\x55\x28\x13\x5d\x7b\x71\xe0\x2c\x97\xae\x5d\x9d\x3b\x76\xdd\x57\x39\x03\xfc\x0a\x0c\x66\xc5\xa8\x6f\xa9\x42\xff\x50\x0d\x4b\x4f\x0b\xc7\x4c\x24\x2e\x18\xc3\x2b\x60\x68\x7a\x72\xfd\x30\x49\xb5\xd4\xdc\xa1\x8f\xd5\x12\x6a\xbb\x92\x4e\x7c\x53\x76\xdb\xc2\xa4\xd5\x95\x00\xfe\x0d\xd9\xcd\x1c\xf9\xee\x54\xd2\x0f\x88\x2c\x3b\x95\xcf\x61\x71\x26\x52\xa0\x3b\xd3\xb6\x4a\x68\x94\x4b\xe8\x72\x8c\x64\x98\x8c\x8e\xc5\xd7\xcb\xbc\xe2\x45\x08\x63\xa2\x06\xdc\xd5\xc2\x41\xea\x3b\x65\xc6\x10\x97\x6b\x1b\xc6\xe1\x61\x6a\x3e\x6a\xe3\x68\xb9\x84\x90\x1d\x3e\x3b\xe8\x75\x3c\x1f\x04\xe6\xf1\x21\x11\xe6\x7a\x26\x5b\x69\x8b\xbd\x6c\xbf\xd6\xeb\x9e\x5e\xf1\xa2\x95\xd4\x77\x58\x49\xea\x3b\xac\xf0\xfa\x4e\xda\x22\x16\x05\x8c\x30\xbc\x56\xeb\x61\x25\x55\xeb\x28\x80\x55\x44\x2d\x3f\xbc\xfa\x51\xc0\xb6\xb2\x2b\x4e\x72\x08\x5f\x0e\x58\xa9\x21\xbf\x78\xec\x31\x52\x10\xe5\x9b\x0a\x80\xd6\x28\x9f\x74\x12\xdf\xe3\xd2\xa0\xab\xfa\xb1\xfb\x9b\xaf\xfd\x56\x83\x67\x4a\xcd\xbc\x54\xbf\x36\xb1\xa5\xf5\x6b\x11\x32\x54\x1f\xdf\xe0\x14\x40\xda\x93\x43\x40\x2a\xb3\x54\xa9\x71\xf2\x73\x15\xaf\xf8\x74\xef\xfe\xde\x68\xa7\xd6\x33\xcd\x13\xad\x67\x78\x71\x07\x2c\x4d\x17\x46\x99\xcd\x86\x8e\x35\x88\x54\xe5\xe0\xf4\x55\x72\x5f\x88\x88\x0e\xf3\x58\x36\xbb\xab\xb0\x7e\x79\x0c\x92\x8a\x9f\x0b\x3f\x78\x27\xe6\xe5\x10\x94\xc8\x87\x87\x92\x24\x3f\xbb\xe9\xaf\xed\xff\x45\x95\x48\x1f\x23\xf2\xcf\x73\x69\x92\xd9\x01\x67\x71\x84\xd9\x73\xfe\x0b\xf9\x17\x6b\xb5\x55\x6c\xe1\x71\x10\x9f\x2e\x68\x6c\xa6\x1d\x22\xb0\xf1\x12\xef\xdc\xee\x52\x69\xf3\x10\xc0\x44\x16\x3c\x9e\xba\x3c\x4c\x76\xd9\x72\x99\x6e\x71\xa2\x9d\x95\xe3\x77\xa5\x64\x12\xa8\xe0\x2e\x75\x25\xdc\x7a\xbb\xcd\xa9\x0d\xe1\xa0\xc2\x52\xf6\x0b\x0f\x6d\xc4\x8c\xf0\xfd\x72\x69\x3b\x29\xfe\xaf\x76\x85\x94\x52\x51\x29\xd8\xeb\xe1\xd5\x4e\xc3\x28\xeb\x1d\x1f\xd4\x8d\xc0\x28\x6f\xc8\x13\xc6\x2f\x84\xad\x97\x78\xa6\x27\xe1\x61\x05\x5b\x7e\x10\x05\xf2\x65\x62\xe3\x39\x15\x6b\x05\xa9\x68\xf8\x5e\xab\x79\xa8\x6f\x4a\xc7\xdf\xe8\x27\x4b\x72\x2e\x10\xea\x41\x1f\x60\x05\xf5\x44\x7f\xc0\xe5\x94\xb0\x4e\x82\x3a\xb6\x6e\x5f\x50\x58\xdf\x7e\xe8\x2c\xcb\x10\x82\xce\x0a\x5b\xa7\xb3\x75\x54\x35\x4b\x17\x8c\x53\x42\x7e\x08\x20\x37\x08\x6b\xac\x6f\x85\xad\x70\x63\x07\x9c\x8c\x8d\x85\x1c\x1a\x8c\xee\xae\x65\x76\xe1\x2c\xe6\xee\x94\x08\x73\x1e\x83\xf1\x05\x35\x9b\xe5\x1c\xd8\x95\x93\x94\x33\x5f\x17\xf8\xae\x6a\x34\xff\xa4\x54\xab\x8c\xbf\x89\xdf\xc9\x0b\x83\x8c\x02\xb7\x98\xea\xf6\x66\x5d\xa9\x87\xc4\x42\x4d\xbd\xe5\x12\xb1\xd2\x6d\x07\x3d\x80\x1e\xd0\xbc\xed\x20\x0c\x0d\x50\xf4\x13\x78\xc6\x13\xba\x22\xaf\xe0\x4e\xc2\x3c\x9f\x71\x36\x2a\x05\x1f\x57\xed\xd7\x8b\xa4\x28\x61\x57\x0c\x60\xa3\x8e\xa5\x56\x54\xff\x80\xf3\x3f\x4e\xd9\x5d\xaa\x44\xc8\xab\xa1\x10\x21\x9b\x75\x12\xd6\xc5\xa2\xdc\xaa\x53\xdb\xb1\x1a\xb4\x29\x85\xc9\xa0\x29\xe4\xc5\xae\x8b\x1a\x44\xbd\x31\xa7\x5c\x23\x72\xa1\xe2\xe1\x92\x7e\x2e\x70\x21\xb1\xfd\x9e\xc2\xcf\x9b\x82\xde\x3d\x9f\xae\xfe\xc1\x1a\x6f\x81\x36\xab\x4a\x1b\xcc\xf7\x79\xb4\x3e\x46\x8c\x9c\xc9\x86\x77\xfa\x31\x6b\x17\x09\xa7\x32\x21\xbc\x5f\x4b\xb8\x3a\x15\x09\x41\xc0\xd6\x52\x6a\x4d\x91\x72\x38\x59\x4b\x50\x8b\xae\x56\x16\xf0\x4c\x3f\x18\x33\xaf\xb5\xce\x59\x18\x96\x15\x26\xcf\x09\xfb\x23\xb2\xf2\xf6\xb5\xeb\xa8\x9d\x4a\x6c\x6f\x22\xc7\xd1\x15\x33\xee\x19\xc2\xc4\xa3\x05\x8b\x73\x18\xcf\xb1\xbc\x5c\x0e\x6b\xa5\x28\x12\xd8\x8f\xae\x93\x66\x13\xcf\x8a\x4d\x5c\x8d\x91\xcb\xa9\xc2\x24\x49\x18\xb6\x00\x74\xca\x41\xa2\x01\x0a\x74\x75\x4a\x98\x22\x83\x82\xd5\x9a\x84\x49\x02\x28\x50\xfd\x50\xcb\xb9\x6a\x18\x57\xc3\x54\x8b\x9f\x25\xff\xe3\x35\x17\xdc\x7a\x54\x4c\x21\x68\x2d\xe4\x33\xc5\xcd\x66\x6f\x6b\xa0\xe9\xde\x22\xd3\x6f\xe2\x76\x22\x38\x16\xe2\x5c\xeb\xec\x45\x63\x16\x96\x38\xbe\x97\xa3\x3e\x3e\x08\x75\xed\x63\x4e\x60\xe2\xda\x87\x9e\x23\x98\xff\xc9\x74\xcb\x60\x9b\x25\xb5\x06\xa4\xdb\xbf\xde\x1a\x91\x0c\x61\xbb\xe7\x3b\x2b\x6b\xe7\x6a\xa0\xcb\xdc\x6b\x36\x10\xd3\x92\xe2\x12\xa5\x4f\x66\x51\xac\xf9\xef\xcf\x4a\x1f\xcd\x18\xbc\x6f\x16\x40\xc2\x4e\x2f\xd7\x5c\x20\x82\x4d\x99\x51\x7d\x8c\xb9\x72\x4a\xd1\x01\x4b\xf1\xe8\xc0\xc1\x6a\xb8\x30\xe2\xc2\x08\x69\xd5\x6d\xd7\xb1\xdc\x5c\x0e\x73\x76\x0f\x1d\x10\xe3\xf2\x95\xe8\x62\xee\xa0\xdd\x22\xb6\xde\xb7\x51\xab\x2e\x86\xed\x72\xd9\xaa\x83\x19\x1f\x0c\x6e\x96\x50\xba\xeb\x22\x21\x77\xda\x55\xdf\xc1\x56\xbb\x8e\xb4\xf1\xaf\x26\xd9\x09\x5b\x9f\x32\x6a\x96\x1d\xeb\x29\x4f\x2a\x73\x22\x48\xad\x09\x18\xf8\x35\x78\x8a\xeb\x64\xc5\xed\x8a\xab\xc3\x39\x1f\x2d\x58\x2e\x6f\xa2\x9c\x05\x2e\x6f\x56\x36\x2b\x16\x36\x68\x22\x17\xcb\x55\x13\x21\xe3\x29\x63\xd9\x6c\x47\x7c\x9c\x47\x60\xfc\xbe\x51\xfb\xab\x37\x6b\x7f\x24\x15\xfa\xd2\x18\xcb\x2a\x50\xa8\x96\x7d\xca\xa5\x09\x25\xbf\xb5\xaf\x29\xff\xac\xe8\xb8\xee\xef\xb8\xe3\xf8\x50\xba\x4b\x89\x8c\x6a\x05\xe4\x55\xa6\x54\x31\xda\x2b\x66\xdf\x48\xab\x4c\xd9\x16\x55\xae\x94\x8a\x8d\x8b\x17\x56\x12\xe9\xb2\x8d\x44\x0d\xa4\xe5\x12\x1d\xcd\x52\x7c\xc5\x9e\x1d\x38\xc8\x95\x02\xc4\xd5\x15\x2a\x60\x09\x87\xac\x05\x8c\xb1\xb9\xd6\x2a\x49\xb1\xf2\x94\x4a\xc5\x3c\xe7\xba\xfb\x6f\x4d\x81\x2b\xd8\x32\x4f\x8f\xdf\x4a\x0f\x9a\xd0\xc3\x37\xe3\x2d\xb2\xf2\xfb\x33\xf9\x09\x8b\x49\x42\x42\x3f\x22\xb1\xc8\xc8\xec\xaa\xf9\x41\x93\xc6\x63\x40\x35\x27\xa1\x94\x11\x34\x71\x2c\x47\xbe\x57\x2b\xf9\x7b\x23\x68\x0a\xa0\xa2\x94\xae\x1d\x1e\x2a\xbe\x28\x0e\xd2\x8f\xf8\x44\xb9\xc7\x16\x33\x66\xae\x31\xa3\xae\x7d\xe8\x3b\x39\xcf\x98\x09\xc0\x9c\xba\xf6\x11\x00\xe6\xab\x86\xd1\xe9\x6f\x61\x4d\x51\x5d\x52\x1e\xc4\x4d\x4b\xd5\xda\x4d\x66\x8c\xbb\xab\x37\x53\xd1\xdd\x95\xfd\x57\x9e\x2e\x97\x48\xd1\xbe\x31\x46\x3f\x45\xe4\x2e\x10\xb3\x2f\x3e\xf6\x91\xe8\x0f\x97\x18\x93\x91\xd2\x61\x90\x61\xb2\x14\xa4\x54\xe0\x4a\xd2\x1a\xce\x5f\xd5\x96\x75\x97\x29\xd2\xb9\xd8\xc2\x2e\x75\xed\xa7\xc0\x49\xce\x0e\xe2\x3d\xae\x84\x80\x34\xb5\x6a\xf0\xe5\x20\xd5\xea\xe1\xfa\xe2\xc3\x47\xbe\x98\xd0\x87\x93\xcd\xde\x0e\x9a\x94\x6d\xa5\x11\x64\xd3\xb9\xd9\x2e\x65\xf8\x35\x19\xc7\x96\xbe\x0e\x5e\xa1\xa2\xc6\x82\xfe\x11\xdd\x58\x4c\x61\x4e\x32\x2b\x26\x19\xec\x41\xaf\xae\xe8\x16\x51\xb9\x40\x29\x2b\x21\xc9\x74\x66\xae\x30\x36\x00\x23\x87\x6e\x1d\x44\x2c\x1e\xec\xd5\xe3\xa1\xa7\x11\x7c\xa4\x9d\x39\xe8\x9c\x79\x93\x6d\x0d\x22\xe4\x8a\xa5\x51\xcd\x73\xd7\xf8\xf5\x9e\x32\xc2\x38\x87\xa2\x2e\x5f\x50\xc3\xfb\xbf\x1d\x68\xc4\xd3\x00\xee\xb3\x03\xc3\xcc\x83\x15\x70\xcb\x1c\x02\x1d\x20\x51\x6c\x98\x24\x1c\x8b\xec\x26\x4c\x04\xca\x01\x86\x9a\x2c\xdf\x50\x74\x69\x8d\x57\x98\x92\xa5\x62\x21\xf4\x9c\xa4\x37\x92\x69\xc6\xad\x26\x84\x30\x34\x6b\xa7\x6a\xc0\xc7\x86\xd8\xe0\xae\xed\xc6\xd6\x16\xfd\xb8\x08\x57\xaf\xa4\x2b\x6b\xa7\x86\x81\x6c\x26\xd1\x2a\x97\xd8\xcc\x81\x6e\x98\x19\xe5\x69\x36\x8b\x7e\x8e\x11\x0f\x61\xc2\x12\x76\xa7\x19\xde\x74\x00\x77\x9f\xef\x27\x15\x87\x67\x9c\x69\xc1\x18\x63\x9c\xa7\x11\x26\x3b\x8f\x30\xa3\xfd\x1e\x6b\x79\xdb\xf2\x3b\xef\xcf\xd4\x77\xde\x9f\x71\xac\x98\xe7\xf1\xde\x2d\x6f\x6c\xbb\xd5\xa2\xf5\xa4\x8f\x70\xfb\x66\x11\xeb\xeb\x18\xaf\x46\x47\x93\x50\x2c\xbd\xc9\xa9\x1d\xd7\xbd\x10\x8d\xca\xda\x0a\x94\x9c\xda\x48\xb6\xf0\x2b\x7d\x48\xbb\x7a\x44\xdd\x3a\xf9\x55\xc3\xd6\x4e\x77\xfb\x09\x20\x7e\x75\x29\x1c\x06\x5b\x2e\x7d\x00\xf9\xcb\xa3\x5e\x89\x4f\x87\xe3\x08\x79\x60\x73\x55\x2c\x10\x0f\xce\xf0\x3d\xfb\xdc\xe3\x7f\x4f\x9c\x5c\xb1\x20\xe6\xcc\x71\x84\x8a\xc2\x55\x43\xb1\x80\xad\x86\x38\x09\x35\x7e\x12\x46\x3e\x11\x8f\xb8\xe4\x1b\x16\x07\xa7\x9b\x29\x9f\xf5\xea\xf7\x80\xba\xa9\x13\xe6\x8f\xbc\xf2\xbd\x3a\x9c\x20\xf7\xde\xaa\xbb\xd0\xcd\xa9\xdd\x4e\x81\x14\xb0\xf5\xd6\x39\xb1\x4f\xbc\xb8\x36\x3a\xce\x3e\x61\xa4\x08\xa9\xa9\x1a\xf5\xeb\x9a\x85\x30\x1c\xe7\x8a\x0e\x19\x82\x39\xa6\x4b\x99\xe9\x29\xfd\x71\xf8\xcc\x94\x1d\xc0\x33\xf5\x64\xe0\x4e\x18\xd7\xf6\xa1\xe6\x6e\x7f\x93\x7d\x3e\xdf\xa9\xfc\xcf\xd9\xec\x5d\x37\x51\x2c\xac\x2c\x91\xe9\x7e\xf2\xa6\x86\xbc\xf4\x10\x30\xa5\xc2\x30\x65\x69\x2a\xdb\x86\xea\xc7\x78\x56\xf3\xe8\x99\xaa\xfa\x72\xe6\x37\x89\x22\x2a\x39\xca\xf3\xdd\x72\x99\x54\x41\x82\x12\xfb\x0a\x01\xd0\x15\x15\x75\x55\x76\xd7\xa7\xb6\xb3\x6a\xd0\x81\xdc\x1e\xde\x3d\x6d\xb6\xb4\xeb\x73\x31\x94\x37\xac\x35\x4b\x69\xb2\x63\x8d\xc1\xdd\x13\x7a\x16\x03\x58\x28\xa6\xfd\x6d\x52\x15\xc7\x12\x1a\xaa\xdb\x13\xe2\xb3\x31\x33\x5f\x67\x26\x23\x73\xd3\x5d\x09\x3d\x55\x79\xb0\x71\xba\x4d\x02\x12\xae\xe7\xbe\x3f\x52\xb9\x8b\x3c\x7b\xd1\x74\xc9\xa9\x6b\x7a\xa4\xee\x9a\x3e\x99\x99\x01\x99\x9b\xa1\x2c\x71\x16\x6e\x2d\x91\x34\xd7\xcb\x1c\x1e\xca\x32\x9f\x2a\x26\x23\x9d\x8a\xe9\x92\x93\xb6\xe9\x91\xd3\xb6\xe9\x13\xc6\x0b\xad\x0f\xcd\x90\xf4\x5c\x66\x36\xa1\xec\xe4\x34\x61\x18\xef\xfe\xdb\x21\x2a\xec\xc2\x55\x1c\xcc\x83\x94\x32\x4e\xba\xaa\x53\x62\xf6\xe9\xc2\x41\xae\x5d\x70\x8c\x19\x81\x9f\x39\x36\x99\xe1\xb3\x35\x18\xf1\xe2\xd5\xc9\xa7\x45\xcb\xff\xce\xcb\xb2\x72\x39\x1f\x33\xa3\x3c\x40\x9e\xed\xe7\x8b\x8e\x5d\xe4\x39\x92\xf0\x9c\x87\x1d\x51\x8e\x0a\xcd\xe1\xbe\x0f\x14\xec\xf3\x82\xc5\x61\x1b\x2f\x7b\xa3\x5c\xa8\x84\x8e\xbb\xba\x7e\x49\x6f\x9d\xd2\x94\xaa\x48\xea\x0b\x95\x8e\x7e\x91\x40\x8e\x00\x39\xd2\x65\x4f\x9f\xae\xf7\x74\xc2\x91\x47\xf5\x75\x9b\xe4\x41\xdd\x2a\x7c\x67\x76\x95\x0b\x63\xc3\x3a\xf2\xb8\xcc\xec\x2e\x97\x9e\xed\x82\xe2\x37\xb1\x50\x06\x09\x64\x5c\x61\xf4\xf5\x61\xc2\xcc\x83\x2a\x19\x4d\x98\xd9\x3e\x22\xd5\x09\x33\x47\xc7\xda\x40\x1f\xc7\x9d\x23\x0f\x09\x3d\x79\x48\x78\x50\x85\xf9\xcf\x72\xd4\x15\x27\x8c\xe2\xb8\x6f\x74\xcc\xc1\xf9\x14\xac\x7d\x24\x60\x1f\xf6\x01\xfd\xc3\xbe\x4c\x54\xa7\x81\x1e\x65\xb4\xcd\xe4\xf9\xe4\x2b\xdc\x9d\x35\x3d\x12\xf4\x7c\x93\x69\xad\x9d\xd4\x13\x8b\x0d\x1f\x0c\xbb\x3d\x4a\xe9\x41\xb5\x04\x9f\xa4\x74\x74\x5c\xe2\x75\xc2\xd6\x5a\x45\x47\xc7\x66\x6c\x1c\xad\xaa\x23\x01\xd5\x27\x61\x79\xfb\xa7\x63\xc9\xa9\xae\xd8\x1b\x32\xc5\xb2\x06\x87\x8a\xe3\xbd\x8c\x05\x5f\x84\xc8\x75\x48\x4f\x6b\xe8\x27\x4a\x4f\xde\x14\x17\x39\x14\xca\x4a\xa9\x99\x4f\x23\x0a\x43\x1f\x9b\xc1\x78\x76\xac\xdb\x27\xe4\xda\x45\x67\x0d\x29\x10\xcc\xc4\x82\x5f\x97\x8f\x20\x59\x7e\x00\xb7\xd2\xde\x57\x38\x48\x6c\xab\xa6\x82\x07\x3f\xa2\x69\x9d\x4c\xc6\xda\x50\x7b\xe1\xfc\xcb\x6d\x1b\xbf\x7f\x0b\xa7\xe3\x0f\xfa\x3b\x0c\x07\xd2\xdb\xca\x8d\x74\x97\x24\x8f\xb3\x46\x95\xfe\xa4\x37\xfe\xfd\x9b\xfe\x97\xf9\x96\x4b\x79\x5f\x85\xde\x0d\x58\xee\xbf\x2c\xc4\xee\x80\x95\xec\x7f\x99\x3b\x97\xb3\xe2\x3e\x6e\xd0\x29\xb0\xec\x01\x43\x0d\xbe\x6c\xee\xdc\xca\x40\xc3\x78\xee\xd2\xcd\x7e\xf1\xa4\xd0\x76\x23\xc6\x8c\x67\xb8\x7d\x14\x35\xd3\x4b\xc4\xcb\x98\x7a\xb0\xbb\x04\xa1\x05\x9e\x83\xe9\x8d\x47\x5b\xce\x54\x3e\x49\x5d\x7f\x18\x4d\x46\xad\xb4\xd9\xdd\x94\x6d\xe1\x1e\xa3\x96\x3c\xb1\x4c\x63\xeb\x03\x10\x16\x80\x8d\x44\x9e\xd1\x9a\xae\x4b\x4d\x0d\x63\xf0\xe6\x51\xef\x10\xf6\xbf\xa9\x05\x5b\xd8\x68\x65\x91\xbc\x9f\xd2\xaf\x97\x18\x6f\xbd\x8b\xcd\xbb\xae\x5c\xb4\xac\x46\x6a\xb9\x4e\x36\x1e\x0f\x70\xcc\x04\xe7\xdd\x83\x41\xd0\xf3\x2b\xad\x76\xe4\xaf\x95\xdd\x0e\x91\x22\x32\xdf\x35\xb9\xea\x33\x42\x61\xe4\x1a\xcf\xea\x18\xc1\xa3\xb0\xbf\x10\xc7\x0c\x1e\x75\x2d\x50\x04\xd9\xcf\x0e\xf2\xc4\xe6\x67\x18\x80\x43\xc9\xcd\x8f\x70\x0e\x26\x90\xcb\x7c\x25\x21\x9e\x90\xef\x2f\xbc\x0d\x85\xa6\xf1\x1c\xdf\xc1\x48\x24\xf4\xa7\x89\x71\xe1\x71\xd9\x10\x60\x2b\x71\xc6\xb4\xa6\xb7\x15\x9b\x7c\x56\x62\xe6\x6e\xd1\x4a\x6e\x56\xf5\xeb\x6a\xff\x36\x92\xc7\x65\xd8\x62\xcb\x25\x34\x44\x33\x6f\x6b\x18\x47\x07\xe9\x81\xd0\x30\x1e\xb7\x29\x21\x44\x5f\xc7\x33\x79\x56\x4f\x2f\xf5\xc2\xd0\x4c\x2e\x06\x4d\xb1\x6e\x12\x0f\x5b\x4d\xbe\x50\xf9\x24\x88\xbf\xc9\x8c\xb2\x87\x9a\x24\x14\xa7\x26\xde\x5a\x97\x68\xf7\x63\x1d\xe2\xd3\x82\xe5\x7f\x97\x8b\xb1\xe5\xab\x5b\x80\x01\xf5\x48\x28\xd6\x68\xdf\x51\x6c\x37\xb4\x4f\x95\x65\xd9\xed\xa9\x19\xd2\xd0\x7e\xef\x08\x1a\xf6\x7c\x14\x90\xd0\x98\x91\x90\x2f\xa8\xda\xfa\x70\x7b\x92\xc2\x9b\xb1\x37\xf0\xee\x8f\x52\x78\xd1\x50\xe0\x15\x39\x22\xff\x73\xea\x92\xd0\xa8\xbb\x5b\xf3\x0e\x0f\x53\x79\x1b\x5d\xc8\xfb\x54\x21\xa1\xd1\xe1\x7f\x4e\xda\xbc\x00\xfe\x87\xf1\xcc\xf5\x21\x09\x8d\x9e\xcb\x52\x65\x54\x8e\x84\xa8\x79\xdd\x46\x01\x5e\xad\xf4\x49\x13\x15\x91\xc7\xb9\xba\xd5\x30\xfa\x9b\x26\x86\x24\xe0\xe3\x03\x10\x2f\x5f\xe2\x55\x4c\xec\x84\x9e\x1d\x14\x10\x96\xf4\x0a\x4c\xce\xce\x1b\x72\x9c\x2c\xa4\xfe\x49\x2b\x39\x2e\x26\x4c\x17\xb3\xd3\x30\x5a\xee\x9f\xcb\x09\xa3\x7f\x50\x4e\xc3\xa8\xd6\xdf\x2c\x66\x56\x8f\xb7\x5a\x7f\x5b\xcc\x88\x6d\xce\x48\x51\x8f\xb2\x87\x62\x83\x5a\x98\xcc\xeb\x59\x6f\xd7\x27\x73\xfa\xce\x91\x2c\xa6\x39\x5b\x4b\x8c\x92\x22\x3b\xeb\x45\x9e\xb5\xff\x50\x24\xe9\xc5\x85\x2e\xea\x1b\xc9\xbd\xa4\xd8\x28\x5d\x6c\x22\xac\xe8\x36\x84\x7a\xa9\x9c\xab\x3c\x8c\xd0\x7a\x8a\xd2\xbf\x32\x5e\x68\x8f\x80\xa6\xa4\x1b\xd1\xb7\xc5\x88\xeb\x50\x5e\xd3\x75\xe0\xc8\xb7\xb2\xc9\x28\x76\x8b\x82\xc3\x1d\xd3\xf9\x93\x26\xce\x54\xf4\xcb\xaa\x07\x7c\x00\x6c\x61\xda\xcc\x18\x06\x61\x30\x0c\x7a\x5e\x00\x9e\x6e\x57\x64\x57\x57\x23\xcc\xb5\xad\x21\x14\x28\x74\x5f\x32\xf3\xa3\x3c\x8e\x4d\x3e\xba\x50\x82\x6a\x7d\x8b\x01\xf5\xd3\x44\x5c\x01\x93\x5b\xc1\x2b\xaa\x18\x6e\x33\x36\x7c\xe8\x0c\xa9\x2d\x27\xee\x89\xb4\x05\x5b\x3d\xa2\x45\x9d\x4c\xeb\xba\x4c\x93\xd0\x9c\xd3\x99\xe3\x35\xeb\x9c\x67\x0b\x5e\xc5\x78\x99\x4f\xe8\x0a\xf6\xf7\x70\xbd\x79\x18\x70\x21\xea\xd9\x41\x3c\xc9\x3e\x74\x1d\xe4\xd9\x05\x07\x27\x3a\xfa\x90\x16\xad\xf0\xbb\x27\x64\xfd\x10\xc7\xb8\xc6\x13\x7a\x38\xc4\x98\xac\x67\x0e\x79\xe6\xf3\x08\x05\x7c\x76\xbb\x6a\x69\x0a\x78\xf8\xe1\x92\x16\x0b\x05\xcb\x35\xda\xef\x21\xc0\x8c\xce\x50\xca\x6f\x0d\xba\x90\x7b\xc7\xc7\x70\x53\x54\x78\x9a\xd8\x67\xcf\x20\xef\xdd\x8c\x91\xf0\x37\xb0\x45\x3e\x38\x11\x66\x22\xea\x1c\xfb\x04\xa7\xa9\x65\x2d\xea\x46\x60\x3f\xba\x4e\x22\x03\x60\x3e\x38\xd2\xd2\x04\x47\x32\x46\xad\xe4\xb8\xfc\x17\x92\xe4\x4f\x8d\x91\x17\xa8\x07\xb6\xdc\x27\x95\x9c\x5a\x24\xa5\x10\xa1\x6a\xb0\x5e\x31\x3e\x5c\x27\xd1\x16\x95\x98\x18\x99\xf1\x8a\x58\x42\x2e\x95\x23\x89\x30\x1a\xc0\x3d\x42\xa9\x6f\x71\xf9\xf6\xcc\x98\xe5\x98\x3d\x74\x88\x6b\xcc\x73\xcc\x3e\xe0\x81\x19\xc6\xa6\x92\x84\x5a\xde\x26\xb3\x51\x62\x05\x97\x64\xc4\xe2\x9e\x54\x52\x22\xfd\xad\x0c\x01\x84\x2c\x2f\x1c\x7d\x20\xf3\xe5\xf5\x66\xcc\x45\x90\x64\x30\x1e\x68\xbb\x15\xb1\xaa\x15\xd4\xd6\x61\x5e\x50\x5b\x87\x59\x51\x69\x4b\xe6\x45\xea\xaf\xce\x18\x3a\x78\xc3\x10\x80\xb7\xfc\x40\x6a\x67\x67\x42\x8c\x30\xe6\xf2\x77\x56\x94\xf1\x22\xef\x95\xf7\x1b\x85\xb0\x34\xe7\x98\xc1\xbe\x7a\x56\x90\x47\x0a\x73\x88\xce\x55\x74\x56\x84\xd4\xa2\x4a\x85\xe8\xbc\xa8\x6f\x53\x67\xa9\x7b\xaa\xc6\xac\x98\xe7\xc5\x59\x0c\x10\xf3\xbc\x2c\xd5\x89\x2d\x7b\xe1\x3b\xc8\xdd\x73\x73\x6c\x8f\x69\xfc\xa3\x9c\xda\xe8\xbe\x93\xda\xab\xca\x13\xe2\x05\x11\x5e\x24\xef\x75\x88\xcf\x79\x7c\x5e\x24\xe9\xab\xb2\x15\x7d\x53\x36\x8b\x09\x4b\xdd\xd5\x23\xaa\xd4\x49\xad\x83\xad\x06\xad\xc0\xac\x3a\x63\x5b\xcf\x31\xf9\x37\x2b\x8a\xa0\x92\x7e\x42\xc2\x8e\x9a\xdb\xce\xeb\x45\x53\x04\xfa\x9e\xf8\x11\xee\x00\xe6\x7b\x2a\xb3\x75\xc1\x3f\x55\xeb\xd8\x35\xc7\xee\x2e\x1c\x5e\x16\xf3\xfd\xcd\x19\x3d\xcb\x71\xaa\xc9\x2a\xf3\xf0\x5c\xdf\x43\x80\x68\xf9\x69\x4b\xae\xbc\x96\x2b\xbf\x2d\x97\x70\xee\xba\x65\x66\xb5\x0c\xaf\x3f\xe2\x73\x8b\xd1\x96\x31\x6a\xf7\xd4\x2d\x07\xb9\xa3\x99\xef\xb9\x39\xd9\x30\x49\xc8\x99\x3c\x26\xd8\x73\xf3\x12\x23\xa6\xb0\x97\xfe\xea\x7b\xb6\x66\x99\xa9\xa5\x82\x6d\xce\xee\xae\x3a\x05\x9c\xc1\xc0\x52\xe3\x0a\x86\xd5\x4a\xbf\xfb\x7d\xb8\x39\x28\x78\x37\x1b\xb3\x9c\x6b\xcc\xf8\x20\xc8\xb9\x9c\xca\x31\xfe\xd1\x5b\xf8\x79\x89\x9f\x07\xfc\x64\xd0\x1c\xcb\x0c\x8b\x6d\xab\x50\x4f\x5a\x01\x0b\xba\xdc\x76\x90\x8b\xed\x5b\xd7\x41\xfe\x11\x56\x1b\x7e\xb1\xcd\x90\xbe\x18\x02\x46\x3d\xfb\x76\xe1\xa0\x7a\x59\x82\xbc\x7b\xb5\xd9\x3e\xae\x93\x85\xbe\x30\x9d\x28\xcd\xb9\xcf\x96\x4b\xc4\x8c\x1e\xb3\x2f\x16\x60\xb5\xc5\x41\xe0\xec\xa2\x41\x8f\xe5\x1a\xc0\x6e\xb6\xee\x3d\x6f\x3b\x31\x63\x8d\xeb\xe5\xd9\x2f\x0e\x7a\x68\x71\x11\x04\x82\x37\xcd\xb8\x39\x43\xa6\xd7\xb6\xa7\x57\x56\xa3\x57\xbf\x8e\x04\xcb\x3b\xff\xf4\xc6\x29\xc7\xcb\x38\xd9\x03\xf5\x98\xe1\x45\x01\x1b\xde\x04\xde\x18\xbc\x13\x03\xff\xe5\xbc\x57\xa7\xf2\x69\x5d\x1b\x06\x7c\x61\x8f\xab\x7c\x37\xd6\x79\xc0\x59\x3d\xde\xfb\x31\x4a\xaf\xd5\xf5\x89\x8b\x33\xcb\xa5\xf4\x1a\x0e\x7b\x92\xeb\x3f\x57\x73\x96\x3b\xe5\x4b\x40\xee\x26\xc8\xb9\xb9\xcb\x40\xb3\x61\xaf\xca\x82\x52\x56\x6c\xca\x8c\x8d\x19\xa3\x00\xde\x64\x39\x64\xa3\x56\x29\x15\xe3\xdb\x57\x66\x9c\x2d\x18\x75\xf9\x0e\x68\xde\x4e\xef\x04\xc5\xb1\x90\xd1\x63\x84\xd7\xd4\x18\x06\x84\x19\xcf\x6d\x8c\xad\xb3\x97\x74\x8a\xe7\x42\x4f\x5e\x05\x58\x9d\xeb\x31\xa3\x17\x25\x76\x45\x2e\xa5\x8f\x47\xa5\x6a\x3d\xce\x65\x7f\x25\xfb\x0e\x36\x3b\x6d\xe4\x62\x1d\xee\x62\x53\xc7\x72\x92\xe2\xa6\x3e\xf1\x28\x33\x4e\x9b\x7c\x77\x2c\x0b\x96\xaa\x7f\xb5\xed\x72\x8d\x33\x17\x61\xb9\xf1\x5a\x9c\x99\x72\x6e\x3f\x5f\xa9\xd1\x42\xd4\x68\xf9\x24\x83\x37\x4d\x1e\xf4\x93\x91\x41\xce\x5e\x90\x4f\x5c\xa3\x35\x42\x18\x13\xdf\x7e\x5e\x38\xd0\xcd\x9f\x38\x5e\x7b\x06\x69\x0f\xbe\x48\x93\xe3\x97\x03\xf7\x31\xf1\x0d\x78\xe3\x89\x0d\xe8\x4b\x95\xf8\xf6\x60\xee\xa0\x7d\x52\xe0\x78\x8b\x85\x83\x3e\x01\x0a\x40\x0b\x22\xc8\xa1\xfb\xf0\x75\xfb\xbd\xcb\x0b\xf2\xa9\xb7\xd2\xe8\x1a\x0f\xb7\x61\xc0\xc6\xc1\x95\x78\x9f\x02\xf9\xa4\x3a\x67\x58\x6e\xfe\x05\x15\xbc\xc4\x2c\x26\x46\xaf\xa7\x9e\x7f\x42\x39\x8f\x2f\x27\x39\x8f\x2f\x22\x39\x8f\xef\x11\x73\x9e\x51\x77\x31\x71\xed\x97\x03\x5e\xa3\x1d\xcf\x78\x6a\xaa\x68\x91\x78\xc6\x4d\x08\xa4\x48\xba\x05\x5b\x2c\x19\x0d\xcc\xb8\x48\xc9\xb6\x73\x75\xe6\xee\x1a\x91\x97\xcd\xf2\xbf\xbb\xf4\xba\x84\xda\xb0\x19\x31\x22\x0f\xc8\xc4\xc8\x47\x8c\x4d\x80\x5d\x9c\xc1\x18\x82\xd1\xe3\xda\xc7\x0e\x71\xed\x4b\xdf\x29\xc1\x5f\xb3\x88\xb1\x05\x03\x5a\x75\xbf\x47\x2f\x2d\xd7\xb8\xf3\x40\xe1\xf9\x30\xe5\x1b\x52\xfb\xcc\x77\x78\x34\x47\xe7\x5c\xcc\xf2\x72\xd4\xb5\xe7\x9e\x93\x6b\xcc\x58\xce\x35\x98\x6b\x31\x23\xec\xf7\xc6\xd4\x5b\x35\x8c\xcb\x97\x2d\xf7\xdd\x64\x53\x44\x27\x4a\xc6\xde\x46\x7e\x32\xcd\xd9\xd0\x93\xd8\x05\xb2\xbf\xd7\x32\xae\xce\xe2\x34\x7b\x9a\x64\xea\x31\xbb\xed\xe9\x31\xe8\x4c\x35\x67\x4f\xeb\x4a\xdb\xb4\xd3\x30\xea\x9f\xb6\x6e\x8a\x55\xc6\xc6\x5c\xaf\x49\x90\x94\x78\xb7\x70\xa4\xba\xed\x87\x5f\x52\x7d\xc0\x57\x57\x54\x24\xfe\x07\x4e\x5b\xea\x61\x33\x95\xe0\x7d\xf0\x49\x91\x27\xac\x35\x08\x38\x56\xdc\x20\x12\x1b\xd2\xbc\xd1\x0a\x15\xeb\x2d\xb6\xb6\xa9\x61\x84\xd1\xdb\x4d\x4a\x37\xe2\x59\x34\x22\xd9\xf4\x73\x20\x3b\xd0\x80\x5b\x8a\xef\x17\xb6\x48\x21\x3a\x42\x54\xdc\x76\x44\x34\xe7\x5c\xe5\xef\x1b\x06\xeb\x4e\x71\xdb\x77\x9b\xb3\x37\x4f\x7c\x74\x29\xf2\x61\x14\xa7\x16\x64\x3a\x74\xf4\x62\xbb\xae\x00\x1c\x40\x00\xc7\x8a\xe8\xa4\x8e\x5c\xe2\x93\x10\x93\x1e\x0f\x7b\xa0\x4b\x20\x03\xca\xe5\x4a\x29\xe7\x2a\x6a\xa6\xb5\xab\xf0\xcd\x88\xf4\xc8\x80\x9c\x3c\xc5\x38\xb2\x70\xf8\xfa\xc3\xe8\x0f\x5f\x9f\x4b\x33\x09\x3e\x8b\x3b\x09\x55\xc4\xd8\x0b\xe8\xe1\x13\xef\x33\x9f\xba\x7b\x42\x48\xca\x07\x38\xe7\xed\x09\xd9\x29\xcf\xf7\x70\x90\x22\x63\x79\x2f\xc1\x8a\x4b\xfa\x35\x87\xcd\x5e\x13\x4e\x25\xfc\x1c\xfd\xb4\xd7\xe1\x13\xf3\xc3\x67\xb3\x49\x69\xfb\x88\x83\x04\xe0\x23\x07\x8c\x8e\xb3\x59\xe4\xe7\x25\xe8\x33\xb6\xc2\x5d\x7a\x50\x85\x1b\xb6\x1c\xd9\xcd\x4b\x0e\x7e\x88\x78\x75\xed\xa1\xf3\x61\xdf\x0c\x65\xb6\xcd\x44\x9c\x0c\x76\xe1\x74\xf2\x2e\x98\x8d\x81\x06\xda\x98\x7b\x9a\x3b\x0a\xd4\x31\x6e\x03\x65\x44\x11\xcb\x23\x81\xac\x4c\xf1\x33\xf1\x73\x34\xc8\x15\x49\xf1\x47\x00\x0e\xb9\x8a\xc0\xc5\x14\xf5\x02\xac\x58\x34\x70\x75\x5e\x60\x0c\xe0\xbc\x5d\xd5\xa4\x1b\xb0\xd1\x64\x28\xab\xc2\x6b\x99\x03\x54\x6d\x6d\x55\x98\x61\x3b\x8a\xc0\x81\x6b\x52\x10\x8c\xd6\xbf\x9d\x87\x7c\x13\xfb\x77\x33\xe5\xe8\x60\x5d\xc9\x2b\x8f\x7e\x95\xd9\x7a\x8c\x1d\x4b\x72\xcc\xda\xc2\x9a\x62\x96\xa9\xad\x0e\x17\x1a\x6b\xec\xf0\x29\x0d\xde\x5a\xc0\x79\x43\x22\x1e\x69\xf2\x53\x7b\xb0\x9d\x9b\xa4\x55\xbd\x9a\x04\xe6\xdd\xab\x4a\xa9\xee\x92\x82\x26\x49\x51\x26\xad\xdc\x9a\x6c\x53\x1c\xeb\x9f\xeb\x6d\xee\x6c\x4f\x52\x34\x88\xbb\x56\x08\x88\xb3\x4d\xdd\xdd\x06\xfe\x62\x91\xe0\x47\xc3\x37\xb9\xc8\x7a\x3e\xc3\x0d\x16\xed\x60\x58\x99\x0c\xa7\xc1\x5d\x5f\xd7\x8c\x89\xee\xbd\x6e\xeb\x6d\xd9\xf8\x2a\xac\x47\x2b\xb8\xa4\xf7\x87\xb9\x1f\x67\x0b\xf9\x3c\x0f\xf3\xdf\x0a\x7c\x9e\x1e\x3e\xa1\x26\x04\x99\xf4\x7d\x11\x2b\x30\x37\x7b\xfe\x4e\x29\xd2\xf5\xb5\xc6\xff\xc0\x48\xf0\x81\x6d\x5b\x68\xf8\x87\x77\x3b\x6b\xe3\x17\x46\x63\x77\x5d\xcd\x3f\x6f\x6e\x28\xfe\x9f\xd6\x21\xcd\xdb\x75\x48\x6b\x13\xe2\xaf\x43\x9e\x0f\xd7\xd6\x88\x98\x07\x36\x03\xa6\x79\xbe\xe2\x6c\xf7\xaa\x13\xa7\x6c\x4e\x5c\x02\x22\x06\xd4\xbf\xb3\xcd\x72\x52\x1f\x5b\x83\xa7\xf5\x03\xad\xe1\xbb\x5a\x5d\xf3\x6d\x27\x05\x76\x70\x4e\xe9\xa0\x69\x8b\x4b\xbe\xcc\xbe\xf7\x78\x58\xdb\x21\x9c\xc7\x47\xcf\x51\x1b\x79\x58\x1c\xf9\xc2\x11\xe7\x48\xc9\xda\x3e\x7d\x6e\xe6\xc0\x87\x90\x47\x29\xbd\x54\x17\x20\x28\xf5\x70\xad\xbe\x5c\xa2\x5a\x9d\xbe\xb2\x71\xbf\xdb\xf6\xcc\xdd\x22\x61\x93\x71\xdf\xeb\x77\x07\x51\x30\x0e\xcc\x6b\xe2\x0f\xfb\x83\x20\x0c\x03\x6f\x6c\x5e\x13\xf5\x20\x38\xc7\x8b\xda\xd3\xc0\xfc\x75\x4a\xba\x93\x68\xdc\xe6\x92\x2d\x07\x42\x44\x78\x3a\x66\x6e\x04\x20\xed\x1d\x3a\xf3\xa6\x45\x86\x01\xf3\xfb\xbd\x68\xce\x93\x86\x41\x14\x4c\x59\x6f\x6c\x2e\x9e\x19\x19\x06\xcf\x93\xf6\x30\xf0\x79\xc2\xa8\x3f\xe4\x9f\x73\x27\x23\xc0\xf3\xdb\x23\x5e\x1a\x24\x09\xdf\xb1\x3c\xd4\xee\x4d\x59\xd4\xf6\xcd\x93\xe6\x0a\x13\x8f\xd6\xea\xc4\x7d\xd7\xee\xbd\xf3\x04\xc1\x7c\xe2\xd9\xae\xa3\x48\xe6\x4b\xdb\x04\x95\xa4\x11\xf0\x22\x65\x1f\xc0\xec\x9f\xbe\x83\x38\xbd\x92\x6e\x07\x36\xe8\x69\x64\x2b\x5d\x2a\x17\x70\x29\x6d\xd6\x65\x3d\xd6\x43\xf4\x14\x6f\xd4\x34\xb1\x97\xe2\x74\xb9\x41\x2f\xe5\x26\xf6\xed\xd3\xc5\xde\x1b\x0a\xcc\xe6\x09\x5a\xd3\x59\x82\x32\xa6\x79\xa2\x17\xd4\x92\x56\x62\xbd\x3f\x29\x17\x37\xcf\x40\xa1\xec\xcb\xcd\x33\xd0\x2d\x3a\xc2\xf1\xba\x3a\x30\x26\xc1\xd5\x9f\xb4\x07\x95\x81\x66\x03\xd0\xb9\xa6\xaf\x2b\xa9\x11\xfd\x1d\x07\x9f\x0f\xd1\x61\x9f\x91\xd7\x50\x3a\x45\x37\xbf\x12\xe6\x9a\xcd\x0a\x71\xfb\x11\x74\xff\x1d\x1f\xa3\x2b\xbc\x7a\x44\x57\x6b\xfa\x83\x85\xda\x62\x30\xfe\x21\x66\xfc\x62\xc8\x3b\xc6\x16\x8f\xf1\x4e\x7f\x3e\x21\x22\x2a\x3e\xcc\xe4\x57\x99\x71\xfa\x9e\xff\xba\x42\x49\x5d\x19\xe0\x55\x83\x5e\xbd\xa5\x65\x18\x24\x96\xaf\xb7\x4c\x59\xf1\xea\x5a\xa2\x5f\x0c\xd5\xaa\x6f\xe9\x1c\x3c\x7b\xe6\x18\xca\x51\x32\xbd\x6d\x8a\xb4\xe9\x21\xb9\xef\xb1\x75\x8d\xc4\x42\x19\xd9\x7a\xdb\x74\x11\x3b\x1b\xda\xe1\x75\x27\x87\x6e\xdb\xb8\x7d\x38\x91\x07\xfb\xd9\x2c\xdc\x41\xb3\x07\x81\x83\xf0\x2e\xa5\xbd\xb3\x44\x31\xd9\x0c\xc6\xe5\x72\x7f\xa6\x9d\xb2\x1a\xf3\xa5\x6b\xcc\x96\xae\x7d\xe0\x2c\x5d\x7b\xe8\x94\xd6\x14\xca\xae\x52\x28\xbb\x4a\xa1\x6c\x5e\xf1\x61\x33\x89\xf4\x8b\x5b\x4a\x27\xb1\x99\xb2\xa1\x49\x59\x33\xf6\x17\xda\x14\xe2\x52\x66\xff\x72\x1d\xe2\x81\xa9\x93\x55\xfc\xee\x59\x98\xd9\xf7\xbe\xb0\x70\xc2\xc4\xcb\xe7\x13\x2a\x89\x62\xdf\x0f\xde\xbc\x44\x34\x64\xe2\xc6\x46\xe3\x0d\x55\x5c\xcb\x3e\x72\x50\xb1\x50\xd8\x63\xf8\x43\xb1\x20\x6e\x65\x6c\xdd\x16\x8a\x63\x12\xd5\xd9\xf3\x23\x6c\x05\xbc\x17\x1b\x47\x84\xc9\xe0\xcf\x23\x70\x19\xc3\x83\xa3\x56\xbc\x16\x0e\x9e\xc4\x81\x87\xb2\x42\xf9\xd3\x86\x4f\x9c\xaa\xa8\x6f\xf4\x8f\xb1\x15\x26\xdf\x08\x93\x6f\x40\xf0\xe1\x8c\x7f\x43\x20\x9c\xc5\x72\xec\xe0\x09\xfc\xa4\xc4\x4e\xa7\xff\xb0\x17\x4b\x7f\xed\xe8\x4c\x16\x76\x50\x8b\xbf\xd6\x68\x25\x5f\x6b\xc5\x5f\xbb\x69\xfe\xf1\x6b\xfa\xd6\x6c\x4d\xb8\x71\xe9\x68\xca\x72\x5e\xee\xe7\x8c\xe5\x50\x58\x62\x55\xf3\xb6\x89\x73\x93\x1e\xcb\xa1\xa6\x8a\xcd\x7a\x2c\xe7\xe6\x1e\x67\xcc\xf2\x63\x93\x12\x10\x3c\xda\x21\x8a\xda\x88\x61\xb0\x61\x0b\x68\x01\xdc\x3f\x56\x1d\x2b\xf8\xee\x59\x41\x2e\x87\xc7\xf2\xd0\xd1\x27\xcc\x0e\x1c\xc9\xf7\x35\x20\x97\x63\xbc\x28\xb9\x12\xe7\xae\x88\xaf\x9d\x72\x88\x19\x18\x1f\xb1\xbc\x0a\x7b\x0c\xd3\x76\x48\x30\x0d\x7a\xe3\x91\x69\x03\xb6\xb3\x82\x0e\xdc\xd8\x5e\xa6\x79\x41\xef\x0c\xc7\xa6\x66\x30\xd9\x0f\x9a\x84\xc1\xe2\x7c\x89\x13\xd2\x79\x9a\x8c\xe1\xfd\x71\x77\xc9\x85\xb4\x3f\xef\x2f\x61\x8f\xf7\xc7\x0d\x66\xe2\x7e\x52\x6d\x31\x49\xc4\x37\x96\x6a\x93\xc9\x63\xa3\x7f\xb8\xcd\xe4\x9b\xcc\xd1\xe6\x36\x93\x44\x7f\xbb\xd1\x4c\x6a\xe1\xb5\x51\xc7\xbe\xf4\x1d\x5c\xea\x08\xe5\x0e\x11\x2e\x1e\xdd\x1e\x7a\xe5\x1b\x1e\xb3\x63\x1f\x3b\xa4\x12\x98\xbd\x15\x74\x3e\x8f\x66\xb3\xfc\xef\x2e\xbd\xce\x66\x3b\xa0\x50\xea\x08\x85\x92\x2a\x73\x7b\x7e\x22\xf6\x7c\x26\x47\x26\x3f\x9b\x66\x8f\x4c\x98\xf9\x71\xc5\x9b\x0b\x4d\x2a\xc7\x4a\xdc\xc7\xb3\xcd\xe3\x6c\x32\x22\x11\xe6\x7d\x38\x39\x24\xe7\xad\xb7\x11\x07\x80\xa8\x68\x05\xc6\xda\x29\x23\x88\x9f\xdb\xb2\x48\x82\xfd\x3c\xfb\x9b\xe3\x76\x3f\x1e\x5a\xf7\x23\x2e\x9b\x8f\xeb\xa8\x40\x60\x3b\x4a\x9a\x3c\x3e\xa9\xa3\xa6\x3d\x77\x48\xd3\x08\x7a\x3e\x19\x1d\x63\xab\x99\xa7\x46\xf1\xb3\xd8\x63\x5b\xc2\xe4\xa5\xc2\x33\x71\x74\xd8\x8b\xc3\x8e\x1e\x5b\x9e\x4a\x12\xbe\x17\xe1\x46\x65\x93\xef\xe7\x3d\x63\x66\x79\xd4\x33\xe6\x96\xcf\x67\x86\x52\x98\x1e\xc2\xa5\xc5\xd8\x8e\x30\x4c\x0c\x1e\x7d\x4e\xa4\xeb\x2a\x39\xa8\xe2\x35\xfb\x46\x95\x72\x72\x8a\xd7\xac\x21\x55\xca\xe8\x18\xaf\x7c\xc9\x7d\x5c\x6c\xf9\x92\xfb\x78\x32\xf8\x3c\x61\xa4\x63\x30\x95\x32\xe2\x51\xde\xb0\xe5\xb2\x80\xad\x8e\x50\xf9\x41\x4a\xed\x98\x9c\x1f\xf2\xfd\xfb\x9d\x27\x21\xd5\x63\x72\x70\xa2\x76\xf4\x00\x19\x1f\x30\x12\xd6\xb0\xd5\x93\xf1\xc3\x26\x79\x69\x61\xab\xb0\x4b\x15\x46\xad\x45\x6e\xce\x72\x41\x6e\x14\xe4\x5c\xfe\xc7\xcb\x5d\x06\xc9\xb4\xf5\xb5\x6e\xf6\xa1\xfb\x1e\xff\xdc\x7d\x64\x10\xdb\x4b\x6c\x19\x04\x11\x19\x24\x16\x13\xbd\x0d\xb3\x90\x6d\xdb\x77\x35\x16\x2e\x9a\x78\x7d\x3f\x9b\x32\x7c\x7f\xa9\x83\xda\x42\xa1\x4f\x47\x5c\x2e\x29\x21\x4f\x5f\x62\x84\xba\xbb\x71\x44\x5c\xfb\xc4\x81\x35\xfe\xc3\xbe\x04\xf2\xc5\x06\x2c\xfc\xf9\x82\x1f\x43\x1f\xce\x48\x0a\xab\xc1\xe3\x90\x8e\x4d\xad\xe8\xa3\x33\x99\xce\x7b\x14\x9c\x4a\x7a\x6a\x49\x11\x7e\x13\x95\xac\xc4\x0b\x4b\x94\xee\x2e\xb8\xee\x13\x86\x07\x9e\x5c\x4d\x9f\x4f\xe2\x05\xa7\x32\x90\x36\x03\xf2\x88\xda\x72\xe9\xa5\x55\xee\x80\xa2\xdb\x65\xf6\xcc\x73\xec\x0b\xcf\x01\xfb\x85\x97\x00\x73\x79\xc1\x02\xd1\xff\xe0\x88\x74\xcb\x7c\x61\x79\x09\x72\x3e\xf4\xa6\x4e\xe4\x2d\xfb\x7d\x66\x57\x1c\x74\x12\xe6\xdc\xdc\x4d\x90\x93\xa2\xd7\x96\x6d\x3e\xa0\x1d\x6b\x68\x7f\xdc\xdc\x03\xf6\x53\x45\x62\xf3\x3f\x3e\xff\x13\xf0\x3f\x21\xff\x23\xfa\xf3\x3a\x7d\xd8\x02\xb9\x5a\xcd\xbf\xdf\xc6\xb7\x43\x54\xf8\xee\x67\xb3\x85\xef\x72\x75\x8f\xac\x88\x96\x9f\x50\x93\x7c\xfc\x52\xc0\xf9\x32\x5f\xac\x79\xc8\x2a\x7e\x2d\x7c\x8f\x4a\x51\x9e\x7e\xfc\x52\x30\xf3\xc5\xaf\x85\x1f\x34\xca\x66\x51\xc4\xe3\xb9\x48\x08\xb6\x3d\x2a\x54\xc1\x7b\x2d\xa3\xdb\xee\x89\x25\xd8\x28\xfe\x68\x19\xcc\x1d\xa1\xe8\xc3\xc7\x2f\x85\xbd\x1e\x86\x4c\xc8\x28\x7e\xe8\xed\x7d\xfc\x52\xc8\xcb\x44\x8c\xf7\x4e\x9f\x50\x84\x3f\xec\x93\x30\x4f\x23\xd2\xcc\xd1\x08\xaf\x42\x9a\x54\xa0\x99\x54\x4b\x7e\xec\x48\x28\x1b\x88\xcf\x97\xa4\x63\x19\x09\xb0\x15\xd1\x4e\xa9\x99\x0f\xcd\x30\xdf\xb4\x0a\x3f\xa0\x96\x39\x0a\xf9\x80\x2c\xfd\x50\x91\xd0\xeb\xb2\x1c\x12\x0d\x2b\x9a\x05\x38\x0a\x43\x9d\x24\xe8\xe6\x7a\x22\xe0\xe5\x06\xf2\xf6\xd2\xd1\x3a\x2d\x39\xa9\xc5\xec\x67\x30\x56\x6e\xe5\xcc\x5f\xd7\x42\x88\xdd\x86\x1a\xbe\x78\x5d\x25\x91\x24\x83\xf8\xbf\xae\x9f\x48\x92\x81\xd7\xad\x2b\x2b\x92\xe4\x86\x2a\xbc\xb5\x6d\x78\xbe\x38\xe8\xac\xca\x19\xa4\xcb\xa5\xfc\x17\x07\x9d\x54\x25\xfa\x86\x5a\x43\x93\x4d\x06\x87\xd6\x33\x43\x9e\x7d\xef\x3a\xea\xa6\x9d\x4f\xf9\xfe\xc4\x0a\xc5\x11\x16\xe7\xb1\xc7\x8c\x07\xe1\xd4\xe4\x1e\x5b\x23\x48\xe0\x3c\xb6\x74\x7e\x68\x5e\x62\xab\x22\x30\xef\xbc\xd2\xc1\x09\x8f\xdf\x80\xe5\xe4\x48\x59\x12\x81\x53\x6c\xe2\x51\xcf\x7e\xef\x3b\x22\xf1\x7a\x5d\x95\x12\x28\x0b\xd3\xce\xba\x67\x21\xed\x2e\xe8\xc5\x14\xeb\xfc\xee\x62\x2a\xed\xa3\x83\x08\x5d\x61\x8b\xb9\x88\xd9\x33\x87\x0c\x67\xf1\x8d\x41\x91\xf0\x3e\xe2\xd2\x4d\x8f\xf1\xff\xd2\x64\x8c\x8b\xe5\xcc\xbe\xf3\x1d\x29\xe2\xf1\x2d\xc6\x81\x2b\x1d\x1b\x5b\x9d\x48\xb3\xac\x91\x9f\x12\x1e\x9f\x7e\xb1\x6d\x36\xbb\x6a\x25\xbc\x9b\x3b\xa8\x77\x02\x5b\x90\x9d\xb4\x5e\x07\xa8\xde\xeb\x21\x17\x97\x50\xdc\x37\xc6\x30\xc0\x44\xf5\x9b\x6b\x5c\xb8\x98\x00\x4a\x36\x5b\xfc\x4e\x5d\xe3\xb9\x5d\x12\x2a\x8b\xd3\x2a\x36\x01\xed\x94\xa3\x3d\xb7\x31\x71\x8d\x5e\xb4\x4b\x2b\x2d\xa1\xe0\x78\x3a\x60\xe4\xa0\xc2\x10\x87\x8a\x72\x94\xb2\xe3\xe9\x80\x81\x37\x56\xf9\xc5\xeb\xe4\x73\x05\x8c\xad\x01\xd4\x47\x60\x1e\x1d\xcb\x6f\x1c\x1d\x13\xd7\xb8\x0a\xd4\x5e\xd6\x35\x1e\x4e\xad\x67\xa1\x4f\x62\xc9\x26\x83\x27\x34\xd2\x09\x0d\x48\x90\xbe\x8f\xe4\xd9\x6b\xbc\x4b\x7a\xee\x23\x9f\x14\xb1\xb0\x46\x27\x72\xe8\x3d\xfd\xb6\x03\x47\xfa\x63\x7f\xf5\x60\x6d\xb2\x92\x04\xea\x59\xe9\x1d\x56\xe3\x04\x93\x90\xfa\xc6\xac\x48\x9a\xd4\x37\x4e\x5d\xd2\xa1\xbe\x31\x2f\x92\x88\xfa\x46\xdd\x25\x3d\xea\x1b\x4f\x4d\x32\xa0\xbe\x71\x13\x92\x11\xf5\x8d\xc7\xe9\x72\x59\x24\x13\xea\x1b\xbf\x20\x34\xa5\xbe\x31\x1d\x97\xc2\x19\x33\x9f\x6a\xf1\x4a\xa2\x16\x95\x72\x8d\x84\x32\x78\x58\x23\x1d\x19\xac\xd4\xb8\x80\x04\xc1\xa3\x1a\x5f\xe7\x21\xc8\xa6\x8c\x4c\xb1\x15\xd2\xe3\x6a\xae\x97\x9b\xf6\x58\x6e\x64\x0d\x78\x64\x67\x00\xb1\x89\x35\x49\xd6\xbd\x2a\xb6\x26\x3c\xd3\xfb\x53\x72\x5c\x96\xe1\xe3\x96\xf8\xd8\xb3\x83\x26\xd8\xf2\x8d\x9b\x23\x70\x16\xac\xe5\x21\xbe\xcc\x13\xf6\x98\x8c\x40\x26\x61\x45\xe7\x63\xb2\x1d\xbb\xa5\x63\x0f\x62\x6c\x6c\xa5\xd0\x2d\x85\x7e\x52\x96\x61\xc0\xb6\x24\x76\x7a\x69\x5d\x41\xff\x1e\x1e\x93\x56\x4d\xb2\x3f\xe5\xb6\x46\x9e\xad\x1b\x53\x1f\xbf\x06\xf0\x6b\x79\x34\x80\xa3\xf5\xdc\xfb\x4a\x2e\x80\xf3\x6f\x11\x6a\x8d\x84\xb3\xee\x5d\xe4\xbd\x6b\xcb\x29\xd3\xb9\xc6\x5c\x90\x05\x55\x90\x94\x1e\x83\xb5\x73\xf9\xa4\xd6\x83\x96\xac\xe9\x62\xc6\xc8\x53\x4d\x46\x0e\x6a\xe4\x67\x90\x88\x87\x71\xf8\xa1\x45\xce\x55\xd3\x6e\x9a\x49\x78\x54\x23\x8f\x5d\x86\xad\x41\x6a\x9b\x3b\xd0\x8a\x1a\x68\x45\x0d\xb4\xa2\x06\x5a\x51\x03\x49\x10\xd1\x2c\x6c\xed\x80\x40\x3c\xd0\x8b\xbd\x68\x4a\xb4\x93\x2a\x11\x74\x90\xf1\xce\x01\x23\x2f\x55\x6c\x25\x03\xfb\xf6\x24\x19\x81\xb5\x72\x32\x04\x7f\x06\xc9\x18\x3c\x2f\x27\x83\x30\xc6\x39\xab\x42\x58\x49\x40\xdb\x4b\x8c\x4b\x39\xd4\x72\x56\xb4\xf0\x91\x56\xfa\x5a\x89\xaa\x59\xba\x51\xf9\x9c\xa5\x3b\x85\xe8\x9d\x42\xb4\x4e\x21\x5a\xa7\x10\xd5\x29\x17\x65\x19\xbe\x69\x26\x61\xd9\x29\x24\xd5\x29\x44\xeb\x14\xa2\x75\x0a\xd1\x3a\x85\x68\x9d\x42\xd6\x3a\x85\xc8\xca\x93\x54\x9f\x90\xb5\x3e\x21\x7a\x9f\x90\x14\x05\x89\xd6\x27\x44\xeb\x13\xa2\x28\xb8\x13\x47\x8e\x34\x24\x41\x42\x22\x49\xf8\x46\x91\xe7\x5a\x91\x71\xce\x8a\x16\x3e\xd2\x70\xd6\x4a\x94\xed\x5a\x05\x82\x63\xfa\x92\x8d\x05\xa9\x59\xab\xe6\x70\xe7\xda\xf6\x1c\x1a\xac\x24\xcb\x85\xa8\xb5\x7d\x3e\x2b\xa8\x0b\x26\x3a\xb1\xa7\x1f\xc3\xfd\x06\xac\xc9\x35\x9a\xc1\xf8\x16\xde\x9f\x86\x3d\xc4\x56\x96\x7e\xfa\xde\x0e\x1c\xf9\xc6\x00\xec\x35\x12\x28\xf5\x34\x5a\x9c\x35\x65\xdb\x80\xff\x6a\x5d\x14\x4c\x98\xec\x93\xd1\x09\x99\x0f\x54\x24\x38\x60\xc4\xb7\xeb\x0b\x47\x32\xb4\x54\xb7\x36\xe3\x3c\xd1\x31\xf1\x8d\x83\x17\xc6\x77\x81\x02\xd2\xe5\x90\xb2\x84\xa8\xac\xa2\x65\xbe\x7d\x09\x86\x21\x49\x41\xde\x04\x5e\xd6\x50\x51\x1f\xa2\xbc\x94\x8b\x16\x79\x38\x91\xe1\xea\x82\x91\x1d\xc8\x2b\xbb\x64\x12\x17\xac\xf3\xe4\x70\x92\x1a\xd0\xb3\xe3\x6d\x03\x92\x43\x55\x63\x17\x03\x96\xa0\x28\x1e\x9f\xe2\xc3\x6a\xf5\x6e\xc6\x1d\x97\xb2\xa0\x55\x5a\xef\x76\x88\xe0\x09\x98\xf8\x6d\x1b\x50\x33\xdd\x04\x78\xdd\xd7\x6b\xa5\xa5\x6e\xf0\xfd\x0c\xc4\xe4\x7e\x8c\xaf\xfa\xc9\x53\x8d\x4f\x7b\x2e\x08\xc9\x32\xba\x79\xf7\x8f\x7f\xb5\x02\x62\xe9\x0a\x6c\xe7\x37\x0e\x65\x85\x82\x2d\xc3\x86\x6d\x96\x87\x47\xf2\x33\xe6\x43\x8f\x11\xa1\x71\xbb\x98\xb1\xd5\xba\xb6\x4d\xc5\xb6\x28\xc4\xef\x5d\x47\xaa\x5d\x76\x0b\x5b\xaf\x11\x5c\xff\xe9\xd0\x21\x8c\x6f\xf7\x5d\x8b\x03\x83\x06\xbd\xfe\xaf\xd5\xfb\xed\x80\x4b\x96\x10\xbc\x7d\x42\x1e\xc9\x7f\x3e\xfa\x24\xfe\xc0\xc6\x7d\xe8\xe4\x8a\x47\x9f\x45\xf8\x00\xc2\xeb\x6a\x7d\x21\x28\xc5\xda\x26\x12\x50\xd0\x26\x5a\x97\x2f\x28\x20\x47\x65\x6c\x9d\xcc\x50\x40\x18\x68\x1c\x38\x73\x96\x2e\x01\x3f\x1f\x7d\xb2\xf8\x34\xe1\x82\xee\xe7\xa3\x4f\xd8\xf2\x24\xab\x4e\xd4\x0f\xff\x6b\x4a\xf5\xbf\xd1\x91\x33\xfc\x8f\x74\xe3\xed\x00\x75\x6b\x5c\x72\xdb\xdf\xf3\x62\x82\x05\x84\xe5\x3d\xe2\xe6\x3d\x12\x72\x39\x48\xd3\x8b\x83\xa1\xd1\x7f\xa8\x1a\x17\x9f\x88\x0b\x0f\x65\xe1\x3e\xd9\xdf\xf3\xc8\xfe\x5e\x5a\x37\xad\x7f\xe0\x1f\x2a\xc3\xdb\x01\x1a\x8a\xa7\xdd\x06\x3d\x14\x08\xf9\xdc\x87\xbf\x5e\x36\x2b\x0e\x05\x03\x2e\xf1\xea\x5f\x69\x82\xb4\xd3\xe3\xf8\xcb\x65\x13\x7b\xf2\xc4\xdc\xcb\x17\xc1\xd2\x4f\x1d\xa0\x43\x54\xaf\xf9\x9a\x89\xd3\xdf\x2b\xd0\x75\x0d\xf6\x3f\x55\xa6\x97\xcf\x56\x7c\xcf\x23\xcf\x91\xdc\x35\x55\xba\x78\xf5\x09\x54\xe9\xde\x77\x1f\x3c\x95\x28\x6d\x94\x4b\x98\xed\xad\xab\xd2\x5d\xb2\xa9\x24\x87\xdb\x1c\x89\xa6\xfc\x2d\x25\x79\x72\x6d\x4e\x11\xba\x5f\x8b\xb9\x68\x3b\x40\xbd\x5a\xa2\x36\x9f\xb7\xd1\x25\xbc\x6c\x79\x12\x62\x0b\x33\xfa\xf4\x84\x18\x58\xd5\x56\x9d\x7c\x51\xae\x83\x57\xad\x75\xad\x3a\xcc\xce\x82\xf4\xbc\x69\x0f\x1d\x35\x27\xe5\xcc\xf1\x53\xca\x77\x7d\x6c\xfc\x59\xff\xce\x29\x3f\x16\x5a\xf3\x80\x6f\x87\xc6\x75\xe4\x91\x26\xa8\x5f\x43\xbe\x2f\x68\x1f\x59\x1e\x28\xd2\xed\xb9\x43\x3c\xd0\xc1\x86\xe9\x2d\xa5\xb8\xe4\x03\xc9\xc4\x05\x04\xef\x3f\x34\x0c\xdb\xd0\x6d\xff\xbf\x51\x8b\xeb\x1a\xf1\x09\x33\xf7\x57\xf1\x3a\xf5\x37\xca\xf0\xc1\xdb\x89\xa0\xc8\x94\x6d\x1e\xfc\x13\xf5\x77\x04\xea\x8a\x3f\x5a\xa5\x25\x86\x67\x63\x65\x17\x27\x47\xb2\xd2\x58\x27\xc4\xa9\xd4\x91\x0f\x04\xc6\x24\xa2\x91\xf0\xe1\x63\x94\x3f\x21\x17\x4b\xdb\x33\xd0\x6d\xbb\x9a\xca\xdb\x17\x1d\x21\xee\x3c\xbd\x8d\xbf\xd1\x8f\x91\x31\x23\x91\x31\x27\x9e\x31\x23\x9e\x31\xd7\x6d\xec\xfe\xa8\xc9\x57\xfd\xa1\x8d\xfe\x78\xd8\xf6\xb6\x0f\xdb\xe6\x2e\x6d\xf3\xcd\xe2\x9a\xca\x9f\xac\xab\xfc\xdb\x47\x1c\xa6\x69\xf9\x49\xac\xe5\xd7\x8e\x69\x30\x17\xdd\x34\xea\x91\x20\x26\x05\x09\x30\x51\xda\x7f\x12\xa8\x00\x1c\x03\x10\x38\x06\x20\x3e\x0d\x8c\x19\x09\x28\xbc\x92\xe5\x52\x58\x15\x80\x9a\x10\xf2\x78\x27\x41\xc8\xe7\x7b\x13\x08\x81\xb9\x9f\x3e\xb9\x9b\x72\xd6\xc6\x8a\xd5\xdc\x71\xac\xc0\x5b\x84\x32\xfd\xb6\x0a\xe7\x2c\x6e\x9c\x73\x5c\x06\xc3\x5e\x2e\xb9\xb7\x20\xc9\x87\x07\x6e\x84\x9e\x4a\x9e\x03\x5c\x62\xa1\xc1\xea\x18\xcc\x85\xd8\x1b\xe7\x13\x9d\x1a\x61\xad\xad\xe7\x13\x9d\x1a\x27\xe2\xb6\xf3\x89\x4e\x8d\x5c\x8e\xf0\x4a\x9e\x33\x80\x3e\x2c\x39\x64\x00\x6d\xd8\xce\xc1\x89\xac\xe1\x11\x1c\xfe\xf7\x38\xb3\x69\xca\x5f\x37\x61\x3a\x3d\x12\xe9\x4c\xa7\x07\xaa\xc3\xbf\x3b\xfb\xf9\xc3\xd1\xc1\x3f\x3e\x38\xd0\x24\x82\x76\x80\x9e\xcb\x2c\x19\x78\x6c\xfb\xc0\x7b\xcb\x60\x6e\x5d\xa3\x08\xa2\x11\xf1\xa9\x2d\xa4\x5c\x17\x7d\x3e\xfa\x94\x93\x2a\xfe\x14\x48\x1d\x2f\xac\x81\xe3\x03\x86\x4d\x74\xec\x08\xd3\x09\x2f\x6a\x0f\x68\x38\x67\x39\x1f\x98\xfd\x6d\x80\x73\x97\xc1\x76\x7e\xbf\x29\x87\x89\x63\x02\x9f\xc6\x56\x14\x56\xea\x4c\x18\x4a\x69\xb9\xa8\x48\xc4\xbf\x14\xab\xbc\x6f\xad\xb0\xb6\x3a\x7b\x30\xc3\xff\x70\x58\x20\xa7\x04\x1f\xcf\x72\x4e\xbc\x65\x1e\xa8\xce\x0d\xde\xc8\xf1\x0f\xce\x10\x36\x73\xc6\x41\x3f\x09\x06\x49\x30\x4c\x82\x4d\xfc\xe6\x39\xc3\xaf\x8a\xe0\x63\x7f\x3c\x68\xf8\x93\x2a\x3f\x12\x53\xff\x48\xd8\x11\x12\x1f\x63\xd2\x13\xa0\x63\x09\xe2\x5b\x9b\x41\x8c\xd5\x54\x58\xa3\x18\x4b\xea\xfe\xb7\x33\x94\x6d\x8c\x27\xa2\x94\x0e\xb2\xd9\x1e\xa5\x74\x94\xcd\xa2\x4e\x36\x5b\xfc\x5a\xf8\xc1\xeb\x95\x17\xb5\x5c\x2e\x77\x13\x60\x98\x17\xd5\x05\xc7\x67\x15\x07\xa1\x4e\xe9\x6a\xc0\xcc\xa0\x82\x73\xc8\xcd\xfb\xf2\x98\x20\x1f\xa8\x83\x03\x05\xc9\xc5\x90\x48\x41\x7a\x0a\x32\x50\x90\x11\xde\x30\x63\x8c\xbb\x5c\x0a\xf5\x6a\x98\x7b\xf0\xf0\x21\x28\xb1\x15\x48\xfa\x8a\xd8\x38\x6c\x18\x6c\xc7\xdb\x38\x75\xb8\xdd\x8e\xb7\x71\xfc\xb0\xf5\xbb\x3b\x5b\x0f\x22\xd6\x2a\xfd\xe6\x89\x04\xd8\xc7\xcd\x5e\x10\xe3\x0c\xce\x44\x22\x54\xc0\xc4\xcd\x66\x3b\x33\x71\x51\xf5\x94\xc3\xe4\x08\xff\xdf\x39\xa4\x88\x6b\xa5\x0e\x83\xff\xb7\x8e\x2b\xd4\x35\x92\x60\x8f\x16\x8d\x22\x56\x97\x4c\x82\x3d\x6a\x7c\xdb\x7e\x98\xf1\xdf\x9d\x65\xe8\xe2\xfc\x49\x39\xde\x1e\x8b\xeb\x74\x0c\x2a\xab\x00\x33\x07\x6a\xad\x0e\x28\xf4\x13\x8c\x34\xd6\x35\xde\x7a\xa4\x01\x1d\xfc\xcb\xdd\x76\xa2\x21\x37\x78\x39\xf0\xb8\xdc\x0e\xfe\x74\xe8\x71\xeb\x0a\x57\x5d\x9b\x27\x1e\x7c\x10\x24\xee\xa5\x98\x3d\xf7\x1d\x12\xd0\x82\x15\x7c\x07\xbf\x18\x41\x2e\x87\x01\x68\x07\x8e\x7d\xe7\x39\xbb\xf4\xf0\x38\x9b\x4d\x43\x4e\xaa\x7c\x4a\xf2\x5d\xa9\x0f\x26\x3c\x9e\xf4\x1a\xe2\x95\x3c\x53\xb8\x8c\x84\x13\x13\x20\x6e\x3c\xc0\x60\x54\x89\xf3\x14\x31\xd0\xe0\xa0\xc5\xa3\xbb\x28\x7d\xbc\xc2\x17\x29\x75\x92\x42\xbc\xe5\xd2\xc7\xc9\x96\x75\xc4\xf7\x7b\x7c\x77\xe7\xa2\x80\x48\xed\x47\x6c\x19\x06\x99\x71\xee\x30\xc0\xc4\xe7\x63\xc0\xf0\xd9\xa8\x05\x5d\x46\xcb\xf2\x1c\x06\x94\x35\x42\x7b\x2e\x9c\xaf\x64\xb3\xe2\xb8\x65\xad\x9a\xc5\xb8\x8e\xa0\x74\xc3\xa6\x9a\x30\x96\x07\xbe\xdc\xdb\x51\x14\xf8\x38\x9b\x1d\xcb\x5c\x70\xf2\xa2\x5f\x6c\x03\x7f\x7c\xaa\xd6\x51\x4d\x0a\x1d\xc7\x47\x04\xae\x69\x89\xd8\x7c\xc4\xc4\x3d\x2d\x11\x8d\x5a\xc4\x13\x67\x23\x0a\x30\xe3\xe9\xbf\x04\x44\x4e\x2e\x63\x56\x24\x01\x85\x6b\x60\x21\xf5\x8c\x53\x17\x4c\x3f\xea\xae\x25\x6f\x0a\xfa\x94\x1e\xb5\xb2\xd9\x1d\xe4\xd3\x0e\x9f\x22\x45\xf0\x1b\x2b\x9d\xe1\x8b\x34\x14\xf0\xa4\x20\x95\x14\xca\xa4\x90\x27\x85\xa9\x24\x4f\x26\x79\x3c\xc9\x13\x49\x1e\x3d\x79\x42\x62\x9d\x01\xa1\xbc\xfc\x84\xf6\xff\x2a\xe4\x3d\xb1\xba\x40\xe5\x4f\x9e\x19\x1c\x7a\x4a\x3d\x5d\xe3\x38\x3e\xe2\x13\x94\x77\x8d\xa9\x5f\x42\x1e\x9c\x4e\x90\x14\xa9\x88\xca\x33\x68\xc9\x30\x90\x4d\xe8\x85\x35\xc2\x09\x75\xb2\x47\xbb\x7d\x84\x73\x3f\xbb\x2c\xe7\x89\x13\x8e\x6a\x97\x09\xb4\x59\x95\x4b\xce\xf2\xab\xd8\x14\x7d\x49\xe9\x75\x69\xac\xb8\x9f\xe8\xfb\xf9\x4b\xd2\xd3\xb1\x65\x84\xac\x4b\xcf\x45\xde\x96\x81\x76\x15\xc8\x81\xf6\xc8\x69\x22\xf3\x12\xa9\x44\x12\xce\xa9\xd7\x27\x9d\xf2\x9f\xc2\x39\xb5\x05\xaf\xd7\x0f\x9a\x62\x61\xd1\xb9\xbb\xc5\xd6\x97\x9e\x81\x8e\xe1\x63\xd0\x7c\x25\x80\x40\x3e\x96\xb0\xcd\x73\x46\x41\x77\x4f\x57\x8e\xdd\x9f\x6e\xd1\x42\x8e\xfe\xa4\x85\xac\xb4\xd6\xb5\x90\xcf\x0b\xb6\xae\x70\x2c\x83\xc2\x31\xe5\xde\xfc\x46\xf3\x1d\x20\x5f\x1f\x2b\x15\xbe\xd3\x6a\x1b\x9d\x76\x48\xb3\xc7\xb0\x59\xd6\x00\xef\xbb\x0c\x9b\x0b\x0d\xd0\xe3\x18\xf0\x30\x96\x82\x04\xf0\x64\x59\xfc\x64\xcd\xc9\x90\x0d\x5a\x6d\x6f\xf4\xae\x3d\x82\xe7\x7a\x46\x93\xc1\xa0\x3f\x1c\x07\x7e\x26\x71\x7d\xc1\xc5\x91\xb1\x83\x8a\x47\x9f\xf7\x5a\xf6\xa9\x07\x37\x4c\x5c\x66\xbb\x07\x8e\x3d\xea\xb3\x5c\xe0\x58\x38\xc8\xe5\x04\xaf\x3e\xea\x50\x80\x59\xca\xbf\xec\x90\x51\x26\x7c\x8b\xa6\xdd\x88\x50\x3e\xe1\x7f\x32\x75\x93\x99\x5c\x4a\x66\x7f\xdd\x51\x1e\x11\xea\x5d\xfd\xa6\xb3\x80\x8d\x7e\x8b\x52\x1f\x22\xcd\xc8\xba\x3f\xa2\xea\xb1\x94\xc5\x75\xec\x1d\x64\xd6\xd1\x50\x82\x67\x46\x91\x4b\x0f\x3a\x25\xc1\x59\x02\x66\x87\x81\x53\xfa\xf6\x43\x04\xcc\xdd\xb3\x0e\xf2\x43\x6c\xee\x16\x71\xe9\xba\x6e\x5e\xd5\x93\xc7\x74\xae\xa9\xcb\xd9\xa7\xd4\xdb\xd4\xbb\xb0\x28\x0c\x4f\x30\x09\x5d\xb5\x26\x1f\x75\x30\xf1\x8d\xb6\x44\x39\xea\x90\x41\xbc\x5c\x5f\x77\xec\xa1\x23\xce\x11\xe0\x45\xd1\x04\x7c\x10\x83\x5d\xbe\x66\x17\x30\xd9\xe9\xf1\x40\xe3\x14\x93\x87\x17\x01\xa9\xc9\x5f\xdf\x60\x51\xd4\x7f\xb9\x1b\xb2\xde\x68\xc0\x38\x11\xe7\xf4\xbc\x05\xee\xfc\x78\x25\xea\x53\xe5\x67\xbf\xde\x8d\xad\xd7\x86\x8c\xc0\x41\xaa\x2f\xde\xea\xf1\xd5\x5b\x3d\xc4\xb7\xcf\xc5\x3b\x21\xd4\x76\x88\x5b\x42\x20\x16\x56\x7b\x8c\x4f\xbd\x8a\x83\x1e\xcb\x32\xf0\xab\x2c\xce\xd7\x2b\x0e\x3a\x8c\x53\x6b\x71\xa8\x13\xa9\x50\x14\x69\x79\x65\xe8\x26\xc6\xab\x94\x55\xe8\x70\xa2\x42\x41\x9c\xe3\x57\x4b\x06\x0e\xe2\x0c\x77\xaa\x02\x47\x31\xa8\x1d\xe3\x77\x43\x19\x38\x8d\x13\x6f\x14\xfe\x3d\x9c\xb9\x05\x73\x07\x89\x09\x39\x0c\xe0\xa4\x0c\xfc\x1d\x5a\x95\xc4\xd4\x7c\xf5\x88\x6e\xd6\x7c\xe0\x55\xd2\xde\xb2\x7f\x22\x66\xf4\x26\xf0\x6e\x8e\x0f\x91\x3e\x44\xac\xdb\x3a\xe2\x2c\x08\x1c\xb5\xdc\x80\x7e\x7d\xa7\xc1\xd3\xd6\x44\x21\x39\x70\xe4\x46\xd4\x62\x54\x4d\x86\x7a\xd7\x90\x23\xfe\xa8\x83\x71\x89\x89\xae\x61\xaa\x6b\xcc\xd8\xed\x80\x1b\x0f\x73\x66\x77\x7d\x07\x0d\xe6\x0c\x6c\x5f\x90\xbb\x6d\x1a\xa9\xa9\x71\x57\x47\x60\xf8\xa1\xc6\x98\xfe\x8c\xd2\x43\x94\x1a\xc0\x57\x98\x9c\xcb\x1b\x14\x0f\x11\x79\x6e\x91\x71\x0b\x93\xf7\x09\x44\x95\x20\x5d\x4b\x47\x86\xdf\x1e\xd2\xf7\xf2\xc1\x29\xa1\xe8\x97\x29\x12\x45\x7c\x5e\x8d\x3c\x95\x3d\x99\xa0\x05\xfd\xb5\xf8\xfa\x9a\x3b\x03\x26\x2f\x9f\x8b\x8a\x05\xd4\xe7\xec\xfd\x86\xaf\xaf\xd7\x98\xb3\xf9\x00\xd8\x3c\x3c\x8e\x4b\x5d\xd8\xec\x16\x72\xf7\x70\x56\x00\x06\x75\x10\xc5\xd6\xc9\x0b\x0a\xc8\xe3\x29\xb6\xce\xeb\xc8\x27\xb7\x4d\x90\x29\x7c\xed\x54\x85\xaf\xf9\xe0\x49\x48\xa8\x47\x49\x00\xf6\x9d\x70\x83\x08\x20\x4c\xdb\xfe\xfa\x2b\xbe\xfb\xdd\xe8\xda\x5d\xd5\xb7\x6a\x79\x10\xa2\xad\xcc\x85\xfe\xd0\xd5\xd5\xb9\xb3\x5c\xba\x11\x5a\xef\x74\xe1\xa7\x06\x67\xb3\xcc\xf8\x1d\xf5\x99\x1f\xc0\x31\xc7\x93\xbb\x7e\xf1\x61\x57\x92\x12\x6b\x17\x76\x80\x45\xeb\xde\xe6\x0a\x8a\x0d\xda\x55\xe7\x3b\x65\x96\xba\x01\xa1\x18\xe9\x43\x84\x25\x95\xad\xf3\x08\xb9\xbc\xe3\x39\x65\xe1\x05\x66\x70\x18\x0c\xf6\x44\x27\x65\xb0\x9d\x90\x39\xa4\x56\x47\x28\x22\x15\x37\x55\x4f\xba\x8c\x7e\x63\x6b\x3a\x8e\x4f\x91\xd4\xd7\x85\x37\xa3\x94\x2a\xf1\xda\x66\xe0\x9f\x2a\x3a\xd8\x4a\xd2\xb5\x86\x25\xa4\xee\x24\xd3\x28\x3d\x80\x13\x36\x1f\xbc\x88\x5b\x49\xd6\x16\x1e\x28\x91\x8c\x81\x87\x70\xba\x46\xb3\x8e\xd8\x24\x3c\xaf\x6f\x2b\xeb\xba\xd3\xce\x94\xaf\xbd\x5d\x35\x2d\x95\xcb\x4e\xe1\xdc\xaa\xba\xe9\xc9\x97\xd7\xff\x5a\x12\xfd\xba\x43\x18\x8e\x5f\x64\xbb\xee\x50\x55\xab\xeb\xd4\x46\x30\x35\x62\x2c\x4f\x3c\x7a\xee\x6d\x5f\x46\xbc\xcd\x65\x44\x9f\xec\xfd\x51\x36\xbb\x65\x32\xab\xd9\xb8\x5c\xc6\xdc\xd0\x4d\x79\x9d\xbd\xd5\xa4\x0d\x66\xd7\x1d\x84\x4b\x2e\xfc\x98\x87\x9a\x43\xad\xe4\x56\x99\x0e\x95\xe7\x62\xf2\xfc\xb9\xe4\x9b\xc5\x02\x97\x12\x66\x5c\x9a\xd3\xc9\x19\x7f\x23\xc0\x2b\xcc\xff\x6c\xbb\xa6\x55\xef\xa6\xdc\x47\xa9\x5b\x5d\xb3\x4e\xec\x88\x6a\x71\xbd\xd5\x11\xd5\xcd\x9b\x4e\xc1\xef\x37\xdc\x34\xdf\x6f\x73\xd3\x1c\xdf\x9e\x17\x8e\x9a\x5f\xdd\xe1\x64\xd4\x32\x19\xf1\x7f\x9b\xee\xea\xcf\x5e\x9b\xe1\x26\xee\x9f\x5c\x37\xc7\xb7\xca\xee\x9e\x10\x23\x1b\xee\x9b\x5d\x32\x37\xbd\x3f\xbb\x6f\xd6\x9d\x2d\xab\x12\x74\x17\xce\x2e\x99\x17\x4d\x8f\x9c\xba\xa6\x4f\xea\xae\x19\x90\x99\x19\x92\xb9\x74\xb3\xfc\x07\x17\xce\xa4\xb3\x59\xae\xee\xc6\xd9\x25\x9d\x8a\xe9\x91\x93\xb6\xe9\x93\xd3\xb6\x19\x10\xc6\x0b\xae\x0f\xcd\x26\xb8\x71\xee\x40\xf9\xd7\xeb\x4f\x33\x6a\x2b\x59\xd7\xb7\x0b\x8e\xe1\xff\x8e\xbd\x2e\xfa\x30\x72\x8c\x19\x71\x85\xb3\xa5\x44\xc8\x3e\x4a\x3f\x44\x9a\xf2\x21\xa9\x7c\x44\x2a\x1f\x90\x4a\x00\xa7\xcc\x7e\xef\x10\xf5\xd8\xb3\xf0\xf9\x83\x63\x6f\x8f\x22\x59\x2e\xac\xe5\x27\xc4\x8c\xfa\x50\xec\xb2\xd2\x5e\xa7\x98\xf1\x54\xc9\x1d\x3d\x21\x37\xff\xad\x40\x98\x71\xd2\xc6\x84\x19\x9d\x4a\xee\x38\x06\x9d\xb6\xf1\x86\x99\x80\xcc\xcc\xd9\xe7\x6a\xc3\x7f\x26\xd6\xde\x3a\xb2\x1d\xe9\x37\x5d\x3a\xd1\x54\x84\x49\xfb\xd1\x54\x50\xdf\x21\x21\x0d\x0c\xff\x37\xe7\x85\xa1\x7d\xea\x50\x7a\x7b\x8a\x3d\xca\xc9\x13\xca\x77\x94\xc6\xe6\x6b\x22\xa4\x07\x06\x8c\x55\xd2\xa4\x05\xab\x29\xbc\x52\x37\x55\xb1\x1d\xea\xda\x4d\xb0\x47\x7c\x1f\xf0\x55\xb3\x23\x70\x31\x7e\x0d\x68\x27\x7e\x15\x76\xd5\xa1\x72\xbc\x07\xa4\xeb\x9b\xc2\x71\x28\x09\x42\xe9\x49\xcd\x05\xb1\x8f\x2f\xa3\x9d\x55\xbd\x83\x02\x23\xe0\x3b\xd7\xe5\x32\xe0\xd5\x3d\x5d\x38\x48\x9e\x10\xf1\x95\xba\xeb\xf3\xa1\x14\x62\xb0\x99\x0b\x42\x59\xeb\xd5\xaa\x1d\x22\xf6\xc4\xf7\x68\xd2\xc7\x92\xb2\xb6\x2b\x52\xe1\xeb\x9b\x51\xf0\x45\x0a\x3e\xbc\xbb\xbe\xf0\xe5\x2d\xaa\x2a\x5a\xec\xf1\x74\x86\xc4\xe6\x44\x90\xd1\x55\x04\x0c\xa9\x2b\xa8\x06\x45\x84\x3c\x7f\x28\x33\xcb\x5d\x25\x09\xe1\x5e\x94\x7e\x5c\xc7\xf4\xfd\xdd\xb1\x18\x7a\x49\x97\x49\x12\x78\xb4\x60\x79\xb1\xd3\x53\x78\x95\x07\x66\x0a\x07\x78\x7c\x58\x6f\x7d\x9c\xfc\x24\x2d\x54\xca\xb2\x7c\xf0\x92\x6a\x09\xa7\xe6\xbc\xbc\xe5\xb2\x28\x02\xf1\xb3\xd1\xda\xce\xcb\xe6\x54\xe2\x6d\x2a\x58\xa1\x50\x2d\x85\xaa\x4f\x9b\xd4\xb7\x43\xc7\x6a\xda\xef\x9d\x6c\x16\x1c\x40\xcb\x91\xc8\x21\xc6\x8c\xc0\xcf\x9c\xaf\x0b\x90\x06\xcf\xe3\xaa\x7c\x3e\x1c\x2c\x3b\x30\xaa\x2a\x47\x7c\xa0\xd9\x45\x47\x3e\x04\xd2\xa1\x81\xbd\xaf\x22\x11\x0d\xec\x80\x23\x7f\x54\x90\x9e\x82\x28\x1c\xab\x59\x42\x81\x5d\x70\x68\x8f\xc8\x94\xa2\x43\x43\x6c\xd6\x3b\x28\x24\x3d\x2c\x13\x23\x2d\xb1\x83\x4d\x01\x2c\xd7\xd5\xf5\x2b\xe9\xa7\x95\x74\x8c\x19\xe9\x18\x73\x4c\xf2\x45\xac\xe5\x48\x10\x7b\xc6\x8c\xf4\x8c\xb9\x3a\x95\x04\xc4\x64\xab\xda\xa1\x85\x1f\x2e\x11\x37\x70\xc9\x48\xfc\xf4\xc4\x0f\x6f\x09\xaf\xb5\xa4\x25\x8d\x80\x92\x7c\x9d\xe6\x63\xd9\x0e\x1d\x12\xd8\x61\xae\xe8\x60\x41\xdd\x89\x35\xa1\x1c\x0a\x24\x9b\x52\x91\x46\x16\xa4\x4c\xd1\xd4\x98\xe7\x27\xc6\x1c\x7f\x40\x53\x63\x96\x9f\x18\x33\x6c\x2d\xe8\x4e\x8f\xa1\x32\x2e\xbd\xde\x47\x66\x99\x3c\xf6\xcd\x89\x31\xcf\x97\xf7\x26\xc6\x6c\x65\x72\x98\xcf\x04\x70\xb6\xb2\xca\x74\x61\xdc\x47\xd6\x82\x2e\x8c\xc7\x3e\x1f\x07\x65\x4a\x7d\x86\x27\x34\xc1\x2b\xfc\x90\xdf\x28\x2d\x72\xae\xb9\xc8\xbb\x2b\x31\xfa\x79\x5d\x0e\xa9\xbb\x27\x3c\xd0\x15\x73\xe5\xbd\x32\xb6\x44\x46\xf8\x68\xe1\xbb\xac\x51\x69\x91\x3b\x34\x17\xf9\xc3\xd5\x6a\x50\x42\x53\xfa\x50\x47\x03\x32\xc1\xa4\xd7\x46\x53\x5c\x42\x65\x0e\x68\xd4\xd1\x88\x37\xd9\xc1\x64\x80\xc9\x42\x82\x80\x10\x23\x00\x95\xe9\x6d\x17\xa8\x7e\xd5\x45\x65\x63\x46\x16\xc6\x0c\x93\xa9\x31\xc3\xd9\xac\x9e\x30\x27\x0b\xde\x0d\x53\x3e\xd4\xcc\x32\x9d\xf2\xc6\x90\x01\x2d\x67\xb3\xd3\x5d\xea\xb3\xd2\xd4\xdc\x28\xd9\xe3\x93\xe7\xb4\xc2\x50\x8f\x0c\x30\x26\xe5\xe5\x12\xf5\xf4\xef\xcb\x8e\xe0\x35\xf6\x8c\x59\x08\x40\x63\x06\x95\x35\xe6\x44\xdc\xbb\x70\x71\x12\x28\x7e\x2d\xe4\x8b\x5f\x0b\x7b\x2d\x7b\xc6\xf7\x4a\xc6\x2c\x2f\x73\x0c\x8c\xb9\x08\xce\xf1\x07\xf0\xf4\x93\xc6\xec\x25\x98\xbd\x75\xcc\x0e\x9c\xdb\x4c\xc8\x08\x46\x01\xe9\xc1\x64\xc3\x26\x4a\xc1\x9e\xeb\xc8\x17\xf9\x77\x7c\x91\x19\xaf\x9a\xd9\xac\xf4\xb1\x9f\x9c\xa4\xc5\x2c\xe1\x34\xcd\x12\x5a\xe0\xec\xf4\xcf\x2b\x1d\x4c\x66\xea\x1a\x33\x0b\x82\x73\xea\x1a\xf3\x35\x4f\xc8\xdb\x71\x94\xb9\xfa\x2c\xcf\x04\x43\x08\x38\x58\x44\xe6\x02\x71\x56\xcc\x51\x5f\xe6\x29\xe6\x68\x20\x82\xa7\x6e\x0c\xad\xbb\x39\x1a\xac\x36\xdb\xd1\x48\xed\xe0\x94\xa7\x3d\xfc\x01\xc1\x17\xf8\x78\xf0\xad\x1e\x43\x1e\x2e\x71\x76\x37\xcf\x7b\x7b\xcc\x98\x99\xc8\xe3\x63\x83\x43\x66\xb1\x51\xcd\x7d\x64\x7a\x7c\xe8\xfa\xfa\xb3\xfb\x0f\x69\x6f\x05\xc6\x7d\x04\xb9\x1e\xfb\xd0\x86\xfb\x88\x84\xd4\xe5\x93\x07\x3e\x01\x06\x99\x3e\xc3\x3c\x16\xf0\x58\x00\x31\xe1\x08\x22\x58\x2e\x8b\x47\xf9\xcf\x3f\xa8\x18\x2c\x5e\x3e\x88\xb5\x76\x3e\xa5\x61\x3a\xd5\xcf\x87\xb8\xe4\x8b\xe7\x18\x64\x7e\x3f\xf6\x0b\x23\x99\xab\x4f\x82\x3d\x3f\x17\x8a\x67\xfd\xb7\xa4\x87\xc4\xdb\x0b\x73\xbe\x62\xb5\x41\xde\x5b\x13\x32\xf2\x28\xcc\xfb\xf8\x43\x93\x20\x7f\x2f\xc8\x7b\x7b\x21\xfe\xd0\xc4\xc2\x33\xc6\xcf\x7a\xca\xb6\x4d\x51\x23\xb1\x7d\xcc\x17\x29\x5f\x27\x9f\x7d\x07\xdd\x27\x0d\x71\x2d\xe5\xd5\x61\xe8\x39\xe8\x69\x88\x2d\xcf\x18\xf4\x07\x28\xbe\xb1\xa0\xe0\x70\x9b\x40\xa4\xb4\x43\xc4\x25\x32\x4a\xe9\x7d\x80\x7d\x3b\x0a\x1c\xfb\xd6\xe3\x7b\x62\xbb\x40\xf8\x4a\xe0\x82\x0e\x36\xfd\x5a\x63\x8f\x16\xc8\x00\x56\x2a\xab\xf7\x7d\x60\xf5\x04\xfb\xf4\xed\x1e\x2f\x26\x1c\x62\xf9\x55\x02\xc5\xa1\x1e\x29\x62\xd2\xcb\xe7\xc5\x12\x2f\x5f\x79\xa0\x1e\x14\xed\xe3\x15\x48\xd7\xda\xd5\x42\xd0\xd8\x3c\x0d\xb5\xcd\x85\x0b\x86\x1c\xcd\x64\x39\xee\x70\x09\x2a\xa2\x05\xd2\xa3\xe0\x87\x37\xfa\xde\xb3\xa2\x5c\x0e\x77\x78\x51\xbe\xcd\xf7\xa4\x9e\x1d\x39\xd8\xe1\xbb\x7e\xd7\xa1\x4d\x68\x12\x6c\x73\x3a\x78\x05\x34\x22\x3e\xb8\x41\x40\x8b\x23\x62\xa7\x7c\xab\x6a\xc4\xc6\xaf\x7a\x1d\x3c\xfc\x1a\xb9\x70\x92\xa7\xf7\x23\x4b\x50\x3c\xed\xdc\x28\xb5\x8d\x19\xf6\x5f\xfe\x87\xc9\x37\x08\xde\x75\x83\x71\xab\xef\xbf\xcb\xfc\x4f\x8e\xe5\xfe\x27\x03\xaa\xd6\x76\x77\x20\x1c\x17\x04\xbe\xf1\x3f\xd6\x8e\xfe\xc4\xbf\xb6\xaf\x38\x6b\xc4\x1b\xdb\xa8\x6c\x33\x47\x6c\xad\x53\x9e\x37\xe3\x7c\xd1\x46\xbe\x35\x1b\x34\x28\x81\x88\x5b\x09\x24\xa0\x05\x12\x0a\x4a\x06\xdf\x43\x38\xb2\xe2\x63\xde\x0e\x78\x77\xba\xf8\xd5\xa7\x81\xe0\x33\xab\xd4\x0e\xd8\x2f\x21\x0f\x3a\x18\x5c\xab\xed\x16\xb0\xb9\x5b\x4c\xaa\xd0\xfb\xa7\x55\xb0\x9d\x6d\x15\x80\x51\xe1\xc1\x71\x98\xbc\xf8\xae\x25\xc9\x31\xaa\x74\x0d\xb2\x56\x85\xef\x61\xf2\xf9\x41\x4a\x59\x12\x95\xed\x85\x07\x17\x78\x45\x6f\x80\xc5\xde\x3b\xbe\xb9\x89\x3b\x62\xd2\xeb\xf4\xfa\x2f\x3d\xe3\x7f\x2c\x18\x20\x23\x3e\x3c\x46\xc6\xd9\x90\x7a\xcc\x1e\x3d\x3b\xcb\xa5\x6b\x8d\x8c\x5a\x8b\x51\xcf\x1a\x19\x87\x2d\xf6\x96\x68\x7f\x3c\x66\xe4\x64\xcc\xc8\xe9\x98\x91\xb3\x31\x23\xd5\x31\x23\xb5\x31\x23\xdd\x39\x23\x17\x0b\x46\x9e\x47\xbc\xd5\xb2\xc9\x6e\xaa\xc9\x74\xc7\xb5\x03\x87\x30\xbb\xe6\xd8\xbe\x43\x3d\x3e\x3b\xac\x91\x71\xd1\x58\xb3\x57\xa8\x39\x46\x97\xfa\x16\x04\xa6\x2e\x8d\x44\x28\x6c\x0f\x83\x23\xde\x2e\xda\x13\x80\xb3\x06\x1d\xac\xe2\x8b\xd9\x2b\x6c\xb9\xa8\xb9\x60\xc4\x5e\x1c\xa5\xfd\x00\x6b\x63\x5c\xf9\x73\x89\xca\xf4\x95\xf9\xe0\x06\xc0\x8b\xda\x5e\x87\x07\x9a\xc1\xd8\xeb\xf7\xc6\xc1\x6c\xcc\x63\xdd\xfe\x64\x14\x74\xfb\xd3\x20\x8e\xf0\xf1\x3b\x8c\x63\x51\xc0\x44\x9a\xdb\x9f\xf1\x9f\x61\xe0\x0f\xd9\x8b\x08\xa9\x6c\x83\x88\xcd\x0f\x7a\xed\xae\x70\x96\xc3\xa7\x61\xbb\xd7\x1e\xb5\x74\x90\xf4\x93\xd2\x91\x3a\xcb\x39\xd3\x54\xf9\x73\x3f\xf6\xa3\x72\x7c\x12\x6b\xfb\x9f\x2f\xe2\x60\xbd\xc5\xa8\x6f\x33\x4f\x79\xae\x8e\x8f\x13\x59\xfc\x20\x50\xf0\xae\xdd\x7b\xc7\xb0\x17\x5b\x52\x07\xc2\x8d\x42\x6a\x56\x83\x5f\x22\xdd\xdb\x88\x27\x5e\x5e\x75\xa5\xc2\x25\x3e\x22\x98\xfb\x36\x13\x73\x46\x79\x5b\xb7\x34\xb8\x3c\xcd\x08\xfb\xf2\xc9\x2c\x75\xac\xb4\xa3\x4d\x77\x6d\xcc\x9e\x36\x74\xab\xe6\x82\x3a\xd5\x7b\xbe\xe0\x63\x86\x7d\x77\x2d\x26\x4d\x56\x8d\xf3\x96\x7a\xf6\xea\xc2\x66\xca\xb1\x18\xd0\x61\xb5\x7a\x66\xc8\x7d\xc3\xf1\xb3\xf0\xef\xb3\x0b\x6f\x00\x2a\xea\x32\xfd\xed\xf6\x39\x5b\x61\xeb\xea\x65\xbd\x00\xcd\xbf\x6e\x5c\x84\xcb\x79\x81\x6e\x8d\x2e\x5c\xfa\xda\x9d\x85\x83\x4e\xce\x88\x2d\xe0\xd2\xd8\x09\x9b\xac\x94\xd0\x45\x7e\xcb\xe7\x03\x94\x0f\xdb\x66\x30\xae\x88\x71\xb6\xa1\x0c\xea\x44\xf2\x99\x4b\x5e\xec\xfd\xb1\x28\xd6\x49\x9f\xf8\x77\x60\x7f\x5a\x73\x52\x1e\x63\xe4\x91\x99\xa6\xb9\x0b\xfb\xf2\x19\xcd\xa7\x32\xc2\xc2\xbe\x79\x2d\x45\x7c\xe4\x50\x7d\x64\x0d\x47\x72\x92\x8c\xc7\x7a\x9c\x85\xfb\xc1\x38\x18\x76\xdb\xbd\xe0\x9d\xdb\x9f\xf4\xfc\x76\xaf\xf9\xce\xed\xcf\xde\x4d\x7a\xe3\x76\xc4\x47\x4e\x30\x1c\x07\xfe\xbb\x76\x6f\xdc\x7f\xc7\xde\x8d\xbc\xa0\x17\x18\x19\x6b\x47\xaf\x77\xd8\x97\xf5\x7e\x2a\x6f\x77\xdb\x0f\x89\xe7\xad\xed\xcf\xb8\x9f\x36\xb0\x1a\x01\x95\xf8\x75\x65\x65\xfa\x76\x7c\x02\x82\x02\xe3\x5b\xa4\xef\xca\xf3\xf2\xf1\x09\xf0\x6e\x38\x9c\x2f\xa8\x17\xcf\x8e\x4f\xc0\x08\x19\xc2\x53\x17\x9d\x1e\x13\x35\x91\xf0\xca\x3a\x93\x43\x89\x71\x36\x88\x5e\x46\x0c\xce\x57\x2f\x1a\xda\x2a\xe4\x02\x97\xa9\x9e\x71\x26\x43\x9a\x0b\xf6\x36\xa3\xd1\x9c\x8e\x5e\xc7\xaf\xc3\x31\xea\x5b\x6f\xf2\x9f\x7f\xcc\x71\xb6\xb0\x9a\xd5\x4a\x55\x94\x71\xde\xbd\x51\xe3\x27\xce\x17\xa7\x65\x92\x66\x8d\x60\xbb\x9d\xf0\x01\x37\x56\x86\xc2\x68\x56\x46\xd5\xdd\x26\x67\x38\xf0\x5a\x8d\x18\x12\x83\x61\x30\xe8\x0f\x26\x11\x1b\xf3\x61\xc0\xde\x35\x87\xfd\xc9\xe0\x5d\x7b\xf4\x6e\xd2\xd3\x57\xfa\x8c\xb5\x23\xb4\xb0\x65\x1a\x69\x4c\x4a\x74\x67\x44\x7b\xeb\xb0\x5e\x99\x0e\xd6\x61\x27\x27\x74\x94\xc0\x52\x72\x83\x7c\x9b\xf3\x16\xfc\x00\xa6\xc6\x2a\xf3\x7d\x3e\x08\x5b\x6c\x10\xbc\x83\xf1\x28\x2a\x38\x6e\xb1\xf1\x3b\x16\x0d\x03\xe6\xcf\xdf\xb5\xd8\xe8\x1d\x7b\x27\xf9\xbd\x91\x51\x2d\x95\x83\x8b\x19\x5d\x3e\xab\x65\xf5\x45\xbc\x29\x5f\x12\x3e\x8d\x44\x5c\x3d\x32\xae\xe2\x17\x6b\xf1\xcb\xb5\xf8\xbd\x1c\x6b\x3d\x59\xde\x99\x2c\xff\x44\x3e\x5b\x00\xd3\xf1\xe9\x90\xd8\x8c\xec\x16\x9d\x37\xe5\x1e\x5d\x66\x8b\xfd\xa4\x43\x5e\xbe\xab\x22\x9c\x3f\xae\x09\x09\x4c\xad\x2e\x09\x47\x8e\x11\x46\xeb\xca\xcb\xa6\x9c\x49\xa0\xb5\xf9\x21\x7b\xfc\xdd\x68\xc0\x2c\xc6\x27\x4c\x9a\x28\x53\x77\x8d\x2a\x53\x97\x93\x65\x27\x0d\x49\x13\x66\xea\xae\x51\x66\xea\xae\x91\x66\xea\xa6\x68\x03\xd5\x4f\x16\xc5\x6e\x13\xa6\xb5\x4b\x8a\x78\x4b\x7b\x26\x72\x5c\x14\x7e\xa4\x9b\xa3\xb7\x03\x88\x75\x76\x06\xa4\x4a\x51\x39\x72\xc1\x38\xe3\x6c\x88\xb8\x78\x81\xb1\x75\xc4\x90\xc7\x19\x02\x38\x50\xe9\xb6\xe8\x69\x9f\x59\x1c\x60\xb4\x26\xb0\x6d\xac\x39\xe0\xeb\xde\xb7\xa6\x12\x71\xeb\x7d\x9d\x78\x65\xeb\x36\x37\x56\xb6\x6e\xd3\x66\xce\x1a\x61\x49\xdc\xa3\x67\x72\x61\x11\x68\x4e\x6a\x3e\x6e\xac\x3e\x6b\x8d\xc1\xd6\xd5\x7a\xa5\xb4\x77\x71\xbf\xaf\x75\xf7\x0a\x8b\xe6\xf4\x2f\xe8\xc4\x9a\xc8\x8c\x13\x09\xac\x37\xde\xf2\x55\xd2\x6d\xae\x92\xad\x3f\xb6\x76\x5c\xd4\xfa\x87\x8c\x46\x28\xf8\x9b\xb4\xb9\x5c\xbe\xae\xac\xa6\x31\xa4\xe2\x06\x8e\x5b\x6a\x1a\x43\xd3\xb5\x9a\xc6\x4c\x42\xfc\x52\xd3\x98\x99\xbe\xd5\x34\xe6\x12\x12\x96\x9a\xc6\xdc\x0c\xad\x84\x55\x35\xf1\xdf\x77\x5e\x53\x75\x5e\x7a\xfd\x49\x2c\xa8\xed\x99\x83\x46\x2d\x2c\x7b\x8b\xc7\x0e\x6a\xea\x4a\x24\x8f\x35\x94\x93\xa0\xb0\x4f\x5f\x67\xa6\x9b\x67\x64\x6e\x7a\x79\x46\x5e\xda\xfe\xb8\x65\xee\xef\x31\xd2\x0a\xda\xcd\xd6\x98\x07\x57\xda\xcb\xe8\x1a\x85\x5c\xd4\xfe\x0f\x08\x44\x46\xf8\x75\x44\x47\x40\xa2\x91\x31\x9c\xc5\x34\xe2\x11\x93\xcb\xeb\xc3\x79\x4c\x25\x1e\x31\x7d\x6b\x14\x13\x2e\x2c\x8d\x8c\x99\x19\x5a\xa3\x98\x70\xcd\xd2\xc8\x98\x9b\x4d\x8d\x70\xa3\x7f\x40\xb8\xc9\x3f\x21\xdc\xc3\x19\x26\x3b\x09\xe5\x1a\x67\x3a\xe5\x0e\xe2\xdb\x40\x5b\xe8\xe8\x01\x1d\xfd\xbc\xbb\x8d\x8e\xee\x9b\x74\xec\xfc\xd7\x74\x9c\x15\x35\x3a\xce\x8a\x40\xc7\x79\x51\xa3\xe3\xbc\x28\xe8\xb8\xaf\x13\x72\x5f\x50\x72\x5f\x27\xe5\xfe\x7f\x4c\xcb\xb3\xca\xdf\x93\xb2\x5c\xd3\xc7\xe0\x61\x6a\x0c\x56\x52\x94\x3c\xaa\xa5\x28\x29\x3c\xba\xf0\x0d\x3c\x99\xcb\x08\x78\x1e\x16\x74\x55\x6a\x21\x86\x15\x79\x95\x2a\xc8\xc5\x6f\x52\xb9\x79\xfa\xb6\xf6\x40\x73\x48\xb4\xe3\xfe\xdf\x58\xf9\x53\xf8\xe1\xef\x79\x25\x3f\xe7\x99\x7e\x4a\xbb\x00\x97\x7c\x5e\x3d\xca\x90\xb4\xfb\xf3\x29\x43\xbe\x0c\x7e\xf7\xb2\x59\xe4\x4b\x0f\x30\x21\x65\xca\x0a\x3d\x84\x84\x50\x26\x28\xdd\xc3\x77\xea\xab\x77\x33\x07\x17\x26\x23\xcd\x17\x66\xc6\x75\xe4\x1f\x8a\xa4\x27\xb3\x09\x7e\x1d\x50\x86\x06\xa2\xb0\x11\x65\x68\x94\x58\xb4\x4f\xe9\xe0\x03\x68\x48\x8d\xab\x33\xb2\xd0\x23\x65\xea\xe5\x22\xe9\xf6\x7a\x8a\xc9\x94\xfa\xb9\x9e\xf4\x7c\x3d\xc5\xe4\x50\x4b\x5d\x60\xb2\xd0\x52\x17\xd8\x9a\x2c\x97\x68\x42\x07\x64\x40\x47\x64\x44\x27\xd8\x9a\x50\x17\xf1\xba\x14\x70\xc9\xcb\x45\xa6\xb8\x31\x58\x26\x87\xa2\x12\x17\x32\xf5\x5b\x01\x97\xfc\x5c\x4f\x26\x4f\xc9\x02\x6c\x44\x21\xa9\xf8\x95\x67\xcd\x47\xb2\x4b\x21\xab\x2f\xd3\xf6\xff\xe2\xf9\xf2\x3d\x99\x06\xf9\x24\x65\x66\x45\xd3\x23\x7c\x28\x93\x53\xd7\x9c\x90\xba\x6b\x5e\xac\x56\xa4\xa5\x93\x2a\x3e\xd0\x8e\xfb\x29\x40\x03\xd1\xa7\x53\x5a\xcc\x0f\xc8\x82\x4e\xf7\xa6\xa4\x4c\x07\x7b\x03\x72\x48\x17\x7b\x53\xb2\xa0\x1f\xf7\x06\x7b\x0b\x32\xa5\x1f\xf7\x76\xa6\x7b\x65\x6b\xb0\x47\xcb\x56\x08\x72\x93\x31\xdb\x3b\xcc\xb9\xc6\x6c\x6f\x91\xf3\x8c\xd9\xde\x34\xe7\x1b\xb3\xbd\x01\xb6\x26\x22\x75\x0e\xa9\x73\x48\x9d\x43\xea\x7c\x6f\x20\xb4\x55\x21\xb5\x99\x31\x23\xbe\x31\x73\xc8\x84\x87\xe7\xc4\x37\xe6\x0e\x99\xd2\xfd\x3d\x66\xcc\xf2\x9f\xf6\x5c\x63\x96\xdb\xdf\xf3\x8c\x19\x59\x08\x45\xaf\x31\x23\x65\xca\x7f\x72\x1f\x21\xd1\x37\x66\xf9\x8f\x80\x70\x48\x51\x7e\x9a\x13\x07\x07\xd3\xbd\x69\xfe\xd3\xde\x62\xaf\x8c\xf1\x07\xb4\xbf\x57\xe6\x9d\x89\xf2\xd3\xfc\x1b\xa9\x96\x98\x12\x87\xf8\xc7\x59\x39\x9b\x45\x87\xd4\xf8\xac\x60\x53\x09\x9b\x02\xac\xf0\xfd\x30\x9b\x2d\xfe\x38\xcc\x66\x03\x74\xc8\xa3\x53\x1e\x9d\xf2\xe8\x14\x5b\xa2\xda\x73\xa8\xf6\x1c\xaa\x3d\xb7\x16\x54\x2a\x8c\x2d\xa8\xf6\x1c\xaa\x3d\xe7\x44\x80\x6a\xcf\xad\x3f\x56\xdb\xfa\xff\xa2\xda\x87\x94\x0f\x1a\x18\x49\xa0\x7e\x02\x3f\x25\xf3\x34\x64\x82\xc9\xce\xa9\x2b\x86\x69\x82\x54\x4f\x43\x26\x78\x65\x0d\x18\x3a\x24\x87\xc6\xa9\x9b\x3f\x34\x66\x45\x30\x43\xe5\xf1\x3a\x8f\xcf\x93\xab\x52\x87\xab\x15\x30\x9a\x28\x66\xe7\xa4\x79\x9a\xe6\xe8\x60\x80\x9e\x08\xfe\xae\xbe\x47\x71\x75\x06\x58\x04\x75\x36\xaf\x31\xfc\x9e\xba\xe2\xb7\x2e\x7f\x05\x1b\x2c\x28\xee\x57\x90\xaa\x95\xab\x01\xb5\x1d\xce\xb9\xfd\x75\xce\xed\x73\xce\xed\x63\xcb\xe7\x9c\xdb\x1f\x30\xcb\xff\xd3\xf6\xb5\x35\x13\x19\xb6\x58\x4c\x5c\x0d\xc0\x68\xaf\xcf\x72\xea\x26\x78\x5a\x52\x83\x72\xa3\x76\x2f\xd8\x66\x9d\x21\x32\xdf\xbe\x91\x59\xe4\x65\xc3\x35\xa7\xbe\xc2\xd8\xa1\x43\x16\xf8\x35\xa4\x9e\x31\xb8\x50\x0c\xb5\x23\x62\x1d\x11\xdb\xff\x8b\xef\x8c\xc3\x6c\x96\xff\x74\x4a\xda\xf7\xdc\x4a\xce\xe7\x9f\x0b\x72\xd5\x83\x1c\xf2\x73\x0c\xe7\x76\xe0\xeb\x66\xf1\xab\xcc\x23\x32\xbf\x9d\x0b\xaa\x8b\xdc\x7c\x80\xb1\x29\xb3\x7c\xfb\x47\x39\x72\x3c\xc7\x37\x99\x45\x7c\xee\x0f\x75\x63\x79\x1f\x0b\xc2\x98\x1a\x4e\x25\xa6\x17\xff\x23\xd1\x47\x41\x2e\xe4\x7f\x3a\xfc\x4f\x8b\xa1\x05\x5e\x23\xe6\xf5\xcb\x5a\x1f\xa6\xfa\xa0\xd5\x5c\xef\xb8\xd8\x82\x8e\x0f\xe1\xee\x7f\x2f\x91\xe8\x02\x89\x90\x47\x74\x71\xc4\xf4\xf9\x6c\x1a\x91\x58\x1a\xb1\x87\x8e\x19\xc2\x94\x52\xc0\x66\x69\x64\x1f\x38\x66\x13\xff\x87\xf2\x48\x34\xd8\x2a\xdb\x69\x42\x85\x2e\xc3\xed\xcc\x4d\x4d\x88\x93\x13\x2a\x96\x00\x5b\xb1\x60\xa1\x40\x37\xcd\x94\x64\x71\xb6\xb9\x4b\xd2\x0e\x1a\x84\x11\x94\xfa\x94\xfe\x1d\xfd\x0b\x5a\xd1\x71\x18\x6b\xaf\x41\x0b\xb1\xa5\xff\x5f\xee\x42\x66\xda\x2e\x64\x06\xbb\x90\xb9\xb6\x0b\xe1\x1d\xe1\xcd\x50\x33\xee\x88\xa6\xdd\xf6\xa1\x27\xfe\xb3\x9d\xc8\x7d\x25\x5d\xdb\x41\x95\xd8\xc7\x5d\x46\x5e\xca\x64\x56\x26\xf3\x32\x59\x94\xc9\x41\x99\x54\xca\xeb\x7c\x50\x49\x36\xf1\x63\xe9\xde\x83\xc9\x48\xa5\x3d\xf4\xa2\xc0\x74\xc9\xe1\x89\xe9\x91\x68\x62\xfa\xe4\xa5\x61\x46\xe4\x26\xf0\xc6\x66\x8f\xdc\x05\xb3\xb1\x39\x10\x5c\xf6\x74\xce\xfe\x20\xcf\xe9\x17\xf9\xc1\x77\xc0\xb0\x39\x81\x77\xa4\x85\x0f\x81\x1d\xe1\x44\x20\x51\x32\xc7\xc9\x5e\x6c\xd0\xa1\xc3\xb6\x48\x7f\x23\x11\x80\x9b\x31\x20\xfe\xf1\xee\x3b\x06\xa7\x2a\x33\x07\x3d\x4d\x98\x0c\x1d\x1e\x27\x17\x4a\xfc\x5d\x71\xa3\x44\x8b\xde\x2d\x97\x9e\x74\x73\xe3\xa7\x34\xd9\xae\xb2\xce\x0b\x55\xe1\xed\xb8\xcc\x4e\x1c\x3a\xd2\x4a\x0f\xd3\xa5\x87\xa2\x74\x57\xfa\x50\x0b\x53\x2a\x27\xde\x03\xd0\x08\x08\xc8\x7b\x3c\xbc\x6f\x67\x0e\xaa\x56\x31\x81\x40\xef\x80\xc9\xd0\x49\x55\xbb\x15\x93\xfe\x8c\xa7\x7d\xe6\xa4\x9a\x72\x5f\x1f\xe9\x72\xb5\x2c\x3c\x8a\xcb\xec\xc7\xa1\xd3\xea\xdf\x91\xc8\x95\xce\xe6\x74\x12\xf5\xb6\x94\xde\x8d\xcb\x1c\xc4\xa1\xb3\xb5\xd2\x77\xde\x28\xfe\x2c\x5d\xfc\x40\x3f\xcc\x76\xa1\xea\xad\xbf\xa1\x01\x53\x77\x99\x70\x4a\x2b\x95\x36\xb5\xf4\x4b\x27\x55\xf3\xf0\x18\x0e\x94\x66\x0e\x0a\x72\xb5\x2e\x38\xf2\x90\xb1\x7a\x97\xc1\x78\x02\x5f\xff\xc2\xa5\x74\x98\xcd\x36\x13\x83\x30\xc0\x3a\xef\x32\xbc\x5c\x1e\x97\x49\xa4\x20\x97\x0a\xd2\x53\x90\x0b\x80\x9c\x94\xc9\x40\x41\xae\x14\x4e\x40\x6d\xcd\xf3\xab\x03\xa7\xb8\x98\x8c\xa8\x6b\x54\x87\xa0\x1d\xa5\xa3\xd2\x8d\x1d\x38\xe6\xb9\x1d\x38\x78\x42\x5d\xf1\xf2\xc0\x89\x3c\x5a\x76\x69\xc0\x94\x6b\xc1\xc6\x89\x10\xfe\x27\xd4\x9b\xb3\x1c\x1a\x95\x1e\x72\x39\xf3\x36\x97\x93\xf7\x9f\x9e\x4f\xc8\x44\x06\xcb\xe0\xc2\xce\x95\x3e\xa6\x22\x19\xac\xd4\x48\x4f\xdd\x4b\xaf\x91\x01\x5f\xd5\x93\xc2\x8f\xaa\xd8\xea\xf0\xa4\xf6\x01\x23\xa1\x0c\x4b\xa7\x75\xe1\x1a\x5e\xa8\xf0\x9a\x32\x2c\x7d\xc9\x81\xf7\xfc\x0e\xb6\x76\x20\x10\x8a\x23\x4a\xd1\x3c\xea\x42\x03\xa9\x6b\x79\xf6\xc8\x77\x76\x29\xad\x55\x2d\xec\x51\xcf\x7e\x0a\x1c\x70\xb8\x70\xe3\x3a\xc8\x3b\xc6\xcb\xa5\x67\x79\xf6\xb1\x0b\x0f\x88\xd8\xf7\xae\x83\x57\x1e\x6d\xd5\x72\x93\xdc\x65\x60\xf1\x31\xe4\x49\x97\x83\x87\xc7\xbc\xf3\x41\x9f\xef\x67\xb3\xbe\xdd\xf2\x1c\x54\x20\x9f\x31\xa5\xb4\x55\xe3\x38\xf7\x1e\xdc\xc0\xd3\x95\x7c\xba\x37\x5c\x31\xce\xaa\x78\xb9\x2c\x90\x40\xc4\x3a\x10\x83\xa3\xff\xe5\x32\xf6\x02\x03\x49\xfe\x82\xf7\x27\x04\xbd\x24\xd8\x15\xd9\xe5\x88\x0a\x93\x84\x20\x09\xf6\x04\x4e\x87\xda\xd2\x94\x54\x8d\x81\x08\xc6\x00\xe9\xd1\xa8\x54\x65\x76\xc7\x31\xbb\xfc\x2f\x9c\xc6\x61\x97\xf6\xd2\xe3\xa0\xa7\x75\xc1\x19\x38\x64\xf6\xf9\x18\x88\x4a\x0f\x2c\x97\x33\x4f\x19\x1f\x05\x3d\x39\x0a\xa4\xb3\xa2\x81\x96\x25\x98\x30\xe9\x81\x4e\x7a\xd6\xb2\x12\xcf\x5a\x7c\x0e\x24\x98\x4d\x8e\xe9\x4b\x7f\x5a\xa1\x0c\x76\x8f\x95\x4b\x1b\x71\x39\x48\x90\x66\xa4\x65\x03\xef\x59\x3b\x13\x0d\xe2\xf3\x82\x34\x07\x5a\x56\xec\x40\x2b\x50\xbb\xb7\x04\x19\x1c\x66\x35\x35\xc0\xec\x98\xef\xb9\x52\x71\x6b\xaa\x39\xcb\x12\xbe\x14\x06\xf2\xd7\x57\x0e\xcb\x82\x6c\x16\x8d\xa4\x5f\x2e\x48\x19\x61\x3e\x44\x85\xfb\x05\xf8\x9d\xca\x2c\x72\x74\x4a\xda\xd3\x9e\xa0\x3e\xed\xfd\xf3\xf1\xd9\x4b\xc6\xa7\x60\x21\xa2\x5f\x5a\x35\x78\x74\xd1\xe2\x8c\x4a\x39\x63\x3d\x03\xcf\xaf\xe2\xec\xc9\x68\xb1\xd1\xc1\x78\x3c\x6c\xbb\x93\x71\xc0\xf3\xa8\xb1\x7a\xd6\x14\x74\x99\xd2\xd7\x4c\xd8\x8e\x22\xc3\xeb\x47\xfd\x61\xc6\x74\x09\x8f\x55\x78\x44\x86\x4d\x97\x08\x8c\xa6\x7c\xb8\xcf\x08\x87\xfd\x6e\x66\x13\x3c\xee\x6f\x01\xce\x8a\x5b\x80\xf3\x6d\xc0\xd9\xfe\x36\x4c\x0d\xd8\x1f\x30\xaf\x3d\x9e\x67\x4c\x8f\xec\x70\xc0\xa5\x88\x9b\x9e\x48\xcf\x6b\xe9\x32\x68\x0e\x48\x46\x78\x9b\x51\xcd\xf3\xa5\xf7\x19\xd1\x40\x15\x33\xfd\x18\x6f\xad\x91\x5b\x12\x78\x33\xb7\x80\x79\x43\xb7\x80\xe7\xdb\xc1\xbc\xb1\xdb\xb0\x53\xe0\xb8\x41\x91\xac\xa7\x6a\x71\xa4\x50\xf2\x1a\x8a\xca\x05\x12\x6f\x26\xf6\x3c\xdf\x00\x01\xb8\x17\xe7\x88\x93\x67\xe6\xb6\x4b\xf0\xae\x14\x6e\x2d\xe5\x25\xd8\xc3\x2b\x32\x7f\x1b\xb5\xd1\x92\xa8\xe0\x31\x7d\xb5\x22\x0b\xfa\xba\x22\x65\xfe\xe7\x90\x16\xc8\x05\x2d\x90\x73\x1e\xb9\xe1\x7f\x6e\x69\x81\x3c\xd0\x02\xe9\x32\x1e\xab\xc2\xdf\x53\xc6\x81\x8c\xaa\xa7\x89\x5f\x8f\x5a\xcc\x9c\x90\xc7\x17\xfd\x9b\x01\xdf\x8b\xf0\x85\x7b\x27\xe0\x22\xa2\x00\x58\x1e\x0f\x60\xcb\x57\xf1\x48\xc4\x7b\xe2\x67\xa2\xc0\xca\x64\x74\xe6\xa0\xd1\x88\x61\x72\x2e\xc2\xc3\x91\x38\x41\x9a\x66\xb3\xe7\xa2\x49\x5d\x26\x52\xc6\x23\x06\x5c\xf4\x46\x44\x27\x32\xfa\xff\xd0\xf6\xe6\xcb\x6d\xe3\xca\xe2\xf0\xff\x79\x0a\x2b\xe5\x8f\x87\x18\xc1\x1c\xc9\xce\x24\x33\x64\x30\x2a\xcb\xf2\x6e\x29\x89\x9d\x58\xb6\x75\x58\x53\xe0\x26\xc9\xa2\xf6\xc5\xb2\x4d\xdd\x67\xff\x0a\x8d\x85\xa0\x44\x39\x39\xe7\xde\xdf\xd4\xc4\x22\x41\xec\x68\x34\xba\x1b\xbd\xdc\x90\x56\x9f\xe2\x6b\xbc\xc0\x75\x89\x55\x6f\x49\x28\x4e\xd6\x90\xdc\x56\xaa\xad\x1b\xd7\x7e\x69\xdd\xb8\xe8\x82\xd5\x94\x41\xa9\xa1\x86\x5e\xc0\x17\x3a\x6b\xf0\x82\x12\x8f\x21\xd6\xdb\x4a\xa3\x58\xb4\x6b\x0c\xad\x4a\x57\x85\x17\x22\xcb\x19\xd5\x8f\xc3\x73\xe4\x9c\xc9\x85\x61\xf4\xc4\x99\x9c\xfa\x6b\xf9\x7c\xdb\xc1\x0b\xf9\x7c\xdd\xc6\x75\xe1\x68\xf5\x4c\xa8\xfe\xf0\x4e\x92\x10\xba\x49\x42\x67\xaa\xe1\x9f\x29\x99\x02\xfe\x61\xbf\x0a\xff\x4c\x9d\x29\xe0\x9f\x10\x4f\x39\xfe\x91\x2e\xcd\x3b\x97\xc5\x0b\xaa\xb9\x74\xcc\x62\x9a\xc3\x63\x85\x69\x0e\x8f\xd1\x0a\x77\xab\x1b\x12\x3d\x1c\x22\x36\x2b\xc0\xd5\x08\x7b\x2d\x8f\x84\x2d\xcf\x4d\x92\x45\xcb\x73\x51\xc5\x94\x37\xd4\xf8\x9d\xd0\x6b\xc2\xa7\x1d\x4d\x32\xa8\xdd\x5f\xed\x74\x07\x3b\x7d\xca\xc8\xfe\x3e\x95\x4a\x46\xe2\xca\xb0\x4f\x5b\xd4\x75\x3c\x36\x32\xee\x73\x0e\x39\x41\x18\x87\xb3\x70\x07\xbe\xac\x18\xfc\x39\x00\x90\xa9\x6e\x14\xab\xae\x8e\x44\x55\x10\xdf\x8a\x92\x7a\xcb\x77\x31\x55\xd5\x30\x3a\x9d\x57\x53\x07\x37\x65\x37\xa4\xe4\xd4\xf5\x4a\x02\x56\xc9\x0b\x7a\x81\x3a\x02\x1e\x23\xeb\xa5\x15\xb8\xd8\x57\x75\xf8\xaa\x0e\xf6\x01\x39\x35\x52\x72\xd8\xf6\x11\xe2\xa6\x67\xc6\x08\x55\xab\x6f\x5d\xdf\x4b\xf2\xc2\xcf\xec\xda\xe6\xf1\x1a\xcb\xa1\x36\x6d\xb0\xb6\x69\xef\xb2\x39\x83\x8d\xed\x3d\x95\x39\x21\xaa\xcc\x8a\x3b\x59\x79\x5d\xe1\x01\x79\x65\xe8\x53\x5a\xc9\x38\x74\x6c\xc6\x69\x3f\x19\xf5\x39\x47\xaf\x73\x32\x4f\x92\x14\x7a\x9f\x8f\xd9\xa8\xe6\x8c\x42\xf4\xf9\x4f\xc0\x7f\xa8\x75\xff\xc4\x9e\x18\xc1\x38\x30\x8c\x39\x9b\x20\x46\xcf\x0f\x0c\x63\x20\xdc\x16\x0b\xd6\x6d\xbe\x42\x4e\x6c\x75\xb5\xd8\xf8\x1c\x94\x22\xf4\x4a\xad\x6e\xd5\x8c\xb0\x0f\x82\xa5\x81\xe2\xe9\x77\x62\x98\xcb\x97\xbc\xb9\x14\x08\x07\x14\x15\xb2\x15\xa2\xd7\x80\x04\x7a\xdf\x87\x27\xd2\xc3\x8c\x42\x90\x81\x98\xea\x18\x39\x71\x3a\xad\x81\x98\xd6\x34\xf5\xf6\x5c\x3a\x0a\x3e\xd7\xf3\xca\xd4\xe6\xb9\x9a\x82\x80\x07\xac\x87\xe8\x11\x7c\x0a\x7c\xc3\x90\xbe\xe3\x94\x18\x07\x77\x3b\x6b\xbd\xc5\xb1\x18\x7e\xcc\x87\x8f\x04\x00\x55\xff\x43\x00\xaa\x4a\x00\xaa\x5e\xfe\x04\x80\x6a\x32\x67\xed\xf2\x27\x00\x74\x24\x73\x1e\x5d\xae\xb1\x90\xeb\x39\x8f\x65\xce\xe3\x4b\xfc\x4e\xc0\xda\x80\xc1\xda\x88\x70\x5b\xaa\xe5\xbe\x1d\x70\x83\xaa\xe7\x7d\x3b\x06\x98\x1b\xa4\x43\x1b\xe0\x11\x5e\xa0\xd7\x05\x59\xe8\xeb\x76\x73\xca\x26\x62\xc1\x20\x2b\xe0\x3f\x3e\xff\x89\xf9\x0f\xcc\xfb\x82\xfb\x96\x1b\x19\xc6\x42\xcc\xfb\xc8\x30\x46\x82\x7e\x93\x4a\x56\x2b\xe4\x0c\x7e\x01\xf2\x46\x29\xe4\x0d\x60\x11\x6a\x6c\x11\xda\x67\xb8\x5a\x7d\x4b\xcc\x83\x5e\x3d\xe2\x59\x5f\x47\x29\xfa\x20\x2d\xb0\x33\x01\x72\xff\xc2\x75\xa2\xcf\xed\xd4\xd6\x64\x4a\xbc\x56\x04\xc4\xfb\xb4\x15\x86\x8c\x13\xf9\x93\x71\x22\x47\x43\xa1\x28\x31\x27\x53\x50\x32\x9e\x86\x8c\xae\x2d\xce\x5b\x65\x17\xbf\xb0\xdf\x7d\x17\x4f\xd9\xef\x81\x8b\xab\xec\xf7\x83\x8b\x6b\x84\x5a\xa3\x86\x59\x9c\xb7\xfe\x70\x41\xe0\x8a\x1b\x2a\xe5\xa3\x48\x99\x93\x42\xa1\x38\x6f\x7d\x72\xf1\x82\x2c\x8a\xfc\x56\xa9\xa1\xae\xa2\xd0\x6f\x53\xfc\x42\x5e\x8a\xfc\x7a\x49\x4f\xaf\xe2\x1a\x99\x57\x1a\x7b\x35\xbb\xb6\xd7\x70\x4a\x7f\xd7\x0c\xc3\xac\x89\x7b\xb2\x29\xf1\x8e\x8a\xd3\xe2\x34\x2c\x56\x8b\x5e\x4c\x8b\x1d\x0a\x11\x14\xde\xd5\x90\x10\x7c\xce\xe1\x61\xc1\xfe\xbc\x70\xfd\xe4\xa9\x32\x13\x0a\xa4\x8b\x07\x79\xc5\x36\xfc\xa8\x9f\x2f\xca\xab\xe6\x88\x9d\x2f\x29\x34\x0c\xce\x91\x13\x26\x09\x77\xf7\xdc\xc6\x3e\xf8\x9e\xf0\x18\x08\x8c\x70\xa0\x39\x31\x1b\xad\xf0\x59\x87\x82\xf5\x9f\xe3\x99\x47\x6c\x05\x4f\xfb\x34\x67\x09\xdf\xc2\x20\x1e\xa1\xd6\xf0\xa3\xc9\x77\x24\xdb\xd4\xde\xda\xa6\xd6\xf5\x9f\x32\x9b\x9a\xca\xe3\xd1\x63\x90\x15\x62\x1f\xd3\x74\x53\x0f\x40\x7b\x34\x1f\x93\x9d\xeb\xc7\xa3\x52\x9a\xa1\x6c\x77\x7d\x3d\x06\x1a\xc6\xe7\x6f\xdf\xf8\x5b\xc0\xdf\xae\x8f\x05\x5f\x0a\x6f\x37\xfc\x6d\xc4\xdf\x2e\xf8\xdb\x94\xbf\x5d\xf2\xb7\x39\x7f\xbb\x82\x37\x87\xfb\xff\x30\xeb\xfc\x4d\x0e\x29\x49\xfc\x24\x61\x38\x34\x49\x46\x49\x32\x4d\x92\x79\x92\xd0\x15\x1e\x68\x0b\x95\xdd\xff\xd0\xc3\x77\xac\x53\x9e\xd6\x45\x81\x2e\x45\x17\x85\x0c\x44\x75\xd1\xcb\x74\xd1\xcb\x74\xd1\x4b\xbb\x88\x17\xfc\x8d\x77\x11\xbf\x08\xc4\xdc\x41\xb8\x2a\xaa\x6f\x23\x5c\x53\xa8\x1d\x37\x14\x3e\x67\x44\xec\x67\xf2\x52\xa9\xd9\xb5\xe2\x0b\xa3\x66\x3f\x93\x6a\xa5\x61\x37\x8a\x55\xfc\x22\xcc\x14\x5e\x58\x2d\xfc\xb1\xca\xed\x1c\x8a\xf1\xdf\x2f\x88\x8d\xac\x4e\x5e\x7e\x67\xaf\x08\xfb\xc4\xff\xad\x8e\x03\x12\xfc\x56\xc7\x31\x89\x7f\xab\xe3\x01\x19\xfc\x56\x77\x46\xc5\xf9\xdf\x2f\x86\x61\x42\xce\x51\x71\x8e\xf0\xe8\x37\x52\xc7\x53\xf6\x67\xce\xfe\x2c\x7e\x23\x75\xe4\x04\xc5\xe9\xdf\x55\xc8\x56\xfd\xdd\x0c\x8a\x53\x84\x7d\xf6\x31\x60\x7f\x54\x01\xe4\x0c\x8a\x8b\x34\xdb\xa0\xb8\x40\x38\x66\x1f\x07\x6b\xb5\x09\x6a\x0b\x34\xe7\x4d\x8f\x4b\xa7\x11\x98\x0c\xd6\x8a\x2f\x7b\x31\x6e\x20\x88\x96\x2a\x5e\x8a\x03\x90\x26\xed\x7f\x2a\xe1\x12\x2e\x94\x10\x5c\x02\x99\x30\x1d\xc5\xea\xde\x22\xcd\x3b\xe7\x09\x78\x8e\x17\xb8\x84\xff\xca\x64\x1e\xb1\x6f\x32\x2b\xbc\xec\x4d\x31\xbf\x53\xc6\xe5\x3f\x4b\x40\xe1\x89\xbc\xb8\x51\x0c\x64\x4e\x9f\xbd\xc0\x6e\x60\x99\x58\x17\x0a\x25\xc4\xcd\x79\xc4\x76\x38\x66\x9b\xb3\xd6\xa7\x38\x6f\x83\xb2\xf3\x2d\x77\x8b\x06\xdc\xbb\x21\x47\x11\x20\x6f\x6d\x1c\x23\x3c\xe5\x8f\x5f\x8e\x19\xc6\x0b\x24\x88\x2c\xf8\x23\x03\x91\x17\xfe\xc8\x40\xa4\xca\x1f\x19\x88\xbc\x30\xa8\x98\x57\x5e\xec\x97\xe2\x1c\x57\xd9\xcb\xa2\x52\xb5\xab\xc5\x05\x9e\x0b\xb8\x98\xb3\x5a\xe4\x5d\xa7\x14\x35\x8e\x08\x21\xdf\x95\xa4\x71\x4a\x40\xd2\x58\xa0\xd6\x79\x87\x9a\x01\xaa\x98\x03\x32\xd0\x71\xd7\xf1\x39\xc2\x03\x41\xfa\xbf\x88\xc7\x66\x07\x57\xc5\xe3\x2d\x5c\x7b\x0e\x04\xd9\xbf\x90\x9e\xc7\x47\xaa\x01\xd1\xdc\x40\x50\x22\xca\x37\xf9\x34\xdb\x05\x91\xa3\x79\x8e\x19\x90\x31\xd4\x38\x00\x02\x03\xd9\x66\x40\xa8\x35\xf8\x68\x06\x88\x6d\x43\x86\xda\x62\xa0\xb4\x90\x13\xb3\x42\x1c\xb7\xc5\x86\x01\x1e\x0a\x06\x9a\x9f\xc9\x0c\x6e\x53\xb7\x03\x10\x8c\x83\xe1\xb7\x11\x7e\x27\x2a\x12\x96\x57\xb1\x30\xbb\x6a\x1c\x73\xb3\xab\x2f\xe2\xf7\xab\xf8\xfd\x26\x7e\xaf\xc5\xef\x8d\xf8\xbd\x10\xbf\x97\xe2\xf7\x4a\xfc\xd6\x8f\xed\x51\x1a\x8a\x92\x10\x32\x38\xaf\x68\x83\x81\x18\x22\x30\xe7\x58\x1e\x0c\x01\x42\x76\x4c\x08\x69\x1c\x57\x46\x62\xbe\x24\x90\xf0\x0f\x5f\x8e\x19\x81\x20\xa2\x1f\x0a\x98\xc9\xb8\xef\x8c\x2f\x78\xdb\x3d\xf1\x1b\xbc\x50\xfe\xe0\xcb\x87\xbe\xf8\x12\xc9\x84\x50\x3e\x0c\x2e\x6c\xdf\x3a\xee\x50\x38\x94\x06\xb2\x5a\x69\xe6\xcc\x6d\x27\x84\xa1\xc4\xce\x68\x32\x1c\x85\x93\xd9\xf3\xce\x70\xb0\x33\x09\xfd\xd9\xce\xfb\x7f\x15\xe3\xe2\xbf\xde\x5b\xff\x72\x24\x1b\x71\xce\xa9\x40\x7c\xdc\x7f\x53\x13\x38\x43\x09\xce\xe6\x8c\xe5\x85\xc7\xa7\xf4\xb1\x7e\x82\x34\x9f\x5c\x20\x27\x8f\x96\xdc\x99\xdf\xdb\xe4\xe2\x7c\xae\x04\x94\x8d\x6c\x1d\xef\xbe\x73\x9d\x9a\x1f\x1b\x35\x9f\xd0\xcd\x9a\x37\xc9\xcb\x45\x5a\xf3\x72\x4e\x7f\x22\xc6\x9f\x8a\xce\xe6\xd0\xa1\x85\x12\x98\x72\xb1\xcd\x7d\x8a\xc0\xb1\x2a\xe4\x3c\x3c\x45\x1b\xc6\x34\x69\xd6\xe8\x12\x58\x43\x70\x53\x18\x2e\x67\xb5\xd0\x1f\x4e\xc0\x66\x82\x44\x97\x99\x0b\x07\xa1\xe6\xc3\xed\x45\x47\x30\xab\x4f\xac\xdf\xf0\x38\x7d\xe2\xe2\x85\x06\xff\xf2\x63\xaa\x46\xd1\x10\x53\x61\x36\x48\x03\xe8\xb9\x89\x8c\xae\x5c\xe7\x79\x19\xf6\xb9\x26\x85\x92\x53\x66\xc0\x0a\x5a\xe3\x90\xb7\xe4\xb2\x64\xe1\x61\xed\x86\x5c\x57\xbe\xd8\x0d\x7c\xcb\xcb\x30\xd6\x65\x4e\xe6\x8c\xcd\xfa\xee\x83\xc5\xd9\xb4\x32\xb7\x53\x3c\xc3\xda\x9f\xc3\x78\xc0\x00\x60\x30\x23\x37\x5c\x98\x4a\x9f\x29\x38\xc0\x9d\x0b\x24\xc4\x2f\x18\x6f\x2b\xb2\x56\xfb\x56\x7c\x6b\x76\xc4\xb7\x7a\x45\xf6\xd2\xae\xa7\xc1\x68\xee\xa7\x14\x39\xef\xe6\x6c\xd6\x9e\x42\xaf\xd7\x9d\x9d\x0c\x07\xb3\x9b\xfe\x70\x38\xeb\x74\x07\x6d\xd2\x9d\x50\xc9\x10\x8e\xb8\x50\x67\xce\x88\xf3\x01\xff\xf1\xf8\x8f\xcf\x7f\x02\xfe\x53\x27\x73\x67\x6a\x18\x75\x81\x83\xa6\x86\x01\x52\xd9\x3a\x23\x32\xb9\x56\xf8\x35\xd8\x9a\xdc\x10\x46\x17\x80\xe9\xc6\xcd\xe7\xb9\x73\xc3\xc8\xe9\x5b\x5d\x6e\x5d\xa5\xc8\xb9\xcd\x8c\xbd\xd1\xba\x71\x9d\x5b\x31\x62\x39\x52\xc4\x53\x9a\x1d\x2c\xc7\xc7\x67\xba\x4f\x49\x3d\x8d\x6d\xdb\x3a\x74\x9d\xd2\xe7\x1b\xc3\x30\xfb\xb4\x48\x6a\xa2\x50\xff\x04\xf7\x69\xf1\x07\x72\xea\xac\x8b\xb7\xc8\x99\x32\xca\xf6\x16\xad\x6a\xe4\xba\x32\xb5\x5b\x75\xd7\x69\x08\x8f\xed\x25\xcc\x15\xa6\xca\xbc\x19\xff\x14\x71\x2f\x93\xdd\xc8\x8c\xa8\xd9\x40\x49\x52\x18\xb0\x5f\xd4\x20\x25\x67\xca\x57\x77\x7c\xc9\x0d\x61\x34\x8c\x0e\xa8\x76\xba\x51\xe7\x14\x21\x1c\x51\x73\x2a\xaa\x99\x22\x34\x25\x25\x2e\xcb\x99\x92\xa3\x9a\x73\xa3\x8f\xc5\x99\x2b\x80\xdb\xbb\xb1\x9e\x9d\x5b\x52\x6b\xd5\x84\xd1\xba\x8e\x59\xc3\x2a\xad\xa4\x5f\x26\x9e\x6b\x22\x6b\x36\x1c\xed\xd5\xd3\x67\xfb\x9d\xca\x90\xd6\x6f\x3d\x43\xb5\xd7\xaa\x95\x8d\x41\x5c\x93\xeb\xe2\x7c\xef\xa6\x75\xe8\xfe\x36\x55\x6e\x0a\xd8\xa7\xa3\x9a\xf8\x76\x2b\x5d\xc5\x4f\x86\x4f\xef\x7f\x0c\x26\xa1\x3f\x6c\x0f\xba\x2f\x61\xb0\xb3\xa0\x71\xb7\x3d\x60\x3f\xf3\xd0\xde\x79\x5f\x9c\x3a\xf5\x54\x6c\x36\x25\x25\x87\x03\x07\xeb\x95\x33\xfd\x7c\xe3\x4c\x8b\x45\x34\x27\xb5\xd6\xd4\xe5\x71\x38\xe2\x13\xbc\x37\xe7\x26\x31\xfd\xd1\x7c\x16\x06\xdf\xc3\xe5\xec\x2a\x1c\xb4\x67\x1d\x13\xfd\xd6\x28\xfe\x10\xf1\x3a\x78\x85\x62\x87\x7f\x3b\x97\xd7\x04\x35\xc3\x28\xc1\x5f\x68\x95\xc7\x77\xac\x31\xb6\x46\xc2\x93\x7a\x6e\x76\x90\x1e\x1f\xb0\xae\x8c\xe0\xf0\x9c\xbc\xbe\x8f\x86\x83\x99\x15\xd1\x7e\x37\x7e\x06\x39\xfd\x70\x30\x3b\x81\x37\xf1\xd2\xa0\xfd\x10\x84\xe5\x2c\xdf\xb4\xfb\x12\xbe\xb7\x7d\xac\x82\x5a\xfb\xe2\xc3\x13\xa8\x3f\xbc\xb7\x03\xf8\xd4\xe4\xca\x10\x01\xee\xce\x68\xdc\xf5\xed\x18\xcf\x07\x41\x38\x81\xd0\xea\x03\x60\xb1\xa7\x6c\x87\x4d\xf3\x39\x5f\x76\x86\x67\xb8\xdf\x39\x38\xd6\xf1\x01\xab\x24\x09\xfb\xf5\x4f\xf9\xef\xbb\xf1\x25\x97\xd7\x39\x91\x61\x44\xad\x1f\x9e\xeb\xa0\x08\xa4\x60\xf0\x82\x1c\x8f\x8c\xa4\x93\x75\x06\xe0\x05\x42\xa4\x29\x47\x38\x99\x0c\x27\x3b\xdc\xa0\xa4\x3b\x68\xef\xb0\xfd\xf9\xde\x59\xa5\xab\xfd\xaf\xbc\x1c\x3b\x21\x37\xf2\xd8\x79\xea\xce\x3a\x3b\x7e\x87\x0e\xda\x61\x90\x9e\x97\xef\xff\x55\xf4\xc5\x39\x99\xb5\xce\x3b\x64\xc7\xe5\x86\x96\x43\x0e\x69\x99\x2a\x3a\xac\xdf\x09\xa3\x57\x9f\xf8\x3a\xed\x06\x11\x9a\x18\x4e\xf3\x79\x90\x10\x8f\x71\x80\x1c\x59\x79\x8c\x2f\xe4\x71\x3a\x94\xbe\x05\x08\x23\xe9\xd8\xa4\x0c\xff\xd1\xcc\xd4\x8b\xfa\x3d\x22\x9b\x4a\x6f\x7e\xc0\xc8\x44\x33\xd0\xf0\xb8\x89\x06\x25\xd4\xea\xb7\x5b\x8f\x81\x6b\x22\x87\xb6\x82\xb1\x66\x0a\xaf\x34\xc0\x77\x28\x8c\xfd\x84\x8d\x7d\x74\x81\xff\x23\x45\x0f\x3c\x95\x42\x87\xd7\x95\x33\x6f\x51\xcb\xbf\xb5\xfa\x1d\x97\x78\xec\xa5\x35\x3c\x74\xe1\xed\x9d\x0f\xdf\x6a\xa7\xf0\x16\xc0\x4b\x3c\x87\x97\x18\x5e\x9e\x9a\xf0\x32\x80\x52\xa7\x2f\xbc\xd4\x08\xde\x9e\xc4\xdb\x54\x17\x03\x7a\xe6\x29\xeb\xed\xc5\x39\x7e\x39\xc6\xa3\x0b\x7c\x96\x4b\xff\x73\xe1\x58\x56\xb5\x20\x6b\x41\x24\x82\x60\x68\x31\x38\xa6\x0b\xfd\x6e\xf0\xf2\x62\x5b\x14\xea\x1b\x56\xc7\xeb\x74\xd1\xb6\xbd\x95\xb8\xef\xd3\xae\x28\x4f\x90\xb8\xa2\x8e\x52\xd3\xa1\xda\xba\xe9\xd0\x97\x26\x69\xac\xa7\x0d\xab\xa4\x9a\x63\x62\xb4\x58\x4f\x1b\x7f\xd4\xcd\x8e\x94\xc9\xd2\xcb\x7a\xda\xe4\x23\xa9\x6b\x69\x51\xeb\xc7\xd8\xcd\x98\xc4\xf0\x14\xdd\x54\x88\xa7\x9c\x6f\xe4\x39\xd3\x52\xb8\xd5\xd8\x48\xd9\x79\x8a\xed\xc6\x4e\xdc\xac\xae\xc5\x3b\xed\x1a\x5c\x14\xd2\xed\x77\x3e\x93\x60\xcd\x61\x71\x6b\xf8\xec\xb6\x02\x17\x98\xa1\x8b\x89\x40\x02\x37\x60\x29\x15\x2e\xbb\xd3\xd9\x74\x87\x0e\x02\xe9\x21\x93\xee\x4c\x67\x94\xed\x6c\x30\xa5\xb2\xde\x3b\xac\x8c\x74\x40\x29\x6a\x22\x9e\xe6\x8c\xeb\xdb\x88\xdb\x4f\x61\x95\x81\x9b\x70\xd3\xd6\xdc\x67\x60\xc6\x70\xd7\x91\x61\x80\x35\x54\x0d\x8b\x55\xca\xb7\xb6\x7a\x14\xdf\xc7\x1f\xf9\xfb\xc9\x52\xb8\x12\x9b\x7c\xdc\x34\x9f\xf2\x45\x9d\x9a\x19\x91\xda\x7b\x59\x04\xa2\x08\xdc\x8a\x04\x47\xfb\x3a\x35\xeb\x14\xc6\x64\xd8\x27\x41\x4b\xf6\xd9\x6d\x79\x13\x97\x5b\xc5\x8f\x34\x03\x50\x1f\x17\x0a\x1e\x23\xbc\xb4\xa4\xbc\x56\xe7\xca\xa3\x01\xb5\xae\x9a\x28\x55\xb0\x62\x98\x23\xcf\x2e\x5c\x38\xbc\xf1\x5b\xa1\x8b\x63\x12\xb4\xda\x99\x7e\xb4\x19\x8a\x7b\x97\x76\xa4\x2d\x02\x0f\xcc\xf5\x14\xa4\x19\xd8\x2f\xd6\x0c\xbc\xb2\x00\xf2\xb7\x66\xc8\x2b\xbb\xa8\xd9\x7a\x43\x1f\xb9\x2e\x98\xa7\xc7\x91\x49\x4d\xa8\xbc\x96\xef\xba\x2a\xa6\x83\xaa\x7c\xc5\x20\x45\x58\x99\x32\x30\xf0\x5c\x75\x31\xa3\xa5\x29\x40\x4f\x2d\xba\xd4\x57\x95\xc2\x0d\xc4\x32\xd0\x92\x67\x87\x96\xb5\x18\xcb\xb3\x29\xcb\x42\xd4\xc2\x5b\x07\x29\x69\x65\xb6\x69\x54\xf6\x92\xb5\x80\xa7\x2d\x3a\x71\x65\x5c\x35\xb8\x89\xa4\xcf\x14\x39\xc8\x23\x20\x85\xd4\xe2\x4b\xc1\x48\x60\x46\x58\x11\xb9\x27\xfd\x54\x78\x78\x31\x76\x41\x50\x78\x39\x76\x41\xd4\x77\xc6\x7e\x08\x39\x9f\x56\x28\x69\x9c\xd9\xec\xf9\x6c\x0a\x57\x64\x5f\xce\x90\xf3\xce\x57\xd3\xec\xbb\x8e\xcf\x8d\xfe\x70\xeb\x15\xdc\x63\x4a\xb7\x6a\xc1\x0a\x83\x4f\x33\x8a\x67\x74\xd2\x0e\x67\xb6\xbf\x72\x75\x80\xa8\x66\xfc\x8d\x70\x88\xe7\x2b\x85\x43\xa2\xed\x05\xb6\x0b\xd2\x57\x08\xd8\xad\xb6\x84\xd5\xed\xa4\x9e\xed\x54\xcd\xb5\x8c\xb1\x61\x9a\xde\x50\xb6\x9a\xbc\x78\x81\x90\x60\x24\x92\x18\x12\xe2\xb3\x91\xfa\x41\x1c\x7d\x54\xce\xb0\x47\x1f\xd9\x69\x21\x9c\x20\x56\xb9\x40\x0d\xdc\x38\x7a\xd2\x7f\x7d\xd4\xa7\xce\x83\xf8\x10\xf5\x29\xb8\xc6\x84\x97\xfb\x33\x19\xe9\x2b\x7b\xde\x48\x8a\x20\x0d\x1c\xeb\xa1\x95\x6a\xce\xb9\x16\x75\x85\x53\xe4\xe4\xa1\x01\x8f\xdf\xd4\x72\x6f\xe0\x99\xf9\x92\x7e\xe7\x35\xca\x9e\x82\x0e\x2d\x57\x93\x0d\x5b\x13\x57\xea\xc7\x86\xad\x43\x17\x2f\xed\xd0\x5a\xe2\x67\x3b\xb4\x9e\x57\x80\x59\x0d\xc3\x94\xad\x7f\x43\x99\xab\x4c\xa4\x7b\x8c\xa9\xaf\xc9\x17\x7a\xe8\x95\x47\xea\xeb\xb1\x06\x4f\x4e\x5b\xb7\x9e\x6b\x6a\xf4\x64\xcc\x69\xc9\xa8\x15\xbb\x8c\x80\x0c\x5b\xb1\x9b\x24\xf0\x43\x3c\xeb\xa2\x43\x4d\xcf\xea\x36\xb0\x67\x3d\xb2\x3f\xb5\x1e\xf6\xc1\xad\x89\x4b\xfc\x22\x7b\x45\xb8\xf7\x37\x61\xef\x08\x04\xd1\x9e\x35\xfd\x08\x79\x11\x6e\xef\xed\x61\x56\x29\x29\x94\xb0\x07\xb0\x78\x76\x02\xb4\x91\x0c\x2c\x95\x16\x60\x8d\x99\x3d\x50\xd3\x6d\x73\xc4\x7b\xd3\x24\x03\x6b\xf6\x91\x4d\xdf\x2d\xf6\x90\x6d\xca\x54\x6e\x70\x8f\xa9\x75\xd6\x24\x85\x32\xa6\x69\xc5\x2e\x4a\x3d\x9b\x80\x4b\x0d\xb8\xc4\x69\xb9\x0e\xcf\x5b\x12\x6e\x68\x28\xb7\xf1\x76\xf2\x9a\x49\x61\xf2\x5a\xc2\xa4\x30\x0c\xcf\x78\xf1\x9f\x2e\xda\xd2\x05\x67\x8a\x2e\x95\x75\x13\x05\xc7\xca\xb6\xda\xdf\x54\x3b\x93\x6f\x36\x03\xb5\x4d\x17\x6d\xec\x39\x94\x53\xe5\x3c\xf8\x1d\x97\x0d\xf8\x27\xe0\x63\xa1\x50\x42\x98\xfb\xc6\xa7\x82\x58\x67\x04\x67\x86\xde\x79\x07\x04\xcf\x1b\x44\x81\x13\x5b\xa7\x1d\x6a\x22\x67\x60\x9d\x74\x28\x1f\xad\x18\x3f\x9f\xb3\xdb\x2d\x06\x9c\x2b\x28\x33\xfb\x48\x6e\xad\x49\x38\x9e\x87\xd3\x99\xf2\x4d\x71\x32\xa1\xfd\x30\x49\x6e\xad\xfe\xf0\xe5\x7a\xdb\x37\x2e\x64\xd8\xfa\xb9\x3f\xdd\xf2\x49\x17\x95\xdd\x82\xe3\xcc\x1c\x37\xa4\x29\x1d\x59\xa3\xb3\xd0\x1a\x0c\x9f\x4c\x84\x56\xb8\x7c\x7c\xf0\xfb\xc7\x12\x42\x2b\x3e\x5a\x72\x6b\xf9\x74\xe0\x87\xf1\xd6\x5e\xf0\xcf\xb9\x03\x3b\x7a\xbb\xa4\xca\xb1\x6d\xe4\x3f\x29\xaf\x67\xca\x9b\x9d\x37\x8b\xbf\x4b\x73\x6c\x94\x6d\xf9\x63\xd7\x89\x3d\x73\xb0\xae\x67\x3e\x68\x5d\xba\x70\xd5\x2f\xac\x94\x73\x6c\x7f\x75\x9c\x95\x24\xe2\x04\xa8\x98\x54\x19\x13\x53\x17\x61\x8a\xec\xa9\x46\xda\x14\x4a\x6c\xba\xc1\x40\x38\xdc\x30\x34\x41\xaf\x14\x3c\xfe\xf9\x8c\x21\x51\x89\x19\x9f\x15\x9d\x39\x04\x97\x80\x1a\x46\xbd\x1c\x53\x15\x55\x87\x55\x3b\xd5\x52\xb7\x56\xd2\xf1\xde\xaa\x84\xf1\x38\xbf\x52\xcb\xc5\xd5\x9b\x5d\x89\xe7\xbf\x52\xc9\x4d\x90\x33\x23\x81\xe8\xc8\xd3\xcb\xf6\x19\x09\xd4\x9c\x36\xd6\x5d\x5e\x70\x19\xdf\xbb\xac\x77\x83\xc3\xd9\x2c\xec\x8f\x66\x61\xb0\x33\x1b\xee\x70\xcf\x0f\xd2\xc9\x41\x87\xce\x76\x82\x61\x38\x1d\xfc\x6b\xb6\xd3\xa1\x8b\x30\xe3\xda\x40\x6d\x27\xcd\xee\x5d\xb4\xdc\xd8\xf4\xb6\x91\xf2\x05\x3b\x7d\xf3\xbd\x4f\x59\x95\xc0\x06\xa4\x2e\x15\x3a\x74\xf6\xaf\xa9\xf2\xa4\xc0\x79\x04\xeb\x3d\x90\x37\x7b\xe5\x02\x59\xc3\x9c\xff\x51\x65\xc1\x84\x3e\x0d\x58\x5d\x9c\xd5\x28\x39\x19\xbe\xc2\xd1\xf9\x0a\xee\xe6\x31\x8f\x97\xd0\x48\xbf\x95\xb3\x10\x9b\xe2\x06\x65\x75\x07\x1e\x96\x6f\x99\x42\x30\xb6\x8a\x9d\x9a\x5e\x92\x78\xd6\xb2\xfc\x37\xf1\xac\x33\x78\x7e\x86\xe7\x2b\x29\x3f\x39\x06\xe9\x88\x3f\x1c\x4c\x67\x93\xb9\x0f\xfe\x30\xbe\xcd\x69\xf0\x7d\x12\x86\xf6\x4e\x77\xb0\xa0\x71\x37\xe0\x1e\x53\xa6\x3b\xed\xee\x22\x1c\x48\x57\x13\x71\x83\xf8\x49\x22\xc6\xc7\x33\x48\xff\x39\x83\x61\x10\x4e\xc9\xbb\x36\x35\x3f\x48\x8b\xff\x2a\xe3\xba\x4e\x9e\xf8\x76\x6c\xb9\x19\xd7\x61\x54\xf4\x55\xe4\xcc\xb0\x83\x17\x4d\x13\x82\x6a\x88\x9d\xdc\xba\x07\x9e\x0d\x78\x95\x15\x6d\x1d\x71\x2f\x53\x9c\x0a\x6e\x2d\x9e\xf5\xe8\x60\xe0\x09\xec\x95\x3b\x76\xc9\xbb\xf7\xb6\xe6\xb1\x99\xfa\x05\x92\xcd\xfa\xaa\x59\x4f\x59\x2d\xb3\x36\x7d\x17\xbc\x9e\x8f\xc7\xae\xc3\xa7\x33\xb0\x96\x65\xc3\x60\x93\xfa\x19\x82\xc0\xb3\xe7\x67\x48\x7f\x86\xf4\x2b\x48\xbf\xf2\x2a\xbe\xc5\xfb\x60\x52\x6e\xde\xc5\xba\xc9\x81\x41\x85\x2f\xcf\x26\xe3\x0f\x7f\x8b\x09\x36\x8c\x0f\x9f\xd5\xb7\x0b\x57\x78\xca\x98\x80\x23\x4f\x2a\x24\x93\xc2\xce\x9a\xe7\xc8\xba\x66\x10\xed\xaa\xef\xd4\x45\x6a\x09\xb4\x42\x7f\x73\x56\x12\xde\x38\xd3\xa2\x7d\xdc\xf3\x90\xcd\x96\x6b\x85\xfd\x38\xa4\x13\x5d\xbf\x4e\x5b\xcd\xcc\x34\xa6\xe4\xc3\x3b\xe9\x38\x02\xa6\x70\xad\x7b\x90\x46\xdd\xd6\xbd\xc7\x86\x23\x54\xdd\xe4\x07\x1d\x8e\xd6\xc1\x68\xb5\xc2\xe3\x79\x38\x79\xb6\x73\x8e\x06\x05\x28\x6c\x67\x50\xb4\xc2\x17\xcd\x9c\xb5\x2f\x98\x94\xad\x15\x9f\x99\xf1\x18\x1c\x2a\xaa\xe7\x2b\x0f\xfd\xbe\x8f\xc0\x8d\x2c\x65\x2b\x9d\xe6\x5a\x6a\xb9\xce\x58\xae\x0a\x63\xc3\xcb\xf6\xbe\xed\x01\xf9\x7a\xa0\x49\xe9\xf0\x74\x14\x77\x67\xf6\x9a\x89\xbc\x47\x4c\xad\x86\x3d\xad\x66\xf4\xfb\x3e\xf6\xb5\xaf\x57\xda\xd7\x67\xf8\x2a\x8c\xe6\x79\x76\x1c\x11\xed\xb3\x8c\x90\x19\x37\x8a\x42\xb4\xc1\xe6\xb6\xe4\x12\x7e\x89\xff\xba\x2c\x73\xdd\xa8\x08\x9c\x4d\x17\x3d\x7c\xe5\xd9\x51\xd1\x5f\xc9\x98\x99\x90\xbd\x9c\xc9\x5e\xf4\xf4\x02\x5b\x8a\xec\xe7\x15\x29\xbe\xf3\xd7\x4b\xad\x97\x3b\xd8\xec\x59\xd1\xcf\xf6\x4d\x2b\x02\xab\x5e\x5a\x49\x57\x41\x9b\xcb\xa9\xc0\x75\x8d\xd0\xfd\x4c\xbc\x8a\xb9\x06\xda\xc2\x0d\x9e\xa8\xb7\x52\x50\x7d\x6a\x87\x3a\xcf\xa1\xcc\x62\xbd\xd6\x37\x1e\x57\x0a\x54\x4c\x57\x28\x2b\x12\x9d\x6c\x58\xa3\xe5\x2a\x14\x70\xf7\x64\xad\x06\x38\x1a\xf5\x40\x7b\x41\xf8\xbd\xc6\xd4\x0a\xe7\xb8\x84\xf7\xb9\xd9\x7e\x01\x22\x21\x2d\x78\xbe\x56\x97\x6d\xf4\x15\xee\x55\x73\x15\xac\x85\x1f\x4f\xcc\x9d\x76\x7a\xd6\xb3\xa3\x62\x66\xbd\x30\x9e\xeb\x37\xbf\x18\xfc\x16\xa0\xcf\x84\x35\x21\x6e\x7b\xa7\xff\x51\x7f\x9b\xcf\xbc\x1f\xa2\xdf\xad\xef\x2f\x60\x22\xbf\x47\xad\xd3\x2e\xeb\xfc\x1e\xf8\xd8\x76\xbc\x56\x1f\x3e\x9c\x76\xf1\x3b\x91\x02\x43\xe4\x61\x0b\x33\x63\x3b\x7f\x32\x3d\x3c\xa8\xaa\xc1\x39\x5e\x6b\xf0\xf2\xd6\x20\x4d\x61\x29\x8f\x7e\x87\xfa\x03\xa2\x9c\x96\xfe\xce\x9a\x92\x43\x2e\xff\x4d\xc4\x78\xc5\x40\x67\xff\xab\x81\x8e\x9e\x61\xa0\x65\x36\x48\x58\x91\x17\x18\xe0\x99\x87\x29\x43\x0f\x6a\x89\xba\x4b\xd3\xc3\xb7\x4b\x88\x01\xba\xeb\xfd\xd2\x78\x58\x8d\x7b\x50\xcb\xef\xd0\x04\x9b\x43\xa5\xea\x65\xfd\xf1\xb7\xf0\x71\x01\x0e\x01\x78\x66\x70\xc7\x5a\x46\x7b\xe0\x7b\x9d\x8f\x6e\xfe\xa6\x11\x24\x5c\x31\x88\xb1\xa4\x0a\x83\x9e\xf5\x75\x04\xd2\xba\x01\xf7\x0a\x1a\x7e\x1e\xa4\xd2\xba\x11\x01\x8f\x8d\x42\x2b\x50\x3a\xb9\x1d\xb5\x4a\xd2\xc9\xed\x69\x64\xfb\x30\x2d\xa3\x56\xd9\xc5\xa3\xd6\xbe\x9b\x51\x68\x38\x61\x9f\xd9\x24\xc1\xe7\x77\x1b\xdf\x1f\x8f\x6c\xdf\xf2\xc2\x97\x6e\x38\x39\x9a\x4f\x16\xe1\xf7\x61\x5a\x11\x1e\xb5\x0e\xd8\x9f\x0f\xec\xcf\x1f\xec\xcf\xc7\x6c\xe1\x4e\xdb\xf6\xc5\x84\xf3\x69\xda\xa6\xed\x40\x67\x9d\x1d\x7f\xd8\xef\xd3\x01\x38\xef\x64\x43\x52\xca\x0e\xdb\x74\xf1\xd8\x54\xf1\xe5\xe7\x33\xc7\x40\xd4\xc7\xd7\x87\xc8\xf1\x05\x88\xfa\x79\x4b\xaa\x49\xad\x85\x78\x27\x38\x46\x40\xeb\x5e\x55\x79\x55\x9a\x52\xae\xd5\x9d\x7e\x1d\x76\x07\xb3\xf3\xc1\x57\x3a\xeb\x28\xcf\xeb\x49\x12\x58\xdd\x27\xaa\xde\xc5\xe2\x2e\xfe\x57\xa0\xdb\x3b\x74\x53\xdc\xd2\x9a\xb8\x98\x42\xcc\x54\xd8\x78\x37\x87\xbf\xb2\xf1\xe4\x49\x6a\x2d\xff\xa6\xd6\x92\x91\x32\xcb\xcf\xd4\x5a\x16\x59\x6d\x40\xe4\xfc\x4d\xad\x67\x78\xf8\x4c\xad\xe7\x22\xab\x1f\x7a\xfe\xce\x33\x97\xff\x49\xd7\xad\x68\x38\x98\x11\x6f\x40\x1d\xaf\xf5\x08\x1b\xee\x32\xc4\x32\x1c\xc0\x1b\x58\x0f\xc8\x36\xad\x93\xbe\xec\xa4\x6f\x2d\x8b\xbe\xea\xa4\x2f\x3b\xe9\x5b\xcf\x45\x5f\x76\xd2\x33\x9f\x72\x6f\xf0\xf2\xaf\xaf\x54\xff\x85\x81\x32\xc5\xb5\x53\xdb\xc3\xf1\xdc\xf6\xf1\x53\xd3\x0e\xb8\x81\x72\xcc\x0d\x94\x07\xbc\xfe\x31\xab\x9f\x91\xe6\xfa\xdd\xd3\x4f\x2f\x9e\x58\x4a\x9b\xad\xa7\x12\x57\x42\x82\xc3\xcd\x3f\xe1\xb4\xf2\xe9\x60\x41\xa7\x1a\xb8\x71\xbb\xc8\xdb\x0e\x03\xb5\x9e\xb8\x78\x6a\x8b\xc7\x93\x0e\x3e\xea\x53\x11\x2a\x47\x06\x13\x79\x78\x22\x3d\x05\xa3\x9c\x2d\x69\x6a\x07\x71\x89\x1d\xc4\x25\x15\x8f\xa2\x2d\x43\x3e\xd2\x38\x26\x2d\xd7\xf1\xe5\xd5\x90\x76\xaf\x84\x34\xa9\xde\x48\xb9\x26\xa5\x71\xac\x79\xa1\xfb\x51\xc3\x73\xad\x84\x6c\x38\xa5\x8a\xf3\x6f\x3a\xe4\xe1\xfe\xba\xb4\xb9\x94\xf9\xd9\x06\x29\xf3\xca\xa1\xac\x37\x6b\x9e\x6a\xbf\x35\x2d\xa0\x09\x61\x20\xec\x54\x7c\x66\x3f\xcf\x6c\x30\xec\xed\x8a\xfd\x3c\xaf\x10\x0e\x48\x09\x87\xfc\xba\x22\xf8\x1c\xa6\xa1\x1c\x22\xe2\xb7\x02\xd7\x89\x5b\x51\x6b\xee\xbb\xad\xa3\xc0\x75\xad\x5e\xd5\x8c\xc0\x4d\x26\x04\xac\x8a\x10\xc4\x43\x00\x32\xdc\x23\x7b\x65\xc7\x27\xb4\x55\x72\x9d\x40\xd0\xe1\x21\x0f\x54\x2f\x6b\x15\xb7\x85\x6c\x2a\xb8\xf8\x3c\x70\x11\x8e\xfe\x86\xb0\x50\x24\x02\x4d\xdb\x00\x62\xbf\x33\x96\xb6\x3d\xd5\xe5\xdb\x73\xee\x42\x56\xf4\x43\xdc\x38\x99\xba\x24\x56\xac\xa6\xd5\x0f\xe9\x74\x3e\x09\x19\xf8\xc1\xf6\x41\x9a\x84\xb6\xbc\x8f\x97\x36\x05\xf9\x2c\x65\x43\x5f\x81\xb0\xc5\xb7\xce\x27\xe0\x22\xf2\xe7\xc2\x96\xb8\xa5\xfa\x20\x45\xc7\xa2\x5d\xa4\xdc\x62\x6a\xf7\x49\xdb\xc4\x2b\xbe\x94\x46\x04\x4a\xb8\xe2\x23\x27\x66\x2f\xeb\xb5\x6e\xaf\x74\x5d\xe2\xe2\xa7\x32\x9b\x40\xca\x5b\x58\x9a\x13\x5b\xb5\xd3\x5f\xaf\x76\x5d\x06\xa3\x57\xab\x24\x30\xbc\x5e\xf6\xfa\xeb\x15\xaf\x8b\x65\x32\xfd\x15\x42\x19\xd1\xdf\x78\xfe\xeb\xd5\xae\x89\x59\xb4\x4b\x31\x05\x67\x9b\xb7\x62\x62\x7f\x08\x3a\x56\x6d\xe9\xf4\x7e\x6a\x24\x5c\xd3\x72\x04\x83\xb5\xe7\xd6\xc4\xd5\x19\xcd\x77\xaa\xac\xc6\xca\xe9\x5c\x33\xfb\x44\x5d\xc7\x37\x8c\xb8\xe5\x67\x81\xc7\x57\xe3\x5b\x6d\x38\xea\xe2\xe2\x8c\x7e\xed\x6d\xbf\xc7\xc2\x23\xcc\x54\x20\x99\xe9\x47\x42\xf9\x60\xba\x0d\xe9\x93\xf4\xb1\x41\x44\xf4\xed\x5a\x8f\x44\xfc\xe9\xa2\x43\xc9\x34\x49\xfc\xd4\x6b\x69\x8e\x0b\xe3\x35\xf5\xc4\xd4\x44\x20\x22\xa6\xb7\x47\xd1\xef\x01\x6e\x93\xe8\xb7\xbd\xb0\x48\x9d\x75\xf7\xe1\x9a\x47\xf1\xdf\x68\xb1\x9d\xfa\x31\xcd\xb8\x2f\xdd\x5d\x52\xdc\x3a\x7d\xa6\x98\x9d\x0f\xa3\x0b\xdc\xaf\xad\x9d\x09\x01\x84\xaf\x4e\x15\x0f\x7d\xb0\xd3\x7f\xe1\xdd\xa8\x42\x20\xe9\xcb\x8b\x4a\x95\x50\x50\x31\x0d\x8e\x0d\xc3\xac\x12\x0f\x39\x23\xeb\x84\x54\x9d\x91\x15\x85\x24\x70\x46\xd6\xcd\x1f\x64\xa0\x3b\x3f\xaf\x9a\x2f\xd8\xc7\x3d\xb4\xe6\x72\x73\x7d\x10\x8a\x9e\x09\x05\xf4\x3f\xbd\xb8\x66\x09\x97\xb0\x87\xdf\xf9\xe0\x43\xb6\x43\xcd\x50\x2a\x42\x84\xfc\x10\xa6\xd6\xb0\xc1\x12\x05\xef\x1e\x59\xcb\xf4\x51\x71\x23\xd1\x6a\xc5\x29\x4c\x3f\x37\x3c\x28\xaf\x70\xab\x6c\x1f\xb7\x71\x8f\x14\xca\x4e\x68\x18\x21\x10\x0c\x53\xc3\x88\xac\x66\xe8\x9d\x0c\x07\xb3\x8a\xf8\x6d\xc5\x81\x6b\xbe\xb6\x87\xc3\x76\x1c\xda\xaf\xa0\x03\xd5\x0d\xa7\xb6\x28\xb0\xc2\xd4\x9f\x75\x75\xc6\x11\xbd\xb6\x0d\xa3\x6d\xc6\xca\x47\x03\x5a\x81\xba\x53\x77\xb0\x99\x53\x89\xfe\x86\x83\x70\x67\x38\xd9\xe9\x0f\x27\xe1\x0e\xd4\xbb\xe3\x0f\xe7\x71\x00\x6a\x06\x5e\xb8\xc3\xa3\xc1\x59\xef\x91\xb3\x5a\x21\xbb\x47\x0a\xca\x62\x75\xd6\x09\x07\x69\x8d\x21\x8f\x48\x8a\x22\xb8\x33\x08\xe1\x60\x8c\xb0\xd6\x15\x5c\x12\x97\x4f\x6d\x12\xae\x56\xab\x74\x65\xa3\x27\x4a\x7a\xba\x9b\x18\x53\x0b\x06\x76\xaf\x05\x03\xe3\x37\xc2\x54\x6e\x8f\x6f\x3c\xe8\xda\x57\x1e\xf5\x88\xa7\xd5\x7d\x4a\x82\x24\x51\x3e\x49\x5b\xd5\x43\x70\x72\x80\x56\xf7\xe6\xfd\x15\xbe\xbe\x42\x4e\x93\xdc\x8b\x90\x5b\x7a\x78\xbb\xac\xf3\xcc\xe6\xd3\x66\x90\x38\x31\xea\x15\xfb\xb2\x11\xae\xed\xfe\xca\x0a\xad\x87\x71\xc6\x0d\xf5\x46\x48\xb6\xbc\x80\x6c\xaf\x72\x28\x54\xc4\xb1\x49\x71\x9f\x0c\x7d\xa7\x79\x58\xbd\x19\x0a\x07\xc9\x37\x43\x21\x5e\x02\x73\x86\xbb\x2b\x93\x11\xb1\x49\x52\x02\xaa\x98\xfd\x5e\x5e\xc8\x28\x89\x58\x4e\x4c\xe5\x15\x96\xd7\x96\xef\x2b\x9b\xdf\xe8\x21\xd4\x8a\x0f\x35\x19\x01\x65\x34\x6c\xf3\x89\x50\x87\xfd\x58\xdf\x22\x72\x77\x65\xed\xfa\xe4\xec\xd2\xbc\xbb\xb2\x6e\xfe\x30\x59\x32\xc2\x79\x44\x6c\x8b\x42\xb0\x24\x46\x53\x1d\xb9\xe6\xc5\xcd\x97\x46\xab\x1d\xb8\xa6\xd7\x2a\xbb\xa9\x3f\x27\x1f\xac\x98\x76\x8f\x10\xc3\x1f\x6c\x7c\xaf\xab\x15\x02\x42\x7b\x2d\x08\x9b\x16\xc5\xe8\xe1\x4a\xdf\x5b\x30\x82\xa7\x36\x29\x14\x3c\x47\xf8\x94\x6e\x2d\x0f\x45\xe8\xc4\x9a\x90\xde\x49\xff\xe0\x61\x25\xe4\x43\xbe\xef\x25\x89\x84\x93\xa7\xb6\x61\xc8\x8c\x7b\xe5\xdf\xb8\xf8\xf1\x59\xaa\x3d\x4c\x7e\x90\x82\xbf\xba\x37\x1f\xae\x70\xe3\x91\x41\xcc\x03\x40\xcc\xee\x93\xd9\xc4\x5c\xb6\xdd\xb4\xee\x7b\xa4\xc4\x60\xe8\x80\xed\xe2\xb3\xf5\x78\x6c\x0c\xeb\xec\x3e\xa9\xfb\x67\x6a\x18\xa6\xe8\x03\x19\x77\x4d\x0f\x55\x3c\xbb\x2c\xd4\x7e\xa6\x2f\x6e\xab\x17\xb8\x95\x92\x2d\x7a\x56\xd9\x2b\xdb\x65\xe4\x8c\xbb\x60\x83\x2b\x7b\xe9\xf3\x60\x6e\x8d\xeb\xcc\x49\xa9\xda\x60\xd5\x88\xde\xdf\xf7\x08\xb5\xee\x7b\x6a\x22\xa8\x36\xb2\xa7\x36\xa1\xd6\x53\x5b\x0d\x93\x5a\x93\x1f\xe0\xfd\xa9\xb9\xc5\xf5\xd3\x03\x0f\xa7\xc9\xaa\xc7\xa2\x06\x5c\x10\xa5\xb1\x68\x0e\xab\xe9\x63\x8b\x58\x5b\xab\x0c\x24\xa6\x4a\x8e\xfa\x78\x90\xba\x99\x67\x95\x0a\x4f\xe8\x93\x1f\xe0\xe8\x4c\x55\xc4\xb1\x53\xfd\x51\x5c\xf6\xb2\x9c\x7a\x48\x52\x31\x49\xaa\xd6\xfb\x1e\x04\x8b\xd0\x4e\xec\xa7\x76\x85\xb6\x6a\xbe\x6b\xf3\xeb\x5d\xbf\xa2\x80\xc4\x17\xd2\x6a\x0e\x30\x7b\xe5\xdf\x84\xd7\x08\x53\x2f\xf9\x08\x25\x03\xdf\x45\x5b\x0a\xb6\x1e\x43\x97\x17\x56\xf3\x2c\x3b\x5f\x14\x5d\xfa\xcd\xcc\x2c\xa8\x1e\x1a\x91\x41\x4d\x49\x1f\x9b\x3e\x25\xe9\xe0\x35\x91\xdc\x2e\x5d\x43\x25\xea\xea\x68\xfa\xe2\x12\x55\x91\x61\xe8\x53\x4b\x61\x62\x44\x77\x10\xdf\x61\xd3\x51\xdc\xf5\xc3\x2d\xe4\x16\x2c\x73\x3a\x0f\x65\x7b\xaf\xac\x60\x8a\xf8\x1a\x10\xef\x95\x7f\xf3\xf1\xaf\x0e\x3c\x85\xbd\x82\x78\x70\x60\x43\xb5\xc6\xbe\xab\x82\x24\x6e\xe6\x49\x39\xa1\xb8\x6b\xa6\xde\xab\x4a\x2e\xaa\xe8\x6f\xb6\x7a\x81\x8b\x8c\x0b\x77\xaf\xec\x94\x3e\x93\xc0\x09\xf6\xf6\xd0\x63\x6c\x32\xfe\x07\x7b\x10\xa0\xdf\xd3\x43\x31\xee\x5e\x31\x14\xb3\x7b\x05\x91\x2c\x02\x9a\xef\x39\x90\x7f\x6e\xfb\x39\x07\xc5\x8f\x9e\x79\x28\x7c\xdf\x8d\x7c\x53\x48\x5e\xc7\x8f\x26\x42\xb2\xd8\xb7\x1c\x77\x84\x3b\x9e\x88\x88\xd9\xf6\xb5\x9c\xfe\x70\x30\xa3\xdd\xc1\xb4\x31\x0c\xd6\x1d\x0d\xea\xc7\xd2\xb7\x9a\x79\x0e\xc1\xe1\x70\x66\x24\x17\x32\x9e\xd3\xc3\x95\x7e\x00\xc1\xd5\xf0\xbd\x79\x71\x44\xf1\xc3\x95\x76\xa4\xd2\xfa\x06\x9d\x92\x22\x28\x1a\xca\xc0\xa0\xbb\x01\x11\xe1\x55\x4f\x03\x22\xa9\xdc\x80\x04\xb8\x4c\x08\x65\x18\x8b\xf1\x8f\xdf\x7d\xb7\x40\x46\x11\xe8\x41\xd1\xd6\x83\xe7\x62\xd3\x23\x94\xfb\x31\x90\xf5\x79\xaa\xbe\x12\x84\x72\x06\x7b\x0d\xf9\xf1\x0b\x84\x30\xc7\x11\x29\x94\x10\x62\x55\xfb\xbc\x6a\xd3\x54\x4d\xb3\x6a\x19\x4f\x59\x91\x5d\x10\x98\x92\x7d\x43\xc8\xd1\x06\x1d\x56\xc4\x07\x5b\x54\x8f\x43\x70\x05\xd6\x8d\xcc\x08\xcd\x26\xcf\xfc\x9a\x69\x0c\xd2\x67\x9f\xce\xfc\x8e\xd9\x06\x6c\xd4\x2e\x90\xfa\xa3\xd8\x76\x6d\x67\xb5\xba\x37\x69\x1d\x5f\x1c\x51\x86\xfa\x69\x9d\x13\x0b\x94\x47\x15\x75\x9a\xac\x5d\xf1\xc4\x86\xc4\xa8\x01\xfe\x33\x7e\xdc\x46\x4e\xd0\x10\x88\x86\x78\xdb\xf7\x53\x88\xb6\x1b\x8d\x72\x80\x50\xe2\x0b\x71\xca\xa9\xcd\x6e\x9d\x06\x72\xaf\x5b\x0f\x41\x92\x88\xd3\x04\xf6\xf9\x26\x0e\x96\x78\x32\x1a\x51\x79\x67\xad\xe3\x97\xba\x15\x66\xf6\x62\xde\x49\xa3\xa0\xc3\xa2\x82\x15\x39\x0d\x08\xb5\x4e\x05\x87\xb2\xcb\x5e\x76\xc5\xcb\x03\x7b\x79\x10\x2f\x47\x43\x42\xad\xa3\xa1\xc3\x5a\xb1\x1a\xd7\x19\xe6\x6f\xfd\xe0\xe1\xb7\x6b\x20\xb9\xa9\x4b\x10\x91\xd0\x23\x61\x51\x42\x22\x16\xb5\x03\x11\x7f\x2d\x90\x88\x86\x31\x53\x16\xab\xce\x36\xba\x57\x87\x2d\x59\x23\x79\x74\x8b\x67\x18\x05\xda\x5a\xbe\xb8\x26\x82\x6b\x87\x4b\xea\x30\x70\x91\x04\x4b\x45\x3a\x65\x1f\x0c\xcc\x00\x97\x70\x19\x19\x46\xe9\x6f\x2d\xa9\x8c\x4b\xc8\x5e\xcb\x54\xda\xcc\x54\x96\x60\xc7\x89\xe5\xc2\x61\x4f\xac\x45\xe8\x28\x94\xb3\x72\x78\x4f\x7f\x1d\x25\xf8\x75\x89\x11\x78\x49\x3a\xcb\x01\x23\x7d\x4e\x19\x92\xe2\xb3\xf7\x38\x90\x4f\x0f\xb1\x7c\xba\x1a\x02\x62\x4a\xad\xcf\xea\x6a\xf9\x2f\x29\xa1\xab\x7b\x33\xa8\x63\xaf\xae\x4d\x70\x58\x4f\x4f\x91\x1f\x3d\x93\xa2\xd6\x0c\xd4\xee\xbb\x91\x79\x20\x70\x05\xf2\x5a\x3e\x9c\xb7\x25\x84\xbd\x16\x7d\x66\x8f\x20\x72\x52\x46\x2d\x51\x1d\xbc\x97\x28\xa4\xcf\xd6\xc1\x31\x7d\x12\x80\xea\x95\x61\x44\x75\xd3\x47\x0e\x0a\x88\xef\xf0\xba\x02\x46\xf4\xf3\x00\x9c\x22\x63\xcd\xdf\xc8\xc8\x5a\x02\x8c\x15\x00\x8d\x15\x00\x2e\xb9\x70\x6d\x88\x74\x29\x55\x05\xf9\x61\x4e\xc9\xb7\xae\x09\xc8\x06\xb3\xe9\x84\x36\x7c\xfe\xc8\x6a\xf1\x31\x2d\x96\x35\xde\x57\x8d\xbe\x5d\x5f\x77\x89\xa7\xcf\x41\x28\xc6\xed\xb1\x47\x5e\x4f\x2a\x40\x0f\x57\x4d\x12\x00\x7e\x79\x83\x02\x83\x7d\x3f\x17\x62\x46\xeb\x92\x5a\x7e\x3c\x1c\x84\xd7\x74\xd0\x0e\x4d\x11\xe1\x77\x94\x77\x3e\xa9\xec\xc3\x7e\x7f\x38\x38\x1c\xf8\xe1\x74\x36\x9c\x1c\x71\xb0\x0a\x27\xab\x37\x31\xd6\x25\xb5\xa6\x33\x3a\x99\x69\xd9\xdf\x35\xad\xc7\xc1\xcf\xf2\x7f\x89\xa2\x69\x38\x7b\x1b\xdb\x5d\x52\x2b\x1c\x04\x99\x8e\x5c\x0d\xdf\xce\x9c\x56\x3b\x18\x6c\x48\xe1\x36\xc7\x3b\xa2\x93\xb0\x3a\x9c\x0f\x02\x3a\x79\x86\x0b\x8a\xa9\xc9\x4e\x96\x4a\x99\x10\xaf\xe2\x75\x5b\xbb\xbe\x6b\xdd\x7c\x3f\xbc\xfe\xfe\xcf\xf7\x2f\xff\xc0\x83\xbd\x9e\x7a\xdc\xa8\xd9\x7a\xf6\xe3\x46\x6d\x23\xb3\x48\x3b\x6e\xd4\x00\x99\x35\xad\xee\xf4\x68\x18\xc7\x74\x34\x0d\x83\xed\xe3\x69\x3d\x2c\x21\x04\xf9\xe9\xe2\x8d\x3c\x10\xdc\x69\xe5\xbc\xe4\x07\x33\xf6\x62\xf3\x47\x2f\xdd\xcb\x92\xc0\xa2\x97\xa6\xd7\xea\x1c\x32\x24\x46\x39\x60\xd0\xcb\x6c\xf8\x2e\x8b\x5f\x35\x1f\xc6\x31\xc0\xcf\x14\x64\x1d\x34\x08\x38\x34\x89\xc6\xd1\xca\x59\xac\xb7\x2b\xfb\x35\x17\x77\xc6\xe9\xe6\xef\x6c\xa0\x87\x4e\x1d\x07\x75\xe4\x74\x38\x32\xba\x5c\x43\x5e\x42\x75\x87\x53\xd2\xa0\x42\xd5\x61\x07\x03\xbd\xcc\xf0\xce\x52\x4d\x95\xb5\x97\x87\x9f\x30\x6d\x35\x97\x6e\x1e\x3a\xd3\x51\x57\xb7\xae\x39\x6b\xbe\x54\x82\x83\xe6\x23\xf1\x56\xf7\x66\x77\x0d\x8d\x3d\x6e\xa0\xb1\xef\x81\x6b\xf9\x93\x90\xce\x40\x12\x2d\xb6\x9c\xc3\x03\x05\x4b\xb4\xb6\xfb\x0c\xaa\x2d\x80\xbe\xe0\x14\xe1\x18\xc6\x30\x3c\xe8\x7c\xa1\xbc\x16\xbf\x50\xf8\x6f\x75\x02\x12\x30\x2e\xc3\x51\x7e\x34\x59\x7d\x02\x65\x86\xc8\x2f\x8a\xcb\xcc\x34\x32\x71\x88\x5e\x79\x6b\x81\xb8\x44\x5c\xad\x82\x24\x11\x1d\x60\x18\x0c\x39\xa2\x49\xe9\x77\xe3\xec\xc5\x35\x7b\xc7\x18\xd4\x8c\x66\x87\xf0\x0c\x38\x77\xa5\x90\x58\x93\x74\x05\x79\x13\xce\x24\x51\xb3\x85\xd0\xd9\x2b\x73\x4a\x67\xaf\xfc\xc6\xa9\xdd\xad\x4b\x20\x6a\x5d\x3e\xbb\x72\x59\x9a\x8f\x0c\xcc\xc2\x19\x3f\x0b\xc3\x19\x83\x39\x11\x62\x9a\x86\x0e\xa3\x21\x24\x49\xa3\x9f\xdf\xef\xd6\xf1\x9a\xd2\x42\x0f\x67\x7a\x5c\x06\xd6\x58\x97\x91\xf8\x24\xdb\x34\xc3\xeb\x4f\x9e\x6b\xfe\xbe\x53\xdc\xfd\x1d\x7f\x41\xec\x8c\x60\xc3\xdf\x63\x3c\x02\x62\xf3\x23\xe6\x64\xcf\x07\x87\xfe\x16\xc3\x1a\x83\xd9\x31\xd7\xdd\x35\x91\xe3\x11\xcf\xea\xcc\xfa\x31\x5b\x7b\x5e\x93\xf9\xef\xc9\xbf\x07\xc9\xbf\x27\xc9\xbf\x07\xa8\xf8\x7b\x1b\x4f\x43\xc4\x16\x49\x2a\x3a\x01\x38\x1b\x46\xe9\xb3\x97\xd1\x59\x0e\x67\x84\x07\x53\x76\xbc\xbf\x7d\x6b\x38\x9f\x85\x93\xb3\xef\xf5\xab\x37\xab\x54\x5e\x11\xa1\x1c\x90\xc5\x12\xae\x7c\xab\x3b\x18\x84\x13\xd6\x2b\x42\x2e\x8f\xa8\xe9\x6b\x27\x24\xd7\x53\x86\xd2\x8c\xed\x2d\x11\x22\xe8\x6d\x9f\x5c\xc9\x68\xfb\xbe\xc4\x17\xac\x63\xab\x6c\x4f\xf5\x38\xd4\x57\x92\xad\x48\x41\xd7\x83\xe3\xf1\x27\x77\x4d\xfc\x30\x8f\x90\xb4\x97\x79\x64\x2f\xb8\x47\xda\x6a\x36\x0b\x24\x4a\xe7\x01\xac\x5b\xe4\xdc\xf5\x18\xa9\x45\x19\xbd\xd4\x06\x7a\x09\x48\x28\xf5\x5e\x42\x36\xa3\xcd\x5a\xb7\x4b\xd7\x6c\xab\xc8\xa3\xbc\x9f\x11\x5a\x69\x70\xbd\x76\xb4\x09\x58\x4b\x12\xc5\x77\xf4\x38\xa4\xe2\xb2\xf4\x55\xcd\xdb\x57\x5c\x87\xc8\x97\xf5\x42\x2e\x08\xf9\xec\x31\x28\xe2\x19\xed\x06\xb2\xf4\xae\x28\xdd\x3b\x36\x73\x6b\x7f\x10\xdf\x77\x83\xb5\xda\x77\x83\xcd\x83\x33\x03\x5b\x19\xb0\x62\x68\x4f\x12\xe2\x72\x60\xa7\x81\x1a\x58\x69\xad\x72\xc6\x63\xbc\x5b\x3f\x69\xb7\xd7\xce\x50\xa9\x23\x86\xf6\x10\xac\x77\xbd\x77\x6c\x96\xf2\x86\x26\x87\xfe\xb0\x3e\xb4\x87\xe0\x97\x0e\xef\xd6\xe2\xd0\x35\x21\x0c\x7b\xe5\xe6\xc8\x3e\x3d\x42\xc5\xdb\xa3\x22\x3f\xbb\xf9\x3b\x1c\xb4\x29\x88\xf6\xea\x19\xd3\x53\x0a\x9c\x38\x08\x53\xfc\x24\x29\xf0\xdd\x20\x89\x78\x4d\x65\x84\x35\xa0\x0c\xbc\xf8\xbe\x5a\x37\xf2\x0a\x2a\xa1\x1d\xed\x85\x7b\x65\xdc\x13\x79\xda\x2e\x8e\x81\x2b\x88\x89\x5f\x37\x7b\x92\x94\x1f\xa0\x57\x1f\x44\xec\xf3\x50\xdc\x07\xc4\x8c\x7d\x48\x81\x1a\xa2\x7b\x47\xac\x04\x0f\x7f\x45\x38\x3c\x8f\x00\xbe\xd9\x99\xbc\xcb\xb9\x25\xd2\x96\x68\x1d\xce\x8b\x6e\x64\xc6\x8c\xba\xa7\x6a\x5d\xc4\x60\x7b\x48\x65\xa0\x2c\x43\x8c\x84\x15\x09\x6f\x22\xa8\x40\x8d\x6d\x9b\xd7\x59\x2c\x67\xc3\xa7\xa6\x95\xc0\x75\x9a\xea\x0a\x70\x2b\x9f\xc5\x2b\xe3\x70\x36\x5b\x4d\x23\x30\xbf\x6b\x5a\xbd\xe3\x5c\x46\x8a\x1d\x8c\x38\x20\xa0\x36\x58\x51\x60\x6a\xab\x23\x5c\x9e\x9e\x70\xda\xa5\x98\x85\x1d\x86\x0c\xb3\x84\x70\xea\xb1\x65\x01\xd9\x13\x6e\x13\xbf\x52\xb2\x43\x2e\xd1\x69\x1b\x46\xfb\x73\xe8\xb4\x8b\x24\x92\xee\xa3\x83\x56\x9b\xcb\xce\x60\xf0\x4a\x84\xa8\x43\x12\x5d\x83\x24\xf9\x8e\x61\x11\x19\xb9\xa3\x20\xa4\xd2\xb6\xdb\xc5\xb2\x18\xe6\x5e\x99\x90\x76\xa5\x64\xb7\x57\x61\xf6\x60\x71\x22\x86\xd1\x02\xe4\x84\xd6\x34\x9c\x1d\x0f\x02\xa0\x30\x4d\xbf\xb2\x18\x52\xfb\x68\x04\x8e\x9d\x43\x12\xb2\x33\x89\xc1\x95\xaa\x1c\xa2\xdd\x87\x76\xa8\xd1\x27\x97\x3c\xd2\xbf\xc8\x22\x79\xa5\x0a\x6d\x79\x81\x6b\xd3\x14\xcf\xaf\x7e\x46\x5a\xae\x8d\xbb\x3a\x12\x32\x9c\x4b\x4e\x97\xbe\x49\x6a\x76\x03\x77\x9d\xd0\x4c\xe9\xbd\x98\x8d\x98\x1d\xc6\x3f\xa1\x08\x1d\x19\xc7\x33\x45\x9d\x78\x1d\xd9\xd9\x0a\xf9\x66\x38\x79\x0d\x67\xe8\x74\x65\xbc\x41\x57\xc6\x9c\xae\x8c\x37\xe9\x4a\xd0\x2a\xf0\xf2\xc9\x41\x47\xc1\x9e\x98\x23\xf6\x5d\xdc\xa2\x30\x52\x52\xa4\xb2\xbc\x49\xa2\x51\x95\x6b\x04\x27\x1c\xa5\xd6\x84\x91\x80\x47\xc3\xf9\x60\x66\x18\xb9\x84\xb3\xea\x7e\x7f\xa3\xfb\x7d\xde\xfd\x3e\x74\x7f\x3b\x26\x3c\xef\x99\x8b\x09\xaa\xf4\x19\x51\x3c\x18\x64\xe4\x79\x42\x00\xfd\xbf\x66\x72\x32\xbc\x4c\x6e\x76\xc6\xfd\xe4\x33\x39\xfd\x7c\xaa\x3e\x8f\xb3\xf0\x2a\x94\xed\x90\x2a\x9d\x86\x87\x83\xe0\x78\x39\x63\x64\x55\xce\xdc\xe2\xbc\x65\xb3\xb7\x95\xfd\xcf\x84\x17\x20\x1b\x61\xe8\xf1\xb0\x67\x18\x85\x8b\x9e\xf9\x97\xf2\x90\x2a\xe8\x55\xa0\xfa\x31\xd0\xfb\xc8\xf9\x0f\xe5\x10\x0c\x96\x03\xc7\xe3\x72\xc0\x9f\x88\x22\xd8\xce\x60\x79\x1f\xe0\xf8\xc9\x11\x47\x38\x1e\x23\xc8\x28\x17\x4a\x40\xd5\x50\x86\xa7\x82\x84\x02\x1a\xfa\xd6\x35\x59\x92\x92\x53\xb0\x0a\xd9\x87\x62\xd9\xa1\xd2\xe2\x9b\x92\xe3\x5e\x85\x8d\xaf\x5f\x37\x41\x38\x83\xec\x2a\x4f\xe8\xa8\x84\x17\x9e\x10\xab\x04\xb8\x1e\x97\x6f\x39\xaa\x4b\x30\x31\xea\x7e\x3d\x36\x29\x4a\x12\x89\xb2\xb4\x19\x1f\x80\xb4\xed\xde\x1c\xd4\xf1\x2e\xdc\xb6\x0e\x04\x87\x71\xb2\xd8\xe4\x30\x76\x83\x4d\x5e\xe3\x41\x3d\x1d\x0d\x49\xe1\x2d\x6e\x63\x50\x77\x28\xab\x16\x56\xfe\x64\x21\x83\xcb\x2e\xc4\x4d\xea\x1a\x97\xb1\xab\x30\x51\x96\xe5\xa0\x0a\x47\x3d\xb0\x97\xa3\x21\x11\x82\x45\x9d\x19\x69\x5a\x5e\xee\x1d\xc0\x54\xa7\x46\x86\x29\x03\x09\x87\x92\xe9\x11\xd6\x3f\xc4\x9d\x22\x02\xbd\x26\x75\xfd\x00\x76\xe1\xdc\x67\xa0\x1b\x12\x0a\x90\xeb\xe4\x00\x6a\x44\x3c\x76\x0c\xe2\x1e\x09\x70\x4c\x42\x3c\x60\x73\x52\x26\x24\x12\x72\xf2\x36\x89\x24\x79\x32\x20\x85\x36\x8e\x48\x3b\x49\x22\x06\x80\x49\x12\xe1\x36\x29\x49\x47\xf5\x40\x86\x3b\x6d\xc3\x18\x49\xc6\x90\xbb\x9b\x8f\x08\xe9\x19\x46\x9b\x90\x18\x8d\x38\xff\x28\x2f\xea\x07\x2c\xaf\x60\x62\xa1\x5d\x5c\x26\xa4\x27\xda\xed\x11\xb3\x4d\x7a\xd0\x74\xec\xa2\x24\xe9\xf1\x26\x7b\x22\x36\x7e\xa1\x8d\x30\x1c\x94\x3d\x84\x23\x5e\xc9\x00\xe1\xd8\x30\x22\xc9\x76\xc5\x08\x8f\x32\x27\xe8\x62\x08\x67\x67\x2c\x77\xe6\x88\xed\x4a\x0f\x21\x27\x86\xcd\xe0\xc4\x6c\x09\x7d\x27\xe6\x3b\x29\x66\xcb\x16\x3a\x1e\x89\xc5\x8e\xd1\x60\xbe\x5d\x37\xe5\xfd\x86\x0e\xf9\x99\xe4\x14\xfe\x33\xc9\x62\x17\xe8\x69\x0e\x5f\x46\xe2\xa5\xfc\xc5\x06\x6f\x2a\xbe\x0c\x39\xf1\x8d\x80\x0e\x7d\x5b\xc2\x96\xe1\x46\x54\x39\x71\x7f\xb4\x45\xd4\xa6\x45\x81\xde\x0d\x2a\xe2\xd7\x96\xa7\xa8\xaa\x84\x01\xd7\xcf\x2e\x1c\x34\x8e\x41\x95\x03\x02\x6d\xab\x38\x4e\x6b\xfc\x21\x90\x77\x31\xb6\x3c\xe4\x55\x25\x0c\x8e\x59\x1d\xb9\x57\x6a\x3b\x62\x6b\xb1\x0c\x5b\x44\xf1\xd4\xf2\xfc\x54\x0f\xd6\x07\x47\x5d\xaa\xf2\x6f\x35\x73\x28\xa4\xdd\xb6\x4f\x48\xbf\x43\x2b\x8c\xab\xb7\x82\x7d\x13\x61\xd3\xab\xdc\x76\xed\x66\x17\x99\x7e\xde\x4d\x29\x34\xad\x4b\xd5\xa1\xd5\x15\x8f\x0a\x0e\x46\x10\x3f\x95\xe0\xc9\x7e\x70\xc2\x1e\xf8\xa9\x5c\xd2\x4a\xf5\xf7\x74\xc1\x27\xe3\xff\x46\x24\xbf\x4e\xa4\xa9\xee\x30\x2a\x4d\xcc\x2c\xa3\xa1\x36\x68\x35\x21\x28\x59\x04\xd4\x44\x95\x02\xb5\x85\x1c\x4c\x47\x99\xff\x97\x64\x9c\xba\xf7\x29\x94\x75\x8a\x8e\x5f\x5d\xbe\x52\x02\x87\xb2\x93\x9e\xc2\x83\xba\xe3\xb1\x0d\x46\x1d\x4f\xe0\xfc\x4d\x29\x7b\x9d\x0b\x23\xb8\x98\x9d\x5b\x87\xfb\x92\x70\x0f\x3e\x7b\xdc\xc2\x5f\x17\xcd\x19\x86\x07\x36\xf5\xfc\x5a\xb2\xe5\xb9\x88\x92\x10\x7b\xa4\xa4\x64\x6a\xa3\x18\x0c\xf4\xa4\x42\x61\x49\x94\x16\x17\x90\x01\x2f\xad\x6e\x1f\x7d\x12\xe2\x20\x5b\xda\xc7\x8a\x79\x48\xfb\x5c\xfa\x6c\x4e\x42\x0a\x35\x27\x89\xb7\x17\xe8\xd4\xc8\x08\xce\xc6\x76\xd7\x1c\xd5\x91\x33\x02\x4a\xea\x78\x01\x6a\x88\x32\xc7\x58\x3f\x64\xc3\xa8\x68\x52\x96\xa3\x58\x44\x20\x11\x3e\xf8\xa8\xd7\x36\x81\xbc\xdf\x67\x6b\x57\xe8\x3f\x08\x4d\x92\x9b\x9e\x14\x0e\x8c\xc6\xa4\x71\x24\x15\x0a\x7d\x4d\x97\xa8\xe6\x49\x7f\x31\xd6\x58\x4b\x7e\x99\x0b\x43\x7f\x41\x38\x0f\x04\xd5\x2c\x96\xf7\x5e\xfc\x2e\x75\xb5\xa4\x8b\x4f\x6c\xa9\xef\xcd\x49\x1d\x7f\x9f\x21\x67\x02\x23\xbb\x99\x52\x32\xaa\x5b\xb7\x9e\x38\xf6\x1a\x47\x94\x17\x51\x03\xf8\x22\x05\x4c\xc2\x2c\x83\x0a\x9b\x8c\xb2\x2d\xd7\xbf\xd2\x3e\xb1\xc7\x27\xdc\x5a\x62\x3f\x4d\xed\x9e\xda\xed\x4b\x9e\xfa\x21\x4d\x7d\x1e\x53\x3b\x9a\x51\x9e\xfe\x67\x9a\xfe\x75\x6a\x3f\x56\x45\x72\xf9\x63\x9a\xfe\x38\xa5\x76\x57\x7e\x38\xd0\xaa\xbf\x6c\xdb\x57\x35\x9e\xfc\x51\xab\xbf\x7d\x6e\x1f\x1d\xaf\x94\xde\xdc\xb9\x30\x21\x65\xa4\xf8\x70\x10\x0e\xc0\x7c\x76\x16\xbe\x47\xce\xaa\x49\x60\x0a\x9c\xda\x32\xf7\x56\x47\xac\x85\x44\xc1\x5d\x9f\x8c\x05\x1a\xb8\x99\x52\x24\xf4\x34\xbc\xe5\xe6\xf5\xeb\x7d\x20\x36\xec\x7d\x60\x3d\x0c\x0c\xc3\x0c\xc4\x2d\x00\xbc\x63\x51\x1b\xc2\x61\x26\x99\x0a\x14\xa7\x60\x80\x02\x4a\xda\x86\x9d\xc7\xec\xeb\xcd\x2c\xcf\x3e\x9d\x7f\xe7\xb8\xff\x87\x75\x33\x93\xca\xbd\x63\x04\x61\x1c\xe1\x12\xfb\xcf\xad\x05\x59\x7e\xc0\x86\x33\x7f\x43\x36\xf7\x32\x97\xb3\xf1\x32\x07\x9c\x70\xbb\x90\x6a\xf5\x7a\x15\x2f\x73\x0d\xfe\xa7\xf5\xd4\x81\x8f\x72\x9b\xb6\xd3\x37\xaf\x46\x5c\x59\xd8\x63\x3c\x1a\x9b\x32\x6a\x75\x7d\xfe\x6c\x3d\x55\x4d\xf6\x86\xf8\x6b\x61\xbd\x14\x4b\x24\x9e\x33\x61\xcc\xd7\xf9\x21\xdb\x58\x70\x46\x34\xad\x76\x38\xfb\x0a\xe2\xe1\x6d\xb3\x76\xcf\xc5\x6b\xe7\x87\xeb\x46\xdb\xeb\x0b\x57\x20\x34\x35\xbb\xae\x87\xb3\xce\x90\xab\x5a\x4e\xe7\xa3\xd1\x70\x32\x0b\x83\xf7\x48\x6f\x7f\x26\xaf\xca\x9b\x56\x77\xeb\x92\xfd\x00\x8a\x61\x63\x52\xc7\x7c\xab\xfe\x10\x5e\x5a\x58\xa6\xa3\x4d\xa0\x3a\x7f\x11\xcb\x72\xfe\xb2\x79\x55\x23\x30\x85\xea\xf1\xf1\x91\x74\xc3\x25\x14\xb7\x18\x51\x4b\x2b\x14\x82\x65\xf0\x0f\xd8\xe3\xfa\x97\x82\x59\xfd\x01\x9a\x2e\xd2\xa1\x8b\x00\x17\x47\xcd\x4a\x41\x02\x6a\x4d\x5c\x0a\x59\x27\x9e\x38\x5a\xeb\x1b\x06\xf0\x79\xbd\x61\xab\x2f\x26\xf7\xa1\x63\x2a\x8d\x4a\x86\x92\x4a\x8e\x76\x99\x23\x90\xa3\xc8\xca\x7b\x45\x40\x50\x25\xb0\xe6\x0d\x67\x01\xe1\xed\x38\x52\x25\xa0\x3b\xa9\xd3\x3d\x7d\xe7\x4b\x57\x7b\xb3\xe1\x4e\xc0\x9d\xa0\xc2\xee\x67\x94\x57\x27\x47\x9d\xa8\xc4\xbe\x1c\x47\x9b\x2b\x30\xe6\x3b\xf2\xc4\xdb\x58\x41\x86\xa3\x4b\xce\x4c\x88\x74\xf5\x82\x05\x6a\xd5\x00\xc0\xa9\x09\xc0\x0c\xdd\x84\x65\x3c\x0b\x33\xd5\xe4\x94\x95\x45\xcf\x42\x90\xed\x88\x9d\x25\x66\xe6\x65\x6e\xf5\x7d\x79\x78\xc0\x19\xb1\xda\x50\xcc\x14\xdf\x44\x09\x56\x4d\x5a\x89\xdc\xc5\xd6\x83\xa9\xe2\x7c\x88\x24\x94\x3b\x12\xca\x72\xae\x90\x53\x10\xeb\x26\x6a\x1d\x1b\x46\x2f\x5e\x87\x17\x75\xf6\xe8\xf0\xad\x1d\x51\xdc\x4b\x14\xdb\x3d\xd5\x54\x99\x25\xc5\x18\x73\xfd\x74\xa5\xd6\x32\x5e\x35\xad\x05\xcd\x8b\xec\xda\x7b\x96\xb8\x6d\xd0\x36\xb9\x72\xc5\xbb\xa6\xd5\x7b\xde\x90\xda\x80\x14\x96\x4d\x85\xe9\x27\x49\x41\x02\xe8\x3a\x84\x96\xfe\xf6\x92\xc4\xfb\x5b\x55\x98\x62\x80\xa3\x4e\x37\xd6\xcf\x90\xee\x20\x08\x97\x3b\xc3\xf9\x6c\x67\x18\x09\xef\x04\xef\xa5\x0c\x6b\x20\xa7\x46\x51\xef\x0f\x10\x29\x42\x8e\x5e\xd8\xab\xd3\xd6\xf5\xd2\x95\x82\x2d\x15\x50\xb0\x35\x39\x74\x4d\x55\x53\x2b\x70\x09\x75\xc2\x47\x31\xc1\x01\x96\x46\xfb\xf2\xe8\x60\xe7\x06\x2f\x82\x29\x72\x00\xd5\x72\x1a\xc3\xd7\xca\x60\x8f\xa1\x4c\x05\x08\x00\x55\x7a\xe3\x15\xa9\x53\x79\x4f\x4d\x84\x79\x44\x2f\x80\x58\xec\x0b\xa2\x4c\xa0\x0a\x64\xfb\x82\xf0\xd4\xf0\x8a\xbc\xd1\x7b\x8a\x4c\xaf\x58\x46\x98\x32\x54\x95\x56\xe7\x55\x3c\x6b\x6c\x8b\xe2\xaa\x7d\xb5\x2f\xc6\xf0\xa7\xf5\x18\xba\x86\xc1\x68\x42\xfe\x2c\xf4\xd6\x04\x92\x69\x5a\xf7\x6f\x1d\x83\xef\x9a\x56\x27\xb3\x91\xb9\xef\x0f\x41\x56\x49\x50\x1f\x8d\xc9\x5d\x2c\x51\x93\x90\x79\xaf\xa3\xbe\xb5\x63\x6c\x04\x67\xec\xe8\xe9\x57\xf0\x9b\x6c\x03\x50\xc4\xa0\xbd\xb5\xbb\x82\x25\x1b\x07\xad\x0b\xd7\x06\x54\xf3\x54\xcd\xad\x9f\x81\x51\xd6\xc6\xe6\x61\xe0\x50\x62\x42\x34\x21\xaf\xe2\xb5\xa8\x2b\x15\xc3\xf9\xea\x48\x99\x92\xe6\x82\x6d\x07\x7a\xf3\x14\x6d\x27\x12\xd2\xee\x50\xb1\xc8\x82\x44\x50\x9b\x71\xa6\xee\x6e\xa8\x35\x0e\x0c\xe3\xc1\x64\xbf\x90\xa2\xf9\xc8\xab\x67\x54\x9e\x78\x4e\xaf\xf2\xad\x2b\x32\x23\x7b\xaf\xcc\xb8\x71\x2e\x7d\x84\xcd\xb4\x79\x88\x51\xc9\x5b\x0e\xbb\x26\x45\x15\x6a\xcb\xcd\x20\xf8\xa2\xa7\xaa\xc9\xe3\xcf\x50\x8d\xa4\x7a\x18\x60\x46\x49\xe9\x3b\x04\x7b\x60\xae\xc6\xf0\x1d\xa6\x02\x41\x51\x6b\x8c\x10\x86\xfd\xc1\x41\x71\x05\xde\x61\xd7\x37\xb8\x70\xdb\xd8\x1d\xec\xf0\x5b\xe6\x74\xc7\xbf\xd7\xdd\x92\xaa\x71\x7f\x95\xa4\xb1\x52\xf3\x05\x37\x54\x6c\x2f\x94\x10\x27\x49\x1a\x7e\x66\xf6\x53\x27\x78\xd2\x0b\x15\x9b\xaa\x52\x81\xa4\x60\xe1\x20\xaf\x75\xe4\x9a\x5f\xe5\x45\xb0\x26\xe7\xf3\xb4\xb6\x9f\xea\xca\x2b\xdc\xf7\x65\x1a\x3e\x96\xbd\x80\x27\xbc\x8b\x40\xdd\x6a\xc0\x84\xb2\x4d\x7f\xe5\xb9\xe6\xef\xff\xbe\x29\xfe\xde\x46\x49\xa2\xbb\xc2\xfc\x26\x07\xd2\xf7\x38\x2d\xa5\xbe\x2c\xd7\x96\x96\xd5\x5f\x81\xbf\xad\x6b\xdf\x35\x3d\x64\xef\x76\xcd\x27\xa9\xdb\xa6\x8a\x3d\x8b\x62\x5a\x7e\x8b\x06\x01\xcb\x2f\x6a\x4c\x12\x68\x0b\x3a\x5a\x34\x4b\x9f\xe1\xa1\x75\xe1\x56\xa6\x61\xd1\xb3\x3d\xa4\x55\xf6\xa2\x91\x90\x30\xd8\x07\xd3\x4b\x0f\x27\x0f\xbd\x8a\xd6\x56\x42\x89\x83\x83\xd1\xeb\xca\x79\x10\x3d\xd3\x57\xc0\x6f\x51\x97\x14\x4a\x2b\xe4\x64\x6a\xc9\x7c\x81\x9e\x7d\x41\xd9\x70\x59\x3e\xda\xde\xe1\xc0\x0e\xb2\x3e\xe6\x0e\xd7\xbb\xcc\xa7\xec\x9b\x07\xee\x3c\x61\xab\x8a\x79\x30\x0c\xa8\xf6\xa6\x9b\xd3\x57\x39\xe9\x05\xe2\xad\x90\x8c\x2a\xa3\x4d\x4c\x35\x33\xcb\xeb\xb3\x72\x28\x67\xc5\xfe\x59\x0b\x85\xdd\xae\xe9\x81\x36\x52\x4e\x23\x47\xe9\xed\x6d\x45\x4c\xb4\x2d\xab\x4e\xc1\xb1\xa6\x72\xe9\xac\xee\xee\x48\x19\x57\x00\x80\x77\xe8\x20\x88\x43\x46\xcf\x09\x5e\xf7\x74\x9f\xf8\x49\xc2\x58\x89\xf3\xd8\xec\x52\x2c\xff\x97\xf4\x6b\xa4\x93\x85\xa7\x19\x9e\xc3\x59\xcc\x52\xc5\x76\xeb\x14\x39\x57\xc2\xd7\xcc\xed\xb3\x8b\x5b\xfe\x25\x3e\x9d\x0a\x63\x88\xc3\x5d\x5c\x28\xf3\x83\x71\x75\x6f\xd6\x38\xfb\xcb\xd6\xf5\xb8\x4e\x0e\x7b\x49\x52\xed\x19\xc6\x79\xcf\x7c\x5f\xb6\xfe\xb2\x0e\xde\x23\xa7\x49\x6a\xc0\x18\xfe\x18\x99\x4d\x5c\x42\xce\xad\xf8\x7d\x12\xbf\x4b\xf1\xdb\xb4\x8e\xe7\xa0\x53\x1c\xc7\xf0\x73\xc4\xdf\xa2\x29\xfc\xcc\xda\x8c\x2a\x6c\x5a\xdd\x31\xe3\xe0\x9b\xd6\x94\x52\x48\x5f\x7e\xe1\xea\xc8\x7d\xca\xd3\x3b\xcf\xfc\x77\x32\xdf\xa4\x39\x3b\xcf\xfc\x44\x99\x6d\x55\x1d\x3c\xd5\xd6\xe0\x44\x82\x03\x9b\x56\x2f\x77\x5a\x57\x4d\xeb\x8a\x6e\xb6\x33\x6b\xb3\x76\xd6\x09\xc8\x5a\x96\x44\x73\xbe\xfe\xc2\x04\x8b\x95\xe2\xd4\xe9\x71\x5d\xd2\x42\x91\x35\x09\xe3\x90\x4e\xc3\x23\x3a\x9a\xcd\x27\x8c\x16\x95\xb0\xc1\x4d\x75\x74\xf0\x90\x5c\xaa\x77\xae\xf7\xc6\xef\xca\x93\x1c\x49\xc2\x2a\x3d\xd4\xc1\x3d\xe8\xe6\xf1\xfd\xae\x69\x1d\xee\xe6\x58\x51\xd0\xd6\x99\x4b\xc8\xe9\x34\xf5\x99\x39\x6b\x0b\x92\xa6\x3b\x4e\x12\x46\xa1\x1c\xcd\xb8\xeb\xad\xee\xb4\x15\x8d\x5d\xb3\x3e\xa3\x02\xbb\x9c\xd6\xa5\x99\xab\x20\x32\xa6\x14\x82\xfb\xa9\xac\x6c\xda\xcf\xea\xe6\x21\xb7\xed\xc2\xb4\x55\x0b\x5c\x4c\x5b\xc7\xec\x2f\x42\xc2\x37\xd2\x98\x14\x4a\x98\xb6\x42\xf0\x78\x0d\xf8\x80\xf7\x5d\xaa\xd4\xf1\x0f\xda\xf1\x3f\x8e\xb0\x4f\xbc\x56\x1b\x3c\x41\x15\x8e\xeb\x6a\xa2\x4d\x0f\xb7\xee\x0f\x29\xfe\x7a\x26\x56\x63\x58\xc7\x01\xca\x7c\xbe\x3b\xa4\xf8\x9b\xfc\xdc\xbb\x66\x9f\x8f\xeb\x15\xd3\xb7\xa6\xe1\x4c\x2e\x48\x41\x68\xc1\x40\x19\x1f\x1f\x3d\x51\x99\x5d\x12\x6e\x50\x59\x6c\x7a\x08\x5f\xd5\xd4\x37\xe7\xb0\x27\xf9\xba\xbe\xe4\xf0\x78\xab\xc7\x33\x8a\x9f\x67\x52\xe9\x71\xa0\x7f\x94\x49\x98\x0a\xfb\xb7\xdd\x3e\x18\x85\xfd\x18\x69\x3b\xfa\x78\x4e\x60\xea\x60\xff\xa5\xc9\x71\x4c\x60\x2e\x61\x3b\x8a\x09\x3e\xf7\x5c\xd8\x95\xe2\xf5\x92\xbd\x72\x6b\xe1\xa3\x39\x11\x1b\xa9\xd2\x13\x07\x2a\x80\x8a\x2d\x9f\x5a\x37\x81\x38\x88\xa3\x29\x51\x89\xf7\xbe\x48\x7c\x2c\x91\xe3\xd8\xbc\x91\x6a\x9c\x91\x64\x3d\x97\x5f\xc8\xa2\x6b\x22\x30\x33\xec\xe5\xa8\xe0\xff\xca\x06\x90\xa4\x5e\x77\x8c\x04\x50\x29\xd0\x28\x8b\x95\xbf\x96\x44\x80\x18\x0c\xc2\x3e\xb9\xc9\xa4\x45\x62\xcb\xe9\x90\x37\x3d\xc9\x81\x3c\x40\xce\x9a\x75\x93\x82\x6a\x0d\x81\x9c\xd6\xb3\x5b\xc4\xf1\x08\xf1\x2f\x93\xc4\x23\xe4\xfe\x90\x56\x68\xeb\xd2\x67\xe4\xcd\x37\xda\x3a\xf3\xdc\x56\x89\xd5\x7d\x33\x76\x91\xed\x15\xc8\xdd\x21\x35\x0c\xaf\x40\x9a\x87\x34\x49\xd2\x8c\x96\xf0\x6d\xff\x7d\x38\xf7\x3b\xe1\x34\x2d\xc3\xc8\xc1\x61\x3d\x97\xf4\x9d\xb5\xe5\x7c\x68\x3e\xab\xac\xce\xb3\x98\x4a\xef\xdc\x44\xdc\x64\xe9\x37\x13\x46\xc8\x3d\x55\x31\x48\x01\x6d\xc2\x63\x99\x72\x1c\xb8\x0a\xa2\xd6\x20\xe9\x97\x20\x48\xe1\x06\xb6\x40\x9a\x4f\xb8\xe3\xb9\x6a\x11\x0b\xf1\x7a\x1c\xa7\x4d\x76\x23\x33\xf8\x2d\x28\x86\xbf\x85\x7f\xff\xef\xd0\x03\x47\x37\xf0\x3e\xe8\x09\xec\xd4\xbb\x4e\x3d\x56\xac\x56\x3e\xf9\x2e\x81\x01\xdc\x1a\x78\xc4\xb7\x96\x8e\x4f\x7c\xeb\x59\xc2\x92\xb0\x48\xd1\x1a\x3e\xae\x6d\x85\x0e\xc3\x30\x7f\x28\xb2\x13\x92\x24\x8a\x62\x90\x9e\x52\x37\xdf\xa5\x98\x5f\xce\x0b\xdf\x23\x94\x6f\x10\xaf\x48\x02\x70\x9b\xf4\x58\x62\xbd\x61\x6f\xcf\xfc\xed\xd9\x61\x3f\x04\x2e\x70\xe7\x45\xe2\x39\xd4\x8a\xa6\x45\xe2\x3b\x1c\xd2\x29\x66\xe9\x8c\xe0\xbf\x11\x6f\x51\x6a\x2c\xc2\x7a\x7f\xd9\xe3\x64\x4a\x93\x21\x8c\x1c\xb4\xae\x66\x03\x4c\x8d\x7f\x8c\xa4\x67\x3e\xb9\xf6\xe2\x15\xd6\x5e\x1f\xa8\xb5\xc4\xe0\xde\x28\xdd\x09\x3f\xf4\x8b\x0c\x6a\x9d\x2c\xb9\x45\x00\xd5\x27\xb2\x77\xc2\xca\xc2\x2c\x7a\x30\x8b\xd2\x9a\x5b\xd5\x72\x2d\xc9\x6a\x79\x69\x76\xba\x8f\x03\x12\x51\xd3\x6f\x9d\xba\x88\xbb\xc1\x65\x8f\xd8\xe7\x89\x13\x17\x55\x4a\x36\xfb\x55\xce\xb4\x20\x20\x0a\xbf\xd4\x0b\x2a\x41\xd1\xb7\x03\x8a\x79\xb4\x14\x95\x68\xef\x05\xac\x11\xdd\x19\xca\xcd\xd6\x86\xad\xd9\x70\x24\x5b\x66\xcf\xb2\xe9\x43\xd1\xf4\xe1\x7f\xd7\x74\xd3\x3a\x59\xe6\x49\x68\xb2\xbb\xf6\x7b\x8a\x81\x5b\x4b\x17\xd3\xe2\x0f\x64\x3f\x6c\xa6\x39\x5a\x02\xf8\xa8\xf6\x8a\x3f\xb4\xb5\x39\xd3\x2c\xe3\x70\x84\xdb\xe8\x75\x39\xd3\xdd\x48\xcb\x3d\xef\xa7\xfb\x5d\x9e\x87\x7e\x9f\x92\xd0\x79\x90\x2a\xb6\x5d\x33\x42\x95\xc8\xf6\x00\xea\x38\xee\x19\x8e\x88\xdf\x35\xdb\xa8\xd2\xb6\x3d\x2b\x12\xd6\xdd\x83\x7f\x40\x15\xfd\xac\x8e\x97\x33\xfd\xaa\x2c\xff\x6a\x67\x4c\xa8\x43\xc9\x61\xaf\x32\x99\xda\x57\x35\xa1\xc4\xdb\xa7\xe4\x4a\xea\xc6\xe0\xc3\x5e\x65\x3c\xb5\x2f\xdb\x7c\x23\x16\x0e\xa5\x87\x9c\x28\x93\x8b\xa6\x9f\x57\xf7\xe6\x39\x27\x5b\xcf\x46\xe6\x39\x23\x4e\x73\xec\x0d\x18\x58\x1e\xce\x00\xed\x22\xc7\xf7\xd8\x56\x01\x32\x67\x3c\x65\x18\x99\x3d\x5d\xb6\x59\xbb\x13\xfd\xc8\x00\xae\x09\x6a\xcc\xd2\x7e\xe7\x6b\xb4\xdf\x37\xd1\xad\xb0\x4f\xd3\x17\xf0\x17\xae\x4b\x0f\xc7\xba\xbd\xa3\xe4\x1c\xeb\x69\x38\x0b\x31\xce\xf3\x01\x25\x85\x82\x60\x01\x76\xab\x9c\xe0\xbb\x37\x2f\xea\x78\x52\x67\xe4\xf7\x85\x50\x46\x19\xdf\x49\x25\x93\x30\xe4\x44\xf2\x51\xac\x52\x1e\xe5\x53\x67\x28\x9f\x6e\xff\xe1\xb9\xfc\x3c\x79\x51\x3c\x06\x52\xfa\x2e\xcf\xdc\x93\x1f\xaf\xf1\x86\x80\xfe\x82\xcd\xc2\x63\x3a\x0b\x9a\x3e\x3b\x08\xb7\x48\x4d\x10\xa5\x3e\x35\x11\x52\x0e\xcc\x04\xc3\xea\xcc\x63\x13\x5c\xff\x3a\x9d\x3e\x7b\x28\x23\xe7\x56\x60\x1d\xe4\x34\xe5\x93\x36\x65\xb7\xfc\xee\x15\xa4\x95\xe7\x8c\x62\x2a\x50\x2b\x7c\x94\xca\x2a\x1e\xa1\x56\x97\x9a\xc8\x7a\x34\x27\xa7\xf8\x35\x9a\xd0\x7e\xe8\x0d\x27\x41\x38\xb1\x4b\x78\x3a\x7b\x8e\x43\xfb\x65\x42\xf1\x74\xe2\xdb\xcd\x05\x5d\x81\x36\xff\x23\xf1\x80\x9b\xb5\xc2\x47\x4c\xa1\x97\xc5\x0e\x5b\x34\xd6\x21\x96\xc6\xfa\xd4\x16\xcf\x25\xb4\xa2\xd6\x51\x9c\x24\x26\xfb\x49\x1b\xfb\xaa\x97\xc4\x50\xf2\x08\x82\x26\xe8\x18\xa7\x29\xae\x8d\xad\xce\x10\x2a\xe8\x0c\x45\x05\x70\xad\xf1\x6d\x2a\x0a\x76\x86\xac\x20\x66\x13\x03\xcf\x25\x84\xab\x14\x9e\x85\x63\x7a\x86\x4a\x7a\x94\x6e\xc8\xb1\x61\x69\xd7\x85\xf6\x29\x03\x5b\xa0\xc2\xce\x95\x90\x45\x94\x23\xc1\x87\x85\x3c\x8e\x74\x34\x41\xb7\x2f\x9e\x5a\x60\x9a\xbb\x62\x6c\xf6\x54\x96\x42\x19\x6d\xb9\x16\x08\x1f\x0d\xa3\x2b\x64\x8e\xe1\x23\x96\x25\x90\x23\x13\x8f\x62\x2d\x11\x7a\x78\xe2\xa5\xb0\xf6\x28\x72\x75\x86\x5a\x2e\xbe\xcb\xee\x60\xaf\x9f\x8b\x8e\xc2\x32\x81\xa1\xb2\xc0\x61\xbe\x89\x24\x91\x3d\xbe\xc3\x63\x41\x29\x7e\x65\x5c\xf5\xa5\x10\xed\x43\xaf\xdf\x6d\x5c\x43\xb0\x7c\xd7\x52\xf1\xb2\xd5\x78\xe6\x96\x31\x4f\x12\x25\xdd\x89\x6e\x9e\x85\x69\x37\x7b\x6a\x84\xe9\xf3\x51\x9c\x3e\x77\x86\x68\xe5\x5c\x6c\xe8\x3a\x08\x89\x57\x18\x4a\x01\xed\xd1\x52\x9c\x14\x47\xcb\x56\x73\xac\xac\x52\xc2\x23\x91\x1c\x1e\xe9\xc9\x3d\x99\xbb\x97\xc9\x7d\x5e\x15\xc9\xe7\x55\x3d\xb9\xe6\x19\x86\x1c\x39\x45\x98\x8a\xbb\xd1\x7d\xa9\xf3\x5c\xab\x71\x1b\xbd\x54\xe5\x37\x15\xdf\x00\x3f\xfd\x52\x03\xa0\x7e\xa9\x81\xf4\x5e\x8f\x41\xd2\x05\x39\x39\xf1\xad\xbb\xc8\xf4\x53\x49\x32\x28\x21\x04\x9f\xb9\xf5\x85\xd4\x57\x0f\xb9\xe5\x45\x08\x72\xee\x24\x69\x5c\x99\x21\xbe\x69\x33\x6e\xb6\xce\x1f\x61\x3f\xb0\x66\x5a\x47\xae\x19\x32\xa2\x4b\xea\x31\xb0\x44\x2e\x3d\xe4\x15\x43\x26\x51\x37\x3c\x07\x2e\xc4\xb3\x9f\xd7\xd8\xb6\x7f\xa9\x71\x94\xca\x88\xec\xab\x2f\x1b\x8e\x6f\xc4\x42\x1f\x2d\xa5\xa9\x55\x6f\x29\x5d\x27\x87\x47\x44\xb8\x2a\x3a\xaf\x12\xb0\x06\xf8\xb1\x9f\x67\x8a\xc0\x8e\x8e\xd3\x1a\x42\xaf\xd2\x5e\x9b\xa1\xf1\x2c\x34\xb6\xc6\x9e\x2b\xb4\xef\x29\x7a\x5d\xc1\xc7\xc3\x7b\x75\xb9\xa1\xae\xa3\x74\x70\x85\xc2\xdf\xaa\x26\xc2\x97\x22\x1c\xc9\xe1\x3d\x72\xee\x24\xa9\x56\x10\x8e\x41\x5a\xbd\x67\x75\x4b\xc2\x4e\x06\xa1\x05\xa1\x40\x28\x3c\xaa\x98\x5f\x66\x12\xae\xb0\xe0\x87\xac\xe8\x9b\x12\x53\x48\xe0\x6a\x7d\x7d\x51\x50\x72\xb4\xe4\x6f\x02\x28\xa2\x6f\xc0\xdf\xbd\x6b\x5a\xb5\xda\xb6\x29\x38\xa9\xc9\x9b\x4c\x18\xc5\xc2\x7b\x6b\x18\xaa\xbb\x65\x27\x0b\xc3\xe7\xd5\xb4\xbb\xbd\xb4\xbb\xe7\x5f\xd6\xba\x7b\x5e\xd5\xbb\xdb\xcb\x76\xf7\xfc\x0b\x9b\x11\x1b\x16\x44\x3b\xa6\xba\xfc\x9c\xa2\x0a\x34\x19\x8f\xa4\xd6\x27\x49\xb4\xb0\x21\xbb\x55\xc1\x64\xec\x56\xc1\x4f\x87\x7e\x3a\x73\xf3\x84\x9d\xd9\xca\xf4\xe1\x3a\x96\x82\xf4\x57\x21\x41\xe0\x1d\x44\x7e\xbe\x38\x62\xe5\x03\xb9\xf2\xf2\x94\x5f\x69\xc7\xdd\x9d\xa4\x52\x29\xe0\x4a\x79\x26\xc1\x75\xd5\x51\x2c\x12\x8e\x62\x96\x00\x8f\x30\x14\xf1\xdc\x19\x72\xf9\x7a\xf4\x6d\x1d\x81\xc1\xc2\x8c\x2f\xf8\x65\xf9\x17\xfd\x6b\x0a\x47\x65\x8d\x02\x6a\x9f\x42\xd6\xeb\x6d\x64\x41\x18\x02\x10\x44\x43\x7f\x3e\xdd\x40\x96\xd3\x88\xf2\x2b\xaa\xc3\xfb\x5c\xfc\x2f\x4f\x0a\x71\xd4\x0a\xec\x98\xa6\xf3\x83\xd4\x59\x5b\x30\x58\x1f\xb6\x6a\xb1\xe9\x71\x15\x5e\x8f\xb2\x7f\x0c\xd3\x70\x0a\xdc\x03\x57\x7b\xf0\xc8\xc3\xb0\x9c\xfa\x8c\x97\x6b\xfb\xf0\x84\x10\xa6\x2a\xe3\x61\x36\xe3\x77\x4f\x66\xfc\xee\xb9\xca\xc6\xec\xd1\x30\x4c\xbd\xaf\x25\x84\x77\xd3\xa3\x0b\x54\xa8\xd2\xce\x9b\x7a\xef\xb5\x9c\x47\x31\xcf\x09\xf3\xf5\x90\x39\x59\xb6\x0c\x50\x8d\x8e\x41\xe1\xd7\x58\x01\x14\x22\xe4\xa2\x8d\x04\x8e\x95\xea\x5c\x3e\x63\x33\x55\x15\x6c\x88\xe0\xba\x14\xb8\x5d\x61\x9e\x92\x9e\xcb\x72\xfa\xf8\xb4\xc9\xd9\xa0\x45\x36\x71\xbf\xef\xef\x05\xf0\x83\x4b\xe9\x8c\xfa\x45\x36\x55\xf0\xe9\x90\x7f\x72\xbe\xc5\x1a\x25\xc0\xd8\x89\x6f\xe9\x91\x0c\x1e\xe0\x9d\x26\x3b\x55\x37\xa5\x3f\xb7\xff\xf0\x13\xa6\x47\xa9\x89\x6c\x88\x5d\x24\x64\x85\x9d\xa1\x61\x34\xc5\x56\x9f\x46\x14\x97\x84\x58\xda\x69\xb2\xd7\x0c\x08\x4d\x9e\x5f\x95\x6c\x2d\x45\xaa\x6c\x09\x7b\xa9\xd1\x26\x23\xb0\xf4\xfd\xc6\x30\x2d\xab\x2c\x43\xe4\x3e\x29\x54\x28\x17\x71\xc9\x37\xf5\x93\x42\x3a\x48\x1d\x04\x99\x0f\xa1\xbc\xda\x0c\x8f\xb2\x1f\xce\xa5\x0b\xcf\x73\x81\x1f\x2e\xb6\x5e\xe7\x5f\xa9\x9b\x81\x8b\xba\x1e\xd8\x4e\x46\x85\x7b\x24\x34\x49\xfc\xa5\x38\x8a\x1e\xbb\x04\xf8\xeb\x7a\x1d\x59\x93\x47\xb3\x51\x87\x40\xdd\x93\x47\xf3\x4b\x9d\x61\x43\xee\x2c\xe5\xaa\x8e\x2f\x80\x51\xb8\x12\x8c\xc2\x55\x9f\x72\x61\x7b\x7c\xc2\x7f\x3d\xf1\xfb\xed\x13\xff\xa5\x0d\x62\xfd\xc1\x4e\xb3\x88\x7c\x71\x9a\xd6\xb0\x2d\x59\x86\x6b\xc5\x46\x3c\x9f\x73\xe6\xe1\xa4\x27\x53\xee\xba\xf2\x29\x68\xc8\xa7\xaf\x2a\xed\x4c\xe5\x3b\xef\xc8\xa7\xe3\x2b\xf2\x3e\xe8\xd2\x78\xd8\x7e\xbf\x8d\x0d\x11\x83\x86\x15\x0f\x67\xdf\xbb\xb3\x38\xdc\x04\xa0\x1f\x91\x3c\x9a\xef\xba\x86\x31\x16\x60\x77\xd7\x15\x3a\x46\xed\x8d\x82\x6b\x9a\x46\xd1\xca\x19\xad\x7b\x35\x83\x2f\xc3\x36\xa1\xe4\xdb\xa5\xbc\x07\x15\x4b\xd0\x33\x8c\x9b\x4b\x53\x3c\x73\xab\xf4\x71\xbe\x52\x9c\xa6\x5e\x3c\x6c\x57\xbe\x88\x42\xc3\x36\xb2\xbf\x70\x85\xb8\xe3\xad\xba\x57\xc7\x57\xac\xeb\x2f\x1f\x36\x47\x7b\x7c\x45\x32\xb7\xaa\x75\xce\x49\x50\xb0\xf5\xb1\x8e\x4c\x86\xe7\xb3\x2a\x00\x5f\x85\x4e\x6d\x46\xe0\x7f\xd6\xd3\x2a\xb9\xe7\xfc\x08\xd4\xa5\xae\x6e\x59\x95\xab\x75\x16\x70\xbd\xae\x2b\x06\xc9\x77\xb9\xa0\xfc\x4d\x5d\xb0\xd0\x06\xf1\x78\xc0\x37\x86\x6b\x94\x98\xe5\xae\x6a\xc2\x15\x75\xbb\x6f\xfa\x98\xe5\xd2\x1d\xab\x5e\xab\xd2\xde\x89\x2c\x5d\xd3\x64\x34\x70\x54\x07\xa2\x16\xb0\x36\x08\x1f\x1d\xaf\x62\x86\x86\xe1\x5b\xf4\x1f\x33\xc4\xbc\x35\x0c\x6f\x81\x78\x43\xb6\xe9\xb7\xce\xc7\x8c\x5e\xc4\xfc\x21\x40\x8c\x91\x03\x32\x5e\xd0\xb1\x5c\x35\xae\x36\xa1\xed\x36\xf5\xb6\x83\xcd\xb7\x4f\xba\x90\xef\x21\x2b\x43\xaa\x75\x4d\x6a\x9d\x3d\x16\x97\x7d\x9a\xf2\x4a\x42\xb1\xc9\xf4\x2a\x8c\xe5\xb5\x4e\x7a\xd8\x47\x76\x55\x3d\x4a\x05\xbf\x02\xb5\xae\x05\x1b\x1b\x38\x3c\xb2\x4b\xad\x2e\x0e\x74\x96\x95\x55\x74\xfd\x48\x02\x27\xad\xc5\xb9\x9a\x99\x2c\x11\x1f\x5e\x60\x6a\x45\xff\xb0\xcd\x2f\xb4\x5f\x0a\xa0\x39\x72\xfd\x08\xd7\xfc\xd7\x8f\xa0\xc2\x44\xe5\x46\x06\xc1\x72\x86\x87\xbf\xfa\x19\x0f\xaf\x30\xac\x50\x25\xeb\x11\x0f\xb8\x5e\xb1\x53\x8b\x8b\xbe\xb8\x0a\xb9\xeb\xc2\x97\x6f\x53\xfc\xea\xc7\x74\x3a\x85\x98\xb6\x32\xd7\x73\x9f\xe2\x2e\xd7\xb4\xe7\x7a\x0b\x42\xe3\xe7\x47\x84\x24\xff\x25\x4b\xcb\x22\x4f\x7d\x76\xac\xb6\x63\xa9\xc4\x74\xd2\x13\x9f\xd6\x7b\x30\xaa\x4a\x0a\xb0\xb3\xf6\xa5\x0b\x55\x5c\x5d\x29\x04\x31\x59\xd0\xf4\xfd\x6b\x17\xdf\xd7\x40\x0c\x21\x5f\x19\x05\x5d\x4f\xbf\x9e\x9c\xe2\xc7\xa1\xbc\x78\x08\x1a\x44\xd4\x62\x75\x03\x56\x87\xe8\xd6\xf1\x8c\xb1\x96\x75\xf6\x7e\x7e\x8a\x45\xd6\x24\xf9\x22\x43\x82\xb6\x33\xd8\x43\x22\x04\xc5\x24\x7f\xed\x8a\x8b\x9b\x13\x24\x51\x3c\x38\xa2\x12\xcf\x98\x4a\x0d\xb1\xf3\x0e\x86\xdd\x9e\x16\x3d\xef\xe0\x42\x41\xe4\x43\xce\xb7\xba\x76\xef\xc1\xb6\x16\xe0\x9b\x2c\x9f\x7f\x95\xc7\xe7\xcb\xb5\xd6\xaf\xd3\x60\x56\x25\xfa\x23\xcd\x1e\xc8\x34\xb1\x87\x29\x6a\x95\x5c\x99\x2e\xef\x19\xcf\x7a\x1a\xe9\xc2\xa6\xdf\x43\xf8\xad\xb1\x63\xaa\xb4\x28\xcf\x7a\x68\xbd\x5d\x06\x4f\x3e\xd1\xe1\x26\x20\x1a\x48\x38\xa6\x04\xc3\xb5\x5e\x49\x67\x5d\x77\x5d\xf5\xc5\x97\x80\xc3\xbe\x2b\x30\x93\x5f\x03\xfd\xab\xb4\x08\x38\xc9\x19\x8b\xa6\x18\x9a\xc2\xa0\xa4\xf8\xee\xba\xa2\xdd\x1f\x11\x59\xaa\x93\x08\xe1\x14\x56\xe4\x34\xc1\x0b\x49\x77\x00\x92\x6d\xde\x75\x89\x1f\xaf\xed\x1b\x7f\x6d\xb7\x20\xd9\x59\x35\x75\x77\x5d\x94\x0b\x99\xef\xb6\x82\xe2\xd7\xae\xec\xca\xd7\x6e\x66\x94\xdf\xa6\x38\xd8\x6c\xe0\x6b\x17\xe5\x83\x69\xba\x56\x5d\xb5\x1e\xe7\x9d\x6d\xeb\xf1\xd8\x25\x9c\x62\xd1\x89\x53\xf1\xc5\xaa\x53\x59\x5c\xcd\xc6\x79\x27\x6f\x05\x64\xa7\xce\x3b\xaa\xf0\x4f\xb6\x09\xce\xdd\x26\x5b\xf6\x49\x56\x3e\x75\xb5\x2e\x6c\x82\xbc\x3a\x27\xce\x50\xe3\x91\x98\xe2\xeb\x4f\x99\xe4\x97\xa9\x4a\xde\x2c\x77\xde\xc1\x32\x7c\xef\xe8\x91\x22\xe7\x21\x73\x5b\xf9\x2d\xaf\xc8\xd7\xae\x2a\x32\x7e\xa4\xeb\x08\x7a\x03\x11\xa5\x90\x50\x20\xe4\x8b\x61\x64\xa0\x01\xd2\x45\x1e\xef\x24\x49\xae\x75\x79\xd7\x2f\x8a\xbb\x1e\x74\x36\xf1\x6a\x4d\xde\xf5\x86\x2c\xeb\x3a\xf5\xb0\xa0\xd4\xa4\x8f\x4c\x84\x59\x15\xac\x72\x0d\x29\x71\xbf\x3f\x59\xde\x15\x5a\x8a\xbe\x65\xd7\x04\x38\xd4\xa3\x31\xe5\x8b\x98\x65\x67\xa1\xc0\xf9\x97\x9c\x02\xd5\xb1\xc4\xe9\xcf\xe7\xf2\x76\x9e\xb3\xa9\xd1\x3f\xbf\xc0\x95\x6d\x67\x3b\x53\x5e\x93\xf1\x51\x1a\x5f\xa5\x58\x4b\xc6\x44\x31\x2a\x46\x67\xc5\x9c\x75\xce\xae\x72\x22\xf6\xca\xf5\x23\x16\x4a\x2a\x25\x5c\x12\x6c\x6a\x09\xea\x06\x0e\x0d\x69\x49\x87\x2e\x70\x66\x0c\xa9\xe4\x97\xf6\xa1\x08\xa6\x22\x1b\xb7\xeb\xcb\x50\x8d\x37\xf5\x0d\x8a\xee\x46\x69\xd1\xb1\x8d\xaf\x62\x73\x3d\x76\x31\xb8\x9b\xf3\xac\x1f\xff\x30\x1a\xc6\x47\x1e\xf1\x18\x0d\x65\xc2\x95\xa8\xbc\x04\xfc\x5e\x37\x7d\xec\x21\xd0\xad\x93\xd0\x23\xf4\x37\xc4\xeb\x6a\xd5\xb4\x7a\xb7\x9b\x24\xef\xf3\x79\x9e\xc2\x4d\x06\x3d\x48\x4e\xe3\x6a\x9d\xb3\x6a\xb2\x9d\x95\xad\xd2\x06\xd1\x20\xcd\x44\xd6\xa5\x86\x21\x21\xf3\xbc\xe3\x48\x55\x34\xdf\x25\x64\x1c\x21\x21\xce\x01\x4d\xc1\xc7\xd0\x5d\x71\xbd\xd1\x15\x57\xd3\x2f\xd0\xd6\x75\xe0\xa2\x57\xf6\xf1\x28\xc8\xb8\x74\x7d\xec\xc2\x2c\xd0\x35\xa5\x83\xef\x9c\xce\x5c\xdb\x49\x5c\x7a\x76\xfd\x29\xe7\xa6\xb6\x50\xc6\x3e\xfb\x13\x28\xfc\x16\x8a\xce\x43\x37\xcf\x5c\x42\x8e\x4e\xe5\xb5\x39\x63\xef\x0c\x63\xff\x13\x21\xb4\x15\x8f\x5d\x69\x71\x1b\x18\x46\x60\xfd\xf8\x07\x87\x24\xe4\xe3\xba\x89\x0c\xa3\x10\xb2\xbe\x3b\xf0\x54\x31\x7d\x88\xad\x4a\x02\xe8\x74\x24\x89\x3d\xbd\xdb\x11\xeb\x36\xb2\xc3\x24\xe1\xa1\x44\x95\xd7\x8e\xbf\x44\x6b\x6c\x6d\xfd\x89\x6b\x18\x21\x51\x38\x49\xbb\x93\x28\x39\x4a\x02\xda\x19\x66\x58\xf1\x36\x7a\x5d\x49\x56\xbf\x47\x53\x56\x5f\xc9\x74\xcb\x07\x6a\x40\x10\x56\x56\xac\x8d\x1c\x03\x8a\x48\x08\xd3\x2f\xf3\xcb\x0e\x7c\xed\x22\x09\xc9\xea\x5b\xa0\x7c\x6d\x58\x77\xf7\x38\x26\x3d\xc3\xf8\x51\x37\x03\xdc\x63\x8c\x84\xac\xfb\x2e\x4a\x12\x35\x55\xea\x71\x18\x21\x35\x6d\x85\x38\x49\x62\xf6\x94\x24\x6c\x46\x22\xd2\x43\xab\xc8\x30\x02\x70\x4d\x54\x28\xe5\xce\xdf\xcd\x6c\xd2\x1d\xb4\x4d\x39\xc7\xec\x3f\xa1\xa4\x4e\x84\xcb\xfe\xaf\x5d\xc3\x38\xd8\x57\xf3\xa9\x3a\xcf\x98\x83\x24\xf1\x11\x6d\x3d\x83\xac\x5e\x6a\x3d\x79\x6b\x60\x94\x6e\x57\x01\x67\xaf\xbe\x27\xee\x75\x25\x4d\xd9\x0b\x9f\x25\xc7\xec\xd3\x11\xcb\x0b\x37\xb6\xdf\xd7\x6e\x6c\xeb\xa9\xbf\x87\xd4\x00\x2f\xee\xa5\x9b\xeb\xde\xac\xd7\x71\xdc\x43\x4e\x93\xd4\x85\x6c\xe1\xec\x91\xbc\xf7\x3b\x74\x32\x9b\xee\x79\xf3\xd9\x6c\x38\x98\x86\x33\xc6\xdd\xdf\xdd\x4b\xae\x7f\x2c\x1f\x7e\xfc\x23\x9f\xa6\xe1\x2c\x47\xec\x1e\xf7\x5a\x97\x2e\xfb\x96\xf5\xa2\xa6\x5c\xf6\xde\xdd\x13\x8a\x1c\xe5\xc7\xe7\xc7\x3f\x84\x66\x58\x5c\xb6\xf7\x27\x8f\x6f\x7a\xe7\x99\xb2\xdd\xc9\xa6\x03\xd3\x56\xfd\xd9\xe5\x8a\xda\x6c\x1b\x1e\xe5\xc8\xb0\xad\x31\x7a\x95\xe4\xeb\x18\x5f\x5f\xca\xb3\x57\xe9\x3b\x89\x6d\xbe\x16\x10\x59\xa9\x7d\x50\xeb\xd1\xbc\xaf\xe1\xd7\x01\x10\x74\x2b\x18\x8b\x00\xd2\xbb\x7b\x50\x6c\x0d\x14\xa7\x32\x96\x12\xa3\x71\x0b\x78\xd4\x95\xdc\x0e\x4e\x9e\x0d\x11\xe5\xe6\x00\xdc\xff\x0c\x2f\x06\xb7\xea\xa2\x86\xc8\x77\x4d\xc6\xd9\xa4\xea\xd4\x25\xae\x0f\x00\x61\x51\x3c\xd7\xf1\x8a\x45\x86\x3d\x02\xe2\xb3\x2d\x94\x24\xbe\xd5\x0d\x70\xc8\xe8\x57\x1f\x25\x89\xdf\x1a\x06\xae\xf4\x04\x19\x91\x12\x91\xd7\x1f\x6c\xf6\xb8\x56\x81\xcf\x83\x9f\xd0\x63\xc4\x70\xc9\x73\x5d\x46\x90\xe0\x23\x59\xad\x7e\x6e\x9c\xf7\xa6\x21\x58\xaa\x68\x52\x5f\xf7\xde\x45\xc5\xf8\xc6\x91\x88\x17\xe3\x88\x7b\xa3\x80\x8f\x29\xe4\x3d\xf3\x92\x24\x64\xe4\x36\x51\x6e\xcc\x42\x47\x13\xd2\xac\xde\x81\x35\x67\x9d\xbc\xf6\xc2\x67\x9b\x9e\x63\xb1\x2d\xec\xdd\x21\x5d\xe1\x2f\x32\xfd\x58\xa5\x87\x2c\x7d\xf7\x88\xf2\x0f\xef\x9f\xc3\xe9\x7b\xf5\xed\xfd\x7d\x38\x7d\xbf\xc2\xb4\x26\xbe\x36\xcf\xd2\x4f\x8d\xe1\xfb\x15\xf6\xe4\x97\xf7\x53\xba\x08\xb5\x82\x37\xec\x75\x85\x7d\xf5\x5d\x7a\x61\xd2\xf2\x1c\xc9\xa4\x95\xf3\x7e\x3e\x08\xc2\xa8\x3b\x08\x83\xf7\x05\x32\x7b\x1e\x85\xc3\x68\x27\xa4\x86\x61\x6e\xc8\x04\x41\xf0\xfc\x13\x49\x61\xe6\xfb\xee\x11\x95\x19\x68\x8d\x6e\xc9\x91\x7e\x7e\xab\x2a\xbf\xc6\x33\x7a\xe2\xf7\x8b\xec\x90\x86\x69\x6e\xc5\xba\xea\xda\x21\x52\x05\x32\x38\xe4\x52\x99\x7b\xf3\x96\x2b\x75\x34\xc9\xad\xd4\x78\x50\x72\xc9\x1b\xf9\xd4\x2c\xcb\xa7\x1b\x95\x16\xf4\xb9\xa7\xbf\xf9\x82\xff\x8e\xc0\xbf\x3d\x2c\x79\xc0\xa6\xfa\xc0\x2e\x1f\xe0\xf2\xbe\x5d\xfe\xf0\x01\x7f\x3c\xd8\x3f\xd8\xb7\x0f\xfe\x84\x87\x03\xfb\x43\x09\x1e\x3e\xd8\x07\x9f\xe0\xe1\x0f\xfb\xe0\x2f\x78\xf8\x68\x97\xcb\xfb\xf0\xf4\xc9\x2e\x97\x0f\xe0\xe9\x4f\xbb\x5c\xe6\x35\xfc\x65\x97\xcb\x7f\xb0\xa7\x0f\x25\xbb\x5c\xfe\x08\x4f\x65\xbb\x5c\x86\x4a\x3e\xec\xdb\xe5\x32\x34\xf0\xe1\xc0\x2e\x97\xa1\xbe\x0f\x1f\xec\xf2\x3e\xb4\xf5\xe1\x0f\xbb\xbc\x5f\x86\xa7\x8f\x76\x79\x1f\xda\xf8\xf0\xc9\x2e\xef\x43\x1b\x1f\xfe\xb4\x79\x27\x3f\xed\xdb\x1f\xa0\xde\x4f\x07\xf6\x01\x7f\xf8\xc3\x3e\x80\x36\x3f\x7d\xb4\x0f\x20\xf3\xa7\x4f\xf6\x01\x64\xfe\xf3\x2f\x31\xb6\x83\xd2\xbe\xfd\xe1\x8f\x15\x0e\xd9\xb0\x7f\x8c\xd8\x38\x6b\xc3\xa7\x01\x1b\xe6\x55\x18\xcd\xd8\x28\xaf\x21\x20\xd1\xc1\x5f\xf8\x78\x30\x0b\x27\x6c\x66\x4e\xca\x30\xd6\x93\x7d\x18\xe8\xc9\x01\x8c\xf2\xe4\x03\x0c\xf1\xe4\x0f\x18\xdf\xc9\x47\x18\xdc\xc9\x27\x18\xd9\xc9\x9f\x30\xac\x93\xbf\x60\x4c\x27\xe5\x12\x8c\xe8\xa4\x5c\x86\xf1\x9c\xb0\x99\xde\x3f\xc0\xef\x7f\x14\x4b\xa5\x4f\x27\xef\xd9\x38\xce\x86\xfd\x90\x0d\xe3\x78\x10\xb0\x41\x7c\xa5\xed\x90\xf5\xee\x00\x9e\xa0\x87\x07\x1f\xf0\x39\x8f\x0e\xcb\xfa\x1f\xd5\x28\xe8\xa2\x1f\x73\x5d\xf4\xee\x80\x22\xdc\xae\x51\xb2\xe8\x19\x46\xb5\xa7\x20\xe4\x5d\xd3\xfa\xda\xcf\x20\x4b\x56\xc0\x2c\x7f\x12\x68\x37\xe8\x03\xf9\x76\x3f\x76\x93\xa4\xfc\x67\x36\x71\xc2\x12\x59\x7d\x7f\x95\xb3\x1f\xae\xc7\xae\xe2\x5c\xe6\x0b\xf9\x89\xec\x95\x91\xb3\xa7\x67\x35\xa1\x62\xc3\x28\x7f\x2a\xf0\xb3\xbc\x22\xb3\x96\x3f\xd9\x50\xbf\x61\x94\xff\xdc\xf8\xf6\xa7\x0d\x4d\xb0\x76\x0b\x92\x06\x30\xe5\xd7\xbf\xca\xc2\xa1\x4f\x8d\x11\x9e\xfd\x23\x6a\x42\x0e\xc1\xdb\xf7\x31\x10\x5f\x18\x1a\xc6\xd0\x84\xd0\xc9\x1e\x8c\xc1\x13\x42\xea\xac\x7f\xbe\x20\xc1\x15\x2f\x0c\x33\xa7\x0c\xbf\x0e\x08\x2f\xc7\x70\x72\x63\x94\x73\x5b\x93\x19\xb2\x93\x29\xb4\x72\xde\x9d\x8d\x72\x9d\xbb\x52\xeb\x1b\xe5\x47\x0e\xf1\x58\x4e\xd0\x83\xe6\x84\xeb\x4b\x6a\x51\x37\x5f\xe0\x80\x94\x0f\x0a\xc4\x67\xf4\x6b\x81\xf8\x15\x8f\x75\xd0\x2e\x21\xfb\x78\x6b\xfe\xd2\x67\xe2\xb5\x7a\x6c\x96\x60\xeb\xfe\x2d\x5e\xfc\x2b\xd3\x47\x15\x78\x61\xe5\x5f\x7a\xd9\x52\xf2\xb3\xa8\xde\xf4\x09\x3c\x0b\x3e\x14\xb2\x40\xd9\x24\x29\x89\xe9\x11\xba\xab\xa3\x03\x84\x19\x54\x7c\x3c\x20\x8c\xa4\xde\xdf\xff\xc0\x83\x08\xf8\xa4\x0c\x8b\x23\x7c\x46\xb2\xd9\xf5\x11\x6e\x13\x8f\x51\x17\xe7\x41\x38\x98\x75\xa3\x6e\x38\x71\xfc\x0a\x74\xf3\x33\x2b\xe4\xef\x74\x07\x0c\x03\x55\x22\x12\xd4\x68\xcb\x77\xed\xfd\x3f\xa0\x36\x41\x43\x9b\x11\xf9\x0b\xd9\x6d\xc3\x68\xb3\x8c\x21\x74\x23\x22\x61\x8d\xb6\xda\x10\xea\x29\x52\xd0\xe6\xc8\x25\x89\x1c\xae\xd9\xd6\xa9\x51\x33\xc2\xc2\x9c\xf1\x62\x64\x7a\x38\x5c\x57\x63\x7b\xfb\x44\x7e\xd7\xb4\x82\xc3\x3c\x1d\xc5\x9b\x1b\x41\x6f\x5e\xbf\x28\xad\x82\xb1\xa4\x26\xaf\x6f\x34\x8d\x3c\x21\xf9\x50\x7a\x6c\xcd\xb2\xf6\x51\x4a\x4b\xbe\xf6\xb1\xa7\xdb\x42\xdc\xe8\x35\xd4\x44\xa6\xc6\x88\xca\x5c\x0c\x2e\x83\x70\x46\xfd\xce\xa6\x6c\xe2\xc6\x30\x4c\xa9\x6c\x77\x7d\x83\xb0\x7c\x6e\x96\xd3\xe7\x9b\x1b\x21\x30\xba\xb9\x21\xb2\x57\xb2\xeb\xda\x25\x8f\xee\x3d\x22\x03\xf1\x1b\xd7\x85\xb7\x6b\xaa\x7f\xe9\xdc\x68\x74\x0b\x5b\x0e\x45\xd7\x1e\xa6\x04\x6d\x00\xaa\x87\xf0\x58\x3d\x45\xce\xe9\x9a\x01\x10\x23\xa4\x8f\x86\x41\x28\x09\xae\x49\x38\x0a\xe9\x8c\xf8\xab\x7b\xb3\x53\xa3\xf8\x50\x27\xd6\x9b\xe0\x87\x83\x81\xdf\x5d\xdd\x69\x77\xcd\xa6\xee\x06\xb8\x5b\xa3\x59\xcd\xc7\xfb\xba\xe3\xe5\xdf\xb8\xd1\x55\x6a\x3f\xc7\xf2\x3f\xb2\xa3\x82\x93\xf2\xf6\xf5\x92\x62\xbf\x13\xfa\x3d\x6f\xb8\xb4\x17\xc7\xb8\x1f\x0e\xe6\xdd\x59\xd8\xb7\xbd\x0b\xf5\x9c\xf7\x7d\x42\x83\xee\x90\x25\xa8\x87\x19\xf5\x58\xa1\xd9\x24\x0c\x45\x05\x2b\xa7\x49\x9a\xe2\x5c\xbf\xeb\xe9\x1d\x5b\xd3\x33\xd4\x90\x8a\x92\x09\xf2\x15\x8d\x4d\xaa\x4c\xb2\x30\x6d\xdd\x81\xbe\x87\xf3\x50\xd7\x98\x87\xd4\x34\x30\x7b\x49\x46\xf5\xf1\x37\xad\x87\x49\xae\x51\x34\xa1\x16\xad\xc0\x45\x8c\x4d\x25\x55\xcf\xe8\x67\xf0\x6f\x75\xde\x33\xbf\x54\xd9\xc9\x10\x90\xdd\xba\x32\xf2\xc3\x41\xeb\xc8\x05\x8f\x4f\xa6\x5f\x79\xa9\xdb\xd5\x3a\x82\x90\x3e\xab\xb7\x4c\xea\xd7\x1d\x05\xf0\x10\x9c\x5d\x70\xfb\xe0\x2d\x4d\x0f\xa4\x76\x5a\x60\x98\x7b\x6a\x72\xc6\x08\xbc\x83\x56\xa8\x75\x76\xc8\xdd\xe6\xb6\x02\xdf\xad\xb4\x1f\xb9\x0b\x78\x64\x73\xe7\xa1\x36\x7c\xe7\xc0\xce\xc7\x50\x92\x9a\xf9\x3e\x35\x91\x88\x56\xcd\x9f\xdb\xa4\x50\x86\xa0\x5e\x5c\x00\x11\x93\xf6\x23\x1b\x1a\x1b\xcf\x83\x19\x67\x30\x7d\x3b\x49\x68\x81\x84\x95\x1e\xfc\x46\x95\x20\xe1\xf5\xd4\xfe\x31\x29\x0f\xb2\x65\x9b\x6d\xc6\x16\x47\x84\x84\xe0\x6c\x8b\xd1\x80\x82\xb1\x71\xa8\x35\x24\x81\xd3\x4e\x12\x33\xe6\xea\x5c\xd9\x6c\x4e\x8f\xb1\xda\x10\xd9\x11\xfa\x3c\x60\x84\xff\xd0\x19\x18\x46\x2c\xe3\xca\xc7\x78\x90\x3a\x1b\xe3\x8b\x21\xe3\xe5\xee\xd6\xcd\x18\x39\xa5\xcf\x23\xee\x37\x58\x2b\x32\x42\x6c\x60\x25\xb4\x6a\x1b\x06\x2b\x37\x30\x8c\x82\x9f\x24\xdf\x8e\xa8\xe9\xe1\x58\xd9\xf7\x6d\x07\xa2\xf3\xfe\x9a\x37\xf2\x4e\x47\xb9\x62\x1c\x3d\x89\x5b\xbb\x42\x09\x39\xb4\xd5\xe6\x5e\x65\x39\xac\x0e\x40\x63\xff\x1a\x7c\x20\xa5\xb7\x88\xb4\x91\x01\x37\x70\xff\x7a\xd7\x33\x11\x62\xe7\xd3\x5d\xe0\x9a\x8b\x8e\x30\x60\xc6\x14\x8e\xc9\xab\x2b\xae\xe3\x9f\xde\x43\x2a\xfd\x01\x8f\xd5\x9e\x24\xf5\x2b\xd3\x07\x65\x39\x78\x47\x8e\xc7\xfb\x01\x35\x8f\x4c\x1f\x97\x71\x41\x24\x21\xc7\x6b\x98\x1e\xfe\x13\x7c\x2f\xc0\xb7\x3f\xb1\x67\x45\xd7\xea\x4b\xf9\x63\xfa\xa9\xfc\x11\x7b\xd6\x61\x5f\x7d\xfb\xf8\x21\xfd\xf6\xf1\x03\xf6\x45\x1a\x5a\x35\xad\xce\xd9\x1a\x28\xf7\x40\xbf\xd7\xc3\x05\x58\xaa\x97\x1e\xda\xb0\x1c\x57\xa7\xcd\xc3\x44\x8a\xb3\x41\xa7\x76\xd6\xe7\x86\x94\x4d\x6b\x31\xd9\xc4\x08\x6a\x61\xd8\x2c\x1e\xec\xc3\x55\x2b\xa1\xd6\x65\xdb\x44\xa8\xb2\x88\x4d\x0f\x19\xc6\x13\xfb\xb1\x85\x03\x88\x9b\x41\x9e\xbb\x2e\x90\xb4\xa4\x55\xf8\xb2\x0a\xe1\xe7\xdd\x30\x7c\xf1\x91\xab\x9d\xf8\xad\x93\x97\xac\x0a\x97\xaf\x0a\x53\xab\xca\xf5\xff\xd1\xca\x5c\xc4\x10\xfb\xea\x89\xfd\xa0\x02\xf1\x0c\x63\x1e\x83\x40\x74\xb5\x21\x25\x67\x5d\x01\x25\x68\x0f\xd8\x20\x90\xd9\xc3\x12\xf2\x73\xfb\x68\x3d\x3a\x5f\x2a\x61\xa0\xdc\x52\x4a\x85\x6d\x80\xa9\x0b\xcf\xc1\x8c\x56\xca\xb6\xd9\x94\x86\x4a\xa3\xe4\x6e\x64\x0a\x03\x75\xd0\xf7\x1e\x6d\x54\x7d\x57\x4f\x12\xf3\xae\x4e\x5e\xcb\xf6\x78\x46\xf1\x9f\x0c\x6f\x97\x3f\x32\x24\xfe\xf1\x83\xdd\x9c\x41\x6c\x75\x72\x57\x67\x78\x50\xba\x65\xc8\x40\x2a\x48\x68\x02\xf2\x58\xa3\xad\xc0\x4d\x12\x0f\x7b\xc4\x23\x64\x71\x0c\x86\x52\xde\x45\x25\xb0\x3d\x10\x62\xd5\x45\x38\x34\xb6\x21\x46\xeb\xb1\xc7\x32\x71\xb0\xee\xa9\xb0\x29\x64\x84\x57\x87\xcd\x27\xf6\xc0\x25\xf1\xb0\xcb\x30\xd3\x98\x4f\x6b\x6a\xdd\x1c\x6c\xc8\x4b\x34\x97\xf8\xbe\x88\xbb\xcb\xed\xe8\xbd\x56\x0d\x9c\x86\xd9\x94\xcd\x47\x0f\xc2\x9a\x3d\x40\x80\x68\xbb\x10\xb3\xb7\x24\x09\x96\xc2\xab\x00\xd8\x67\x3f\x98\xed\x47\x93\xa1\x79\x88\xf6\xd6\xb4\x2e\xdb\xb9\x87\x8a\x25\x14\xdf\x72\x8f\x5c\x9f\xeb\xda\xdf\xc4\x39\x87\x5c\x8a\x8a\x7d\x76\xd4\x48\x11\x30\x4b\x71\x02\x80\x22\x08\x4b\x17\x80\x47\xbf\xd6\xd9\x58\xc6\x11\x0f\x48\xcb\x75\x3c\xe5\x89\xdf\x33\xf6\x3c\x07\x8e\x22\x09\x11\xe0\x04\xd0\x20\xff\x13\xae\x7c\x89\x0e\xc1\x68\x07\x4e\xb9\xf1\x10\xf1\x8a\x45\x3a\x45\xd9\x33\x4e\xfb\xb4\x5b\x67\xf0\x9c\x06\x3a\xd4\xb0\xd9\x6e\x3d\x13\x47\xcf\x75\x3c\x11\x53\xa9\xea\xb9\x66\x0b\xf4\xe9\x1e\x4c\x3d\x04\x75\x80\x5e\x0b\xcd\xae\x19\xe0\x79\xd7\xdc\xed\x62\x8a\x10\xb7\x2e\xdd\x65\x69\x1e\x88\xa2\xd8\x58\x65\xac\x3d\xa4\x07\x58\x6c\x5a\xe1\xf9\x26\xb7\xe2\xfd\x48\x92\x5e\x8d\xe6\xe8\xbf\x78\x3f\x5a\x14\x62\x56\xd4\xfe\xd9\x2c\xd6\x88\xa8\xbc\x1b\xcd\xd4\x80\xe5\x57\xd2\xed\xc9\xcf\x88\x91\xe2\x3d\x71\x71\xd9\x88\x68\x8b\xba\xb8\x5c\x52\x8d\x45\x0c\x58\x2b\x25\x5b\xd7\xd9\xe9\xe9\xe4\x18\x37\x17\x70\x4e\xba\xa6\xc7\xdd\xe7\xff\x7b\x49\x4b\xc9\xbf\xa7\xdc\x71\x3e\xe6\x8a\x23\xde\x0f\xb6\xff\xbc\xe2\xa4\x8a\xf7\x6d\xaf\x38\xee\x53\xfc\xc1\xf6\x8a\xed\x3e\x6c\xc8\xe2\xbc\x4f\xd9\x9e\xf4\x8a\xbd\x3e\xc3\x3c\xb6\x57\x1c\xf4\x29\xdb\x9f\x5e\x71\xda\xa7\xba\x16\x69\xd0\x48\x43\x56\x68\x1e\x1d\x94\xe3\xaf\x98\x4e\xa7\x3b\x03\xda\x0f\x77\xde\x17\xf9\x26\x2b\x4c\x60\x57\x6d\x64\x15\xee\x81\x86\x13\x15\x98\x74\xe7\x7d\x91\x6d\xbb\x46\x8b\xba\x44\x73\x73\x17\x6b\xa3\x75\x28\x01\xca\xc8\x59\x0b\x1d\xd1\xba\x70\x1d\xff\x73\xe0\xf8\x5c\x6a\xc7\x60\xd9\x77\x19\xa6\x00\xce\xa7\x51\x09\x1b\x2d\xcf\x35\xb9\x4b\x2e\x29\xc1\xf3\x32\x12\x3c\x56\x59\x9f\xd1\xaa\x2b\x1c\x36\x88\x1e\x67\x71\xa0\xcf\x36\xef\x8c\x03\xb7\x55\x75\xaa\xa9\x3b\xe9\xde\x22\x22\x75\x0c\x6b\xe6\x38\x3e\x9f\x0d\x46\x8a\x71\xb9\xfe\xdc\x4f\x23\x5b\x07\xb0\xd7\x02\x32\x63\x73\x05\x18\x98\xf4\x01\xe1\xf1\xbb\x23\x88\xbb\x10\x56\x3c\x2b\x64\xa5\xb8\xd7\x10\x8f\x04\x95\x49\xd7\x0c\xac\x5b\x0f\x55\x02\xf0\x29\xc7\x3d\x75\xf2\xcf\x00\x4e\x6d\x49\xf9\x33\x82\x4e\x38\xfa\xe0\xc7\xc9\xbd\x19\x35\x84\xfd\x4f\xd4\xe0\x54\x73\xaa\xa6\x37\x04\x9b\x79\xff\x9c\x1c\xfc\xe5\x34\xad\xc9\x94\xec\xff\xf1\x87\xd3\xb4\xbe\x73\x53\x7b\xae\x03\xde\xb4\xc6\xca\x12\xa8\xd3\xe0\x29\x17\x0d\xae\xd4\x77\x7c\xb5\xe6\xd5\xae\xdd\x90\xca\x58\x35\x0f\x0c\x57\xa9\xd5\x69\x18\xc6\x90\xb3\x35\x0c\x40\x3b\x0d\xe2\xad\xb2\xe8\x2f\xcb\x53\xb6\xd9\x21\xaa\x58\xb8\xc9\xd7\x6d\xf9\x6a\x91\xdc\x79\xb5\x88\x7b\x30\xa8\x73\xe7\xa1\x5b\x03\x9b\xb6\xb9\x6d\x86\xf7\x4b\xae\xb5\x66\xe2\x52\x4a\x0a\x3c\xc6\x3a\xd7\xd7\xe6\xfe\x03\x1a\x83\x2c\x4d\xa7\xf2\x0e\x2b\xbb\x5d\xf9\x88\x29\x12\xd2\x82\xf1\x90\x07\x50\x17\xd1\xf2\x86\x84\x61\x00\x31\xe6\x87\x89\xa4\x1b\x81\xd8\xdd\x64\x2d\xd0\xab\xf0\xaf\xd3\x18\xc0\xb1\x23\x2d\xa0\x87\x86\xa1\xfc\xb4\xb0\xb6\x0c\x43\x59\xd0\x8f\x87\x5a\xb8\x39\xb1\x88\x28\xa7\xc1\xb2\xf0\xba\xba\xe5\x0e\xbb\x6d\x3d\xea\xea\x0c\x70\x63\xd0\xe0\x95\xb6\xf1\xa6\x0e\xc1\x45\x43\x0c\xb7\x6d\x75\xce\x84\x7d\x16\x67\x9c\x4d\x39\x11\x6d\xb8\x83\xa2\x52\x7d\xe0\xbf\x57\x6e\x7c\xcb\x87\x51\x9b\x1d\xff\x72\x15\x85\xf2\x74\x9e\x91\x93\xcc\x0d\x0e\xd4\xde\xf0\x52\x26\x27\xa3\x4e\x53\x1d\xa8\xff\x66\x1a\xc2\x90\xd0\xd6\xd2\x6d\xdd\xf9\x6e\x81\x7c\xdb\x34\x72\x8a\x1a\x79\x4a\x24\x6d\xeb\xbc\x9f\xde\xef\xf1\xa3\xfd\xdc\xd8\xdb\x97\xcb\x2b\x77\xd9\x4c\x18\x74\x60\x8f\xf7\x0d\xc8\xcf\x6c\xc4\x98\x36\x27\xfd\xb2\x94\xc3\xe4\xab\x89\x1c\x0f\x64\xe8\x59\x5d\x12\x0f\x57\x85\x70\xe5\xbe\xcb\xde\x29\x16\x06\x96\x56\x6d\xce\xdf\xa5\xdb\x82\xea\x12\x2e\x70\x34\x97\xd0\xb5\x35\x73\x59\x56\x25\x96\xd4\xa7\x57\x31\x7d\xab\x6f\x06\xf8\x7c\x8a\xa9\xd5\x1b\x22\x78\x39\x65\x2f\x34\xe2\x2f\xdf\xce\x30\xb5\xbe\x8f\xf8\xcb\x19\xfb\x32\xfb\x02\xde\x87\xce\x0b\x24\xea\x1a\x86\x28\x7f\x0c\x49\x08\x33\xca\x83\x27\xd1\x13\x4c\xad\xc5\x5f\xa0\xc5\x69\x2d\x3c\xbd\x11\x78\x53\xad\xc0\x9b\x6a\x06\xde\x72\xdb\xe1\x75\x64\x1b\x82\x34\xd5\xd2\x6a\x5d\x0d\x06\xd6\x51\x37\xe9\x12\xb8\x4a\xfa\x0b\x8b\x74\xc1\x58\xaa\x2e\xa3\x33\x7f\x6d\xc6\xfe\xcd\x34\x45\x9b\xea\x46\x03\xd5\x9c\xfa\x25\x56\xdc\xf0\x42\x57\x8b\xb2\x76\xa5\x22\x14\xee\x78\x28\x55\x8f\x85\x8f\x90\x2d\x5a\xca\x22\xd3\x0a\x6d\xd0\xdd\x62\x97\xb4\x5b\xcd\x17\xcd\x7c\x45\x42\xd2\xd9\xa1\x29\x42\x72\x9d\x1d\x6e\x6e\xad\xa1\x40\xa6\xd5\x38\x1f\xff\x70\xf1\x8c\xc3\xe9\x10\xd1\x93\x2f\x0e\x55\xfe\xac\x7a\xf0\xfb\xbd\x6b\x52\xfc\x12\x73\xb1\xce\x17\x64\x2f\x63\xed\xc8\xee\x07\x54\xec\xed\x35\xb7\x63\x30\x85\xa3\x27\x5d\xaf\x51\xdb\x13\x34\xbd\x34\xb7\xda\x8c\x49\xf7\x84\xa2\x78\x86\x51\x95\x3e\x17\x1b\x84\x6e\x2f\xdc\x39\x53\x85\xdf\xb4\x88\xc9\xe1\xef\xf8\x75\xbe\xc8\x01\xfa\x27\x33\x29\x9e\xa5\x95\xf1\x85\xdd\x3e\x45\xd9\x70\xfd\x5c\x57\x5a\x43\xb4\xbe\x5c\x89\x2d\xc0\x45\x35\xcc\xe4\x28\xe1\x92\xf4\xed\xcb\x96\xfb\xfb\x53\x1e\x40\x14\x7c\x81\x63\xca\x7c\x75\xaf\xf2\x9c\x07\x40\xbb\xe0\x16\x0f\xa6\x83\x5f\x3e\x82\x20\x81\x90\x7a\xdb\x30\x0a\x4a\xce\x50\xe8\xc8\xea\x70\x81\x9d\x99\xa6\x24\xad\x5b\xbb\x2f\x6e\xea\x48\xe5\xba\xc3\x9e\xe5\x4b\xee\x70\x84\xe1\x99\x6f\x42\x4d\x7c\xd6\xb3\xa8\x5f\x36\xb5\x0f\x27\xa6\xcc\xbe\x2f\x97\xa8\x97\xc7\x7c\x89\x22\x1f\x90\x30\x32\x38\x84\xb0\xf2\xb9\xd5\x7e\xc8\x54\xfb\x41\x54\x1b\xe5\x2d\xbd\xac\xf6\x4f\x7e\x06\x0f\x73\xeb\xfb\x33\x53\xdf\x9f\xa2\xbe\xc3\xfe\x1b\xf5\x95\x3f\x72\x2a\xa2\x9d\x5b\x61\xf9\x63\xa6\x46\x78\xe5\xd4\x51\x2d\x37\xff\x41\x76\xa2\x0e\xe4\x4c\x1d\x06\xb9\xd9\x3f\x66\x27\xe0\x23\x9f\x81\xaf\xa3\x37\xd0\x8a\x6e\x27\xea\x37\x74\xef\x68\x85\x82\x49\xad\xa1\x01\xfa\xf6\x6b\x12\x0d\xf4\x2a\x8f\x39\xd6\x9c\x57\x20\xbe\xf6\x2a\xce\x66\xd6\x81\x99\x14\xc9\x09\x5d\x62\x22\x68\xa9\x61\x42\x39\x31\x36\x34\xfe\x27\xe3\xb2\xc5\xdb\xec\x81\x7f\xce\xbb\xe0\xb7\x37\x9d\xec\x09\x02\x12\x24\x3e\xaa\xfd\x42\x96\xa0\x2c\xac\x7d\x96\x93\xa3\x91\x06\xfe\xb9\xec\x98\x7f\x2e\x7b\xe6\x9f\x1b\xff\xa3\xb3\x84\xdd\xcd\x9e\x4d\xa6\x86\xc7\x86\xcf\xbf\x68\xd6\xe3\x9d\xc6\x9a\x2e\x8b\xc8\x22\x24\x53\x1e\x02\xd1\xa0\xc9\xea\xf8\xce\xea\x48\x12\xae\x84\xf7\x05\xa4\x9a\x3e\x42\x10\xd4\xcf\x1a\xf4\x56\x4d\xab\x97\x85\xcc\xc2\x08\x0e\x77\x45\x5f\x69\x58\x69\x76\xb2\x76\x96\x75\xe5\x66\x93\xa3\x66\x5b\xb8\xc4\xbd\x21\x7f\xf9\xd5\x5a\x77\x17\xb0\xa6\x5d\xb5\x0b\xc5\x37\x89\x1b\x72\x1b\x11\x94\xed\xf8\x9c\x44\x5d\xcd\x13\x79\x8d\x66\xe7\x90\xb6\xbc\xb1\x6b\x18\xa3\x18\x9c\x3b\x78\x63\x97\xad\x33\xdd\x24\x03\xe5\x80\xcc\x2d\x23\xc2\xe0\xdd\x6a\x6b\x2f\x4b\x8a\xf8\x5e\x70\xe2\x5b\x96\x66\x24\x19\x57\x72\x43\xca\x15\x6c\xc3\x30\x44\x6d\x42\x7f\x0b\xb6\xe7\xf7\xd1\x7f\xde\x29\xfe\xdc\x53\x98\x72\xc6\xfd\x16\x6e\x9b\x49\x2e\x35\xfd\x6b\x6b\x3b\x69\x1d\xb0\x80\xdd\x2c\x33\x95\x62\x1f\x29\x45\x6c\x0b\x3b\x58\x2e\x03\xee\x2a\x74\x27\xbe\x3f\x0e\x21\xe6\x46\x57\x61\x0e\xf9\xe1\x30\x30\xd5\x01\xf3\xf1\x03\xd2\x7d\xe6\x2f\x67\x66\xa7\x26\xef\x03\x0c\xc3\x84\x7b\x4b\x7e\x1d\x8d\x3d\xcb\x9f\x4d\xe2\xcb\xf0\x99\xf0\xdb\xed\x1b\xfe\xed\x9a\x7f\x9b\x76\xba\xd1\x8c\x7f\xf4\x27\x2e\xf6\xac\x9b\x7d\x42\xad\x9b\xfd\x8c\xc8\x47\x5e\x7d\x3a\x4d\xab\x36\xcf\xe8\x77\xa5\x34\xb5\x74\xff\x5b\x93\x90\x5c\x5d\xe6\xe5\x5c\x9f\x5c\x27\xbf\x0a\xe1\x36\xe0\xbe\xbb\x95\x3f\xc9\x27\x10\xef\x1e\x19\xed\x63\x0a\x08\xc1\x52\xe3\xaf\x50\x92\x21\x1d\xee\x1e\xf3\x6a\x54\x2a\x92\xd9\xd5\x14\x32\x9c\xa8\x91\x23\xc4\x49\x9d\xf4\x72\xc9\xcf\xfb\x62\xd4\x50\x52\x9f\x66\x3d\xa7\xc4\x24\x1c\x04\xe1\x24\x9c\xa8\x02\xcd\x3a\x5f\xc3\x71\x8d\x92\x19\x34\xe3\xf4\x6b\xb4\x35\xae\x51\x97\x34\xeb\x4e\xd0\x30\xfd\x31\xdd\x12\x07\x38\x6a\x08\xe9\xb8\x1e\xb2\xb4\x21\x2f\x74\x87\x07\xa4\xe5\xae\xee\xcd\xc7\x06\x66\x8d\xb4\xbb\xe6\x63\x43\xcb\xd8\x6b\x64\xd9\x90\xe1\x41\xcb\xe3\x91\xd3\x7c\xe5\x7e\xdf\x13\xee\xf7\x4b\xb6\x2f\x04\x6d\xc5\x61\x9f\x72\xfb\x6c\xe1\x3d\x3f\xfd\xf2\x98\xfd\xb2\x9f\x7e\x19\x55\x57\xa2\xfe\x34\xba\xa4\xbf\x6a\x92\xc7\x46\xde\x85\xa5\xc8\xf0\xfd\x89\xfe\x77\x57\x97\x13\xc9\xf0\x89\x3b\x4c\xcc\xb3\x23\xe4\xc4\x0d\x75\xe6\x61\x40\xfa\x7f\xa2\x24\x81\x87\xf2\x47\xf4\x4b\xb7\x9b\x0c\xef\xfc\xf0\xdc\xfc\x3b\x46\x3e\x93\x7d\xf0\x5a\x17\x90\x9e\x42\x3c\x8c\xf0\x5c\xd6\x41\x3e\x9c\x24\x5e\x6b\xec\x9a\xaa\x8b\x3c\x7a\xa6\xea\xe0\xb2\x6e\x7a\xb8\x5d\x43\x60\x6d\x16\x7d\x4d\x11\x55\xf4\xd5\x14\xe1\xfb\x55\x37\x1f\x19\x95\x5e\xa7\x19\xed\xce\x0d\x4b\xcc\x3c\xd1\x3f\x0e\x48\x5f\x9d\xb8\x15\xb8\xd4\x04\xa9\x98\xc3\x6a\x64\xbc\x4a\x56\x61\x34\x30\x8c\x42\x5f\x3b\xa1\xb9\xcf\xe6\x00\x43\x41\xe1\xac\x59\x07\xc0\x49\x4d\xf9\xeb\xa2\x04\x80\x2c\xc5\x23\x3e\xf7\xf0\xc2\xad\x04\x87\x0f\x1b\x97\x25\xd4\x30\x3c\xc3\xd0\x97\x89\x1b\x3e\x47\x5f\x7f\x31\xab\xea\x45\x7f\x0d\xba\xf9\x1d\x2f\x68\xd7\x8b\x34\xe8\x3f\x5f\x27\x8a\x55\x18\xef\x42\xc1\x37\x8c\x01\xbf\x6b\x12\x6b\x96\xd2\xfc\x29\x0d\x11\x37\x34\x8f\x5d\xec\xd9\xc7\x9e\x90\x73\xa8\x2b\x44\x90\x63\x16\x08\xf4\xc4\x87\x0b\x96\x23\x56\x61\xbb\x86\x03\x70\x1e\xc7\xfa\xe4\x23\x1c\x20\x2a\xfb\x20\xfc\x61\x7b\x9a\x33\x1c\x94\x99\x67\x61\x9b\x0e\x9e\x7f\xf9\x6d\xf4\xa6\xe0\x7e\x2d\x72\x86\x0a\x62\x21\xe1\xb1\x84\x54\xdc\x8b\x6c\x58\x8c\xfe\x98\x3a\x41\x18\xd1\x79\x3c\xb3\x75\x18\x0b\xcf\xf5\xa8\x03\x39\x32\x7f\xbe\x29\xb5\xfa\xd7\xba\xd0\x1f\x53\x59\x61\xf9\x23\x6f\xdc\x93\x09\xfb\xb9\x4d\xd6\xfe\x59\x6f\x32\xf7\xe6\xa7\x3b\xd6\x69\xc0\x81\xb6\x26\x51\x43\x03\xe2\x20\x49\x1e\x1b\x20\x21\x56\xd7\x76\x27\x0c\x1c\x56\xf7\xe6\xa0\x81\x19\xc6\x6d\x92\x01\xa0\xa2\xb6\x97\x17\x58\x0c\x4a\x2c\x63\x27\x63\x96\x4c\x2b\x82\x14\xad\xc6\x26\x67\xf4\x4e\x72\xd4\xbd\x96\x31\x67\xe3\x37\xc8\xe3\x01\x1b\xa6\xdf\xce\x6e\xb5\xb5\x79\xfb\xd3\x56\x24\x02\xa3\x9b\x35\xd2\xa1\x9c\xd1\x5f\xd0\x79\xdb\x47\xcf\x44\xd6\xf0\x41\xc8\xdc\x59\xa5\x3a\xb2\xfe\x68\x9b\x69\x19\xa4\x17\x89\xbe\xa6\x45\x60\xc2\x33\xbb\x53\x8c\xc6\x6f\x2b\x2e\x2b\xb3\x23\xd3\xcf\x29\xcb\xf4\x13\xc1\x85\x04\xca\x2e\x3f\xaa\x09\x48\x2a\x72\x30\xee\x20\xe6\xb4\x23\x38\x30\x7e\x1c\x33\x0e\x18\x1e\x7b\x63\x8a\x50\xe5\x8b\xfd\x12\x9b\xca\x95\xf0\x17\x84\xb9\x4c\x03\xd9\x30\xbd\xd5\x38\x63\xc8\xb2\x46\x25\x6e\x30\xe2\xdc\xff\x8e\x88\x6a\x6c\xcd\x3c\xea\xc0\x5f\x2e\xcb\xe7\xd7\xa5\xe3\x2e\xf7\x02\x89\x0c\xe3\xaa\x67\xfa\x58\xf8\x09\xd4\xbc\x1b\x22\x19\xfe\x67\x05\x5d\xf8\x3e\x5a\x8b\xd8\x91\x4f\x7a\x00\xd9\x21\x03\x76\x96\x74\xfa\xa3\x52\x28\xf1\xc1\xdc\x3d\xae\xd5\x34\x1b\x6e\x15\xf2\x5e\x96\x56\x8c\x70\xe8\x6e\x25\x1c\x06\x29\xe1\x00\x80\x9f\x2f\x6c\xf6\x52\xb2\xb5\xf2\xe3\x89\xda\x9e\xa2\x52\x2b\xb7\x4f\x94\x77\xeb\x78\x96\x67\xbb\x3e\xd4\xb6\xe2\xee\x65\x36\x62\x65\x92\x04\x1c\x11\xb3\x07\x0e\xd1\x5f\xc9\xc7\x3f\x12\x33\xa8\x1c\xec\xdb\xe5\x83\x7d\xb6\x2f\x87\x0d\xbc\x2b\x2c\x04\x46\x0d\x3c\x6e\x38\xe3\x06\x19\x35\xa4\xaf\xd2\x49\x83\xcc\x7b\xce\xa4\x61\x18\xe6\x5e\xb9\x40\x26\x8d\xd6\x38\x70\xcd\xf7\x27\xdd\x49\x18\x0d\x97\xef\x51\x92\xe8\xc9\x47\xb4\xdf\x1d\x0c\x59\x6a\x26\x77\xf7\x6b\x67\x38\x08\xd7\x33\x77\xbf\x0e\x83\xf7\xa8\xc2\xda\x2a\xd9\xd9\x0f\x94\x7d\x18\x6f\x7c\x38\xea\x4c\x86\xfd\x8d\x7a\x0e\x07\xc1\x64\xd8\x0d\x58\xb2\x4c\xba\xa1\x11\x9d\x74\xdf\x23\x41\xb4\x4f\x6b\x94\x8c\x1a\x78\x56\xa3\x64\xdc\xd0\x42\xd8\x34\x78\xb0\xc4\xa9\xa2\xda\xa6\x80\xa0\xa6\x6f\xd1\x4a\xf7\xb5\x2d\xda\x07\x6b\x74\xdc\x9f\xb6\xc4\x03\xa0\x2e\x00\x0a\x69\x12\x43\x48\x3c\x2c\x83\x1c\x09\xf2\x6e\x0a\xc0\x37\x5a\x8b\x3a\xba\xda\x46\x9a\x41\x76\x1d\x54\xc5\x95\xd1\x23\xe3\x37\xac\x07\xe0\x76\xc4\x99\xdc\x3a\x77\x35\xc4\x75\xc2\x99\x6b\x47\x92\x63\x92\x96\x1f\x81\xe6\x0c\xa6\x82\x53\xd2\x69\xb4\x4d\x25\x2f\xde\xfc\x1a\x51\xa4\xa1\x4a\xd6\x24\xdc\xb7\x3d\x05\xc4\x77\xa8\x75\x5b\xe5\x42\x8a\x87\x3e\xe8\x64\xfd\x72\xdb\xfc\x9c\xe8\x4a\xac\xdf\x05\x17\xdb\xf9\x1b\x3b\x3a\xe4\xd4\x22\x7d\x5c\xeb\x2c\x05\x57\x06\x77\x23\xee\xe4\x9c\x82\x47\xad\x1f\x17\x9c\xd1\xec\xcd\x73\x49\x4b\xae\x1e\xa5\x2b\x31\x14\xe3\x3e\xd5\xb5\xcf\x8a\xfd\x3e\x75\xa8\xf5\x30\x31\xfd\x4a\x68\x07\xb8\x50\x30\x3d\xa3\x8c\x90\x4c\x0b\xec\x90\xa7\xed\xa3\xed\x0a\x15\xbb\x23\xfd\x58\x9d\x09\x80\x9c\x35\x30\x83\xc4\x76\xd7\x9c\x01\x40\xce\x72\x01\x72\x13\x2e\xe0\xf2\x93\x9d\x58\x20\x92\x21\x7b\xfb\x7f\x7c\x74\x28\x3b\x2b\x0e\xf6\x21\x59\xe9\x78\x08\xa2\xe7\xbe\x86\x5f\xdf\x03\x77\xf4\xde\xce\xa1\xee\x83\xee\x94\x7a\x71\x18\xd8\x05\xa1\x12\x86\x67\xdd\x59\x1c\xda\x1c\xb8\x92\xe4\x0b\x5e\xd0\x78\x1e\xda\x1c\xbc\x92\xe4\xcb\x0a\x53\x38\xa3\x93\xe4\x0b\xda\xea\xd3\x6f\x47\x59\x2b\x26\x89\x78\x3c\x8e\x40\x09\xfd\xcc\x25\xe4\xbe\x26\x9d\x5a\x4e\xb8\xc7\x61\xf0\x6f\xf9\xcc\xf1\xf0\x06\x14\xfe\x6c\xc0\xec\x9c\xe1\x36\x8f\xda\x19\x1e\x9e\x9b\x65\xe4\x3c\x43\x8c\x49\xa4\x22\xf0\xe7\x92\xf8\x39\x5a\x73\xe2\x56\x8a\xab\xcb\xb5\xe1\xaa\xa6\xab\x64\xf2\x5d\x21\xe1\xef\x6e\xea\x7d\xa9\xc1\xb7\x55\xf4\xc2\x9b\x01\xcf\x99\xa3\x25\x05\xdd\x39\xf2\xd7\x50\x01\x57\x79\xe1\xf4\x44\x99\x10\xcf\x30\x5e\x96\x26\xf7\x58\x94\x25\xa7\xf4\xf6\x86\x81\xbb\x49\x33\x89\x5d\xd1\x5e\x9a\x72\xa0\x0c\xa3\x69\x22\xaa\xb9\x92\xdc\x65\xe8\x3b\x2f\x49\x66\x8a\xbe\x5b\xdd\x9b\x73\x49\xd4\xcd\x73\x89\x3a\xfd\xa4\x7c\x0a\xb6\x92\x6e\x4f\x81\x54\xcb\x06\x02\xe9\x84\xea\x57\x38\xab\xb5\x1d\x9f\xad\xb5\xc3\xc3\xa9\x3d\x6e\x56\xda\xa1\x99\x4a\xe9\xe3\x7a\xa5\xb7\xd5\xfc\x42\x1b\x58\x41\x7c\x83\x6a\x7a\x73\x9d\x30\xc8\x5c\x87\xcd\xd7\xae\xc3\xf4\x8b\xae\xa7\x20\xf3\xda\xc9\x09\x39\x35\x5f\xbf\x76\xe5\xca\x7d\x52\x58\xb3\x79\x85\x2a\x6f\xe0\x25\x44\x2a\x25\xf4\xbb\x47\x61\xa2\xfb\x53\xe1\x0b\xdf\x5e\xd5\xd3\x24\xd1\xec\x38\x79\x62\xed\xb4\x92\x92\x46\xb6\xfa\x0c\xd4\xce\xee\x68\x1b\xb5\x33\xcf\x11\x93\x2c\x1a\xe9\x1d\xd5\x0f\x42\x57\xed\xae\xb9\x00\x98\x59\xbc\x75\xce\x8a\xfc\x7a\x64\x94\x86\x82\xdb\x00\xc2\x99\x54\x18\x75\xc0\xd8\xb2\x7c\x42\xef\x2d\xc9\xc5\x46\xf8\xa1\x75\xb5\xea\xb7\x30\x17\xf7\x44\xfa\x1f\xe9\x3d\xfb\xdc\x07\x50\xa1\x8c\x43\x02\x5a\xc9\x4e\x68\x18\x0f\x66\x98\x09\xec\xe1\x11\xe2\x57\x02\x46\xf4\x48\x06\xe4\xa9\x24\x35\x0d\x85\xb0\x31\x48\x12\x81\xb8\x9c\xb9\x92\xbd\x60\x29\x70\xf0\xd6\x4e\xed\xa7\xd2\x06\x62\x61\x6d\x14\x27\xd5\x0a\xb5\xae\x28\x63\x6e\x6c\x48\x18\xf5\x69\x85\x5a\xfd\x73\xf3\x7b\x5b\xa4\x54\xfb\x94\x8d\xa5\x7f\x6e\x5e\x77\x32\x8a\xbf\xf3\x54\xe6\x00\x2c\xbe\xd2\x2b\x12\x5c\x7e\xe8\x04\x86\x11\xb4\x1e\x43\x97\x10\xdf\x41\xaf\x21\x09\x5a\x81\xef\x8a\xf0\x9e\x01\xb7\xfc\xe4\xb6\x27\xd4\x7a\xfa\xc7\x0c\xc0\x10\xd3\x8c\xac\x31\x09\xb0\xba\x8a\x8b\x44\xf7\xb0\x67\x2d\xa8\x19\x21\x1c\x59\x75\x0a\x1e\x90\x80\x2d\x0f\x5a\x5e\xe0\x1a\x46\xad\x6b\xc2\x13\x2a\x90\x2f\x49\xc2\x79\xf5\x00\x39\x01\x09\x57\xab\xa6\xf5\xf4\x4f\xde\x1a\x72\xb5\xaa\x3c\xd4\x2e\xd4\x02\xb8\xce\x6f\x09\x57\x7b\x5c\x95\xd0\xa4\x56\xa7\x1b\x84\x27\xe0\x27\xb0\x50\xca\x5c\xd0\xde\xf5\xf8\xad\x22\xf8\xb2\xe0\x78\xf4\xbf\x51\xab\xf4\x7e\x59\xad\x12\x53\x6b\x3e\x35\x11\x21\xdf\xdb\x15\x8f\x2d\x9b\xed\xb1\xa5\x72\xa5\xd2\xb6\x50\x3c\xf4\x8a\x93\xaa\xae\xe9\xa8\x56\x6f\xb9\x45\x5f\x8c\x5f\x0b\x10\x2f\x49\x16\x1c\xbd\xf3\x94\xd8\x23\x34\x49\xae\x3b\xab\x7b\x73\x29\x95\xb8\x96\x62\xd7\x9e\x29\x3b\xe9\x5a\x24\x9f\x94\x5e\x57\xec\xe9\x1e\x9e\xf5\xb0\x29\xf7\xfb\xfc\xf7\x32\xe2\x26\x8e\xb1\x72\xb2\x76\x3b\xe0\x3a\x5d\xdf\x06\x22\x82\xca\x48\x7a\x7f\x6b\x4c\x64\x9e\xed\x5a\x5b\x67\xf7\x4a\xdd\xe5\xbf\x56\xdf\x32\x15\x72\x45\x3f\xd7\xe4\xda\xae\xc8\x45\x4d\xb4\xa9\xc9\x25\x94\x0c\xb6\xc6\x89\x54\x4a\x4e\xff\x99\x52\xd1\xaf\xe9\x14\x6d\x3a\x54\xca\x36\xad\xab\x14\x09\xd5\x20\x42\xbe\xc9\x1b\x4c\xf0\x6d\x9a\xe3\x0d\x79\xb9\xa1\x28\xb4\x35\xdc\xe1\x42\x21\x2b\x85\xca\xd6\xdc\xc1\x88\x9e\x28\x25\xa3\x99\xf4\x14\x20\xba\xa0\x9c\xc4\xea\x3e\x66\xf0\x4c\xf8\x54\x6d\x36\x55\x52\x57\x9c\x82\xcb\x53\x95\xd4\xbe\x14\x21\x50\xd2\x5c\x6d\xe1\xc0\xb5\xd9\xa1\x2a\xed\xe8\x58\xb8\xf6\xe2\x69\x14\x9f\x4a\x67\x3b\xa0\x0e\x04\x11\x8b\xf0\xb7\x33\x9e\x76\x2b\x33\xb5\x4e\xa7\x2c\xf1\x7c\x8a\xcf\xa6\xf8\xfc\x58\x28\xd4\x7d\xef\x48\x7e\x6c\x31\x31\x91\x61\x3c\x69\xaa\x51\x3a\x3a\x7d\xda\xaa\xa2\x04\x67\xbc\x57\xe1\xfa\x44\x97\x6d\x4c\x85\xbe\x53\x80\xaf\x6a\x8c\xce\x5e\x72\x32\x74\xf2\xd5\x44\xb8\x7a\x8a\xa9\x75\xdf\x45\xb6\x50\x0a\x52\xd9\xe1\x4d\xe5\x5f\x78\xeb\x05\x36\x94\x86\xf8\x3c\x45\xe6\x9e\xbc\x12\x8e\x3b\xe2\x2c\x8a\x3b\x70\x23\x26\xd3\xf9\x6e\x5d\x36\xd6\xdd\xe8\xac\x11\x45\xcb\x5f\xd2\x11\x52\xdb\x50\xd7\x70\x14\xad\xf2\xdf\xc6\x44\xf8\x6e\xba\x57\x61\x84\x9a\xcd\xad\x36\x49\xcb\xd3\x1c\x4c\xba\x90\x96\x31\x10\x29\x86\x1d\x48\x7b\xe5\xcf\x5c\x49\x94\xef\xfb\x48\xae\xc2\x73\x43\xf4\xd6\x37\x0c\x5f\xdc\xe3\x3a\x22\x0f\xf1\x1c\x2d\x83\x98\x0a\xc3\xf0\xe5\x0d\xab\x30\x34\x55\x41\x73\xd8\xfc\xf9\x05\xa2\x9e\x19\x4d\xe7\xe3\x8f\x1f\x50\xc5\x87\xf9\x2c\x09\x6d\x4c\x35\xbd\x68\xa5\x29\xf0\x08\x01\x28\xeb\x31\xd7\x05\xad\x5f\x99\x1e\xee\xd6\xb0\x4a\x62\x94\x06\x9b\x8d\xd3\x66\xf6\x34\xe3\xce\x49\x65\x47\xe5\x7c\x03\xd6\x4d\x75\x4b\x81\x13\x8e\x27\xfc\x3c\x6c\x76\xb2\xe8\x4c\xfa\x9d\x41\xa9\xc3\x19\x36\x80\x4c\x8c\x49\x59\xef\x26\x94\x60\xb9\x7c\xbc\xf2\x1f\x6b\x95\xeb\xce\x53\x61\x5a\x64\x76\x4e\x3e\x02\x1b\x9f\x83\xb1\x66\x6d\x99\x95\xc1\x5f\xf6\x30\xe6\x1b\xc6\x30\x74\xfb\x99\x8a\xc7\xaf\xb5\x6d\x75\x87\xdd\x64\x3b\x77\x03\xe2\x01\x9a\x41\x72\xd9\xc9\xd1\x21\x72\x66\xf6\xab\x97\xfa\xb1\x11\x00\x89\x52\xcd\x70\xb5\x5e\x1c\x9c\x80\xf0\xe1\x44\x11\xa3\x04\xe1\x76\x62\xa7\x2b\x90\x72\x63\x22\xf5\xb2\xad\xc6\xa4\x15\xb8\xca\x05\xb3\x47\x3c\xf0\xd9\xe3\x29\x9f\x3d\x1e\x92\x62\xea\xd6\x99\x2b\xe4\x4a\xa7\x53\xdb\xb3\x28\x44\xc8\xd5\xc4\xcd\xdf\xce\x6c\xcf\xfa\x3e\x5a\x4b\x3d\x67\x79\x7b\xc3\xb5\xd4\x33\x96\x3a\xfb\xb2\x9e\xf7\xd8\xf6\xac\xf1\xb9\x29\xef\x1d\xe6\xeb\xa2\x86\xec\xfd\xf2\x06\x9e\xe0\xf8\x60\x0b\x30\xfc\xe4\x72\x39\x73\xa5\xcc\xdd\x6d\xc9\xd0\x89\x83\xb6\x52\xda\x3d\xbb\xff\xc5\x5b\xe7\x4d\xce\x87\x43\x89\xda\xb5\xdc\x7b\xa5\x54\x05\x63\x1d\x03\x4d\x30\xf6\x64\x2a\x65\x69\x6d\x14\x60\xbd\x22\xb2\xcb\x81\xc9\x42\xe9\xbb\x49\xb3\xd1\xec\xe1\x86\x3f\x49\x84\xd5\x3e\x68\x00\xb0\x9f\xc9\xd8\x4d\xc3\xd6\xab\xf5\x05\x77\x41\xfc\x16\xe9\x93\x2d\x61\x8c\x1d\x1d\x48\xc1\x36\xb7\xde\xd2\x83\x8a\x15\xca\xfa\x0a\x1e\x7c\xb4\x97\xca\x80\x44\x4f\xff\xc3\x7e\xce\x4d\xff\x53\x35\x14\x7b\x84\x5c\x77\xd0\x8b\x9c\xa0\xed\x6d\x7c\xca\x94\xf9\xde\xe6\xdd\xeb\x74\x4c\x54\x39\x14\xa5\xed\x9f\x57\xf3\xa1\xb4\xde\xf4\xe1\xcf\x9b\xfe\x6b\x7b\xd3\xb2\x45\xfb\xdd\x9b\xf5\x64\xef\xbf\x0a\xe5\x55\x7a\x68\xa4\xdc\x6a\xf6\x40\xf6\x2c\x19\x08\x00\xfc\x21\xb2\x1f\xe2\x09\x37\x88\x0e\xb5\x1a\x13\x08\x20\xd0\x98\x90\xd7\x15\x7f\x6f\xf9\x2e\xd8\x17\x6c\x44\x36\x86\x93\x70\xb1\x29\x61\xca\x09\x6b\x4c\xad\xef\xd3\x84\xec\x3b\xfc\xf7\xe3\x07\xa1\x92\xc3\x29\x09\x78\xfc\x36\xa0\x49\xa2\x4b\xba\x94\x24\x0c\x9a\xe9\x3d\xaf\x4b\x8e\xd6\x02\x05\x6b\xf4\x98\xe3\x7d\x96\xe7\x9f\xd4\x06\x8a\x8a\x45\xd8\x45\x6f\xc7\x75\x15\x0a\xb0\x50\xe4\xa9\xca\x4d\xd1\xc4\xac\xa9\xa3\x16\x39\x7b\xe5\x82\x70\x3b\x20\x5b\xa9\x98\x54\x9c\xa9\x58\x3b\x93\x6c\xff\xf3\x7a\x2f\xf6\xf6\x90\x03\x46\x8d\x5c\xe2\xe5\x03\x7f\x2d\x10\xa7\x61\xc8\x50\xb1\x8d\x09\xf6\xe1\x10\xa4\x84\x8d\x9d\x31\x81\x59\x99\x34\x9f\x9a\x12\xca\x44\xcf\xcd\xfa\x7c\xd7\x89\xe6\x18\x58\xe7\xfe\xf9\xaf\x93\xf6\x8c\x4b\xfa\x7f\xa6\x58\x2b\x29\x70\x9a\x73\x0d\x69\x76\xc0\x1f\xb1\x98\x47\x41\x68\x36\x52\x2e\x06\xab\x33\x53\xd4\x82\xb0\x68\x90\xeb\xc9\xf1\xc4\xca\xd1\x98\xda\xd5\x71\x1a\x8f\xf6\x97\x74\x6f\x77\x44\xdd\x79\x8a\xb7\xe2\xd3\xc6\x90\x4e\xec\xf6\x09\x28\x5c\x08\x0f\x9b\xc0\x13\xe2\x7c\xae\x61\x14\xd0\x8a\x10\x99\xc1\x8b\xcd\x25\x16\x25\xb4\x02\x87\x9b\x79\x65\xf8\x31\x92\x8a\x36\xa0\x1c\x44\x7e\xc5\xf2\x88\x52\xcd\x96\xb7\x4f\x1a\x4d\xa7\x6b\xc3\x80\x37\x3b\xfa\xfb\x7d\x60\xdb\xd7\x8c\x70\xc4\xc9\x75\xbf\xaf\xed\xb7\x27\x6d\xbf\x89\xaf\x52\x3a\xa9\x2d\xcf\x7a\x47\x38\x61\x17\xad\x53\x65\x7c\xc7\x31\x12\x80\x0d\x96\x2b\xd9\xd9\x7b\xe5\x74\xff\xc8\x83\x4e\x6c\xb3\x1c\xf5\x63\x79\x7c\xa7\x1b\x35\xc3\x95\x3c\x37\x32\xb2\x0b\xd6\x16\x23\x8f\xb5\xf0\xc1\xdc\x52\xad\xda\xc8\x5c\x25\xa7\x8a\x9e\x26\x2d\x96\xd1\xff\xe7\xaf\x30\x85\x13\x7c\xaf\xac\xc7\x10\xde\x5a\x96\xee\xed\xc9\x4d\x5a\xfa\x9b\x56\xfc\xbd\xb2\x4d\x57\xb8\xa4\x95\x3d\x6c\xfc\x6a\xb3\x99\xee\xbe\x6c\x2b\x96\xdf\xe2\x5a\xe9\xaa\x12\x9a\xf8\xa4\xf4\xb7\x5f\x81\xb0\xd8\xd4\x8a\x3b\xc8\xf6\xa5\x25\x31\x0c\xd3\xf1\x09\x70\xc3\xe0\x41\x26\xb5\x1c\x0c\x49\xc9\x09\x3f\x93\xc0\xd1\x04\x5f\x91\xc9\xb5\x56\x22\xc3\xa0\xd6\x4b\x48\xcd\x08\x31\xa8\x6f\x97\x4d\x79\x4b\xb8\x0a\x8b\xc5\x6c\x85\xab\x55\x93\x65\xcd\x97\x2f\x01\xd9\xa4\x4c\xf7\x3d\xae\x0c\x04\x4e\xe5\xcb\xb9\x2b\x9f\xd1\x36\x3e\x12\x17\x4f\x47\xea\x26\xf4\xa8\x81\x9c\x23\xb8\xaf\xce\x95\x58\x75\x32\xea\x20\xb5\xfc\xcb\x02\x3f\x49\x8e\xc4\x65\x81\xf4\xac\xe2\xb7\xcd\xb2\xa6\x6e\xdc\x36\xf7\x33\x6f\x1f\x32\x6f\x07\xda\xc7\x21\x29\xaf\xee\xcd\x1a\xbf\x6e\x08\x1a\x66\x67\xeb\x85\x7b\x2d\x47\x04\x7d\x2c\xc6\x77\xac\xc6\x77\xdc\x40\xce\x31\x8c\xef\x97\x84\xc7\x3e\x97\xb6\xf0\x12\x3f\x97\xfc\xc2\xbd\x13\xc8\x8a\x6b\x8a\xa9\xf4\xa4\xfb\xe1\x47\xb0\x09\x8f\xb9\x14\xb7\x17\x9b\xbe\x10\x6a\x82\x60\x37\x6d\x4d\x93\xe4\x8e\x96\x26\xb4\xac\x8f\x78\x25\xfb\x9f\xbb\x3e\x51\x4d\x8f\x1f\x2c\x04\xe7\xda\xe2\x70\xc7\x0c\x49\x72\xfc\x7f\xbb\x3e\x27\x7c\x7d\x4e\xa0\x63\x59\x61\xd1\xc9\xba\xb0\x28\xcf\x1d\x70\x78\x81\xe0\x82\x21\xaa\x6d\x59\xdc\x93\x86\xbe\xac\xa7\xd9\x9b\x85\x24\xb9\x79\xa2\xab\x7b\xf3\xb4\x81\x17\xfc\xfa\xf4\x14\xee\x19\x4e\x85\xc4\xf2\x4d\xa1\xfe\xc5\x88\x26\xc9\x29\xeb\xe4\x43\x67\x4d\xfd\x23\x5f\x90\x4c\xe5\x02\x57\x78\xc7\x6c\x28\xfc\xf4\xcf\x5a\xe1\xe9\x74\x0d\x58\x44\xf1\x51\xac\x22\xdf\x6c\x95\x0b\x87\xb5\x1c\x39\x35\x34\x73\xde\xcf\xba\x42\xe7\xa2\x6b\xd0\x34\x08\x4e\x71\xbd\xf3\x1f\x4d\xe3\x59\x43\x52\xa8\xaa\xd2\xeb\x0e\xa3\x14\x4e\x05\x74\xc8\x43\xeb\x66\x00\xc7\xc9\xbd\x79\xd6\xc0\x4b\x98\xda\x33\x31\xb5\x93\x73\x2e\xa9\x3d\xf6\xe8\x1b\xa1\xfa\x38\xf8\x7b\x26\x02\x08\xdf\x98\x9d\x94\xcc\x82\x3c\xd3\xa9\x3a\x9b\x14\x5b\x95\x71\x0c\x99\x72\x88\x8e\xf7\xd9\x07\xdf\x90\x7a\x3c\xd7\xa7\x48\xe8\x21\x0a\xce\x2d\x60\xad\x01\xcf\xc6\x9e\x74\x6e\x2d\x25\x77\x9c\xa6\x75\x98\x73\x97\xb8\xa0\x9c\x84\x04\xca\x70\xb1\xb6\xa0\x90\xa3\xf7\x2c\xb5\x46\x41\xea\x1c\x6c\x95\xc9\x3e\x45\xe2\xfa\x21\xcc\x71\xa9\xb3\xa3\x46\x04\x8a\x5f\xcb\x4d\xbd\xae\x96\xbb\x29\x65\x85\x48\xf1\x47\xc2\x59\x56\x4a\xe4\xbe\x3b\x7b\x53\x41\xf5\x9a\x9d\x57\x49\x92\x89\x79\x57\x92\x7e\x76\x54\x52\x48\x28\x8e\x88\x87\xdb\xa4\x19\x9b\x01\x72\xc2\x9d\xee\x60\x3a\xa3\x03\x9f\xcd\xe8\x65\x8f\xfb\xf9\xb2\x9e\x71\x48\x42\x6b\x09\x91\x74\x02\x1c\xb4\x6e\x02\xb7\x68\x86\x7b\x6d\x6b\x89\x70\xd0\xba\xf7\xdd\xa2\x19\xed\xb5\xad\x67\xb4\xd9\x24\x98\x6e\xdd\xbc\x41\x62\x5e\x9b\xa8\xd2\xd4\x1c\x4d\x73\xa3\x73\xb4\x49\x50\xb3\xf3\xc7\xf4\xc8\x59\x63\xdd\x2d\xb7\x70\xe5\xac\x91\x63\xf0\x30\x39\xdf\xb0\x7e\x10\x14\x99\x47\x19\xe5\xca\x95\xd0\x7c\x50\x42\xab\x08\xf5\x33\x78\xc3\x3e\xa8\x9f\x71\x4d\x5e\x85\xa5\xd1\x9a\x48\x52\xc2\x4e\x5e\x33\xa2\x10\xeb\xaa\xd5\x6c\xae\x61\x8c\xfc\x23\x9e\x4f\xc0\xb1\x07\x4a\x11\xdc\x0b\x0e\x84\xcb\xc8\x9c\xf6\x9b\x72\x7e\xdd\xc7\x33\xdc\xda\x3b\xbe\x16\x18\x43\xca\xa8\x84\xea\xb8\xe3\x93\xbb\x9e\xe9\x5b\xe3\x08\x7f\xc5\x01\xd6\x9c\x1f\x04\xc4\x6f\x5d\xb8\x98\x53\x32\x81\x13\x16\x8b\x68\x5e\xa3\xe2\xbc\xc2\x7e\x2b\x74\x91\x03\xa3\xc9\xc4\x68\xc8\xd1\xc2\xfb\xff\x59\x7b\xf3\xee\xc4\x75\xe4\x61\xf8\xff\xfe\x14\x24\x6f\x7e\x5c\xab\x11\x8e\x21\x64\xc3\x51\x73\x92\x90\xa4\xb3\x42\x92\xee\x6c\xbe\x9e\x39\xf2\x82\x21\x80\x21\x6c\x81\x04\x9e\xcf\xfe\x1e\x95\x24\x5b\x36\xa4\xe7\xce\xf3\xfc\xce\xcc\xed\x60\xad\xa5\x52\xa9\x54\x2a\x95\xaa\x38\x3c\x3f\x97\xcc\xec\x4c\x76\x30\x49\x13\xb6\x8b\x3e\xe1\xd1\x92\x3e\xea\xb1\xf9\xd0\x2f\x0d\x92\x70\x34\x98\xd4\x1b\x35\xc1\xbd\x0a\x71\x85\x2a\x46\xde\x33\xc4\xdb\xe8\xb7\x25\x61\x1a\xe0\x38\x4b\x84\x95\x80\x93\xad\x22\x61\x47\x76\xf0\x0c\x5f\xa9\x98\x13\x2e\x5b\x14\x60\x81\xfe\xd8\xd1\x28\x5b\x2c\xbd\x2e\xfb\xdb\x20\xae\x3e\xcd\x7b\xfa\x34\xef\xf3\x28\xc0\xae\x3e\xcb\x7b\xfa\x2c\xef\x43\x68\x5e\x8f\x50\x6b\xc3\xb3\xf3\x8e\xf5\xe2\xda\xe0\x20\xfb\xca\xb5\x71\x40\xa8\x75\x06\xa1\xa7\xfd\x1c\x8f\xd1\xdb\x10\x6e\xd2\x1b\x79\x8d\x5a\x97\x50\xe1\xd0\xb1\x11\x36\x10\xc2\x01\x09\x44\x29\x57\x94\x72\xf3\x1e\xe4\xf0\x17\x2a\x97\x6d\xcd\xc7\x01\x3b\xf7\x0f\xdd\x41\xaf\xd3\xb9\xf2\x1b\x23\xe2\xe8\x53\x73\x04\x26\x1f\xfa\x0c\xa9\xbe\x36\xce\x85\x7c\x74\x1e\x19\x1e\x9d\x03\x7b\x3f\x17\xec\x7d\xd5\x1c\x46\x96\x43\x5e\x35\xc7\x77\x07\xf5\x82\x7d\x81\x13\x6f\x07\x84\x60\xb3\x51\xd7\x96\x5e\x0a\x70\x8c\xaa\x46\x6b\x5f\xba\xb0\xfa\x83\x41\xde\x9f\x1f\x11\xf0\x87\x04\x8f\xfa\x46\x7d\xf5\x66\xcc\x83\xaf\x78\xd5\x9c\x16\xc9\x5f\xb9\xf1\x11\xc2\xab\xd2\x47\x47\x08\xd3\x3f\x5d\xbd\x29\x56\x02\xab\x9e\x2e\x7c\xc0\xba\x61\xac\x56\xfc\x92\x16\xc6\xe6\xa8\xfc\x29\xe3\x05\xe9\xe1\x8d\xe6\x24\x98\xb1\x80\x49\x58\xc7\x0a\x7b\x79\xe1\xf4\x49\xd6\x70\x93\x06\x6b\xa3\x23\x1c\x17\x45\xec\xf4\xb2\x66\x44\xda\x66\x97\xac\x15\x16\xae\x78\x24\x21\x27\x27\xf5\x46\xe2\x83\x49\xa4\x96\x5b\x8d\xa5\x52\x3b\x9a\x90\xf3\x2f\x0c\xa6\x56\x6e\xfc\x5e\xe2\xb8\xf0\x21\x55\x6c\xe0\x04\x20\xd6\xa2\x3b\x15\x98\xac\x32\xb5\xaa\xae\x8d\x3d\xee\x26\x0e\x0c\x09\x28\xb8\x2c\x71\x2a\xae\xe5\xb9\x76\xd9\xb5\x5e\xb9\x41\xc1\x16\x21\x6e\x6c\x50\xe0\x13\xd7\x72\x78\xa0\xf6\x6a\x4b\xf3\x11\x21\x35\x44\xb9\xfd\xbe\x70\xb1\xe4\xea\x61\xcf\xf3\x1f\x68\x67\xec\x13\xa7\xe2\x73\x27\x36\xff\xb2\xfe\x1e\xfe\x3d\xa5\x86\x9d\xdb\xc4\x35\x54\x16\xa9\x51\xe2\x06\x4b\x15\x27\x32\x2e\xa7\x0b\x9d\x24\xf1\xd4\x15\x74\x21\x56\xd0\xc5\x0d\x3e\xe7\x2b\xe8\x02\x56\xd0\x85\x58\x41\xab\xe9\xf3\x82\x21\xf1\x59\x41\xa2\xa0\xd7\xd5\xd6\x6e\x82\xe5\xb4\xb5\xba\x8f\xfd\x2a\x76\x20\xa4\x0d\x7f\x67\x01\x8a\x20\x46\x49\xe0\x27\x0a\xa2\x36\xbc\xc1\xb8\x39\x05\x41\x64\xf3\x1b\xd3\xd3\xaf\xa9\x06\xca\xc0\x8b\xae\x16\xbd\xb6\xe0\x50\xac\x98\xca\xaf\x56\x0b\x94\xdf\xa8\x47\xe5\x2d\xe0\xc5\x27\x1f\xb6\x16\xbf\x70\xad\xd5\x35\x07\xd9\xd0\x90\xbf\x2c\x86\x88\x86\x2e\x6f\x54\x9f\x69\xd8\x49\xc6\x6a\x4d\xbf\x1d\x75\xa3\xc5\xe8\xe4\x7a\xb0\x08\x17\x8f\x7a\xad\xbe\xfa\xf8\xb6\xbc\x6e\x87\x47\x08\x6f\x34\xbf\xa6\xd1\x20\x41\xa3\x57\x37\x71\x30\x72\xf4\x39\x4e\x1d\x6b\x2f\x84\x60\xec\xc5\x87\xa1\x9d\x52\x7c\x43\xfd\x5e\x07\x8c\xf7\xf8\x49\x14\x6f\xc7\x0f\xf1\x2f\xba\x9a\x3c\x6a\xbd\xb7\xa9\xe2\xba\xb3\xc1\x27\xe9\x61\xa4\x6d\x1b\x06\x32\xd7\x86\xe0\x37\x77\x54\xa5\xf3\xf9\x79\x5b\xeb\x84\xf0\x1e\x1d\x4a\x76\x0f\x49\xd4\xd1\x51\x8f\x12\x3f\x92\xd3\x17\xcf\xda\xd5\x0d\x1e\x03\xdd\x5d\x09\xba\x63\xa5\x99\x3c\xde\x6b\x0a\xc1\x3c\x15\x30\x26\x7d\x2a\x3b\xac\xa6\x62\xb2\xea\x1b\xd9\xec\xb5\x30\x43\xe3\xdf\x89\x60\x53\x6f\xec\xbc\x21\xa2\xd4\x6c\xac\x88\xc5\x72\x95\x76\x42\x11\x77\x50\x88\x3d\x89\x6c\x08\x59\x49\xbd\x60\xde\xd0\x7f\xfa\xec\x4c\x93\xea\x3b\x19\x55\x73\x83\x6f\xcb\xd9\x6c\xbb\xc3\x6f\xae\xd2\xa1\x37\xae\x56\xdd\x3f\x6f\xc8\x4b\xc4\x8d\x25\x0f\x15\x1b\x49\xbb\xbd\x56\x8b\xca\xf9\x91\xa1\x56\x52\xd7\x92\xd0\x01\x6d\x2c\x99\x61\xf3\xf7\xae\x5a\x34\x2c\xe5\x25\x69\xa4\xb1\x55\xe0\x78\x08\x89\xfa\xd6\x74\xd5\x2b\x8a\xab\xa5\x57\x0e\xd1\x68\xd6\x96\xba\xdc\xe0\x17\x72\x4b\x4f\x64\xc5\x53\x5a\xf9\x1a\x34\xbe\x00\x79\xd4\x3b\xcd\x15\x5a\xdc\x0d\x19\xff\x95\x4b\x9a\xbc\x23\x76\x7a\x12\x37\xc3\xca\xb4\xad\x38\xcf\xc5\xdb\x70\x5f\x8d\xb9\x29\xaf\xd8\xe2\xc6\xe1\x3c\x36\x9f\xaf\xbe\xbd\x63\x9c\xbe\xa8\xc6\xd4\x88\x2f\xfe\x7e\xda\x6b\xa4\x7a\x16\x1f\xe4\xa2\xb8\xca\x90\x73\x74\x16\xdf\xb4\x45\xa4\xa6\x0e\x28\x21\x1f\x6f\x70\xc1\x51\x6e\x70\x51\x5c\x92\x8a\xa6\x0c\x12\x2e\x19\x1d\xc9\x39\x4b\x52\x20\x9d\xcf\xb7\xf6\xe2\x9f\xc5\xe8\x67\x64\x6b\xa9\x34\x62\xb0\xf9\x57\x5e\xc8\x2e\xdf\xab\xc6\xf8\xec\xae\xb8\xab\x66\xd3\x2c\x10\x18\x17\x54\x6f\x67\xe5\xdc\x75\x0f\x13\xc5\x4c\xbe\x16\xa6\x29\x01\xfd\xa2\xb1\xd4\xc3\x86\xa8\x77\xd1\xd5\xf8\xce\xa1\x45\x47\x06\x2c\xf9\x0e\x4a\x3a\xa9\xdb\xe0\xcf\xe6\x60\xfa\x2e\xba\x5f\x1d\x41\x36\x40\xbc\x86\xeb\x54\xcd\x51\x57\x47\x41\x89\xe8\x2d\x57\x3c\x88\x46\xa9\xc5\xa9\x94\x4a\x32\x20\x0a\x42\x99\x00\x9f\x50\x73\x78\x2d\xb6\x16\x64\xc6\x31\x7c\x94\xd3\x6f\xf7\xd0\xd4\xa8\x3e\x38\x27\x2e\x1c\xa3\xee\xc3\xd8\x76\x43\x85\x81\x9f\xfa\x55\x19\x74\x95\x7a\xe0\xa2\xa1\xa1\x7f\xa0\x23\x80\x62\xff\x58\x51\xb0\x51\x11\x54\x09\xe7\x90\xb2\xb4\x7a\xf9\x5a\x6d\x10\x55\x08\x03\x0d\x95\x8d\x95\x57\x4e\x1c\x03\x57\xab\x8e\xc8\x4c\xdc\x5a\x93\x27\xee\xc4\xc2\x8e\x0d\x09\x21\x14\x68\xea\xb2\x07\xa8\xea\x8a\xa6\xd9\x92\xb4\x47\x4c\xd1\xe9\xab\xbb\x4c\xd0\xdc\x0c\x86\xe5\x7a\xef\x5f\xae\x85\x6f\x29\x5f\x1f\x6c\x34\xd0\xf5\xa1\x97\x3a\xbe\xc9\x65\xae\xf0\x53\x42\x22\x77\x9a\x71\x58\x6c\xbd\xea\x44\x91\x88\x7a\x4d\x79\x77\x69\x2a\x57\x6c\x9a\x4b\x26\xbd\x96\x97\x31\xd6\x88\xab\x87\xfe\x74\x74\xd2\xf1\xbb\x7e\x38\xba\x6f\x39\x9d\x56\x18\x54\x56\x25\x96\xdf\x7c\xaa\x81\x9c\x8a\x90\x9c\x90\xf3\x0f\x0d\x04\x59\xec\x0a\x63\x9f\x0d\xfd\x38\x62\x87\x2c\x43\x68\x80\xa3\x3c\xe9\xf1\x74\x9b\x3c\x28\x9a\x0f\xe1\x9c\x7c\x9b\x34\xba\xe9\xc4\xe9\xb5\x16\x6d\x9b\x67\x0d\x6d\xcd\x99\xcf\x4b\xc6\x1a\x77\x15\x9f\xcd\x6e\xed\x89\x9f\x95\x7c\xa1\x2c\x63\x21\x25\xf6\x01\x75\xcf\x00\x91\x32\x7e\xba\x08\x6e\x79\x5b\x55\x5c\x43\x18\x7e\x76\xce\x99\x40\xac\x04\x8c\xbd\xbd\x96\x2b\xf9\xf6\x5a\xe0\x0b\xcb\x06\x36\xc4\xdd\xed\x46\x47\x73\x71\x0d\xd7\x10\x12\x61\xc3\x23\x07\x6c\x98\xeb\xe8\xf8\x9c\x84\x6d\x76\x4a\x81\x9f\x23\x37\xd2\x4f\x7c\xa3\x15\x57\xef\x82\x6d\x9b\x09\x93\x2d\x62\xb6\xc4\xb1\xcd\xa4\xa1\x5e\xa7\x49\x63\xc1\xa5\x7b\x98\xcd\xaa\xc5\x37\x22\x47\x61\xdd\x26\x45\x89\x96\x1a\x1e\x7e\x10\x4d\x84\x2c\x8f\x56\x44\xb2\x05\xc6\x43\xf2\xe3\x11\x4c\x88\xc0\x3e\x66\x7a\xad\x52\x6a\x44\x75\x51\xe0\x57\x19\x7e\xad\x45\xc5\x12\x50\x62\x92\xbe\xd7\xcd\xf3\xa9\x26\x7e\x2a\xa1\x2c\x37\x62\x43\xc8\x0d\xee\xac\x4e\x6b\x39\x1a\xb5\xa6\x36\xbe\x0f\x20\x2c\x20\x77\xce\x27\xcc\x01\x18\xde\x45\x23\xfa\xa4\x43\xe3\x8f\x97\x7a\x76\xab\xa8\xcc\x89\xdf\xd5\x18\xbb\x76\xf4\x17\x1f\xce\xfe\x27\xe7\xff\xe2\xf1\xe7\x99\x0c\x2a\x02\xf8\x5d\xa7\x3a\xe6\x9d\x15\x10\x8e\x20\x68\x22\x21\x5f\x85\xc9\x3d\x89\x8f\xb6\x91\x0c\xd1\xad\x92\x2d\x76\xd9\x42\x5a\xbb\x12\x49\x8f\xdb\xdc\x5d\xaa\x24\x91\xa7\x6d\xec\x92\x35\x11\x7f\xde\x85\xa7\xe6\xae\x3e\xea\xf5\x09\x71\xd8\x1f\x76\x06\x74\x21\x30\x0e\xfb\xc3\xbe\xae\x5d\xf8\xba\x76\xe1\xeb\x0c\x3e\xce\x6c\xa4\xc4\x5b\x7a\xdc\x26\x32\xb4\xeb\x36\x11\xaa\x07\xb6\x42\xd4\x2b\xaf\xeb\x9b\xb4\x47\x62\xa0\x38\x97\xb8\x15\x4f\xef\x96\x3d\x46\x6c\xf0\xfe\xc6\xc3\x0e\x6e\x56\x31\xd5\x9f\xa6\x28\x4e\x69\x9d\x61\xaa\x4f\xcf\x94\x94\xe0\x12\x53\xfd\xec\x51\xbd\xac\x5c\x65\xdb\x69\x6a\x4e\x44\xcd\x88\x93\x20\x95\x51\x19\xa9\xfe\xde\x81\x53\xcd\x4a\xfb\xc5\x88\x2d\x71\x07\xef\xd2\x00\x50\x36\x7f\x73\xa5\x51\xdc\xaa\x32\x6a\x02\x4b\x55\xab\x0b\x27\xdf\xf9\x9c\x9a\x54\x18\xaf\x90\xfe\xb5\x50\xe8\xeb\x2d\x8f\xbc\x71\x7f\xb8\x2e\xa9\x81\x0f\x13\x50\x24\x78\x20\xd9\x83\x85\xa1\x2b\x7e\x76\xce\xa1\xb8\x98\xfc\xf7\x4e\x92\xfb\x3b\x4b\xee\x44\x2e\x83\x68\xfb\x48\x09\x8f\xc2\x4e\x2b\x6d\xad\xc8\x79\xb2\xb8\xb3\xd6\x37\x92\x2f\x5d\xa2\x6b\x0d\xe0\x40\xfc\x27\x70\xa0\x05\xdc\x70\x04\x5f\x5e\x03\x5e\xad\xb8\x06\xbc\x81\xfb\x22\x35\x74\x0f\xdf\xf0\x87\xc4\xb2\xcd\x23\xc5\x44\xf9\x59\xbb\xb9\x11\x11\x7c\x6e\xc4\x41\x6a\x32\x8b\x82\x81\xd7\x23\xdb\xf6\x2f\xf7\xe2\xea\xd0\xba\xb0\xff\xc3\x06\x5f\x1d\x5a\xd4\x96\x62\x53\x7c\xd9\x2c\x89\x86\xc9\x47\x2f\x9a\xb3\xec\xe4\xee\xfc\x58\x78\xae\x64\x72\x64\xeb\x55\xa3\x7a\x75\x88\x1d\x70\x00\xb8\x4a\x38\xe9\x4e\xe4\x21\xdb\x6f\x0a\x93\xf1\x25\xf1\x24\x72\x1c\x2a\xdb\xc6\xae\x78\x2e\x55\x15\xfa\x73\xd0\x07\x7c\x19\x61\x7a\x32\x5b\xbe\xaf\x90\xc7\xea\xa8\x21\x1e\x57\xbf\xbd\xd2\x58\x62\x32\x53\x20\x10\x29\x38\x36\xd2\x98\xc9\xf5\xcc\xe1\x33\x90\x12\x22\xa4\x3e\xe4\xd2\xc1\xac\xbf\xcc\x95\x44\xed\xe8\x52\xa4\x72\xdb\x8a\x87\x85\xca\x3c\x48\xc6\x7b\x67\x19\x69\x75\x61\x5c\x34\xf0\x40\x95\x6c\x4e\x68\xf2\x82\xc2\x89\x47\x65\x4a\x10\xc5\xbd\x44\xea\x00\x7a\xf3\x87\x57\x61\xd5\x61\xb2\xb2\xf9\xa8\x9f\x1f\xaf\x9a\x1a\xc5\xf4\xf0\xa4\x4e\xc8\x75\x50\x11\xbf\xf9\x8b\x56\x91\x4f\xf5\xd7\x1e\xbf\xe0\x62\xbf\x34\x27\xc1\xef\x6a\x09\x85\xc6\xd5\x4d\xd2\x40\x8c\xa5\xce\xe7\x6c\xdd\x9c\xdd\x68\xb3\x77\x2a\xe5\x8a\xd1\x8d\xea\x49\x00\x92\x82\x7f\x2b\x6a\x8b\x8f\x12\x94\x5e\x3c\x6b\xb5\x1b\x7c\x05\x9a\x87\x9a\x58\x30\x7d\x2a\x97\x49\x52\xe5\x50\x4b\xab\x1c\xea\xd2\x64\xef\x58\x5a\x29\x2e\x96\x9d\xa0\xd6\x96\x2e\x17\x4c\xa9\xa7\x3f\xea\x68\x48\xc6\xec\x1d\xdd\x10\x8a\x65\x83\x52\xd8\xf2\x23\x39\xf4\xbd\xa3\x19\xcb\x36\xea\xb5\x55\x3a\x82\x7e\x1c\x69\x88\xc6\x36\xea\x62\x50\x31\x76\xe4\xbc\x3d\xad\x38\x7f\xd5\xdb\xe2\x98\x6c\x42\x0f\x4f\xd3\xc4\x9d\x2d\x67\x86\x31\x1d\x37\xab\xfc\xb0\xfe\x55\x24\x57\x36\x0c\xde\xd0\x69\x4a\x61\x78\x0e\xc6\x88\x72\xd4\x5f\x1f\xc1\xa0\xf2\x45\xf2\xe6\x98\x9f\xc5\xa2\x11\x8b\x1f\xd6\xb3\x63\x73\x4b\x28\x99\x55\x19\x5d\xa7\xbc\x46\xdc\xde\x44\x9e\x5a\xfb\x54\x3f\x7c\xd5\xa2\xa7\x1d\xe5\xbb\xc8\x87\x4d\xea\x41\x5a\x8a\x3f\xf1\x26\x00\xac\xc3\xe5\x87\xec\x7d\x21\x85\xc9\xd6\xa3\x66\x47\xf2\x30\x85\xcc\xfb\x9b\x98\x62\x96\xb8\x9a\xd2\x7c\x77\x92\x3c\xeb\xa4\x3b\x00\x26\xe9\xac\xea\x62\x05\xd3\x92\xd2\x5e\x3f\x75\xb8\xf5\xb5\x18\x1f\x6c\xee\x25\x7a\xa3\x29\x7e\x3d\xe1\xc6\xd5\xab\x38\x4e\x84\x7d\xc9\x7a\xfa\x34\xe2\x3e\xdf\x96\x9e\xcd\xb6\x1a\x5a\x14\x0d\x56\xc2\x92\xb8\x1b\x97\xc7\x18\xde\x8a\x83\x64\xe4\x44\x37\x32\x64\x76\xad\x73\xe1\x01\xd3\x05\x0a\x82\x33\x92\x84\xc0\x95\xf3\xb6\x90\x29\xc2\x2e\xff\x0f\x6e\x5b\x60\xfc\x11\xa7\xe5\x64\x59\x8e\x98\xe2\xd7\x9b\x87\x32\x0d\xac\x89\xe8\xa4\x9b\x64\xe8\x5f\xd4\x98\xf5\x35\xce\xc7\x23\x46\x77\x17\x79\x00\x67\x8b\xd5\x7f\xcf\xdc\xdc\x80\xfa\xf5\x3a\xb5\x97\xae\xa4\x5f\xca\xb9\x90\x1a\xa7\x84\x7f\x43\x73\x8c\xb1\x46\xef\xbf\xfb\x14\xd7\xe1\xf9\xf7\xbf\x55\x8f\x87\xf5\x1b\xd5\x77\x16\xa0\x84\x82\x53\x5a\xa7\xe2\x00\xa7\x2a\x53\x7d\x74\x13\x39\x66\xe0\x96\x0e\xcf\x94\xdb\x82\x80\x08\x2b\xae\x73\x2e\x3a\x14\x3c\x23\x01\xe2\x09\xa1\x7a\xf0\x6f\x78\x8b\x18\xfc\x9b\x49\x7a\x2e\x3e\x3d\x03\x41\x5b\x73\x08\x6b\x99\x4a\x8f\xf3\x95\x1b\x26\xb3\x9d\x9e\xb1\x7e\x82\x7f\xf3\x13\xdb\xe9\x19\x76\x10\xbe\xbf\x01\x62\x8a\x20\xbd\x4f\x40\xca\xe0\x10\x76\xf1\xac\xc9\x18\x24\x14\x8b\xaf\x6f\xa6\xc3\x05\x49\x47\x88\x8f\x42\x9c\x44\x60\xbd\xe3\xe0\xe6\x39\x08\x68\x70\x5a\xe4\x76\x50\x1c\x69\x20\x5a\xf6\xa9\xde\x98\x82\x29\xf5\xb1\x47\x35\x77\xe5\x5b\x75\xd5\xb6\x20\xbc\x59\xc0\x81\xd3\xc1\xce\x07\xc5\xae\xf8\x7d\x35\xa5\xb8\x90\xa3\x72\xe6\xd9\x91\x24\x1a\x10\x4c\xe8\x27\x65\x7b\x52\xaa\xa5\x4a\xf3\xbc\xec\x5f\x80\x80\x94\x56\x21\xd4\xd2\x2a\x04\xd0\x84\xc4\x9a\x83\x4a\xc4\x09\xd8\xb9\x1a\x3e\xa0\xe3\x72\xcc\x79\xbe\x79\x37\x5a\xf8\xa5\x1c\x5a\x5b\x21\x87\xfe\xba\x51\xb4\x42\xbf\x09\x44\xab\xe5\x87\x4f\x69\x14\x3a\x76\xb8\xa9\x07\x08\x70\x0d\xcd\x41\x8b\x5f\x60\x53\x35\x3d\xe6\x9b\x6a\x4c\x70\xd5\xe4\x21\x83\xb5\x85\x21\xd4\x29\x2f\xb8\xe4\xa2\x8a\xdf\x33\x5c\x5d\x6b\x57\x63\x8a\xcc\x06\x39\x3e\xcf\x79\xdc\x9e\xdd\xf4\x09\xbf\x62\x81\x4b\x0b\xfe\x33\xba\xe4\xbd\x1c\xd3\x05\xee\xf6\x28\x82\x8c\x87\x2a\xe6\xbe\xdc\xa1\xd4\x94\x26\xaa\xb4\xbc\x72\x63\x81\x1d\xeb\xf0\xcd\x66\xa4\xa1\x9a\xf0\xc7\xbd\x5f\xb0\xde\xff\xfb\x0e\xf9\xc2\x09\x96\xea\x49\x10\x44\xaf\x3c\x50\x8a\x8f\x03\xb4\xf0\x60\xf5\xf9\x56\xe8\xd9\xec\xac\xe3\x99\x75\x76\xec\x31\x9f\xa8\xe6\xea\x4f\x2d\x7c\xda\xa3\x4b\xc9\xe7\x4d\x76\xd4\xf0\xb8\xda\xd0\xe0\x66\x9a\xe8\xd3\x23\x2e\x79\x68\x6b\x0d\x86\x34\xc3\xf4\x49\xc1\x0c\x60\x30\xe1\xb5\x19\xe8\xc7\x3d\x72\x7d\x4c\x35\x0f\x37\xb0\x8b\x7d\xa8\x12\x76\x34\x0f\x65\xb3\x6b\x0d\xf6\x37\x0a\xe3\x0c\x6a\xa0\x06\xb9\x6d\x69\x6d\xb8\x6b\x85\xe7\xca\xed\x85\x70\x83\xc6\x0a\xc3\xa2\x6f\x13\xae\x30\xf2\xe3\x92\x2e\xc2\xdf\x5c\xd2\x46\xd0\x5b\x45\x0b\x74\xea\x13\x17\x07\xfa\x86\x47\x7c\x1c\xe8\x67\x1e\xf1\x70\xa0\xbf\x78\xa4\x81\xca\x3c\xd7\xe3\xb9\x0d\x9e\xeb\xf2\x5c\x1f\x99\x81\xd5\x81\x78\xd6\x8b\x6f\x9c\xa8\xba\x8d\xf4\x43\xe8\xf9\xdc\x4a\x84\x07\x0f\xa5\xb1\xd5\x6f\xd3\xd5\x6f\x5c\x61\x57\xa5\xf8\x97\x1d\x35\xa4\xb2\x86\x4d\xc7\xed\x50\x90\x87\x4f\x2c\xe5\x1b\x37\x7a\x14\x09\xa2\x66\x84\xcc\x57\x87\x2f\x9c\xc1\xb3\xed\x8b\xdb\x97\x40\x8c\x0d\x5f\x5a\x73\x71\x42\xc6\x0d\x42\x2d\xdf\xc6\x01\x69\xe8\x1e\x1d\xd1\x61\x6f\x3c\x70\x7d\xdc\x26\x0d\x3d\xa0\x5e\xe0\x8f\x70\x87\x34\xf4\xf1\xd0\x1f\xf4\x07\x7e\x63\x88\x43\xd2\xb0\x6e\x3d\x1b\xf7\x49\xc3\x7a\x9f\x52\x1b\x0f\x49\xc3\x9a\xda\xf3\xf9\xe9\x11\x95\x8b\xa2\x11\xbf\xaa\x7a\x1a\xd2\x72\x83\xfc\x16\xeb\xde\xc7\xe3\x96\x96\x38\xe5\x52\xeb\xfa\xcd\xe6\xd1\x6a\xbd\x31\xe3\xa3\xfa\xb3\xab\xbd\x1c\x52\x1c\x4e\x29\xc2\x67\x3d\xb6\x77\x04\x08\x4f\x7b\xc9\x47\x55\xd5\xc9\x1f\x9a\x65\x8b\x96\xad\xde\x22\xfe\xec\xfa\xc3\x21\x0d\xfc\xf2\x75\x48\x73\xc3\x5c\xbf\x43\x73\x94\x6d\x3a\xb9\x67\xfe\xcb\x41\xb9\x93\x2a\xd5\x3a\x28\x37\xf1\x17\x68\x81\xdb\xac\xaf\x56\x3f\xd9\xd7\xd3\x9f\xfb\xc2\x2e\xef\x6d\x0b\x7f\x8b\xba\xbb\x0a\x65\xf3\x1b\xac\xa3\xdc\x0b\xef\xce\x45\x39\xda\xa5\xac\xa3\x00\xf7\x71\x88\xf0\x6d\x6a\x58\x0f\xc1\xff\x1d\xb2\x7a\x09\x64\xcd\x52\xad\x9e\xff\xe7\x01\x88\xa6\x4f\x27\xab\x11\xe4\x22\x8e\x1c\xdc\x41\xf8\x39\xa4\x69\x77\x4b\x91\x87\xd0\x9b\x5e\x66\x38\x76\x9b\x99\x51\xaf\xd7\x71\x18\xdb\x8c\x7c\x8b\xd2\x61\x39\xb3\x9e\x6b\xe8\xa3\xde\x3d\x10\x18\xdb\x93\x17\xf2\x45\xca\xf4\x98\x89\x09\x0d\xb4\x90\x71\x1f\xa7\xc7\xb8\x59\xc5\x4f\xe2\xa3\x23\x2e\x1c\xa4\x4a\xf6\x58\x3f\xd6\x3c\xc1\x8a\x1c\xec\xa1\x85\x29\x78\x78\x67\x85\xfe\x4c\x56\x61\x9b\x4b\xb4\x05\x58\x34\x3a\x75\x4d\x8f\xd9\xe1\x25\x9f\x88\x9a\xfe\x5b\x71\xfd\xc5\x19\x6b\x78\xa3\xc1\xae\xcb\xea\x3a\x36\x71\xa5\x38\xe6\x29\x12\xca\x09\x97\x67\x52\xee\xec\xc5\x09\x01\xbb\x60\xf2\x05\xf1\x3e\x29\x72\x72\xe4\xa9\x43\x73\x6e\xae\xd3\x00\x7c\x5b\xae\xbd\x32\x0a\xcd\xf3\x35\x37\x7e\x78\xbe\x96\xe6\xd5\xcf\xd7\xc8\x7c\xbe\x5e\x36\xaf\x4e\x39\x15\xbd\x1d\xae\xf2\xcd\x61\x9e\x46\x3e\x3b\x31\xd5\xef\xfa\x6a\x9f\xbc\xd1\x15\xee\xa8\x9e\xaf\xbf\x74\x47\x05\x0e\x37\xc0\xfb\x86\xb9\xd1\xd2\x5c\xfc\x70\x13\x1b\x41\x23\x54\xf1\x80\xc1\x94\x13\x59\x6b\x06\x64\xac\x19\xa9\xe4\x02\xe2\x71\x13\xb9\xcf\xa1\xbb\x3e\xf1\xb8\x92\x6c\x72\x82\xb9\x9c\xe6\x55\xae\x7e\x96\xd7\x0c\xf6\xe3\xba\x59\x3e\x0b\x96\x61\x5f\x69\xc4\x34\x3e\x51\xed\xb5\x13\x2e\x36\x1c\xa9\xa1\x7c\xe0\xde\x2d\xb9\xe7\x52\x0f\xcd\xe7\xda\xfd\xab\x76\x56\x4d\x9e\xca\x28\x79\x88\x0e\x5f\xe6\x31\x2b\x49\x31\x25\xc4\xe3\xda\xa2\x24\xac\xae\x84\xd5\x15\xb0\xa2\xc5\x82\xc3\xb8\x3a\xde\xe6\x1b\x55\xdf\x88\x3c\xa4\xdc\x7e\xba\x42\x35\xc9\x1a\x8c\x62\x97\xbb\xb9\x76\x97\x42\x6a\x21\x91\xfa\xc1\x53\x39\x1c\x4a\xfa\x61\x97\x09\x40\x69\xd7\xbf\x22\x50\x67\x66\x38\xa2\x23\xbf\xcc\x83\x37\x29\xf8\x7a\x54\xde\x67\xb8\xf3\xf9\x33\x97\x4a\xcd\xb4\xb9\xbb\x1b\x1d\xfc\xee\xfa\x44\xc6\x28\x5a\x2b\x2c\x9e\xb5\x47\x6e\xb6\xce\x46\x72\x56\xa5\xe4\xf3\x64\x4a\xcb\x6b\x06\x7e\xff\x60\xf9\x78\xfa\x41\xe5\x99\x84\x3c\x0a\xe5\x46\x2d\xf2\x6f\xb1\xca\x07\xfe\x9a\x0c\x80\x73\xd7\x5f\xe1\x02\x5f\xea\xbc\xee\xfa\xf2\x78\x7d\xd7\x27\x14\x4b\xa2\xe7\x76\x9a\x52\xf9\x29\x9c\x67\xf7\xf9\x41\xf4\xa8\xbb\x7c\x70\xac\x3a\x42\xf7\xf1\xd3\x97\xc5\x6b\x8e\xd4\x97\x9d\x32\xf1\xbc\x1c\x25\x72\x67\x86\x41\xd0\x59\x7e\xf3\xff\x12\x48\x58\x2a\x6b\x85\x32\xf7\x52\x90\x56\xdd\x3c\xae\x70\x51\x04\x95\x9a\x37\x09\x3e\x06\x7a\x6e\xd1\x29\x78\x91\xd1\xc4\x07\x0e\xc4\x82\x7f\x7a\x42\x4a\xea\xb9\x48\xe5\x31\x58\x64\xea\x4f\x91\x3a\xaa\xa9\xa9\x49\x9f\x0c\x32\x55\x7a\x65\xf8\xd5\x67\xeb\x52\xb1\x2f\x56\x3a\x5c\x44\x10\xc9\x6a\xfc\x34\x13\x7f\x70\x5d\x17\x08\xc3\xb9\xbb\x2e\x45\x38\x56\x42\x63\xd0\x3c\x9f\x9f\xe1\xb8\x34\x9f\x92\xd4\x6d\xe8\xe3\xf2\x6d\xa8\x46\x55\x3f\xa0\xe0\xba\x68\x14\x5d\x90\x0a\x1f\x46\xe6\xa3\xfe\xf4\x94\x7a\x20\xcf\xf5\x43\x8a\x14\x76\xd7\xaf\xb4\x8e\x68\xf9\x75\x48\x13\xc1\x34\xd6\x40\xc9\x64\xdd\xb8\xb6\xa2\x6a\x70\xe0\x9d\x9d\xb0\x93\xe0\x68\x84\x79\x17\x5f\x52\x1d\x81\x56\xd9\x5b\x28\xbe\xa0\x04\xee\x62\xb3\x88\xb5\x02\xe8\xdd\xe9\x97\xe7\x9d\xc7\xc4\xd3\x82\xa7\x9b\xe5\x70\xf9\xd0\xe6\x5b\xf4\xa0\x31\x14\xf7\x42\x6f\xe2\xac\xf5\x26\xa2\x53\x89\x2f\xeb\x97\x27\x7c\x26\xc3\xf7\x49\x9f\x12\x70\x1c\xfc\xc4\x24\x65\x9e\x76\xb5\xa1\x44\x62\x3e\x6a\x57\x7a\x3d\x5a\xbe\xfb\x29\x43\x3a\x2f\x9e\xb5\x27\xae\xcc\xff\xf6\xb3\xaf\x3d\x25\xdf\xd1\x44\x5b\x92\x81\x79\x7c\x37\x03\x1e\x53\xdc\x52\x53\x18\x91\x10\x72\xf7\x93\xf1\x95\x02\x0f\xd8\xca\x03\xb9\x6b\xef\x6d\x30\xcb\x6a\x87\x14\x21\xe4\x92\x92\x61\x7a\xe4\xf9\x46\xcb\x53\xfd\xbd\xe9\xfb\x9d\xaa\xdf\x19\x01\xab\x66\x5c\x46\x49\x7a\x42\x15\xcd\x59\x2a\xf8\xc4\x44\x7b\x77\x29\xf9\x19\xbb\x08\x95\x5d\xe2\x09\x97\x47\x84\x42\x38\xe9\x56\x07\x17\x0c\xe3\xc0\xab\x78\x64\xab\x9c\x2f\x18\xc6\x0f\x1e\xb5\x32\xbf\x85\x30\xeb\xce\x3a\x3c\x04\x8f\x0d\xec\x2f\x21\x84\xea\x3f\x6b\x77\xe7\x2f\xb5\x9b\x5f\x87\x57\xff\x3e\x7c\x3a\xbf\xaf\x38\xc4\x63\xad\x9a\x6f\x2d\xc9\x36\x28\x8f\x3f\x7a\xf8\xaa\x39\x38\x2f\xd3\x70\x94\x89\xa2\xa2\xe7\xbc\xa8\xcb\x8a\xba\xa2\xe8\xb9\x2c\x7a\xee\x47\x5a\xe3\x13\x38\xf5\x3b\x24\xef\x20\x11\xe5\xfb\x67\x95\x1d\x8e\xc4\x5b\xe4\x51\x22\xba\x77\x2c\x45\x24\x02\x4b\x64\x00\xd1\x93\xf6\x7c\x3e\x6d\xa3\x6c\xd6\x58\x23\xf4\x7f\x9c\x0a\x2d\xd3\x4d\x67\xf1\x0d\x66\x31\xa9\xc4\x7d\x4a\x29\x71\x65\x18\xed\xab\x8d\x98\x4a\x52\x57\x2d\x3f\xbf\x88\x75\xed\xc4\xb1\xae\xef\x7e\x8a\xda\x1c\xf5\xf2\x78\x7e\x3c\x26\xae\xb0\x0b\x1b\x12\x6f\xf1\xac\xfd\x4c\x07\xb9\x7e\xb9\xd1\x56\x50\x7d\x8f\x18\xe6\xcb\xbb\x22\x7d\x98\xe3\xa9\xf2\xb5\x78\xd6\x5e\x38\xa9\xbe\xc0\x00\xef\xc7\x2b\xb6\x61\x19\xb9\xbf\xb7\x10\xa5\x1e\xcf\x97\x98\x79\xef\x55\x9b\x80\x57\x0f\x51\x62\xd9\xc4\xa8\xf7\xaa\x0d\x4f\xa3\x02\xbd\xe5\x7b\x23\xfe\x66\x57\x15\x37\x37\xd8\x90\x5e\x6e\x52\x43\x9a\x0c\xb9\xeb\xfb\x8d\x1b\xfc\x72\x83\xcc\x0d\x68\x8f\x7a\xc9\x6b\x2f\x19\x8c\x6e\x32\xc4\xb1\x21\xe3\x64\xc8\xa3\xd1\xe1\xab\x91\x46\xf1\x99\xf0\xe4\x73\xdc\x00\xab\x00\x2e\x49\x2f\xcc\x31\xd5\x36\x96\x96\xac\x8c\x37\x37\xe1\x6e\xd2\xeb\x5f\xd5\x5f\x48\x78\x12\x94\xf2\x12\x55\x4e\xf0\x5b\xb0\xef\x43\x66\xdb\x89\xb2\x0d\x56\x3d\x41\x55\x0a\x36\x68\x4d\x43\x9f\x1b\x69\x6c\xfc\x2e\x10\x63\xf1\xac\xd1\x1a\xde\xb8\x41\xe6\x37\x5a\x63\xbd\xf7\x3b\x74\x96\xd6\xde\x4a\x09\x61\x32\xb4\x2e\xec\x84\x95\x1a\x9d\xcf\x65\x66\x0f\x45\x8d\x0a\x6f\x45\xe7\xd2\x01\x84\xdc\x79\xef\xc7\x1a\x8a\xab\xcb\xa9\x1d\x9c\x23\x33\x1f\x11\x8a\x60\xe3\xbd\x57\xed\x6a\x16\x05\x98\x52\xb3\xd7\x68\x44\x95\x93\x16\x3b\xf2\x24\xa8\x32\x7a\xe0\x67\xae\xc0\x9c\x0b\x17\x95\xf0\xc8\x5f\xef\xcd\xe7\xae\x55\xff\xb0\x79\xb0\x2d\xc5\xb4\xb0\xaf\x01\x22\x12\xf8\x5e\xd1\x96\x83\x3e\x99\xec\xc8\xda\x71\xc0\xd6\x02\xda\x89\x16\x8e\x04\x8a\x83\x28\x87\x74\x72\x21\xed\x62\xa6\x30\x7f\x1c\xe5\xc7\x8d\x65\x33\xa3\xdf\x85\x5c\x2e\x9a\x25\x05\xfb\xd9\xac\x96\x68\x5a\x86\xe8\x11\x38\xef\xbd\x6a\x67\xa7\x22\x91\xf5\x91\x88\xd2\x53\x8b\x1c\x76\x82\xa6\x6e\x28\x19\xc4\xf9\x84\x38\xf3\xb9\xc1\x3f\x9a\xbe\xe4\x16\xb7\x43\x22\x4e\x8b\xcf\x97\x82\x44\x9f\x35\xa7\x86\xc7\x70\xd5\xec\xd4\xb8\x70\xd9\x72\x21\xfa\x65\x82\x68\x9d\xda\x8a\xe0\xfd\x60\x8f\x92\xb8\x51\xec\x0e\x93\x7e\x26\xfd\x85\x79\x49\x57\x44\x4a\x13\x55\xa1\x50\xcb\x25\x8f\x82\x59\xde\x0e\xb1\x14\x8c\xc5\x30\xc0\xdf\x7a\x2a\x6c\x12\x17\x46\xc0\xd8\xf4\x49\x54\x6c\xb9\x71\x63\x06\xe8\xfb\x5f\x7e\x2d\x19\x9d\x2a\x7d\x3e\x5f\x6a\x5f\x07\xba\x92\xbe\x5f\x5a\x2e\xbc\xec\xb8\x5c\x9a\x49\x40\x90\x18\xaf\x20\xee\xee\x50\xe2\x46\x6f\xfa\x70\x61\x3b\xc8\xb8\x35\xf2\xb9\xc0\x5e\x2d\x15\x22\xd4\xaf\xf1\x83\x12\x78\xb6\x94\xe8\x72\x6b\x16\xb5\x4d\xb7\xad\xb9\x35\x26\xa4\xd5\xd8\x7f\xc2\xde\x27\xaa\x78\x5e\xa5\x1a\xfa\xf4\x6a\xf3\xb9\xc6\x1a\xf5\xdf\xd9\xfc\x2b\xb0\x5d\xb0\xfc\x05\x2e\x1a\x48\xda\x28\x7b\x35\x76\x4a\x04\x7b\x4d\x0a\xa6\x44\x71\x63\x50\x58\x08\xcd\x8c\xec\xcc\xfb\x57\xcd\xad\x25\x16\xc3\x25\xbc\x0f\x81\x45\xc0\x01\x9b\xcf\x01\x04\x85\x00\x83\x5a\xbc\x83\xa9\xac\x99\x9d\xb8\xda\xdc\x99\xcd\x5a\x3b\x19\x15\xf7\x7e\x44\x07\xa3\x0c\x0d\xbd\x8c\x1f\x7a\x99\x3e\x1d\xd0\xae\x3f\xf2\x07\xc3\x4c\x77\x3c\x1c\x65\x1c\x3f\x43\x07\x03\x3a\x1b\xae\x73\xb5\x9c\x75\x61\xaf\x11\x87\xf1\xa8\xaf\x1a\xe8\xb5\xc2\x51\x5c\x79\xd4\xf4\x33\x43\xda\xf5\x33\x1d\x3f\x0c\x46\xcd\x75\x69\x56\xd4\x8a\x34\xdb\x03\x19\x29\xd6\x1b\x0f\x28\x1b\x44\xb4\x95\x36\x28\xf1\xcc\x53\xb1\x14\x2d\x5b\x54\x6d\xce\x08\x1c\xd2\x82\x1a\x6c\x30\x8f\x24\x10\xcb\x64\xb0\xc2\x47\x6b\x73\xc6\x0f\x39\xe3\x90\x18\x4c\xb2\x5d\xc5\x7a\x97\x19\x2c\x2b\x8d\x65\xc7\x02\xde\x3f\xf2\x59\xbf\x26\xf0\x2c\xe6\x4e\x72\x4f\x9a\x64\xbb\x32\x19\xa8\xbf\xff\x61\x83\xc4\x64\xb5\x0e\xed\xef\xa2\xdb\x98\xd3\xca\x22\x39\x59\x44\x6a\x81\x42\x71\x75\x0d\xac\xff\x1f\xf1\xf7\x88\x5d\x8b\xa3\x43\x4b\xc0\x0a\x11\x8a\x5d\x46\xbd\x6e\xcd\x72\x6c\xc2\x53\x81\xa2\xcc\x4b\xc5\x3f\x45\x82\x71\x27\x59\x47\x34\xee\x88\x29\x47\x57\xc4\xe3\x90\x14\x90\x79\x25\xdb\x89\x06\xf8\x15\x9f\x4e\xf1\xb7\x68\x46\x84\x7f\x12\xb6\xf4\xe2\xc7\xe5\xaf\xda\xeb\x88\x22\x33\xa8\xa5\x76\xe3\x58\x1b\x71\x29\xaf\x41\x28\x83\x44\x73\xf2\x94\x61\x13\x6d\x6a\x54\xf7\x43\xef\x57\xab\xeb\x8b\x14\xb3\x70\x40\x58\x19\xb8\x4c\x8b\x81\xa6\x98\x02\xb8\x05\x02\xb9\x15\x8d\xc2\x0e\x00\xbc\x02\x53\xb9\x09\x50\xbe\x03\x94\x29\xd0\x03\x3b\xda\x06\x86\xba\xa8\xaf\xa2\xc0\x5e\x4c\xf0\x6f\x34\xa8\x8c\xec\xdf\x68\x70\xef\xac\xa7\x53\x8d\xe2\x80\x6a\x54\xdf\x68\xb1\x45\x95\x08\x2f\x6d\xba\x07\x22\x1d\xa2\x4b\x53\x6b\x7c\x68\x5b\xae\x4d\x18\xa0\x03\xcb\xb5\xf3\x90\xeb\xda\xe8\xbb\x93\x13\x3f\x17\x8f\x7a\x60\xac\x12\xee\x7e\xbe\x71\xeb\xee\xaf\x24\x3b\xc6\xbd\xae\xa3\x58\x67\x49\xcb\x38\x39\x88\xe9\x48\x3d\xc6\xca\xf5\xe1\x30\xb0\xa4\x56\x92\xc0\x97\x65\x08\xad\xfe\x4c\x7c\x17\xc4\xf7\x87\xf8\x2e\xda\xa9\x25\xef\x30\x12\x97\x14\x4e\x1c\x7d\x1c\x9a\x37\x7d\xd1\xbe\xde\x63\xbb\xe2\x75\x95\xe2\xa9\x2a\x51\x37\x6b\xaa\x01\x4b\x50\x8b\xc5\x75\x91\x26\x8d\x2a\xb9\x01\x57\xb3\x86\x83\x1a\x63\x17\x4d\xc1\x2e\x6e\x66\xdc\xdb\x76\x33\x61\xb4\xe5\x0a\xc9\xb4\xff\x16\xc9\xa5\xfd\x37\xf2\xc4\xcf\xa4\xd6\xec\xd0\x4e\xd9\xb9\xf7\xdf\xc0\xa7\xc6\x32\xce\x6f\x66\x1a\x32\x9b\x8c\x40\x03\x23\xe1\x0e\x71\x85\xf0\x1d\x97\x7d\x9c\x26\xcb\x2e\x8b\xf2\x4a\xd9\xf3\x55\x72\x68\x2b\x81\x96\x56\x43\x2b\x72\x7e\x3d\x9f\x17\xd7\xe0\xd1\x6e\xc4\xb8\x0f\xfb\x94\xb5\x04\xd1\xf0\x39\x9e\x06\xc1\xb8\xeb\x87\x23\x90\x42\x5a\x35\xdc\xac\x21\xb3\x05\xe2\xd3\xcd\xec\x0b\x0d\x75\x73\x26\x98\x0d\xb8\xdd\xaa\x0d\xcb\xb4\x69\x4a\x4c\x59\x53\xdb\xa2\x36\x69\x5a\x27\xbc\x7d\x41\x19\x28\xf7\x5b\x2d\x02\xa6\x9d\xc9\x32\x05\x56\x46\x5d\xcc\xaf\xff\x4b\x63\x7a\xe5\x63\x7a\x5d\x31\xa6\x3e\xd5\x14\xa0\xf0\x0a\xa0\x91\x79\xff\xa7\x32\x00\xb4\x3a\x11\xed\x04\xd0\xcd\x9a\xa2\x89\xb6\x1c\x1b\x5b\xae\x0d\x39\x8b\x67\xad\xcd\xc1\x6a\xff\xdf\x81\xa5\x74\xd9\xf9\xc7\x5d\x76\x78\x97\x9d\x15\x5d\xfe\x71\x94\x4b\x5d\x76\x6b\xc9\x73\xed\xe2\x59\xeb\xd6\x84\xa9\x64\x57\xac\xb4\x77\x0f\xe4\xd7\x47\x1e\xdc\xfd\x23\x24\x05\x83\xfd\x68\x74\xe1\x7b\xf8\x4a\x0a\x4c\x3e\x6c\xf3\xf7\x68\xe7\x33\xf1\x2e\x2d\xe5\x1f\x92\x84\xb5\xa4\x39\xd0\xbb\x07\xd6\x2e\x9a\xf8\x20\x94\xbf\x3a\x6e\x74\x7f\x70\x56\x13\x56\xc4\xdf\xbc\x48\x2f\x53\xee\x11\xe9\xb1\x57\x11\x7f\xcb\x42\x55\xf1\xd2\x16\x9b\xea\xf9\x4c\x71\x87\xc5\xd5\x61\x5f\xb8\xb0\x97\xd0\x88\xde\xf9\x0e\xf6\x70\xff\x1f\x60\x6e\x74\x15\x98\xd9\xf8\x7f\xd0\x8a\x51\x16\x6d\xe4\xe8\x6a\xc8\xdf\xbd\x7f\x02\xe7\xa3\x7e\xfd\x45\xd8\x1f\xbd\xd1\x55\xe3\x27\x89\x8d\x75\xf8\x5a\xa1\x65\x98\x5c\xba\x29\x12\xd0\x77\xf1\x03\x94\x80\x1f\xa3\x95\x46\x4e\x8f\xbd\x35\x92\xb4\x73\x7a\x69\x9b\xe2\x2f\x59\x13\x62\xf8\x63\x8f\x50\x73\x69\x42\x94\x81\x27\x06\xf8\xd8\x43\xa6\x18\xfb\xbb\x17\xc7\x24\xa1\x51\x6a\xa2\xaa\x38\x86\xfd\x7e\xd3\xe4\xb3\x39\x28\x8b\x4c\x4d\x42\xe1\xa0\x2f\xd0\xc4\xa3\x2b\x35\x56\x1c\x31\x12\xd3\xf9\xd8\xe3\x2e\x4a\xdf\xbe\x9e\x4d\x89\x8d\x8f\xf0\x1f\x60\xe3\x23\x64\xd8\x38\x90\xd3\x2c\x06\xa2\x0c\x54\x52\x28\x32\x23\x12\x5d\x1e\xf0\xc7\x48\x1d\xb0\x68\x18\x29\x55\xe2\x86\xbf\x46\xf3\x3f\xc2\xd1\xb7\x47\x3d\xfc\x8f\x48\xfa\x08\x01\x49\xd3\x8b\xaf\x8c\xb2\x18\x19\x3d\xea\xef\xf7\xcb\x42\xf9\xf0\x55\x59\x05\xc3\x57\x42\xa5\x5e\xfd\xa5\x8d\x63\xdc\x45\xd3\x0c\x7f\xc3\x46\x74\x12\x7f\xb8\xe7\x49\xd7\x9d\x28\x49\x20\x84\x5b\x3e\xe2\x68\x90\xf4\xab\x41\xaa\x1c\x2c\xac\x25\xd4\x8c\xd2\xbc\x6a\xf8\x5a\x71\xca\x94\xa1\x15\x16\x09\x93\x20\x19\x06\x37\x29\x2c\x14\x0a\xc3\x8b\xda\xe8\xc9\x36\xae\x97\xac\x16\x2f\xa8\xfa\xac\xf7\xc6\x87\x73\x62\xb7\x26\xde\xeb\x76\x29\x71\xe6\xf3\xd9\xab\x29\x15\xd6\x37\x3e\x7e\x15\x6e\xa7\x7f\xb9\x8a\xe6\xea\x59\xeb\xd5\x84\xc3\xf5\x9e\x60\xab\x1d\x87\xfc\x0a\xcc\x47\x3d\xbc\xe3\x1c\xf3\xba\x2d\xfd\xa4\x33\x0e\x6b\x3e\xea\x17\xf7\xc0\x60\x07\xfb\xdc\x17\xcf\xb4\x06\x9f\x57\x6d\x4a\x0a\x27\x5b\x8a\x0b\xf6\xd3\x0e\xaf\x97\xf0\x45\xde\xab\xa9\xd1\x84\x12\x8f\x6c\x97\x5c\x61\xc1\xdf\x8e\x13\xa9\x7b\xa5\x4b\x9b\x94\xcd\x2e\x34\x99\xb4\xd9\x9d\x5d\x2b\x2f\xbe\x53\xcd\x4c\xda\x29\x17\x1b\xe0\x12\x6a\x7c\x81\xcc\x9b\xd8\x30\x78\xe9\x4e\x0a\x3a\x49\x38\x21\x67\xd5\x0f\x3b\x80\xf7\xaa\x70\xe9\x7e\x2c\x1f\x6a\x9f\xf6\x13\xe9\x8f\xad\xa8\xbc\x3e\xe0\x91\x3d\xf4\xd3\x4e\x54\x76\x39\xed\xb0\xa3\x9f\x4e\x89\xcc\x3e\x9d\x32\x91\x12\xbe\x52\x3e\xe4\xc1\x98\xaf\xa6\xbe\xa5\xf6\x9c\xf8\x52\xca\x40\x66\xbf\xb6\x7c\x86\xa9\x45\xa6\xff\xec\xf8\x11\x19\x1a\x1e\x76\xf0\x49\x15\x53\xfd\xb4\xce\xbf\x4f\xfb\xc9\xef\xc3\x0e\xb6\x0e\x2f\xf0\xf0\xd4\xc6\x54\xbf\x1c\x47\x85\x96\x13\xab\x0d\xee\xf8\xbb\xde\x4d\x85\xb0\xf9\x59\x8f\x13\xce\x44\x02\xa6\xfa\x60\x3f\x9b\xad\x57\xc5\xbb\x46\x54\x96\x40\x81\x1b\x71\x15\x2a\x48\x50\xc1\x92\x25\x92\x20\xc8\x62\x2b\x52\x55\xc8\x20\x21\x01\x5a\x94\xb2\x1a\xb6\x02\x5a\xf6\x63\x0e\x64\xa1\xbe\x3b\x9f\xb4\x04\xc1\x1d\x76\x04\x0f\xe9\x4b\xb7\xe3\xe2\x91\x41\x57\x90\x57\x7d\xa5\xc5\x42\xf8\x6f\xb1\x91\x1e\x76\x2a\x82\xa6\xca\x82\x86\xb0\x1b\xf9\x01\x25\x77\xcd\x8a\xf2\x78\x4e\x71\xf3\xe2\x12\xcd\xcd\x53\x26\xfd\xa2\x4d\xf7\x7b\xcc\xe4\x38\xaf\xee\x31\x76\x97\x8b\x7f\xaa\xc1\x03\x63\xd7\x2f\xd8\x25\xd4\x3a\xb3\xff\x41\x7d\xd3\x4d\x81\xcc\x7d\xc5\x08\x4f\x31\x38\x2e\x88\x23\x3e\x9a\x8b\x99\x6c\x79\xb9\xb4\x60\xb5\x31\x6f\x36\xdf\x6a\xd1\xf1\x8b\x07\xbe\x18\xaf\xc2\x1b\x5c\xa1\x1d\x5e\x98\xc7\xf1\xc2\xc0\x6f\x6f\x60\x9c\x71\x7c\xcd\xcd\xe3\xad\x87\x99\x8d\x07\x3c\x8d\x26\xc1\x36\xc5\xdd\x36\x3f\xb2\x9e\x2a\x77\x97\xb4\xd2\x0d\xca\xb3\x00\x7c\x81\xca\xb4\xd3\x20\x51\x60\x14\x94\x0f\x03\x71\xc3\x59\x5f\x65\x0f\xbf\x66\xac\xf2\xbf\xbc\xb5\x53\x1e\xa8\x1b\x1f\xc7\x67\xd2\x9f\x72\xa2\x40\xb8\x54\x60\xab\x3c\x54\x0b\xf4\xc3\x64\x76\x29\xca\xce\xaf\xcc\xdf\x2d\x2b\x0f\x95\x4f\x3b\xea\x89\xab\x50\xce\x17\x4c\x59\x1b\x1c\x4c\x57\xdc\xef\xa2\x91\xb2\xf8\x75\x3d\x43\x29\x5f\xcb\xc9\x0a\xb2\xd3\x72\x7e\x55\xf1\xad\xfd\xf2\xca\x9e\xf3\x85\xf2\x7f\xdb\xf3\xd6\x5e\xaa\x67\x59\x3c\x55\x58\xda\x67\x39\x64\xad\xb0\x70\x92\xf1\xc6\x7f\xae\x08\x7e\x49\xb9\x1f\x2d\x01\x1d\x8d\xbc\x6a\x49\x92\xa3\x03\xdb\x94\xfe\x06\x8e\x3d\xcc\x44\x1f\xf9\xf9\xd8\x82\x4f\x4d\x52\x66\x30\xc4\x4e\x36\x3b\x69\x69\x88\x4b\x55\xd3\x1a\x5f\x06\x57\x6d\xca\x4a\x49\x95\xc0\xb4\x46\x94\xab\x81\xeb\x36\xad\x48\x0a\xb8\x8d\x15\x67\x82\x14\xf5\x97\xe7\x48\x70\x73\x42\x72\x27\x0b\xa8\x25\x45\x18\xf6\x7d\xa2\xf2\x0d\x4e\x4c\xd3\x03\x51\xd3\x7a\x76\xed\xb2\x48\xfb\x31\x52\xe9\xc9\x09\xc5\x62\x75\x42\xe0\x0a\xf0\xe0\x2f\xda\x76\xc4\x6d\xbf\x0c\x0a\x25\x2d\x23\x6e\x9f\x19\x13\x57\x4d\x23\xea\x22\xe7\xe5\x59\xd4\xf1\xc6\x72\xbc\xde\x58\x7a\x23\x29\x1a\x46\xb2\x45\x91\x1f\xbd\x97\x6d\xef\xcb\x2e\xdb\xfb\x5a\xd4\x90\xc5\x63\xc9\xf3\x39\x7c\x49\xc6\x72\x97\x34\xa1\x19\x07\xf2\x4a\x1b\xa8\x0b\xc5\x44\xa4\x78\xeb\x6f\xef\x2f\x9d\x72\xcc\x94\xef\x70\x55\x1c\x0f\xa7\xd2\x54\x95\x63\x50\xbc\x59\xda\xaf\x38\x07\x6e\x36\xab\x51\x32\x5e\x89\xc9\x7e\x88\xca\xce\x0f\x37\x42\xeb\x8b\x6b\xaf\x2c\x1d\x2d\x58\xe1\x0a\x48\xed\x34\x55\x14\x47\x3d\x2b\xed\x1e\x3a\xab\xdb\x55\xa0\xf8\x02\xce\x98\x55\xb8\x3c\x7c\xfe\x5b\xb2\x80\xf0\xe6\x70\xfb\xbc\xa4\x41\xf2\xc6\x62\xa5\x78\x63\x71\x05\xc3\x65\x3b\x95\x68\xcc\x78\x8a\xd9\x66\x9b\xa6\x9a\x89\xb3\x92\x6c\x54\xe1\x65\x52\x53\xcd\xc1\x9e\x3b\xe0\xcf\x4b\xf5\x63\x4a\x25\x9d\xbb\xfa\xac\x4c\x81\xbb\xf0\x20\x8b\x15\x1a\xed\x72\xae\x3e\x2d\xbb\xfa\x74\xf1\xa8\xbf\x3c\x2f\xaf\xfb\x70\x4a\x26\xd1\x91\x4c\x91\xc6\x6f\xd3\xef\x6c\x19\xcb\x86\x18\x2a\x8c\x35\xc3\x35\x46\x82\x54\x7c\x42\xf5\x63\x0f\x76\xe5\x06\x77\xec\x06\xfb\xb4\x8f\x7d\x22\x46\x91\xf7\x37\x8b\x02\x6e\xcd\xcb\xbb\xe8\xbb\xd6\xc8\xfb\x68\xb3\x91\x73\x17\xa2\xf2\xa1\x63\x9b\xb2\x32\x83\xdc\x37\xbf\xae\xec\x43\xc5\x08\xdc\x71\x2d\x76\xff\x4d\xa0\x35\x14\xa1\xe8\xc6\xe7\xa1\x3a\x65\xde\x63\x6b\x29\x2f\xc7\x7e\xc1\x3e\xad\x58\xca\x75\x3a\x7e\x40\x3b\x99\x51\x73\xdc\x75\x32\x3e\x77\x48\xa0\x67\x6e\xfc\xd6\xa8\xe9\x0f\x32\xdd\x56\xf8\x0b\x72\xc2\xde\x20\xd3\xa5\x53\xf8\x58\x47\xa6\x62\x15\x3a\x14\x40\x35\x75\xea\x0c\x35\x07\x1d\x50\x7d\x7a\xa1\x71\xf5\xf5\xcf\x57\xcd\x61\x47\x20\x96\x20\x6d\x2a\x61\x10\x00\x7b\xce\xc1\x9e\xfc\x7c\x6c\xb1\x4f\x61\x1f\x22\xe6\x81\xcf\x42\x9e\xea\x17\xf7\x6c\x52\x0e\x5f\x35\x4f\x64\xe5\x58\x9a\xc8\x47\xe6\x7b\x8d\xbb\x39\xce\xbb\x8a\x42\xfd\xad\x96\x7c\xa5\xcd\x0e\x6f\xec\xcc\xe4\x82\xaf\x65\x8e\xbd\x8a\x57\x8e\x11\xe7\x10\x81\x37\x35\x55\x41\x99\xfb\x43\xd0\x47\x36\xeb\xfc\x20\x2e\x80\xc0\x08\x91\xc1\xf0\x83\x38\xd9\xac\x00\xc3\x49\x80\xf1\x5e\x8b\x5d\xf3\xb3\xca\x07\xac\xa4\x73\x20\x28\x2c\x0f\xaf\x76\x2e\xee\x0f\x88\x9b\xcd\xba\x51\x2a\x3c\xa5\x59\x23\x32\x3a\xa6\xbb\x46\x28\x17\xaf\xe0\xea\xe1\xc6\x07\xd5\x97\x81\xe1\xe7\xc3\xbd\x66\x20\xfe\x13\xe2\x65\x47\xa9\xae\xf8\x09\x6a\x32\x4c\xd9\x21\x51\x03\x71\x77\xa5\x5a\x63\xc4\x8f\x94\x00\x23\xb8\x92\x1c\x2d\xaf\xa2\x1b\x9f\xab\x16\xbe\x3e\xf7\xcb\x62\xa1\x68\x25\xa5\x18\x91\xd9\xa0\x91\x51\x1f\x5e\x45\x97\x1f\xc2\xe2\x95\x61\x62\x69\x06\x36\x8b\x15\x36\x69\xec\xa8\xdd\x5a\x3c\xb2\xf1\x24\xf4\x9f\xf2\x82\x29\x3a\xf2\xc5\xd6\x42\xaf\x27\x09\x86\xd3\xaf\xc9\xfb\x3c\xfd\xd8\xcb\x66\xd7\xa8\x1e\xde\xc9\xad\x60\xca\xe6\x2b\x26\x51\x84\xdd\x44\xd2\x63\x0b\x25\xd9\x02\x2c\x69\xa1\x9b\x76\xf4\x59\xee\x37\x14\x92\x29\xae\x48\x99\x04\xb0\x1c\x66\x35\xcd\xd5\x67\xd8\xd1\x67\x58\xf2\x11\x04\xb9\x51\x0b\xd6\x78\x66\xe7\x7e\xe3\x7b\xaa\x89\x64\xec\x58\x77\x2c\x09\x09\x47\x74\xd2\xe5\x80\xc2\x04\xb9\x2e\x5d\x00\x62\x79\x36\x71\xf4\x69\xee\xb7\x29\xe0\x60\x09\xae\x48\x88\xc1\x70\xf4\x29\x76\xf5\x29\x96\x1c\x29\x02\x03\xea\x0b\x28\xfa\x2b\xa0\x58\x28\xcf\xa6\x66\xa9\x25\xd6\xb4\x66\x8e\xad\xb9\x9b\x45\xc9\xb9\x3f\x7b\x8d\xc6\xd0\x1f\x95\x69\xce\xc3\xc3\xd6\x87\x5f\xe6\xe7\x02\x27\x4f\x73\x6e\xbe\xf8\xdd\xc3\x06\x5a\x28\x9c\x64\x9a\xd8\x08\xb8\x2f\x4a\x53\x4c\x53\xec\x6c\x01\x58\x83\x2f\x96\x0a\xf6\xd8\xaa\xf5\xb2\x59\x8f\x10\xbf\x62\x94\x35\x27\xef\xa1\x4d\xcd\xcf\x83\x31\xbb\x3c\x56\x29\x6c\xdb\x4f\xb0\x6d\x8f\xdf\x27\x78\xdf\x7d\xc4\xd0\xc1\x76\x62\x31\xf1\xd8\xd5\x67\x84\x35\x53\xd6\x7c\x85\x59\x4b\x7c\x2d\xd5\xf4\xa0\x02\x64\x3f\xbb\x76\xe4\xf8\xc7\x55\x86\x37\xa8\x49\x8b\xf3\x43\xee\xb3\x52\x61\x72\x0c\xda\xf0\x8e\x4d\xe9\x25\x37\x1e\x90\x0e\x75\x39\x1e\x68\x0d\x7b\xd8\x27\x72\x9d\xc0\x93\x16\xb6\x38\x70\x20\x38\x03\x6e\x73\x46\xea\x23\xdc\xe1\x04\xdb\x46\x26\xc3\x16\xe3\xbc\xa6\x60\xcd\xf9\x36\x3a\xf0\xa4\xc1\x5e\x3b\xa7\x39\x3f\xda\x15\xaf\x9c\xf7\x50\x0a\x16\x38\xa1\x51\xec\xb3\x63\x55\x5b\x21\x7f\x1f\xf1\x36\x05\x5a\xad\x91\xe8\xb1\xad\xcf\xec\xb2\xd5\xd6\xa7\xd8\x67\x83\xb7\x4d\xae\x42\x69\xd5\x34\x1f\x5b\x1d\x7d\x8a\x3b\xfa\xcc\xc6\x1e\x2e\x18\x06\x32\x41\x5d\x42\x41\x2f\xe2\xea\xd4\xf3\xb4\x0e\x12\x94\x79\x0f\xa3\xf3\x71\x03\x07\xb8\xcd\x23\x8f\x5c\x50\x9a\xcd\xc2\x04\x5c\x50\xaa\x1f\xbf\x53\xad\x81\x1d\x68\x07\x27\x42\x60\x52\xf4\xc9\x1b\xa3\x68\x01\xb8\xbc\xac\x41\xe8\x68\x21\x79\xba\x78\x78\x8a\xa9\x5e\x0d\x29\xc7\x33\x3b\xbf\x71\x7b\xa3\xb5\x82\xfa\x04\xf3\x3e\x36\xeb\x63\x70\x70\x9a\x0b\x38\x06\x5c\x86\x63\xfe\x2b\xe7\xb1\x3d\x24\x30\x3d\xd2\x36\xe5\x4e\xe2\x12\xbf\xec\x11\x5f\x21\x3a\x58\x67\x6d\x7d\x86\x83\xc4\x72\x0f\x58\xb2\xa7\xcf\x18\xbd\x28\xc9\xbe\x44\x19\xc3\x05\xb6\x04\x21\x4e\x02\x84\x61\x35\xda\x89\xa4\x80\x27\x01\x1e\xb8\x95\x64\x47\x54\x84\x75\x8a\x03\xf8\x97\x65\xa3\x32\x87\x23\xd0\xa7\xb8\x9d\x58\xef\x01\xe7\x46\x53\xec\x25\x92\x53\x70\x40\xe7\x9c\x37\xb0\x99\xc5\x56\x90\x4a\x50\x60\x68\x7f\x05\x83\xe9\xc7\x73\xee\xc4\x3f\x1b\x30\x63\xbe\xfc\xe1\xb0\xbd\xa9\x1a\x2e\x5b\x5f\x81\xd6\x12\xf6\x9c\x2f\x42\xab\x74\x9c\xb4\x6a\x5d\x51\x11\xe2\x38\x8e\x2a\x55\xa2\xae\x98\x52\x2a\x05\x91\x39\x12\x51\xa7\xd7\xb0\xc0\xb2\x59\xed\x90\xff\xc2\xa0\x77\x74\x51\xe4\x82\x27\x79\xb6\x05\xde\x2b\xcc\x07\x81\xfd\x0a\xeb\x08\x65\x57\xa8\x89\xab\x82\x96\x9a\x1d\x6f\x11\x22\x7b\x12\x85\x27\xe3\x6c\x58\x16\x8c\xf7\x86\x1a\x16\x57\x7c\x82\x25\xdf\x27\xbe\x6a\x08\x21\x2c\xf7\x40\x7e\x7d\xf1\xe7\x40\x35\x69\x77\x87\xbd\x15\x66\x62\xea\x01\x40\x7f\x49\x19\x8c\x79\x63\x5e\xe6\xb2\x26\xdd\xb7\xd4\x96\xca\x5c\xd6\x12\x9f\xc7\xc9\x58\xc6\x8f\x42\x03\xca\xc6\xae\xa6\x4f\x02\xa9\x02\x5f\x6a\xf0\xc6\x97\x4a\xd3\x54\x1c\xc0\x84\x73\x8c\x86\xd4\x0b\x47\x37\x1c\x93\xee\x52\xa9\x49\x37\xd2\xcc\x46\xfe\xe4\x3a\x4b\xa5\x0e\x63\x9d\xae\x2c\x75\xda\x5f\x2a\x75\xda\xe7\xf7\x6a\x33\xb8\xa0\xfc\xfa\xa6\xe3\xc6\x07\x86\xfc\xd5\x75\xc7\x8d\xaf\xbf\xdf\x83\x68\xf4\xa7\x70\xd8\x42\x30\x5a\x15\x13\x3b\x71\xb2\x3b\xf6\xc4\xc9\x2e\x79\xdd\x97\x82\x87\xed\x1e\x40\x0d\xa9\x2b\xc9\x44\x53\x8f\x2d\xac\x76\x9d\x63\xed\xa6\x7c\xc4\x81\x27\xd9\x68\x1d\x51\x70\xad\x19\xa9\xaa\x55\x4f\x3a\xfc\x11\x99\xea\x1b\x9b\x89\xbb\xf0\xbe\xe8\xe3\x88\x8a\xad\x48\x3c\x38\x9a\x41\x42\x18\x27\x1c\xb2\x04\xa1\x51\x84\x84\x23\x28\x71\xd4\xa5\x9a\x48\x9e\xcf\x6b\xea\x5b\xf5\x7a\x42\x33\x3e\xe9\x42\xd0\xad\x49\x17\x18\xd6\xd3\x8d\x7c\xa9\x8e\x15\xa5\xf9\xa4\x8b\xef\x7e\x62\xaa\xbf\xec\x83\xb9\x4e\xac\xb7\x56\x32\x16\xff\x75\xe0\x22\x91\x4f\x28\xae\xc5\xda\x1c\x2c\x5d\x7c\xdd\x3e\x6b\x08\xab\x8a\xce\xfe\x1b\xc5\x6b\xe0\xc1\xe1\x3f\xc6\x50\x8a\x86\x3a\x4a\x5e\x4f\x31\x26\x5b\x69\x1f\xb3\x33\x41\xd9\xb1\xee\x3d\x7b\x61\x7a\x2d\x6d\x3d\xe8\xf5\x82\x8e\xaf\x4f\x5a\xc3\x31\xed\xb4\x3e\xc0\xa8\x46\xf7\x06\xf4\xfd\x17\x7f\xd2\xb8\x9e\xf2\xfb\xc7\x10\x25\x5e\x9d\x2f\x30\xf7\xd1\xa6\xf4\xf9\x51\x8b\xbc\xed\x71\x49\x65\x28\x2e\x35\x69\x27\xf1\x79\xd8\x12\x9f\x8b\x47\xf2\x01\xb7\x52\x69\xbf\x38\xff\x55\x23\xc8\x3c\xa7\xab\xbc\x49\xb0\xec\x8f\x9a\x49\xe3\x86\xc4\xc2\x76\xf5\xdf\x94\x4b\x59\x51\x9b\x02\xd9\x9d\x28\x27\x6a\x5e\xd4\x69\x89\x9c\x28\x2e\x02\x32\x37\xd2\x16\xb1\xea\x6c\x1c\xba\xd6\xf5\x87\xad\xb1\xce\xa5\x1b\x2b\xda\x11\x49\xb4\x13\x39\x46\x6c\xc9\x52\xad\xc4\xba\x38\x4c\x08\xbf\x96\x6d\xde\xbe\xb2\x83\xfc\xfd\x79\x85\x35\x58\x66\x4d\x24\xe5\x1d\xeb\xd8\xd6\xda\x8c\xb8\x0b\x06\x52\xc2\x37\x28\xea\x82\xf3\x9a\x02\x22\xb4\x7f\x7f\xae\x8a\x3b\x17\xb5\x78\x25\xf2\x0e\x19\x54\xa9\x47\x81\xd4\x1a\xb8\xb6\x76\xe7\x23\xd3\x61\x3d\x7e\x0e\x7a\xef\x65\xd6\xad\x65\xb0\xdd\x1d\x61\xb7\xd7\x19\x77\x43\x9e\x54\x80\xa4\x85\x02\x8d\xb3\x98\x4e\x93\x13\x25\xad\xd6\x28\xb1\x6c\xec\x90\x73\xc1\x22\xd8\xd1\x5f\x70\x9c\x8f\x80\x89\xf5\x17\x32\x83\xbf\xec\x76\x52\x2f\xbb\x3f\x17\x66\x43\x1f\xf4\xde\x89\x63\xf9\xb6\xd9\xd0\x39\x18\xfc\xfe\x14\x42\x5a\x34\xd0\x22\x7e\x17\xee\xca\xda\x0d\x02\x03\x80\xe7\x1c\x38\xaa\xe5\x5a\xbe\x8d\x45\x2d\x33\xae\xe5\x29\xb5\x58\x69\xd6\x9d\x67\xf9\x36\xfb\x11\x57\x86\x14\xfe\x3b\x6a\x43\x21\x99\xd8\xce\x30\xbd\x3c\x0f\x5d\xeb\xce\xb5\xb5\xfb\xd1\xa0\x15\x06\xe0\x73\x29\x7e\x03\x92\x2e\x4b\x3b\xe9\xb2\xf1\x34\x6e\xd4\xd4\x37\x9f\x40\x32\xd0\x97\x6b\x19\x36\xc4\x64\xff\x08\x2a\x2f\x71\x02\x9b\x63\xb5\x31\x96\x9a\xbb\xf3\x73\xae\x55\xb0\x91\x62\xa9\x1a\x13\x1f\x88\x67\x4a\x69\x24\x5b\x65\x70\xad\xc8\x64\x3d\xa4\x93\xe3\x1e\x62\x2b\xd1\x47\xfd\xfe\x6d\x95\x8f\xb3\x0d\x41\x08\xf7\xe7\xd8\xa2\xdc\xa3\xf9\xd9\xca\xd8\xe8\x1b\x11\xc5\x88\x82\xf1\x1b\x8b\x7a\xf2\x68\x2a\x90\x0f\x5e\x52\xb8\x8b\x22\xd3\xab\x50\x7d\x78\xcc\xb8\x23\xd5\xef\xdf\x98\xf8\x19\x1b\xe7\xa7\x6a\xbf\xac\xae\xed\x97\x78\xed\xb3\x20\x51\xdb\xad\xc7\x96\xd5\x52\x69\x98\x44\xb9\x03\xd8\x60\xa7\xa9\xb8\x41\xbf\x42\xf5\x49\x83\x42\x6c\xa7\x32\x4c\x69\xf3\x04\x5b\x0e\x66\x87\xc9\x6f\x8f\xfa\xf0\x38\x2d\xfa\xae\x5d\x46\x1a\xcd\xd4\x33\x8e\x43\xd7\xba\x75\xa2\xce\x12\xd1\xf9\xcc\x47\xdd\x2f\x2d\xb5\xf4\xf2\x55\x4b\xb4\xf3\xa7\x96\x26\x8d\xf4\x63\xea\xc8\x1d\x67\x72\xbc\x94\x8d\xd7\x41\x4b\x70\xb6\x12\xad\x8b\x42\x4a\x17\xdf\x8e\xd3\x32\x06\x67\x56\x9c\x4d\x63\xc9\xe3\xb1\x27\xb7\x09\xca\xb6\x77\x62\xd9\xe9\x08\x6a\x69\xbf\x10\x94\x31\x0d\xee\x06\x09\x96\x75\x36\x2b\x3f\xf8\x42\xae\x78\x2a\xfd\x42\x11\x06\x9d\xcc\x16\xa1\x64\x44\xe5\x8a\xb3\x54\x58\x29\xc0\x6b\x64\xb3\x6e\xb2\x90\x6c\x68\xc1\x8f\x98\x8e\xde\xea\xca\xad\x8a\x1d\x34\xdd\xe8\x9b\x76\xd8\x91\xde\x8b\xf3\x5b\x91\xa5\xc3\x21\x94\x72\x90\xe9\x13\xb9\x97\xb5\xba\x9a\x8b\xcc\x06\x91\x3b\x58\xab\xab\x49\x03\x86\x43\x57\x9a\xcf\xd3\x8e\x34\x9c\x3f\x6c\x11\x4f\xbc\xb3\xfb\xa8\x99\x0e\x2b\x13\x98\x0e\x2b\xd0\x66\x5f\x2d\xd2\x31\x5d\x99\xeb\xb2\x5c\xca\x0e\xed\x1d\xe2\xb3\xaf\x16\x69\x98\xca\xf3\xcd\x5f\x55\x4e\xbc\x09\x77\x35\x52\xfa\x82\xde\x3e\x7e\xca\x73\xd7\xe1\x4f\xa2\x7a\x01\xf8\xad\xbc\x68\xb0\x0c\x5c\x30\x70\x01\x17\x71\x01\x17\xf6\xf0\xfe\x36\xde\xda\xc2\x85\x2d\x5c\xc0\xdb\xfb\x25\x5c\x28\x14\x71\x71\x77\x1b\xef\xe2\xe2\xce\x16\x2e\x6d\xb3\x42\xa2\x30\x54\xc0\xdb\x3b\x78\x1b\x17\x0a\xec\xff\xa5\x3d\x5c\x2c\xe0\xc2\x0e\x4b\x37\x0a\x78\x17\xf2\x77\x70\x11\x4a\x96\xa0\x59\xf8\xdf\x96\x81\x8b\xbb\x78\x1f\xea\x6c\xef\xe1\x7d\xbc\x55\xc2\x25\x5c\xc0\xfb\x2c\x8f\x35\x89\x4b\x5b\xec\xc7\xd6\x0e\xde\x82\x1a\xbb\x78\x6b\x57\xd4\x65\x25\xf6\xa0\x34\x6b\x74\x17\xef\x41\xf3\xc5\x02\xde\xe3\x49\xbb\x78\x6b\x3f\x82\x71\x07\xef\x40\xb3\xdb\xb8\xc4\xa1\x80\x7f\xb6\x39\xe4\x50\xb2\xc8\xfa\x29\xe2\x12\xde\x63\x45\x77\xf9\x77\x29\xca\x4e\xf4\x67\xb0\x36\xf6\x53\xdd\x14\x61\x88\x3b\x78\x1f\xef\xc8\x4e\x60\x98\x3b\x1c\x9b\x25\x09\x75\xa1\x28\x06\x58\x82\x31\xc2\x88\x4a\x78\x0b\x6f\xc3\x18\xb6\x70\x11\x46\xc2\x30\x93\x18\x03\xef\x80\x23\x85\x8d\x91\xa3\x48\x29\xb8\x07\x99\x45\x68\x87\x77\x50\x30\x64\x7e\xb1\xc8\xa6\xe4\xdb\xb6\xc0\xc5\x2e\x2e\xec\x73\xf8\x4a\x3b\x62\xf2\x0a\x80\xa0\x02\xeb\x7c\xdb\x50\x93\xf7\xd9\xdc\xec\x30\x54\x14\xd9\x14\x31\x1a\x88\x20\x2a\xc0\x40\x4b\xfb\x1c\x51\x25\x01\xe5\x36\xeb\x8b\xf5\xbf\xbd\x0b\x33\x5d\x84\x9c\x1d\xc8\xe3\x14\x50\x60\xcd\x73\x1c\x95\x00\x6a\x36\x90\x5d\xbc\xc5\x0a\x6e\x29\x73\x06\xbf\x80\x1e\xf6\xf0\xfe\x0e\xde\x2d\xe2\xbd\x3d\xbc\x55\xda\xc7\x5b\x78\x9f\xd1\x83\x98\xbf\xd2\xd2\xaf\x6d\xf8\x7f\x09\x6f\x6d\xf3\xa9\xe4\xf4\xc1\x1a\xdd\x97\x83\x62\x14\xbc\x85\x0b\xdb\x80\xcd\x5d\x46\x5e\x5b\x00\xd2\x3e\xc0\xba\xc5\x26\x99\x21\x69\x1f\x97\x4a\x8c\x2e\xf9\xf4\xee\xe3\x22\xe0\x1c\x97\x58\xf5\x18\x49\x7b\x11\xd0\x40\x3d\x6c\xd0\x9c\x54\x0a\x11\xb1\x6f\x2b\xff\x32\x70\xb6\x00\x8a\xa2\x00\xae\xb8\x25\x90\x29\xff\x57\x10\xb3\x2b\xfb\x00\x72\x14\x98\x2a\x40\xfa\x5e\x4c\xf1\xbc\x3f\x28\xb0\x05\xcd\x95\x44\x6b\x8c\x56\xb7\xf0\xb7\x9d\x12\xde\x2e\x6e\xc9\x09\x28\xb1\x02\xfb\x6c\x12\xf6\x77\x18\x74\x5b\xc6\xae\x01\xc4\x0e\x98\xd9\xc1\x5b\x45\xbc\xbd\x5d\x62\xe3\x30\xb6\x81\x80\x0a\x3b\x7c\x55\x16\x0c\x3e\x98\x3d\x20\xa9\x5d\x49\x8f\xb0\x24\xb6\xc4\xd4\x16\x4b\x8c\xe2\x4a\x30\xaf\x02\x2b\x00\xf2\x0e\x5b\xda\xb0\x16\x18\xfd\xec\xb1\x72\xc5\x12\xac\xb6\x22\x0c\x3e\x5a\x1b\x5b\x45\x41\xe4\x6c\xe1\x6f\x71\xaa\x29\x45\xb4\xbf\xb3\xcf\xe6\x74\x27\x46\x53\x31\xc6\xfe\x1e\x6f\x7f\x0b\x08\x07\x88\x50\x22\x8c\xd1\x24\x47\xe3\x16\x9f\x60\x9e\x04\x78\x35\x0a\x9c\xb6\x39\x59\xec\x45\xfc\x4c\x4e\x2d\x6b\xb6\x50\xd8\x2b\x31\xb8\x19\xd6\x8c\xe2\x1e\xfb\xa7\x84\x77\xf6\x4b\x30\x77\x8c\x21\xed\xb0\xff\xef\xe2\x22\x5f\xec\xb0\x4c\xf6\x18\xd1\x6c\xc3\x7c\x14\x8d\x6d\x20\xd6\x92\xc1\x39\x61\x69\x57\x36\xbe\x2d\x78\xcc\x36\x27\x52\x20\xc9\x52\x34\xe3\x05\xbc\xb3\xc3\x91\xb0\x2d\xd8\xe7\x2e\x1f\x47\x89\x4d\xb6\x60\x0c\xc5\xed\xbd\xd4\x8a\x29\x16\x77\xf6\x0a\x78\xa7\x88\xbf\x95\x70\x71\xdb\x28\x89\x91\x0b\xb4\x72\xb2\xd9\xe5\xb3\x54\x80\x96\xf6\x8c\x7d\xc6\xd4\xf1\xee\xbe\x61\xb0\xe5\xb2\xbd\xcd\x8e\x07\x96\xa0\x26\x40\xb1\x11\xfd\x57\xfc\xc3\x7f\xcb\xf9\xe9\x94\xff\xd4\x42\xfc\x5f\x09\x1b\x30\x6b\x25\xf8\x06\x3e\x03\x8c\xd5\x80\xa9\xe3\xa5\xb6\x95\x72\x86\x28\xcb\x4a\x25\xcb\xa4\x5b\xdb\x51\x72\xd5\xfa\x6a\x6d\xe3\x8b\x96\xd3\xed\xc6\xad\xc6\x35\x4b\x4a\xaf\xc9\xde\xd2\x7d\xc5\xff\x2d\x97\x4a\x8f\x47\xcd\xdb\x49\xd4\x36\x94\x9a\xac\xa5\x6f\x49\x00\x4b\x51\xe5\xed\x15\x88\x2e\x29\x68\x49\xe6\xc4\x20\x18\x62\x47\xdb\x16\xa9\x25\xb1\xa0\xe4\xf7\xb6\xf8\x8e\xfb\x92\x3d\xed\xc2\x46\x15\x23\x6a\x27\xf5\xd7\x88\xda\x59\x46\x47\x1a\x9a\x64\x09\x43\x81\xc6\x50\xa6\x57\xa6\x97\x96\x46\x55\x5a\x41\x58\x25\x05\xc9\x69\x92\x88\x5b\x28\x29\x23\x5d\x86\x54\x2d\x6b\x24\x5a\x29\x2e\xcd\x40\x01\xaf\x5e\x4c\x69\xdc\xaf\xfa\x6f\x47\xe0\xaa\x94\x18\x67\xfc\xdf\x37\x09\xf6\xce\x4a\x0a\xdd\x81\xe9\x50\xab\x26\x87\x9f\x4c\x49\xa2\xc2\x48\x4c\xf5\x32\x68\x31\x50\xb2\x25\x23\x41\x2c\xc9\xdc\x42\x41\xa1\x8a\x55\xcc\x21\xc9\x24\x76\xa2\x46\x8c\x68\x3e\x4b\xca\x72\x4d\xd6\x28\xad\x2c\x63\x2c\xd1\x56\x29\x31\x4b\x62\xaf\x4c\xc3\x53\xe2\x53\x26\xec\x91\x7a\x81\x30\x12\x4f\x3e\xb1\x55\x4c\xd2\xe3\x72\x54\x79\x22\x58\x30\x5d\x7e\x0a\x72\x73\x39\x24\x2c\xd7\x2d\xd7\xae\xb0\x7f\xd8\xaf\x7c\xc1\xce\x15\xca\xec\x2b\x27\x3e\xcd\x43\xf1\x06\xd5\x11\x8f\xa2\xbd\x7a\xea\x39\xf4\x43\xe4\x0f\xac\x54\x32\xb6\x8a\x07\x84\x66\xb3\xdb\xdb\x45\x63\xeb\x07\x89\xfc\x83\x15\x76\x08\xa1\xff\x53\xdc\xab\x14\x8c\x72\xa1\x60\x7a\xf5\xf9\x5c\xf3\x78\x90\xab\xdf\x55\x25\x4c\xa4\x43\xbc\x3a\x76\x89\xc3\x00\xc7\x1e\x31\xb0\x0f\xcf\xb5\xcc\xbd\x03\x3f\x1f\x87\xbf\xf6\x73\xde\x8f\x1f\x05\xd3\xb5\x1a\xf6\x01\xa1\x15\x8f\x34\xca\x3e\x69\x80\xa2\xc7\xf4\x0e\xfc\x6c\x76\x4d\xa3\x07\xae\xe5\xd9\xc8\xcc\xe5\x3c\x76\x50\xf2\xf2\x05\x35\x4c\x37\xf8\xeb\x72\xac\xee\xcc\xb6\xa8\xbd\x30\x9b\x7a\xbf\xf7\xae\xc1\x4e\x9a\xdf\x42\x89\xcf\x62\xe2\x33\xf9\x95\x2c\x5a\x4a\x7c\x6d\x23\xf3\xb0\x9d\xcd\x9e\xb7\xb5\x3d\xe5\x20\xf4\xc8\x51\xc5\x2d\xae\xc6\x94\x48\xbf\xdb\x84\xfc\xaa\x18\x07\xb4\x52\x28\x33\xe8\xf2\x05\x38\x36\x96\xc5\xfc\x70\x68\x21\xb9\xb0\x78\xac\x52\xf0\xaf\x35\xa6\xe4\xf9\x88\x7b\xc0\xf1\xeb\xe4\x73\x81\x9f\xaa\x14\xd4\x53\x75\xd0\x89\x45\xcf\xbb\xeb\xa0\x53\x15\x56\x3e\xd5\x5e\x26\xec\x8d\x84\x6b\xd3\x51\x8b\x8e\xfc\x8c\xd7\x1a\xf8\xee\xa8\x33\x5b\x47\xe6\x22\xa8\xb3\xa6\xdb\x57\x7c\x7e\x0f\xa9\x06\x09\x5f\x68\x9d\xad\x0f\xc7\x56\xcf\x78\xcd\x48\x59\xf2\xc4\x0e\x7b\xad\xba\xe6\x68\xee\x7c\xfe\x5a\x17\xda\x62\xa9\x34\x56\xf5\x5b\xed\xba\xea\x7f\x4e\xf3\xe6\xf3\xfb\xb6\x86\x90\x75\xef\xd8\xda\xa4\xc1\xe6\xad\x55\xd7\xa8\xe6\xa8\xcd\xb8\x08\x9c\x6c\x7a\xf1\x43\xe3\x4c\x81\x10\xcf\x7a\x71\x6c\xee\x8a\x81\x12\xcf\xfa\xed\xd8\xb8\xc0\x48\xbb\xed\xd9\xa8\x42\xcb\x5e\xdc\x27\x6b\x91\x6b\x28\xc2\x56\x1c\xc2\x37\x13\xe9\x36\x60\x45\xa9\xde\x5f\x83\xba\x30\x12\x39\x7b\x23\x84\xf8\xf5\xc8\x9e\x8a\x61\xc0\x8c\x73\x1a\x51\xce\x49\x4b\x83\xcc\xe8\xfa\xff\xf4\x12\xce\xf7\xaf\xc9\xb9\x79\x8e\xd6\x8d\xf0\xc4\x8c\xa4\x31\xb1\xde\xbe\x12\xb6\xc4\x85\xb2\x1c\x23\xb7\x88\xcd\xcb\x84\xbc\x48\x30\x64\x01\x19\x83\x18\x16\x7f\x3c\xdc\x0e\x23\x80\xa0\xae\x3e\xb7\xeb\xd4\x71\x50\x47\x66\x07\x66\xfb\xec\x8d\xf8\x75\xe5\x75\x5e\x5d\xd1\xab\x45\x0e\xa2\xa3\xb1\x57\x68\x39\x81\x9b\x9b\xcb\x4a\x58\xd7\x6a\x97\xfc\x8d\xf3\xe0\x03\xa2\xeb\xd6\xb5\x93\x96\xd4\x70\xc4\x2a\x23\x84\xf9\x78\x95\xe9\xef\x2d\xc3\xd6\xe3\xb0\xf5\x24\x6c\x2a\xbe\xfa\x75\x45\x89\xe0\xf6\xc2\x91\x1f\x8e\x48\x3c\x6f\x90\x2c\x88\x77\x8d\x38\x15\x87\xab\x77\x9f\xb5\x3e\x6f\xb3\x2f\xdb\x6c\xd4\x15\x23\xa0\x17\x3e\x09\xb1\xce\x4f\x43\x9f\x8b\x8e\xa3\x39\x98\xad\xb3\x88\xc4\x14\xfd\x56\xa4\xce\x03\xff\x0d\xa6\xbf\x02\x14\x19\xf3\x87\x78\xd9\xac\xe6\x33\xa0\xbc\xa8\x25\x7f\x01\xb4\x10\xd6\x09\xeb\xba\x53\x47\x26\xfb\xdb\xab\x2b\x4b\xe9\xad\x9e\x36\x80\xf9\xd5\xd6\xc4\xf2\xe1\x4b\x04\x7b\x2b\x56\x86\x5c\x60\xb2\xa7\xe3\x0e\xc4\xed\x8c\xf1\x3d\x10\xed\xc6\x2a\x4a\x31\x58\x17\x53\x35\xd0\xa3\x8b\x7d\xae\xfe\xce\xb4\xc2\x8c\x83\x3c\xcb\xb7\xb9\x7e\x3d\x72\x06\xc9\xca\x0e\x93\x86\xd5\xff\x1d\x06\xd9\xfa\x8b\x69\x23\xe1\x44\xf2\xff\x01\xb1\x80\xce\x78\x6e\x47\x40\xcc\x2b\xa8\x58\xa3\x51\x9b\xb0\x4e\x21\x62\xe7\x46\x95\xe2\x1a\xff\x49\x4f\x28\xbe\xf4\x11\x8e\x8b\xf1\x74\xe7\x84\x62\xf7\x84\x22\x54\xa6\x24\xa6\x71\xaa\x5e\x0e\xc5\x46\x9a\x2b\x3b\x7f\xaa\xd2\x0a\x25\xd0\x2b\x0f\x13\xaa\x59\xff\x5a\xff\xeb\xef\xa1\x8d\x36\x36\xf1\x7d\x87\xa2\xb2\x02\x1b\x03\xc0\x3b\xa1\x56\xd3\xb3\xb9\x4b\x95\xd3\xcb\x55\x3d\x4d\xfe\xb4\x66\x1b\xf5\xca\xe9\x65\x99\x2e\xbe\x01\x6a\x4f\x28\xf9\x5c\xff\x7b\x6a\x18\xeb\xe5\x53\x1f\xaf\xff\x3d\x5a\x2f\xaf\x67\xff\xbf\x7d\x73\x1d\xaf\xff\x1d\xc2\xef\x82\x01\x1f\x53\xe3\x88\x7f\x16\xe0\xb3\xc1\x3f\x8a\xf0\x31\xe0\x1f\x5b\xec\x23\x03\xbf\xb7\x58\xc6\x5f\xeb\x7f\x95\xaf\x7c\xbc\x9e\x5d\x2f\x9f\xfb\x78\xfd\xaf\xf5\xf2\x4f\x1f\xaf\xe7\xa1\x40\x69\x9b\x15\xde\xe4\xbf\x77\xd9\xef\x83\xf5\xf2\xa5\x8f\xd7\x09\x24\xed\x40\x2f\x3f\xd6\xcb\x17\x0c\xa8\xb1\x61\xec\x18\x1c\xb0\x1d\xe8\x70\x6c\x18\x7b\xdb\xa2\xd3\x2d\x99\x42\x79\x91\xc2\x0e\x07\x78\x5c\x34\x8a\x7b\x90\xb2\x57\xdc\x2a\x46\x49\xfb\x32\x69\xcb\x5c\x57\x58\x89\x7b\x42\x15\x9c\xf9\x27\x94\x89\x01\x80\x22\xe7\x84\x92\x4d\x8b\xa1\xe8\xef\x69\xb1\xf8\xf7\xb4\xb8\xfb\xf7\x74\xcb\xfd\x7b\xba\xe5\xdb\x9b\x01\xf6\x58\xee\xbf\xb4\xca\xda\x70\x34\xeb\xf8\xf3\x5e\x38\xa7\xd0\xe0\x9c\x0e\xdc\x66\x6b\xe2\xcf\x1d\xea\xb6\x83\x41\x6f\x1c\x7a\x73\xb7\x35\xf2\xe7\xe0\x8b\xba\xe5\xcd\xdd\x9e\xe7\x3b\x74\xe8\xcf\x3d\x3a\xa2\x73\x6f\x38\x0b\xdd\x79\x73\xe0\x37\xe6\x9d\x5e\x18\x78\xfe\xd0\x9d\x0f\x07\xee\x7c\x3c\xf4\xbb\xb4\x8f\xb4\x4a\xd9\xa2\xf9\x0f\x23\xbf\xff\xef\x8d\x72\xde\xfe\x8e\x36\x36\x5b\x78\xa3\x4a\xc9\xe6\x81\x56\x29\xaf\xcd\xff\xde\xac\x68\xac\xc0\x61\xfe\xc5\x16\x7f\x8d\xfc\x7e\xf9\x6f\x56\x14\x2a\xff\xeb\xc7\x5f\xeb\xf6\x7c\xdd\xfa\xd7\xba\xfd\x7d\x7d\xfe\x97\xf5\xaf\xbf\xec\xef\x7f\xa1\xef\x3f\x36\x03\x4c\xd9\x08\x0e\x36\x83\x18\x17\xef\xf5\x38\x96\xae\xca\xdb\xdf\xeb\xdc\xb7\xc9\x85\x47\xa8\xde\xae\x6a\x8a\xe5\xa1\xcb\x23\x7c\x75\x60\x03\x1d\x95\x3f\x95\x20\xdf\xc4\x30\x3d\x2e\x61\x7a\xb9\x1c\x5f\xe7\xac\x18\x93\xc5\xe6\x73\xe3\x00\xae\x4e\x3c\x1b\x24\x56\x70\xb7\xb9\x56\x88\x02\x0a\xa7\x75\xf5\x50\x0c\xd4\xf5\xac\x95\x37\xde\x8a\xe5\xdb\x28\x55\xcf\x20\xc4\xe5\x3e\xe2\x79\x15\xb4\x70\x89\xb1\x46\xdc\x05\x44\xb6\x95\x63\x08\x5e\x19\x03\x89\xc2\x3b\xaa\x23\xad\xb7\xa3\x52\x0d\x46\x18\xd6\xa1\x8d\xa9\x35\xb0\xe3\xe2\x6f\xc2\x62\xbe\x05\x6e\x11\x8d\x03\xca\xfe\x71\x92\xb5\xb0\x23\xca\x2f\xb9\x1f\x95\x2e\x05\xb4\x21\xca\x34\x7a\x83\xcc\x35\x1d\x0d\x5a\xd3\x0c\x63\x6f\x83\xb1\x3b\xea\x0d\x98\xf0\x05\x6d\xbd\xf2\xbb\x6b\x19\xc1\xe1\xc2\xb3\x0c\x36\x22\x2c\xbf\xd8\xe0\x14\x43\xc9\x48\xe4\x8a\x27\x00\xd0\xaf\x53\x57\x43\xd6\x21\x9f\x83\x14\x5a\x79\xde\x80\x23\xd6\x91\xf1\xa3\x2e\x3c\x8e\x5b\xb0\x78\x53\x83\x17\xcc\x96\xf6\x22\x46\x2f\xd0\x08\x32\x01\x80\x88\xb1\x0b\x63\x39\x97\x35\xe6\xdb\x56\x83\x6d\x1a\x57\xb6\xd8\xb8\xb8\x29\x1d\xa6\xab\xaf\xa8\x25\x02\x3f\xe3\x93\x8a\x65\x63\x31\x1a\x4e\x49\x4c\x9c\x27\x96\x9d\xba\xd1\x71\x60\x18\x2e\x07\x9e\x18\xb1\xbd\xe5\x23\x79\xaf\xf3\x57\xaf\x69\x57\x72\x8c\x98\x6e\x05\x82\x5f\x29\x16\x63\x89\xbd\x13\x89\xd9\x19\x8e\xbb\x5d\xca\x25\xc6\x61\xa6\x17\x76\x66\x99\xe1\xb8\xdf\xef\x0d\x46\xbe\x97\xe9\x85\xc2\xc7\x51\xa6\xd7\xc8\xf8\x6f\x63\xda\xc9\x0c\x5b\x1f\xfe\x7a\x34\xb4\x59\x9d\x9f\x99\xa2\x7e\x85\x90\x2b\xaf\xc3\x73\x80\x71\xd7\xb6\x3c\x7b\x91\xb0\x49\x0e\x4e\x94\xc8\xd6\xfa\x2b\x23\xc5\x35\xe2\xc8\xf9\x8c\x81\xfc\xd5\xf4\x33\x41\x6b\xe2\x87\x99\x2e\x07\xb7\x49\x87\x99\xa6\xdf\x0a\x9a\xa3\xcc\x7a\xce\xe1\x35\x73\xeb\x38\xe3\x8c\x47\x99\x4c\xe8\xfb\xde\x30\x33\xea\x65\x9a\x74\xe2\xc7\xc5\x44\x07\xb9\xdf\xbe\x6a\x64\x0a\xf3\xfb\xca\x17\x01\xfb\x3b\xb0\x79\x7b\x6c\x3d\x24\x27\x9c\x11\x9f\x9c\x70\x07\x26\x9c\x2e\xa0\x8c\xf3\x65\x19\x81\x75\xd6\x28\x14\x57\xa4\x78\x77\x91\x32\xab\x10\x68\x88\xab\xac\x11\x01\x90\x30\x97\x11\xe8\x11\xd0\xc6\xb7\x8a\x4a\x40\xf0\xf9\xdc\x10\x64\x14\xd7\x58\xb1\x2a\xe2\x3e\x22\x7e\xa3\x71\x6b\x59\xb9\xf2\x80\xc0\xf2\xf1\x42\x41\x07\x84\x1d\x6f\x0a\x27\xf9\x1d\xf5\x42\x33\xba\xb4\x84\x40\x97\x6f\x3d\xba\x2a\xc8\x9f\x18\x4c\x0c\x51\x3c\xaf\x87\x61\xa6\x15\x4e\xfc\xc1\xd0\xcf\xb8\x34\xe4\x74\xe7\xf8\x99\x11\x6d\xfb\x21\x90\x5d\x66\xf8\x36\xa6\x03\x5f\x4c\xbb\xce\x9d\x6c\x49\x47\x4e\x62\x69\xcb\x3b\xb4\x0f\x41\x85\x06\x36\x22\x2c\x1b\xd1\x81\x52\xcc\xb5\x65\x15\x36\xa9\x6d\xa3\x45\x6c\x91\x11\x03\x86\x1d\xb6\x0e\x85\x67\x21\xd0\x19\x7c\x3a\x96\x9b\x58\x87\xea\x22\x75\x38\x49\x13\x97\x10\x8f\x9d\x65\x17\x54\x52\x14\xf8\xf1\x6c\x9e\x50\x8d\x11\xb8\xbc\x64\x96\x30\xb5\x4e\xa8\xe6\x60\x43\x92\x5b\xbe\x80\xc5\x94\xe6\x0b\x88\x5b\xc9\xa0\x0a\x2f\x23\x4a\xc8\x10\x2f\xf1\xba\x69\xf2\x0d\x3d\x56\x23\x48\x4a\x46\x91\x5b\x56\xef\x40\x2c\x8b\x6c\x76\x4d\x73\x7f\x90\x88\xa8\x81\xbd\xc4\xf4\xe0\x99\xe0\x43\x90\x33\x31\xd7\x36\x19\x35\xf8\xb9\x1c\xf6\x09\x89\x1a\xd0\x7c\xe2\x61\x37\x97\xc3\x2e\x89\xda\x91\x52\xac\x63\x8a\xcb\x65\x1c\x10\x0f\xe2\x0b\x40\x53\xa6\xf8\xcb\xbf\x03\xf1\x1d\xd8\xa4\x6d\xfa\xbc\x3b\x0f\xba\x63\x80\x34\x88\x6b\x36\x0e\x44\xc3\x66\x83\x61\x56\x14\x68\xd8\x9b\xc4\x57\x6c\x53\x04\x44\x92\x6a\xfd\x35\xe2\x01\x69\x07\xca\x08\xf0\x17\xcd\x01\x8f\xce\x93\xe0\x7b\xdc\x38\x9b\xe2\x38\x58\xed\xa3\x4e\xdd\xaf\x4c\x06\x5f\xd5\x58\xe7\x87\xf5\xe4\xa5\xbc\x64\x21\x03\x5b\xce\xe4\x32\xeb\x00\x8f\x33\x12\x0e\x8f\xb3\x8e\xa8\xe7\x78\x62\x3f\xea\xa9\x20\xee\x86\x78\x3a\x43\xe5\x5c\x18\xe2\xd5\x8c\xe8\xb1\x42\x05\xab\x71\xb9\xd7\xdf\xc5\xa3\xde\x1d\x77\x46\xad\x7e\x67\xd9\x8f\x5b\x4a\xdc\x59\xe6\x36\x4b\x7c\x57\x6e\xe9\xb0\xfc\x5c\x7f\x08\xfb\xb9\x68\xbf\xe5\x72\x2b\xba\xcc\xbd\xef\xf6\x42\x4f\x72\xe6\x61\xb3\x37\xee\x78\x9c\xf5\x46\xce\xed\xc2\x71\xd7\xf1\x07\x6c\xfb\x18\xf4\xde\x87\x19\x3a\x84\xac\x46\x6b\x30\x1c\x01\x2b\xe7\x76\x01\x43\x3d\xde\x52\x5e\xe3\x85\xb3\x90\x12\x89\x24\xb9\x76\x9c\x17\x3f\xe9\x3a\x94\x00\xa8\x8c\x44\x82\xea\x7b\x19\x67\x96\xa1\x11\x1c\x83\x0c\x0d\x7b\xfc\xa9\x57\xc4\x58\xb8\x71\xf0\xb2\x99\xc8\x3f\xda\x3c\x9d\xd1\x80\xba\xff\xdd\xf6\xa9\xff\xf3\xfd\x33\x9f\xdc\x3f\x1f\xf5\x76\xf5\x2b\x42\xbd\xf0\x54\x5f\x57\x27\x34\x6d\x94\x23\xe8\x55\x73\x2b\x6e\x39\x66\x3b\x79\x23\x57\xc0\x1a\x7f\x19\x26\x98\x12\xca\x3b\xb9\x02\xd0\xb1\xfa\xe2\x80\x37\xe5\x47\xe0\x90\x48\x70\xcb\xb9\xb6\xe5\xe4\x3c\x5b\xdd\xe3\x7c\x85\xb2\x5f\x4f\xe8\x4a\xd1\x4a\x30\xde\x88\x99\xb3\x1e\xd5\x68\x47\x5c\xca\x92\xfc\x2a\x20\x94\x18\x66\xa0\xee\x60\x41\x2e\x87\x68\x2e\xe2\xfe\x3e\x0e\xd0\xf7\x0f\xb6\x29\x07\xb8\xc1\x1d\x3b\x6a\xc6\x01\xf1\xb3\x59\xff\xc0\x55\x16\x51\x23\x9b\x6d\xf0\x04\xc6\xcc\x14\x8a\xf7\xfc\x69\xa6\x37\x1e\xb1\xc9\x72\xd8\xc9\x66\x98\x79\x6f\xfa\x61\x66\xe8\x8f\x46\xad\x30\x90\x54\x36\xa1\x9d\xb1\x8f\x33\xda\x7a\xce\x07\x1b\x99\xdc\x3a\xca\xb4\x42\x98\x58\x96\x28\x7a\x02\x8b\x27\x21\x00\xd4\x7c\x64\x2a\xc2\x62\x4a\x18\x88\x95\x84\x27\xc9\x57\x61\xb3\x7a\x2a\x8e\x9c\x3c\x11\x7f\x77\x16\x09\xdf\x56\x89\x33\x9e\x72\x5e\x3e\x92\x1a\x40\x2e\x99\x12\x12\xab\xa9\x3b\x27\xfc\x6d\x70\xa4\x96\xbd\x0e\x22\x75\x5f\x32\xe3\xa4\x89\xd2\x8a\x0d\xe5\xe1\x1a\x68\x95\x01\x85\xeb\x47\xd4\xcb\xb0\x6a\xc0\x29\x26\xfe\xc0\xa1\x1d\xdd\x67\xc8\xa2\xa3\xde\xa0\xcc\xa4\x30\x33\x06\xad\xcb\x61\xa6\x84\x5a\xaf\x9e\xad\x19\xc8\xec\xbe\x6a\x34\xb2\xb7\x5d\x1e\xcb\x71\x42\x3c\x3f\x82\x8d\x56\x94\xfa\xdd\x4a\xc9\x6a\x31\x2e\x72\xae\xe6\xa0\x05\x36\x14\x39\xbf\x5a\x4f\x14\x11\xed\x6e\xb2\x93\x5c\x5c\x28\x3c\x51\x8c\xb6\x39\xac\xa2\x37\xcb\xc0\x7a\x71\x1b\xeb\xdb\x58\xdf\xdd\xc6\x05\x5b\xef\xd2\x7e\x22\xa6\x0b\xfd\x0e\x37\x14\x91\x1a\x5e\x73\xac\xa6\x35\x62\x5b\xbb\x9d\x63\x3f\x67\x0e\xfc\x46\x9b\xc5\x85\xaa\x21\x4c\xcd\x7d\xd3\xfa\xf0\x6c\xad\x2f\x52\xd5\xb3\x50\x3f\xb9\x9a\x00\x13\xd8\x23\xd5\x34\xb1\x50\xe2\x2a\x21\xfa\xe9\x77\xba\x40\xd8\xe7\xc5\xa2\x90\x75\x19\xfe\x3e\xcd\xcb\xfb\xdf\xfd\x04\x92\xde\xd4\xf1\x1f\xd5\xa5\x4e\x0e\xbb\x5c\x63\xfe\xb2\xd4\x97\xc3\xfa\x72\x7f\x10\x0a\xc1\x73\xbf\x38\xfc\x9c\xd4\x57\x35\x1a\x6d\x86\xda\xe9\x6a\x82\xcf\x3b\xfc\x99\x53\xdc\xd0\xe9\x32\x31\xb0\x6d\x76\x09\x2e\xde\x15\xe0\xc1\xfb\xc1\x64\x64\xcd\x23\x0e\xf6\x13\xf0\xf9\x71\xb3\x67\x5f\xd3\xd8\x57\xa0\xb9\x00\x1a\xa8\x09\x07\x27\x94\x14\x36\xf9\xc4\x15\xbf\x37\xf5\xfa\xb9\xaa\xa2\x1b\x9e\xa8\x91\x4a\x8c\x1f\x2e\x8a\x57\x4d\xd8\x1b\x74\x69\x27\xe3\xb5\x86\xa3\x41\xcb\x19\xb3\xf2\xe5\xcc\xb0\x15\x74\x69\x86\x64\xd6\x73\x6e\xee\xb7\x6f\x72\x47\xd8\x6e\xb4\x48\x09\x71\x2a\x1e\x2d\x1b\x26\x25\x1a\xcd\x3b\x68\x33\x8a\x60\x33\x38\xa1\xdf\x9b\xba\x3f\xed\x6b\x79\x7d\xfb\x3b\xfd\x4e\xd1\xa6\x32\x07\x23\x75\x66\x3f\x17\x26\xb5\x1e\x1c\x3b\x19\x94\xc8\xa2\x36\x01\x91\x21\xe3\x54\xd8\x47\xd9\x40\xb9\x82\x2a\xb4\xc4\xaa\x3f\xb5\x31\xde\x32\x76\x09\x23\x9e\x97\x57\xcd\x51\xb4\x85\x6d\xcd\x41\x56\x3f\xd5\x91\xc2\x43\x08\x71\x17\x28\xb9\x94\xe2\xb5\x20\x79\x91\x65\xd8\x84\xfc\xaa\xe4\x9c\xb2\xa3\x2e\x9d\x9f\xf5\xe8\xa6\xa9\x0d\x01\xb9\x3e\x17\xc2\x0d\x5e\x53\x3c\x29\x6a\x12\xc3\x6c\x08\x37\xf5\x8f\xa1\x7a\xe8\x3f\x17\x33\x7e\xff\x9a\x3a\xca\xa1\xcf\x86\xd8\xfc\xdb\x6c\xd6\x78\xc0\x43\x7e\x2d\x38\x39\xa1\xa4\xa9\x77\x7a\x81\x56\x50\x5f\x06\x5c\xa8\xca\x49\x0a\x11\x7a\xde\x7d\x4e\x19\xef\x27\x94\x58\xeb\xdd\x56\xd8\x1b\x04\x83\x96\xd7\x69\x85\xfe\x3a\x76\x27\x14\x0f\xab\xb8\x7a\x81\xbd\x21\x9e\x4d\x29\x3e\xae\xe2\xe9\x19\xbe\x3f\xc3\xce\x09\x7e\xac\xe2\x5e\x15\xbf\x9f\xe3\xe1\x39\xfe\x7d\x81\x07\x03\x8a\xd7\xe9\xb4\x35\x1c\xb5\x46\x1d\x7f\x1d\x07\x27\xf8\xad\x8a\x2f\xce\x70\xfd\x0c\xd7\xce\xf0\xcf\x21\xc5\x4f\x43\xdc\xac\xda\x8a\xf5\xb5\x72\xe3\x24\x1e\xa7\x36\x47\xdd\x4e\x79\xca\x67\xe9\xd4\x87\x80\x2d\x67\x3e\x2d\x7b\x98\x86\x6e\xb3\x37\x28\xbb\xf8\xc4\xa7\x65\x07\x6f\x1c\x96\x8b\x06\xee\xd2\x41\xd0\x0a\xcb\xdb\xca\xfb\x57\x5e\x57\xf8\x64\xa7\xd6\xdb\xa1\x1d\x5f\xc5\x7e\x86\xb4\xeb\x97\xeb\x58\xa8\xb2\xcb\x96\x8d\xef\xdd\xf2\x27\xa8\x05\x6f\x58\xd6\xc3\xe9\x62\x21\xfc\x8e\x3c\xb7\x34\xa8\xbd\x72\x73\x03\x67\x23\xfe\xc5\x02\x61\x17\x1c\xf7\x3a\x15\x97\xcc\x40\x59\xf5\x76\x68\x83\xb7\x1f\xf6\xf5\xfa\x2a\x9a\x30\x18\x7b\xc4\x94\x7c\xa8\x89\x4c\x7e\x61\x94\xd8\x78\xd5\x5c\x2c\x21\x4b\x82\x73\x3b\xa6\x8b\x85\x72\x36\x4b\xc3\xef\xae\x00\x5f\x51\x16\xa9\x5b\x2e\xaf\xea\x5f\xa6\x6a\xd4\xc7\x74\x11\x35\xf7\xab\xb5\x92\x7f\xf0\xaa\x77\x67\x51\xb9\x43\x18\xe9\x86\x8d\x52\x8d\xd5\x18\xb8\x8b\xc4\xeb\xe1\x8f\x7f\x00\xc3\xcd\x7f\x03\x43\xcb\x2b\x5f\xd4\x35\xab\x59\xc5\x0c\x02\xbd\xe5\xd9\xe8\x3f\xc2\x75\x2d\xe1\x8a\x8f\x48\x09\x69\x84\xf5\x69\x4d\x66\x76\x42\x90\x44\x9f\x91\x33\xa1\x28\xac\xdc\xef\x61\x59\x3c\x78\xb6\x36\x6c\x6b\x6a\x27\xa6\xe5\x76\x88\x41\x0f\x5d\x1e\x8c\x69\xce\xd3\xa9\x93\x1b\x84\x34\xa7\x79\xfa\x2f\xb7\x72\x78\x56\xbe\x45\xb9\x77\xfe\x7d\xef\x57\x1a\x97\xec\x7b\x08\xdf\xd6\xb9\x67\x57\xae\xab\x2c\x21\x68\xe0\xd3\x90\x96\xd7\xd6\xa8\x55\x9f\xd9\xd1\xb8\x80\xa9\x56\x6a\xe5\xa1\x8f\x72\xd0\x73\xcb\xb3\x17\xfc\xc2\xf1\xfd\xa2\x9c\x24\x0d\x0e\xc2\x38\xc8\x01\x26\x74\x67\x30\x1e\x36\xb3\xd9\xf8\xb7\xee\x3a\x1a\x82\x9e\x92\x38\xba\x03\x1c\x25\x44\xb6\xab\xba\xfa\xee\x16\xde\xff\x76\x38\x1f\x0d\xc9\x67\x6b\xe4\x77\x87\x65\xcb\x5e\x08\x8b\x6d\x1f\x8e\xe1\x83\x90\x89\xe3\x08\x87\x0c\x9d\xf0\x32\x85\xf1\xc5\xf2\xfb\x05\xf6\xe8\x88\x96\x3f\xe1\xbd\xb9\x63\xcd\x5c\x7b\xb3\x88\x01\x9e\xb2\xbf\x58\x20\x24\x1a\x09\xb2\xd9\xa8\xe6\x75\x5d\x0b\xd8\xb2\x31\xa3\x1b\x59\x37\xba\x9d\x25\xc4\x8b\x45\xe2\xab\x56\xe8\x67\x80\xe7\xb0\xc3\xcd\xb0\xef\xbb\xad\x06\x3b\x51\xbd\xb7\x46\x4d\x26\x28\xd3\xcc\xc8\x9f\x8e\x32\x80\x18\x76\xa8\x71\xc9\x75\x5d\x73\x73\x7e\x03\x7b\xc8\x8c\xba\x73\xd1\x02\x32\xd8\x88\xdb\x89\x74\x01\x5b\x27\x9b\xd5\x42\xbd\xe5\x91\x0e\x3e\x9a\x6a\x21\xfe\xe4\xe0\xbf\x85\x8b\x78\x79\xc2\x60\xef\xcf\xf8\x60\x43\x85\xde\x8e\x4e\x68\x74\x10\xe2\xa5\x7c\x89\x12\xde\xcc\x30\xd4\xba\x47\xb8\x90\x78\xc9\x7f\x1d\x1d\xb6\x29\xe1\x95\x7e\x0f\x45\x25\x36\xa2\x32\x15\x93\xed\x2c\x16\x26\x38\x99\xd1\x19\xf3\x24\x6b\xaa\x68\x1a\xaf\xc4\x9b\x95\xb3\xd9\x6a\x68\x6d\xb9\x5d\x03\x37\xf6\xb1\x87\x1b\xb1\x05\x48\x48\xda\xc4\x30\xc3\x03\xc9\x48\xcd\x50\xda\xeb\xf7\x05\x73\x0d\xe1\xd6\xbd\x0f\x1c\xf1\xfe\x2c\xd2\xe4\xf5\x49\xdf\xda\xb0\xf1\x90\x18\xe6\xf0\xa0\x0f\xd8\xbc\xb0\xcd\xa1\xac\x3d\x26\x3c\x6d\x68\x9b\x63\xa8\xfa\x7b\x08\x61\x32\xb9\xac\xd7\xc6\x63\xbe\xc0\x18\xa5\x20\xb4\x58\x18\x84\xb4\x21\x3f\x98\xcf\xc5\x1b\xfc\x89\x19\x90\x36\xc0\x39\x24\x21\xe9\x43\x3f\x11\x94\xac\x1f\xb1\x7c\xc7\x02\xce\xa1\x8d\xc7\xf1\x4a\xbe\x3f\x2b\x8f\xc9\xf1\x09\xd5\x58\x47\xd8\x41\x66\x98\x23\x63\x76\x22\xd2\x8c\x83\x61\x65\xac\xff\x9c\x94\x0d\x64\xf6\x05\x3c\x7d\x3c\x86\xb3\x9f\xe2\x0c\xcb\xbf\x28\x87\x39\x52\xd0\xb7\xbf\x07\xb9\x71\xbc\xba\x6e\x9c\x45\x5c\xa9\xf8\x3d\x80\x36\xac\x13\x5b\xeb\xe7\x8a\xdf\x83\xcd\x82\xbe\x53\xd8\x43\x66\xc0\xd3\x42\x35\x6d\x22\xef\x1a\xfa\x38\xe0\x23\x0c\xc9\xcf\x57\xcd\xd3\xa7\xf9\x86\x3e\x45\xb8\xcf\xbf\x66\xf9\x86\x3e\x43\xf8\x83\x47\xd1\xfc\x20\x6e\x85\xbb\x64\x60\x05\x73\xe1\xf7\x36\xf6\xf4\x59\xee\x5b\xff\xbb\xd6\xce\x4d\xac\x43\x7b\xb3\x88\x50\x39\x51\x62\x62\x0d\xd8\xe2\x63\xc5\xfa\xdf\x45\x11\x3c\x24\x1f\xfa\x34\x2f\xb2\xc6\x64\x98\x63\x3f\xf1\x11\xf9\xd0\x67\x79\x5e\x06\x57\xc9\x11\xb4\x68\x06\x4c\x22\xe3\x57\x3c\xa2\xe1\x0f\x7d\x8a\x8f\x01\x38\xfc\xa1\xcf\x70\x7b\x53\xe9\x1c\x40\xe5\xc5\x8e\x5f\xa1\xa4\xa7\x4f\x71\xbe\x00\xbe\x1c\xb8\x97\x06\xc0\x85\xcb\xc6\xe8\xea\x33\xf9\xc5\xc6\x28\xf3\x3e\x58\xde\x87\xcc\xfb\x60\x79\x81\xbe\xf1\x4a\x0a\x84\x84\xdf\xfb\x15\x8b\xd1\xf4\x87\x5d\xb6\x3e\xb0\x87\x5d\x1b\x99\x81\xde\xe0\xaa\xce\xd3\x8e\x06\x55\x8e\x10\xf7\x83\x3c\x16\x7f\xab\xe2\xef\x10\x7c\x27\xf8\xd6\x99\x9d\xdb\x36\x5d\xe2\x5b\xae\x67\xe7\xb7\xf9\xa1\x9c\x35\x62\x9d\xd9\x3f\x88\x97\xcd\xc2\x6f\xd7\xb3\x0f\x88\x8b\xd0\x67\x48\x9a\x6d\x0d\x66\x36\xe4\x65\xcc\x17\xaa\xb1\x9f\x0c\x09\x0d\x7d\x8a\x43\x51\x9c\x0d\x13\x99\xbf\x92\x99\x7d\x9e\xca\xd6\x0c\x09\xf5\x8d\x57\x34\x24\x7d\xcb\xb0\x31\xfb\x87\xf4\xad\x22\xfb\x55\xb4\xc9\x10\x12\xf4\x29\x91\xd5\xe0\x0b\x10\xd7\xb7\x0a\x89\x8c\x82\xcc\xf8\xc6\x6a\xaa\x39\x45\x91\x63\x86\xca\x60\xc2\x78\x30\x15\x8d\xa3\x8a\x81\x07\x18\x05\x80\xca\x1a\xfb\x9d\xcd\x6a\xdc\xb9\x66\xbd\xab\x79\xb9\x12\x76\xf3\x25\x46\x27\x22\x85\x15\xe4\x10\xc1\x2f\xd6\x11\xc2\x63\x99\x1b\x44\xb9\x41\x9c\xbb\xa6\xf5\xad\x99\x7d\x40\xc6\xd6\xcc\xce\x66\xfb\xba\x1f\x7a\x3f\xc8\x98\xfd\x41\xd9\x2c\xcf\x1a\xaa\x59\x43\xf6\x27\x9b\x5d\x09\x22\x23\x00\x3e\x8a\x1f\x8c\x12\x5f\x28\x94\xc2\x62\xce\xf2\x9a\xcc\xcd\xbb\x08\xe1\x5f\x22\xd7\x95\xd5\xce\x6c\xf0\xb8\xf1\x4b\xad\xe5\x7a\x76\x4e\xf3\xf2\x22\x1f\x21\x2c\xdb\xf4\x10\x42\x0b\x8f\xf8\xfa\xa8\xd7\xcf\x6d\x9b\x3e\xf1\xad\x6b\x37\x41\x25\x2c\x27\x26\x93\x6b\xd7\x3e\x20\x3e\xdc\x8a\x72\x32\x09\x89\x2b\x0a\x99\xf2\x07\x9f\xa1\x19\x76\x45\x05\x98\xa3\x6b\xaa\xb9\x11\x9d\xcc\x70\x18\xd1\x09\x6b\x60\xe3\x15\xf5\x49\xc8\xe8\x84\xfd\x43\x42\x46\x27\xec\x1f\xd2\xc7\xdf\x58\x8a\x3e\x93\x6d\xf2\x2f\xa0\x87\x90\x91\x86\x92\x51\x88\x33\x8a\x89\x8c\xa2\xc8\x88\x00\x84\xe1\xb8\xf1\x70\x04\xa1\xb8\xd1\x2c\xb8\x92\x50\x78\x91\x1f\xbe\x98\x28\x56\x39\x4f\x64\x72\xde\xc7\xd7\x02\x8d\xbe\x40\x3e\x2b\x00\xd8\xbf\x56\xb1\x7f\xed\x46\xd8\x07\x97\x9a\x71\x59\xe2\x45\x8f\xfa\x59\xc7\x68\xd1\x00\x15\xfd\xe7\xc2\x6c\x93\x06\xe7\x9d\x66\x5b\x2e\x76\x59\x29\xd7\x8e\x26\x35\xdf\x8e\x7a\x90\x3f\xcf\xec\x1c\xf8\x61\x11\x31\x91\x6f\x48\x9b\xd5\xc1\x61\x74\x5a\xc0\xd7\x44\xdc\x5b\xf1\xbb\x96\x10\xee\x5a\xc0\xb6\xf3\x0d\x42\x38\xe8\x8d\x4b\xf4\x79\x4d\xd6\x0c\xbe\x23\xc0\xf9\xe9\x8e\x58\x36\xee\xcb\xbb\x98\x54\xc5\x09\x91\x55\xf1\x04\xb6\x3b\xb6\x55\xc2\x46\x78\x4f\x26\x7c\x9f\xb4\x6c\xb3\xcf\x04\x8e\x21\x32\xab\xec\x28\xd8\x1b\x68\x1f\xe4\x5e\x6e\x9c\xd5\x83\x0f\xb3\x2a\x37\xcf\x07\x52\x3d\xa1\x1a\xcf\xab\xda\xf8\x9b\x83\x4c\x88\xbd\xf5\x80\xcc\x89\xde\xb8\xcc\x66\xb5\xea\x8f\x3b\x50\xef\x54\xee\x20\x1d\x2e\x69\xee\xac\xaa\x2d\xb6\x26\xf6\x13\x43\x2a\x5a\x2c\xa0\xeb\x31\xfb\xe7\x88\x18\x8c\xde\xae\xd1\x3f\x19\x01\x1b\xc0\x35\x54\x05\x69\x8d\x6f\x59\x5d\xca\x9b\x60\x60\x40\x2b\x62\x78\x55\x62\xe0\x15\xa3\x79\x20\x7d\xeb\x08\xc6\x30\x21\x0c\xa6\x3c\x83\x09\x5f\xb3\x06\x27\x08\x77\x69\x8e\x4c\xf8\xc8\xba\x14\x99\x47\xb9\xdc\x82\x03\x76\xa4\x80\xf6\x19\x03\x66\xde\x91\xcf\xb3\x66\x79\x22\x64\xa4\xc5\x42\xba\x03\x9d\x24\xf6\x7d\x0e\x92\x79\x4d\xee\xd8\x9f\x2e\x05\x31\xe0\x1e\xc2\xcb\x02\xf2\xfa\x54\xeb\x52\xdc\x05\xa5\xe8\xd0\x3a\xb2\x91\x09\x86\x12\xda\x4d\x8e\x74\xa9\xfe\x73\x82\xcc\x7b\xab\x7f\x68\x67\xb3\x47\x53\xed\x1a\x7f\x36\x68\x59\x50\xdf\x4d\x1e\xf2\x37\x8b\x11\xf1\xe1\x9b\x5c\x17\xf4\xac\x90\x21\xa9\x0f\x1e\xe3\x09\x31\xe9\x02\x5e\x5c\xff\xa4\xa4\x6d\x9d\x7d\x89\xa6\xcf\x7b\x46\xef\x11\xb2\x04\x9c\xdf\xfa\x54\x7b\x80\x59\xcc\x8d\x79\x06\x83\xb4\x9a\xcd\x6a\x3f\x69\x8e\x3c\xe8\xad\x5f\x7c\x4e\x1e\x28\xb9\xc9\x69\x00\x47\xfe\xc1\x3a\xb4\xd1\x66\xd1\xbc\x4f\xef\x90\x0f\x54\x6c\x89\x3f\x69\x0e\x08\x03\x8b\xe4\x1c\x54\x91\x79\x08\x99\x4c\x0e\x7e\x60\xf0\xb2\xc5\xa5\xdd\x0b\x8e\xcb\xc0\x47\x79\xf9\x05\xd3\xf8\x42\x21\x17\x8b\xc4\x1c\xeb\xe2\x97\x9a\xc6\x58\xee\x03\x6b\xf2\x02\x5e\x68\xdf\x23\x13\x00\xb7\x06\xf6\xe2\xf4\x5d\xbb\xc6\x17\x14\x99\x80\x74\x26\x75\x1c\xe5\x72\x29\xf1\xab\xca\x49\xeb\x83\xdc\xe4\x1a\xb9\x6a\x24\x7f\x6d\x16\x31\x9b\x58\xbd\xd3\x0a\xf9\x75\xc2\xe1\x95\xdc\xcb\xf1\x47\x3c\x33\x1f\x08\xdf\x70\xf9\x2d\x59\x79\xe1\x31\x58\xee\xd0\xc2\xd7\xfd\x70\x34\x68\xf9\x43\xe2\x99\xbe\x3e\xdd\x20\x6b\x6b\x9d\xc8\x83\xd6\x78\xc4\x9a\x2f\x07\xf8\xf7\x39\x3b\xc0\xc4\x52\xf6\xf1\xb2\xe9\x84\x21\x2c\xa7\x0d\xdc\x60\xeb\xfa\x80\xca\xe9\x6d\xe4\x72\x88\x5f\x1a\x54\xe1\xe0\xca\x92\x1b\x4c\x18\xc5\x2e\x71\x73\x5a\xc0\x66\x56\x33\x0e\x1a\x95\x40\x6f\xfd\x2a\x1b\x08\x61\x4f\xac\x5f\x0f\x07\x30\x2b\xbe\xf8\xf6\xe1\x7b\xb3\x98\x0b\x80\x3e\x05\x94\xef\x2d\x6f\xd4\x2c\xbb\x98\x5b\x18\x94\x3d\xfc\x73\x52\xf6\xf3\xde\x66\x51\x39\x63\x54\x25\xbc\x5f\x1e\x76\xdd\xf4\x61\x97\x37\xeb\x54\x9c\xc8\xe2\x4e\x1c\x49\x11\x76\x91\x35\xb0\xcb\x86\xec\xd1\x65\xe2\x3b\xeb\x15\x7e\x6c\x6e\xe9\xc5\xad\x1d\xdc\xfa\xa5\x7e\xc6\xc7\x58\x69\xb1\x04\xad\xdd\xcd\xec\x2f\x46\xe1\xb2\xf6\x3c\xd6\x8a\xb7\x88\x3c\xcd\x4a\x4b\x48\xa5\x3a\xfe\x53\xc5\x85\x72\xca\xad\xc5\x9a\xb9\xdb\x28\xde\xdb\xc6\x90\x78\xe2\xe7\xe0\x04\x82\x88\x0a\xff\xa9\x85\x6d\x64\x4e\x46\xd1\xf5\x1e\x84\x3a\x7c\x18\xca\x98\xe1\x6f\x5b\x89\x90\xe1\x0d\x8f\xd0\xc5\xb3\x56\xab\x43\x40\xb8\xd8\xfb\x49\x3d\xe9\xde\x72\x63\x68\xb2\x7f\x08\xf7\xd2\xcc\x7e\x32\x66\x74\xf5\x0a\x3f\x51\xe5\xea\x55\x73\xd1\x7c\x4e\xf5\x86\x07\x6e\x58\xcb\xf0\x8b\xc7\x32\xab\x81\x15\xed\xdb\xd6\x72\xe4\x08\x88\x63\x25\xc6\x92\x27\x22\x44\xc1\xe0\x24\x1a\x13\x35\x8d\x1f\x44\xe4\x4b\x4f\x28\xb7\x43\xe9\xf1\x15\xc6\x8f\xc5\x20\x78\x5f\x09\x0f\x9d\xf5\x55\x1e\xb9\x84\x22\xa0\xe2\x97\x0b\x42\x13\x2c\xaf\x6b\x3e\xcf\xcb\x96\x8d\x47\x7e\x79\xad\x80\x83\x66\xd9\x58\x98\x3e\xdb\x39\x1c\x72\x02\x76\x04\xec\xcc\x19\x60\xf1\x36\xbb\xd2\x60\xa5\x56\x68\x58\xf9\x43\x66\xc6\x1d\x22\x0a\x3f\x2f\xfb\xac\x55\x47\x0f\x46\xac\x5d\x47\x0f\x9a\xea\x62\x3c\x39\x59\xe9\x39\xac\x21\xec\xca\x83\x03\x45\x55\x9d\xcd\xb6\xc0\xff\x9b\xd5\x76\x6d\x0d\x81\x7b\x8d\x01\x93\x59\x3e\x83\x91\x80\x3a\x58\x80\x71\xc7\x81\x17\x2f\xee\x36\x31\x70\x87\x18\x38\x20\x05\x33\xe0\x76\x76\x81\xdc\xa4\x99\x38\x71\xec\xd8\x4c\x02\x04\x19\x8e\x0c\xfd\xf9\x3c\x24\x64\xe0\xcb\xf3\x33\x93\x27\x9a\xae\xad\x19\x38\x10\x07\x02\x06\x50\xab\xa1\x75\x48\x1f\xb7\x49\x80\x79\x69\xce\xf5\xc0\x96\xcd\xed\x85\xa3\x56\x38\xf6\x85\xd8\xb1\x60\x58\x3e\x88\xce\xef\xe0\x0a\x44\x36\xd9\x06\xe7\x58\x80\x01\x48\x69\xe7\x0a\x88\xa3\x22\x5f\xc0\x0c\xc1\x7c\x68\x12\x75\x9c\x8f\x74\x30\x43\x21\x82\x86\x7d\x08\x43\x1b\xc3\x58\x40\xb9\x07\x1f\x61\xf7\xc0\x43\x1c\x01\x81\x24\x58\x26\x31\x6d\x43\x20\xae\xc0\x0c\xf2\x79\x36\x02\x2f\x39\x38\xec\x29\xa8\x4e\x80\x19\x48\x14\x1b\x0c\x0a\x6f\x21\x67\x36\x4a\x32\x16\x0b\xd6\xd8\x83\x0f\x18\x72\x25\xf6\x03\x52\x4c\x74\x48\xc9\xb7\x86\xb6\xae\xeb\xfa\xba\xd2\x30\x4d\xf7\x9a\x2e\x10\x77\x43\x57\xf6\xcc\x7b\xa2\xfc\xa6\x4c\xed\xce\x27\xf1\x00\x72\x0f\x3e\xee\x90\x86\xe6\x23\xdc\x49\x77\xe8\xab\x7d\x74\x16\xdc\x5b\x0b\x1b\x4b\xba\x33\x4f\xe1\xc9\xa7\x89\xdb\x8f\xd8\x86\xb5\x5c\x9f\x50\xdc\xa7\x9e\xd7\x0a\x83\xf2\xc5\x11\x76\x7a\x03\xcf\x1f\x94\xdd\x90\x4a\x25\x1c\x65\x8c\x35\x9b\xd5\x4e\xc1\x3a\x87\x7d\xe4\x7e\x23\xec\xe8\x5c\x4d\x4e\x64\x8a\x2c\xad\x53\x27\x9b\x6d\x4c\xb9\x6b\x5f\x47\x0d\x6d\x1f\xc1\x72\x57\x97\x5e\x80\xee\x7b\x9c\x5d\xbc\x97\x48\xf2\x4d\xc3\x99\x0a\x2e\x63\x93\x77\x75\xd3\x61\xc5\xe8\x8a\xcb\x98\x9f\x2b\x0b\xdf\xf7\x56\x16\xbe\xaf\x27\x5f\x64\xe8\xef\xa5\xd8\x7d\xee\x7b\x49\x31\xae\x70\x86\x60\xe0\x70\xe7\x87\x9e\x3f\xf0\x07\xf0\xae\x66\xe8\x8f\xd6\x91\xb9\xb8\x03\x16\xf9\xf8\x9e\x32\xfd\xe2\x4d\x8a\x91\x21\xd5\x44\xe1\xbe\x17\x37\x7c\x47\x8f\x3a\x6a\x63\x8a\x13\x05\xf5\xf9\xc3\x75\x20\x37\x8e\x0b\x47\xbe\x78\xc8\x66\x83\xb6\xe6\xa0\xf9\xfc\x53\x99\xda\xdf\xea\xfd\xcb\x43\x1d\xc2\xb6\xfd\xaa\x6b\xb5\x63\x84\xeb\xc7\x09\x4b\xcf\xc7\xc4\x26\x11\x17\xed\x1c\x23\xec\xf5\x28\xdb\x7c\xa2\x8e\x1e\xea\x9a\x8b\x6f\x8f\xb1\xb3\xea\x3e\xf3\x29\x79\x95\xfc\x50\xd7\xe2\xc6\xda\xbc\x5f\x47\x36\x19\xd7\x7a\xae\xf3\x2b\xd3\x49\x4f\xb9\x9f\x15\xb5\xa8\x7e\x1d\x60\xaa\x5f\x38\x68\x71\x4e\xb5\x5f\x5f\xbc\x4a\x7a\xe6\x06\x0f\xfa\x20\xd0\xc0\x13\xd2\xc6\x52\x51\x61\xc0\x22\xdd\x6d\x5d\x07\xe0\x51\x37\x88\xcd\xf7\x84\x3b\x32\x69\x7e\xab\x50\x28\x58\x2c\xb3\x1c\x00\xc3\xba\xb0\x2b\x6b\x85\xf2\x63\x4b\xfb\xd5\xd2\x1c\xfc\xb4\xf2\x7e\x8e\x37\x61\x39\x3c\x8a\x36\xfc\x5a\x88\xdd\x1a\x7f\xbc\x32\x08\xe3\x8d\xe3\x3c\x79\xff\x88\x5d\x7e\xa6\xcb\xb4\x18\xe1\x5d\x38\x60\x59\xc7\x1b\x71\xed\x15\x74\xfb\x10\x2b\x6e\x45\x97\x6e\xac\x91\x75\x9d\x2f\x51\x26\xd0\xb0\x40\x26\x94\xd0\x07\xc1\x0a\x33\x1a\x2f\x94\x91\x46\xe2\x5b\x3d\x0e\xae\x0c\x72\x4d\x91\xf9\x26\x2c\x90\x78\x18\xea\xf8\x79\x8d\xa0\x85\x1e\x37\xa0\xd6\xb8\x58\xc3\xab\x0b\x69\x61\xf0\x26\x49\xb9\xf7\x06\x7b\xb4\x8c\x46\xf9\xc6\x58\x97\xea\x51\xe7\x12\x74\xda\x90\x79\x07\x67\x48\xbe\x7a\xe2\x9f\xb3\x7b\x70\x11\x19\x55\xd8\x60\xbc\xe4\x5d\x86\xcb\x06\xff\x25\xa2\xd3\xe3\x16\x5f\x89\x67\x21\xff\x3b\x68\x70\x1e\x73\x4e\xb5\x8d\x34\xae\x62\x9f\x62\x1b\x75\xf3\xfd\x5d\x46\xdf\x7f\x9e\xda\xd6\x11\xdb\xba\x91\x49\x59\x7d\xd1\x4e\x45\xfc\xe5\x79\x3c\xf0\x3c\x8d\xfa\x39\x13\xa1\xba\xce\xc2\x64\xbe\x84\xe7\xb8\x25\x62\x83\xb4\xd4\xfc\x68\x2a\x81\xa8\x37\x96\x88\x5a\x7d\x96\xc7\xc0\x02\x9b\x49\xf6\x2b\x72\x39\xa7\xc0\xc5\xdd\x8e\x0d\x1a\xa8\xbc\x06\x7f\x64\x11\x05\x34\x5e\xe4\x2c\x84\x22\x67\x61\x54\x44\x81\x8e\x17\x39\x6e\x41\x91\xe3\xa4\x0f\xb3\xab\x93\xf8\x95\x63\x4f\x89\x65\x14\x4c\xa2\x99\x1a\x4e\x08\x5d\x3c\x92\xab\x13\xca\x8d\xb4\xdd\xcb\x95\x2e\x3d\x7b\xc2\xfc\x53\x4a\x75\xb3\x7b\x26\x1a\xdd\x0d\xe1\x1e\x95\x5f\x06\x29\xee\x3e\x83\x89\x74\x89\xf3\xd0\x56\x98\x08\x6f\xe9\x92\xfb\xae\x33\x1f\xf5\x87\x76\xba\x2f\x35\xca\xd9\x44\xf4\x25\x74\x35\x0e\xf9\x2d\x02\x3c\x0e\x27\xaa\x39\x9a\x87\x3e\x41\x7c\xf3\x78\x5f\xca\x56\x86\x2d\x6e\xaf\x8f\xa2\x41\x3b\x32\xda\x29\xe5\x93\xaa\x6c\x7b\x8f\x7a\xef\x32\xe5\x3c\x49\x09\xdd\x71\x37\xd1\x28\x3b\x83\xc9\x0f\x87\x1d\xc0\x5c\xee\xcd\x07\xbb\xdc\x1b\x90\x8b\x84\xdf\xa3\xcb\x13\x6a\x7a\x6c\x61\xf0\x55\x31\xd1\x7c\x64\x7a\x6c\x75\xc8\xef\xd8\xbe\xc5\x83\xc8\xc9\x93\x54\xb4\xb2\x2f\x2e\x42\xd9\xfa\x57\x2d\x43\x84\x73\x3c\xe1\xff\xfb\x3e\xdd\x0a\x05\x77\x79\xa6\x72\xd1\x99\xb2\x89\xe1\x0c\x9e\xb2\xd5\xce\x72\xf5\xde\xdb\xaa\x4e\x97\x39\xbf\xea\x4e\x4d\x75\xf1\x75\xab\x6c\x8b\x47\x7d\x4a\x22\xf8\xc4\x4a\x8f\x93\x9c\x44\xe4\xed\x5b\x00\xe7\x56\x0d\x79\xd8\x39\xc3\xdd\x33\x1b\x42\x6a\xdf\x62\x7a\x8b\x4c\xe7\x96\x71\xc5\x4e\x72\x8a\x62\x17\x6b\x9d\x33\xb1\xa1\x00\x99\xba\x6c\x35\xc9\x8d\x9d\x7d\x10\x8a\xd7\x8c\x85\x7c\x43\x22\xae\x14\x59\x21\xb5\x0c\xdc\xaa\xac\x19\xd2\x72\xbc\xb0\x10\x9d\xa6\xa8\x34\xf9\xbc\x8b\xad\x67\x8b\x8d\xea\xa5\xae\x5d\x32\x04\x0d\x1a\xc8\x86\xe5\x10\xdf\xe5\x01\xb3\x54\xdf\x3c\xdd\xaa\xb1\x1e\x01\x37\xad\xaa\x64\xbd\xa7\x92\x48\xdb\x3e\x61\xe2\x95\x23\xb0\x57\x1d\x48\x1f\x51\x1f\x43\x65\x25\x7f\xcc\xc8\xcd\x89\xa8\x3a\x1a\x12\x4f\x04\x73\xbd\x27\xc2\x2f\xeb\x0d\x5f\xf6\x8b\x67\xcd\xbd\xc5\xd7\x27\x14\x99\x8f\xc4\x65\xc3\x32\xe9\xdb\x8a\x60\xe2\xac\xf1\xcf\xc4\x52\x3e\x35\x1d\xe1\x10\x4d\xb6\x27\x00\xd6\xdf\x26\x32\x00\x58\x75\x10\xb9\xc0\xba\xe9\x81\xb9\xa4\x49\x89\xa3\xbf\x75\x35\x6e\x79\x0c\x66\xc7\xc9\xe8\xb8\x02\x78\xf9\x00\x5e\xf8\x75\x93\xa9\xe0\x17\xdc\xd1\x8f\xc0\x19\xa9\xf5\x66\x83\x5b\x6b\x39\x7a\xcb\xb3\x89\xbf\x10\xbd\x59\xce\x20\xe1\x20\xd7\x2d\xf0\x25\xf2\xa8\xfb\x97\xcb\xfe\x40\x3f\x20\xa6\xf4\x49\xda\x89\x19\xe4\x8d\xaf\x34\xaa\xdf\x0f\x71\x14\xaa\x18\x12\xee\x78\xc8\xaf\xa5\xde\xf8\xb3\x82\xf1\x55\x8a\x65\xa4\x42\x00\xcb\xe1\xc5\x26\xfa\x94\x8f\xcd\x83\xc5\x06\x3a\x21\x5f\xea\x83\x24\xfe\xde\x43\xcd\xb7\x1a\x36\xf6\xf4\xc1\x9b\x60\x94\x6e\x61\x45\xcc\x23\x39\x3d\x7a\xd3\xd5\x28\x3e\x3f\xc1\xb3\x11\x8a\xbe\x84\x9f\xd8\xe9\xbd\xc6\xf5\x13\x56\xf8\xc6\x99\x21\xee\x9c\x21\x14\x95\xfb\xf9\x75\xb9\xae\x5a\x2e\xf8\xba\x5c\x30\x84\xe0\x30\x3f\xfb\x4b\x4f\x46\x1c\x6b\xf6\x66\x67\xb3\xf0\x47\x93\x0f\x5b\x38\xd4\xfa\xef\xb1\xe6\x58\x74\x60\x23\xd3\x5d\x23\x9d\x00\xae\x14\x9f\xeb\x8c\x87\x0a\x52\x86\xa7\xb0\x7c\x26\x5f\x9d\xaf\x4c\x8a\xdb\x3e\xc3\x4e\xd5\x4f\x71\x05\xb6\x27\xc8\xc7\xc7\x7c\x2a\x4b\x00\x11\x8f\xc1\xd3\xeb\x09\x63\x61\x60\x9b\xbd\xde\x12\x4b\xe1\x20\x32\xb2\x93\x14\xe7\xda\x51\x50\xc0\x53\xdd\x61\xf5\x1d\x21\xdc\x9a\x8f\xfa\xb8\x94\x22\x82\x5e\x47\x73\x90\x75\xc4\xf6\x4b\x50\x2d\xa7\xc7\x9d\x6c\x89\x87\xdc\x7a\x6e\x2c\x53\xeb\xa9\xfe\xcc\xc3\xf1\xc1\x55\xc5\x09\x25\xd6\xac\x8a\x7f\x9f\xe3\x5f\xe7\xd8\xa9\x62\xaa\x5a\x53\x79\xb7\x51\x2d\xef\x23\x92\xe2\xf8\xd2\xf7\x80\x8b\x1d\xbb\xcb\x1d\x44\xfb\xe0\xc2\xe4\x85\xde\xde\xbf\xa2\xb3\x9e\x49\x23\x81\xc6\x01\x81\x46\x09\xcb\x58\x17\xd2\xa6\xc9\xb7\x6f\xc2\xe4\x90\xf9\x9c\x4a\xe9\xc4\x61\x62\xc9\xaa\xe2\x52\x0b\x36\x68\x60\x8f\x38\xec\x8f\x4f\xe0\x45\xe3\x9a\x9b\xcd\x7a\xf3\xb9\x9b\xcd\xae\x71\x1f\xae\x1e\x92\xd0\xf8\xe7\xb8\x01\x45\x3c\xd4\x20\xae\x7e\xe1\xe8\x77\xb5\xc7\x7f\x9f\xdf\x54\x4f\x9e\xa2\x47\x82\x6b\x2e\x72\x88\x77\x8e\x1b\xc4\x4b\x14\x60\x0b\x2f\x2a\xe4\x59\x3f\x6d\x0d\xad\x11\xe2\xc2\x8f\xf9\x3c\x59\x96\x65\x24\x12\x96\xbb\x73\xb9\xef\xd2\xc6\xc2\xe4\x16\x30\x3e\xcb\xae\x1e\xfe\x3a\xc1\xb1\x5d\x8c\xab\x7b\x74\xe4\x13\x1f\x29\xd1\x2f\xc0\x29\x5f\x7a\x02\xc6\x7d\x0d\xe6\x20\xb5\x86\x2e\x44\xd8\x42\xef\x03\x83\xd4\xa4\x08\x77\xbe\xba\xdf\xaa\xd2\xdd\x30\x12\x74\x1c\x7e\xd0\x06\x3d\x67\xa4\xbb\x14\x39\x6c\x73\xf5\x6f\x41\x3d\xe9\xff\x89\x42\x16\x22\x3b\x58\xe5\x44\x3b\xc5\x0c\x38\x1f\xf0\x57\x8c\x23\x79\xec\x1e\x4e\xa4\x74\xb5\x56\x30\x5f\x96\xa5\x3a\x0f\x7d\x7a\x4c\x84\x00\x9f\x95\x14\xe6\x07\x65\xb3\x1e\x13\x21\x20\x09\x1c\xc2\x7b\xc4\xd3\x3b\x20\x4c\x8a\xe8\x6e\xa0\x3c\x9f\xcf\x3d\x24\x0e\x77\xa6\x9b\xcd\xd6\xc5\x51\xd4\x71\xf0\xb6\x81\x16\x2a\xfe\x1a\xb7\x49\x0d\x61\xbc\x11\xcb\xf8\xe5\x9c\x4a\x39\x07\xb9\x14\xae\x6c\xa3\xed\xaf\xfb\xa1\xc9\x3d\x69\xe0\x71\xc9\x86\x8b\xdb\xa6\x4f\x1a\x82\x4b\xea\x1d\xee\xa7\x1b\x82\x2e\x46\x9b\x34\x2b\xea\xdf\x6a\x3e\x4e\x4f\xca\x48\xee\x62\x6f\x5e\xdc\xcf\xc9\x0c\xde\x5c\x88\x02\x7a\x70\xa1\x21\x2c\xfd\xa9\x5f\x17\xa1\x31\xef\x56\xf3\xd8\x74\x36\xf8\x74\xd2\x37\xad\xb1\x62\x0a\xa2\xa8\xec\xf2\xb0\x24\x9b\x3c\x76\xf9\x2c\x56\xdf\xec\xa8\xdd\x64\xa2\xc2\xc2\x06\x1e\x65\x82\x76\xaa\xc2\x9b\x47\x61\x6f\x04\xdb\x6d\x89\x30\x59\x46\xc8\xda\xa2\x65\x58\x02\x57\xf2\x7c\x8a\xcc\x06\x97\xec\x5a\x5f\x71\x1e\xd6\xa1\x7b\xb9\xa2\x43\x7d\xe0\x37\x06\xfe\xb0\x19\x31\xd4\xe5\x2e\x85\xef\x6f\x36\x9e\xb7\xf7\xb8\x09\xee\xc8\x34\x8d\x23\x41\x01\x9d\x96\x26\x77\x7c\x68\x89\x71\xbd\xb7\x99\x1d\x07\x2b\x68\x41\x90\x0a\x64\x4e\xa7\xe9\x26\xd2\x47\x98\xf1\x25\xe3\x7c\xea\x86\x35\xbe\x84\xf6\x9a\x87\x71\xec\xae\xb8\x24\x06\x83\x67\x29\x58\x0a\x5e\x92\xcd\x6a\x0e\xe7\x21\x51\x12\x52\xcb\x44\xec\x08\x0a\x0e\x7a\xef\xa9\xe4\xe8\x5d\x40\xd2\x49\x4c\x00\x1b\xc6\xdd\x58\x89\xe8\xba\x78\xd6\x82\x5b\x7c\x37\x46\x66\x00\x53\xd2\xfd\x58\x15\x48\x18\x9e\xfb\xf1\x02\xc3\x44\xf8\xfd\x77\x11\x06\xf7\x56\xfa\x37\xbd\xf5\xf8\xfe\x63\x1e\xbf\x6b\xc1\x6a\x5c\xdf\xca\x98\xd1\xb7\x9e\xc0\x31\xc7\x6b\x90\xc6\xab\x8a\xc3\x5b\xaf\x22\xeb\x00\x1e\x99\xb4\xad\xba\xbf\xb9\x55\x4f\x6f\x4e\xa5\x76\x42\xcb\xf5\x13\x8a\x3d\xee\xbf\x88\xd3\x43\x2f\xf9\x80\xb9\x90\x83\x27\x10\x1a\xcd\x17\xd0\xa6\x87\x70\x43\x84\xce\xa1\x9b\x3e\xc2\x01\xb1\x6c\xdc\x26\x86\xd9\x3e\xf0\xcc\x36\x3c\x72\x6e\xdb\x56\xc1\x3e\x68\x64\xb3\x01\xd8\x09\xb2\x6f\x43\x88\xb8\xbc\x20\x85\x82\x02\x86\xc0\x72\x2a\xed\xff\x69\x94\xa1\x8f\xf6\xa6\x8f\x6c\xdc\x21\xdc\x43\x91\x53\xd1\x77\xcb\xfa\xde\x36\x76\x2a\x22\xb7\x81\xca\xed\xff\x91\x8c\xe5\xba\x67\xb5\x6d\x76\x38\x73\x57\x9c\xcc\xfe\xcf\xff\xd1\x3a\xdf\x69\xae\xb8\xbd\xfd\x5d\x2b\xe4\x3b\x4c\x58\x5a\x70\xd7\x09\x75\x26\x2b\x58\xd6\xce\x0e\x2e\x6c\x6d\xe1\x62\xa9\x64\x63\xc3\xc6\x96\x55\x2c\xec\xe3\x9d\x3d\xbc\xbd\x2d\xbf\x4b\x25\x5c\xd8\x33\xd8\x07\x7c\x83\x87\xcc\x5d\xbc\xb7\x27\xbf\x77\x0b\x78\xb7\x80\x0b\x51\x82\x81\x0b\xbb\x45\x5c\xd8\xdf\x92\x0d\x6c\x6f\x83\x07\xd8\x9d\xdd\xa8\x85\x3d\x68\x62\x6b\x47\x24\xec\x17\x71\xc1\xd8\xc5\x85\xfd\x62\xd4\xa7\x81\xf7\xf7\x70\xa1\xb4\x13\xb7\x59\x2c\xb0\x42\xb2\x89\x7d\x70\x02\xb9\x5f\x60\xdf\x36\xae\x89\xb1\xec\xe2\x9d\x7d\xd6\xb4\x8d\x77\x58\xa9\xbd\x2d\x5c\xd8\xd9\xc3\xc5\xed\x82\x8d\xf7\xa0\x23\x06\xbb\x81\xf7\x4a\x36\x2e\x88\x8e\x0a\xb8\x68\x14\xf1\xf6\x9e\x8d\x8b\x90\xb0\x55\xc0\x85\xc2\x16\x2e\xee\xda\x78\x1b\x7a\xda\xda\xc6\xc5\x5d\xbc\x5b\xb0\x71\x89\x7d\xef\xec\xe2\x42\x61\x07\x17\x8b\x11\xbe\x18\x02\xb7\xf1\xfe\xbe\x8d\x0b\x50\x61\x6f\x1b\x33\xf0\x76\x0d\x1b\xef\x43\x81\x22\x1b\xc9\x2e\xde\xb5\xd9\xff\x19\x82\x0b\x78\xbb\x84\x4b\xdb\x36\xde\xb2\x6d\xb3\x09\xcb\xe4\xeb\xa7\x9b\xd7\x3d\xeb\xc2\x5e\x88\x62\x0f\xde\xaa\x63\x66\x6d\x26\x62\xb1\x5f\xf7\x2c\x6a\xe7\x6a\xbe\xfa\xd6\xb6\x75\xbb\xe4\x46\x46\xbc\x59\x6a\xbb\xb6\x56\xd8\x41\x26\xb8\x5e\x12\xce\x98\x9e\xfc\x9c\xf2\xde\x66\x21\xc3\x37\x5d\xf7\x2c\x27\xd2\x64\xbe\xfb\x39\xcd\xd5\x3c\x46\xcd\x39\xf6\xb7\x20\xfe\x16\x6d\x84\xac\xb6\x0f\x92\x4a\x7c\x15\xa8\xaa\x4a\x2d\x9b\xdf\x70\x1c\x53\x8a\xcc\x3b\xfe\x46\x18\xdf\x9f\x50\xf5\xe0\x47\xf5\x6b\xf0\x98\x63\x98\xde\x81\x0b\x0e\xc1\x64\xc1\xb4\x08\xce\x6f\xd8\x3c\xee\x39\x7e\xe3\x08\x99\x0e\x39\x69\x69\x8e\x75\x6e\x6b\x6d\xec\xa2\x5c\x0d\xf1\xac\x5a\xce\x11\xbf\x9e\x8e\x18\xef\x00\x10\x66\x94\x2a\xea\xe2\xae\x6f\x6b\x35\x45\x77\x79\x17\x3f\x74\x81\x8a\x6d\xc5\xe4\x95\x49\xa1\x3f\x35\xe9\xe2\xde\x33\x73\x39\x1f\x39\x7a\x77\xa0\xf9\x88\x10\x52\xcb\x66\x5d\xa8\xea\x8b\x3e\x8f\x13\x6f\x35\xee\x53\x0d\xff\x82\xe8\x46\x1c\x4a\x06\xbc\x7e\x47\xe1\x36\xd7\xd1\x9f\x7c\xcd\x65\x87\x2b\xc8\x3c\x0a\x13\xa1\xd7\x5e\x97\x19\x33\xe7\x05\x67\xd1\x49\xfe\xf5\x16\x07\xb7\xec\x20\xff\x7a\xcb\x75\x76\x27\xb3\x15\x07\xa0\x68\x2b\x72\xd4\x27\x84\x23\x7f\x10\xd2\x4e\xc6\x1f\x0c\x7a\x83\x72\xa6\xdb\x1a\x0e\x5b\x61\x90\xe9\x4d\xfc\x41\x87\xce\x0e\x07\x3e\x5d\x67\x67\x77\xb8\x7d\x51\xd5\x4c\xee\xad\x54\xcd\x38\xe2\xe8\xf4\xa8\x77\xbb\x4b\x27\xa7\xe1\x48\xef\xba\x42\xcf\x49\x91\x70\x55\x7d\x14\x6a\x96\x3b\x9f\x7f\x2e\x44\x8c\xdd\x57\x0d\x6e\x46\x6c\xe9\xe8\xa8\xd5\x93\x35\xb0\xcb\x50\xff\x9a\xf8\xf6\xa4\x6d\xac\x87\x7d\x96\x7b\x1e\x6a\x2e\xae\x9d\x0a\xa4\xb4\x3c\x70\x40\x16\x69\x07\xce\x7a\xfa\xcb\x9b\x14\xbe\x66\x03\x2e\x7c\x71\x19\x8f\x22\x11\x7d\xa5\xe5\xd1\x25\xc0\x15\xd9\xf4\xac\x27\xb4\xaf\x3d\xeb\xe8\xd0\x56\xce\x8d\x6c\x02\xfc\xf7\xcc\xdd\x55\x04\x1e\x15\x11\x93\xbf\x3d\xea\xb3\xc1\x8a\x29\xe0\x9b\x8b\x04\xec\xd5\x61\x92\x5b\xf4\xd9\x39\xd4\x18\x86\xb8\x02\xe5\x0d\x2a\x3d\x69\xbe\x7e\xdb\x60\xe3\x74\x91\xfe\xd4\xd4\x90\xa9\x6e\xaa\xfc\x06\xdb\x57\x9f\x4a\x4f\xae\x2a\x67\x27\x54\xf3\x51\xf9\x27\xfc\x89\x37\x5e\xff\x9d\xc9\xb7\xfc\x80\x8e\x1b\x12\x0f\x1e\x12\xce\xc5\x37\xea\xb2\x28\x88\x6d\x2e\xb8\x4c\xd1\x6f\x4e\xc5\x39\xe6\xe6\x14\x04\x6e\x9a\xcd\x3e\x51\xcd\xc7\x7c\xa1\x03\xf2\x92\x7b\xfe\xeb\xad\xee\xeb\xc3\x66\x1c\xa4\x48\xc2\x7b\xd6\x4b\x51\x6d\x4c\xe0\xed\x5b\x79\x75\x70\xad\x1e\x5a\x9c\x2b\x1e\x37\x4b\x84\x16\x19\x9e\x88\xcf\x45\x1b\xb8\xe3\xf5\x47\xea\x90\x2d\x2a\xe9\x0e\x3b\x22\x8b\x6b\x24\xe7\x4a\x1f\xfa\x23\xa9\x95\x72\xae\x74\x0f\x9c\xa3\x44\x97\x65\x6b\xa2\x69\x56\xc9\x91\xf1\x3f\x86\x27\x50\x49\x1c\x22\x86\x27\xbc\xd2\xc2\xe4\xfd\x36\x8e\x52\xfd\x2a\xe2\xdd\x75\x4f\xaa\xe3\xaf\x39\x69\x34\x6f\xb5\x44\xcf\x52\x70\x6e\xdd\xca\x62\x11\x64\x01\x83\x93\x5f\xfd\x17\x7f\xa8\x3d\xcf\xe7\x72\xd5\x4a\xdd\xa4\x68\xe4\xa7\xd0\x30\xcb\xc2\xac\x05\xe5\xfd\x5f\x57\xbb\xea\x6a\x2e\x86\x2d\x59\xfc\x67\xe3\x42\xde\xdb\x4c\x0c\x2b\xf1\x2c\xf7\x36\xa1\xf0\xb8\xef\x4a\xbd\xc1\x74\x40\x1c\x55\x66\x7f\xec\x10\x57\xa9\xd7\x8d\x26\xf0\x79\x98\x98\xb3\xc9\xbd\x32\x9f\x6f\x0e\x25\x6b\xc6\xa2\x0b\x58\xbc\xf2\xe8\xf2\x1e\x68\xd9\x0b\x76\x54\xe9\x2e\x89\x86\x49\x21\x7a\x72\x2f\x7a\x63\xcd\xf3\xde\x94\xd3\xc1\x95\x07\x47\xae\x17\xb8\xfb\xe3\x48\x16\xd6\x2b\x58\x90\xc1\xe4\x5e\x38\xf5\x17\x35\x9e\x2e\xf9\x2b\x40\x35\xb4\xcc\xf3\x50\xbf\x6e\x33\x52\x79\x51\x9f\xd9\x39\x72\x05\x3b\xfa\x74\x00\xfa\x1e\x93\x07\x72\x88\xc4\x33\xd6\x39\x16\x2d\x40\x3c\x9e\x51\xac\x89\x7c\x73\x68\x36\x7b\xfb\xaa\x8a\x6e\xc9\x3b\x85\xe7\xa1\x9c\x43\xaa\x3f\x37\x34\x57\xbf\x97\x01\xb0\x9e\x87\xd0\x4d\xd4\xe0\x02\x99\xdf\x38\x22\xaf\x57\xf0\x2e\x61\x3d\x25\x61\x04\xcd\x29\x6b\xd8\x13\xe7\x57\x3f\x9b\xf5\xf5\x87\x62\x36\x0b\xdd\xb0\x9f\xc8\x74\xf5\xc7\x0e\x3c\x57\x24\x1b\xc7\x15\xad\xd9\xd5\x7c\xfd\xbe\x8b\xd7\x0a\x08\xb3\x7c\xc2\x60\xc1\xbe\xfe\x3a\xa0\x84\x95\xc4\x54\xef\xf5\xa0\x26\xf6\xf5\xe9\x80\xe7\x20\x54\xf6\xd7\xc0\xdf\x93\xd0\xfa\xf8\xf3\xb9\xaf\x3f\x76\x40\x71\xf2\xd8\xa9\x68\x91\x12\x44\xf4\x7b\xdf\x45\xbc\x21\x68\x9d\xc1\x8b\x59\x41\x88\x4f\x52\xf5\x35\xd1\x67\x22\x0b\x3b\xb0\x36\x3d\xec\x26\x28\xf7\x97\xb4\x5c\xfb\xcd\x15\xe4\xb1\x47\x15\xc7\xba\xb0\x2b\x52\x0b\x55\x31\xca\xb4\xfc\xbb\xb5\xf4\x72\x32\x7a\x7c\xed\x24\x5f\x5e\x3f\xa4\x9a\xe5\x86\x4c\xaa\x3b\x57\x2a\xd6\xe2\x7d\xb2\xd1\xf4\xa5\xc0\x42\x05\xc9\x95\x20\x95\x39\xd8\x2e\xda\x74\x13\x6f\xb9\x7f\x73\x31\x2a\xf1\x36\x18\x7d\x26\xae\x56\xc2\x58\xbd\xf7\xab\x45\xde\x5e\xb5\xcf\x45\x24\x17\x04\xa5\x28\x41\x79\xae\x7d\x9b\xa4\x0e\xaa\xff\x6a\x81\x9e\xb9\x37\xd0\xe0\x37\x5c\x4c\x3b\x20\xe2\x38\x88\xea\x41\x89\xa5\xf4\x59\x2d\x36\xe4\xca\xe7\xa2\xcc\x13\xf3\x05\x1b\x8b\x0a\xaa\x85\x82\x2a\xf9\x35\x5b\x8a\xb0\xe0\xac\x91\xd7\x66\x36\xeb\xac\x91\x41\x30\x9f\x3b\x04\xbe\x06\x2d\x0d\xf4\x5c\x68\x3e\xef\xb2\xc2\x71\x43\xfd\x5b\xe5\x1e\x87\xb5\xca\x04\xa4\x47\x40\xff\x7c\xde\x6c\x69\x2e\x22\x64\x10\xc4\xac\xb0\xd5\xd0\x9a\x2d\xcd\x41\xac\x5d\x39\x36\xb0\xb5\x30\xef\x5f\x93\xbe\x19\x5c\xf4\xe9\x59\xae\x4d\xe0\xe6\xde\x91\xf1\x44\x1c\xcb\xb5\x2b\xfd\x5b\xa9\x08\x01\xbd\x6e\x19\xfc\x1d\xf0\xdb\x21\xf0\x4e\xe6\x20\xfc\x55\x6b\xa9\xaa\xaa\xa3\x04\x6f\x11\xc2\x12\x75\x7b\xdd\x3e\x75\x47\x2b\x64\xfe\x9a\xb8\xbf\x0c\x4a\xea\xdc\xbe\xa9\x6a\xbc\x96\x2b\x99\x70\xb7\x45\x9c\xc5\xb3\xf6\xc6\x55\x3a\x6c\xa4\x4f\xec\x24\x64\x9b\x8f\xe4\x4d\x88\x7d\xcf\xfc\x80\x6d\x3e\xea\x6f\xd1\x2f\x67\xba\xac\xc4\x63\x8d\x2e\xcc\xea\xf4\xeb\xb8\x65\x2d\x77\x81\xcc\xc3\xfe\xd7\x05\xba\x2d\xd0\xc4\x07\xfe\xa8\x4e\x07\x7e\xb8\x6a\x74\x9c\x73\xc1\x85\x66\xf7\x6c\x39\x9f\xef\xbd\x61\xc0\x83\xed\x3d\x7d\x19\xac\xf8\xcd\x9b\xcf\x9f\x4e\x28\x44\xe4\x6b\xac\x3a\x11\x71\x26\xde\xd0\x90\x45\x6d\xbe\x59\xb2\xb2\xe1\x2a\x7b\x89\xb8\x28\x3b\x66\x39\xce\xaa\x08\x65\x51\x99\xaf\xbc\x35\xc4\x0e\x6f\xb8\xa1\x1c\xc5\xae\x55\xfb\x00\xab\x48\x9c\x2f\xf0\x97\xe7\xf1\x91\xec\x39\x75\x26\x82\x05\x47\xa8\x75\x37\x05\x7d\x94\x89\xb8\x09\x1c\xc2\x71\x62\x74\x07\x5d\x4f\x07\x33\xf3\x7a\x99\xb8\xd8\x7b\xb3\xd5\xf1\x35\x9a\xcd\x52\x2e\xa8\xc6\xfe\x68\xa8\xbc\xf2\x1a\xa4\x6f\xb0\x95\x83\x21\xdc\x35\xae\x15\xd6\xd8\x81\xf0\xca\xd6\x1c\xb8\x7c\xcc\x66\x5f\x34\x0f\x46\x9f\x0c\x65\xa6\x51\xec\xe7\x0a\x68\x81\x16\xae\x70\x5c\x05\xb3\xd6\x68\x85\xde\xca\x3b\x72\x69\x4c\x30\xb8\xd4\x54\x1d\xae\xec\x09\x65\xb3\x10\x1d\xcd\x4b\xb8\x5d\x30\x1f\xf5\xc9\xaf\x15\x52\x73\xac\x96\x81\xfa\x1e\xdf\x03\x71\x83\x58\x36\x0e\xe2\xf9\x12\x2a\x99\x80\xb1\xb5\x48\xd9\xd2\x21\x81\xd5\xb6\xf5\xc9\xaf\xa8\x39\xb3\xc1\x7a\xee\xa0\x05\xe5\x4e\xf0\xb8\xb2\xd7\x74\x19\x48\x51\xeb\x58\x3d\x18\x33\x71\x7e\x92\x0c\x26\x48\xd9\x5a\x63\x05\xa5\xf2\x91\x44\xb4\x2a\x87\xfe\xe6\xf1\x89\x55\x4c\x84\x95\x45\x3e\x88\xf8\xdc\x5b\x7c\xcf\xed\x46\x3c\x7c\x04\x6b\x7d\x70\x8b\xdf\xe0\x5c\x37\x10\x0b\xfc\x61\x85\xd4\x24\x02\x0d\x2a\x6d\xbf\x24\xdd\xab\xe8\x27\x54\x33\xd0\x7c\x4e\xad\x57\xb0\x13\x7e\xd4\xaf\x07\x5f\xae\xa3\xab\x82\x08\x84\xa8\x5f\x0f\xf0\x72\x9c\xcb\xaf\x4a\x5b\xe7\x36\x16\x34\x77\x42\xff\x41\xe3\x27\x54\x9c\xbd\xae\x0a\x5f\xda\x58\x58\x83\x43\x65\x35\x88\x3b\xfa\x8a\xe6\x12\xc6\x6a\x5b\x8c\x1f\xbf\xbe\x6a\xd2\x81\xe3\x10\x17\x10\xc2\xd4\xba\x77\xc5\x25\xdd\x88\x89\x08\xe5\xd4\x51\x63\x18\x1f\x35\xfa\x11\x8d\x5e\x4e\xc9\xe7\x62\xf1\xac\x0d\x39\x67\x7d\x24\x43\x81\x6d\x5a\x5d\xa1\x82\xa6\x02\xac\xe8\x0c\xa1\x89\x46\xd8\x7e\xc9\xc6\x94\xe6\x2a\x31\x17\x11\x1d\xaf\x16\x3e\x24\x2f\x71\x54\x5e\xf2\xc5\x22\x8e\xf4\x27\xb2\x45\xa1\x41\x91\xbe\x3d\x5d\xcb\xb3\xd9\xd2\x93\x66\x35\x2b\x96\x69\xca\x9b\xa3\x6c\x28\x15\x56\x0f\xb0\x0c\xe1\xf3\x58\x13\xdc\xb3\xcb\x7f\xb3\x5e\xa3\x11\x27\x2f\xb6\x7d\xab\x91\x58\x92\xca\x0c\x8d\xc4\xe6\x37\xbc\x8d\xcf\x90\x70\x24\xa2\xfa\x4f\x4d\xf1\x7d\x54\xa5\x23\x9a\x19\x51\xa7\xe3\x27\xbc\x78\xd1\x51\xa6\xe3\xd3\xe1\x28\x53\x94\x7e\xba\xd6\x45\x34\xf8\xaa\x66\xa0\x35\x72\xd2\x8c\x9b\x38\x86\x02\x19\x23\xd3\x1d\x0f\x47\x19\xc7\xcf\xf4\x1a\xdc\x1d\xd0\x10\x9e\x32\xc4\x15\x0b\xab\x2b\x16\xbe\xae\x98\x9a\xa1\xa7\x37\xee\xf2\xc6\xd5\x07\xbb\x60\x26\x34\xdc\xc5\x2e\x71\xf5\xd1\x2e\x86\xc0\x85\x8a\x42\x19\x34\x62\x2a\xfb\xa2\x5c\xc5\x65\x00\x34\xd1\x93\xfb\x86\xd5\xb1\xcd\x50\x08\xb6\x21\x27\xc9\x6c\x36\xd4\x9d\xa9\xd6\x46\x65\x8d\x65\x93\x10\x4e\x34\x83\x5b\xad\x83\x29\x6e\x23\x0c\xaa\xe9\x90\x1f\x31\x3b\x24\x64\xed\x16\x50\x64\x7f\xce\x1a\xec\xcf\xe7\xbc\x6a\x5f\xad\x0a\x87\x06\x5e\xbb\x2f\x1e\x21\xf2\x1d\x08\x64\x34\x5f\xf1\x30\xd6\x1b\xf8\x99\x51\x13\x7c\x9a\xf9\x19\x96\xf8\xde\x1a\x35\x63\xcf\x6a\x2d\x2f\xa3\xad\xe7\x42\xce\x86\x72\xeb\x48\x5f\x47\xe6\xb7\xd8\x08\x67\x8d\xf4\xb3\xd9\xb5\x10\xee\xf3\xfa\x08\xf5\xf5\x09\xd5\xc2\xd8\xd1\xab\x97\x9a\x7c\xb7\x17\x8e\x68\x2b\x1c\x66\x68\xc6\x9d\xb9\x1d\xbf\x9c\x59\xcf\x6d\x9c\x50\xad\xf1\xaa\xf5\x31\xdb\x75\xfb\x08\x21\x70\xa0\xb9\xe0\xc6\xdb\x7c\x91\x04\x91\x03\xdc\x90\x04\x96\x07\x0f\xd6\xdd\x6c\xb6\xd5\xd2\x04\x1a\x63\x22\xfb\xeb\x94\xb6\x3a\xbe\x97\x19\xf5\x32\x8c\xfc\xe3\x11\xb5\xbc\xcc\xfa\x5f\xd1\x40\xfe\x5a\xd7\xff\x42\xa6\xc0\x09\x57\x15\xd1\xaa\x16\x42\x5c\xfa\x10\x8b\x25\x20\x0c\xc0\xe5\x5e\xe0\x0b\xb3\x06\x5a\xd5\x7c\x84\x18\xf7\x19\xdd\xe2\xe1\xad\x72\x6b\xb1\xb1\xe4\x95\x62\xb5\xf3\x11\xce\xd3\x11\x7f\xaa\xb0\x18\x81\xc4\xf9\xf4\xb6\x82\x71\xb1\x19\x0d\x6f\xb5\x22\x32\x7b\xb7\xe0\xd3\xf1\x73\xb0\x5b\x5e\x33\xf0\x10\xfe\x1d\xb1\x7f\x17\xd1\x45\x52\x36\x0b\x85\x0a\x58\x55\x9c\x8e\x3e\x92\xea\xde\x71\xb4\x87\xa9\xab\x95\x12\xaa\x5f\xf7\xd3\x4e\x28\x23\xac\x8b\x8d\xfc\x54\xba\xc5\xb3\x3c\x1b\xda\x30\x13\x88\x32\x63\x44\x99\x31\xa2\x18\x9e\xc6\x29\x3c\xb1\x96\x52\xfa\x35\xb1\x8f\x83\x63\x4b\x87\x8b\x72\x12\x1a\xce\x88\x1c\xc9\x88\xc4\x23\x10\xd1\x86\xd5\xb0\xb9\x84\x40\x59\x77\x01\x32\x7d\x46\x82\x41\x14\x2b\xc0\x57\xc6\x3e\x89\x76\x92\x56\x3b\xda\x49\x7e\x39\xd1\xcf\xd7\x2e\xb1\xec\xc5\x04\xa6\xe3\xf4\x8d\x0b\xe3\xfc\xeb\x77\xa0\x7e\x3d\xcf\xc8\x9a\xc1\xf5\x17\xa7\x94\x58\x45\x11\x84\xce\x60\x62\x3d\x94\x58\x0a\xc3\xdb\xe6\x96\xbd\x7a\x0b\x98\x82\xfc\xfa\xe5\xa8\x5f\xaf\x5d\xf6\x95\x88\x7f\xfd\x96\xf8\xfc\x1d\x24\x3e\x9f\x67\xaa\x45\x26\xec\x3a\xdd\xde\xc4\xff\xd5\x4b\xed\x1a\x06\x21\xf2\xcc\xd2\x6a\xa3\x8a\xd2\x9d\xf8\x6b\x5d\xd8\xf9\x22\x2a\xcb\x22\x6c\x32\x0d\x41\xea\xbf\x40\xd0\x2d\xc8\x6b\xe6\xd7\x2e\x88\x47\x58\xde\xd5\xfe\x16\x92\xdc\xe9\x1b\xb1\x28\x8e\x2f\x20\x00\x20\x26\x81\x75\x5a\x61\x12\x20\x49\xd8\x0a\x44\xe6\x2a\x1d\x77\x9d\x8e\x9a\x19\x97\x86\x60\xba\x3f\xa2\x83\x11\x5f\xc4\xbc\xbd\x75\x64\x16\x94\x6d\x9c\x83\x5c\x48\x80\x6c\x20\x4e\x3f\x0e\x31\x4c\xe7\x20\x12\x38\x18\x0d\x39\x39\x52\x8c\xde\x6e\x45\x19\x0e\xdb\x51\x95\xcf\x5c\xc1\x56\xc7\x0c\x3b\x9e\x6c\x5f\xfe\xbd\xb0\xf3\x05\x3b\x47\x9c\xcd\x62\x84\x0e\xcb\xc5\xde\x32\x1a\x06\x0d\xfa\xbf\x87\x03\x77\x3c\x98\xf8\xeb\xc8\x2c\x2e\xa1\xa0\xf8\x5f\xa0\x60\x67\x05\x0a\x72\xa5\x34\x12\xb6\x13\x48\x48\x60\x2b\x89\xab\xc4\x67\x31\xf9\xb9\xc5\x57\xe8\xd7\xe8\xdb\xf9\x13\xfa\x6e\xdf\x57\x1d\xf8\x56\xe2\x8e\xfe\x67\xdc\x75\x7a\x43\x86\xbb\x12\xb0\x4b\x15\x77\xa5\x14\xc5\xe3\x14\x81\xa3\xd4\x62\xfb\xf6\xa8\xd3\x81\xbb\x24\x48\x71\xd7\x2c\xe8\x93\xe6\xc8\xc9\xab\xe6\x33\x1e\xe9\xe4\xc8\x29\xfb\xe9\x21\x33\xa8\x88\x56\xb3\x59\x2a\x14\xa3\xbf\x03\xcb\xb0\xb3\x59\x27\xfe\x2c\x08\x7f\xcc\xd6\xc7\x87\x72\x71\x61\xf5\x67\x62\xe5\xa9\xc2\x39\x1d\xb8\xbf\x7a\x9a\x34\x7e\x61\xc2\x1d\xa4\xfc\xf9\x16\x03\xba\xcc\x9f\xbc\x82\x71\x5e\x8e\xfd\xcd\xc1\xc5\x4a\x43\x01\x21\x7f\xfa\x0a\xf7\x09\xb9\x53\x9e\x2d\x57\x3c\x47\xd6\x16\x32\x13\xc8\x4a\x71\x87\xc8\x1a\x47\x28\x42\x67\x44\xc6\xa6\x65\x53\xec\xe3\xc6\xf2\x0a\x69\x4c\xd2\x2a\xd1\x3f\x01\xbd\x12\x54\x1c\x90\xea\xab\xe6\x21\xd3\x13\xf7\xfe\xdc\xe3\x74\x80\x36\x9b\x7a\xfd\xfc\x7b\x11\x99\xc1\x26\xf1\x4c\x97\x95\x72\xe3\xdd\x45\xb5\x09\x10\xe2\x5b\x53\x77\x7b\x43\xcd\x45\x38\x24\x4d\x7d\xd8\x0a\xd9\xcf\x3e\x29\x6d\x6e\x7d\xe7\x9f\xc1\x66\x11\x6d\x6a\x85\x1c\x2f\xc7\xbe\x10\x1e\x12\x3f\xa7\x75\xf2\xfd\xef\x21\xfa\x4e\xf1\x98\x34\x72\x5a\x98\xeb\x7f\xef\xa0\xef\x8e\xe9\xe6\x48\x60\xc6\xcd\x9a\x71\xb3\xe2\xc0\xdd\xa0\xda\x10\x8f\x31\x6b\x21\x27\x5a\x60\xf5\xf3\xbc\x3e\xf6\x73\x1d\x48\x09\xbf\x3b\xd1\xbe\xc6\x31\x17\x6d\x6d\xef\xb7\xe9\x23\x02\x65\x1c\x3e\x7e\xb8\x4c\xd9\xd4\xb1\x13\xc2\x41\x23\x0e\xd9\x1b\xf0\x64\x9f\x09\xb2\xce\x29\xb5\x02\xfb\x3b\x65\x93\xea\xdb\xa6\xa3\x05\xd8\x05\xaf\x99\x1e\xf6\x72\x6d\x84\x4c\x2f\x47\xda\x8b\xc5\xb7\xaf\x43\xc4\x03\x99\x8e\x5d\xdb\x64\x8d\x12\x49\x2e\x47\x60\x76\xcc\x9a\x25\x92\x66\x64\xd2\x6b\x97\x48\xc2\x91\x49\xa7\x6f\x72\xc1\x89\x8b\x9d\xd3\xb7\x28\x4f\x2e\x46\xb6\x7c\xe4\xf4\xcb\xbc\xe7\x19\x49\x6d\x8a\x74\xc1\x15\x6e\xd3\x5b\xf2\xb9\x30\xa7\xb7\x96\x61\xf3\xcd\x99\xad\x24\xf6\x5d\x90\xdf\x1f\x1f\xf0\x5d\x92\xdf\x0e\xff\x2e\x8a\x6f\x36\x3d\xec\x7b\x4b\x7e\x37\x26\x54\x31\x03\x3f\x95\xde\xea\x18\x10\x71\x30\x23\x7e\xf3\x12\x4b\x71\x93\x5b\x13\xe6\x48\x21\x72\x0f\x7d\x4e\x6f\x2d\x6a\xc3\xf9\xd7\xc1\x5e\x22\xc0\xfb\xb7\xcb\xa9\x36\x59\x75\xa9\xb2\x26\xc6\x19\xf3\xba\x9b\x5e\x98\x1f\xb6\xba\xfd\x8e\x9f\xe9\xd3\x51\x73\x1d\xfd\xff\xec\xfd\x79\x53\xe3\x3a\xd3\x00\x8e\xfe\x3f\x9f\x02\xa8\x79\x53\x16\x51\x4c\xc2\x9c\x39\xcf\xf3\xd8\x68\x52\xac\x61\x1d\x20\x81\x61\xc0\x8f\xef\x29\xd9\x96\x9d\x60\x67\x21\x0b\x24\x90\x7c\xf7\x5b\xdd\x92\xbc\x84\x30\x73\xce\xfb\xfe\xaa\x6e\xd5\xad\x5f\xcd\x54\xb0\x65\xa9\xd5\xda\xbb\x5b\xbd\xd8\xdc\x39\xdc\x75\x33\xaa\x82\xbe\x7b\x72\x4e\xdd\xad\x6d\xad\xc1\xfa\x54\x2a\xe5\x0a\x1c\x3d\xe9\x6c\xf8\x54\x4b\x8f\xfa\x74\x40\xd6\xb3\x61\xc8\x95\xbb\x8d\x74\x39\x7c\xaa\x2d\x6f\x98\xb7\x7c\xb9\x3d\x99\x0f\x6a\x96\xce\x96\xd3\x82\x16\xd0\xac\xa0\x63\x3f\xbc\x48\x85\x2e\x82\xd8\x83\xcc\x47\x73\x8b\xeb\x90\x6a\x12\xd7\x41\x9f\xf9\x52\xa8\xa8\xa4\x3a\xc7\x2c\x50\x42\xc6\x7b\x63\x76\x4d\x87\x17\xc4\xbe\x63\x33\x25\x31\xf0\x22\x2d\x76\x7d\x99\xb0\xaa\x7d\x67\x26\x53\x20\x38\x35\x0e\xaf\xd7\x05\xb9\xcc\xa0\x5f\x57\x57\xd9\xf0\x4c\xb9\xf9\x74\x4c\x2c\x6e\x9e\xc5\x28\xa4\xf9\x58\x4b\x04\x33\xd8\x77\xe6\x59\xfc\x51\x8e\x03\xaf\x1e\xe8\xe8\xd4\x06\x21\xd6\x93\x3c\xe2\x9c\xa1\x2b\x43\x65\xe0\xcb\xae\x4b\xea\xb9\x90\x16\xce\x50\xaa\x6c\x42\xfa\xb2\xdc\x64\xf7\x3a\x27\x00\xc1\xfa\xd3\xd9\x55\xf7\x9c\xa1\xbb\x85\x2d\x43\x7b\xff\xc5\x3b\xd5\xe5\x38\x31\x38\xa2\x81\x36\x35\xef\x55\xb3\xa5\xb2\x65\x1e\xfd\x41\xac\xbe\x65\xa7\xd1\xa7\x3b\xb3\x15\x7c\x70\x44\xd2\x98\x26\xb4\x47\x07\x12\xc3\x11\x8b\x9d\xe6\xcc\xdd\xda\xb6\x7d\x16\x31\x76\x75\x50\xf7\xcb\xa2\x32\xb2\x22\xc6\x3a\x87\xf0\xbc\xb5\x6d\xf9\xe5\x51\xe1\xec\x3b\xe9\x28\x88\x5e\x39\xa0\x3e\x0d\x53\x88\x80\xf2\xde\xaa\x81\x90\xeb\x30\xd7\x45\x7b\x4b\xca\xa3\x9d\xd0\xf8\x93\xb1\x3c\xa9\x24\xf5\xf9\x47\x62\x7c\x33\xe4\xbd\x51\xd8\x1f\x76\x8b\x07\x1c\xc6\x70\xe9\x84\x46\x75\x7d\xb9\x58\xaa\xac\x31\x9a\x84\x61\xc7\xef\x88\xde\x58\xfb\x76\x1e\xf0\x21\xef\x8a\xb1\x18\x8e\x36\xb4\xa3\x01\xb5\x5f\xb6\x63\xa6\x4e\xca\xc9\xa3\x32\xc2\x52\x5f\x02\xf5\x57\xc4\xac\xba\x58\xdc\xb1\x3d\x9c\xbd\xcb\x9b\x71\xae\xa1\x7b\xea\xba\x3a\x8c\xa9\x02\x48\x15\x40\xaa\xaa\xa2\x0a\x30\x55\x80\xa5\xe4\x2a\xdf\xd6\x0f\x86\x1d\x1d\x27\x15\x63\xb8\x3c\x75\x0c\x5f\xfe\x09\xe4\x1f\x21\xff\x84\x84\xbc\xf7\xf6\x3e\xd6\xf0\x57\xf7\x04\x4f\x7b\x40\x29\x40\x47\xb1\xb6\x9a\x69\xc7\xda\x38\x26\x88\xb5\x71\x8c\x88\xb3\x88\xe9\x29\x3d\xf1\xbd\xf9\xfe\x06\x05\x40\x9b\x61\x9c\x42\xe7\xe6\xe4\x31\xad\x80\x9b\x51\x9c\xd6\xc1\xcd\x76\x9c\x56\xc3\xcd\x20\x4e\x6b\xe2\xa6\x88\x8b\x95\x7d\x7f\x1f\x65\x43\xd5\xb6\x99\xb5\x24\x7d\x8c\xe2\x4d\xdd\xaa\x36\x3e\x16\x37\x49\xe1\xad\x06\x16\xc4\x65\xc6\x37\x15\xdc\xb2\xb7\xa9\x60\x69\xb4\xd2\x8f\x93\x47\xfd\xb1\x1d\xbf\x27\x58\x87\xfd\x31\x1f\x2f\xaf\x65\x7d\x01\x27\xe7\x0c\x7a\x24\x01\x32\x85\x13\x9b\x2b\x32\x85\x03\x4f\x1e\x14\x17\x81\xa0\x9c\x56\x38\x15\xd4\xab\x78\x9b\xa2\xec\x6f\x72\xea\x57\xbc\x4d\x5e\xf1\x37\x45\xaa\x10\x13\xc6\x76\xc0\x0a\xa8\x86\x31\xf3\xa0\x67\xfc\xb2\x07\xbd\x12\xa4\xdd\xef\x41\xcf\x40\x6a\x3b\xde\x4c\x47\xb8\xcc\x3c\x33\x90\xc9\x02\x92\x15\xd8\xc9\xa3\x06\xdb\xce\x06\x73\x05\xd8\xf6\x4a\xb0\xe2\x1d\xd8\xc2\x70\xee\xae\x5e\x51\x97\x2f\xbc\xec\xfc\xc3\xf5\xe4\xa2\xd6\x1a\x29\x5f\x0a\xe8\xfe\xb3\xe9\xd2\xd0\xea\x63\x4d\x8a\x38\x3c\xc9\xab\x95\xd9\xf6\xa6\xb0\xc3\x1d\xcf\x26\x6f\x82\x71\x27\x2c\x97\x5d\xa5\x33\xa4\x5e\x7c\x27\x28\x97\x5d\x26\xd2\xd9\x10\xe9\xd9\x50\x56\xf5\x2f\x65\x99\x3c\xea\x2c\x6d\x95\x45\xc4\x0b\x69\xfa\xfa\xe1\x25\x01\x63\xbc\xbe\x5e\xb5\x78\x5d\x8f\x1a\xae\x1c\x45\x01\x44\xf8\x1a\xe9\xd7\x00\x5f\x03\xfd\x3a\x79\x64\xb8\xb2\xd4\x6b\x1b\xbf\xb6\xf5\x57\x81\xaf\x22\xb6\xd6\x6b\xf9\x83\x7e\x5f\x91\xaf\x37\xe3\x4c\x26\x25\x8f\x6e\xbd\x70\x5e\x03\xb5\x6e\x9c\x83\xb1\xcb\xd6\x6b\x8b\x7b\x63\xff\x9a\xde\xa0\xec\x7f\x5f\x9d\xe4\xaf\xd9\x55\xaa\x7e\xb8\x9b\xe9\xa7\x0f\x6f\x61\x9e\x50\x9d\x2c\xfa\xf0\xfb\x2b\xde\x86\xf2\x20\x38\x7c\x16\xbd\xf1\x79\x67\x34\x16\x3d\xb1\x4a\x51\xec\x5c\xa9\x4d\x3d\x15\x14\xec\x86\xa2\xdb\x7f\x16\xbf\x2b\x7b\xb5\xb2\xec\x5e\x1e\xa7\xfd\x6b\x53\x98\x7b\x59\xff\x34\x75\x91\xbc\x78\xef\xe0\x3a\x83\xb9\x9f\x37\xc6\xd4\xb4\x51\x3b\x48\xd9\x8e\x4b\x21\x0d\x0e\x0e\xae\xe9\x3e\xde\x58\x1d\x60\x3f\xbe\xc2\xbc\x90\x4a\x27\x80\xbd\xee\xbf\x4b\x51\xd8\x51\x5f\x79\x51\xb1\xf1\x35\x30\xef\xbe\x64\x77\x66\x77\xa6\xff\x91\xbd\x97\xd3\xf1\x5d\xc8\xd0\x0e\xde\x6f\xd1\x43\x91\x8d\xb7\xb9\x5f\x80\x77\xe6\x7f\x38\x42\xc3\xbc\x90\xef\x30\xd7\x03\x07\x85\x1e\x90\xdd\x7a\x6f\x1c\x5e\xd3\x83\xbc\x34\xf2\x48\x4d\xbe\xa5\xfe\x5a\xdc\x1b\x47\xb2\x67\xd2\x9c\x8d\x0f\x73\x36\x96\x72\x1e\xff\x16\x8b\xe3\x25\x2c\x4e\x7e\x5b\xe2\x64\xa9\xc4\xe9\x6f\x4b\x9c\x2e\x95\x38\x43\x92\x30\x87\x3d\x5a\xcb\xf2\xd4\x1a\x83\x39\xee\xe2\xde\x38\xbb\xa6\x47\xd7\xc0\xbb\x18\x67\xcb\x04\xbb\xca\x27\x95\x91\xb5\x24\xf1\x29\xa0\x5a\x5e\xf8\x1a\x98\x9d\xb6\x74\x17\x71\x26\x45\xa5\x22\x3f\x68\x0b\x95\xca\x07\x03\xd1\x0b\xf6\xdb\x9d\x64\xc5\x1c\xd0\x77\xb0\xa8\x57\xf6\x0e\x83\x2c\xac\x52\x95\x7a\x2c\xc3\xc7\xe6\x3b\x9e\xcd\xb5\x01\xe6\x6b\x60\x1e\x08\x8d\x9d\xc3\xdd\xa2\x3d\xfd\xf5\x32\x29\xfa\xae\xff\x20\x4d\x9d\x42\x21\xd7\xc4\x87\x08\xb9\xa6\x3e\xce\xbf\x68\xea\xe3\xe2\x0b\x0b\x95\x9b\xa6\x58\x33\x7a\x17\xd7\xf9\x2d\xec\xfb\x17\x4c\xff\x7e\x8d\x52\x2a\x6d\xe7\xf4\x39\xc6\x4a\x16\xf7\xc6\xf9\x35\x3d\xbc\xce\x6b\x1f\x5c\x48\x53\x6a\xf3\x73\xac\x6c\x76\xf1\x11\xe5\x3f\x80\x4e\xf9\xf0\xd1\xa8\x52\x6e\x9e\x7f\x21\x94\x03\x52\xe5\x23\x99\x70\xf1\x85\xc8\xbc\x4a\x2c\x04\x59\x30\x99\x56\xe9\x97\x3f\xab\x0a\x8e\x87\x17\x02\xe7\xd2\xf6\x43\x8c\xf7\x45\x6f\xbc\xb4\x23\x69\x9a\x23\xe4\x7a\x31\x42\xcb\xbd\x77\xcd\x72\x22\x6d\x5c\xf9\x39\x26\x0b\x7b\xef\xc5\x38\x5f\x61\xb0\xa4\xfb\x8b\xa7\xfd\xf5\x3b\x48\x68\xfb\xb4\x0c\x4a\x01\xfa\xfe\x45\x5a\x28\x15\x06\xf4\xf2\x9f\x0c\xe8\xd5\xb3\x1e\xcf\xeb\x67\x3d\x9c\xd1\xab\x1e\xce\xf0\x95\x85\x8b\x7b\xe3\xf2\x9a\x9e\x5c\x13\xfb\x78\x6a\x5c\x7e\xd4\xa4\xab\x67\xdd\xa4\xeb\xd4\x52\xef\x50\x4b\x2d\xd4\x3a\x58\x10\x1b\xcb\x9b\x87\x4f\x6c\xbd\x66\x7f\xba\x7c\xb7\x26\x32\x78\x51\x6a\xf1\x19\xbe\x7e\x08\x0f\x7a\x66\x19\x23\x55\x1e\xaa\xa8\xda\xdc\xf9\xfe\x8a\x53\x06\xe7\x8b\x42\x94\x2a\x34\x21\xf9\xf5\xf5\x5d\x72\x59\xd5\xba\xf4\xb9\xac\xd0\xfa\x87\xd9\xe0\xf3\x33\xce\xb1\xdc\x08\x7d\x2f\x30\xf2\x4b\x63\x13\xe8\x0b\x23\x9c\x06\x3e\xac\x89\xef\xd7\xf4\xf8\x9a\xd8\xdf\x73\x9d\xf7\x3c\x30\xbe\xaf\x6e\xf9\x67\x20\xcb\xef\x67\x75\x6e\x49\x61\xcc\x87\x63\xf1\x89\x3f\x7d\x04\xa3\xd8\x7b\x2f\xd7\x7a\x36\x16\x42\x26\xa5\x4e\xf6\x3c\xe5\x61\xaf\x6a\xc9\x7e\xf6\x9d\xaa\x4b\x7d\xa7\x56\xf4\x30\x5d\xb3\x8a\xf7\x69\xea\xaa\x9f\x6d\x13\xd9\x81\xbe\x13\x40\xa9\xa0\xbc\x54\x6e\xdb\xca\x6e\x3e\x75\x99\x3f\x09\x37\x3d\xf1\xda\x11\xc3\xfd\xc9\xf0\x59\xdc\xf4\xf3\xa5\xf1\xcf\xb6\xfc\xf3\x45\xfe\xf9\x43\xfe\xf9\x5a\x84\xfc\xc5\xca\xee\xc3\x79\xef\x99\x8f\x50\x60\x34\xd2\x82\x72\x75\x3b\xbb\xc6\x87\x3e\xf0\x63\x58\xe4\x0f\x4b\x0f\xe7\xa2\xe8\x62\xe7\xea\xdd\xa2\x03\xf6\x5b\x5f\x4d\xfb\x89\xf1\x1c\xd2\x37\xe9\xdf\x7c\x34\xe6\x0b\x62\xe7\x46\x7d\x40\x39\x66\x56\xba\x1c\x42\xcf\xf7\xa7\xcf\x7a\x6d\x36\x93\x74\xaf\x1d\x7e\xd6\x8b\xb3\x95\x70\xbd\xd9\x5e\x25\x9c\x45\xf3\x39\x6f\xab\x25\x98\x70\xa6\x78\x81\xc1\x75\xb1\xf2\x21\x56\xae\x58\x87\xa7\xcf\xb6\xe2\xa3\x87\x9f\x35\x13\xd1\x4c\xb8\xad\x84\xcc\xad\x84\xdb\x09\xd3\x15\xd8\x4a\xca\x7c\x9d\x70\x5b\x1d\x35\xdc\x20\xce\xd4\xb5\x23\xb6\xab\x66\xc8\x6b\x40\x6c\xe5\x8b\xe6\x35\xb0\xa5\x28\xa3\x27\x85\x2d\x3d\x36\xaa\x8f\x9c\x5d\x94\xb3\xf4\x88\xb3\xeb\x5a\x55\xdb\x67\x2c\xae\x1b\x1e\xde\x8b\x1d\xa3\x5b\x43\xd6\xef\x29\xe5\xe3\xc1\xb5\x33\x75\xcd\x67\x31\x1c\x77\x7c\x9e\xec\x26\x9d\xa8\xc7\x12\x94\x7f\x34\x8e\xad\x84\x31\xde\xae\x07\x3b\xa2\xfe\xf9\xd4\xba\x3a\xb0\xe0\xe9\xea\xc0\xfa\x7c\x4a\x77\xa7\x86\x47\x3b\x87\x84\xc6\x2c\x74\x9a\x33\x77\x33\xa2\x1e\xfa\xdd\x45\x8f\x9f\xd2\xc3\x1b\xac\xb0\xcd\x1e\x29\xdf\xd2\x07\x6e\x78\xd2\x17\xa8\xe1\x57\xe2\xad\x6d\xb2\x19\x91\xf2\x2d\xa1\x83\x34\x3d\xc6\xf7\x16\xbe\xa3\x00\x3d\xa8\x08\xb2\xf9\xa9\x07\xa9\xe8\x96\xcc\xfc\x73\x53\x56\xd4\x2b\xdf\x4e\x39\x21\x56\xb1\x3d\x8d\xbd\x8f\x9b\xa3\xd1\x45\x9d\xe0\x14\x47\xc3\x08\xca\x82\x6c\x6d\x57\xb6\x25\xe0\xad\x2f\xef\x90\xf5\xdf\xa1\x29\x71\x8b\x2b\xbe\x6e\x01\x62\x3c\x8a\x14\x92\x05\x0c\xed\xd1\x14\x93\x54\x9c\x86\x9f\xc7\xc4\xde\xc7\x14\x15\xd9\x01\x12\x42\x99\x10\xf2\x6e\x27\x99\xa5\xf3\xc5\xf7\x0c\x62\xdf\xa3\xe3\x42\xf3\x47\x60\x90\xf9\xdc\x37\x4f\xff\x63\x10\x62\x07\xea\x32\x1c\x2f\x9e\x0d\xe2\x3c\xb9\xc6\x80\xd8\x83\xd4\xdf\xc0\xe0\x1a\xf6\xb1\xab\x6b\x7a\x7a\x4d\xec\x2b\xdc\xc7\xae\x86\xef\x89\x9d\x33\x20\x78\x53\x58\x0b\x95\xf3\x63\x5a\x3b\xa7\x02\x8f\x6e\x35\x4a\x25\xc0\xce\x99\xba\x94\x2b\x04\xb9\x44\x50\x83\xca\x53\xd9\x40\x80\xf1\x27\xe3\x6a\x99\xa6\x2a\xac\xeb\x40\x0a\xb4\x7f\x72\x83\x9b\x83\x6b\xca\x61\x51\x32\x6e\x0e\x3f\xd7\xd1\xbd\xcc\x99\x40\xd7\x8a\x97\x64\x15\xeb\x78\x88\x7a\xc1\x04\xf9\xde\xc7\x90\x58\x87\xb2\x44\x3e\xa8\xd2\xf5\xf5\xf2\x55\xd9\x4a\x36\xe5\xf7\xa7\xb4\xb2\x72\x18\x71\x16\x2d\xee\x8d\xeb\x6b\xda\x40\x1e\xe6\x5a\x5b\x53\xe1\xa1\x71\xbc\xcc\x74\xff\xb3\xc3\xfb\xee\xff\x7a\x56\xaf\xf0\x50\xf2\x23\xe0\x75\xa5\x41\xfc\xaa\x4a\x84\xaf\xa5\x12\x37\x83\x21\x7f\x39\xe9\xf2\x48\xd1\xad\x3f\xb4\xff\xce\xec\xa0\xa6\x85\xa3\x36\x7c\x55\x44\x37\x9e\x5d\x18\xe9\x1c\xe8\x4c\x04\x41\xc7\x03\x83\x6b\x5b\x8a\xc3\x91\xb6\xa5\x20\x40\x31\x8e\x86\x6a\x72\x4f\x47\x5c\x79\x40\x39\x1c\xf1\xf7\x53\xf3\x47\xc0\x73\xcc\x98\x6c\x52\x3a\x8c\xe2\x68\xc9\x1d\x4e\x33\xaf\x00\x7d\x9b\x0a\xf1\x66\x5d\xa6\xee\xb5\xeb\x35\xcb\x5b\xdc\x1b\xcd\x6b\x2a\x8e\x38\xb1\x9b\xef\xcc\x25\x8b\x3c\xdd\x6d\x9c\x03\xde\x2a\x90\x0f\xb3\x77\xbc\x0e\x15\xb0\xd8\x5a\xd7\x74\x86\x73\xa0\xa5\xe6\xc0\x5d\xc1\xad\x2a\x82\x95\xcd\xb8\x33\xf7\x3f\xfa\x94\xd6\x19\x1e\x15\x22\xa0\x71\xa7\x85\xa4\x81\xef\xdc\xcd\xf4\xcd\x4e\xc0\x3c\xf3\x6e\x56\x87\x1f\xed\x5e\x4c\x0b\xd1\x02\x33\x88\xd1\x73\x85\x88\x6d\x43\xcc\xe7\x21\x6a\xcf\xde\xbc\xba\x18\x5e\xc5\x46\xb7\x07\x93\x47\x4c\x7c\x98\xe1\x6e\x36\x82\x7d\x9a\x90\xc5\x9d\xf9\xf8\xde\x19\xac\xec\x12\xf3\xd1\xb8\xd2\xc7\xda\xe5\x14\x8e\xb5\x71\x41\x46\xd2\xf7\xb3\x8c\xc1\x21\x10\x62\x7a\x37\xea\xa7\x06\xfd\x7f\xc9\x2c\x5e\x24\x9d\x5c\x15\x08\xf1\x87\x84\xb3\xaa\x7d\x73\xad\x37\x23\x54\x15\xdf\xef\xf7\xc6\x62\x3a\x7e\xd7\x5d\xdc\xd0\x06\x5b\x8f\xda\xc4\x28\x4e\xe6\x73\x43\x3d\x29\x87\x23\x3e\x76\xdb\xf9\x9e\x9a\xaa\x71\x22\xbb\xaf\x78\x8b\x1d\x27\x28\xb3\x7d\xb7\xd6\x56\x5f\xf1\xdc\x14\x70\xd6\x03\x5a\xbc\x57\xc9\x7a\xcd\x19\xba\x8a\x4f\x74\x76\x5d\xea\x33\xe5\x39\xaf\x52\x5b\x67\xdc\x79\x0a\x5c\xe3\x40\x10\x1a\x40\xb2\xa7\x92\x3d\x9d\x6c\xa7\xb7\x6d\x07\x5e\xa9\x64\xa0\x53\x0a\x92\xd3\x6c\xc5\x39\x20\x68\x88\xb1\x34\x44\x46\x20\x3c\x0a\x97\x86\x4c\x74\x0d\x41\x28\x67\x09\x6c\xa7\x9b\xa1\x33\x74\xb7\x6a\xd5\x2a\xb1\x03\x69\x9d\xa7\xfa\x2e\xcb\x1f\xce\xe7\xb2\x88\x07\x45\x3c\x28\xb2\xab\x8a\xe4\xa4\xfa\x57\xb1\x52\x10\x4d\xe7\xe9\x0d\x72\x8b\x9f\xd5\x7d\x0d\xcd\xf9\x6a\x2a\x5c\xfd\x40\x0b\x30\x53\xdf\xa7\x1e\x76\x0a\x3a\xa0\x1e\xf0\x2c\x09\xcf\x50\xf5\x06\xdf\x38\x0c\xa3\x74\xf0\xf0\xe9\x7e\xa5\x16\x06\x76\x6b\x4b\x31\x1c\xbd\xd7\xec\xc6\x53\x9e\x6d\x58\xaf\x33\x44\xef\x41\xbb\x2e\xec\x71\x7e\x22\xf8\xb0\x29\xfc\xb1\x51\xa5\xd5\x1c\x1e\x36\x97\xf3\x02\xef\x6c\x8b\x35\x49\x6a\x4d\x8c\xc4\x58\x4f\x33\x2f\x52\x7c\xf1\x52\x88\x65\x38\x10\x6b\x3b\xdc\x79\xf0\xd0\x3b\x37\xe1\xce\x6d\xe0\x1a\xdc\x39\xf0\x5d\xb9\x99\x77\xda\x4b\x3e\x44\xe5\xe8\x36\x5f\xb4\x87\x89\x03\x6f\xa9\x3e\xed\x38\x6f\xd0\x2f\xac\x44\x6c\x59\xd6\x78\xa7\x8b\x0e\x02\x87\xee\x96\xca\x8c\x03\x20\x5f\x9e\x8e\xc9\x42\xc2\x78\x99\xa8\x31\x4f\xa6\xca\x6a\x51\x95\x86\x5d\xa1\xa2\xb2\xd0\x8a\xce\x62\x87\x5a\xdd\x4e\x35\x3a\x6b\xbd\xf6\x5f\x65\xc6\x49\x01\x8d\x9e\xa4\xd3\x61\x2d\x1d\x88\x77\x71\x66\x97\x82\xf4\x5f\x93\xbc\x83\x0e\x35\x8a\x69\x9d\x5c\x29\xd2\xfa\x1e\x0c\xdb\x99\xcf\x33\x6f\xd7\x48\x13\x75\x42\x03\x3d\x1d\xfb\x79\x98\xcd\x6b\x52\x5d\x67\xbe\x39\xeb\xa2\x1b\x8b\x28\xe9\x7b\x40\xf9\x0d\xda\x1c\x13\xe9\xc9\x4b\x4a\x48\xc1\x44\x85\x66\x78\x84\x7a\x4e\x07\xf6\x4e\x5a\x2c\x50\x53\x77\x6b\x7a\x9f\xf5\x87\x82\x8f\xc5\x79\xa7\x27\xf8\xb0\x31\xe4\x41\x47\xf4\xc6\x86\x6f\x9e\xbe\xc0\xa4\xf7\xcd\x73\xf5\xf7\x4c\xfd\xbd\x80\xbf\xc4\x0e\x9c\x97\x5d\xd7\xa8\xd2\x94\x6a\xc3\xf7\x1a\xf5\xcd\x13\x99\x01\x51\x0a\x60\xfe\x49\x6c\x6c\x85\xcd\x02\xda\x06\x64\x8f\x20\x29\xa2\x9d\x69\x1e\x7d\xe6\x9b\x5d\xcf\x20\xf4\xdd\x86\x72\x2b\x1d\x73\xe2\xba\xdf\x52\x7c\x02\x14\x40\x37\xbd\xd0\xdc\xcf\x30\x79\xa5\x0a\x6d\x5a\xed\x8a\x51\xbc\x33\xc7\xbd\x15\xc4\x87\x73\xa0\xec\x99\x71\x9c\xa5\x24\x6d\x29\x9b\xc7\x3c\x6d\x4b\x1b\x29\xcf\x6b\xc4\xd6\x3b\x99\xfa\xf2\x90\xf0\xf9\xdc\x5b\xd7\xa7\x01\x1a\x7b\xa9\x13\x42\xe5\x38\x10\x86\x94\xbc\x0e\xe2\x8f\xd5\x9c\xa4\xc7\x1c\x25\xda\x2a\x1e\xc9\x5a\xff\x47\x21\x1c\xe5\x8d\x33\xee\xcc\xb6\xf7\x1b\xa0\x97\xff\x0b\xa0\x29\x09\xf5\xc1\xc5\xa5\x84\x7c\xbd\x12\x72\x01\x6e\x58\x84\x7b\xd2\xf9\xe5\x2d\xb6\x06\x7c\x75\x6d\x2c\x63\xab\xc2\x74\xe5\x61\xf7\x96\xac\x54\x46\xab\x34\x9f\x78\x41\x66\x98\x41\x2d\x40\x0a\x8a\x58\xee\xad\x52\x32\x2c\x9c\xf2\x18\xb8\x52\x4f\x0c\x74\xba\xad\xc7\x7f\x3e\xd7\xcf\x93\xbf\x88\xa6\x14\xbc\xac\x32\x2f\xaf\x54\xfc\xee\x6a\x42\x9f\xf9\x78\x2a\xb6\x8a\xf7\x14\x90\xf9\xc8\xfb\x80\xa4\xc1\x8d\x14\x0b\x1c\x79\x39\x6d\xe4\xf9\xdc\xd0\xa7\xbc\x54\x6f\x08\x9f\x5c\xe3\xec\x84\x14\xce\xfc\xf4\x04\xbc\xcd\x93\x9e\xd7\x9a\x18\xba\x8d\x99\xb7\xb8\x95\x3e\x70\x3e\x74\x3d\x77\xbd\xb0\x6f\xff\x09\x21\xfa\xe3\xc3\x0b\x80\x1f\xa9\xd0\xfc\xc7\x32\x7b\xd5\x4e\x32\xad\x8e\x05\xb1\x7f\xac\x16\x02\xde\x5d\xa7\xb9\x74\xe8\x03\xae\x43\x1f\x14\x23\x31\xff\xfc\xad\xdc\xff\xa7\x14\x29\xff\xfc\xa5\x90\xb7\x50\xa1\x3f\xb5\x38\xf5\x67\xb2\xa6\xbd\x17\xe3\xe7\x0a\xb1\x67\xa1\xc0\x10\x0a\x0c\x65\x81\x9c\xa0\xef\xfe\xb7\xb8\xdd\xa7\xa2\xd5\xfb\xdf\xd5\x01\x55\xe8\x1a\xee\xff\xaf\xbd\xf6\xf0\x5b\xcc\x1e\xa4\xd0\xf1\xd3\xf3\xc0\x78\x78\x27\x25\x2c\x54\x14\x58\xd1\x91\xb4\xd7\xcb\xb7\xfd\xf3\x6f\x6b\xf8\x2c\xc5\x01\x9f\x57\x89\x03\x94\xc7\x67\xa4\x08\x6f\x3d\xb7\x68\x79\xc6\x9b\x1f\xcd\x3b\xde\x44\xc6\xf7\x78\x6a\xf0\xe6\x3f\xe8\x4e\xcc\xfc\x7f\xe9\x4e\xaf\xf9\x5b\x96\x4c\xae\xc3\xfd\x01\xd3\xa1\x72\x7f\xde\xb1\xc3\xb8\x54\x5a\x3f\x89\x8d\xaf\xdb\x7f\xea\x0b\x49\x19\xe4\xe5\xc7\xb3\xda\x2e\x90\xcc\x68\xda\xf7\x86\xd7\x54\xec\x9c\xd7\x94\xec\xdc\x03\xff\xd8\xb5\xef\xad\x19\xf9\x40\x4a\xcd\x5c\xa3\xd7\x80\xbd\xca\x2b\x95\xee\xae\xa5\x4b\x8c\xcc\xf6\x29\xc5\xfe\x6e\x59\x5d\x12\xed\x8b\x09\x77\x5e\xd0\x8d\x86\x03\x14\xe3\x8a\xf3\xd7\xc8\xce\x55\xa2\xa5\x3e\x99\x9a\x54\x9e\xdd\x2c\xc4\x07\xe1\x92\x60\xf2\x96\x68\x25\x1f\x6a\x3b\x38\xa2\x9e\x22\x29\xf0\xfd\x10\xde\x67\x5d\x65\x42\xa3\xb3\x5c\xcb\xd3\x7e\xff\x77\x35\x90\x37\x2c\xd1\x38\xd5\x40\x53\x3e\x15\x68\x15\xbb\x2f\xd5\x73\x80\x56\x09\x14\xad\x52\xc7\x02\x27\xa7\x34\xe1\x46\x90\xa3\x57\x2c\x9d\x1e\x28\x52\x45\x03\xbe\xc6\xb6\x7e\xc4\xa3\x3e\x70\xe3\xec\x54\x4f\x1d\xcd\x7f\xa9\x09\xa4\x99\xb0\xfe\xb3\x18\x86\x49\xff\xc5\x6a\x45\x0b\xa2\x2f\xf1\x1e\xb8\xf1\x5d\x93\xb8\x27\x3f\xd3\x34\xff\x28\x25\x7b\xe5\x34\xb9\x56\x3e\x3e\xf2\xdc\xed\xc9\x4f\xf5\xe6\xe5\x38\xe2\x8c\x74\x57\x63\x96\xa7\xbf\xd3\x95\xf6\xe2\x1a\xd7\x53\x4e\xaf\x15\x7f\xfa\xf3\x4e\x6a\x3c\x3c\x7f\x37\x94\xbf\x18\x95\x69\x74\x46\x15\x90\xf2\x48\x94\x15\x18\x78\xd4\x95\xd4\xd5\xdf\xf4\xf3\xd3\xb1\x75\x49\xe4\xb0\x3d\x7f\x5f\xe2\x3b\x32\xa6\xf2\x3d\x8a\xeb\x1a\xc7\xf7\x07\xa5\x0e\x89\x3c\x74\x49\xc7\xcb\x76\x8b\xa9\x4b\x5b\x91\x56\x45\x2b\xa6\x5f\x6a\x86\x2c\xe5\x2f\x7c\xa6\x39\x0c\x1a\xb0\x22\xcf\xc2\xf2\x5c\x8b\xee\x75\xdd\x01\x67\x6d\xda\x9a\xf1\x72\x00\xed\xe3\x65\xaf\xcb\xcb\x1e\x3c\xfa\xe5\x4b\x41\x16\x48\xad\xbe\xdb\x4c\x3e\x67\xe7\x1e\x4d\x09\xd6\x22\x9f\x0e\x7c\xc9\x5e\x4c\x7e\xa5\x06\xe9\x35\x4d\x61\x9e\xc5\x19\x75\xf0\xff\xff\xbc\xfd\x4a\x16\x38\xe5\x7a\x35\x39\x01\xb3\x3e\xdb\x61\x91\xc1\xfd\x25\xa5\xae\x97\x54\xff\x28\x77\xdc\xd3\xe1\xd4\xf2\xe1\x1c\x0f\x16\xc4\x96\x3b\x31\x92\x17\xb8\x95\x67\x2a\xfc\xe3\x9e\x21\x72\xc4\xb6\xc0\xa1\xfc\x25\x09\xaf\x6b\x3b\x3c\x49\x0f\x1e\xba\x1c\xcf\x2a\xad\xf2\xfe\x6f\x55\xf9\x77\xe8\x7b\x5d\xed\xe9\x33\xff\xb8\x5e\xba\xd1\x01\x20\x95\x21\x46\x1b\xe9\xf4\xa2\x0d\xab\x3b\xe5\x74\x00\x5c\xff\xf0\x59\xec\x8e\x06\xc2\x1f\x37\xf9\xb8\xd3\xb7\xae\xe1\xac\x04\x12\x6a\x77\x2c\xa3\xe6\x8b\xef\x2d\xa3\xf1\xcc\xe9\x6d\x04\x27\x9c\x44\x1f\x4f\xe7\x71\x26\x93\x1a\xcb\x20\xca\xc5\xde\xfa\x2d\x0f\x21\x2f\xce\xf0\x72\xa3\xf1\x68\xe8\x43\x94\xd8\x41\x85\x79\xb6\xa8\x30\xdf\x16\xea\x4e\x07\x83\xff\x07\x9b\x41\x59\x6c\x0a\xb5\xc5\x8f\x58\x84\x31\xb7\x02\xf6\xb6\x11\xf6\x7b\xe3\x8a\xbc\xc8\xd8\xb0\x22\x75\xa5\x41\x65\xf2\xa8\xf3\x2a\x36\xac\x91\xf4\x46\x3c\x91\xf0\xcc\x7f\x7f\xdd\x1c\x11\x3a\x52\x91\x5b\x2b\xa3\xad\xed\xf2\x84\xd0\x09\xf3\xec\x10\xef\x9f\x8c\x49\x59\x7e\x13\x5b\xdb\x84\x06\xce\xf5\xa9\xcb\x1a\xc7\xc4\x0a\x19\xbb\x1c\x95\x4a\xf0\x59\xa8\xe4\xd1\x11\xb1\x03\x73\xca\x26\x76\x60\xce\xd8\xc8\x8e\x9c\x93\xc0\x2d\x95\x8c\xc0\x39\x3b\x72\xd9\xc5\x01\xb1\x23\xf3\xc6\xc7\x84\xd3\x23\x97\xed\x36\x88\x5d\x45\x1b\xd2\xb3\xa9\x11\xd0\xe6\x49\x79\x00\xbb\x4a\xb6\xb5\xd8\xd9\xf1\x70\x3b\x42\xcf\x57\xe9\xae\xaf\x8e\xfc\x03\x0f\x23\x1a\x28\xaf\xc5\x71\xa9\xb4\x17\x97\x4a\xcf\x31\xf2\xe0\xa7\x07\x34\x29\x1e\xba\x92\x35\x57\x07\xae\x54\xd8\xb8\xbd\x36\x6a\x18\xa2\x3d\x91\x4e\xb5\xf4\x09\x93\x31\x6e\x30\xa0\x49\x8e\x6f\x4b\x7e\xc5\xb7\x69\x74\x7b\x27\x79\x3a\x51\x79\xec\x7a\x48\x27\x7a\x66\x3e\x39\x96\xf1\x0f\x56\x05\xef\x91\xa5\x33\x3f\x14\x2b\x2c\x08\x74\xd8\xb7\xf4\x46\x1a\x4d\x72\x1a\x21\xb1\x23\xee\x9c\xb9\xce\x7e\x66\x5e\x50\xbc\x9b\xc6\x7c\x47\xbf\xcb\xb7\x2d\xf3\x3d\xee\xff\x26\xdf\x17\x4b\xda\xea\x04\xce\x17\xe5\x42\xb0\x1f\xd2\xc0\xa9\xba\x34\x70\x6a\x2e\xad\xd2\xda\xbf\xab\x3b\xf2\xce\x4e\x90\x7a\xcd\xaa\xd2\xea\x8e\xc0\xbf\x81\xf3\x07\x64\x5a\xba\xa9\xfe\x43\xd6\xdb\x8e\xd0\xdb\x6f\xc1\x0d\xe0\x48\x00\x6d\xb6\x92\xd9\xcd\x53\x12\x06\x7f\x4f\xab\x79\x85\xfd\x36\xa3\x25\xd0\xdd\x49\x52\xbc\x28\xfb\xf4\x3b\xb6\x15\x0f\xa6\x25\xb6\x35\xcf\xac\xa6\x14\xc8\xcf\xbb\x0f\x05\xd2\xf6\x78\x36\x80\x89\xc9\x19\x3b\x6c\x2f\x9d\x5c\xa5\x92\xfa\xe8\x65\x1f\xbd\xdc\x47\x49\x3c\x9b\x5d\xa3\x7d\x04\x27\xec\x0f\x25\x28\x7c\xfe\xae\xe6\x15\xd0\x30\x78\x30\x1f\x17\x74\xb0\x10\xed\x63\xb1\xa4\x67\xf9\xf3\x2e\x83\xf8\xec\xbd\x07\xf9\x8e\xe5\xcf\x5b\xa2\xee\x0f\x0a\x86\xa9\x27\x3f\x0b\xaf\x5e\x24\xbb\x2a\x2f\x12\x48\x67\x38\x56\xf4\xe6\x37\xe7\x73\xc3\x6f\xea\x18\x7d\x7f\x54\xab\x84\xfa\x4d\xa7\x70\x53\xe0\x37\x73\xc5\x82\xe6\xb2\x12\xa7\xbe\x83\x37\x6f\x4d\xc5\x48\x75\x7c\x7d\x41\xf1\x94\x5d\x3f\x8a\xe6\x92\x9f\x1e\xb3\x13\xd8\xef\xb9\x2a\xd1\x44\x6e\x5e\x20\x97\xc4\x59\xd0\x84\x33\x59\x34\x7f\xcd\xd8\x8b\xd5\x3c\x55\x8e\x4b\xe1\xe8\x38\xd3\x77\xa6\xae\x3d\xe0\x46\x40\xc3\xa6\xc1\x49\xf9\x16\xaf\x37\xf0\xcd\xc3\xb7\xc6\xd4\xf0\xd5\xb7\x91\x28\x63\x72\xa6\x65\xe9\x45\x52\x50\x57\x2a\x5d\xbe\x18\x3e\x3d\xdc\xcb\x77\x67\xd4\x7c\xaf\x09\x55\x68\xea\x87\x6a\x51\x8f\xfb\xfa\xc2\x35\xde\xd7\x17\xae\x8d\x8e\xbe\x70\x3d\xee\xa0\x5a\x54\xd4\x44\xb9\x42\x94\x75\x8b\x7c\xfc\xa5\x1e\xd9\xe3\xbe\x16\xc9\xc4\xfb\xcc\xb3\xdb\xcd\x1c\x55\x58\x51\xf5\x50\xaf\xa2\xea\xa1\xdb\x9b\x3a\x4d\x3d\x1d\x77\x80\x72\xdc\x7b\x31\xa2\x15\x0c\xae\xc6\x93\xa7\x78\x16\x6b\x50\x18\x54\xd4\x5d\x6a\xbc\x5f\xf1\xe8\xf6\x26\xa7\xdb\x9b\x45\x37\xec\x9d\x66\xb6\x87\xff\xaa\xc3\x14\x23\xdf\x69\xa2\x10\xa3\x93\x75\xc4\xf1\xd4\xe8\xac\xc0\xaf\x38\xf8\x30\xf0\xc0\xd4\xd0\xc7\x26\x9e\x59\x3e\x2a\x41\x3c\xc2\x00\x2f\x34\xb4\xdf\xcc\x1f\x35\x77\xfc\xc2\xdc\xf1\xd3\xb9\x93\x77\xd1\xf8\xcf\x9a\x14\x37\x51\xfa\x11\xe7\xa6\xfc\xc0\x88\x9b\xcb\x72\x90\x24\xd7\xb9\xbd\x13\xda\x39\x92\x4e\x25\x73\x5d\xd9\xfd\x67\xf5\x76\x9b\x28\x13\xe9\x66\xf5\x7e\x92\xcf\x4b\xf2\x91\x5c\xc5\x78\xc3\x53\x73\xe9\x61\xbb\x28\x25\xe9\xfd\xbd\xc5\xdd\x93\x22\x93\x5e\x61\xf0\x7a\xff\xc7\xc1\xeb\xfd\xa3\xc1\x53\x20\x5a\xea\xd9\x2b\x38\xc6\xeb\xff\x5d\xd1\xca\xb2\xe8\xe4\xde\xe8\x4b\x99\x09\x92\x92\x4d\x26\xb8\x13\x0a\xb7\x54\xfa\xf7\x8e\x7a\xcc\x39\xa8\x3d\xca\x7b\xaa\x50\x8c\x53\x82\x6e\x18\xeb\xdc\x02\xbe\x46\x3a\xa7\x20\xe5\xdb\x6c\xf3\x7c\x6a\xe6\xca\x20\x41\x58\xab\x56\x37\x8d\x5c\xee\x8a\xf9\x35\xaf\xec\xf1\x98\x2f\xf0\x24\x27\x6c\xf6\x35\x5c\x09\x2e\x07\x2d\x07\x29\x69\x6a\x6b\x95\x41\xb3\xce\xd1\xf1\x9d\x85\xd2\x1a\xf4\xdd\x9a\x66\x1b\x36\x8b\x72\x91\x5b\xa7\xe5\xb9\xc6\xd1\x84\x97\x3d\x18\xb0\x4e\xc0\x4e\x26\xbc\xfc\x1a\xf0\x72\x79\x45\xa4\xbd\x11\x22\x34\x68\x96\x4a\x1c\xd9\x42\xd4\x81\xc1\x7d\x0a\x07\xaf\x17\xb8\x64\xd1\xc7\x71\xfe\x07\x92\x21\x7b\xd4\xd4\xa7\xde\x27\x59\xf8\x97\x72\xa2\x19\x6c\xea\x97\xc4\x5e\x56\x1d\x54\x97\x9a\x39\x77\x1c\x32\x2d\x70\x6d\xe1\xdc\xf8\x2e\x63\x07\x47\xa5\x92\x8f\x57\x9e\x82\x2c\x96\x64\x4d\x75\x29\x0e\x62\xec\xbc\x5d\x1f\x43\x0d\xeb\x35\x62\x01\x3d\x61\xce\xba\x75\x43\xa6\x54\xe1\x6c\x1a\x4a\x64\xe9\xc1\x11\xa1\x3d\xcf\x08\x68\x3a\x2e\x28\x95\x2a\x03\x47\x7d\x0f\x87\x55\x26\xb4\x7a\xc2\xc0\x1e\x56\x06\x05\x9b\xa0\xbe\x13\x4b\x57\x97\xeb\x07\xd9\x0d\x7f\x43\x98\x35\x55\x20\x0b\x52\x2c\xc9\xd1\x4b\x39\x16\xcb\xe4\x58\x28\xbf\xb2\x82\x4d\x2d\xc1\xa2\xd0\x43\xa1\xef\x1a\x8d\x53\xe2\x54\x5d\xbb\xf6\x2d\xa8\x4b\xe6\x5c\xb7\xb1\x71\x8a\x6d\x14\x34\x20\x74\xf2\x62\x08\x7a\xba\x87\x8d\x13\xc5\xc6\x09\x68\x9c\xc8\xfa\x96\xc6\xd3\xac\x7d\xf4\x18\x50\x0c\xca\xb7\x44\x89\xc9\xa6\xef\x9b\x9b\xe9\x56\xb5\x9b\xef\x0d\x7f\x38\x6c\x0a\x7b\xdc\x08\xe9\x20\x22\xb0\xc1\x84\x6a\x47\xb0\x43\xbd\xc1\xf8\x68\xed\x1a\xc2\x26\x1f\xe8\x2d\x1f\xdf\x04\xbe\x71\x39\xfe\xfd\xd3\x52\xa9\x31\x05\x06\x01\xb3\x49\xca\xa1\xa0\x7b\x35\x2e\xac\x0e\xb5\x56\x68\xc0\xd0\x10\x14\x8e\x4d\x9f\x56\x29\x50\xe4\x43\xa0\xc8\x77\xdd\x9c\xe8\x74\x3c\x9c\xbd\x89\x67\x9e\x18\x1b\x41\xdf\x47\x33\x47\xb3\xc7\xbb\x62\x34\xe0\xbe\x18\x6d\x90\x85\xcf\x81\x0b\x89\x8f\x38\x79\x5b\xdc\x31\x1c\x60\xa0\xa0\x3f\x56\x65\x89\x30\xbe\x54\x0e\x88\x19\xfd\xf5\xdc\x4d\xfe\x9a\xcf\x0d\x58\xe1\xf9\x0f\x3c\x08\x8c\xc3\x09\xa7\x9d\x33\x7a\x9e\x70\x62\x7d\xf0\x91\x50\xee\x19\x5c\x5d\x14\xb7\xc6\xb3\x44\xb4\xda\x42\x8c\x0d\x42\x1b\x13\x4e\x7e\x25\x37\x52\x28\xe5\xb4\x6b\x46\x53\x5e\x96\x5b\x64\x79\xdc\x93\x8f\xb8\xcb\x2b\x5a\xd3\x57\x13\x52\xcf\x24\xde\x80\xe9\x16\xa8\x91\x14\x7a\x24\x05\x15\x38\x84\x55\x1c\x3f\x41\x55\xdd\x38\x7e\x22\xb5\xdb\x05\x72\x2f\xa0\x5a\x8c\x18\x36\x53\x8d\x03\x35\x84\x4a\x20\x47\xac\x65\x8a\xf0\xf2\xc5\x08\xa8\xdf\xd1\xda\x05\x24\x2d\xfb\x32\x29\x94\x4d\xa6\xc4\x3a\xdc\x23\xb6\x5a\xaa\x05\x79\xaa\x68\x6a\xd7\x7c\xf6\xf9\xd8\xf0\xe9\xd9\x89\xd6\x1a\x1b\xde\xa9\xe0\x9a\xd2\x83\xc9\xdd\xfb\x91\xcc\x8b\xe9\xb4\x18\x57\x09\x0c\xa7\xe8\xa2\x09\x25\x95\x03\x19\xca\x76\xe8\xa6\x4a\x9a\x18\x50\xff\x56\x09\x2c\xa5\x6b\x45\x0d\xc7\xe6\xa5\x12\x77\x02\x38\xb4\xf0\x8f\xf3\xd3\x77\xd7\xd9\xb5\x4d\x38\xe3\xce\xa3\x70\x73\xdf\x33\xfe\x87\xd3\x9b\xa9\xa2\xef\x86\x77\xd2\xcd\x88\xe6\xc1\xfe\xa6\x5c\xf2\x63\xf5\x21\x33\x17\x7c\x4f\xcb\xe8\x9c\xa9\x6b\x0e\x3a\x53\x91\xdc\x75\x82\x71\x7b\x3e\xe7\xce\xae\xe7\xce\xe7\x35\x9a\x7d\x91\xba\xb0\xf0\xe9\xc1\x87\x4f\xbf\x13\xea\xfd\x4e\x7a\x27\x1d\x55\xe8\xe9\xf6\x34\x95\xcb\x35\xa6\xbc\xe2\x53\xaf\x12\xd0\xed\x4d\x9f\x6e\x6f\x06\x44\xc5\x39\x8f\xe0\xdb\x78\xe5\xc5\xb9\x39\xee\x2d\xdf\x9b\xff\x5a\x94\x57\xac\xfa\xf0\x44\xd7\xac\x3d\x33\xca\x1a\x3b\x69\x8d\xbf\xaa\xe9\xf7\x12\x3c\x69\xea\xa8\x6b\x3b\x7d\x96\x0d\x8d\xb2\xea\x12\x78\x9b\x9e\xa2\xf7\x7e\xe9\x1e\x0b\x12\x8a\xc2\xb7\xa5\xfb\xfb\xbf\x2f\x7c\x1b\xab\x7a\xfb\xa7\x84\x8e\x52\x2c\x7a\x27\xc4\xf6\x58\x23\x2c\x3f\x21\x91\xdd\x14\xf0\xe0\x93\xf2\x11\xa6\x04\x3a\x45\x90\xf2\x6b\x08\xf8\x8d\xe8\x55\x9b\x7a\x44\x3e\xb6\x4e\xe9\x45\x1b\xca\x6b\x68\xd3\x5d\x4e\x6c\x0f\x48\x97\xb8\x8d\x9f\x7c\xe6\xc1\x7a\x39\x02\x5a\x10\x85\x78\xe9\x11\x86\x5a\xc9\x3e\x8d\x52\xad\x64\x15\x61\xbd\x54\x32\x7c\x27\x3e\x73\x59\x48\xb4\x80\x6d\x04\x19\x33\xf1\xda\x3e\xbc\xee\x36\x10\x07\x4f\xd2\xc9\x52\x37\x79\xa4\xfe\x7a\xba\xfb\xba\x4d\x63\xb0\x42\xdc\xb5\xa4\xa6\xf0\x81\xb4\x4b\xf9\x67\xc9\x7a\x0d\xea\x13\x39\xbe\x40\x55\x12\x37\xd5\x7e\x57\x14\x7b\x2d\x69\x30\xe4\x42\x62\xfc\x6f\xe5\x5e\x41\xfb\x9d\x9c\xea\xa6\x83\xac\x35\x59\x25\xfe\x3a\x6c\xfc\xbd\xec\x4a\x0a\x36\x8b\xfe\x5e\x76\x25\xbc\xda\x3d\xfb\x40\x44\xb6\xed\x96\x03\xe7\x0b\x5e\x0c\x34\x8d\xc0\xf9\x03\xfd\xda\x08\x14\x97\x11\x38\x48\x30\xf5\x2b\x3a\xb6\x11\x28\x3f\x23\x84\x46\x32\xb5\xea\xa2\xa2\x7f\x53\x46\xf5\xa0\x89\x94\xcb\x56\xfe\xfc\xfa\xf5\xcb\x9f\x9b\x18\xe1\x83\xf6\x96\xd2\xbe\xb8\x2a\xa2\xc6\xee\x13\xa7\x21\x15\xe9\xa4\xff\x47\x92\xb5\xec\xa4\xfb\x1b\x92\x35\xd1\xfc\x58\xb2\xa6\x7d\x7e\xac\x90\xb0\xf5\x97\x25\x6a\x6a\x4f\x37\xf2\xd4\xd4\x2a\xd5\x13\xed\xc2\xa3\xff\xa1\x9c\x69\xd2\xfc\xc0\x93\x88\x3e\x0f\xcf\x25\x2f\x15\x4c\x0c\x31\x9f\xff\xe8\x6a\x2b\xa2\xe0\x84\x5d\x2a\x6b\xd9\x20\xf5\x13\x37\xdd\x4d\x1f\xf9\x75\x96\x3a\x49\x1f\x77\x13\x9e\x3e\x1f\xe4\x9e\x4f\x4e\xd2\xc7\x1f\x0f\xe9\xb5\xf8\x5e\xc2\xd3\x67\xef\x3a\x7d\xdc\xcf\x25\xbf\x3c\xa7\x76\x4d\xf7\xc2\xc8\x16\x51\x83\xb3\x67\xd5\x33\xf5\xaa\x15\xf0\xc5\xbd\x31\x69\x2a\xff\x26\x13\x75\x6d\xbe\xff\x2f\xb6\x5d\xfd\xe3\xdf\xf6\x9d\x79\x83\xfa\xbd\x77\xe6\xad\xfa\xdb\xf7\x58\x25\xe0\x90\x10\x6a\x2b\xdf\xc9\xbd\x7e\xfa\x88\x74\xc3\xc0\xa0\x79\x99\x5b\x87\x1b\xc4\x7c\x34\xa6\x23\xfa\x36\x1a\xfa\xd6\x8b\xc2\x87\x6e\xf8\x09\x1f\x8d\x36\xac\xfe\x13\x57\x37\x30\xdc\xa9\xa6\x97\xc1\xdc\xa9\xb9\x0b\x1c\xce\xc3\x70\xc9\x4b\xef\x68\xe8\x33\x0d\x25\xbd\xcf\xcd\x6f\x0f\x2f\xcd\x74\x62\xda\xdc\x0c\x4e\xd6\xd9\x65\xdd\x63\x53\x18\x62\x78\x25\x96\xa1\xde\x7a\x47\x84\xcc\xe7\xfa\x6d\xda\x86\x65\x0a\x87\x32\x50\x07\x18\x85\x00\xf6\x19\xf3\x5c\x68\x7e\x33\xdd\x8c\xcc\x73\x91\x91\xcd\xdd\xa2\x26\xb8\xe3\x16\x03\x0c\x20\xce\x7c\x28\x38\x93\x7f\xe6\xf3\xe9\x90\xdb\x1c\x03\x71\x9b\xc3\xa7\xf9\x7c\xda\xb6\xd1\x71\xb2\x23\xbf\x53\x48\xa5\xdc\x39\x72\x95\x83\x00\x82\xf6\x49\x3e\xbe\x88\x31\x7a\x33\xf2\x8d\x78\x84\x41\x25\xef\xcc\x97\xe7\xf7\xaa\xf9\xe7\x02\xb2\x4c\x0f\x95\x69\xb4\xb7\xca\xd9\x49\x57\xc5\x1c\x3c\x17\x74\x7a\xb8\x9a\x10\x52\xed\xe1\xf3\xf9\x97\x6a\x95\x7a\xf3\x79\xed\x6b\x55\xe2\x04\x5b\x57\xae\xa6\x97\x43\x15\xe0\x72\xa5\x7f\x9b\x5c\x4d\x2f\x87\x04\xcd\x43\x76\xcf\x30\xfb\xc3\xe5\x7b\xdc\x1b\x9c\xe1\x81\x72\xbf\xe2\x5b\xdf\x2b\x0e\xf4\x4c\x31\x2c\x1c\x16\x17\x8c\xb5\x44\x27\x19\x41\x27\x4e\x27\xba\xc7\x72\x2c\xce\x6b\x53\x87\x4d\xf6\xfc\x8c\x72\xe3\x8c\xfd\x38\x40\x15\xb7\x63\xf9\xe7\x44\xfe\x79\x90\x7f\x3e\x1f\x64\x00\x9e\x3f\x02\xd0\x3d\xc1\xbc\xcf\x53\x8e\x7f\x77\xa7\x3c\x2b\xd4\x93\xe7\xd5\xdf\xa8\x36\xe7\xdc\xff\x77\x65\x4e\x52\xe4\xee\xcc\x7b\x7f\x95\x64\x55\xf6\x86\x26\x61\x27\x5f\x56\x4e\x94\xc9\x17\xa5\xc6\x39\x12\xe3\x9b\xce\x38\x11\xef\x73\xdd\x86\x5a\x7e\x2a\x21\xf6\x94\xc1\x88\x79\x1b\x3a\x2f\x9e\x6b\x6c\xfd\xb7\xb7\x15\x51\xec\xe8\x9c\x7b\xa1\x74\x6c\x4e\x4e\x64\x64\xf9\x74\x7c\x06\x38\x3e\x27\x27\x38\x3e\x4d\x91\x5f\x57\x27\x27\xe8\xf6\x6f\x91\x8d\xf1\x5e\x2a\xd9\xe1\xe6\x8f\x07\x15\xd2\x80\x0d\x70\xcd\x41\x0a\x7d\xea\x71\x2a\x97\x85\x84\xde\x1f\x61\x8b\x53\x00\xfb\xcd\x25\x82\xc4\x16\x2c\xe0\x79\xef\xa1\x34\x62\xd2\x7b\xe8\x4e\x64\x97\xcb\xa1\xa6\x69\x3d\x27\x74\x15\x49\x15\x97\x4a\xf1\x8e\x8c\xff\x19\x93\x85\xd8\xe1\x66\x83\x97\x4a\x06\xfc\x61\x78\xcd\x0b\xfb\x24\xfa\x21\xed\x0f\x8d\x25\x68\x12\x10\xcd\x00\x7d\xd3\x80\x6c\xf1\x8d\x9b\x7d\x0f\x01\xf5\x3d\x26\xb5\x0e\xfc\x0e\xc6\x41\x45\xed\x6a\x7e\xed\x9c\xba\x3b\xdc\xbc\x0c\x0a\x3e\x83\xf6\xf3\x7e\x0b\x79\x10\x74\x7a\xd1\x5a\x22\x22\xd1\x0b\x46\x6b\x63\x31\x1d\xaf\xf1\x70\x2c\x86\x6b\x61\x67\x38\x1a\xaf\x89\x44\x20\x3b\xbe\x81\x96\x68\xd7\xd2\x43\x7b\xda\x59\x1d\x1c\x0a\x7e\x9d\x2d\x15\xac\x4d\x8f\xd7\x74\x17\x9d\x5b\x66\xf9\xc7\x87\x14\x53\xf5\xc8\x2d\xd0\x06\xe4\x80\x8f\x57\x3a\x08\xf7\x3b\x06\x57\xde\x73\x2f\x03\x87\xbb\x96\x7a\xcc\xaf\xe1\x69\x73\xa5\xf3\xea\x2a\x15\x4c\x35\xdc\x0e\x76\x04\xc6\x11\x53\x12\x11\x9f\x46\x2c\xa0\xb1\x1d\xb3\x6c\x14\x13\x99\x39\x70\x69\x8f\xc1\xa8\xd0\x01\x83\x3e\xa5\x23\xe6\x51\x38\x77\xe9\x33\xab\xd2\x57\x96\x00\xb8\xe7\x9d\x57\xbb\x5c\x7e\x26\x13\x68\xdb\xd3\x11\x37\x12\xe7\xd9\xa5\x3d\x3a\xa0\x40\x52\xc7\x4c\xee\x1b\x31\x9c\xed\xec\xe2\xb4\xde\x14\xd6\x25\xb1\x43\x27\x72\x59\xbc\xd0\xfb\xb0\x87\x9f\xc4\xd8\x6a\xa2\x3b\x1b\xe5\x5f\xd2\x9c\xdc\xd7\x67\x01\xf0\xb0\x22\xa4\x3e\xb1\xe4\x33\x24\xcb\x84\xb4\x1b\xdb\xb8\x7b\xe7\x8f\x13\x79\xc4\xc8\xe1\xde\xff\x57\x2e\x76\xc6\x7b\x57\xb8\x8e\x4b\xf5\x54\x83\xdd\x01\x97\x8c\x1d\xee\x70\x9c\x6d\x30\xd7\x4a\x25\x01\x4d\x0b\xcb\x7e\x19\x5e\x11\xe1\x20\x5b\x65\x42\x0f\x36\xea\xd2\x0d\x8f\xb8\x0a\x53\xf8\xe7\x1f\x74\x9b\x54\x6a\xb9\xb1\x79\x7a\x5f\x79\xc0\x58\xef\x28\x73\xa9\xc9\xf8\x7c\xbe\x8e\xc3\x3c\x9f\x87\x1c\xff\xf0\x1d\x38\x43\xbf\xf9\x5a\x5d\x46\xd4\x6f\x07\xdc\xfa\xbc\x0f\x85\x02\xe8\x36\xfd\xa1\x85\x9e\xb5\x81\x70\x09\x98\xf9\xd5\xf6\xbf\x79\x18\xef\xd5\xe0\x15\x8f\x6c\x19\x7e\xc5\x93\x8e\xa9\x85\xca\xbf\xb1\xbb\xb7\x7f\x70\x78\xd4\x38\x3e\x39\x3d\x3b\xbf\xf8\x7e\x79\x75\xdd\x6c\xdd\xdc\xfe\xb8\xfb\x79\xff\xc0\x3d\x3f\x10\x61\xd4\xee\x3c\xc6\x49\xb7\xd7\x1f\x3c\x0d\x47\xe3\xc9\xf3\xcb\x74\xf6\x5a\xad\x6d\x7f\xf9\xe3\xeb\x9f\xff\xfa\xf7\x7f\x2a\xe6\x86\xb3\xef\xb9\x06\x46\x60\x0c\x36\x87\x47\x7c\xeb\xcf\x3f\x08\x29\xff\x3f\x0e\xf6\x7f\x00\xac\xcd\x25\x95\xfd\x67\x6d\x33\xe5\x61\xfe\x8f\x35\xc9\x7a\x38\x59\x7c\x42\xca\xad\x48\xe6\x4e\x8a\x94\x6d\xe1\x82\x75\x3a\x29\xbc\xee\x26\xbc\xf0\x7e\xb0\xf4\x7e\xb3\xf4\x7e\xbb\xf4\x3e\xdd\x2d\xbc\xf2\xeb\xc2\xeb\x65\x90\xd1\xcb\x40\x28\xe6\xbf\x35\x8a\x80\xfa\xca\x32\x52\x53\x97\x85\x3b\xe2\x93\xc2\xeb\x8f\x87\xc2\xeb\xde\x12\x4a\x5e\x11\x87\xfd\x84\xe7\x23\x60\xc9\x83\x74\x9a\xba\x0e\xa2\xc9\x9e\x26\x96\x27\xc3\x0e\x03\xa2\x38\x39\xe2\x74\x3a\xce\x5d\x52\x1d\xa4\xa7\x0e\xe6\xbb\x88\x52\x5f\x5d\x7d\xae\x2d\x3a\x2f\x44\x4a\x7f\x1f\x0c\x79\xea\xc3\xf4\x21\x1f\xf0\xec\xb9\xcf\x99\x6f\x73\xc6\x58\xef\xa4\x54\x32\x94\xa5\xae\x79\x21\xe8\x35\xa1\xd3\xdc\xdb\xae\xba\x8b\x7c\x90\x41\xc6\x7e\x9e\x9b\xa1\x30\x5f\xee\x74\x06\xd8\x69\xd9\x01\x52\xec\xcb\xa6\x56\x1a\x81\x34\x4c\x99\x60\x3e\xc7\x20\x2e\xc3\xfe\xb8\x3f\x9e\x0d\xc4\x65\x98\x03\x43\xec\x3b\xb3\xd5\x5d\x52\xb2\xcb\x45\xe2\x7a\x48\x4d\x99\x46\x47\xdc\x51\xad\x47\x71\xdd\x3a\xcf\xfb\x94\x5c\x0b\x86\xfc\x65\x6d\xd8\x9f\x8c\x3b\x3d\xb1\x16\xf6\x87\x6b\x1b\x2a\x86\x65\x84\x0e\xda\x75\x6b\x30\xbc\x47\x6a\xa5\x00\x38\xe4\x5d\x94\x9a\x0f\x7d\xa0\x3d\x5a\xe2\x43\xe7\x3d\x17\x05\xe7\x3d\x29\x51\x71\x21\xcc\x69\xe6\x1e\x2d\x47\x6b\x1d\xe5\xb3\xcc\xf2\x59\x3e\xdd\x99\xb3\xa8\x70\x4c\x0d\xb2\x01\xe0\x45\x7f\x94\x40\x80\x3e\x16\xf2\xb6\x7e\x95\x77\xe9\x2e\xd2\x9f\x7e\x98\x77\xef\x65\xc9\xe8\x37\xf9\x30\x6f\xde\xb1\xd0\x32\x0d\xc3\x82\xf9\xfc\x6d\x61\x1f\xa1\xdf\x09\xe9\xa6\x27\x05\x9a\x52\xee\x3f\x7a\x06\x9a\x2b\xcd\xe7\x02\xfe\x90\xf9\xfc\xda\xe6\xe6\xa5\x80\x03\xdd\x67\xd7\x3d\xc3\x33\xc3\x4e\x92\x5c\x0e\xb8\xdf\x19\xa7\xe2\x23\xbf\x54\xe2\xe6\x7e\x5b\x66\x42\x10\x9f\x3d\x04\xf1\xd9\x73\x0b\x79\xa4\xab\x28\x8f\x5d\x02\xa0\xd1\x78\xd8\x8f\x05\x4a\x3c\x73\x71\x34\xb8\xd9\x8d\xf3\xbc\xff\x24\x49\x16\x40\x33\x2c\xf9\x76\x9a\x16\xfa\x56\xcd\x0b\x25\xc2\x7d\xe8\x3b\x53\x54\x2c\x5e\xee\xc9\x4f\x77\x66\x37\x7e\x4f\xac\x5e\x88\x3c\x2e\x7a\xd9\x2e\x81\x1b\xec\xf2\x15\xa3\xb8\xda\xac\x7e\xf5\x88\xef\xb7\x57\x56\x9d\xeb\x4f\xc6\x8b\x65\xda\x1f\xd8\x9a\x3f\xf4\x9d\xe3\xd7\xf7\xbe\x9b\x71\xa1\x06\xcb\x2a\xed\xaa\x04\x3a\x54\x78\x5f\xc4\xbe\x33\xa7\xe1\x87\x92\x5a\x5d\x96\x0f\xfd\xa5\x4f\xf6\x6a\xa7\xc1\x63\xcd\xd8\x86\x53\x03\x96\x53\xae\xba\xdc\x82\x3b\x56\x0b\x0e\x79\xe5\x8f\x32\x4d\x96\xac\xa5\xa1\xaf\xfc\xfe\xb0\x27\x86\x23\xd8\x44\x7d\x73\x08\xab\xd9\x37\x87\x33\xe6\xe5\x88\xff\x67\x5d\x0c\x0b\xb4\x39\x7a\x89\x58\xb5\xea\x5f\x0a\x19\x9f\xdf\x65\x44\x1d\xc8\x23\xce\xde\xfc\xce\xd0\x4f\x84\xb5\x82\x58\x4d\xb7\x5d\xa7\xbf\xeb\x1a\xdc\x39\x7f\x75\x81\xd6\xa5\xdc\x9c\xd1\x37\x18\x57\x8b\xa3\x6b\x32\xb2\xa0\xd0\xfb\xbf\x04\x61\x26\x13\x43\x97\xe5\xe6\x31\xd0\x80\xe7\x1e\x86\x12\x1b\x0a\x7f\xfc\xeb\xda\x1b\x30\x19\x74\x59\x6d\xad\x8b\x65\x81\xb6\xff\x75\xd9\x97\x42\xd9\x4e\x80\xe5\x72\x23\x7a\xd2\x4c\x27\x6b\x37\xca\xe2\x1a\xa4\x86\xfc\xf1\x17\x56\x5d\x9c\x34\x7f\x1d\xd0\xf8\x91\x2f\x6c\x99\xe7\xfc\xee\xa3\x3c\xdd\x48\xe7\x79\x17\xcb\x30\x53\xc6\x3d\x6a\x1a\x87\x4d\x14\xb4\x1c\x34\x8d\x56\x83\xf2\xf9\xfc\x54\x4b\x87\xbc\xf9\x7c\x76\x40\x30\x36\x2c\x90\xcd\xb0\xdd\x6f\x33\x21\x9f\x66\xdb\xda\xbd\x43\x37\x52\xf1\x98\x32\x29\x71\xda\xd6\xb3\xe6\xf2\x02\xf0\x8a\x35\x1e\x9e\x40\x2d\xa7\x4d\x8c\x14\x29\xab\x0b\x08\x15\xc4\x9c\x45\x46\x48\xcc\xfb\x47\x23\x82\xaa\x65\x1d\x5e\x4e\x01\x53\x36\xcc\x9b\xfc\xa6\x61\xba\x9e\xdb\xd1\x8a\x96\x11\xf3\x6a\x88\xa1\x3e\xb3\x1a\x3f\x6c\x52\xb6\x1e\x4e\x9b\x45\xcb\xbd\x9b\x2b\xa3\xbd\x4f\xec\x1f\x57\x86\x47\xaf\xf7\xe9\xcf\x01\x2f\x73\x33\xfe\x02\x68\xc7\x5f\xca\xac\xb6\x4a\x69\xf4\xbc\x70\xcb\x2b\xe5\xd5\x8f\x81\x0b\xc7\x74\xea\xa2\x56\xaa\xa1\x8d\x50\x9f\xbc\x13\x1a\x1b\x93\x5e\x20\xc2\x4e\x4f\x04\x1b\x8c\x29\xad\xc3\x5c\xe8\x16\x27\xea\xf7\x23\x53\x06\xca\x31\xc3\xfe\xb0\xcb\xc7\xee\xda\x8d\xe8\x0e\x12\x3e\x16\x6b\x43\xf1\x34\xe9\x0c\x45\xb0\x91\x05\xd1\x93\x52\x83\xff\x31\x9c\xea\x7f\x2b\xff\x5d\xfb\x6f\xd9\xdd\x24\xc6\x7f\x83\x32\xa9\x1b\xff\x35\xf1\x81\xd4\x0d\xe7\x7f\x46\x61\xd0\x99\xb8\x64\x2b\x2a\xba\xc5\x0c\xb4\x23\x5f\x3a\x92\xb4\x0b\x63\x07\x9a\x47\x58\x3b\x10\x4a\x73\xf9\x37\xd8\x4f\x7e\x83\xfd\xf7\xfe\x78\x4d\xf4\xfa\x93\xa8\xbd\x96\x76\x0a\x70\xd0\xa9\x0f\xdf\xaa\xcb\x26\xba\x3d\x17\x4d\xa7\x27\x05\xfe\xd2\x5f\x5e\xda\x8b\x0b\x22\x43\xb5\x5f\x34\xd9\xdb\xc8\x2a\xce\x96\x74\xbd\x84\x32\x1e\xa2\xcf\xd8\xe5\x7c\xce\x9d\x53\xf7\x1b\xf3\xeb\xdc\xe2\xac\x52\xdb\x91\xfa\x9c\x37\x82\x56\x49\x9d\x97\x8f\x3b\xc6\x48\x50\xbf\x02\x99\x88\x55\x78\x2b\xf3\x05\x0d\xad\xf7\xf3\x91\xbc\x05\x2a\x50\x38\xb1\x43\x6e\x08\x32\x9f\x0b\xac\xc8\x80\xf4\x29\x86\x39\x95\x57\xdf\xa1\x1d\xb2\xea\x37\x5e\xbf\x11\x56\x75\x47\x29\x92\x5e\x0b\x52\xbf\xce\xbd\x8f\x04\xa9\x8f\x84\x75\x69\x57\x77\x30\x3e\x42\xc0\xc2\x72\x80\x7d\xac\x1a\x11\x48\xf4\xf5\x68\x04\x76\xc0\xb0\xd6\xba\x54\xed\xe5\x2a\xa4\x8d\x95\xbe\x4a\x0c\x6c\xce\xfc\x0a\x94\xad\x84\xc0\xcb\xa6\xf5\xc9\x86\x63\x2d\xaa\xf1\x1c\x85\xb7\x69\x86\x9f\x98\xe1\xa7\xb0\x46\x82\x42\xb6\xe3\x0e\x5a\xa2\x96\x83\x5c\xc0\x46\x1a\xac\xe8\x17\xad\xfc\x98\x8e\xa0\x19\x1a\x31\x1c\x21\xb5\x2a\x51\x79\xaa\x2a\xcf\x62\x61\x5f\x34\xcd\x0e\xbb\x68\x9a\x01\x3c\x4d\xe4\x53\xba\x9e\xbe\xe7\xd7\x93\xed\x33\xaf\xe3\x4c\x7d\xd7\xf9\xee\xbb\xb6\xcf\x76\x3b\xd8\x2f\xc6\xa8\x6b\xf8\x04\x43\x37\xa0\xc3\x84\x75\xf6\x3c\xaa\xdf\x45\xd6\x73\xea\xb2\xfa\xbc\x69\xdc\x25\x9c\xfa\x74\xc9\x7d\xc3\x54\x1f\x6c\x9d\x50\x19\xea\x7b\xce\xa9\xbb\x8e\x01\xdf\xb3\x39\xec\xf7\x93\xfe\x70\xd4\xf2\x79\x22\xd6\x78\x2f\x58\x7b\xe6\xc9\x44\xa8\xf7\x7c\x40\x2b\x1d\xb5\x29\x11\xbd\x08\x3d\xc1\xa7\x91\x9a\x50\x79\xf8\x23\x90\x08\x42\x7b\xff\x12\x53\xee\x8f\x93\x19\xc6\x83\x52\xc2\xa5\xb5\x97\xb6\xe8\xad\xf5\xfa\xb2\x5e\x59\xa6\x33\x5a\x1b\x0c\xfb\xcf\x9d\x00\x57\x3e\x6e\x6d\x77\xa9\xdb\x97\xe4\x99\xdd\x7c\x10\x5d\x75\xbf\x6b\x70\x62\xf6\x83\x85\x14\x4f\xcc\x8e\x38\x73\xc2\x3d\x7a\xb3\xeb\xd2\x57\x78\x16\x7b\x54\xbe\xe6\xb6\xc5\xcb\x66\xda\x47\xeb\xdc\xbc\x4b\x0d\x86\xb8\x99\x3c\x3b\x55\x64\x5e\xbc\x6f\x0c\xbe\x38\xf8\x83\x91\x45\x0a\x99\xf0\x07\x93\x31\xf3\x8e\xcc\x5c\x75\x97\x21\xc9\x4d\x33\x7e\x34\xe0\x3b\x55\xe1\x63\x77\xb2\x19\x8f\xf9\x7c\x57\xe9\x7f\x54\xfc\xca\x36\xf5\xe1\x4f\xba\x13\xff\xec\x1a\x2a\x0f\xc5\xbf\x81\x4b\x0d\xaf\x82\xb5\x05\x2e\xd9\x42\xb8\x8e\xef\xa6\x29\x24\x47\x0d\xed\xea\xb9\xe0\x95\x4a\x55\x39\x5e\xf5\x9a\x8c\x5d\x5b\x2a\x19\x1e\x73\x66\x47\x78\x85\xe2\x39\x55\xd7\x25\x96\x07\x6b\xf4\x0b\xc3\xa9\x52\x7f\x3d\xe2\xd6\xec\x88\x4b\x3e\x6e\x3e\xdf\xfe\xc6\xb3\x88\xb7\x6f\x72\xba\xa0\x83\x78\x2a\xbe\x58\xce\x65\xc7\xf0\x88\xbb\xb0\xb5\x6b\x9b\x2a\xc6\x7d\x71\xb8\xec\x21\x2a\x58\x50\xf1\x95\xb5\x99\x58\x82\x01\x0d\xca\x83\xe8\x84\xc6\xb6\x44\x81\x48\x81\x15\x4a\xf7\xc4\x96\x21\xe3\xbb\xe8\x28\xfc\x9e\x8e\x4e\x87\xd1\xf2\xfd\x72\xb0\x29\xf4\x12\xd6\x90\x39\xc0\xf5\x16\x79\xd1\x70\x91\xa8\x44\xf4\x03\xc6\xcd\x96\x71\x34\x92\x0e\x2a\x82\x52\xa9\x8a\x91\xef\xc8\x1b\xea\x82\x61\x47\x05\xcc\x51\x96\x07\xd0\x4d\xe8\xf9\x44\xf2\xbf\x01\x86\x5a\xc1\x5b\x54\xe6\x39\x33\x97\x50\x9d\x1e\xc8\x96\xe3\x47\xf5\xcc\x3c\x53\xf4\x02\x92\x0b\x2f\x83\xb7\xaf\x7a\xfd\x34\x00\x03\x68\xb1\xcf\x6a\xb6\x2f\xa3\xef\xf9\xe5\x72\x8e\xdb\x0e\x1c\x7f\x29\x3b\x20\xec\xf8\xee\x4e\xe0\xf8\x30\x3f\x8b\x4b\x71\x77\xda\x19\x99\xb2\x2b\xd2\x25\xcd\xd7\xba\xfd\x5e\x7f\xdc\xef\x75\x7c\x9e\x24\xb3\xb5\x4e\xcf\x1f\x0a\x8e\xc1\xfe\x47\x62\xd8\x11\x70\x64\x2d\x7c\x16\x2c\x72\xae\x32\xbe\xc3\x2e\x78\x38\xe2\xd0\xf3\xf8\x7c\xa0\xaa\x96\x4c\x5b\xa0\x83\xe8\x8a\x52\x29\xf8\x26\x56\x21\xd1\xed\xf4\x7e\x00\x1e\x6b\xc6\x46\x39\x28\x6f\x90\x0c\x9d\xf1\x5a\xb7\x8f\x3b\x45\x9a\x95\x4f\xd3\xac\x02\xed\x75\x8c\x80\xdd\x0b\xae\x22\x93\x92\x52\xc9\xf0\x61\x34\x66\x2e\x0d\xa0\x3b\x5d\xb2\x90\x03\x78\x7c\x48\x6c\xf9\xf4\x3a\x42\x35\x80\x4f\x3e\xdb\x45\x15\x88\xa0\x70\x93\x0c\xdb\xa3\xef\x74\x67\x2e\xf5\x4d\xf1\x25\xbf\x71\x5e\x15\x55\x3d\x9d\x2b\xc8\xc3\x7e\x0a\x6e\xb4\x80\x25\xc5\xc8\x3b\xce\x93\x12\x6e\x1f\x09\x19\x05\xdf\xa7\x98\xd1\x79\xf5\x94\x7f\x9c\x80\x0a\xc6\x9d\xd1\xae\x8b\x21\x52\x1a\x82\x23\x56\x87\x82\x6b\xa7\xdb\xe6\xe7\x5d\x1a\x33\xee\xcc\x5e\x5d\x2a\x0d\x84\xae\x62\xc3\x77\xce\xd0\xf9\xe2\xe7\x00\xef\xdb\x85\x39\x2b\x1b\x51\x39\x71\x76\xdd\xad\x6d\xb2\x79\xfc\x68\x08\x73\x56\x09\xcd\x19\x8c\xc1\x2e\xbc\x4d\xe5\xf7\x61\xf6\x7d\x5a\x09\xcd\x29\xa9\xc8\x34\x1a\x38\x0d\xb7\x1c\xd3\xc0\xf1\x03\xb7\x12\x63\x2a\xf4\xcf\xee\xa3\xd1\xab\x48\xb0\x34\x30\xc7\xfd\x01\xe6\xb9\xf0\x65\x9e\x5d\xcc\x83\x0e\x1e\x62\x19\x5f\x68\x00\x9d\x35\x05\xcc\xce\x02\xb7\x5c\xd3\xda\xe1\x32\xe9\x73\x80\x5a\x57\x0f\x2a\x21\x30\xa7\xf0\x0a\xcf\xa8\xa4\x16\x98\xb3\xf2\xed\x2a\x5b\xe9\xeb\x54\x54\xa6\xb5\x30\xf7\x38\x06\x28\xe7\x66\x7f\x32\x06\x56\x89\x86\x88\xc5\xe0\x9c\x4a\xa5\xb2\xa3\xc4\x10\x66\xc8\x11\x61\xf3\x2b\x85\x67\x68\x58\xfa\x7c\xe1\x67\xcf\x0d\x78\x24\x34\x66\xc2\xfc\xfc\x68\x87\xc8\x2a\x47\x90\x5a\xa3\x11\x64\x24\x76\x68\x4e\xc3\x42\x52\xa5\x46\xf1\xdf\xbf\xab\x74\xfb\x5f\x55\xd4\x0f\x0d\xcd\x80\x63\x1e\x1a\x61\xad\xb5\xa5\x62\x32\x11\x8b\x41\x11\x59\x28\x5d\x13\x71\xa9\x04\x67\x81\x39\x63\x4c\xe3\x4d\xb2\x8b\x87\xaa\xfd\xe5\x5b\x62\x97\xcb\x09\xc1\x5a\x62\x27\x71\xcd\x29\xe0\x8f\x4f\x33\x40\x5f\xd7\x0f\xa3\xa7\x6a\x4b\x11\xc8\xa5\x29\x0c\xaa\xf4\x3f\x05\xac\xfd\xc0\xd5\x0d\x5b\x2e\x95\x6b\xee\x7f\xd0\x86\xea\x97\x88\x63\x7f\x01\xe2\x7f\x13\x69\xe9\x0b\xd8\x16\xcc\x81\x51\xf3\x7a\x86\x64\x83\x6f\xdb\xf4\x93\x14\xb1\x58\x9d\x3d\x3a\xe1\x56\x6d\x41\x68\x21\x87\x4c\xae\xd2\x7d\x61\x99\x7f\xfe\xea\xe3\x1f\x0b\xe2\xaa\x3b\x33\x81\xdb\x2a\xd0\x7e\x91\x5d\xa9\x44\x24\x66\x9e\x39\xe2\x46\x48\x85\x13\xb9\xc0\x26\x79\xe6\x61\xd7\x88\x69\x44\x23\x19\x8f\xf0\xf6\x04\x4b\xca\xe8\x7f\xdc\x79\xda\x75\x75\x04\x40\xa5\xfb\x03\xcb\x12\x52\x43\x97\x46\x2c\x36\x1b\x6d\x0c\x9a\x8f\x93\x13\x57\x3e\xec\x40\x34\x72\x8e\x5d\xa5\x23\xd4\x6a\x58\x11\x8b\x9c\xcf\xae\x1d\xb3\x18\xff\x38\x83\x5d\xb7\x54\xf2\xcc\xb6\x67\xe0\xb3\x9c\x90\x54\x3f\xc3\x98\xa5\x2f\x72\x69\xae\xc8\x25\xd7\x63\xbe\x48\x84\x2f\xde\x70\x32\x6a\x53\x21\x4f\x09\x18\x91\x64\x27\x76\x9e\x67\xd8\x8a\x44\xab\x71\xf7\x58\x84\x69\x89\x4b\x07\x2c\x56\x8f\xb6\x6a\x60\x2f\xc3\xfd\x76\x64\x79\x66\x2b\x30\x7a\xce\x67\x57\xf2\xfd\xe6\xf4\x73\x7d\xa0\xf0\xb2\x06\x0a\xa7\x81\x46\xa1\x46\x77\x4f\xe1\x3f\xe6\x9f\xba\x54\x60\x81\x82\x3e\xd2\xcb\xa9\x85\x2d\x7f\x57\xf6\x93\x06\x5b\xc9\x7f\xc2\x66\xa6\x79\x00\x6e\xda\xc2\xc5\x42\x4e\xc7\xc8\xec\x04\xa5\x92\x11\xb1\xd3\x2b\xc3\x69\x1f\x50\x78\x77\x61\x60\xbd\x3e\xda\xf2\x16\xaa\x17\xa7\x6a\x34\xa8\x1c\x0d\xb5\xbb\x0e\xce\x69\x82\x9b\x40\x8c\x32\x30\x73\x5a\xa5\xea\x69\x56\x25\x34\xc1\xc9\xac\xbe\xd4\xd2\x2f\x35\xa8\x64\xc4\x8d\x84\x46\x19\x52\x72\xf7\xa7\x79\x56\x21\xe7\xae\x30\x6f\x2a\x32\x65\x7c\x3e\xaf\x2a\x87\x85\xcc\x9b\xcf\xab\x8b\x13\x6e\x34\x97\xcd\xbd\x72\xc7\x52\x53\xa9\xd6\x4e\xa5\xd0\x7b\x56\x30\x80\x69\xe5\x98\x78\xf4\x99\x79\xf2\x4e\x76\x1b\xc8\x43\xa7\x8e\xbf\xd6\xdb\xd4\xaa\xd2\x99\x55\x5d\x50\xc1\xc6\xe7\x86\x67\x4e\xcb\x81\x39\xa5\x40\x33\x51\x6e\x9e\xa1\x10\x16\xd3\x67\xe5\x00\x05\x4e\x1e\x77\x66\x48\x60\x9e\xfa\xb9\x5b\xbf\x99\x0b\xdb\x80\xe8\x05\xf3\xb9\x87\x2f\x48\xc1\x60\xbc\x59\x4b\x6d\xcb\x90\x4e\x31\x0f\xc5\x8f\x14\x4a\x11\xf4\xc2\xd0\x02\x7a\xfd\xb1\x93\xc2\x7b\xe8\x1a\x05\x46\x65\x5f\x13\x63\xda\x60\x43\xb2\x78\x95\xfc\x55\xfc\x81\xbe\x4f\x54\xa4\xfa\x7c\xbe\xee\x29\xfa\x51\x05\xcc\x0c\x98\x3f\x9f\xef\x1f\xa5\xa2\xd3\x9f\x8f\xef\xe2\xb4\xcb\x83\xd7\x03\x2a\x5b\x15\xf5\x3b\x06\xba\xe4\x98\xcf\xcd\xea\xd7\x6f\x2c\x40\xb5\xd2\x45\xae\xde\xc3\x42\xbd\x55\xc6\xb8\x39\x9d\xcf\xab\xd0\x03\x53\x4d\xbf\xca\x3e\x56\x1f\x4b\x25\xf9\xb1\x5e\xb5\x64\x42\x9d\x9b\x33\xcb\x33\x67\x64\xd3\xdf\xfa\x73\x61\xfb\xcc\xc7\x68\x6f\xdd\x4e\x4f\x79\x9a\xe5\xe6\x94\x28\x87\xb8\x00\x14\x86\xc4\xe0\xe6\x6c\x8b\x9b\xd3\xb2\x67\xce\xb6\x20\x71\x6b\x5b\x37\xab\xba\x03\x30\xdf\xa6\x96\x4f\x67\x96\xbf\xe9\x2d\x60\x8c\x2b\xf0\x52\x81\xb7\xdc\x6d\x46\x86\xb9\x9a\x17\x66\x12\xc9\xe3\xd5\x93\x4f\x8a\x0e\x0f\xb0\x3d\xa9\x1c\x04\xc6\x73\xff\xdc\xa8\x62\xc8\x50\xa6\x2c\xc2\xb7\x90\xd3\x3e\x38\x37\x54\xf8\x31\xf4\x4b\x57\xdb\x82\xbd\x35\x97\x00\x34\x2d\xc7\x27\x7f\xeb\xcf\x9c\x18\x2a\xa3\xbb\x6f\x0a\xca\x72\x3e\xf3\xeb\x87\x47\xdc\x3a\x3a\xca\x2b\x55\x60\x18\xf7\xaa\x1d\xc9\x28\xb1\xe5\xb2\xd6\x14\xa6\x89\x2d\xea\x46\xcc\x1a\xd8\xb0\x88\xd6\x60\x6b\x4f\xd2\xd7\x0a\xbc\x13\xcb\x88\x59\x50\x37\xa2\x72\x8d\xfc\x0f\x94\xb7\xa2\x72\x8d\x26\x90\x04\x6f\xe5\xa8\x92\xa6\xc3\x91\x98\x9e\x75\xf2\x21\xd1\x0f\xdc\x89\xdc\xec\x39\xc9\x3d\xc7\x2e\xa0\xe0\x1b\x87\xd0\x15\x91\x4b\xe1\x2b\xa1\xf8\x16\xc3\x5b\x04\xbb\x12\xa1\x18\x54\xde\xd1\x99\x62\x42\x0f\xd2\x47\x57\xc5\x21\x97\xb5\xd4\x65\x4e\x78\x94\x1d\x49\xb3\x47\x97\x58\xf8\x55\x3a\x4a\xd4\x32\x9f\x6c\x84\x1b\xef\xef\xd8\xbd\xb2\x8f\x3d\x29\xdd\x45\x18\xa2\x8c\xec\x13\xb6\x98\xd8\x02\x2f\x56\xaa\x3b\x40\xa0\x0b\xd9\xbb\x29\x53\x01\xd8\x88\x94\x67\x15\xb6\x28\x33\xdf\x5e\x05\x65\x91\xbf\x90\xc9\x06\xf6\x36\x25\xe5\x7c\x58\x87\x7a\x49\xde\x17\x58\xf5\x6c\x89\xc3\xa2\xfb\xc6\x53\x2d\x51\x34\xb7\xa9\x4b\xbe\x0e\x96\x4d\x50\xaf\x5a\x9e\x13\xb8\xc8\xce\xee\xf0\x8a\xe7\x04\x95\x1a\xbc\xd5\x03\x2b\xa8\xd4\x72\x37\x08\x4b\x93\xdc\x0e\x70\x3a\xdb\x0a\x09\x64\xb1\x25\x93\xcb\x77\x18\x32\x96\xba\x89\x3e\x53\x28\x07\x84\x3a\xd2\x31\x8f\x13\xb8\x92\xfd\x16\x4c\xa2\x52\xf1\x69\x28\x4b\x01\x6f\x0a\x3b\x87\x80\x4c\x34\x66\x61\x25\x42\x0d\xd9\xb1\x6b\x18\xbc\x12\x92\xad\x18\x29\x8b\x4a\x58\x49\x36\x63\x5b\xc0\xe6\xfc\xf8\x68\x78\x40\x26\xbc\x17\x54\x38\xdc\x09\xdc\x4a\xe4\x2e\xa0\x0c\x62\x21\x68\xea\xaf\xc3\x91\x55\x97\x93\x4d\xbf\xcc\x69\x58\x4e\x36\xe3\xb2\x70\xb8\x0b\x1c\x67\xd6\xee\x1f\x69\x77\x67\xd6\x5c\x8e\xab\x38\x62\x8e\xec\x70\xe0\x08\xe0\x45\xcf\xe1\xa4\x12\xb9\x93\x2a\x93\xe8\x17\x0c\xf5\xd4\x24\x00\xbe\xab\x8e\xbf\x16\x87\x3d\x2a\x37\xc4\xa7\xf9\xe9\xe6\x2b\xe9\x94\xcf\xaa\xc4\x46\xc5\x23\x25\x18\x84\x89\xe6\x33\xaf\xe2\xdb\x59\xdc\xf7\x2a\x0d\x59\x75\x87\xf9\xf5\xaa\x14\x14\x44\xac\x4a\x63\x56\xa5\xd2\xad\x1b\xed\xc9\x5b\xef\x74\x4a\x4a\x8d\x79\x98\x8f\x80\x01\x1d\x31\xc4\x14\xa6\x67\x65\x40\x23\x16\x95\x07\x30\xb0\xd1\x0e\xf3\x89\xdc\x31\x44\xb9\x46\x27\x4c\xee\xa9\x7e\x25\xa2\x23\xa0\xfa\xa3\xf2\x84\xf6\xd8\xa0\x3c\xc1\xcc\xdf\xbc\x74\x6e\x7f\x63\x41\xfd\xed\xbe\x6f\x09\x9a\xf0\xd1\xd8\x4a\x68\xef\xdc\xf2\x2a\x46\x54\x19\x90\x85\xa5\x74\x53\x42\x79\xb6\x41\xb6\x50\x66\xeb\x41\x36\xbf\x12\x2f\x6c\x5d\x93\x87\x35\xd9\x51\x99\x4d\xec\x04\x2b\x12\xe5\xb2\x5a\x1e\xef\xe1\x47\xb9\xad\xf9\x2c\x9b\xb5\x1c\xcf\x71\xea\xcf\xe7\xaf\x8f\xc4\xee\x3e\x1a\x3c\x6f\xa0\xe7\xaf\x8e\x96\x0d\x33\x24\xa0\x21\x33\x70\x22\xf9\x64\x53\xa0\x20\x75\x87\x79\x04\xf8\xd5\xc0\xa5\x5e\x85\x85\xd2\x0a\xc6\x2f\x33\x6f\x4b\xd8\x18\xaa\x17\x48\xa4\x85\xc6\x70\x32\xe2\x96\x8f\xb8\xe5\x05\x23\x77\xef\xae\x8b\xf3\xc3\x8e\x32\x20\x51\xf0\x66\xe3\x31\x61\xf6\xce\x6d\x9f\x3d\xc2\x79\x5b\xa5\xc2\xbc\xef\xc3\xc1\x71\xdb\x31\xfc\xa5\x3b\xcb\xf4\x78\xef\xf2\x29\xa4\x98\x77\x28\x37\x5c\x50\x65\x86\x17\x42\x5f\xf8\xf4\xe4\x88\x13\xbb\xba\x13\x4a\x91\x4b\xe8\x84\x4a\x6a\x22\x4c\xe8\xcf\xac\x7b\xe4\x21\x11\xd8\x11\xf4\x8c\x60\x67\xc8\xe3\xaf\x14\x0c\x72\xa8\x29\x72\x81\xfa\x22\x1a\xe1\x62\x90\x56\x14\x1e\xc7\xe5\x32\x09\x9d\xd8\x2d\xab\x01\x16\xe6\x64\xc4\x29\x6c\xec\x69\x79\x7d\x66\x7a\x44\x76\xe6\xfb\x4d\xf9\x67\x41\x78\xa0\xba\xf3\xb9\xdf\x09\xd6\xaa\xea\x0f\xa1\x01\x7b\x5b\xd8\x0f\x45\xf2\xc4\xcb\xe2\xa6\xc6\x62\xa6\x4e\xa6\x00\x6b\x35\xe0\x0f\x73\x5c\x62\x7b\x18\xb5\xa1\x54\x82\x04\x94\x76\x39\x9e\x9b\x8b\xed\x19\xe4\x06\xf2\x3c\xbd\x81\x4d\xb5\xe3\x60\x84\xf4\x05\x03\xad\x01\x1a\xe9\x96\xe1\x4b\x21\x9a\x0e\x5f\x1d\xea\xc5\xe4\x08\x38\xd4\x4e\x5d\x42\xa3\x2c\x09\x83\x32\x63\x62\x28\x47\x1d\x2f\x82\x3b\x8f\x46\x40\xc3\xf4\x7c\xc8\x6d\x34\xf7\x4d\x25\x7f\x06\x82\x48\x4f\x9e\x2a\x06\x81\x93\xb2\xfc\x74\x30\x60\x96\xd6\xfe\xfc\xe6\xd9\xe5\xb2\x94\xc9\x6a\x52\x10\x35\xa2\x38\x21\x3b\xb5\xc3\xca\xbf\x36\x53\x20\x9e\xcd\x37\x59\xad\xaa\xeb\xac\xfd\x99\x55\xfa\x90\x23\x95\x05\x6e\x18\xd5\x6f\x59\xed\x9e\xd3\xf6\x5d\xa3\x4a\x3d\xe7\x2e\x70\x8d\x5b\x41\xf2\x38\xbc\xfb\x58\xae\x11\x0a\x4b\xd1\xdf\xe1\x28\x89\xf3\xca\xec\x45\x64\x17\x64\x69\x9d\x9f\x9b\x85\x89\x8e\xb6\xcf\x75\x87\x97\x6f\x45\xd9\x73\xad\x0f\x83\xf6\xe3\xf7\x3c\xd1\xc9\x5b\x4b\x17\x3d\xd5\x6f\xc0\x3a\x7c\xf3\xe5\xae\xc4\x1d\x0f\xce\xc2\xdc\x60\x5f\x64\x6b\x34\x6f\xec\xe4\xc0\x51\xc5\x5b\xc0\xaa\x54\x6a\x70\x08\xc4\xa5\x12\xde\x11\xbe\xf5\x6f\xad\x98\xc6\x5d\x2b\x36\xe3\x6e\xb9\x46\x9f\xce\xe1\x58\xa5\x83\x5b\xb9\x3f\x0f\xcf\xe5\xdf\x27\xf9\xbe\x20\xb6\xa1\xe1\x50\x51\xa9\x11\xf2\x31\x18\x2c\x97\x83\x23\x2a\xb5\x3c\x18\x3f\x87\x8e\x04\x14\xc2\x26\x56\xa9\xb9\xd4\x73\x44\xa5\xe6\xe6\x41\xfb\x00\xda\x37\xe3\x6e\x0e\x3f\x80\x97\x81\x05\x5a\x00\x77\xcd\x68\xf5\x56\xc3\xcd\xb8\x5b\xf1\xcc\xb8\x9b\xad\x91\xea\x4e\xe4\x9c\xba\xf5\xc8\xa9\xba\x16\x54\x82\x88\xc6\x5d\xab\xba\x0a\xfb\x42\x2f\xe4\xfa\xfb\xfb\x32\x6d\xed\xcf\xe7\xab\x11\x60\xcc\x03\x9a\xdf\x71\x97\x8e\x43\x2e\x23\x26\x33\x15\x32\x19\x16\x1a\x83\x9f\xf9\x3c\x97\x55\x9e\x93\x28\xe0\x8e\x76\x58\x8c\x3b\x1d\x64\x82\xed\x20\x1b\x72\x41\x23\x1a\x90\x05\x9a\x74\x78\xf0\x13\x33\xdf\x09\x5d\x27\x76\x95\x14\x19\x46\xc7\x8e\x6d\xa2\xa8\x5d\xf3\xe9\xbc\x54\x02\x7a\xd5\x7c\x3a\x77\x59\x6c\x0e\x6e\x89\x56\x31\x36\x87\xf0\xc9\x73\xe0\x01\x3e\x3d\xdd\xc2\x49\x1a\x9b\x7d\x2d\xbe\x7b\x83\x11\xa1\x97\xff\xb6\x38\xbd\xfa\x77\xf1\xe4\xb8\xcc\xfa\x24\x4d\x0b\x72\xbc\x93\x3c\x59\xfd\x6c\xfd\xa3\x1f\x64\xa6\x48\x2d\x79\xbb\x95\xdb\x1f\xb4\x21\x6c\x28\x19\xb4\x9c\xac\x3c\xcd\x51\xae\xd9\x9e\xfc\x8e\x71\x6e\x72\xa7\x12\x63\x5e\xdd\xd7\x57\x85\x95\x80\xec\xb0\x8c\xa7\xac\xfb\x96\x5f\xae\x2d\x52\x2e\x12\xb9\x1f\x1c\x0f\xf9\xe4\x65\xb7\x1b\xf2\x84\xcb\x06\x0e\xd5\x67\xf1\xa8\xa6\x11\x9c\xcd\x14\x78\x12\x7f\x47\x96\x8d\xe4\x4d\x04\x91\xef\xa5\x92\x11\x33\x98\xdb\x3e\x9a\x58\x29\x22\xd4\x48\x10\xdf\x08\xd2\x74\x3e\xfd\x2d\x66\x2c\xa9\x1b\xa8\x7e\x2b\xef\x2d\xac\x98\xfa\x87\x96\x4f\x83\x43\x2b\x5a\x10\xea\x97\xcb\x14\x26\x80\x95\x56\xa0\xfc\x52\xcd\xe7\x91\xc4\x7a\x3e\x8f\x77\x12\xf2\x11\x0c\xb9\x04\x01\x0c\xb1\x52\x7c\x24\x88\x04\xef\x90\x65\x33\x92\x9d\x98\x00\xd9\x9f\x83\x91\x00\x0c\x79\x45\x22\x51\x01\x34\xec\x4f\x52\xc8\x24\x97\x8c\xa4\xe0\x1e\x0c\x91\xad\x43\x9f\xbc\xa9\x21\x37\xfd\xc3\x3a\xfc\xb0\xc0\xf0\x9d\x7e\xe0\x52\x4e\x7b\xc4\xea\xe1\x07\x5b\xe7\x09\x20\x4f\x90\xe5\xf1\xe8\x80\x58\x03\xfc\xb0\xc8\xf9\x3b\x4b\xa7\x96\xd7\x5a\xe1\x67\x93\x13\x18\xd6\xcf\x1d\xb4\x63\xd2\xe2\x01\x7d\x81\xb6\x5e\xcd\x4a\x5f\xe5\x69\xd9\x6c\x80\x6b\xa8\x1e\x5d\x3b\xfc\xf2\x2d\x44\x71\xa0\xda\x47\xaf\xb3\xb5\x06\xeb\x21\x7b\xad\x02\x03\x7a\xa0\x18\xd0\x00\xbe\xc9\x97\x58\xd1\x4a\x49\xa9\x14\x4b\x4a\xc1\xe6\x2c\xb2\xc5\x26\x33\xff\xf3\x9f\xc5\x7b\x1d\xa4\xeb\xf7\x9c\xdc\xdb\xc2\x6e\x15\x24\x18\xa8\x87\x92\x51\x2d\x21\x95\x82\x3f\x4f\x0b\xfd\xe4\x70\xe0\xb1\x95\xb8\x24\xc3\xc8\x37\x62\xda\x23\xb6\x90\x5a\xe8\xb9\xae\xcc\x96\xae\xdf\xca\xad\xd3\xec\x0a\xbe\x65\xb4\xe0\xc8\x7a\xec\x00\x4b\xab\xef\x25\x6b\x6a\x53\xa9\xaa\x89\x8f\x07\x62\x4e\xa9\x1b\x26\xfc\x5b\x20\xe9\x82\xa0\x5c\xa3\x3e\x10\x83\x41\xcb\x08\xd4\x95\xa7\xdc\x69\xb2\x55\x0c\x2c\x9b\xbf\xe0\x69\x81\x8c\x98\x91\x03\x9c\x75\x92\x4a\x78\xcb\x2e\x52\x0b\xd4\x5e\x6e\xd7\x4d\xf0\x9b\x39\x45\xd7\x37\x4b\xb7\xac\x8e\xef\x9a\x33\xdd\x18\xc3\x87\x0a\x53\x31\x48\xa0\xae\x1b\xf3\xab\x1f\x09\xea\x4a\xcd\xb5\x03\xa4\xac\x35\x76\x7b\xe7\xa8\xa3\xb3\x7b\x6e\xf8\xe6\x94\xfa\xe6\x8c\x06\xe6\x94\x06\xe6\x8c\x50\xc3\xab\xf8\xe6\x94\x6c\x19\x81\x39\xc5\x27\x62\xce\xf2\xf2\x41\xf4\x4b\xa5\xb6\xd3\x34\x5e\xf1\x2a\xe5\x2c\xbe\xa0\x9d\xde\xb3\x18\x8e\x56\x6a\x8c\xf1\x45\x8e\xa3\x68\xe5\xcd\x5a\x6f\x64\xac\xb2\x5f\x56\x21\x3b\xe0\x16\x23\x1a\xad\xa6\x4a\x9c\xc1\x93\xbb\x58\xda\x55\x59\x50\xe7\x56\xe0\xf0\xa1\x5b\x86\x7d\x15\xb2\x90\xcd\xc0\x3c\x3a\x5c\x8d\xe9\xdf\xa8\x84\x0f\x57\x57\x02\x03\x62\x1e\x1d\xd6\xb1\x0e\x0b\x7f\x65\x95\x7c\xe8\x92\x2d\xac\x32\x7f\xf8\xc8\x26\xbf\x65\x34\x9c\xe3\x02\xc5\x46\x65\xd8\x56\xcd\x17\xeb\x9b\xe2\xd4\x3f\x86\x00\xae\x3e\x34\xa3\x1e\xc7\x18\x57\x33\x34\x9c\x45\xe9\x65\xc2\xa2\x2d\x23\xac\xc4\xda\xfb\x1f\x4e\x8f\x75\x16\xd7\x8d\x80\xbd\x8d\xfa\x93\xa1\x0f\x7b\xeb\x98\x0f\x23\x31\xb6\xe2\xb2\x4f\x8f\x0e\xad\x64\x41\xa5\xa9\x30\x21\x96\x11\x30\x4f\xb1\xf2\x2e\x05\x74\x59\xa2\x6c\x65\x75\xe9\x30\x57\xba\x1c\x41\x79\xa0\x65\xfc\x32\x8b\x2a\xb2\xe2\x80\x85\x8b\xf7\x34\xe6\x6d\x76\xcc\x7a\x72\x11\x68\x80\x9e\x06\xe8\x01\xb0\xea\x62\x05\x77\x11\x32\xdf\xe0\x40\xcb\xfb\x39\xad\xb4\x70\x27\xaa\x57\x6a\x56\xf8\x2d\xaa\xd7\x2c\xe0\x90\xaa\x68\x4e\xe1\xb1\x8a\x57\xd9\xce\xe8\xa6\x6f\x5e\x46\x7d\xe6\x04\x11\x7f\x7b\x36\xb7\xcd\xa4\x1f\x19\x9c\x6c\xb5\x9d\xdb\x57\xf7\x97\x53\x5b\x1a\x95\xd4\xaa\xa8\x82\x98\x67\x4e\xf3\x12\x8b\x55\xb5\xe5\x04\x4c\xdf\x78\x5d\xd6\xe8\x6d\xe9\x3a\x2d\x6f\xa7\xc2\xeb\x15\x99\x5c\xc9\xa5\x57\x57\x60\x93\x81\xaa\xee\x78\xf5\x14\x23\x8f\x6c\x72\x0b\xfa\xa2\x92\x26\x55\x64\xda\x62\x81\x5a\x27\x3f\x8f\x38\x7b\xfb\x3e\xe3\xd6\xd3\x09\xed\xce\xb8\x75\xdf\xa0\x7b\x33\x6e\x9d\x1d\xe7\x43\x1c\x2d\xd1\xf7\x40\x16\xf7\x0d\x4e\x7d\xfa\xf3\x88\x13\xa0\x50\x4e\xe4\xa0\xd5\xef\x1b\xd6\xd3\x49\x8e\x93\xca\x06\x7f\xc9\x4a\xfd\xe9\xc4\xd2\x6b\xea\xd1\xf0\x49\x1d\x77\x19\x0b\xb6\x05\x5f\x85\xdb\xbb\x6f\xe8\x1c\x38\x66\x32\xf1\xec\x58\x27\xde\xa1\x23\x12\x3b\x10\x21\x9f\x24\x63\x9d\x8a\x60\xf2\x6a\xa0\x0f\x72\x08\xbc\x8e\x33\x7d\x72\x8d\x82\x2d\xc1\xb0\xff\xb2\xc6\x6d\xe0\xe6\xb1\x23\xc2\x56\x4e\xcd\xe6\x33\x4e\x13\x69\x1c\xe0\x75\xcc\x0b\x31\x1a\xf1\x48\xec\xb7\x79\xaf\x27\x12\xbb\xa0\x66\xa7\xf5\xec\x78\xa9\x94\x4b\x5f\x4f\xd3\x3d\x5e\x2a\x79\xdc\x1c\xf4\x47\x63\x05\x06\xde\x9d\xdb\x27\x17\x3d\x70\xe6\x50\x92\xd5\x09\x8e\x9e\x9a\x86\x0d\x62\x37\x39\xba\xd8\xa0\xd7\xe8\x79\x75\xe8\xb3\x4b\x5b\x70\x27\xf2\x5d\x15\xc8\x42\x6e\x1d\xdc\x39\x9d\xb9\x94\x33\xcf\x39\x0f\x5c\x9b\x3b\x17\x4f\x32\x0a\x8d\x98\xb9\xc6\x25\xc6\xf3\x48\xc3\xd1\xf8\xec\x78\xc8\xcb\x6d\xe7\x18\x25\xb7\xb0\xe4\xa7\xbe\xeb\x1c\x3d\xb9\x8c\xb5\x27\xbc\x7e\x25\xac\x34\xa5\x7c\x10\xf1\x32\xbe\x99\xed\xfe\x68\x4c\x39\xfb\x69\xe4\xa7\x3e\x3a\x35\xb9\x98\xba\xb8\xd3\x70\xe7\xb3\x0b\xb4\xf2\x58\xfa\x6b\x19\x8e\x6b\x66\xbf\xd7\x95\xad\x35\xc8\x42\x39\xa5\xf0\xa0\xd1\xc6\x59\x9b\x53\x8e\x7e\x81\xb2\xdc\xa9\x75\x09\xbc\x6d\xb3\xb7\x5c\x67\x59\xb9\x0e\xf2\xf2\xbd\x88\x17\x5a\x8b\xc5\x62\x59\xf1\x31\xeb\xf9\x82\xfe\x28\xa7\x3e\x7b\x5b\xd0\x80\xf9\xb6\xb7\x8c\x22\xfb\x94\xab\xc4\x67\xbe\xf3\xa4\xf4\x9a\x38\xd0\x73\x11\xb7\xf1\x57\xd2\x8c\x30\xbf\xd2\x9d\x28\xd7\x1f\x07\xdc\x08\xe8\x5b\x10\x71\x8b\x2f\x90\x84\x40\x20\xb2\xaa\xed\x02\xde\x55\xa2\x65\x5a\x2b\xb1\x16\xbc\x54\x7a\x9c\x72\x20\x0f\xd5\x54\x98\xb5\x49\x7d\xf9\x98\xf2\x58\xf6\xd1\xbe\x1e\xe4\xa5\xd6\xe4\x0d\xdf\x65\xdc\x6a\xcf\x79\x14\x2e\xba\x6b\xf2\xd0\xf3\xaa\x6a\x82\x2d\x5b\xb3\x20\xb9\x09\xe5\x91\x45\x61\x73\x53\x6b\x86\xc3\x02\xc9\x3b\x56\x54\x64\x4d\xbb\x35\x9f\xf3\x06\x5e\xcb\xb4\xe6\x73\xa3\xdd\x32\x08\xed\xb4\xd8\x7a\x95\xd8\x8f\x2d\xbc\x06\x10\x2f\x6b\x5e\x43\x4a\x75\xe4\x12\x6b\xb7\x72\x7e\xfc\xa1\x28\x2a\xf9\x75\xcc\xab\x61\xbf\xdb\x19\xc1\xba\x48\x9f\xcd\xa1\x18\xf5\x93\x67\x91\x5b\x84\x4b\x5f\x0c\x62\xb7\x5b\xf9\xe5\xc3\x9d\x64\xd7\x35\xfc\x06\x6c\xc2\xa8\xeb\x57\xfc\xac\xc6\xb3\xc1\xed\x61\x07\x2a\x1d\x89\xf1\x49\xb7\x2b\x82\x0e\x1f\x0b\x52\x5f\x4a\x30\x38\xb1\x8c\x10\xda\x15\xb6\x18\x6e\x06\x84\x86\x2d\xf4\xef\x87\x2d\x81\x86\xd6\xe8\x63\x0b\x19\xe5\x94\x2c\xc5\x26\xc1\x99\x0e\x3d\x90\x8a\x86\x39\x7b\x6c\xd9\x2a\x6b\x4e\x6e\xe4\xc9\xf3\xdd\xd3\xe7\x3b\x10\x6e\x9e\x6b\x8f\x87\xb3\x37\xdf\x4c\x9e\xd1\x98\xc8\x77\x1e\x77\x5d\xed\x52\x2a\x20\x6f\xb0\x9b\xe1\xa4\xc7\xfa\x73\xcc\x85\xea\xe6\x37\xa5\x72\x98\x6a\xb9\x8f\xfc\xfe\x40\xb0\xbc\x4e\x74\xd0\x90\xc6\xd6\xe8\xbb\xad\x2d\x7a\x0c\xb5\xa2\x93\x5d\xd8\x39\xce\x5c\xf3\x73\xd4\xef\x47\x7f\xdd\xb4\x45\x8f\x7b\x89\x60\x79\x1e\x44\xc8\x92\xd2\x3c\x2a\xe5\x55\x00\x5f\xf5\xb2\xce\x97\x8a\x2b\xc4\xd3\xa3\x69\xbd\x96\x9f\x48\x71\x2b\x87\x73\x9f\xa9\x5b\xe7\x9f\x23\x26\xc5\x8e\xca\xaa\x4c\x85\x14\xbd\x0f\x72\xa6\x66\x17\x2d\x99\x78\x59\x63\x0a\x83\xcc\xb9\xa0\x8d\x1d\x57\x14\xab\x26\x2d\xc3\xa7\xdb\x68\x58\xf0\x2e\xf9\x0b\xc5\xe0\x15\x69\x17\x27\x2d\x69\x39\xf7\x05\x77\x97\xb8\x95\xf6\xd3\x47\x3a\xcd\x0d\x15\x27\x6a\xd8\x91\x1e\x03\xa5\x2c\xa6\x63\x78\xa4\xee\xc9\x17\x9f\x2c\x6c\xe8\xf6\xb8\x45\xec\xe6\xc0\x40\x98\x05\x44\xaa\xca\x20\xad\x5f\x2a\x45\x2d\x63\x69\xce\xca\xed\xab\x0b\x93\xcf\x8e\x1a\x69\xf0\x37\xb5\xa9\x16\x02\x56\x46\x8d\x4c\x83\x16\x2f\x73\xfb\x04\x8d\xab\xef\x83\xcc\x1a\xe5\x3e\x40\x41\x86\xf9\xdc\xcb\xdf\xc5\x54\xa9\x60\x15\xe4\x26\x69\x64\x47\x0c\x3e\x3b\xa1\x54\x31\xe9\x84\x46\xc4\x22\xf3\xbe\x05\x4f\x01\x30\xf5\x0c\x35\xa2\x05\x0b\x09\x95\x97\x73\xb5\x9d\x40\x71\x8d\xf2\x1d\x2a\xf7\xa1\x35\x78\x4d\x06\x58\xf9\xd4\x43\x1a\x13\x01\x27\xc2\x35\x04\xad\x11\xf4\x81\x81\x1f\x03\xfa\x05\x36\x09\xbd\x70\x13\x98\x19\x5f\x0a\xcc\x54\xa7\x91\x5a\xbd\x3c\xf7\x4a\x25\xf8\x45\xf6\x7f\x7b\x1d\x9a\x59\x2a\x7d\xc1\xbf\xf3\xf9\x23\x4e\x52\x1b\xbe\xcf\xe7\x06\xfc\x41\x41\x34\xe6\x47\xdb\x86\x1c\x79\x16\x36\xde\x73\xb1\xf7\x2d\x39\x66\x0f\x42\x8d\xe4\x67\xf5\xb0\xb0\x85\x79\xdf\x92\x3e\x7c\x72\x63\xc4\x81\xcb\x15\xe6\x83\xe0\xcc\xab\xe7\x65\x09\x7a\x56\x0a\x79\xa7\x15\xa0\x4d\xb4\x21\xf4\x4c\xeb\x91\xb7\xc8\xe8\x91\xc5\xc2\xe2\xb6\x30\x3f\x0b\xce\xfc\x7a\x9e\x96\xcb\x8a\xfb\xb2\xb8\x47\xec\x75\xbf\x63\x08\x52\x2a\x15\x3c\x1a\x76\x5b\xf5\xc8\xf0\x88\xb5\x12\x76\x04\x1b\xbc\x79\xdf\x82\xe5\xc3\x6d\xd9\x87\xd9\xdd\x1a\x7c\x51\x33\xbc\xe9\xaf\x08\x7b\x09\x6b\x52\x2f\x07\x5c\x3d\xb6\xcc\xdc\xfa\x5d\x66\x5c\x53\xb9\x79\x99\xb4\x96\x75\x12\xfa\x92\x80\x00\x9a\xc1\x63\x5f\xa8\x2f\x4d\x3c\x66\x03\x71\x38\x1c\xf6\x87\x46\x7b\xc0\x75\x14\x87\xd0\x80\x7d\xc7\x27\x30\xf2\x7d\x56\xb3\x7d\xdc\xe5\x39\x60\x4c\x39\xa0\x92\x59\xac\x2d\x80\x5d\xef\x40\x5e\xdd\x7b\x01\xc3\xec\x30\xe3\x87\xd2\xd9\x40\x8c\x7d\x90\xd3\x85\x59\xa8\x4e\x13\xc0\x9f\x00\x26\x62\xb1\xe0\xb0\x0b\xf9\x36\x54\xe8\xd9\x6a\x46\x7d\x59\x67\xde\x7c\xee\x17\xbb\x7e\x3e\x4f\x24\x3c\x92\xe3\x6d\xe3\xc6\x2a\xc1\xa2\x47\xde\x42\x38\x4e\xd8\x7a\x55\xe2\x8d\xae\x4e\xb3\xcd\x75\x29\x43\x53\x65\x90\x8d\x96\xbc\x90\xda\xeb\x7c\xb9\xc1\x09\xd8\xa0\x24\xee\x11\x79\x0b\x8c\x28\x8f\xc3\xa3\xda\xe5\xcd\xcb\x1a\x2e\x03\xd8\x29\xab\x14\x8e\x6e\x33\x9c\x40\x97\x91\xc5\x27\x39\x98\xe1\xa4\x40\x83\xe2\xe9\xa5\x76\x5e\x65\x47\x88\x2b\xcd\x2e\x78\xbe\x79\xee\xa5\xbb\xf3\xc7\xa7\x5a\x5b\x6f\x56\x70\xae\x49\xed\xa0\xbe\x8a\x2d\x32\x92\xbe\xe9\xe4\x06\x9e\xf7\x81\x9d\x5f\x91\x52\x9f\xda\x27\x1e\xac\x2e\x23\xc8\x79\xc9\x43\xdf\x77\xe6\x45\x0b\x95\xe3\xee\x03\x02\xcf\xd0\x3b\x1e\x2c\x24\x3c\x20\xb3\xa9\x97\xed\x1b\x90\xa7\x6a\x17\x37\x58\x48\x2d\x95\xba\x8d\xcc\x74\xd7\x23\x4a\x1d\xbf\xdb\xe0\xec\xe1\x88\xe7\xbc\xf9\xb6\xd0\x80\xb3\x93\x39\xa1\x45\xa7\xbd\x2d\x3a\xed\x10\x3b\xf4\x8c\x2e\xee\xeb\xfc\x90\xd8\x5b\x9b\x9f\xd6\xae\xfa\x43\x28\x35\x92\xc6\x08\x9d\xd1\x9a\xdf\x0f\xc4\x1a\x1f\x8a\xb5\x70\xd8\xef\xae\x5d\xf4\xfd\x76\xe7\xac\x33\xa6\x6b\x43\xe1\x8b\xce\xb3\x08\xd6\xbc\xd9\xa7\xb5\x9b\xb6\x58\xdb\x4f\xfa\xa3\xc9\x50\xac\xed\x4e\xc6\xed\xfe\x70\xb4\x06\x44\xe2\x10\x0d\x1a\x2e\x4e\x6e\xd6\x92\x8e\x2f\x7a\x23\x61\xae\xed\x26\xc9\x5a\x7f\xdc\x16\x43\x09\xb9\x33\x5a\xdb\xef\x0f\x66\xc3\x4e\xd4\x1e\x7f\x5a\xdb\xae\x56\xbf\x56\xb6\xab\xd5\xff\xac\x82\x28\xcb\x36\x21\xe7\x68\xad\x29\x23\x3d\x04\xe6\xa7\xcd\xad\x6c\xc5\xf6\xf2\x67\xb3\x1f\xa6\xf6\x73\xdf\xb3\x48\xb8\x77\x3e\x87\x15\x91\x9d\xca\x7b\x67\xca\xac\xfa\x20\x35\x10\x5f\x3a\xcc\xbd\x2f\xca\x71\xd2\x93\x9a\x47\xc3\xed\x34\xeb\xf0\x46\x53\x00\x85\xa3\x7e\xb0\xcd\xaa\x8b\x3b\xd6\x83\xbe\x85\xc3\xb3\x68\x51\xac\xfd\xca\x3f\x1c\x10\x55\x5f\x7e\x7d\xf6\x5a\x6a\x06\xff\x1c\x39\xdf\x91\x29\xd2\x5b\x8a\xaa\xa7\xe0\x2c\xff\x3e\x28\x58\xd6\xcb\x73\x92\x13\x0f\x8b\xaa\xed\x68\xcd\x33\x07\xdb\x95\x0a\xad\x7e\x63\xf0\x54\x2a\xc9\xaf\x6a\x36\x7f\x0f\x78\x5d\x3f\xe8\x49\x02\xdd\x24\x4f\x6a\x4b\x77\xc1\xba\x6a\xe7\xc3\xc1\x7c\xde\x57\x3b\x26\xea\xfb\xb5\x88\x8c\x5d\x12\xaf\xb6\x85\x95\x9d\xf5\xd4\xca\x79\x70\xce\x26\xe7\x53\x2b\xf3\x1d\x03\x03\x50\xb5\xd3\x4d\x6c\xef\x8c\xad\x7b\x76\x0f\x77\x84\xc5\xa7\x3b\xf3\x79\xb2\x2a\x06\xcf\xc3\x41\x2e\x0e\xa8\xf7\x45\x69\xc3\x03\x5e\xc3\x56\x3a\x7a\x48\xc0\xdd\x99\x51\xb8\xe2\x00\x78\x9e\x18\x24\xc5\x6e\xbd\x5a\xf4\x47\xdd\x6f\xa5\xa7\xb7\xca\x06\x2c\x60\xe1\x84\xef\xeb\x95\x3a\x92\x4d\xc1\xd5\xa8\x6e\xa0\x73\x4e\x42\x0a\xb9\xe4\x8a\x7d\x9f\x4b\x81\x90\x71\x28\x4c\x5f\xea\x2c\xe1\x3b\xd2\x02\x0f\x07\xa5\x92\xea\x8f\xbb\xd5\xc4\x9d\x52\x88\x57\xea\xdc\xc5\x03\xdf\x43\x4b\x33\x1b\xc8\x6a\x62\x8f\x54\x83\x83\xa2\x17\xac\xfc\x34\x1c\xb4\xea\xa1\x9c\x26\x96\x90\x11\x30\x34\xe9\x28\x8f\x32\xac\x51\x52\x88\xbd\x16\xb1\x71\xaa\x9b\xc9\xe3\x2a\x2f\x33\x05\xb8\xdd\xfc\x11\xfb\xd4\xc8\x2b\xc7\xfc\xe8\x18\xd0\xec\x55\x22\x4c\x20\x53\x9d\x9a\x8b\x06\x7b\xd9\x72\x4f\x49\x7b\x6e\x0e\x6f\x60\x73\x85\x2e\x92\x30\xf5\x22\x81\x2f\xd4\x67\xe3\x16\x70\x29\x7e\xa9\x64\x78\x1d\xc7\x7f\x72\x0d\xdf\xec\xf8\x84\xea\xa5\x03\x5f\xa1\x8b\x61\x39\x2f\x60\x73\x46\x97\x3f\xf7\x81\x5c\x37\x2a\x17\x6e\xda\xb9\x63\x03\xa6\x2a\x70\xe6\x30\xbf\x71\xb8\x4e\xdd\x52\x69\x9d\x9b\xc3\x6d\x3b\xd5\x21\x81\x64\xb4\x73\xa4\x21\x13\x40\x39\x46\x4c\x38\x68\xa1\x23\x9c\x6d\x3c\xe1\x43\x06\x73\xbd\x1e\x59\x61\x7a\xfe\xc7\x2c\x84\x85\x28\xe6\x73\x8e\x0b\xd1\x43\xdd\x1f\xbc\x30\xc2\x75\x01\x3f\x78\xf3\x05\x3b\x19\x37\x93\x47\x23\xc6\xc0\xe0\x3f\x47\xcc\x43\xaf\x45\x0d\x8e\x01\x93\x8c\x40\x9e\xca\xb0\x04\xab\xfa\xd4\x4d\x80\x62\x48\xa8\x5c\x60\x55\x2a\x7b\x0b\x55\x8c\x20\x8f\x24\x22\x3c\xb4\x74\x01\xca\x39\x66\x3f\x0d\x0e\x4b\x9b\x72\xe5\x60\x3a\xf7\x5e\x23\xd4\x2b\xee\x5c\x64\xd4\x32\x3c\xbc\x97\xa1\x1e\xee\x97\xeb\x55\xb5\x03\xe1\xa4\xc1\x0b\x1b\x1c\x04\x9c\xa0\x43\xc4\x93\x42\xef\x9b\x1d\xdf\x65\x1e\xc5\x11\x80\x97\xfc\x30\x8f\x1a\xbc\x68\x54\xdb\x6b\xd9\xfd\xd6\x52\x44\xcb\x34\xf7\xb0\x65\xe4\x8f\x3b\x38\xec\x86\xf2\xb0\x6b\x70\x63\x88\x87\xdd\xc6\x81\x08\xc5\x70\x28\x82\xb5\x36\x1f\xad\xf1\x64\x28\x78\x30\x5b\x0b\x95\x0d\x6c\xe8\xe9\x6c\xbb\xf2\xcb\x3e\x4f\x12\x11\x20\x89\xb7\x91\xd3\x12\x1e\xbc\xaf\x68\x90\x56\x34\x58\xaa\xe8\x85\x8f\xd6\x7c\xe8\xa6\x44\xd7\xa1\x72\xec\xab\xc4\x77\xe0\x87\xb2\xd5\xb8\x49\x75\xa4\xd1\xe2\x93\x6b\x28\xdf\xbe\xc7\xca\xc1\x17\xa1\x55\x25\x90\xba\x1d\x31\xbe\x18\x36\x90\x1b\x3e\x1e\xf1\x55\x91\x3e\x5a\x8e\x02\x06\xa7\x22\x6c\x93\xaa\xa0\x2d\xed\xc8\xc6\x2d\x96\x8f\x07\x3f\x6e\x14\x6c\xb7\xbc\xf9\x5c\xca\xa1\x9c\xf3\xc0\x9d\xcf\x05\x87\x29\x9c\x18\xcd\x10\x66\xf6\x5b\x27\xe4\x96\xa0\x49\x68\xc9\x3d\x6d\xa1\xec\x48\x7a\x2d\x63\xd2\xe0\x34\xc4\x48\x3d\xb0\xe9\x49\x55\xb4\x75\xe6\x9b\xe3\x4e\x57\xf4\x27\xe3\x7a\xfa\x64\x7d\x3d\xfc\x62\x57\x77\x12\x9c\xd8\x1e\x5f\x16\x7c\x4e\x5a\x86\x40\xdb\x89\x7e\xcb\x88\xf0\xe0\x79\x6e\x19\x35\x7a\x34\xe0\x65\x20\x0b\x69\x42\x68\x68\x26\x21\x4c\xff\xf1\xc0\x10\xf4\x7a\x90\xbf\x25\x25\x6f\xc2\xb9\x79\x42\xbf\x4b\x37\x4f\xee\x3a\xdb\x7d\xe1\xe9\x73\x7b\x34\x9f\x1b\x08\xde\x37\x6f\x02\x3e\x9f\xaf\xd7\x68\x4c\x68\x04\xe7\x85\x54\x0a\x25\x0b\x02\x0c\x49\xbf\x27\x60\x90\xd8\x7b\xac\x68\x5c\xc4\xab\x4a\x5f\xfa\x12\x2f\xfb\x73\x6c\x08\xfa\x36\x9e\x0d\x84\x75\xdc\xa6\x7e\x9b\x0f\x47\x62\x6c\x9d\x0d\x38\x1d\x0d\x7d\x14\xba\x3d\x37\x80\xf8\x93\x8e\xca\xf5\x7c\x8e\x72\xd3\xff\x45\x1d\x42\x5e\xc7\xf4\x25\x45\xf4\xd7\xb3\x18\x76\xc2\x8e\xcf\xe1\xfb\x7c\x6e\x7c\xf0\x85\xbd\x2d\xb4\xfc\xf4\x83\x1c\xca\x9d\x19\xea\x37\xe9\xeb\x38\x58\x6d\xaa\x19\x5f\xe8\xe5\x80\x97\xbd\x72\x98\xf0\x34\x10\xa1\x9c\x16\x6f\x37\x01\xb7\xd6\xab\x0b\x42\x85\x1e\xe8\x9f\x46\x00\xc7\x05\x0d\x08\xb1\xe1\x50\x0c\x96\xa3\x8d\xc3\xdc\x81\x3d\x18\x38\x9a\xba\x21\xb0\x7b\x83\x74\x0b\x46\x1c\xac\x3e\xf4\xa7\xaa\x7d\x9b\x3e\xc1\xe0\x96\xdb\x09\xe0\xf0\x98\xc8\x28\x15\x83\x22\x68\x2e\x75\x24\xa1\x70\xa9\x94\x03\x65\x23\xa4\xfc\xb1\x95\xbb\xd4\x7e\xce\x6f\x28\x1c\x7d\xcc\x9f\xf4\xd3\xcd\x64\x1d\x36\xd5\x47\xc3\x23\x75\x94\x31\x5a\x9e\x53\xcd\xdd\xc4\x4c\xb4\x00\x70\x8c\x21\x5c\xe4\x8a\x0a\x79\x81\xcf\xe8\x84\x5c\xfa\xb9\x46\xb7\xee\xcd\xb0\x54\x9a\x20\xe5\x50\x95\x7c\x44\x12\x92\xfc\x75\xcb\x24\xa5\x81\x52\xd7\x2d\xfa\x8c\xc2\xb9\xcc\x69\xd8\x81\xb3\x29\x9d\x7e\x1d\xfb\x5a\xa7\x7a\x28\x94\x5f\x5a\x2a\x71\x02\xe7\x35\xcd\x53\x16\xcf\x85\x4b\xdd\x26\x4c\xce\xf2\xa5\x40\xcb\x4a\xbf\xcc\xae\xf6\xca\x1e\xb1\x73\x2c\x82\xf6\x4e\x0a\x24\x3a\xba\x5f\x7a\x96\x1b\x1b\x14\xff\xeb\xaf\x30\xe1\xa3\xf6\x5f\x93\x5e\xd2\xe7\xc1\x31\xef\x05\x89\x18\x52\x9d\x3a\xe2\xcf\x22\xb8\xcd\x7f\x42\xb6\xa2\x75\x77\x74\xe9\x3d\x0a\x7f\xbc\xf6\x5c\x33\xbf\x5a\x6b\x47\x90\x79\xed\x2a\xe1\x33\x31\x5c\x0b\xc4\x58\x28\xe9\x6a\x2f\x58\x13\x5d\x4f\x04\x6b\x95\x4f\x6b\xed\xf1\x78\x60\x6d\x6d\x79\x49\x3f\x32\x03\xe1\xf7\x7b\xbe\x18\x8c\x4d\xbf\xdf\xdd\x1a\xbd\x84\x7d\x84\xb6\xf5\x29\x0f\xba\x33\x5a\x33\x7c\x02\x4c\xc4\xbf\xd6\x1a\xa2\x1f\x86\x6b\xad\xb1\xe0\xc3\xde\x08\xe1\x76\x46\x6b\x43\x91\x08\x3e\x12\xc1\x12\x6f\x72\x2e\x79\x13\x2b\xad\xf2\xe5\xe5\xc5\xec\x0f\x44\x4f\xde\xf8\x99\xfd\x61\xb4\xa5\xf8\x97\xd1\x56\xb7\x33\xae\x68\x66\x66\xd0\x1e\x7c\x2a\xf0\x1f\xd3\xd6\x6a\xe7\xd4\x9d\xd0\x10\xdc\xe9\x06\xae\xda\xcf\xc7\x43\xce\x7a\xf5\x9e\x15\x8f\xb9\x3d\xb6\xde\x94\xb0\x70\x3c\x94\x46\x8b\x03\x26\x38\xde\x67\xec\xa3\x67\x20\x2e\x6f\x33\xf8\xa8\x9d\x69\xe7\xf4\x48\x8f\x0d\x52\xbe\x20\x33\x76\x1b\xb0\x81\x23\x84\x6b\xd4\xa4\x17\xcf\x43\x41\xe8\x88\x55\xed\xd1\xce\x00\xd8\xdb\x91\x94\x8b\x0d\x9c\x91\x8b\xb9\xaa\x14\x1f\x9f\x02\xd7\x48\x42\x42\x00\xec\x5b\x8f\xa5\x9f\xf3\x1f\xcb\x35\x65\xfb\xb3\x36\x5e\xf4\xd8\xe5\x42\xb2\x0e\x4f\xd0\x0e\xe5\x98\x24\xf3\x75\xfb\xb9\x9b\x3e\x72\x1d\x74\x6f\x04\xbc\x98\x8a\xd2\xef\xbc\xb8\xc6\xf9\xa9\x8a\xf1\xaa\x13\x9e\x1a\x48\xe6\x64\x09\x3f\xda\xa8\xd4\x90\x25\x34\x23\xa0\x1e\x44\x96\x30\x3c\xc3\xad\x62\xd6\x32\xb4\x73\x3e\x68\xf3\xad\x20\x84\xd8\x63\x0b\x05\x35\xea\xbb\x53\xa5\x55\x5a\x75\x09\x1d\xbe\x98\x83\x64\x12\x75\x7a\xa3\x52\x69\xf8\x62\x76\x3b\x5d\x71\x33\x1b\x88\x91\x73\xea\x12\xc3\x63\xd9\x67\x67\x3c\xe0\xb0\xa5\x78\x66\x20\x46\xfe\xb0\x33\x80\xf1\xc5\x9b\x2f\x05\xb2\xf0\x41\xba\xcb\x30\x1c\x5e\x79\xdd\xad\x3c\xb8\xf3\xff\x8e\x48\x79\x8b\x7e\xba\x24\xea\xc3\x7f\x47\xe5\xe1\xfc\xbf\xa3\xb2\xe7\x54\x2b\xff\x71\xcb\x64\x8b\xde\x8a\x3c\xb6\xda\xc6\x7f\xf8\xe2\x3c\xfb\x2e\x1a\x0f\xc8\x47\xe9\xe4\x61\xc0\x09\x8e\xb0\xc7\x6a\xd4\x67\x5f\x6c\xcf\x46\x52\xd1\x2f\x97\xa9\x24\x88\x76\xfd\x71\xe7\x59\xfc\x94\xeb\xc0\x78\x1e\xf0\xb2\x4f\x68\xd6\x7a\x5f\xb6\x5e\x11\x80\x13\x20\x00\x51\x36\x88\xf3\x47\xdd\xae\x00\xc0\x55\xc0\xa6\x03\xae\x0b\x3e\x4b\xf9\xde\xaa\x5c\x2f\x03\x9e\xaf\xf0\x4f\x5a\xa5\xdb\x35\xb4\x1c\x6b\xbd\x70\x96\x1c\x28\x08\xaf\xb8\x14\xfe\x44\x51\xda\x21\xd1\xf3\xe9\x23\xa0\x93\xac\xea\x3d\xf2\xa6\x6d\xd4\xbc\xe2\x28\x34\xc4\xf8\x07\x1f\x76\xb8\x97\x08\xe3\x26\xe1\xb2\x57\x47\x82\x38\x35\x17\x1f\x9b\xd0\xc1\x72\xb6\x36\x6f\x18\xb7\xd7\x3d\x0e\x6b\x7b\x08\xe7\x3f\x37\x79\x92\x94\x4a\xff\xda\x51\x9f\xcd\xfe\x61\xa9\x64\xbc\x34\x38\x5e\x07\x85\xda\x5f\x5b\xcc\x4d\x2f\x42\x93\x69\xa6\x7d\xc0\xc4\xdc\x7c\x9a\xf0\xa4\x33\x9e\xb1\xa8\x1e\x59\xed\x86\xad\x27\x65\x6f\x8f\xd3\x4f\xfa\x9a\x10\x12\x1e\x8f\x68\xfe\xf5\x78\x8f\xd3\xb8\x1e\x5b\x1e\x2e\xeb\x2c\xfd\xe8\x84\x5e\x12\x3b\xc9\x66\xf7\xd1\x09\x4d\xd4\xb5\xcd\x4b\x83\xdb\x9f\x12\xcf\x98\xb6\xe8\x5b\x3e\x92\xa5\xf5\x9e\xdd\x76\x86\xaf\xae\xc3\x5d\xe6\x2d\x68\xb4\x3a\x67\xc1\x0d\x90\xca\x8e\x99\xaf\xf8\x90\x77\x47\xf9\x8b\xcb\xbc\xbf\xa0\x98\x2f\xe8\xcb\xb0\xb3\x04\x4a\x9d\x83\xce\xcf\x00\x5b\x4e\x4a\xa5\x57\xc9\x59\x9a\xcd\x1b\x9a\x9f\x0d\x7f\x7e\x75\x09\x29\x95\xd6\x73\x9f\xd3\x82\xc3\x33\x42\x14\xf6\xaa\xbf\xaa\xfa\x92\x78\xf0\x92\xc1\x3f\xde\xe3\x3a\x8a\xda\xe7\xae\x79\x71\x31\x14\x41\x67\x28\xfc\xf1\x6d\xf3\x9c\x79\xf6\xcf\x81\x01\x34\x29\x77\xc2\x5d\xf4\x96\x63\x54\xe9\x1f\xff\x22\xe5\xcf\x31\xcf\x97\x09\xfa\xfe\x18\x5d\xe8\xca\x8c\x0b\x2d\x46\x78\x1a\xea\xd8\x7f\x50\xd3\xe3\x11\x99\xcf\x3f\xc6\x94\xb3\x7c\xd0\xbf\xba\xdc\xd9\x0d\x4e\x2c\x6e\x7b\xec\x12\xa5\xb6\x1f\x6c\x33\xef\x37\x9d\xb7\x7c\xa5\x7a\xc2\x21\xaa\x03\x3c\x1c\x21\x23\xfb\x24\x06\x92\xdc\x57\x3b\xa7\x14\x31\x8d\x35\x51\xe6\xb1\x93\x1e\x2f\xa7\x80\xce\x4f\x49\x79\x98\xe4\x12\x7e\xb4\x49\xb9\x97\x4f\x68\x46\xa4\xfc\x94\x4f\x38\x6a\x93\xf2\x44\x50\x8f\x79\x65\xe3\x6c\x37\x4b\x7f\x6a\x90\x72\x3f\x9f\x11\x12\x2e\x76\x89\x0e\xb9\x92\xce\x1a\x83\xd0\x40\x5a\x44\xad\x75\x7a\x6b\x3e\xf1\xca\xcc\x09\xdc\x32\xdf\x2f\xfb\xf0\xf7\x62\xd7\x0e\xd8\x54\x09\x56\x09\x7a\x37\x3d\x14\xc4\x96\x9e\x1f\x80\x1d\x2c\xb3\xde\x84\x97\x83\xf2\x44\x10\xdb\x2b\xb3\xbb\x2e\x97\x9b\xd3\xdf\xe9\x9d\x9f\xbd\x8f\x3a\xc7\x63\xdf\x7b\x4b\xc8\x77\xff\x79\xc7\x5c\xee\x02\x4a\xd7\xcb\x5d\xfc\x2c\xec\xf7\xbd\xb0\xd4\x07\x97\x3d\x68\xd4\xf7\x5d\xd9\x0b\xcf\xe2\xb7\xbd\x70\x85\x05\x9e\x65\x2f\x7c\x7a\xed\xf1\xc5\x4f\x9e\xf7\x22\xb7\x5e\x5d\x64\xb8\x9d\x90\x75\x76\x09\xdb\x18\x12\x0b\x70\xd2\xe4\xbf\xa5\x45\x6a\x8b\xbc\x6d\xeb\xb4\x51\x88\xcc\x40\x7d\x94\x46\x7f\xee\x4a\x7d\x43\xa9\xdd\x29\x55\xaa\x5c\xe6\x97\x93\xb0\xcc\x33\x3b\xce\x3c\x9b\x3d\x6b\x65\x77\x28\x87\x4c\xdb\xb6\x55\xdd\x7a\xcc\x0d\xf4\x47\x52\xab\x12\x4b\x89\x0c\x4f\x6e\xd3\x0c\x35\x95\xa1\x56\xc8\x30\x14\xcf\x69\x8e\x6d\x95\x63\x5b\xe5\xc8\xb9\x06\x6f\x2d\x69\x9d\xf7\x0f\x77\x3c\xb3\x7f\x58\x5f\xaf\x59\xf0\xf2\x4d\xbe\x54\x2d\x6e\x9e\xdc\xee\x78\xe6\xc9\xad\xfc\x72\x72\xfb\x4d\xbe\xc0\x97\xa1\x78\xde\xf1\xe0\x17\xbe\xe5\xef\x89\x67\xe9\x35\x78\xaa\xd0\x02\x8c\x41\xe4\x71\x42\x3d\x69\x0c\x84\xc6\xef\x9e\xed\x55\x2a\xe4\x0d\x95\x5c\x3c\x57\xe9\xb9\x14\xd5\x63\x81\x1b\xd1\x5b\x84\x34\x22\x60\xec\x22\x42\x6d\x70\xf9\x96\xdb\x63\x17\xc0\x0b\x74\x42\x38\x75\x60\x7b\x6c\x70\xf2\xe6\x71\xa0\x9b\xb8\xdf\x3e\x7c\x16\xbd\xb1\xb1\xd1\xef\x79\x22\xec\x0f\x85\xa4\xb8\x37\xf2\x7c\xd5\x4a\x62\xbc\x18\x06\xf5\x63\xca\xbc\x98\x6f\xa9\xd6\x78\xca\xe9\xac\x81\x0c\x14\x34\xec\x15\x0f\xc5\xc5\xba\xdc\xec\xb2\xb3\xd3\x10\xe8\xc9\xf4\x50\xba\x19\xda\x9b\x9d\x04\xab\x04\x80\x32\x37\x1c\x34\xb9\x99\xb8\x9b\x13\x70\xc4\xcf\x9c\x49\x1f\x80\x7b\x0d\xce\xbe\x37\x8d\x8d\xa1\x88\x3a\xfd\x1e\x30\x20\xc3\x0d\xfa\x53\x90\xf2\x46\x24\xfa\xf0\x3a\xda\xa0\xbb\x45\x49\xc5\x7e\x7a\x59\xc2\x0e\x3a\x06\x77\x06\xe8\x93\x1f\xe6\x35\x37\x52\x17\xc6\x9a\x13\xde\x6d\x39\xdc\xb5\x73\x8a\xf2\x6f\x98\xc2\x80\x67\x94\x39\xf6\x1a\xbc\xfc\x38\x2c\xf3\xf2\x75\x97\xd3\x80\x4d\x42\x69\xcd\x9b\x53\x5c\xf1\x3d\x43\xd0\xe3\x36\xb1\x05\xaa\x37\xf9\x76\xa0\xb8\xf7\xbb\xb1\x31\xe9\x18\x07\x0d\x4e\xa5\x90\x97\xd0\xaf\x87\x5f\x54\x5c\xb1\x76\xc7\xf0\x09\x63\xc3\xa8\xfe\xb9\x83\x17\xcb\xf3\xb9\x2f\xef\x76\x2d\x59\x0c\x58\xc0\x02\xd3\x76\x90\xbb\x17\xcf\x7c\xe8\x00\x99\x24\xe5\x66\x41\xd6\x98\x36\x30\xd5\x00\x5c\x37\xa7\x60\x17\x68\x0b\xe9\xde\x46\xdb\x2b\x1a\xbe\xbe\xb2\x46\x8f\xcf\x58\x82\x66\x20\xa0\xa4\x84\x92\xd3\xea\x2c\x02\x90\xb6\xb2\x19\xe3\x73\xa8\x51\xf5\x60\x08\x3c\x3d\x04\x99\x7d\xc8\x33\xea\x33\xa2\x32\xfb\x51\x83\x33\x67\x63\xf7\x60\x83\x6e\xec\x1e\xc2\xcf\x11\xfc\x34\xe0\xe7\x1c\x7e\x2e\xe0\xe7\x12\x7e\x9a\x1b\x54\xec\xd3\x8d\xdd\x5b\x78\x79\xd8\xa0\x1b\x7b\xbb\xf0\xb3\x07\x3f\x50\x7c\x0f\x8a\xef\x41\xf1\x3d\x28\xbe\x77\x0c\x3f\x27\xf0\x73\x0a\x3f\xdf\xe1\xe7\x72\x83\x0e\x42\xba\xb1\xd7\x82\x97\x1b\xf8\xb9\x83\x9f\x7b\xf8\x01\x90\xfb\x00\x72\x1f\xa0\xed\x03\xa0\x7d\x00\xb4\x0f\x80\xf6\x01\xd0\x3e\x60\xb4\x0f\x18\xed\x03\xb4\x7d\x40\x6b\xbf\x09\x3f\x00\x6f\x1f\x10\xdb\xff\x01\x3f\x00\x6f\x1f\xe0\x1d\x00\x4e\x07\x50\xff\xc1\x19\xfc\x40\xd9\x03\x28\x76\x00\x5f\x0f\xf7\xe1\x07\xb2\x1c\x42\x45\x87\x00\xea\x10\x40\x1d\x02\x6a\x47\x50\xe5\x11\x94\x3d\x82\x62\x47\xf0\xb5\x01\xf8\x35\xa0\xc9\x0d\x40\xb2\x01\x65\x1b\x80\x5f\x03\xb2\x34\x00\xab\xc6\x35\xfc\x60\x66\x80\xd2\x80\x06\x36\x00\xa1\xe3\xef\x1b\xf4\x20\xa4\x1b\xc7\x90\x7c\x0c\xc8\x9e\x00\x8c\x13\x80\x71\x02\x2d\x3b\x81\xe2\x27\x50\xfc\x04\x8a\x9f\x00\x26\x27\x90\xf9\x14\x80\x9f\x02\xda\xa7\x57\x1b\x74\xe3\x0c\x4a\x9c\x01\xc6\x67\x50\xf5\x19\xe0\x79\x06\x59\xce\x00\xc0\x19\x66\x01\x00\x67\x50\xf5\x19\x34\xf4\x1c\xd0\x3e\xdf\xdb\xa0\xc7\xfb\xf4\xd3\xc6\x39\x74\xc5\x39\xe4\x38\x87\x2a\xce\xa1\x8a\x73\xc0\xe7\x1c\x3a\xef\x1c\x70\xbd\x80\x02\x17\x80\xde\x05\x54\x76\x01\x95\x5d\x40\x65\x17\x50\xf6\x02\xb0\xbd\x80\x1a\x2f\xa0\xc6\x0b\x00\x75\x01\x50\x2e\x00\xca\x05\x40\xb9\x80\xba\x2f\x7e\xc2\x0f\xc2\x03\x2c\xbe\x03\xd0\xef\x00\xef\x3b\xc0\xfb\x0e\x78\x7f\x07\x50\xdf\xa1\x69\xdf\x01\xef\xef\x00\xea\x3b\x64\xbe\x04\xf0\x57\x50\xe2\x0a\x4a\x5c\x41\x89\x2b\xc0\xe0\x0a\x30\xb8\x82\x62\x57\x50\xe5\x15\x54\x74\x05\x75\x5c\x43\xe6\x26\x80\x6a\x42\xb3\x9a\x80\x4b\x13\xbe\xb6\xe0\x43\x0b\x06\xad\x05\x03\xde\x82\x66\xb5\x00\x68\x0b\x80\xb6\x00\x68\x0b\x70\x69\x01\xe4\x16\x40\x6e\x41\xe5\x2d\x68\x5b\x0b\xe0\xb5\x00\xab\x16\xd4\xd6\x82\xb6\xb5\xa0\xb6\xd6\xc3\x06\xbd\xd9\xa7\x1b\x37\x00\xe3\x06\x60\xdc\x9c\x6e\xd0\xfb\x90\x6e\xdc\x40\xe1\x1b\x28\x7c\x73\xb9\x41\x1f\x20\x05\x8a\xde\x40\xd1\x1b\xc0\xe7\x06\xda\x77\x0b\x48\xdd\x42\xe1\xdb\x8b\x0d\x7a\xb7\x4f\x37\x6e\x01\xec\x2d\x7c\xfb\x01\x68\xfe\x00\x0c\x7f\x00\x98\x1f\xd0\x92\x3b\x68\xd3\x3d\xa4\xdd\xc3\xeb\x03\x14\x7f\x80\x9a\x1e\xee\x36\x5c\x3b\xe8\x18\x1b\xd1\x73\xe7\xd5\x9c\x8c\x3b\x89\xd9\xc4\xdd\x7a\x1f\x76\x6b\x33\xe8\xe0\x9e\xc0\x87\xb3\xa6\xe0\xc1\x6c\x83\xc2\x7e\xa8\xee\xba\x70\x8b\x6d\x34\x38\x7b\xfb\x7e\x6b\xdd\x44\xf4\xf2\xd6\x6a\xb6\xf3\x17\x42\x7b\xad\xf7\x16\x1a\x34\x84\x9f\x88\x79\x66\xf0\x79\x3e\x97\x56\x86\x9e\xf3\xe3\xd5\x65\xec\x26\xd2\x1a\xd7\x9e\xe9\x71\x74\x69\x84\x5e\xe1\x68\xbc\xec\x4c\x4e\x49\xa4\x83\x81\xf1\x36\xe0\xe3\xb1\x18\xf6\xd0\xc6\x46\xb0\xc8\xbc\xf4\x31\x28\xa4\x7c\x8a\x51\x9e\x7d\x14\x59\x6f\xe8\xcc\x55\xa8\xc8\x37\x41\x3d\x30\x04\x0d\x89\x33\x74\xad\xaa\x0e\x81\x13\x3a\x33\xdf\x5d\xd0\x7b\x9d\x39\xce\x65\x8e\x57\x67\x5e\xd8\x01\x0b\xcd\xa3\xc8\xd9\x75\xb7\xfe\xb0\xa5\xf0\xf4\x24\x31\x30\x69\xe8\x96\x03\x5a\xa5\x9e\x33\x74\x2b\x69\x4a\x68\xde\xe3\xdf\xed\x4d\xf4\x02\xb1\xeb\xaa\xe3\x24\x2d\x5a\x55\x45\xe4\x47\x3b\x60\xe6\x97\x2f\x9b\xc2\xd9\x95\xc7\x59\xcc\xb6\x37\x8d\x60\x4b\xfa\x97\xf8\x82\x61\xa8\x54\x39\x81\x1e\xab\xb6\xb6\x65\x88\xc3\x72\x50\xae\x51\x01\x35\xc7\x14\x0a\x57\x82\x4a\x8d\xd0\x84\x71\x33\x79\xc6\x88\x0d\x77\x31\x1d\xb0\x9e\xd3\x93\xbd\x59\xe9\x41\x27\x8f\x94\x4d\xc7\x80\x8c\x98\xf3\x36\x6d\x5b\x0a\x74\xe6\xc7\x89\x02\xee\x14\x5a\x4b\x28\xfa\x75\xb1\x0a\x9e\x86\x12\xa7\xea\x2e\xc8\xc2\xb5\x3f\x21\xb5\x3f\xca\xab\x65\x0c\x18\x94\xdd\x1a\xd0\x09\x43\x78\x32\x3e\x44\xd5\x7e\xdd\x91\x38\xd8\xe5\xf2\x2b\x79\x66\x93\xb2\xd1\x73\x5e\xcb\x88\xd2\xab\x4b\x36\x07\x74\xe4\xbc\xba\x2c\x87\xcd\x44\xa1\xf2\x5c\x99\xac\xc4\xe4\xb0\x6d\xbd\x4d\x6b\xd6\x84\xce\x6a\x56\x95\x1e\x7b\xd6\x33\x3d\xf7\xac\x2a\x7d\x8c\xac\xc4\x79\x75\x69\x33\x84\xbf\xe5\x9a\xbb\x58\x90\x05\x9d\xb0\xe7\x45\xc4\x46\x99\x8d\x4d\x54\x2a\x49\x63\xc7\x52\xc9\xa8\x7e\x8b\x9c\xaa\x6b\x4e\xdb\xce\xd0\x9d\xcf\xb3\xb7\xdd\x4c\xbc\x8e\xc2\x96\x84\x09\xbb\xc7\x3c\xd3\xff\x6c\x0b\xdd\x66\x29\xa7\xf3\xa5\x33\x8e\x11\x19\x30\xdf\x19\xb9\x68\xa3\x35\x51\xdd\xbf\x33\x01\xfa\x7a\xc0\xaa\x96\xf1\xcc\x12\x39\x56\x83\x6f\x13\x67\x22\xc7\xa4\x3e\x60\xcf\x96\xf1\xca\xd2\x84\x0a\xe4\xa7\x03\x56\x65\xec\xb5\x6e\x7e\xdd\x7c\xb6\x8c\x01\xa6\x91\xad\xd7\xcd\x67\x42\xe8\x80\x25\x30\x09\x06\x38\x0d\x06\xcc\x19\x54\xe0\x21\xc1\xde\x92\x89\xea\x59\xfe\x2d\x23\x2e\x85\x01\xec\x51\xe5\x67\xaa\x07\x6b\xc9\x19\xb9\x0c\x56\x57\xdb\x1a\xa8\x3e\x9e\x2c\x6c\x0c\x9e\x95\x2e\x57\xa9\x3c\x4e\x31\x86\x88\xef\x54\x5d\xf6\x49\xf9\x75\x81\xd9\x5b\xe1\x72\x65\x48\x3f\xca\xf8\xd2\x09\x5c\x2a\x23\x7a\xc2\x02\x5f\x50\xdf\xa9\xc1\xe0\x5a\xb8\x48\xb8\x5c\x1b\x59\xe9\xfb\x7c\xe9\xfb\xf7\xa5\x39\xf3\x81\x2e\x7c\x7b\x7c\xb0\x22\x1a\x3f\x58\x82\x26\x0f\x16\x5f\xd8\x21\xe3\xe6\xe3\x43\xce\xe4\x2a\x94\xc3\xe0\x93\x80\x85\x8e\x0f\x6b\x0b\xf1\x6f\xb6\xf1\x76\x2a\x80\x31\x6d\xb8\xf4\x81\x1b\xf0\x48\xe1\x07\x5d\x86\xa5\x4f\x2c\xa6\x2a\xdb\xd0\xa5\x83\x5c\x36\x9c\x7f\x2d\x95\x10\x13\x52\x80\x01\x83\xe1\x39\x0d\x37\x83\x53\x66\x9e\xf4\x61\xc5\x02\xe9\x17\x49\x79\x2f\x51\x6f\x2c\xa6\x01\x8b\xcd\xe3\xa8\x80\x60\x60\xce\x6a\x50\x79\x0d\xc0\xd4\x58\x95\x06\xe6\xb9\xc7\x02\xf3\xd8\xa3\xf0\xc3\xaa\xda\x10\x35\xc0\xcc\xd3\x5a\x99\x41\xad\x14\xca\xe9\x0a\x21\x63\x9a\x7c\xee\xa9\x64\x82\x3d\x15\xaf\xec\x29\xe4\x7c\xd1\x6d\x59\x80\xb1\x60\x8a\x5d\x06\xbd\xe8\x5c\xbf\xba\xce\xf6\x66\xe0\xd2\xdc\xdb\xa7\xc0\x2d\x7c\x2c\xd7\x0a\x9f\xe1\x9d\xc1\x9e\x9c\x2f\xaf\x10\x5b\xca\xa6\x70\x44\x14\x93\xd5\x28\x3a\xbe\x6b\x4e\x73\xa5\xcd\x99\x2e\x94\x5a\x7b\xe1\xae\x79\x0c\x27\xd4\xc9\x94\x5b\x67\x23\x4e\xe3\x57\x6e\x3d\xed\x72\x7a\x3a\xe5\xd6\xcd\x21\x6d\xce\xb8\xb5\x7b\x42\xa7\x33\x6e\x1d\xe6\xad\x4d\xf6\x33\x86\xd8\x63\x7c\x3e\x7f\x5b\x2c\xf6\x51\x27\xe2\xf2\xe7\x0a\x1f\xdc\x35\xf3\xcf\xda\xbf\x17\xb6\xcc\x31\x12\xe3\x55\x9a\x33\x9e\x14\xe4\xa9\x4c\x71\xb0\x02\x4c\x3b\x96\x32\x91\x82\x52\xcd\x41\x2b\xe3\xf0\xab\x68\x51\x8f\x1a\x12\x5e\x7f\xd2\x0b\x3a\xbd\x68\xaf\x3f\x25\xda\x55\x51\x2e\xcd\x4c\xfa\xd4\x5f\x4a\x6a\x77\xa8\xc7\x0c\x58\xa7\x15\xf4\x9d\xb9\xb5\x5d\x46\xc7\x9c\x3e\x24\xd6\x20\xb1\xa6\x12\xd1\x72\xcf\xd9\xfe\x8f\xf9\x95\xfe\xf1\xd5\xfc\xea\xda\x1e\xec\x04\x43\x9e\x24\x22\x19\x59\x01\xed\x0f\x3b\x51\xa7\x67\xbd\x25\x7c\x6c\x79\x34\xe9\x45\x96\xbf\x58\x60\xe4\xcc\x8b\x29\x5a\x7f\x4c\xdd\x52\xe9\x31\x46\xff\x8e\x17\x53\x97\xd8\x8f\xb1\xbc\xe0\xf7\x4c\x59\x14\x0d\x20\xbc\x2e\xfa\x55\x85\xc3\xbe\xeb\x9c\xba\xf5\xed\x6f\xea\xa9\x54\x32\xf0\xa9\xe6\x32\xed\xe2\xc9\xeb\xa6\x68\x7f\x5b\x4e\xab\xb9\xa4\x0e\x5f\x2c\x7c\x84\xcd\xa1\xcb\x54\x58\x14\x35\x76\x4a\x66\x58\x95\x08\x9a\x09\x1f\x6f\x19\xb5\x7f\x57\xb7\xda\xe6\xd5\x89\x0e\xc0\xdb\xd2\x1f\x7b\xd1\xbb\x8f\x57\x7d\xf4\x9f\x6b\xa6\x7d\xb0\xd2\x2e\x2f\x57\x6c\x41\x16\xf7\xc6\x41\x8b\xee\xb7\x88\xfd\xe9\x00\x47\x7c\x76\xb8\x8a\x97\xbe\xe9\xe4\xdc\x4b\x14\x8d\x5b\x32\x6f\xb0\x39\xc0\x34\x60\xe6\xd7\x4d\xa3\x6d\x8e\x3a\x3d\x43\xe1\x06\x9d\x52\x2e\xa6\xd4\x5c\x64\x99\x83\x4d\x14\xce\xe4\xca\x57\x54\x63\x89\xf2\xd9\xd3\x36\xfd\xfe\x28\x0f\x08\x78\xe3\x4d\x01\x04\xca\xe6\xbb\x4a\xa8\xaf\x5c\x5b\x89\x4a\xf6\xdd\x27\x64\x2b\xa0\xc1\x8a\x2f\xaa\xd3\xe1\xbb\x9d\x7a\xfd\xd2\x98\xa8\x3c\x9c\x6c\xfa\x74\x96\xa5\x1a\x41\xc5\xdf\x94\x48\xa1\x9d\x43\x1a\xf4\x38\x63\x4e\xdf\xaf\xcc\x7b\xe3\x50\x76\xf5\xe1\xc7\x4b\x74\xdb\xdc\x5e\xa8\xef\x7f\x63\x24\x7e\x3b\x0e\x36\x67\x4b\x3d\xbb\xf9\x65\xcb\xd8\xde\x94\x8f\xb9\x7c\x69\xc3\x65\xff\xa8\xa6\x5f\x9d\x6c\x7d\xa9\xf8\x9b\x3e\xd9\xe4\x74\x06\x8b\x27\xdf\xc2\xa3\xff\xdf\xad\xf8\x2a\xfd\x5a\xfd\x7f\x57\xfb\xff\x6a\xb5\x1f\xa9\xd5\x7e\xf4\xff\xe0\x6a\x7f\x3f\xcb\x94\xde\x86\x34\xc7\xac\x6d\x15\x97\x6f\xcd\x25\x9b\xef\x16\x34\xd9\x92\x99\xdb\xe6\x98\xf7\x0c\x73\xfb\x2b\x4e\xbf\xb2\xf9\x75\x33\x5f\x0c\x61\x7d\x94\x01\xa0\xc0\xc6\xf0\x0e\xf6\xa6\xb4\xe7\xfc\x65\x49\x1a\xc0\xfe\xe0\x33\xa1\x32\xaf\xaa\x48\x05\x66\xf8\x65\x1e\xbd\x9b\x64\x5a\xf3\xef\x77\x13\xd8\xef\xd2\x1d\x4e\xee\x2c\xa2\x92\xcb\x03\xe8\x2f\xe7\x59\xb5\xc7\x34\x5a\xb9\x41\xcb\xf6\xa6\xb6\xc9\x01\xab\xb6\x29\xa6\x03\x23\x3f\x01\x08\xa9\xe0\x9a\xfe\x83\x6c\x6e\xe7\xfc\xac\xb5\x74\xb8\xa8\xd3\x27\xf6\xb6\x58\x1c\x4b\x3b\x9e\x21\xf7\x8b\x71\x74\x1e\x3e\x9c\x14\xef\xfd\x34\x70\xe7\xd5\x77\xd1\x12\x01\xd3\x14\xf4\xf9\xdc\x50\x4f\x8e\xef\xb2\xb7\x6e\xa7\x67\x05\x9c\x76\xf9\xd4\xaa\x04\x5c\x1a\x27\xae\x67\x19\xcc\x6e\xa7\x37\x9f\x73\xc7\x77\x77\x8a\x89\xa4\xf8\x8a\x7e\x09\xde\x95\xe5\x53\x59\xf6\x5b\x31\x91\x14\x5f\xb1\x6c\xae\x6b\x65\xdb\x23\x31\xde\x83\xed\x69\xb4\x62\x71\x20\xd6\x1a\x08\x97\x5e\xcc\xa0\x05\xf9\x24\x3e\x2d\x44\x57\x59\x75\x12\x9c\xc8\x65\x78\xf2\xbf\xd9\xe9\xd3\x69\x85\x37\x1a\xb3\xfc\xec\xca\x56\x10\x2e\xd1\xda\xbf\xab\x9b\xa6\x9a\x9b\x6a\xe4\x09\x6e\xe2\x30\x5a\x27\x40\x6f\x8a\x29\xb7\x36\x78\xe2\x89\xe1\x68\x83\x46\x33\x6e\xdd\x3f\x73\xfa\x38\xe3\xd6\x46\xc2\xbb\x9e\x18\x8e\x37\xe8\xcb\x8c\x5b\x07\xc7\x0b\x7a\x8a\x02\xf0\xd3\x96\xd9\x15\x43\x9f\x8f\xfb\x43\x76\xd2\xb2\x4f\x5b\xce\xfd\x33\x77\xd9\x21\x3c\x9a\x12\x10\x3b\xc0\x17\x05\x80\x1d\xb5\xb0\xba\x53\x14\xc0\x5c\x7e\x3f\xb4\xae\xe9\xcd\xe5\xd5\x5f\xe7\x87\x47\x37\x96\x77\x86\xcf\xcd\x93\xc6\xf1\x8d\xf5\x63\x97\xd3\xbd\xcb\x9b\x9b\xcb\x0b\xf9\xb1\x75\xa0\x5f\xe5\xf7\x0d\xaf\x3f\x1e\xf7\xbb\x7f\xa1\xde\xfe\xc6\x82\x9e\xe5\x21\xce\xb8\x75\x7c\x42\xc7\x40\x2e\x1f\xd0\xe6\xcc\x9a\x46\xf9\xe0\x26\x05\x8d\xdf\x23\xa0\x77\x5b\x53\x4e\xdf\x7a\xbc\x2b\xb0\x6d\xf9\xee\xed\xc9\xb8\x85\x06\x67\xf2\x3b\x4f\x15\xda\xb8\xb3\x1f\xb8\x19\x13\xee\x97\x4a\xeb\x5e\x6c\x9c\x34\x38\x6d\x21\x81\x91\xb9\x45\xbf\x69\x8b\xb5\xc1\xb0\xff\xa8\x54\x8c\x66\xfd\xc9\xda\x68\x20\xfc\x4e\xd8\x11\xa8\x14\xd4\xeb\x8f\xd7\x9e\x79\xd2\x09\xcc\x8d\x9c\x2f\x4d\x1d\x17\x04\xda\x25\xaf\x22\xac\xd7\x33\x8a\x36\x9c\x13\x80\x03\x9c\x40\xd0\xef\xf2\x4e\xcf\xea\xee\xd3\xa0\x33\x1a\x24\x7c\x76\xd1\x0f\x84\x35\x8a\xe8\xa8\xdd\x7f\x69\xc8\xdb\x8a\x3b\x3e\xec\x75\x7a\xd1\xc8\x5a\xaf\x51\x8f\xfb\x71\x34\x84\xd9\xbc\xdf\x4f\xfa\x43\x2b\x75\xd6\xac\x78\xe8\x87\x5d\x9a\x0b\x8c\x65\x55\x17\x34\xe0\x63\x9e\x88\xd1\x48\x8b\xd7\xa0\xd4\xc6\xd1\x57\xf8\xb7\x41\x95\x0d\xb9\x4a\xdd\xfe\xf3\x5f\xb5\xda\x1f\x1b\xb4\xcb\x87\xb1\x18\xaa\x08\x57\x56\x8d\x8e\x44\x22\x5b\x8e\xc8\xed\xb5\x69\xd8\xef\x8d\xbf\x43\x67\x46\xfb\x54\x5e\xa9\x74\x7a\xd1\x7e\xbf\x87\x5c\x33\x8c\x5b\xbf\x9f\x8c\x3b\x03\xeb\xad\x33\x3a\x1e\x77\x13\x40\x1c\x3e\xb5\x90\x8d\x7e\xcb\x97\x86\xe7\x56\xe7\x55\x58\xb5\x2f\x14\xd5\x23\xac\xd3\x83\x05\x1d\x0f\x3b\x51\x24\x86\xd6\x99\xec\x87\x83\xce\x68\x30\x19\x8b\xe0\x06\xc0\xaf\xd7\x30\x0d\xa3\xd8\x5a\xeb\xd5\x05\x4d\x1d\xd1\x5b\x6f\xda\x69\xbd\xb4\x5f\xd3\x7e\xe9\xe5\x5b\x2e\xfc\xc1\x82\x8e\x3a\xaf\xe2\xf7\x45\xba\x9d\x1e\xe2\xf6\x05\xd2\x25\x96\xdb\x0b\x2a\x83\xb0\x5a\x6f\x83\xfe\xa8\x83\xc3\xd8\x3a\x00\x62\x45\xf4\xc6\x5c\x8e\x6a\x44\x3f\xe5\x5a\xab\x5b\x45\xf9\x64\xc8\x65\x47\xdf\xb6\x17\x0b\xd5\xc9\xd6\x9b\x94\x2d\xbc\xa9\xf1\x53\xd9\x3b\x7b\x4a\x0c\x58\x5b\x2c\x16\x34\x9b\x7a\xd6\xc1\x31\x8d\x85\x18\xec\xc2\xf4\x1b\x37\xa1\x42\x6b\xbd\x4a\xbb\x3c\xea\x75\xc2\x59\xa7\x17\x35\x12\x3e\x1a\x59\x6f\xd2\x08\x15\x3e\xbd\xf6\xfb\xdd\x23\xee\x8f\xfb\x43\xeb\x6b\x7e\x1b\x3b\xcb\xb6\xb1\x43\x5f\x1b\xb6\xfc\x38\xc8\xd9\x9f\xec\xfb\x3c\x35\xd8\x38\x3d\xcb\x7d\x98\x0c\x50\x80\x73\x3f\x91\xaf\xbd\x11\x67\x5b\xff\x9f\x54\x71\x29\x55\x60\x5a\x4e\xf8\x6f\x45\x3d\x55\x2b\xff\x71\x8d\xf9\x47\x2f\x84\xcc\xff\x1b\xc0\x3f\xf2\x79\x4b\x5d\xfd\x0e\xa1\x02\x99\xf8\x79\x6b\x71\x6f\x9c\xb5\xe8\x64\x4c\xec\x3b\x76\xd6\x92\xd1\xcd\xbb\x2b\xa2\x1e\xff\x38\x60\x5c\xf9\xe6\xc3\xf7\x87\x31\xd7\xd1\xe1\xc6\x68\xff\x90\x0b\xee\xd2\x58\xf2\xc9\xc6\xb1\xf1\x42\x7b\x10\x34\x2f\x0c\x42\xee\xc6\x79\xfd\xc8\xd0\x70\x5c\xea\xb8\x74\xbd\x4a\x16\x4a\xf7\x4a\xb9\x79\xf0\xcd\xd3\x07\xe5\xe9\x61\x77\x64\x71\xd3\xbf\xc7\xe8\x7d\x61\xc1\xef\xf5\xc5\xc8\xba\xcc\x55\x5a\xfc\xe8\x41\x31\x4f\x16\x43\x3f\x7d\x8b\x4f\x77\xa6\x7f\xff\xce\x52\x63\x95\x3f\x51\x40\xb5\xe8\x38\xe5\xc4\x35\x04\xf5\x4c\x6f\x9f\xd0\x28\x7b\xf5\xf7\x89\x8d\x6e\x47\xe5\x15\x66\xa8\x9d\x7a\x45\xca\x9b\x26\x50\xdd\x7b\x1d\x23\x24\x48\x79\xef\x75\xd0\xc6\xae\xd8\x05\x3e\x74\x41\x20\x7b\x20\xd7\x99\xf9\x76\x89\x0c\xc9\x9c\xb3\x60\xec\x4f\xf4\x90\x86\xd6\x29\x1e\xe0\x14\x51\xdf\xfc\x79\x4c\x88\x1d\x98\xd3\x1e\x63\x87\xc7\xf3\xb9\x7c\x3a\x1b\x71\xfd\xf8\xb4\xcb\xeb\xdc\xbc\xff\x69\x04\x34\xa4\x82\x58\xdc\x7c\xd0\xcf\x8b\x3b\xf3\xfe\xe7\xbb\x0e\xe2\x6c\xd6\x31\xb8\xb9\xff\x4c\xef\xf6\x49\xa9\xc4\x15\x68\x7b\x45\xc7\x79\x4b\x0e\x67\xf6\x3a\x86\xe7\x08\x97\x68\x7d\x43\x98\x84\x4e\x3b\x70\x8d\x90\x94\x4a\x46\xc8\x7e\xee\x97\x43\xe8\xc1\x7d\xd7\x08\x9d\x58\x06\x70\x5f\xee\x9e\x20\x9d\x20\x18\xc7\xf0\xe1\x3d\x82\x9a\xa1\xda\x7f\xa6\xc2\x16\x4c\x22\xb8\x7b\x82\xca\x7b\xf1\xa3\x71\xd4\xe0\x34\x20\xf5\xc0\x3a\x1f\x71\xc9\x8d\xe9\xef\x01\x63\x77\xfb\x2a\xd6\x4a\xd5\xe6\x12\xfd\x72\x99\xa7\x37\x19\x0e\x77\xed\x6d\xc6\x94\x67\x4e\x94\x02\x21\xca\x8b\xfd\x06\x37\x84\x8a\x42\xda\x29\x90\x7d\x4a\xf1\xf8\xe4\x2f\xc9\x46\x2d\xf9\x52\xab\xda\xa1\xac\x25\xcc\x3b\x91\xe2\x4e\xe8\x6a\x1f\xf6\x18\x49\x5b\x3a\x23\x8b\xb6\xad\x1e\xfd\xe1\x73\x2b\xa4\xb7\x3e\xd7\x2e\x05\x21\x33\xeb\x2d\xf8\xa3\x21\x48\xdd\x37\xb8\xea\x1e\xcb\xd0\xcf\x35\x42\xaf\xb4\xe5\xa4\xa0\x01\xf5\xd1\x5a\x93\x60\xe0\xf2\x93\xbf\x96\xc4\x5b\xcb\xa1\xa4\xb5\xf7\xd5\x34\x86\xb4\x60\x07\x1d\x63\xaf\x83\x9e\x57\x09\x91\xd7\xc9\x34\x64\x5e\xa9\x74\xd8\xe0\xd2\xe1\xaf\x60\x61\x3d\xb4\xf4\x2e\x86\xe3\x2b\x48\x5d\xc8\x01\xb5\xa4\x53\x29\x68\x50\x16\xce\x34\x1f\x13\xe3\x3c\xb5\xec\xda\xf7\xd1\x2c\xf3\xd0\x2f\x95\xae\x26\x06\x3c\x50\x0f\x0d\xce\xbc\xe5\x55\x9b\x0f\xf0\x6c\xfb\xcc\x37\xf7\x9f\x61\x9c\xa4\xaf\x50\xc3\x67\xbe\xac\x9b\xc2\x13\xea\x7d\x36\xf6\xb6\xe8\xc9\x80\xe7\x52\x9a\xb7\x5b\xb4\x5f\x48\xb9\xb9\xda\xa2\xf7\x61\xce\x31\xa6\x0a\x97\x80\xeb\x2c\xe7\x1c\x0d\x3b\xe3\xc4\x35\x42\xea\x99\xf7\xb0\xd8\xae\x75\x6f\xfb\x30\xab\xa3\x32\x1b\x89\xb2\x4f\xb2\x41\x8c\x70\xf8\x42\x1c\x4a\x15\xd6\x33\x37\x40\xb0\xc2\x1d\x37\xbf\xf6\xaf\x1b\x45\xf7\xf0\x1e\x63\xaf\x67\xf3\xf9\x3e\xba\x04\x40\x3d\x9a\xd3\x33\xc6\xd8\xf1\xc9\x7c\xae\x1e\xa7\x79\x2b\x85\x66\x5e\xaf\x28\xe0\xd4\x87\x9f\x80\x55\x02\x4e\x65\xf0\xf5\xcc\x03\xb6\xf9\xe3\x40\x32\xf6\xf0\xe4\x5c\x63\x40\x05\x7d\x3d\xf2\x60\xe8\xc4\xa2\x65\x1a\xe4\x1d\xdb\x9e\xf6\x09\x4c\xb9\xf9\xd8\x06\x5e\xd1\xf6\x8b\x49\x35\xbc\x02\x93\xbe\x6f\x03\xca\xcd\x61\x07\x73\x89\x62\x12\x1a\x92\xd1\xb7\xa4\x5f\x14\x51\xd0\x76\x47\x26\x04\x98\x20\xf2\xae\xbf\xae\x7e\xbf\x35\xa2\x03\x49\x3d\x62\x31\x7b\xe3\x41\x30\x14\xa3\x91\xe5\x39\x91\x6b\x46\xdb\x0b\xfb\x5a\x59\x5d\x97\x4a\x46\x6c\x4a\xaa\x12\x2f\x24\xcc\xd3\xb3\x75\xc6\x6e\x0e\x60\x1e\xe2\xe3\x34\x9a\xcf\x8d\x58\x0a\x66\x46\x4c\x76\x2d\xb1\x71\xc7\x8d\xc9\xc2\x63\xd1\x23\x3a\x11\x42\x5b\xac\xe6\x5f\x54\x06\xdd\x13\x54\xba\x0c\x98\x0c\x9c\xd1\x13\x4c\x94\x80\xd6\x70\x22\x37\xff\x5a\x11\x07\x31\xdf\x04\xe1\x9c\xea\x46\x84\xf9\x16\xa0\x2b\xf5\x84\xc5\x66\xb4\x4d\x7b\x2c\x36\x7f\xf8\x9c\x0e\x58\x6c\xde\xfa\x38\x9c\x02\xdd\xb7\xc3\x2f\xf4\xf1\x5b\xcc\xd4\x63\x36\xd4\x3d\x09\x69\xc4\x7a\x74\xc2\x62\xf3\xff\xcb\xdd\xbb\x7f\xa5\xae\x7b\x8b\xa3\xbf\xaf\xbf\x42\x3d\x1e\x46\xbb\x08\x5d\xa0\x4b\x70\xb5\x66\x39\x10\x41\xc0\xb7\xe2\xb3\xb7\x77\x8f\xf4\x09\x52\x0a\xf2\x50\x41\xfb\xbf\xdf\x91\x99\xa4\x4d\x11\xd7\xde\xe7\xf3\x39\xf7\xdc\x7b\xbe\x7b\xb9\x69\x9b\xc7\xcc\x6b\x26\x99\x33\x99\x0f\xde\x21\x7f\x39\xc3\xc1\x68\x18\x01\x33\xc5\xe4\xbe\x8c\x12\xc6\x33\x98\x46\xc5\x3d\x7c\xd9\x53\x66\x66\xd1\xd2\xa6\xf3\x91\x37\x41\xa7\x13\xa2\xee\xbf\x60\x08\x99\x74\x87\xe3\xe9\x5f\xc0\x09\x6c\x89\x0c\x33\xb3\x24\x47\xd0\xb5\x35\x97\x53\x5e\xe8\x8a\xb9\x94\x47\x35\x1c\x73\x62\xe1\x17\xc3\x31\x23\xeb\xe3\x43\x39\xe1\x3a\x90\x8b\x21\xc9\x87\xf9\x99\xa7\x22\x1a\x81\x43\x95\x0b\x1a\x8f\xc0\x90\xe4\x88\xb6\x1c\x45\x18\xf0\x22\x32\x37\xdf\x2c\x10\xc7\x0f\xc9\x54\x61\xfb\xab\x14\x16\x05\x8a\x1a\x23\xd7\x0c\x2d\x1c\xf1\x6b\x5a\xde\x0f\x74\x7d\xa0\xc0\x99\x50\x50\x0a\xdf\x35\x47\x22\xf0\x53\x75\x62\x97\x99\x7a\xf6\x55\x43\x21\x98\x3c\x51\x1c\xc8\xe5\xee\x7a\x8a\x83\x7a\x3d\xf6\xe6\xb2\x37\x91\xb5\x3e\x24\xaa\x61\x83\x61\x8a\x6f\x04\x56\xde\xc7\xde\x2a\x76\xf6\x5e\xe1\xda\x63\x34\x49\xc6\x4b\x39\xa7\x11\xb9\xde\xf1\xf1\x75\xc6\x67\xb9\xb4\x58\x5c\x4b\xc6\x02\x52\x6b\x1c\xf2\x32\x0e\x9e\x49\xe8\xf2\xcd\xef\xca\xf8\x2b\x5c\x2e\x89\xe0\x71\x12\x0c\x0e\x54\xe9\x2b\x73\xfe\xe1\x48\x52\x50\x9d\xbf\x2d\x8a\x2f\xca\xcc\xf9\x88\xe1\x31\x67\xbd\xa6\xcb\xee\x86\x8a\x0c\x30\xbc\xd3\xc5\xc1\xd3\x5c\x92\xc6\x6e\x49\xb1\xdb\x9f\x62\x7f\x4a\xb1\x3b\x34\x96\xdb\xa4\x02\x57\x25\xde\x52\x85\x25\xdb\x71\xff\xa0\x73\xae\x5d\x56\x0c\x78\x82\x81\x3e\x60\x8f\x79\xe2\xf8\x05\xa2\xdf\x2c\x50\xb2\x4d\x40\x9f\x5e\x67\xcc\xfa\x0d\x3c\xd0\x20\x90\xc9\xe1\xeb\x8c\x5b\xf4\x40\xb8\x42\xbf\xf4\x31\x57\x1d\x0c\xb4\x4b\x9f\xd1\x10\x01\x3f\xbd\x7c\x4b\xbc\xfe\x75\x2f\x12\x95\x79\xdf\xc6\x0e\x7b\x9b\xba\x89\x3a\xc7\x9c\x5b\xbc\x98\xf2\x33\xd1\x47\x46\x76\x1c\xbd\xb2\xe7\x15\x7f\x5e\xf2\xe7\x09\x7f\xf6\x66\xec\x79\x5f\x65\x7a\x07\x0f\xca\x19\xe3\x02\xce\xe0\xcc\x65\xb0\x44\x1d\x9c\x4c\x15\x5e\x1a\x57\x17\x4f\x77\x99\xdb\xa3\x25\x2f\xc5\x81\xe1\x98\x0f\xb6\x30\x14\xe6\x62\x47\x7b\x1e\x28\x92\x38\x04\xe1\xd5\xe7\x46\x49\xc0\xb9\x90\x71\xc7\x2c\x8a\x20\x1b\xad\x94\xa1\x00\x79\x7d\x6e\xc7\x8f\x79\x23\x0a\x68\x49\x20\x21\x02\xf9\x09\x6d\x19\x7f\x97\xdd\x4c\x85\x7b\x36\xdf\xce\xc0\x71\xd3\xfd\x11\x33\x52\x6a\x23\x16\x1c\x32\x32\xe9\x81\xa3\x87\x08\xa4\xf0\x7a\x33\x01\xef\x9c\x0e\x20\x0d\x40\xb6\xd6\x5c\x80\xb6\xb9\x16\xf6\x55\x23\x30\x61\x4d\x4f\xdf\x68\x25\xa4\x8f\xde\x4c\x35\x02\x6c\x6b\x4f\x5d\x62\xd0\x7a\xcf\x1a\x10\xbc\xa8\x29\xea\xfe\x6a\xb1\x0c\x70\x4f\x55\xb5\x0a\x25\x55\x07\x37\xba\x57\xaf\xa2\x7f\x1e\x79\x2f\x1b\x84\x0e\x2d\x0f\xdc\x4c\x03\x2f\x93\x40\xd2\xe4\x81\x8e\xf0\xd7\xc4\xde\x28\x27\x26\xde\x28\x64\xe9\xe3\x48\xfe\xb8\x7c\xa5\xf0\xee\xab\xd8\x36\x6c\x00\xe5\xca\x52\x85\x17\xd7\x19\x6f\x17\xa0\x66\x1d\x68\x67\x8e\xc2\x33\x8a\xc2\x7b\xbe\x42\xa3\x17\x91\x42\x61\x69\xa3\x2a\xb2\xb5\x51\x95\xe9\xcc\x24\x39\x4e\x5e\x85\x75\x71\x69\x90\x1c\x35\x3b\x1a\x0e\xa5\x28\x9a\x49\x43\x79\x56\x5a\x7f\xa9\x4f\xec\xc7\x75\xac\xd8\xda\x53\x63\x9f\xfe\x68\xed\x08\xe8\x2b\xa6\x9d\xcd\x73\x1c\xbd\xaa\x48\x74\x98\x68\xa1\x64\x5f\xf0\xe8\x93\xcf\x18\x3e\xfa\x0e\xbe\xee\x29\x8e\x76\xbe\xea\xfe\x60\x13\x6e\x18\xaa\x74\xac\x5d\x70\x57\x94\x11\xf0\xe4\x82\x23\x9e\xea\xb2\x7e\xa4\xe0\x19\x13\xa4\x01\x8e\xd0\x0e\xa0\xbd\x9b\x9a\x6e\x69\x7e\x9a\x4a\x8f\x4a\x18\x2a\x14\x95\x34\x66\x39\x2c\x73\xe2\x4c\xa3\xb2\x61\x8e\xf6\xe0\x83\xa6\x21\xdb\x1d\x28\xe3\xf1\x05\xf6\xb2\xc3\x34\xbf\x49\x12\xe9\x91\x19\xd1\x1d\x5f\x1c\x7c\xb5\x0f\xd1\x7d\xa0\x6f\x14\xb5\xad\x8d\x58\x45\x41\x36\x19\xf9\x9c\xac\xb4\x21\xcb\x11\xb3\x06\x27\x66\x13\x28\xc6\x83\x3a\xbb\xa3\x05\x55\xd3\xd5\x7a\xae\xa5\x8d\x3c\x74\x79\xcd\x7d\x13\xaf\x97\xe8\x9f\xe9\x37\x09\x2d\x09\x39\x66\xcf\xb1\x2c\x15\x91\x27\xc5\xd5\xbc\x88\x66\x4d\x93\x16\x21\xa9\xa3\x79\x91\xa5\x7e\x82\xe0\x68\xf6\x70\xec\x7a\x63\x4b\xcd\xf8\x00\xdd\x5c\xd2\x9b\xd6\x9e\x1a\x80\xa0\xe9\x58\x1f\xbd\x82\xa0\x5a\x80\x7c\xec\x98\x9b\xcf\x96\xf6\xb0\x40\x01\xf6\xcd\x23\x2b\xef\x33\x6f\x82\x7d\xec\x83\xf4\x87\xcf\x3c\x07\x86\x98\x87\x47\x98\x87\x8c\xb0\xa3\xb5\x2a\xda\x1b\x9a\xb0\x97\xf9\xb2\x60\xce\x20\x22\xe0\xbf\x6d\x6b\x27\x56\x29\x91\xc5\xf6\xc6\x17\xd8\x1b\x47\x68\xa2\x1a\x2f\x74\xa7\x1b\xa1\x49\x5e\xe9\xff\x9e\xec\x47\x7a\x21\x52\x45\x60\x5e\x09\x7e\x8f\xf6\x43\xbd\x10\xaa\x90\x92\xef\x7a\x23\xec\xd1\x7d\xef\x05\xcd\x90\xab\x1a\x57\xb4\x37\x46\xc8\x6e\x82\xb6\xce\x08\x2f\x39\xa0\x8b\x59\xfa\x51\x5f\x09\x12\x6f\xd0\x69\x2e\xb2\x9c\x8b\x8f\xf0\xeb\x98\x80\xbb\x3a\x6d\xe7\x1f\xe6\xf7\xf8\x22\x8c\x3d\xba\xe0\x8d\xc4\x7a\x0e\x7d\xb9\xad\xed\x20\xd6\x8d\xf0\x46\x57\xbc\x0a\xa2\xfd\x57\xa8\xa8\x90\xdd\x63\x6b\x96\x4f\xf3\x2f\x55\xe4\x42\xae\x88\x2b\x55\xa4\x40\x61\x45\xf0\xeb\x83\xd7\x4b\xa8\x91\x2b\x6a\xe4\xb2\x11\xe5\x3b\xcc\x88\xa2\x0b\x1d\x5d\x1a\x75\x9f\x06\xc1\xf7\x39\x6b\x8a\x03\xf3\xa4\xc8\x57\x79\xba\xb8\x60\x47\x6b\x47\x8c\x7a\x84\x4f\xd8\x32\x13\xf4\x12\x8b\xde\x7b\x71\x8f\x68\xdd\x0b\xc6\x7b\x82\x93\xb2\xee\x05\xfa\x74\x90\x16\x88\x29\x4a\x54\x44\xd8\xf6\x4e\x0b\xe9\x5e\xe0\xe2\x9e\xad\xf5\xc7\x66\xdb\xda\x87\x9b\xcb\xfe\x78\xb5\xe1\xe0\x8b\xb9\xb5\x0f\x8e\x3a\x39\xa5\xa0\x8d\x1c\x45\x55\xf5\xcb\x24\x28\x40\x7c\xcb\x57\xe9\xa2\x41\x0b\xd2\x4d\x49\x5d\xba\x2b\xaa\x7b\xfd\xa4\xd8\x5a\x50\x5d\x61\x2d\x97\xce\x85\x91\x67\x5c\x73\x22\xd6\x46\xf3\x06\xf2\xe8\xac\x54\xa5\xb0\xc5\x94\x80\xdb\x33\x39\xec\xec\x10\x79\x7c\x0e\x42\xc1\x92\x9d\x66\x49\x8a\xd4\xc6\xa7\xa0\x02\x69\x5b\xaa\x61\x63\x4a\x0f\x98\xb6\xc4\xa2\xd8\x6a\x2a\x28\x64\x8b\x4d\x81\xae\xc7\xa3\x27\x30\x89\x9f\xdd\x91\xec\xe5\x45\x73\xe9\x1c\x86\xb1\xbf\xbd\x66\x62\x42\x8a\x8c\x99\x51\x7d\x3b\x97\xb3\xb5\xe8\x52\x64\x7c\xa2\x70\xcc\x26\x25\x38\x9a\x16\x98\x34\xd5\xee\x66\xc8\xc6\x41\x5f\xb1\xcd\x4d\x3a\x46\x66\xd3\xc2\xb8\x39\xd9\xb7\xb5\xab\x08\x53\xf6\x1b\x02\x5a\x13\xb8\xfb\xa6\x41\x45\x4a\x87\xbe\xd9\x78\x7e\xa2\x08\x15\xb7\xb9\x63\xfa\xcf\x96\xc2\xac\x0d\x38\xe8\x6e\xa6\xbb\x70\x85\xa0\xdb\xb1\x1a\xc7\x2a\xb8\xde\x0d\x0c\x57\xeb\x3a\x8a\x8d\x2e\x9a\xa0\x5f\xcb\x3e\x9a\x13\xe9\xa3\x25\x7f\x04\x93\x0c\x35\xfe\x24\x3a\x80\x9f\x98\xda\xfc\xb8\x74\xde\xd0\x97\x4c\xe5\x06\x13\x61\xdd\x76\xd1\x60\x67\xa3\x17\x89\x15\xdc\x03\x1e\xd2\x9c\xe8\xf0\x6c\x25\x69\xab\x8d\x18\x42\xdc\xe6\xd7\xf0\xbc\xe6\x32\xbc\xd3\x57\xf2\x15\x40\xbf\x19\x7f\xe1\x4b\xeb\x4a\x42\x92\x0e\x7b\x37\xab\x3e\x72\x10\xf1\x91\xbb\x4f\x7c\xfd\xde\x43\xe7\xe8\xde\xb3\x64\x66\x44\xa6\x48\x80\xfc\x7e\xf5\x18\xa1\x60\x0f\x41\x81\x43\x32\xfd\xf7\x69\x7f\xd5\x6e\x66\x0a\xa3\x56\xd6\x1d\x70\x05\x10\x06\x19\xa9\x50\x96\xd0\x01\xb5\xd5\x57\x8f\x79\xf8\x07\x53\x31\x8e\xb9\x65\x61\x4c\xfc\xfd\xf5\xa2\xbe\x5e\x82\x6d\x63\x5b\x0a\x10\xde\x26\x1d\x60\xc3\xd9\xe9\xb5\xaf\x0b\xf3\xcd\x14\x17\xe6\x0d\x86\x0c\xd1\xa5\xee\x31\x8c\x78\x9f\xb4\x75\x1f\xbd\x8d\x75\xc7\xfc\x69\xed\xd3\x1f\xee\x95\xa3\xa9\x3b\xe6\x8e\x04\x3c\x8e\x59\xcf\x1e\x65\x21\xba\xcd\xd5\x10\xdb\x11\x40\x44\xe7\x3d\xfd\xb4\xa7\x50\x50\x2a\xba\x59\xe8\x8e\x59\xce\xc2\x5c\x32\x80\xcc\x3c\x7f\x24\x7d\x77\x97\x3d\x6c\xb1\xa1\xf7\xba\xb6\xe2\x32\x79\x44\x10\x50\xa4\xe4\xba\x4b\xf9\x46\x47\x3b\xa9\x53\xc2\x8c\x8f\x67\xf0\x46\x90\x27\xcf\xd9\xfb\xaf\x4e\x6e\x04\xd5\xc5\x8f\x3e\x5c\xed\x3c\xeb\x09\x0f\x13\xba\xf3\xa2\x08\xd3\x98\xc0\x42\x23\xec\xc1\x7e\x1b\x54\xcd\x88\x93\x15\xc6\xe5\xb5\xc2\xb6\xa7\xf5\x12\x1a\x21\x73\x02\xd4\x04\x9a\x37\x54\x83\x3c\x29\x51\x4a\x50\xf0\x44\x45\x48\x44\xe9\x09\xba\xa2\x01\x4d\x91\xc9\x2e\x48\x0a\x74\x76\x08\x56\xf4\x80\x74\xb3\x91\x2f\xb7\xe7\x72\xc9\xc8\x80\xa8\xad\xbb\x4f\x09\x15\xdd\xd1\x1e\x6a\x28\xc4\x8e\xd6\x73\x0d\x25\xe0\x6a\x75\xc1\x3e\x5d\x04\x03\x14\x5a\xaa\x44\xac\x4e\xc1\xe3\x11\x7f\x7e\x7c\xd0\xbd\x41\x76\x75\xca\xd9\x18\x76\x44\x6c\x44\xb8\x6f\x86\x16\x37\x50\xc0\xe9\x89\x7e\x93\xd2\x10\x91\x76\xd6\x46\xb7\xcd\x94\x22\x65\xa2\xcc\x91\x76\xda\x16\x56\x07\x44\xc2\xd3\xb6\x39\xb1\xd0\xe9\x9c\xa8\x46\x84\x99\xbb\xa0\xbd\x48\x1b\xb8\xc2\xfb\xf8\x08\x17\x8d\x91\x10\xd8\x1c\xa9\x3d\x5f\x99\xc0\x30\x4d\x88\x12\x21\xdf\x1c\x59\x94\x9e\x86\x49\x38\x81\xc9\x3a\x6f\x20\x47\x8b\x2e\xf9\x6c\xf5\xf8\x93\xb6\x5d\x4c\x61\x4b\x45\x41\x2e\xc7\xdb\x68\xd6\x2c\x65\x92\x31\xbe\xd1\x6f\x4a\x76\xde\x6d\xad\xcf\xd9\x48\xd8\x09\xe8\x44\x55\x4a\xbf\xb1\xab\x8a\x8d\xca\xc1\xf8\xb6\xb9\x5f\x04\x2f\x39\x2e\xff\x72\xf5\x42\xc9\x70\xf8\x47\x49\xe7\x9e\x1b\xf8\xc1\x9a\xe1\xaf\x63\xd7\xf0\xf3\x58\x72\x8b\xe9\x5b\x4c\x41\x01\xde\x4a\x96\xe1\x63\xec\xed\x13\xe6\x37\x19\xf5\x55\x9d\x80\x53\x61\xd4\x57\x63\x6e\x03\x3b\xe3\xfe\xe5\x5a\xc6\xe5\x04\x8f\x0d\x07\x07\x4f\x8a\x03\x4e\x7a\xbe\xf0\x07\x66\x9b\x57\x73\xab\x40\xe8\x6f\xbc\xec\xdd\xcb\x59\x42\x7c\x87\x1d\xfc\xf9\x8c\xba\x82\xfe\x0e\x91\x79\xe4\x23\xb7\x29\xaf\x8e\x7d\xad\x1d\xa1\xbe\x76\xde\x43\x7d\xed\x66\x21\xfa\xdb\xf0\x19\xd2\x86\x74\x61\xf4\x6d\xcd\xdd\xc1\x18\xdf\x4c\xf6\x7d\xed\xda\x55\xfa\xe6\x9d\x63\xa1\xbe\xf6\x86\xfa\xda\x1c\x6d\x15\x51\xaf\x4e\xff\xde\x89\xad\x7b\xe9\x85\x72\x9f\xd6\x92\xdf\x29\xf7\xd9\x11\x8b\xe6\xd8\x8a\x8a\x86\xfc\x5e\x5b\x04\x5e\x78\x28\x74\xf4\x73\x64\x0f\x43\x97\x2e\x8d\xd7\x1e\xfd\xed\x38\x74\x91\x41\xa1\xaa\xfb\xda\xd0\x53\x44\x69\x0c\x2a\xcf\x4a\xab\xd7\x07\xd2\xc0\x6d\x42\x43\xf8\x61\x81\xd9\xb7\x70\x08\xa4\x8c\xec\xb9\xe3\xd3\x5a\x0e\x7b\xe9\x7d\x55\x1b\x57\x8d\xc7\x25\x7b\x34\xc2\x37\x8a\x36\xae\x22\x02\xea\xe2\xbc\x14\x42\x8b\xc0\x61\xa8\xf0\x63\x15\x93\x58\xb2\x17\xba\x92\x7c\x42\xc4\x78\x2b\xd3\xb5\xd4\x18\x18\xab\x47\x06\x6f\x45\x39\xee\xaa\x42\xd2\x12\xb8\x86\xf8\x80\x72\x6f\x9a\x13\x0e\x23\xef\x6c\xe8\x7a\x0a\x25\x1f\x1c\xa0\x71\x90\xdf\x24\x94\xde\x60\xa6\xb4\xb3\x74\xd4\xa3\xac\x81\xa8\xd5\x7b\x29\x53\x53\xef\x31\x6a\x02\x38\x99\xab\x57\xe3\xfa\x88\x28\x8e\xf6\xf4\x08\x78\x69\x74\xe0\xab\xcf\xbf\x6e\xe0\x2b\x64\x5f\x71\xfc\x8d\x9d\xfa\x64\xce\x1d\xaf\x92\x23\x1f\x55\xbe\xf7\x3d\xe9\x89\x2b\x3c\x20\x64\x45\x18\x27\x77\x02\x7e\xf2\xf3\xca\x33\xdf\x57\x79\x04\x3f\x67\x32\xf8\xe1\xd3\x27\x10\x9c\xc1\x15\xf1\x52\xe2\x93\xd7\xcf\xe5\xbd\x4a\x89\x4f\x5e\xa5\xc4\x97\x9f\x13\x5f\xca\x89\x2f\xe5\xc4\x57\x9f\x13\x5f\xc9\x89\xaf\xe4\xc4\x47\x9f\x13\x1f\xc9\x89\x8f\x78\xe2\xb3\xe5\x03\x5a\xd6\xb5\x7f\x7b\xea\xcb\x92\x2d\x6a\x2b\xa4\x5e\x79\xb1\x94\x8b\x96\x8e\x15\x6f\x52\x89\x83\x44\xa0\x04\x36\x81\xc5\x39\xab\x51\x83\x1f\xf1\xdd\x3e\x71\x9d\xf8\x16\x37\x95\xe9\xb3\x9a\xa6\xb7\x3f\xdc\xe4\xc1\xcd\x9b\x65\x3e\xcf\x2d\x85\xd0\x37\x61\xc7\x80\x42\x3c\x88\x14\x98\x18\x22\xfb\x4d\xa4\xd8\x68\x38\x4b\x06\xbd\xc5\x42\x46\x34\x24\x81\xda\xa0\x41\xe7\x53\x36\x13\xce\xe8\xc7\xf5\x94\x08\x59\xa1\x36\xfd\xbe\xa0\xdb\xad\xcb\xe2\x2e\xa7\xa0\xd3\x0d\xef\x57\x34\x1d\xaf\x9a\xf0\x3f\xeb\x8a\x17\x5b\xbc\x38\xc2\xf8\xc0\xed\x13\x7e\x3f\xef\xe9\x04\x08\xa5\x44\xce\xf5\x4d\x77\xd1\x5c\xb7\x63\x4a\x66\xc7\x2d\xa2\xdc\x5c\x2f\x79\x9e\x66\x2a\xe5\xb4\x79\x37\xd7\x06\x91\xfa\x30\xe9\x0b\xd0\xeb\x30\x08\x6d\xb1\x10\xea\x1f\xfb\x34\xe0\xf6\x29\x09\xb8\x7d\xa2\x01\x8d\x59\x12\xd0\x98\xc9\x22\x4b\xc6\xe6\xa7\x92\xd3\xd1\x77\x99\x74\xb5\x8a\xb1\x1b\x31\x73\x8e\xc9\xe0\x86\xd9\xd5\x8d\x7b\x9a\x2e\xec\x20\xf1\xc7\xbb\xfe\x7c\x80\xb9\x1b\x62\xcd\x7b\x1b\x91\xc8\x05\xa7\x17\x78\xeb\xfb\x55\x5f\x21\xea\x8f\x1d\x96\x6a\xb1\x09\x10\x2e\xfa\x8a\x43\xe9\xe1\xb0\x09\x26\xe9\xee\x36\xbf\xb8\x40\xb7\xb5\xf6\x2d\xf8\x4a\x7e\x58\x68\xc4\x51\x28\x8f\x16\x12\x85\x68\x21\x99\xc2\x6a\x09\xef\x51\xa0\x1a\x64\xcf\x65\x17\x7c\xfb\x24\x8f\xb7\xcb\x45\x9d\xfc\x76\xd9\x5d\x1e\xa5\x65\x0a\x34\x88\xd6\xe6\x8a\x77\xcd\x62\x53\xfd\xb1\xf5\xc3\xf9\xa1\x78\x66\xd5\xfa\xa1\xb8\xec\x26\xb0\xe0\xf2\x7b\xc3\x44\x22\x74\xdc\xd3\x4d\x3b\xef\x20\x92\x77\x2c\xf4\xd4\xd5\x4d\xbb\xe0\x20\x52\x00\x55\xbd\xa4\x87\x06\xd9\x1e\xba\xa7\xec\x76\x73\xb1\xda\x07\xe6\x79\x0f\x83\x89\x4d\x20\xf3\x53\x83\xf3\xfc\xf0\x47\x9c\xf7\x38\xf8\xb4\x0f\x66\xd6\x8e\xfb\xc2\xb5\x11\xf3\xc2\x7f\xdc\x07\x2a\x37\xef\xb2\x13\x1f\x97\x29\x5e\xc1\xa9\x8f\x4a\x11\xf8\xaa\xaf\xb8\xd0\x51\x92\xb3\x6a\x67\x4f\xfb\xf5\x5d\x76\x8e\x7e\x2b\xb1\x36\x6c\x2b\x08\xf0\x3a\x3b\x1a\xcb\xe5\x5a\x14\xed\xeb\xaf\x62\x42\x0d\xc5\x39\xbf\x6d\x0b\xa9\xe8\xd9\x21\x9f\xcc\x6d\x76\xf8\xd0\x1c\x29\xb7\x4b\x78\xc5\x37\x85\x75\x0e\x3d\x6d\x27\x9d\x92\x09\xfb\xab\x32\xa3\x2a\xda\xe5\x3d\x3b\x09\x15\x46\x2c\x84\x10\x9f\x76\x37\xc3\x78\xde\x48\x70\xd8\xdc\xb4\xb4\x49\x3b\x97\x73\x38\x9f\xa0\x1a\x50\xae\x76\x79\x8f\x3f\x15\x4d\x19\xe2\x75\xec\x37\x33\x45\x03\x84\xab\x88\x9b\xfb\xa7\x1f\x37\x8b\x4c\x02\x3b\x97\xa3\x83\x69\x23\x88\x3c\xef\x49\x75\x1a\xf2\x6a\xf3\x7e\xb9\x6d\x0b\x2b\x84\x9f\x04\x2e\x84\x94\x52\x5b\x5a\xb2\x87\x74\x5e\xbe\xb7\x23\x1d\x00\xb7\x23\xca\x01\xf1\x32\x62\xe3\xe2\x82\xab\xe9\xd8\xa8\xa8\xc6\x2a\xda\x2e\x16\x25\x8b\x1e\x69\xc1\x89\xc5\x0e\xe9\xca\x23\x6a\xa6\x7b\xf0\x3a\x81\x72\xd2\x16\x09\x2e\xdc\x6c\x0a\xce\xcf\x6b\x32\x0e\x78\xd1\xd0\xa1\x93\x0d\x9b\x75\xea\xbe\x83\xd7\x4b\xba\x72\x47\x17\x72\x04\xb6\x3e\x13\xec\x61\x0c\x9e\xcf\x33\x56\x1b\x3a\xe8\xd7\xf2\x8e\x74\xe0\x68\x02\x63\xb7\x29\x48\x63\xf8\xb4\x9b\x02\x70\x2e\xb7\xee\xee\xdf\x53\xb0\x3a\x58\xf6\x64\x9d\xce\x43\xee\x98\xf3\x89\xe4\x2a\x14\x63\x4c\xb4\xd9\x21\x88\x4b\x08\xb8\x48\xe1\x90\x3e\x3e\x1c\x35\x97\x1b\x35\xd9\x6d\x77\xd2\x46\xa8\xd5\x41\x43\xb0\x8a\xa2\xfc\x7d\x85\xa5\x64\x8d\xd1\x69\xf3\x90\xb3\xc4\x57\x52\x56\x33\xe9\x48\x96\xfc\x1d\x2a\x66\xd0\x5a\x88\xf1\x25\xab\x06\x77\xc6\xc5\xe9\xee\xae\xf9\xde\xaa\xa2\x9d\xa2\x6c\x9d\x01\x9a\xf6\xce\x06\x84\x25\xbd\xb8\x50\x08\x1f\xe2\x24\xd5\x90\x15\xca\xdd\xb1\x11\xed\xb6\x9d\x9a\xa0\xa5\x5f\x2a\x22\x02\x8f\x32\x3c\xeb\x75\x26\x17\xf4\x58\x92\x6b\x76\x48\x73\xf1\x0a\xaa\xf1\xed\x3f\xdb\xf3\x13\xd8\xcf\xf2\x79\x39\xa3\x3d\xb6\x31\x93\xa2\x27\x68\x4b\xd0\x2e\x22\xc8\x4e\x82\x6e\x27\x44\xdc\x26\x5e\x6f\x63\x6e\x87\xf4\x19\x3b\x70\xbd\x74\x31\x50\x5c\xb3\x5e\xb5\x14\xc7\x9c\x5b\x2a\xe2\xef\x9a\x17\xb9\xdc\x0f\xbb\xba\xcf\x33\xd0\xb0\x02\x7f\x37\xe7\xec\xd8\x81\xdf\x3e\xfa\x04\x4b\xfe\x6c\xc7\x4b\xdb\x12\x4d\xb7\xb4\x2d\x13\x9a\x07\xcc\xc9\xc2\x1b\x14\x6a\xab\x12\x5d\x20\xa5\x6c\x3e\xab\xe0\x81\x52\xbb\xde\xce\xe5\x6c\x78\x83\x0a\xec\x3b\x58\x21\xda\xe5\x76\x9e\x68\x57\xdb\xea\x8f\x2d\xdd\xde\x93\xa2\x68\xa0\x6e\xff\x86\x10\x5a\x73\xc0\x5c\x9a\x3c\x35\xda\xb6\x4e\x41\x0a\x19\xbc\xc4\xff\x35\xa1\xfd\x25\xdc\x2e\x42\x15\xab\x4f\x20\xa4\x02\x90\x91\x80\x47\xd1\xb7\xf6\xa4\xd0\x62\x10\x05\x8b\x14\xbb\xc0\xd3\xa8\x3f\x28\xe0\xd4\x8a\x06\x38\xe7\x65\x3a\x41\x4e\xe6\xc6\x61\x92\xed\xa8\x0b\xba\x46\xd6\x17\x40\xee\xc0\x7b\x6d\xc1\x48\x25\xe7\xb7\x9b\x8a\x45\x0b\x29\x5a\x8d\x0b\xca\xae\x29\x1b\x79\x27\xbf\xa1\xae\x0d\x66\x93\xe9\x9a\xed\xad\x91\xe9\xda\x60\x38\x99\xae\xa5\x09\x99\x1c\x2d\x4d\xe8\xe6\xcf\x3d\xa1\x0f\x76\x46\x8b\x68\xd0\xe2\x7c\xf6\x7e\xb8\x90\x29\x33\x4f\x8c\x80\x9f\xcb\x79\xbf\xfd\xd5\x15\x00\xb9\x5d\x0a\xd8\xfb\xbb\x1a\x24\x29\x7d\xa8\x82\x87\x1f\x3c\x90\x07\x63\xa7\xf8\xe0\xf1\xeb\x60\x41\xd0\x11\xad\x83\x8f\x1f\x1a\x44\xf1\x51\x8f\x80\x64\x8c\x38\x6a\xf2\x5e\x61\x0a\x08\x81\x51\x69\x66\x3c\xac\x52\x0f\x78\x60\xea\x01\x0f\x7f\xd0\xe5\x8c\x79\xec\xbf\xa9\x3c\x40\xcc\xa2\x95\xd5\xeb\x9a\x36\x97\x84\x5b\x45\xdd\x0c\xc6\xbb\x33\x61\x7a\x36\x7b\x3a\xb7\x40\x77\xb5\xaf\xcd\xc0\xac\xb9\x96\xa5\x88\xeb\xfd\x4b\x31\x6b\x9f\x09\x76\xb8\x51\x00\x2f\x52\x9c\xa1\x42\xd0\xe2\x10\x4c\x02\xd8\x85\x3e\xea\x63\xa7\xd0\x07\x6f\xfb\x75\x4b\x51\xec\x42\xa0\xfe\xd8\x52\x51\xc4\xbf\x9d\x42\x9f\x7e\x33\x40\xaf\x63\x61\x44\x20\x44\x11\x0a\x50\x5f\x35\x42\xcc\x63\xe8\xc8\xb7\x29\x1a\x3c\xbe\x10\x55\x65\xa7\x45\xa1\x39\xb6\x50\x84\x43\xb3\x6a\xa1\x09\xe6\xb5\xd5\xce\xef\x95\xd4\xdf\xf5\x08\x41\x39\xd1\xf7\x89\xaa\xa2\x3e\x2f\x74\xc4\x2a\x91\x0f\xcd\x23\x0b\x8d\x78\xca\x88\xa5\x1c\xfd\xa0\x29\x45\x75\xa3\xc2\x88\xa5\x64\xb7\xdb\xa2\x7a\x7d\x14\xa2\x00\x8d\xf8\x5c\x0d\x70\xc8\xc9\x6c\xa8\xc2\xdd\x14\x07\x9c\xab\x73\x05\xe5\x33\xc5\x5e\x22\xfe\xe0\xf3\xc8\x1d\x36\x8b\xce\x1a\xac\x60\xb6\x2c\x6e\x7d\x57\x78\x83\xcd\xb1\x95\x17\xaf\x55\x4b\x45\xa5\x1f\xdb\xaa\xe0\xd3\xde\xba\x04\xdf\xd1\xcc\xe6\xf1\x2b\x41\xed\x57\x62\xa1\xde\x81\x38\xac\xef\x12\x06\xf8\xe4\x95\xa0\x92\x6a\x7c\x63\x4b\xf1\x2d\xee\xd0\xc0\xd3\x86\x18\xbd\x67\x3c\xcb\x12\x26\x9d\x3a\x7e\x49\x42\x28\x13\x7e\xad\xb4\x8f\x78\xdc\x4b\x8f\x60\x6e\xc8\xe7\xa9\xcb\x19\xa6\x73\xbc\x09\xc5\x1c\xa1\xf6\x11\x41\xd7\x87\x3c\xa9\x5f\xc1\x57\x34\x9c\xd0\xe2\x7f\x6c\x8b\x50\x9e\xda\x7b\x25\xe8\xe8\x88\xa0\x8e\xc0\xa2\xa0\x82\x7d\x8a\x31\xa7\x47\x70\x58\xc3\x2b\x9b\x1e\xd9\xf0\xbe\x8a\x05\x55\x79\x47\xd9\x34\x82\xdc\x84\xce\x8c\x7a\xbc\x2f\xc8\x94\xa0\x73\xa1\x55\x77\xc6\xc2\xba\x52\xd8\xdb\x0e\x7e\xcd\xb6\x78\xd1\x25\xf8\x4d\x6a\x32\x54\xe4\xac\x4a\xe8\xfc\xbf\x63\x4e\x36\xd8\xe8\x55\x59\xe5\x1f\xdb\xa8\x3b\x44\xc7\xa2\xea\xd3\x29\x3f\x0f\xa9\xae\xe3\x4b\xee\xf4\x61\x8c\xdf\xa3\xe1\x78\x40\x42\xdd\x65\x87\x47\x5e\x6c\xb8\x18\xfc\x01\x1e\x57\x45\x95\x1f\xbb\x84\x05\x9d\x26\x41\x0f\x5d\x82\xdd\xfd\xdb\x90\xe8\x37\x21\x17\x9a\x19\xdc\xb3\x44\x47\x49\xa2\xab\x1e\xc1\x25\x2e\x7d\x4f\xee\x78\xe1\x23\x3e\x43\xe4\xb3\x09\xaf\x8a\xbf\xf5\x0e\xf8\xa4\x6a\x48\x11\xaf\x5d\xc2\x46\xe7\x2c\xe9\xbf\xcd\x2e\x63\x20\x43\xde\x11\xda\xdd\x14\xf8\x00\xc4\xf9\xb5\x22\x77\x95\x2b\x11\x1f\xf3\xe6\x27\xe7\xf4\x45\x38\xb6\x79\xad\x82\x4b\xd9\x3d\x17\xdc\xca\xa6\x82\x04\x10\xe3\x58\xda\xe8\x5e\x3b\x67\x5e\x95\x40\x36\xd0\xf0\xf7\x82\x54\x16\xb5\x8f\x3d\xd3\x87\xd3\xd1\xbe\xd6\x73\xa5\x2d\xaf\x9f\xb9\x68\x49\xcd\xb6\x65\xb7\xa7\x2a\x7c\x12\x8a\x0f\x89\x8b\x7e\xfb\x93\xc0\xe7\xa3\x42\x96\xa4\x20\x5c\x93\x68\x3d\xd7\xc2\xef\x23\x4f\x4f\x54\xf0\x62\xc9\x06\xbc\xec\x96\xff\xe0\x73\xcb\x69\x37\x35\xaf\x91\x8b\x4b\x46\xa9\xf8\xdb\x35\x5c\xd1\x1e\x8f\xee\xff\xc0\x48\x16\x84\x08\xe9\x8f\x52\xf1\xbb\x9b\xe7\x5f\xc8\xe7\x09\x8a\x3c\x41\x31\x93\xa0\x68\x01\xfb\x3a\xaf\x2b\xa6\x2f\x64\x50\x2d\x04\xef\x00\xd4\x42\x66\x92\x0e\xde\x01\x12\xf2\x2c\xd5\x70\x98\x6a\x9f\x79\xed\x58\x8a\x83\x3c\x35\x76\xb1\x63\x4e\xe6\x96\x52\x3d\xa6\xac\x2c\x7b\xbf\xeb\x66\x78\x55\x87\xee\x82\xc8\xa5\xbf\x8c\x5f\x75\x40\xef\xcd\xa5\xbf\x56\x1c\xdf\xe1\x29\x30\xdc\xc6\xb7\x3b\xed\xb6\xbc\x42\x80\x39\x1d\xec\x9a\x60\xd3\xce\x5c\xa2\x5c\x3c\x29\xae\xf6\x50\x53\xd1\x05\x97\x83\x50\x55\xc3\x33\x4b\xd6\x6f\xde\x0a\x43\xa5\x5f\xc0\x65\xc3\x91\x25\x44\xee\xf1\xe6\xb2\x48\xe0\xca\x45\x55\x7b\xae\xee\x6a\x3d\x17\x39\x5e\x34\xf5\xc6\x6c\x75\xa8\x3f\xa6\xee\x9d\x1f\x6a\x7a\xa7\x07\x45\x22\x2e\x97\x76\xe0\x31\x52\x15\xb1\xe3\x01\x15\x79\x11\x4b\xe2\x45\x5f\x26\x89\x2e\xa1\x94\x75\x7c\x37\x22\x32\xbf\x5e\xcb\xa2\x1c\x45\xfa\x22\x28\x0b\x5c\x3e\x2d\xf9\x58\xa3\x78\x76\xd6\xce\x8a\xb5\xe4\x41\xa9\xd6\x70\xf3\xf8\xe0\x89\x99\x2a\x84\xb3\x05\x2f\x9f\xff\x8c\x75\xa6\xf3\xc3\x43\xee\x0f\xcf\x8a\xef\x68\xf5\x56\x74\x38\xef\x90\xb3\x36\xeb\x84\xaa\x9f\x6c\xe9\xda\x59\x5b\x45\xa7\x6d\xd6\xca\xd3\xb6\x68\x65\xd5\xcf\xb6\x32\x06\x0d\x84\xaa\xff\x07\xe0\x7d\x80\x21\x00\xd4\x1f\x97\xf3\xdf\x69\xf5\xc7\x2f\x85\xd9\xe9\x20\x82\x11\xc8\x71\xcf\x10\x1a\x08\x63\x8b\x52\x05\x74\xbf\xee\x83\xb5\x0c\xc3\xe6\x76\x32\x1c\xec\x50\x54\x77\x55\xda\x43\xbc\x0b\xfa\x79\xff\xbb\xe2\x68\x6f\x05\x0f\xe6\x0e\x74\x19\x7b\x47\x76\x3e\xf8\xae\x94\x0a\x8a\xa3\xcd\x0b\x1e\x4c\x1c\xd0\x86\x64\xef\xaa\x25\x1b\xad\xc8\x0e\x99\x69\x19\x84\xae\x99\x92\x41\x20\x17\x83\x98\xc3\x6b\x75\xf5\xb9\xcb\xe8\x1e\xcc\x39\x25\x0a\x21\xf9\xbc\x97\x6a\x54\x80\x07\xe2\xf7\x70\xc8\xcc\xde\xeb\x3e\x3a\xbe\xd7\xdf\xe3\x38\x25\x53\x7d\xf5\xdd\xc7\xf5\x26\x93\x0b\x04\xc9\x8e\x1e\xdc\xa4\xa4\x07\xf4\x7d\x5c\x34\xfa\xec\x6a\xaa\x2f\x96\x8e\x10\xfb\x66\xdf\x32\x02\xed\xf8\xde\x0c\xb5\x76\x64\xe1\x30\x8e\x69\xbd\xcd\x1a\xa5\xbf\xe2\x46\x13\x1c\xc3\x26\xfa\x07\xe9\x02\xd5\x68\x2e\x79\x52\xce\x7a\x56\x4c\x97\x2d\xf0\x42\xe5\xe2\xe5\xa3\x22\x0f\x17\xb9\x62\x07\x91\x14\x3b\x6c\x68\x08\xa3\x0d\x89\xe9\xd3\xd1\x3b\xed\x2b\xae\x38\x58\x0a\xb4\x37\x14\x68\x73\x55\x35\xfa\x7b\x8e\x79\x35\xb7\xf2\x01\xfd\xcd\xe5\x14\x2f\x8f\xa5\x80\x42\x5f\x8d\x1d\xed\x66\x81\xbd\xdf\x10\x2a\x5f\x85\xd4\x9b\x9f\xbc\xcf\x11\xba\x41\x2b\x36\x65\x00\x88\xf6\xb6\xa3\xa4\x1e\xc8\x31\xf6\xf9\xe6\x60\x5a\x1c\xb7\x96\x04\x6d\x08\xa5\x91\xd0\x8c\xe8\x84\x12\x44\x08\xa4\x87\x7c\x54\xa3\x11\xaf\x5d\x12\x53\x02\x31\x84\xdb\x03\x32\xa5\x74\x21\x28\x5e\xb0\x80\x28\xa0\x6b\xa4\xe9\x20\x27\xbf\x5d\x2e\x22\xa7\xb0\x5d\x2e\x5a\x4b\xe2\x98\x6e\xf6\x0e\x13\xbb\x66\x48\x09\x49\xa2\xbd\x36\xe8\xdb\x04\x47\x5a\xfb\x96\xdd\xf3\x05\x7b\x13\xb6\x4a\x7f\x7c\x04\xbf\x27\x5c\x6f\x20\x1d\x88\x19\x2e\x1a\x33\x71\x4f\x36\x63\xf0\x5e\xb0\x63\xce\xf8\x35\xe1\x0b\xcb\x5e\xb2\x3e\x3e\x5e\x58\xf6\x92\xa5\x8a\x64\x84\x2e\x7d\x91\x76\x3b\x45\x91\xf6\xb0\x40\x23\x64\x06\xe8\xc5\x52\xd1\x02\x73\xf3\x94\x76\xbe\xe3\xe5\x23\xad\xe7\xd2\xe7\x4c\x45\x07\xd8\x6d\x8a\x43\x69\xcd\xb7\xb5\x11\x53\x2b\xe2\xef\xfb\x07\x98\x68\x53\xad\x0e\xc7\x58\x2c\x88\xf1\xd8\x3c\xf5\x43\x33\x4d\xfd\xd0\xfc\x94\xfa\xa1\x99\x49\x7d\x2f\xa5\xbe\xff\x9c\xfa\xbe\xa9\xea\xdf\xa4\xe4\x76\x2d\x65\xa9\x7d\x5b\x73\x6a\x69\x6e\x5b\x7a\xa7\xe1\xca\x01\x3e\xa2\xd8\xa2\x4d\xcd\x96\x25\xe0\xd9\x35\x15\x65\x43\x9c\x1a\xdd\x6c\xfa\xa0\xb7\xd2\x8e\xf4\x05\x0a\x89\xed\x85\xfa\x01\x3a\xef\xe9\x36\x7a\xd3\x5f\xe8\x76\x39\xd7\x5f\xe8\x42\x4c\x59\x41\xdd\xe3\xc6\xa5\x7c\x74\xb3\x80\x53\xc2\x38\x86\x8b\xe4\xbe\xd9\xb6\x98\x51\xf1\x44\xe4\xa3\x2f\x61\x6e\xb3\xf9\x49\xea\x72\x3a\x42\x1e\x76\x4d\x87\xee\xf1\x1e\x9d\xc4\x4c\x32\x68\xdd\x4f\x8f\x0d\x53\xd1\x0c\xba\x20\x8e\x1d\x4b\xe9\x80\x71\x71\xb0\x30\xf7\x5a\x65\x17\xa5\x80\x50\x01\xe5\x71\x4e\x23\x85\x68\x36\x6a\xbc\x12\x15\x10\x6d\xb3\x4b\x90\x87\x47\xda\xdd\xa6\xe2\x99\x6f\x70\xf5\x39\xba\x47\x91\xca\x5d\x34\x1d\xf7\x15\x5f\x7b\x43\x3e\x9c\xfe\xe2\x91\x76\x3e\x40\x23\x3c\xd2\x16\x9b\x68\x82\x7d\xed\xcd\x98\xe4\x47\xe6\xd8\xfa\x1d\x99\x8e\x4b\xa7\x29\x04\x16\x68\x10\xe3\xbe\x67\xd8\xd7\xe6\x85\x91\x59\xb5\x8c\xd9\x5e\x44\x17\xe8\x5c\x4e\x81\x40\x21\x5c\xd7\x0a\x95\x09\x9a\xa1\x11\xd8\xa1\x02\x89\xe8\x10\x53\xe2\xc8\x43\x21\x9d\x3e\x74\x9f\x0e\x28\xd2\x39\xf9\xf1\x80\xa0\xdb\xa9\x1e\xa2\xf6\xad\xee\xa1\x87\x85\x3e\x42\xe7\x74\x5b\xe9\x6b\xe7\xe8\x5e\x21\xda\x6d\x19\xd1\xb5\x91\xc9\xd8\x3d\x5c\xab\x6a\x6c\x04\x62\x79\x66\x6b\xa3\x2b\xd6\xc6\x10\xbb\x66\x1f\x74\x22\xb8\xaa\x43\x98\xcb\xf5\x9e\x94\x00\xb1\xc5\x83\x72\x65\xa6\x23\x9d\xc1\xb7\x23\xdd\x46\xad\x8a\xee\xa3\x97\x9e\xf7\xaa\x3b\xa8\xb9\xd0\x03\x79\xd1\x69\x65\xcf\x40\x5f\x7a\x44\x9c\xb7\x10\xed\xf2\xf9\xe3\x63\x9d\x3e\xb4\xbb\xfe\x0a\x71\x1a\xa2\x05\x15\x73\xee\x58\x8c\xee\xa5\xdc\x1a\x5c\x59\x02\xb3\x86\x7c\xfc\x3e\x1d\x8e\xf4\x22\x0a\x3d\x7f\xaa\x17\xb9\xde\x2e\xa1\x5c\x10\xee\x04\xfb\xee\x77\xa2\xf9\x15\xdd\x83\x87\xb0\xe3\x57\xd2\x76\xbe\x3b\x19\xa5\x61\x9a\x1e\xd9\x74\x09\x0b\x2a\xc8\xd9\xd4\xdb\x87\xc8\xdd\xd4\x89\x36\xbc\x8b\x0d\x10\x40\xa4\x95\x38\xc7\xd8\x3e\xfe\xf8\x60\x6f\xb7\x55\xb2\xbf\xfd\xdd\xe1\x25\x5d\x75\xf7\xbd\x82\x53\xf0\xcd\xb1\xa5\xb3\x97\xaa\x65\x3c\x12\x90\xdf\xce\xe6\xbb\x3e\xdc\xa7\xa5\xa7\xf9\x5c\x9e\x5c\x77\x39\x00\x95\x65\x04\x01\x48\x68\xe5\x91\xa5\xb2\x4a\xe4\xa1\xd5\xb2\xb1\xab\x83\x6b\x85\xf6\x1b\xf2\x11\x9d\x89\x27\xb2\x70\x70\x7b\x05\xfd\x3c\x0b\x43\xa1\xab\xa7\x4d\x41\x3d\x2d\x9f\x77\x55\xb1\x05\xc0\x8c\x76\x91\xad\x22\x07\x3f\x0c\x80\x9c\x5d\xb5\xef\xbd\x36\x65\xd7\x2b\xb0\x78\xcd\x0c\x69\xd4\xd6\x65\x7f\xa4\xa9\x62\x23\x40\x97\xec\x60\xf3\xb4\x64\xff\xfc\x8a\x5f\xbc\x3e\x23\x22\x7c\xd5\x9d\xc5\x5f\x19\xb1\xb7\xcf\xa4\xf3\xe0\xb7\x4f\x55\xf1\x6b\xff\x4a\x55\xc6\x82\x21\xeb\xd4\x11\x51\xbf\x2c\xfb\xaa\x47\xa4\xc2\x67\xab\xfa\x21\xd9\x35\xed\x0c\x22\xdb\x58\x0c\x47\x32\x72\x0d\x02\xcb\x8c\xec\x88\xee\x65\x45\x73\x90\x8d\x45\x4b\x04\x08\x76\xde\x2a\x7c\xfd\x34\x13\x38\xe9\x10\x1d\x67\x29\xb1\xf7\x51\x55\x37\x2d\x34\xa6\xbf\xb1\x38\x80\xd5\xc6\x7e\x2e\xa7\x38\xda\xa8\x8a\x4d\xfa\x61\xa9\x49\x4c\xd0\x82\x98\x31\xc4\x04\x2d\x60\x73\xfa\x63\xcc\x09\x00\x58\x75\xa7\x4c\xfa\xa8\x8a\x99\xa6\x1b\x7f\x5d\x74\x55\xe3\x51\x69\x9d\x2b\x36\x5c\x09\x7f\xb2\xa8\x64\xe3\x93\xe4\x62\x09\x14\x29\x3c\x2e\x24\xe0\x22\x1f\x73\xae\x5e\x63\x4c\x3d\x4c\xf8\x00\x27\x9c\x31\x43\x91\x42\x09\xf1\x73\xb0\x42\x09\x15\x55\x34\x13\x9c\xb9\x49\x2c\x83\x60\x85\x0f\x30\xb9\x33\xc1\xf5\xc7\x3c\xbd\xc6\x32\xd8\x3e\x0e\x53\x60\xc1\xbd\x91\xef\x43\xf3\xe9\xae\x05\x02\xf9\xc8\x05\xb5\xb3\x85\x58\xd6\x89\x79\xfd\xc6\xb5\x8f\xe8\x0b\x25\x86\x69\x3f\xd0\xf4\x67\x17\x70\x62\xb9\x5e\x42\x0b\x14\xa0\x17\x6e\x1b\x15\xf1\xc3\x04\x55\x55\x55\x7d\x96\xcb\x5d\x3f\x29\x33\xed\xf8\x5e\xbe\x73\xeb\xab\xef\xb4\x63\x99\x1a\xa0\xe1\xe6\x72\x9f\x21\x8a\xd2\xb5\xb7\x02\x5d\x3e\xe6\x05\x5f\x45\x81\x14\x4a\xc3\xd4\x4f\x25\xc6\xe8\x5b\xca\xd8\xa4\x87\xe7\xda\xed\x13\xf7\xae\xf7\xc5\x90\x1d\x07\x89\x68\xd4\x09\xc3\x1a\xed\xf6\x49\x3b\xef\xb1\xe7\xa8\xc9\x48\xc2\x55\xc3\x72\xdc\x57\x68\x1a\xb0\xa8\xf4\x86\x92\xd7\x39\xc3\x16\xde\x26\x0f\x96\x25\xa9\x59\x01\x34\x2b\x60\xcd\x4a\x46\x97\xc0\xd0\x92\x64\x5c\x03\xd1\x3e\xc2\x1a\x27\x13\x52\x33\x70\x01\xfd\x0e\x06\x25\x74\x41\x87\xf0\x4a\xf3\x14\x6a\x8c\x1c\xad\xde\xc3\x6c\xd3\x31\x3d\x2b\x01\x61\x6b\x8d\x19\x20\xf7\x53\x03\x73\x6a\x42\x6b\xcc\xb4\x76\xc4\x9e\xe7\x3d\x55\x5a\xf3\x52\x9d\x2d\x59\xc4\x8c\xd2\x47\xfb\x8e\x6e\x1b\x84\x9b\xae\x22\xa0\xc2\x6a\x4e\xc1\x59\x27\x9b\x21\xe5\xe2\x77\x85\x14\xc0\x52\x25\x44\xb8\xa0\xd2\x6a\xd6\x2d\x85\xc6\xb8\x05\x22\x15\x93\x3f\x3b\x20\x79\x92\x3f\xf5\xc0\x79\x42\xde\x96\xe6\xf1\x51\x33\xab\xd0\xcb\xea\x71\xe9\xa3\x13\x5f\xcd\x4f\xbc\xfc\x29\xdc\x83\x7a\x01\x5a\x64\xc4\x0b\x4f\x3e\x93\x49\xbe\x0d\x7b\xe6\x94\xee\x97\x5e\x34\x1d\xf7\xbc\x09\x5d\x0c\x50\x90\xe2\x8a\x4b\x89\xd0\x00\x7b\x8c\x72\x84\xaf\x8c\x65\x05\x37\x63\x59\xc1\xc1\x1e\x23\x00\x5d\x4a\x0f\x1a\x41\xfa\xe9\xc0\xe7\x11\x9c\xcf\x07\xcb\x66\x17\x24\xf8\xf7\x4d\xe6\x48\x30\xc0\x27\x57\x0a\xd1\x1e\xba\x04\x05\xea\xb2\x25\x06\x29\xfd\x43\x53\x44\x8a\x1b\xc2\x00\x9f\xc7\x44\x7b\xec\x12\xb8\xd2\x39\xb9\x50\x02\x44\x51\xd5\x6c\xb9\x74\xed\x31\x9f\xab\x20\x2d\xe8\xc8\xb7\x49\xae\x56\xff\x8b\xb2\x59\x4e\x0a\xb7\xfe\x97\x8a\x3c\x2d\x78\x52\xe8\x2b\xba\x0d\x54\x35\xc9\x7a\x72\xa1\x38\x48\xc2\x7e\x81\x95\x7f\x7a\xac\x17\x85\x37\x20\xe6\xef\x87\x09\x03\x8f\x41\x18\x98\xee\xbc\xc0\xd9\xba\xf9\xbc\x0a\x35\xb6\x4d\xd7\x92\x4b\xc8\xd4\xdb\x90\xf4\x4f\x5d\x86\xf8\xb4\x3f\xae\x88\x42\xbf\xe8\x36\xcd\x1b\xf1\x4d\x7c\x27\x15\xa6\x7d\x80\x82\x2f\x21\x27\xe6\x43\x35\xbf\x96\xcb\xd1\xdf\xcf\x25\xf8\x35\xa9\x04\xf1\xf9\x8f\x0b\x48\x5c\x8d\xc6\xff\x40\x85\x35\xc1\xdc\x6a\x76\xe3\xb2\x31\xc6\x97\xfb\xe6\xd6\xce\x0e\xe2\xff\x5b\x7a\x73\xa0\x00\x85\xd2\x18\x28\xa7\x94\x48\xd1\x4a\x29\x15\xca\x0c\xda\x66\xd9\x53\x87\x71\xa4\x76\x0c\xc7\x51\x4b\x91\x97\x48\x58\x92\xa6\x11\x24\x52\x16\x2d\x64\x23\x9b\x12\xa5\x5e\x75\x7f\x41\xd7\x17\xaf\xaa\xc6\x2a\x62\x42\xbd\x9f\x60\x53\xc6\x25\xad\xfd\xe3\x0a\xdf\x61\xfc\xc2\x67\x11\x0a\x05\x4d\x3b\xd1\xe7\x14\x52\x1b\xcf\x44\xdc\x5d\xa4\x57\x16\x43\x71\xb1\x71\x38\x90\xce\x94\xfd\xfb\xc4\x6b\xf1\xc3\x13\xc1\x7d\xee\x37\x32\xc2\x3c\xfe\xe5\x36\x89\x7f\xbd\x95\x65\xe2\xca\x49\xb8\xcd\x44\xb4\xce\x2f\x12\x99\x08\x76\x8c\x3d\x16\x17\x1e\x67\x07\xcc\x1d\xe0\xa5\x22\x2e\x14\xc2\x0b\x6c\x32\x85\xa9\xf5\x12\x57\x2d\xbd\x65\x9b\xe4\x54\xd0\x4d\x36\xdf\x9f\xc5\xee\x8c\x78\xa3\xb5\x4b\x1f\x71\x73\x17\xbe\xcd\xc1\x9d\x96\x21\x2f\x17\x70\xe1\xca\x27\xb6\x88\xbd\xa8\x60\x90\x6e\xb9\x99\x12\xe4\x83\xe0\xe9\x99\xb8\x43\x38\xbb\x57\xd4\xf8\x41\x79\x14\xe6\x67\x1e\xaf\xf9\x29\x69\xc6\xfe\x4c\x82\x3d\xc2\xb7\xcb\xed\x22\x51\x2c\xb5\x0d\x47\x7b\xad\xc2\x11\x84\xf6\xda\x90\x4f\xa6\x84\x99\x0d\x30\xd2\xc2\x75\x0b\x97\x8e\xcc\x59\xb8\x6f\x81\x64\x76\xe7\x56\xeb\xbb\x8a\x6a\x84\xb2\xe9\x45\xfc\x1e\x0e\xf5\xbe\x76\x3b\xd5\x9e\xba\xa8\xdb\x63\xaf\xe3\x5e\x6c\x84\xd0\x62\x9a\xcb\x9c\x39\x96\x42\xf9\x36\xca\x6e\xd6\xe0\x95\x9d\x75\x38\xa0\xa4\x3e\xc2\x3e\x9a\x08\xae\x2f\xd2\xde\x7a\xe4\x7b\xa8\xdd\x4d\xcd\xb1\x95\x87\xe7\x91\x85\x22\x6d\x2e\x42\xab\x2c\x14\x2e\xcc\x22\x73\xb0\xb0\x44\x62\xf9\xab\x6a\x51\x32\x29\xa4\xe5\x8d\x2c\xf4\x02\xac\x23\x1c\x64\xcc\x54\x14\x02\xf7\xc8\x4f\x30\x46\x2a\x65\x1e\x5f\x28\xf3\x08\xf1\x0f\x0b\x7d\xc2\xf8\xc7\x08\xf8\xc7\x90\xf2\x8f\x21\x7a\x41\x13\x34\xa3\xac\xa3\xc7\xeb\x4f\xbb\x14\x38\xff\x73\x9d\x32\x9a\xa3\x7b\x3d\x8c\xd5\xd8\xc1\xef\x8c\x15\x73\xb4\x4b\xc1\x77\x39\x14\x33\x9e\xba\x44\x77\xb4\xbb\x29\x3a\x5e\xe8\x9b\x91\xe2\x22\xb7\x8d\x22\x9f\xa0\x83\xae\x8a\x9e\x5e\x69\xdc\xb4\x8a\x4e\xea\xba\x33\x54\x5c\xb4\x38\x54\xd1\xdd\x4f\xfd\x81\xa6\x7b\x68\xa8\x08\x3c\x3f\x71\x53\xed\x1d\x1a\xf8\xed\xa6\xad\x52\xc6\xcd\xa7\xa9\xef\xda\x70\xb1\xe5\x64\x6e\xb5\x1c\xb8\xd2\x42\x2d\x4a\x01\x93\xb0\x17\x44\x7a\xb5\x8d\x26\xb6\x7e\x1e\x03\xab\x3a\xd1\x3d\x14\x54\xf5\x05\x6c\x57\x94\xe3\x4f\x49\x65\xca\xc3\x9a\x16\xaa\xf7\x98\x5e\xc5\x53\x83\x3d\xc3\x3e\x94\xc0\xf5\xa9\x5b\x0d\xa5\x98\x38\x5b\xa4\xf3\xaf\x28\x26\xa5\xd2\x7c\x05\x82\x5f\x12\x86\x7d\xbd\xdd\xe7\x4f\x85\x73\x3a\xde\x58\xc9\x68\x47\x9f\x2d\x5f\x17\x13\x3e\xe9\xf9\x89\xe0\x2a\x39\x97\x93\x32\x76\xa5\xdb\x7a\x1e\x2a\x16\x8e\x97\xd4\xa9\xe5\xed\xc2\x20\x70\x3f\x4a\xc4\x9d\x24\x88\xd1\xf0\xdb\x48\x22\x68\xa4\xc4\x6b\xda\x10\x73\x35\xf3\xd3\x32\x7d\x4f\xa4\x92\x01\x0e\xb9\x93\xe7\x4f\x80\xdf\x63\x14\xe1\xa2\x11\x49\xac\x25\xb7\x1d\x31\xc2\xb6\x19\x59\x90\x85\xe2\xc9\x48\xda\x8e\x47\xc2\xba\x04\x9c\x3a\x46\xa2\xb3\x26\x74\x1f\x32\x47\x16\x08\x6a\x46\x68\xe4\xe9\x6c\x63\x98\xa8\x74\xc1\x25\xf8\x3d\xa8\xea\x01\x1d\x1e\x76\xe4\xec\xa8\x74\x90\x38\xb1\x67\xa9\xe9\xc8\x94\x90\xb8\x7a\x83\x7e\xa6\x8d\x7d\xb9\xdd\x0f\x14\x55\x27\x74\x81\x0c\xe2\xda\xeb\x92\x5f\x77\xd6\xee\x54\xb4\x55\x95\x05\xbf\x4a\x14\xc4\xdb\x9b\x9c\x25\xcb\x20\xb2\x8c\xdd\xaa\x05\x85\x7d\xbb\xd3\xb2\x1e\x7a\x84\xab\xb2\x97\x5b\x78\x67\x8c\x22\x1f\xac\x8f\x8f\x75\xfe\x66\x9e\x2e\xb8\xc0\xda\x50\x15\x62\xa7\xc7\x62\xa1\xbd\x5d\x20\x1e\x95\x34\x72\x8b\xb2\xac\x7c\x64\xce\x0e\xcc\x29\x68\x7a\x8a\xa2\xc2\x0b\xb3\x68\xa9\xb7\xdc\x6a\x8c\xb6\x08\x11\x49\xc5\x5e\x44\x8a\x92\x95\xf1\x47\xbf\x08\x8d\x2e\x13\xb0\x53\x0d\x4f\xbc\x5c\x80\xb7\x66\xb0\xa7\x04\xd9\x2f\xae\x65\x88\x5f\xed\x13\x87\x03\xcc\x3b\x86\xdd\xda\xaf\xf3\x6d\x8c\xcb\x46\x9f\x94\x05\xaa\x3d\x3c\x11\x45\x45\xc9\x26\x57\xe4\x57\x26\xd3\x51\xd6\xdf\x3b\x08\xcc\x0b\x3f\xf4\x2a\x87\x72\x51\x49\x1d\xc1\x6e\x5a\xda\xdb\x98\x63\x11\xf3\x33\xc8\xa4\xe0\xf6\x79\x8f\x6a\x63\x1f\xd3\x0d\xfe\x5c\x70\x86\x36\x2f\x75\xa8\xdd\x3e\x25\x9c\xf6\x3b\x9c\x5b\x8e\x9a\x4c\xfc\x6f\xd4\x94\xa4\x84\x59\x11\xb6\xf6\x06\xd2\x1e\xec\x7d\x1e\xc7\x4c\x40\x4a\x97\x4a\x81\xb5\x22\x0b\x5a\x45\x12\x32\xed\x14\xf9\xbd\xce\xeb\x52\x1b\xd3\xf6\x7d\x7c\x7c\xaa\x7e\xd0\xc2\x42\x3a\x31\x85\xfd\x9e\x0a\x2a\xd2\x4a\xaf\x97\xfe\xbe\xbe\x69\x55\x83\xd6\x3f\xab\xaa\x71\xa7\xcd\xfe\x50\xd3\x8b\x94\xd5\xa6\x49\xdf\x96\x92\x66\xa2\x25\xf3\x00\x82\xde\x13\x0c\x1e\xad\x00\xf0\xa9\xf4\x45\x58\x12\x06\x67\x01\x69\x33\xec\xa4\x19\x48\xc8\xeb\x6d\xab\x6a\x7c\xa7\x4d\xfe\x75\x6c\xc1\xe0\x88\x5d\xac\xdc\xdd\x39\x41\xc2\x66\xa4\x1d\xab\x46\x06\x5f\x38\x7d\xf5\x0a\x15\x87\x11\x7c\xf9\x43\xbf\xa4\x89\x85\xb8\x2a\x8c\xf9\xeb\x2a\x8a\x25\x3b\x87\xb5\xe3\x05\xc6\x07\x5d\x59\xcf\x95\xf0\x31\x81\x75\x06\x18\x3c\x24\xaa\x7c\x31\x41\xef\xc2\x14\x9e\xb4\x16\x31\xf5\x0a\x3e\x90\xb9\x5c\x76\x50\x25\xd2\x75\xf3\x3a\xab\x1d\x93\x2c\x24\xc9\xe5\xdc\x69\xd9\x8c\x40\x29\xc8\xd9\xa7\xdc\xb3\xce\xe5\x1d\xef\xb4\xb3\xfb\x4f\xe6\x67\x16\xa1\x36\x50\x16\x0d\x94\x21\x31\x27\xa3\xc4\xf9\x23\xc4\x57\x97\xe2\xa7\x4b\xf1\x07\x4b\xf1\xb3\xa5\x78\xaf\x99\x8d\x7f\x59\x8a\xf7\x97\xe2\x5f\x97\xe2\x4f\x5f\x49\x36\xc1\xdb\x88\x64\x0c\x02\x9f\x4b\x47\xd6\x02\x47\x56\x1e\x4f\x2f\x77\x16\xe8\x17\xda\xd6\x3e\x7f\x6a\xe7\x8c\x82\x88\xef\xb4\x56\x63\x69\xdc\x87\x97\x0a\x1f\x74\x30\x94\x22\x16\x52\x93\x58\x78\xbd\xf8\xc9\xb6\x8f\x50\x93\x49\xa8\x65\x9b\xbb\x7e\x15\x11\x8b\x30\x69\x61\x36\xe2\x76\xa1\xa6\x94\x3b\x8d\x78\x5c\xd6\x3b\xf9\x07\x6c\x1a\x6d\xef\x65\x93\xe0\xf7\xda\xf9\xa9\xfe\x5e\x3b\xbf\x39\xeb\x5c\xb5\xea\xd7\xba\xb9\x51\x2c\x6e\x6d\xa0\x8d\x62\x71\x07\x7e\x7f\xd1\xdf\x52\x09\x7e\xb7\xe1\xf7\x27\xfc\x42\x6c\xa9\x02\xbf\xbb\xf0\x0b\x29\xb7\x20\xe5\x16\xbc\x6f\x17\xe1\x17\xd2\x6f\x43\xfa\x6d\x08\xdf\x01\x38\x3b\x10\xbe\x03\x10\xca\x34\x57\xe9\xe7\x16\xfc\x6e\xc3\x2f\x4d\x5f\xda\x29\xc2\x2f\xc4\x42\xfa\xd2\x0e\x0d\x5f\xe9\xac\xac\xb5\xda\x63\xd9\x46\xf5\x5a\x76\x5b\x76\x47\x7f\xee\xff\x35\x07\x66\x14\xf8\xc1\xa9\xec\xca\x6c\xe3\xe0\xf2\x93\x3f\xb3\xdb\xaf\x9c\x9a\xd5\xfe\xe8\xd9\xec\xf8\x8f\xee\xcd\x52\xcf\x66\x14\x72\xed\xfe\x5f\xf6\x71\xf6\x6d\xa3\xde\xfc\xa3\xa7\xb3\xe3\xc4\xdd\xd9\xf9\x1f\x7d\x9e\xd1\x36\x1c\x1d\x25\xde\xcf\x28\x80\xa3\x93\xac\x1f\xb4\x8b\xac\x33\xb4\xeb\xc4\x23\xda\x4d\xd6\x2d\x1a\x2d\xb2\x79\xfa\x8f\x1c\xa4\x9d\x26\x5e\xd2\xce\xbf\x72\x95\x56\xff\x77\xfd\xa5\x3d\x7c\x72\x9a\xb6\x71\x52\x03\xcf\x69\xff\xdc\x71\x5a\x2d\xeb\x3d\xad\xf1\xf7\x2e\xd4\x68\x65\x4f\x69\x4d\x4e\x2f\x13\x8f\x6a\xd7\xff\x15\xb7\x6a\xb5\xc4\xb7\x5a\xe3\x93\x83\xb5\x6f\x9f\x3c\xac\xdd\x7c\xe5\x66\xad\xf1\x95\xaf\x35\x48\x47\xab\x7a\x41\x01\x5c\x5c\x7f\xe5\x7f\xad\xfe\xef\x3a\x61\x6b\xff\xbd\x27\xb6\xeb\xac\x3b\xb6\x7b\xd9\x27\xdb\x46\xa7\xc6\x1d\xb3\xd1\xa6\x64\xbd\xb3\x6d\x74\x8e\xff\xdb\x5c\xb4\x55\xb3\x7e\xda\x68\xaa\xdb\x56\xd6\x63\x5b\x43\xb8\x6d\xbb\x3f\x4e\x7c\xb7\x75\x96\x7d\xb7\xa1\xc5\xb1\x85\x4e\xeb\x9d\xab\xf3\x6b\xdd\x84\x32\xae\x0b\x3b\x45\xba\xf0\xc1\x4b\x49\xbc\x6c\x89\x97\x6d\xf1\xf2\x53\xbc\xec\x88\x97\xb2\x78\xa9\x88\x97\x5d\x3a\xf8\xf0\xf6\x8b\x07\x95\x04\xe8\x92\x00\x5d\x12\xa0\x4b\x02\x74\x49\x80\x2e\x09\xd0\x25\x01\xba\x24\x40\xc3\xaa\x0f\x2f\x02\xf2\x96\x80\xbc\x25\x20\x6f\x09\xc8\x5b\x02\xf2\x96\x80\xbc\x25\x20\x6f\x09\xc8\x5b\x02\xf2\x96\x80\xbc\x25\x20\x6f\x0b\xc8\xdb\x02\xf2\xb6\x80\xbc\x2d\x20\x6f\x0b\xc8\xdb\x02\xf2\xb6\x80\xbc\x2d\x20\x6f\x0b\xc8\xdb\x02\xf2\x4f\x01\xf9\xa7\x80\xfc\x53\x40\xfe\x29\x20\xff\x14\x90\x7f\x0a\xc8\x3f\x05\xe4\x9f\x02\xf2\x4f\x01\xf9\xa7\x80\xbc\x23\x20\xef\x08\xc8\x3b\x02\xf2\x8e\x80\xbc\x23\x20\xef\x08\xc8\x3b\x02\xf2\x8e\x80\xbc\x23\x20\xef\x08\xc8\x65\x01\xb9\x2c\x20\x97\x05\xc0\xb2\x00\x58\xde\x11\x03\x5f\x16\x10\xcb\x02\x62\x59\x00\xaa\x08\x40\x15\x01\xa8\x22\x00\x55\x04\xa0\x8a\xa8\x59\x45\xc0\xa9\x08\x38\xbb\x22\xd7\xae\x68\xd8\xae\xc8\xbe\x2b\xb2\xef\x8a\xda\xff\x12\x69\x7e\x09\x38\xbf\x04\x9c\x5f\x3c\x4d\x59\x60\x7d\x59\x20\x7b\x59\x20\x7b\x59\x20\x7b\x59\x20\x7b\x59\x20\x7b\x59\x60\x76\x59\x60\x76\x59\x60\x76\x59\x60\x76\x59\x60\x76\x59\xe0\x71\x59\xe0\x71\x59\xe0\x71\x59\xe0\x71\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x79\x3b\x01\x28\x2a\x26\x90\xb5\x2c\x90\xb5\x2c\x90\xb5\x2c\x90\xb5\x4c\x91\xf5\x1b\x7b\x13\x80\x04\x6e\x96\x05\x6e\x96\x05\x6e\x96\x05\x6e\x96\x05\x6e\x96\x05\x02\x96\x05\x02\x96\x05\x02\x96\x05\x02\x96\x05\xde\x95\xcb\x22\x97\x40\xa9\xb2\x40\xa9\xb2\x40\xa9\xb2\x40\xa9\xb2\xc0\xa4\xb2\xc0\xa4\x72\x45\x40\xae\x88\xec\x02\x93\xca\xbb\x22\xcd\xae\xa8\xc6\x2f\x01\x50\x60\x52\xf9\x97\x80\x2c\x10\xa8\x22\xf0\xa6\x22\xb0\xa4\x22\x90\xa3\x22\x90\xa3\x22\x90\xa3\x22\x50\xa1\x22\x50\xa1\x22\x50\xa1\x22\x30\xa0\x22\x06\xbe\x22\x06\xbe\x22\x46\xae\x22\x06\xac\x22\x06\xac\x22\x86\xa7\x22\x06\xa3\x22\x56\x8e\x8a\x58\x39\x2a\x62\xe5\xa8\xfc\x4c\x72\x89\x1a\x8a\xb1\xa8\x88\xb1\xa8\x88\x75\xa2\x22\xd6\x89\x8a\x58\x27\x2a\x62\x98\x2a\x62\x98\x2a\x3b\x62\xa9\xaf\x88\x71\xaa\x88\x85\xa2\x22\xc6\xa9\x22\xd6\x87\x4a\x59\x00\x12\xcb\x43\x45\x2c\x0f\x15\x31\x84\x15\x31\x84\x15\x31\x84\x95\x5d\x01\xf9\x97\x48\x23\xba\x7e\x57\xcc\xdd\x5d\xb1\x63\xed\x8a\xc1\xd8\x15\x93\x78\x57\x4c\xe2\x5d\xb1\x3f\xed\x8a\x51\xd9\x15\xa3\xb2\x2b\x66\xea\xae\x98\x8e\xbb\x62\x5b\xd9\x15\xdb\xca\xae\x18\x8c\x5d\x31\xe7\x76\xc5\x14\xd9\x15\x1d\xb4\x2b\x9a\xbc\x2b\x1a\xb8\x5b\x16\x89\xc5\xba\x55\x3d\xe6\xcf\x13\xfe\xbc\xe2\xcf\x47\xf6\x04\xb2\x9d\x3e\xcf\xf9\xb3\xc3\x9e\x87\x35\xfe\xac\xb3\x67\x83\xe7\x3f\xe2\xe9\x9b\x2d\xf6\x6c\xf1\x6f\x20\x62\xe9\x93\xa7\x03\x02\xf6\xe6\xba\x70\x7c\xcd\x9f\x0f\xec\x79\xc2\xd3\x9f\x8a\x27\xcf\x77\xca\xcb\x39\xe5\x70\x4f\x79\xfe\x53\x5e\x2f\x4a\x27\xc2\xc8\x9f\xf2\x0a\x9e\xf1\x0a\x9e\x71\x00\x67\x1c\xc0\x59\x93\x3f\xdb\xfc\x79\xca\x9f\xb7\xfc\xc9\x2b\x72\xce\xd3\x9d\xf3\x0e\x3a\xe7\x1d\x73\xc1\x2b\x76\xc5\x2b\x72\xcd\xcb\xb9\xe6\xe5\x74\x78\xc5\x3a\xf7\xec\x79\xc3\xeb\x73\xcb\xf3\xdd\xf2\xef\x3b\xfe\x7d\xc7\xe1\xdc\xf1\xf2\xef\x1e\x36\x2c\x74\x71\x75\x7e\xdb\x3a\xab\x01\x2b\xfa\x3f\xe8\x95\x7a\x15\x2b\xf7\xdf\xe3\x9a\xfa\xdf\xf6\x4a\xfd\x27\x86\xed\xdb\x3f\xf2\x4d\x7d\xf2\xbf\xc7\x41\xf5\x7f\x9d\xd7\xfa\x2f\x39\xa9\xfe\x5f\xe6\x9f\xfa\x0b\xd7\xd4\xdf\xfe\x8e\x23\xfa\x37\x1c\x54\x67\x18\x1f\xce\x8f\xfc\x9f\xb4\x52\xfe\x6f\x5f\x28\xbf\xf1\x95\xf2\xef\xfc\x85\x03\xbb\x99\xf5\x12\x8e\xae\xea\x47\xad\xf3\x33\xf9\x90\xef\x57\x72\x74\xc7\x8f\xdf\x28\x69\x48\x39\xd2\xeb\x9b\x83\xcf\xa9\xff\x7f\x7b\x24\xb8\x38\xb6\x62\xd4\x3a\x5b\x7d\x90\x99\xb6\xf1\x73\xf9\xab\x4a\x28\x89\xfd\x86\xed\x1f\x1d\xb1\xa6\x03\x36\xc2\x82\x02\x4b\x01\xcc\x73\x98\xc4\x70\xb4\x40\x07\x82\x76\x5c\xba\x7f\x6d\x54\x1b\x6b\x07\x87\x6b\x07\x9d\xb5\xda\xd9\x5a\xeb\x6c\xed\xf4\x74\xed\xec\x62\xed\xe2\x78\xed\xea\x66\xad\xd3\x5e\xbb\x79\xdc\xd0\x26\xa3\xb0\x37\x55\x36\xd6\x36\xd4\xbf\x1f\x9b\x6f\x5f\x0e\xcb\xbf\xd0\x40\xda\x61\xec\x10\x98\x74\xf0\x7b\x8c\x6c\xf8\x75\x3a\xec\xfe\xe8\xaa\x49\xf0\xd9\x95\x32\x9d\x20\xdb\x57\x91\xdb\xc1\x57\x4d\x22\x59\x9b\x4f\x45\xd2\xdc\x0e\x26\xfb\x24\xff\x34\xd6\x69\x0a\x00\x62\x78\x1d\x21\x92\x39\xb9\x56\x5e\xaf\x15\xb7\x93\x3f\x7f\x21\x68\x73\xb6\x64\xaf\xd8\xef\x60\x62\xd8\x8a\x1a\xcb\x37\xb0\x8e\xa2\xc6\xaa\xae\xf8\x1d\x7c\xd9\x24\xc8\x56\x32\x9a\xf5\x9d\x4f\x87\xf8\x76\xaa\xc0\x5e\x23\x61\x68\x13\xa7\x0f\x4e\xc4\x66\x61\xb8\x36\x1c\xaf\xcd\x22\xd7\xf3\x7b\x91\xe7\x6e\x08\xe3\x43\x37\xec\xa2\xbc\xe7\x2b\x4e\x4f\xb1\x3b\x20\xf7\xce\x05\xeb\xee\x15\x1b\x24\xa9\x10\x0b\x36\x9e\x5f\x15\x17\x89\x2b\x52\x96\x81\xb0\x0c\xf0\x00\x7f\x3b\xfc\x92\x06\x02\x30\x53\x0d\x72\x3b\xf9\x93\x2b\xa5\xf5\x0a\x57\xd9\xbc\x07\xd0\xc3\x8c\xe4\x99\x87\x91\x8e\x87\x0e\x3c\x75\x95\x38\xed\x3b\x13\x61\xe8\xf4\x14\x90\x4e\x41\xb7\x4d\xa2\xc6\x06\x54\x06\xdb\xc6\x23\x2b\x3c\xeb\x86\x43\xb1\xd5\x58\x35\x5c\x2f\xf4\xa6\xbc\x12\x99\xce\x5c\x9d\x87\x5d\xf6\x2c\x65\x93\x24\x97\x6f\x64\xc9\xe5\x73\x83\x98\xed\x85\xb5\x8e\x07\x35\x66\xd8\x81\x7e\xe5\x37\x6b\xc9\xfd\x88\x9d\x27\x5a\xed\x25\xbf\x59\xcb\xdf\x81\xf4\xf2\x5b\x24\x8f\xd8\x9d\x6c\x6f\xc3\xe9\x7c\x7c\x28\x4e\x07\xbf\x3b\xc3\x68\xda\x03\x87\x13\x7a\x7f\x44\xd0\x64\x66\x4b\x21\xa3\x11\x41\xce\x70\xc6\xe5\x1a\x6b\x35\x34\x1a\x0f\x5f\x7a\x91\xe3\x4d\x74\x67\x44\xd0\xc0\x9b\x8e\x87\x13\xfd\x76\x48\xe2\xf4\x8e\xa6\x63\x12\x2b\x06\x85\x26\xc0\x9b\x14\x55\xef\x33\x52\xd8\xb4\xee\xe0\x62\xb5\xf6\x62\x10\x9c\xd4\x17\x0c\xd1\x60\xbf\x63\xda\x16\x68\x6d\x81\xcb\x1f\x71\x39\xc4\xdc\x07\x51\x64\x4f\xcd\xc1\x80\x90\x11\xc7\xf2\xd4\x5a\x81\xdc\x54\xaf\xb3\x4f\x14\xaf\xa3\xea\xc9\x14\x38\x7b\x21\xe8\x31\x33\x05\x6c\xf5\xdd\xeb\x60\x1b\x5c\x95\xa2\x47\xb0\xfa\x46\xc7\x53\x1e\xc0\x64\xb0\xa4\x2e\xbd\x5d\x56\x55\x03\x35\x3c\xdf\x23\xd3\xd9\xd8\x9b\xa0\xcd\x26\xd8\x60\x79\x8f\xd1\x1f\x5c\x32\x71\x0d\x3c\x5f\xeb\xb9\xc6\xbc\xa7\x04\xe8\x76\x44\xd4\x7d\xc7\x0c\x2c\xec\xeb\xcc\x13\x93\x1a\xd3\x12\x58\x76\x57\x64\xf7\xb1\x4b\x73\xda\xd8\x31\x6f\x47\x24\x4f\xf3\x5b\xc8\xd7\xbc\x08\xdb\xfb\xb6\xf6\x50\xd3\x4d\x50\xd8\x71\xb0\xa3\xfd\xf5\xd7\x61\xeb\xfa\xe2\xa6\x53\x3f\xfc\xeb\xaf\x6a\x18\xaa\x0e\x4d\x05\xc6\x30\x5d\x2e\x10\xc9\xe5\xfc\xce\x75\x17\xdd\x4e\x75\xd2\x22\x4b\x2e\x72\xd1\x5b\x8f\xe8\x44\x7b\x1b\xfa\xfe\xc4\x9b\xa2\x39\x7c\xcd\xf9\xd7\xc4\x21\xa1\xa7\x13\x73\xb0\xb0\x24\x31\xfe\xcd\xa6\xe4\xcd\xf0\xbd\xe7\xea\x44\xeb\xb9\x5c\xb9\x95\x68\xa3\x61\x38\x0f\x86\xd1\x04\xd9\x2d\x02\x02\x84\xa6\x9c\xd7\x6e\xc9\x9e\x10\xc3\x9e\x42\xd4\xfd\xf7\xb3\xb6\x1e\x74\x14\x02\x7a\xa1\xa6\x15\xeb\x22\x40\x9b\x74\xbd\x30\x14\xea\xa2\x44\xeb\x0e\x43\x6f\x82\x82\x8e\xec\x77\x02\x32\xca\x56\x27\x56\x28\x4a\x9a\x47\xd7\xa0\x81\xa9\xa2\x90\x80\xa2\xa6\x6a\x65\x06\x9b\xc8\x95\x02\x85\x63\x9a\x41\xeb\xf6\x92\x3c\xf4\x9d\x66\x03\xe5\x63\x88\x0c\x87\x69\x64\x38\x64\x30\x25\x1b\x82\x99\x2e\xaa\xbd\xe8\x84\xbb\xbe\x41\x6f\x11\xbc\x0b\x97\x8a\xc2\x9f\x22\x9b\x35\x93\x67\xc2\x5a\x2a\x8d\x90\x37\x41\xa4\x45\x32\x52\x93\x4e\xeb\x93\x3a\x62\x27\x52\x1c\xd4\x6c\xc1\x2c\xf3\xd6\xf1\x24\x50\x5d\xa5\xdb\x51\x3c\xe4\xa8\xa9\xf4\x8a\xad\xb5\x1f\xd7\x71\x75\xc2\xe2\x16\xc7\x49\xa4\x6c\x1f\x76\xa8\x38\xe8\xa4\x85\x9a\x47\x44\x45\x01\xbe\xa1\x70\x07\x13\xa6\x86\x98\xf1\xd9\x96\xcf\x7b\x2a\xd3\x5f\x0b\xc9\x54\xcf\xb8\x6d\x0b\xa3\x40\x97\x1d\xb7\xc5\xaa\x41\xe7\xed\x92\xa0\x01\x51\xdf\xa7\xfa\x2a\x65\xd0\x7c\x3e\x35\x92\x2d\x99\xad\x06\xa7\x6f\x1e\x78\x14\xf3\x53\x87\x5e\xc1\xc7\x87\x47\xfb\x0e\xe3\x20\x9d\xae\x13\xbc\x5e\x44\x4c\x7b\xb1\x9f\x68\x2f\x8a\xc8\x17\xdc\x37\x67\x16\x5a\xe0\xf5\x12\x3a\xc0\x9e\x36\x79\x26\xe8\x10\x17\x8d\xc3\xbd\x03\x96\xf6\x90\x42\x77\x5b\x44\x79\x41\x07\xe6\x21\xdd\xba\x16\x78\xbd\xc8\x24\xa9\xe3\x9e\xaf\xac\x2f\xd4\xf7\x09\x5e\x2f\xf1\x10\x1a\x34\x51\xdf\x09\xa6\xe3\xec\x69\xb5\x17\x3a\xc6\xb4\x9e\x62\x6c\xa1\x7e\x31\x4b\xbd\x36\x8d\xe3\x98\x30\x0b\x63\x42\x9d\xc7\x55\x88\xaa\x4b\x43\xc2\xf6\x42\x37\x59\x95\x24\x4c\xed\x76\x64\xa1\x83\xcd\x48\xb1\xf9\x58\xa1\x4e\x5d\x45\x2e\x45\x03\x1b\x86\xcb\x81\xda\x10\x5a\x15\x47\xd4\xc3\x8d\xc5\x52\x7e\x0f\x2a\xba\x1f\x1f\x8e\xb4\xeb\x38\x1a\x4b\x86\x07\x35\xc4\xe2\xd5\x7d\x47\xcf\x5a\x35\x70\x5b\x59\xe9\x7a\xb0\x58\xf7\xdb\x66\x3a\xa4\xb9\x1c\x7c\xee\xd9\x4c\x8f\x34\x97\xbb\xed\x29\x66\x61\xbb\x5c\x44\x45\xb4\x5d\x2e\x4a\x1b\xa4\x23\x03\x88\x82\xbc\xc3\x40\x94\x18\x08\x1a\xc0\x80\x94\xac\x8c\x61\x98\x1e\x4c\xf5\xab\x99\xb8\x82\x4f\xc4\xa8\x08\x97\x99\xba\x27\xb2\x37\xc8\x39\xd3\xb9\xe0\x52\x57\xfd\x17\x61\xdf\xa2\x88\xb9\xf9\xc6\x73\x2e\x02\x76\x3f\x10\x1e\x5a\x7a\x1d\x74\x35\x53\x8d\x3b\xdc\xeb\x70\x3f\x8d\x83\x15\x1a\xe4\xd1\x50\x39\x3c\x50\x8d\xc9\x54\x1b\x38\xdc\x68\xa1\xa8\xc9\xfd\x00\x93\x44\x82\xa0\x36\x57\xbf\xac\x0a\xc1\x0e\xf8\xe0\x26\xb8\x31\x54\x6a\x43\x30\xfe\xf5\x92\x78\xf4\x01\x73\x90\xe8\xf4\x88\x58\x42\x67\xf2\xe6\x3a\x31\xf8\x21\xaa\x5d\x9d\x89\xc2\x91\xa7\x1a\x2e\xc5\x06\x0f\xbd\x4d\x09\xba\x7b\x22\x68\x12\xa8\x5c\x00\x12\x0c\xee\x8d\x5e\x54\x2d\x70\x15\x1b\xb9\x28\xa9\x42\x22\x25\x93\x1a\x53\x8e\x94\xf7\xe1\x88\x36\x76\xa2\x13\xe4\x0f\xc7\x03\x32\xd5\x03\xa6\x7f\xca\x8b\x06\xcf\x00\xbc\xa9\xcb\x13\x9a\x2b\x27\x26\xc4\xe2\x60\x44\x54\xc3\x6b\x09\x31\x20\x14\x20\x0f\xf5\x91\x8f\x12\xef\x19\x06\x5d\xc8\x58\xb8\xcb\xc5\xd7\xfa\x7d\xfc\xc9\x82\xe4\x75\x3f\xe9\x65\xf3\xda\xb6\x94\x0b\x15\xd9\xb8\x73\x22\x8c\xf1\x9f\xc3\x56\x0c\x22\xda\x27\x0a\x98\xd7\x00\x25\x99\x13\xc0\x54\xc4\x25\xf4\xc8\x80\xa7\x39\xbb\x06\x23\x48\xb6\xb6\x08\x35\x1f\xe2\xed\x54\x1a\xe5\xf6\x88\x28\x0e\xb2\x55\x90\xe6\x83\x17\x4f\xbc\x5c\xd0\x7c\x36\x38\x31\x60\xaf\xa9\xa0\x8f\xf9\x68\x5b\xe0\xbb\x6b\x78\x48\xa6\xe4\xe6\xea\x44\x39\x7e\x61\x32\x5d\xd5\xd9\x4a\xa1\xa5\xde\x10\x90\xa9\x50\xa2\x95\x7d\x4a\x3e\x8c\x42\x09\xcc\x66\xd1\x87\xbb\xaf\x38\x78\x67\xa7\x8c\x5c\xbc\xfd\xb3\xa2\xea\x10\xb5\xef\x30\x8d\x98\x9d\x9d\xf2\x77\xf7\x47\x12\xee\xe6\x72\x0a\xd7\x95\xd9\xfe\x59\xf9\xee\xfc\xd8\xd9\x29\xab\x19\xd3\x4f\x60\x97\xd2\xcd\xc8\x91\x79\x2d\xb2\xda\xa2\x76\x2b\x52\x5c\x34\xe5\xe6\xac\x08\x9d\x2e\xd8\x53\x7d\x48\xbd\x5e\x62\x2e\x56\x40\x4e\xdf\xa7\x58\x07\x9b\x87\xe4\xe4\xee\x9e\xa8\xf4\xc7\x3c\xa8\x5a\x0a\xd1\xce\x09\x22\xda\xfd\x80\x27\x63\x52\xdb\x00\xfe\xbc\x01\xfe\x61\x98\x6d\x97\xab\x13\x85\x50\x24\x4e\xd2\xa3\x50\x8d\x69\xac\xf6\xf8\xac\xdc\x2b\x9f\xd0\x81\x4f\x75\xed\xc9\x56\x54\x14\x26\x9f\x61\x55\x51\x11\x11\x63\x1c\x22\xca\x19\xc8\x92\xc4\x64\x90\xcb\x89\x99\x49\x06\x89\xf1\xa6\xf3\x74\xbe\xd2\x50\xb1\x9e\x50\x30\x8f\xcc\xcb\x05\x18\x72\x02\x33\x4e\xe0\x16\x55\x18\x9c\x38\x1c\x72\x29\x1f\x11\x70\x69\xf3\x00\xd5\xf0\x05\xd2\xaf\x17\x97\x7a\x8c\x3b\xa5\xb8\x1f\x64\x96\x75\x7f\x79\x30\x98\x1e\x04\xac\xf0\x0e\x6a\xce\x08\x3a\x3e\x22\xb0\xbd\x33\x95\x7e\x07\x63\xdc\x39\x04\x73\xfa\xf8\x2d\x00\x9d\xeb\xcc\x74\x64\x6c\xe3\x99\x10\x81\x25\x03\x24\xa0\xf7\x59\x0d\x26\x38\xd3\xb1\x67\x42\xda\xb5\x36\x4f\x6a\x30\x62\x8a\x71\x44\xab\xcd\xb5\xf6\x31\x76\x0c\x90\x0d\xa5\x5f\xdc\xe9\x2e\xa2\x8c\xa2\x8f\xc8\xf2\x4a\x20\xb6\x35\x51\xb6\x36\xd8\xa6\x54\x99\x8a\x22\x21\xba\x5a\x9b\x43\x98\x8a\x26\x8a\xca\xe5\xf1\x1e\x8b\x38\xe4\x02\xde\xfd\x17\xed\xd4\x85\xc5\x83\x56\x40\x55\x8d\xe8\xe3\x23\x5b\x30\xcd\xf6\x59\x10\x39\x33\xd6\xfb\xfc\xc9\x65\x92\x65\xc8\xf5\x11\x59\x25\x95\x9c\x60\xb1\xc0\x05\x59\x4c\x99\x0c\x98\x8c\xb2\xb1\x04\x47\x58\x03\xb1\x62\xd5\xb8\xa3\x28\xf1\x49\xb0\xef\xd2\x26\xca\x09\x48\x1a\xc2\xfa\x76\x69\x93\xa5\x25\xa1\x3d\x13\xea\x9d\x36\xac\x19\x93\xee\x27\x18\xb0\x65\xad\xc4\x52\x59\x60\xed\x3e\xd9\x84\x38\x7d\x61\xb8\x3d\x65\x23\x18\x0e\x83\xd0\xd3\x5e\x7a\x93\x19\x09\x7b\x0b\x50\xde\xd6\x8e\xbc\x61\xad\x4b\xc6\xd3\x0d\xd4\xeb\x70\x2d\x2c\xd5\x20\xcf\x0a\x6c\x7b\x08\x7e\x4d\x1b\x9c\x78\x74\xb8\x3f\xfa\xd6\x80\x04\xde\xcd\x55\x8b\xed\x8c\x5a\xbf\x6f\xd4\x5e\x33\xc9\x9f\xe7\x16\xf4\xa9\x1c\xd6\xad\x26\x20\x9c\xd0\x23\x63\x28\x93\x43\x78\xf4\xff\xbe\x7a\xda\x80\x8c\xea\x6f\xbd\xc9\x74\xb2\xb1\x62\xa4\x09\xf3\x91\x1e\xd3\xcd\x74\x69\xd3\xe4\x96\x95\xc1\xa8\x18\x9d\x35\x19\x05\xe7\x6e\x07\xe4\xb3\xe3\xa4\xe1\x7f\x5f\x8f\x89\x37\x3d\x25\xa3\xc9\xf5\x70\x36\x76\xbc\x0d\xb4\x3c\xd1\xd8\x51\x8d\x34\x6a\x76\x2e\xf7\xe9\xc8\x25\x97\x83\x53\x97\xb4\xd8\x64\xf6\x3f\x75\x64\xf3\xf6\x30\x84\xbd\x43\xa1\xfc\xd4\xc0\xb6\x76\xf7\x9a\x60\x9e\x27\x74\xa1\x16\x13\x89\xd6\x59\xcc\x71\xd0\xe2\x19\xa6\x13\xa1\x1b\xf5\x76\x2d\x0c\xbb\x9d\x0d\x05\x85\xf3\xd4\x41\xa7\x75\x42\x49\x9c\x27\x20\x71\xc8\xf3\x2a\x71\xfe\xc5\x24\xf1\x7e\xd7\x90\x05\x62\xcf\x86\xdc\xb7\xdd\xa1\xf6\xfc\xa2\x10\x38\xc8\x49\xa2\x98\x25\xe3\xd4\xc5\x2f\xaf\x19\xa5\xa9\x89\x60\x8a\x85\xbc\xfc\xc4\x14\xb1\xc4\xb2\x60\xf4\xee\x4f\x34\xdf\xd3\x9c\x5b\x06\xcd\x29\x51\x26\x9d\x03\xa6\xa8\xc8\xcd\xa0\x75\xf9\xc2\x9a\x31\xe5\xdc\x6d\x65\x94\xc0\xfb\x1e\xeb\xb0\x47\xe5\xf1\x49\x21\xda\x62\x92\x3d\x06\xb2\xb5\xee\x8c\x7b\x07\x8a\xef\x34\xef\xf8\xb3\x23\xee\xc5\x1c\x93\xd8\xa8\xaf\x54\x74\x98\xd1\xcd\xea\x7a\x02\xde\xf2\xd2\x80\xab\x09\x10\x06\x9f\xea\xcb\x54\x1a\x66\x27\x5f\x7a\x02\x2e\x1a\x0e\xe3\x79\x64\x93\x64\x2e\x26\xa6\x43\x99\x2d\x57\x1b\x3e\x73\x83\x37\x9e\x30\x78\x23\x3a\xfb\x35\x52\x3c\xd3\xb7\x90\xab\x8d\x9f\xf9\xca\xe1\x94\x32\x6d\x49\x79\xee\x0c\xcd\x9e\x24\xf1\xd4\x77\x02\x56\xb8\x6c\x04\xa3\x81\x3c\x4b\x8d\x63\xa2\x0d\x94\x60\x82\x6c\x25\x5b\xe5\x7e\x87\xad\x52\x01\x5f\xa8\xc4\x4e\x47\x93\x5f\x34\xbf\x4c\x1e\x1e\x7d\x4e\x7e\xfe\x75\xf2\x41\x36\xb9\x44\xfb\xf7\x3b\x29\xfd\xed\x60\xd7\x24\x63\xcb\x00\xef\xc3\x9b\x96\xa2\xe6\x72\xec\xa9\xf5\xdc\xeb\xe9\x98\x7e\xae\xe3\x30\x00\x15\xd7\x87\x0b\xc5\x01\xdb\x2b\x13\xa0\xd9\xe8\x90\x3f\xd9\x5f\x59\x80\xef\x7b\xb4\x1b\x87\xc3\xaf\xdc\x5e\x43\x21\x40\xb6\xbb\xac\x28\x6c\x6b\xe3\x40\x51\x0d\x88\x11\xf4\xf9\x62\x62\x3a\x96\x46\x5c\x17\x7c\xb6\x7f\xbb\xd3\x0e\xbd\x15\x4c\x84\xbd\x8e\x31\x58\x71\xe5\x42\xf6\x0f\xbe\x92\x28\x56\x50\x8a\x90\x26\x82\x51\x7d\xf0\x33\xa3\x2a\x7c\x03\x34\xb4\xe1\x19\x14\x00\x54\x7e\x8b\x60\x73\x7e\x88\x6e\x5a\xa8\xd3\x42\xf6\x21\x22\x87\x96\x64\xea\xfc\x2b\xbe\xe9\x3a\x59\x16\xc2\x0e\x0a\x2e\xe9\xaa\x10\x7e\xc5\xf8\xa8\xef\x4b\xfc\x8e\x93\x2c\xba\xc0\xc9\xb0\xaa\x47\x4f\xac\x83\x2c\xa1\xd6\xdd\x1b\x26\x4c\x8a\xa3\x22\x8f\x52\xbb\xd2\xb7\x2b\xac\xa6\x83\xcb\x84\xa4\x4e\xb0\x1c\x28\xa9\xb3\x9b\xe3\x36\xca\xb2\x59\xd7\x43\x33\xac\x5a\x0a\x27\xbc\xe6\x63\xc4\x39\x0c\xba\x84\x12\xd6\x6d\xf3\xf1\x4a\xff\xbf\xa2\x0c\x4f\x68\x66\x1d\x3e\x43\x74\xf3\x58\xb9\x3f\xd1\xae\x77\x14\x9e\x40\x5d\xe1\xb3\xcb\xc1\x26\x41\xb6\x59\xb4\x2c\xe6\x64\xbb\x7d\x7d\x7e\x66\x06\xae\xa5\xd8\x60\xf7\x28\x39\x27\x05\x17\x49\x9b\x35\x35\x56\x91\xa3\x6a\xf7\x5d\x70\x71\xd8\xac\x93\x04\x36\xd7\x66\x65\xad\xf7\x2f\xb9\x47\x6b\x94\x28\x95\x20\x1b\xb9\xaa\xc1\xd4\x4e\x37\x2f\x44\x6a\x58\x56\x56\x53\x09\x61\x47\xf3\xb4\x49\x57\x92\x4d\xff\x76\xa7\xd5\xe7\x2b\xd0\x8e\x6d\x95\x4f\x1d\x41\x73\x14\x21\xd8\x50\xf8\xc2\x7c\xe2\x13\x45\x05\xcf\xf3\xde\xb1\x22\xb1\x38\xb4\xc8\x13\x3f\x43\xdd\xc8\x8c\x79\x8b\x08\x52\xe5\x81\xe9\x62\x86\x5c\xd1\xf6\x81\x81\x7d\xe2\x9d\xfd\x72\xcd\x10\xee\x0e\xf7\x5a\x84\x21\xda\x6b\x94\x05\x7a\xa7\xd5\xdb\x9f\x97\xe4\x07\xb1\x1d\x3e\x78\x0a\x61\x96\xe0\x61\x6e\x78\x9f\x93\x3e\x11\x0c\xd5\x25\xce\x57\xd3\xfc\x89\xc4\x9f\xf7\xbd\xd4\x17\x43\xd8\x37\x1e\xb9\x8a\x95\x36\x08\x32\xa7\x16\x42\x2b\x76\x36\x24\x6c\xe2\xf3\x36\x6b\xb6\xaf\xb8\xea\xbe\xa3\x5d\xf3\x93\x88\x87\x09\x25\x9a\x14\x57\xd5\xae\x07\x3a\x81\x25\x41\x7b\x19\x12\xb6\x2c\xd0\x64\x8a\x0a\x1e\x75\x69\x1a\xe4\x24\xfc\xf0\xe5\x93\x22\xb2\x93\xa9\xb2\x5e\x5c\xde\xb9\x6c\xc9\xf5\xa4\x28\x1b\xdb\x06\xdb\x00\xe5\x2d\x71\x00\x53\x3e\xec\x48\x53\x3e\x7e\x50\x06\x1d\x14\x76\x54\x63\x00\x04\xd8\xf3\x0b\x5e\xdd\xfe\x5e\x8b\x18\xb6\x56\x6f\x2b\xa9\x95\x49\x5b\x1a\xec\xa8\x93\x90\xb6\x13\x82\xe9\xbc\x61\x75\x76\x67\x09\xfb\x33\xe5\xdc\x0f\x8f\xf1\x92\x98\x38\xe8\x29\x51\x47\x35\x22\xa8\x81\x37\x5b\xa6\x85\xe5\x51\xba\x9c\xd0\x46\x69\xe7\x0e\xa5\x04\x78\x0e\x77\x46\x56\x29\x5c\x80\x8e\xf9\x48\x79\x17\x9a\xe9\x04\x81\xa9\x8b\xce\x7c\xe4\xe9\xad\x6e\xe6\x0c\x69\xd8\x11\xcb\xd9\x25\xc9\x2e\x86\x36\xc1\xb6\x51\x7d\xe3\x93\x91\x99\x5a\x52\xe3\x21\x94\x3b\xb0\xb3\x3b\x6b\x72\x66\x49\x13\x9b\x77\x8e\x95\x58\x2c\x48\xed\x2e\x32\xab\x05\x7b\x1e\xb7\x5c\xc0\x5c\xb1\x3b\x88\x30\x03\x06\xbc\x48\xd9\x76\x46\x5a\xc9\x51\x67\x99\x35\x67\x3d\x22\x26\xc1\x9b\x2b\xa8\xc0\xa6\x2f\x54\xe2\x0f\x5f\x05\xb1\x57\x8b\x88\xd0\x89\xbf\x1a\x24\xda\xb5\x57\x41\xe2\xe5\xb8\x5a\x14\x14\x62\x18\x4a\x44\xa4\x7b\x84\x79\xda\x87\x01\xc1\x01\xeb\x01\x83\x08\x17\xca\x67\x82\xdf\x35\x6c\x7c\x38\x0f\xc6\x64\xd4\xd5\x46\x3d\xa7\x7f\x48\xa6\x5e\xa7\xe7\xf4\x8f\xc6\x24\x9a\x85\x64\xdc\x9b\xce\xb9\x72\x10\x3f\x6b\x6a\xfa\x42\xd5\x5d\x74\xf5\x74\x98\x40\x08\xbc\x29\x05\x50\x7d\xeb\x4d\x3e\xe5\xb2\xa5\x0c\x66\xd1\xd2\x5e\x4c\xdf\xb5\x14\xf5\x37\x4f\x27\xb8\xc9\xe9\xd0\x1c\x7a\x96\xf2\xfe\xa2\x0b\x00\xcc\x96\xda\x79\xcc\xf7\xd3\xab\x00\x12\x50\x2c\x19\x76\x94\x73\xca\x8b\x25\xb6\x8a\x5d\x6e\x60\xf9\x73\x31\xdc\xf9\xa3\x9b\x7a\x16\x1a\x9a\xe2\xd9\xb6\x0a\xa5\x24\xa1\x41\x7e\xf3\x1a\xb3\x6f\x51\xaf\xa6\x8f\x45\xfd\x07\xdc\x67\xf4\xe5\x0f\x11\x55\x48\xa0\x33\x13\xc8\xb3\x2e\x58\x7f\xc4\xcc\xd0\xa8\x8d\xd3\x92\x0c\xb2\x67\x03\x01\xcd\xd3\xd1\x9d\x07\xd0\x6e\x20\x94\x5e\xa7\x43\x93\x58\xda\x8b\xaa\xc6\xdf\xc8\xb3\x32\xea\x2c\x3b\xad\xa0\xd8\x2e\x74\x57\xaf\x06\xcb\x8a\xb4\x61\xc8\x0e\xec\x36\x26\x53\x32\x9e\x3e\x24\x86\xc8\x27\x1e\x7d\xf8\xc3\xb1\xb7\xe6\x90\x30\xec\x45\xc1\x9a\x3b\x26\xaf\x8a\xaa\x6d\xf0\xbd\x5d\xee\x0d\xf0\x6a\xb6\x8e\x71\x72\x21\x21\x7a\xbe\xc8\xcc\xcc\x0d\x6c\x05\xee\x13\x4c\x6e\x37\x5f\x34\xa6\x68\x15\xfc\x1f\x5b\x28\xfd\xcc\xfb\x3f\xb6\x54\x8b\x59\x3d\xcc\x26\xda\xe3\xc8\x5b\xe0\xf8\x9e\xcb\x29\xd5\x37\xc5\x43\xd5\xb6\x8a\x8e\x89\x02\x45\xa5\x39\x54\x44\x03\x34\x2f\xe2\xf5\xe4\xc0\xc5\x29\xab\xa8\x9e\x2b\x57\x8f\x19\x1d\x90\x6a\xe7\x66\x6b\xe7\xb2\xda\x19\xfe\x8f\xad\xbc\x94\x44\xcc\x3a\x86\x06\x97\x79\x5e\x4f\x51\xbf\x49\x03\xea\x17\x22\x19\xaa\x8a\xc2\x4c\xdd\x5c\x4b\x35\xae\x06\x4a\x08\xb5\x56\xf7\xe1\x62\xc5\x55\xf5\x80\x5b\x0c\x60\xb7\x84\x25\xc3\xdb\x73\xd3\x1b\xc6\x28\x69\x85\x67\x19\xdf\xb8\xcd\x99\xc8\x1c\x54\x13\x87\x88\x6d\x3d\x5a\x6e\x92\x97\x76\x92\x67\xe5\x23\xd6\xf2\x8c\x0d\x99\x5e\x9d\xf9\xc4\xa0\x38\xb2\x2a\x7f\x81\x67\x92\x3a\x26\x85\x44\xbb\x47\x82\x35\x69\xfc\x09\x82\x94\x7f\xd9\x50\x4d\x22\x70\x30\x8b\xfa\xd1\xf0\x35\x5a\x03\x43\x04\x03\x2f\x9a\xae\xf5\xa2\xb5\x69\xcf\xe9\xaf\xc1\x2c\xd7\x36\x54\x23\x16\xeb\xf1\x08\x83\xa3\xc8\x22\x0a\x71\xc0\xcc\x51\x84\xc2\x48\xe8\xd5\x40\x09\x28\xbb\x14\xa9\xea\xfb\x28\xbd\xcd\x19\xb1\x9e\xf6\x78\x4f\x47\x6a\xec\xf3\x29\x18\xe2\xbe\x0c\x22\xed\xeb\xbe\xe9\x5b\x16\xba\x24\x4a\x84\xce\xd5\x98\x50\x46\xd9\xe5\x79\x02\x79\xda\xba\x7b\x01\x2c\xfd\x3d\x5f\x19\xc9\xe8\xb6\x2e\xd6\xb9\xdf\x22\xb1\x4b\x27\x6f\x2e\x37\xa2\x1b\x49\xba\xb9\xf4\xb1\x2d\x8c\x7d\x01\x7e\x08\x7b\x5f\x61\x98\x2f\xd1\x16\x8e\xe8\x40\x7f\x7c\x7c\xeb\xd5\xc1\x88\xa2\x4d\xd0\x08\x8f\x32\x7b\xd1\x04\x9b\x16\x9a\xe1\x22\x7a\xc1\x23\x5a\xa3\xd9\xde\x8b\x31\xcb\xe7\xd5\x09\xd8\xd2\x52\x46\xe6\xcc\x82\xfd\xa5\xb4\x83\x42\x54\x6d\xd3\xbe\x41\x7e\x1e\x97\x76\x8c\x3e\x9e\x18\x1e\x6f\x94\xcf\x3a\xc2\xdb\xf3\x01\xf3\x1c\xa5\x4f\x71\x08\x68\x55\xc2\x59\x74\xba\xcd\x94\xe2\x58\x35\xce\xc8\xa7\xe5\x47\x6c\xd2\x0a\x49\x96\xbc\xef\x7c\x4d\x14\x13\x85\x72\xc9\x90\x8d\xee\x31\xff\x84\x85\xf5\x14\x87\xee\x51\x1f\x1f\x40\x0d\xa7\x8a\xc0\xc8\xc5\xeb\x74\xeb\x8d\x3a\xda\xad\xad\xa8\xe6\x99\x6d\x19\x4b\x0e\x55\x47\x63\xa2\x2f\x33\xc2\x44\x78\x15\xec\xa3\xd0\x70\xe8\x3e\xe8\xc1\x35\xea\x5e\xb2\x4b\x75\x9a\xad\xab\xce\xc3\x5f\xd7\xf5\xda\xf9\xd9\xe1\xc9\x83\x38\x1a\x0c\xb1\xad\xbc\x75\x11\x51\x91\x43\x07\xb7\x96\xec\x31\x21\x7a\xcf\x78\xe8\x63\x4e\xfd\xda\x87\x88\xd8\x7a\x50\x4b\x2d\x6d\x94\xb6\x99\xdb\x3e\xe6\xc2\x2f\x56\x39\x20\xba\xa0\xe6\xcf\x57\xd7\xe1\xb4\x75\x76\xd3\xa9\xcb\x75\xb8\x3c\x40\xe0\xe3\xc3\xbc\x75\x80\x3d\x75\xf7\x95\x3e\xed\x87\x10\xd7\x7c\x55\xef\xd3\x39\xe1\xd2\x1f\x5a\xdb\xf0\xef\x2a\xdb\xff\x6f\xa9\xeb\x75\xeb\xfe\xaf\xe6\xf9\xcd\x95\x5c\xcd\xf3\x00\xf5\x31\x31\x6d\x5a\x49\x44\xb7\x0a\x5e\xe1\x5c\xee\x9b\x12\xe6\xf1\x28\x22\x2a\xea\xe3\xd2\x16\xc6\xb8\xff\xf1\x51\x64\x0f\x17\x51\x72\xfb\xcd\xfd\x4d\xd8\xde\xca\x9d\xc1\xf6\x73\x39\x9a\xe7\xa6\x0f\x8b\xf6\xff\x58\xb3\x0e\xab\x2d\xb9\x45\x0b\x9f\x77\x7c\x94\x74\x7c\x98\xc7\x9d\x3e\x41\x7d\xf0\xce\xf3\xff\x49\xd7\xdf\xd5\xeb\xc7\x69\x25\xfb\xd8\x4d\x6b\xd0\xf2\xff\x67\xaa\x70\xd0\xaa\x9e\x9d\xdd\x54\x4f\xd2\x9e\x3a\xae\xa1\x3e\x66\x7d\xd5\x74\x59\x5f\xa1\x6f\x7f\x1a\xd9\xdb\xff\xe1\x91\xad\xd5\xcf\x3a\xf5\xb3\xb3\x96\x5c\x69\x5b\x69\x1f\x90\xff\xd7\x26\x37\xdb\xe0\xce\x46\xc4\xe0\xbe\x86\x0f\xdf\x92\x95\x69\xa7\x28\x4b\x7b\x3c\x77\x18\xb7\xdd\x03\xae\x2d\xfa\x82\xab\x15\x09\x9a\xf3\xcf\x09\xd6\x4b\x22\xb6\x65\x93\x2f\xa2\x45\x69\xe3\x4e\x66\xa9\x2d\xfe\xb6\xf7\xc9\x0f\xe6\xfe\xa3\x54\x44\x05\x5b\xd5\xc9\xf7\xe4\x53\x36\xc5\x39\xe9\x30\x7b\xa1\xcc\xc2\x9f\xf6\x73\xfb\xe7\xd6\xaf\x9f\x3f\x77\x4b\xbf\x8a\xdb\x5b\x3b\xa5\xdd\xef\x5d\x2d\x1c\x06\x92\x93\xab\xb5\x52\xbd\x50\xf9\xcd\xed\x01\x16\xe0\xf6\x92\xc8\x7e\x1c\xa6\xb2\x60\x0f\x98\x04\xfc\x03\x4c\xc9\xc6\x68\x36\xdb\xdc\xfe\x73\xbe\xb4\xe1\x2f\xd0\xcd\x77\xf8\x05\x4e\xc0\x4e\x48\xe6\x7c\x80\x11\xd1\x8c\x69\x13\x5c\xd8\x75\x43\x70\x61\xdd\x67\xcc\xad\x1d\x38\x1f\x1f\xc5\xdf\x0e\xbb\x7c\x6a\x6c\x2a\xaa\xbe\xb5\xe7\xec\x3b\x85\x92\x5e\x32\xae\x5e\x19\x6b\x69\x0a\x37\x8f\x13\x07\xbb\x1c\xd4\xb3\x83\x0b\xf4\x9d\xb3\xa4\xe0\x44\x04\x22\xda\x44\xb9\x68\xa8\x70\x70\xca\x85\x07\xda\x44\x79\x3b\x20\xcb\xc7\x53\x09\x9f\x2e\xfc\xac\x1c\xb0\x83\x16\x38\x7f\xee\xd5\x56\xde\x42\x7b\xd7\x19\x4b\x64\x6d\xa2\x3c\x1e\xa9\xc9\xfb\x43\x8b\x19\x01\x5c\x27\x4f\x8a\xcd\x8e\x54\x9f\x5b\xa9\x1c\xe8\xd9\x30\x2a\x84\xbd\xc8\x23\xe3\x35\x10\x12\x5b\x7b\xed\x4d\xbb\x6b\x01\x19\x4d\x40\x32\x74\x38\x5d\x9b\xcc\x46\xa3\xe1\x78\xea\xb9\x94\x44\x4b\x8f\xb6\xbf\x92\x96\x33\xa6\x7a\xe2\x2c\xd8\xb3\x0c\x4e\xec\x8c\x8a\x4a\xa0\x5d\xf6\xb9\x95\xc8\x3e\x0b\xac\xb5\x95\x80\xd2\x11\x28\x90\xbe\x9b\xbe\xca\x3c\x2b\x83\x6c\x50\x3f\xef\xef\x05\x6a\x3f\x8f\x7d\x2e\xdf\xc4\xf8\x5c\x21\x82\xe3\xe3\xf7\x20\x22\x7a\x11\x01\xcf\xa3\xf7\x91\x17\xb9\x7a\x10\xc7\x7e\x2e\x27\xe4\xf2\x44\x37\x3e\x34\x88\xe2\xa0\x71\x47\x29\x21\xc0\x48\x15\xee\xd1\xef\xb4\xf6\xca\x93\x88\x4d\x6e\x99\xf7\xba\xc1\xad\xba\x34\x36\x3f\xcf\xb7\x42\xc6\xd5\xdd\x93\x2c\xcc\xe5\xc2\x1d\x6b\xe4\x28\xaf\x6c\x1a\xaa\x28\xfd\x72\x18\x1e\x4c\x1c\x8c\x5d\x92\xcb\x11\x8a\x35\x14\x6d\x20\xcb\xc4\xc1\x45\x04\x41\x25\x39\x11\x8b\xa1\xe1\x34\x54\xce\xf0\x4c\x83\x27\x8e\x48\x4c\x03\x72\x39\xa5\x88\x21\x74\x9f\xe5\x63\x06\x46\x29\x48\xbd\xb8\x97\x86\xff\xc0\x5b\x10\xfe\x1d\x6f\xa9\x3a\x84\x7c\xe7\x21\x3f\xf0\x16\xd4\x71\xd6\x82\x60\x08\x43\x94\x83\xd6\x2e\xb7\x96\x43\x4e\x5b\xe0\xfa\xb3\xfb\xcc\x8f\x46\x4a\x88\x98\xce\xc2\x82\xf5\x51\x8d\xef\xb4\x59\x6b\xf9\x60\x70\x3c\xca\x74\xb9\x98\x50\x44\x9e\xc5\x6f\x6c\x15\xd2\x26\xee\xc7\x07\x2f\x23\x11\x35\x9a\x48\x7e\xd6\x5e\x33\x82\x54\x73\xf6\x95\x4a\x9a\x39\x19\xab\x25\xb4\xab\xe6\x07\xcc\xbb\x5b\x7a\x99\x48\x14\x27\x91\x90\x4a\x87\x73\x9e\x5d\x3f\x85\x7d\x24\x42\xb1\x94\x1b\x22\x8e\xef\xb4\xc8\xc1\x2b\x2e\x34\xc5\xc9\xc1\xc4\x91\x4f\x25\x26\x60\x65\x4d\xac\x13\xac\xb3\xf8\x97\x38\xec\x1e\x8d\x56\x21\x23\x24\xba\x69\xf0\x43\xf2\x03\xad\x17\xbd\x78\xe3\x89\xa7\xf0\x4c\xad\xcd\xd5\xa7\x6f\x64\xcf\xde\x2f\x94\x74\xf2\xdb\xde\x2f\xe9\x45\xf9\x0e\x86\xdd\xb3\x01\xb8\xc7\x11\x26\x1f\x1f\xcc\x0e\x1e\x50\xe0\x61\x8b\xe0\xf7\x68\x36\xb0\xbd\xb1\xbe\x7a\x6d\xd2\x1e\x47\x0a\x31\x87\xae\xa5\xc6\xa8\xe7\x7a\xd1\xb4\xe7\xf7\x32\x89\xd3\x1a\x98\x35\xd7\x8a\xd1\x46\x7e\x63\x85\x5d\xe9\xc7\x3e\x89\xd1\x46\x61\x55\x54\xab\x4a\x63\x56\x46\x75\xbc\x18\x6d\xe0\x55\x31\x4e\x48\xe1\x7d\x5f\x15\xf5\x00\x45\x29\xab\xa2\xce\x28\x3c\x75\x55\xcc\x39\x8d\x41\xab\x62\xae\x69\xcc\xff\xbd\x2a\x66\x73\x1c\xc7\x46\x1f\x8e\xc4\xb5\xda\x57\xee\xd4\x56\x79\x00\x09\x5b\xc4\x24\x5a\xeb\x59\x51\xad\xc4\xe8\x0c\x7b\xc0\x25\xc4\xb9\x3c\x35\x16\xb0\xc1\x3d\x28\x8b\x0e\x7a\xee\xa8\xc6\x02\x38\xae\xd6\xf3\x0a\x7a\xa2\xe3\xc9\x06\x46\x79\xb6\x2a\xcb\x56\xfd\x3a\xdb\xa5\x9c\xed\xa0\x93\xde\xa7\x76\x31\x89\x1f\x94\x83\x0e\xf2\x7b\xaa\x71\x00\x00\x9e\x86\xbd\x68\xc5\xf9\xb3\x69\x89\xb3\xf7\x45\x57\x3a\x79\xa7\x4b\x63\x71\xcf\xcd\xe5\x6c\x30\x3d\x2d\x0e\x71\xd6\x4b\x86\xb3\xd6\x8b\x26\x53\x12\x39\xde\xd0\x5f\x3b\xe8\xe4\x72\xa5\x3d\x47\x5b\x74\xcd\xb6\xc5\xef\xc9\x5e\x4e\x14\xf5\xb7\x03\x0f\xb0\x82\xbc\x5e\x54\x0d\x8f\x03\xa2\x04\x5d\xad\x03\x5e\x4f\x6c\xe4\x68\x0d\x38\x95\x97\x23\x0f\x3b\xc9\x69\x7b\x7a\x12\xce\x1a\x90\x25\xc4\x7a\xbe\x52\xc2\xfc\x40\x0d\x4a\xcf\x48\x8f\x2c\xba\x66\xd1\xe2\x66\x05\x57\xb7\xd0\x56\xdf\x09\xa8\x3a\x68\xcf\x91\xa2\xaa\x71\xe2\x03\x0c\x13\x23\x4b\xe4\x89\xfe\xad\x7f\xea\xdf\x7a\x07\x1d\x74\x54\xa3\x0e\xd5\x7b\x39\x59\xed\xb3\x8f\xc5\x36\x06\x9f\xa5\xec\xbe\xac\x18\x37\x2c\xab\x35\xe7\x8a\x6a\x14\xe1\xba\x3a\x97\xa3\x5b\x81\xe8\xa5\x45\x47\x45\x36\x93\x33\x6c\x74\x14\x5b\x55\x59\x23\x74\x91\x36\x49\x58\xed\xa8\x06\xc1\xfe\x13\xb3\x21\x3d\x60\x0d\x4d\xaf\x98\x92\xb6\x1d\x72\x94\x3b\x64\x28\x77\xf8\x35\xca\x9d\xcb\x28\x77\x04\x5d\xe2\xdb\xd2\x8d\xc7\x11\x83\x70\xf4\x35\x84\xe6\x8b\x5c\x72\x8d\x97\x5c\x63\xf9\x6a\x5f\xe7\x3b\x93\x4b\x6e\xf2\x6c\x4d\x96\xad\xf9\x75\xb6\xd0\x97\xb2\xb5\x3e\x8d\x61\x8b\x8d\x61\xeb\xeb\x31\x2c\xc6\x3c\x36\x3b\x86\x12\x92\xc0\xcc\x07\xc7\x5f\x1d\x79\xfa\xb7\x79\x1d\xdb\xac\x8e\xed\xaf\xeb\x78\x21\x37\xed\x98\x67\x3b\x66\xd9\x8e\xbf\xce\xe6\x0e\xe4\x9e\x1c\x48\x9b\xc5\xa2\x8b\x4d\x62\xc5\x0f\xca\xa0\x45\xa0\x7d\x49\xaa\x46\xe7\x73\xa2\x46\x07\x0d\x5a\x44\x35\x1a\x2b\xe6\x99\x24\x01\x08\x93\x0a\x30\x8d\x09\x2a\x52\xf4\x64\x72\xe5\xf2\x92\xd0\xe8\xa4\xbe\x49\xd9\x34\x5c\x4e\x71\x92\xa4\xa0\x7d\x76\xd2\x51\x0a\x20\xba\x0e\x37\x04\x9c\xd8\xbd\xe1\x67\x90\xd3\xf9\xc8\x5b\x1b\xfa\x6b\x91\x17\x90\x69\xef\xc5\x83\xc3\x47\x29\x33\xb4\x26\xe6\x15\x5f\x39\x3e\xfe\x93\x02\x27\xe0\xc7\x1d\x7e\x0c\xcb\x5a\xc1\xe6\x02\xcf\xb8\x8a\x83\x63\xeb\x08\x6d\x6c\xa6\x6d\x52\x7f\x9f\x42\x4f\x06\x6f\x12\xf2\x9f\xb2\x21\x3b\xfd\xc3\x42\x2f\x01\x38\xf9\x0c\xe0\x84\xad\xd8\x27\x5f\xb6\x07\xda\x72\xca\x2e\x93\x61\x67\xb7\x62\x9e\x7a\x65\x23\x8a\xbf\x45\xc2\xd8\x08\x6c\xe5\xa4\xb3\xe4\x30\x5e\x46\x62\x9a\x48\x14\xbd\x9a\x6b\x95\x49\x93\x33\x4e\x75\xa5\xab\x26\x63\xc1\x6c\x92\x58\xa8\xb4\x29\x13\xfe\xa0\x9c\xb1\x19\x76\xf6\xf5\x0c\xdb\x8a\x79\x6c\x16\xf5\xce\x3a\x9a\xa7\x3d\x47\xc9\x1d\x3b\x5f\xcf\x8b\x88\xee\x5a\xc8\xc1\xa5\x55\xcb\x27\x25\xe9\x01\x33\x41\x44\x57\x2c\x91\x2e\x5f\x22\x11\xc9\xe7\x55\xc3\xa5\xed\x83\x14\xce\x77\xec\x02\xee\x21\x97\x99\x94\x34\xc4\x96\xe7\xd2\x95\xb2\xb4\x0e\xe2\xc1\x2e\xdd\xad\x8a\xa8\x88\x38\xbe\x3a\xaa\x10\xb6\x00\xd9\xd7\x8e\xc2\x19\xba\x86\x4d\x54\x83\xfc\xe7\x16\x14\x9d\x96\x9c\x7a\x0e\xe4\xcd\xfc\x72\x21\xa1\x10\xf6\xfd\x27\x90\x11\x62\x02\x9f\xbd\xcf\x2d\x94\xbd\x91\x51\x34\x8e\x55\x26\x6c\x99\xac\x42\x6d\xba\x0a\x9d\xad\x40\x0a\xde\x7f\x5f\xec\x3a\x36\xef\x36\x92\xcf\x27\x9b\xc4\xfa\xba\x42\xfe\x73\x4b\x5e\xd4\x22\xa1\x90\xc0\x68\x5c\x92\xdc\x1a\x4d\x3d\x92\xdc\x96\x7a\x04\xdb\x29\xe5\x7f\xde\x49\xb4\x1b\x29\x53\x33\xa7\x7b\x54\x6a\xc5\x71\x4e\xe9\x29\x08\x2b\x94\xc0\x93\x85\x8b\xed\x82\x43\x17\x0d\xf7\x37\xa1\x50\x53\x59\x6b\xf7\x07\x04\xa8\xa8\xb4\xe7\xaa\x92\x3f\xc9\xa5\x5b\x1a\x1f\x7b\x3f\xdc\xef\x8a\x5d\x70\xd4\xbc\x63\x00\xf0\x9a\xc5\xdc\x26\xbe\x79\x44\xf1\x55\x26\x75\xc5\x83\x6d\x1e\x6c\xd3\xe0\x88\x51\x84\x93\x2f\x07\x68\x2e\xaf\xb8\x43\x99\x91\x24\x78\x94\x7c\xbe\x8f\x49\x14\x78\xba\x6b\x76\x17\x16\x6a\x3b\x44\x77\xb5\xb6\x43\x50\xbf\xaa\x97\xe2\x8c\x6c\x24\xc6\x94\xa8\xf7\x09\x65\xd5\x46\xea\x3e\x5c\x00\xbd\xbb\x64\x4a\xc0\x0e\x2a\x9a\x8c\x74\x1a\x81\x6e\xa6\xfa\x3b\x53\x10\xd3\x89\xd6\x6c\x83\xa7\xaa\x63\xf6\x5a\xb2\x62\xf9\xe8\xea\xe2\xf3\x8e\x7c\xc1\xd6\x94\x8b\x3f\xaf\x29\x47\x7c\x4d\xa9\xb1\x35\xa5\x3a\x52\x2e\xfe\xb4\x58\xd4\x60\xb1\x48\x8a\xbd\xe4\x7b\xd6\x25\x5b\x00\x2f\xbf\x5e\x00\x37\xc7\x52\x6d\xaf\x3e\x6d\xc7\x57\x6c\xb1\xb8\xfa\x7a\xb1\xd8\x8e\x79\xec\xdf\x6f\xc7\x97\x99\xed\xf8\x59\xda\x1f\xe7\x1d\x4c\xb4\x7e\x35\xcf\x0d\xce\x1f\x13\x4c\xe8\x58\x71\x0b\xd9\xcf\x04\x13\x3a\x60\xdc\xcc\xfd\x16\xdb\xfe\x9a\x5b\xe2\xb6\x1e\xb0\x3e\x7e\x66\xb8\x42\x5c\x77\x89\xab\x03\x3c\xe7\x09\x65\x54\x2f\x88\xb0\x34\xae\x50\xb2\xb4\x37\xa3\xb8\xe7\x24\x57\xd8\x5b\x79\xec\xf0\xb3\x90\xe1\x56\x5e\x9c\x77\x31\x5c\x7d\x7f\xd3\x09\x9a\xeb\x76\x46\xbe\x62\x9c\x95\xc5\x7c\x79\xe6\x4e\xab\xd6\x31\xd1\x8e\x49\xea\x45\xed\x98\x50\x06\x37\x97\x3b\x79\x52\xc4\x87\x9a\x8d\x25\x6f\x52\x2c\x79\x53\xe1\xd4\x82\xbd\x17\x92\x2c\x3f\x4a\xc5\xe2\xc7\x07\x93\xa8\x4d\xfd\xa4\x9f\x3c\x29\xb6\xfa\xf1\x01\x1e\xd2\x9b\x5b\x3f\x94\x64\x46\xab\x12\x1d\x9f\x1e\x5c\x2e\x29\x35\xdd\xf4\x20\x83\x7c\xc2\xe6\xa6\x8b\x5c\x9e\x1d\x7e\xba\xda\x1b\x08\x2a\x16\x65\x3d\xc2\xe9\xbf\x0e\xe9\xbb\xab\xcd\xe3\x8c\x13\xfd\x59\x6b\x49\x03\xd5\x64\x5a\xb5\xf3\x0e\x77\x8b\xe1\x30\x6f\xae\xe9\xc2\x13\x10\xc5\xc9\x97\x54\x2e\x31\x8a\x1d\xb8\xb8\xf4\x4c\xdf\xc2\xfe\x9e\xb3\xcf\x9a\xe9\xe6\x7d\x55\x67\xf5\x74\x55\xc3\x66\x97\x9f\x32\x0d\xf3\x7a\xa1\x64\x1c\x2c\xc9\xe3\xd9\xad\x13\x85\x55\x2b\xe9\xc7\x4e\x4f\x19\xd1\x41\x9a\x77\xd4\x55\x7b\xc2\xe2\x02\x6c\x60\x73\x2c\x67\x42\xb7\xe9\x19\x4c\x8b\x64\x4d\xe8\xce\x3b\xc6\xa7\xbb\x39\xb9\x81\xc2\xfb\x23\x6f\x59\x1e\xdb\xa6\x6f\x7d\x17\x5e\xfc\xfd\xa4\x52\x9e\xac\x5b\xf1\x96\x2d\x45\x14\x8a\x5c\xcc\x70\x35\x3d\xf4\x71\x61\xed\x73\xd5\x8f\x8f\xf5\x93\x27\x78\x16\x31\xc6\xee\x27\x03\xb6\x6c\x37\xa5\x5b\x8f\xcb\x84\x1a\xe9\x20\x1b\x83\x27\xc5\x5b\x7d\x2a\x4b\xb4\xb7\xdf\xb6\xf6\xb6\x5f\xd2\x89\xf6\xb6\x47\xdf\x0a\x25\xbd\x18\xab\xdc\x39\x24\xd1\x86\x5b\x3f\x3c\xb3\x6d\xa1\x00\x50\xdf\xf8\xe7\xf3\x25\xa0\xcf\x3d\x8f\x92\x90\x6f\xb9\xdc\x79\x47\x71\x11\x04\x65\x1c\x78\xa2\x10\x17\x51\x84\xd7\x8b\x68\x84\x8b\xc6\x88\x89\x12\x8f\xc4\xf6\x34\xc1\x9e\x39\xb2\xb4\x37\x34\x63\x2f\x73\xf4\x82\x1d\x65\xa2\xa2\x08\x47\xb9\xdc\x0b\xc6\x78\x66\x00\xe0\x89\x6a\xf4\xf3\x98\x75\xf6\xac\xf0\x82\xb6\x54\x23\x4c\xbf\x7d\xb4\xa5\xc6\x0e\x8e\xf6\x4b\x7a\xa9\xd0\xff\x11\x7e\xd9\x88\xcf\xd3\x3a\xa0\xcf\xdf\x9e\xe9\x89\x15\x28\x6d\x09\x79\x4b\x14\x98\x61\x1b\x72\xb5\xc9\x40\x51\xe9\x46\xe4\xc8\x43\x3c\x97\x91\x94\x61\x2c\x72\x0c\x27\xeb\x47\xd5\x66\x72\x2a\xc5\x3d\xec\x1a\x6e\xa1\x20\xe4\x54\x6c\xd3\xb5\x32\x8e\xfb\x8b\xeb\x18\x7b\xea\x3b\x53\xc4\x3b\xe9\x28\x1e\x3f\x57\x76\xc5\x76\x0e\xe2\x0c\x1d\x70\x57\x5c\xda\x73\x73\x39\x85\x05\x5d\x75\xe8\xa6\xce\x33\xb9\xaa\xa5\xaa\x86\x27\x28\x32\xd3\x43\xbe\x05\x96\xe0\x1d\x3e\xe3\x62\x26\x3e\xdb\xea\x30\x7e\xe0\xa2\xa3\xdc\x75\x99\x77\xa7\x3a\xa5\xe8\x2c\xca\x28\x0b\xcc\x5d\x72\xff\xc6\xaa\x48\x77\x64\xb3\x6d\xed\xbf\x37\xdb\xba\x8d\x56\x6e\xd2\x0e\x10\x99\xcc\xd0\xba\x2c\x5d\xf6\x59\x7b\x98\x96\x4b\x37\x24\x17\x44\x10\xaf\x9e\x14\xf2\xd9\x74\x82\x8b\x6d\x70\x7e\x80\x1d\xfa\xe0\xce\x70\x60\x2c\xdd\x74\xe5\x66\x63\xab\xe6\x72\x1e\x48\x3a\xba\x88\x48\x2c\x3e\x1d\x26\x8f\x4b\x2c\x2f\x5a\x04\xbf\x9f\xb4\xce\xea\xd5\x2b\xfd\xf6\x08\x5d\xbe\x11\x7d\xc3\x7b\x1b\x0d\x23\x2f\x9a\xf6\x48\xb8\x81\x2e\xe6\x44\xdf\x18\x0d\xc3\x79\x34\x1c\xd0\x80\x18\x55\x69\x16\x76\xe7\xa0\x67\x6f\x66\x18\xc1\x23\xd3\x3f\xe9\xa4\xc6\x64\xc9\xad\xdc\xd7\xdd\x6e\x8a\xd1\xe2\x83\x48\xb4\x9b\xa9\x36\x3f\x66\xf1\x6c\xc4\x2d\x15\x49\x91\xe6\x6c\x6e\xa9\xf4\x5f\x06\x49\x97\x87\x81\x9d\xe9\xc4\x31\x92\xda\xb7\xa2\x01\xe9\x32\xe7\x12\xe1\xe5\x36\x75\xa6\x12\x60\x5b\xf1\x55\xd4\xc7\x8e\xe2\x8b\xde\xef\xe7\x72\xfd\x3d\x0f\x4e\xb5\xfa\x6a\xec\xe1\xe2\x9e\xc7\x68\x36\xaf\x50\x32\xd2\xfe\x90\x07\x92\x8f\x9e\xa4\xac\x29\x77\x4e\x32\x07\x14\x52\xc0\xa9\x2b\x43\x71\x5b\x16\xff\xb9\x63\xf9\x6c\x13\x0e\x7a\x37\x2d\xa1\xb2\x10\x30\x64\xf5\x81\x9e\xfe\xd6\xc7\x5d\xcd\x7b\x1b\x29\x22\xac\x64\x09\xd7\x4a\xb4\xe0\x7e\x1e\x7b\x2a\x82\x7d\xc9\x0c\x50\xdf\x52\x0d\x1f\x2f\x0d\x0b\xcf\x2e\xfa\x9f\x8d\xc8\x55\x3a\xa2\x51\x83\x05\xfd\xcd\x48\xd2\xe9\x68\xb1\x87\xb0\x67\xef\x7d\x7c\xf0\xc9\x5c\x97\x27\xb3\x07\x93\xd9\x67\xec\xdb\x12\xea\xf8\x16\xe7\xe5\x32\x28\x60\xcb\xe3\xef\x53\x92\xb8\xda\x62\x96\x11\x18\x36\x53\xe2\x1c\xa6\xc1\x01\xc5\xe9\xb3\xf3\xb3\xba\x7e\x89\x4e\xe7\x44\x1f\xb5\xd0\xe9\x8c\xe8\xa7\x01\xba\x9c\x11\xfd\xb1\x85\x5e\xde\x88\x7e\x77\x88\xce\x66\x44\x7f\x3a\x8a\x51\x4d\x4a\xff\xe0\x13\xfd\xfa\x08\x8d\x66\x44\x9f\x1c\xa2\x60\x41\xf4\x5a\x1b\x8d\x67\x44\x3f\x38\x44\xf3\x37\xa2\x3b\x75\x01\xe4\xf5\x8d\xe8\xf7\x87\x31\x3a\xa4\xb9\x79\x8a\xde\x82\xe8\xdd\x2a\x41\xb3\x37\xa2\x1f\x8e\x09\xba\x38\x6f\x9d\x75\xae\xf5\x97\xd6\x12\x5c\x56\x58\x8c\xea\x34\xef\xf1\x1b\xd1\xbb\x6d\x14\xce\x89\xfe\x38\x27\xe8\xe8\x8d\xe8\x41\x3b\x46\x0d\x1a\x77\xe7\x13\xdd\xab\x23\x3b\x20\xfa\x65\x17\x55\xdf\x88\xee\xd7\x63\x74\x44\xa3\x2e\xe7\x44\x9f\xb7\xd0\x64\x4e\xf4\x5a\x13\x1d\xcf\x88\x3e\x6b\xc4\xa8\x29\xb5\xe5\xaa\x75\xd4\xec\xe8\xe7\x13\x74\x52\x6f\x74\x74\xd2\x45\x9d\xf3\x0b\x7d\xb3\x8d\x0e\xce\x3b\x9d\xf3\x53\xfd\xe2\x10\xdd\xfb\x44\x9f\x1c\xa1\xde\x9c\xe8\xcd\x23\x34\x7e\x23\xfa\xd5\x61\x8c\x5a\x12\x8c\x2f\xb2\xc4\xe8\xba\x83\xdf\xcf\x6f\xf4\xab\x2e\x3a\xbb\xd1\x3b\x41\x8c\xda\x34\xd7\xed\x8c\x80\x5f\x9b\x19\xd1\x7b\x75\xd4\xa6\xad\x6d\xc4\xa8\xd3\x49\xe0\xf1\x12\xdb\x73\xa2\x3f\xb5\x62\x74\x4c\x33\x4d\xde\x88\x5e\x1d\x13\xf4\x42\x7b\xef\x80\xc4\xe8\x04\x9a\x4e\xbb\xe5\x08\x0d\xe7\x44\x3f\x7c\x25\x31\x3a\x95\x6a\xd5\x9d\x13\xbd\x71\x24\xba\xe5\x62\x46\xf4\x61\x0b\x7d\x5b\x2c\x88\xfe\x4a\xf3\x9f\xd1\xa4\x57\x73\xfd\x2d\xc8\x26\x89\xd1\x39\x8d\x39\xac\x37\xaa\x37\x27\x1d\xdd\x6e\xa0\xb3\x37\xa2\xf7\x1a\x31\xba\x80\x95\xf3\x8d\xe8\x9b\x75\xc4\xfb\xfc\x66\x46\x74\xbf\x1d\xa3\x4b\x68\x17\xad\x76\x90\x8d\x4a\x46\xf1\x26\x6d\x1e\xc7\xb3\x93\x39\xd1\x0f\xde\x08\x6a\x50\x3c\xa8\xc7\xe8\x0a\x56\xd9\x37\xa2\x47\x63\x82\xfa\x6f\x44\x1f\x8c\x49\x8c\x6e\x3b\xf8\xbd\x3f\x27\xfa\xe5\x11\x47\x8f\x18\xdd\x75\xb0\xf9\xce\x64\x1f\x36\xfe\x63\x7b\xbb\x5c\xae\xd5\x36\x50\xd8\x0b\xba\x53\x8f\x86\xfc\xdc\xa9\x36\xea\x5b\x1b\x31\xe2\x69\xbc\x03\x29\xb2\xd1\xd8\xde\x2e\x16\xd3\xc8\x20\x1b\x59\xab\xc9\x91\x9d\xaa\x14\x59\xfa\x59\xdb\x2a\x1d\xa6\x91\x1b\xff\xf1\xeb\x57\xb1\xf8\xeb\x97\x5c\xf4\x61\x63\xa7\xd4\xc8\xa4\xa1\x29\x6a\x65\x39\x4d\x69\xa7\x76\xd0\x68\xc8\x69\x0e\x0f\x7f\xfe\xac\x54\x36\x32\x15\xf9\x55\x39\xdc\x92\xd3\x94\xcb\xd5\x6a\xb1\x28\xa7\xf9\x55\x69\x1c\xc8\x95\xdd\xf8\x8f\x83\xdd\xad\xfa\x56\x3d\x53\x9f\x83\x72\x79\xa7\xb4\x11\xa3\x6f\x69\x7f\x95\xca\xdb\xbf\x76\xe4\x44\x3b\xa5\xdd\x83\x5a\x39\x05\x44\xe4\x2e\x39\x38\x2c\xd7\x0e\x32\x2d\xda\xda\xaa\x56\xb3\xad\xde\xde\x39\xac\xd4\x32\xb5\xad\x56\xab\xd5\x52\x49\x4e\x53\xff\x55\xff\x55\x6a\x64\x5b\xb4\xbd\x9d\x1d\xb8\x5f\xbb\x95\xca\x61\xa6\xac\x7a\xb9\xb2\x9d\x6d\x75\xa3\xb1\xdb\xd8\xca\xb4\x7a\xf7\xa0\x58\x29\x66\x7a\xef\x70\xab\x78\x50\x3c\xc8\x94\xb5\x53\x2a\x96\x33\x69\x0e\xca\xa5\xc3\x83\xaa\x9c\x66\x7b\xeb\xd7\x56\x79\x2b\x83\x48\xc5\x83\xc3\x4a\x5d\x4e\xb3\xb3\x53\xf9\x59\xcd\x8c\x66\xb9\x5a\xad\xd4\x7e\x66\xe0\x1c\x6c\xd7\xab\x99\x76\x95\x0f\x2b\xc5\x5a\xa6\x5d\x07\x95\xca\xf6\x56\xa6\xac\xc3\xea\xaf\xd2\x76\x59\x4e\x53\x2a\x1f\x96\xb7\x32\x6d\xdf\x3a\xac\x57\xb3\x69\x0e\x7e\x95\xb6\x77\xb7\x33\xfd\xbc\x5b\xaa\x57\x33\x69\x1a\x3f\xb7\x77\x7e\xd5\x37\xd0\x37\xa9\x13\x77\x76\x76\xab\x99\x86\xfd\xaa\xed\xfc\xda\xce\x60\x45\xad\x58\x29\xfd\xdc\xc9\x0c\xea\xaf\xda\xcf\x52\xa6\xb0\xc3\x4a\xbd\xbe\xb3\x9d\x41\x8e\x6a\xa5\xb2\x7b\x98\x41\x8e\x7a\xb5\x52\x2b\x67\x07\x7e\xf7\xb0\x94\x1d\xf8\xca\x61\x69\xeb\x57\xa6\x61\xf5\xea\x52\x59\xf5\x5f\xb5\x6a\x76\xfa\x15\x6b\x3b\xbf\xb2\x9d\x58\xfa\xf9\xab\xbc\xbd\x2b\xa7\xa9\xfc\xdc\xfe\x99\x45\xc4\xda\xce\x4e\x85\xc2\xb1\xd0\x35\x5d\x6f\x12\x4c\x83\xff\x32\x98\x56\xa7\xff\x36\x62\xd4\x69\x11\x6c\x9a\x3b\x16\x32\xb7\x90\xfc\xfb\x13\x95\xd1\xee\xd2\xdb\x36\xfa\x89\x76\x50\x19\x55\xb2\x5f\xcb\xb1\x68\x17\xfd\xb2\x2c\x74\x43\x6b\x00\x6e\xd2\x3a\xde\xdb\xf4\x7a\x3a\x0f\x3d\x9d\xd7\xe8\xa6\x8a\x7a\x53\x12\xf6\x1c\x7d\xbd\x18\xa3\x60\xdc\x73\x29\xfd\x39\xd1\xdf\x6d\x32\xf1\xe8\x2b\x5d\x69\x07\xbd\x68\x38\xa6\x59\xcf\x47\xc4\xe9\x4d\xe7\xba\x56\x61\x61\x47\x3c\x7d\x12\xfe\x13\x7d\x8b\xbc\xd7\x4e\x6f\xc0\xf2\xae\x97\x10\x09\xc3\xe1\xeb\x29\x4d\xac\xaf\x17\x69\xae\xeb\xe9\x78\x18\x05\x27\xbd\xc8\x3b\xec\xb1\x83\x7e\xfd\x27\x44\xdc\x79\xa4\xbf\x22\x98\xa5\xef\x0c\x3f\x45\xef\xd0\xd8\xb3\xe1\xd4\xe9\x26\x41\x25\xc8\x71\x4a\x9e\x58\x75\x97\xc3\x45\x33\x24\x10\xb3\xa8\x37\xed\x74\xc7\xde\xa4\x3b\x0c\x5d\xbd\xa4\xb1\x90\x89\xfe\x3e\xe8\x85\x61\x6f\xe2\x39\xc3\xc8\x9d\x80\x0d\x9f\x01\x99\xea\xe6\x46\x57\x1f\x0c\xf4\xc9\x44\xbb\xbe\xbe\x5e\x23\x1b\x16\xea\x45\x53\x6f\xfc\x42\x42\xdd\x2c\xa1\x1d\x54\x2a\xa2\x9d\x22\x2a\x15\x8b\x68\xab\x48\x5f\x8b\x56\x8c\xbe\x84\xb1\x3a\x7f\x69\x07\x6d\xd3\x6c\x83\x5e\x34\x9b\x7a\x52\xb6\x8b\x20\x9b\x7a\x8b\xa6\xe7\x89\xbb\xc3\xd9\x38\x53\xc2\x27\xd8\x5b\xa8\x8c\x4a\x5b\x56\x8c\x5c\x32\x97\x52\xb6\x7c\x54\xfd\x04\xb7\x42\x8b\x1f\x46\xd3\xae\x0c\xf2\xf4\xf4\x74\x6d\x0e\x76\x0b\x4f\xd7\xe6\xf3\x0d\x74\x5c\xcb\x66\xfb\xb6\x8d\xca\x56\x8c\xe6\x1e\x91\x6b\x72\xd7\x5d\x51\x69\xda\x3b\x4b\xfd\x84\x4a\xf5\x6d\x2b\x8e\xe3\x2c\x5a\x4d\xf4\xf7\x3f\x8e\xc6\x9d\x27\x43\xff\xfb\x9e\xf7\xfd\x95\x1d\xbe\xaa\xb7\x2f\x0f\x56\xf5\xf6\x3f\xed\xea\x4f\xfd\xbc\xdc\xc9\xab\xba\xf8\xb8\x26\xcc\xcc\xd2\xff\x96\x80\x6e\xff\xfb\x7d\x1b\xa3\x5b\xba\x0e\x74\x7b\x93\xe9\x30\x18\x93\x81\xfe\xde\xad\xbe\xf5\xa4\xa9\x5e\x83\x15\xe1\x52\x5e\x05\xd8\x22\x71\x19\xc7\xc8\x26\x63\xfd\x3d\x18\x0f\x67\xa3\x3b\x70\xe1\x78\x74\x40\x21\x7e\xbb\xa3\x20\x5f\x00\xce\x4d\x8b\xa0\x6e\xf2\x36\xe9\x2d\x3c\x06\x9e\xce\xe1\xde\x02\xe6\x2b\x79\x83\xb7\xed\x62\x0c\x42\xa4\x67\x64\xe0\xe9\x41\x0d\xad\x5e\x9a\xde\x3c\x2e\x80\x5a\x8c\x91\x3d\xb3\x6d\xe1\xe4\x71\x29\x51\x1c\x23\x87\x44\x6e\xe8\x4d\xa6\x3d\xa7\xaf\xbf\x77\x87\x74\xc5\x69\x4d\xae\x7a\x93\x5e\x14\xe8\xeb\xa5\x18\x91\x28\x1a\x32\xa7\xfe\x13\x38\xed\x9f\x0d\x56\x40\xa2\x64\xfe\x64\xea\x0d\x58\x2f\x38\x07\xb1\x30\x2a\xf5\x39\xe9\x4d\x75\x29\x69\x8c\x06\x74\xcd\xa1\xed\xa5\xcd\xa8\x89\xa5\x15\xb0\x39\x1b\xfa\x50\x45\x36\x71\xfa\xb4\x27\x23\x97\x05\x31\x17\xb5\x0b\x0f\x71\x0f\xb2\x9b\x55\xfe\xc6\x7a\xba\x18\x23\xa7\x4b\xc6\xd3\xea\xd8\x23\x74\xb0\x56\x65\xa6\x23\x34\x1d\x0e\xc3\x69\x6f\xf4\x55\x27\x65\x47\xf9\xb6\x9a\x0c\x33\x0b\x78\x3a\x40\xa3\x9e\x77\x1d\xf6\x1c\xef\x00\xfc\xda\xb2\xe0\xaa\x47\x83\xaf\xbc\x49\xcf\x9d\xb1\xd8\x24\xf9\x37\x91\xfe\xd3\xc8\x55\xbd\x18\x91\xb1\x47\x92\x6d\x61\x3b\x41\xd4\x89\xfe\x3e\x81\xa4\x07\x87\x5c\xac\x98\x72\x5b\xbd\x88\xb7\xb5\x04\x8e\x79\xa5\x7c\x36\x19\xb3\x18\x6d\x6b\x07\x4d\xba\xc3\xf1\xf4\x20\x09\x29\x21\x7b\xf8\x96\xc6\x52\xbe\x54\xe4\x2c\xa1\xd1\xb0\xc7\xa5\x94\xcb\x31\x22\x70\x3c\x30\x39\xf5\xa2\xd9\xea\xee\x41\x6e\x6f\x42\xec\xd0\x73\x3f\xb5\x65\xe3\x3f\x9c\x22\xfd\xb7\x11\xc7\x28\xf4\x02\x2f\x72\xf5\xf7\xc8\x7b\x3d\x61\xaf\xeb\x25\xb4\x12\x3b\x46\x24\xe8\x45\xc1\x0a\x60\xc5\x62\xa9\xe4\x38\x1b\x31\x9a\x38\xe3\x61\x18\x56\xc7\xe3\xe1\xeb\x44\x7f\xa7\x15\x7c\xe1\x5d\x9b\x24\x42\xbd\x48\x0e\x7f\xa2\x78\x46\x82\x60\x0c\x77\xf3\xc3\xa8\x43\xc6\x81\x37\xa5\xfb\x33\x00\x67\x93\x4d\x54\x71\x25\x0e\x7c\x9e\xc5\xa5\x62\xf1\x47\x49\x2b\x97\x76\xf3\x87\x5e\x8c\xa4\xa5\x21\x24\x93\xe9\xc1\xcc\xe9\x7b\xd3\x0b\x6f\xec\x78\xd1\xb4\x17\x7a\x7a\x11\x75\x7b\xae\xc7\x82\x5b\x53\x6f\x30\xa1\xed\xff\x66\xc3\x37\x74\x75\xa1\x44\x51\x9e\x25\x38\x9b\x0d\xbc\x31\x9b\xf4\x49\x80\x4d\x43\x32\xa2\xdf\xf7\x19\x6b\x89\xe2\xa0\x7b\x5b\x3a\x43\x7f\xc8\xa4\x28\x15\xb8\x68\x76\x21\x9b\xea\x31\x93\x6a\xfb\x3b\xf9\x4e\x0a\x5b\xf4\xf7\x3b\x61\xc7\x71\x9b\xd9\xe3\x38\x32\x07\xd6\xb7\x05\xac\x2f\xf2\xe7\x44\x9f\x1e\x49\xd5\x22\x6d\x00\xb7\xa4\x5a\x73\x7b\x24\xe4\xd7\x17\x4f\x5c\xfb\x2b\x09\xb9\x6f\x11\x16\xf4\xd4\x12\x41\x0f\x22\x68\x9a\xa4\x7a\x6c\x91\x44\x01\x2c\x01\x25\x1b\x8f\x6c\x4b\x4e\xe5\x2f\x22\x85\xa0\xe8\x90\x8b\x6d\xae\x7f\xf6\x33\xe7\xb2\x24\xed\x67\x82\xb6\x8b\xaa\x41\xf0\x26\xfd\x6c\x3d\x13\xb4\xd9\x02\xe3\x50\x04\xb3\x86\x24\x47\x37\xb3\x31\xa0\x8e\x6e\xa3\xc5\x8e\x4e\xd0\xf9\xad\xee\x66\xcc\x2e\xb2\x66\x13\x4c\xcc\xb6\x6b\x89\xd3\xb1\x61\x0f\x0e\x3c\x89\x79\x62\x5b\xca\x8f\xff\xeb\x3a\xff\x23\x50\x3f\x3e\x4c\x4b\xb2\x9a\xd7\x26\xcb\x76\x3f\x18\x28\xe4\xe2\xa7\x27\x85\x8c\x83\xd9\xc0\x8b\xa6\x13\x54\x52\x91\x87\x1d\x7e\xf8\xe7\x8a\xe3\xb3\xcd\x9e\xe2\x21\xd7\xf4\x2d\xf5\xe3\x03\x3c\x08\xc3\xbb\xe1\x60\x66\x68\x60\xe2\xa9\xc6\xc0\x06\xf9\xe0\xb4\x48\xaf\x9d\xb9\xf4\xf8\xb2\x38\x07\xfb\x6d\x02\xf2\x75\x5f\xc3\xf2\xdb\xd9\x5b\xad\xeb\xd5\xb2\x88\xeb\x9b\x3d\x66\x57\x47\xbe\x0e\xbc\xe7\x37\xb1\xf7\x1d\x34\x39\x53\x8d\xa0\xa7\xdc\x77\x54\xe3\x0e\xdf\x73\x33\x13\x4f\x2b\x64\x00\xdf\x37\x9c\x90\x4c\x26\x1b\xba\x7b\xc8\x34\xc4\xae\x43\x85\x24\xf5\x8b\x91\x8d\x89\xd6\x23\x8a\xaa\x3d\x29\x17\xc8\x46\xc4\xbc\x5f\x70\x71\x9d\xde\x44\x23\x4f\xb4\x12\xda\x23\x88\xf2\x3d\x9e\xa6\xa6\x95\x24\x01\xbe\x3b\xed\xbe\xbf\xe2\xb2\xf6\xe1\x10\x5c\xfa\x75\x57\xc9\x5f\x12\xb3\xe3\x58\x18\xbf\xf8\x34\xc9\xe9\xb2\xda\xfa\xfc\x54\xb1\x91\x73\x98\x94\x71\xdf\xd1\x3c\xed\x94\xa4\xca\xf7\x60\xb4\x21\xb0\x57\xba\xc1\x3d\x07\xd3\x51\xce\x0a\x09\x97\x35\xef\x99\xc4\x86\x7b\xa6\x78\xcf\x64\x45\xc6\xc8\x7b\x5d\x9b\x9d\x31\xc9\x8c\x7b\xa6\xf1\x96\xb1\x01\xf0\xc0\xfb\xfe\xa1\x83\x68\xa7\x07\x3d\xe5\xa1\xa3\x1a\x0f\xcc\x1c\xd3\xaa\xe2\x7c\x5e\x9c\xff\xb7\xc5\x3d\xac\x28\xee\x31\x2b\xf8\xbc\xc9\x74\xd8\xe5\x1b\xcd\xcd\x44\xf7\x3e\xbd\x95\x01\x29\x4b\x32\xf5\x14\x62\x7a\x0e\x1d\x46\xe4\x31\x25\x4e\x9b\x5d\x88\x99\x5d\x73\x6a\x21\xd0\xe3\xb0\x4c\xc7\x42\x7d\x5c\x34\xfa\x7b\xbe\x91\xcf\xf7\x55\x6e\x51\x8e\x98\x4f\xed\x3c\xb9\x31\xfb\x96\x85\x22\x4c\xcc\x4e\x83\x7f\x81\xe0\x0a\x51\xd1\x08\xdb\x66\xdf\x42\x13\x1c\xb4\x89\xd9\x87\xdb\x9e\x22\xc6\x23\xd5\xc3\xde\xc7\x47\x71\x1d\x47\x70\xa3\xe2\xa0\x10\x32\xb8\xc8\x9c\x58\xdc\x64\x9d\xb7\x9f\x86\xe5\x47\xdf\x95\x52\x1e\x14\x51\x94\xa8\x30\x51\x7f\x8c\x54\xd5\x52\xf5\x4c\x82\x20\x89\x12\x0a\xad\x71\x9c\x88\xdb\x24\xfd\xd0\xcd\x4e\xce\xae\x59\xb7\x90\x8b\x03\xb8\x75\xf1\x8c\xac\x41\xe0\x5c\xae\x88\x99\x46\x44\x3e\xef\xa9\xae\xe9\x59\xb8\xc8\x1b\xe0\x89\x15\xcf\x35\x8b\x16\x76\xc0\xc2\xed\x0f\xdb\x2c\x5a\xea\x77\x1b\x24\x57\xf8\xfd\x62\xd1\x20\xa6\x57\x28\x59\xbf\x71\xaf\xcd\xde\xf6\x7d\xac\x55\x40\x3c\x93\x7e\xc1\x0d\x96\x56\x52\x0d\x80\xee\x28\x74\x28\xac\xbc\xaf\xfe\xa0\xc5\x52\x58\x9e\x95\xca\x0c\x49\x7a\x0b\x62\x35\x84\x81\x37\x8b\x88\xfd\x2b\x59\xa9\x48\x27\xb6\x6f\xe4\x28\xa5\x92\xe7\xba\x72\x85\x92\xfa\x9f\x15\x0b\x15\x4a\x12\x76\x38\x37\x59\x6b\x3b\x60\xb0\xf9\xf3\x54\x34\xd9\x6d\x84\x7b\xa3\x10\x55\xb5\x62\xb6\xf8\x27\xe2\xfa\x04\xdf\x5c\x29\xe2\xbe\x02\xb9\x2a\xb2\x4d\x62\x19\x0e\x6e\x36\x88\x14\xcc\x16\x7f\xc7\x2c\x26\x0d\x23\x7b\xd8\x85\xfb\xc1\x7d\x9a\x41\xa7\x23\xe4\xdd\xf0\x9b\x06\x07\xac\xbb\xa0\xf3\x9e\x62\xcb\x8a\x46\x76\x52\x5f\xf2\x19\x8b\xd9\x06\x64\x70\xfb\xb6\xec\xbe\xde\x66\xd6\x65\x5d\x95\xa9\xca\xdb\xa6\x6b\xa9\xef\x6e\x62\x47\x76\x6d\x1a\xbb\x78\xbd\x18\xf7\x7c\x25\xb9\x72\x26\xc6\xdf\x64\xe7\x56\x72\x6f\x98\x7e\x30\xcc\x04\xcf\x42\x1e\x9b\x05\x1e\x9f\x01\xa0\x72\xe4\x8b\x77\x2f\xef\x7c\xa7\x99\xad\xe4\xda\x9f\xc8\x96\x08\x6f\xd2\x1b\x29\x58\x50\xfb\x3e\xdd\xef\xa0\x55\xdc\x4c\xc4\x81\x10\x03\x79\x98\x10\x61\x48\xe2\x7e\x3b\x99\x78\x8e\x25\x17\xcb\x94\x05\x26\x24\x99\xa5\x8e\xc5\xe5\x5a\x16\x6f\x69\xb7\x89\x92\xd4\xf8\x90\x28\xfe\xcd\x92\xa4\x8f\x2c\xf4\xf9\xf6\x87\xcc\xa2\x2a\x79\x61\x83\x85\x24\xc5\x43\x8d\x78\x4e\x66\xed\x4a\xbb\xdf\x96\x30\x95\x2e\x64\xb4\x58\xad\x3a\xfc\x4a\xd6\x6a\xf1\xb6\xc7\xdb\xbf\xcf\xbf\x97\x2f\x56\xfb\x62\x46\x3c\x7c\x21\xad\x5f\x5c\xc7\x92\x3d\x75\xa6\xc9\x51\xcc\x88\x44\x00\x5a\xbf\x7f\xba\x9e\x2b\x94\x0c\xc9\x4e\x32\x72\x28\x05\x62\x25\x62\x20\x14\x29\xec\x3c\x26\xa6\x6b\x7d\x0f\x28\x2a\xa4\x7b\x9d\x64\xef\xf3\x66\x85\x34\x49\x70\x93\x5c\x8a\x3b\x86\x53\x28\xa8\xb6\xe9\x58\x18\xd6\x38\xf2\x23\xa0\x83\xa5\x22\x52\xc0\x34\xf4\x3b\x7c\xae\x10\x9f\xe9\xde\xb0\x46\xf7\x6e\x24\x83\x31\xd0\x8e\x34\xcd\xd3\x8d\xd4\x0b\x50\x13\xd3\x7d\xb6\x14\x29\x45\x8f\x43\xf9\xf9\x9b\x36\x6d\x1f\x64\xc4\x9f\x9f\x94\x22\xfa\x59\x00\xa9\x25\x55\x87\xf5\x31\xb5\xb9\xba\x94\x3f\x14\x7d\xcf\xaa\x91\x5a\xb3\x01\x14\x29\xfd\xaa\xc0\xda\xc4\x17\xa2\xa2\x6a\xd8\xe6\xab\x6b\xd1\xa5\xae\x6c\x7d\x7c\x14\xd5\x3c\x4d\x41\x43\x67\xae\xa5\x10\x73\x07\x02\x0d\xdb\x6c\xb0\x44\x3f\x79\x22\x6e\xb3\xa7\x39\x9c\x8d\x27\x0a\x31\xb7\x79\x32\xb0\x0f\xc8\xce\x48\x14\x62\x6e\x49\xa1\xd7\xec\x90\x05\x8c\x8e\xcb\x69\xd3\xf3\x1a\x58\xb6\x21\xea\x73\xd7\x0e\x96\x28\xaf\xaf\xb4\x40\xc8\x77\x3b\x56\xe3\x6f\x30\x4f\x6e\xf0\x86\x0c\x7e\x8d\xd7\x60\x8d\xd7\x6f\x0d\xea\x0e\xbd\xb2\x76\x3a\x8c\xa6\xdd\xb5\xc6\x2c\x0c\x1f\x3c\x32\xce\xb8\xc9\xe8\xdf\x60\x73\x43\x3e\x56\xda\x40\x1b\xe9\x1b\x3f\x0f\xda\x40\x1b\x70\xde\xb3\x81\xbc\x29\x41\x1b\xec\xc4\x66\x03\x6d\xc0\x49\xcc\x86\x85\xc2\x1b\xfc\x1e\x1b\x8f\x4a\xff\x66\x49\x2e\x26\xbc\x31\x89\x85\x6d\x2e\x01\x33\xb8\xc1\xa6\x59\xb2\xe8\x3e\xc1\x7e\xd3\xa7\xfc\x96\x7d\x5f\xfe\xa2\xdf\x16\x0a\xda\x04\xa7\xc9\xe9\xaf\x85\x7a\x34\x6c\xa7\x58\x44\xdb\xf0\x57\xda\x42\xa5\x1d\x54\xa6\x31\xc1\x0d\x36\x4b\xa8\x54\xdf\x46\xe5\xfa\x4f\xb4\x5d\xae\xef\xa0\xdd\xf2\xcf\xfa\x0e\xda\x2a\x6f\xfd\xaa\xfc\xdc\xde\xa5\x39\x4a\x3b\x3b\xe5\x5f\x5b\xe5\xfa\xb6\x64\x50\x2d\xba\x59\xc1\xfe\x1c\x04\xcc\x6c\x46\x2d\xe0\xbc\xcb\x3b\xe9\xeb\x51\x9b\xa0\x83\xb9\x3e\x6c\x13\xae\xe5\xdb\xee\x4a\xb1\x23\x16\xfb\x9c\xc4\x76\x18\x88\xba\x9c\x68\xcc\x12\x4d\x68\xa2\x2c\x73\xb4\x14\x2b\x31\x4a\xe3\x76\x86\x6f\x24\x99\xc9\x38\xc9\x44\x92\x34\x22\xca\x46\xb0\x45\x3f\x8d\x1e\x66\xa2\xd3\x2d\x4f\x4a\x32\xca\x96\x9b\x5d\x04\x9e\x33\x91\xb0\x24\xc8\xd2\xab\x37\x19\x2d\xdb\x8b\xbf\x12\x8b\x5f\x97\xc9\x7e\x53\xc4\x4e\xfc\xa0\x0c\x6f\xd0\x0b\x30\x11\xc3\x9b\x2f\x35\x75\x87\x37\x9a\x67\x1e\x3b\x96\x4c\x82\xb3\x5d\xbf\x21\xeb\xd6\xce\x67\x60\xfb\x04\x9b\x16\x13\x85\x23\x9a\x84\xf3\xaa\x08\x5b\xfa\x64\xd8\x9f\x7c\xd2\x29\x90\x7c\xb8\x64\x9e\xa6\xa3\xf3\x21\xf9\xa2\x93\x42\x4d\xda\x31\x6d\x13\xc5\xb4\xe9\x0a\x07\x22\xa2\x67\xb6\x85\xe8\xfe\xce\xd5\xfc\x1e\x8a\x56\x86\xb4\x9e\x8a\xc5\xed\x55\x12\xc6\x26\xb2\x0c\xde\xca\x65\xe1\xfe\xab\xe5\x22\xa6\x4c\xda\x9d\x76\xfd\x85\xfe\x9f\x76\xad\x30\x23\x73\xb5\xf6\x4a\x6b\x5b\x50\x1b\x1a\x7f\xd3\x58\x15\x3f\x4c\xe2\x47\xc5\x95\xbc\x14\x58\xa7\xf3\x8b\x9f\x65\xc1\x13\x9c\xa2\xec\x3a\x2c\xd0\xc5\xac\x09\x3a\x59\x27\x34\x43\x2c\x72\x35\x6c\xb0\xa0\xcd\xed\x61\x97\x85\x96\x98\x62\x17\x88\xfa\x03\x2c\x49\xdc\x28\x1e\xe2\xe8\xc5\x7b\xfa\x52\x35\x9c\x7d\x05\x88\x58\x09\xa3\x81\x72\xc4\x9b\x52\x98\x4d\xc9\xc6\x92\xaa\xea\x0a\xc9\x84\x13\x16\x8e\xec\x0c\x04\x9a\x1a\xe4\xbf\xbc\x1b\xc5\xa3\x4f\x20\x28\x91\xb0\x10\x39\x74\x09\xf6\x70\x71\xcf\xa5\xb1\xfb\x9e\xce\x89\xa8\xc1\x38\x91\x59\x3f\x74\x09\xb6\x0d\x47\x52\x08\xe5\xd3\x31\xd1\x03\xb5\x39\xa5\x49\xbb\xe5\x72\xeb\x53\xb7\x10\x21\x8e\xc3\x4d\x49\x0d\xc6\xc4\xb0\xf7\x04\x6c\x43\x65\xda\x66\x82\xe7\xb2\x29\xa5\xce\xd5\x06\x86\x2e\x41\x25\xe6\xbb\xe7\xe3\xc3\xde\xc3\x22\xcf\x52\x96\xd5\xfa\xa8\x22\x9a\xb5\x62\x3c\x12\x26\x30\x4f\x5b\x9f\x47\x9b\x92\x4b\xa2\x44\x15\x71\x02\xef\xa1\x48\x09\x76\xd6\x68\x17\x4f\xe7\x23\x6f\xe8\xaf\x11\x8c\xf1\x53\x77\x9f\x9b\x79\x23\xaa\xfe\xc9\xe0\x1b\x58\x57\xa6\x60\x67\x74\xb5\x5f\xb9\x63\x6c\x49\xef\x95\x3f\xec\x24\xdb\x99\xaf\x72\x36\xe5\xd6\xa7\x4d\x27\xfb\xbd\xb3\x1c\x5f\x5c\x0a\xd8\x5a\x4e\xb1\xb3\x9c\xa2\x54\x2c\x5a\x16\x7a\xa1\xed\x70\x46\xda\x69\xfd\xb0\x75\x73\xfa\xd7\x61\xb5\x53\x47\xff\xce\xe7\xc3\x50\x7b\xa8\x57\xaf\xfe\x3a\x3d\x3f\xeb\x34\xff\xaa\x1e\x1c\x5c\xa1\xbb\xae\x85\x5e\xa1\xbb\x68\x2b\x68\xcb\x68\xdd\xa0\xc6\x5b\xf4\x07\x6a\x46\x6b\x43\xbf\x59\x40\x51\xda\xa5\x59\x57\xb0\xe6\xf0\x66\x96\xd8\xd7\x76\x71\x69\x1b\x17\xbd\x26\xda\x9e\xf4\x4a\x49\x84\x6c\x17\x57\xec\xf8\x69\x67\xa7\x63\xf2\x33\x79\x13\x23\xf3\x6d\x69\x58\xfe\xf7\x8e\xf9\x5b\x76\xcc\x3b\xad\x53\x79\x18\xc5\xe7\x75\xf3\xfc\xaa\xc3\xbe\x12\xfc\xcf\x06\x83\xad\x6d\x4e\xef\xc1\xfd\xd0\x3f\xc2\x85\x74\xbb\x99\xb7\x3f\x59\xa3\x17\x67\x2d\x76\x81\xc0\xe9\xc3\x6f\x1c\x66\xce\x5b\x05\x5f\x11\x31\xe6\x81\xb1\xda\xa1\xfa\x83\xbd\x94\x8a\xaa\x8a\x42\x7c\x7b\xa5\xec\xac\xd8\x8f\xde\x9f\x3c\x3d\xb1\x28\x12\x15\x88\x8a\x82\x1b\x7d\x27\x8e\x55\x34\xa2\x5c\xca\x04\xaf\x97\xb8\x2f\x97\x30\xf1\xe5\xc2\xfc\xb8\x84\xcc\x8f\xcb\x82\xd6\xf7\x87\xf2\xa2\x3d\x79\xdf\x5f\xb4\xe0\x46\x45\x76\xe6\x2b\xb5\xa3\x08\x26\xb2\x0e\x6c\x4b\xe9\xf4\x94\xc5\xaa\xc3\x85\x17\x44\xac\x98\x19\xbe\x98\xa8\xcc\x22\xd9\x04\xaf\x93\x27\x65\x91\x70\xcb\x37\x3d\x65\xb4\x44\xcf\xa6\xe7\xba\x36\x57\x19\xa2\x53\xca\x63\xc6\xea\x7d\xec\x6a\xc7\x63\x62\xf8\x7b\xd8\xd5\xda\x63\x92\xcb\x79\xeb\xd8\x37\x3c\xec\x23\x3f\x8f\x5d\xed\x64\x4c\x04\x1f\x0f\x6a\x45\x8e\x16\xdc\x7c\xf7\x69\x7f\xa5\x9f\x8a\x9f\x0f\xbe\xbb\xda\xe9\x98\xa8\x2a\x8a\x70\x5f\xf1\x50\x88\x1c\xed\xc9\x53\x8d\xe8\x37\xd1\xfa\x83\x5c\x4e\x21\xf8\xbd\x3f\xd0\x23\xd4\xf5\x88\xfe\xbe\xd9\xd3\x21\xb7\xa7\x7e\xa7\xc9\xd0\x6c\xcc\xbe\x43\xf6\x1d\xc7\x12\xf3\x8f\xbe\xd1\x8c\x05\x97\x40\x56\x66\x36\x44\xeb\x7a\x12\x61\xb8\x58\x46\x08\xd9\x4a\x99\x69\x21\xc0\x0b\x14\x61\x37\xef\xa3\x11\x66\x46\x57\xc2\x1f\x4a\xa9\xa0\x38\x79\x4f\x55\x7f\x04\xac\x35\x53\x1e\x1a\xd1\x10\x63\xb4\xe7\x92\x5c\x6e\xb4\x87\x43\x23\x9f\x1f\x09\x8b\x76\xa3\xef\x01\x9a\x70\x10\x6c\x6b\x21\x05\xf7\x7b\x84\xec\x82\x52\x2a\x78\xea\xf7\x48\x55\xd1\x4c\x20\xd9\xa0\x17\x29\xa4\xe0\x88\x68\x9f\x45\xbf\x60\xca\xd0\xda\xb9\x5c\xf1\x37\xd9\x2f\xed\x05\xb9\x9c\x22\x20\x4e\x7e\x8c\xd4\xef\x23\x01\x60\xc6\xbe\x5e\xf0\x48\xd5\x8b\x7b\x98\xec\x4f\xb0\xe0\xc9\x27\xaa\x3e\xe3\x36\x18\x0a\x11\x9a\xa9\x94\x43\x9e\x15\x26\xb9\x1c\xf3\x78\x74\x3a\x26\xfa\x08\x9d\x8c\x89\xfe\x82\x8e\xc7\x44\x9f\xa0\xf6\x98\xe8\xb3\xb4\x57\xfb\x12\x4d\x2c\x58\xfa\xa2\x24\x32\x5b\x34\x8a\xbf\xc1\x0e\x07\x2e\x30\x71\x5c\x6d\xe7\xb7\x14\x49\x7b\xd7\x28\x62\x86\x01\xe4\x3f\x4b\x45\xd5\x50\x09\xff\xfa\x51\x4a\x89\xa2\x12\x28\x6c\xed\x60\x4c\xf6\xb5\x1d\x5d\x9a\x7a\x44\x9e\x7a\x79\xd9\xbe\xcf\xf3\x8d\x30\xdf\xda\xdd\xc4\xc5\xf8\x41\x79\x16\xe4\xf4\xf3\x0d\x3b\x93\x5f\x65\xb2\x64\xed\x67\xbc\x9a\xd0\x7e\xfe\x82\xd0\x16\x3b\x78\x6a\x5e\xb4\xd7\xc2\xa7\x32\xed\x7d\xd5\x50\x91\x30\xa2\x7e\x78\x89\x65\x03\x37\x8b\x2a\x51\xe9\xd6\xc3\x2e\xed\x2d\x6e\x46\x7d\x05\x95\x03\xc4\x9f\x58\xa3\x28\x21\xe7\xe2\x7b\xa5\xda\x26\xa9\x29\xe5\xff\x87\xb9\x77\x6f\x6a\x5b\xd7\x1e\x86\xff\xef\xa7\x28\x67\xfa\xcb\x58\x44\x11\x09\x2d\x3d\x3d\x36\x22\x03\x4d\xb8\x53\x0a\x25\x01\xea\xf1\x9c\x91\x2d\xdb\x04\x9b\x10\x72\x03\x42\xf2\xdd\xdf\x59\x4b\x92\xed\x5c\xe8\x3e\x67\x3f\xbf\xf7\x99\x67\xf6\x2e\xb1\xee\xf7\x75\xd3\xd2\x5a\xac\x71\x41\x35\x71\x88\x62\x78\x1a\xf2\x4a\xad\x59\xf9\x42\x23\x5e\xdb\x28\xd0\x2e\x77\x4f\xf4\x33\xa1\x31\x0f\x69\xc2\x23\x62\x5b\x90\x6d\x39\x3d\xe2\x55\x93\xc7\xd4\xee\x56\xbd\x75\x5e\xa9\xd1\x3f\xb6\x6c\xec\x78\x68\x32\x89\x10\x27\xc8\x48\x56\x4b\x72\x03\x70\x8d\xeb\x0f\xb4\xfd\x3d\x9d\x5a\xb0\x29\xa7\xd3\xea\x0e\xf7\xa7\x53\xf4\xff\x22\x39\x9c\x6c\x01\xc7\xd9\x9f\xd9\x96\xcc\x4c\xa7\xa8\xad\x1a\x54\x6a\x14\x37\x89\xbf\x81\x44\xef\x7a\x40\x08\xa1\x41\x85\x4b\x2a\x74\x56\x7f\x43\xd2\x8a\xd8\x40\xdb\xdb\x50\x57\x25\x58\xc7\xea\xe4\xba\x00\xb8\x27\xb8\x74\x7c\x6e\x09\x36\xea\x57\x04\xfb\xd4\x21\x1b\xa6\x9b\xd9\x6b\x0a\x25\x75\xca\xba\x5f\x2e\x4b\x12\x28\x16\xe7\x53\xa7\xec\xaf\xcb\xdc\xba\x91\xee\x54\x66\x97\x73\x60\xf6\x45\x46\x36\x06\x6e\xa0\x1e\x7d\x64\x33\x93\x11\x8e\x81\x22\x1c\x17\x6c\xbe\xc0\x76\x63\xfd\x5e\xd1\x92\xb9\x71\x1e\xa6\x9e\x91\xba\xc1\x64\xc1\x13\xa3\x36\x24\x04\x74\xa3\xe3\x9b\x59\xa0\xb7\x97\x96\xd8\xd0\xfb\x92\xcc\x9b\x54\xbe\xfb\xc4\xf1\x92\x68\x15\xcd\x9a\x61\xdc\x8c\x6d\x8b\xfa\xea\xfa\xbc\xd1\x89\x3b\xc3\x41\x16\xaf\x14\xf1\x75\x7d\xca\x8f\xde\xbe\x08\x86\x8f\x7d\x5b\x37\x4a\x7b\xfd\x30\xea\xbc\xd8\xad\xee\xa2\x15\xa6\x8b\x7d\x42\xe8\x60\x14\xad\x4e\xfd\xb5\x0f\x34\x7f\x76\xbc\xc2\xe7\x8f\xb2\x37\xcf\x49\xef\x2e\x43\x6b\x60\x1f\xaa\xde\xba\x25\x2b\x01\xd9\xb0\xe2\x75\x2b\xaa\x84\x84\x38\x92\xe3\xc7\x86\xaf\xad\x57\xd6\x9c\x78\xdb\x77\xca\xe5\x98\x04\x15\x2e\xdc\x9a\x79\x5b\xd5\x6b\x59\x21\x20\x20\x42\x6b\x6c\x93\x38\x98\xb8\x59\x4c\x7c\x2f\x21\xd2\x09\x1a\x88\x60\xfa\xe7\x42\xba\xae\x71\xf6\xe1\x5d\x66\xf4\x47\x37\x33\x79\xbe\x9a\x1b\xbd\xfb\x33\x33\x2a\xfe\xc8\x87\x2e\xb2\xa1\xb9\x8d\x85\x6c\x36\xf7\x8e\x33\xdb\xe6\xfb\xa7\xfc\x6d\x86\xc6\x6e\xfa\xad\x05\xb7\x94\x83\x56\x5e\xba\xdf\xaa\xf7\x5b\x36\x64\x09\x9f\xa1\xf8\x6c\xef\x18\x9f\x66\x3e\xad\xba\x59\xb4\xf4\xfe\xdc\x3f\x75\x85\x47\xea\x22\xe7\xef\x5d\x8f\x2c\x0a\x98\x87\x19\xec\x3e\xa8\xf1\xda\xec\xd6\x1a\x1a\xd8\x3d\xd4\xb0\xfb\x2f\x59\xfa\x25\xa3\x3f\xfa\x0e\xaa\xa5\xee\x87\xef\x5a\x05\xab\xef\xc1\xb6\xac\x57\x6a\x76\xb0\x23\x95\x21\xa0\x77\x97\xa0\xf5\xc7\x25\xb8\x6f\xfd\x95\x38\xe0\x9d\x65\xb8\x6f\x59\x55\xf2\x37\xd9\x7e\x99\xb1\xfd\x21\xb0\xfd\x92\x7e\x3f\x16\xd4\xb8\xe8\x38\xa8\x21\xf3\x89\x9c\x39\xf2\xe0\xfa\xcd\x78\x27\x48\x7e\x75\x26\x21\x2f\xc0\x55\xf5\xd0\x3b\x24\x64\x3d\x54\x82\x02\x2d\x1c\x97\x64\x5d\x52\x5f\x93\x15\x3e\x06\x51\x36\xa0\x22\x0a\xe9\xc3\x2c\x59\xb7\x9d\xf1\xf8\x8f\xfe\x22\x8b\x9f\x33\xf7\xda\x59\xd0\x66\x71\x56\x0c\xc9\x05\xac\xbd\x71\x6b\x76\x90\x71\xf5\x8f\xbe\x61\xea\x09\xf5\xf5\x0d\x88\x19\x90\xa3\x13\xe6\xb8\xf2\xd5\x00\x6e\x91\xb3\xce\xe0\x99\xf9\xb0\x6b\xdb\x7a\x0e\xeb\xdf\x23\x3b\x33\x7a\x73\x50\xab\x9f\x3c\x0a\xfb\x14\x1d\xc6\x1a\xe8\xf4\x76\x1e\xd8\x73\x6f\xfa\x79\x7a\x2c\x8a\x6e\x05\xb4\x75\x77\xed\x23\xf9\xbb\xe6\xdd\xb5\xe0\x16\x78\xcc\xec\x6b\x2b\xfb\xaa\x55\xf3\xe4\xfc\xf3\x73\xfe\x89\x15\x18\x8e\x33\x8f\x2b\x24\xe7\xb1\x9f\xf3\xd8\xff\x9e\xf3\x44\xde\xd0\x73\xe0\xec\xb3\xfd\x53\x36\xec\x3c\x84\x8f\x91\x14\xab\x2c\x5f\xc0\xb4\x0e\x5b\xb3\x2c\xaf\x14\xc3\xf0\x9d\x6c\x8f\x2d\x6b\x74\x2c\xe8\x67\x3a\x3e\x86\x65\x2a\x96\x80\x16\xde\x2f\xf5\x8c\xa5\x5e\xe6\x4a\x29\x83\x5c\xef\x94\x79\x6a\x15\x60\xcb\xa8\xa5\xcc\x1f\x8e\x34\x24\x91\x17\x2b\x54\x33\x04\xeb\xf9\x8e\xe0\x82\x75\x7d\xed\xe9\x79\xdc\x32\xde\xfd\x72\x79\x24\x2e\x7f\xea\xfa\x1e\x4b\xdc\xc0\x63\x32\x64\x77\xcf\xd3\xa9\xf6\x9a\x26\xdc\x40\x6d\x26\xf8\x14\x1e\xfb\x31\x74\xab\x9e\xad\x8c\xed\x17\x2c\x00\xcd\x5f\x91\xfb\xac\xe7\x53\x09\x8d\x09\x1a\x50\x9f\x75\x8b\x7b\x28\x85\x46\x12\x57\x62\x4b\xdf\x1f\xa6\x53\x15\xe5\x46\xbb\xde\xec\x9a\x85\xff\x5e\x09\x74\x58\x17\x71\xfc\xf5\xcd\x8a\xd4\xb7\x6b\x61\x43\x06\x3a\x09\x6c\x3d\x16\x18\xb8\xc7\x46\xc3\x19\x82\xb9\x1f\x2b\xa6\x46\x89\x15\x9f\x5c\xc1\x26\x81\xc7\x46\xc1\xfc\xa3\x4d\xbf\xfe\xd6\xf3\x6d\x9f\x76\x7d\x55\xe3\x0f\xc8\x78\x2d\x3c\xf3\x38\xf3\x9a\x1d\x1d\xfc\xc1\x17\x42\x0a\x33\x95\xc0\x8c\xca\xa2\x6d\x9e\xe7\x56\xc1\xf8\x45\x66\x8d\xb2\xd1\x37\x10\xc6\x7f\xd6\x5e\x3d\x9e\xd4\xef\xab\x76\xc7\x71\x66\xec\xcb\xeb\xf4\xa1\x86\xa4\xe7\x4f\xc6\x3d\xc7\xb3\xde\x05\x41\x6f\xa1\x57\x26\xbf\x71\x0f\x35\x7c\x5e\xed\x29\xaa\xd1\xd7\xa1\xe6\xb1\x28\x28\xe1\xe4\xb6\x9a\xd9\x99\x4f\xf5\xd7\x3e\x7b\x7a\xb0\x02\xb7\xef\xd1\xc0\xdd\xf5\x88\xb3\x7f\x9c\xb9\x8c\x0c\x8a\x9b\xa2\x99\xab\x7f\x15\x9e\x61\x5f\x58\x9b\xc4\x79\xbc\xb0\x24\xad\x42\x0b\xf8\x55\x43\x59\x3f\x8c\x53\x2a\xcf\x8e\x85\x8b\xd0\xfd\xbc\x16\xe1\xca\x57\xe0\xb0\x85\x45\x68\x34\x30\x88\x03\xca\xe1\xa3\xee\x7d\xe4\xdd\x4f\x9b\xce\xda\x63\xd7\x8a\x48\xa9\xb4\xd6\x85\xdf\xe9\x34\x64\x77\xbe\x05\xe7\x3f\x77\x51\x13\x41\x8b\x92\x9d\x4e\x38\xbf\x3f\x42\x8d\x0a\xc1\x1a\x43\x4b\xc2\x2e\xa4\x01\xa1\xaa\xa9\x88\xb6\x8e\xd1\x40\xe2\xe9\x13\x0f\xd9\x9e\xb0\xd6\xaa\xc4\x81\x46\xbe\x0b\x47\xb0\xe3\xa6\x15\x11\x27\x2a\x95\x22\xf7\x21\xf0\xd6\xf8\xe0\xa0\x54\xb2\x42\xf7\xc9\xb3\x02\x0a\x45\x4c\x2d\xf0\x8d\x7d\x3e\x3e\xc0\xca\xfc\xe7\xf9\xca\x9a\x1d\xe7\x00\x07\xf9\x87\xda\xfc\x67\xf4\x8a\x24\x19\xea\x3f\xfa\xa2\xcf\x21\x0e\x6a\x85\x1a\x5f\x6f\x75\x8d\x68\x4c\xf2\xd7\x37\x7c\xe8\x0e\x07\x2b\xbe\xc6\x4f\x27\xab\xe7\xf5\x16\x72\x9c\x3f\x71\x1f\x88\xb8\xf8\x7a\x25\x75\xf1\x56\x34\x91\x2b\x58\x9a\xe4\x46\x72\x05\xeb\x3d\x64\x96\x74\x8b\xe6\x72\xf5\x3d\xff\xbd\x75\xf6\x9d\x42\x43\xbb\x6e\xdf\xcb\x57\x68\x97\x0d\x1f\x7b\x65\xc5\x10\xb3\x5d\x77\xd7\xdb\xd8\xd4\x1b\x6f\x9f\x1d\x75\xa0\x0c\x44\x1f\x78\x54\xea\x8f\xb2\xaa\x81\x4a\xda\x69\xc2\xff\x81\x26\x2a\x8f\x9b\x73\x67\x59\xb9\x25\x36\xc0\xee\x7c\x88\x4e\xcb\xf5\x30\x60\xd9\x0e\xeb\x01\x17\x4c\xf4\x43\x61\x5b\xc1\x7b\x2a\x2a\x1f\x0f\xd5\x0d\x88\x76\x0f\x19\xf0\xdf\x0f\x68\xa4\x27\x40\x8f\x54\x27\xa9\x15\x68\xf1\xf9\x3e\xec\xa3\x00\xba\x19\xc0\x78\x68\x76\x06\xe8\x53\x97\xea\x93\x4b\xd4\x5b\x7e\xe5\x2a\xcc\x37\xae\xc2\x8e\xb2\x23\x82\x4e\xf4\x8f\xb3\x43\xc6\x4e\x0f\xc9\x9c\x09\x16\xd5\x97\xdc\xbc\x1e\xda\xca\xda\x15\x66\x69\x7e\x5d\xaa\x20\x74\xce\x57\x2e\xc3\x67\x82\x5d\x9b\xd0\x71\x6a\x41\xc8\x4d\x27\x05\x07\x47\xbf\x1f\x00\x69\x17\x2c\x2c\xb4\x56\x7b\x12\x15\x6c\x9f\xdd\xee\xa3\x93\xce\xc8\x3d\xf4\x68\x97\xdf\x09\x2b\x62\x83\x8e\x0c\x07\xe6\x0d\xb3\x32\x69\xd0\x05\x6e\xb7\xcb\xb7\xd4\x02\xf7\x54\xbe\xbe\xd6\x4a\x37\x59\x7b\x98\xb5\x07\x59\x7b\xbc\x4a\x9c\x1e\xef\x6d\xd4\xbe\x55\xd7\xef\xd8\xcf\xa3\x0a\xfc\xd9\xd8\x74\xd0\x06\xef\x9e\xa8\x5b\x29\x7f\x39\xa2\x5d\xfe\x99\xd8\x10\xf5\x7c\x9c\xc5\x7c\xa1\xbd\x32\xc7\xdc\x5f\x54\x5a\x3a\x14\xa5\x52\x96\xaa\x7a\x30\xe0\x90\x32\x39\x76\xb6\xaa\xd5\xed\x2e\x26\x73\xfe\x72\x34\x9d\xaa\x68\x82\x31\xaf\x4d\x95\x79\xa4\x78\x81\x4e\xb4\x98\xeb\x2d\x52\x03\x91\x61\x77\x68\x06\x11\xe1\x20\x00\x88\x58\x5b\xdb\xbc\x5b\xb7\x22\x7e\xc7\x82\xc7\x81\x85\x5d\xea\x12\x1a\x55\xb4\x4d\x85\x3b\x36\xe8\x74\xb3\xe8\x4d\xb2\x51\x88\xd8\xac\xe8\x78\x62\x47\x9c\x7d\x26\x4e\xb4\xce\xa5\xa3\x9a\x2d\x95\xac\xee\x3a\xdf\x24\x8e\xf2\x66\xd1\x3b\xc5\xfd\xa3\x04\xa8\x5d\xb4\xff\xaf\xa5\xa7\xd2\x19\x94\x4a\x23\xb4\x0f\x35\xe6\xda\x31\xc6\x84\x6f\xae\xab\xaa\xd7\x47\xe5\x1e\xdd\xd3\x9d\x9b\x90\xf5\x71\xd9\xa7\x63\xae\xfa\x30\x21\xeb\x1f\xc6\xe5\xc0\xa9\x6e\x8f\xea\x29\x93\xc2\xda\xa3\x63\x62\xa7\xee\xe1\xc4\xc3\xcf\x59\xea\xfa\xe8\x4f\x77\x84\x7b\x60\x2f\xb0\x52\x1a\x6a\xb7\xd6\x2a\xea\xfc\xd9\x32\x2e\xb9\x9c\x51\xa9\x14\x97\x4a\x82\xed\x03\x4c\x89\xe9\x08\x00\xca\x3e\x6b\xee\x5a\x49\xb6\xe3\x46\x85\xdd\x76\x64\x48\x03\x74\x68\x7e\x99\x5b\x0f\xd9\xd7\x10\x8b\x4a\x7e\xfc\xd3\x72\xcf\x0f\xa8\xef\xf6\x02\xcf\x23\x4e\x11\xce\x4b\x7a\x7e\x80\x12\x37\xc9\x0f\x91\x18\x25\x12\x8e\xa4\x04\x70\x88\xe7\x51\x22\xd8\xc0\xf3\x98\x83\xf7\xa7\x2e\x40\x3d\x9f\xed\xa2\xe1\xdd\xc6\xd0\x82\x4f\x88\xc2\x4e\x5c\x07\xe8\x31\x1c\x31\x07\x10\x3e\xd8\x2c\xc5\x50\xeb\x4b\xa9\x24\x4b\xa5\x35\xc9\x1a\x77\xa5\x92\x64\x17\xcd\xcc\xf0\x84\x3e\x57\xd0\x5c\x94\x87\xfa\x1e\x8d\xf3\xd0\xae\x47\x13\x1e\x96\xa3\x8d\x4d\x9a\x66\xb1\x08\xfb\xe2\x8d\x4d\x47\xb2\xf6\x18\x67\x0e\xfa\x1d\xd2\x14\x0e\xdf\xc6\x26\x85\x68\xe8\x9b\x92\xa8\xb2\xad\xf5\x98\xf6\x00\x91\x05\x4e\xaf\x54\xb2\x7a\xec\x87\xbf\x03\x7b\x1a\x65\xe1\x78\xa7\xd8\x63\x0f\x89\xd5\x25\x6a\x0a\x8e\x4f\xb1\xaa\xb0\x1c\xd1\x94\xf6\xd0\x45\xbc\x64\xdf\xe3\x52\xc9\xb2\x42\x8e\x03\x98\x4e\xad\x90\xbf\x0d\x5f\x7b\xa1\xfd\xda\x9c\x11\x8a\xe7\x3f\xa1\xa9\x6e\xfc\x7b\x4c\xc3\xdc\x8d\xb9\xee\x5d\x71\xb4\xc5\x71\xd0\xe2\xc0\x8b\xc3\x86\x6f\xe6\xf7\x47\x83\x3b\xfa\x01\x50\xab\x36\xe0\xcc\x9a\x71\xa9\x04\x7f\xd9\x65\xa9\x64\x25\x1c\x3e\xb1\xae\x17\x9c\x20\x1d\x78\xa5\x21\x06\x74\x05\x12\x91\x79\xcc\x25\xec\x10\x42\x25\x74\x08\xfa\x5b\xdb\x84\xff\x43\x1a\x13\x2a\x15\x42\x8b\x09\x0d\xf5\xb1\xa1\x21\xee\xe7\xa4\xbc\x49\xd3\xf2\x26\xa1\x21\x6c\xf4\xa4\x5c\xdb\xac\x40\x04\xfc\x90\x2c\x8b\x8e\xcc\x73\xe5\x59\x12\xc5\x52\x75\x69\xc2\xee\xa4\xb5\x1b\x12\x9a\xc0\x6c\x6f\x42\x37\x06\xc2\x0a\x69\x82\xcd\xf3\x18\x77\x67\x8c\x5b\xf7\xf1\x55\x98\xbd\xab\x51\xbe\xa4\x31\x22\x66\x3c\x23\x80\xff\x81\x32\xca\x65\xcc\xc7\xe6\x4c\xf8\xa5\x92\x75\xa2\x02\xac\xf3\x1b\x3d\x4c\xfb\xec\xee\x77\xb6\x69\xef\x7e\x6b\x4a\xc2\x64\x8a\x7f\xd3\x5a\x51\xab\xf1\x24\xa7\x8e\x72\xd4\x27\xf9\xe0\xd4\xf2\xdd\x8b\x89\x47\xd4\x5c\x42\xcf\x25\xf5\xf5\xf4\x62\x8d\x8e\xcf\xf6\x46\xa5\x92\xe5\xe3\x08\x7e\x1e\xd0\xa0\xd0\x79\x9f\xcc\xb9\x3b\x3e\x28\x1e\xe1\x8c\xc6\x77\xe3\x57\x4f\x2f\x55\x88\xd4\x88\xf3\xeb\x40\x58\x01\xbb\xff\xad\xe0\xc4\x15\x86\x12\x1d\x6a\x61\x28\xd5\x21\x75\xfe\x71\x9f\x5d\x1c\xaa\x3d\x76\x71\xa8\xf7\xd7\xc5\xa1\xda\x5b\x17\x87\xfa\x24\x23\xf5\x63\x80\x02\x3d\x1c\x08\x32\x9b\x5d\xb3\xc9\xfd\x3b\x42\x06\xdf\x7d\x0d\x3c\xe3\x04\x6a\x9f\x3d\xa4\xca\x28\x8b\xd8\x09\x94\x2d\xb8\x4c\x54\x00\xac\x3e\xe4\x5d\x0f\x36\xd0\x6f\x71\xa6\x34\x5b\xb8\x5a\x6b\xcd\x5b\x3c\x1a\x4a\xd7\xf7\x90\x30\x40\x64\x19\x01\x69\x20\xc3\x34\x1c\xc2\xc1\xc1\x44\x32\xbb\x66\x87\xfb\x2b\xc9\x2a\xe1\xfe\x7c\xf5\xea\x3f\x2f\x8d\x50\xbd\xd1\x67\xbd\xc0\x22\xc4\xbe\xc8\xa2\xf6\xb5\xe9\xa5\x5b\x02\xdb\x0b\x29\x24\x3d\x6c\x45\xfe\x34\x86\x4b\x83\xb6\x04\x3f\xcd\x69\xf6\x80\x10\xe3\x70\x12\xb6\x5e\x91\xcd\x13\x45\x2b\xe6\xa7\x8b\xb4\xb9\xcf\x8e\x50\x35\x57\xa2\x15\x25\x59\x30\x89\xab\xdd\x8a\x09\xb6\xef\x18\x48\xe8\x0b\x04\x81\x27\x4f\x34\x36\xf6\x1a\xd9\x81\x5f\x87\x3f\x76\x95\x26\xdc\x77\x07\xbb\x5e\x1d\xff\xda\x6f\x2f\x76\x95\xbe\xda\xd5\x19\x1e\xf8\x81\x4f\xbb\x7c\x6d\x2d\x9d\x4e\x83\xe9\x74\xad\x86\x1b\x01\x0e\xb9\xd6\x91\xe6\x71\xa9\x14\xa9\x2e\xf5\x80\xd6\x51\x8f\x45\x7a\xc6\xf4\x91\x92\xd6\xf4\xdc\x03\xaf\xf2\x99\x94\xd9\x96\xb9\x19\xea\xc1\xd6\xa9\xd4\x20\xca\x11\xb0\xad\x06\x74\xa4\x16\xb8\xe7\x06\xd2\x2b\x63\xe6\xca\xc0\x44\x9d\x05\x5e\x19\x33\x57\x46\xc8\x08\xcc\x66\xb9\x21\x94\xec\x19\x47\x8f\x4b\x37\xf2\xd0\x63\x48\x5c\x17\xec\x97\xb4\x7a\x6e\x47\x7a\xb4\xc7\x5e\xca\x09\x7b\xa1\x3d\xf6\x5a\x4e\xd8\x2b\xed\xb9\xc7\xb0\x5b\x4f\x80\xcf\x3d\x0e\x10\x94\xda\xa3\xef\x30\xbb\x7f\xc8\x1f\x2f\x94\x40\x33\x2d\xe4\xad\x9b\x91\x26\xd8\x2c\xb1\xf4\x24\x00\x01\xd3\xe5\x38\x32\x18\x3c\xc5\xf1\x52\x1c\x5b\x45\x45\xc0\x98\x2a\x2a\x1a\x71\x5f\xc1\x87\xfb\x98\x7f\x68\xdc\x5b\x31\x4a\xd3\x13\x98\x51\x58\x26\x5e\x75\x12\x65\x20\xe5\xfb\xa9\x05\xdd\x4b\xd8\x2b\x21\xee\xef\x57\xcf\xaa\x8c\x89\xd3\x7c\xb1\x7c\x65\xa7\xe5\x32\x4f\x75\x56\xcc\x52\x5e\x09\xcc\x16\x7b\xc1\x87\x2f\xc5\xaa\xa8\xcf\x8e\x30\x85\x43\x3d\x3a\xf0\xca\x13\xf6\x8a\x2b\xab\xc7\x27\x95\xa3\xb1\xef\xa7\x85\xf1\x29\xeb\x2f\x18\x15\xc8\x77\xe2\x60\xd8\x85\x38\x33\x13\xc4\xa3\xbf\x2d\x39\x7f\xaf\x80\x1d\x1a\x93\x19\x80\xc4\xc1\xa9\x25\x29\x90\x1e\x30\xa9\x08\x1b\x71\xd2\x66\x69\xa9\xd4\x2d\x95\x9e\x71\xf5\xba\x34\xa5\xfb\x4d\x61\x85\x24\xbb\x25\x44\x8a\x64\xb6\xc2\x41\xec\x9c\x7c\x53\xc1\x08\x6d\x70\x49\xbb\x96\x70\xf7\x26\x9e\x76\x12\x6b\xe7\xa7\x53\x98\x9b\xb7\xc2\x19\xff\x70\xcd\xfa\x61\xdc\x19\x0c\xc3\x7e\x33\x0d\x1f\xc2\xee\xf2\x89\xcf\xec\xce\xef\x33\xff\x51\x19\x47\xcb\x1b\xe6\x82\x66\x32\xca\xe1\xb3\x1b\x78\x46\x92\x83\x01\xee\x7a\x84\x7e\xea\x14\x62\xa8\x4f\xa6\xd3\x3c\xa8\x04\x8f\x73\x8e\x36\x26\x7f\x0b\x06\x8e\xd2\xd5\xe6\xc2\x8d\x63\xbb\xa1\x74\x45\x66\xdc\x50\x8f\x66\x94\x16\xd3\xe6\x58\x1c\x23\x00\x71\x85\x37\x9d\xce\xd9\x09\xab\x3a\x52\xb9\x64\x2e\x97\x25\xb1\x56\xd6\x85\xda\xf3\x24\xab\x6d\x9e\x2f\x2a\x5c\xc4\xb4\x16\x84\xf0\x6d\xc0\xc3\x6d\x85\x35\x81\x9b\xd6\x1f\x3e\xfb\x1e\xe7\x18\x78\xaf\xb5\xe4\x40\x80\x73\x2e\xd8\xa7\xbe\xba\x53\x82\x2f\x28\x73\x1a\xe4\x65\xbe\xb7\xe6\x14\x37\x0f\x3d\xce\x7f\x1d\x4c\xa7\xea\x6b\xd0\x30\x5f\xbf\x8f\xf2\x22\x8d\xe5\x66\xd6\xb8\x70\x6f\x27\x5e\x1d\xff\xda\x3e\x3b\x3c\xcd\xb3\x9f\x1d\x2f\xd8\xea\x4b\x5c\x5f\x61\xeb\xc4\xf5\x2b\xa8\xed\x80\x9f\xe5\x1a\xc4\x02\xd4\x5f\x93\xac\x3d\x9d\x4a\x76\x11\xd2\x90\xaf\x85\xd3\xe9\x5a\x08\x11\x21\xbb\x08\x8d\x39\x57\x6b\x0d\x80\x76\x00\xd1\x01\xbb\x08\x09\x92\xca\x61\xc1\xf8\x60\x2b\x7f\xee\x27\x50\xa2\x98\x29\x49\xb3\x4f\x71\xa9\x14\x74\x2c\x9f\x35\xb7\x48\xdd\x12\x2a\x9d\x35\xb7\x94\xd0\x91\x1a\xbb\xbf\xa2\x2e\x58\x3b\x62\x8f\xa9\x2d\xa8\x89\x49\xee\x2d\x9f\x25\x54\xbc\x63\xad\xaf\xe2\xab\x12\x33\x62\x07\xc4\x0e\x0a\x74\xcb\x8f\x05\x7d\x6c\x5c\x51\x63\xdc\xae\xed\x9e\xc2\xdc\xa9\x5f\xdb\xcc\x27\xc6\x61\x8c\xcf\x44\xe1\x0d\x50\x73\x7e\xfa\x4d\xcd\xe5\xb0\x6b\xe9\x6d\x43\x36\x36\x0b\x46\x6b\xe7\x55\x73\xd9\x95\x84\xad\x94\xf8\x9c\x9f\x01\xef\xe4\xb6\x27\x1e\xe7\x57\x71\x51\xcc\xd5\x5a\xd4\x4d\x01\xa8\xd6\x3a\x35\x3e\xd2\xd6\xaa\x54\x39\x45\xd1\x28\x57\xbf\xac\x82\x45\x3c\xf6\x9c\xc4\xb0\x89\x29\x2e\xab\x7a\x34\x95\x96\x4a\x69\x3e\xe2\x94\xb5\xd9\x4b\x31\xf0\xaa\xdc\x97\x44\x3c\x41\x97\x53\x86\xff\x48\x59\x9b\xf6\xf8\x5e\x0b\x5d\x39\x39\xa1\x32\x07\xca\x39\xef\xd5\xad\x00\xc9\xe7\x2e\x7b\xa1\x5d\xf6\xaa\x5e\x7e\x11\x5b\x30\x71\x5b\x0f\xd8\x5e\xcf\xea\x51\x68\x3b\xf6\x58\x30\x60\x2f\x85\xef\x57\x9a\x32\x1f\xa2\xf0\xe7\x95\x9a\x0a\xec\x00\x88\xef\x5e\x16\x76\x62\x9e\x28\x26\x24\xe4\x6b\xfe\x74\x2a\x67\x6b\xb2\x24\x58\xe7\x5e\x19\xf1\xf5\xeb\xb1\xad\x86\x5b\xc1\x07\x67\xf5\xc8\xae\xd2\xcc\xae\x5d\xc6\xae\x0b\x94\x2d\xab\xdf\xc8\x43\xbe\x09\x8e\x28\x86\xa8\x00\x9e\x69\xbe\xbf\xb2\xd0\x5f\xa9\xfb\xab\x72\xab\x4e\xe7\xdf\x59\x7c\x3b\x8f\x6e\xe3\x38\x90\x7d\xee\x91\xa2\x77\xd8\x02\xf5\xbc\xf0\x92\x43\xaf\x6b\x00\x4b\xaa\xc1\x97\x5a\x44\x69\x16\x51\x9d\x4d\xe9\xb1\xb6\x31\xf1\x96\xaf\x5c\xc8\x5e\xeb\xa8\xe9\x89\x7c\xbc\x1a\x98\xc4\x81\x85\x6c\x7c\x46\x43\xf6\x7c\x46\x28\x64\x80\x20\x64\x1f\x9e\xc1\xf7\x33\x7e\x8f\xce\x10\x0a\xc2\x2a\x42\x02\xc5\x18\xe8\x49\x8d\xd8\xd0\x9f\xd9\xf2\x9b\x86\x9f\x39\xa1\xa8\x6f\x40\x03\x8e\xc7\x37\x08\xf1\x15\x6d\x30\x9d\x56\x3d\xf4\xe8\xfe\x10\x78\xac\x19\xce\x59\x23\xbd\x78\xaf\xf0\x89\xfc\xeb\xc2\x97\xff\x55\xcb\xfd\x64\xae\xf0\xaf\xff\xaa\x65\x55\x38\x5f\xb2\xab\x63\xb1\xca\xd0\x9f\x60\x69\x7e\x08\x25\xf2\xd0\xb8\x9a\x27\x89\x05\x2d\xd1\x2e\xaf\xd2\x1e\x47\x7b\x9d\xdd\xed\x9e\xd3\x2d\xda\xec\xec\xe2\x91\x5c\x1b\xb0\x4f\x31\x41\x99\x1e\x00\x03\xde\x3b\x22\x6f\xda\x91\xd2\x88\xfb\x74\xcc\x03\x27\xe1\x52\x8b\x76\x06\xec\x7c\xc2\x5e\x2a\x23\xba\xa7\x3e\x5f\x2b\x63\xda\xe0\xd5\xed\xca\x64\xdd\xd2\x11\x03\x96\x44\xec\x95\x94\xf7\x74\xcc\x8b\x8a\x79\xd1\x36\x30\x2b\xd6\x80\xbd\x0e\x31\xf6\xf0\x8e\xbd\x90\xf5\xbd\xb2\x8a\x79\x55\x31\xaf\x64\x7d\x52\x2a\x35\x4a\x25\x6b\xc2\xef\xdc\x89\xf4\x2c\x25\xcb\x9a\x2b\x45\x37\x49\xb9\x10\x6d\x8a\xd2\x4d\x42\xe8\x8a\x42\xa3\xa5\xfc\x63\xc8\xba\x3d\x29\x27\x84\xbc\x0d\x32\x5f\x9e\x1f\x87\xb3\x01\x5f\xab\xcd\x50\x75\x2f\xbf\xc8\xe9\xce\x10\x04\xbc\x8d\xb4\x3b\xcb\x31\x1f\xa8\xd3\x61\xbc\x61\x76\x22\xcb\x4a\x30\x72\xe4\x65\x86\x2c\x13\xd6\x26\xfa\x7d\x47\x02\x01\x3a\x70\x0f\x8d\x57\xd5\x5f\x07\xea\x95\xc6\x4d\x43\xfd\xfe\x3e\xb2\x13\x7e\x96\x58\x29\x4d\x88\x93\x6c\x7f\x90\xa5\x52\x82\x5a\x67\x11\x7f\xbb\x38\xb5\x47\x14\x7b\x41\x63\x9e\xcc\xb9\x46\x0d\xb4\x9b\xd5\xbd\x86\x3d\x51\x64\xfa\x00\x91\x34\xdf\x6b\xd4\x27\xca\x4a\x65\x6a\x25\x40\x82\x26\x48\x86\x27\xc0\xc5\x26\xee\xae\x47\x6c\x9d\x31\x68\xe2\x44\x27\x2c\xed\x74\x43\x94\xd5\x3d\x74\xba\x56\xe2\x26\xbb\x4a\xb4\x32\x51\x14\x6e\xa1\xb2\x64\x17\x05\x30\x7b\x54\x7d\xf6\x3d\xaa\xb8\xd7\xac\x4c\x59\x25\xec\x7a\xaa\x70\x79\x02\xed\x55\xf6\x08\xc1\x6d\x34\xe1\x13\x26\xb5\x75\x20\x2b\x25\x8e\x95\xf0\xc9\x4e\xa2\xc8\x92\x09\xf9\xcb\x61\xcf\xf9\x76\xcd\x1c\xbb\xa2\xf5\x0e\xe5\x5a\x21\x7a\xec\x7f\x8c\xc3\xe1\xcf\xc7\x4e\x77\xd8\x10\xc3\xd1\x03\xfb\x87\x33\xcb\x98\x97\xf9\xf7\xb4\x45\x3f\x1a\x87\x1a\xd7\x3d\xb7\xe6\x9e\x5c\xeb\x2b\x84\xa8\xa0\x84\xf6\xb4\xc9\x5d\x6f\x76\x6b\x1d\xb6\xe8\x73\xab\xf0\xc2\xe2\x28\x7f\xcc\xc9\x9e\x36\x51\xc7\x4f\x86\x51\xa7\xdb\x19\x2a\x7b\x00\x1d\x69\x07\xb3\x02\x38\x38\x6e\x15\xef\x09\x94\x98\xdb\xf9\x6d\x41\x61\x7a\x63\x15\x09\x55\x6c\xf6\x70\xdf\x12\x28\xde\x10\xac\x23\xd1\x0a\x72\x26\xe4\xf4\xd1\x31\x17\x76\xeb\x9a\x1f\xe2\xb5\xdb\x87\x6b\xf6\xeb\xdb\x02\xc7\x9f\x3f\x93\x55\x17\xe9\x73\xe4\xd0\x9a\x60\xf7\x72\x3a\xf5\xdd\x43\x6f\x0d\xa8\x3c\x80\xe6\x87\xa7\xb3\xd6\xb1\x98\xd3\x92\x92\x86\x96\xd5\x37\x3b\x45\xb6\x5e\x16\x18\x07\x89\xa2\xa8\x41\x93\x38\xbf\xb4\x3f\xfa\x49\x34\xcf\xfb\xb0\x56\x38\x9d\x5a\xf0\x53\xac\xd2\x0a\x3a\x96\x60\xc1\x57\x52\x2a\xad\xe1\xef\x82\x62\x15\x0a\x68\xf4\xbd\x8c\xbe\xc2\xd1\x17\x3b\x54\x5d\xe2\x50\xc1\x6e\xbf\x28\xef\x60\xa7\x13\x8e\x37\x56\x4a\xb0\x31\xb4\x04\x5e\xa4\xe9\xce\xc0\x37\x6b\x85\x90\xaf\xb3\x5f\xc8\xc3\x3a\xfb\x26\x0b\x13\x2f\x9d\x01\x5a\xce\xc1\x8c\xb0\x34\x8d\x45\x82\x4f\xb0\x56\x50\x2a\x9d\xb4\xcc\xd5\x49\x2b\x50\xda\x7b\x7e\xd6\xed\x5f\xf7\x30\xa0\x70\xce\x31\x41\xbb\x78\xa1\x39\x97\xf1\x44\xce\x65\xbc\x5e\x95\x31\xb7\xb7\x7b\x94\x2e\xce\xc5\x87\xb9\xc9\xc8\x26\xad\xb9\x6b\x85\xb9\x41\xe7\x88\xbb\x1e\x8d\x79\xd5\x89\xb7\x61\x0f\x1c\x7b\x4e\x8c\x5e\x79\x63\x52\x2a\x45\xb8\x71\xcf\x9b\x36\xa4\xc4\x1e\x3b\x6f\xd2\x4e\x57\x86\x2f\x76\x3c\x23\x4e\xf7\xde\x8a\x56\x53\xbc\x29\x74\xfe\xbc\x49\x7d\x76\xde\xc4\x77\x47\xa8\x0c\x06\x2d\x44\xa6\x7e\x7d\xa3\x13\xb9\xb1\xe7\xf6\x02\xcf\x39\xcd\x26\x2d\x75\x13\x8f\x26\x64\x06\x5b\x10\x88\xa4\xd4\xad\x7a\x0a\x3c\xfd\x3e\x2a\x95\x6e\xe6\x6e\x7f\xf3\x8a\x61\x35\x4c\xdd\xf8\x1d\x7b\x6c\xe0\x23\xf0\x38\xfe\x69\xb9\x37\x03\x1a\x7b\x84\x1e\x65\xad\x98\x1c\x34\x22\x40\xd6\xe9\x99\xc1\x53\xb7\xb4\x46\x82\xbc\xdd\xe6\x3b\xff\xdd\x15\x5a\x9d\x2d\x9f\xf3\x98\x38\xc7\xad\x82\xab\x8f\x74\xfe\xf4\xd0\x6c\xeb\x8f\xf6\xf1\x7a\xa3\x70\x9c\x50\x24\xf9\xdb\x7a\x6e\x8a\x25\x2b\xca\x9a\x9f\x9c\x44\xae\x80\x2d\x8c\xcf\x6c\x34\x91\x96\xb9\xf0\xce\x73\x00\x31\x61\x9e\x17\x36\xed\x90\xa7\x45\x04\x32\x3e\xb0\x43\x2e\x8b\x31\xc9\x91\x1d\x72\x7f\x96\x77\x24\x44\x61\xd4\x9c\x07\xab\xb5\x6a\x51\x6c\xd7\x32\x1c\x8d\x00\x38\xf9\x36\x73\x0c\x7b\x37\x89\x9c\x9b\x67\x2b\xa0\x6f\xbd\xc7\x81\x02\x82\xc9\xd1\x8c\x38\x01\xcb\xad\x45\xf1\x3c\x6d\xaf\x39\x9b\x4b\x1a\x86\x2f\xc3\x42\xf2\xf8\x00\x93\xfb\xa1\x58\x2a\xe3\x8b\xfe\x8a\x38\x65\x8b\x69\x39\x01\xed\x5c\x2d\x45\x07\x62\x18\xc6\x8f\xfd\xd7\x41\xd8\x85\xf8\x71\x67\xf8\xba\xb2\xad\x82\x21\xac\xa5\xb4\xcc\xb8\xcf\x52\x8a\x31\x04\xb5\x94\x60\x8c\x36\x2d\x25\xac\xcc\x8d\xc6\xae\xde\xad\xeb\x71\x1c\xf6\x53\xf1\xea\x3f\xbe\x2c\x25\xf5\xc4\xf0\xee\xdd\xa6\xd0\x8e\xd3\xdc\x4c\xd3\xe0\x2b\x5e\x9f\xeb\xb4\xc5\x39\xf9\xb0\xb8\x2a\x83\x61\xd8\xeb\x85\x12\x12\x57\xad\x85\x36\x9b\xc5\xe7\xf6\x81\x73\xd3\x9b\xdb\x1a\xbe\x06\xd7\xf5\xf1\x41\xb6\x4d\x10\xfc\xce\x4d\xb4\xde\x05\x06\x2e\xf3\x62\xf9\xb3\x66\xa1\xbc\x63\x24\xc8\xdf\x45\xa9\x04\x7f\xe1\x18\x40\x3a\x0d\xb9\xac\x0b\x76\xfa\x84\xec\x35\x95\x5c\xaa\x12\x30\xe7\x68\xd9\x89\xbf\xb5\x42\x3b\xa4\x59\xc5\x72\x96\x25\x29\x8b\x52\xfe\x68\x38\x84\x9d\xfb\x6e\xb6\xb0\x3b\xec\xbf\xae\x48\xc7\xfb\xa4\x0e\x5e\x3d\x75\x4c\x77\x60\x4b\x19\xed\x09\x2c\x51\x17\xcc\x7f\x56\x7d\xcb\xca\x86\x7a\x50\x05\x6e\xe0\xb4\x55\xbc\x62\x41\x60\x79\xd3\x20\xbf\x33\x0e\x03\x45\xad\x1f\xb3\xb4\xbd\x06\xf9\xf4\x5e\xda\xf7\xe3\xf7\xd3\x82\x26\x99\x97\x6a\xf9\x39\x5b\x28\x4e\x84\x56\xa5\x42\x6e\x4f\x2e\x96\x1d\x34\x72\xce\xf1\xcc\x67\x57\x92\x46\xea\xeb\xe5\xde\xd1\xf6\x27\xb0\xb2\x9c\x9b\x89\x80\x57\x5e\x0b\x69\x0c\xf8\x29\xe1\x6f\xca\xb3\x2a\xce\x45\xd8\x95\xea\x03\xe5\x5d\x4a\xe3\x49\x73\xaa\xdc\x5f\x60\x55\x53\xae\xba\xe4\xa4\xa5\xd2\x5a\xca\x2e\x94\x45\x73\xce\x79\xe2\xbe\x7a\xf5\x13\x61\x25\x54\x12\xdb\x4a\x79\xca\xc2\x7d\xa0\x73\xda\x63\x6a\x72\x18\x79\xda\xa7\x50\x58\x3a\x40\x53\x52\xb7\x12\x06\x5b\x43\x52\x1d\xc7\x53\x62\x5b\xe8\xd0\x39\x21\x79\x4f\x65\xa5\x86\x1d\x95\xba\x97\xe9\x8c\x10\x3b\x2a\x95\xe4\x1a\xd7\x9d\x9c\x4e\xad\x42\x5f\x32\x39\x06\xd6\x3e\x9d\x9a\x0a\xcd\x34\xe3\xed\x64\x71\x16\x3e\xac\x9a\x06\x42\x66\xa9\xb9\xba\x26\x05\xf5\xfa\x78\x6e\x52\x12\x1e\xc3\x2a\x75\xcd\x10\x69\xcf\xdc\x51\x0e\x78\x8f\x2a\x46\x2f\xa4\x13\xec\x17\x4d\x54\x8f\xe8\x1e\x5f\xab\xd2\x46\xc6\x59\x4c\x3c\x6b\xc4\x12\x77\xe2\xb1\x36\x6b\xb4\x69\xf6\xdd\x6c\xe7\xb4\xc5\x0f\x3e\x71\x7e\x6c\xf3\xc4\xf9\x61\x5a\x3e\xe3\x90\xf1\x87\x47\x2f\xf9\x19\x6b\x3b\x67\xec\x02\x08\xbf\x01\x93\xc2\xba\x64\xe3\x33\x7a\x89\xe2\x81\x4b\x36\x3c\xe3\x1c\x22\x4a\xa5\x4b\x36\xc2\xef\xe7\xb3\xe9\x54\xe7\x1b\x42\xbe\xd1\x99\x31\xf3\x7e\x99\x0b\x1f\x2e\xd9\x6b\xa9\x64\xed\xf1\xb5\x1a\x6d\xf0\x1f\x84\x00\xb1\xbf\xb6\x07\x2c\xd9\x18\xf7\xee\x0f\xe8\xcb\x0e\xf4\xaa\x52\x21\x97\xba\x2f\xc0\x8d\xa9\x8a\xf7\xdb\xf4\x92\x1d\xb4\xa1\x03\x8d\x36\x34\xba\xdf\x86\x0e\x34\xf1\xfb\xa0\x9d\x75\xa0\x01\xf9\x60\xa0\xb8\xc9\x55\x3d\x8d\x55\xf5\x0c\xb4\xde\x82\xbe\xe2\xec\xd1\x2e\x4d\xc9\x4c\xe9\x13\x0c\x1a\x34\xf0\x20\xa9\x11\x5a\x02\x29\xcc\x7e\x08\x14\x30\x95\x34\x55\x7a\x53\x9d\xc8\x0a\xc9\x9b\xe4\x07\xa8\x44\x1d\x62\xa9\x5f\x07\xf4\x43\xe0\x29\xbd\xac\xbd\xc0\x12\x6c\x1f\xe8\x17\xff\x44\x64\x0e\x67\x23\xf2\x06\x9b\xfe\xb4\xeb\x74\xb9\xcf\x8e\x3b\x28\x69\x9b\x4e\xbb\xe4\x2d\xe6\xf1\x74\x9a\x6d\x0e\x88\x26\xf9\x0e\x49\xd9\x51\x98\x9d\x66\xd5\x5d\x8c\x92\x9e\x7b\x31\xf1\xa8\xfe\xd6\xfb\x25\x26\x4e\x57\x29\x0a\x0c\x84\xd5\xc5\x0c\xdd\x2c\x69\x56\xd4\xbe\x88\x60\xb8\x71\x1d\x6f\xa3\xed\x28\x77\xf3\x90\x0f\x1b\xf0\x17\x0c\x1b\x9f\x33\x9f\x19\x50\xa6\xe4\x6c\xc1\x89\x91\x73\x44\x64\xb6\x18\xa5\xe1\x87\xd6\x99\x18\x47\x00\x4c\xc7\x11\xdb\xef\x10\xf5\x4e\x59\x87\x10\x32\x68\xbf\x1c\xe5\xb2\x24\xd5\x35\x1e\x62\xa3\xea\x50\x45\x66\xeb\xf7\x4f\xad\x88\xaa\x14\x1a\xb2\xdf\x2d\x42\x43\xf7\x2c\xf0\x4a\x25\x95\x00\xdf\x34\x64\xc9\x9d\x20\xe8\x57\x45\xcd\x22\xd5\x73\x00\x25\xcd\xf8\x69\xa8\x2f\xdf\x15\xed\xf9\xfa\x82\xf7\x2a\x1e\xe4\x35\x63\x2e\xe2\x60\x18\x7b\x44\x43\x52\x94\xef\xc8\x93\xc2\x93\x0b\xf2\x66\xe0\xb6\x62\xc9\x00\x4a\xd7\x05\x3b\x08\x33\x95\x17\xdb\x00\xe8\xba\x81\xc3\x85\xd8\x9b\x46\x5d\xb0\xa3\xc3\x3c\xf3\x8f\xa2\x7a\x95\xea\x0e\x60\x76\xe0\x6b\x0a\x16\xfe\x16\xef\x5f\x31\xa3\x22\x98\x70\xb5\x78\xfb\xd2\x52\x90\xe9\x1d\x93\x00\x8e\xcf\x6e\x63\x51\x2a\x2d\xfa\xb1\x29\xdc\xe8\x26\xae\xf0\x50\xb3\x22\xc9\x4d\xc1\x58\x61\x3d\xd4\x32\xef\x2a\xa9\x58\xb2\x2e\xb3\xd0\xac\xc8\xb5\x54\x9d\x48\x79\x9e\x29\xb8\xb4\x08\xdd\x08\xe0\x95\x8f\x92\x5d\x27\xc1\x1b\x20\x3d\x72\xd4\x8a\x50\x2a\x64\xbf\xa4\x95\xe0\xcd\x67\x82\x82\x52\xf8\xfb\x4a\x13\xf6\x3b\x16\x5a\x97\x2f\x61\xbe\xa0\xd2\x28\x4f\x5c\x37\x68\x80\xdc\x83\x50\xf7\x59\x50\x53\x51\x57\x22\xc7\x97\x6f\xef\xa3\x47\xb3\x5a\x19\x7e\x9c\x7d\xb8\x66\x07\x8b\xd7\x74\x54\x22\x0a\x0f\x4a\xa5\x80\xb5\x0d\xc2\x0c\x0c\x1a\xda\x6d\x59\xe8\xb9\x39\xe2\x42\xef\x87\xba\x1c\xd8\x8d\x63\xdd\xcf\x88\xfa\xb8\xcb\x12\x1e\xb0\x36\xbb\x7c\x9a\x4e\x03\xd6\xce\xb9\x8a\x68\xb5\xf0\x87\x86\xa8\x52\x02\x68\x24\xc5\x82\x8f\xa3\x21\x1e\x81\x2e\x0f\xd8\x69\x97\xf6\x78\x50\x80\x21\xd3\x69\x8f\xbc\x25\x05\xc6\xa5\xc8\xa5\x24\x34\xd4\x50\x45\x0b\x15\x03\x76\x1a\x00\xc0\x39\x0d\x68\xca\x07\xa7\x56\x8a\xbe\x31\x74\x61\x80\x2f\x74\x00\x9c\x1e\x5e\x2d\xc3\xd4\x0d\x78\xd5\x19\x6c\x77\x35\x20\x1a\x94\xcb\x24\xe5\x18\x1a\x78\x6e\x62\xb8\x75\x64\xfa\x53\x18\x49\x8a\x23\x49\x61\x24\x29\x8c\x44\x67\xd5\xe7\x30\x21\x4e\xcf\x68\x1a\xa8\x7b\x69\x2d\xac\xea\x65\xf2\xac\x9e\x11\x5a\xf5\x8c\x90\xaa\x97\x15\x9e\x85\x3c\xa9\x27\x08\xb5\x42\xad\x81\x1c\x66\x8c\x54\x04\xac\x16\x8d\x51\x51\x64\x81\xcd\x54\x6b\x60\x18\xcd\xc0\xb0\x98\xc1\x9c\x68\xe0\x03\x04\x29\x0a\x49\x60\xca\xa3\x7e\xa9\x14\x9e\xe4\x8c\x2d\x95\x54\x45\x93\xa2\xe2\xa5\x81\xf1\x9a\xed\xd3\x14\x2b\xa2\xe3\xdf\x78\xff\x54\xd8\x4b\x11\x79\x3b\x3b\x16\x16\xb4\x5d\x2a\x59\xc1\x74\x9a\xdf\x3b\xc2\xa2\x11\x2a\xa7\x53\x4b\xf2\x7e\xd7\xf2\xd9\x69\xc0\xfa\x21\xc5\xdf\xa7\x0e\x21\x54\x5f\xe4\xe9\x4b\xd7\x7d\xf6\x08\x30\x4b\xdd\x28\xc0\x41\xf1\xdd\xd1\xc4\x43\x93\x67\x28\x77\x5a\x75\xa1\x90\x83\xe8\xcc\x21\x90\x46\x5d\x80\xb9\xd4\x73\x6f\xac\x86\xe0\xd5\x6d\x48\x68\x06\xf6\x73\xad\x80\x88\xef\xb7\x94\x1c\x09\x70\xb8\xb8\xb7\x22\xf6\x20\x09\xa0\x43\x2b\xe2\x91\xc1\x7d\xa4\x54\x92\x4a\x5e\xb8\x80\x02\xb5\x8f\x1b\xd8\xc2\x49\x86\x06\xe3\xe9\x34\x21\x6f\x6a\xec\x06\x82\x63\x81\x38\xa3\x6c\x53\x5e\x75\xd2\xed\x58\xef\xc1\x34\x47\x86\x18\x95\x2a\x64\xa8\xbf\x8d\x36\x18\x01\x50\xa3\xb3\x25\x98\x21\xc9\x92\x66\x32\x43\x86\x12\x90\x58\xc4\x01\xa2\x15\x91\x61\xb4\x1a\x19\x46\x45\x64\x58\xa4\xf6\x6f\x56\xc2\x1b\x04\xa3\x28\xbe\x91\xdb\xa1\x23\xcb\x7c\xd3\xb8\x97\x82\x68\xa9\x94\x00\x53\x57\x96\x6b\x00\x21\x23\x05\x9a\x14\xe5\x9d\x14\x06\xaf\x74\xcb\xac\x37\x6d\x1b\x39\x62\xdf\x63\x16\xf8\x16\xa1\x37\xb1\x0a\xfc\x0c\xe9\x48\xd8\xb5\x19\x5e\x26\x38\xdd\xed\x24\xbf\x45\xe8\x61\xb5\x5d\x34\x8c\x88\x1f\x70\x00\x7b\xac\x5d\x2a\xad\xf5\xd8\x45\xa8\xa6\xe8\xf8\xd4\xea\xe1\x6e\xea\xe1\x6e\x1a\xe0\xf7\x00\xbf\x53\x35\xd2\xfc\x8a\xb8\xf5\x97\x70\x35\x43\x65\x06\xae\x2e\xe2\xb3\x6b\x76\x74\xb8\x02\xc8\xfe\x68\x15\x1e\x17\x53\x99\x09\xf9\x32\xfc\x46\x8a\x42\x8d\x68\x79\x3f\xeb\x97\xf8\xb0\xb1\x68\x61\x9b\x9d\xfd\x13\xb7\xdf\x74\x8a\x3b\x2d\xcc\x29\xf1\xf7\x36\x48\x88\x42\x6f\xdf\xfd\xf9\xe2\x91\x52\x29\x71\x0f\x81\x2b\x48\x0a\xca\x90\x4e\x54\x2a\xa1\x3e\x64\xc4\x5e\x68\xc4\x5e\x69\x04\xc8\xb0\xcc\xb6\x68\x64\x60\x95\x06\xbb\x6a\x0f\x2b\xc4\x68\xf6\x2f\xe0\x46\x2c\x1d\xb3\x17\x1a\xb3\x57\xb5\x73\x23\x0f\xea\x30\xdf\xc5\x6a\x7c\xae\x74\xaf\x71\x55\x7c\x5c\x15\x98\x9e\x04\xbd\x98\x0b\x23\x03\xca\x1f\xcb\x00\xae\x86\xbd\x5c\x34\x0c\x37\x47\x5e\x98\x93\x88\x1d\x04\xba\x4f\xe2\x7e\x90\xec\x22\x24\xfa\x5e\x29\xe1\x92\xb5\x9d\x98\x37\x5b\xa8\xd8\xe7\x98\x5b\xe2\x33\x9f\xed\x42\xb1\x84\xbd\x54\xe2\x1d\x9e\xba\x81\xf4\xa6\xd3\x84\xbd\x94\xe3\x6d\x0e\x08\x00\x02\xaf\x2a\xe9\x2c\x50\x21\x4c\xc2\x5b\x8a\x98\xaf\xd5\x14\x30\xc1\xfb\x18\xf6\x52\xac\x41\x95\x07\xd0\x98\xb0\xd7\x62\x79\x53\x9a\xbc\xc5\xeb\x3c\xd6\x17\xce\xd0\x81\x54\xa9\xf3\xe8\xef\x03\xd8\xe3\xd0\x38\x96\x44\x0e\xe9\xb5\xa2\xd1\x11\xef\xae\x03\xd6\xec\xad\xf7\xe8\x80\x0f\xd6\x07\x90\xba\x9e\x20\x5e\x2c\x0f\x76\x78\x5c\x2a\xa5\xe5\x04\x7f\x7b\xd9\x2f\xc4\x03\x79\x5e\x30\xdd\x38\x8b\xf9\x5a\x75\x06\xa4\xb4\xa5\xd0\x7b\x46\xcc\x5d\x37\xec\xc1\x11\x0d\x68\xe8\x21\xac\x86\x39\xab\x23\x00\x89\x68\x4c\xd5\x56\x95\xf4\xc7\x31\x2a\x54\x12\xba\xab\x72\x10\x62\x23\xac\x8d\x51\x4d\x74\x0e\x63\xa9\x9a\xf0\xc2\x42\x6a\x74\x45\xa5\x41\x57\x02\x3f\x21\x0f\x44\xe6\xa8\x4a\xad\x70\x48\x3f\xa8\xc8\xa2\xc6\xa7\x28\x9e\x96\x25\x6a\x46\x28\x52\x04\xf0\x1b\xd2\xe0\xf8\x56\x41\x7d\xab\x27\x0b\x26\xa1\x9f\x27\x00\x66\x06\x5a\x02\x49\x9f\xac\xbc\xc1\xe7\xfa\xd3\x94\x36\x38\xdd\x7c\x62\xd9\x9f\x93\x22\xd1\xee\x64\xdc\x49\x58\xf8\x8e\x14\xc3\x85\x64\x4f\xe1\x28\x85\x85\xa3\xa4\xf7\x6b\xa8\x0f\x51\xb2\xeb\x39\x5a\x4d\x74\x35\x69\x35\x77\xc0\x62\x32\xc3\xda\x8f\x3b\x24\xd7\xb1\x36\x83\x08\xb3\x21\x84\x66\x00\xa1\xe9\x7e\xce\x59\x68\x1e\xd0\x6f\x2a\x32\xa3\xc0\x3b\x16\x44\x91\x0a\x7d\xc4\x8a\x85\xd4\xe4\x89\xbf\x44\x9e\x08\x45\x9b\x2c\x28\xd2\x9e\xb4\xe6\x96\xce\xcf\x75\xcb\x0f\xb6\x8c\xc4\x06\x0f\xe5\x9a\xb5\x16\x4e\xa7\x21\x7b\xd9\x8e\xf0\x24\x86\xec\x65\x27\x82\x33\x42\x70\x6b\xf9\x6e\xbc\xeb\xe1\xb5\xcd\xbd\x15\x11\x83\x8d\xdd\xc7\x06\x95\x46\xf3\x0c\xb6\xc5\xbd\x15\xd3\x80\x6a\xcd\x0e\xdc\xe6\x48\xa4\x87\xa8\x7c\x1d\xb2\x57\xda\xc5\xcb\x6a\xbc\xb3\xde\x07\x4e\x21\x34\x8a\x29\x75\xb7\x4b\x6b\x9e\xed\xd6\x68\x57\xa9\x0a\xe1\xae\xd0\x17\x96\x34\x29\x87\x6e\xd5\x23\xda\x8a\x41\x4a\xd3\x72\x88\x6e\xe1\xee\x98\xf0\x07\x96\x49\x53\xdf\x35\xad\x9f\x07\x58\x0f\x8d\xfb\xf7\xd0\x6e\x41\xce\x95\x67\x42\xe8\x8c\xe6\x2b\xc0\xf5\x98\xbb\x4f\xef\x0d\x2a\x31\x2a\xe6\xfe\x08\x16\xa7\x54\x5a\x33\x9f\xec\x53\x0b\xa7\xc9\x35\x11\xee\x75\xe0\x01\x1c\xa9\xd4\x00\x06\x67\x17\x80\xb0\x0b\x15\x41\x12\x19\x6a\x04\x88\x65\x1e\xb9\x29\x4c\x8a\xd2\x91\xed\x02\x55\xad\x6c\x7c\xb2\x3b\x61\x68\xef\xec\x70\x4b\x9a\x7a\xc4\xc1\x15\x87\x74\x3a\x20\xb3\x0c\x90\x7f\xe8\x11\xa7\xcb\x63\x54\xbe\xec\xa2\xbc\x69\x3a\x4d\x21\xea\xf8\xa7\xd5\x35\x1a\xcd\x3d\xda\xc5\x22\xfa\x72\x31\x50\xcb\xb4\x72\x86\x86\xe1\x0b\xa0\x5d\x80\x0c\xb8\xfd\xe6\xe8\x96\x70\x9e\xa7\xcd\x5c\x64\x02\x9b\x6e\x68\x95\x6c\x5e\x35\xf7\xfe\xb4\x9f\x71\x7c\xea\x9e\x27\x5c\xb8\x40\x0a\xdd\x58\xf1\x06\x29\xf7\x5d\x08\xb0\xde\x7e\xa6\x5b\xe4\xbe\x78\x6b\x7c\xd0\x30\x5f\xbf\x0e\x8c\x51\x98\x54\x9d\x28\xad\xc7\x0a\x07\x16\xcd\x22\xe3\x65\x78\xca\x53\x26\xce\x36\x36\x69\x75\x3b\x45\x99\x9b\x7e\x5e\x52\x38\xe1\x29\xed\x22\x37\x08\x93\x18\xd1\x84\xe4\xc2\x4e\x5d\x1b\xaa\x28\xeb\xda\xb4\x74\x41\x3d\x66\xc9\x2b\x21\x14\x1f\xba\x40\x44\x59\x41\x0c\x7d\x5d\xbe\xeb\x65\x42\x85\x94\x76\x01\x2a\x99\x67\x0f\xaa\x39\xf1\x07\x5e\xae\x8b\x8c\x29\x7b\xc2\x77\x61\xb0\x03\x5e\x0e\xb4\xe8\x01\x48\x66\x25\xae\xd0\xab\xe6\x1e\xf8\x9e\x5a\xaa\x68\x1e\x04\xb4\x17\x19\xff\xe2\xf5\x73\x4e\x00\xa9\x67\xeb\xec\x86\x00\xc6\xd3\xba\x69\xc7\x5e\x1d\xfe\xd8\xbe\xba\x7c\x05\x0e\xf2\xf8\x9e\xdd\xd0\xae\xd6\x24\xe8\xd2\x6e\x19\xa2\xdc\xf3\x17\x6f\x3d\x9d\x7f\xde\xab\x9f\x9c\x74\x69\x8d\xa6\x54\xe4\xe4\x33\x2a\x0e\xfd\xcd\x3e\x00\x6e\x5e\xd5\x89\xca\xdf\xe8\x84\x13\x17\x24\x2b\x85\xe9\xba\xfe\xdf\x99\xae\xfe\xdf\x99\xae\x2e\x0d\x69\x4a\x6b\xff\x5b\xd3\x75\xf0\x77\x66\x6b\x75\x1f\xde\x9b\xad\x78\x99\x92\x9e\xeb\xab\x41\x3c\x99\x05\x2b\xc3\x71\x07\xb8\x59\xbb\x9a\x12\xfa\x2e\x3d\x64\x25\x7f\xcf\xd9\xa3\x34\xc4\xe6\xa8\x98\x8b\x46\x1e\x71\xee\x72\xe6\x1a\x88\xd2\x11\x40\x34\x75\x89\x39\xc3\xde\x86\x96\xcf\x8e\x04\x0d\xc6\xa8\xf0\x0c\xa1\xab\x3b\xda\xef\xa3\x4b\x6b\x23\xf9\xd2\x77\x88\xac\x15\x1a\x2c\x8c\x0d\x7c\x6f\xe8\xfa\x81\x6a\x6e\x1a\xe8\x56\xb0\x66\x7c\x22\xde\x25\x87\xfd\x52\xc9\x67\x97\x04\xf8\x07\x8d\xe1\xf9\x9a\xb5\xf6\xd8\xc5\xbb\xf7\xb5\x2e\xfc\x12\x27\x46\xf4\x1d\x20\x2b\xac\xdf\xbf\xa0\x61\x9f\x39\x79\xe1\xed\xa2\x36\xed\x24\x42\x5d\xda\xc6\xd0\xf2\xd5\x8b\xe1\x79\xfd\x05\x5a\x1c\x42\xeb\x38\x7b\xd2\x26\x35\x2f\xe1\xbb\x1d\x63\x0d\x3c\xe2\xf9\xe5\x1b\x62\xc0\x42\xc9\xfd\x03\x5c\x04\xcc\xbd\x20\xe2\x43\x15\xb2\xcb\x39\xbd\x73\xd4\xa8\xd8\x85\x65\x9a\x6b\x7e\x5f\x89\x05\x72\x6d\x11\x7c\x40\x85\x0b\x33\x9b\x5d\xb3\x87\xad\x55\x2f\xc6\xfd\x33\xcb\xd8\xe7\xbe\xdb\xd4\x16\x5d\x3e\x5c\x33\xff\xec\xbd\x97\xf4\xe7\x4f\xfa\xe9\x6d\xa6\xbf\xfa\xb1\xd3\xfd\xe8\xb3\x34\x97\x6f\xa6\x6e\x80\xa8\xc3\xff\x65\xf9\x18\xa0\x22\xb1\xde\x12\x73\xb1\x92\xd3\x42\xca\x40\x00\x8d\xd4\x7b\x03\xa8\x27\x2c\x4a\x20\x71\x71\xd9\xc0\x37\x38\x4a\xa3\xe2\x3b\x61\x05\x04\xfe\x46\xc4\x23\xce\xab\xe6\x40\x95\xfc\x2b\xe6\x31\x6b\x05\x39\x1f\x0e\x75\xc6\x48\x43\xe1\x5f\x37\xf5\xd8\x9d\x40\x6c\xb4\x5c\x19\xfc\x4d\x89\x47\x68\x5e\x25\x71\xa4\xd9\xf1\x52\x67\x95\x4a\xbf\x14\x4b\x68\x51\xfa\x5b\xd6\x7d\x33\x24\x62\x3e\x80\x6a\x45\xc2\x71\x75\xef\xe7\x9a\x32\xaa\x1b\xba\x25\xfd\x58\x05\x11\xad\xaa\xbb\x21\x80\x6a\x09\x38\x7c\xb9\x5d\x8f\x06\xcb\x55\x77\x17\x2a\xa5\x31\x0f\x60\x42\xb0\x8b\x7f\x3d\x1b\x1f\x90\x1d\xc7\x7a\x56\xce\xc6\x49\x51\xef\xa3\xeb\x65\x8a\x39\x58\x82\xcc\x8c\x5a\x06\x1a\x63\xb8\xdb\x5c\xd4\x94\xfa\xdb\x1b\x26\x53\xcc\x9c\x9b\xe3\x82\xd7\xef\xcc\xd6\x40\x44\xab\xb8\x42\xa1\xa7\x83\x35\x9a\x2d\x45\x88\xb7\x3d\x91\xb2\x3b\xb0\xbc\xb0\x11\xfc\x86\xe6\x75\x64\xa1\x5e\x6a\xea\xd5\x5f\xa6\x4a\x42\xa5\xa9\x8d\x2e\xad\x5d\x46\x6d\x65\x4b\xe7\x17\xb5\x69\x82\xc2\x9a\xc5\xa4\x20\xe8\xcc\x73\xd1\x80\x90\x2c\xd8\x52\x4f\xd4\xe7\xfa\x14\xd0\x6a\xa6\x80\xd3\x0a\x74\x54\xad\x50\x84\xd0\x80\x07\xba\x83\x66\xe5\xf2\x05\x8b\x09\xc9\x15\x69\x0a\xe2\xd1\xce\x89\xc8\xd4\xe3\x5e\xb8\x60\x2f\xd3\x69\x55\x01\x88\x57\x2e\xd8\x6b\x16\xea\x69\xef\xea\x97\x4a\x9a\xfb\xa2\x1f\xb4\x11\x27\xf1\xf5\x26\x71\x01\x1e\x06\x2f\x26\x04\x90\xb0\xd0\xce\xbd\x6a\x67\x3e\x5d\x9b\xc7\x10\x5c\x30\x5f\xdb\xca\x38\xe2\x82\x1d\xa9\xcf\x13\x80\xc8\x27\x81\x0a\x1c\x43\xe0\x58\x07\x06\x3e\x1f\x3f\x76\xe4\x47\x74\xc0\xce\x06\x7e\x1d\xfe\xd8\xe7\xda\x31\x02\xf0\x19\x52\x4b\x9f\x0f\x7c\x83\xb3\xd9\x01\x64\x3b\xf0\xed\xaa\xd3\xd4\x9d\xc8\xeb\xc0\x77\x6d\xf8\x57\x99\x40\xd1\x20\xf2\x3b\x5f\x5b\x13\xec\xee\xfb\xec\xfe\x04\x4d\x47\x5d\x7f\x5a\xb6\xd4\xa3\xd6\x91\x5f\xe9\xc7\x37\x47\x73\xba\x67\x7a\xcb\x17\xaa\xcf\x9f\xcd\x85\x7c\x78\x6a\xf9\xec\xa5\x2c\xd9\x0b\x5a\x9d\xa6\x30\x5a\xa0\xe1\x31\xfe\xb5\x2c\x51\x33\xdd\x17\xee\x2b\x1c\x11\x76\x9c\xbf\x70\x09\xdd\x57\x8f\xf3\x50\xdd\x78\xfb\x18\xf0\x21\xa0\x44\xba\xb0\x4e\xfb\xa9\x05\xf1\x14\xf3\x50\x4c\xa4\x50\x8a\xcc\x08\xf5\xf9\xaf\x8e\xe5\xd3\xfb\xce\xbb\x2f\x66\x92\x13\x6d\xe8\xfa\x57\xc7\x12\x6e\x3f\xf0\xac\xdf\x77\x64\xd5\x7d\x55\xe6\x6e\xbe\xd1\xb1\x04\x59\xe3\xfc\xbc\x70\xd9\xe4\xf3\xb7\x19\x55\x06\x13\x84\x31\x98\x90\xcd\x48\xe0\x61\xbd\xb7\x77\x80\xd5\xae\x3a\x96\x74\xab\x2a\xe6\x32\x24\xb4\xd1\x01\xd2\xbb\xff\x60\x35\x20\xa1\xe6\x11\xe2\x54\x39\x47\xa6\xb6\x7e\x9f\xa0\x7c\xde\xfe\x6d\xcd\xeb\x9a\xf9\x68\xcb\x1e\xdf\x11\xbd\xcd\x1c\xc8\xe5\x0a\x8f\x46\x24\x37\x06\xe9\x2b\x8d\x96\xf3\x16\xf4\x2b\x3d\x11\x7c\xad\x56\x90\x56\x3e\xa8\x31\x03\x93\x9e\x9e\xe4\x4e\x90\x50\xb3\x64\x60\x1b\x17\xcb\x27\xa9\xa0\x52\xf4\x13\xfb\x7b\x2a\x94\x7b\x54\xfb\x22\x15\x99\x8f\xd5\x03\x93\xdc\xc8\x92\x7f\x14\x92\x8f\x4d\xf2\x5e\x96\x7c\x59\x48\xde\x35\xc9\xcf\x59\xf2\x51\x21\xf9\xa7\x49\x3e\xcc\x92\xcf\x0a\xc9\xaf\x26\x79\x9c\x25\xef\xa7\x62\xe6\x2d\x7b\xf2\x8b\xfb\x42\x76\xc2\xee\x50\x7b\x5d\xab\xd9\x2f\xa9\x50\xee\xd9\x36\xed\x61\x2a\xe8\x4b\xcd\xde\xdf\xa3\xaf\xf8\xf7\x65\xd3\x3e\xd8\xa3\xaf\x9b\xe8\x4a\xf1\x1d\x1f\x88\xad\xbb\x99\xf6\xa9\xb8\xc2\x0b\xe1\xdd\x1f\x4a\xcd\xe8\xf8\xef\x15\x7b\xd7\x81\x1c\xa6\xfe\xc9\x11\xa1\x96\xd0\xa7\x7b\x34\x73\x49\xf8\x61\xce\x0b\xe0\xb7\x99\x73\xde\x62\xe8\xfa\xaa\x13\x70\xdf\xf1\xb5\x53\xda\x9f\x46\x93\x68\x70\x40\x81\xb0\xbb\x82\xc8\x41\x31\xd6\x74\xaa\x97\xc7\xcd\xf5\xe5\x59\xbb\xa4\xa4\x77\x21\xae\xce\xc1\xde\xdc\xf8\x7f\x16\x8b\xdd\xad\x8e\xc7\xbe\x3d\x88\x97\xce\x43\x67\x12\x4a\xd5\xbb\xb0\x2b\xfc\x34\x3c\xea\x0e\x43\x34\x81\x38\x86\x51\xac\xd5\x96\x7b\x73\x31\xa3\x83\xb0\xdf\x09\x07\x57\xaf\xbd\xd0\x1e\x34\x8a\x0e\x0d\xd9\xd7\xbf\xd3\xd1\x95\x4e\x38\x17\x5c\x38\x5e\xac\x1e\xcb\x7f\x56\x14\x87\x3b\xe8\x89\x7e\x82\xda\x7a\xbe\x83\xa7\x36\x7b\xce\x72\xde\x72\x85\x57\x20\xe7\x7f\x16\xb4\xc1\xdf\x66\xce\xad\xb0\x7c\x2a\xdc\x7d\x6f\x3a\x15\xc6\xe4\x51\xeb\xc1\xf2\xdd\x7d\x74\xdb\xc6\x2f\xea\x96\xcf\x9e\x7d\xc0\x16\xa2\x9f\x84\xfd\xe9\x34\xa0\x3e\xeb\xdc\x03\x89\xa2\x1c\x1f\x4f\xa7\x01\xb1\xad\x80\x1f\x3e\x00\xc9\xb0\x90\x79\xff\xc1\x3a\x7b\xb0\x02\xca\x36\xb7\x10\x75\xcf\x17\xdc\x7f\xb0\x7e\x64\xa9\x45\xaf\x67\xf9\x23\x9a\x25\x17\x3f\x71\x66\x30\xca\xd8\x90\xea\x3f\x18\xcf\x3e\xa7\x92\x6b\xe4\x77\x28\x78\xf4\x68\xcc\x51\x1e\xf4\x05\x7d\x13\xbe\x2d\xe7\xac\xf9\x48\xd6\x7b\xa0\x69\x60\x4b\x76\x33\x36\x76\xe0\xfa\x21\xbf\xce\xac\x58\xee\xf7\x05\xed\xec\xe9\x94\xd7\x07\x7e\x99\xa5\x34\xfb\x82\xb2\x6f\x06\x01\xb6\xb9\x46\xff\x37\x4d\x5e\xd3\x5e\x7c\x9a\x7c\x53\x7d\xb5\x9f\xf8\x67\xf5\x75\xfd\xc4\xbf\xa8\xaf\xa8\xa7\xf8\x86\x78\x4b\xfd\x46\xfa\xb7\xa3\x7f\xef\xb6\xb8\x46\xd3\x93\xb6\x8a\xf1\xd9\x2f\xeb\xb0\x49\xaf\xaf\x0c\x35\xf0\x83\xff\x6c\xe9\x2b\xe3\xb6\x5b\xf5\x88\xbb\xaf\x0d\xd1\x5f\x35\x55\x89\x0b\x6d\x46\x6b\x57\xd7\xf0\xaa\x7f\xaf\x27\xea\xf7\x6a\x52\x78\x69\xf0\x7a\x6f\x91\xd9\x87\x0b\x74\x2a\xf4\x7a\x3f\x67\xc7\x2f\x93\xbc\xe3\x3a\x68\xa9\x3b\x3b\xb4\xc8\x76\x6e\x20\xf8\xdc\x31\xda\x04\x0d\x4b\x59\x08\xf6\x4b\xa5\xb5\x4f\x1d\x64\xf9\x08\xbe\xa0\xf8\xf8\x60\x0d\xa2\xb2\x28\xff\xe3\xe3\xc3\x68\x30\xfc\xe8\x87\x1f\x1f\x23\xf5\x8e\xe2\x1f\x65\x89\xee\xf2\xee\xfb\x44\x3b\x47\x2c\x95\xde\x29\x1a\xa0\x34\xf0\xdd\xc2\x06\xef\xcf\x0a\xac\x59\xff\xc1\x18\xee\x4a\x62\x2a\x39\xf6\x1c\x5a\xf9\xbc\x23\xb3\xda\xff\xd1\x10\x43\xf1\x71\x08\x00\xe2\xe3\xe0\xee\x71\x94\xca\x8f\x77\x62\x1c\x7e\x14\xc3\x8f\x69\x28\x06\xc3\x8f\x9f\x3f\x06\x8f\xe9\xe8\xa1\x3b\xf8\x07\x71\xb4\x1b\x80\xbb\x36\x5d\xab\x52\xb7\x79\xe7\x19\x35\x79\x9d\x70\xd3\xa4\x6b\x35\x95\x40\x23\x13\xf9\x3b\x8f\x74\xcc\x0a\x07\xec\x32\x2b\xa2\x63\x3b\xc5\xd8\xdf\x4d\xe2\x3c\x69\x7a\xa9\xfd\x64\x0c\x1b\xb4\x9f\xb6\x65\xdd\x32\xbb\x48\x98\x64\xec\xcc\x15\xc5\x56\x4d\x22\x6f\xde\x99\xb7\xd0\x57\x13\xc0\xe6\x66\xfd\xdd\x2c\x53\xb1\xbd\xf6\x13\x21\xf6\x07\xb3\x67\x33\xc7\x94\x78\x71\x64\xfa\x71\x9d\xf5\xe3\x1a\xfb\x21\x4c\xb4\x6a\xdf\xd4\x1b\x17\xeb\xbd\x7e\x02\x8e\xeb\x28\x3b\x3b\xa7\x13\x81\x42\x65\xdb\x1c\x0a\x2d\xc8\x6e\xa0\x17\x08\x9f\xfd\x78\x02\xb0\x94\xeb\x8e\x05\xec\x0c\x58\x93\x5c\x2c\x1b\xb0\xd1\x83\x25\x09\x66\x75\x13\x8f\xcb\x99\xcf\x52\xee\xaa\x6b\xcd\x9b\x06\xbd\x8e\xed\xbc\x35\xf7\xd3\xab\xa0\xfd\x7d\x0f\x9a\xa4\x87\xa7\xf6\x5a\x95\xde\xc6\xc2\x8e\x69\x62\xbb\x1e\x95\xcf\xc2\xd6\x13\x44\x43\xf3\x7d\x3d\x99\x41\x3f\xf6\x87\x3c\x74\x7c\xd6\xdf\xe7\xc0\x76\xfb\xec\x17\xaa\x9c\xc3\xaf\xbe\xc9\x1d\xf0\x9a\xe3\xb3\x93\x2e\x77\xbd\x02\xc0\xea\x9e\xac\xb8\x41\x17\xb0\xfb\xb4\x9f\x3c\x1c\x4e\x68\x86\x13\x71\xe9\x1e\x79\x56\x48\x05\x6c\x03\x1a\xe7\xc1\xdf\x4d\xd8\x40\xaf\x57\x96\xcf\x42\x94\x6b\xc4\x10\x08\x20\x10\x17\x0c\x34\x5d\xb6\x90\xd2\xd3\x11\x31\x46\x04\x28\xe3\xc8\x41\xfe\xe3\xc9\xca\x17\x7d\xd0\x1d\xe8\xd9\x42\x8f\xd0\x11\x1c\x17\x7a\xf5\x7d\x9a\xf0\x80\xa6\x3c\xa4\x5d\x1e\xc1\x30\x7a\xbc\x0b\x5d\x4c\x69\xc4\xee\xda\x84\x0e\x78\x97\x35\x45\x16\x1c\xe5\xa9\x30\x9e\x71\x1e\x84\xf1\x4c\x32\x13\x0f\xba\xff\xac\xfd\x84\xcf\xc2\xb2\x5c\xed\x27\xa2\x55\x64\x27\x84\xbc\xe9\xd7\x50\xe6\xde\x12\x7a\xb4\xb7\x54\xc5\xf5\x13\xaa\x65\x66\x55\x5c\x67\x55\xec\x2d\x57\x01\x83\x38\x95\xd6\x80\x46\xec\x50\x10\xb7\x8f\x3c\x76\x84\xc7\xe5\x8a\x44\x00\x25\x6f\x1f\x2c\xf8\xa5\x93\x5c\xf2\x1e\xe9\xe3\xa4\x26\xa8\xc1\x27\xf4\x07\x8f\xd8\xd5\xc4\x6d\xa8\x77\x8d\x3f\x54\xc2\x0f\xde\x39\x2e\x37\xca\xad\x90\x9e\x01\x16\x89\x98\x4f\x7f\x94\xf7\x9b\x34\x02\x18\x1d\xb1\xeb\x89\x7b\xec\xfd\x0f\x06\x8e\x3d\x8f\xd0\x33\x00\xe1\x67\x84\x5e\xc2\xe1\x50\x99\x9f\x4f\x70\x9f\xfe\xe0\x57\x26\xe6\xe0\x80\x36\x20\x42\xa3\xff\x33\x77\xdf\xa3\xfb\x13\xfb\x92\x36\x27\xf6\x8f\x99\xa3\x7b\xc1\x7f\x38\x58\xff\x77\xcf\x6a\xa0\x94\x7e\xb7\xcd\x3f\xe0\x40\x76\xdb\x74\x8f\x38\x23\xfe\x7c\x65\xc5\xb0\x75\x46\xc4\x19\x43\x20\x81\xc0\x58\x6d\x1b\xce\xf9\x28\xd3\x10\x1e\xd7\xd5\x8c\xd9\xd6\xaf\x16\x1a\xb8\x2a\x95\x7e\xb5\xac\x84\x8e\x49\xa9\x64\xc5\xac\x1b\x58\x23\x42\x13\xf8\x1d\xa3\x28\x25\x62\xc1\xb5\x95\xd2\x01\x6c\xd6\xb7\x8e\xb4\x7b\xe8\x45\xd9\x1e\xd0\xdf\xb1\xb0\xbb\xd4\x17\x36\xcc\x34\x95\xa1\x1d\xd3\x76\x04\x9c\xdd\x88\xbe\xda\x63\xed\x31\x7a\x82\xce\xc5\xed\xbd\xd9\x8c\xcc\x04\xeb\x3f\xe0\x8b\x1c\x86\x76\xeb\x23\x14\x5e\x09\xbd\x34\x02\x10\xda\xde\xbe\xb0\x04\xf3\xa9\x60\xaf\x6d\x42\x25\x13\x5f\x2d\x88\xcf\x17\x4a\x98\x85\xca\xfd\x52\x0a\x35\xef\xb8\xbf\x81\x30\xb9\x9e\xb8\xa1\x47\x81\x4f\xbe\x9a\xb8\xbe\x47\x03\xb6\x3f\x29\x95\xb0\xed\x13\xbc\xa6\x7a\x53\xaf\x90\x42\xda\x91\xb6\xaf\x06\x13\xb0\xe6\xc4\x28\x42\x17\x6f\xf3\x02\x77\xdf\x9b\x11\x7a\x69\xaf\x55\x67\xc4\x11\x80\x7b\x07\x87\xa6\x8b\xbb\xed\x0c\xa5\x06\xab\x2d\x0d\x16\xd1\x52\x53\x18\x2b\x38\x70\x6c\xc2\xb9\x18\x38\x39\x12\x00\x1c\x10\xd3\xda\x4c\xf7\x16\x1d\x8b\x74\x14\xda\x72\x46\x8b\xf1\x1d\x13\x1f\xce\xcc\xb5\xa1\x86\xe8\xa5\x92\x35\x5f\x2b\x9c\x34\x89\x03\x2e\x94\x8f\xf2\xf2\x84\x14\x2b\xb8\x56\xf7\x3e\xc5\x0a\xae\x57\x55\x10\x9b\x0a\x82\x59\x86\x91\x75\xba\x4f\x8f\xe6\x5d\x14\xf7\x4e\x32\x6b\xd5\xb7\x0f\x86\x86\xea\x6b\xb3\x9f\xe2\x89\x57\x34\x31\x15\x0f\x4c\xe2\xf1\x21\xaf\xd4\x66\x1f\x7a\x4a\xd0\x10\xf4\xc3\x39\xcb\xb4\xf3\x17\x80\x55\x75\x05\x81\x7e\x0b\xde\xf1\x02\x6c\x38\xf3\x19\xa1\x0f\xe8\xd0\x54\x97\x21\xf8\x48\xd9\xad\x7a\x9c\x0b\x57\x28\xa3\xef\xc4\xf4\xb3\x46\x4d\xff\x44\x66\x2c\xbe\x7f\x5b\x08\x1c\x1f\xc2\xc6\xcb\x55\xcd\x94\xdd\x1e\xb6\xb5\x8e\x55\x57\x6a\x34\xd6\xf7\x1f\xaa\x66\xe5\x2f\xd6\xb2\x6a\xd5\x6a\xc5\x27\x1b\xb5\x6a\xd5\x64\x24\x34\xc9\x7c\x3c\x18\xdb\xcd\xc5\x64\xc7\xe7\x4f\xc8\x8f\x1b\xb5\x16\x37\xf2\x2a\xa6\xea\xc8\xab\x60\x97\x6a\x6c\x6b\xdd\x04\x13\x8f\x10\x07\xaf\x66\xaa\x9e\x21\x0d\xe2\x01\xaf\x51\x1f\x6d\x04\x2a\xa7\x17\x84\x18\x63\x08\x50\xaa\x6c\xea\xd3\xd3\x50\x81\x48\x53\x69\xac\x82\x04\xce\xfe\x7b\x53\x2c\xb6\xbb\xa5\x92\xd8\x49\x0d\x85\x7d\xfb\xc0\x9f\x3a\x56\x40\x4a\xa5\xea\x76\x50\x0f\xec\xfe\x89\xbe\x8b\x44\x4b\x42\xca\x40\x96\x99\x60\x5d\x60\xdd\xaa\x69\xc3\xcd\xf1\xa0\xfe\x41\xb9\x06\xd9\xd0\x69\xc4\xd6\xae\x3a\x4c\x98\x38\x79\x66\x4d\xab\x88\xa7\xed\x85\x11\xa3\x87\x6d\xe3\x1d\x57\xe7\x21\x59\x15\xf3\x1b\xf1\xf6\x61\x5d\x94\x75\x9e\x6c\x17\xea\x98\x78\x50\xdc\xcf\x6a\x31\x0a\xc6\x0e\xaa\x8e\xaf\x84\x3a\xbe\xba\x5c\x5f\x3b\xb9\xb7\x84\xeb\x7b\x44\x13\xce\x6b\xb5\xfc\x9d\x5b\x56\xcb\xe0\x64\xde\x06\x66\x8d\x73\x81\x63\x41\x03\x2e\xaf\x5d\x51\xb6\x04\x13\x4f\x6c\xf8\xf8\xb3\x1f\x06\x9d\x01\x4c\x77\xad\x4a\x2a\x55\x92\x0b\x95\x50\x0c\x78\x58\x81\x72\xc6\xf1\x66\xb9\x86\x34\x14\x56\x62\xc9\x75\xc1\x6e\x1f\xca\x50\x0f\x59\xae\xa8\x7c\x11\xae\x72\xf0\x38\x5c\x1c\x1e\x7a\xe5\xac\x3a\xc1\x36\xb6\x56\xae\xa1\xec\x4a\x35\x10\x60\xdb\xa4\xd0\xcc\x2a\x37\x9f\xfd\xc5\xfb\x2b\x38\x76\x9c\x67\xde\xd1\x6b\xfa\x12\x3d\xf3\x98\xeb\x57\x84\x13\xe8\xc7\xfa\x81\xd1\xec\xd0\xa6\x21\x60\x43\x85\x5a\xdd\x18\x29\xa3\xea\x76\xe4\x84\x40\x11\x25\xf5\x68\x27\xac\xef\xde\x5b\x01\xb6\x62\x07\x76\x5c\xd7\x2e\x1d\x68\x48\xec\xa4\xae\x7d\x3f\x60\x9a\x23\xb4\x31\xf6\xd0\xf1\x39\xfb\xb6\x2e\x9c\x90\xd7\xd8\xe6\xba\x70\x22\xf4\x69\xa2\x14\x54\xc4\x4e\x38\x9d\x8a\x6d\x7f\x3a\xf5\x77\x78\x48\xc8\x5b\xc0\x6b\x0e\x70\xa6\xf2\x51\x5f\xd6\x08\x9a\xf2\x80\x26\x3c\x72\xaa\x9c\xc7\xd3\xe9\xda\xe9\xbd\x15\x13\x74\x90\x91\x4e\xa7\x56\xca\x61\x60\x71\xbd\x96\x7b\x13\x52\x47\xbc\xa2\x5c\xa1\x28\x0d\x92\x98\x90\x8d\x3b\xb7\x35\xc1\xe3\x4e\xd6\xf3\xac\x1a\x2a\xa4\x84\xd0\x74\x9d\x57\xb7\xa1\x22\x03\x59\xc4\x8b\xb5\xb5\x9e\x58\xe9\x7a\xbc\xb1\x45\x68\x8d\x6c\xa4\x04\x56\x66\xf6\x7c\xd7\x49\x43\x6b\xcd\x8a\x77\xb8\x5f\x2a\xc5\xdb\x3c\x24\xa5\xd2\xd6\x0e\x3a\x1a\xdc\xda\x09\xea\xb1\x2d\x32\xff\xcf\x75\xb6\xb5\x2d\xea\xca\x64\x2d\xb1\x6b\xb6\x28\x1a\xdf\xce\x29\x5c\xc3\x7e\x6b\x8e\x7c\x22\x78\x50\xff\xd4\xb5\x7c\xba\x37\x10\xf4\x08\x1d\xd7\xdb\x17\x45\x86\xdc\xa7\xdf\x07\x8a\x17\x5f\x61\x59\x37\xd5\x16\xac\x27\x02\xdf\xd7\x09\x76\x33\xb6\x2f\x0c\xdc\x78\xbc\xe6\x2d\xa8\x79\x77\x60\xee\xe6\x1e\xf4\x0d\x6e\x14\x18\x43\xd0\x23\xc4\x0b\xce\xaf\xe7\x95\xbe\xcb\x75\xdd\x33\xe2\xf8\xab\x9d\x9b\x03\x54\xd3\x7d\x75\x5f\x03\x0f\x5d\x9d\xc7\x21\x8a\x7b\xde\xf3\xb3\x1b\x05\x33\xe7\x9a\x75\xe6\xfd\x7e\x98\x5e\xa1\xb3\x00\xf1\x75\x39\xed\x21\xe4\xca\xaf\xe0\xde\x73\xb1\x62\xd8\x59\xba\xec\x74\xba\xa6\x73\xce\x19\xa2\x53\xc2\xf4\xb7\xe1\x63\x4f\xa3\x6b\x65\x8a\x37\x0d\xa3\xa1\x89\x70\x0f\x3c\xaa\x44\x53\x26\x22\x90\x5e\xa5\x90\xa8\xc5\x55\x26\xe6\x2c\xc8\x52\xb1\xae\xc7\x7e\x27\xec\x2a\x8d\x1b\xfb\x2a\x06\xfa\x4d\x4f\x09\x0d\x3e\xd9\xc7\x0d\x2a\x3f\xd9\x7a\x3d\x66\xd4\xe7\x7b\xda\x0f\xce\x43\x48\x05\x75\x0d\x36\x7c\x60\x9f\x72\x31\x7c\x6e\x53\xdc\x88\xb5\xf4\x42\x28\x47\x23\xb6\x29\x7f\x71\x68\x03\x99\x98\xdb\x31\x98\x2d\x7a\x94\xb8\x9a\xf7\xba\x79\xbd\x69\xf6\xdd\x93\x30\xa2\xa0\x9b\x2b\x2e\x2a\xfe\x86\x96\xbd\xfc\xba\x17\x3c\x70\x4e\x7a\xea\x22\xa3\x4a\x66\x57\x48\x8e\xc5\xa3\xf7\x96\xf3\xe6\x6a\xe6\xa8\x3c\x77\xdd\xe5\x65\x83\xca\x4d\x7a\x1c\x0e\xbf\x87\xdd\xe1\x4a\x73\xf5\x3a\x73\x59\xf7\x6d\x63\x73\x06\x3b\xee\x6a\xd1\x53\x74\x31\xf7\x93\x28\xba\xd0\x1c\x1b\x6d\x7c\x4c\x1b\x1f\x9b\x71\x8e\x27\xdc\x2f\xc0\xf8\x2a\x3a\xef\x3a\xf6\x9c\x60\x5b\x22\xec\x3d\xe9\x59\xbe\x1b\x78\x34\x28\xe8\x08\x3c\x2f\x21\x25\xaa\x4a\x0a\x36\x9e\x14\x0b\xfb\x65\x15\x15\x78\xee\x39\xde\x06\x76\x22\xcb\xdf\x11\x6c\x7c\x9c\x0b\x4a\x7e\x3c\x0e\x3f\x86\xdd\xc7\x51\x7c\xf7\x71\xd0\x13\x81\x32\x82\x91\x0a\x3f\x4c\x07\xec\xe3\x8f\x30\x94\xf6\xc7\x7f\x94\xfd\xf2\x3f\x3e\xc6\x8f\x43\xf8\xc4\xd2\x8e\xaa\x36\xf4\xac\x95\x76\x21\xd9\xf5\x26\x8c\x83\x5d\x6f\x66\xea\xfe\x9c\xcb\xba\x70\x7b\x81\xb7\x83\x86\x45\xeb\x35\xbb\xaa\x1d\x7b\x54\x6a\x33\xe2\x04\xda\x3a\xca\xf2\x18\x32\x23\x17\x38\x0e\x1a\xf2\x17\xad\x3c\x11\x8f\x2c\x42\x7d\x35\x30\xe2\xf8\xec\xae\x6b\x85\x64\x86\x6e\x82\xfc\xa5\xda\xfc\x6d\x89\x18\x1b\x3d\x05\xb9\x18\xeb\x7b\x9e\xc2\xae\xce\xab\x52\x3e\x21\x0e\x71\x0a\x98\xec\xd5\xac\x58\x61\x75\xb4\x09\xec\x4a\xad\x78\xa7\xe3\xab\x7e\xf9\x6e\x50\xae\x79\x14\xb8\x7f\xe5\xca\x5d\xf3\xa1\x37\x57\xe5\x88\x3d\x89\x9d\x10\xd8\x20\xe8\x74\xf1\xcd\xaa\x40\x77\x4e\x8a\xad\x89\x0d\x4f\x83\x14\x78\xac\x2e\x72\x33\x37\x67\x55\x1a\xf2\x38\x73\xcb\x8f\xf9\x92\x32\x97\x6e\xe8\xc1\x6c\xc7\xea\x53\x2f\x73\xc2\x93\x0d\xec\x43\xbc\xb1\xe9\x24\x38\x63\x11\xbe\x68\x5a\x70\xee\x8f\xb5\x44\x58\x12\x78\xfd\x2e\x3e\x48\x2d\xf3\x48\x57\xe3\xbb\x69\xe8\x59\x41\xb9\x46\x6b\x85\xd7\xfb\x33\x43\xe8\xe4\x1b\xf2\xe5\x64\xc1\x38\xd1\xc7\xdd\x7b\xcb\xc7\x7b\xdb\xf1\x71\x65\xce\x86\x7e\x6b\x51\xf8\xbb\x0a\xd5\x9c\x1e\xd0\xc3\x39\x4c\xd3\x39\xe7\x98\x70\x72\x40\x8f\x8f\x34\xaf\x02\x28\xe5\x67\xa3\xde\x69\xda\xbb\xc7\xb0\x81\xae\xe2\xcc\x16\x1f\x24\x89\x3b\xfd\x22\x05\x02\xe7\x83\x42\xe0\xf0\xa0\x10\xb8\x6c\x90\x80\x5f\xde\xa9\x66\x52\x7f\x5e\xd6\xec\xd3\xb3\x83\xbf\x85\xd9\xce\xfb\x7c\x4d\x73\x3a\xf2\x9b\xaa\x29\x7a\xd6\xfd\x3e\x34\xc8\xee\x14\xb6\xe7\x27\xdd\x60\x7c\xc8\x0b\x78\xca\x91\x5c\x02\x75\x23\x69\x8d\x6e\x12\x5b\x57\x75\xaa\x5f\x52\xc5\x87\xeb\x5a\x38\xde\x1d\x29\xa7\x6c\x85\xa2\x1b\x56\x8d\x7d\xad\x7d\x5b\xc7\xbf\xc6\x11\xea\xe5\xfe\x1c\x5e\x55\x91\xf7\xb7\xfc\x08\x26\xf5\xfe\x59\xe4\x0f\xad\x1a\xf7\x42\x4d\x75\xe7\x59\xd0\x5f\x57\x54\xcf\x8b\x4e\xdd\x03\xe8\x0b\xa3\x89\x9f\xcd\x28\xbe\x9b\xa8\xbb\x2c\x2a\x52\x04\x9c\xa3\x24\x8f\x3f\xcf\xb9\xee\xab\xf6\xd8\xf0\xa2\xc2\x23\xfd\xdb\xb9\x35\xac\xe0\xc3\x57\x9e\x4d\xe9\xa7\xe3\xfa\x4f\xe8\x86\xff\x2c\x68\x2d\x9b\x81\x9b\x7d\x5e\x9d\xfd\x7a\xb6\x5a\x7f\x02\xbc\x48\x0f\xb4\x0c\x48\xff\x2b\x54\xaf\x32\xbe\x8f\xee\x73\xb3\x91\xfa\x6e\x18\x26\x13\x38\x23\x25\x5e\x58\xc9\x1f\xb1\xcb\x19\x99\x7d\x50\x35\xbf\x4b\x0f\xcc\x51\x01\xf9\xce\x5d\xe3\x17\xc4\x84\x52\x9f\xf3\xcb\x3b\xb2\xab\x75\x38\xf4\x6b\xa7\x82\x1f\x9e\x1a\xfd\x17\xfd\xd7\xbf\x68\xd5\xa3\x05\xce\xa4\x5c\xce\x3c\x06\x0c\x6d\x74\xbd\xe5\x7b\x45\xfb\x3b\xcb\xf4\x43\x08\xbb\xb5\x86\xea\xc8\x96\xac\xf0\xcd\x75\x4b\xef\xb7\xb2\x5e\x39\xa2\x0c\xf6\x55\xb3\x2c\x6d\xa3\x67\x41\xb2\x2c\x8a\x76\x8f\xf8\xb5\x4e\xd2\x1b\x4f\xbf\xc8\xaa\x72\x0e\xec\x20\x29\x1c\x0f\x1c\x8c\xd9\x30\x05\x13\x98\xda\xbc\xca\xe5\xbe\x53\x55\x30\x51\xf1\xfe\xdb\x81\xe6\xfd\x22\x88\x04\x0e\xe2\x2d\x28\xbe\x80\x28\x78\x84\xdc\x33\x4a\x2f\x11\x2a\x60\x7b\x34\xe5\x35\x27\xdd\xd6\x5b\xa8\x54\x82\x0a\xd6\x78\xa6\x23\x1d\xf3\xfb\x7b\x2b\x46\x76\x15\xd8\x5e\x33\x80\x98\x4a\x42\x51\x6e\xb5\x50\x1f\x00\xd8\xef\x26\x2a\xc9\x36\xbd\x7a\x80\xef\x7c\x28\x56\xe7\xcc\x57\x37\x33\xc3\xd7\x4e\x8c\x70\x28\x33\xb4\x54\x87\x86\x58\x94\x89\x29\x9d\xc9\x30\xb7\x9d\x5b\x75\xc8\xad\x02\x4d\x57\x5e\xa2\xf5\x4e\x13\xb2\xb1\x69\x0c\xa7\xbe\x2c\xaf\xf4\x69\x42\xe7\x8e\xdd\xf0\xa5\xa2\x8f\xe7\x7c\xfa\xfd\x2d\x8a\x57\xda\xc5\x55\xc4\x6e\x12\x53\xbe\x62\x58\xe5\x9f\xe7\x24\xb3\x64\x1a\xc5\xc0\x9d\xe5\xb9\xeb\xe6\x53\x3b\xd7\xc9\x76\xf8\x79\x9f\xbc\xf9\x73\xe3\x37\xbe\x08\x3b\xb7\x8e\x9c\x03\x4f\x68\x25\x51\x74\x75\x6b\x98\xd7\xbc\x4f\x1d\xbd\x94\x4d\xaf\xa3\x6c\x3c\x21\x95\x1c\x6f\x5b\x6d\x99\x11\xb9\xf2\x1b\x3d\xd1\xe6\x3a\x8e\x6c\xf7\xed\xc5\x56\xc6\xec\x5f\xed\x80\xea\x9c\x69\xd8\x8d\x87\x77\x76\x34\xf3\xe8\x49\x60\x77\x9a\xf4\x38\xb0\x77\x8f\xe9\xc0\xb7\xcf\xa9\xe8\x06\x77\x8f\x7d\x55\xfc\xc0\xb7\xab\x33\xc3\xa0\x66\xb0\x92\x5f\xde\x51\x0d\x96\x4f\x13\xfa\x41\x3b\x4d\x4d\x60\x29\xba\xa6\xab\xb4\x67\xba\x48\x23\xae\xde\x82\x39\x71\xdd\x0a\x39\xf4\xa7\x5b\x4e\xa0\x37\xe5\x64\x46\x31\x94\x42\x48\x7d\xeb\x78\xa0\x29\x20\x67\x2f\x4b\xe9\xa9\x32\xfa\x3b\x35\xf9\xd0\x6d\xe4\xaa\x3a\x93\x85\x3a\xd3\xf7\xeb\x2c\xa7\x2a\x94\xd5\xe9\x04\xfc\x6d\x6f\x64\x1b\xf0\x4f\x1b\x3f\x6d\x03\xf7\x67\x8e\xcf\xdf\x3a\xbf\xed\xb7\x9e\x18\xde\xd9\x21\xdd\x1b\xd9\x6b\x35\xda\x0b\xed\x40\x4b\x56\x03\xd6\xf8\x39\xa3\xb1\xc9\x11\x41\x0e\xbf\x98\xc1\xaf\x07\x6c\x6f\xa4\xf3\xdd\xfd\xb6\xa5\x7e\xb4\xaf\x94\x97\x8c\xac\x71\x89\xcb\x40\xff\x27\x7a\x87\xd3\x28\xd6\x9f\x31\x3d\x1f\xda\x82\x9e\x1e\xda\xfe\xac\xf8\x1c\x6f\xb7\x28\x7d\xd1\x3e\x5d\xcd\xd1\x10\x0a\x02\x56\x2c\x01\xd0\x4e\x20\xa8\xab\x12\x94\x25\xeb\xc3\x25\x0c\x17\x65\x2c\xad\x07\x95\xcd\x75\xc1\xe2\x43\xc8\x17\x72\x40\x07\xf8\xd2\xa5\xff\xe0\x9c\x1f\x0b\x74\xd3\x13\xba\xf2\x09\xe8\x27\xb5\x55\xae\x3a\x0b\x0a\x3b\x82\x5f\xfc\xd4\x00\x56\x2a\x7d\x30\x43\x18\x50\x9f\x4a\x81\x2a\x3f\x82\x1d\x69\x41\x27\x3b\xe2\xee\xb9\x57\x30\x7a\x4e\xd5\x75\xac\x40\x5c\x01\xb4\x4c\xc4\x1e\xdb\x6b\xfc\xd7\x41\xa9\xa4\xbe\x06\x0d\xa5\x3f\x79\x83\x0f\xb8\xd0\xf9\x0f\x80\x9c\xc6\x89\x40\x7b\x4c\x18\x9a\xcb\x21\x09\x0d\x3a\xe8\x27\x93\x94\x4a\x00\xe3\xdd\xaa\x97\xd9\x56\x11\x1a\x3a\x57\xd5\x5b\x0a\xf2\x16\xf1\xa6\x56\xd6\xc6\xd7\x50\x0a\xee\x45\xb9\x31\x6d\xac\x2a\xca\xaa\x8a\x3c\x2c\x56\x2e\x47\x8e\x01\x8c\xb0\xa7\xb2\xa6\x9d\x10\x62\x43\x1a\x91\x99\x50\x40\x4f\x64\x10\xaf\xb0\x08\xf1\x21\x74\x7c\xf4\xc2\xf5\x8a\x51\x01\x50\x0e\x62\xca\x7a\xe9\x7e\x9e\x53\x81\x40\xe3\x83\x25\x01\x7c\x09\x2a\x0c\xe0\x82\xbc\x65\x2e\x31\x53\xee\x17\x22\xc7\x42\x1f\x8b\x63\xa2\x6a\xc4\x91\x67\x92\xf6\x31\x29\x9e\x4f\xcc\x89\xdf\x9b\xd6\xa2\xe1\x03\x45\x88\x51\xed\x4f\x59\x6e\x28\x52\x8c\x46\x26\xfc\x99\x6d\x7e\xfe\x4a\x1c\xc1\x0f\x34\xdd\x2c\xcb\x21\x95\xe5\x28\x5b\xe4\x9b\x4b\xe4\x47\xf2\x36\x0e\xe7\xdf\x72\xdf\xde\x2b\xf2\x23\x08\x95\x3f\x04\xbc\x64\xf1\x3d\xad\x50\x36\xf7\xb4\xdb\x10\x25\x6b\x62\x3a\x15\xc6\x9c\x8d\xad\x8d\x7c\x16\xde\x69\x2b\x3b\xe2\xc1\x2f\xd8\x22\x2c\x8c\xa8\x44\x4b\x19\xf3\x36\xa0\x65\xfd\x48\xed\x21\x16\x46\xc4\x96\x45\x9f\x28\xa6\x7f\x5a\x2e\x7f\xdf\x31\x7a\x27\x15\x2b\xb9\xc7\x31\xbe\x6b\xf9\x8d\xfa\xec\x85\xcc\x48\xb9\x06\xc7\xee\x1e\x22\xaa\x34\x13\x35\x58\x01\xff\xdd\xb1\x82\xf7\x05\xfd\x5c\xb0\xd7\x19\x21\xf5\x80\xbd\x2a\xd9\x42\xc1\x02\xf1\xea\x2b\xd2\xc5\xb3\x6f\xd6\x45\x07\x89\xb1\x20\x84\x7e\xa5\x71\x6e\xbf\x4f\x38\xef\xec\xeb\x07\xcc\xc8\x37\x15\xde\x30\x4b\xf5\x82\xf9\xe2\x27\x80\x10\xa9\x6d\xe4\xc3\x1e\xa0\x21\xf5\xdd\xae\x87\x07\x99\xd0\x11\x7f\x9b\x39\x23\xd6\x91\xbc\xc7\x3a\xd2\x19\x69\x53\x40\xda\x80\x80\xf2\x83\x82\x53\x36\xe6\x31\x2c\x0c\x70\x09\xb7\xc2\x1a\x53\x9d\x13\x5f\x55\x13\x67\xc4\x76\x85\xc6\x71\xaa\x25\x1f\x5d\x40\xe7\x18\x0e\x91\xd8\xee\x71\x8e\xc4\x06\x6c\x18\xd6\x31\xef\x2a\x7c\xe6\x8c\x59\x1a\x94\x4a\xa6\x91\x3b\x69\x41\x04\xf0\x7b\x23\x76\xc9\xd7\xaa\x19\x51\x36\xe1\x55\x67\xb2\x3d\xc0\xd1\x38\x93\x72\x99\x40\x4f\xd8\x11\xde\x15\x69\x0c\x1a\xea\x6b\x42\x76\xe4\x4e\xbc\x19\x71\x52\xbc\x06\x86\x59\xb1\x74\xe6\xaa\x87\x7d\x1e\x13\xb7\xef\xd1\x11\x6b\xc6\xfc\x6d\x46\xaf\x9f\x2d\xf8\x04\xac\x13\x95\x27\xe5\xad\x19\xc1\x24\x3d\x41\xba\x67\x2a\xea\x12\xcd\x3a\x9f\xf4\xac\x11\xed\xb9\xbd\xc0\x23\xce\x84\xab\xa3\xf1\x61\x84\xe1\xe9\xb4\xea\x8c\x17\x9a\x84\xe6\x76\x3d\x47\x99\x2c\xba\x6a\x59\x13\xaa\x93\x8e\xbd\xf5\x31\x1d\x11\x07\x01\x58\x8f\x38\x48\xea\x8d\xc8\xec\xf9\x44\xa0\x0f\x80\xf1\x89\xc0\x6b\x77\x05\xda\xd4\x04\xc4\x66\xf8\x10\xd5\xe3\xb1\x3b\xf1\xa8\xe0\x3d\x25\x8c\x18\xf1\x1e\xfb\x75\x2f\xa8\xcf\x55\x0b\x7a\xc7\xf8\x66\xc7\xe0\x76\x78\x55\xbb\xad\xbb\x3e\x2e\x0b\xa2\x76\xc8\x0b\x8f\x28\x4c\xd6\x28\x73\x1f\xc3\x55\xd6\xec\x00\x26\x85\x6d\xdd\x5c\xad\x8d\xa0\xd1\x17\x5d\xde\xe0\x15\x65\x3c\x4b\x43\xa5\x58\xb5\x1f\x19\xa8\x94\x98\xb0\x82\x4a\x34\xe5\x51\x39\xa6\x5d\x1e\x95\x81\xb4\xc2\x93\x50\x45\xa7\xea\xc5\x23\xa2\x2c\x6f\x04\xc6\xec\x86\x7e\x46\x13\xb8\x03\x8f\x8e\xb9\xef\x0e\xbc\xdc\x5a\xc0\x58\xa5\x4e\xb2\x13\x32\x2a\x9e\x90\x31\xa1\x63\x34\xfb\x07\x27\x03\x8e\x87\x33\xce\x77\xf8\xc8\xec\x70\xcc\x3c\xb7\xc9\xcd\x46\x56\x9a\xd9\x3d\xc0\xc5\x0b\xfb\x7e\x02\xfb\x7e\xa4\xf7\xbd\xd9\xeb\xd7\x01\x34\x76\xfd\x6c\xc1\x27\xd5\x56\x30\x7b\x34\xa1\x30\x7f\x14\xb1\x0c\xc1\x6c\xf3\xbb\x4f\x1f\x4f\xe8\x06\x1e\x97\x3c\x07\x9c\x18\x1d\x8d\xef\x52\xe7\x0f\xcd\x1e\xaf\x3a\x7b\xdb\x13\x75\x68\xf6\xca\x65\x52\xdd\xde\x2b\x95\xac\xa4\xcc\xbb\x84\x8e\xf3\x03\xf4\x62\x4b\xfa\x6a\x27\x74\xfe\x20\x41\xb9\x3d\x38\x48\x1f\x4e\x7a\x00\x08\xd4\x8e\x4f\xca\x3c\x75\xd0\xd0\xe6\x98\xcc\x66\x7e\xbe\x30\xf8\x4a\xd0\x01\xb4\x36\x9d\x5a\x31\x4f\x2a\xf1\x4a\x32\x46\xb0\xce\x39\xe7\x83\xfd\xba\x5f\xe6\x41\x25\xb6\x55\xb8\xd3\x2c\x95\x2c\xbf\xac\x2f\xd0\x82\x4a\x0c\xcc\x84\xde\xf9\x6a\xb1\x23\xb3\xd8\x63\x1e\xe1\x3a\x17\x9d\x41\x71\x1f\x87\xe3\x0e\x76\x3d\xf6\x5a\xe6\xbe\x93\x19\xc9\xcd\xad\x86\xaf\x86\xc6\xad\x79\x17\x76\x05\xdc\xa0\x29\x35\x74\xb1\x71\xec\x91\x19\xac\x71\xc1\xf8\x68\x58\x7c\xd6\x89\xf7\x2e\x81\x2d\x9d\xdf\x4b\xb5\xc5\xdb\x86\x96\x52\xd6\x49\x93\xf0\xd5\xf6\xe9\x43\xa7\x6b\x57\xd1\x3b\x4b\x95\x73\xbf\x5e\x90\x9f\xd8\x09\xbd\xf6\x6d\xd7\x9b\xe1\xc3\xb4\xd9\xf2\x40\x1a\xf3\xb8\x58\x5d\xa2\x66\x0e\xf1\xb7\xd5\x05\x75\x6d\xc7\x77\x03\x38\x05\x85\x83\xfb\x7d\xa1\xe0\x0a\x0a\xb3\x40\x3b\x04\x15\xc1\x6e\xf6\xd7\xe1\xec\xd6\xb6\xe1\xb3\x1e\x6e\x58\xf0\x5b\xa9\x11\xbb\x4a\x63\x6e\x05\x15\xcb\x02\xaa\x61\x1d\x45\x92\x11\x21\x1b\x9b\x88\xb6\x16\x26\x21\xa3\x7c\x61\xa3\xc4\x8b\x8f\xe0\xc8\x9b\x98\x5b\x38\x31\xbf\xac\x33\xe2\xc4\x40\x39\x45\x4e\xe7\xde\x4a\x60\x42\x0a\x30\x29\x7f\xd4\xb8\x44\x02\xe5\xd0\x48\x5f\x36\xb3\xfe\x83\xdb\xf7\xd6\xad\xcd\x8a\x82\x3b\x1b\x9b\xda\x4b\x4c\xb8\x2d\xb5\x24\xc4\xf5\x1c\xc1\x8f\x71\x92\x8a\x36\x23\xae\x35\x31\x94\x4f\xe4\xde\x7f\x8c\xd8\xf3\x8e\x68\xb0\xa7\x64\x63\x66\x9a\x89\x41\xf3\x55\xda\x5d\x38\x48\xb4\xc7\xab\x4e\x4f\xc1\xee\x5e\x6e\xf7\x3c\x70\x7b\x1e\x1d\x65\xb0\x6c\x90\xc3\x32\xdf\xed\x79\x95\xa8\x62\x55\xb7\x7b\xf5\xd8\xae\x12\x5a\x03\xd0\x56\xdd\x1e\xe1\xee\xab\x8f\x10\x17\xd9\xe7\x54\x63\xc4\x31\x96\x42\x44\xb8\x87\x9c\x58\x5a\x8e\xe8\xab\x5d\x35\x30\x60\xa2\x60\xc0\x78\xe6\xd1\x06\xc0\xac\x06\x00\xc8\x01\x00\xc8\x46\x0e\x20\x07\xef\x00\xc8\x71\x7d\x6f\x19\x48\x56\x69\x77\x09\x48\x8e\x00\x48\x0e\xe6\x80\x64\x43\x81\xb0\x86\x86\x95\x8d\x1c\x18\x0e\x56\x03\xc3\xc6\x7b\xc0\xf0\xfa\xd9\x6a\x14\xc0\x6c\x4a\xbb\x73\x60\xf6\xa4\x67\x35\xe8\x40\x03\x35\xa5\xe6\xe4\xa4\x65\x3e\x29\x47\xe5\x78\xe6\x1b\x3a\xdf\xf9\xa0\xcc\xef\xa4\x95\x78\x0e\x74\x85\x15\xb9\x12\x74\x85\x15\x59\x00\x5d\x6a\x11\x13\xb3\x88\x0d\x9e\xc0\xfa\xfd\x16\xd8\x31\xd8\xe6\xb4\x91\xfb\x85\x2b\xfb\x84\x36\xcc\x61\x78\x29\x40\xb1\xc2\x4e\x3f\x3e\x59\x32\x73\x56\xd8\xea\x2b\x76\x98\xa9\xe3\x6a\x9e\x8a\x35\x15\x18\xd1\x81\xb4\xe6\x18\x41\xd8\x17\x65\x49\x53\x7d\x7a\x7c\x8a\x96\x22\x93\x4a\xea\xa0\x18\xcc\x4a\xcb\x3c\xbb\xcf\x7f\x03\x58\x96\x22\xd0\x4a\x3c\xf5\x0c\x32\x7f\x9c\xbd\xe4\x84\xe3\x26\x74\x6a\xd5\x6d\xee\x3b\x24\x28\xf3\x9b\x90\xfa\x1b\xbc\x56\xcd\x7d\x19\x9f\x4a\x2b\x28\xdf\xf7\xcb\x01\x15\x4c\x7e\x83\x6e\x14\x24\xa0\xb7\xad\xa2\x3e\x8e\x92\xfb\xed\x1a\xe9\x7d\x4b\xf3\xec\xe7\xfa\x6a\xce\x88\x8c\x3f\x05\x46\xa6\xde\xbc\x57\x83\xfd\xae\xf5\xf7\xb4\xe4\xe8\x87\xfa\x09\xff\x89\x9b\x0a\xb3\xf7\xd0\x28\x09\x71\x7e\x21\x2c\x80\xe8\xc4\x57\x52\xe9\x1f\x77\x74\xef\x48\xd0\x0b\x88\x4b\x13\x7e\x05\x71\x67\xfb\x10\xea\x3d\x70\x14\x18\xff\xd8\x57\x4e\xd3\xd5\xc5\xfa\xe6\xba\x25\x60\x2e\x05\xbe\x93\xaf\x6d\x7c\x26\x68\xac\xe1\xb1\xad\xaa\x13\x13\x41\xbf\x1f\x09\xfa\xeb\x00\x62\xaf\x63\x25\x10\xef\xef\xa3\x3c\x5c\xb0\x5e\x5f\x45\x1c\xec\x0a\x08\x9e\x4c\x54\x29\x79\x4c\xbb\x91\xa0\x7b\x77\x10\xd9\xfa\xa2\xf2\x04\xcf\x98\xe7\xb4\xa9\xa4\xe1\x93\x06\x84\x6e\xbf\xa8\xd0\x43\x53\xb9\x88\xbb\xfd\x82\xef\x83\x4f\x9b\x4e\xc0\x7b\x5d\x2b\x00\xbe\x05\x08\x7b\xbb\xd7\xb5\x24\xa9\x3f\x62\xd4\xcd\x83\xa5\x62\xa9\x54\x3f\x01\xfb\x19\x12\x5b\x05\x94\x30\x4d\xb0\x93\x53\x1e\x38\x82\x0d\x63\xc1\xaf\xa1\xf9\x46\x83\x9e\xe3\x18\xbe\xa8\xf0\xed\xbe\x0a\xdf\x00\x39\x7c\x72\x3a\x9d\x9e\x3b\x81\x9a\xae\xd6\xb1\xb6\x6f\x8e\x63\x69\xec\x0a\x7a\x75\x45\xef\x8f\x88\x23\xd5\x45\xc5\xf5\x71\x7e\xe5\xf1\x61\xe9\xce\xc3\x58\x46\xcf\x2f\x3c\x6e\x7a\x96\xa0\x0a\x1e\x05\x00\x8b\xe4\x3b\xec\xc8\x60\xff\x5d\x99\x9a\x60\x67\x4d\xd5\x9d\xa7\x7e\xd6\x1d\xc1\x7e\x06\x6a\x6a\x5f\x71\x75\x4e\x86\x2a\xd4\x1a\x0b\xaa\xfc\x02\xb7\xf5\xd4\xf7\x95\xfa\xb1\x23\xd8\xcb\xbd\x8a\x79\xc6\x12\xdf\xf5\x18\x2f\xc6\x82\x9e\x1f\x09\xea\xef\xeb\x3d\x29\xff\x69\x7c\xd1\x9d\x04\xfa\x5a\x54\x68\x2e\xaf\x54\xb2\xd6\x04\xfb\x15\x01\xb7\xfc\x4b\xd9\xd7\x5a\xe3\xca\xd0\x39\x29\x68\x97\x1f\xb5\x9b\x1f\x3b\xc5\x97\x27\x1f\x1f\x1e\x65\x98\x7e\xec\x0c\x3e\x3e\x76\xd3\xd7\x8f\x83\x51\xaf\xf7\xd8\x1f\x86\xf2\xe3\xf3\x5d\xd8\xfd\x28\xd2\xf4\xa3\x7a\x83\xf2\x51\xf4\x73\x55\x77\x7c\x20\xfe\x0f\xe2\xcc\x6e\xf1\xaa\x20\xfc\xe7\x3b\x8e\xd2\x47\xad\x99\xa3\xb2\xec\x4d\xde\xbb\xcb\xf8\x31\x73\x3e\x9c\x0a\xeb\x76\xf1\x66\x24\x7f\xac\xc7\x7e\x38\x27\xd9\x4d\x42\x41\x9f\xfe\xf5\x1b\xec\x31\xf5\xfd\x02\xdf\x4a\x0a\xab\x3c\x2a\xf9\x8e\x36\xee\x1f\xae\x71\xde\x3b\x2a\x95\x42\xb4\xf0\x5f\x17\xe8\x59\xb4\x18\x79\xdd\x40\x79\xed\x26\xb1\xa5\x79\x28\xf1\x5d\xbd\x9d\xc4\x3b\x3f\x9c\xee\xe6\x93\x47\x33\x5b\xff\x00\x10\x70\x74\x27\xa2\x98\xae\x5d\x88\xb1\xe7\x6f\x16\x71\x26\xba\xc3\xec\x7b\x34\xd7\xe7\x1f\x78\xe1\x1a\xed\x7a\xe6\x99\x60\x60\x60\x8b\xa1\xa0\x22\x13\xe1\x46\xf8\x32\x54\xcb\x6c\x9b\xf7\x26\x43\x62\x22\x74\x06\xc9\x7d\xed\x3e\xbb\x8e\x35\x6b\xac\x98\x66\xd2\xba\x4f\x00\xf8\x4c\xa3\x54\x5b\x61\x90\x82\x28\xe3\x07\xe2\xc5\xda\x54\x90\x27\xd4\xac\x14\xd0\x10\x73\x09\x81\xe6\xb9\x48\xa6\xd4\xa3\x13\xe2\x2c\x61\x30\x9f\xa0\x90\x89\xcf\x7a\x0f\x04\xd8\x4b\xd7\x73\x46\x19\x11\x7b\xd1\x40\x2a\x76\x93\x7e\x00\xd0\x3f\xa8\x6c\x02\xab\x90\x27\x8b\x13\x45\xe4\x22\x62\x90\x02\x12\xab\xdb\xa9\x26\x85\xf3\x6c\xad\x63\xcc\x16\x96\x37\x0d\xd9\x8b\xb7\xd6\x9c\x7f\x3a\x2e\xde\x53\xeb\xb9\xa4\x03\xae\xc7\x3d\xe6\x11\xbb\xdc\xa7\x13\x7e\xdd\xb2\x22\x3a\xa6\x03\x42\xf7\x78\xcd\xc1\x7b\x1e\xf6\xf0\x75\x3a\x85\xbf\x3b\x7b\xa4\x54\x9a\xb8\xc7\xde\xf6\x58\x0b\x01\xf7\xe8\x98\xdf\xdf\x5b\x63\x3a\x41\xa9\x48\xa1\xb8\x33\xe0\x7b\x05\x87\x7c\x03\xa7\x5c\x8e\x48\xde\xcf\xe3\x03\xec\x67\xa0\xfb\xd9\xc3\xe1\xce\x12\xe8\x67\x71\x38\x07\x4d\xcc\x66\x56\x16\xef\xb1\x75\x91\x58\xcd\x90\x6a\xa2\xe6\x44\x7a\x32\xd0\x50\xd3\xbb\xf3\xd1\x55\x85\x12\x7e\x73\x69\x8d\x60\xcd\x15\x97\x15\xf2\xc4\x15\x27\x9e\x5b\xf5\xa6\xd3\xaa\x93\xf2\x04\x76\x05\xfa\x71\xeb\xfe\x79\xbb\xa4\xea\x52\x28\x1b\x66\x37\xef\x43\x58\xe6\xa9\x1b\x79\xba\x88\x62\x0c\x11\xaa\x76\xd1\xc7\x20\x7d\x31\x46\x37\x5e\xed\xd0\x50\x89\xaa\x56\x60\x11\x55\xa9\x81\xcf\xbb\x40\xd2\x49\xfb\xdc\x91\x3c\xd1\x36\xc5\xb1\x63\x55\x94\x5c\x99\x3b\xa5\xef\x11\xbb\xd9\x47\xaf\x98\x34\xe0\x61\x59\xba\x55\xaf\x12\xd0\xb0\xcc\x8f\xee\xdd\x5f\x81\x67\x29\x6b\x91\xfa\xca\xe7\x7b\xc4\x3a\x3d\x4b\xbf\xae\x0d\x70\x28\x81\xf4\x80\x48\xc7\x0e\x01\x4a\x0d\x78\xa2\x6c\x91\xef\x89\xbe\x6e\x2e\x50\xcd\x85\x65\x94\x27\x53\xe5\x27\x6a\x3f\xb5\xc2\xca\xdc\xea\x2c\x57\x47\xcd\x41\xed\xf4\x2c\x1f\xd1\xf5\x77\x91\x9d\xee\xbd\x67\x24\x13\x9a\x9d\xec\x38\x43\xcc\x8c\x68\xf8\x28\xff\xb9\xfa\xa1\x32\xeb\xee\xea\x1e\x9c\x8d\xf4\x7b\xa6\xcd\x1d\x9f\x1d\x5a\x64\xa5\x26\x8c\x7e\x1b\xf4\x31\xee\x8c\xc3\xee\xc7\xe1\xe3\x47\xd9\x17\xcf\x1f\x87\x77\xe1\xc7\x7e\xf8\x34\x0a\x07\x00\xd8\xf1\xdd\x20\x40\xef\x4e\x64\xe9\xc7\x29\x08\xbf\xce\x8e\x48\x91\xe0\x02\x3a\x9c\x0b\x76\x66\x91\x4a\xcd\xa9\x6e\x73\xe1\x88\x4a\x45\xe9\xa1\x08\xe2\xf8\xec\x1a\x70\xfe\xcc\x90\x50\xfe\x9c\x4f\xd3\x22\x9f\xa3\x75\xae\xa6\x53\xcb\xe7\x12\x35\x5e\x14\xbd\xe9\x1b\x9d\x6e\x31\x9d\x5a\x02\xb8\x42\x1f\x08\x60\x54\x86\x6d\xaa\x36\x0c\x0f\x56\xf6\x73\xc1\xaa\xb6\x0c\x2e\xd0\xe6\xb8\x3f\x67\xd3\xab\x78\x5d\x22\xd8\x0f\x1a\xf0\xf8\xd1\x12\x38\xb6\xa7\x26\xf5\xdd\x3e\x9a\x04\xc8\xe2\xba\x10\x07\xd4\x55\x98\xc7\xf5\x4c\x5c\x94\xc7\x3d\x9a\xb2\x71\xd1\x86\x8b\x59\x24\x48\x52\x50\x90\x06\x18\xa8\x40\x05\xeb\x0a\x02\x56\x32\xfd\x93\x8f\x6a\x50\x3b\x41\x5d\xd8\x96\x28\x6f\xae\x07\x64\xe3\xb3\x32\x63\x13\xf1\x53\xd4\x73\x09\xb0\x19\x1a\x03\x4e\x53\x03\x8f\xdc\x57\x8f\x46\x2c\xec\x4a\x65\xd8\x28\xec\x4a\x1a\xf3\xa8\x12\x38\x62\x75\x57\x76\x8b\x5d\xd9\x85\xae\xf4\xff\x9b\xae\x38\x21\x76\x25\xc4\xf3\xbf\xeb\x41\x8c\xd4\x5d\x09\xb3\xb7\xe9\x90\x0b\x3f\x1c\x9f\xed\xf2\x37\xd4\xf7\x0b\x68\x1f\x15\xf9\x22\xad\xee\x17\xd3\xe1\x63\xcf\x96\xd4\x7f\x1c\x0e\x1f\x1f\xec\xd0\x28\xfa\x85\x95\x39\xa5\xfb\xdf\x05\x9d\x9a\x02\xd5\x70\x56\xd8\x3e\x05\x2b\x99\xc5\x4d\xa5\x8e\xc6\x4f\xa3\x6a\x37\x90\x78\x44\x64\xcf\x7a\xeb\x89\xe1\x30\xec\x77\x6d\x61\x54\x5a\xa2\x81\x30\x84\x7c\x38\x10\x5c\xce\x86\xc2\x3a\x43\xe5\xcc\x79\x69\xc2\x86\x3e\x6f\x3f\xe7\x6c\xff\x0c\x24\x3b\x0f\x2c\x41\xca\xd6\x20\x2c\x5b\x9b\x3b\x4a\x17\x56\x90\xba\xa9\xdb\x36\x35\x13\x52\x54\x9b\xfb\xd4\xb2\x32\x05\x4b\x81\x9d\x6b\x88\xa1\x36\x71\x10\xa7\xd6\x61\x44\x66\x9f\x94\xa6\xc7\xbc\x7b\x4e\xed\xc9\x44\x68\xe7\x25\x71\x6c\x0b\x7e\xfb\xc8\x6e\x9b\xbb\x97\xff\xde\x6f\x9d\x9e\x16\xbd\x96\xfc\x8c\x6c\xc1\x3b\xbe\x28\xc6\x1d\x47\x85\x02\x67\xe7\x3f\xae\x0e\xff\xbd\xbb\xb7\x77\x59\xcc\x32\x82\x2c\x27\x8f\xee\xae\xf4\xd8\xaf\xc3\xf3\xcb\xab\x7f\x37\x76\xaf\x9a\x0b\xae\xa6\x56\xe4\xb8\x3a\x3a\x6b\xce\x8a\xd3\xed\x17\xa7\x9b\x0e\x3b\x0f\xe1\xef\xc7\x6e\x08\x84\xf1\xcc\x19\x0a\xeb\x53\x6b\x71\x8e\xcd\x7c\xb8\xe7\x01\x1e\xf0\xe5\x89\x36\x39\xe6\xe6\x52\xb4\xcd\x5c\xb6\x3e\x17\xee\xd9\x47\x4d\xa0\x2b\xd4\xfd\xee\x8d\x5a\xbc\x54\x3f\x28\x8d\x4f\x95\x1a\x6e\x6e\x53\xb8\x9d\x79\x2e\xfa\x9c\xf3\xc7\x22\xcf\x10\x64\x19\xe2\xd3\x62\x06\xd1\x86\x45\x4a\x57\x68\xd9\xa4\x13\x2e\x8a\x23\x28\x02\xc0\x1f\x73\x12\x33\x27\xe0\xbf\x2f\xad\xa7\x8e\xe5\x93\xba\x6f\x7f\x06\xa4\xe3\xfe\x6e\x59\x01\xcd\x74\xa8\x6b\x5b\x84\xde\xf7\x04\xfc\x23\x74\x21\x69\x93\xd0\xc3\x9e\x80\x7f\x8b\x49\xff\x22\x34\x78\x14\xf0\x6f\x31\xe5\x2b\xa1\xd7\x8f\x02\xfe\x11\xcf\x11\x30\x53\xc1\x8a\x31\xcb\x76\x06\x2f\x1d\x5f\x77\x71\x8b\xd4\xb7\xa0\x8b\x3e\x76\xd1\x9f\xef\xe2\x79\x44\xcf\x23\x6c\xcb\x9f\xef\xe0\x75\x44\xaf\x97\x12\xfe\x45\xa8\x78\x14\xf0\x6f\x31\xe5\x2b\xa1\x07\x11\x3d\x88\x4c\xe7\x96\xe6\x7b\xf0\xb0\x84\x0d\x0d\xd7\xbd\x77\x53\xd7\x47\x5d\x07\x89\xbd\x78\xf4\xd5\x48\xf4\x86\xd1\x27\xb5\xf5\xd9\xae\x7d\x2d\x08\x01\xa1\xcc\x79\x46\xbf\xb3\x51\x53\xbf\x16\x3d\xd5\x8a\x63\x93\x39\xc3\xb8\xe7\x4b\xb0\xe7\x69\x20\x8c\x00\x01\x06\x80\xa4\x83\xd9\x7a\x81\x7a\xc0\xe6\x98\x6d\x22\x55\x18\x00\xcf\xf9\x32\xe0\xd1\x9a\xb0\x3b\x30\x42\x03\x5d\x32\xa5\x93\xf8\x74\xee\x81\x56\x7c\xaa\x2f\x27\x84\x11\xe3\xa0\xf0\xa8\xa8\xa6\x2f\x08\xd9\x18\x37\x05\x29\xd7\x1c\xb9\x13\xd4\x2d\xc0\x25\x7a\xda\x65\x25\x20\xd4\xa0\xd7\x8d\x80\xac\xab\xb7\xf2\x59\x7a\x50\x91\x79\x3a\x60\x85\x80\xcc\x66\x5a\xf1\x2e\x7f\x03\xab\xc7\xbc\xe0\x27\xd3\xc4\x4a\xbc\x3e\x11\x3b\x3c\x64\xdd\x9f\xe4\x2d\xe0\xa1\xfb\xc3\x57\xd8\x5c\x79\xa1\x53\x57\xb2\xca\x5c\x8e\x99\x49\x05\x62\x89\x99\x30\xd4\xe3\xd1\xdf\x6c\xf0\xfa\xe0\x3f\xa6\x54\x66\x11\xa3\x41\xf8\x53\x48\xd9\xe9\xc6\xf5\x41\x68\x9f\x1b\x06\x2a\x9d\x28\xef\x32\xe7\x83\x7a\x50\x96\x65\x61\x8b\xb2\x2c\xe7\x9a\xdf\x7e\xfd\x2a\x2c\x07\x76\x50\x84\x2b\x61\x7b\xfe\xc5\x87\xe2\xde\x64\x41\xad\x53\xa3\x97\xa7\x17\x83\x41\x86\x23\xf3\xbc\xff\xdc\xe7\x05\xd9\xfa\xcf\x25\x45\x52\xd8\x60\xba\x81\xb5\x2a\xfc\x5f\x9d\xbb\x18\x8f\xda\x7f\xc8\x5f\x83\xff\x31\xff\xaf\x67\x2b\x6c\xaf\x56\x19\xcc\xf5\x27\x27\x08\x2e\x63\xff\xdd\xac\x7a\x60\x33\xe2\x60\x0e\xe6\xcb\xf7\x98\xf1\x73\x7f\xa6\xf3\xec\x3d\x2c\x83\xbc\x73\x7f\x4e\xb1\x30\x6e\x17\x34\xc3\xe5\xa9\x99\xb7\xe0\x14\xce\x43\xd5\x31\xb0\x4f\x27\x97\x75\x22\xec\x8f\xda\x36\x0f\x48\xc0\x6b\xf9\xd3\x34\xc9\x03\x37\x41\x99\x46\xc0\xab\xfa\x15\xbb\x74\x9f\xa4\x67\x75\xf7\x89\x53\xa9\xad\xf1\xb0\x1e\xf0\x44\x58\xd2\xbd\x0b\x3c\x2b\x2c\xd7\x08\xad\x55\x89\x1d\x22\x2f\xe0\x48\x9d\xb9\x15\xaa\xcc\x12\xf6\x57\x85\x87\x95\x5a\x45\x42\x95\xd9\x1e\xaf\x18\x9a\xf5\x3e\xcc\xc8\x82\x89\xe0\xd5\xd9\x35\x8f\x61\xdc\x4e\x43\xcc\xbf\xc7\xd0\x39\xca\xe5\x22\xac\x77\x8f\x3c\xa4\xdd\xaf\xd9\x45\xcc\x97\x33\x57\x2a\xcb\x99\x61\x7d\x56\x3d\xf4\x28\x68\xc8\x4d\xc4\xfa\xc2\x5c\x91\x75\xd3\x57\xfd\x22\xec\x3e\x04\xba\x66\x30\xd7\x47\x91\xb5\xab\x45\xc9\xa2\x62\x8a\x6f\xe8\xfa\xc8\xaa\xce\x7f\xe8\xbf\x5f\x0d\xbe\x02\xfc\x0f\xeb\xb9\x7e\xbf\x9a\xe6\x7f\x5e\x4b\x6e\x65\x63\x09\xd6\xa6\x39\xa8\x8d\xcd\x91\xcc\x35\x9e\x07\x92\x17\xdc\x43\x5f\xce\xdf\x55\xf9\xe6\x3e\x77\x5b\x19\x9d\x73\x2a\x95\xc0\x21\x9d\xc8\xfa\xa5\xf2\xb9\x41\xa5\x06\x9c\x6b\xf0\xe7\x77\x70\xbf\x16\xa5\xe7\x57\xba\x19\x1a\xea\xcf\x1c\xd2\x68\x30\xcc\x52\xc1\x3a\xbe\xe5\x93\x8a\xf9\x0c\x08\xd9\xb6\x64\x39\x9c\xf3\x4f\x7d\xb5\x78\xb7\x36\x90\x08\x30\xf3\x6b\x24\xc1\x46\x31\x0b\xc6\x56\x40\x05\x4b\x8b\x9e\x75\x5b\x79\xa7\xd0\xad\xa5\x60\xc3\x08\xbd\x62\x66\x81\xa5\x4e\x55\x8a\xe5\xef\xda\x8b\x32\x76\xd7\xd3\x2f\xf4\xfc\x05\xe8\x8e\x3e\x65\x90\xf5\xfb\x89\xfc\x81\x19\x12\xea\x15\xe9\x1e\x87\xa4\xe0\x9f\xbf\xc0\x96\x75\xda\xf3\xa6\x96\xf3\x27\x74\xae\xaf\x5e\xb0\x9d\xde\x03\xbb\xac\xe3\x02\x4f\x9f\x7e\xad\x58\xeb\x73\xa1\x9e\x9b\x12\xc7\xdf\xe6\x81\x43\x42\xe5\x19\x9f\x42\xc2\x13\x42\x8c\x9a\x32\x34\x85\xf6\x23\x91\xdb\x8f\xdb\x96\xdc\xa8\x55\x09\x81\xe3\x10\x10\xea\xaf\xf1\x10\x1f\x5d\xea\xb2\x05\xf3\x1c\x05\x7b\x67\xed\xa5\x4b\x82\x83\x13\xb3\xf1\x7a\x57\x66\xe3\x0d\x5b\x66\xe3\x1d\x7c\x36\xb8\xe0\xa5\xc9\x43\x47\xf0\xa4\x9d\x79\x0d\xf5\xb3\x00\x6c\x00\x5d\xc7\x84\x5b\x80\x82\x37\x74\x4d\xbd\x53\xae\xe3\xd7\x45\x25\x98\xdd\x23\xd8\xed\xf8\x7c\x85\xca\x50\x5e\xf3\xba\x2e\x52\xd1\x55\xcc\x1c\x55\x6e\x18\xcd\x83\x6b\xdb\x30\x12\xdc\xd2\x6a\xa8\x3d\x73\x00\x7b\x13\xaa\x7b\xad\x99\x8c\xaa\x2d\x34\x80\xbc\x63\x4d\x6a\x50\xf5\xc7\xa1\x62\x17\x6a\xb6\x09\xe6\xbc\x81\xca\xad\xc1\xd5\x4b\xb3\x5c\xa3\xb5\x0d\x53\xe7\x2c\xa3\xe5\x0a\xe6\xc9\xf4\x56\x33\x9d\x2a\xb6\x9d\xed\x50\xa0\x61\x7c\x62\x1a\x35\x78\x3b\x6b\x55\xeb\x55\xa9\xa6\x7d\x8a\x75\x54\x6a\x64\x03\x3e\x8a\x4c\x65\xba\x0a\xab\xcb\x61\xf6\x6e\xe9\xc4\xac\xe4\xf5\xae\x59\xc9\xab\x5d\xb3\x92\x27\x63\xae\x99\x34\x29\x05\x8f\x1c\x53\x98\xeb\xb2\x75\x4d\xe9\xc8\xe1\xc6\xa6\x1d\x69\x11\xaf\x94\x82\xd4\x43\xde\xbf\xb2\x6a\x74\x78\x65\xe9\xac\x15\x9d\x91\x90\x8d\x5a\xf3\xb3\x6d\x99\x92\x52\xa0\xcd\x65\x9d\x8a\x4f\xe1\x15\x8b\xad\x63\x28\x1c\x24\x6d\x99\xe5\x01\xf6\xd5\x8e\x36\xc4\xf3\xa0\x6d\xad\xdc\xc5\xc8\x7d\x15\xf6\xab\xee\xba\x16\x40\x35\x3a\x85\xb7\x15\x77\x31\x9c\x53\x5d\x01\x21\xc4\xf6\xb7\x79\xe5\xbd\xfa\x2a\x3e\xad\x08\x2a\x69\xf0\x5f\xd4\x48\x23\xbe\xb9\xae\x73\x55\x24\x0d\x0b\x21\x5d\xcd\x62\xfd\x11\x0d\xb3\xfa\x89\x2d\x76\x16\xfb\x63\x5a\x0b\xc8\x62\x79\x9d\x8f\xfa\xa6\x5b\xf4\x83\x2c\x54\xe5\x6f\xf3\xd5\x35\x49\xf2\xe7\x7e\x99\x7a\x2b\x22\xab\xb8\xd8\xc5\xc5\x69\xca\xbb\x51\xa5\xb5\x7c\xaa\xf4\x02\xab\xf9\xa9\x88\x85\xb9\x0b\xca\xe1\x06\x92\x2d\xeb\x08\x04\x08\xf5\x77\x78\x45\xd4\xff\x72\x84\xf9\x00\x61\x0b\xfd\xed\x41\x98\xbb\x89\x98\xcb\xed\x60\x76\xcd\x53\x24\x76\xae\xd9\x27\xff\x3d\x52\x50\x0e\x67\xce\x35\x0b\x83\xf7\xd2\xc7\x27\x90\xbe\xff\xf8\x5e\xfa\xf5\x2e\xa4\x47\xdd\xf7\xd2\xaf\x76\xf1\xd9\xe9\x02\xe0\x32\x8c\x4f\xe1\xcc\x91\xf9\x5e\x15\x6f\x53\x9e\xe3\x7a\xa5\x66\x67\x4a\x2c\x62\xdd\xdf\xd1\x63\x5f\xf7\xcd\xd4\x02\x22\x14\xc4\x16\xeb\xfe\x76\x9e\x56\x29\x24\xe6\x73\x2a\x88\x5d\xc5\x37\xb4\x2b\x81\xf0\x12\x2c\x50\x48\x55\x0f\xb6\xa2\x07\x45\x36\x36\x6d\xb1\x63\xf6\x61\x61\x47\x40\x1f\xb6\xb3\xad\x9e\x37\x3a\xbf\x69\x6c\x1d\x5d\x00\x68\x0f\xed\x8c\xa8\xba\x03\xae\xd3\xdd\xf3\x3d\xe3\x8f\xea\xd3\x09\xea\xf1\xcc\xd1\xb1\x0f\xff\x77\xe9\x58\x25\x7b\x44\xca\x53\x17\xdb\xd0\x5d\xcb\xd0\x6c\x5f\x03\xc5\xbb\x81\x70\x4d\xd5\x1a\x79\x7c\x3a\xf1\x94\x72\xce\xbb\x34\xad\xce\xb6\x3e\xba\x2a\x30\xc6\xd8\x17\x60\x83\x91\xa8\xc3\x2c\x17\xb1\x45\x76\x84\xb3\x92\xb8\x7c\x97\xd2\x35\x95\x0f\xff\x5c\xb9\x22\x34\xb6\xdf\xa9\xfd\xc3\xbb\x14\xf0\x9f\xfb\xfe\xb6\xa2\xf3\xc0\x3c\x57\xb2\x5c\xdb\x79\xe3\x15\x31\x77\x0e\xa0\xc0\xec\x4f\x64\x74\x77\x99\x9c\xb9\xcb\xcc\xd5\x9d\x6c\x1a\x34\x37\x78\x42\xf8\x71\x91\x99\x31\x37\xea\x0f\x67\x03\x4c\x78\x68\x5b\x6e\x8d\x6e\xd2\x2d\x8f\xcc\xba\x48\x69\x3c\x1f\xbe\x73\x53\x71\x52\xb3\x08\xf5\x4d\x69\xb4\xc1\x4e\x1c\xf9\xf8\x51\x5d\x5f\x00\xb3\x08\x44\x5b\xa7\x6d\xf9\x06\x74\xb1\x4f\xbe\x95\x01\x79\x16\x06\x16\xa1\x82\x50\x5d\xdd\x99\x1e\xb8\xa3\x6d\x05\x5c\x9a\x1b\xd5\xc1\x13\x2d\x90\x70\x77\xed\x42\xec\xcc\x51\x7d\x3c\xa9\xbd\xd3\xc7\xbb\x98\xed\x3f\x42\x37\xb3\x60\xd4\xc5\x4b\xe4\x56\xb1\xf6\x8a\x9e\x24\x20\xf0\xe5\x5c\x92\xa0\x9a\x9a\x3a\xd9\xd4\x62\x7a\xf1\x62\x49\x1a\x10\x23\xa0\x50\x07\xb9\x4a\x1c\xb9\xc3\x45\xa9\x24\xb7\xb9\x9f\x8b\x33\x14\xbc\x99\xcb\xb7\x5c\x5b\x80\x4e\xee\x8b\x6b\x7d\x36\x40\x0a\x78\xee\x39\xea\x63\x7b\x81\x49\x5a\x45\xab\xb6\x3f\x1b\x0a\xe7\x3e\x12\x86\xc4\x01\x32\xd4\xc4\x55\x74\x36\xb2\x61\xe9\xa2\x15\x5d\x19\x59\xa2\x51\x75\x82\x29\x32\xbb\xe6\x8f\x1a\x87\x2c\x80\x70\x4d\xa8\x2d\x93\x9d\xef\x83\x56\xb1\x4c\xd6\xfe\x09\xb5\xb4\x3f\xff\x19\xb5\xdc\x47\x68\xee\xe0\x7d\xdc\x76\x70\xf2\x67\xdc\xd6\xbb\x2a\x9a\x06\x2a\x8a\x39\x1e\xaf\xcc\x34\x37\x4f\xb4\xa3\x01\xe0\x34\xf4\x6b\xdf\x21\xd7\x53\xda\x3c\x51\x31\x49\x60\xde\x88\x0e\xaf\xf8\xf0\x4a\xcb\xe8\x7c\x83\x8e\x03\x2d\xaf\xee\x0c\xd7\x75\xa6\x02\x24\xcf\x95\xa1\xe6\xde\x01\x29\xe7\x06\x13\xb1\x21\x58\x67\x08\xdc\x5e\xad\xba\x8e\x11\x65\xc1\x9a\x27\x15\x7f\x1d\xe3\x37\x04\x7b\xbc\xc2\x07\x39\xb8\xfd\x6a\x45\x58\x8c\x56\xe4\xaf\x79\x0f\x97\x6f\x11\x9c\x9b\xf6\x0b\xc8\x2d\x31\x8f\x25\x83\x89\xa9\x45\xd3\xaf\x49\x50\x6f\x1b\xcd\x0c\xbb\xba\x63\xe2\x2a\x85\xc8\x19\x59\x8d\x8a\x92\xe0\xbf\x40\x45\x49\xb0\x12\x15\x7d\x58\x42\x1a\x05\xda\xa0\x79\x42\x83\x7c\xca\x85\x32\xe8\x68\x02\xdb\xb9\x44\x48\x4f\x3c\x99\x03\xaf\xb0\x6e\x3b\x02\x88\x0b\x95\x01\x1b\x74\xaa\xdb\x9a\x60\x4b\x82\x6c\xdd\x02\x2d\xde\x98\xd8\xd5\x1d\x61\x6e\xa9\x4d\x7a\xa0\x37\x34\xe4\xa3\x3e\xaf\x68\xe0\x6a\x30\x40\x2e\x04\x7d\xbc\x5a\x17\x1b\xc8\x40\x8c\x0a\x3d\xd6\xb0\x31\x09\xb4\x92\x60\x40\x2a\xfe\x7f\x28\xca\xf9\xdf\x9c\x88\x6d\x51\xff\x7f\x68\x1e\x14\x28\x7c\x6f\x22\x96\x50\xb1\x9e\x88\xff\x83\xe1\x2b\xf9\x91\xc8\xb6\x62\x36\x64\xdf\x0c\x39\xc3\xec\x88\xb0\x76\x32\x4c\x5d\xc0\xe4\x9a\x89\x03\xb4\xad\xa9\x7e\x95\xd9\xce\x67\x35\xc7\xeb\x99\x97\x9d\x9d\xc5\x56\x0b\x13\xe9\x67\x97\x04\x50\x66\x7b\x55\xa3\x73\xe4\x43\x3d\xcb\xbb\xd0\xa6\xca\x30\x5b\x58\x10\xff\x3f\x5e\x10\xbc\xcb\x37\x60\xef\xcf\xb2\xbd\xa7\x55\xbc\x79\x2e\xde\x1b\x48\x83\xb9\x46\xb1\xc1\x5c\xa9\x6f\x10\xd7\xef\x7b\xc3\x90\x3f\x3f\x8a\xbf\x43\xbf\x7c\x78\xfa\x33\x01\xf3\xfb\x7e\xa3\x56\x35\xa4\x01\x52\x33\xca\xa2\x7f\x0f\x48\x16\x01\xa1\x4e\xdb\xd2\x7c\x57\x2a\x0a\xc4\x4b\x2a\x14\xf1\xe2\x6b\xfd\x8c\xc0\x3d\xf6\xc8\x32\x7d\x12\x18\x4d\x30\xd4\x2b\x91\x3c\x70\x95\xa9\x8d\x2a\xe7\x3e\x72\x3e\x9f\xff\x50\x12\xa6\x01\x8a\x6c\x7a\xb3\x80\xcf\x2f\x88\xaf\x14\x59\x90\xd2\x08\xd6\x79\x86\x8e\x0c\xdd\xb0\xa1\xb2\xc9\x0a\xe0\x1d\xf9\x88\xce\xea\x0d\x8d\x85\x1b\xe2\xbf\x1f\xa7\x99\xa5\xc1\x13\x95\xdc\xf5\xe8\x9a\x55\xdb\xe1\x01\xfa\x7a\xd7\xef\x30\x09\x79\x43\x73\x20\xf8\xed\xe4\xca\xee\x35\x1a\x61\x46\x27\xdc\x8e\xd0\x8c\xc7\xaf\x13\x61\xf9\x14\xa7\x24\x70\x43\x8f\x4c\xa7\xba\x5c\x88\x6f\x78\xe5\x6c\x05\xfd\x17\xac\xa4\xff\x80\x40\xd2\x6b\xfc\x2e\x01\xa8\xe4\x96\xb5\xea\xba\x5e\xf1\x05\x8a\xb5\xa6\x29\xd6\x61\x91\x02\x35\x83\x5d\x2c\xbb\x6e\xf9\x95\x1a\xd9\xf0\x0d\x89\x9a\x0b\x59\xf5\x69\x7f\x7e\x14\x8b\x94\x9c\x3a\xe0\xf9\x89\xb8\x9e\x33\xaf\xf3\x3a\x31\xce\x0f\xea\xc2\xae\x39\xb5\xcd\x6d\x1d\x6d\x00\xaa\x1c\x0a\x43\x4d\xe7\x1c\xd7\xeb\x64\xa3\xb6\x99\xb1\xf8\xc1\x50\xa8\xfb\x17\x75\x7e\x1f\xe6\x95\x0f\xa0\x50\x15\xb0\xff\xb5\xb2\x4f\xf5\xce\xad\x84\x2e\xeb\x86\x81\x3a\xc1\x8b\x28\xbc\x30\xa3\x8f\x0f\x6e\x13\x67\x49\x98\xe7\xf5\xaf\x13\xd3\xb6\xfb\x5b\x2e\x5e\xf4\xff\x11\xcf\xeb\x12\x73\xf5\x56\x74\x9d\x2b\x6a\x59\x41\x00\x98\xa2\x5a\xc3\xa0\xb6\x38\x81\x2b\x5b\x98\x0f\x96\x6b\x9b\x15\x33\x93\xe4\x7f\x74\xf9\xff\xa9\x6d\x12\x3a\xb7\x1e\xc2\x48\x02\x45\xb6\x10\x8f\x0f\xee\x19\xf0\xe6\xfa\xb8\x3c\x3e\xb0\x41\x38\x6c\x5d\x7d\xdf\x1f\xa5\xe9\x6d\x28\xfa\x08\x3a\x9d\xf9\x34\x58\x19\xd8\x76\xf3\xb1\x87\x8f\xa3\xfe\xc0\xaa\x52\xfc\xef\x3f\x63\x69\x8b\x79\x90\xf7\xda\x5e\x8d\x67\x56\xdd\xd8\x2c\x95\x45\x1c\xf0\xdf\x60\x92\x22\x94\xbf\xc9\x6d\x69\x6a\x91\xc4\x8d\xda\x6c\xff\xb7\xef\xd6\x94\x44\xf6\x2e\xbb\x22\x7d\x5f\xc6\x70\xf5\xce\x2e\x7d\x57\x70\x30\x7a\xaf\xc4\x3b\x04\x88\x81\xd8\x82\x00\x7c\xf5\x37\x6a\xd5\x8c\xd2\x47\x0c\xca\xbe\x7c\xfe\xb2\xf9\xaf\x2f\x5f\xbe\xd5\xfe\x55\xfd\xbc\xb9\x55\xfb\xb6\xae\x04\xe2\xa2\x12\x6c\xfb\x15\x51\x0f\x6c\x9f\xfc\x19\xb7\xde\x6a\x33\x2f\x5a\xf6\x19\x24\xdc\xad\x35\x3f\xd3\xad\xe6\x67\x5a\x6b\x7e\xa1\x35\xf8\xf8\xdc\xfc\x42\xbf\x36\xbf\xd0\xcf\xcd\x2d\xfa\xb5\xb9\x45\xff\xd5\xdc\xa2\xb5\x6f\xcd\x2d\xfa\x19\x42\xb5\x2a\x7c\x6e\xd6\xe0\xfb\xcb\xe7\xcd\xe6\x16\xfd\xf6\xf5\x0b\xe4\xac\x7e\xc1\x84\xaf\x9b\xff\xfa\xe7\x97\xaf\xcd\xcf\xf4\x9f\xdf\xbe\xfd\x6b\xf3\xf3\x37\xa8\xb0\xb6\xb5\xf5\xf5\x5f\x5b\x9b\xcd\xcf\xfa\x09\x48\x10\x2d\xa2\x5d\x23\x3f\x35\x1d\xc2\xf6\xbf\xfe\x9f\x54\x7e\x73\x62\x0c\xf6\xdc\x5f\x69\xb2\x28\xca\xc4\xd3\x41\x82\x08\x47\xe1\x84\x4d\x93\x8c\xbb\x55\x2b\x68\x3c\xe9\x93\x3b\xd8\x2c\x6b\x46\x58\x73\xbd\x83\x4d\x62\xac\xb5\xdd\x36\xb8\xa9\xcd\xfc\x2a\xcb\x58\x85\xe6\xcc\xa1\x0d\xa4\xae\xf0\xb6\xb1\x6e\x92\x95\xe4\x42\x91\x6a\x4f\x59\xb2\x6e\x2f\x90\x9a\x4b\xbc\x6d\x40\x83\x7d\x7d\xb9\xb3\x59\x7c\x2a\xd6\xcf\xf4\x91\x86\x9b\xbc\xc6\x01\xa2\x7f\xe1\xdc\x77\x36\x39\xf7\xeb\x02\xcf\x95\xfd\x39\xfb\x16\xa6\x83\x76\x4d\xc5\x0d\xef\x79\xcd\xfe\xa2\x48\x02\x0c\x09\x68\x6c\x76\xcd\x6f\xff\x1a\xec\x0f\x37\xd5\x01\x1f\xde\x67\xc3\x39\x32\x10\x24\x9b\x90\x09\x2a\x66\x2f\x1d\xa8\x4e\x64\x89\x6d\x3d\xa9\x86\x8e\x31\xe3\xab\x11\xb3\x8a\x5a\x36\xa4\x14\x45\xcc\x94\x2c\x66\xff\x62\x6c\xc2\xe4\xdd\x40\x6e\x5b\x47\x2a\x9a\x22\x9f\xbb\xec\x9e\xa4\xd0\x43\x87\xac\x84\x30\x90\xa5\x52\x29\x0c\x63\x99\x7d\xc2\x71\x98\x6d\xf2\x87\x81\xbc\xfa\xf9\x48\xcc\x92\xfe\xf5\x38\xb0\xd4\xea\x81\x7c\x26\x8e\x69\x78\xd5\x40\xe6\xa1\x1f\x64\x29\x97\x0b\x03\x59\x02\x3e\xf9\x7a\xc4\x4f\x4b\x33\x5c\x18\x47\x73\x71\x41\x3a\xcb\xd9\x57\x0c\xa4\xf9\xa7\x71\x68\x19\xc1\x04\x30\xc9\xf6\x9f\x46\xb4\x90\x56\xae\x79\x15\xb1\x6d\x24\x29\x85\x32\xda\x8c\xd2\xaa\xe5\x2c\x2e\xe6\x4a\x2c\x33\xdc\x34\x70\x51\x1f\x4e\x6a\x4c\xf3\x0e\xef\x75\xbd\x7a\x9f\xeb\xe8\xfb\xab\x52\x29\xdf\x5d\x06\x88\x41\xdb\xb9\x15\xb7\x1c\x34\x94\x4a\xd6\xe2\x34\x19\x20\x41\xe7\x9a\x5d\x0d\xc4\x57\xe2\xba\x42\x97\x15\x95\xae\xbb\xcb\x0d\x38\x29\x95\xcc\x18\x74\xd7\xf3\x1e\x7f\x2e\xf4\xb8\x52\xa1\x15\x93\x11\x16\xc3\x5a\xbd\xfe\xe6\xd4\xd2\x62\x9b\xab\xba\x9b\xa3\x9c\x41\x5b\x99\x85\xc1\x4b\x77\xc0\x3f\x6b\x55\x42\xf4\x5e\xd2\xc5\x32\xb8\xbe\x23\xea\x0a\xd4\x73\x2e\xea\x46\x20\x4c\x3f\x7f\xd9\xfa\xda\xdc\x52\x2a\x7c\x28\x21\xc6\x2f\x20\x8a\xb5\x96\x5a\x56\x7e\xce\x0d\xe4\xef\xdc\xf5\x53\x17\xbe\xcc\x56\x0d\x5f\x84\x66\xb1\x32\xa2\xd7\x37\xa4\xa0\xe0\xe7\xe5\x61\xdb\xf2\x15\x89\xa6\x94\x8d\xe8\x17\x63\xee\xc3\xd7\x44\xac\xe4\xbe\xfb\x43\xc2\x57\xc8\x6b\x6b\x5c\xd2\x88\xfb\x6e\x27\x54\x0f\x71\x7c\xf7\x0e\xbf\x12\xee\xb3\x18\xe9\xb4\x5f\x61\xf0\xd8\x95\x03\xe4\x11\x4c\xdc\x59\x27\x4d\x3b\x83\x2c\x21\xe5\xd5\x35\x1e\x21\x5f\x14\xe3\xdf\x04\xff\xfa\x5a\x93\x2f\x98\x4e\xc3\xe9\x34\x25\x40\x3d\x5f\x85\xd0\x43\x2b\x28\xd7\x4c\xff\x36\xd5\x53\x63\xcc\x50\xe6\x57\x21\x15\x65\x3e\x6c\x5b\x32\x4f\x4e\x01\xc2\x97\xf9\x75\xa4\x93\xa2\x2c\x09\x22\x42\x13\x1d\xaf\x8e\x4e\xe6\xa2\x5b\xa6\x7e\x5f\x47\x7f\x26\x05\xfb\x3d\xf9\xf4\x8f\xda\x45\x9d\x95\x73\x2a\xf3\xe9\x96\x66\xba\x8d\x0a\x97\x9a\xd6\x88\x4b\x3d\xad\x31\x97\x7a\x3e\x13\x2e\xf5\x7c\xa6\x5c\x2e\xcd\x67\x37\x8b\x5b\x98\xcf\x80\x07\x65\x9c\x82\x85\x75\x54\xba\x25\x71\x6c\xf6\x42\xe0\x40\x4e\x3d\xa5\xe1\xe2\x94\xfa\x9c\x1f\x47\x85\xac\x30\xb9\xf0\x77\x6e\x06\x75\xc6\xd1\x7c\xc6\xeb\x48\x67\xcc\xe7\x14\x22\x42\x13\x9d\xac\x8e\x4e\xe7\xa2\x5b\x61\x66\x61\x14\x53\xbb\xd9\x8c\x17\x8c\x5c\x2f\x29\xe8\x28\xaf\x6c\xdb\x3e\x5a\xf1\x14\xfc\x26\x2c\x8b\x55\xeb\x33\x6e\x1b\xd8\xcf\x79\xf8\x22\x8c\x3f\x05\x31\x9d\x0a\xce\xcf\xcd\x60\x3a\xe6\xac\x18\x2b\xac\x35\x1a\xf2\x2a\x8d\x78\x95\xc6\xbc\x8a\xe6\x33\x7c\x9e\x08\x4b\xa0\xc6\x5d\x15\x00\x5b\xad\x4a\x9c\x2f\xda\x52\x80\x15\xe4\x89\x5b\xb0\x81\x6a\x55\x52\xa9\xd1\x7f\x9a\x64\x99\x27\x7f\xd3\xc9\xb4\x56\x35\xa9\x61\x9e\x5a\xab\x99\xe4\xa8\x10\xf9\xc5\x44\xc6\x85\xc8\x7f\x9a\xc8\x24\x8f\xdc\xac\xd2\xcf\x18\x59\x00\x56\xb0\x15\x59\xeb\xea\xbb\x95\xc9\x9a\x68\x4c\x93\xa2\x25\x5a\x3d\xb5\x68\x5b\xff\xd5\xe3\x5c\x28\xd7\x7c\xd5\x82\xc5\x6f\xa1\x41\x83\x85\x69\x15\xc8\x47\xd6\x7d\x2a\x1d\xc9\xe1\xdb\x91\xbc\xba\x23\xeb\x95\x4f\x27\xc2\xaa\x48\x1a\x10\x5b\x9c\x0a\xbc\x0b\x32\x4e\x78\xf0\xbd\x46\xc0\xab\x3b\x61\xbd\x02\x69\x95\x10\x72\x7d\xd2\xe6\xac\x8a\x9a\xc8\x3f\x1f\xb0\x60\x61\x09\x21\xbf\xe9\x61\x95\xe7\xee\x8d\xaa\x45\xbb\xea\x54\xa2\x75\xd5\x8e\x70\xaa\xdb\x81\x63\x9c\xb8\x0c\xaf\xac\x00\xa6\x0d\x59\x8e\x08\xa1\xd5\xa9\xb0\x94\xd1\x82\xad\xed\x04\x27\x7f\x6b\x3d\x2e\x4b\x1a\xf2\x97\x36\x5a\xb0\xa2\xe1\x36\x30\x7c\xe1\x8e\xa8\xf8\x44\x19\xf3\x73\x42\x9e\x40\x26\x27\xcb\xa4\x8c\x1e\xe4\xf9\x54\xb6\x08\xb2\x39\xb2\xcc\x23\x27\xa8\xf0\x68\x96\x69\x56\xe5\x4f\x21\x4e\xfe\xff\x19\xca\xce\xfb\x43\x29\xfb\xd0\x49\x2e\xfe\x72\x2c\x59\x46\x93\xcf\x4a\xca\x35\xf2\x1f\xe5\x7d\x77\xe0\xf9\x22\xbe\xcc\xc1\x49\x1c\x44\x7e\x01\x34\xf7\x18\x07\xb5\xad\x0b\xcf\x15\x4e\xc5\x9c\xec\x1a\x6f\x4e\xb1\xbc\x4f\x1c\xb1\x81\x6e\xe4\x54\x4d\xfa\xad\x54\x45\x10\x07\x90\x4a\xa9\x54\x6b\x56\x6a\xd5\x1d\x75\xe9\xa8\x13\x0b\x6d\x21\xe1\x5d\xc0\xe0\xc1\xe9\x9c\xd5\x7b\x38\x25\x34\xcd\x0c\xdc\x66\x82\xd9\xd6\xa7\xec\x4a\xf1\x93\x11\xcc\x8e\x62\x23\x98\x95\xb1\x91\xc6\xa6\x99\xce\x54\xfb\x82\xc7\x99\x00\x37\xd1\xb7\xce\xff\xe6\x5a\x29\xfe\xe9\x41\xf0\xc3\xc7\xcc\xb3\xf1\xcd\x05\x84\x8c\xe4\x56\xc6\x2c\x4e\xb5\xfa\xfe\xa7\xc2\x99\x95\xa7\x4b\x26\x0c\x8c\x8e\x25\xbe\x51\x37\x5a\x96\x8e\xe4\x96\x2c\x07\xc8\x5a\xa9\x71\x47\x6d\xcb\xa8\x44\x4a\x42\x25\x15\x4c\xc6\x5a\xcb\xb2\x38\x19\xaf\xed\xf9\xb9\x58\x92\x4f\x3f\x25\xcb\xf2\x69\x99\x4d\x43\xfb\x22\x9b\x06\xdf\x4c\xc3\xc9\xbf\xcd\x34\xdc\x7c\xe2\xee\x44\x13\x5e\xa3\x08\x68\xaf\x42\xe8\x9f\x79\xe8\x78\x2e\xed\x38\x02\x88\x57\x08\x7d\xce\x43\x3f\x17\x73\x7e\xcd\x43\x71\x5c\x4c\x8b\xe3\x62\x2d\x71\x4c\xb7\xe6\x73\x56\xe7\xb3\xce\x07\xb7\xaa\x0b\x99\x17\xc2\xcd\xcf\x0b\xe1\x2f\x0b\xe1\x7f\x92\x82\xd1\xb9\xc9\x2a\xbd\x77\xdc\x85\xec\x29\xc1\xc9\x17\x6c\x14\xe3\x0a\xa1\x96\x29\x15\xac\x7d\x81\x9a\xaf\x54\xb0\x93\x7f\x93\xd9\x87\xd7\x15\x42\xfc\xdc\xb2\xec\xa1\x76\xb4\xf7\x94\x10\x6d\x5a\x56\xcf\xbe\x71\x7d\x51\x7c\x4e\x71\xf3\x49\xab\xa0\x8a\x6d\x1e\xb0\x9b\x0b\xf2\x36\xb4\x8d\x36\x3a\x0d\xb9\xcc\xa4\xdf\x91\xfa\x0e\x03\x8b\x38\x52\x6f\x50\x09\x07\x44\x01\x07\xce\x23\x12\x70\x37\x02\x78\xa1\x65\xed\x90\x7d\xff\xd1\x22\x15\xfc\x8a\xba\x16\x5a\xb9\x91\x66\xe3\x85\x84\x78\xb9\xf2\x7b\x4c\x03\x9e\x25\x45\xc4\x51\x3a\x5d\x61\xdb\x8a\x68\x56\xbc\xf0\x8a\xa0\xd0\x85\xd6\xa7\xa2\xa9\xed\x1a\xe7\x92\xb5\x3f\x95\x4a\x92\xdd\x5c\xec\x48\x38\x66\x34\xe5\x83\xb6\x05\xe1\x75\x48\x02\xba\x4a\x87\x81\x92\x72\x3d\xda\xe3\x1d\x41\x07\x3c\x45\xa6\x14\x1d\xa6\x77\xf5\xa7\x13\x6e\xf3\xc8\x81\xb0\xe2\x5c\xb4\xb1\x2c\x99\xe9\xfe\xea\xb1\x0f\x8c\x8d\x99\x54\x73\x56\x63\x2e\xe9\x84\xf7\xe8\x1e\x0f\x69\x83\x8f\xb5\xfe\xf2\xd8\x0c\x70\x42\xe8\x98\xa5\x3e\xa1\x3f\x96\xd3\xf6\x74\x5a\x7e\x47\x37\xd6\xcd\x4d\x48\xe5\x83\xf9\xde\x23\xa4\x62\x35\xca\x3f\xc8\xc6\xe6\xf6\x98\xb5\x2f\xc8\x5b\x30\xef\x59\x2b\xa9\x5b\x91\xb0\x7a\x64\x3a\x45\xa5\x65\x89\x88\xb9\x47\x43\x42\x28\x46\xe8\xe9\x0d\xe9\x28\x9b\x56\xf4\x22\x0c\x5c\x53\x8f\x2b\x1d\xe7\xd1\xdc\x6a\xa9\x72\x3d\x42\x9c\x1e\x0f\xd5\x05\xdd\x52\x4d\xb5\x62\x4d\xb3\xa4\x54\x8a\xb6\x43\x74\x66\x23\xd1\x6f\x59\xc8\xbb\xb4\xcb\xd3\x7c\x9d\x61\xda\xf5\x04\x74\x69\x8a\x53\xd2\xe3\x21\x32\x59\x34\xe4\xa1\x62\xfa\x42\x9e\xe6\xca\xd6\xbd\x2c\xd0\x03\xaa\xd9\x04\x22\x48\xb1\xc2\x72\x0f\xf6\x58\x5a\xe9\xed\x0c\x36\x36\x4b\x25\xe5\xb9\x0a\x36\x51\x8f\x76\x89\xba\xf7\x94\x70\x86\xde\x22\x2e\x9d\x2e\x8f\x9d\x94\x07\x4e\xa2\x1d\x33\x3b\x1d\x1b\x8f\x51\xc2\x53\x65\x18\xaa\xba\xcd\x13\x27\xa9\x54\x48\xe6\xde\x2c\x75\x13\x8f\xf9\x12\xb6\x42\x82\x01\x3d\xdf\x9d\x99\xf2\x74\x32\x53\xd9\x12\x1c\x73\xa4\x47\x96\x60\x09\x1a\xe1\xf0\x06\x59\x74\xb7\x18\xad\x56\x3a\x51\xf6\x0c\x2a\x5d\xf5\x4b\x2a\x56\x5a\x1e\x90\x8d\x0f\x9b\xdb\x11\x6b\x5f\x94\x4a\x09\xdb\x7b\xb0\xd4\xe4\x2a\x5d\xf4\x98\xcc\x00\x0c\x43\xaf\xbb\x3c\x42\x93\x75\xb1\x31\x59\xa7\x5d\xd0\xb9\x5d\xd5\xe3\x52\x29\x2a\x97\xd5\xe5\x1c\x1c\x55\x89\x7e\xae\xf4\x42\x04\xe6\x98\x2b\x6f\xec\xc5\x58\x38\xf0\xc0\x13\x4a\xe0\x23\x62\x65\x60\x31\xd2\x98\x37\xc8\x8e\x78\x90\x1d\x71\x1a\xc0\xf0\x1e\x7c\x4b\x92\x9d\xa8\xfc\xa5\x3a\x9d\xc6\x7a\x11\x3a\x82\x66\x05\xca\x59\x01\x00\x09\x28\x10\x8e\x15\x30\xe8\xd8\x6f\x92\x07\xca\xad\xcb\xe6\x8e\x44\xdb\x1d\x30\x3c\x60\x9a\xaa\xd0\x74\xcd\x89\x94\x21\xc7\x08\x40\x59\x97\x4b\xed\x86\x7f\x4b\x3f\x4c\xd5\x73\x57\x89\xf5\x1c\x96\x4a\xb1\xbe\xd3\x45\x97\x74\x84\xbc\x49\xbe\x56\xcd\xd6\x2d\xe6\xdd\x99\xe4\x6b\xb5\x19\x6c\x0d\x48\xd3\x4a\xf7\xca\x52\x19\x5e\xd3\xc5\x68\x69\x3f\x70\x63\x8f\x46\x6c\x38\x2a\x95\xd6\x22\xf6\xf4\xa2\x2f\xe9\x22\x75\x43\x37\x9b\xcd\xb2\x4d\x92\x99\x07\x0f\x8c\xc1\xfd\x39\x97\x84\xbb\xed\x65\x7a\x83\x76\x69\x8f\xbc\x85\xca\x2b\x18\x55\xab\xa3\xa0\x4b\xd1\x01\x4f\xac\xb5\xe7\x37\xcb\x01\xed\xf1\x9e\x7e\x56\x46\x5d\x7c\x49\x15\xd3\x1e\xf1\x1c\x01\x10\x30\x42\xe9\x42\x41\x3f\x0a\x45\x0a\x05\xad\x70\xc0\xec\xca\x72\x0a\x2c\x3a\x92\xfe\xb0\xcc\xbe\x79\x8e\x14\x64\xa6\xbf\x50\x55\x4c\x2f\xad\x23\x33\x13\xbc\x73\xd1\x66\x3b\xe8\x07\x17\xc4\x09\x8b\x11\x92\xe8\x67\xec\xe2\xc5\x8a\x68\xa8\x58\x83\x01\xaf\xd2\x11\x17\x5a\x51\xac\x13\x59\xc1\xce\x68\x3a\x1d\xed\x48\x32\x30\x0f\xbf\x21\x6b\xa0\xb2\x0c\xa0\x06\x43\xe7\xf8\x3c\x04\x02\x98\x0a\xb2\x01\x1f\x7e\x6e\xe9\xcd\x62\x5f\xb7\xb6\x7d\x1c\x3b\xaa\xfe\xf5\x68\x17\x69\x39\x1c\xfd\x53\x21\x86\xc6\x84\xb0\xe7\x43\xab\x40\x59\x85\xa7\xf3\x8f\x66\x94\xca\x2c\x1a\x16\x81\xaf\x72\xad\xba\xf0\x90\x44\xce\xfb\x46\xd8\x2b\x6a\x48\x25\xa3\x8c\x5e\xba\x1f\x09\xee\xcf\xf6\x10\x61\x3f\xac\x56\xfc\x72\x8f\xbd\x75\x53\x0c\x5d\x93\xec\xfd\xe9\x0d\xdb\xfd\x48\xcc\x88\xa3\x2a\x0c\xc6\x0b\x8e\xec\xcc\x8b\x01\xce\xaf\x62\x25\xc1\x7e\x40\xad\x5b\x94\x5c\x9d\x4f\x16\x28\xdf\xef\xc5\x3e\xb7\x5f\x4c\x97\x0f\xa1\xc7\xdf\xff\xd0\x63\x9d\xdf\x12\x45\x93\x57\xd8\xf3\xef\xed\xc5\xa7\x9d\xef\x17\xd9\xf5\x66\xc4\xf9\xfe\xbf\x31\x8e\xe8\x54\xac\xd0\xa9\xf8\xf9\x6f\x33\xa0\xdb\x0b\x43\xb3\x66\x2f\xa6\xae\xbf\x19\x92\xf5\x2e\x11\xfc\x67\xd7\x0a\xa8\xb4\xee\xc6\xd9\x0b\xcc\xfb\x3c\xf6\x3e\x8f\xed\xe4\xb1\x9d\x3c\x36\xce\x63\xe3\x3c\x36\xca\x63\xc3\x3c\xf6\xfc\xab\x89\x8c\xf2\xc8\x51\x37\xcb\xda\xcd\x63\xdb\xdf\xf8\x91\x8a\x94\x79\xe4\x6b\x64\x08\xec\xcb\xc3\xe2\xe3\xcb\xf8\x54\xac\xb4\x23\x00\x53\x73\x77\x2a\x68\xe7\x54\xd0\xcc\x9e\xc0\x87\xe8\x14\x1d\xf6\x89\x8e\x58\xe1\xad\x0f\x26\xd0\xe7\xf7\xa7\xda\x46\xbe\x22\x55\x1d\xc1\x13\xf3\xd6\x43\xeb\xae\x5e\x7f\xb3\x1e\xc7\xa2\xec\xb3\xb4\x87\xba\x17\x69\xcb\x85\x6f\x00\x41\x89\x29\xfc\xb6\x1f\xdb\x3e\xdb\x8f\xe9\x2d\xfc\xde\xc6\xf4\xe4\x9b\x0d\x99\xe8\xf1\x37\x3b\xa0\x87\xdf\xec\x87\x96\x1b\x78\xf4\xe8\x9b\x2d\x00\x98\xd1\xe6\xad\x2d\xdc\x03\xdf\xa3\x8d\x6f\xb6\x59\x1d\xba\x37\xb4\x43\xb6\x37\xa4\x23\x69\x87\x6c\x24\x69\x53\xa7\x45\x89\xa0\x8d\x5b\xdb\xf5\xe8\xf7\x6f\x76\x75\x06\x60\x4d\x79\x2c\x16\x28\xc4\xe0\x82\x1d\x89\x5c\x97\xe4\xed\x48\x40\xd6\xb3\x8e\x0d\xc0\x18\xd1\x8b\x9e\x66\x94\x21\x0b\xf7\x7e\xe2\xa1\x13\x3c\x74\x52\xda\xd0\xd4\x3b\x36\x58\x5b\x53\xc9\xf5\xaa\x5d\xa3\x50\x2b\x15\x2c\xfe\x99\xbf\x50\xc6\x2a\xb6\x31\x8b\x12\xa7\xb0\xf6\xbd\xd8\xc0\xf0\xb6\xd9\x21\x04\x11\x0b\x02\x57\xa0\x6b\xf6\x86\x8e\xf6\x76\x83\xab\xd4\xb2\xb0\xb3\x55\x8f\x0d\x05\x35\x82\x44\x0b\x66\xac\xac\x17\x9b\x50\x33\xbf\xb4\x46\x0a\xee\x16\xaa\x8e\xcf\x26\x2f\xdb\x3e\x93\x7b\x8e\xf1\xb3\x18\xff\x8f\xee\x8b\x22\x89\x7d\x4d\x93\x7e\x48\xb9\xb4\x12\xa5\xcf\xa0\xc9\x87\xb7\xa1\xb0\x13\x7a\x63\xa7\xe8\x34\x53\x1b\x76\xcf\x2c\xd4\x6c\xcd\xc8\x2c\x2e\x97\x67\x92\x07\x33\xc1\xa3\x7b\xec\x24\x6c\x20\x65\x84\x1b\x27\xd8\xc9\x67\x57\xc0\xe4\x46\xb3\x59\x50\x41\xe7\x6b\xc9\xff\xc7\xdb\x9b\x3f\x35\xae\x63\x0d\xa0\xbf\xf3\x57\xc0\xfd\xf8\x5c\x56\x47\x71\x27\xcc\xdc\x3b\x33\x36\xea\x14\x21\x04\x48\xb3\x74\xb3\x04\xba\x5d\xae\x57\xb2\x2d\x9b\x60\x63\x4c\x9c\x04\x08\xc9\xff\xfe\xea\x1c\x49\xb6\x13\xe8\x9e\x99\xaf\x5e\xbd\x99\xdb\xc4\xd6\x66\x2d\x47\x67\x91\xce\x02\x4b\xeb\x24\x1f\xc1\x8d\xff\xc2\x1b\xe8\x9b\xf7\xf7\x90\x12\xbf\x07\x93\x44\x83\x49\xb2\x02\x26\xf7\x1a\x4c\x7e\x9c\x48\x30\xb9\xeb\x97\x60\x72\xfe\x17\x40\x09\x76\x7d\x5f\x25\x8d\x12\x5e\x81\x8b\x3c\x18\x2c\xcf\x37\xc3\xd5\xb5\xdf\xa9\x2d\x38\xc5\x51\xc2\xeb\xe9\xc8\x0e\x97\xce\x5a\xd1\x15\xd8\x10\xb5\xbc\xbb\x3e\x6d\xd3\x08\xf2\x22\x2b\xfe\x46\x43\xd8\x4d\xd1\xbd\x19\xc9\xd2\xc7\x1c\x26\x22\xba\xc7\x10\xdb\x1f\x4c\x67\xcd\x06\xff\xbe\xbe\xcb\xe5\x09\x9b\xbc\x39\x6f\xff\xf9\x09\x9d\xc7\x10\xc7\x6f\x32\x3c\xc4\x15\x4e\x70\x6d\x86\x34\x85\x7d\x6f\xfd\xf8\x0e\x9f\x0c\xae\x4d\xe9\x61\x86\x03\xc6\xf9\x0c\x23\xfb\xf6\xff\xa8\x5c\x79\xd6\xf4\x80\x67\x2e\x0e\x67\x3f\x46\xe6\xc3\xf5\x47\x78\xfc\xf1\xde\xe4\x34\xaa\x9c\x08\xe0\xb2\xc1\x9a\x05\x34\xcd\xed\x04\x63\xdb\xd7\x4e\x7f\x92\x93\x0f\xbd\x7d\x5e\x8d\x4c\xdf\x3a\xfe\xe7\x87\x9e\xc1\xd7\x9d\x6a\x2c\xc9\x12\x84\xcf\x96\x13\xed\xfa\xd6\xc1\x0f\x19\x24\x25\x22\x2a\xac\x1f\x26\x45\xd2\xd1\x71\xca\x1e\x06\xdc\xf4\xad\xa3\x7f\xd2\x18\x44\x83\x9f\x57\x66\x6d\x2b\xf5\xe3\x06\x97\xfb\x88\x38\xbe\xf5\xf5\x9f\x8c\x31\x31\xe1\xc8\xa7\xdf\x0f\xb8\x99\xd6\xc2\x35\x66\x7a\x53\xa6\x6b\x7b\x51\x36\xe0\x5b\x03\xf5\x05\x94\x1d\xb7\x5a\xb4\x60\x01\x7e\x81\xd0\x29\x6b\xb6\x9d\x0c\x76\x64\x26\x77\xa4\x74\x0b\xae\xe4\x47\x3a\x67\x81\x39\x93\x3b\xb0\x89\x8d\x39\xcd\x36\x63\x53\xc3\x98\x7f\x61\x85\x61\x98\x53\x26\x9d\x4c\xa9\xc8\xca\xd6\xde\xa3\x49\xaa\xd8\xca\x5d\xf2\xd6\x65\x81\xd9\x5d\x69\x60\x14\x99\xdd\xdd\x79\xa3\xad\x8e\xe4\xe0\xb5\x39\xdf\xf5\xad\xde\x3f\xc9\x5b\x5e\xc6\x58\x59\x62\x88\x95\x2e\xbc\x27\x90\xf9\x43\xc6\x03\x90\xf1\x93\xf1\x3d\xf1\x2a\x81\xb3\x67\xdd\x36\xe7\x64\xd7\xb7\xf6\xff\x09\x9f\xd4\xdc\x32\x70\xb8\x3d\xeb\xf6\xcb\x1c\x84\x1f\x1d\xf3\x30\xc1\xc8\xa7\x98\x9d\x34\x1a\xcb\xee\x62\xb1\x91\x6a\xd4\x32\xa3\xb7\xf6\xbc\x8e\x5a\x7c\xc0\xe3\x0a\xbb\xa0\xb8\x84\x41\x85\x73\xf2\xd6\xde\x9d\xca\xa5\xb8\x37\x53\x3a\x6d\xb6\x31\x4e\x4b\x5e\xf9\x5d\x90\x7e\x8c\x85\x5c\xfd\x82\xbc\x4d\x99\x70\x0b\xcf\x99\x41\xdf\xe6\x9a\x65\x97\x2e\xbb\x53\x59\x28\x93\xa3\xeb\xb2\xd4\xcd\x3c\xda\x63\x53\xeb\x3c\x30\xbb\xd6\x84\x83\xd0\x1d\x9a\x3d\xea\x5b\xd3\x10\x9e\xb9\xf5\x1a\x75\xce\xdc\x3d\xcf\x3e\x53\xf1\xa7\xb3\x46\x1b\x5b\x31\x8c\xd4\xcd\x1a\x6d\xcf\xba\x6d\x76\xad\x5b\x00\xbf\x7f\x36\xce\xc8\xdb\xac\x9a\xd5\x79\xe5\xe9\xab\x27\x43\x27\x9f\xc9\x21\xcd\x80\x94\xa0\x9f\xb4\xb7\x9c\x15\x4e\xc2\xe6\x7a\x1d\xca\xd5\xcc\xc9\x1b\x67\x21\x5f\xeb\x79\xb3\x8d\x7d\xe7\x9a\x01\xa7\x65\x17\x60\x1c\xd6\x6d\x1d\x43\xa4\x34\xfe\x66\x27\xf4\x61\x9a\x4e\x46\x79\x8a\x11\x9d\xef\xb9\xcd\x41\x16\xd1\xbb\x69\xd5\xab\x7e\x6f\x4d\xf7\x54\xee\x21\xd7\xab\x85\xef\x26\xb5\xa8\x65\x4e\x22\x3d\x47\x37\x1a\x89\x2c\x9b\xb2\x08\xe4\xdf\x3d\x8e\x42\xfc\xb1\xdb\xf2\xa4\x03\xf6\xec\x84\x9b\x99\xf5\x42\x33\x77\xe0\xd1\xd4\xfa\x1a\x50\x6e\x9d\xff\x85\x01\x66\xda\x8c\x05\x9d\xbd\x81\x3d\x3a\x70\x60\x13\xa3\x8f\xe3\x94\xed\x40\xaa\x8c\xb4\x66\x4b\x59\xae\x9a\x84\x6a\xed\xa4\x83\x7e\xe8\x5c\x6e\x5d\x18\x86\x70\x33\xaf\xc2\x22\x85\x44\x7d\xd8\x92\x19\xaa\x49\x6a\xe4\xd6\x2d\xf9\xbc\x63\xc3\x0f\x05\x18\xc9\x3c\xf7\xe2\xd5\xa3\x33\x06\x5d\x2c\xe8\x94\x72\xd8\x84\x5b\x80\x4d\xe2\x6a\x0b\x74\x59\xac\x84\xc8\x8b\x07\x73\x46\xbb\x84\xbc\xcd\xab\x45\x86\x2d\xe5\xbe\x7a\x5f\x66\xe8\xfa\xe9\x2d\x2a\x41\x3f\xaa\x40\x3f\x6a\x34\x96\x73\x75\xde\x00\x90\x9f\x03\x21\x47\xc0\xbf\xb5\x0b\xba\xc7\x6d\x09\x24\xd8\x21\xe5\xf7\xd7\x57\x41\x6d\x0a\x74\x1d\xbc\x9a\xad\xb6\xc8\x54\xc6\xb5\xe1\xca\x05\xe7\xec\x99\x57\x45\xde\xb9\xe2\x5c\x92\x72\xd9\xeb\x2e\xe7\x25\x4e\xd7\xe8\xf5\xea\x17\x61\x81\x95\x82\xfb\xb2\x26\x11\x65\x75\xdc\x1d\xb2\x60\x64\x86\xa4\x13\xda\x2d\x27\x60\x6c\x6f\xd0\x31\x03\xc6\x29\x67\x41\xc3\x97\x1e\x54\xf0\x9c\xbd\xe9\x7f\xde\xa9\xfc\xa7\x34\xe0\x6d\xfd\x92\x27\x68\x86\x94\x37\x80\x0b\x45\x88\x3a\xe1\xcc\x75\xdb\x1e\x75\xff\x6c\xe1\x1f\xf8\xdb\xa2\x6d\xf9\xf7\x4f\xfc\xf9\x9b\x4c\xd3\xa9\x65\x7a\x2d\xa7\xca\x6b\xd1\xbf\xaa\xb4\x9d\xf2\xb1\x5e\xa0\x45\xff\x51\x7b\x5e\xcd\x69\xd1\xbf\xad\xbc\xfd\xb5\xf2\x06\x65\x3d\x7a\x57\xf6\x19\xda\x87\xbe\xb4\xa1\x1f\x3b\x2d\x3d\x8a\x76\x4b\xbe\xbf\x1f\x91\xec\x90\xec\x7e\xbb\xf5\xdb\x41\xea\xbe\xeb\xb1\xb6\x5b\xff\xd1\xe8\xab\x21\x57\x03\xf9\xfb\x7f\x33\x37\x3b\xff\xa7\x79\x5a\xcf\xad\xf5\x57\xff\xff\x4f\x99\xb0\x51\x2f\xd2\xf2\x3c\x10\x4d\xd8\xdf\x2a\x61\xee\xe0\xe3\x1b\x88\xcb\xbe\x16\xdd\x7c\xe6\x97\x31\x44\x43\xe2\x04\xd2\x10\x9b\xa2\xb7\x58\x2c\x30\xe0\xe6\xd9\x1d\xa1\xfd\x63\x8e\xf1\xbe\xa4\x08\xa8\x5c\x88\xf6\xe3\x9a\xf7\xac\x87\x7e\xe9\x3d\xeb\x6e\x5c\x4b\xbf\x88\x39\x6b\xed\xa2\x0f\x59\x9f\x8f\x0b\xed\x7c\x57\x37\x7e\x3d\xc0\xa3\x10\x74\x7c\x5b\x73\xa7\xeb\x84\xec\xd7\xe1\x06\x91\x5b\x44\x17\xbd\xba\x95\x9b\x01\x81\xee\xdf\xaa\x91\xfc\xd6\x09\xef\xbf\x0d\x6c\x25\x27\x66\x58\x06\x2e\x3c\x1d\xd5\x86\xf3\xfc\xc0\x56\x26\xe7\x79\x8f\x13\xed\xa8\x57\xde\x02\xb8\x47\xde\x16\xfb\x7e\xb7\x58\xa0\xb3\x66\xf6\xf3\xb8\x83\x7e\x88\x0f\x9f\x39\x3d\x27\x36\x3e\x6f\xe3\xb3\xa3\x4c\xfc\x9e\x1f\x56\x46\x1e\xb0\x37\x74\x20\x69\x07\xf4\x77\x33\x20\x85\xdd\xb5\x79\xb8\x18\x10\xba\x81\x37\x56\xdf\xea\x9d\x4c\x51\xe6\x0d\xd9\xed\x83\xa9\xaa\xb9\x7d\x8f\x4a\x77\xc8\x73\x51\xba\xa1\xbd\xeb\xbf\x6f\x2d\xc0\xe8\x2b\x2a\xbb\x2c\x79\x13\xf3\xd5\x69\xc8\x5f\x38\xa1\x5f\x8f\x39\xbd\xeb\xea\x4b\x38\xff\xcf\xd5\x22\xa7\x33\x4e\xe8\xc9\x31\xa7\xbd\x67\x0e\x73\x75\x53\xcf\xec\xf5\x30\x38\x51\xac\x2b\x0f\x63\xa9\x97\xee\x67\xe6\x5b\x34\x4a\x53\x74\xb4\xb4\x56\xe7\x67\x1f\xea\xdc\xfc\x5d\x87\x64\x9c\xbc\xaf\x81\x19\xb3\x7c\x75\x36\x38\xf4\xb5\xf5\x6e\x92\x12\x9c\x24\x0e\x93\x14\xac\xcc\x0d\x5f\xfd\xec\xe0\x88\x50\xdd\xcd\x1f\x27\xab\xdf\x2c\x9d\x04\xc6\xb9\x76\xfd\xcb\xff\x54\x24\x4e\xa5\xd3\xd2\xf3\x41\xcd\x6b\xaf\x76\x94\xeb\x5c\x3c\x4b\x08\x76\xbd\x4a\x22\xbe\x1e\xb1\x78\xb1\xf0\x2d\x15\x8e\x78\xc0\xcd\xab\x01\x21\x44\xe7\x5d\x69\xd7\x64\x23\xba\xf1\x5e\x4f\xf8\x6d\xe9\xf8\xd6\x0c\x08\x0e\xb7\x66\xa4\xc3\xad\x99\xcd\x9d\x47\x78\x8b\x88\x61\x98\xbe\x15\x31\x78\xac\x22\x98\xeb\x13\x97\x7e\x69\x68\xf8\xc0\x4e\x57\x96\x2a\x26\x20\x35\x17\xaa\xa7\xaa\x8c\xaa\x26\x94\x87\xdc\x2b\x51\xdb\x33\xd1\x9e\xb2\x77\x78\xd6\x6d\xce\x7d\x86\xde\xda\x9b\x21\xa7\x0f\xfc\xc5\x0e\xb9\x02\xe8\xb0\x8e\x3a\xa2\x3b\xce\x22\x27\x62\xe2\x72\x45\xe6\x85\xa5\x3f\x24\xe5\xf3\x8f\xe3\xf2\x44\x09\xca\x33\xc6\xbe\x1e\x29\xd4\x33\xc7\xd7\x1f\x3a\xcc\xe9\xe8\x4e\x9e\x61\xb9\x47\x1e\x63\xdf\xef\x94\x36\xdc\xc3\x50\x99\xb5\x29\xab\x0c\xc1\xa5\xd7\x67\x75\xed\xb7\x0a\xc4\x5d\xd8\xee\xbd\x88\xd3\xa3\x48\xf5\xe0\xe7\x09\x0b\xb5\x99\xfd\xf5\x48\x47\xeb\x3e\x50\xa6\xac\x03\xfe\xd1\x99\xdf\xf6\x85\xa9\xf0\x30\xe5\x2b\x7e\xe1\x2e\x94\x9b\x7a\xf4\xed\x87\x71\xc3\x98\x6f\x18\x5b\x11\xc7\x57\x93\xc3\xd7\x24\x2f\xab\xef\xfd\x29\xa4\x11\xb2\xbc\xb1\x46\xfb\xef\x1d\x6c\x09\x6e\x8d\xf6\x4d\xd5\xcf\xcf\xed\x16\xe5\x8b\x85\xeb\xd5\x8f\xfb\xfa\xc3\xd5\x3b\xf0\xe2\xda\x24\xd6\xd3\x1d\xfa\xfd\xb1\xce\x5f\xd8\x59\x86\xbb\x61\xc0\xcd\xed\x3e\xa9\x34\x51\xa6\x05\x5e\x25\x6d\x71\xeb\x62\x6e\x18\xfe\xa3\x19\xd0\x59\x1f\xba\xb8\x85\xcf\xb7\x13\x4e\x16\x8b\xeb\xb2\xee\x8f\x09\x6f\xa0\x1b\x92\x2d\x6e\x5d\x8f\x0c\xc3\x14\x8b\x45\xeb\x0b\x7c\x40\xeb\x12\x31\x78\x31\x0c\x68\x4f\x8e\xf4\x61\x08\xc2\x20\xf6\x01\x38\xc3\x10\x3d\x94\x43\x73\x30\x69\xd6\xf9\x0b\xf4\x4f\x70\x16\x3a\xdc\x0a\xf9\x84\x5f\xbd\xe6\x02\xa3\x76\xf4\x63\x16\x5a\x97\xfa\xc3\xf1\x1d\xfa\xcd\xfd\xb1\x92\x28\x64\xe2\xdd\x98\x05\xd6\xa5\x89\x49\xfb\x3d\x42\x6f\x8e\xb9\x35\xdb\x7b\x81\x5d\x3a\x1e\x85\xe9\x28\x13\x85\xe5\xf3\x42\xc0\x53\x5d\x95\xe6\xb0\x54\xa5\x0e\xc7\x8c\x3f\xa2\xef\x98\x01\x37\x67\x5f\x09\x3d\x3c\xe6\xb5\x63\x10\x06\x25\x80\x0e\x84\x63\xc6\xa6\x7d\xa5\x1d\x24\x81\xaf\x72\xd0\x24\x38\x5e\x1e\x5d\xea\x76\x0e\xba\x80\x87\x9e\x80\x43\xc4\x80\x0f\xcf\x57\x66\x40\x6b\xf9\xd3\xaf\xa8\x99\x24\x57\xa2\x96\xde\xd3\xf5\x04\xd4\x13\xef\xea\x4d\x64\x3d\x29\x9a\x84\x38\xc7\x73\x1f\x60\x89\x85\x3a\x55\x94\xa9\xfc\x85\x89\x32\x3e\x9c\x2a\x86\x58\x40\x77\x81\xea\x64\xfd\xc4\x5f\x6a\x05\x26\x5f\xab\x64\x98\x6a\x59\xf4\x8b\x4e\x42\x65\x2f\x9d\x5a\xb6\xc4\x74\x76\xd5\x62\x00\x95\x61\x96\x55\x91\x2d\xd6\x0c\x31\x7e\x9b\xcc\xdf\x62\x21\xef\x4c\xfb\x36\x07\x54\xe1\xe8\xa9\x05\x28\x92\x33\x5e\x1b\x24\xd6\xc4\x77\xc1\xad\xa2\xfa\x7a\xd5\x4f\x68\x4c\x17\x78\x0a\xca\xce\x10\x52\x3f\x83\x79\x5c\x11\x00\x3e\xf8\x0e\x5b\xed\x21\x03\xe4\x50\x89\x01\xf9\x89\xd6\x33\xad\x3a\xbb\x05\x5f\xac\x9c\x2f\x03\x00\xa2\x53\xfc\xcf\x00\xd6\xd2\x3d\xfe\xc3\xa8\x78\xe0\x93\xe0\x0e\x43\x92\xff\xd1\x80\x3d\xb0\x12\xa1\xfb\x69\xfd\xcc\x9e\x03\x02\x0e\x1b\x26\x9e\xc5\x9e\xbf\x78\x1d\xeb\x4f\xbb\x69\xfd\x89\x61\x0a\xfb\x2c\x68\xb6\x61\xf3\x44\x2c\x6c\x04\x9f\x30\x1f\xef\x86\xf8\x36\x7a\x09\xc3\x2e\xaa\x2d\xb8\x58\x1c\x67\x26\xb7\xd4\xaa\x3e\x00\x85\x94\x59\xc0\x1e\xb5\xe4\x45\x92\x3f\xec\x14\xea\xfb\xf0\x6d\x7b\x52\x7b\xd1\xf2\xf5\x64\x34\x49\x85\xcd\x81\xe2\xd1\x8c\x3f\x00\x23\xe3\x6f\x9b\x84\xc2\xe8\x6c\x98\x0a\xca\x73\x1b\xf6\x3e\xd5\x7b\xd9\xe6\xae\x98\x7b\x74\xf2\x60\x73\x6b\xf2\x40\xaf\xa0\xca\x95\xa0\x22\xb2\xa1\xe7\xf4\x36\xb4\xdf\x0e\x84\x7d\x6b\x72\xeb\xe4\x5f\x20\x87\x8e\x13\x7c\xc9\x73\xc0\xa8\xb4\x0c\x94\xa9\x0b\x5d\x1f\xd5\x0a\x9d\xff\x03\x0b\x0d\xee\xed\x80\x1e\xf8\xb6\x6f\x1d\xf8\xf4\x98\xdb\xbe\x75\xcc\xe9\xd5\x9d\xed\x5b\x57\x77\x52\x84\xe4\xd6\xe9\xa8\xbe\xfa\x93\xba\x14\xc7\x4b\x32\x32\xc5\x29\xa3\x80\xda\x3a\x33\x7c\xb6\x61\xf2\x3a\x72\x2a\x3b\xcf\xea\x36\xcc\x7e\xd1\x0f\xaf\x98\x41\xec\xb9\x6a\x0f\x56\xa5\xd1\xd6\x7b\x7a\x4f\x36\xa7\x82\x83\xbc\xc3\x19\x11\x50\x7c\xee\x06\xf3\x8f\xee\x86\xde\xf8\xbf\x6c\x4e\x27\x1c\x66\x8d\xd3\x5b\x9b\x5b\xb7\x52\x72\xae\x9d\x13\xa9\xe3\x23\xc5\x34\x61\xa0\x14\x8a\x21\xc3\x63\x06\x4b\xd0\xe9\x62\xaf\x22\x62\xef\xab\x07\x82\xb1\x3b\xe3\x8f\x3e\x37\x51\xfe\x8a\xcf\xff\x01\x5d\xbe\xb5\xf9\x6f\xbf\xf6\xe3\x44\x7e\x6d\x74\x6f\xe2\xa5\xe9\xc5\xc8\x8c\xde\x99\x17\x58\xb7\x9f\xe4\xcd\xd4\x8b\x3a\xf0\xbf\x12\x65\xc2\x62\x71\xa4\x3d\x97\x59\xb7\x84\x70\x0c\x84\x47\xc5\xbd\xe4\xa7\x60\x4a\xb8\xc5\xff\x45\x9c\x50\xa4\x62\x02\xa8\x8b\xff\x0b\xe3\xc0\x28\x41\xa5\x0e\xcc\x7b\x7b\x1c\x61\x39\x32\x0c\x33\x66\xf1\xbd\x19\x11\x42\x85\x61\x8c\xee\xcd\x18\x88\x24\xdd\x70\x85\x87\x74\x62\xfb\x46\xa9\x7d\xa2\xae\x00\x50\x93\x9b\xca\x9d\xde\xdb\x31\xb7\x23\x80\x9a\x18\x40\x49\xd4\xa1\xa5\xa8\x43\xcb\xf1\x50\x1b\x44\x48\x04\xf4\x85\x29\x44\x53\xbb\x51\xc1\xe9\xba\x52\xd3\x76\xe0\xcb\x43\xbd\x15\xa0\x70\x1e\xee\x61\x5f\xf6\xab\xe3\xd5\x88\x85\x9c\xc6\xac\xed\xc4\xbb\x90\x21\x4f\x98\x62\x7d\x5b\x81\x49\xb1\xd7\x94\xbf\xcd\xb6\xe7\x24\x30\xe4\xf2\x56\x38\x21\x64\x09\x2c\x12\x62\xbe\x88\xb5\x24\x08\xa6\x8c\x5b\x37\xa7\xa6\x4f\xdc\xe1\xdc\x63\x18\xd9\x37\x66\x2d\xa4\xb7\x9b\xa3\xac\x98\xf0\x2c\x10\x8f\xd1\xe6\xe4\x1a\xa7\xae\x3a\x17\x6e\xff\xeb\x1f\x28\x89\x12\xa2\xef\x45\xe4\x99\x18\xde\xa7\x59\x3e\xbd\x45\x5a\x0b\x00\x90\xd2\x98\xd0\x84\xbd\x4d\x43\x9b\x5b\xd3\x90\x76\x61\xaf\x75\x27\xf4\x0e\x70\xf9\x5d\x9f\xfe\x38\xb1\x39\x40\x0b\xcd\x24\xfe\x02\x6e\x93\x53\xb5\x43\x72\x16\x5b\x7c\xc4\xf5\x4c\x52\x35\x91\x34\xc2\x0f\xf4\x05\x7c\x20\xa1\xbe\xb5\x1d\x10\x59\x2f\x93\x27\xc3\x2c\x33\x0c\xf3\x62\x64\xe6\x78\x79\x50\x83\x3a\x6e\xdd\xb2\x41\x0d\xae\x10\x46\xb1\xe0\xe9\xe8\xb7\x05\x1d\xae\x63\x2b\x5a\x2f\x6c\xa3\xca\x29\x13\xb1\x29\x84\xf3\x0f\xda\x9a\x70\xcd\x70\x5a\x79\x6e\xc2\xbb\x9e\xb6\x51\x64\xa6\x95\xe3\xf9\xb2\xb5\x95\xcf\x55\xcf\xaf\xb5\xf4\x57\xe6\xe3\x16\x73\x3e\x1e\xe7\x6f\x3f\xf9\x7f\xdb\x79\xf8\x15\x2e\xdd\xbd\xcb\xa3\xc4\x0b\x98\x73\x10\x60\x7e\x31\x85\xff\xe9\x47\x3a\xd8\xfa\xe9\x88\x72\x62\x17\xfa\x2c\xb0\x86\xd7\x14\x8a\xde\x93\x01\xa3\x2e\x6c\x19\x6d\x9e\xf2\x95\x3d\x0b\x0d\x7c\xb4\x67\x73\x85\xec\xf5\x5e\x5b\xd9\xb9\xf3\x35\xcd\x50\x47\x13\xfa\xce\x2a\x9d\xef\x94\x6f\x72\x43\xb5\x4a\x66\xa2\xd9\x06\x1a\x50\xf1\x00\x75\xc6\x4a\x8a\x83\xbe\xd5\xe3\xee\xc0\x2b\xb9\x9f\x46\x9b\xc8\x18\xb6\xaa\x81\x92\x41\xb1\xab\x6f\x56\xed\x33\x5d\x3d\xd4\x4f\x30\xc8\x8b\x98\xa3\xa2\xbc\xec\x4d\x48\x55\x10\xc3\x46\x5b\x45\x02\x93\x84\x24\x3a\xd0\x85\xf8\x8b\xd9\xa6\x21\x5e\x10\x70\x90\xd2\x7a\xea\xca\x0a\x24\x35\xa0\x49\x9f\x43\x07\x17\x73\x78\x51\x76\x77\x5d\xc2\x0c\xb4\x5d\x55\xb4\xe7\x54\x34\x01\x4b\x73\xcf\xdd\xf6\xe8\xad\x44\xfd\x7d\x01\x04\x02\x97\x4c\x65\x5a\x67\x13\xb7\x05\xeb\xd6\xda\x65\x81\x61\x04\xbb\x2c\x44\xd0\xad\xb3\xda\xb3\x93\x95\x10\x0c\x82\x4b\x04\x78\x3d\x5a\x8b\x20\xa6\xa5\x57\xeb\x78\x1b\xe4\x5c\x1a\x58\x33\x82\x71\x5e\xa0\xac\x8e\x1f\x9d\x05\xe6\xf3\x15\x72\xa8\xd7\x23\xd8\x2b\x33\x02\x34\x7b\x25\x55\x15\x6f\xb6\x31\x97\x38\x12\x6b\xfb\xd6\xf4\xd8\xf4\x01\xd5\xf8\x80\x67\xb6\xda\x0a\x9f\x00\x67\x82\x2d\x83\x84\x2e\xfb\x25\xb9\x00\x19\xf6\x5a\x9b\x02\x01\xb9\x5e\xed\x72\xd9\xe1\x67\xe5\xc8\x4c\x70\x0a\xe2\x39\x02\xaf\x6f\x8d\x73\x53\x29\xfd\x87\xec\xe5\x0a\xf1\x1c\x91\x0b\xf1\x51\x53\x5a\x8e\x98\xd1\x98\xe1\x48\x82\x32\xc6\x4f\x5f\x98\xb1\xf4\xdf\x1a\xa1\xcc\x4f\x30\x32\x06\x3a\xc6\xaf\x3c\x1e\xc0\x7a\x05\xf4\xd6\x8e\xd5\x86\x42\x0a\xfe\x6e\x25\x24\xcb\xf2\x76\x7f\x2c\xf1\x2e\x05\x41\x8b\x82\x60\x45\xe5\xde\x78\x3d\x5e\x2c\x24\x73\x8c\x80\x38\x37\x8c\x03\x09\x4c\xd5\xda\x01\x7d\x76\x1e\x35\x7b\xe9\xb3\xcb\xd1\x5a\x78\x46\xcd\x55\x2b\x93\x41\x09\xf4\x86\xa1\xed\x17\x25\xe4\x4b\x8c\xfa\x04\x13\x71\xfe\x42\x0c\x63\xe7\x8b\x94\x1c\x4d\x9f\xdd\xdf\x9b\x3e\x95\x32\x23\x91\xe2\x21\x4c\xa5\xaf\x1e\x4f\x8f\x4d\xbd\x22\xe5\xa4\xca\xf5\xad\xa6\x56\xbc\xe7\xab\x6a\x8e\x6f\x14\xd6\x04\xd6\x2c\x80\x39\xf4\xeb\x53\xe8\x7f\x00\xe9\xd1\xc7\x73\x79\x50\x87\xea\x90\x53\xa9\x6c\x0a\xbc\x7b\x39\x4f\x32\x82\xf5\x6a\xb8\xf4\x90\xb5\x76\x79\x33\xe8\xb4\x6d\xe0\xdf\x59\xf8\x09\xb7\x77\xf8\x89\x13\x27\x90\x67\x05\xfc\x13\x3c\x40\x21\x9c\x0f\x1d\x33\x4f\xfb\x91\x08\x6a\x16\x2d\x01\xe3\x4b\xe2\xf8\x5b\x0a\x39\xa9\x2e\x5c\xac\x7e\x93\xc6\x3a\xdc\x8a\x72\xb0\x8e\xee\x9f\xbe\x8d\xdc\x54\x78\xee\x89\x67\x0a\x8a\x6a\xe1\x55\xfb\x68\x27\x50\xef\x27\x0d\xee\x4d\x41\x83\x46\xf8\xc9\xa7\x31\xa0\x38\x54\x43\x5b\xd6\x96\x67\x45\xb4\xd6\xac\xb2\x62\x97\x56\x44\x64\xc5\x93\x38\x01\xec\xc6\x00\x76\x63\xa0\x77\xa3\x64\x91\x5e\xae\x60\xdb\x08\x2b\x4e\x51\xf9\x5b\xdf\xc3\x87\xd6\xcd\x1e\x05\xf9\xff\x6a\xaf\xd9\xa6\x09\x1e\xd8\xed\x0f\x4d\xe0\x0f\x28\x30\x1f\x4a\x8f\xf5\x39\x26\xea\x56\x8e\x46\x2c\xa6\x31\x4b\x9d\x50\xf2\x36\xaf\x43\x53\x69\x00\x56\x5f\x05\xf6\x95\xa2\x8a\x79\x42\x05\x6d\xb7\x68\x08\xbc\x12\x74\x46\xea\xc2\x39\x25\x11\x04\x46\x4d\xb0\x96\x23\xa4\x9e\xa5\x40\xf5\xc7\xd0\x15\x1e\x8d\x94\x26\x29\x2e\xb8\xa6\x6f\x01\x80\x98\xb4\xbe\x04\x7e\x5a\x07\xed\x92\xe0\x24\x75\x5c\x11\xa6\xea\xb3\xb6\x5f\xb3\xed\xd9\xf2\x17\x8b\xf6\x17\xf4\x53\x8d\x8a\x3b\xdc\x9a\xe5\xa4\x76\x81\xa9\x6d\x90\x7c\x17\xef\x41\x7d\x40\x84\xb7\xe4\x33\x60\xcd\xbc\xd1\x26\xd2\xfb\x0a\xde\x15\x30\x99\xa7\x06\x10\x29\x5f\xe0\x71\x13\xe4\x30\xf2\x39\x00\xec\x2a\x1c\xd1\x6c\x6a\x5e\x13\xf3\xe3\x66\xf0\x49\x10\xa7\xbd\xab\x54\x70\x65\x69\xc3\x40\xed\xce\x84\x2c\xab\xd9\xf0\xe5\xfd\xac\x50\x21\xa4\xe1\x73\xc2\xb3\x6e\x95\x76\x02\x74\x07\x75\x52\xe3\x06\x0b\x28\xd6\x96\xed\x13\xe2\xc4\xec\x7c\x64\xfa\x04\xba\xa6\x1d\x94\x5b\x22\x6a\xc6\xd8\x29\xf9\x81\xb6\xd2\x35\x6f\x34\x88\xee\x58\x03\x3a\x46\xeb\x1d\x13\x51\xd5\x31\xbd\x2d\xea\xb1\xdc\xbb\xff\xcd\xb4\x56\xa6\x47\xbe\x72\xc6\x03\x8c\x8a\x40\x83\x4f\x17\xa3\x4d\x03\x8b\xae\x06\x1d\x37\x1a\x04\x0a\xc6\x1e\x96\x50\x85\x61\x07\x87\x86\x61\x16\x57\x78\xf4\x23\x0c\xa3\xb8\x32\xc5\xe7\x10\xc4\x14\x0c\xd9\x0b\xc3\x43\x87\xd3\xae\x6c\xc7\x03\x01\x3c\x42\xff\xf7\xb2\x6b\xef\x16\x3a\x61\x2b\xeb\x4c\x95\x4b\x6e\xd7\xa3\xa9\x03\x43\x50\x28\xe2\xea\x58\xb1\x22\x33\x0c\xe9\x05\xaf\xf0\x0c\xf2\x02\x96\x12\xfa\x56\x59\xea\xf1\xe2\xe2\x48\x3d\x5e\xe9\x54\x42\xb8\xb1\x47\x3e\xcb\xe7\x76\x8b\x50\xad\xcb\x5b\x55\xa9\x0d\x1c\x95\xfc\x61\xec\xb8\xd8\xb0\x23\x7d\x37\x6e\xb4\x3d\x6b\xc2\x3f\x63\xf2\x84\xd3\x2d\xb3\xf5\x25\x21\x38\x01\x89\xd4\x58\x6e\x7f\x91\x92\x4b\xb3\x8d\x01\xef\xb0\xc2\x2d\xa9\x2a\xc3\x10\xb1\xc9\x94\xb5\x9c\x54\x76\x31\x85\x69\x86\xae\x88\x46\xf4\x29\xf9\x14\xba\x69\x15\x86\xb4\xee\x51\x7c\xaf\x8e\x8f\x65\x58\xc9\xda\x51\xd2\x81\x8f\xc8\x54\x32\x9f\x07\xbe\xe6\x3f\x0f\xfc\x5f\x8b\xd6\xdc\x1a\xc6\x7c\x59\x3b\x54\xaf\x2c\x5d\xe5\xa7\x94\x53\x1e\xeb\x6e\x0c\x5f\xb8\x1b\x6f\x31\x56\xc4\xf0\x28\xb9\x11\x45\x61\xef\xc6\xe5\x79\x1d\x90\xdb\x77\xf9\xfd\xb8\x96\xff\xe3\x7d\xfe\x8f\x78\x85\xec\x1c\x57\xe1\x59\xd8\xc9\x7d\xc9\x55\x92\x92\x8b\xb5\xb5\x44\x15\x54\xf9\xfc\x45\xe7\xf3\x17\x5b\x49\x5a\x8e\xcf\x24\x41\xf0\x9b\xac\x4d\x83\x06\x6b\xd7\x79\x46\x54\x8b\xaa\x28\x0b\x32\x96\xd2\x00\x03\x2f\x21\xee\xc6\xa4\x36\x66\xe2\xb3\x95\xf1\xd6\x03\x38\x54\x19\x82\x5b\x51\x0b\x10\xa2\xcf\xf6\xee\xcd\x50\x2a\x51\xa2\x97\x77\x8c\x02\xd6\x22\x4b\x58\x0f\xb9\x74\x98\xac\x0e\x18\xfb\xc2\xf4\x09\x8d\xb8\x19\x20\xe7\x03\x65\xe4\x32\x4a\x4a\xee\x03\x86\x0d\x96\x2b\x93\xf4\x52\xdb\xf4\x9a\xb3\x31\x8c\xac\x94\x36\x49\xf5\xf2\x14\x10\xcd\x7d\x3d\x4b\x12\xf1\xed\x61\x5d\x28\x25\xd4\xc2\xc9\xc9\x02\x33\x70\x5f\x3d\xfd\x88\xca\x0f\xcb\x55\x22\x87\xd4\x0d\xe9\x9c\xe0\xd6\x6b\xd7\x1a\x65\x33\x31\x2e\x44\xf9\x61\xc5\x1d\xbc\xcb\x7a\x0a\x88\x83\xf7\x06\xa1\xfa\x15\x9a\xf2\xe1\x69\x4e\xcb\x6e\xd3\xf8\x3d\xd1\xa3\x09\x05\x31\xdf\x77\x24\x41\xe4\x43\x47\x2a\x6b\x5d\x67\x66\x2a\x0f\x48\xbe\xf5\x09\x71\xfc\x47\xfd\xfa\x3a\xe5\x44\xcb\xdf\x67\x65\xa1\x8b\x3e\xc6\x6a\xac\x6a\x7d\xef\x63\x80\xc6\xeb\xda\x49\xcb\x25\x34\x94\x2d\x16\xf9\x62\x51\x2c\x16\xd3\x4e\x62\x75\x6f\x59\xa9\x93\x96\xd1\x22\xe0\xa9\xe8\xf3\x60\xf2\x38\xb6\x73\x9a\x8f\x45\x34\x7a\xb1\x0b\x5a\x4c\x23\x78\x98\x2e\x6d\x33\xab\x7d\x71\x0e\xfd\xa0\x4f\x23\x33\x23\x86\xe1\x0f\xcd\x84\x66\x84\xd6\x0b\xec\xd5\x0b\x04\xaa\x80\x99\xb1\x54\x9f\xf5\x77\xa7\xf2\x18\x33\xb1\xd2\xdc\x7c\x93\xf1\x60\xec\x4c\x07\x86\xd9\x28\xcf\x0e\x33\xf7\x21\xf0\x68\x15\x1e\xc6\xce\x6a\xb1\x62\x96\x84\x1e\x97\x9f\xdc\x9f\xe2\x59\x52\x38\x04\x6c\xe5\x24\x2c\xb1\x8a\x07\x93\x38\x29\x73\x3d\x80\xc7\x90\xa0\x3a\xd6\xde\xd0\x0c\xa9\xa0\x01\xf0\x23\x81\xe4\x46\x02\xeb\x39\xa6\x11\xde\xe1\xd0\x00\x39\x88\xbf\xb7\xd0\xb2\x78\x8d\x81\x08\x58\xcb\x09\xa4\x32\x56\xd0\x68\x90\x90\xa5\x2e\xc6\x46\x0f\xa5\x71\x4f\xa4\x21\xc3\x3d\xd8\x43\xa3\xab\x15\x96\x42\x20\xbe\xea\x0b\x33\x52\x7c\x44\xb8\xc2\x47\xdc\x58\x59\xf0\xee\xe6\xa8\xc4\x7f\x0a\xbd\x18\xc6\xe5\xb5\x0e\x19\xa0\x5d\x5f\x09\x84\x65\xed\x97\xfc\xa1\x2f\x23\xf9\xad\x5c\x2e\xbd\x3b\xee\xae\xcb\x72\x34\x60\x56\xab\xfd\xc9\x04\xa1\xaa\x09\xe2\x15\xb0\x14\xf0\x0b\xf8\xa1\x26\x65\xe3\x35\x65\x11\x94\x72\x73\x11\x34\x03\xda\x22\xc4\x69\x7d\x81\xaa\xba\x74\x29\x68\x43\xa2\xe6\x7d\xad\xa7\xa0\x81\x85\x97\xcb\x8d\x1b\xab\x2f\x3e\xba\x8d\xd3\x1e\xd2\xd4\x69\x44\xc3\x2c\x25\x5a\x52\x9e\x4c\x7c\x52\x17\x98\xea\x4c\xae\x1c\xe1\xa0\xb2\xfb\x96\x77\x3e\xfe\x0a\x0d\xae\x1f\x5b\x05\xca\x15\x9b\xdf\x31\x7d\xc9\x16\xc9\xb3\xf7\xcf\x80\x3a\x1b\x80\x26\xed\xaa\x4e\x2d\xba\x1e\x2e\x5d\x00\xeb\x74\xf2\xaf\x5f\x19\x10\xe8\xa3\xe8\xba\x3c\x49\x6c\x74\x5a\x9b\xe7\xff\x6e\xcc\xba\xf2\x8a\x8c\x63\x73\x35\xd4\x1b\xeb\xfc\x1f\x2b\x2d\xf0\xd2\xa5\x9c\x9e\x28\x18\x8a\x9e\xa8\xcf\x6a\xa2\x1a\x6a\x0a\xe5\x98\x3e\x9a\x69\xf9\x19\xfd\x91\xeb\xa3\x5f\x1a\x47\xf4\x85\x1c\xd4\xc9\xbf\x24\x78\xd5\x54\xf0\x24\x7c\xe9\x28\x10\xee\x91\xa7\xa2\x40\x88\x03\xbb\x9c\x3d\x09\x49\x4d\xeb\xcf\xe5\x5a\x52\x2d\x1c\xcb\xf5\x8a\xa5\x44\x79\xb2\xef\x7f\x29\xef\x89\x0c\xc3\xdf\x2d\x0f\x67\x6c\xff\x4b\xe9\x37\x57\xd2\x50\xc8\x96\xae\x44\x4b\xb2\x59\x35\x7f\x34\x5c\x35\xc4\x90\xeb\xfe\x05\x38\x50\xf9\x58\x15\x1d\xaf\xdc\x2f\x69\xda\x2e\xf4\xc5\x54\xfd\xf8\xf5\xf1\x7a\xb1\x78\x7f\x24\x5b\xdf\x7e\x87\x1f\x19\x63\xd3\x4c\xdd\x0d\x47\x7e\x69\x57\xf3\xe3\x4e\xdb\x74\x74\x9f\xca\x28\x46\x5f\xf3\xd2\xc5\xf3\xf7\xb0\xf4\x8f\x79\x7d\xa5\x4d\x91\x6f\x33\xae\x6d\x91\x6f\x32\xae\x6d\xb2\x87\x19\xd7\x46\xd9\xc2\xe7\xac\x36\xc9\x47\xf5\xe3\x70\xb5\x64\xa1\x5a\xaf\x87\x31\xd7\xf1\x38\xfc\x66\xbb\xc9\xc9\xff\x06\x6b\x71\x3a\x36\xf9\xb2\x6a\xea\xeb\xb0\x0a\x54\xa3\x63\x0b\x59\x3f\xee\x80\xc7\x6c\x91\xcf\xa6\xff\xa9\xe6\xcf\x71\xe7\x8b\xca\x5a\x2c\x76\xbe\xf8\x75\x76\xa8\x3e\x3b\xd0\xd2\x91\x34\x80\x92\xa5\xd1\xaa\xfb\x36\xe3\xf5\x93\xf6\x36\x80\x03\xe6\x76\x38\x4c\x9f\xad\x0d\xb3\x7e\xdc\x49\x2e\x1b\x9f\x50\xa0\xfa\x14\x36\x39\x4c\x0b\x9a\xf8\x39\xfe\xae\xaa\xe7\xf8\x0d\x16\x56\x87\xf3\x3f\xee\x5c\xdf\xa3\x29\x4b\xac\x0b\xbc\x07\x1c\x66\xbc\xa3\x8f\xe6\x77\x3e\x25\xd6\x2d\xdd\xf9\x64\xe2\xa7\x9a\x89\x75\x4b\x88\x1d\xd1\x0c\xc0\xc1\xe7\x66\x22\x55\x1b\x29\x1a\x71\x66\xd6\x44\x38\xe9\x6e\x64\x18\x66\xbe\x92\x1f\x51\x41\xac\x89\x20\x52\xb3\x14\x0d\x14\xa4\x2e\x65\x62\x5d\xd0\x5b\x1b\xbe\x70\xfd\x97\x1d\x48\xb2\x20\xab\xc8\x80\x9b\x99\x15\xdf\xd1\x94\xbf\x3e\x4e\x27\x76\x46\x27\xc2\xce\x97\xa5\x7b\xf8\xb8\x5a\x88\xc1\x7b\x1d\x7a\xff\x53\xe0\x84\xac\xbd\xeb\x77\xda\x76\x58\x9b\x3c\xd7\xa3\x4a\x14\x40\x29\x40\xcd\x81\x5c\x04\x0e\x70\xd7\x88\x3f\x05\x34\xfe\x04\xa0\x0a\x32\xf9\x3d\x5e\x4f\x2c\x1f\xee\x57\xae\x88\xea\xbb\x14\x78\x7e\xeb\xb6\x62\xb3\xa3\xda\xe2\x9e\x94\x10\xc2\x59\xd5\x49\x0e\x40\x5d\x96\xbf\x5e\x55\xdf\xac\x9a\x7e\x2b\xa6\xb6\xb6\xcd\x2b\xa6\xd4\x77\x6f\x5f\x3c\x0c\x4f\x0c\xf4\xd3\xe6\xd6\x44\x2c\x16\xbe\x35\x11\xcb\x25\x85\xa2\x2d\x48\xdd\x6a\xd7\xd5\x3d\x4f\x91\xd5\xd6\x83\xf7\x81\x4b\x66\xdc\xba\xbe\x5a\x2c\xda\x34\x64\x65\xe7\x40\x94\x71\x42\x6b\x22\x00\x7d\x70\xd8\x66\x0e\x79\xf3\xa5\x61\x69\x09\xe3\xa5\x2b\x09\xdf\x51\x55\x05\x0d\xc8\xd2\x57\x76\x9d\xd0\xac\x0c\x2c\x00\x0d\x39\xe4\x2d\xa8\xd5\x17\x55\x7d\x28\x5f\xd6\xf7\xf5\x62\xbe\xbd\xde\xda\x82\xde\xbd\xd8\x3e\x2d\xa6\x76\x68\x15\xd3\x4f\xa2\xb6\xd1\xce\x56\x9c\xfe\xd7\xa7\x12\xc3\xb6\x7e\x30\x83\xa5\xc5\x9f\xe8\xb4\xed\x96\xbe\x88\x83\xf7\x92\x9e\x35\x82\x25\x6d\x91\x5d\x74\x3e\xf3\x49\x27\xbf\x89\x73\x9b\xd3\x73\xc1\x57\x4f\xe2\xbf\xae\x6e\x52\x09\x4a\xda\x9c\xf2\x7b\x88\x4c\x6f\x75\xd0\x15\x49\x23\x47\x98\xe7\xa0\x66\xd6\xb3\x32\x0a\x10\x19\x9d\xad\xd8\x3a\x07\xa4\xea\xef\x46\xbf\x9e\x71\x28\xa8\x2a\x27\xaa\xf2\x32\x7a\x37\xeb\xb2\xa9\xb5\x79\x4f\xaa\x56\xa0\x46\xd9\x4a\x24\x5b\xa9\xe6\x3e\x81\xb9\x8f\xa8\x38\xb7\x63\x4b\x9c\xd7\xc3\x0e\x9d\xbf\x53\xdd\x3c\x18\xba\x27\x5e\x65\x47\x16\xdd\x9b\x6e\x3e\xe3\x8d\x90\xfa\x87\x1e\x46\x0c\x50\x05\x95\xda\xd6\x2d\x1b\xd4\x35\x97\x8e\xe6\x52\xbd\x6d\x45\xe7\xed\x78\xce\x09\xfd\x9b\x34\x1a\x6d\x7d\xe1\x8b\xc5\xbf\x5a\xbb\x9c\x70\xf6\x37\xa5\xa7\x95\x25\x25\x8d\xc8\xbf\xb1\xde\x7d\xe9\x61\xe3\xfb\x5f\x6b\x1a\x86\xd3\xd2\xaa\xee\x62\x2d\xeb\xe2\x99\x13\x1a\x96\x1e\x16\x6f\x57\x73\xbf\x41\xee\x8e\xca\xec\x9f\xad\x66\xbe\xce\xa5\xa6\x9e\x24\x27\xb7\xab\xaa\x58\x73\xc8\xbc\x38\xe6\x34\x1b\xeb\xc6\x2f\xd7\x3e\xfd\xf3\x59\x73\xa7\xd3\xd0\x7d\x0d\xb4\x1b\xc7\x6f\x7f\xb1\xe3\x7a\xb1\x83\x27\x4e\xe8\x56\x9b\x2c\x7f\x98\xe7\x43\x7a\x30\x24\xce\x0d\x3b\x57\x0a\x5c\xfe\xf6\x07\x3e\xfd\x9f\x66\xd2\x33\xad\x9b\x07\x1e\x06\x9d\x99\xfd\x5c\xb3\xfd\xab\x8a\x56\xa6\x7f\x5c\x46\x3e\x57\xae\xd3\x50\x2d\x83\x63\xa0\x6f\x9b\xab\xc8\xdf\xbe\x74\x39\x7c\x63\x6d\xdf\xbc\xb3\x25\xd4\xee\x6e\xf4\x77\x35\xbe\xe5\x20\xd2\x29\xad\x3b\x39\x4a\x75\xfa\x5f\x53\x2f\x44\x07\x63\x2a\xda\x7f\xaa\x74\x6d\xef\x8f\x3b\xba\x94\x0a\xf0\x9f\x61\x35\x20\x27\xe2\x59\xf2\x0e\xd0\xdd\xf2\x66\x5d\xad\x3b\x55\x8b\x4c\xd5\x72\x52\xb5\x72\x54\x2d\x12\x55\x2b\x41\xd5\x54\xd3\x5f\x4c\xcc\xf7\x6f\xa6\xa0\x9c\x66\xd6\x54\xca\xf3\x4b\x90\x23\x55\x5b\x80\x26\xa7\x74\x56\x6a\x40\x3e\x3f\x40\x7f\x0d\x63\x2b\xac\x9c\x07\x28\x20\x27\xea\xb7\x33\x63\xdf\xb4\x8d\x18\xb1\xa7\xec\x74\x68\xe6\xf2\x34\x61\x53\x3b\x53\x07\x91\x68\xe0\x7d\x8a\x54\x6c\x8a\xfb\xdb\x4f\x05\x62\xa1\xb1\x34\x34\x54\x75\xe8\xd4\xba\x7b\xf9\x52\xe0\x29\xdf\xd4\x2a\xa6\xa4\xde\x30\x9d\x4a\x05\x3f\x6c\xb7\x9e\x81\x1c\xfe\x9c\xe1\xa0\xa4\xea\xa0\x8e\x77\xaf\x56\x3d\xe4\x84\x76\x55\xd0\xd5\x9c\xf6\x94\x30\xd3\x95\xda\xa0\x91\x8c\xb2\x4d\x08\xdd\x38\x5b\xcf\x51\x9a\xa1\xf4\xf4\x3d\x1c\x62\x9c\xfe\x2b\x19\xa7\x7f\x06\x28\xf0\x08\xa3\x62\x37\xba\xa8\x53\x39\x83\x76\xca\x94\x1b\xdf\x76\x7b\xcd\xae\xb7\x5c\xd2\x0b\x60\x49\x2e\xca\x40\xff\xdf\x7b\xd8\x80\x2c\x12\xa2\xcb\xc3\xd6\xee\x1c\xe9\x9d\x61\x54\xc5\xae\xe5\x77\xe2\x46\xbd\xa0\x2f\x8f\xa7\x19\xfb\xd6\xab\x97\x1d\x1c\x62\xd9\x64\xa5\x6c\xf0\x71\xd9\xc3\x03\x2c\x1b\xc8\x20\xf8\x2b\x35\x60\x4e\x2f\xd9\x05\xc6\x0e\x5c\x2c\xa6\x86\xd1\xda\x85\x15\xe9\x54\x95\xd5\xe0\xa3\xfa\x00\x89\x3d\x53\xed\x9f\xea\x3b\xb8\xa1\x6c\x04\x16\xb9\x34\xc9\x79\xe0\xac\xed\x3c\x70\x6c\xd1\x79\xe0\x8d\x06\xf9\x65\xb3\x67\xd8\xac\x13\xc9\x56\xa0\x01\x5d\x59\x4e\xd3\x7a\xf5\xb5\xa9\x9a\x48\x35\x60\xd9\x88\xa4\x48\xb7\x17\xe6\x05\xe5\xee\x9e\xd7\x04\xf0\x38\x0d\x3c\x42\x37\x06\x9c\xc5\x00\xa3\xa8\x7c\x72\xc4\x9d\xa9\x61\x98\x47\x9c\x01\x05\xcc\xe9\xd4\x7a\xbd\x45\xc8\xa4\x03\x3c\xaa\x6d\x11\x2a\xe5\x4d\x05\xfe\x86\x71\xc4\x11\x6e\x65\x25\x09\xa6\x74\x05\x74\x2f\xdc\x4b\x8f\x9d\x82\xdc\xcf\x4e\xfa\xdc\xbc\xa0\x2d\x3a\xa4\x11\x95\xde\x3a\x30\x18\xfd\xbb\x4e\xe9\xe9\xe3\x4c\xa5\xd0\x7a\x27\x65\x1c\x03\xec\x8f\xe4\x75\xf4\xac\x60\x92\x9c\x94\x01\x77\x1f\xb8\xd7\x60\xf8\xdb\x94\xee\xe9\x43\xf2\x96\xb3\x21\x6f\x0c\xb8\xdb\x2a\xa7\xb3\x05\x15\xc3\xb2\x5e\xc1\x42\xa8\x68\xed\x71\x7a\xf0\x62\x16\xb4\x70\x8b\x3d\x6f\xb1\x00\xcc\x74\x71\x61\xb6\x40\xa2\x97\x69\xd6\x2b\xcb\x4b\x35\xfd\x50\x6e\xcc\x69\x47\x27\x5c\x8d\xcc\x23\x6e\x89\xf3\x0f\x6e\xf4\x50\x89\x0a\x19\xbb\x2a\xb3\x86\x9f\xde\x5e\xec\x16\x7d\xb5\x07\xdc\xe5\xd6\xf5\x5f\x8d\xa0\x34\x23\x92\x48\x11\xef\xb1\x97\x4b\xdc\xe9\xf5\x5b\x40\x2e\xd9\x6b\x6e\x5d\x54\x76\x4a\x5c\x1b\x29\x29\x1c\x4d\x8f\x6d\xbf\x32\x44\x28\xfa\x74\xa3\xf0\x6d\xd9\x97\x89\xe8\x70\x85\x8d\xb5\x61\x82\x1c\x31\xb7\x6e\xe9\x90\x13\x65\x9c\xa4\xbe\x0b\x80\x0e\x73\x87\x13\x49\xf5\xb5\xff\x03\x6f\x76\x69\x6d\xf3\x2b\x0a\x78\x3a\x62\x27\x9a\x16\x09\x3a\xe4\x8d\x07\xde\x0c\x69\x48\x67\xd6\xdd\x0b\x21\xce\x90\x37\xd8\xf9\xc8\x1c\x70\xb2\x0c\x59\x0c\xc8\xab\x5a\x62\xf4\x1b\x02\xeb\x94\xff\x0e\xc1\x49\xfe\x58\x67\x14\x3e\xcb\x61\x38\xa9\x7d\x4e\xdf\x2f\x2f\x7c\x0d\x17\xb8\xaa\x30\x08\x58\xd1\xaf\x5e\x8f\x71\x37\xbd\xd8\x92\x42\x36\xe4\x47\x3e\xef\xd0\x57\x7b\xc8\xcb\xa5\x90\x5f\xc6\x49\xce\xad\x63\x68\x6f\x49\x9c\x94\xc5\x56\x2a\x62\x74\xbf\xe7\x7a\x4e\x4b\x59\x1f\x9a\xf0\xcd\x14\x26\xca\xb7\x46\x39\x1e\xd7\xf6\x53\x73\xc8\x9b\x09\xd5\xe4\x77\x28\x07\x73\x88\x80\xef\xb3\xd8\x42\x3b\x8c\x2e\x1f\xab\x86\xfc\xaa\x21\xbc\xe4\x91\x26\x0a\xb2\x15\x85\xbf\x3e\x68\x8b\x06\xf0\x3d\x4e\xc8\x8a\xf5\xf1\x37\xed\x8b\xb1\xf4\x9c\x26\xcf\x56\x7c\x53\x82\x4b\x48\xdc\xb1\xf7\x29\x6a\x88\x4f\x71\xe5\x6d\x4d\x7a\x07\x5e\x6a\x6f\x65\xd3\x10\x8f\x00\x81\xaa\x03\x53\x5c\x20\x53\x9c\x7f\x83\xbd\x7c\x67\x05\x8f\x85\x7a\x03\x49\xb3\x7f\xe6\x24\x8b\x85\x99\xb0\x9d\x2f\x5c\x11\xc2\x4e\xdb\x56\xb2\xb3\x68\x70\x2b\xce\xc9\xe7\x48\x05\x76\x90\x25\xa4\x44\x8b\x8f\x28\xd2\xd6\x6c\x7a\x53\xd6\xa2\xd2\xc0\x50\x37\xe6\x64\x0d\x96\x90\x54\x87\x9c\x52\x4d\x64\x1e\x5a\x08\x67\x2c\x50\x76\x9d\x43\x51\x19\x3b\x97\xf4\xca\x96\x70\x9b\xd2\x8c\xd0\x12\x6a\xed\x14\x38\xe3\xa4\x2e\x0b\x9c\x7c\x24\x0b\xf0\x8a\xe9\xa9\xcf\x40\x82\xd2\x7c\x8b\xea\xfe\x51\x41\xb9\x25\x6e\xa5\x2f\xb7\x66\xf4\xa9\x36\x3f\xe4\x73\xec\xa8\xb8\xe7\x61\x7d\x88\xae\xe7\x24\xd5\xf8\x92\x06\x53\xdf\xcc\x98\x4c\x4c\x3c\x8a\xfb\xc1\xa7\x99\xb4\x21\x84\xf5\x08\x69\x1b\xf8\x18\x39\xda\x4c\x6f\x7c\x2e\x77\xbd\xeb\xc1\xfe\x6d\x72\x60\xab\x01\x01\x14\xfd\xca\x12\x09\x37\x4b\xf6\xe1\xde\xcf\xac\xdb\xa6\xf5\xe7\xa7\xf8\x53\x84\xec\x61\x6b\x37\x57\xc4\xb9\x28\x77\x49\x0b\xcd\x1e\xd5\xb6\x08\xab\x1d\xd1\xc2\x0d\xa1\x65\xff\x4c\x22\xa7\x4c\x22\xa7\xa2\x92\xe8\xd3\xe5\xc6\x8d\xf5\xe3\x66\x3d\x70\xe2\x3b\x6e\xd3\x97\xdc\x66\xb0\xc2\x6d\x86\xff\x1f\xf3\x8b\xb7\x66\x5d\xb7\xa7\xe6\x82\x03\xe7\x5a\xc7\xd7\x0f\xa5\xf7\x0d\x89\x08\x09\x48\x3e\xb2\x53\xfe\x9f\xa5\x9d\x16\x2b\x0e\xd1\x05\xd0\xe9\xd0\x0c\x15\x12\xf4\x87\x52\xfd\xf1\xb0\xd4\x4d\xd4\x1c\x59\xf2\x91\x95\x4e\x50\x72\x5f\xe9\xc7\xd9\x9a\x6d\x4b\x59\xfd\x20\x35\xb1\x53\x9a\xa9\x0a\xf1\x7a\x4b\x39\x2d\x56\x8c\x50\x22\xc6\xd8\xdd\x61\xc7\xcc\x19\x00\x02\x4b\xd0\x63\x58\xd1\xa7\x05\x6b\xca\xe7\xd1\x01\x2d\x58\x0b\xd8\x0f\xd7\x93\xf7\xbf\xc8\x64\xf0\xaf\x92\xc9\xa8\xf1\x4b\xa3\xc8\x14\x44\xfa\xdc\x6a\x39\xc9\xae\x00\xce\x26\x69\x34\x48\xb4\xce\xd8\x04\x0d\x59\x0d\x56\x78\x23\xe9\xa4\x76\x46\x9a\xb1\xe6\x4e\xa6\xc0\x08\x44\x54\x9d\x6f\xee\xb9\x7b\xde\xe7\x1d\x42\x56\x89\xfe\xb4\xa4\xf9\x09\x6b\x3b\x09\xbe\xe3\xa7\xa6\x6e\xe2\x35\xd8\xd4\x4d\x80\xd6\x07\xc8\xbc\x84\x54\x00\xf3\x22\x80\x79\x81\x72\xd4\xfa\x93\x38\x35\x02\x1d\xac\xd0\xe7\x5a\xa4\x6d\x24\xce\x4e\x20\x95\xa9\x1c\xd4\xa3\x0a\x3e\xd4\xfb\x52\x1b\xa0\x39\x75\xfd\x55\x5a\xed\x97\xe4\x81\x7f\x40\xab\x7d\xb9\x1d\xfc\x3a\xad\xf6\xdf\xd3\xea\x00\xb6\x6a\x5e\xed\x54\x5f\x53\x6a\xff\xc3\xdd\x5a\x34\x7c\xeb\x96\x96\x6c\xdd\x0a\xc1\x5e\x2e\x97\xce\x8d\x75\x73\xca\x7e\x61\xa7\xf5\x1c\xb3\x66\x4d\x3c\x74\x7c\xeb\x66\x8f\x49\x32\xe2\xf8\xd6\x95\x7c\x0e\x42\xcf\x79\x7c\xd1\xe2\xeb\xb4\x30\x49\xed\xa2\xd9\xb9\xb1\xa6\xc5\x07\x12\xeb\x55\x8c\x72\x25\xdf\xfe\xe8\x94\xbd\xb6\xcf\x3b\x6f\xb7\xb6\xe6\xf5\xc2\xd1\x58\x60\x51\xbb\xd9\x5e\xda\x32\xc3\x9a\x3c\xe6\xb5\x8c\x76\xfd\xc4\xe2\x74\xf5\xec\x5a\x3c\x6f\xee\x9f\x28\x7f\xa2\xd6\x0b\xa1\xea\xe9\x95\xd4\xce\xc9\xce\x56\xaa\x5c\x8f\x4c\x3e\x8e\xa7\x0f\x22\x9b\x14\xb4\x77\x42\x55\x13\xc8\xed\x55\x75\xce\x7f\x5d\xe7\x43\xa5\x40\xbc\x98\x4d\x10\x39\x35\x02\x00\x08\x60\x71\x1b\x81\xbb\xe7\x91\x25\x55\x99\x6b\x9f\xf8\xfe\x91\x53\x49\x18\x8c\xa4\x1a\xe4\x93\x4f\x15\xb1\x21\x9f\x82\x5a\xbd\x6f\x1f\xcd\x00\x32\x67\xdc\x6d\x7b\xf5\x0f\xe8\x5b\xe6\xca\x92\xdc\x75\xb9\xf5\xd2\xf4\x25\x97\xc3\xad\xd7\xa6\x8f\x3b\xcf\xa3\x90\xde\xf8\xf7\xe9\x8d\x7a\x7a\xf3\x7d\xba\x47\xbf\x9d\xf0\xfa\x4d\xf7\xc5\x2f\xbc\x1c\x1d\xa7\xa6\x76\x97\x10\x10\xaa\x8f\xd6\x42\xad\xe6\x15\x34\xb9\x7e\xc4\x00\x50\x35\x00\xb8\xf8\x4f\x8e\xac\xa6\x5d\xde\x08\x29\x9f\xbc\x3f\xb2\x2a\xef\x1c\xb5\x69\x61\x53\x6f\x04\xb2\xfc\x61\x5e\xe8\x93\x99\x8b\xdf\x9d\xcc\xcc\xba\xf5\x93\x99\xff\xe2\x60\x66\xef\xdd\xc1\x0c\x80\x7a\xb9\x17\x3e\x3e\x99\xf9\x2d\x55\x5c\x3f\x83\x11\xbf\x3c\x78\x89\x4a\x2a\x14\xb3\xeb\x51\x65\xcb\xf0\x21\x38\xab\x83\x69\xea\x9b\x01\xe2\x2a\xf5\x51\x60\x17\xc9\x92\xca\xb0\x73\x78\xc8\x69\x0e\x45\x3d\x53\x52\xb8\x51\x66\x26\xd2\xdd\x0a\x52\x53\xf1\x8e\x93\xdf\x93\x47\x15\x59\x69\xcc\x2d\xcf\x5e\x3a\x59\x49\x43\xce\x8f\xa5\x70\x8c\x14\x24\x68\x46\x20\x71\xbf\xcb\x6d\xad\x9c\x26\xa4\x8a\x61\xc9\xd6\x45\xe4\xb0\x11\xd5\x0a\xae\x9c\xf5\x64\xeb\x44\x2b\x69\x44\x78\xae\x11\xaf\xd4\x91\xb7\xe3\x6d\x27\x50\x1f\xc1\xfb\xf1\x5f\x7e\x47\x8b\xe2\x91\x26\x76\x21\x10\xbb\x8c\xd6\x31\xa0\x3e\x93\x73\xc7\x52\x10\x0e\x42\x90\xce\x73\x56\x2f\xd3\x92\x62\x60\xca\xc2\x55\x49\x29\xd5\x92\x52\xf6\x9b\xf9\xc5\x42\x00\x6d\x65\x7b\x86\x91\x59\xc7\x92\xce\xad\x48\x50\x19\x90\x19\x61\x9f\xd3\xb5\xfb\xff\xbc\x81\x0a\x00\x9f\xea\x1c\x1a\xaa\x5b\xd6\xaa\x1f\xfa\xac\xf9\xaf\xd6\x8a\x7c\x55\x2f\x5d\xf4\x81\x9c\xbd\x13\xb7\x72\xfa\xaa\xd1\x7c\x43\x13\xff\xba\xb8\xb5\xa7\xe8\x29\xf4\x37\x50\x3c\x47\x6d\xd9\xf4\xa1\x64\xa8\xc4\x86\xc5\xa2\x45\x73\x96\x37\xc4\x47\x5d\xd5\xce\x09\x63\x2a\x9a\x51\xc5\x12\x14\xbb\x49\xc7\xf5\xec\xab\x8f\x36\x42\xcd\x50\xf5\xfd\x60\x04\x1b\x1d\x54\xe6\xe9\x6c\x6f\xcc\x0d\x03\x3e\x1b\x20\x17\x58\xdf\xdd\x7b\x03\xbb\xe8\x13\x1a\xa8\x24\xc9\xe2\x37\xdb\xef\xca\x6d\x60\xc3\x15\x7d\xbd\xac\xfb\x71\xcb\x69\x81\xf8\xab\x45\x4a\xea\xee\xbc\x67\xa3\xff\x0d\x82\x80\x4d\x2f\x7e\xcf\x7a\x06\xbf\x67\x3d\x83\x15\xd6\x53\xd8\xa8\x9b\xba\xc2\x61\x2a\xbe\x58\xb2\x99\x11\xf0\x96\x31\x13\xc4\x36\x23\xe0\x38\x63\xd6\x94\xcf\xa3\x03\x1a\x6b\x03\x20\xf1\xff\x0b\x1a\x12\xd2\xeb\x93\x92\x4f\x6a\xc8\x23\xfc\x08\x27\x00\x33\x9f\xbe\xc7\x09\x21\xe2\x04\xd1\x08\xb0\x8e\xde\xd6\x01\x6c\xeb\x94\xea\x53\x03\xc0\x67\x1f\x6d\x71\xc5\x4d\xd5\x61\xb8\x38\xd4\x0c\x68\xb0\x02\xc3\xb2\xd3\x82\x06\xcd\x10\x5a\xcb\x1a\x66\xd0\xcc\xc9\x2a\x58\x6f\x20\x5c\xd7\x79\xdb\x0f\x20\xb8\x9c\xc1\x15\x60\xca\x68\xbe\x82\x84\x10\x42\x91\x34\x56\xc0\x55\xa9\x2b\xbc\xbf\xd7\x27\x6f\x3e\x62\x1c\x84\xb3\x4a\x1c\x15\x5a\xf9\x24\x55\x6e\xc2\x3e\xb2\xe1\x5b\x13\x1f\x45\xc5\x31\xf3\x15\x1b\x01\xc9\x2e\x07\x75\x76\x39\x58\x91\x70\x2b\x4f\x1b\x29\xf0\xcc\x11\xf0\xcc\x31\xb2\xcc\x80\xc7\x82\x0f\xd9\xe5\x90\x06\xd6\x6d\x33\x29\x19\xe5\xff\x0b\x7b\x0c\xd8\xaa\xe2\x8f\x4f\x83\xff\x03\x7f\x7c\x71\xf7\xdf\xf1\xc7\x87\xde\x0a\x17\xac\xb8\x63\x3c\xf9\x59\x61\x9b\xeb\xab\xf6\x3e\x80\xfa\xd3\x58\x22\x81\xa7\x73\xf9\xdb\x55\xae\x08\xee\x15\x47\x90\x6a\x24\xa1\xde\x7b\x4a\x5e\x9d\xfa\x35\x2f\x09\xdf\x9e\x99\x72\x54\xf2\x7a\x2e\x93\x7f\x5c\xaf\x70\x5d\xea\xea\xf2\x87\x79\x39\xa4\x3f\xae\x81\x85\xba\x44\x16\x6a\xe3\xe4\x97\x41\x18\xdd\x83\x27\x45\xfe\x27\x13\xc6\x1f\x4d\x4e\x7f\x0e\xe8\xdd\x23\xd9\x62\xdf\x65\xf2\x99\x15\x8e\xd8\x36\xa0\x84\xe3\x3e\xfd\x76\xcc\xe9\xf6\x41\x45\x0b\x30\x93\x89\x03\x15\x07\xe9\xcc\x4a\xfc\x2d\x76\x1a\x57\x36\xce\xfd\xc7\x60\x5a\x6c\x4e\xf8\x38\x16\x93\xcd\x3f\x1a\x65\xa5\xc6\x1f\x9b\xa3\x62\x33\x7b\x9c\x6c\x16\xd3\x3c\x7f\x1c\x4f\x44\x88\x26\xcf\x93\x3b\xb1\x19\xdc\x3d\x16\x22\xdb\x0c\xee\xf8\x78\x82\x56\xd1\xd6\x1f\x44\xf7\xe5\x3e\x64\xc7\x99\xa9\x3b\x4e\xaf\x66\xbc\xcc\x4a\x7c\xc6\x6e\x7a\x1d\x3d\xdd\x18\xdb\xf5\x5a\x39\xcc\x90\x20\x82\x55\x30\x61\x5b\xc5\x28\x3d\xd3\xb1\x8e\xa6\x80\xb9\x2f\xcd\xa3\x03\x7a\x73\x45\xe8\x95\xda\xb0\x78\x8d\xaa\x82\x51\x9d\x69\xbf\x36\x8b\x45\x3d\x85\x8f\x05\x5f\x4d\x29\x26\x22\xcf\x45\xb8\x37\x16\x5c\x77\xed\x6a\xb5\xd7\xf3\x43\x62\x18\x65\xe6\xed\xdf\x57\x32\x67\x73\x8e\x96\x0e\xca\x7e\xef\xcc\xd1\x3a\x4f\x56\xe2\x2b\x1d\x9a\xd3\xd8\xc6\xdf\xfb\x43\xfb\x11\x30\xf3\x76\xad\xfa\xe8\x98\x5e\x5e\xd1\x73\xa2\x5c\x7a\xba\xc3\xb9\x57\xad\xc6\x75\x56\xe4\x22\x18\x45\x23\x11\x6e\x3e\x8e\x47\x22\x9b\x70\x00\x08\x98\xdf\x0d\x0d\x8e\x6f\xca\x3f\x47\x2f\x2e\x1f\x63\x4c\xc5\xed\x29\x41\xac\xec\x13\x36\x2f\x3b\x75\x15\xdb\x21\x3b\x1f\x3a\x42\x03\xb0\xe3\xb3\x8b\xa1\xf2\x94\x63\xc5\x91\xf4\xf8\xe5\x60\xd9\x8b\x3b\x3b\x64\x17\x43\x2a\x74\x26\xf5\xd9\xf9\x50\x93\xcd\x5e\xbc\xac\x94\x49\xd4\x6e\xb1\xae\x39\x46\x00\x6a\x39\xb1\x76\xae\x56\x9a\xbe\x46\x6e\x0c\x0c\x1a\xba\x67\x51\x9e\x72\x71\x2a\xdc\x62\x8f\x37\x12\x7a\x55\x78\x34\xa1\xdf\xef\xe8\xeb\xb1\xb4\xb7\x54\x6e\x7b\xaa\x69\xb9\x42\xf0\x6c\xf2\x97\x51\xb1\xf9\x30\x2d\x26\x9b\xbe\xd8\x7c\x8c\xa4\x41\xfe\x8c\xa7\x53\xa1\xe1\xef\x3e\x72\x13\x8f\xa5\x4e\x80\x3f\x78\x3a\x9b\x39\xd2\xf9\x0f\xbb\x3f\x34\x0c\x33\x63\xdc\x4a\xdd\x96\x67\x5d\x06\xd6\xdd\xa8\x98\x3c\xc6\x63\xfe\xd0\x9d\x06\x89\x98\x14\x32\x10\x6f\x50\xed\xba\xd2\xeb\x8b\x6f\xf5\xcc\x16\x61\xec\xe0\x8e\x8c\x6c\xad\x30\x75\x5d\xc2\xa0\x9c\xdf\xa2\x67\x87\xac\xad\xe1\x0c\x4d\xf4\x3a\xd1\x81\x2d\x0e\xb4\x4b\x6e\x39\xb5\x97\x87\x12\x36\xba\x3d\xf9\xbb\x3f\x90\xbf\xc1\x81\x1d\xb2\xaa\xf0\x32\xac\x5d\x6f\x86\x6c\xe3\xfb\x9d\xa3\xf1\x90\x9e\xc7\x80\xba\x59\xe1\xd1\x16\x0d\xe9\xfe\x11\xcd\x88\x23\xdc\x96\xa7\xb1\x55\x7d\x35\x7f\x1e\xcb\x4f\xdc\xf4\xec\x12\x72\x5a\x88\xf5\x51\xb3\xa1\x5a\x0f\x68\x4c\xae\x83\x24\x75\x08\x58\xb2\xe4\xc5\x2f\x4b\x2e\x87\x7a\x22\x9c\xcb\xa1\x25\xdc\xaf\x81\xa7\x71\x1e\x86\xed\x2e\xb1\xee\xd5\xaa\x05\xe1\x99\x54\xc4\xf1\xd1\x6e\x52\xb9\x67\x7a\x4f\x0d\x7e\x1e\x2f\x6d\x5f\x2f\xe0\x07\xf9\xdd\xde\xd2\xae\x1f\x53\x56\x8e\x5d\xea\x7b\x6e\xd0\xe0\x8d\xeb\x07\x4e\xf7\x8f\x39\xf5\xad\xc7\xa1\xb4\x2b\x86\x0f\xdf\x87\x9d\x1b\x74\xbb\x1d\x52\xf8\x0c\xb1\x6f\xe5\x1b\x71\x7c\xab\xc7\x51\x63\xcc\x3a\x7b\x82\xed\x55\xb9\xf9\x0c\xad\x69\xa2\x8c\x63\x02\xeb\xd4\x24\xd2\x63\xbb\x3c\xc4\x0c\xac\xe9\x83\x89\xe1\x6c\x02\xf7\xd8\x33\x23\xda\x02\xd6\xea\x9d\x01\x99\x36\x7d\xb0\x0e\xb8\x19\x51\x6e\xc5\xdc\x1d\x20\x8b\x43\x16\x8b\xf3\x25\x1a\x64\x87\x1c\x9d\xd8\x9e\x4d\xec\x94\x4e\x27\x76\x8c\xce\x7d\x53\x06\x8b\x6c\xc5\xdc\x9a\x3c\x3e\xa6\x93\x51\x4e\x12\x2b\x14\xec\x6a\x88\x1e\x15\x5b\x1e\x8d\x64\xc7\x95\x29\x0d\xf4\xdd\x8d\x3d\x16\x2d\x7d\x2b\xd5\xee\x24\x65\xcf\x43\x2b\xbc\xd5\xde\xe6\x05\xfb\x21\xfd\x0b\x50\x4c\x8d\x3c\x42\x7d\x0b\x39\x3c\x41\x68\x90\x98\x81\x75\x30\x36\x23\x82\x2a\xfe\x56\xea\x46\xb0\x7d\x98\x4e\x74\x7c\xeb\xdb\x13\x0b\xad\x83\xbf\x1c\xdf\x9a\x26\x38\x3b\xce\x86\x6f\xf5\x27\x2c\xb4\xfa\x13\xc7\xb7\xc6\x7d\xc9\x34\x5c\x22\x9a\xe2\x40\x5b\x01\xa4\x8a\xc4\xe1\x40\x6f\x57\xba\x05\xed\x6b\x57\xa8\xb0\x3e\xf0\x35\xac\x62\xf1\x30\x34\x43\xeb\x49\x10\x47\x30\x68\xd3\x85\x17\xaf\x72\xf1\x22\x48\x95\xca\x42\x57\xcc\xbd\x52\xe7\x40\x6c\xc9\x84\x9a\x6b\x8f\x34\xdd\x2c\xc4\x78\x24\x8a\xcd\xc7\x6c\x93\x6f\xc6\xa3\x99\xc8\x36\xdf\x21\x98\x3b\xb1\x59\xf0\x07\xb1\x59\xfa\xff\xf8\x83\xe0\x38\xdc\xd0\x3d\xf2\x3c\x66\x56\xcf\x8b\x45\x8b\x34\xda\x8e\x60\x30\x24\xd9\x89\xc5\x02\x47\xab\x5f\x99\x70\x84\xae\x27\xea\x95\xea\x17\x2b\x3f\xeb\x7b\xe4\x6d\x89\x5b\xe4\xcc\x09\xac\xaf\x78\x0a\xa0\xc4\x64\x73\x9d\x29\x0b\x59\x60\xa5\x2e\xc7\xc9\x08\xac\xfb\xd0\x30\x42\x94\x38\xd8\xcf\xe3\xd2\x19\xa6\xde\x0c\xd6\xa5\x19\xf5\xa9\xf5\x27\xa1\xb5\x14\xd1\xa7\x6d\xe2\x61\xd8\xb6\xbe\xe7\xf6\x3d\xfc\x22\x72\xf8\xa3\xd0\x0e\xad\x51\xa8\xb5\xd5\x0f\xe6\xca\xae\x46\xfb\xda\x3a\xb8\xb3\xdf\xee\x63\x3b\xa1\x17\x91\x9d\xd0\x1f\x33\x3b\x06\x28\xfc\x09\xbf\x6d\x8f\xbe\xb4\xed\xc3\x2e\x7d\x6d\xdb\xfd\x2e\x3d\xf2\xe1\xef\x09\xfe\x9d\x4d\xec\xad\x16\xbd\x38\x40\x93\x4c\x42\x47\x59\x28\x5e\xd0\xdc\x35\xb4\xfa\xf3\xa5\xf2\x76\x13\xaf\x3a\xf4\x52\x5d\x5b\x12\x00\xd2\xbe\x61\xc4\xd6\xfe\x9d\x09\x8f\x84\xfe\xdb\xde\xc6\xef\x3e\xe1\xf8\x2e\xf7\xd8\x56\x0b\x39\xeb\x9f\x66\x60\xa5\x6b\xc2\x95\xef\x06\xde\x62\x61\x86\x66\x20\xef\xf7\xb7\x00\x59\x1d\x18\x46\x68\xc2\x2f\x91\x06\xc2\x72\xb2\x03\x24\x29\x72\xc6\xbb\x3d\x78\xaf\xba\xd3\x6c\x2b\x83\xc1\x9c\xaf\xcd\x1c\x0e\xea\xf2\x98\xcb\x31\x6d\xc8\x0e\x36\xdb\xef\x6d\x0a\xb7\xf5\x09\xe5\xea\x05\xa5\xd6\xe1\x63\x18\x6c\xf7\x13\x6f\xd4\xe2\x72\x85\x78\x83\xd9\x64\x95\xa6\xdf\x67\x2c\xb5\xac\x90\x58\xdd\x57\x44\x0b\x7d\x45\xa8\x88\xd4\xca\x63\x04\x95\x01\x79\x2f\x1e\xcd\x9f\x0f\x9c\x28\xbb\x95\x8b\x47\xb3\x48\x39\x51\xa6\x9b\xc9\x31\xff\x08\xf3\xa2\xf9\xab\x61\x98\xed\x83\x3f\x95\x89\x1f\x27\x8b\x85\xd5\x6a\x7f\xd1\x6f\xa4\x13\xa9\x18\x0f\x76\xac\x1e\x96\x04\xd5\xa1\xce\xd0\x03\xab\xa2\x06\x3f\x8f\xed\xcb\x43\x9a\xb3\x16\x46\x53\x01\xbc\x40\xa7\xac\xe5\x4c\x77\x0b\x67\xaa\x31\xee\x0c\x73\xa6\x1e\x9d\x33\xbf\xcb\x1b\xd3\xc6\xb5\xa8\xbc\xbe\xfa\x8f\x26\x47\x02\x80\x59\x84\xbc\xe5\x8d\x86\xf2\x41\x0c\x0c\xb3\xe4\xf5\x1a\x67\x77\x74\x7e\xcc\xe9\xf0\x90\xd0\x1e\xe3\x6a\x47\xcc\x1b\xfd\x03\xda\xcf\xd0\xab\x6e\x8f\x31\xd6\xcf\xb8\x73\x66\x18\x66\x8f\xcd\xac\xfd\xd8\x0a\x7c\xad\xd0\x72\xc6\x2e\x74\x53\xee\xbc\x91\xde\xd1\xf4\xce\xa3\x67\x1d\xeb\x4f\xbb\x4d\xe8\x29\xfb\x56\xcb\x9c\x1c\xd3\xc9\x31\x2a\x8c\x5c\xb0\xd6\xee\xa9\xd3\xfa\xc2\x4e\x0d\xc3\x3c\x65\x7f\x11\xe7\xf4\x33\xdb\x71\x5a\xbb\x1b\x98\x80\x66\x5c\x52\xe5\xe6\x6d\xa9\xcc\xca\x66\x40\x23\xb6\x3d\xc3\x78\xe2\xe6\x25\x55\x6f\x5a\xa7\xa6\xfe\x95\xeb\x43\x7a\x7d\xe8\xd1\x1d\xe2\xd4\xc6\x38\x3c\xa0\xd7\x57\xf4\x3b\x41\xbf\x2b\x2a\xed\xf9\x6b\x69\xb1\xdb\x63\xdf\xae\xcd\x1e\xa1\x5d\xb6\x77\xcc\xdd\xae\x47\x1f\x38\xe3\x56\x0f\xf7\xf2\x00\x1e\xe3\xc8\x6d\x79\x92\x39\xd3\x8e\x48\xd0\x46\xf7\x88\xb3\x07\x4e\x51\xf1\x01\x0a\x1e\x71\x28\xf3\x20\xb5\xf6\x4b\x1b\x93\x21\x14\xb2\x04\xa7\x87\x82\x0d\xf0\x61\xe0\xeb\xf1\xc0\x17\xbe\x07\x6c\x7e\x4f\x33\xc1\xe6\xf7\x68\x76\x72\x6a\x12\xc3\x78\x18\x99\x3e\x50\x50\x04\x49\xc3\x30\xbf\x07\x2c\x84\x32\x01\x71\x1e\xb8\x74\x59\xf7\x3d\x30\x87\xd2\x1e\xeb\x81\xbf\xa8\xb7\xa7\x80\x2c\x9d\x2e\xeb\x9a\xd8\xcc\xaa\xbf\x0b\x86\x0d\x72\xda\x02\xe6\xfd\xf5\xca\x1c\xf2\x4a\xac\xde\xfc\x0e\x9b\x6a\xf9\x11\x91\x7e\xbd\x32\x0f\x05\x55\x75\x07\x3e\x6c\xfd\xb7\x31\xcf\x62\x61\x3f\x70\x9a\xec\xd9\xa7\xd5\x94\x8e\x26\x9c\xfe\x8d\x2c\x6b\xbe\xad\x59\x97\xbc\x3d\x70\x76\x55\x95\xb9\x1e\xd0\xc4\xda\x37\xbb\xd6\xf5\xc4\xea\x3f\x98\x40\x55\x37\x0e\x73\xde\xc8\x89\x33\xe0\xc0\x29\x74\xdd\xed\x8f\xec\xde\x33\x81\xf7\x17\x84\xfa\xa5\xf5\xca\x90\x5b\xd7\x7d\xd3\x97\xa6\x1b\x0e\x67\xdc\x6d\x7b\x4e\x65\x14\x72\x28\x20\x5b\x59\x76\xa8\x71\xba\x3e\x95\x0a\x5d\xd6\xf5\x81\xda\x54\xce\x11\x67\x45\x66\xf6\xdc\xbe\x47\x87\xc4\x09\x32\xf3\x88\xd3\x33\xe5\x42\x24\x60\x63\x99\x45\x9c\x22\x00\x8c\xab\x32\x44\x58\x1f\xd3\xe1\x21\x7d\xe0\x2b\xc0\x35\x95\x52\x92\x61\x98\x22\x6c\xb0\xb1\x68\xc0\x98\x11\xe7\x1c\x5f\x99\x2e\xe2\x12\xf5\xfb\xed\xca\x2c\xee\x08\x5e\xff\x9c\x5c\x99\x3b\xc4\x2b\x9f\xbb\x56\x91\x13\x8f\x10\x39\x4d\xc4\x49\x25\x4f\x02\x68\x75\x66\x8d\xc2\xc6\xcf\x9c\x53\xe9\xce\xea\x81\xd3\xed\x18\x48\x0a\x32\x4d\x03\x5e\xf9\xae\x9a\xa1\xef\xaa\x9b\xd8\x3e\xae\x6d\x91\x71\x9f\x8e\xfb\x1e\xdd\x6a\x49\xcb\x2b\x60\xaf\x5a\x34\xe6\xf6\x25\x3d\xf8\xd3\x9e\xd2\x1b\x61\xcf\xac\x1b\x41\x67\x91\x3c\x44\x91\x3e\x40\x7b\x34\xec\xdb\x67\x74\x3f\xb6\x8b\x80\x9e\x04\xf6\x11\xa7\xc3\x99\x2a\xd0\x97\xbf\xe8\x43\x2b\xa3\xe7\x07\x75\x98\xf8\xda\xe5\xc8\x04\x8e\x32\x71\x83\x0a\xfd\x43\xca\x43\xfb\x94\xfe\xfc\xbb\xdd\xde\xa1\x1b\xc1\xb3\xfd\xc1\x3e\xa5\xe7\x27\x76\x7d\x53\xcf\x06\x74\x36\xf0\x68\x9b\xd0\xa3\x13\xfb\x82\x26\xb6\xeb\xd1\x9f\xd7\xf0\xf7\x09\x3a\xfb\x24\x68\x7f\x6e\xbf\xdb\xdb\xf4\x60\x6e\x8b\x70\x49\x96\xf0\xbf\x8a\xa0\xdc\x96\x04\xa5\xb4\x94\xd6\xb6\xc8\xd2\x57\xa4\x72\x78\xa5\x62\x85\xba\x5e\x69\xc9\x7b\x64\x12\xa7\xd1\x48\x4b\xed\x0b\xab\x67\xa6\x84\xe6\x80\x20\xee\xcd\x94\xce\xee\x80\x45\x6c\x31\x96\x76\x1e\x0a\x3b\x29\xa4\x32\x33\x63\xa9\x61\xe4\x5b\x8c\x3d\x14\x25\x03\xb6\xf7\x28\x5d\x30\xe5\x98\x8a\x1a\x0e\xbb\xd5\xa9\xc4\x69\xce\x1b\x69\xe3\x1c\x59\xbd\xb7\x98\xdb\x6f\xcb\x6a\x41\xb3\xa5\x13\xb1\xb7\x69\x20\x67\xfc\x46\xa0\x9f\xed\xa5\x13\x4a\x6e\x75\xd9\x62\x2c\x36\x8c\x9c\x31\x96\x14\xa8\x60\x10\x00\xd9\x88\x19\x46\xd2\x12\xec\x0d\x97\x28\xae\x35\x47\xb1\xfd\x25\x95\x8d\x46\xd0\x22\x0a\x5e\x32\x2a\x98\x00\xca\x17\x33\xc6\x82\x83\xce\xdf\xed\xb6\xee\xb3\x6c\x3c\x6e\x36\x69\xb6\xc5\x98\x40\xde\xb2\xec\xfd\xcf\xac\x1c\x1b\xbb\x2d\x0c\x43\x00\xa6\xcb\x2b\xe6\x93\xe7\x1c\x7d\x23\x40\x22\x53\xbf\x78\x6f\x21\xbd\x6c\x43\x2f\xac\x69\x00\x1d\x89\x00\x0a\xe7\xcf\x76\x4e\x7f\xce\x6d\x55\x12\x46\x5b\x56\x87\x0a\x29\x3a\x66\xaf\x4f\xdf\xd5\x23\x6f\xc4\x6a\xfa\x36\x5a\x4e\x86\x11\xa6\x90\x21\x86\x05\x97\x6b\x19\x48\x2e\x3b\xc5\xb9\x87\x29\xdc\x65\xa2\x62\x8f\x2f\x25\x6b\xfc\x3f\x7f\x34\xd2\x46\x9c\x72\xe2\xe4\xc0\x40\x37\xda\x9e\x03\x13\x9a\x7a\x12\x77\xe3\x20\x0d\x23\xaf\xa4\x97\x5d\x06\x74\xc2\x30\xcc\x46\x43\xe0\xd4\x84\xae\xf0\x56\x67\x67\x1b\x66\x07\xdb\xb8\x11\x4c\x68\xfd\xfb\xf0\xd6\x0e\xe8\x34\xb1\x43\xda\x9f\xd8\x19\x3d\xf8\xcb\x4e\x6a\xb6\x0f\xfc\xb4\x66\x09\xbc\xc5\x98\x5f\xf5\x74\xff\x31\x9d\x3e\x64\xc8\x9b\x57\xac\x7b\xf0\x98\x15\xa3\x62\x22\xb2\x89\xbd\x29\x9e\xa6\x3c\xc5\xa3\xab\xf0\xf1\x81\x8f\xb2\xcd\x00\x6b\x14\x9b\x3c\x93\x27\x5a\xfa\x7d\x94\x55\xfc\x3e\x8a\x06\xd6\x1f\x2b\x9e\xfd\x6e\xd6\x63\x54\xe2\x76\xc1\xa8\x61\x6a\xb3\xc8\xab\xa7\x40\xf1\xdd\x95\xc3\x79\xdc\x37\xcd\x1d\x9a\xae\x6b\xf5\xc0\x58\x00\x92\x70\x4c\xc7\xab\xd2\x89\xee\x96\x1e\x93\x18\x4d\xee\xc4\x58\x4a\x22\x8f\xe3\xcd\xc7\x34\x6c\xe2\xb3\x2a\x07\x7d\xa5\x99\x92\x1a\xb1\x3f\x7f\xe8\x22\x7f\x28\x80\x8e\x70\xbf\xb6\x60\xbf\xb6\x9c\x9d\x2f\xb9\xd3\x68\xe4\x3a\xbe\x1f\xe4\xe4\xd2\x64\x23\xbe\x37\x73\xd8\xc9\x4e\x6a\x06\xc4\x81\xa9\x8f\x68\x41\x9c\xe2\xdd\x4e\x2c\x96\x4e\x01\x92\xa8\x9c\x57\xe6\xe6\x9e\x23\x00\x20\x0b\xe2\x64\x6e\xe0\xb1\x5c\x99\x3a\xdd\x08\x3b\x07\x28\x7e\x28\x00\x8c\x5b\x54\xed\xdd\xa5\x74\x41\x01\x9d\xc9\x77\x93\xaa\x33\x53\xb6\xd3\xc8\xe9\x6f\xba\x94\xff\xef\x8e\x61\x40\xbf\x42\x37\x6f\xb6\x11\xbc\xa0\x83\x3a\x22\x45\xe0\xa1\xd6\x17\xf4\x10\x63\xe9\x55\xfd\x45\xc4\xae\xf6\x3b\x76\x1d\x7a\xe9\x4e\x3d\x89\x3c\x0a\x52\xf5\x77\x46\x37\xe6\xcf\x76\x50\xf6\x37\x07\x1c\xaa\xa5\x49\x58\xe0\xd3\x98\xbc\x25\x2c\xaa\x02\x39\xe4\x2c\xc5\x81\x68\x1c\x99\x93\xb7\x0f\x87\x20\xf1\x23\xcb\x57\x11\x24\xcb\x0d\x23\xf8\x18\x43\xc2\xd7\x4a\x14\x99\xae\xa0\xc8\x1c\xf7\x78\xf4\xd1\xc2\x24\x2b\x28\x52\x20\x8a\x14\xd2\x15\xc4\x12\xf8\xf3\x74\xb1\x08\x14\xf0\x05\x08\x7c\xa8\x91\x18\x62\x9c\x03\xe6\x9b\x09\xb0\xff\x72\x0e\xd3\xfa\x04\x2a\x5c\x29\x5b\x4f\x2a\x5c\xa9\xbc\x4c\xd0\x94\xa5\x1a\x57\x42\xbf\xfd\xe3\xce\x8e\x42\x9a\x01\x22\xcd\xc5\x42\x26\x13\xe0\x24\x9b\x4d\x5a\x6c\x31\x16\xad\x48\xe6\x1a\x79\x06\x0a\x79\x46\x72\x99\x56\x91\xa7\x4a\x64\xea\x17\x91\x67\xac\x91\x67\xa2\x90\x67\xa2\x90\x27\xae\xa2\x2a\x29\x91\xa7\x7e\xc1\xa8\x8f\xcb\xb5\x89\x05\xe4\xb9\x21\x89\x0f\x67\x2d\x27\xc2\x03\x97\x12\x79\x4a\x68\x0d\x25\xf2\xcc\x71\x55\x04\x22\x4f\xfe\x11\xf2\xcc\x25\xf2\xf4\x99\x70\x79\x03\xb5\xb0\x42\x37\x47\xe4\xe9\x1f\x7b\x8b\x85\x7e\x91\x98\xd4\x37\x0c\xbf\x8e\x49\x03\x8d\x49\x39\x8d\x90\xc8\xf0\x8f\x30\x29\xb6\x71\x23\x18\x5f\xd6\x50\x69\x08\xa8\x54\x00\x2a\x8d\x00\x95\xc6\xcb\xe5\x8d\x35\x3a\x5c\x33\x1d\xe6\xaa\x1f\x6b\x16\xc1\xe8\xb5\x08\xe1\xa5\x42\x7d\x3f\xd6\x51\x5f\xe0\x1e\x01\xf2\x0b\xac\x98\xa3\x07\xa6\x1b\x41\x63\x29\x3a\xd1\x84\x8d\x06\x0d\xbf\x71\x2d\x68\xca\x84\xbb\xed\x2d\x16\x02\xbe\x82\xd6\x92\xd7\xbe\xf5\x7c\x68\xa6\xc8\xc5\xe6\xf2\xfd\x82\xcb\xf7\xc5\xe2\x9c\x16\x2c\x44\xb9\xaf\x65\xef\xd0\x29\xc8\x34\x31\x75\x13\x2d\x35\xc9\xac\x7f\xd8\x2d\x0c\x42\xca\xd8\xe5\xe1\x62\x11\x32\x56\xf4\xf0\x07\x6a\xed\x4e\xed\xad\x96\xd3\xc2\xb8\x33\xe6\x94\xe9\x0a\x7f\x11\x67\x2a\x85\x2b\x4c\x47\xd9\xca\x67\xb1\x75\x69\x26\x20\xe3\x71\x6b\xea\xbb\x26\xc7\xab\x0b\xc3\x90\x95\x50\xe1\xce\xff\xbc\x43\x6c\x9f\xfc\x2f\x16\x18\x78\xe8\xe1\xe5\xdb\xb5\xe9\x6b\x03\x13\xed\x12\xb4\xea\xc4\xfe\x80\xcc\x41\x1a\x94\xdd\xee\xd1\x49\xcf\x23\x74\x0e\x0c\xb4\x0f\xbc\xf5\xbc\x8c\x7f\x53\xd5\x0c\x0e\x88\x4a\x53\xa7\x02\xc5\x64\xfc\x98\x08\x1b\x2b\x4c\xb9\xbd\x43\xf1\x98\xc0\x97\x87\x04\xbd\x7f\x53\x6c\x2e\x96\x20\xaf\x1e\x43\x17\xbe\x8e\x39\xc8\x9f\x67\x9d\xae\xdd\xa3\x5d\xf6\xb6\xff\xa7\x1d\x3c\xca\xae\x9d\x8c\x39\x3d\x19\x73\x10\x53\x7b\x76\x97\xd0\x6e\x95\x35\x18\x73\xba\x31\x80\xbc\x53\xb2\x74\x8a\x72\x11\x94\x50\x59\x10\xa7\x07\xb2\x02\x7e\x57\x62\xaf\x33\x9c\x4a\x37\x69\x4c\x9f\x39\x9d\x3e\x73\x0f\x4f\x4b\xe8\x49\x46\x48\xcf\xca\x52\x76\xe6\x9c\x95\xad\x6c\x17\x9c\x6e\x17\x1c\x43\x7d\x9d\xd6\xa7\x81\xfd\x3c\xc6\x19\xd4\xab\xca\x8a\x1e\x39\x05\xf1\x1d\xab\x7d\x7d\xe1\xf4\xeb\x0b\xf7\xa8\xc4\x48\xaf\x07\x4b\x42\x1f\x47\xe6\x29\x41\xe1\x59\x26\x9e\xaa\xeb\xe6\x8b\xca\x55\x6b\xb5\xa4\xe5\x39\xd8\x25\xe3\xd6\xe8\xd0\x0c\x60\x96\x2e\x3b\x7c\xe5\x3c\xcc\xe6\xf5\xc3\x30\xe7\xd2\x30\xcc\x0b\xb6\xd5\x26\xcb\x4b\x86\x6b\xdb\x99\xdb\x7a\x25\xcf\x48\xf5\x01\xa2\x46\xd0\xed\x11\x29\x8b\xc3\x74\x3c\x4e\x38\xbd\x3c\xe6\x84\x0e\x01\x64\x86\xf0\xfb\xe6\xf3\x20\x89\xc7\x8f\xd3\x2c\xb4\xdf\xf6\x63\x68\x6b\x28\xdb\x5a\x2e\x1d\x75\xca\x0f\x1d\x35\x0c\xd5\x45\xc3\x30\x67\x4c\x0b\xe8\x0f\x9c\xf9\xc8\x04\x09\x34\x1d\xaf\xdc\x9d\x8d\x42\x1b\xf7\xd1\xad\x50\xfb\x4a\x0a\x44\x79\x85\xb5\x03\x24\x90\x5a\xce\x41\x7e\x57\x20\x73\xa9\xa4\x22\x9c\xe2\x71\x9f\x6e\x68\x91\x68\x16\x81\x3c\x25\x85\x1e\xbf\x14\x7a\x2e\x41\xe6\xe9\xd1\xef\x07\xf6\x29\xed\x81\x10\x33\x9c\xd9\x73\x90\x7c\xba\x52\xec\x09\x95\xd8\x13\xd3\xe4\xbd\xc8\x53\x80\xc8\x33\x55\x22\x8f\x94\x78\xf0\xb3\xc3\x03\x3a\x3c\xf0\x56\x44\x1e\x4c\x5f\x11\x77\x66\x6b\xe2\x8e\x2e\x74\x36\xa0\x67\xd2\xfe\xa6\x3f\xb7\x25\xf6\xba\xe8\x5c\xc8\x21\x25\x28\x01\xb5\x50\x02\xba\x92\x09\x87\x87\x34\x5f\x71\x20\x2d\x27\xb4\xbc\x06\x2e\xd3\xa3\x15\x7d\xc0\x18\xdf\xdc\xae\xef\x99\x6e\xd8\xf0\xa9\x5f\x57\x1e\x8c\xeb\x45\xdd\xb0\x71\x31\xe3\x0d\xde\xb8\x16\x0d\x9f\x86\x8d\xcb\x19\x6f\xf8\xb4\x96\x84\x09\xde\x52\x7b\x83\x3a\x94\x01\xaa\xb7\x92\x15\x3f\x15\x3e\x7b\xdb\xf7\x51\x3f\xfd\x05\xfe\x4e\xbf\xc1\x5f\x9c\x00\x3e\x16\xbc\x80\x07\x54\x5f\x7f\xea\x23\x1b\x53\x29\xc9\xbf\x2d\x95\x21\x40\xa2\x03\xe5\xaa\x60\x43\x89\x9b\x79\xc8\x4f\x49\x30\xc9\xc9\x62\xa1\x51\x2f\x3c\xfb\x7d\x3a\x65\xfc\xd1\x0c\x68\x6c\x16\xb4\x7f\x47\x68\xef\x98\x13\x7d\x83\x38\x55\xb7\x5b\xdd\x9e\xed\x5b\xfb\xbe\xa4\x99\xf5\xcb\xa5\xbb\x3d\x6e\xfb\xd6\xe1\xcb\xfb\x9c\xde\x18\x72\xa6\xdf\xde\xe7\xcc\x8e\x6d\xdf\x4a\xde\xa7\x17\x3d\xdb\x77\xf7\xf7\xbc\xf7\x39\x97\x87\xb6\x2f\x35\xa3\x56\xd3\xbf\xdb\xf2\x45\x7b\x28\x28\x89\xf0\x71\x36\xe3\xe9\x28\xdc\x1c\x65\x13\x31\x9e\xf1\x74\xb3\x98\xbc\xa6\xc2\xde\xfc\xa3\xb1\x31\x25\xce\x12\xd9\xfd\xb4\x93\xba\x85\xfa\x98\x0d\x8f\xc0\xc3\x2e\xdb\xbb\x38\xd0\x81\x67\x18\x2d\xc6\x70\x68\x68\x6b\x02\x4f\xcc\xc5\x3c\xb4\x5c\xd9\xf7\x5d\x55\xb0\xd9\xf6\x64\x8c\x88\xd6\x96\x2e\xff\xbf\x3b\x35\x7e\x60\x32\x0a\x92\xa6\xee\x48\xc5\xd1\x87\x22\x1a\x65\x22\xdc\xf4\x5f\x37\x79\xb6\x29\x66\x02\x20\xe0\xc1\x17\xe3\xcd\xc7\xa8\xc6\xd6\xab\x76\x71\x5e\x56\x1b\xde\x1b\x0b\xfe\x7f\x6f\x17\xc3\x8f\xe1\x34\x90\xb7\xa9\x8c\xd3\x09\x00\x70\x7d\x48\x88\x93\x01\x19\x93\xef\x09\x9a\x13\xe7\xec\x56\x27\xf4\x0f\x08\xfd\x79\x6f\x1e\x00\x7a\x3b\x87\x9c\xeb\xa1\x99\x53\x01\x95\xd6\xa8\x53\x2e\xa9\x52\x4e\xf7\x41\xce\x9e\x72\x7b\xba\x84\xf2\xe5\xa7\xa6\xe3\xd2\x0e\x5a\x26\xe4\x73\xed\xd8\x28\xa9\x12\xf7\xa1\x14\x9d\x55\x09\x93\x63\xf4\x6b\xf4\x0e\x64\xe9\x5c\x06\x16\x8d\xcc\x82\x3e\x1f\x12\x42\xf1\x94\x57\xbe\x0f\x0f\x08\xdd\x90\x68\xa6\x27\x5b\x82\xd4\xd9\x80\x00\x8e\x99\xb2\x37\x09\x1d\x53\x7d\x44\x4f\xc7\x09\xb7\x73\x3a\x49\xb8\xcd\x69\x91\x70\x3b\xa1\xfc\xd4\x9e\xd1\x97\x7b\xc0\x79\xcf\x76\x17\x90\x55\x6f\xe9\x70\x06\x60\x53\x8b\xf2\xc5\x75\x90\xb6\x9c\x71\xd8\x76\xbe\xf5\xd4\x07\x31\x7f\xba\x7c\xef\x80\xec\xba\x7e\xd7\xe3\x5e\x1e\xd2\xa2\x47\xf7\x07\xb4\xdb\xa3\xc1\x81\x47\x03\xf6\xb6\x74\x7e\xae\xb8\xe5\x04\x54\x13\xb8\xdc\x63\xfe\x12\xa6\xed\x7a\x84\x24\x28\xfd\xd8\x27\x83\xd6\x0a\x0b\x5c\xdf\x3d\xf2\x50\x13\xac\x52\xbe\x71\xb9\x57\x43\x84\xc3\xb5\x8b\x59\xbd\xf7\xfd\x4a\xa3\xa1\x76\x85\x0c\xac\xaa\xd5\x9f\xe0\x6d\x78\x09\x8a\xb7\xf2\x1e\xbe\x50\xf0\xb5\x19\xf0\x2c\x7b\x5c\xb9\xa7\x2f\x26\xe3\x51\x16\xff\xa1\x95\xc2\xf0\xae\xae\xa5\x05\xe6\x7a\x53\xbd\x4a\xaa\x35\x0b\xf2\xef\x5a\x0a\xcb\x73\x6a\x51\x3f\xa6\x0e\xdf\xeb\x10\xdc\x89\xcd\x97\xdf\xab\x10\xf4\x87\x66\x48\x61\x6c\x14\x59\x01\x69\xc5\xf1\x61\x43\xaf\xff\xb6\x21\x41\x03\xdd\x4a\x0d\x5d\xd5\x14\x43\x40\x28\x4c\x43\x1c\x7f\xe9\x90\xe9\xc3\xa9\xed\xd5\x8f\x2d\x7e\x39\x1d\x74\x73\x34\xd9\x2c\xee\x1e\xa7\x69\x08\x99\x93\x3b\xb1\x59\xae\x09\xde\x70\x06\x8f\xd9\x64\x94\x4d\x1f\xa7\x85\x3e\x08\x81\x21\xfc\x41\x9c\x8d\xfe\xd0\x0c\xea\xc3\x5e\x5e\xde\x9b\xdc\xba\x8f\xd6\x2e\xc4\xe4\x6c\xe3\xba\x05\x9e\xe2\xdb\x7e\xb3\x6e\xd1\xe3\x58\xde\xa7\xfe\xcf\x1f\x8d\xa0\xf1\xc7\xef\xd6\x11\x03\x9f\x84\xe5\x7d\x64\x19\x8d\xe9\xe9\x1c\xbe\x54\x06\xf0\xb8\x1b\x1b\x86\xd9\xda\x0d\x4b\x25\x9f\xb0\x54\xee\x09\xeb\x4a\x3d\x32\x2c\xc2\xdd\x98\xb5\xf0\x92\x4e\x0e\xa7\xb7\xea\x33\x5f\x46\x7f\x58\x12\x07\x33\xe3\xe8\xc3\xcc\xda\x16\x09\x4e\xb5\xfb\x2c\xd5\x9d\xe1\xd0\xe4\x84\xe8\x28\xe8\x4e\xe5\x5f\x04\xf7\xe4\x34\x91\xb7\xf4\x20\xcc\x61\x98\x17\x00\x50\x75\xca\x8a\xec\xb1\x90\xaa\x0f\xf2\xce\x5b\xac\x2b\x11\x08\xa9\x3a\xe0\x13\x9a\xb0\x9b\x21\x3a\xfe\xaf\xdd\x28\x84\xda\x15\x58\x22\x4f\x05\xbe\x24\xe4\x1d\xd9\x8b\x79\x2e\x57\x7f\xd3\xfc\xa3\x91\x34\xfe\x20\x80\xe8\xf1\xbc\x08\x0a\xfe\xcf\x1f\x8d\xa8\xf1\x87\xb5\x79\x58\x96\xd2\x90\x9c\x3d\x66\xcd\x4c\xc4\x7c\x32\x9a\xe1\xf9\x97\x8c\xa6\xfb\x12\xda\x21\x3d\x8a\xec\x98\x7e\x07\x5c\xb8\x44\xc3\xd4\x65\xe9\xbe\xf1\xc6\x7a\xfd\xe7\x07\x8a\x7c\x4a\xd1\x4b\xa9\x9e\x3d\x8d\xad\x28\x67\xec\xaa\x03\x7d\xb7\x6b\x8e\x03\x62\x79\x64\xb8\x9a\xd2\xf6\x3a\xdb\x03\xfb\x5d\x1a\xbf\xb3\xcf\x8b\xa5\x73\x63\xbd\xfc\x17\x1f\x54\x0d\xd5\x05\xda\xdb\x61\x1d\xe1\x49\x11\x5c\xe3\xc6\x0e\xd0\x77\x5b\x4b\xc7\x6e\xab\xe6\x12\x2a\x94\x50\x50\x2d\xf6\x8a\x16\x0b\xec\x67\xaa\x3c\xaa\x4a\xfd\x1f\xf4\x7a\xfa\x56\xe9\x4a\xd5\x14\x1c\x6a\xab\x2d\x95\x1c\xd0\x36\xf4\x3e\x72\x63\xeb\x49\x78\x34\x96\xea\x23\x82\xde\x0e\xcd\x98\x10\x1a\xb3\xd7\x2b\x33\xb1\x04\xa7\xb1\xf6\x33\x19\x1b\xc6\xc5\x35\x9a\x10\x2c\xc3\xd2\x5e\x03\x0f\xbc\xb1\x62\x8b\xd0\x08\x2a\x85\x50\x29\x22\xf4\xe2\xda\x0c\x69\x44\x48\xed\x58\x55\x9c\xfe\x4a\x21\x47\xe1\x54\xa7\xba\xfa\xab\x2e\x8e\x61\x7c\x52\xed\x45\x3b\x8c\xfd\x8f\x06\x87\x03\xa9\xc6\xe5\xc3\x1e\x89\xad\x1b\xe1\xd5\x74\x5f\xb4\xd6\x8c\xa0\x89\x1a\x72\x28\x87\x4c\x13\x78\xc1\xab\xc3\x64\x75\xfc\x61\x35\x21\x09\x26\x40\x09\xf4\x30\xf7\xbc\x02\x22\x95\x42\xa5\x75\xe6\x44\xa7\x5a\x63\xc9\xe4\xd6\x55\x08\xfc\xf0\x7d\xa8\xa3\xc4\xb1\xfb\x43\x62\x18\x97\xf7\xca\x35\x45\xb4\xe6\x33\x3f\x0b\xcc\x96\xba\xe1\x53\xe5\x4f\xe3\x7a\xd5\x50\xb7\x4d\x95\x26\x56\xb9\x36\xea\xdd\x1a\xed\x9b\x81\x2e\x44\xe8\xa1\x74\x0b\x00\xb0\x53\x22\x40\xfa\xcb\xaf\x8f\xf6\x4d\xe2\x1c\xd6\x75\xb1\xb4\x56\x72\xe5\xae\xd3\xd7\x5a\x7a\x12\xe9\x54\x9b\x4c\x69\xc2\xdd\xf4\x3a\xd9\x57\x15\x48\xee\x69\x8c\xc7\x3a\xb6\x0e\x90\x67\x18\xa2\x9c\x1b\xbf\xfc\x9a\x5f\xc3\xcd\x41\x99\x1a\xd4\xfa\x50\x06\x15\x34\x8c\x58\x35\x40\xbb\x3d\x35\x4b\xab\x3a\x97\x88\xb4\x56\xe7\xa6\xce\x2b\x63\xb9\x4d\x40\xec\x5a\x41\xe7\x79\x34\xb9\x53\x68\xaa\x46\xb9\xde\xa9\xa7\xa2\x92\x64\xf9\xf1\xfd\x81\xea\x54\xc0\xb3\x30\x15\x05\xf0\xe0\x85\x61\xdc\x95\xa3\xc3\x4c\x90\x50\x0d\xc3\x1c\x95\x6b\x76\x7f\x5a\x29\x96\x6a\xed\x51\xc3\x48\x56\x6b\x15\x01\x3a\xcc\x34\x0c\x33\xfd\x65\x45\x7f\xea\xfb\xa9\x28\x0c\xe3\xb1\x36\xd5\xb5\x75\xa9\x56\x45\x3e\x1e\xdc\x23\x30\x96\x2a\xac\xef\xfa\x8e\xae\x5a\x13\x7f\x4b\x2a\x32\xaa\xf9\x2b\x1f\x4a\x20\x7b\xa8\x75\x35\x10\x6c\xa8\x00\xa9\xf7\x51\xc8\x98\x4d\x6e\xcd\x7e\x2a\x3d\x61\xd9\x8b\xfd\xa8\xec\x8d\x06\x2b\x6e\x7d\x0d\xcb\x66\xd6\x08\xe5\x7f\xd1\x4c\x56\xf6\xeb\xb1\x7c\xca\xeb\xdb\x50\x6d\x25\xc3\xe0\x4a\xc3\xe0\x2a\x56\xb3\x00\x13\x42\x0c\xe3\xa9\x2c\x5d\x03\xf2\x7d\xed\x95\x7b\x23\xd0\x09\xda\xbb\x8e\xa4\xb4\x8e\xbf\xc5\xce\x0b\xc3\xf0\xb7\xd8\xd1\xa1\x8c\x70\x56\xa7\x28\x18\xd6\x4b\xb9\x0e\xd0\x36\x95\x68\x6e\x14\x68\xbb\x51\xed\x46\xa0\x11\x10\x74\xa5\xcb\xef\xd6\x5b\x69\x7d\xdc\x0a\xaa\xa6\xd7\xda\x81\xfa\xa8\x99\x15\x84\xde\x17\x16\xba\x87\x9e\x5a\xbd\xfd\xc8\x1a\xe5\x66\x48\x9c\x71\x39\xc2\xa2\x7c\x52\xa0\xb3\x58\x98\xdb\xda\x48\x41\xe9\xa4\x12\xfa\xf3\xa4\x44\x35\x25\xf4\xd5\xa9\x5c\xf4\x11\x7e\xdf\x0e\x68\xc8\x7e\x48\x96\x88\x68\x73\x28\x6d\xf7\xe2\xd7\xad\xe4\xa4\x9f\x26\xbc\x36\xaa\x66\x35\xc6\x37\x35\xe9\x40\xb2\x0e\xee\xeb\xee\x8c\x0e\xee\x55\x56\xc6\x7c\xeb\x64\x8e\xc1\x34\xfd\x9a\x7d\x5d\xce\xce\x69\xc1\xce\xf1\xbc\x1b\x4d\xf0\xb4\x91\xc7\xf4\x23\x53\x9d\x44\xc5\xd9\xf1\x89\x83\x5e\x42\xfc\x8f\x8c\x37\xb8\xeb\x7b\xfa\x0b\x95\x07\xba\x5f\x46\x34\xd8\x62\xe7\x4b\xe2\x3e\x08\xcf\xbc\x14\x64\xf9\x7b\x51\x27\x67\x53\x39\x4f\x4e\x81\x4f\x71\xb4\xce\xcd\x43\x89\xb7\x96\x0d\xa4\x1f\xbd\x26\x4d\x91\x73\x26\xcb\xa5\x3c\x7a\xc9\x0d\xa3\xe8\xe4\x0d\x9e\xf2\x46\x61\xe7\x9d\xdc\x2e\x3a\x85\x7d\x2e\xcd\xad\xf8\x8b\xb9\x23\x2d\x88\x44\x69\x41\x34\x5b\xcd\xa8\x9c\x11\xcd\x57\x33\x92\x32\xa3\xcb\x7c\xb4\xac\x69\x6e\xec\x7c\x2a\x68\xc2\xbe\x7f\x33\x03\x9a\x51\xbd\x90\xb4\x2b\x05\xdc\xd6\x6e\x82\x36\x79\x9d\x04\x5d\x11\xd8\xe7\xb4\xc7\x02\x73\x5a\x96\x43\x7b\xa0\x33\x19\xdf\x58\x7f\x09\x3f\xf1\x49\xe0\x47\x94\x27\xa4\x66\xaf\x79\x06\x9c\x45\x20\xbf\x93\xd3\x50\x7e\xe0\x8c\xb5\x76\x03\xf9\x81\x40\x7f\xe0\x94\xb9\x9e\x73\xba\xee\xdb\x68\xa7\x66\x50\x64\x4e\x17\x8b\x33\x62\x18\xa7\xeb\x36\x82\xa2\x21\x8b\x15\xcd\x1d\x28\x17\x4b\x93\xa3\xd3\x75\xa7\x46\x91\x2a\x36\x93\xc5\xd2\xf5\x62\xca\x9f\x11\x42\xa5\x74\x69\x24\xcb\xcf\x75\xb3\xb7\x17\xe6\xa9\xb4\xae\xf7\x4b\xeb\x7a\xd4\x2e\x95\x76\x2c\x69\xcd\xfb\x4a\xe9\xbb\x44\x28\xd7\x25\x53\xc3\x50\xdb\xe5\xb8\x0a\x96\x3e\xa5\x2f\xb6\x2f\xdd\xa4\x14\xf4\xd5\x16\xda\x90\xa7\xb7\x24\x6a\xaa\x0b\x9f\x25\xe8\x5f\xc2\x3e\x27\xf4\x0c\x8f\x95\x46\x7d\xe5\xa4\x22\xff\x38\x4a\xae\xf4\x4d\x51\xf4\x69\xe1\xdb\x01\xd4\xcd\xd7\x82\xe5\x6e\xa0\xc1\x0e\x85\x96\xea\x9d\x39\x53\x9d\x09\x42\xaf\xb9\xd2\x9b\xee\x92\x60\x0c\xda\x35\xe7\x2c\x61\x39\xc0\x10\xed\xa4\x15\x62\x52\x78\x4d\x34\x23\xaa\x5a\xa3\x82\xfa\xa5\x73\x96\xe8\xbd\x73\x96\xa8\x6c\x08\xe9\x9b\xcf\xca\x26\xaa\xa5\x78\xdf\x16\x45\x5c\x32\xca\x4d\xbf\x6e\xff\x1d\xeb\xab\x7f\xed\x9b\xfb\x0c\x95\x2e\x3b\x53\x95\x6e\xcf\xf4\x29\xae\x75\x15\xd6\xea\x3d\xac\xe2\xbe\x34\xa4\x01\xbb\x94\x07\x26\xbd\x8f\x5d\x4d\x6e\xb6\xb6\x40\xd8\x42\x14\xeb\x6b\x05\xf1\x90\x53\xe1\xfc\x5c\x71\x76\x40\xde\x38\x06\x77\x41\xcf\xbe\xa8\x83\x17\x8c\x4c\x41\x56\xa3\xfd\xa8\x30\x1c\x18\x68\x53\x30\x8e\xca\xa2\xda\xfd\x34\x67\xe1\xe7\x1d\xea\x03\x27\xe9\x4b\x87\xe2\x4d\x4e\x6a\xef\x4f\x41\x63\x2d\xf4\xce\xe9\xda\xf5\x1b\xe0\xf2\x52\x82\xc4\xc1\x01\x5a\x3e\xd3\x3c\x28\x4d\x98\x19\x22\x40\x37\xdb\xe4\xf3\xf3\xa9\x54\x6f\x17\x40\xcb\xcf\xac\x87\x67\xe0\x9c\x5f\x4e\xb9\x99\xd0\x52\x61\x28\x39\x5c\x75\x29\xe3\xa4\xbb\xa1\x12\x61\xd2\x1a\x93\x9f\xb0\x16\x93\x02\x69\x0a\x18\x7e\xb8\x7e\x4e\x50\x9e\x84\xb7\x68\xcb\x5b\x12\x9a\xb3\x66\x9b\x16\xac\xe5\x14\xbb\xa1\x94\x0c\x0a\x2d\x19\x4c\x19\xa4\x14\xd2\x13\x18\x72\x2f\xbe\x54\xcf\xdc\x6a\x4b\x33\xd1\xcc\x9d\xa2\xd6\x34\xb6\xa5\x6f\xf7\xa7\x56\x02\x15\x12\x32\xc3\xf0\xfc\x18\x04\xae\xe4\x7b\xe7\x0c\x6a\xd0\xae\x94\xa3\xe6\x1e\xed\x49\x41\x3a\xa5\xd3\x52\xd7\x90\xd0\x1e\x2c\x5e\x17\x16\xaf\x07\x78\xeb\x87\x1c\x8d\x13\xc1\xf4\x2b\xdd\xb6\x53\xd6\xda\xed\xa1\xb7\xf6\x0b\x96\xb9\x73\xcf\xb9\xbc\x36\x23\x7a\x86\xae\xec\x3b\x5d\x28\xd8\x6b\x5c\xb8\xa7\x1e\xb1\xe5\x0b\x21\x4e\x80\x4e\xed\xbf\x3d\x33\xed\xac\xf4\xdb\x33\xcd\x1b\x6d\xa2\x2f\x0b\xdf\xbb\x10\xf4\xd9\xdb\x30\xb2\xdf\xb2\xb1\x9d\xd2\xd7\x67\xdb\xa7\x93\xc4\x0e\xe8\x5d\x6a\xf3\xc6\x86\x19\x2e\x16\x71\x07\x3e\x61\xb7\x08\x7d\x4c\xed\x33\x3a\xec\xdb\x3f\x15\x70\x4e\x69\x4a\x21\x8f\x6e\xb5\xc8\x72\xa9\xce\x47\xa4\xb7\xed\xef\x02\x63\x41\xca\x09\xdd\x1f\xa0\xef\xfd\x99\x3b\xf0\xa8\x6f\x0d\x23\xcb\xff\x8b\xb5\xb6\x60\x72\x67\x6e\xd0\x6c\x7b\x1d\xf9\x03\x39\x77\x52\x22\x27\xce\xb6\xde\x00\x74\x4a\x0b\x98\x17\x9c\x68\x9f\x38\xf0\xc1\x06\x00\x72\x97\x05\x9d\x96\x9d\xd3\x4b\x16\x94\x9d\xd4\x57\x6e\x31\xba\xce\x05\x18\x2b\x41\x66\xc8\x5a\xce\x70\xb7\xe7\x0c\x1b\x0d\xb2\x5e\x85\xce\xdd\x13\xcf\xe4\xb4\x4d\xbb\xf4\x92\x06\xca\x47\xa0\x4a\xec\xa9\xc4\xe5\x72\x19\x2c\x16\xef\x8f\xa4\xc8\x5b\xff\xfd\x31\x8d\xc6\x0a\x35\xcd\x36\xd8\x2b\xa1\xdc\x2b\x42\xee\x95\x08\x10\xc1\xaa\xc2\xf7\x9a\xbf\x69\x7f\xa9\x4d\x99\x02\xb5\x0b\x6a\xd6\x4c\x7a\x0b\xa0\xe9\xfe\x0f\xf9\xe4\x08\x00\x84\xb4\xda\x43\x19\xbb\xbc\x36\x05\x45\xe5\x38\xd7\x3f\xa6\x49\xe1\xa9\x8d\xa0\x8c\xa3\x8a\x92\xed\x51\x9b\x20\x21\x6f\x53\x79\x27\x22\x57\x42\x76\xa8\x54\xd8\x9e\x49\xa8\xc6\x3d\x41\xe7\x6c\x06\x00\xdc\x65\x2d\xa7\xbb\x9b\xcb\x06\xbb\xb2\xc1\x1e\xcb\xdd\x2e\x90\x72\xf4\x47\x1f\x4b\xd0\xef\x49\xd0\x3f\x03\xd0\x9f\xab\xdb\x4b\x75\x8e\x75\xf6\xf1\x67\x33\xc3\x98\xa9\x1d\xb1\x0e\xd6\x45\xa3\x4d\x9c\x1e\x7b\x93\x47\xe5\x3d\xd4\xf2\x98\x5a\xbd\x3b\x37\xdf\xf3\xac\xfd\x58\xae\xac\x02\xed\x18\x40\xbb\x00\xd0\xc6\xd4\x3b\x80\xe4\xc7\xd4\x4e\xe9\xe3\x88\x43\xd5\xa4\x50\x80\xcd\xe9\x94\xc6\xb4\xa5\x40\x7a\x7b\x88\x00\x00\x20\x18\x13\x47\xf5\xaf\x07\xa0\xf0\x1f\xc2\xc1\xdd\x6f\x4e\x36\xf0\x90\x06\xd8\xc3\xdf\x41\x40\x70\xb0\x24\xce\x4f\x0c\xb5\xf6\x81\x57\x5d\x0d\x04\x8a\x56\x38\x3f\x57\x43\x35\x09\x14\x71\x13\xc2\xeb\x13\x5b\xa2\xa9\x48\x9f\x38\x69\x27\x9b\xf7\x91\xcb\xd1\x94\x45\xdb\x90\xd6\x8c\xcc\xbf\x3d\x53\xa1\xc3\x91\x4e\xe5\xe1\x88\x4f\x23\x5c\xcd\x59\xf5\xda\x46\x3d\x83\xf2\x75\x07\xb9\xf6\xf2\xf5\x6f\x1e\x70\x80\xcf\x57\x26\x3a\xa3\x9f\x42\x4d\xfd\x32\x83\x7a\xfa\x65\x0e\xb5\xf4\x4b\x54\x07\x92\x69\x19\x1a\x3a\x2a\x9f\x66\xe5\xd3\xfc\x17\x03\xed\xc2\xee\xd0\x53\x14\x02\x34\x75\xb5\xb6\xf9\x7c\x77\x06\x48\x35\xa4\x5d\x40\xaa\x05\xe4\x4d\x09\xc5\xdf\x88\xa0\xae\xd9\xb7\xb9\xdd\xeb\x70\x2b\xe8\x5b\xdd\x3f\x6d\xfc\xdd\xff\x93\x9e\x04\xf6\x18\x48\x16\x1a\x82\x10\x0d\x64\x3e\xdd\x78\x7d\xb6\x05\x8d\xee\xb9\x3d\xc5\x4b\xe7\xab\x47\x3b\xa2\xf1\x3d\xb7\x7b\x9d\xb9\x3d\xa3\x77\xf8\x34\xb3\xe7\x54\xc0\x13\x40\x60\x57\x42\x19\xf6\xae\xa0\xd2\x0f\xb3\xa3\x86\x81\xce\x81\x94\xa9\x37\xad\x87\x0c\x7e\x7d\xc7\x8b\xbc\xc3\x2c\x81\x95\xba\xf2\x5a\x37\x42\x38\xba\x3c\x24\x15\x2a\x8a\xac\xed\xb8\x13\xb9\xdb\x9e\x0d\x68\x45\x63\x18\xd8\xbe\x35\x37\xdc\xb8\xcd\x23\xdc\xe6\xa9\x54\x70\x92\x4a\xf2\x69\x55\xdd\x8d\x3d\xb7\xed\xd9\x6a\x87\xa7\x80\x87\x9e\xd5\xe9\x20\xd0\xe5\xea\xa8\x38\xd5\x57\xc0\x12\x4d\xc1\xa2\x22\xa2\xca\x89\x63\x2a\x0c\x95\x13\xc3\xd8\x82\x96\x31\x0a\x87\x44\x62\x89\xfc\x14\x1e\xd4\xe2\xde\x8c\x70\x6f\x66\xca\x2e\x27\x63\x5b\x18\xbc\x0b\x90\x7e\x52\x52\x31\xdc\xea\x2d\x98\xdb\x9c\x9e\x3e\xdb\x29\x6c\xec\x64\x49\x8b\x3b\x9e\x0b\x3b\xb2\xbe\x1f\xd0\xfd\xbf\xec\x4c\x93\xab\xd4\x30\xcc\x44\x93\xab\x6d\xed\x91\xd9\x87\xed\x1e\xc9\x55\x48\x56\xee\xea\x47\x1f\x9f\xbc\xb6\x9c\x40\x9f\x39\x06\x8d\x06\x91\x0b\x14\x10\x67\x7e\x2a\xa3\x27\xde\x98\xf5\xf5\x9b\xbf\x6f\x04\xf9\x42\x79\x8b\x16\xb2\x96\x13\xca\xe5\x08\xf5\x72\x08\x16\xb8\xd2\x2b\x01\x5e\x04\x49\xfd\x14\xf9\x54\xf4\x64\x54\x78\xe1\x4e\xe7\x5e\xe5\x02\xef\x3e\x72\x85\x3a\xc1\xbd\x1a\x99\xc2\x4a\x3e\xc0\x31\x5b\x18\x95\xfa\xbb\x50\x47\xe1\xe2\x79\xf3\x6b\x62\x72\xa0\xc3\x8f\x29\xc5\xdf\xd3\x67\xb2\x94\xe2\xf5\x99\xf5\x72\x4f\x05\x0b\x2e\xcd\x98\xf6\x4e\xb8\xe9\x13\x9a\x10\x9a\x3a\x93\xd2\x0e\xd5\xaf\x62\x2d\x44\x07\x76\xca\xfc\x32\xee\xa5\xb2\x25\x9d\x38\x3a\x10\x43\x2d\xd3\xfa\x53\xe7\x2e\xab\xd4\x65\x22\x3f\x94\xd2\x44\x71\x44\x42\xfd\xc2\x6a\xd4\x96\x23\xf9\x4f\x0e\xc2\x7d\xe8\xba\x3e\x17\x96\x64\x34\xaa\x31\x93\xf1\xaf\xf9\xc7\xcd\x16\x8e\x3e\x4e\x4c\x24\xb2\xf2\x57\x5e\xb0\xaa\xd5\xae\xa9\x37\x40\x4a\x26\x75\x91\xf5\xc2\x28\xa5\xd6\x1c\xd8\xc1\xa9\x5c\x94\xc2\xa3\x33\x79\xf5\x22\x35\xb7\x68\x97\xe5\xd5\xe6\xea\x69\x6b\xcd\xae\x62\x10\xa7\xab\x0c\x62\x44\xe8\x69\x85\x0f\x7b\x8b\x45\xc4\x81\xed\xf3\xad\xab\x10\xd5\x74\x12\x68\x7f\xce\x62\xb7\xf0\xd0\xe7\xe0\xf3\x5f\x20\x7d\xfd\x65\xcf\xe8\x14\x9e\x66\x7f\xd9\x73\xba\x07\x4f\x5d\x78\x7a\x85\xa7\xf9\x5f\xf6\x6c\x49\x4f\xd9\x56\xbb\xc2\x98\x17\xf4\xd2\x01\xe6\x33\xea\xc8\xee\x34\xdb\xb4\xab\xac\x37\x24\x2f\xa5\x0c\x4e\x9b\x6d\x55\xa0\x51\x15\x80\xbe\x74\xcc\x2e\xeb\x35\x52\x39\xd8\x5a\x9f\xe8\x05\xbe\x35\x7a\xf4\x12\xdf\x1b\x3d\x1a\x31\xa6\x9a\xd2\xc7\x59\x6c\x08\x98\x80\x9b\x43\xd2\xc1\xc2\xac\x67\xcb\x6a\x74\xa3\x55\x22\xfe\x2d\xc6\x4e\x65\xb1\x53\xd2\x89\x55\x31\xd9\x28\xb1\xcd\x0b\x76\xc9\xba\xec\xdf\x34\x7e\xc1\xba\xb6\x58\x2c\x4c\xa9\xa9\x45\xe8\x2f\x1a\xbf\x54\xc5\x2e\x65\x31\x45\x41\xce\x88\x63\x9e\x32\x24\x1d\x67\x84\x18\xc6\x54\x91\x95\x29\x43\x44\x95\xd3\x88\xe2\xf0\x4f\x89\xa3\x16\x07\xf5\x3a\xba\x48\x53\x90\x91\x3e\x7d\xb6\xbb\x34\x1b\xdb\x91\xc4\x57\x7a\x55\x2e\xcb\x55\xb9\xa0\x1f\xad\xde\xb0\x6f\x4f\x97\xcb\x02\xd1\x5d\xa1\xb0\x5a\xae\xb0\xda\xa9\xe2\x58\x0a\x9a\xd3\x6c\x85\x72\x96\x90\x52\x48\x5c\xe7\xe4\x15\x89\xf9\x18\x47\x4d\xe4\xce\xfa\xf9\xfe\x6a\x3f\x20\x6f\xdc\xda\x8e\x41\x80\xd4\xc6\x9d\x9d\x3d\x7d\xdc\x1d\x10\x5b\xa5\x5e\x1e\x1a\xc6\x6b\x95\x4c\xbb\xd5\xb3\x24\x67\xb5\x60\x6b\xbf\xa5\x67\xf2\x9c\x3a\xd2\x37\x40\x34\x56\xc4\x0d\x36\xa6\x75\x83\x56\x76\x71\x69\x65\x5a\xc9\x8e\x31\x90\x8e\x18\xf6\xd5\xc0\xb3\x43\x34\xc2\x92\x3b\x37\xad\x6f\xda\xc0\x9a\x26\x6e\x52\xbb\xfb\xa1\x85\xba\x21\xca\x6b\x2d\x64\x90\x23\xe9\x5c\x46\x73\xe0\x62\x56\xf2\xda\x65\x5e\x01\xbb\xee\xf9\xca\x14\xb0\x6d\x73\x68\xe4\xf9\xca\x8c\x24\xbb\x53\xe3\x63\x8a\x92\x67\xc9\x49\xbc\xce\xb3\x98\x53\x49\x11\x0b\x82\x11\x96\x22\x9a\x03\x80\x6d\xc5\x72\xce\x91\x6e\x16\x84\x46\x92\x7e\xe2\x2e\x07\xca\xf7\x62\x17\xf4\xd5\xce\x35\xa1\x8b\x01\x24\xa6\x23\x6e\x4f\x97\x54\xc1\x44\x4c\x7d\x9a\x11\x1a\x57\x2b\x5f\x2e\x40\xfa\x1f\x51\xb5\x3d\x4d\xd5\x24\xa8\x54\xeb\x87\xef\x95\xde\x9a\x5f\xa3\x30\xa6\xa6\x31\x64\x59\xf1\x1f\xef\x0d\x87\xb5\x29\x19\x10\x9d\x0e\x52\x9e\x6c\x5c\xb7\x16\x7b\xdb\x7e\xb6\x75\x89\xed\xe7\x0e\xfc\xb1\xdb\xb4\x78\x29\x13\x8b\x97\x0e\xfc\x81\xc4\xe0\x31\x17\x3a\xdd\xbd\xdf\xf3\x3a\xf8\xd7\xde\x6a\xd1\x49\xca\x6d\x6d\xb2\x56\x71\xcd\xf2\x52\x56\x9d\xb3\xd4\x6f\xd5\xd5\x1d\x2a\x6e\x80\xf2\x12\x55\xd3\x57\x48\x43\xea\x1a\x59\xc3\x19\x4d\x90\x43\xb2\xc4\x43\x7e\xc7\x8b\x51\x81\xfe\xba\x15\xd7\x74\x5f\x73\x06\xb6\xc5\x4c\x2c\x17\x88\xf1\x84\x8f\xb2\xc9\xab\xbc\x93\xc7\x00\x92\x5b\x2c\xd1\x0f\x29\x3e\x6c\x85\xb5\xf3\x8e\x9f\x23\x33\xb2\x12\xea\x03\x10\x07\x66\xb2\x58\xbc\xa1\xa1\x6a\xcb\x49\x77\x81\x4f\x51\xe7\x23\x0a\xa8\x21\x25\xd5\x56\x31\x5b\x39\xcc\xbe\xa2\x44\x01\x7a\xb3\x67\x91\x75\x12\x38\x85\xec\x5a\x26\x7f\xcc\xc8\xfa\xf1\x2f\x06\x7f\x16\x8b\xa9\x95\x1e\x99\xb2\xdc\x8f\x7f\xd1\xdc\xda\x1e\xb3\x29\x05\xe0\x8b\xac\xdb\x7f\xb1\x0d\xf8\xbb\x58\xc4\xb2\x50\x6e\x89\x3e\x83\x14\xe9\x48\xa4\xfd\xa5\xb0\xb6\x9f\x17\x8b\xf6\x97\xcc\xda\x7e\x26\x53\xe6\xdf\x98\x53\x34\x01\x93\xcd\x38\xed\x2d\x56\x58\xc5\x8b\x61\xb4\xb7\x58\x86\x0f\xa6\x0e\x95\x0d\xaf\x14\x32\xe1\xd3\xfb\xa7\xdc\x9c\x02\xbc\xca\x7a\xc4\x69\x31\x56\x58\x93\x94\x1b\x46\x62\x18\x5b\xc0\xb3\x19\x86\x89\x99\x72\xeb\x64\xac\x58\x26\x2c\x5f\x61\x0f\x7a\x75\xf1\x4b\x1a\x3a\xbf\x2d\xa9\xd2\x0a\x7b\xd3\x7b\xe5\x6d\xa9\x6d\x5b\x39\xf4\x46\x41\xce\x8f\xb9\x67\x18\xe3\x17\xd3\xa7\xf8\x5c\x1a\x5f\xbb\x17\xaf\x9e\x61\x9c\x3e\x63\xc6\xc5\x6b\x2d\xa3\xef\x19\xc6\x0f\x6e\xfa\xee\x28\xf0\x28\x3e\x6c\xfb\x1e\x85\x74\x52\x15\x3a\x0f\x3d\xc3\xc8\x7c\x55\x0a\x1f\x64\xa9\xf3\xb0\x5e\xec\xfb\x4b\xbd\x31\x7c\xaf\xcc\xbf\x61\x20\xe7\x39\x0f\x46\x93\xd7\x5a\x5b\x2b\xe9\x55\x4b\xc1\xab\x6e\x49\x7e\x27\xa8\x75\xd9\x92\x53\xb1\xda\x16\x16\x5b\xcd\x59\xaf\x80\xca\xb4\x86\x91\xf3\xb5\xe2\x98\x5e\x2b\x0c\xd3\x7b\xf5\x9a\x0b\xc3\x08\xa0\xe5\x6f\x2f\x58\x54\xa7\xae\x15\xbc\x1c\x85\xa2\xc0\xc3\xec\x6f\x2f\x9e\x55\xc0\xdb\x4a\xd6\x5a\xf1\x8b\x47\xe9\x93\xa6\xac\x31\x56\x09\x6c\x63\xad\xc4\x5a\xc5\x9e\xc8\x26\x65\xa5\x50\x64\x93\x7a\x06\xf9\x28\x42\xe7\xc1\xfa\xb9\xa7\x74\x90\xef\x94\x06\xb0\xb0\xcf\x5f\xbc\x8e\xfa\x05\x5a\xa1\x4a\x54\x16\xe0\x86\xc1\xa5\xff\x16\x9f\x30\xc6\x0e\xee\xf0\xfc\x15\x92\x80\x70\x04\xb8\xb1\x65\x27\x55\x00\x49\x41\x43\xd6\x1b\x99\xd2\x08\xe5\xf0\xc1\x0c\x09\x11\x1a\x84\xa5\x4a\x74\x58\x41\xb2\x4e\x58\x96\x9e\x26\x42\x77\xdf\xf7\xd0\x57\x0c\xfb\x71\x47\xde\x26\xe3\x57\x85\xb9\x66\x8f\x66\x48\x96\x01\x07\x8e\x3d\x26\x6f\x4b\xf9\xd5\x08\xfd\xdc\x45\x64\xa9\x5c\x58\x18\x86\xd9\x1f\x99\x21\xfd\x71\x47\x3a\x26\xde\xde\x26\x5f\xb9\x19\x12\xda\x3b\xe5\x84\x9e\x6f\x8e\xb2\x4d\x28\x73\x9f\x98\x82\x0a\xf7\xdc\x23\x34\x84\xc7\x73\x42\xe8\x37\xb1\x96\xfb\x4d\xe8\xec\x6f\x82\x10\x62\x0b\x06\xdb\x72\x8c\x43\x22\x4e\xc8\xc4\xb2\x9c\xa5\x90\xd4\x9c\x8e\x76\x33\xd3\x0d\xbd\x15\x07\x04\xab\xa1\x87\xac\x09\xae\xa3\x15\x0a\xd6\x97\xa4\x09\x33\x74\xa8\xcb\x03\x95\x26\xe0\x23\x87\xd5\x8b\xe4\xf9\x8f\xaa\x04\xce\x8e\xab\x17\xc1\x0e\xae\xd1\xa7\xa0\x52\xff\x0c\xac\xfd\xb8\x5a\xc6\x48\x4b\xc7\x89\xdb\x45\xe7\x04\xe9\x3b\x5f\xa2\x3e\xf3\x17\x8b\x73\x27\xd8\x62\xec\x70\x80\x1a\x60\xe7\xc2\xbc\xc9\xcc\x88\xba\x7e\xa3\xdf\xa7\x7e\xa3\xd7\x87\x6d\x80\x96\xfb\x84\x72\x6b\xff\xce\xbc\x80\x6c\xbf\x31\x9a\x72\xca\x2d\x9c\x25\xac\xdf\xeb\x4b\x0d\xb2\xb0\xac\x3f\x18\x50\xbf\x71\x88\x71\x79\xc7\x82\x10\x1a\xc0\x67\x55\xed\x74\x0f\x6a\x3f\x8d\xb0\xd1\x87\xc4\x3c\x95\xc9\x0f\x98\x7c\xe6\x13\x42\x96\x4e\x0a\xf8\x4c\xb0\x6f\x90\x75\xfc\xc2\xcb\xd9\xca\x98\xff\x68\x46\xf4\xe8\x85\x6b\x25\x96\x4c\x86\x58\x84\x7d\xc1\x32\xc0\xae\x03\xa8\x33\x58\x29\x80\xd8\x31\x23\x4e\x6a\x26\xa5\x9e\x76\x50\x49\x81\xda\xc3\x90\xbe\xc8\x2c\x7a\x76\x6a\x26\xf4\xb0\x6a\x23\xb0\x4e\x30\x66\x2c\x60\x71\xfc\xbb\x58\xf8\xd6\x49\xb0\x58\x40\x06\x51\x53\xbc\x91\x62\x96\x34\xe7\x38\x1c\x10\xaa\xde\xaf\x0e\xe1\xad\x6a\x6a\x38\xc3\xa6\x44\x9f\xe1\xdf\xaa\xa9\xe1\x4c\x37\x95\x62\x8e\x6c\xa9\xd7\x2f\xdf\x93\x31\x87\xd7\x95\x3b\xd5\xfd\x01\x76\x56\x65\xd1\xb5\xfe\x9e\x04\xcc\x7c\xdf\xd3\x14\xd3\x56\x3b\x7a\x12\x94\x1d\xd5\xfa\xeb\xd0\xee\x64\xcc\x57\x3e\x17\x1c\xd8\xbe\xf5\x6d\xce\xe0\x4f\xad\xb5\x6f\x73\xdd\x8a\x7e\xc7\x9a\x55\xcb\x64\xe9\x5b\x78\x00\xca\x92\x25\x47\xb7\x38\xc8\xff\x30\x4e\x03\xeb\x96\x73\x86\x7f\x17\x8b\x44\x12\xeb\x44\xbe\xd3\xb2\x0e\x01\x7a\x1c\xcb\xa5\x7e\x61\x31\x0d\xca\xc3\x85\x40\xc9\xb0\xfa\xe9\xe7\x31\xda\xd0\xcb\x9b\x59\xf1\xe9\xce\x9d\x87\x9e\x19\x93\x4f\xed\x16\xf9\xdc\x6e\x51\x09\x58\x9a\x07\x08\x49\x79\x9d\xbd\xfd\xcc\x42\xfa\x01\x50\x14\xbd\x12\x38\x74\x6f\xfc\x1b\x33\xa1\x5b\x2d\x22\xa1\x74\x43\x9e\x3e\x8a\xa6\xc8\x4c\x55\x82\x7c\xde\xc1\x20\x9f\xb5\x79\xab\x79\xaf\x5a\x6d\xa6\x5d\xe7\x6f\xfb\xa7\x35\xbf\xc6\x20\x60\x04\x37\xa6\x8a\x58\x26\x4f\x57\xfc\x9a\x27\x23\x47\x18\xc6\x96\xaf\x24\x1c\xe9\xd1\x48\x60\x30\x0d\x60\xc3\xef\x13\x33\x90\x0e\x57\x9e\x52\xb6\xb5\x05\x3f\x55\xf8\xe8\xca\xc3\xd4\x70\xfd\x9e\xec\xda\x47\x1d\xb6\x33\x2b\x1f\x1b\x86\x19\x5a\x77\x39\x20\x7d\x3a\x8c\xc9\x62\x11\x5a\xf1\xbd\x89\xcf\xe8\xf9\xcb\x3a\xe0\x48\x10\x34\xeb\xfb\x94\xda\x5b\x5b\x9c\x26\x23\xdb\xef\x6c\xb5\xec\xad\x36\x0d\x1e\x33\xb4\x29\xf6\x51\xbf\x2c\x58\x0f\x0c\x55\x29\x36\xa9\x9b\xb8\x9f\xc7\xc0\x83\x6f\xc7\xba\x3b\xda\xd5\x9d\xf2\xaa\x76\xa6\xe3\x40\x4a\x2d\xa9\xed\x98\x44\x0c\x0f\x24\x02\x4f\xca\x5b\xfa\xa5\xed\xd1\x8a\x5c\x44\x2c\xc9\xcd\x88\x86\x56\xcf\xe4\xd6\x0d\xe0\x2c\x5a\xea\xc3\x99\x31\x64\xc6\x94\x4b\x43\x41\x9a\x30\x81\xfe\xff\x98\x38\xe8\xc4\x76\xd4\xb8\x14\x8d\x18\x50\xe7\x4a\x30\x26\x69\xc5\xa4\x2c\xfa\x2b\x0d\x25\xad\x52\xb1\x58\xfc\xdc\xa7\x79\x4d\xd9\xa5\xca\xb8\xc8\xb9\x93\x30\xff\x7f\x77\x3a\x7e\xb3\x6d\xfb\x8e\xcf\x84\x95\xba\x89\xe7\x24\xf2\x41\xda\x8b\x0b\x14\xf5\x56\x35\xfd\x9c\x18\xa4\xbd\x84\x38\x91\x9e\xf7\x88\x38\xb1\x7e\x8e\x89\x93\xb0\xac\xf1\xad\xdb\xc0\x2e\xe7\xf0\x14\xeb\x96\xfc\x8f\x5a\xf2\x7f\xd3\x12\x7a\x9f\x58\x6f\x4d\x9e\x64\xaa\x26\xf9\x6a\x93\x14\x9b\xe4\x84\xd6\x9a\xa4\x65\x93\x1b\xa8\x8d\x28\xe7\xd2\xe1\xec\x2d\x19\xd5\x41\x23\xa1\xfb\x0f\x36\x87\x29\xa2\x77\xcf\x76\xaa\x8c\x86\x39\x1b\x9c\x96\x1e\x46\x83\x2a\x9c\x6c\x5d\x59\x67\xf0\xfe\x92\x57\x09\xe2\xe8\x4c\x0e\xbd\x56\xc3\xee\xe8\xf8\x25\x88\xb8\x09\x20\x2c\x5b\x58\x67\x13\x39\x2d\xa8\x56\xa3\xee\x2f\xb4\xc8\xe4\x2b\xf5\x56\x5e\x0e\xc6\x6d\x79\xa4\x71\xbc\xd7\x28\xdf\xff\xe6\x11\x18\x4e\xf9\xde\x5e\xcb\xdf\xf1\x48\x69\xfc\xcc\x6b\xe0\x12\xcb\xc6\xfd\x63\x8f\x96\xdf\xc1\x43\x4b\xcd\x5d\x01\x1c\x11\xa7\xce\x6f\xe1\xc7\x6b\xeb\x83\xaf\xd1\x4a\xd7\x6a\xf2\x7a\x62\x18\xf3\x91\x19\x13\xa9\x1d\xcc\xf0\x96\x73\x3e\x32\x23\xad\x78\xbd\x36\xf9\x52\xcb\x97\xb3\xa8\x31\x16\x6a\x89\xdf\xaa\x09\x48\x56\xa7\xaf\xed\xd9\xeb\xdd\xe2\xeb\x25\xd4\x04\x23\x07\xf9\x9b\x0e\xf2\xdf\xf6\x27\x91\x3d\x38\xf4\xb5\x93\x87\x81\x67\x18\x1b\x66\xc2\xae\x46\xe6\x47\xa7\xc3\x9b\x6a\x32\xd0\x27\x12\x6f\xb0\x71\xcc\x1b\x89\x56\x58\x6a\x24\x71\x19\xb3\x70\xf5\x63\x1c\x00\x4e\x00\xf8\xa1\xa2\x09\x05\xf4\xb5\xe2\x5a\xec\x5e\x1d\x36\x7c\x70\x5c\xf0\xf6\x98\xda\xdc\x7a\xa1\xa7\xcf\x36\xb7\x5e\x6b\x08\x3c\xf8\xc0\x87\xbe\x3c\xa4\x3e\x7d\x26\x6b\xee\xa6\x4a\x17\xb6\xd0\xd2\xeb\x5a\x43\xe2\xa3\x86\x5e\x28\xb7\x5e\x65\x0c\x1d\x14\xed\x51\x8b\x21\x0d\x69\xb2\x72\x52\xa1\xd8\x3b\x6b\x3a\xe2\x3a\xdc\x35\x22\x28\x19\xbd\xfd\x85\xd4\x54\x29\x65\xd2\xab\x72\xce\xc5\x3f\x68\x26\x96\x45\x1e\x53\xe2\xf8\xd6\xfe\x5f\x4a\x03\x4f\xdf\xc0\xc9\x4c\x18\x1a\x55\xd1\xe0\x53\x9a\xd1\x5c\xf3\x58\xd1\x8a\x92\x58\xca\x84\x93\xb1\xd0\xc9\x59\xb2\xa6\x14\x96\xb2\x80\x66\xcc\xa7\x39\xe3\xcb\x2a\x06\x48\x24\x4f\x33\x92\x46\x83\xc0\x3e\x62\x11\xe2\x4a\xca\x15\x99\x5f\x2c\xb8\xbe\x31\x1a\x45\xe6\xf6\xc8\x74\x4f\x63\xda\x7d\xe1\xb4\x77\x80\x6c\xeb\x33\x29\x7d\x35\xa8\x1a\x20\xda\x04\xcf\x8c\xf5\x0e\xf0\x90\x1b\x1e\x4f\x63\x87\x5b\xfc\x07\xdb\xd8\x6a\x39\xdc\x1a\xdd\x73\x56\x38\x05\xbb\xba\x30\xaf\x46\x26\xff\x0f\xee\x22\x52\xbc\x86\x40\xc0\xb3\xce\x4f\xf0\x02\x36\xb2\x5e\xee\xe5\xbd\xb6\xf4\xbd\xc5\xe5\xb1\x47\xa3\x31\xd5\x0e\xb8\x20\x65\x8a\xb8\xa7\x70\xa7\xea\x2a\x64\xce\x32\x7c\xc3\x9b\xca\xae\x7e\x69\x7b\xc4\x99\x59\x87\xff\x60\x73\x67\x66\x1d\xfd\x83\x75\x9d\xdc\xe4\x74\x46\xe7\x44\x3d\x74\xc9\x52\xa3\x4c\x18\xc6\x56\xbb\x06\xbf\x8f\xa5\x09\x06\x2f\xdd\xda\xae\x29\xf8\xe4\xf7\x4a\xc1\xc7\x1d\x78\xc4\xc9\xee\xcd\x60\x35\x84\x4d\xa5\xeb\x93\xde\x9b\xc1\x8d\x8e\xa2\x4e\xf5\xa3\x2f\x21\x47\x5b\x16\xf9\xd6\x95\x40\xac\x2b\x22\xb4\x77\xf9\x22\x88\x84\xd5\x90\x86\x0c\x72\xa2\x2a\xb2\x29\x2d\x3d\x42\xae\x28\xc0\xa7\x2c\x70\x23\xc0\x3d\xc1\x8d\xd4\x33\x29\x45\x1a\x69\xbc\x71\x34\x34\x7d\x9a\x68\xfc\x81\xe6\xa0\x66\xf2\xc9\x77\xcf\x5f\xbc\x5d\xf8\xbc\x7c\x24\xe4\x2d\x66\xca\x41\xeb\x72\x09\x72\x5b\x00\x68\x91\x54\xda\x06\x21\xcd\xb5\x69\x49\xc4\xe2\x95\x6e\x28\x11\xcf\x30\xa2\xdd\x10\xf9\x87\x50\x95\x24\x8e\xea\x5d\xcc\xf0\xcb\x11\x43\x67\x39\xcd\x36\x79\x0b\xb1\xb7\x34\x06\xc9\x4c\x7e\x35\x97\x23\x08\xdc\xa8\xd1\xae\xa3\xc0\x5c\x1e\x5f\x66\x2c\x6a\xec\x38\x99\xfc\x6c\x26\x41\xbc\xac\x92\x95\x27\x1f\x39\x79\x0b\x59\xa6\x9a\xac\xb7\xf1\xfe\x83\x4b\x3d\x3b\x1b\x39\xf9\x28\x3f\x63\x83\x7b\x33\xa1\x39\x71\xca\xbc\x0c\xf8\x86\x7c\x59\xc7\x5f\x37\x6b\x07\xdc\x56\x8f\xab\x0b\x2a\x4d\x84\xb5\xea\x74\x47\x89\x1a\xae\xef\xb9\xdb\x5e\x27\xb4\xae\x8f\x4c\xf5\x22\x8f\x2a\xed\xd0\xea\x0b\xd3\xaf\xa3\xbd\x9b\x8a\xbb\xad\x61\x3a\x6d\x6c\x10\x38\x01\x0b\x9d\x90\xf1\x0a\xc3\x29\xdd\x60\xa9\xad\x25\xd5\x82\x13\xf5\x7c\x28\x15\x68\xcf\x94\x5a\x1c\x3a\xaa\x0d\xa5\x6f\x6d\xcd\x03\xf8\x9e\xc3\xad\x33\xa9\x1e\x7d\x15\x77\xda\x8c\x65\x1d\x33\xdc\x0d\x0c\x43\xa0\x42\xdd\xf5\x77\xad\x69\x17\xd1\x90\xc6\x34\x20\xc4\x36\xc3\x2f\x1f\xe6\x07\x34\x06\xce\xda\xfe\x4d\x23\x01\x4d\x69\x08\xc0\xf9\x8b\x46\x42\x9a\xd2\x00\xf2\x6b\x9b\x74\xbc\xa6\x78\xe1\x5c\xde\x9b\xbe\xf5\x35\xac\x5f\x64\x84\xe4\x4d\xdc\xd4\x54\x99\xe3\xc8\x0d\x3d\x0a\xa5\x5c\xed\xbd\xfe\x38\xe7\x12\x07\x63\xf5\x40\xfc\xae\x7a\x2f\x96\xd5\x03\x51\x56\x3f\x52\xd5\xab\xa5\x2a\x3e\xec\xd7\x7f\xdd\xf0\xf8\x69\xbd\x61\x51\x83\x01\x74\xab\x6e\x18\xc1\x8b\x19\xd0\xcb\x91\xf2\xc6\x7f\x6b\x86\x14\x60\x90\x90\xe5\x0d\x74\x8c\xbd\x57\x27\x09\xb4\x3c\x00\x28\x67\x8f\x97\x90\x69\x1d\xa2\xe4\x61\x86\xec\xf2\xc2\x0c\x09\xe9\x70\xeb\xf9\x61\x8b\x15\x87\x8b\x85\xd6\xca\x0c\x14\x44\x05\x0a\x6c\x02\xad\x6c\xae\xf4\x33\xdd\x8b\xc0\x33\x43\x22\x05\x18\x7b\xab\x85\xae\xd5\xc7\x4f\xbf\xeb\x85\x94\x46\xe4\x87\x14\x5e\xda\x6a\x95\x18\x71\x0f\x3d\xfc\x41\xd7\x56\xf3\x84\xec\x23\x62\x30\xb1\x5e\x2d\x54\x2a\xe5\x9f\x77\x94\x57\xc9\x7e\x6a\x0a\xec\xb7\x40\xd5\xfa\x90\x0a\xec\xb5\x70\x0f\xbd\x66\x48\x68\x8c\x78\x35\xde\x1c\x65\x9b\x81\xf5\xb5\x8c\xd2\x7e\xc7\xcd\xb8\x72\x6d\x1e\x47\x6e\xe2\x95\xf1\x08\xb6\xcc\xf6\x17\x13\x0a\xbb\x09\x4a\x27\x9d\xda\xb3\x3b\xf0\xec\x16\x21\x1a\x23\x5f\x5e\xd4\x0b\x02\xdb\xb0\x87\x61\x56\x2e\x2f\xcc\xf3\x51\x3d\x8b\x40\x06\x3a\x3d\x5c\x2c\x32\x44\xd7\xa9\x61\x1c\xc1\xee\x49\xc9\x62\x91\xa9\xe7\x4c\x63\xef\xad\xb6\x93\x76\xb2\x8e\xa9\xc3\x2a\xa4\xb0\xa7\x33\x54\x6d\xd5\x31\xcb\x52\xb9\xb7\x31\x90\x09\xb1\xcd\x84\xa5\x72\xdf\x63\x3a\x26\x64\x32\x41\x16\x81\x6f\x4b\x55\x52\x9c\x99\x84\xec\x86\x8b\x85\x4e\x08\x42\xaf\x99\x92\xdd\xb0\xfc\xfa\x52\xbb\x80\x51\xcb\x7c\xfc\xef\x80\xed\x3f\x83\x21\xa4\x80\x7b\x9c\x82\xb0\x54\x2e\x23\x2e\xb7\x78\xb7\xdc\x0a\x74\xd4\x92\x84\x08\x7d\xa2\x36\x3f\xe1\x47\xab\x1f\xd5\x57\x3f\xd2\xd2\x91\x19\xe1\x42\x01\x2f\x4b\x08\x4e\x75\x48\x23\xb2\x58\x98\x01\x0b\xac\x51\xbf\x83\xab\x38\xea\x4b\xdc\xac\x0b\x04\xa4\xb3\xd5\xb6\xcd\xca\x16\x24\x16\x93\xbd\xb1\xe0\x26\x59\x2d\x81\x33\x54\xee\xe1\xa7\x8f\xb4\xc5\x52\x20\x93\x52\x3b\x56\xb0\x37\xee\xdb\xbe\x95\x26\x34\x7a\xcc\x26\x97\xa3\xb9\xb0\x7d\x2b\x7f\xa0\x69\x60\xfb\xd6\xed\x6c\x49\x23\x16\x3d\x9a\x21\x75\xc3\x31\xa7\x79\xcf\xa3\xe8\x36\x2e\xc0\xa4\xed\x27\x4e\x2f\x9f\x38\x1a\xb7\xdd\x64\x90\xc2\xc7\x9c\x46\x63\xee\xd1\x73\x00\x8c\x53\x4c\xf3\xc7\x9c\xc6\x90\xf6\x27\x40\xe2\x36\xa6\x05\x63\x4e\xef\x20\x6d\x78\x45\xbf\x1f\x12\xe7\xe7\x07\xda\xcb\x65\xac\x7f\xd7\xa3\x39\x73\x3d\xd4\x59\x9b\x26\x6b\xea\xca\x38\x1b\x27\x27\x80\x89\xac\x98\x03\x9d\x1c\xdd\x9b\x82\x72\xab\x38\xc3\xc7\x9c\x72\x34\x85\x2a\xad\x75\x94\x5b\xa3\xc5\x22\xc7\xe8\x72\x92\xef\xd4\xda\x5c\x21\xa1\x05\x0b\x80\x18\x16\x84\x4e\xb5\xb6\x7c\x43\xaa\xd0\x3b\x42\x2a\x7f\x4f\x99\xba\x1a\x9d\x2e\x29\xb7\xae\x03\xf6\x55\x4b\xc0\x53\xfa\x9d\x9e\xd3\xad\xb6\x72\xf0\x0f\xe4\x4c\x85\xce\x48\x81\x98\x38\xf9\x5a\x03\xd2\xc3\x14\xb6\x71\x52\xb5\x91\xd3\x08\x49\x4f\xc9\xa9\xe7\x4c\x3b\x25\x28\xd8\x31\xce\xdf\xf0\x89\x53\x01\xf3\xb7\xd5\x82\x7e\xca\xc4\xab\x27\x4e\x37\x2e\x9e\x20\xb5\x4d\xe8\x8c\xdd\x47\x1c\x92\x7f\x3e\xc9\x85\xcb\x61\xe9\xe6\x6a\xe9\xae\xcb\xa5\xeb\xb2\x5b\xac\x7d\xf3\xa4\x96\x2e\x87\xc5\xeb\xa9\xc5\xbb\x7d\x52\x8b\xd7\xde\x21\xf4\x4c\xad\xde\x8f\xa7\x8f\x56\x6f\xdd\x58\x1f\x36\x4c\x79\xe2\x27\x9f\xba\xbd\x4a\x14\xd0\x4f\xda\x7f\x4d\x20\x9d\x2b\x1d\x3f\x70\x2a\xe4\x80\x82\xc6\x64\xc6\x69\x41\x68\xa4\xdf\xfb\x4f\xa8\xe4\x17\xab\xa1\x05\x8d\x8b\x01\xcd\xe9\x8c\x38\x3f\xb8\x19\xd3\xeb\xa1\x19\xbb\x7d\x7d\x3d\xa6\x0f\xdb\x71\xb8\x41\xa3\x0b\xfd\x9d\x03\x54\xde\xca\xb6\xa2\x3d\x4e\x73\xda\x05\x98\x3c\x95\x29\xf1\x1e\xea\xc5\xa4\xec\x7a\x68\xa6\xb2\x15\x67\x5b\x7d\xf8\x0e\xc6\x7a\xa6\x03\x41\xb5\x9c\xa0\x12\x16\x82\x2a\x5a\x38\xa4\x05\xa5\xc1\xaf\x7c\xb3\x86\x72\x7c\x03\x5f\x25\xd0\xef\x41\x09\xb5\x81\x84\xda\x33\x42\x33\xc1\x06\xbe\x35\xa4\x45\xc0\x60\x02\xad\xfd\x18\x68\xa2\x72\xc7\x6b\x8b\xce\x5c\xd8\xdf\xf7\xe8\xc0\x87\x52\x78\x28\x69\x18\x8f\x99\xa9\x5f\x48\x67\x43\x3f\xca\x0a\x45\x00\x80\x3e\xf0\xb7\x18\x2b\x80\xbf\x51\x80\x1e\x28\x85\x23\x11\x32\xd7\x6a\x53\x6b\x87\x5a\x7f\xf3\xe8\x73\xc4\x8e\x1e\xcc\x81\x4f\xe8\x38\x81\x27\x75\x74\x76\x72\x20\x6f\x14\xe8\xc3\x1d\x2a\x7c\x85\x74\x3a\x32\x4f\x1f\xe8\x73\x44\xb0\x85\x32\xed\x4c\xa5\x3d\x47\xac\xff\x60\x9e\x3f\x98\xe3\x04\x83\xb0\x3d\x47\x1e\x7d\xb8\xa3\x02\x6f\x65\x7e\x70\xb3\x08\xa0\x9c\x14\x82\xa0\x2b\xce\xf7\xc0\x2a\xce\xe4\x9e\x50\x93\x55\xdf\x4d\x99\x40\x09\x92\x0e\x54\x90\x95\x33\xeb\x2a\xac\xef\x2c\xac\x4d\x8b\x80\x26\x34\xa3\x29\x6c\x34\x42\xa0\x49\xd8\xee\xeb\x8d\x9e\xd4\x1a\x55\x45\x60\x57\x12\xd4\x87\xe4\x64\xb9\x71\x63\x9d\x9c\xbc\x3b\xf4\x5c\x3f\xdb\xf4\x2d\xb4\xf4\xc7\x2b\x40\x1a\xb1\x37\x68\xc6\x76\x3d\x5a\x9c\xd9\xae\xb7\xac\xfb\x6b\x57\x7c\x4e\xe4\xf8\x2b\x95\xae\xc4\xcb\x04\x8f\x4a\x2a\x4d\xb1\x96\x13\xef\x8a\x35\x3d\x6c\x21\xa3\x4a\x24\x8d\x36\xcd\x58\x6b\x97\x7d\x1f\x99\x3e\x48\x58\xa1\x74\xd4\x9b\x10\xc3\x30\x53\x65\x59\x83\x47\x2a\x90\x46\xc5\x3f\xed\xac\x23\xb5\xdd\xe9\xf8\xf1\xf9\x58\xba\x05\x5f\xae\x84\xe8\x38\x7b\xe2\x8d\xa4\x71\xf5\xc0\x01\x9e\x03\x02\x1b\xb1\x23\x6d\x45\xa5\xbf\x4d\x3b\x82\x15\xc1\xc7\x32\x6e\x6b\x54\x27\x28\x5f\x4f\xdf\x45\x05\xa2\x78\x92\x40\x0b\x5a\x8a\xcd\xae\xfb\xd7\xdf\x29\xfe\xe7\x51\xb7\xbd\xf3\x4f\xaa\xfe\x79\xd4\xdd\xf9\xf3\x4f\xaa\xfe\x79\x9e\x52\x58\x63\xac\x00\x2e\x0e\xe4\xf9\x00\xdd\x4d\x49\x67\x62\xb4\x87\x82\x37\x0a\xa6\x67\x4c\x05\x0d\xf4\x81\x89\xf0\x91\xc4\x62\xdc\x4d\xdf\xdd\xf3\x08\x3d\x65\x3d\x26\x13\x2f\x58\x57\x46\xd9\x85\x82\x2a\x70\xa1\xd2\xbe\x47\x35\x34\xd6\x65\xbe\xf5\xa2\x2a\xbc\x2a\x4f\xd4\xa7\xcd\x8c\x0e\xd9\x25\x7d\xe0\xac\x99\xc9\xe8\xe3\x03\x8f\x1e\x71\x96\x35\x12\xe0\x0a\x3e\x0d\xb8\x73\xda\x3c\xe2\xbb\xa5\x9c\x63\x18\xa7\x0d\xfd\x0e\x14\xde\x30\xcc\x4b\x06\x49\x74\xc8\x4e\x1b\xaa\x1a\xb4\x97\x95\xee\xc0\xda\xbb\x03\x54\x06\x60\x17\xf4\x94\x0d\xe9\x50\x8a\xb4\x43\x86\x27\xd2\x23\x60\x15\x53\x0e\xdf\xe4\xd6\x76\x60\x0e\x61\x41\x03\xe5\x74\xfd\x88\xbb\x63\xef\x0b\x8c\xa5\x63\x06\x0c\x67\x20\x63\x7b\x03\x02\xdc\x40\x46\x33\x36\x3a\x40\x2f\x5c\xdb\xd7\xf6\x56\x9b\xa6\xdc\x17\xa9\x0a\x9c\x34\xa4\x3e\xb7\x13\x7a\x6c\xbb\xeb\xe1\x97\x8e\xaa\x00\xe3\xc3\x25\x9a\x62\x65\xca\x12\x6b\x35\x70\x52\x40\x37\x4e\x75\xd4\x24\xaa\xae\x47\x87\xee\x4d\x80\xd6\x5e\xa3\x47\xf4\xc3\x36\x24\x4e\xa0\x23\x1d\x48\x7d\xa8\x01\xaf\x14\xa2\x60\x80\x99\x47\x87\x7a\x60\x28\x39\x24\x04\x46\xfa\xb6\xa4\x87\x82\xa9\x2f\x75\xe9\x25\x01\xfc\x86\x73\x75\xc4\x2d\x9f\xb3\xde\xa3\x99\xd0\x83\x47\x22\xc1\x00\x08\xca\x99\x61\x6c\x4d\x4b\x7c\x7a\xf4\x60\x86\x04\xd0\xa9\xc4\x3a\x03\x9f\xce\x08\xb6\x11\xa1\x8d\x6d\x67\x7b\x60\x9f\xc3\x8e\xaf\x1a\x9a\xc3\x02\x08\x2b\x0d\xd8\x77\xfa\x83\x9b\x88\x0c\x08\x71\x26\xb6\x46\x8f\xb2\x7b\x02\x98\x39\x40\x67\x03\x1f\x9a\x3b\x03\xbc\x88\xe6\xa5\x99\x60\x30\x09\x80\x11\x9f\x46\xe6\x0e\xe9\xec\xd8\x2d\xfa\x12\xd5\x5e\xbe\x07\x6c\x9c\x00\xa6\x13\x21\xa1\xdf\x9e\xe8\x36\x34\x62\xf1\xc0\x24\xce\xb7\x27\xf6\x3d\x70\xc7\xde\x2e\xdb\x8e\xdc\xb1\x67\x18\xdf\x03\x77\x4f\xbe\xed\xc9\x00\x08\xdb\x11\xcc\xc9\xdd\x3d\xcc\x66\xf0\x62\x6e\x47\xb4\x08\x88\xb3\x1d\xc1\x64\x08\x74\xa8\xf2\x0c\x43\xdb\x1e\x90\xe7\x48\x42\xf9\xc0\x77\x7b\x73\xcf\x24\xd6\x0b\x81\x7e\x0c\x70\x13\x34\x5e\x22\xba\x1d\x59\x5f\x03\x36\x3a\x80\x87\x41\xc0\xf6\x06\xe5\xc5\x08\x36\x71\x5e\x10\x1c\x1e\x6c\x12\x68\x64\xec\x35\x1f\xee\xb0\x89\xd5\x66\x5f\x09\xdd\x90\x4d\x15\x7d\xd5\xd4\xe8\x40\x36\xf5\xce\x31\x07\x40\xd3\xa6\x9f\x3e\x06\xc9\x66\xfe\x58\x8c\x74\x74\x1f\xe0\xa3\xbf\x3d\x2d\x16\x38\xf6\x2f\xe5\xb7\x46\x91\x29\xc7\x3f\xc0\x2d\x8c\xee\x26\x43\xf6\xfd\x1b\x10\x0f\x9c\x3e\xaa\x8b\x52\x2c\xf1\x59\x16\x6f\xec\x10\x02\x33\x24\x42\xeb\x98\x8a\xd0\x9a\x28\xd2\x76\x7e\xcf\x8a\x00\xa6\xea\x6e\x9f\x6d\xb5\x2a\x8f\xa6\x58\xf7\x8b\x40\x83\xdf\xcf\x7f\x23\x58\x0c\x67\x78\x28\xbc\x0f\x87\xab\x07\x49\x75\x5b\x52\x87\x55\x43\xa6\xd6\x2c\xde\x8e\xac\x63\xe5\x15\xf7\xee\x5e\xc7\x63\x14\x21\x2b\x02\xd6\x02\x70\xc1\x44\x47\x84\xbb\xe3\xc4\x11\x61\xa3\x41\xa0\x02\x6a\xe5\x89\xe7\xcd\xd1\x57\xae\xe3\x69\x17\x81\xde\x92\x83\x2a\x8e\xf0\xdd\xbd\x2b\x42\x6f\x49\x08\x2d\x82\x06\xc3\x71\xcb\x39\xff\x45\x23\xe5\xb6\xc6\x39\x96\x6d\x14\xc1\x92\x20\xec\x1c\xfa\xac\xe5\x1c\x20\x34\xa9\xad\xf6\x1c\xd1\x17\xa0\x95\x99\x30\x8c\xf3\x7b\xc3\x30\xb7\x23\x2b\x14\x0c\xaf\x05\xdb\x54\x9e\xbd\x6f\xe8\xc3\xf7\xf3\xfb\x25\x71\x06\xd2\xd0\xf1\xfe\x2b\x37\xb7\x23\x82\x07\x58\xd3\xc5\x62\x4b\x18\x86\xb9\x35\xf0\x17\x8b\xf6\xee\xc0\x47\x1b\xd9\xc5\x62\xe0\x5b\x77\xfb\x44\xdf\xd6\x46\x55\x84\xa6\x23\x2e\xa3\xef\x3b\x30\xce\x2f\x43\x8e\xe8\xec\x50\x58\x2f\xac\x4b\x8f\xb8\x84\x56\x62\xcb\x94\x33\xc0\x71\x32\x71\x6f\x40\xd6\xc2\x37\x95\x25\x1a\x67\xee\xd8\x6b\xec\x94\x05\xa9\xfc\xc4\xe8\x80\x1e\x0a\xeb\x95\x9d\xe9\x45\x55\xd0\x80\xf5\x2e\xca\x6f\xd1\xb2\x43\x08\x26\x86\x61\x0a\x39\xa4\x2d\x35\x84\x37\xf4\x10\x33\x50\x5e\x31\x79\x0c\x70\x85\xb0\xf0\xe1\xd8\xb0\x4d\xa7\x1a\xe4\x4a\x97\xdf\xf5\x70\x19\xbc\x98\x40\x2c\x50\x16\x57\xe8\x2e\x81\xdf\xaf\x4f\x2c\x85\xd5\x3a\xe2\xf4\x50\x60\x0e\x00\x61\x1b\x1e\x8e\xd9\x3b\x34\x3e\xac\xa1\x71\x34\x12\xf7\xa0\x20\xae\xf8\x90\xb3\xa1\x25\xfe\xe9\x48\xa4\x2d\x39\xd2\x21\x10\xa0\x23\x5e\x86\xd5\x19\x72\x3a\xb4\x34\xab\x40\x94\x4b\x9c\x23\x4e\x9c\x8d\xcb\x26\x43\x12\xb6\x5c\x66\x8c\xc7\x9d\x96\xfd\xc0\x1d\xce\x2e\xee\x9c\xc2\x30\x22\x8c\x91\x80\xa4\xac\x45\x39\xbb\x8a\x69\x97\x95\xd4\x96\xf6\x14\xf9\x95\x82\x93\xb6\x3c\x56\x37\x28\x87\x7f\xda\x6f\x2f\x76\x97\xbe\xda\x3d\x3d\x84\x8c\xd6\xa2\x81\xd9\xda\x39\x63\xbe\x94\x84\xac\xb0\x03\xea\x4f\xb3\x30\x15\xf6\x69\xe7\x54\xe9\x55\xd6\x82\xf5\x9f\x7e\x10\xac\x1f\xe8\x7b\x0c\xd4\x1d\x83\xbe\xbc\x06\x9e\xe3\xb3\x1a\xcb\x55\x73\x12\x5e\x2a\x38\x66\xe8\xfa\x5b\x46\xda\x07\x9a\x0e\xa8\x1e\x29\x01\x88\x95\x67\xd2\xde\x34\x21\x8e\x5f\xf9\xd5\x55\x17\xd3\xf2\x88\x38\x65\x19\x36\xea\xeb\x46\x73\xe6\x43\x7b\x3a\x3c\x7b\x46\x73\x2b\xbe\x23\x4e\x0a\x0c\x85\x13\x4b\x8d\x87\xb8\x99\x02\x6b\x12\xff\xbf\xb4\xbd\xf9\x72\xdb\xb8\xb2\x38\xfc\x7f\x9e\x22\xfe\x2a\x3f\x15\x31\x82\x31\x72\xce\xc9\x9d\x73\xc9\x60\x54\xde\x63\x27\xde\xe2\x45\x8e\x59\xac\x53\x00\x09\x52\x32\x69\x4a\xd6\x62\x4b\xb6\xf4\xee\x5f\x75\x03\xe0\x22\xc9\x99\xcc\xbd\xe7\xa6\x52\x16\xb1\x37\x80\x46\xa3\x01\xf4\x52\x65\x2a\x9c\xa4\xbc\x4a\x25\x5e\xca\x93\x66\xe6\xa5\x7f\x56\xb9\x8c\xb4\x72\xbf\x9a\xf0\x74\x33\x2b\x3c\xca\x94\x77\xb0\x95\x3c\x45\xaf\x47\xba\x51\x27\x69\xa6\xe4\xf7\x8f\x28\x89\xd9\xfc\x48\x9f\x4a\x0b\xf8\x6f\x0c\x88\xd4\x3f\x9a\x9f\xc8\xb5\x16\xb7\xe6\x27\x26\x40\xbd\xec\x2c\x42\xff\x34\x1e\x0e\x50\x49\x5e\xf3\x14\xbd\x7d\xe3\xd0\xbc\xaa\xd2\x7d\x28\xdd\x8f\x7f\xb4\x16\xc0\xfb\x2d\xe3\xe7\x0b\xca\x5f\x5a\xec\x7c\xa1\x79\x15\x39\xdf\x3d\x19\x1b\x89\x93\xa6\x9e\xd6\x45\x0d\xa9\x62\x3a\x73\x13\x0b\x4e\xba\x99\xd4\xd0\xea\x7b\xd7\xe0\x95\x2a\xf0\xea\xc9\xe2\x95\xc6\xa9\x02\xa5\x76\x56\x24\xc7\xb5\x68\x78\xc4\x4f\xac\xb0\x72\xc8\xd2\x46\xe3\xce\x09\x97\x5e\x9d\x4a\x81\x4f\xc1\x6e\x78\xa4\xdf\x9b\x0a\x41\xc1\xc3\x3f\x30\x41\x8e\x30\xe5\xf0\x8f\x52\x32\x93\x7d\xd1\x49\xa1\x4e\xfa\xf2\x07\x21\x64\x01\xad\x3c\xc5\x68\x15\x0c\x3e\x0c\x71\xd5\x01\x63\x2f\x91\x34\x1a\xa7\x27\xc2\xa9\xba\x06\x1f\xfc\x4c\xc4\xbe\x22\x2e\xbf\x24\x2d\x7f\xba\xf2\x7e\x5a\xf4\x5f\xf9\x32\xf0\x22\x95\xa9\xb1\x7a\xaf\x8c\xfe\x57\xd8\x68\x6c\x7d\x2e\xce\x59\x40\x27\x11\x37\xf1\xc7\xf8\xd1\x47\x2d\x31\x19\xb0\xf0\x79\x83\x5f\xd8\x83\x94\x89\xc1\xb7\x3c\xa9\x43\x67\xdf\xbc\x90\xdd\x5d\xf3\xab\xef\x8e\x39\x95\x49\x1a\xd1\x8d\x2d\x74\xdf\x62\xea\x85\x81\xee\x0a\xcc\x62\xbc\x64\xdb\x1c\x64\x21\x60\x6c\x0e\x7a\x80\x19\x21\xa9\xbf\xee\x9a\x3b\x88\x0d\xe5\x8b\xc0\xf6\x26\xf6\x45\xa0\x8f\xc9\x46\x22\x2a\xc2\x28\x7f\x0a\x8b\xe9\x75\xe1\x25\x6c\x70\xc0\x85\x97\x20\x28\x40\x34\xd0\x02\x72\xdb\x09\xd9\x43\xea\xb4\x08\x3d\x11\x4e\x42\xfd\x80\x10\x17\x1d\x86\xb4\x88\x97\x18\x11\xa1\xd0\x83\x76\x78\xb2\x80\x9f\xe2\x40\x65\xde\x83\xcb\x43\x0b\x21\x98\x4f\x77\xcc\x7e\x2d\xe5\xd4\x74\xb4\x24\xa0\x64\xf9\x39\x5a\x58\xa0\x0b\x69\x0b\x73\xc9\x02\xc7\xb9\x85\xbe\x34\x7b\xd5\x46\xf1\x9f\x62\xf6\x78\xe0\x99\x51\xe2\xb5\x83\xe7\xbb\x16\xd2\x9e\x74\x49\x49\xef\x75\x81\x8f\x35\xa9\x9f\x68\xa7\x38\x8d\x46\xc6\x6e\xf0\x0f\x8b\x87\x15\x65\x08\x1d\x61\x15\x20\xac\x6d\x48\x23\x2e\x9e\xf9\x79\xc0\x06\x07\x5e\xe4\x0c\xe0\xac\x9a\xfa\x83\x80\x6f\xb4\x68\xe8\x0c\x28\x24\xf9\xa9\xee\x55\x7f\xe8\x0c\x50\xb4\x93\xa4\xe8\x28\x22\xf6\x07\x01\x9b\xde\xcf\xe7\x12\xa8\x6c\x25\x59\x87\xed\x20\x9c\xd8\x25\xba\xaa\x26\x76\x77\xe4\x9a\x31\xb9\x85\x55\x36\x16\xf8\x40\xa1\xf7\xe1\xdb\xbd\x6a\xda\x5e\x2d\xed\xf2\xb0\x9a\x76\x50\x4b\xdb\xa9\x95\xdb\xad\xa5\xed\x1e\x57\xd3\xbe\xd4\xd2\xc2\xfd\x6a\xda\x7e\x2d\x6d\x54\xab\x73\xc7\xa4\x2d\x2a\xd6\x72\x17\x1d\x00\x9f\xaf\x7b\xe2\x7d\x9d\xba\x15\x59\x81\x03\xe5\x48\x60\xff\x67\x6e\x45\x5a\x00\x23\x67\xc6\x59\xf4\xde\x4a\x3d\x95\xdb\xf2\xc7\xa1\x75\x12\x5d\xaf\x4e\xf1\xd5\xea\x68\xec\xc5\x3c\x34\xb6\xe7\xce\x60\xc9\x5e\x3c\x52\xe9\x1f\x04\xb0\x1e\x20\x76\xbf\xdb\x0e\xd9\xd5\x8b\x0f\x71\x81\x7f\x10\xb8\x21\x93\xa7\x5e\x5c\xf7\x76\x16\xd3\x5d\xe5\x86\x6c\xf6\x60\x85\x8d\x43\x36\x54\x40\xf0\xf8\xf0\x8b\x70\x42\x76\xb5\x4f\x25\x8a\xc1\x7b\x45\x77\x23\xb4\xf1\xa1\xd5\xb2\x63\x3a\x14\x51\x6f\x02\x9c\xc1\xfd\xb9\x1b\x2e\x16\x5e\x07\x26\x6c\x6d\x0f\x63\xfb\x10\xce\x1e\x15\x95\xac\x9f\x51\xc9\x4e\x9e\x81\xb6\xc6\x43\x9e\x74\x0a\xef\xb5\xa4\x94\xb8\xf3\x3a\x30\xc5\x6b\x6b\xeb\x96\x05\x60\x79\xa6\x54\xb2\x6e\x56\x16\x6d\xbf\x8e\xfb\x03\x37\xc4\x2d\x38\x53\xf1\xd8\x0d\x61\xd9\x3f\xa3\x95\x68\xe4\xcb\xbb\xaa\x97\x74\x21\x7a\x3b\xa0\xf1\xd0\xad\xb6\xbf\xb0\x76\xfc\x3a\x80\x28\xbf\xd0\x7a\x72\x2f\xa0\xf9\x7b\x54\x31\xa9\x27\xc5\x90\xe4\xbf\xbc\xe8\x47\x96\x8d\x10\xf5\x3e\xaa\x76\x98\x07\xc2\x89\xe8\x47\xe2\xdd\xc1\x6f\x84\x47\x40\x80\x6f\x13\xff\xfe\xbf\x8f\xed\x7f\xb8\x1f\x09\x30\x09\x85\x24\xa3\xba\x17\xcb\x0a\xcb\x5e\x9e\x6b\xcb\x20\x8a\x2b\x76\x2a\x7f\xff\x48\x2f\x85\x13\x52\xe8\xdb\xe6\xc7\xdf\x14\xa1\x03\x1d\x1c\x9a\xe0\x9d\x0e\x1e\x06\x4d\x45\x28\x8e\x51\x93\x2b\xe2\x61\x21\xcd\x24\xe1\xb0\x00\xaf\x38\xa8\xc6\x0d\x03\xba\x55\xf2\x8f\x43\x15\x8e\xdd\x10\x15\xa1\x51\x36\xfd\x5d\x07\xd6\xdc\xdb\xc8\x5d\xe8\x9f\xeb\x6b\x26\x98\x34\x94\x4c\x1d\xa7\xfc\xf9\xca\x09\x99\x12\x34\x64\xfb\x92\x8d\x4b\xc9\x08\x6b\xb1\xce\xba\x97\x97\x2c\x1f\x06\xec\x16\x25\xe6\xb2\x67\x9a\x68\xf6\x56\x6d\xe2\x03\xf6\x6f\x31\xf0\x52\xe6\x14\xa9\x9a\x95\xb8\x54\x3f\x23\x20\x86\xd0\x88\xf7\xcc\x0c\x25\xd4\x44\x8f\x53\x02\x6b\xac\x8c\x47\xbf\x14\x36\x18\x43\x30\x05\x7a\x5d\x75\xcf\x7b\x3c\x12\x74\xa3\x45\x2c\xb7\x24\x99\xfc\x2f\x34\x83\xb1\x52\xb9\xfc\x2f\x42\x68\xaa\x37\x45\xa2\x7d\xef\x28\xf3\x5b\x3c\x42\xbd\x7e\x7f\x74\xbf\x7f\x13\x4e\xc4\xa6\x34\x62\x33\x1a\xb3\x29\x8d\x61\x8d\xf7\x27\x63\x1c\xdf\x74\x05\x47\xab\xf7\x80\xdd\xce\x2a\xe3\x5d\x98\x6b\xb9\x8f\x7d\x89\xc3\x2e\xb9\x60\xb3\x33\x23\x4f\x1d\xa1\x2d\xb1\xe7\x2b\x27\x41\xcb\x87\xc5\xb8\xa3\x67\xc7\xd9\xf3\x9f\x5c\xb2\x97\x7f\xcd\xe7\x21\xcb\x87\x7f\xf2\xd8\xf8\xcb\x6f\x34\x62\x6b\xa6\xb6\x8a\xc2\xb1\xf5\xea\x0f\x1d\x8e\x08\xc5\x5f\x85\xc2\xff\x1a\x73\x56\x12\x12\xee\xa8\xaa\x25\x19\xd2\x9e\xc2\x6e\x0e\x73\x5a\xb3\x15\xd3\x6e\xb9\x5b\xae\xae\x7c\x8b\xb2\x8f\xbf\x39\xd1\x26\x9c\x95\x5b\x9c\xf3\x64\x3e\xc7\x89\x8e\x9b\x09\xf9\x8c\x5f\x11\x69\x34\x8a\xa8\x3f\xf5\x17\x69\x3b\x06\x21\x20\x12\x56\xa7\xce\x49\xdc\xb8\xc9\x13\xf3\x2c\x51\x38\xd1\xca\xc7\x82\xb2\x7f\x10\x9a\xf0\xb3\x82\xbd\xe4\x4e\xc8\xfa\x3d\xd1\x4e\xdd\x2d\xf2\x9b\x64\xe2\xfc\xf7\x8f\x9e\xe4\x8e\x6a\x77\xfd\x99\x0c\x5c\xa8\x8f\x38\xc9\x26\x66\xc5\xca\x93\x66\x48\x3c\xc4\x1e\x98\x93\x98\x78\x42\x7f\xa3\x38\xb2\xf5\x3d\xfe\x4d\x38\x66\x8e\x69\x21\x9f\xf6\xae\x03\x7b\xcf\xd2\xfa\x59\x2f\x22\x67\x1c\xaf\x09\x57\x2d\x2a\x0b\xc5\x2e\x30\xaa\x60\x62\xd1\xa4\x65\x64\x26\x16\x78\xab\xf5\xe4\x97\xc6\xcb\x29\x93\xff\xa2\xa1\x23\xd9\xd3\x7f\xa1\x3d\xd0\xa5\xc4\x67\x9d\x38\x45\xa4\x5e\x4e\x9c\xe9\xc4\x17\x48\xcc\x96\x13\xb7\x75\xe2\x0e\x24\xe6\xeb\xe8\x3d\x6c\x2d\x28\xd2\x07\x2b\x60\xef\xc6\x85\x01\xda\x87\x9f\x19\x3d\xb8\x71\x13\x36\xa5\x87\xf0\x33\xa3\xe3\x13\x37\x65\x53\x3a\x81\x9f\x19\x7d\x3a\x71\x33\x36\xa5\xcf\xf0\x33\x83\x65\x92\xd7\xd6\x46\xd2\xa9\x48\x4d\x6f\x84\xec\xe6\xa0\xb4\xa6\x6b\x05\x60\xb3\x08\x17\x47\xb1\x52\x34\xa9\xc5\xd5\x52\xac\x07\x55\x59\x0f\x51\xb1\x1e\xa2\xfa\x7a\xa8\xf0\x74\x71\x81\x43\xe8\xb1\x89\xa6\xbc\x45\x33\x2f\xe3\x00\x01\xca\x2e\x97\xa7\x3b\x09\xcb\x22\x63\xbb\xa9\x20\x70\xc8\xd3\xa1\xbd\x14\x9f\x18\x9d\x42\x6e\x08\x1b\x05\x66\xdf\xb6\xae\x63\xfc\xad\x80\xdd\x6e\xea\xcf\x56\xc0\x6e\xdd\x96\xab\x98\x38\x27\xbf\x65\x6c\x3f\x15\x74\xc2\xf5\x3b\x7e\xbe\x89\xea\xaa\x88\x89\xf1\xe6\xe8\xf7\x8f\x54\x2f\xab\x01\xcd\x71\x3e\x06\x6c\x4a\x07\x7c\xc0\x66\x74\xa4\x33\x8d\xe8\xc4\x3a\x2a\x42\x42\x6f\xae\xfc\xf1\x71\x81\x4d\xe9\x08\xa8\xd3\xe0\xc0\xcd\xd8\xe0\x60\x51\xf0\x4a\x49\xc9\x17\x9e\x2d\x1f\xdd\xf4\x43\x37\x8c\xa9\x79\x78\xb7\xf6\xa8\xdb\x86\x50\xf6\x33\xe2\x86\x55\x32\x4f\x36\x23\x76\x98\x89\xa6\x13\x31\x71\xde\xc4\xe5\x37\x7b\x6e\x46\xb8\x06\x2b\x07\xa6\xeb\x9b\x1a\x03\x2a\x0c\xf7\xd9\x2d\xb8\x41\xc9\x9e\xa5\xf1\x50\x3d\x13\x65\x64\xef\x5e\x47\x26\x65\x46\xff\x20\x28\x4c\xfc\x17\xc2\xd3\x65\x9f\x7a\x05\x2e\x15\xbe\xd8\x4f\xeb\x9e\xcf\x0b\x4c\x96\x74\xe6\x86\x8b\xe2\xce\xa9\x88\x0f\xe9\xcc\x95\x8b\xc5\xca\x7d\xed\x92\x17\xf6\xb2\xcd\xb8\x22\xf8\x63\x40\x42\x30\x60\x40\x61\xdc\x42\x42\x35\xe6\x06\x9a\xc8\x56\x58\x73\x59\x97\x4a\xd3\xa7\x2c\xc0\xe8\x7e\x8e\x7e\x3f\x42\x7c\x52\xdc\xe0\xdb\xca\x1e\x0a\x61\x92\x45\xee\xbc\x1c\xd1\xd0\xb8\x1e\x0d\xd9\x53\xc4\x23\x6f\x23\xd7\x45\x24\x9e\x00\xbb\x91\x63\xd2\x29\x1e\xc6\xe0\xf0\xa7\x4d\x76\xe8\x5c\x4e\xc8\xf2\x8c\xff\xd8\x27\x6b\x74\x27\x76\x97\xf0\xc2\x40\x85\xf5\x84\xec\x54\xfe\x56\xe5\xff\xca\x49\x3e\x2c\xc5\xd6\xb5\x9c\x37\x3e\xe6\x2d\xeb\xda\x96\x86\xe7\xf1\xc9\x11\xaa\xd7\xea\x77\x28\x1f\x6a\x24\xef\x48\x5b\xb0\x3d\x07\xa3\x38\x7f\x4e\xda\x61\x7b\xcb\x6d\xb9\xa1\xbb\x55\x02\x79\xf4\x46\x6b\x85\xb6\xef\xaf\xb5\xb3\xb1\x11\xba\x1b\xad\xb2\xda\x2f\x6f\x75\xa2\xaa\x58\xfc\x3f\xec\xc3\x47\x77\xab\xde\x87\xce\x4d\x75\x9c\x51\xe3\xb9\xea\x82\x89\x73\x1e\x6a\x61\x5c\x2b\x9e\x0e\x70\x95\xc5\xb1\x40\xc5\x10\x39\xe0\xdb\x7c\x2e\xb4\x0d\xd8\x15\x16\x40\x2b\xbf\x58\x73\xe4\x2c\x11\x83\x6a\x57\xc4\xbd\x23\x88\x69\xcc\x6f\x55\x5d\x02\xdc\xdd\xbc\xed\x1a\x85\xc6\x56\xfc\xbf\xb0\x3a\xa3\x47\x42\xa0\x22\xcd\x52\xa4\x24\x15\x83\xcd\x85\x52\xa6\x93\x34\x79\x44\x25\xfc\x51\x68\x0a\x26\x0f\x9d\x84\x50\xfc\x95\x40\xf8\x90\xc0\xed\xa5\xc2\x4d\xe8\x6e\x2a\x5c\x49\xf7\x53\xe1\xc6\x40\xd9\xc4\x82\x68\x99\xf1\x84\x4b\xf6\x84\x92\xb9\x1b\x49\xad\xd3\x15\x43\x3a\xd2\x18\xd2\x41\x65\x8a\xdc\x9e\xed\x05\x6f\x79\xe2\x73\xa2\x5d\x75\x78\xa2\xc9\x3f\x92\xd8\xc1\xa0\x08\xa8\xfe\x6d\x6e\x05\xb4\x55\xda\xf3\xd2\x4e\x88\x13\x36\x39\x47\x09\x59\x6f\xf0\x99\x8f\xbc\x41\xb3\x49\x47\x9b\x9b\x44\xe8\x84\x41\x40\xa5\xfe\x1a\x05\x54\x8f\x54\xc2\x1e\x0f\x7c\x11\xb0\x51\x2a\x74\x5d\x92\xb7\x3c\xf9\x39\xd1\x17\x0a\xb2\xd9\xc4\xb2\xa9\x2f\x75\x01\x61\x9b\xb4\xd9\xd0\xbd\x48\x91\x6f\x57\x42\xc6\x01\x37\xb5\xda\x22\x9c\xcb\xf9\x5c\x72\x9e\x58\x6f\x24\xed\x01\x43\xff\x15\x6c\x9c\xa2\xeb\xc6\x96\xf6\xf5\xc1\x13\x73\x27\xb6\x0a\xff\x3b\x9d\xa4\x7b\x80\x9f\x45\x17\x96\x20\x3a\xaa\x02\x74\x54\x03\xdc\x4e\x01\x6c\x81\xb9\x3e\xaa\x15\x88\x93\x2f\xcb\x5f\xa2\x01\xd8\xc2\xda\xb1\x5c\xb6\x76\x3c\x9f\x6f\xf4\x7a\xce\xed\x9b\x56\xba\xec\xad\xe0\x53\xbc\xb0\x82\x7d\xa1\x36\xea\xf5\xeb\xd6\x1d\x43\x7e\x0e\x50\xa1\xe8\x38\x84\xcc\x69\x8a\x6e\x01\x57\xf6\x10\x0b\xc3\x7c\x86\xc8\x9e\x62\x5a\x04\x69\xca\x70\xd5\x68\x0c\x0d\x39\x4b\x27\x6a\x6e\xc1\x51\x10\x78\x36\x27\xda\x54\x10\x52\x5e\xf8\xa7\x16\xb7\x36\x0c\x2f\xf1\x60\x8f\xe5\xaf\x2f\xff\x72\x15\x15\xe7\x6e\x4c\x0f\x33\xe1\x4a\xcb\x69\xb7\x5b\xae\xe3\xc4\xb0\x99\xaa\x4d\xa8\xac\xa6\x4f\x7f\x5e\xf5\x7f\x79\x0f\x0b\xc4\x76\xca\x2b\x04\x88\x2e\xba\x75\xab\x77\xf1\x41\xe9\x6b\x00\x4d\xd2\xaf\x98\x52\xb8\xfe\xe2\x48\x5f\xa1\x80\xb3\x57\x08\x89\x3b\xa1\xe9\x5e\x68\x8c\x58\xc6\x9b\x46\x5f\x38\x2e\x0d\xfe\x17\x2e\x46\xd0\xca\x25\x54\xb4\x45\x36\xf1\xb7\x55\xdd\xe7\x7e\xbc\xa5\x8e\x97\x45\x9e\x28\x4d\xd6\x4b\x1e\xc2\x9e\xf7\x21\x69\x87\xfe\x87\xc0\x97\xa5\xd1\x0f\xc0\x3e\x8a\x14\x05\x4d\xbf\xcb\xaa\x96\xb8\x57\x2a\xb6\xa0\x19\x0c\xe4\xb4\x4f\x72\x2e\xb4\x19\xb5\x78\x0b\x16\x3b\x7e\xa6\x97\x7c\x63\x4b\x7f\x8a\x1e\x7f\x7d\xd1\xb7\xd9\x74\x7f\xe2\xb6\x68\x96\xb9\x2d\xfa\xfd\xd8\x6d\xd1\xcb\x63\xb7\xb5\x58\xdc\x77\xfc\xaf\x01\x13\xf1\x8a\x94\x8b\xa9\xd4\x0f\x03\xae\x9d\xcc\xa1\x91\x4a\x53\x29\x7b\x51\xdc\xc8\xdf\x88\x1e\xdb\x9f\x70\x38\x3b\xd8\x60\x06\xd4\x67\x56\x04\xbf\x1f\xd7\x52\x2f\x21\x38\x23\x0b\x6f\x32\x70\xb0\xf1\x25\xec\x35\xdd\xf2\xe3\xc7\xc0\xd1\x9e\xce\xb4\x73\x63\x57\x2e\xc8\x82\x94\x83\x90\x56\xd8\x91\xa5\xa1\x38\xe0\x52\x7f\xec\x0d\x79\xa8\xbf\x64\x97\x47\xfa\x6b\x36\xd3\x4f\xb6\x3a\x43\x4b\xbf\x60\xc2\x80\xea\x98\xee\x05\x26\x2f\x7e\x38\x69\x87\x4e\xc6\xc4\xeb\xf0\x14\xa0\xf4\x3a\x6c\xa7\x6a\x5e\x5f\x37\xe4\xff\x90\xc0\x33\x98\xc6\x4c\xe8\x79\xec\x98\xaa\x88\x97\x76\x98\x62\x3b\xfe\xb7\x40\x5b\xab\xae\x4c\xe2\x45\x9d\x40\x1c\xb0\xe7\xb1\xf7\x1d\xd1\xbe\xa6\xc1\x61\x7b\x77\xc0\xba\xa1\x23\x29\x44\x68\x8d\x8d\xe7\xb1\x23\xb0\x09\x81\x30\xab\xe7\xf7\xb7\xa7\x0e\xd4\x33\x08\x81\x5d\xfa\xa6\x93\xe9\xf7\x2f\x14\xef\x3c\x07\x02\x4a\x95\xa8\x7a\x59\x6f\x7e\x6f\x88\xe5\x7e\x06\xc1\xde\x70\x09\x84\x8a\x1a\x6a\xb5\x32\x25\xbc\xeb\xbf\x53\x4b\x85\x7f\xb6\xab\x5e\x3a\xe7\x1a\xec\x6c\x22\xf4\x26\xeb\x5c\xe8\x88\x87\xc9\x52\x3f\xbe\x97\x65\x8e\x46\x98\xe5\x39\xb6\x65\xbe\xe8\x88\xe9\xd8\x46\x98\x5a\xcb\x1c\xa6\xd6\xe7\x22\xc7\xa1\x2e\xf2\x54\x44\x24\x3a\x62\x5c\x44\x1c\xed\x63\xc4\xac\x88\x10\x07\x18\x31\xd1\x11\x8b\x0e\x00\xbd\xc6\xb6\xf7\x5d\xe6\x98\x89\xd4\x13\x24\x20\x46\xc0\xf4\x4d\x37\xb9\x64\x53\xa0\x96\x9b\x28\x7d\x64\xdd\x19\xb4\x3c\x09\x0b\xb0\xa5\x7d\x71\x95\x2b\x49\x96\xcb\x88\x4a\x96\x5e\xce\xe7\x12\x57\xcb\xcd\x50\xd0\x57\x94\xd4\xc5\x05\x4a\xa7\xd2\x05\xfe\x5f\xaf\x50\xe0\xf6\xf5\xe2\x5c\x2c\x08\x16\xe3\x1b\x2d\xaa\x0b\x5e\xbd\x5d\xf0\xfb\xb1\x2d\x78\x79\xbc\x58\xa0\xb5\xf5\x0e\x4c\xc2\x5f\x77\x90\x86\xa6\x83\xa1\xed\x60\xb8\xda\x41\xc1\x85\x7f\xf1\x18\xe8\x8e\x8a\x00\xc8\x56\x4b\x6b\x3d\x02\x84\xd8\x6f\x24\x66\xd4\xf6\x3f\xac\xf4\x3f\x84\xfe\x63\x07\xae\xff\x4e\x07\x3a\x30\xff\x6b\xe0\x9f\x7d\x73\x70\x8f\xd4\x57\x7d\x63\x9c\x1b\xa4\xd9\xe7\x5f\xb4\xd6\x1c\x36\x75\x07\x4d\x4d\xa5\x2b\xe9\x8b\x72\xc3\x05\xda\x4f\x30\x74\xa5\xb0\xe9\x52\x84\x6f\x4e\xaa\x16\xec\x67\x33\xad\xba\x87\xf5\x74\x6c\x3d\x0b\x42\x33\x73\x05\x71\xda\xc7\x53\xba\x25\x53\x21\x02\x3b\x1d\x0b\xbe\x46\xb8\xd9\x00\xc8\x2b\x8d\x17\xad\x89\xb2\x0e\x94\x15\xaf\x50\x9d\x1b\xbb\x5c\x04\x42\x71\x3b\x14\xd4\x68\x46\x01\x39\x3d\xeb\xe3\x8d\xde\xbb\x0e\xac\x88\xb7\x86\xc8\xab\x41\x50\x74\xe8\x43\x75\x60\xc4\x02\x6b\x44\x68\x7e\xf4\x61\x61\x40\x57\x9e\xde\xae\xb4\x3e\xee\x45\xa5\x3f\x6a\xa3\x4d\x07\x43\xf5\xa4\xf2\xf1\x9e\x39\x18\xdf\x3a\xc2\x57\x8f\x01\x2a\x8e\x16\xcd\xdd\xe2\x20\x5a\xf2\xce\x44\x8c\x0a\xf8\x88\x66\x08\xc4\xf8\x6f\xf7\xec\xfb\x5b\x3d\xeb\x16\x3d\x9b\xfd\xed\x9e\xa9\xd1\x12\x1e\xd9\x4a\xf3\x01\xc2\x3f\x83\xec\x50\xf5\xe4\x6f\xc3\x7b\xf9\x16\xbc\x43\x03\xef\xbb\x0e\xec\x07\x7f\x13\xe0\xb8\x06\x30\x7d\xee\x2a\x95\xed\xa9\x6c\x2c\x5c\xc1\x22\x35\x16\xbd\xec\x97\xa6\x67\x88\xdd\xab\xde\x8b\x65\x9d\x65\x57\xbb\xc3\x30\x70\x9e\x55\x61\xe9\x23\x82\xc3\xa5\xbe\xd8\xb8\x1d\xb9\xfa\x4a\x2c\xac\xba\xed\xf7\x04\xec\xef\x7c\x70\xd4\x0e\x79\x57\x38\x91\xbf\x15\x10\xf7\x9f\x1c\xbd\x3b\xb7\x9d\x90\x43\x44\xbb\x48\x30\x2c\x22\x86\xb5\xe1\x58\xfc\xfc\x47\x40\x88\xfb\x8f\xb2\x90\xcd\x5f\xc9\x4a\x5c\x55\x44\x7b\x11\xba\x84\x0e\x69\x7c\xef\x2a\xfa\x65\xea\xc6\x0b\xcf\xac\xa9\x51\x53\xd2\xa8\xee\x32\x72\xcf\x8d\xf8\xeb\xed\xb3\x0b\x45\x6d\xbe\xc9\xa3\x58\xc9\x78\x76\xe8\x46\x65\x13\xe8\xeb\x2a\x22\xc6\xe1\x23\x7f\xbd\xbb\x70\x23\x5b\x3a\x7d\x5e\x2d\x7d\x0e\xa5\x5f\x0f\xfb\xc2\xb5\x55\xd8\xdc\x83\x35\xb9\xfb\x33\x51\x6d\x6c\xa9\xfe\xde\xac\x56\xc2\xde\x45\x09\x76\x1b\x09\x7d\x40\x5f\x4c\x06\x4e\xe7\x7f\xc8\xbc\x3d\x54\x98\xb7\xb4\x63\xd9\x23\x6a\xe2\x58\x2a\xcd\x02\x3e\xb7\x5c\x5b\xde\xe2\x1d\xeb\xf2\x63\xf1\xc3\x79\xe8\xd0\xb4\x43\xbc\x07\x64\x5e\xf3\x4f\x35\x54\x36\x05\xc5\x9a\x82\x25\x00\x9d\x3a\xfb\x73\xae\x8f\x67\xa9\xdc\x40\x8f\x2c\xfa\xeb\xee\xc8\x6a\xb9\x2f\x3c\xc1\x5f\x17\x15\x9f\x67\x70\x48\x33\x66\xeb\xac\xd1\x3a\xeb\x2e\xce\xf8\x8a\xdb\xbd\x76\xa2\x52\x5f\x55\xf1\x88\x59\x7d\x59\xb5\xe4\x30\x4a\xf9\x71\x60\x6c\x89\x27\xec\x06\x0d\xf0\x59\x3b\x6a\x29\x3f\x3e\x77\xfc\xd1\x11\x0d\x69\x1c\xc0\x76\x94\x06\xfc\x35\x54\xf9\x58\x0d\xdd\x84\xdd\xd8\x27\x4f\x2c\x66\xae\x1c\xd8\x0d\xbb\x3f\x6f\xeb\x1f\xd7\xc6\x61\xcc\xfd\xb9\x1b\xb1\xbb\x7f\x52\x8b\xb5\xf1\xa2\xd0\x9f\x7a\x2f\x16\xef\xf4\x58\x66\xe3\x35\x64\xc1\x6c\xeb\xd7\x13\x47\xf8\x62\x18\x00\x85\xb0\x94\xe2\xb6\x94\x1e\x29\x4f\x66\x5f\x46\xc5\x36\x35\x9b\x95\xf2\xef\xc2\x1e\xe2\xa4\x17\xf2\x90\x73\x61\x2e\x62\x4a\xc1\x29\xbc\x8e\xfa\x71\x22\xac\xcf\xe9\x08\x03\x21\x1c\x89\xc4\x9f\x51\x5b\xba\xe1\x42\xcf\xae\xd1\x86\xd6\x82\xcf\x86\x5c\x68\xe7\x4f\xe1\x06\x8f\xb4\x8f\xf7\xce\x1e\xfe\xc8\x7d\xfc\x19\x1d\xe1\xcf\xb3\xfe\xd9\x3b\x26\x6e\x08\xe7\x9a\xe2\x95\x56\xba\xf1\xa8\xe6\x30\xad\x72\x02\xdd\x70\xcc\x9d\xb3\x60\xe7\xda\xd7\xc5\x16\xc5\x4f\x7c\xb0\x34\xdf\xf8\xa6\x69\x3e\xb7\x83\xcd\x8f\x46\x15\xb1\x3c\xba\x22\xa5\x2a\xae\x6b\xa1\x0b\x86\xa8\x7d\xd8\x77\x9f\x8c\x8b\xc8\x29\x6a\x44\xce\xa8\xb2\xe4\x2d\x12\x55\xdd\x40\xc1\xf2\x56\x69\x36\x39\x6f\x19\x85\x00\xff\x72\x1a\xb0\x29\xcd\xcd\xd7\x8c\x0e\x78\xea\x7f\x7b\x09\xbc\x6c\x33\xfc\xcc\x07\x8d\x46\xb6\x19\xfe\xc9\x37\x07\x8d\x46\xbe\x19\x61\x44\xbe\x19\xe9\x08\x27\xe3\x4e\xb6\x19\x92\xdf\xf0\x6f\xd3\xc9\x37\x23\xf2\x1b\xfe\xa5\xd9\x67\x3e\xf8\x0d\x0a\x7f\x36\x56\xbb\x00\x17\x9f\x8f\x28\xba\x9b\x4f\x59\x7c\x8f\xb4\xb3\xa2\x11\xa0\x0a\xb3\xbb\x63\x17\x8d\xdf\x9c\xb3\x3d\x81\xc0\x2f\x59\x1a\x46\xeb\xc2\x68\x68\x98\x5d\x5f\x90\x46\x43\xd9\x91\x7a\x0d\xb1\x91\x64\x9f\x46\xd6\x8d\xe4\xfb\xf1\x42\xd3\xfa\x95\xc3\x78\xfd\xbe\xe5\x87\x5e\xd0\xc0\x50\xda\xed\xc3\xe4\xbb\xe8\x39\xcf\xfb\x82\x0a\xd8\x45\x2c\x9a\xdf\x46\xeb\x9f\x87\xe5\xf2\xde\x13\x96\x7b\x4f\x34\x2a\xdc\xe4\xe0\xaf\xdc\x37\x06\x86\x8c\xd5\xa9\x67\xf3\xbb\x77\xec\x6a\xdc\xed\x0a\x27\xc4\x1d\x24\xc4\xad\x22\x82\x45\x87\x71\x1f\x81\x30\x97\x8c\xd3\x7e\x13\x77\xfc\x0a\x69\x4e\xf6\xdd\xb0\x28\xee\xe9\xe2\x1a\x21\xee\xdd\xb0\x52\x54\xad\x16\x7d\xdc\xd3\x44\xfd\xac\x87\xaf\xbc\x45\xd6\xfe\x5e\x53\xd0\x7f\x68\x85\xf7\x76\xb5\xbe\x02\xca\x2f\x53\x37\x5a\xb8\x90\x54\x44\x55\x00\xd6\xc9\xcb\x2e\x8a\xad\xd4\xca\xfa\xce\x6a\x45\xb6\x02\x84\x9b\x99\x40\x70\x17\x15\x3a\x9c\x77\x2a\x1b\xc7\xf4\x09\xa8\x2c\x7e\x9e\x95\x9f\x0f\xfb\xf6\x62\xc3\xff\xfa\x12\x60\xf6\x72\xda\xef\x4a\xd1\xb6\x87\xfd\xda\xbd\xd9\x87\x1a\xef\x7d\xf6\xe4\x8b\x40\x0b\xb8\xe5\x88\x01\x93\x41\x24\xc6\xea\x6c\x00\xd9\x47\x7c\xcd\x2e\xf6\x45\xf0\xb8\xef\x08\x3a\x7e\xc4\x97\x41\x8c\xbb\x19\x9a\xc8\x91\x8e\xbc\x2b\x77\x16\x5d\x6b\xa2\xc6\xfb\xf9\x78\xd8\x53\xa3\xea\x5d\x81\xdd\x05\x04\xf7\x03\x2a\x79\xcb\x72\x58\x0f\xfb\x78\xb7\xf8\x39\xc4\xfb\xc5\xaa\x5e\xd1\xc3\xbe\x2f\x03\x2b\x6c\x73\xf6\x64\x4c\x72\x6f\x28\xff\xc7\x4b\x30\x9f\xe3\x8f\x43\xec\xc5\x96\x21\x15\xca\x3f\x7c\x0c\x1a\x8d\x0d\xfc\x75\x48\xfb\xdb\xb9\xa3\xb4\xd9\xa2\x33\x6a\xa1\xd7\x26\xc3\xd6\xfd\xd9\xd8\xd2\x07\x01\xb7\x9b\x3a\x66\x32\xfc\x08\xf7\x1c\x14\x0f\xa8\xec\x14\x15\x22\xf9\xa1\x4a\x24\x25\xeb\x45\xa5\x5f\xbb\x93\xde\x68\xd4\xcb\x93\xf7\x0f\x22\x8f\xc4\xb8\x3f\x9c\xbd\x3f\xda\xd3\x2e\x52\x43\xfb\xb4\xa4\x97\x9c\x61\xe0\xce\x9e\x7c\xa8\x20\x68\x03\xe1\xb0\x01\xd7\xa9\x86\xf8\x6b\x2f\x72\xe1\x4b\x8b\x94\x6a\xcb\x87\xf4\xa9\x37\xea\xc9\x4c\xd9\xa0\xca\x85\xcc\x54\x64\x83\xba\x35\x13\x5a\x50\xc0\x12\xf4\xef\x01\xb0\x12\x0f\x8d\x6c\xa1\x1d\xfc\xa9\x6d\xe3\xdb\xb9\x56\x63\x87\x51\x13\xec\xcb\xcf\x47\x2c\x84\x6a\x0c\x42\xf5\xbb\xb5\x9d\xd3\x11\xbc\x82\x78\x68\xe1\xab\x9b\x3a\x82\x54\x6d\x21\x95\x76\x6d\x4f\xed\xa9\x8c\x5d\x1f\x71\xf8\x33\x9f\xbf\x2e\x3c\x7b\xb3\x79\x7d\xe4\x85\x4c\x19\xbc\x0a\xfd\xc7\xed\x00\x93\x43\xfd\xed\x85\xbe\x0c\xd0\x8c\x43\x11\x2b\x03\x2f\x64\x87\x5d\x0e\x7f\x30\xd2\xd2\x4e\x76\xd8\x5d\xbc\xd3\xf0\xee\x8c\xd6\x59\xf3\xda\x10\xfe\xf9\x2c\x28\x7d\xdf\x5e\x0a\x76\xfb\x5c\xb9\x2c\x15\xfc\x47\xcf\x01\x88\xa0\xe5\xf5\xae\xf1\x0e\xbb\xfe\x87\x80\xf5\x22\xce\xa3\x05\xa1\x9b\x5b\x1b\xda\x57\x4b\xc8\xa1\x97\x21\x1c\x4e\x1f\xb5\xd4\xcf\x87\x40\x5b\x97\xdd\x99\x3a\x10\xc0\x18\x7f\xb0\x6d\x62\x6d\xc8\x48\x52\x0e\x73\xe7\x25\x13\x84\xd4\xa8\x87\x3c\x15\xe5\x4d\xa8\xe4\xa2\xa4\x0b\xfd\xda\x8b\xe3\x6b\x0f\xb5\xde\x5e\x17\xb4\x3f\x8c\xd4\xd0\xf5\x03\x7a\x3a\x46\x73\xac\x77\x4b\x4e\xd3\x2a\x0c\x4f\xa2\xc6\x5f\xd5\xcc\x18\xc6\x34\xef\x38\xf6\xed\xfe\x74\xec\xbf\x98\x2d\x4b\xaf\x41\x5b\xe2\xaa\x37\xce\x14\x94\x89\xf1\xf1\xf1\x74\x0c\x73\x13\x93\x45\xe8\x0f\xc2\xc0\x94\x99\xcf\x1d\x1d\x94\x01\x10\x84\xd0\x3f\x9d\x06\xda\xe9\x0c\xf1\x6c\x02\x84\x85\x51\xf6\x2d\x85\xd0\x4a\x89\xde\x4e\xbd\xdf\x3f\x9c\x41\x87\xca\x53\x41\xbc\x81\xa5\x43\x5f\xd5\x8c\xaf\x99\x1f\x53\x86\xa9\x7f\xe3\xf9\xb2\xc8\x8e\x80\xff\xac\x40\x74\x81\x05\x1e\xa7\xce\x60\xe5\xd6\xb6\x3c\xbc\xed\x1d\x1b\xe7\x8f\x27\xb2\x62\xf7\x2b\x44\xfc\x8e\xa8\xf4\x5f\x24\xae\xac\x8d\x16\x15\xac\x9f\x6b\xa7\x9e\x50\x7b\xe6\x87\x6c\x20\x83\xda\x21\xe1\x71\xa5\x93\x8f\xa6\x93\x8f\x7f\xd1\x49\xc1\x06\x72\x51\xe6\x7a\xb3\x6f\x55\x68\x4d\xe7\x1e\xd7\x76\xce\x10\x6c\x3d\x0c\x21\x99\xcf\xad\xec\x80\x1f\x02\x9d\x2d\xfa\x25\xd8\x33\x30\xeb\x40\x38\xf4\x41\x33\xa8\x76\x68\xd8\xa9\x7a\x43\xc2\x8d\xe4\x74\x5b\x50\xad\x6b\x2f\x64\x45\xd7\x1e\x05\xd9\xcd\xa6\x73\x31\xe4\x47\x00\xc8\xf1\xb6\xa0\x21\xda\x00\xd2\xf1\xfd\x5c\x94\x09\x1b\x2d\xbb\x45\xa5\x26\xf6\x5b\x35\xf6\x8b\xb0\x57\xe2\xcf\x47\xbc\xa3\x90\xc1\xc6\xe0\x48\xf1\x48\xdb\x08\x37\xc7\xa5\xff\xe6\x57\x50\xfa\x61\x2c\x68\xde\xb7\x97\xe2\x7d\x13\x3b\x18\x0b\x9a\x0c\x04\x59\x0c\x71\x68\x1f\x27\xd5\x5d\xae\x82\x9e\xa3\xaa\xa8\xc0\xca\xf1\x0e\x0e\x70\xa3\x0e\x1d\x76\x88\xf7\x6e\x84\x15\xed\xfe\xf7\x1b\x4a\xb6\x02\x66\x46\xa1\xe7\x2c\xa0\x69\x3c\x62\x47\x87\xa5\xd1\xd4\x98\x6f\x6c\xd1\x44\xef\x7f\xda\x3d\x07\xcd\x8c\xa5\xdc\x88\xdd\x47\x8d\x06\xfc\xd5\xd6\x3b\xee\x23\x82\x06\x7f\x36\x5a\x34\xe5\xbe\xe9\x2a\x35\x9d\x0b\x68\xc4\x95\xff\x05\x7e\x38\xdf\xd9\x23\x09\xf7\x8d\xa5\x5b\x65\x75\xad\xa9\xc8\x06\x5d\xa1\xc3\xe7\x6a\x41\x8b\xf4\xc2\x0d\x50\x3d\x5b\x19\x7d\xae\x16\x41\x69\x2d\x57\x1b\x8f\x8f\x4a\x1b\x82\x70\xb4\xd1\x0b\x20\x0a\x68\x54\x7c\x37\xb7\x02\x5a\x82\x11\x2d\xd5\x1f\x2d\x81\x21\x97\xd2\x65\xbd\xe1\xd2\x63\x79\x2f\x8e\xdf\x87\x5d\x31\x1c\xd7\x3d\xc9\xe2\xc6\x3c\xee\xaa\xf7\x61\xb7\x3f\x52\xb9\xc9\x02\xe7\x77\xd8\xa7\x25\x7f\x35\x9b\x8f\xd5\x67\x0e\x99\x36\x80\x8f\xc6\x2a\x1a\x8d\xb1\xb5\x26\x45\xb5\xf5\x0a\x6a\x7d\x26\x1f\xd9\x27\xb8\x94\x43\x40\xa1\xd9\x3c\x9a\xf2\x77\x0e\x9c\x5a\x20\x2b\xac\x9e\xd4\xef\x5b\x73\x33\xcf\x47\x34\x33\x16\x6d\xcc\x02\x32\x72\x06\x69\xa3\x11\xc3\x96\xa3\x1d\xa5\xe8\x6e\x85\xac\xfb\xdc\x68\x6c\x84\x2c\xed\xb5\x9d\x0a\x0c\xac\xfb\x4c\xe8\xa4\x12\xde\x7d\xa0\x21\xac\x50\x20\x3b\x66\x49\x95\x5a\xca\x5a\x6a\xff\xc1\x56\xf4\xd7\xe5\x36\x5a\xa6\xa0\x6b\x0d\x28\xbd\xc8\xa0\xd1\x28\x0b\x22\xd8\xa6\xe0\x56\x59\xd0\xba\x36\x9d\x38\x92\x0a\xf6\x94\x56\x9f\xf6\x4a\x96\x2a\x3a\xad\x58\x10\xb5\x92\xb6\x27\xd2\x98\x91\x19\x74\x1c\xb4\xb4\x01\xdf\x8f\xf8\x6d\xdc\xd2\x44\x78\x1c\x4e\x79\xec\x46\x9c\xc7\xc7\xa8\x12\x94\x18\x8b\x6e\xda\xd9\x56\xc6\xfb\x1d\x27\xb5\x4e\xc7\x5e\x23\x08\xc6\x76\x25\xe5\x10\x4a\x68\x88\x4e\x48\xbc\x8c\xe7\xde\x16\xe7\x11\x6e\x4c\xc7\x28\xea\x95\x17\xdf\x4e\xca\x63\x9a\xf1\x88\x18\x8f\x9f\x35\xdc\xb8\x73\x32\xc8\x58\xdb\x52\xed\xcc\x0c\x68\x06\xfb\xa1\x30\x46\x06\x09\x66\x86\xdd\x4e\x04\x6b\xb6\x60\x05\x2b\x1d\xe8\x38\x15\x2c\x97\xc4\x93\xd5\xc9\x19\xe8\x31\x96\x2b\x63\xcc\x32\x5f\xe0\x3e\xe2\x0e\x0c\xb6\xf8\x97\x61\xe0\x60\x80\xa6\xfe\xed\x4b\x60\x27\x49\x10\x52\x71\x79\xe4\x09\x98\x97\x01\x95\xec\x29\xa5\x2d\x3c\xa9\x16\xd3\x33\x58\x18\x2a\xb5\xf7\xdf\x6b\xcf\x8c\x48\xa3\x22\xeb\x2b\x02\x88\x55\xa4\xcc\xc5\x64\x9d\x38\x6d\xf0\x10\xa9\x12\xfc\xf5\xf4\xa7\xa3\x1d\x28\x1d\xc3\xc2\x70\x64\x33\xfe\x3d\x64\x83\x9e\x62\xaa\x07\x00\xfc\xbf\xd8\xb8\xa0\x88\x03\x38\x55\x59\x52\x50\xda\x73\x28\xa8\x81\x8e\x02\x82\x90\xd8\x7c\xc9\x6a\xbe\xa4\x92\x2f\xe6\xf2\xcf\xb8\xed\x87\x34\x09\x5c\x3f\xa1\xa8\x36\xb6\x42\x16\xf1\xe8\x59\x9d\x5e\xc5\x76\x1f\x8a\x49\x08\x29\x04\xa9\x5a\x5e\x21\x11\x04\x70\x71\x11\xb7\xcc\xab\x6f\x5d\x97\x27\x2c\x2a\x17\x45\x58\x5f\x14\x61\x75\x51\xa8\xd3\x25\x53\xa1\x52\xef\x0b\x4b\xb8\x57\x37\x7e\x47\x5e\x05\x6e\x1c\x22\xf0\xec\x35\x5f\xa4\x3c\x59\xed\x82\xa2\x10\xb4\x78\x54\x76\x01\x77\x4e\xb7\xcc\xb5\x1e\xdb\x84\x79\x89\x45\xdc\x51\x88\x3b\x05\xf8\xca\x22\xcd\xce\x5f\x20\x0d\x5a\x39\x03\x8c\x51\xb0\x99\xc5\x2b\xa4\x16\x1d\x28\xbf\xc8\x80\x4c\x0a\x21\x70\x84\x26\xb2\xd0\x6c\x6c\x55\x3c\x90\x25\x1c\xf6\xb7\x2d\x9a\x19\xb4\xf2\xce\x8e\x85\x16\x84\x4b\x4c\xcc\x26\x24\xa6\x7c\x73\xab\xea\xba\x0f\x49\x48\xb2\xc1\x33\x2f\x69\xf2\xb4\x74\x59\x92\xf9\x09\x6c\x4a\x4f\xd7\x4e\x48\x13\x38\x28\x01\x27\xbc\xc1\x07\xac\xa3\xac\xc8\x28\x7c\xa3\x75\x1c\xdd\x91\xd3\xb1\x9f\x07\xde\x76\xcf\x19\x91\xf9\x7c\x5c\x80\x3c\x22\x8b\x01\x4b\xfd\x28\x68\x34\xf4\x2f\x8b\x54\xe5\x53\x53\x50\x27\xe2\x45\x0c\x2d\xbb\x1b\xc1\x14\x45\xcb\x53\x34\xa0\xf6\xfc\xb7\xee\x27\x62\x69\x0f\xb6\xff\xc7\x0c\x36\x23\xf4\xb1\x57\x08\xd0\xa4\x8d\x46\xeb\x33\xfc\x1a\xa7\xad\xbc\xe0\x92\x1e\x27\x4e\x5c\xc7\x42\x35\x9f\x5b\xae\xaa\x1d\x5b\x65\x8c\x02\x2d\xc7\x9d\x52\x88\x0e\xce\x8d\xc8\xfe\x11\x4f\xda\x8d\xaa\x6a\x36\x2d\x3c\x7d\xc3\x42\x06\x79\x4d\x0c\x75\x48\xda\x89\x8b\x26\xa3\xa2\x36\x54\xe4\x02\x17\x89\xc7\xb9\x61\x18\x38\x43\x63\x50\x7e\xc4\x55\x3b\xd6\xfe\xe0\x8c\x1b\xa4\x8a\x98\x19\xf2\xa2\xcb\xc7\xd6\x11\x8d\x1b\x8d\x98\x45\x07\xc4\xc5\xc3\x6d\x2b\x00\x4e\x5c\xe7\x2a\xd2\x74\xd6\x01\xf1\x04\x07\x4e\x0b\x6f\x1c\x79\xd2\x6e\xb9\x5b\x55\x8f\x6d\x23\x03\x69\xda\x4e\xfd\x04\x41\x50\xed\x0b\xbd\x4d\x4b\x7d\x72\x06\x7c\xa9\xb5\x5d\x2b\x90\x6f\x07\xd5\x4d\x3d\x6b\x03\x82\xb9\xa6\x69\x2a\x59\xfc\x95\xe7\x54\x18\x07\x9c\xc5\x39\xb9\x18\xc3\x49\xe7\x2d\x23\x23\xe4\x55\x56\xe9\x3d\x06\xa8\x1e\xf2\x75\xb9\x89\x5d\x9d\x55\x0e\xd6\xda\x5d\x45\x27\x67\xdc\x08\x3d\x3a\x1a\xa1\x38\x0f\xe7\x73\x58\x47\xc2\xce\xed\xce\xbe\x70\x08\xa1\xbd\x7b\x07\xa3\xd0\x92\x66\xc9\x00\x3f\x15\x98\xb1\xcc\xfe\x1a\x54\xfb\xfe\x81\x1b\x86\x47\x87\x2f\x2f\x78\x62\x2e\x5e\xbe\x08\x34\x8b\x63\xa2\xe9\x87\x6d\xe2\x1d\x94\x41\xf3\x0b\x07\x84\xcd\x8f\xc0\x49\x3f\x69\x4e\xfa\xe9\x2d\x46\xba\xe0\x2f\x65\x80\xf6\x7e\xd1\xf6\x4d\xa4\xb4\x71\x0e\xc9\x0e\x5e\xe6\x73\x07\x27\x4f\x5b\xd1\x35\xd0\xc1\xf9\xdb\x1c\x49\x31\x51\xe0\xfa\xb3\x89\x9e\x49\xf4\x10\xef\x05\xeb\x3e\x5b\xb8\x4c\x52\x71\x6a\x2d\xc8\x59\xb8\x58\x18\x18\xab\xdb\x68\xa1\xbb\x56\xa1\x7a\x36\xdf\xce\x5f\xe6\x2b\xa5\x34\xcb\xfd\x01\xe1\x88\x46\xf6\xb8\x73\xf6\xa0\x4f\x43\x07\x70\x1a\xda\x22\x6d\x63\x8d\x6d\x33\x12\x54\xff\xdf\x8c\x80\xd1\xd4\xb1\x2d\xd4\x4c\x42\x6d\x25\x6a\x69\xc2\xde\x54\x53\xc7\x90\x9f\x42\x3d\x5f\xb6\x85\x7d\x9a\xc0\xf0\xd1\x76\xe9\x63\xa0\xd1\x78\xec\x21\xb1\xfd\x76\x8f\x3f\xc5\xad\xc9\x63\x0f\x55\x42\xac\x3b\xe4\xa2\x5e\xed\x07\x0f\x38\x3d\x52\x71\xf1\x31\x52\x40\xa0\xe0\xb7\x72\x9d\xe8\x10\xff\x38\x68\x4f\x13\xf7\x6b\x62\x68\xd5\x0d\xff\x00\x00\xdc\x1d\xd3\x6e\xbf\x76\x25\xfa\xdc\x29\xac\xc6\xa6\x92\xf3\xc1\x51\xf9\xcc\x35\xe8\x29\xff\xb2\x54\x10\x35\x00\x48\x94\xa9\x98\x91\x85\xd4\x6e\xf2\x43\x55\x05\x67\x5f\xb6\xe1\x0f\xbb\x35\xea\x2f\x68\x23\x56\x32\x85\xfa\x24\x98\xff\x6b\x04\x9f\x96\xbe\xee\xcb\xb6\x28\xf2\xa3\x0b\xd5\x2b\x45\x05\xe6\x5f\x6a\xb6\x66\x56\x32\x29\xaf\xc0\xce\x1e\xb8\xac\x48\x05\x4d\x3b\xcb\x7b\xff\x8d\x27\x0b\xe7\x19\x82\x63\x7f\x3d\xc9\xb7\x9a\xa8\x08\xe3\xc8\xdf\xb5\xcf\x80\xd2\xc0\x80\x6d\x31\x62\xd3\x26\xfc\xf9\x93\x0b\x36\x6d\x4b\x77\x53\x12\x1a\xb1\x19\xc4\xcd\x3e\x73\xc1\x66\xed\x4d\xe9\xd6\x9c\x71\x77\x4f\x6b\x32\xe2\x7b\xdf\x9c\x62\x10\xe9\xc5\x8d\xe3\x38\x92\x7d\x78\x6c\xff\xf3\x93\xeb\x48\x76\x1d\x35\x25\x1b\x44\xe4\xf7\x8f\xe4\xf7\xad\x7f\xb5\x36\xd9\x27\xf2\x5b\x97\x9d\x1f\x51\x2c\xc2\xc2\xc8\x7c\x44\x11\x0a\xc7\xd8\xd9\x67\xd3\xa6\xf4\x27\xb3\x80\x4d\x69\xc8\x66\xe6\x7b\x86\x62\x33\x7c\xfb\x1e\xd2\x69\x8b\x0a\x7f\x08\xdc\x18\x9b\xe9\xa8\x19\x46\x6d\x07\xeb\xc4\xda\x7b\xa7\xd5\x97\x4d\x7f\x84\x7e\xa9\x46\x40\x78\x75\x83\x2d\xed\xce\x5e\xa0\x42\x3e\x9e\x38\xb5\x8d\x43\x5b\xd5\xc7\x3f\x5a\x9c\x0b\x76\x28\xdb\x25\x7a\x34\x01\xca\x08\x90\xa4\x19\xb2\xd9\x26\xec\x07\xbf\x7f\x24\xee\x52\x06\x1d\x5d\xe4\x8a\xaa\xa2\x5d\xf7\xcb\x1c\x9c\x28\xd8\x65\xff\x0b\x9c\xec\x9f\xae\x4d\x7a\xf9\x44\x56\xd8\x9e\x3e\x49\xf4\x43\xc3\xfd\xa1\x6b\x12\x95\x49\xa9\x78\x65\xb0\x36\x44\x79\xa4\xed\xa9\xc1\xc7\x0d\xfb\xfe\x38\x9f\x47\xec\x86\x4a\x8d\x26\xc6\x06\x24\xe0\x02\x2a\x38\xc2\xdf\xcf\x92\x4d\xdb\x2d\x37\x82\x21\xa6\x11\x3e\xe9\x39\xf8\xf3\x59\xb2\x19\x26\x6c\xa3\x6b\x01\x7d\x87\x45\x68\xb4\xf2\xfa\x61\x9a\x46\x44\xb5\xad\xaf\x68\xfb\x5a\xc0\xd8\x8d\x9f\xc2\x7e\xb1\x16\xa0\x08\x4d\x3a\xb1\x69\xbb\x08\xb9\xf0\x45\x4b\x78\xf0\xcb\xd5\x60\x22\x64\x15\xc0\x16\x4b\xca\xce\xeb\x00\xea\xec\xb9\xa1\x81\xc4\x93\x3c\x64\x37\x5e\xc4\xa7\x85\x56\x18\xde\x95\x4c\x3f\x0b\x7c\xe5\x84\x91\x9b\xfe\x29\xb4\x91\x4c\x02\x8b\x87\x7f\xfc\x0d\x66\x7b\x33\x62\x53\x93\x77\x06\x79\x01\x18\xc8\x3c\xc3\xcc\x27\x21\x64\x9e\x35\xf9\x3b\xcc\x3d\xdb\x8c\x00\x9d\xed\x28\x2c\xea\x4b\x12\xb0\xb1\xc4\xdd\xf4\x74\x49\x55\x67\xdb\x93\x7a\x19\x00\x8d\x42\xc5\xd9\x50\xdb\x09\x95\x7a\x29\x48\x36\xd3\x6a\xa3\x14\x8d\x00\x54\xaa\xca\x56\xcf\xd1\x15\x89\x11\x9a\x00\xe9\x92\x40\xea\x68\xaa\x3f\xbf\x46\xe8\x79\x93\x8d\x1f\x68\xce\x53\xf8\x19\xf0\xc8\x93\xfe\xcd\x4b\xd0\x68\xe0\xcf\x06\x9a\x8f\x72\x72\xbe\x99\xd3\x54\x3b\x02\x44\x71\xde\x01\x47\x6f\x9f\x11\x0a\x16\xd3\x98\xa7\xfe\x43\x18\xb0\x7d\xe5\x0c\x08\x71\xad\xcb\xc0\x35\x39\x15\x4f\x2a\x39\x51\x4e\x38\x82\xed\x1f\x57\x23\x2c\x7f\xa3\xf0\xa0\xda\x21\x9b\xba\x0a\x97\xbf\x89\x8a\xdb\x21\x9b\xb9\xb1\xa7\x78\xc8\xa6\x9b\xd9\x6f\x02\x35\xb0\x67\xcd\xfc\x37\xb1\x44\xf3\x14\x8d\xab\xeb\xf0\xe1\x3f\x49\xd0\x36\xd9\x56\x41\xd3\x36\xd9\xd6\x0a\xbd\x7d\x8b\xb6\x55\xa4\xe4\xff\xcf\x88\x55\x49\x88\x96\xe9\x54\x49\xa0\x7e\xff\x58\x1d\x9a\x7e\x49\xa2\xaa\xe4\xa8\x4a\xae\x3c\x69\xc9\x95\x5d\xcb\x28\x37\xa2\x4d\x58\x4a\xce\x77\x8f\xf1\xc7\xfa\xa2\x80\xd9\x01\x02\x14\xc2\x8a\x9f\xcf\x43\x2f\xe4\xca\x3f\x84\x5a\x94\x3f\xb4\x4a\x7f\x61\x53\xa2\xa5\x59\x34\x0f\xcb\x15\xf0\x1e\x09\x8f\x9b\x8a\xa6\x66\x67\x13\x5c\x14\x16\xb0\x93\x3f\x53\x36\xb3\x7d\x0d\x9b\xf2\xf7\x8f\x34\x81\x91\x77\x6b\x51\x71\x13\xa2\xc2\xcf\x29\x9b\x96\x79\xd9\x16\x8d\x9b\xaa\x42\xb6\x71\xfa\x74\x94\x75\xda\x51\xce\x1b\xcc\x57\x85\x05\x2f\x47\x69\x56\xe3\xc1\xab\x7a\x39\x61\xe1\x6b\x32\x2a\xbe\x14\x59\x9b\x5e\xda\xc6\x04\xae\xa9\x88\x7d\xd5\x07\x7b\x74\x8f\x91\x01\x81\x52\x1c\x36\xe0\x88\xc6\xc4\x8b\xf9\x83\xfd\xd4\x07\x5d\x9d\x05\x38\xd9\x84\x3d\x66\x8d\x46\xc2\xd2\x5e\x5b\xf0\x17\x80\x2f\x41\x6e\x35\x26\xae\x23\xf5\xa2\xda\xfb\x6f\xe4\x16\xa8\xe0\xa7\x70\x42\x8a\xd8\x87\x10\x0e\x93\xc0\x98\x9c\x3d\xd0\xb8\x3c\x36\x0e\x86\x34\x62\x5f\xc7\xa4\xf4\xff\x61\xe1\x5c\xdb\x3b\xdb\x35\xcb\xec\xf1\x08\x45\x52\xf4\xed\x44\x6c\xac\x89\xc4\x3c\x33\x27\x11\x05\x64\x1a\x5d\x8d\x4e\xdb\x67\x29\x1e\x36\xf7\xa6\xc4\x55\x14\x8f\xe7\x48\x19\x58\xa4\x08\x74\x66\x7d\x97\x54\xd9\xa5\x1d\xe8\x52\x04\x5d\x32\x40\x48\x2d\x4e\x83\x1d\x0c\xb1\x83\x5b\x34\xd6\x1d\x54\xb6\x83\x21\x74\x30\xc4\x0e\x12\x57\x97\xd4\x97\x07\x1a\x68\x33\xb4\x16\x94\xeb\xd0\x4f\xb6\x03\x5f\x05\xf4\x5d\xca\x13\x18\xea\xb4\xed\xc4\x1c\x38\x8c\x04\x6f\x21\xf5\x47\x8a\xc0\xa6\x15\x60\x53\x04\x36\x41\xfb\xce\x00\x2c\x8d\x2a\xf7\x1a\x70\xd4\x80\x13\xc9\x52\x1b\xe6\x1a\x80\xa6\x70\x00\x0a\x16\x14\x58\x60\x73\x46\x4f\xe1\x64\x1e\xe9\x0b\x16\x3d\x85\xd1\x72\x0f\x93\x9f\xf4\x50\x4f\x65\x71\x8f\x0a\xac\x88\xc2\x7d\x01\xb5\xd2\xeb\x53\xd1\x2f\x13\xb5\x4f\x9f\x30\x28\xae\x24\x7e\xd6\x4f\x33\x29\xbb\xff\x6d\xdc\x3d\x59\x4c\x53\x06\xd3\x96\xc1\x54\x00\xa6\x42\x30\xbd\xc2\x6d\x8b\x99\x80\x14\x3d\x65\xd8\x86\xcb\x49\xc8\x78\x0a\x73\x90\xb5\x9d\x04\xe7\x00\x8d\x01\xe4\xfa\x23\x43\xd8\xb2\x0a\x6c\x99\x1e\x4d\xe2\x3a\xd9\xdb\x73\xb0\xa6\x19\x3b\x0f\x99\x99\x87\x77\xd9\x9a\xd1\x8f\xcd\xe8\x27\xba\x5b\xa9\xed\x56\x0c\xdd\x8a\xeb\xa3\xbf\x7a\x8e\x1f\xbc\x79\xc7\x2d\xed\x53\x88\x17\xe1\xd2\x57\x76\xbd\xeb\xe5\xaf\xb4\x63\xa2\xab\x9e\x13\xae\x7b\x7b\xc6\xeb\x5f\xe8\xc0\x82\x78\x37\x3d\x27\x59\xff\x3e\x0d\x03\x25\x58\xda\x5b\xc0\xa1\x01\x6f\x16\x61\x74\xaa\xcf\x95\xb5\x99\x8b\x96\x68\x44\x39\x73\x15\xaa\xf8\x78\xba\xd6\xe2\xd8\x89\xa4\x09\xe2\x5b\x0c\xa4\x05\xe8\x4e\x2e\x89\x17\xf1\xfe\x72\x94\x9e\xf6\x95\x7e\xe9\x7d\xf1\xe9\x1a\xd1\xb3\xb8\x0a\xb7\x06\x58\xed\x65\x37\xaa\xd3\x15\xbd\x5e\xeb\x61\x67\xa9\xd7\x51\xa5\xd7\x54\xd5\xfb\x1d\x9b\x7e\x9b\xa9\x8d\x56\xa7\xb6\xea\xfd\xe0\xad\x7e\x7b\x11\x8f\x8c\x42\xad\xa6\x29\x9a\x04\xc6\x34\x02\x0e\x0e\xef\x21\x51\xe6\xd4\xae\xbf\xc4\xac\xbf\xe8\xad\xa1\x28\x3a\xbd\x27\xaa\x73\xbc\xbe\xb7\xd0\xd5\x4a\x87\xb5\x69\x22\xb4\x15\x5e\xaf\xf4\xce\x89\xab\xda\x76\xb8\xf7\x67\xa8\x88\x39\x90\x6e\x48\x73\xe9\x8a\x05\x41\xc9\xd5\xda\x98\x65\x95\x31\x5b\x43\x7c\x97\x16\xc7\xba\x11\x2c\x06\xf0\xa5\xbc\x28\xd2\x17\x1c\xdd\xf1\x03\x3a\xde\x34\x8e\xd7\xe8\x65\xe8\xbe\x86\x99\x18\x8d\x4e\xc5\x83\x72\x6f\x0e\x16\x0b\x7a\xa0\x84\xbb\xd1\xa2\x87\x4a\xb8\xa1\xb5\xa1\x16\xd2\x7d\x25\x5c\x6c\xef\xc3\xb6\xfb\xb1\x45\x1f\xc4\x30\xe9\xe5\xee\xa7\xea\x35\xc9\xf6\xd2\xde\x6d\x5f\x80\x63\x2f\xe2\xbc\x77\x60\xee\x3a\x47\xaa\x5d\x51\x63\x18\x29\xe3\x32\x68\xa4\x8c\xf8\x55\x48\x5c\x5b\x10\xf8\x05\x94\xe0\x42\xa3\x13\x58\x09\x32\x1c\x4f\x1d\xe3\xe5\x12\x79\x8d\x91\x09\x51\x53\xcc\xdc\xac\x5c\xe5\x58\x3e\x36\x7b\x63\xf5\x0a\x63\x67\xe9\xc8\xff\xba\x28\x65\x30\x42\xb6\x2b\xd8\xe1\x2e\x79\x8d\xd8\xae\xe0\xf0\xa7\x90\x95\x01\x32\xb2\x2b\x68\x6c\xf3\x78\x90\xca\xce\xc6\x5c\xb1\x38\xf1\xe3\xc0\xa0\x62\xdc\xdc\x6a\xde\x0f\x9b\x18\x79\x1c\x20\x9d\xff\xf6\x85\xf5\xee\x68\xc6\x5b\x9f\x63\x60\xc2\x20\x9c\xdc\xd1\x98\xc7\x9f\xa1\x46\x9d\x71\x73\x4b\xd7\xf7\xed\x0b\x7f\xed\xdd\xb9\xaf\xda\xee\x50\xd6\x4e\xd9\x40\xb1\x9d\x89\x8b\xbf\x7b\xe7\x74\x67\xe2\x66\x0b\x9a\x14\x39\xe2\xb6\x32\x39\x54\x99\x23\x5e\xd0\xee\x9d\xb1\xc7\x9b\xd0\x23\xf7\xb5\x65\x03\x0b\xf8\x27\xd8\xce\xc8\x3a\x0e\x2c\x4e\x4e\xdb\x78\x2d\x16\xdd\xaf\x4a\x3b\xc3\x24\x59\x79\x37\x36\x52\x5a\xc8\x7f\x7b\x9d\x58\x92\xf5\x25\x31\x2a\x8c\x51\x9b\x20\xeb\x77\x51\xbe\x43\x97\x0a\xef\xdf\x2a\x55\x95\x90\x19\x29\x4f\xbc\xef\xe5\xef\x25\x9b\x3e\x35\x1a\xc6\x1c\x1c\x04\x7c\x11\xd8\x94\xb3\x6a\xca\x99\x4e\x41\xcb\xd5\xec\x61\x9f\x0a\xe2\xb5\x3e\x6b\x6d\x9f\x87\x7d\x3f\x53\x80\x5e\x5b\x35\x09\x9f\x5d\xbc\xcc\x7a\x7e\xb6\x66\xba\x9f\xdf\xbf\x9c\x19\xfc\xb9\x14\x1c\x96\xa9\x7e\x0d\x11\xe3\xc9\x83\xb9\x5a\x96\xe6\x9e\x3e\x9a\xea\x42\xaf\x97\xda\x19\x37\xfd\xf0\x4d\xa7\x98\xf2\xbb\x82\x43\xd2\xeb\x61\xd7\x08\x2a\x1e\xee\x9a\x92\x98\x7c\xdd\xd5\xc9\xb7\xcf\xc6\x16\xa0\xf7\xcd\x40\xf1\x6a\xed\xd8\xea\x6a\x27\xb7\xb5\x6a\xe3\x9e\x1e\x9c\x0b\xf3\xac\x62\x7d\x78\xf9\x3f\xa6\x81\xff\x38\x0b\x1c\x01\x5f\x84\x0a\x76\x59\xb8\xf7\xba\x14\x7c\xaf\x63\x3f\x31\x85\x10\x2a\xfc\x5d\x38\x7a\xda\x6e\x98\x0c\x10\xa9\x93\xb4\x4f\xd7\xa2\x8e\xdd\xb2\x8e\x5d\x81\x29\x98\xe1\xba\x6b\x33\x5c\x77\x8b\x0c\xd7\x5d\x4c\xc1\x0c\x17\xb9\xcd\x70\x91\x17\x19\x2e\x72\x4c\xc1\x0c\x71\xaf\xd1\xb0\xf1\x71\x0f\x23\x08\x59\xbc\x3b\x12\xce\x6e\x5d\x56\xc6\xba\x01\x42\xa3\x75\x1d\xef\xf9\xd9\xd1\xf2\x3d\xd8\xf3\x1d\xfd\xe6\x0b\x7d\xe3\xdb\xb9\xed\x2b\x81\x59\x12\xd4\x44\xe8\x5e\x79\x00\x7b\x91\x67\x17\x1f\x67\xaf\xbb\x45\xc4\x75\x97\xc0\x4c\x94\x85\xce\x66\xba\xd0\x45\x5e\xe4\xb9\xc8\x21\x22\xee\x15\x11\x71\xaf\x72\x98\x21\xde\x87\x15\xd8\x2b\x67\xe2\xb0\xe7\x48\xd2\x96\xee\xc6\x96\x57\x59\x22\xd8\x89\x93\x17\x3b\x7d\x8d\xc6\x4b\x5e\x9f\xb0\x22\xa6\x32\x43\x65\x2e\x3b\x25\x65\x8c\x9d\x83\x46\xc3\x09\xe7\xf3\x97\xb2\x33\x54\xe8\x2e\x95\x59\xed\x6c\x94\x31\x76\x1e\xaa\xd2\x45\x7b\x35\x91\x37\x24\xcd\x17\xce\x47\xe2\xf5\x2f\x9c\x90\xb6\x60\xad\xe1\xd7\x56\xd5\xae\x99\x3f\x7e\x09\x9c\xea\xc3\xc5\x7e\xc7\x21\xaf\x8b\x1f\xce\x7e\x87\x4e\xae\x89\xd7\xe1\xfb\x46\xf9\x35\xba\x58\xa3\x18\x80\x4c\x09\x1c\xcf\x73\x59\x1d\x2b\xf6\xf0\xdc\xde\xef\x30\xc5\xa2\x8b\xf2\xf1\xc3\xec\x1a\x70\x8c\x66\x97\x21\xeb\xf6\x46\xe3\x7e\x32\x14\x0f\x3b\x93\x30\x55\xe3\xa3\xb1\x7a\x18\xf9\x61\x80\x46\xc4\xbb\xcf\x0b\xaf\xc3\xd4\xbf\xdf\x14\x47\xb3\xf5\xab\x7f\xaf\xa9\x5f\xf3\x44\x6f\x35\x01\xb0\x06\xac\x23\xa0\x85\xce\xed\x5a\x2a\xf7\xf0\x6c\x69\x23\x36\xd2\xb9\xad\x34\x52\xa8\x5c\xfd\x4a\x33\xf6\x0d\xa4\x03\x3b\x73\x47\xd0\x97\xd0\x15\xec\x25\xd4\x16\xca\xae\x4f\xdf\xd2\xb4\x38\x7f\xf4\x21\x5b\xc0\x26\xa1\x57\xd3\xfe\x97\xed\x5a\xef\xaf\x4f\xab\xbd\x07\x5a\x28\x81\xfa\xad\x1f\xe6\xfd\x4c\x3d\xa8\x7c\x8c\x66\x53\x15\xc0\xd7\x11\x81\x35\x2f\xd7\x61\x47\x87\x6f\x5b\x4b\x03\x9e\x1a\x9f\xaa\x81\xcd\x5c\x9e\xe6\xd7\x23\xd7\x7f\x1d\xf7\xc6\x99\x72\xcf\xfb\x82\x3e\x89\x6c\xa2\xdc\x88\xdd\xc4\xac\x9b\x6d\xe2\xef\x38\x5d\x04\x0b\x37\x7c\x73\xa4\x24\xce\x79\x05\x05\x0f\x6a\x36\xc4\x2e\x6f\x96\xc5\xc7\xa8\x22\x8b\x1f\xce\x41\x87\x5e\xde\x10\xef\x00\xb7\x2b\xf5\xc7\xea\x53\x11\x5e\x42\xed\x77\x16\xde\x3b\x9d\x27\xfa\x63\xbd\x48\xb6\x16\x7a\xd8\x46\x39\xac\x3d\xed\xc8\x7c\xbf\x4b\x43\x2e\xdb\x5b\x6e\x8b\x46\xdc\x0f\xf0\xc4\x7e\x82\x07\x79\xc1\xbe\x38\x70\x02\x41\xf7\x0c\xf8\x24\x6a\x2b\x4a\x79\xe8\xa5\x9f\xe3\xd2\x9a\x52\xa6\xcd\xa5\x24\x34\x25\xde\x63\xcf\xc9\x48\xa3\xb1\x91\x0b\x07\x1d\x29\x69\x9e\x31\x6b\x34\x36\xb0\xf5\x53\xb4\x6e\x19\xa1\x83\x85\xf9\xbc\x65\x8d\x7d\x9c\x54\x8c\xbc\x4d\x9e\x84\xf1\x49\x52\x44\x3d\x41\x54\x5a\x8b\x9a\x42\x54\x56\x8b\x7a\x7e\x42\x5b\x4e\x55\x83\x71\xb3\x27\x34\xe8\x84\xf2\x44\x5f\x85\x37\xf2\x47\x8f\x81\x13\xd1\xdc\x88\x35\x79\x09\x4f\xe6\xf3\x11\xfb\xf1\xe0\xa1\xfd\x90\x8c\x8f\xbe\x0a\x67\x44\x8c\x2f\xa3\x78\xe0\x45\xec\x30\x71\xae\xe8\xc1\x21\x31\x0f\xc5\xa1\x97\x7c\x8e\x8b\xe1\x80\x33\xff\x77\xe1\x24\xa4\x79\x9b\x0a\x6a\x32\xa7\x84\xe6\x7e\xb2\x19\x06\xc6\x04\x95\x97\x7e\x2e\xbc\x43\xea\x04\xe8\xbe\x8f\x4e\x49\xc7\xba\x3d\x5d\x37\x0c\x75\x66\x1f\xa0\x23\x76\xf9\xe8\x10\x1a\xb1\x03\xe1\x24\xf8\x08\x92\x04\xd5\x8c\xe5\x9c\x08\xfe\xce\x2c\x97\x7c\x5b\xcf\x43\x8b\xb8\x67\xb4\x3a\x4d\xbd\xd8\xc9\x78\x2d\x4b\x4a\xe8\x86\xf3\x0b\x93\x65\xc4\x7e\x27\xbc\xc5\x39\x0c\xd4\x7c\x9e\x7d\x1e\x31\xf1\xd8\x6e\xb9\xd9\x9f\x7c\xc4\x86\x3f\xda\x23\x76\xfc\xc5\xd5\xc6\x32\xb2\x4d\x48\x23\xbf\x43\x4e\xd2\x1c\xb1\x64\x44\x9f\x78\xda\xdc\xda\x0c\x3d\xec\xc8\x84\x3e\x51\x07\xcd\x3f\x4c\xe8\x13\x01\x04\x68\x6e\x11\xef\xc9\x82\x06\x63\x99\x92\xf9\xfc\xc7\xae\x97\xfb\x29\x0c\xd4\x04\xc7\x0a\xc8\x4a\x02\x34\x25\x2d\xbc\x3b\xe0\x3a\x44\xbf\xa8\x82\xee\x3e\xb8\x4f\x85\xaf\xd4\x4c\xcb\x5c\xd1\x72\xb5\x3e\x99\xb5\x0a\x08\xb7\x08\x16\x0b\x6d\x58\xf5\x09\x3d\x59\xe2\x0c\x95\xe3\xf4\xe2\xa7\x81\x35\x24\x53\x8d\x97\xfc\xe9\xde\xd1\x20\x11\x3a\x68\x34\xa4\x1f\xaa\xc0\x59\x2b\xed\x82\x64\xfd\xc8\x6f\x05\x28\xea\x17\x71\x59\x8b\x28\xb6\xa3\xcf\x51\x7b\x73\xcb\x0d\xff\x8c\x60\xed\x2d\x60\x9e\xbf\x3e\x3b\xe9\x66\x48\x5f\x9e\xa0\x36\x5a\x97\xd6\x86\xfa\x5f\x34\xa9\xd4\xf4\x8c\xcb\x05\xf1\xde\x2d\x83\x59\x54\xb2\xf3\x24\x28\xf4\x05\xce\x2a\x06\xc5\x30\xad\x45\xb7\x9f\x4a\x9d\xe1\x6b\x6d\xd4\xfe\x64\xe2\x44\xd5\x8d\x71\x6a\x55\x1d\x0c\xac\xff\xfc\x53\xcc\xe7\xb2\xf2\xea\x5a\x5a\x54\xb2\x03\x69\x68\x07\xda\x22\xd1\x2e\x3a\xb5\x39\x92\xc8\x57\x01\xaf\x19\x68\x6b\x79\x70\xd0\xc8\x96\x14\x03\x25\x8a\x7e\xa1\x6a\xa0\xf1\x93\x54\xe8\x7e\xb5\x5b\x6e\xec\x41\x3d\x30\x35\x8e\xf9\x40\xcc\x09\x01\x8f\x14\x4d\xb4\x0f\x60\xd4\x79\x5a\xe0\xd4\x2a\x2e\x10\x94\xc8\xc2\x01\x91\xba\x69\x2c\x6f\xda\x16\xd6\xf2\x0b\xc4\xc5\x41\x45\xfe\xbc\xaa\xb0\x70\xb8\x24\x89\x41\x5e\xb7\x57\xc4\x7c\xa9\xa2\x89\x19\xd3\xde\x39\x17\x7d\x47\xd0\xce\x48\xd0\x7e\x6c\xa5\x8a\x1f\x53\xa1\xdf\xb0\xfd\x9b\x91\xa0\x97\x23\x11\xd0\x41\x2c\xe8\xd4\x96\xba\x2a\xd2\x2f\xd6\xa6\xf7\x53\xc1\x7f\x60\xfa\xd5\x48\xd0\xd3\x91\x08\xac\x70\x45\x91\x70\x56\x4f\x18\xa4\x82\x7f\xc7\x84\xeb\x91\xa0\xdf\xa1\xc6\x2d\x7b\x9a\x28\x92\xce\x97\x93\xe2\x1f\x1a\x8c\xbd\x47\x41\x2f\x8e\x04\xbd\xb0\xf0\x9f\xf0\x8d\xd6\xe2\x87\x73\xd8\xa1\xdb\x1d\xe2\x1d\xbe\xa5\x56\x51\x66\x2e\xdf\x36\x77\x5f\xcc\x0b\xa6\x3c\x30\xa7\xe9\x7f\xda\x07\x87\x8a\x86\x55\xef\xc0\x1d\x9d\x8a\xaa\xf4\xc8\x62\x61\xda\xc9\x3e\xad\x35\x02\xfc\x5e\x20\x93\x6a\x6c\xb3\x3c\x9e\x54\x51\x78\xac\x1f\x5b\x4c\xc6\x9b\x9e\x23\xd6\x9b\x1a\x12\xac\x93\x2c\xaa\xb7\x3c\x5f\x4a\x39\x27\x96\x71\xc1\x32\x3c\x71\xa3\x5d\x1b\x4f\xf8\x32\xe0\xc2\x2a\x9f\x48\xfc\xf4\x24\x4b\xb9\x64\xa9\x89\x92\x2c\xf5\xa4\x1f\x06\xa8\x1b\x5b\x55\x47\x81\x70\xc5\xd4\x59\xd5\x3e\xa2\xd5\xb7\x28\x4c\x59\x17\x30\x68\xc7\x68\xf0\x07\xaa\xc2\x90\x27\xf8\xb1\xb9\x85\xa8\x25\x16\x98\xcb\xae\x2b\x0f\xe4\x5f\x3b\x56\xd0\xa0\xec\x4b\x61\x1a\x70\x49\x99\xa6\xe0\x93\x65\x05\xd0\xe3\xa2\x82\x3d\x18\x83\x3d\x51\xab\x62\x4f\xfc\x4a\x1d\xdf\x8a\x3a\x76\xa1\x8e\xdd\x7a\x1d\xbb\xc2\x0b\xd9\xd9\x98\xc3\x1f\xab\xd4\xc3\xce\xc6\x3f\xa9\xf8\x9d\xc6\x8a\xd1\x3f\xdf\x10\xa4\x7f\x3d\x91\xae\xa0\x4f\xa9\xbd\xba\xa9\x89\x96\xd0\xc3\xb1\x1b\xd2\xed\xd4\x95\xec\xba\xbb\x40\x8f\x56\xd7\xdd\x9a\xea\x8f\x6a\x34\x6e\x9f\x1d\x13\x4d\x2b\x57\x06\x8a\xf8\xfd\x97\xa0\x94\x25\x34\x2a\x6b\x57\x39\x7b\xbc\xa1\x31\x57\x9c\xbf\x74\xe7\x73\xc5\xf9\x34\xa1\x0a\x82\x5f\x13\x1b\x4c\xb8\x59\x5d\x1b\xfc\x82\xa6\xe5\x6d\x53\xeb\x73\xa4\x2f\xfe\x69\xc6\x8f\xcf\x1c\xa9\x8f\xcb\x39\xdf\x42\x36\xa0\xd1\x70\x92\xf9\x3c\x05\x9e\xa6\xe5\x0d\xac\x89\xf1\x81\x75\xd9\x97\xf9\x83\x80\x4e\xf8\x88\x85\xfd\x6c\xf2\x90\xd3\x27\xd8\x8d\xfb\xcf\xf4\x85\x0b\xe0\xab\x27\x01\x1d\xf1\x17\x60\xac\x7b\xb1\xf3\x04\x88\x72\xea\xbc\xbe\x84\xee\x84\x76\x84\xfb\xb4\x28\x1c\x94\xbc\xb0\x97\x67\xb3\x40\xd3\x91\x7b\x52\x98\x08\x7d\x82\x03\xcf\x13\xcb\x71\xa1\xc6\xc0\x24\x34\x1a\xa7\x26\x35\x2a\x53\xeb\x7a\xf6\x7b\x6e\x81\xd0\xa3\xf6\x86\x60\x99\x3f\x0a\x58\x27\x71\x37\x60\xa1\x19\xed\x7e\x80\xea\xee\xc5\x9b\x9c\x0a\xa7\x6c\x63\x64\x5a\x39\x5b\x6d\x81\x8e\xc8\x62\x11\x37\x1a\xef\xf2\x46\x63\x43\xb0\x87\x67\x7c\x5d\xbe\xec\x39\x57\x3d\xa7\x7a\xa3\x59\x59\xd4\xa6\xab\xd2\x0e\x4d\x47\xb8\x12\xc6\x66\x41\x16\x84\xde\xf7\x08\x6d\x7d\xd6\x9e\x08\x9f\x2c\xc9\x89\x68\xd2\x1e\xb8\x7e\x40\x07\xfe\xc0\x5c\xd9\x12\x2f\xe3\xdb\x66\x52\xe8\x4b\xa2\x27\x7e\x69\x2a\x26\x7a\x16\xca\x21\xcf\x0b\x37\x0e\x7a\xf0\x4d\xc4\xa8\xd1\x78\x2e\xa9\x1b\x74\x16\x6a\xd7\x52\x4b\xbc\xb3\xe7\xe5\xfc\xc8\x4e\xbf\x97\xf0\xad\xcf\x79\x65\xfa\x2b\xed\xe6\xb6\xdd\x27\x9e\x43\xbb\xe8\xe7\xe2\xd1\x7f\x0a\x68\xd6\x76\x46\xbc\x45\xcb\xe9\x1b\xd1\x14\x28\x08\x4c\x5c\x52\x9d\xb8\x91\x76\xfa\x3b\x2d\xa1\xa9\xe6\x9b\x95\xe3\x21\xe1\x68\xce\x26\xb7\xe8\xb7\x31\x69\x34\x9c\xac\x5d\xd6\xd2\xa2\xd8\x70\xee\xe7\x7a\xb0\x02\xe2\xc6\x28\xe2\x7d\xd5\x73\xf2\xf5\x73\x72\xfa\x08\x8b\x17\x86\x3e\xc6\xce\xbd\xac\x69\x2a\x26\x84\x78\xb1\xd6\xc5\x1b\x48\x6f\x80\x5f\xfe\x78\x16\x78\xef\xf4\x38\x0e\xda\x02\x39\x05\xd6\x01\x88\xce\x8b\xde\xc6\x74\x00\xbd\x50\xd5\x9e\xc6\x74\x40\xe8\xb6\xb9\x8b\x1f\xa0\xc3\x64\x5d\x49\xdc\x68\x54\x6a\xb9\xa8\x54\x12\xea\xd6\x77\x05\x00\x70\xd8\xf5\x7e\x31\xff\x25\xde\x0a\x54\x32\xef\x09\x3f\x86\xf9\xdb\x29\x47\x39\x36\xf0\xc1\xce\x14\xb1\x13\x49\x1a\x0d\x67\x79\xb4\xfd\x87\x30\xa0\x31\xa1\xc5\x2e\xba\xa5\x8d\x43\xc7\x5c\xfa\xbb\x2f\x01\xfb\xf0\x8d\xc4\xfc\xa8\xe3\x84\x34\x06\xd4\x8a\xd9\xe0\x86\xd0\x98\x69\x37\x1e\xdc\x7e\xe0\x5e\x61\x03\xec\xc3\x35\x6c\xc6\x45\x15\x78\x7b\xa3\x70\x05\x21\xca\xc6\xc0\x52\x52\xc5\x07\x58\xa1\x46\xa7\x18\x18\x4c\x34\x4c\x7b\xf7\x42\xcd\x6a\x56\x38\xf0\x0a\x17\x33\xae\xe5\xea\x52\x55\x38\xd6\x44\x0b\x08\x48\x16\xf7\x48\xc8\xe2\x1e\x97\x9a\xca\xef\x9e\x0a\xee\xb3\x8f\x9f\x28\xdb\xa2\xac\xf5\x29\xa0\x7b\x18\xf1\x8f\x22\xbc\x5f\x84\x3f\x61\x44\x45\xec\xf8\x7c\x8d\x91\x6d\xfd\x94\x47\x13\x1e\xe3\x73\x9e\xb1\x27\x81\xa6\x24\x8c\x59\x09\x67\x63\xf7\xda\x89\xe1\x78\xb1\xc1\x63\x7f\xf2\x12\xcc\xe7\x7b\xd7\x4e\x82\xe8\x65\xd8\xca\xd8\xb0\x99\xed\xfd\x53\xe1\xee\x9e\x0a\x4f\xc1\xb6\xab\x9f\x43\x3d\xc5\xbe\xe5\x1c\xb7\x22\xf8\xf2\x42\x76\xa4\x2c\x13\xab\xd5\xfb\x53\xab\xde\x6f\x8e\xbf\x35\xeb\xfe\x17\xd6\xaa\xff\xf1\x1e\xbd\x4d\x5c\x80\x91\x4e\x84\xbb\x85\x1e\x4d\x8e\xd0\x2b\x86\xbd\x50\x5f\x90\x85\x75\xa5\x54\x7a\x70\xa8\x08\x7a\x59\xb9\x2a\x81\xc6\x2e\xbe\x3f\xce\xe7\x89\x96\xa9\xc2\x0f\x4f\x5a\x9f\x80\xc2\x3f\x0c\xa8\x40\xb9\x0a\xf4\x87\xa4\x05\xe6\xd6\xc0\x2b\x38\x82\x10\x19\x55\x53\x76\x2a\xe9\x6c\xea\x98\x38\x5a\xf1\x30\xb8\x29\x50\xaa\x64\xdc\x1f\xe8\x2f\x7f\x18\x34\x05\xfa\x1a\x6c\x0a\x82\xc6\xec\x25\xd5\xf9\x88\xc9\xc6\x05\x1d\xe8\xd8\x61\xd0\xfc\xf8\x9b\x20\xf4\x52\x07\xb7\x75\xf0\x0d\x75\x7a\x2b\xc7\x55\x38\xa8\x98\x3a\x8a\xbe\xdb\x68\x69\xa9\x40\xe8\x36\x5a\xd3\xc2\xaf\x99\xf6\x41\xdc\x3b\xe7\xb0\xab\xce\xe7\xe6\xf3\x6b\x42\x22\xbe\xad\x27\x98\x46\x7c\x94\x3b\x02\xf8\xe2\xf9\x3c\xd2\x2a\x21\x5b\x74\x63\x8b\x0a\x60\x7b\x09\x3d\x38\x05\xa0\x12\xaa\xf0\xb1\xf3\x2a\x15\x30\xdb\xc7\xbd\xb6\x23\x38\xfc\x52\xe0\xea\xbe\xbd\x04\x4d\x51\x0c\xd0\xef\x1f\x89\x8b\x32\x98\x09\xca\x66\xfc\xd2\x98\x66\xe5\x98\xca\xa6\xf8\xfd\x23\xa1\xb2\xc9\x45\xcd\xec\xe3\x45\x67\xf5\x5d\x18\xf1\x3a\x36\x26\x55\x14\x01\xfe\x40\x01\xfa\x92\xd7\x98\x7f\xed\xa0\x83\x63\x2f\x36\xb8\x19\x73\xf8\xf2\x62\x83\x9b\x78\x8c\xf2\x12\xd4\xed\x43\x8f\x2d\x92\x5d\x45\xed\x43\xa8\xc6\x3d\xb8\x76\x14\xdd\xd8\x32\x1f\x12\x0e\xf5\x5e\xc2\x0f\x76\xd1\xe3\x76\x79\xa9\xa3\xd8\xb7\x50\x3b\x32\xd0\xfe\x90\xf6\x4e\xc5\x92\x47\xa4\x9f\xa1\x39\xe4\xce\x2c\xa2\xd3\x01\x3f\x84\xea\x69\xda\xcc\xf5\x10\x22\xa0\x15\xd4\xcf\xe9\x40\x8c\xbb\xee\x60\x41\xbc\xb4\xc9\x21\xd3\x62\x11\x73\x07\xff\x47\x2c\x23\x8d\x46\xec\x87\x01\xfc\xb0\xb4\x7a\xe9\x61\x7d\xce\x26\x04\x00\x4e\xfd\x24\xa0\x1b\xe9\x7c\x9e\xb2\x0b\x35\x9f\x3b\x7b\xd7\x4e\x4a\x15\x99\xcf\x63\x28\x9f\x04\xfa\xaf\xff\x03\xef\xa7\x0b\x5a\x92\xa0\xad\x1f\x54\x4a\xd2\xc3\xc5\xef\x8e\x90\xb5\xe8\x1d\x3a\x8a\x25\x40\x21\xed\xec\x6c\x6e\xd1\x88\x2c\x34\xc3\xd9\x3b\x5c\x32\x4e\x26\x7c\x79\x14\xd4\xaf\x2d\x05\x2a\x5c\xf8\xc7\x41\x55\x77\x62\xa7\x2a\x03\x50\x72\x8f\x68\xfd\xb4\x34\x93\xd3\x6c\x16\xa6\x77\x9f\xae\xe1\xf0\x8f\x07\xa4\x72\xdf\xc9\xad\x9d\x5d\xd3\x8f\x18\xfb\x51\x45\xa9\x93\xff\x2b\x62\x69\xd6\x96\x17\x56\x68\x64\xc8\x8e\x7b\x80\x87\x11\x87\x2f\xf3\xee\x2c\xd9\xd7\x6f\x9e\xe2\x5b\xc6\xdb\x44\x86\x46\x57\xae\xbb\x54\xf1\x56\x21\xec\xfa\x73\x4a\x07\x85\x8d\x92\x17\x7f\xcc\xcd\xb3\xba\xd5\xfa\xea\x46\x4e\x46\x3c\x4d\xba\xc3\x7d\x54\xd1\xff\xf2\xe0\xec\x3e\x38\xa9\x36\x8c\xcd\xfa\x11\xa1\xd2\xc4\x65\x3a\x18\x9b\x60\xc2\xce\x5f\x2a\xb9\x2a\x55\x6a\xdf\x99\x31\xf5\x05\x95\x01\x01\x0e\x24\xcc\x1d\x93\x4e\x55\xd9\x3a\xda\xdc\xf6\x92\xf5\xa4\x38\xe5\x29\x3b\x95\x9e\xe0\x51\x41\x05\xbc\xd9\xd4\x89\x2c\x4d\x4d\xfc\xc3\xa0\x99\xfe\xfe\xb1\xb9\xc5\x3e\x01\x45\xa0\x09\x8a\xb5\xd6\x62\xd0\x03\x49\xda\xfc\x47\x53\x10\x9a\xf8\xdb\x45\x80\x10\xcf\x69\xfd\xc9\x23\x68\xcd\x1f\x06\xf3\x79\xeb\x4f\xfe\x4e\x87\xb6\x01\xb1\xcd\x9b\x23\xce\xc3\x2f\x13\xd9\x10\x35\xa6\xa3\x82\xc6\x46\x3f\xa7\xb1\x2f\x5d\x4b\x04\x90\xbc\xf6\x81\xbc\xa6\x35\xf2\x3a\x00\x5a\x6a\xc9\x6b\x48\x73\x2a\xd8\x63\x2a\xc8\xc2\xce\x66\x8d\x78\x64\x74\x57\xb9\xca\x52\x10\x53\x91\xd9\x24\x33\x18\x36\x43\x6f\x71\x70\xa2\x2a\x2d\xae\x11\xd1\x83\xba\x4c\x06\x1c\x1d\x4f\xfe\x98\xcf\x1d\xf8\xe1\xaf\x0b\xbd\x87\xc8\x62\x0f\x91\xd8\xbf\xd0\x00\x14\x99\xfd\xf3\x6b\xea\x68\x21\x60\x2d\x08\x18\x55\x23\xb5\xcb\xfc\x99\x15\xcc\xa9\x08\x0d\x0a\xeb\xa3\x4e\x2c\xc5\xa2\x70\xae\x17\x32\xa0\x6f\x3c\xf4\x2f\x60\x41\xe1\xfd\xf3\x37\xf4\xbc\x6e\x86\x55\xa1\x0b\x41\x73\x31\x35\xfa\xe6\xf8\x31\x15\x01\xa1\xda\x78\x75\xcc\x1e\x22\xfd\x0a\x2f\x9a\x4d\x82\x75\xb0\xab\x7b\x07\xa3\x85\x36\x96\x56\xad\xe7\x2a\xd1\xbe\x37\xb1\x1e\x49\xa3\xa2\x1e\xb5\xbe\x1e\x65\xeb\xc1\x18\x5f\xe2\xbb\x58\x39\xa8\xcf\xeb\x44\x96\x32\x63\xeb\xcb\x51\x85\xf7\x72\x55\xf8\x36\x57\xd6\x8f\x79\x65\xc7\xd2\x03\x56\xee\x5a\x9a\x5a\xe8\x58\x08\xd1\xff\xd9\x6e\xb5\x84\x4c\x06\x81\x70\xeb\x1a\x2a\xc0\x20\xeb\xb8\xa4\xd8\xcd\xf0\xe1\x50\xcf\x86\xde\x93\x36\x9d\x22\xad\xf9\xb1\x19\x57\x91\x4b\xdf\x0c\x1b\xa2\x6c\xb7\x9a\x98\x24\xb8\xd5\xc4\x01\xdd\x48\x60\xb5\xdb\xad\x26\xc1\xad\xe6\xe4\x58\x0b\x6b\x35\x1a\x1b\x08\x6c\xa3\x51\xd0\xe1\xf8\xaf\x37\x9a\x62\xb0\xf5\x4e\x53\xde\xc1\xfe\xcf\xf7\x8c\x62\xa3\x38\x79\x6b\xa3\x38\xac\x56\x8e\x44\x5d\xb2\xc3\x31\x0d\xf1\x89\xb3\x10\xd2\x52\x85\x5e\xcc\x76\xea\x85\x6c\x24\x79\xe4\x29\x38\xdd\x8c\x14\xdb\x19\xa1\x98\xdc\x76\x4a\x21\xa1\x02\xf7\xe9\x0a\x5b\x33\xeb\x38\x82\x5d\xe5\x66\x95\x6a\x0b\x9c\x16\x80\x42\xf6\x28\x5a\x50\x55\xa9\xe5\xa9\x0e\x20\x8a\x9c\x95\x75\x08\x16\xff\x28\xeb\x88\x6a\x16\xf4\x5f\xaa\x25\x7b\xb1\x83\x12\xce\xc3\xb2\x7c\x84\x26\x2b\xa0\x7c\xc4\x8f\x4d\xbf\x23\x3f\xb2\x52\x5a\x2b\xfd\x8e\xa0\xdf\x61\xb5\xdf\xa1\xee\x77\x84\xfd\x2e\x1b\x9e\xad\x36\xac\x2b\x2b\x5a\x21\x46\x20\xdf\x8e\x68\x65\x64\xb4\x60\x87\xd1\xa6\xb7\x33\x88\x46\xa8\x15\xb6\x4f\xe3\x95\xf6\x21\x81\xd4\x66\xf5\x6c\xcd\xf6\x7f\x64\xa7\x16\x30\xf1\x79\xea\xc4\x34\xf6\x13\x63\x76\x06\x58\x48\x08\x78\xb1\xaf\x02\x0e\x7f\x8a\x8b\xb9\x18\x83\x34\x79\x0b\x5e\xdd\x86\x17\xb3\xae\xe0\xa1\x97\x34\x1a\xe1\x0a\x7c\x90\x56\x99\x97\xed\xa5\xe1\x11\x6c\xbf\x67\x47\x08\xbe\x3d\xc1\x77\x2e\x1d\xe5\x3f\xbc\x04\x54\xb1\x8b\x2f\xd4\x7f\xd5\x8f\x36\x5a\x1a\xdd\x88\xa0\xc7\xfe\x41\xb0\x80\x93\xce\x87\x10\xf6\xae\xfd\x1e\x7f\x8d\x54\xdc\xcb\xb5\x88\x0a\x30\xd8\xa5\x02\x65\xb5\x41\x01\x03\x11\x69\xbf\x37\xcf\x53\x47\x50\x51\x8e\x02\xf0\x71\x30\x0a\xc2\x0f\x03\x2e\xec\xb5\x6d\x88\x9f\xb0\x57\x00\x7b\x2f\xf5\x9d\xe5\xbd\x74\xe0\x1b\x76\xce\xca\xb8\x8f\x56\xe9\xe5\xeb\x89\x74\x25\x7d\x4a\x5d\x3f\xa0\x87\x63\x37\xa2\xdb\xa9\x11\xbc\x89\x79\xa8\x2f\x37\x50\xdf\xdd\x5c\x6e\x48\x94\x6d\x49\x2c\x96\x16\x2a\x7a\x78\x13\x21\x86\x0a\x8f\x77\x52\xab\xea\x91\xc2\x03\x02\x5e\x3c\x96\xc2\x62\xb1\x95\x2e\x4f\x4a\x82\x91\xf1\xd0\xde\x2b\xa0\xd1\x3c\xc3\x4e\xa6\x34\xe1\x97\xb5\x8b\x9a\x15\xe3\xfb\x0b\x7b\xeb\x98\xe0\x65\x4d\xe2\x0f\x02\xd8\x46\x3f\x67\x1e\x19\x34\x9b\x5e\x8b\xf3\x41\x3b\xe1\x2d\x77\xc0\xd1\x55\x7c\x3b\xe1\x5a\x6e\xcc\x75\x32\x9e\x7d\x3e\xbe\x77\x12\x7f\xb0\xb9\x85\x65\xa8\x2d\x4c\xda\x83\xcd\x2d\x77\x40\x13\x7e\x01\x8d\x27\x7e\xa6\xa5\x59\xf0\xa6\x63\x61\x64\x88\x2a\x9e\x65\xb5\x3b\xf5\x2f\x30\x73\x31\x4d\x08\x1d\x4e\x9d\x1c\xc6\x9e\xa6\x70\xe6\xc3\xab\x1e\x61\xde\x64\xa8\x1e\x42\x27\xe7\xdf\x30\x3b\xa1\x39\xdb\x4f\xf8\xeb\x77\x57\xb2\xdb\x7f\x2e\x88\xf1\xd2\x68\x1e\x9e\xf2\x66\x93\xe4\x38\x62\x8e\x29\x97\xe8\x72\x39\xa1\x09\xdb\x16\xfc\x55\x0a\xd7\x1a\x21\xd8\x59\x2c\x08\x4d\xf4\x4e\x96\x13\xfa\x2e\xc3\x51\xcc\x03\x9a\xb0\x6f\x21\xcf\xd8\xb7\xd0\xc8\xbe\x87\xb9\x03\x51\x94\xfd\xc3\xde\xda\x84\xb5\x5b\x9b\xe8\x6f\xdf\xda\x00\xb3\x6e\x2a\xb9\x14\x04\xa6\xef\xfc\xd1\x4f\xf0\xc6\x26\xe6\x39\x54\x96\x70\xc9\x4e\x21\xae\x23\x02\x9a\xf3\xbc\x72\x63\x13\xb7\x8b\xc3\x83\x2b\x8b\x1b\x1b\x33\x60\x34\xd7\xb7\x35\xd8\x7b\xf8\x0b\x28\xc2\xf9\x97\x43\x7b\xce\x08\x8b\x4b\x30\xcd\x56\x95\x57\x62\x7a\xa4\x80\x4a\x55\x47\xb8\xf2\xc2\x67\x45\xad\xe9\x88\xe6\x3c\xd6\xfc\x47\xeb\x33\xcf\xbd\x7c\x73\x13\xed\x21\x26\x3c\xf6\x73\x60\x5c\x6b\xc7\x10\x83\xf5\xd2\xb8\xf0\x95\x86\xfb\x92\xc6\xd5\xaf\x44\x16\xcd\x58\x9a\x34\x1c\x57\xa2\xd1\x0b\xb8\x3a\x38\xac\x8c\x78\xae\xf9\xdf\x45\x71\xe9\x6a\xf1\x27\xa4\xa3\x37\xf1\x07\xd2\x48\xc5\x77\x7f\x1d\x49\x42\xc4\x8e\x77\x3f\x43\x8f\x0a\x76\xfc\x12\x72\x54\x85\xfe\xbe\x58\x25\x25\x2d\x3a\x35\xb4\xb6\x5c\xaf\x9e\x0b\xb5\xde\x7b\x9e\xa4\x8e\xb0\x36\xe4\x84\x3f\x0c\x36\xb8\xc4\x73\x80\xf0\xb7\xf1\x7b\x3b\xf0\x36\x90\x02\x6f\xc3\x64\x6e\x6b\x0b\x64\x68\xa6\x13\x69\xb7\xce\x8b\xb6\x3a\x75\x78\xdb\x84\x0f\x4d\xf8\x50\x87\x61\xdc\x31\x42\x33\xb6\xa6\x75\x6d\xf7\x26\x6c\x34\x72\xe9\x54\xa2\x80\x0e\xb6\x8a\x4c\x2c\x54\x56\xb4\x0e\x03\xfc\xe6\xbe\x12\xa2\x49\x6a\x2e\x35\x4f\x7b\x02\x92\x04\x44\x16\xc4\x07\xf7\x2b\x43\x7e\x8e\x90\x08\x86\x0a\xb6\x1f\x69\x7e\xcb\x8a\x20\xb4\xd1\x42\x73\x74\xd6\xa4\x49\x09\xc2\xd7\xa8\x02\xc2\xd7\xa8\x0a\xc2\xd7\xa8\x04\xe1\xcc\x82\xf0\x35\xfa\x19\x08\x5f\x23\x0d\x82\xfe\x2d\x2b\x42\x10\xb6\x00\x8a\x65\x10\xc2\xbe\x7e\xd8\x39\x36\x76\x6a\x8e\xcd\xed\xae\x49\x7e\xfe\x83\xbf\xc3\x8f\xa7\x3f\x74\xfa\x57\x9b\x5e\xd9\x4b\x8e\xea\xa6\x13\x8c\x9d\xba\xf9\x7c\x43\xae\x38\xc1\x49\x34\x5a\xd0\xd4\xa0\x47\xca\x8e\xef\xb9\x64\xc7\xf7\x5e\xca\xae\x80\x53\xbc\x52\x5e\xca\x14\xac\x47\x15\x7b\xc6\x7c\x51\x8c\xd3\x18\x56\x26\xb0\xe2\x63\xa4\xd1\x90\xc5\x97\xf0\xd5\x0b\x30\xac\x12\x7e\xc9\xab\x60\xfb\x12\x70\x0b\xfe\x3a\x29\xdb\x97\xa8\x2d\x8d\xae\x23\xa1\x79\xf8\x25\x00\xc2\x6d\x04\x41\xf8\x25\xde\x8e\x70\x52\x0a\x21\xa0\x2d\xe8\xd5\x4a\xa7\x86\x36\x35\x84\xd4\xd0\xa4\x5a\x4d\x42\x2e\xcd\x87\x3e\x87\x1e\x21\x7d\x3a\x12\xe4\x35\x65\x47\x82\x27\xf7\x0e\xfc\xe2\x4d\x2a\x86\x42\x0c\xe9\xbd\x0e\x52\x68\xce\x21\xca\x2b\xf9\xf8\x52\xd4\x00\xa8\x21\x00\x00\xbf\xc4\xcb\x4d\x28\xc7\xd0\x93\xf1\xda\x1b\x07\x74\xc4\x05\xbb\x8d\x50\x55\x11\xbd\xf8\x8d\xb8\x84\xf0\x30\x75\x46\xc4\x1b\xb0\xdb\x02\x42\x67\x44\x16\x0b\x84\xf2\x0a\xc6\x8e\x5d\xe9\xf3\x5c\xca\xae\xba\x1a\xd0\xab\x2e\xa1\xa1\x09\x85\x18\x02\x20\xaf\xba\x08\xe4\x55\x97\xbe\x5b\x82\xb0\x06\x20\xad\x01\x48\x7f\x01\x38\xba\x04\x9c\x9e\xdb\x5e\x84\x4a\x9d\xbd\x28\xd0\x76\xac\xa6\x30\x2b\xf7\x4e\x8a\x31\x84\x86\x53\x98\x87\x7b\x6d\x09\x92\x40\x85\x98\x42\x43\x8e\x31\xf4\x7b\x07\x6a\xfe\xde\x71\x42\x62\x4e\x1e\x23\x0b\xee\x37\x83\xac\xd8\x06\x00\x27\xed\xc7\x08\xfe\xa0\xf4\x9a\x55\x2d\xab\xc1\x61\x24\x8a\x4e\x0f\x84\x8e\xd7\x05\xd7\xbb\xf6\x11\x6c\x2c\xd0\x6f\xa9\x80\xe3\xfc\xd4\x49\xe8\x65\xcf\x94\x5a\x9b\x5f\x93\xfe\x09\x3b\xfb\x17\x3e\x37\x61\x99\x14\xca\xfc\xa4\x0d\x5b\xe6\xbc\x52\x06\x07\x25\xd1\x83\xe2\x7d\xef\x98\x4f\xf8\x4a\x8b\x2f\x3d\x66\x46\xeb\xc7\x4f\x68\x5a\xf5\xb2\xf5\x6d\xd9\x0a\x8a\xbd\x4d\x53\x6c\x5b\xa0\xd7\x2a\x3d\x8f\x0a\xe7\x31\x2b\xe6\x31\xd3\x2c\xa9\x99\x45\x4c\xf5\x64\x39\xad\x99\xb6\xb7\x08\x7c\xe4\x36\xea\x8f\xb2\xe9\xa6\xa0\xa9\xfe\xe2\xb2\x19\xd3\x08\xfd\x4d\x43\x78\xc6\x23\x9b\x69\x66\x1e\xf1\x2a\xe5\x66\x45\xb9\xd9\x52\xb9\x69\x59\x6e\x5a\x73\x40\xd2\x31\x06\x68\x97\xf4\x48\x90\x75\x06\x2a\xe4\x87\x01\x41\xc1\x88\x10\x98\xda\x6d\x01\x91\xf0\x6b\x55\x4b\xe1\x1b\x95\xa9\xa1\x6e\xcb\x2c\x63\xc0\xdb\xb7\x97\x65\xdf\xbf\x3b\x8a\x4d\xa9\x02\x90\x17\x35\xd9\x8c\xe3\x9a\x06\x2d\xdb\x1d\xa2\x3c\xee\xd5\xb3\xe6\x64\xb2\x46\x23\x64\x99\x15\x02\x00\xdc\x42\xcb\xe5\x75\x27\xf0\x55\xbc\xea\x45\x80\x57\xbd\x08\xce\x00\x40\xb4\x2f\x97\x1d\x52\xad\x60\x48\x64\xb1\xca\x13\x40\xed\x2f\x7b\xce\x9b\xd5\xdb\x02\x06\xa5\x3c\xed\x0b\xea\x24\x99\xcf\xf5\xd7\xdd\x51\xdb\x81\x59\xb5\xda\xae\xb8\xd7\xb5\x02\x17\x37\x1c\x6d\xdd\xbb\x48\x0b\x4d\x5a\x68\xd2\x4a\x2a\x1d\x56\x28\xb7\xa6\xd7\x21\xfc\xb6\x4f\x34\xee\x69\x0c\xa3\x06\xb3\x88\x7b\x8a\x03\x48\x8c\x63\xaa\xce\x5e\xa3\x71\x86\x31\xd5\x53\xe4\xe9\xf2\x20\xb3\x3d\x61\xc6\x99\xed\xe1\xe4\xc9\x46\xa3\xa2\xad\x42\x8d\xa7\xf5\xd7\x85\x76\x20\xbf\x2a\xb7\x66\x4e\x14\xfe\x87\x00\xf0\xcf\x87\x8f\x80\x4b\xb2\x20\x4b\x3a\x4a\x2b\x79\x93\x7a\xde\x9f\xd6\x1b\xf9\x32\xe0\xa6\xc0\xfa\xaa\x8b\x83\x05\xe4\xa9\xb8\xc3\x87\x12\x5e\xe4\x87\xc1\x06\x47\xe7\x75\xda\x4c\x2f\xf1\x14\x0a\xa0\x2c\xfe\xb2\x69\xe5\x9b\x66\x6d\x05\x08\x0a\xd6\xb1\xa8\x3e\xaf\xb4\x68\xc6\x5b\xe8\xa6\x8e\x0e\xb8\x1f\x78\x29\xda\xd3\x9f\xcf\x33\x6d\x73\x88\xe8\xb0\x3d\xc4\x45\x7e\x1a\xb4\x9d\x01\xbe\x98\xfc\x98\xba\xaf\xa3\x9e\x9b\x52\xf5\xe2\x6e\xb4\x16\xf4\x4e\x87\x33\x0c\x6f\xc1\xf1\x44\x7b\xd4\xd3\xde\x07\xfc\x34\xf0\x3f\x04\x0b\x42\xd3\x66\x93\xb8\x8e\xae\xde\x56\xab\xfc\x6c\xb5\xda\x77\xba\x9e\x7a\xbd\xad\xa5\x7a\x43\x3f\xd3\xf5\x12\xf7\x57\xc0\x5a\x2e\x5e\x07\x8b\x66\xcd\x26\x2c\xa2\xb3\x7b\xb6\x27\x78\x6e\xac\x3d\xad\x5d\x48\x2d\xce\x65\x5b\xe0\xd2\xf8\x93\x0b\x38\x6a\x9e\xf5\x1c\x41\xdc\xcb\x8e\x23\x7c\xb9\xb9\x15\x50\xe1\xcb\x80\xb2\x4f\x64\xe1\x21\xba\xde\x47\xed\x73\x44\xff\xc1\x92\x69\xd3\x8a\x33\x4f\xc9\xd4\x4b\x5b\xf8\x92\x8d\x7a\xbf\x85\xcd\x28\x70\x47\xb8\x5c\x74\x88\x2c\x88\x7b\xd5\x59\xa9\x60\x5d\xe1\xb2\x20\x59\xd4\x9f\x62\x56\x6d\x80\xe8\x95\xa4\xaa\x2b\x29\x6a\x34\x50\x6b\xbc\xa5\x5d\x71\xcc\xe7\x2d\x98\xa1\xe3\x80\xd8\x91\xf1\x03\x8a\x90\xf8\x35\xd5\x93\xaa\x51\xf8\x8a\x41\xb4\x78\x9d\x0e\x81\x74\x10\xdd\x17\xd6\x1f\xae\x1f\x68\xfa\x7b\x0c\xc4\x02\xdb\x2a\xef\x0a\x5a\x5e\xa6\x45\x26\x61\x76\x52\x3b\xc7\x19\x4c\x6c\x06\x67\xe0\x0a\x32\x38\xc7\xf7\x0e\x54\x93\x05\x84\xc6\x8e\xc2\x93\x3c\x31\xc0\xbc\xcf\xf8\xd9\x81\x70\x34\x03\x4b\xef\x9c\x6c\x8d\x9e\xa7\x60\xe1\xbe\xb6\x02\xb1\x6f\x0c\x37\x1a\x82\xe9\xcb\xc0\x1e\x41\x95\x2f\x02\x7c\x40\x2a\x5a\x93\xa6\x35\xa1\x9f\x69\x8c\x65\x2d\xdc\xb6\x0c\xb0\x12\x80\x15\x75\x60\xb3\x05\x82\x66\xc7\x34\x59\x42\x93\xf4\x6d\x34\x11\xbe\x44\xf4\xb0\x08\x91\xbe\xb1\x95\x20\x89\xaf\x5d\xc5\x69\x22\x5a\x84\xa5\x7e\x30\xd4\x8c\xba\x60\x37\xf8\xc5\x6e\xf0\xdb\xdc\x68\x17\x5f\xe6\xcd\xab\x08\xb3\xdd\xae\xd3\xc2\x37\xa9\x22\x0a\xf8\x76\xc1\xa4\xae\x90\x49\x41\xbc\x5c\xe2\x47\xc5\x53\xa3\x58\x58\x09\xbb\x63\x74\x10\x9a\xa2\x49\x89\xb0\xaf\xbf\x15\x60\x43\x0c\x7f\x0c\x5e\x20\xe5\x8e\xd6\x93\x39\x20\x8a\x3d\x27\xf5\x61\xcb\x0c\xc8\x7c\x6e\x3f\xb9\x1f\x10\x6a\xbe\x8d\x05\xad\x05\xf1\x2e\xef\x7f\x42\x7a\x4b\x73\x27\xbd\xa8\xd1\x30\x65\x61\xb3\x83\xbd\x6c\x84\x2e\xe5\xc2\x9e\x13\x92\x76\x52\x9b\xd1\x70\x41\x5c\x65\xed\x44\x63\x13\xe9\x92\x72\xab\xa8\x85\x63\xc8\x8b\x6f\x1c\xa8\xd1\x8a\x93\x97\xfc\x6c\xf2\xcc\xe1\xfa\xaa\xe7\x28\x2a\x81\x1b\xbb\xea\x39\xb1\x36\x97\xae\x87\x6f\xba\xc3\xe3\x7b\x47\xd1\x4c\xef\xfd\x65\x54\x48\xdf\xc5\x55\xf7\x70\x9d\x55\xd1\xe8\x96\x17\x7d\xc6\x7a\xac\xd0\x48\x79\x9f\x8f\xd1\x51\x80\x0e\x53\xb0\xde\x48\xdf\xce\x99\xb5\x6a\x5e\xe2\xe5\xd2\x3b\xbc\xf4\x33\xd8\x44\x42\x47\xd1\x9c\xfd\x98\x12\x38\x4f\x38\x31\xcd\xd9\xdd\x94\x78\x83\x46\x63\x63\x80\xf7\x2a\x79\xa3\xb1\x91\xe3\x97\x83\xc3\x39\x30\x2e\xf1\x73\x42\x16\xa6\x61\x7e\xdd\x71\xcc\x27\x4d\x4c\xd7\x6c\x2c\x7e\xd2\xb4\x86\xd8\xe7\xa7\x6b\x44\xbf\x57\xfa\xf7\x4b\x7d\x43\x97\x3f\xd8\xb5\x0a\x09\xd2\x66\xad\x80\x2e\xfd\x8e\x29\x34\x37\x51\x71\x19\xa5\xef\x25\x71\x4c\x06\xd5\xd1\x1c\x71\xa9\x25\x22\x5b\xde\xe4\x73\xe6\x4d\x2c\x24\x4f\x38\x50\x23\xf6\x63\x4a\x33\x3a\x21\xde\x53\xa3\xb1\xf1\xa4\x2f\x9e\x60\x34\x9e\xf4\xa3\x8f\x2e\x96\x63\x31\xe7\x09\xc7\x73\xc4\xee\xa6\x34\xa7\x13\x42\x8a\x12\xa9\x29\xf1\xb7\x86\xaf\x18\xbd\xeb\x9a\xda\x9a\xa6\x06\x21\x4b\xb9\x5c\x63\xdb\xea\xeb\x5b\xcc\x6e\x79\x67\xc7\xe2\x04\x78\x5e\x08\x86\x36\xe8\x20\x99\xdb\x15\x86\x01\x29\x67\xee\xa6\x2a\x72\x2c\x80\x55\x81\x9d\x47\xc0\x49\x7f\x12\x06\x9c\xcb\x1c\x1d\x4d\x4b\x1b\x22\xa2\xfe\x62\x7b\xfb\x00\x7d\x92\x0e\xa1\xd2\x3c\xfb\x6e\x86\x84\xee\x2a\x17\x2a\x66\xe7\xc0\x65\x9e\x2b\x1a\x12\xfb\xa6\x8b\xf9\x87\x10\x3d\x54\x3a\xef\x44\xe8\xbc\xa7\x92\x4a\xf8\x13\x12\x7a\x9b\xe8\xa8\xc7\x1e\x95\xf0\x27\x24\x34\xbc\x70\x05\xcb\x33\xba\xdf\x75\x05\xfb\x92\xd0\x81\x18\x8f\xd5\x30\x77\x05\x7b\x8a\xec\x06\xd3\x8b\x9d\x14\x98\x80\x46\x23\xed\x01\xd5\x81\x8e\x60\xbf\xe4\x8a\x46\x82\x71\xe7\xea\x1f\x03\xdb\x7c\x1c\xd8\x33\xac\xc2\x03\x2c\xaa\x21\x01\x00\xfa\xf0\x1a\x07\x28\x97\x29\x78\xb4\xb0\x56\x62\xa4\x67\xcd\xc5\x40\x7b\xf3\x79\x8e\x0a\x93\x17\xc5\x2a\x70\xfb\x3a\xbe\x8f\xf1\xc2\x7d\xd4\x60\x3d\xea\xe0\x6f\x0e\x74\xbc\x29\x7f\xd3\x2e\x48\xd6\xd9\x98\x29\xab\xd2\x57\x3d\xa5\xdf\x20\xf4\x33\x51\x08\x85\x7b\x85\x76\xf8\xe5\x7d\x95\xd8\xe1\x25\x51\x08\xa7\xdb\x18\x5d\x2f\x44\x7e\x1c\xf0\xe5\x2e\x2d\x2a\x9a\xd5\xe5\x61\xae\xfe\x76\x2e\xf9\x86\x9a\xcf\x9d\xb0\x2d\xff\xe4\x68\x66\xaa\xd1\x90\x9f\x39\x9a\x9a\x72\x37\xb6\x6c\x05\xce\x46\x84\x99\xc4\x9f\x3c\xf4\x0f\x83\x46\x43\x40\x9e\x30\xc2\x3c\xa4\xd1\xa8\x1a\xb3\xbb\xac\x37\x80\x47\x5a\x40\x37\x7d\x90\x05\x54\xc3\x08\x59\x44\xe8\xbb\x20\xb6\x5f\xb1\x5f\x5f\xf2\x4f\xf6\xfc\x8b\xea\xf7\xb2\x12\xb2\x32\xfe\xfa\x9a\x57\xe1\x56\xaf\x2f\xbb\xa4\xfe\xb9\x33\xf7\x5d\x47\xe5\xa8\xe9\x77\x45\x36\x35\x23\x05\x89\x40\x9d\xa6\x54\x56\x03\x4a\x9b\xa1\xab\xe7\x99\x55\xf3\xcc\x4c\x7b\xd5\xdb\xb1\x10\x2d\x02\x62\x29\xfc\xa2\xda\xa4\x20\x55\xf8\xd6\x61\xef\xb3\x10\x2c\x76\x24\xaa\x30\x25\x00\x93\x29\x79\x24\xfc\x24\xc0\xc2\xf6\x0b\xa1\xf9\xce\x23\x27\x64\xb7\x34\x64\xb7\xba\x61\x7b\xf3\xa4\xeb\xbb\xea\xbe\x55\xdf\x55\xd7\xd6\x67\xbf\xd6\xd7\x77\x7c\x0f\xf5\xc1\x5f\x27\x64\xc7\xf7\x1c\xf1\x93\x1d\xdf\x53\x88\xc4\x3e\x58\xe3\x87\x57\xaa\xb0\xc5\x8a\xdf\xef\xa0\x7d\x65\x5a\x83\x75\x7f\xa5\x6a\xf9\x55\x5c\xe6\x57\xda\x65\x84\x8a\x75\x76\x15\xa3\x95\x45\x3d\x44\x95\x8b\x22\x3d\x77\xb5\x6b\x1b\xec\x55\xf9\xbc\x9a\x72\x7d\xf9\x94\x04\xfa\x52\x45\x56\x42\x39\x5e\x75\x78\x79\xa3\x91\xfb\x23\x40\x04\x27\x37\xb7\x1b\x37\x1d\x7b\xd1\x41\x33\xf3\xab\xe0\xb4\xa2\xef\x42\x8a\xd4\x99\x49\x9d\x21\x60\x50\x19\x9a\x04\x6f\x7d\x86\x4f\x34\xf8\x4e\xf5\x08\x3a\x69\xdb\x44\x01\x5b\xe0\xb6\x48\xb3\xbc\x9c\xa1\xb5\xc4\x59\x2d\x71\xe5\x86\xe3\xb2\x53\x23\x06\x6b\xef\x7d\x23\xb3\x71\xc0\x20\xf4\x90\x8b\x9c\xcf\x81\x00\xb0\x1b\x42\x22\x76\xa3\x47\xf4\x06\x9f\x93\xa4\xf9\x0d\x09\x8d\xd8\x8d\x19\xec\x9b\xd8\xa6\xc5\x26\xd1\xc3\x7a\xe4\x88\x34\x1a\x58\x11\x7e\x39\x11\x93\x23\x5d\x42\x8e\x28\x44\x22\x71\xc4\xac\x61\x91\x35\x34\x59\x43\x93\x35\x84\xac\x61\x25\xab\x14\x45\xad\xf0\x05\x11\xb0\xf7\x30\x29\x74\x13\x25\x0f\x4b\x7f\x08\x8c\xa0\xb8\x73\x48\xe1\x1f\x04\xd0\x2c\xfe\x02\x19\x25\x34\x97\x3a\xc3\x4d\xc7\x31\x75\xfb\x67\x51\x40\xda\xf6\xcb\xdd\xa2\xa6\x25\x1d\x2f\x2b\xf1\xa4\x82\x89\xd7\x61\x89\x89\xd7\xf8\x6e\x62\x2c\x02\xb5\x02\x40\x1f\xce\x31\xbe\x12\xd3\x8e\xd8\x75\xa8\x3b\x78\x1d\x52\x48\x04\xd2\x6f\xc4\xae\x20\xad\x24\xaf\xef\xbe\x9c\x0a\x14\x16\xcc\xc7\x6a\x38\xe8\x67\x62\xac\xde\xd2\x7d\x3e\xbb\xd7\x17\x57\xa1\x2a\x6e\x23\x4a\x06\xb5\xb0\x92\x62\xe8\x34\xbe\xaa\xeb\xb7\x0f\x82\x7b\x80\xac\x3d\xa1\xc8\xf2\xed\xd9\xbe\xb3\xf8\x51\xe0\xa9\x46\x03\xa8\xb0\xf2\x5b\x01\x55\xfe\x56\x80\xd4\x58\x14\xd6\xe0\xb1\xf9\xaf\x91\xa5\xb1\x7f\xdd\xfc\x16\x3e\x7d\xeb\xe6\xab\xcf\x27\xc5\x41\xd7\xba\x71\xea\xe1\x15\xe0\x9a\xe6\xa3\x7a\xf3\xe6\xc1\xc4\xd8\x5d\x09\xfb\xe4\x55\xb2\xac\xaa\x30\xa8\x75\x0a\x4d\x36\x2d\xf2\xa2\x6a\x8e\x68\x8e\x53\x2d\xa9\x60\x2a\x80\x00\xbe\x88\x24\xfa\x0d\xb6\xd1\x48\x1a\x0d\x2d\x31\x98\xa0\xe0\x21\x44\xb2\x14\x0d\x8e\x91\xd7\x94\xa5\xd5\xc6\x34\xb7\x1d\x6b\xc1\x1f\x3c\x04\xb3\xd4\xcf\x02\x7e\xd9\x81\x32\xc0\x74\x27\xfa\x47\x2f\xbf\x98\x4d\x77\xa0\xa2\xe9\x0e\x72\xb0\x19\x7f\xa7\x8b\x4f\x77\xaa\xe5\x77\x03\x07\xcb\x4f\x77\x74\x05\xfa\x17\x1d\x3b\xb3\x27\x34\x49\xfd\x14\xb3\x83\x1e\x54\x04\xc1\xc4\x06\x9d\x94\x3d\xc5\xfa\x35\xe5\x29\x26\x34\xd5\xf1\x80\x85\xa6\x04\x35\x59\xb1\x2e\x89\xd2\xf9\x3c\x5d\x2c\xa4\x0f\xb4\x0e\x65\xaf\x6f\xac\x91\x8c\xa1\x6f\xcd\x1d\x5f\x3d\xc3\x27\x7a\x73\xf6\x87\x41\xa3\x31\x58\xca\x37\x2c\xf3\x0d\x4d\x3e\x7c\x50\x94\x6c\x9b\x97\xd9\xd8\xb6\xcd\xc5\xb6\x31\x93\x9d\xca\xa7\x3f\xcc\x54\x3e\xff\xa1\x79\x54\xc3\xa9\x9e\x8d\x8d\x88\x9a\xd6\x10\xc5\x98\x42\x49\xd4\xa8\x5c\x9c\x8d\x7d\x15\x78\x66\x26\x9f\xfe\x80\x80\x51\x95\x7a\xc6\x00\x8e\x38\xd0\xe0\x18\xc9\x29\x0c\x15\x84\x12\x13\xda\x10\xf7\x8e\xfe\x06\xbe\x10\x93\x52\x1d\x2c\x8d\xbf\xeb\x92\x74\xc0\x75\x46\x3a\xe2\x3a\x0b\x9d\xf0\x81\xd6\xc2\x82\x19\xcc\x6b\xc7\xad\x27\x9e\x7d\x9e\xb4\x07\x7e\x16\xb8\x03\x7f\xb2\xb9\x15\x78\xb9\x9f\x99\x5d\xe4\x89\x4d\xe9\x08\x43\xf4\x1d\x9c\xc2\xe1\x73\xa6\x13\x66\x3a\x61\x86\x96\x7f\x59\x27\x04\xb0\x3b\xa1\x9f\xbd\x04\x00\x32\x84\x93\x22\x9c\x62\x38\x2d\xc2\x4e\x06\x75\xd8\x74\x6a\x13\xa8\x20\xb4\xf3\xec\x40\x3d\x56\xac\x34\xf3\x0f\x03\x9a\xe1\x83\x79\x06\x13\x96\xa1\x01\x57\xe2\xc5\x6c\x1f\xf0\x9e\xed\x27\xb6\xc5\xfd\x44\xff\xb5\x2d\x42\x38\x2d\xc2\x58\xed\x7e\x42\xb1\x59\x1d\x49\x6d\x2a\xe2\xd7\x1a\xd7\xfc\x9d\xd2\x67\x51\xf4\xc2\xc5\xe2\x5d\x47\xdb\x19\x7f\xe6\xab\x17\x2a\x7a\x29\xe3\x9d\x83\x64\x97\x02\xad\xd1\x5d\x0a\x3d\xa5\x03\xb9\xc1\x13\x36\x90\xf3\x79\xec\x8f\x67\xc1\x06\x4f\xe0\x87\x18\x29\x10\x36\x90\x8d\x06\x9e\xfd\x6f\x3b\x4e\x74\x44\x13\x94\x9d\x81\x1c\x58\x33\x31\x0a\x56\x71\x2d\x9f\x3a\xa2\x10\x41\xe3\x32\x9f\x17\xb3\x1c\x1b\xca\x65\xe1\xbc\xda\x04\x12\xfc\xa0\x5a\x3c\x1d\x3d\xb9\x46\x47\xda\x95\xeb\xeb\xb0\xff\xec\x26\x54\x6b\x91\x19\xdb\x38\x95\x26\x4d\xe9\x78\xa9\xb4\xfa\x69\x69\x54\x19\x32\x32\x1d\x5e\xc2\x85\xfd\xdc\x48\xb4\xd8\x3a\xeb\x08\xce\x13\xd6\x41\x44\x7f\x09\xe1\xfb\x25\x9c\xcf\xdf\x84\x8e\x75\x84\x6d\x22\x41\x8b\x1b\xc4\xdb\x88\xe7\xf3\xe4\x97\xaa\xaa\x81\x1a\x57\xaa\x8a\x4d\x55\x85\x3a\x14\x80\x6a\xbe\x62\x76\xd8\x85\xc1\x3b\xec\x16\x23\xf9\x4e\x87\x6a\xf3\x74\xd8\x35\x02\x6d\xb5\x69\xaa\x66\xc3\x69\xaa\x65\x03\xb2\x54\xb7\x3e\x53\x03\xf7\x7c\x84\xd7\xf1\x6a\xc9\xf9\xc5\xd8\xba\x5d\x14\xfe\x97\x80\x9a\x0b\x4f\xfd\x34\xbf\xf0\x26\x03\xa7\xb3\xc6\x00\xce\xf1\xc4\x31\xa8\x4b\x05\x95\xda\xf6\x41\xcd\xc6\xcc\x6d\xa7\x7e\x3c\x52\xbe\x0c\xbc\x08\x5d\x2f\xa3\xdd\xcb\xc9\x98\x46\xfa\x94\xed\x46\x18\xb4\x26\x50\xaa\xbe\x80\x71\x5c\x43\x3b\xa8\xd1\xa2\x2a\xfa\xf1\xa3\x53\xbb\x88\xda\xbe\x77\xd0\xe3\xbd\x96\xf5\x3a\x0c\x9a\x40\xa0\x09\xe7\x5c\xb0\x69\xa3\x81\xa9\x33\xad\x6a\xa3\xff\x36\x81\xd0\xeb\xf4\x59\x7b\xa3\xe5\x6e\x6c\x55\xea\xbe\xaa\x89\x95\x1c\x4f\xac\x58\xc9\xd1\x84\x57\x97\xf0\xf5\xb2\xb8\x81\x16\x2c\x10\xfa\xc1\xa9\xdd\x72\xb7\x50\xc5\x10\x9f\x9d\x30\x94\xe9\xb4\x24\xc0\xcb\xdb\xaf\x91\x9f\x06\xc6\xa9\x4e\xe6\x2b\x20\x24\xf9\xb5\x83\x5f\x84\x89\x94\x0e\xb8\x28\x62\x85\x8d\x35\x0a\xe5\x85\xd9\xfa\xe7\x19\xaf\xcf\xa6\x65\x78\xdb\xc6\x00\xd0\x23\x7a\x9b\xfb\xb2\x3d\xed\x8d\x6e\x44\x36\x51\x8e\xa0\x09\x21\xae\x30\x53\xac\x6b\x99\xbe\x51\xcb\xa0\x3d\xa8\xd6\x72\x53\xad\x25\xad\xd6\x62\x98\x32\x9d\x6d\xb7\x2b\x86\xe3\xed\xa1\x12\x3b\xfd\x49\x1e\xf5\xf2\x64\xa7\x3f\x75\x4c\x4b\x69\x6e\x36\xa5\x19\x2a\x4a\x99\xd8\xcc\xc4\x4e\x67\x4e\x65\x76\x74\xda\x71\xbf\x56\x42\x4f\xac\x4e\xfa\xda\xaf\x17\xb3\x7e\xd0\xbe\x73\xd3\x96\xd1\xf2\x37\xe1\xcc\x84\x27\x26\x7c\xdc\xdf\xac\xe5\x1b\x9b\xf8\xaf\x26\x3e\xcb\x3d\xab\x62\xb8\x45\x3c\x2d\x7e\x12\x0d\x04\x0f\x75\xf6\x97\x2d\xeb\x73\x5a\x85\x82\x2b\xe3\x55\xed\x3b\x8f\x2b\x28\x72\xd7\xa9\xe9\xf6\xdf\x0e\x6d\xe1\x53\x61\x91\xea\xf4\xde\xce\xe5\xb9\x96\x18\x5d\x74\xf8\x1d\xda\x52\x3a\xaf\xb9\xcd\xae\x1b\x36\x3a\x15\x0b\xe2\x75\xd8\xfe\xf3\x1a\x8f\xd6\x09\x47\xa3\x45\xe2\xa5\xee\x74\xad\xc3\xee\x66\xcb\x31\x1f\x56\x62\xf2\xfd\x95\x3c\x7b\xcb\x31\x62\x25\xcf\xed\x4a\x9e\xce\x6a\xa9\xb8\x1e\xf3\xae\xf3\x96\x6f\x55\x6b\x1f\xec\xb5\x0b\x08\xe7\xbe\x3e\xf5\xd4\x73\xa7\x97\x47\xfd\xe7\x93\x7e\xa4\xdc\xc9\x01\x2d\x63\xdc\xd7\xc5\x82\x3e\xfd\x5a\xbe\x85\x1d\x7b\x76\x91\xdb\xe1\xbf\x1d\xb2\xe3\x49\xa3\xe1\xc4\xc6\x28\xde\x79\xc2\xd2\x9c\xcc\xe7\x8e\x60\xd8\x3a\x2b\xab\x60\xf9\xe4\x41\x0d\x7b\xe1\x49\xcf\xa0\xab\xce\x4b\x2b\x45\x8f\xfb\x7f\x51\x54\x4c\x79\x25\x2f\x29\x60\x38\x5a\x82\x21\x33\x30\x3c\xfd\x02\x0c\x59\x1d\x86\xaf\xfd\xbf\x28\x5a\x81\xe1\x6b\xbf\xe6\x8d\xe4\x43\x81\xae\x77\xeb\xbd\x91\x5c\x18\x53\xad\x3f\x9c\x0f\x1d\x7a\xd7\x21\x5e\x87\x7f\x30\x76\xbf\xaa\xe8\x56\x3f\xaa\x9d\xde\x3b\xe4\x27\x74\xc1\x50\xf2\xc2\xb8\x9c\xe0\xaf\x53\x17\x88\xf9\xcc\x05\xa2\xbd\x17\xb9\x2d\x9a\x29\xb7\xb5\x20\xcb\x38\x5c\x31\xc5\x75\x51\xb9\xed\x9d\x22\x79\x9d\x15\x10\xbf\xee\x45\xae\xdc\x34\x21\x36\x85\xca\x44\x11\x9c\xd1\xa9\x2b\xa1\x29\x83\x1c\xbd\x7d\x87\x2c\x56\x97\x46\xad\xf7\x4b\xc8\xbc\x6c\x07\xeb\x57\xfa\x1b\x92\x46\x43\x3a\x04\x57\x41\x6f\x7f\x15\xf5\xcd\x04\x79\xfa\x72\x76\x69\x30\x3d\xa1\x77\x80\x4a\x9b\xb7\x43\xed\x6e\xef\x78\x52\xcb\x0d\xfd\x2d\xba\xba\x17\xe1\x2b\xd6\xf3\xcc\x29\xd2\xc8\x26\x86\xa5\x36\x36\x9d\xe6\x9b\x11\x3e\x37\x1c\xf7\x37\x23\x2a\x8d\x81\x17\x45\x05\xbb\xf8\x4e\x68\x62\xae\x83\x63\x0c\x37\x05\x9b\x7c\xd7\x42\x52\xec\xe6\x3b\x9c\x71\x38\xe7\x6a\x3e\x6f\xfd\x19\x69\x2f\x52\x9c\xc7\xf3\x79\xeb\x73\x44\xe6\xf3\x0d\xc8\x42\xa0\x7e\x0e\x95\x1d\xf7\x79\xbc\x08\x35\xca\x97\x70\xce\x0a\x38\x33\x85\xb7\xf5\xd3\x12\xce\x19\xc0\x39\x45\x38\xd1\xc2\x7a\xbe\x19\x22\xc0\x5f\xfb\x9b\x61\x01\x67\x44\x05\xfb\x5e\x81\x53\x61\xb8\x29\xd8\xf8\x3b\xa1\x15\x20\x23\x00\x32\xb4\x40\x02\xc8\x9f\xc3\x02\x48\x7c\x03\xc8\x72\x0e\x95\x7d\xed\x73\x63\x82\x14\x0d\x9a\xd6\x24\x4f\xc5\xed\x2f\xaf\x14\x71\x6b\x56\x8a\xb8\xfd\xcf\xaf\x94\xfd\x09\x2e\x95\x2c\xc3\xb5\xb2\xfb\xd1\x6d\xd1\xbd\x8f\x7a\xad\xbc\xfb\x85\xc5\xf2\x0b\xad\xd2\x12\xc3\xf0\x77\xfb\xa3\x53\xfa\xb9\xbe\x10\x6c\xf7\x23\x2e\xb9\x02\xc9\x3e\xe2\xda\x2b\x90\x51\x98\xd9\xb0\xe9\xfb\x13\x5a\x96\xb4\x92\x4d\x5d\x26\xe4\xa8\x92\x65\xb3\x92\xa5\x78\x4c\x40\xf7\x16\x28\xbb\xeb\x01\xf2\x00\x1f\x59\xaf\x3a\xcb\x68\x09\x05\x41\xbc\xa8\x56\x9b\x65\x9b\x95\x64\xe2\x22\x1f\x8a\x0c\x21\x2f\xd9\x0d\xff\xcb\x63\xe0\x10\x16\xf7\xf8\x6b\xa6\xe2\xb1\x2b\xe8\xb8\x3f\x70\x43\xfa\xdc\x8b\xc6\x5d\x37\xa2\x5d\xd5\x4b\xba\x63\x57\x52\x2d\xc0\xfc\x75\x8f\xf6\x07\x22\xec\x8d\x67\x2e\xfb\xb8\x78\x9b\x6e\xd8\x29\x03\xea\x42\xab\xf8\xf1\x17\x14\xe0\x76\x48\xad\xad\xbf\x84\x56\xc8\x8b\x27\x81\x02\x84\x66\xf8\x6a\x80\xa3\x55\x96\xe7\x19\xba\x09\x21\x78\x62\x34\x81\xa6\x76\x5c\x02\xbd\x9e\xce\xb4\xe3\x12\x58\x4e\x65\x48\xbb\x09\x41\xfd\xb8\x0d\xce\xe3\x46\x23\xdc\x40\x63\xfb\xd6\xc8\xd4\xe4\xfb\x6f\x92\xbd\x6c\xe9\x35\x6f\x09\x4d\x5a\xac\xb6\x98\xe8\x17\x23\x24\x19\x31\xf1\xd4\x66\xfa\x39\x41\xbf\x69\x4e\xda\x54\xe4\xf7\x8f\x34\xe5\x6a\x33\xf9\xfd\x23\x55\x4d\x9e\xfc\xfe\x11\xc5\xba\x72\x9e\x7a\x12\x28\x82\x5a\x40\x13\x63\xd3\x84\xd0\xd4\xc1\x22\x0f\x1a\x4a\x0f\x4d\xe5\x3a\xb0\x29\x6c\xe5\xa2\x19\x42\xe5\xc2\x54\x1e\x72\xd5\x4c\x50\x69\x1c\xd6\xb1\xa0\x12\xd6\x71\xb8\xb4\x8e\x3b\x6c\xfb\xe3\x12\x01\x17\xda\x7f\xc8\x9a\x53\x84\x27\xb4\x0f\x91\xb5\x47\x88\xaa\x93\xe9\x5f\xa7\x09\xd2\xd2\x04\x69\x68\x42\x95\xed\xfa\x4f\xee\x9e\xa3\x50\xc0\x76\xc7\x12\x35\x1a\x4f\x86\x5a\x43\xe8\x28\x44\x55\xd1\x65\xde\xee\x7f\x4a\x20\xd6\x93\x85\xa3\x50\x58\xd2\x0e\x8d\x5a\x4e\x9a\x5d\x08\x5a\x83\x86\x2c\x6d\xbb\x75\xde\xf2\x7f\xb9\x7c\xce\x13\xba\x66\xdb\xac\xee\xa9\x5b\x9b\x4e\x05\xe2\xcd\x0a\xc4\xda\x9d\x48\x6d\xb3\xc4\xcd\xe7\xb8\xbf\x19\x7a\xb8\x97\x85\x9b\x4e\xb8\x09\x5f\xe4\x77\xe9\xe1\xb6\x16\x36\xa3\xdf\xa5\xb7\xb2\x79\xa1\xf9\xf2\xaf\xba\x5c\x56\x94\xcb\x4c\xb9\xaf\xb6\xdc\xff\x3d\x86\x86\x6f\x63\xe8\xe2\x87\x13\x6a\xa4\x0c\x01\x25\x97\xf8\xf7\x3a\x53\x82\xe7\xde\x2d\xa2\x47\x01\x98\x01\xdd\xfb\x82\x2d\xd0\xdd\x84\xdd\x57\x77\xaf\xd8\x87\xab\x5d\x2c\xa1\x8a\x7e\x0a\x55\xa4\xa1\x8a\x10\xaa\xea\x39\x63\x99\xed\xba\x1d\xd2\xe8\x97\xf0\xb5\x17\x3b\xb8\x6a\x22\x42\x5e\xa5\x03\xb3\x53\xe1\xb6\x5a\x7f\x0a\xf6\xdc\x55\x2a\xdb\x53\xd9\x58\x2f\x89\x08\xd0\xe1\x4f\x1e\xc1\xe1\xcf\x3c\x28\x79\xe8\x62\x04\x13\x7e\x8b\xe0\xfc\xa7\xb7\xa9\x22\xf7\x67\x1e\xb1\x97\xad\xd5\xcc\xbf\x9b\xcc\x35\x5e\x4d\x71\x27\x62\xc7\xfd\x66\x84\xa8\xf4\x91\xc6\x3c\x02\x5a\xab\x0b\x7c\xf4\x22\xe4\x9b\x36\x63\x2f\x42\x3a\xd9\x2c\x78\xa7\x10\xca\x7d\x85\x72\x19\x96\x53\x3c\x02\x02\x6a\xca\xd1\x48\xe3\x9a\xa2\x91\x46\xb1\x65\x5e\x06\x9a\xbe\x39\x15\xdc\x7f\xed\x8d\xf6\x73\x21\x33\x15\xb9\x4b\x26\x1a\xd8\xa5\xf3\x7c\xb0\x64\xc1\x5e\xcc\xe7\x46\x7c\xe0\x43\xcf\x11\x74\x67\x2c\x88\xb9\x40\xa1\x61\x3f\x1f\x8d\x87\x93\x70\xdc\x1f\xba\x1f\x3a\x0b\xfa\xab\x15\x57\xeb\xdb\x7d\xa3\x3e\x71\xfb\xeb\xf5\xad\x05\xf4\x62\xb6\xbe\xe2\xf0\x6f\x54\x5c\x03\x74\x2a\x08\x5d\xae\x4c\xfe\x6f\xa1\xbc\x7a\x03\xca\xe8\x76\x11\x54\x2e\x8f\x97\xd5\x65\xd9\xa5\x73\xda\x25\x1c\x9d\xf8\x15\x4e\xbc\x77\x45\x9e\xf7\xc7\xef\x27\x23\xf5\x5e\x4d\x07\x59\x7f\xa8\x86\xef\x9f\x7b\xe3\xee\x7b\xf1\x7e\xd0\x53\xda\x77\xf7\xff\x67\xe8\xaf\x5c\xbd\x98\xb8\x1d\x6a\x4d\x9b\xe5\x5b\x0a\x7b\xeb\x61\xae\x2b\x74\x60\xd6\xe7\x7e\xe0\xdd\x16\x4a\x39\x1d\xde\xc1\xa7\xbc\xa5\x3b\x0a\x4b\x49\x8c\xe1\x59\x26\xa9\x98\x08\xfa\x4f\xe2\x6d\xfd\x29\x70\xbf\xdf\xfa\xdd\x88\xbb\xcb\x4a\x9e\x0f\x63\x41\xd9\xc7\x4f\xc4\xdb\xfa\x2c\x91\x89\xdf\xfa\x5d\x5a\xa1\xb3\x32\x97\x9c\x08\xba\xc5\x3e\x01\x95\x3e\x2a\x22\xef\xc6\xe8\xce\xb1\x84\x58\x3d\xe3\xbd\x9d\x0e\xd3\x82\x5c\x14\x2e\xe7\xbd\x3b\xc7\x74\xa8\x26\x13\x27\xd8\xfe\xb3\x3d\x61\x17\x4f\x70\x15\x2b\x25\xb7\x75\x81\xa3\xf3\xca\x1d\x60\x88\xe1\xf2\x16\x30\xb2\xe9\x52\x1b\x0c\xc6\xb4\x30\xa0\x92\x6f\x98\x84\xad\x4d\x19\x34\x1a\x51\xe9\x0f\x6c\x23\x62\x62\x40\x43\x9d\xe1\x6b\xe4\x6f\x6d\x86\x41\xa1\x15\x8f\x19\x14\x64\x80\xda\x24\xbb\x74\x9e\x0e\x88\xbf\xbd\x1d\x78\xda\xbc\x41\x3b\xe4\x1b\x5b\xae\x36\x99\x80\xa3\xb7\x81\xa4\x1b\xa6\x57\x3d\xe3\x5d\x27\x72\x28\x77\xce\xcd\x69\x5d\x0e\x50\xf8\x89\x71\x83\xcd\x80\xc1\x30\xc3\x82\x32\x70\xea\xf9\x3d\x4a\x3e\x39\x06\x67\xec\x40\x52\x83\x39\x04\x3d\x1e\x2f\x56\xce\x3a\x6b\x06\x57\x92\x57\xc9\xc4\x8b\x53\xbe\x6c\xae\x9e\xf2\xdf\x2a\x76\x37\xab\x17\xfb\xf0\x6b\xc5\x3e\x2c\x15\xeb\xec\xfd\x52\xb1\xce\x5e\xb5\xd8\xbb\xce\xea\x6e\xb4\xa6\x64\x88\x62\x24\x7b\x98\x5e\x69\x72\xe5\xfe\xe0\xad\xa2\x22\x5e\x2e\x5a\x63\x15\x7f\x56\x34\xdf\x5f\x2e\xfa\xe1\x57\x01\xfe\xb0\x0a\xf0\xaf\xb6\x2a\x96\x5a\x85\x25\xf1\xe3\x27\xdb\x4c\xa1\x51\x82\x78\xbb\x8e\xf6\x75\x4e\x45\x95\xf8\xdd\x55\x89\x9f\x21\x5e\x86\x64\xf5\x2d\x91\x3a\xbd\xb7\xf4\xac\x20\x57\x2f\x48\xa1\x74\x7e\xed\xb4\xd4\xfb\x50\x90\xab\xf2\x06\x4c\xaf\x63\xc1\x64\xa3\x71\xe7\xfc\x58\xb7\x22\x1a\x8d\x75\x0b\xe3\x65\xdd\xc2\xe8\xd7\xd7\x85\x31\xb6\x7a\x6e\x57\x07\xbf\xb3\x34\x72\x3d\xe2\xbe\xac\x47\x5c\xe2\x9d\x9f\x9b\xd6\x25\xdd\xfa\xf4\x93\x05\xb3\x52\xc1\xdd\x6a\x05\xba\xfc\xfa\x75\xba\x52\x5e\xaf\xd3\x35\xe5\xdf\x5a\x0a\x2f\x6f\x2d\x85\x95\x3a\xde\xbd\xb5\x0e\x57\x80\xd0\xeb\x70\x5d\x27\xde\x58\x54\x2b\x40\xd8\x45\xf5\xd3\xf5\xb4\x52\xca\xae\xa7\x9f\x2e\xa5\x95\x52\x1f\xde\xea\xf0\xdb\x6b\x6a\x15\xde\xfd\x35\x75\x98\x99\xaf\x6f\xaf\x6b\x6a\xb0\xbb\x17\x02\x5e\x20\xba\xba\x5d\xe3\xe2\xe7\xbc\x78\x94\x10\x76\x25\x9d\xe4\x76\x25\x75\x63\xbb\x94\xa4\x36\xfd\x73\x76\xee\x28\xe2\x3d\x8d\x35\xc3\x6e\x52\xac\x46\x71\x9f\xc7\xf6\x0b\xf2\x9b\x54\x53\xfb\xad\x03\x9c\xbd\xba\xa5\x93\x31\x1c\x82\x95\x39\x04\xef\x54\x7b\xf2\x5d\xd7\xcb\x4e\x72\xe2\xa9\x5b\xa6\xd8\x8e\x3d\x1b\x60\xb7\xcf\x1f\x45\x0d\x59\x76\x84\xdd\x8b\x8c\x6b\x8c\x0f\x01\x9b\xca\x35\x83\x7e\x51\x2d\xa8\x5f\x26\x2e\x7f\xb1\x2e\x33\x0c\xf8\x58\x1a\x1e\xd1\xd7\xb1\x18\x26\x6a\x7c\xb4\xe7\x62\x8e\x17\x45\xa7\xae\xc9\xab\xcf\xdf\xe6\x7b\xa6\x31\xe6\x6a\xa9\x95\x6a\x6d\xbd\xa9\xf8\x7b\xd5\xbd\xeb\xb0\xef\x4b\xf5\x69\xde\xe3\xd7\x6b\xa9\x75\xa7\x3b\x2d\x4f\xef\x67\x7d\x58\x20\x12\xfb\xed\xab\xc7\x00\xa1\xff\xfa\x13\xe8\x93\xd1\xdf\x1d\x8b\xdb\xa5\xda\xc4\xff\x14\xee\xf3\x23\x2a\x4a\xb0\x35\x65\xf0\x3a\xec\xdb\x4f\xa0\x15\x07\x7f\x17\xda\x1f\xff\xbb\x91\xa6\xe5\x79\x52\x47\x96\xe1\x7a\x67\xc4\x71\x75\x0e\x6e\xf7\xea\x73\xf0\xae\xc3\x4e\xff\x53\xc3\xb6\x3f\x16\xd5\x71\xd3\x64\xdd\xeb\xb0\xb3\xff\x54\x03\xe9\x41\xb5\x7e\xbd\xed\x78\x1d\x76\xf2\x9f\xaa\x7f\xaf\xde\x81\x0f\xb6\x81\x9b\x75\x13\x7f\xd6\x07\xda\xfd\xeb\xf3\x65\xae\xa7\x74\xcc\x7e\x24\x16\xf5\xa5\xd0\x79\xa3\x8d\x0f\x7b\xff\xa9\x36\xde\x75\xd8\xf5\x1b\x8d\x88\xff\x60\x47\x8e\xd6\xb5\x71\x2a\xb4\x45\x5e\x54\xd0\x64\xf1\x7d\x8d\x82\xb6\xb0\xdc\x71\x9d\x84\x2e\x91\x4b\xad\x00\x5a\xaf\x0b\xd9\xad\xd5\x8a\xbe\xac\x5d\x58\x7a\x2b\xf2\x2a\x75\xb2\xc9\x2d\xaf\x04\xfd\x87\x30\xb0\x8a\x5e\x05\x98\x37\xcb\x0a\xc8\x4b\x66\xea\xe1\x78\x79\x5e\x00\xfa\x63\x1a\x50\x69\x5c\x04\x4e\xc6\x54\xb2\xaf\x2f\x9c\xef\x74\x09\xad\x00\xd9\x22\x08\xe4\x4b\xb4\x66\x94\xce\x59\x2a\x37\x50\x09\xd8\x56\x59\x18\x79\xd1\x10\xdd\x5d\xd0\x7a\x7f\xf5\xb4\x6e\x47\x62\xe5\x7e\xf3\x67\x75\xa1\x70\x4f\xa5\xa2\x8f\x9f\x0c\x54\x72\xf8\x73\xa8\xc4\x99\x35\x9e\xac\xa1\x59\xd7\xb3\x70\xa9\x0e\x7d\x23\x51\x81\xe1\x70\xb7\x0e\xd3\xe1\x2e\x6f\x95\x53\x8b\x11\x4d\xdd\xdd\xc3\xbe\xf0\x6a\x0d\xa0\x63\x26\x21\xd6\x5e\x2f\x5b\x30\xeb\x13\xce\x76\x5f\xbc\x32\x47\xd4\xe3\x3c\xd6\x5e\x92\x7b\x07\xa4\x82\x4d\x03\x83\x99\x93\x70\x69\x80\xf1\xd2\xf4\x50\xd6\xc6\x77\x7d\x8b\xe2\xa7\x2d\x8a\x35\x2d\xae\x9b\x06\xed\x9d\xe9\xea\x5f\x3f\x9b\x86\x5a\xd5\x2b\xb3\x32\x09\xd7\xcd\x4a\xbc\x6e\x66\x5f\x22\x61\x28\x5c\x32\x5c\xc5\xa0\xed\x48\x38\x98\x18\xad\x2b\x6b\x48\x66\x3e\x13\xf4\xb5\x97\x47\xca\x50\x8b\xbb\x0b\xc3\xc9\xae\xa3\x02\x16\x66\xed\x19\x47\x09\x68\xdd\x75\xd6\x4f\x43\x25\x16\xdd\xeb\xd9\x25\xb9\xba\x00\x3a\x4c\xac\x81\xbe\xde\xd6\xa1\x14\x0e\x71\x9d\xf8\x56\xf3\x7a\x6b\x90\xff\x5d\x87\xdd\xfd\x8c\x70\xa0\x60\xb6\xae\x52\x4f\xe3\xd5\xbf\x1c\x51\x51\xf5\x0d\xb9\x5d\xee\x9e\xe0\xaf\xb9\x74\x2d\xbc\x03\xf3\x39\x09\x17\x85\xc9\x05\xe3\xbf\xcb\x8b\xb4\xd1\x74\xab\xfc\xdf\x5e\xa2\x25\x42\x9b\xfa\x77\x23\xf6\x21\x99\xcf\xd1\x90\x77\xe7\xd6\x11\xe6\xb5\xa2\xe8\xa1\x5c\xa6\x40\x2f\x28\x0c\x1f\x2e\x47\x77\x84\x4d\x23\x64\x69\x5d\x21\x96\x7f\x58\xe7\x63\x0d\x40\xff\x32\xf5\x36\xb7\x36\x50\x93\xde\xd6\xa8\x25\x24\x39\x3a\x17\x33\x1d\x7d\x09\x5d\xb9\x84\x89\x78\x64\x5f\x37\xe8\xc5\xcc\x2d\x2d\x66\x68\xc6\x34\xb9\xda\xd8\x1b\x64\xeb\x5d\x87\x1d\xfe\x64\xe6\x68\x39\x33\x34\x2a\xb0\x48\x59\x44\xb3\xc4\xfe\xcb\xd4\x93\xd6\x9c\x7a\xa3\xe1\x6c\x6e\x71\x2e\xda\x55\x00\x3e\x7c\xe3\xaf\x93\xd0\x55\x74\x70\xe3\x46\x8b\xe5\xd1\x8d\x68\xd1\x77\x45\x05\x41\x6d\x8b\x15\xd2\xd5\x1d\xae\x90\x2e\xe3\xdf\xc9\x80\x40\x5e\x8d\x45\xde\x62\x82\x8d\x59\xde\x0f\xfb\xee\x5b\x0b\xc2\x5b\xbb\x7e\xaa\x56\x67\xe3\x63\xf7\x2f\xf3\xa8\x5a\x03\xe5\x46\xbd\x58\x22\x87\xf8\x6e\xae\x97\xd4\x07\xa4\x1d\xef\x3a\xac\xf7\xbf\xe9\x96\xc5\x8e\x9f\x02\x8c\x3b\x7d\x1d\xda\x75\xfc\x01\x5d\xe5\x0f\xaa\xf0\xff\x51\xef\x80\x10\x96\xfa\xed\xbf\xc1\xb2\x58\x37\x24\xba\x1f\xb7\xcf\x6b\x98\x8d\x83\xc7\x55\xd2\x53\x2d\xb9\xcc\xa3\x7c\x34\xe5\xf6\x7e\x52\xce\xef\xbf\x04\x86\xca\x57\xa3\x1c\xb2\xae\xa2\xfa\x49\xdd\x32\x74\x78\x32\x2f\xcf\xe5\xf1\xad\x3e\xb0\xd7\x07\x54\xd4\xd0\x09\x47\xab\xbc\x7b\x06\x74\xb6\x6e\x77\xb8\x60\xe7\x86\x76\xd5\x0d\x02\x4a\x82\x92\x33\xbe\x0c\x58\x22\x18\xbe\x0c\x08\x28\xad\x55\x34\xe3\xfe\xd0\x91\xbc\xe5\xc9\xcf\x82\x4d\x8c\xa6\x88\x2e\x31\x49\x57\x8b\x58\x7d\x1d\x3f\x0c\x16\x70\x2a\xb9\x5d\xbd\xe0\xaf\x8a\x93\x02\x60\xdf\x8a\xd3\x3c\x15\xf4\xd6\x09\xad\x80\xb1\x91\x1f\x15\x4e\x67\x68\x2e\x91\xcf\x1f\x05\x84\x6f\x6d\xf8\x42\x87\xef\x6c\xf8\x52\x87\x3f\xd8\xf0\x95\x0e\xff\xb0\xe1\xef\x3a\xfc\xdd\x86\xbf\xea\xb0\x1a\x99\xf0\xad\x0e\x5f\xda\xf4\x6f\x3a\x1c\xdb\xf4\x1f\x3a\x7c\x63\xd3\x4f\x75\xf8\xca\x86\xcf\x74\xf8\xda\x86\x4f\x74\x38\xb2\xe5\x6f\x74\x58\xda\x70\x47\x87\x43\x1b\xbe\xd6\xe1\x53\x5b\xfe\x48\x87\xcf\x6c\xf8\x58\x87\x4f\x6c\xf8\x8b\x0e\x3f\x3c\x9b\xf0\x4b\x84\xe1\xdc\x86\xb7\x75\x38\xb3\x61\x39\xc4\xf0\xa3\x0d\x87\x3a\x7c\x3b\x33\x61\x25\xf4\x78\xd9\xf0\xa1\xc4\x70\xc7\x86\xaf\xfe\x05\xc1\xd4\x06\x63\x5d\x3c\xb3\xe1\x44\x87\xef\x67\x82\x1a\x89\x58\x1d\x11\x8e\x4d\x86\x0f\x66\x3c\x6c\x58\xe8\x74\x69\xc3\x77\x3a\xfd\xfc\xd1\xb6\xff\x01\x82\x17\x36\x28\x34\x78\x67\x45\xb2\xc9\xbe\x6d\xc2\x5d\x5d\xdd\x85\x0d\xf7\x74\xf8\xd9\xe6\xdf\xd7\xf9\xa7\x36\x7c\xa0\xc3\x4f\x36\xbc\xf7\x28\xaa\xcb\x4d\x9c\x89\x9a\xff\x39\xcd\x3e\x84\x7a\xa1\x74\x12\xab\xdc\x15\xda\x6d\x49\x71\x93\x36\x19\x7b\x21\xf2\x02\x83\x23\xe0\x05\x84\xdd\x5d\x14\x8d\x88\x2b\x97\x22\xaa\x92\x63\x09\x2e\xf0\xef\x93\xaa\xaf\x50\x3d\x71\xdd\xca\x7b\x5a\x26\xf9\x55\xa2\x3f\x3b\x46\x57\xeb\xc2\xbc\x73\xdb\xdd\x52\xff\x6c\x7f\xaa\x94\x7a\x38\x29\xee\xb8\xbf\x19\x55\xa0\x5b\xc3\xec\x8e\x9e\x2d\x63\x5f\xc9\x7f\xa2\xbd\x12\x5c\x8d\x75\xf0\xb0\x92\xd4\xd5\xf6\xba\x3b\x1d\x43\xf3\x35\xae\xe6\x56\x80\x25\xb9\xa5\xdf\x27\xc4\xeb\xf0\x64\xdd\xdd\x9d\x6e\xb1\xeb\x10\xef\xb9\x72\x8b\x97\xac\xb9\xc5\x33\x7d\xee\xb0\x9b\x6f\x2b\x8a\x2f\x15\xab\x82\x76\x80\x70\xb8\xbb\x28\x0a\x70\xf3\xcd\xbf\x0c\xed\x10\x0e\x93\xc9\x83\xca\xc7\x23\xe3\xdb\x15\x73\xde\x1f\xa2\x8b\xf1\x9a\x97\x50\x74\x33\x7e\x79\x53\x89\xc1\x6d\xf1\xfc\x66\x4d\xe3\xda\xea\xd8\xdb\x00\x9c\xdf\xac\x05\x00\x5a\xa8\x79\xbd\x6b\xd1\x44\xef\x23\x5b\x6b\x54\x7b\xde\xae\x7e\x6f\xeb\xcd\xea\x1f\x4a\x33\xd1\x78\x81\x7d\xb2\xde\xf8\xcf\x9a\x4a\xf3\x93\x37\x2b\xfd\x72\xad\xef\x98\xbd\x0e\x3b\x8d\xd6\x40\x6a\x6b\x13\x46\x13\xb4\x60\x31\x7b\x23\xc1\xa5\xd5\x0f\x0d\x6d\x6c\x26\x79\x61\x8b\xb9\x30\x2d\xb9\xfd\x89\x6b\x90\x1f\x92\xa5\x7b\x20\xbd\x89\xfa\x13\x34\x24\xd5\xbd\xb5\x05\xfe\xfd\xef\xc1\xb0\x3f\xee\xff\xfb\xdf\xed\xa5\x30\xc7\xfe\xd0\x7d\xc3\xc8\x75\x6f\x35\x47\x01\x15\x14\x0b\x0b\x4b\x0c\x05\x31\x48\x71\x1a\x39\x83\x23\xe4\x42\xc5\x63\x55\xb0\xbe\x2a\xa0\xff\x90\x08\x07\xad\x14\x58\x6b\x8e\x7c\x70\x44\xbc\xef\x13\xff\x6b\xe0\xcb\x61\xb0\x2c\x9d\x42\x00\x79\x1e\x1e\xd6\x8c\x56\xde\x77\xf6\x76\x88\x17\xf2\xd0\x18\x44\x3e\xe8\x3b\xbb\x7d\x07\x35\x7b\x2d\xf7\x19\x12\x2f\xaa\x7c\xf7\xa7\x4e\x48\xd1\x6e\x99\xf1\xaf\x9f\x49\xe2\x85\x6c\xdc\x55\x0f\x40\x75\xf0\xd7\xa4\x6c\x7f\xb2\x24\x63\x83\x5f\x34\x1a\xea\x4c\x38\x61\xa9\x46\x08\xb1\x83\xa3\x46\xe3\x4b\xee\x84\x6c\xa8\x9e\xd4\x70\xa4\x76\xc5\x58\x25\xfd\x61\x4f\x8d\x88\x15\x3a\x31\x26\xd2\xf8\xf7\x6e\x5b\x8c\x5d\x79\xe8\x85\xbe\x0a\x78\x68\x2d\x59\x8f\x9e\x1d\xf8\xa6\x9b\x5b\xc4\x2b\x7c\x24\xac\xd4\xb6\x88\x75\xdb\xa3\x31\x7b\x08\x1d\x3b\xe2\xc6\xfc\x82\x95\x44\x38\xd8\x25\xde\x4d\xcf\x19\xdc\x3b\x92\x7d\x71\x08\x59\x77\x49\x23\xd9\xc3\xd0\x11\x84\x73\x79\x84\x77\x35\x21\xeb\x8d\xf6\x7a\x71\xcc\x37\xec\x8d\xc3\xf0\x99\x4b\x74\xbc\xbb\xc1\xaf\xda\x5b\x6e\xcb\x08\x8e\xf5\xb8\x64\x27\x0e\xf1\x92\x33\x6b\x30\x14\x09\x78\x6f\x74\x39\x16\x61\xaa\xa2\x46\x23\xd4\xa2\xf0\xc5\x07\x93\x62\xa4\xb2\x5e\xae\x56\x44\x25\x46\x6a\xfc\x5e\xbc\xcf\xfb\xf9\xe6\x8b\x1a\xf6\xdf\x43\xbe\x4d\xc8\x08\xfc\xd1\x7b\xf1\x7e\xa4\x6b\x2c\x24\x27\xde\x69\x4d\xda\x62\x6e\xfc\xc0\x4b\x7b\xe8\x0d\xc4\x89\x39\x1a\xc6\x2c\x15\x71\xb5\x1f\x91\x96\x97\xa0\x03\x2f\xf4\xc1\xa2\xe5\x27\x01\xdc\x7e\xcf\x89\xfd\x24\x20\x24\xe5\x0f\x5f\x85\xfe\x2e\x8c\x75\xe4\x65\x22\xfc\x7a\x86\x2d\x36\x90\x5f\x41\xd3\xef\x47\xdd\xfe\x24\x8b\xde\x4b\xf5\x5e\xbc\x47\x60\xde\xe7\xe2\x41\xbd\x07\xa8\xf3\xf7\x7d\xad\x5f\xf1\xbe\x2f\xef\x55\x38\x66\xff\x1f\xf1\x50\x29\x2c\x25\x8b\x90\x87\xfe\x97\xc0\x1f\x28\xe0\x58\x6f\x8e\x84\xaf\xc5\x0a\x76\x03\x47\x07\x4c\xce\xce\x51\xb1\x47\xe1\xa6\xb0\x93\x3b\xaa\xdc\xb4\x3e\x14\xc2\x16\xa7\x5d\xba\x53\x71\x7b\x79\xc1\x7b\x7d\x8b\x12\x86\x37\xb1\x0e\x31\x05\xbf\x5f\x4d\xd2\xbe\xc8\xcf\x53\x23\x39\x67\x1c\x79\xc1\xc9\xbd\x22\xd0\x71\x76\xa0\xb1\xcb\x6c\x6e\x66\x41\xdc\x0a\x96\xa7\x64\x3c\x9c\xbd\xda\x4d\x0f\x8d\x21\x7e\x2b\xda\x08\xa9\x00\x62\x1f\x0a\x38\xdb\x64\xb0\xda\xf5\xf8\x5d\x0e\x04\xf1\x2a\x27\x8d\x5b\xe1\xef\x6c\x07\x4e\x58\xec\xca\xa7\xd6\x4d\xbd\x13\x99\x98\x31\x7f\x67\xde\xb1\x6e\x05\xbb\x7b\x74\x6e\xcd\x43\xf8\x50\xf3\xb2\xd4\x1c\xb5\x66\xc3\xb7\x64\x7a\x05\xbb\x47\x4b\x30\x45\x30\xdb\x76\x08\x0d\xed\xbe\xdd\x76\xcc\x46\xff\x2d\x61\xc7\x9f\x2c\x93\xeb\x10\xe2\x86\xf6\x86\xa3\x14\xfb\x65\x92\x1a\xad\xf1\x1b\xd3\xd9\x31\x8d\xe8\xad\x23\xd8\x45\x4c\xed\xf5\x43\x39\x94\x6c\xe7\x05\xdd\x53\x43\x97\xee\x50\x2c\xcd\x74\x92\x9a\x5e\xdc\x0f\x4c\x2f\x54\xb9\x77\x1f\x92\x82\x3d\x50\xcf\xef\xd5\xad\xa3\x8a\x52\x66\x6f\x37\xac\x59\x6c\x6b\xc9\x7a\x18\x83\xe6\xa2\x63\x52\x67\x63\xce\x6f\x8c\xa9\xca\xd5\x89\xa6\xaf\x42\xba\x8a\x65\x29\x8d\xfb\xf9\xf8\xb2\xf7\xa2\x5c\xc5\x06\x0f\x0b\xaa\xd8\xee\x0b\x55\x2c\xea\x51\x85\xe6\xa5\x0d\x67\x1d\xb7\xcd\x2f\x1b\x29\xf7\xa9\xdf\x8b\xde\xb7\x0a\xf9\x9d\x87\x93\x25\x35\x47\xb4\x35\xa3\x0b\x84\xf7\x8e\xf5\x02\x1f\xdd\x97\x32\x1d\x64\x85\x89\xb2\x2c\x57\x7e\xe2\x48\xc0\x08\x47\x72\x79\x0c\xa3\xd6\xa2\x37\x87\x84\xa0\x61\x67\xcd\x05\x2a\x96\xca\xf6\x3b\x73\x6a\xd6\xd7\x1f\x11\x7f\xea\x59\x71\x55\x98\x3f\x6a\xf9\xb2\xd7\xf0\x59\xb8\x21\x3d\xfa\xe4\x2a\x2a\xba\x42\xef\xbe\xa7\xc2\x09\xa9\x22\xf4\xf8\x93\x1b\xd2\xd1\x58\x0c\xc7\x57\xbd\x07\xe5\x46\x54\xe5\x91\xfe\x6a\x4a\xbf\xb7\x1d\xd0\xaf\x9f\xdc\x16\x1d\xf7\x1e\xd4\x10\x0b\xde\x8c\x9d\xad\x16\xa1\x1f\x12\xe1\x4a\xf6\xf2\x89\x9e\xdd\xb8\x92\x9d\xdd\xd0\x2f\x9f\x50\x8e\x02\xdb\x3c\xfb\xe4\x10\x6a\x4f\x60\xdf\x12\x86\xa5\xe9\xcd\xc8\x4e\xd7\xd9\x27\x33\x00\xb4\x96\xc3\x9f\x05\x16\xea\x73\xae\xec\xf5\xdf\x39\x57\xb4\x6b\x69\x2d\xed\xd9\x2f\x02\x67\xd4\x03\x94\xe1\x82\x0f\x87\x58\xc1\x88\x71\xa3\x71\x0b\x3c\xf6\x85\xd9\xab\xd9\x98\xd4\x5f\x52\xbf\x59\xee\xf2\xd0\x9c\x85\x3b\xec\xfa\x69\x89\xa3\x29\xb7\x36\xbd\x25\x9b\x4d\xa3\x77\x6b\x85\x8e\xeb\x74\x3c\xec\x3f\x0c\x26\x63\xf5\x3e\xea\xc5\x31\xd2\x6e\x28\xac\xc9\xf6\xfb\xf1\x6c\xa0\x80\x06\x56\xa5\xb7\x4c\x3d\xe6\x10\xa0\x9d\x97\xa3\x68\xfc\x89\x43\x50\x9e\xfe\x8b\x71\xea\x6e\xb6\x1f\x2f\x86\x79\x3f\x4c\x1c\x1d\x43\xd1\x8d\x79\x8b\x94\xf4\x3e\xe1\x31\x7a\x85\x4f\x79\xe2\xa5\x9f\x95\xd7\x6c\xa6\x04\x0b\x18\xfd\x56\xb6\xe7\xa4\xc4\x78\xe3\x16\xda\x6f\x37\x1d\xf6\x33\xe5\xc2\xee\x47\x2b\x39\x65\x35\xa7\xac\xe6\x4c\x47\xe8\xa1\x27\xdc\x01\xc2\xb4\x64\x86\xd0\x6b\x36\x33\xf2\x6a\x2c\x69\xc7\x68\x77\x45\xfa\x47\x81\x93\xd1\x16\xd4\x1e\x86\xf0\x85\xae\x29\x4b\xed\xfe\xa4\x06\xec\xab\x36\xe9\x2c\x74\xa9\x14\x5b\x82\x52\x39\x1d\x10\x2f\x6f\xf2\x2d\x6f\x60\xab\x5c\x93\xb8\x58\x14\x26\xb9\xca\x41\x0e\xed\x51\xcb\xdc\x30\xc9\xd2\x95\xd5\xe5\xa1\x2b\x80\x3f\x3b\x49\xe8\xe5\x21\xbd\x4a\x88\x17\x4a\x47\x9a\x97\xa4\xca\x65\xd2\x68\xaf\xc8\x37\xda\xfb\x49\xbe\xa3\x91\x28\x32\xee\xfc\x2c\xe3\xce\x5e\x35\xdf\xf7\xee\x5b\xf9\xee\x8e\x74\xbe\xbb\xa3\xb7\x72\x0c\x4c\x8e\xc1\x11\xa1\x65\x8e\xc2\x8c\xa0\xec\x7a\x21\x07\x5e\xad\xb0\x90\x6a\x2e\x98\xfd\x2f\xc1\x7c\x7e\xe1\x45\x3a\xd1\xe8\x44\xe3\x0e\x17\x36\x1a\x1b\x51\xc9\xa2\x5c\xe7\xa3\x81\x0a\x7b\x71\xcf\x32\x20\x05\x26\x03\xbf\xd3\x68\x44\xa8\xaf\x51\x29\x70\x94\xc3\x32\x10\xe3\x9e\xcc\x54\xa5\xc4\x08\x8a\x20\x84\xe1\x7c\x1e\x55\xed\xe7\x44\x76\x82\x7a\xb1\xa3\xb9\xdf\x93\xa4\x62\x72\x70\x24\xde\xe8\x02\x1b\x29\x60\x05\xaf\x66\x03\xb5\xbe\x2b\x7f\x09\x5d\xa4\x62\x31\xc9\x80\xff\x82\x8a\x4a\x30\xab\x55\x03\x27\x1d\x55\xad\xe9\x01\xd7\x8b\x57\x65\xa8\x6c\xc9\xcd\xaf\xf6\x38\xad\x19\x3d\x6e\x7e\x0b\xcf\x2c\xd2\xe6\x42\xa1\x4c\x4c\x33\x6a\xe8\x85\xc3\xed\x12\x29\xef\x8e\xdc\x88\xd7\x6e\x5e\x4f\x12\x57\x30\xfd\xf8\x6a\xaa\x2f\x03\x68\x0d\x28\xaa\x45\x2d\xe0\xdc\x73\x0f\xa4\xe5\xcb\x17\x1a\xd1\xa4\x4b\x28\x86\x66\x10\x52\x36\x74\x77\x48\x23\x7a\x77\x48\x88\x27\x6d\xf6\x9d\x67\x38\x47\xdc\x1d\x9a\x1c\xfb\xdb\x10\xbc\x3e\x86\xb3\x43\xa3\x81\x51\xb7\xc7\x34\x84\x18\x4f\xb0\xd1\x43\xbf\x3f\xee\x7e\xeb\xe5\xaa\xd1\xd8\xd0\x06\x86\x26\xc3\x27\x05\x43\xa6\xb5\xd9\x8a\x20\x4c\xa7\x87\xc5\x9f\x9e\x05\x15\xf4\xfa\xd0\x04\x4f\x67\x10\x3c\x39\x42\x1b\x7c\x56\x66\x9e\x57\xbe\xb5\xff\x16\xc8\xda\x1f\x0a\x5a\x49\xa0\x2f\x7b\x55\x0c\x8a\xf5\x94\xa4\x90\x73\x77\x5b\xd0\x9b\x63\xda\x39\x26\x1e\x86\x87\xcf\x82\xf6\x9f\x05\x3d\x3d\x24\x5e\x76\x6b\x75\x64\x4b\x0a\x24\xdf\xf7\xf2\xf7\x18\xab\x46\xc4\x66\x50\x23\x5f\x06\x26\xff\x53\x99\xdf\xe4\x7d\x2a\xf3\x3e\x15\x79\x61\x8e\xc7\xfd\x7e\x36\xee\x0d\x8c\x23\x3d\x2d\x33\x8c\x2e\xc0\x4d\x02\x9c\x57\x11\xa8\xcb\x6d\x41\xcf\xb6\x05\xbd\xda\x16\x66\x2c\xae\x70\xb0\xbf\x1f\x9b\xe0\x77\x3d\xf6\x23\x13\xbc\xc6\x60\xb4\x23\x00\x37\xc7\xc3\x5e\x92\xa8\x21\xe7\xbb\x4f\x02\x9f\x86\x6c\xc4\xd7\x44\x83\x91\xa9\x44\xe5\x91\x57\x5c\xb2\x4b\x62\xc0\xd0\x09\xd6\x3e\x1e\x6c\x6e\xb3\x81\xea\xc7\xef\x25\xe7\xfb\x5d\xbb\xe4\xa4\x07\xb9\xbd\x4a\xee\x1d\x2d\xaa\xbb\xd0\x93\x76\x68\xe0\x84\x96\x44\xde\x7b\xd0\x77\xb3\xa6\xa5\xb6\xed\x71\x91\xc2\x25\x71\xcb\x66\xae\x70\x19\x6f\xed\xff\xe3\x37\x49\x57\x73\x52\xc9\xa2\xc9\x50\x07\x42\xd3\xf5\xaf\x8f\xd0\xf5\xd3\xb1\xa8\x4e\x78\x76\x5b\x79\x45\x40\x0b\xa5\x38\xac\x93\x6d\x41\x9f\xb6\x05\x82\xb7\x8c\x0c\x82\x25\xc3\x5e\x04\xa7\x2a\x58\x40\xc5\x77\x6d\x8d\x16\xb1\xb8\x4e\xf3\xc9\x83\x54\xc3\xb3\xf8\x52\x61\xa3\x23\x6f\x03\x4d\xf6\xdd\xce\x02\x6d\x1d\x2b\x04\x56\x43\xf7\x2c\xd4\x3d\x93\x2c\xec\x4f\xf2\x31\x0f\x9b\x5b\x28\x22\x50\x54\xb8\xdb\xcf\xfa\x43\x53\xfe\xc0\x14\x17\xa4\xd1\xf8\x21\x90\xc1\xab\x58\x9b\x4c\x6f\x2b\x0e\x90\xfc\xff\x9f\xba\x37\x6d\x6a\x63\x77\x16\x87\xdf\xe7\x53\x00\x97\xeb\x23\x61\x59\x8c\xc9\x21\xe7\x9c\x99\x28\x14\xfb\x12\x0c\x01\x12\x30\xb8\xa6\x6e\x69\x56\x1b\xdb\x63\xe3\x0d\xdb\xe0\xef\xfe\x54\xb7\xa4\x99\xf1\x42\xce\xef\xf7\xbc\xfb\x57\x52\x58\xd3\x92\x5a\xdd\x5a\x5b\x52\xab\x3b\x70\x05\xfc\x41\x22\x03\x0c\xaa\x4a\xf1\x58\xc0\x4e\x8e\x75\x0d\xf9\x2c\x60\x57\x27\x39\x65\xd2\xe7\x1c\x0e\x28\x08\xfa\xa7\x1a\xa4\x7e\x2d\x40\x83\x83\xbe\xc2\xec\xb9\x74\xf6\xc0\xfb\xf5\xa5\x33\x34\x90\x1b\x73\x3b\x5b\x23\x91\x57\x25\x75\xb4\x7e\x5c\xfe\x30\x33\x56\xc3\x0f\xdf\xe7\x9d\xa2\xab\xb4\x53\xd8\x16\xa5\x5a\xe9\xa7\xdc\xf3\x1c\x8f\x6f\xf6\x45\x20\x1d\x8f\x47\x41\xed\xe1\xc5\x25\x74\xf6\x3a\x80\x0c\x88\x5e\xf2\xf3\x04\x71\x4b\x5e\x49\xe8\xec\xd3\x03\x0f\x9e\x97\x74\x04\xd6\xc5\xa2\xfc\x1d\x64\x12\x75\xbb\xa2\x4d\xcd\x66\x74\x3d\xcf\x1f\xb2\x82\x7c\x35\xbd\x76\xfc\xda\xcb\xc4\x25\x5e\x36\x03\xf8\xe2\xe2\x9a\xf8\x94\x05\x62\xbd\xcc\x94\xb1\x23\x3f\x35\x73\xa4\xb7\xda\xca\x5c\x55\x64\x5c\x93\x47\x22\x42\xaf\xed\x31\xea\xd1\xff\x78\x29\x14\xd4\x2f\xec\x93\x61\x0d\x8d\xb5\xa4\xb8\x5e\xd6\x8e\x9f\x62\x3e\xf4\x59\x8b\x25\xfa\x64\xaa\xb9\xd7\xc2\x9c\xad\x5a\xd3\x45\x27\x75\x76\x82\xdf\xe8\x82\x1a\x31\xb4\x0a\x85\xf5\x24\xc3\xd2\x88\x48\xcc\xa7\xaf\x42\x74\x8e\xd4\xdb\xa0\x2c\x2a\xd0\x4e\x87\xd6\x49\xeb\xfd\x3d\xa1\xfc\x97\x9f\xc6\x19\x79\x68\xdd\x9a\x7d\x3a\x7c\x9d\x3b\x7c\x42\x2c\xcf\xe9\x65\x2c\x35\xad\x65\x6e\x6f\x94\xcc\x8d\x0a\x05\xdd\xf3\x95\x35\x28\x57\xd5\xa0\xe5\x04\xaa\xf2\x72\x26\x65\xa1\xb3\x31\xb3\x0b\x83\x4a\x0a\x75\x35\x6a\xeb\x50\x86\x2d\x0f\x6f\x4f\xd1\xdd\x52\xf7\xde\x0e\xd1\xf5\xbb\x76\x0d\x34\x9b\xe9\xfd\x1d\x59\xcf\x14\x41\xd0\xe6\x8c\xa6\x64\xf1\xe2\x79\xf3\x52\x98\x4d\x3f\x64\x2a\xa3\x05\xe2\x4f\x0f\xbc\xd5\xf8\xe8\x16\xb8\xff\x9a\xed\xef\x1f\x22\xde\xda\x25\x73\x9b\xcd\xfe\x2b\x9d\x7f\x6c\x2f\xf9\x4d\xc2\x70\x92\xf5\xe9\x5b\x60\xec\x20\x78\xfc\x67\x03\x3d\x01\x50\xc7\x9f\xdb\x76\x9b\xcf\x6c\xbb\xac\xb7\xd1\x55\xe2\xc3\x9e\xd9\x5f\xbd\x67\x36\x3b\x94\x1f\x46\x1b\xf6\x3c\xe1\xc9\xae\xde\xe2\x60\x98\xf8\xd4\x09\xc4\x81\xb6\xf2\xf5\x10\xb1\x54\x31\xc2\xbc\x3e\x31\x59\x6f\x7c\xee\x55\x74\xc3\xd2\xfc\x23\xfe\x1b\xdf\x6c\xe6\x7f\x38\x3e\x1f\xa0\xc1\x52\x9f\x0f\x5e\xe1\xf7\xf8\x02\x37\x88\xca\x79\xec\x09\x57\x27\x72\x87\x9d\x64\x10\x26\x83\x3e\xb6\xc6\x09\xa6\x08\x18\x44\xbf\x0e\x54\xb2\xa8\x35\xc4\x63\xf8\xac\xaa\xd4\x01\x3e\xea\x42\xcc\x51\xab\x8a\xcd\x48\x5e\x4d\x16\x6c\x82\x9a\xe4\xad\x85\xf6\x98\xd8\x91\x54\xbf\x87\xfa\xd7\xeb\xaa\xdf\xe3\x86\xfa\x8d\xd4\xef\x8c\x3a\xde\x1d\x09\xd8\xa7\x88\x16\x0a\xde\x1d\xf1\xf9\xf5\x0b\x8b\xe8\x1e\x99\x26\x24\xe0\x87\x92\x01\x80\x1f\x4a\x8a\xbe\x47\x4f\xf8\x95\x4f\x7c\x7e\xf9\x62\xce\x29\x92\x1b\xb2\x43\x59\xe7\x86\x44\xcc\x62\x21\x3f\x44\x69\x44\x03\xca\x2c\x48\x01\x91\x88\x6a\x83\x29\xba\x8b\xe2\x17\xc7\x24\xa2\x94\x61\x01\xc7\x0d\x55\xc0\x71\x63\xae\x00\xef\xf5\x83\x02\x8e\x1b\x0b\x05\x18\x40\x56\xc0\x29\x56\x35\x94\xe0\xf3\xf6\x2e\x81\x56\x51\x65\x45\xba\xac\x08\xcb\x9a\xfe\x22\x3e\x1b\x8e\x25\xc5\xa7\x79\x51\x43\x97\xe7\x25\x2c\xe2\xd7\x21\x09\x61\x09\x62\x11\x3f\xac\x93\x10\x6d\x2e\xe2\xed\xd2\x09\xaf\x7b\x24\xac\x9d\xba\x2c\xc4\x97\x9c\x61\xad\xe7\xb2\xb0\xb6\xef\xb2\xc8\x34\x2d\xf3\x6b\xc1\xc4\x25\x21\xe2\xa6\x58\xa2\x08\xa8\xed\x73\xbf\x8b\xb4\xcc\xf4\x48\x49\x75\xe6\x50\x57\x6e\xa6\x0f\xd9\x79\x3d\xe2\x2f\xaf\xc4\x33\xe3\x89\xa5\x53\x8c\x09\xb5\xe8\xcc\x19\x8f\x3f\x36\x3e\xd3\x7f\xdd\xd3\xbf\x38\xf4\xeb\xfb\x2e\xa1\x76\xcd\x55\x23\xbb\x53\x5f\x65\x49\x7f\x71\xc1\xe8\xd4\x61\xc1\x50\x67\x36\xa8\x8a\xf6\x9f\xac\x32\xfe\xaa\x55\xe6\x81\x07\xc3\x76\xf7\xf7\x67\x6d\xa9\xed\x60\xbe\xd9\x95\x7b\x92\xf7\x64\x2d\x09\x5c\xfb\x3a\xb7\x46\xd5\xaf\x73\x0f\xb8\x0e\x1e\x88\x84\x41\x21\xf9\x0f\x26\x71\x38\x48\x18\xb5\x7e\x97\x00\x04\x0d\x9b\xf7\x5f\x85\xcc\xaa\x36\x3b\x49\xb8\x9e\x7b\x07\x66\xce\xfa\x7c\x15\x6e\xed\x93\xdc\x2a\x0b\x7f\x85\xe4\x47\x65\x5c\x6c\x95\x75\x49\x98\x11\x6e\x2a\x52\xa7\xb8\x4b\x43\x3f\x4d\x08\x96\xe4\xeb\xdd\x0f\xd8\xbd\x8c\x9d\xdc\x09\x94\x7a\xa8\x7f\xb6\x4b\x17\x8e\xa0\x7e\x08\xc9\xcf\x77\x57\x1d\xe2\xb0\xb9\x73\x99\x97\xbc\xd2\x94\xa7\x4e\xb3\x7c\x41\xbc\x92\xac\x75\xa7\x2e\xdd\x26\x92\xeb\xc3\x29\x0d\x81\x02\xcb\xdf\x94\xfd\x55\xaf\x24\xf9\xf7\xdd\xaf\xe5\xe3\xcf\xdb\xe6\x50\xe9\xfa\x5e\x2f\x88\xea\xbc\xd5\x17\x65\x06\xe4\xc1\xb2\x09\xf5\x23\xeb\x32\x6f\xf8\x93\x48\xbe\x19\x4b\xbc\x31\x91\xfc\x62\x57\xf8\x0e\x20\x34\xcf\x12\x54\x6b\xf8\xec\x6d\x36\x7f\x98\x54\x79\x91\xba\xfb\x2b\x2e\x95\xe2\xfd\x92\x5c\x75\x19\x17\x0a\xe4\x75\xe1\x44\x2c\x3b\xa1\xd3\x4f\xcb\x1f\x78\x73\x5e\x5d\x6d\x4e\x79\x70\xdf\x98\x2c\x53\x86\x22\x60\xc4\x0e\x3a\x5d\xd8\x21\x76\xba\xda\x5e\x84\x84\xb1\xab\x4d\x46\xc8\xda\xbe\xab\x54\x06\x87\xad\x55\x23\x24\xa7\x7c\x79\xe3\xef\xc1\x97\x4d\xcc\x13\x7a\x9f\x0f\x5b\x44\x52\xba\xf7\xdb\xb2\xfc\xc0\x2d\x61\x54\x5a\x62\xc5\x77\x4b\x98\x66\x66\x1b\xc3\x35\xcf\x1f\x0d\x95\x1f\x86\x9d\x0f\x1e\x4e\xdb\xfa\xb0\xb0\xa9\x4f\xec\x29\x8b\xc3\xc1\x8a\xf8\x61\x2b\x8b\xae\x5e\x76\x7c\xdc\x45\xd8\x55\xf2\xe3\x42\x2a\x53\x75\x12\xa3\x1e\x73\x51\x37\xf3\x51\x99\xb1\x32\xbb\x4a\x6e\xe7\xe3\xee\xf3\x71\x77\xf3\x71\x3f\x3a\x8d\x64\x70\x24\x07\xc3\xb6\x5d\x25\x3f\xb3\x38\x54\x99\x3b\x98\xb3\x86\x95\x9f\x95\x7e\x60\xa3\x34\x9b\x0b\x7a\xa3\x4a\x02\xf1\x72\x77\x44\x78\x84\x92\x74\x06\x6b\x41\x4f\xbe\x26\x7c\x43\x2d\x92\xf2\x83\x5b\x0b\xe6\x89\xbb\x66\x7a\x23\x56\xbb\xf3\x5c\xf2\x83\x32\x29\x7e\x5e\xe2\x56\x83\xa9\x7c\x27\xfa\x4b\xc9\x74\xd7\x97\xc4\x83\x18\x73\xe8\xec\xab\xa8\xdf\x2c\xd3\x12\x86\x81\x06\x66\xe6\xbc\xbd\xda\x93\xe7\xd6\x2c\x97\x0f\x3a\x47\x72\x20\x7f\xdd\x5e\x92\xef\xa3\x39\x91\xbc\x8d\x1b\xb7\xb8\xba\xa4\x85\x90\x3f\x5d\x9b\x3d\x92\x76\x95\xc5\xd5\x9c\x5d\xbf\xe4\xf7\xf9\x0e\x2f\x74\xbe\x64\x21\x5f\xe7\xf7\xf9\x6e\xd8\xcf\x98\x55\xa6\x12\xb2\x76\x16\xb2\x76\x7f\x9f\x55\x1d\x18\xce\x1e\x49\x77\x21\xdf\xcb\x6f\xf2\x3d\x9d\x43\x8e\x17\x95\xe3\x05\xaf\xc6\x97\xce\x9c\xe7\xcf\x98\x73\x75\xd7\xfb\x0d\xe2\x87\x23\x40\xdc\x5b\x20\xa5\xff\x7b\x16\xd4\xd1\xe3\xec\x91\xf4\x55\xbe\xfe\x7f\x46\x50\xb6\x0d\x1f\xfc\x1e\xbf\x7f\xac\xab\x68\xb0\x40\xd7\xf0\x5f\xe9\x52\xf9\x86\x2a\xdf\xf0\xbf\xac\xa8\xd1\xbf\x37\x3a\x60\x1f\x2d\x50\xf5\xfa\x9b\x6c\xcf\xa7\x19\x55\xaf\x0b\xf9\xc6\x98\xef\xe7\x20\xd5\x30\xd1\xf7\x75\x28\x47\xab\xa9\x3d\xa7\xe0\xf2\xda\x14\x6f\x9b\x03\x34\xfc\x88\xdf\x4f\x27\x6a\xd8\x6d\xea\xdf\x53\xf5\xa3\xd5\x68\xae\xe2\x39\xad\x9b\xf3\x67\xf5\x3b\xc8\x21\x4c\x4d\xca\xf9\xa7\x62\x57\xdf\x4e\xff\xdc\x15\x3a\xe4\x5f\x89\xb2\x0a\x05\x0f\x2a\x6f\xa8\x7f\xe3\x8a\x58\xd7\x51\xb7\x15\x05\xfa\xa5\x7f\xc3\x7b\xf5\x1b\xdd\xe7\x9f\xda\x47\x69\xfa\x30\xc8\xc1\x3b\xe2\xad\x27\x93\x38\x54\xb2\x77\xfb\x4a\xfd\x06\x75\x3d\xf5\x63\x9a\xef\xcf\xe2\xed\xb4\x69\xbf\xb5\x1b\x89\x6d\xb1\xb6\x1c\xdb\xd6\x8c\x29\x57\xd1\x73\x30\x9d\xbc\xf9\x90\xc3\x1f\xdf\xa7\xe5\xca\xa1\xd1\x03\x1a\x57\xd9\xcf\x81\xbe\x09\x9f\x54\xc5\x5b\xd7\x97\xf6\xd9\x19\xeb\xf8\xd2\x9e\x9c\xb1\xdb\x89\x3d\x8e\x67\x6c\x5a\x15\x6f\x2f\xbb\xf6\x06\x92\x77\x17\xb6\x42\x7f\xd0\xe9\x55\x1a\xc9\x99\x4c\x82\x56\xb8\xc1\xba\x4b\x71\x72\x6c\xe2\xfa\x2b\xf2\xdd\xf9\xbd\x30\x4c\x36\x58\x6f\x45\x3e\x1d\x37\x63\xcd\x6b\x29\xde\xae\x87\xd2\xbe\xee\xb1\x97\xa1\xb4\x0f\x7a\x6c\x34\x94\xf6\x59\x8f\xdd\x0e\xa5\xfd\xab\x37\x63\x2d\x48\x81\xee\x39\x1a\x07\xec\x30\xb4\xf9\xee\x8c\xb5\x01\x96\x1e\x6f\xda\x6f\xb0\xca\x56\x43\xb3\xa2\x9e\x1e\xcc\x58\x88\x6f\x98\xcf\x41\x50\x91\xfe\xa0\x31\x6a\x0c\x26\xf6\x7a\x99\xa9\x43\x3a\xfb\xad\xdb\xe9\x2b\x7f\xda\x37\x33\xa6\xcd\x17\x0e\xc2\xf1\xe0\x87\x01\xf7\x4f\x53\x73\x85\x73\xf0\x1b\x96\x1e\x7a\x19\xef\xb8\x37\xb3\xd9\x8c\x25\x0b\x04\xa1\x00\x50\x0d\xf5\xa2\xff\x5f\x12\xb4\xaa\x60\x20\x68\x15\xa1\x1f\x11\xb4\x5f\x15\x6f\xe8\x47\xc9\x36\x1e\x4e\xb4\xcf\x92\x9b\x7d\xf6\x09\x6b\x73\x1a\xce\x28\x93\xe7\xb6\x5e\x17\xcb\x16\x2b\x7f\xa1\xec\xb1\x25\xed\xcf\x33\xe7\x41\x8c\x51\x63\xec\x37\x4a\x38\x4f\x11\x49\xaf\xda\x8d\xe5\xd5\x67\x91\xfc\xd2\xb7\x6d\x73\xc3\x3a\x27\x35\x6d\x9e\x98\xb3\x87\xcd\x13\xf3\x3e\x55\xcb\x24\xe7\x2d\x2d\xb3\x68\x3b\xf6\x3a\xc7\x53\x9a\xe3\x69\x31\x47\xfb\x31\xbd\xc1\xa6\xd4\x49\xd5\x1e\x6a\x1e\x6c\x05\x8d\xd1\xa2\xea\x0b\x31\x87\x1b\xa1\xbe\x8e\x6f\x6e\x12\x2f\x53\xfb\x39\xd5\x66\x72\x2f\xd9\x65\x7a\xd9\x7a\xa6\x69\x41\xbd\x73\x3d\x01\x18\x32\xcc\xb8\x1f\xd4\xce\x5d\x62\x31\x4b\x4b\xa4\xb7\x79\xb0\x32\x82\x65\xa9\x98\x01\xaf\x10\x5a\x2a\x53\x48\xea\x09\x1c\xc2\x1a\x11\x0e\x64\x9d\x7b\xc6\xfc\x5a\x7d\xea\x16\x0a\x1d\x73\xce\xe4\x29\x88\xc6\x1f\x06\x3c\xe8\xb4\x65\x23\xc1\x5b\x8d\x65\x10\xde\x6d\x2c\x83\x73\xb6\x25\xd3\x43\x9e\xcb\x9a\xd7\x73\x89\x51\x35\x0d\xb4\x8a\x54\xf5\x65\x59\x69\xdb\x3f\x15\x3f\xa0\xdd\xc3\x89\x64\xbb\xe6\x30\xe9\xe7\xae\x02\x3e\xbe\x66\xfe\x91\x5b\xf7\xe2\x1c\x60\xed\x61\xce\x94\x47\x5c\x51\xc0\xcb\x83\x1c\x30\x7c\x50\xc0\xef\xd3\x1c\x30\xd0\xc0\x9b\x5e\x0e\x18\xdd\x0b\xbf\x43\x24\xdb\x9f\x4a\xa6\xbb\x71\xeb\x5a\x9a\x06\x09\xef\xc5\x4b\xa2\x1f\x98\x65\x3d\x32\x77\x2e\xa7\x2f\x8b\x36\x01\x6f\xef\x18\xa6\x1a\x76\xd6\xa3\xfa\xde\xe8\xa0\x67\xab\xfe\xd2\xd6\x2d\x9e\xcc\x5d\x14\x9e\x99\xe8\xd1\xca\xe8\x5f\x26\xfa\x65\x65\xf4\xb5\x89\xee\x2e\x46\xeb\x3b\xb4\x25\xe4\x33\xbd\xf2\x79\xe9\xea\x81\x64\x37\xce\xd9\xdd\x4f\x58\x48\x85\xb8\xad\xe3\x56\x67\x73\xe1\x65\xe6\x7e\x42\x4e\x20\xa5\xec\x4b\xdc\x83\x29\x45\x34\x8d\x64\x2f\xb9\x96\x76\xfb\x5a\x66\x5e\x79\x72\xe2\x48\x77\xfe\xbc\xf7\xfe\x16\x36\xb8\x84\xce\x3d\xe3\x4f\x1d\x88\x9d\xbb\x04\x1f\x5d\x80\xa0\x7b\xd7\x20\x3e\x7b\x6e\xa4\x72\xec\x4f\xf8\xf6\xe8\xec\x01\x46\xcd\x1c\x79\x97\x66\x64\xd1\xf9\xd5\xdc\x9a\x39\x2f\xd9\x61\x6a\x7a\x60\x1e\x9b\x6e\xa3\xf7\xc9\x7a\x63\x5e\xfe\x48\xc9\xe5\x7e\xa4\x75\x41\x22\xa5\x90\xd0\xda\xfc\xa8\xf4\x7c\x69\x07\xaa\xd2\xd9\x38\x9e\x93\xce\x5e\x4c\x75\x48\xdc\x94\x5e\xaa\x03\x45\x09\x32\x85\x84\xaa\x4c\xcd\xc3\xd8\xa9\xe1\x18\xe3\xae\x9c\x7f\x7f\x66\x81\x13\xa8\x91\xad\xbd\x31\xf1\xab\x98\xff\x0c\x19\xfe\x86\x11\xc5\x81\xae\x26\x85\xc5\xa8\x99\xe3\xf3\xd3\xa6\x08\x1c\x85\x09\xcd\x90\x5d\xc5\xe8\xfd\xa7\xd7\x34\xa9\x55\xc7\x0e\x97\xa3\xc2\x88\xce\x97\x1c\xb0\x30\x5f\x9a\xd2\x9e\x8d\x95\x41\x3e\x2c\xe2\xe7\xae\xb2\xa0\x25\x7c\x2a\x95\xc0\xa3\xcf\x19\x2d\x65\x01\xed\x99\x9f\x36\x01\xd3\x8a\x12\x03\x3c\x8c\x83\xb1\xd5\x6e\x90\x90\xee\x11\x75\x54\x76\x24\x07\x21\x8b\x6a\xd7\xbe\x4b\xc2\x5a\x08\x03\xb2\xe8\x53\x6a\x47\x22\x2c\xfa\x4e\xa0\xbd\x9b\x29\x33\x8f\x29\xb6\xe3\x90\x44\xb4\x14\x50\xa0\xc9\x50\x8a\x16\x6f\xfc\x2b\xe1\x7f\x4d\xc9\x90\xe3\x52\x8e\xa4\x3d\xdf\x2e\x2b\x6f\xd4\xe1\xc3\xfb\xbb\xe4\xc1\x03\xf5\x91\x40\x16\x08\xec\xce\x7c\xc0\x8c\x83\x25\x75\x9c\x33\x89\xf6\xca\x42\xf8\x7c\xd0\xde\x0b\x6a\xc1\x8b\x4b\xa8\x1d\xd8\x65\x21\x3e\x29\x90\xad\x81\x4c\x82\x14\xe5\x3b\xca\x39\xaa\x07\xb3\x2e\xfb\xf5\x4a\x24\xef\xb0\x1e\xf6\x8b\x04\x3d\xf6\xf9\xb5\x89\xab\x04\x36\xfd\xcd\x61\xf1\xc6\x73\x08\x8a\x67\x3e\xed\xe8\x83\x7d\x7b\x6a\xe2\xee\x07\x92\xf5\xd2\x26\x5e\xad\xe7\x32\x34\xfd\x86\x17\xd2\x07\x92\xa0\xc5\x9f\xda\x8b\x6b\x9a\xca\xe3\xfb\x8e\xe4\x75\x0f\xd6\x18\x96\x26\xd7\x93\xf6\x3d\xa4\x49\x6f\xcb\x3d\xe2\xd7\x4e\x5d\x86\x4e\xad\x98\x0f\x49\xfd\xf9\xa4\x2c\x14\xfd\xf4\xfc\x28\x54\x59\x56\x1e\x5f\xea\x89\x97\xa5\x7a\x74\x41\x6d\x5a\xe5\xfd\x5d\x57\x84\x4e\x28\x06\xe9\x25\xd7\x7f\x8f\xa3\xa7\x71\x0c\xcd\x58\x54\xf2\x30\xd4\x35\xaf\xd4\x51\xf7\x6f\x3e\xc3\x0b\x66\x90\x2b\x33\x5c\xae\xca\xd0\xdd\x75\x85\xf2\x22\x16\x89\x5f\xcd\x74\xe6\x55\x33\x06\x6f\x93\xa8\xf6\x33\x70\xd9\x8f\x33\xb3\xc8\xff\x8c\xf5\x22\xaf\x27\x27\xba\x94\xf6\x26\x4d\x3b\xda\x5d\x4c\x1a\x88\x80\x4b\x62\x4c\x8e\x43\x9e\x20\x87\xfb\xd7\x6f\x70\x07\xec\x2c\x15\x34\x4e\x4e\xe6\x92\x31\xa5\x50\xb4\x79\xce\x6e\x13\xd8\xf5\x50\xea\x10\x23\xd7\xef\xb7\xe6\xbc\x57\x66\xb3\xb3\x10\x48\xed\x8c\x52\xad\x68\xa9\x0a\xf9\x1d\xf1\x7a\xcd\x7e\x7f\x27\xa3\xec\x99\xdd\xd9\x19\x3b\x3b\xa3\x2c\x85\xa0\x12\xc4\xe4\x2c\x4f\xba\xc7\x4e\x53\xd2\x1b\x95\x05\xd2\x83\x3a\x6c\x24\xe6\x93\x9f\xff\x67\x9c\x5a\x0b\xd9\xfe\x9b\x0a\xd2\x6e\x0e\x40\x7a\x33\xd6\x26\xb3\xcd\xed\x75\xce\x0c\x91\xcc\xb3\x20\x81\x7e\xc9\xa4\xa1\x3c\x98\xe1\xfa\x99\xa3\x5a\x42\xd9\x26\x05\x96\xea\x67\xb4\xca\x3c\xa1\x1f\xa5\x04\xf2\x72\xf7\xf0\xc3\xeb\x39\x6f\x71\xaa\xa3\xee\x57\xb9\x3c\x67\x31\xfc\x3e\xb6\x24\x6b\x42\x40\x79\x40\x6d\x89\xc0\x4c\x0b\x01\x4c\x0b\xe8\x99\x33\x14\x7c\x77\x2b\xaa\xf5\x8c\x4f\x02\x9c\xe2\x60\xf0\xdb\xf5\xda\xc0\x25\x5e\x29\xa4\x45\xbe\x8b\xea\x06\x93\x68\x2f\x0f\xb3\x71\x76\x70\x02\x7e\xdc\x26\x2d\xe8\xb9\x2c\x51\x87\xe4\x93\x68\x8f\x78\xa2\x5e\x3b\x76\x49\x08\x02\x6a\xff\x92\x20\xb0\xf6\x36\xb6\x2d\x36\xb1\xbd\x19\x83\x50\x11\xe7\x15\xf8\x74\xed\x85\x28\x08\x15\x61\xc6\x99\xc1\x6c\xc6\xfb\x92\x78\xac\xc9\x5a\x30\xad\x42\x1f\x7b\x45\xbe\xf9\xee\x16\x01\x14\xa5\x08\x27\x3d\x8b\x45\x78\x5d\x02\x48\x63\x16\x60\x7a\x6a\x7f\x48\x88\xc7\x26\xb0\x0b\x86\x90\x21\xc4\xd2\x84\xe4\xa2\x20\xf4\xaf\x84\x58\x9a\x94\x7d\x43\x0a\xd2\x80\xd4\xa4\x84\x18\xd9\x06\x2b\x2a\xd7\x84\xaf\xd7\x0b\x1e\xef\x31\xf9\x5b\x20\xbc\x62\xe0\x84\xc2\x2f\x86\xba\x5d\xfa\x97\x04\x69\x2b\x46\x6c\x62\xfb\x48\x5d\x50\xca\x85\x21\x54\x8c\xd2\x70\x58\x8a\x72\x69\x42\xcd\x68\x2e\x9c\x4b\xe3\xe9\xbc\x2e\x4a\xca\x31\x70\x99\x20\x19\x4e\x54\x14\x65\xdd\xa0\x72\x81\x82\x62\x1e\x3f\xe6\xd6\x35\x9c\xa5\x59\xa0\xa1\x04\x69\xa8\xfd\x11\xa6\x2c\x4f\x1e\x53\x86\x7f\x09\x93\xa2\x54\x2a\x4a\xe3\xac\x6d\xb2\x6b\x99\xfe\xf5\x82\x79\xbe\x7d\x5c\x2c\xcd\x12\x91\xdd\x0f\x81\x64\xab\x9c\x03\x29\x13\xab\xca\x98\x2a\x2e\x7b\x25\xe5\x63\xc2\x5e\x8e\xf7\x4b\xda\x1e\xeb\xbe\x9b\x6f\xd1\xc1\xef\x0a\xbd\xfc\xb8\x50\xdf\x2c\xc9\x15\xdf\x2d\xf9\x69\x81\x7e\x4a\x8d\x1f\xb8\x25\x5f\x17\x97\x9d\x4a\x5e\x2f\x39\xcd\x4e\xa5\x1b\x65\x2c\xdd\xc8\x3d\x2c\x12\x65\x81\xc2\x0d\x1f\xb4\x51\x4d\x64\x12\xe5\x1e\xf5\x78\x22\x2f\x4a\x79\x94\x45\x7b\x81\x16\xa4\x3c\x16\x50\xdb\xb8\x05\xf5\x72\x0e\x0a\x7d\xa3\xf8\x1b\x67\xbe\x25\x59\xb4\x97\x7a\x10\x65\x21\xb5\x0d\x12\x34\xbc\x6a\x2e\x1b\x2a\x75\x3b\x60\x97\x75\x3b\x9c\xcd\x1e\x78\xfb\xe6\x03\x19\x07\xab\x2c\x35\xe5\x9b\x13\x53\x2b\xf5\xf4\xb8\x3c\x0f\xbe\xac\x83\x8c\x56\x36\xb6\x2c\x34\x9f\x7a\xeb\x62\x8a\x46\x25\x6b\xdb\xdf\xf3\x6c\xc9\x40\xd8\xf2\xf7\xa4\xed\xa9\x1b\x9a\x5f\x23\xb9\xac\x80\xbc\xae\xd7\x09\xbe\x39\x98\xd7\x2a\xf1\x73\x44\x66\xca\x5e\x3e\xaf\xd4\x95\x63\x1c\x08\x5f\xd6\xb3\x3c\xbe\xe8\x65\xeb\x20\x9e\x16\x1c\xea\x8d\x83\x8f\xe2\x0a\x88\x20\x63\xb3\x63\xe9\xf0\x40\xbf\x91\x4b\x55\x6a\xb3\x13\xcf\xc3\xea\xa2\x93\x28\x99\x91\x11\xf2\x4a\x1d\x95\xdf\x42\x7e\x59\x17\x22\xd3\x46\x71\xb4\xfc\x09\x95\xef\x41\xe5\xfb\x33\xdc\xbb\xa0\xd0\x93\x29\xaa\xa4\xa5\x1c\x54\xe7\x9f\x48\x4e\xa2\x3d\x5c\x5a\x6a\xfb\xae\xad\x02\x3d\x17\x25\xcd\x34\xa2\x67\x22\xf6\x91\x12\x6f\x5d\x4c\xce\x0c\x85\x6a\x28\xa2\x36\x75\x2a\x01\xa2\xfe\x4e\x2a\x9a\xa9\x7b\xcb\x49\x94\x1a\x18\x87\xa5\x06\x25\xc1\x22\x08\x81\x25\xbe\xbb\x15\xe0\x52\x24\x79\x0c\x4b\x4e\x8c\xba\xcc\xf8\x55\xbf\x23\x91\x12\x1a\xd5\xf7\xe3\x33\x7c\xe3\x40\xc1\x3b\x47\x83\xac\x76\xea\x16\x41\xaa\x04\x5c\x3e\xe0\x62\x29\xae\x26\x43\x85\xee\x98\xc7\x88\x0b\xad\xa8\xc3\xe7\x24\xc6\xcf\x9e\x4b\x67\xde\xba\x38\x3b\x43\xe3\xe3\x83\x45\x66\x7a\x73\xcc\x74\x77\x5d\xa6\x26\xcd\x3c\x17\x29\x03\x6c\x8e\x01\xb6\xc0\x00\x9b\x67\x80\xda\x24\x47\xfd\xff\x2f\xc2\x29\xec\xa4\xcf\x5b\xf3\xc6\x7b\xaa\x79\x09\x98\x07\xf5\x39\x21\x67\x3c\x3f\x85\xad\xdc\x3a\x31\xdf\xcc\x25\x2c\x10\x24\x9b\x54\xf3\x69\xe8\x36\x9a\xdd\xe6\xe5\x6f\x46\x61\xea\x2d\x68\xf4\x94\x3e\x9f\x5d\x2a\x6f\xf9\x6c\xb0\x69\x07\xdb\xbc\x3c\x73\x24\xe0\xc8\x17\x64\xe6\x4b\xc0\xa1\xf2\xf2\xf2\x37\xb9\x97\x43\xa0\xf3\x4b\xc8\xaf\x4e\xbb\x53\x06\x8e\xaa\xa9\x46\x5c\x5c\x31\x8c\xac\xc3\x52\x86\x03\x4b\x8c\xe3\x42\x41\x31\xa9\x4c\xa3\x5a\xa8\xc2\xb4\x2e\xb9\x1c\xee\x11\x89\x07\xdd\xea\x91\x85\xe4\xfe\x29\xd4\x27\xc8\x66\x00\x57\xcf\x27\x24\x1f\xb4\x25\x93\x14\x62\xe4\x10\x1f\x4c\x50\x7b\xdd\x2b\x14\xe0\x53\x5d\x31\x43\x48\x45\xeb\x6b\x65\xd8\xcd\x0d\xda\x2b\xcd\xd4\xc8\xa1\x99\xf6\xc6\xe9\x96\x4a\xcf\x7a\xfe\xe9\xf6\xe1\x33\x29\x1f\x7f\x66\x5f\x8e\xff\x64\x92\x0f\x36\x53\xcf\x0c\xe7\xcf\x5c\x36\xcd\x01\x22\x35\x46\xb0\x73\xd0\xdb\x0a\xec\xcc\x48\x50\xf2\x29\xaa\x7b\xfe\xf6\x28\x0f\x5d\x06\xc0\x2a\x11\xe7\xf1\x78\xd8\x8a\x46\x7b\x4c\xc1\x22\xea\x58\xdf\x64\xed\x7a\xec\x6a\x5f\x0c\x72\x4c\xe2\x12\xba\xb1\x96\x22\x2a\x91\xb8\xe4\xab\x55\x5e\xfb\x0d\x29\x86\xca\x8c\x7f\x5c\x24\xb2\x14\xc1\xb2\x9d\x62\x3b\x98\x10\x9f\x3a\x32\xff\x8d\x2a\xb6\xed\x46\x22\x62\x07\xe9\x11\x72\xe5\x71\x6a\x6b\x53\x09\xf1\x6a\xab\x9c\x3f\x84\x54\xdb\xb7\xf4\x24\x52\x1f\xe8\x3c\x92\x75\x6d\x44\xe5\x57\xbc\x38\xc9\x4b\xbe\x39\x30\xce\x4d\xd3\xf1\x60\xce\x66\xe3\xfb\xf7\xf7\x49\x7a\x7e\x4a\xd9\xe5\x2b\xf1\x6a\xb2\xe7\xd6\xc6\x2e\xbb\x3b\xd3\xd6\x4d\x7e\xfe\xa7\x38\x73\x98\x72\xf3\xf9\x64\xf1\x35\x7a\xc7\xd1\x27\xb7\x7a\x99\xd5\x43\x6b\xfe\xfb\xb2\xfe\xfe\xfe\xeb\x95\xf8\x38\xa1\xe7\x07\xe6\x65\xee\x53\x8e\x67\x46\x61\xff\xa9\x85\x0e\x5f\xd4\x68\x9d\x44\x7b\x01\x9f\xd8\x01\x1f\xd3\x92\xcf\xdb\x57\x38\x97\xa9\xf5\x36\x36\x23\x9e\x35\x53\xf5\x78\x35\x45\xa8\x83\xce\x71\x6c\x87\x22\x86\x92\x4a\x11\x08\x51\x4d\xf8\x90\xe3\x52\x04\xc2\x4d\xfe\xc4\xf3\x6c\x31\x1d\xa4\x28\x49\xee\x5f\x29\x40\x2e\xed\x04\xd2\x02\xb0\xa8\xa3\x2f\xeb\x2c\x8f\x77\x16\x8a\xfd\x67\x02\x12\x32\x3e\x3b\x69\x5f\x15\x45\xe8\xf8\x3c\xa8\xc3\x12\x83\x0a\xb5\xaa\x86\x8a\x02\x3d\x34\x03\xfc\x2c\x83\x5f\x2a\x38\x4e\x0a\xce\x8f\x1f\x44\xf2\xcd\x13\x86\x23\x5b\x7d\x3d\xe9\x2f\x18\xa2\x8d\x8a\x58\xbc\x9d\xc0\x69\x04\x9a\xf3\x70\x40\x7c\x4a\xdf\x24\x54\xa5\x4f\xf3\xcf\xf1\x3a\x4e\xc0\xdb\x57\xe9\x29\xa9\xe4\x13\x5b\xf2\xb1\x13\xc0\x64\xe3\xf1\xa0\x0e\x65\xab\x63\x0e\xbf\x16\xbe\x28\x43\xec\x9f\x1e\xf8\x68\x77\xd1\x2c\x8b\x2a\xc8\x68\x80\x74\xb4\x07\x40\x21\xa1\xfa\xb3\x09\x23\x7c\x98\xd3\x9d\x6c\x3e\xc0\x64\x6c\x8e\x31\x02\xb1\xd9\x46\x13\x82\xaa\x4a\x60\xe8\x21\xc0\xa7\x8e\x11\x38\x02\xd4\x39\x82\x49\x3f\xd5\x44\x57\x67\xe6\x66\xb5\xc6\x3b\x9c\x36\x31\x38\x98\x41\x0e\xd3\x4c\xc8\xc3\x24\x28\x85\xb5\x89\x6b\x66\x22\xd5\x5b\x22\x91\x91\x13\x8b\x2a\xb9\x6b\x2b\x4d\x0c\xdc\x79\x55\x1b\x24\x62\x31\x65\xb1\x78\x52\xa1\x4c\x62\x12\x9e\x91\x97\x44\x4c\x3d\xa0\x15\xd6\xad\x09\x7a\x31\x51\x1f\x50\x20\x64\xf5\x44\xa4\x9d\xbb\x40\x7c\xc9\xa3\x5f\xcd\x27\x92\x14\xd1\x3d\xcf\x8e\x9c\x30\x47\xa1\xe3\x89\x8b\x67\xe2\xb1\x98\x96\xc2\xed\x1d\x27\x65\xcc\x63\x5e\x31\xa4\xce\x77\x49\x42\xa6\x7d\x97\x20\x3f\x38\xdd\x51\x07\x11\x08\x00\xc1\x26\x0c\x3f\xb4\xbb\x13\x08\x43\x32\x39\xd6\xb9\x55\x59\x41\x56\xb7\x88\x48\xa5\xcb\x55\xf1\xc0\xdc\xf8\x7c\x92\xd8\x3b\x61\x01\x22\xc1\xbf\x4c\xc9\xba\x7a\xdb\x37\x84\xb2\xf4\x0e\x27\x80\x89\xf6\x77\x53\xa2\xbe\x0e\xf6\x67\xe9\xc3\xbe\x55\xf3\x62\x6e\x62\xc4\x53\x52\x23\x6e\x9a\x8e\x3a\xcb\xcb\x03\x9d\xc5\x4d\x86\x5a\x2a\x40\xee\x9c\x5b\x27\x82\x14\x80\x07\xbb\x41\x29\x74\x2c\x81\x3e\x65\x48\x58\x12\x65\x16\x14\x45\x99\x45\x42\x3b\x00\x8a\x85\x0f\x4d\xe4\x0b\x3c\xf5\xcc\x6c\xd6\xc4\xe9\x3c\x97\xfa\x2b\xd7\x58\x63\x8a\xce\x14\xd5\x07\xea\xf8\xb6\x4a\x4d\x8d\x8b\x97\xb7\x22\x96\x08\xfe\x65\x2b\x72\xfc\x6f\x80\xc4\xff\x2a\x92\xf7\x77\xd2\x14\xa4\x59\x6c\xa1\x87\x85\x6d\x41\xfc\xaf\xf1\x1e\xff\x67\x2b\xb1\xcb\xbc\xbc\x15\xd3\x6d\x5f\x6b\x67\xfe\x68\x93\x66\x29\xda\xde\x61\xcd\x62\xb4\xbd\x43\x99\xff\x35\x7e\x7f\x27\x19\x87\x52\x2f\xb2\xd9\xf7\x6d\x85\x52\x36\xbd\x96\x24\x62\x1a\x41\x88\x4e\x3b\x75\x9e\x83\x09\x89\xb0\x17\xcb\xec\x5b\x75\x64\xb5\xbe\x85\x4c\xaf\x6f\xf9\xe7\x07\xd3\xf4\xce\xa0\x36\x71\xbf\x7a\xb5\x89\x8b\x6f\x79\xc2\x24\x28\x0a\xf8\x2a\x01\x9c\x7d\xc7\x44\x80\x1c\x5a\x2e\x4c\x82\x6f\x1e\xfc\x2d\x14\x08\xc6\x40\x9a\x92\xca\x55\xc2\x08\x94\x53\xf0\x2d\x09\x7e\x39\x39\xe4\x19\x2a\x98\xfc\x4e\x4e\x96\x26\x3f\x35\x21\xad\xe7\xd6\xb0\xcb\x57\xe2\x9b\x15\xd0\xe3\xb7\xc9\x9e\x7a\x34\xb6\x79\xbe\x77\x77\x66\x9b\x19\xf0\x76\x22\xed\xe3\x63\xdb\x3b\x51\x76\x1f\x1e\x3f\x52\xfb\x06\x94\xf9\x7e\x9e\xb3\x5c\xb4\xd0\x0b\x82\xdc\xae\x2e\x3d\xa1\x3b\x3a\x67\x66\x43\x87\xc3\x0e\xf6\x73\x38\xf4\x10\x78\x58\x87\x91\x10\xd8\x9e\x10\xa4\x2c\x44\xb0\x37\xa9\xf2\xae\x2f\xed\x49\x95\x77\x7c\x49\xd1\xca\xe0\xa4\xca\x6f\x27\x90\x71\x55\xe2\x8e\x4a\xdc\x9d\x4f\xdc\x48\x7e\xf4\x3a\x71\x2f\xec\xf7\x6d\x39\x53\x42\xc5\x53\xb4\xac\x6b\x58\x28\x90\xec\xc2\x88\x99\x0b\xa7\xcd\x13\x3d\x2a\x37\x4f\xd4\x7b\x61\x13\xf1\x64\x22\x9e\x74\x44\xb6\xef\x14\xeb\x65\x96\x5d\x69\x69\x83\x3c\xf3\xb9\x4f\x35\xf8\x34\x97\xf7\x12\x2f\x30\x75\x58\xc1\xcd\xeb\x91\xbc\xf4\x71\xac\x4c\x4f\xdd\xe4\xac\x5c\xd4\x5a\xa7\xac\x7d\xea\xd2\xd9\x23\x39\xae\x32\x79\x43\x9d\x63\xd4\x01\x6a\x7d\x5f\xb5\x38\x7a\x42\xb4\x4e\xb5\xf7\x7d\x74\x42\xeb\xf3\xd3\x84\x9a\xc7\xba\xf0\x21\x24\x5b\xb7\xd2\xb5\x46\x37\x2b\x24\xca\xa7\x41\x02\xd7\x2d\x27\x7d\x3d\xa1\x0b\xbd\x6f\x7e\xa4\x37\xb9\x2e\x24\x3f\x4d\xf6\x6a\xf8\xac\xfd\x07\xa9\xf6\x99\xe4\xbd\x88\xba\x76\xcd\x55\x8f\x8a\xf6\xaf\xa5\x78\x0b\xe4\xc4\xfe\xfb\xcb\x9f\xc7\xbb\xac\xde\x19\xf6\xec\xcf\x5f\x8e\x77\x59\xbb\x91\x0c\x07\xa1\x0d\x32\x75\x3f\xf4\x3b\x49\x60\x83\x88\xdd\x6e\xb4\x5a\x0d\xf3\x9d\xab\xa1\x93\x6a\xd6\x6b\x4f\xd1\xbc\x9f\xef\x0c\xec\x37\x58\x73\x7b\xbe\x4b\xfa\x21\x76\xdb\x1d\x21\x84\x5f\xbb\x70\xe9\x9b\x2f\xea\x92\xf8\x35\x4b\xa9\xc6\xbe\xa8\xa7\x4a\xeb\x11\x6a\xb5\xa2\xd0\xb3\x36\x48\xdf\x2e\xff\x71\x9e\x8c\x64\xab\x11\xac\xa9\xe7\x4e\xf8\x6c\xb9\x91\xf8\xbd\xb0\x1d\x26\x03\x7b\x6d\xe3\x8f\xa2\x2c\xfe\xb1\xc1\xff\xa0\xce\xcc\x17\xe5\x99\x27\xf6\xaf\x65\xcd\x73\x17\x4c\x6d\xfc\x16\x4b\x1e\x89\xa9\xf0\x2d\x2f\x9b\x74\x4e\xab\x79\x6b\x82\x17\x6e\xa9\x8c\x26\xf7\x0e\x3d\x97\x78\x54\x08\x31\xae\xef\xc9\x5a\x18\xba\xc4\x62\x1e\xb5\x25\x46\x1a\xbe\x35\xbe\x1d\x34\x25\x77\xe1\xee\xc9\x5a\xd9\xb5\x65\xcd\x72\x33\xf4\x07\x79\x3b\x65\x75\x89\x12\xbe\x20\xb2\xe4\xd3\xff\x3d\xa9\x12\x2f\xd3\xd2\x4e\xaf\xfe\x88\x2c\x79\xf9\x13\xb5\xc3\x65\x0c\xbe\x90\x25\xdf\xf1\x84\xc2\xe0\xff\xaf\xf0\x32\x34\xb0\xe4\xf8\x7b\x19\x32\x75\x94\xa6\xc2\x45\xaf\xe4\xe7\x3b\xff\xd9\x6a\xe5\xb1\x28\xaf\x61\xf5\x22\x80\xe7\xfd\xe6\xfb\xfb\x71\xb3\x50\x58\x3f\x6f\x92\xe7\x04\x36\x8e\xb2\xf6\xd3\x77\x85\xa8\x46\xf3\x57\xc8\x79\x3c\xb0\x6d\x54\x38\x98\xdc\xab\x1d\x9e\xb2\xf1\x58\xb2\xa7\xbe\x64\x97\x03\xc9\x86\xa7\xae\x3d\x3c\x55\x1a\x2a\xb3\x47\x72\xa6\x74\xaa\xce\xba\xe4\xac\x3a\xef\x7a\x59\x49\x86\x38\xcb\x0e\x4f\xe9\x7e\xb3\x50\x38\x6f\x92\xb2\x45\x0b\x05\x0b\xaa\xbd\xf5\xe2\xea\x50\xf3\xc5\x7d\x7f\x27\xe7\xc6\x9c\xe3\xb4\xa9\x55\xff\x5f\xd6\xd3\xeb\xab\x17\x5a\x7b\xf1\xb4\xa9\x19\x65\x52\x19\xb7\xc1\x34\x33\x3c\x02\x05\xad\x8b\xc3\xd3\xf7\xf7\xd6\x21\x46\xa5\x5d\x03\x08\x38\x3c\x55\x7a\xf9\x2f\xb5\x4e\xa0\xae\x2e\x1d\x20\x68\x67\xe7\x9f\x94\x14\xe2\xe5\x1e\x0a\xfb\x42\x15\xe0\x18\xaa\xd2\x0a\x7e\x18\x90\xc5\x39\x73\xbe\xda\xa1\x04\x5c\x07\x52\x5a\x7d\x3a\x63\x96\xae\xb0\x19\xcd\x09\x28\xe7\xd5\xec\xf9\x80\xe4\x11\x2c\x85\x55\xd8\x83\x47\x01\x2c\x7d\x1a\x6d\xee\xd4\xf4\x48\x3f\x22\xc6\x26\xdb\x87\x94\x37\x12\x9f\x47\x43\xab\x64\x3d\x72\x86\x2d\x31\x6f\xe4\xea\x6c\xde\x9c\x95\x69\xe7\x27\x92\x63\x51\x1b\xce\x51\x6c\xe4\x7a\xdb\x45\xea\xf2\x6a\x78\x95\x37\x2a\xf4\xfe\x7e\x7e\xc5\xef\xf1\xc5\x00\xf4\x84\x8b\x2a\x1b\x5e\x51\x27\xb8\x22\xc1\x8b\x5c\xf1\x1a\x03\x88\xbe\xa8\x92\x64\xd1\xfb\xf6\x77\x7d\x62\xd7\xab\xa4\xc8\x53\xc3\xe2\x9e\x90\xef\xef\xd7\xf8\x30\xfd\xb2\xea\x3c\x92\xef\x55\xd6\xab\x50\xe7\x41\x7c\xd7\x96\xbc\x9a\x2f\xc6\x26\xd7\x6d\x5b\x8a\xb2\x95\xa1\xad\x54\x89\xa9\xdb\xcb\xea\xfb\x3b\xb9\xac\x8a\xe3\xb1\x5c\x6b\x24\x6b\xa1\x44\x05\xe7\xe1\x69\x76\xbf\x71\x59\x9d\x3d\xf0\xeb\x33\xb1\x5e\x76\x1e\xf8\xf3\xd2\xaa\xf8\xa2\x56\xf1\x86\x24\x94\x3f\x93\xe1\xa9\xbe\xdd\xfa\xd5\x57\x46\x69\x8f\xa3\xb9\xb9\xfe\x3b\xd4\xf5\x71\xb4\xa4\x11\x7a\xed\xbd\xbf\x93\x94\xaf\x5a\x35\x70\xc9\xc9\x29\x7d\x7f\xbf\xa6\xce\x41\x8b\xfc\x6a\x42\xaf\x15\x22\xf5\x1f\x07\xe4\x58\xe6\xc0\x58\x12\xca\xf6\x2b\x46\x57\x69\x74\x4e\xa9\x03\x0c\x9a\xb4\x40\x58\xb7\x25\xfd\xb0\xde\x69\x05\x61\x4f\xe8\x52\xd2\x53\x0a\x49\xa8\x53\xb9\x24\x92\x9d\x9c\x32\x13\x87\x7b\xb9\x13\x2f\xcf\x2c\x52\x7e\xe2\x65\xdd\x24\xd3\x19\x4f\x67\x08\x69\x26\x07\x20\xe9\x7b\xac\x55\xc8\xff\x5a\x88\xb8\x3c\x52\x11\xc1\x35\xae\x26\x40\x2b\xd5\xf3\x8d\x54\x8a\x16\x07\xcd\x42\x61\x2e\x4b\x6d\xda\x67\x87\xa7\xec\xe8\xd4\x58\x4c\x69\xa4\xde\x95\xcc\x34\x20\x09\x55\xe5\x78\x78\x2a\x30\x35\x66\x03\xab\x0d\x99\x6a\xc4\x48\xe7\xd8\x1c\x47\x29\x6d\xa2\xd1\xd0\x68\x46\x41\x2d\x7d\x6f\x60\x8d\xa0\x41\xef\x70\x89\xf7\xb3\x70\x71\x88\x98\x1a\xc6\xb1\x92\x97\x56\xe6\x71\x2a\xb5\xd5\x4c\x3a\x51\x23\x75\x5d\xf2\xb0\x25\x81\xcf\x53\x3c\x65\x23\x94\x47\x9d\x5e\x1b\xa5\x63\x7d\x36\xa7\x41\xac\xb7\x2f\x61\xcc\xb7\x24\x4a\xbd\x2d\x29\xd6\x2d\x3a\x5b\xb0\x54\xf7\x7d\xe5\x20\xfe\x98\x42\x60\x72\x74\x2e\x36\xd0\x20\x47\xa9\x91\x74\x87\x83\x12\x86\x37\xa0\xe9\x5f\xfe\x5a\xb6\xf0\x09\x5d\xce\xc9\xdd\x65\x40\xbf\x99\xeb\x76\xb8\x82\xab\x9e\xb7\x7e\xa5\x27\x0e\x23\x68\x57\xda\x73\x52\x32\x9b\x3b\x35\xf4\x00\x57\xa1\x10\x8f\x09\x86\xd8\x35\x9d\x39\xfb\xcd\xbd\x87\x01\x91\xac\x6c\x51\x5b\x6a\x47\x82\xc1\x75\x3e\x17\x94\x64\x06\xcd\x29\x1f\x79\x59\x6f\x89\xfb\x69\xcf\x53\x01\x3d\x13\x98\xb1\x76\x96\xea\xff\x42\xfb\xa3\x25\xfc\xc6\xbc\x56\xd6\xce\x5f\xd9\xdc\x3f\xbf\x4a\x34\x5f\x52\xee\x71\xbd\x50\xb1\xd3\xfe\x5e\x3c\xce\x08\xd0\x29\xa9\x8e\x3d\x4a\xdb\xc1\x10\xc2\xa4\x3a\x34\x51\x76\xb2\xe7\x0f\xb2\x4d\xd5\xbd\xbf\x93\x3c\xce\x6b\xca\x1e\xb4\x68\xdc\x4b\xa0\x5e\x98\x91\x7b\x1f\x00\xb0\x1a\xc3\x12\x51\xd7\xca\x30\x5e\xb5\xb1\x6c\x0a\x56\xd5\x45\xb6\x02\x5d\x55\x33\xe1\x74\x7d\x5d\xaa\x36\x92\x86\xf1\x75\x71\x3d\xf7\x25\xf9\xb5\x37\x1b\xc9\xf9\xb7\x76\xf3\xf4\x3b\xb9\xc3\xc3\xe6\x4b\xae\x4a\xae\x61\xce\x7f\x7c\x9d\xcf\x9b\xf5\x20\xfc\xad\x3d\x7a\xa9\x11\x1f\xa0\x94\xa2\xdb\xf8\x93\x65\xbb\xef\xab\x0a\x90\xd4\xc9\x93\x62\x26\x04\xc5\x71\xec\xad\x7c\x20\x38\x87\xcb\xb4\xbd\x6d\xa8\xda\x9b\xeb\x04\xd7\x48\xcc\x41\xfb\xa3\x3d\x21\x4e\xb1\x55\x42\xf7\x08\xde\x4b\xce\x4d\xc7\x32\x6d\x19\x21\xa9\x9d\x6b\x7c\x4f\x8d\x08\x68\xf8\x34\x81\xbe\xdd\x90\x38\xd9\x79\x85\x42\xe5\x92\x78\xf3\xf3\xf6\x03\xf7\x82\x8f\x1e\x08\x5d\x7b\xea\x8c\x6e\xf8\xc1\xed\x64\x4a\xe6\xaa\x75\x63\xdd\x2c\x1c\xff\xb6\xae\xd8\xe9\x1c\xbb\xb4\xac\x38\x69\xf5\x91\x0f\xd7\x2e\x6d\x9d\xa9\xd2\x36\x26\xd1\xae\xcf\xde\xdf\xf3\xc9\x27\x73\xc9\x99\x9a\x06\xcc\xd0\xe8\x48\x63\x3d\xb7\x2d\x73\x03\xe4\x72\xbe\x9f\x4c\x73\x9d\x61\x3d\x5d\x49\xd2\x3a\x38\xac\x98\x47\xa5\xa3\xf3\x62\xef\x00\x92\xcc\x9c\x9f\xaf\xab\xba\xc9\x7a\xda\x0f\x6e\x03\x17\x7b\x41\x47\xce\x0d\xad\x34\xc1\xfb\x7b\xd6\xb6\x29\x5f\xab\xc7\x67\x3a\x04\xaf\xb5\xf8\x83\x51\x97\xea\xac\x2f\x18\x12\xd3\x7f\x0f\x7b\x52\x78\x7b\x9e\x7d\xde\xd3\xda\xe5\xad\x48\xec\x1e\x7f\x46\x91\xe8\xe4\x5a\x0a\xcb\x99\x74\xc9\xf5\x82\xe8\x9d\x6a\xfa\x80\xf8\x84\xf2\x51\x20\x82\xf7\xf7\xcd\xc3\x22\x39\xb9\x96\xc5\x22\xad\x35\x7d\x97\x7c\xfe\x42\x8b\xa3\x06\x49\x3f\x1c\xaf\xc1\xff\xcf\x97\xad\x96\x27\xfd\x66\xff\xff\xa0\x7b\xce\x01\xc4\xdb\xcc\xe8\x5f\x6a\x62\xb5\xda\x31\xfa\xa8\x35\xcf\xfa\x23\x34\x77\x42\x65\x6d\xea\xbb\x85\xc2\x3a\xfe\xa2\x99\xc1\xe0\x59\x92\x90\x45\x4c\xa2\xb1\x41\x1c\x24\x73\xe8\x6b\x81\x2b\x4e\xaf\x25\x09\x98\x47\x99\x4a\x6c\x6a\x80\x3d\x76\x65\x31\x40\xdd\xf6\xc1\xa9\x24\x21\x52\x4c\xd9\xdb\xa0\xd1\x0e\x3b\xc3\x81\xad\x2b\x86\xfd\x0c\x24\xea\x25\x39\xdd\x53\x49\x3c\x76\x86\xd8\x24\x2a\xaf\xeb\x8b\xbc\x86\x6f\x07\xec\x31\xc0\xcb\x73\xea\xdc\x2e\x57\x1d\x9a\xf7\x24\x92\x3f\x06\xb8\x6e\x3f\x06\xb2\x76\xa5\x55\x23\x1b\x7e\xa1\xf0\x03\x35\xa6\x7c\xb6\x5e\xc6\xd9\x29\x9b\x49\xcf\xb2\xdd\x9e\x1e\x8e\xb9\x0e\x02\xb9\x50\x4b\xc5\x2f\x14\x7c\xe2\xe5\xcf\xce\x4e\xcd\xd9\xd9\x62\x2e\xdf\x64\xb3\xa8\xe3\xa1\x21\x54\xf5\x00\x39\x67\x0a\x35\x87\xe6\x87\xee\x45\x0b\x55\x2a\x71\x63\xb3\xa7\x25\xfb\xa5\x48\x7b\x09\x22\xa2\x06\x9d\x39\xce\x2b\x1e\xe5\xf2\xb8\xd3\x89\x5b\x61\xa1\x30\xf7\xc9\x5b\x1d\x19\x84\xbd\xd5\x50\x1e\x8e\x64\xeb\x37\x51\x7c\xd4\xe8\x0f\x65\xab\x31\xc5\xe7\x94\x85\x02\xf9\x0f\x53\xe6\x87\x1b\xc4\x92\xb4\x16\x6a\x96\x8b\x2d\xf1\xe9\x13\xbe\xeb\xe9\x3c\x4a\xb1\xe1\x75\x7a\x41\xd8\xb3\xd7\x2c\x67\xad\x2b\x83\xa0\x91\xc4\x18\x6e\xcb\x5e\xdc\x48\x20\xb8\xc1\xba\xff\x51\xba\x35\xf5\x72\x65\x6d\x83\xbd\x40\xfa\xb8\x17\x86\x09\x9a\x65\xd9\x60\xbd\x14\x70\xd2\xeb\xb4\x37\x58\x3f\xfd\xfe\xd9\xd9\x60\x03\xf8\x6a\xcb\xe7\x4e\xef\x67\xc3\x6f\xf6\x37\xd8\x10\x01\x8d\x24\x05\x8c\x00\xd0\x0b\x03\x8d\xee\x55\x7f\x2a\x64\x63\xfd\x05\xa8\x26\x10\x9e\x84\xad\x56\xe7\x55\xa7\x9d\x66\x10\x95\x7c\x3f\x03\xfc\xec\x6c\xe4\x7a\xa5\xb4\xf2\x9a\x76\x4b\x07\x06\xe9\x2b\xb0\x1b\xa3\x71\xff\x22\x8d\xe1\x07\x79\x22\xde\xa4\x67\xbf\x1e\x65\xf6\x0d\x03\xed\x48\xfe\x7e\x9f\xb5\x7c\xfb\x9a\x79\x9d\x56\x60\xaf\x97\xd9\x4f\x1f\xfe\xde\x85\xd9\xfb\xb4\xe4\x59\x7e\x98\xfb\xe2\xe8\xdf\x72\x0f\xeb\xcb\xb9\xad\xff\xb8\xec\x41\x5d\x8a\x50\xbf\xd0\x88\xe6\xed\x4a\xe7\x9d\xc0\x8e\x1e\x44\xcd\x9d\x3d\x12\x69\x65\x8f\xc2\x0e\x1e\xa5\x30\x0f\x85\xf0\x75\xd0\xf3\x01\xd3\x0f\x86\xee\xf7\xd9\x10\x3d\x91\xb3\xc3\xc5\x44\x1b\xff\x13\xfd\x05\xff\x36\x4c\xda\xd6\x01\xa4\xdd\x99\x51\x76\x94\x4b\xab\x23\x37\x53\x44\xc7\xcb\x91\xaa\x14\xc8\x79\xb2\x58\x4a\x53\x3d\xfb\xfa\xcb\x14\xb2\xf1\x3f\xfe\x97\xcf\x9f\xcb\xd6\x86\x41\x77\xba\x4c\xd7\x9f\x5f\xfe\xfe\x33\x0c\x53\xba\xd2\xa2\x9d\x07\x21\x2d\xb5\x81\x3e\x95\xa2\x21\x61\x49\xf3\xd4\xef\xc1\x5f\xea\xf7\x66\xaa\x7e\x5f\x03\x61\x81\xf0\xfc\x64\xf6\xd9\x37\x27\x26\x74\x51\x35\xa1\xce\x8d\xd8\xf9\x0b\x92\x35\xff\xc2\xd4\xed\xcd\x34\xcd\xb9\x09\x1d\xbe\x9a\x90\x7e\xb3\x0e\xf9\xa2\x8f\xc4\x98\x53\x89\xde\x8c\x06\xcb\x4f\x71\x4e\xa5\xc0\xb8\xe4\xc3\xbc\x1d\x0f\x6f\xcc\x57\x3c\xe3\xe9\x78\x90\xf7\xd3\x82\x4c\x99\x7b\xcd\xf5\x1a\x98\x11\xf1\xf0\x64\x86\x04\x9a\x35\x92\xc2\xb3\xd2\xdd\x7c\x4e\x6c\xbc\x38\x2f\x14\x7c\x6d\xef\xf9\x52\x79\xec\x8d\xaf\x49\x4d\xc7\xb9\xac\x26\x5d\xe6\xa3\x29\x4c\x9f\x4f\x77\xf3\x86\x2d\x59\x6d\xd4\x93\xec\xec\x45\xb2\xfe\x89\xde\xf1\x06\x7d\x58\x25\xf4\x8b\xf4\x5c\xca\xbe\xd2\xfd\xe5\x7e\x3e\x5e\x47\xd6\x7e\x4c\x5d\x02\xab\x91\x96\xa9\x2e\xce\x85\x64\xbe\x45\x72\x1b\x87\xee\xc2\x2d\x3f\xa6\x3b\xf8\x4b\x2b\x41\x94\x53\x51\xf9\x66\x9a\x82\x94\x94\xf9\x74\xbf\x5c\x85\x87\xaf\x50\x85\xe9\x04\x13\x58\x79\xbd\xe2\xd1\x43\xed\xd0\x25\x6f\xc7\xa1\xed\xb1\x5e\xd3\xf6\xf5\x98\x0d\x66\xb0\x95\xad\xff\x3d\xef\xca\x70\x71\x23\x91\x55\x76\xde\x72\x94\x19\xbf\xd8\x63\x52\x33\x52\x74\xc5\x93\xbc\xbc\xbd\xa1\x15\x76\x79\x73\x8d\x56\xd5\x1e\x58\x72\xf6\x73\xed\xb4\x9c\x9c\x29\xde\x04\x95\xeb\x3d\xfa\x2f\x06\x74\xe9\x7f\x68\x41\x17\xdf\x3b\x2c\x92\x25\x79\xdd\x27\x1e\x3b\x3f\x66\x93\x41\xfa\xee\x47\xe6\x55\xf5\x7e\x46\x0b\xef\x22\xf0\x52\x1c\x2f\x97\x58\xc8\x3c\x7d\xc7\xbb\x80\x97\x69\x05\x62\xfe\xe7\xee\x96\x97\xaa\xc2\xdc\x6c\xef\x18\x4d\x99\x17\xb9\xbd\xe3\x48\xde\x09\x49\x54\xe2\xbb\x2c\x86\x3f\x1e\x3b\x78\x04\x69\xc9\xf1\x4a\xe2\xe0\x51\xf2\x2b\xcf\x31\x68\xfe\xd9\x42\x1d\xe9\x85\xe4\x87\x69\xf2\x9d\xad\x43\x95\x21\x14\xfc\xaf\xdd\x2d\x2f\xb5\xf2\xd4\x14\x96\xd3\xfc\xaa\x67\xdc\xda\x85\xeb\x34\x8d\x8d\xa7\x96\x30\xd0\xa6\xcb\x12\xd1\xe2\xbd\x26\xeb\x8a\x50\x0f\xb3\x16\xbe\x5d\xe9\xa7\xdf\x09\x65\xca\xfe\x7f\xf7\x92\x0d\x45\x54\x3c\x7e\x26\x5d\x10\x14\x47\x22\x2e\x9e\xa8\xb0\x93\xd4\xce\xa6\x2e\x19\xb2\x11\x75\x12\x3e\x8e\x48\xc4\x62\xe6\x31\x8f\x75\x8b\xff\x58\xac\x0f\x7f\x40\x98\xd2\xb9\xfb\x2c\xa4\x8e\xce\x8d\xe1\x84\x07\x72\x21\x73\xc8\x42\x95\x0f\x31\x40\x03\x24\x35\x0f\x3d\xa6\x48\xa5\x6e\xfc\x69\x6e\xc2\x6d\xd5\x4e\xdc\x19\x9e\x86\x1a\xdd\x84\x9b\x13\xbd\x11\xb8\xa8\x52\x0d\x40\x55\xbc\xb8\xa4\xaa\xf5\x33\xb6\x8e\xe4\xe7\x0d\x93\x9e\x59\x2c\x34\x46\x9d\x42\xd6\x38\x86\xff\x7a\x3d\x06\x39\x96\x69\x6c\x0a\x4b\x71\x35\x96\x8b\xea\xbf\x60\x71\x72\xf5\x7f\x33\x65\x5d\xc1\xff\xde\xf2\x58\x5f\x40\x33\xb3\xa1\xd0\x13\xc4\x56\x8b\x8d\x84\xde\x72\x79\x25\x3d\xf9\xd2\xed\x21\x9b\x9a\x86\x38\x30\x81\x23\x61\x16\x6e\x76\xa5\x7b\x4c\xf9\x4f\xe8\x32\x27\x92\x1c\xb1\x2b\x65\xf4\x4b\x75\x05\x31\xcc\xba\x40\x25\x6d\xde\xe6\xd6\xa8\x68\x4a\x60\xb7\xc2\x12\xa2\xf9\xbf\x2d\x76\x27\x6e\xf7\xba\x76\x9f\x25\xe2\x76\x6f\x6a\x1f\x38\x81\x6a\xba\x0a\xbb\xa3\x4e\xa8\x9a\x0e\xc3\xaa\xe1\x41\xc6\xc9\x92\x78\xb9\x24\x9e\x6e\x5d\x4c\x71\xab\xaf\x17\x0e\x5f\x0b\x05\x92\x08\x1d\xae\xa1\xb6\x62\x73\xbb\x45\xd1\xd6\x5d\x56\x52\xe9\x6a\x7b\x87\xb2\xac\xb4\xd2\xd5\xf6\xa7\x1d\xca\xee\x44\xe3\x98\xed\xfc\x6d\x7d\xad\xbc\xbf\xff\x63\x7d\xab\xec\x91\x3b\xd1\x3f\x61\x15\x61\x51\xfb\x1f\xeb\xab\xa8\x14\x0a\x3b\x5f\x34\x7c\xff\x82\x55\x44\x60\x74\xdd\x6e\xa8\x4d\x6e\x85\x79\xa5\xa6\x40\xa5\x80\x42\x92\xd2\x2d\x0b\x8a\xe2\x96\x85\x45\x55\x89\x57\xdb\x7f\x52\xdd\xb0\x09\xab\xb0\x10\xb5\xed\xef\xa0\x31\x8f\xa0\x19\x67\xd8\x0b\x0f\x40\xca\x80\x61\x88\x5f\x53\x10\x2b\xe0\x2b\x9b\x4e\xcd\xca\xa5\x57\x38\x1d\xd5\xfc\x4b\x78\x8e\x59\x28\x52\xc9\x49\x7b\x66\xeb\xaf\x70\x5c\x04\x2b\x0b\x1f\xa7\x59\xd0\x10\x52\x7f\xf9\x88\x09\x8a\xfc\x9d\x21\x9b\xdb\x74\x5d\xcb\xd6\xb0\x87\x17\x5c\xc3\xd8\xeb\x72\x9c\x39\xc9\x4c\x57\x1c\xcf\xca\x4f\xf6\x68\xba\x07\x7a\x25\x91\xd0\x49\x31\xcc\x8c\x7e\x9f\xcf\x4a\xdc\xda\xc9\xae\x0f\x75\xa5\xfb\xac\x0c\xe0\xbc\x75\xd6\x39\x9c\xba\x84\x4c\xe5\xbd\x73\xb3\xe5\x17\x0f\x9e\x09\xf9\xfc\xc5\x2a\xc1\x27\xdd\xde\x81\x09\xe1\xf3\x17\x2b\x8f\xc5\xb7\x32\xf5\xcd\x4c\x0d\xb5\xf9\x17\xea\x9c\xc6\xa8\x85\x01\x13\x70\x08\x0b\x81\xdc\xde\x51\xca\x6b\x37\x5b\x92\x5f\x9c\x7f\x84\x9d\xc5\x66\xfe\xc5\x21\xde\xd4\x5f\x9f\xe1\xa3\x25\x8e\x9f\x8d\x7a\xd2\x89\x0e\x25\x0a\xd6\x84\xa4\x27\x3a\x14\x89\x83\x67\x12\xa5\x18\xbb\x82\x5b\x7f\xe1\x68\xc7\xa4\x5d\x80\x9c\xe8\x50\xa4\xc7\xb3\x13\xa9\x01\x55\x6c\xb1\xb0\x18\x53\x27\xe2\x07\x5d\x12\x14\xfb\x2c\x2c\x76\x59\x50\x4a\x8a\x7d\xe0\xa3\xd4\x2c\x76\xb7\x77\xe0\x1b\xc2\x26\x55\x29\x29\xe9\xd8\x92\x8a\xed\xb3\xb0\xd4\x65\x29\xae\x96\x99\x1f\x80\x23\x87\xc4\x42\xf2\xf6\x26\xdd\xf3\xf9\x95\x4f\x62\x6a\xab\x6f\xe1\xc3\x8a\x07\x5d\xfa\xe1\x09\xaf\xe6\x42\x3d\xd5\xfd\x85\xf5\xe0\xc3\x88\x80\x38\x66\x31\x8f\x49\x7e\xc3\x3c\x3d\xc9\x49\xd8\x7a\xb0\x98\x52\xc7\x87\xd1\x10\x81\x1c\xcd\x62\xf8\xea\x84\x24\x80\x55\x2b\x84\x3f\x2d\x90\x96\x11\x0e\x0b\xaa\xe4\x3f\xa1\xf6\xf2\x8e\x6f\xce\x1e\x17\xfd\xb6\xff\x6e\xaf\x34\xa9\x18\x6f\xd3\xaf\xe3\xd4\x1e\xfb\xbd\x9f\x06\x0f\x5f\xd3\xe0\xe8\x31\x0d\x4e\x9a\x69\xf0\x54\x1a\xd3\x1b\x1d\x4f\x94\x2d\x1d\x7e\xde\xd4\x56\xc5\xb4\x65\x8d\x73\xfd\xb4\xfe\x4c\xff\x56\x35\xfc\x52\x7f\x7f\xd7\xbf\xf7\x1a\x7e\xac\xbf\xa7\x95\xdc\xbe\x67\xdc\x15\xeb\x1a\xff\xf4\x51\x58\xb3\x07\x71\xf6\xa8\x1d\xbb\xdf\x4c\xc5\xce\x87\x52\xf7\x7a\x76\x33\x05\x22\x38\xcb\x90\xe1\x70\xff\x37\x51\x7e\xb5\x38\x9e\x43\xda\xf1\x96\x91\xfe\x9b\x8c\x5f\x5f\xe1\xcf\xf2\x79\x53\xcb\xf8\xfd\x70\x80\xb6\x97\xfa\xab\x45\xfd\x71\x57\xe8\x5f\xbd\x44\xdf\xfb\xb5\x0b\x77\x1d\x15\x02\x34\x64\xd2\x44\x88\x8f\x90\xf5\xce\xb3\x16\xfd\x9a\xe9\xf4\x7a\xef\x9b\x4e\x31\x7a\x4c\xdf\xac\x37\x85\xbf\x42\x78\x2e\x2b\x55\x03\xd4\x92\xac\x5d\x33\x59\xb3\x5c\x76\xed\x52\xc7\x60\x3d\x7c\x65\x32\xbd\xea\x00\x21\x7b\xbe\x2e\xd2\x8e\x19\x59\x0b\xc7\x4c\x6a\x4e\xc3\xd5\x0b\xe6\x17\x9f\x32\x1d\x7e\x91\xdb\x1e\xac\x11\x2f\xcb\x26\x3c\x35\x6a\x7a\xfe\x98\xbd\x07\x4f\x5d\xab\x41\x57\x94\x5f\xb3\x2a\x71\xa4\x59\xae\xf5\xf1\xe9\xeb\xb8\x26\x5d\xc7\x83\x9d\xa0\xa9\x26\xfc\x3e\xd1\xe6\x2c\xef\x7d\xd8\xf5\xe8\x6a\x49\x83\xcf\x9b\x8b\xb7\xdf\x8f\xa9\xd6\x18\x9e\xfb\xa7\xcf\xc8\xb1\x54\x16\x88\x32\x0b\x05\x1a\x31\x2d\x7f\xf5\xb3\xe3\x45\xf5\xac\xa0\x5e\x9b\x06\xc8\xf0\x16\x32\xea\xa3\x06\x5b\x5a\x09\x11\x65\x81\xc8\xaa\x21\xa2\xce\x3a\xf1\xbf\xe6\xe3\xb7\xf2\xb1\xd4\x51\xfc\xc5\x02\x6b\x37\x60\x61\xb1\x0c\x33\xa8\xfa\x2a\x96\x41\x6a\x88\xbf\x89\x66\xa1\x40\x22\x11\xb3\xb0\x58\xa4\x4e\x13\x95\xf5\x48\x24\x9a\x2c\x28\x16\xe9\x2c\x4a\xf3\x52\x27\x2a\x89\x3f\x9d\xa6\xb8\x6b\x12\xea\x34\x61\x5e\x93\x1c\x2d\xe8\xa9\xc9\xa1\x11\x11\x2b\xd5\x0f\x6b\x89\x26\x7f\x26\x77\x7d\xf6\xd6\x1f\x4c\x5a\xa1\xdd\x81\xc5\x3b\x6c\xb5\xcc\x71\xd4\x0e\x7e\xf5\xbb\xd2\x87\x2f\x8b\xc9\x56\x23\x4e\xec\xc6\xf1\x0c\xe6\x7a\xc8\x7a\x7d\xa1\xcd\xbb\x37\x61\x26\x6b\xb1\x24\x6f\xd7\xbf\xe6\xb2\xae\xb0\x58\x5f\x58\x4e\xff\x6b\xe0\xf4\x4d\x43\x0e\x31\x6b\xf0\x3d\x57\xea\x4c\x63\x48\xd8\x30\xc3\x30\x12\x96\x33\xfa\x1a\x3a\x23\x93\x71\x8a\x19\x7f\x5c\x98\x8c\xdd\x47\x59\x8c\x8a\x07\xe7\x33\xea\xc4\xb5\x6e\xb1\xe8\x8a\xa9\x42\x33\x64\x53\x3a\x9b\x35\xd5\xec\x9a\xb0\x4f\x2d\x8a\x2f\xe0\x71\xe2\xdf\x8a\xa0\x32\x60\xf2\x71\xa4\x9e\x8e\xa0\x40\x6d\x44\x17\x2d\xe8\x36\x05\xd4\x56\x2d\x74\x71\x41\x92\x16\x89\x6b\xa1\xcb\x22\x16\xa1\xbf\x90\x45\xb9\x62\xfa\x58\x2c\xa6\x33\x5a\xda\x47\x71\xb0\xa5\x83\xa8\x4c\x67\xf8\xf4\xa1\xc9\xa7\x68\x40\x58\x42\xf0\xd7\x0b\x8a\x0d\x10\xbc\x39\x11\x12\x7a\x72\xe8\xa2\xb2\xe6\xe1\x2b\x6c\x49\xa0\x1f\x36\x79\xaf\x4b\xca\x5f\x93\xbd\xa4\x54\xb6\xff\x84\xc5\x66\x4a\x99\xf5\x35\x29\x14\x9a\xfc\xe9\x9e\xb4\x20\xf3\x89\x24\xd8\x6d\x43\x97\x49\xe8\xf3\xa1\x71\x1c\x69\x74\x3b\xa6\x15\xa3\x17\x28\xf9\x71\xa5\x50\x08\x2c\xd2\x64\x00\x66\xf0\xcd\x24\xbf\xbf\xcf\x12\x7f\xcf\x25\xbe\xcc\x12\x7f\x87\x74\x97\xf0\xa7\x9a\x4b\x7c\x96\x4b\x7c\x9e\x25\x3e\x83\x74\xe7\xf0\xe7\xe1\x9e\xb2\x26\xea\xd2\xc2\x4a\x39\xa9\xd0\xd9\xd2\x15\x9e\x69\xee\xdc\xc8\xc7\xfa\x73\x8a\x45\x49\xb3\x21\xaf\x87\x69\xb6\xce\xe5\xb5\x38\x62\xeb\x03\x4f\x71\xbf\x70\x1c\xcc\x1e\x49\x6c\x19\x2f\x6c\xfa\xe8\xe9\x06\xcf\x8a\x5e\x24\xfe\x4c\x2a\xd0\x0f\x56\x79\xa8\x32\x8a\x94\xc6\xaa\x8d\xaf\xad\xda\xe8\xed\x71\x4f\xea\x3b\x89\x46\x07\x2d\x06\xb0\x48\x3c\xeb\x50\x2c\xce\x41\xc4\xd6\x5e\x78\x42\xbd\xfb\xbf\x79\x7f\x8f\xd6\xcd\x26\xf8\xfd\x3d\xd6\xe1\x49\x45\xb1\x5a\x39\xd3\xfb\x83\xca\x59\xfe\x3e\xb2\x72\x86\x04\x80\x5c\xe0\x6b\x77\x6b\x5a\x76\x17\xa1\xd9\x75\x0b\x6d\xf2\x6e\x52\x11\xb1\x21\xaf\x72\xe6\x84\xa2\x02\x64\x9c\x9d\x31\x0b\x04\x91\xe9\x80\x84\xd4\x00\x27\x67\xac\x6c\x21\xf8\xd7\x8b\x02\xd7\xee\x06\xbd\x46\x12\x13\x9f\x77\x22\x42\x29\xbb\xc6\x7f\x29\x30\x01\xa0\xeb\x84\x22\xe0\x77\x64\xf0\x28\x19\x3e\x1d\x78\xba\xcf\xe1\x1c\x3e\x4a\xb6\x03\xd0\x9b\xe9\xba\x08\xd1\x3d\xd5\xcd\x54\x84\xcc\xd7\xab\x89\xae\xaf\x2b\x48\xdb\x7b\xc4\x17\x61\x18\xee\x43\x38\x56\xe1\x29\x84\x9b\x2a\xbc\x0f\xe1\x96\x0a\xbf\x42\x38\x51\xe1\x31\x84\xbb\xe2\x01\xc2\x2f\x8f\x92\xfd\xdc\x87\x0d\x3b\x7e\x4e\x40\xba\x3a\xa0\x6c\xa8\x3e\x47\x40\xe7\x81\x76\x76\x35\xad\xac\x8b\xf0\xfd\xdd\xe7\xc7\x95\x75\x11\x41\xe0\xfe\x7e\x5d\x7c\xea\x42\xe8\x7b\x65\x5d\xc4\x10\xb8\xac\xac\x8b\x26\x04\xaa\xf7\xeb\xa2\x0f\x81\xb3\xca\xba\x68\x41\xe0\xbc\xb2\x2e\x12\x08\x3c\xdc\xaf\x8b\x21\x05\x84\xc8\xdc\x71\x45\x44\x0c\x90\x89\x2e\x03\x4c\x22\x66\x80\x47\x34\x19\x60\x11\x7d\x06\x38\x44\x0b\x84\xc7\x8a\x48\x18\xe4\x17\x43\x53\x29\x4e\xa0\x9d\xe5\xfc\x69\x59\x6c\x70\x0a\xb5\x57\xff\x9b\x04\x30\x6b\xd5\xa0\xb6\x6b\xae\x13\xe9\xc9\x7b\x47\x28\x1f\x2b\x85\x82\xf2\xf0\x25\xc4\x71\x5d\x85\xcb\x54\x88\x9f\xb8\x52\x29\xe7\x59\xda\xd7\x57\xb1\x48\xb5\x72\x70\xed\xdc\x25\x31\xb3\xa8\x19\xb2\x1a\x50\x86\x1d\x67\x54\x3b\x74\x49\x9a\x82\xb2\x20\xf7\x5d\x86\xe5\x0d\xbf\xf9\xb1\x54\xdf\xb9\x05\x5b\xed\xab\x91\x26\xdc\x5a\xa3\x4b\xe9\x23\xd2\xfc\xcf\xa8\x69\xe2\x76\x37\x57\x58\x73\xa1\x30\xf8\x56\xc4\x29\x8f\x2e\x4a\xb6\x36\xc2\x15\x3e\x6f\x89\x40\x90\x46\x5b\x4a\xab\xcc\x10\xac\x34\x16\xbf\x34\xcc\x66\x4e\xd0\x20\x1b\xfa\x1e\x68\xee\xee\x87\x9f\xca\x61\x1c\x6e\xb0\xd8\x62\xc6\x6f\x92\x7c\x21\x38\x8b\x30\xfc\x0b\x45\x53\x07\x83\xdc\x6f\x85\xb2\x87\xd6\x2f\xd5\x3c\xc3\x9f\x22\x1d\x13\x87\x83\xc3\x4e\x32\x90\x8d\x24\xec\xe9\xb8\xae\xff\xff\xea\x55\x57\x3a\xef\xb6\xac\xb9\xeb\x43\x89\xd6\x61\x85\x37\xc3\xfb\x8c\xfe\x93\x14\x1b\xda\x8d\x04\x1f\x84\xe3\xc1\x06\x1b\x00\xa8\xdf\x6a\xf8\x61\x9f\x6f\xb0\x61\xfa\x75\xdf\xe8\x37\xbc\x46\xab\x31\x98\xfc\xac\xf7\xc2\x7e\xbd\xd3\x0a\x36\x58\xdb\xd2\xb1\x1b\x2c\x81\x60\x63\x1a\x6e\xb0\x11\xe6\x41\x1f\x6e\x67\x8d\xb8\xde\x6a\xc4\xf5\xc1\x59\x67\x14\xf6\x36\xd8\x2b\x44\x75\x1b\xe1\xdd\x40\xf6\x06\xfb\x49\xdc\x0a\x37\xd8\xd8\xc0\x00\xcf\xcf\x70\x3c\xb8\x03\xc9\x61\x83\x75\xac\x79\xf0\x06\xeb\xe6\x20\x07\x78\x33\xa7\xef\xbb\x26\x1a\xc5\x6d\xd8\x6f\x04\x43\x95\xe0\x12\xf5\x98\xd8\x74\x45\x94\xce\xf5\xa2\xd0\x9d\x75\xa0\xb4\x7d\x48\xa7\xac\xcc\x71\x54\x81\x0a\x03\xec\xbf\xaa\xe4\x83\x5c\x6c\xc3\xef\x24\x0f\x8d\x60\x50\xbf\xf3\x65\x2b\x3c\x91\xfe\x00\x90\x1d\x42\x8a\x46\xd2\x6a\x24\x61\xc9\x6b\x75\xfc\xe6\x06\x3b\x02\x50\xd0\xe8\x77\x5b\x72\xf2\xb3\x91\x4c\xb0\xec\xfe\x79\x72\x89\x78\x36\xd8\xb1\x8a\x8f\x22\xde\x69\x05\x47\x72\x20\x79\x23\x39\x0c\x93\x01\x54\xd4\x49\x1a\xd7\x48\x92\xb0\x77\xd8\xe8\xf9\xad\x90\xf7\x64\xd0\x18\xf6\x4d\x91\xa7\x2b\xd3\xa8\x2b\x4b\x93\xa6\x67\x89\x0d\x3f\xec\x41\xa7\x1e\x4c\x36\xd8\xd9\x93\x14\x9f\x36\x32\xe7\xc7\x8a\xbb\x73\x40\xf4\x4f\x08\xff\x36\x58\xdf\x12\x1b\x5f\x3e\xc3\xbf\x0d\x76\x01\x11\xd0\xf9\x1a\x68\x93\xcf\x10\xfe\x1d\xc1\x83\xac\xa9\x2e\x11\x50\xc7\x8a\xac\x60\x78\x85\x19\xbf\x0d\x76\x85\x51\xbe\xaa\xfd\x81\x25\x36\xfe\xe7\x9f\x7f\x2c\xcb\xb2\x36\xd8\x35\xc4\xfc\xcf\x9f\x7f\xfe\xb9\x91\x33\xe7\xa9\x3b\xee\xeb\xaf\xbc\x4e\xa9\x16\x1a\xa6\x57\xe9\xd9\xb7\xb6\xdd\x38\xb4\xd8\xeb\x2f\xea\x0c\x71\xdc\xde\xfd\x2d\x56\x9d\xfc\x63\x96\x13\x65\xd8\x59\xa2\xef\xb5\xec\x19\xb9\x41\x97\x9d\x4c\x07\x42\xf2\x6e\x23\xe4\x61\x03\x8f\x64\x20\xf9\x76\x00\x12\x5f\x24\x2c\x27\xfa\x1a\x28\x01\x28\xca\xc4\xa3\x58\x04\xb5\xc8\xe5\x7e\xc0\x9a\x2a\x14\x04\xac\xa5\x42\x8f\x15\x96\x88\x68\x2b\x64\x5d\x91\x14\x43\x27\xf9\xda\x2d\x14\xca\x7f\x5b\x48\x45\xe2\xf2\x6e\xe0\xd0\x91\xb9\x3f\x42\x10\x83\x79\x95\xa1\x6f\xaa\x56\xa1\x60\xe2\x5a\x08\x46\x0a\x5b\xa2\x5b\x2a\x3b\xad\x6f\x22\x71\x4a\xa5\xd6\x5c\xee\x96\xca\x3d\x93\xdc\xeb\x1a\x11\x77\x7a\xa5\x8f\x4c\xd8\x8f\x27\xb3\xa7\xe3\x5e\x97\x32\x3c\xe0\xd0\xcc\x33\x9d\x94\xe6\x5e\xce\xe7\x8d\xc4\xe4\xee\x72\x70\x0d\xb9\xcd\x1e\xea\x9f\x28\xe4\x91\x90\xbc\xe2\xa1\x53\x8b\x6e\x23\xac\xdd\x8d\x5d\xd6\x14\x5e\x6d\x38\x51\x4f\xe7\x79\xd5\x33\xdb\x1a\x4c\xc0\x8f\xa6\x2c\x11\x00\x86\x8a\x51\x47\x4b\x5d\x3c\x5a\x6a\xf2\x71\x31\xe1\xcd\x88\x8f\x59\x93\x4f\x54\x70\x42\x9d\x2e\x0f\xe4\xea\xb8\x62\x0b\x62\xc7\x11\xc6\xc6\x3a\x2a\x06\x38\xde\x6e\x27\xfc\x17\xfc\xe9\x06\x78\xc4\x9f\x43\x73\x56\x4f\xd1\x9c\xd5\x55\x11\xcb\x48\x34\x8a\xae\xc6\xa3\xde\x96\x9d\xf0\xbe\x24\x5d\x96\x68\x33\x34\x21\x9e\xea\x7b\xfc\x70\xf0\xfe\xee\xf1\xe4\x95\xce\xf1\xa8\xcf\xc1\x93\x94\xb9\x1c\x76\xca\x12\x43\xcf\x1c\xe1\x94\x01\x9e\x42\x81\xa4\xd1\x5e\x46\x2e\x06\x31\xd1\xc7\xb1\x14\x30\x1c\x0e\xe6\x31\xa4\xf5\xe6\x99\x7a\x63\xab\x62\x3f\xa9\x68\x3c\x5e\x3e\x51\x97\x19\x1e\x7f\xb8\xc4\x8b\x10\xe1\xf1\xf8\x75\x0f\xfe\x28\xde\x6d\x4f\xfd\x3a\x1e\xdf\x7c\xd9\xb3\x40\xfe\x69\x9e\xa0\xf2\xbe\xc7\xab\xd3\x3d\x40\xd0\x6d\x12\xe0\x2d\xad\x4b\x16\x52\x9b\x98\x36\x67\xaa\xcd\x75\x82\x52\x40\x19\x36\x42\x3e\x83\xc5\xca\x7f\xe3\xf5\xcc\x72\x14\x44\x7c\xfe\xa2\x23\xe7\x10\x41\xe9\x0b\x19\x80\x32\x06\x70\xcc\x82\x38\xcb\x1f\x26\x81\x68\x9d\x40\x5d\xeb\xb0\xac\xd5\x59\x48\x97\x39\x50\x75\x78\x3d\x4d\x6b\xf8\x7a\x0a\xcd\xdb\xfd\xb0\xf6\x75\xd1\xab\xba\x9b\x07\x3d\xcd\xd3\x3d\x36\x8f\x62\x32\x48\x51\x4c\x06\x1f\xa2\xc8\xb8\x40\x1c\x9e\xee\xb7\x0b\x1c\x38\x1e\xbf\x68\x14\x0a\x11\xbf\xff\xb3\x50\xb8\x79\x92\x44\xb2\x4f\x00\x62\xea\xf1\x8f\x2f\x3c\x7e\x99\xd0\x37\x9f\x57\x3d\xe5\x05\x4d\x71\x1b\x20\xb7\x00\x55\x0c\x99\xd0\x84\xb2\x00\x08\x5d\x11\x03\xfd\x2c\x00\x42\x11\x72\x5d\x37\x71\xd7\x75\x35\x46\x21\xec\x07\xea\x37\xd0\xbf\xbf\xf4\xaf\xae\x83\x0c\xf5\x59\x9a\x1d\xbb\xf9\x87\x88\x57\xa3\xed\x66\xe8\x73\x35\xa2\x81\x66\x30\xeb\xcd\x08\x8c\x66\x1f\x46\xf3\x12\xef\x9d\x7d\x2c\xa9\xb3\x9f\xe3\x3a\xac\x20\x2c\xac\xac\x86\xa9\x3a\x40\x68\x2e\xf7\x6a\xe8\x1c\x5d\x6a\xdc\xa9\xf6\xf1\x61\xa6\xf1\xf8\xe0\xbe\x50\x80\x14\x77\x01\xf1\x6a\x8d\xc0\x65\x1e\x1f\xde\xf3\x71\xb1\xc9\xc7\x2a\x38\x29\x36\xb1\x1b\x44\x95\x5a\xcf\x65\xfb\x17\xf0\xdf\xe3\x1e\x6e\x08\x9b\xe2\xe2\x07\xa9\xb5\x2d\xe6\xd5\xba\xbe\xeb\xc2\xce\xf0\x53\xc8\xd5\x81\xfa\x51\xa8\xce\xbb\x9b\x90\xd0\xe3\x7d\x0f\xaf\x12\x21\x7d\xb5\x6f\xd2\x33\xc9\xcf\x4e\x08\x44\x42\x4d\xe5\xd4\xcc\x14\x89\xe9\x13\x3a\xbe\xf9\x42\xf5\xe8\xd7\x4d\xa3\xdb\x05\x1b\x05\x5b\xc4\xd4\xb8\x9f\x73\xcf\x60\xea\xda\x51\x75\xad\xbb\x92\xee\x61\x0e\x36\xf6\xc7\xe8\x72\xa3\xc6\x49\xab\x30\x2b\x25\xef\x74\xef\xc7\x93\x3e\x61\xcc\x5c\x0e\x55\x89\xe4\x47\x03\x26\x29\x0b\x20\x5c\x0b\x26\x2e\x93\xea\xf5\xeb\x09\xae\x6e\xd3\x2b\xed\xf9\xd8\x9b\xf7\x7c\x2c\xbc\x5a\xec\xb2\x96\x08\xd5\x42\x98\x98\xc0\xd2\xba\xb6\xd9\xe0\xe3\x22\xdf\x65\x18\x9a\x14\xf9\x6e\xba\x1c\x85\x5f\x7e\x0f\x1f\xf6\xe6\xe1\xc3\x9e\xc1\x94\xc6\x84\x6a\x6c\x37\xf9\xa5\xcf\x12\xf8\xec\x84\xab\x8a\x64\x4d\x1e\x7c\x61\x4d\xde\xaf\x4b\x48\xe6\x93\x26\x97\xfb\xac\xa5\x42\x1e\x86\x42\x90\x0b\xa2\x5c\x28\x31\xdd\xe6\xfa\x94\x35\x75\xb7\x09\xb4\x85\xb4\x26\x54\xab\x12\xbd\xda\xbb\x2b\x8c\x0d\x4d\x13\xe2\x71\xaf\xab\xd5\x5b\x5f\x40\xf0\xd0\xdb\x3c\xf4\x5f\x63\xc4\x0e\x27\x53\xd0\x40\x37\x36\x4e\xe7\x86\xf8\xcc\x42\x49\x05\xbd\xd6\x28\x40\x19\x9a\x53\x03\x7c\xe1\x2b\x37\x36\x4e\x2a\xd7\xf8\xfa\x5d\x87\x57\x49\x95\x64\xeb\x3b\xda\x9a\xbb\xa2\xd1\xab\x7c\xa4\xa4\x7d\xfd\x82\x72\x4a\x7a\x9a\xec\xaf\x35\x92\x35\x8f\xb7\x74\x77\x6e\xd5\x7c\x97\xf7\x3d\x73\xe2\xa4\x07\x45\x5d\x12\x9f\xba\xd4\x99\xfc\xd2\x6f\xd9\xe9\x2c\x93\x1d\x6b\xfe\x57\x2d\x3b\xa6\x90\x0b\x77\xcf\xb2\xcb\xae\x93\x97\xd9\x7c\x97\x05\xd0\x89\x03\x1e\x04\x74\x66\x08\xad\xef\x2c\x54\xe6\x32\x5d\xd9\x78\x49\xab\x2c\xc0\x2a\x6b\xa1\xcb\x6b\xfc\x84\x0a\x53\x9f\x46\x5c\xfb\x37\xda\x58\x24\x42\x20\x27\x14\x21\x0f\x82\x94\xd2\x40\xbb\x0c\x8a\x60\x0e\xca\x5d\x3a\xdc\x3e\xad\xb0\xd8\x97\xf3\xe1\x11\x8b\x18\x1f\xcf\x37\xd5\xaf\xf3\x28\x49\x13\xb6\x1d\x68\x1d\xb2\x36\xf1\xdd\xed\xcf\x7c\xe7\xf3\x17\xad\x76\x10\x03\xa4\x18\xb0\x44\x34\x75\xa8\x2b\xee\xb0\x84\x88\x79\x68\x4a\x0e\x8d\xb7\xf6\x45\xcd\x65\x43\x67\x47\x08\x7f\x8f\xf8\xaa\x38\x26\x05\x16\x38\x14\xfd\x13\x6a\x23\xf4\x54\x01\x21\x72\x28\xf6\x2f\x96\x0e\xaf\xd5\x30\x1e\x99\xf3\xeb\xb0\x36\x72\xd9\x81\xe8\xd6\x46\x6e\xf6\x6a\xfb\x40\xc5\x1e\x89\x9b\x1f\xc4\x63\x53\x18\x2c\x31\x8b\xd8\x01\xbf\x3e\xa7\xec\xca\x40\xbd\x7d\xd6\x44\xe8\xcd\x39\x65\x15\x51\xb9\x94\x04\xbd\x6d\x5f\x12\x9f\x1d\x80\x28\xe5\xf4\x51\xfd\x29\xf8\x62\xef\xb0\xcd\x86\x0d\x09\xa6\xfc\xea\x0b\xd9\x7f\x26\x07\x7c\xc2\xa6\x7c\x72\x55\x9b\xb8\xf8\xab\x1e\xb8\x53\x16\x7e\xb1\x25\x1b\xf6\xec\x0a\xeb\x6b\xe7\xca\xa9\x36\x49\xdf\x52\x0a\x7f\x33\xca\x2e\xfd\x45\xfb\xe5\x7d\x0b\x55\xf9\x58\x35\x56\x29\xa6\xaf\xd2\x0e\x98\xdc\x57\x76\xd1\x6d\x64\xc1\x93\x76\xcc\x64\xe2\xd7\x3b\xca\xfb\xf2\xed\x2d\x81\xb5\x0a\x17\xaf\x73\xfb\x67\x83\x1c\xf1\xf3\x05\x0d\x2a\xad\x25\x3d\xb6\x2d\xf6\x69\x62\x13\xaf\x74\xc4\xcf\x61\x1b\xb5\xd5\x62\xad\x30\x89\x07\x75\xfb\x88\xc7\x75\x86\x65\xc8\xd9\x8c\xb2\xef\xbe\x3d\x64\x17\xbe\xbd\x7f\xc1\xfa\x9e\x7d\xc4\x07\xe1\x1e\x94\x6d\x5f\xb3\x53\xcf\xb6\x66\xec\xf5\x15\x88\xf0\x32\xba\x3c\xa4\xab\xf9\x5b\xba\xae\x7e\x47\x17\x90\x55\x2c\xd3\xad\xc4\x50\x74\xb5\x9a\xa2\xfe\x09\x50\x74\xa5\x28\xf2\x32\x8a\x26\xaf\x50\xfc\xf8\x55\xda\x43\xd6\x48\x82\x70\x6c\x4f\x61\xb6\x9b\xd1\xd4\x0f\x70\x3f\xb7\x84\xdc\x3d\x2d\x18\x3a\x34\xcb\x01\x76\xeb\x62\x04\x2b\x82\x0e\x25\xe2\x67\x83\xc4\x79\xc2\xd3\xc4\x37\x3f\x88\xcf\x24\xb4\x49\xc0\x3c\x16\xe0\x71\xaa\x86\x79\xfb\x2c\x54\xb0\xd4\xd4\xdb\x77\x3b\x66\x8f\x65\x5b\xf2\xe0\x1f\x56\x9d\xa8\xdf\xeb\x73\xbb\x89\x4d\xc1\x6e\xce\xed\x96\x0a\x6d\xde\xd9\x11\x93\x3f\xed\x68\x36\xa3\x4e\xfb\x99\x24\x2b\x2b\x6d\x4d\xf2\x2a\x8a\xca\x93\x19\x88\xf6\xf1\x33\x49\x7e\x97\x3a\xae\x49\xde\xff\xee\x72\xff\x9f\x52\x5c\xf3\x74\x50\xeb\xfd\x77\x45\xcd\x75\xac\xaf\x09\x5e\xad\x74\xa1\xaf\x27\xbc\xdb\xe9\x92\x9c\x6b\xe6\xbe\x7a\x10\x3f\x14\x16\x1b\x39\x23\xf1\x6a\x29\x4b\x87\x2c\x66\x5d\x14\xc6\xd6\x89\x25\x84\x48\xf0\x46\x75\xc4\x07\xdf\x0b\x85\xf2\xee\xd7\x21\x75\x28\x7c\xec\x91\x61\xb1\xc8\xfa\x85\x42\xf8\x4c\xba\xac\x4f\xa9\x3d\xc4\xdb\x2b\x5d\x0a\xc3\x22\xfb\x94\xb5\x21\xfa\x5f\x79\x55\xe8\xfb\x20\xde\x28\x74\x6c\x99\x1e\xea\xc8\x0c\xf6\x09\x81\x28\x56\x0c\xbe\xbf\xbf\x93\x91\x48\x1b\x65\x6d\x54\xab\x8e\x73\xaf\xc3\x5f\xad\x7c\xaf\xa0\x6f\x16\xce\x33\x50\x54\xcd\x72\xf9\xe6\x9d\xb0\xd8\x75\x83\x84\x94\xcb\x9f\xc2\xca\xdf\xc8\x81\x64\x81\x53\x52\x6c\xae\xd4\x9a\x22\xd4\x92\x45\x2d\x2e\x95\x5d\x90\x2c\x6a\x71\x11\x03\xc9\x5e\x50\x4b\xb0\x09\xd4\x84\x51\xda\x55\x6e\x92\x9c\x26\xaf\x84\xd2\x18\x00\x51\x17\xc0\x4d\xfe\x58\x66\xad\xbd\xa0\xd6\xd2\x19\x6a\x13\xb7\xb8\xab\x9c\x2e\x51\x6d\x2d\x06\xd3\x24\x94\xce\xa4\xf8\x99\xf6\x6b\x3c\xbd\x0d\xc4\x7a\xd9\x89\xc4\xdb\xcc\xc9\xce\x8b\x3f\x20\x53\xc2\x4f\x22\x48\xab\xd6\xdf\x77\x4b\x2d\xb4\x11\xd7\xe4\x9b\x77\x74\x1b\x36\xf9\xa4\x85\x86\x20\x55\x64\x93\xcb\x9f\x74\xdb\x67\x89\xba\x79\x4d\x8a\x1c\xb6\x5a\xea\xa3\x8b\x1f\x7d\x91\x7c\x6d\xf2\xeb\xf3\xf7\xf7\xee\xd7\x26\xbf\x39\x57\xef\x54\xfa\x4e\x54\x6b\x02\x1b\xe2\x6d\x62\x23\x2a\xe8\xff\x09\x74\xfd\x2e\x1b\x7c\xb7\xfb\x66\xa8\xbe\xb5\xe4\xa4\x33\x1c\xd8\x11\x40\xe7\xfc\x2d\xff\x5c\xb5\x62\xdd\x3f\xaf\xb4\x1c\xfc\xa6\xe7\x22\xe8\x3c\xda\x53\x55\x75\x52\x22\x92\x5f\x9f\x6f\x79\x45\x09\xbc\x31\xaf\x33\x18\x74\xda\x18\x53\x24\x92\xdf\x9c\x6f\xf9\x45\x09\xec\xc1\x94\x13\xc3\xb8\x88\xa1\x73\xa6\xc8\xf3\x56\x67\x40\xa8\x18\x74\xba\xa6\x2b\x59\xb0\xa0\xa1\xaf\x0e\x63\x08\x1d\xaa\x30\x60\x16\x9d\xd9\x39\xb0\x57\xab\x34\x88\x4f\x4b\x65\x17\x6b\x14\xe2\xb7\x77\x66\x78\xd1\xba\xb2\xa0\x10\x0b\xc2\xee\x91\xea\x3b\x89\x00\x0d\x23\xec\xbd\x69\xf2\xb5\x81\x4b\x44\x18\xaa\x02\xe7\x62\x74\x99\xc5\x32\x12\x8c\x49\x56\x95\x09\x9b\x94\xc8\x5c\x99\x4b\x28\x15\x5a\x5b\x1a\x3e\xa5\x56\xbf\x2a\xc5\x78\xe1\x25\x82\x9a\xef\xa6\xe6\xcd\x7d\x55\xab\x3e\xdf\xbc\x2b\x69\x2b\x6c\xcc\xa2\x90\x30\x12\x44\x16\xfd\x2d\x12\xee\x95\xed\x88\xd2\xed\x1d\x67\xbe\x79\x22\x6c\x9b\x52\xb4\x8a\x9e\x4f\x5e\x9e\x20\x4f\x55\x19\x06\xfa\xfb\xee\x02\x41\x9e\x08\x6a\x9e\xeb\x78\xc6\x4c\xa8\x6a\x4c\x8f\xcb\x9f\xab\x08\xf2\x3e\x26\xa8\x14\x99\x6e\xb1\x92\xa6\xcc\x32\x9a\xa6\x83\x85\xaa\xe4\x79\x2c\xfb\xcf\xc4\x67\x21\x0c\x68\x65\x82\xa9\x12\xa2\xd5\x1b\x5a\xf2\x01\x69\x58\x28\x2c\xe1\xcd\x94\x3f\x0c\x0e\x02\x78\xf9\x63\x39\x65\x99\x6e\x61\x6e\x35\x70\x7f\x9c\x48\xd4\x66\x5d\xb9\xa4\x9a\xbe\x0f\xb9\x8a\xc4\x83\x9f\xf7\x77\x8b\x66\x1e\xdb\x8a\x04\x2d\xb9\x22\xd0\x8c\x02\xa8\x5e\x48\x5c\xf1\x31\xf1\x6c\xb6\x7a\x36\x56\xd5\xa9\x2d\xde\x63\x1f\x41\xfc\x30\x1d\x29\x23\xf8\xd0\xc9\x3c\x33\x43\xa9\x54\xd0\x70\x88\x18\xdf\x57\x65\xae\x15\x82\x95\xba\xde\x9f\x9a\xe6\xba\xd4\xa3\x8b\x15\xeb\x63\x9d\x03\x1f\xca\x1e\xbc\x26\xde\x07\xe4\xb3\x59\xce\xac\xc2\xaf\xa7\x39\x43\x76\x8f\x0d\x22\x57\xda\x17\x07\x31\x41\x08\x6f\x46\x95\xe3\x00\x63\xa3\x54\xbb\x82\x46\x0f\x2f\xd0\xd5\x05\x08\x80\x7f\x7e\x28\xb3\xed\x18\x99\x6d\x66\xb8\x0b\x72\x92\xf6\x78\xee\xc1\x8e\x52\xaa\xf5\x84\xc7\xef\xc8\xd9\x31\x7b\xf8\x69\xde\x7c\xff\x2d\x2a\x30\xf4\x5f\x9f\x32\xcf\x23\x0f\xcf\x52\x58\xdf\x10\x7c\x14\xb3\x32\x75\x1e\xe7\x0e\xd6\x35\xca\xd9\x23\x19\x5b\xec\xf1\x17\x75\x2e\x25\x19\x5b\x73\x6f\xdf\x74\x79\x57\x3c\x68\x88\xe8\x42\x7b\xb1\xe2\xcf\x81\x38\x57\xea\xe5\xb5\xe3\x17\x97\xfd\x1c\xa5\x0e\xae\xf8\x0f\xbf\x20\xd6\xd3\x64\x59\x86\xd4\xad\x2e\x3f\xaa\x8b\x34\x94\x39\x66\x81\x2f\xd8\x90\x88\xb9\xaf\xe5\x78\xde\xdc\x15\xa6\x60\x7e\x47\x8e\x9f\xf0\x35\xdc\x42\x9a\xde\x7d\x3e\xcd\xc9\x93\x64\xfc\x4b\x4e\x20\xc9\xe9\x34\xfc\x52\x37\xa0\x52\x5d\x91\x5a\xdf\x34\xb0\x76\xee\x12\xc9\xca\x34\x73\x9e\x77\x15\xc6\x72\xd0\x18\x85\x6b\xe8\x6c\xaa\xbf\x26\x7b\xe1\x5a\x43\x9b\xaa\x89\x3a\xbd\x35\xb9\xd6\x6d\x84\x6b\xe8\xe7\x88\x6f\x50\x67\x6c\xf1\xb0\xf6\xdd\x77\xd3\xc7\x55\x33\x80\xc1\xfe\x6e\xf2\xf7\x0a\xfd\xb5\xeb\xfe\xcc\xf9\xa4\xe2\xc7\xab\xe2\x95\x29\x01\x9d\xe2\xf5\xef\x0f\x9e\x15\x5c\xa5\xfe\x96\x7f\xa9\x6b\xe8\x75\x71\x5c\xcf\x58\xf8\x61\x08\x5c\x53\x37\x75\x6b\x75\x39\x0a\xd7\xe4\x5a\xd4\xe8\xf5\x07\x6b\xca\x93\xf2\x5a\x27\x5a\x1b\x4c\xba\xe1\x5a\x1f\x87\x90\x76\x11\xe8\x39\xc6\x74\xb1\xde\xae\x7b\x7c\xdf\xa8\x2e\x1f\x46\xb5\x08\x37\x88\xa1\x12\xf3\xd4\xed\x8c\x51\x52\x2d\xf3\x2f\xe5\xbf\xb7\x3c\xde\x6d\x2b\x65\xac\x63\x17\x0d\x9d\x6f\x91\x72\xa9\xbc\x8d\x91\xb4\x14\x83\xac\x21\x64\xdd\xf8\xcc\x38\x69\x11\xe3\xad\xe1\xd4\x2d\x86\x0c\x47\x27\x7e\x60\x21\xf3\x29\x60\x8f\xa7\x12\x44\x10\x2e\xc6\x94\xda\x81\x10\xd7\xfd\x15\xd8\xb2\xb4\x18\x2e\x85\x4b\xf8\xa2\xda\xa9\x5b\x8a\xf3\x25\x22\xb6\xdb\xa3\x3d\xb2\xba\x64\x9c\x0d\x35\x27\x5b\xc4\x57\x16\xaf\x71\x0e\x8b\xa9\x26\x39\x25\x23\xc4\x29\x32\x5e\x20\x04\xcb\xf8\x0d\x5b\x98\x42\x3d\x45\xf3\x85\xc5\x52\xfb\x7d\x8a\x03\xf4\x31\xa1\xd6\x6e\x35\x67\x36\x45\xac\x84\xa9\x60\x7b\x47\x69\xbc\x1d\xbb\x44\xa5\x2e\xa2\x49\x5d\xa5\xb9\x6e\xc0\x40\x91\xca\xb9\xbd\x43\x1d\x0f\x86\x6f\x81\x34\xb7\x04\xff\x9b\xf9\x22\xde\xde\x65\x61\x49\xf8\x10\x85\x67\x21\xcf\x81\xb9\xca\x79\xf3\x03\x3b\xde\xf2\xb2\x01\xc7\x82\xc0\x6e\xe6\x01\x33\x16\xab\x54\x18\x33\x73\x3c\xf1\xd6\x6d\x84\xf6\x9b\x8f\xd7\x9d\xb6\xde\x25\xe3\xae\x1e\x52\xe1\x41\x08\xfc\x06\x01\x3b\x9a\xda\x3e\x0b\x1b\xb6\x97\x8d\xf9\xbd\x5a\x8b\xc5\xae\x5d\x8b\x59\xcb\x9d\xb1\x43\x09\xcb\x2b\x2a\x3b\xfc\x0b\x5a\x2c\x3c\x45\x58\xcb\x11\x64\xd0\x38\xf7\x4f\xa9\x25\x53\x27\x9a\xef\xd3\x8e\xc7\x0f\xf5\xbb\xa0\xc3\x88\x37\xba\x04\xbe\xa9\x1d\x09\xf1\xe3\x28\x0f\x7e\xd0\x28\xd0\xb3\x8b\x38\x3b\x2d\x14\xaa\xd9\x8d\xdb\x3e\xd3\x8f\xca\x0f\x23\x7e\x26\xe7\x4c\x2d\x3c\x3e\x2d\x99\x3c\xbf\x62\xa1\x78\x9b\xb1\x48\x3c\x80\x50\x06\xb3\x6b\xd7\x62\xd7\xf8\xd8\xac\x76\xe2\x6a\x0b\x81\x1e\x7f\x85\x21\xe9\xf1\xc6\xb3\x5a\xcf\x9d\x80\xff\xf0\xf7\x48\x20\x24\x74\x00\x16\x09\x8f\xda\x4d\x11\x88\xc8\x09\x79\xd2\xe9\xb5\x65\x6b\xf1\x55\x61\xa0\xce\x0a\xf0\x54\x41\xb2\x43\xe5\x74\x6f\x5d\xf8\xe8\x47\x86\x3a\x21\x7f\xf5\x16\xb3\x34\x73\x59\xe2\x55\x59\x1a\xcf\x8b\x59\xa2\x5c\x16\x6f\x39\x8b\x9e\xdd\xc2\x6c\xdd\x85\x9a\xcc\xd9\x6b\xbe\x62\xbe\xf0\x6a\x20\x24\xf0\x7d\x14\x63\xa5\x90\xaa\x1e\x61\x83\xad\xd7\xd8\x9a\xeb\xa0\xae\x0a\x7a\xfa\xd9\x61\x0f\x9e\x5d\x0b\xa4\x9b\xbe\x4b\xc7\x4b\xdb\x2c\x81\x2c\xe6\x93\xf8\xe2\xe1\x96\x04\x39\xcf\xa3\x7e\xed\xc2\xfd\x16\xee\xe1\x35\x08\x16\x59\x44\x15\x3e\x33\x3c\x4b\x92\x01\x1c\x87\x27\x86\x70\xf8\xe2\xf4\x9c\x35\xeb\xfd\xd3\x82\x15\xdc\x2b\x54\xf4\xff\xe5\xb1\x50\x78\xe9\x25\x69\xa4\xc2\xfc\x68\xca\x62\x11\xa0\x7f\xa9\xa6\xf8\xf1\x8b\xa4\x0d\x3f\x7d\x92\xec\x9a\x52\xd6\x12\xaa\x9f\x34\x59\x99\xb2\x44\x44\x1d\x1d\x3f\x7e\x92\xec\x4d\x7a\xb6\xcf\x5b\xcd\xec\x51\xac\xcf\xbb\xed\x19\x6c\xa9\x36\x0d\x9e\x8e\xc5\x2a\xe7\x92\xf9\xfc\x39\xd8\xbb\xb1\x3b\xe7\xb0\xc5\x4a\x23\xfb\x4f\x92\x5d\x9d\x4b\x36\x8e\x29\x1b\x8a\x5b\x03\x1e\x3e\x49\x56\xde\xfe\x6b\xc7\x82\x1d\xf2\xb9\x81\x1e\x3d\x49\xca\xa6\xe2\xa7\xf9\x9e\x3c\x49\xe6\x75\x25\x65\x07\x59\xce\x17\x0b\xc4\x0f\x0c\xd7\x0e\x9e\xa4\x2b\x76\x1c\x9f\xb7\xa0\x91\x7c\xfe\x3d\x81\x5f\x3c\x56\x63\x57\xac\xe2\x20\x49\xe4\x48\x48\xbd\x52\x9f\xc2\x4a\x6d\x95\x29\x3b\x12\x7e\x36\x93\x6c\x91\x72\xf1\x68\x0e\x06\xf3\x81\xc5\x8e\x5c\xbb\x76\xc4\x2c\x97\x5d\x89\xda\x7a\x99\xad\x5b\x2e\xab\x88\x9a\xc1\x15\x9d\x30\xbe\x4b\x99\xf9\x0c\x4f\x58\x99\xba\xd4\x26\x47\xa2\xa6\xb3\xa8\xf4\x65\x97\x3a\x3e\x4a\x1e\x66\x0e\x09\x61\xbe\x88\x60\xfa\x50\x0d\xa4\x66\x26\x15\x0e\x02\x9c\x47\xdc\x99\x93\x29\x1f\x7f\xaa\xae\x10\xf1\x03\xe1\xf3\x56\x4d\xe2\x81\x62\x59\x08\x8f\x4e\x2c\x12\xb0\x3e\x0b\x72\x77\x1e\xa1\x4a\x53\x8a\x5d\xc7\xc4\xb2\x90\x42\x38\xd4\xe1\xd9\x8c\xe1\xdb\xa7\x7c\x09\x66\x74\xf8\xe6\xfc\x56\x96\xca\xa8\x6d\x10\x64\x20\x0b\x00\x4e\x19\x2d\x47\x79\x7b\x13\x8b\x78\x0c\xe6\x37\xbb\xfc\x55\x16\x0a\xc4\x2b\x14\x82\x3d\x62\xa0\x2c\xa0\x4c\x17\x0f\x61\x6a\x7b\x30\x91\xbc\x4d\xf6\xed\x6a\xc8\x82\xc8\xae\x86\x33\x96\x4b\x4b\xed\x00\x5f\x5f\x2c\x25\x48\x11\xa0\x56\x2d\xbb\x13\xf3\xd5\x62\x8e\x45\xb0\xcd\xa1\x2b\xe0\x88\x6c\x04\xb6\x54\x07\x75\x1e\x9b\x77\xca\x78\x5c\xb7\xdf\x9e\x63\x3b\x60\xb7\x91\x1d\xb0\xc7\x91\x5d\x81\x76\x7b\x82\xdf\xb2\xcb\xc6\x65\xfb\xf4\x80\x4d\xca\xf6\xc9\x01\x3b\xf3\xe0\xef\x25\xfe\x1d\x0d\xec\x75\x8b\xdd\x1e\xdb\xeb\x16\xec\xc2\xd5\x61\x5e\xc8\x6e\xed\x68\x46\xed\xff\xa0\x54\x9c\xa9\x82\xc5\x9c\xc8\xd0\x7d\x5a\xbd\xac\x2d\xf5\xd8\x0d\x1b\xec\xd3\x85\x14\x6d\x59\xbb\x70\xd9\x99\x14\x16\xbb\x07\xe1\xf2\x5e\x7e\xbd\x90\x4e\xb1\x78\x2f\xb3\xe3\xfb\xd3\x10\x92\xdd\x4b\x97\x5d\x28\xab\x72\xec\xc6\x17\xa7\xd8\xbb\x4e\x43\x08\x04\x01\x4b\x42\x71\x84\x49\xfa\xbe\xb8\xc2\x40\x18\x08\x8b\xbd\x46\xc2\x62\xbd\xa6\xb0\x58\xbb\x2e\x2c\xa7\x5d\xff\x1a\x3b\xed\x7a\xb1\x48\x7b\xcd\xa2\x08\x40\x56\x6d\xd7\xd9\xbd\x2c\x96\xe9\xfb\xbb\xd2\x9b\xce\xd2\x15\x8b\xed\xba\xea\x31\xe3\x68\x29\x2d\xfb\xf1\x22\x02\x7e\x2c\x53\x18\xdb\xcc\x12\x59\x94\xd5\x9f\xd3\x68\x8b\xb2\xeb\x67\xf1\x1a\x6d\xf7\x9a\x4c\xc6\xe2\xfa\xb9\x38\xc6\x70\x35\x16\x32\x2e\x5d\x3f\x7f\x13\x43\xa7\x1a\xef\xbd\x46\x45\x31\x8e\xec\x30\x80\x1f\xb5\x5a\xf5\xc4\xe0\x49\x16\xcf\x24\x9b\x76\xd3\x81\x1e\xf7\x8a\x57\x4f\x92\x49\x3e\xf4\x6a\xed\xfa\xff\xe2\xef\x85\xeb\x52\x48\xf3\xe3\x17\x99\x76\x29\x6b\x4c\xf4\xb4\x37\xed\xb2\x0a\xd4\x05\x65\xc1\x21\x6c\x71\xd4\x34\x13\xf7\x8a\x77\x6d\x89\x44\xf6\xb2\xc9\x27\xee\x15\x2f\x9f\x24\x3b\xa0\xc5\x24\x64\x8f\x71\x36\x57\xc6\xbd\xe2\xf7\x27\xc9\x12\xd8\xc4\x66\xf3\x59\x2d\xee\x15\x2b\x4f\x92\xf5\x4e\x5c\xdc\x45\x8c\x23\xf1\x84\x65\x9e\x49\xd6\xae\xb3\xeb\x67\x26\x63\x36\x8e\xd8\x8f\x17\x56\x7f\x66\xd5\x98\x85\xec\xc6\x67\xa7\x21\xab\xf7\xd8\xa7\xe0\x90\x75\xd9\x63\x0c\xf4\x35\x26\x6c\xd0\x81\x69\xa4\x05\xdd\x6b\x1c\x51\xa7\x1a\x67\xa5\xc4\xbd\xe2\xc5\x93\x64\x7d\x10\xad\xaa\xf1\xfb\xfb\x88\x52\xe7\x8e\x6c\x46\x80\x73\xda\xad\x9d\x40\xcf\x61\xd5\x98\x3a\xf7\x52\x88\x0b\x59\x2a\x17\x0a\x11\x39\x93\xec\x42\x52\xe7\x4c\x16\x45\x79\x66\x7d\x0d\x61\xd0\x5d\x3f\x8b\x72\x29\x0c\x74\x13\x94\x81\xdc\x30\x80\x36\xd4\xfb\xdd\x30\xc0\x26\x9b\x42\x0f\x53\x7c\x94\xca\xf0\x7f\x81\x8f\x75\x2b\xe5\xe3\x00\xea\xc9\x62\x5d\x86\x5e\x72\xf0\x34\x16\xc8\x5c\x1f\x15\x0a\x77\xe4\x1a\x12\x37\x81\xbe\x52\x19\xfd\x88\x3a\xf7\x38\x7a\xfc\xc0\xbe\xf1\x61\x4a\x3c\x0d\xd9\x63\xc5\xbe\x80\xdd\x6f\x46\xfa\x2d\xb9\x98\x37\x04\xac\x75\xba\xb4\x01\x76\x4f\xdb\x5e\xef\x9c\xdb\x99\xfb\x98\x7d\x65\x3b\xfd\xa6\x9e\xc1\x82\xc8\x31\x36\xda\x73\xb0\xe2\xd9\x7e\x11\xd2\x17\xaf\x43\x73\x32\x7f\x9d\x5b\x78\x9f\x16\x4f\xe6\x91\xab\x84\x75\x59\x9f\x0d\xd9\x88\x4d\xd9\x01\xc3\x95\x47\x8d\x88\x5b\x58\x9a\x61\x82\xbe\xe5\x3f\xfc\xf7\xf7\xf2\x57\x31\xa4\x43\xa1\x8c\x9d\xdd\x81\x14\x76\x2f\xc2\x52\xe0\xc4\x63\x72\xc7\x22\xea\xdc\xf1\x20\x12\xb1\xf3\x28\xc9\x1d\x3b\x82\xcf\x6e\x28\xae\x9c\x3b\x75\xcd\x2c\xe0\x53\xcb\x5a\x4e\xb5\x4b\xee\x58\x93\x3a\xdf\xe1\xd7\x83\xa4\x0f\xb1\xa8\x38\x77\x7c\x38\x10\xd6\x57\xe1\xef\x81\x30\xc0\x87\x6d\xe2\x2b\xd9\xc1\xb9\xe3\xb7\xa2\xe5\x78\xa2\xbb\x35\x74\x86\x5b\xa2\xef\xdc\xf1\xe6\x89\xf0\x9c\x3b\x5e\x9d\x8a\xa1\x73\xc7\x7f\x05\xe2\xf3\x17\x6b\x2b\x28\x4a\x7e\xfa\x37\x14\xad\xbe\x43\xf5\x2d\x61\xa7\x8f\xfe\xf9\x3e\x7f\xb1\x4a\x90\x9a\x99\x2c\x25\x48\xcb\x30\x83\xaf\x1c\x0a\xfe\x38\xdf\x22\x10\x5b\xfa\xc7\xa2\xdb\xe5\xbf\x2d\x27\x4a\x81\xdd\x0c\x78\xc7\x27\xfb\x7a\x0b\x77\xfc\x79\xeb\x9e\x6e\x97\xad\xe2\x51\xe8\x34\xc5\xb5\x31\xa5\x3f\xcd\x5a\xb2\x29\x20\x79\xde\x0c\xfe\xc9\x29\x00\x6b\xd1\xbe\x9b\x87\xde\xd4\xed\xa6\x88\xf3\x90\xd7\x03\x09\x20\x68\xd7\x3b\xdd\xae\xfe\x58\x55\x5e\x23\x22\xeb\x2d\x63\x57\xf7\x0e\xea\x59\x8a\x03\x14\x00\x37\x7d\x72\x87\xfa\x0f\x9f\x0e\x68\xad\xe7\x3a\x07\xe2\x00\xc5\xc1\x3b\x1e\x55\xcc\x53\x7f\x98\x04\x9c\x3b\xbe\xf9\x22\xca\x42\xdc\x03\x32\xcc\x02\xbb\x7c\x80\xd2\x3b\x3e\xbc\x17\xc7\x97\x24\x61\x7a\xcb\x20\xb7\x77\xd8\xc1\xf6\x0e\xa5\xec\x8e\x0f\xee\xc5\xba\xa5\xd6\xe9\x7b\xd1\x2d\x1d\x38\x07\xa2\x5f\x82\xb2\xa1\x04\x27\x75\x98\x2f\x6b\x3d\x77\xfb\x9e\xc9\xda\xbe\xbb\x7d\x40\x9d\xd8\xc0\x77\xb6\xef\xd9\x0e\x40\x5a\xe2\xe6\x9e\x10\xbf\x18\xd1\xed\x9d\x22\x54\x32\x2b\xb3\x32\x75\x1a\xf6\xdb\x54\xdc\x64\x57\x85\xe8\x28\x57\x52\xa7\x29\xca\xce\x91\xda\xdf\xe1\x2c\x7e\x25\x2c\xe7\xea\xeb\x54\xdd\x56\x5e\xa9\x3e\xdb\x96\x62\x5a\xbb\x72\x9d\x8a\x68\xf1\xf1\x56\x5b\xf2\x71\xb1\xc5\x27\x10\x98\x38\x6d\x29\x2a\x5b\x95\x62\xb9\x44\x00\xae\x22\x21\x02\x63\xa9\x63\x7d\x6b\xcb\x3d\xf5\xec\xcf\x26\x6d\x29\xd4\x7b\xa9\xb6\xa4\x20\x06\x55\x4a\x6d\xc9\x2a\xc5\xb6\x74\xf3\x06\xed\x2b\xef\xef\xd6\x37\x58\x70\xe9\xdb\x54\xbd\x17\x54\x56\x7f\x1b\xb3\xa6\x38\x22\x4d\x86\x51\xb3\xa9\x68\xce\x1a\x11\xe1\x7f\x7e\x9b\x52\x6d\x95\x01\xeb\xae\x25\x5a\xda\x1a\x54\xab\xd6\x9e\xba\xa4\x34\x85\x7d\xcc\xf5\x25\x0c\xd2\x18\x2d\xe7\xdb\x6f\x12\x2b\xa2\x05\xec\xc7\xf8\x28\xb5\xe4\xb3\x9d\x2d\xa8\x2b\xea\x4c\x85\xe5\x40\x7f\x81\xba\x38\x12\x96\x73\xf4\x55\xaa\xba\x38\xa2\x6f\x57\xe2\xd3\xc1\x33\xa9\xd7\xc6\x81\x4b\x64\xed\xc8\xe5\x13\x86\x3f\x63\x9a\x43\xd0\x88\xc8\xd5\x37\x11\xbf\xbf\x5b\x42\x5c\xd1\x37\x29\xd6\xcb\x39\x06\xd4\x46\xfa\x0a\xfa\x9a\xb1\x72\x71\xc5\xa6\x74\x26\xc5\xb4\xd4\xfc\x0a\x18\x66\x52\xc8\xbd\x96\x12\xef\xef\x41\x96\x32\x7d\x85\x8f\xb7\xee\x19\xd4\xec\x81\x31\x22\x21\xee\x0b\x05\xa2\x7b\x0e\xc3\xce\x75\x05\x0d\xcc\xee\x4d\xff\x2a\xdd\x29\xb5\x9c\xed\x1d\xa6\x82\xfb\x2e\xf4\x36\x6d\x55\x5f\xe5\x2c\x3b\x77\xbc\x13\x45\xfd\x70\x90\xeb\x38\x30\x7b\x51\xac\xbf\x11\x75\x46\x10\x11\x21\x08\xe6\x88\x48\x1c\x41\x17\xbe\xb9\x27\x3e\xc2\x00\x78\x56\x57\xc0\x11\x75\xfa\x2a\xb5\xc7\x86\x10\x71\x3d\xcd\xa5\x06\x18\x00\x27\x03\x05\xec\x53\xe7\x16\x77\xff\x3b\x7f\x59\xdf\x04\xcc\x0f\x85\xc2\x3f\xd6\x57\x98\xd6\x60\xe9\xe9\xc3\x74\xf8\x8f\xf5\x0d\x22\xf6\x48\x1f\x26\x97\x7f\x2c\xd6\x07\x0a\x34\x7f\x09\x1f\x17\xbb\x2c\xe1\x13\x4a\x6d\x95\x00\xe7\x21\x4c\x02\x94\x52\xb6\xf3\x97\xf5\x15\xd0\x41\xfe\x6e\x20\x76\xfe\x02\x04\x67\xf5\x1c\x82\x52\x0e\x41\x37\xc0\xb2\x55\x12\xe0\x8a\xb2\xbe\x9e\x6a\x3f\xe1\x5c\xfb\xea\xb1\x3b\x5e\xf5\x04\xd6\xc4\xe1\x40\x28\xf2\xf9\xee\xd7\xc0\xb9\xe3\xc9\x6b\xfa\xfd\x2d\xc4\xd1\x8f\x6a\x5d\x10\x41\xef\xf8\xc3\xa5\xd0\x28\xcc\xb6\xef\x2e\x5b\xb0\x26\x39\x95\x57\x5f\x4c\x2d\xf4\xe0\xeb\x40\x25\xf8\x45\xd1\x0b\x8b\x53\x0b\xcd\x91\xa1\xab\x81\x50\xbc\x1d\xb6\x6d\x09\xf3\x1c\xf3\x3b\xc9\x20\x4c\x06\xb6\x9f\xbf\x73\xaa\x3e\xc9\x65\x0f\x57\x57\xa8\x6a\xa1\xb7\x16\xb1\x0e\x06\x01\x6b\x2a\x09\x13\x77\x87\xad\x6c\x8b\xb6\xaf\xb7\x68\xb0\x73\x4b\xf4\x5c\xfd\x79\x8b\x44\xc5\x98\x96\xd4\x18\x26\x9f\xb7\xe0\x0b\x60\x9f\xb7\x62\x4a\x61\xfb\x07\x1b\x2e\x7c\xa2\x92\xde\xc2\x5a\x4e\xff\x6b\x08\x22\x30\x8e\xa1\xbe\x79\xf6\x87\xa0\x3e\x6e\x54\x86\x46\xbd\x77\x84\xc7\xd9\x5f\xc5\xb0\xd6\xf5\x5d\x3a\x12\x21\x6f\xd5\x30\xec\x66\xbb\x97\xa9\x26\x3c\x6c\x38\x23\x31\xad\x4d\xf1\x5a\x09\xf6\x1d\x68\x87\xee\x40\x8f\x28\x12\x15\x47\xbc\x79\x02\xfd\x98\xff\xb5\xbb\x15\xc1\x3e\x4e\xc7\xc4\xc5\x11\xaf\x4e\x4d\x4c\x4c\xd9\x95\x20\x23\xde\x0d\x8a\x23\xfe\x2b\x00\xf0\x14\x26\x84\x2b\xf5\x44\xbd\x22\x2e\x60\x72\x38\x60\x71\xe9\x88\x6e\x27\x5b\x9f\xbf\x58\xec\x96\xdd\x39\x3b\x5b\x95\xaf\x90\xa9\x34\xc2\x9e\x79\x2b\xe0\xb7\x58\x61\x77\x02\xa1\x15\x56\xfe\xdb\xfa\x36\xdd\xbb\xd3\xa3\xfd\x0e\xbe\xa9\x7d\xab\x69\xb8\xc5\x4f\x6a\xdf\x89\x5b\xa1\xce\x36\xef\x57\x99\x68\x3f\xba\x24\x4d\x18\x36\x12\xe4\x07\xd8\xdf\x54\x56\xa5\xba\x27\x75\x2e\xfb\x8d\x84\xec\x3f\x13\x22\x4b\x9f\x9a\x7c\x42\xb7\x8f\x40\x78\x2a\xe3\xa6\xa8\x2d\x3f\xca\xf5\xe3\xbc\x34\x97\x75\x31\xe7\x50\xbc\x05\xff\xd8\xf7\xe4\xe8\x99\x5c\xc1\x0a\x4d\xf9\x84\x4d\xae\x6c\x7d\xd9\x8b\xf0\x5b\x03\xc7\xaf\x3b\xfd\x45\x99\xdc\xb7\x87\x4a\x57\x70\xdf\x9e\x5a\x64\xc4\x5a\x94\xf9\xff\xd8\xa3\x5a\x27\x70\xf5\x26\x67\x84\xba\x0e\x8e\xaa\x28\x32\xe4\x57\x5f\x44\x45\xdd\xab\x0f\x61\x28\x22\xa0\x2d\x99\xaf\x21\xb3\x59\x24\x3c\x9c\xc8\x4a\x51\x09\x55\x1e\x9c\x50\xdc\x3e\xa9\xd5\xec\xa4\x45\x72\x4e\xfe\x94\x0b\x40\xed\xf0\x2f\xa2\x0c\x96\x6e\xb6\xc3\x02\xd6\xa5\x8e\xb7\x2a\xcf\xa9\x5b\x8c\xd2\x4c\xca\xff\xd7\xa6\xcf\xca\xe8\x2a\x44\x3d\xbb\x6a\x28\xe7\x39\x68\x79\xe6\x8a\x7b\x5d\x91\xbf\x29\xd9\x4f\x1f\x42\x37\x1f\x16\x2e\x3a\xba\xe7\x74\xf6\x48\xf6\x2d\xd6\x7c\xa0\xce\x3e\x9e\xa3\xb7\x06\xab\xda\x43\xab\xa8\xfd\x1a\x12\x59\x93\x3d\x97\xce\x74\xea\x6a\xb0\xe8\x19\x49\x1f\x85\xa3\x05\xf9\xd7\x90\x1a\xb9\x08\xcd\xe5\x2b\xd1\xa8\x6d\xd9\xda\x82\x7e\xd9\x4d\x6f\x88\x94\xf4\x33\x30\x96\xc0\xef\x27\xb2\x28\xd9\xdb\xd0\xb7\x7d\x16\x3d\xab\xb5\x66\x4e\xd1\xea\xc0\x5a\xd4\x36\xd9\x5f\x64\x0e\x62\x62\x73\xb5\x87\xce\xe2\x7b\x27\xa8\xb5\xa0\x94\xe2\x5a\x52\xdc\xdf\x92\x68\x95\xfb\x72\x4c\x0c\xfb\x33\x0f\x37\x42\x4d\x3a\xd3\x99\xfc\x96\x54\x98\x46\xea\x86\x65\xf6\x48\x0e\x2c\xb6\xff\x40\x9d\x03\xac\x8e\x83\x0f\x9e\xd0\xf7\xff\xd4\x9f\x33\x9d\xb0\xb5\xa8\x1c\x98\x5e\x9d\x55\xa6\x2e\xf1\xd8\xfc\x53\xf6\x43\xcb\x78\x9d\x6a\x09\xc9\x5b\xef\xef\xfa\x26\xcd\x87\x2f\xc7\xaf\x79\xae\x80\x3f\x08\x4f\x4f\xec\x3c\x77\xf6\x49\x15\xd6\xff\xf3\x83\x87\xa2\x6f\x15\xcf\x96\x6c\xd4\x54\x36\x9d\xfa\x21\x8f\xc3\xc1\x71\x32\xe8\x35\xc2\x3e\xa1\xec\x74\x60\xfb\x6c\xbf\x69\x7b\xfc\x57\x7d\x86\x87\x74\xbf\xea\xfc\x4e\xf2\xea\xab\x5e\xdd\xc3\x42\xa1\xfa\x4a\x34\x98\x19\x1c\x9d\x3a\x09\x69\xad\x33\x75\x69\xee\x34\x48\xbd\xab\x48\xf8\xcb\x3d\x0b\x45\x24\xc4\xb4\xfe\xfe\x1e\x09\x31\x8e\x59\x0c\x9f\xdf\x63\xf3\xd9\x14\x1a\x4f\xa1\x60\x7d\x0d\xf8\xa8\xa9\xde\x99\x9c\x5f\x13\xaf\xf6\x38\x76\x29\x6b\x8a\xf2\xd7\x08\x55\x48\x9a\xac\x25\x2c\xa7\x85\x5f\x4e\xb1\xa8\x55\x00\x13\x11\xd5\x5a\x2e\xeb\x8a\x9c\x26\x1f\x4b\x44\x52\xd4\x0a\x7e\xdd\x2d\xd2\x2d\x95\xa9\xb3\x89\x6b\x50\x82\xea\xb6\x85\xc2\x7a\xb3\x50\x90\xff\x97\xba\xe0\x49\xe8\x2c\x2c\x14\x9a\x85\x82\x97\xc1\x22\x16\xd5\x22\x35\x9d\xab\x4e\xd5\xcf\x9f\xe5\x78\xda\x9e\x89\xb9\x0c\xf0\xf5\x43\x19\xdd\x1e\x35\x8f\x11\xaf\xe8\xe7\xd5\x0b\xe9\xff\xfa\xee\xcc\xc4\xba\x33\x6d\x25\x2b\x9c\x43\xca\x42\x44\xab\x9f\x21\x66\xc7\x26\x91\xe8\x13\xb4\x72\xb2\x5e\xfe\xa0\x12\x3e\x41\x2d\x64\x7a\x7b\x89\x7e\x43\xe8\xb5\x64\x2d\x71\xe9\x5b\x53\x34\xdf\xdf\xd7\x2d\x27\xa5\xd9\xdc\x91\x0d\x5e\xf5\x51\x5a\x57\x24\xec\x56\xf8\xec\x0e\x19\xe9\xe6\x70\xdd\xd5\x86\x13\x57\x25\xba\x17\x7a\xa3\xa7\x25\xda\x7b\x5e\x0f\x48\xb5\x4d\x34\x94\xfb\x1e\xa1\x6c\x1c\x32\xfe\x17\xec\x93\xf9\x61\x3d\x8d\xf9\x11\x16\x79\x99\x3a\x87\x16\xb9\x65\x5d\xca\xe3\x57\xf1\xa6\xce\x9c\xee\x67\xb3\x59\xce\xa7\x92\xdf\x92\x85\x82\xff\x7f\x69\x5b\xe9\xa7\x3c\x3e\x4c\x72\x78\x1d\xcd\xbd\x2e\x6a\xea\x40\x83\xc5\xd8\x66\xb9\x76\xf4\xe8\x4c\x57\x2c\x90\x1f\x09\x8f\x47\x0d\xea\xf3\xa8\x21\x22\x27\x24\x1e\xf4\xe6\x2e\x0e\x36\xfc\x3a\x94\x00\x38\xad\xc3\x8e\x3f\x7f\x21\xa1\x8a\x9f\xbb\x90\xe8\x36\x42\xfd\x16\xca\xcb\xd5\x4c\xa8\x6a\xc6\x17\x87\x5a\x3e\xf2\xf9\x65\x22\xde\x66\x8e\x27\x20\xe4\x68\xe5\xeb\xc5\xfb\x80\x30\x5f\x5b\x43\x69\x7f\xe1\xbb\x78\xf5\xfd\x79\x46\x1d\x8f\x5f\xab\xf4\xdf\x9b\x24\x00\x19\x88\x8f\x8b\x58\x0c\x1f\x33\xf5\x3d\xd1\xdf\x13\x48\xfc\x2b\x10\x21\xff\x15\x38\x1e\x48\x8a\x21\xef\x06\xf8\x12\x45\x84\x7c\xf3\xc5\x21\xbe\xf0\xf9\x45\x03\xed\x56\xdf\xff\xb9\x47\xa4\xf0\xb9\x1f\x14\x7d\x5d\xfa\x95\xb7\xbd\xc3\x20\x49\x30\x0f\x43\xed\xd1\x30\x9f\x48\x8a\x00\x33\x32\x5f\x04\x98\x1a\x56\x21\x2f\x97\xc2\xf1\xb8\x1f\x08\x59\x84\xd2\x83\x40\xf8\xc5\xc0\x91\xe2\xe8\x19\xa6\x0a\xdc\x4b\x3b\xbe\xfa\x52\x3b\x6b\xc7\x03\x69\xf8\x5a\x69\xc6\x2b\x81\x22\x55\x63\xc7\x87\x19\x67\xf5\x7c\xac\x3f\x17\xab\x46\x43\xc8\xab\x9e\x13\xa1\x35\xe9\xaa\x87\xcf\xa8\xf0\x8e\xdc\x4b\xdf\x31\x88\x5e\x42\xa2\x7c\x35\xf3\xcf\x54\x45\x5f\xd7\x05\xfc\x51\x1d\x58\x81\x7e\x05\xe2\x53\xa4\xd4\xe7\xf1\x91\x84\x88\xd4\xc3\x11\x7c\x41\x21\xe0\x4f\x51\x7f\x06\xf0\x19\xc0\xa7\xe6\xaf\x6a\x58\x64\x7e\x0a\x50\x5c\xaa\x0c\x86\xd1\x6a\x9e\xd7\xaa\x66\xa8\xaa\x78\x52\x21\xc3\x74\x35\xcf\xf7\x42\x4a\xbc\x8a\x1b\x88\x90\x1f\x0e\x1c\x0f\xa4\xfb\x90\x27\xaf\xce\xfc\xe3\x2b\x0f\xe4\xfa\x5e\x42\x42\xfe\x70\x99\x67\xfd\xa4\x25\x05\x24\xdb\x93\xb6\xcf\xc2\xd5\xab\xd1\x75\x93\x48\x43\x27\x64\x60\x12\x78\xf7\xb6\xe4\x5c\x6f\x80\x0a\x98\x87\x81\x74\xe6\xf1\xce\xbe\x08\x89\xc7\x4a\x65\x28\x2e\xac\xe0\x47\x79\xee\xd9\xc1\xe6\xf2\x4d\x5f\xb7\x11\x3a\x30\xf1\x1f\x4d\xd1\xce\xb5\x1a\x61\xc6\x86\x03\xf4\x73\x3c\x66\xd7\xe3\x8b\x79\xfc\xa2\x01\x7b\x30\x68\xf3\x8b\x86\x79\xdc\x20\xfa\x09\x91\xf9\xc6\xde\xa1\x6c\xd5\x38\x92\x0b\xe3\x48\xea\x71\x84\x6f\x27\x84\x34\x0f\x28\x80\x2a\x08\x6d\xbe\x08\xc9\x37\x5f\xd0\xe1\x57\xc6\x6b\x71\x87\xef\x16\xf3\x9d\x1f\xbb\xa7\x1a\x21\x12\x7b\xa9\x1a\x24\x92\x05\xf9\x4e\xcf\x16\x3b\x7d\x6e\x78\xe4\x3b\x38\x5b\xec\xfe\x41\x3e\x96\xe6\x94\x73\xe4\xe2\x2c\x75\x68\x11\x8f\x9f\x0e\x18\x9e\x70\x4d\x1e\x88\xe4\x3f\x13\x14\x8c\xf0\x9c\x5d\xd9\x42\x09\x78\xdf\x13\xbe\xe3\xf1\x7d\x74\x32\xd1\x0f\xf9\x41\x1f\x7b\xda\x7e\x93\x41\x5c\xde\x6a\x97\xf7\x7f\x4b\xbb\x36\x53\x44\x00\x45\x74\xaf\x64\x56\x46\x80\x4f\x30\x3e\xc4\x1d\x22\xee\x4c\xc2\xa9\xa3\x79\xfd\xb8\xba\x64\x14\xe3\x2a\x20\x4a\x48\xad\x57\x59\x5c\xa5\xce\x83\xa8\x6b\x87\x26\xed\x58\xce\x9b\xc9\x7c\xe0\xf7\x97\x62\xd1\xb4\x37\xac\xa0\x39\xb7\x2a\x73\x5a\x43\x90\xe5\xc7\xfd\x8a\x2c\x4a\xa0\xcc\x65\x5b\x92\x36\x21\xeb\x51\x79\x49\xac\xca\x65\x49\xa5\x6e\x34\xcf\x54\x59\x3d\xc0\x20\xa1\x7e\xde\x8b\xa6\x9f\x46\xab\x93\x35\xaa\x3a\xc9\x87\x0f\xff\x0f\x3b\xbd\x10\xdf\xf2\x6f\xb0\xb8\x3a\xf7\xf8\x1f\xad\x76\xe3\x5f\xfd\xf8\xbf\xaa\x9f\xf8\x9f\xb7\x65\x1c\xfe\xba\x3d\x17\x0a\xd2\x6c\x3a\xe3\xf1\x5c\xf2\xfa\xbe\x4b\x9d\xc3\xd7\x39\xd8\xcb\x24\x45\x11\x0c\xdb\x5d\x91\x05\x35\x34\x6f\x55\xa0\x6a\xac\x0a\x98\x22\x11\x7e\x89\x9a\xa8\xf8\x22\x3a\x92\x7e\xa8\x93\x3d\x77\x73\xc9\x32\xe3\x03\x55\x6d\x7c\x40\x05\xfa\xe1\x60\x1f\x6b\xc7\x94\xfb\x9c\x65\x9a\x8b\xe8\xd4\x75\x44\x2f\x6c\x77\x46\xe1\x5c\x9c\xff\x0c\xd5\x78\x37\x94\xac\x3d\x57\x53\x6d\x64\xb3\x9d\xd5\x54\x7b\xa9\xa6\xda\xb9\x9a\xca\x27\x37\x35\x95\x87\x61\x4d\xb5\x17\xc8\x6e\x1b\xb2\xdb\x0b\x64\xb7\x0d\xd9\x9f\xda\xcb\x74\xb7\x73\x74\xff\x1c\x4a\xd6\xcf\xe8\xee\xab\xa8\x4e\xbb\x3b\x1c\x84\x47\x8d\x28\x12\x0a\xf2\x6b\x04\x2c\x61\x98\xf5\x33\x96\xfa\x4b\x2c\xf5\x73\x2c\xe5\x93\x1b\x96\xf2\x30\x64\xa9\xbf\xc0\x52\xdf\xb0\xd4\x5f\x60\xa9\x6f\x58\xea\x2f\x73\xd4\xcf\x71\xb4\xba\x43\x1f\x0c\x3d\xaf\x65\xba\x74\x6f\xae\xa1\x7a\x48\x52\x2f\xe3\xaa\xb7\xc4\x55\x2f\xc7\x55\x3e\xb9\xe1\x2a\x0f\x43\xae\x7a\x0b\x5c\xf5\x0c\x57\xbd\x05\xae\x7a\x86\xab\xde\x32\x57\xbd\x7f\xe5\xea\x50\x26\x41\x2b\xec\x0f\x1a\x7e\x53\xb3\x36\xc8\x58\xfb\x24\x5f\xc8\x00\x09\x1b\x64\xbc\x0d\x96\x78\x1b\xe4\x78\xcb\x27\x37\xbc\xe5\x61\xc8\xdb\x60\x81\xb7\x81\xe1\x6d\xb0\xc0\xdb\xc0\xf0\x36\x58\xe6\x6d\xf0\xaf\xbc\x9d\x35\xfa\x83\x4e\xdc\x93\xed\x0d\xf6\x3a\xd7\x5e\xaf\x48\xd0\x6b\xc6\xd3\xeb\x12\x4f\xaf\x39\x9e\xf2\xc9\x0d\x4f\x79\x18\xf2\xf4\xba\xc0\xd3\xab\xe1\xe9\x75\x81\xa7\x57\xc3\xd3\xeb\x32\x4f\xaf\x39\x9e\x7e\x0d\x25\x1b\x66\x64\x0f\x97\xc6\xd5\x30\x37\xae\x30\xcc\x86\x19\x47\xc3\x25\x8e\x86\x39\x8e\xf2\xc9\x0d\x47\x79\x18\x72\xf4\x69\xb8\xc0\xd2\xd0\xb0\x34\x5c\x60\x69\x68\x58\x1a\x2e\xb3\x34\xfc\xf7\x2e\xd8\x69\x7b\x1d\xdd\xf9\x46\x73\xed\x34\x42\x92\x46\x19\x57\xa3\x25\xae\x46\x39\xae\xf2\xc9\x0d\x57\x79\x18\x72\x35\x5a\x60\x6a\x64\x98\x1a\x2d\x30\x35\x32\x4c\x8d\x96\x99\x1a\xe5\x98\xba\x1f\x4a\xd6\x9d\x23\xbb\x8b\x65\x76\x33\xb2\xbb\x4b\x64\x77\x73\x64\xe7\x93\x1b\xb2\xf3\x30\x24\xbb\xbb\x40\x76\xd7\x90\xdd\x5d\x20\xbb\x6b\xc8\xee\x2e\x93\xdd\xcd\x91\xfd\x30\x94\xac\x9e\x1b\xea\xf5\xa5\xfe\x55\xcf\xf5\x2f\x0c\xb3\x7a\xc6\x52\x7d\x89\xa5\x7a\x8e\xa5\x7c\x72\xc3\x52\x1e\x86\x2c\xd5\x17\x58\xaa\x1b\x96\xea\x0b\x2c\xd5\x0d\x4b\xf5\x65\x96\xea\x39\x96\xaa\x43\xc9\x5e\x32\x96\x5e\x96\x38\x7a\xc9\x71\x84\x61\xf6\x92\x71\xf4\xb2\xc4\xd1\x4b\x8e\xa3\x7c\x72\xc3\x51\x1e\x86\x1c\xbd\x2c\x70\xf4\x62\x38\x7a\x59\xe0\xe8\xc5\x70\xf4\xb2\xcc\xd1\xcb\xbf\x0e\x98\xbb\xae\xec\x35\x5b\x8d\xc4\x2c\x46\x9d\xb9\xde\xd7\x41\xaa\x3a\x19\x63\x9d\x25\xc6\x3a\x86\xb1\x4f\xe3\xf1\x5c\x7a\xc3\x59\x1e\x86\x9c\x75\x16\x38\xeb\x18\xce\x3a\x0b\x9c\x75\x0c\x67\x9d\x65\xce\x3a\xff\xce\xd9\x20\xec\x76\xc3\x60\xbf\x17\x4a\xcd\x5b\x32\xc7\x5b\x82\x74\x25\x19\x6f\xc9\x12\x6f\x49\xae\xd1\xf2\xc9\x0d\x6b\x79\x18\xb2\x96\x2c\xb0\x96\x18\xd6\x92\x05\xd6\x12\xc3\x5a\xb2\xcc\x5a\xf2\xaf\xac\xdd\xca\x24\x0e\xef\xc2\x56\xa8\xac\xff\x8c\xe7\xf8\x1a\x23\x51\xe3\x8c\xaf\xb1\x29\x1b\xb3\x09\xf5\xd9\xbe\xd1\xf0\xfe\x3c\xfc\xd7\x48\xfe\x3f\x6a\x0b\x2b\x87\x83\xfc\x31\x97\xfb\x0f\xf6\x47\xf9\x0f\xf6\xd6\x95\x7e\x53\xc6\x61\xdf\x5e\xab\xfd\xe1\x77\x7a\x21\xea\xc5\xff\xc1\xd6\xfe\x88\xe5\x30\x0e\x21\x10\x84\x91\x1c\xb6\x10\x16\x75\x7a\x6d\x89\xa1\x61\x03\xfe\x0e\xa4\xd7\x0a\xff\x70\xa1\xa8\x79\x62\xf1\x27\x20\x6f\x1b\xed\x4e\x30\x6c\x85\x1b\xf6\xc6\x5c\xd9\x1b\x6c\x63\x14\xf6\xfa\x10\xb2\x37\xca\xdc\xda\x60\x1b\x30\x8b\x74\x12\x20\x7e\xc3\xae\x6d\x0c\x1b\x08\xd2\xe4\x6c\xb0\x0d\x4d\xc4\x06\xdb\x88\x95\xbd\xb3\x0d\x45\xcb\xc6\x8a\xc2\x97\x6b\x6a\x4d\xe4\x1c\x0e\xad\xad\xa8\x2c\x67\xe6\x34\xa2\x35\xb2\x02\x4f\xdf\xef\x35\xba\x83\xfe\x5a\xa1\xb0\xf6\x71\x6c\x6d\xa1\x6a\x5d\xba\xf6\x46\xf2\x25\xe2\xd9\xb1\xc6\x24\xfe\x1b\x44\x4e\xd4\xe9\xad\xe1\xf9\x6f\x63\x4d\xac\x59\xce\x5a\x63\xed\xab\xc1\xc4\xd5\x1b\x5f\x67\xad\x51\x2c\xd2\xb5\xb7\x7f\xab\x04\x62\xca\x68\x00\xbf\x33\x4a\xa8\xf3\x5f\x10\xb2\x26\xf0\xed\x85\xce\xf8\xe9\xff\x0b\x00\x00\xff\xff\xb7\x00\xe1\x6b\x79\xa1\x0a\x00") func pagesAssetsJsGchartsJsBytes() ([]byte, error) { return bindataRead( @@ -150,7 +150,7 @@ func pagesAssetsJsGchartsJs() (*asset, error) { return a, nil } -var _pagesAssetsJsGoogleJsapiJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\x3c\x7b\x57\xdb\xc6\xf2\xff\xe7\x53\x98\x3d\xf9\x81\x54\x0b\xd9\xb2\xc1\x18\x3b\xba\x9c\x3c\x48\x4a\x43\x42\x1a\x48\xee\x6d\x5c\x97\xb3\x92\x56\xb6\x82\x6d\xb9\x92\x0c\xa1\xc1\xdf\xfd\x37\xb3\xab\xb7\xd7\x10\x40\xe9\x39\x37\x58\xfb\x98\xd9\x79\xcf\xec\x48\xb7\x9e\xab\x6c\x5c\x79\x33\xc7\xbf\x1a\x6c\x8d\x7c\x7f\x34\x61\xc7\x67\xe7\x5b\x43\xf5\xbb\x64\xd2\x54\x66\xec\xaa\xf6\x8a\x46\x4c\x51\x55\x7d\xc4\xa2\x33\x6f\x0a\x8f\xfd\xa5\xe7\xd6\xca\x58\x00\x45\xed\xfb\x93\xf2\x5c\xcd\xac\x7d\x5f\xf6\x9f\x2c\x9f\x48\x21\x06\x5b\x13\x9f\x3a\x2c\x90\xc3\x66\xab\x31\x16\xb1\xa0\x8b\x59\xfd\x94\x05\x97\x9e\xcd\x5e\xd0\x90\xc1\xfa\xd6\x38\x8a\xe6\x61\xaf\xd1\xb8\xba\xba\xd2\xe3\x8d\xb6\x3f\x6d\x2c\x9c\x70\xab\x0c\xf9\x86\x8f\x9e\xcf\xbd\xb0\x0c\x4c\xbf\xd2\x6f\x31\x34\x85\x65\x8e\x01\xe7\x56\x50\x00\xf0\x5b\x76\x8d\xa0\x33\x3f\x0a\x17\xf3\xf9\xc4\x63\xce\xca\x2e\xd8\xf2\x99\x05\x9e\x0b\x6b\xb0\x35\x0a\x16\xac\xbc\xe3\x18\x7e\x5e\x53\x6f\xb2\x08\x90\x0e\x97\x4e\xc2\x95\x2d\xa7\xcc\x16\xab\x32\x78\xc1\xca\xb1\x6f\xd3\x09\x67\xa4\xc8\xfd\x0a\x41\x2f\x81\xcc\x59\x84\xdb\x23\xcf\x9f\x01\xc0\x6c\x31\x99\xac\xf0\xe6\x38\x1e\x2e\xd3\xc9\x07\x1a\xd0\x69\x88\x78\x01\x93\xe2\x2e\x66\x36\xce\x2b\xa0\xac\x4b\x1a\xd4\x1c\x93\xcd\x6c\xdf\x61\x9f\x3e\x1e\xbd\xf4\xa7\x73\x7f\x06\xa8\xb5\x91\x29\xd4\xa8\x8d\x4d\xc7\xb7\x17\x53\x98\xeb\x27\x80\xb5\x89\x42\x35\x4b\xfd\x1e\xb0\x68\x11\xcc\x6a\x94\x1f\x68\x5a\x4b\x44\x36\x35\x49\xc0\xe6\x13\x6a\x33\xa2\xcd\x4c\x62\x8f\x69\xf0\x3c\x22\xda\xdf\x26\x89\xcd\x8e\x68\x81\x49\x42\xf1\xec\x2f\x60\x29\x32\xc9\x7c\x11\x8e\x89\xb6\x30\x09\x1c\xc9\xbe\x9d\xb8\x44\xbb\x34\x49\xce\x2e\x88\x76\x65\x92\x19\x45\xe0\x6f\x26\x99\xb0\xd9\x28\x82\xfd\xd7\x00\x18\xf8\x91\x1f\x5d\xcf\x61\xe1\x1f\x58\xe0\x7c\x13\xed\x39\x1c\xb0\xb0\xc2\x28\xf0\x66\x23\xa2\xbd\x30\xc9\x57\xdf\x9b\x11\xed\xa5\x49\x22\xff\xd8\xbf\x62\xc1\x4b\xc4\x99\xb1\xf3\x4a\xa1\x19\x33\x35\x6f\x56\x3b\x3c\x38\x1c\xd0\x61\x0f\xff\x98\xdb\xc6\x86\x39\xa3\x97\xde\x88\x46\x7e\xa0\x2f\x42\x16\x3c\x1f\x81\x30\x06\x2f\x87\x8a\x3a\x58\x0c\x01\x94\xf3\x7d\x68\x82\x65\xa7\x18\x5f\x0b\x01\xe1\x82\x6d\x66\xf2\x86\x2d\xb6\x9e\xd2\x6c\x5a\x83\xeb\x61\x9f\xea\x9f\x92\x87\x6c\x05\xdd\xd5\x5e\x3e\x49\xf1\xbd\x41\x7c\x9a\x2d\x30\x32\xf3\x79\x10\xd0\x6b\x80\xd1\xc3\x09\x48\x48\x07\xa3\x01\x8d\x04\x23\xae\xa5\x50\x6b\xa9\x37\x37\x83\x61\x3f\x66\x28\x77\x7a\xaa\x2f\x0a\x76\x7e\xad\x58\x1a\x1a\xd7\x0c\x6c\x48\xb9\x15\xa1\xaa\xaa\xcb\x65\x4a\xca\xaf\x28\x2c\x6a\x1e\x06\x81\x1f\xc0\x23\x90\x1d\xf9\xa7\x5c\xd4\xe6\xea\x51\xd1\x18\x9c\x6f\xca\xc2\x90\x8e\xd8\x32\xa1\x88\x66\xc8\x8e\x84\x9c\x5c\x40\x25\x64\x45\xf5\x10\x5c\x30\x52\x1a\x7f\xea\x0d\x55\x63\xe6\x48\x73\xcd\x66\xdf\x7d\x66\x0f\xbe\x0d\xb7\x8d\xbe\x5b\xaf\xab\x6c\x60\x0f\xdc\xe1\xf0\xe6\x46\x89\x9f\x40\xf2\xb8\x35\x1e\xf5\xf1\x57\x6c\x87\x25\x2b\x3b\xeb\xb7\x44\x86\x74\x60\x0d\x4d\x7b\x89\x01\xf4\xad\x8a\xc7\xbe\x35\x8f\xfa\x38\x3a\xe6\xa3\x63\xf3\xb7\xbe\x70\xa4\xc1\x3f\x43\xfd\x12\xf5\xfa\x56\x21\x45\xd7\x42\x01\x59\xd4\xbe\x08\x89\x96\xdb\xaa\xf6\x11\xfe\x1d\x40\x68\xef\x11\x2c\x5b\x62\x97\x74\x22\x45\x84\x0b\x79\x1c\x38\x56\xfb\x4f\x26\x8a\x98\xd2\x52\x91\xc6\xb4\xa7\xdc\x30\x54\x03\x1e\x67\xa5\x32\x23\x3a\x51\x91\x8f\xd6\x33\x0b\xd8\x57\xa3\x71\xe0\x5f\x81\xba\xc8\x3b\xdf\x59\x4c\x58\xaf\xb6\x45\xea\xb4\x4e\xb6\x6a\x10\xe9\x6a\xae\xbf\x98\x39\x1b\xb0\x9f\xc0\x2f\x73\xbd\x19\x73\xc8\x86\x89\xb6\xe7\xbb\x35\x6b\x60\x0c\x37\x37\x15\x17\xec\xb2\x39\xd4\xc0\x62\x81\x53\x50\x60\x68\x66\x8f\x68\x61\xb9\x95\x41\x34\x54\x10\x4a\x15\xce\xe0\x9a\xb4\x6f\x9b\xf6\xcd\x0d\xb0\x0c\x04\xa1\x4f\x85\x11\x9d\xd9\x88\x9c\x9b\xda\xcd\x0d\xdd\xdc\x24\xbe\xf5\x95\xd9\x11\x31\x93\x73\x71\x2e\x61\x30\x37\x3b\x78\x31\x94\x2f\xe8\x01\xbb\x64\x41\xc8\xd4\xc4\x7e\x2e\xc0\x56\x2e\x9e\x51\xe0\xbe\x7f\x81\x96\xa2\xd0\xc1\xc5\x50\xed\x33\x88\xc6\x5c\x60\x9c\x18\xf3\xdd\x80\xf4\x48\xdd\x85\x54\x69\x6f\x6e\x6e\xd8\xfa\x84\xce\x46\x0b\xe0\x62\x73\x13\x9e\x79\x04\x06\xe6\xb3\x69\x33\x99\x55\xfb\xb0\x9f\xc4\x61\x25\xa5\xc2\x4e\x8d\x01\xa0\x2e\xcc\x6c\xa8\x5d\xe8\x53\x1a\xd9\x63\xa5\xf1\xd7\x60\xf0\xe7\xf0\xf9\xf6\x17\xba\xfd\x4f\x73\x7b\x5f\x3f\x1f\xd6\x9f\x36\x54\xbe\x7b\xc4\x15\xae\x5c\xa8\x5a\x06\x67\x3e\xb9\x50\x39\xa5\x88\x6d\x73\x13\x23\xfb\x46\x0e\x2d\x00\x6e\x80\xc6\x15\x4b\x95\x6a\xd8\x45\x0d\x4f\x17\x61\x54\xb3\x58\x8d\x1b\x99\x03\x4f\x20\x20\x56\x7b\x75\xf2\xae\xe6\xcf\x30\x53\xa1\xe2\x2f\x0e\xa8\x3e\x55\xd0\xa8\x0e\x46\x83\x60\xa8\xe4\x08\x6f\xaa\x3d\x11\xd3\xf9\x72\x2f\xd9\x07\x4a\xcb\x66\x97\x5c\xa8\x6b\x29\x28\xd8\xd8\x52\x2d\x19\x7e\x62\xf1\x7c\xa0\xa6\x79\xeb\xcc\xcc\x9b\xbb\xfa\xdd\x3a\x50\x9a\xa6\x79\x02\xea\x04\x61\x7d\x50\x46\x1a\x11\xc0\xbf\xab\xda\xc6\x2b\x85\x4c\x43\x8f\x11\x14\x07\x3c\x87\xd4\xa5\x81\x97\x8c\x2e\xfc\xd9\xdf\x0b\x06\x01\x0a\x27\x70\xa7\xff\x8f\x37\x99\x50\x02\x2c\x8c\x74\x7f\xce\x02\x7a\x30\xd2\xa9\xe3\x1c\x5e\x62\x16\xf5\xc2\x88\xcd\x58\xa0\x10\x10\xd0\x4b\x7f\x16\xf1\xcc\x8a\x82\x83\x93\xb4\x0d\x43\xed\xa5\x67\x1d\x8c\xf5\xab\xc0\x83\x2a\x8a\x3c\x0b\xed\xc0\x9b\x47\x35\xf0\x1d\x16\x80\x54\x03\x46\x9d\x6b\xb0\xf1\x88\x41\xc6\x9b\x81\xd1\x6c\x15\xfd\xdc\xf1\xa7\x1f\x71\x8b\xa2\x6e\xd5\xc2\xc0\x36\x1b\x8d\xde\x7f\xfe\xfc\xd6\xb6\x1b\x02\xcf\x7f\x88\xda\x53\x72\x6c\xdc\xdc\x14\xb9\x00\x36\xb8\x92\x4e\x35\xa3\xa9\xaa\xda\x09\xfa\x1b\x55\xd5\x5e\x4e\x28\x90\x87\x72\x52\x86\x04\x7b\xc2\x55\xfd\x32\x56\x6a\x2a\xf2\x33\x90\x77\x1a\x45\x3e\x24\x71\x05\x1d\x63\x45\x22\xea\xea\x14\xea\x1e\x65\x22\x7c\x4a\x40\x45\x11\xb5\xc7\x7c\x97\x5a\x18\x29\x04\xbc\xb5\x8e\xe8\xf9\xee\x38\x77\xd1\x81\x98\x86\x84\x97\x3c\x99\xc2\xc6\xd9\x01\xa5\xca\xc0\xd6\xd8\x50\xed\xd9\xb9\x8c\x03\xb3\x59\x7e\xce\xe5\x98\xc4\xeb\x2d\xf0\x7a\x4b\x78\xbd\x05\x5e\x8f\xe1\x5d\x81\x8c\x85\x4b\x27\x26\x24\xc2\x2c\xba\x7e\xc8\xa7\x28\x5c\xa7\xdc\x03\x81\x56\x1d\x94\x72\x38\x61\xbc\xcc\x21\x50\x71\xcd\x27\x2c\x62\xe0\xe4\x18\x63\x40\x6d\xa7\xa8\x59\x30\x42\xaa\x4b\x54\x8d\xd4\x6b\x90\xbd\x69\x00\xd0\xef\xa1\x90\x02\x98\xa9\x7f\xc9\x5e\x8e\xbd\x89\x03\xa4\x6b\xbf\x43\xd5\x2d\x89\xfd\x89\x4d\xe4\xe3\xff\x07\x91\x43\x2c\x6a\x7e\x17\xce\xdb\xdb\x68\x6a\x09\x3d\xf0\x9c\xab\x31\x4e\x81\x07\x8b\x0e\xc6\x39\x0a\x87\x07\x70\x54\xaf\xf9\x4c\xb8\x4c\x66\x31\xb9\x4a\xe2\xf7\x9c\xe0\x28\x08\x8e\xf2\xcd\x7d\x0a\x82\x3b\x81\x72\x07\x2e\x05\x27\xba\x28\xb0\xcc\xe6\x32\xa3\xcb\x31\xcb\x99\x08\x74\x9f\xd4\x23\x7d\x22\xac\x18\xe5\x75\xa0\x30\x73\xac\xdb\x40\x53\xc4\x62\x81\x2a\xc9\x32\x64\x69\x9d\x97\x37\x24\x62\xdf\xa2\xc6\x57\x7a\x49\xe3\x15\x58\x40\xaf\xb0\xd4\x1e\xb1\xc3\x10\xf1\x80\xb0\x25\x88\x26\xde\xec\xa2\x8c\x06\x01\x60\x66\x1c\x30\x48\x58\x1a\x0a\x7f\x02\xf5\x5f\x74\x3d\x61\xe1\x98\x31\x38\xb5\x0f\x31\x7f\x8c\xb7\x9e\x18\x4d\xf8\xe2\xfa\x8c\x8e\xde\x43\x39\xa9\x90\x31\xc8\x8e\xa8\x90\xe6\xc0\xe5\xf8\x36\xcb\x77\xae\xf3\xaa\x84\x52\x89\xcd\x1c\xa1\xca\x15\x72\x04\xb4\x8a\x45\x50\x7e\x1f\x13\xd1\x31\x2f\x95\x24\x70\x6c\x25\x81\x03\xd9\x25\x5b\x75\xab\xbe\x45\x6a\x72\x99\x14\xe2\xc3\x56\x5e\x32\x19\x32\x94\x47\x8d\x73\x2e\xc1\x85\xfb\x6b\x65\x69\xfc\xe7\x59\x03\x81\x00\x21\x5c\xc4\x56\x4c\x92\xe3\xc5\xb0\x01\x02\xca\x9b\x25\x04\xe9\x6c\xf0\x7b\xce\x16\xd4\xef\xef\x4d\x2a\xb1\xed\xc0\x9d\xe6\xe1\x7f\xcf\xc3\x9f\x16\xe0\x53\x2f\xc6\xc2\x9b\xaa\x2b\xf9\xd5\xda\xdc\x84\xff\x41\xc6\x36\xa1\x1c\x99\x0d\x95\x26\xc6\xf8\x77\xe0\xe3\x60\x21\xf8\xc3\x6b\xe5\x33\xa8\x3e\x9e\x0f\x15\x43\xd5\xd0\xfb\xa5\xde\x16\xcc\x0b\x85\xd6\x69\x9e\xa2\x8f\x05\x8a\x30\xf5\x52\x5e\x55\x31\x3b\x84\xd3\x30\xb2\xa8\x92\x60\x53\xaf\xa7\x25\x3e\x9e\xda\x5f\x2d\x0d\x0e\x44\xa9\x61\x0b\x22\x3f\x81\xc3\xf4\x14\x9b\x3f\x7f\x56\xec\xc1\x15\x56\x50\x16\x5c\x45\x4e\xe1\x20\x2c\x00\x20\x6b\xfb\xd3\x53\x7e\xaa\x16\x43\xc2\x26\xa8\x55\x21\x9a\x49\x18\x2a\x48\xf8\x63\x9e\x1f\x11\x3a\x0a\x4c\x09\x7c\x90\xca\x79\xa2\x86\x2d\x78\x71\x91\x58\xc0\x24\xce\x7c\x65\x64\x79\xf4\x27\xab\x95\x3e\xf9\xdb\x73\x4c\x52\x57\xd2\x46\x83\x3a\xf8\x1b\x82\x49\x7a\x37\x50\x8c\x8e\x5a\x7f\x47\xa3\xb1\xee\x4e\x7c\x10\xa5\x71\xb8\xf7\x0b\x1f\x06\x14\x6e\x99\x53\x6c\x4b\xe4\xb7\xca\x14\x28\x7c\xef\xcd\xc2\x73\x9e\x07\xa3\xf3\x3c\x85\x27\x6a\xff\x28\xd9\x7d\xce\xbe\xcd\xfd\x20\x3a\xbd\x9e\x5a\x3e\x28\xfc\x68\x75\xe9\x43\x80\x15\x40\x04\x61\xf7\xb7\x3c\x53\x54\x5a\x9f\x47\x63\x70\xf5\x42\x95\x4f\x0b\x40\xfa\x91\x49\x56\x7a\x15\x76\xc8\x1a\xdc\xe5\x1a\xc0\xeb\x45\xc3\x5a\x58\xd6\x84\xc1\x65\x4a\x47\x8f\xec\x1f\x2b\x39\x78\x8d\xbc\xf8\xf4\xe2\xc5\xf1\xe1\x9b\x4f\xef\x0a\x87\xe8\x47\xc5\x63\xde\xde\x7d\xcc\x28\x60\x6c\x16\x5e\x5c\x4b\x4f\x79\xf3\xf1\xf0\xf0\xfd\xe9\xdb\x3f\x8a\x87\xbc\x4d\x6b\x2f\x31\xfe\xed\xee\x53\x58\x38\x0f\xe0\x3e\xe7\x4b\x4f\x39\x3c\xfd\xf0\xf1\xf0\xf4\xf4\xa4\x78\x4a\x51\xcc\xfa\xbb\xbb\x0f\x09\xc7\xde\x4c\xce\xc7\xe9\xaf\x47\xef\x4b\x4c\xbc\x2b\xa2\x3f\xbe\x1b\xfd\xd4\x9b\x79\x53\x3a\x81\x92\x46\x7a\xc6\xbb\xa3\xf7\x47\xef\x9e\x1f\x1f\x9d\x9e\x15\x0f\x3a\x2e\x1e\xf4\xfe\xee\x83\x2e\x5b\x0d\x28\x10\xe9\x62\x22\x3f\xe8\x73\xeb\xfc\xd5\xe1\xeb\xe7\x9f\x8e\x4b\x07\xbd\x57\xb3\x2c\xff\x09\x9d\x97\x5f\xa3\xe1\xa2\xd7\xe7\x0f\x3e\x16\x35\xfc\x69\x86\x36\xcb\x9f\x58\xfa\xe4\xa6\x4f\x5f\xcd\x8d\xa6\x78\xb2\xcd\x6d\x63\xf9\xe4\x13\x5e\xf0\x47\xa5\x1a\x5b\xc4\x2f\x42\xfa\x97\xbe\xe7\xd4\x9a\x1b\x26\x04\x5b\x25\x7d\xce\xdd\x8d\x14\xbb\x6e\x92\xcd\x31\x64\x93\x3a\xdc\x00\xd2\x05\xa8\x46\xb3\xdd\x33\x1f\xd8\x4c\xb6\xfa\x8b\x68\xbe\x88\xf8\x76\xc2\x17\xe0\x31\xde\x52\x02\xf2\x27\x0e\x36\x77\x52\xc8\x6c\x26\x3e\x2c\x9b\x28\x40\x26\xb7\xcf\x04\x2e\xbd\xa7\x0a\xa8\x64\x08\x30\xa2\xc0\xb4\xf2\x57\x35\x0e\x41\xc3\xeb\x99\x6d\xb6\x48\x1e\x2b\xd7\x5f\xb2\x81\x0f\x62\x7c\xfc\xb9\x44\x3a\x84\x94\x8c\x6a\x18\x98\xd8\xdc\x2b\xa0\xf3\x21\x84\x04\xe7\x73\xde\x81\x4b\xb6\xa2\x20\xf2\xf3\xe2\xbe\xb7\x21\xb4\xa6\x7e\x8f\x6d\x41\x68\x1d\x0b\xb9\xc2\x58\xff\xed\xf4\x57\x1a\x8e\x53\x0a\xbd\x11\xa7\x4f\xba\x09\x10\x3f\x11\x65\x37\x5c\xd7\xdd\x3e\x26\x31\x17\xf3\xac\xb0\x1e\x95\x67\x55\x37\xc9\xaa\x0c\x6f\x15\xae\xc8\xa3\x6a\x69\x2f\x2b\xed\x15\x93\x03\x77\x58\x06\x13\x56\x42\x2f\x85\xd0\x18\xdc\xdd\x15\xa2\x41\x8d\xb4\x8c\xeb\xf7\xd4\xce\x07\x97\xc3\x3a\x69\x1c\xb8\x1e\x97\xaf\x20\xbb\x4e\x36\x2f\x4d\xec\x52\x64\xde\x50\x6e\x62\xd6\xed\x65\x9f\x1b\x72\x54\x48\x6f\x22\x35\xf3\x2e\x28\x96\x8e\xd8\x14\x49\xd5\xdf\x17\x36\xce\x17\x41\xcc\x96\x0a\x7f\x56\xcb\x0c\xd5\x36\x07\x19\xd0\x30\xbd\xe0\x58\x49\xf6\xb7\x51\x86\xa2\x64\xb6\x92\x92\x79\x15\x0d\xd4\xd0\x9b\x9b\xb6\xe8\x87\xd0\xe1\x60\x3a\x84\xeb\xff\x9f\xe1\x2f\x37\xf0\xef\x69\x43\x23\x50\x6b\x62\xe3\x10\xe4\x04\xf5\x26\x60\x24\x71\x7c\x20\x43\xb5\x6f\xa1\x5f\xe3\x49\xe2\x10\x3b\x39\x44\x28\x2b\xae\x07\x28\x76\xbe\x2c\xc4\x8f\xcf\x6a\xd2\x53\xb3\x96\xd8\x34\x42\xc1\x68\x32\xff\xe6\x28\x22\x60\x5d\x63\xe8\xe0\x65\x77\x40\xb1\x30\x55\x74\x6e\x30\x81\xff\x57\xc9\xd6\x84\x25\x88\xee\x0a\x08\x60\x6e\xc6\xad\xb8\xe6\x33\x73\xde\x9f\x6f\x6f\x8b\x23\x42\x98\x9e\x83\xd0\x36\x37\x5d\xfd\x85\x12\x72\x7b\x8e\x6d\x04\xe9\x0e\x87\xaa\xcd\xbb\x54\x36\x53\xe6\x1a\x94\x69\x2c\x36\x21\x37\x5e\xe6\x36\x14\xdf\x2a\x2f\x70\x10\xaa\xd8\xa0\xc3\xb3\xe0\x96\x03\x25\x60\xde\xd9\xad\x7c\x47\x2a\x84\x94\xae\xa8\xa9\x9d\x71\x6a\xe7\x20\xc0\xf9\xb3\x0b\x14\xe0\x1c\x04\x18\x9a\x17\x40\x9c\x56\x38\x10\x79\x59\x43\x04\x2a\xfd\xe6\x06\x65\x64\x9a\xef\xf9\x52\xec\x54\xd2\x49\x1d\x5b\x50\x20\xee\x50\x14\x58\xb0\x69\xbd\xf1\xde\xdc\x24\x3e\xce\x59\xa2\x8b\xc8\x17\xd5\x55\x1e\xc8\x49\xef\x4b\x82\xe2\x11\x57\xa4\xc6\xe2\x5b\xb4\x5d\x3c\x3e\x4d\xe0\xf1\xd8\x2c\x0e\x79\x0b\x2e\x51\xe0\x47\x74\x67\xde\x80\xc6\x02\xc8\x03\xd7\xf8\x18\x57\xd6\x1f\x13\xbf\x2e\x85\x91\xc1\x47\xe1\xd7\x43\x33\x0f\x36\xf8\x38\xcc\xa7\xc2\x1c\xc1\x05\xef\xc6\xf6\x60\x34\x86\x9f\xaf\x21\x52\x6f\xeb\x3c\x39\x14\xe0\xf8\xdd\x4d\x0e\x04\x4b\x00\xb5\x14\xf2\x02\xc2\x92\x94\x66\x68\x71\x4a\x2b\x95\x9a\x9a\xb1\x21\xcc\xdc\xfe\x3f\xa3\xd9\x4c\x00\x30\xf3\xdd\x6d\x14\x89\x91\x42\xc2\x5c\x2e\x21\x64\xf2\x00\x33\x29\x04\x98\xed\x14\x3d\xa0\xfe\x9f\x42\xe8\xe4\x3c\xd1\x81\x46\xbe\x4e\xf4\xd5\xda\x77\x5b\x6c\x57\xb5\x8d\xa6\xaa\x65\xc4\x24\x39\x5c\xfc\x24\x0d\x78\x8a\xe5\x83\x78\xf5\x12\xe6\x64\x9b\xa9\x51\x59\x99\xc3\xb6\xf7\xea\xce\xcc\x35\xe2\x03\x78\x47\x1f\x74\xdb\x2f\xdd\x60\x72\x07\x26\x9d\x93\xef\xb9\x48\x53\x58\xb7\x86\xc3\xb4\x96\x60\x6b\x96\x8d\x7e\x2e\xd4\xb8\xd2\x4d\x7d\xd1\x33\x48\x08\x61\x40\x08\x13\x61\x8e\xc1\xe9\xf6\x00\xae\x25\x2f\x95\x12\x90\xda\x77\x18\xf6\x3e\x6a\xb7\xe0\x5d\x2e\xe3\x9c\x30\x2d\x15\x37\x71\x70\x6c\x9a\x59\x00\x84\xd3\xe2\xcd\xe1\xea\x2d\x06\xfb\x2b\x59\xab\xe4\xbf\x69\xe9\xf5\x3a\x29\xbd\xfe\x4e\x8b\xab\xc0\x6c\x2e\xff\x8b\x68\x5e\x14\xcc\x44\xac\xd5\xeb\xf1\xf6\x38\x26\xa0\x5d\xf5\xf9\xee\x97\xab\xbb\x93\x4d\x89\xc9\x66\x40\xb1\xa9\x07\xdb\xdb\x5a\xc2\x42\x10\xb7\x75\x04\x59\x5a\x13\x6f\x4a\x29\xc1\x9f\x93\xde\x8c\xd0\x23\xd4\x4b\x09\xdd\xaf\x4c\x4b\x3c\x40\xf8\x16\x0f\x0b\x81\x6f\x8c\x8a\xe3\x4f\x17\xc5\x56\xd9\x25\x37\x28\x7e\xfd\x7c\x23\x4e\x9b\x70\x6a\xd4\xe5\x6b\xe5\xb3\xf6\x49\xed\x4f\x94\xcf\xeb\xb2\x8d\x2c\xc3\xd8\x07\x02\x0b\x0f\xee\xb9\xec\xa2\x65\xcf\xe6\xba\x97\x2c\xba\xf0\x34\x20\x46\xed\x25\x54\x83\x0d\xdf\x3b\x84\xc2\x3d\x5a\xed\x7f\xbe\xc5\x50\x24\x84\x1f\x08\x69\xc5\xe7\x2e\x05\xf8\x24\x6f\x3a\xb1\x38\x81\xa2\x62\x5f\x2d\x66\x37\x4e\xe2\x99\xd6\x2e\x20\x6f\x83\xe2\x32\xa9\x2f\x45\x8d\xf6\x87\x9c\x26\xaa\x8b\x1a\xe3\xc0\x51\x92\x47\xb5\x4e\x44\x49\x8a\xbd\xf9\x80\x8d\xd8\xb7\x03\x8b\x57\x1a\xca\x5f\xfa\x2f\x4f\xd5\x86\x16\xcf\xaa\x3d\x42\x62\x8a\xcb\x65\x7f\xfe\xfd\x5c\xac\xdf\x2b\x6c\x55\xe2\x22\xd0\xc3\x61\xde\xac\xf4\xfc\x84\xd7\xc2\x65\x81\xea\x17\xec\x1a\x5b\x74\xa2\x9a\xfd\x43\xe1\x13\xb9\x4b\x8c\x78\xaf\xce\x3b\x63\x71\x7e\x2c\xee\x8e\x27\xe1\x34\xac\x7b\x72\x6d\x19\xfe\x92\x7c\x73\x13\x58\x0d\x27\x07\xfc\x2f\xf0\xb8\x08\x3c\x8c\x1d\xf1\xab\x90\xb4\x17\xc3\xcb\x53\x5b\xe5\xad\x57\xc8\xae\x50\x8d\x1e\xe4\x8e\x48\x27\x35\x7c\x2f\x08\xb2\xc8\x57\xdc\x58\xcb\x26\x9b\x71\xb9\x47\xb0\x11\x73\xee\xf8\x53\xea\xe1\x2b\x26\x97\x17\x91\x04\xbf\x27\xe8\x35\x1a\x62\x4f\x9d\x13\x82\x09\x51\x3c\x2c\xa0\xe4\x68\x10\x6d\x0f\x1b\x80\xb9\xb4\xc9\x7d\x06\xc2\xc4\xb6\x81\x1d\x2b\xdc\x74\x80\xaf\x21\x18\xef\x68\xc2\x73\x9d\x25\xb5\x72\x62\x75\x75\x16\x6b\x29\x2c\x44\x87\xbc\x8e\x50\x39\x3a\x7f\xd9\x10\x30\x27\xde\x7d\x55\xee\x5a\x09\x0f\x2f\xb5\xaa\xc4\x64\xa9\x5f\x15\x4f\x5a\x3c\x24\xf3\xbc\xf5\x91\x8d\x0e\xbf\xcd\x15\x9e\x7e\x23\x16\xcc\xb0\x21\xc3\xc2\x08\xdf\x32\xc4\x74\xd8\xcb\x3c\x41\xaf\x72\x71\xe7\x4c\xd8\x54\xf1\x96\xea\x25\x21\x07\x43\x0c\x04\x8d\x33\x11\x34\xce\x56\x83\x46\xe6\xd2\x77\x7a\xf0\x86\x81\x2e\x7c\x56\x72\xe1\xa2\xa8\xc0\x49\xcf\x56\x9c\x34\x9e\x2b\xbb\x41\x7a\xeb\xf2\xca\x65\x5c\x26\x50\x4f\xa7\x13\x0f\x8c\x23\x2c\x08\x2f\x9d\x8d\xf7\xe3\xbb\x41\x28\xdc\x6d\x5e\xb6\xae\xc3\x29\x7b\x5d\x96\xdc\x7c\xb6\x6a\x57\x5e\x34\xae\xc5\x20\xf2\x97\xb5\x2b\x97\xa8\xd2\x27\x30\x70\xa1\x9a\x78\x56\xd8\xc8\xb0\x36\x38\x9a\x64\x62\x85\xa2\x01\x0f\xa2\x20\x12\xc8\xa7\xd8\xd6\x61\xce\x01\xc9\x8f\x60\x57\x6e\x80\x91\xea\x6c\x5d\xea\x34\x96\xa2\x00\xa0\x98\xb7\xbe\x60\x79\xed\xd0\x95\x1a\xcd\xa5\x79\x48\x9b\x42\x5d\xc3\x5f\x61\x2d\x66\xe2\x25\x16\x83\x10\x84\x18\x9a\xea\x52\x1b\xd1\x92\xb2\x5c\xaa\x88\x7b\xb2\x52\x8e\x17\xf9\xd8\x7f\x32\x47\x08\x28\x34\x37\xa0\x62\x33\x57\xe6\xa1\xae\xf4\xd4\xfc\x17\x07\xcd\xbe\x2d\xda\xb9\x36\x7f\x77\x64\x0f\x4d\x08\xb4\xf0\x23\x3e\xf0\xc0\xa8\x3a\xf8\x4b\xbc\xb8\x3d\xd7\x87\xf5\x06\x10\x7b\x9e\x5c\x33\x04\xb0\x95\x00\x5b\x02\xd8\xba\x1b\x98\x27\x83\x37\xca\x53\xde\x97\xd0\x48\xa3\x31\x1a\x15\xbb\x48\xde\x41\x68\x2e\x9c\x10\x6e\xc3\xad\x4d\xca\x45\x80\xd7\xe2\xe4\x92\x03\xd7\x64\x0f\x1b\x2b\x56\x7a\xeb\xd1\x8c\xc3\x1d\x75\xb9\xd4\xfe\xb7\x12\xb2\xed\x83\x11\x55\x30\xe3\x60\x2d\xd5\x53\x50\x86\xda\x17\xcc\xc1\x24\x20\xf5\x2f\x40\x7a\x9c\x4b\x68\x5d\xb1\x0e\xc8\x0d\x20\x85\xa4\x01\x11\x4d\xe3\x34\x32\xaa\xed\x3e\xc3\x5d\x07\xcd\x9e\xb1\x7b\xd8\x86\x72\x03\x74\x94\xd7\x21\xe8\xe3\x0b\xbf\xa4\x89\xc4\xf7\x24\x5f\xcc\xf7\xa1\x6a\xa1\x3c\x02\xf2\x38\x8a\x51\x10\x1b\xeb\xe2\x52\x2c\x42\xab\x46\xc4\x27\x5b\x28\x95\xa7\x0a\x9a\x2a\xbe\x59\x0b\x0f\x90\x36\x64\x6e\x93\x73\x3b\xb3\xb1\xb7\x5c\xb4\xa5\x3a\x88\x72\xb5\xe6\x76\x20\x5e\xf5\xbf\x64\x6f\xb0\x96\xda\x53\x59\x9f\x00\x80\x8e\xa6\x50\x25\x6b\xb6\xf9\x54\xff\x15\xca\xb5\xa7\xfa\x73\xd4\x9e\xd5\xb7\x74\x7f\x26\x3e\x67\x82\x07\x86\x1f\xb9\xe4\xb9\x8d\x6b\x51\xb1\x7b\x09\x9b\xf1\x35\x0e\xed\x8b\xce\xc3\x12\xb1\x60\xe4\x07\x94\x60\x19\x47\x2b\x0d\x7b\x66\xfb\x81\xf3\x32\xf4\xf0\x5d\x1d\x5c\x7b\xa8\xba\x6e\x8f\xd8\xf0\x3f\xc9\xba\x68\x82\x73\xda\x5f\xfb\xc1\xb1\x3f\x1a\xf1\x6f\x9c\x9e\xc2\xa5\xe5\xc9\x52\xad\x29\x49\x26\xca\x5e\x12\x28\xdf\x09\x7f\x91\x41\x7a\x83\xef\xe2\x1b\x2a\xc8\x75\xbe\x8f\x9f\xae\x90\xe4\xe5\x03\xe9\x7d\x27\x90\xd1\x60\x25\x4e\x78\x7c\x43\xde\x24\xf9\x44\x83\xce\x3d\xb8\xcc\x01\x20\xa4\xe5\x78\x33\x7e\x6d\xc7\x66\x76\x70\x3d\x8f\x98\x73\x0b\x04\x94\x07\x78\x4a\xdc\x2f\xe9\xf1\xf1\x52\x23\x71\x3c\x2a\x2c\x5d\xe2\x42\x92\xeb\x48\x0f\x3b\x6a\x1a\x89\xd3\x36\xec\x4b\x2a\xb3\x02\x4c\x3a\x09\xa0\x49\x6b\xb2\xb0\x61\x3c\x21\x70\x4d\x80\x55\x97\x31\x07\x08\x4a\x65\xe1\x06\x1e\x9b\x39\x70\x0d\x9b\xe1\xb7\x28\xb7\xc8\xa4\xd4\xea\x2d\xc0\xc5\xaf\xe9\x8a\x93\x32\x51\x3d\x10\xc9\xc3\xa5\xc7\x3f\x45\xcc\x89\x8f\xcb\x00\x7b\xf8\xd4\xe1\x2f\x04\x11\xbb\xe7\xc0\x4d\xca\x8b\xae\x23\xdf\x9f\x5c\x78\x28\x84\x91\x43\x23\x8a\x2b\x53\xfc\x7b\xe9\x85\x0b\xc8\x76\xff\xf0\x8f\x0d\x73\xa2\x0b\xc7\x54\x7c\x62\xf7\xc3\x42\x0b\x5b\x8d\x18\xa8\x91\x09\x47\x04\xc1\xea\x58\xbc\xdd\x00\x52\xea\xa7\x74\x7e\xab\x0f\xe0\x7a\x9e\x76\x1c\xf3\x76\xe5\x9f\x8b\x66\xb3\xed\xa4\x5f\x97\xae\xe8\x18\x37\x6e\xc3\xc2\x36\x4c\xff\x20\x82\x9f\xe3\x1d\xfc\x12\x90\x73\x0e\x71\xee\x53\x03\x7f\x5b\x1d\xde\xfb\x16\x53\xad\x3b\xdc\x46\x23\xb9\x77\x93\x3c\x90\xac\x93\x54\xfa\xb5\x2d\xce\xa1\xf7\x37\x24\x4e\x70\xf7\xfe\x7f\x37\x2c\x20\x1a\x5e\xf4\xc2\xc4\x5f\x4a\xfb\xa6\xad\xeb\xbf\xa8\x4f\xc9\x72\x88\xae\xc2\x68\x60\x8f\x81\x24\x3a\x83\x52\x8c\x7b\x40\x78\x7e\xd9\x22\x08\x73\xcd\xbf\x26\x80\xc7\x2b\x7a\xc9\xe0\xc7\x0f\x2e\xf0\x83\xd6\xd4\xc2\x72\x20\xf7\xf0\x91\x80\x5d\x7a\xec\x2a\x8c\xa3\x01\x08\x25\x77\x30\x04\xd5\x08\x68\xa7\x73\xbd\x3a\xf7\xa9\x4e\x90\x60\x26\x50\xa9\x46\x41\x91\x92\x51\x12\x79\x53\x38\x8d\x80\x50\xf1\x0b\x5e\x32\xf7\xec\x0b\xfc\x62\x97\x50\x8c\xc9\x84\xc5\x1f\x68\x40\xa5\xa9\x96\xbf\x66\x0e\x5c\x4c\x65\xbd\x58\x1f\x70\x40\x52\xca\xe2\x73\xcf\x80\x83\x0c\xc0\xd0\x33\xf4\x26\x7f\x14\x4a\x85\x8d\x84\x5b\x95\x00\x6b\xc0\x6a\xa3\xd5\xa5\xac\x65\xb5\x9a\xbb\xfb\x5d\xd6\xdd\xdb\x69\xb7\xec\xce\x0e\x35\x76\x77\x76\xbb\x6d\xbb\xe5\xda\x1d\xb8\xd2\x11\x90\x6e\x2f\x69\xcd\xd7\xd9\x4c\x3f\x12\xf2\xc6\x76\x65\x61\x9e\xf7\x2f\x49\xd6\x19\xe5\xb4\x88\x57\x2f\xb0\xf1\xae\x93\x90\xde\xf7\xfe\xc9\xc4\xc1\x6f\x51\xc2\x34\x90\xf5\x3e\x27\x4a\x23\xc8\x0d\x8a\xae\x97\x97\xf9\xbd\x18\x4f\x00\x39\xeb\x7b\x96\xb1\xbb\xbf\xb3\xe3\xb6\x9a\x76\xd3\x69\x39\x7b\x56\x0b\xfe\x02\x65\xcd\x0e\xed\xee\x1b\x1d\xeb\x16\xd6\xd7\xf1\x78\x17\x4a\x22\xe7\x47\x64\xe1\xfb\x32\xc3\xa1\x38\x27\x3b\xdd\x96\xdb\xea\x1a\x7b\xb6\xe3\x76\xf7\xbb\x2d\xe6\xb8\x2d\xb6\xdb\xe9\xec\xbb\xfb\xac\x4d\x3b\xad\xbd\xea\x94\x78\xd7\x49\x6b\x18\x2c\xa4\xd8\x32\x9f\xcd\x84\xcf\xa6\xbe\x23\xb5\xd6\x1c\x70\x03\xf6\x34\xba\x7b\xae\xbb\xd7\x32\xf6\xd9\xbe\xdb\xa5\x5d\xa3\xb3\xd3\x6c\x76\x6c\x0b\xe8\x72\x76\xd9\xbe\x61\xd0\x32\xbb\x77\x69\xed\x2e\x7c\x45\xa6\x90\x4a\xce\x14\x96\x03\x65\x5e\xda\x09\x2f\x6d\xb9\xce\x00\xa6\xd1\x16\x6e\xb7\x6f\xec\xb4\xdb\xad\x16\xf8\xc1\x3e\xed\x52\xbb\x49\x59\xd7\xa1\x9d\xae\x65\xc0\xe9\xec\xbe\x2c\xdc\x85\xaf\xc8\x42\x3b\xd1\x0b\x0f\xd5\xf7\xb5\x3b\x04\xe2\x66\xd7\xb6\x3a\xee\xde\xee\x5e\x1b\xa4\x87\x47\x75\x9a\x2d\xc7\xa1\xbb\xac\xb9\x6f\xef\x37\x5b\xbb\x96\x7b\x5f\x26\xee\xc2\xb7\xc6\xb8\x44\xf8\xbc\x2f\x17\x1c\x8a\xb3\xe1\x58\x2d\x34\xe2\xfd\x36\x6b\xd2\xae\xc3\x0c\xb7\xd3\x72\xdb\xbb\xed\x8e\xbb\x0b\xc3\x3d\xa7\x7d\x5f\x36\xee\xc2\xb7\x86\x8d\x7c\x7e\xbc\x2f\x33\x39\x58\xce\x12\x63\xad\x7d\xd7\xa0\x60\x0b\xed\x9d\xb6\xcb\x40\x96\x10\x6d\x99\x61\xed\x76\x99\xdd\x71\x9a\xce\x03\x42\xdb\x5d\x28\xd7\x70\x15\xe7\xb4\xfb\x32\x24\xc0\x38\x2f\x86\xdd\x69\xa3\x1f\x5a\xfb\x0e\x44\xd5\x2e\x9c\xda\x69\xd2\x9d\x56\x73\xdf\xd8\x37\xda\xfb\xcd\x95\xe0\x26\x8d\x6c\x77\x84\xb5\xbb\xce\x90\x31\x27\x49\xca\xf3\x09\x4f\xca\xbc\x54\xa1\xf6\x62\xe2\x2f\x24\xaa\xd4\xbb\x7a\x9b\x57\x3d\xc5\xce\x52\x01\x2a\xe6\xe0\xd6\xf5\x25\x97\xde\x3e\xca\xaf\x2a\x64\x5d\xbd\x55\x25\x32\xa3\x12\x64\x80\x2d\x6e\x2e\x26\xf2\xe3\x2a\x40\x29\x6a\xb1\x21\x71\x29\x08\x71\xa4\x43\x6e\x7d\xd7\x0b\x6f\x45\x01\x2d\xbd\x23\x95\x99\xb5\xf0\x26\x4e\x03\x20\x84\x36\xb3\x27\x09\x95\x6b\xf7\x6e\x4f\xbd\x59\x22\x82\xd6\x1a\xe5\xfc\x84\x83\xf6\xfe\xad\x83\xba\x7a\x33\xd8\xf9\xb7\x8e\x6a\x05\x32\x0b\xfa\x29\x47\xfd\x2b\x07\xb5\xf5\xf6\xed\x7a\xc2\x7f\xb7\x21\xc7\x7f\x29\xc2\x92\x5f\xb4\x79\x5e\x6f\x0b\x47\x68\x61\x49\x90\x78\x05\x98\x07\x1f\xee\x25\x43\xee\xe6\x24\x91\x30\x9f\xea\xf0\x89\x4e\xb2\x63\xbf\x08\xdf\x2d\x6f\xef\xf2\xa8\x9d\x98\x83\x60\x2d\x3d\x5f\x54\x7c\x57\x6e\xfc\x7f\x68\x5a\xf5\x3f\x69\x5c\x48\xf6\x9f\x87\x81\x2d\x8b\x0b\xc9\x7a\xa6\x35\x69\xac\xba\x17\x9a\x92\x08\x85\x54\x5a\x71\x69\xc4\x2c\xd7\x9f\xad\x92\x0f\xc1\x5f\x6f\x75\x25\x47\xc7\x00\xe7\x0e\xb3\x16\x23\xc9\xd1\xf1\x7a\x16\x20\x01\xcf\x5e\x45\x78\xf6\xab\xc1\x63\xc8\x44\xfa\x10\x3c\xb2\x04\xf7\x10\x3c\xb2\x50\xf3\x10\x3c\xbb\x15\xe1\x91\x79\xef\x43\xf0\xc8\x3c\xe0\x21\x7a\xaf\x88\x9c\x6a\xd0\x54\x24\x9c\x4e\x45\x4c\x55\xe4\x13\x55\x99\x4e\x45\x21\xa3\x2a\x8f\xa8\x28\xf2\x18\x15\x69\xab\xa2\x80\x51\x91\xce\x5b\x55\xf9\x67\x45\x0e\xda\xaa\xc8\x08\x5b\x15\x69\xab\x55\x91\xba\x5a\x8f\xb5\xe6\xf2\xdd\x40\x5c\xce\x30\x1f\x66\x57\x4b\x31\x16\x9d\x82\x6f\xd1\xb6\xed\x07\xab\x2d\x8f\xb6\x6e\x48\xc3\x57\x02\xb0\xbd\x8e\x98\x64\x43\x56\xe2\xc9\xe3\xe0\xfd\x10\x49\x4b\x3b\x43\x54\x63\xa2\xb1\x24\xce\xe1\x43\x23\x5d\xe5\x3c\x4e\x7d\x1f\xdf\x5c\xc9\x2e\x9e\x6d\x69\xa4\x4f\x00\x24\x44\x25\x4b\xdb\x58\x77\x66\x2b\x99\x0a\x8d\xca\x31\xca\x2b\xe4\xc7\x61\x94\x79\xe1\xe3\xb8\xae\x1a\x63\x4b\x1a\x00\x1f\x87\x51\xe6\x5b\x8f\xc3\x58\xb5\xae\xe5\x25\xfc\xe3\x30\xca\x22\xe5\x63\x30\xee\x54\x6e\x8f\x3b\x95\xcb\x71\xa7\x4a\x39\x4a\x43\x2a\x5a\xbc\x30\xfd\x64\x1c\x37\xef\x78\xc3\x9e\x13\x20\x7c\x8d\x0f\xdb\xc9\xb0\xc5\x87\xa8\x14\x01\x9c\xe2\xe2\x91\xea\x2b\xfe\xff\xf9\x65\x1d\x1a\x63\x4d\x87\x46\x00\x6c\x4b\xef\xc8\xd9\x5a\xee\xc2\x6d\x88\x8b\x6a\x35\x88\x64\x32\x7e\x10\x22\x99\xfa\x1f\x84\x48\x56\xed\x3c\x8c\x22\x99\xd7\x3c\x0c\x93\x2c\xea\x3c\x08\x93\xac\x40\x7d\x18\x49\xb2\xd0\xfa\x20\x4c\xb2\x12\xfe\x61\x24\x55\x64\x4b\x7b\xd5\x19\x65\x75\x16\x50\x91\x79\xef\x49\x53\xe2\xc3\x48\xaa\x2c\x06\xc8\xea\xe7\x07\xf1\x56\x11\x45\x7b\xd5\x05\x93\x8a\x1c\x77\xb7\x2a\xb5\xed\x56\x18\x70\xab\x8b\x25\x8f\x37\x80\xb5\xaf\x33\x8c\x3d\x91\x25\xf7\xf8\x78\x2f\x7e\xbd\xc1\x3b\xb3\x46\xd2\x99\x35\x4a\x7b\x77\xf9\x78\x37\xd9\xdb\x8d\x13\x70\x37\x79\x45\x6d\x8f\x03\x7f\xca\xb6\xdd\x80\x7f\x82\x23\xeb\x64\x4a\xf8\x79\xf9\xfa\x08\xff\x03\x55\x93\x89\x84\x9f\x6c\xad\x20\x19\x79\x0f\xe9\x41\x88\x64\x9e\x71\x3f\x44\xeb\x2e\x85\xa5\x3b\x61\xfc\x7e\x32\xfd\x6f\xe6\xad\x8a\x67\x6f\x0d\x39\x29\x8c\x84\x9c\xc2\x9a\xe0\xa9\xb3\x46\xce\xf7\x46\x23\xbf\xa3\x3e\x80\x1a\x99\x8b\xfe\x38\x9a\x15\x0b\x4e\x2c\xb6\x99\xbc\x85\xeb\xc4\xa5\x5e\x27\xb9\xb4\x1a\x2b\x3b\x4a\xeb\x22\x24\x96\xb1\x34\x13\xdb\x07\x8a\xb9\xb6\x1c\xff\xab\xff\xc3\x17\x5b\xdc\xdc\xc0\x3f\xfa\x37\x2c\x6d\x0b\x1f\xf6\x4b\x98\x2c\x6d\xcf\xa4\xfe\xb3\x50\xcb\xaf\xba\x95\xa0\x96\xdf\xcb\x2b\xa2\x5a\x66\xcb\x15\xc9\xfa\xa7\x09\x44\x7e\xc1\xae\x04\xb5\xbc\x08\xcb\xf6\xde\x07\xef\x1d\x15\xc2\xa3\x91\xde\x6e\x15\x0f\x42\xba\xf3\xf3\x24\xbb\xfb\xf3\xac\x78\xf7\x67\x9a\xda\x4f\x43\x2d\x6f\x46\x54\x84\xfa\x67\xc8\x7a\x6d\xaa\x68\x65\x59\xa1\x93\xf4\x12\x3a\xc5\x61\x52\xdb\x94\x3a\x0d\xed\x5b\x3b\x0d\xed\x62\xa7\xc1\xc8\x77\x1a\xa4\x7d\x86\xf5\x45\xe6\xda\x6a\xae\x58\xb1\xc8\x73\xcf\xbd\x50\xc8\x73\xcc\x3d\xa9\x58\x7f\xa3\xf8\x61\x2a\xd6\x5f\x01\x7e\x18\xc5\xfa\xe2\xff\x87\x19\x79\xb4\x46\x6e\x6b\x1e\xfd\x20\x0a\x79\xba\xb8\x17\x8a\xdb\xee\x78\x3f\x8c\xe2\xd1\x76\xd1\xba\xe5\xca\xfa\x83\x28\xe4\x01\xfe\x9e\x28\x1e\x6d\x5a\xf2\x5c\x70\x4f\x14\x8f\xd6\x88\x3c\x00\xdf\x93\x8a\x47\x1b\xb8\x3c\x56\xdf\x13\xc5\x63\xa8\x58\x1b\xd6\x4b\x91\x7c\x27\x5f\xfb\x97\xc2\x7a\xab\x18\xd6\x77\x6e\x0d\xeb\x9d\xf8\x7b\xcb\xe5\x93\xff\x0f\x00\x00\xff\xff\xac\xf9\x00\xe7\xe9\x5f\x00\x00") +var _pagesAssetsJsGoogleJsapiJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x3c\x7b\x77\x9b\xb8\xf2\xff\xe7\x53\x38\x3a\xfd\x39\x68\x4d\x30\xe0\xc4\x71\x4c\xb5\x39\x7d\xa4\xdd\x6e\x1f\xd9\x6d\xd2\xde\x7b\x97\x65\x73\x84\x10\x36\x0d\x06\x2f\xe0\x3c\x36\xe6\xbb\xff\x8e\x24\x30\x60\xcb\x49\x93\xb8\xfb\xc7\x36\x20\xcd\x8c\xe6\x3d\xa3\xc1\xf7\x06\xbe\xb2\x7d\x15\x44\x5e\x7c\x65\xef\x8c\xe2\x78\x14\xd2\x0f\x67\xe7\x3b\x0e\xbc\x95\x2c\x22\x25\xa2\x57\xad\xd7\x38\xa3\x0a\x84\xda\x88\x66\x67\xc1\x84\x2a\xd0\xca\x03\xbf\xb5\x4c\x65\xc7\x81\xad\xdb\xad\xe5\xb5\x16\x6a\xdd\xe6\xd6\x56\xbe\x25\xc5\xb0\x77\xc2\x18\x7b\x34\x91\xe3\x56\xbb\x05\x15\xb1\xa1\x89\x55\xed\x94\x26\x97\x01\xa1\x2f\x71\x4a\x5b\xa8\xb5\x33\xce\xb2\x69\x3a\xec\x76\xaf\xae\xae\xb4\x02\x90\xc4\x93\xee\xcc\x4b\x77\x96\x31\xdf\xf2\xb7\x17\xd3\x20\x5d\x46\xc6\xdf\xf0\x75\x81\x8d\xa7\x41\xca\x29\xb0\xb5\x15\x12\x2f\xa6\xc1\x7b\x7a\xc3\x50\xa3\x38\x4b\x67\xd3\x69\x18\x50\x6f\x05\xea\x3d\xbd\xf9\x4a\x93\xc0\x0f\xa8\xd7\x42\xad\x2c\x99\xd1\x65\x88\x0f\x31\xf6\xde\xe0\x20\x9c\x25\x8c\x0f\x1f\x87\xe9\x0a\xc8\x29\x25\x62\x57\x86\x2f\x44\xf9\x10\x13\x1c\x72\x41\x9a\xd2\xaf\x30\xf4\x2a\x0c\x68\x94\x31\xf0\x2c\x88\xa3\x16\x6a\x45\xb3\x30\x5c\x91\xcd\xf3\x02\xb6\x8d\xc3\xdf\x70\x82\x27\x29\xa3\xbb\x63\x6d\x29\xfe\x2c\x22\x6c\x5d\x81\xad\xdb\x4b\x9c\xb4\x3c\x44\x23\x12\x7b\xf4\xcb\xe7\x77\xaf\xe2\xc9\x34\x8e\x68\x94\xa9\x23\x24\xcc\xa8\x8e\x91\x17\x93\xd9\x84\x46\x99\x55\x22\xb6\x42\x05\xab\x2e\xbc\x4d\x68\x36\x4b\xa2\x16\xe6\x07\x22\x37\x67\xc4\x26\x08\x24\x74\x1a\x62\x42\x81\x1a\x21\x40\xc6\x38\x79\x91\x01\xf5\x6f\x04\x0a\xb7\x03\x6a\x82\x40\x2a\x9e\xe3\x59\x06\xd4\x0c\x81\xe9\x2c\x1d\x03\x75\x86\x40\x10\x79\xf4\xfa\xc4\x07\xea\x25\x02\x35\xbf\x00\xea\x15\x02\x11\x66\xc8\xd7\x08\x84\x34\x1a\x65\x63\xa0\xde\x20\x30\x4d\xe2\x2c\xce\x6e\xa6\x14\xa8\xff\x20\x20\xe4\x06\xea\x0b\x04\xd2\x99\x9b\x66\x49\x10\x8d\x80\xfa\x12\x81\x6f\x71\x10\x01\xf5\x15\x02\x59\xfc\x21\xbe\xa2\xc9\x2b\x46\xb3\x12\xe7\xb5\x82\x2b\x61\x5a\x41\xd4\x3a\x3e\x3a\xb6\xb1\x33\x64\xff\xa0\x5d\x63\x1b\x45\xf8\x32\x18\xe1\x2c\x4e\xb4\x59\x4a\x93\x17\x23\x1a\x65\xf6\x2b\x47\x81\xf6\xcc\x51\x30\xe4\x72\x1f\xa3\xdb\xbc\xa2\xf8\x46\x28\x88\x6d\x10\x54\xe9\xfb\x36\xb7\x88\xb6\xe0\x19\xb9\xf6\x8d\x63\x61\xed\x4b\xf9\x50\xed\xb0\x70\x25\xf9\xd6\x82\xde\x5b\x46\x4f\x25\x82\x22\x45\x2f\x92\x04\xdf\xd8\x37\x8e\x96\x86\x01\xa1\x1a\xc1\x61\xa8\xe0\x64\xc4\xad\x94\xaa\x26\x9c\xcf\x6d\xc7\x2a\x04\xaa\x9d\xbe\xb0\x17\x9e\x4e\xc3\x1b\xc5\x55\x99\x73\x45\x04\x67\xca\x9d\x04\x21\x84\x79\xbe\x60\xe5\x17\xa6\x2c\x8c\x8e\x93\x24\x4e\x14\x0c\x2d\xac\x65\xf1\x29\x57\x35\x5a\x3d\x2a\x1b\x07\xa9\x36\xa1\x69\x8a\x47\x34\x2f\x39\xc2\x15\xb1\x77\x42\x4f\x7e\x9c\x28\x42\x57\x58\x4b\xa7\x61\x90\x29\xdd\x3f\xb5\x2e\x54\x29\x1a\xa9\x3e\xd2\x2d\xff\x39\xb1\xaf\x9d\x5d\xc3\xf2\x3b\x1d\x48\x6d\x62\xfb\x8e\x33\x9f\x2b\xc5\x13\xba\xcd\x19\x68\xf1\x66\xb1\xbf\x02\xdc\x71\x90\x5b\x9d\xf5\x6b\xa9\x43\x6c\xbb\x0e\x22\x39\x4b\xa0\xef\x21\x3b\xf6\x3d\x7a\x67\xb1\xb7\x0f\xfc\xed\x03\xfa\xd5\x12\x81\x64\xff\xe3\x68\x97\xcc\xae\xef\x15\xd0\x0c\x2d\xa6\x20\x17\x93\x8b\x14\xa8\x35\x50\x68\x31\xfc\x8f\xe8\x36\x57\x3f\x31\xb4\x6a\x8b\x5e\xe2\x50\x4a\x88\x6d\xd4\x69\xb0\x77\x68\x6d\x85\x8a\x58\x52\x17\x2a\x2d\x78\x5f\x48\x43\x99\x19\xd8\x71\xee\x42\x67\x40\x03\x90\xc9\x61\x3e\x77\xed\x6b\x07\x66\xe3\x24\xbe\x6a\xfd\xa2\x80\x8f\xb1\x37\x0b\xe9\xb0\xb5\x03\x3a\xb8\x03\x76\x5a\x51\x9c\xb5\xfc\x78\x16\x79\xdb\x00\x5a\x60\x16\x79\xd4\x0f\x22\xea\x81\x6d\xc4\x7c\x2f\xf6\x5b\xae\x6d\x38\xed\xb6\xe2\x23\xd7\xd6\x1d\x95\x68\x53\x4c\x2e\xf0\x88\xa6\xa8\x7a\x64\x1e\x56\xdb\xb1\x33\x47\x61\x58\x50\x04\x83\x8f\xb0\x45\x10\x99\xcf\x6f\x73\xc6\x10\x8b\xa9\x34\xc3\x11\x61\xc4\xb9\xab\xcd\xe7\xb8\xdd\x06\xb1\xfb\x8d\x92\x0c\xa0\xf2\x5c\xb6\x56\x0a\x58\x5b\xb5\x5f\x3a\xf2\x0d\x2d\xa1\x97\x34\x49\x29\x2c\xfd\xe7\x02\xe9\xd6\xc5\x73\x6c\x5f\x3b\xd6\x05\xf3\x14\x05\xdb\x17\x0e\xb4\x68\x98\x52\xae\x30\xce\x0c\xfa\x68\x83\x21\xe8\xf8\x0e\xbc\x25\xed\xf6\x36\xd1\x42\x1c\x8d\x66\x78\x44\xdb\x6d\xa2\x85\x3c\x03\xb7\xdb\x4a\xb5\x8c\xca\x55\x68\x91\x76\x1b\x14\x69\x65\xc1\x05\x59\x38\x43\xbb\xad\x5c\xa0\xea\x55\xbd\xd0\x26\x38\x23\x63\xa5\xfb\x97\x6d\xff\xe9\xbc\xd8\xfd\x03\xef\xfe\xa3\xef\x1e\x6a\xe7\x4e\xe7\x59\x17\x72\xe8\x11\x37\xb8\x72\x01\xd5\x0a\x0f\x6d\x5d\x40\xce\x29\xa3\xd6\x6e\xb3\xcc\xbe\x5d\x23\x0b\xdb\xed\x6d\xac\xa5\x8a\x0b\xa5\x16\xf6\x99\x85\x27\xb3\x34\x6b\xb9\xb4\xc5\x9d\xcc\x6b\xb9\xd4\x8f\x13\xda\x7a\x7d\xf2\xb1\x15\x47\xac\x52\x31\xc3\x5f\x1c\x61\x6d\xa2\x30\xa7\x3a\x1a\xd9\x89\xa3\xd4\x18\xd7\xe1\x50\xe4\x74\xbe\x3d\x2c\xe1\xe6\xf3\xda\x6a\xce\x95\xba\x96\x83\x86\x8f\xe5\x70\xc9\xf1\x4b\x8f\xe7\x2f\x70\x51\xb7\xce\x50\xdd\xdd\xe1\xad\x7b\xa4\xe8\x08\x9d\xd8\xd7\xcc\x1b\x7f\x53\x46\x2a\x10\xc8\xbf\x43\x75\xfb\xb5\x02\x26\x69\x40\x01\x53\xc7\x6b\x05\xa4\xd8\xc7\x49\x50\xbe\x5d\xc4\xd1\xdf\x33\x9a\xc4\x09\x5b\x60\x90\xf1\x3f\x41\x18\x62\x00\xe7\xf3\x91\x16\x4f\x69\x82\x8f\x46\x1a\xf6\xbc\xe3\x4b\x56\x45\x83\x34\xa3\x11\x4d\x14\xf0\xfa\xe4\xe3\xab\x38\xca\x78\x65\x65\x8a\x03\xea\xef\xea\xb6\x01\x87\x8b\xb3\x8e\xc6\xda\x55\x12\x64\x54\x01\xcf\x53\x92\x04\xd3\xac\xe5\x51\x9f\x26\xad\x38\x4a\x28\xf6\x6e\xd2\x0c\x67\x94\x8c\x71\x34\xa2\x68\xa7\x19\xe7\x5e\x3c\xf9\xcc\x40\x14\xb8\xd3\x4a\x13\x82\xba\xdd\xe1\xcf\x7f\x5e\xf7\x48\x57\xd0\xf9\x19\xc0\xa1\x52\x13\x63\x3e\x6f\x4a\x01\xdb\x6d\x6e\xa4\x53\xd5\xd0\x21\x54\x4f\x58\xbc\x61\x08\x87\x35\xa5\x60\x58\x4f\x2f\x29\xcd\x4e\xb8\xa9\x5f\x15\x46\x5d\xa8\xfc\x0c\x5a\x55\x5d\xf9\xad\xcc\x2b\x2c\x30\x56\x34\x02\x57\x97\x98\xed\x99\x4e\x44\x4c\x09\xac\x2c\xc3\x64\xcc\xa1\x60\xe3\x4d\x01\x71\x04\x3a\x8c\x3c\x87\x2e\x6a\x17\xb6\xc5\xb2\x63\x2d\x9e\x90\xf0\x71\x7a\x84\xb1\x62\x13\x95\x3a\x70\x48\x6a\x15\x07\xe3\x5a\x7d\xae\xd5\x98\x32\xea\x5d\xa4\x5b\xae\x88\x7a\xb7\xd3\x81\x2c\xbd\x2b\x30\xe7\x89\xe8\x04\xd9\x4e\x2d\x0d\xff\x56\x2f\x51\x6c\x1f\xf3\x08\xa4\x51\xa6\xa5\x09\x39\x0e\x29\x6f\x73\x00\x89\x27\xd3\x90\x66\x14\x20\xc4\x72\x0c\xf6\x6e\x4e\x99\x65\xdb\x6d\x05\x6b\x12\x53\x33\xee\x55\xac\x4d\x71\x42\xa3\xec\x53\xec\x51\x2d\xa1\x93\xf8\x92\xbe\x1a\x07\xa1\xa7\x60\xa8\xfe\xae\x40\x28\xc9\xfd\xa5\x4f\xd4\xf3\xff\x6f\xa2\x86\xb8\x18\xdd\x8a\xe0\x1d\x6e\xeb\x6a\xc9\xcf\x70\x5b\xaf\xf5\x18\xa7\x0a\xbc\x75\xb1\x3d\xae\x71\xe8\x1c\xfd\xae\xc0\xa1\xfe\x5c\x84\x4c\xe5\x31\xb5\x4e\xe2\xf7\x9a\xe2\x30\xd2\x2d\xcc\x81\x2d\xdc\xe9\xc0\x13\x1b\x3b\x0a\xb4\x4e\x34\xd1\x60\x21\x3d\xaf\xf8\xf2\xd0\x72\x25\x0a\x7c\xa5\xec\x47\x2c\x20\xbc\x98\xe9\xeb\x48\xa1\x68\xac\x91\x84\xe2\x8c\x16\x0a\x55\xca\x6d\xa8\x52\x8d\xb7\x37\x20\xa3\xd7\x59\xf7\x1b\xbe\xc4\xc5\x8e\x4a\x99\x01\x90\x0b\x87\x80\xa4\x29\xa3\xd3\x6e\xcb\x08\x85\x41\x74\xb1\x4c\x86\x21\xa8\x54\x1b\x27\xd4\x47\xac\xa5\x49\x68\x88\x40\x9a\xdd\x84\x34\x1d\x53\x9a\x01\x68\x29\x18\x8d\xd9\xad\xa7\x20\x93\xbe\xbc\x39\xc3\xa3\x4f\x78\x42\x15\x30\xa6\xd8\x03\xd0\xd6\x1d\x38\x9f\x73\x30\x37\xf6\x6e\xea\xa6\xc4\xd3\x29\x8d\x3c\x61\xca\x15\x76\x04\x36\x64\x4d\x50\x1d\x8e\x8a\xec\x58\xd7\x4a\x99\x38\x76\xca\xc4\xc1\xc4\x05\x3b\x1d\xb7\xb3\x03\x5a\x72\x9d\x34\xf2\xc3\x4e\x5d\x33\x15\x31\xa6\x8f\x16\x97\x5c\x42\x8b\xc1\xb7\x96\xb5\xf1\xf3\xf3\x2e\x43\xfa\x79\x07\xe6\xd6\xd6\x8a\x4b\x72\xba\x2c\x6d\x9c\xe1\x51\xdd\x2d\x3d\x58\x8b\xa2\xdf\x6b\xbe\x00\x6f\x3f\x21\x2c\xf1\xed\xc4\x9f\xd4\xf1\x7f\xaf\xe3\x9f\x36\xf0\x17\x51\xcc\x1a\x6f\x0c\x57\xea\xab\xdb\x6e\xbb\xed\x36\x18\x02\x84\x5c\x3b\x72\x14\x9d\xe5\xf8\x8f\xb6\xcb\x6a\x02\xfb\xc3\x7b\xe5\x33\xc5\xb5\x5f\x38\x8a\x01\x55\x16\xfd\xd2\x68\x4b\xa6\x8d\x46\xeb\xb4\xce\xd1\xe7\x06\x47\xac\xf4\x62\xde\x55\x51\x92\xc2\x76\x9b\x65\x16\x28\x49\x36\x9d\xce\xa2\xc5\x67\xa7\x5a\xab\xad\xc1\x91\x68\x35\x88\x60\xf2\x8b\x42\xe0\x50\x21\xfc\xf9\xab\x42\xec\x2b\xd6\x41\xb9\x38\xa5\xa7\x53\x4a\x58\x03\x30\x4b\xb3\x78\x72\xca\x4f\x55\x0b\x4c\xfb\xca\x71\x10\x81\xb9\x4c\xa0\x86\x86\x3f\xd7\xe5\x11\xa9\xa3\x21\x94\xa0\x87\xb5\x09\x2f\xd4\x8e\x16\xb2\x8b\x8b\xc4\x03\xc2\xa2\xf2\x2d\x13\xab\x93\x3f\x59\xed\xf4\xc1\xdf\x81\x87\x40\x47\x59\x0c\x1a\xa0\xfd\xb7\xa3\xc0\xc5\xdd\x40\x31\xfa\xb0\xf3\x11\x67\x63\xcd\x0f\xe3\x38\x51\x8c\xe3\x83\x9f\xf8\x6b\x82\x23\x2f\x9e\x28\xb0\x09\x2a\x33\xa0\x88\xbd\xb7\xb3\xc0\x7b\x91\x8c\xce\xeb\x1c\x9e\x40\xeb\x5d\x09\x7d\x4e\xaf\xa7\x71\x92\x9d\xde\x4c\xdc\x38\x04\xea\xbb\xd5\xad\xdf\x12\xd6\x01\x64\x37\x40\xfd\xb5\x2e\x14\x96\xf6\xe7\xd9\x98\x4e\x68\xa3\xcb\xc7\x0d\x24\xed\x1d\x02\x2b\xb3\x0a\x92\xd2\x2e\x0f\xb9\x6e\x18\xc7\x17\x5d\x77\xe6\xba\x21\x1d\xcd\x26\x1a\x8b\x48\xeb\x83\x52\xc3\x57\xc1\xcb\x2f\x2f\x5f\x7e\x38\x7e\xfb\xe5\x63\xe3\x10\xed\x5d\xf3\x98\xf7\xf7\x1f\x33\x4a\x28\x8d\xd2\x8b\x1b\xe9\x29\x6f\x3f\x1f\x1f\x7f\x3a\x7d\xff\xbf\xe6\x21\xef\x17\xbd\x97\x78\xff\xf5\xfe\x53\x68\x3a\x4d\x68\x9a\xc6\xd2\x53\x8e\x4f\x7f\xfb\x7c\x7c\x7a\x7a\xd2\x3c\xa5\xa9\x66\xed\xe3\xfd\x87\xa4\xe3\x20\x92\xcb\x71\xfa\xcb\xbb\x4f\x4b\x42\x7c\x6c\x92\xff\x70\x3f\xf9\x49\x10\x05\x13\x1c\x06\x69\x26\x3d\xe3\xe3\xbb\x4f\xef\x3e\xbe\xf8\xf0\xee\xf4\xac\x79\xd0\x87\xe6\x41\x9f\xee\x3f\xe8\xd2\xec\x7a\xd4\xc7\xb3\x50\x7e\xd0\x57\xf3\xfc\xf5\xf1\x9b\x17\x5f\x3e\x2c\x1d\xf4\x09\x56\x55\xfe\x0b\x0b\x5e\x7e\x8d\x76\x11\xb6\xf8\x43\xcc\x9a\x1a\xfe\x14\x31\x9f\xe5\x4f\x74\xf1\xe4\x2f\x9e\xbe\xa1\x6d\x5d\x3c\x11\xb4\x6b\xe4\x5b\x5f\xd8\x05\x7f\xb4\xd4\x63\x8b\xfc\x05\x80\x75\x19\x07\x5e\x4b\xdf\x46\x6e\xbb\xad\x2c\x9e\x6b\x77\x23\x85\x74\x10\x68\x8f\x43\x04\x3a\x9e\x52\x6d\x40\xa8\x56\xd0\x51\x4c\xd2\xb4\x04\x8d\x67\xd9\x74\x96\x71\x70\xc0\x37\x10\xe8\x14\x20\x4b\x48\x71\xe8\x45\x78\x42\x17\x98\xd5\x4a\x71\x58\xb5\xd0\xc0\x2c\x6f\x9f\x25\xde\xe2\x9e\x2a\xb0\xca\x57\x08\x55\xd1\x60\xba\xf5\xab\x1a\xc7\xc0\xe9\x4d\x44\x90\x09\xea\x54\xb9\xfd\x4a\x00\xfe\x52\xd0\xe3\xcf\x4b\xac\xd3\xeb\x69\xc5\x35\xbd\x9e\xa2\x2c\x99\xd1\x06\xb9\x38\x1b\xd3\xe4\x7c\xca\x27\x70\x25\x28\x53\x44\x7d\x5d\xdc\xf7\xb6\x85\xd5\xe0\x6d\xe1\x0b\xc2\xea\xac\x91\x6b\xbc\x6b\xbf\x9e\xfe\x82\xd3\xf1\x82\xc3\x60\xc4\xf9\x93\x02\x41\x68\x6d\x89\xb6\xdb\x76\x54\xdf\x62\x45\xcc\x67\x75\x56\x78\x0f\xe4\x55\xd5\x2f\xab\x2a\x65\xb7\x0a\x5f\xd4\x51\xb8\x04\x4b\x97\x60\xc5\xa2\xed\x3b\xcb\x68\xc2\x4b\xf0\xa5\x50\x1a\xb5\x5f\x3a\x0a\x50\x01\x84\x79\xd1\xbf\x2f\xfc\xdc\xbe\x74\x3a\xa0\x7b\xe4\x07\x5c\xbf\x82\xed\x0e\x68\x5f\x22\xd0\xc1\x9d\x2a\x1a\x96\x87\x98\x1d\x92\x5b\xdc\x91\xb3\x46\x79\x13\xa5\x99\x4f\x41\x59\xeb\xe8\x22\x5c\x99\xdf\x12\x3e\xce\x37\x03\x5f\x71\x61\xe0\x2b\xab\x6d\x06\x24\xc8\xae\x90\x9c\xc5\x05\xc7\x2d\xab\x3f\x61\x3a\x14\x2d\xb3\x5b\xb6\xcc\xab\x64\x6c\xec\xb4\xdb\x44\xcc\x43\xb0\x63\x4f\x1c\xa5\xfb\xd7\x9f\xe9\x4f\xf3\x3f\xd3\x9f\x9e\x75\x55\x00\x20\x1f\x1c\x42\x8b\xcc\xe7\x8c\x22\x28\xf2\x03\x70\xa0\xe5\xb2\xb8\x66\x27\x89\x43\x48\x79\x88\x30\x56\xd1\x0f\x60\xc7\x99\xcf\x5d\x46\x9f\x3d\xc3\x72\xa6\xe6\xe6\xd6\x56\xa8\x30\xc5\xa8\xb2\xf8\xe6\x24\x32\xc5\x85\x2a\x65\x01\xbe\x1c\x0e\x4c\x2d\x14\x8a\xc9\x0d\x2b\xe0\xff\x51\xaa\x3d\xe1\x09\x62\xba\x62\x3b\xea\x14\x15\xa3\x38\xfd\x39\x9a\x5a\xd3\xdd\x5d\x71\x44\x8a\x88\x3d\x75\x2c\xda\x6e\xfb\xda\x4b\x25\xe5\xfe\x5c\xf8\x08\xe3\x3b\x75\x20\xe1\x53\x2a\x42\x95\xa9\x6a\x40\x95\x16\x2e\xe4\x17\xdb\xdc\x87\x8a\x5b\xe5\x05\x7b\x49\x61\xce\x6e\x18\x4c\xf9\xb7\xac\x05\xac\x07\xbb\x5b\x9f\x48\xa5\x71\x92\x29\x70\xe1\x67\x9c\xdb\x29\xd2\xad\xe9\xf3\x0b\xa6\xc0\x69\xa7\x03\x53\x74\x61\x4f\x1d\xb5\x71\x20\x93\x65\x0d\x13\xcc\xe8\xf3\x39\xd3\x11\x42\x9f\xf8\x56\x11\x54\xd2\x45\xed\x92\x26\x69\x10\x47\xa9\x68\xb0\x9c\xf9\x7c\xbd\xf3\xce\xe7\x65\x8c\x73\x91\xf0\x2c\x8b\x45\x77\x55\x47\xf2\x16\xf7\x25\xc1\xf1\x88\x1b\x52\xa5\xc5\x2d\x9a\x34\x8f\x5f\x14\xf0\xe2\x1d\x35\x5f\xf9\x08\xae\x34\xe0\x67\x16\xce\x7c\x00\xcd\x1a\xa0\x80\xa6\xf0\x73\xd1\x59\x7f\x2e\xe3\x7a\x29\x8d\xd8\x9f\x45\x5c\x3b\xa8\x8e\x66\x7f\x76\xea\xa5\xb0\xc6\x70\x23\xba\x89\x36\xc5\xd9\xb8\x43\xb4\x6f\x29\xe3\x9e\x68\xbc\x38\x34\xf0\xf8\xdd\x4d\x8e\x44\x52\x86\x95\x0b\x7d\xb5\xdb\x4a\x59\xd2\x0c\xb5\x28\x69\x4b\xad\xa6\x6a\x6c\x0b\x37\x27\xff\x67\xe8\x7a\x89\xc0\x2a\xdf\xfd\x4e\x51\x3a\x29\xda\xd6\xf3\x1c\x5a\xa2\x52\x86\x8d\x04\xb3\xbb\x20\xdf\x6e\x2b\xff\x55\x00\x0e\xcf\x4b\x1b\xa8\xe0\x5b\xa8\xad\xf6\xbe\xbb\x02\x1c\xaa\xdb\x3a\x54\x2b\x66\xca\x1a\x2e\xfe\x94\x03\x78\xcc\xda\x07\xf1\xe9\x25\xad\xe9\xb6\x32\xa3\xb2\xb2\x86\x6e\x73\x09\x64\x15\x1a\xc5\x01\x7c\xa2\xaf\xe8\x55\x18\x17\x37\x98\xda\x81\xe5\xe4\xe4\xb6\x96\x69\x1a\xfb\xae\xe3\x2c\x7a\x09\xba\x66\xdb\xb0\x6a\xa9\xc6\x97\x02\x59\x62\x66\x50\x32\x42\x91\x6e\x51\x91\xe6\x68\xa7\x03\x89\x4d\x1d\xed\x95\xb2\x84\x04\x2d\x8f\x86\x34\xa3\xad\x3b\xe8\xe6\x79\x51\x13\x26\x4b\xcd\x4d\x91\x1c\x75\x54\x25\x40\xfb\xda\x29\x80\xd3\xd5\x5b\xcc\xb6\x9e\xd7\x86\x63\xff\x59\xb4\x5e\x6f\xca\xd6\xeb\xef\x45\x73\x95\x20\x3d\xff\x0f\x23\xf3\xb2\xe1\x26\x62\xaf\xd3\x29\xc0\x8b\x9c\xc0\xfc\xca\xe2\xd0\xaf\x56\xa1\x4b\xa0\xd2\x65\x2b\xa4\xc2\xd5\x93\xdd\x5d\xb5\x14\x21\x29\xc6\x3a\x82\x2d\x55\x67\x37\xa5\x05\xc3\x5f\xcb\xd9\x8c\xb0\x23\x9e\xd0\x92\xef\xd7\xc8\x15\x0f\x53\x44\xc4\xc3\x4c\xd0\x1b\x33\xc3\xf1\xa7\x8b\xe6\xa8\xec\x92\x3b\x14\xbf\x7e\xbe\x15\xa7\x85\x9c\x1b\x98\xbf\x51\xbe\xaa\x5f\xa0\x15\x2a\x5f\xd7\x55\x1b\x59\x85\x21\x47\x82\x0a\x4f\xee\xb5\xea\xa2\x56\xcf\x68\xdd\x47\x16\x4d\x44\x9a\x7d\xe5\xc0\x61\xc9\xb5\x6e\x3d\x3c\x85\x12\x98\x43\xeb\xeb\x1d\x8e\x22\x61\xfc\x48\x68\xab\x38\x37\x17\xe8\x61\xdd\x75\x0a\x75\x6e\xeb\x56\x73\xae\x56\x88\x5b\x14\xf1\xca\x6a\x17\x36\x76\x54\x1d\x56\x5a\xcf\x45\x8f\xf6\x3f\x39\x4f\x58\x13\x3d\xc6\x91\xa7\x94\x8f\xb0\x03\x44\x4b\x0a\x87\x58\x4b\xe8\x88\x5e\x1f\xb9\xbc\xd3\x50\xfe\xd2\x7e\x7a\x06\xbb\x6a\xb1\x0a\x87\x00\x14\x1c\x2f\xb7\xfd\xf5\xef\x73\x85\x7d\xaf\x14\x0c\x55\xb6\x99\x5b\x5b\x1c\xe7\xed\xca\xcc\x4f\x44\x2d\x00\x16\xd6\x2e\xe8\x4d\xbb\xad\x50\xd1\xcd\xfe\x4f\xe1\x0b\xb5\x4b\x8c\xf8\xae\xce\x27\x63\x45\x7d\x6c\x42\x17\x8b\xaa\x0b\x59\xdf\x53\x1b\xcb\xf0\x8f\xe4\xed\x36\xd6\xd2\x34\x3c\xe2\xff\x0e\xb1\x36\x4b\x02\x96\x3b\x8a\x4f\x21\x8b\x59\x0c\x6f\x4f\x09\xe4\xa3\x57\x3c\x49\x6d\xdf\x39\xaa\x1d\xb1\x58\x54\x89\xed\x3b\x70\x08\xea\x1d\x37\xeb\x65\x4b\x60\xb6\x3d\x04\x2e\x4e\xe9\xb9\x17\x4f\x70\x10\xb1\x4d\xde\x44\x82\x71\x96\x4d\x87\xdd\xae\x80\xe9\x70\x46\x58\x41\x14\x0f\x33\x47\x01\x5d\xa0\x1e\x40\xb8\xc8\xc3\x8b\x98\xb9\xcd\xad\x5d\x03\x21\x97\x03\x1d\x01\xd6\x5d\xf3\x89\x26\x38\x02\x1d\x5a\xf6\xca\xa5\xd7\x75\x68\x61\xa5\xb4\x91\x1d\xea\x36\x62\xc6\xd1\xf8\xc7\x86\x84\x7a\x05\xf4\xd5\xf2\xd4\x4a\x44\xf8\xd2\xa8\x4a\x2c\x2e\xcd\xab\x8a\x45\x97\xa7\x64\x5e\xb7\x3e\xd3\xd1\xf1\xf5\x54\xe1\xe5\x37\xa3\x49\x04\xa1\x96\xd1\x34\x53\x30\x84\x05\x1f\x24\xaf\x33\xf4\xba\x96\x77\xce\x84\x4f\x35\x6f\xa9\x41\x99\x72\x58\x8a\xc9\xdf\x28\x67\x22\x69\x9c\xad\x26\x8d\x2a\xa4\xef\x8d\xe0\x6d\x83\x85\xf0\xd9\x52\x08\x37\x55\x35\xce\x05\x40\xd8\xfc\xf0\x7e\x26\x0b\x83\xc5\xad\x2b\x58\x6e\xe3\x2a\x85\x06\x1a\x0e\x03\x9c\xd2\xb4\xa1\xbc\xc5\x6a\x01\x6f\xb1\xbe\x00\x23\xc2\xdb\xd6\x75\x34\x65\x9f\xcb\xca\x9b\xcf\x4e\xeb\x2a\xc8\xc6\xad\x02\x45\xfe\xb1\x76\xe5\x12\xb5\xf4\x13\x98\x0e\xe8\x86\x81\x9b\x76\x2b\xaa\x5d\x4e\xa6\x5c\x58\xe1\xc8\xe6\x49\x74\x16\xb1\x7a\x9a\xd0\x34\xa5\xde\x11\xa8\xbf\x81\x21\xa8\xbd\xb0\x4c\x75\xb6\xae\x74\x1a\xb9\x68\x00\x30\xab\x5b\x7f\xb0\xf6\xda\xc3\x2b\x3d\x9a\x8f\xeb\x98\x04\xcf\xe7\xe2\xbb\xde\x2c\x12\x1f\xb1\x28\x86\x2a\xa3\xa0\xc3\x5c\x1d\xe1\x25\x63\xf9\x58\x11\xf7\x64\x65\x39\x5f\xd4\x73\xff\xc9\x94\x61\xa4\xed\xf6\xb6\xb1\x8d\xd0\xca\xba\x46\xd2\x00\xd6\x7f\x71\xa0\x5b\x44\x8c\x73\x09\xff\x76\x44\x1c\xe4\x29\xec\x8f\xf8\x81\x07\xcb\xaa\xf6\x5f\xe2\xc3\xed\xb9\xe6\x74\xba\x23\x15\x9c\x97\xd7\x0c\x81\xec\x96\xc8\xae\x40\x76\xef\x47\xe6\xc5\xe0\xad\xf2\x8c\xcf\x25\x54\xd0\xed\x8e\x46\xcd\x29\x52\x70\x94\xa2\x99\x97\xb6\x2f\x91\xd9\xc6\x5c\x05\xec\x5a\x5c\x5e\x72\x3a\xa0\x1d\x64\x08\x74\xdc\xc5\xad\x47\x35\x8e\xf7\x60\x9e\xab\xff\x5d\x49\xd9\xe4\x68\x84\x15\x56\x71\x58\x2f\x35\x54\x98\x0e\xd5\x3f\x58\x0d\x06\x09\xe8\xfc\x61\x5f\x3b\x45\x2d\xc1\x1d\xc5\x3d\x02\x73\xd0\x71\x87\x00\x40\x08\x55\xce\x23\xc5\xea\xfe\x73\x06\x75\xa4\x0f\x8d\xfd\xe3\x1e\x84\xb9\x4a\x1b\x36\x0c\x7c\xe5\x0f\x7e\x49\x13\x85\x6f\xab\xde\xcc\x5b\x3a\x42\x98\x67\x40\x9e\x47\x59\x16\x54\x30\xc2\xe2\x52\x2c\x52\xab\x0a\xc4\x4f\xb6\x98\x56\x9e\x29\xcc\x55\xd3\x0c\x67\xe9\x11\xe3\x8d\x09\xd7\xe6\xd2\x46\x04\x81\xce\x92\x2f\x75\xc0\xb9\xa4\xe7\xf6\x30\x84\xd6\x1f\xd5\x17\xac\x5c\x7d\x26\x9b\x13\xd0\xab\xd6\xbb\x09\x1e\x51\x95\xa0\x67\xda\x2f\x9d\x8e\xf5\x4c\x7b\xc1\xac\xe7\x5a\xae\x16\x47\xe2\xe7\x4c\x5a\x1c\xd1\x24\x89\x93\xba\xb4\x45\x2f\x2a\xa0\x73\xcb\xe5\x5f\xad\xb0\x25\x26\x0f\x39\xa3\xc2\x32\xff\x33\xed\x17\xa4\x57\x73\xe7\xc5\xc0\x9e\x92\x38\xf1\x5e\xa5\xc1\x69\x86\xd9\x5d\x09\xc3\x75\x30\x02\xe0\xbf\x92\x7d\x31\x04\xe7\xbc\xbf\x89\x93\x0f\xf1\x68\xc4\x7f\xe3\xf4\x0c\x5a\x5b\x5b\x39\x6c\x29\x65\x25\xaa\x3e\x12\x28\xb7\x80\x7f\xc8\x00\x43\xfb\x56\xfc\x86\x6a\x08\xdc\x38\xbe\x48\x81\x0a\xca\x8f\x0f\x60\x78\x0b\x66\x49\x00\x86\x65\xc1\xe3\x00\x75\x97\xe4\x0b\x5d\x3c\x0d\xb4\x6f\x0c\x31\x4d\xc3\x02\x38\x1d\x76\xbb\x34\x22\xc9\xcd\x34\xa3\xde\x1d\x18\x17\xf4\x86\x9d\x52\xcc\x4b\x86\xfc\x3d\x57\x41\x91\x8f\x1a\x5b\x97\x6c\xa3\xac\x75\x60\x98\x25\x33\xaa\x82\xa2\x6c\x0f\x6f\x41\xd9\x99\x35\x70\x16\x8b\xb9\x0a\xca\xd1\x64\x03\x60\x1c\x82\x3c\xcf\x73\x15\xf8\x94\x7a\x29\x50\x17\xba\xf0\x93\x80\x46\x1e\x89\xa3\x88\x92\xec\x2e\x9d\x2c\x8d\x7a\x1b\x78\xc5\x67\xba\xe6\xa2\x4c\x55\x8f\x24\xf2\x78\xed\xf1\x9f\x22\xd6\xd4\xc7\x75\x90\x4e\x13\x8a\x3d\xfe\x41\x90\x51\x0f\x3c\x1a\x65\x41\x76\x93\xc5\x71\x78\x11\x30\x25\x8c\x3c\x9c\x61\xb6\x33\x61\xff\x5e\x06\xe9\x0c\x87\xc1\x3f\xfc\xc7\x86\x35\xd5\xa5\x63\x2c\x7e\x62\xf7\xdd\x4a\x4b\xcd\x6e\x81\xd4\xad\x94\x23\x92\xe0\xe6\x44\xbc\xdb\x01\x16\xdc\x4f\xf0\xf4\xce\x18\x60\xfb\x75\xde\xd9\x3b\x1f\x57\xfe\x39\xd3\xf5\x9e\xb7\xf8\x75\xe9\x8a\x8d\x19\xe0\x2e\x9e\x06\xbb\x69\x1a\x7e\x27\x81\x1f\x13\x1d\xfc\x12\x50\x0b\x0e\x71\xee\x33\x83\xfd\x35\xfb\x7c\xf6\x2d\x96\xcc\x7b\xc2\x46\x05\xb5\x6f\x93\x3c\x91\xac\xd3\xd4\xe2\xd7\xb6\x6c\x8d\x45\x7f\x57\x12\x04\xf7\xc3\xff\xbb\x69\x81\x91\xe1\x4d\x2f\x18\x82\xbf\x94\xde\xbc\xa7\x69\x3f\xc1\x67\x20\x77\x58\xa8\x50\x9c\x90\x31\x50\x01\x8e\xa2\x38\xe3\x11\x90\x9e\x5f\x9a\x80\xe1\xdc\xf0\x5f\x13\x00\x15\x5c\xe1\x4b\x0a\x54\x10\x27\x17\xb3\xac\x16\x1f\x35\x94\x07\xc4\x48\x42\x2f\x03\x7a\x95\x16\xd9\x20\xed\xd6\x0f\x76\xe3\x38\x4b\xb3\x04\x4f\xb5\xcd\x85\xcf\xe6\x14\xa9\x02\x12\xcf\xa2\x2c\x69\x72\x32\x2a\x33\xef\x02\x4f\x05\x14\x27\x19\x53\xea\x34\x20\x17\x34\x61\xda\x65\x39\x19\xd0\xe2\x07\x1a\xc0\xc9\xe1\xf2\xaf\x99\x13\x9f\x95\xb2\x61\x61\x8f\xe1\x6d\x29\x1a\xe7\x79\x68\x80\x21\x30\x80\x0a\x86\x86\xa6\xf3\x47\x61\xd4\x31\x18\x02\xee\x55\x02\xad\x6b\x68\x7a\xd7\x1c\x60\x6a\xba\xa6\xbe\x7f\x38\xa0\x83\x83\xbd\x9e\x49\xfa\x7b\xd8\xd8\xdf\xdb\x1f\xf4\x88\xe9\x93\x7e\x17\xa8\xe0\x5b\x0a\x86\xe5\x68\xbe\x43\x23\xed\x9d\xd0\x37\x49\x97\xd6\xf9\xfc\x12\x54\x93\x51\xce\x8b\xf8\xf4\x02\x86\xe0\xbe\x93\x18\xbf\x9f\xe2\x93\xd0\xfb\x84\x27\x0c\xb7\x48\x64\xc3\xaf\xa5\xd1\x00\x93\x86\xa9\x6e\x58\xd7\xf9\x83\x04\x2f\x11\xb9\xe8\x07\xae\xb1\x7f\xb8\xb7\xe7\x9b\x3a\xd1\x3d\xd3\x3b\x70\x4d\xcf\xf4\x06\x07\x7b\x7a\x1f\x0f\x0e\x8d\xbe\x7b\x87\xe8\xeb\x64\xbc\x8f\x24\x90\xcb\x23\xaa\xf0\x43\x85\xe1\x58\x5c\x92\xbd\x81\xe9\x9b\x03\xe3\x80\x78\xfe\xe0\x70\x60\x52\xcf\x37\xe9\x7e\xbf\x7f\xe8\x1f\xd2\x1e\xee\x9b\x07\x9b\x33\xe2\x7d\x27\xad\x11\xb0\x51\x62\x97\xe5\xd4\x4b\x39\x75\x6d\x4f\xea\xad\x35\xe4\xae\xae\xed\x75\x07\x07\xbe\x7f\x60\x1a\x87\xf4\xd0\x1f\xe0\x81\xd1\xdf\xd3\xf5\x3e\x71\x7d\x73\xe0\xed\xd3\x43\xc3\xc0\xcb\xe2\xde\x67\xb5\xfb\xe8\x35\x85\x62\x5c\x72\xa1\x58\x3b\xb0\x2c\x4b\xaf\x94\xa5\x27\xb7\x59\x30\xc1\xdd\x9e\x08\xbb\x43\x63\xaf\xd7\x33\xcd\x9e\x49\x0e\xf1\x00\x13\x1d\xd3\x81\x87\xfb\x03\xd7\xd0\xf5\x3e\x7d\xa8\x08\xf7\xd1\x6b\x8a\xd0\x2b\xed\xc2\x53\xf5\x43\xfd\x8e\x21\x71\xb7\xeb\xb9\x7d\xff\x60\xff\xa0\xe7\xfb\x07\xec\xa8\xbe\x6e\x7a\x1e\xde\xa7\xfa\x21\x39\xd4\xcd\x7d\xd7\x7f\xa8\x10\xf7\xd1\x5b\xe3\x5c\x22\x7d\x3e\x54\x0a\x8e\xc5\xc5\xf0\x5c\x93\x39\xf1\x61\x8f\xea\x78\xe0\x51\xc3\xef\x9b\x7e\x6f\xbf\xd7\xf7\xf7\xf1\xc0\x3b\xf0\x7a\x0f\x15\xe3\x3e\x7a\x6b\xc4\xa8\xd7\xc7\x87\x0a\x53\xc3\xe5\x22\x51\x6a\x1e\xfa\x06\xee\x99\xa4\xb7\xd7\xf3\x29\xee\xf7\x4d\xd2\xa7\x86\xbb\x3f\xa0\xa4\xef\xe9\xde\x23\x52\xdb\x7d\x24\xd7\x48\x55\xd4\xb4\x87\x0a\x24\xd0\xb8\x2c\x06\xe9\xf7\x58\x1c\xba\x87\x9e\x4e\xf4\x81\x49\xfa\x7d\x1d\xef\x99\xfa\xa1\x71\x68\xf4\x0e\xf5\x95\xe4\x26\xcd\x6c\xf7\xa4\xb5\xfb\xce\x90\x09\x27\x29\xca\xd3\x90\x17\x65\xde\xaa\x60\x32\x0b\xe3\x99\xc4\x94\xda\x40\xeb\xf1\xae\xa7\x39\x59\x6a\x60\x15\x12\xdc\xb9\x9f\x73\xed\x1d\x32\xfd\x6d\x8a\xd8\x40\x33\x37\x49\xcc\xd8\x08\xb1\x5c\x05\xc5\x70\xb1\xd4\x1f\x37\x01\xd3\xa2\x5a\x38\x12\xd7\x82\x50\xc7\xe2\x95\x7b\xdf\xcd\x2c\x58\x31\x80\xa9\xf5\xa5\x3a\x73\x67\x41\xe8\x75\x6f\x66\x81\xb0\x66\xf5\x24\xe1\x72\x2d\xec\xee\x24\x88\x4a\x15\x98\x6b\x8c\xf3\x03\x0e\x3a\xf8\xb7\x0e\x1a\x68\x7a\xb2\xf7\x6f\x1d\x65\x26\x32\x0f\xfa\x21\x47\xfd\x2b\x07\xf5\xb4\xde\xdd\x76\x62\xff\xdd\x45\x9c\xfd\xb7\x20\xb8\x14\x17\x3d\x5e\xd7\x7b\x22\x10\x4c\xd6\x12\x94\x51\x61\x6a\x07\xfc\xf5\xa0\x7c\xe5\x61\x0e\x4a\x0d\xf3\xa5\x3e\x5f\xe8\x97\x10\x87\x4d\xfc\xc1\x32\xf8\x80\x67\xed\xd2\x1d\x84\x68\x8b\xf3\x45\xc7\x77\xe5\x17\xff\x83\xa6\xd5\xf8\x93\xe6\x85\x12\xfe\x3c\x4d\x88\x2c\x2f\x94\xfb\x95\xd5\xa4\xb9\xea\x41\x64\x96\x54\x28\xb4\x62\x16\xad\x11\x75\xfd\x38\x5a\x65\xdf\xd0\x74\xcd\x1c\x48\x8e\x2e\x10\xce\x3d\xea\xce\x46\x92\xa3\x8b\xfd\x2a\x41\xea\x9a\x79\xb0\x21\x3a\x87\x9b\xa1\x63\xc8\x54\xfa\x18\x3a\xb2\x02\xf7\x18\x3a\xb2\x54\xf3\x18\x3a\xfb\x1b\xa2\x23\x8b\xde\xc7\xd0\x91\x45\xc0\x63\xec\xbe\x21\x76\x36\x43\x66\x43\xca\xe9\x6f\x48\xa8\x0d\xc5\xc4\xa6\x5c\x67\x43\x29\x63\x53\x11\xb1\xa1\xcc\x63\x6c\xc8\x5a\x1b\x4a\x18\x1b\xb2\xb9\xb9\xa9\xf8\xdc\x50\x80\x9a\x1b\x72\x42\x73\x43\xd6\x32\x37\x64\x2e\xf3\xa9\xde\xbc\x7c\x37\x10\x97\x33\x56\x0f\xab\xab\xa5\x78\x17\x93\x82\xeb\x6c\x97\xc4\xc9\xea\xc8\xa3\xa7\x19\xd2\xf4\x55\x22\xec\xae\x63\xa6\x04\xa8\x5a\x3c\x79\x1e\x7c\x18\x21\x69\x6b\x67\x88\x6e\x4c\x0c\x96\xc4\x39\xfc\xd5\x58\xec\x72\x19\x27\x71\x9c\xc5\x71\x28\xbb\x78\xf6\xa4\x99\xbe\x44\x90\x30\x55\x6e\xed\xb2\xbe\xb3\xda\xa9\x4c\x68\x6c\x9c\xa2\xbc\x43\x7e\x1a\x45\x59\x14\x3e\x4d\xea\x4d\x53\x34\xa5\x09\xf0\x69\x14\x65\xb1\xf5\x34\x8a\x9b\xb6\xb5\xbc\x85\x7f\x1a\x45\x59\xa6\x7c\x0a\xc5\xbd\x8d\xfb\xe3\xde\xc6\xf5\xb8\xb7\x49\x3d\x4a\x53\x2a\xf3\x78\xe1\xfa\xe5\x7b\x31\xbc\xe3\x03\x7b\xce\x80\x88\x35\xfe\xda\x2b\x5f\x4d\xfe\xca\x8c\x22\x90\x17\xb4\x78\xa6\xfa\xf6\xf7\x8c\x26\xb2\x09\x8d\xb1\x66\x42\x23\x10\x76\xa5\x77\xe4\x6a\xaf\x76\xe1\x36\xc4\x45\x75\x33\x84\x64\x3a\x7e\x14\x21\x99\xf9\x1f\x45\x48\xd6\xed\x3c\x8e\x23\x59\xd4\x3c\x8e\x92\x2c\xeb\x3c\x8a\x92\xac\x41\x7d\x1c\x4b\xb2\xd4\xfa\x28\x4a\xb2\x16\xfe\x71\x2c\x6d\xc8\x97\x0e\x36\xe7\x94\x9b\xf3\x80\x0d\xb9\xf7\x81\xb4\x24\x3e\x8e\xa5\x8d\xe5\x00\x59\xff\xfc\x28\xd9\x36\xc4\xd1\xc1\xe6\x92\xc9\x86\x02\x77\x7f\x53\x66\xdb\xdf\x60\xc2\xdd\x5c\x2e\x79\xba\x03\xac\xfd\x9c\x61\x1c\x88\x2a\x79\xc0\xdf\x0f\x8a\xcf\x1b\x7c\x32\x6b\x94\x93\x59\x63\x09\x76\x9f\xbf\xef\x97\xb0\x83\xa2\x00\x0f\xca\x4f\xd4\x64\x9c\xc4\x13\xba\xeb\x27\xfc\x27\x38\xb2\x49\xa6\x44\x9e\x57\x6f\xde\x45\x69\x86\xc3\x50\x22\x4f\xb5\xd7\xd0\x8c\x7c\x86\xf4\x28\x42\xb2\xc8\x78\x18\xa1\x75\x97\xc2\xa5\x3b\x61\xf1\x7d\x72\xf1\xff\x99\xb7\xaa\x9e\x83\x35\xec\x2c\x70\x24\xec\x34\xf6\x84\x4c\xfd\x35\x7a\x7e\x30\x19\xf9\x1d\xf5\x11\xdc\xc8\x42\xf4\xfb\xc9\xac\x78\x70\xe9\xb1\x7a\xf9\x15\xae\x5f\xb4\x7a\xfd\xf2\xd2\x6a\xac\x40\x2c\xed\x8b\x94\xb8\x4c\x45\x2f\x7d\x5f\xeb\x09\x6b\x79\xf1\xb7\xf8\xbb\x2f\xb6\x0c\xb8\xcb\xfe\xd1\xae\x59\x6b\xdb\xf8\x61\xbf\x44\xc8\x25\xf0\x4a\xeb\x3f\x8a\xb4\xfc\xaa\xbb\x11\xd2\xf2\x7b\xf9\x86\xb8\x96\xf9\xf2\x86\x74\xfd\xc3\x14\x22\xbf\x60\x6f\x84\xb4\xbc\x09\xab\x60\x1f\x42\xf7\x9e\x0e\xe1\xc9\x44\xef\xf6\x8a\x47\x11\xdd\xfb\x71\x9a\xdd\xff\x71\x5e\xbc\xff\x23\x5d\xed\x87\x91\x96\x0f\x23\x36\x44\xfa\x47\xe8\x7a\x6d\xa9\x30\xab\xaa\xd0\x2f\x67\x09\xfd\xe6\x6b\xd9\xdb\x2c\x4d\x1a\x7a\x77\x4e\x1a\x7a\xcd\x49\x83\x51\x9f\x34\x48\xe7\x0c\xeb\x9b\xcc\xb5\xdd\x5c\xb3\x63\x91\xd7\x9e\x07\x91\x90\xd7\x98\x07\x72\xb1\xfe\x46\xf1\xdd\x5c\xac\xbf\x02\x7c\x37\x89\xf5\xcd\xff\x77\x0b\xf2\x64\x8b\xdc\x35\x3c\xfa\x4e\x12\xf2\x72\xf1\x20\x12\x77\xdd\xf1\xbe\x9b\xc4\x93\xfd\xc2\xbc\xe3\xca\xfa\x9d\x24\xe4\x09\xfe\x81\x24\x9e\xec\x5a\xf2\x5a\xf0\x40\x12\x4f\xb6\x88\x3c\x01\x3f\x90\x8b\x27\x3b\xb8\x3c\x57\x3f\x90\xc4\x53\xb8\x58\x9b\xd6\x97\x32\xf9\x5e\xbd\xf7\x5f\x4a\xeb\x66\x33\xad\xef\xdd\x99\xd6\xfb\xc5\xef\x2d\xf3\xad\xff\x0f\x00\x00\xff\xff\xac\xf9\x00\xe7\xe9\x5f\x00\x00") func pagesAssetsJsGoogleJsapiJsBytes() ([]byte, error) { return bindataRead( @@ -170,7 +170,7 @@ func pagesAssetsJsGoogleJsapiJs() (*asset, error) { return a, nil } -var _pagesAssetsJsJquery1102MinJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\xbd\x79\x7b\xdb\xc6\xb5\x30\xfe\xff\xfd\x14\x22\xea\xab\x00\xe6\x88\x22\x9d\xa4\xef\x2d\x98\x11\xaf\xe3\xa5\x49\x9b\xc5\x89\x9d\x26\x29\x45\xe7\x81\x48\x50\x42\x0c\x02\x0c\x00\x6a\xb1\xc0\x7e\xf6\xdf\x59\x66\x06\x33\x00\x28\xbb\xf7\xbe\xbf\xe7\x79\xd3\x5a\xc4\x32\x98\xf5\xcc\xd9\xe6\x2c\xa7\x8f\x07\x47\xbf\xff\xb0\x8b\x8b\xbb\xa3\xeb\xc9\x68\x32\x1e\x3d\x39\xaa\x8f\xfc\x65\x70\xf4\x64\x3c\xfe\x5c\xc0\xdf\xc9\xa7\xfa\xfd\xcb\x7c\x97\xad\xa2\x2a\xc9\x33\x71\xf4\x75\xb6\x1c\x41\xc1\xdf\xff\xc0\x37\xa3\xbc\xb8\x3c\x4d\x93\x65\x9c\x95\xf1\x7f\x9c\x9e\xfe\xf7\x51\x99\xef\x8a\x65\xfc\x6d\xb4\xdd\x26\xd9\xe5\x4f\x3f\x7e\x23\x55\xb9\x4d\x92\x8d\x36\xd1\xf6\x3f\x1e\x9f\xfe\x87\xbf\xde\x65\x4b\xac\xcb\x8f\x45\x15\xdc\x5f\x47\xc5\x51\x26\x0a\x91\xc8\xea\x6e\x1b\xe7\xeb\xa3\x4a\xe4\x32\x1e\xa5\xf9\x92\x1b\x8c\xe0\x66\x95\x2f\x77\x9b\x38\xab\x44\x29\x23\x73\xf3\x22\x8d\xe9\x59\x0a\x05\xb8\x9f\x62\x07\x97\x8f\xc4\x52\xde\xef\xc5\x56\xce\x17\x62\x2d\x3d\x1e\x99\x27\x56\x72\x3b\x5a\xe6\x19\x54\x2a\xae\xe0\x72\xbb\x2b\xaf\xc4\x25\x5c\x94\xd8\x7b\xb1\x81\xab\x24\x5b\xc5\xb7\xdf\xaf\xc5\x9d\x5c\x8e\xaa\xfc\x75\x55\xc0\x08\xc4\x35\xdc\x5c\x45\xe5\xf7\x37\xd9\xab\x22\xdf\xc6\x45\x75\x27\x2e\xe4\x7a\x04\x2f\x37\xe2\x56\xba\x23\x29\xe2\x6a\x57\x64\x47\x59\x7c\x73\x74\x3b\x5a\x67\x50\x61\x52\xe1\x1b\x51\x04\x7b\x71\x23\x4f\xe7\xc3\x93\xc5\xcc\x9f\x85\xe7\xab\xc7\xe7\xa3\x3a\x38\x5f\x0d\xe1\x66\x1e\xbf\x58\xd0\x0b\xb8\xad\x83\xd3\x11\x4f\xa0\x78\x23\x4f\xcf\x5f\x0f\x4f\x2f\xc5\x33\x79\xfa\x76\x7e\x5e\x9e\xef\x5e\xbe\x78\xf9\xf2\xfc\xf6\xe9\x78\x31\xac\x5b\xf7\x8f\xa0\xd8\x77\x50\x0c\xab\x2e\x1f\xfb\x5f\xcc\xcf\x6f\xce\x7f\x5e\x0c\xcf\x82\xf9\xdb\xb3\xc5\xe3\xfa\x4f\x3e\x3c\x38\x59\x3c\x0e\x82\x47\xa7\xe2\x1d\x94\xfb\xc2\x3f\xbf\x19\x06\x50\xf4\xfc\x74\x76\x06\x1f\x7d\x71\x7e\x7a\x3e\x39\xab\xf1\xf5\x0b\x6a\x6d\x21\xc2\xfb\xfd\x79\xb9\x78\x0c\x4f\x5e\xcb\x53\x28\xf2\xb6\x0e\x6b\x11\x70\x03\xe7\xf3\x00\x3b\xf6\x14\x7a\x78\x8e\x03\xf0\xce\xcf\xcf\x4f\x2f\xd6\x59\x51\x2d\xea\xdd\xfc\x7c\x15\x9d\xac\x9f\x9e\xbc\x5c\xdc\x7f\xb6\x0f\xa0\xd8\xef\xf2\xd4\x9b\xbf\xc5\x32\xc5\x79\xb6\x78\xec\xd5\x55\xb1\x8b\xeb\x75\x94\x96\x71\x9d\xed\xd2\xb4\x3e\xe1\x29\x19\x1e\x9c\x92\x4b\xf1\x1c\x7a\x75\xb2\x29\x4f\x4e\xc5\x37\xf2\xf4\xc4\xa7\x36\xde\x2f\xe0\x4d\x22\xbe\xea\x5f\x83\x0a\x56\xf0\xa7\x2d\xac\xd7\xb3\xa8\x8c\x7d\x98\xfe\x3f\xac\x72\xc1\xbd\x1f\x8d\xa2\xd5\xea\xc5\x35\x80\xcf\x37\x49\x59\xc5\x59\x5c\xd4\xb5\x97\xe6\xd1\xca\x93\x12\x60\x08\x21\x11\x1e\x2c\xf3\xcd\x36\x8d\xab\x18\x1f\x46\xa3\x22\x8e\x56\x77\xaf\xab\xa8\x8a\x83\xe3\x63\xff\x37\x3f\x10\xb7\xfc\xcc\x0f\xa0\x81\xdf\x9a\x06\x82\xfb\x6e\xf5\x33\x1f\x2b\xd8\xe4\xd7\xb1\xf3\xd8\xf7\x9e\x7f\xff\xed\xb3\x3c\xab\xf0\x19\x34\x1f\xaf\x3c\xf1\x87\x18\x4c\x02\x11\xf7\x17\xa7\x3e\x72\x91\x20\x84\x3a\x57\x71\x15\x2d\xaf\xa8\x90\xef\xe5\x19\xf5\xa7\xc4\x3e\x2e\xaf\xa2\xec\x32\x86\xa2\x58\x55\xab\x94\xaa\x04\xba\x3d\x45\x40\x95\xb7\xa3\x6d\x91\x57\x39\x8e\x5a\xde\xf3\x86\x0d\xd7\x02\x76\x4b\x09\x8b\xb5\xac\xf2\x22\xbc\x15\x08\xcc\xa1\x35\xd7\xb0\x65\x79\xef\x26\x22\x9f\x26\x6b\x7f\x10\x07\x7a\xee\xaf\x92\x12\x9f\x78\x25\x6d\x21\x98\x3c\xb5\xb1\x61\xe2\xe1\x71\x22\xbd\x2f\x78\x96\xa1\x8b\xc5\xd3\xca\x1f\xc3\x74\x7a\x67\xce\x23\xd8\xfe\x71\x76\x59\x5d\x9d\x4c\xe0\x9d\xbe\x39\x93\x9f\xce\xe6\x08\x32\x02\x5a\x87\x9f\x45\xf8\xdd\x28\xbe\x8d\x97\xb0\xa0\x62\x90\xd4\xf5\x20\x99\x4f\x16\xc7\xc7\x99\xea\xc7\x20\xab\xeb\x6c\xc4\xa3\x99\xf9\x70\x53\x04\xa3\x35\xec\x71\x28\x1e\x62\x17\x47\xd6\xf8\xfc\xcc\xbc\xc3\x9e\x63\x45\xd4\xd7\x4c\x66\x47\x09\x94\x8a\xb2\x25\x0e\xe0\x76\x96\xcd\xc7\x8b\x30\x83\x85\xdf\xc4\xc5\x65\xec\x63\x3d\x70\xb3\x8d\x8a\x32\xfe\xea\xcd\xb7\xdf\xd0\x97\x22\x83\x4e\x8c\xb2\x7c\x15\xbf\x81\x71\xcf\xb2\x51\x7e\x03\x4b\xf7\x5c\x61\x2d\xe8\x54\x18\x89\xc1\x38\x08\xc4\xbb\x51\x15\x97\x15\xb7\x76\x7c\x7c\x3b\x4a\xca\x57\x69\x94\x64\xdf\x5f\xfc\x1e\x2f\x2b\xe8\x52\xb0\x86\x9e\x25\xd0\x81\xa3\x2c\xc0\xb7\x2f\xf5\xec\x63\xb3\xf3\x64\x11\xcc\xd4\x85\x9f\xe1\x1d\x8f\x2a\xaa\x2a\xf8\x48\xd0\x93\xa9\xb5\x22\x7b\x18\x4e\x0e\x50\x7c\x19\x6b\xc4\xf9\xe5\xdd\xd7\x2b\x68\xfc\xc9\x22\x10\xf9\xf1\x71\x8e\xa3\x80\xa7\xdf\x41\xbf\x69\xec\xf9\x28\x59\x0d\xa4\xa4\x02\xaa\x9e\xc2\x4c\x12\x35\xc5\xcb\x22\x27\x82\xba\x31\x5e\xc8\x7c\x6f\x35\x88\xf3\x5b\xc5\xb7\x95\x8c\xe8\xfd\xa8\x8c\xd3\x18\xe7\x5a\xc6\x74\xaf\x8b\xc6\xcd\x4c\xf9\xce\x67\xba\x52\x2e\xee\x36\x16\x84\xce\x7c\xc4\xc1\xac\x50\x5b\x11\x16\x17\xa0\x47\xb7\x05\xfd\xaf\x60\xaf\xb6\xda\x37\x97\xc2\x69\x30\xd6\x57\xb8\xb1\x37\xd1\xbb\xf8\x69\x51\x44\x77\x3e\xb7\x8f\x5b\x5c\x7f\x16\x7a\x9e\xe0\xee\x84\x63\x51\xe5\x54\x2c\xb4\x76\xbf\x1a\xd9\xe5\x68\x19\xa5\x29\x35\x0e\x1f\xc3\xbc\x87\x36\x0a\xd2\xc4\x02\x00\x19\x00\x9f\x56\x72\xa4\xea\xf2\x83\x70\x7c\xc6\x8f\xe6\xd6\xd8\x87\xf1\x82\x96\x78\x1e\x2f\x80\xbc\x01\xfd\x02\x5c\xb4\x7c\xe7\x54\x8a\xfb\xb1\x92\x36\x74\x3a\x50\x0e\xa8\xa0\x81\x09\xd8\xf3\xf1\x35\xc3\x1a\xcd\xb5\xa8\x9c\xa9\xd7\x37\xa2\xda\x8b\x18\x90\x47\xd8\x8b\x67\x6f\x47\xf8\x8e\xf7\x01\x3e\xdf\x0b\x5a\x86\xbe\x91\x2a\x64\x89\xa8\x66\x93\x20\x52\x06\x42\x9e\xc5\xb8\x79\x09\x1c\x04\x11\xe2\x9e\x69\xa4\xce\x98\xe1\xfa\x97\x23\xe0\x2d\xd2\x3b\x6e\x32\x2a\x2e\x69\x53\xd1\xf2\xac\x93\xa2\xac\x0e\x55\x10\xff\x01\x78\x66\x2f\xd2\xe8\xc1\x22\x80\x6f\x60\xb4\x7f\xf4\xcc\xa9\xb5\x0e\x22\x93\xc3\x78\xe8\xd3\x12\x85\x63\x67\x93\x59\xfd\xcc\xce\xe4\xf8\xf8\xb8\x3a\xcb\x66\xb4\x86\xf3\x6c\xb1\x08\xe7\x0b\xa8\x1e\xb8\xa0\xbe\xe9\x69\x7d\x8e\x10\xb8\xe5\x41\x9a\xc2\x95\xc8\x4c\xf1\x58\x01\x17\xe0\x61\x98\x75\x1c\x7e\x9c\xad\x0e\xce\x9e\x59\xe9\xba\xee\xa2\x3e\x80\xc0\x80\x01\x2a\xbc\x12\x65\x5e\x54\xd0\xcf\x11\xfe\x8a\x72\x4b\x6b\x82\xb7\x74\xb5\x17\x86\xaf\xb1\x28\x06\x3e\x83\x17\x00\x2b\xd0\x05\xba\xd3\xd7\x56\x77\x70\x16\x89\x68\x08\xa0\x17\x22\x42\x46\x4e\xaf\x1d\x6c\xf2\xba\x06\x8e\x2d\x85\xcd\xbd\x6b\x1e\xeb\xd9\x5e\xca\xc1\x64\x8a\x98\xd0\xbb\xc8\xf3\x34\x8e\xb2\x86\xa0\x94\xb0\xb7\x97\xb2\x74\x2a\x9b\xe8\xca\x9e\x04\xc2\xcb\x69\xd0\xd6\x07\x75\xed\x20\x8e\x32\xa8\x6b\xbf\x04\x76\x31\x80\x96\xa5\x4c\xa1\xbe\x92\x37\xc3\xc9\x49\x1a\x4c\x77\x67\xe9\x34\x1d\x0e\x03\xa4\x04\x30\x4b\x03\x89\x18\xd4\xb4\x94\x2e\x2c\x0c\x9d\x07\xb1\x44\x54\x2c\x0a\x99\xe3\x4f\x09\xa8\xa7\xc0\xee\x1d\x1f\xe3\x4f\x1b\xb9\x17\xd8\x30\x12\xde\xa4\xe4\x2d\x5f\x04\x41\x00\x54\x0a\xfe\x0f\xc3\x45\x9e\x97\x09\x82\x42\x41\xc1\x0c\x57\x21\x08\xcd\x73\xbb\x2e\x7a\x0b\x43\xc6\xe6\xa5\x5e\x07\x7f\x09\x93\x0c\x95\x86\x1a\x07\xd2\x5b\x78\xa0\xc1\xb5\xdc\x9b\x35\xf3\xef\xe3\xdb\x6d\x94\xad\xf2\xd0\x63\x3e\xda\x1b\xfa\xeb\xe1\xb7\x51\x75\x35\x2a\xf0\xf1\x06\x18\x1c\xd8\xbc\xdb\x34\x5a\xc6\xfe\xe9\xf9\x73\xe0\xc8\x3c\x2f\x10\x59\x0e\x8c\xcb\x1a\xe0\xc2\xda\x51\x95\x05\xa0\x8f\x60\x46\x6f\xa1\x65\xbc\xda\xc1\x2e\x47\x4a\xce\xf5\x9b\x17\xea\x36\x05\x8c\xbb\x17\x49\xf9\x23\xe1\x0e\x18\x3f\x61\x8a\x9f\x23\xe0\x38\x26\xe2\x2a\x4f\x57\x3f\x76\x90\x4a\x3c\x53\xf8\x04\x4b\x0d\x87\xa1\x66\xc5\x06\xe3\x5e\x1c\x04\x2b\x18\x43\xab\x83\xf1\x6c\x70\x72\x62\x7d\x19\x0e\x70\x36\xa9\x7a\x2a\x34\x88\x46\x17\x39\x5c\xeb\x49\x8a\xab\x37\xc9\x26\xce\x77\x95\xaf\x3e\x0a\xa6\xe6\x03\xa8\x4d\xc4\x03\xac\xf4\xf8\xd8\xa9\xf4\x6c\x8c\x8b\x0b\xf7\x65\x9e\x5e\xc7\x3f\x27\xd5\x95\x1f\x89\xf9\xed\x22\xe0\xed\x03\x5c\xd1\xe5\x65\x0c\x50\x71\xeb\x47\x81\xbe\xf3\x3d\xfa\xdc\x0b\x46\xf9\x7a\x6d\x6e\x82\x3d\x4e\x8b\x06\xd7\x1e\xb4\xe1\xe9\x47\xc8\x3e\xdd\x12\xdf\x0a\x2f\xf1\x23\xa6\x4a\xf4\x57\xc3\x51\x5d\xf7\x54\x10\xe1\x9b\xce\xd7\x3f\x03\x9d\xcf\x6f\x0e\x11\xac\x01\x82\x61\x8c\xfc\xda\x0d\x95\xc3\x2f\xbe\x83\x5d\x51\x24\xcb\x9e\x4f\x06\xf0\x32\xfa\xce\x27\x26\xe9\x25\xb0\x9e\x08\xb1\xc0\xef\xc0\xb8\x10\x91\x70\x8b\xd8\xf4\x43\xe4\x31\x1e\x7a\x5e\xd8\xd9\xce\xc8\xa3\x5b\x13\xa0\x9f\xce\x96\xf3\x3b\x46\x8f\x71\x00\xd8\x40\x7f\x16\xea\xf7\xd8\x5d\x6b\x03\x75\xb0\x7d\xc6\xfc\x6c\xf3\xe5\xc0\x9a\x9d\xba\x6e\x38\x16\xc6\x26\x3c\x57\x38\x28\x35\xde\xc9\xb4\x2a\xee\x08\xe4\x6c\x44\x7b\x7c\x3c\xb8\x56\xbd\x12\x9e\xf5\xdc\x0b\xac\x37\xf6\x07\x0d\x8a\x15\x1e\x74\x58\xdf\x7c\xbf\xf6\x9a\x96\xf6\x20\xcf\x02\xfd\x2d\xcc\x5c\x4f\x90\xcf\xbb\x1d\x95\xbb\xed\x16\x30\x38\xb2\x9e\xdf\x00\xc9\x23\x3c\x85\xac\xec\x91\xe1\xd2\x4d\x5f\xb2\x60\x6a\xbd\xd5\xe8\x21\x03\x88\x00\x6a\x61\x95\xc2\x59\x7b\xb1\xd9\x56\x77\x07\x66\xad\xa2\x6a\x2a\xbb\x11\x98\x09\x75\x31\x06\xfa\x54\x14\xc0\x3a\xd9\x5f\x55\x57\x45\x7e\x73\xf4\x02\x9f\x13\x10\x18\x36\xda\xe1\x35\x90\xe8\xe9\xf5\x50\x12\xc5\xa0\x91\x28\x2c\x38\x99\x76\x09\x04\x22\xbe\x4c\x02\x0f\x23\x51\xa4\xaa\x70\x44\xd1\x14\x3b\x5b\xc8\x77\x46\x76\x48\xe4\x00\x38\xf6\xf9\x42\x0f\xbd\x00\x8a\x3d\x5a\xc2\x0e\xac\x62\xc5\x29\xfb\x05\xb2\xe8\x8b\xd0\x2f\x00\x0e\x2e\x76\x49\xba\x7a\x59\x44\x97\xf4\x06\x98\x31\xe8\x62\x02\xb5\xe0\x7e\x4e\x02\x25\xb5\x91\x70\xc8\x5c\xd8\x1c\x68\x02\xc8\x35\xf0\x11\xb2\xd6\xc4\xa9\xd0\x40\xff\xf6\xfa\xfb\xef\x9a\x81\xda\x94\x1d\xdf\x20\xb2\xc4\x5f\x96\x2d\x66\xf6\x0d\x94\x0d\x79\x5f\xc8\x6c\x96\x85\x1d\x31\x2b\xa3\x41\xdf\x92\x8e\x02\xca\xa2\x38\xf2\x82\x25\x8d\xcc\x60\xf1\xa7\xc2\xfb\x6f\xaf\x41\xea\xbf\x0b\x6f\x61\xdd\xbe\x46\xfc\x0e\xf4\xc8\xd0\x49\x4f\xf5\xcd\x1b\x66\x01\x70\xa7\x00\x60\xb4\x9a\xbe\xf7\x75\x76\x1d\xa5\xc9\xea\x88\x06\x43\xaf\x89\x09\xa4\x7e\xfe\x62\x2f\x64\xc6\x40\x02\xe4\x9f\x36\x57\xd6\xb3\x98\x99\xb3\x98\xb8\x85\xe2\x11\x48\xc7\xaf\xb0\x2e\x90\x9f\x13\x89\x8a\x15\xf3\x00\x08\x6d\xc2\xf3\xf1\x12\x18\x4a\xd6\xd6\xf8\x99\xf0\x90\x67\x3d\xbd\xdd\xa4\x1e\xca\xc7\x05\x7d\xf3\x14\xba\x70\x1d\xff\xa2\xc8\xa5\xf7\x6d\xb2\x2c\xf2\x32\x5f\x57\x23\xe8\x21\xd4\x07\xa4\xac\x18\x45\xe5\x5d\xb6\x94\x1e\xe9\x25\x3c\xb8\x47\x11\x19\x5e\xa3\x14\xa6\xf6\x58\x0e\x2b\x24\x2b\x2d\xb6\xc0\x76\x2e\xda\x9a\x28\xd8\xc7\x85\x25\x5f\x95\x5f\xde\xbd\x89\x2e\xbf\x8b\x36\xb1\xef\x51\x47\x0b\x9a\x34\x98\x67\xe6\x6c\x10\x7b\xb4\xa6\x11\xa7\x8c\x67\xb1\xd8\x03\x7d\xcd\xb7\x36\x47\x07\x32\x44\x9a\x5f\x44\xe9\x0b\x28\xeb\x50\xdc\x0a\x79\x02\x5a\xed\x2a\x20\xb2\x8a\x90\xfd\x7a\x59\x24\xdb\xca\x42\xf9\x50\x10\xde\xc0\xb7\x7a\x4b\x23\xdf\xe8\xe3\x6a\x2d\xa1\x8b\x29\x2a\x4a\xfa\x30\x70\x6c\xa0\xe2\xb9\xf0\x36\xe5\x89\x05\x26\xdf\x88\xaf\x02\xec\xe6\x2a\xc6\x41\xf6\x0b\x08\x8c\x2c\xf1\x3d\x42\xb4\xbe\x06\x49\xe7\x9b\xfc\x46\x6b\x67\x10\xd5\xb8\x4f\x7a\x44\x0e\xd1\x40\x90\x1c\xb3\x86\x90\xf9\xc3\x48\x7e\xab\xc4\x76\x46\x14\x51\x70\x8f\x88\x68\x9a\x9f\x01\xa8\x31\xf3\x06\xeb\xa6\xa4\x86\x18\x79\x33\x9c\x5e\x64\x06\x26\xc1\x05\xec\xf2\x77\xfb\x18\xd6\xfc\xc8\x70\x72\xf1\xc7\x7e\x71\xb8\x2d\x9e\x60\xfc\x30\x11\xf8\xf3\x71\xed\x3d\xfc\x95\xc6\x4e\x40\xbd\x70\xa9\xc3\x0b\x80\xb6\x0b\xfe\xc6\x3b\xdf\xad\xe3\xf5\xfa\x7c\x37\x1e\x47\x63\x2f\x98\x3d\x40\x47\x81\x8a\x5e\x68\xd2\xb8\x7f\x88\xe0\x42\x41\x1f\x89\x6e\xb3\xda\xcf\x10\x29\xa0\xf8\xa2\x04\xe3\xb0\x47\x8d\x8b\x08\xb6\x41\xa4\x86\x55\xf0\xbf\xf5\x0d\xaf\x1a\xcc\x34\x62\x84\xcd\xda\xd1\x10\xcd\x00\x9f\x86\x20\xc3\x5f\x71\x27\x33\x10\x58\x01\x81\x01\xe9\xc9\xba\x6d\x1a\x88\xc0\xb5\xaf\x68\xed\x37\x1a\x85\x6c\xb4\x78\x64\xe8\x1b\xce\xb0\x91\xdf\xb2\xd9\x18\x04\x33\xe2\x70\x37\xd1\xad\x3f\x16\xc5\x10\x91\x6a\x38\x9e\x16\x67\xd9\x34\x53\x2c\x3f\xae\x0e\xec\xad\x0a\x64\x37\x54\x4e\x19\xf4\xa4\x70\xc0\xc9\x04\x66\x03\x47\xe2\xa8\xc5\x54\x9f\x64\xa6\x5b\x4b\x1a\x50\xcd\xe5\x98\x14\x63\xd9\x6e\x73\x11\x17\xcd\xb0\x0b\xa2\xcf\xd0\x76\x3e\xcd\xa1\x6d\x58\xfc\xe1\x70\x21\xb3\x79\xbe\x98\x12\xac\xdc\x00\xf5\x80\xf9\x82\x7b\x64\xe6\xad\xf7\xf0\x63\xe0\x42\x6b\x48\x00\x78\x00\x53\xc0\xaa\x1d\xdc\x3e\x40\x91\xa0\x27\xa4\x58\xe7\x6f\x98\x01\x90\x83\x41\x36\x8d\x54\x1f\x0a\xb8\x83\xe5\x82\x26\x45\x0e\x2b\xc0\xd2\x4c\x42\x02\x2a\x3d\x35\x8c\x42\xd2\x96\x68\x3f\xb8\x55\x41\x5c\x03\x18\xa1\xdd\xe3\x6c\x1e\x58\x21\x0d\xfe\x48\xb5\x08\x78\x0a\x92\x5c\xb4\x2c\x88\x02\xcc\xb4\xbd\x7b\x3e\xf2\x33\xd5\xdd\x95\xda\xd6\x30\x07\xa4\x95\xd9\x25\x2b\x90\x31\x80\xd3\xba\xbd\xeb\x5b\x46\x94\x56\xd5\xa7\xbd\x74\x16\x06\x07\xd0\x01\x10\x15\x8b\x58\xe6\x48\xf4\x5d\xb5\x14\x80\x9d\x52\x03\x19\xb9\x51\x3c\x41\x96\xa3\x2b\xa9\xc7\xaa\x67\x19\xcb\xe8\xc8\x34\xd0\x71\x85\xdf\xae\x20\x40\x16\x22\x19\x61\xd7\x61\x6a\xad\x1f\x24\x28\xf8\x3b\x1c\x02\x43\x12\x56\x7b\x11\x2d\x97\x71\x59\xb6\xb4\xb6\x5a\x00\xe7\x11\xa6\xb0\x42\xbb\x66\x85\x96\x92\x11\x00\xed\xa9\x86\xdf\xd6\xec\x2f\xc8\x8f\xf7\x39\x08\x3c\x04\x30\x29\xce\x7f\x11\xdc\x8e\xb8\x19\xaa\x3d\x15\x05\xc8\xc5\x02\x24\x23\x6c\xc1\xe0\xc9\x44\x09\xa1\xf8\xad\x3b\x47\x09\x4b\xe0\x20\xb6\x89\x25\x2e\x1a\x08\xc0\x9a\x3e\x01\x53\x95\x51\x77\x80\x90\x43\xbf\xe0\xa6\x0d\x64\x6a\xe6\x96\xfc\xc5\x2d\xc2\x56\x86\xca\x10\xa1\x74\xa7\x46\x80\x87\x2f\xb0\x5b\x85\x28\x67\x49\x98\x68\x4c\x0b\x4f\x52\xa1\x5f\x05\x8d\x68\x9c\x83\x3c\xbd\x9c\xe9\x7e\x04\xe1\x6e\x86\x85\xc6\x58\x28\x8c\x90\xe0\xdd\x74\x15\x2d\x3e\x31\x27\x78\x36\x80\x1c\x00\x0a\x8d\x48\xc5\xca\x9b\xce\xd6\xb0\xd4\xe6\xb0\x1f\xee\xf7\x34\x95\x39\xa1\x9a\x20\x82\x8d\x85\xea\xc9\xea\x2e\xa5\x9d\xd7\x5c\xca\x0a\x91\x01\xb0\x40\x9a\x2a\x89\x02\x31\x6d\x60\x7f\x6d\x95\xc6\x8a\x9a\x0d\xba\x37\x27\x15\x5a\xf9\x26\x6d\xae\x80\xf8\x31\x42\x78\xb0\xcc\xcf\xe3\x35\xf0\x24\xf1\x0a\x18\xd8\xc3\xc7\x1f\x7d\x62\xb1\x21\x89\x9d\xa3\x8f\xa0\xfb\xe8\xa1\x63\x8f\x6e\x59\xeb\xcc\x83\x9a\xc1\xe3\x95\xea\x63\x8e\x3d\x5a\xa5\xf4\xb1\x87\x92\x00\x94\x9c\x56\x28\x90\x8f\x47\xeb\x02\x58\x13\xc3\xcb\x75\x0e\x1a\x15\x1f\x98\x00\x27\xa6\xb8\x3f\xe0\xb1\xf2\x34\x3d\x3e\xd6\xb3\x79\x94\xfb\x3c\x9d\x96\x52\x81\x9a\x30\x65\x61\x30\xf1\xba\xf2\x34\x4f\xd9\xd0\x5d\x6b\x4a\x73\xf1\xf9\x38\xd8\x3b\xe7\x4b\xfb\x3d\xfc\xd3\xe4\xc7\x68\x50\x91\x77\x53\x0a\x58\xef\x4b\x16\x7d\x8e\xbe\x23\xd2\x72\xc4\xfc\xf0\x91\xde\x66\x47\x44\x3d\x09\x3e\x8f\x7e\x8c\x2f\x5f\xdc\x6e\x8f\x98\x20\xb3\xf4\xe5\x91\x7e\x0f\xe6\xe8\x08\x78\x61\x97\xac\x2f\xe7\xde\x9c\xd1\x00\xf0\xa5\xd5\x10\xc4\x84\x45\x87\x59\x03\x28\xd4\xed\x7c\xdb\x68\x4c\xe3\x86\xdc\x1a\xe1\x79\x6a\x74\xc1\x96\xd8\x3c\x1b\x4c\xc2\x09\x9d\xfe\x68\xb9\x1a\x68\xee\x6c\x30\x0e\x1b\xdd\x44\x66\x0b\xfa\x80\x4b\x10\xf5\x8e\x59\x42\xed\x10\x53\xa4\xd8\x67\xa8\x7a\x3d\x99\x30\x81\xd8\x83\xd4\x06\xb4\x46\x1c\x38\x76\x66\x6c\x08\x98\x60\x27\x96\x62\x2b\xd6\x62\x25\xae\xc4\xa5\xd8\x88\x3b\x71\x2d\x2e\xa4\x57\x26\xef\xdf\xa7\xb1\x37\x3c\xd1\x3b\x5c\xdc\xd8\x27\xd2\x6f\x00\x81\x3e\x83\x7f\xdf\x49\x10\xb0\x02\xf1\x8e\x7f\x5e\xf0\xcf\x6b\x54\xe6\x3d\xed\x3f\xa2\x44\x7d\x54\x35\xf3\x5f\x23\x4a\x1c\x07\x21\x48\xc8\xbf\x37\x27\xe0\xcf\xe5\xe4\x8b\x2f\x3e\x9d\x88\x6f\x00\x43\xb4\xcf\x9f\xbf\x42\x02\xfe\x87\xfc\x6a\xb4\xcd\xb7\xe2\x37\xfc\xc5\xb3\xec\x6f\xf5\xc5\xf7\x70\xc1\x87\xda\x2f\xe1\x4a\x1d\x6a\xbb\xaa\x1f\x5e\xa0\x31\xac\x8c\xa5\xd6\x26\x54\x32\xcd\xce\xaa\x69\xc5\xfc\x0f\x9f\x3f\x38\xac\x4f\x35\x6d\x58\x9f\x2f\xa5\xb7\xbc\x8a\x97\xef\xe2\x55\xcd\x07\x23\x70\x41\x52\x54\x1d\xed\xaa\x7c\x0d\xf3\x53\xd2\x15\x70\x8f\x77\x35\x1e\x26\x00\xfc\x97\xf5\x0a\xf1\x4b\xbd\x4a\xca\xe8\x22\x85\x0f\xae\x92\xd5\x2a\xce\xea\xa4\x04\x1e\xa2\x4e\x41\xe0\xa9\x37\xbb\xb4\x4a\x00\xed\xd4\x30\xda\xac\x46\xf8\x87\x8d\x7b\x07\x17\x7f\xec\x92\x02\xdb\x5a\xc2\x0b\xd8\xc6\xaf\xa4\x37\x3f\x3f\xbf\x7d\x32\x3e\x3f\xaf\xf0\x6c\xf9\x3c\x3b\x3f\x5f\x2f\x3c\xf1\xa3\xf4\xf0\x3c\x19\xfe\x1b\xd5\x50\xe0\xe6\x64\x51\xcf\xdf\x42\xc1\xf1\xf8\x04\xfe\x46\xe3\x45\x30\xf4\xc4\xcf\xf2\x47\xc3\xd7\x7a\x37\x9e\xf0\x6e\xfe\x04\x90\xff\x48\x7a\xe7\xe7\x73\x6f\xf8\x6a\xe8\x3d\xf6\xbd\xe1\x8f\x43\x2f\x50\x37\xb3\xd0\x9f\x3f\x7e\xfb\xa8\x1e\xfc\x6b\x31\x93\xf6\xc3\x4f\xce\xbd\x45\xe0\x37\x0d\xbe\xc5\xdf\x45\xf0\x78\x16\x9c\x9f\x7f\x5a\x43\x25\x3f\x43\x25\x35\xfc\x8f\xbf\x81\x77\x9e\xf8\x5a\x02\x6f\xcd\xd5\xd3\x87\xbe\xff\xc1\x7a\x5a\x2f\xfc\x00\x46\xb6\x58\xd4\xde\xf0\x91\x19\xc6\xa7\xe2\xbf\x60\x64\xc1\xe3\xa0\x1e\x3d\x86\x8f\xb0\x49\xf1\x5e\xf2\x66\xf7\xbd\xb7\xd4\xfe\x90\x6a\x7a\x6b\xaa\xd7\xd5\xc2\x57\xfc\xfe\x11\x4c\xc5\x25\xcc\xc4\x2f\xad\x0f\x1f\x0b\xfe\x81\x57\x3f\xb5\x5f\xf9\xf3\xb3\xe1\xbf\xb0\x2f\xaf\xcc\x7c\x41\xb1\x7f\xe8\x62\x78\x3f\x87\x02\xf0\xec\x57\xf3\xa9\xd4\x9f\x42\x47\x16\x38\xf6\xc7\xf6\x04\x51\x17\xfe\xa6\x0b\x7f\x1d\x88\xbf\xda\x6d\xc2\x8c\x3e\x82\xf7\x3f\xc8\xfb\xaf\x9f\x87\xe6\xf9\x9f\xf4\x82\x05\xe2\xd9\x37\x4f\x5f\xbf\x6e\xde\xc0\xf8\x9a\x77\x6f\x9e\xfe\xb5\x79\x83\x8f\x5b\x60\x00\x5d\xe7\x82\x4f\xdf\xbc\xf9\x31\xb4\x5a\x7d\x14\x88\x57\xaf\x5f\xfc\xf4\xfc\x7b\xfb\x21\x74\xed\xd9\x57\x5f\x7f\x63\x75\x23\xf4\x09\x5a\xe9\x28\xaa\xc6\xc3\xa6\x3a\x03\x41\x1f\xfe\x9d\xe0\x4d\x70\xe2\x93\x22\xa8\xce\xd7\x27\xb8\xd5\xd5\xfa\xab\xc9\x88\x81\x4e\xd5\xf9\x6a\x05\x8b\x84\xd6\x0f\x75\xe0\x9f\x9f\xaf\x1e\x07\x59\x6d\x03\x1c\xbd\x50\xf7\xf0\x7a\x08\xeb\x6c\xa6\x8e\xd6\xdc\x4b\xa0\xf7\xa8\x08\xb3\xc6\x39\x0b\xbd\xe1\x97\x30\xae\x47\xea\x75\x16\xc7\xab\xf2\x19\x9f\xef\x85\xad\xe5\xe4\xd5\x0c\x9b\xde\xc4\x7f\xd4\x97\x30\x16\x1e\x49\x33\x30\xb7\xef\x70\x03\xdb\x6b\x15\xcc\xa8\xcb\x56\x87\xfc\x99\x9c\xbf\x85\x3e\x3f\x52\x5d\xdb\x8b\xbf\xa3\x89\xc9\xdb\xfb\xc5\xf0\xfc\x9e\x8c\x49\xb2\x08\xb5\x33\x47\xe7\x37\xa7\xe2\x9f\x6c\xc4\xa2\x0c\x56\x60\x6c\x64\xa8\x52\xc3\x02\xaa\x07\x68\xa2\x12\x57\x5c\x2a\xc9\xb6\xbb\x4a\xa1\x9e\x1a\x47\x12\x01\xb2\xa8\x2f\x76\x55\x95\x67\x50\x2e\x11\x15\x16\xbc\x3a\x5f\xe1\x75\x06\xd7\x9f\xd4\xe7\xe7\xa7\x97\xa2\xa8\x0c\x34\xd1\x5e\x82\xad\x84\x26\x2b\x8b\xfb\x89\xf8\xf3\x9e\x7a\x3e\xab\x79\x58\xb0\x95\xa8\xd7\x08\x8e\x49\xd5\xe1\x3e\x99\x8b\xf0\xc6\xb7\x40\x18\x4f\xfe\xfc\xf9\xe7\x9f\xfe\xd9\x68\x10\x51\x5c\xaa\xeb\x0c\xcf\x07\xcf\x8a\x19\x13\x63\x60\x2f\xf2\xcd\xb3\xab\xa8\x78\x06\x54\xce\x2f\x86\xf4\x45\x10\xf6\xbd\xfc\xfc\xf3\x27\x7f\xf9\x73\x5d\x9c\x9d\x4d\xc6\xe2\xf3\x3f\x7f\xfa\x64\x5c\x4f\xc6\x4f\x3e\x3d\x2e\x82\x3d\x71\x2c\xdf\x2a\x26\xf0\x2b\xf9\x3d\xf3\xa8\x37\xb6\x7e\x51\xb8\x77\x5f\xcd\xed\x7b\x2d\x11\x19\x52\xab\x95\x5b\x40\x97\xbe\x95\xf7\x54\x6f\xf8\x95\x2a\x35\x73\xe9\xd6\x6f\x86\xf7\x54\xcd\x56\x81\xa3\x43\x68\xb4\x00\x86\xf4\x17\x20\xf0\xb2\xf0\x0a\x62\x12\xca\xac\xd5\xbc\x80\x1f\x60\xe3\xb4\xb4\x8a\xa4\x64\xbf\x37\xfc\x43\x54\x29\x2e\x39\xe1\xba\x6c\xda\xbc\x22\x9a\x7c\x8b\x92\x89\x5f\xcd\xaa\xb6\x59\x45\x15\xde\x04\x30\xef\xeb\xe3\xe3\x2d\xf4\x8c\x95\xbd\x6b\x94\x20\x90\x51\x16\x1f\x50\x1f\x63\xa5\x13\xf8\xda\x4f\x81\xbb\xd1\x73\x13\x1c\x1f\xff\x05\x9e\xa5\xaa\x14\x0b\xad\x57\xc7\xc7\x83\x84\x0d\x24\xe4\x3f\xb5\x0e\x19\xc9\x65\x29\x73\x6d\x36\xf2\x17\x3c\x4b\x64\x65\x14\x54\xd7\xb2\xb8\x80\x35\x19\x44\x75\x3d\x88\x6c\x83\x0b\xbb\x1f\xd1\x08\x24\x3a\x29\xcb\xa0\x61\xf8\x50\xea\x8e\x50\x11\xa2\xb9\xec\xd6\xe8\x81\x1d\xc2\x96\x9c\x67\xdd\x76\x61\x3c\xd7\x7e\x25\xa2\x00\x99\xdb\x87\xdb\xa0\xf1\x59\x96\x1f\x1a\xe4\x32\x51\xf5\x6b\x38\x49\x4f\x43\x4b\x83\xf3\xf0\x29\x1a\xb4\xb4\x74\xa1\xcf\x00\x6b\x94\xac\x08\xac\x0e\xbc\xf9\x60\x6b\xa6\x24\x8e\x06\xba\x8a\x9a\xb3\xd1\x1f\x65\x04\xe3\x1f\x5c\xc2\x9c\x5e\xb2\x9e\x1b\x3a\xc3\xea\x20\xb9\x92\x17\xe2\x4e\x56\xe2\x56\xfe\x85\xcf\x77\x63\x31\xe1\x0b\xeb\x6c\xa7\x3a\xa0\x97\x04\xee\x57\x6e\xb0\x36\xe1\xaf\x78\x1d\x9f\x56\x00\x41\x80\x62\x80\x5c\x24\x2b\x2f\x08\x66\xd0\x82\xa1\x20\xc0\x0c\x02\x46\x79\x74\xec\x81\xec\x3d\x2a\xdb\x85\xc5\x26\x10\x1b\xe0\x59\x60\xde\x3f\xf1\x86\x9b\xa1\xf7\xc9\xe2\xc8\x03\xd1\x7b\xa9\xd9\x2f\xde\x27\xbb\x93\x93\x60\x39\xdf\x2d\xe4\x66\x78\x57\xf9\x78\x15\x4c\xef\xe4\x3f\xf4\xb8\x70\xee\x1a\xb0\x01\xa0\x87\x91\x2d\x47\xbf\xe7\x49\xe6\x03\xa6\x0a\xe8\xf0\x27\x20\x91\xa3\x3d\x93\x77\x23\xb2\x84\x7a\xad\x6c\x58\x9e\xa2\xc0\x4c\x73\xc8\x08\xe0\x0d\x48\x35\xeb\x24\x83\x6d\x7d\x77\xbf\x82\x7a\xd5\x39\x46\x6b\xc0\xb0\x55\x55\xc5\xef\xd0\x48\x4b\x8f\xfc\xbd\xf0\x1e\x4d\x00\x49\xf2\xc6\x6d\x76\x33\xf2\xc0\x7c\xf2\x8f\x1a\x1f\xf3\xb8\xf2\x49\x0a\x36\x7a\x0f\x02\xbd\x6c\x28\x51\xfc\x38\xcb\x01\xb7\x00\x5f\xf9\x0d\x4d\xca\xf1\xf1\x2a\x46\x09\xf4\xa8\x9a\x83\x74\x7b\x95\xac\xa1\xc2\x85\x20\x85\x5c\x61\x6c\x8d\x9a\xf6\xd2\xca\x56\x5c\xcf\x2f\x16\x74\x44\xdb\xbc\xdf\x55\x0d\xf7\xbb\x6e\x1d\xf1\x78\xab\xe4\xda\x0b\xa6\xcd\xdc\x0d\x06\x24\x61\xf1\xf4\x64\xd6\x01\x9b\x9e\x26\x7b\x25\xdc\x75\x51\x93\xf7\x0c\xd1\x2e\xe3\x22\x14\x31\x2d\x34\xb7\xac\x5c\x74\xa9\xc4\xaf\x1a\x8f\x22\x1a\xad\x1c\x43\x44\x01\x10\x91\x93\x59\xd7\x57\x51\xb6\x02\xf9\x3e\x9b\x17\x0b\xc0\xa4\x4d\x6d\x5b\xa7\x36\x3c\x67\x87\x5a\x40\x44\x6a\x0b\x55\x13\x29\x2d\xec\x06\x7b\xe6\x5f\x95\x32\x37\xfd\x1a\xa5\x84\xba\x7e\x0e\x0c\xca\xbf\xe2\xf6\x33\xdc\xd5\x85\x31\x01\x63\x45\xbb\xd2\x48\xca\x6c\x94\x01\xe5\x7d\x9d\x5c\xa4\x80\x58\x59\x87\x80\x1a\x4a\x2d\x25\x18\xe5\xe4\x6c\x12\x02\xa2\x37\x3d\x5e\xdb\x0b\x65\xeb\x22\xd4\x10\x0e\x6c\x48\xad\x89\x23\xd2\x4f\x72\x21\xce\x3b\x19\xa1\xc0\x48\xad\xf9\x5d\xfd\xaf\xea\xf7\xad\x06\x80\x6a\x30\x4b\x41\x77\xc1\x81\xf6\xae\xec\xf6\x00\x0a\x7b\xec\x21\x2a\x39\xac\x84\xfd\xca\xd6\x04\x49\x3a\x26\x34\x2a\x63\x00\x99\x48\xe6\x2e\x18\x44\x00\x06\xd9\x3c\x01\xe4\x1a\x2d\x16\x78\xc2\x87\xf6\x1c\x03\xbf\xc0\x1f\x32\xf6\x03\x39\x1c\xfe\x57\xca\xa8\x02\xe1\xfa\x97\x6f\xbf\x91\x5d\x89\x2f\xa6\xd3\xa1\x16\xdd\x8c\x83\xb6\xa2\xc3\x58\x34\xcd\x3c\x3c\x8d\x75\x51\x64\x08\x3b\x00\xc0\x0b\x5a\x51\x67\xcc\x6c\x6c\x1d\x11\xca\xd3\xb5\x76\xda\xce\xf0\x0c\xbf\xd3\x72\x78\x23\x50\xa5\x05\x32\x61\x04\x52\xdf\x3f\x92\xf8\xc6\x1c\x1d\x30\x25\x47\xa4\x9d\x59\x10\x9b\xb5\xbb\x3a\xf3\xd7\x32\x13\x2b\xd9\x79\x21\xae\xe4\xa0\xc4\xd3\xcf\x04\xd5\xd6\x96\x22\x08\x6e\xd1\xaa\x11\x16\x7e\xdb\x7a\x83\x2a\xa2\x8b\x18\xa4\xe0\x78\xa7\x54\x45\x96\x96\x6f\x8b\x7a\x0e\x3c\x27\xd4\x08\xb1\x94\x3b\x6b\x31\xed\xf3\xb2\xa5\x26\x52\x12\x18\x5e\x60\x3c\x5a\x84\xc3\xbc\xf6\xb8\xc6\x3e\x72\x7a\xb0\x6e\xc0\xe6\x71\xb6\x62\xc4\x92\x29\x0c\xf6\x2c\xdf\x30\x06\x03\x82\xa4\x9a\xeb\x39\x81\x7c\x6c\xce\x1d\xbb\xad\x1a\xb2\x7a\xb0\xdd\x24\x83\x95\x43\x60\x90\xde\x17\x80\x28\x8f\x68\x10\xf2\x93\xe8\x93\xb3\x2f\x4e\xe1\xfe\xcc\x79\x78\x94\xe8\xc7\x9e\x88\x47\x24\x32\x50\x8f\x5b\x33\xf3\x84\xd0\xd3\x01\xfa\x8e\xb2\x42\xab\xbf\xc8\xc5\x1c\xe8\xe0\xca\x99\x18\x80\xe8\x04\x09\xff\x20\x73\x6b\xc7\x8a\x81\x49\xe8\x79\xea\x5f\xf4\x35\x36\xf3\x73\x32\x78\x1d\x7d\xfd\xbc\xa5\xc2\x41\x0e\x4c\xa9\x6a\x5a\x6c\x16\xc0\xd6\xef\xc7\xc7\x57\x0d\xa6\x69\x71\x61\x96\x85\x05\x82\x73\x43\x33\x66\x40\xd4\xc2\xf9\x62\xbf\x17\xd8\x68\x5a\xc5\x85\xdb\x6c\xa3\x56\xd3\x54\xb7\xa8\x40\x2a\x31\xd5\xf5\x2e\x5b\x97\x65\x41\xf4\xbc\xdf\x07\xa1\xaf\x08\xab\x19\xe1\xff\x85\x66\xd5\x90\x15\x6f\xed\x34\x8e\x23\xe4\xa9\xe9\x3e\xe7\x8e\x39\xd3\x72\x1d\xa5\xbb\x58\x75\x55\xa8\x2e\x82\xe8\x2e\xfb\x77\xcb\xcc\x3d\xb8\xd1\xd8\x4b\x9d\xd2\xf4\x7e\x82\x7d\x99\xf5\xbf\x22\xfb\xf0\x5e\xb9\x06\xd0\x1e\x60\x69\x3e\xd3\x3a\xc8\x06\xd3\xc1\xc9\x63\xb2\x66\x0f\xee\x35\x99\xcc\xe9\xc4\x2e\x98\xb4\xd0\x59\xa1\x58\x1f\x33\x78\xc3\xd4\xe4\x7b\x3d\x6c\xd2\x66\xb4\x07\x6e\xf1\xd2\xff\xc6\xd8\xcd\x57\x0a\x48\xdb\x13\xd0\xec\x3e\x9a\x02\x60\x57\x61\xb8\x97\xf8\x87\xb9\x6c\xf9\x77\x6d\x46\xd2\x66\x25\x51\xb4\xf0\x5b\x5b\xd3\x45\x1a\x2c\xa7\x9f\x7d\x91\x6f\x99\x33\x54\x1a\x43\xf9\x09\xa2\x0a\x7e\x08\x17\xaa\x14\xa2\x8d\x0e\xb7\xea\xcd\xf5\x47\x0b\xcb\x84\xe2\x92\xa7\xd0\x52\xdc\xcd\x42\x82\x9e\x9a\x55\x1e\x5e\xd0\x5b\x57\xa8\x54\x97\x3d\x35\x35\xaf\xd0\x2a\xd4\x1d\x13\xef\x85\xac\xcd\x3a\x32\xbb\x00\xcc\x63\x8b\xed\xc7\x65\x00\xb6\x9c\x95\x9c\xd4\x13\x1b\x4d\x55\x41\xbb\xb8\x47\x76\x95\xbd\x63\xaf\xde\xc2\x54\x35\x03\x3f\x3e\xd6\xdd\x45\xbd\xe4\x42\x9a\xb1\x7f\xf2\x49\x7d\xee\x9d\x1f\x1e\x77\x9c\x91\xe2\xb5\x6f\xdc\xfa\x95\xf0\x42\xad\x9f\x3d\x50\xcb\x63\x11\xde\xc2\x2b\xfd\xa5\x18\x3d\x0e\x3d\x3a\x77\x03\x38\xd9\x20\xbf\x1c\x97\xba\xbc\x86\x99\x3b\x10\x94\x6e\xe2\x8b\x77\x49\xf5\xad\x5b\xa0\xae\x57\xa3\x4d\xfe\xbe\xe7\x69\xde\x57\xb2\x6c\x3d\x44\xc8\x6b\xd3\x84\x11\x74\x7f\x99\x03\xf0\x21\xb0\x50\x79\x79\x67\x2c\xef\x88\xcd\x17\xcd\xfd\xbc\x1c\xe0\xcc\xd2\x80\x36\x6a\x40\x03\xe9\x89\xaf\x71\xf9\x2f\xe5\xa5\x99\x70\xa5\x34\xba\x54\xd2\x56\x8d\xd4\x76\x23\x37\xed\xf7\x1b\xfb\xfd\xb5\x1e\xfe\x8a\xcc\xe9\xa3\x24\x43\x8b\x63\xbc\xd9\x20\xe6\xd7\xac\xd0\xab\xbc\x4c\xb0\xf7\xb3\x3e\x65\xca\x5f\x1c\x2e\x7e\x16\xb7\x39\x9d\x10\xb9\xfd\xca\x15\x40\xa6\xd6\x19\x03\xcc\xdb\xc0\x1f\xc0\x5f\xd4\x6f\x14\x96\xed\xe2\x00\x39\x08\xd5\xab\x59\x73\x09\xbc\x7e\x18\x1f\xea\x21\x08\x11\x7f\x3e\x3e\xf8\x96\xac\x98\xdb\xa8\x93\x8c\x33\x18\x11\x56\xd2\xee\x24\x9d\x31\x58\xa7\x0b\x83\xf1\xd4\xc8\x58\xe2\xa9\xfc\xd8\x59\x52\xa6\xbd\x5a\xe8\x38\xe2\x03\x15\x3a\xe3\x4b\xd0\xaa\xe6\xd0\x40\x1e\x18\xe3\xe1\x01\x36\x84\x2f\x99\x4d\x8e\xd1\xe9\xa8\x20\x53\xf9\xe7\xe4\x60\x15\xaf\x70\x19\x0e\x7d\x1b\x23\xf1\x4d\x66\x31\x8b\x15\xd7\xfe\x8d\x88\x83\xd9\xc9\x24\xac\x9a\x07\x55\x00\x82\xd2\x72\xf6\x92\xa1\x73\x09\x05\x4e\xcc\x75\x15\x84\xe3\xf0\xb3\xe3\x04\x3f\x99\x1c\x5e\x21\x7a\xdd\x47\xbe\x1a\x6b\x8c\x66\x09\x44\xe4\xac\x08\x5a\x66\xc4\x0b\x91\xca\x79\x45\xba\xae\xbe\x79\xc5\xe3\xcd\x1c\xd5\x57\x81\x05\x63\x99\x19\x07\xf4\x3f\xc7\x9b\xe8\xe1\x81\x4c\x49\x7f\x26\xa5\xa9\x45\xc9\xb0\x53\x10\x7f\xb5\xdc\x0b\xc0\x6a\x01\x4b\x39\xda\x65\xac\x01\x40\x63\x0e\x59\xf5\x97\x4a\xed\x52\x5c\x82\x0c\xdf\xa5\x4c\x51\x46\x02\x2a\xdc\xac\x1f\x34\x49\x16\xfb\xf4\x26\x54\xc5\x6e\xb0\xf3\xa9\xbe\x9e\xe0\xb1\x5c\x16\x84\xeb\xbd\x00\x01\x47\xa1\xb6\xfe\xe3\x3c\xd2\x5c\x92\x77\x1a\xfd\xc1\xb3\xd9\xe6\x13\x83\x0d\x3b\xa0\xdb\x27\x8f\x69\x2d\x66\x4c\x5a\x4c\xc3\x78\xfd\x2a\x3c\xf9\xc9\xa3\x09\x52\x01\x81\x3b\xba\x5d\x39\x2c\x0a\xa0\xf3\xcd\xf1\xf1\x86\x71\x4e\x05\xa8\xe6\x12\x09\x85\xba\x0b\x48\x31\xc4\x48\xe5\xae\x31\x02\x24\x81\xbe\xae\x7b\xb0\x26\x9a\x3a\xaf\x8c\x86\x71\x82\xf8\xa3\x79\xd0\x68\x49\x8d\x59\x94\x75\x3e\x6e\xe6\xa4\x12\x6b\x9e\x10\x00\x2c\x4d\x73\xce\xc6\x34\x37\x1a\xe1\xf4\xce\xe7\x07\xe6\xe5\x9a\xed\x17\xb1\x1a\x94\xc8\xa4\xcb\x05\x3d\xfc\xb1\x42\x0d\xae\x4e\xc5\x55\x04\x2c\x60\x63\x80\xe0\xf8\x0d\xcf\x92\x5d\x52\xb4\x4a\x06\xb3\x84\x0c\x5f\x06\x57\xc0\x32\x69\xd8\x8a\xe8\x68\xd7\x16\x16\x71\x6d\x66\x2d\x7e\x3c\x43\x07\x4e\xd9\xc3\x0f\x67\x01\x69\x68\xcb\x6d\xbc\x4c\xd6\x49\xbc\x9a\x45\xcc\x10\x93\xd5\x2f\x5a\xa0\xc0\xa8\xc9\x70\x54\x1e\xb2\xa6\xf6\x5e\xdf\xc1\xdc\xde\x1e\x51\x29\x71\xb4\xcb\x8a\x78\x99\x5f\x66\xc9\xfb\x78\x75\x14\xdf\x6e\x8b\xb8\x2c\xd1\x9f\xe0\xc8\x1b\xc6\x3c\x89\xbb\x2c\x01\x32\xff\x1a\xc5\xf9\x0e\xbf\x23\xb2\x86\xed\xa5\x8d\x0b\x98\xa0\x40\x97\x52\x80\x94\xe7\x3b\x74\x0c\x02\x5e\xa8\x44\x3f\x1d\xc6\x85\xaf\x2b\xe4\x1d\x10\x8b\xd2\x31\xb4\x3f\x46\x26\x02\x5f\xf8\x4f\x03\xf1\x5a\x33\xc5\x20\x52\x90\xfd\x5a\x40\x24\x60\x9e\xa3\x4e\x03\x95\x01\x44\x81\xf3\x40\xef\xde\xe4\xe4\x24\x88\x95\xfb\x11\xe9\x3c\xc4\xc4\x58\x42\xc4\xd0\x75\x54\x3c\xa0\xc1\x0d\xba\xad\xf5\xf5\xdc\xf3\xf0\x10\x82\x8c\xf0\x34\xc0\x92\x87\x27\x6d\x3e\xe4\xc7\x01\x87\xff\x85\x7f\x26\x74\x4b\x2f\xba\x86\x89\x23\x3c\x61\x52\x16\x2b\x06\xf3\xd9\x0f\xe9\xf8\x3c\x96\xb6\xbc\x3b\x8d\xa7\xf8\xc0\xd6\x90\x65\x43\x19\xa1\xe9\xa5\xd6\xe3\x7f\xca\x4d\x7f\x46\x2d\x3b\x26\xb3\xff\xc0\x15\x6f\x4c\x45\xa7\x38\x5f\xc5\x62\x5a\xa0\x35\x13\x56\xd2\x50\xa2\x0c\x64\x05\xd6\xbf\x30\x1e\x28\xe5\xbd\xa5\x42\x0d\x3f\x1f\x0b\x66\x57\x5f\x95\xf1\x6e\x95\x87\x69\x25\x08\x71\x84\x3f\x88\x06\xac\xd1\x7f\x08\xc5\x0d\xfc\x2d\xe2\x94\x8e\xe4\xc2\x7b\xef\xcc\x0b\xef\x57\x49\x11\x7a\x0d\x8a\xf5\x94\x9f\x1d\x9a\xf4\x7b\x47\x3d\xef\xe1\xf1\xd0\x3c\x2e\xe2\xeb\x24\xdf\x95\x6a\xf8\xce\xb7\xff\x3a\x54\x08\x44\x60\x78\xf4\x92\x84\xd1\xf0\x9e\x0e\x62\xfb\x84\xdb\xf9\x64\x21\xf1\x4f\x4b\x30\x15\xf1\xfc\xd3\x85\xf4\xe3\xf9\x67\x0b\xd8\xf6\xf3\xcf\xd1\x01\xc4\xb2\x62\x55\x85\xbc\x7f\x49\x12\xd1\xe6\x4f\x10\xee\xe8\x13\x0f\x77\x03\x5c\x0c\xc9\x0a\xc6\x00\xaf\xf8\x0c\x76\x08\x9f\xf2\x3e\xd8\x0b\x07\x2b\x08\x2f\xab\xae\xb8\x01\x78\xa5\x6b\xfa\x34\x98\x51\x53\x75\xad\x37\x30\x99\x95\x61\x97\x3f\x5b\xc8\x21\xf5\x79\x86\x5d\xc6\xcb\x3f\x43\xb1\x49\x10\x3e\x79\xec\x7b\x78\x14\xcb\x95\x7d\x4a\xee\x2c\xab\x95\xbe\x0b\xf0\xdb\xcf\xf9\xdb\xff\xb3\x80\xee\xff\x57\xa7\x40\x88\x3f\x80\x4e\x5a\x2d\xee\xf5\x71\x76\x47\x80\x87\xfd\x32\xc0\x4a\x61\x03\xc3\xec\x68\x20\xfb\x61\x44\x73\xa0\xce\x21\xb0\x8e\x19\x61\x23\x9f\xab\xc7\xae\xa3\x9a\x70\x86\xdf\x48\xbc\x0b\x8b\xe3\xe3\xbf\x71\xf1\x22\x20\x8f\x84\x0d\x5c\x91\xe3\x33\xdd\x15\xda\x34\xc5\x07\x61\x05\x0d\xee\xd9\xe1\x3b\x0b\x4e\xf4\x35\xd9\xb2\x93\x07\x30\xfc\x31\x93\x98\xe1\x90\xa1\x8d\xc2\x7a\x62\x2f\xd7\xa7\xe4\x34\xb5\x56\xd0\x83\xe7\xfd\x1f\x56\x66\xf4\x6b\x99\x59\x88\x9f\x75\x4c\xfd\x00\x7a\xfb\x0d\xe5\x3f\xce\xd2\x1d\x7a\xc7\x16\x0a\xdd\x7e\x7d\x37\x8f\x11\xfa\xcc\xa4\x03\xe1\xf2\x9b\xd3\x6a\xff\xad\x31\xb2\x80\x62\x7c\x44\x8d\xe7\xea\x38\xa1\xdf\x01\x11\xea\x73\x2a\xe5\x05\xe8\x41\x67\xcb\x46\x83\x60\xdd\xd4\x75\xaf\xf6\xa6\x4f\x73\xa3\x14\x99\x5e\x40\xfb\x6b\x0f\x9b\xa4\xb5\x53\x1d\x13\x4d\xf3\x58\xeb\xbc\xa5\xa2\xdc\x00\x12\x96\x4a\x8c\x0c\xf1\x92\x19\x0a\x60\x38\x55\x61\x35\xf3\x93\x21\xe2\x70\x8f\x1f\xcc\x12\xe4\x31\x43\xfd\x7e\x86\xaa\x5c\xb8\x7d\xab\x6e\x81\x75\x47\xab\xb0\xc4\x80\x16\x90\x58\xef\x71\xf3\xd2\x7e\x71\x06\x7c\x9e\xf7\xc8\x7e\xc7\x10\x74\xa2\xb5\xf0\x01\x37\xf5\x2f\x55\x04\x8d\xe3\x86\x09\x21\x87\x76\x2d\xb5\xdd\xb9\xba\x4e\x1a\xc8\xd4\x9e\xdb\x13\xaa\x6c\xe8\x9d\x78\xe1\x00\x36\x35\x40\x50\x17\xa7\xb0\x71\xa8\x39\xf8\x96\x84\x42\x88\xe5\x6a\x40\x1b\xe8\x9d\x87\xc6\x17\xf6\xf3\x93\xcf\xd0\xa2\xda\x53\x26\x25\xd4\x13\x3d\x9f\x48\xd0\x0a\x35\x27\x3d\x5e\x01\x83\x81\x2d\x0b\x58\x40\x8d\x3d\x49\xb9\x1f\x8e\x51\x9c\xcc\xa1\xdd\x68\xe6\x59\x14\xcd\xeb\x41\xf2\x1b\x57\xa8\xb8\x93\x25\x8a\x45\xfd\x3b\x02\x44\xe4\x41\x7a\x7c\x3c\xa0\x88\x11\x1b\x3e\x57\xd7\x2c\xc2\x65\x70\xbf\x35\x8c\xfe\x56\x6e\xe7\x97\x0b\x3a\x68\x9f\x6d\x0f\x6f\xaf\x3b\x32\x25\xdc\xb6\xb9\xd3\xc1\x64\x7a\x25\x2f\x25\x1a\x81\x92\x41\x21\x80\xfd\x00\x64\x76\x67\x24\x7b\xb3\xbd\xf1\x98\x5f\xce\xa3\xd9\xc6\x22\xe6\x21\x48\xfa\x91\xba\x06\xf6\xf0\xf8\xf8\x9a\x8e\x87\xe7\x17\x80\x71\x7d\xfc\x51\x5e\xc4\x4b\x60\x74\xc9\xe2\x60\x25\x77\x88\xbc\xa4\x7c\x73\x7c\xbc\xc3\xb0\x10\x6b\xe7\xc1\x93\x85\xd8\xca\x15\x32\xeb\x8d\x75\xc6\x7c\xb5\x30\xa3\x1d\x0e\xe1\xe5\x16\xfe\x0f\xa3\x86\x16\xd6\x72\x25\xc7\xb0\xd7\xae\xd0\xea\xcf\x27\x83\x03\x77\xa0\xc7\xc7\xc3\x21\x32\xb8\x24\xb2\xdd\x63\x2f\xe4\xfc\x0d\x2c\xdb\x7a\x31\x65\xaf\x13\xc3\x73\x5c\xa3\xae\x4e\xfa\x15\x77\xbd\x52\x5d\x0f\x90\x41\xc7\x8e\x71\x17\x03\xec\xed\xc4\xf1\x3f\xf8\x98\x3e\xfd\x9b\x8b\xa3\x3a\x4d\x5d\xf2\xb7\xdc\xa1\xad\xd5\x21\x1c\xc2\x1a\xc8\x15\x8f\xca\x75\x84\x59\x9f\xc8\x04\xe6\x94\x14\x1c\x08\xe1\xeb\xff\x04\x50\x5f\x9f\x16\x67\x12\x76\x57\x0f\x79\xb3\xd5\xb8\xf9\x68\x4b\xcc\x50\x49\x8b\x95\xa3\x1e\x8e\xf9\x0d\x78\xd0\x92\x04\x2c\x62\xed\x81\x6c\xc9\x67\x5e\xc0\x46\x73\x05\xcc\x42\x1b\xf5\x2d\x74\x7d\x56\x00\x6b\x16\x6a\x1a\x76\x36\x41\x8f\xee\x79\x2c\x62\x01\x58\xac\x5a\x08\xbb\xad\x96\x61\xa7\xdf\x36\x3f\x98\xd9\xc7\x85\xc6\x27\x01\x8f\x0b\x0b\x1a\x4e\xff\x21\x61\x22\x5f\x6a\xe1\x0e\xcf\x0a\x03\xf2\x25\x92\x03\x3e\x30\xa4\x27\xfb\xa0\x8f\x7e\x61\x9d\x63\xb2\x9f\x0f\x0b\x64\xc1\x78\x82\xc2\xfb\x2c\xaf\xc2\xb4\x4f\x0d\x8a\x27\x96\xf8\xa7\x90\x69\xd7\x16\xc0\x9d\x13\x77\x20\xae\x7d\x0f\x0d\x86\x44\xc4\x44\xcc\x17\x88\xcb\x5a\x07\xe0\x25\x0c\x0a\x1d\xef\xe7\xe5\x82\x59\x82\x12\x87\x53\xe1\x4f\x1e\xb8\x83\x41\x6b\xde\x86\xf8\x71\xf4\x90\x02\xd1\x19\x56\x9f\x23\xef\x30\xc8\x18\x58\xf1\x60\x01\xa6\xbf\x3d\xb2\x9e\x23\x63\x5b\xbe\xaf\x2c\x11\x16\x2a\xd0\x12\xec\x47\xd7\xe2\x57\xb6\xc8\x80\x66\x16\xa4\x23\x47\xe9\x05\xe0\x0c\x65\x74\x43\x5b\x62\xa4\x2d\xd8\x48\x1a\x65\x97\x07\x1a\xf8\xab\x62\xc7\x88\x04\x1f\x02\x54\xfa\x9e\xc0\x54\xc4\x1f\xe0\x7c\x44\xe7\xa8\x7c\xba\xca\x8f\xe8\x54\xff\x6a\x56\x8d\xa8\xa6\xb6\x1d\xcc\xed\x26\x0d\xf1\x05\x76\xa0\xfd\x8e\x9f\x1b\x05\x81\x6c\xc9\xce\x02\x8d\x05\x62\xde\xbd\x59\x33\x70\x24\x93\x5a\xfc\x6b\xab\x0c\xdb\x46\x0c\x41\xa3\x32\x84\xa9\xaa\xa2\xc2\x09\xb3\x62\x1b\xa4\xa9\x70\x62\x14\x4e\x48\x5d\xe3\xfe\xbb\x72\xce\x9d\x98\xa2\x4e\xd8\x23\x31\x59\x81\x2c\x94\xe7\xbd\x61\x5b\x50\xe9\x05\xaf\xc9\xca\xf9\xd0\xfb\xf5\x28\x22\xc7\x53\xe3\x51\xe0\x0f\xd6\xd8\xe4\x4b\x32\x8d\xae\x9b\x6b\x1f\x39\xb8\xc1\xc0\xd7\x71\xa7\xe2\xd1\x55\x11\xaf\xeb\xfa\x5f\xf0\x20\xba\x20\x3b\x0c\x8a\xef\x41\x2a\xf9\x7e\xd6\x53\x2b\xec\xc9\x61\x70\x2f\xf4\xed\x87\x0b\x83\x24\xa6\xce\x3b\x7a\xf9\xe4\x8f\xb4\xc3\x40\xd7\xd7\x01\x46\x6f\x62\x7b\x70\x10\x41\xb6\xca\x27\x5f\xbf\xd2\x67\x37\x3a\x8a\xce\xa1\xbe\xd9\x26\x35\xf6\x9d\xa9\x80\xa6\x43\x34\xf7\x6a\x10\x31\x7a\xa6\x3b\x55\x7e\x94\x3c\x4e\x4e\xfa\x7a\x90\x67\xde\x7f\x7b\x75\xfd\xa9\xa3\x6f\x67\xd9\x3c\xee\xe1\x27\x1a\xcf\x76\xee\x65\x5f\xe4\x03\x43\x67\x46\xd4\x3f\xf2\x72\xbf\x8a\xa3\x55\x5c\xf4\x86\x80\x51\xec\x7a\xd3\x23\x74\xf4\xc2\x39\xee\x9d\xab\xbe\xd2\x6c\xab\xf2\xbf\x5c\x4a\xcb\xe2\xc5\x84\x42\x6b\x1e\x55\x7b\x41\x76\xc3\x5d\xff\xff\x76\x55\x87\xda\x84\x16\xb0\x86\xa6\x7e\x14\x08\x89\xf5\x47\xad\x50\x0b\x87\x10\x53\x1b\x10\x72\x69\xb3\x13\xfc\xb1\x89\xfc\x73\x65\xe1\x48\x3d\x4b\x40\x02\x08\x85\xb6\x5e\x5b\x8a\xc6\x79\x75\x32\xc1\x32\xf1\x1f\xed\x12\x8d\xf8\x32\x47\x6f\xd1\x6c\x58\x85\x19\x95\x04\x71\xbc\x5b\x1b\x23\x1a\xf6\x8c\x9b\x56\xe4\x45\x2a\x9f\x04\x71\xfb\x84\x37\xc6\x03\xed\xd5\xea\xd0\xf7\x93\x8f\xf9\x3e\xed\x0c\xa6\x31\x47\x36\x3d\xe5\x8a\x4e\x4e\x90\x1f\x9a\xea\x7a\x0a\xa7\x9e\xcb\x8f\xaf\xa7\x3a\x1b\x0e\x8b\xfe\x6a\xc8\x62\x41\x83\x39\xc8\x2c\xd2\x02\xfa\x3f\x4c\x68\x89\xfb\x22\x5a\x25\x39\x48\x3e\x8c\x6e\x2e\xf2\x5b\xbc\x06\x31\x3d\xc6\xdf\x2d\x48\x92\x37\x79\xb1\xc2\xeb\x64\x13\x5d\xe2\xc3\x7d\xd0\x70\x69\xd9\x42\xae\x31\x22\x5a\x53\x5d\xb9\xbb\xd8\x60\xf8\x96\xb1\x28\x62\xe0\xa8\xba\xe5\x57\x5c\x5e\x5b\x68\x5d\xa2\x29\xe2\xfe\xd2\x8e\x5b\xa4\x0d\x1e\xca\xa6\xc7\x0e\x7b\x46\xb1\x03\x2e\xab\xa6\x8e\x4d\xd5\x76\x1d\x32\xc6\xc9\xf2\x9d\x16\xdd\x01\xa3\x2c\x8d\xbb\xcc\x6c\x1c\x2e\x8d\x16\x74\x0a\x9c\x0d\x9e\xad\x2c\x40\x4a\xc8\x47\x46\xc5\xa5\xb9\x9c\xe0\x9e\xc2\x22\xf8\x85\xfc\x85\xcd\x8a\xd1\xd1\x13\x76\x06\xf9\xb2\xca\x52\x55\x53\xa0\x2e\x44\x09\xa8\x75\x5d\x02\x30\xf0\x92\xa0\x57\x2f\x9a\x73\xa2\xc3\x11\x54\xf1\x93\xa9\x42\x29\x5b\x94\xf1\xa4\x50\x2e\xbc\xf7\x4a\xa1\xcc\x81\x57\xa8\x52\x8b\x81\x3b\xa2\xb3\xef\xa6\x51\x23\x12\xf3\x02\x44\x14\xf0\x48\xcd\x5e\x30\x80\xe6\x7e\x00\xb6\xd2\xb4\x58\xd7\x3b\xb8\x05\xb4\x0f\x2f\xf0\x0a\x4f\x05\x29\xda\xd1\x07\x7a\x11\x09\x75\xa0\x01\xfc\xe7\x81\xd6\xd9\x55\x91\xe5\x19\x33\xc7\xda\xa8\x3d\x2c\x67\x8d\x96\x2b\x08\xdf\xc1\x62\xa5\x81\x99\xfd\xc6\x58\xef\xae\x72\x7d\xa0\x2c\x6b\x75\xcf\x73\xbd\xa0\x8a\xa1\x8c\xe7\xd5\x82\xd5\xef\x8d\x91\x86\xa9\xea\xba\x72\x77\x4d\x05\xb4\xb5\x00\xfe\x1c\x98\x09\x5b\x25\x8a\x42\x0a\x30\xba\xcf\x9a\xd3\xa7\x8a\xc9\xd2\xcc\x11\xb9\x93\x46\x37\x5e\xcd\x8b\x85\x96\xf1\x2a\x8b\x18\xe5\x46\x49\xac\xbe\x68\x49\xed\xda\xab\x97\x9d\xd9\xe4\x1b\x84\xc9\x61\x84\xf3\x56\x76\x2b\xef\xa9\x1d\x88\xae\xaa\xc7\x1c\xca\xee\x2d\x11\xf0\xa1\x8e\x21\xe0\xcb\x96\x50\x29\x7c\x14\x88\x0b\x4b\xb0\xdc\xf2\xa9\x57\x4a\xd2\x65\x40\xc4\xbb\xae\x53\x5b\xfd\x9d\x32\x45\xd7\xd2\x2a\x57\x20\xe7\x5b\xd8\x36\xa4\x6c\x55\xfd\xab\xeb\x84\x1f\x60\xe9\xa6\xb3\xcd\xda\x5c\x38\xc6\xc0\x8d\x3c\xe6\xcc\x97\x51\x47\xb5\x64\x0e\x3c\x76\xa0\xa0\x33\x18\x5d\x91\x0b\xf6\x50\xfe\x10\x35\x93\x4d\x8b\xb7\x55\x47\x8b\x03\xab\x8e\x9e\xe6\x00\x67\x69\x03\x67\x3b\xc9\x5e\xea\x7c\x66\x30\x4d\xcf\xca\x69\x09\xc0\x46\xce\xe4\x2c\xe3\x50\xec\x4a\x3f\xa7\x8a\xf0\x3e\xd2\xc7\x22\x62\x47\x07\xfd\x78\x53\x36\x32\x56\xd4\xf4\xe1\xc6\xea\x83\x25\x0b\x61\xf4\x21\x94\xc4\x10\x9f\xc8\x1b\x54\xc9\x92\x65\xe4\x20\xe1\x67\x09\x3e\xc3\xf2\x81\x63\xa2\xaa\xbc\x2f\x1c\x4d\x90\x24\xd5\x06\xfc\xb9\x92\x91\x1e\xd0\xa5\xcc\xeb\xfa\xbb\xca\x47\x77\xcc\xc7\x9e\x28\x1b\x6b\x05\x18\x4f\x58\x92\x58\xb7\x91\xe8\x82\x31\xc8\xd1\xb7\xf3\x32\x84\xa9\xba\x14\x6b\x90\x8a\xb1\x7a\x71\x27\xb3\x59\x02\x60\x83\x8e\xd7\x57\x18\xa8\x73\x36\x5f\x84\x51\xb8\xa1\xa3\x49\xe0\xcb\x7d\x74\xfc\xa0\x92\xb0\x5e\x3b\x09\x1f\xdf\x89\x15\xdc\xf8\x3b\x81\xb3\x8b\x2f\x96\x72\xe7\xae\xe0\x12\xa5\xc6\x2d\x80\xd9\x92\x66\xf4\x6e\xbe\x82\x2b\x14\x1c\x37\xea\x6a\x1b\x90\xb9\x7c\xce\x41\x49\xf1\x88\xf0\x9e\x0f\x86\x76\x38\xba\xa5\xbc\xeb\xad\xef\x8e\xeb\xdb\xf1\x1a\x6c\xe0\x0e\x2a\x9a\x26\xc4\xbf\xc0\x38\x10\xb9\x43\x77\xf6\x1f\xf8\x1c\xa0\x3a\xd1\x87\xe3\xb9\xd8\x82\x08\x8b\xcf\x41\xe0\x43\x1f\x79\xb4\xfe\x1f\xf8\x11\xfe\x60\x1f\x79\x27\xdc\xd1\xa8\xf1\xc4\x7c\x76\xa7\x8f\xc3\xae\x84\x6e\x24\x08\xef\x60\x3d\x67\xaa\x1b\x11\xcc\x56\x1a\x84\xda\xf6\x1f\x6e\x51\x3f\x6b\x40\xe4\x4d\x65\x1d\x90\x51\xe0\x65\x2b\x40\x43\x3e\xd2\xc7\x3f\x73\x52\xbb\x23\x66\x46\x00\x8e\x50\x4d\x62\x5e\x21\xa5\x03\x88\xc6\x43\x7e\x20\xe8\xf2\xba\xdf\x6a\x94\x99\xc5\x12\x75\xfe\x80\x8b\xfa\x0b\xbd\x34\x81\x3a\x48\xde\x55\xa5\x01\xca\xdc\xa0\x05\x86\xa3\x46\x57\x0f\x74\xad\x1a\x48\xb9\x43\xaa\x02\x28\x29\x0b\x1a\x78\x5b\xaa\xe2\xe1\x56\x5d\x04\xfb\x05\xef\xb2\xc4\x8a\xe5\xe7\x8e\x32\x55\xa3\x0c\xa0\x55\xe8\x24\xe0\x8d\x35\x46\x10\x60\xdd\xd7\xbd\x2a\xcf\xc4\xce\x2a\xad\x1d\x2b\x28\x1e\x2d\x3e\x55\xc4\x0b\x3e\x85\x3d\xc5\xe2\x47\x21\x87\xc3\x14\x5a\x2e\xe8\xd8\x8e\x62\xaa\x5a\xed\x16\xba\x5d\x47\xad\x05\x1b\x31\x3d\x03\x38\xe0\x6e\xd0\x25\x12\x2c\xa3\x04\x4e\x4f\x26\x81\x8e\x0c\xa1\xe8\x27\xac\x06\x1d\xf7\xa4\x27\x4f\xb8\xca\x19\xec\xc2\xd0\xf3\xf6\x56\xd8\x3e\xed\xa2\x01\x73\x72\x96\x1e\x1f\xbf\x69\xaa\x4c\x05\x21\x83\xb3\x82\x9f\x1a\xbd\xb2\x79\x4a\xf4\x12\xe0\x47\xb3\xa2\x9a\xf2\x52\x0f\x1b\xb0\x7a\xe6\x78\x21\x8c\x45\x13\x70\xe5\xcc\x8e\x35\x02\x37\xd6\x89\x3f\xb2\x4f\x88\x56\x56\xfc\x9d\x72\xbc\xc6\x6d\x74\x0d\x55\x5c\x48\x6f\xec\x89\x5b\xd4\x1f\xc3\x93\x1b\x85\x36\x57\xe2\x99\xdc\xa1\xbf\x75\x5d\x47\x18\xb7\x56\x5b\x87\xa2\xd9\xa5\x58\x1d\x1f\xa7\x8e\x87\x4c\x8a\x3e\xd9\x6f\x86\xca\xc9\xff\x19\x40\xac\x13\xd8\xb0\xae\x47\xcc\x73\xdf\xd0\xae\x4c\xd9\x4c\x20\x45\xbb\xf4\x60\xaa\x82\x3e\x5e\xc9\xef\x70\x49\xa7\x17\xb0\x88\xe4\xd4\x45\x06\xbe\x97\xc6\xb7\x6d\x03\x73\x7f\x89\x47\xd9\xa8\xc2\x86\x5d\x09\x43\x0a\x82\x7b\x8e\x31\xee\x5f\x05\x4a\xff\x8a\x0d\xbc\x91\xef\xa0\xe6\xe1\x10\x27\x11\x55\x9e\x57\x72\xb0\xc1\xca\x8e\x8f\xaf\x4f\x4e\x44\x89\x71\x9c\xd4\x47\x84\x9b\xae\x87\xf2\x42\x40\xc1\x0b\xe8\xd5\xb5\xdb\x62\xc5\x2d\x6e\xfc\x5b\xdc\xec\xd0\xa0\xa2\xf1\xf8\xd5\xd9\x58\xd9\x5b\x5d\x00\xd2\xb9\x25\x8a\x7c\xc7\x74\x19\x7f\xe4\x1f\xbc\xe5\x00\xb7\x4c\x19\xab\x04\x7b\x8d\x2a\xb6\x80\x2a\xc4\x0d\xaa\xe3\x61\xd9\xcd\x82\x41\xef\x86\x66\x2d\x27\x74\x96\xd8\xd8\x0b\x40\x3d\x1a\x20\xf4\x08\x77\xf2\x19\x06\x74\x6c\xe2\xa9\x01\x4d\x29\x83\xb0\xdc\xa7\x32\x62\xf3\x28\xe8\x9c\x7c\xc0\xc0\x96\x02\xd4\xbc\xb0\x38\xea\x01\x60\x69\x3e\x0c\x23\x7f\x2c\xe4\x73\x2b\x17\xbf\x66\xe8\x25\x23\x01\x80\xd1\x39\x08\x44\x2c\xd2\xc4\x6a\xaa\x19\x26\xfa\x6a\x0a\xf5\x42\x83\xcf\x90\xda\x21\x72\x30\xe6\xb6\x0d\x97\xff\x5d\x8b\xa7\x43\xe3\x81\xca\xf1\x91\xd7\x1b\x9a\x55\x82\xb0\x8f\x45\x66\x1d\xc6\x9b\x8a\xde\xb5\x7c\x19\x91\x96\x6a\x22\x4a\xc3\xa0\x91\x25\xac\xd2\x5a\x6b\x4c\x7e\x4f\xae\x84\x6b\xe4\x96\xd6\xd6\xb9\x27\x30\xc4\x7a\x05\x9e\x00\x73\xf9\xf5\x73\xdc\xf2\x00\xb0\x18\x3d\x35\x50\x42\xb4\x31\x5c\x67\xc7\x09\xdb\xd5\xe7\x0a\x37\x8a\xc1\x3d\x25\x1d\x58\x13\xee\x21\xf3\x3c\xd9\x18\xba\xfb\x3b\x8d\xc8\x6c\x99\x40\x9d\x9a\xa3\x45\x11\xd0\x72\x0c\x85\x32\xa8\x1a\x9f\xc5\x06\x67\x94\x9a\xc3\x67\x8e\x59\x8f\x69\x1f\xc9\x1f\x46\xb6\xd3\xb1\x76\x67\x03\xf9\xa8\xec\x6a\xb0\xef\x89\xed\x2b\x41\x74\x10\x56\xa7\x91\xc2\xdb\xf8\x12\xd9\xc8\xad\xe4\x8e\x2b\xaa\x9a\xc8\xed\x83\xfd\x57\x6e\x74\xa5\x26\x6c\x5d\x77\x3a\xe5\x38\x58\x6a\x12\x1b\x09\x8c\x49\x22\x13\x63\xe5\x79\x57\x91\x03\x67\x8f\xab\x22\x86\xab\xd1\x47\x2d\x1a\xae\x50\x09\xbf\x0e\x00\xd6\x2a\x31\xb8\x02\x48\x30\x7e\x7c\xe8\x78\x67\x5b\xcb\xc8\x0b\xed\x03\xe6\x05\xda\x56\x46\x19\x92\x92\xcd\x3e\xa0\x81\x8e\xc5\x8d\x7c\x2d\xb6\x3e\xba\x2b\xd8\x06\x88\x07\x1c\x24\x26\x0f\xd8\x34\xf6\x7b\xc2\xf5\x58\x3f\xf7\x7a\x83\x44\x47\xa8\xac\x94\x9f\xfc\x09\x0d\xb9\xa3\x33\x4f\x78\x7f\x62\xc5\x8e\xe5\xf7\xe1\x6a\x74\xb0\x3c\x0a\x98\x75\x8d\xd1\xf8\x48\xbf\x44\xfa\xce\xab\x38\xb9\xbc\xaa\xea\x9b\x64\x55\x5d\x79\xa2\x9f\xfe\x03\x32\xa9\xc2\xb6\x1d\x95\xf0\xf4\xc9\x67\x4b\xc1\x0c\xc8\xfe\x49\xdb\x6d\xa7\x6b\x2e\xdc\x37\x2a\xd2\x61\x9d\xb6\xfd\x57\x5c\x73\x6d\x02\x71\x36\xd9\xf6\x3e\x30\x64\x2e\x6a\xc6\xac\xbe\x3c\x34\x44\xe0\xa2\x59\x87\x36\x38\xac\x43\xa3\x69\xd0\x8e\x53\x64\x2a\x74\x68\xb9\x74\x74\x1b\xb7\x47\x8d\x85\xb7\xea\xd4\x97\x9d\xee\x90\x60\x34\xb5\xe6\xdd\x4f\x0e\x5a\xab\x25\x96\xb5\x5a\xa2\xac\xd5\x62\x8e\x9b\x36\x18\xcf\x5a\xcb\x42\x76\x6c\x14\x94\x08\xf7\x2e\xd0\x04\x8a\x44\xbc\x2d\x1c\x23\x26\xf5\x6c\x0e\x8c\x0c\x47\x35\xde\x16\x46\x4b\x73\xab\xe8\x8f\x74\x28\x11\x3c\xe6\x78\xf3\xc6\x22\x8c\x42\x4d\x61\x90\xc7\x7c\x69\xdc\xe2\xe0\x99\x31\x3c\xb4\x8c\x10\xf7\xda\x30\xf0\x7b\x8a\xc9\xa4\x71\xf8\xcb\x46\x55\xf0\x3d\x9e\x47\xde\xef\x9b\x10\x36\x14\x78\x27\x66\x74\xe3\xbf\x21\xd4\x28\xdc\xe3\x3a\x72\x54\x45\xcd\x94\xa8\xf6\xb7\xa3\x67\x40\x75\x2f\xa2\xe5\xbb\xd2\x31\x54\x8b\x65\x4f\x14\xbc\xef\xe9\x5c\x12\x1b\x0f\x9b\x20\xcd\x7b\xa1\xba\xe8\x84\xad\x61\x7d\xd2\x20\x1e\x01\x4b\x18\x13\x9f\xb4\x74\xa2\x3b\x31\x1f\x0a\xdd\x8c\x37\x79\x71\x07\x08\x0f\xe3\x9d\x22\x43\x06\xec\xd3\x98\x24\xd3\x5c\xa6\x4d\xa8\x9e\xc1\x78\x0a\xec\x61\x7e\x16\x4d\x23\x66\x59\x53\x54\xed\xa8\x90\xeb\x88\xf8\x2b\x2d\xb7\x4f\xc8\xc2\xaf\xca\xb7\xdf\x67\x2f\x31\x6a\x26\x86\xc7\x04\xe1\x98\x31\x20\xe9\xa1\x30\x9c\xf6\x6e\xb6\x33\xb8\x73\x09\xc8\x59\xd1\x87\x20\x04\xae\x00\xba\x1e\x6e\xf5\x69\x04\x25\xd1\xd8\xca\xfb\x68\xe5\x84\x31\xc7\x1e\xe8\x15\xd0\xdd\x9c\x1a\x30\x3f\x4a\x70\x88\x3a\x08\x7d\x2b\x52\x3a\x93\x6f\x15\x7b\x08\x28\xb4\x13\x2b\xb9\x98\xc5\x0a\x74\x8e\x8f\xb7\x78\x12\x03\x25\x80\x59\xd4\x3c\x6e\x48\xc7\x41\xba\xe3\x4d\xe0\x00\x8a\x82\x87\x3c\x30\xc6\xce\x6c\x22\xb2\x89\x6c\xd6\xcc\x62\xc8\x1a\xbb\x4a\x2c\x7d\x8b\xc5\xe0\x20\xf7\xec\x18\xdc\x13\xa7\x3d\x45\xde\x8f\x86\xd1\x04\x8a\xeb\xb1\xe1\xd6\xc7\x62\x38\x2e\x15\x13\x11\x06\x4b\x2c\x3c\x88\x4f\x41\xaa\xe9\x56\x81\x74\x8b\x02\xd4\x9d\x61\x97\x73\xe0\x2e\x23\xba\x42\xfa\xba\xd7\x21\xf7\xf1\x00\xb4\x0f\x15\xce\x9a\xca\x51\x87\x86\x46\x2e\x03\x7f\x90\x82\xf8\x9e\x1a\x92\xde\x3e\x71\x69\x46\xa2\xe3\x0b\x72\x1b\x6a\x79\x7b\x0b\xee\x64\x81\xc1\x79\xed\x72\x3d\x31\xec\x07\xe9\x5e\xa4\xb9\x9d\xe9\xc0\x54\xb1\x83\xcf\x01\x5d\x5a\x40\xa4\x6a\xc3\xf2\xbd\x75\xed\xe8\xb4\x80\x82\x72\xf7\x06\x2c\xc5\x51\xa2\x62\x64\x47\xdc\x26\x85\xb3\x14\x15\x1e\xe0\x57\xcc\xe2\xcc\xd4\x2f\x60\xb1\x0a\xf8\xbe\x99\x52\x04\x54\x41\xb8\xc4\xe3\x5b\xd5\x3c\x36\xd1\xd3\xdd\xed\x48\xb7\xdd\x4e\x5f\x60\x7d\xd7\xd7\xeb\x41\xb2\x37\x88\x67\x6b\x07\x6e\xd7\xe1\xda\x7a\x4e\x7c\xe6\x73\x4f\x45\x20\x07\x1a\x85\xa9\x16\x40\x92\x6a\x70\x10\x3a\xbb\x2e\xe3\x23\xc6\x0a\x48\xc1\x54\xd9\x15\x08\xf6\xf8\x21\xc5\x46\x10\xde\x3a\x4a\xd2\x0f\x7d\xf7\x3b\x9d\xc3\xd1\x77\x59\x5e\x25\xeb\x3b\xf8\x6e\x5b\xe4\x97\x68\x65\xdc\xfa\x56\x7f\xb6\x40\xd3\x01\x0f\x5d\xa1\xc8\x60\xa8\x90\xf7\x14\xbc\xad\x67\xca\xb2\xbd\x88\xd2\x9b\xe8\xae\xec\x79\x97\x70\x06\x89\x66\x16\x47\xd8\x5d\xbf\x33\xab\xd5\x55\x9c\xd9\x9f\x73\x44\x02\x53\xac\xc1\xe8\x26\xf8\x5d\xe3\xa4\xdd\x8f\x5d\x72\xc5\xd1\xcb\x1c\x51\x62\x29\xdd\xb0\x8f\xf3\x0a\xb9\xd1\x98\x9c\x28\xe6\x18\x14\x64\xe1\x77\x5a\x07\x3e\xa4\xec\xcf\x64\x31\x55\x21\xfe\x9b\xfa\x74\xc0\xb7\x60\x16\xb7\xb3\x67\x98\x28\xf3\x6a\xec\x78\x8f\xeb\x11\x8c\xf4\x0a\xf8\xe8\x70\x88\xab\x02\x38\x6d\x1e\x0d\x3d\x84\x3e\x6f\x41\x8d\x12\x1a\x6c\xc2\xc9\x71\x02\x19\x51\x52\x0c\xd6\xa6\x3f\x88\xea\x80\x05\x66\x9a\xdd\x14\x46\x23\x5d\xba\x7c\x20\x48\xfc\xcc\x00\x6a\x8c\x3a\x19\x34\x2b\x49\x2c\x12\x0a\x04\x3d\xd9\xc6\xb2\x18\xe1\x02\x89\xee\x3c\xc7\xf6\x3c\x3f\xc1\x79\xc6\xc8\x22\xd3\x82\xe7\x54\x52\x58\x41\x14\x9a\xe9\xc2\x9e\xe2\x4c\xe2\xaa\xcf\x27\x6f\xe3\x05\x7c\xa7\x91\x03\x3c\x79\x42\xf7\x88\x1c\x02\x81\x4b\x33\x86\x6a\x7a\xe0\x8a\xde\xb4\xa7\x2a\x99\x15\x61\xff\xae\x75\xcb\x43\xbf\xf4\x2e\x27\xd6\x53\xcf\x18\xc8\x07\x6c\x6c\x89\xc2\x77\x42\x21\xc3\xf7\xe2\xc6\x01\x4d\xe7\x58\xa2\x13\xf6\x53\x38\x41\x65\x27\x1c\x63\xe8\x01\x60\x29\x42\xa4\xed\x13\x76\x3a\x0a\x9d\xd0\x8e\xd1\xa1\x50\x9a\xb6\x9d\x66\x85\x0c\x0f\x8d\x38\xc3\xab\x76\x62\x8e\xb3\xc9\xac\xd3\xc5\xb0\x20\x9b\x8e\x72\x96\x2b\xa0\x63\x5c\x87\x2e\x34\x27\x27\x09\xab\x10\x9b\xa4\x08\xf8\x7c\xbf\xe7\x23\x34\x0a\x32\x71\x36\xa1\xb0\x9d\xa5\xd4\x39\x31\x80\xbd\x31\x97\x3b\x73\x39\x2d\xd4\xf1\x4c\x06\x5b\xac\x35\x7e\x7c\xd4\x4c\x81\x7d\xa7\xb7\x4c\x04\xed\xee\xd0\x68\x98\x77\x4c\xde\xdd\x31\x11\x91\xd4\x32\xa0\x4e\x1b\x7f\xa1\x76\xef\xb1\x0e\x3c\xf9\x34\x1b\x82\x38\x5a\x1d\x14\xa1\x63\x83\x02\x3c\x5b\xee\x86\x19\x04\x40\xe9\x0d\x41\x02\x33\xd1\x16\x35\x9a\x98\x01\x20\xeb\x00\xd6\x5d\xd9\xc2\xca\xd1\xd1\x17\x69\x92\xbd\x3b\x3d\xfb\x82\x44\x49\x10\xc3\xd4\xaf\x16\xcd\x4e\xa3\x4f\xce\x22\x14\xce\x58\xac\x21\xef\x60\xf9\x89\x3e\x87\xfd\x04\xc5\x9c\x4c\xae\x0e\xc7\x0d\x20\x22\x58\x1c\x2c\x11\x79\xac\x11\x28\xd8\x1b\x0e\x63\x90\x92\x97\xbd\xe2\x14\x34\xff\x33\x2d\xbb\x03\x66\x6e\xdf\xc3\xc5\x2d\x1d\xdf\xd8\x4e\x49\x65\x50\x02\x14\x36\x3f\xd8\x11\xe5\x86\x4b\x91\x5a\xb9\x1f\xa3\x65\x59\x92\x6b\x88\x07\x7c\x6a\x38\xd9\xde\x4e\xd7\x98\x80\x22\xc4\x20\x9c\xd3\x7c\x1b\x2d\x13\x60\x61\x46\x9f\x7b\x1c\x67\xe8\xb5\x35\xe7\xf0\x05\xb2\x7b\x56\xcc\x02\x81\x4a\xa0\x08\x09\xd6\xcf\x57\x09\x08\x92\xf0\x75\x2c\xd1\x58\x64\x65\xcb\x7d\x5a\xe5\x02\xa5\x2b\xcc\x24\x22\x07\x87\x7a\x4b\xaf\x8d\x1f\x2e\x94\xbf\xaa\x36\xe9\xeb\xb8\x48\xa2\x34\x79\x1f\xcb\xc1\xc1\x0f\x71\xb1\xed\xef\x68\xa4\xf2\x14\x46\x78\xaa\xec\xed\x5b\xb2\x1e\x15\xc0\xa9\xab\xc8\xb0\xe8\xbb\xbc\xd8\x50\x1b\x2b\xe9\x9d\x46\xc4\x0c\xf7\x4a\xe8\x50\x5c\x4d\x91\x3c\x7d\x3b\x1e\x7d\x6e\x6a\xe7\xa9\x55\xef\xb0\x18\xcc\x32\x25\xf6\x80\x4e\x5b\x13\x4f\x8f\xf0\x2d\x02\xda\xf7\x18\x5e\x3a\x67\xc9\x90\x2a\xae\x5e\x6b\x03\x9e\x9d\xb1\xe5\x81\x17\x31\x6c\x1b\x04\xcf\xc1\xa0\x03\x02\x80\x1a\x36\x30\x6e\x55\x42\x4d\xd8\xe7\xcf\x52\xd8\xd4\x20\xb1\x87\x59\x74\x0d\xa0\x4f\x3f\xb8\x72\x9d\xcf\xe1\x05\x7c\xbd\xc4\xe2\x24\xb7\x0e\xc6\xc1\x28\x87\xe1\xd2\x2e\x12\x68\x89\x07\x13\x1b\x7f\x89\xc4\xe1\x3b\x54\x55\x7d\x13\xdd\xc1\x6b\x94\x63\x60\x8a\xaf\x80\xff\x7f\xf7\x73\x11\x6d\xe9\x7d\xc9\x4f\xb7\xc9\x6d\x9c\x6a\x35\x0a\x3f\xe2\xa8\x0a\x2f\x38\x9d\x0e\xca\x59\xa8\x84\xa3\x2e\x52\x88\x11\x7e\x52\xc4\x69\x82\x3b\xf4\x5b\x40\x9c\x49\xf6\x23\x6a\x3d\xf8\x05\xec\xc6\xd7\xc9\x7b\x80\xb0\x1f\x55\x09\x7c\x9c\x6b\xb3\x2a\xa7\xba\x67\xea\x59\xde\x1a\x91\x2a\x2b\xca\xc6\xca\x8b\x3e\x83\x09\x7f\x6e\x1e\xec\xcc\x4b\x8a\x77\xa4\x42\x41\xac\x68\x7d\x95\x17\xdf\x15\xe0\xff\xf6\x68\x26\xfb\xbc\x3b\xad\x6a\xd3\xb1\xe5\x44\xbf\x76\x04\xe7\x16\x0a\x49\xd2\x92\xe4\xfd\xaa\x11\xa1\x60\x03\xf7\x5d\xa7\x2e\xe5\x47\x4f\x26\x24\x54\x1f\x5d\xfd\x43\x97\xa7\x5a\x19\xb2\xda\x5f\x6a\x5f\x7e\x46\x9b\xed\xb7\x59\x83\x51\x53\x33\x32\xad\x1f\x33\x29\x3e\xd0\xc6\xc2\xc6\x4d\x39\xf6\x40\x3f\x30\xab\xa0\xe6\x5d\x81\x3b\x43\x65\xda\x5e\x1c\xe7\xce\x98\x93\x9b\x8f\x57\x6e\xa0\x1a\x7f\xd5\x0e\x4f\xb3\x04\xd1\xe3\x9d\x13\x97\xa6\x0d\x5f\x93\x3d\x52\x87\x76\xb3\xf0\x95\xaf\x8c\x37\xd6\xae\xf5\x0c\xc7\x4b\x26\x5b\x1c\x34\x45\x4c\x32\xb2\xa4\x69\xd1\x9f\x25\x1a\xce\x7b\xc3\x35\x4f\x55\x35\x5f\x0f\xbd\x2f\x77\x17\x00\x3f\x25\xb0\x3b\x4b\x8a\xb2\x8b\x5e\xed\x8d\x92\x6d\xbe\x44\x73\x10\x06\x1b\x54\x15\x4c\x57\x0a\x2d\xa0\x1c\x70\x59\x60\x36\xd9\x67\x69\xb2\x95\xde\x92\x2d\x61\x4f\x00\xf2\xbd\x4e\xbf\xfb\x3f\x41\x64\xbd\x04\x4c\x5c\xd0\xb0\x5f\x13\xf2\x73\xea\x21\x94\xdc\xf7\xad\x19\xff\xd1\xad\xdf\xb6\x26\x37\xa9\x72\xf0\xc8\x09\x0f\x81\xc4\x6d\x9b\x69\x57\x24\x1c\xe4\x16\x60\x37\x61\x93\x86\xe3\xe9\x86\x76\x30\x5c\x5c\xe4\x05\x1a\xf5\x8d\xa7\xb0\xb1\x30\xe0\x6d\x78\x81\x78\x02\x1e\xdf\x9e\x94\xb4\xa3\x43\xab\x87\xd3\x93\x4d\xfe\xfe\xe4\xd0\x3b\x8e\x92\x70\xe8\xb5\x47\x90\xda\x4f\x18\x98\xa0\x00\xf9\x43\x15\x8e\x9f\x1d\xe0\x2f\x44\xd6\xa6\x8d\xa6\xf3\xa4\x7a\x85\x5f\xd6\xc4\xc2\xc5\x56\x21\xb7\x30\xba\x00\xc6\x07\x56\x76\x8a\x74\x74\x3c\x45\xfa\x19\x9e\xfc\x05\xfe\x03\x92\xca\x93\x70\xa2\x28\xac\xd7\xda\x2d\x59\xe0\xdc\xae\x5a\xcc\x8b\xe6\x59\xaa\x02\xfe\xad\x90\x77\x59\xd1\x45\xc5\x57\xa7\xf8\x5c\xf1\x33\xde\x03\xa4\xbf\xc2\x50\x15\x39\x9d\x97\xb8\x63\xfb\x98\xb5\xca\x48\x38\xde\x4a\xb4\x43\xa6\x3a\xf2\xf5\x1a\xe0\xff\x2b\x9a\x05\xbb\x56\xf5\x01\xc2\x60\x4e\x8e\x7d\xee\x53\xae\xa7\xc1\xef\x5f\x51\xdc\x8f\xef\xa9\xb2\x52\x6e\xd9\x11\xa7\xdb\x80\x33\x1f\xb8\x0b\x3a\xcb\x63\x20\x81\xbb\xde\x0b\x43\xf6\xab\x2e\x08\x59\x6f\xf5\x8c\x20\x37\xa4\xa6\x02\x2f\x5d\xc0\x65\x48\xf8\xac\xb5\xba\xff\x79\x00\x20\xe0\x05\x0a\xfa\x18\xed\xde\x4f\x55\x0a\x86\x54\x0d\xe3\x7d\x9e\x6f\x66\xf7\xf8\x17\xc3\x12\xa0\x9b\xa9\x8d\xbc\x0c\xc5\x93\x9f\xd1\xb6\xe5\x89\xf9\x19\x5b\x47\xa9\x13\x57\xfb\x59\xbe\x01\xe2\x11\xaf\x68\xa7\x63\x32\xcf\x16\xdd\xf5\x26\xff\x89\x1b\xd6\xef\x16\xf6\x57\xd4\x97\x00\x13\x02\xa2\xa5\xfb\xb6\x97\xc4\x7a\x30\x4a\x3a\x4c\x7b\xb0\x02\x9e\x10\x2a\x0b\x75\xd1\x1d\xb1\xc4\x0f\x32\xad\x7c\x90\xd2\x61\x46\xdb\x2b\x5c\x9a\x12\x1b\x8b\x23\xd0\xcf\xa8\x2d\x3a\x08\x5f\xb9\x4f\x68\xb3\x1d\xe0\x26\xac\x64\x6b\x7d\xe3\x2a\xec\x89\xb1\x1a\x45\x1e\x91\x75\xd0\x2b\x6b\xf9\x30\x5e\x1a\x51\xa3\x07\xe1\xb4\x1c\x7a\x3c\x49\x08\x4d\x36\x90\x69\xc8\x62\x06\x6b\xca\xa0\xe0\x1d\xe6\xb8\x3e\x6d\x43\x82\x69\xca\xec\x34\x02\x52\xaf\x85\x49\x28\x0e\x99\x0a\x3b\xe6\xf0\xe4\xce\xac\x7d\xce\xb3\xd6\xe1\xe8\x3e\x1d\xb4\x5b\x3d\xd4\x41\x98\x0a\x1b\xb8\xe5\x04\xad\xa6\x9c\x90\x8f\x98\x87\x44\x02\x57\x20\x39\xb7\x00\x2a\x50\x32\x59\x4a\x56\x78\xe6\x92\x03\x44\xfc\xc7\xde\x87\xd9\x27\x85\xfe\x97\x94\x63\xfb\xfc\x1e\xf3\x7a\xbf\x5e\x3c\x3e\xdf\xd7\xe7\x73\x7d\xbd\xc0\x98\xc7\xaf\xa0\xc0\xfc\xe9\xc9\x3f\x31\xe7\x75\x73\x38\xf1\xa3\x4e\xe8\x41\x6a\x72\xce\xc3\x01\x6c\x5e\x54\xa1\x8b\xb9\x15\x3f\x97\x8f\x4f\x90\x18\x93\x15\x9a\x11\x51\x76\x32\x9d\xdd\x72\xb8\xcd\x30\x16\x4b\xb8\x43\xfb\xb3\x10\xff\x1c\x1f\x93\x43\xde\x12\xed\xf6\x96\x64\x21\x86\x56\x9d\x40\xd5\x57\x50\x3b\xc0\x0d\x65\x95\x7c\x28\x87\xd7\xb2\xae\x7d\x5d\x23\xa6\x5b\x47\x9f\x9b\x26\x3f\x49\x58\x82\xc8\x07\xd5\x41\x21\xfc\x81\x72\xf7\x80\x1b\xaa\x9c\xd2\x88\xdd\x8e\x30\xf3\x15\x1a\x0f\x76\x12\xfe\x65\xbd\x09\xff\x32\x3a\xfb\x9d\x51\x4d\x46\xe3\x84\x77\xa8\x77\x30\xbd\x76\x5f\xd1\x23\x72\x1d\x8e\xc8\x46\x4c\xa0\xfd\x59\x44\x4f\xcd\x05\x59\x30\x46\x92\x6f\x60\x1b\xab\x24\x26\xd1\x1c\x27\x4d\xa5\xcc\x82\xb5\xc6\xf4\x32\xdd\x54\x46\xd9\x8c\x7c\x96\x30\x39\x0c\x1d\xc0\xe5\x94\xfe\xa4\xf3\x6d\x10\x84\xf0\x54\xe4\x96\xe1\xe2\xcf\x56\xd6\xbb\xde\x45\xa5\xd3\x1f\x7b\x21\x23\x99\x5b\x0b\x59\xc2\x5d\x3c\x37\x6b\xbe\x08\xcd\x25\x45\x17\x46\x13\x43\x3a\xf5\x27\x5b\xc0\x6c\x86\x0f\x42\xfc\xc3\xc3\x44\x85\xa7\xce\x3b\x5a\x05\xb3\x8a\x42\xe8\x90\xb5\x91\x4a\x49\x2b\xac\x11\x40\xef\x29\xe1\x5f\x01\xe5\xe6\xd5\x22\xf4\x31\xf9\x70\x33\x3e\x0e\xc3\xcc\x05\xf0\x75\x65\xe5\x99\x08\x6c\xb3\x8a\xc6\xe8\x52\xc9\x22\xc5\xbc\x9a\x27\x0b\xb2\xfd\xc8\x66\x83\xaf\x31\x26\x11\x25\xd5\xb0\x12\x10\xfa\xc6\x24\x73\x8f\xf1\x4b\x74\x40\x3b\x33\x12\xf1\x35\x8f\x95\x0c\x28\x69\x7e\x30\x41\x06\x4d\x24\x06\xb9\x01\x06\x33\x6c\xf2\x24\x3a\x92\x4e\x5d\x47\x03\x58\x75\xce\x6d\x39\xb3\xea\xa5\x69\x52\x5b\x7a\xbf\x6f\xb4\xf0\x3c\xf3\xf7\x98\x1a\x06\xeb\x0f\x29\x8e\x36\x19\xa5\x8b\x78\x73\x11\x93\x59\x3b\x83\x72\xe8\x2d\xd3\x32\x59\x85\xcf\x9f\xfc\x9f\x67\xcf\xbf\xfc\xf3\x8b\x93\xa7\x2f\xfe\xfc\xfc\x64\x32\x59\xae\x4f\xfe\xf2\xe7\x2f\xff\xeb\xe4\xb3\xcf\x3e\xfb\xfc\xf3\x4f\x3f\xff\x6c\x0c\xff\x79\x74\x40\x43\x15\xf6\x5a\xd7\x59\x41\xa1\xd4\xe2\xcf\xed\x65\xc7\x8d\xdc\xdc\x89\xc1\x00\x7d\x5e\xbf\x26\x17\x94\x95\x5b\xa7\xa3\x01\xfc\x51\xdd\xeb\xb3\xaa\xe7\xed\xb2\xa6\xe4\xcf\x2a\x06\xcb\x6f\x1f\x51\x9d\xa0\xbc\xac\xbf\x7d\x54\x95\x5c\xb6\x81\xfb\x4e\x22\x57\x3b\xa4\xed\xc0\x0d\x71\xfb\x97\x41\xbf\xb3\x4e\xdb\x09\x06\xb5\x86\xbc\x58\xf3\x43\x27\xec\xda\x0b\x7f\x80\x7e\x7a\x2a\xcd\x6b\xaf\x0b\xbc\x15\x56\x51\x58\xd9\x8f\xfd\xfb\xf6\xbc\xd8\x49\xa5\x98\x08\x44\x12\x8f\x60\x55\xa6\xf3\x26\xe2\xd2\xbd\xca\xbe\x61\x0e\x20\x01\x73\xdc\x12\x50\xa3\xf1\x09\x6a\x74\x4b\x6b\xcc\xb0\x31\x7e\xe3\x77\x82\xf3\x0c\xae\xb0\x87\x25\x66\x70\x54\xa7\xbf\xa5\x25\x9a\x4d\x8d\x6b\xaa\x3a\xe2\x95\x05\x9e\xf0\xa2\x28\x2c\x5c\xe7\x79\x0f\x2b\x3d\xf1\xd8\xb0\xc6\xde\xd6\xda\xc1\xfd\x73\xd8\xc4\x8f\xa0\x55\x18\x0e\x05\xa0\x9d\x1e\xe8\x08\x2d\xa8\xb1\xb4\x52\x5e\x42\x9d\x5c\xae\x9c\x02\x9d\xce\x00\x2c\x16\x51\x0d\x9b\x13\x8c\xa3\xb3\x67\x8f\x1a\xfa\xc3\x1f\xb2\x5b\x6b\x39\xc3\xde\xc6\x42\x4f\x25\x26\x97\x63\x5b\x84\x7e\x58\x6f\xa5\x07\xef\x34\xd0\x7c\xd4\xf4\x6f\x6f\x67\xc3\x79\xa4\x4d\x29\x28\xc3\x1f\x51\x0f\x37\x26\xb3\xb6\x3e\x57\x53\x3d\x6c\x12\x74\xbe\x12\xde\x09\x1a\x6c\xb6\xbc\xb5\xa8\xa2\x16\x14\x26\x3d\xd4\xa7\x50\x89\x87\xa4\x57\x15\x3b\x76\x40\xa0\x8c\x3a\x9c\xdf\x92\x6f\x27\xa1\x87\x83\xe7\x3b\x0a\xe6\x31\x2c\x86\x1e\xdf\x0e\x8b\xf0\x4b\x1d\xbc\x03\xb0\x8b\x49\x58\xea\xd3\x31\x8e\x49\x88\xb9\x57\x53\xc9\xc3\x64\x4b\x65\x3b\x49\x66\x43\xd4\xbe\xee\x4d\x13\x8b\x36\x5c\x34\x76\x8f\xf9\x89\x0e\x8e\xa7\xb3\x34\x72\x18\x23\xde\x80\x8a\xf5\x18\xe2\x37\xa8\xf8\x8f\x5d\xbc\x8b\xc3\x07\x4d\x59\x62\x74\xc9\xf6\x89\x95\xb8\xc5\x74\x1f\xf4\x89\x27\x10\xc6\x7f\xd3\xa3\x09\xd0\xec\xd2\x1f\x24\x9c\xe1\x57\x1f\x3c\xcc\x9c\x32\x98\xe1\x55\x27\x43\x44\x62\xa4\xad\x0c\xc9\x70\x96\x0c\xe5\x30\x88\xe6\x2a\xee\x74\x09\x53\x76\x12\xf7\x04\xed\xb3\x41\x07\x54\x4b\xa5\xd8\xad\xdb\x39\xe7\xc9\x8c\xd3\x0c\xe2\x80\xdf\xa8\xd8\x57\x79\xfe\xae\xd4\x2e\xe0\x2e\xcc\xc7\x4d\x3d\xfb\x29\x2a\xe7\xf4\x41\xac\x64\x26\xde\xae\x10\x23\x8b\xa3\x17\x80\x8f\x1d\x61\xf0\xcc\x4c\xfc\x34\xfb\x5b\x90\xd9\x75\xb4\x58\x34\xf8\x10\x3a\x83\x1a\x30\x97\xe8\x32\x30\x40\x0b\x03\x34\x30\x24\x93\x00\x3a\xfd\xc2\xf3\x41\xab\xaf\xfd\xb9\x22\xd5\xd4\x53\x09\xaf\x39\x85\x6d\x16\x01\x67\xbf\x99\xee\x7b\xb6\x38\x38\x7c\x18\xdd\x3e\x06\x84\x8f\xad\x2d\x0a\x2d\xeb\xb5\x46\x3c\xed\xbe\x62\x8b\x8e\x0e\x06\xef\x42\x93\x36\x2b\x79\xa2\xbd\x1d\x3b\x39\x25\x48\xf5\x82\xe9\x00\x71\x56\x79\x8e\x8b\xb3\x36\xd6\x9a\xe9\x05\x57\xb8\x1f\x70\x47\x48\xa1\xd3\x09\x99\x85\xbd\x08\x87\x69\x98\xfd\x21\x67\xb7\x74\xa1\x42\x61\x22\xa1\xd6\x14\xba\x63\xaf\x24\xee\x1f\x68\x0e\xc9\x9f\x06\x95\x06\x75\xf5\xc0\xea\x87\x50\x60\x6f\x25\x69\x27\x39\xa8\xe1\x59\x60\x76\x6f\x67\xf8\x07\xed\xc5\x40\xa2\x22\x3b\x27\x64\x5a\xcd\x86\xa0\x33\x55\x3d\xc6\x5e\x8b\x1e\x2b\x55\x1a\xba\x0d\x4c\x33\x02\x4a\x7b\x1f\x90\x7a\x50\x97\x29\x70\x59\xf7\x82\x9e\xfd\xf0\xe0\xf0\xd4\xd6\x51\xfd\x80\xfd\xdb\x77\xc6\x6d\x27\xb7\x9c\xd0\x9e\x74\xce\x55\xf9\x08\xdd\xce\xab\x05\x32\x97\xd5\xb5\x9e\x63\xd0\x48\x50\x50\x86\xe9\x03\xa0\x54\x91\xef\xbe\xc2\x18\x4d\x54\x84\xc2\xa0\x23\x64\x4c\x45\xec\x6c\x28\x42\x61\x05\xef\x49\xdc\xf8\xc3\xa1\x50\x77\xb4\x4f\xd2\xc6\x7d\x28\xf5\xed\x83\xcc\x8c\x68\x18\x0e\xf1\xbd\xf8\x45\xfc\x24\x4f\xe7\xe7\xd5\x79\x71\x9e\x9d\xaf\x17\xa7\x97\xe2\x1f\xf2\xf4\xbc\x80\xdf\x5f\x3f\x9c\x84\xa7\x66\x12\x4f\xb9\x78\xfe\xc6\xc5\xa3\x1a\xdf\xd3\x93\xbf\xf2\x93\x76\x0a\x31\x7a\xf7\x83\x6c\x38\xf3\xd6\xb9\x9c\xf8\xbb\xf5\x8e\x5a\x9f\x3a\x3b\x16\x19\x9d\x7e\xe0\x33\x79\x2a\x69\x89\x6e\x89\x25\x12\xc8\x6e\x76\x39\x0a\xc3\xfc\x3e\x75\x6b\xfb\x38\x86\x00\x3f\xb2\x37\x04\x4c\xec\xf6\xe3\xba\x84\x25\x3f\xd4\xa5\x57\x6e\x6d\xce\xde\xc2\xef\x5f\x26\xb7\xbc\xa9\x44\x6f\x27\x91\x2b\x20\x9c\x83\x67\xfb\x1a\xad\xab\x07\x4d\xae\x0b\xda\x31\x00\x25\x14\x11\xba\x6b\x9f\xd0\xa4\x11\x35\xfc\x6b\x03\xec\x5d\x73\x46\xe0\x9b\xa7\x24\xcb\x3a\xb9\x51\x83\xc3\x73\x89\x36\x7d\x34\x27\x84\xd2\xa9\x13\xbe\x32\x9c\xa0\x99\x62\x9b\xb1\xe6\x68\x16\x8d\x95\xa7\x64\x29\x48\xbc\x85\x54\x11\x31\x1c\xd3\xcc\x69\xd9\xd8\x34\x72\xde\x3b\xb4\x2f\x2f\x64\x3b\x26\x37\x06\xc5\xd5\xf5\x72\xd0\x27\xeb\x01\x87\x7f\xd2\x3c\xda\x4f\xe4\x29\x1b\x92\x34\x7b\x9f\x1b\xe7\x8c\x04\x93\x75\xa2\x73\xc6\xf8\xcc\x0a\x72\x66\xa2\x47\xa1\xd8\x3d\x94\x7c\x3d\xb5\xea\xd6\x19\xdb\x8b\x5e\x93\xc1\xff\xc9\x4a\x20\x3b\xdf\x86\xa4\x46\x67\xf3\x7f\x67\x7d\xac\xde\xfd\xbf\xbc\x44\x07\x56\x48\xc5\x90\xed\x59\xa5\x33\x39\x0e\x30\xb6\xac\x49\x0f\xa7\xdf\x88\xce\xba\xa1\xf8\xad\x56\x0e\x9d\xae\x9c\xc5\xab\xf2\xcb\xcb\xb4\xb3\x78\x16\x0f\xa4\x96\x40\x73\x13\x17\x9c\xc6\xd3\xc9\x66\xd9\x2c\x98\xcc\x66\xcc\x20\x58\xdb\x82\xad\xb6\xdc\x75\x40\xcd\x86\x9b\x87\xb8\x67\x11\xb3\x66\x11\xad\x5e\x3a\x8b\x98\xb5\x16\x51\x90\x0f\xc8\x3e\xe8\xe7\x4f\x9c\xb8\x99\x32\xd3\x10\x5a\x90\x89\xb1\x6a\x8a\x1c\xc1\x9c\x35\xd7\x8e\xc5\x11\x67\x06\xcb\xd1\x16\x97\x7b\x52\x05\xb3\xdc\x19\x57\x15\x84\x79\x33\xf2\x8a\xe5\x0d\xca\x38\x93\x60\x84\x0a\x33\x75\x94\xa7\xc5\x77\xbb\x8e\x1c\xcf\x6f\x8d\x44\xe8\xfd\xf6\x9b\x79\xf5\xdb\x6f\x5e\x1b\x58\x5b\xf7\xd2\xbd\x05\xe4\x4a\xa7\x9a\x98\x24\xfd\xa1\x5a\x9b\xd0\x78\x7a\x4c\x3d\xa6\x5e\x14\x76\x92\x00\x4b\x39\xcd\xb5\x33\x72\x5a\x19\xc9\xc9\xe9\x1a\xb7\x45\xb6\xb0\xb7\x03\x56\xa1\x1f\x3f\xb8\x0f\x0c\x9c\x57\x0c\xdf\x4a\x7c\xb2\xc2\x6e\x5f\x47\x69\x5f\x44\x48\xd2\x58\x68\x35\x05\xb9\xc0\xb5\xd0\x8a\x46\x16\x49\xcb\x14\x32\xe8\xa3\x42\x0a\x34\xf2\xa9\x1e\x8f\x3d\x98\x1c\xad\xd5\x1c\x18\xd4\x50\x0a\x7d\x43\xc3\xf1\x58\x2b\x54\x67\xb9\x84\x05\xe8\xe4\x7f\x85\xe7\x18\x32\x30\x6c\x04\xb7\x3c\x50\x1a\x14\xd4\x5f\xe6\x7d\x71\x12\xad\xac\xf7\x98\xf4\x1e\x43\xd9\x23\x6f\x05\x2d\x12\x2f\x35\xa7\x4e\x92\xf3\x11\x8a\x24\xee\xe3\x03\xda\x23\xe4\xbe\x3c\x60\x55\xbd\x84\xbc\xaf\x0b\x3c\x51\xe7\x11\xe5\x42\x1b\x3d\xb0\xd0\xcb\x90\xca\xd6\x0f\xb9\xc6\x93\xc6\xd1\xdf\xe9\x47\xde\xd3\x89\xfc\xc1\x1e\x5c\x9a\x1e\x50\x00\x06\xb8\xf5\x9b\xf6\xa9\x03\xb3\x2c\x24\x0f\x57\x36\xa0\xe8\xd1\x63\x37\x4a\x89\x7f\xa0\x39\x47\xc8\x93\x95\xe1\x64\x21\xaf\x48\x32\x93\x66\xbf\x74\xaf\xc2\x7b\x36\xd8\x0a\xef\x9d\x80\x4c\x71\x23\xc5\x90\xbf\x19\x45\x80\x8c\x4d\x7f\xa6\x8e\xf9\x68\x45\x3e\x2e\xc8\x54\xee\x75\xd4\xa0\x03\xd5\x21\x15\x94\x68\x91\x84\x4f\x4b\x72\x68\x76\xc3\x05\x01\xa4\xf0\x83\x13\x3c\xa2\xb5\xe2\xda\x8c\xcf\x12\xd2\x9e\x93\xfa\x83\x3c\xf5\xf3\x59\x32\x9c\x98\xf8\x6d\x48\x45\xcf\x92\x59\x19\xc2\xe3\x50\x05\x77\x29\x6d\x4f\x62\x4e\x77\xee\x0f\x32\xd3\xe2\xf1\x31\x3a\x91\xe2\x71\x42\xc3\xa8\x5a\xd6\x37\x30\x9d\xc6\xd4\x9d\xc7\x29\xb3\x83\xbe\x39\x80\x41\xec\x1c\x31\xe6\x4b\x56\x5f\xf2\xaa\xfb\x76\x09\x81\x86\x72\x68\xf1\xb0\xf5\x94\x2b\x1b\xcc\x35\x9e\xc1\xd3\xe6\x11\x79\x63\x8d\x17\x69\xc3\x75\x13\xac\x1b\x27\xb9\xea\x0f\x98\x47\x53\xaa\xa7\x97\x77\x92\x56\x7c\x90\x0e\x22\xe9\x3a\xf1\x15\x32\x41\xea\x8d\xe6\x62\xda\xd0\xab\xf1\x2a\xb8\x05\x5a\x69\xba\x84\xa8\x88\xc0\x73\x30\x6e\x20\x00\xa6\xaf\xb5\x88\xf2\x64\x12\xe0\x39\xc9\x5e\xb4\x79\x7c\xa3\xe2\xe1\xd3\x2e\x37\xd2\x33\xe0\x14\x3c\xda\x2b\x8f\x8f\xff\x8b\x7f\x9e\x0c\xac\xbc\x87\xbd\xe1\x4e\xc9\x62\x96\xb9\x69\xed\x4e\x4e\xa8\xb7\x64\x5b\x53\x76\x28\x02\xe0\xa3\xa0\x26\xed\x98\x66\x38\x3b\x14\x57\x99\x36\x67\xb6\x20\x38\x20\xef\x25\x22\x7b\x23\x24\x53\x2a\x8d\x4a\x30\xfb\x25\x7c\x4f\xa8\x06\xb7\x61\xde\xec\x56\xb8\x54\xa0\xe1\x47\x6c\x30\x45\x72\x67\x30\x8b\x30\x62\xb8\xbb\x77\xf0\xac\x91\x36\x64\x04\xdb\x25\x0a\x34\x4c\x15\x54\x5f\x69\xea\xa3\x8a\x4a\xaa\xa8\xc0\xaa\x68\xe7\x43\x75\xb1\x6b\xe9\x03\x83\x1d\xa2\xc9\x16\x0e\xd9\x91\x67\xa8\x21\x4c\xf8\xd9\x2f\x19\xb9\xb0\x42\x09\x72\xd0\xb7\x52\x53\x7a\xc2\x68\x1d\xe5\x67\x2b\x3b\x4e\x61\x49\x30\x38\x6f\x99\x38\x3c\x71\x7f\x3f\x3e\xfe\xa1\xae\x07\x7f\x35\x0f\xd0\x9d\x1e\x48\x32\x9d\x79\x34\x9a\x6a\x4f\x79\xc8\xa1\x6a\x35\x58\x48\x5d\xe8\xd6\x4c\x9e\x4a\xb8\xd2\x4e\x76\xf8\x03\x20\xc5\x22\x60\x48\x53\xf8\x8c\x42\xd4\xdc\x77\x77\x08\xa7\x7b\xd7\x1b\xbd\x31\x4c\x83\xd9\x67\x7b\x35\x56\xac\x59\xfb\x15\x36\xa9\x32\x9a\x6b\xc2\xd3\x39\x01\x66\xe2\x5e\xf3\xb7\x8a\x1d\x7a\x54\x59\x89\xcb\xb1\xdf\xef\x59\xbc\x84\x29\x0b\xef\xd1\x40\x12\xe8\x21\x5a\x45\xbe\x84\x2b\xa1\x02\xf4\x86\x96\xf5\x70\x57\x18\xb5\xb3\xd0\xfd\xdb\xbb\x27\x22\x2b\xf4\x52\xe9\x6d\xcd\xbe\xc0\xe8\xa8\x7e\xd6\x59\xcd\x5c\x3d\xd1\x3b\x43\x9d\xa8\xb6\x01\x35\xe9\x01\xd4\x84\x9d\x09\x8b\xb0\x7f\x93\x24\xce\x26\xe1\xc2\x3c\x54\xbd\x78\x2a\x8c\xde\x47\x92\x23\x28\x4e\x9c\x52\x43\x91\xaa\x19\xa9\xc0\xbf\xce\x50\xe7\x34\x19\x07\xe1\xaf\x9d\xe0\x6b\x75\xfd\xb7\xce\x33\x3c\x31\x42\x63\xda\xd9\x38\xa4\x3c\xb7\x7b\x4c\xad\xdd\x01\x22\x3b\x71\x13\x33\x96\x9d\xad\x17\x76\x01\xde\x05\x92\xc1\x0f\x14\x3c\xc0\x99\xf0\x2c\xf8\xd0\x76\x20\xf7\x44\x91\xed\xf7\xda\xfb\xa2\xbb\xe3\x38\x19\xa4\xda\xc9\xa7\xe7\x37\xc3\xd3\xcb\x40\xf4\x69\x44\xd5\xa7\x76\x52\x05\x62\x54\xcc\xcc\x4e\xfb\x4a\xc8\xce\xc0\x1c\xe0\x34\xd1\x90\xfb\xbe\x45\xc2\x83\x6e\xa9\xbd\xf5\x56\x00\x39\x85\xaa\xa3\xd7\x01\xd5\x72\xe4\xec\x7e\x0d\x7b\x61\xdf\xd9\x26\xb6\x0b\xf2\x03\xf3\xda\xef\xee\x0a\x4b\xcf\x43\xf5\x2d\xfa\xa0\xf6\x72\x1b\x22\xec\xd6\x7a\x11\xc7\xcc\x77\x9d\x7f\x65\x86\x59\x55\xde\x1f\x1f\xbf\x57\x5b\x87\x8e\x63\xa0\x49\x6c\xef\x7d\x7f\xfd\x3a\xee\x51\xc7\xa1\xb7\x89\xee\x86\x51\x71\x1c\x30\xa3\xf7\xc4\x0b\x38\x99\x86\xd9\xec\xa9\x01\x46\x3a\x01\xd1\x78\x8a\xe3\x77\x33\x87\xc7\xd1\x7a\x29\xec\xa7\xcb\xf3\x14\xb0\x46\x61\xc5\x70\xe8\xae\x06\xa6\xf2\xeb\x3e\xcc\x58\x61\xd2\x7e\xbc\xcc\xf3\x62\xe5\x24\x14\xf9\xb7\x3d\x99\x3d\x8f\xd2\x43\x52\x7f\x8d\x2b\x33\x1f\x12\x36\x4c\xf7\x88\x35\x9c\xb2\x85\x4e\x9a\xcd\xd0\x5b\xfb\xb4\x09\xc6\x54\x58\xfe\xd2\x85\x6a\xa4\x62\x06\x8c\x96\x70\x2f\x6c\x28\x51\x06\xa0\xf1\x2a\xe1\x60\x01\xbd\x18\x44\x2f\xbd\xc7\xc1\xc8\x81\xcc\x29\xff\x1a\xb5\xb5\xe7\x9e\xf2\xac\xf7\xd8\xbc\xd3\x6b\x7b\x2b\xbb\x7c\x4b\xa7\x11\x03\x92\xea\x88\xb0\xcb\x3a\x78\xd1\xae\xca\x99\x79\x40\xd2\x14\x58\xfe\x30\x2d\xc7\x03\xc4\x0b\xaa\x53\xe4\x6b\x00\x62\x47\xb1\x74\x3b\x44\x7e\xbd\x0d\xb9\xa8\x16\xed\xc9\x3e\x94\xe6\xb0\xc2\x8c\x0d\x8e\x33\x8e\xf6\x49\x71\x76\x1e\x7b\x4d\x1c\xae\xd3\x31\x6e\xab\xeb\xaa\x8f\x3b\xee\x2f\x8c\x07\x5b\x9e\xdb\x01\xcb\xdd\x81\xba\x61\xc6\xd5\x30\xc7\x07\x28\x53\xdc\x93\xd5\xab\x22\x2b\x48\x57\xc2\x79\x20\x19\xb1\x53\x90\xb9\x45\x25\xb4\xf1\x0a\x68\xe2\x88\x16\xf6\x71\xb4\xfa\x1e\x43\xa4\x0b\x6f\x13\xdd\x72\x02\x11\x64\x24\xe2\x34\x7d\x8d\xee\x1e\xe8\xac\x49\x77\xaf\xd8\xbe\x0f\x3f\xc9\x6f\xe0\x55\x86\xcf\xf3\x54\x5d\xed\xca\xf8\xdb\x68\x8b\xee\xa3\x05\xec\xd3\x2f\xc9\xc8\x94\x0a\x10\x18\xbf\x50\x60\x6c\xaf\xb7\x5e\x6c\x24\x5e\x2c\x6c\x3b\xa2\x2c\x69\x09\x9c\x19\x55\x5e\x20\x66\x36\xe1\x43\xe3\x3b\xe2\xc1\x45\x4e\xdd\xb3\x46\xc9\xcc\x98\xf0\xb4\xdb\x53\xbb\x75\x47\xa8\xef\x42\x7f\x66\x21\x64\xad\x57\x20\x2a\xac\x9d\x33\x6c\xe1\x26\xd6\xc2\x4d\x86\xc2\x8d\xc2\x6b\xba\xe7\xca\x1d\x86\x7a\xee\x36\x8a\x70\x2c\x0f\x6a\x27\x3a\x21\x1c\x94\xd0\x3c\x43\xdb\xfc\x50\xb1\x85\x78\x8a\x49\x67\x37\xff\x7c\xe0\x7c\x86\xce\x58\xa0\xa9\xd3\xb7\xef\xe2\xbb\x53\x51\x55\x5c\x76\x93\xc3\xba\xd5\x4b\x8e\xd0\x02\x78\x7d\x17\xd4\xe4\x39\x70\x2a\x32\x55\x42\xb9\x08\xd0\x4f\x4d\x7f\xf3\x5d\x75\x91\xee\x0a\xb4\x51\x2c\xa8\xd0\xfc\xed\x68\xf1\x38\x40\x6b\xc6\x91\x3f\x1a\x06\x35\xbc\x69\xec\x21\x92\xca\x4e\xa2\x61\x1e\xe7\xd6\x63\x2b\x49\x74\x54\xa9\xf3\x0a\xcd\x6d\xba\xf1\x94\xd5\x69\x45\x8c\xa7\x15\xb0\xca\xe4\xfe\x70\x7f\x99\xe6\x17\x51\x8a\xa6\x58\x4e\x1c\x01\xb6\x93\x04\xa2\xce\xdb\xca\x71\xc3\x13\x2a\xe8\x94\xb8\x6e\x0e\xf7\x49\x60\xb9\xc6\x54\x82\x57\x44\x58\x50\x7d\xb2\x94\x05\x48\x6a\x4b\xfd\x04\x98\x8f\xa5\x89\x56\x41\x49\x63\x77\x09\x6e\x6e\xbe\x90\xda\xd2\x31\x10\x7e\x2a\xaf\xb9\x7b\x18\xb4\xd0\xba\xe3\x00\x89\x6b\xb8\xe7\x2a\x03\x0a\xa9\xaf\xef\xfa\x00\x41\x49\xab\xb7\xac\xf1\x24\x9d\x26\x55\x85\xea\xe7\xcb\xcb\xb8\xa0\x68\xc8\xac\xda\x00\x22\xa7\x5f\xa2\xd5\x2c\xf1\x73\xec\x6e\xbc\x1e\x41\xa7\x37\x96\x17\xeb\x5e\xf0\x23\x19\xa3\x99\x2a\x19\x46\xb8\x8a\x79\xcf\xc3\x10\x13\x59\x37\x51\x7d\x29\x71\x27\x62\xd8\xcf\x0c\x13\xd5\x93\x9f\xe0\xa5\xbc\x93\x18\x5f\x48\x6c\xa4\x5f\xce\x9f\xa8\xf4\x3b\xca\xee\x6f\xa4\xa3\xdb\x04\xe2\x12\xa6\x74\x2b\x75\x1f\x89\x1a\x46\x29\xe5\x15\x80\xc5\xbb\x04\xc1\x77\xb6\x25\xab\xbc\x4b\xe0\x2c\x50\x1a\x09\xb7\x23\x64\xca\x49\x70\xac\xeb\x4b\x71\xf0\xdb\x55\x63\xe8\xc9\x42\xdb\xa5\xc8\x61\x7a\xa8\x8e\x3b\x36\x7d\xcb\x85\x5a\xc4\xb0\x10\xb8\x4c\x21\x2f\x9a\xd0\xcb\x19\x46\xc2\x8e\x56\x14\x46\x34\xd3\x0d\x63\xdc\x0d\x65\x14\xc1\xd4\x01\xaa\x23\xa7\xc0\x50\xa7\x80\x84\xd1\xee\xc5\x12\xd6\xf8\x4a\x62\xef\x70\x7d\xf9\x8a\xc2\x27\x9a\xd1\x3d\xcb\x77\x19\xba\xfc\x6e\x91\x9e\xee\x30\xbd\x02\x5f\x98\x28\xfe\x00\x9d\x6b\x94\x83\x06\x13\xd2\x8a\x00\x64\x93\xb3\xcf\x37\x49\x09\xa3\x8c\x31\x92\x45\xfb\x11\x05\x57\xc4\x4c\x23\xb1\xeb\x51\x14\xb7\x1d\x8a\xbc\x21\x94\x0c\x80\x52\x6f\xb1\x0e\x5c\x12\xfc\xd5\x2d\x93\xb3\x86\x9a\x2a\x0d\xdf\xee\x03\xc9\x3f\x68\x46\x3b\xbb\x32\x71\x09\xdd\xa1\x0d\x87\x62\x0c\x55\x85\x57\xac\x71\x5a\x11\x52\xa6\x95\xe3\xdd\x8a\x13\x82\xaa\x1f\xe5\x63\xde\x0d\x92\xd1\x0d\xaa\x29\x7a\x76\x30\x2c\xbb\x32\x97\xf4\x51\xf0\x72\xf7\xf2\x86\x36\xf0\x46\xef\x43\x34\xc0\xa1\x68\x95\x7d\x80\x5e\x75\x01\x9d\x62\x72\x69\x58\xaf\x0c\xac\xaf\xe4\x25\xc3\xfa\xd5\xc3\xb0\xbe\xc2\x44\x26\x6d\x70\x5d\x69\x70\xf5\x8b\x07\x41\x7d\x25\xd6\x72\x49\xa5\x49\x3f\x59\x52\xca\x2a\x2b\x27\xd0\xf9\xf9\x28\xf0\x86\x57\x0a\xe6\xe0\x0e\x90\xef\xe8\x31\xfc\xd6\x01\x5a\x37\xf9\x78\x85\x59\x82\x44\x2a\x73\x13\x66\x4c\x8d\x2d\x87\xb1\x45\x72\x3d\x47\xfb\xd0\xe4\xf8\xf8\x92\xfc\x26\xf5\x6e\x01\x46\x1d\x0d\x82\x70\x7d\xe9\x39\x03\x40\x89\xd1\xe1\x14\xd0\x8f\x0c\xcc\xa3\x49\x38\x70\xb5\x54\x4e\xef\x22\x3c\x99\x78\xfc\xd8\x63\x3f\xf5\x41\xf3\x9c\xf0\x9c\x86\x95\x1c\x03\x95\xd8\xdf\xac\x5d\xe0\x39\x39\x01\xd0\x64\x80\xc0\x8d\xc1\x57\xc6\xfc\x28\x08\xd0\xd5\x69\xb0\x6e\x0c\x25\xb7\xd0\xb5\xa8\x58\x81\x7c\x82\xc5\xf5\xb5\xfe\xe0\x4a\x6c\x34\xb2\x55\xfb\x49\x4b\xda\xbc\x23\x00\xe4\x9b\x12\xfa\x74\x1c\x27\x3f\x68\x32\xb1\xad\xd0\x74\x6d\x19\xe8\xe5\xe4\xcf\xf1\xcb\x21\x02\x06\x01\x2a\x42\x73\xdb\x92\x6d\x89\x3a\x4e\x55\xa3\x6e\xa2\x63\x86\xe4\x31\x7c\x7a\x94\xc3\x4a\x21\xf5\x66\x1f\x98\xa0\xae\x3d\x34\x4c\xce\x81\x22\x44\x88\x7e\xaf\x79\xb0\x3a\x2a\x16\x09\xbf\x08\x54\x19\x6c\x91\xe6\x9d\x59\x39\x2a\x60\xee\x2c\xe0\x0d\xe7\x64\x91\xba\x93\x6b\x99\x20\xb9\x89\xc4\xa7\x24\x19\x35\x67\x35\xff\xd5\xba\x1f\x64\x0a\x1b\x5e\x0e\x3b\x84\x09\x47\x7f\xd9\x9c\xb3\x8e\xe8\x84\x15\x9e\x6d\xe4\xa5\xd5\x26\x74\x7f\x63\xcc\xd3\x36\x6a\xfb\x04\xa4\x84\xb7\x3e\x0e\xf1\x10\x5d\x21\xaf\x4c\x66\x96\x95\x33\x08\x91\x18\xb4\xfb\x76\xc4\xcb\x79\x29\xba\x1e\x04\x00\xd2\xe8\x02\x97\x94\x6f\xb8\x6b\x32\x9f\x3d\x09\x3f\x15\xd6\x1c\x48\x0b\x7f\xdb\xcf\x61\xa9\xa4\x75\x3b\xeb\xec\xc1\xcd\x07\xf7\x60\xc8\x09\x42\xd1\xfc\x07\x44\x77\x59\x61\x36\x49\xca\x59\x81\xaa\x64\x75\x29\x13\xb2\x00\x24\x9e\xaf\xa0\xac\xf0\x8e\x9d\xa1\x20\xcd\xd9\x41\xea\x87\xa9\x59\xb7\x7a\xda\x31\x32\x8e\xba\x54\xc4\x1f\xa3\x1e\x12\xe4\xf3\xe1\x00\x86\xe3\x1d\x60\x3e\x1e\x76\xe7\x24\x5b\xe2\xa4\xfc\x99\x0c\xdf\xfd\x44\xd9\x0f\x2f\xa5\x8b\x9e\x90\xfa\xea\x95\x5e\x0e\x2f\x71\x3b\xef\xe4\xce\xce\xd2\x31\xdd\x4d\x5b\x4f\x14\xee\xdf\x61\x68\xd7\xdd\x14\xb3\xf6\xf8\x49\x3b\x47\x67\x04\xab\xaa\xca\xad\x8d\x76\x23\x89\x6f\x30\x55\x06\x57\xc5\x1d\xc3\x50\xbd\xfb\x95\x39\xcc\x87\xc6\xaf\xe6\x2b\x54\x20\x23\x04\x42\xf7\xd1\x42\x26\xba\xa4\x0c\x1f\xaf\xab\x7c\xbb\x45\xcb\xac\x80\x37\x81\x5c\x9d\x4d\x66\x4b\x0b\xbf\xe2\x58\x4a\xe9\x6b\x62\xb1\x6b\x76\x20\xf9\x46\xcd\xf9\xb3\x45\x43\x4e\xa0\x04\xef\x5d\x80\x0d\x2b\x86\xcb\x0e\xe6\x15\x2a\x4a\xd1\x5f\x26\x5d\x70\x24\x4f\xcb\x73\x63\x17\x98\xa2\xee\x37\x2a\x90\x16\x06\x61\xa1\x86\x9f\xf3\xb0\xd9\xd2\x57\xf5\xf9\x52\xd0\x32\xe1\xd0\xd4\xeb\x57\x5c\x18\x07\x86\x56\xaa\x5b\xe8\x1b\xbf\xc0\x05\xd7\xd7\xaa\x15\x95\x9c\x49\xb7\x15\xb4\x7a\x96\xc0\x03\xe8\x75\x02\xf0\xd3\xb3\xfa\x32\xc1\xd1\x60\x86\x26\xbc\x60\xcf\x07\xd1\x65\x3a\x2f\xc9\x8d\x1c\xeb\xf0\x03\xc5\x96\xdf\x91\x71\x70\xbb\x60\xd5\xd4\xb5\x36\x07\x4f\x7a\x3b\xec\x29\x08\x14\xb1\xaa\xa1\x1b\x21\x4d\x57\xb4\x4e\x6e\xfd\x6e\x0c\x34\xe4\xa6\xd2\x9e\x70\x29\xbb\x66\x5d\xf9\x74\xde\x5d\xda\x58\x9f\xa5\x52\xc8\xb4\xf6\x76\x32\x6f\xef\xf7\x64\xb6\xc2\xb9\x84\xe2\x66\x23\xf0\x5e\xa5\x8a\x07\x4b\x5c\xbe\xe7\xaa\xef\x75\xed\xdc\x5a\x47\xd9\x8a\xe8\x04\xf7\xa5\x69\x4e\xf1\x52\xa5\x5d\x4a\xec\x90\x0f\x37\xe0\x9d\x03\xc9\xcf\x14\x78\xc7\x87\xc0\xfb\x1e\x68\xe2\xae\xc0\x3d\xa2\x3a\x96\x2b\x2e\xbf\xa9\x07\x95\xe4\xba\xb9\x79\x64\x55\xf8\xf5\x66\x13\xaf\x12\x4c\x10\xda\x57\xb3\x3f\x88\x1d\x14\x88\x2a\x41\xfb\x9e\xf1\x40\x62\xb1\x02\x94\xa4\x49\x35\x05\xc4\x4f\x26\x38\x6d\xe8\x4e\x95\xb0\x5f\x4e\x21\x7d\xbf\x3d\xdd\x89\xe1\x3a\x16\xec\x94\xc8\x9f\x63\x32\x3d\xd5\xe7\x40\xc1\xb3\x1a\x58\xda\xf8\x63\xc5\x1a\x9d\x9a\xed\x44\x51\x70\xdc\xfd\x24\x38\x56\x9d\x35\x44\x3f\x68\x82\xb3\xc1\x8a\xe5\x65\xa5\x97\xec\xf8\xd8\xbd\x77\x96\x50\xc4\x0d\xb8\xea\xe9\x3c\xe4\xe4\xd1\x40\x67\xe6\x72\x35\x00\x9b\xb1\x42\xf7\x04\x5d\x18\x50\xdc\xb2\x81\x80\x29\x57\x26\x94\xb5\xc7\x2e\xff\x03\x93\xed\x84\xec\xa7\xa6\xbb\x01\x81\x5e\x0b\xcd\xd6\x35\x59\x4a\x28\x4b\x11\xa7\xca\x26\xe4\xc3\x80\x63\xee\x77\x2b\x26\x64\x9f\x63\x7f\x11\x6a\x52\xe3\x1f\x92\xb1\x15\x56\x62\x98\x34\xb2\x56\xc9\xf1\x2c\x8d\x17\x80\x2e\x13\x47\x2a\x9a\xdd\x02\xa5\x62\xb3\x0d\x22\xdb\x80\x01\x51\x13\xc2\xa7\x01\xea\x95\xca\x0b\xbd\x33\x79\xa1\x03\xaa\x14\x0d\xc9\x39\xa5\x45\x30\xcd\x0d\x63\x57\xaa\x8c\x11\xb8\xf8\xe1\xae\x99\xf9\x7c\x6f\xe1\x11\x65\x2c\x99\xb6\x8a\x53\x63\xe6\x0b\x9d\xe5\x89\xdc\x32\x29\xe6\xda\x6d\xc7\xc3\xc8\x62\x29\x4c\xc2\x85\xa9\x1b\x31\x9d\x62\x90\xe4\x32\xd6\x56\x77\x50\x0d\xab\x72\x92\xc5\xb4\xd4\x46\x1d\xd6\x43\x09\xe5\x14\xd1\x4c\x94\x3d\x16\x29\x5c\xf8\x84\x2a\x6e\xbd\x7a\x17\xdf\xa9\xa3\x2b\x8c\x21\x25\x4b\xd2\x71\x95\xfc\x8e\x2e\xb5\x53\x9e\xba\x55\x26\x59\x74\x8d\xc1\xba\x2c\x26\x08\xc3\x55\xc8\xc2\xe5\xfb\x81\xad\x0e\xd0\x76\xa1\x5a\x08\x3e\xee\x80\x3f\xcd\xe9\xa3\x61\x49\xf4\x25\x9e\xc8\x15\x4b\xa5\x77\x41\x42\x2d\x38\x49\x12\xbf\xb5\xc1\xcc\x7c\x61\x5e\x5a\x4c\x80\xc0\x28\x94\x55\xf4\xf7\xf8\x4e\x62\x4a\x28\x75\x2d\x4a\x15\x5c\x7d\xa6\x2f\x28\xf0\x57\x18\xf3\x09\x5e\x19\x7a\x51\x5a\x41\xb9\xa3\x0b\x0e\x39\x71\xb4\x8c\xb2\x65\x9c\x22\x2c\x1f\x2d\xab\x22\xc5\x57\x0e\xee\x3b\xa2\x9d\xff\x0a\x84\x41\x74\x0d\xa0\x36\x8e\x28\x8a\x70\xbc\x52\x05\x88\xc3\xc4\xc7\xdc\xc7\xa3\x2a\xd9\xc4\xaf\xab\x68\xb3\x3d\xba\x06\x7e\x03\x73\x5d\x2c\xaf\x3c\xcb\x57\x51\xe8\x75\x44\xc5\x52\xb3\x34\xaa\x7b\xcb\x2b\x00\x0c\xfc\xf3\x0c\x06\x79\x04\xaf\xf1\x1f\x5e\xb7\xaa\xa0\x8c\xb4\xbd\x0a\x64\x1d\xa2\x95\x1a\xa6\x59\xa4\x2b\x9d\x26\x62\xa4\x2b\x9f\x35\x97\x61\x35\x52\xad\x60\x32\xdf\xbd\xb0\x60\x49\xf7\x8b\x51\xc8\x11\xff\xc0\xb4\xa5\x09\x4c\xcb\x2f\xea\xf7\xd7\xa3\x75\x91\x6f\xd4\x92\x1e\xb1\xdb\xf3\x2f\xea\xf7\xd7\x23\xc0\x91\xf1\x2f\xf4\xf7\xd7\xa3\x72\x59\xc4\x71\xf6\x8b\xfa\xfd\xf5\xa8\xca\xd5\x57\x1f\x18\x9e\x83\x08\x4b\xc0\x80\xdc\x11\x42\x86\x56\xdb\xd3\xd6\x1c\x50\xd3\xfa\x68\x17\xcd\x2c\xa9\xd7\x74\x2e\x6c\x60\xaa\xcd\x38\xc2\x3e\x4c\x4c\x62\x7a\x55\x2f\x61\x2c\x8c\x88\x21\x54\x9d\x4d\x65\x43\x9f\xbc\x55\x60\x40\x79\x9a\x7e\x13\xaf\x2b\x16\x5e\x9d\x07\xe3\xe0\x84\x4b\xf1\x37\x56\x29\xfb\x01\xa5\x36\xa7\x69\x32\xb5\xff\xea\xd4\xfe\x26\xdf\x3a\x95\xd3\x7d\xab\xee\xa6\x8c\x75\x3f\x46\xbf\x9a\x78\xe4\xc0\x2d\x71\x6a\x7e\xeb\xa1\x4c\xad\xad\x48\x47\x8f\x6a\x02\xc2\x14\x3b\x47\x80\x04\x52\xbb\x64\x53\x33\x0d\x59\x93\xe3\x12\x83\x23\xc3\xdf\x4f\xc3\xcf\xe0\xef\x93\x70\xcc\x70\xa4\x08\x72\x78\x9f\xe6\xd1\x0a\x93\x3f\xb2\x64\x40\x29\xbb\x39\xdb\xdd\x7d\x47\x2e\x35\xfe\x8a\x28\xfe\x57\xc8\x93\x32\xf2\xc3\xe2\x81\xa5\xc0\x6d\x9e\x02\x3d\x1e\x4c\x6c\x05\xae\x70\xf4\x1f\x9e\x52\x34\x7b\x7b\x81\xda\xe5\xde\x26\xad\x3a\xa5\xd3\x2c\x7e\x31\xf3\xcd\x25\x35\xa5\x3c\xb1\x3a\x4d\xe4\xbb\xca\x43\xd7\x10\xa0\x84\x0f\x35\x62\x9d\xc1\x32\x27\xa9\x8e\x61\x41\x0a\x35\xc7\x09\xda\x94\x91\x43\xb1\x2b\x83\x51\xa8\x77\xe6\x37\xd7\x4d\x5f\x34\x93\xde\x77\xf6\x64\x9f\xf8\xaa\x75\x15\x18\x64\x0d\x66\xe9\x22\x06\x1a\x1d\xef\x32\x5e\x1c\x9b\x47\x71\x39\x66\xc5\xa2\x18\x06\x09\x99\xab\x24\x8b\xd2\x17\x4a\x65\x81\xed\xf0\xc1\xb1\x2e\x8a\x47\x66\xa2\x4c\x36\xbb\xd4\x89\xc3\xa9\x54\x6f\xfa\xb4\xd8\x68\x56\x2d\x02\x83\x9e\x59\xa4\x60\x88\x45\x52\xbe\x56\x35\xb0\xcb\xb3\xdd\x6a\x88\x4e\x05\xd3\x62\xd6\x12\x0a\x40\x22\xe5\x70\x08\x41\x57\x5f\xad\x32\x83\x60\xa4\xc4\x03\xb2\x4f\x57\x6e\xa2\xa3\x16\x4b\xa5\x23\x23\xfb\xce\xa8\x4c\xdb\x87\xa7\x71\x5f\x29\xd4\x97\xf6\x3c\xa6\x7c\x40\xb0\x8e\xfb\xce\x11\x2c\x9f\xfd\x92\x66\xa2\x9a\xa2\xac\x60\x07\x73\xd2\xa6\x66\xcc\x37\x25\x94\xc9\xb4\xd0\x32\x95\x53\xd8\x27\xc3\x17\x1c\x08\x0f\xa1\xf7\x18\x0a\xa1\xea\x28\xc9\xca\x0a\xa9\x21\x1e\x0a\x70\xe1\x99\x4f\x41\x26\xe9\x08\x80\x21\xcf\x59\x05\xa9\xdc\x42\x48\xb0\x54\x4c\x0c\x3d\xe8\xce\xaf\x34\x26\x06\xe6\x11\xf2\xfe\x36\xf0\xb0\x0a\x8d\xce\xa5\x5e\x39\xeb\xa0\x3c\xa5\x5f\xb5\x16\x67\x96\x54\x61\x5e\x29\x5e\x85\xbb\x80\x36\x4d\x06\xaa\x98\x2b\x54\x36\xc3\x86\x28\x4b\x1e\x91\xbe\x45\x9d\x5d\x06\x02\x2a\x17\xb3\x38\x35\x0a\x74\x16\x38\x0a\x20\x72\xec\xd3\xf3\x68\xa5\x7e\xbb\xef\x0e\x17\x3a\x26\xfa\x84\x2b\x7e\xfe\x80\x8c\x84\x05\x5c\x28\xec\xc6\x9a\xed\x2e\xc4\xf4\xd0\xac\x27\x95\x88\x7b\x24\x98\x59\x57\xa4\x09\xdd\xc5\x40\x88\x14\x2d\x19\xe7\xdf\xe9\x49\x77\x64\x4d\x5f\x5a\xd5\xea\xc8\xdf\x8e\x34\x25\x50\x2d\x8b\x9c\x19\x53\x0c\x49\x5e\xfc\x58\xaa\x6f\xee\xec\x8e\xa9\xf6\x1f\x98\x62\xec\x08\x95\xea\x34\xda\x98\x37\xdc\x13\x07\x84\x73\x58\x84\x1e\x5d\xc3\xbe\x2d\x3c\x66\x8c\xd2\x38\xba\x8e\xf5\x63\xc2\xf9\x6d\x4b\x83\x96\xf4\xbf\x90\xf7\x0e\xb9\xa8\x84\xd6\x18\xc1\x25\x8b\x12\x7d\x76\xf2\xac\x0f\x48\x64\x8b\x46\x53\xb4\x0e\x23\x10\x2b\x8e\x87\xbc\x8b\x13\x0e\x29\x3e\x68\x82\xd2\xfb\x3a\xe7\x17\xef\x4e\x60\xbd\xb5\x64\x2c\xb2\x46\x82\xef\x0f\x1d\x2c\xd4\x37\x68\x2a\xd8\x36\x81\xa0\x88\x6f\x2a\x6a\x1b\xdb\xa4\xda\x23\x56\xef\xe9\xd8\x7b\xb7\xfd\x18\x12\xc8\xd1\x18\xd1\xcc\xc4\xd4\x85\x6e\x85\xfc\x92\xa8\xdd\xe8\x37\xae\x14\xd9\xe1\x2d\x7a\x9f\xea\x07\x9e\xe8\x4c\x9d\xe1\x60\xc8\xee\xbe\x31\x6d\x36\xa4\x96\x77\x7d\xf3\x58\xe5\x23\x45\xe5\x35\xf6\x24\x04\x3e\xd2\x8a\x84\x50\x08\xcf\x19\x30\x79\x5d\xd9\xdd\x34\x05\xfa\xfb\x14\xeb\xc7\xbf\x5d\x68\x60\xa6\xd9\x3c\x50\x3b\x2a\xfc\x29\xaa\x3a\x7a\xfb\x1d\x26\xca\x6e\x9d\xcd\x71\x40\xfb\x0d\xc3\xba\x6d\xcf\x41\x7a\x1a\xa5\xb0\x6e\x4e\x7d\x35\xb9\xf6\x3d\x3d\x86\xd6\x87\x22\xe6\x9e\x09\x7d\x0e\xf2\x3f\x5c\x58\x75\xc6\xc1\xef\xcd\x8c\xd1\x78\x1d\x20\xe3\x60\x82\x87\x81\x8c\xdf\x1f\x06\xb2\x7f\xb2\x10\xec\xb8\x55\x04\x33\xdf\xef\xe7\xb2\xea\xda\xb2\xb0\xd5\x0f\xdb\x0b\xcd\x7d\xde\xaa\x14\xeb\xdc\x81\xd1\x6f\xfc\xeb\xae\xb9\x89\x15\x49\xfc\xb4\xcb\x31\xe9\xef\xd9\x93\x88\x3b\xf8\xdb\xef\xbb\xb2\x52\x35\xad\x08\xdb\x35\xaa\xd1\xce\x4e\xe8\x6b\xb0\x5b\x4b\x7b\xa1\x7b\x1b\x9a\x34\xcd\x34\x00\xa0\xeb\x57\x1a\x44\xea\x0d\x33\x9b\x3d\xb3\xc1\x5c\x24\x19\x53\xc0\xc7\xfd\x9d\xd3\xd6\x47\x4a\x49\xa5\x57\xc6\x36\x6d\x35\xbb\xad\x12\x9e\xb3\xf2\x9d\xdd\x66\x0a\xf4\xb7\x35\x68\x81\x2d\xb2\x14\x16\x2b\xc9\xb7\x6f\xf4\x91\xc6\xc3\x83\xef\x40\xbf\xb5\x6f\x3b\xfd\xb4\xf7\xed\x21\xa4\xde\xcc\x81\xc5\x78\xa1\xd3\xc6\xc3\xbd\x54\xa0\x49\xde\x1d\x2c\x12\x34\x40\x6c\x1e\xce\x2c\xaa\xf0\x30\x66\x0f\xab\x0f\x6c\xe2\xde\x8d\xaa\x26\x06\x00\xa1\x77\x67\xb9\x9b\x57\xc9\x5c\x66\xf7\x6a\xba\xca\x52\x9f\x11\xc9\x58\x22\xb3\xc5\xa7\x3e\xbf\x46\xf4\x64\xb3\xa7\xb2\xb3\x68\x95\x30\x18\xdf\xd5\xee\xd3\x9a\x4d\xdb\x04\xb9\x5a\xf4\x60\x0d\xca\x1b\x3f\x1c\xaa\x00\xf0\x2e\x8f\x1e\xf3\x31\x6c\xff\xac\xe1\x87\x27\x27\x19\x7e\xd8\xc7\xdf\xeb\x6f\x3b\xe1\x20\x9c\xcc\xda\xc2\x39\x8e\x8d\x04\x05\x4c\xeb\x86\xb5\x01\xc4\xd2\x09\x92\x46\x91\xb7\x0a\x32\xd1\x06\x5a\xdd\xe4\xd4\x8d\x03\x66\xcf\x32\x3f\xa2\xda\x63\x4a\x81\x15\xd8\x90\x87\x69\xe1\xd4\xd9\x20\x2b\x49\xd0\x57\x05\xa3\x7a\xe0\x99\xa1\xac\xb4\x77\x16\x45\xf5\xe8\x09\x49\x96\x90\x11\x13\x14\x53\x57\xdc\x03\x8c\xc5\x45\x27\x13\x89\xcc\xab\xa9\xce\xbc\x3a\x48\x6c\x17\x60\xdd\x09\xd4\x2c\xe7\x94\xe0\x24\x81\xaf\xfa\xc4\x57\x3f\xc0\x30\x7a\xb8\x94\x07\x32\x1c\xec\x41\x9e\x23\xe3\x91\x52\x1b\x95\x94\x2d\xa3\xa9\x5e\xb7\xc1\x06\x8a\x0c\x2a\x03\x91\x93\xbc\x04\xd0\xc7\x32\xcf\xfa\xe4\x56\x5b\xf5\x60\x99\x92\x20\xaf\x0c\x9d\x3c\xe4\x09\xa1\x5c\x1f\xda\x3c\x37\x99\xf3\xeb\x0d\xdb\xb8\x3c\x5a\x0f\xc5\xad\xdf\x3e\x23\xe2\xd9\xb0\x0e\x48\x66\xcd\x61\xc7\xd0\x1b\x79\x43\xeb\x55\xd8\xbc\x12\x8d\xbe\x5d\x34\x87\x20\x34\x2f\x87\x00\x8d\xf4\xf7\x36\x1c\x41\xbb\x39\x8c\x2b\x9e\xe7\x0b\x17\x88\x14\x07\x9a\x29\x09\xee\x50\x4c\x3d\x0d\x1f\xe4\xa1\x44\x07\x2b\x05\x00\xc8\x07\x16\xc7\xc6\x41\xb1\x59\x9d\x8e\x72\xc5\xd6\x7f\x3e\x58\x9f\x56\x14\xc4\xca\xa7\xdc\xae\xee\x2b\x65\xc6\xd5\x67\x82\xad\xdd\x55\x8d\xd9\x77\xb7\x42\x65\xab\x81\x06\x9a\x7c\xaa\x58\xa2\x0d\xe3\x68\xfe\x36\xfc\xd3\xf9\xfc\x7c\x24\x16\x8f\x1f\x9d\x8a\x54\x19\x3f\x32\x61\x29\x6b\x04\x09\xb8\xfd\x29\xab\x92\xb4\x7e\x0a\xc2\x7b\x70\x2a\x76\x95\x3c\x68\x20\x26\x96\xc0\x56\x2f\x31\x2e\x24\x7c\x4f\x21\x97\xd9\x0c\xb6\xc4\xeb\x0c\xcd\xcb\x30\x01\x3a\x54\x8a\x3a\x36\x37\x98\x05\x1e\x96\xf4\x79\x3b\x4a\x8a\xc7\xaf\x64\x0d\xa3\xda\xb7\xfc\xaf\x9b\x10\x22\x8e\x17\x3f\x9e\x89\x80\x0c\xbd\x7c\xc7\x36\xaa\x4a\xdb\x6e\xcd\x39\xfb\xe6\x8f\xa7\x89\x4a\xb0\x40\x51\x01\x1a\xc9\x04\xcf\x0b\x68\x09\x9a\x7c\xcb\x2a\xaa\xb4\xfd\x91\x3a\xe4\x81\xb5\xc7\xf2\x56\x6a\x44\xd9\xea\x44\x72\x86\x9e\x2e\x9c\x85\x89\x72\x2e\x51\x6c\x62\x05\xf4\x5c\x58\xdf\xcd\x9c\x3b\xca\x6a\x8d\x0a\xa7\xac\x9b\xc3\x48\x4f\xd1\xad\xcf\x7c\xb4\x1d\x4e\x69\xea\x28\x22\x0f\x8e\xbe\xe8\x1d\x3d\x2b\x27\x28\x1e\x55\x33\x7a\x0c\xf9\xd7\xab\xc4\x6b\x0d\x75\xad\x7c\x7f\x63\x3a\x6e\x66\xa6\xbc\xa3\x32\xff\xc8\x8f\x27\xf8\x71\xd2\x97\xb9\x69\x30\xd0\x45\xfb\x82\x3c\xec\x9a\xb4\x8b\xb8\xfc\xa1\xa9\x4e\xcd\x0e\x2a\x42\xf3\x12\x4a\xf4\xfb\xf5\x71\x22\xcc\xc6\x3b\x5d\xa8\xa3\xc2\xa6\xda\x9e\x78\xa0\xf1\x8c\xd6\x81\x0f\x26\x47\xca\xb6\x38\xd0\x9e\xb4\x3a\x91\x26\x65\xf5\xe7\x0d\x5b\x2c\xa6\x68\xa2\x83\x9a\xcb\x29\x3a\x57\x5a\xc7\x47\x78\xac\x39\x39\x73\x02\x41\x44\xb3\x48\x9d\x2f\x66\x94\xa5\xaa\x1d\x29\x42\x79\x1f\xa9\x8c\x90\xaf\x15\xf8\x80\xfc\x18\xa3\x77\x2c\xca\xd3\x2a\xdf\xd7\xd4\xcd\x29\xef\xce\x7f\xde\x84\x9a\x33\xe0\x9a\x07\x61\x8e\xcb\x40\x5e\x65\x7d\x0e\x04\xb3\x9e\xb4\x6e\x56\xce\x2e\x46\x4e\x48\x2e\x02\x8a\xd6\xa0\xd3\x6d\x8d\x7e\x87\xda\x8b\xbb\x19\x26\x5f\x0e\x15\x04\x87\xaa\x34\xab\x95\x31\x7e\x74\x33\x2b\x33\x05\xcb\x45\x89\x59\x37\x11\x8d\x00\x4a\xf2\xf5\x92\xa2\xd7\x59\xdb\x12\xda\xf0\x68\x7d\x1d\xa4\xf7\x8e\xc1\x11\x91\xc1\x26\x9f\x77\x0c\xbd\x62\xe7\xf8\x4d\x0c\xd4\x8d\x39\x4a\xf4\xbd\x0b\xac\x9d\xde\x46\x36\x7a\xd2\x30\x1d\x1a\x76\xe7\xcb\xc8\xce\xe6\xd5\x82\x7b\x24\xee\xda\x1f\x5f\x1d\x6a\xc6\xd7\x6c\x44\x17\xb6\xee\xcd\x79\x61\xe0\xc6\xdd\xdb\xaa\x54\xc4\xab\x1c\xc3\x64\x62\x1e\x26\x3e\xf6\xec\x04\x8c\x34\x3d\x8e\xf7\x9a\xdd\xe5\xa9\xfd\x78\x4f\x8c\x09\xd6\xd8\x9c\x81\xce\x2a\xe5\x2c\xa4\xc8\x45\xbf\x82\x7f\x95\x90\x9f\x61\x53\x21\x5a\x0a\xab\x2f\x88\xb0\x1c\xf2\x0f\xec\xfb\x94\x74\x9c\x44\x48\x7a\xda\xa2\xa9\xf0\xf0\xed\xeb\xe4\x22\x25\x9f\x88\x3d\x53\x9b\x83\x85\xf1\x6d\x92\xef\x4a\xeb\x03\xfc\x1e\xe0\xea\xc1\xc1\xf4\xb4\xf1\xa1\x4f\x0e\xb4\xf4\x71\x33\x60\xb7\x47\x53\x80\xb5\x7d\xe4\xe4\xb5\xda\xa5\xcf\x4b\xbe\x39\xb0\x62\xea\x2d\x46\xd3\xb6\x05\x55\x34\x55\x69\x22\x4d\x63\xc0\x27\x61\x48\xfd\x83\xf5\xd8\xc9\x42\xf1\x23\xcd\x13\x7c\xe0\x3c\x48\x78\x09\xf9\xd4\x78\xe4\x7a\xc2\x1f\x35\x07\xa1\xe6\x11\xdb\x70\x99\x23\xd1\x50\xef\x56\x40\xd8\xe8\xb1\x02\x6d\x62\xf7\x4b\x54\x9f\xb6\x15\xa1\x6b\x4a\xf6\x64\xdb\x9c\x36\x87\x3f\x14\xff\xf7\x8a\xa2\xfb\x98\xcd\xee\xd1\x94\xb3\x1d\x09\x1b\x56\x9c\x7c\xae\x78\xc7\x80\x63\x60\xb4\x43\x53\xaa\x78\xa2\x6a\xef\x92\xba\x53\x58\x74\x05\x33\x4c\xfb\xcb\x8a\x82\x58\x51\x41\x85\x3c\xb0\x58\x6a\x68\x0d\x55\x92\x8c\x90\x3d\x2f\xd0\x45\x48\xd7\x61\x71\x17\x81\x1b\x9a\xa2\xe7\x00\xde\x62\x16\x2d\x4e\x91\xbc\xac\xa5\x17\x02\x65\xf7\x29\x36\x0b\x1a\x4f\x53\xa8\x12\x63\x8d\x32\xa1\xa4\x39\x56\xf8\xdd\x5e\x32\x03\x02\x5c\x30\x03\x8a\x16\xce\x17\xa1\x5b\xc4\x47\xd3\xdf\xcb\x22\xde\x3a\xe9\xce\x9a\x6c\xbd\x8e\x9f\xfc\x1e\xb1\x26\x40\xee\x01\x0f\x4e\xca\xb6\x88\x56\x1c\xda\xa6\x9b\xa3\xe0\xe6\x36\x9d\x2c\xf8\xf8\x77\xe2\x3c\x47\xb7\x6d\xa0\x63\xa3\xa4\x44\xc4\x1c\x90\x60\x67\x7d\x64\x72\x66\x43\xf5\xb6\x7d\x48\x62\xb6\x4a\x2f\x55\x99\xab\x7c\xfb\x31\xa5\x85\xb6\x36\x69\xe0\x8e\x0a\xc8\xca\x40\x85\x9c\xa4\x76\x62\x2b\x85\xb6\x8d\xcb\xd7\x95\x13\x0e\xdb\x0a\x2e\x53\x99\x10\x55\x6a\x2e\x63\xd1\xe7\xae\x38\x18\x54\xda\xfc\xbb\x60\x13\xbc\x8c\x43\xac\x54\xed\x38\xc1\x7d\xf5\x58\xf1\xd5\xa0\xb7\xcd\xc7\x1d\xb0\xe6\x50\x00\xa5\x02\x50\xbb\x6f\x0a\xd0\x2b\x8e\xd6\x58\x49\xfb\x89\x31\x5e\x7a\xa8\x69\x3b\x1b\x27\x45\xee\xe1\x6e\x34\x9e\x52\xab\xaa\x21\x53\x57\x26\xc8\x76\x8d\xe6\xcb\x30\xe3\x87\xd2\xda\xb0\x89\xa9\x93\xb2\x40\x85\x64\xd0\x80\x1e\xb4\x5e\x63\xee\x05\x34\x26\xb5\x96\x8a\xb2\xf6\x57\xd2\x8b\x2e\x2e\x8a\x3a\x2a\xaa\x64\x99\xc6\x75\x54\x26\x80\x1c\xa3\xdd\x2a\xc9\xeb\x8b\x55\x52\x2f\xa3\xec\x3a\x2a\x6b\x0a\xae\x8e\x7f\xd2\xa4\xac\x6a\x3c\xf0\x4c\xd2\xb2\x5e\x27\x97\xcb\x88\x42\x8b\xe0\xe5\xae\x88\xeb\x75\x9e\xc3\xf4\xd4\x57\x71\xb4\xc2\x1f\x0a\x67\x52\x6f\xa2\xe2\x5d\xbd\x89\xf1\x45\x16\x5d\xd7\xf9\xae\x42\xcf\x36\x1d\xd8\xb2\x2e\x63\x9a\x8a\xba\xdc\x6d\xa0\xe4\x5d\x8d\xc7\x85\xf5\x35\x74\x23\xf7\xc4\x25\x48\x70\x47\xbf\xff\x80\x7c\xd5\xf9\x6a\x28\x3d\x90\xde\x90\x46\xd7\x70\x13\x78\xa7\x97\x62\x53\x49\x6d\xcb\xfd\x05\xbc\xf3\x86\x57\x15\x6c\xfa\xf9\xf9\x79\x79\x7a\xb6\xf0\x00\xe5\xc2\x44\xde\xa1\x14\x78\x5e\x0e\x4f\xc5\x35\x5c\x41\xb1\x01\x47\x3a\x2c\xea\x65\x9e\xd6\x14\xe5\xbb\xbe\x2a\xea\x64\x73\x59\xb3\xcf\x1d\x66\xe9\xc2\xfe\x46\x35\xd0\x8b\x68\x13\xf8\xfe\xfc\xfc\x26\x5c\x0c\x83\xf9\xdb\xb3\xc5\xe3\xe0\xfc\xf4\xec\xf4\x32\x11\x17\x54\x99\x7a\x73\x2a\x6e\xf1\x96\x12\x83\x9d\x26\xe2\x06\x6f\xea\xe3\x3f\xcd\xce\x6f\x86\xd3\x53\xf1\x86\xdb\x0d\xcb\x65\x91\x6c\xab\x9a\x7d\x5a\xb1\x95\x00\xca\x3e\xab\xac\x70\x8a\x17\xf9\x6d\x4d\xea\x47\x72\xf4\xfb\x0e\x5e\x29\xd5\xf6\x79\xf9\x18\xca\xcc\xdf\xca\x45\x2d\xe1\x5a\xfb\x2e\x8e\xb0\x86\x77\x58\xc3\xa3\xfa\x1c\x33\x11\xfc\x1e\x5d\x47\x75\xbc\xdc\x44\x01\x37\x06\xaf\x5f\xe0\x6b\x8c\x25\x0c\x05\x46\x8f\xa1\xab\xaf\x79\x42\x1e\x7f\x31\x40\x67\xbf\xf9\xb3\xe7\x4f\xdf\x3c\x3d\x9f\xd7\x27\x27\x41\x8d\x0f\x16\xe7\x0b\xbc\x3e\x83\x12\x8f\x60\x8a\x9f\x82\x0c\xac\x22\x02\xcd\x27\xc2\xfb\x82\x25\xb9\xa3\xcd\x2e\xad\x92\x6d\x1a\xcb\x4f\xf4\xd5\x27\x98\x41\xfc\x8b\x53\x7e\x7f\xe6\x2d\x44\x1a\x5f\x02\xfa\xe6\xaf\xd6\x49\x9c\xae\xca\xb8\xe2\x32\xcd\x1d\x88\x21\xb0\x18\x5c\x06\x68\x14\xbf\xa6\x8b\x85\xa0\xd9\xe7\x57\xac\x32\xe1\xb7\xfa\x1a\x05\x5a\x80\x33\x2e\xa0\xf3\xcc\x78\x26\xe5\x0c\xbc\x2e\xc2\xf9\x13\xd1\xe4\xa9\xc1\xc5\x51\x45\xe8\xd2\x2a\x0a\x90\xd0\x53\xd6\x14\x84\xd7\x04\xca\xfc\xb5\xb9\xb3\xdb\x82\x7e\x7c\xda\xf9\xbe\x2a\x54\x7b\xc5\x59\x4f\xa3\xc6\x92\xc4\xf2\xb5\xb6\x13\xc9\xcd\xe6\x63\x81\x0e\xf8\xde\x82\xc6\xf8\xcb\x17\x9c\x20\xc3\x53\x99\x32\x16\x7b\xf1\x7b\x25\x57\xe4\xc1\xf6\xbc\x92\xbf\x57\x1f\x93\xd1\x64\xfa\x94\x5c\x9a\xa9\xff\x92\xaf\x61\x65\x61\x91\x55\xce\x3b\xbc\xc0\x4d\x8c\x17\x7a\x9c\x74\xcd\xfb\x9c\xde\xe3\xac\xd3\x17\x57\x74\xbb\x72\x35\xad\xd5\x01\x76\xd6\x8d\x98\x79\x08\x4d\xcf\x38\x13\xb8\xdf\x48\x4f\x1c\xf8\xd4\xd7\xb9\x88\x7c\xbf\x23\x52\x75\x9c\x11\xd4\xd0\xd1\xa3\x9b\xfc\xf7\x51\xc8\x60\x5b\x95\xb8\x13\x9f\x13\xc5\x1a\xaa\xf8\x80\x85\x12\x70\x62\x9b\x6f\xa3\x2c\xd9\xf6\x66\x77\x26\xca\xd1\x89\x85\x06\xe4\xba\xe7\xd9\x5f\xda\x8f\x34\xde\xff\x46\x2b\x09\x80\xc4\x38\x6b\x18\x73\xfc\x5b\xe0\x79\xff\x1f\xea\x60\x92\x95\x71\x51\x7d\x49\x07\x51\x48\xd5\x1c\x6e\x18\xbb\xcb\x67\x54\xff\xc3\xde\x76\xce\x4f\x5b\x0f\x3a\xcd\x6b\xb5\x62\xb4\xae\x0e\x5a\x99\xfd\xff\xd1\xa8\xc3\x1f\xed\x83\x5e\xd7\xc7\x46\x01\xc3\x8c\xa6\xb2\x90\x6d\x60\x1b\x03\x2e\x31\xcf\xc5\x46\x93\x14\x95\x2c\x59\x00\x7d\x1f\x0e\x03\xc5\xf5\x65\xd6\x0a\xd9\x99\x30\x5e\x62\xc8\x15\x54\xbb\xd9\x1d\xf7\x29\x5e\x91\x51\x7c\x65\xee\xde\x10\xa8\x1a\xfe\xad\xa2\x4f\x85\xc7\x04\xc2\x6b\xd5\xd1\xca\x86\xe3\x2a\x9f\xbb\x99\xc3\xc9\x34\x45\x54\xad\x61\xb0\xb1\x0a\x2a\xdc\x48\x1b\x77\xdf\xe6\x1f\x5b\xe3\x88\x49\x33\xa6\x25\x7d\x1b\xa0\xdc\xee\x38\xaf\xa6\x26\xac\x59\x3b\x44\x93\x4e\x4d\xca\xf6\x73\x5c\x46\xed\x76\x39\x6e\x85\x68\xa5\xb4\x75\x87\x42\x5e\x6b\x5d\x06\x06\xa7\x82\x31\xf2\x6d\x35\x43\x43\x12\xb6\x02\x07\xa1\xaa\xef\x44\x8f\x2a\xd5\x6a\xf4\x8a\xc3\x48\x02\x62\xff\xf7\xb0\xa2\x8a\x32\xca\x38\x8e\x1c\xc4\x3a\x7a\xbc\x26\xed\x84\x25\x7d\x34\xf0\x32\xcb\x9a\x24\x4b\x26\x10\xe0\x65\x45\x91\x00\xc9\x79\x61\xd0\xa3\x75\xae\xeb\x37\x96\x56\x70\x70\x80\x34\x1d\x1f\x6f\xfa\x4b\x75\xf2\xac\x1e\x1f\xdf\x59\x25\x9f\x56\x73\xff\x42\x39\xe3\xc6\xec\xb7\x8b\xf4\x2d\xc0\x94\x6c\x6e\xdc\x08\x74\x8c\x21\x63\x1c\xee\xf6\x35\x74\xfb\x8b\x47\x13\x20\x9f\x8f\x9e\x9c\x79\x01\x79\x2d\x39\x8a\x48\xa3\x84\xa4\xa9\xea\xc4\x9d\x6d\xef\x1c\x82\x38\x61\x4d\x90\xc4\x70\xe4\x72\x6c\x25\x48\xd8\x67\x0a\x11\xb4\x08\x50\xfc\x20\x31\x51\x1d\x76\xb3\xd4\x6b\x13\x2e\x4b\x0e\xef\xc2\xc2\xdc\x91\xb9\x84\xad\xad\x58\xe0\x49\xb7\x1c\x4f\x3f\x16\xa7\x35\xc1\x6c\xe6\xb0\xff\x16\x68\xd6\x44\x17\x53\x3c\x5c\x24\x7b\xe5\xa6\x6e\x95\x22\x4c\x69\xed\x6d\xac\x26\xdc\x48\xc1\x3e\x19\x73\xda\x98\x10\x45\x59\x18\xf2\x60\x0c\xbd\xb3\xa2\xdf\xeb\xe2\x68\xb7\x8b\x96\x91\x07\xf5\x85\xc6\x01\x97\x8e\x7b\xf5\x80\x3a\x72\x7e\xcc\xc9\xda\xd2\x3b\x52\x82\xf0\x71\x8f\x71\xd2\x41\x5f\x5a\xd8\x17\x4b\x47\xbf\xbd\xe5\x13\x96\xb5\x5c\x9e\x4c\xc4\x95\x44\x8d\xac\xb8\x74\xe3\x9b\x5e\x91\x10\x75\x09\xc0\xeb\x4f\xce\xe4\xb2\x47\x01\x7e\x85\xf8\xd6\x09\xfd\x41\x69\x2b\x01\xad\x7c\xa7\x20\xfa\xea\xa1\x48\xcb\x46\xca\xdf\x8e\xe2\x3f\x30\x32\xd3\x25\xd9\x8d\x8e\x17\xd2\xf6\x4a\xa2\x13\x42\xd8\x59\xa4\x06\x49\x9a\x45\x55\x99\x7c\x02\x95\xca\xcb\x4f\xa1\xf7\x17\x3b\xc0\x7b\x46\x08\x64\x3a\xd2\xe1\x7f\x00\xb0\xc5\x40\x41\x2e\x6a\x7b\x53\x5b\xc9\x85\xdb\x22\xb5\xb4\x48\x8d\xf3\x75\x8a\x99\xb0\x0a\xe5\x49\x14\x29\x40\x85\x8d\x92\x36\x74\x42\x7c\x55\xa1\x42\x21\xd2\xc8\x67\x79\xb6\x9b\xee\xc8\xcd\x08\x96\x00\xf3\x6e\xea\x6c\x33\x84\xfd\x12\x58\x54\x82\x8c\x1c\xd1\x33\xeb\xb0\x22\x01\x35\x26\x16\xe5\xa1\x0c\xc4\x7a\x2e\xd0\x05\x3b\x11\x3b\x15\x43\x95\xb3\x89\x47\x73\xdd\xdc\xc9\xa4\x3d\x50\xee\x63\x24\xfe\xa8\xd0\x61\x70\x3c\xcd\x4d\x7f\x22\xac\xea\x9d\xf6\xcb\xd1\x16\x47\x9e\x6d\xf8\x02\xbd\xe0\x10\x06\x2f\xae\xa3\xd4\x0b\x1c\xaa\x09\x64\x99\x94\x54\xe8\x39\x03\x74\xfb\xb7\x18\x8a\xfc\x54\xa4\xfc\x00\x55\xec\xcd\x97\x3e\x56\x4f\x51\x86\xf8\xf7\x19\x2b\xf1\xf0\xd6\x60\x16\x0e\x2d\xa0\x11\xd9\x6b\xc2\xbf\xe8\xfd\xae\x52\xcc\x39\xf4\xc8\x56\x9f\x7c\x53\xb5\x22\xce\xdb\x34\x8e\xc3\xf0\x04\x0e\xe9\x63\x45\x97\xa5\xce\xb6\x79\x33\xf8\xa4\x20\xd5\xe3\x83\x29\xad\x89\xd4\xc4\x2e\x13\xda\x1b\x31\xcc\x88\x15\xea\x43\x74\xfa\x31\x3d\xff\xaa\x72\xe2\x31\x91\x61\xa3\xaf\x22\xfe\xb5\xe3\xf5\x91\xa3\x7b\x30\xf4\x4e\xbd\xa1\x32\x6a\xb6\x2a\xfa\xc3\xd2\x8e\xbc\xd0\x64\x83\x8d\xc5\x9a\xf0\x7e\xda\x72\x12\x68\x48\xd8\x8d\x07\xa9\x5a\xb0\x6b\xfd\xad\x6a\x9d\x8e\xb5\x58\x30\x34\xee\x0e\x88\xa8\x68\x68\xc9\x1c\x68\x11\x98\x57\xca\x58\x26\x41\x61\x17\x96\x2c\xed\xce\xb7\x95\x89\x34\xe9\x2e\x0e\xae\x5b\x13\xf2\xc2\x0d\xd6\xdc\x84\xbf\x10\x91\x6c\x0c\xa0\x72\xf4\x52\xce\x55\x18\x0c\xdc\x23\x65\xa0\xd3\x3f\x47\x3a\x28\x41\xd4\xc4\xa7\xa1\x31\x65\x68\x52\x50\x06\x9c\x4a\x0a\x99\x07\x0a\x34\xad\x99\x07\x45\x39\x5d\x73\xaf\x4c\x60\x19\x9c\x81\x3d\x67\xcf\xc3\xb3\xba\x56\x16\x3e\x8c\xd1\xa3\x52\xce\x59\xc9\xef\xbe\xaf\x5a\xc1\x44\xa7\x9d\x61\xd3\x4c\x64\xb2\x3a\x10\xf7\x58\x58\x8c\x84\x9d\x1b\x19\xb0\x99\xed\xd6\x77\xdf\xe4\xf2\x51\x26\x38\x05\x8e\x33\xd1\x21\x42\xdc\xc0\x10\x95\x68\xac\x30\x50\x7e\x69\x03\x88\xa9\x38\xd8\x6b\xc4\x84\xcc\x03\x46\xe2\xc2\x1d\xcd\x5e\x96\xe8\x17\xe9\x7f\x85\xca\x41\xba\x56\x8f\x00\xf5\xa0\xba\x30\x6c\x2c\x3a\x64\x36\xf3\xab\x16\x47\xde\xa4\x2a\x47\xe3\x44\x7d\xed\x44\x58\x33\xd9\xd0\xf1\xc4\xce\x20\x0e\x42\x57\x14\x9e\xbe\x6a\x1e\x52\x7c\x74\x9b\x6d\xb1\x5e\x41\x4f\xd8\xe6\x96\x07\xf0\x4c\x33\x5e\xbc\x63\xb0\x67\x4a\xe3\xa0\x93\x5f\x57\x26\x06\x56\x6c\xa5\xc1\xa6\x70\x54\x34\xee\x6b\x0e\x87\xea\xab\x67\xfa\x09\x0d\x79\xab\xac\x4e\x30\xb2\xbd\xae\xd7\x24\x86\x6f\x62\x9c\x35\xbe\x08\xfa\x65\xe8\x5b\xbd\x04\xe4\xa8\x63\x5b\x35\xe1\xdf\xdd\x00\x89\x6e\xbc\xc4\x60\x6f\xce\xfb\x18\x4b\xbd\xc9\x43\x8f\xaf\x3c\x2d\x29\xe3\x23\x75\xe9\x09\x9b\x63\x09\x95\x01\xa5\x7e\xfa\x94\x84\x46\x8f\x64\x47\x4f\xb3\x6e\x78\xf4\xe5\x59\x6c\x5c\x8f\xc9\x79\xeb\xa4\x25\x76\x4f\xda\x49\xad\x7f\xcb\xfb\x37\x37\xe4\x8b\x91\x4c\x74\x26\x35\xbf\x8a\x9a\xfd\xc8\x62\x9b\x98\x6e\x22\xc9\xbc\x25\xbf\xdc\x00\xe4\x27\xcc\x47\x7a\x65\x02\x40\x64\x7c\x5c\x7b\xe8\xb0\x36\x71\x8f\x52\x5f\x56\xb6\x2b\x9f\xc9\x33\x61\x85\x4d\xee\xd0\x01\xe4\x05\x0f\x91\x08\x5c\xaa\xc7\x28\x39\xe8\x0a\xe8\xb4\x5b\x9f\x98\x3c\x25\xe4\x8e\x1f\xb7\x1f\x37\x1f\x92\xc8\x51\x2a\xca\x4e\x76\x30\xf6\x89\x16\xd0\x1d\x8d\x82\x73\x4a\x6c\x17\x90\x13\xf3\x20\x73\xec\xc7\x73\x18\xd1\xac\xd4\xe7\x1b\xe6\x74\xac\x44\xce\x02\xdf\x59\x26\x2b\x74\x6e\x92\xb5\x84\xc3\x0c\x73\xa2\xa9\x13\xb5\x78\x21\x40\x0e\x2f\x1b\x0c\xf6\x25\x91\x9b\xd6\xb6\x21\x29\xb2\xb5\x6f\xcc\x6e\x09\xec\x54\x92\x1d\x51\xb2\xe3\x51\x2e\x90\x8d\x33\x7c\x46\x8b\xb2\x0a\x8e\x77\xd4\x87\x16\x38\x97\x99\x15\xbd\x7a\xa0\xc5\x2f\xef\x0b\xa4\x9b\x7a\x80\x43\x0f\x64\xa3\x19\xba\x2c\x38\xe9\xd8\x43\xff\xb9\x8b\x32\x0c\x16\x12\xcf\x2b\x47\xc2\xce\xe5\x73\x47\xa1\x03\x28\xd9\x3f\x84\x93\x3b\xcf\xd5\xec\xb0\xda\xc2\x49\xf5\xe8\x3e\x68\x8d\x26\x50\xf4\xe9\x25\x39\x3c\x97\xf8\x4b\x5b\x67\xac\xc1\x01\xc9\x16\x82\xc3\x70\x18\x05\x08\x18\xc7\xc7\xdf\x23\x1b\xc9\x30\x82\xa7\x41\x14\xcf\x5d\xc1\x15\xc0\x11\x57\x40\x66\x9a\x5c\x67\x4f\x5d\x08\x5a\xdf\x36\xb5\x90\xe1\x24\x51\xeb\xc6\x66\x93\x7b\x64\xf1\xbf\x26\xfd\xe2\x98\xb4\x28\x85\x18\xa4\xc7\xc7\xb4\xcb\x2c\x5d\x4a\x21\x4b\x99\x70\x8a\xc8\x7c\x2f\x1c\x96\xfd\x90\x6f\x9e\x70\xc2\x62\xc1\x44\x29\x29\x66\x8d\xca\x5d\x60\x6e\x57\x14\x74\x4c\xb3\x29\xdb\xb3\xab\xe9\x15\x9b\x38\xe1\xe1\xe1\xd5\x02\x03\xc7\x50\x7a\xf2\xc0\x31\x2e\xc4\xa4\x34\x30\xd9\x30\xfe\x40\x43\xfc\x4a\xe4\x96\x3d\x48\xbe\x08\xf3\xc0\x98\x8c\xde\x28\x80\x82\xe2\xf7\x34\x8b\x6b\x87\x0b\xec\xf0\x7d\x2a\x41\x76\x2a\x8d\x3c\x9f\x3f\x24\xcf\x83\x80\x06\xb2\x7f\xba\x40\x15\x80\x89\x73\x22\x4a\x0b\x2a\x97\xf0\xcd\x30\x3f\x24\xf0\x0f\x97\xf3\x27\x28\xc7\x2e\xf1\xb4\xb7\xc9\x39\x0b\x3d\x1d\xa5\x91\x82\xd6\xa9\x1b\xd0\xfb\x01\x55\x04\xa6\x95\x58\xa9\x28\xfa\x6d\x65\xf1\x9d\x19\x0e\x34\x15\x38\x3c\x09\xf1\xba\x98\x8d\x46\xb1\xdf\x00\xd5\x29\x00\xb3\xa9\x74\x66\xce\x21\xe0\x0d\x8e\xc7\x79\x39\x0e\xcb\xb0\xb4\x39\xf2\x44\xb2\x2b\x71\x5b\x1c\xb3\xc6\x67\xe1\xae\x9d\xb4\x8b\xce\x13\xe0\x3a\x15\xef\x0d\x7c\xc2\xae\x4f\xa8\xcb\x9d\xad\xbd\x43\x5c\xa5\xe1\xa0\xb4\x4d\x09\x44\x69\xcb\x2e\xd2\x33\x79\xca\x6c\x4c\x50\x3a\x95\x39\xaf\xa6\x25\x06\x27\xd3\xab\xc0\xe1\xb6\x0e\xcd\x2e\x80\xd7\xb4\xc4\x50\x61\x4e\x6d\x36\x33\xa4\xa1\x4e\xe1\x12\x75\xba\x0a\xdb\x6c\x65\x3c\x8a\xc4\x97\xb0\x2b\xae\x4c\x7c\x94\x5c\xae\xe6\x57\x18\x15\x05\x73\x52\x0e\x60\xd7\x9f\x4c\x08\xfc\xf5\xd1\x6b\x8e\x82\x2d\xc5\xd1\xb7\x90\x6f\xde\x42\xbe\x1a\xf5\xb8\x60\x9f\x07\xd6\xfe\x8f\x68\xdb\x97\x68\x2e\x85\x3c\x68\xd3\x7c\xc9\x51\xf0\xb5\xc4\x99\xdb\x12\x67\xa6\x69\x95\x96\xf3\x4a\x46\x0e\x6b\xce\x6b\x97\xf5\x64\xd4\xd5\x0c\x34\x07\x21\x19\x13\xd1\xd0\x59\xc0\x77\x52\x25\x0c\xa6\xc0\x37\xbd\x39\x90\x01\x6f\xb4\x6c\xf0\x3b\xf2\x4d\x09\x28\xaf\x64\x1c\xe2\x93\x2c\x63\x85\x15\xca\x38\xeb\xb2\xcc\x30\x7e\x50\x84\x20\xba\x43\x23\x64\x62\xdd\xb5\x7c\x11\x18\xa6\xbb\x79\x02\x1c\xcb\xac\x65\x48\x4c\xf9\x17\x5c\x6e\x1c\xc7\x15\x19\x6e\xfc\x3f\xb0\xea\xc6\x9b\x0a\xef\xc4\x52\xa7\x6d\xc6\x0e\x68\x6e\x23\x6b\xb3\xed\xc4\x6c\x74\x9e\xfa\x69\x10\x66\x3a\xdc\x91\xd8\xea\xa9\x47\x63\x19\x2d\xc5\x1f\x50\xc2\xfe\x1e\xdd\xfa\xf7\x3b\x78\x1d\x53\x1a\xfd\xd0\xfb\xeb\x8b\x37\x1e\x85\x9c\x64\x9f\x73\x05\x04\x22\x2a\xef\xb2\x65\x38\x98\x08\x15\xae\x14\xae\xbc\xea\xaa\xc8\x6f\x4a\x2f\x24\xab\xd2\xb6\xe3\xc1\x4d\x11\x6d\xdb\xc6\x54\xff\xd3\x8c\x5d\xaa\x2e\x37\x5b\x97\x4e\x3b\xa3\xb4\x41\x26\x2e\xfe\x21\x05\x51\x80\xea\xa8\x71\xd0\xb0\x9b\xd3\xae\x69\x22\x0a\x3f\x8e\xa6\x4f\x57\x2e\xaa\xb6\xd2\xbb\xf1\x4d\xed\xd1\xdf\xeb\xbc\x11\x56\x46\x7f\x23\x0a\xc6\xce\xf3\xc6\x9a\xcf\xe8\x59\xf9\x68\xc7\xd1\xd6\xe3\x04\x7c\x8d\x14\xa3\x7f\x15\x3f\x98\x38\xab\x35\x97\x54\x55\x77\x36\x1f\xcc\xe1\xa9\x92\x61\x65\x9c\x5c\x9d\x2c\xbf\x7c\x4c\x2a\xa6\x92\x83\x66\xcd\x22\x41\x3d\x96\xca\x38\xe0\xde\xf7\x66\x30\x70\xfa\x3d\x3d\x0c\x0a\x59\x17\x14\x2a\x37\xe3\x52\x10\x72\x53\xbb\xcc\x6d\xac\x65\x9f\x4c\x0b\xed\x07\x3d\x86\xfb\x2d\x8f\x42\x26\x30\x80\x21\x8c\x26\xd8\x88\x45\x2a\x38\x82\x65\x91\x06\xf5\xc1\x58\x4d\x0e\xca\x57\x95\xf8\xb1\x12\x3f\x57\xe2\x51\x25\x4f\xa3\x74\x7b\x15\x9d\xfb\xf3\xb7\xc1\xe2\xf1\x39\x1a\x2d\x7c\x0d\x0f\x73\x0c\x4c\x5d\xdd\x9d\x97\x8f\xd1\xa6\x81\x5f\x06\xa7\xe2\x3d\x59\x44\x54\xf9\xb6\x2e\x30\xda\x79\x7d\x91\x57\x55\xbe\xa9\xd3\x78\x8d\x19\x29\xc5\x2f\xf4\x3a\x43\xb6\x98\xa8\xad\x3f\x1b\x9c\x2c\xe7\x31\xb0\x71\x23\x34\xc4\xf8\x09\x5f\x6f\xa2\xe2\x32\xc9\x4e\xc5\x3f\x1a\xfb\x90\xb7\xbe\x37\xbc\x19\x7a\x01\xda\x40\x3c\x52\xa6\x21\xbf\xf6\xbc\x9e\x0d\xb6\xb7\xc1\x3c\x3a\x79\xff\x9f\x8b\xa1\x2e\xf7\x37\xbb\xdc\x7c\x78\xb2\x08\xa4\x2a\xae\x0a\xfc\xb5\x92\xf7\x5f\x7e\xff\xfc\x57\x10\x30\xd3\x7c\xf9\x0e\x44\xc6\x1f\xe0\xc9\x36\x2f\x13\x32\x9c\xf0\xa2\x8b\x32\x4f\x01\x41\x79\xe2\x3a\x29\x93\x8b\x24\x85\x61\x87\xde\x55\xb2\x5a\xc5\x99\x47\xb1\xd3\x30\xf3\xaa\xf9\xf8\xef\xf0\x31\xe0\x40\x60\xd2\x55\xec\xee\x70\x2c\xd6\x00\x6d\x3f\x53\xf8\xf7\xf0\xb3\xf1\x78\x2f\xfe\x59\xc9\xb9\xf7\x26\xc7\x58\xdd\x3f\x52\x50\x78\xe1\x7d\x49\x13\x05\x17\x18\xe2\xc4\x5b\x88\x38\x83\x22\x3f\xc7\x17\xef\xd0\xc1\xd4\xfb\x1e\xfe\x7d\x9b\xbf\xc7\x00\xe1\xa5\xb7\x68\xe4\xc4\xaa\x49\x87\xa2\x72\x3b\x9b\x4c\x43\xea\x0c\x8a\x42\xd7\x3c\xad\x10\x6b\x54\xf9\x4f\x00\xd2\x8a\xa9\x1b\x56\xca\x6e\x70\x82\x7c\x6f\x85\xc7\x0c\x59\x97\x87\xa1\x4c\x46\x71\x06\x1c\xcb\x30\x13\xed\x16\x34\xaf\xdd\x08\x61\x59\xfb\x14\x0e\xad\x23\x85\x97\xa9\xf4\x4f\xb7\x18\xab\x1d\x59\x6e\x35\x69\x1e\x9f\x3f\x3d\x20\x54\x35\x55\x17\xed\x74\x37\xda\x10\x7e\x4c\xd9\x53\xec\xd4\x6d\x3a\x9f\x21\x1e\xa1\x60\x0c\x2d\x8e\x13\x4f\x11\xb3\xa2\x85\xb4\xdc\x89\xf3\x74\x65\x7a\x22\x30\x4f\x17\x07\x94\x57\xcf\x44\x35\xa3\x2f\x80\x19\xa0\x01\xb0\xf7\xa1\xdf\x2a\x25\x31\x95\x0d\xc7\xe6\x77\x5f\x00\xfb\x80\x07\x09\x0f\x37\x2b\x52\x28\xd3\xb8\x06\xc2\x7f\x21\x37\x89\xbe\x65\xf8\xb9\xf0\x41\x0a\xb6\xdb\x1f\x24\x56\x94\xdd\x56\x65\x40\x55\x43\x9e\xe3\xc2\x9a\xe3\x40\x39\x8b\xa0\x24\x75\x70\x6a\x2a\xab\x95\xce\x40\xbc\x9e\xa7\x3d\x33\x51\xcd\xd4\x74\x61\x7a\x38\xac\x2b\x70\x0c\xbd\x2d\xc2\xba\x2c\xdb\xc1\xdb\x3e\x70\xa4\xda\x92\xb8\xe4\xfd\x1e\xb9\x2b\x9d\x3e\x53\xc7\x85\xd7\xb1\xd4\x7e\x24\x21\x32\x69\x1c\x50\x92\xb3\x92\x78\xa6\x68\x9e\x01\xff\xb4\x30\x80\x88\x77\x78\xe8\xd2\x08\x8e\x91\x49\xa2\x3e\x60\x8b\x16\x1a\xa2\xce\x47\x65\xbe\x03\x34\x8d\x8f\x7a\x13\xc6\x96\x57\xf9\x4d\x0f\xf6\x06\x00\xa6\x41\xd1\x79\x19\x60\x8f\x3e\x2b\x0b\x55\x26\xd0\x19\x2c\x7b\x48\x65\x37\x57\x65\x3c\x53\x16\xfb\xd8\xb0\xaf\x28\x20\x36\xe0\x1f\xa0\x86\x99\x6a\x65\xa6\x29\x83\xfa\x50\xdf\xf2\xb7\xfb\x96\x21\x2f\x8c\xdc\xe4\x98\x23\xd4\xdf\xce\xea\xa3\xf1\x90\x3e\xfe\xfe\x99\xa4\x6b\x55\xd8\xe4\xf4\xf1\x58\xed\xe8\x4d\xbc\x30\xa3\x44\x4a\x50\xef\x77\x94\x4b\x30\xbc\x5f\x02\x9e\xdd\x64\x14\xaa\x0f\xbd\xb3\xd6\x49\x9a\x7e\xaf\xda\x1a\x38\x48\x14\xee\xd2\x24\x8b\xbf\x32\x77\x79\x53\x8c\xd2\x1e\xf0\x05\x90\xad\x8c\xfc\xbd\x6e\x92\x15\x70\x79\x78\xf5\x9e\x13\x12\xe1\x55\x9e\x6f\x28\xbe\x12\x74\xe0\x15\x85\xee\xba\xf7\xd6\x69\x1e\x55\x9e\x65\xd3\x05\xef\x5e\xe2\xb3\x99\xa7\xaf\x00\xb6\x09\x24\xf8\x06\x43\x6d\xdc\xa5\xed\xcc\xf7\x18\x32\xbb\xc9\xe2\x14\xb7\x62\xf7\x3a\xc6\xb8\x0c\x5f\x4e\x84\x6d\x69\xe7\xb8\xc9\x02\x0a\x5a\x48\xa5\xc8\x72\x94\x61\x97\x3a\x4c\x22\xb9\xef\xdc\x4b\x20\x08\x3b\x91\x06\x28\x10\xd1\x8b\x26\x1f\x9a\x75\x9b\x2e\x38\xf9\x99\x46\xe5\x65\x93\xde\xa9\x24\xf9\xa1\x54\x79\x9d\x60\x6b\x24\x2a\x17\x54\x1e\xee\xd0\x1a\x19\x05\x09\x63\x52\x6e\xf9\x3b\xc9\x88\x3e\xfc\x9b\x12\xc0\x59\x68\x2b\x24\xe0\xbe\xc9\x62\x38\x09\x1e\xe7\xf3\x27\x8b\x21\x25\x73\xa2\x89\xf3\x9b\x9d\x84\x2a\x1e\x9d\x4d\x12\x55\x56\xca\xcd\x16\xb1\xae\x4e\x31\x89\x95\x27\xe5\x77\xd1\x77\x3e\x45\xb1\xd6\x2f\x30\xee\x95\x1a\x17\x43\x10\x4f\x48\x31\x94\xde\xf6\xd6\x73\x22\x24\x60\x16\x72\xd2\x73\xbd\xe6\x9c\x24\x9e\x8a\x8f\x4d\x36\xbd\x4d\x88\x63\x4c\x6f\x8f\x66\x73\xd9\xca\xa3\xf8\xba\x18\xa4\x0f\x66\xe5\x2a\x2e\x28\xf0\x42\xd9\xa4\xcc\x2a\x69\x78\xa5\x49\x99\x05\xd3\x44\x33\x1a\x50\xe4\x2d\xfa\xb0\x50\xf6\x08\x4b\xb4\x47\x20\x30\xeb\x01\x93\xc3\xeb\xde\x28\x43\x3f\xb8\xe2\x0a\x3e\x3e\x66\xdd\x5b\x4b\x1d\x35\x4b\x3d\x46\x49\x1b\xd6\x82\x83\x57\x45\xbc\x7d\x33\x72\x13\x00\x6c\x8e\x29\x64\xd4\x4a\xd0\xc1\xd4\xdf\xb9\xd0\xdf\x2b\x8a\x8b\xec\xa9\x14\x43\x05\x50\x4c\x69\xad\x72\xa4\x7c\x58\xc7\xac\x36\x84\x55\x82\x99\x44\xf5\xcc\x0c\xf5\x5e\x98\x37\x2f\x42\x24\x43\x5a\xeb\x67\xf9\x66\x0b\x5c\xd6\x8a\x56\x68\xe6\xff\x68\x05\x60\xaa\xdc\xa4\x33\x4e\x49\x3c\xf6\xc2\x58\x4e\x7b\xe0\x56\xfb\x33\x10\x29\x59\x1c\xba\xc7\x74\x21\x95\xe5\xac\xe4\x38\x49\x1c\x5e\x82\xce\x26\x60\xc6\xeb\x1a\x67\x2c\xac\xac\x1d\xd7\x6c\x10\xdf\xd3\x2a\xa3\x87\xf8\x15\xca\x34\x61\x11\x8d\x00\xf9\x54\xd6\x2c\xa4\xb0\x23\x7e\xaa\x74\xbe\x2d\x3a\x6f\xdf\x8d\x28\x37\x10\x70\x32\xbb\xd1\x26\xc9\x7e\xa6\x9b\x08\x6f\xa2\x5b\xbe\x69\x9e\x5b\x4f\xf5\x77\x32\xc5\xb1\xa8\x3a\xf4\xb3\xc4\xfe\x26\x17\xd6\x57\x11\xaa\xfc\x40\x42\x8a\xda\x31\xfb\x74\x0c\xdb\xd7\x8a\x17\xf8\xb1\x37\x1d\x4a\xec\x14\xfb\x37\xa7\xfb\xc0\xbc\xf2\x5e\xc7\x38\xac\xa8\xa9\xc8\x16\x64\xcc\xb0\x23\x90\xb2\xa7\x6d\xf0\xbe\x3d\x6f\x28\x4f\x50\x78\x9f\x02\x68\x05\x85\xa8\x42\xf8\x8f\x58\x29\x47\x2f\x09\x1f\xd1\xa5\x74\x7b\x4e\xcf\x00\xab\xf2\x3b\x0f\xa9\xca\xeb\xe4\x7d\xac\xc9\x52\xbc\xf1\x42\x9c\xd7\xdd\x68\x9b\xdc\xc6\x14\x96\x70\x88\xe8\x44\x7f\x90\xd8\x35\xe3\x94\x12\xec\xa7\x33\xce\xc2\x14\xa6\xf6\x29\x4e\xdb\xdd\xe5\x1f\x3a\x95\x41\xa3\xa7\x9e\x7d\x1b\x55\x57\xb8\x46\x3e\xec\x3f\xc0\x95\x27\x78\xe4\x32\x0e\x82\xa1\x5f\x70\x66\x03\xc4\x64\x61\x65\xa5\x67\xe9\x26\x66\x90\x78\x5e\xe2\x17\x33\x60\x0d\x28\xe5\x4f\xa8\x53\xfe\x78\xc1\xec\xb3\x50\xe5\x9f\x22\x03\xdd\x09\xc8\x22\x91\x56\x46\x7f\x76\x96\x4f\xf3\xa1\x7c\x12\x78\x2c\x71\xa9\x93\x47\x3f\x1a\x36\xfc\xd1\xf0\x9f\x15\x65\x29\x18\x13\x1e\x80\xed\x6d\xaa\xd6\x85\x4f\x1a\xae\x7e\xab\xb2\x13\xb9\x1f\xe9\xda\x07\xdd\x0f\x54\x7f\xb9\xfc\xd0\xfb\x99\x13\x65\xf1\x77\x41\x68\x77\xa4\xb7\xee\xe6\xe9\xa0\xd3\xf3\x87\xeb\x6e\xb8\x3d\x33\xaf\x65\x6b\xad\xb0\xa4\xb4\xe7\x2e\x1e\x71\x98\x4e\xaa\x29\xd4\x77\xcc\x82\x08\xcd\x73\x46\x96\x62\xef\x22\xbf\x05\xc0\x82\xee\x01\xca\xe5\xde\x9c\xa8\x58\x3a\x56\x27\x55\x11\x4f\x71\xa1\x40\x5e\xc7\x67\x18\xf6\x5f\xc5\x93\x20\x3e\x22\x61\x5c\x4c\x7a\x4e\x78\x6d\xbd\x55\xf1\x39\x69\x4f\xa1\xc5\xa6\xd9\x35\x89\xd1\x4a\x25\xd3\x82\x68\x73\x4f\xbf\x7e\x8c\xd3\x04\x85\xf0\xba\x4e\x48\xd3\xd3\x54\x93\xd8\x48\x3c\x01\xac\x36\xd6\x6c\x71\x32\xd4\x00\x08\xa8\x2e\xea\x03\x39\x54\x7e\x06\xb4\x65\x9a\xc9\x4d\x2d\x95\x49\x04\x92\xd6\x5f\xd1\xcf\xcc\x4e\x3a\x9b\xc9\x1d\x73\x90\xa2\x91\x75\x80\xd2\xc0\x9b\x57\x95\x84\x7f\xa8\xc5\xf0\xbe\x60\x27\xbc\x23\xfa\xcb\x0d\xcb\x4f\xc6\x9f\x1c\x31\xe2\xc3\x2b\x4e\xb1\x86\x97\xa7\x67\x5e\x40\xb3\xec\xa9\xf4\x60\x9e\x91\x88\x42\x92\xd4\x8f\x06\xc9\x06\xa7\x23\xc2\x3e\x6b\xbd\xd5\x9b\x1c\x0f\xb0\x5d\xec\x88\xd6\x7b\xd0\x03\x54\xb2\x39\x6e\x7e\x75\xed\x3c\x6c\x54\x74\xfa\x7b\x51\x8d\x6e\x80\x6f\x88\xa1\xe3\x03\x78\x86\x4c\xd3\x11\x1e\x0b\x9e\x7d\xc1\x7f\xd9\xa5\x81\xcc\xa8\xd0\x01\x1c\x5d\x79\xcd\x2c\xbc\xaa\x54\x64\x42\xcc\xc3\x40\xb3\x85\x7e\x7d\x59\x33\xa3\x3b\xc7\xfb\xeb\xb6\x73\xc6\x13\xbb\x63\xa2\xc3\x0f\xf2\x1f\xc6\x39\xc9\xd0\xa6\xae\x11\x10\xa7\x56\x44\x78\x65\x2c\x58\xec\x9b\x4c\x71\xb1\xd2\x50\xf0\x5e\xe8\xa6\xaf\xb3\xb8\x8d\x4e\x66\x3e\x42\x52\x06\xd7\x8d\x39\xc6\x53\xb3\x8d\x8e\x8f\x7f\x51\x00\xdb\x55\x0d\xe0\x61\x6f\x79\x13\xa1\x39\xdd\x0f\x95\xe8\xca\x4a\xa5\x4e\x55\x09\x24\xcd\x5c\x87\x3d\x09\xe3\x1a\x9f\xbd\xe2\xf8\x98\xb6\xa9\x1e\xb0\x7e\x3f\x8b\x34\x47\xf6\xbf\xd8\xbd\x18\x2f\x33\x08\xc7\xed\x24\x78\x4a\x32\xd1\x6c\x1b\xa7\x9f\x53\x0f\x3b\xd3\xd5\x30\x3a\x5f\xab\x79\xf1\x29\xfa\x89\x4d\xbf\x66\x2d\x72\xa6\x1c\x2c\x75\x36\x3c\xbe\xe5\x1c\xf8\xb3\xd1\x78\xf2\xd8\xda\xc9\xac\x07\x1b\x3d\x9a\xc0\xfe\xf4\xc2\x8a\x84\x30\xcf\x3b\x98\x80\x5a\xa3\x04\x3e\xec\xb7\xda\x14\x9c\x6f\x5e\xb3\x73\x55\x00\xd4\x0f\x75\x84\xbe\x1e\x97\x37\x9c\x8c\xc7\x8f\xd1\x9d\x0b\x1b\x00\xec\x48\x76\xab\xdc\x35\xcc\xad\xad\xaf\x3c\x6f\x9a\x8d\x50\x10\x93\x13\xe1\x57\x67\x12\x83\xa2\x10\xb6\xa5\x8c\x90\x7c\x0e\x8a\x36\x34\xcd\xd1\xe2\x23\x36\xc1\xc3\xb3\x99\xd6\xf9\x01\x26\xbf\xed\x5a\x90\x71\x4b\x5a\x45\xc3\xc1\x84\x07\x45\x33\x4b\xbe\xee\x8c\x7c\xd4\x9c\xf6\x39\xcd\xc1\xa2\xe6\x14\xf9\x42\x79\xb6\xba\x3a\x57\x93\x81\x58\xe1\xd2\x6f\x89\xd8\x91\x52\xcf\x5d\xf2\x4d\xf3\xa2\x2f\x7f\xa5\xde\x82\x0d\xd0\xdf\x1b\xcd\x62\x92\xa1\xb0\x7b\xa2\x15\x8c\x3f\x57\x62\x1e\x6b\xb2\xca\xea\xc3\x05\x07\x53\xb1\xcf\x3b\x89\x7b\x79\xa5\x94\x98\x14\x92\x21\x1b\x6d\xad\x5b\x9d\x85\x90\x94\x90\x29\xeb\x1c\xff\xad\x9d\x6d\xed\x6b\x90\x84\x58\x5a\x68\x08\x50\xc1\xd1\x2e\x4c\x93\x7e\x00\x95\x10\x55\x08\x75\x9e\x4a\xa5\x5d\xd8\x16\x26\xcd\x17\xaf\x44\xc9\x61\xcc\xac\x07\x23\x56\xb6\xf6\x71\xa5\x40\x2d\x5b\x18\xc5\x7a\xc2\xc4\xd9\xb1\x71\xd7\xeb\xf4\x15\xd5\xf8\x3d\x15\x2b\xb5\xee\x0b\xd9\xa8\x58\xab\xc4\xe2\xb6\xbe\xab\x07\x45\x99\xc4\xa9\xba\xa3\xa4\x21\xee\xcd\x22\x37\xe8\x1d\x12\x9d\x2e\x34\xb1\x34\x69\x49\x71\xc7\x28\xc6\x06\x2f\x19\xf9\x84\x8a\x83\xe9\xda\x33\x99\x45\x8a\x87\x18\xae\x8b\x0f\x1b\xc3\xae\x39\x39\xf2\x33\x98\xa9\xa6\x1b\x80\x22\x9b\x65\x56\x4c\xf1\x10\xc5\x7c\xc5\x20\xb2\xb9\x53\x02\x55\xff\x13\x6d\x25\xb1\x81\x9c\xcc\xf4\xe1\xef\xc9\x13\xfa\x1d\x5b\x1e\xca\x7b\xf1\x93\xe5\x2f\xe0\xb7\xfa\x86\xb2\xb2\xcc\x33\x9d\x2a\x71\x99\xc9\xd3\xff\x7c\x32\x3e\xbd\x14\x5b\xb8\x3a\x9f\x9f\x2f\x1e\x9d\x8a\x35\x5e\x16\xb3\xf3\x0c\x1e\xaf\x32\x76\xae\xe4\xb8\x87\xb5\x4a\xcd\x90\x6c\xa2\xcb\xb8\x2e\x62\xa8\xac\x86\xb9\x8c\xc9\xd9\xf2\x2a\x7b\x20\xef\x62\xfd\x2e\xbe\xbb\x8c\xb3\xe0\x34\x71\xc3\xfc\x94\xda\x21\xa2\x37\xb2\x1b\x39\x30\xfa\x2a\xfe\x8d\x2a\xc8\x7a\x46\x5c\x76\xf7\xd1\xa1\xb3\x9a\xde\xe3\x36\x95\xe1\x9e\xcf\x68\x62\x65\xaa\xd5\x10\x61\xf4\x36\xb2\xc2\x80\xb0\x0a\x6f\xdf\x17\x35\xc8\x8a\x2c\x8b\x0b\xe9\x9c\x3d\x65\x14\x31\x71\xa0\x35\x7a\x09\xf0\x41\xa1\xce\x44\x81\x27\xdb\x57\x59\x5f\x64\x3a\xf8\x62\x95\x59\xae\xfe\xea\x94\x48\x9d\xe6\x0f\x8c\x71\x15\x1e\xb4\xb9\x83\x73\x79\x11\x6a\x93\x52\x71\xba\x82\x1e\x00\x1a\xfc\x86\x4e\x2a\x4f\xb6\x04\xcf\x7a\x7c\x2a\xee\x71\x10\x61\x45\x63\x11\x9c\xab\xb7\xf1\x29\x59\x67\xc2\x3b\x2f\xce\x33\x8c\xcf\x1d\x84\x3d\x45\xb3\xfe\xa2\x6c\x85\xc7\x24\x9a\x96\x58\xf6\x04\xb1\xd2\x76\x80\xee\xf0\x5a\xa7\x7d\x40\xf5\x2a\x5f\x07\x7e\x03\x5a\x0a\x04\x55\x24\xf3\x44\x69\x82\x17\x92\xb2\xa1\xc6\x3f\xfd\xf8\x35\xaa\x2b\x00\xbb\x10\x53\x36\xf4\x80\x36\xf6\xbc\xa9\x82\x3d\x6b\xf7\x58\xfb\x82\x3a\x1f\x3c\xd6\x7e\x1d\x57\x15\x06\xc7\xa0\xec\x41\xd6\x3d\x50\xc5\x68\x45\x78\x35\xa2\xcc\x40\x7a\x3e\x71\xdb\xe9\x58\x36\x2a\xaf\xd0\xab\x34\x4a\x32\x95\x0c\x2d\x46\x73\x22\x42\x35\xb1\xcd\x50\xe5\xbe\x81\x19\xf6\x8d\x62\x43\xd1\xbd\x32\x30\x32\xf6\x02\x71\x70\x99\x61\x74\x05\xb4\x9a\xce\x2c\x9d\x79\xa2\x12\x70\x1d\x5b\xa6\xf2\x4b\x98\x74\x20\xff\xfb\x46\x18\xbe\x6c\x9b\x4e\xb9\xda\xfb\xca\xf4\xcd\x62\xf6\x90\xfa\xde\x83\x14\xb0\x35\x50\x39\x43\xcb\x73\x20\xc9\x58\xdb\xd0\x9b\x7b\xc3\x6e\x48\x36\x4c\x4e\xee\x61\xfe\xaf\x85\x27\x12\x4e\xc9\xdd\x98\x4a\xa1\x41\xa3\xfa\x60\x60\xcc\xac\x30\x6c\x00\xad\x71\x33\xe0\x04\x07\x5c\x05\xa6\x99\x84\xaa\xab\xd0\x74\x87\x6a\x54\x7d\xf5\x30\x2c\xe3\x11\x45\x65\x3c\x52\xa1\x1a\x8f\x74\x8c\xc6\x23\x0c\x17\x7f\x04\x98\x0a\xd0\xc4\x11\xe7\x21\x38\xe2\x18\xf2\x47\x14\x9e\xf4\x68\x75\x91\xf2\x05\x05\x48\xc6\x68\x89\x7c\xb5\xdb\xf2\x2f\xb2\x32\x47\x26\xa6\xf2\x91\x0e\xa3\x7c\xd4\x84\x5c\x3e\x6a\xc2\x2c\x1f\x71\xd4\xc9\x23\xe5\xe2\xdd\xc4\x00\xa6\x7a\x75\x2c\x60\xbc\x80\xea\xe3\xa2\xc8\x01\x03\x37\x39\x67\xdd\xa4\x12\x5d\x8b\xd9\x6a\xd1\x1f\x0e\xbd\x73\x00\x32\xe6\xa3\x08\x5a\x3b\xe5\x68\x95\xe9\xc8\xe3\x2a\x00\x5c\xd5\x35\xb4\xb8\xc2\x01\x3e\x10\xa4\xae\x19\x31\xf2\x14\xcd\xa0\xd1\x00\x06\x5d\xba\x2e\xdc\x88\x6d\x6e\x6e\xff\x2b\x1d\x83\x90\x23\xde\xd3\xe1\xcd\x2e\xeb\x7c\xd2\xfa\x00\x43\x29\xea\x18\xf9\x4d\x12\x83\x0f\x87\x3a\xa4\x78\x13\x08\x21\xd0\xc6\x81\xaf\x9c\x80\x23\xed\x19\x9c\x59\xcd\x63\x1e\x47\x35\x79\xf8\xa0\xc2\x50\x64\xf8\x8c\x12\x8c\x33\x15\xdd\x64\xe2\x2e\x13\xd7\x99\xd4\xd1\xd9\x2f\x90\x82\xce\x4e\xc5\x2d\xfc\xfe\x69\x84\x91\xf4\x6e\xe0\xca\x9f\xcf\x8e\x17\xc1\x6f\x72\xfe\xf6\x78\xf1\xf8\x54\xbc\x21\x7a\x39\x7a\x3c\x03\x6a\x7f\x74\x5e\x2d\xf0\xfc\x1e\x51\x24\x46\x48\x28\x66\x8f\x4e\x2f\x37\xe2\x99\x22\xa9\xd1\x05\x80\x5c\x0d\xa2\x24\xfe\x3b\x29\xab\xbc\x40\xfa\x3b\x1a\x9e\xd0\xda\x95\x1c\x3f\x22\x25\x8a\x5c\x83\x84\x88\x91\x17\x43\x68\xf4\x3b\xf5\xf9\x5f\x5f\xbc\xa9\xbf\x7a\xf1\xf4\x39\x1e\xfe\xbf\xc3\x67\xe7\xa7\xe7\xa7\xa7\xe2\x05\xbd\x9e\x9f\xdf\x40\x45\x8b\x61\x48\x99\x8b\xe1\x05\x76\xe3\x74\xf6\xa7\x90\x73\x19\x87\x3e\x86\x8a\xa8\xe1\x7f\xff\x1f\x65\x57\xdb\xdc\xb6\x91\xa4\xbf\xdf\xaf\x30\x51\x29\x15\x10\x0e\x29\x4a\xf1\x5e\xed\x81\x05\xa3\x12\xe5\x65\xb3\x17\x2b\xde\x58\xde\x75\x96\xcb\xda\x82\x29\xd0\x46\x4c\x01\x0c\x00\x9a\xd2\x89\xfc\xef\xd7\x4f\xf7\xbc\x01\x84\x9c\xbb\x2f\x12\x31\x18\x0c\x06\x3d\x33\x3d\xdd\x3d\xdd\x4f\x9f\xab\xd7\xf8\x42\x9a\x31\x58\x3e\xea\xeb\x12\x92\xcc\x6f\xfc\xf7\xdb\x32\x09\xbe\x3c\x0f\x4c\x62\x1e\x78\x2b\x73\x80\xe1\x03\xc3\x76\xd7\xf9\x5a\x5b\xe1\x7f\x22\xb2\x53\xd9\x49\x68\x7d\x06\x94\x89\x92\x6b\x22\x63\x3e\x55\xd1\x57\xc7\xbb\x32\xf9\xae\x14\x83\xdd\x43\xd9\xf5\x88\xe4\x3c\xa4\x8e\xb5\xfd\xc5\x97\x48\x3d\xe6\x55\x0e\xa0\x90\x0a\x7b\x6f\x55\x9b\x70\x57\xcd\x7e\x33\xa3\xed\xa6\xed\xbe\xc4\x4f\x91\xba\x9c\xf7\xfd\x8e\xca\x48\xa3\x86\xd4\x24\x92\xb1\x0b\x1b\xf1\x5b\x58\xe1\x49\x22\x83\x40\x5e\xdb\xe3\x7d\x76\xe1\x56\x92\xf6\x20\x67\xe9\x6d\xb1\x8c\xa6\xbb\x52\x12\x3e\x96\xb0\xb4\xf5\xee\x69\x74\x36\x2f\x3e\xe4\xf7\xfe\x91\x05\x48\x9f\x25\x08\x60\xfd\xad\x74\x84\x68\xc2\x8d\xdc\xdf\x59\x15\x1b\x47\x14\xa3\x99\x11\x71\x73\x3e\xc1\x58\x74\x54\x0d\xfd\xc8\x2a\xd9\x48\xaa\x4d\x7b\x52\xd8\x27\xdd\xea\x70\xc8\x20\x72\xae\x96\x69\x96\x8e\xc2\x5d\xb2\xa2\xc5\x11\x93\x06\x67\x5c\xbd\x1a\xfb\x55\xab\x48\x35\xf8\x03\x74\xfe\x48\xed\xac\xff\x9e\x5f\x19\x3e\x51\x24\xd5\x54\x0b\x22\xcf\xf2\xec\xac\xe1\xb9\xe3\x45\x1a\x75\x25\x02\x0e\xee\xe9\xec\xc1\xeb\x4d\xd6\xfe\x2c\x11\xca\x9c\xaf\xce\x6e\x1b\x65\x04\x87\x09\x9d\x05\x24\xa4\xd1\x59\xa6\x79\x5c\xe3\x64\x0a\xb9\xa7\x23\x64\xa5\x2a\x39\x52\xdc\x28\x50\x5e\x2e\x06\x22\x15\x74\x2b\xa5\x0f\xcc\x31\xdd\x4f\xcc\xec\x83\x88\x93\x67\x67\xaf\x4b\x63\xf3\x7b\x5d\x0e\x23\xc0\xce\x7d\x03\x3d\xdf\xdb\x70\x0c\x8a\x3e\xfd\x7a\xe6\xa4\xd0\x8d\xa4\x09\x2d\x2c\xba\x14\x31\x72\x9b\x2e\x2c\xb7\xa5\x33\x3e\x72\xea\xcd\xcb\xd4\x02\x98\xc6\xf0\x5d\x18\x48\x05\x1a\x66\x49\xf0\xea\xe7\xd7\x37\x38\x52\xf3\xfc\xb2\x07\x5c\xf9\x32\xcf\x8d\x0f\x56\x33\x71\xeb\x8b\xcb\x23\xcc\x6c\x65\x1e\xfa\x52\x63\xe5\x78\x29\x35\xcb\x81\x99\x45\x0a\xb3\x21\x23\x6e\x58\xd7\x34\x96\xfb\x9a\x1c\x7e\xcb\x6c\x25\x63\xd4\xcc\x42\x9c\xaf\x88\x8b\xdc\x6d\xe1\xc0\x88\x40\xdb\xee\xe6\xa0\x8f\xd1\x6b\x78\x6c\x2f\x38\x7d\x0b\x89\x6e\x0d\x3b\xc7\x12\x4f\xcf\x97\x0c\x68\xcd\x8e\x6e\x56\xb7\xe6\xd9\x42\x2a\x08\x8c\x67\xf2\x9b\x95\x6d\xfc\xbc\xd2\xef\xd1\x97\xdf\x61\x3f\x36\xb5\x76\xec\x01\x61\xae\x10\x07\xb3\xfc\xc3\x2d\x79\x68\x1b\xea\x9d\xdf\x4b\x16\xf7\x98\x86\x2c\x6b\xda\x97\xd5\x6d\xb1\x2e\xf2\x5b\x64\xd6\xca\xdb\xec\x3d\xa7\x6e\xf7\x26\x77\xcc\x83\x40\x3b\x8b\xe7\x50\x59\x34\x3f\x55\xab\x6c\x13\x5f\x69\x61\xec\xae\x5c\x5c\x2c\x23\xeb\x4c\x09\x34\xd5\x0a\x3d\x67\xaf\x58\xba\xd4\xee\x96\x16\x79\x55\x46\x11\x13\xb3\x58\x71\x1e\x89\xf3\xfb\xc9\x7e\xbf\x9f\x00\xf9\x7e\x42\xaf\x13\xb1\xf8\x76\xce\x49\xbd\xa0\x2b\xbe\xb9\xf9\x7e\xf2\xe7\x40\x89\x7f\x2b\x8e\xe7\xbf\x0c\xe2\x6f\xa9\x4b\x00\x29\xe1\xc8\xa3\xf3\x2d\x84\xdb\x40\x02\xf4\xa5\x44\x26\xc9\x3d\xae\x3b\x6f\xba\xdb\xa8\x67\x5c\xe1\x1e\xf7\x7f\x6b\xd8\xb1\xcb\xab\x80\x12\x5d\x03\x30\x3c\xda\x65\xd4\x43\x88\x7b\x44\x9b\x78\xfa\x5c\x5e\xc7\x6f\x3a\x97\x96\xf8\xe9\x73\xc4\x8f\xcb\xa4\xf8\x9e\x21\x72\xe4\x91\xc0\x14\xbe\x7d\xf9\x53\xa0\xfb\xee\x4f\x1e\xd3\x19\x53\xf6\xd7\xd7\x3f\x5f\xcb\x7b\x49\x24\x82\xa5\x00\xdf\xcd\x1d\x0b\xe2\xd7\xbc\xe8\x15\x7f\x29\x9b\x92\xe1\xb7\xaa\x2f\xd1\x0a\x3c\x17\x78\x72\xa3\x11\x5d\x8e\xef\x35\xc5\xd4\x85\xa3\xf2\xd8\x96\x8c\xb2\x19\x21\x86\xc4\x3d\xda\x79\xb0\xdb\x3e\x21\x1e\xa5\xc4\x19\x99\x39\x76\xf9\x21\xf0\xdc\x63\x2a\xef\x96\x32\x36\x1f\x0a\x5e\xd1\x96\x2a\x96\x4a\xda\x2d\xbf\x2e\x23\x2e\xbc\xa9\xb3\xb2\x81\x5d\x06\x85\xbf\xe9\xc2\x9e\x65\xec\x14\x72\x99\x77\xd0\x5c\x49\xc2\x0d\xf8\x44\x11\xf3\x3d\x89\x2b\xe7\x70\x0c\xdb\x97\xdd\x16\x81\x8f\x25\xf2\xe0\x6e\x0d\x1e\x2a\xa9\x15\xea\xd6\x5d\x52\xab\x6b\x2f\xcc\x65\xad\xd5\x28\xd8\xb1\xd6\x36\x4b\x92\xfa\x40\x6d\x7e\x9b\xaf\x49\x80\x46\x2a\x24\x0e\x4c\xbf\xca\x36\x1b\x38\x0e\x34\xc8\xec\xbe\x42\xf2\xbb\xbb\xaa\x86\x47\xd9\x1d\x35\xde\xb4\x59\xbb\x6b\xae\x34\x6a\xa1\x7a\xc0\xbe\xf9\x09\x7f\xde\xd1\x96\xbf\x4f\x02\xc9\xdd\x42\x4a\xb9\xba\x4a\x88\xc2\xd9\xed\x03\x71\x8c\x16\xcb\x94\x24\xa9\x5f\xf4\x9c\xf8\x0b\x43\x72\x9d\xba\x9f\x42\x28\xb8\xa4\x2d\xf8\x9d\x64\x15\x5e\x45\x8f\x2b\x44\x8f\x6a\x34\xb1\xe4\x46\x4b\x2f\x59\x14\xad\x16\xed\x29\x4c\x43\xd2\x2e\x2e\x97\xc7\x36\x59\x2d\x7a\xb1\x9c\xcb\x63\x47\x6d\x6f\x45\x6d\x6f\x8f\xe8\xd3\xd7\x9b\x4d\xb7\x5b\xcd\x80\xf5\x83\x3b\x95\x66\x1a\x93\xb3\xc1\x97\x10\x31\x9b\xf6\xe4\x43\x7c\x5b\x73\xa7\x0b\x66\x23\x7a\x87\xec\x69\xc9\x27\x58\x20\x3f\xb1\x3b\x43\xae\x1e\x70\x1a\xd2\x1a\x6e\x0b\xcd\xa1\x2e\x6e\xf3\x97\xc5\x9d\xe4\x8c\x19\x60\x8a\x68\x64\x3b\xbd\xd3\x35\x92\xdc\x3c\xeb\x06\x67\x98\xb6\x0c\x7e\x7b\xf9\xe2\x1d\xbb\xcc\x6b\xef\xc7\x3b\x30\xde\xc5\x9d\xe4\x70\x6c\x97\x4b\x51\x19\xaf\xa6\xd9\x66\x9f\x3d\x34\x24\xe0\x5c\xe9\x31\xef\x61\x7f\x2b\x12\xa4\xeb\x41\x80\xd3\xc3\x61\x6f\x6a\xe2\x18\x7c\xca\x15\x11\x3b\xf4\x31\x44\x66\x25\xe9\x2b\x9b\x07\x3e\xc0\x74\x74\x57\x10\x7d\xae\xdc\x56\x95\xbc\x47\xf4\xaf\xa2\xd7\xca\xc6\x91\x5c\xf1\xd6\x48\x05\xac\xe5\xd1\xe5\x3a\x2b\xe0\x50\x4f\x6b\x3d\x09\xc3\x1c\xc9\x8a\xe9\xe7\xe1\xf0\x50\xe2\x18\xc0\xa9\xec\xf7\xa5\xf2\x2f\x3f\x96\x8a\x39\xfc\x38\x38\x3f\xa7\xc9\xbc\x95\x48\xed\x12\xf9\x23\x3f\x54\xb7\xb0\xe2\x4b\xa4\xc4\xd6\x96\x48\x15\xaa\x69\x45\x2c\x63\xbf\x77\x45\x12\x4f\xf8\xb4\xa0\x1b\xd0\x66\x27\xb3\x8e\x16\x66\x5d\xd1\x6e\x52\xdd\x11\x8f\x67\x6f\x1b\x23\x8d\x73\xff\x7b\x02\xb9\xea\x54\x4f\x46\x1c\x4b\x82\x03\x75\x9a\x89\xfc\x19\x67\x67\x38\x50\x97\x2b\xa4\xf2\x0f\xeb\xc5\x57\x70\xa6\x21\xb1\xa2\xdd\xc6\x22\x39\x5f\x2c\xd3\xe0\xcf\xb3\x20\x0e\x9e\x3f\xff\x2a\x60\x87\x1e\x6c\x72\xbd\x6a\xdc\x5a\xa7\x1e\xbf\x5d\xc2\xad\xb7\x53\x6f\x13\x74\x28\x9c\x56\x4c\x33\xf5\x34\x45\x12\x63\x67\x94\x4b\x10\xd9\x33\xec\x44\xea\x77\xb0\x4a\xb5\x25\xb1\xef\x2a\x52\xb2\xd2\xf5\x4c\xb9\x9a\x6f\x88\x42\xb2\xf7\xaa\xcd\xd9\xd9\x8c\x0f\x4b\x64\x8f\x47\x6e\x86\x3e\xea\xba\x27\x8c\xd8\xb1\x94\x7f\x5d\xb7\x60\xba\xf7\x21\x6b\x4c\x38\xd1\xe8\x5a\xef\xf5\x52\x15\x10\x12\x4c\xfc\x4e\x2d\x5e\x5c\xfa\xb3\xf4\xfd\x71\x12\xbe\x2b\x5d\x64\xd5\x19\x91\x2a\x0d\xa2\xb1\xfe\x4a\x1d\x23\x22\x57\x3c\x72\x08\x8a\x31\x58\xf7\x32\x51\xf7\xe5\xc0\x69\xcc\x9e\x66\xe8\x17\x17\xff\x4e\x82\xf1\xa7\x72\x3c\xc6\xb9\xcc\xe0\x6b\x02\x5b\x03\x8d\x17\x6b\x23\xec\xf0\xb9\x82\x2f\xfd\x70\x00\xcb\xd5\xb4\xcf\x9f\xc2\xe0\xc7\xf5\xc4\xd4\x99\xbc\x2e\x88\x43\x93\x48\xd1\x7f\x92\x65\x2b\x12\x9d\x3e\xd7\xc8\x35\x2d\xc4\xc9\x4b\xcc\xee\xc0\xd5\xa6\x5e\x85\x6e\xbe\x38\x3a\xe2\xca\x13\x95\x46\x92\x24\xa0\xf4\xcb\xa2\xe1\x37\xe9\x06\x26\xa8\x12\xa8\x4e\x2b\x91\x1a\x7a\xe0\x6b\x16\xa9\x02\x7f\xa9\x32\x2a\xdb\x56\x07\x13\x35\x8b\xee\x9d\x65\xfa\xe4\x9d\x31\xd4\xa6\x11\x96\xab\x5f\x9c\x06\xea\x59\x30\xfe\xb6\x1c\x07\xf3\x67\xbf\x27\xb3\xe9\x8c\x4f\x1a\xa3\xd8\x35\x03\xa5\x2b\x72\x3a\x13\x11\x42\x76\x93\x68\xa0\xbf\x85\xb2\xb7\x05\x61\x6b\x4d\x04\x94\x68\x70\xc8\xc7\x3c\x69\xdc\xa5\xc4\x54\xac\xd5\x95\xda\x46\x3a\xd3\x82\x2c\x1d\xbb\x76\x34\x8b\x8d\xe6\x7b\x20\x68\xd2\xcf\xc0\x76\xe4\x51\x73\xd1\xf8\x42\x31\xfb\xa4\xff\x86\xd1\xc6\x17\xc7\xe8\x8a\xde\x1f\x6e\x4d\x27\x76\xc9\xef\x10\x5b\xf4\x02\x8d\x1e\xaf\xa6\x6e\x07\x4f\x2e\xb0\x2c\x6f\x7b\x0b\x90\xa3\xda\x17\xd4\xb3\x25\xa6\x26\x4b\xc8\xa0\x3a\x5c\x98\xaa\x5d\x0b\x25\x08\x61\xb0\x79\x7b\x23\x05\xbe\xb9\xdf\xf4\x3a\xd0\x95\x19\xed\xd9\x3c\x19\x89\xd1\xe3\x1d\xbd\x75\x47\xf4\x23\x79\xff\x41\x7d\x34\x49\xe1\xaf\x45\x3c\xe0\x9d\x2c\xe2\x80\xa7\x67\xd7\xf3\x8f\xe1\xe4\x42\x5d\x93\x8e\xc0\xfb\x17\x5f\x05\xd7\xd5\x33\x2b\x91\x05\x9e\x1f\xd3\xc7\xae\xf2\xbf\x52\x0f\xea\x93\xda\xab\x1b\x75\x9d\x94\xf3\x4b\x1a\xfc\x77\xd4\xef\x77\xc9\x25\xbc\x0b\xd9\xd5\xd2\x74\x9f\xd3\xc1\xb7\x2a\x83\x47\x4b\x40\x22\x8e\x4f\x9f\xfc\xc5\x2c\x7d\x1e\x03\xfd\x27\x7f\x91\x5c\xce\xe8\xd3\xbf\x9a\xcd\x5e\xd0\x06\xf1\xd5\xec\x39\xfc\x04\x80\x62\x1c\xee\x93\x97\x65\xb8\xa5\xa1\x84\x6f\xe2\x3e\xf9\x19\x17\x7b\xba\x24\xd5\x7e\x95\x86\xbd\xc5\x7d\x43\x7b\xdd\x89\xd4\x14\x06\x3f\xd1\xba\xb5\xcb\x99\xb8\xdf\xcd\x10\x1f\x48\x6e\xe8\xc6\xf0\xf3\x58\xb6\xf6\x31\xbd\x86\xa9\x3a\x31\x64\xe9\x28\x7d\x1a\x2c\x5c\xd8\x1b\x84\x4d\xa6\xd7\x49\x50\x56\xc6\x21\x26\xd6\xdf\x23\xa5\xed\x9d\xe9\x48\x1c\x5e\x27\x7b\x96\x15\x48\xa4\xa1\x5f\xcc\x1a\x3f\xd1\x0f\x9e\x77\x44\x96\xd1\x27\x98\x66\x3e\x25\xd7\x0a\x9b\xf6\xe8\x1a\x27\x32\xd4\x46\x2e\xba\x22\x91\x8a\x01\x93\x67\xd8\x7e\x8c\xcc\x91\xe4\xf6\x27\x74\x8b\x04\xe6\xee\x6b\xec\xf2\x44\xad\x0f\xd0\x59\xab\xcd\x27\x09\x00\x5a\xab\xc5\x83\xba\x56\x57\xcb\x28\xc6\x0d\x48\xd8\xa6\xfc\x8a\xca\x3f\x2d\x5d\xa3\x90\x8f\xc2\x3b\x88\xb3\x6d\x77\x4a\xaf\xd2\x8e\xc2\x1a\xfb\xaa\x2c\xe6\x38\xbd\xf4\x21\x46\x4b\xef\x11\x2c\x96\x7b\xed\x53\x19\x72\xea\xf6\x56\x87\x53\x8a\xf5\x0a\x99\x4c\xcc\x96\xe6\xf2\x4f\xf5\x36\x34\xd2\xa8\xbd\x84\xf2\x57\x2c\xa2\x42\xfb\x79\x1a\x8c\x5c\xdc\x5d\x61\xbc\x0d\x58\x67\x8a\xf8\x99\xd7\xac\xf0\x3d\x15\x94\xe0\x3d\x63\x22\x4a\x8f\xee\xdc\x76\xc1\x1e\xb5\x2a\x40\x0e\xba\xd3\x53\x74\x88\xae\x5d\x8f\x18\x24\x2f\x1a\x8a\x7b\x93\x60\x91\xa4\x3a\x1c\x90\xe3\x47\x32\x06\xa9\x01\xa3\x48\xe9\x8c\x22\x95\xd8\x43\x6a\x65\xd8\x56\x71\xec\x02\x49\xbc\x1c\x72\xce\x64\xb3\x8f\xd1\x6c\xd9\x2b\xd3\xf2\x6e\xad\x3c\x10\x77\x46\x2a\x7b\x98\xc8\x88\x9f\xb0\x49\x0d\x9b\xbf\x4e\x3c\x4f\x0f\x18\x61\x1a\x1b\xd4\xc0\x9a\xe9\xec\x48\x91\x0f\x0b\x05\x66\xbf\x81\x5c\xbd\x59\x34\xb4\xe3\xe0\xaf\x0b\x5e\xdf\x59\x03\x5e\x63\x72\x43\x80\xcd\x52\x37\xe8\xa9\x3a\xca\xb8\x47\x2c\x71\x3f\xda\xc6\xc4\x20\x36\xda\x69\xf8\x23\xa7\x38\x2f\x1a\x76\xdb\xc0\x8d\x65\xf4\x98\x25\x8d\x69\x91\xa3\x6b\x9a\xe8\x98\xc1\x7d\xbc\x30\x73\x27\x4b\xc3\x6c\x24\xdf\x0c\x29\xdc\x74\x04\x2e\xcc\x80\x19\xf0\x7d\x30\x7f\x7e\x1a\x05\x00\xaa\xdd\xca\x27\xa8\xb6\x94\x09\x18\x18\x0c\x26\x2e\xed\x94\xd7\xd7\x68\xb7\xc8\xfa\xda\x59\xe7\x5b\xb2\xe5\xbc\x4a\x56\x66\x28\x4c\xf4\x32\xe8\xe8\x6c\x51\x62\x76\x90\xa8\xdc\x72\x31\x50\xce\x6a\x13\x80\x0f\x38\xc7\x2e\xba\xf8\x3d\xab\xe4\x38\xea\x4d\xfc\x02\xce\x13\x66\x3e\x81\x91\x02\x2a\xe5\xbd\x9e\xc1\x0a\x78\x86\x54\x51\x95\x6c\xec\xe1\x9a\x48\x02\xd4\x3e\xf0\x44\x2a\x89\x3a\x26\x82\x6e\x78\x1c\x2a\x1a\x9e\x1d\x6d\xfb\xfc\x53\x8d\xb2\xc8\xee\xfd\x3b\xb4\xd7\x24\x85\x7f\x06\xd5\x88\xe8\x5e\xb1\xb1\xd0\x34\xc1\x02\x87\x6d\x85\xaf\x22\x8c\x2c\x3c\xcc\x53\x54\x2b\x96\xf1\x4e\x4c\xaf\xa3\x99\x04\x32\xc0\xd3\x6d\xe5\x66\x15\x06\xc0\x9b\x59\x19\xd7\xc4\xeb\x49\x16\xcb\x17\x26\x1a\x78\x19\xb5\x09\xe3\x13\xf1\x87\x61\x63\x95\x6b\xbd\x9f\x6e\xed\x09\x35\x73\xef\x38\x60\xe3\x4a\xad\x19\xb3\x88\x0d\x59\x4a\xda\x02\xed\xa7\x32\x84\x38\x26\xe1\xcc\xef\xd4\x6d\x7c\x4a\x5b\x81\x0a\xc7\xe3\xb1\xdb\x4e\x63\x4c\x7f\xbc\xa8\x5b\xa0\xe5\x78\xf6\x0b\x6b\x07\x13\x16\xa4\x0d\x5e\xce\x5a\xa5\x9e\x75\x0c\x5a\x4f\x94\x03\x5f\x7a\xa8\xfc\x7e\xe2\xee\x74\xec\x5e\xfa\x6d\x83\x00\xd5\x3d\x3b\x15\x1b\x9c\x74\x13\xc3\x51\xbe\x1e\xfa\x9a\x64\xd0\x3f\x1a\x0e\x67\xed\x43\xa1\x8d\xd7\xf6\x5b\xc8\xad\x92\x20\xa9\xb5\xe5\x0a\x59\x19\xf3\x9e\x9e\xa8\x21\xc5\xc4\x66\x99\xeb\x37\x26\x72\x10\x20\xaf\xb2\x32\xce\xf0\xab\x78\x4d\x79\x6d\x3a\x80\xa0\x8c\xa5\x50\xf6\x45\xc5\x0f\x0d\xb9\x76\xe2\x4f\x3f\x37\xa3\xda\x01\xfe\x95\xb3\xec\xd3\x03\x28\x0b\x51\x50\x8a\x3c\x88\xd3\x92\x7c\x2a\xa5\x57\x62\x09\x65\xd7\x36\x63\x15\xed\xdd\xe3\xe4\x4d\x35\x58\x0e\xf4\xb2\x72\x5a\xf1\x09\x73\x82\x1f\x2c\x6c\xf1\xd4\xd2\x19\x40\xbb\x76\x17\x1c\x9e\x8e\x4a\x4f\x24\x3b\x1c\xce\xf1\x6c\x7e\x7b\x30\x22\xef\xb9\x76\xbb\xf7\x2a\x71\x60\xcf\xe7\x5f\xc3\xa7\xa6\x5d\x6c\xdb\xcf\xa0\xd4\xc2\x84\xc7\xc7\xac\xc4\x8b\x43\x92\x03\x95\x5d\x06\x70\xb4\xa9\x4f\x50\x2b\xbb\x19\x3c\x7a\x56\x15\xa2\x30\x5e\x26\xbd\x23\x92\x4b\x3e\x41\x7d\x56\xfa\x3d\x67\xf0\xfa\x06\xc7\xa1\x49\xf4\xaf\x34\x4c\x93\xb3\xc3\x17\xd1\xe1\x5f\xe9\xbf\xd2\xf3\x79\x67\xa9\x41\x30\xa0\xf5\xbb\xd2\x96\x3d\xb1\xd1\x6e\x8d\xa1\xef\x14\x1b\xf4\xfb\x52\x10\xfa\x59\x4c\x11\x24\x07\xd2\x42\x45\x09\xf5\xad\x40\xb0\x5c\x61\x78\x07\xa7\x3d\xde\xc1\x66\xdc\xad\x37\x1f\x07\xc2\x84\xca\x29\x57\x1a\x69\x7d\xf9\x9b\xd2\x0c\x12\x4d\x00\xd2\x82\xe9\x2f\xc7\xa8\xf5\x7c\xbc\xb4\xc2\x39\x0a\x3b\x0a\xa5\xe0\x1b\xda\x13\xa0\x3f\x34\xce\xc3\x77\xc8\xbd\x90\xf5\xf7\xb3\xb3\x00\xff\xbd\xb3\x23\x6a\x54\x3e\x83\x81\x5c\x3b\x6a\x21\xb0\x29\xa6\x1d\x62\x76\x9d\x6a\x7a\x37\x91\x67\xb8\x53\x00\x87\x9b\x6e\x89\xda\xa4\x82\x1a\x41\x7f\xac\xa1\xe0\x1b\x36\x14\x10\x8b\xb5\xd5\x0d\xb5\xca\x9e\x79\xc2\x50\xcd\xd8\x0e\x74\x75\xf6\xd3\xa9\xb0\xb6\xbc\x3d\x58\x2f\x55\x31\xb5\x7b\x42\x9d\x73\x49\xe6\xf1\x07\xff\x0f\xe1\x32\xba\xcf\x9a\x67\x24\xf1\x3f\xc3\x34\x62\xcd\x03\x24\x38\xaa\x2e\x49\x12\x91\x42\x71\x98\x8a\xc0\x06\xfc\xf1\x5b\x6e\xdc\xa1\x16\xf2\x37\x6a\x2b\xa3\x57\x81\x1f\xc8\x54\xa9\xb7\xfd\x1e\x71\xeb\x1e\xb1\xbe\xb7\x90\x26\x1c\xcd\xd6\xa1\x3d\x86\x32\x0b\x05\x2a\x82\x5e\x9b\xb4\x47\x0f\x40\x85\x76\x23\x8d\x0c\x50\xaa\x5f\x4a\xf5\x0f\xe4\x1a\xfd\x02\x56\xdb\xaf\x59\x3e\x7f\x2b\x1e\x46\xde\xa1\x99\x5e\x1a\xac\x58\xe7\xd8\xe5\x5f\x95\xd1\x2b\x40\xaf\xe9\x55\xe9\x44\xd4\x1f\x39\x1b\x39\x6d\xb2\xc6\xe8\x9c\xef\x49\x36\x7a\xfb\xf2\xa7\xbf\xb4\xed\x56\x1b\x02\xf4\xce\xdb\x22\x94\xce\x3e\xf8\x3f\x83\x0f\x76\x3a\x14\x06\x2f\x0b\xb0\xf2\x6a\xdd\x72\x8b\x37\x37\xaf\x82\xc8\x6f\xac\x77\xa6\x7b\xff\xa1\xee\x7f\x53\x7a\x32\xce\x92\x38\x57\x1f\x87\x9d\x9d\xa1\xff\x87\x03\x3a\x73\x8c\x7f\x04\x75\xfa\x07\xc5\xd4\x68\xd8\x89\x46\xac\xea\x26\x19\x8d\x7e\xc1\xe9\xe8\x9e\x94\xa2\xab\x3a\xbf\xa5\x01\x2e\xb2\x4d\x83\xb8\xbc\x5f\x74\x1b\x16\x54\x87\xda\xe2\xea\xea\x97\xd2\x1c\x92\xba\x2d\xcc\x77\xf4\x84\x1c\x5c\xfa\x5b\x57\x07\x05\x97\xde\xaa\x4f\xb3\x87\x37\x28\x3f\xa9\x2a\xb3\x19\xee\xb7\xa4\x2b\xd9\x11\x0f\x86\x7f\x58\xba\x99\x56\xdb\x1c\xeb\x94\x4d\xbd\xa5\xde\x74\x78\xe3\x52\xae\x1a\x73\xff\xa6\xd9\x57\xf5\x6d\x14\x7f\xe6\x11\x2c\x30\x7a\x8b\x08\xa8\x4e\x3f\xf0\x0b\xa1\x20\x24\x5e\x01\x5d\xce\x4b\xab\x7e\x90\xa8\x39\xed\x9f\x00\x0c\x95\x85\xee\x11\x5e\xd4\x3e\x89\x8a\x45\xf0\x76\xa2\xe7\x59\x7e\x3b\x61\xd8\x40\x8e\xc0\x1f\x2a\x4f\x82\xee\xc4\xf4\xe0\xac\xb9\xeb\x45\xb4\x39\xb5\x5f\x35\xaa\x00\x6c\x8f\x9e\x77\x3b\x9a\x77\x1b\x31\xd2\x94\x1d\xf3\x9f\x30\x06\x89\xee\x89\x3a\x99\x7c\xcd\x16\xd0\xc8\xb9\x16\xbf\x92\xc6\x85\x73\x3a\x1d\x0e\xcf\x19\x19\xd8\xdf\xa2\x71\x2f\x91\x18\xb8\xcd\xd0\x0e\x0d\x67\xa1\x6a\x4b\x0b\x98\xd4\x79\x31\xc6\xd2\xd2\xcc\x10\xf8\x13\x3d\x1f\x75\x1b\x03\x35\x8d\xb9\x8c\x15\xaf\xad\x04\xdf\x6f\xb4\x75\x80\x54\x9e\xcd\x74\xf0\x5c\x28\x8c\x4e\xf3\x21\x6e\x3a\x07\xe7\x6c\xb8\x63\x4c\xce\x6e\xb9\xd0\x74\x65\xdf\x81\x32\x4d\xbc\x35\xce\xb8\x82\xe0\xd8\xb0\xec\xa2\xd7\x20\x5b\x49\xdd\x90\xa6\x17\x97\x97\x5f\x11\x4d\x1a\xb6\xa6\x5d\xce\x9e\x47\x71\x93\xc8\x8b\x52\x12\x30\xe2\xe7\xb3\xe7\x47\xdd\xdc\x2d\x2d\x9a\xc3\xa1\x82\xf5\x8b\xa4\x89\xed\xd9\x59\x45\x83\x45\x14\x56\x3b\x00\x85\xcb\x24\x4d\xfb\xf4\x4d\x3d\x03\x5d\x8d\x38\xb5\x64\x3c\xfe\x47\xc9\xd4\x0c\x5f\x71\xcc\x12\x7b\x26\xb1\xff\xbb\x38\xfc\x85\x5f\x20\x12\x94\x69\x0c\xac\xe6\xc1\x31\xa1\x96\xea\x70\x48\xa2\x41\xec\x44\x5f\x94\x79\x5b\xaa\x37\xa5\xfa\xbb\x76\xb2\x12\xb0\x80\x03\xc2\xf8\x0f\x08\xde\x87\xb3\xd5\xaf\xa5\x07\x7b\x92\xc6\x1a\xf9\xe4\x10\x19\xa8\x14\x41\x49\x71\x70\x2a\x7f\xa5\xb6\x68\xce\xee\x72\x76\xd8\xa6\x06\x7e\x20\x69\xa9\xac\x97\xea\x6f\xf4\x31\x38\x79\x5f\x0c\x9d\xda\x89\x87\xb0\xc0\x84\xed\xf3\x5c\x47\x2f\x21\xf5\xe7\x6a\x07\xa6\x57\x24\xbf\x96\x26\xe6\x91\x34\xc8\xe2\xec\xac\x90\xf3\x14\x3f\x6a\x3b\x5f\xc2\x7b\x56\x62\xb6\xb3\xa4\x77\x4b\x42\x20\x47\xac\x0a\x8e\x61\x21\x31\x0d\xea\x50\xa6\x29\x5c\xa8\x91\x58\x92\xe6\xe4\x05\xb1\xad\x4b\x46\x85\xa0\x99\x9f\xd1\x8b\x44\x0d\x65\x93\x0a\x2e\xa9\x3b\x05\x7b\x1f\xd1\x88\xd5\x87\xc3\xc5\xfc\xb6\x7a\xc6\x78\x79\xc1\xf4\x4f\xb4\x03\x9f\x27\x8d\x32\xb1\xbb\xa6\x5d\x95\x91\x18\x60\x30\xd5\xa8\x39\x9a\x50\xfa\xdb\xce\xd1\x19\x80\x23\xd2\x34\x9b\x4c\x36\xd6\x06\x55\xb0\xca\x5a\x62\xea\xd6\x6d\x32\xa6\xf5\x8c\x77\xcd\xc0\xf8\xca\xa2\x25\x45\xba\x04\xd4\x4e\x52\xe0\x14\x29\x1b\x87\x85\x0e\x90\x2f\x16\x97\xcb\x78\x8c\xbf\x88\xf3\x5a\x7a\xfb\xe3\x7f\xfb\x12\xc6\xa0\x69\xf8\x6d\xc9\x9b\xf5\x5b\xeb\x05\xe8\xf6\xc8\x7f\xf6\xc1\x2c\x93\xf0\x6f\xf0\x1d\x11\x47\x2f\xed\x34\x47\x25\x6c\x8e\xa7\x11\x42\x7c\x68\xd1\x41\x53\xc9\x38\x4c\x74\x2c\x3c\xa5\x20\x31\x43\xec\xeb\x25\xbc\x5e\xac\x49\xdd\xc3\x80\xd1\x39\x83\x3b\x9e\x53\x68\xf5\x07\x83\xc6\xc1\x21\xea\xee\x0c\x7d\x40\xa6\xd1\x3c\x69\xc3\x63\x70\x84\xf9\xc1\xbb\x89\x80\x48\x93\x0a\xf6\x62\x2e\x67\xa8\x6f\x69\xd5\x81\x4c\xa4\x4b\x78\xf1\xb4\x3b\x19\x03\x10\x6c\xbc\x9b\xde\xee\x6a\x16\x6c\x27\x32\x41\xcf\x5d\x09\x46\xa7\x4a\x2e\x26\x35\xa3\xc9\x20\xf4\xb7\xc5\x5c\x6e\x3a\x64\xd8\x68\xe4\x14\x73\x93\x96\x32\x82\x8f\x43\xe7\x06\x0d\x47\xfa\xb6\x58\x3f\xb0\x9d\x33\x57\x8b\x9d\xa2\xb1\x26\xa2\x5e\xbc\xa0\xa9\x4b\x52\x6a\x1c\x36\x1d\x13\x2c\xaa\x2c\xc5\x45\x8d\x98\x68\x63\xcf\x76\x1f\xf1\xd5\x71\x0e\x77\x9a\x6d\x13\xfb\xc0\xcd\x58\x43\xb0\x00\xf8\xde\x62\x8f\x1a\x27\xee\xbb\xac\x41\xc0\x08\x89\x34\x70\x73\x40\x3a\xeb\xa2\xcc\x36\x3a\xc4\xbd\xc8\x9b\xb8\xb5\x85\xc6\xfb\xa3\x54\x96\x3e\xb1\xa5\xa0\x21\x0a\x09\xce\xe6\xa7\x92\x2f\x8e\x69\xe1\x78\x4b\x3d\xee\x3a\x3a\x4a\x90\xc9\xfd\xd4\xb0\x81\x1d\xb2\x77\x70\xca\x42\xfd\x73\xda\xe9\x28\x4f\x41\x7d\x23\xe7\x12\x4b\x47\x4b\x7e\x96\x54\x01\x6d\x8f\x93\xfa\xca\x73\x47\xe9\xe4\xbb\x6f\xd3\xde\x78\xc5\xcc\x01\xba\x59\xd4\xd9\xd6\x44\xaa\xd7\xbc\x7e\x51\xce\x4b\x7f\x18\x4b\x19\xc6\x0b\x0f\x94\xfc\x74\x98\x54\xbb\xa4\x3d\xc4\xb7\x93\x9b\x52\x7d\x3a\x0f\x8c\xcc\x1d\x07\x76\xc8\xbb\xda\x3a\x5c\x0d\x7e\x77\xd4\x5d\x4f\x3f\x94\x76\x41\xed\x88\xd9\x98\x67\xdc\xba\x9a\x5b\xd3\x09\xc2\x24\x56\xea\x9f\x44\xce\x9e\xc7\x9d\x79\x0d\xc6\x32\x82\xe9\xd2\x5d\x9a\x0c\x7c\xfc\xc8\xfa\x9e\x4f\x8b\xea\xd0\x4e\x9f\x8d\x32\x73\x2d\x2b\x8b\xbb\x78\xa7\x78\x03\x88\x75\x0b\x7c\x71\x8c\x10\x2a\x6f\xf2\xbd\x99\x77\x99\x6b\xed\x85\xa7\x4b\xd9\xed\x40\xff\x36\x16\x84\x88\xbd\x0f\x4c\x0d\xfc\xb6\x0b\x5e\x97\xc9\x95\xc7\xb2\xda\xfa\x04\xe9\x49\x65\x0e\x12\x3d\x17\xca\xf5\x40\x52\x8a\x84\xc1\xdc\x25\x25\xa3\x17\x11\x51\x49\x8c\x34\x60\x48\xf4\xcd\xa4\x62\x0d\x07\xb9\x8e\x6b\xce\xea\x50\x53\x91\x39\x93\xce\x19\x7b\x20\xf3\x31\x34\xa8\x55\x9c\xe4\x8b\x5a\x0f\xf9\x3c\x63\x57\x43\xad\xe7\x03\x65\xd2\x3e\x5b\x2f\x5d\x37\xab\x48\x7a\x0b\xff\x15\x79\x2b\xf5\x0b\x68\x19\x49\x11\xc9\x99\x1b\x3a\x9c\x14\xa4\x81\x7c\x4d\xc4\xe7\x85\xe6\x50\xda\xf3\x5a\x3d\xf2\x04\x3d\xf1\x96\xe9\x23\xe5\xc1\x72\xab\xf2\x44\x18\x78\xcc\xae\x99\xd6\x8a\x3a\xf7\x91\xad\xbb\x18\x59\x2e\xf5\x0a\x87\x73\xd0\x0e\x40\x3d\xe3\xbf\xbc\x41\xf2\x2f\x6b\x36\x6d\x25\x91\xd5\x40\x2a\x4f\xd2\xbf\xd2\x1f\x4a\x5b\x31\x8f\xe2\x1f\x6c\x62\xc9\xce\x39\x44\x79\xba\x2b\x58\x93\x39\x7b\xa2\xc2\x73\x89\x01\x74\x25\xe4\x74\xdd\x81\xc9\x01\xae\x18\xb0\x74\x2d\xbc\xbe\x0a\xd6\xf7\x10\x77\x02\xc0\xf7\xf1\x44\x25\x3a\x63\x5f\xf9\xb7\x93\x61\xa4\x16\x0c\x6b\xec\x4f\x02\xe7\x60\xbe\x89\xa3\x42\x77\xc1\x1c\x5f\xe7\x89\xe1\x63\x2a\xe5\x5f\x74\x54\x71\xfb\xcc\xe1\xb0\x01\x3e\x92\x72\x25\xe3\x31\x4d\xfc\xd3\x8d\x6c\xa8\xcc\x3d\x34\x99\xd0\x44\xe5\x9f\xa6\xab\x7a\x88\x0e\x07\xbf\x0f\x0c\xc5\x14\x49\x2e\x54\x9f\x28\xa1\x09\xcd\x46\xa4\x0a\xc9\x30\x12\x9f\xcd\x61\x2b\x62\xa2\x23\x1d\x68\xbd\xa9\xf6\xc9\x62\x6b\x7f\x2b\xf7\xf3\xad\xf7\xfb\xd7\xa5\xd2\x51\xa6\xc3\x30\x6d\x5e\x80\xa4\xbd\x29\x58\x49\x51\x07\x5a\x40\xda\xf8\x06\x81\xaa\xd7\xc8\xc5\xff\x53\xf6\x40\xa2\x0a\x3d\xad\x1b\x87\x6e\x01\xb8\x1a\x1b\x71\x96\x6e\x75\xf8\x6f\xbc\x75\x80\x6a\x9d\x78\x57\xce\xf4\x63\xfa\xc9\x0a\x83\xfd\x2e\x8b\xc1\xe7\x3a\xd0\x7c\x20\x7d\xe3\xe3\x3f\xea\x6c\xcb\x9d\x68\xb0\xc7\x9c\x0e\x81\xd7\x86\x6b\x1b\x27\x05\x1e\x75\xfc\x3b\x17\xfe\x9d\x5f\xfd\x3b\x97\x4b\x93\x8a\xbf\x96\x80\x21\x86\x6b\x60\x56\xf4\x77\x2d\xa7\x16\x02\xbf\xaa\x99\x84\xe6\x52\x15\xb0\xf3\x59\x6a\x07\x4d\x71\xdc\x47\xa2\xe5\x3a\xc5\x17\xe5\xb0\xde\xf1\xd4\x8e\x60\xa8\x2b\xca\x5d\x3e\x5f\x81\x55\xd0\xbc\xbd\x65\x17\x7d\x87\x2f\x53\x47\x47\xc1\x4d\x2e\x9a\xef\x30\x5f\xb4\xd1\x63\x45\xaf\xbc\x4d\x0d\x79\xa8\x5f\x98\xf2\xeb\xe4\x56\x07\x9d\x46\xf1\xd0\x4a\x52\x8f\x47\x4e\xf8\x12\x9a\x6a\xc9\x68\x1d\xa9\xb5\x84\xf1\x6a\x84\xb0\x5d\xcf\xeb\x1a\x98\x96\xb9\x03\x0c\x53\xa7\xf7\xc5\x97\x8e\xde\x26\x46\xdf\x6f\xfb\xab\xd7\x7a\xd6\xad\x22\xf7\x59\xad\x5a\x01\x86\xe2\xe8\x51\x76\x15\x65\x09\xc9\xb2\xeb\x14\x24\x88\x69\xdf\xc7\x9e\xc6\x77\x68\x35\x86\x28\x24\x96\xcc\x7b\x9e\x5a\x73\xd6\x0b\xc8\xd8\xa6\x44\xff\xf7\xe0\x3c\x10\x7b\xae\x57\x0f\xae\x00\x8c\xd2\xc9\x87\x51\xd7\x3e\xca\x8a\x67\x5f\xaa\x6b\x6c\x7e\x6d\xc5\x9e\x53\x05\x09\xf4\x5e\xbd\xa3\x96\x7e\x92\xba\x56\x7e\xbd\xe4\x91\x06\x92\x34\xe1\x1d\x50\xf5\x63\xba\x89\xe7\x4e\x22\x89\xe4\x5c\x58\x00\xdb\x68\x53\x4e\x74\x2c\x1e\x64\x8a\xa4\x54\x1a\xc8\x0d\x22\x04\x3b\x53\x34\x7b\xc6\x1d\x10\x77\x6f\x91\xe7\x12\x9d\xd9\x4c\xbe\x55\x47\x76\xee\xb5\x8a\xc6\xda\x98\x34\x42\x84\xa9\xe5\xa7\x28\x24\x3d\x6d\xac\x74\xda\xd8\x51\xd1\x73\xa7\xd6\x6e\xf9\xb6\xad\x6c\x8f\xb6\x93\x36\x0e\x98\x63\xa7\xdf\xe7\xad\x24\x23\xd0\xd9\x20\xfd\x67\x2c\x86\xb8\xbb\x7f\x54\x24\x84\x9d\x3a\x47\x02\x94\xf1\xf3\x2f\x93\x92\x8a\x3e\x3e\xf1\x69\x61\x65\x57\xc0\x1a\x6b\x81\xd3\x51\x70\xa9\xf1\x75\x4f\x6a\x7f\x99\xab\x99\xba\x18\xbe\x17\xc5\x26\x79\x20\x11\x35\x34\xa4\x9c\x38\x92\x47\x5f\xb6\x63\x77\xd5\x6d\xa4\x69\xf3\xad\xce\x48\xe6\x17\x39\xf8\x57\x51\x37\x4d\xfb\x4a\x03\xd5\xc2\x26\x44\x2a\x5f\xca\x7f\x3f\x4b\x49\x7b\x5f\x0b\xa4\xea\x64\xa2\x7a\xf3\xd1\xbf\xa7\xfc\xf6\x92\x47\x9b\xd7\xb4\x17\xef\x6f\x56\x72\xc7\x31\x38\xe7\x5e\x2f\x72\x19\x12\x9c\xbe\xe3\xda\x04\xd0\x0b\x66\xb5\x5f\x66\x6a\x42\x68\xd1\xfb\x88\x56\xb3\xb9\x1c\xee\xa7\x0a\xbb\x05\x43\x29\x31\xea\x5c\x4b\xeb\x32\xee\xbe\xa6\x0f\x57\xc1\xe1\x10\xf7\x4c\x4e\xdb\xfe\x49\x09\x24\x93\x6e\xef\xc2\x81\xee\x79\xc0\x6a\xfa\xb9\x2e\x7e\x9a\x2e\x8c\x1c\x2c\x64\xa7\xfb\xd8\xd7\xf6\xe3\x9c\x97\x55\xbf\xd7\xbc\x73\xef\x8f\x76\x60\xf4\xf8\x49\x58\xe8\x0d\x2d\xf1\x81\x62\x60\x4f\x25\x8f\xfd\xaf\xd5\x3d\xf6\x31\x04\xb9\xa0\x93\xb8\x66\xe8\xe5\x40\xd2\xf6\x70\x1f\x78\xf3\x51\xb2\xd5\x28\xd9\x78\xfa\x71\x26\x3a\xa0\x5b\xa2\x4d\xe6\x03\x81\xa0\x1d\xee\x28\x53\x82\x78\xd3\x00\x42\xe5\x13\x01\x49\x12\xdb\x98\xb1\xfc\x9b\x87\x85\x36\x73\x29\x69\xf8\x24\x4a\x74\x9d\xd1\x27\x57\x7f\x10\x82\xa9\x4f\xd3\xca\x52\xc3\xff\x18\xfc\x49\x35\x33\xbb\x98\x20\x1d\xdb\xb7\x5a\x38\xcb\xf6\x68\x43\x37\xf5\xbd\xa7\x92\x3e\x24\xfd\x0d\x97\x3d\x63\xef\xa1\xe9\xe5\x92\x87\xa9\x86\x12\xd1\xdf\x06\x13\x38\x56\x80\x00\xbe\x4e\x8f\x47\xa3\x39\xcc\xb8\x36\x2f\x12\x23\x03\xac\x69\xcd\x36\x1f\x18\xea\x84\x56\x37\xa9\xbf\x21\x9f\x9a\x18\x67\x95\xa9\xdc\x4f\x32\x05\xfb\xa5\x48\x91\xec\xec\xe8\x41\x67\x67\x9a\xbe\x22\x62\xea\x4a\x2a\x8b\xfa\xea\x74\x27\xaf\xfd\x80\x83\x3a\xbf\x7e\x6e\xb4\x1c\xbe\x52\xb0\x7c\x1e\x9f\x0a\xd4\x93\xdc\xf7\x88\x01\x33\x51\x1a\x92\x76\x1e\x27\x70\x5e\x8f\x30\x57\x48\xea\x55\x8b\xa5\xd9\x9a\x06\x61\xbb\x47\x33\x7d\x44\x4c\xab\x95\xda\x19\x07\x4e\xc4\x0f\x98\xec\xac\xd5\x36\x7e\xc2\x2d\x30\x42\x3e\xb8\x00\xe2\xeb\x12\xb6\x40\xd2\x66\xd0\xef\xb3\xb3\x22\xc4\x85\x17\xe9\xcd\x6a\x5a\x76\x5a\xf1\xaf\xa5\xc3\x9c\x33\x0f\x71\x7d\x9b\x17\x68\x5e\x4e\x26\xf3\x08\x8a\x1d\xaf\xb6\x91\x64\xe0\x15\xfb\x3d\xf7\x95\x6f\x71\x6f\x47\xbc\x32\x42\x2e\xc0\xe4\x92\x11\xad\x81\x2d\x05\xe0\x2f\xd6\xd9\x56\x38\xde\x46\x2e\x55\x3e\x98\xaf\x19\xe6\xf7\x36\x17\x52\xf1\x9c\x10\x78\x70\x19\xf8\x21\xf7\x0a\x43\xe2\x30\x4f\x34\x69\x3f\x47\x57\x55\x76\xe9\x05\xa3\xd8\xc2\x50\x37\x80\xad\xd4\x5d\x0a\xb1\x97\x5d\x6a\xd7\x69\xed\x2c\x2e\x4c\x19\x33\x29\x39\xde\xd3\xef\x38\x0f\x31\x8c\xbf\x66\x10\xf8\xbf\x07\x7e\xce\x69\x28\x1d\x61\x5b\x21\x6c\x2b\x84\xd5\xa9\x8d\x41\xcf\x76\x69\xa7\xba\x00\x3a\xb7\x3e\x3d\x39\x65\xa1\xa1\x65\xcb\xb4\x64\xf9\x32\x99\xcd\xb3\x17\x2d\xa7\xb3\xad\xe9\x09\x84\x02\xd0\x73\xd2\xd9\xce\x85\xeb\x51\x64\xe6\xbb\xf9\xa8\x9e\x5f\x5d\xd1\x35\x52\x24\x8f\x22\x4d\xc6\xf9\xd1\xe6\x05\x6e\x05\x70\x6f\xfe\xfc\x45\x31\x2f\xc6\xc9\xe5\xa4\x25\x6d\xfb\x9f\x0c\x21\x50\x2f\x0c\x2a\xde\x18\x40\xa1\x0b\x07\x6f\x47\x97\x0e\xc9\x03\xcb\xc8\x62\x45\xd5\x1a\xe0\x31\xf7\xd0\xb9\x1e\x9b\x0d\xf1\xed\x6f\xab\x7d\x19\x17\x70\x9c\x61\x99\x5a\x71\xe1\x9b\x2d\x17\x31\x5f\xd7\x45\x37\x82\x29\x8c\x62\xcd\xfe\x49\xbe\x27\x9e\xfa\x63\xe9\x30\x7d\xa5\x8d\x23\x97\xff\xbc\x6b\xbd\x1b\xdc\x92\xdc\xd0\x0d\xb9\x7b\xba\xb9\xe3\x1f\x67\xdb\x3a\x65\xd8\x86\x0f\xdb\xc0\x79\x81\xcf\x02\x2b\x4d\xfa\x4e\x9c\x3a\x31\xea\x40\x54\x29\x60\x53\x7c\xa6\x0a\x30\x61\xed\xb6\x0d\xd0\x6c\xa4\x84\x13\x0c\x52\xcf\x76\x42\xcc\xc4\x99\x3b\x89\x53\x89\x05\x55\xaa\xb6\x1a\x3e\xc3\x83\xfb\xa0\x72\xcb\x7f\x6b\x2b\x16\x26\x2c\x6b\x54\xeb\x75\x3a\x8b\x1d\x62\xad\x41\xc8\x75\x72\xa8\xfb\x19\xbb\x9f\x60\x3d\x22\xab\xe0\x73\x9b\xd4\xfb\xbd\x70\xb5\x96\xb1\x57\xee\x12\xf0\x18\xa4\x5c\x63\xff\xa8\xdd\x2e\x30\x63\xf4\x5d\x7d\x2d\x8c\x80\x26\xd2\x86\x04\x7f\x6b\x98\x53\xee\x67\xd2\x41\xb4\xf2\x1d\x52\xf1\x4c\x04\xe8\x2e\xfa\xef\xad\x0d\xa5\x9b\x3e\xe1\x50\xba\x1c\xe2\xbc\xc8\x1a\xac\xaf\x3c\x42\x9d\xcf\x06\xf3\x3e\xd0\x72\x61\x4d\x66\xe0\xde\xf4\x4f\x13\xb6\xe5\xaf\x2a\x12\x13\xbf\xe4\x9f\xaf\x7e\x8c\xce\x2f\x59\x8a\x11\x26\x04\x77\x1e\x90\x26\x39\x11\x76\x8d\xb9\x73\xf5\xb1\xbf\x0b\xe7\xcc\xf7\x34\x13\x33\xf9\x23\xdd\xc9\x89\xcd\x06\xa1\xed\x63\x39\x71\x41\xd2\xd8\x73\x1c\xf1\xe3\x97\x30\xf2\xd2\x30\x99\x7a\x32\x21\x36\x63\x1f\xc2\x14\x63\xc9\x13\xce\x40\x8a\x8f\x65\x3c\xc3\x6b\x67\x6f\xa5\x16\x41\x3e\xe9\x88\x31\x99\x31\x4e\xd7\xbd\x28\x10\x61\xa4\x9f\x2d\x80\x7b\xf1\x29\xdb\x24\x17\x5f\x29\x77\xdb\xff\xae\x37\x38\x74\x7c\x53\x22\x70\xe0\x47\x5d\x39\xb4\x04\xe8\x36\x12\x99\x56\xd1\x47\xbf\x0d\xf6\xdb\xb7\x4f\xbf\x29\x23\xf5\x46\x76\x5d\x53\x9f\x67\x1f\x89\xa3\x9b\x6a\x1f\xff\xe7\x6c\x46\x8c\xa0\x69\x63\xf8\x6b\x59\x95\x81\x53\x1b\x58\xd1\x9b\x8f\x40\xff\x8f\xf8\x5e\x9a\x07\xdc\x0e\x45\x34\xeb\x24\x42\x76\xcc\xfc\x53\x00\x9b\x67\x00\x89\x2a\xe5\xb0\x48\x8f\x84\x91\x1d\x05\x08\x2c\xe9\xf9\xf7\x9d\xe4\x7e\xf6\x1b\xf2\xd2\xfa\x9d\x66\x20\xd1\x0d\x42\xdf\x12\xf0\x30\x3f\x55\xf8\xdc\x66\xff\x49\x1e\x21\x61\xcd\x14\x80\xd5\xe2\x19\xa0\x12\x74\x16\x16\x78\xd6\x90\x98\xd1\x05\x0e\x96\x8c\xa0\x16\xef\xb9\xe9\x3b\x14\x2a\x3f\x2d\x3c\x09\x70\xa4\x3f\x09\x7f\xc9\xa0\x41\x7f\x03\xbc\x6a\x5a\x43\x57\x9b\x82\xea\xfe\x42\x6c\x51\xa7\x85\x86\x95\x7a\xf0\x7e\xc8\xb9\xce\xe0\xb2\x10\x29\xee\x68\x35\xa5\xbf\xe3\x10\xa9\xa5\xdf\xe7\xbf\xca\x87\xf1\x2c\x37\xea\x49\x34\x81\xdf\x18\x37\x40\x57\x40\xa8\x95\x4f\x13\x1c\x5c\xf3\xe4\xdb\xfe\x93\xd0\x60\xbc\x47\x71\x89\x67\x8f\x51\x5c\x61\x72\xe8\xc1\x79\xb4\xc4\x1c\xce\xc0\xe7\xa1\xc0\x6a\x34\xb9\x20\x9a\x07\x38\x3b\x2f\x56\x6c\xbe\x61\x85\x47\xd0\xda\x4c\x8d\x24\xa8\xf3\x4d\x06\x37\x1e\x6d\x06\x2f\x24\xab\x63\x95\x14\xfa\xb5\xa1\xb5\xf3\xa3\x65\x0e\x24\x30\xe0\xd9\x28\x60\x48\x3c\xce\x91\xe6\x12\x80\x68\xc3\xd1\xba\xb8\xcf\x6f\xf9\x82\x17\xac\x49\x55\x25\x6a\xab\x5a\x64\xaa\x59\x46\x2f\x26\x17\xc6\x19\x1c\x76\x6d\xb5\x9e\x6f\xd2\x70\x45\x2f\x77\x80\x78\x6a\x9b\xac\x40\x77\xa4\xba\x16\x50\xe2\x38\xdc\x76\xd1\xb3\x71\x32\xb9\xf6\x8b\x9a\x88\x69\x7f\xb2\x33\x41\xd8\x30\x87\x3d\x80\x66\x12\xa3\xf7\x88\x21\x45\x48\xde\x0a\x77\xf8\x2f\x57\x13\x19\xec\xad\xab\x82\x77\x73\x1d\xc6\x34\x96\xeb\x89\x1e\xd9\x75\xa4\x02\xa0\x1a\xbd\x67\xc3\x72\xda\x4e\xf9\xc2\x9d\x2b\xc5\x05\x13\x6c\x27\xca\xa5\xa7\xac\xd9\xfc\x29\xdd\xa3\xdb\x4e\xa6\x23\x1e\xe4\xfe\x52\xa9\xcd\x52\x31\xda\x85\x25\xb7\x4d\x6d\xe1\xa6\x41\xda\xd2\x96\xf6\xc4\x1c\x8f\x43\x8d\x8e\x26\xe3\xfd\x4a\x27\xce\x51\xad\x5f\xca\x8e\x59\x2e\xc7\x24\x03\xa3\x72\x64\x3d\x63\x43\x5a\x24\xc1\x90\xcd\xd0\xa0\x9b\x99\x21\x5c\x53\xb0\xf9\x68\x45\x58\x78\x61\x54\x63\xc2\x0d\xd4\xc3\xf4\x77\x15\xf5\xd2\x93\x31\xe1\xb6\x27\xf6\x03\x45\x38\xe4\x04\x31\x23\xb3\xd4\xf4\xb8\x48\xf3\xfd\xaa\x9c\x34\x46\xbb\x88\x28\xff\x7b\xff\x5f\xd0\x74\x27\xd4\x3a\x1c\x6c\x66\x28\x96\x87\xfc\x2c\xd6\x42\x25\x8e\x71\x35\x0b\x71\x60\x9d\x72\xaa\x28\xbf\x49\x6b\x25\xa4\xb6\x8f\x7e\x14\xcd\xa3\x63\x19\xf0\xa8\xb7\xdc\x24\x50\x96\x0b\x49\xb9\xe6\x4f\x5d\x28\x44\xcb\x2b\xce\x7f\x35\x4e\xcb\xd1\xfc\x44\xfc\x2c\xfe\x38\xd1\x88\xf3\x82\x03\x83\xf4\xb0\x62\x79\x6b\xc8\x52\x51\x17\x53\xe8\x83\x1e\x92\x7a\x9f\x63\x23\x12\x21\xc7\x9f\x90\xaa\x5a\x36\x1a\xd6\xe9\x3d\xad\x6a\x8f\x39\xd2\x2c\xad\x54\x9d\x56\xb1\x57\x7e\x03\xe1\x21\xe2\xc7\x93\x8a\xd1\xa7\xd0\xab\xfe\x96\xa5\x51\xef\x3b\x70\xe3\x75\x2f\xa3\x96\x00\x15\xe3\x94\x30\x8f\xff\xab\x73\x7a\x94\xba\xc4\xbc\x45\xbe\x87\xe5\x4e\xcc\x47\xf2\x44\x3c\xba\xb0\x1a\x86\xce\xb1\x61\x61\x80\x05\xfe\x5a\x5b\xd2\xfb\x43\x60\x1e\xb2\xf0\x95\x9c\x22\x32\x18\xe7\x26\x9e\x20\x46\x8c\x79\x1c\x70\x0e\x53\x2a\xf6\x9e\x67\x53\x12\x0f\x58\xe1\x0f\x98\x1b\x8d\x3e\x01\x20\xe1\x7a\xc6\x26\x6b\x7c\x28\x22\x41\x9f\x0f\x0b\x9d\x79\xa0\x92\xf8\x10\xa3\x71\xc5\x06\xb3\x3a\x9a\x7f\x7e\x2e\xf8\xae\xd7\xf3\x53\xaa\x96\x70\x4e\x7e\x72\xfc\x03\xd9\xf1\xe8\x1b\x97\x4c\xfa\xd2\x91\x9e\x7d\xa0\xfb\x3b\xbc\x75\x5b\x29\x19\xab\x99\x7d\x8d\x69\x2e\xe0\x79\x55\x75\xae\x4c\x05\x59\x54\xa6\x42\xf7\xca\xbd\x9c\x26\x52\x91\x48\x26\x1b\x76\x97\xa2\x6f\x6a\x80\x66\xa1\xbd\x9c\xf8\xd8\x01\xe6\x77\x12\x2b\xd2\x22\x6e\x55\x66\xe7\x95\x91\xa0\x00\x5f\x37\xe0\xeb\xcc\xbc\x42\xcb\x5a\x52\x31\x2b\x6f\x5f\xe7\x9b\xb5\xe0\x74\xd1\x04\xf8\x06\x0e\xc7\x27\x8a\xda\x5d\x75\xbb\x83\xfd\xd5\xfc\x7f\xa2\x02\xe4\xc3\xaa\x6e\x9b\xb4\x7b\x99\xdc\x13\x57\x9f\xfe\xf6\x37\x20\x73\xd0\x74\xfe\x22\xb9\x57\x81\xe9\x9b\x6b\x82\xa6\x76\x81\x7c\xdc\xf2\x7f\x9a\xdd\xdd\x9a\xdf\x61\x20\xa8\x1e\x30\x3a\x0d\x60\x4a\xdf\x1f\x01\x6d\x19\xee\x79\x84\xa3\xf9\x7f\xfc\x6f\x00\x00\x00\xff\xff\x31\xab\x8d\xd1\xac\x6b\x01\x00") +var _pagesAssetsJsJquery1102MinJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\xbd\x7b\x93\xdb\x36\x96\x28\xfe\xff\x7e\x8a\x26\xc7\xcb\x00\x16\xc4\x96\xec\x64\xee\x86\x32\x9a\xd7\xb1\xe3\x49\x76\xf2\x9a\xd8\x33\xc9\x2c\x45\xa7\xd8\x22\x24\x31\xa6\x40\x85\x84\xba\xd5\x11\x39\x9f\xfd\x57\x38\x00\x48\x90\xa2\x3a\xde\xbd\xf7\x57\x75\xcb\xe5\x16\x09\xe2\x8d\x83\x83\xf3\xc6\xf5\x53\xe7\xea\xd7\xbf\x1d\x58\xf9\x70\x75\x37\xf7\xe7\x33\xff\xd9\x55\x7d\x85\x56\xf8\xea\xd9\x6c\xf6\x19\xb9\x7a\x36\x9b\x3f\x37\xdf\xdf\x14\x07\x9e\x26\x22\x2b\x38\xb9\xfa\x9a\xaf\xfc\xab\xfa\xea\xd7\xdf\xe4\x17\xbf\x28\x37\xd7\x79\xb6\x62\xbc\x62\xff\x76\x7d\xfd\xbf\xaf\xaa\xe2\x50\xae\xd8\xb7\xc9\x7e\x9f\xf1\xcd\xdf\x7f\xfc\x86\xea\x7c\xbb\x8c\xfb\xbb\x64\xff\x6f\x4f\xaf\xff\x0d\xad\x0f\x7c\x25\xeb\x42\x8c\x08\x7c\xba\x4b\xca\x2b\x4e\x4a\x92\x51\xf1\xb0\x67\xc5\xfa\x4a\x90\x82\x32\x3f\x2f\x56\xaa\xc1\x84\x32\x3f\x2d\x56\x87\x1d\xe3\x82\x54\x34\x69\x5f\xbe\xcc\x19\xa4\xe5\x94\xf9\xaa\x9f\xe4\x40\x99\xff\x84\xac\xe8\xa9\x21\x7b\x1a\xc5\x64\x4d\x5d\x35\x32\x97\xa4\x74\xef\xaf\x0a\xbe\x4a\x04\xd9\xd2\xbd\xbf\x3f\x54\x5b\xb2\xa1\x7b\xbf\x92\xbd\x27\x3b\xba\xf7\x33\x9e\xb2\xe3\xf7\x6b\xf2\x40\x57\xbe\x28\xde\x8a\x32\xe3\x1b\x72\x47\x57\xfe\x36\xa9\xbe\xbf\xe7\x3f\x94\xc5\x9e\x95\xe2\x81\xdc\xd2\xb5\x2f\xca\x6c\x47\x8e\xb4\x3f\x92\x92\x89\x43\xc9\xaf\x38\xbb\xbf\x3a\xfa\x6b\xee\x67\x3c\x13\xf2\x0b\x29\x71\x43\xee\xe9\x75\x34\x99\xc6\x21\x0a\x83\x65\xfa\x74\xe9\xd7\x78\x99\x4e\x50\x18\x44\xec\xcb\x18\x3e\x2c\xd3\x49\x8d\xaf\x7d\x35\x81\xe4\x1d\xbd\x5e\xbe\x9d\x5c\x6f\xc8\x2b\x7a\xfd\x3e\x5a\x56\xcb\xc3\x9b\x2f\xdf\xbc\x59\x1e\x5f\xce\xe2\x49\x3d\x78\x7f\x72\xbd\x21\xdf\xd1\xeb\xf7\xb2\xea\xea\x29\x7a\x11\x2d\xef\x97\x3f\xc5\x93\x1b\x1c\xbd\xbf\x89\x9f\xd6\x7f\x42\xd1\xf2\x7e\x1a\x3f\xc5\xf8\xc9\x35\xf9\x40\xaf\xdf\xbf\x40\xcb\xfb\x09\x5e\x56\x4f\x97\xd7\xe1\x0d\x0a\x83\x17\xcb\xeb\xe5\xfc\xa6\x96\x9f\xbf\x84\xd6\x62\x12\x9c\x9a\x65\x15\x3f\x7d\x72\x4d\xde\xd2\x6b\x14\x06\xef\xeb\xa0\x26\x58\x35\xb0\x8c\xb0\xec\xd8\x4b\x7a\xbd\x5c\xca\x01\xb8\xcb\xe5\xf2\xfa\x76\xcd\x4b\x11\xd7\x87\x68\x99\x26\xd3\xf5\xcb\xe9\x9b\xf8\xf4\x69\x83\xaf\x37\xe4\x57\x7a\xed\x46\xef\x65\x9e\x72\xc9\xe3\xa7\x6e\x2d\xca\x03\xab\xd7\x49\x5e\xb1\x9a\x1f\xf2\xbc\x9e\xaa\x29\x99\x5c\x9c\x92\x0d\x79\x4d\xaf\xdf\x4f\x77\xd5\xf4\x9a\x7c\x43\xaf\xa7\x08\xda\xf8\x3d\xc6\xd7\x9b\x8c\x7c\x35\xbe\x06\xc2\x17\xc5\xdf\xf7\x7b\x56\xbe\x4a\x2a\x86\x70\x43\x7e\xb3\xf2\xe1\x13\x4a\xfc\x24\x4d\xbf\xbc\x63\x5c\x7c\x93\x55\x82\x71\x56\xd6\xb5\x9b\x17\x49\xea\x52\x4a\x99\x2f\x21\xb1\xae\xdd\x55\xb1\xdb\xe7\x4c\x30\x99\x98\xf8\x25\x4b\xd2\x87\xb7\x22\x11\x0c\x7b\x1e\xfa\x05\x61\x72\x54\x69\x08\xe3\x86\xfc\xd2\x35\x80\x4f\xe7\xd5\x87\x48\x56\xb0\x2b\xee\x58\x2f\x19\xb9\xaf\xbf\xff\xf6\x55\xc1\x85\x4c\x2b\x92\x94\xa5\x2e\xf9\x8d\x38\x73\x4c\xd8\x78\x76\xe8\xa3\xca\x82\x03\x94\xf8\x29\x13\xc9\x6a\x0b\x99\x90\x5b\x70\xe8\x4f\x25\xfb\xb8\xda\x26\x7c\xc3\x5c\xf2\x9b\xac\x6a\x90\x4b\x57\x82\x71\xb3\x90\x80\x4a\x8f\xfe\xbe\x2c\x44\x21\x47\x4d\x4f\x6a\xc3\x06\x6b\xb2\x2a\x78\x25\xca\xc3\x4a\x14\x65\x70\x24\x12\x98\x03\x6b\xae\x39\x29\xd5\xde\xcd\x48\xb1\xc8\xd6\xc8\x61\xd8\xcc\xfd\x36\xab\x64\x8a\x5b\xc1\x16\x72\xa9\xd9\xd8\x0c\x9f\xb2\x35\xca\xa8\xfb\x42\xcd\xf2\x6a\x9b\x94\x2f\x05\x9a\x61\xcf\x73\x6f\x7a\x49\xcc\xcf\x19\xdf\x88\xed\x74\x8e\x3d\xcf\xbc\xdc\xd0\xe7\x61\x24\x41\x86\x30\x22\x7f\xe2\xe0\x3b\x9f\x1d\xd9\x0a\x31\x4c\x9c\xac\xae\x9d\x2c\x9a\xc7\x9e\xc7\x75\x3f\x1c\x5e\xd7\xdc\x57\xa3\x09\x11\xaf\xeb\x12\xfb\xeb\x8c\xa7\x88\xe1\x40\x76\xd1\xb7\xc6\x87\x78\xfb\x4d\xf6\x5c\x56\x04\x7d\xe5\x94\x5f\x65\xbc\x12\x09\x5f\xc9\x01\x1c\x43\x1e\xcd\xe2\x80\x93\xa3\xbf\x63\xe5\x86\x21\x59\x0f\x39\xfa\xfb\xa4\xac\xd8\x57\xef\xbe\xfd\x06\x4a\x12\xee\x79\xdc\xe7\x45\xca\xde\x3d\xec\x59\xc8\xfd\xe2\x9e\xb3\xf2\xb5\xc6\x5a\x75\xcd\x83\x84\x38\x33\x8c\xc9\x07\x5f\xb0\x4a\xa8\xd6\x3c\xef\xe8\x67\xd5\x0f\x79\x92\xf1\xef\x6f\x7f\x65\x2b\x81\x38\xc6\xeb\xa2\x44\xd9\x55\xc6\xaf\x38\x96\x5f\xdf\x98\xd9\x97\xcd\x46\x59\x8c\x43\xfd\x80\xb8\x7c\x53\xa3\x4a\x84\x28\x51\x46\x20\x65\x61\xad\x48\x93\xad\x51\x41\x13\x7f\xc3\x0c\xe2\xfc\xe2\xe1\xeb\x14\x65\xd1\xb3\x18\x93\xc2\xf3\x0a\x39\x0a\xc6\xc5\x77\x45\xaa\xd6\xa9\xf0\xb3\xd4\xa1\x14\x32\xe8\x7a\xca\x76\x92\xa0\x29\xb5\x2c\x74\x4e\xa0\x1b\xb3\x98\x16\x8d\xd5\xa0\x9c\x5f\xc1\x8e\x82\x26\xf0\xdd\xaf\x58\xce\xe4\x5c\x53\x06\xef\x26\x2b\xeb\x66\x0a\xf5\x8a\x99\x4a\x55\xf6\x7e\x63\x38\xe8\xcd\x07\xc3\x61\xa9\xb7\x22\xc3\x01\x62\x6d\x5b\x0e\xa5\xc2\xf3\xd0\xa0\xfd\xf6\x91\xf4\x1a\x64\xe6\x49\x6e\xec\x5d\xf2\x81\xbd\x2c\xcb\xe4\x01\xa9\xf6\xe5\x16\x37\xc5\x02\xd7\x25\xaa\x3b\xc1\x8c\x88\x02\xb2\x05\xd6\xee\xd7\x23\xdb\xf8\xab\x24\xcf\xa1\x71\xdc\x90\x0d\xb3\xb7\x4f\x77\x58\x1c\xf2\x9c\x52\x06\x2b\xe9\xeb\xba\x10\x0e\x66\x37\x2a\x29\xb2\xc6\x3e\x61\x31\x2c\x71\xc4\xe2\x86\xc8\xf3\xeb\xad\x48\x56\x1f\x7a\x95\xca\xfd\x28\xa8\x0d\x9d\x3d\x28\xc7\x84\x75\x30\xe1\xef\x4b\x76\xa7\x60\x0d\xe6\x9a\x88\xde\xd4\x9b\x17\x22\x1a\xc2\x92\xd5\x36\x18\xc5\xb3\x47\x5f\x7e\x53\xfb\x40\xa6\x37\x04\x96\x61\x6c\xa4\x1a\x59\x4a\x54\xb3\xcb\x24\x52\xf6\xd3\x82\x33\xb9\x79\x01\x1c\x08\x1c\xc4\x23\xd3\x08\x9d\x69\x87\x8b\x36\x7e\xb2\xdf\xe7\x0f\xaa\xc9\xa4\xdc\xc0\xa6\x82\xe5\x59\x67\x65\x25\x2e\x55\xc0\x7e\x43\x33\xdc\x90\x3c\x79\x34\xcb\x74\x8e\x1b\xc2\x7e\x1b\x99\x53\x6b\x1d\x08\xa7\x13\x36\x41\xb0\x44\xc1\xac\xb7\xc9\xac\x7e\xf2\x1b\x3a\xf3\x3c\x71\xc3\x43\x58\xc3\x88\xc7\x71\x10\xc5\xb8\x21\xbb\x64\x3f\x36\x3d\x83\xe2\x12\x02\xf7\x6a\x90\x6d\x66\x41\x78\x9b\x9d\x69\xe0\x22\x5c\xce\xba\x1c\x3e\xe3\xe9\xc5\xd9\x6b\x57\xba\xae\xcf\x51\xdf\x21\xcf\xb1\x02\xa8\x60\x4b\xaa\xa2\x14\x41\x14\xfb\xf2\x97\x54\x7b\x58\x13\xf9\x0a\x4f\x0d\x69\xe9\x1a\xeb\xc4\x90\x69\xe4\xe8\xb3\xa3\x60\x3c\x85\x37\xf3\x6c\x75\x47\xce\x22\x1c\x1a\x24\x23\x05\x49\x24\x21\x67\xd6\x2e\x9a\xc5\x75\x7d\x6a\x48\x4e\xe7\xe4\xd0\x25\x9b\xd9\x5e\x51\x67\xbe\x90\x98\xd0\xbd\x2d\x8a\x9c\x25\xbc\x3b\x50\x2a\xcf\x43\x2b\x5a\xf5\x2a\x9b\x9b\xca\x9e\x61\xe2\x16\x30\x68\xab\x40\x5d\xf7\x10\x47\x85\xeb\x1a\x55\xf4\xd4\x60\x72\xa0\x94\xe6\x9e\x87\x2a\xb5\x19\xa6\xd3\x1c\x2f\x0e\x37\xf9\x22\x9f\x4c\xb0\x3c\x09\x0e\x79\xee\x50\x89\x41\xdb\x96\xf2\xd8\xc2\xd0\x05\x66\x54\xa2\x62\x52\xd2\x42\xfe\x54\x0e\xa5\xa5\xec\x9e\xe7\xc9\x9f\x21\x72\x2f\x65\xc3\xf2\xe0\xcd\x2a\xb5\xe5\x4b\x8c\x71\x88\x78\x88\x38\x75\xe6\x92\xe6\x55\x07\x82\x46\x41\x38\x94\xab\x80\x83\x36\xdd\xae\x0b\xbe\x9e\x1a\x22\x9b\xa7\x66\x1d\xd0\x8a\x24\xa4\xc4\x38\x30\x38\x10\xbe\x96\xb8\x05\xd7\xaa\x69\xd7\x0c\x9d\xd8\x71\x9f\xf0\xb4\x08\x5c\x45\x47\xbb\x13\xb4\x9e\x7c\x9b\x88\xad\x5f\xca\xe4\x1d\xc2\xd8\x2f\xd9\x3e\x4f\x56\x0c\x5d\x2f\x5f\x5f\x6f\x88\xeb\x62\xc2\x8b\x57\x05\x5f\xe7\xd9\xca\xda\x51\xc2\x02\xd0\x27\x94\xd2\xa3\xe7\x21\xf9\x74\xc0\x44\xc8\x93\x5c\xd5\xdf\x7e\xd0\xaf\x39\x26\xc7\x86\x64\xd5\x8f\x80\x3b\x9c\xb9\x42\x22\x3f\x25\x99\x08\xe6\x64\x5b\xe4\xe9\x8f\x67\x48\x85\x85\x1a\x9f\xc8\x5c\x93\x49\x60\x48\x31\x67\x36\x8a\x83\xb2\x35\x62\x94\x52\x67\x16\x3a\xd3\xa9\x55\x32\x70\xe4\x6c\x42\xf5\x90\xc9\x49\xfc\xdb\x22\x7d\x30\x07\x5e\xc5\xc4\xbb\x6c\xc7\x8a\x83\x40\xba\x10\x5e\xb4\x05\xa8\x33\x23\xcc\x91\x95\x7a\x5e\xaf\xd2\x9b\x99\x5c\x5c\xbf\x64\x55\x91\xdf\xb1\x9f\x32\xb1\x45\x09\x89\x8e\x31\x56\xdb\x47\x94\xd9\x66\xc3\x4a\xcf\x3b\xa2\x04\x9b\x37\xe4\x42\x71\x17\xfb\xc5\x7a\xdd\xbe\xe0\x46\x4e\x8b\x01\xd7\x11\xb4\xe1\x9a\x24\x49\x3e\x1d\x81\x6e\x45\x0c\xcb\x42\xea\x54\x82\xbf\x06\x8e\xea\x7a\xa4\x82\x44\x7e\x39\x2b\xfd\x53\xc6\xd3\xe2\xfe\xd2\x81\xe5\x48\x30\x64\x92\x5e\xbb\x87\x7c\xb2\xc4\x77\x87\x1d\x2b\xb3\xd5\x48\x11\x27\xab\xbe\x4b\xbe\x43\x40\x24\xbd\xc9\x8b\x44\x42\x2c\xf6\xbc\xac\x7a\x23\x11\x89\x6a\x51\x36\xfd\xd8\xf1\xc8\x26\xae\x1b\x9c\x6d\x67\x49\xa3\x5b\x13\x60\x52\xc3\x55\xf4\xa0\xd0\x23\xc3\x71\x5d\x9b\x62\x81\xf9\x2e\xbb\x6b\x6d\xa0\x33\x6c\xcf\x15\x3d\xdb\x95\x74\xac\xd9\xa9\xeb\x8e\x62\x51\xd8\x44\xcd\x95\x1c\x94\x1e\xef\x7c\x21\xca\x07\x00\x39\x1b\xd1\x7a\x9e\x73\xa7\x7b\x45\x5c\x2b\xdd\xc5\xd6\x17\xbb\x40\x87\x62\x89\x9b\x55\x3f\x98\x97\xef\xd7\x6e\xd7\x52\xb3\x4a\xc4\x6a\x8b\xca\x76\xae\xe7\x92\xce\x3b\xfa\xd5\x61\xbf\x2f\x4a\x21\x49\xcf\x6f\x92\x4a\x00\x9e\x92\xa4\xec\x55\x4b\xa5\xb7\x7d\xe1\x78\x61\x7d\x35\xe8\x81\x53\x4a\x45\x5d\x5b\xb9\xe4\xac\x7d\xb9\xdb\x8b\x87\x0b\xb3\x26\xa0\x1a\x61\x37\xe2\xcc\x75\x75\xce\xac\x21\xac\x2c\x8b\xb2\x57\x4a\x6c\xcb\xe2\xfe\xea\x4b\x99\x0e\x40\xd0\x92\xd1\x3d\x5a\x43\x1e\x7a\x66\x3d\x34\x47\xe1\x74\x1c\x85\x05\x27\x8b\xf3\x03\x42\x22\x3e\x4e\x05\x11\x54\xb2\x54\x42\x8e\x28\x59\xc8\xce\x96\xf4\x43\xcb\x3b\x64\xd4\xe1\x9e\x17\xc5\x66\xe8\x65\x18\x09\x7f\x55\xb2\x44\x30\x4d\x29\xa3\x52\x92\xe8\x71\x80\x4a\x7a\xf4\x6f\x0f\x59\x9e\xbe\x29\x93\x0d\x7c\x89\x58\x4c\x04\xc9\x30\xc9\xe4\x7e\xce\xb0\xe6\xda\x80\x39\x54\x54\x58\x14\x93\xd2\x5f\x6d\xb3\x3c\x95\xa4\x35\x50\x2a\x30\xd0\xff\x7c\xfb\xfd\x77\xdd\x40\xed\x93\x5d\x7e\x91\xc8\x52\xfe\x2a\xde\x22\xb4\x5f\x10\xc7\x81\xda\x17\x94\x87\x3c\x38\x63\xb3\x38\x0c\xfa\x08\x32\x0a\xc4\xb1\x64\x47\xbe\x54\x9c\x06\x6f\xb1\xf8\x4b\xe2\xfe\x6f\xb7\x43\xea\xbf\x12\x37\xb6\x5e\xdf\x4a\xfc\x8e\x71\xd8\x9e\x93\xae\xee\x9b\x3b\xe1\x18\xe1\x00\x1d\x7d\x58\x4d\xe4\x7e\xcd\xef\x92\x3c\x4b\xaf\x60\x30\xf0\x19\x88\x40\xe8\xe7\xcf\xf6\x42\x72\x05\x24\x25\xc9\x60\x73\xf1\x91\xc5\xe4\xbd\xc5\x94\x5b\x88\xf9\xaf\xbf\xff\xf6\x07\x59\x57\x19\xa2\x8c\x72\x76\x7f\xd5\x26\x90\x92\x66\x6a\x3e\xde\x94\xc5\x4e\x49\x6b\x10\x27\xae\xa4\x59\xaf\x8f\xbb\xdc\x95\xfc\x71\x09\x65\x5e\xae\x44\x76\xc7\x7e\xd6\xc7\xa5\xfb\x6d\xb6\x2a\x8b\xaa\x58\x0b\xff\xe7\x6f\xbf\x79\xfd\xfd\xb7\x2e\x26\xa5\x9f\x54\x0f\x7c\x45\x5d\x90\x4b\xb8\xa4\xf4\x25\x8b\xfc\xf3\xb7\xdf\x48\x2e\x4c\xef\xb1\x02\x9f\x4a\x2a\x0c\xdb\x52\x7a\x5e\x39\x94\x44\x79\x9e\x53\x5a\xfc\x55\xf5\xc5\xc3\xbb\x64\xf3\x5d\xb2\x63\xc8\x85\x8e\x96\x30\x69\x2e\xd6\x94\x8d\xc4\x1e\x83\x69\x94\x53\xa6\x66\xb1\x6c\x08\x2f\x8a\xbd\x4d\xd1\x35\x64\x93\x17\xb7\x49\xfe\xe5\x5d\x92\xf7\x4e\x5c\x21\x69\x02\x58\x6d\x81\xe1\x58\x95\x90\xfd\x76\x55\x66\x7b\x61\xa1\x7c\x81\x4f\xcc\x67\x77\x49\x6e\xb6\xb4\xa4\x1b\x91\x5c\xad\x55\xb2\x63\xf9\xab\xa4\x1a\xc5\xc0\xac\x85\x8a\xd7\xc4\xdd\x55\x53\x0b\x4c\xbe\x21\x5f\x61\xd9\xcd\x94\xc9\x41\x8e\x33\x08\x0a\x59\xca\xef\x12\xa2\xcd\xb3\x2f\x8a\x6f\x8a\x7b\x23\x9d\x91\xa8\xa6\x9f\x32\xc2\x72\x90\x0e\x82\xe8\x4c\x49\x08\x15\x7d\x98\xd0\x6f\x35\xdb\xae\x10\x45\x82\x4f\x12\x11\x2d\x8a\x9b\x6c\x91\x29\xe2\xad\xa4\x42\x73\x0d\x4c\xd2\x66\x72\x7a\x25\x31\x30\xc7\xb7\x25\x4b\x3e\x34\x2c\xaf\xd8\x55\x4b\xc9\xb1\x8f\x2d\x71\xb9\x2d\x35\xc1\xb2\x60\x46\xe4\xcf\xc7\xb5\xf7\x78\x29\x83\x9d\x58\x43\xe4\x52\x07\xb7\x9e\xe7\xdc\xaa\x32\xee\xf2\xb0\x66\xeb\xf5\xf2\x30\x9b\x25\x33\x17\x87\x8f\x9c\xa3\xae\x1b\xdc\x9a\xa3\xb1\x79\xec\xc0\x75\xdd\x00\xc9\x43\xb7\x5b\xed\x57\x12\x29\x48\xf6\x45\x33\xc6\xc1\x88\x18\x57\x22\xd8\x0e\x91\xb6\xa4\x02\xfa\x16\xb5\xb4\x2a\x0e\x0d\x62\xe4\xe4\x5c\x42\x14\x46\x2c\x0e\x18\x0e\xb6\xaa\x93\x9c\x30\x8c\x09\x6f\x48\xc6\xcf\xdb\x6c\x21\x42\xae\xbd\x80\xb5\xdf\x19\x14\xb2\x33\xec\x51\x7b\xbe\xc9\x19\x6e\xf9\x37\x1e\xce\x6e\x78\x08\x14\xee\x2e\x39\xa2\x19\x29\x27\x12\xa9\x06\xb3\x45\x79\xc3\x17\x5c\x93\xfc\x72\x75\x84\xe7\x89\x88\xc7\x94\xd2\xee\xac\xd1\x38\x60\x3a\x6f\x08\x8c\xa4\x27\x16\xd3\x7d\xa2\xdc\xb4\x96\x75\xa0\x5a\xd0\x19\x08\xc6\xf8\x61\x77\xcb\xca\x6e\xd8\x25\x9c\xcf\x8b\xf2\xa6\x58\x14\x93\x09\x66\x51\x36\x99\xc4\x94\x47\x45\xbc\x00\x58\xb9\xdf\x66\x39\x43\xf2\x5d\x12\xf3\xd6\xf7\xc9\xa4\x9d\x6c\xd3\x08\xcd\x08\x6b\xc8\xa6\x64\xfb\x8b\xdb\x27\x8a\x65\x4f\x40\xb0\xae\xca\x28\x02\x80\x3a\x0e\x5f\x24\xba\x0f\x25\x75\x1c\x81\x58\x54\xc4\xa4\xc0\x84\x2b\x6e\x26\x03\x06\x15\x52\x5b\x42\x21\x1b\x72\xb4\x7f\xb8\x55\x49\x45\xa3\x78\x01\xbb\xa7\xb7\x79\x4a\x2a\x0c\xf8\xcb\x53\x0b\x80\xa7\x04\xce\xc5\xf0\x82\x92\x81\x59\x0c\x77\xcf\x47\x16\xd3\xdd\x4d\xf5\xb6\x8e\x62\x02\x52\x99\x43\x96\x06\x73\xb2\x2f\x8b\xe3\xc3\xd8\x32\x4a\x6e\x55\x17\x1d\x3d\x67\x0b\xca\x22\x1e\x13\x4e\x19\x61\xb4\x90\x87\x7e\x5f\x2c\x85\x4a\xaa\xc5\x40\x2d\xdf\x48\x9e\x49\x92\xe3\x9c\x53\x67\xba\x67\x5c\xf1\xe8\x92\x68\x00\x75\x05\x1a\x56\x80\x25\x09\x91\xf9\xb2\xeb\x94\xd9\x3f\xf2\x40\x91\xbf\x93\x09\xc9\x70\x20\x1a\x92\xac\x56\xac\xaa\x06\x52\x5b\xc3\x80\xab\x11\xe6\x74\x06\x5a\x93\x96\xd9\x56\x08\x00\xf6\x54\x47\x6f\x1b\xf2\xb7\xc4\xf8\x54\x50\x67\x06\x00\x93\xcb\xf9\x2f\xf1\xd1\x57\xcd\x40\xed\x39\x29\xa3\x3c\x26\xce\x0c\x5a\x68\xf1\x64\xa6\x99\x50\x59\xb6\x3f\x47\x99\xe2\xc0\x9d\x19\x26\x2b\xb9\x68\x21\xe2\xe6\x7c\xca\xb0\xdc\xa9\x87\x3c\xc7\x01\x5a\x51\x4e\x38\x1d\x02\x99\x9e\xb9\x95\x2a\x71\x94\xb0\xc5\x71\x23\x31\x86\xe2\xcc\x5b\x06\x9e\x23\x26\xbb\x55\x92\x2a\xcc\x82\xcc\x60\xda\x3c\x26\x39\x31\x9f\x70\xc7\x1a\x17\x21\x0b\x56\xa1\xe9\x07\x0e\x0e\xa1\xcc\x34\x93\x99\x82\x44\x1e\x78\xf7\xe7\x82\x16\x04\xc4\x49\x22\x18\x96\x14\x80\x64\x1a\xe5\x29\x56\xdd\x9f\x6d\x0d\x4b\x6c\x4e\x12\x7a\x6a\x60\x2a\x0b\x40\x35\x38\x89\x8a\x98\x32\xbf\x12\x0f\x39\xec\xbc\xee\x91\x0a\x89\x0c\x32\xca\xcd\xa9\x44\x4a\x89\x69\xb1\x5d\xda\xca\x2d\x2b\xea\x36\x68\xd3\x6a\x2a\x8c\xf0\x8d\xda\x54\x01\xd0\x63\x80\xf0\xe8\xd1\x7f\xcd\xd6\xac\x2c\x59\x8a\x30\xb9\xac\xfe\x18\x63\x8b\xdb\x23\xf1\x4c\xf5\x81\xcf\x93\x1e\x53\x7b\x9c\xe7\xb5\x74\x1e\xd0\xcc\x29\xf1\x13\xf1\x31\x6a\x8f\x41\x2e\xa3\xf6\xd0\x1c\x80\xe6\xd3\x4a\x0d\xf2\xcc\x5f\x97\xc9\x8e\xb5\xb4\xdc\x99\xa2\x51\xd3\x81\x19\x3e\x35\x9a\xfa\x7b\xbb\x2a\x8b\x3c\xf7\x3c\x33\x9b\x57\x05\x52\xd3\x69\x09\x15\xa0\x89\x36\x2f\x72\x73\xb6\x16\xae\xa1\x29\xbb\x73\xd7\x9a\xd2\x82\x7c\x36\xc3\x4d\x4f\xbf\xd4\x34\x08\x1b\xca\x93\xb7\x12\x54\x49\xbb\x69\x01\xac\xfb\x85\x62\x7d\xae\xbe\x83\xa3\xe5\x4a\xd1\xc3\x57\x66\x9b\x5d\xc1\xe9\x09\xf0\x79\xf5\x23\xdb\x7c\x79\xdc\x5f\xa9\x03\x59\x71\x5f\x2e\xc8\xf7\x04\x72\xaf\x5c\x4c\xfa\xc7\xfa\x2a\x72\x23\x85\x06\xae\xdc\x89\x98\xb8\xb1\x1b\x9f\x11\x6b\x78\xd1\x4e\xc0\xb7\x9d\xc4\x94\x75\xc7\x6d\xcb\x3c\x2f\x5a\x59\xb0\xc5\x36\x87\xce\x3c\x98\x83\xf6\xc7\xf0\xd5\x9e\x27\x42\x67\x16\x74\xb2\x09\x6e\x33\xfa\x0e\xa5\x12\xf5\xce\x14\x87\x7a\x76\x98\xca\x13\xfb\x66\xe6\x79\x62\x3a\x57\x07\x44\x53\xd2\x23\x4a\x86\x03\x6b\xd5\xce\x0a\x1b\x92\x9c\x1c\xc8\x8a\xec\xc9\x9a\xa4\x64\x4b\x36\x64\x47\x1e\xc8\x1d\xb9\xa5\x6e\x95\xfd\xfe\x7b\xce\xdc\xc9\xd4\xec\x70\x72\x6f\x6b\xa4\xdf\xd1\x19\x79\x45\x67\xe4\x3b\x5a\x09\x84\xc9\x07\xf5\xf3\xa5\xfa\x79\x4b\x9d\x39\x79\x39\xae\xa2\x64\xb2\xff\x21\x7a\x2b\x51\xe2\x0c\x07\xb3\x86\xfc\xda\x69\xc0\x5f\xd3\xf9\x8b\x17\xcf\xe7\xe4\x1b\x7a\x6a\x86\xfa\xe7\xaf\xe4\x01\xfe\x1b\xfd\xca\xdf\x17\x7b\xf2\x8b\xfc\x3d\x54\x5b\xf2\xad\x79\xf8\x9e\x7e\xa5\x95\xda\x6f\xe8\x57\x46\xa9\xdd\x17\xfd\xa8\x05\x9a\x11\x6e\x8b\xb5\x01\x95\x2c\xf8\x8d\x58\x08\x45\xff\x28\xfd\x43\x8f\xf4\x11\x8b\x8e\xf4\xf9\x82\xba\xab\x2d\x5b\x7d\x60\x69\xad\x14\x23\x2c\xad\x81\x8b\xaa\x93\x83\x28\xd6\xc5\xea\x50\xc1\xd3\x3e\x4f\x1e\xea\x55\xc1\x45\x59\xe4\x55\x9d\x4a\xfc\x52\xa7\x59\x95\xdc\xe6\x2c\xad\xb7\x59\x9a\x32\x5e\x67\xd5\x2e\xd9\xd7\x79\x51\xec\xeb\xdd\x21\x17\xd9\x3e\x67\x75\xb1\x67\xbc\x96\xf0\x5f\xf0\xfc\xa1\x2e\xd9\x6f\x87\xac\x94\x6d\xad\x8a\xbd\x44\x17\x3f\x50\x37\x5a\x2e\x8f\xcf\x66\xcb\xa5\x58\x2e\xcb\xe5\x92\x2f\x97\xeb\xd8\x25\x3f\x52\x17\x85\xc1\x72\xb9\x5c\xfa\x75\xb4\x5c\xde\x4f\xe3\x3a\x7a\xbf\x5c\x1e\x67\xb3\xe9\x72\x79\x4c\x66\x31\x9e\xb8\xe4\x27\xfa\x63\x4b\xd7\xba\xf7\x2e\x71\xef\xff\xe4\x62\xf2\x84\xba\xcb\x65\xe4\x4e\x7e\x98\xb8\x4f\x91\x3b\xf9\x71\xe2\x62\xfd\x12\x06\x28\x7a\xfa\xfe\x49\xed\xfc\x2b\x0e\xa9\x9d\xf8\xc9\xd2\x8d\x31\xea\x1a\x7c\x2f\x7f\x63\xfc\x34\xc4\xcb\xe5\xf3\x1a\xb9\x93\x9f\x26\x2e\xae\x71\xad\xcb\x2c\x97\xb1\x4b\xbe\xa6\x6e\xa0\xab\x87\x82\x08\xfd\x61\x3d\x83\x0f\x08\x47\xcb\x65\x1c\xd7\xee\xe4\x49\x3b\x8c\xe7\xe4\x3f\xf0\xc4\xc5\x4f\x71\xed\x3f\xc5\xcb\xa5\x6c\x92\xfc\x4e\xd5\x66\x47\xee\x7b\x68\x7f\x02\x35\xbd\x6f\xab\x37\xd5\xe2\xa7\xaa\x7f\x93\x27\x2e\x71\x37\x2e\x26\x3f\x0f\x0a\x3e\x25\xea\xc7\xc5\xe4\xef\xc3\x4f\x28\xba\x99\xfc\x4b\xf6\xe5\x87\x76\xbe\x5c\x4c\xfe\x61\xb2\xc9\xf7\x68\xf2\xaf\xd8\xc5\xe4\x9f\x6d\x51\x6a\x8a\xbe\x5f\x2e\x63\x39\xf6\xa7\xf6\x04\x41\x17\xfe\xd3\x64\xfe\x1a\x93\xbf\xd8\x6d\xfe\x34\x71\x9f\xb8\x98\xfc\x8d\x9e\xbe\x7e\x1d\xb4\xe9\x7f\x32\x0b\x86\xc9\xab\x6f\x5e\xbe\x7d\xdb\x7d\x59\x2e\xfd\xee\xdb\xbb\x97\x7f\xe9\xbe\xc8\xe4\x01\x18\x3c\x75\xb1\xca\xf8\xf2\xdd\xbb\x1f\x03\xab\xd5\x27\x98\xfc\xf0\xf6\xcb\xbf\xbf\xfe\xde\x4e\xfc\x1a\x93\x57\x5f\x7d\xfd\x8d\xd5\x8d\x00\x01\xb4\x82\x2a\xaa\xce\x93\x4a\xd4\x5c\x6c\xe5\xff\xa9\x7c\xc1\x53\x04\x82\xa0\xba\x58\x4f\xe5\x56\xd7\xeb\xaf\x27\x83\xdd\x31\x5e\x17\x69\x5a\x23\x14\x4d\xa6\x71\x8d\xd1\x72\x99\x3e\xc5\xbc\xb6\x01\x0e\x3e\xe8\xf7\xe5\x32\x9d\xe0\x1a\xb7\x53\x07\x6b\xee\x66\x2e\x26\xb7\x45\x91\x5b\xe3\x0c\x03\x77\xf2\xc5\xc4\xc5\x4f\xf4\x67\xce\x58\x5a\xbd\x52\xfa\xbd\x60\xb0\x9c\x6a\x35\x83\xae\x37\xec\xb7\x7a\x23\xea\x5c\x8d\xa4\x1b\x58\xbf\xef\x28\x0c\xa6\xcb\x65\x8a\x43\xe8\xb2\xd5\x21\x14\xd2\xe8\xfd\x34\xae\x9f\xe8\xae\x35\xe4\xaf\xf4\xfa\x7d\xf4\xfe\x14\x4f\x96\x27\x30\x26\xe1\x89\xc8\xee\xd8\xd5\xf2\xfe\x9a\xfc\x97\x32\x62\xd1\x06\x2b\x13\x5c\x83\xa1\x4a\xbd\xf4\x4d\x02\x7e\x72\x4d\x98\x50\xb9\x32\xbe\x3f\x08\x8d\x7a\x6a\x39\x92\xa4\x64\x49\x7d\x7b\x10\xa2\xe0\xf8\xc9\x75\x46\x84\xcc\xb8\x5d\xa6\xf2\x99\x0b\x7a\xfd\x49\xbd\x5c\x5e\x6f\x48\x29\x5a\x68\x82\xbd\x14\x2d\xc1\x64\x25\x3e\xcd\xc9\x9f\x1b\xe8\x79\x58\xab\x61\xe1\xda\x87\x5e\x4b\x70\xcc\xc4\x19\xf5\xa9\xa8\x08\x77\x76\x74\x27\x62\xfa\xe7\xcf\x3e\x7b\xfe\xe7\x56\x82\x28\xd9\xa5\xba\xe6\xa1\x08\x66\x37\x65\xa8\x0e\x63\x7f\x5d\x16\xbb\x57\xdb\xa4\x7c\x55\xa4\x0c\x95\x13\x28\x81\x83\xb1\x8f\x9f\x7d\xf6\xec\xf3\x3f\xd7\xe5\xcd\xcd\x7c\x46\x3e\xfb\xf3\xf3\x67\xb3\x7a\x3e\x7b\xf6\xdc\x2b\x71\x03\x14\xcb\xb7\x9a\x08\xfc\x8a\x7e\xaf\x68\xd4\x7b\x5b\xbe\x48\xfa\x6f\x5f\x45\xf6\xbb\xe1\x88\xda\xa3\xd6\x08\xb7\x04\x3e\x7d\x4b\x4f\x50\x6f\xf0\x95\xce\x15\xf6\xcf\xad\x5f\x5a\xda\x53\x37\x2b\x70\x4f\x86\xd0\x49\x01\xda\xa3\xbf\xa4\xb3\x85\x62\x5e\x59\xc4\x25\xcf\x2a\xa2\x72\x32\x89\xf1\xa2\xe5\x56\xe5\x51\xd2\x34\x2d\xfd\x90\x08\x4d\x25\x67\xaa\x2e\xfb\x6c\x4e\xe1\x4c\x3e\x4a\xce\x04\x89\x50\x0c\xcd\x2a\x44\x70\x8f\x1d\x4a\xd7\x9e\xb7\x47\x42\x0b\x7b\xd7\x92\x83\x90\x84\x32\xf9\x03\xf1\xb1\xac\x74\xee\x50\x8a\x72\x2a\xda\xb9\xc1\x9e\xf7\xb9\x43\x69\xae\x73\x29\xa6\x75\xeb\x79\x4e\xa6\x0c\x24\xe8\x7f\x19\x19\xb2\x3c\x2e\x2b\x5a\x18\xb3\x91\xcf\xa9\x2c\x05\xc2\x28\x2a\x86\x16\x17\x15\x26\x4e\x52\xd7\x4e\x62\x1b\x5c\xd8\xfd\x48\xfc\x2c\xa5\x94\x56\xb8\x23\xf8\x24\xd7\x9d\x60\xc2\x5b\x86\x6a\x30\x7a\xcf\x83\x96\x7a\x69\xe7\xed\x62\xcf\xbb\x43\x82\x24\x58\x12\xb7\x8f\xb7\x01\xe3\xb3\x2c\x3f\x0c\xc8\x71\x22\xc6\x25\x9c\x20\xa7\x81\xa5\x91\xf3\xf0\x3c\xc6\x92\x42\xee\xe5\x7c\x95\x27\x55\xa5\x04\x81\xe2\xc2\x97\x3f\x6c\xad\xcd\x29\x47\x43\x78\x93\xad\x51\xe9\xff\x56\x25\x9e\x87\x9c\x4d\x5d\x3b\x1b\x25\xe7\x66\x18\x2b\x71\x10\x4d\xe9\x2d\x79\xa0\x82\x1c\xe9\xe7\x4a\xbf\xcb\xc8\x5c\x3d\x58\xba\x1d\x71\x41\x2e\x89\x4f\x2b\xba\x93\xb5\x11\x94\xaa\x75\x7c\x29\x44\x99\xdd\x1e\x04\x43\x6e\x96\xba\x18\x87\x3b\x9a\xb6\x27\x08\x17\xc4\x5d\x2e\x9f\x78\x2e\x0e\x84\x5f\x0d\x33\x93\x1d\x26\x3b\xea\x46\x59\x4a\x3f\x71\x27\xbb\x89\xfb\x49\x7c\xe5\x92\x03\x5d\x19\xf2\x4b\xed\x93\xc3\x74\x8a\x57\xd1\x21\xa6\xbb\xc9\x83\x40\xf2\x09\x2f\x1e\xe8\x3f\xcc\xb8\xe4\xdc\x75\x60\x53\xd7\x72\x64\x2b\xff\xd7\x22\xe3\xc8\x25\x2e\x06\xe5\x0f\x06\x96\x63\x38\x93\x0f\x3e\x58\x42\xbd\xd5\x36\x2c\x2f\x25\xc3\x0c\x73\xa8\x10\xc0\x3b\x7c\x6a\xd6\x19\x4f\xf2\xfc\xe1\x94\xd6\xb5\xd0\x7a\x8c\xc1\x80\x9b\xc6\x70\x21\x1f\x04\xea\x24\xc3\xbf\x13\xf7\xc9\xdc\xc5\x7a\xe3\x76\xbb\x59\xd2\xc0\x4a\xf3\x4f\xa3\xb8\x63\x12\x04\x02\x2e\xb8\x95\x7b\x00\xe8\xf1\x09\x95\xec\xc7\x4d\xe1\xaf\x92\xd5\x96\x7d\x03\x93\xe2\x79\x29\x93\x1c\xe8\x95\x88\x98\x5f\x6d\xb3\xb5\x40\x38\x26\x20\x90\x2b\x5b\x5b\xa3\xae\xbd\x5c\xd8\x82\xeb\xe8\x36\x06\x15\x6d\xf7\xfd\x20\x3a\xea\x77\x3d\x50\xf1\xb8\x69\x76\xe7\xe2\x45\x37\x77\x8e\x03\x1c\x96\x9a\x1e\x6e\x29\xd8\xcc\x34\xd9\x2b\xd1\x5f\x17\x3d\x79\xaf\x24\xda\x55\xb8\x48\xb2\x98\x16\x9a\x5b\x89\x3e\xba\xd4\xec\x57\xed\x62\x52\x76\x52\x39\x05\x11\xe5\x74\x8a\x0b\x30\xeb\xfa\x2a\xe1\x69\xce\x22\x1e\x95\x71\x4c\xad\x61\xef\x7b\xb5\x09\x09\xe4\xa5\x64\x91\x86\x4c\xd5\x9c\x52\x0b\xbb\x79\x1e\xfa\x97\xd0\xe6\xa6\x5f\x4b\x2e\xa1\xae\x5f\xe3\x29\xfa\x17\x1b\xa6\xc9\x5d\x5d\xb6\x26\x60\x4a\xd0\xae\x25\x92\x94\xfb\x9c\x1d\xc5\xdb\xec\x36\xcf\xf8\x46\xc9\x10\x28\x15\xd8\x70\x09\xad\x70\x32\x9c\x07\xd3\x79\xd7\xe3\xb5\xbd\x50\xb6\x2c\x42\x0f\xe1\xc2\x86\x34\x92\x38\x38\xfa\x81\x2f\x94\xf3\x0e\x46\x28\x94\x32\x6b\x7e\xd3\xff\xa3\xfa\x91\xd5\x40\x5d\xbb\x8a\xa4\x80\x37\x7c\xa1\xbd\xad\xdd\x5e\x2e\xd0\x88\x3d\x84\xa0\x13\x41\xec\x4f\xb6\x24\x88\x82\x9a\xb0\x15\x19\x0b\x4c\x12\x5a\xf4\xc1\x20\x99\x4e\x31\x8f\x32\x5a\x44\x49\x1c\x7b\x1e\x98\xfc\x51\x07\x95\xf2\x07\x8c\xfd\x70\x23\xff\x55\x34\x11\x7e\x56\xfd\xfc\xed\x37\xf4\x9c\xe3\x63\xa0\x1d\x1a\x9c\x9b\x0c\x0f\x05\x1d\xad\x45\x53\xe8\x7e\xf5\xee\xdb\x6f\xfa\x28\x32\x70\xe6\x0d\x29\x65\x2b\x5a\xc7\xac\x8c\xad\x13\x40\x79\xa6\xd6\xb3\xb6\x39\x65\xe1\x79\xcb\xc1\x3d\xc9\x28\xf7\x53\xb6\x4e\x0e\xb9\xf8\x47\xc6\xee\x5b\xd5\x81\x3a\xc9\x25\xd2\xe6\x16\xc4\xf2\x61\x57\x43\xb4\xa6\x9c\xa4\xf4\xec\x03\xd9\x52\xa7\x42\x1c\xf4\xb2\x99\x2d\x08\xf2\xbc\xcc\xa1\x34\xf3\x45\xb1\x1f\x7c\x41\x6e\xc1\x6f\xd9\xba\x28\xd9\x41\x8b\x8a\x2c\x29\xdf\x1e\xe1\x06\xf4\x84\x06\x21\x56\xf4\x60\x2d\xa6\xad\x2f\x5b\x99\x43\x8a\xba\x99\x4b\x1c\x36\x38\x38\xda\xcf\xae\xaa\x71\xec\x38\xbd\x58\x77\xb2\xdf\x33\x9e\x2a\xc4\xc2\x35\x06\x7b\x55\xec\x14\x06\x73\x31\xd6\xcd\x8d\x68\x20\x9f\xb6\x7a\xc7\xf3\x56\xdb\x63\xf5\x62\xbb\x19\xe7\xac\x94\xc0\x40\xdd\x17\x69\x76\x77\x05\x83\xa0\x9f\x24\x9f\xdc\xbc\xb8\x4e\xb3\xbb\x9b\x5e\xe2\x55\x66\x92\x5d\xc2\x7c\x60\x19\xa0\xc7\x83\x99\x79\x06\xe8\xe9\xc2\xf9\x2e\x79\x85\x41\x7f\x25\x15\x73\xa1\x83\x69\x6f\x62\x18\x96\xd4\xcd\x2d\x71\x78\xbf\x76\x59\x71\x5d\x8f\xa5\xa2\xdb\xb1\xc6\x42\x54\x80\xc1\xab\xff\xf5\xeb\x81\x08\x47\x52\x60\x5a\x54\x33\x20\xb3\x1c\x4a\x7f\xf5\xbc\x6d\x87\x69\x06\x54\x98\x65\x61\x21\xc1\xb9\x3b\x33\xc2\x88\xc7\x41\x14\x37\x0d\x91\x8d\xe6\x82\x95\xfd\x66\x3b\xb1\x9a\x39\x75\x4b\x41\x32\xd1\x56\x37\xba\x6c\xe7\x24\x8b\x44\xcf\x4d\x83\x03\xa4\x0f\xd6\x76\x84\xff\x17\x9a\xd5\x43\xd6\xb4\x75\xaf\x71\x39\x42\x35\x35\xe7\xe9\xaa\x63\xbd\x69\xb9\x4b\xf2\x03\xd3\x5d\x25\xba\x8b\xef\x5e\xfe\x85\x8e\xef\x96\xb0\xaf\xb8\x31\xd8\x4b\x6b\x69\x46\x8b\xc8\xbe\x84\xe3\x9f\xc0\x3e\x7c\x94\xaf\x21\x25\x8d\x62\xad\xd3\xba\x48\x06\x83\xe2\xe4\x29\x58\xb3\xe3\x93\x39\x26\x0b\xd0\xd8\xe1\xf9\x00\x9d\x95\x9a\xf4\x69\x07\xdf\x12\x35\x45\x63\x86\x0d\xd2\x8c\xe1\xc0\x2d\x5a\xfa\xbf\x31\xf6\xb6\x94\x06\xd2\xe1\x04\x74\xbb\x0f\xa6\x80\xec\xe4\x70\x37\xf2\x8f\xa2\xb2\xe9\x5f\x8d\x19\xc9\x90\x94\x94\xac\x05\x1a\x6c\xcd\x3e\xd2\x50\x7c\xfa\xcd\x8b\x62\xaf\x28\x43\x2d\x31\xa4\x9f\x48\x54\xa1\x12\x6f\x5e\x5c\xeb\x5c\x12\x6d\x9c\x51\xab\x6e\x64\x0a\xc5\x96\x09\xc5\x46\x4d\xa1\x25\xb8\x0b\x03\x80\x9e\x5a\x89\x3c\x5c\x3c\x5a\x57\xa0\x45\x97\x23\x35\x75\x9f\x1a\x4c\x06\x63\x52\x7b\x81\x0f\x49\x47\x45\x2e\xe0\xc5\x90\xec\x97\xcb\xe0\x12\x57\x09\x39\xa1\x27\x36\x9a\x12\x78\x98\xdd\x05\xbb\xca\xd1\xb1\x8b\xf7\xf4\x93\x4f\xba\x81\x7b\x9e\xe9\x6e\xf4\xf4\xfd\x93\x98\xb6\x63\xff\xe4\x93\x7a\xe9\x2e\x2f\x8f\x9b\x71\x10\xbc\x8e\x8d\xdb\x7c\x22\x6e\x60\xe4\xb3\x17\x6a\x79\x4a\x82\xa3\x8b\x89\x29\x49\xfc\xa7\x81\x0b\x7a\x37\x54\xfa\x3b\x49\x2f\xb3\xca\xe4\x37\x30\xf3\x40\x53\xff\x9e\xdd\x7e\xc8\xc4\xb7\xfd\x0c\x75\x9d\xfa\xbb\xe2\xf7\x91\xd4\x62\x2c\x67\x35\x48\x94\x90\x37\x3c\x13\xfc\x34\xab\x56\x05\xe7\x00\x2c\x90\x9f\x3e\xb4\x96\x77\x40\xe6\x93\xee\x3d\xaa\x1c\x39\xb3\x30\xa0\x9d\x1e\x90\x43\x5d\xf2\xb5\x5c\xfe\x0d\xdd\xb4\x13\xae\x85\x46\x1b\xcd\x6d\xd5\xf2\xb4\xdd\xd1\xdd\xf0\xfb\xce\xfe\x7e\x67\x86\x9f\x82\x39\x7d\x92\xf1\x0a\xcb\x61\xac\x8a\x9d\xc4\xfc\x86\x14\xfa\xa1\xa8\x32\xd9\xfb\x70\x4c\x98\xf2\x79\x8f\x8a\x0f\xd9\x90\xd2\x09\x24\xb5\x2f\xfa\x0c\xc8\xc2\xd2\x31\x94\x75\xed\x20\xa7\xac\xeb\xb9\x43\x69\x69\xd9\x2e\x3a\x92\x82\xd0\xbd\x0a\xbb\x47\x54\xe2\x80\x5d\xea\xa1\xe7\xcd\xff\xec\x5d\xfc\x0a\x56\xcc\x43\xd4\x09\xc6\x19\x0a\x11\x0a\x6a\x77\x12\x74\x0c\x96\x76\xc1\x99\x2d\x5a\x1e\x8b\xbc\xa4\x1f\x3b\x4b\xda\xb4\xd7\x30\x1d\x57\x4a\xa1\x02\x3a\xbe\x8c\x8a\xcb\x03\x79\x64\x8c\x97\x07\xd8\x1d\x7c\x59\x38\xf7\xb2\xba\x76\x4a\x30\x95\x7f\x0d\x0e\x56\x2c\x95\xcb\x70\xa9\x2c\x93\x87\x6f\x16\x32\xc5\x56\xdc\xa1\x7b\xc2\x70\x38\x9d\x07\xa2\x4b\x10\x38\x9c\x07\xab\xf0\x8d\x82\xce\x15\x61\x78\xda\x3e\x0b\x1c\xcc\x82\x4f\xbd\x4c\x16\x99\x5f\x5e\x21\xf8\x3c\x76\x7c\x75\xd6\x18\xdd\x12\x90\xa4\xb7\x22\xa4\xa2\x11\x8b\x49\x4e\x23\x01\xb2\xae\xb1\x79\xcd\xd6\xc8\x29\xea\xda\x49\xb0\x05\x63\xbc\x1d\x47\x38\x0f\x0a\xf9\x92\x3c\x3e\x90\x05\xc8\xcf\x28\x6d\x6b\xd1\x3c\xec\xa2\xa4\xcc\xf0\xbd\xb4\xb4\x81\xa5\xf2\x0f\x5c\x49\x00\x4a\x99\x4b\x8c\xe7\xca\xed\x5c\x2a\x07\x18\xbe\x53\x9a\x4b\x1e\x29\x9b\x4c\xba\xf5\xdb\x0b\xf8\x46\xe0\x4b\xa0\xb3\xdd\xcb\xce\xe7\xe6\x79\x1e\xcc\x1a\xc2\x71\xb0\x6e\x48\x22\x0c\x6a\x1b\x57\xe7\x81\xe4\x12\xbc\xd3\xe0\x8f\xc0\x76\x91\x16\x1b\x9e\x81\xee\x18\x3f\x66\xa4\x98\x0c\xa4\x98\x2d\xe1\xf5\x4f\xe2\xd2\x4f\x9e\xcc\xe5\x29\x40\xe4\x8e\x1e\x56\x5e\xd7\xce\xb6\xae\x77\x9e\xb7\x53\x38\x47\xe0\xba\xde\xc8\x83\x42\xbf\x61\x10\x0c\x29\xa4\xf2\xd0\x19\x01\x02\x43\x5f\xd7\x23\x58\xb3\xae\x3b\x64\xe3\x79\x73\x89\x3f\xba\x84\x4e\x4a\xda\x9a\x45\x59\xfa\xf1\x76\x4e\x04\x59\xab\x09\x89\x58\x6c\xce\x9c\x9b\x19\xcc\x8d\x41\x38\xa3\xf3\xf9\x07\xf3\x72\xa7\xec\x17\x65\x35\x92\x23\xa3\x7d\x2a\xe8\xf1\xc2\x1a\x35\xf4\x65\x2a\x7d\x41\x40\x4c\x12\x9a\x79\xde\x37\x6a\x96\xec\x9c\x64\x90\x13\x87\x19\x18\xbe\x38\x5b\x1c\xb4\x8c\x73\x02\xaa\x5d\x9b\x59\x94\x6b\x13\x0e\xe8\x71\x8e\x03\x94\xd0\x11\x7a\x98\x63\x90\xd0\x56\x7b\xb6\xca\xd6\x19\x4b\xc3\x44\x11\xc4\x60\xf5\x1b\x24\x30\x6a\x30\x1c\xa5\x97\xac\xa9\xdd\xb7\x0f\x5c\x24\xc7\x2b\xc8\x45\xae\x0e\xbc\x64\xab\x62\xc3\xb3\xdf\x59\x7a\xc5\x8e\xfb\x92\x55\x55\x56\xf0\xe0\xca\x9d\x30\x35\x89\x07\x9e\xfd\x76\x60\x6f\x25\x3b\x7f\x46\xef\x10\xde\x91\xbd\xb0\x71\xdf\x52\xa7\xf4\x53\x26\xd8\x4a\xbc\x3e\xec\xf3\x6c\x95\x08\x56\x91\x15\xd5\xb8\xf0\xad\x90\xb4\x83\xc4\xa2\xa0\x86\x46\x33\x49\x44\xc8\x0f\xe8\x25\x26\x6f\x0d\x51\x2c\x28\x03\xfb\x35\x0c\x47\x40\x54\xc4\x9e\x87\x32\xaa\xe5\xd0\x05\x36\xbb\x37\x9b\x4e\x31\xd3\xee\x47\x20\xf3\x20\xf3\xd6\x12\x82\x35\x24\xa1\x09\x50\xe2\xef\xd8\x71\xbc\xe7\xae\x4b\x4a\x3a\x03\x23\x3c\x03\xb0\xe0\xe1\x09\x9b\x4f\xd2\xe3\x59\x5d\x7f\xae\x7e\xe6\xf0\x0a\x1f\xce\x0d\x13\x7d\xc1\x8e\x42\x5b\xac\xb4\x98\xcf\x4e\x04\xf5\x39\xa3\x36\xbf\xbb\x60\x0b\x99\x60\x4b\xc8\xf8\x84\x26\x88\x75\x86\x51\xcf\x55\xd3\x9f\x42\xcb\x3d\x93\xd9\x7f\xc8\x15\xef\x4c\x45\x17\x72\xbe\xca\x78\x51\x4e\x26\xaa\x92\xee\x24\xe2\x0d\x29\x94\xfc\x45\xe1\x81\x8a\x9e\x2c\x11\x6a\xf0\xd9\x8c\x28\x72\xf5\x87\x8a\x1d\xd2\x22\xc8\x05\x01\xc4\x11\xfc\x8d\x74\x60\x1d\x9c\x1a\x22\xd9\x0d\xf9\x5b\xb2\x1c\x54\x72\xc1\xc9\xbd\x71\x83\x53\x9a\x95\x81\xdb\xa1\x58\x57\xfb\xd9\x39\xb3\x86\xb8\x57\x23\xdf\x1b\xe2\x4e\xda\xe4\x92\xdd\x65\xc5\xa1\xd2\xc3\xef\x95\xfd\xd7\xa5\x4c\x4d\x43\xf6\x25\x7b\x03\xcc\x68\x70\x02\x45\xec\x18\x73\x1b\xcd\x63\x2a\xff\x0c\x18\x53\xc2\xa2\xe7\x31\x45\x2c\xfa\x34\xae\x6b\x16\x7d\x16\xd7\xb5\x6d\xc5\xaa\x33\xb9\xff\xa2\xc0\xa2\x45\xcf\x24\xdc\x41\x11\x57\xee\x86\xe8\x79\x3c\x01\x2b\x98\x16\x78\xc9\xa7\xb8\xd1\x5a\xde\x47\x7b\xd1\xc3\x0a\xc4\xe5\x62\xab\x1a\x98\xc7\x6d\x4d\xcf\x71\x08\x4d\xd5\xb5\xd9\xc0\x60\x56\x26\xbb\xfc\x69\x4c\x27\xd0\xe7\x50\x76\x59\x3e\xfe\x39\xae\xeb\x39\x0e\x9e\x3d\x45\x2e\xbb\x63\x5c\x55\xf6\x1c\xdc\x59\xd2\xd4\xbc\x61\x59\xf6\x33\x55\xf6\x7f\xc5\x13\x16\xfd\xc7\x59\x86\x40\xfe\x78\xde\xb0\xc5\xc6\xa8\xb3\xcf\x18\x78\x52\x52\x47\x56\xea\x79\x72\x76\x0c\x90\xfd\xcd\x87\x39\xd0\x7a\x08\x59\x47\x08\xd8\x08\xa9\xea\x65\xd7\x1d\x89\xf4\x64\x19\x2a\xdf\x82\xd2\xf3\xfe\x53\x65\x2f\x31\x78\x24\xec\x04\x2a\xc1\xf1\x19\xde\x4a\x63\x9a\x82\x5c\x0c\x06\xf7\xca\xe1\x9b\xe3\xa9\x79\x06\x5b\x76\xf0\x00\x8e\x66\xdd\x24\x72\x39\xe4\x67\x31\x2d\xad\x14\x7b\xb9\x9e\x83\xd3\xd4\x5a\x43\xcf\xbb\x97\x7f\x19\x71\xe6\x1c\x0a\x33\xc6\xa5\xcc\x8a\x89\x0f\xcf\x4c\xfd\x9c\xd9\xa8\xe5\xf4\xc7\x5a\xba\x37\x8d\xb6\x50\x38\xef\xd7\x77\x11\x93\xd0\xd7\x4e\xba\xa8\x6b\xd4\x69\xab\xd1\xfb\xd6\xc8\x82\x4d\x5c\xa5\xa2\xae\x9f\x60\x57\x4e\xe8\x77\x88\x91\x31\xa7\x52\xb5\x00\x23\xe8\x6c\xd5\x49\x10\xac\x97\xba\x1e\x95\xde\x8c\x49\x6e\xb4\x20\xd3\xc5\xb0\xbf\x1a\xdc\x90\xc1\x4e\xed\x99\x68\xb6\xc9\x46\xe6\x4d\xf5\xc9\x8d\x4a\xcb\x27\x59\x19\xe2\x65\xa1\x64\xc0\xe4\x54\x05\x22\x44\xd9\x44\xe2\x70\x57\x25\x84\x99\xa4\x31\x03\xf3\x3d\xcc\x1c\x78\x7d\xaf\x5f\xb9\xe7\xcd\x24\x26\x6d\x41\x8b\xe3\xc0\x7d\xda\x7d\xb4\x3f\xdc\x4c\xe7\x81\xfb\xc4\xfe\xa6\x20\x68\x6a\xa4\xf0\x58\x35\xf5\x2f\x9d\x05\x49\xfc\x90\x01\x72\x18\xd6\x52\xdb\x9d\xab\xeb\xac\x83\x4c\xe3\xb9\x3d\x87\xca\x26\xee\xd4\x0d\x9c\x39\x96\xf8\xef\x1c\xa7\x28\xe3\xd0\x56\xf1\x4d\x01\x85\x00\xc9\xd5\x81\x36\x49\xa8\x9b\x27\x95\xb0\xd3\xa7\x9f\x62\x52\x51\x57\x9b\x94\x40\x4f\xcc\x7c\xca\x03\xad\xd4\x73\x32\xe2\x15\xe0\x38\x36\x2f\x60\x01\xb5\xec\x49\xae\xfa\xd1\x33\x8a\xa3\x85\x43\x69\x12\xba\xd6\x89\xe6\x8e\x20\xf9\x5d\x9f\xa9\x78\xa0\x95\x64\x8b\xc6\x77\x04\xb9\xa3\x4e\xee\x79\x0e\x44\x8c\xd8\x29\xbd\xba\x21\x11\x36\xf8\xb4\x6f\x09\xfd\x3d\xdd\x47\x9b\x18\x14\xed\xe1\xfe\xf2\xf6\x7a\x00\x53\xc2\xfd\x90\x3a\x75\xe6\x8b\x2d\xdd\x50\xb7\xe0\x39\x18\x14\x32\xcf\x73\xb6\x9e\xd7\x1b\x49\xd3\x6e\xef\x6c\x8d\xb6\x34\x4a\xc2\x9d\x75\x98\x07\x3b\x5f\xce\x3c\x3c\xc7\x24\xf1\xbc\x3b\x50\x0f\x47\xb7\x71\x5d\x23\xf9\xa3\xbd\x88\x57\x11\x8b\xc1\xe2\x20\xa5\x07\x89\xbc\x28\x7d\xe7\x79\x87\x68\x1e\x93\x75\x2f\xe1\x59\x4c\xf6\x34\x95\xc4\x7a\x67\x9d\x11\xa5\x71\x3b\xda\xc9\x24\xf5\xbc\xbd\xe7\xc9\x51\xd7\x35\x5a\xd3\x94\xce\x70\x5d\x6f\xfd\x7d\xb1\x47\x60\x70\xd0\x1f\xa8\xe7\x4d\x26\x92\xc0\x05\x96\xed\x24\x7b\x41\xa3\x77\x24\x25\xeb\x78\xa1\xbc\x4e\x5a\x9a\xe3\xce\xf3\xd0\x81\x22\xa1\xba\x2e\x74\xd7\xb1\x24\xd0\x65\xc7\x54\x17\xb1\xec\xed\xbc\xe7\x7f\xf0\x31\x7d\xfa\x6f\x2e\x8e\xee\x34\x74\x09\xed\x55\x87\xf6\x56\x87\xe4\x10\xd6\x31\x26\x6a\x54\x7d\x47\x98\xf5\x94\x66\x64\xad\x04\x1c\x12\xc2\xd7\xff\x5e\x7a\xde\xfa\xba\xbc\xa1\xb3\xa6\x19\x39\xde\x6c\x31\x6e\xe1\xef\x81\x18\xaa\x60\xb1\x0a\xbf\x62\x42\xd1\x1b\x55\x34\xe8\xb5\x7d\x58\xbb\x07\xae\x75\x5e\x2c\xbd\x52\x15\x28\x12\xba\x15\xdf\x46\xb7\x71\x58\x22\x81\x03\x73\x86\xdd\xcc\x43\xc4\x69\xc4\x08\x23\xae\x4b\x44\x4c\xec\xb6\x06\x86\x9d\x68\x68\x7e\x10\xda\xea\xc2\xd6\x27\x21\x23\x05\x2d\x61\x38\xe3\x4a\xc2\x8c\xbe\x31\xcc\x5d\x11\x25\x40\x5d\x80\xa6\x10\x14\x86\x90\xd2\xe0\xb1\xf3\x4b\xd6\x39\x03\xfb\xf9\xa0\x94\x24\x98\x9a\xa0\xe0\xc4\x0b\x11\xe4\x63\x62\xd0\x28\x56\x9c\x41\x49\xf3\x73\x5b\x80\xfe\x9c\xf4\x07\xd2\xb7\xef\x81\xc1\x00\x8b\x98\x91\x28\x96\xb8\x6c\xa0\x00\xaf\xa6\x53\x8c\x0a\x9a\x44\x55\xac\x48\x82\x4a\x0e\x47\xc8\x9f\x02\xf7\x07\x43\x32\x52\x74\x87\x9f\x8a\x1e\x52\x4a\x74\x26\xab\x2f\x24\xed\xe0\x70\x05\xac\x4d\x83\xc9\x36\xa9\x86\x23\x1b\x51\x19\xdb\xfc\xbd\xb0\x58\xd8\x06\x13\xc3\xc1\x7e\x74\x2d\x48\xd8\x2c\x43\x5d\x0b\x25\x23\x97\xdc\x4b\x5d\x4b\x9a\xbe\x3b\x5b\x98\x3c\x5b\x64\x23\x79\xc2\x37\x17\x1a\xf8\x8b\x26\xc7\xe0\x08\xbe\x04\xa8\x50\x1e\xc0\x94\xb0\x3f\xa0\x7c\xc8\x99\xaa\x7c\x91\x16\x57\xa0\xd5\xdf\x86\xc2\x87\x9a\x86\x76\x30\xc7\x5d\x1e\xc8\x0f\xb2\x03\xc3\x6f\x2a\xbd\x15\x10\xd0\x01\xef\x4c\xb8\xc4\xc4\x6a\xf7\xf2\x6e\xe0\xf2\x98\x34\xec\xdf\x50\x64\x38\x34\x62\xc0\x9d\xc8\xb0\xc1\x44\x24\x65\x2f\xcc\x8a\x6d\x90\xa6\xc3\x89\x41\x38\x21\xfd\x2c\xf7\xdf\xb6\xa7\x77\x52\x27\xea\x5c\x79\x24\x66\x69\x43\xca\xa2\x18\x0d\xdb\xc2\x28\xa5\x69\x43\xc0\xca\xf9\xd2\xf7\xb5\x9f\x80\xe3\x69\xeb\x51\x80\x9c\xb5\x6c\xf2\x0d\x98\x46\xd7\xdd\x33\x92\x14\x9c\xe3\x20\x13\x77\x8a\xf9\xdb\x92\xad\xeb\xfa\x5f\xcc\x17\xc9\x2d\xd8\x61\x40\x7c\x0f\x10\xc9\x8f\x93\x9e\x46\x60\x0f\x0e\x83\x0d\x31\xaf\x7f\x9c\x79\xd6\x10\xad\xef\x18\xa5\x93\x3f\xd2\x0e\x43\xc8\xfe\x33\xdf\xd8\x83\xd7\xae\xd2\xe8\x58\x9f\x8c\xee\xc6\x44\xd1\xb9\xd4\x37\xdb\xa4\xc6\x7e\x6b\x2b\x80\xe9\x20\xdd\xbb\x1e\x04\xdb\xed\x45\x3f\xe4\xc3\x47\xf1\xe3\xe0\xa4\x6f\x06\x79\xe3\xfe\x6f\xb7\xae\x9f\xf7\xe4\xed\x8a\x37\x67\x23\xf4\x44\xe7\xd9\xae\x7a\x39\x16\xf9\xa0\x3d\x67\x7c\xe8\x1f\x78\xb9\x6f\x59\x92\xb2\x72\x34\x04\x8c\x26\xd7\xbb\x1e\xe1\x86\xc0\x1c\x8f\xce\xd5\x58\x6e\x65\xab\xf2\x7f\xb8\x94\x96\xc5\x4b\x1b\x0a\xad\x4b\x12\x0d\x01\xbb\xe1\x73\xff\xff\x61\x55\x97\xda\xf4\x3c\xf0\xd2\xee\xea\x97\x0c\x21\x90\xfe\x48\xd0\x21\x97\x01\x44\x2d\x06\xe4\x32\x24\x27\x54\xe1\x36\xf2\xcf\xd6\xc2\x91\x66\x96\xa2\x59\x0c\x28\x74\xf0\xd9\x12\x34\x46\x62\x3a\x97\x79\xd8\x6f\xc3\x1c\x1d\xfb\x12\xcd\x6e\x78\xc8\x27\x22\xe0\x90\xf3\x8e\xf1\xf3\xda\x14\xa2\x51\x9e\x71\x0b\x01\x5e\xa4\xf4\x19\x66\x43\x0d\x2f\x6b\x30\x29\xd2\xf4\x52\xf9\xf9\xc7\x94\xcf\xcf\x06\xd3\x99\x23\xb7\x3d\x55\x15\x4d\xa7\x92\x1e\x5a\x98\x7a\xca\x5e\x3d\x9b\x8f\xaf\x47\xdc\x4c\x26\xe5\x78\x35\x60\xb1\x60\xc0\x9c\x8b\x2d\xb5\x80\xfe\xb7\x36\xb4\xc4\xa9\x4c\xd2\xac\x08\x9c\x99\x42\x37\xb7\xc5\x51\x3e\xaf\xb3\x9c\xc9\xdf\x7d\x52\x55\xf7\x45\x99\xca\xe7\x6c\x97\x6c\x64\x62\x83\x3b\x2a\x8d\xc7\x74\x2d\x90\x15\xa9\xe2\x54\x1d\x6e\x77\x99\x90\xf9\x4b\x56\x31\x71\x9e\x3f\x55\xf9\x8d\x85\xd6\x46\x20\x7c\x6a\x36\x76\xdc\x22\x63\xf0\x50\x75\x3d\xee\x91\x67\x10\x3b\x60\x23\xba\x3a\x76\x62\xe8\x3a\xd4\x1a\x27\xd3\x0f\x86\x75\xcf\xd6\x68\xd5\xba\xcb\x84\xb3\x60\xd5\x4a\x41\x17\x15\x65\x24\x97\x14\xd3\x41\xb6\x68\x44\x5c\x86\xca\xc1\x27\x08\x8b\x80\x4a\xfa\xb3\x32\x2b\xae\x30\x88\x4a\xc0\x97\x95\x56\xba\x9a\x32\x9a\xc5\x86\x41\xad\xeb\x0a\x93\x5c\x2d\x49\x46\xa3\x18\xcb\x13\xd5\x99\x13\x54\xd2\xbf\xb7\x55\x68\x61\x8b\x36\x9e\x24\xda\x85\xf7\xa4\x05\xca\x2a\xf0\x0a\x54\x6a\x11\x70\x57\xa0\xfb\xee\x1a\x6d\x59\x62\xb5\x00\x09\x04\x3c\xd2\xb3\x87\x1d\x54\xd2\xbf\x45\x49\xdc\xb6\x58\xd7\x87\x28\x89\x3d\x4f\x7e\x90\x4f\xa8\xc4\x2a\xda\xd1\x1f\xf4\x22\x21\x5a\xa1\x11\x94\x97\x5a\x57\xae\x8a\x8a\x9f\x69\xe7\xd8\x18\xb5\x07\x55\xd8\x49\xb9\x70\xf0\x01\x31\x92\xe3\x76\xf6\x3b\x63\xbd\x07\xd1\xf7\x81\xb2\xac\xd5\x5d\xb7\xef\x05\x55\x4e\x28\x8b\x44\xac\xc4\xef\x9d\x91\x46\x5b\xd5\x9d\xe8\xef\x1a\xe1\xa7\x59\x49\x0a\xca\x3d\xcf\x16\x89\x4a\x26\x85\x24\xf4\x55\xa7\x7d\x12\xea\x58\x0a\x7b\x2c\x77\xd6\xc9\xc6\x45\x54\xc6\x86\xc7\x13\xd6\x61\x54\xb4\x42\x62\x5d\x62\xc0\xb5\x1b\xaf\x5e\xe5\xcc\x46\xdf\x49\x98\x9c\x24\x72\xde\xaa\xf3\xca\x47\x6a\xf7\x3c\xa6\xeb\x69\x95\xb2\x8d\xc5\x02\x3e\xd6\x31\x09\xf8\x74\xc0\x54\x12\x24\x19\xe2\xd2\x62\x2c\xf7\x4a\xeb\x95\x03\x77\x89\xe1\xf0\xae\xeb\xdc\x16\x7f\xe7\xea\x44\x37\xdc\xaa\xaa\x80\x46\xfb\x98\x1c\x40\xd8\xaa\xfb\x57\xd7\x99\x4a\x90\xb9\xbb\xce\x76\x6b\x73\xdb\x33\x06\xee\xf8\xb1\xde\x7c\xb5\xe2\xa8\x01\xcf\x91\x49\x46\x6a\x8d\x1c\xc9\x3b\xe9\x8c\x23\x27\x7f\xc0\xe4\xf9\xd2\xb6\x78\x14\x67\x52\x1c\x92\xc8\xfd\x5e\xd1\x19\x44\xa9\xd5\x70\x76\xa0\xca\x4b\x5d\xe9\x0c\x16\xf9\x4d\xb5\xa8\x26\x13\x0c\xce\xe4\x8a\xc7\x81\xd8\x95\xa8\x80\x8a\xe4\x7b\x62\xd4\x22\xe4\x00\x8a\x7e\xf9\x52\x75\x3c\x56\xd2\xf5\xe1\xde\xea\x83\xc5\x0b\x95\x9e\xe7\x48\x4e\x4c\xe2\x13\x7a\x2f\xe4\x96\x24\x99\xe7\x39\x99\x4a\xcb\x64\x9a\xcc\x8f\x7b\x26\xaa\xda\xfb\xa2\x27\x09\xa2\x20\xda\x88\x62\xb2\xa5\x89\x19\xd0\x86\x16\x75\xfd\x9d\x40\xa2\xae\xdd\xa7\x2e\xa9\x3a\x6b\x85\xa8\x8a\x83\x0a\xd8\xba\x1d\x75\x58\x5d\x3b\x85\xe7\x89\x70\x13\x1c\x05\xda\x90\x35\x61\x50\x3d\x79\xa0\x3c\xcc\xea\x1a\x15\x21\x0b\xb6\x75\x5d\xe2\x30\x8a\x83\x24\xd8\x81\x6a\xd2\xf3\x38\xda\x91\x07\x95\xb3\xc4\xa7\x03\x3d\x0a\xf4\x40\x52\x4c\x4a\x74\x20\x72\x76\xe5\x87\x15\x3d\xf4\x57\x70\x25\xb9\xc6\x3d\x3d\x44\x2b\x98\xd1\x87\x28\x8d\x56\xb1\x64\x1c\x77\xfa\x69\x8f\xc1\x5c\xbe\x50\x41\x49\xeb\x5a\x47\x27\x95\x0d\x44\x31\x59\xd1\x87\xd1\xfa\x1e\x54\x7d\x07\xb5\x06\xbb\x68\x25\x2b\x5a\x64\x40\xbf\x90\x07\x40\xee\x24\xc7\xcd\x1f\x14\x47\x07\x9a\x19\xe5\x78\x41\xf6\x38\x58\xcb\xf4\x9b\xe9\xdc\xf3\x50\x11\x1d\x64\x37\x13\xf9\x23\xfb\xa8\x76\xc2\x03\x8c\x9a\x52\x9a\x84\x0f\x46\x1d\xb6\x25\xa6\x11\x1c\x3c\x60\x92\x85\xba\x1b\x09\x79\x20\x39\x0e\x8c\xed\x7f\x42\x1e\x70\x63\xe1\xbf\x77\xc2\x52\x90\x41\xe0\x65\x2b\x40\x43\xe1\x1b\xf5\x4f\x04\x62\x77\x89\x99\x25\x00\x27\x75\x6d\x7d\x92\x27\x1d\xc9\x69\x12\xce\x83\x19\x59\xd1\xbb\x71\xab\x51\x45\x2c\x56\xc4\x99\x61\xb2\xbf\x90\xe9\x4d\x1b\xa8\x03\xf8\x5d\x9d\x7b\x4d\xa3\x7e\xd0\x82\x96\xa2\x4e\x24\x04\xd7\x35\x77\x28\x3d\xc8\x53\x05\x09\xca\x71\x07\x6f\x2b\x9d\x3d\xd8\xeb\x07\xdc\xc4\x6a\x97\x65\x56\x2c\xbf\xfe\x28\x73\x3d\x4a\xbc\xa6\xd1\x9d\x40\xb7\x02\xad\x31\xe1\x58\xc9\xbe\x4e\x3a\xbf\x3a\xec\xac\xdc\xc6\xb1\x02\xe2\xd1\xca\x54\x7d\x78\x61\xc2\xa3\xdb\x58\xb1\x1f\x25\x9d\x4c\xf2\x45\x76\x53\x82\xda\x0e\x62\xaa\x5a\xed\x96\xa6\xdd\x9e\x58\xeb\x5e\xa0\xfc\x66\xee\x79\xaa\x1b\xf0\x28\x0f\xac\x56\x08\x9c\x4f\xe7\xd8\x44\x86\xd0\xe7\xa7\x7b\xa5\xd4\x3d\xf9\xf4\x99\xaa\x32\x74\x9f\xba\x81\xeb\x36\x56\xd8\x3e\xe3\xa2\xc1\x49\x79\x93\x7b\xde\xbb\xae\xca\x9c\x00\x32\xb8\x29\x55\x6a\x2b\x57\x6e\x53\xe1\xbc\xc4\xcd\xda\x90\xa2\xe6\xe4\x85\x1e\x76\x60\xf5\xaa\xe7\x85\x30\x23\x5d\xc0\x95\x1b\x3b\xd6\xc8\xcd\x8c\x58\x1a\x7f\x49\x3e\x49\xb4\x92\xaa\x72\xda\xf1\x5a\x6e\xa3\x3b\x3a\x23\xb7\xd4\x9d\xb9\xe4\x48\x2b\xcf\x8b\x62\x72\xaf\xd1\x66\x4a\x5e\xd1\x03\xf9\x8e\x56\x75\x9d\x78\x5e\x67\x1d\x8a\x24\xee\x49\x3d\x2f\xef\x79\xc8\xe4\x98\x7c\xa0\xef\x26\xda\xc9\xff\x55\x38\x0f\x7a\x81\x0d\xeb\xda\x57\x34\xf7\x3d\xec\xca\x5c\x99\x09\xe4\x24\xa3\x1c\x2f\x74\xd0\xc7\x2d\xfd\x4e\x2e\xe9\xe2\x76\x32\x51\x4e\x5d\x60\xe0\xbb\x69\x7d\xdb\x76\x94\x45\x9b\xc9\x04\xce\xc5\x1d\xda\xca\x21\x61\x7c\x52\x31\xc6\xd1\x16\x6b\xf9\xab\x6c\xe0\x1d\xfd\x40\x32\x3a\x99\xc8\x49\xf4\x3c\x84\xb6\xd4\xd9\xc9\xca\x3c\xef\x6e\x3a\x25\x95\xe7\x1d\x4d\x21\xc0\x4d\x77\x13\x7a\x4b\x4a\xcf\xbb\x75\x28\xbd\xeb\xb7\x28\x54\x8b\x3b\x74\x94\x9b\x9d\xac\xb0\x3e\xe3\x65\xa9\x9b\x99\xb6\xb7\xba\x9d\x4e\xf1\x11\x4e\xe4\x07\x75\x2e\xcb\x1f\xfa\x9b\xda\x72\x7b\x8c\x17\x0a\xab\xe0\xc6\xa0\x8a\x3d\x79\xc0\xe4\xde\xf3\x9c\xca\xf3\x1e\xda\x05\xf3\xbc\xbb\x49\xbb\x96\x73\xd0\x25\x76\xf6\x02\x68\xdf\x02\x84\x19\xe1\x81\xbe\xc2\xe4\xd8\x74\xf1\xd4\x72\x81\x2a\x1c\x54\x4d\x4e\x13\x65\x1e\x95\xe5\x8c\x3e\x62\x60\x0b\x01\x6a\xbe\xb4\x28\x6a\xa7\xc0\x27\xa5\x0c\x03\x7f\x2c\x49\xe7\x8a\x3e\x7e\xe5\xd3\x29\x2e\xe8\x3b\x81\x44\xc4\x63\x4c\x0a\x90\xc4\x9a\x53\x33\xc8\xcc\xd3\xa2\xa0\x5f\x22\x46\x5e\xc9\xd3\x4e\x22\x87\xd6\xdc\xb6\xa3\xf2\xbf\x1b\xd0\x74\x33\x92\x75\x8d\x69\x54\xa2\x36\xb4\x12\x09\x46\x65\x4c\xb8\xa5\x8c\x6f\x2b\xfa\x30\xf0\x65\x94\x67\xa9\x39\x44\x61\x18\x30\xb2\x4c\x89\xb4\xd6\x06\x93\x9f\xc0\x95\x70\x2d\xa9\xa5\xb5\xa5\xf7\xc4\xc4\x90\xb9\x37\xcf\x3c\xcf\xfd\xfa\xb5\xdc\xf2\xe8\x40\xab\x68\x16\x63\xcd\x44\xb7\x86\xeb\xca\x71\xc2\x76\xf5\xd9\xca\x8d\xd2\xe2\x9e\x0a\x14\xd6\x80\x7b\xc0\x3c\x8f\x76\x86\xee\xe8\x60\x10\x99\xcd\x13\x68\xad\xb9\xc0\x10\x74\x24\x9a\xc5\xc4\x11\x9d\xcf\x62\x87\x33\x2a\x43\xe1\x2b\x8a\xd9\x8c\xa9\x49\xe8\xdf\x7c\xdb\xe9\xd8\xb8\xb3\x85\xb3\xa0\x3a\x97\x60\x9f\x80\xec\xab\xa2\x24\x26\x56\xa7\xe5\x09\x6f\xe3\x4b\x49\x46\xee\xa9\xea\xb8\x3e\x55\x33\xba\x7f\xb4\xff\xda\x8d\xae\x32\x07\xdb\xb9\x3b\x9d\x76\x1c\xac\xcc\x11\x9b\x90\x39\x26\x8c\x66\xad\x95\xe7\x83\x00\x07\xce\x11\x57\xc5\x0c\x13\x6e\x54\x2d\x06\xae\x72\xc4\xc8\x1a\xa3\x8c\x08\xe2\x6c\x09\x27\xad\x1f\x1f\x26\xbc\xb1\xad\x65\xe8\xad\xf1\x01\x73\xb1\xb1\x95\xd1\x86\xa4\x60\xb3\x7f\x4b\xce\x2d\x6e\xe8\x5b\xb2\x47\x98\xf4\x0d\x10\x2f\x38\x48\xcc\x1f\xb1\x69\x1c\xf7\x84\x1b\xb1\x7e\x1e\xf5\x06\x49\xae\xb6\x25\x5b\xd3\x4f\xfe\xf4\xc9\xcd\x8b\xeb\xe4\xc6\x25\xee\x9f\x94\x60\xc7\xf2\xfb\xe8\x4b\x74\x64\x7e\xc9\x60\xd6\xf5\x4a\x28\xf9\x4e\x0d\xf2\xce\x2d\xcb\x36\x5b\x51\xdf\x67\xa9\xd8\xba\x64\xfc\xfc\xbf\x2a\x43\x11\x0c\xed\xa8\x88\x6b\x34\x9f\x03\x01\x73\x38\x0f\x9e\x0d\xdd\x76\xce\xcd\x85\xc7\x46\x05\x32\xac\xeb\xa1\xff\x4a\xdf\x5c\x1b\x40\x5c\x99\x6c\xbb\x7f\x30\x64\x95\xb5\x1d\xb3\x2e\x79\x69\x88\x75\xad\x65\x68\xce\x65\x19\x1a\x4c\x83\x71\x9c\x02\x53\xa1\x4b\xcb\x65\xa2\xdb\xf4\x7b\xd4\x59\x78\xeb\x4e\x7d\x71\xd6\x1d\x60\x8c\x16\xd6\xbc\xa3\xec\xa2\xb5\x5a\x66\x59\xab\x65\xda\x5a\x8d\xa9\xb8\x69\xce\x2c\x1c\x2c\x0b\xd8\xb1\x41\x50\x22\xb9\x77\x69\x22\x20\x12\xf1\xbe\xec\x19\x31\xe9\xb4\xc8\x0d\x5c\x15\xd5\x78\x5f\xb6\x52\x9a\xa3\x3e\x7f\x68\xef\x24\x22\x47\x5f\xc5\x9b\x6f\x2d\xc2\x20\xd4\xd4\xcf\xdf\x7e\xf3\xba\x58\xb5\x6e\x71\xe4\xd8\x19\x1e\x5a\x46\x88\x8d\x31\x0c\xfc\x1e\x62\x32\x19\x1c\xfe\xa6\x13\x15\x7c\x1f\x31\xc9\xd3\x76\x21\x6c\x20\xf0\x0e\x53\xe8\x06\xbd\x03\xd4\x48\xfa\xea\x3a\x70\x54\x75\x66\x0d\x26\xa2\x39\xfa\xaf\x92\x3c\xbf\x4d\x56\x1f\xaa\x9e\xa1\x1a\xa3\x23\x51\xf0\xbe\x07\xbd\xa4\x6c\x3c\xe8\x82\x34\x37\x44\x77\xb1\x17\xb6\x46\xc9\x93\x1c\xe6\x17\x7c\xc5\x80\x4e\x5a\xf5\xa2\x3b\x29\x3a\x94\xf9\x3b\xb6\x2b\xca\x07\xcf\x13\x24\xa3\x8e\x24\xc8\xaa\xba\x9e\x01\x67\x5a\xd0\xbc\x0b\xd5\xe3\xcc\x16\xb9\xe7\x15\x37\xc9\x22\x51\x24\x6b\x1e\x25\x86\xd6\x15\x12\xf1\x0b\xc3\xb7\xcf\xc1\xc2\x4f\x14\xfb\xef\xf9\x9b\x24\xaf\x24\xc0\x51\x67\xae\x31\x20\xc8\xa1\x72\x49\x52\x85\x87\x16\x77\xae\xd0\xc1\x9c\x0f\x38\x28\x43\xd9\xf5\x60\x6f\xb4\x11\x70\x89\xc6\x9e\x9e\x92\xb4\x17\xc6\x5c\xf6\xc0\xac\x80\xe9\xe6\xa2\x05\xf3\xab\x4c\x0e\xd1\x04\xa1\x1f\x44\x4a\x57\xc7\xb7\x8e\x3d\xc4\xf1\xa2\x17\x2b\xb9\x0c\x99\x06\x1d\xcf\xdb\xfb\xdb\xa4\x42\x1c\xd7\x75\x6e\x68\xdc\x00\xd4\x41\xa6\xe3\x5d\xe0\x00\x88\x82\x27\x69\x60\xdc\x60\x2b\x22\x1b\xe1\x61\x37\x8b\x81\x92\xd8\x09\xb2\x42\x16\x89\xa1\x82\xdc\x2b\xc7\xe0\x91\x38\xed\xb9\xa4\xfd\x60\x18\x5d\xa0\xb8\x11\x1b\x6e\xa3\x16\x93\xe3\xd2\x31\x11\x91\x20\x40\xc2\xdf\x4c\xe7\x38\x37\xe7\x56\x29\xcf\x2d\x08\x50\x77\x23\xbb\x5c\x4c\xa7\x24\x81\x27\x79\xbe\x36\x26\xe4\xfe\x36\x19\x57\x5e\x85\x5d\xe5\x8c\xe4\x60\xe4\xe2\x20\x27\xaf\x6b\x27\x6f\x8f\xf4\xa1\xc6\xa5\x1b\x89\x89\x2f\xa8\xda\xd0\xcb\x3b\x9a\xf1\x40\x4b\x2a\xfa\xf9\x46\x62\xd8\x3b\x79\x43\xf2\xc2\xbe\xe9\xa0\xad\xe2\x40\x05\x29\xeb\xda\x02\x22\x5d\x9b\xcc\x3f\x5a\xd7\x01\xb4\x05\x10\x94\x7b\x34\x60\xa9\x1c\x65\xe6\x79\xce\x01\xa8\x4d\x08\x67\x49\x04\x8d\x18\x11\x8a\xc4\x09\xf5\x2f\xc2\x81\x88\x09\x0f\xb5\x20\x40\xe0\x60\x85\x04\x36\xcd\xcb\x26\x46\xba\xbb\xf7\x4d\xdb\xc3\xeb\x0b\xac\x72\x63\xbd\x76\xb2\xa6\x45\x3c\x7b\x3b\x70\xbb\x09\xd7\x36\xa2\xf1\x89\x22\x57\x47\x20\x77\x89\x9b\x16\x9c\xb9\xc4\xc2\x41\xc8\x95\xf8\xe2\x4a\x61\x05\x79\x82\xe9\xbc\xa9\x1b\x13\x59\x10\x62\x23\x10\x77\x9d\x64\xf9\x1f\x95\xfb\x15\xf4\x70\x50\x8e\x17\x22\x5b\x3f\xb8\xc4\xdd\x97\xc5\xa6\x64\x55\x35\x28\x6b\x8a\xc5\x31\xe1\xd4\xdd\x33\x9e\x82\xc1\x50\x49\x4f\x10\xbc\x6d\x64\xca\x78\x43\x92\xfc\x3e\x79\xa8\x46\xbe\x65\xea\x06\x89\x6e\x16\x7d\xd9\x5d\x74\x36\xab\x62\xcb\xb8\x5d\x5c\x45\x24\x68\xb3\x75\x18\xbd\x0d\x7e\xd7\x39\x69\x8f\x63\x97\x42\x53\xf4\xb4\x90\x28\xb1\xa2\xfd\xb0\x8f\x91\x90\xd4\x28\x03\x27\x8a\xa8\x88\xe6\x71\x8c\xce\x5a\xaf\x3c\xaf\x1a\xbf\xc9\x62\xa1\x43\xfc\x77\xf5\x99\x80\x6f\x38\x64\xc3\xdb\x33\xda\x28\xf3\x7a\xec\xf2\x5d\xae\x07\xf6\xcd\x0a\x20\xee\xab\x55\xc1\x01\x8f\x92\x89\x2b\xa1\xcf\x8d\xa1\x51\x40\x83\x5d\x38\x39\x75\x81\x0c\xa9\x20\x06\x6b\xd7\x1f\x89\xea\x08\x53\x11\x0c\x70\x97\xb9\x21\xfa\xf1\x91\x20\xf1\x61\x0b\xa8\x8c\x94\xca\xac\x24\xb3\x8e\xd0\xd2\xdf\x67\x7b\x46\x4b\x5f\x2e\x10\x39\x9f\x67\x66\xcf\xf3\x33\x39\xcf\x45\xf4\x3c\x5e\x94\x6a\x4e\x29\x84\x15\x94\x4c\x33\x3c\xd8\x53\xcc\xa9\x5c\xf5\x68\xfe\x9e\xc5\xd1\xb3\xd8\x20\x07\x22\xa2\x67\xf0\x2e\x91\x03\x26\x72\x69\x66\x71\x3c\x12\x89\x53\x7d\x19\x4e\x55\x16\x96\xc1\xf8\xae\xed\xe7\xa7\x49\xbb\xcb\x81\xf4\x34\x33\x96\x61\xa2\x8c\x2d\x25\xf3\x9d\x41\xc8\xf0\x86\xdc\xf7\x40\xb3\xa7\x96\x38\x0b\xfb\x49\x7a\x41\x65\xe7\x2a\xc6\xd0\x23\xc0\x52\x06\xf2\x6c\x9f\x2b\xa7\xa3\xa0\x17\xda\x31\xb9\x14\x4a\xd3\xb6\xd3\x14\x92\xe0\x81\x11\x73\xf9\x34\xbc\x98\xe3\x66\x1e\x9e\x75\x31\x28\xc1\xa6\xa3\x0a\x0b\x0d\x74\x0a\xd7\x11\x8e\x83\xe9\x34\x53\x22\xc4\xee\x52\x04\x99\xde\x34\x4a\x85\x06\x41\x26\x6e\xe6\x10\xb6\xb3\xa2\xe6\x4e\x0c\x92\x77\x8f\x87\xf6\x71\x51\x6a\xf5\x0c\x8f\x44\x3c\x18\xbf\x4c\xea\xa6\xc0\x7e\x33\x5b\x26\x41\x82\x1c\x08\xc7\x7a\xc7\x14\xe7\x3b\x26\x81\x23\xb5\xc2\xd0\xe9\xd6\x5f\x68\xd8\x7b\x59\x07\x29\xac\x0d\x01\x14\xad\x09\x8a\x70\x66\x83\x42\x4a\x52\xf4\xc3\x0c\xd2\x64\x3c\x04\x49\xb6\x46\x43\x56\xa3\x8b\x19\x40\x5c\xe1\x62\x92\xda\xcc\xca\xd5\xd5\x8b\x3c\xe3\x1f\xae\x6f\x5e\x00\x2b\x79\xf3\xe2\x5a\xff\x1a\xd6\xec\x3a\xf9\xe4\x26\x91\xcc\x99\x62\x6b\xc0\x3b\x98\x7e\x62\xf4\xb0\x9f\x48\x36\x87\xd3\xf4\x72\xdc\x00\x38\x04\xcb\x8b\x39\x12\x57\x49\x04\x4a\xe5\x0d\x27\x1e\x72\xe5\x65\xaf\x29\x05\x43\xff\x2c\xaa\xf3\x01\x2b\x6a\xdf\x95\x8b\x5b\xf5\x7c\x63\xcf\x72\x6a\x83\x12\x8c\x49\x71\xb1\x23\xda\x0d\x17\x22\xb5\xaa\x7e\xf8\xab\xaa\x02\xd7\x10\x57\x14\xfb\x60\xbe\x3f\x2e\xd6\x79\x91\x88\x20\x67\x6b\xb1\x28\xf6\xc9\x2a\x13\x0f\x81\xff\x99\xab\xe2\x0c\xbd\xb5\xe6\x9c\xba\xc0\x7e\x59\x31\x0b\x88\xf0\x73\x96\xc8\x03\xeb\xa7\x6d\x26\x58\xb5\x4f\x56\x8c\x3e\xa7\x32\x8f\xc5\xf7\x19\x91\x0b\x11\xbe\xb8\x2d\xd2\x07\xea\x5c\xea\x2d\x7c\x6e\xfd\x70\x89\xf0\xb7\x62\x97\xbf\x65\x65\x96\xe4\xd9\xef\x8c\x3a\x17\x0b\xca\xc5\xb6\xcb\xc1\x48\xe9\xb5\x28\xf6\xd7\xda\xde\x7e\xc0\xeb\x41\x06\x39\x75\x02\x0c\x8b\xbe\x2b\xca\x1d\xb4\x91\x52\xf7\x3a\x01\x62\x78\x94\x43\x27\xc2\xd7\x53\x44\xaf\xdf\xcf\xfc\xcf\xda\xda\xd5\xd4\xea\x6f\x32\xdb\xaa\xaa\xe0\x62\x0f\xea\x38\xd6\xc4\x43\x92\xfc\x2a\x01\xed\x7b\x4e\x1d\xa7\x50\x9c\x21\x54\x2c\xde\x1a\x03\x9e\x43\x6b\xcb\x43\x84\xcf\xf8\x0a\xc0\xd3\x71\xce\x40\x60\x5d\x94\x3b\x17\x9b\x1c\x7a\xc2\x3e\x7b\x95\x17\x9c\x51\xf7\x45\xc0\x93\xbb\x9b\x17\xd7\xf0\x23\x57\xee\xac\x38\x4f\xee\x5c\xec\xaf\x64\x76\xe0\x5b\x9d\x19\xf6\x8b\x83\x50\xbb\x88\x08\x3f\xe3\x79\xc6\xd9\x17\xf2\x70\xf8\x8e\xb1\xb4\xfa\x26\x79\x28\x0e\x42\xf2\x31\xc2\xaf\xb6\x65\xc6\x3f\xfc\x54\x26\x7b\xf8\x5e\xa9\xd4\x7d\x76\x64\xb9\x11\xa3\xa8\x24\x15\x55\xe1\x4b\x75\x9d\x8e\xe4\xb3\x84\xcf\x0b\xe8\x22\x84\x18\x51\x29\x25\xcb\x33\xb9\x43\xbf\x4d\xca\x4d\xc6\x7f\xcc\x36\x5b\xfd\xe1\xb6\x38\xbe\xcd\x7e\xcf\xf8\xe6\x47\x9d\x43\x26\x17\xc6\xac\xaa\x57\xdd\x2b\x9d\x56\x0c\x46\xa4\xf3\x92\xaa\xb3\xf2\x82\x62\xc5\x5e\xbc\x6e\x13\x0e\xed\x47\x88\x77\xa4\x43\x41\xa4\xb0\xbe\xda\x8b\x6f\x8b\x4f\x67\xa3\x99\x37\xc5\xf9\xb4\xea\x4d\xa7\x2c\x27\xc6\xa5\x23\x72\x6e\xf7\x07\x41\x41\x4a\x52\x8c\x8b\x46\x88\x86\x0d\xb9\xef\xce\xea\xd2\x7e\xf4\x60\x42\x02\xf5\xc1\xd3\x3f\x4c\x7e\xa8\x55\x41\xd6\xb0\xa4\xf1\xe5\x57\x68\x73\xf8\x95\x77\x18\x35\x6f\x47\x66\xe4\x63\xed\x15\x1f\x98\xe4\x3d\xdc\x54\xc8\x1e\x98\x84\x76\x15\xf4\xbc\x6b\x70\x57\x50\x99\x0f\x17\xa7\xf7\xd6\x9a\x93\xb7\x85\xd3\x7e\xa0\x1a\x94\x0e\xc3\xd3\xac\xf2\x6c\xf5\xa1\x17\x97\x66\x08\x5f\xf3\x46\x9e\x0e\xc3\x66\xb3\xd5\x07\xa4\x8d\x37\xd6\x7d\xeb\x19\x15\x2f\x19\x6c\x71\x8a\xd5\xa1\xca\x38\x58\xd2\x0c\xce\x9f\x15\x75\x0b\xee\x4e\xd6\x6a\xaa\x44\xb4\x9e\xb8\x5f\x1c\x6e\x6f\x73\x56\xb9\x31\x5d\x41\x94\xdd\xba\x4e\x2d\x21\x5b\xb4\x8a\x7d\x7d\xa7\x14\x88\x0a\x16\xa9\x46\x0b\x92\x0f\xd8\x94\xc5\x81\xa7\xaf\xf2\x6c\x4f\xdd\x95\xb2\x84\x9d\xde\x16\x47\xf7\xac\xdf\xe3\x45\x24\xb2\x5e\xe5\x2c\x29\x61\xd8\x6f\x01\xf9\xf5\xea\x01\x94\x3c\x56\xb6\x1d\xff\xd5\x11\x0d\xad\xc9\xdb\xab\x72\xa8\x3b\x93\xe8\x63\x4d\x8e\x43\xa2\x5d\x1f\xe1\xd4\xdd\x27\xa9\x3c\x06\x82\xd9\x62\x07\x3b\x38\x98\x2d\x6e\x8b\x32\x65\x65\x30\x5b\xa4\x59\xb5\xcf\x93\x87\xe0\x56\xe2\x89\xc5\x6d\x71\x9c\x56\xb0\xa3\x03\xab\x87\x8b\xe9\xae\xf8\x7d\x7a\xe9\x9b\x8a\x92\x70\xe9\xb3\x0b\x90\x3a\x7e\x30\xa8\x03\x25\x9a\xc5\x8b\x1c\xac\x7e\xc6\xe9\x0b\xc2\x87\x67\x63\xdb\x79\x10\xbd\x06\xb3\x85\x92\xc4\x06\xb3\xc5\x5e\x23\xb7\x20\xb9\xad\x8a\xfc\x20\xd8\x42\x9e\xa3\xb3\x85\x3c\x3f\x83\xe9\xe7\x9f\x7f\xfe\xf9\xfe\xa8\x27\x61\xaa\x4f\x58\x77\xb0\x5b\x38\xee\xbd\xa6\x03\xe2\xc5\xd0\x2c\xa2\xbc\x79\x21\x52\x49\xbb\xa4\xf0\x20\xd4\xd3\xb5\x4c\xd7\xf4\x8c\xfb\xc8\xd1\x2f\x52\xb9\xbd\x41\x5f\xd2\x1f\xdb\xc7\xac\x15\x07\xe6\x78\x4f\x67\x12\x91\xc8\x3a\x8a\xf5\xba\x62\xe2\x2b\x98\x05\xbb\x56\x5d\x40\xc2\x60\x01\x8e\x7d\xfd\x54\x55\x4f\x87\xdf\xbf\x82\xb8\x1f\xdf\x43\x65\x15\xdd\x2b\x47\x9c\xf3\x06\x7a\xf3\x21\x77\xc1\xd9\xf2\xb4\x90\xa0\xba\x3e\x0a\x43\xf6\xa7\x73\x10\xb2\xbe\x9a\x19\x91\xd4\x90\x9e\x0a\xf9\xd8\x07\x5c\x05\x09\x9f\x0e\x56\xf7\xdf\x2f\x00\xc4\xfc\xdf\x17\x92\xd1\xaf\xee\x93\x3d\xca\xf5\x15\x0c\xb9\x1e\xc6\xef\x45\xb1\x0b\x4f\xf2\x6f\x30\x6f\xc0\xcd\xd4\x46\x5e\xed\x89\x47\x3f\x85\x6d\xab\x26\xe6\x27\xd9\xba\xe4\x3a\xe5\x6a\xbf\x2a\x76\xfb\x83\x60\x29\xec\x74\xcf\x43\xc3\x73\xd7\x9d\xff\xbb\xdc\xb0\xe8\x3c\x33\x4a\xa1\x2f\xb8\xae\x4f\x0d\xf6\x45\xb1\x1f\x3d\x62\xdd\x4f\xf7\x80\x33\x1e\xaf\x40\x4d\x08\xe4\x6d\xb0\x0f\x6f\x40\x12\x3f\x4a\xb4\x2a\x45\xca\x19\x31\x3a\x5c\xe1\xaa\xcd\xb1\xb3\x28\x02\x93\x06\x6d\x81\x22\x3c\xed\xa7\xc0\x66\xbb\x40\x4d\x58\x97\xad\x8d\x8d\xab\xb4\x27\xc6\x6a\x54\xd2\x88\x4a\x06\x9d\x5a\xcb\xe7\x50\x9a\xc1\x69\xf4\x28\x9c\x56\x13\x57\x4d\x92\x84\x26\x1b\xc8\x0c\x64\x29\x02\x6b\xa1\x40\xc1\xbd\x4c\x71\x3d\x1f\x42\x42\xdb\x54\xbb\xd3\x00\x48\xdd\x01\x26\x81\x38\x64\x3a\xec\x58\x8f\x26\xef\xcd\xda\x67\x6a\xd6\xce\x28\xba\xe7\xce\xb0\xd5\x4b\x1d\xf4\x3c\x64\x03\x37\x9d\x63\x49\x21\xd8\x21\x1f\x39\x96\x0c\x15\x2d\xa8\xba\x5b\x00\x37\xf2\xbd\xa2\x4a\xe0\x59\x50\x15\x20\xe2\xdf\x1a\x74\x6a\x94\x40\xff\x0b\xb8\x63\x7b\x79\x8a\x96\xd5\xf2\x6d\xfc\x74\xd9\xd4\xcb\xc8\x3c\xc7\xf8\xc9\x35\xf9\x81\x5e\xa3\xe8\xe5\xf4\xbf\x62\x7c\xbd\xe9\x94\x13\x3f\x9a\x0b\x3d\x40\x4c\xae\xee\xe1\xd8\x8b\xd7\x89\x48\x10\xc3\x56\xfc\x5c\xa5\x3e\x91\x87\x31\x58\xa1\xb5\x2c\xca\x81\xe6\xe1\x51\x85\xdb\x0c\x18\x59\xd1\x3c\x64\x51\x15\x07\xf2\x8f\xe7\x81\x43\xde\xca\xf3\x0e\xd1\x0a\x2c\xc4\xea\x5a\x3e\xf9\x69\x22\x12\x5c\xd7\x70\xab\xe4\x63\x77\x78\xad\xea\x1a\x99\x1a\xe9\x5e\xf9\xdc\x74\xf7\x93\x04\x15\x26\xb2\xba\xba\x46\xf2\x87\xe6\xe1\xa9\x09\x4e\xa2\x80\x6b\xc4\x8e\x3e\x2f\x8a\x7d\x83\x09\x3a\xbb\xf0\x8f\x8f\x5e\xf8\xc7\x41\xf7\x1b\x42\x4d\xad\xc4\x49\xbe\x11\x8e\x83\xb6\xd7\xfd\x4f\x90\x04\xae\xc3\x09\xd8\x88\x91\xac\xae\x51\x02\xa9\xed\x03\x58\x30\x26\x54\xbd\x60\x62\x6e\xd2\x4c\x22\x39\x69\xfa\xca\x2c\xc4\x71\x4c\x4b\x7c\x7e\x95\x11\x0f\xc1\x67\x89\xc7\x44\x29\xe0\x0a\xb8\xfe\xe4\xac\x2c\xc6\x41\x41\x13\x52\x58\x86\x8b\x3f\x59\xb7\xde\x8d\x2e\x2a\x68\x7f\xec\x85\x4c\x68\x61\x2d\x64\x45\x8b\x90\x45\xed\x9a\xc7\x41\xfb\x08\xd1\x85\xa3\x4a\x6b\xfd\xc1\x16\x90\x87\x32\x21\x90\x7f\xd4\x30\xf1\xa9\xbb\x77\x54\xe0\x50\x40\x08\x1d\xb0\x36\xd2\x57\xd2\x12\x6b\x04\x18\x07\x70\xe1\x5f\x19\x0a\x1a\x89\x38\x40\x82\xda\xe3\x53\x61\x98\x55\x06\xf9\x59\x58\xf7\x4c\x60\xdb\xac\xa2\x33\xba\xd4\xbc\x48\x19\x89\x28\x8b\xc1\xf6\x83\x87\xce\xd7\xa8\xc4\xea\xa6\x4e\xeb\x02\x42\xd4\x9a\x64\x36\x88\xd7\xb5\x09\x68\xd7\x8e\x84\x7c\xad\xc6\x0a\x06\x94\x30\x3f\x39\x4b\x38\x4c\x64\xc4\x62\xe2\xcc\x70\xd0\xdd\x93\xd8\xe3\x74\xea\x3a\x71\x68\xa2\xef\xb6\x0c\xad\x7a\x61\x9a\xf4\x96\x6e\x9a\x4e\x0a\xaf\x66\xfe\xd4\x10\x5e\xc8\xfa\x03\x88\xa3\x0d\x46\xe9\x84\xed\x6e\x19\x98\xb5\x2b\x50\x0e\xdc\x55\x5e\x65\x69\xf0\xfa\xd9\xff\x7a\xf5\xfa\x8b\x3f\x7f\x39\x7d\xf9\xe5\x9f\x5f\x4f\xe7\xf3\xd5\x7a\xfa\xf9\x9f\xbf\xf8\x8f\xe9\xa7\x9f\x7e\xfa\xd9\x67\xcf\x3f\xfb\x74\x36\x9b\xcd\x5c\x50\xd0\x40\x85\xa3\xd6\x75\x56\x50\x28\xbd\xf8\x91\xbd\xec\x72\x23\x77\x6f\xc4\x71\x98\xe7\x39\x5f\x83\x0b\x4a\xda\xaf\xb3\x27\x01\xfc\x51\xbf\x1b\x5d\xd5\xeb\x61\xde\x36\xe7\x4f\x3a\x06\xcb\x2f\x1f\x51\x1d\x81\x7b\x59\x7f\xf9\xa8\x2a\x55\xde\x0e\xee\xcf\x2e\x72\xb5\x43\xda\x3a\xfd\x10\xb7\x9f\x3b\xe3\xce\x3a\x43\x27\x18\xcf\x93\x58\x46\xd6\x1e\x5d\xd2\xb0\x1b\x2f\x7c\x47\xd4\xb5\xd0\xd7\xbc\x8e\xba\xc0\x5b\x61\x15\x89\x75\xfb\x31\x3a\x0d\xe7\xc5\xbe\x54\x4a\x1d\x02\x09\x9d\x91\xca\xdc\x74\xde\x45\x5c\x3a\xe9\xdb\x37\x5a\x05\x24\x2a\xe8\x11\x80\x1a\x55\x18\x02\x58\x57\xd6\x98\x9d\xa3\xff\x8b\xfa\x46\xd4\x3d\x83\xa9\xec\x61\xe5\x62\x6c\xb4\xbf\x95\xc5\x9a\x2d\x5a\xd7\x54\xad\xe2\xa5\x65\x94\xc4\xbe\x64\x85\x49\xdf\x79\xde\x95\x95\x4e\x5d\x65\x58\x63\x6f\x6b\xe3\xe0\xfe\x19\xc6\xe4\x09\xaa\xe4\x70\x20\x00\xed\xe2\x42\x47\x60\x41\x5b\x4b\x2b\xed\x25\x74\x76\x97\xab\xba\x02\x1d\x74\x00\x16\x89\xa8\x87\xad\x2e\x18\xc7\x0d\x0e\x46\xc4\xd0\x7f\x5c\x50\xb9\xb5\x56\xa1\xec\x2d\x23\x66\x2a\x89\xc4\x5f\xa0\xd7\x18\x87\xf5\xc1\xf5\xe0\x67\x0d\x74\x85\xba\xfe\x35\xf6\x6d\x38\x4f\x8c\x29\x05\xdc\xf0\x07\xa7\x47\x3f\x26\xb3\xb1\x3e\xd7\x53\x3d\xe9\x2e\xe8\xfc\x81\xb8\xd3\x27\x73\x77\x18\x9a\x02\x2a\x1a\x40\x61\x36\x72\xfa\x94\xfa\xe2\x21\xea\x8a\xf2\xa0\x1c\x10\xe0\x46\x1d\x75\xbf\xa5\x7a\x9d\x07\xae\x1c\xbc\x7a\x83\x60\x1e\x93\x72\xe2\xaa\xd7\x49\x19\x7c\x61\x82\x77\x84\x47\xbf\xbd\xb0\x14\x81\x1a\xa7\xbd\x10\xb3\xd1\x53\xa9\x86\xa9\x2c\x95\xed\x4b\x32\xbb\x43\xed\xeb\xd1\x6b\x62\xb3\x35\x52\x60\xe6\x2a\x7a\xe2\x0c\xc7\x83\x2e\x0d\x1c\xc6\x80\x36\x80\x6c\x23\x86\xf8\x1d\x2a\xfe\xed\xc0\x0e\x2c\x78\xd4\x94\x85\x85\x88\x53\x04\xa4\xc4\xd1\xc5\x13\x17\x8a\xb8\x44\xc2\xf8\x2f\x66\x34\x98\x94\x9e\x87\x9c\x4c\xdd\xf0\x6b\x14\x0f\x61\x2f\x0f\x91\x07\xa2\xbe\x0c\x51\x1e\x46\xc6\xca\x10\x0c\x67\xc1\x50\x2e\x10\x0d\x49\xd9\x59\x97\x04\x3e\x81\x6a\x59\xb6\xaf\x0c\x3a\xe8\xd1\x87\x5c\xca\xad\xbb\xa7\xe7\xe1\xad\xd3\x8c\xc4\x01\xbf\x40\xb6\xaf\x8a\xe2\x43\x65\x5c\xc0\xfb\x30\xcf\xba\x7a\x9a\x85\x9b\xf1\x56\x11\x4b\x15\x11\x6f\x57\x58\x4e\xa7\xe0\x05\x80\x64\x47\x14\x78\xf2\x36\x7e\x9a\x5d\x16\x93\x36\x5a\x6c\x25\xd9\x28\x73\x83\x1a\x49\xc0\x65\xc0\x29\x3d\xaf\xf0\xbc\x42\x39\x39\x82\xf6\x0b\x49\x6c\xdf\xf5\x75\xfc\xae\x48\x3d\xf5\x90\xc3\xed\xb4\xb0\xdd\x22\xc8\xd9\xef\xa6\xfb\xa4\x2c\x0e\x2e\x2b\xa3\x87\x6a\xc0\xa3\x6f\x1d\x38\xb2\x65\xb3\xd6\x12\x4f\xf7\x3f\x29\x8b\x8e\x33\x0c\x7e\x0e\x4d\xc6\xac\xe4\xd9\xe0\x56\xc0\xee\x4e\x09\x10\xbd\x30\xc2\xa8\x9c\x55\x35\xc7\xe5\xcd\x10\x6b\x85\x66\xc1\x35\xee\x27\x0c\x07\x10\x3a\x1d\x90\x59\x30\x8a\x70\xd4\x19\x66\x17\x54\xb7\x5b\xf6\xa1\x42\x63\x22\xa2\xd7\x94\x79\x9e\xbd\x92\x72\xff\x44\x33\x50\x9a\x19\x50\xe9\x50\xd7\x08\xac\xfe\x11\x0a\x1c\xad\x24\x3f\xbb\x1c\xb4\xa5\x59\x8e\xfe\xfa\x18\xca\x3f\x7e\xb5\x97\x1c\x15\xd8\x39\x49\xa2\xb5\xdd\x10\xa0\x53\x35\x63\x1c\xb5\xe8\xb1\xae\x4a\x13\x84\xe1\x05\x07\xa0\xb4\xf7\x01\x88\x07\x4d\x9e\x52\x2e\x6b\x43\x20\xed\x6f\x8f\x0e\x4f\x6f\x1d\xdd\x8f\x28\x1e\xd5\x71\xdb\x97\x5b\xce\x61\x4f\xf6\xf4\xaa\x4a\x85\x6e\xdf\xab\x45\x72\xbb\x6b\x23\x6a\xd0\x84\x40\x50\x86\xc5\x23\xa0\x24\xc0\x77\x5f\x63\x8c\x2e\x2a\x42\xd9\xa2\x23\x49\x98\x12\xd6\xdb\x50\x80\xc2\x4a\xb5\x27\xe5\xc6\x9f\x4c\x88\x7e\x83\x7d\x92\x77\xee\x43\x39\xb2\x15\x99\x1c\xce\x30\x39\xc4\xdf\xc9\xcf\xe4\xef\xf4\x3a\x5a\x8a\x65\xb9\xe4\xcb\x75\x7c\xbd\x21\xff\xa0\xd7\xcb\xf2\x7a\x43\xfe\xf9\xc7\x97\xf0\xd4\xea\x88\x87\xbb\x78\xfe\x53\x65\x4f\x6a\xf9\x1d\x52\xfe\xa2\x52\x86\x57\x88\xc1\xb7\xbf\xd1\x8e\x32\x1f\xe8\xe5\xc8\x5f\xad\x6f\xd0\xfa\xa2\xb7\x63\x25\xa1\x33\x0e\x7c\xed\x3d\x95\xb0\x44\x47\x20\x89\x88\x24\x37\xcf\x29\x8a\x96\xf8\x7d\xd9\xaf\xed\xe3\x08\x02\x59\xc8\xde\x10\xfb\xb2\xd8\x7f\x5c\x97\x64\xce\x3f\xea\xd2\x0f\xfd\xda\x7a\x7b\x4b\x96\x7f\x93\x1d\xd5\xa6\x22\xa3\x9d\x94\x54\x01\xe0\x1c\x16\x53\x61\xd0\xba\x4e\xe8\xee\xba\x80\x1d\x93\xa4\x29\x44\x84\x3e\xb7\x4f\xe8\xae\x11\x6d\xe9\xd7\x0e\xd8\xcf\xcd\x19\x3d\x0f\x62\xee\x0d\xee\x46\xc5\x97\xe7\x52\xe0\xd3\x11\xe6\x04\x50\x3a\x74\x02\x69\xc3\x09\x98\x29\x65\x33\xd6\xa9\x66\x31\x6e\x80\x34\xca\xc1\x7c\x40\x50\x1d\x11\xa3\x67\x9a\xb9\xa8\x3a\x9b\x46\x75\xef\x5d\x94\xc4\xa4\xa4\xc3\x98\xdc\x88\x77\xf5\xaa\xa0\x4f\x56\x82\x0a\xff\x64\x68\xb4\xbf\x83\xa7\x6c\x00\xdc\xec\xa9\x68\x9d\x33\x32\x2a\x54\x64\xc3\xd9\x8d\x15\xe4\xac\x8d\x1e\x25\xd9\xee\x09\x55\xcf\x0b\xab\x6e\x73\x63\x7b\x39\x6a\x32\xf8\x3f\x59\x09\x49\xce\x0f\x21\xa9\x93\xd9\xfc\xdf\x59\x1f\xab\x77\xff\x2f\x2f\xd1\x85\x15\xd2\x31\x64\x47\x56\xe9\x86\xce\x70\x49\xcb\xee\x7a\x38\xf3\x85\x9c\xad\x9b\x64\xbf\xf5\xca\x05\xae\xdb\x5f\x3c\x51\x6c\x36\xf9\xd9\xe2\x59\x34\x90\x5e\x02\x43\x4d\xdc\xaa\x6b\x3c\x7b\xb7\x59\x76\x0b\x46\x79\xa8\x08\x04\x6b\x5b\x28\xab\xad\xfe\x3a\xe0\x60\x78\x0f\xf1\xc8\x22\xf2\x6e\x11\xad\x5e\xf6\x16\x91\x0f\x16\x91\x80\x0f\x48\x83\xc7\xe9\x93\x5e\xdc\x4c\xca\x0d\x84\x96\x60\x62\xac\x9b\x02\x47\xb0\xde\x9a\x1b\xc7\xe2\x44\xdd\x0c\x56\xf8\xdb\xa4\x52\x3d\x11\x38\x2c\x7a\xe3\x12\x38\x28\xba\x91\x0b\xc5\x6f\xc0\x8d\x33\x59\x5d\x5b\x53\x07\xf7\xb4\xa0\x7e\xd7\x25\xc5\xf3\x4b\xc7\x11\xba\xbf\xfc\xd2\x7e\xfa\xe5\x17\x77\x08\xac\x83\x77\xda\x7f\xad\x6b\x06\x5a\xcd\xd0\x75\x83\xc7\x6a\xed\x42\xe3\x99\x31\x8d\x98\x7a\x41\xd8\x49\x00\x2c\xed\x34\x37\xbc\x91\xd3\xba\x91\x1c\x9c\xae\xe5\xb6\xe0\xb1\xbd\x1d\x64\x15\x26\xf9\xd1\x7d\xd0\xc2\xb9\x50\xf0\xad\xd9\x27\x2b\xec\xf6\x5d\x92\x8f\x45\x84\x04\x89\x85\x11\x53\x80\x0b\xdc\x00\xad\x18\x64\x91\x0d\x4c\x21\xf1\xd8\x29\xa4\x41\xa3\x58\x98\xf1\xd8\x83\x29\x68\x16\xf6\x61\xd0\x40\xe9\x5d\x92\x23\x8c\x03\x66\x04\xaa\x61\x41\x5d\x37\x38\xbb\xff\xb5\x08\x8b\x09\x85\x95\x31\x8c\x5b\x81\xb5\x04\x65\x97\xec\x51\x31\x16\x27\xd1\xba\xf5\x9e\x4d\xc0\x71\x92\x48\xda\xea\x2e\xc9\x81\x96\x8a\xa0\x93\xe0\x7c\x24\x59\x92\x7e\xf2\x05\xe9\x91\xa4\xbe\xdc\x8a\x09\x37\x03\xef\xeb\xd2\xaf\x98\x50\x23\x2a\x88\x31\x7a\x50\x4c\xaf\x82\x54\x65\xfd\x50\x18\x3c\xd9\x3a\xfa\xf7\xfa\x51\x8c\x74\xa2\x78\xb4\x07\x9b\xb6\x07\x10\x80\x61\xc3\x04\xea\xda\x87\x0e\x84\x3c\x00\x0f\x57\x65\x40\x31\x22\xc7\xee\x84\x12\xff\x20\xae\xab\x24\x26\x12\x15\xb9\x6e\x20\x69\x45\xe0\x99\x0c\xf9\x65\x7a\x15\x9c\x94\xc1\x56\x70\xea\x05\x64\x62\x1d\x17\x03\xfe\x66\x10\x01\x92\xb5\xfd\x59\xf4\xcc\x47\x05\xf8\xb8\x48\xa2\xb2\x31\x51\x83\x2e\x54\x27\x4f\x41\xca\x7c\xd5\x64\x05\x0e\xcd\xfd\x70\x41\x05\xd5\xa6\x66\xd3\x82\x33\x3b\xae\xcd\xec\x26\x03\xe9\x39\x88\x3f\xc0\x53\xbf\x08\xb3\xc9\xbc\x8d\xdf\x26\x4f\xd1\x9b\x2c\xac\x82\x22\xcc\x02\x1d\xdc\xa5\xb2\x3d\x89\xd5\x75\xe7\xc8\xe1\x6d\x8b\x9e\x97\x3b\x80\x91\x50\x47\xa8\x5a\xd6\x37\x21\x6f\x8d\x6f\x02\x35\x4e\xca\x2f\xfa\xe6\xe0\xba\xb6\xef\x88\x69\x4b\x2a\xf1\xa5\x5a\x75\x64\xe7\x20\x6e\xb1\x17\x9b\xb2\x38\xec\x5d\xed\xca\x26\xe8\x11\x71\xbd\x79\x48\xd1\x59\xe3\x25\xc6\x70\xbd\x0d\xd6\x2d\x27\x59\x8c\x07\xcc\x83\x29\x35\xd3\xab\x76\x92\x11\x7c\x80\x0c\x22\x3b\x77\xe2\x2b\x69\x26\x4f\x6f\x54\x76\x91\x9a\x3a\xaf\x82\x23\x2a\xbb\x2e\x49\x54\x04\xe0\xe9\xcc\x3a\x08\xa8\x6b\x34\x58\x44\x3a\x9d\x63\x52\x34\x4d\x43\x86\x34\x7e\x2b\xe2\x51\xda\xae\x7e\xa4\x67\xe6\x79\xcf\x1d\x4a\x2b\xcf\xfb\x0f\xf5\xf3\xcc\xb1\xee\x3d\x1c\x0d\x77\x0a\x16\xb3\x8a\x9a\x36\xee\xe4\x80\x7a\x2b\x65\x6b\xaa\x1c\x8a\x10\x53\x41\x4d\x86\x31\xcd\xe4\xec\x40\x5c\x65\xd8\x9c\x3c\x06\x38\x00\xef\x25\x38\xf6\x7c\x79\x4c\xe9\x6b\x54\x70\xf8\x73\xf0\x3b\xa0\x1a\xb9\x0d\x8b\x6e\xb7\x16\x9e\xa7\x41\x03\x25\xca\x60\x0a\xf8\x4e\x1c\x26\x01\x4a\x06\x7b\x87\x63\x8d\x0f\x93\x50\x04\x09\x36\x30\x55\x42\x7d\x55\x5b\x1f\x54\x54\x41\x45\xa5\xac\x0a\x76\x7e\x12\xc0\x24\xf7\x7c\xe9\xca\x89\x2b\x59\x47\x1c\xa0\x1e\x3f\x03\x0d\x09\x7c\x89\x33\xea\xc3\x0a\x5c\x90\xe3\x79\xa2\x3d\xe9\x01\xa3\x9d\x09\x3f\x07\xb7\xe3\x94\x16\x07\x23\xe7\x8d\x93\xcb\x13\xf7\x57\xcf\xfb\x5b\x5d\x3b\x7f\x69\x13\x58\x54\xc6\xd4\x99\x83\xce\xa3\x93\x54\xbb\xda\x43\x6e\xea\x4e\x38\x8e\xa9\xc9\x74\x6c\x27\x4f\x5f\xb8\x32\xbc\xec\xf0\x6f\x21\x0f\x4a\xac\x20\x4d\xe3\x33\x08\x51\x73\x3a\xdf\x21\xea\xba\x77\xb3\xd1\x3b\xc3\x34\xcf\xd3\xf6\x6a\x4a\xb0\x66\xed\x57\x46\x8c\xd1\x5c\x17\x9e\xae\x17\x60\x86\x8d\x9a\xbf\x09\xe5\xd0\xa3\xf3\x52\xb9\x1c\x4d\xd3\x28\xf6\xf2\x4d\x76\x0c\x4e\xee\xba\x28\xdd\xc0\xdd\x8a\x5d\xfe\xa6\x28\x5d\xa2\x03\xf4\x06\x96\xf5\xf0\x39\x33\x6a\xdf\x42\xf7\xdf\xde\x3d\x09\x58\xa1\x57\x5a\x6e\xdb\xee\x0b\x92\xc0\x76\x1e\xae\x66\xa1\x53\xcc\xce\xd0\x1a\xd5\x21\xa0\x66\x23\x80\x9a\x29\x67\xc2\x32\x18\xdf\x24\x59\x6f\x93\xa8\xcc\x6a\xa8\x66\xf1\x74\x18\xbd\x8f\x3c\x8e\x44\x72\x0b\x94\x52\x77\x22\x89\x10\x44\xe0\x5f\x73\x81\x04\x99\xcf\x70\xf0\xcf\xb3\xe0\x6b\x75\xfd\x9f\x67\x69\x9e\xa7\x62\xf9\x85\xb3\x00\xee\xb9\x6d\x30\xf9\x99\x9e\x01\x91\x7d\x71\x93\x22\x2c\xcf\xb6\x5e\x70\x0e\xf0\x7d\x20\x71\xfe\x06\xc1\x03\x7a\x13\xce\xf1\x1f\x6d\x07\x70\x4f\x24\xbc\x69\x8c\xf7\xc5\xf9\x8e\x53\x97\x41\xea\x9d\x7c\xbd\xbc\x9f\x5c\x6f\x30\x19\x93\x88\xea\xa2\xf6\xa5\x0a\x40\xa8\xb4\x33\xbb\x18\xcb\x41\xcf\x06\xd6\x03\xce\x36\x1a\xf2\x58\x59\x79\xf0\x84\x22\x40\xa3\xf5\x0a\xec\xa8\xc8\xa2\x24\xc3\xa3\x0e\xa8\x96\x23\xe7\x79\xe9\x82\x24\xcd\xd9\x36\xb1\x5d\x90\x1f\x99\xd7\x71\x77\xd7\x06\x13\x35\x54\x64\x9d\x0f\x7a\x2f\x0f\x21\xc2\x6e\x6d\x14\x71\x84\xa8\xef\xfc\x4b\x39\x11\x38\xf8\xdd\xf3\x7e\xd7\x5b\x07\xd4\x31\x0d\x26\xb2\xbd\xdf\xc7\xeb\x37\x71\x8f\xce\x1c\x7a\xbb\xe8\x6e\x59\x5d\xf7\xc1\x0c\xbe\x03\x2d\xd0\xbb\x69\x58\x99\x3d\x75\xc0\x08\x1a\x10\x83\xa7\x54\xfc\x6e\x45\xe1\xa9\x68\xbd\x9c\x9e\xf9\x23\x97\x38\xe4\x81\x50\x70\xd8\x5f\x0d\x3f\x4b\xcf\x17\x1f\xd4\x95\x23\xc9\xab\xa2\x28\xd3\xde\x85\x22\xff\x6d\x4f\x66\xd7\x85\xeb\x21\xa1\xbf\xad\x2b\xb3\x52\x12\x76\x44\xb7\xaf\x24\x9c\x74\x80\x4e\xba\xcd\x30\x5a\xfb\xa2\x0b\xc6\x54\x5a\xfe\xd2\xa5\x6e\x44\x28\x02\x0c\x96\xb0\x21\x36\x94\x68\x03\x50\x96\x66\x2a\x58\xc0\x28\x06\x31\x4b\xef\xaa\x60\xe4\xce\x3c\xd0\xfe\x35\x7a\x6b\x47\xae\xf6\xac\x77\x95\x79\xa7\x3b\xf4\x56\xee\xd3\x2d\x67\x8d\xb4\x20\xa9\x55\x84\xe7\xa4\x83\x9b\x1c\x44\xa1\x88\x07\x79\x34\x61\xcb\x1f\x66\xe0\x78\x20\xf1\x82\xee\x14\xf8\x1a\x10\xb7\x2a\x57\xfd\x0e\x81\x5f\x6f\x77\x5c\x88\x78\x38\xd9\x97\xae\x39\x14\xe4\x53\xc3\x95\x98\xc6\xb5\x4f\x4a\x6f\xe7\x29\xaf\x89\xcb\x75\xf6\x8c\xdb\xea\x5a\x8c\x51\xc7\xe3\x99\xa9\x90\x2c\x64\xaf\x03\x96\xbb\x03\x74\xa3\x1d\x57\x47\x1c\x5f\x38\x99\xd8\xc8\xad\x5e\x02\xac\x20\xfb\x1c\xce\x23\x97\x11\xf7\x32\x2a\x6a\x51\x33\x6d\x6a\x05\xcc\xe1\xe8\x12\xb7\x64\x49\xfa\x3d\xcf\x1f\x5c\xe2\xee\x92\xa3\xba\x40\x44\x12\x12\x2c\xcf\xdf\xee\x93\x15\x38\x6b\xc2\xdb\x0f\xca\xbe\x4f\x16\x29\xee\xdf\xee\x13\x2e\xd3\x8b\x5c\x3f\x1d\x2a\xf6\x6d\xb2\x77\x89\xbb\x2e\x93\x1d\xfb\x02\x8c\x4c\x21\x03\x80\xf1\x97\x1a\x8c\xed\xf5\x36\x8b\x2d\x0f\x2f\xc5\x6c\xf7\x58\x59\x90\x12\xf4\x66\x54\x7b\x81\xb4\xb3\xf9\x26\x3b\xb6\xbe\x23\x2e\xe3\xab\x02\xba\x67\x8d\x52\x11\x63\xc4\x35\x6e\x4f\xc3\xd6\x7b\x4c\xfd\x39\xf4\x73\x0b\x21\x1b\xb9\x02\x9c\xc2\xc6\x39\xc3\x66\x6e\x98\x61\x6e\xb8\x64\x6e\x34\x5e\x33\x3d\xd7\xee\x30\xd0\xf3\x7e\xa3\x12\x8e\xe9\x45\xe9\xc4\x59\x08\x07\xcd\x34\x87\x6e\xc1\xdd\x40\x93\x85\x0d\xd6\xba\x9b\xff\x7a\x44\x3f\x03\x3a\x16\x26\xe8\xf5\xfb\x0f\xec\xe1\x9a\x08\xa1\xf2\xee\x8a\x43\xc5\xea\x95\x8a\xd0\xb2\x63\xfc\x80\x6b\xf0\x1c\xb8\x26\x5c\xe7\xd0\x2e\x02\xf0\x53\xc3\xdf\xe2\x20\x6e\xf3\x43\x89\x9f\x5c\x93\x12\x32\x45\xef\xfd\xf8\x29\x46\x61\xb0\xf4\x91\x3f\xc1\x35\x7e\x72\xdd\xd9\x43\x64\xc2\xbe\x44\xa3\x4d\x2e\xac\x64\xeb\x92\xe8\x44\x68\x7d\x85\xa1\x36\xfb\xf1\x94\xb5\xb6\x82\xe1\x13\x98\x62\x81\xfb\xc3\x69\x93\x17\xb7\x49\x1e\x9c\x40\x7b\x31\x38\xf2\x24\x81\xab\xb6\x55\xcf\x0d\x8f\xe8\xa0\x53\xe4\xae\x53\xee\x03\xc3\x72\x87\x4f\xa5\xbf\x85\x83\xa5\xf4\x3c\xb4\xa2\x25\x29\xe9\xca\xa4\x90\x84\xae\xda\x68\x15\x70\x69\xec\x21\x93\x9b\x5b\x3d\x50\x63\xe9\x88\x09\xca\xe9\x9d\xea\x5e\x25\x39\xc6\xee\x4d\x05\x48\x5c\xd3\x3b\x5d\x25\x86\x90\xfa\xe6\x6d\x0c\x10\x34\xb7\x7a\x54\x12\x4f\x90\x69\x42\x55\xbe\x28\xb3\xcd\x86\x95\x10\x0d\x59\x89\x36\x42\x11\x98\x8f\x69\x56\xed\x81\x9e\x53\xee\xc6\x6b\x9f\xe5\x6c\x67\x79\xb1\x36\x44\x25\x51\x86\x89\x36\x8c\xe8\x0b\xe6\x5d\x37\x26\x87\xd6\x26\xc1\xba\xa8\xbe\xa2\x72\x27\x1e\xd9\x0a\xf1\xe8\x10\x2b\x3f\xc1\x0d\x7d\xa0\x55\x34\x8f\xc9\x8e\xa2\x2a\x7a\xa6\xaf\xdf\xd1\x76\x7f\xbe\x89\x6e\x83\xc9\xc6\xf3\xd0\x9e\x9a\x3e\xc2\x69\x98\xe4\x70\xaf\xc0\xa9\x21\x1b\x8a\x92\x70\x0f\x56\x79\x9b\x44\x00\x37\x12\xec\x7d\x49\x94\x03\xe3\x58\xd7\x1b\x72\xb1\x6c\xda\x19\x7a\x2a\xa6\x6d\x43\x8a\x32\xdb\x40\x1d\x0f\xca\xf4\xad\x20\x7a\x11\x83\x92\xc8\x65\x0a\xd4\xa2\x11\xb3\x9c\x41\x42\xec\x68\x45\x41\x02\x33\xdd\x11\xc6\xe7\xa1\x8c\x12\x4c\x24\x49\x02\x4e\x81\x81\xb9\x02\xd2\x77\x71\x43\x56\x98\xa0\x2d\x95\xbd\x93\xeb\xab\x9e\x20\x7c\x62\x3b\xba\x57\xc5\x81\x0b\x3a\x23\x7b\x79\x9e\x1e\xf6\x9e\xa7\x1f\xda\x28\xfe\x64\x47\xd6\x92\x0f\x72\xe6\x20\x15\x49\xd2\x14\x9c\x7d\xbe\xc9\x2a\xc1\x38\x2b\xc3\xf3\x24\x08\xae\xe8\xcc\x71\xc0\xfa\x1e\x45\x6c\xe8\x50\xe4\x4e\x36\x64\x8d\x31\x26\x7b\x59\x87\x5c\x12\xf9\x6b\x5a\x06\x67\x0d\x3d\x55\x06\xbe\xfb\x09\x54\xfd\x60\x4c\x92\x70\xdb\xc6\x25\xec\x0f\x6d\x32\x21\x33\x92\xe2\x60\xab\x24\x4e\x29\x20\x65\x58\x39\xb5\x5b\xe5\x84\x38\x33\xbc\xd0\x3e\xe6\xe7\x41\x32\xce\x83\x6a\x92\x91\x1d\x4c\x8f\xbe\x36\x97\x44\x92\xf1\xea\xef\xe5\x1d\x6c\xe0\x9d\xd9\x87\xf8\x24\x28\x44\xab\x1c\x03\x74\x71\x0e\xe8\x10\x93\xcb\xc0\xba\x68\x61\x3d\xa5\x1b\x05\xeb\xdb\xc7\x61\x3d\xc5\xa7\x73\x70\x4d\x0d\xb8\xa2\xf2\x51\x50\x4f\xc9\x9a\xae\x20\x37\xc8\x27\x2b\xb8\xb2\xca\xba\x13\x68\xb9\xf4\xb1\x3b\xd9\x6a\x98\x5b\x2e\x7d\x14\x06\xfe\xd3\xe5\xd2\xaf\xb1\x8b\x27\x2e\x92\x4f\x4f\x30\xb8\xb8\x15\x6d\x98\x31\x3d\xb6\x62\x3a\xc5\x09\x5d\x47\x45\x4c\x9c\xcc\xf3\x36\xe0\x37\x69\x76\x4b\x5d\x43\x10\x14\xb9\xbe\x90\xae\x00\xa0\xf2\x3c\xa7\xd2\x40\xef\xb7\x30\x8f\xeb\x5a\x52\xb5\x90\xcf\xec\x22\xcf\x43\xee\xd3\xa7\xae\xf2\x53\x77\xba\x74\xc0\x73\x06\x56\x0a\x32\xc7\xc4\x2e\xb3\xee\x03\xcf\x74\x4a\xf6\x9a\x19\x96\x1b\x43\x3d\xb5\xe6\x47\x18\x2f\x72\xcf\x73\xd6\x9d\xa1\xe4\xde\x17\x2c\x29\xd3\xe2\x9e\xcb\xec\xe6\xd9\x14\xd8\x92\x9d\x41\xb6\x7a\x3f\x19\x4e\x5b\xed\x08\x46\xd2\x2e\x87\xd1\x8e\xcb\xc9\xc7\xdd\x4d\x6c\xe9\x55\xc6\xaf\x56\xd8\x2c\xa7\x2a\x2e\x4b\x4e\x24\x60\x00\xa0\x4a\x68\x1e\x5a\xb2\xad\xb0\xe7\x19\x1b\x65\xd3\xc4\x99\x19\x92\xab\xe0\xd3\x85\x3b\xac\x34\x52\xef\xf6\x41\x1b\xd4\x75\xe4\x0c\xa3\x51\x56\xd7\x89\x44\xbf\x77\x6a\xb0\x26\x2a\x16\x30\xbf\x12\xa8\x38\xd9\x59\xdf\xda\x95\x83\x0c\xed\x9b\x05\xbc\x41\x04\x16\xa9\x07\xba\xa6\x99\x3c\x6e\x12\xf2\x1c\x38\xa3\x4e\x57\xf3\x1f\x83\x77\x87\x6b\x6c\xb8\x99\x9c\x1d\x4c\x72\xf4\x9b\x4e\xcf\xea\x83\x86\xd5\xf3\xd0\x8e\x6e\xac\x36\xc9\x86\xee\x5a\xf3\xb4\x9d\xde\x3e\x18\x84\xf0\x56\xe1\xc0\x95\x7c\x9a\x42\x5e\x9c\x72\xcb\xca\x39\xe4\x01\x67\xf7\x57\x47\x5f\x2d\xe7\x86\x9c\x7b\x10\x78\x1e\xc7\x84\xfb\x59\xf5\x4e\x75\x8d\x16\xe1\xb3\xe0\x39\xb1\xe6\x80\x5a\xf8\xdb\x4e\xff\xa5\x64\xd4\x7a\x0d\xcf\xf6\xe0\xee\x0f\xf7\x60\xa0\x2e\x08\xf5\x4b\x56\x1d\x72\x41\x05\xe1\xbe\xba\xb3\xa2\xae\x91\x79\xa4\x19\x58\x00\x02\xcd\x57\xc2\xad\xf0\x3d\x3b\x43\x02\x92\xb3\x8b\xa7\x5f\x51\xd7\xce\xde\x4c\x7b\x5d\xb7\x8f\xfa\xf0\xcf\x48\xa9\x20\x5f\x29\x07\x9c\xc2\xf3\x9c\xbd\xcf\x0b\xe5\xce\x09\xb6\xc4\x59\xf5\x13\x18\xbe\xa3\x4c\xdb\x0f\xaf\x68\x1f\x3d\xc9\xd3\xd7\xac\xf4\x6a\xb2\x91\xdb\xf9\x40\x0f\xf6\x2d\x1d\x8b\xc3\x62\x90\xa2\x71\xff\x01\x93\x35\x3d\x2c\xd6\x94\x52\x94\x0d\xef\xe8\x4c\xb0\xe7\xe9\x7c\xeb\x56\xba\x91\xb1\xfb\xba\x5e\xeb\xaa\x54\xc7\xea\x9a\xe1\x26\x6d\x95\xf9\xe8\x40\xb7\x51\x3a\x99\xc4\x58\x42\xa0\x9f\x55\x3f\x94\xc5\x3e\xd9\xc0\x0d\x1f\x6f\x45\xb1\xdf\xb3\x14\x61\xac\x36\x01\x4d\x6f\xe6\xe1\xca\xc2\xaf\x72\x2c\x15\x45\xe6\xb0\x38\x74\x3b\x10\x7c\xa3\x22\x55\x2c\xee\x8e\x93\x03\x71\xd5\xde\x75\x31\xb1\x62\xb8\x1c\x48\x89\x49\x45\x73\xcf\x3b\x44\x79\xac\x22\x79\x5a\x9e\x1b\x07\xdc\x66\xed\x97\xd1\x81\xb4\xb8\xbf\x2f\xa1\xe1\xd7\x6a\xd8\xca\xd2\x57\xf7\x79\x43\x60\x99\xe4\xd0\xf4\xe7\x1f\x54\x66\x39\x30\xcf\x43\xce\xde\xff\x45\x4f\x97\x5c\x70\xf3\xac\x5b\xd1\x97\x33\x99\xb6\xf0\xa0\x67\x19\xf6\xbc\xdc\xf3\xb2\x68\x13\x8f\xac\x3e\xcd\xe4\x68\xd6\x9e\x87\xe4\x83\xf2\x7c\x20\xe7\x44\xe7\x06\xdc\xc8\x65\x1d\x08\x6b\xb2\xfc\x01\x8c\x83\x87\x19\x45\x57\xd7\xba\x55\x3c\x99\xed\xd0\x40\x10\x28\x20\x55\x83\x7e\x84\x34\x53\xd1\x3a\x3b\xa2\xf3\x18\x68\x92\x9a\xca\x47\xc2\xa5\x1c\xba\x75\x55\xda\xf9\xfe\xd2\x32\xa3\x4b\x85\x90\x69\xc3\xed\xd4\x7e\x3d\x35\x60\xb6\xa2\xee\x12\x62\xdd\x46\x50\x7b\x15\x2a\x76\x56\x72\xf9\x5e\xeb\xbe\xd7\x75\xef\xd5\x52\x65\xeb\x43\x07\x9f\xaa\xb6\x39\x4d\x4b\x55\x76\x2e\x72\x90\x74\x78\x0b\xde\x05\xad\x22\xae\xc1\x9b\x5d\x02\xef\x13\xf3\x57\x87\x52\xee\x11\xdd\xb1\x42\x53\xf9\x5d\x3d\x19\x2d\xda\xe6\xa2\xc4\xaa\xf0\xeb\xdd\x8e\xa5\x59\x22\xd8\x68\xcd\xc8\x61\x3d\x14\x58\xd7\xfd\x77\x85\x07\x32\x8b\x14\x80\x4b\x9a\x74\x53\xdf\xdf\xfe\x4a\x33\x39\x6d\x89\x48\x68\xa6\xfc\x72\x4a\x8a\xd0\x70\xba\xb3\x96\xea\x88\x95\x53\xa2\x2a\x5e\xd7\x99\xe9\x33\xd6\xf0\xac\x07\x96\x77\xfe\x58\xcc\xa0\xd3\x76\x3b\x41\x14\x9c\xfe\x7e\x22\x2a\x56\x9d\x35\x44\x84\xbb\xe0\x6c\x2b\x7f\x5f\x54\xc2\x2c\x99\xe7\xf5\xdf\x7b\x4b\x48\x58\x07\xae\x66\x3a\x2f\x39\x79\x74\xd0\xc9\xfb\x54\x0d\x39\x48\x36\x0d\x56\x0a\xa0\xcb\xf3\x0e\xb6\x0d\x84\xc3\xb4\x80\xb1\xae\x5d\xe5\xf2\xef\xb4\xb7\x9d\x80\xfd\xd4\xe2\xe0\x00\xe8\x0d\xd0\x6c\x5d\x83\xa5\x84\xb6\x14\xe9\x55\xd9\x85\x7c\x70\x54\xcc\xfd\xf3\x8a\x01\xd9\x17\xb2\xbf\x12\x6a\xf2\xd6\x3f\x84\x2b\x2b\xac\xac\x25\xd2\xc0\x5a\xa5\x88\xca\x58\xa9\xb6\x10\x3c\x66\x3d\xae\x28\x3c\xa2\x92\x28\xb3\x0d\x38\xb6\xd1\x01\x24\x21\x4a\x1b\xa0\x3f\xe9\x7b\xa1\x0f\xed\xbd\xd0\x18\x2a\xf5\xbc\x42\x5f\x69\x81\x17\x45\x4b\xd8\x55\xfa\xc6\x08\xb9\xf8\xc1\xa1\x9b\xf9\xa2\xb1\xf0\x88\x36\x96\xcc\x07\xd9\xa1\xb1\xb6\x84\xb9\xe5\x09\xdc\x32\x21\xe6\xda\xf1\xcc\xc3\xc8\x22\x29\xda\x0b\x17\x16\xfd\x88\xe9\x10\x83\xa4\xa0\xcc\x58\xdd\xad\xb3\xa3\x12\xe5\x64\xf1\xa2\x32\x46\x1d\x56\x22\xad\xa8\xb9\xdf\x27\xd3\xf6\x58\x20\x70\x51\x1a\x2a\x36\xf8\xf4\x81\x3d\x68\xd5\x55\x23\xa9\x81\x0a\x64\x5c\x95\xfa\x06\x8f\xc6\x29\x4f\xbf\x6a\x93\x2c\x78\x26\x8c\xda\x44\x50\x81\x89\xa0\x65\x9f\xee\x17\xd3\x29\xe6\xb4\x8c\x44\x4c\x94\xba\x23\xe2\x71\xa7\x7d\x6c\x49\x12\xf3\x48\x0b\xbf\x2a\x57\x5a\xee\x22\x0f\x6a\xa2\x2e\x49\x52\x5f\x6d\x30\x6b\x4b\xb4\x1f\x2d\x22\x80\x30\x7f\xc7\x44\xf2\x57\xf6\x40\x1d\xa7\x7d\x26\x95\x0e\xae\x1e\x9a\x07\x08\xfc\x15\x30\xa5\xc1\xab\x02\x37\xc9\xc5\x5f\xd9\xc3\xd5\xad\x0a\x39\x71\xb5\x4a\xf8\x8a\xe5\x12\x96\xaf\x56\xa2\xcc\xe5\xa7\x1e\xee\xbb\x82\x9d\xff\xc3\x36\xa9\xd8\x95\x6e\xe3\x0a\xa2\x08\xb3\x54\x67\x00\x0a\x53\x26\xab\x3e\x5e\x89\x6c\xc7\xde\x8a\x64\xb7\xbf\xba\xcb\xd8\xfd\xd5\xfd\x36\x5b\x6d\x5d\xcb\x57\x91\x98\x75\x0c\x4e\x0d\xe9\x96\x46\x77\x6f\xb5\x4d\xca\x2b\xf9\xe7\x55\x91\xb2\xab\x0f\xec\x41\xfe\x97\xcf\x83\x2a\xe0\x46\xda\x51\x01\xb2\x09\xd1\x0a\x0d\xc3\x2c\xc2\x93\xb9\x26\xc2\x37\x95\x87\xdd\x63\x20\x7c\xdd\x0a\x26\xac\x69\x88\x05\x4b\xa6\x5f\x0a\x85\x5c\xa9\x9f\xea\x6a\x95\x67\x8c\x8b\x9f\xf5\xef\x3f\xaf\xd6\x65\xb1\xd3\x4b\x7a\xa5\xdc\x9e\x7f\xd6\xbf\xff\xbc\xda\x27\x1b\xf6\x33\xfc\xfd\xe7\x55\xb5\x2a\x19\xe3\x3f\xeb\xdf\x7f\x5e\x89\x42\x97\xfa\x83\xe1\xf5\x10\x61\x45\xb9\x46\x69\x80\x0c\xad\xb6\x17\x83\x39\x80\xa6\x8d\x6a\x97\xfb\xba\xd7\xa0\x17\x6e\x61\x6a\x48\x38\x92\x42\x9e\x2d\xfa\x5d\xd7\x0b\x18\xeb\xb6\x48\x1f\x88\xae\xb3\xab\x6c\x82\xc0\x5b\xa5\x5a\x95\x45\x9e\x7f\xc3\xd6\x42\x31\xaf\xbd\x84\x19\x9e\xaa\x5c\xaa\x8c\x95\xcb\x4e\x80\xab\xcd\x61\x9a\xda\xda\xff\xd9\xab\xfd\x5d\xb1\xef\x55\x0e\xef\x83\xba\xbb\x3c\xd6\xfb\x0c\x63\xe2\x30\xbf\x07\xb7\x40\xa9\xa1\x41\x22\xcd\xad\xad\x08\xaa\x47\x3d\x01\x41\x2e\x3b\x07\x80\x54\xd7\x15\x55\xa6\x66\x06\xb2\xe6\x5e\x15\xce\x83\x67\x5e\x15\x3e\x0f\x3e\xf5\xaa\xf0\x59\x30\x53\x70\xa4\x0f\xe4\xe0\x94\x17\x49\x1a\x9c\x0c\x67\x00\x57\x76\xab\xdb\xee\x4e\x67\x7c\x69\xeb\xaf\x28\xd9\x7f\x21\x69\x52\x85\xfc\x64\x76\x6c\x09\x70\xbb\x54\x84\x89\x33\xb7\x05\xb8\xa4\x27\xff\x70\xb5\xa0\xd9\x6d\xc8\x6d\x7e\x28\x47\x9b\xb4\xea\xa4\xbd\x66\x65\x89\x10\xb5\x8f\xd0\x94\xf6\xc4\x3a\x6b\xa2\x38\x08\xb7\x21\x70\x12\x3e\xd6\x88\xa5\x83\x55\x94\xa4\x56\xc3\x7a\x5e\xa7\x4e\x30\xa6\x8c\x2a\x14\xbb\x36\x18\xcd\x56\x1f\x42\xd4\x3d\x77\x7d\x31\x44\xfa\x98\xee\xc9\xd6\xf8\xea\x75\x25\x6e\xe2\xe2\xa6\x21\xb7\x6c\x5d\x94\xec\xc0\xd5\xe2\xd8\x34\x4a\x9f\x62\xd6\x24\x4a\x4b\x20\x49\xe2\x2a\xe3\x49\xfe\xa5\x16\x59\xc8\x76\x94\xe2\xd8\x64\xc5\x8d\x5c\xfc\x6c\x77\xc8\x7b\x71\x38\xb5\xe8\xcd\x68\x8b\x5b\xc9\xaa\x75\xc0\x10\x4e\x94\x9c\x95\x91\xac\x7a\xab\x6b\x50\x2e\xcf\x76\xab\xc1\xa9\x69\xf0\xa2\x0c\x07\x4c\x01\xca\x14\x19\x20\xf0\xb9\xbc\x5a\xdf\x0c\x92\x61\x92\x5d\xe0\x7d\xce\xf9\x26\x50\xb5\x58\x22\x1d\x9a\xd8\x6f\xad\xc8\x74\xa8\x3c\x65\x63\xb9\x3c\x6f\x34\x19\xee\x03\x72\xe6\xb8\x39\x53\xc1\x2a\xdd\x2f\x48\x26\xc4\x42\xf2\x0a\x76\x30\x27\x63\x6a\xa6\xe8\xa6\x0c\x6e\x32\x2d\x0d\x4f\xd5\xcb\x8c\xc0\xf0\x45\x0e\x44\x0d\x61\x54\x0d\x25\xa1\xea\x2a\xe3\x95\x90\xa7\x61\xb1\x36\xab\x11\x22\x08\x32\x09\x2a\x00\x05\x79\xbd\x55\xa0\xda\x2d\x04\x18\x4b\x4d\xc4\x40\xc2\xf9\xfc\xd2\xd6\xc4\xa0\x4d\x92\xb4\xbf\x0d\x3c\x4a\x84\x06\x7a\xa9\x1f\x7a\xeb\xa0\x3d\xa5\x7f\x18\x2c\x4e\x98\x89\xa0\x10\x9a\x56\x51\x5d\x20\x5c\xc9\xd6\x01\xaa\x14\x55\xa8\x6d\x86\xdb\x43\x99\xaa\x11\x99\xd7\xba\x96\x1b\xe4\x5e\x87\xfa\xb5\x28\x35\x08\x74\x86\x7b\x02\x20\x70\xec\x33\xf3\x68\x5d\xfd\x76\x3a\x1f\x6e\x50\x08\x32\xc6\x5c\xa9\xf4\x47\x78\x24\x99\xa1\x0f\x85\xe7\xb1\x66\xcf\x17\x62\x71\x69\xd6\x33\x41\xd8\x08\x07\x13\x9e\xb3\x34\x41\x7f\x31\x24\x44\x92\x01\x8f\xf3\xdf\xe9\xc9\xf9\xc8\xba\xbe\x0c\xaa\x35\x91\xbf\x7b\xdc\x14\x61\xbe\xa2\xcc\xd4\x89\x41\xc1\x8b\x5f\xe6\x1a\x9b\x3b\xbb\x63\xba\xfd\x47\xa6\x58\x76\x04\x72\x9d\x35\xda\x99\x37\x9c\x80\x02\x92\x73\x58\x06\x2e\x3c\x17\x77\xac\x74\x15\x61\x94\xb3\xe4\x8e\x99\x64\xc0\xf9\x43\x4b\x83\x01\xf7\x1f\xd3\x53\xef\xb8\x10\xc4\x48\x8c\x02\xa1\x59\x89\x31\x3b\x79\x25\x0f\xc8\xe8\xe0\x8c\x86\x68\x1d\x2d\x43\xac\x29\x1e\xf0\x2e\xce\x54\x48\x71\xa7\x0b\x4a\x8f\xcc\x9d\x5f\x6a\x77\xd2\xa2\xe5\x8c\x09\xef\x38\xf8\xf1\xd0\xc1\x44\x97\x11\x98\xf0\xa1\x09\x04\x44\x7c\xd3\x51\xdb\x94\x4d\xaa\x3d\x62\xfd\x1d\xd4\xde\x87\xfd\xc7\x1c\x81\x2a\x1a\x63\xe8\xcc\x83\xb6\xae\x24\xd5\x5b\x58\xf1\x96\xfe\x2f\xaa\x52\x49\x0e\xef\x4b\x56\x55\x26\xc1\x25\x67\x53\xd7\x52\x30\x60\x77\xdf\x99\x36\xb7\x47\xad\xda\xf5\x5d\xb2\xbe\x8f\x14\x87\xdc\x97\x3d\x09\xc4\xa2\xb4\x22\x21\x94\xc4\xed\x0d\x18\xbc\xae\xec\x6e\xb6\x19\xc6\xfb\xc4\x4c\xf2\x2f\xb7\x06\x98\x61\x36\x2f\xd4\x4e\x9c\x19\xdc\x97\x21\x70\x43\x1e\x39\x94\xfb\x75\x76\xea\x80\xe1\x17\x05\xeb\xb6\x3d\x07\xc8\x69\xb4\xc0\xba\xd3\xfa\x9a\xe3\x1a\xb9\x66\x0c\x83\x82\x84\xa9\x9e\x11\xa3\x07\xf9\x1f\x2e\xac\xd6\x71\xa8\xef\xed\x8c\xc1\x78\x7b\x40\xa6\x82\x09\x5e\x06\x32\xf5\xfd\x32\x90\xfd\x97\x62\x82\x7b\x6e\x15\x38\x44\x68\x9c\xca\xaa\x6b\xcb\xc2\xd6\x24\x0e\x17\x5a\xf5\x79\xaf\xaf\x58\x57\x1d\xf0\x7f\x51\xbf\xfd\x35\x6f\x63\x45\x02\x3d\xdd\xa7\x98\x4c\x79\xe5\x49\xa4\x3a\xf8\xcb\xaf\x87\x4a\xe8\x9a\x52\xc0\x76\x9d\x68\xf4\x6c\x27\x8c\x35\x78\x5e\xcb\x70\xa1\x47\x1b\x9a\x77\xcd\x74\x00\x60\xea\xd7\x12\x44\xe8\x8d\x22\x36\x47\x66\x43\x51\x91\x60\x4c\x91\x88\x0b\xb3\x61\xac\x8f\xb4\x90\xca\xac\x8c\x6d\xda\xda\xee\x36\x41\xdc\xde\xca\x9f\xed\xb6\x36\xc3\x78\x5b\xce\x00\x6c\x25\x49\x61\x91\x92\xea\xf5\x9d\x51\x69\x3c\x3e\xf8\x33\xe8\xb7\xf6\xed\x59\x3f\xed\x7d\x7b\x09\xa9\x77\x73\x60\x11\x5e\x0e\xa5\xfc\xf1\x5e\x6a\xd0\x04\xef\x0e\xc5\x12\x74\x40\xdc\x26\x86\xd6\xa9\xf0\x38\x66\x0f\xc4\x1f\x6c\xe2\xd1\x8d\xaa\x27\x06\x13\x67\x74\x67\xf5\x37\xaf\xe6\xb9\xda\xdd\x6b\xce\x55\xc5\xf5\xb5\x2c\x99\xe2\xc8\x6c\xf6\x69\xcc\xaf\x71\x46\xca\x9e\x01\xcb\xd9\xa2\x09\xd2\x62\xfc\xbe\x74\x1f\xd6\x6c\x31\x3c\x90\x45\x3c\x82\x35\xe0\xde\xf8\xc9\x44\x07\x80\xef\xd3\xe8\x4c\xa9\x61\xc7\x67\x4d\x16\x9c\x4e\xb9\x2c\x38\x46\xdf\x9b\xb2\x67\xe1\x20\x7a\x37\x6b\x93\x9e\x3a\x36\x21\x10\x30\xed\x3c\xac\x0d\x3e\x9d\x07\x49\x83\xc8\x5b\x25\x98\x68\x53\x61\xdd\xa9\xcb\xb0\x22\xcf\x38\x4a\xa0\x76\x06\x57\x60\x61\x1b\xf2\x9a\x6c\xad\xef\xca\x2e\x95\x90\x84\xd2\x2c\x44\x19\x95\xc4\x87\xac\x4c\x7b\x67\x41\x54\x8f\x91\x90\x64\x19\x18\x31\x09\x1c\xe8\x27\xd5\x03\x4c\x32\xa5\x1c\xca\x68\x21\x16\xe6\xe6\x55\x27\xb3\x5d\x80\x4d\x27\xe6\x54\xc5\x32\xab\x68\x46\xb2\x31\x23\xa5\x23\xc2\x7e\xb1\x5e\xcb\xa5\xbc\x70\xc3\x41\x43\x32\x65\x3c\x52\x19\xa3\x92\x6a\x60\x34\x35\xea\x36\xd8\x41\x51\x8b\xca\x18\xc9\xc0\x4b\xa0\xc1\x0d\x29\xf8\x18\xdf\x6a\x8b\x1e\x2c\x53\x12\x49\x2b\x17\xeb\xf5\x25\x4f\x08\xed\xfa\x30\xa4\xb9\xc1\x9c\xdf\x6c\xd8\xce\xe5\xd1\x4a\x24\x47\x34\xd4\x11\xa9\xd9\xb0\x14\x24\x61\xa7\xec\x98\xb8\xbe\x3b\xb1\x3e\x05\xdd\x27\xd2\xc9\xdb\x49\xa7\x04\x81\x79\xb9\x04\x68\x20\xbf\xb7\xe1\x68\xbd\x46\x05\xe1\x84\x45\x45\xdc\x07\x22\x4d\x81\x72\xcd\xc1\x5d\x8a\xa9\x67\xe0\x03\x3c\x94\x40\xb1\x52\xd2\x42\xfc\xc1\xe2\xd8\x38\x88\xb5\xab\x73\x26\x5c\xb1\xe5\x9f\x8f\xd6\x67\x04\x05\x4c\xfb\x94\xdb\xd5\x7d\xa5\xcd\xb8\xc6\x4c\xb0\x8d\xbb\x6a\x6b\xf6\x7d\x5e\xa1\xb6\xd5\x08\x84\x89\x78\x51\x09\x7a\xfd\xde\x8f\xde\x07\x7f\x5a\x46\x4b\x9f\xc4\x4f\x9f\x5c\x93\x5c\x1b\x3f\xaa\x83\xa5\xaa\x25\x48\xa0\x30\xf8\x3b\x17\x59\x5e\xbf\xcc\x73\x8c\xaf\xc9\x41\xd0\x8b\x06\x62\x64\x25\xe8\x69\xb5\xcd\xf2\xb4\x64\x1c\x42\x2e\x2b\x33\xd8\x4a\x3e\x73\x76\x84\x30\x71\xb2\xd2\xc0\x99\x35\xfd\x60\x16\xeb\x8c\x8f\xdc\xec\x42\x38\x85\x78\xfc\x9a\xd7\x68\x45\xfb\x96\xff\x75\x17\x42\xa4\xe7\xc5\xbf\x3f\x54\xdb\xb7\x22\x59\x7d\x50\x36\xaa\x5a\xda\x6e\xcd\xb9\xf2\xcd\x9f\x2d\x32\x7d\xc1\x02\x44\x05\xe8\x38\x93\x48\xc4\x6a\x09\xba\xfb\x96\x75\x54\x69\xbb\x90\x56\xf2\x30\x02\xf9\xad\xab\x11\xe9\xa0\x13\xd9\xcd\x3c\x34\x57\x79\xc1\x9d\x4b\x10\x9b\x58\x03\xbd\xca\x6c\xde\xc2\xde\x1b\xdc\x6a\xcd\x02\x46\xf8\xf9\x1d\x46\x66\x8a\x8e\x48\xd1\xd1\x76\x38\xa5\x45\x4f\x10\x79\x71\xf4\xe5\xe8\xe8\x95\x70\x02\xe2\x51\x75\xa3\x6f\x08\x2f\x46\x85\x78\x83\xa1\xae\xb5\xef\x2f\x03\x75\xb3\x22\xca\xcf\x44\xe6\x1f\x59\x78\x2e\x0b\x67\x63\x37\x37\x39\x8e\xc9\x3a\x16\xe4\xe1\xd0\x5d\xbb\x28\x97\x3f\x68\xab\xd3\xb3\xd3\x90\x55\x5e\x54\xac\xba\xe0\x03\xaa\x2e\xc2\xb4\x02\x4c\x68\x55\x61\x57\xed\x48\x3c\x50\x16\xc2\x3a\x28\xc5\xa4\xaf\x6d\x8b\xb1\xf1\xa4\x35\x17\x69\xc2\xad\xfe\x6a\xc3\x96\xf1\x82\x7b\x1e\x77\x28\x15\x0b\x4e\x6d\xd7\x56\x50\x6b\xce\x6f\x7a\x81\x20\x92\x30\xd1\xfa\x45\x0e\xb7\x54\x0d\x23\x45\x68\xef\x23\x7d\x23\xe4\x5b\x0d\x3e\x88\x13\x86\x31\x3e\x49\x7e\x5a\xdf\xf7\xb5\xe8\xdf\x29\xdf\x9f\xff\xa2\x0b\x35\xd7\x82\x6b\x81\x83\x42\x2e\x03\x78\x95\x8d\x39\x10\x84\x23\xd7\xba\x59\x77\x76\xe9\xb0\x4f\x72\x21\x20\x5a\x83\xb9\x6e\xcb\xff\xf5\xb7\x03\x2b\x1f\x42\x16\xcd\xe2\x40\x43\x70\xa0\x73\x2b\xb1\x72\x34\x8b\xad\x59\x09\x35\x2c\x97\x95\x40\x18\x8e\xab\x97\x79\x8e\xcc\x92\x06\xd3\xf9\x99\x25\x74\x4b\xa3\x8d\x75\x10\xbe\xf7\x0c\x8e\xe0\x18\xec\xee\xf3\x66\x71\xc0\x94\x73\xfc\x8e\x95\x1b\x85\xe6\xc1\xf7\x0e\x5b\x3b\x7d\x88\x6c\xcc\xa4\x95\x58\x85\x95\xf9\x22\xb1\x6f\xf3\x1a\xc0\xbd\x3c\xdc\x8d\x3f\xbe\x56\x6a\xb2\x3b\x65\x44\x17\x0c\xde\x5b\x7d\x21\xee\xc7\xdd\xdb\xeb\xab\x88\xd3\xe2\x8a\xc1\x05\xfe\x5a\xed\x79\x16\x30\xb2\xed\x31\x6b\x0c\xb9\xab\xa6\xf6\xe3\x3d\x31\xe6\xb2\xc6\x4e\x07\x1a\x0a\xed\x2c\xa4\x8f\x8b\x71\x01\x7f\x9a\x81\x9f\x61\x57\xa1\x8b\xdb\x12\x70\xb0\x5c\xf2\x0f\x1c\x2b\x0a\x32\x4e\x38\x48\x46\xda\x82\xa9\x70\xe5\xd7\xb7\xd9\x6d\x0e\x3e\x11\x8d\x3a\x6d\x2e\x66\x96\x5f\xb3\xe2\x50\x59\x05\x64\xf9\x97\x79\xfe\xe8\x60\x46\xda\xf8\xa3\x22\x17\x5a\xfa\xb8\x19\xb0\xdb\x83\x29\x90\xb5\x7d\xe4\xe4\x0d\xda\x85\xe2\x95\x7a\xb9\xb0\x62\xfa\x2b\x42\xac\xc7\xa8\x9e\x1a\x6c\x45\x9a\x26\x0c\x37\xa4\x3d\xea\x1f\xad\xc7\xbe\x2c\x54\x16\x32\x34\xc1\x1f\xe8\x83\x88\x9b\x81\x4f\x8d\x0b\xae\x27\xaa\x50\xa7\x08\x6d\x93\x94\x0d\x57\xab\x12\x0d\xcc\x6e\x8d\x62\xc2\x7c\xe8\xa0\xec\x7e\x85\x9b\x73\x41\xe8\x1a\x2e\x7b\xb2\x6d\x4e\x3b\xe5\x0f\xc4\xff\x55\xd1\x7d\xda\xcd\xee\xc2\x94\x2b\x3b\x12\x65\x58\x31\xfd\x4c\xd3\x8e\x58\xc5\xc0\x18\x86\xa6\xd4\xf1\x44\xf5\xde\x05\x71\x27\xb1\xce\x95\x1b\x49\x67\xae\x04\x04\xb1\x82\x8c\x1a\x79\xc8\x6c\x79\x7b\xd6\x40\x25\x99\x2f\xc9\xf3\xb2\x62\x08\x9b\x3a\x2c\xea\x02\xf7\x43\x53\x8c\x28\xe0\x2d\x62\xd1\xa2\x14\xc1\xcb\x9a\xba\x01\x2f\x04\x82\xd8\x2c\xd8\x55\x41\x57\x45\x6b\x8d\x32\x87\x4b\x73\xac\xf0\xbb\xa3\xc7\x4c\x49\x18\x0e\xa3\x32\x0e\xa2\x38\xe8\x67\x41\x8c\x1c\xfd\x4d\xc9\xf6\xbd\xeb\xce\xba\xdb\x7a\x7b\x7e\xf2\x8d\xc4\x9a\x69\x36\x1e\xf2\x40\x5f\x96\xcd\x22\x6e\x90\x5c\xa1\xa2\xe0\x16\xf6\x39\x59\x2a\xf5\xef\xbc\x97\x5e\xd7\xce\x11\x15\xd8\xcf\x2a\x89\x98\x31\x30\x76\x56\xa1\xf6\xce\x6c\x52\xf4\xec\x43\xb2\x76\xab\x8c\x9e\x2a\x91\xbe\x6f\x9f\xc1\xb5\xd0\xd6\x26\xc5\xfd\x51\x79\x1e\x73\x74\xc8\x49\x68\x87\x59\x57\x68\xdb\xb8\x7c\x2d\x7a\xe1\xb0\xad\xe0\x32\xa2\x0d\x51\xa5\xe7\x92\x91\x31\x77\x45\xc7\x11\xc6\xfc\xbb\x54\x26\x78\x5c\x85\x58\x11\xc3\x38\xc1\x63\xf5\x58\xf1\xd5\x28\x15\x5d\xe1\x33\xb0\x56\xa1\x00\x2a\x0d\xa0\x76\xdf\x34\xa0\x0b\x15\xad\x51\x50\x3b\xa5\x35\x5e\x7a\xac\x69\xfb\x36\x4e\x88\xdc\xa3\xba\xd1\x79\x4a\xa5\xa2\x3b\xa6\xb6\x6d\x90\xed\xda\xc5\x84\x53\x76\xf1\x5a\x1b\x65\x62\xda\xbb\xb2\x40\x87\x64\x30\x80\x8e\x07\x9f\x91\x50\xc6\xa4\xd6\x52\xc1\xad\xfd\x82\xba\xc9\xed\x6d\x59\x27\xa5\xc8\x56\x39\xab\x93\x2a\x4b\x59\x9d\x1c\xd2\xac\xa8\x6f\xd3\xac\x5e\x25\xfc\x2e\xa9\x6a\x08\xae\x2e\xff\xe4\x59\x25\xea\x94\x89\x24\xcb\xab\x7a\x9d\x6d\x56\x09\x84\x16\x91\x8f\x87\x92\xd5\xeb\xa2\x10\xac\xac\xb7\x2c\x49\xe5\x0f\x84\x33\xa9\x77\x49\xf9\xa1\xde\x31\xf9\x81\x27\x77\x75\x71\x10\xfb\x83\xa8\x4d\x60\xcb\xba\x62\x30\x15\x75\x75\xd8\xed\x92\xf2\xa1\x16\xd9\x8e\xd5\x77\x59\xca\x0a\x97\x6c\x04\xbd\xbe\xfa\xf5\x6f\x92\xae\x5a\xa6\x13\xea\xa2\x10\xce\xe8\x7a\x99\x4e\xb0\x7b\xbd\x21\x3b\x41\x8d\x2d\xf7\x0b\x14\x06\xee\x64\x2b\x26\x2e\x8e\x96\xcb\xea\xfa\x26\x76\x89\x9b\xb9\x98\x3c\x48\x2e\x70\x59\x4d\xae\xc9\x9d\xa0\xd7\x2f\x50\xe8\xa8\x48\x87\x65\xbd\x2a\xf2\x1a\xa2\x7c\xd7\xdb\xb2\xce\x76\x9b\x5a\xf9\xdc\xe5\x19\x87\xfe\x26\xf5\x3e\x29\x93\x1d\x46\x28\x5a\xde\x07\xf1\x04\x47\xef\x6f\xe2\xa7\x78\x79\x7d\x73\xbd\xc9\xc8\x2d\x54\xa6\xbf\x5c\x93\xa3\x7c\x85\x8b\xc1\xae\x33\x72\x2f\x5f\x6a\xef\x4f\xe1\xf2\x7e\xb2\xb8\x26\xef\x54\xbb\x41\xb5\x2a\xb3\xbd\xa8\x95\x4f\xab\x6c\x05\x5f\x67\xe4\x95\xb0\xc2\x29\xde\x16\xc7\x1a\xc4\x8f\xe0\xe8\xf7\x9d\xa0\xd7\x5a\xb4\xbd\xac\x9e\xa2\x30\x88\xde\xd3\xb8\xa6\xcb\xea\xa9\xf1\x5d\xf4\x65\x0d\x1f\x64\x0d\x4f\xea\xe5\x35\x0a\x83\x5f\x93\xbb\xa4\x66\xab\x5d\x82\x55\x63\xd7\x19\xf9\x52\x7e\x16\xe5\x81\x2d\xaf\x91\xff\x14\x5f\x93\xb7\x6a\x42\x9e\xbe\x70\x50\x18\x2c\xa3\x57\xaf\x5f\xbe\x7b\xb9\x8c\xea\xe9\x14\xd7\x32\x21\x5e\xc6\xf2\xf9\x66\x59\x3d\x7d\x72\xbd\x21\x2f\x05\x35\x11\x81\xa2\x39\x71\x5f\x28\x4e\xee\x6a\x77\xc8\x45\xb6\xcf\x19\xfd\xc4\x3c\x7d\x72\xe3\x12\xf7\xc5\xb5\xfa\x7e\xe3\xc6\x24\x67\x1b\xc6\x53\x55\x6a\x9d\xb1\x3c\xad\x98\x50\x79\xba\xb7\x98\xc8\xc5\x50\x79\x76\xc9\x5e\x7d\x86\x87\x98\xc0\xec\xab\x4f\x4a\x64\xa2\xbe\x9a\x67\xc9\xd0\xb2\x44\xd7\x6f\xee\x99\x71\xdb\x2b\x67\x62\x22\xca\x20\x7a\x46\xba\x7b\x6a\xe4\xe2\xe8\x2c\xf0\x68\x65\x5d\x15\xf9\x48\xde\x36\xe3\xaa\xc8\x01\x94\x55\xe9\xf6\xcd\x6e\x2b\x0d\xa2\xe7\x67\xe5\x45\xa9\xdb\x2b\x6f\x46\x1a\x6d\x2d\x49\x2c\x5f\x6b\xfb\x22\xb9\x30\x9a\x11\xd7\x25\xae\x1b\xc3\x18\x7f\x7e\xa1\x2e\xc8\x70\xf5\x4d\x19\x71\x43\x7e\x15\x34\x05\x0f\xb6\xd7\x82\xfe\x2a\x3e\xe6\x46\x93\xc5\x4b\x70\x69\x86\xfe\x53\xf5\x9c\x15\x9c\xbc\x34\x77\xde\xc9\x07\xb9\x89\xe5\x83\x19\x27\x3c\xab\x7d\x0e\xdf\xe5\xac\x43\x89\x2d\xbc\xa6\x7d\x49\xab\xb8\x40\xce\xf6\x23\x66\x5e\x42\xd3\xa1\xba\x09\x1c\x75\xdc\x93\x0a\x7c\x8a\xcc\x5d\x44\x08\x9d\xb1\x54\x67\xce\x08\x7a\xe8\xef\xd8\x11\x68\x3d\x60\x32\x94\xad\x0a\x3b\x8b\xcf\x29\xd9\x1a\xa8\xf8\x82\x85\x92\x9f\x16\xbb\x6f\x13\x9e\xed\x47\x6f\x77\x86\x93\xe3\x2c\x16\x5a\x5d\xcf\x47\xd2\x3e\x1f\x26\x19\xbc\xff\x8d\x11\x12\xe0\x45\x7f\x0d\x99\x8a\x7f\xbb\x2f\xd9\xff\x43\x1d\xcc\x78\xc5\x4a\xf1\x05\x28\xa2\xe4\xa9\xd6\xa3\x86\x65\x77\x95\x8e\xea\x7f\xd8\xdb\x33\xfd\xe9\x20\xe1\xac\x79\x23\x56\x4c\xd6\xe2\xa2\x95\xd9\xff\x1f\x8d\xf6\xe8\xa3\x06\x8f\xba\x3e\x76\x02\x18\x45\x68\x6a\x0b\xd9\x0e\xb6\x49\x46\xb5\x3c\x45\x19\x4d\x42\x54\xb2\x2c\xc6\x8b\x6c\x32\xc1\x9a\xea\xe3\xd6\x0a\xd9\x37\x61\xbc\x11\x88\x63\x4c\x78\xaf\xe3\x08\xe2\x15\xb5\x82\x2f\xde\xdf\x1b\x84\x63\xcf\xfb\x45\x40\x51\xe2\xaa\x03\xc2\x1d\xd4\x31\xb8\x0d\xa7\x2f\x7c\x3e\xbf\x39\x1c\x4c\x53\x88\x18\x0c\x43\x19\xab\x44\x22\xc6\x20\x8d\x3b\x0d\xe9\xc7\xc1\x38\x18\x48\xc6\x0c\xa7\x6f\x03\x54\xbf\x3b\xbd\x4f\x8b\x36\xac\xd9\x30\x44\x93\xb9\x9a\x54\xd9\xcf\xa9\x3c\x7a\xb7\xd3\xd9\x20\x44\x2b\x5c\x5b\x77\x29\xe4\xb5\x91\x65\x38\x73\x08\x73\xad\x5e\x45\xc8\x02\x6d\xd3\x22\x99\xaa\x31\x8d\x1e\x54\x6a\xc4\xe8\x42\x85\x91\x14\xbb\x0b\x0c\xf5\x25\xac\xa8\xa3\x8c\x2a\x1c\x07\x0e\x62\x67\x72\xbc\xee\xda\x09\x8b\xfb\xe8\xe0\x25\xe4\xdd\x25\x4b\x6d\x20\xc0\x8d\x80\x48\x80\xe0\xbc\xe0\x8c\x48\x9d\xeb\xfa\x9d\x25\x15\x74\x2e\x1c\x4d\x9e\xb7\x1b\xcf\x75\x76\xcf\xaa\xe7\x3d\x58\x39\x5f\x8a\x08\xdd\x6a\x67\x5c\xa6\xfc\x76\xe5\xf9\x86\xa3\x79\x3c\x88\x1b\x81\xf1\x49\x99\x38\xaa\x6e\xdf\x09\xe2\xbe\x78\x32\xbf\x79\x71\xfd\xe4\xd9\x8d\x8b\xc1\x6b\xa9\x27\x88\x6c\x85\x90\x30\x55\x67\x71\x67\x87\x3b\x07\x20\x8e\x58\x13\x44\x19\x5e\x70\x3a\xb3\x2e\x48\x68\xb8\x46\x04\x83\x03\x88\x3d\x7a\x98\xe8\x0e\xf7\x6f\xa9\x37\x26\x5c\x16\x1f\x7e\x0e\x0b\x51\x8f\xe7\x22\xb6\xb4\x22\x6e\x30\xec\xb1\x8f\xc5\x69\x5d\x30\x9b\x48\x4c\x26\x31\xc9\xf4\xc3\x22\x93\x1c\xa5\xe7\x95\x56\xdd\xfa\x8a\x30\x2d\xb5\xb7\xb1\x1a\xe9\x47\x0a\x46\x60\xcc\x69\x63\x42\xc9\xca\xe2\x86\x38\x33\x4c\xec\xe8\xf7\x26\x7b\x43\x94\x65\xe4\x45\x79\x61\xeb\x80\x0b\xea\x5e\x33\xa0\x33\x3e\x9f\xa9\xcb\xda\xf2\x07\x10\x82\x28\x75\x4f\xeb\xa4\x43\x72\x72\xa0\x33\xb2\xea\xc9\xb7\xf7\x4a\xc3\xb2\xa6\xab\xe9\x9c\x6c\x29\x8b\x66\x31\xd9\xf4\xe3\x9b\x6e\x81\x89\xda\xd4\xb5\x83\xe6\x37\x74\x35\x22\x00\xdf\x4a\x7c\xdb\x0b\xfd\x01\xd7\x56\x62\xcf\xfb\x4e\x43\xf4\xf6\xb1\x48\xcb\x2d\x97\xbf\xf7\xd9\x6f\xa8\xc4\x8b\x0d\xd8\x8d\xce\x62\x6a\x7b\x25\x81\x86\x50\xec\x72\x10\x83\x64\xdd\xa2\xea\x9b\x7c\xb0\xbe\xca\x0b\xe5\xf4\xe8\xdf\x1e\xb2\x3c\x6d\x99\x40\x75\x8e\x9c\xd1\x3f\xc4\x99\x13\x47\x43\x2e\x26\x25\xcd\x6d\x21\x97\xdc\x16\xb9\x25\x45\xea\x9c\xaf\xff\x3f\xd2\xde\xb6\xcb\x6d\x1b\x49\x1b\xfe\xbe\xbf\xa2\x85\xf5\x72\x01\x0b\xad\x97\x1e\xef\x73\xf6\xa1\x06\xe6\x71\xda\x79\x9b\x89\x1d\xc7\x6e\x4f\x9c\xa1\x39\x39\xb4\x04\xb9\x19\xb3\x41\x85\x84\xdc\xdd\x11\xf5\xdf\xef\x83\x2a\x00\x04\x29\xb6\xb3\x7b\xdf\x1f\xec\x16\x41\x10\x04\xf1\x5a\x55\xa8\xba\xae\x52\xd4\xcc\xf4\x26\x4c\xaa\xdc\x0e\xd4\x6f\x34\x2d\xbb\x7d\x82\x7f\xa7\x19\xaf\x44\xee\x16\x9f\xf5\xd3\xfd\x6a\x0f\x61\x46\x25\xdf\x4f\x84\xd8\x3a\xb6\x19\x58\xfd\x0a\x3e\x59\xc0\xc8\xa8\xcc\xf2\x8c\x36\xac\x9c\x7f\xa3\x69\x11\xec\x3c\xc0\x40\xec\xda\x22\xdd\x67\xbc\xe0\x7b\x8b\xa1\x8a\x6c\xe2\x79\xea\x5e\x77\xbe\x1c\x7e\x28\xd6\x31\xe7\xbf\x6b\x66\x86\xc0\xaa\xf2\xf5\xc9\x4d\x51\x9f\x5c\x5c\x8e\xf3\x38\x22\xa1\xe3\x4b\xc1\x09\x42\x18\x7c\xfd\x39\x2f\x09\xeb\xed\x9a\x0d\x2f\xc0\x48\x35\x6b\xea\x75\x72\x37\xfb\x55\x7e\xce\xcb\xb7\x75\x89\x09\x2c\xbe\x9b\x75\x4f\x52\x53\x3c\xa0\x0c\xe1\xdf\x4b\x34\xe2\x99\x4b\xbf\xb2\x20\xb4\x80\x5b\xc8\xde\xc0\xfa\xcb\xd8\xaa\xb4\x14\x73\xbd\xfd\x28\x34\x9f\xfc\xa0\x07\x88\xf3\xe1\x1e\x87\x30\x3c\xac\xb7\xf5\xa1\xa1\x2b\x30\x67\x87\xb2\x19\x27\xba\x06\xd3\xe3\x17\x29\xad\x61\xab\x91\x7d\x21\x74\x14\x31\xcc\xab\x15\xf6\x41\x16\xcb\xce\xa8\xf1\x9d\xee\xe1\x31\x81\x63\x23\xb5\x88\x7f\x43\xbc\x3e\x08\x74\x67\x53\x32\x27\x53\xeb\xd4\x1c\x14\xf4\x7b\x60\x1d\xf9\xda\x6d\x1b\xe8\x2c\xd6\xc1\xfb\x39\xcf\xc9\x74\x99\xc5\xa7\x78\x90\xf6\x0d\x61\xa9\xbf\xea\xc1\xe9\xd8\x40\x04\x93\x69\x9d\x31\xd8\x54\xdc\x68\x51\xbd\xd1\xc2\x27\xba\xa3\x37\xd1\x69\x9d\xf5\xc7\x52\x60\xdd\x79\xa1\x3d\xd2\x64\xbf\x73\x4c\xbf\x75\x90\x17\x7d\xb0\xe6\x0e\xfe\x82\xe7\xa2\x73\x80\xaa\x18\x6f\x44\x65\x61\x30\xcc\x1c\x69\x98\xa3\x7f\xce\x1d\x28\x41\xde\xe1\xd3\xc0\x37\xa9\xb3\x42\x9d\x35\x0c\xa9\xa4\x8c\xf0\x00\x40\xd3\x4e\x78\xb0\x3b\x67\xdf\xdd\x4b\x71\x93\xc7\xb4\xc0\x11\xd9\xf3\xa2\xc8\x71\xea\x75\x06\xd9\x23\xb7\xcc\x7a\x2c\x20\xbf\xfb\x51\x0f\xc0\x44\x57\x27\x9f\x0d\x2d\xa1\x84\x7e\x00\xf7\x98\x07\x82\x44\xc8\x8d\x1c\x45\x3a\x0c\xeb\x3b\x74\x5c\x3e\xd6\x05\xa7\x36\xdf\x59\x38\x88\x90\x3e\x30\x84\xe6\x9d\x17\x86\xd1\x5f\x86\x03\xc4\x17\xcc\x8e\x6e\x61\x32\xc2\x43\x14\x69\x98\xd1\x18\x65\x29\xef\x74\x42\xbf\xd3\x54\x33\xf8\x6d\x93\xf8\xef\x60\x2e\x8c\x3b\x8f\x0e\xa1\x12\xaa\x07\x12\x79\x47\x55\x2e\x64\xf7\xbb\x87\xb0\xe6\xd9\xd0\xa3\x48\x76\x0b\x07\x2c\x57\x00\x4f\xaf\xbb\x44\xc0\x47\x0f\xc5\x96\xe0\x16\x8b\xad\xcf\x2d\x7e\xc0\xa5\x13\xbc\x70\xc6\x98\x9a\x59\x8b\x83\x23\xbf\xd6\x1e\x03\x4b\x06\x34\xd8\x00\x47\x05\xdf\xfd\x19\xe1\x50\xa9\x4d\x73\x29\xf0\xc9\x3b\xeb\x75\x22\x54\xe2\xcb\xf5\xc4\xf0\x1d\xc6\x59\x17\x8b\xe0\x6e\xc6\x34\xa8\x65\xdb\x12\x87\x6d\xd5\xc1\xbf\xf7\x01\x12\xfb\x78\x89\xec\xe8\xcf\xfb\x70\x95\xba\xaa\x62\x82\xbf\x88\xd3\x94\x4d\x92\xfd\x49\x78\x28\xb1\xc4\xd6\x81\xd2\xa5\x3e\x03\xa5\x91\x80\xee\x48\x9c\xe8\xf6\xac\x2c\x63\x12\x88\x71\x23\x2e\xe7\x83\x93\x16\xd9\x3f\x69\x07\xb3\xfe\x1d\xce\xdf\xca\x6f\x5f\xb8\xc8\xe4\x4f\x85\x93\x57\x6b\x01\xc8\xbf\x5e\x6c\xc2\x7d\xd3\x6c\x99\x77\x10\x97\xcb\x52\x9d\x51\xc5\xf8\xb5\x07\x80\x50\x78\x5c\xfb\xd0\x61\x6d\xd1\x3f\x4a\xfd\x46\x87\xa1\x7c\x9e\x67\x22\x80\x4d\x3e\xd9\x07\x8c\x2c\xf8\xd0\x16\x61\xba\xea\xb1\xd1\x1c\x5c\x01\x70\xda\xed\x4e\x4c\x9e\xc1\xe2\x6e\x1e\x1e\x26\x77\x0f\x82\xca\xd1\xd8\x9d\x1d\xfc\x60\xc2\x13\xad\xb6\x95\x6e\x09\xae\x80\xd8\x8e\x41\x10\xf3\x44\xf5\xfc\xc7\x2b\xae\x58\xd2\xb8\xf3\x0d\x7f\x3a\xd6\x18\xc9\xc2\xdc\x0b\x5c\x56\xe0\xdc\x44\x0d\x94\x43\xc5\x12\x7f\xa2\x26\x33\xde\xb0\xb8\xe9\x56\xb0\xaf\x60\xbb\x19\x4c\x1b\xd0\x22\x07\xf3\xc6\xcf\x16\x16\x52\x49\x9e\xa8\x92\x27\x11\xe5\xdc\x88\x71\x5e\xce\x18\xec\xac\x1c\xf1\x8e\xc6\x96\x05\xe4\x32\x0b\xd0\xab\x27\x4e\xfd\x22\x7f\x35\xfb\xa6\xfb\xc0\x29\x79\x4a\x58\x52\x99\xfa\x85\x74\xec\x31\x7d\xde\x5f\x32\xfc\x2a\xc4\x9f\xeb\x9e\x86\x5d\x89\xe7\x3d\x83\x0e\xe3\x13\xfa\xd0\x9a\x7c\x92\x6e\x5b\x07\xcd\x16\x3d\xaa\xc7\x7e\xc2\xe0\x6b\x98\xdd\x9f\xbe\x81\x80\xe7\xc6\xfc\x85\xa9\xb3\x70\xc3\xc1\x6c\x5b\x66\x38\x4c\xa7\x39\x33\x03\x23\x8a\x7e\x34\x62\x24\x8e\x91\x62\x4b\x35\xe0\xb9\xdb\x71\xd5\xb4\x2d\x16\x00\x6e\x9a\x58\xe6\x48\x59\x66\x68\xbd\xe8\x4a\x01\xc7\x49\xd8\xad\x3b\x9f\x4d\xac\x51\x20\xff\x7a\xfa\xc5\x05\x58\x51\x6a\x3e\x29\xa3\x08\x66\x59\x60\x4b\xa9\x45\x23\x0a\xa4\x88\xac\x8e\xbc\x27\xb2\x3f\x14\x9b\xc7\x7b\xb0\x58\x42\x3a\x2d\x66\x2b\x36\x66\x7f\xe1\x1b\x00\x1d\x73\x62\xca\xee\xe9\xf5\xea\x1a\x5d\x9c\x2a\x21\xd3\xeb\x8c\x57\x6d\x0b\xf4\xe4\xac\xe7\x5c\x28\xee\x60\xfc\xd2\x8a\x31\x37\xe2\x37\xbc\x0a\xfc\x41\xaa\x2c\xae\x98\x77\x19\xbd\xb5\x03\xaa\x62\xec\x00\xad\xb8\xed\x49\x81\x27\x72\x9f\x25\xc8\x2e\x85\xd7\xe7\xab\x2f\xe9\xf3\x7c\x2d\x9e\xe9\xb4\xcc\xda\xf6\x99\xf6\x38\x27\xbc\x09\x46\xe5\x3a\x5d\x66\xd3\xea\x21\x85\x7f\xba\x4e\x2f\x8c\x1e\xbb\x4e\x17\x59\xc0\x39\xdb\x88\x66\x56\xe6\x76\xb4\xae\xfa\x80\xde\x5f\x30\x45\x54\x2c\x8a\x36\x16\x45\x7f\x68\x2c\xbe\xf7\x9f\x93\x2e\x32\xd6\x93\x49\x40\xd6\x65\x87\x4a\x58\xf1\x7b\x22\x44\xd9\xb6\x77\xbe\xd0\xc4\x9f\x43\x4c\x04\x7c\x4f\xef\xe6\x22\x6e\xe2\x26\x94\xc8\x0b\x81\xa1\xc4\x43\x75\x2c\xf8\xbe\x60\xed\xda\x8b\x30\x6b\x5a\x64\xdc\xc9\xde\x51\x34\xd9\x8f\x29\x75\x55\x6f\x6a\xef\xcd\x5a\xe5\xc6\x41\x13\xba\x12\xf0\x26\xd4\x5d\x04\xf1\x3c\x65\xe1\x4a\xd0\xf4\x0a\xeb\xdd\x5a\x35\x62\xdb\xf5\x02\xc2\x6d\x3d\xd4\xba\x15\x63\xab\x26\x8a\xb6\xfd\xd2\x42\x61\xc8\x8d\x3a\xbb\x96\xd8\xd3\xd5\x6f\x34\xdd\xf8\x88\x22\xfe\x95\x66\x30\x21\xec\xb1\xb9\xd8\xa4\xd7\xd3\x69\x06\x9c\x94\x93\xba\x6d\xcf\x97\x30\xfc\xdd\xd1\x6b\x65\x14\x5b\xc0\xd1\x0f\x16\xdf\x6a\xb0\xf8\xba\xa5\xa7\x3f\xec\x2b\x16\xcc\xff\x1c\xa6\x7d\xc3\xcc\x36\x73\x28\x82\xd7\x37\x88\x82\xef\x34\xce\x2a\xd4\x38\x95\xdb\xab\x9c\x9e\xd7\xe0\xe2\xb0\x45\x5e\x3b\x35\xc2\xa8\xeb\x04\x68\x04\x21\x59\xc0\xa6\xe1\x58\xc0\xf7\xc2\x12\x06\x03\xf0\xcd\x28\x07\x32\xdf\x0e\x21\x71\x4e\xf4\x9b\x26\x63\xab\x06\xd7\x10\x0a\xba\x4c\x00\x2b\xa4\x90\x75\x59\xa8\xb4\xcc\x8c\x00\x13\x45\xfb\xb4\xca\x10\x74\xca\xe9\x17\xcc\x0b\xdd\x5d\x4a\x5a\x67\xc9\xc0\x91\x18\xf8\x17\xfa\xd2\xb8\xf9\xae\xdc\x4b\xe3\xff\x66\x8a\xee\xa2\xa9\xcc\x15\x5f\x3b\xda\x66\x53\x01\x27\x6d\xa8\xa1\xd8\x0e\xc2\xc6\x49\x2a\x2d\x59\xac\x1c\xdc\x11\xdf\xb9\xa6\x67\xc7\x23\x77\x5a\xfc\x03\x46\xd8\xdf\xf2\x3b\x7a\xd8\xd7\x65\x2c\x81\x46\x3f\x26\xdf\x7e\x7d\x45\x00\x72\x12\x63\xce\xed\x20\xe0\x79\x73\xaf\xd6\xf1\x64\xc9\x2d\x5c\xe9\x64\xc9\x89\xbe\xae\xab\xdb\x86\xc4\xe0\x55\x3a\x0c\x3c\xb8\xad\xf3\xdd\xd0\x99\xea\xff\x96\xb1\xcb\x96\xd5\x67\xeb\x72\xb4\x33\xd6\x1a\xe4\x71\xf1\x1f\x32\x10\xb1\x99\xfc\x9d\x2e\x58\x27\x6e\xae\x4e\x5d\x13\x8d\xf2\xd3\xb3\xf4\xb9\xc2\xb9\x1e\x1a\xbd\xbb\xd8\xd4\x11\xfb\xbd\xe3\x8d\x08\x18\xfd\xbd\x2a\x28\x7b\xe9\x9d\x37\x9f\xb7\xb3\xe2\xd1\x4e\xcf\x5a\x6f\x1a\xe0\x7b\xb3\x63\x8c\xf7\xe2\x9f\x12\x67\x0d\xda\x12\x8a\x3a\x6d\xcd\x2f\x72\x78\x5a\x32\x2c\x85\xe4\xea\xe0\xf9\x45\xd9\xca\xb9\x29\x27\xaa\xeb\x24\x16\xeb\xc0\x64\xcc\xb0\xf6\xa3\x0c\x06\xbd\x7a\xaf\x1e\x1e\x0a\xea\x74\x28\xe8\x3e\xe3\x12\x8b\xf1\x55\x7b\xd5\x7f\xd9\xc0\x3f\x19\x3a\x9a\xb2\x11\xc7\xfd\x41\x44\x21\x6e\x30\x6d\xdb\x59\x82\xbd\x5a\x64\xc1\x11\x02\x8f\x34\x36\x33\xdf\xea\x39\x28\x5f\x69\xfe\x5a\xf3\x9f\x35\x7f\xa4\xc5\x3c\x2f\x77\xd7\xf9\x7b\x9a\xfe\x8b\x65\x8f\xdf\xb3\x79\xc1\xbf\xd7\x62\x5e\xed\xf2\x75\xa1\xef\xdf\x37\x8f\xc5\xfb\xe6\x31\xde\x64\x73\xfe\x07\x78\x44\xe8\x6a\xd7\xd6\xc5\xc7\x6b\xdd\x7e\xa8\xb4\xae\x6e\xda\x52\x6e\x35\x7b\x34\xe7\xef\xe0\xb6\x32\x62\x31\xec\xb6\x34\x99\x9c\xaf\x53\x99\x67\x6c\x36\x65\x73\xfe\xd6\xdc\xbe\xc9\xeb\x8f\x85\x9a\xf3\x7f\x74\xfe\x21\xff\xa2\x64\x7a\x3b\x25\x8c\xce\x1e\xb3\x47\xd6\x35\xe4\x97\x91\xdb\xc9\x64\x77\xc7\xd2\xfc\xfc\x8f\xff\xc8\xa6\x2e\xdf\xdf\xc2\x7c\xe9\xf4\x3c\x63\xc2\x66\xb7\x19\xbe\xd5\xe2\xf0\xd5\x8f\xcf\x7f\x89\xc9\x87\xb2\x5a\x7f\x22\x47\xfe\x93\x16\x87\x5d\xd5\x14\xe0\x38\x41\xf2\x0f\x4d\x55\xee\xb5\x24\xfc\x73\xd1\x14\x1f\x8a\xb2\xd0\xf7\x31\xb9\x2e\x36\x1b\xa9\x08\x60\xa7\x95\xf9\x7d\xf7\xf0\xdf\xb5\x38\x94\x52\x6b\x59\x5b\xec\xee\x78\xc1\xb7\x95\xd2\x3f\x03\xfc\x7b\xfc\x64\xb1\x38\xf2\x7f\x6a\x91\x92\xab\x6a\x47\x38\x79\x0d\xa0\xf0\x9c\x7c\x05\x0d\x45\x38\xf9\x41\x6e\x35\xc9\xb8\x54\x22\x25\x3f\xcb\x0f\x9f\x0a\x73\xf7\x47\xc2\xc9\x8b\xea\x0f\xc2\xc9\x4d\x43\xb2\x4e\x4f\xd4\x1d\x1d\x8a\xe5\x76\xf6\x4c\x43\xf6\x0c\x0a\xa0\x6b\x9e\x69\xb3\x6a\xe8\xea\xed\x6e\xe7\x84\xba\xa9\xb6\x7e\x83\x4b\x23\xf7\x6a\x5e\x08\xa9\x4e\x65\x18\x60\x32\x92\x2a\x2d\xb2\xa9\xe2\xc3\x37\x38\x59\xbb\x53\xc2\xd4\xf0\x14\x4e\xb7\xad\xe4\x44\x59\xfa\xa7\xbb\xd9\xba\x69\x8c\xc8\x6d\x1b\x8d\xe0\xf9\xd3\x17\x94\xaa\xae\xe8\x7a\x48\x77\xe3\x1c\xe1\x17\xc0\x9e\x12\x52\xb7\x39\x3e\xc3\x5a\x40\x24\x57\x8d\x38\xf1\x80\x98\x95\x67\x22\x08\x27\xae\xca\x8d\xaf\x09\x57\xc2\x66\x9c\xd9\x34\xae\x13\x78\xa2\x6d\xf1\x03\x30\xfa\x90\x0e\x72\x09\x42\x18\x82\xff\x0f\x6e\x44\x91\x52\xb4\x66\x5f\x7e\x2d\x2f\x15\xad\xbb\xd0\x40\xc6\x58\x8c\xaf\xa4\x85\x80\xc7\x39\x55\x51\x14\xbe\x7f\x52\x04\x28\xbb\x83\xc2\x8a\x44\xc5\xd8\xc6\x75\xd0\xc6\xcc\x06\x8b\x18\x4d\xea\xc1\xa6\xd1\xc1\x5b\x4e\x3e\x84\x8c\xa4\x8e\xb4\x84\x4e\x6c\x73\x91\x18\xcb\x62\x3d\x47\xef\x60\x63\x5d\x37\x43\xf0\xb6\x3f\x39\x52\x1d\x68\x5c\xe2\x70\x34\xd2\x95\xa3\xcf\x74\xb8\xf0\x0e\x4b\xed\x35\x28\x91\x45\x17\x80\x52\x3c\x6d\x40\x66\xca\x53\x95\x36\x59\xe6\x07\xa2\xb9\xe2\x93\x65\xa0\x38\xe6\x9e\x44\x7d\x82\x1e\x2d\xf0\x89\x8e\x8f\xca\x3f\xc7\x8e\xdc\x24\x8d\x12\xc6\x36\xd7\xd5\xed\xc8\xea\x5d\x2b\xfc\x28\x38\x2f\xbb\x2e\x36\x63\x5e\x16\x36\x0f\x73\x0c\x96\x23\x5b\xe5\x29\x57\xa5\x4c\xac\xc7\xbe\x79\x31\xb5\x3b\xa0\x79\x01\x7d\x60\x37\x54\xf6\x2d\x89\xdb\x19\xec\x83\xee\x12\x9f\x3d\x0e\x1c\x79\xd7\x4d\xe3\x39\xe6\x60\xe9\x1f\xb2\xfa\xb8\x75\xc8\x1d\x7f\xff\x0c\xda\xb5\xcd\xec\x39\x7d\x08\x9a\x1d\xc9\x92\xc4\x0a\x88\x94\xd6\x4d\xf3\x12\xb8\x04\xe3\xc3\xba\x2a\xf7\x37\x0a\xa0\xfa\xe2\xc9\x82\x6f\x8b\xb2\xfc\xd1\xbe\x6b\xd2\x5b\x44\x27\x0b\x5e\x16\x4a\x7e\xe7\xaf\xaa\x2e\x1b\xd0\x1e\xe0\x8f\xdd\x75\xae\x20\xde\xeb\xb6\xd8\x54\xb7\xf0\xeb\x0f\x24\x24\x32\xbf\xaa\xea\x06\xf0\x95\xd6\x0d\x80\x70\x34\xf1\x81\x6c\xcb\x2a\xd7\x24\xf0\xe9\x5a\x37\xcd\x37\x26\x2d\x21\xee\x17\x89\x09\x0c\x09\xbc\x38\x72\xb8\x38\x89\x4f\x45\x3c\x3b\x64\x71\x92\x03\xec\xde\x9e\x33\x2e\x8e\xaf\x1e\xc2\xb6\x08\x39\x6e\x14\x03\xd0\x42\xc8\x05\x9e\xa3\x38\x76\xa1\xc2\xa0\x92\xd3\xde\xb5\xd0\x8a\xee\x79\xc9\x8c\x42\x04\x37\x3a\x3e\xb4\xe0\xb2\xcc\x90\xfc\xcc\x2d\xe5\x4d\x47\xef\xd4\x80\xfe\xd0\x58\x5e\xa7\xc9\x92\x17\x96\x0b\xaa\x8a\xf7\xa9\x02\x68\xe2\xdc\xbb\x94\x07\xf1\x4e\x22\x87\x07\xff\x66\x15\x70\x54\xda\x6a\x41\xab\x74\x99\x4d\x97\xec\x71\x95\x5e\x64\x53\x20\x73\x82\x86\xa3\xdd\x4c\x62\x3c\x17\x8e\x4d\x92\xf1\x89\x0b\xb3\x35\xab\xae\xa3\x98\x34\x85\x17\xcd\xcb\xfc\x25\x05\x14\x6b\x77\x63\x22\x44\x6e\xbf\x0b\x47\x10\x36\x48\x3d\x15\x64\x77\x47\x7a\x08\x09\xa5\xcc\x6b\xb0\x73\xbd\x41\x4e\x12\x62\xf1\xb1\xc1\xa7\xb7\x83\x38\xfe\x90\xaf\x3f\x7d\xac\xab\xbd\xda\x10\xc0\xd7\x4d\x55\x26\x48\xa1\xae\x65\x0d\xc0\x0b\x4d\x47\x99\xd5\xc0\xe7\x35\x9e\x32\xab\x60\x0c\x5a\x94\x01\xf2\x16\x3c\x58\x5b\x7f\x84\x35\x3b\xd8\x71\x3e\x32\x4c\x1e\xee\xf7\xce\x18\xfa\xa7\x3d\x6e\xc7\xc7\xff\xa4\xdf\x07\x5d\x9d\x77\x5d\xbd\x30\x9a\x36\xcf\x2d\xb8\x64\x8e\xd3\x57\x41\x98\x00\x51\x40\x21\x63\x7b\x02\x0e\xa6\xfe\x8e\x99\xfe\xae\x01\x17\x99\x58\x8a\xa1\x3a\xa1\x95\x08\x7a\x39\xb7\x31\xac\x0b\x34\x1b\xbe\xdc\xdf\xc8\xba\x58\xd3\x8a\x25\x55\xdb\x2e\xe2\x9c\xc5\xb9\x59\x64\xc0\x6a\x7d\x59\xdd\xec\xf6\x5a\x6e\xa0\x87\x12\xfa\x3a\x00\x60\xd2\x7d\xd2\x99\x5e\x4e\xaa\xc1\xa1\x83\x1d\xf9\xcf\x7a\x9c\x81\xc8\xea\xe2\x75\xdb\xe2\xbe\x50\x8a\x26\x69\x10\x27\x09\xe1\x25\xe0\x6c\x82\x2a\xd6\xb6\xa6\xc5\x62\x1d\xcc\xb8\x6e\x82\x50\xe2\x4c\x46\x5f\x92\x57\x80\x69\x22\xd8\x34\x98\x91\x53\xd1\xb2\x50\xb2\x28\x7a\xab\x1d\xdf\x16\x9c\xb7\xef\x67\xc0\x0d\xc4\x2b\xb1\x9f\xdd\x14\xea\x67\xb8\xc8\xcd\x45\x7e\x87\x17\x5d\x7a\x90\xea\x9e\x13\xa5\xf9\x16\x5b\x86\x4b\x2b\xc2\x67\x2a\x1e\x3c\x95\x33\xc6\xcb\x23\x8b\xf3\x21\x66\x9f\xc3\xb0\x7d\x63\x65\x81\xd7\xa3\x74\x28\xb2\x97\xed\x7f\xd9\xdc\x0f\xb4\x2b\xce\xf5\x32\x8a\xf6\x51\x64\xe6\x0c\x38\x33\xec\x61\x48\x85\xcd\x36\xf9\x63\xd8\x6e\x46\x9f\x00\x78\x9f\x7a\xaf\x10\xa2\xca\x8c\xff\x1c\x8d\x72\x70\x13\xd6\x23\xf8\x29\xfa\x35\x87\x34\xc6\xb1\x0c\x41\xcc\xae\xf2\xa6\xf8\x43\xba\x6d\x49\xde\x90\xd8\xb4\xeb\x7e\xb6\x2b\xee\x24\xc0\x12\x4e\xcd\x72\xe2\x1e\x28\xc2\x92\x4d\x93\xc2\xd8\x2f\x13\x64\x61\x8a\xcb\xf0\x14\x67\x18\xee\xf2\x0f\x47\x65\xd0\xd9\xa9\x93\x17\xb9\xbe\x36\x7d\x44\x17\xbc\x4e\x97\xd9\x39\x55\x80\x42\x38\xa5\x35\x32\x1b\x98\x95\x2c\xd6\x01\x3d\xcb\x29\x31\x83\x50\x42\x08\x5a\x27\xe4\x03\x52\xfe\xc4\x8e\xf2\x87\xb0\xe4\x49\x6c\xf9\xa7\xc0\x41\x77\x19\x2f\xc0\xa0\x0e\x62\xf2\x93\xa7\xd5\xaa\x9a\x8a\x0b\x46\x50\xe3\xb2\x27\x8f\x34\x9f\x76\xf2\xd1\xf4\x9f\x1a\x58\x0a\x16\xb0\x0e\xd4\x09\xf5\x45\xbb\xcc\xe7\x9d\x54\xbf\xb3\xec\x44\xfd\x87\x5c\xe9\x93\xd3\x07\x6c\x7d\x31\xff\x94\xfc\x8c\x44\x59\xf8\x1c\x8b\xc3\x8a\x8c\x96\xdd\xa5\x4e\x4e\x6a\xfe\xe5\xb2\x3b\x69\xcf\xb7\x6b\x33\xe8\x2b\x93\x53\x84\x6d\x27\x67\x08\xd3\x09\x25\xc5\xee\x0a\x45\x10\xee\x64\xce\x3c\x30\xec\x7d\xa8\xee\xde\x14\x7f\x14\xea\x63\x14\xd9\xda\x9c\x5b\x2c\x9d\xa0\x92\x36\x0b\xb1\x52\x68\xb1\xa5\x8b\xa7\xa2\x68\x5b\x8b\x27\x01\x72\x44\x81\x6b\x31\xd8\x39\xe9\xe2\x69\x70\xd7\xe2\x73\xc2\x9c\x4a\x75\x30\x6b\x0a\x6f\x95\x2a\x56\x35\xec\xcd\x23\xf5\x7a\x2d\xcb\xc2\x28\xe1\x6d\x5b\x80\xa5\xa7\x2b\xa6\x08\x17\xf1\x82\xb5\xed\xc2\x89\xc5\xc5\xd4\x0d\xc0\xb6\xa5\xf9\xd8\x90\xe3\x35\xaf\x18\x4c\x99\xae\x71\xcb\xc0\x64\x92\x73\x25\xbe\xd5\xa9\xcc\x42\xd2\x59\x25\xf6\x28\x41\xf2\x4e\xd7\x89\x22\x73\xe7\x95\x16\xf4\x95\x6e\xdb\x3b\x4a\xfe\x8a\x41\x78\x67\xf0\x3f\xbe\x58\xfc\xe7\xe2\x3f\xcf\x70\xe1\x33\xbf\x90\x62\xcd\xfc\x9c\x3f\x25\x0c\x5a\x99\x58\x7a\x30\xe2\x35\xa2\x18\x34\xf5\xb3\x49\x71\x63\x9a\x23\x37\x75\x76\x76\xab\xab\x8a\xea\xe1\xea\xc8\x38\xd4\x20\x5d\x64\xfd\x30\xbf\xb6\xed\x25\x76\x26\x3a\xf7\x3c\xd7\xb3\xdb\xba\xd0\x92\x92\xbf\x4e\x36\x15\x70\x64\x9d\x5d\xeb\x9b\xf2\xe9\x5f\xf1\x7f\x0c\x69\x00\x37\xaa\xb2\x82\x73\x96\xae\x15\x5e\x69\x8b\x4c\x48\x19\xe3\xd0\x5a\x42\x31\xae\xba\x16\xdd\xf7\xa2\xbf\xee\x4e\xce\x78\x64\xff\x9b\xe0\xf0\x03\xe2\x87\x4d\x9b\xa8\x74\x91\x05\x0a\xe2\x2a\x40\x84\xb7\xce\x82\xf5\xb1\x63\x8a\x93\xd6\x42\x81\x73\xe1\x94\xbe\x2e\x90\x36\x4e\x98\xf9\x60\x91\xf2\x6b\xdd\x02\x31\x9e\xba\x69\x14\x45\xef\xec\x80\x3d\x35\x0d\x30\xa3\x7c\xdd\xe6\x3b\x2a\xf9\x4f\x9a\x9f\xea\x4a\x8d\xa3\xaa\x3c\xb2\xd8\xff\x8e\x47\x08\xe3\xba\x98\xbd\x3a\x8a\x60\x9a\xba\x0f\x76\xf7\x93\xdc\x49\x64\xff\x0f\xb3\xb7\x60\xe6\xfd\x8b\x21\x09\x9e\xd5\x4c\x9c\xd8\x86\xf4\x73\x36\xf1\xa4\xb9\x3a\x41\xe7\x7b\xdb\x2e\x14\xd0\x4f\xc2\xfd\x2b\x19\x6c\x67\x36\xc0\xd2\xb1\xe1\xe1\x25\x72\xe0\x27\xb3\xc5\xf2\x71\x30\x93\xd1\x0e\x36\x7b\xb4\x64\x53\x42\x62\x0d\x4a\x18\x21\x0f\x12\x50\xbb\x25\x01\x0f\xfb\x83\x77\x72\xe4\x9b\x77\xe2\x9c\x66\x09\x01\x1b\x21\x75\xdf\x45\xa6\xcb\xc5\xe2\xb1\x9e\x12\x66\x5e\xc0\x2b\x01\x7e\xab\x58\xb5\xb6\x55\xfe\x17\x21\x2b\x35\x33\x8a\x98\x58\x72\xaa\x9f\x8a\xa5\x49\x02\x39\x3a\x8a\x88\x3d\x07\xad\x8b\x1b\xda\x1d\x2d\x3e\x42\x17\xbc\x28\x3a\x39\x3f\x88\x22\x7a\x7a\xa6\x40\xf0\x4d\xce\x44\x83\x60\xc2\x93\xba\x6b\x25\xea\x2a\x23\x1e\x75\xa7\x7d\xbd\xd7\x15\x2c\xae\x00\xf9\xc2\x46\xb6\xf6\x6d\xae\x9e\x81\xd8\xae\xa5\x2f\x60\xb3\x03\xa3\x5e\xbf\xcb\x6f\xba\x1b\x63\xfc\x95\x6e\x0a\x76\x83\xfe\xe0\x2d\x8b\x85\x32\xca\xee\xb9\x33\x30\xfe\xac\x79\x2a\xdd\xb6\x8a\xe6\xc3\x0c\xc1\x54\xc2\xf3\x4e\x90\x5e\x5e\x59\x23\x26\x40\x32\xa8\xd9\x2e\xb8\x74\x2c\x84\x60\x84\x2c\xd1\xe6\xf8\xbf\x9a\xd9\xc1\xbc\xa6\xb5\xd5\x16\xba\x0d\xa8\x46\xb4\x0b\xff\x4a\xca\x52\x95\xc1\xae\x10\x3b\x9e\x4a\x6b\x5d\xd8\xd5\x9e\xe6\x0b\x7b\xa2\x41\x18\xb3\x20\x61\x86\xc6\xd6\x31\xa9\x74\xf1\x74\xb8\xa2\x04\x29\xb8\x39\xf7\x7c\xdc\x5d\x3f\x7d\x07\x25\xfe\x08\xd9\x1a\x67\xfb\x32\x62\x94\x74\x26\x31\x39\xb4\x77\x8d\x2c\x51\x9e\x38\xd5\x55\x14\x2c\xc4\xa3\x2c\x72\x93\xd1\x4f\x82\xd3\x85\x0e\x4b\x13\xba\xd4\xcc\x18\x2b\xd8\x98\x9f\xb8\xf8\xc4\x56\x82\x39\xf5\x67\xf2\x9d\x24\xa7\x3a\x13\x07\x3c\x6c\x8c\x4f\xdd\xc9\x8d\x3c\x73\x38\x02\x27\xff\x09\x40\x95\x0a\x30\xc5\x63\xa3\xe6\x5b\x01\x11\xdd\x9d\x8a\x54\x1a\x31\xaa\xce\xcc\x0b\x2a\x70\xd3\xaf\xd2\xfa\xfc\x02\xfe\x2e\x82\x08\xe5\x23\x7f\x1b\xc4\x0b\xd0\x41\xdd\x8c\xae\x2c\x2a\xe5\xa8\x12\xd7\x4a\xcc\xff\xe3\x62\x31\xff\xc8\x77\x4a\xcc\xdf\xa7\xef\xb3\x47\x73\xbe\x35\x3f\xeb\xe4\xbd\x9a\x7f\xe4\x1b\x85\xc1\x95\x88\x7b\xd8\x5a\x6a\x86\xe2\x26\xff\x28\xdb\x5a\x36\x52\xb7\xdb\xa2\x94\x10\x6c\x79\xad\xbe\xc0\xbb\xd8\x7e\x92\xf7\x1f\xa5\x62\xf3\xa2\x0f\xf3\xd3\xb8\x80\x88\x51\x64\x37\x08\x60\xa4\x16\xff\xc6\x66\x44\x3b\xa3\xe9\xf6\x7e\xd2\x43\x67\x35\xa3\xc7\x6d\x96\xe1\x1e\xcf\x68\xa4\x75\xd5\xea\x36\x61\x99\xf4\x60\x40\xd0\x84\x77\x1c\x43\x0d\x0a\x90\x65\x4d\x47\xf6\xce\x9e\x14\x20\x26\x4e\x9c\x45\xaf\x68\x28\x89\x1d\x13\x05\x61\x51\x74\xad\xc6\x90\xe9\xa2\x68\xb2\x51\x41\xa8\xbf\x3d\x25\xb2\xa7\xf9\x13\xef\x5c\xc5\xd8\x91\xf5\x3f\xae\x2f\x8b\xc0\x3b\x81\x8a\xb3\xaf\xe8\xa9\xc4\xfc\x8d\x7b\x54\x9e\xe8\x09\xae\x46\x62\x2a\x0e\xe6\x23\x62\x0d\xdf\xc2\x91\xab\xb7\x8b\x29\xd9\x2a\x4e\xde\xd7\xef\x15\x31\x8b\x72\x3c\x92\x55\x8d\x67\x45\x2f\x3c\xdc\xa2\xa1\x8b\xc5\x08\x88\x95\xf3\x03\xec\x7f\xde\xe0\xb4\x4f\xb3\x44\x53\x07\xfc\xa6\x13\xb3\xa1\xf2\x22\x2d\xac\x25\x38\x13\xc0\x86\x2a\xdf\xbe\xfe\xfe\xb2\xba\xd9\x55\x0a\x85\xb2\x29\x11\x64\x3a\x72\x47\xb3\x23\x5a\xf7\xd0\xfa\xa2\x04\x1e\x6b\xbf\x91\x5a\x17\xea\x23\xf2\x1a\x05\xd7\x33\x5d\xe7\x1b\x58\x57\x73\x60\x06\x72\xed\x69\xa6\x9d\xc3\xb2\xb1\xbc\x42\xaf\xca\xbc\x50\x96\x0c\x4d\x32\x66\x97\x1a\x19\x0a\x54\x15\xf5\x63\x06\x63\xa3\xd0\x51\xf4\x68\x1d\x8c\xbc\xbf\x80\x64\x1f\x15\xad\xb9\x4c\xeb\x8c\xab\xc0\x66\x5e\x58\x02\xae\x28\x70\x95\x5f\x2b\x4e\xa6\x84\x1d\x3b\x65\xf8\xe3\xd0\x75\xaa\x6f\xbd\xd7\xbe\x6e\x81\xb0\x67\x76\xdf\x83\x6a\xdb\x9d\x1f\x95\x49\x4d\xa5\xd9\x92\x4d\x69\x53\x92\x92\xe9\x29\x24\x5b\x91\xe8\x98\x10\x36\x25\x19\xe1\x05\x52\x72\x77\xae\x52\xaa\x6d\xdd\x03\x13\xef\x66\xa5\x19\x83\xd8\xbe\xe0\x83\x0b\xf3\xc1\x9a\xf9\xd7\x14\x50\x9c\x4e\x8b\x0c\x4b\xb4\x75\x25\x1f\xca\x7d\x7d\x06\xa8\x8c\x67\x16\xaa\xf1\xcc\x61\x34\x9e\x95\x55\xbe\x39\xab\x65\x53\xfc\x21\xcf\x90\x87\xe0\x0c\x31\xe4\xcf\x00\x9e\xf4\x6c\xf3\xa1\xc4\x1f\x00\x90\xbc\xa9\x6e\x15\xfe\xda\xef\xf0\xaf\x11\x65\xce\x3c\xa6\xf2\x99\x83\x51\x3e\xeb\x20\x97\xcf\x3a\x98\xe5\x33\x44\x9d\x3c\xb3\x21\xde\x1d\x06\x30\x94\xeb\xb0\x80\xcd\x8f\xfd\xee\x4c\xd6\x75\x55\x9f\x05\x9c\xb3\x7d\x52\x89\x53\x8f\x59\x9d\x8d\xc3\xa1\x9f\x1c\x80\x2c\xf0\x28\x02\xfa\xce\x06\x5a\x29\x87\x3c\x6e\x01\xe0\xf4\xa9\xa3\xc5\xb5\xf9\xc0\x2f\x80\xd4\x75\x5f\x6c\x64\x8a\xee\xa3\xa9\x06\x56\x32\x40\x89\x7e\x90\xdb\xdf\x63\x10\x22\xe2\x3d\x1c\xde\xec\xd5\xc9\x23\x83\x07\xb6\x5b\xff\x04\xeb\x48\x0c\xfe\x1c\xea\x10\xf0\x26\xcc\x08\xe1\x7b\xf5\xc0\x53\x3d\xc0\x91\x61\x0b\x26\xc1\xeb\xc9\x63\xf0\xbd\x75\x09\x9a\xcb\xb6\x35\x69\x40\x30\x8e\xbb\xe8\x8d\xe2\xf7\x8a\x7f\x56\xc2\xa1\xb3\x7f\x30\x3b\x68\x32\xe7\x77\x4a\xcc\xff\x7d\xf6\xf8\xd1\x9c\xdf\x2a\x31\xa7\x69\x12\x65\xec\x57\x91\xfe\x2b\xca\x1e\xcf\xf9\x15\xec\x97\xb3\xc7\x09\x8b\xd3\xb3\xf7\x3a\x7b\x4c\xd3\x7f\x99\x25\x32\x7b\xcc\xde\xd7\xc9\xa3\xf9\xc7\x1b\x7e\x69\xb7\xd4\xfc\x43\xb5\xd7\x6d\xbe\xdb\x99\x7f\xe7\x8d\xae\x6a\xb3\xff\xce\xa6\xe7\xd0\x77\x0d\xe2\x47\x94\xb0\x23\xb7\xb7\xc5\xe6\xa3\xd4\x2c\x7e\x34\xe7\x2f\xed\xe3\xdf\x7e\x7d\xd5\x7e\xf7\xf5\xb3\xe7\xec\xd1\x9c\x7f\x32\x69\xef\xe7\xef\xe7\x73\xfe\x35\xdc\x4e\xdf\xdf\xce\xa6\xe7\xd9\x34\x06\xe6\xe2\xf9\xfb\xb9\xa9\xc6\x3c\xf9\xf7\x18\xb9\x8c\x63\xfa\x7e\x33\x65\x2d\x6b\xd9\x9c\xbf\x31\x5f\xb8\x55\x33\x33\x7d\xf8\x33\x65\x24\x99\xdf\xe0\xff\xe7\x4a\x90\xc7\x73\xe2\x88\x79\xc8\x63\x1b\x60\x78\x0f\xb0\xdd\xb5\xdc\x5a\x2b\xfc\x0f\x8a\x99\xb4\x93\xd0\xfa\x9c\x30\x7e\xaf\x20\xa7\x20\x84\xdf\x2b\x61\xaf\x8e\x37\x4a\x7c\xad\xd0\x60\x77\xaf\xfa\x1e\x91\xc0\x43\xda\x2d\x6d\xdf\x85\x12\x69\xb0\x78\xa9\x11\x14\x52\x5c\xde\x35\xd7\x02\xaa\xea\xf6\x9b\x05\xaf\x84\xee\xbf\x24\xa4\x48\xcd\x56\x43\xbf\x23\xc5\x2c\x6a\x48\x2d\x2a\x74\x61\x23\x53\xb0\xc2\xa7\x8b\xcc\x08\xe4\xb5\x3f\xde\x07\x17\x6e\x8e\xb4\x07\x12\xa4\xb7\x34\x63\xb3\xbd\x42\xc2\x47\xc5\x58\x3c\xbc\x67\xd1\xd9\x82\xf8\x90\xdf\x87\x47\x16\xa6\xe9\x73\x21\x85\x10\xbf\xa9\xae\x21\x1a\x5a\xe2\xfd\xbd\x57\xb1\xd3\x12\x18\x02\xdc\xbe\x03\x27\x18\x69\x4f\xd5\xb0\x8f\xac\x45\x89\x54\x9b\xfe\xa4\x70\xd8\x74\xeb\xb6\xcd\x8d\xc8\xb9\xce\x92\x3c\x99\xd0\xbd\x58\xb3\x58\xc7\x54\xcd\x9c\xab\x57\xe3\xbf\x6a\xcd\x78\x63\xfe\x9b\x2c\x8d\x7c\xbd\xf7\xfe\x7b\x61\xe6\x74\x91\xb1\xb6\x9d\x54\x29\x79\x4c\xb2\x28\x6a\x60\xec\x04\x91\x46\x43\x36\x9d\xc1\x9e\x3c\xdb\x96\xb9\xfe\x11\x23\x94\x81\xaf\xce\x6f\x1b\x8a\xa9\xb4\xc8\x2c\x0b\x08\xad\xd2\x22\x4b\x64\x5c\xb7\x2d\xad\xc5\xe1\xc8\x58\x5a\x64\x42\x41\xa4\xb8\x53\xa0\x02\x2e\x86\xc9\x82\x1b\xdd\x8a\xdb\x03\x73\x33\xdc\x4f\xcc\xec\xa3\x88\x93\x51\xf4\x46\x39\x9b\xdf\x1b\x35\x8e\x00\xbb\x0a\x0d\xf4\x70\xaf\x84\x18\x14\x7b\xfa\x75\xd6\x49\xa1\x25\xd2\x84\x16\x1e\x5d\xaa\xe4\xd2\xd3\x85\x49\x9f\xba\x80\x23\xa7\xc1\xb8\x4c\x3c\x80\x69\xac\xa2\x68\x8c\x0a\x94\xe6\x82\xbc\xfa\xf1\xcd\x15\x61\xbc\x09\xfc\xb2\x47\x5c\xf9\xf2\xc0\x8d\xef\x5a\xdf\x94\xe8\xd6\x17\xab\x23\x9b\x6d\x2a\x25\x69\x28\x35\x56\xdd\x5a\xca\x1b\x0c\xcc\x2c\x92\x3b\x4a\x10\x7a\xc3\xbb\xa6\x81\xdc\xd7\xc8\xef\xae\x5e\xfc\x00\x56\x32\x40\xcd\x2c\xd0\xf9\x6a\xb6\xae\x6e\x76\xa5\xd4\x92\xd6\x51\xd4\xdf\x1c\xec\x31\x7a\xcd\xab\xb6\x4d\x81\xbe\x65\x57\xa9\x06\x9c\x63\xb9\xe6\x32\x03\x40\x6b\x70\x74\xf3\xba\x35\x8c\x16\x9d\xd7\x9a\x70\xfb\x1b\x94\x6d\xf3\xf3\xd2\xbe\xc7\x5e\x7e\x6d\xf6\x63\x97\x6b\x0f\x1e\x10\xee\x4a\xaa\x4d\x5f\x33\x1f\xdd\x92\xc7\xb6\xa1\xc1\xf9\x3d\xb2\xb8\xc7\x0b\x5e\xe6\x8d\x7e\x51\x6d\x8a\x6d\x21\x37\xf1\xe1\xc8\xa5\xce\x3f\x02\x75\x7b\x30\xb8\x63\xe8\x84\x7b\x15\x3a\x54\x16\xcd\x0f\xd5\x3a\x2f\xe3\x4b\x2b\x8c\xdd\xa8\x74\x99\x31\xef\x4c\xb9\xe0\xbb\xba\x32\x35\x07\xaf\xd8\xc9\xc2\xb9\x5b\x7a\xe4\x55\xec\x45\x33\x30\x8b\x35\xf0\x48\xcc\xef\xce\x6f\x6f\x6f\xcf\xb7\x55\x7d\x73\xbe\xaf\x4b\x14\x8b\x37\x2b\x20\xf5\x32\xba\xe2\xdb\xab\x6f\xce\xff\x9b\x70\xf4\x6f\x6d\xe2\x03\x79\x4c\xe2\xe7\x8a\x03\x48\x09\x44\x1e\xcd\x77\x46\xb8\x25\x18\xa0\x8f\x29\x38\x48\xee\xcc\x75\xef\x4d\x37\x25\x3f\x83\x0c\x77\xe6\xfe\x6f\x0d\x38\x76\x05\x19\x4c\x8a\xcd\xf1\x5b\xfe\x39\xb7\x2e\xa3\x01\x42\xdc\xc1\x94\x69\x9e\x9e\xe3\xeb\xe0\x4d\x73\x2c\x09\x9e\x9e\x1f\xb9\x1b\x14\xdf\x00\x44\x0e\x3e\x42\x5c\xe2\xbb\x17\x3f\x10\x5b\xf7\x70\xf0\xb8\xca\xb8\xb4\xbf\xbd\xf9\xf1\x25\xbe\xf7\xb3\xac\xb5\xac\xe1\xbb\xa1\x62\x24\x7e\x03\x93\x9e\xc3\x97\x82\x29\x99\x98\xe6\xc5\x4b\x53\x0a\x89\xed\xe0\x36\x85\xd8\x74\xf3\xbd\x2e\xf9\xdd\x8b\x1f\x8e\x3c\x58\xb6\xb0\x97\x5d\x0f\x01\x24\xee\xd1\x8f\x83\xfd\xee\x01\xf1\x28\xf9\x55\x51\x58\x1c\xfb\xeb\x21\xe3\x9a\xc5\xbf\x2a\xda\x4f\x05\x6c\x3e\x93\xf0\xaa\x96\xd6\x52\xf9\x9d\xa2\xcf\x14\x83\xc4\xab\x3a\x57\xcd\xae\xaa\xb5\x49\xfc\xcd\x26\x0e\x2c\x63\xa7\x90\xcb\xb0\x83\x4a\x8e\x84\x1b\x42\xc1\xe2\x7b\x12\x57\x0e\xe1\x18\xbe\x2e\xfb\x1d\x3d\x1c\xb9\x62\x7c\x2b\x76\x0e\x0f\xb5\x6d\x77\x7c\xd3\x5d\x46\x11\xdd\x06\x61\x2e\x5b\xab\x46\xb1\xe4\x8e\x6e\x3d\x4b\x12\xbf\x16\x77\xb3\xe7\x72\x2b\xeb\x5a\x6e\x28\x83\xc0\xf4\xcb\xbc\x2c\x3f\xe4\xeb\x4f\x0d\x25\x95\x5a\xcb\xb3\x1b\x79\x53\xd5\xf7\x84\xf1\x1b\xb1\x9b\x35\x3a\xd7\xfb\xe6\xd2\xa2\x16\xf2\x7b\xb3\x6f\x7e\x36\xff\x7d\x10\x0b\x7e\x2b\x08\x72\xb7\xc8\x0d\xe1\x97\xe2\x50\xcb\x7c\x73\xff\x46\x1b\x89\x71\xc1\x3f\x4a\xfd\xda\x8e\x89\xef\x00\x92\xeb\xd4\xfd\xd4\x08\x05\x17\x42\x88\x0f\xc8\x2a\xbc\x66\x87\xb5\x38\x1c\x1d\xd9\xa0\xb8\xb2\xd2\x4b\xce\xd8\x3a\xd5\xa7\x30\x0d\x42\xa7\x17\xd9\x51\x8b\x75\x3a\x88\xe5\xcc\x8e\x3d\xb5\x5d\xa3\xda\xae\x8f\xa6\x4e\xcf\xca\xb2\x5f\xad\x66\xc4\xfa\x01\x95\x4a\x72\x8b\xc9\xd9\x98\x2f\xf9\x7d\x2f\x1b\x7d\xf2\x21\xa1\xad\xb9\x57\x05\xb7\x11\x7d\x68\x5b\x2a\xc5\xe7\x54\x65\xf0\x5f\xdb\x4a\x7e\x9f\xca\x4c\x68\xb7\xda\x1a\xcd\xa1\x2e\x36\xf2\x45\x71\x83\x9c\x31\x23\x8b\xa2\x29\x64\x37\xbb\xb1\x39\x84\x74\xcf\x76\x9d\x33\xde\xb6\x00\x7e\x7b\xf1\xf4\x03\xb8\xcc\x5b\xef\xc7\x1b\xb3\xf0\xa6\x37\xc8\xe1\xa8\xb3\x0c\x55\xc6\xcb\x59\x5e\xde\xe6\xf7\x0d\x95\xe9\xa5\xed\xf3\x01\xf6\x37\xcf\x3f\x98\x71\x7e\xea\x42\x2c\xdb\xf6\xd6\xe5\xdc\x47\xd1\x7e\x06\x19\xa9\x66\xfc\x13\x5d\x70\xf7\x9d\x60\x1e\xb8\x9e\xed\xea\xea\xa6\x68\x24\xbd\xec\xb6\x2a\xf1\x71\x96\x6f\x36\xfc\x72\xd6\xe0\xc6\x21\x2e\x61\x6b\xe4\x97\x33\xd0\xf2\xc4\xe5\x6c\x9b\x17\x25\xdf\xcd\xf6\x75\x29\x28\x95\x6d\x0b\x3f\xdb\xf6\x5e\xb1\x69\x18\xdd\x7e\xa7\x78\x78\xf9\x49\x71\x58\xe1\xa7\x64\x3e\x27\x8c\xef\x30\x52\x5b\xcd\x6e\xa4\xbe\xae\x36\x6d\xab\x6c\xa4\xc4\xce\xa7\x60\x16\xbe\xeb\x44\x2c\x67\xbf\xef\x92\x30\x9e\xf0\x61\x41\x97\x90\x8c\xe3\xa8\xdb\xcd\xd6\x75\xd5\x34\xcf\xab\x9b\xbc\x40\xe8\x7e\x27\x8d\x43\xfd\x07\x02\x39\xef\x65\x17\x13\x88\x25\xa9\xd3\x65\x26\x84\x80\xcf\x88\xa2\x3a\xbd\xb0\x57\x17\x99\x29\x2f\xfd\x4b\xd6\xb6\x94\x5c\x6b\xbd\x8b\x51\x72\x5e\x66\x09\xf9\xef\x05\x89\xc9\x93\x27\x7f\x21\xe0\xd0\x63\x36\xb9\x41\x36\x28\xad\x97\x0f\xde\x8e\xe1\xd6\xbb\x59\xb0\x09\x76\x28\x9c\x5e\x4c\x73\xf9\x6c\x8b\x08\x67\x67\xc4\x4b\xd3\xc8\x81\x61\x87\xf1\xdf\xcd\x52\xc9\x77\x5c\xf1\x4b\xc6\x71\xa6\xdb\x91\x72\xb9\x2a\xc5\xce\x82\x19\xf0\x32\x8a\x16\x70\x58\x82\x7b\xfc\x74\xda\x91\xd5\x38\xa5\x3b\x10\x46\x7c\x5f\xe2\x9f\xbe\x5b\x30\xdf\xcd\xae\xf3\xc6\x85\x13\x4d\x5e\xda\xbd\x1e\xb3\x32\x5e\x09\x68\xfc\x5e\x2e\x98\x5c\xf6\xb3\xec\xfd\xa9\xa0\x1f\x54\x17\x59\x15\x91\x98\x24\x84\x4d\xed\x57\xda\x18\x11\xbc\x82\x9e\xcb\xd7\xd7\xd2\x61\xdd\xe3\x40\xbd\x55\x23\xa7\x31\xb7\x8a\x93\x47\xcb\x5f\x05\x99\x7e\x56\xd3\x29\x8b\xab\xe9\xe8\x6b\x88\xcf\x61\x0a\x2f\xb6\x4e\xd8\x81\x73\x85\x50\xfa\x81\x00\x96\xcb\xd9\x70\x7d\xa2\xe4\xfb\xed\xb9\xcb\x73\xfe\xa6\x50\x6b\x49\xf8\xc9\x93\x20\x5b\xe9\xfc\xe3\x97\x0a\x79\x59\x29\x79\xfe\xc2\x8c\x6e\xd2\xe5\x66\x8c\xd3\x6e\xbc\x74\xed\x68\xae\x02\x51\x69\x82\x24\x01\x2a\x4c\x63\xe3\x6f\xb2\x05\x9c\x9b\x2c\x84\xf7\x4a\x61\x7c\xec\x81\x67\x20\x52\x91\x70\xaa\x02\x2a\xdb\xce\x06\x13\x35\x69\xff\x4e\x96\x3c\x78\x67\x6a\xd4\xa6\x89\x99\xae\x61\x72\x42\xf8\x19\x99\x3e\x57\x53\xb2\x3a\xfb\x5d\x2c\x66\x0b\x38\x69\x64\x71\x57\x8c\x51\xba\x58\xa7\x33\xed\x66\x88\x3b\xd9\xb0\x91\xfa\x16\xdc\xdf\x46\x84\xad\x2d\xdd\xcd\x30\x1a\xdc\xc8\xc7\x30\x68\xba\x4b\x8c\xa9\xd8\xf2\x4b\xbe\x63\x96\x69\x01\xa7\x8e\x9f\x3b\x76\x89\x65\xab\x5b\x41\xe0\x27\xf1\x15\x39\xd8\x55\x34\x5e\x72\x58\x3e\xe3\x25\x77\x0b\x6d\xbc\x3c\xb2\xcb\xb4\xc8\xe8\xce\x55\x62\x2f\x7e\x37\x62\x8b\x9d\xa0\xec\x70\x39\xeb\x76\x70\xb1\x34\xd3\x72\x33\x98\x80\x10\xd5\x9e\x5e\xf2\x5d\x66\x86\x26\x48\xc8\xa6\xd5\x75\x71\x23\xab\xbd\x36\x4a\x10\x6d\x44\x23\xf5\x15\x26\x84\xe6\x7e\x57\x6b\x62\x33\x03\xda\xb3\x7b\x92\xa1\xd1\xe3\x83\x58\xf2\xfd\xac\x31\xf2\xfe\x3d\xff\xe4\x48\xe1\x5f\xa2\x78\x00\x3b\x19\x83\x80\xa7\xb3\x97\xab\x4f\xf4\x7c\xc9\x5f\xb2\x23\x86\xfc\xc1\x15\x79\x59\x9d\x79\x89\x8c\x04\x7e\x4c\x9f\xfa\xca\xff\x9a\xdf\xf3\xcf\xfc\x96\x5f\xf1\x97\x42\xad\x2e\x26\x42\x7c\x88\x22\xfa\x41\x5c\xf0\x26\x8a\xc0\xd5\xd2\x55\x1f\xe8\xe0\x35\xcf\x45\xd1\xb6\x84\xf0\x5e\xfb\xc8\xa7\x8b\xe4\x49\xbc\xe0\x6b\x21\x9f\x8a\x8b\xc5\x22\x8a\xfe\xb2\x58\x3c\x95\x6d\xfb\x97\xc5\x13\x21\x84\xe4\x75\x14\xd1\x5b\xf1\x42\xd1\x1d\xbf\x04\xdf\xc4\x5b\xf1\xa3\xb9\xb8\xe5\x97\x7c\xcd\xf8\x3a\xa1\x83\xc9\x7d\x25\x2e\x67\x27\x52\x13\x25\x3f\xe4\x8d\xf6\xd3\x99\x30\x7e\x35\xb6\x0e\x88\x2b\xc6\x1f\x78\xde\x4c\x5b\xff\x98\x9d\xc3\xe2\x8a\x31\x7e\x81\x15\x6d\x5b\xf2\xdd\xd7\xcf\x9e\x9b\xbd\x01\x97\xc9\xe4\xa5\x20\xaa\x72\x0e\x31\xb1\xfd\x1e\x4c\xd5\x37\xae\x22\x31\x7d\x29\x6e\x41\x56\x90\xfc\x5e\xdc\xe2\xd2\xf8\x59\xdc\xe2\xb6\xcd\xd7\x62\xf2\x99\xb1\x98\x7e\x16\x2f\xb9\xd9\xb4\x27\x2f\x59\x14\xd1\x97\x82\x48\xd4\x15\x17\x4f\x81\x23\x50\x2c\xcc\xf6\xe3\x64\x0e\x21\xfd\x4f\xa3\x5b\x08\xaa\xda\xf6\xa5\xd9\xe5\xf9\x3a\xb9\x36\x3a\x6b\x55\x7e\xc6\x00\xa0\x2d\x4f\xef\xf9\x4b\x7e\x99\xb1\xd8\xdc\x30\x12\xb6\x4b\xbf\xe4\x2f\xf9\xe7\xac\x2b\xd4\xc8\x47\xf4\xc6\x88\xb3\xba\x3f\xa4\xd7\x49\x4f\x61\x8d\x43\x55\xd6\x8c\x71\xbe\x4e\xee\x63\x53\xd2\xc7\xd9\xb6\xa8\x65\x50\x7e\xc6\x4c\x49\x74\x30\x3b\x3a\xa5\xd8\xce\x90\xf3\x73\xb7\xa5\x75\xfc\x53\x83\x0d\xad\xda\x91\x80\x50\xfe\x12\x44\x54\xa3\xfd\x3c\x0c\x46\x8e\xee\xae\x9a\x2b\x4e\x40\x67\x62\xf0\xcc\x1b\x50\xf8\x1e\x0a\x4a\x08\x9e\x71\x11\xa5\xc7\xee\xdc\x36\x05\x8f\x5a\x4e\x76\x55\x33\x72\x8a\x6e\x44\xd7\xbe\x47\x0c\xaf\xc6\xe3\xde\x30\x58\x44\x54\x6d\x5b\x70\xc7\x18\xc4\x47\x8c\x22\xaa\x33\x8a\x54\x68\x0f\xa9\xb9\x5b\xb6\x8a\x63\x1f\x48\xe2\xc5\x98\x73\x26\x98\x7d\x9c\x66\x0b\x5e\x99\x7e\xed\xb6\xca\x03\x79\x6c\x86\xf3\x3e\x5d\x64\x6c\x3f\x43\x93\x9a\xd9\xfc\x2d\xf1\xbc\x90\x5e\x98\x36\x1b\xd4\xc8\x9c\xe9\xed\x48\x2c\x84\x85\x32\x8b\x7d\x69\xe4\xea\x32\x6d\xb2\x28\x32\xff\x77\xc1\xeb\x7b\x6f\xc0\x6b\x1c\x37\x84\x59\x66\xd3\x45\x56\xa8\xb3\x9a\xe5\x50\x23\x90\xb8\x0f\xbe\x30\x34\x88\x4d\xf6\x16\xfe\xa8\x53\x9c\xd3\x06\xdc\x36\xcc\x8d\x8c\x1d\x72\xd1\xb8\x12\x21\xba\xa6\x61\xc7\x5c\xe4\x6d\x5b\xb8\xb1\x93\x27\x34\x9f\xe0\x37\x1b\x29\xdc\x55\x24\x67\x08\x33\x10\xfa\x60\xfe\xf8\x30\x0a\x80\x51\xed\xd6\x61\x83\x5a\x4b\x19\x82\x81\xa5\xcb\x8c\x75\xb4\x53\x41\x5d\xd9\x3e\xcd\x87\xda\x59\xef\x5b\xf2\x6c\x55\x89\xb5\xeb\x0a\x17\xbd\x6c\xda\xb1\xb3\x45\xa1\xd9\x01\xa3\x72\x55\x3a\x92\x0e\x6a\xd3\xa4\x8c\x22\xe0\xd8\x35\x55\xfc\x06\x54\xf2\x28\xa2\x5a\x84\x09\xc0\x13\xe6\x3e\x01\x90\x02\x2a\x1e\xbc\x1e\xc0\x0a\x60\x84\x54\xac\x12\xa5\x3f\x5c\x43\x49\xa0\x8c\xa2\x72\x62\x6e\x41\xd4\xb1\xd8\xa7\x25\xf4\x43\x95\xb5\xed\x3e\x25\x8f\xe1\x27\x9f\xe4\xcc\xef\xfd\x7b\x53\x5e\x23\x8a\xf0\x0c\xaa\x41\xd1\xbd\x02\x63\xa1\x2b\x02\x04\x0e\x5f\x0a\x5c\x31\xd3\xb3\x42\x4c\x16\x89\xc9\x56\x64\xf1\x1e\x4d\xaf\x93\x05\x06\x32\xa4\x8b\x8c\xaf\xbb\x51\x65\x3a\x20\x18\x59\x39\xe4\x34\xaf\xcf\xa3\x48\xa6\x2e\x1a\x38\x63\x5a\x00\x3e\x11\x7c\x98\xd9\x58\xf1\xda\xee\xa7\x3b\x7f\x42\x0d\xab\x77\x4c\xc0\xb8\x52\xdb\x85\x19\xc5\x86\x3c\xd9\xc5\x66\x3f\xc5\x2e\x6c\x00\x52\xbd\xae\x6e\xce\xc8\xd4\x7c\x8a\xae\x4c\x2b\x1c\x8f\xc7\x7e\x39\x8d\x33\xfd\xc1\xa4\xd6\xc7\x63\xcf\x7e\xe1\xed\x60\xb8\x04\x59\x83\x57\x67\xad\xe2\x67\x3d\x83\xd6\x03\xe9\x72\x7d\x33\x9a\x7e\x77\xde\xdd\xe9\xd9\xbd\xec\xdb\x46\x01\xaa\x07\x76\x2a\x30\x38\xd9\x22\xc6\xa3\x7c\x03\xf4\x35\x64\xd0\x3f\xba\x15\xce\xdb\x87\xa8\x8f\xd7\x0e\x4b\x90\x5e\x49\x40\x6a\x6d\xbc\x9a\x2c\x81\xff\xb6\xa7\x27\x5a\x48\x31\xb4\x59\x4a\xfb\x46\x81\x07\x01\xf8\x2a\x2f\xe3\x8c\xbf\x0a\xe6\x54\x50\x66\x07\x10\x94\x83\x14\x0a\xbe\xa8\xe6\x87\x85\x5c\x3b\xf1\xa7\x5f\xb9\x5e\xed\x01\xff\xe2\x59\xf6\xe9\x01\x94\x87\x28\x50\x28\x0f\x8a\xc9\x82\xcb\x19\xa6\x5e\xa2\x25\x14\x5c\xdb\x9c\x55\x74\x70\x0f\xc8\x9b\x6a\xb3\xe4\x18\xbd\x4c\xcd\x2a\x38\x61\x16\xe6\x07\x08\x5b\x30\xb4\x2c\x03\x68\xdf\xee\x42\x75\xdb\x4e\x54\x20\x92\xb5\xed\xdc\x3c\x2b\x37\xad\x13\x79\xe7\xd6\xed\x3e\xc8\x04\x81\x3d\x5f\x7e\x0d\x9c\x9a\xf6\xb1\x6d\xbf\x80\x52\xcb\x15\x3e\xa0\xdb\xb6\xa0\x17\x8b\x05\xf7\xd3\x80\xb1\x23\xaf\x4f\x50\x2b\xfb\x0c\x1e\x03\xab\x0a\x3b\x28\xf3\x32\xac\x1d\xd5\x96\x4f\xd0\x9e\x95\x7e\x03\x0c\x5e\x5f\x29\x31\xa7\x82\xbd\x4f\x68\x22\xa2\xf6\x11\x6b\xdf\x27\xef\x93\xf9\xaa\x37\xd5\x8c\x60\xb0\x8b\xc9\xda\x5a\xf6\xd0\x46\xbb\x73\x86\xbe\x53\x6c\xd0\x6f\x14\x22\xf4\x83\x98\x82\x48\x0e\x53\xf2\x2b\x2a\xa1\xa1\x15\x28\x95\x70\x18\x26\x47\x87\xbd\x79\x07\x98\x71\x77\xc1\x78\x1c\x09\x13\x52\x33\xc8\x34\xb1\xfa\xf2\x57\xca\x75\xd2\xbe\x2e\x59\x42\xf6\x75\x09\x31\x6a\x03\x1f\x2f\xab\x70\x4e\x68\x4f\xa1\x44\x7c\x43\x7f\x02\xf4\xa7\xc6\x79\xc2\xa2\xa8\x7b\x21\xe8\xef\x51\x44\xcc\xdf\xe0\xec\xa8\x6d\x09\x7e\x06\x00\xb9\xf6\xd4\x42\x5a\xb9\xea\xbb\xc6\xec\x3b\xd5\x0c\x6e\xb2\x64\x90\x40\x59\x3c\x48\xe1\x65\x82\xa8\x11\x69\x99\x79\x43\xc1\x57\x60\x28\x20\xd3\xca\x67\x77\xad\xa5\x06\xe6\x09\xd7\x6a\xce\x76\x60\xb3\x83\x9f\x4e\x65\xe6\x56\xb0\x07\xdb\xa9\x8a\xa6\xf6\x40\xa8\xeb\x5c\x92\xa1\xff\xcd\xfa\x4f\xab\x29\x39\xbb\xcd\x9b\x33\x55\xe9\x33\x33\x8c\x40\xf3\x30\x4d\x70\xe4\xfd\x26\x11\x28\x85\xf2\x5c\xc8\xb4\xca\x80\x34\x30\x2c\xb9\xe9\x0e\xb5\x8e\xbc\x70\x56\xc6\x20\x03\x3c\x90\x73\x65\xb7\xfd\x41\xe3\xd6\x83\xc6\xfa\xc6\x43\x9a\x40\x34\x5b\xaf\xed\x4d\x57\xe6\x14\xa1\x22\x1a\x91\x0b\x7d\x0c\x00\x54\x62\xed\x90\x01\x14\x7f\xad\xf8\xcf\x4a\x2c\xf8\x23\x25\xe4\xec\x19\xc8\xe7\xef\xd0\xc3\x28\x38\x34\xb3\x53\x03\x14\x6b\x69\x76\xf9\x57\x8a\xbd\x52\xa9\xcc\xec\xac\xec\x44\xd4\xef\x81\x8d\xbc\xbe\xf7\x3e\xb0\xf2\xf6\x4c\xce\xde\xbd\xf8\xe1\x3b\xad\x77\xd6\x10\x60\x77\x5e\xcd\x0e\xc1\xa1\xf4\x1f\xa3\x0f\xf6\x2a\x44\xc9\x8b\xc2\x2c\xe5\xd5\x56\x43\x89\x57\x57\xaf\x08\x0b\x0b\x1b\x9c\xe9\xde\x5d\xd7\xc3\x6f\x4a\x4e\xfa\x19\x89\x73\xed\x71\x58\x14\x99\xfa\xb7\xad\xa9\xcc\x31\xfe\xde\xb4\xce\xf0\xa0\xf8\xee\xba\xa6\xbd\x68\xc4\xaa\x6e\xc4\x64\xf2\x5a\x45\x11\xb9\x2d\xf4\xf5\x65\x2d\x37\x52\xe9\x22\x2f\x1b\x52\xa8\xb3\xd7\xb6\x0c\x0f\xaa\xf3\x5b\x7e\x07\xd9\xf9\x6b\xe5\x0e\x49\xbb\x2d\x2c\x74\xf4\x34\x72\xb0\x0a\xb7\xae\x1e\x0a\x6e\x55\x37\xf6\x34\x7b\x7c\x83\x0a\x49\x55\x61\x99\x81\x7a\x23\x5d\xc9\xbe\x91\xb5\xca\x6f\x64\x52\xce\xaa\x9d\x34\xf3\x14\x4c\xbd\xca\x6e\x3a\xb0\x71\xf1\x2e\x1b\xac\xfe\x4d\x73\x5b\xd5\x1b\x16\x7f\xe1\x11\x33\xc1\xee\xae\x6b\x14\x50\x3b\xfd\x20\x4c\x34\x0a\x82\x08\x12\xd2\x26\x5b\x29\xaf\x7e\x44\x51\x39\x1b\x9e\x00\x8c\xa5\xd1\xee\x11\x98\xd4\x61\x13\x15\x29\x79\x77\x6e\xc7\x99\xdc\x9c\x03\x6c\x20\x44\xe0\x8f\xa5\x0b\xd2\x1f\x98\x01\x9c\x35\x54\xbd\x60\xe5\xa9\xfd\xaa\xe1\x45\xda\x64\x6e\xdc\xed\xd9\xe1\x58\xa2\x91\x46\xf5\xcc\x7f\xb8\x30\x60\x74\x0f\xeb\x31\xf9\xba\x2d\xa0\xc1\x73\x2d\x78\x65\xb1\xa5\xc0\xe9\xd4\xb6\x4f\x00\x19\x38\xdc\xa2\xcd\x3d\x81\x31\x70\xe5\xd8\x0e\x7d\x37\x53\x55\xb5\xe3\x8f\x54\x14\x59\x63\xec\x2b\x65\x94\x1c\x5e\xb0\x27\x93\x7e\x61\xa6\x35\x9d\xb9\x0c\x14\xaf\x1d\x06\xdf\x97\xd6\x3a\xc0\xf7\xa2\x9c\x8d\x9e\x0b\x51\x76\xca\x87\x58\xf6\x0e\xce\xc1\x70\x07\x98\x9c\xfd\x74\x6c\xd3\xb5\x7f\x87\x49\xb3\x8d\xb7\x65\x87\xb5\x20\xe4\xd8\x80\xec\x62\xe7\x20\x58\x49\xbb\x2e\x4d\x96\x17\x17\x7f\x11\x42\x34\x60\x4d\xbb\x58\x3c\x61\x71\x23\xf0\x45\xc9\xc5\x62\x11\x3f\x59\x3c\x39\xda\xe2\x36\xec\x50\xb4\x6d\x45\xcf\x97\x7c\xc3\x8e\xbb\x28\xaa\x68\x63\x5a\x98\xef\xd9\xd1\x0d\xd2\x64\xd8\xbe\x49\x60\xa0\xab\x59\x4c\x73\x31\x9d\xfe\xac\xa0\x35\xe9\x2b\x88\x59\x02\xcf\x24\xf0\x7f\x47\x87\x3f\xfa\x48\x31\xc6\xa1\x8d\x45\xcd\xf8\x68\x9f\xd4\x2c\xae\xe9\x98\x44\x53\x47\x51\x3d\x14\x65\xde\x29\xfe\x56\xf1\x7f\x58\x27\x2b\x04\x0b\x68\x9b\xeb\xea\xb6\xbd\x2e\x36\x92\x3d\x9a\xf3\x5f\x54\x00\x7b\x92\xc4\x16\xf9\xa4\x65\x0e\x2a\x05\x51\x52\x3a\x38\x95\xbf\x29\x31\xff\x7d\x2f\xf7\x12\x1c\xb6\x1f\xcd\xf9\xb7\x4a\xa4\xaa\xce\xf8\x4f\x4a\xc0\xc9\x7b\x3a\x76\x6a\x87\x1e\xc2\x08\x13\x76\x2b\xa5\x8d\x5e\xaa\x85\x9a\xad\xf7\x66\xd1\x2b\xc4\x2f\xca\xc5\x3c\xf2\x4a\x14\x51\x54\xe0\x79\x4a\x18\xb5\x2d\xb3\x84\x90\x18\x63\xb6\x73\x31\xb8\x85\x21\x90\x13\x50\x05\xa7\x35\x8b\x22\x57\xa0\x0d\x65\x9a\xc9\x52\xde\x70\x09\x91\xcf\x4b\x5e\x8a\x0b\x40\x85\xc8\xa3\x28\x4f\xff\x92\xa1\x1a\x0a\x26\x15\x73\xc9\x0b\x51\x80\xf7\x51\x2e\xa6\x75\xdb\x2e\x57\x9b\xea\x0c\xf0\xf2\xc8\xec\xbf\x08\xcf\xe7\xa2\xe1\x2e\x76\xd7\x95\xcb\xf3\x69\xe5\xd4\xed\x66\x22\x04\x6d\xdc\xb7\xcd\x4d\x65\x96\x13\x18\x66\xe7\xe7\xa5\xb7\x41\x15\xa0\xb2\x2a\x33\x74\x6b\x2d\xa6\x79\xdb\x9a\x77\x2d\xcc\xc2\xa7\x0a\x2d\x2a\xae\x66\x52\x6d\x44\x91\x2e\xb3\x24\x9f\xd2\xc2\x06\xc8\x17\xe9\x45\x16\x4f\xcd\xff\x8c\xab\x63\x16\xec\x8f\x7f\x0f\x25\x8c\x51\xd3\xf0\x3b\x05\x9b\xf5\x3b\xef\x05\xd8\xed\x91\xff\x1c\x82\x59\x0a\xfa\x93\x4a\xb5\x75\xf4\xb2\x4e\x73\x3f\x29\x34\xc7\xf3\x4a\x2c\x78\x2e\x8a\x1e\x9a\x4a\x0e\x61\xa2\x53\x5c\x53\x8a\xb4\xca\xd0\xbe\xae\xb8\xe6\x1d\xf6\x55\x80\x01\x63\x39\x83\x7b\x9e\x53\xa6\xd4\x6f\x1d\x1a\x07\x84\xa8\x77\x67\xe8\x23\x32\x8d\x5d\x93\x4a\xe8\x83\x23\xe3\x65\x28\x11\x15\x5b\xea\x18\xb2\x27\xcb\x15\x9e\xa1\xbe\x53\x6d\x6b\x9a\x89\x2b\x11\xc4\xd3\xee\xb1\x0f\x4c\x83\x4d\xf7\xb3\xcd\xbe\x06\xc1\xf6\x1c\x07\xe8\xbc\x4b\x31\xbd\x53\x89\xe5\x79\x0d\x68\x32\xa5\xd8\xcf\xb4\x19\xcb\x4d\xaf\x19\x4a\x8b\x9c\xe2\x6e\xa6\x79\x36\xab\xf7\x8a\x76\x6e\xd0\xcd\x4c\x55\xba\xd8\xde\x83\x9d\x53\xf2\x74\xcf\x2b\xae\x32\xc6\x97\x4f\xab\x28\x2a\x13\x15\xd3\xa6\x67\x82\x35\x59\x32\x74\x51\xe3\x7b\xd1\xf8\xb3\xdd\x83\xf9\xea\x58\xf2\x1d\x80\x52\x84\xc0\xcd\x66\x0e\xed\x74\x90\x36\x59\xf0\x83\xc5\x89\xfb\x3a\x6f\x0a\xf5\x31\x3e\x1c\xc1\xcd\xa1\xaa\x8b\x8f\x85\xca\x4b\x1b\xe2\x5e\xc8\x26\xd6\x3e\xd1\x79\x7f\x28\xee\xdb\x27\xf6\x2d\xe8\x1a\x25\x56\xbe\x7d\x38\x7e\x71\x9c\x66\x3c\x98\xea\x71\xdf\xd1\x11\x83\x4c\xee\x66\x6e\x19\xd8\xcf\x4c\x55\xc1\x4a\x86\x3f\x67\xbd\x8a\xc2\x10\xb4\x37\x24\xa4\xf8\x76\xf4\xcd\x0f\x92\x6a\xcd\x78\x7d\xe4\x8d\xae\x02\x77\x94\x1e\xdf\xbd\x4e\x06\xfd\x15\xc3\x0a\xd0\x67\x51\x07\x5b\x93\x98\x2c\x56\xf5\x53\xb5\x52\x61\x37\x2a\xec\xc6\x65\x00\x4a\x7e\xda\x4d\x5c\x67\x2c\x6e\x42\x3b\xb9\x4b\xb5\xa7\xf3\x8c\xaf\xc5\x1e\x02\x3b\xf0\x5d\xba\xa6\xeb\xd1\xef\x66\xfd\xf9\xf4\xad\xf2\x13\x6a\xcf\x25\x77\xcf\x74\xf3\x6a\xe5\x4d\x27\x37\xf9\x8e\xae\xf9\x3f\x15\xdf\x0f\x3c\xee\xdc\x6b\x4c\x5f\xb2\x28\x0a\x2f\x1d\x03\x1f\x3c\xb2\xbd\x83\xd3\xa2\x9a\xfa\xe1\x53\x72\x37\xd6\x72\x55\xdc\xc4\x7b\x0e\x1b\x40\x6c\x4b\x80\x8b\x23\x63\x1c\x3e\x0c\xf8\xde\xdc\xbb\xdc\xb5\xf5\xc2\xb3\xa9\xe0\x76\x60\x7f\x3b\x0b\x02\x03\xef\x03\x97\xc3\xfc\xf6\x13\xde\xa6\xe1\x55\xb0\x64\xe9\xfa\x04\xe9\x89\xe7\x1d\x24\xba\xc4\x96\x1b\x80\xa4\x14\x02\xc0\xdc\x91\x92\x31\x88\x88\xa8\x30\x46\xba\x4a\x97\xee\xa6\xa8\x40\xc3\x51\x13\xe0\xf2\x47\xd7\xd7\xca\x9d\x49\x4b\xc0\x1e\xc8\x43\x0c\x8d\x3a\x33\x72\x14\x41\xb5\xde\xc8\xe7\x39\xb8\x1a\x5a\x3d\x9f\x56\xac\x7b\xb6\xce\xba\x6a\x56\x0c\x6b\xdb\xb6\xd4\xbe\x55\x65\x5c\x9b\x5f\x05\xc3\x33\x37\x53\x61\x51\x1c\xef\x66\xcf\x54\x71\x03\x13\xad\x43\x69\x97\x35\x3f\xc0\x00\x3d\xf1\x96\x19\x22\xe5\x51\x0d\xae\x50\xb8\x80\xc7\xe0\x9a\xe9\xad\xa8\xab\x10\xd9\xba\x8f\x91\xd5\x51\xaf\x40\x38\xc7\x4f\xca\xd4\x0c\xfe\x87\x0d\x12\x7e\x79\xb3\xa9\x46\x22\xab\x11\x2a\x4f\x76\xd0\xc9\xb7\xca\x67\x94\x2c\xfe\xd6\x13\x4b\xf6\xce\x21\xd4\xe9\xae\xe0\x4d\xe6\xe0\x89\xba\x36\x22\xd3\xce\x87\x9c\x6e\x7b\x30\x39\xca\x7c\x2a\xdf\x74\xf0\xfa\x9c\x6c\xef\x8c\xb8\x43\xd8\x4a\xe1\x40\x6d\x5b\x6a\xf6\x95\x5f\x3b\x19\x06\x73\x11\x66\xfd\x49\x9a\xd9\x5e\xc1\xcd\x8d\x11\x0b\xfd\x05\xac\xf8\x96\x27\x06\x8e\xa9\x78\x78\xd1\x53\xc5\xfd\x33\x6d\x5b\x52\x76\x64\xbc\x4b\x99\x4e\xf9\x7e\x64\x23\x1b\x4b\xeb\x1e\x3a\x3f\xe7\x77\x58\x79\x57\x55\xdb\x45\x6d\x1b\xd6\x01\xa0\x98\x18\x72\xa1\x86\x8d\x42\x5d\x68\x76\xa1\xce\x74\xdb\xda\xf8\x6c\x08\x5b\x41\x13\xdd\x67\x59\x6f\xcb\xea\x56\xa4\x3b\xff\x9b\x77\x3f\xdf\x05\xbf\x7f\xc9\xb8\x8d\x32\x1d\x87\x69\x0b\x02\x24\xfd\x4d\xc4\x4a\x62\x3d\x68\x01\x2c\xe3\xab\xb2\x5a\x7f\x7a\x29\xe5\xa6\xf9\x21\xbf\xaf\xf6\x3a\x8a\x5c\xe1\x46\xb7\x50\xb4\xc3\xbc\x66\xc9\xce\x86\xff\xc6\xbb\x0e\x50\xad\x17\xef\x0a\x4c\x3f\xae\x9e\xa0\x30\xf8\xef\xf2\x18\x7c\x5d\x05\x9a\xeb\xba\x50\x9f\x7e\xae\xf3\x1d\x54\xa2\x31\x7b\xcc\x69\x17\x04\x65\x74\x65\xa7\x8b\x2c\x6c\x9d\xf0\xce\x32\xbc\xf3\x4b\x78\xe7\x22\x73\x54\xfc\x35\x06\x0c\x01\x5c\x03\x2c\x45\xff\xb0\x72\x6a\x81\xf0\xab\x76\x91\xb0\xab\x54\xd5\xb6\x04\xa5\x76\xd3\xa6\x05\x2f\x84\x10\x74\x9b\x98\x2f\x92\x24\x26\x38\xb4\xd9\xba\x52\xba\x50\x7b\xb9\x5a\x9b\xa5\x62\x13\x45\x1b\x70\xd1\xef\xf0\x65\x6a\x76\x44\xdc\xe4\xa2\xf9\xda\x8c\x17\x6b\xf4\x58\x33\x76\xd8\x24\xae\x79\x0a\x75\x66\x86\xfc\x56\x6c\x6c\xd0\x29\x8b\xc7\x66\x12\x3f\x1c\x81\xf0\x85\xba\x6c\x62\xb2\x65\x7c\x8b\x61\xbc\x16\x21\x6c\x3f\xf0\xba\x66\x07\xb8\xeb\x00\xc3\xf8\xe9\x7d\xf4\xa5\xbb\x9b\xfd\x8a\x46\xdf\xe7\xc3\xd9\xeb\x3d\xeb\xd6\xac\xfb\x2c\xcd\xd7\xa9\xce\xd8\x31\x68\xd9\x35\xcb\xc5\x3f\x15\xdd\x26\xa6\x09\xe2\x05\xaf\xcd\x9e\x06\x77\x36\x6d\x4b\x4d\xa2\xc8\x71\xcf\xe3\x5b\x60\xbd\x30\x32\xb6\x4b\xb1\x7f\x03\x38\x8f\xba\x6d\xdd\xec\x31\x57\xc9\x32\x5e\xf4\xf8\x30\xea\x3a\x44\x59\x09\xec\x4b\x75\x6d\x36\x3f\x5d\x81\xe7\x54\xa1\x0a\x1d\xe4\x3b\x5a\xe9\x47\xd4\x35\x0f\xf3\x89\xc3\xba\x52\x8d\xae\xf7\x6b\x5d\xd5\x71\x5d\x73\xf3\xdc\x49\x24\x11\x9e\x0b\x23\x60\x5b\x29\x6f\x84\x8d\xc5\x33\x32\x85\x50\xdc\x02\xb9\x19\x11\x02\x9c\x29\x9a\x5b\xc0\x1d\x40\x77\x6f\x94\xe7\x84\x65\x36\xc3\x6f\xb5\x91\x9d\xb7\x56\x45\x03\x6d\x0c\x0b\x51\x1b\x51\xe3\x4f\x54\x48\x06\xda\x98\xea\xb4\xb1\x23\x5f\xef\xeb\x53\x6b\x37\x7e\xdb\x0e\xb7\x47\x5f\x49\x1f\x07\x0c\xb1\xd3\x1f\xa5\x46\x32\x02\xcb\x06\x19\x3e\xe3\x31\xc4\xbb\xfb\x47\x5e\xef\xd5\xa9\x73\x24\x57\x7f\xf6\x32\x4c\xa9\x1a\x61\xbf\xd8\x51\xc6\x39\xd9\x35\xb9\xb3\xad\x96\x06\x2d\x98\x39\x1e\xc0\x61\xee\xc7\x92\x2f\xf8\x72\xfc\x1e\x8b\x1d\x79\x60\x75\x2b\xa8\x6b\xca\xf3\xae\xc9\xd9\x63\x3d\xed\xae\xfa\x85\x34\x5a\xee\x2c\x23\x59\x98\xd4\xc1\xbf\xa2\xba\xe9\xca\xe7\x16\xa8\x36\x8a\xd4\xac\x91\x3a\x81\xff\xbf\xd8\x92\xfe\xbe\x15\x48\xf9\xc9\x40\x0d\xc6\x63\x78\x8f\x87\xe5\x89\x83\xe7\x35\x1d\xc4\xfb\xbb\x99\xdc\x73\x0c\x96\x50\xeb\x54\x62\x97\xb4\x2d\x5e\xbb\x00\x7a\xc4\xac\x0e\xd3\x5c\x4e\x23\xb4\xd8\x7d\xc4\xaa\xd9\x90\xce\x09\x61\xdc\xec\x16\x00\xa5\x04\xa8\x73\x3a\x5e\xb0\xb8\xff\x9a\x21\x5c\x05\x84\x43\xdc\x41\x73\xfa\xf2\x4f\x52\x8c\x64\xd2\xaf\x1d\x1d\xa9\x5e\x00\xac\x66\x9f\xeb\xe3\xa7\xd9\x44\xd6\xc1\x42\xf6\xaa\x6f\xf6\xb5\xdb\xa9\x84\x69\x35\xac\x35\xec\xdc\xb7\x47\xdf\x31\xb6\xff\x30\x2c\xf4\xaa\xda\x89\x91\xe4\x1f\xe4\x56\x8b\xc3\xf0\x6b\x6d\x8d\x43\x0c\x41\x48\xe8\x11\xd7\x8c\xbd\x9c\x1d\x83\xd8\x14\xbb\xf9\x70\xdc\x6a\x38\x6e\x3c\xc3\x38\x13\x1b\xd0\x8d\xd1\x26\xab\x91\x40\xd0\xde\xea\x88\x43\xa2\x6d\xc7\x10\x2a\x1f\x08\x48\xc2\xd8\xc6\x1c\xe4\x5f\x49\x0b\x6b\xe6\xe2\x58\xf0\x49\x94\xe8\x36\xdf\xc8\xab\xea\x4f\x42\x30\xed\x69\x9a\x52\x16\xfe\xc7\xe1\x4f\xf2\x85\xdb\xc5\x10\xe9\xd8\xbf\xd5\xc3\x59\xea\xa3\x0f\xdd\xb4\xf7\x1e\x22\x7d\x10\xc3\x0d\x17\x3c\x63\xef\x8c\xa6\x27\x91\x87\xa9\x36\x4a\xc4\x70\x1b\x14\xb2\xc6\x06\x08\x75\x7a\xf3\x28\x5b\xd1\x22\x60\xa5\x02\x64\x80\x6d\xa1\x8a\xe6\x1a\xa0\x4e\xf4\xcc\xa8\xbf\x14\x4e\x4d\x9c\xb3\xca\x0c\xef\x8b\x9c\x17\x6d\x5b\xa1\x14\x09\xce\x8e\x01\x74\x76\x6e\xdb\x17\x45\x4c\x9b\x89\xe7\x6c\xa8\x4e\xf7\x78\xed\x47\x1c\xd4\xe1\xf5\x2b\xa7\xe5\xc0\x15\xd7\xb4\xf6\xb5\x19\x0b\x46\xb3\x31\x60\x2e\x4a\x03\x69\xe7\x27\x4b\xbb\x06\x5a\xa1\xb7\x6d\x8d\xd4\xcb\xd3\xcc\x6d\x4d\xa3\xb0\xdd\x93\x85\x3d\x22\x9e\x08\x33\xda\xa7\xa4\x13\xf1\x09\x34\x3b\x68\xb5\x4d\x48\xb8\x65\x16\x42\x38\xb8\x60\x39\xa0\xca\x99\xff\xa1\xde\x51\x54\x50\x73\x11\x44\x7a\x83\x9a\x96\x9f\x66\xfc\x9b\xea\x30\xe7\xdc\x43\x90\xdf\xf3\x02\xad\xd4\xf9\xf9\x8a\x19\xc5\x0e\x66\xdb\x04\x19\x78\xd1\x7e\x0f\x75\x85\x5b\x50\xdb\x09\xcc\x0c\x0a\x09\x66\x70\x61\x8f\xd6\x8c\x6b\x31\x59\xf2\x0a\x74\xb6\xb5\xa4\x8a\x2f\x19\x5b\xc1\xc1\x7c\x0d\x30\xbf\x1b\x89\x4d\xa5\x91\xc2\xf7\xc8\x8e\x1c\x3b\x7e\xcc\xbd\xc2\x35\x31\x95\xc2\x36\xed\x97\xda\x95\xab\x7e\x7b\xf1\x5a\xa8\xd4\xb5\x2e\xc9\x78\x11\x5c\x62\x63\x67\xfd\xd6\xae\x93\xba\xb3\xb8\x40\xcb\xb8\x41\x09\xf1\x9e\x61\xc5\xa1\x8b\x8b\x28\x2a\x5c\x27\xc0\xdf\x00\xfc\x1c\x68\x28\xbb\x86\xd5\xd8\xb0\x1a\x1b\xd6\x52\x1b\x9b\xf6\xd4\x99\x1f\xea\x08\xe8\xac\xc3\xf6\x04\xca\x42\xd7\x96\x1a\xda\x12\xe4\x4b\xb1\x58\xe5\x4f\x35\xd0\xd9\xd6\xa9\x86\x50\x00\x9d\xd9\xca\xf6\x2e\xba\x1a\x31\x37\xde\xdd\x47\x0d\xfc\xea\x8a\xbe\x91\x42\x1c\x50\x9a\x8c\xe5\xd1\xf3\x02\x6b\x04\xdc\x5b\x3d\x79\x5a\xac\x8a\xa9\xb8\x38\xd7\x4c\x89\x7f\x02\x84\x40\x9d\x3a\x54\xbc\xa9\xca\x44\x9d\x76\xf0\x76\x2a\x13\x1d\x92\x87\x99\x46\x1e\x2b\xaa\xb6\x00\x8f\x32\x40\xe7\x3a\x34\x65\xb1\x91\xcf\xab\x5b\x15\x17\x35\xb5\x6a\x03\x87\xc4\xb7\x3b\x48\x82\x75\xdd\x26\x5d\x21\xa6\xb0\x49\xb6\xcb\x3f\xe3\x66\x4d\xfd\x5e\x75\x98\xbe\x58\xc6\x11\xd2\x7f\xdc\xeb\xe0\x06\x94\x84\x37\x6c\x41\xdd\x3d\x5b\xdc\xf1\xcf\xd9\xb6\x4e\x17\x6c\xb7\x0e\xfb\xc0\x79\x84\xcf\x32\x4b\xa9\x18\x3a\x71\x5a\x62\xd4\x91\xa8\x52\x99\xf4\x17\xd5\xf8\xe0\xdd\xb6\x55\xdb\x02\xa9\x26\x62\x90\x06\xb6\x93\x28\x92\x9d\xb9\x53\x72\x94\x0d\x63\xcc\xaa\x2d\x7c\x46\x00\xf7\x11\x45\xda\xaf\xbf\xb5\x17\x0b\x05\xc8\x1a\xd5\x76\x9b\x2c\xe2\x0e\xb1\xd6\x21\xe4\x76\x72\x68\xf7\x33\xee\x7e\x9a\xa5\x07\x65\x15\xf3\xb9\x4d\x12\xfc\x4e\xbb\x5c\x59\x1c\xa4\x77\x04\x3c\x0e\x29\xd7\xd9\x3f\xea\x6e\x17\x58\x00\xfa\xae\xbd\xc6\x85\xa0\x9e\x55\xe5\x46\xd4\xde\x30\xc7\xbb\x9f\xa2\x87\x68\x15\x3a\xa4\x9a\x67\x58\x14\xc1\xdf\x60\x6e\x70\x5b\xf4\xc9\x0a\x65\xd3\x8d\x38\x8f\xb2\x06\xe8\x2b\x07\xa3\xce\xe7\xa3\xbc\x0f\xf2\xc8\x41\x93\x19\xb9\x37\xfb\xaf\x73\xb0\xe5\xaf\xab\x86\xca\xc7\xf0\xf3\xd5\xf7\x6c\x7e\x01\x52\x0c\x2e\x42\x22\xcd\xc0\xae\x29\x4e\x84\x5d\x67\xee\x5c\x7f\x1a\xee\xc2\x12\xd6\x3d\xbb\x88\x39\xfe\xc8\xee\xe4\xc4\xb3\x41\x58\xfb\x98\x14\xca\x68\xec\x92\xb2\xb6\x35\xbf\x70\x21\x57\x6e\x91\xa9\xcf\xcf\xf9\xb2\x7b\xc8\x0c\x31\x90\x3c\xab\x1d\x85\xf3\x18\x7d\x0c\x0c\xaf\xbd\xbd\x55\x52\x58\xe0\xb1\x22\xce\x64\x06\x38\x5d\x77\xa8\x40\x50\x66\x9f\x2d\x94\x96\xf5\xe7\xbc\x14\xcb\xbf\xf0\xee\x76\xf8\x5d\x6f\x55\xdb\xd2\xb7\x4a\x34\x52\x7f\x6f\x33\x53\xdf\x00\xfd\x42\x98\x2b\xd5\xd4\x31\x2c\x03\xfc\xf6\xfd\xd3\x6f\x15\xe3\x6f\x71\xd7\x75\xf9\x61\xf4\x89\x43\x53\x56\xb7\xf1\xff\xb7\x58\xf0\x6d\xde\xe8\xf8\x62\xb1\xe0\x5e\x65\x00\x6a\x03\x2f\x7a\xc3\x11\xe8\xff\x10\xdf\xcb\xae\x01\x9b\xb1\x88\x66\x4b\x22\xe4\xfb\x2c\x3c\x05\xf0\x3c\x03\x42\x68\x7b\x58\x64\x7b\xc2\xc9\x8e\x08\x04\x26\x06\xfe\x7d\x27\xdc\xcf\x61\x41\x01\xad\xdf\x29\x03\x89\x2d\xd0\xe8\x5b\x08\x1e\x16\x52\x85\xaf\x3c\xfb\x8f\x38\x18\x09\x6b\xc1\x4b\xb9\xd5\xf1\xe2\xc8\x73\x47\x06\xce\x1b\x91\x47\x51\xde\x07\x0e\x46\x46\x50\x8f\xf7\xdc\x0c\x1d\x0a\x79\x48\x0b\xcf\x73\x96\x50\xbb\xbe\xe4\x46\x83\xfe\xaa\xda\x2b\xb3\x79\x5c\x96\x85\x54\xfa\xb5\x5c\x6b\x4b\x0b\x5d\x89\x07\xee\x53\xe0\x3a\xab\x6a\xda\x30\x0e\x15\xad\x66\xba\xda\x4d\x69\x3d\xdb\xe5\x1f\xe5\x2f\xf8\x61\x30\xca\x9d\x7a\xc2\xce\xa9\x9a\xad\xa1\x80\xab\x6a\xd7\xb6\x0b\x86\x9f\x86\x38\xb8\xee\xc9\x77\xc3\x27\x8d\x06\x13\x3c\x6a\x2e\xcd\xb3\x47\x16\x57\x66\x70\xd8\xce\x39\xf8\xc6\x1c\x67\xe0\x0b\x50\x60\x2d\x9a\x1c\x61\x2b\xd2\xe8\x5c\x17\x6b\x30\xdf\x80\xc2\x83\x68\x6d\x2e\x87\x20\xb5\x2c\x73\x5d\x7c\x96\xd6\x0c\x5e\x20\xab\x63\x25\x0a\xfb\x5a\xea\xed\xfc\xc0\x65\x5b\xed\x88\x07\xcf\x36\x09\x00\x89\x07\x1c\x69\x1d\x01\x88\x35\x1c\x6d\x8b\x3b\xb9\x81\x0b\x98\xb0\x8e\xaa\x0a\xd5\x56\x9e\xe6\xbc\xc9\xd8\xd3\xf3\xa5\x73\x06\x3f\x1c\xf9\x8e\x6f\x57\x65\x42\xd7\xa2\x08\x00\xf1\xf8\x4e\xac\x4d\xbb\xf3\xad\x58\x23\x28\x71\x4c\x77\x7d\xf4\xec\xb6\x5d\xf0\x6d\x98\xd4\x30\x68\xfb\x93\x9d\xc9\x08\x1b\xee\xb0\x47\xf1\x8a\xa1\xd1\x7b\x02\x90\x22\xbb\x28\xa2\x7b\xf3\x17\xaf\xce\xb1\xb3\x77\x5d\x16\xf3\x6e\xc8\x03\x98\xc6\x78\x7d\x6e\x7b\x76\xcb\x38\xd9\x9b\x55\x1c\x0c\xcb\x89\x9e\xc1\x45\x77\xae\x14\x17\xd0\x60\x7b\x54\x2e\x03\x65\xcd\xf3\xa7\xf4\x8f\x6e\x7b\x4c\x47\xd0\xc9\xc3\xa9\x52\xbb\xa9\xe2\xb4\x0b\xdf\xdc\x9e\xda\xa2\x1b\x06\x89\x16\xf5\x43\x63\x3c\xa6\x16\x1d\x0d\xfb\xfb\x95\x25\xce\xe1\x3a\x4c\x05\xc7\xac\x8e\x63\x12\x80\x51\x21\xb2\x1e\xb0\x21\x3d\x92\x20\x05\x33\xb4\x69\x37\x37\x42\x20\x27\x62\xf3\x5d\x55\x3b\x0f\x2f\x6c\xb2\x41\xc3\x8d\xe4\x33\xc3\xbf\xcb\x68\xa7\x1e\xf6\x09\x94\x7d\xee\x3f\x10\x85\x43\x20\x88\x99\xb8\xa9\x66\xfb\x05\x8b\x1f\x66\x05\xd2\x18\xeb\x22\xc2\xc3\xef\xfd\x5f\x41\xd3\x9d\xb4\x56\xdb\x7a\x66\x28\x90\x87\x42\x16\x6b\x6c\x25\x88\x71\x75\x13\x71\x64\x9e\x02\x55\x54\x58\xa4\xb7\x12\xb6\x6d\x73\x0c\xa3\x68\x0e\xdd\x92\x11\x93\x60\x35\x21\xdc\xaf\x42\x98\x6e\xd7\xa7\x3e\x14\xa2\x5f\x2b\xe6\xbf\x38\xa7\x65\xb6\x3a\x11\x3f\x8b\x3f\x27\x1a\xe9\xbc\xe0\xcc\x02\x19\x60\xc5\xc2\xd6\x90\x27\xa8\x2e\x26\x46\x1f\x0c\x90\xd4\x87\x2b\x76\x5a\x64\xb1\x34\xff\xd1\x3c\xc9\xfd\x32\x4a\xeb\xe4\x8e\xe6\x2c\x58\x1c\x29\x8b\x2b\x5e\x27\x55\x1c\xa4\x5f\x19\xe1\x81\xc1\xe3\xa2\x02\xf4\x29\x53\xab\xe1\x96\x65\x51\xef\x7b\x70\xe3\xf5\x80\x51\x0b\x81\x8a\xa9\x64\x89\x8c\xff\xff\xde\xe9\x51\xd2\x11\xf3\x16\xf2\xb6\x6d\xa5\x35\x1f\xe1\x13\xf1\x64\xe9\x35\x0c\xcb\xb1\xe1\x61\x80\x11\xfe\xda\x5a\xd2\x87\x5d\xe0\x1e\xf2\xf0\x95\x40\x11\x49\xa6\xd2\xc5\x13\xc4\x8a\x13\x12\x13\xe0\x30\x25\x53\x19\x3c\x0f\xa6\x24\xe8\xb0\x22\xec\xb0\xae\x37\x86\x0d\x60\x24\xdc\xc0\xd8\xe4\x8d\x0f\x05\x43\xf4\x79\x5a\x58\xe6\x81\x0a\xe3\x43\x9c\xc6\x15\x3b\xcc\x6a\xb6\xfa\xf2\x58\x08\x5d\xaf\x57\xa7\xad\xaa\x58\xa2\x1e\xee\x7f\x82\x3b\x1e\x99\xca\x0c\x9a\x5e\x75\x4d\x0f\x3e\xd0\xc3\x1d\xde\xbb\xad\x28\xc0\x6a\x06\x5f\xe3\xaa\x2c\xcd\xf3\xbc\xea\x5d\xb9\x0c\x38\xa9\x5c\x86\xfe\x55\xf7\x72\xc6\xe2\x42\x20\x93\x0d\xb8\x4b\xf1\x9a\x37\x2c\xf6\x5e\x4e\x70\xec\xd0\xb0\x23\x57\x3c\x4f\x8a\x58\xf3\xdc\x8f\x2b\x27\x41\x35\xc5\x1f\x72\xc4\xd7\x19\xd6\x0a\x2b\x6b\x61\xc6\x5c\x6d\xde\xc8\x72\x8b\x38\x5d\xf9\x66\xf3\x55\xbe\xfe\xc4\x4f\x14\xb5\x9b\x6a\xb3\x2f\x65\x14\xb9\xbf\x0f\x64\x30\xf2\x61\x55\xeb\x26\xe9\x5f\x8a\xbb\x98\xca\xd9\x6f\x3f\xed\x65\x7d\x2f\xe4\xec\x91\xb8\xe3\xc4\xd5\xad\x2b\x62\x23\xb7\x85\x92\x51\x84\x7f\x67\xf9\xcd\xc6\xfd\xa6\x04\x51\x3d\x08\x0f\x31\xa8\xba\x49\x73\x64\xec\xc8\xe8\x2d\xf4\x30\x5b\xfd\xdb\xff\x09\x00\x00\xff\xff\x31\xab\x8d\xd1\xac\x6b\x01\x00") func pagesAssetsJsJquery1102MinJsBytes() ([]byte, error) { return bindataRead( @@ -190,7 +190,7 @@ func pagesAssetsJsJquery1102MinJs() (*asset, error) { return a, nil } -var _pagesAssetsStylesBootstrap311MinCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\xbd\x6d\x93\xe3\xb8\x91\x20\xfc\xdd\xbf\x42\xee\x89\x89\x99\x76\x4b\x1a\x52\xef\x2a\xc5\xd4\xe3\x7d\xbc\x1b\xbb\x8e\x58\xef\x97\xf3\x87\x8d\x18\xcf\x5d\x50\x24\x55\xa2\x87\x12\x65\x92\xea\x97\xa9\xd3\x7f\x3f\xbc\x23\x91\x48\x90\x94\xba\x7b\xe2\x2e\xc2\xae\xf0\x74\x15\x90\x48\x24\x32\x13\xc8\x44\x12\x48\xfc\xf0\x87\xdf\xff\x6e\xf4\x87\xd1\xff\x5f\x55\x6d\xd3\xd6\xc9\x65\xf4\x7e\x3e\x8d\xa7\xf1\xe8\xfb\x63\xdb\x5e\x9e\x7e\xf8\xe1\x25\x6f\xf7\xba\x6e\x9a\x56\xa7\xb7\x1c\xfa\x4f\xd5\xe5\x53\x5d\xbc\x1c\xdb\xd1\x2c\x8a\xe3\x09\xfb\xcf\x62\xf4\xd7\x0f\x45\xdb\xe6\xf5\x78\xf4\xe7\x73\x3a\xe5\x40\xff\x59\xa4\xf9\xb9\xc9\xb3\xd1\xf5\x9c\xe5\xf5\xe8\x2f\x7f\xfe\xab\x44\xda\x70\xac\x45\x7b\xbc\xee\x39\xbe\x1f\xda\x0f\xfb\xe6\x07\xd3\xc5\x0f\xfb\xb2\xda\xff\x70\x4a\x1a\x86\xea\x87\xff\xfc\xf3\x9f\xfe\xed\xbf\xfe\xc7\xbf\xf1\x2e\x7f\xf8\xdd\xef\x18\xa5\xa3\x73\x55\x9f\x92\xb2\xf8\x35\x9f\xa6\x4d\xc3\x49\x8d\xa6\xd1\xe8\x7f\x0b\xdc\xaa\x3b\xf6\x17\x43\x3e\x2d\xaa\x1f\x0c\x2c\x6b\x7d\x6c\x4f\xe5\xeb\xa1\x3a\xb7\x93\x43\x72\x2a\xca\x4f\x4f\x4d\x72\x6e\x26\x4d\x5e\x17\x87\xdd\xe4\xd4\x4c\xda\xfc\x63\x3b\x69\x18\xec\x24\xc9\xfe\x7e\x6d\xda\xa7\x38\x8a\xbe\xdd\x4d\x3e\xe4\xfb\x5f\x8a\x96\xae\xbd\xed\xab\xec\xd3\xeb\x29\xa9\x5f\x8a\xf3\x53\x74\x4b\xea\xb6\x48\xcb\x7c\x9c\x34\x45\x96\x8f\xb3\xbc\x4d\x8a\xb2\x19\x1f\x8a\x97\x34\xb9\xb4\x45\x75\xe6\xbf\x5e\xeb\x7c\x7c\x60\x23\x65\x5c\x3a\xe6\x49\xc6\xff\x79\xa9\xab\xeb\x65\x7c\x4a\x8a\xf3\xf8\x9c\xbc\x1f\x37\x79\x2a\x80\x9b\xeb\x89\x61\xfe\xf4\x9a\x15\xcd\xa5\x4c\x3e\x3d\x31\xae\xa4\xbf\xdc\x92\x6b\x56\x54\xe3\x34\x39\xbf\x4f\x9a\xf1\xa5\xae\x5e\xea\xbc\x69\xc6\xef\x59\x87\x95\x81\x2c\xce\x65\x71\xce\x27\xa2\xc1\xee\x7d\xce\xa9\x4a\xca\x09\xe3\xc3\xcb\xf9\x69\x9f\x34\x39\xaf\x95\x88\x9e\xce\x55\xfb\xfd\x4f\x29\x63\x4a\x5d\x95\xcd\xcf\x6f\x0d\x8a\x73\x75\xce\x77\xc7\x9c\xcb\x97\x0d\xec\xa7\x63\x91\x65\xf9\xf9\xe7\x71\x9b\x9f\x58\x75\x9b\x3b\x70\xb7\xe4\x75\x9f\xa4\xbf\xf0\x61\x9c\xb3\xa7\x68\xc4\x18\xf1\x94\xb0\x31\xbc\x67\x9c\x78\x3a\x56\x8c\x80\xd7\xea\xda\xf2\x4e\x39\x8f\xf6\xfb\xfa\xa7\xb6\x68\xcb\xfc\xe7\xd7\x7d\x55\x33\x06\x4c\xf6\x55\xdb\x56\xa7\xa7\xf8\xf2\x71\x94\xb1\x5f\xf3\xec\xb6\x1f\x33\x45\xa8\xce\x2f\x52\x5c\x1f\x24\x19\xeb\x28\xba\x65\x87\xb3\x2c\x6b\xda\x4f\x65\xfe\x54\xb4\x6c\x50\xe9\xed\x18\xab\x42\x26\x9e\xa7\x59\x7e\xda\x29\x89\x4c\x57\xeb\xfc\xc4\xc8\x61\x7f\xfe\x02\x49\xfc\xe6\x70\x88\x76\x69\x55\x56\xf5\xd3\x37\x11\xc3\xda\x30\x1d\x29\x01\x8a\x0d\x93\x6c\x73\x65\x44\x5c\x2f\xa0\x74\xbd\xfc\x76\x27\xf8\xaa\xd9\xb2\xbb\x54\x4d\xc1\x45\xf5\x54\xe7\x8c\x29\x6c\xbc\x41\x66\x73\x4c\x6d\x75\x79\x9a\x4c\x97\xf9\x89\xe3\x7e\x55\x83\x9e\x4c\x67\xbc\xa4\x38\xbd\x28\x6e\x30\x16\x35\xef\x5f\x84\x5c\x9e\x6a\xa6\x27\x6f\x5f\x39\x03\x0f\x65\xf5\xe1\x49\x0a\xe1\x26\x95\x48\x6b\x5d\xcc\x46\xb8\x88\x2e\x1f\x6f\xc7\xfa\x75\x72\xaa\x7e\x65\xdc\xfc\xc8\xe9\x2d\xce\x2f\x4f\x5c\xae\x39\x23\x9f\x15\xed\x02\xc5\x46\xc4\x17\x86\xd2\xf4\x94\x5c\xdb\xea\x96\x56\x4c\x89\x7f\xd9\x67\x4c\xcb\xf2\x71\x93\x9c\x2e\xce\xe4\x39\x55\xe7\xaa\xb9\x24\x69\x3e\x36\xbf\xed\x2c\xaf\x18\x55\xb7\xfd\x95\x8d\xf0\x3c\x2e\xce\x97\x6b\x3b\xae\x2e\xad\x54\x73\xc6\x10\xa6\xdf\x63\x3e\x9d\x92\x3a\x4f\x5e\xa5\x18\x8a\xf3\x91\xcd\xc3\x56\x60\x30\x7f\x98\x79\x25\x31\x59\xf2\xde\x17\x4d\xb1\x2f\x73\xdd\x83\x44\xf9\x2a\x66\x28\x5b\x3f\xce\xcd\x81\xcd\x7a\xa9\x99\x0a\x82\x4f\xfd\x91\x20\xe4\xa7\xf6\xd3\x25\xff\x51\x16\xff\x3c\x06\x45\x6c\x1a\xe5\xad\x53\xc2\xa4\x74\x2a\xda\x9f\x5f\xf5\x0a\x90\x5c\x2e\x79\xc2\xd0\xa7\xf9\x93\x6c\xbf\x4b\xaf\x75\xc3\x88\xbf\x54\x05\x63\x68\xad\x3a\xfb\x89\x4d\x8d\x84\x51\x97\xfd\x0c\xbb\x35\x85\xaf\xaa\x51\x96\x1f\x92\x6b\xd9\xaa\x46\x4f\x4f\x42\x76\x87\x2a\xbd\x36\x93\xe2\x7c\x66\xcb\x82\x68\xe7\x97\x1b\x35\xd9\x5d\x92\x2c\xe3\xe2\x8c\x6e\x02\xf4\x15\xea\xa6\x5c\xf7\x6e\x60\x34\xe9\x31\x4f\x7f\x61\x12\x77\x07\x9d\xb0\x35\x80\xcf\x43\xa3\x1b\x66\x4a\x7e\xc4\xf8\x65\x8b\xf3\xf5\xb4\xcf\xeb\x9f\x19\x5d\x8a\x2b\x82\xa8\x49\x73\x29\xce\x13\x28\xf0\x00\x34\x5b\x07\x5c\xe8\x57\x45\xb0\xd0\x38\xc8\x7c\xc6\xea\xf4\x48\x32\x9f\xcb\xf9\x50\xe4\x65\xb6\xeb\xd2\x77\xdd\xf0\xae\xe9\x40\x50\x60\x69\x97\x05\x93\x94\x13\x51\x12\x83\x0d\x35\xc8\xf2\xb4\xaa\x13\xbe\x4e\x50\xa3\x11\x6a\x2a\x86\xc3\xf4\x4f\x0b\x97\x2f\x85\x4d\x55\x16\xd9\xa8\x29\x4a\xa6\xf5\x66\x2a\x8c\x66\x17\x2b\x98\xe9\x9c\x2d\x1d\xa3\xe9\x6a\x26\xfe\x59\xf3\x75\xa4\xcc\x5f\xf2\x73\x46\xe9\x88\x99\x70\xee\x24\xd7\xf3\xd2\x5b\x69\x5b\xae\xae\x7a\x85\x66\x93\xb4\x4c\x2e\x4d\xfe\xa4\x7f\xd9\xa9\x0a\x3e\xef\x15\xfe\x6c\xdc\x1e\x5f\x6d\x7f\x7f\x3c\xe5\x59\x91\x8c\x2e\x35\x9b\x1b\xaf\x7f\x90\x93\xb3\x39\x26\x19\xeb\x98\x0f\xf9\xf7\xc5\xe9\x52\xd5\x6d\x72\x6e\xc1\x42\x0c\x0a\xc1\x6a\x2d\xa6\xf4\x85\xd1\x7e\x6e\x21\x00\x17\x20\x85\xef\x96\x30\xab\xc3\x57\x08\x66\x48\x64\xb7\x56\x00\x4f\xc2\x0d\x91\xe6\xef\xa7\x63\x9d\x1f\x7e\x7e\x4a\x0e\x4c\x23\x5f\x95\x0e\x3c\xbd\x19\x7d\xff\x66\x94\xb4\x6d\xfd\x3d\xaf\x7d\x3b\x7a\xf3\xf6\x0d\xb4\x58\x41\x68\x51\xad\xc0\x05\xe2\xff\xf9\xe3\x9b\xbf\x27\xcc\x44\xa7\x75\x71\x61\x80\xaa\xe5\xd8\x54\x7e\xf3\xc6\x43\xf6\x86\xaf\xc1\x63\x61\xb4\xff\x71\x65\x0e\x82\xaf\x0c\xdf\x6c\xb7\x5b\x26\xd2\x17\x66\xda\x99\x24\x7f\x61\x73\x8f\x3b\x1a\x4f\xc9\xfb\xaa\xc8\x6e\x2d\x77\x27\x8c\x5d\x16\xe2\x9b\x48\x0f\x63\x22\x24\x7c\x6b\xd9\x9a\xc2\xcc\x4c\xa8\x3d\xaf\x3b\x25\x1f\x27\x1f\x8a\xac\x3d\x0a\xef\x06\xf0\xf4\x32\x3e\xce\xc6\xc7\xf9\x6b\x55\x5f\x8e\x4c\x1a\x4f\xf3\x1d\x03\xab\x3e\xb0\x5f\x6e\xb2\x02\x60\x15\xc3\x52\x48\xd5\xd2\xec\xda\xde\x03\x40\x3c\x65\x1e\xcf\x3e\xa9\x5d\x7f\x62\x2a\xa8\x1f\x31\x95\xd2\xbf\x1d\x01\x8a\x89\x52\x18\x84\x68\xdf\x9e\x9f\xa7\x29\x53\x93\x76\x3c\xcd\xea\xea\x72\xbd\x3c\x83\x32\xad\xc9\xcc\x08\x4f\x28\x85\xbb\x4d\xcb\x64\x9f\x97\x04\xcf\xb9\x83\x30\xed\x9e\x0d\x10\x8d\x64\xbc\x84\x64\x7e\x6f\x7b\x1c\x7b\x45\x19\xd1\x4b\x96\x65\x00\xcb\xed\x0f\xaf\xc4\xfa\x05\xd6\x66\xbc\xf2\x81\x2a\xb2\xf4\xf6\xb4\xcf\x99\x55\xcc\xc7\x4a\xe9\xbe\x30\x76\xeb\x5a\x0b\xeb\xbf\x9a\x4d\x97\xc0\x73\x4e\x2e\x93\x23\x5b\x57\x4a\xbe\xb6\x28\xe6\xd7\x2f\xfb\xe4\xfb\x68\x2c\x7e\xde\x4a\x2f\x1a\x3a\x17\x6f\xfe\x23\x67\xcb\x1e\xf7\xa4\x46\xff\x95\x5f\xf3\x37\x63\xf3\xf7\xf8\x5f\xea\x22\x29\xc7\xc0\x75\x07\x4e\xc7\x82\x2d\x8e\xd0\x0a\xc6\xd3\xc5\x6c\xb3\x5c\xc7\x8b\xb9\x5e\x64\xe6\xf3\xf9\x8e\xd4\x24\xb9\xf2\x8f\x1d\x8f\xc2\x3a\x29\x90\x36\xe8\xaa\xc8\x7e\x75\x09\xec\x5a\x95\xdd\xb4\x83\xf3\x0d\xa3\x64\x9f\x26\x3b\xbc\x20\x49\xff\x59\x7a\xc9\x6c\xdd\x12\x86\x5e\x37\x99\x25\xab\xc5\x76\xe5\x35\x01\x6b\x98\x82\xd7\xde\x75\x7b\x2c\xce\xca\x85\xde\xe9\xb2\x25\xd3\x31\xbe\xd2\x8f\xb4\x38\xa4\x2f\xc1\x96\xe5\x17\x39\x7c\x0d\x39\xa9\x0e\x07\x66\x82\x9e\x26\xcc\xc4\x20\x1f\x33\x12\x8b\x03\xf2\x6d\x4f\xcc\x1b\x65\x3e\xd8\x94\x55\x4d\x98\xf3\x74\xa9\xd8\x62\xc2\x3c\xfe\x29\xdb\xd4\x9d\xf6\x67\xb6\xf3\x79\x66\x35\xe0\xcf\x51\x22\x0b\xd8\x74\xac\xae\x8c\xc1\xd2\x73\x78\x9e\xb2\x75\xfa\xd4\x51\x23\x5a\xb9\x7b\xa0\x9d\xbb\x4c\xed\xa0\x0b\x21\xc9\xe1\xc2\xcd\xf5\x34\x9b\x70\x2f\xe7\xda\x3c\xad\xd8\xb8\x44\xb5\x21\xc9\x98\xab\x0e\xc5\x21\xb5\x65\x47\x4e\xe0\x9d\xdb\x1f\x47\x6a\xe6\x00\xb7\x61\x72\xaf\xc0\xb6\x1a\xa3\xe9\xac\x19\xe5\x6c\x6f\xc0\x46\xca\x5d\xa2\x5d\x4f\x35\xb9\xaf\xeb\x63\x42\x5a\xd4\xa9\x5d\xb3\x14\x4d\x4b\xb6\xb3\x61\x1b\x05\x29\x57\xbe\x18\x3e\xcd\xd8\xde\x41\xb9\x17\x7a\x23\x26\x8a\x8c\x0b\x61\x17\x4e\x38\xdc\x3c\x67\xa2\x6f\xea\x49\x75\x2e\x3f\xbd\x9a\x7d\x50\xb2\x67\xd5\xcc\xc5\xdb\x29\xc2\x2e\x66\x83\x11\x9b\x5e\x9e\x26\x31\xf0\x61\xa2\x1d\xda\xde\xec\xd2\xb2\xb8\xb0\x0d\x55\xda\x9a\xf5\xc1\xd0\xc2\x36\x7a\xd2\x0e\x8d\x8f\x8b\xf1\x71\x39\x3e\xae\xc6\x53\x56\x34\x65\x65\x53\x56\x38\x65\xa5\x53\x56\x3c\x3d\xae\xc2\x33\x56\xb9\x38\xcb\x28\x42\x12\x8f\x77\xce\x56\x84\xf5\x35\x12\xfb\x42\xd6\xa3\xfe\x65\xae\x7f\x59\xe8\x5f\x96\xfa\x97\x95\xfa\x65\x6a\x9a\x4d\x4d\xbb\xa9\x69\x38\x35\x2d\xa7\xa6\xe9\xd4\xb4\x65\x4d\xa7\xa6\xcb\xa9\xe9\x73\x6a\x3a\x9d\x9a\x5e\xa7\xa6\xdb\xa9\xed\x77\x6a\x3b\x9e\xda\x9e\xa7\xb6\xeb\xa9\xed\x7b\x6a\x3b\x9f\x82\xed\xaf\xe2\xce\x02\x73\x47\xaf\x9f\xcc\x01\xb9\x09\x8e\x0b\x41\x4c\xa5\x30\x58\x2f\x3d\x1a\x15\x8b\x0d\x6a\xec\xf1\x08\xb0\xc8\x63\xb2\xe5\x1a\x1c\x1a\xc1\xa2\x29\xc5\x2d\x3b\x72\x68\x97\x96\x4c\xfb\x17\x42\x4f\x84\x9a\x28\x0d\x5a\x41\xea\xe3\x10\xf5\x0b\x4f\x86\x40\x84\x84\x1e\xac\x46\x58\x6e\x53\x4a\x84\x53\x5a\x9a\x2b\x9f\xfa\x35\xa7\x5e\xf0\x1e\x14\xce\xf9\xaa\x26\x45\x01\x4b\x05\xc5\x52\x32\x20\x32\xb2\x10\xe3\xe0\x74\x80\xd2\x78\xc3\x4b\x05\x3b\x5e\x5d\x5b\x7a\x53\xdc\x01\xa5\xdc\x36\x5c\x8c\x59\x18\x45\x23\xc1\x9b\x69\xc9\x5d\x4f\x62\x11\x01\x2d\x57\xfa\x4f\xa5\x62\x33\x6f\x02\x2e\xf4\x9e\xe1\xfb\x13\x43\x23\x57\x90\xf5\x8a\x51\xf7\xf6\x55\x76\x00\x46\xc2\x96\x90\xdb\x4d\xf1\xca\x8b\xde\x30\x3e\xa5\xcc\x76\xc0\x40\x91\xda\x0f\x4f\x85\x2d\x2d\xf3\x83\x8a\x16\x48\x4b\xc6\xff\x56\x55\x22\xa0\x09\xeb\x44\x81\xaa\x4c\x73\xbe\xcd\x87\xb5\xb2\x44\x55\xf3\xa8\x60\x71\xf8\x04\xeb\x55\x91\x02\x38\x5d\xf9\x96\x04\xcc\x24\x59\xcc\xb6\x48\x22\xce\xe7\x38\x0a\xb7\xc4\xa9\x54\x61\x34\xed\xc5\x44\xeb\x38\xd1\xcd\x9b\x6b\x9a\xe6\x8d\x71\x1a\xe6\xe9\x7a\x35\xcf\x74\x73\x55\xe9\x36\x9f\xed\x97\x8b\x59\xaa\x9a\x17\xe7\x43\x65\xda\xc6\xeb\x68\x73\xd0\x6d\x79\x0d\x6a\xb8\x58\xce\x56\xba\xdf\x0f\x49\x7d\x66\x2b\xb8\xae\xdb\x24\xab\x6c\xbe\xd7\x6d\x55\xa5\xdb\x7c\xb5\x5a\xc6\xa6\xdf\x2c\x39\xbf\xd8\xaa\x64\xbb\x58\x2c\x66\xba\xb5\xac\x73\x1b\x6f\x16\xf3\xe5\x7c\xc1\xdc\xfc\x17\xcc\x30\x61\x8f\x3d\x2b\x6d\xd8\x68\x1b\x28\x84\x3e\xac\xe6\x27\x03\xd5\xdc\xf4\x81\xb2\xc3\x21\xca\x36\x12\xa1\xcb\x56\x1f\x36\x8d\xf3\xd9\x7e\x2e\x10\x0a\xfe\x12\xd8\xb6\x79\x76\x58\x4b\x6c\x80\xd1\x3e\x60\x72\x60\xa0\xb9\x40\xa5\x39\x4e\xb8\x24\xe9\x61\x93\xcf\x25\x36\x97\xf5\x04\xec\x3a\x4f\xf7\x4b\x81\x50\xc9\x80\x80\x99\x31\xf7\x29\x97\xf8\x1c\x61\xf8\xa0\xf9\x62\xbf\xdd\x33\xde\x89\x0d\xa0\xdc\x6f\x6a\xb7\x4a\x2f\x05\x5b\x6b\xfb\x79\xa4\x92\xad\x1a\xc0\xc3\x80\xd1\x5f\xe0\x5b\x5c\xcb\x71\x55\xc2\x75\x39\xa2\x16\xe5\x6b\x39\x12\x80\xfc\xbf\xec\xf7\x4a\xfc\x6e\xdb\x29\x50\xb6\x7f\x2b\x8b\xa6\x9d\x5c\xcf\x62\x31\xc8\x0c\x7d\x7c\xe2\x3f\xf1\x65\xa8\xb1\xeb\x04\xdf\x7e\x8a\x02\xe9\x6c\xf5\xc0\x6a\xa2\x44\xed\x64\x29\xd6\x42\xdb\xf8\xb9\x2c\xe8\x98\xbc\x83\x74\x69\xdd\x21\xb9\xfe\xf0\x92\x5b\xd6\x39\x7a\xce\xc0\x5b\xd6\x8e\xb3\xec\x95\xf6\x5b\x59\xa5\x1f\x3c\x37\x6b\xb4\x1c\x4c\xc7\x7a\x9b\x95\x93\x63\x55\x17\xbf\x32\x0c\x49\x39\xe2\xb8\xca\x2a\x69\xc5\x4a\xa9\x7d\xbb\x15\x97\x21\xf3\x30\x93\x5a\x16\xe3\x45\xd3\x73\xec\x04\x80\x29\xcc\x4b\xe6\xe7\x35\x45\xb3\xfb\x70\x64\x6b\xb5\x08\x24\x71\x96\x7e\xa8\x93\xcb\x0d\x77\xef\xd2\x1d\x6f\xf8\xe0\x61\x58\x66\x2c\x7e\xcf\x92\x36\x99\xb0\x56\x0c\x90\x6d\x52\xd4\x27\x06\x15\x6d\x3d\xe6\xe5\x85\x50\x38\xb9\x57\x1a\xc9\xc5\xb8\x38\x33\x27\x96\x0d\xa0\x39\x01\x63\xb2\x65\xae\x35\x0a\x2c\x5f\x2f\x97\xbc\x4e\x99\x7b\x7e\x03\xb1\x1a\xed\xcf\x72\xb5\x1c\x01\x0f\x48\x18\x49\x6c\x0b\xd7\xd3\xa5\xd5\x7f\xad\x03\x50\xfb\x2d\xe2\xd1\xe5\xa9\x4c\x98\x42\xa5\xc7\xa2\xcc\x40\x70\x88\x69\x7c\xa0\xa2\x82\x15\xde\x4c\x00\x80\xea\x2b\x14\x28\x91\x06\x15\x14\x28\xdb\xea\xee\xbe\x9c\xef\x24\x3d\xfb\x6d\xce\x58\xaf\x4b\x1d\x8b\xc0\x3d\x13\xe5\x53\x58\x61\x42\x65\xdf\xfd\x4d\x7c\x6d\xfc\x5b\x14\xfd\x4b\xf4\x1d\x5b\xc9\x0c\x3c\xdb\x88\x32\xfd\x6a\x20\x8a\xe9\xe5\x5a\x96\xca\xae\xbb\xb3\x2c\x86\x13\x4f\x4d\x6f\xbd\x5b\xd2\xd3\x10\x08\xc5\x91\x57\xe4\xa9\x3b\x45\x46\x70\xbc\x80\x28\x04\x43\x61\x09\x30\x07\x22\x71\x40\x28\x1c\xd3\x01\x48\x02\xcc\x26\x39\xac\xc9\x96\x61\xcd\xce\x91\x49\x90\xf0\xc0\xba\x50\x40\x88\x8e\x61\x75\xa1\x80\x20\x40\x83\xb8\xee\x8c\x84\x1e\x7d\x07\x34\xd4\x67\x90\x1f\xa5\x65\x1a\xc3\xbf\xb9\x86\xfd\x5d\xe0\x71\x06\xa6\x47\xcf\xb7\xb5\xbf\xe4\xe7\xb2\x1a\xff\xa5\x3a\x27\x69\x35\xfe\x53\x75\x66\x4a\x98\x34\xe3\x37\x7f\xaa\xae\x75\x91\xd7\xa3\xff\xca\x3f\xbc\xb1\x5f\xdd\x04\x2e\xb3\xfe\x30\x07\x7d\xb4\x70\x56\x1b\xbe\x82\x69\xb7\x64\x3d\x5b\x2e\x72\x2a\xa4\xb1\x3d\xcc\x0e\x0b\x62\x29\xf6\x43\x1a\x37\x46\xf5\xb0\xde\x68\xbf\x4c\x44\xe0\x1c\xa4\xf3\xcb\x47\x18\xcd\x2f\xce\x4d\xde\xb2\x45\x93\x87\x09\xd8\x3f\x20\x52\x38\x9d\x2d\xdf\x8a\xef\x94\xee\x7a\xa4\x89\xd9\x8a\x55\x15\xed\x4d\xe0\xb2\x3b\x0f\x47\x79\x3e\x30\x8a\x64\xf8\xfa\x49\x05\xb1\xcb\x52\x16\x72\x2e\xa8\x32\xfe\x77\x4f\x20\x71\xc9\x7f\x88\xe8\x50\x9a\xa6\x04\x2b\xd9\x58\x46\x8e\xf4\x22\x22\xaa\xe8\x7e\x20\x85\x22\x62\xcd\x27\x52\x48\x98\x10\xf0\xc9\x04\x75\xcb\x7c\x21\xde\xac\x49\x6b\x1e\xbb\xe6\x41\x6d\x1e\x47\x52\x0c\x99\x73\xf7\xcc\xd8\xed\xc9\xa7\x27\x09\x76\x9b\x72\xed\x4f\x0a\xfe\xf5\x51\x29\x7d\x6d\x82\x4d\x8e\x07\x24\x0a\x9c\x25\x35\xf6\xbd\x1b\x5e\xd4\xe1\x7a\xd8\xbe\x54\xf9\x52\x98\x7b\xbf\xc1\x76\x3b\x23\x1b\x6c\xd7\x81\x06\x31\xdb\x73\x92\x2d\xe2\x58\x36\xb1\x15\x93\x43\x79\x2d\xb2\x2f\x36\xda\x69\x5d\x7d\x70\x7c\x98\x49\x6c\x75\x55\x01\x4e\x24\x24\x13\xe0\xe4\x63\x33\x61\xfb\x7c\xfe\x5b\x73\xd2\xbf\x9d\x32\xfd\x5b\xf9\xa2\x7f\x63\x70\x33\x03\x37\x33\x70\x33\x03\x37\x33\x70\x73\x03\x37\x37\x70\x73\x03\x37\x37\x70\x0b\x03\xb7\x30\x70\x0b\x03\xb7\x30\x70\x4b\x03\xb7\x34\x70\x4b\x03\xb7\x34\x70\x2b\x03\xb7\x32\x70\x2b\x03\xb7\x32\x70\x6b\x03\xb7\x36\x70\x6b\x03\xb7\x36\x70\x1b\x03\xb7\x31\x70\x1b\x03\xb7\x31\x70\x5b\x03\xb7\x35\x70\x5b\x03\xb7\x35\x70\x71\x64\x19\x1d\x59\x4e\x47\x96\xd5\x91\x85\x05\x42\x01\x52\x01\x62\xb1\x72\x89\xad\x60\x62\x2b\x99\xd8\x8a\x26\x9e\xbd\xfa\xc7\x47\xb8\xae\x82\x80\xe9\x30\xdd\x72\x35\xc6\xea\x84\x95\xba\x95\xab\x95\x9c\x95\x8d\xe5\xbe\xe5\xaf\xe5\x20\xe0\x11\x60\x81\x18\x21\xd8\x14\xdc\x40\xa9\x0d\x4a\xdb\xd2\x58\xcf\xcd\x78\xba\x92\xff\x5b\x83\xda\x48\xd5\x6e\xe6\xd3\xb9\xfa\x9f\xad\xdd\x9a\x75\xc0\x96\x6d\x54\xd9\x6a\x45\xa0\x5b\xab\xca\xe5\x86\xc0\xb6\xd2\x95\x80\xba\xa5\x2a\x5b\x50\xc4\x2d\x54\xe5\x9c\xa2\x6d\xae\x2a\x67\x80\x36\xc3\x00\x8a\x36\xcd\x07\x8a\x34\xe1\xb3\x30\xfe\x29\xd9\x42\xfe\xc9\xaa\x58\x55\x91\x4c\x94\x20\x91\x02\x21\x39\x29\x40\xb6\x0a\x02\xb2\x53\x54\x6c\x54\x05\xc9\x53\x01\xb1\x56\x10\x24\x63\x05\xc4\x4a\x43\x60\xda\x97\xaa\x82\x64\xb1\x80\x58\x28\x08\x92\xcf\x02\x62\xae\x20\x66\x98\x72\xc3\xb2\x20\xe5\x9a\x73\x41\xc2\x35\xdf\x22\x50\xdc\x1c\xb9\x34\xe4\xdc\x73\x85\xc1\x6b\x62\x59\x13\x90\x05\x87\x88\x24\x44\x40\x14\x0c\x62\x2b\x01\x5c\x49\xb0\xf2\x8d\x2c\x0f\x08\x82\x01\xac\x25\x40\x40\x0e\x0c\x60\xa5\x00\x30\xd5\x4b\x59\x1e\x90\x02\x03\x58\x48\x80\x80\x10\x18\xc0\x5c\x02\xcc\x30\xcd\x9a\x51\x41\x9a\x15\xbf\x82\x24\x2b\x6e\x59\x01\xc8\xcf\x91\x5c\x04\xce\xe6\x1f\x4a\x42\x83\xc4\x0e\x08\x29\x12\x0d\x1a\x39\xa0\xa4\x6c\x14\xe8\xd6\x81\x84\x42\x52\x00\x1b\x07\x80\x94\x96\x82\x5c\x3b\x90\xa4\xd8\x14\xe4\xca\x85\xf4\xc7\xba\x74\x00\x48\x41\x2a\xc8\x85\x03\x49\x4a\x54\x41\xce\x1d\xc8\x99\x3f\x52\x24\x82\x8e\x91\xba\x92\xe8\x18\x68\x34\x38\x14\xe5\xba\x41\xd6\xd1\xb1\xae\x8c\x75\x56\xac\x3b\x62\x1d\x0e\xeb\x52\x58\xa7\xc1\xba\x05\xc0\xee\x03\xb3\x2e\xac\xb6\x67\xde\x64\x29\x36\x6f\xa2\x59\xd0\xbc\x09\xfc\x41\xf3\xc6\xe9\xc0\xe6\x8d\x53\x19\x34\x6f\x7c\x30\x41\xf3\xc6\xc7\x8c\xcd\x1b\xe7\x48\xd0\xbc\x71\xc6\x05\xcd\x1b\xe7\x2f\x36\x6f\x9c\xfb\x41\xf3\xc6\x87\x1a\x32\x6f\xac\x2e\x64\xde\x4c\x55\xd8\xbc\x19\x90\xb0\x79\xd3\x20\x9e\x79\xd3\x15\x61\xf3\xa6\x21\xc2\xe6\x4d\x43\x78\xe6\x4d\x57\x84\xcd\x9b\x86\x08\x9b\x37\x0d\xe1\x99\x37\x5d\x11\x36\x6f\x86\x2f\x21\xf3\xa6\x01\x90\x79\x13\xc5\xa4\x79\x33\x35\x41\xf3\x66\x20\x82\xe6\x4d\x43\x60\xf3\xa6\xcb\x83\xe6\x4d\x03\x04\xcd\x9b\x06\xc0\xe6\x4d\x97\x07\xcd\x9b\x06\x08\x9a\x37\x0d\x80\xcd\x9b\x2e\x0f\x9a\x37\xc3\x8e\x80\x79\xd3\xf5\xae\x79\x63\xa5\x7d\xe6\x0d\x80\xf4\x99\x37\x00\xda\x67\xde\x2c\x68\xc0\xbc\x59\x80\x3e\xf3\x66\x21\xfb\xcc\x9b\x85\x0c\x98\x37\x0b\xd0\x67\xde\x2c\x64\x9f\x79\xb3\x90\x01\xf3\x66\x01\xfa\xcc\x1b\xe0\x6f\xb7\x79\xb3\x80\xd8\xbc\x75\x86\x2f\xe0\xe6\xde\x6e\xdf\xed\x06\xdd\x6e\xc1\xed\x26\xdb\x6e\xa3\xed\x46\xd9\x6e\x85\xed\x66\x17\x6c\x66\xc1\x5e\x55\x6c\x45\x3d\xfb\x26\x4b\xb1\x7d\x13\xcd\x82\xf6\x4d\xe0\x0f\xda\x37\x4e\x07\xb6\x6f\x9c\xca\xa0\x7d\xe3\x83\x09\xda\x37\x3e\x66\x6c\xdf\x38\x47\x82\xf6\x8d\x33\x2e\x68\xdf\x38\x7f\xb1\x7d\xe3\xdc\x0f\xda\x37\x3e\xd4\x90\x7d\x63\x75\x21\xfb\x66\xaa\xc2\xf6\xcd\x80\x84\xed\x9b\x06\xf1\xec\x9b\xae\x08\xdb\x37\x0d\x11\xb6\x6f\x1a\xc2\xb3\x6f\xba\x22\x6c\xdf\x34\x44\xd8\xbe\x69\x08\xcf\xbe\xe9\x8a\xb0\x7d\x33\x7c\x09\xd9\x37\x0d\x80\xec\x9b\x28\x26\xed\x9b\xa9\x09\xda\x37\x03\x11\xb4\x6f\x1a\x02\xdb\x37\x5d\x1e\xb4\x6f\x1a\x20\x68\xdf\x34\x00\xb6\x6f\xba\x3c\x68\xdf\x34\x40\xd0\xbe\x69\x00\x6c\xdf\x74\x79\xd0\xbe\x19\x76\x04\xec\x9b\xae\x77\xed\x1b\x2b\xed\xb3\x6f\x00\xa4\xcf\xbe\x01\xd0\x3e\xfb\x66\x41\x03\xf6\xcd\x02\xf4\xd9\x37\x0b\xd9\x67\xdf\x2c\x64\xc0\xbe\x59\x80\x3e\xfb\x66\x21\xfb\xec\x9b\x85\x0c\xd8\x37\x0b\xd0\x67\xdf\x00\x7f\xbb\xed\x9b\x05\x1c\x60\xdf\x40\xb4\x1d\xc6\xac\x6d\x54\xda\xc6\x9d\x6d\x64\xd9\xc6\x8e\x6d\x74\xd8\xc6\x7f\x6d\x84\xd7\xc6\x70\x41\x88\x16\x44\x60\x65\x80\x15\x1b\x38\x59\x8a\x0d\x9c\x68\x16\x34\x70\x02\x7f\xd0\xc0\x71\x3a\xb0\x81\xe3\x54\x06\x0d\x1c\x1f\x4c\xd0\xc0\xf1\x31\x63\x03\xc7\x39\x12\x34\x70\x9c\x71\x41\x03\xc7\xf9\x8b\x0d\x1c\xe7\x7e\xd0\xc0\xf1\xa1\x86\x0c\x1c\xab\x0b\x19\x38\x53\x15\x36\x70\x06\x24\x6c\xe0\x34\x88\x67\xe0\x74\x45\xd8\xc0\x69\x88\xb0\x81\xd3\x10\x9e\x81\xd3\x15\x61\x03\xa7\x21\xc2\x06\x4e\x43\x78\x06\x4e\x57\x84\x0d\x9c\xe1\x4b\xc8\xc0\x69\x00\x64\xe0\x44\x31\x69\xe0\x4c\x4d\xd0\xc0\x19\x88\xa0\x81\xd3\x10\xd8\xc0\xe9\xf2\xa0\x81\xd3\x00\x41\x03\xa7\x01\xb0\x81\xd3\xe5\x41\x03\xa7\x01\x82\x06\x4e\x03\x60\x03\xa7\xcb\x83\x06\xce\xb0\x23\x60\xe0\x74\xbd\x6b\xe0\x58\x69\x9f\x81\x03\x20\x7d\x06\x0e\x80\xf6\x19\x38\x0b\x1a\x30\x70\x16\xa0\xcf\xc0\x59\xc8\x3e\x03\x67\x21\x03\x06\xce\x02\xf4\x19\x38\x0b\xd9\x67\xe0\x2c\x64\xc0\xc0\x59\x80\x3e\x03\x07\xf8\xdb\x6d\xe0\x2c\xa0\x67\xe0\x5a\xf3\xb1\x1c\x5c\xba\xe8\xfa\xf0\x7e\x6b\x8f\xc4\x21\x63\x81\x05\x60\x20\x8e\xf5\x49\xa0\x67\x71\x9f\xef\xb9\xad\x9f\xcd\x15\xb2\xe7\x96\x5f\x94\x42\x45\xfc\x90\x0d\x2a\x32\x0d\x33\xbf\x61\xe6\x37\xb4\xc7\x39\x36\xe1\x03\x12\xe8\xf2\x4f\x5b\x5d\x02\x17\x43\xb2\x2c\x23\x46\x80\x2f\x0f\xc9\xf1\xa2\x13\x79\x33\x12\x8b\xca\x9d\xf0\x4e\x63\x7b\x3a\x14\xb5\x3e\xde\x06\x46\xcd\xf8\x2f\xae\x39\xf6\xc1\x89\x6a\xb7\x2e\x88\xb2\xb3\xe7\x6c\x60\xcf\xd9\xf0\x9e\x33\x70\x4b\xf1\x29\xba\x41\xe1\xbd\x13\xff\x85\xf5\x24\xb7\x46\xfa\xa6\x22\x79\xc7\x4d\xdd\x44\x4c\xab\x73\x26\xb2\x72\x10\x3a\x06\x2b\x3d\x6d\x83\x95\x9e\xde\x91\x68\xb3\x2e\xb4\x54\x25\xa1\x95\x4b\x33\x27\xcc\x1d\x4a\xfa\x02\x25\x86\xa2\x86\x67\xeb\xfc\xd1\xd9\x3a\x7f\x70\x04\xce\xac\x03\x27\x51\x07\x46\xf6\x05\xa8\xb7\x54\xb8\x59\x34\xd4\xea\x34\xb3\x3c\x6b\xda\xba\xb8\x00\xe2\x9e\xce\xed\x51\x2a\xdc\xf7\x55\x96\xbd\x05\xb4\xf6\x42\x92\xb7\x70\xb7\xfc\x47\x77\x26\x4e\x89\x5b\x04\xea\x4f\xd3\x03\x5d\x4d\xa2\x15\x27\xa9\xe4\xaa\x3b\x62\x65\x3f\xa5\x65\xd2\x34\x7f\xf8\x91\xaf\xd2\x3f\xdb\x93\x13\x4d\x9b\xb0\x65\x65\x27\x1d\x7d\x71\x20\xdb\xbd\x00\xcd\xc0\xaf\xa7\xf3\x4d\xdf\x27\x76\xb0\x8c\xf5\xdd\xe2\x47\x71\xe7\xfc\x68\x94\xb7\xe6\x4e\x55\xea\x13\x7f\xe9\xc5\x35\x56\x23\x70\x8d\x95\x7c\x10\x9b\x57\x63\x75\x36\x80\x4d\x15\x13\x66\x81\xa8\x51\xd8\x88\x1a\x8c\xcd\xb3\x4e\x44\x0d\xc6\xd6\x21\x71\x52\x53\x2c\x8b\xd4\x4d\xd9\x00\xd4\x71\x00\x94\x03\x12\xd4\x4d\x04\x45\x11\x9c\x6f\xf8\x0f\xa5\x01\xea\x7a\x08\xa5\x02\xb8\x0a\xe8\x00\xae\x02\x4a\x10\x44\xe8\x57\x01\x35\x08\x20\xd4\xe5\x94\x22\x10\x55\x5a\x76\x44\x95\x87\xd0\xd7\x05\xa2\xca\x43\x48\x31\x57\xdd\xb6\x09\x6a\x83\x73\x03\x27\xac\x0e\x03\xc0\x5c\x98\xb0\x42\x20\x30\x92\xe8\x28\xdf\xa6\x2b\x4a\x23\xf8\x15\x1f\x4a\x1d\x9c\x72\xa0\x0b\x4e\x39\x50\x04\x1a\xcf\x31\x80\xe7\x48\xe2\x11\x85\x94\xf0\x71\xb9\x16\x14\x2e\x77\xf1\xf8\x32\xc7\xe5\x2e\x1e\x92\x71\xf2\x36\x54\x50\xda\xf6\x86\x54\x58\xd4\x7d\x30\x00\x20\x2c\x64\x08\x43\x11\x9a\x2e\xf2\xf9\x61\x4e\x49\x58\x5d\xbb\xa2\x84\x8c\xab\x80\x9c\x71\x15\x10\x75\x10\xa1\x5f\x05\x04\x1e\x40\xa8\xcb\x29\xb1\x13\x55\x5a\x62\x44\x95\x87\xd0\x97\x3f\x51\xe5\x21\x24\x2d\x80\xbc\xc5\x16\xd4\x02\xe7\x66\x5b\x58\x11\x06\x80\xb9\x30\x61\x75\x40\x60\x24\xd1\xc9\x61\x96\xa6\x94\x46\xc8\x8b\x73\x94\x42\xa0\x1a\xa0\x0f\xa8\x06\xa8\x43\x08\x9b\x57\x03\x94\x81\xc6\xa6\x8a\x29\x55\xf0\x6b\xb4\xe0\xfc\x1a\x8c\xcd\xd7\x03\xbf\x06\x63\x23\x19\x2a\xef\x1e\x06\xb5\x00\xde\x47\x0c\x2b\x41\x3f\x94\x03\x12\x56\x01\x17\x8a\xf4\x03\xf6\x29\xfb\x9f\x8d\x80\x9b\x10\xc1\x7a\xb5\x16\x01\x70\x89\xd7\xe6\xc8\x08\xef\xff\xc5\x19\x5f\x70\xfe\x5e\xdd\x9c\x33\x25\x1f\xd5\x89\x7c\x91\xaf\xd0\x94\xca\x0b\x27\xbc\x88\x9f\x48\x67\x6d\xf8\x09\x61\x09\xb8\x4f\xea\x40\xae\x0a\x93\x91\xcb\x60\x11\x0d\xb8\xb6\xb7\xd5\x35\x3d\xde\x3c\xb2\x9f\xa7\x3a\x06\x82\x2e\x57\x06\x00\xa9\x0d\x0c\x01\xe4\xef\xc3\x08\x20\x7f\x43\xd6\xd5\x5d\x36\xa4\xbb\x2e\x20\xb0\x57\xa3\xae\x27\x06\xda\x79\xdb\xd3\x30\x6f\xc8\x5d\x1e\x0c\x06\x04\x89\x23\x77\xb0\xf7\xb6\xb4\xec\xbc\xb7\xa5\xe5\xf1\xc3\xd4\xde\xdd\xd2\x4a\x03\xb6\x7c\x75\xee\xe3\xdd\xc9\x69\x70\x75\xf2\x3e\x46\xdf\xd7\x10\xf0\xf9\xbe\x86\x80\xcd\x0f\x92\x7a\x6f\x43\xc0\x64\x70\x7d\xd4\xb9\x0f\x39\x88\xc9\x7a\x6f\x6f\x91\x74\x4d\x5a\x9f\x80\xfb\x1b\x52\x3d\xde\x33\x64\xb7\x21\x4a\x4a\x1a\xdd\x6c\x72\x3e\x7b\x4b\x4b\x5f\x32\xb3\x59\x72\xec\x77\xcf\x48\x27\xe1\x73\x6f\xa9\x81\x35\x1f\xe3\x09\xa4\xcc\xe0\x49\x2e\xa8\x9c\x52\xce\x15\x34\x94\xa5\x87\xb8\x4c\xbf\xe4\x3f\x37\x99\xdd\x2c\x90\x48\x08\x12\xb1\x44\x79\x3a\xf8\xc5\xf1\x8e\xbc\x8c\x5f\x28\x81\x98\x97\x93\x72\x4c\xa5\xae\xd4\x89\x47\x16\xe2\x66\xa0\x61\x9f\x8e\x40\xff\x6d\xbb\xeb\xce\x81\x79\x28\xf8\x95\x70\x37\x9f\xae\xd3\x33\x33\xf5\x3f\x07\xe5\xa6\x92\xd9\xfd\x74\xba\x96\x6d\x71\xe1\xd7\xce\x55\x01\x97\xd6\xcf\xa1\x44\x96\xa2\x4f\x99\xa7\xcb\xcf\xbc\xe9\x97\x9b\xb1\x7e\xb5\xd4\x5e\xac\x8c\x67\x0b\x25\xef\x50\x0a\x56\xae\xdd\x5b\x93\xfd\x49\xd5\x96\xcb\xe5\x6d\xca\xaf\xc6\x4f\x54\x22\xe1\xb0\xea\x9b\x8b\x86\x20\x05\xd4\x8a\x0d\x83\x27\x96\xb9\xbb\xd3\x50\x6e\x2e\x5b\x5a\x9c\x92\x17\x95\xa8\x61\xe0\x9d\x4c\x37\x6f\xa8\x7b\x23\x95\xb7\xe5\xff\x87\x57\x52\xa3\xf5\xf2\x2d\x75\x7b\x35\x08\x4b\x64\x04\xb3\x69\x05\xab\x1a\xe6\xfd\x1a\x4d\xe3\x65\x33\xb6\xc8\xbd\xba\xdd\x97\x40\xe2\x8a\x4e\xa9\x1d\xc4\xc6\x13\xb7\x24\x87\x7c\x6b\xf4\x2e\x7a\x84\x49\x63\x7e\x23\x77\xa3\x2b\xe2\x68\x36\x8e\xd7\xcb\xf1\x6c\x3e\x1f\x4f\x57\x77\x71\xb0\x13\x11\x1a\x8c\xcc\x9e\xcb\x54\x31\xcd\x8f\x55\x99\xd9\x6c\x32\x3c\x91\x66\xc5\x73\x97\xb6\x9f\x9e\x62\xd4\x88\x3b\xd2\x62\x46\x06\x1a\x7a\x7d\x98\x4c\xb8\x43\xdb\x80\x14\xc1\x6e\x79\xcd\xcc\x3e\xcf\xa8\xf6\xf3\x58\x1b\x1d\x0b\x3a\x72\xa7\x98\x4a\x6c\x71\xae\xf8\x07\x46\xe6\xbf\xb3\x75\x81\xd8\x9a\xe4\x39\x18\xa6\x4e\x67\xe8\x22\xba\x3f\x01\xaf\x48\x92\x02\x40\xb3\xa4\x65\xeb\x1f\x9c\xae\x7c\x7e\xab\x21\xcb\xec\xb2\xfe\x36\xe7\x36\x15\x4b\xe0\x78\xaa\x57\x3c\x9c\xe3\xcf\x5e\x85\x84\x09\xc5\x3a\x52\x74\xb9\xd7\x25\xe5\xa7\x54\xd1\xc7\x48\x18\x3f\xdb\xd3\x88\x32\x86\x3b\x9c\xff\x0c\x25\x77\x56\xa8\x7c\x43\x25\x2b\x54\xc6\x17\xaa\xde\x74\x4b\x66\x63\x36\xd5\x04\x06\x6b\xf8\x40\xfa\x15\xe7\x1a\x31\x18\xe5\x3b\xcc\xd0\x77\x96\xb5\x80\x79\x13\xcb\x7b\xd5\xa3\x47\xc2\x80\x9c\x35\x44\x8e\xb7\x08\x7f\x23\x96\x09\x22\x87\xf1\x55\xf5\xfc\xae\x9b\xb0\x77\x1e\xa5\x54\x8a\x1c\x75\x0e\xe3\x42\x78\x15\x60\xe2\x51\x6c\x86\xf3\x52\x34\xf0\x0a\x54\xbf\xb0\x5c\xb7\xa6\xca\x7c\x70\x62\x5e\xfb\x2a\xd3\x0d\x64\x75\x87\x5a\x24\xa4\x12\x04\x6b\x34\x6b\x29\x00\x8d\xb8\xb3\x52\x73\xde\x5f\x7f\x78\x06\x1d\xbe\x02\x36\x27\xbd\xa6\xcc\xc1\xac\x14\xde\x0a\xce\xc8\x30\xf3\xcc\xfc\xd2\x4f\x0e\xa1\xfc\x2e\x1a\xbb\xb3\xea\x70\x99\x9b\x45\x4e\x83\x8f\xb1\xdb\xe6\x21\x52\x39\x33\x45\x69\xf9\xa2\x4b\x17\x2b\x40\xbc\x48\xeb\x63\x73\xd8\x99\xc4\x79\x88\x7a\x2f\xb7\xc5\x0a\x93\x8f\xf0\xc3\xe6\xbc\x00\x93\x5f\xbe\x84\xc8\xb7\x88\x24\xf9\xc7\xa4\x99\x1c\xf2\x3c\xe3\x46\xc0\xbf\x59\xee\xd6\x23\x53\xe2\x5e\x2a\x5f\xcc\xa6\x62\x89\x08\x37\x20\xfa\x31\x89\x3f\xc5\xc9\x04\xbe\x87\x50\x5b\xc6\x1d\xe5\x0a\x0a\xf7\x0f\xba\x82\xd8\x76\xec\x88\x1c\x7b\x9c\x1e\xf5\x0d\x66\x34\xe5\xf9\x9c\xe4\xba\x34\x76\x2b\x34\x89\x6a\xc9\x77\xea\xd4\xfa\xe8\xc2\x6b\x9d\x27\x40\xcd\x32\x44\xb6\x30\x13\xc1\xc9\xbb\xe7\xc2\x3a\x6c\x76\x7d\x2a\x09\xff\xb5\xdd\xcd\x0e\x7a\x48\x4f\x4f\xa6\x06\x7c\xd8\xbf\xe3\xae\xfc\x37\xab\xf5\x3e\x5e\x6d\xee\x76\xe9\x40\x5b\x44\xb5\x54\x78\xe1\x48\x4c\x98\xaa\x56\x67\x97\xe7\x3b\x92\xb1\xe1\x4f\x8a\x41\x8e\x58\xbd\x26\x64\xaa\x3e\x05\xf8\xaa\x67\x2a\x08\xd5\x33\x75\x40\xf5\x2c\xbc\xa3\x7a\x2e\xa8\xa3\x7a\x5e\x0b\xa4\x7a\x2a\xf5\xa2\x0b\xdb\xa1\x7a\x12\xfe\xb7\x51\x3d\x92\x9e\xc0\x26\x83\x67\x87\xfc\x3c\xd5\x4b\xa3\x24\x5e\xed\x1f\x53\x3d\xd9\x16\x51\x1d\x54\x3d\xc5\x43\x92\xb1\xe1\x2f\x5b\x41\x8e\x78\xaa\x07\x65\x9a\xd7\x35\xdb\xd3\x79\x8a\xa7\x8a\x09\xb5\x53\x35\x40\xe9\x34\xac\xa3\x72\x10\xcc\x51\x38\x04\x8d\xd4\x4d\xe5\xea\x84\x90\x1d\xca\x26\xa1\x7f\x1b\x65\x23\xa8\x21\x55\x4d\xe6\x12\xfd\x4c\x55\xcb\x37\x8b\xcd\xfc\x41\x55\x13\x6d\x1d\x9a\x83\x8a\xa6\xf8\x47\x32\x35\xfc\xf1\x2c\xc0\x0d\x4f\xcd\xb4\x2c\x1d\x20\x79\xf0\xc9\xff\xce\x63\x15\xd0\xcb\xc7\x6e\xbc\xf0\x25\xbd\x35\x53\xdd\xad\xe7\xfc\xa7\xe3\xb2\xbf\xa0\x43\x6d\x84\xe0\xfe\x71\x40\xe0\x32\xb0\xff\xb8\x11\x38\x71\x98\xca\xc1\x2a\x09\x12\xb9\x9d\x86\x20\x04\x82\x7b\x76\xb1\xc3\x7b\x26\x4e\x13\x67\xc6\x62\x36\x0f\xea\x54\xcd\x6c\x17\x2b\xde\x47\x53\xbc\xa2\x72\x89\x46\x38\x09\xe2\x60\x0a\xa8\xdd\x2e\x49\x53\xd7\xa6\xd6\x4b\xa3\x1a\xa1\xae\x86\x38\xa2\xf2\xc0\xac\x6a\x08\x52\x87\xe2\xd5\xd1\xab\x87\x9c\x74\xda\x99\x95\x92\x6e\x62\xd6\xcb\x60\xcb\xae\x2d\xaa\xc7\x79\x15\x77\x25\x06\xd0\x47\xe0\x2b\x0c\x94\xd0\x28\xfc\x38\x4c\x4f\x0e\x32\x1a\x03\x5a\x1e\x30\xe9\x3d\x93\x3a\x28\x14\x3f\xdb\x36\x41\xc0\x60\x1d\xd8\xc1\xcc\x58\xfb\xf6\x3c\x6c\xe5\xc0\x31\x0a\x6f\xfb\x11\x88\x6d\xb8\xb1\x8c\xa1\x91\x67\x98\x9d\x8f\x48\xb9\xf8\x60\x5c\x3c\x1c\xca\xbe\x36\xfc\xa5\x26\xb1\x8d\x94\x14\x89\xa8\x28\x51\xda\xf8\x85\xb8\x40\x30\x55\x7d\xb6\x10\xbf\xaa\x73\x92\xb6\x64\x0a\x4b\xbe\xc2\xf7\x0b\xd1\xab\x3a\xd7\x61\x68\x79\x05\xdf\xc4\xc8\x27\x56\x00\xad\x90\x4a\xfb\x30\x61\x40\x78\x1d\x3e\xc2\x9c\x91\xbf\x44\x76\x3e\x9e\xd1\x7e\x4b\x08\x56\xd0\x35\xd5\x61\x16\x41\x59\x77\xb0\x48\xe8\x34\x11\xfb\x55\x2a\x38\xc9\xdf\x33\xad\x6a\x24\xed\x3a\xf2\x3b\x5d\x2d\x77\x87\xa2\x14\xb9\x58\xcb\xcb\x31\xf9\x5e\x55\xfc\xb8\x02\xdf\x23\xd0\x7b\x5a\xf8\x7d\x2d\x41\xe8\x44\x3d\x5a\x07\xb9\xdd\xf5\x3e\x8a\x39\x35\xc7\x0f\x48\x81\xf6\x40\x7c\xa6\xc8\x2a\x90\x29\x02\xe2\xd2\x65\xe6\x68\x73\x75\xc9\xcf\x23\xf1\xce\x13\xa3\x90\xaf\xae\x2f\x2f\x65\x3e\x9c\xc6\x7c\xcf\x7f\xb0\x57\x95\xf1\x9f\xdb\x17\xa4\x81\xd4\x29\xa7\x03\x57\xf6\xba\xb4\x5f\x07\x34\xe4\x98\x44\x46\x30\xd8\xb6\x57\x95\x3d\x88\x09\x14\x16\xbd\x2f\x2c\x80\x5e\x56\xf6\xa1\xf7\x51\x58\xf4\x04\xd3\x01\x7e\x55\xdb\xd7\x01\x25\x39\x0d\x3a\xed\xec\x61\x3a\xac\x07\xbd\x84\x3c\x32\x03\x18\xa2\x24\x7b\xc9\xbb\x9f\x30\x60\xaa\x2b\x1b\xdd\xf1\xe0\x01\x0e\x86\x2c\xd7\xf9\x3e\x73\xb0\x40\xc1\xea\x22\x20\x0c\x5d\x04\x39\xa4\xca\x06\x28\xfe\x20\x4a\xe7\xb3\xf5\x6a\x1f\x23\x4a\x99\x19\xcb\x37\xf9\xed\x0b\xd2\xd0\x31\xf9\x34\x32\x77\xf2\xa9\xd2\x01\x93\x4f\x41\x8e\x49\x64\x04\x83\x07\x4f\xbe\xb0\x8c\xc8\xc9\xe7\xa3\xef\x9e\x7c\x61\x79\xd3\x93\xcf\xc7\xdf\x33\x35\xba\x24\x47\x4e\x3e\xaf\x87\xbe\xc9\xe7\xea\x01\x31\xf9\x86\xce\x03\x34\x05\x75\x33\xfa\xe2\x1c\x6f\x87\x1e\x5a\xa1\x75\x7b\x99\xee\x37\xcb\x14\xf5\xbe\x48\x93\x7c\x91\x3a\x58\xa0\x84\x75\x11\x90\x8a\x2e\x82\xac\x52\x65\x03\x66\xc0\x20\x4a\x17\xeb\x64\xb1\x58\x63\x3e\x6d\x37\x8b\xf9\xf6\xf6\x05\x69\xe8\x98\x85\x1a\x99\x3b\x0b\x55\xe9\x80\x59\x68\xee\xb7\x50\xc8\x08\x06\x0f\x9e\x85\x61\x19\x91\xb3\xd0\x47\xdf\x3d\x0b\xc3\xf2\xa6\x67\xa1\x8f\xbf\x67\x8e\x74\x49\x8e\x9c\x85\x5e\x0f\x7d\xb3\xd0\xd5\x03\x62\x16\x0e\x9d\x07\x68\x16\xea\x66\xe1\x59\x08\xdf\x2b\x0a\x4c\xc1\x7d\x1a\x65\x39\xee\x7a\xb5\xdf\x64\x89\x45\x01\x65\x2b\xfe\x06\xc2\x10\x7f\x43\xf6\xf0\x82\x01\x2a\xdf\x4f\xda\x7c\xbb\x9f\x67\x78\xce\xcd\x56\xdb\x64\x9f\xde\x3e\xbf\xeb\x8e\xa9\x26\xd0\xb8\xf3\x8c\x17\x0d\x98\x64\xf2\x06\x91\x87\x03\xf3\x6f\xf0\xdc\xa2\x98\x4f\xce\x2a\x84\xb5\x7b\x4a\x51\x22\xa4\x27\x13\x42\xdb\xa3\xe7\xb4\x3c\xc8\x39\xe4\x22\xee\x9b\x40\x40\xae\xd4\xec\x19\xa2\xc2\x78\xea\xa8\x36\xe1\xa9\x83\x5e\xec\xa2\x55\xf4\x10\x25\xd9\x02\x77\x9d\xe7\xc9\x6c\xbe\x72\xb0\x40\x19\xea\x22\x20\x00\x5d\x04\x39\xa4\xca\x06\xa8\xf3\x20\x4a\xf3\x6c\x9b\xce\x36\x88\xd2\x6c\xb9\x59\xc6\xb3\xdb\x17\xa4\xa1\x63\x56\x69\x64\xee\xc4\x52\xa5\x03\xe6\x96\xb9\xac\x45\x21\x23\x18\x3c\x78\x92\x85\x65\x44\x4e\x35\x1f\x7d\xf7\x6c\x0b\xcb\x9b\x9e\x73\x3e\xfe\x9e\xd9\xd1\x25\x39\x72\xf2\x79\x3d\xf4\xcd\x3f\x57\x0f\xa8\x3d\xdc\xc0\x79\x80\x77\x72\xaa\x59\x78\x16\xba\x0f\xdf\xd1\xaa\x9d\x6d\x97\xf3\x05\xde\x43\x66\x8b\xf9\x61\x9e\x40\x24\xce\x1e\x5d\x96\xc0\x6d\xb5\x2c\x71\xb6\xba\xa2\x68\x48\x00\x63\x08\x91\xb3\xf9\x6c\x86\xbf\xbe\x27\xe9\x6c\x3b\x5b\xde\xbe\x14\x01\x5d\x01\x14\x89\x0a\xc5\x4f\x44\xe1\x90\xf0\x89\xba\x1a\x47\x60\xf2\xb9\x3a\x3c\x76\x12\x10\x0b\x1d\x39\xc1\xb8\x7b\x02\x27\x01\x01\x07\xc2\x26\x18\x79\x5f\x4c\x23\x28\x2b\x3a\x66\x82\xd0\xf7\x86\x4c\xa0\xdc\xc9\x0b\xc0\x83\x14\x1e\x4d\x36\xdd\x2a\x3c\xd9\xca\xe2\xfc\x0b\xda\xe1\x75\x9f\x47\xf4\x9f\xcb\xd1\x68\xc6\xe6\x37\x87\x4b\xbc\x60\x80\xbe\x09\x42\x3a\xdf\xe9\xb9\x2b\x10\x8b\x08\x02\x0a\x27\xfe\x06\x4a\x02\x08\x76\xbf\x82\xc3\x54\x45\x3d\x98\x86\x3e\x48\xde\x9d\x0f\x89\x60\x57\xcf\x74\xa2\x28\x1a\x3c\x5f\x7c\xf2\xf9\xa1\xef\xe0\xc7\x01\x7e\xd4\x4e\xfc\x2b\xbf\xc1\x97\x2f\xcf\xfc\xaf\xd7\x2f\x71\x00\x50\xee\x77\x4e\x10\x7d\x73\x72\xd1\x3f\x7e\x38\x52\x20\xfd\xd8\x40\xe4\x1f\x1b\x44\xbb\xfc\xf8\xf0\x20\x6e\xea\x83\xbf\x7f\x99\x49\x7f\x3b\x76\xcf\x12\x46\x00\xc5\x3b\x80\xcd\x3d\x30\xe0\x1c\x3b\xbf\xee\x4f\x45\xfb\xb3\x85\x75\x2e\xcd\xe4\x4c\xce\x81\x3a\xf9\x72\x3f\xa8\x74\xbf\xbf\x27\x59\xfe\xaa\xbf\x87\x44\xd4\x25\x0c\x55\x29\xae\x44\x8c\x38\x6b\x92\x7a\xd7\x5d\x2d\xb1\x4e\x8b\xf3\x2b\xb8\x49\x90\xf2\x67\xb5\x2e\x8d\x3d\x43\x2d\x15\x4c\x17\x73\x68\xf7\xfe\x91\xae\xe2\xae\xa6\xff\x20\x90\x12\x8f\xff\x4a\x3a\x31\x02\x09\x3b\x9a\xce\x97\xf2\xf5\xf8\x5d\x47\xdd\xed\x8f\xea\xbd\xb9\x34\x77\x5e\x9e\xfb\xee\xdf\xcb\x4f\x97\x63\x91\x56\xe7\x66\xf4\x1f\x49\x79\xe0\xf7\x81\x9b\xef\x76\x4d\x9d\x3e\x5d\xeb\xf2\xfb\xe9\xf4\x07\x0e\xdd\xfc\xf0\x62\xc0\x26\x47\x0d\x36\xa9\xf3\x97\x6b\x99\xd4\xd3\xbc\x6a\xdf\xde\xdf\xe4\xff\xfb\xa6\xc8\x0f\xc5\xc7\xb7\x23\xfe\x75\x37\x69\xbf\xff\x2e\x3f\xed\x73\x36\xd6\x6c\xc2\xbd\x04\x2e\xe3\xef\xde\x8e\x87\x63\xfc\x50\x1d\x0e\x16\x17\xff\xeb\xae\xe6\x6d\x0b\x5a\xb7\xf5\x35\xbf\x9b\x80\xe6\xfd\xcb\x37\x16\xe0\x7f\x19\x00\x55\x6f\xb1\x33\xc0\xef\xde\xde\xa6\x06\x96\x50\x03\x75\xc3\x6d\x47\x7e\xcc\x1e\x20\x3f\xff\x5d\xc2\xee\xd7\xde\xed\x07\x59\xde\xee\x54\x55\xfc\xf3\x2d\x73\xc7\xcf\xe2\x81\x54\xa6\x3f\x99\xfc\x86\x5c\x35\x1f\x31\xcc\x4b\x9d\x7c\x6a\xd2\x84\x1f\x18\x31\x23\x9a\x24\x0d\x33\xad\x45\xf3\x0b\x7e\x5b\xf2\xcd\xdf\x66\xc9\x1b\x08\x78\x29\xd9\xd2\xe3\x03\xed\x1d\xa0\xfc\x5a\x57\x04\x50\x94\xa4\x0e\xd8\xa9\x38\x93\xc8\x66\xf1\xcc\x81\x4b\xcb\xea\x9a\x11\x70\xab\x28\x76\xbb\x3d\xbf\xcf\x4b\xa6\x8b\x04\xe8\x3a\xda\xba\xc3\xc8\xcf\x69\xe1\xbd\xa4\x29\x00\x0f\x0e\xe0\x0b\xcf\x3c\xe5\xc3\xe5\x11\xea\xfb\x74\x6d\x8a\x94\x84\x73\xc7\x22\x6f\xed\x90\x80\x73\x07\xf0\xc8\x00\x5b\x12\x6e\xe9\x22\x6c\x93\x9a\x04\x5b\x79\x60\x93\xfc\x74\x61\x8b\x20\x05\xbc\x76\x80\xf9\x99\x02\x12\x6c\xe3\x80\x1d\x8a\xf2\x44\x82\xb9\xbc\x6e\x8f\x13\x36\x9d\x5e\x08\xb1\xe4\x51\x1c\x21\x50\x12\x28\xf6\xf0\x15\x0d\xc9\x1b\xa4\x38\x15\xa1\xcf\x0c\xc8\x65\x74\x9d\x9f\xd8\xda\x4d\x02\x2e\x1c\xc0\x5f\xab\x8a\x9f\x79\x22\x21\x97\x3e\x64\x75\xa5\x49\x74\xe5\xc2\x96\x3d\x12\xca\x15\x48\x53\xbc\x9c\x13\x42\x5d\x19\xa0\x2b\x92\xb4\x7a\x21\xa1\x90\x44\xea\xa4\x21\x39\x3d\x73\xc5\x71\xac\x4e\x24\x63\x66\x31\xd6\x03\x1a\xcc\x95\x46\x5b\x04\xb0\x21\x79\x54\x09\x31\xd9\x19\x98\x2b\x0d\xbe\x1f\x2d\x19\xe8\x24\x29\x49\x3e\xcf\x96\x24\x38\x09\xea\x8a\xe4\x7a\x09\x02\xba\x52\x29\xce\xcc\xf5\x27\xe1\x36\x68\xcd\x4c\x3e\x4d\xd2\xa2\x4e\x03\x6c\xda\x22\x7d\xbc\xe4\x09\x39\xa4\x79\x84\x00\x0f\xcc\xdf\x22\xe5\x38\x77\x05\x24\x5e\x3c\x0f\xf0\x69\xee\x0a\x89\x1b\x2c\x12\xcc\x15\xd2\xa1\x4c\x48\x45\x9b\x2f\xf0\x22\x96\x5d\x8e\xcc\xc1\x22\x97\xd0\xb9\x2b\xa2\xf7\x3c\x15\x60\x1e\x9a\x11\xf3\x15\x05\xcc\xc5\x4a\x42\xaf\x29\xe8\xeb\x85\x84\x75\xa5\xf5\x8f\x9a\xbf\xf8\x4a\x02\xba\x82\xda\x27\x41\xc8\x05\x5a\xd6\x68\x66\x2d\x62\x0c\x45\xb2\x69\xe1\x4a\x68\x5f\xd1\xcb\xda\x62\xee\x81\x31\x2f\x9e\x06\x75\xa5\x74\xa9\xd9\xce\x9a\x84\x73\x05\x94\x26\xa7\xbc\x4e\x48\x40\x57\x38\xdc\xe3\x20\xc1\xd6\x88\xc4\x92\x9c\x66\x0b\x57\x20\x45\xcb\x5c\x1a\xd2\xb6\x2e\xd0\xb2\xc6\xb7\x8e\xca\x45\x22\xa0\x97\x91\x0f\x2d\xb7\x20\x14\xb0\x2b\x1b\x71\xa8\x50\x6e\xa1\x28\xe0\x19\x01\x2c\xcf\x25\x92\xe0\x73\x02\xbc\x0e\x92\xbd\x20\xa0\xff\x7e\x6d\xda\xe2\x40\xda\xf2\xe5\xd2\x9b\xfb\x24\xd8\x0a\xad\x65\x6c\xd3\xd2\x86\x47\x88\x57\x3e\x01\x1d\xa6\x19\x39\x0a\x6c\x17\xc3\x57\xff\xc9\xfb\x22\xcb\x09\xcf\x90\x35\x40\xee\x59\x91\xb6\xd7\x9a\x9c\x5a\x2b\x57\x8a\xa7\xe4\x32\xe1\x6a\x4e\x73\x7a\x85\x04\x93\x71\xbe\x91\x80\x73\x64\xaa\x68\x05\x5e\xb9\xb2\xc8\xb3\x82\x06\x43\x2e\xda\x31\x09\x8c\xc5\x95\x81\x38\x31\x4c\xc2\xb9\xdc\x0f\xf9\x2b\xab\x0d\x72\xf9\xf2\xcb\x84\x07\x7c\x3e\x24\x35\x39\xcf\x56\x5b\x24\x25\x66\x25\xba\xe0\xd7\x11\x5a\xff\x3a\x40\x63\xcf\x02\x92\x60\xae\x7c\x2e\x09\xf3\x3c\x49\xb8\x39\x1a\x59\x45\xae\xe4\xeb\x05\x5a\x86\xea\x20\x7d\x4b\x7f\xe8\x5d\xe0\xd8\x99\x66\x9c\xed\x02\x77\xe5\x95\xff\x9d\x1f\xce\xa5\xe0\x36\x58\xfe\xef\xeb\x2a\xbc\xcc\xac\xb7\x24\x78\x70\x16\x6e\x22\x6f\xeb\x26\x3c\x49\x12\x36\xf6\xb7\x66\x61\xe0\x19\xe1\x41\x87\xa1\xe7\xc8\x29\x0f\x43\xba\xf2\xfb\xc7\x35\x6f\xf8\x36\x3b\x0c\xbf\x44\xab\xd2\xa1\x0a\xc3\x22\x11\xa6\x75\x9e\x9f\x9b\x63\x45\x73\x6e\x4d\x0d\x30\xec\xc2\x6d\x36\x78\x88\x1d\xb0\xd8\x8b\x38\x77\x00\x6f\x5d\x11\x26\x75\x5d\x7d\x08\xea\xc7\x36\x26\x80\x83\xda\xb1\x9d\x11\xd0\xb4\x87\xb4\x9d\x13\xa0\x21\xd7\x6b\xbb\xf0\x17\xbf\x90\xf3\xb9\x5d\x22\x3e\xf3\xe0\xe7\xe4\x70\x2d\xc9\xbd\xce\x76\x45\x41\x37\xa7\x24\x00\x8e\x66\xe1\xc7\xb4\x4c\x4e\x49\x97\x42\xc5\x68\x53\xff\x52\x90\x8c\x8e\xd1\x9e\xbe\xcc\x13\xca\x65\x8d\xd1\x8e\xfe\x50\x90\x56\x20\x8e\x90\x51\xf9\x94\x8b\x80\x1a\x09\xba\xf4\x40\xd3\xb2\x22\xd7\xcc\x18\x05\x00\xd4\xd7\xd0\xf0\xd0\xd7\x78\xc5\x3e\xd3\x68\xd1\x9a\x95\x94\xf9\x39\x23\x43\x10\x31\x8a\x03\xd4\xc9\x39\xab\xa8\x80\x41\x8c\xa2\x00\x69\x75\x3a\xe5\xa4\x01\x8e\x51\x28\xe0\x94\xbc\x9c\x73\x1a\x70\x46\xae\x95\xa4\x7e\xc7\x28\x22\xa0\x81\x03\x1a\x1e\xa3\xb8\x40\x9d\xb7\x1f\xf2\x00\x15\xd8\x11\xa8\x2e\x17\x71\x79\x82\x8e\xed\xc4\x31\xf6\xa3\x4b\xf1\x39\x28\x24\x62\x14\x25\x50\xe0\x21\xe5\x41\xa1\x02\x35\x7d\xf4\xbd\x19\xb2\x05\xde\x99\x8a\x16\xf6\xda\x0f\xd5\x06\x87\x10\x32\xca\x42\xc6\x28\x82\xb0\x67\x33\x9e\xa1\x25\xc9\x46\x51\x84\x7d\x4e\xce\xf6\x18\x45\x11\x52\x3e\xac\x03\x1b\x58\x4b\x72\x0e\x05\x13\xda\xe3\xf5\xb4\x6f\x02\xda\x81\x22\x09\x0a\x36\xa4\x1c\x28\x98\x70\x64\x4a\x1f\x5c\x83\x63\x14\x50\x10\xc0\x81\xd5\x3d\x46\x41\x05\x01\x1b\x20\x78\xeb\x43\x86\xc8\x45\x31\x05\x69\x89\x7a\x4c\x47\x8c\xc2\x0b\x4e\xa3\x10\xf9\x28\xce\xe0\xb4\xa1\x87\x81\x42\x0e\x4e\x8b\xe0\x70\x5c\xb9\xbe\x94\xd5\x9e\x94\x3f\x0a\x3d\x7c\xa8\xf3\x33\x19\x95\x8d\x51\xd8\xa1\x4d\x9a\x5f\xa8\x4d\x7a\x8c\x02\x0e\xea\x36\x0f\x05\xe8\x8a\x71\x5f\x17\xf9\x21\x4d\xe8\xf9\x8d\x02\x0e\xdc\x2e\x4a\xbf\x85\x02\x46\x31\x87\x2c\x69\x8e\xfb\x8a\x76\x50\x63\x14\x79\xb8\x24\x97\x9c\x31\xb7\x20\xc5\x80\xc2\x0f\x22\x2e\x1d\x8c\x24\xc7\x28\x0a\x21\xbe\xf1\x52\x60\x28\x02\xc1\x63\x44\x24\x9c\x2b\x27\xfe\xd0\xd3\x85\x0c\xc1\xc6\x28\x04\x71\x6d\xe8\x81\xbb\xdc\x7f\xd9\xd3\x43\x76\xf9\xde\x54\xf4\x6a\x8d\x02\x0a\x1c\x6c\xb2\xff\x34\x11\x57\xb8\xf6\xb4\x41\x40\x61\x05\xdc\x24\xe0\x27\xc5\x28\xc0\xa0\x9b\xc9\x7b\x8b\x14\xfc\x3c\x0c\x1f\xec\x63\x41\x93\xd6\xb6\x75\xb1\xbf\xb6\x64\x08\x2f\x46\xc1\x06\xbf\x51\xb0\x37\x24\xae\xb3\xd8\xfc\xe6\xa4\xd0\x96\xd8\x91\xbb\xb0\x15\x8d\x04\xc4\xc1\x70\xf9\x4d\x37\xb8\x5a\xa0\xa8\x83\x81\xa7\xd7\x23\x14\x79\x28\xab\x17\xfa\x6b\x40\xbc\x8a\x71\xac\x94\x8c\xd2\xc6\x2b\x1c\x7a\x7d\x09\x7c\x34\x88\x51\x78\xe2\x9c\x7f\x98\x7c\x28\xce\xfc\xc4\x09\x05\x8c\xdd\x93\xb4\xa2\x57\x01\x1c\xa6\x48\xc8\xb0\x42\x8c\xa2\x14\x21\xf7\x02\x05\x29\x38\x36\xba\x57\x14\xdd\x3b\x5d\x02\xd3\x0b\x85\x27\x98\xd8\x03\x80\x28\x2e\xd1\xe4\xb4\x76\xac\xb1\x58\x98\x33\xf6\x69\x92\x91\x5f\x3d\x19\xf4\x8c\x82\x0e\x8e\x6a\x8d\xe3\xe3\x02\x3c\xf8\x6d\x29\xc6\xa1\x0a\x8b\x9e\x84\x5e\x52\xd0\x21\x49\xa0\x68\x05\xb3\x18\x59\xd1\x72\x9f\x93\xa6\xdc\x95\x9b\x38\x93\x70\xa0\x97\x15\x1c\xaf\xb8\xb6\x65\x5e\x93\x66\x00\x85\x2a\xf8\x77\x00\x1a\xe5\xc6\x73\xfd\x2f\xcc\xcd\x6c\x68\x26\xa3\x20\x05\xb3\x44\x41\xc3\x81\x42\x14\x02\x2e\xb4\x16\xa1\x00\x45\x5b\x7d\x08\xd0\x8a\x56\xc8\x36\x69\xc9\x45\x11\x85\x25\x9a\x2c\x18\xf7\x8c\x51\x54\xe2\xd8\x05\x8a\xe6\xd7\x75\xdf\x16\x8c\xff\x34\x05\x28\x12\x28\x0e\x7c\xf1\x4f\xfc\x01\xd4\xd8\xde\x5d\x85\xc7\x58\xee\x49\xd9\x6e\xb1\xd9\xe3\xd0\xcb\x49\x4c\xc2\x62\x7b\xc7\x61\x57\x01\x58\x6c\xe4\x38\xec\x3a\x00\x8b\x7c\xc3\xea\xf2\x49\x78\xab\x93\xc0\x27\x8f\x78\x8b\x17\xc5\x97\xa2\x69\xe5\x11\xb3\x70\x1b\xf4\xf9\x83\x1f\x43\xe8\xfa\x90\x18\xa3\x88\x83\x6c\x10\xfc\x9c\x18\x6f\x37\x68\xe6\xe5\xe2\xa5\xb5\x22\x30\xfb\xb6\xf8\x23\x2e\x03\xcf\xf2\xb4\xc8\xae\x15\x75\x8c\x22\x9f\x45\x5c\x50\x6c\xda\xe7\x6d\x57\x22\x95\xc8\x9e\x61\x72\x5e\x71\xbc\x7c\x0c\xe4\x54\x00\x4f\xdc\x2d\x74\xca\x84\x9d\x93\x87\x7c\x41\x66\x52\x80\xe9\xe0\x49\x88\x9b\x39\x68\x4c\xe5\xc7\x43\x87\x90\x51\xfa\x82\x08\x00\x9c\xf2\xf3\x35\x90\xf9\x4e\x9c\x88\x53\x27\xe1\x7e\x15\x9f\x31\x3e\xf2\x32\x9b\x05\x4f\x9c\xe8\x84\xc9\x3c\xed\x73\xc9\x2b\x9c\x2c\xd1\xa4\x19\x9f\xa9\x74\xd7\xe2\x3b\xab\x3e\xc5\xa3\x33\x96\xda\xbc\x10\x5d\xf7\x90\xe9\xbc\xc7\xa0\xd4\x49\x4c\x20\x72\x18\x0c\x48\x8c\x2c\xd3\x19\xf1\xc3\x84\x6e\x7b\x94\xbc\xa9\x13\x0c\x10\xcd\x77\x08\xfa\xfc\x20\x4f\x0a\xee\xb2\x7c\x2a\x1e\xc2\x15\x1a\xa0\x1f\xc3\x95\xac\x96\xf9\x0f\x1d\xd8\xd1\x34\x2b\xf8\x4a\x57\xeb\x1c\x89\xb1\xc9\x74\xf2\xb4\x15\xac\xc5\xe7\xe9\x88\xeb\x25\x32\x71\xba\x8b\xf8\xb9\x2c\x9e\x13\x3a\x77\x36\x3f\x31\x39\x12\x79\x51\xd9\x3e\x92\x47\xac\xaa\xf6\xd8\x7d\xcc\xca\xcb\x69\xcd\x73\x15\x50\xef\x4d\xf8\x24\xe8\x53\xb1\x44\x8d\x54\x5c\xea\x9c\xeb\xce\x5c\x38\xe3\x3f\x94\xbe\xa8\x27\xd8\x5c\xac\xfa\xd5\xb6\x04\x77\x67\x2a\x68\x6a\x6c\xb5\x73\x0a\x97\x2b\x25\x49\x1d\x99\x8a\xc3\x39\xbb\xed\x51\xa6\x8f\xfc\x12\xb4\xd9\xaa\x00\x75\x00\x00\x9f\x12\xee\xe8\x67\x28\x32\x72\x84\x9d\xe7\xbf\xe9\xfc\x23\x6a\xa7\x7f\xa9\xab\x97\x22\x7b\xfa\xd7\xff\xfe\x33\xaf\xfa\xab\x70\xa2\xaa\xfa\x34\xfd\x4b\x91\xd6\x55\x53\x1d\xda\xe9\x0b\x9f\xaa\x0c\xcf\xf7\xf9\x59\x50\xf2\xe3\x21\x29\x9b\xfc\xed\x8e\xca\xd3\xca\x3d\xbb\x67\xb4\xa0\xa1\x53\xa9\x02\x24\x09\xae\x7f\x6a\x1e\x9a\xf9\xb7\x33\xe7\x7d\x5d\x30\x0e\xa0\x1e\x4e\x56\x20\x68\xb6\x4a\xd7\xad\x6f\x46\x75\x9e\x5c\xc6\xb3\xc8\x15\x20\x67\x2b\xff\xc3\xae\xd8\x87\xe2\x63\x9e\xed\x1c\xa2\xf8\xfb\x09\x2a\x15\x90\xcc\x22\xa4\x17\xef\xed\x96\x0d\xc9\x2e\x3c\x98\x69\x81\x75\xe8\x7a\x19\x49\xc3\x38\x9e\x9e\x93\xf7\xfb\xa4\x9e\x88\x3e\x55\xbe\x21\x7b\xe1\x45\x41\x39\xaf\xbe\xa2\x97\x1c\xac\x09\x34\xa6\xf7\x8d\xed\xc4\xa1\xa6\xb7\x33\x97\x76\xde\x9b\x10\x9d\xc9\xd3\xe6\x3f\x47\xd4\x99\xd6\x49\xf5\x56\xcb\x93\xc5\x2e\x72\x42\x31\x3a\xc0\x43\x6a\x72\xb3\x87\xda\xe1\xf9\x76\xed\x37\x10\x07\x65\x49\x47\x24\x90\xcf\xcc\x20\x14\xa7\xe5\xa9\x0e\xd4\x31\x7a\xaf\x17\x6b\xc0\x31\x16\x78\x5b\x81\xc0\xe5\x55\xcb\x52\x70\x5d\x83\x6a\x84\xab\x65\x29\xbc\x84\x42\xb5\xf2\xea\x45\xf1\xb4\xa7\x99\xbe\xa2\xa3\x27\xc0\xcc\x1b\xe1\x10\x62\xe1\xba\x61\x00\xc5\xb5\x8c\x77\x88\xd7\xb6\xd0\x93\xf3\xc8\xfe\x4a\xb6\x02\x55\x64\x76\x33\x7d\x81\xa1\xad\x2a\xfe\x0e\x96\x5b\xbb\x44\xb5\x23\x4c\x82\x29\x07\x09\xfe\x5e\xb1\xe0\x15\x10\x50\x20\x58\x42\xa0\x7b\x76\xd0\x39\x6f\xa9\x6b\x82\x00\xab\xd9\xa2\xfd\x3d\x7c\xf2\xe8\xad\x2c\xb1\xef\xd5\xc8\x02\xec\xbb\xbe\x7d\x25\x2f\x31\x41\x19\x82\x67\x94\x50\xea\xbd\x30\xe4\x9d\x9d\xab\xf7\x88\xe5\xbe\x49\x53\x02\xbc\x7b\x54\xe3\xf5\x6c\x3b\xf2\xf9\xe0\x68\x35\xf6\xdc\x3d\x68\x44\x11\x1f\x29\x49\x90\x53\x81\xe9\x09\x68\x00\x06\x18\x20\x33\xb9\xaa\xf4\x88\x48\x61\x83\xcf\x83\x23\xae\xe0\x99\x4d\xb5\x40\xac\xf9\x42\xa2\x51\x3d\x81\x67\x93\x3c\xa5\xfa\x4c\x8e\x7b\x77\x42\xfd\xd5\x8c\xbe\x3b\x4a\x2e\x3c\xcf\x72\x8d\xc1\xa0\xce\xcd\xa5\x0d\x78\x3f\x42\x5a\xa0\x8d\x3f\x21\x27\xe5\x4b\x0f\x1a\xe1\x9e\xb8\x78\xe2\x99\x83\x28\x40\xf7\x6f\x91\x67\xae\x8b\x00\x7b\x49\xf1\x9e\x7b\x88\xda\x81\x21\xd6\x90\xf2\x05\x79\x37\xd2\x79\x58\x2a\x02\x91\x9f\x63\xde\xce\x32\xae\x4d\x07\x8e\x68\xa4\xb0\xdc\x42\x56\x28\x68\x9e\xc2\xce\xc4\x33\x92\x35\x72\x49\x41\xae\x52\xe7\xf5\x46\xfd\xd6\xa3\xbc\x66\x36\x00\xad\x45\x14\x04\xc7\xd6\x8e\xa8\x1d\x34\x8e\x6e\x3c\x41\xf3\x29\x5e\x09\xb1\x1b\x66\xdf\x32\x20\x8b\xdf\xbf\xe2\x75\x2c\x76\xd8\x7b\xe8\x30\x37\xaf\xa1\x05\x4a\x04\x3f\x06\xac\x6c\xd4\x6a\x14\x26\xa5\xcb\xfe\x74\xac\x6f\x80\x18\x7f\x25\x1d\xb2\xf6\x51\x52\xfa\x02\x56\x85\x44\xdb\xc5\xee\x0e\x7b\xf3\x00\xae\x47\x2c\xd1\x5d\xf2\xf2\x8c\x92\xcf\xb3\xa0\x99\x7a\x50\x50\xf2\x94\x74\x91\xdb\xa7\xfe\xc4\x0b\x83\x70\x81\x90\x4f\x0e\xb2\x2a\xfe\xe5\x4d\x6e\x3c\xed\x25\x6c\xf1\x35\xf0\xa9\xc9\x2f\x49\x9d\xb4\x39\x89\xd9\x5b\xcd\xdc\x1a\xc7\x29\x11\x8b\x93\x43\xc9\x24\xcd\xcb\x52\x93\xf3\x6d\xb8\x03\xe0\x54\xc3\x5b\xb3\x3f\x65\x49\x9b\x28\x81\xa9\xfb\xb5\xcd\xcf\xa2\xc1\xb3\x9f\xf8\x79\x18\xb0\x4d\xfe\xec\xde\x8f\x85\x5e\x71\x78\x57\x27\xd9\x1b\x66\x20\xc0\xf2\x53\xca\x6f\xd6\xfd\xe1\x47\x06\x35\x71\x32\x4d\xf7\xdd\x57\x06\x38\xf0\x33\x29\x1e\x5d\x66\x93\x04\x43\xba\xc1\xc7\x7d\x5d\xe4\xe2\x86\x39\xc4\x3f\xf6\x6a\xbd\x9c\xf0\xdd\x20\x9c\xd5\x42\x84\x5f\xf5\x01\x9b\x00\xf1\x01\x18\x7f\x08\x03\x00\xc9\x81\xf4\xbd\x94\x13\xa0\x2b\x08\xe5\x53\x36\x08\x54\xd3\x16\x7a\x96\xa7\x93\x3d\x1d\xd0\x21\x46\x0d\x6c\x82\x59\x06\x9f\x34\xb2\x19\x07\xc2\xea\xc6\x6b\x7b\xd4\x0d\x83\xe0\x2e\xbf\xc6\x63\x4f\x01\xd2\x03\x30\x83\x94\x6d\xd0\x30\xfa\x5e\x95\x0a\xd0\x15\x84\x1a\xa8\x6c\x21\xda\xba\x75\x21\xc0\x9e\x0e\xe8\x3b\x95\xad\x8f\x65\xbe\xb2\x11\xea\x23\xec\x58\x78\x71\xf5\xed\x16\x81\x71\x80\x1b\xe4\x75\x7a\x6f\x1b\xf4\x7c\xc8\x23\xce\x6d\x3f\x27\xb4\x95\xfd\x96\xca\xff\x1e\x08\x57\xfa\x2f\x84\xf4\x25\x8a\xef\xbe\xe3\x0f\xde\x51\xf5\xd3\xdd\xd3\x4f\x49\x0e\x7c\x43\x95\xa0\xd5\xbe\xb9\xd6\xb7\x42\x10\x59\x48\x42\xd8\xca\x97\xfe\xf4\x2c\x44\x36\x16\x0f\x1d\xf5\x8c\x45\x27\x10\x7e\x90\x58\x46\xee\x3b\x7c\x07\xf7\xc5\x73\x5f\xaf\x83\xd5\xc8\x61\x55\xee\x60\x1f\x04\xd8\x6f\xf6\x00\x23\xb7\xdc\x87\xc6\x41\x9e\x61\x31\xc0\x5e\x3c\x70\x5b\x13\xda\xc4\xdc\x1d\xa5\xea\xe4\xab\xf7\x94\x79\x58\x58\x70\xcf\xe3\xe3\x0c\xd5\x12\xa3\x1c\xc8\x86\x01\xb0\xbd\x72\xf2\x02\x85\x44\xcc\x74\x98\xda\x04\xf6\x4d\x0f\x86\xf4\xba\xf8\x87\x5f\xf0\xc7\x8b\x24\xf1\xe1\xc5\x4c\xee\x88\xfc\x50\x4e\x5a\x29\xe2\xb0\x07\x05\x27\x22\x21\xc4\x27\x04\x0a\x56\x7f\xc7\x21\xeb\xd4\x07\x12\xb2\xce\xff\xba\xf2\xa5\x66\xfb\x2b\x7a\xc8\x85\x20\xfd\x41\xf5\x24\x78\x72\x4e\xde\x7b\xef\x16\xa1\x8d\x15\x3a\xac\x22\xda\x3c\x97\x45\xc7\xee\x4e\x7d\x79\x96\x70\xcf\x49\x1f\x24\xda\xda\x2c\x15\x5d\xce\xf1\x08\xf3\xf7\x3d\x1f\xe5\xb9\xa9\xd3\xa8\xc0\x87\x7d\xe7\x7c\x80\x57\xeb\xf6\xd8\x75\xb8\x80\x3e\xfc\xd0\x79\x34\x80\xfa\x86\xcf\x3a\x1a\xa9\xaf\xf4\x63\xf8\x07\x20\xc4\x14\xa9\x37\xd0\x3a\x6c\x3a\x3e\x67\x21\x5a\xb3\xff\x4c\xbe\xdc\x39\x1a\x2d\x8b\xe7\xe2\xf4\xf2\x6a\x03\xa7\x46\x39\x26\xcc\xf5\x6b\xdc\x55\x06\x7a\x1a\x59\x96\x59\x30\xae\x48\xfe\x93\xc8\xaa\x91\x51\x51\x0d\xca\x64\xe7\x4c\x8e\x8e\x23\x04\x9d\x6f\xf5\x78\x8e\xce\x68\x21\x4f\x66\xa1\xde\xa4\x08\x5e\x71\xea\xd0\x7c\x24\xff\x83\x47\x02\xce\xd7\x50\xa5\x40\xa0\x7e\x9d\xa3\x5c\x1d\x4f\xe2\x7b\x8e\x1b\x23\x02\x85\xd9\x82\x6a\xa7\x9e\xac\xb0\x34\x8b\x5f\x6c\xf0\x0b\x04\x3c\x5c\xe9\x45\xa1\x26\x56\x7c\xae\xf4\x3d\x28\x26\x39\xdf\x37\x75\xa5\xbd\x84\xc2\x46\x08\xfa\xcf\x3e\xd8\x83\x1b\x9d\xe7\x1c\x02\x63\xe8\x0c\xb6\x75\x0d\x0a\x07\x86\x06\x41\xdb\xa3\x2a\x9e\xbf\x1d\x1a\xbf\xaf\x59\x21\x08\xac\x65\x41\x38\xf8\x9e\x22\x9e\x9f\x0f\xf0\x90\x0d\xaf\x6b\xca\x0f\x99\x73\xbf\xf1\xa0\xdd\xf9\x22\x52\x8d\x4a\x5a\x2e\x45\x59\xa2\x95\xc9\xad\xb0\x63\xc5\xb2\xd3\x10\xef\x58\x6b\x74\x4a\xd6\x05\x40\x83\xf3\x8a\xe1\x88\xfc\x4a\xef\x1c\x5e\xf8\xa0\x1d\x47\xd0\xb4\x09\xbf\x33\x43\xcd\x56\x5b\x05\x48\x16\x6f\x3f\xfb\xdf\x8d\x42\xab\xc5\xad\x7f\x51\x78\x74\x2d\xf8\x1a\x4b\xc0\x7d\x33\x7f\xf0\x84\x07\xac\x09\xae\x9e\x8f\x2f\x08\xdd\xf3\x62\xc8\x9c\xf8\x0a\x8b\xc0\x97\x5e\x00\x7e\x83\x41\x92\x93\x9e\xb5\x9c\xa8\x53\x79\xcf\xe2\x8f\x4b\x72\xc6\x89\x3f\x1d\x18\xe5\xfd\xfb\x0e\xaf\x20\x02\x6b\x28\xfe\x1c\xfb\xc8\xc7\x2a\x79\xe8\x8e\x70\xa5\xc1\xab\x91\xcb\xc8\x7b\xb3\x55\x1c\xba\xec\xf2\x85\x7a\x8f\x05\x12\x2b\x5d\xff\x51\x42\x75\x18\x14\xac\x9f\xe6\xd8\xa0\xc9\xab\xca\x3d\x47\xf3\x52\x3c\x27\x53\x7b\xa0\x93\x8f\x4f\xef\x8b\xa6\xe0\x5f\x88\xd0\x01\x8c\x25\x38\x93\x21\x4f\x69\x2c\x1d\x76\x06\xdd\x3d\xf2\x69\xdf\x48\x1e\xae\x98\x2d\x97\x63\xfd\xff\x69\x6c\xdf\xd1\x33\xe4\x34\x69\xcd\x68\xe6\x1b\x94\xb6\xba\xa6\x47\x6f\x24\x22\x71\xac\x06\xfe\x34\x60\x05\x72\xd8\x00\x5e\xa9\x45\xa7\x47\xd1\x29\x0d\xdc\xab\x97\xa0\x56\x68\xe1\xef\xe5\x3d\xb9\x84\x0d\x1b\x04\x75\x41\xa9\x3d\x97\xaf\xb6\x7b\xc6\xf1\x57\x4c\xb7\xb0\x7d\x23\x55\x0d\x6e\xee\x71\x55\x46\xfe\x08\x37\x34\x27\x5a\xe5\x93\xa3\xdd\x30\xee\xa9\x57\xcc\xaf\x9e\xcf\x7e\x37\xf1\x26\x69\xc2\x36\x05\xf5\xb3\xab\x8d\x63\x5b\x33\x39\x94\xd7\x22\x0b\xd7\x3f\xfb\xb4\x85\xda\x02\x75\xc6\xcf\xaf\xee\xbc\x37\x5a\x3b\xd4\xe2\xff\x06\xaa\x23\x64\xf0\x6f\xbe\xd4\x5e\x9d\xcb\x30\xe8\x30\x8f\x98\x56\xfd\xaa\x0f\xb0\xe1\x88\xbb\xaf\x4a\xa4\x56\xe0\x23\xe0\xce\xe9\x6d\x78\x61\x67\x1e\xf5\x93\xd3\xd3\x55\x3f\x89\xaf\xce\x71\x6f\x97\x19\x01\x94\x6a\xea\xe1\xc8\x8b\x83\x22\x06\xd6\x91\xa3\xd8\xf3\xbc\x28\x70\xb3\x6c\xc2\x26\xcb\xee\x8f\xc1\xc2\x06\x00\x13\xe1\x62\x04\x16\xd4\x96\x85\xa3\x2c\xbd\xfc\x7c\xb6\x4a\x37\x72\x90\x8e\x7d\x00\xa9\x95\x2e\x98\xff\xb2\xb1\x65\xb9\x3e\xa8\x17\x38\xc7\x2d\xd4\xc0\x7d\x07\x19\x9a\x0c\x11\xe8\x88\x81\x8d\xe4\x72\xdb\x78\x26\x73\x43\xdd\xc0\xea\xbf\xdf\x71\x5f\xc0\x01\x0d\xc9\x3f\x6c\xed\x54\x8f\xa6\x2a\x05\x14\xbe\x5f\x21\x05\x30\x9b\x59\x01\xfb\x5f\x5e\x62\xaf\x37\x8b\xee\x9d\x45\x0c\x78\xb2\x18\x32\x8b\x95\x2c\x1c\x27\xc9\xf4\x63\xc3\x8a\x4f\xeb\x29\xff\x40\x34\x31\x61\x3d\x55\xad\x22\x83\xe0\xe9\xe9\x18\x7c\x76\x76\x9e\x9c\xc7\xba\x6c\x69\x33\xb1\xa7\xf5\x6a\x0d\x69\x33\x21\x33\xec\x89\x19\xcd\x91\x6b\x90\x7f\x18\x50\xd8\x61\xe7\xa1\xef\x6e\x55\x90\x42\x0f\x5b\xeb\x10\x25\x62\xf8\xe3\x3e\xa8\x91\x77\xbd\xc6\xf9\xe8\xa6\x8f\x60\xce\x10\x6f\xc3\x3d\xbe\x7a\xbc\x1c\xd4\x0c\xad\x11\xdd\xb0\x5e\x8c\x12\xbc\xf7\xd2\xaf\x56\x5c\x73\xbc\x80\x20\x98\x10\x52\x75\xf0\xce\x3c\xac\x54\x4b\x42\xa9\x10\xbb\x9c\x0b\x2d\xf0\xab\x06\xf1\xa2\x7a\xff\x00\xc4\x0d\x18\x4b\x1e\xe1\x4d\xc9\x1b\x57\x60\xc9\x02\x30\xd6\x60\x54\xf5\x69\xd0\x23\xef\x7e\xf4\x7c\x88\x43\x4c\xef\xd3\x7a\x5e\x31\xe9\x77\x9e\xc7\x9d\x9e\xf5\x17\x44\xd5\xb7\x82\x0f\x30\xfb\x8c\xc1\xce\x8b\xfa\xe4\x8d\x23\x6c\xa1\x03\x9f\xf4\x7d\x9c\xf8\x38\x04\x71\xa1\x5a\xac\x35\x43\x10\x82\x8f\x3b\xee\x01\x11\x1c\x83\xb1\x4d\x14\x80\x7a\x98\xff\x91\x51\x88\xef\xe7\x63\x84\x55\x7d\x2e\xef\xe4\x95\x5c\x36\x7b\x3e\x2a\x0d\xa6\x80\xfa\xa4\x4f\xd2\x44\x7f\xd6\x07\x0b\xbc\x1f\xcc\xb2\x48\x8e\x49\x33\x39\xe4\x79\xc6\x57\x2d\x57\x80\xa6\x58\x7a\x79\xb7\x7e\xe3\xe3\x29\x96\x1f\xda\x1a\xa6\x9d\xfe\xd6\x10\x7b\xe8\x3b\xe4\xbe\xc3\x95\x2f\xf2\x77\x7a\x83\x2f\x04\x00\x22\xee\x5a\x1c\xd1\x52\x1c\x0e\x83\x74\x7c\xfd\xef\x8d\x81\xd0\xfb\x43\xba\xcb\xc7\x0f\x27\x6b\x97\xd4\x7e\x49\x0e\xaf\x35\x00\x58\x7c\x6c\x6d\x4e\xb0\x4d\xec\x47\x65\xe2\x88\x68\xf5\xb1\x71\x5a\x2d\xfc\x56\x8e\xdf\xc8\x7c\x73\x07\x7e\xe9\xc3\x77\xef\x38\x21\x22\xff\x13\x9c\x0d\xaf\x78\xfe\xb4\x43\xc3\x30\xfd\x00\xdb\x26\xe2\x45\x7d\x1d\x8b\xdb\xf0\x1f\xfc\x50\xdf\x9a\xff\xe0\xd6\x68\xcb\xa0\x60\xd7\xeb\x1e\x40\xe4\xc7\xd0\x30\xee\x97\x38\xf1\xd1\xb3\xe7\x39\xac\x00\x3a\xc1\xd9\x01\xa4\x19\xc7\xe5\x0e\xd8\x9e\x91\x9c\xdd\xcf\xe5\x20\x2b\xc1\x43\x23\xe1\xe8\xdc\x80\x6c\x2f\xd4\x00\x02\xef\xfa\xf8\xd9\xa3\x07\x02\x1f\x4c\x22\x30\x0c\x6e\x08\x95\xa1\x13\x00\xe2\xc4\xdc\x43\x7a\xe1\x5c\x9c\xd0\x2f\xe0\xa9\x6f\xc9\xe1\x06\x3d\xb4\x3a\x1b\x49\xe2\x5d\xbe\x5e\xfc\x60\x93\xe9\x37\xdf\x6c\x36\xc1\xe6\x5e\x00\x0f\x03\x08\x63\x76\xd7\xb4\x16\x8c\x07\x67\x22\x7a\x60\x86\x88\xb1\xef\x04\x85\x20\x08\x9c\xa5\xec\x37\xf4\x44\x37\x1d\x3b\xaf\x61\x93\x7b\xf0\x1e\xec\xbe\xb6\x5f\x6c\x19\xa0\xfb\x18\xb4\x36\xf4\x34\x7d\x74\x7c\x5f\x78\x15\x09\x74\x32\x6c\x69\xe9\x6d\xfc\xf0\x20\x1f\x5e\x84\x82\x63\x85\x0f\x6a\x76\x29\xa5\x7d\xba\x11\xe8\x8f\x81\x2e\xce\xac\xa2\xa1\x1e\x02\x9d\xcd\x66\xc8\x94\x47\x1b\xfe\x83\x9b\xd2\xa6\x5c\x9f\xcd\x0a\x02\x22\x4e\xd2\x30\xfd\x9f\xc9\x29\xb5\xc7\xb8\xa0\x1d\xef\xa2\x0b\xdb\xf1\x21\xb0\x3d\xc3\xa0\xed\xf8\xc3\x23\xa1\xed\x78\x27\xd4\x00\x02\xef\x3a\x96\xd0\xa3\x04\x21\x3b\xde\x03\x37\x84\xca\xd0\x14\x5a\x2c\x16\x0f\xea\x05\x65\xc7\x89\xc9\xd1\x6d\xc7\x03\x40\x21\x3b\xd5\x8f\xbf\xd3\x8e\x8b\xf7\x74\x03\xcd\x3d\x3b\x8e\x01\x08\x3b\x1e\x47\xfc\xa7\x5b\x9c\xc8\x8e\x77\xc0\x0c\x11\x63\x8f\x1d\x97\xfa\xb5\x03\xc3\xed\xb5\xe3\x44\x37\xa1\x55\x18\x45\x63\xef\x5a\xdf\x42\x68\x6d\x8a\xb3\x47\x66\x4b\xbf\xc7\xd1\xb3\x0c\x0d\xf6\x38\xee\x6b\xfb\xc5\x16\xac\xa1\x1e\xc7\xfd\x4d\x1f\x1d\xdf\x17\x5e\xef\x86\x7b\x1c\x8f\x34\x7e\x78\x90\x0f\x2f\x97\xc1\xb1\x42\x8f\xa3\x4b\x29\x7d\x8f\x43\xbe\x02\x5e\xb3\x49\x97\xd6\xd7\xd3\xde\x7c\x05\xd9\xe8\x88\x37\x71\xe8\x05\xe7\x58\x0c\x25\xc9\xa3\xbe\xcd\xd9\xae\xe0\x11\x31\x18\xec\x44\x30\xef\xca\xc2\x4b\xac\xf9\xc3\xdf\xa2\x28\x89\xde\x98\xf8\xbc\x48\x76\xb1\xb3\x7e\x9b\x83\x42\x9f\x28\x82\xec\xb9\x24\x6c\x4c\xe2\xcb\x2b\x1d\x6f\x45\x21\x55\x9d\x63\x32\x82\x49\x39\xe0\xa8\x2c\x3e\x7f\x54\xa8\x96\x2b\x9d\x5b\xc0\xa4\xdb\x9d\x40\x6b\xe7\x5d\x62\x0b\x9c\xcc\xee\x4a\x68\xa8\x5e\x76\xbf\xe7\xec\xb3\x7f\xa7\xc1\x21\xdc\xb9\x64\x81\x47\xe5\x54\x8a\x11\xba\xe1\xd5\xc1\xc9\x21\x50\x15\xa6\x01\xdc\xc6\xf0\x48\x00\x75\x82\x82\x8e\x90\x65\x57\x46\x0a\xbf\x57\x3b\xf7\x7d\x49\xd2\x35\x89\xbe\xf1\x42\x34\xa0\x9e\x8f\x1f\x72\x0f\x41\xc4\x1d\x00\x3e\xb0\x70\x13\xa5\xbc\x2b\xb2\x82\x1a\x0b\x6c\xd4\x51\x4d\x8d\xca\x69\x2a\x87\x66\x53\x00\x0c\x38\x56\x4b\x5e\xb6\xf0\x8e\xd9\xc3\x0e\xcd\x72\xea\x0f\xd1\xa9\xa2\x06\xe2\x02\x10\xa3\x81\xb6\x82\x2e\xef\x44\x4b\x5c\x6d\xe9\x9a\x81\x40\xb4\xe4\x85\x16\xdb\x07\xbf\xdd\x8e\x17\x13\x55\x26\xd7\x93\x9e\x4b\x9f\x3e\xae\xf0\x74\x26\xea\x89\xf9\x04\x27\xea\x2a\x3c\x87\x57\x64\xdf\xa1\x69\xec\x57\xf7\xcd\xe4\x55\xc7\x4c\xc6\x7d\x37\x27\x9f\x87\xb2\xcc\xe1\x61\xe0\x1a\xae\x8f\xaa\x83\x85\x7e\x7d\x0f\x0b\xe7\x61\x16\xce\xc9\xbe\x83\x2c\xf4\xaa\xfb\x58\x38\xef\x60\xa1\xee\xdb\x1e\x98\xa0\x8d\x24\xf6\x11\xbc\x63\xe9\x0a\xcb\x88\xb6\x97\xa2\x42\x8d\x43\xfe\x2e\x88\xee\x32\xd6\x52\x4c\xf7\x24\x79\xf6\x8f\x4e\xcb\x6f\x30\xb6\x7f\x30\xb7\x75\xc9\xfd\xb7\xe4\x64\xe3\xe9\x99\x35\xb1\x23\x92\x7f\x8a\x41\x81\xe3\x0a\x06\xf8\x52\xe7\xef\x8b\xea\xda\x80\x06\xa6\x08\x34\x92\xa7\x34\x14\x00\x5a\xaa\xdc\x22\x77\x24\xde\x02\xe5\x57\x88\x5e\x7a\x97\x2d\x6a\x91\x92\x1f\xc6\x5d\x51\x19\x21\x4d\x67\xf9\x69\x34\x5d\xf1\xff\xcc\xf3\x13\x98\x51\xeb\xe5\xb7\xce\x65\xfc\x75\xe8\x32\xbe\xc9\x8d\xec\x5c\x72\xe8\xcf\x11\xb0\x4f\x9a\x5c\x90\xe2\x8a\x7c\x3a\x5b\xe6\x27\x45\xf4\x4f\xc7\x3a\x3f\xfc\xac\x59\x05\x8b\x86\x65\x67\x56\xdc\xb8\x54\x85\xd4\x70\x81\xe1\x49\x3c\xd4\x83\x8e\xbc\x8b\xbc\x70\x92\x51\xbe\xe7\xa7\x4f\xb3\x2b\x04\x1d\xdf\xf5\x84\x33\xeb\x00\x11\x43\x40\x55\x81\xed\xfd\x4b\x9d\x7c\xd2\xb8\x2e\x75\xc1\x66\xf3\x27\xa2\x43\x7d\xf5\xc5\x81\xa3\xfa\x74\xab\x82\x21\x97\x68\x1d\x27\x66\x08\xcd\x35\x4d\xf3\x86\x82\x5b\xa6\xfb\xcd\x32\x45\x70\x54\xb7\x6e\x55\xa8\xdb\xc5\x62\x9b\x2d\x16\x1a\x1d\x7f\xb3\x92\xea\x73\x9f\x46\x59\x0e\x81\xa8\x0e\x41\x79\x70\x90\xf1\x3e\xca\x96\x1a\x91\x7a\x04\x90\x0a\x20\x45\x49\xb6\xc8\x11\x1c\xd5\xa7\x5b\x15\xfc\xec\x92\x6e\xd7\xf1\xc1\xa8\x47\x72\x7e\x21\xe3\x20\xd9\x76\x39\x5f\x20\x30\x52\x89\x60\x4d\xa8\xcf\x74\x3b\x8f\x66\x7c\xfb\x95\x64\x2f\x79\xe0\x28\x8b\xcd\xe6\x0f\x93\xe1\xf0\xa4\x8c\x6b\x3f\xd3\x05\x5e\x11\xc0\x0c\x74\x17\x87\xd0\x64\x27\xd6\x85\x21\x99\x3c\xc4\x8a\xe7\x9a\x06\x71\xb0\x40\x0c\x2c\x3c\xa3\xe5\xb8\xbb\x66\xb4\x3c\x8e\xa0\x21\x9d\xd3\x24\xc2\x34\x71\x03\x94\xa8\x6e\x24\xff\xf5\x5f\x0f\x2d\x41\xc9\x54\x18\x62\x79\x7b\x9d\x71\xe2\xa4\xdd\x73\x89\x14\x5e\x82\x33\x4e\xbd\xaa\x7b\x1d\xb0\x71\xc4\x77\xf7\x74\x53\xb8\xd7\x13\x1e\xc3\xdf\xd9\x4e\xbc\x6a\x6b\x90\x90\x65\xee\x9f\xdd\x10\x45\x12\x79\x71\x3e\xe6\x75\xd1\x86\x4c\xaa\x41\x37\x3a\xc6\x63\xf0\xd7\xf4\x18\xbf\x3a\x08\x20\x28\x3e\x2e\x84\x0e\x77\xcf\x62\xa4\x6f\xb3\x28\xba\xc1\x13\xd7\x76\x0c\x44\xc2\x14\x40\x83\x69\xf2\x8a\x52\x5f\xaa\x70\xa9\x7c\x3f\x6e\x94\x9c\x33\xea\xec\x88\xc7\x29\x79\x6e\x78\xe3\x1f\xb6\x5c\x08\x37\x9e\x24\xd0\x71\xcd\xe0\xa3\x19\xea\xd0\xc8\x2a\x72\x69\xf6\xb9\x68\xf9\xb2\x9a\x8b\xf3\x47\xe2\xcd\xc5\x73\x52\x94\x81\x3c\xf4\xfe\xa1\x9a\x19\x3e\x61\x0c\xef\x90\x3f\xec\xa2\xc1\x67\x36\x44\x6c\x4c\x3d\x31\x52\x96\xa3\xe9\xac\x19\xe5\x6c\xe2\xb3\x45\x99\xbf\xe2\xb5\xeb\xae\x06\x43\xe2\xd7\xed\xc7\xf6\xcf\x91\xbe\x7f\x6f\x95\x18\x1e\x5e\x06\xc9\xd7\x13\xdb\xc8\xcc\x56\x5b\x22\x3d\x2b\x50\xa2\x43\x51\x74\x3e\x01\xdb\xff\x34\x4d\x2e\x22\x38\x05\x8e\xd7\xef\xe0\x57\x8a\xa4\x64\xcb\xdd\xab\x73\x4b\xe1\xce\xcb\x69\x54\x14\x4b\x60\x1d\x1d\x17\xee\x71\x32\x34\x9f\x24\x90\xfc\x47\xc6\x1d\xd1\x1a\xad\x40\x9e\x2f\x63\xf5\xcb\xd5\x3b\x25\x69\x40\xde\x39\x09\x55\x97\x86\x08\xfe\x24\xd8\xa9\x68\x84\x2b\xfa\xea\xaa\xee\x9c\x86\x62\x3c\xe3\x4f\xb4\x86\xd6\x5e\x6e\x4b\xd4\x79\x3a\x31\xcf\xa9\x41\x75\xf8\x1f\xd9\xe1\x10\x65\xf8\xfc\x54\xb6\xca\xb7\xe9\xca\xc8\x25\x5d\xaf\xe6\x19\x42\x35\x3a\xd6\x30\x7f\xa6\xb1\x92\xf9\x6c\x3f\xc7\xa0\x90\xa5\x3a\x18\xb4\x5f\x2e\xb8\x39\x95\x35\x01\x3f\x25\xdb\xe6\xd9\x61\x8d\x68\xdb\xa7\xf9\xe6\x60\x5c\xe6\x79\xbc\x8e\x36\x07\x88\x87\x26\x2c\x59\xe5\x71\xee\xf4\x47\x52\xb5\x58\xce\x56\x5b\x0d\xd5\xe1\xcf\xa4\x87\x4d\x3e\x47\x84\x1d\x92\x7c\x9f\xa6\x9a\xb0\x4d\xb2\xca\xe6\x7b\x84\x8a\xa6\xed\xb0\xce\xe3\xfd\x12\x83\x12\xe4\xad\x56\xcb\xd8\x32\x2d\xe8\xf7\x1c\x66\x59\x9e\xe1\x90\x1a\xa7\x2d\x33\x6c\x4b\xb6\x8b\xc5\x62\xe6\x62\xa2\x89\xcb\x17\xfb\x6d\x1a\x21\x48\x82\xb6\xcd\x62\xce\xbc\xad\xdb\x1f\xf5\x02\xf6\x4b\xfe\xe9\x50\x27\xa7\xbc\x19\xf1\xc7\x4b\xf8\xab\x6b\xfc\xe3\x22\xdb\x37\xd7\xc5\x25\x6f\x5e\x0f\x35\xbf\xd2\x64\x49\x37\xca\xbd\x10\x9b\xec\x5b\x5b\x91\xb5\xfc\x6a\xd3\xed\x8f\x5f\x11\xf7\x54\x63\x7c\xc5\xa9\x4d\xe0\xbd\x28\x6a\x45\x1a\xfc\xa5\xa0\xef\x90\xbc\xf7\x50\x52\xf0\x0c\xbc\x0f\x69\xe9\x17\x9f\x72\xbd\xbc\xa4\xe6\x39\x2e\x91\xaf\xa3\x23\x3b\xe3\xcc\x3a\x2c\x81\x6d\x69\x30\xca\xd9\x31\xbc\x09\x38\x9c\xef\xbc\x36\x35\x14\x92\x30\x8f\x62\x60\x6c\xdf\x2d\x2d\xe0\x2e\x58\x03\x58\x23\x15\x25\x1b\xb9\xcc\xf2\x2e\x9f\xe8\xce\x38\x5f\x98\x7a\x99\x27\x76\x16\xcb\x2c\x7f\x19\x13\x37\x0c\x96\x6f\x47\xb3\xe5\xb7\x63\x60\x8b\xbc\xbf\x97\xd1\xb7\x81\x96\xe1\x9a\x35\xc2\x81\xfe\x7e\xeb\xdf\x2d\xfb\x7f\x89\x62\xa1\x7f\x62\x66\x2e\x84\xeb\xa6\x65\xa2\x3c\x0a\x24\x24\x2d\x93\xe4\x5c\xc8\xd7\xf6\x9f\xa8\x25\x60\xc4\xfc\x21\xc9\x83\x11\x5b\xea\x8b\x33\xdb\x1e\xec\xee\x6e\xe1\xce\xa5\x01\x5b\xf8\x6e\xfd\xa2\x10\xfc\x53\xcf\xbe\x2e\xc5\x48\x84\x3d\xe1\x90\x1e\xf9\xe1\xd6\xff\x14\xde\x6f\x2a\xbc\xfe\xe8\x52\x8f\xfc\x08\x04\xff\x14\xe1\x6f\x2a\xc2\xde\x48\x5d\x8f\x04\xfd\xf6\xff\x14\xe0\xd7\x16\xa0\x08\xec\x8c\xe5\x3f\xcc\xa5\xcb\x3e\x79\x8e\xf1\xaf\x15\x8f\x38\xb9\x90\x23\xf9\x0f\xbe\x6b\xa4\x80\xa8\x07\xa8\x54\x0e\x5d\xd9\x4f\xb5\xff\x7b\x9e\xb6\x38\x53\x8e\xac\xe3\xa7\xe8\xf8\x34\xd6\x97\x7c\x47\xd1\xc8\x62\x7e\x96\xaf\xf5\x89\xeb\xb4\xee\x15\xa4\x08\xc3\xc8\x0b\xb5\xce\xc5\x25\x0b\x33\xe1\xb1\x45\xfc\x19\xd0\xcb\x69\x69\x03\x90\xaf\xc4\x8e\xc0\x6d\x7d\xc3\xe1\xca\xfb\x13\x5c\x12\x89\x0e\xef\x89\x36\x79\x14\x0c\x7a\x0b\xa3\xef\xcc\x0a\xc6\xe9\x5f\xe6\xc2\x89\x2a\x7a\x0e\xa9\xd0\xe7\x66\xbc\x8e\x74\x3c\xd6\xf9\xc4\x48\xc3\xbc\x73\x43\xb7\x52\x21\x64\x34\x1a\xcb\x04\xdc\xe4\xf0\x2a\x47\xb8\xc0\xa8\x22\x88\x5f\x79\xad\x4c\xf0\xcc\x63\xfe\x3d\x5f\x5b\xd5\xd3\xac\xa1\x98\xb7\x8f\x5e\x55\x84\x7a\xd7\xd5\x5f\xea\x14\x4b\x90\xb2\x20\xd3\x7a\x48\x7e\xa0\x9d\x18\x4b\x9f\x90\x74\x5c\x6c\x38\xbd\x5c\x42\x77\x13\xdb\xdd\x28\x40\x29\xbc\x32\x90\xc7\x3c\xf4\xe5\x69\xb4\xd9\x44\x38\xa1\x39\x42\x56\x32\xac\xe7\x0f\x93\x46\x10\x86\x7b\x98\x9f\x1a\x41\x48\x03\x4d\xbd\x7b\xcb\x28\x38\x9e\x88\x47\x24\xc3\xdd\x04\x27\x02\x02\xe8\x23\xc7\x9d\x18\x9d\xd3\x41\xd3\xea\x9e\xe4\x57\xb1\x52\x8c\x5e\x6c\x1e\x9c\x98\x25\x35\x48\x11\xef\x24\x06\xe9\xb7\x0e\x00\x3d\x2e\x2e\xde\x3a\xc8\x1c\x51\xe9\x0a\x2a\x34\x86\x74\x91\xcf\x0f\xc4\x3a\x28\x70\x84\xa5\x04\x6a\x3b\xa9\xb8\x47\x3e\x8a\x44\x57\x3e\x2a\x5e\x8c\x71\xeb\xcd\x81\x13\xbd\xa5\x16\x62\x11\xf9\x25\x86\x47\x22\x08\xc3\x3d\x2e\x28\x85\x20\xc8\x25\x5d\xef\x70\x28\x3c\x9e\xe4\x30\x4b\xd3\x70\x37\x61\x89\xb9\x00\x7d\xe4\xdc\x21\x37\x4d\xab\x23\x37\x1d\x4e\xc7\xe8\xd5\x96\xc0\x09\x6b\x53\xc3\x14\x21\x71\x62\x98\x54\xfb\x20\xd8\xe3\x42\x93\xed\x83\x4c\x52\xd5\x0e\x73\x82\x63\xe1\x91\x7c\x52\x64\x12\x4b\x58\x62\x4e\x7d\x0f\x2d\x77\xc8\x4b\x13\xea\xc8\x4b\x7f\x60\x08\x31\xac\x23\xed\xc7\x92\xf0\xf6\x9c\xcc\x05\xc6\xa1\x44\x8f\x57\xf1\xe3\x62\x67\x2f\x71\x49\x28\x3a\x4f\xb9\xc9\x9d\x5f\x11\xa9\xc0\xb6\x8c\xc3\xc7\x28\x0e\x1f\xb9\x31\xed\x20\x90\x22\x58\x6e\xab\xe0\x27\x4f\x5d\xa1\xb9\x15\xcc\xd6\xd3\x99\x8c\xa7\xe3\xa0\x63\xcf\xf9\x4b\xd0\x37\x99\x42\x57\x5d\x62\x43\x9f\x1a\x65\xbb\xb6\x68\xcb\xbc\x4b\xbe\x11\xfc\xee\xb0\xf2\xbf\x58\x02\x34\xe6\x3e\x12\xaa\x3c\x54\x55\x0b\xf2\x5a\x01\xb6\xf4\x7c\x85\x71\xb3\x1b\x11\x69\xd0\x43\x8c\xa2\x8f\xb1\x2a\x7a\x9e\xc3\x3b\xc1\x88\x00\xf1\x96\x91\x57\x3f\x85\xdf\xce\x7b\x56\xc8\x43\x03\xb7\x6f\x1e\xca\xc0\xde\xae\x23\x87\xca\x20\xad\x70\xfa\xb7\x5b\x3d\xbf\x7b\xff\x99\x8f\x21\xdb\xc0\xa1\x0c\xd7\xca\xf9\xae\x8b\xab\xa1\xed\xad\x79\x6b\x56\x8d\x48\x24\x71\x1e\x3b\x7f\x4d\xea\xbc\xb9\x54\xe7\x46\x1c\x27\x12\x25\x41\xb1\x8a\x5a\xf7\x05\x9f\x00\x26\xf7\xe5\x0e\xaf\x5d\x70\x07\x3e\x50\x30\x1e\xc2\xe7\x96\x73\xc9\x2d\xa9\x1d\xa5\x69\xb3\x2f\x41\xf8\xe7\xf5\xe3\xb6\xe3\x2b\xe1\x6f\x41\xf1\xe7\xf4\x73\xe7\xd8\x8f\xbf\x11\x8f\x3b\xfa\xb9\x73\xec\x5f\x88\xe2\xfb\xfa\x79\xfd\x6a\x2a\x0e\x5f\x6c\xfa\x8a\x1a\x1e\xea\xe6\x6e\xc5\xfb\x12\xf4\x7e\x46\x37\x77\xab\xdd\x6f\xc2\xdf\x70\x37\x77\x2b\xdd\x6f\xc2\xdf\x23\x61\x01\x43\x37\x4e\xc0\x58\x86\xd0\x06\x5f\x69\xc2\xad\x06\xde\x7d\xe9\xf1\x66\x30\x56\x35\x5e\x58\x50\x43\xeb\x3f\x74\x55\xee\xa2\xfc\x73\xfa\x70\x5a\x71\xdf\xf0\x6b\x93\xfa\x78\x1f\xf7\x8c\x78\xe0\x3a\xfc\x59\x5c\xed\xb2\x1a\x77\x8c\xf8\x8b\x90\x7a\x4f\x1f\xdd\xd7\xcb\x3e\x47\x93\x3f\x77\x0a\x7e\x46\x17\xf7\xe9\xd8\xe7\x13\xfa\x70\x17\xf7\x69\xd8\x57\xe7\x68\x87\x71\xb8\x4b\xbf\xbe\x3a\x47\x29\xab\x10\x58\xaa\x8d\x0a\xdb\x10\xc1\x3b\xb4\x55\xf1\x6a\x00\x9d\xaf\xc1\x0d\xaf\x3b\x37\x86\x98\xb2\xf1\xbd\x2d\xdc\x1d\xa7\xdb\xe1\x44\x56\xe5\x61\x16\x63\x40\xfd\xd0\x4c\x08\x91\xf4\x1e\x18\x11\xcf\x03\x97\xa1\x07\x11\x58\x70\xce\x80\xcf\xea\x6f\x10\x02\x0b\xce\xb5\xea\xb3\xfa\x1b\x84\x80\x60\xc7\x30\x63\xf9\x20\x02\x82\x1d\x8f\xf6\x37\x08\x01\xc1\x8e\x47\xfb\xa3\x11\x68\xad\xd7\x1f\xfc\xfb\xb5\x75\xc0\x82\xf3\x58\x7b\x52\xd5\x1e\xea\x6d\x48\x7b\x52\xd1\x1e\xea\x6d\x48\x7b\x52\xcd\x3e\x8f\x93\x1d\xed\x49\x25\xfb\x3c\x4e\x0e\xea\x0d\xa8\xd8\xe7\x71\x32\x23\x6c\x8e\x79\x05\xb9\x9b\xb1\xee\x22\xff\x00\x67\xbb\x11\x78\xac\x79\xbc\xbf\x41\x08\x7a\xc8\x3b\x7e\xee\xf8\x30\x82\x1e\xf2\xee\xe9\x8f\x46\xe0\x3f\x19\xd7\xd3\x3f\xf4\x4c\x1e\x61\x6f\x57\x7b\x4f\xf5\x1e\xee\x6d\x48\xfb\x6e\xda\x1e\x61\x6d\x57\xfb\x6e\xda\xee\xe9\x8d\x6c\xdf\x23\x47\xcf\xab\xf3\x3f\xa9\xe8\xb8\x78\xe8\x30\x9a\x53\x3f\x22\xbf\x93\x11\xd9\x9f\xf0\xf3\xbe\x14\x96\x77\x2e\x32\x73\xd9\xcd\x87\x34\x5f\xb3\xe8\xd1\x92\xb0\x0a\xbb\xc9\x32\x38\x82\x5f\xcc\xfa\x5c\x5c\x17\xa3\xfa\x66\x44\x78\xa6\x14\xdc\x90\x8e\x03\xaf\x14\x4b\x40\x93\xd9\x80\x4a\x6c\x04\x00\x9e\x11\x73\xec\x59\xb2\xde\x8f\x59\x43\x71\x0e\x64\x62\x3f\xbe\x7b\x59\x43\x60\x34\xf9\x17\xc8\x7b\xa2\x0e\x4c\x80\x33\xf7\x9f\x4d\xeb\x44\x7b\x27\x73\x3a\x51\x3e\xca\x1f\x17\xa9\xb9\x27\x42\x5c\xc9\x44\x30\x21\xe5\xe9\x3e\x15\x46\x5e\xf6\xec\xc6\x7c\xaf\x0a\x75\xa1\x7c\x58\x8b\x1c\xa4\xf2\x36\x06\x71\x33\x14\x02\x84\xf8\xd3\x7d\x00\x8b\xbc\x70\xda\x81\xf6\x4e\xe6\x84\xf1\x3d\xca\x19\x17\xa3\xb9\xe7\x40\xdc\x4e\x45\x30\x01\xfe\xf4\x9c\x7e\x22\xef\xbd\x76\x63\xbe\x93\x45\x9d\x28\x1f\xe5\x92\x8b\x54\xdf\x25\x20\x2e\xc9\xba\x20\x01\x1e\xf5\x1c\x35\x22\x6f\xdf\x76\x22\xbe\x93\x45\x5d\x18\x1f\xe5\x90\xc6\xf9\x21\x2f\x99\x41\xb7\x4f\xc4\xc2\xe3\xec\x4f\xf1\xf6\xa1\x0b\xb0\xd0\x4c\xe6\x73\xfe\x73\xff\xcd\xd8\x9e\x73\x36\x3d\xa0\x72\x5c\x23\x71\xb8\xfe\x1f\x57\xc6\x21\xdf\x36\xbb\x52\x43\x97\x4f\x65\xfb\x49\x69\x8f\xe3\xcc\x16\xde\xbb\x79\x22\x63\x86\x80\x6b\x4e\x4e\x8e\x03\x17\x4c\x04\xf8\xe4\xb5\x7e\xf8\x0a\x61\x47\xca\x8e\x60\xd2\x28\xfe\xa4\xa6\x38\x45\xee\x9c\x36\x8a\x46\xc2\x50\x56\x97\x24\x2d\xda\x4f\x4f\xd3\xd9\xee\x50\x94\x4c\x29\x9e\x92\xf2\x72\x4c\xbe\x57\xe5\x3f\xce\xa2\xb7\x8a\x0e\x9d\x12\x47\xfe\xe1\x1c\xfb\x32\x3d\x74\x67\x64\xb1\x9d\x2d\xe9\xce\x96\xac\xb3\xfd\x95\x69\xcc\x59\x67\x34\xd0\x49\x4e\x31\x26\xab\x4b\xfc\x7e\xc7\xce\x78\xbd\xe6\xf6\xe7\xe5\x92\x27\x75\x72\x4e\xf5\x4d\x8c\x53\x95\x25\xe5\x84\xa7\xa4\xc5\xd7\x53\x54\x9d\x93\xd2\xc6\xfa\xb5\x22\xf9\x05\x78\x9c\x56\xbe\xda\xbb\x43\x2f\x85\xca\x83\x33\xf6\xbd\x6d\x7d\xfc\x0c\x3f\x1c\xba\x8c\x7a\xdf\x01\xde\x81\xd7\x1a\x05\x61\xd3\x43\x92\xb1\xa9\x29\x07\x90\x15\x49\x59\xbd\xbc\x3a\xb7\x9c\x79\xfe\x6c\x99\x2a\xb7\x4c\xda\x9c\xe9\xe3\x64\xb6\xfc\xf6\xed\x6e\x72\x6a\x3a\xeb\x3b\xdb\xfa\xb7\xa8\xbd\x2e\x47\xd3\xb9\xca\x29\xc2\xf3\x8d\x4c\x4e\xd5\xaf\x0e\xb8\xf9\x9b\x80\xad\x1c\xc8\x2a\x04\x07\x80\x68\x08\xcd\xa1\xe2\x7c\x17\x7f\xa2\x2e\xe6\x44\x21\xce\xf0\x89\xe0\x74\xe2\x5f\xcf\xf1\x1e\x7b\xd4\x37\x86\x44\x33\x95\xc2\x97\x68\x37\xf4\x8e\x8e\xcd\xcc\x04\x4a\xe1\x22\x34\x7b\xeb\xaf\x36\xf4\xa9\x44\x9e\x73\x6a\x8b\x96\x40\x7c\x28\x31\x04\x03\xa8\x2d\x8b\xcb\x93\x4d\xcd\xf3\xd1\x53\xde\x09\x07\xe6\xa7\x02\xf1\xdb\xba\x43\x67\xcc\x82\x78\x2a\x93\xaf\x37\x18\xbf\x98\x25\xaf\x7a\x81\x89\xe8\xf5\xc5\x8a\xd0\x34\xe3\x4f\x4f\x0f\x58\x95\x54\x33\xf4\x5c\x66\xe7\x41\xcb\x6f\xc4\x1b\x4f\x4b\xf8\x92\x7a\xbc\x32\x59\x80\xac\x5a\x48\x9c\x3a\x87\x0b\x7c\xd4\x7d\x66\x81\xe0\x99\x49\xef\x5c\xab\xc6\x69\x06\x27\x4e\x8b\x7a\x5a\x66\x8c\x12\xd0\x49\xb5\xe7\xc5\x2f\x7e\x41\x53\x3e\x12\x59\x2d\x85\x05\x07\x39\x1e\xa4\x39\xa2\x37\xd8\x72\xe0\x6e\x17\x23\x9e\xfd\xeb\xdd\x14\x3c\x7c\x26\x44\xed\x5f\x5a\x8b\x88\x76\x7a\xff\x4d\xa2\x90\xb9\xc5\xfc\x36\xc2\x8c\xbf\xb3\xbf\xba\x49\x98\x3b\x5e\x30\x73\x26\xb9\xac\x5a\x45\x36\xa9\x87\x48\xd5\x35\x12\x29\x90\xd0\xc4\x26\x27\x9a\x79\x52\xb5\x6b\xa6\x05\x80\x74\x07\x8d\x7e\xb4\x6f\xce\xe9\xa0\xde\xf9\xdb\x6e\x67\x80\xf6\x52\xd3\xbd\x95\xf0\xd3\xb6\xaa\xca\xb6\x00\x93\x30\xd9\x33\x59\x5d\xdb\xdc\x79\xd4\x1a\x5d\x2f\x14\xef\xb0\x17\x25\x9f\x1a\xfa\xe1\xfc\x8e\x7c\x20\x4c\x0d\x77\x03\xa6\x9f\xa2\xc4\x99\x77\x5b\x1a\x7c\x0b\xe1\xf9\x83\xd8\x70\x6e\xcc\x81\x96\x2e\x45\xd2\x16\x03\xea\xdf\xdb\x84\xc0\xea\x32\xa8\x06\x56\x6f\x67\x03\xd4\x1d\x98\xe1\xad\x51\xa9\x7b\x61\xcc\x8c\xaf\x6e\x1a\xb4\x59\x84\x73\xfe\x6d\xfa\x32\xa8\x0c\xbc\xfb\x07\xde\x4c\x87\xf7\x21\x35\x21\x49\x5d\x57\x1f\x08\xd1\xa3\x84\x2f\x91\xeb\xdb\x12\xe7\xc4\xe5\xcd\x56\x31\xc9\x1d\xc1\x8c\x50\x57\xee\x6a\xbe\x8c\xbe\x75\xb3\xa9\x83\x45\x53\x92\xa0\x1f\x1c\x76\x8e\x1e\xc3\xa5\x1e\xf4\x25\x70\xf4\x74\xf8\x59\xf8\x85\xf6\x04\x3b\x30\x57\x43\x1f\xec\x81\xc4\x2e\x42\xa2\x8c\x4b\xee\xeb\x9b\x42\xcd\x83\x3d\x39\xbd\xc9\xa3\x01\x54\x7f\x14\xb7\x74\x77\xe8\x75\xfe\x70\x7f\x91\xee\x71\x07\xbe\x5f\x92\xdd\xe9\xd7\x33\xfd\x0e\x07\x2b\x83\xd7\x99\xbb\x03\x25\xba\x23\x55\x02\xf6\xf9\x05\xba\x08\xca\x2d\xa8\x12\x43\x3a\xb9\x54\x17\xf1\x1e\x85\x3f\x37\x01\xf9\xd0\x1b\x8a\xed\x1a\xad\x1e\x9f\x35\xab\xcb\x7a\x05\xed\xb6\x6b\xac\x45\x7e\xa7\x80\x93\xd9\xe1\xcc\xf9\x0e\xa8\x78\x17\xec\xcb\x38\xa0\x3a\xb1\xb8\xdf\x7c\x00\x90\x9b\xd9\xb4\x3e\x25\xa5\x61\xa6\x67\x29\xa4\x0b\xae\x6b\x43\x97\xfa\x75\xbd\x6f\x0f\xdc\x7a\xdf\x04\x38\xf5\xd8\x51\x73\x9e\x14\x59\xb8\x39\x5e\x17\x68\x03\xbf\xc0\x1b\xf8\x0d\x1d\x34\x59\xf3\x9f\x0e\xb7\x73\xcf\x7f\x90\x18\xcc\x92\x31\xb2\x6a\x67\x37\x24\x36\x0a\x31\x92\xaf\xc1\x2a\x88\xe7\xa9\x50\xf4\x31\xfa\xfb\x29\x39\xb4\xa4\xd6\xba\xfe\xc3\xe7\xd9\x17\xb7\x4b\x74\x01\x26\xf6\x89\x54\x44\xb9\x70\x32\x47\x99\x7a\x39\xe5\x8d\xa3\x23\x1a\x31\xbd\x2c\xc5\xb1\x37\x71\xf5\x70\xfc\x15\x1e\x24\xcc\xb5\xa5\x8e\xc6\x0a\x7f\x4f\xe5\x64\x80\xb4\x03\x42\x14\xfd\x86\xda\xd1\x9b\x9d\x95\xed\xce\xd3\xb8\xc1\xc4\x89\x4c\xb5\x8e\xf6\xeb\x91\x3b\x66\x47\x8e\xd8\x99\x37\x31\x5a\xf0\x51\x1f\x8e\xd1\x81\x39\x83\x41\x39\x62\x02\x4d\x08\x31\x72\x39\x31\x45\xff\x8a\x6b\xd1\x1d\xc4\x38\x43\x96\x18\x86\x4b\x1b\x5c\x00\xa2\x57\x6e\x30\x54\xa7\x02\x0b\xdc\x30\x31\x40\x0b\x31\x6c\xb5\x8f\x0a\x4b\xbb\x97\x38\x67\xe8\xbc\x3d\x16\xb6\x7e\x58\xbb\x4b\xda\x92\x99\xa8\x1f\x68\xf3\x01\x0b\x40\x71\x50\xd8\x80\x0e\x62\xd0\x2a\xfd\xca\x1d\xdd\xcb\xe0\x88\x55\x8c\xdb\x34\x4d\xd8\x12\xd9\x50\x09\xe5\x6d\x9d\x72\xc8\xfd\x7d\x31\x4e\x57\x03\x5f\xbf\x77\x1b\x3f\x4f\xc5\x65\x3c\xc7\x04\xfb\xf8\x88\xe0\x99\x4e\x31\xa8\xd2\xef\x8e\x84\x41\xee\xa9\xa7\x3b\x97\xe9\x7a\xc9\x1a\x99\xb9\xd7\xb1\x20\x3e\x0e\x75\xf7\xd7\x2b\xe7\x4f\x32\xf8\xa5\xfc\xdd\x05\x9c\x64\x87\xc6\xf8\xaa\xcf\xb4\xdd\x81\x38\xe4\xf6\x74\x09\x80\xa3\x7b\x55\x76\x9b\xaa\x17\x88\xf5\xc4\x09\x21\x10\x1a\x49\x13\xa5\x1c\x84\xd0\x68\xe4\x60\xa5\x17\xd0\xd5\x8b\x82\x03\xc8\x10\x1c\x9f\x01\x75\x55\xf6\xb9\x7e\x66\xe3\xa1\x78\xb2\xfc\x76\x48\x10\x1d\x7e\x26\xe8\x4d\xd3\xe9\x7f\x1a\xc0\x59\x43\x57\x6f\x7d\xc2\x25\x0b\x06\x27\xda\x12\x0c\x17\x64\x30\x2b\x5f\x5d\xbe\x77\xe3\x1c\xa3\xe8\x6d\xa8\x92\xf9\xc9\xf1\xdb\x11\x67\xde\xdb\x01\xd9\xb1\xda\x6a\x24\x58\x3e\xc6\xf8\xc7\x01\x9c\x10\x65\x9d\x5f\x72\xfe\xa1\x45\xfc\x33\xf9\xa8\xb9\xcb\x13\x8c\x15\xd9\xd3\xbf\xfe\xf7\x9f\x79\x97\x7f\xd5\xb1\xe1\xe9\x5f\x8a\xb4\xae\x9a\xea\xd0\x4e\x4d\xf7\x4d\x9b\xd4\xed\x9f\xf8\x40\x9a\xb6\xfe\xf1\xbb\x6f\x36\x91\xfc\xdf\x77\xe3\x51\x7e\xce\x40\x45\x64\x2b\xfe\x5d\x35\xfe\xeb\xa7\x4b\xfe\x63\x4c\x71\x1a\x28\x91\x08\x2d\x9b\xa0\xe9\x97\x60\xbe\xe4\x45\x98\xff\xcb\xcf\x64\xbe\xc2\x8f\x05\xf2\x1b\x30\x3f\x0a\x31\x7f\x73\x07\xf3\xcd\x47\x2f\x5c\x2e\xbf\x7f\x99\x70\xb7\x37\xc5\x70\xd4\x66\x50\xb0\x0b\xf7\xa2\xde\x5c\xe5\xeb\x92\x4f\x82\xaa\x44\xeb\xab\xa9\x7c\x29\x3f\x5d\x8e\x02\x22\x3d\xe6\xef\xeb\x4a\xba\x13\xc3\x20\xa5\xc6\xd1\x4b\x13\x77\x22\xf4\x86\x74\xb9\xa3\x1f\x31\xbc\x73\x1c\x34\xa9\xc6\x57\x0b\xe2\x1b\x3e\x74\x39\x20\xb5\x53\xef\xc0\xd8\xcb\xe9\x57\x1d\xcb\x63\xab\x2a\x91\xef\xd9\x6c\x38\x09\x17\x4e\xac\xc9\x87\xe4\x54\x94\x9f\x9e\x9a\xbc\x2e\x0e\x9d\x54\xe0\x77\x1f\xbf\xfb\xdb\x2c\x9a\x6f\xbf\xeb\xe4\x05\xd9\x26\xf9\xce\xb1\x4e\x59\x91\x26\x2d\x9b\x09\x84\x74\xf5\x76\x43\x3c\x5d\xa0\xfd\x64\x13\x7b\x58\xee\x74\x28\x1c\x39\xcf\x73\x56\xd0\x9d\x07\x8f\x7a\x00\x8b\x20\xc9\x7f\x0e\x6b\x02\x37\x92\x31\xe0\x39\x60\xb1\x8d\x75\x70\x42\xd9\xa8\x27\xcc\x3b\xa5\x1e\x00\x80\x4f\xcd\x81\x77\x4d\xc2\x5f\x96\x41\xa8\x66\xf4\x37\xe2\x11\x28\xb0\xa4\x39\x93\x17\x8c\x48\x3b\x47\x26\x1e\xa0\x86\x32\x03\x43\x99\x85\xb2\x8f\x40\x59\xeb\x37\x11\x3c\xa1\x49\xdf\x62\xa9\x1d\x7b\xfe\x1b\x3c\x73\x61\x43\x47\x3b\xf8\xa4\x86\x93\x7e\x10\xc2\x7f\x51\x4f\x41\x12\x2d\xbe\xc6\xbc\xc2\xb6\xe2\x8b\xfc\xa0\x07\x41\xbe\xc2\xb2\x16\x9c\xde\x43\xe7\xfe\x1c\xe8\xe1\xdc\x9b\xfb\x4b\x6f\xee\xbb\x2f\xad\xcc\x9d\xfd\x8a\x11\xac\x80\x9d\x99\xfd\xd9\x0c\xcc\x29\xf0\x40\x0c\x3d\x93\xe1\x29\x5e\x7e\x56\x83\x19\xe5\x43\xf1\x51\x2d\x06\x63\x5b\x20\xb6\x5e\x63\xfb\x68\x8a\x85\x30\x25\x18\x64\x72\x28\xaf\xcc\xfc\x7a\x80\xaa\x5c\x81\xf3\x7d\x9d\x06\x31\x7b\xbc\xf1\x94\x1b\xea\xc9\xb1\xaa\x8b\x5f\x79\x33\xc6\x49\x51\x20\x33\x83\x68\xf0\x2e\x18\x85\x86\x7f\xc0\xe3\x71\xd7\x7d\x62\x29\x86\x65\x00\x4c\xa6\xf6\xd0\xcf\x21\x3d\xdb\x32\xa7\x61\x18\x4a\xa1\x3a\x27\xef\x4d\x03\xfe\xbb\x2d\x86\x34\xa8\x3f\x9d\x4a\xf5\x31\x17\xc1\xe8\x52\x17\x54\x9f\xba\xc2\xc0\xa6\x5c\x81\x8b\xc7\xe9\x0c\x90\xfc\xcb\x54\xe9\xe3\x5a\xa0\xde\x14\x29\x20\xf8\x65\xd4\x80\x39\x85\xfe\x9e\x5c\x2f\xc3\xe2\x78\xf9\xad\x43\x85\x02\x0a\x03\x14\x63\x80\x32\x10\x82\x1e\x24\x54\x20\x2e\x57\x44\xa4\x4c\x02\xdc\x77\xb8\xec\xf3\x95\x62\xa2\xe2\x17\x67\xca\x13\x9b\x7c\x47\xc6\x20\xb1\x40\xaa\xef\xcc\x6e\x14\x74\xc0\x4b\x3a\x30\xdd\x2c\x38\xec\xf5\xfb\xe2\x74\xa9\xea\x36\xe1\x0f\x99\xdb\xa4\xb5\xf6\xc5\x06\x58\x7f\x2c\xb2\xdc\x89\x4b\xc0\xca\xe6\x58\x7d\x70\xa9\x82\xb5\xc5\x59\x7d\xdd\x7d\x05\x1f\x7c\xf5\xd1\x28\xb1\x6c\x0b\xe4\x7c\x09\x7b\x8a\x7e\x88\x46\xc9\xce\x0f\xe0\xe2\xd5\xbd\xf3\x29\x6f\x73\x5a\x4b\x90\xcd\xba\x09\x10\xbe\xf3\xe8\x81\x64\x27\x07\xa6\x90\xe8\x54\xc9\xed\x8f\xfc\x5c\xcf\xfb\x22\xff\xc0\xc1\xd4\x7a\x9d\xe5\xef\x8b\x34\x97\x86\xe5\x36\x55\x63\x9d\x7c\x6c\xc6\xe6\xf7\xe6\x64\x7f\x3f\x65\xf6\xf7\xf2\x25\xc4\xd2\xf0\xe3\xff\x16\x7f\x90\xe3\x62\x52\x51\x80\x72\xb6\xb5\x75\xb0\x6e\xc2\x26\x14\x44\x74\x84\xc3\x69\xb3\x70\xbb\x34\x2f\x4b\xd0\x30\x78\xf8\x41\xd9\x61\x33\xaa\xed\x36\x76\x46\xd5\x9c\x06\x8e\x0a\x00\x7a\xa3\xc2\x75\xe1\x51\x31\xc1\x80\x51\x79\xed\xfa\x47\x25\x8f\x45\xe0\x51\xc5\x31\xf7\x10\xc1\xb0\x4e\xd9\xc0\x61\x01\x40\x6f\x58\xb8\x2e\x3c\x2c\xa6\x63\x60\x58\x5e\xbb\xfe\x61\xc5\xe2\x2c\x01\x18\x00\xd0\xd4\xee\x01\x00\x40\x6f\x00\xb8\x2e\x3c\x80\xf2\x05\x0e\xc0\x6b\x17\x1c\x80\x37\x5b\xe4\xb4\x86\xfa\x8a\x26\xda\xdd\x9a\xaa\x30\x36\xa7\x3b\x30\xf6\x68\x89\x42\x09\xe4\xd4\x8f\xd2\x48\x48\x35\x0e\x2f\x25\x76\x49\xba\xd4\x6c\x07\xd2\xb3\xe2\x48\x98\x40\x93\x6e\xd1\xbb\xb0\x9e\xf4\x89\xea\xb0\x02\x08\x60\xa8\x03\x54\xeb\x80\x1a\xa8\x21\x28\xc6\x74\x0e\xfa\xf6\xbb\xff\x13\x00\x00\xff\xff\xdf\xbf\xcf\xa1\x7a\x86\x01\x00") +var _pagesAssetsStylesBootstrap311MinCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xeb\xaf\xe3\x38\xb2\x27\xf8\xfd\xfe\x15\xea\x2c\x24\xaa\xb2\xd3\x56\x49\x7e\x3f\x50\x67\x7b\xb6\x67\x30\xd3\xc0\xf4\xfd\xb2\xfd\x61\x80\xea\xdc\x05\x2d\xd1\xb6\xba\x64\x49\x57\x92\x4f\x9e\x2c\x8f\xff\xf7\x85\xf8\x66\x30\x28\xc9\xce\xcc\xc2\x2e\x70\xfb\xa0\x2b\xcf\x21\x7f\x0c\x06\x23\x82\x0c\x32\xc4\xc7\xcf\x7f\xfe\xd3\xbf\x05\x7f\x0e\xfe\xcf\xb2\x6c\x9b\xb6\x26\x55\xf0\x3a\x0f\xe3\x30\x0e\x7e\x3a\xb7\x6d\xb5\xfb\xf9\xe7\x13\x6d\x0f\x32\x2f\x4c\xca\xcb\x87\x0e\xfd\xd7\xb2\xfa\x52\x67\xa7\x73\x1b\xcc\xa2\x38\x9e\xce\xa2\x78\x11\xfc\xe3\x73\xd6\xb6\xb4\x9e\x04\x7f\x2b\x92\xb0\x03\xfd\xcf\x2c\xa1\x45\x43\xd3\xe0\x5a\xa4\xb4\x0e\xfe\xfe\xb7\x7f\x70\xa2\x4d\x47\x35\x6b\xcf\xd7\x43\x47\xef\xe7\xf6\xf3\xa1\xf9\x59\x55\xf1\xf3\x21\x2f\x0f\x3f\x5f\x48\xd3\xd2\xfa\xe7\xff\xf9\xb7\xbf\xfe\xb7\x7f\xff\xbf\xfe\x5b\x57\xe5\xcf\xff\xf6\x6f\x3f\xff\xf9\x4f\x41\x51\xd6\x17\x92\x67\xbf\xd3\x30\x69\x9a\x8e\xd5\x28\x8c\x82\xff\xcd\x68\x8b\xea\x82\xff\x1d\x9c\xb2\x36\xcc\xca\x9f\x15\x36\xf8\xf3\xcf\xe7\xf6\x92\xdf\x8e\x65\xd1\x4e\x8f\xe4\x92\xe5\x5f\x76\x0d\x29\x9a\x69\x43\xeb\xec\xb8\x9f\x5e\x9a\x69\x4b\xdf\xda\x69\x93\xfd\x4e\xa7\x24\xfd\xd7\xb5\x69\x77\x71\x14\xbd\xdf\x4f\x3f\xd3\xc3\x6f\x59\x8b\xe7\xde\x0f\x65\xfa\xe5\x76\x21\xf5\x29\x2b\x76\xd1\x9d\xd4\x6d\x96\xe4\x74\x42\x9a\x2c\xa5\x93\x94\xb6\x24\xcb\x9b\xc9\x31\x3b\x25\xa4\x6a\xb3\xb2\xe8\x7e\xbd\xd6\x74\x72\x2c\xcb\x4e\x4a\x67\x4a\xd2\xee\x9f\x53\x5d\x5e\xab\xc9\x85\x64\xc5\xa4\x20\xaf\x93\x86\x26\x0c\xdc\x5c\x2f\x17\x52\x7f\xb9\xa5\x59\x53\xe5\xe4\xcb\xee\x90\x97\xc9\x6f\x77\x72\x4d\xb3\x72\x92\x90\xe2\x95\x34\x93\xaa\x2e\x4f\x35\x6d\x9a\xc9\x6b\x96\xd2\x52\x21\xb3\x22\xcf\x0a\x3a\x65\x05\xf6\xaf\xb4\xe3\x8a\xe4\x53\x92\x67\xa7\x62\x77\x20\x0d\xed\x72\x39\xa1\x5d\x51\xb6\x3f\xfd\x9a\x94\x45\x5b\x97\x79\xf3\xe9\x83\x22\x51\x94\x05\xdd\x9f\x69\xa7\xdf\x5d\x74\xff\xf5\x9c\xa5\x29\x2d\x3e\x4d\x5a\x7a\xa9\x72\xd2\x52\x0b\x77\x27\xb7\x03\x49\x7e\xeb\x9a\x51\xa4\xbb\x28\x88\xee\x64\x47\x92\x36\x7b\xa5\x13\xb2\x3b\x97\xaf\xb4\xbe\x95\xd7\xb6\xab\xb4\x93\xd1\xe1\x50\xff\xda\x66\x6d\x4e\x3f\xdd\x0e\x65\x9d\xd2\x7a\x7a\x28\xdb\xb6\xbc\xec\xe2\xea\x2d\x48\xcb\xb6\xa5\xe9\xfd\x30\x69\xda\xba\x2c\x4e\x5c\x5d\x9f\x39\x1b\xeb\x28\xba\xa7\xc7\x82\xa7\x35\xed\x97\x9c\xee\xb2\x96\xe4\x59\x72\x3f\xc7\x22\x31\xfb\x9d\xee\x66\xf4\xb2\x17\x1a\x09\x57\x6b\x7a\x09\xa2\xfb\x85\xd4\xbf\x99\x2c\xfe\x70\x3c\x46\xfb\xa4\xcc\xcb\x7a\xf7\x43\x14\x45\xf7\xe6\x42\xf2\xdc\x20\xb1\x89\xde\xdf\x9b\xeb\x61\xd2\x5c\x2b\x23\x75\xbd\x7c\xbf\x67\x72\x95\x62\xd9\x57\x65\x93\x75\xaa\xda\xd5\x34\x27\x5d\x7b\xbd\xc2\xee\x28\xb5\x65\xb5\x9b\x86\x4b\x7a\xe9\x68\xdf\x44\xa3\xa7\xe1\xac\x4b\xc9\x2e\x27\x21\x8d\x5d\x74\x6f\x5e\x4f\x4c\x2f\xbb\xba\x2c\xdb\x0f\xb7\x4e\x80\xc7\xbc\xfc\xbc\xe3\x4a\xb8\x73\x23\x92\x56\x17\xd3\x4b\xb0\x88\xaa\xb7\xfb\xb9\xbe\x4d\x2f\xe5\xef\xd3\x43\xf9\xd6\xf1\x9b\x15\xa7\x5d\xa7\x57\x5a\xb4\x5d\xd2\xde\x93\xac\x54\x5c\xd5\x54\xd7\x44\xae\x6d\x79\x4f\xca\x94\x4e\x7e\x3b\xa4\x93\xaa\xa6\x93\x86\x5c\x2a\xab\xf3\x5c\xca\xa2\x6c\x2a\x92\xd0\x89\xfa\x6d\xaf\x65\x15\xd3\xcb\xfd\x70\x6d\xdb\xb2\x98\x64\x45\x75\x6d\x27\x65\xd5\x72\x33\x6f\x68\x4e\x93\x76\xd2\x75\x27\x52\x53\x72\xe3\x6a\xc8\x8a\x33\xad\xb3\x96\x51\x50\x7f\xa8\x7e\xc5\x29\x69\xf6\x5e\xb3\x26\x3b\xe4\x54\xd6\xc0\x49\xde\x58\x0f\x6d\x6b\x52\x34\xc7\xb2\xbe\x70\xcb\x14\x88\xae\xeb\x07\x8c\x91\x5f\xdb\x2f\x15\xfd\x85\x27\x7f\x9a\x18\x49\x35\x6d\x68\x6b\xa5\x34\xd7\xc3\x25\x6b\x3f\xdd\xe4\x08\x40\xaa\x8a\x92\x9a\x14\x09\xdd\xf1\xf2\xfb\xe4\x5a\x37\x65\xbd\xab\xca\xac\x68\x69\x2d\x2a\xfb\x35\xcd\x1a\x72\xc8\x69\xfa\xc9\xac\x56\x25\xde\x44\xa1\x94\x1e\xc9\x35\x6f\x45\xa1\xdd\x8e\xe9\xee\x58\x26\xd7\x66\x9a\x15\x05\xad\x39\x27\x6e\xba\x32\x93\x7d\x45\xd2\xb4\x53\x67\x74\x67\xd0\x9b\x69\x9b\x7c\xdc\xbb\x1b\xad\x49\xce\x34\xf9\xed\x50\xbe\xd9\x8d\x26\x69\x56\x76\xfd\x50\xd9\x86\xea\x92\x6f\x90\x3e\x2f\x51\x5c\x2f\x07\x5a\x7f\xda\xed\xa4\x54\x18\x53\xd3\xa6\xca\x8a\xa9\xa9\x70\x0f\xba\xbc\xb6\x36\xfa\x26\x18\x66\x16\x67\x0a\x9f\x92\x3a\x39\xa3\xc2\xef\xf4\x7c\xcc\x68\x9e\xee\xfb\xec\x5d\x16\x7c\xa8\x3b\x20\x1c\x68\xde\x79\xc2\x34\xe9\x98\xc8\x91\xc6\xfa\x0a\xa4\x34\x29\x6b\xd2\x8d\x13\x58\x6b\x98\x99\xb2\xe6\x34\xb4\x95\xca\xed\x86\xc2\xa6\xcc\xb3\x34\x68\xb2\xfc\x95\xd6\xaa\x2b\x04\xb3\x4a\x2b\x26\x9c\x2f\xe9\x25\x08\x57\x33\xf6\xcf\xba\x1b\x47\x72\x7a\xa2\x45\x8a\xd9\x88\xea\x70\x76\x27\x97\xfd\xd2\x19\x69\xdb\xce\x5c\xe5\x08\x9d\x94\x79\x4e\xaa\x86\xee\xe4\x2f\x7b\x91\xd1\xf5\x7b\x41\x3f\x9d\xb4\xe7\x9b\xae\xef\x2f\x17\x9a\x66\x24\xa8\xea\xac\x68\x6f\x7f\xe6\x9d\xb3\x39\x93\xb4\xfc\xcc\x9a\xfc\xa7\xec\x52\x95\x75\x4b\x8a\xd6\x18\x88\x8d\x44\x63\xb4\x66\x5d\xba\x22\x35\x2d\x5a\x13\xd0\x29\x10\xa3\x77\x27\x13\xc2\x46\x88\x96\xa6\xbc\x5a\xad\x80\x1d\x9b\x86\x70\xf7\xf7\xeb\xb9\xa6\xc7\x4f\x3b\x72\x6c\x69\x7d\x13\x36\xb0\x7b\x17\xfc\xf4\x2e\x20\x6d\x5b\xff\xd4\xe5\x7e\x08\xde\x7d\x78\x67\x7a\x2c\x2f\x9a\x65\x0b\x38\x23\xfc\x7f\xff\xf2\xee\x5f\xe4\x95\x34\x49\x9d\x55\xed\xee\x9d\x28\x39\x51\x99\x3f\xbc\x73\x88\xbd\xeb\xc6\xe0\x09\x73\xda\xff\x71\x2d\x5b\xea\x1a\xc3\x0f\xdb\xed\x76\x5f\x91\x13\x9d\x1e\x6a\x4a\x7e\x9b\x66\x45\x37\xd1\xd8\x91\xd7\x32\x4b\xef\x6d\x37\x9d\x50\x7e\x99\xa9\x6f\xca\x67\x18\x53\xa6\xe1\x7b\x5b\x4f\x3a\x37\xe3\x2b\xdf\xe5\x5d\xc8\xdb\xf4\x73\x96\xb6\x67\x36\xbb\x31\x64\x5a\x4d\xce\xb3\xc9\x79\x7e\x2b\xeb\xea\x4c\x8a\x66\x37\xdf\x7f\xce\xd2\xf2\x73\xb3\x9b\xdf\x79\x86\x41\x95\x35\x4b\x10\x15\x43\xb3\xed\x7b\x8f\x06\xe1\xb0\x20\xaf\x07\x52\xdb\xf3\x89\x90\x71\x1f\xb4\xe9\x44\xfe\x76\x36\x48\x4c\x85\xc1\x00\x42\x87\xb6\x78\x09\x13\x52\xd3\x76\x12\xa6\x75\x59\x5d\xab\x17\x23\x4d\x5a\x72\x5b\x56\x53\xcc\xe0\xee\x61\x4e\x0e\x34\x47\x64\xde\x4d\x10\xc2\xfe\xde\x60\x92\xe1\x82\xe7\x48\x9a\x06\xed\x79\xe2\x24\xa5\x48\x2d\x69\x9a\x1a\x54\xee\x7f\xbe\x21\xe3\x97\x31\x36\xc3\x91\xcf\xc8\x42\x53\xef\xbb\x03\x3d\x96\x35\x9d\x08\xa3\xfb\xc6\xd4\xf5\xd4\x9a\x79\xff\xd5\x2c\x5c\x1a\x33\x67\x52\x4d\xcf\xd9\xe9\x9c\x77\x63\x8b\x10\x7e\x7d\x3a\x90\x9f\xa2\x09\xfb\xf9\xc0\x67\xd1\xe6\xe4\xe2\xdd\xff\xa0\xf9\x2b\xed\x66\x52\xc1\xbf\xd3\x2b\x7d\x37\x51\x7f\x4f\xfe\x4b\x9d\x91\x7c\x62\x4c\xdd\x8d\x49\xc7\xa2\x7a\xb3\x66\x68\x71\xb8\x98\x6d\x96\xeb\x78\x31\x97\x83\xcc\x7c\x3e\xdf\xa3\x96\xc4\x47\xfe\x89\x35\xa3\xd0\x93\x14\x93\x37\x73\xaa\xc2\xeb\x95\x29\x66\xd5\x22\xed\x2e\x27\x38\x3f\x2c\x66\x9b\x43\x42\xf6\x70\x40\xe2\xf3\x67\x3e\x4b\x9e\x90\x1d\x73\xf4\xb2\xc8\x8c\xac\x16\xdb\x95\x53\xc4\x18\xc3\x04\x5e\xce\xae\xdb\x73\x56\x88\x29\xf4\x5e\xa6\x2d\xab\xb7\xa0\x1b\xe9\x03\xa9\x0e\x3e\x97\xa8\xb3\xe2\xc4\x9b\x2f\x91\xd3\xf2\x78\x6c\x68\xbb\x9b\xce\xaa\x37\x30\xc7\x8c\xd8\xe0\x00\xe6\xb6\x97\x2c\x4d\x73\x7a\x0f\xb3\xcb\x69\x5a\xd3\xa6\x2a\x8b\xa6\x9b\xf1\x87\xed\xf9\x7a\x39\x14\x24\xcb\x5f\xb2\xcb\xc9\xf8\x33\x20\x3c\x21\x21\x75\x79\x6d\x68\xce\x67\x0e\x2f\x61\xd6\xd2\x4b\x4f\x0e\x2b\x65\xaf\x81\xf6\xf6\x30\xb5\x37\xa7\x10\x9c\x9d\x4e\xb9\x54\x76\xb3\x69\x37\xcb\xb9\x36\xbb\x55\xf5\xc6\xb3\x15\x4b\xca\x5d\xf5\x18\x0e\x6a\x2d\x7b\xb4\x03\xef\xed\xfa\x3a\xa2\xaa\x0f\x74\x3e\x8c\xaf\x15\x48\x9e\x07\xe1\xac\x09\x28\x69\xe8\x34\x2b\xba\x29\xd1\x7e\x20\x1b\x5d\xd7\x0d\x09\x21\xc9\xea\x44\x8f\x59\x82\xa7\x65\xf4\xbe\x5b\x28\x70\xbd\x76\x83\xe1\x6e\x16\x55\x6f\x62\x7a\x21\x17\x62\x2c\x49\x4d\x21\xf4\xc0\x69\x36\x97\x52\x7a\x0f\x9b\x7a\x5a\x16\xf9\x97\x9b\x5a\x07\x91\x43\x53\xe6\xd7\x96\xee\x05\x63\x95\x5a\x60\xc4\xaa\x96\xdd\x34\x36\xe6\x30\xd1\x1e\x2c\x6f\xf6\x49\x9e\x55\xbb\x9a\x26\xad\x1a\x1f\x14\x2f\xf7\x73\xcc\xfd\xd0\xe4\xbc\x98\x9c\x97\x93\xf3\x6a\x12\x9e\xe3\x49\x78\x9e\x4d\xc2\xf3\x7c\x12\x9e\x17\x93\xf0\xbc\x9c\x84\xe7\x95\xbf\xc7\x8a\x29\xce\x32\x8a\x80\xc6\xe3\xbd\xb5\x14\xb9\x9f\xe3\x80\xad\x0b\x27\xe7\x99\xfc\x65\x2e\x7f\x59\xc8\x5f\x96\xf2\x97\x95\xf8\x25\x54\xc5\x42\x55\x2e\x54\x05\x43\x55\x32\x54\x45\x43\x55\xf6\x1c\x07\xa1\xaa\x32\x54\x75\x86\xaa\xd2\x50\xd5\x1a\xaa\x6a\x43\x5d\x6f\xa8\x2b\x0e\x75\xcd\xa1\xae\x3a\xd4\x75\x87\xba\xf2\xd0\x58\xfe\x0a\xe9\x2c\xa0\x74\xe4\xf8\xb9\xdd\x6e\xef\x4c\xe2\x4c\x11\x21\x57\x46\x78\x9e\x0f\x58\x54\xcc\x16\xa8\xb1\x23\x23\x43\x44\x8e\x90\xb5\xd4\xcc\xa6\x21\x22\x0a\x31\x69\xe9\x96\x9b\x7e\x69\xf9\xfe\xce\x6c\x84\x59\x4f\x28\x2d\x68\x65\x72\x1f\xfb\xb8\x5f\x38\x3a\x34\x54\x88\xd8\xc1\x2a\x80\x7a\x0b\x31\x15\x86\xb8\x36\x57\x2e\xf7\xeb\x8e\x7b\x26\x7b\x23\x71\xde\x8d\x6a\x5c\x15\x66\x2a\xe3\x98\x6b\xc6\x88\x8c\x2c\x58\x3b\x3a\x3e\x8c\xd4\x78\xd3\xa5\x32\x71\xdc\x6c\x5f\x7a\x17\xd2\x31\x52\x3b\xdf\x50\x29\xb7\x10\x44\x01\x93\x4d\x98\x77\x53\x4f\x64\x10\x31\x4a\xae\xe4\x9f\xc2\xc4\x66\x4e\x07\x5c\xc8\x35\xc3\x4f\x97\xac\x10\x43\xdb\x7a\xb5\xa9\xde\x3e\xdc\x78\x05\x46\x4b\xe2\xea\xed\x7e\x17\xb2\x72\xa2\x37\xcb\xf7\xf7\x24\x6b\xa9\x19\x28\x12\xeb\xe1\x90\xf9\xd2\x9c\x1e\x45\xb4\x80\x7b\xb2\xee\x6f\x91\xc5\x02\x9a\x66\x1e\x4b\x10\x99\x09\xed\x96\xf9\x66\x2e\x4f\x11\xd9\xff\xba\x36\x6d\x76\xfc\x62\xe6\x8b\x24\x01\xb8\x5c\xbb\x25\x89\xd1\x93\x78\x72\x55\x67\x2c\xce\x67\x4d\x14\xee\xc4\xca\x14\x61\x34\x39\x8b\x89\xd6\x31\x91\xc5\x9b\x6b\x92\xd0\x46\x4d\x1a\xe6\xc9\x7a\x35\x4f\x65\x71\x91\x69\x17\x9f\x1d\x96\x8b\x59\x22\x8a\x67\xc5\xb1\x54\x65\xe3\x75\xb4\x39\xca\xb2\x5d\x0e\x28\xb8\x58\xce\x56\xb2\xde\xcf\xa4\x2e\xb2\xe2\x24\xf3\x36\x64\x95\xce\x0f\xb2\xac\xc8\xb4\x8b\xaf\x56\xcb\x58\xd5\x9b\x92\xe2\xa4\xb3\xc8\x76\xb1\x58\xcc\x64\x69\x9e\x67\x17\xde\x2c\xe6\xcb\xf9\xe2\x1e\x1e\x4e\x50\x60\xcc\x1f\x3b\x5e\x5a\x89\x51\x17\x10\x04\x5d\xac\x94\xe7\xe1\xa4\xa4\xe9\x82\xd2\xe3\x31\x4a\x37\x9c\xa0\x2d\x56\x17\x9b\xc4\x74\x76\x98\x33\x82\x4c\xbe\x08\xb5\x2d\x4d\x8f\x6b\x4e\xcd\x10\xb4\x0b\x24\xc7\x74\xdb\xf9\xda\xc3\x49\x49\x1c\x99\x92\x24\xc7\x0d\x9d\x73\x6a\xb6\xe8\x11\xec\x9a\x26\x87\x25\x23\x28\x74\x80\x60\x66\x29\x4d\x29\xa7\x67\x29\xc3\x85\xd2\xc5\x61\x7b\xd8\xde\x43\xb6\x00\xe4\xeb\x4d\x39\xad\x92\x43\xc1\x56\xfb\xfe\x45\x54\xbd\x05\x51\x60\xcc\x30\xcc\xe8\xaf\x31\xb7\xb8\xe6\x93\x32\x37\xc7\xe5\x08\x1b\x94\xaf\x79\xc0\x80\xdd\x7f\xaf\x79\x50\xb2\xdf\x75\x39\x01\x8d\xee\x61\x9e\x35\xed\xf4\x5a\xb0\xc1\x20\x55\xfc\x75\x1d\x7f\xd7\x0d\x43\x8d\x1e\x27\xba\xe5\x27\x4b\xe0\x93\xad\x01\xac\x64\x8a\xe5\x4e\x97\x6c\x2c\xd4\x85\x5f\xf2\x0c\x8f\xc9\x5b\x44\x97\x7a\x3a\xc4\xc7\x9f\x2e\xe5\x9e\xf6\xb6\xbe\x13\xe0\x3d\x6d\x27\x69\x7a\xc3\xe7\xad\xf7\xb4\x75\x83\xe7\x6a\x8c\xe6\x8d\xe9\x19\x6f\xd3\x7c\x7a\x2e\xeb\xec\xf7\xb2\x68\x49\x1e\x74\xb4\xf2\x92\xb4\x6c\xa4\x94\x73\xbb\x55\xa7\xc3\x24\xa7\xa4\xe6\xc9\x70\xd0\x74\x26\x76\x0c\xa0\x12\x69\x9e\x67\x55\x93\x35\xfb\xcf\xe7\xac\xa5\x2c\x90\xd4\x89\xf4\x73\x4d\xaa\x3b\xac\xde\xe6\x3b\xde\x74\x8d\x37\xc3\x32\x13\xf6\x7b\x4a\x5a\x32\x2d\xeb\xec\x94\x15\x24\x9f\x8a\x4f\x0c\x22\xda\x7a\xa6\x79\x85\x18\x1c\x5f\x2b\x05\x7c\x30\xce\x8a\xac\xcd\x48\x9e\x35\x17\xc3\x99\x6c\xa3\xf7\x7b\x10\x58\xbe\x56\x15\xad\x13\xd2\xd0\xbb\x11\xab\x91\xf3\xd9\xce\x2c\x03\x63\x06\xc4\x9c\x24\xf4\x85\xeb\x70\xa9\xed\x5f\xda\x80\x69\xfd\x9a\x70\x50\xed\x72\xd2\xb4\xd3\xe4\x9c\xe5\xa9\x11\x1c\x0a\xae\xb9\x27\xa3\x34\x33\x9c\x9e\x60\x00\xc5\x57\x28\x23\x85\x3b\x54\x23\x41\xf8\x56\x7b\xf5\x65\x7d\x27\x19\x58\x6f\x77\x82\x75\xaa\x94\xb1\x08\x58\x33\x92\x1e\x9a\x19\x2a\x54\xf6\xe3\x3f\xd9\xd7\xc6\x7f\x46\xd1\x7f\x89\x7e\xbc\x87\x1a\x3f\xad\xe9\x2b\xad\x1b\x93\x44\x58\x5d\xf3\x5c\xf8\x75\xbb\x97\xc5\x66\xc7\x13\xdd\x5b\xae\x96\x64\x37\x34\x94\x62\xe9\x2b\x72\xcc\x1d\x63\xc3\xdb\x5e\x83\x29\x80\xc1\xa8\x78\x84\x63\x12\xb1\x20\x18\x8d\x70\x04\x11\x8f\xb0\x51\x09\x4b\xb6\x79\x58\xb3\xb7\x65\x1c\xe2\x6f\x58\x1f\x09\x13\xd1\xd3\xac\x3e\x12\x26\xc4\xb0\xa0\xce\x76\x02\x66\x47\x3f\x1a\x16\xea\x0a\xc8\x8d\xd2\x92\x34\xad\xbb\x29\x82\x77\xbe\x6b\xcc\x38\x3d\xdd\x63\xe0\xdb\xda\xdf\x69\x91\x97\x93\xbf\x97\x05\x49\xca\xc9\x5f\xcb\xa2\x29\x73\xd2\x4c\xde\xfd\xb5\xbc\xd6\x19\xad\x83\x7f\xa7\x9f\xdf\xe9\xaf\x6e\x8c\x96\x1a\x7f\x66\xd5\x5b\xb0\xb0\x46\x9b\x6e\x04\x93\xd3\x92\xf5\x6c\xb9\xa0\x58\x48\x63\x7b\x9c\x1d\x17\xc8\x50\xec\x86\x34\xee\xbf\x1d\xd2\x71\xb5\xe1\xf3\x32\x16\x81\xb3\x88\xce\xab\x37\x33\x9a\x9f\x15\x0d\x6d\x83\x28\x98\xc6\x6c\xaa\x60\x44\x0a\xc3\xd9\xf2\x03\xfb\x4e\x69\x8f\x47\x92\x99\x2d\x1b\x55\xc1\xda\xc4\x1c\x76\xe7\xfe\x28\xcf\xe7\xb2\x4e\x79\xf8\x7a\x27\x82\xd8\x79\xce\x13\x3b\x29\x88\xb4\xee\xef\x81\x40\xe2\xb2\xfb\x41\xa2\x43\x49\x92\x20\xa2\xac\x6a\x1a\x58\xda\x8b\x90\xa8\xa2\xfd\x81\xd4\x54\x51\x55\xd3\x29\x57\x12\x64\xc4\xf8\x64\x02\xaa\x8d\xee\x61\x57\xac\x49\xea\x32\xcf\x59\x50\xfb\x42\xde\xa4\x40\xe6\xdd\xf4\x4c\xf9\xed\xe9\x97\x1d\x87\xdd\xc3\xce\xfa\x49\x56\x50\x15\x39\xaa\x55\xb0\xc9\x9a\x01\xb1\x04\x6b\x48\x8d\xdd\xd9\x4d\x97\xd4\x33\xf5\xd0\x75\x89\xf4\x25\x73\xf7\x6e\x81\xed\x76\x86\x16\xd8\xae\x3d\x05\xe2\x59\x14\xa1\x25\xe2\x98\x17\xd1\x19\xd3\x63\x7e\xcd\xd2\x6f\xd6\xda\xb0\x2e\x3f\x5b\x73\x98\x69\xac\x6d\x55\x00\xa7\x1c\x99\x94\xf9\xf4\xad\x99\xc6\x13\xf6\x5b\x73\x91\xbf\x5d\x52\xf9\x5b\x7e\x92\xbf\xbd\x35\xd3\x99\xc2\xcd\x14\x6e\xa6\x70\x33\x85\x9b\x2b\xdc\x5c\xe1\xe6\x0a\x37\x57\xb8\x85\xc2\x2d\x14\x6e\xa1\x70\x0b\x85\x5b\x2a\xdc\x52\xe1\x96\x0a\xb7\x54\xb8\x95\xc2\xad\x14\x6e\xa5\x70\x2b\x85\x5b\x2b\xdc\x5a\xe1\xd6\x0a\xb7\x56\xb8\x8d\xc2\x6d\x14\x6e\xa3\x70\x1b\x85\xdb\x2a\xdc\x56\xe1\xb6\x0a\xb7\x55\xb8\x38\xd2\x82\x8e\xb4\xa4\x23\x2d\xea\x48\x63\x0d\xa5\x18\x5a\x31\xd4\xa2\xf5\x12\x6b\xc5\xc4\x5a\x33\xb1\x56\x4d\x3c\xbb\xb9\xdb\x47\x3a\x5b\x35\x02\xa6\xe3\x6c\xcb\xb6\x18\x6d\x13\x5a\xeb\x5a\xaf\x5a\x73\x5a\x37\x5a\xfa\x5a\xbe\x5a\x82\x86\x8c\x0c\x11\xb0\x16\x1a\x8b\x82\xbb\x91\xaa\x83\xd2\x3a\x35\x96\x7d\x33\x0e\x57\xfc\x7f\x6b\x23\x37\x12\xb9\x9b\x79\x38\x17\xff\xd3\xb9\x5b\x35\x0e\xe8\xb4\x8d\x48\x5b\xad\x10\x72\x6b\x91\xb9\xdc\x20\xd4\x56\x32\xd3\xe0\x6e\x29\xd2\x16\x18\x73\x0b\x91\x39\xc7\x78\x9b\x8b\xcc\x99\xc1\x9b\x12\x00\xc6\x9b\x94\x03\xc6\x1a\x9b\xb3\xc4\xb3\x9b\xd0\xad\x29\x3f\x9e\x15\x8b\x2c\x54\x88\x1c\x12\x09\x08\x2a\x49\x06\xd9\x0a\x84\x29\x4e\x96\xb1\x11\x19\xa8\x4c\x19\x62\x2d\x10\xa8\x60\x19\x62\x25\x11\x90\xf7\xa5\xc8\x40\x45\xcc\x10\x0b\x81\x40\xe5\xcc\x10\x73\x81\x98\x41\xce\x95\xc8\xbc\x9c\x4b\xc9\x79\x19\x97\x72\x8b\x8c\xe4\xe6\xdc\x69\x83\xf7\x3d\x5b\x19\x5d\x4e\xcc\x73\x3c\xba\xe8\x10\x11\x47\x78\x54\xd1\x9c\xa7\x5b\x0e\xb0\x35\xd1\x9c\xa7\x1b\x9e\xee\x51\x44\x73\x9e\xae\x39\xc0\xa3\x87\xe6\x3c\x5d\x09\x00\xe4\x7a\xc9\xd3\x3d\x5a\x68\xce\xd3\x05\x07\x78\x94\xd0\x9c\xa7\x73\x0e\x98\x41\x9e\xa5\xa0\xbc\x3c\x0b\x79\x79\x59\x16\xd2\xd2\x0a\xe0\x9f\x23\x3b\x15\x58\x8b\x7f\x53\x13\x12\x12\x5b\x10\x54\x25\x12\x1a\x59\x50\x54\x37\x02\xba\xb5\x90\xa6\x92\x04\x60\x63\x01\x50\x6d\x09\xe4\xda\x42\xa2\x6a\x13\xc8\x95\x8d\x74\xdb\xba\xb4\x00\xa8\x22\x05\x72\x61\x21\x51\x8d\x0a\xe4\xdc\x42\xce\xdc\x96\x02\x15\xf4\xb4\xd4\xd6\x44\x4f\x43\xa3\xd1\xa1\x28\x7b\x1a\xa4\x27\x3a\x7a\x2a\xa3\x27\x2b\x7a\x3a\xa2\x27\x1c\x7a\x4a\xa1\x27\x0d\x7a\x5a\x60\xf8\x7d\xc3\xad\x33\xaf\xed\xb8\x37\x9e\x0a\xdd\x1b\x2b\xe6\x75\x6f\x8c\xbe\xd7\xbd\x75\x7c\x40\xf7\xd6\x71\xe9\x75\x6f\x5d\x63\xbc\xee\xad\x6b\x33\x74\x6f\x9d\x44\xbc\xee\xad\x13\x9c\xd7\xbd\x75\xf2\x85\xee\xad\x93\xbe\xd7\xbd\x75\x4d\xf5\xb9\xb7\xe6\xe2\x75\x6f\x2a\xcb\xef\xde\x14\xc4\xef\xde\x24\xc4\x71\x6f\x32\xc3\xef\xde\x24\xc2\xef\xde\x24\xc2\x71\x6f\x32\xc3\xef\xde\x24\xc2\xef\xde\x24\xc2\x71\x6f\x32\xc3\xef\xde\x94\x5c\x7c\xee\x4d\x02\x80\x7b\x63\xc9\xa8\x7b\x53\x39\x5e\xf7\xa6\x10\x5e\xf7\x26\x11\xd0\xbd\xc9\x74\xaf\x7b\x93\x00\xaf\x7b\x93\x00\xe8\xde\x64\xba\xd7\xbd\x49\x80\xd7\xbd\x49\x00\x74\x6f\x32\xdd\xeb\xde\x94\x38\x3c\xee\x4d\xe6\xdb\xee\xad\xb9\x0c\xba\x37\x03\x32\xe4\xde\x0c\xe8\x90\x7b\xd3\x50\x8f\x7b\xd3\x80\x21\xf7\xa6\x91\x43\xee\x4d\x23\x3d\xee\x4d\x03\x86\xdc\x9b\x46\x0e\xb9\x37\x8d\xf4\xb8\x37\x0d\x18\x72\x6f\x86\x7c\xfb\xdd\x9b\x06\x42\xf7\xd6\x1b\xbe\x30\x17\xf7\x7a\xf9\xae\x17\xe8\x7a\x09\xae\x17\xd9\x7a\x19\xad\x17\xca\x7a\x29\xac\x17\xbb\xc6\x62\xd6\x58\xab\xb2\xa5\xa8\xe3\xdf\x78\x2a\xf4\x6f\xac\x98\xd7\xbf\x31\xfa\x5e\xff\xd6\xf1\x01\xfd\x5b\xc7\xa5\xd7\xbf\x75\x8d\xf1\xfa\xb7\xae\xcd\xd0\xbf\x75\x12\xf1\xfa\xb7\x4e\x70\x5e\xff\xd6\xc9\x17\xfa\xb7\x4e\xfa\x5e\xff\xd6\x35\xd5\xe7\xdf\x2e\xa9\xd7\xbf\xa9\x2c\xbf\x7f\x53\x10\xbf\x7f\x93\x10\xc7\xbf\xc9\x0c\xbf\x7f\x93\x08\xbf\x7f\x93\x08\xc7\xbf\xc9\x0c\xbf\x7f\x93\x08\xbf\x7f\x93\x08\xc7\xbf\xc9\x0c\xbf\x7f\x53\x72\xf1\xf9\x37\x09\x00\xfe\x8d\x25\xa3\xfe\x4d\xe5\x78\xfd\x9b\x42\x78\xfd\x9b\x44\x40\xff\x26\xd3\xbd\xfe\x4d\x02\xbc\xfe\x4d\x02\xa0\x7f\x93\xe9\x5e\xff\x26\x01\x5e\xff\x26\x01\xd0\xbf\xc9\x74\xaf\x7f\x53\xe2\xf0\xf8\x37\x99\x6f\xfb\xb7\x4b\x3a\xe8\xdf\x0c\xc8\x90\x7f\x33\xa0\x43\xfe\x4d\x43\x3d\xfe\x4d\x03\x86\xfc\x9b\x46\x0e\xf9\x37\x8d\xf4\xf8\x37\x0d\x18\xf2\x6f\x1a\x39\xe4\xdf\x34\xd2\xe3\xdf\x34\x60\xc8\xbf\x19\xf2\xed\xf7\x6f\x1a\x38\xc2\xbf\x19\xd1\x76\x33\x66\xad\xa3\xd2\x3a\xee\xac\x23\xcb\x3a\x76\xac\xa3\xc3\x3a\xfe\xab\x23\xbc\x3a\x86\x6b\x84\x68\x8d\x08\x2c\x0f\xb0\x42\x07\xc7\x53\xa1\x83\x63\xc5\xbc\x0e\x8e\xd1\xf7\x3a\xb8\x8e\x0f\xe8\xe0\x3a\x2e\xbd\x0e\xae\x6b\x8c\xd7\xc1\x75\x6d\x86\x0e\xae\x93\x88\xd7\xc1\x75\x82\xf3\x3a\xb8\x4e\xbe\xd0\xc1\x75\xd2\xf7\x3a\xb8\xae\xa9\x3e\x07\x97\x9f\xbc\x0e\x4e\x65\xf9\x1d\x9c\x82\xf8\x1d\x9c\x84\x38\x0e\x4e\x66\xf8\x1d\x9c\x44\xf8\x1d\x9c\x44\x38\x0e\x4e\x66\xf8\x1d\x9c\x44\xf8\x1d\x9c\x44\x38\x0e\x4e\x66\xf8\x1d\x9c\x92\x8b\xcf\xc1\x49\x00\x70\x70\x2c\x19\x75\x70\x2a\xc7\xeb\xe0\x14\xc2\xeb\xe0\x24\x02\x3a\x38\x99\xee\x75\x70\x12\xe0\x75\x70\x12\x00\x1d\x9c\x4c\xf7\x3a\x38\x09\xf0\x3a\x38\x09\x80\x0e\x4e\xa6\x7b\x1d\x9c\x12\x87\xc7\xc1\xc9\x7c\xdb\xc1\xe5\xa7\x41\x07\x67\x40\x86\x1c\x9c\x01\x1d\x72\x70\x1a\xea\x71\x70\x1a\x30\xe4\xe0\x34\x72\xc8\xc1\x69\xa4\xc7\xc1\x69\xc0\x90\x83\xd3\xc8\x21\x07\xa7\x91\x1e\x07\xa7\x01\x43\x0e\xce\x90\x6f\xbf\x83\xd3\x40\xc7\xc1\xb5\xea\x63\xb9\x71\xe8\xa2\xef\xc3\xfb\xbd\x3d\x23\x9b\x8c\x19\x15\x83\x02\xb2\xad\x8f\x83\x5e\xd8\x79\xbe\x97\xb6\x7e\x51\x47\xc8\x5e\xda\x43\x99\x7e\x01\x49\xc7\xb2\x6c\x41\x92\x2a\x98\xba\x05\x53\xb7\xa0\xde\xce\xb1\xf1\x6f\x90\x00\x87\x7f\xda\xb2\xf2\x1c\x0c\x49\xd3\x14\x69\x01\x3c\x3c\xc4\xdb\x0b\x76\xe4\xcd\x50\x2a\xe2\xee\x84\x8f\x92\xda\xee\x98\xd5\x72\x7b\x9b\xd1\xea\xa4\xcc\xd9\x31\xc7\x21\x1c\xcb\xb6\xf3\xbc\x24\x7b\x6b\x4e\x47\xd6\x9c\x8e\xaf\x39\x35\x4e\x29\xee\xa2\xbb\xa9\xbc\x8f\xec\xbf\x66\x3e\x2a\xad\x40\x9e\x54\x44\xcf\xb8\x89\x93\x88\x49\x59\xa4\xec\x56\x0e\xc4\xc6\xcc\x4c\xc7\xda\xcc\x4c\xc7\xee\x50\xb2\x69\x1f\x59\x2c\x13\xb1\xca\xa5\xea\x13\xea\x0c\x25\x7e\x80\x12\xa2\xb0\xe6\xe9\x3c\xb7\x75\x3a\xcf\x6d\x1c\x42\x33\xed\xa1\x89\xe4\x19\x2d\xfb\x06\xdc\x6b\x2e\xec\x5b\x34\xc4\xe8\x34\xd3\x32\x6b\xda\x3a\xab\x0c\xe6\x76\x45\x7b\xe6\x06\xf7\x53\x99\xa6\x1f\x0c\x5e\x07\x91\xe8\x29\xdc\x6d\xf7\x23\x2b\x63\xbb\xc4\x35\x01\xf1\xa7\xaa\x01\xcf\x46\xc9\xb2\x9d\x54\x7c\xd4\x0d\x92\x32\xff\x35\xc9\x49\xd3\xfc\xf9\x97\x6e\x94\xfe\xa4\x77\x4e\x34\x2d\x69\xb3\x64\xcf\x27\xfa\x6c\x43\xb6\x7d\x00\x3a\x29\xf3\xeb\xa5\xb8\xcb\xf3\xc4\x16\x95\x89\x3c\x5b\xfc\x2c\x6d\x9a\xe7\xee\x50\x97\x86\xe2\xea\x13\x77\xe8\x85\x39\xda\x22\x60\x8e\xd6\xbc\x97\x9a\x93\xa3\x6d\xd6\x43\x4d\x24\x23\x6e\x01\xc9\x11\xd4\x90\x1c\x48\xcd\xf1\x4e\x48\x0e\xa4\xd6\xa3\x71\xd4\x52\xb4\x88\xc4\x49\x59\x0f\xea\x3c\x02\x65\x41\xbc\xb6\x09\x50\x18\xc3\x74\xd3\xfd\x60\x16\x20\x8e\x87\x60\x26\x00\xb3\x0c\x1b\x80\x59\x86\x11\x78\x09\xba\x59\x86\x19\x78\x08\xca\x74\xcc\x10\x90\x2c\xa9\x3b\x24\xcb\x21\xe8\xda\x02\x92\xe5\x10\xc4\x84\x2b\x4e\xdb\x78\xad\xc1\x3a\x81\xe3\x37\x87\x11\x30\x1b\xe3\x37\x08\x00\x43\x99\x8e\xe8\x36\x59\x61\x16\x91\x15\xc7\x12\x33\x07\x2b\xdd\xb0\x05\x2b\xdd\x30\x04\x9c\xce\xd9\x43\xe7\x8c\xd2\x61\x89\x98\xf2\x61\xba\x54\x14\x4c\xb7\xe9\xb8\x3a\x87\xe9\x36\x1d\x54\x70\xfc\x34\x94\x57\xdb\xfa\x84\x94\x5f\xd5\x43\x18\x03\xe0\x57\xb2\x89\xc1\x18\x4d\x16\x74\x7e\x9c\x63\x1a\x16\xc7\xae\x30\x25\xc3\x2c\x43\xcf\x30\xcb\x50\xb5\x97\xa0\x9b\x65\x28\xdc\x43\x50\xa6\x63\x6a\x47\xb2\xa4\xc6\x90\x2c\x87\xa0\xab\x7f\x24\xcb\x21\x88\x7a\x00\x7e\x8a\xcd\x6b\x05\xd6\xc9\x36\xbf\x21\x8c\x80\xd9\x18\xbf\x39\x00\x18\xca\x34\x39\xce\x92\x04\xb3\x08\x7e\x70\x0e\x33\x08\x90\x63\xd8\x03\xc8\x31\xcc\xc1\x47\xcd\xc9\x31\x8c\x01\xa7\x26\x92\x31\x53\x70\x73\xa4\xe2\xdc\x1c\x48\xcd\xb5\x03\x37\x07\x52\x43\x05\xca\xcf\x1e\x7a\xad\xc0\x3c\x8f\xe8\x37\x82\x61\x94\x05\xf1\x9b\x80\x8d\x42\xe7\x01\x87\x24\x49\x12\x1d\x01\x57\x21\x82\xf5\x6a\xcd\x02\xe0\x9c\xae\xbe\x23\xc3\xbf\xfe\x67\x7b\x7c\x8d\xfd\xf7\xe2\xe4\x9c\x4a\x79\x13\x3b\xf2\xd9\x7d\x85\x2a\x95\x1f\x38\xe9\x92\xc8\xb5\x2d\xcf\x19\xdb\x21\xcc\x81\x07\x52\x7b\xee\xaa\x50\x37\x72\x29\x2a\xac\x40\x67\xed\x6d\x79\x4d\xce\x77\x87\xed\x97\x50\xc6\x40\xc0\xe1\x4a\x0f\x10\x5b\xc0\x20\x20\x77\x1d\x86\x80\xdc\x05\x59\x5f\x75\xe9\x98\xea\xfa\x40\xc6\x5a\x0d\x3b\x9e\xe8\x29\xe7\x2c\x4f\xfd\xb2\x41\x57\x79\x66\x30\xc0\xcb\x1c\xba\x82\x7d\xb4\xa4\x16\xe7\xa3\x25\xb5\x8c\x9f\xe6\xf6\xe1\x92\x5a\x1b\x66\xc9\x9b\x75\x1e\xef\x41\x49\x1b\x47\x27\x1f\x13\xf4\x63\x05\x0d\x39\x3f\x56\xd0\x10\xf3\x93\xac\x3e\x5a\xd0\x10\xb2\x71\x7c\xd4\x3a\x0f\x39\x4a\xc8\x72\x6d\xaf\x89\xf4\x75\x5a\x97\x81\xc7\x0b\x62\x35\x3e\xd2\x64\xbb\x20\xb8\x94\x34\xba\xeb\xcb\xf9\xf4\x29\x2d\x79\xc8\x4c\xdf\x92\xa3\xbf\x7b\x46\xf2\x12\x3e\xfb\x94\x9a\x31\xe6\x43\x3a\x9e\x2b\x33\x66\x31\x08\xc7\xda\x27\xc2\x8c\x93\x74\xfa\xe0\x2a\x72\x98\x7e\xd9\xfd\xdc\xf9\xed\x66\x9e\x8b\x84\x4c\x26\x96\xe0\x9e\x8e\x75\x14\xf5\xdd\xcb\xf8\x8d\x2e\x10\x73\xee\xa4\x9c\x60\x57\x57\xca\x8b\x47\x16\xec\x64\xa0\x12\x9f\x8c\x40\xff\x73\xbb\xef\xbf\x03\xf3\x98\xe5\xf4\x13\xb8\x4f\xd7\xaa\xb9\x38\xc1\x7c\x43\x6f\xe2\x32\xbb\x5f\x2f\xd7\xbc\xcd\xaa\x9c\x7e\x12\xd7\x84\xfd\xda\x69\xeb\x93\xef\x22\x4b\x56\x27\xbf\xa7\xcb\xbd\x79\xd3\x4d\x57\x6d\xfd\x6e\x57\x7b\x95\xd7\xb6\xba\xb6\xf8\x19\x4a\x26\xca\xb5\x7d\x6a\x72\xf8\x52\xb5\xe5\x72\x79\x0f\x8f\x65\x7d\x99\x8a\x8b\x84\xfd\xa6\xaf\x0e\x1a\x1a\x57\x40\xad\xaa\xb7\x20\x9e\x3d\x51\xa9\xef\x6e\x2e\x9d\x9a\x5d\xc8\x49\x5c\xd4\x30\xf2\x4c\xa6\x7d\x6f\xa8\x7d\x22\xb5\x2b\xdb\xfd\xdf\x3c\x92\x1a\xad\x97\x1f\xb0\xd3\xab\x5e\x2c\x72\x23\x98\xbe\x56\xb0\xac\xcd\x7b\xbf\x82\x30\x5e\x36\x13\x4d\xdc\xc9\xdb\x7f\x0b\x22\xb6\xea\x84\xd9\x99\xd4\x76\x3f\xac\x56\xe4\x48\xb7\xca\xee\xa2\x67\x84\x34\x89\x82\x28\xd8\xc8\x8c\x38\x9a\x4d\xe2\xf5\x72\x32\x9b\xcf\x27\xe1\xea\x21\x09\xf6\x12\x02\x8d\xe1\xb7\xe7\x56\x39\x49\xe8\xb9\xcc\x53\x7d\x9b\xcc\x76\xbb\xdd\x97\x15\x49\xb2\xf6\xcb\x2e\x06\x85\xba\x89\x34\xeb\x91\x9e\x82\x4e\x1d\xea\x26\xdc\xb1\x65\x8c\x2b\x82\xed\xf4\x9a\x92\xb4\x2c\xf2\x2f\x9f\x26\xd2\xe9\x68\x68\x60\x77\x31\x71\xb1\x45\x51\xb6\x53\x92\xe7\xe5\x67\x9a\x22\xdd\x81\x52\x6a\x34\x53\x5e\x67\x68\x13\x7a\xfc\x02\x5e\x76\x49\x8a\x01\x4d\x49\x4b\x3f\x59\xf7\x90\x74\xfd\x5b\x34\x99\xdf\x2e\xeb\x2e\x73\xee\x21\x1b\x02\x27\xa1\x1c\xf1\xe0\x1d\x7f\xfa\x28\xa4\x79\xa1\x58\xcf\x15\x5d\xf6\x71\x49\xfe\x29\x95\xd5\x11\x30\xe7\xa7\x6b\x0a\x30\x67\xb8\x87\xf7\x9f\x81\xcb\x9d\x05\x29\xd7\x51\xf1\x0c\x71\xe3\x0b\x96\xaf\xaa\x45\x6f\x63\x56\xd9\x08\x05\xed\xf8\x8c\xeb\x57\xac\x63\xc4\x46\x2b\x3f\x42\x81\x7e\xd4\xa2\x35\x84\x37\xd5\xb2\x17\x35\x3a\x2c\x8c\xb8\xb3\x06\xb9\xe3\x2d\x82\xdf\x88\xf9\x05\x91\xe3\xe4\x2a\x6a\xfe\xd8\xcf\xd8\x47\x87\x53\xec\x8a\x1c\xb1\x0f\xa3\x42\x66\x15\x46\xc7\xc3\xc4\x6c\xf6\x4b\x56\xc0\x49\x10\xf5\x9a\xe9\xb2\x34\x96\xe6\xc2\x91\x7e\xed\x9a\x4c\x3f\x48\xdb\x0e\x36\x48\x70\x23\xf0\xe6\x48\xd1\x62\x00\x49\xb8\x37\x53\x4a\xde\x1d\x7f\xee\x21\x1f\x01\x9b\x8b\x1c\x53\xe6\x46\xaf\x64\xb3\x15\x78\x23\xc3\xcc\x71\xf3\x4b\xf7\x72\x08\x31\xef\xc2\xa9\x5b\xa3\x4e\xa7\x73\x35\xc8\x49\xf8\x04\x4e\xdb\x1c\x42\xe2\xce\x4c\x96\x9a\x9f\x64\xea\x62\x65\x30\xcf\xae\xf5\xd1\x77\xd8\xa9\x8b\xf3\x00\xf7\xce\xdd\x16\x2b\xc8\x3e\xa0\x6f\x16\xef\x12\x20\xfb\xf9\xc9\xc7\xbe\x26\xc4\xd9\x3f\x93\x66\x7a\xa4\x34\xed\x9c\x80\x7b\xb2\xdc\xce\x07\xae\xc4\x3e\x54\xbe\x98\x85\x6c\x88\xf0\x17\x40\xea\x51\x17\x7f\xb2\x9d\x09\xdd\x1a\x42\x2c\x19\xf7\xd8\x54\x90\x4d\xff\xcc\xa9\x20\xf4\x1d\x7b\xe4\x8e\xbd\x8e\x1f\xf1\x0d\x26\x08\xcf\x34\xaf\xf8\xb8\x34\xb1\x33\x24\x8b\x62\xc8\xb7\xf2\xc4\xf8\x68\xe3\xa5\xcd\x23\x50\x35\x0c\xa1\x25\x54\x47\xb0\xee\xdd\xb3\xb1\x96\x98\xed\x39\x15\xc7\x7f\xef\xe9\x66\x0f\x3f\xe8\x4c\x8f\x5f\x0d\xf8\xf4\xfc\xae\x9b\xca\xff\xb0\x5a\x1f\xe2\xd5\xe6\xe1\x29\x9d\x51\x16\x70\xcd\x0d\x9e\x4d\x24\xa6\x24\x4d\xcb\xc2\x96\xf9\x1e\x15\xac\xff\x93\xa2\x57\x22\xda\xae\x11\x9d\x8a\x4f\x01\xae\xe9\xa9\x0c\xc4\xf4\x54\x9e\x61\x7a\x1a\x6f\x99\x9e\x0d\xb5\x4c\xcf\x29\x01\x4c\x4f\x5c\xbd\x68\x63\x7b\x4c\x8f\xe3\xff\x18\xd3\x43\xf9\xf1\x2c\x32\x96\xf1\xd7\x9a\x5e\x12\x91\x78\x75\x78\xce\xf4\x78\x59\xc0\xb5\xd7\xf4\x84\x0c\x51\xc1\xfa\xbf\x6c\x79\x25\xe2\x98\x9e\xa9\x53\x5a\xd7\x65\xed\x1a\x9e\x48\x46\xcc\x4e\xe4\x18\x46\x27\xb1\x96\xc9\x99\x30\xcb\xe0\x00\x1a\x98\x9b\xb8\xab\xd3\x44\xf6\x18\x1b\x47\xff\x31\xc6\x86\x70\x83\x9a\x1a\xbf\x4b\xf4\x2b\x4d\x8d\x6e\x16\x9b\xf9\x93\xa6\xc6\xca\x5a\x3c\x7b\x0d\x4d\xc8\x0f\x15\xaa\xff\xe3\x99\x47\x1a\x8e\x99\x49\x5d\x5a\x20\xbe\xf1\xc9\xfd\xce\xa3\x0d\xd0\xb9\x8f\x5d\xcd\xc2\x97\xf8\xd2\x4c\x54\xb7\x9e\x77\x3f\x3d\x87\xfd\x19\x1f\x62\x21\x64\xae\x1f\x47\x04\x2e\x3d\xeb\x8f\x3b\x42\x13\x86\xa9\x2c\xaa\x9c\x21\x76\xb7\xd3\x18\x82\x86\xe2\x5e\x6c\xea\xe6\x39\x13\xab\x88\xd5\x63\xa1\x98\x47\x55\x2a\x7a\xb6\x4d\x15\xae\xa3\x31\x59\x61\x77\x89\x46\xf0\x12\xc4\xd1\x1c\x60\xab\x5d\x94\xa7\xbe\x45\xad\x73\x8d\x6a\x04\xaa\x1a\x33\x11\xe5\x1b\x66\x45\x41\xe3\xea\x50\x38\x3a\x3a\xf9\xa6\x24\xad\x72\x6a\xa4\xc4\x8b\xa8\xf1\xd2\x5b\xb2\x6f\x89\xea\x48\x5e\xc4\x5d\x91\x06\x0c\x31\x78\x33\x03\x25\x38\x09\x37\x0e\x33\x70\x07\x19\x4e\x01\x0c\x0f\x90\xf5\x81\x4e\xed\x55\x8a\x7b\xdb\x36\xc2\xc0\x68\x1b\xd8\x9b\x37\x63\x1d\xda\x62\xdc\xc8\x01\x63\x14\xce\xf2\xc3\x13\xdb\xb0\x63\x19\x63\x23\xcf\xe6\xed\x7c\xc8\x95\x8b\x4f\xc6\xc5\xfd\xa1\xec\x6b\x43\xeb\x29\x5f\x46\x72\x8e\x58\x54\x14\x49\x6d\xdc\x44\x98\xc0\x84\x2a\x3e\x5b\xb0\x5f\xc5\x3e\x49\x9d\x12\x9a\x29\xdf\xe1\xfb\x05\xab\x55\xec\xeb\x50\xbc\xdc\x8c\x6f\x62\xe8\x13\x2b\x06\xaf\x26\x97\xfa\x61\x42\x8f\xf2\x7a\xe6\x08\xf3\xea\x2d\x58\x02\x3f\x1f\xcf\xf0\x79\x8b\x0f\xcb\xf8\x0a\x65\x98\x85\x71\xd6\x1f\x2c\x62\x36\x8d\xc4\x7e\x85\x09\x4e\xe9\x2b\x2d\xda\x86\xf3\x2e\x23\xbf\xe1\x6a\xb9\x3f\x66\x39\xbb\x8b\x35\xaf\xce\xe4\x27\x91\xf1\xcb\xca\xf8\x1e\x01\xde\xd3\x82\xef\x6b\x31\x46\xa7\xe2\xd1\xba\xdb\xd0\x6b\x3a\x60\xba\x92\x24\x89\x55\xde\x50\x9f\x4a\xd2\x06\xa4\x92\x0c\x75\xc9\x34\xb5\xb5\xb9\xac\x68\x11\xb0\x77\x9e\xd2\xf2\x73\x37\xba\x9e\x4e\x39\x1d\xcf\x23\x3d\x74\x3f\x70\x56\x95\x76\x3f\xf7\x6f\xc8\x03\x6a\x53\x56\x05\xb6\xee\x65\xea\xb0\x0d\x48\xe4\x04\x25\x86\x08\x58\x97\x17\x99\x03\x84\x11\x12\x9a\xbc\xab\x2c\x83\x3c\xcf\x1c\x22\xef\x92\xd0\xe4\x11\xa1\x1b\xf4\x45\xee\x50\x05\x98\xe6\x24\x34\xec\xad\x21\x1c\x57\x83\x1c\x42\x9e\xe9\x01\x41\x78\x20\xe9\x89\xf6\x3f\x61\x30\x9f\xcf\x79\xa1\x07\x1e\x3c\x80\xc1\x90\xe5\x9a\x1e\x52\x8b\x8a\xa9\x58\x99\x64\x28\x43\x26\x99\x12\x12\x69\x23\x0c\x7f\x14\xa7\xf3\xd9\x7a\x75\x88\x01\xa7\xb3\xcd\x92\x6e\xe8\xfd\x1b\xf2\xd0\xd3\xf9\x24\x31\xbb\xf3\x89\xd4\x11\x9d\x4f\x20\x27\x28\x31\x44\xc0\xa3\x3b\x9f\x5f\x47\x68\xe7\x73\xc9\xf7\x77\x3e\xbf\xbe\xf1\xce\xe7\xd2\x1f\xe8\x1a\x7d\x9a\x43\x3b\x9f\x53\xc3\x50\xe7\xb3\xed\x00\xe9\x7c\x63\xfb\x01\xe8\x82\xb2\x18\x7e\x70\xae\x2b\x07\x1e\x5a\xc1\x6d\x7b\x99\x1c\x36\xcb\x04\xd4\xbe\x48\x08\x5d\x24\x16\x15\x53\xc3\x32\xc9\xd0\x8a\x4c\x32\x45\x25\xd2\x46\xf4\x80\x51\x9c\x2e\xd6\x64\xb1\x58\x43\x39\x6d\x37\x8b\xf9\xf6\xfe\x0d\x79\xe8\xe9\x85\x92\x98\xdd\x0b\x45\xea\x88\x5e\xa8\xce\xb7\x60\xc4\x10\x01\x8f\xee\x85\x7e\x1d\xa1\xbd\xd0\x25\xdf\xdf\x0b\xfd\xfa\xc6\x7b\xa1\x4b\x7f\xa0\x8f\xf4\x69\x0e\xed\x85\x4e\x0d\x43\xbd\xd0\xb6\x03\xa4\x17\x8e\xed\x07\xa0\x17\xca\x62\xfe\x5e\x68\xbe\x57\xe4\xe9\x82\x87\x24\x4a\x29\xac\x7a\x75\xd8\xa4\x44\x93\x30\x75\xcb\xfe\x36\x94\xc1\xfe\x36\xc5\xd3\x25\x8c\x30\xf9\x61\xd6\xe6\xdb\xc3\x3c\x85\x7d\x6e\xb6\xda\x92\x43\x72\xff\xfa\xaa\x7b\xba\x1a\x23\x63\xf7\xb3\x2e\x69\x44\x27\xe3\x27\x88\x1c\x1a\x50\x7e\xa3\xfb\x16\x26\x7c\xb4\x57\x01\xaa\xfd\x5d\x0a\x53\x21\xde\x99\x00\xd9\x01\x3b\xc7\xf5\x81\xf6\x21\x9b\xf0\x50\x07\x32\xf4\x8a\xf5\x9e\x31\x26\x0c\xbb\x8e\x28\xe3\xef\x3a\xe0\xc5\x2e\xdc\x44\x8f\x11\x49\x17\xb0\x6a\x4a\xc9\x6c\xbe\xb2\xa8\x98\x3a\x94\x49\x86\x02\x64\x92\x29\x21\x91\x36\xc2\x9c\x47\x71\x4a\xd3\x6d\x32\xdb\x00\x4e\xd3\xe5\x66\x19\xcf\xee\xdf\x90\x87\x9e\x5e\x25\x89\xd9\x1d\x4b\xa4\x8e\xe8\x5b\xea\xb0\x16\x46\x0c\x11\xf0\xe8\x4e\xe6\xd7\x11\xda\xd5\x5c\xf2\xfd\xbd\xcd\xaf\x6f\xbc\xcf\xb9\xf4\x07\x7a\x47\x9f\xe6\xd0\xce\xe7\xd4\x30\xd4\xff\x6c\x3b\xc0\xd6\x70\x23\xfb\x01\x5c\xc9\x89\x62\xfe\x5e\x68\x3f\x7c\x87\x9b\x76\xba\x5d\xce\x17\x70\x0d\x99\x2e\xe6\xc7\x39\x31\x89\x58\x6b\x74\x9e\x62\x2e\xab\x79\x8a\xb5\xd4\x65\x49\x63\x02\x18\x63\x98\x9c\xcd\x67\x33\xf8\xf5\x9d\x24\xb3\xed\x6c\x79\xff\x56\x0c\xf4\x05\x50\x38\x29\x10\x3f\x61\x89\x63\xc2\x27\xe2\x68\x1c\x42\xc9\x95\xea\xf8\xd8\x89\x47\x2d\x78\xe4\x04\xd2\x1e\x08\x9c\x78\x14\xec\x09\x9b\x40\xe2\x43\x31\x0d\xaf\xae\xf0\x98\x09\x20\x3f\x18\x32\x31\xf5\x8e\x1e\x00\x1e\x65\xf0\xa0\xb3\xc9\x52\xfe\xce\x96\x67\xc5\x6f\x60\x85\xd7\xbf\x1f\xd1\x7d\x2e\x47\x92\x99\xa8\xdf\x2c\x29\x75\x09\x23\xec\x8d\x31\xd2\xfb\x4e\xcf\x43\x81\x58\xc0\x90\x61\x70\xec\x6f\xc3\x48\x0c\x86\xed\xaf\xe0\xe6\x55\x45\x03\x94\xc6\x3e\x48\xde\x7f\x1f\x12\x22\xae\x81\xee\x84\x71\x34\xba\xbf\xb8\xec\x6f\xb7\x5b\xff\xc7\x81\x69\x2e\xfc\x30\xff\x06\x9f\x9f\x5e\xba\xbf\x6e\xdf\x62\x03\x20\x5f\xef\x5c\x4c\xf2\xcd\xc5\x26\xff\xfc\xe6\x48\x46\xf4\xad\x31\x89\xbf\x35\x80\x77\xfe\xf1\xe1\x49\xda\xd8\x07\x7f\xf7\x30\x93\xfc\x76\x6c\xef\x25\x8c\x0c\x12\x1f\x0d\x6a\xf6\x86\x01\x6b\xdb\xf9\xf5\x70\xc9\xda\x4f\x1a\x6b\x1d\x9a\xa1\x0d\xf5\xe5\xf1\x97\xfb\x8d\x4c\xfb\xfb\x3b\x49\xe9\x4d\x7e\x0f\x89\xb0\x43\x18\x22\x93\x1d\x89\x08\x3a\xd1\x90\x7a\xdf\x9f\xcd\xa9\x86\x59\x71\x33\x4e\x12\x24\x65\x9e\x93\xaa\xd1\x7b\xa8\xb9\x81\xc9\xe4\x0e\x6d\x9f\x3f\x92\x59\xdd\x54\xd3\x7d\x10\x48\xa8\xc7\x7d\x25\x1d\x69\x01\xc7\x06\xe1\x7c\xc9\x5f\x8f\xdf\xf7\xe4\xdd\xff\x22\xde\x9b\x4b\xa8\xf5\xf2\xdc\x8f\xff\x3d\xff\x52\x9d\xb3\xa4\x2c\x9a\xe0\x7f\x90\xfc\x98\x67\xc5\xa9\xf9\x71\xdf\xd4\xc9\xee\x5a\xe7\x3f\x85\xe1\xcf\x1d\xba\xf9\xf9\xa4\x60\xd3\xb3\x84\x4d\x6b\x7a\xba\xe6\xa4\x0e\x69\xd9\x7e\x78\xbc\xc8\xff\xf1\x43\x46\x8f\xd9\xdb\x87\xe0\x58\xd6\x17\xd2\xfe\xf4\x23\xbd\x1c\x68\x9a\xd2\x74\xda\xcd\x12\x3a\x1d\xff\xf8\x61\x32\x9e\xe2\xe7\xf2\x78\xd4\xb4\xba\xbf\x1e\x2a\xde\xb6\x46\xe9\xb6\xbe\xd2\x87\x19\x68\x5e\x4f\x3f\x68\xc0\xff\xa3\x00\x22\x5f\x53\x6f\x5e\x4f\x3f\x7e\xb8\x87\x0a\x8b\x98\x81\x38\xe1\xb6\x47\x3f\x66\x8f\xd0\x9f\xfb\x2e\x61\xff\x6b\xef\xfa\x83\x6c\x57\xee\x52\x96\xed\x99\x4d\xc7\x0b\xf6\x40\x2a\x69\x68\xca\xbf\x21\x97\xcd\x1b\xc4\x9c\x6a\xf2\xa5\x49\x48\x4e\x8d\x16\x4d\x49\xd3\xd2\x3a\x6b\x7e\x83\x6f\x4b\xbe\xfb\xe7\x8c\xbc\x33\x81\x55\x7e\x6d\x10\xd0\xc1\x02\xd1\x6b\x5d\x22\xa0\x88\x24\x16\xec\x92\x15\x28\xb1\x59\x3c\xb3\x70\x49\x5e\x5e\x53\x04\xb7\x8a\x62\xbb\xda\xe2\x95\xe6\x65\x45\x11\xe8\x3a\xda\xda\xcd\xa0\x45\x92\x39\x2f\x69\x32\xe0\xd1\x02\x9e\x72\xd2\x20\x3c\xd2\x08\xd4\x7d\xb9\x36\x59\x82\xe2\xec\xb6\xf0\x53\x3b\x28\x70\x6e\x01\xcf\x94\xd4\x2d\x8a\x5b\xda\x04\x5b\x52\xa3\xb0\x95\x03\x9b\xd2\x4b\xd5\x7e\x41\xc1\x6b\x0b\x7c\x6d\x28\x4e\x73\x63\xc1\x8e\x59\x7e\x41\x61\xb6\xac\xdb\xf3\x34\x27\xf5\x09\x51\x0b\x8d\xe2\x08\x40\x51\x50\xec\xd0\xcb\x1a\x54\x36\xc0\x70\x4a\xc4\x9e\x69\x14\xdb\x82\xae\xe9\xa5\x7c\xc5\x99\x5b\x58\xc0\xdf\xcb\xf2\x32\xcd\x0a\x14\xb9\x74\x91\xe5\x15\x67\xd1\xd6\x4b\x79\x3c\xa2\x28\x5b\x21\x4d\x76\x2a\x08\x62\xae\x34\x8a\x6d\x95\x24\xe5\x09\x45\x01\x8d\xd4\xa4\x41\x25\x3d\xb3\xd5\x71\x2e\x2f\xa8\x60\x66\x31\xb4\x03\x1c\x66\x6b\xa3\xcd\x3c\xd4\x80\x3e\x4a\x82\x74\x76\x1a\xcd\x6c\x6d\x74\xeb\xd1\xbc\x24\xe9\x94\xe4\xa8\x9c\x67\x4b\x14\x8e\x42\x6d\x95\x5c\x2b\x2f\xd0\xd6\x4a\x56\x1c\xca\x37\x14\xb7\x01\x63\x26\xf9\x32\x4d\xb2\x3a\xf1\x88\x69\x0b\xec\xb1\xa2\x04\x6d\xd2\x3c\x02\xc0\x63\x4d\x71\x3d\xce\x6d\x05\xb1\x17\xcf\x3d\x72\x9a\xdb\x4a\xea\x1c\x16\x0a\xb3\x95\x74\xcc\x09\x6a\x68\xf3\x05\x1c\xc4\xd2\xea\x5c\x16\x14\x1d\x42\xe7\xb6\x8a\x5e\xcb\xfc\x7a\xa1\xbe\x1e\x31\x5f\x61\xe0\x4e\xad\x28\x7a\x8d\xa1\xaf\x15\x8a\xb5\xb5\xf5\x1f\x75\x52\xa6\xa8\xa2\xe6\xb6\xa2\x0e\xc4\x8b\x5c\x80\x61\x0d\x17\xd6\x22\x86\x28\x54\x4c\x0b\x5b\x43\x87\x12\x1f\xd6\x16\x73\x07\x76\x21\x35\x0e\xb5\xb5\x54\xd5\x59\x81\xda\xc6\xc2\x56\x50\x42\x2e\xb4\x26\x28\xd0\x56\x4e\x37\xe3\x40\x61\x6b\xc0\x62\x8e\x76\xb3\x85\xad\x90\xac\x25\x39\xee\x5b\x17\x60\x58\xeb\x96\x8e\x62\x8a\x84\xa0\x97\x91\x8b\xe6\x4b\x10\x0c\x6c\xeb\x86\x6d\x2a\xe4\x4b\x28\x0c\x3c\x43\xc0\x7c\x5f\x22\x0a\x9f\x23\xf0\xda\xcb\xf6\x02\x41\xff\xeb\xda\xb4\xd9\x11\xf5\xe5\xcb\xa5\xd3\xf7\x51\xd8\x0a\x8c\x65\x29\x2d\x5a\x7f\x0b\xe1\xc8\xc7\xd0\x7e\x9e\xc1\x44\x81\x24\xb4\x1b\xfd\xa7\xaf\x59\x4a\x91\x99\x21\x8d\x96\x60\x7a\x96\x25\xed\xb5\x46\xbb\xd6\xca\xd6\xe2\x85\x54\xd3\xce\xcc\x71\x49\xaf\x80\x62\xd2\x4e\x6e\x28\x70\x0e\x5c\x15\x6e\xc0\x2b\x5b\x17\x34\xcd\x70\x18\x98\xa2\x9d\x89\xa7\x2d\xb6\x0e\xd8\x8e\x61\x14\x67\x4b\xdf\x37\x5f\x59\x6d\xc0\x94\x8f\x56\xd3\x03\x49\x7e\xfb\x4c\x6a\xb4\x9f\xad\xb6\x40\x4b\x4d\xdb\x8b\x5f\x47\x60\xfc\xeb\x81\xc6\x8e\x07\x44\x61\xb6\x7e\x2a\x72\x6d\xd0\x96\xad\xe7\xa0\x65\x25\x3a\x92\xaf\x17\x60\x18\xaa\xbd\xfc\x2d\xdd\xa6\xf7\xc1\xe1\x64\x9a\x56\xbd\x70\x5b\x5f\xf4\x5f\x34\x41\xed\x64\xbd\x81\xfa\x7f\xad\x4b\xff\x30\xb3\xde\xa2\x70\x6f\x2f\xdc\x44\xce\xd2\x8d\xcd\x24\x51\x6c\xec\x2e\xcd\xfc\xe0\x19\x32\x83\xf6\xa3\xe7\x60\x52\xee\x47\xda\xfa\xfb\x8f\x2b\x6d\xba\x65\xb6\x1f\xbf\x04\xa3\xd2\xb1\xf4\x63\x81\x0a\x93\x9a\xd2\xa2\x39\x97\xb8\xe4\xd6\x58\x03\xfd\x53\xb8\xcd\x06\x36\xb1\x07\x0b\x67\x11\x45\x0f\x78\x6b\xab\x90\xd4\x75\xf9\xd9\x6b\x1f\xdb\x18\x01\x7b\xad\x63\x3b\x43\xd0\xf8\x0c\x69\x3b\x47\xa0\xbe\xa9\xd7\x76\xe1\x0e\x7e\xbe\xc9\xe7\x76\x09\xe4\xdc\x64\xbf\xd3\xe9\xf1\x9a\xa3\x6b\x9d\xed\x0a\x43\x37\x17\xe2\x81\x83\x5e\xf8\x96\xe4\xe4\x42\xfa\x0c\x2a\x06\x8b\xfa\x53\x86\x0a\x3a\x06\x6b\xfa\x9c\x12\x6c\xca\x1a\x83\x15\xfd\x31\x43\xbd\x40\x1c\x01\xa7\xf2\x85\xb2\x80\x1a\x0a\x5d\x3a\xd0\x24\x2f\xd1\x31\x33\x06\x01\x00\xf1\x35\xd4\xdf\xf4\x35\x1c\xb1\x0b\x9c\x2c\x18\xb3\x48\x4e\x8b\x14\x0d\x41\xc4\x20\x0e\x50\x93\x22\x2d\xb1\x80\x41\x0c\xa2\x00\x49\x79\xb9\x50\xd4\x01\xc7\x20\x14\x70\x21\xa7\x82\xe2\xc0\x19\x3a\x56\xa2\xf6\x1d\x83\x88\x80\x04\x7b\x2c\x3c\x06\x71\x81\x9a\xb6\x9f\xa9\x87\x0b\x38\x11\x28\xab\x8a\x1d\x9e\xc0\x63\x3b\x71\x0c\xe7\xd1\x39\xfb\x1c\xe4\x53\x31\x88\x12\x08\xb8\xcf\x78\x40\xa8\x40\x74\x1f\x79\x6e\x06\x2d\x01\x57\xa6\xac\x84\x3e\xf6\x83\x95\x81\x21\x84\x14\xf3\x90\x31\x88\x20\x1c\xae\x79\x7e\x2e\x6b\x94\x6d\x10\x45\x38\x50\xb4\xb7\xc7\x20\x8a\x90\x74\xcd\x3a\x66\x09\x69\x51\xc9\x81\x60\x42\x7b\xbe\x5e\x0e\x8d\xc7\x3a\x40\x24\x41\x60\x7d\xc6\x01\x82\x09\x67\x52\xa4\xde\x31\x38\x06\x01\x05\x06\xf6\x8c\xee\x31\x08\x2a\x30\xac\x87\xe1\xad\x8b\xf4\xb1\x0b\x62\x0a\xdc\x13\x0d\xb8\x8e\x18\x84\x17\xac\x42\x3e\xf6\x41\x9c\xc1\x2a\x83\x37\x03\x84\x1c\xac\x12\xde\xe6\xd8\x7a\x3d\xe5\xe5\x01\xd5\x3f\x08\x3d\x7c\xae\x69\x81\x46\x65\x63\x10\x76\x68\x49\xf3\x1b\xb6\x48\x8f\x41\xc0\x41\x9c\xe6\xc1\x80\xb6\x1a\x0f\x75\x46\x8f\x09\xc1\xfb\x37\x08\x38\x74\x7e\x91\xcf\x5b\x30\x30\x88\x39\xa4\xa4\x39\x1f\x4a\x7c\x82\x1a\x83\xc8\x43\x45\x2a\x5a\x27\x79\x86\xaa\x01\x84\x1f\x58\x5c\xda\x1b\x49\x8e\x41\x14\x82\x7d\xe3\xc5\x60\x20\x02\x71\x2e\x71\x6f\x03\x22\x10\xd5\xb5\x39\x57\x68\x08\x36\x06\x21\x88\x6b\x83\x37\xdc\x96\xfe\xe9\x80\x37\xd9\x96\x7b\x53\xe2\xa3\x35\x08\x28\x74\xb0\xe9\xe1\xcb\x94\x1d\xe1\x3a\xe0\x0e\x01\x84\x15\x60\x11\xcf\x3c\x29\x06\x01\x06\x59\x8c\x9f\x5b\xc4\xf0\x73\x3f\xde\x5b\xc7\x02\x67\xad\x6d\xeb\xec\x70\x6d\xd1\x10\x5e\x0c\x82\x0d\x6e\x21\x6f\x6d\x40\x5d\x05\x5b\xfc\x52\x54\x69\x4b\x38\x91\xab\x48\x81\x03\x61\x30\x9c\x7f\xd3\xf5\x8e\x16\x20\xea\xa0\xf0\xf8\x78\x04\x22\x0f\x79\x79\xc2\xbf\x06\xc4\xab\x18\xc6\x4a\xd1\x28\x6d\xbc\x82\xa1\xd7\x93\xe7\xa3\x41\x0c\xc2\x13\x05\xfd\x3c\xfd\x9c\x15\x69\xf9\x19\x05\xc3\xe9\x49\x52\xe2\xa3\x00\x0c\x53\x10\x34\xac\x10\x83\x28\x85\x6f\x7a\x01\x82\x14\x1d\x35\xbc\x56\x10\xdd\xbb\x54\x9e\xee\x05\xc2\x13\xf4\xcd\x07\x04\x71\x89\x86\xe2\xd6\xb1\x86\x6a\x29\xab\xea\xcb\x34\x45\xbf\x7a\xd2\x18\x84\x26\x04\xda\xdb\xaa\x35\x8c\x8f\x33\xb8\xf7\xdb\x52\x0c\x43\x15\x9a\x3c\x8a\x5e\x62\x68\x9f\x26\x40\xb4\x22\xa9\x69\x9a\xb5\xdd\x9c\x13\xe7\xdc\xd6\x1b\xdb\x93\x70\xc4\x87\x15\x18\xaf\xb8\xb6\x39\xad\x51\x37\x00\x42\x15\x67\x4a\x3c\x23\xd5\xc6\x99\xfa\x57\x35\x6d\x1a\x5c\xc8\x20\x48\x41\x49\xed\x75\x1c\x20\x44\xc1\x70\xbe\xb1\x08\x04\x28\xda\xf2\xb3\x87\x57\x30\x42\xb6\xa4\x45\x07\x45\x10\x96\x68\x52\x6f\xdc\x33\x06\x51\x89\x73\x1f\x14\xf4\xaf\xeb\xa1\xcd\xda\x1c\x1f\x96\x41\x3c\xa2\x61\x1b\xbe\x9a\x96\xd6\x1e\xd2\xd0\xdf\x5d\xd9\x8c\x31\x3f\xa0\xba\xdd\x42\xb7\xd7\xa1\x97\xd3\x18\xc5\x42\x7f\xd7\x61\x57\x1e\x2c\x74\x72\x1d\x76\xed\xc1\x82\xb9\x61\x59\x7d\x61\xb3\xd5\xa9\xe7\x93\x47\xbc\x85\x83\xe2\x29\x6b\x5a\xbe\xc5\xcc\x5f\x06\x7c\xfe\xc8\xcb\x6b\xda\xf7\x21\x31\x06\x11\x07\x5e\xc0\xfb\x39\x31\xde\x6e\x40\xcf\xa3\xec\xa5\xb5\xcc\xd3\xfb\xb6\xf0\x23\x2e\xa5\xd3\x94\x26\x59\x7a\x2d\xb1\x6d\x14\x74\x16\x75\x8a\x4a\x48\x4d\xdb\xbe\x8b\x54\x22\xbd\x87\xc9\x7a\xc5\xb1\x7a\xf3\xdc\xa9\x60\x3c\x71\xb7\x90\x57\x26\xec\xad\x7b\xc8\x17\xe8\x4d\x0a\xe6\x75\xf0\x28\xe2\xae\x36\x1a\x63\xf7\xe3\x81\x4d\xc8\xe0\xfa\x82\xc8\x00\x5c\x68\x71\xf5\xdc\x7c\xc7\x76\xc4\x89\x9d\x70\xbf\xb3\xcf\x18\x6f\x5d\x9a\xbe\x05\x8f\xed\xe8\x34\x2f\xf3\xd4\xcf\x25\xaf\xe0\x65\x89\xea\x9a\xf1\x99\xb8\xee\x9a\x7d\x67\x95\xbb\x78\xe4\x8d\xa5\xfa\x5e\x88\xbe\x73\xc8\xf8\xbd\xc7\x46\xaa\x75\x31\x01\xbb\xc3\x60\xc4\xc5\xc8\xfc\x3a\xa3\x78\x06\x2f\x36\x00\x97\x37\xf5\xc2\x0c\xa6\xbb\x15\x82\xdc\x3f\x78\x28\xdf\x80\xc8\x43\xf6\x10\x2e\xb3\x00\xf9\x18\x2e\x17\x35\xbf\xff\xd0\xc2\x06\x61\x9a\x75\x23\x5d\x2d\xef\x48\x8c\xd5\x4d\x27\xbb\x2d\x13\x2d\xdc\x4f\x87\x1c\x2f\xe1\x17\xa7\xdb\x84\x5f\xf2\xec\x85\xe0\x77\x67\xef\xe6\xd5\x5b\xc0\xee\x45\x4d\x72\x4a\xea\xdd\xa1\x6c\xcf\xfd\xdb\xac\x9c\x3b\xad\xe7\xf3\x39\x72\x21\x08\xc6\x82\xdc\x15\x8b\xe4\x70\xc3\xc5\xf6\xb9\xee\xd5\x81\xb3\xee\x07\xb3\x17\xf1\x04\x9b\x4d\x55\xbe\xda\x46\x60\x75\x2a\x03\xe7\x46\x67\x5b\xbb\x70\x3b\xa3\x44\xb9\x43\xaf\xe2\xb0\xf6\x6e\x3b\x9c\xc9\x2d\xbf\x08\x6f\x3a\xcb\xc3\x9d\x01\x80\xbb\x84\x7b\xea\x19\x4b\x0c\x6d\x61\xef\xfe\x6f\xfc\xfe\x11\xb1\xd2\xaf\xea\xf2\x94\xa5\xbb\xff\xfa\xbf\xfe\xd6\x65\xfd\x83\x4d\xa2\xca\xfa\x12\xfe\x3d\x4b\xea\xb2\x29\x8f\x6d\x78\xea\xba\x2a\x2d\xda\x9f\x68\xc1\x38\xf9\xe5\x48\xf2\x86\x7e\xd8\x63\xf7\xb4\x76\x33\xbb\x17\x30\xa0\x81\x5d\xa9\x0c\x42\xbc\xe3\x9f\xe8\x87\xaa\xff\xed\xd5\x7e\x5f\x1b\xd6\x01\xc4\xc3\xc9\x02\x02\x7a\x2b\x9f\xba\x0d\xf5\xa8\xde\x9d\xcb\xb0\x17\xd9\x0a\xec\xc4\xda\xfd\xa1\x47\xec\x63\xf6\x46\xd3\xbd\xc5\x54\xb4\x57\x57\x01\xf1\x5b\x84\xe4\xe0\xbd\xdd\x46\x77\x63\xe0\x81\x42\xf3\x8c\x43\xd7\x2a\xe0\x8e\x71\x12\x16\xe4\xf5\x40\xea\x29\xab\x53\xdc\x37\xa4\x0f\xbc\x08\x94\xf5\xea\x2b\x78\xc9\x41\xbb\x40\xe5\x7a\xdf\xe9\x4a\x2c\x6e\x06\x2b\xb3\x79\xef\x6a\x63\xaa\x53\xf7\xb4\xb9\xcf\x11\xf5\x5e\xeb\x24\x6a\xab\xf9\xce\x62\x9b\x38\x62\x18\x3d\x70\x9f\x99\xdc\xf5\xa6\x76\x73\x7f\xbb\x9c\x37\x20\x1b\x65\xd1\x89\x88\xe7\x3e\x33\x45\x90\xed\x96\xc7\x2a\x10\xdb\xe8\x9d\x5a\xb4\x03\x87\x54\xcc\xd3\x0a\x08\x2d\x27\x9b\xa7\x1a\xc7\x35\xb0\x42\x30\x9b\xa7\x9a\x87\x50\xb0\x52\x4e\x3e\x4b\x0e\x07\x8a\xc9\x23\x3a\xb2\x03\xcc\x9c\x16\x8e\x61\xd6\x1c\x37\x14\x90\x1d\xcb\xf8\x08\x64\xad\x13\x1d\x3d\x07\xfa\x57\xb4\x94\x91\x85\xde\x6e\x26\x0f\x30\xb4\x65\x99\x1f\x48\x6d\xe7\x2e\x41\x6e\x00\x59\x50\xe9\xc6\x05\x7f\x37\xa8\x78\x01\x32\x0c\xc8\x4c\x41\xc8\xbd\x58\xe4\xac\xb7\xd4\x25\x43\x86\xa8\x8b\xb2\xfd\xc9\x7c\xf2\xe8\x03\x4f\xd1\xef\xd5\xf0\x04\x38\x77\xfd\x70\x43\x0f\x31\x99\x3a\x34\x9e\x51\x02\x57\xef\xf9\x91\x0f\x56\x2e\xde\x23\xe6\xeb\x26\xc9\x89\x31\xbb\x07\x39\x4e\xcd\xba\x22\x57\x0e\x96\x55\xc3\x99\xbb\x83\x06\x1c\x75\x2d\x45\x19\xb2\x32\x20\x3f\x1e\x0b\x80\x80\x11\x3a\xe3\xa3\xca\x80\x8a\x04\x35\xf3\x79\x70\x20\x15\xd8\xb3\xb1\x12\x40\x34\xdf\x48\x35\xa2\x26\xe3\xd9\x24\xc7\xa8\xbe\x52\xe2\xce\x99\x50\x77\x34\xc3\xcf\x8e\xa2\x03\xcf\x0b\x1f\x63\x20\xd4\x3a\xb9\xb4\x31\xde\x8f\xe0\x1e\x68\xe3\x76\xc8\x69\x7e\x1a\x20\xc3\xa6\x27\x36\x9d\x78\x66\x11\xf2\xf0\xfd\x47\xdc\x33\xd7\xc7\x80\x3e\xa4\xf8\xc8\x39\x44\x39\x81\x41\xc6\x90\xfc\x04\x66\x37\x7c\xf2\xb0\x14\x0c\x82\x79\x8e\x7a\x3b\x4b\x4d\x6d\x7a\x68\x44\x81\xa0\x72\xf7\x79\x21\xaf\x7b\xf2\x4f\x26\x5e\x80\xae\xc1\x94\xd4\xb8\xab\xd4\x7a\xbd\x51\xbe\xf5\xc8\x8f\x99\x8d\x20\xab\x09\x79\xe1\xd0\xdb\x21\xb9\xa3\xda\xd1\x4f\xc7\xeb\x3e\xd9\x2b\x21\x7a\xc1\xec\x7a\x06\xe0\xf1\x87\x47\xbc\x9e\xc1\x0e\xce\x1e\x7a\xdc\xcd\xcd\x37\x40\xb1\xe0\xc7\x88\x91\x0d\x1b\x8d\xfc\xac\xf4\xf9\x9f\x9e\xf1\xcd\x60\xc6\x1d\x49\xc7\x8c\x7d\x98\x96\xbe\x81\x57\x41\xc9\xf6\x89\xbb\xc7\xdf\x3c\x41\xeb\x19\x4f\xf4\x90\xbe\x1c\xa7\xe4\xca\xcc\xeb\xa6\x9e\x54\x14\xdf\x25\x9d\x51\xfd\xd4\x1f\x7b\x61\xd0\x1c\x20\xf8\x93\x83\x39\xf9\x52\x5e\x5b\xb1\xf0\xd4\x87\xb0\xd9\xd7\xc0\x5d\x43\x2b\x52\x93\x96\xa2\x94\x9d\xd1\xcc\xce\xb1\x26\x25\x6c\x70\xb2\x38\x99\x26\x34\xcf\x25\x3b\xef\xfd\x15\x18\x93\x6a\xf3\xd4\xec\xaf\x29\x69\x89\x50\x98\x38\x5f\xdb\x7c\x62\x05\x5e\xdc\x8b\x9f\xc7\x81\xf5\xe5\xcf\xf6\xf9\x58\x73\x56\xec\x5f\xd5\x71\xf1\xfa\x05\x68\x50\xf9\x35\xc9\x49\xd3\xfc\xf9\x97\xa4\xcc\xa7\xd6\x4d\xd3\x43\xe7\x95\x0d\x1a\xf0\x99\x14\x87\x2f\xb5\x48\x32\x43\xba\xde\xc7\x7d\x6d\xe2\xec\x84\xb9\x49\x7f\xe2\xe4\x3a\x77\xc2\xf7\x43\x3a\x51\x33\x15\x7e\xd7\x07\x6c\x3c\xcc\x7b\x30\x6e\x13\x46\x00\xd1\x86\x0c\xbd\x94\xe3\xe1\xcb\x8b\x72\x39\x1b\x05\x95\xbc\xf9\x9e\xe5\xe9\x15\x4f\x0f\xda\x27\xa8\x91\x45\xa0\xc8\xcc\x27\x8d\xf4\x8d\x03\x7e\x73\xeb\x72\x07\xcc\x0d\x42\x60\x95\xdf\xe3\xb1\x27\x0f\xeb\x1e\xcc\x28\x63\x1b\xd5\x8c\xa1\x57\xa5\x3c\x7c\x79\x51\x23\x8d\xcd\xc7\x5b\xbf\x2d\x78\xc4\xd3\x83\x7e\xd0\xd8\x86\x44\xe6\x1a\x1b\x62\x3e\xcc\x8f\xf9\x07\x57\xd7\x6f\x21\x14\x47\x4c\x83\x9c\x4a\x1f\x2d\x03\x9e\x0f\x79\x66\x72\x3b\x2c\x09\xe9\x65\xdf\x63\xf7\xbf\x7b\xc2\x95\xee\x0b\x21\x43\x17\xc5\xf7\x9f\xf1\x37\xde\x51\x75\xaf\xbb\xc7\x9f\x92\x1c\xf9\x86\x2a\xc2\xab\x7e\x73\x6d\x68\x84\x40\x6e\x21\xf1\x51\xcb\x4f\xc3\xd7\xb3\x20\xb7\xb1\x38\xe4\xb0\x67\x2c\x7a\x41\xf0\x41\x62\x1e\xb9\xef\x99\x3b\xd8\x2f\x9e\xbb\x76\xed\xcd\x06\x13\x56\x31\x1d\x1c\x42\x18\xeb\xcd\x01\x30\x98\x96\xbb\x68\x18\xe4\x19\x17\x03\x1c\xa4\x63\x2e\x6b\x7c\x8b\x98\x87\xa3\x54\xbd\x72\x75\x9e\x32\xf7\x2b\xcb\x5c\xf3\xb8\x34\x7d\xb9\x48\x2b\x47\x8a\x61\x04\x76\x50\x4f\x4e\xa0\x10\x89\x99\x8e\x33\x1b\xcf\xba\xe9\xc9\x90\x5e\x9f\xfc\xe0\x0b\xfe\x70\x90\x44\x3e\xbc\xa8\xce\x1d\xa1\x1f\xca\x51\x2f\x85\x6c\xf6\xc0\x70\x2c\x12\x82\x7c\x42\xc0\xb0\xf2\x3b\x0e\x9a\x27\x3e\x90\xa0\x79\xee\xd7\x95\x6f\xd5\xdb\x6f\xe0\x21\x17\x84\xf5\x27\xcd\x13\x91\x49\x41\x5e\x9d\x77\x8b\xc0\xc2\x0a\x6c\x56\x61\x65\x5e\xf2\xac\x67\x75\x27\xbe\x3c\x73\xdc\x0b\x19\x42\x82\xa5\xcd\x52\xf0\x65\x6d\x8f\x50\x7f\x3f\xf2\x51\xbe\x73\x75\x92\x94\xf1\x61\xdf\xda\x1f\xe0\xe4\xda\x35\xf6\x6d\x2e\xc0\x37\x3f\xf4\x6e\x0d\xc0\xbe\xe1\x17\xe4\x35\x10\x5f\xe9\x27\xe6\x1f\x06\x23\x2a\x49\xbc\x81\xd6\xe3\xd3\xe1\x3e\x0b\x56\xba\x20\xaf\xd3\x6f\xb7\x8f\x46\xea\xe2\x25\xbb\x9c\x6e\x3a\x70\xaa\x8c\x63\xda\x92\x43\x63\x8f\x32\xe6\x4c\x23\x4d\x53\x0d\xeb\x0c\xc9\x7d\x12\x59\x14\x52\x26\x2a\xa1\x2f\xc4\xee\x1c\x3d\x5b\x08\x7a\xdf\xea\x71\x26\x3a\xc1\x82\xef\xcc\x02\xb5\x71\x15\xdc\xe0\xd5\xa1\x34\xe0\xff\x81\x2d\x31\xf6\xd7\x60\xa9\x86\x42\xdd\x3c\xcb\xb8\x7a\x9e\xc4\x77\x26\x6e\x69\x9a\x82\x30\x9b\xd7\xec\xc4\x93\x15\x9a\x67\xf6\x8b\x0e\x7e\x19\x01\x0f\x5b\x7b\x91\xaf\x88\x56\x9f\xad\x7d\x07\xf5\x42\x6e\xee\xdc\xd4\xd6\xf6\xd2\x54\x36\x20\x30\xbc\xf7\x41\x6f\xdc\xe8\xdd\xe7\xe0\x69\x43\x6f\xb0\xad\xaf\x51\x30\x30\x34\x0a\xad\xb7\xaa\x38\xf3\x6d\x5f\xfb\x5d\xcb\xf2\x21\xa0\x95\x79\x71\xe6\x7b\x8a\xb0\x7f\x3e\x21\xc3\x17\xd2\xdb\xe5\xc7\xf4\xb9\x3f\xb8\xd1\x76\x7f\x61\x57\x8d\x72\x5e\xaa\x2c\xcf\xc1\xc8\x64\x67\xe8\xb6\x42\xdd\x49\xc4\xc7\x3c\xbb\x81\x5d\xb2\x36\x00\x34\xce\x49\x36\x5b\xe4\x66\x3a\xfb\xf0\xfc\x1b\xed\x3a\x02\x4d\x4b\x92\xdf\xf0\xde\xaa\xb3\x0c\x96\xd9\xdb\xcf\xee\x77\x23\xdf\x68\x71\x1f\x1e\x14\x9e\x1d\x0b\xbe\xc7\x10\xf0\x58\xcf\x1f\xdd\xe1\x0d\xd1\x78\x47\xcf\xe7\x07\x84\xfe\x7e\x31\xa6\x4f\x7c\x87\x41\xe0\x5b\x0f\x00\x7f\x40\x23\xd1\x4e\xdf\x92\xc3\x54\xec\xca\x7b\x61\x7f\x54\xa4\x80\x17\x7f\x5a\x18\x31\xfb\x77\x27\xbc\x8c\x09\x68\xa1\xf0\x73\xec\x33\x1f\xab\xf8\xa6\x3b\x64\x2a\x6d\xbc\x1a\xb9\x8c\x9c\x37\x5b\xd9\xa6\xcb\xbe\xb9\xd0\xe0\xb6\x40\x64\xa4\x1b\xde\x4a\x28\x36\x83\x1a\xe3\xa7\xda\x36\xa8\xee\x55\xed\x66\x8e\xea\xa5\xf8\x8e\x4d\x39\x03\x9d\xbe\xed\x5e\xb3\x26\x3b\xe4\x14\x6e\xc0\x58\x1a\x7b\x32\xf8\x2e\x8d\xa5\x25\x4e\xef\x74\x0f\x7d\xda\x37\xe2\x9b\x2b\x66\xcb\xe5\x44\xfe\x3f\x8c\xf5\x3b\x7a\x8a\x9d\x26\xa9\xcb\x3c\xef\x16\x28\x6d\x79\x4d\xce\x4e\x4b\xd8\xc5\xb1\x12\xfc\x65\xc4\x08\x64\x89\xc1\x78\xa5\x16\xec\x1e\x05\xbb\x34\x60\xad\xce\x05\xb5\xcc\x0a\xff\xc4\xcf\xc9\x91\xa2\xdd\x1b\x41\x5d\x23\x55\xef\xcb\x17\xcb\x3d\x35\xf1\x17\x42\xd7\xd8\xa1\x96\x8a\x02\x77\x7b\xbb\x6a\x5b\x56\x01\x2c\xa8\x76\xb4\xf2\x27\x47\xfb\x31\xf6\xae\x57\x28\xaf\x81\xcf\x7e\x77\xf6\x26\x29\xc9\x0a\x5a\xbf\xd8\xd6\x38\xd1\x39\xd3\x63\x7e\xcd\x52\x7f\xfe\x8b\xcb\x9b\xaf\xac\x61\xce\xf0\xf9\xd5\xbd\xf3\x46\x6b\x8f\x59\xfc\x7f\x81\xeb\x08\x38\xfc\xbb\xab\xb5\x9b\x75\x18\x06\x6c\xe6\x61\xdd\x6a\xd8\xf4\x0d\x6a\x30\xe2\xee\x9a\x12\x6a\x15\x70\x0b\xb8\xb5\x7b\xdb\x3c\xb0\x33\x8f\x86\xd9\x19\xa8\x6a\x98\xc5\x9b\xb5\xdd\xdb\x16\x86\x87\xa4\xe8\x7a\x30\xf2\x62\x91\x88\x0d\xef\xd8\x91\x38\xd4\xa4\x48\xcd\xc5\xb2\x0a\x9b\x2c\xfb\x3f\x06\x33\x1f\x60\xb8\x08\x9b\xa2\xe1\x41\x75\x9a\x3f\xca\x32\x28\xcf\x17\x6d\x74\x81\x45\x74\xe2\x02\xb8\x55\xda\x30\xf7\x65\x63\x2d\x72\xb9\x51\xcf\xb3\x8f\x9b\x99\x81\xfd\x0e\xb2\xe9\x32\x58\xa0\x23\x36\x7c\x64\xa7\xb7\x8d\xe3\x32\x37\xd8\x09\xac\xe1\xf3\x1d\x8f\x05\x1c\x40\x93\xdc\xcd\xd6\x56\x76\x10\x8a\x2b\xa0\xe0\xf9\x0a\xae\x80\xd9\x4c\x2b\xd8\xfd\xf2\x12\x3b\xb5\x69\x72\x1f\x35\x61\x43\x26\x8b\x31\xbd\x58\xe8\xc2\x9a\x24\xa9\x7a\x74\x58\x71\xb7\x0e\x97\xd5\x5b\x30\x55\x61\x3d\x91\x2d\x22\x83\xc6\xd3\xd3\xb1\xf1\xd9\xd9\x7a\x72\x1e\xda\xb2\xe6\x4d\xc5\x9e\xd6\xab\xb5\xc9\x9b\x0a\x99\xc1\x99\x98\xb2\x1c\x3e\x06\xb9\x9b\x01\x99\x1f\xb6\x1e\xfa\xee\x37\x05\xae\x74\xbf\xb7\xf6\x71\xc2\x9a\x3f\x19\x42\x05\xce\xf1\x1a\xeb\xa3\x9b\xdc\x82\x39\x03\xb2\xf5\xd7\x78\x73\x64\x39\xaa\x18\x18\x23\xfa\xb1\x4e\x8c\xd2\x78\xef\x65\xd8\xac\x3a\xcb\x71\x02\x82\x46\x87\x10\xc1\x67\xb0\x32\xf7\x1b\xd5\x12\x31\x2a\x20\x2e\xeb\x40\x8b\xf9\x55\x03\x79\x51\x7d\xb8\x01\xec\x04\x8c\x66\x0f\x99\x4d\xf1\x13\x57\xc6\x90\x65\x60\xb4\xc3\x28\xeb\xcb\xa8\x47\xde\xdd\xe8\xf9\x98\x09\x31\xbe\x4e\x1b\x78\xc5\x64\x78\xf2\x3c\xe9\x9d\x59\x7f\x43\x52\x43\x23\xf8\x08\xb7\x5f\xd6\x17\xeb\x45\xfd\x51\xef\xcb\x7b\x3e\xe9\xbb\x34\xe1\x76\x08\xe4\x40\x35\x1b\x6b\xc6\x10\x34\x3e\xee\xd8\x1b\x44\x60\x0c\x46\x17\x49\xac\x87\xf9\x9f\x69\x05\xfb\x7e\x3e\x01\x54\xc5\xe7\xf2\x5e\x59\xf1\x61\x73\xe0\xa3\xd2\x68\x0e\xb0\x4f\xfa\x28\x4f\xf8\x67\x7d\x63\x80\x77\x83\x59\x9a\xc8\x99\x34\xd3\x23\xa5\x69\x37\x6a\xd9\x0a\x54\xc9\x7c\x96\x77\x1f\x76\x3e\x8e\x61\xb9\xa1\xad\x71\xd6\xe9\x2e\x0d\xe1\x0c\x7d\x0f\xa6\xef\xe6\xc8\x17\xb9\x2b\xbd\xd1\x07\x02\x0c\x26\x1e\x1a\x1c\xc1\x50\xec\x0f\x83\xf4\x7c\xfd\x1f\x8c\x81\xe0\xeb\x43\xbc\xca\xe7\x37\x27\xcb\x29\xa9\xfe\x92\xec\x1f\x6b\x0c\x70\xc8\x5f\x08\x32\xcb\xc4\x6e\x54\x26\x8e\x90\x52\x6f\x8d\x55\x6a\xe1\x96\xb2\xe6\x8d\xf4\xad\xb5\xf0\x4b\x17\xdf\xbf\xe2\x34\x09\xb9\x9f\xe0\x74\x78\xc5\x99\x4f\x5b\x3c\x8c\xb3\x0f\x63\xd9\x84\xbc\xa8\x2f\x63\x71\x9b\xee\x07\x3e\xd4\xb7\xee\x7e\x60\x69\xb0\x64\x10\xd8\xf5\x7a\x00\x08\xe6\x31\x38\xc6\xfe\x12\xc7\x3e\x7a\x0e\x3c\x87\xe5\x21\xc7\x24\x3b\x82\x35\x35\x71\x79\x00\x3b\xd0\x12\xf0\xb9\xdc\xb8\x95\xe0\xa9\x96\x74\xe4\xec\x80\xec\x20\x6a\x04\x83\x0f\x7d\xfc\x1c\xb0\x03\x46\xcf\xbc\x44\x60\x1c\x6e\x0c\x97\xbe\x1d\x00\x6c\xc7\xdc\x53\x76\x61\x1d\x9c\x90\x2f\xe0\x89\x6f\xc9\xfe\x02\x03\xbc\x5a\x0b\x49\xe4\x5d\xbe\x41\xfa\xc6\x22\xd3\x2d\xbe\xd9\x6c\xbc\xc5\x9d\x00\x1e\x04\x30\x67\xf6\x50\xb7\x66\x82\x37\xf6\x44\x0c\x60\xc6\xa8\x71\x68\x07\x05\x63\xc8\xd8\x4b\x39\xec\xe8\x91\x6a\x7a\x56\x5e\xe3\x3a\xf7\xe8\x35\xd8\x63\x65\xbf\xd9\x30\x80\xd7\x31\x6a\x6c\x18\x28\xfa\x6c\xfb\xbe\xf1\x28\xe2\xa9\x64\xdc\xd0\x32\x58\xf8\xe9\x46\x3e\x3d\x08\x79\xdb\x6a\x3e\xa8\xd9\x67\x94\xfa\xe9\x46\xc3\x7e\x14\x3a\x2b\x5e\x69\xdd\x60\x0f\x81\xce\x66\x33\xe0\xca\xa3\x4d\xf7\x03\x8b\xe2\xae\x5c\xee\xcd\xf2\x02\x81\x24\x71\xcc\xf0\x67\x72\xcc\xec\x21\x2d\xd3\x8f\xf7\xf1\x05\xfd\xf8\x18\xec\x40\x33\x70\x3f\xfe\x74\x4b\x70\x3f\xde\x8b\x1a\xc1\xe0\x43\xdb\x12\x06\x8c\xc0\xe7\xc7\x07\x70\x63\xb8\xf4\x75\xa1\xc5\x62\xf1\xa4\x5d\x60\x7e\x1c\xe9\x1c\xfd\x7e\xdc\x03\xf2\xf9\xa9\x61\xfa\xbd\x7e\x9c\xbd\xa7\xeb\x29\xee\xf8\x71\x08\x40\xfc\x78\x1c\x75\x3f\xfd\xea\x04\x7e\xbc\x07\x33\x46\x8d\x03\x7e\x9c\xdb\xd7\xde\x68\xee\xa0\x1f\x47\xaa\xf1\x8d\xc2\x20\x1a\xfb\xd0\xf8\xd6\x13\xe4\x15\x5b\x33\x9f\xe9\x2d\xc3\x33\x8e\x81\x61\x68\xf4\x8c\xe3\xb1\xb2\xdf\x6c\xc0\x1a\x3b\xe3\x78\xbc\xe8\xb3\xed\xfb\xc6\xe3\xdd\xf8\x19\xc7\x33\x85\x9f\x6e\xe4\xd3\xc3\xa5\xb7\xad\xe6\x8c\xa3\xcf\x28\xdd\x19\x07\x7f\x05\xbc\xa6\x24\x4d\xea\xeb\xe5\xa0\xbe\x82\x6c\x64\xc4\x1b\xd9\xf4\x02\xef\x58\xf4\x5d\x92\x87\x7d\x9b\xd3\x55\x99\x5b\xc4\xcc\x60\x27\xc0\x7c\xcc\x33\xe7\x62\xcd\x9f\xff\x19\x45\x24\x7a\xa7\xe2\xf3\xec\xb2\x8b\xbd\x9e\xb7\x59\x24\xe4\x8e\x22\x53\x3c\x15\x39\x65\x05\xfb\xf2\x8a\xc7\x5b\x41\x48\x55\xde\x31\x19\x99\x97\x72\x98\xad\xd2\xf4\xdc\x56\x81\xdc\xce\xe8\xec\x84\xa6\x22\xfd\x17\x68\xed\x9d\x43\x6c\x9e\x9d\xd9\x7d\x17\x1a\x8a\x97\xdd\x1f\xd9\xfb\xec\x9e\x69\xb0\x18\xb7\x0e\x59\xc0\x56\x59\x99\xac\x85\x76\x78\x75\xf4\xe5\x10\x20\x0b\xf2\x60\x9c\xc6\x70\x58\x30\xf2\x18\x07\x3d\x21\xcb\xbe\x1b\x29\xdc\x5a\x75\xdf\x77\x35\x89\xe7\x10\x79\xe2\x05\x29\x80\x3d\x1f\x3f\xe6\x1c\x02\x8b\x3b\x18\xf4\x8c\x81\x1b\x49\xed\xaa\x42\x33\xb0\xb6\x98\x85\x7a\xb2\xb1\x56\x59\x45\x79\xd3\xf4\x15\x00\x23\xb6\xd5\xa2\x87\x2d\x9c\x6d\xf6\x66\x85\x6a\x38\x75\x9b\x68\x65\x61\x0d\xb1\x01\x48\x6b\x4c\x5f\x81\xa7\xf7\x92\x45\x8e\xb6\xf4\xf5\x40\x43\xb5\xe8\x81\x16\x5d\xc7\x34\x3f\x39\x83\x89\x48\xe3\xe3\xc9\xc0\xa1\x4f\x97\x96\xbf\x3b\x23\xf9\x48\x7f\x32\x3b\xea\xca\xdf\x87\x57\x68\xdd\xbe\x6e\xec\x66\x0f\xf5\xe4\x55\x4f\x4f\x86\x75\x37\x17\x57\x86\x3c\xcd\x92\xa1\xe7\x18\xae\x4b\xaa\x47\x84\x6e\xfe\x80\x08\xe7\x7e\x11\xce\xd1\xba\xbd\x22\x74\xb2\x87\x44\x38\xef\x11\xa1\xac\x5b\x6f\x98\xc0\x9d\x24\x9c\x23\x38\xdb\xd2\x05\x95\x00\xf7\x97\x2c\x43\xb4\x83\xff\xce\x98\xee\x73\xd6\x5c\x4d\x8f\x5c\xf2\xec\x6e\x9d\xe6\xdf\x60\x74\xfd\x46\xdf\x96\x29\x8f\x9f\x92\xe3\x85\xc3\x82\xbe\xb5\xba\x45\xfc\x4f\xd6\x28\x63\xbb\x82\x02\x57\x35\x7d\xcd\xca\x6b\x63\x14\x50\x49\x46\x21\xbe\x4b\x43\x00\xc0\x50\x65\x27\xd9\x2d\x71\x06\x28\x37\x83\xd5\x32\x38\x6c\x61\x83\x14\xff\x30\x6e\xab\x4a\x29\x29\x9c\xd1\x4b\x10\xae\xba\xff\xcc\xe9\xc5\xe8\x51\xeb\xe5\x7b\xeb\x30\xfe\xda\x77\x18\x5f\xdd\x8d\x6c\x1d\x72\x18\xbe\x23\xe0\x40\x1a\xca\x58\xb1\x55\x1e\xce\x96\xf4\x22\x98\xfe\xf5\x5c\xd3\xe3\x27\x29\x2a\x33\x69\xdc\xed\xcc\x42\x1a\x55\x99\x71\x0b\x67\x14\x76\xec\xa1\x1e\xb0\xe5\x9d\xdd\x0b\xc7\x05\xe5\xce\xfc\xe4\x6e\x76\x41\xa0\xe7\xbb\x1e\x9b\xcc\x5a\x20\xa4\x09\x20\xcb\xb3\xbc\x3f\xd5\xe4\x8b\xa4\x55\xd5\xd9\x85\xd4\x5f\x90\x0a\xe5\xd1\x17\x0b\x87\xd5\x69\x67\x79\x43\x2e\xd1\x3a\x26\xaa\x09\xcd\x35\x49\x68\x83\xe1\x96\xc9\x61\xb3\x4c\x00\x0e\xab\xd6\xce\xf2\x55\xbb\x58\x6c\xd3\xc5\x42\x92\xcb\x8a\x63\x89\xd5\x79\x48\xa2\x94\x9a\x20\xac\x42\x23\xdd\xdb\xc8\xf8\x10\xa5\x4b\x49\x48\x3c\x02\x88\x05\x90\x22\x92\x2e\x28\xc0\x61\x75\xda\x59\xde\xcf\x2e\xc9\x76\x1d\x1f\x95\x79\x90\xe2\x84\xc6\x41\xd2\xed\x72\xbe\x00\x30\xd4\x88\xcc\x1c\x5f\x9d\xc9\x76\x1e\xcd\xba\xe5\x17\x49\x4f\xd4\xb3\x95\x45\xdf\xe6\x6f\x5e\x86\x33\xaf\xde\x82\xb5\x7b\xd3\x05\x1c\x11\x8c\x1e\x68\x0f\x0e\xbe\xce\x8e\x8c\x0b\x63\x6e\xf2\x60\x23\x9e\xed\x1a\xd8\xc6\x02\xd6\x30\x7f\x8f\xe6\xed\xee\xeb\xd1\x7c\x3b\x82\x44\x5a\xbb\x49\x98\x6b\xea\x1c\x10\x11\xd5\x70\xf9\xcb\xbf\x9e\x1a\x82\x48\xc8\x1c\x31\x3f\xbd\x9e\xb5\xf4\x22\xa7\xe7\x9c\xa8\x79\x08\x4e\x4d\xea\x45\xde\x6d\xc4\xc2\x11\x9e\xdd\x93\x45\xcd\xb5\x1e\x9b\x31\xfc\xeb\x7a\x39\x94\x6d\x6d\x5c\xc8\x32\x77\xf7\x6e\xb0\x24\x4e\x3c\x2b\xce\xb4\xce\x5a\x9f\x4b\x55\xe4\x82\x73\x3c\x31\xfe\x0a\xcf\xf1\xcd\x22\x60\x42\xe1\x76\x21\xb0\xb9\x7b\x16\x03\x7b\x9b\x45\xd1\xdd\xdc\x71\xad\xdb\x80\x5c\x98\x62\xf0\xa0\x8a\xdc\xc0\xd5\x97\x22\x5c\xca\xdf\x8f\x0b\x48\x91\x62\x7b\x47\x1c\x49\xf1\x7d\xc3\x1b\x77\xb3\xe5\x82\x4d\xe3\x51\x06\xad\xa9\x99\xf9\x68\x86\xd8\x34\xb2\x8a\x6c\x9e\x5d\x29\x6a\xb9\xac\xe6\x6c\xff\x11\x7b\x73\xb1\x20\x59\xee\xb9\x87\xde\xdd\x54\x33\x83\x3b\x8c\xcd\x33\xe4\x4f\x4f\xd1\xcc\x67\x36\x58\x6c\x4c\x3c\x31\x92\xe7\x41\x38\x6b\x02\x4a\x1a\x3a\xcd\x8a\x69\x79\x6d\xf7\xfd\xd9\x46\x93\x5e\xb2\xcb\x69\xa2\xff\x0c\xe4\xf9\x7b\x6d\xc4\xe6\xe6\x65\xe3\xf2\x75\xa2\x0b\xa9\xde\xaa\x53\xf8\xcc\xca\x48\x91\xa1\x28\xfc\x3e\x01\x5d\x7f\x98\x90\x8a\x05\xa7\x8c\xed\xf5\x7b\xf3\x2b\x05\xc9\x69\xdd\xde\xac\x53\x0a\x0f\x1e\x4e\xc3\xa2\x58\x8c\x6a\x70\x5e\xd8\xdb\xc9\x40\x7f\xe2\x20\xfe\x0f\x8f\x3b\x82\x31\x5a\x40\x5e\xaa\x89\xf8\xe5\xea\xec\x92\x54\x90\x8f\xd6\x85\xaa\x4b\xc5\xc4\x34\xcd\x9a\x4b\xd6\xb0\xa9\xe8\xcd\x36\xdd\x39\x8e\x0a\x42\xf6\x44\xab\x6f\xec\xed\x7c\x89\xd8\x4f\xc7\xfa\x39\xd6\xa8\x9e\xf9\x47\x7a\x3c\x46\x29\xdc\x3f\x95\xae\xe8\x36\x59\x29\xbd\x24\xeb\xd5\x3c\x05\xa4\x82\x73\x6d\xde\x9f\xa9\xbc\x24\x9d\x1d\xe6\x10\x6a\x8a\x54\x06\x83\x0e\xcb\x45\xe7\x4e\x79\x8e\x67\x9e\x92\x6e\x69\x7a\x5c\x03\xde\x0e\x09\xdd\x1c\xd5\x94\x79\x1e\xaf\xa3\xcd\xd1\xa4\x83\x33\x46\x56\x34\xa6\x56\x7d\x28\x57\x8b\xe5\x6c\xb5\x95\xa8\x9e\xf9\x4c\x72\xdc\xd0\x39\x60\xec\x48\xe8\x21\x49\x24\x63\x1b\xb2\x4a\xe7\x07\x40\x0a\xe7\xed\xb8\xa6\xf1\x61\x09\xa1\x08\x7b\xab\xd5\x32\xd6\x42\xf3\xce\x7b\x8e\xb3\x94\xa6\x30\xa4\xd6\xf1\x96\x2a\xb1\x91\xed\x62\xb1\x98\xd9\x94\x70\xe6\xe8\xe2\xb0\x4d\x22\x80\x44\x78\xdb\x2c\xe6\xcb\xf9\xe2\xfe\x17\x39\x80\xfd\x46\xbf\x1c\x6b\x72\xa1\x4d\x50\xd5\xe5\xa9\xa6\x4d\x33\x3d\xb0\x63\x5c\x75\x56\xd1\xe6\x76\xac\xcb\x8b\xc9\xba\x32\xee\x05\x5b\x64\xdf\xdb\x12\xcd\x8d\x82\xe8\x7e\xff\xcb\x77\xa4\x1d\x4a\x8a\x37\x78\xb5\x89\x79\x2e\x0a\x1b\x91\x46\x7f\x29\x18\xda\x24\xef\x3c\x94\xe4\xdd\x03\xef\x22\x35\xff\xec\x53\xae\x73\x2f\xa9\x7a\x8e\x8b\xdd\xd7\xd1\x73\x3b\xe3\x4c\x4f\x58\x3c\xcb\x52\x6f\x94\xb3\xa7\x79\x53\x63\x73\xbe\xf5\xda\xd4\x58\x24\xe2\x1e\x59\xc3\x82\x70\xc5\x3d\xe0\xde\x9b\x63\x88\x86\x1b\x4a\x1a\xd8\xc2\x72\x0e\x9f\xc8\xca\x3a\xb9\x90\x7a\xaa\x9e\xd8\x59\x2c\x53\x7a\x9a\x20\x27\x0c\x96\x1f\x82\xd9\xf2\xfd\xc4\xf0\x45\xce\xdf\xcb\xe8\xbd\xa7\xa4\x3f\x67\x0d\x68\x80\xbf\x3f\xb8\x67\xcb\xfe\xff\xc4\x31\xb3\x3f\xd6\x33\x17\x6c\xea\x26\x75\x22\x66\x14\x40\x49\x52\x27\xa4\xc8\xf8\x6b\xfb\x3b\x6c\x08\x08\x66\x4d\xc0\x65\x10\x64\xc5\x31\x2b\xb2\x96\xee\x1f\x2e\x61\xf7\xa5\x11\x4b\xf8\x7e\xfb\xc2\x08\xfc\xa7\x9d\x7d\x5f\x8e\x81\x0a\x07\xc2\x21\x03\xfa\x83\xa5\xff\x53\x79\x7f\xa8\xf2\x86\xa3\x4b\x03\xfa\x43\x08\xfc\xa7\x0a\xff\x50\x15\x0e\x46\xea\x06\x34\xe8\x96\xff\x4f\x05\x7e\x6f\x05\xb2\xc0\xce\x84\xff\x33\x3d\x94\xe9\x17\x67\x62\xfc\x7b\x59\x5e\x76\xb1\x8d\x0c\xf8\x3f\xf0\xac\x91\x00\x61\x0f\x50\x89\x3b\x74\x79\x3d\xe5\xe1\x5f\x34\x69\xe1\x4d\x39\x3c\xef\x4c\x49\xb7\x66\x96\x27\xc5\xa3\x20\x0a\x34\xe5\x17\xfe\x5a\x1f\x3b\x4e\x6b\x1f\x41\x8a\x20\x86\x1f\xa8\xb5\x0e\x2e\x69\xcc\x34\xcf\x9a\x16\x7e\x06\x74\xee\xb4\xd4\x01\xc8\x1b\xb2\x22\xb0\x4b\xdf\x61\xb8\xf2\xf1\x0b\x2e\x91\x8b\x0e\x1f\x89\x36\x39\x1c\x8c\x7a\x0b\x63\x68\xcf\x0a\xa4\xe9\x1e\xe6\x82\x17\x55\x0c\x6c\x52\xc1\xf7\xcd\x38\x15\xc9\x78\xac\xf5\x89\x11\xc7\x7c\xb4\x43\xb7\xdc\x20\x78\x34\x1a\xea\xc4\x38\xc9\xe1\x64\x06\x30\x41\x99\xa2\x11\xbf\x72\x4a\xa9\xe0\x99\x23\xfc\x47\xbe\xb6\x8a\xa7\x59\x7d\x31\x6f\x97\xbc\xc8\xf0\xd5\x2e\xb3\xbf\xd5\x2e\x16\x2f\x67\x5e\xa1\x0d\xb0\xfc\x44\x39\xd6\x96\x21\x25\xc9\xb8\xd8\x78\x7e\x3b\x0d\x3d\xcc\x6c\x7f\x21\x0f\xa7\xe6\x91\x01\x1a\xd3\xf4\xb8\x76\x2c\x5a\x2d\x22\xac\xd0\x1c\xa2\x2b\x1e\xd6\x73\x9b\x89\x13\xf0\xe3\x9e\x96\xa7\x24\xe0\xb3\x40\x95\x6f\x9f\x32\xf2\xb6\x27\xa2\xdb\x64\xe5\xaf\xc6\xdb\x11\x00\x60\x88\x1d\xbb\x63\xf4\x76\x07\xc9\xab\xbd\x93\x5f\xc4\x4a\x21\x79\xb6\x78\xb0\x62\x96\x58\x23\x59\xbc\x13\x69\xa4\x5b\xda\x03\x7a\x5e\x5d\x5d\x69\xaf\x70\x58\xa6\xad\x28\x5f\x1b\x92\x05\x9d\x1f\x91\x71\x90\xd1\xf0\x6b\xc9\xc8\xed\xe5\xe2\x11\xfd\x08\x16\x6d\xfd\x88\x78\x31\xa4\x2d\x17\x07\x56\xf4\x16\x1b\x88\x59\xe4\x17\x69\x1e\x4a\xc0\x8f\x7b\x5e\x51\x82\x80\x57\x4a\x32\xdf\x92\x90\xbf\x3d\xe4\x38\x4b\x12\x7f\x35\x7e\x8d\xd9\x80\x21\x76\x1e\xd0\x9b\xe4\xd5\xd2\x9b\x0c\xa7\x43\xf2\x62\x49\x60\x85\xb5\xb1\x66\xb2\x90\x38\xd2\x4c\xac\xbc\x17\xf6\xbc\xd2\x78\x79\xaf\x90\x44\xb6\x25\x1c\x6f\x5b\xe8\x21\x49\x50\x95\x71\x2a\x7e\x8d\x59\xf9\x03\xbc\x3c\xa0\x2f\xc9\xa8\xa5\x2f\xf9\x81\xc1\x27\xb0\x9e\x6b\x3f\x96\xc8\x6c\xcf\xba\xb9\x40\x4d\x28\xc1\xe3\x55\xf7\xb0\x22\x85\x73\x71\x89\x2f\x3a\x8f\x4d\x93\x7b\xbf\x22\x62\x81\x6d\x1e\x87\x8f\x41\x1c\x3e\xb2\x63\xda\x5e\x90\x60\x98\x2f\xab\xcc\x4f\x9e\x32\x43\x4a\xcb\x7b\x5b\x4f\xef\x65\x3c\x3d\x1b\x1d\x07\xf6\x5f\x1a\x75\xa3\x57\xe8\x8a\x43\x6c\xe0\x53\x23\x2f\xd7\x66\x6d\x4e\xfb\xf4\x1b\x99\xdf\x1d\x56\xee\x17\x4b\x83\x8c\x3a\x8f\x04\x32\x8f\x65\xd9\x1a\xf7\x5a\x19\x62\x19\xf8\x0a\x63\xdf\x6e\x84\x5c\x83\xee\x13\x14\xbe\x8d\x55\xf0\xf3\xe2\x5f\x09\x46\x08\xc4\x19\x46\x6e\xee\x15\x7e\x7b\xe7\x59\x21\x87\x8c\xb9\x7c\x73\x48\x7a\xd6\x76\x3d\x77\xa8\x8c\xb2\x0a\xab\x7e\xbd\xd4\x73\xab\x77\x9f\xf9\x18\xb3\x0c\x1c\x2b\x70\x69\x9c\x1f\xfb\xa4\xea\x5b\xde\xaa\xb7\x66\x45\x8b\xd8\x25\xce\x13\xeb\xaf\x69\x4d\x9b\xaa\x2c\x1a\xb6\x9d\x88\xa5\x78\xd5\xca\x72\xed\x17\x7c\x3c\x94\xec\x97\x3b\x9c\x72\xde\x15\xf8\x48\xc5\x38\x04\x5f\xda\x4e\x4a\x76\x4a\x6d\x19\x4d\x9b\x7e\x0b\xc6\xbf\xae\x1e\xbb\x5c\x37\x12\xfe\x11\x1c\x7f\x4d\x3d\x0f\xb6\xfd\xfc\x07\xc9\xb8\xa7\x9e\x07\xdb\xfe\x8d\x38\x7e\xac\x9e\xdb\x77\x33\x71\xf3\xc5\xa6\xef\x68\xe1\xbe\x6a\x1e\x36\xbc\x6f\xc1\xef\x57\x54\xf3\xb0\xd9\xfd\x21\xf2\xf5\x57\xf3\xb0\xd1\xfd\x21\xf2\x3d\x23\x1e\xd0\x77\xe2\xc4\x68\xcb\x18\xde\xcc\x57\x9a\x60\xa9\x91\x67\x5f\x06\x66\x33\x90\xaa\x68\xaf\x99\x50\x9b\xde\x7f\xec\xa8\xdc\xc7\xf9\xd7\xd4\x61\x95\xea\xe6\x86\xdf\x9b\xd5\xe7\xeb\x78\xa4\xc5\x23\xc7\xe1\xaf\x92\x6a\x9f\xd7\x78\xa0\xc5\xdf\x84\xd5\x47\xea\xe8\x3f\x5e\xf6\x35\x96\xfc\xb5\x5d\xf0\x2b\xaa\x78\xcc\xc6\xbe\x9e\xd1\xa7\xab\x78\xcc\xc2\xbe\xbb\x44\x7b\x9c\xc3\x43\xf6\xf5\xdd\x25\x8a\x79\x05\xcf\x50\xad\x4c\x58\x87\x08\x3e\x82\xa5\x8a\x93\x63\xf0\x79\xf3\x2e\x78\xed\xbe\x31\xc6\x95\x4d\x1e\x2d\x61\xaf\x38\xed\x0a\xa7\x3c\x8b\xfa\x45\x0c\x81\xf2\xa1\x19\x1f\x21\x3e\x7b\x78\x69\xeb\x97\x91\xc3\xd0\x93\x04\x34\xbc\x13\xc0\x57\xd5\x37\x8a\x80\x86\x77\x56\xf5\x55\xf5\x8d\x22\x80\x88\x63\x9c\xb3\x7c\x92\x00\x22\x8e\x67\xeb\x1b\x45\x00\x11\xc7\xb3\xf5\xe1\x04\xe0\x83\xa6\xc3\xd6\x3a\x62\xc0\x79\xae\x3c\x6a\x6a\x4f\xd5\x36\xa6\x3c\x6a\x68\x4f\xd5\x36\xa6\x3c\x6a\x66\x5f\x27\xc9\x9e\xf2\xa8\x91\x7d\x9d\x24\x47\xd5\x66\x98\xd8\xd7\x49\x32\x45\x7c\x8e\x7a\x05\xb9\x5f\xb0\xf6\x20\xff\x84\x64\xfb\x09\x38\xa2\x79\xbe\xbe\x51\x04\x06\xd8\x3b\x7f\x6d\xfb\x20\x81\x01\xf6\x1e\xa9\x0f\x27\xe0\x3e\x19\x37\x50\xbf\x39\x33\x79\x46\xbc\x7d\xe5\x1d\xd3\x7b\xba\xb6\x31\xe5\xfb\x79\x7b\x46\xb4\x7d\xe5\xfb\x79\x7b\xa4\x36\xb4\xfc\x80\x1e\x9d\x59\x9d\xfb\x49\x45\xc6\xc5\x7d\x9b\xd1\xac\xfc\x00\xfd\x4e\x86\xdc\xfe\x04\x9f\xf7\xc5\xa8\x7c\xb4\x89\xa9\xc3\x6e\x2e\x52\x7d\xcd\xc2\x5b\x8b\x62\x05\x75\x75\xcb\x60\x60\x7e\x31\x1b\x9a\xe2\xda\x14\xc5\x37\x23\x64\x66\x8a\xe1\xc6\x54\xec\x79\xa5\x98\x03\xd5\xcd\x06\xd8\xc5\x46\x06\xe0\x05\x08\x47\xef\x25\x1b\xfc\x98\x35\x96\xe6\x48\x21\x0e\xd3\x7b\x54\x34\x08\x45\x75\xff\x02\x7a\x4e\xd4\xc2\x78\x24\xf3\xf8\xde\xb4\x5e\xb2\x0f\x0a\xa7\x97\xe4\xb3\xf2\xb1\x89\xaa\x73\x22\xc8\x91\x4c\x80\xf1\x19\x4f\xff\xae\x30\xf4\xb0\x67\x3f\xe5\x47\x4d\xa8\x8f\xe4\xd3\x56\x64\x11\xe5\xa7\x31\x90\x93\xa1\x26\xc0\x27\x9f\xfe\x0d\x58\xe8\x81\xd3\x1e\xb2\x0f\x0a\xc7\x4f\xef\x59\xc9\xd8\x14\xd5\x39\x07\xe4\x74\x2a\xc0\x78\xe4\x33\xb0\xfb\x09\x3d\xf7\xda\x4f\xf9\x41\x11\xf5\x92\x7c\x56\x4a\x36\x51\x79\x96\x00\x39\x24\x6b\x43\x3c\x32\x1a\xd8\x6a\x84\x9e\xbe\xed\x25\xfc\xa0\x88\xfa\x28\x3e\x2b\x21\x49\xf3\x33\xcd\xf3\x9b\xf1\x44\xac\xb9\x9d\x7d\x17\x6f\x9f\x3a\x00\x6b\xba\x49\x3a\xef\x7e\x1e\x3f\x19\x3b\xb0\xcf\x66\x00\xca\xdb\x15\xb0\xcd\xf5\xff\x71\x2d\x5b\xe4\x31\x05\x5b\x6b\xe0\xf0\x29\x2f\x3f\xcd\xf5\x76\x9c\xd9\xc2\x79\x37\x8f\xdd\x98\xc1\x70\xcd\xc5\xba\xe3\xc0\x86\xb1\x00\x1f\x3f\xd6\x6f\xbe\x42\xd8\x73\x65\x87\xf7\xd2\xa8\x28\x8a\xf8\xe9\x5c\x6b\xb7\x51\x14\x30\x47\x59\x56\x24\xc9\xda\x2f\xbb\x70\xb6\x3f\x66\x79\x4b\xeb\x1d\xc9\xab\x33\xf9\x49\xa4\xff\x32\x8b\x3e\x08\x3e\xe4\x95\x38\xfc\x0f\x6b\xdb\x97\xaa\xa1\xff\x46\x16\x5d\xd9\x12\xaf\x6c\x19\x7d\xb8\x1f\xae\x6d\x5b\x16\xf2\x46\x03\x79\xc9\x29\xa4\xa4\x6d\x69\x17\xa9\xbd\x30\xc6\x5b\x44\xa4\xaa\x28\xa9\x49\x91\xc8\x93\x18\x97\x32\x25\xf9\xb4\xac\x68\x01\x8f\xa7\x88\x3c\xeb\x4a\x1b\x3d\xaf\x65\x97\x5f\x18\x8f\xd3\xf2\x57\x7b\xf7\xe0\xa5\x50\xbe\x71\x46\xbf\xb7\x2d\xb7\x9f\xc1\x87\x43\x97\xd1\xe0\x3b\xc0\x7b\xe3\xb5\x46\xc6\x58\x78\x24\x29\x0d\x44\x03\xd2\x8c\xe4\xe5\xe9\x66\x9d\x72\x3e\x96\xf5\x85\x5f\x95\x9b\x93\x96\xfe\x14\x4d\xa6\xb3\xe5\xfb\x0f\xfb\xe9\xa5\xe9\xcd\xef\x2d\xeb\x9e\xa2\x76\xaa\x0c\xc2\xb9\xb8\x53\xa4\xbc\xb6\xfb\xe9\xa5\xfc\xdd\x82\xab\xbf\x11\x6c\x69\x21\x4b\x1f\xce\x00\xe1\x08\x29\xa1\xac\x78\x48\x3e\x51\x9f\x70\x22\x9f\x64\xba\x8e\x60\x55\xe2\x1e\xcf\x71\x1e\x7b\x94\x27\x86\x58\x31\x71\x85\x2f\x52\x6e\xec\x19\x1d\x7d\x33\x93\x91\x6a\x0e\x42\xb3\x0f\xee\x68\x83\xef\x4a\x9c\x57\x6f\xc1\x16\x0c\x81\x70\x53\xa2\x0f\x63\x70\x9b\x67\xd5\x4e\x5f\xcd\xf3\xe6\x18\xef\xb4\x03\xa7\x75\x59\xc1\xb7\x75\xc7\xf6\x98\x05\xf2\x54\x66\x37\xde\x40\xfa\xac\x97\xdc\xe4\x00\x13\xe1\xe3\x8b\x56\xa1\x2a\x96\x15\xb7\x31\xa3\x92\x28\x06\x9e\xcb\xec\xdd\x68\xf9\x03\x7b\xe3\x69\x69\xbe\xa4\x1e\xaf\xd4\x2d\x40\xda\x2c\x38\x4d\x79\x87\x8b\xf9\xa8\xfb\x4c\x83\xcc\x3d\x93\xce\xbe\x56\x49\x53\x35\x8e\xed\x16\x75\xac\x4c\x39\x25\xc3\x26\xc5\x9a\x17\xbe\xf8\x65\xba\xf2\x80\xdd\x6a\xc9\x3c\xb8\x71\xc7\x03\x77\x47\xf8\x02\x9b\x37\xdc\xae\x22\x08\x0f\x6d\xf1\x31\x34\x1e\x3e\x63\xaa\x76\x0f\xad\x45\x48\x39\xb9\xfe\x46\x49\xf0\xbb\xc5\xdc\x32\xcc\x8d\x7f\xd4\xbf\xda\x97\x30\xf7\xbc\x60\x66\x75\x72\x9e\xb5\x8a\xf4\xa5\x1e\xec\xaa\xae\x80\x5d\x81\x04\x3a\x36\xda\xd1\xd4\x93\xaa\x7d\x3d\xcd\x03\x92\x15\x34\xf2\xd1\xbe\x79\xc7\x07\xf6\xce\xdf\x76\x3b\x33\x78\xcf\x25\xdf\x5b\x8e\x0f\xdb\xb2\xcc\xdb\xcc\xe8\x84\xe4\xd0\x94\xf9\xb5\xa5\xd6\xa3\xd6\xe0\x78\x21\x7b\x87\x3d\xcb\xbb\xae\x21\x1f\xce\xef\xb9\x0f\x24\x0e\x17\xfb\x11\xdd\x4f\x70\x62\xf5\xbb\x2d\x0e\xdf\x9a\xf8\xb6\xb4\xae\x4b\x9a\xce\x0d\x2b\x5d\xb2\x4b\x5b\x14\xd4\x3d\xb7\x69\x82\xc5\x61\x50\x09\x16\x6f\x67\x1b\xa4\x7b\x28\x9b\xa7\x46\xb9\xed\xf9\x29\x4f\xb3\xc2\xbe\x06\x6d\x16\xc1\x3b\xff\x36\x43\x37\xa8\x8c\x3c\xfb\x67\xbc\x99\x6e\x9e\x87\x94\x8c\x90\xba\x2e\x3f\x23\xaa\x07\x17\xbe\x44\xf6\xdc\x16\xd9\x27\xce\x4f\xb6\xb2\x4e\x6e\x29\x26\x00\x55\xd9\xa3\xf9\x32\x7a\x6f\xdf\xa6\x6e\x0c\x9a\x9c\x05\xf9\xe0\xb0\xb5\xf5\xd8\x1c\xea\x8d\xba\x18\x8d\x81\x0a\xbf\x8a\x3e\xb3\x1e\x6f\x05\xea\x68\xe8\x93\x35\xa0\xd4\x59\x48\x34\x7a\xbf\xb7\x5f\xdf\x64\x66\xee\xad\xc9\xaa\x8d\x6f\x0d\xc0\xea\xc3\xa4\x25\xab\x03\xaf\xf3\xfb\xeb\x8b\x64\x8d\x7b\xe3\xfb\x25\x5a\x9d\x7c\x3d\xd3\xad\x70\xb4\x31\x38\x95\xd9\x2b\x50\xa4\x3a\xd4\x24\xcc\x3a\xbf\x41\x15\x5e\xbd\x79\x4d\x62\x4c\x25\x55\x59\xb1\xf7\x28\xdc\xbe\x69\xb0\x6f\xce\x86\x62\x3d\x46\x8b\xc7\x67\xd5\xe8\xb2\x5e\x99\x7e\xdb\x76\xd6\xec\x7e\x27\xcf\x24\xb3\x67\x32\xe7\x4e\x40\xd9\xbb\x60\xdf\x66\x02\x2a\x2f\x16\x77\x8b\x8f\x00\xd9\x37\x9b\xd6\x17\x92\x2b\x61\x3a\x9e\x82\x4f\xc1\x65\xae\xef\x50\xbf\xcc\x77\xfd\x81\x9d\xef\xba\x00\x2b\x1f\x4e\xd4\xac\x27\x45\x16\xf6\x1d\xaf\x0b\xb0\x80\x5f\xc0\x05\xfc\x06\x0f\x9a\xac\xbb\x9f\x9e\x69\xe7\xa1\xfb\x01\x6a\x50\x43\x46\xa0\xcd\x4e\x2f\x48\x74\x14\x22\xe0\xaf\xc1\x0a\xc4\x4b\xc8\x0c\x7d\x02\xfe\xde\x91\x63\x8b\x5a\xad\x3d\x7f\xf8\x3a\xff\x62\x57\x09\x0e\xc0\xc4\x2e\x93\x82\x29\x1b\xc7\xef\x28\x13\x2f\xa7\xbc\xb3\x6c\x44\x12\xc6\x87\xa5\x38\x76\x3a\xae\x6c\x8e\x3b\xc2\x1b\x17\xe6\xea\x54\xcb\x62\xd9\x7c\x4f\xdc\xc9\x60\xf2\x6e\x30\x22\xf8\x57\xdc\x06\xef\xf6\x5a\xb7\x7b\xc7\xe2\x46\x33\xc7\x6e\xaa\xb5\xac\x5f\xb6\xdc\x72\x3b\xbc\xc5\x56\xbf\x89\xc1\x80\x0f\xea\xb0\x9c\x8e\x79\x67\xb0\x91\x0e\x84\x80\x33\x82\xb4\x9c\x77\x4c\x56\xbf\x90\x5a\xf4\x00\x33\x56\x93\x39\x85\xf1\xda\x36\x0e\x00\xe1\x23\xb7\xd1\x54\x2b\x03\x2a\x5c\x09\xd1\xc3\x0b\xd2\x6c\xb1\x8e\xf2\x6b\x7b\x90\x39\xab\xe9\x5d\x79\xa8\x6c\xf9\xb0\x76\x9f\xb6\xb9\x30\x41\x3d\xa6\xcf\x37\x44\x60\x24\x7b\x95\x6d\xf0\x81\x34\x5a\x5c\xbf\xf2\x40\xf5\x3c\x38\xa2\x0d\xe3\x1e\x26\xa4\x2e\xaf\x0d\x76\xa1\xbc\xce\x13\x13\x72\x77\x5d\x0c\xaf\xab\x31\x5f\xbf\xb7\x0b\xbf\x84\xec\x30\x9e\xe5\x82\x5d\x7a\x48\xf0\x4c\x5e\x31\x28\xae\xdf\x0d\x98\x43\x1e\xc8\xc7\x2b\xe7\xd7\xf5\xa2\x39\xfc\xe6\x5e\xcb\x83\xb8\x34\xc4\xd9\x5f\x27\xbd\xa0\x6f\xad\x9b\x5a\xd5\xf4\x15\x5e\xb2\x83\x53\xbc\xc9\x3d\x6d\x0f\x10\xf6\x4d\x7b\xfa\x14\xd0\x91\xbb\x09\xbf\x8d\xe5\x33\xc2\xb2\xe3\xf8\x08\x30\x8b\xc4\x99\x12\x13\x04\x5f\x6b\x78\x63\xf9\x2c\xa0\xaf\x16\x81\x33\x88\x01\x5c\xd7\x03\xea\x32\x1f\x9a\xfa\xa9\x85\x87\x90\xc9\xf2\xfd\x98\x20\xba\xf9\x99\x60\xf0\x9a\x4e\xf7\xd3\x00\xbc\x35\x74\xf5\xc1\x65\x9c\x8b\x60\xf4\x45\x5b\x4c\xe0\x8c\x8d\x69\xd3\x96\xd5\x4f\x76\x9c\x23\x88\x3e\xf8\x32\xa3\x28\x8a\x3f\x04\x9d\xf0\x3e\x8c\xb8\x1d\xab\x2d\x03\x26\xf2\x09\xa4\x3f\xf1\xd0\x34\x49\xd6\xb4\xa2\xa4\xdd\xf1\x7f\xa6\x6f\x52\xba\x55\x5d\x9e\xb2\x74\xf7\x5f\xff\xd7\xdf\xba\x2a\xff\x21\x63\xc3\xe1\xdf\xb3\xa4\x2e\x9b\xf2\xd8\x86\xaa\xfa\xa6\x25\x75\xfb\xd7\xae\x21\x4d\x5b\xff\xf2\xe3\x0f\x9b\x88\xff\xef\xc7\x49\x40\x8b\xd4\xc8\x88\x74\xc6\x7f\x17\x85\xff\xf1\xa5\xa2\xbf\xc4\x98\xa4\x0d\x23\x62\xa1\x65\x15\x34\xfd\x16\xc2\xe7\xb2\xf0\xcb\x7f\xf9\x95\xc2\x17\xf4\xa1\x42\xfe\x00\xe1\x47\x3e\xe1\x6f\x1e\x10\xbe\xfa\xe8\x05\xd3\xf9\xf7\x2f\x15\xee\x76\xba\x18\x8c\xda\x8c\x0a\x76\xc1\x5a\xc4\x9b\xab\xdd\xb8\xe4\xb2\x20\x32\xc1\xf8\xaa\x32\x4f\xf9\x97\xea\xcc\x10\xc9\x99\xbe\xd6\x25\x9f\x4e\x8c\x43\x72\x8b\xc3\x87\xa6\x6e\x12\x21\x17\xa4\xcb\x3d\xfe\x88\xe1\x83\xed\xc0\x59\x55\x73\x35\x2f\xbd\xf1\x4d\xe7\x0d\x12\x2b\xf5\x1e\x8a\x83\x92\xbe\xc9\x58\x5e\xf5\x86\xdd\xf7\xac\x16\x9c\xc8\x14\x8e\x8d\xc9\x47\x72\xc9\xf2\x2f\xbb\x86\xd6\xd9\xb1\x97\x0b\xf8\xee\xe3\x8f\xff\x9c\x45\xf3\xed\x8f\xbd\xb2\x40\xcb\x90\x1f\x2d\xef\x94\x66\x09\x69\xcb\xba\x41\xb4\x2b\x97\x1b\xec\xe9\x02\x39\x4f\x56\xb1\x87\xe5\x5e\x86\xc2\xc1\xe4\x79\x1e\xbd\x87\x6f\x46\x8e\x78\x00\x0b\x61\xc9\x7d\x0e\x6b\x6a\x2e\x24\x63\x43\xe6\x86\x88\x75\xac\xa3\x63\xb4\x68\x77\xd3\xed\x76\x8b\x3d\x00\x60\x3e\x35\x67\xbc\x6b\xe2\xff\xb2\x6c\x84\x6a\x82\x7f\x22\x8f\x40\x19\x43\x9a\xd5\x79\x8d\x16\xc9\xc9\x91\x8a\x07\x88\xa6\xcc\x8c\xa6\xcc\x7c\xb7\x8f\x98\xba\x96\x6f\x22\x38\x4a\xe3\x73\x8b\xa5\x9c\xd8\x77\xbf\x99\x7b\x2e\x74\xe8\x68\x6f\x3e\xa9\x61\x5d\x3f\x68\xe2\xbf\xe9\x4c\x81\x33\xcd\xbe\xc6\xdc\xcc\xb2\xec\x8b\xfc\xa8\x07\x41\xbe\xc3\xb0\xe6\xed\xde\x63\xfb\xfe\xdc\xb0\xc3\xb9\xd3\xf7\x97\x4e\xdf\xb7\x5f\x5a\x99\x5b\xeb\x15\xa5\x58\x86\x9d\xa9\xf5\xd9\xcc\xe8\x53\xc6\x03\x31\x78\x4f\x36\x77\xf1\xde\xc3\x24\xa7\xa4\x3e\x66\x6f\x62\x30\x98\xe8\x04\xb6\xf4\x9a\xe8\x47\x53\x34\x42\xa5\x40\xc8\xf4\x98\x5f\xb3\xd4\x05\x8a\x74\x01\xef\xd6\x75\x12\xa2\xd6\x78\x93\xb0\x73\xd4\xd3\x73\x59\x67\xbf\x77\xc5\xf2\x80\x27\xf0\x9b\x41\x24\xbc\x0f\x23\xc8\x1c\xda\x4e\xb6\x65\x7e\x20\x9a\x63\x33\xcd\x80\xf1\xab\x3d\xe4\x73\x48\x2f\x3a\xcd\x2a\xe8\x47\x09\x52\x05\x79\x55\x05\xba\xdf\x75\xb2\xc9\x83\xf8\xd3\xca\x14\x1f\x73\x01\x46\xa6\xda\x50\xb9\xeb\x0a\x82\x55\xba\x80\xb3\xc7\xe9\x14\x88\xff\xa5\xb2\xe4\x76\x2d\x23\x5f\x25\x09\x90\xf9\x65\x54\xc1\xac\x44\x77\x4d\x2e\x87\x61\xb6\xbd\xfc\xde\x63\x42\x1e\x83\x31\x0c\x63\x84\x31\x20\x8a\x1e\xa5\x54\x43\x5d\xb6\x8a\x50\x9d\x78\xa4\x6f\x49\xd9\x95\x2b\x26\x44\x21\xaf\x4e\x28\xbb\x43\xd9\x9e\xef\x21\x1f\x20\xc5\x77\x66\x3b\x0a\x3a\xe2\x25\x1d\xf3\xba\x59\x63\xb3\xd7\x9f\xb2\x4b\x55\xd6\x2d\x29\xda\xbb\x71\x69\xad\x7e\xb1\xc1\xcc\x3f\x67\x29\xb5\xe2\x12\x66\x66\x73\x2e\x3f\xdb\x5c\x99\xb9\x59\x21\xbe\xee\xde\x8c\x0f\xbe\x72\x6b\x14\x1b\xb6\x19\xf1\x6e\x08\xdb\x45\x3f\x47\x01\xd9\xbb\x01\x5c\x38\xba\xf7\x3e\xe5\xad\x76\x6b\x31\xb6\x53\x5a\x78\x18\xdf\x3b\xfc\x98\x6c\x93\xe3\x31\x7b\x03\xbb\x4a\xee\x7f\x99\x5e\x9a\xe9\x6b\x46\x3f\x77\x30\x31\x5e\xa7\xf4\x35\x4b\x28\x77\x2c\xf7\x50\xb4\x75\xfa\xd6\x4c\xd4\xef\xcd\x45\xff\x7e\x49\xf5\xef\xf9\xc9\x27\x52\xff\xe3\xff\x9a\xbe\x57\xe2\xac\x53\x61\x40\xde\xdb\xda\xda\x9b\x37\xad\xcb\xcf\x26\xa1\xb3\xd9\x9c\x36\xf5\x97\x4b\x68\x9e\x1b\x05\xbd\x9b\x1f\x84\x1f\x56\xad\xda\x6e\x63\xab\x55\xcd\x65\x64\xab\x0c\xa0\xd3\x2a\x98\xe7\x6f\x55\x73\x31\x5b\xe5\x94\x1b\x6e\x15\xdf\x16\x01\x5b\x15\xc7\xdd\x0c\xd1\x68\xd6\x25\x1d\xd9\x2c\x03\xe8\x34\x0b\xe6\xf9\x9b\x75\x49\xcd\x66\x39\xe5\x86\x9b\x15\xb3\xbd\x04\x46\x03\x0c\x4b\xed\x6f\x80\x01\x74\x1a\x00\xf3\xfc\x0d\xc8\x4f\x66\x03\x9c\x72\xde\x06\x38\xbd\x85\x77\x6b\xd3\x5e\x41\x47\x7b\xd8\x52\x05\xc5\xe6\xf2\x00\xc5\x01\x2b\x11\x24\x0d\x3d\x0d\x93\x54\x1a\x12\x85\xfd\x43\x89\x1e\x92\xaa\x3a\x2b\xda\x81\x11\x87\x63\x3c\x45\xfa\x55\x6f\x63\x1d\xed\x23\xd9\x7e\x03\x60\x60\xd3\x06\xb0\xd2\x1e\x33\x10\x4d\x10\x82\xe9\x6d\xf4\xfd\xdf\xfe\xdf\x00\x00\x00\xff\xff\xdf\xbf\xcf\xa1\x7a\x86\x01\x00") func pagesAssetsStylesBootstrap311MinCssBytes() ([]byte, error) { return bindataRead( @@ -210,7 +210,7 @@ func pagesAssetsStylesBootstrap311MinCss() (*asset, error) { return a, nil } -var _pagesAssetsStylesBootstrapTheme311MinCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xe4\x5a\x4b\x6f\xdb\xba\x12\xde\xe7\x57\xe8\xa2\xb8\x68\x53\x58\xb2\x1e\x76\x6c\xb9\x68\x16\xb7\xb7\xb8\x08\xd0\xde\xcd\xc9\xe2\x6c\xf9\x92\x23\xd4\x96\x0c\x89\x4e\x52\x04\xfe\xef\x87\x0f\xc9\x96\x6c\xd2\xb4\x29\xcb\x59\xb4\x44\x4e\x8e\x28\xea\x9b\xe1\xc7\xe1\x70\x66\x98\xe1\xe7\x7f\xdd\x38\x9f\x9d\xff\xe4\x39\x2d\x69\x01\x56\xce\x73\xe4\x05\x5e\xe0\x7c\x7a\xa2\x74\x35\x1b\x0e\xe7\x84\xc2\xfa\x9d\x87\xf2\xe5\x2d\x1f\xfd\x2d\x5f\xfd\x2e\xd2\xf9\x13\x75\x42\x3f\x08\x5c\xf6\x9f\x91\xf3\xf8\x92\x52\x4a\x8a\x81\xf3\x90\x21\x8f\x0f\xfa\x91\x22\x92\x95\x04\x3b\xeb\x0c\x93\xc2\xf9\xf9\xf0\x28\x41\x4b\x8e\x9a\xd2\xa7\x35\xe4\x78\x43\xfa\x02\xcb\xe1\x56\xc4\x10\x2e\x72\x38\x5c\x82\x92\x41\x0d\x7f\x3c\x7c\xfb\xfe\xff\xbf\xbe\x73\x91\xc3\x9b\x1b\x0f\xd2\xcc\xc5\x24\x01\xeb\x05\x1d\x88\x87\x55\x91\x2e\x41\xf1\x5b\x3e\x94\x6b\x84\x48\x59\xca\x87\x34\x4b\x72\xf9\x7f\x2f\xa0\xc8\xd2\x6c\x2e\x1f\x30\xc8\xe6\xa4\x78\xa3\xe4\x95\xba\xe5\x13\xc0\xf9\xcb\xcc\x77\xdc\x60\xf5\xea\xf8\x4e\x31\x87\xe0\x93\x3f\xe0\xcd\x0b\x6f\xbf\xb8\x2f\x04\xfe\x4a\xa9\x0b\xf3\xd7\x7a\x68\xca\x66\x43\xd9\xc8\xc6\xf8\x70\x3c\x1e\xd4\x3f\x5e\x30\xbe\x1d\xc8\xb7\xfc\xa7\x89\xe7\x4f\xc6\xb7\x5f\x2e\x86\xb4\x69\x32\x31\x03\x88\xa6\xcf\xa4\x45\x48\xab\xaf\xe2\xa5\xd5\xc7\xe9\x69\x75\x54\x2c\xb5\xfa\x24\x59\xed\x2e\x29\xd3\x53\xc8\xf4\x14\x32\xbd\x7d\x99\x9e\x42\xa6\x77\x28\xb3\xea\x7a\x3b\xb2\x06\x11\xe3\x65\xbc\xc7\x4d\x10\xaa\x59\xd6\x8d\x15\x3c\x36\xe7\x57\xcb\x85\x00\xfd\x9a\x17\x39\xb3\x5b\x97\xcd\x6d\x4e\x66\x59\x9e\x91\x16\xeb\x87\x43\x6a\x5d\x17\x69\x46\x40\xe1\xce\x0b\x80\x53\x92\xd1\x4f\x34\x5f\x0d\x3e\x24\x49\xe2\xf8\x83\x0f\xc4\xe7\xcd\x09\x7c\xff\xdf\x4c\xd1\x7d\x84\xc3\x2f\x1d\x98\x53\x9a\x2f\xd5\xdf\x27\xe9\x82\xed\x91\xd9\xaa\xc8\xe7\x29\x9e\xfd\xf7\xef\x07\x0e\xf2\x58\x80\xac\x4c\xf2\x62\xe9\xfd\x4c\x51\x91\x97\x79\x42\xbd\x2d\x60\x49\x41\x41\xbf\xe5\x8b\xbc\x60\x5b\xed\xeb\x47\x8e\x2a\xfe\x7d\x1c\x38\x24\xc3\xad\x17\x52\x12\x7b\xf1\xbf\xea\xe3\xc7\xdf\x2b\xf2\xd5\xb7\x91\x4a\x32\x00\x17\x04\x7f\x4d\xc0\xa2\x24\xad\x69\x17\x64\x45\x00\x9d\xc9\x5f\xee\x2b\x5b\xba\x82\x39\x0a\x17\x71\x45\x66\x1f\x30\xe4\xed\x4b\x7b\xaf\xca\x0d\xc3\x35\xdf\x1b\x8d\x10\x6a\x6f\x8b\xa7\xfc\x99\x39\xa3\x56\x57\x92\xa3\x75\xd9\x5c\xb9\xea\x5b\x39\xd9\xa6\x66\xab\xbc\x4c\x69\x9a\x67\xc2\x3b\x30\xd3\xd1\xef\xb8\xf6\x8e\x38\x02\xae\x98\xdb\xa6\xb9\x7f\xce\xb4\xa8\x51\x38\x85\x08\x70\xa3\x08\xf1\x1d\x02\xa1\x85\x51\x69\x20\x2e\x61\x57\x12\x5a\x61\x57\x52\xd2\xbb\xda\x55\x08\xef\xee\x62\xd0\xe2\xbe\x69\x2c\x75\x97\xce\x58\xe4\x0c\xcc\xc6\xa2\x72\xc5\x6d\x57\x79\x04\x5c\xab\x70\xe5\x58\xcf\x34\x96\x31\x82\xd3\x31\xe2\x2b\x3d\x0a\xe2\xbb\x51\x60\x61\x2c\x1a\x88\x4b\x18\x8b\x84\x56\x18\x8b\x94\xf4\xae\xc6\x12\x91\x69\x12\x91\x16\xf7\x4d\x63\xa9\xbb\x74\xc6\x22\x67\x60\x36\x16\xd5\x19\xdd\x3e\x43\x8f\x80\x6b\x15\xe6\x27\xee\xb9\x96\x02\x91\x8f\x89\xf0\x09\x00\x40\x6c\xe3\x56\x34\x10\x17\xb1\x14\x01\xad\x72\x2b\x42\xd2\xfb\xba\x95\x29\x18\xa1\x78\x47\x7c\xd3\x4c\xc4\xb3\xd6\xa1\x08\xdd\xcd\x36\x72\x10\xb3\x35\x02\xaa\x23\xb0\x5a\x25\xab\xf0\xeb\xdc\x48\xc6\x07\x78\x24\x56\x97\xc0\x38\x0a\xee\x6c\x82\x19\x35\xc4\x45\xe2\x19\x01\xad\x8a\x67\x84\xa4\x77\x35\x10\x12\x4d\x71\x10\xb5\xb8\x6f\xda\x48\xdd\xa5\x0d\x52\xc4\x0c\xcc\x66\xa2\x8a\xe4\xdb\x91\xf6\x11\x70\xad\xc2\x55\xe2\x74\x9e\xad\xe0\x78\x1c\x8d\x44\xe0\x8a\x82\x90\x84\xc0\xc2\x56\x34\x10\x97\xb0\x15\x09\xad\xb0\x15\x29\xe9\x5d\x6d\x05\xc6\x21\x0a\xa7\x4d\xea\x5b\xf1\xac\xec\xd1\x59\x8a\xd4\xff\x84\x70\x56\x91\xdf\xb5\xd2\x2f\x3d\xb4\x52\x59\x96\xd1\x2f\x61\x06\xd2\xc5\xc0\x4b\x97\x73\x77\xfb\xa8\x4a\xe3\x64\x24\x1f\x1a\xd2\x64\xfd\xa8\x8d\x87\x8b\x7c\xc5\xc6\x64\xee\x92\x64\xeb\xfb\x45\x7a\x0f\x6a\x8a\x14\x6f\x0e\xa8\x3a\xc5\xd3\x8d\x79\x13\x6e\x6a\xca\x9b\x8d\xa7\x33\x42\xec\x9b\xc1\x45\x9c\xa0\x90\xaa\x72\x82\x42\x09\x85\x61\x2b\x1c\x82\x18\xba\xcf\x72\x65\x18\xf7\x60\x9f\xe4\xed\x0b\xf5\x1a\xec\x5e\xdb\x2c\xc4\x2e\x4f\x89\xc6\x13\x02\x71\xa7\x54\x47\x07\xd1\xc7\x42\x68\xb3\x20\xa9\xc4\x49\x0b\x21\x87\x6e\xbc\x0c\x3c\x43\x36\xb9\x4e\xe5\x87\x64\xca\x9b\x7d\xf9\x41\xf7\x7d\x2f\x46\xac\xab\x4c\x48\x25\x7a\xf1\xce\xd2\xab\xf1\xb7\xeb\x72\x36\x5a\xbd\x76\xab\x01\xee\x57\x9c\xec\x6b\x80\x2a\xa4\x7d\x8b\x70\xea\x67\xf6\x6b\xb7\xdf\xce\xb4\x13\x02\x79\x13\x4b\x1d\xf1\x66\x61\x2a\x66\x88\x3e\xac\x45\x4a\x55\x59\x8b\x50\x42\x61\x2d\x86\xd2\x62\x7c\xe2\xe2\xe9\xc6\x6e\x97\x07\xb2\x89\xe0\x41\x73\x71\xf8\x81\xf4\xa6\xaa\x6a\x1d\x9a\x40\xd8\x00\x4a\x33\xe6\x58\x4b\x45\x6d\xf2\xe8\x8a\x46\x88\x37\x91\x8c\x85\x36\xc9\x9c\xe1\xfb\x3e\xd6\x52\x8a\x54\x25\x79\xe2\x5f\x0f\x3b\x7f\x9f\xe3\x8b\xec\x25\xce\x17\xa7\x6d\xca\x9b\x05\xf3\x86\xef\xfb\x60\x7e\x4b\xf0\x01\xf3\x42\x89\xee\xbb\xe8\x48\x7d\x5e\x31\x54\xbb\x2c\xed\x3d\xa5\x5a\x34\xc5\x1e\x53\xdd\xf2\x34\x64\x30\x36\x68\x8a\x5c\xbe\x74\x75\x57\x92\xbe\x12\xac\xe8\x91\x2b\xf4\xd6\x3e\x2e\xfc\x8d\x07\x16\xa4\xa0\xa7\xee\x6c\xab\x0b\xa6\x70\x7b\x24\x1c\xc4\xc4\xe7\x9d\x2d\x47\x81\xaa\x99\x58\xd6\x1a\x31\x4b\xc2\xf1\x54\x64\x6c\x53\x32\x86\xc8\x26\xe9\x33\x42\xf4\x61\xfd\x52\xaa\x2a\x1f\x14\x4a\xa8\xa2\xb5\x76\x1a\x14\x62\x08\x82\x9a\x3c\x8b\xda\x1b\x8e\x09\x4e\x26\x7c\xda\x30\x66\xa7\xba\xcd\x3d\x91\x19\xa2\x17\xe6\x84\x54\x05\x73\x52\x09\x23\x73\x31\x40\x09\x01\x35\x73\x96\x75\x29\x94\x4c\x49\x24\xa3\x54\x92\x20\xab\x4b\x36\x23\x44\x2f\x81\xae\x90\xaa\x0c\x74\xb9\x12\x46\xf2\x92\x31\x99\xc4\xa4\x26\xcf\xaa\x4e\x93\x84\x98\xc8\x8a\x2d\x99\xf0\xc3\xd7\x86\x3b\x23\x44\x2f\xdc\x09\xa9\xaa\x4c\x57\x28\x61\xe4\x0e\x23\x30\x01\x93\x8d\xc7\x95\x28\xce\x77\x75\x8d\x58\x57\x26\xfa\x9d\xc2\x65\x0d\xc4\x75\xc3\xe5\xba\x74\xb0\xc7\xdb\x8e\x22\x97\x9d\x83\xf6\xf9\xbb\x3f\x09\x40\xdc\x2d\x7f\xd7\x40\x5c\x37\x7f\x17\x4a\x98\x68\xea\x7e\x59\x37\x8a\xf1\x68\xd4\xed\xb2\x4e\x03\xd1\x07\x5d\xfa\x7b\x3c\xa1\x84\x91\xae\x4e\xd7\x55\x51\x00\x7d\x6c\xb3\x03\xcd\x10\xbd\x70\xa5\xbb\xc9\x92\x4a\x18\xb9\xea\x7c\x79\x83\xe2\x49\x90\x74\xbb\xbc\xd1\x40\xf4\xe2\xe8\xb5\xf7\x3a\x42\x09\x23\x5d\x5d\xaf\x2f\xe2\xc8\x0f\xad\x22\x59\x23\x44\x3f\xf1\x98\xee\x66\x43\x28\xa1\x62\x6b\x91\x96\xd4\xe5\x2a\xad\xde\x4e\x2a\x83\x75\xaf\xdf\xef\x24\xba\x29\x25\xcb\xed\x5f\x81\xa9\xfb\xeb\xba\xb2\xe6\xad\x2c\x2b\x2b\x13\xbe\xea\xc4\x38\x5c\xb6\x53\xcf\xac\x70\x32\x85\x36\x21\x91\x19\xe2\xba\x67\x96\x50\xc2\x18\x12\xc9\x61\x6c\xfb\x80\x8c\x9c\x73\x73\x73\xd2\xc2\xf3\x75\x17\xc0\x75\xd5\xf2\xbe\x7a\x7c\x22\x4c\xa7\xf3\xdd\xd9\x1f\x73\x43\x53\xd3\x56\xfd\x01\x51\x37\xda\xfe\x9c\xfb\x94\x9a\xb6\x2a\x10\xeb\x46\xdb\xae\x2a\x81\x7d\x12\x23\x9b\xbf\x7c\x30\x43\x5c\xb5\xb0\x21\x95\xd0\xd3\xc6\x03\xb2\x8e\x9c\x6d\xeb\x11\x68\x44\xec\x2e\x14\xcc\x10\x57\x2d\x69\x48\x25\xf4\x9c\x55\x81\x59\x47\xc7\xb6\xab\x44\x80\x24\x44\x36\x91\x87\x19\xe2\xba\xc5\x0c\xa1\x84\x9e\x36\x19\xa0\x75\x64\x6d\x57\x83\x80\x08\xd9\xb1\x66\x84\xb8\x6e\x19\x43\x28\xa1\x62\xed\x85\x2c\x16\xe7\x56\x2b\xe4\x01\xd7\xa9\x5a\x61\x84\xe8\xa5\x5a\x51\x1f\x8a\xa7\x56\x2b\x0e\xaa\x3c\xbc\x99\xea\xed\xd1\x61\xb0\x32\x38\x72\x39\xab\x2d\xb7\x9f\x8b\xb3\xb9\xf9\x27\x00\x00\xff\xff\x3b\xfc\x2f\xb1\x82\x33\x00\x00") +var _pagesAssetsStylesBootstrapTheme311MinCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x5a\x4d\x6f\xdb\x38\x13\xbe\xe7\x57\xe8\x45\xf1\xa2\x4d\x61\xc9\xfa\xb0\x63\xcb\x41\x73\xd8\x6e\xb1\x08\xd0\xee\x65\x73\xd8\x2b\xbf\xe4\x08\xb5\x25\x81\xa2\x13\x17\x81\xff\xfb\x82\xa4\x64\x4b\x36\x69\xda\x94\xe5\x1c\x1a\x21\x68\x45\x51\xcf\x8c\x1e\x3e\x24\x67\x86\x19\x7e\xfe\xdf\x8d\xf3\xd9\xf9\x23\xcf\x59\xc9\x28\x28\x9c\x97\xc8\x0b\xbc\xc0\xf9\xf4\xcc\x58\x31\x1b\x0e\xe7\x84\xc1\xfa\x99\x87\xf2\xe5\x2d\xef\xfd\x35\x2f\x7e\xd1\x74\xfe\xcc\x9c\xd0\x0f\x02\x37\xf4\x83\x91\xf3\xf4\x9a\x32\x46\xe8\xc0\x79\xcc\x90\xc7\x3b\x7d\x4f\x11\xc9\x4a\x82\x9d\x55\x86\x09\x75\x7e\x3c\x3e\x49\xd0\x92\xa3\xa6\xec\x79\x05\x39\xde\x90\xbd\xc2\x72\xb8\x35\x31\x84\x8b\x1c\x0e\x97\xa0\x64\x84\x0e\xbf\x3f\x7e\xfd\xf6\xf7\x3f\xdf\xb8\xc9\xe1\xcd\x8d\x07\x59\xe6\x62\x92\x80\xd5\x82\x0d\xc4\x4d\x41\xd3\x25\xa0\xbf\xe4\x4d\xb9\x42\x88\x94\xa5\xbc\x49\xb3\x24\x97\xff\x7b\x05\x34\x4b\xb3\xb9\xbc\xc1\x20\x9b\x13\xfa\xc6\xc8\x9a\xb9\xe5\x33\xc0\xf9\xeb\xcc\x77\xdc\xa0\x58\x3b\xbe\x43\xe7\x10\x7c\xf2\x07\xfc\xf2\xc2\xdb\x7b\xf7\x95\xc0\x9f\x29\x73\x61\xbe\xae\xbb\xa6\x59\x49\x98\xe3\x3b\x8d\xfe\xe1\x78\x3c\xa8\x7f\xbd\x60\x7c\x3b\x90\x4f\xf9\x6f\x13\xcf\x9f\x8c\x6f\xef\x2f\x86\xb4\x69\x32\x31\x03\x88\xa5\x2f\xa4\x45\x48\xab\xad\xe2\xa5\xd5\xc6\xe9\x69\x35\x54\x2c\xb5\xda\x24\x59\xed\x26\x69\xd3\x53\xd8\xf4\x14\x36\xbd\x7d\x9b\x9e\xc2\xa6\x77\x68\xb3\x6a\x7a\x3b\x32\x06\x51\xb1\x76\xc6\x7b\xdc\x04\xa1\x9a\x65\x5d\x5f\xc1\x63\xf3\xfb\x6a\xbb\x10\xa0\x9f\x73\x9a\xaf\x32\xec\xa6\x4b\x30\x27\xb3\x2c\xcf\x48\x8b\xf5\xc3\x2e\xb5\xaf\x8b\x34\x23\x80\xba\x73\x0a\x70\x4a\x32\xf6\x89\xe5\xc5\xe0\x43\x92\x24\x8e\x3f\xf8\x40\x7c\x7e\x39\x81\xef\xff\xff\xf6\xfe\x00\xe1\xf0\x4d\x07\xe6\x8c\xe5\x4b\xf5\xfb\x49\xba\x60\x84\xce\x0a\x9a\xcf\x53\x3c\xfb\xf3\xdf\x47\x0e\xf2\x44\x41\x56\x26\x39\x5d\x7a\x3f\x52\x44\xf3\x32\x4f\x98\xb7\x05\x2c\x19\xa0\xec\x6b\xbe\xc8\x69\xc9\xe8\x97\x8f\x1c\x55\xfc\x7c\x1c\x38\x24\xc3\xad\x07\xd2\xd2\xc7\x81\xf3\x57\xf5\xf2\xd3\xaf\x82\x7c\xf1\x6d\xac\x92\x0c\xc0\x05\xc1\x5f\x12\xb0\x28\x49\xeb\xb3\x29\x29\x08\x60\x33\xf9\x8f\xbb\xbe\x87\x39\xc5\x84\xba\x88\x3b\x32\xfb\x80\x21\xbf\xee\xdb\x73\x55\x4e\x18\xee\xf9\x5e\x6f\x84\x50\x7b\x5a\x3c\xe7\x2f\x84\xb6\x54\x3b\x4b\x72\xb4\x2a\x9b\x23\x57\xbd\x2b\x3f\xb6\xe9\x59\x91\x97\x29\x4b\xf3\x4c\xac\x0e\xe3\x62\xad\x9f\x71\xed\x19\x71\x04\x5c\xf1\x6d\x9b\xe6\xfc\x39\x53\x51\xa3\x70\x0a\x11\xe0\xa2\x08\xf1\x1d\x02\xa1\x85\xa8\x34\x10\x97\xd0\x95\x84\x56\xe8\x4a\x5a\x7a\x57\x5d\x85\xf0\xee\x2e\x06\x2d\xee\x9b\x62\xa9\x9b\x74\x62\x91\x5f\x60\x16\x8b\x6a\x29\x6e\x2f\x95\x47\xc0\xb5\x0e\x57\x0b\xeb\x99\x62\x19\x23\x38\x1d\x23\x3e\xd2\xa3\x20\xbe\x1b\x05\x16\x62\xd1\x40\x5c\x42\x2c\x12\x5a\x21\x16\x69\xe9\x5d\xc5\x12\x91\x69\x12\x91\x16\xf7\x4d\xb1\xd4\x4d\x3a\xb1\xc8\x2f\x30\x8b\x45\xb5\x47\xb7\xf7\xd0\x23\xe0\x5a\x87\xf9\x8e\x7b\xae\x52\x20\xf2\x31\x11\x6b\x02\x00\x10\xdb\x2c\x2b\x1a\x88\x8b\x28\x45\x40\xab\x96\x15\x61\xe9\x7d\x97\x95\x29\x18\xa1\x78\x47\x7c\x53\x26\xe2\x5e\xbb\xa0\x08\xdf\xcd\x1a\x39\x88\xd9\x1a\x01\xd5\x11\x58\xad\x93\x55\xf8\x75\x6e\x24\xe3\x03\x3c\x12\xa3\x4b\x60\x1c\x05\x77\x36\xc1\x8c\x1a\xe2\x22\xf1\x8c\x80\x56\xc5\x33\xc2\xd2\xbb\x0a\x84\x44\x53\x1c\x44\x2d\xee\x9b\x1a\xa9\x9b\xb4\x41\x8a\xf8\x02\xb3\x4c\x54\x91\x7c\x3b\xd2\x3e\x02\xae\x75\xb8\x4a\x9c\xce\xd3\x0a\x8e\xc7\xd1\x48\x04\xae\x28\x08\x49\x08\x2c\xb4\xa2\x81\xb8\x84\x56\x24\xb4\x42\x2b\xd2\xd2\xbb\x6a\x05\xc6\x21\x0a\xa7\x4d\xea\x5b\xf1\xac\x6c\xd1\x29\x45\xfa\x7f\x42\x38\xab\xc8\xef\x5a\xe9\x97\x1e\x5a\xe9\x2c\x7b\x5e\x2d\x61\x06\xd2\xc5\xc0\x4b\x97\x73\x77\x7b\xab\x4a\xe3\x64\x24\x1f\x1a\xd2\x64\x7d\xaf\x8d\x87\x69\x5e\xe0\xfc\x35\x73\x97\x24\x5b\x3d\x2c\xd2\x07\x50\x53\xa4\x78\x72\x40\xd5\x29\x2b\xdd\x98\x5f\x62\x99\x9a\xf2\xcb\x66\xa5\x33\x42\xec\xcb\xe0\x22\x8b\xa0\xb0\xaa\x5a\x04\x85\x13\x0a\x61\x2b\x16\x04\xd1\x75\x9f\xe5\x4a\x18\x0f\x60\x9f\xe4\xed\x03\xf5\x18\xec\x1e\xdb\x0c\xc4\x2e\x4f\x89\xc6\x13\x02\x71\xa7\x54\x47\x07\xd1\xc7\x40\x68\xb3\x20\xe9\xc4\x49\x03\x21\xbb\x6e\xbc\x0c\xbc\x40\x40\xbb\x95\x1f\x92\x29\xbf\xec\xcb\x0f\xba\xf7\x7b\x11\xb1\xae\x32\x21\x9d\xe8\x65\x75\x96\xab\x1a\x7f\xba\x2a\x67\xa3\x62\xdd\xad\x06\xb8\x5f\x71\xb2\xaf\x01\xaa\x90\xf6\x15\xe1\xd4\xf7\x19\x78\xd9\xcd\xb7\x33\x75\x42\x20\xbf\xc4\x50\x47\xfc\xb2\x90\x8a\x19\xa2\x0f\xb5\x48\xab\x2a\xb5\x08\x27\x14\x6a\x31\x94\x16\xe3\x13\x07\x4f\xd7\x77\x3b\x3c\x90\x82\x0c\x0f\x9a\x83\xc3\x37\xa4\x37\x55\x55\xeb\x50\x02\x61\x03\x28\xcd\x5e\x08\x2d\x15\xb5\xc9\xa3\x23\x1a\x21\x7e\x89\x64\x2c\xb4\x49\xe6\x0c\xef\xf7\x31\x96\xd2\xa4\x2a\xc9\x13\x3f\x3d\xcc\xfc\x7d\x8e\x2f\x32\x97\x38\x5f\x9c\xb6\x29\xbf\x2c\x98\x37\xbc\xdf\x07\xf3\x5b\x82\x0f\x98\x17\x4e\x74\x9f\x45\x47\xea\xf3\x8a\xae\xda\x61\x69\xcf\x29\xd5\xa0\x29\xe6\x98\xea\x94\xa7\x61\xa3\x64\x80\xa5\xc8\xe5\x43\x57\x37\x25\xe9\x9a\x60\x45\x8b\x1c\xa1\xb7\xf6\x76\xe1\x6f\x3c\xb0\x20\x94\x9d\x3a\xb3\xad\x0e\x98\xc2\xed\x96\x70\x10\x13\x9f\xb7\xb7\x1c\x05\xaa\xbe\xc4\xb2\xd6\x88\x93\xc4\xc7\x53\x91\xb1\x4d\xc9\x18\x22\x9b\xa4\xcf\x08\xd1\x87\xfa\xa5\x55\x55\x3e\x28\x9c\x50\x45\x6b\xed\x34\x28\xc4\x10\x04\x35\x79\x16\xb5\x37\x1c\x13\x9c\x4c\xf8\x67\xc3\x18\x93\xc4\xe6\x9c\xc8\x0c\xd1\x0b\x73\xc2\xaa\x82\x39\xe9\x84\x91\xb9\x18\xa0\x84\x80\x9a\x39\xcb\xba\x14\x4a\xa6\x24\x92\x51\x2a\x49\x90\xd5\x21\x9b\x11\xa2\x97\x40\x57\x58\x55\x06\xba\xdc\x09\x23\x79\xc9\x98\x4c\x62\x52\x93\x67\x55\xa7\x49\x42\x4c\x64\xc5\x96\x4c\xf8\xe6\x6b\xc3\x9d\x11\xa2\x17\xee\x84\x55\x55\xa6\x2b\x9c\x30\x72\x87\x11\x98\x80\xc9\xc6\xe3\x4e\xd0\xf3\x97\xba\x46\xac\x2b\x13\xfd\x4e\xe1\xb2\x06\xe2\xba\xe1\x72\x5d\x3a\xd8\xe3\x6d\x47\x91\x0b\xc1\xb9\xf2\x6a\x24\xdf\xfe\x24\x00\x71\xb7\xfc\x5d\x03\x71\xdd\xfc\x5d\x38\x61\xa2\xa9\xfb\x61\xdd\x28\xc6\xa3\x51\xb7\xc3\x3a\x0d\x44\x1f\x74\xe9\xcf\xf1\x84\x13\x46\xba\x3a\x1d\x57\x45\x01\xf4\xb1\xcd\x0c\x34\x43\xf4\xc2\x95\xee\x24\x4b\x3a\x61\xe4\xaa\xf3\xe1\x0d\x8a\x27\x41\xd2\xed\xf0\x46\x03\xd1\xcb\x42\xaf\x3d\xd7\x11\x4e\x18\xe9\xea\x7a\x7c\x11\x47\x7e\x68\x15\xc9\x1a\x21\xfa\x89\xc7\x74\x27\x1b\xc2\x09\x15\x5b\x8b\xb4\x64\x2e\x77\xa9\x78\x3b\xa9\x0c\xd6\xbd\x7e\xbf\xb3\xe8\xa6\x8c\x2c\xb7\x7f\x05\xa6\x6e\xaf\xeb\xca\x9a\xa7\xb2\xac\xac\x4c\xf8\xaa\x1d\xe3\x70\xd8\x4e\xdd\xb3\xc2\xc9\x14\xda\x84\x44\x66\x88\xeb\xee\x59\xc2\x09\x63\x48\x24\xbb\x6d\xbc\x02\x64\xe4\x9c\x93\x9b\x93\x06\x9e\x8f\xbb\x00\xae\xab\x96\x0f\xd5\xed\x33\x01\xd8\x62\x39\xfb\x6d\x4e\x68\x6a\xda\xaa\x3f\x20\xea\x46\xdb\xef\x73\x9e\x52\xd3\x56\x05\x62\xdd\x68\xdb\x55\x25\xb0\x4f\x62\x64\xf3\x97\x0f\x66\x88\xab\x16\x36\xa4\x13\x7a\xda\x78\x40\xd6\x91\xb3\x6d\x3d\x02\x8d\x88\xdd\x81\x82\x19\xe2\xaa\x25\x0d\xe9\x84\x9e\xb3\x2a\x30\xeb\xb8\xb0\xed\x2a\x11\x20\x09\x91\x4d\xe4\x61\x86\xb8\x6e\x31\x43\x38\xa1\xa7\x4d\x06\x68\x1d\x59\xdb\xd5\x20\x20\x42\x76\xac\x19\x21\xae\x5b\xc6\x10\x4e\xa8\x58\x7b\x25\x8b\xc5\xb9\xd5\x0a\xb9\xc1\x75\xaa\x56\x18\x21\x7a\xa9\x56\xd4\x9b\xe2\xa9\xd5\x8a\x83\x2a\x0f\xbf\x4c\xf5\xf6\xe8\x30\x58\x19\x1c\x39\x9c\xd5\x96\xdb\xcf\xc5\xd9\xdc\xfc\x17\x00\x00\xff\xff\x3b\xfc\x2f\xb1\x82\x33\x00\x00") func pagesAssetsStylesBootstrapTheme311MinCssBytes() ([]byte, error) { return bindataRead( @@ -230,7 +230,7 @@ func pagesAssetsStylesBootstrapTheme311MinCss() (*asset, error) { return a, nil } -var _pagesAssetsStylesContainersCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\xfb\x59\x93\xa3\x58\xb6\x2d\x8c\xbe\xef\x5f\x11\x77\x6f\xbb\x66\xe7\x1c\x2a\x8a\xbe\xcb\xb4\xfb\x40\x23\x44\x27\x1a\x09\x01\xe2\xe5\x1a\x3d\x48\xf4\x9d\x80\xb2\xfd\xdf\xbf\x25\x77\x0f\x8f\xc8\xcc\xa8\xcc\xaa\x7d\x3e\xb7\x54\xb8\x0b\x56\x33\xd7\x5c\x73\x8e\x39\xc6\x82\xfc\x8f\xbf\xe7\x6d\x9b\x57\xe9\xd7\xa5\x1c\xe7\xb0\x2a\xf7\x70\x2a\xdb\xe6\xeb\xd4\xb6\x55\x14\x0e\xff\xc8\xda\x66\xfa\x3a\x96\x7b\xfa\x0b\x8a\x20\xff\xdf\xff\xfe\xd3\xc6\x5f\xfe\xf4\xee\xd7\x74\xed\xda\x61\xfa\x5a\xbe\x37\xfa\xdb\xff\x0b\x43\x25\xe1\x14\xfe\x5f\x8d\x53\x4c\x75\xf5\x35\x6e\x93\xf4\x1f\x75\x38\xe4\x65\xf3\x75\x28\xf3\x62\xfa\xe5\xef\x68\x5a\xff\xf9\x52\xbf\xf7\x7c\xd9\x52\x85\xcd\xdb\xdd\x77\x6f\x3d\xd3\xb7\x41\xa2\xb6\x4a\xfe\x62\x90\xf6\xf1\x35\x9a\xa7\x09\x74\xec\xc2\x24\x29\x9b\xfc\x17\xac\x5b\xff\xa2\xcf\x34\x94\x61\x03\x6e\xff\xa3\x6b\xc7\xf2\x75\xe7\x97\x30\x1a\xdb\x6a\x9e\xd2\x5f\xdf\x8d\x47\x7e\x9d\xda\xee\x17\xe4\x2f\x86\x89\xc3\xee\xfd\x7b\x18\x81\xb1\x9e\x65\x32\x15\x6f\x3b\xfc\xeb\x37\x4b\x90\x5f\xdf\x5d\x02\xfe\x88\xda\x21\x49\x87\xcf\x3f\xc0\xb2\xab\x2a\xec\xc6\xf4\x97\x6f\x7f\xfc\xc5\x5c\x63\x1d\x56\xd5\xd7\xa4\x0c\xab\x36\xff\x98\x8a\x44\x90\xbf\x5c\x69\x54\xe6\xbf\xed\xc4\xfc\x0b\x9d\x7e\x9c\xeb\xcf\x43\xe3\xc7\xf1\xff\xe8\xcb\x28\x8c\x1f\xf9\xd0\xce\x4d\xf2\x5a\x6e\x3b\xfc\xf2\x5f\x31\x9a\xb0\x59\xf6\xcd\x19\x68\xb7\x7e\x01\x4d\xcb\xe4\xcb\x7f\xe1\x21\x49\xd3\xc4\xa7\xe3\x98\x7f\xcb\xc6\xaf\xd1\xbf\x6e\x26\x68\xfb\x8f\x3f\xda\x95\x24\xc9\xaf\x7f\xb4\xff\x2d\x06\x7e\xad\xd2\x6c\xfa\xcb\x50\xf8\x8d\x39\x53\x39\xfd\x55\x6e\xfe\x68\xd1\x5b\xf3\x9f\x18\x95\x22\x69\x92\xa5\xbf\x7e\x7c\x43\x10\xe4\xd7\x78\x1e\x46\xf0\x77\xd7\x96\xcd\x94\x0e\x3f\x7a\xeb\xbb\xf5\x43\x5a\x81\x99\x96\xf4\xd7\x1f\x50\x07\xeb\xa6\x5f\x7f\x9f\x56\xbf\x2e\xe9\x30\x95\x71\x58\x7d\x05\xc6\xe5\xcd\x2f\x75\x99\x24\xd5\xbf\x13\x85\xc0\x4c\x60\x45\x33\xfd\xeb\x0b\xfd\xe8\xf0\x93\xa5\x66\x20\x28\xbe\xad\x86\x00\xab\xf9\xd1\xd8\xa6\x1d\xc0\xac\xbf\xb6\xc0\xde\xac\x6a\x9f\xbf\x84\xf3\xd4\xfe\xdb\xbb\xf1\x35\xae\xda\xf1\xdf\xdd\x93\xf7\x4e\x3f\x98\xfb\xcb\x34\x84\xcd\xd8\x85\x03\x58\xc5\x97\x79\xa8\xfe\xd7\x5b\x83\xff\x7f\xd4\xae\x7f\xcf\xcb\xec\x7f\x7f\x69\xda\xaf\x43\xda\xa5\xe1\xf4\x65\x8c\x07\x90\xd7\x5f\xe2\xf4\x6d\xa3\x8a\xf7\x95\xa0\xe4\x8f\x1b\xf5\x3b\xc8\x41\x41\x5e\xbe\x45\xdc\x6b\x37\x3f\xb0\x84\xfc\xf7\xd2\xe0\xc3\xbf\x5f\xca\x6c\x08\xeb\x7f\x63\xb1\xbf\xed\xf7\x23\xba\x7c\xb3\x9c\x7e\xfb\xf2\x87\xb4\x8d\x2a\xe0\x9a\xff\xfe\x7b\x5c\x84\xc3\x34\x7e\x2d\x9b\xaa\x6c\xd2\xaf\x51\xd5\xc6\x8f\x7f\xfc\x31\x1e\x93\x72\x04\x20\xbf\xfd\xf2\xb5\x6e\xf7\xcf\xb6\xed\xfa\x79\xfd\xc7\xee\xff\xfd\x7f\xbe\xbc\x8a\xc3\x97\x9f\x0d\xfd\xb7\xff\xf3\x4b\x56\x0e\xe3\xf4\x35\x2e\xca\x2a\x81\xfe\x69\xbb\x7f\xfc\x76\xe0\x4f\x33\xeb\xb4\x99\x7f\xdc\xd3\xb7\xe0\xfb\x8e\xca\x6f\x30\x15\xc7\x5f\xfe\x8b\xa2\xa8\x8f\x7f\xc0\xd7\x6f\x0d\xc6\x69\xab\xd2\x5f\xde\x56\xff\xed\xd2\xc7\x5e\x01\xff\x7c\xa4\x67\x92\x66\xe1\x5c\xbd\x67\xdc\x47\xf4\x7e\x41\x71\xe0\x34\x0e\x94\x9d\xea\x6f\x23\x08\xa1\xaf\x63\x3a\x94\xd9\xf7\xea\xd0\xce\xd3\xcb\x46\xd0\xba\x49\x7f\x4c\x84\x2f\xc8\x4f\xe2\xe5\xe5\xbd\x24\x5d\x7f\xc1\x00\x24\x20\xbf\x59\xd6\xb7\x4a\xf8\xe3\xea\x00\xb4\xbd\x85\x2a\x0c\x8f\x63\xf5\xf7\x7c\x9c\xc0\x6e\xc4\x7f\x8f\xdb\x1a\x4e\x93\x72\x6a\x07\xf8\xbd\x0f\xc0\xc5\xbf\x77\x4d\xfe\xbf\xbf\xbc\x07\xf0\xd7\xf5\x0b\x88\xc5\x2f\x2f\xec\xfb\x5e\xba\xfe\x39\x12\x55\x25\xd8\x8f\x77\xdf\xbc\x2d\xe1\x63\x61\xa0\x12\xff\x7c\x69\xa0\xbe\xa6\x2b\xe0\x1e\x69\xdc\x0e\x6f\x61\xf9\x7e\xfb\x9f\x40\xd2\x1f\x57\xf8\x15\x8c\x0a\x5c\x0f\xc2\xe7\x6f\x3f\xbb\x5b\x36\xcd\xfb\xdd\x7f\xfc\xf3\x6d\xfb\x58\x4c\x18\x86\xbf\x9f\x16\x2c\xfc\xcf\xe7\xfc\xc7\xef\xaa\xfa\xf7\x10\x78\xed\xd7\xb7\x25\xfe\x74\x8c\xef\x96\x7d\x1b\xe3\xcb\x57\xf4\x33\xb5\x3e\x06\x42\xbe\xbc\x2e\x7d\x1b\xe8\x15\x39\x20\x14\x7e\x9f\x12\x3f\x1f\xf5\xad\x58\xbd\x46\xfc\xb3\xe6\xc3\xf4\xf3\xeb\xdf\x17\xf8\x39\xcc\x07\x38\xbd\x61\xee\xff\x60\xc4\xef\x86\xfd\x38\xce\x3f\xcf\xdf\xbf\x5c\xd4\xbf\xd6\xf5\xaf\xcd\x79\x1b\xf2\x77\xeb\xfb\xe5\x97\xa1\x6d\xa7\x9f\x75\xfc\xc7\x1b\xaa\x7c\x60\x21\xf2\x27\x0d\x7f\x74\xe1\xbf\xda\xe5\x07\xa3\xfe\xd5\x2e\x1f\xc4\xf3\x37\x1d\xde\x81\xe6\xcf\x7a\x25\x43\xdb\x25\xed\xf3\xa7\xdd\x7e\xda\xbe\x1c\x5f\xc4\x36\xf9\xb1\x5e\x97\x75\x98\xbf\xe7\xf2\xff\xa7\xac\x5f\xfa\x21\x6c\xa6\x5f\xdb\x2e\x8c\xcb\x69\xfb\xe5\xef\xf8\xaf\x6f\xe0\xfe\xc3\xf7\xac\xac\x80\x43\x7e\x09\xab\xae\x08\xff\xd7\xc7\xf5\xff\x1f\x8e\xfc\xef\x3f\x9d\xf0\xcf\x3d\xfb\xd3\x8c\xff\xd3\xae\x9f\x1e\xfe\xf7\xbb\x7e\x78\xfa\xdf\xef\xf8\xe9\xec\x0f\x9c\xc1\x71\xfc\x07\x8f\xfd\x16\x83\x58\x96\xfd\x7e\xef\xcf\xd2\xec\xdb\x8c\x7f\x56\x02\x7f\xba\x83\xdf\xf1\xf8\x05\x2d\x3f\x18\xf2\x89\x56\xbf\xbd\xfe\xd3\xed\x29\x5e\x14\xec\x7f\xb0\x37\xff\xbc\xdf\x1f\x70\xfa\x9b\x43\xe2\x0c\x94\x5e\x36\xfd\xf8\x87\x0e\xb3\xbf\x30\x2d\x8c\x5f\x14\xe3\xa7\xb3\xb7\x5d\xda\xfc\x84\x71\x46\x51\xf4\xa3\x3e\xf9\xac\xb2\x51\x0b\x7a\xd5\x6f\x85\xef\xa7\x33\x65\x6d\x3c\x8f\xff\xa3\x10\xfd\xb3\x9e\xff\xc4\x11\xa0\x38\x36\xf9\xcf\x0b\xe0\x37\x08\xf8\xbe\x81\x6f\x74\x01\x14\xa0\x7f\xb1\x9a\x7d\x06\xe8\x8f\xe4\xf4\xbd\xfe\xd0\xaf\x82\xf4\x9d\x42\xfc\x29\x7b\x78\xff\xf5\x41\x2a\xdf\x19\xc4\x77\x16\xfc\x15\x67\x98\xb7\xa2\xf8\x2f\xda\xf4\x4d\x0b\xbf\x1f\x21\xfc\xd4\x8b\xbf\x6d\xf2\x3f\xd8\x86\x7f\x61\x80\xdf\x17\xe9\x8f\x13\x8d\x9f\x57\xf4\xcf\xf1\x5e\x21\xf3\xe7\x33\xbe\x5a\xfc\x45\xd5\xf8\x98\xf0\x9b\xe6\xfc\x1f\x8d\xf6\x07\xf3\xdf\x47\xfb\x06\x3a\xdf\x4a\xdf\x37\xe9\x0d\xe8\xef\x5f\x4f\xf4\xd3\x06\x45\x1a\x3f\xfe\xd5\x80\xfe\xfd\xac\x80\x96\xfe\x66\xd6\x72\x4a\xeb\x7f\xfc\x40\x30\xff\x9a\x3c\xff\x13\xce\x89\xfc\x86\x3f\xd3\x69\xfd\x96\x18\xd8\x9b\xaa\x2a\xc0\x2c\x5f\x81\x7e\x8b\x5f\x5d\x9e\x43\xd8\xfd\xc1\x84\xdf\x7f\x7f\x51\x89\x6f\x39\xf6\xbe\x06\x30\xe2\xb7\x19\x3e\xe2\x02\x7b\x3b\xad\xf8\xd1\x09\x4d\xfb\xe6\x1b\xb0\xfc\x2f\xbf\x1f\xf0\x6f\xbf\x6b\x58\x02\xf1\xf5\x87\x46\xbf\x9d\x11\xc5\xfe\x38\x7e\x18\xc7\x69\xf5\xcf\xfb\x7d\x18\x86\xfc\xae\xe3\xdb\x8a\xbe\xa9\xf0\x7f\xc7\xd9\x7f\x1c\xe5\xa7\xc5\xef\xed\xce\x9b\x69\x7f\xfb\x37\x3a\xfc\xce\x20\xa0\xb6\xfe\x09\xda\xff\xc5\x38\x2f\x57\xfe\xe3\xff\x96\x8b\xbc\x8d\x54\x00\xf7\x55\x7f\x80\xa0\xf7\x5b\xaf\x62\xf6\xb3\x13\x24\x2a\x65\x33\xe6\x77\x85\xfd\xb7\x17\xdf\x63\x35\x01\x05\x26\xfd\xa3\x78\xfc\xae\x1c\xbe\xbe\x97\xa0\x17\xef\xff\xbc\xf4\x3a\x17\xc0\x7f\xba\x99\x1f\x71\xf6\x47\x43\xdf\xbc\xf1\x83\x9d\xef\x90\xfc\xcb\x27\x38\x7f\x1e\x4a\x50\x60\x9e\xb7\x38\xa3\xfe\xe4\x74\xe2\x45\x90\x7f\x2e\xcf\xbe\x9d\x55\x50\x3f\x33\xef\xf7\x44\xfc\x2f\x6c\xfe\x69\xf3\xb7\x85\xbc\x19\xf8\x66\xc4\xbb\x3d\x3f\xce\xd6\xbe\x9f\xc2\x8e\x69\x95\xc6\xd3\x4f\x03\xec\xf7\x13\xfe\x65\x8f\xdf\x39\xef\xff\xa6\x04\x92\xaf\xf4\xfd\x82\xfc\xd1\x37\x6f\x79\xf2\x8f\xef\x14\xf0\xd7\xa4\x1c\x80\x39\x2f\xe7\x57\xd3\xf0\xeb\xf7\x15\x7f\x2f\xf1\x7f\xb6\x43\x1f\x92\xfa\x7d\x6b\xde\x2e\xfd\x8b\xdb\xf1\x6e\xc7\x47\x8d\xf8\x61\xb7\x7f\x18\xee\x0f\x6c\xe8\xad\x63\xdd\xa4\x75\xdb\x94\x31\x48\x17\x90\xbd\xbf\x17\xf4\xc0\x6d\xe9\xf0\x87\x83\x97\xdf\x76\x1c\xd3\x2e\x04\xcd\xdb\xe1\x47\x37\xfc\xe6\xdc\xf2\x7b\x0a\xbc\x19\xf8\xd2\xc1\xff\xf1\x1f\x7f\x7f\xed\xc1\xd7\x2a\x8c\x00\x04\xfe\xe3\x3f\xbe\x80\x9f\x3f\x1c\x6e\xfe\xc7\x7f\xff\xc7\xdf\xe7\xa6\xfc\x6d\xab\x8f\x49\x98\xb7\x9f\x5f\xbf\x77\x7c\x4f\xcc\x72\x02\x8b\x8d\xdf\x7a\xbe\xd3\xc9\xaf\x71\x37\xff\xd3\xf1\x7f\x18\x0f\x79\xfb\x79\xeb\x58\x36\x7f\xe8\xfa\xbb\x49\x41\xa3\x21\x7c\x7e\x7d\xad\x60\xfc\x71\xf0\x2c\xac\xcb\x6a\xfb\xe5\xcb\x7f\x0a\xed\x3c\x94\x80\x2f\x1b\xe9\xf3\x3f\xdf\xa7\xf9\xb1\x6c\x7d\xe9\x86\xf4\xeb\xab\x72\xbd\x4f\x07\x22\xe0\xe3\x54\xef\x75\x5e\xf9\xdb\x19\xa5\xb7\x9f\xb7\x76\x1d\x10\x6d\x40\xf0\x85\x60\x47\xbe\x14\xe8\x47\xb3\x27\x40\xa0\xb7\xa1\x7e\xf9\x12\x0d\x69\xf8\xf8\xfa\xba\xf0\xd6\xfc\xed\x79\xc6\xd7\xa1\x7d\xfe\xd4\xc0\xf8\xdd\xc0\xff\xfc\xdb\x97\xff\x04\xbb\xd8\xbe\xd9\xf5\x9f\x3f\x7a\xf3\xb5\x75\x5f\xde\xe8\xe4\xdb\xc5\x1f\xe2\xe8\xcb\x5b\x78\xbd\x5f\xfe\x1d\x98\xbc\x8e\x9b\xde\x6f\x7c\x1c\x37\x7d\xf9\x1c\xe0\x47\x16\xf3\x05\xff\xdd\xd5\xf7\x80\xfd\xc3\xe5\x17\x60\xfe\xe1\xe2\x07\xb0\xbe\x5f\x07\xeb\x1c\xe7\xe8\x55\x7b\xc2\xf2\xc5\x55\x3e\x4e\x0b\x01\x73\xe9\xe6\xe9\x63\xe1\xbf\x99\x99\xf8\x36\xda\x3b\xe0\x7d\x21\x90\xf7\x61\xfe\xab\x6a\xf3\xf6\xa3\xc3\x07\xa6\x7e\xc1\xde\xce\x4b\xff\x60\x10\xf6\x79\xf5\x8f\xc0\xfc\x1d\x33\xfe\xd0\xe2\xdd\xa3\x1f\xa6\xfe\xe1\xee\x27\x20\x7c\x3b\x6d\xfe\x7d\x83\x77\xcd\xfe\x82\xb0\xff\x7c\x3d\xec\xfb\xe5\xed\x3b\x0c\x70\x0a\x90\xfc\x31\xa5\x88\xbf\x95\x2e\x6f\x9e\x9f\x88\x76\xcc\x5b\x0e\xfc\x18\x97\x6b\x71\xb8\xe6\x1c\xc7\xd3\xd7\xd7\xd7\x52\xe0\x14\xf0\x5b\xe0\x31\xbb\xc3\xc1\x1f\xda\xc5\xab\x44\x1b\xe5\xf7\xeb\x23\x11\x94\x43\x25\xd9\xfb\x6d\x35\x9d\x1b\xa6\x3b\xca\x7c\xb2\x39\x2e\x35\xfa\xe4\x8a\x27\xb7\x07\x1c\x7b\xd6\x04\xe3\x81\xcd\x7a\xf6\x74\x7f\x8e\x41\x32\xe6\x36\x57\x2a\xd4\x53\xd9\x78\x3e\x68\x0b\xe1\xc2\x1d\x8f\x87\x03\xaf\x72\xeb\xcd\x53\x84\xea\x76\x95\xce\xc7\xf8\x22\xf9\x87\x7c\xba\x6a\x17\x15\x53\x88\x9e\x6b\xe7\x63\xc2\x97\x6d\x11\x96\xa8\x1b\x9b\x26\x91\xe1\x5a\x8a\x66\xfe\xb0\xd0\x29\x4e\xa3\xf0\xcc\x90\xe4\xde\xc0\x27\xf0\xef\x13\xe2\x0e\x67\xa5\x7e\xa4\x61\x19\xe6\x1c\x79\x6d\xaf\x8c\x39\xe5\xd9\x1d\x61\x95\xf5\x54\xb3\x39\xa7\xb8\x17\x93\x3b\x28\xbc\x58\x6f\x8c\xda\xf0\x31\x58\x9f\xc5\x89\xa9\x5f\x40\x89\xce\xc1\x30\x77\x5c\xa2\x27\x27\x70\xb2\xe8\xea\xa5\x7d\x59\x21\x19\xce\xe9\xce\x56\xab\x98\x53\xd4\x03\x47\x08\xca\x85\x7c\x8e\xfc\x43\x52\xb8\x4d\x20\xaf\x1b\x6f\x73\x1b\x9f\x73\xa3\x64\xee\x01\xd7\x72\x15\x70\x4e\x24\x57\x8c\x5d\x2a\x5c\x9f\x23\x1c\x6d\x9d\x55\x2b\xbf\x72\x98\x56\x3b\x38\x1f\x83\xdf\x4a\xdc\xdb\x39\x77\xb7\x0f\x5c\x7d\x29\x64\x95\x53\xb9\xf9\xc9\xe7\xee\x4d\xba\xe8\x9c\xce\x3d\x73\x21\x1f\x0e\x5c\xa9\xe7\x0e\x37\xe4\x47\xce\x8b\x6e\xdb\xf9\xa9\x71\x8b\x7d\xe5\x92\x96\xbc\x3d\x38\x96\xbb\x01\xf3\xea\xab\x32\xee\x1c\x97\x9b\x60\x5f\xec\x95\x70\x76\xfb\x04\x7a\x98\xf9\xc9\xd0\x60\x42\xab\xb2\x58\xf1\x88\x0b\x77\xe0\x9e\xa7\xd9\xdd\x83\x44\x47\xee\xa7\xeb\xac\xfa\xf6\xb1\xc9\x36\xc6\x14\x4b\x25\xd5\x85\x48\x97\x84\xdb\x39\xee\x0e\xc7\x9b\x4a\x0a\x5a\x5c\x91\xe3\xfd\x80\xdc\x1b\x0e\xd9\x4d\x11\xac\xe3\xb8\x34\xe7\x67\x46\x10\x16\x29\x36\xe4\xec\x14\x64\x1d\x35\x91\x09\x23\x6b\xa8\x43\x21\xcc\x2f\xca\x9d\x28\x98\x04\x86\x16\xe5\x29\xf0\x1c\x67\x3b\x23\xbc\x60\x15\x5c\x91\xc9\x4d\x8c\x4f\x31\x3f\xca\x1e\x1c\x52\x55\xc4\x19\x9d\xc7\x1d\xef\x19\xe4\x22\x3b\xf6\xac\x73\x2f\x1f\xec\x74\xa9\xf5\xd4\xb9\x33\x36\x4f\xa5\xad\x2b\x2a\x16\x8f\xc4\x42\x3e\xea\xf4\xc5\x2d\xdb\x08\x79\x12\xc4\x08\xc1\xbb\x55\x44\x90\xa0\x67\x4b\x04\xda\xd1\x10\x86\x0f\x4f\x4e\x3e\x86\xb6\x5a\x4f\x4f\xcd\x14\x61\x5f\x2a\xa2\x26\x9c\xaf\x2d\xdd\x6c\xcf\xb3\x70\xf2\x68\x9c\xdc\x2c\x68\x25\x5c\x18\xbe\x11\x1d\x92\x2a\xc8\xe8\x3e\x47\xe9\x36\xac\x9e\x52\x13\x57\x41\x35\x56\xbc\x26\xaf\x9d\x74\x50\xe2\xda\x25\x0a\xbd\xcb\x76\x7d\x95\xc9\x88\x15\x02\x03\x17\x6d\x61\x2c\x1e\x30\xe7\x0c\x37\x79\x8a\xa7\xf1\x29\xd3\x33\x67\x6b\xba\x58\xdd\x2f\x49\xce\x73\xd9\x72\x9a\xee\x7c\xab\x3f\x6c\xce\x0e\x76\x7b\x4b\xb3\x98\xe3\x54\x13\x86\x6e\x2c\xa7\x3d\x0f\xdc\x1e\xa4\x0f\xe2\xc9\x71\x8b\x99\xdf\x7c\xad\xbc\x4a\xc8\x7e\x14\x80\x1f\xcf\x9a\xc0\x6b\x03\xcf\xf3\xcf\x9d\x97\xb4\x9d\x13\xbb\x9d\x97\xa3\x9d\x93\x9e\x6a\xc1\x3f\xce\x9c\x28\x38\x9c\xc5\xf3\x02\x3f\x5f\x38\x99\xeb\x8b\xa3\x1a\xf0\x47\x17\xec\xe6\x94\x1f\xa6\x88\x13\x8f\x3d\x77\xae\xe7\x83\x3d\x9d\x0e\xab\xc9\xe1\x0d\xc1\xab\x71\x9e\x4e\x4f\xe9\x19\xe4\x47\x95\x16\x8e\xfa\x76\x14\xec\x33\xbf\x71\xb9\x73\xbb\x1c\xa8\x92\x97\xca\xfb\x94\x97\x7b\x9e\xfb\xf5\x8d\x38\x28\xb5\xa4\x18\xaa\xc6\x75\x82\xd8\x95\xfc\xf9\xac\x8c\xfe\x2b\x08\x85\xfe\xaa\xf6\x0f\x17\x55\x14\x58\x99\xe2\xc2\x26\xef\xee\xca\x41\x9d\x18\x6d\x02\xb7\x95\xcb\xa6\x2d\x87\x78\xad\x94\xe3\x76\xb5\xad\x2b\xd7\xb8\xdc\x1c\xe6\xd9\xb1\x1d\x8e\xad\x6c\x9d\x13\xd1\xb6\xfc\x9b\xe0\xb5\xf5\x72\x3e\x82\xed\xb4\x6e\x02\xd6\xf6\xd9\xf9\x02\x15\x68\xc2\xf1\x6c\xd9\x92\xf7\xdc\x38\xac\x62\x1d\x9e\x30\x4f\x8a\xef\x4a\x22\xdd\x94\xea\x76\x2c\x23\x59\xaa\xad\xca\x13\x5d\xef\xbe\xbb\x77\xd9\xcd\xf1\xa4\xb8\x46\x4f\x95\x2c\xe8\x67\xfe\x00\x99\xce\x1d\xa0\xa7\xe2\xb7\xb6\xfd\xac\x37\xe1\xa1\xf2\xb2\x77\x58\x6f\x36\x95\x57\xb4\x60\x22\x87\xa1\x55\xdc\x67\x2d\x16\xa2\x2c\xa8\x9b\xe6\xf4\x07\x08\x51\xfd\xf6\x02\xc5\x67\xe2\x76\xef\xd7\x87\x54\x1c\x07\x21\x9a\x95\x33\x51\x34\xa5\x9b\xaa\x4f\xc2\xf1\x49\x43\x51\x39\x5a\x7d\xcc\x67\x53\x28\x0f\xd5\x43\x54\x55\x01\xa9\x86\x8b\x31\x29\x7a\x78\x76\x3a\x91\xbe\x1c\x8e\x75\xec\x08\xd1\xf0\x38\xe2\x2a\x3e\xdb\xca\xd8\x0a\xa3\xa2\xa6\xe7\x89\xe4\xac\xc7\x01\xba\x40\x4c\x23\x92\x7a\x7c\x35\x47\x4f\x21\x1e\x4f\xb5\x2d\xcf\x97\x4e\xb5\x2f\x97\xbb\x5b\x59\xd0\xf5\xd0\x05\xcc\x66\x77\x75\xde\x57\xb2\xd1\x07\xf4\x55\xd0\x7a\xc5\xec\xd8\xf0\xe2\x61\x79\x52\x71\xcb\x95\x48\xbb\xc3\x7e\x46\xeb\xd2\x37\xea\x35\x10\x37\xca\x9e\x5a\xd6\xb7\xeb\xba\x6a\xc2\x2c\x69\x75\xa8\x42\xe6\xbc\x49\xf2\x95\x94\x2a\x56\xf0\x91\x7a\x69\x79\xa8\x69\xa8\x9b\x85\x24\xcf\xa7\x51\xe4\x98\xb8\x22\x45\xa9\xf1\xd5\x70\xf4\xc7\xa0\x5b\x4b\xfc\x78\x81\x02\x47\xbb\x49\x08\x99\x06\x9b\x64\x3f\xd1\x5d\x89\x6a\x2f\xbd\x89\x64\xb1\xb8\x6e\xde\xb3\x65\xc7\x48\x81\xac\x1d\xba\x2b\x55\xb9\xa1\x9b\x75\x7e\xd3\x57\x67\x37\x46\xaf\x30\xea\xd7\xbd\x80\x5e\x06\xd7\x86\x06\xbf\x0a\xd8\xee\x11\xb8\x23\x2a\xde\x7b\xbb\xb9\x4a\xfd\xe2\xf6\x67\xd4\x9d\xa9\x07\x36\x8c\xe4\x25\x41\x35\xeb\x7a\x62\xcf\x3e\x65\x42\x3e\x8c\x09\x50\x7d\x32\xc6\x36\x94\xce\xbd\x70\xbc\x68\xc6\xf5\x46\x67\xc7\xe3\x0d\x29\xa4\xf1\xb6\x05\x99\x74\xb3\xa7\x60\x73\x73\x6b\xd0\x8f\xf3\xcd\xf1\xd4\x68\x5c\x9a\xd1\x91\x6f\x12\xb4\x4e\x98\x8e\x4f\xa7\x2b\x62\xec\x7d\x1d\x82\x45\x48\x80\x06\x06\xeb\x6e\x1f\xcc\x75\x90\x73\x46\x6c\x82\xe6\x30\x98\x4a\x4c\x18\x7b\x33\x4e\xdc\x86\xc0\x7a\x24\x7b\x61\x8f\xd6\x83\x4f\x4d\x06\xdb\x51\xd8\x40\x87\xb7\x19\xdd\xe8\x73\x34\x51\xec\xb0\x24\xbe\x90\xd8\x2a\x32\x36\xd9\x95\x8a\x9c\x01\x4f\xec\x9a\x32\x86\xee\x3c\xb7\x1e\x85\xe1\xbe\x45\xdd\x69\xe7\x06\x4d\x24\x65\x37\xe8\xb6\x5c\x4d\x2a\xc1\xcf\x67\xd8\x9d\x58\xcd\x42\x25\x68\x58\xd0\x19\x3e\xcb\x7b\xfc\x34\xb8\x1c\x7b\xf0\xd5\x78\x72\x8a\x3b\x73\xda\xec\x1b\x54\x0c\xf5\xb1\x26\x90\x4c\x38\x10\x61\x7e\xde\xb0\x92\x7a\xc4\xe7\xb6\x65\x25\xb5\xdd\x52\x42\x9d\x29\x39\x80\x4e\x68\xca\xc7\x50\xd0\xaf\x8b\x7c\xd4\x46\xc3\x20\x2b\xfc\x38\x32\x37\x4f\xed\x4e\xd3\xfc\x58\x35\x47\x22\x75\xa2\xdb\x83\xf3\x50\xd7\x21\x85\x44\x8e\x93\x9c\xf6\xd3\x26\xec\xf1\x60\x94\xe3\x96\x6e\xa6\x99\x78\x71\x48\x82\x0d\x9b\x6a\x06\x83\x37\xa3\x08\x5d\xa9\x39\xb9\x5a\xb9\x87\xfa\x4a\x46\x61\xd5\xec\x3a\x1f\x04\x46\xb5\xa4\x63\x2d\xdd\x20\xb7\xa9\x3c\xd6\x8d\xfc\xe1\xd0\x78\xbe\x39\x8e\x60\x91\x9e\x8b\xad\xf6\x11\x4d\x23\x51\x1d\xa9\x9a\x99\xb1\x5e\xc3\xa2\x21\x3e\x63\x35\x86\x67\x92\xa9\x5c\xef\x5b\x73\xd1\x32\xd7\x89\xa6\x76\xa5\xad\x7d\x14\xe6\x2d\xa4\xb9\x68\x32\xb3\xa0\x60\x4b\x1f\x8b\xb2\xc8\x92\xe3\x67\x7c\x28\x70\xcf\xc4\x6d\x3a\x93\x55\x24\x89\x57\x2c\x92\x05\x86\xa2\x9c\xc2\x38\x99\xdd\xaa\x35\x22\xe5\x26\xcd\x11\x4b\x8b\x98\xc4\x77\xe3\x9c\xd6\x17\x52\xd4\x0f\x5d\x82\x55\x6b\xe2\x44\x61\xaa\x75\x18\x95\xa5\xe3\xec\x92\xe7\x61\x9e\x27\x0d\x45\x60\xef\x5e\xd3\x73\x84\x6b\x78\x10\x25\x4e\xb2\x8b\xb8\x94\x85\x0b\xed\x5c\xa8\xe8\xc8\x54\xc9\x73\xc7\x17\x3b\x73\x9e\x2c\x7a\x2f\xe3\x78\xbf\x37\x61\x1a\x75\x8c\xbe\x3f\xcc\x78\xf1\x9b\x20\xf5\x5c\x9a\x5e\xce\xa4\x35\x92\xcf\xba\x99\x6e\xcf\x28\xbe\x47\xab\xb4\xe4\x4b\x3c\xd1\x37\xb1\x85\x2c\xcf\xa7\xf6\xf9\x21\x5a\xe3\x0d\xe2\x3a\x96\x6a\x88\x14\xea\x06\xa2\xc4\x77\x0c\x52\x70\xda\xcb\xba\x0a\xe2\xe1\x2d\x85\xf6\x85\xda\x60\xcc\x82\x74\xb8\x48\x33\xc5\x63\xae\x84\x74\xe3\x64\x9e\x4b\xaf\xfc\x72\x3b\x84\x79\x74\x12\xc3\xe7\x29\xe3\xd5\xc7\xa1\xb3\x63\x94\xbf\x21\xd2\xfc\xbc\x2d\xa2\x48\xb8\x76\xfe\x54\x45\xf7\x91\xc5\x9d\xb1\x3c\xf9\x6c\x3b\xc2\xd5\xfd\xc4\xae\x8d\xae\x0e\x67\x29\x6e\x95\xe6\xec\x86\x47\xb8\x7d\xee\x42\x70\x92\xa7\xdb\xf9\xde\x46\x96\x60\x30\x76\x56\x43\x35\x74\xdd\xbb\x5d\xbf\x29\xa5\x09\xe0\x5e\x29\x09\x19\x7b\x04\xf5\x39\x23\xb3\xb3\xdd\x69\x77\xad\xd7\xe7\xee\x3c\x49\x06\x12\xfb\x0e\xae\x1b\xe1\x48\x4a\x0d\x1d\xd0\x98\xc9\xdc\xa0\xee\xae\x3f\x68\x0c\xeb\xb1\x18\xa4\xc4\x70\xec\xc6\x6b\xbd\xde\x69\x75\x26\x72\xbd\xec\x67\x45\x22\x0a\xb8\x90\x98\x20\xbe\x24\xfc\xe9\x21\xa4\x98\x4a\x9e\x9c\xdb\x2a\x62\x2a\x81\x9f\x04\x12\xdb\xc2\x13\xb9\x3f\xea\xea\xe2\x25\x47\x73\x26\x93\xad\x9c\xcf\x59\x4d\xc5\xb4\xde\x34\x31\xe3\x39\x6e\xf0\x90\x9f\x44\x11\xe4\x97\x8a\x56\x60\xf2\x76\xca\x6d\x80\x51\xc7\x03\x5c\x75\x18\x69\xc8\x67\x6b\x2b\xd4\x59\x72\x10\x0f\x6a\x5b\xac\xbc\x46\x47\x7c\x3e\xb4\xcc\x63\x0e\x13\xb7\xf3\x31\xd3\x40\xe8\xec\x6a\x51\xa1\x12\x58\xe7\xc6\x3f\x9e\x9e\x95\x75\x2d\x27\xf2\x71\xae\x2f\xf3\xc5\xda\xc1\xf0\x07\x74\xa2\xc6\x9d\xad\x56\xec\x82\x90\x95\xba\x5d\x1b\xcd\xb8\x88\x5e\xed\x4d\xc2\xe2\x9f\xf4\xb8\x9d\x10\xb6\xd6\xb6\xd9\x11\xd3\x33\x49\xd6\xb8\x76\x24\x4d\x79\x5b\xb2\x87\x02\x57\x3b\xc3\x8e\x6e\xa4\xb8\x27\x24\x34\x91\x6b\x4f\xda\x62\x11\x9c\x74\x2a\x1f\x52\x00\x30\x1e\x5e\x12\x17\x1d\x55\xbc\xc9\xde\x71\x2c\x82\xa8\xe5\x71\x17\x08\xc5\xcb\x74\xcc\x1e\x25\x81\x18\x75\xeb\x36\xcb\x45\xc0\xa4\x5c\xb9\x20\x1e\x2d\x95\xa6\x7e\x5d\x13\x5c\xbf\x4b\xc9\x75\xe8\x1e\xe9\xb1\x79\x22\x0d\xae\x87\xa7\x79\xab\x16\xd4\x26\xaa\xe2\xe2\x66\x6a\x9f\x26\xfb\x76\xaf\x34\x11\xe9\xbd\xca\xde\x66\xc1\xdd\x2f\x6e\x1f\x38\xea\x86\x51\x33\x2b\xf5\xe4\x6d\x75\x8b\xca\x3b\xbb\x34\xd6\xfb\xa8\x3b\x79\xd9\xd6\xfa\x95\x0b\x8d\xb1\xb6\xb5\xc3\x52\x3e\xcf\xc3\xbd\x26\xaa\xc4\xf4\x59\x97\x61\xfd\x6a\xc2\xa6\x21\xbd\x0c\x99\x46\xa7\x93\x02\x72\x68\x88\xfa\x1d\xf7\x22\x68\xb9\x0c\x68\x6f\x27\xbe\x5d\x2c\x9c\x31\x9c\x97\xf5\x9e\x5e\x23\x1f\x43\x35\xbc\xb9\x14\x69\x3d\xa0\xf7\x11\x43\x5e\xe8\xc0\xed\x6e\x61\xa4\x68\xb4\xeb\xe1\x88\xc1\x5a\x61\xf4\x16\x96\x76\x28\xec\xc7\x13\x20\x55\xd8\x30\xd1\x74\xa0\x4e\x83\xb7\xb0\x28\x9e\xc2\x27\x33\x5f\x11\xd7\x64\xe9\xa5\x32\x37\x66\xba\x4c\x84\x8b\xcd\x00\xb0\x71\x34\x9a\xf4\x39\x9f\x30\xeb\x58\x2b\xd1\x3c\xc0\x75\x36\x61\xc4\x19\x4f\xac\x35\xa0\xac\x94\x72\x69\x1e\x0e\x24\x1a\x9a\xfa\xe4\xc8\x8e\xb8\x06\xc1\x0b\xad\xa8\x91\xab\x60\xf7\x33\xa9\x98\x8d\x58\xd5\x04\xbf\x60\x1d\x40\xa7\x26\x45\x63\xa9\xed\xc5\x51\xe5\xc9\xf8\xd0\xe0\x14\x70\x31\x64\xd8\x94\x26\x9b\x4f\x76\x17\xf7\x04\x0a\x32\x3a\x43\x05\x73\x52\xd2\xcb\x72\x31\x07\x16\x1d\x04\xec\x1e\x85\x1c\xdb\x46\xf8\x42\x29\xdb\xbd\x39\xa3\xa9\x7c\x4d\xa1\x09\x66\x21\x7a\x97\xef\x37\xdc\x97\x8d\x1b\x0b\x8a\x92\x90\x68\x22\xbe\x42\xe9\x45\x78\x40\x66\x13\x68\x69\xda\x5c\x09\xd8\x4a\x2e\x01\x2e\x37\xb8\x63\x6d\x41\x88\xa2\x67\x3f\x42\x1b\x9b\x81\x52\x6b\x4d\x10\xfa\xb1\xe1\x3e\x9c\xa9\x0c\x4b\x37\x77\x14\x7f\x2e\xb2\x88\x28\x4b\x52\x62\x9b\x87\x5f\x28\x84\x1d\xee\xa8\x9c\x35\x22\x4b\x5c\xcb\xc5\xc3\xe0\x21\xc8\x32\x9d\x76\x63\x66\x68\x1c\xc4\x49\x47\x1a\x49\x61\x27\x83\xbb\xfe\x69\xb8\x3b\x0a\xdf\x7d\xbd\xc2\xb2\x14\xd8\xb9\xce\xcf\x08\xb8\xa8\xc6\xcf\x1b\xa1\x46\x03\x0a\xc9\x11\x46\x9f\x13\x5c\x98\xc9\x13\x2e\xa1\xd4\x1d\x2f\x17\x58\xa7\x43\x38\x6d\x65\x28\x87\xfb\x8c\x76\xa0\xd1\xf3\xb9\x28\x15\x89\xdb\x89\xcf\x77\xc6\x08\x44\x88\x31\x85\x5b\x0a\xf4\x95\x03\x23\x44\x56\x20\x8f\xec\x74\x66\xaf\xf7\x73\x69\x1a\x77\x12\xc9\xe4\x75\x34\x8e\x03\xbe\x05\x27\xca\x21\xc2\x74\xeb\x56\xcb\xda\x1a\xd2\x83\xf1\x66\x88\xa9\xa5\xc1\x61\xbc\x84\x90\xc5\xf2\xac\xfd\xc6\x70\x0b\x59\x32\x10\x3c\x34\x75\xc7\xe0\xfa\xd2\x53\xf5\x62\x8e\xf1\x7d\x5d\x21\x66\x6f\x1e\x2c\x13\x46\xcc\x10\xd3\x51\x96\x42\x04\x4d\x0f\xd9\x4a\x23\x59\x7d\x01\xbc\xda\x22\x6d\x86\x95\xa9\x1b\x93\x36\xc8\x01\xc6\xad\x39\x61\xe0\xe5\xb9\xb0\x40\x2a\x40\x08\xac\x2a\x01\xf3\xd2\x79\xc7\xdb\x63\x92\x01\x03\x85\x39\x8b\xe1\x60\x4a\x60\x3b\xf2\xf4\xba\xae\x82\x62\x10\xc4\x80\xcb\xea\x25\xf8\x2e\x10\x77\xce\x2f\x2b\x0b\xbf\xbd\xee\xc9\xc9\xa1\x32\xce\x76\x96\xf2\xb9\x7d\x51\xee\xd6\x9d\x9b\x5f\x4a\x91\xcb\xb9\x43\x75\xb0\xdd\x33\x81\xcd\x7b\x92\x60\x7c\x84\xe2\x0d\x1e\x7b\xca\x59\x39\x1c\x2e\xaa\x7e\xc7\xbb\xf2\x6c\x46\xb7\xd7\x69\x85\x1f\x54\xb3\x3d\xa5\x71\x7b\x1f\x03\xec\xe1\xc5\x98\x89\x6c\xc1\x44\xd0\xe7\x05\xc1\xcf\x0f\x73\xac\xa3\xae\xae\x8e\x04\x8d\x56\x1e\x63\x84\xe8\xc0\xd5\x05\x72\xd6\x64\x41\xa9\xe8\x3b\xc2\x3f\x72\x9e\xbf\x2b\x0b\x0e\x0a\x12\x24\xdb\xac\xa4\xb4\x12\x2d\x12\xe2\x42\x3e\x21\xfc\x71\xa9\x63\x72\xa7\x1b\xe6\xa4\x33\x44\xc6\xc7\x55\x92\x0d\xa2\xfd\xb6\x26\x4e\x11\x72\x42\xe6\x28\xf1\x79\xe5\x32\x4e\xb1\xc7\x99\x45\xd2\xe3\xb9\x52\x65\x42\x18\x3a\xc0\xa3\xbe\x35\xba\xba\xa8\x03\x01\xc7\x46\xe8\xa3\x51\xeb\x5c\xca\x25\xd1\x41\x58\x8b\x2e\x60\x96\x9c\x07\x73\xa8\xd1\x1b\xe7\x22\xb0\x04\x37\x87\xb7\x2e\xb6\x21\xdc\xea\xa0\x21\xef\x2b\xcc\xae\xa6\xbb\xe9\x2e\xb6\xa5\x06\x46\x4d\x8e\x7c\x46\x32\xfb\x60\x1b\xe2\x40\xa5\x08\x9b\x5a\xbc\x7d\x01\xc0\x70\x79\x0c\x9b\xb4\xc3\xb0\x79\x6e\x05\x5f\xc4\xb7\xd8\x7e\x8d\xc2\x73\x57\xa3\x82\x09\x53\x28\x9e\x80\x74\x3c\x47\x0d\xf1\x66\x10\x23\xd7\xc5\x1f\x5c\xc4\x91\xce\xae\xe4\x3d\xb9\x43\x97\xd1\x10\x9c\x9f\x64\x11\x45\xdb\x30\x7a\xc4\x4c\x82\xe2\xf4\x8e\x56\xdd\xc5\x43\xf8\xa8\xa0\x48\xf3\x7d\xad\xb9\xc6\x97\x13\xbb\x00\x1d\x14\xc3\xc9\x50\xc5\x15\x0c\x35\x4e\x9f\xd2\x8d\xaa\x44\xf7\x6b\x18\x02\xd1\xda\x8a\x40\x1d\xca\xcd\x0e\x08\x9f\xb1\x33\xf8\x52\x34\xf7\xc7\x4c\xf7\x53\x06\x05\xaa\xd6\x85\x0a\xf9\x34\xae\x77\xf9\x19\xbf\x8d\xc7\xab\x23\x8e\x83\xe8\xa0\x1a\xc7\x85\x60\xf8\x11\x3f\x7a\x28\x19\xd1\x9e\xed\x14\x51\x90\xed\xb7\xa1\xf0\xbd\x61\xe0\xda\x61\xc6\x69\x9a\x17\xcf\x97\x98\xda\x47\x78\x3a\xaf\x3f\x6d\x3a\x72\xbb\x71\xa7\xa1\x07\xc9\x40\xea\xb5\xb9\xf0\x30\x15\x57\xfc\xca\xd9\xd6\x4c\x04\xe2\x73\xd4\x85\xe7\x76\x5a\x34\x35\xc2\x57\xa3\x67\xfd\x8b\x9a\x0a\xe1\x43\x61\xc4\xf7\x7d\xd1\xed\x13\xc3\x40\x28\x7b\x66\x88\x8b\x05\x4b\x97\x07\x99\x2b\xfc\x5e\x78\x60\x3e\x30\xdb\x10\xa1\x2b\xf1\xbc\x85\xbc\xfb\x1c\x98\x6f\xfb\xc2\xf3\x7d\x88\x2d\x30\x9d\xc2\x70\xac\x5c\x17\xc4\xac\x90\x8d\xbc\xcd\x5e\x34\xd5\x89\x7f\x46\x0c\x13\x11\x14\x6d\x87\xe0\x56\xc2\xc5\x0a\xe9\x8e\x36\xa3\x0b\xac\xd1\x1a\x12\x0c\x53\x5d\x72\xbf\xd5\x2a\xb8\x23\x4c\x90\x8a\xe8\x6f\x03\x1e\x38\x7b\x1b\x17\xdd\xb9\x92\xe6\xb1\x78\xc6\xd0\x00\xa8\x88\x5e\xc5\x2b\x02\xc5\x83\xd6\x83\x71\x55\x02\x49\x7a\x34\x44\xf6\xc7\x05\x64\x03\xc2\x2e\x11\xcb\x50\xc5\x73\x4d\x42\x6f\xa1\x4b\x76\x8a\x4a\x22\xf7\x0e\x04\x23\x8e\xa3\xcc\x7c\x38\x56\x88\x9d\x0e\x9b\xd3\xc5\x9c\x1a\x37\xdb\x2b\xb7\x9f\x92\xe5\x58\x16\x1e\xd8\xf7\xb6\xd6\xef\xa1\xbb\x70\xbc\xe3\xa3\x89\xcf\xee\xbd\x2c\x0e\x67\xc0\x8d\x66\xdf\xcf\xa0\x7e\x3d\xe3\xc6\x36\xce\x8f\xe8\xc4\x2d\x6f\xba\x13\x24\x2a\x47\x98\x67\xc4\x5c\x60\x14\xc7\x19\xe2\xb4\x1b\x60\x3c\x08\x94\xc1\xbc\xd7\xc6\x7e\xf1\xe9\xcc\x8b\xc4\xc8\xb1\x6c\x41\x03\xa4\x65\x31\x65\x87\xd8\x34\x0f\x9b\xfa\x05\xd6\x90\x4a\xbd\xb8\x30\x45\xcc\x49\x27\x3b\x1c\xdd\x68\x8c\xf0\x66\x1f\x57\x98\x44\x2a\x17\x52\xea\x56\x1d\x35\xf7\x03\xac\x0f\x16\xe0\x64\x51\x8a\x05\x23\x96\x0d\x2f\x7f\x0c\x03\x3b\xfb\x57\x95\xb1\x44\xe4\xa0\xa8\x93\x5e\xb1\x43\x6a\xfa\x1b\xd1\x52\xd6\xee\x2d\x70\xc9\xd4\xae\x4e\x9d\x89\x67\x08\x39\xf7\x6f\x39\x36\x79\xce\x4a\xf4\x8b\xb5\x6e\x90\xa3\x9a\xcd\x08\x18\x2b\x05\x35\x96\x24\xac\x41\x3c\x61\xe4\x14\xd6\xad\x16\xd9\x4e\xee\x22\xb8\x21\x11\x44\x6c\x26\x43\x82\xec\xa6\xbe\x50\x8b\x1b\x16\x89\x57\x19\x86\x78\x33\x22\x65\x7d\x7e\xec\xf5\x65\x64\x2d\xc0\x35\x4c\xbf\x7a\xc6\x16\x1f\xc2\x94\xf2\xb8\xa4\x71\x74\x2c\xda\xf0\x48\x8c\x9a\x40\x41\x74\x54\xa3\x5e\x50\x46\x06\x6f\xf2\x91\xdf\xc3\x38\x6e\xd5\xc7\x27\x92\x9a\xfb\xac\xa4\x6c\x40\x97\x7c\x76\x32\xf8\xdc\x32\xf8\x63\x68\x64\xfc\xf3\x7d\xcb\x4f\x4f\x4f\x47\x7b\x22\x65\xe0\x68\x84\x67\xfa\xd5\xcf\x7e\x2c\x7a\x11\x84\x1e\xae\x6e\x31\xc5\x86\x93\x7e\xb9\x2b\x1d\xc9\x70\xe4\x83\xba\x74\xa2\xd1\x50\x04\x91\x66\x7e\xf2\x48\x64\xc7\x9c\xe8\x42\x62\x79\xf3\x26\xc0\xea\xfa\x11\x43\x4f\x0f\x2d\xce\x4b\x93\x65\x59\x0b\xcb\x27\x32\xf6\xc3\x14\x6e\x43\x13\x6e\x2f\x07\xd6\x9a\x31\x3a\x99\x01\xc1\x63\xa0\x47\x9f\x1b\xd5\x3a\xb3\xb8\x6b\x44\xfe\xb2\x34\xcb\xe9\x36\xf8\x26\x9c\xb8\x27\xb5\x32\xa0\xac\x20\x13\x3e\x0d\x85\xef\x76\x6e\xa7\x73\x6d\x9c\x6f\x9e\xe4\xc4\xb0\x15\xfb\x54\x8f\x4f\x10\x1c\x90\x24\x69\x5d\x1e\x5d\x38\x63\x01\x28\xa0\x75\xe0\xf5\x58\xbd\xd8\xc2\xfc\x18\xad\xc2\x94\x3d\x8a\x1a\x1d\xf5\x8a\x1a\xce\x95\x26\xa9\xfd\x7a\xd5\x35\xd4\xee\xa5\x08\x91\xc8\x07\xd8\x46\x7f\xe8\xb8\xfc\x3d\x75\x4b\xf1\x8a\xfa\xf8\xbd\xc6\xd2\x84\x81\xc8\x7e\x55\x27\x0b\x04\xfa\xec\xe9\x55\x3d\x22\x50\xd3\x9e\x14\x6e\xa8\x81\x3f\x2c\x99\x2e\x49\xb3\xee\xa9\xae\x0e\x8e\x67\x08\x1a\x0e\x7d\x05\xcd\xbd\x0f\xb3\xdd\x68\x4c\x46\x71\x13\xe8\x9b\xf5\x24\xde\x06\x15\x64\x7d\x2f\xf3\xde\x38\xf7\x96\x11\x2c\x56\x11\xa2\xfd\x88\x76\xc0\x01\x03\xbb\x53\x96\xa0\x91\xf1\xd8\xbb\x14\xa5\xdc\x95\xed\xb1\x3f\x39\xe8\x76\x3c\x3f\xc8\x53\x49\xaf\xd0\x30\x00\x88\x4f\xa2\x0e\x82\x53\x29\xa8\xd5\xf9\x40\x9c\xe4\x6c\xfc\xc4\x2a\x9d\xc1\xf1\x66\x1f\x12\xc9\x43\x1b\x94\x00\x71\xb9\x32\x5b\xaa\x4a\x3d\x9a\x2e\xe5\xdd\x0b\x42\xd1\xe3\x5e\x60\x43\x77\x54\xda\x22\xa9\x65\xb8\x10\xa1\x1c\xea\x4b\x43\x84\x04\x1b\xdc\x80\x72\x89\xc7\x8e\xf5\x39\x59\x97\x60\xf9\x3d\x09\x6c\xf8\xd4\x69\x17\x18\xf3\xef\xfb\x9c\xec\xc5\xa9\x71\x48\x6c\xee\x4b\x62\xd2\xdd\x7a\x0f\x41\xd2\x86\x79\x6b\xf0\x88\xea\x31\x84\xe7\x81\x9a\x6b\x4e\x78\x82\x40\xf2\xf5\x3a\xb9\x1d\x08\x56\xf5\x34\x11\x47\x52\x59\x99\x8f\xe1\x2e\x70\xa3\xee\x23\x65\xde\xdb\x2d\xae\x54\xf8\x89\x17\x8c\x7f\xef\xa9\x79\x18\xc0\x67\x67\x60\xdd\x1b\x24\xd2\xf5\xa4\x82\xc3\x08\xd9\x26\xfc\x90\xde\xd9\xc8\x95\xf7\x09\xcb\xe4\xe2\x71\x56\x49\xda\xab\xce\x57\xe9\x88\xc8\x64\x4b\x32\x9f\x36\x4a\x76\xef\x82\xc9\x98\x5b\x0d\x20\xc5\xbe\x51\xa8\x1a\x61\xd4\x2b\xbf\x41\x04\x88\xde\xe0\xa2\xde\xb5\xc2\x1e\xc8\x71\x69\x2d\x5e\x3c\xd2\xb8\x4f\x6f\xa8\x59\x39\x1d\x35\x81\x3d\x15\x44\x6d\x1b\x07\x3d\xf4\xf7\xfc\x08\x43\x02\x21\xef\xdf\x72\xab\x0d\x85\x61\x86\x17\x1f\x86\xfd\xec\x94\x33\x40\xf8\x7b\xc0\x43\xfe\x26\xc5\xb3\x7f\xbe\x9e\x0f\x27\xce\xe5\x1e\xfc\x23\x90\x1d\x14\x82\x4f\x97\x60\xc4\xaf\x73\x85\x2c\x66\xec\x5c\xc3\x3d\x61\x18\xc6\xc6\x67\xad\xe5\xad\xef\x98\xc7\x5d\xc6\xbb\xb2\xdf\x10\xa4\x2e\x59\xc0\xf0\x29\xde\xb9\xa2\x16\x2d\xae\x4f\x26\x5e\x9c\xe4\x6c\x8f\x83\x56\xa5\xf3\xe5\x50\x28\x37\x41\xe3\x14\x43\x04\x1b\x49\x33\xeb\xa9\xf6\xd0\x2a\x82\x2d\x9f\xde\x85\x45\xdf\xe2\xbc\x91\x39\x97\x29\xbe\xed\x7b\xa1\x80\x85\xce\xea\x7d\x45\x60\xc5\xa2\x68\x87\x72\x56\x74\x9e\x3b\xc4\xf5\xdd\xc2\x8e\x8f\xfd\xd6\x5d\x25\x3e\x6b\x4e\xfc\x59\x50\xf0\x23\x89\xfb\x19\x46\x12\x5b\x62\x8a\x39\x61\x6a\x55\x71\x0c\xaf\x0f\x35\x7e\x02\x36\x00\xe0\xf4\x3d\x40\xf9\xeb\xae\x32\xb0\x43\x4a\x0c\x2c\x6a\x0b\xca\x2e\x6f\xe5\x1b\xeb\xfa\xdb\x43\xe7\x41\x29\x19\xa4\x72\x8d\xfa\x44\x6c\x6b\xde\xce\x95\x03\x69\x3a\x1d\x42\x25\x43\xdf\xcf\x63\xb2\x4c\x5b\x15\x96\x6e\xbf\x34\xfb\x36\x95\xe7\x9c\xcf\x94\xf3\xc7\x56\x29\x17\x8d\x06\xce\x2e\x95\x52\xa1\xd2\xaa\x0b\xe2\xf1\x26\x17\x15\xc9\x50\x58\x02\x01\x17\xf8\x7a\xf7\x60\x6e\xad\xbb\x61\x86\xa1\xf6\xb7\xe3\x41\x0a\x2c\x07\x82\xd7\xc7\xf6\x86\x67\xac\xdc\x32\x0a\xeb\x81\x3d\x5d\x67\xe3\x3c\xdf\x24\x86\xf7\x3f\x39\x44\x2f\x09\x03\x7a\x75\xa5\xc2\x77\x51\xf6\xa2\x5c\x4f\x3b\xc2\x66\x99\x93\xbc\x62\xb2\x21\x73\x78\xc0\xee\x12\x33\xfb\x24\xe4\x57\xa7\x83\xc0\x99\x13\x3b\x01\x06\xbd\x8b\x54\x62\xb8\x38\x60\x39\x76\x71\xc5\x32\x98\x60\x82\x3c\x7b\x2a\xd9\x27\x66\x29\xb5\xc3\x2e\x4d\x29\x92\xd0\xd1\xbb\xa8\xe2\x15\x33\x9c\x18\x33\x2e\xd9\x61\xdd\xd8\x68\x6a\x9c\xb5\x6d\xaf\x4c\x92\xb3\x36\x3a\xdd\x89\x54\x72\xdd\xe4\x8a\x4f\xc7\xd8\xb3\xae\x4b\x4d\xd4\x6b\xb1\xf3\x56\x6e\x43\xce\x3b\x98\x28\x8a\x7d\x95\xce\x01\x48\x98\x8e\xdf\x1f\x15\xb1\x90\x80\x27\x25\x28\x8d\x4f\x24\x4c\x1c\xf9\xc0\x4b\x6b\x2d\x88\x97\x0b\xc2\x9a\x37\xfd\xc0\x9b\x7e\x0f\xe1\xd0\x55\xd5\x5d\xd7\x47\xd7\xeb\xec\xab\x87\xc7\x65\x44\x8a\xdd\x97\xd6\xcb\xb5\xd4\x1c\x3e\xfb\x71\x6c\xa7\x65\xb3\x3e\x6e\xcc\xf5\x55\x87\x0e\xfa\x09\xae\xe2\xc9\xf7\x9a\xbe\x9e\xac\xc0\x4c\x9b\x21\x60\xb0\x48\xdf\xc6\x4a\x4b\x09\xbb\x21\x6a\x06\x05\x60\x45\x75\x43\x08\xf6\xcc\xcd\xc7\xbc\xcb\x34\xe2\xd2\x73\x3b\x55\x33\x7e\xc9\x26\xef\xa9\x25\x1c\xee\xaf\x9c\x87\xf0\x78\x72\xc6\xfc\x72\xbf\xde\x44\x13\xd4\xc3\xeb\xe8\xe9\xd8\x8d\x36\x53\x7e\x7f\xaf\x0b\xd3\x00\x02\x79\xba\x60\xf3\x90\xeb\xac\xc3\x74\x87\x14\x4e\xed\x3b\xe4\x3f\x98\xfe\x29\x3e\xd5\x2c\xb4\xb8\xe7\x7b\xd1\xbf\x20\x72\x6e\x71\x8d\x43\xf8\x42\x3c\xf4\x2d\xe4\xbb\x5e\x52\x77\xfd\x16\x58\x72\x59\x9c\xfd\x8a\x6f\x4d\xfe\x68\x3b\x75\x28\xaf\xcc\xa2\x45\x98\x63\x82\x7a\xbb\x9e\x9c\xc3\x53\xba\x4e\x0f\xaa\xd9\x18\x5a\xbb\x2d\x2d\x87\x6f\xca\x47\x09\x10\x0e\xd5\xe8\x1c\x56\x80\x29\xd4\xa9\x51\x37\x5b\xe8\xe7\x88\x85\x09\x0d\x4b\x66\x96\x4e\x67\x0a\x22\xd2\x93\x7c\x59\x6f\xd3\x1e\xe3\xe6\xed\x0c\xf1\x61\xea\x6c\x69\x31\x86\x75\x0d\x56\x3f\x2d\x11\x66\x8b\xab\xad\x38\xe3\x70\xa1\xc6\x6a\xcb\x0d\xe6\x7e\x64\xfa\xf7\xfd\x17\x15\x2d\xbe\x5b\x26\x6e\x62\xfa\x2c\x6a\x2f\x3e\x99\xf8\x2f\x4a\xe2\xa3\x0c\x50\x33\xe5\x1a\x78\xae\x7a\xf1\xd7\xd8\x97\x4e\xc1\xb2\x31\x78\xcf\x36\x0b\x0c\xea\x47\xff\xfa\x4f\x7e\x0c\x3b\x7c\x81\xaf\x10\x35\x2e\xb0\xab\x8d\xe8\x71\xc4\xab\x8c\xea\xae\x5a\xd1\xb6\x0b\x44\xcf\xcd\x60\xa0\x49\xe6\x37\xfb\x83\xb5\x9c\x67\xf6\xbc\x87\x63\xde\x50\x8f\x43\xa6\xd0\x9f\x18\xa4\xa4\xc9\xe8\x67\xb8\x3e\xd0\xcf\x90\x11\xe1\x4b\x8f\x9e\x83\x3a\x78\xb8\x6f\xbc\xe4\x02\x40\xe8\x2c\x9d\x28\xd6\xdf\xd3\xe1\x15\xc5\x16\x80\xbd\x46\x9e\x4e\x56\x31\x5b\x4f\xab\x60\xac\xa2\x56\xeb\x20\x76\xfa\xe4\x84\x50\x0d\x02\x55\xc8\x7e\x2f\x9a\x46\x34\xe6\x8a\x5d\xba\x18\xac\x47\x1f\xb2\x88\x06\x38\xeb\x5f\x68\x9f\xbc\xae\x0c\xfa\x30\x32\x67\x04\x84\xa1\x07\xff\xb1\x6e\xd2\x4d\x7e\x9f\xe8\xc3\x93\xb1\xf8\x27\x1c\xc0\x50\xfb\xd2\x15\x19\x33\x10\x0f\x18\x76\x57\x26\x38\xc6\x4d\x67\x4e\x49\x1f\x1d\xf7\x31\x92\x70\xf6\xc5\x67\xc6\xe8\xb8\x2a\x7a\x19\xeb\xf8\x3e\x8f\x54\xdd\x69\xd7\xe7\x40\x48\xcb\x67\x9d\x2a\xd4\x4d\x80\xc5\xcd\xd5\x66\x1e\xbf\xcb\x35\x8b\x8f\x00\xfd\x5f\x9f\x57\x0d\x2c\x62\x57\xaa\x82\x6b\x75\x82\x32\x97\x71\x56\x01\x93\x8a\xdb\x85\xf2\x43\x0c\x14\xd9\xba\xdb\xc2\xb1\xab\x6b\xb2\x0f\x41\xcc\x84\x6f\x5f\x1f\xa8\x81\xa5\xb8\x63\x0c\x4b\x12\x01\x41\x28\x73\xa4\xfa\x28\x2e\x9d\x13\x00\x1e\x14\xa8\xb1\x3e\xc5\x23\xdc\x93\xe1\x70\xa3\x00\xc9\x55\xca\xd3\x5d\x29\x5f\xa1\xa2\x95\x83\x16\x8a\x76\x78\x8f\xa3\xb6\xd7\xee\x6d\x6d\x96\x37\xea\x58\x1a\xe7\xf1\x24\xd4\x2a\x95\x5a\x0d\x10\x96\xe9\x1e\xcc\x3d\x0d\xb4\x81\x40\x6a\x9a\x75\xbe\x88\xb9\x09\x71\xd6\x52\xe7\xef\x9c\xf3\xc1\x9f\x5c\x29\x00\xb5\xe5\x05\xa4\xbc\x1d\x57\x90\xb5\xa6\x2a\xb0\x8b\x9c\xc3\xfa\x89\x1c\x6d\x5c\x5e\xf3\x41\xbb\x3c\x96\x9d\xb1\x74\x37\x94\x93\xcd\xa1\xe4\x90\x06\x7f\x0e\x41\xb2\x96\x23\xe0\xbc\x00\x27\xa5\x5b\x57\xc7\x0d\x00\x3c\x10\xbd\xb7\x5a\xe6\x08\xf9\x20\x91\x1b\xb0\xdf\xbf\x01\x65\x0b\x73\xe8\x03\x30\x0a\x90\x01\x6b\xd7\x95\x80\x9a\xdf\x5b\x0c\xd0\x89\x07\xf3\x00\x45\x46\x97\xd6\xd1\x0b\x6f\xb5\x26\xc0\x75\x09\x58\x4e\x1d\xac\x7d\x54\x33\x50\x1c\xe9\x83\x87\xce\x09\x3e\x2b\xfa\x4c\x2d\xfa\x1a\x03\x71\xcf\x59\xa4\xf0\x99\x87\x57\x9f\x4c\xfd\x49\x7c\x10\x10\x90\x6e\xfc\x86\x4e\x5e\xd2\x87\x0c\x7b\x38\x3f\x80\x4e\x10\x05\x78\xd2\x6c\x42\x07\x19\x23\x88\xb7\xab\x83\xa0\xc6\xfd\xb6\x99\xaf\x99\xef\x04\x64\xdd\x09\x0c\x7c\x20\xe3\xf5\x1b\xc3\x9e\xd8\xde\xee\xec\x49\x7f\xf9\x3f\x8b\xf8\xe7\xed\x68\x2d\x62\x13\x0e\x57\x4a\x2d\xa3\xa3\xcc\xc7\x7e\x40\x10\xfb\xca\x00\xd4\x8a\xbd\x60\xf7\xe5\x35\x68\x4e\x76\x73\x7a\xee\x96\x83\x27\xb8\xbc\x17\xd9\xc1\xb8\x5f\x4f\x51\x49\x6f\x8d\x02\xb0\x9f\xe4\x60\x9a\x83\xd2\x0f\xed\x24\xbd\x81\x2e\x42\xcb\xa7\x85\xb7\xd0\xea\x98\x6f\xc7\xb6\xd7\x05\x02\x94\x17\x20\x16\x75\x56\xee\x59\x88\xf3\x68\x3c\xa5\x0b\x22\x38\x16\x80\xb3\x03\x4c\x3d\xbe\x7d\x00\x11\x7d\xfd\x0e\xea\x73\xe5\x0d\xea\xdb\xda\xea\xf5\x94\xc9\x2a\x63\x37\xeb\x09\xb8\x5c\xb0\x1f\x20\x7d\x8f\x35\x83\xf0\x4c\x3c\xca\x6e\x3f\xa3\x7d\x56\x09\x37\x30\x61\x80\xa6\xfe\x0a\x9d\x54\xa8\x6b\x00\x4a\x66\xb0\x09\x16\xdc\x14\x57\x1d\xe2\x77\xfa\x93\x1f\x5c\xf2\xc6\xdc\x47\xe5\x5e\x8a\x70\xb9\x3e\xcd\x33\x50\x8a\x73\x36\x50\xf1\xda\x1b\x6a\x19\xd3\x29\x4b\x31\x6d\x53\x49\x45\xaa\x3d\x22\x9e\xb2\x02\xac\x68\x53\x99\x6f\x43\x99\x7f\x32\xb2\x32\x46\x83\x74\xab\xc4\x36\xb0\x44\x27\xa0\xb3\xdb\x3c\xc3\x38\x4b\xe2\xe7\xc1\x50\x07\xe0\xe5\xf2\xf1\x82\xbd\x55\x71\x1e\xa4\x79\xb9\x56\xe6\x99\x18\xd1\xda\x06\x1f\xc6\xaf\x01\x5e\x40\x90\x54\x75\x51\x2d\x6c\x48\x86\x97\xa7\x6c\xd5\xb4\xb2\xcd\xef\x32\xe7\xb0\x05\xbc\x7f\xd4\x84\x83\xc3\xb2\x5a\x95\x89\x1c\x00\x02\x48\x90\x5e\x7b\x20\x9d\xa3\x07\x09\x65\x0d\xf8\x00\x5f\x3e\x8f\xe6\x2d\xc5\x30\x6f\x67\x61\xdb\x60\xe1\x0c\x67\xb9\x27\xa0\x05\xc8\x2b\x43\xcc\x62\xb4\x4e\xf8\x4b\x3b\xce\x33\xa8\xb9\xc0\x06\x52\x05\xb6\x00\x15\xf8\xa2\xcd\x95\x25\x3e\x63\xf1\xa1\x8f\x52\x3e\x4a\x1b\x84\xfa\xd1\x4a\x50\x2e\xe0\x5d\xb0\x83\x24\x40\x3b\xd9\x2f\x3e\x96\xe1\x38\xa8\x1c\x17\xde\xda\xf8\x4f\xbe\xae\xa9\x29\x0e\x4b\xc7\x04\xd4\x0b\x4d\x4e\xb8\xc1\x7d\x85\x3d\xb0\xa7\x3e\x37\x01\x96\x35\x00\x50\x02\xa0\xd3\x33\x71\x3f\xa0\x46\xe2\x3b\x18\x9b\x45\x18\x3e\x92\x52\x07\xdd\xea\xa3\x58\xf0\xf1\x71\x03\x58\x6b\x84\x5e\xdd\x85\x00\x01\x28\xaf\xea\x5e\x7f\xc3\xf7\x92\x0a\xb0\x15\x10\x28\x73\xef\x29\xb0\x2b\x34\xc6\xde\xf0\x95\xb1\x4e\x67\x7a\xa9\xfd\xbd\xab\x3c\x57\x43\x2b\x3a\x17\x21\xfb\xfe\x7c\x8f\x2d\xbb\x3a\x1b\x74\xd0\xf8\xfe\xc4\xf2\x32\x4b\x38\xd2\x9a\xbe\x72\xe8\xfc\x08\x5e\xec\xa4\x0f\x1f\x9d\xc2\xcc\x14\x5e\xe9\x5d\x3a\x4c\x74\xba\x74\x74\x8a\x03\xea\x8c\x77\x74\xe6\xdf\x06\xd9\xc6\x4c\xa1\xbe\xf6\x4d\x49\x40\xa7\xfd\x34\x29\x3b\x32\x01\xd6\x31\x59\x0e\x90\x94\x4d\x82\x6f\xe4\xea\x81\x6e\x2b\x73\x3b\xf2\x25\xb1\xc8\xea\x68\x14\x33\x9b\xc5\x6c\x63\xc1\x56\x77\x57\x80\x7a\xce\x45\x02\x04\xfa\x67\x4e\x02\x30\xa9\xf9\x07\x4a\x2c\x30\x28\x7e\xd9\xeb\x03\x62\x89\xcc\xe0\x8e\xa9\x1e\x60\x07\x00\x74\x31\xf8\xab\x6e\xbf\x72\x5f\x3e\x5f\x5d\xf9\x6c\x4c\x80\x4e\x5e\x29\xdf\x59\x9a\x6b\x34\x01\xdd\x02\x34\xf4\x02\xe2\xc5\xc9\x11\x99\x07\xc9\x95\x34\x2e\x9c\xd9\x08\xcf\xcb\x5d\x6b\x5f\x07\x36\xa6\xc1\x20\xdb\xe9\xae\x6e\x6c\xbd\x26\x9e\x54\xde\x40\x69\xd0\x1d\x64\xd1\xf7\xd3\xae\xec\xa7\xf5\x74\x79\xf4\xa7\x53\x31\x64\x30\x72\xd4\x01\xdf\x00\x97\x4f\xd8\x8c\xa3\xfd\x0b\x7b\xe3\x46\x8f\x6f\x05\xe0\xbb\xef\x19\x16\xca\x39\x6d\xe4\xa8\x39\x17\x55\xf8\xaa\xff\x46\x6b\x43\xdc\x42\xd3\x52\xc8\x7d\xd4\x2e\xd1\xae\xd4\xf2\x16\x8a\x5c\x28\x3f\x91\xc3\x60\x75\x2f\xe4\x03\xff\x85\x88\x6f\x41\x2a\x70\x22\xad\xa8\xd7\x66\x4b\xc5\x9d\xb9\xdd\x87\x74\x87\xdc\x2d\xf1\xcf\x58\xd2\x9c\xb1\x65\x89\x1b\x6a\x61\xaa\x4b\xa0\x47\x74\x18\x48\xe8\xd6\x02\xcd\xe1\xdd\x41\x70\xc9\xcf\x03\x7c\x9d\xde\x09\x0a\x77\xd0\x75\xc0\x97\xd4\xf6\x59\x6e\x80\x52\xbc\xd5\x38\x6c\x7e\x36\x32\x73\x4e\x92\xfb\x78\x05\xd0\x57\x52\x4f\x0f\xd1\x0e\x1c\x4e\x9a\xef\x5d\xf2\x44\x03\x41\x93\x28\x07\x4e\x50\xee\xf2\x33\x63\xca\xe6\x9b\x80\x12\x28\x41\x25\x38\x41\xa0\x0c\x6c\x75\x72\xe7\x53\xb7\x83\x85\xc4\x03\x04\xb8\xa6\xf0\xaa\xa1\xe5\xed\xa1\xb2\xc0\x0c\xf9\x53\xdb\x8a\x6d\x79\x4f\x23\x50\x24\x45\xca\x3e\x71\xa7\xcb\xb5\x51\xc3\xea\xaa\x01\x9e\x02\x71\xf0\xe7\xbc\x9d\x00\xae\xb3\x07\xc0\x2a\xf5\xb4\x95\xb4\x4b\x68\xeb\xb9\xfb\xfd\x6c\xc0\xae\xba\xf5\x04\x73\x67\xee\x2a\x34\x71\xcb\x71\xf0\xa7\x6e\x52\x80\xc0\x17\x1c\x0c\xc4\xad\xed\x4a\xea\x45\x79\x20\xe0\x66\xf7\xa9\x7f\x90\x42\x71\x52\xeb\x96\x70\x47\xd2\xb6\x95\xbc\xfc\xac\xb3\xfa\xe5\x70\x36\x95\x86\x13\xf4\x0b\x05\x5f\x01\x9c\xc8\x08\x97\x71\xdf\xcf\x89\x0e\xa5\x6e\x04\x15\x62\x16\x28\x0b\x16\x1d\x16\xca\x99\xa8\x41\x4c\x1e\xe1\x6f\x3a\x40\xbc\xbe\xb8\x0d\x62\xdb\x5c\x7b\x97\xf6\xf0\xa9\x33\x77\xfc\x9b\xaf\xc4\x5e\xd0\x5e\x2e\x2c\x2d\x3a\xe7\x82\xcf\xf3\xaa\x83\x96\x60\xd7\xa7\xc2\x5f\x45\xce\x23\xcd\x40\x05\x09\x77\xbe\x13\x1f\x2e\x28\x50\xb5\x33\x55\x35\xe7\x6c\xe7\xb2\xe1\xea\x28\xc2\xdb\x29\xe6\xdf\x6e\x69\xb2\x29\xf1\x86\x78\x78\x0a\x8a\xda\x06\xd1\x01\xe2\xe1\xcf\xf3\x33\x89\xf3\x6f\x1b\x98\xac\xe4\xe2\x03\x1d\xd7\x4f\x0b\x56\xbe\x63\x30\x41\x99\x5d\x5b\x83\xbd\xd3\x9c\x3e\x73\x28\xd8\x7f\xad\x11\xff\x5c\xa3\x96\xef\xe7\x47\x74\xe1\x39\xbe\xc4\x83\xf4\x74\xee\x5a\x6e\x53\xf8\x4f\xdf\x51\xa3\x2e\x3e\xf1\x2b\x25\x83\x6e\x0a\x47\xdd\x1f\x31\x3c\x71\x62\xfd\x89\x11\x07\xfe\x16\x1c\xae\x07\x07\xd8\x8e\x5c\x21\x1d\xf7\x72\xfe\xfb\x5a\x81\x98\x34\x23\x86\x5b\xf5\xb6\x2b\x7c\xc3\xe1\xe6\x33\x67\xe5\xef\xae\xe3\x2c\xe0\xc3\x93\x34\x5f\xf2\x60\xbe\xb4\x5c\xfc\xb9\x4e\x2e\xd7\x51\x22\x73\x78\x4e\x2c\x11\x25\xd9\xaf\x4f\xfd\x61\x8b\x1f\xfe\x39\x08\xb7\x73\x6f\x16\x82\x2d\x10\x9a\x7d\x2c\x8a\x6f\x71\xa9\x70\xcf\x7b\xd0\xb6\x42\xcb\x2b\xc6\x06\x34\xcf\xf5\xe5\xda\x77\xfb\x38\xe5\xdc\x19\xd6\xc6\x89\x07\x2e\x0f\xef\x57\x5c\xbd\x0a\x1e\xbd\xbb\xe1\xfb\x4d\x81\x53\xe5\xaa\xe3\x72\x7e\x4d\x75\x3c\xae\x38\x8e\xfc\x6e\x3b\x57\x5f\xce\xaa\x01\x9a\x98\x77\x26\x01\x7e\xe7\x7e\x5c\x57\xfd\xb8\x95\x25\xc7\x95\x07\x11\x42\xb8\x34\xf8\xc6\x1b\x38\x9b\xec\xd6\x15\xc9\x6d\x8e\xe8\xca\xa0\x0e\x0f\x60\x2b\xf7\xcf\xbd\x10\x64\xeb\x64\x1e\x73\x30\x29\x58\xf7\xec\xdc\x73\xfe\x87\x7b\xea\x9c\xaa\x05\xa8\x7a\x3c\x27\x1b\x9b\xcb\x49\xf3\xb7\xb8\xe7\x6d\x12\x76\xa9\xc8\xb9\x45\x99\xcd\xe5\xf7\xb6\x51\x2f\xc1\xef\xf6\xe8\x45\xf5\xee\xcf\xb4\x19\x19\xd5\x16\x38\x50\x14\x4f\x08\x17\x70\xfc\xa7\xf6\x31\xce\x81\x2e\x85\x2f\xd8\x69\x01\x07\x76\x2c\x0d\x14\x4d\x4e\xfe\xcc\x3b\x94\x43\x2c\x91\x3d\x1d\x38\x53\x4f\xea\x07\x18\x7c\xe6\x97\x1f\x62\x0b\x3f\x03\xff\xe7\x12\x10\x11\xaa\xfe\x3d\xae\x42\xaa\x99\xc8\x18\xc4\x15\x6f\xe8\xbf\x8b\x39\xe5\x8a\x5d\x3a\x83\x4e\x2d\x90\xdf\xb6\x78\x49\xfc\x04\xf9\x6d\xcc\x1d\xee\x03\x3d\x93\xeb\xec\xee\x08\x77\xe3\xdb\xd7\x51\x1c\x2d\xdf\xe8\xcc\x16\x7f\xc0\x1a\xf1\x52\x97\x2c\xc8\xf3\x07\x08\xdd\xb3\x7a\x7d\x4c\xba\x86\xff\x3e\xaf\x01\x99\xab\x1f\x02\xd8\x5c\xd4\x10\xa3\x33\x7f\x12\x96\xef\xf9\x72\x1c\x96\x08\xbd\x27\xf2\xe5\x6a\x81\x7c\xba\x22\xd3\x40\x41\xce\x43\x95\x5f\x63\x24\x9f\x63\xcc\x0f\x2a\x35\x1f\x57\x10\xbf\x77\x9d\x80\x8f\x40\x73\xf5\xb5\x48\x88\xf0\xf7\x7c\x55\xaf\x19\xcc\x70\x05\x35\x72\x07\x63\x53\x41\x73\x50\x54\xb3\x0e\x00\x57\xf3\xe9\x23\x5e\x40\x03\x88\x4d\x07\x36\xd1\x65\x90\x9f\xbb\x29\x3d\x17\xd9\x6a\x4f\x6f\x73\x9d\x3f\xe7\x2a\x7b\x20\xa8\x80\x76\x0c\xfb\x93\xc5\x9d\xce\x38\x33\x39\xdd\x3e\x12\xf3\x5b\x9d\xfb\x8e\x29\x2f\xb5\x83\xd0\xd3\x86\xd6\x3b\xc0\x5a\xae\x04\xba\x1a\x87\x89\xc7\xe2\x95\x76\x15\x72\x59\x19\x97\x15\x53\x71\xdf\xb4\x9d\x1e\x62\xec\x9c\xa4\xa9\x2a\xef\x19\x77\x38\x54\x0b\x20\x62\x4a\x9c\x66\x02\xb7\x2a\x37\xc9\xe3\x44\xf2\xf0\x2d\xe7\x04\xe1\x28\xdf\xd7\x27\x1b\x5b\x5c\x02\xb8\x7f\xcb\xdf\x04\xee\xb0\x12\x69\x36\xa5\x49\x42\x5e\xdc\x6a\xe2\xb4\xa7\x94\x7d\xdf\xc7\x58\xee\x12\x9d\x46\x98\x7e\x32\xf6\x18\x43\x00\xa1\x07\x4c\x12\xeb\xe3\xc9\x32\x0c\x0a\xe0\x77\xd5\xf2\x3b\xff\xbd\x6e\x40\x0a\x76\xba\xdf\xe9\x9d\xb6\x00\xf9\x61\x4c\xd0\x9e\xb3\xb7\xd3\xa2\x2f\x19\x9c\xa6\x9b\x72\x57\xb0\x87\x74\x3a\x64\x9f\x67\xd2\x8a\x91\x30\x6d\xea\x57\x2e\x4a\xa2\x80\x63\x83\xf6\xa2\x5d\x2a\xb3\x81\x67\x34\x07\x83\x90\xd6\x22\x5b\xa8\xb9\xe5\xf3\x0c\xe3\x24\x2e\x14\x3d\x48\x2c\xf4\x64\x9f\x84\x58\x72\x04\x7f\x4a\xe5\x81\x9c\x28\x12\xa9\x00\x77\x46\xb8\x2e\x47\x3f\x63\x4c\x16\x41\xdd\xdc\x16\xc0\x15\xea\xda\x31\x9a\xd0\xf6\xb8\x9b\xe6\x5e\x7a\x27\x1c\x17\x48\xa6\x28\x36\x3a\x0b\xb5\xe0\xe1\x88\xf3\xfd\x8c\xfc\x68\xe2\x18\xc9\x92\xf4\x02\x68\x6b\x49\x86\xdc\x45\x6c\xdd\xe0\xe2\x47\x11\x3e\x38\x2d\x7a\xb4\xb7\x99\x0b\x01\xca\x89\xdf\xd2\xaa\x06\xb4\x1f\x6c\x0d\xb1\xbf\xf1\x41\x60\xbf\x00\xc8\x43\x63\x66\x8d\x48\xc3\x40\x79\x1e\x80\xfd\xb3\x10\x7d\x8e\xdf\x1a\xba\x8b\x67\x38\x72\x62\xe0\x80\xf6\x03\x30\xbe\xf0\x50\x85\xdb\xc3\xb2\x74\xc5\xc6\x8f\xeb\xf8\x6a\x2f\x0f\xdf\xed\x31\xe4\x1b\x6a\x81\x4a\x40\x41\x94\x2f\xbc\xec\xe1\x0e\x80\xd6\x48\x56\xb6\xdb\xec\x72\x41\x0c\xa9\xe5\x7d\xe1\xfb\x19\xcf\x43\x2b\xfb\xa1\x69\xf6\x21\xc0\x2e\xaa\x71\xd0\x38\x41\xd2\x41\x4c\x2e\x19\x24\x40\xb0\xfe\x64\xbc\x5c\x8a\xc5\xef\x67\x37\xcf\xb7\x73\x7e\x8b\x10\x79\xc4\x9a\xfa\xd1\x12\x93\x6b\x78\x3f\x5d\x94\x52\x19\x55\x00\x52\x8c\x85\x82\x5a\x6e\x76\xa8\xd9\xb9\x5a\x87\xa6\xfd\x73\x14\x85\x05\x85\x16\x34\x05\x94\x17\xe8\xe3\x29\xb9\xf7\x09\xf2\xa4\xe4\x1b\xdb\x15\x0d\x1d\x45\x74\x72\x1a\x8f\x20\xcc\xab\x6b\xeb\x02\x75\x11\x1c\xfd\x8a\xdc\xce\xe3\x3c\xe0\x40\x37\xf6\xc6\xa5\x77\xed\xde\x75\x8b\x5b\x0d\xf2\x59\x7e\x54\xdb\x8c\x3e\xe7\x89\x5d\x8a\x58\xcc\xe3\xfb\xdc\x74\x21\xe0\xad\x74\x13\xd2\x36\xd5\x9d\x81\xbe\xc6\x30\x36\xa4\xb7\x47\xa7\x7b\xa2\xc5\xf9\x34\xb5\x7e\xe6\x24\xa7\x27\xc3\x84\xd2\xf7\x8e\x21\x8e\xb1\xed\xf7\x46\x2a\xbf\xa4\xa1\x3a\x3a\xf2\x8b\xc3\xd7\xa9\x55\x3a\x42\xe0\x44\xda\xb3\xd3\xca\x4e\xeb\x58\xcb\x20\xa6\xeb\xe3\x12\xe9\x41\x64\x84\xaa\x10\x2e\x92\x59\x13\x81\x0c\x3c\xfe\xfa\x1c\xd7\x36\x6d\x00\x7d\xbb\x95\x28\x7f\x90\x81\x64\x04\xfc\x45\xf0\xc2\x1d\xf3\x36\xb3\xdc\xc1\x78\xb5\x6a\xbc\xb4\xe5\xf6\x22\x87\x7b\x43\x4c\x41\x0f\x94\x64\x1d\xd7\x83\x1a\x0e\x7c\x38\x90\x99\x26\xc8\x2b\xe0\x7c\x2b\x11\x08\xa9\x1e\xfb\x1a\xea\xe1\xf8\xa0\x57\xb3\xaf\x57\x83\xe6\xe5\xc2\xf8\xfd\x79\xd9\xcb\x87\xf0\x42\x1d\x31\xd8\x43\x0d\xfb\x88\xf9\xae\x04\x5c\xf5\x00\xc5\xe2\x9d\xb0\xbf\x3e\x7d\x04\x20\xdc\x39\xe9\x45\xc8\xa8\x2f\xbe\xfc\xd2\x1c\x40\xfb\x70\xe0\x03\x27\x00\xc1\x43\x13\xc8\xcd\xe7\x73\x13\x6e\x40\xfa\x3c\x06\xc0\x41\x2b\xf5\x72\x9d\x8c\xcb\xb5\x03\x6a\x9a\xb1\x8c\x3d\x53\x90\xfe\x62\x88\x37\xc8\x9a\x38\x18\x31\x32\xa0\x5c\x32\x1f\x65\x71\x87\xc2\x6d\x2a\xa7\xea\x4a\xeb\xfc\x9e\xec\x26\x60\xa1\x41\x49\xe1\xa8\xcf\x86\x8a\xff\x70\xbe\xc9\x01\x5e\x09\xf2\x7e\x5e\xd0\x04\x40\x09\x41\xeb\x25\x10\x7d\x7b\xbc\x18\x5b\x3c\xbc\x8e\x83\x35\x07\xf0\x9a\x6a\x3b\xd8\x0b\xad\xbd\x4e\x1a\xe6\x61\xa6\x66\x7a\xa6\x5f\xe2\x22\xc5\x2b\xda\x3b\xe2\xa0\xea\xb3\xd2\x23\xf0\x80\xab\xb0\xa4\x0a\x30\xb7\x0a\xea\xa8\x05\x1c\x5c\xa2\xb7\xf8\x75\x22\x00\xc8\x37\x0a\x28\x38\x0e\xa4\x03\x82\xd5\x3b\x42\x40\xc3\x0e\x15\xf3\xe2\xe3\x38\xc7\x52\x4f\x9c\x30\xcd\x4f\xee\xc7\xa9\x87\xe6\xc2\x6c\x10\x03\x94\xf6\x55\x32\x78\xbf\x4d\xa4\x16\x98\xb2\xbf\xde\x0d\x2d\x89\x56\x03\x0e\xbb\x14\x1a\xee\x04\x83\x91\x2c\x72\xd9\x75\x91\x87\xb2\xa9\x56\x51\x5e\x6d\xea\x4c\x36\xd6\xd7\xad\x6e\x47\x4d\x78\xb6\x9a\xf0\xd2\xfb\xab\x63\xad\x77\xc8\x42\xd3\x65\xa1\x20\x74\x0a\xbd\x0a\x7c\x80\x29\xd0\x53\x61\x2d\x77\xa6\x83\xc5\x37\x0c\x16\x57\xb0\xfc\x04\x1d\x3e\xfd\x22\x3e\x79\xb9\x25\x86\xc9\xed\xc9\xf5\xea\x02\x65\x75\x95\xf8\xab\xbb\x35\x82\x59\x1c\x19\x1a\x67\xf1\x24\x8b\xa8\x62\x0c\x8f\xeb\x23\xb3\xb4\x38\xf3\xcb\x3d\x8d\x2e\x48\x07\x38\x78\xa7\x5d\x81\xee\xe0\xfa\x69\x9d\x27\x00\xa6\x46\xc0\xc0\x19\x4d\xb1\x2d\x62\x5e\xb8\xbb\x7b\x54\x36\x45\xb6\x72\xfa\x13\x4b\x9f\xdc\x79\x36\x35\xd2\xeb\xa1\x18\xc8\x9e\xd0\xad\x46\x2a\x72\xd7\xf3\x6d\xcc\x4a\x39\x8d\xf0\xf4\xde\xd2\x26\xf3\x44\x0c\x92\xa1\x80\x38\x24\xb1\x51\xd8\xd7\xc7\xf5\x59\x5f\x11\x97\xf4\xbc\xd7\x63\x5f\x10\x0a\x3d\x9f\x95\x40\x0f\x85\x58\x31\x9a\x4d\x06\x65\x87\x44\x0e\x36\xd1\x5b\x30\x7a\xaa\xc1\xde\xe3\xa7\x32\xe4\x45\x8a\xfb\xd4\x9e\x87\x92\xf1\x67\x78\xd7\xe9\xfd\x86\xf0\x45\x4e\x44\x39\xa9\xd7\xb4\xfa\x18\x3d\x5d\xda\xb0\x53\xd9\xb6\xda\x58\xbc\x9e\x3d\x61\x60\x17\x10\x74\x8a\xdc\x89\x3e\x63\xa3\x83\x6e\xf5\xc7\x79\x76\x38\x36\xc5\x6a\x5f\x8f\x90\xd7\x23\xe6\xd8\x83\xdc\x3a\x63\x13\x50\x8a\x40\x59\x45\x66\x30\x9c\x24\x77\xf6\xfd\x01\x74\x23\x98\x9b\x31\x1c\xe0\x1c\x8e\x81\x26\xb7\xdf\x83\x8e\xd4\x5c\xdf\xef\xb1\xa1\x7f\x42\xb7\x86\xee\xdc\x3e\xf7\x77\x92\x42\x6f\xcb\xfd\x89\x1b\x48\xb6\x92\x18\x4e\x61\xcc\xbd\x0d\x65\x17\x75\x7c\xd7\xa0\xe3\xfd\x24\x72\x23\x1a\x1c\x80\xd4\xa3\xd8\x78\x74\x9e\xad\xf5\x1c\x28\x4e\x81\x65\x04\xdf\x8b\x67\x5b\x83\x02\xdb\xd2\xf3\x53\x6b\x69\x05\x89\xd0\x8a\x85\x71\xa7\xf5\xb4\x45\x84\x71\xaa\x51\xbf\xd5\xb9\x3c\xd5\x51\x83\xa5\xc6\xa1\x27\xd4\x52\x52\x51\x73\xc2\xcb\xb7\x67\x0d\x68\xf6\x3a\xfb\x28\x8c\x2b\x98\x68\xb7\x5c\x23\xba\x36\x4e\x47\x6d\x5e\x8f\x8d\x98\x2a\x00\xc9\xb9\x31\x69\xe5\x02\xe5\x5c\x77\xe7\xfe\xa4\xf6\xf6\x2b\x98\x46\x3a\x59\xf6\x03\x74\x0b\x8f\xb6\x58\x27\xd9\x69\xa9\x41\xc9\xe9\x5d\x5a\x2d\xf3\x78\xf9\xac\xad\xb9\x27\xfb\xf4\x1d\x97\x1d\xf2\x79\x5d\x18\x4a\x11\x4e\x56\xef\x06\x00\x2f\x36\x4c\x2f\x95\x5c\xc1\xe2\xfa\xa2\x9a\x15\x63\x33\xe6\x59\x81\x18\x00\x00\xd8\x9a\x28\x46\x1a\x3d\x68\x73\x1e\xdc\x81\x59\xac\x3d\x5f\x28\x5f\xd5\x68\xee\x36\x1c\x62\x0b\x3f\x6e\xfd\x30\x1c\x69\xff\xa6\xfb\x3d\xc0\xbc\x68\xb8\xb3\xd3\xeb\x39\x5c\x73\x42\x72\x5f\xf8\xce\xaf\xe5\x62\x33\x24\x9c\x85\xe8\x48\x07\xcb\x4c\x07\x14\x62\xc3\x41\x73\x03\x20\x7f\xfd\x96\xbd\xae\x37\x4f\x9a\x23\x34\x1d\xa1\xc4\x84\x61\xb3\x8d\x4f\xa0\xb6\x19\x88\xb2\x15\x20\x7f\x83\xd1\xd7\x19\x48\xdf\x20\xdf\xad\x9e\xd8\xc9\x91\x56\xe8\x74\x3f\xd7\x53\x17\xde\x91\xf8\x32\x5f\x29\xd4\x6b\x70\x38\xcb\x62\x4f\x27\xef\x56\xc5\xc9\x1f\xb5\x8c\xe3\x90\xc4\xf7\x9a\xa6\x9a\xd6\x75\x2c\xe1\xa7\x30\x20\xd0\xa3\x77\x29\xf2\x36\xe2\xa0\xba\x98\x4c\x00\xef\x80\xe7\x18\xbe\xdf\xec\xcb\x73\x2f\x8f\xfa\x7a\x55\xf0\xfc\x11\x84\xe1\xdc\x1f\x59\x27\xbe\x4a\x67\xff\x52\xe6\x4c\x34\xa1\x39\x28\x5b\x1d\x43\xd6\x5b\x42\xc8\xe9\xe4\xec\xfb\x76\x3d\x90\x98\xb1\x98\xd2\xe1\x10\x7f\xab\xcd\xb6\x07\xbe\x57\x75\x9a\xa5\x28\x75\x59\x0d\xec\xe4\xb9\x52\x9a\x4c\xa6\x71\xc4\x8c\xf2\xd6\x95\xa3\x86\x0b\x34\x1e\xa7\x66\xb3\x17\x1b\x2b\x61\x0d\x82\x3c\x70\xae\xea\x90\xc4\x70\x8e\xe2\x19\x04\x7c\xf8\x54\xc8\xc4\xb8\x0e\x63\xc4\x11\xa6\x38\x5b\x1e\x84\x4f\xd1\x55\xf7\x28\x99\xbf\x59\x77\x84\x20\x98\xd7\x63\xcd\xdd\xb3\x8b\xea\x53\x6b\xc8\x32\x0a\x60\x16\x26\x87\x14\x3e\xec\xc1\x79\xbf\x16\x16\x4e\xab\xd5\x15\x0b\x8e\xfc\xdd\x40\xab\x17\xb6\x2f\xd1\x64\xa1\x3c\x4d\x96\xdb\x24\x1c\xce\xe1\xe0\x05\x6e\x90\xba\x28\xc5\x86\xc7\x02\xe8\x9e\x7b\xb8\x5c\x51\xe3\xc2\x04\x10\x9c\x8e\x91\xb4\x9e\xe2\x71\x07\xd8\x95\xc1\xf1\xd6\xb4\xbd\x79\xaf\x2f\xf5\x41\xb7\x3e\x6a\xb8\x22\xe4\x83\x14\x0d\x03\x4e\xb3\x35\x03\x74\x81\x2d\x0d\x25\x91\x3f\x71\x79\x77\x9c\x1b\xd8\x2a\xcf\xd6\xe9\xcb\x8e\xb0\x4b\x08\x2d\xb3\x65\xe4\xb1\xc4\x7b\x85\xc4\x81\x5e\x5b\x44\xc3\x68\x05\x5a\x9b\x52\xb7\x0e\x09\x48\x69\x7a\x91\xef\x05\x42\x65\xc6\xeb\xe5\xfb\xe2\xe6\x83\x2a\x44\xf5\x71\x96\x91\x8e\x65\xf1\xc2\xf6\x19\x3f\x82\x16\xbe\xde\x69\x61\x3d\x18\x4a\x71\xfe\x79\x39\x89\xe1\xe5\x31\x6b\x11\x5b\x6f\xe6\xa5\xed\xcb\xba\x0e\x8d\x1b\x2c\x33\x10\xb5\xbe\x1e\xcf\xcb\x78\x48\x5b\xfe\x59\x8c\xd5\xe3\xf9\x10\x4c\xcb\xd2\x34\xc5\x33\xef\xc2\xd3\x39\x7b\x71\x44\xc0\xcf\xa4\xda\x45\x53\x3c\xd7\x7d\x43\xdb\x3a\x8a\x3a\x1d\x64\x48\xb7\xad\xf6\x56\x7d\xe3\xcd\xb9\xac\xc1\x3e\xc4\xa4\x4d\x83\xa1\x5d\x74\xf6\xa6\xf1\x45\xb7\x0c\x30\x96\xe7\x43\xb0\xdc\x9c\x1e\x57\x10\x85\x0a\x3d\x63\x96\x54\x9f\xb1\xb8\x19\xce\xbc\x97\xba\x4d\x57\x8d\x58\x74\x3f\xdc\xee\x43\x26\xaa\x4d\x8a\x22\x6e\xe6\xa7\x59\x36\x4a\x96\x68\xf4\xaf\x98\xdf\x83\x69\x0e\x5a\xc2\xce\xc7\x6f\x18\x24\x0a\x58\x66\x61\x78\x93\x5a\xf2\x39\x9d\xfa\x4e\x2f\x79\x3f\x8b\xb3\x6a\x3a\x9c\x81\x24\x27\x0f\x46\x3a\xc0\x59\x72\x63\x62\x4b\x16\xf7\x96\xb9\x16\x88\xbd\xe5\xc7\x1c\xa6\x31\x0f\x63\x26\x6d\x9b\x2b\x29\x22\xd0\xd7\xbb\x2c\xc8\x38\x2f\x2f\x1e\x5f\x56\xd1\x0d\x1d\x16\x50\x67\xd7\x56\x39\x9b\x40\x2a\x9f\x3e\x63\x74\x23\xeb\x3d\x09\x21\x06\xea\x3a\x5b\x7d\x91\xaa\x12\x8b\x8c\x0d\x4d\xc6\xee\x1e\x30\x81\x09\x2d\x03\x05\x12\x82\x44\x03\xa0\x61\xdc\x3c\x2f\xcd\x7d\x19\x9a\x1a\x8d\x9c\xcb\xcd\x19\x32\x4e\xbe\x04\x8a\xb9\x34\x56\xfb\xca\xe7\x22\x1e\xaa\x49\x1a\xa6\x1b\xc1\x42\x4a\x39\xee\x8f\x67\x25\x5c\x84\xc3\x37\x68\x57\x3a\x1d\x82\x61\x36\x85\xa1\x10\xd7\xc9\xb3\xd6\x74\xaf\x33\x4a\x79\x59\xf0\x2e\xb4\x1f\x27\x71\x84\x54\xdf\xa1\x92\x8d\x0c\xf1\x6c\xaa\x23\x13\xb1\xab\x47\x5f\x79\x03\x2b\x26\xe9\xe2\xd1\xd3\x71\x70\x23\x47\x8c\xe0\x9e\x36\x3b\x8a\x09\x5d\x5f\x2d\x6f\xf5\x2a\x3c\x3a\xf3\x3e\x50\x02\x09\xd3\xda\x4a\xcd\xb9\x21\x50\x54\x70\xfc\xa6\x85\x0f\x27\x07\x61\xe1\x78\x81\x21\x12\xbe\x4b\xed\x48\xa8\x17\x34\xf4\x64\x39\x1a\xa2\xac\x4d\xc4\xae\x3e\xaf\xc4\xab\x86\x2c\x74\xb2\x4b\xf6\x3e\xbb\x87\xe2\x11\xa4\x29\xc3\x62\xb0\xbe\x33\x75\x29\x59\xc7\x27\x86\x11\xe3\xb2\xb0\xba\x87\x96\x80\xea\x38\x0f\x12\xbb\xb1\x2c\x53\x18\x8c\xd9\xea\xb6\xed\x7c\x9c\x0b\xf0\xa2\x24\xc3\x34\x91\x1c\x97\xe1\x7c\x3d\x6a\x88\x97\x23\xde\x1e\x2c\xde\x40\x8e\x5a\x76\x2a\x47\x9a\x82\x16\x80\x05\x19\x2b\xf5\x53\xa2\x68\x75\xe8\x35\xdd\x8e\x3e\x71\x1a\x8b\xfb\x8b\xb2\x03\xae\x83\xc9\x7b\x41\xb0\x06\x7a\x27\xba\x0b\xd2\x37\x7a\xf5\x8a\x9d\x9a\xef\x0f\xc2\x67\xae\x01\x29\x5b\x20\xd0\xb8\xc0\x40\x4c\x1e\xb5\xf2\x46\x99\xf8\x42\x73\xd9\xb9\xe9\xa8\x78\xd3\x95\x79\xc5\xa0\x97\xad\xfe\xaa\x76\x07\x0c\xb5\x3d\x58\x25\x1e\x2f\x1a\xa8\x4a\xaf\x77\x96\x84\xc7\x15\x31\xee\x21\xcb\x4c\xdd\xe0\xf4\x71\x7b\x46\xa6\xe9\xc5\xcb\x89\xfc\xaa\xd7\x7c\x7a\xe0\x96\x6f\xf3\x88\xaf\x07\x09\x54\x06\x2f\xb4\x85\x00\x4c\x3c\x28\xab\x16\x37\xaa\xb8\x43\x88\x75\xb9\xd5\x45\x53\x9d\x1f\x80\x3f\x47\xf4\x4e\xba\x0f\x7c\x3a\xba\x6d\x91\x93\xa0\x96\xeb\x05\xb6\x7b\x03\xd5\x6a\x1b\x04\xe8\x65\xd3\xe0\x15\xc8\x04\x55\x2b\x8e\x80\xcf\x97\x1a\xc4\xe8\x35\x5c\xb6\x80\x76\xb8\x84\xcd\x9e\xbe\xc5\x3b\xa7\x8d\x80\xc7\x5b\x30\x5c\x0d\xcf\x33\x79\x91\xd0\xc2\xce\x48\x96\x65\xa9\x3b\x0a\xcd\x81\xb4\x82\xba\xd2\xa8\xd7\xc6\x60\x7a\xe1\xd0\x01\xac\x8a\x22\xdf\x7f\x3d\x58\x03\x42\xa5\x90\x6e\x43\x12\xc1\x69\xd6\x07\x6d\x28\x15\x87\xdb\xa0\xee\xa7\x3b\xc1\x6a\x71\x4a\x6c\xfc\xc6\x8b\xb8\xf1\x40\x18\xe8\x72\x7e\xe7\xbd\x1c\xd7\x51\x70\x0b\x12\x16\x04\xf5\x59\x2b\x1e\x54\xa0\x4b\x2c\xbb\xb1\xf7\x30\x59\xcb\xf2\xf4\x7a\x4e\x50\x28\x19\x2d\x14\x67\xa0\x67\xe1\x4a\x0c\x8e\xce\x41\x79\x32\xb0\x2b\x15\x37\x5b\x18\x0f\x37\x87\xbb\x49\x55\x78\x65\x61\x20\xea\x01\xad\xd5\x50\xfa\x75\x1a\x7b\xc0\x20\x64\xde\x4e\x6c\xe3\x17\x62\x0c\x71\xb9\xf2\xbe\x2a\xe1\x81\xa0\x80\x58\xa3\x5d\xf8\x9a\x6b\x4f\x3b\x37\x61\x57\xe8\x48\x8e\xd5\xd9\x35\x52\x77\x89\x72\xb0\x6c\xd4\x1c\x69\x89\x1d\x8e\xaf\xe7\x5b\xb2\x8c\x8f\x88\xb6\x9b\x8e\x9b\x17\xd2\xc0\xc6\xa0\xf2\x89\x18\x01\xf8\xc7\xf9\x72\xaf\x31\xeb\xe0\xc8\x67\x2c\x01\xec\x4d\x38\x42\x30\xf5\xbe\x1e\x51\xba\x2b\x94\x49\x37\x15\x3d\x3c\x4b\x77\xd0\xe1\x02\xea\xa6\x65\xee\x0e\x80\x8e\x18\x85\x1d\xcb\xa2\xb8\x23\x37\xb9\x20\x4d\x0d\xdf\xa5\x40\x54\x59\x6a\x91\xe4\xc7\xaa\x38\xe1\xcd\xe3\x0c\x7e\x00\xac\x3c\x4b\xaf\xa8\x94\x76\x4d\x5e\x3d\xca\x0b\x0b\x9b\xdd\x8b\xcb\xef\x6f\xf3\x58\x1f\x9c\xf3\xc0\x05\xaf\x67\xc8\x60\x05\x69\xe2\xf4\x49\x59\xa5\x5b\x9a\x18\x86\x81\xae\xb0\xec\x80\xd8\x9e\xb6\xb8\x39\xc4\x30\x74\x2d\x0e\x85\x22\x79\xbb\x84\x02\x6a\xd0\x38\xf7\x9d\x09\xa3\x3d\x72\x84\xfa\x08\xb4\x5b\x37\x79\xa0\xca\xcf\xf5\x65\x25\x3a\xf7\xa6\xab\x21\x9e\xcc\x64\x79\x2e\xc4\x13\x8e\x51\xc8\xfb\x7a\x84\xbc\xd4\xac\x45\x9e\x97\x8e\x72\x3d\xe6\x2e\x00\x2c\xa2\xb0\x7e\x38\xda\xd4\xaa\xa6\xe7\x66\xa1\x5b\x75\x25\xd6\xa3\x0c\x8a\x44\xb7\xdd\x76\xff\x68\x59\x70\xa7\x3e\x98\xea\xa0\x3d\x2f\xcd\xb5\xaf\xe6\x05\xc2\xbd\xe0\x3a\xfb\x9a\x44\xab\x75\x64\xa0\xfb\x39\x09\x6b\xfe\x70\xd0\xe0\xcf\x1c\x12\x5e\x4f\x78\x44\x9a\xdc\x2f\xd6\x61\x8b\xa6\x8d\x58\x40\xae\x09\xfd\xed\x7e\xd5\x2e\x75\x77\xa7\x37\x44\xb1\x0a\xc2\x59\xb9\x24\x08\x4e\x5d\x57\xc8\x16\x2c\x29\x89\x6c\x23\x83\x9d\x2b\x2f\xcd\x32\x55\xd3\xf2\x7a\xa9\xc6\xa5\xb7\x8b\xec\x41\x0c\xe5\x73\xc4\x6b\x0e\x35\xfb\xcc\x9f\x78\x91\xe8\x45\xa3\x20\xf6\xa5\x25\xab\x0b\x7a\xc7\x93\xf6\x55\x5f\xe7\xc0\x69\x85\x0b\x16\xd4\x64\x7b\xb2\x2c\x4d\x74\xc3\xfa\x2e\x4d\x8e\x12\xde\x03\x98\x59\x05\xf3\xa5\x04\x11\xa5\x15\x5a\x57\x51\xe2\xed\xf5\x8c\x48\xe0\xb8\xcb\xf5\xcc\xbb\x1a\x80\x0d\x96\x3c\x03\x0c\xe7\x30\x47\x01\x75\x3f\xc1\xe9\x09\x08\x0d\x20\xe9\x1f\xb7\x0f\x4d\x6a\x9e\x41\x05\x38\x77\xeb\x95\xf5\xbc\x48\x62\xb0\x1b\x12\x19\x3b\xe7\xe7\x97\x7c\xd1\xe1\x0c\x4a\x21\xd6\xed\x51\x0f\x21\xe6\x36\x10\x95\xe0\xb5\xae\xa7\xdd\x3c\x19\xb0\x2e\x22\x1c\x7c\xea\x85\xeb\x02\xc0\xbd\x4a\xc0\xef\xbb\x51\x53\x17\x0c\x9d\x1c\x2e\x15\x18\x69\x3e\x49\xef\xf5\x82\x23\x45\x7b\x35\xa3\x06\x7e\x1e\x40\x26\xa0\xe5\xf3\x66\x11\x93\xb7\xdf\x76\x89\x90\x06\x7c\xd8\x4a\x0c\xa3\xd8\xc2\x21\x63\xf5\x86\x1e\x97\x0c\x87\x20\x52\x73\x1e\x58\x25\xe5\x86\xda\x4f\x20\xd8\x12\x8c\xd5\xca\x51\xd9\xa1\x53\x18\x99\x3b\x92\x8a\xac\xc9\x2b\x9f\xf5\x48\xb0\xd1\x98\x4a\x66\xe0\x9f\xa0\xb0\x47\x40\x48\x59\x38\x20\x27\x0f\xbd\xf6\x49\xc1\xc8\x53\xef\xea\x55\xbf\x46\x33\x71\x83\x7c\x05\xa3\x41\xd0\xdf\x8d\x3d\x05\x9a\xc5\x46\x16\x97\x86\x19\xc5\x8a\x6e\x98\x76\xb5\xc4\x09\x4a\x64\x07\x41\xcc\xc3\x7d\xe7\x3c\x41\xfc\x1e\xc7\xd0\xeb\xb9\xc6\x71\xed\x23\x49\x78\xe6\xc6\x3d\xc2\x9e\x29\x8e\x03\x3d\xca\x10\xe2\xe1\x06\x0a\xdf\x73\xe9\x37\xa4\x10\xc9\x18\xbb\x45\x28\x8a\xa6\xd7\x8a\x35\x5f\xe7\xa1\xce\x01\xb6\x9e\xf6\x13\xee\xd9\xf4\xa0\xa1\x8d\x88\xe0\x9e\x71\xbf\x61\xd6\x89\xbf\x29\xea\xb7\x33\x4e\x5b\x08\x2f\xaa\xd0\xd0\x85\x98\xb2\xd6\xb2\x9d\x0b\x3a\x90\xcf\xd7\xeb\x2a\x31\x12\xdf\xb9\xea\xb4\xa4\x8b\xf9\x7a\xa6\xe4\x2d\xd2\xaa\x8d\x83\x3e\x0c\xf0\x6c\x2e\xad\x6d\x48\x40\x31\x43\x10\x4b\x62\x84\x24\xbc\x38\xa1\x33\x81\xb2\x70\x28\x0f\x87\xef\x67\xb3\xa7\x7b\x05\x11\xb3\xa3\x50\x5a\x29\xf0\xde\xc6\x32\x0c\x7d\x58\x0f\x76\xad\x74\x45\x3b\x25\xad\x4c\x0f\x8b\x1f\x2a\xdb\x43\x3a\x43\xde\xa3\x53\x99\x15\xc2\x70\xe4\x16\xe7\x57\xf4\x7c\x9b\x8f\x32\x2b\xda\xad\x17\x9b\x92\x70\x41\xa6\x41\x5b\x4d\xbe\x3d\x1c\x3e\x7d\x9e\x03\x7d\x96\x42\x99\x7d\xb3\x01\xb7\xd4\x5f\xef\x9f\xca\x2b\x57\xde\x4a\xe8\xf5\x6c\xd3\x58\xf1\x7d\x47\x7b\xc3\xce\x34\x98\xac\xc1\x96\x9c\x44\x96\x85\xe5\xeb\x55\xe5\xa9\xa8\x43\x43\x28\x33\x34\x54\x7b\xe6\x12\x46\xe3\xe4\xed\x51\xde\x2a\x2e\x16\xbe\xc9\x39\x51\x21\x62\x91\x4f\xd6\x33\xa3\x1f\x13\xc8\x9f\xe9\xa3\x98\xce\x41\xe1\x09\x6e\x4d\x4e\x40\x6d\x23\x38\xd2\x66\xf8\x8c\x2f\x91\xdb\x18\xb1\x2c\x23\xca\xa5\x04\x94\x7c\xa6\xa6\x84\xf1\xa2\xfd\xda\xba\x27\x51\xd9\xde\x0e\x44\xdb\xdf\x8c\x4b\xe0\xf1\x5d\xb9\x1c\x40\xed\x09\xdd\xe3\x9d\x68\x37\xbc\xb1\x70\x63\xf0\x42\x99\x38\x8a\x18\xc0\xda\x2a\xb3\x9a\x9d\x3a\x59\x15\x85\x46\x33\x15\xb6\xa3\xca\x41\xbc\x78\x14\x9f\xbe\x08\xb4\x41\xd2\x1a\x7c\x5f\x09\xcd\xbd\x41\x8e\xc7\x06\x01\xf8\xa1\x70\xf7\xe7\xb7\xf3\x11\x4e\x67\x69\x90\x2b\xd0\x9d\x49\xef\xa8\x59\x44\x34\xbd\x3b\xa1\x68\x6f\x02\x22\x2f\xc3\x7d\x9a\x49\xe8\x38\x00\x85\x52\xbc\x9e\x6b\x52\xa0\xe2\x36\x77\xe2\xb0\x04\x97\x6b\xc5\x8f\xb8\xb6\x00\x85\xe9\x84\x11\x9d\x09\xe7\x96\x79\x0a\x79\x2e\x7e\xe8\x69\x91\x5b\xe8\x8e\x4e\x5f\x27\x15\xe4\x35\xcc\x52\x4f\x23\xc1\x20\x7c\xbc\x0a\xda\xeb\x95\x07\x63\xa5\xd0\x15\x29\xf0\xd6\x79\xc6\x06\xc2\x82\x3c\x71\x63\x69\x5c\x49\xfd\xd2\x8f\x77\x65\xd1\x01\x80\x22\x57\x28\xb6\x8e\xde\x8e\x05\xb9\xc4\x8b\xed\xa4\xbf\xd7\x4f\x0e\x32\x3c\x3e\x87\x98\xd6\xf0\xcf\x97\xeb\xac\x1b\xc6\xd3\x9f\xc6\xe4\x6c\x76\xf4\xdb\x99\x20\x0e\x66\x5d\x26\x3c\x79\xc6\x32\x5f\xde\x46\xb5\x1c\x93\xb2\xee\xba\xe7\xdc\xe1\xd6\x51\xf3\x6b\xd6\xec\x11\xcc\xd7\x20\xab\x14\x85\xdb\xdb\x99\xd5\x71\x15\xb2\x83\x4a\x01\x5a\x11\xa6\x4d\x87\x25\x43\xa4\x06\xdc\xa0\x35\x85\xed\x49\xd2\x65\xf6\x65\xb9\x24\xb5\xda\x86\xfd\x28\x5a\x8e\x95\xf3\x7a\x0c\x7a\x95\xa8\x70\x85\x8c\x2e\xc2\xe0\xe5\xf5\xbe\x28\x0d\x31\x91\xcc\xe7\xf1\x71\x9d\x51\x4f\x7b\x3a\x40\x9b\x3b\x54\xb0\xae\xe6\x84\xcc\x15\x02\xa4\x1a\xe0\x9a\xaf\x77\x77\x4f\x61\x78\xab\xf9\xe2\xed\x9c\x4c\xbd\xbc\x64\x07\x82\x02\xca\xca\x02\xf6\x05\xbf\xac\x87\xe4\xbe\xbc\xf6\x35\x86\xbf\x64\x19\x0e\x93\x3d\x04\x8c\xba\xba\xb3\x7d\x4d\xcd\x65\x98\x48\x84\xc1\x98\xfd\x72\xcc\x3f\x31\xd0\xda\xda\x91\x5a\x06\x62\x74\xf5\x32\xdf\x26\xb7\x9f\xb1\x28\x42\xf5\xfe\x89\xa5\x0d\xfe\xac\x2e\xd1\x60\x67\xa6\x04\x44\x05\x46\xc6\x50\x12\xbe\xb6\x30\xc5\xbb\x3a\xf3\x3a\xe3\x56\xab\x65\xf6\x90\xf8\x8b\x57\xa9\xe9\xd5\x95\x5e\x37\x83\xe3\xf9\x81\x00\xb1\xd7\x15\x23\x3e\x0d\x41\x2a\xf3\x8f\x44\x8c\xa5\x65\xa2\x74\x21\x07\x78\x24\xe5\x99\x23\x65\x3e\xc2\x1a\x97\xc4\xf4\x17\xc0\x81\x9a\xd7\x6b\xbd\xe6\x3d\xa7\xfc\x6d\xf7\x87\x0a\xe9\x34\xa7\x23\xe0\x0c\x25\x49\x30\x66\x70\xf6\xab\x35\xf6\x65\x1b\xe7\xab\xd7\x8b\x22\xaf\x77\xd1\xf7\x0b\xa0\x4b\x60\x93\xdb\xd7\x3b\xcc\x28\x45\x06\x7b\x54\x1d\x85\x63\xde\xbf\xce\xf2\xa5\x0f\xed\x9a\x2d\x1a\x8d\xc3\xb0\xd5\x01\x84\x3b\xdf\x82\xf4\xa5\x59\xe3\xe3\x33\xad\xb6\x73\x97\x1e\xcb\x76\x59\xe8\xd8\xc3\x20\xe6\xea\x1a\x0e\x01\x9b\x0e\xae\xbb\x61\xe4\x56\x64\x9a\x7a\xfd\x06\xb4\x3a\x0a\x45\x0f\x32\x0f\xf8\x95\x6d\x69\xb3\xa1\xe9\x79\x87\x0e\xd8\x92\x84\xa9\x7e\x9f\x2f\x28\xcc\xd8\x8d\xc8\x04\xa3\xf8\x20\x8f\xe7\xe6\xcc\x64\x85\x4d\x64\x38\x9d\x8c\xb4\x29\x8a\x2d\xc3\xa6\x56\xa9\x14\xb7\xb1\x71\xba\xd7\xb9\xdb\x2b\xe6\xad\x3b\x80\x7a\x18\x5e\x29\x0f\xf8\xb0\x64\xfa\x53\xe3\x54\x5b\xe1\xe1\x91\xd1\x9c\xea\x15\x11\xa4\x6f\xcf\x12\x4e\x7c\x06\x62\x88\xce\x60\x2f\x83\x29\x5f\x41\x8e\xc1\x8e\xf3\x80\xdb\xec\x75\xe2\x14\xc9\x43\x8f\xdc\x70\xc8\x16\x9c\x6e\x96\x61\x88\x52\x90\x1b\x03\xc3\x64\x3d\x99\xfa\x8f\xc8\xa8\xf7\xdb\x72\x74\x75\xc0\x94\x43\x5b\x4c\xfa\x75\x9d\x16\x77\xca\xae\xc5\x74\xc1\xb1\x0d\x8d\x8c\x1e\x8d\xc7\x8b\x4e\x0c\xfd\xdc\x8d\x40\xf4\x0f\x15\x4a\x27\x33\x94\x36\xea\x8e\x40\xb7\x79\x00\x29\x23\x95\x2b\x10\x7c\x66\x73\xac\x31\x8a\xd2\x1c\xcd\x6e\x20\x75\x98\xdc\x0e\x66\x17\x23\x7b\x9d\x2b\x43\xb7\xd8\x14\x9f\x60\x21\x53\x0a\x1d\x1e\x1b\x9c\x13\xaa\xdd\xe2\xcd\xb6\x5d\xb2\x8f\xf7\x8b\x45\x4e\x66\xe9\x70\xf6\x26\x22\x38\x5c\xce\x6d\x0a\xc1\x34\x4b\x1d\x6e\xe2\x26\x61\x1e\xf7\x94\xd4\xf8\x8a\xe3\x8d\xdf\xd8\x40\xeb\x16\x20\xc5\xcc\xfb\x42\xc3\xd9\x44\xa1\xcb\x71\xc5\xa6\x21\x44\x59\x8a\x89\x7d\x0a\xba\xf7\xa2\x72\x51\x1a\x15\x04\xfe\x35\x77\xcb\x16\xd7\xb6\x91\x81\x3d\xf4\xf2\xb8\x48\x5b\x5b\x2a\x9b\xc5\xde\xa7\x69\x16\x58\x51\x9d\x07\xfd\x75\xf6\xaa\xb9\xe1\x8c\xe1\x11\x32\x69\xf7\xbe\xef\x42\x17\x5d\x67\xf9\x49\xdc\x26\x7a\x49\x68\xc0\xaf\xc9\x3b\x0d\x7e\x90\x76\x5c\xd8\x25\xc2\xd4\xf2\xfa\x7a\xb1\xee\xc1\x9b\x65\x62\x87\xb0\x3f\x6d\xfd\x5a\x24\xfb\x9d\x01\x3a\xe4\x98\x5f\xb3\xc3\x73\x78\x7b\xec\xf1\xbe\x27\xdc\xf2\xe2\x40\x09\x44\x87\x2d\x73\xb7\x25\x10\x94\x3d\x9a\xb8\x7c\x93\xd0\x20\xf3\x9c\x88\x6e\x50\x74\xd9\x99\xbc\x01\x18\x3a\x55\xa3\xd1\x41\x70\x56\xb3\x0b\x4d\xc8\x2c\x84\x83\xcd\x7a\xbd\x77\xf6\x3a\xc4\xcc\xf5\x79\x3c\x86\x93\x5b\xcf\xda\xc9\x01\xda\xa2\x8d\x04\x96\xec\x00\x45\x1a\x88\x36\xc5\xcf\xb6\x8f\x1c\x27\x81\x60\x16\x4d\x2b\x89\x25\x8a\x22\x12\x8a\x1b\x7d\xb7\x71\x13\x54\x14\x3c\xa5\xf1\x0b\xe2\xeb\xc3\x0e\x61\xf5\x84\x06\xd0\x72\x0a\x1a\xe3\x18\x3c\x22\x6e\xba\xe4\xac\x95\xa2\xc2\x85\x59\x1e\xa4\xea\x30\x36\x10\xe9\x62\x08\xf6\xda\xdd\xee\x48\x26\x1e\x0b\x84\xff\x7c\x9e\xc4\x28\x13\x0b\x3d\x61\x84\xcd\x7c\xdd\xc2\x48\x62\x36\xa9\x82\xb6\xe1\x96\xcd\x3a\x3b\x94\xd5\x19\x90\x85\x24\x61\xf7\xf4\x75\x28\x42\x76\xac\x88\x97\x40\x91\x20\x40\x3c\xbf\x9e\xc9\x60\x70\x9b\xe8\x7d\xd9\xf6\x3a\xb7\x0d\xd0\xe5\xd1\xe9\x21\x36\xcd\x60\x3d\x8b\xad\x13\x56\xf5\xfe\xff\x63\x3c\x5b\x89\x0f\x19\xbc\xe6\x6f\x23\x1e\x4d\xcf\xf6\xaa\x3b\x00\x75\x4c\x80\x51\xf4\x8d\x29\x5e\x5a\x02\x9f\xa8\x9d\x64\x2f\xea\x63\xab\xbb\x1e\x04\x3b\x65\xcb\x57\x59\x75\xb5\x2a\xd8\xae\x9e\xbc\xd4\x83\xb5\x8a\x33\x8b\xce\x2d\x7b\xbc\x1d\x6f\x5c\xa6\xe5\x7c\xf1\xfd\xbc\x06\x7a\x62\x10\xb6\x2c\x03\x29\x3e\x4a\x87\x2c\x68\xba\x80\xe6\x59\x2b\xdb\x4e\xe8\x58\x8f\x62\x2c\x11\x3d\xb2\x61\xe4\x68\xa1\xa3\x22\x34\x15\xde\x0a\xb0\x1b\x17\x95\xd8\x12\x8c\x4e\xda\x40\x5e\x5f\x2f\x0a\x31\x99\x7d\x42\x55\xe7\x0a\xe6\xef\x09\x95\xce\xdd\xfc\x64\x96\xb8\x85\xf3\x30\xc3\x63\x68\xf6\x74\x01\xc8\x01\x36\x5c\x43\xf3\xdb\x9b\x7f\xc5\xb0\x21\x2b\x2f\xda\x88\x01\xf2\x05\x03\xd7\xe6\xcc\xc0\x59\xe8\xf5\xf6\x57\x2b\x3b\xc7\x40\xd4\x8c\xbb\x42\x53\xc3\x86\xfa\x27\xb1\xa5\x66\xc0\x8f\xcb\x9e\x63\x08\x3b\xe1\x3f\xdf\x2d\x30\x79\x7a\x25\xa8\x6c\x96\xef\xeb\x63\xd9\xef\x2f\xe2\xfa\x5e\x83\xdd\x50\xf6\x5a\x43\xdf\x1e\xdd\x16\x2f\x96\x89\xef\xed\x68\x31\xd0\x83\xe6\x0d\x2c\x21\x48\xe8\x40\xbb\x54\x62\x49\xea\xc5\xad\xc7\xfd\x91\x63\x85\xf2\xa2\x6a\xeb\x29\x91\x33\xe0\xa6\xc3\x15\x87\xef\x6b\x8b\x14\xa9\x75\xde\x81\xfe\x7a\x38\x4e\x96\x81\x41\x2f\x18\x28\x60\x74\xc4\x9e\x01\xfc\xd3\x09\xbd\x63\xd0\x50\x54\x99\x29\x0b\xc5\x4d\xde\x84\xeb\xf9\x08\xdc\xee\x26\x91\xcf\x34\x08\x6a\x9a\xeb\xfa\x7a\x84\xa1\xe6\x7e\x45\x99\x88\x12\x7f\xe3\x67\xcf\x53\xfc\xb8\xf8\x43\x57\xb9\x49\x13\xd4\xd1\x43\x86\x07\x0c\xc3\x40\x84\x5d\x1f\xea\x1e\x45\x0d\x39\x47\x35\x08\xd1\x0c\x93\x61\x6e\xa0\x00\xd1\xc9\x29\x68\xf4\x4c\x79\x83\xbc\xbe\xd7\x72\xa5\x34\x0d\xef\x74\x07\x05\x99\xea\x07\xeb\x4c\x74\x9a\x10\xb3\x78\xbd\xa7\xe9\x94\x26\x4a\x56\xf2\x57\xa0\x13\x6b\x29\x1c\xf0\x88\x5f\x6d\xc8\x22\x8b\x89\x4e\xfd\x05\x32\x88\xc5\xa5\x8e\xeb\x18\xb2\xd0\x9e\x3e\x48\xcf\xad\x5f\xaf\xa4\xfa\x64\x24\x72\xa1\x88\x41\x78\x47\x99\xdb\x35\xc3\xee\x00\xf5\xf1\x73\xdb\x7a\x0c\xb7\xe9\xf9\xe7\x73\x26\x79\x1b\x5f\xef\xbb\x25\x37\x44\x28\xd0\xf6\xa1\x6e\x59\x32\xd7\xae\xae\x59\x90\x90\x21\xa4\x79\xbf\x37\x69\x66\xee\xc9\x0d\x27\x92\x73\xa0\x3d\x46\x0c\x78\xe5\x8e\x6e\x81\x79\x2c\xcf\xa9\x92\x59\xe7\x43\x2a\xcf\x24\x62\xde\x67\x7a\x6e\xd5\x6d\xad\xe1\x60\x2c\x1f\xa8\xe1\xb8\x0f\x89\x5e\xc3\xc1\x25\x71\xd8\xf7\x1a\x87\x24\x42\x00\xfd\x2b\x50\x62\xaf\xff\x37\x7b\xc1\xf0\x49\x2e\x1e\xa9\xa7\xbb\xcc\x0c\x0f\x46\x8f\x80\xf0\xea\xa9\x6e\xc0\x8f\x14\xbe\x9b\x46\x38\x18\xa1\xc6\x0c\xba\xb2\x1d\xee\x29\xcf\x4b\x79\xb2\xaa\xe1\x87\x26\x7d\x0e\xe1\xd0\x87\x0f\xff\x88\xfb\xa2\x28\x06\x2b\x94\xb2\x99\x37\x44\x59\xfc\xff\x50\xf5\x26\xeb\xae\xe2\x4c\xd3\xe8\x05\x31\x10\x7d\x33\xb4\x8d\x01\xd3\x9b\x1e\x66\xb4\xa6\x37\xbd\x81\xab\x3f\xa2\xfe\xb7\x56\x7d\xa7\x9e\x3d\xa9\xbd\xd7\xb2\x41\x52\x46\x46\x48\x99\xa1\x7c\x9c\xb5\x1b\x86\xb3\xb9\x29\xee\x0e\x71\x1e\x83\x95\x15\x82\xca\xf6\x31\x16\x6f\xe8\xba\xf1\x1f\x1c\x59\x2f\xe0\xbb\xce\xdb\xde\xc4\x79\xb7\xd0\x48\x2c\x36\x56\x02\xfb\xcb\x13\xec\x80\xf7\xf9\x25\x2f\x00\xea\xf0\x27\xc7\xce\x89\xe7\xb1\x32\x19\xf2\xaf\x10\x1b\x8f\xad\x95\xb8\x62\xe2\xde\x09\x97\x16\xec\xcb\xfe\xb7\x6e\xe1\x76\x2f\xe6\xf6\x33\xb7\x07\x8d\x1d\x0e\xb7\xfa\xed\x34\x82\x8b\x16\x4a\x5c\xe8\xeb\x1f\xa2\xdf\xca\x6e\xa8\x7e\xd2\xfb\x9f\xad\xf5\xf3\x6b\x12\x0c\xc9\x13\x80\xe0\xc8\x31\x1d\x02\x13\xbb\x76\x2d\xbc\xd6\xf3\xef\x0b\xf7\x9c\x18\xa8\xad\x97\x1b\xeb\xe7\x2e\xef\x2e\xa6\x0d\xb6\x10\xf2\xdd\xa8\x9f\x34\xda\x38\x1b\x16\x80\xb1\x83\x11\xf4\xb3\xb6\x47\x3a\x79\xf4\x75\xd0\x7c\xbc\x0b\xee\x77\x46\xc8\xcc\x4a\x1f\x6e\x7a\x7e\x45\x01\x3f\xfe\xb7\x0e\xe5\xc2\xe8\x15\xdc\x01\x9c\xf0\x0b\xfd\x5f\x5e\xec\x08\xff\x2b\xf8\xe7\xe5\x04\x90\x24\x25\x97\x83\x0c\x41\x26\x49\x2a\x7f\xb1\x64\x19\x8c\x3c\xce\xa3\x77\xff\x6a\x65\x27\x86\x94\xe1\x40\xea\xa6\x56\x21\x16\x30\x11\xf2\x41\x13\x28\xe8\x72\x39\xe5\x42\xfe\x5b\xd4\x47\x00\x48\x66\xe6\x10\xb6\x35\x2c\x91\x56\x03\x9a\xcb\xe7\xa0\x22\xc0\xca\xc7\xc9\x04\xd7\xd0\xe3\x37\xdb\x9f\xd0\xfb\xdf\x9e\x26\xff\xb1\xf1\x02\x86\xbe\x5b\xe8\x30\xed\x8f\x09\x14\x44\x46\x0c\x22\xa4\x3b\x22\x6b\xc6\x93\xc1\x5a\x56\x3d\xf1\xb1\x86\xe5\xb8\xb6\x54\x2b\xa6\xa2\x3a\xa8\x02\x7d\x95\x9a\x63\xe7\xae\xb3\xc9\x17\x8b\x41\x79\xa3\x4d\x1c\xe1\xbe\xd8\x76\x48\xcd\x81\x48\xa6\x69\x6e\x33\xe1\x10\xbb\x4a\xe9\xc8\xb5\x01\x7f\x35\xc9\x6c\x1e\x72\x5b\x48\xf1\x07\x13\xb8\x78\x2f\x83\x7f\xf1\xe3\x76\x12\x19\xca\x41\x7e\x5a\xb3\x5f\x84\x89\x16\x77\x9c\xe7\x97\x99\x9b\xbb\x53\xb3\x33\x45\xfc\x73\x7c\x0f\x29\xc3\xa4\xf7\xf1\xcc\xbe\x70\xea\xe1\x29\x54\x74\xd5\x5d\x7e\x3a\xe1\x80\x70\x18\x37\xa5\x46\xd4\xc5\x11\x72\x66\x40\x38\xed\x8c\x1d\x35\x24\xe2\xa8\xf2\xdc\x8a\x42\x54\xf5\x61\xd1\xcf\x57\x72\xe5\x81\xd6\xa6\x8a\x17\xcc\x0d\x6a\x8c\x6c\x28\x14\x42\xea\xf3\x23\xfe\x6d\x4a\x92\x57\x4f\xd4\xee\x84\x86\xf5\xc9\x24\x0f\xf3\xbd\x66\x3a\xcd\xe3\x46\xa8\x38\xc8\xb2\x7c\x6b\x24\x5d\xe8\x66\x82\x58\x14\x8c\xa5\xb2\x42\x69\xba\x1b\x2e\xd7\x5f\x72\x55\x0f\x56\xad\xe7\x6e\x09\xd4\xe6\x88\x55\x19\x91\x88\xa9\x69\xdc\xac\x91\x26\x11\x99\x36\x5a\xed\xc1\xc6\x96\xba\x3b\xd2\xf5\x10\x7d\x33\xe9\x25\x41\x02\x68\xca\xd4\x49\xed\x4b\x58\xbf\x3f\x9f\x3f\xfc\xd7\xc1\x2f\x9f\x50\xbd\x76\x89\xa3\xc6\x56\x2a\xfd\x78\x11\xe9\xe6\x34\x53\x84\x4c\x74\x67\x2c\x32\xb8\xb1\x6c\x88\x6d\xde\x80\xaf\xcf\x49\x2b\x21\xe5\x11\x7e\xd8\x55\x4e\x3e\x71\x68\xe5\xab\x7e\x46\x16\xed\xd0\x79\x8b\x5f\xed\x84\x8c\x0d\x49\x07\x99\x77\xcb\x01\x3b\xdd\x33\x8a\x87\xd1\x04\x49\xec\xa3\xdf\xf1\x5c\xbe\x7a\x71\x44\xe1\xef\xbd\xef\xeb\x75\xf6\xe9\xb8\x98\x76\xf0\xf4\xe4\xc4\x69\xa3\x98\x2c\xa3\x1c\x83\x0f\xa1\xfc\x79\xf0\xc8\x80\x1a\x13\xc0\x4e\x1f\x72\x14\x2e\x55\x71\x99\x6f\x20\x93\x65\x81\xba\xdf\x7a\x2e\x81\xbc\x2a\x1c\xd3\x91\x42\xdf\xfa\x67\x66\xf6\xe7\xd4\x9e\x2e\xa1\x13\x00\x3b\xb0\xab\x56\xf9\xf7\xd0\x3b\xc7\x3b\xca\xe0\xe0\xb9\xc9\xc2\xed\x7e\x9e\x1d\xf3\x56\x52\xff\xee\xcb\xde\x59\x92\x38\xf8\x5b\x3f\x8b\x36\x39\x42\x10\x79\x55\xb1\x49\x49\x68\x37\x62\x90\x15\x79\x38\xff\xe4\x4c\x87\xe0\xce\x98\x83\xd4\xc6\x38\x5d\xf6\x91\xdf\x35\xb1\x57\x82\xdf\x27\xbb\xf9\x30\xbe\x38\x2b\xd2\xf7\x13\xa6\xf4\x02\xc9\x96\xcd\xa6\x5e\x8d\xdf\x98\x50\xda\xfe\xa3\x20\x1a\xa9\xb5\xed\x41\x8b\xbb\xa8\x0d\xeb\xdb\x27\xf8\xd3\x5f\x3a\x35\xc6\x2a\xfb\x01\x8a\xd0\x97\x01\x52\x9b\xe8\xe8\x2b\x35\x3f\xef\x5a\x21\x62\x13\xb1\x63\x50\xc7\xa4\xcb\x2b\x9c\x3b\x28\x11\xe3\xd7\x4f\x23\x6e\xbd\x7e\xcc\x57\xbd\xe5\xd7\x9e\xec\x11\xf2\x15\xea\x25\xe7\x11\x99\xe2\x74\xae\x4d\x6c\x95\x9a\x67\x38\x5b\x00\x41\x08\xe4\x95\xdf\xf5\xf0\x3b\xdf\x1d\xa3\x5c\x3d\x43\x9c\xd5\xee\xfe\x6f\xef\xec\x03\x22\xe2\x4f\xe3\x85\xa1\x2d\xd0\x32\xbb\x8e\xf5\xb3\x3e\xc6\x63\x05\x25\x3d\x82\x83\xcc\x54\x56\x5a\x69\x39\x62\x0f\xf2\x2b\xa8\xea\xd9\xd0\x91\xc8\x5d\x18\xb3\xfa\x1d\x9f\x29\x24\x4e\x33\xcf\x59\xed\x5c\x11\x9f\xec\xf1\x21\x0d\xfe\x0e\x95\x6b\x2f\x7d\x5d\x23\x90\x98\xb9\xcd\x8a\x3c\x0f\x3c\x0f\x23\xad\x24\x7c\x8d\xc7\xbc\xa0\xc6\x40\x68\x1f\x26\x22\x32\xb5\x4c\xd5\x8b\xb2\x5a\xfc\xdf\x1e\x82\xd9\x3f\xca\xc1\x0d\x90\xf7\x3b\xd0\x1e\x0d\xe4\x40\xb8\xb8\xfb\x9a\x3d\xc8\x87\x56\xbf\x59\x51\x6a\xb9\x24\xc0\x0a\xd0\xec\x27\x14\xdf\x21\xf9\xe0\x88\xd4\xe0\x24\xc8\x42\xfc\x4e\x76\x1f\x2e\xd5\xa7\x74\x5f\x6c\xdf\x13\x8a\xaa\x4f\xf1\x68\x20\x8f\x2a\xee\x68\x00\x8e\xef\xce\x12\x50\x3e\x6c\xf8\xf4\x1a\xda\x80\x88\x56\x9d\x58\x2b\xaa\x88\x73\x31\x7b\xbe\xff\x8f\x66\xff\x3c\x54\x2a\x57\xdb\xa3\xa3\x35\x80\x6e\x90\x7e\x98\x39\x82\x70\x84\x76\xde\xf6\xdd\x5e\xe4\x71\xb1\xbb\xa3\x3f\x19\xb6\xa8\x10\x80\xe8\xca\x1d\x14\xab\xd0\x8d\xf1\xb3\x7c\xc1\xa9\xd5\xad\x1b\x78\x90\x53\x50\xdf\x0b\xf0\x25\x6e\x1e\x48\x6a\x09\x10\xaf\xeb\xac\xd1\xf3\x14\xf1\xbb\x20\x37\x75\x28\x26\x9c\x00\x0c\x03\x29\x9e\x1d\x0b\xb4\xdb\x0a\xb9\xbc\x21\x1f\xd5\x1d\x59\xe5\xfd\x38\xff\x6a\xf8\xe4\x6a\xba\xea\xf0\x89\x85\x44\xba\x77\xa1\x1f\xe9\xd5\xed\x46\xfa\xe3\x07\x14\x39\x90\x19\x6f\x9c\x31\xa3\x8a\xc4\x51\x81\xdc\x70\xf7\x57\x0a\x03\x80\x7a\x67\xfc\x07\xd5\x1f\x9c\x0b\x49\x6b\x56\x06\xa3\x67\xff\xe6\x2f\x9b\x1b\x85\x4a\x8f\x34\x27\xec\xa8\x7d\x92\x3a\xb7\xc5\x12\xff\xbb\x73\x00\x6c\xed\x8d\x3b\x52\x42\x6e\x0a\x10\x02\x77\x9b\x25\x34\xbf\xfd\x95\xcb\x69\xbb\x67\x41\x39\x0a\xb4\x4c\xab\xa8\xd0\x33\xb7\x4d\xd3\xce\x00\xa2\x0f\x24\x10\x57\xcd\x8e\xfb\xf2\xa2\xef\xee\x22\x92\xe8\x5e\x85\xc2\x00\xd4\x4d\x83\xaa\xd8\xa0\xbc\x1b\xd6\x54\xf7\xea\x56\xf2\x5b\x23\x9b\xfd\xb6\xbf\xae\x52\x7f\x02\xc0\xfc\xb3\xff\x7c\xa1\x8b\x35\xfd\x36\x79\xe3\xf3\x73\xef\x27\xa8\x3b\x34\xfe\x0e\x29\x2b\x5e\x65\x9a\x73\xf5\xfa\xb9\xed\x6f\x66\xe9\xfb\xd5\x16\xf0\x90\x9c\x50\x28\x8c\x1f\xf1\x78\xfc\x6f\xeb\x55\xdb\x2d\x1f\x5b\x99\xf3\x61\x8c\x9e\x32\xda\xe4\x27\xa8\x32\xe5\x41\x2c\x20\x87\x2f\x63\x06\x0c\xe7\x76\xd8\xf6\x7e\xb9\x4f\xee\x6a\xaf\x32\x20\x7f\x7f\xa1\x94\x42\xe2\x7a\xa5\xc1\x60\xbd\x21\x15\x9c\x9b\xe9\x7e\xfb\xc5\x66\x63\x22\xa7\x64\x82\xb3\xec\x39\xd9\x24\xb3\x98\x79\xde\x02\x8e\xd3\x52\x20\x42\x61\x29\xd0\xe9\x32\xb8\x03\x2b\x57\x0e\xf0\x7f\xda\xef\xf1\x5f\x6d\x2d\x15\x77\x1b\x04\xdc\xfe\xc9\x18\x90\xf3\x28\x9f\x6f\xea\x4c\xbf\x0f\x02\x40\xc5\x5e\xbd\x32\x27\xc0\x11\x0c\xff\xfa\x91\xd4\x48\x03\xc2\x66\x96\x73\xe5\x0e\x72\xb2\xdb\x45\x7d\x93\xb3\xca\xc0\x9c\x03\x40\xfe\x0b\x20\x23\x85\x6f\x4d\x14\x45\xbf\xc7\xa1\x93\xdc\x84\x84\x31\x64\xf7\x05\x85\xe6\x46\x58\x05\xd8\xdf\xbd\x0a\xb5\xb0\xf8\x4e\xea\x40\xdd\x38\x11\x4c\xf4\xed\xc3\x97\x7f\xe7\xb6\x8f\xf0\x49\x17\x8e\xe1\x7c\x48\xc5\x34\x3e\x2c\xf9\x55\xf6\xbc\xbf\x7d\xa0\x1c\x1e\xa1\x3e\x27\xb6\xb5\xf8\xd6\x78\x9c\xa0\xa3\x96\x57\x61\x2f\x13\x60\xc7\x04\xb3\x5a\x14\xff\x3b\xf3\x8f\xdb\x76\xc5\x60\x87\xad\xc9\x97\xfc\xec\x49\x9d\x31\x25\x00\xec\xb3\x00\x05\x29\xe8\x55\x12\x7c\xe4\x23\xef\xef\x4a\xdb\x00\x86\xe2\x16\x98\x5e\x3f\xa5\x5d\xbb\x63\xa3\x3c\x7e\x0b\xcc\x1d\xf6\x34\x52\x2b\x61\xbf\x2a\xf3\x5f\x9c\xd6\x20\xc7\x84\xf2\xce\x96\xb5\x86\x8d\x95\xe7\x8f\xcc\x93\x6b\x7b\xde\x2c\x40\xd4\xcf\x3e\x67\x66\x24\x4b\xce\x57\x4f\x8b\x39\x31\xc8\xcf\x1d\xa2\x19\xac\x26\x24\xf6\x7c\xf8\x82\x6b\xa7\x0a\xc5\xfb\x32\x3d\x06\x07\x3e\xd6\xf9\x4f\x4d\x90\x82\x7e\xf6\xf3\x04\x44\x00\x21\xb6\xa6\x3e\xaa\x59\xfd\xa0\xa2\xcf\xa4\xef\xf3\xc4\xe5\x13\xd0\x73\x56\x4c\x42\x6c\x87\xaf\xa5\x3f\xd9\x44\xdc\xb5\x68\x0e\x71\xd0\xdd\x95\xe3\x2f\x8e\x35\x3b\x29\x66\xda\x2b\xaf\xdd\xc1\xc3\x1d\x5e\x9f\x16\x80\x07\x7b\xc0\xd5\x76\x3b\x58\x80\x22\x70\x56\x36\xa1\x8b\x20\xb3\x6d\xe9\x4b\xa7\xbf\x34\xc8\x01\x38\xba\x2b\x80\x60\xa7\xd4\xb5\x87\x74\x73\x94\x8c\xea\xd9\x23\x4f\xa4\x2e\xaa\x42\xc4\x24\xb6\x62\x03\x7d\x06\x93\x52\x6a\xcb\x90\xd5\x90\x77\x1f\x5b\xe2\x6c\x45\x5d\xca\x15\xb3\xfb\xa5\x70\x4a\x60\x10\x4b\xa0\x0b\xbd\xf2\xaa\xff\xad\xcf\x84\x19\xc4\x74\x70\x4e\xfb\xb2\x5f\xa7\x8d\xbe\x0b\xb7\x16\x45\x31\x0d\x3c\xd8\xcb\x37\xab\x53\x29\x5c\x2b\x50\x92\xc4\x2d\x07\x63\x2b\x42\xe9\xdc\x53\xde\xe1\x47\xfd\x56\x77\x6f\xff\x6e\x7b\xdf\x13\x4c\xac\x6f\x5e\x7f\xa7\x3e\xa4\xf4\xa2\x20\x32\xd1\xf2\x62\x84\x49\x19\x41\xac\x07\x0c\x51\x10\x90\xbb\x95\xcf\xb1\x0a\xa1\x3c\xd7\xaa\x37\xc2\x88\x28\x3b\x71\xf7\x9b\x9e\x2b\xff\xcd\x4f\xc1\x15\x0c\xc5\xf8\x1f\xa8\x6e\x83\xee\x11\x98\xb3\x7a\x9e\xdc\xb6\x78\x5f\xc0\xbe\x72\x4c\x4f\x82\x2a\x51\xf2\x65\x8c\x49\x3f\x49\x25\x16\x23\x00\xe2\x0f\x77\x25\xed\xf5\x13\x13\x47\x0f\xd1\xb9\x2a\x0d\xc4\x1d\x32\x9b\x08\x7e\xd5\xec\xad\x8b\xaa\x42\x59\xff\x4c\xd7\xd9\x1e\xac\x36\x82\x7a\xea\x1a\x8b\x52\x1e\x91\x0d\xea\x89\xde\x47\x38\xd9\xfd\xec\xd7\x98\xbc\x0b\x56\xbc\xfd\x1f\x4f\x81\x9f\xb1\xeb\x50\x96\x26\xea\x3d\x8e\xee\x2c\x61\x1c\xa5\x5a\xe2\x5d\x06\xf3\x20\xc5\x82\xaf\x6b\x02\xa6\x17\xc2\xae\x9d\x05\xf1\x25\x8d\x6c\x51\x1b\x41\x5f\x0d\x50\x0c\x0e\xa3\x58\xbe\xa3\x87\x24\xac\x13\x86\xac\x4e\x13\x99\x22\x38\x7e\x56\xc4\x8a\x10\x8f\x62\x84\xe5\x54\x35\x4b\x36\xf0\xeb\x77\x16\x14\xcd\xf1\xfe\x27\x77\x1c\xd2\x87\xe7\x99\x93\xe3\x8d\x87\x27\x2b\x5e\x6b\xf7\x67\x65\x12\x1c\xe4\x35\x6f\xe9\xdf\x7d\x06\x91\xc7\x29\xc8\x14\xc5\xfb\x55\xdf\x86\x66\x6a\xaa\x60\x0c\x37\x52\x2c\xa2\x21\x22\x57\x9d\x10\x64\x9c\x12\x5f\xc7\xf1\x6a\x55\xf8\x58\xa9\x3e\x03\x96\xf5\xdb\xbb\x52\x3e\xfb\x7c\xa2\x1f\x2a\x2f\x2a\x19\x3f\x66\x2a\x03\x50\xb4\x29\x90\x11\xf2\x14\x2f\x85\xc4\xf0\x78\xb9\x4a\x5a\x11\x30\x27\xa2\x59\x10\xe6\x66\x20\x3f\xcb\xe7\xf7\xd0\x4e\xb9\x31\xbf\x32\x9b\xf6\x8a\x6d\x11\xd6\x23\xfd\xab\xdd\xe2\x23\x71\x1f\x6d\x63\x77\xd4\xb6\x27\x00\xc9\x16\xd4\x01\xb9\x63\x8b\x60\x5c\x4e\x03\x9e\xf4\x1e\xec\xaf\xce\xf0\xed\x21\x75\x73\xdd\xee\x40\xaa\x4c\xf1\x09\x96\x63\x97\x3b\x23\x6c\x0b\x4a\xa5\xa1\x26\xa0\x2f\xa0\x6d\x36\x20\xd3\x5b\xb2\xe5\xf8\xd8\x92\xe5\x1b\x2e\x79\x28\x66\xfb\x3d\x3a\x9f\x2d\x80\xb0\xba\x0a\xbd\x69\xd1\x45\x38\xcd\xdb\xa9\xed\xb2\x16\xf5\x32\xcb\x4b\x7f\xe5\xb7\xda\x91\x03\x7d\x75\xee\x59\xab\xfa\x58\x16\x60\x9c\x64\xb1\x81\x04\xb2\x4e\xae\xc2\x39\x9b\xa6\x63\x49\x42\x97\x23\x38\xf6\xc9\xdf\x59\x38\x1e\x2d\xe4\xce\x14\x3f\x07\xdb\xc9\x91\xbf\x98\x7f\xd9\xcd\xee\x86\x96\x92\xad\x67\x98\x86\x1e\x40\x58\xb8\xd4\x58\xa0\x9d\x8f\x32\x21\x1d\x08\x7e\x8a\x46\x5a\x80\x03\x6f\xf1\xea\xfe\x81\xf1\xfd\xab\xbc\xc3\xe4\xf6\x83\xad\x5f\x8a\x81\x78\xcf\x7b\xff\x3f\x2e\x74\xff\x70\xeb\xdb\x34\xeb\xd7\x89\x36\x3e\xc9\xf2\x59\x4e\x10\x52\xab\x12\x75\x47\xc7\xb9\x47\xb8\x2a\xb2\x72\x00\x71\x96\x6a\xd6\xa0\x68\x48\x74\xa8\x57\x2c\xda\xb4\xc0\xf3\xaa\x70\xac\xee\x7c\xb7\x52\x88\xde\x44\x8a\xa3\x16\x0f\x5e\xb4\xf0\x61\x8b\xcf\x25\x08\x08\x44\x50\xf7\x4f\x21\x11\x60\xc1\xbc\xd4\x9b\xa4\x3b\x19\x3f\xeb\x30\xa0\x3e\xaf\xc7\x6f\x3b\xf3\x09\xdb\x2a\x98\x93\xa3\x26\x16\x09\xc1\xe4\x41\x2f\xbe\xea\x7f\xf5\x00\x7f\x67\x5e\x50\x08\x53\xab\x16\xd7\xce\x77\x50\xdc\x7e\x1f\x89\x90\xee\x43\x48\x71\xf2\x42\x09\x4e\x8d\x35\xcd\x13\xc6\x25\x66\x8c\xef\x09\xaa\xb8\x95\x88\x91\xcc\x68\xbc\xc2\xa0\x8d\xf2\x8b\xe5\xcd\xf8\x84\x54\xc6\x46\x51\x6b\xf5\x44\xf8\xfb\xca\x75\x4e\x9b\x24\x00\x08\x13\xe8\xf5\x02\x60\x5d\x22\x59\xda\xf8\x1e\x00\xbb\x1a\x85\x21\x63\x46\x13\x67\x07\x83\x05\xa8\xfb\x22\x3d\xb9\x58\x1f\x2d\x68\x97\xdb\x54\xfa\xff\xd5\x9d\x77\xb6\x2c\xb6\x55\xd8\xa8\xc6\x33\x82\x34\xf0\x7c\xc7\x75\xfe\x0a\x8a\x0d\x8e\x7f\xb2\x65\xa0\xcc\x01\x23\x37\xc0\x5c\x88\x1c\xab\x22\x90\xdb\x34\xd4\x5c\x00\xe1\x32\xf0\x0c\x4e\x56\xe2\x56\xd6\xf9\x86\xa7\x8b\x09\xb6\xb5\x52\xef\xd1\xea\x0f\x50\x70\x5c\xd1\x57\x67\x82\xe9\x36\xc4\xf0\x77\x6d\xa5\x5f\x26\x2d\x0e\x72\x56\x52\x79\xf3\xb3\x4f\x68\xf0\xec\x1a\x18\x4a\x0b\x13\x54\x73\x9d\x0f\xae\x6e\x8a\x3a\xf2\x4a\xe6\x28\x4c\x0b\xda\x1f\x06\xa3\xb3\xf3\x2c\x1f\x96\x9c\x7e\xe9\xb0\x95\x7f\xcd\xef\xeb\x15\x91\xa5\xf6\xd9\xb4\x01\xa6\x5e\x80\x0c\x90\xf2\x54\xe1\xaa\x5d\xf3\x45\xb5\x89\x6a\xa2\x00\x5f\xfe\x68\x35\xd5\x2c\x25\x6d\x15\xfb\x10\x50\xfb\x9b\xfc\x54\xe1\x60\x50\x6e\xb3\xf2\xd3\x2b\x56\x82\x81\x6f\xe6\x14\x8d\xd9\x78\x4d\x2e\xd5\xa4\x44\x01\x36\x68\xf8\x54\xfb\xb1\xaf\xa7\xa1\x4c\x58\x3e\x3d\xcb\xdb\x9b\xb2\x18\x2b\x9c\x92\x3d\x7b\x77\xff\xd5\x2d\xfb\xd1\x0b\x70\x16\x5f\xbe\x43\xdf\x96\x65\x88\xb5\xc5\x6b\xdc\xe0\x83\xa0\x23\x5c\xa7\x79\xb1\x1d\x44\x63\x20\x26\xc5\x21\x18\x45\x82\xad\xbb\xf9\x3c\xe2\x5c\x86\x09\x89\x92\xe9\xce\xf3\xeb\x2e\x8d\x37\x2e\xce\x17\x31\x5b\x66\xd7\x1a\x32\x85\x5a\x1c\x0b\xc0\xc9\x17\x00\xfe\xd6\x18\x76\xb8\x3f\x9c\xc6\x00\x89\x18\x42\x6c\xfe\xe3\xb8\xcf\xae\x49\x75\xf5\x34\xec\xfb\x3a\x6c\xe2\x96\xd3\x81\x65\x38\x28\x38\xeb\x4f\xbb\x33\x8c\xfd\x3f\x52\x73\x41\xa2\xe9\x3f\xa2\x56\x6a\xa5\x3e\xb9\x0c\x50\x0c\x9d\xfb\x39\x71\xa1\x6c\x2a\x06\x13\x1c\x07\xb8\xe1\xcd\x2e\x11\x8a\x14\xc5\xc0\x10\x04\x7a\x7c\xe4\xf8\x0d\x91\xb0\xdc\xf4\x66\xfe\x7d\xb4\x9f\x49\xc1\xc4\xd0\xd0\xcf\x1b\xe9\x19\x52\xcd\xed\x9c\xc7\xb2\xd7\x66\x01\x66\x73\x60\x48\xd6\xc9\x26\x93\x87\x79\x67\xcc\x0c\x3e\x99\x84\x4c\x23\xfd\x91\xdb\x5f\x90\xe1\x99\x99\x10\x9c\xdd\xe6\xd6\x57\x9d\x75\x4c\x99\x18\x91\xf5\xff\xaf\x67\xcd\xa9\x2b\xee\x69\x27\x67\x65\x44\xe4\x55\xf8\x02\xff\xa3\x39\x35\x40\x5a\x3f\x87\x0b\x3e\x0c\x4c\x80\x50\x1b\x91\x5b\xfd\x39\x50\x6c\xbb\x15\x88\x92\x24\xcc\x1b\x7e\x7a\x60\xc5\x9f\x67\x86\x5e\x3d\x5a\xcd\xd1\x8a\xa7\x49\xbf\x66\xe3\x71\x15\x80\x24\x62\x39\xae\x74\xcc\x85\xaa\x1c\x6e\xc5\x2a\xaa\x57\x0f\x58\x51\x11\x1a\x15\xc8\x1c\xc3\x6c\x90\x89\x2e\xe6\x51\x7a\xba\x17\x05\x47\x7c\x32\xb9\x6a\xe6\xf4\x3c\xf7\x48\xf4\x11\x52\xf3\xdf\xb3\x6b\xed\x36\x5f\x7d\x62\x87\x73\x54\x86\x4d\x19\x6c\xbc\xae\x3d\xe7\x75\x58\x5c\x00\x38\x73\x00\x3c\x21\xd5\x44\xbc\x03\x89\xbb\xd1\xbc\x58\x16\xa2\x4f\x01\x91\xc2\xfc\x29\x62\xa5\x30\x24\xfe\xfa\x06\x3d\x40\x6b\x6c\x08\x22\x55\x8c\x80\x25\xd4\x3f\x3e\x2f\xcc\x13\x91\xf9\x96\x96\xee\xbf\x94\x43\xa0\xf4\xba\xb6\x63\x91\x15\xb4\x2c\x8b\x2f\xd7\x41\x03\x11\x60\xd5\x67\x8c\x91\xc9\x23\xa8\xec\x28\x68\xea\xd8\x1d\x88\x55\x96\xf8\xef\x3e\x6f\xf7\xf0\x13\xc2\x66\xfa\xf4\x19\xd5\xc3\x93\xee\x5d\x10\xdb\x9b\xc7\x6c\x48\x61\xf6\x11\xc8\x88\x8c\x61\x30\xac\x4b\x73\x80\x59\x5b\x42\x73\x50\x13\x8e\x51\x57\xf4\x10\x5d\xcf\x4f\xce\x41\xfa\x39\xdd\xf1\xba\x05\x5d\x36\xad\x5b\xe6\x23\x87\xc9\xda\xb1\x23\x42\x59\x7b\x86\xb8\xb7\x3d\xe3\x68\x20\x7a\x7f\x24\xfc\x13\x00\x2f\xa2\xe0\xab\x72\x1a\x02\x58\x5c\xbe\xda\x98\x1d\x88\xb2\x87\xd2\x3a\xc3\x4f\xdd\x97\xb6\xd9\x7e\x62\xf3\x63\x2b\x8e\xe4\xbe\x1c\x1f\xfd\xe5\x98\x7b\xd4\x4d\x89\x8a\xcc\x1f\xcc\x25\xcf\xe3\xe5\x47\x81\xc7\x65\xe9\x67\x60\xae\x56\x63\x69\x39\x01\xc9\xf0\xa6\x99\xf3\xbf\xbc\xe7\x2c\x27\x4b\xa6\xb1\x09\x53\x18\x19\x84\x87\xfd\x64\x42\x70\xa0\x7e\xae\xda\xfc\x83\xf6\x6e\x21\x1c\xcf\x0f\x06\x47\x18\x4f\xc1\x1b\xe2\x2e\x85\x64\xa6\x59\x04\x41\x0f\xb8\x87\x45\xac\x8c\x43\x0e\x57\x3f\x30\x40\x56\x77\x33\x01\x41\x0e\x60\x60\x81\xd3\x39\x89\x34\xd0\x79\xf9\x36\xab\xab\x48\x9c\x81\xbc\x21\x45\xb0\x85\xdd\x98\xd0\x1e\x7e\xce\x7f\x35\xae\xa7\x6e\x18\x2e\xe7\xdb\x5a\x27\x97\xdf\xdd\x06\x54\xd8\x6d\x93\x24\x70\x65\xde\x4f\xf4\x18\x01\x84\x31\xa4\x85\x47\x98\x62\xc1\x10\x7b\x10\x3a\x70\x7e\x83\x8e\xea\x38\x8e\x25\x9b\x7f\xf6\x56\x82\x08\xcf\x6e\x09\xae\xa8\x2d\x35\x7b\xc9\x4f\x7c\x46\x89\xbf\xef\x6f\xff\xc5\x3e\xe2\xed\xac\x25\x8f\xae\x86\x31\x68\xbf\x08\x69\x02\x30\x02\x80\x2d\xa0\x30\x91\x39\xb8\x7a\xdc\x27\x06\xe0\x78\x4f\x10\x84\xb9\xc2\x34\xc1\x96\x4f\x89\xf3\xc8\x1a\xbb\x6a\xda\xaa\x3d\xdc\x14\x6c\xbc\xdb\x50\x96\x57\x91\x87\xc5\xce\x98\x3b\x19\xfa\x83\xea\x6f\xfe\x7f\x1e\x47\xf0\xd9\x49\xea\xb0\xf4\x42\x79\x55\xdf\xc1\x06\xf2\x6b\x0b\x92\xb3\x69\xb8\xec\x3a\x77\x84\x42\x9c\x63\x29\x2e\x07\xc7\x74\x2e\xf5\x32\x13\x49\x36\xba\x9d\x6c\xa1\x6d\x00\xae\x7d\x94\xd4\xec\xad\x2f\x85\xcd\x4c\x04\xc4\xd0\xe5\x85\x8c\x13\x04\x95\x82\x58\x51\x0b\x42\xa5\x57\x85\x12\x0b\x36\x7e\x53\x37\x5d\xaf\x6f\x3f\x0d\x0e\x38\x1b\x7c\xd8\x89\x61\x8e\xe3\xcb\x04\x01\x87\xfc\xd2\xdc\xf0\x7d\x26\x9c\x83\x24\xd2\xbe\x4c\x1f\x83\x74\xcb\x20\xb3\x64\xb2\x95\xa3\x2e\x0f\x8b\xab\x07\x9c\x14\xea\xb3\x3d\xa8\x7c\x52\xaa\xaf\xab\x86\xe2\x97\x7b\x92\x7a\x4d\xae\x38\x71\x83\xa4\x22\xbc\x21\x7c\xfd\x7f\x31\x93\x62\xeb\xdb\xd8\x5b\xbe\x58\x86\x57\x21\x7a\xc1\x70\x8b\x87\x20\x05\x4c\x57\x3a\x57\x00\x49\x45\x3e\x1f\x0f\xf2\x52\x72\x51\x0e\x60\x9e\xe9\xb5\xc7\xbf\x31\x6f\xe9\x4d\x1a\xf5\x14\xe3\x99\x64\x11\xba\x95\xc2\x67\xc0\x86\x2d\xd2\x7e\x3c\xfe\x64\xd9\x81\x2e\xf4\xc9\xf6\x6d\x7a\x51\x14\x23\x3c\x3d\x81\x3d\x83\x82\xb8\xd8\x00\x27\x3d\xcc\x9d\x81\xc8\x9a\x14\xc4\xb6\x61\x78\x20\x9c\x29\xda\x05\x6a\x5b\xed\xd9\xe5\xd9\xd2\xca\x78\x26\x14\x7d\xdf\x22\xfd\xff\xd3\x13\x0b\xfc\x8e\x99\x4e\x0d\x4f\xe7\xd6\x66\xda\x89\x2c\x7e\x10\x68\xd4\xc9\xe8\x94\xeb\x0e\x7b\xfe\x00\xb5\x57\xaf\xe5\xdf\x1a\xc9\x9f\x8d\x93\x85\x14\xcb\x5c\x7b\xf5\x6f\x94\x70\x61\x99\x34\x62\x0e\x08\x18\x96\x62\x4a\xfc\x01\x92\xc0\x61\x06\xba\x66\xd2\xed\xb0\x78\x82\xed\x6a\xe9\xf8\xf5\xba\x6d\xce\x86\x65\x39\xca\xa8\xf9\x14\x1f\xc9\x81\xba\xc4\x3f\x7e\x7e\x64\x71\x4f\x25\x55\x6d\xa4\x7e\xe8\xd6\x48\x04\x34\xe5\xe5\xac\x49\x20\xb9\x0e\x59\x68\x21\xc0\x59\x2e\x56\x9c\xd9\x08\x76\x63\xd1\xce\xdd\xc5\x2f\x26\x6c\x9a\x5a\x66\xea\x70\xcd\xdf\x73\x7f\x66\xb7\x7e\x7c\xd4\x9e\x17\x49\xc1\xa6\xa5\xce\x79\x37\x94\xf7\xff\xd1\x78\xb2\xdb\xe7\x85\xbe\x7f\xb4\x47\x89\x1c\x81\x46\xbd\xcd\x66\x5c\x33\x6c\xad\x58\xaf\x9a\xbd\xf2\x11\x1d\x12\xc6\x01\x77\xea\x5f\xac\x3a\xab\xd6\x33\x28\xee\x50\x67\xec\xd5\x72\xf9\x01\x74\xf3\x4b\x0d\xca\x68\xad\x26\x97\xde\x54\x8d\xf4\x1a\xf5\xa3\x82\xbd\x78\xfe\x3f\xac\xfa\x3d\x4e\x59\x92\x9a\x90\x97\x26\x41\x3d\xbb\x06\xc6\x57\x54\xbf\x10\x53\xf1\xd6\x1b\xb9\xac\xe8\x65\x26\x54\x88\x47\xca\x59\x9d\x1b\x44\x2e\x25\x51\x29\x7b\xf1\xe6\xbf\x33\x53\xf1\xe1\xcb\x52\x7f\xa6\x11\x66\x0c\xc8\x89\x39\xcd\xae\xd9\xc6\xf1\xe0\x6e\xa6\xc0\xfd\xa8\xab\xf4\xdf\xb3\x2b\x18\xdf\xbb\x55\xb0\x0f\x59\xe3\xdf\x33\x62\x08\x71\x40\x19\x81\xf1\x08\x44\xeb\xdf\xbe\xc8\x68\x9b\xeb\xc1\x9b\x7c\xe9\x18\xbd\x93\x2d\xe4\xc7\x86\xd6\x77\xc3\x7c\xbc\x1f\xed\x70\xf9\x11\x70\x79\x7b\xc2\x90\x74\xd8\x30\x55\x68\xc9\x3e\xa4\xa9\x9b\xbd\x41\xb8\xbd\x57\x1e\x74\xca\x53\xf8\x97\x3b\x5f\xb5\x8c\xe9\x87\xee\xdb\x20\x27\x79\x6a\xd9\x8d\xa1\x45\x0b\x82\x37\x8c\xa7\xbe\x68\xef\x4c\xb1\x1d\xed\xe4\x97\xb8\x2f\xb8\x84\x75\x9e\xd5\xa2\x4e\xbe\x78\xbf\xab\x50\x1d\xbb\xff\xcf\xa7\x4b\x8c\xe4\x17\x02\x90\x34\xf2\x62\x32\xe2\xca\x20\x77\x6a\xb0\x0a\xa8\x92\x71\x21\x7c\x17\x92\xc5\xbc\x27\x2e\xa9\x53\x3a\xb5\x51\x0f\xa8\x88\x3d\xe8\x56\x60\x8e\x79\x44\xd7\x1a\xab\xf9\xe1\x79\x4f\xfe\x78\xeb\x52\x73\xf6\x31\xfd\x78\x37\x6f\x9c\xef\x82\xad\xf3\xac\x7c\x92\xf8\xb8\x51\x24\xa2\x3e\xf5\xee\xa4\xbe\x06\x36\x3b\xaf\x2d\xbf\x11\xcc\x7e\x48\x47\xc1\x9e\xef\x7f\xcf\x71\x19\xad\x46\x4a\x3e\x87\x5a\x18\x32\x51\x7f\x8c\xb8\x4b\x1c\x0b\xc5\x80\x15\xae\xf5\xc0\x28\x7b\xab\xde\xf7\x9a\xc2\xca\xf3\x5d\x54\x9f\xb2\xf8\x15\x12\xf8\x98\xf9\x7f\xf8\xae\x95\x35\x1c\x07\xa6\x6f\x6d\xab\x9d\xb0\x4c\xdd\x0d\xad\x30\x46\xe2\xa8\x2d\xb7\xac\x4d\xea\x63\x7b\x94\xcc\x5a\xd3\xe3\x07\xa9\x05\x68\xfb\xd3\x5e\x38\x2d\x12\x98\xdf\xe5\x97\x62\x87\xf9\xef\xaf\x7e\x59\xd5\x1b\x54\x9b\xe3\x3c\xf9\x70\xd2\xe8\x6f\x1e\x8b\x34\x10\x2b\xf3\xaf\xb4\xd7\xa6\x3b\x6e\xd3\x07\x71\xcc\x87\xda\x90\xf4\x4e\x99\xa7\x8b\x9b\xca\xdb\xdf\x64\x3a\x91\x7f\xff\xbf\x7c\x18\x71\x24\xc2\xb4\x01\xe5\x86\x90\xd7\xf2\xb2\xb9\xf2\xe7\xf3\xa1\xeb\xc9\x92\x7d\x7b\x5f\x18\x0a\x15\x32\xb4\xa7\x0c\xd7\x90\xb0\x3f\xad\xa7\xa7\x4c\x15\x20\xea\xff\xab\x01\xda\xce\x36\xf2\xbb\x6d\x3e\xae\x7a\xf4\xc5\x1a\x8b\x2f\x83\x9b\x91\x29\x0f\xe2\xd5\x62\xc2\x49\x3f\x53\xf7\x2c\xad\x96\x9c\xe4\xd9\x61\x5d\xf1\x53\x83\x9a\xf2\xa8\xe2\x9f\xf6\x48\x8f\xe5\x19\xe3\xf3\xbf\xcf\x19\x21\xd8\xad\xef\x14\x42\x7f\xed\x9a\x11\xed\xd9\xa3\xf7\xd0\x04\x9f\x7d\x35\x67\x47\xb9\xcb\xcf\x10\x7e\x0f\xfd\xe3\xef\xec\xa1\xb1\xad\xe6\x08\x6c\x41\xf3\xda\xb8\x9e\x73\xc5\xac\x97\xb1\x07\x55\x12\x8f\xff\x8b\x23\x27\x64\x2e\xc1\xcb\x90\x51\xe5\xd5\x45\x4a\x0c\xf1\x9c\xd9\xc6\x79\x50\xd2\xaf\xff\x12\x3f\x08\x33\x94\xfe\xf6\x8a\x5c\x61\xfa\x81\x75\x80\xd9\x62\xe6\xc7\xa6\x0f\x74\x48\x77\x04\x0d\x61\xdf\xc2\xf6\x5f\x1c\x7d\xd7\x40\xdf\x11\x0c\x27\xe7\xd7\x27\xe2\x6f\xe1\xf9\x9c\x36\x89\x42\xf2\xbe\x8c\x7f\xda\x0e\x73\xab\xf4\xa6\xfd\x82\xbf\xcb\x90\xa6\x3b\xc5\x33\x66\x4c\x65\xcd\x8b\xd8\x7c\xe3\xff\x87\xdb\x86\xa3\xd1\x38\x6e\xb1\x70\xed\x5c\xb5\xdc\x11\x75\xa1\xc8\x22\x54\x22\x5a\xbd\xb2\x10\x96\xf2\x51\xdc\x36\xea\x9e\x97\xe7\xcb\xec\x3a\x1c\xea\x15\x0d\x96\x50\xab\x9d\xe0\xed\xa0\xdf\x47\xb8\x68\x2a\xf6\x8d\xd5\xff\xf7\xf3\xd4\xda\xf3\x07\x4f\x7d\xe9\xff\xbc\xa3\xc7\xbd\x7f\xea\x4f\x0a\xd0\xb5\x1f\x3e\x8e\xbe\xe3\x98\xe3\xb2\x5f\xff\x79\x77\xbd\x36\xb2\xd3\xf3\x31\x61\x6c\x34\x99\x02\xce\xeb\x38\x62\x25\x7e\x15\x3b\x76\x4a\x11\x8f\xf5\x1e\xff\xd5\xbd\xc0\x18\x1b\xb9\x40\xc9\x53\x47\xb9\x6a\x52\xc9\x21\x4b\xdf\x3c\xb3\xc6\xa0\x11\x90\x70\x0a\x5e\x1a\xc4\xd2\xb5\x7e\xc8\x55\x16\xb1\x70\x5d\xf5\x40\xa7\x61\xca\x38\xd4\x0a\x3f\xbb\x38\x67\xdf\xdd\x7f\xcf\x87\x47\xda\x89\xa8\xf7\xb8\x7d\xb3\xfb\x4c\xe8\xc7\x75\x0e\xd6\x49\x69\xd1\xd5\x1c\xf8\xe4\x2f\xec\x21\xaf\x66\xc5\xf0\x1d\x75\x20\xe1\x79\x4c\xd8\x37\xb9\xb6\xde\xab\x50\x14\xbd\xe9\xf2\x65\xc9\xa6\x3e\x9d\x3f\x68\x30\x81\x37\x7f\xff\xde\xa6\xbf\x1e\x79\xa8\x7f\xfb\x27\xe7\x2f\x7a\x3b\x27\x53\x96\xe0\x39\x8c\x7e\xce\x6d\x87\x38\xd0\x56\x9a\xfb\xea\xf2\x64\x6b\x6b\xc0\xc4\x89\x10\xef\xf9\x61\xee\xbe\x6c\x6d\xaf\xe4\x60\xfb\x97\x3f\x56\x80\xf1\xbd\x27\x24\xbf\x5b\xee\xf0\xa4\x31\xff\xd5\x78\xdf\x3b\xf5\x80\xba\x38\x65\xca\xab\x95\x4e\x48\xb8\x86\x6c\x5e\x85\x52\x7d\xbe\x4f\x28\xe2\xc1\x72\x59\x25\xd6\xdc\xd3\x97\xee\x2d\xe5\x7b\x63\x16\x3c\x2d\x86\x66\x3e\xde\xfb\x5b\xfc\xb4\x48\xa4\x20\xfd\xb2\x53\xf8\x23\xfc\xf6\xbc\x37\xc4\xbf\x67\x05\xcc\xe5\x03\xc0\x36\x54\xaf\x1d\xfb\xd9\x64\xf1\xd2\xff\x22\x16\x21\x27\xfb\xe7\x7d\x87\xb9\xa8\xe7\x70\xa4\x0b\xec\x78\xde\x2d\x6e\xd0\x1f\x54\x38\xbf\x1e\x18\x3d\x69\xc9\xc1\xab\x2d\x06\xce\x70\x55\xce\x49\x19\x5a\x69\x7b\xca\xf3\x9f\x9e\xd4\x3b\xc7\x28\x3e\xa1\x68\x61\x16\x90\x55\xf5\x98\x57\xdd\xf5\x04\x6d\x73\x39\x38\xd1\xe1\x18\xcc\xe6\x17\x97\x3f\x4d\x9e\x06\xf3\xc9\xd5\xe4\xd5\xa3\x78\x34\xc0\x19\x5b\x7f\xf6\x22\xf0\xfa\xa7\xf7\x4f\xdb\xdd\xed\x75\x96\x61\xd1\xae\xc3\x1d\xc6\xb5\x1d\xb7\x27\x36\x4b\xd3\xf7\xcf\xc0\xed\x97\x5f\xf1\x73\x15\x2e\x25\x2f\x5d\x3f\x3f\xe8\x64\x7e\xda\xf8\xb4\x21\xbd\x59\x7d\x0d\x78\x67\x04\x75\xac\x70\x50\xf1\x20\x7d\xa2\xdf\xef\x35\x8f\x5f\x50\xb3\x6e\x75\xd5\x8a\x29\x2d\x23\x8c\x9c\x3f\xfa\x23\xca\xbe\xd8\xa6\xe7\x51\xf5\xce\xc6\x18\xd3\x11\x10\x5b\xa2\xaf\xf0\xf7\x1d\x32\xdd\x0c\x4a\xa2\xe8\xba\xf3\x26\x65\xed\xd5\x12\xcc\x1d\xb9\x01\x0d\xc9\xf0\x2d\xd8\x2d\xa2\xd0\x3e\x57\xa9\xed\x5d\xb6\x9e\x82\x3b\x65\xfa\x57\x7f\x8d\x81\xe6\x7c\x50\x59\x52\x82\xf2\x63\xbf\x98\x3d\x75\x55\xb4\xd4\x1d\x1f\xb2\x90\x85\xa0\xf9\x7c\xf6\x26\x54\xb4\x65\xbe\x27\x6a\x76\xa3\xee\x1f\x49\xe3\xff\xe2\xf8\x6e\x5c\xe7\xee\x91\x05\x09\x89\x54\xbf\x48\xf0\xfc\x16\x33\x84\xe0\x91\xdc\xc5\xdb\xae\x01\xeb\x32\x6f\x2f\xad\x92\x57\xe9\xfb\x2f\x7a\x32\xc3\xeb\x73\x35\x11\x1c\x62\xf6\x48\x29\xff\xdd\x3c\xf8\x87\x8a\xc2\xd1\xfb\xe2\x54\xf0\x60\xa2\x72\xde\xb4\x43\xe4\xc7\x97\x53\xff\xef\x8c\x86\xbf\xf5\xa2\xd5\x1d\x65\x06\x56\x1d\xcf\x1b\x4b\x6a\xeb\xe3\x46\xc0\xcf\x9e\x30\x1a\xab\xe9\xb5\x78\x08\xf7\x95\x99\x7b\xa5\x7d\xc8\x01\xca\x81\x5c\x25\x1e\xe5\xfd\x98\xb6\x81\x1a\x96\x68\x91\x74\x94\x44\x51\xa2\xcc\x1f\x4a\xb3\x69\xfa\x6d\xf8\x64\x7f\x7b\x72\xf2\xf9\xda\x78\xfc\xb7\xd2\x99\x54\x2a\x2b\x42\xb2\x24\xd3\x99\x23\x85\xab\x7b\x3b\x63\x50\xc5\x25\x87\x76\xf9\xec\x8d\x84\xf7\xa0\x9e\x09\xc6\x41\xfc\xdc\xd2\x2f\x30\x27\xfb\x3b\x8a\x35\x02\xcc\x6e\xc6\x99\x8e\x0c\xc2\x23\xb1\x1a\xce\x9c\xf0\xbd\x16\x43\x42\x5c\xd5\x0f\x39\x94\xf4\xe3\xff\xc4\x96\x7c\xe5\xe9\x8e\xc5\x0f\x3e\x2b\x3c\xcc\x26\x1e\x9e\xcd\x45\x6b\xfd\x3e\x35\xca\x8c\xfa\x1d\xf7\x6c\x28\x87\xfa\x20\x57\xdc\x57\xf3\x39\x90\x46\x61\xcc\x64\x78\xbe\x9f\x39\x6a\x35\xbe\xd0\x27\x52\x10\xe4\x47\x26\xe6\xcb\x77\x7c\x55\xf2\x01\x9f\xf7\xf9\xa5\x57\x66\x68\xc4\x63\x55\xcf\x5c\x7b\xdd\xff\xeb\x85\xa4\x0e\x08\x0c\x8d\x8f\xce\xe9\x5b\xd5\x57\x48\xbc\x4b\x1a\xaa\x2d\x1f\x72\x49\xd2\xfb\x78\x75\x25\xe9\x36\xf7\x6c\xa2\x19\x4f\x48\x5a\xae\x7c\x09\x3b\x67\x12\xaa\x30\x74\x7a\x97\xad\x31\x10\xfa\x6d\x2f\xcd\x25\x25\xf4\xb3\x0b\xc6\xd7\x5f\x4d\x09\x7f\x0f\x10\x47\x11\x5f\x8a\x5e\x87\xd7\x16\xd6\x21\xa7\x5c\x8e\x11\xc4\xfd\x99\x49\x29\x31\x9f\xac\x8a\xdf\x77\xd6\x1d\xee\xea\x0e\x73\x9f\x74\x71\xe6\xaa\x85\x62\xcc\x7f\x90\x31\xb7\xf8\xde\xca\xc2\x24\xe1\xb7\x44\x72\x47\xb6\x77\xe5\x5d\xbd\x2f\xf6\x55\x0b\x0b\x82\x06\xe2\x64\xfd\x94\xff\xf5\x48\xe0\x3b\xa5\xe2\x4c\xac\x7c\x34\x36\x55\x91\xa9\x3e\x73\xd9\x69\x32\x18\x3d\xfe\xe0\x98\x0b\x76\x25\xe6\xa7\xd1\xa2\xc6\xb6\xb4\xc4\x73\x66\x90\x5f\x50\xc0\xdc\xd3\x71\x90\x35\x6f\x2e\xb2\x61\x8c\x21\x4e\x9c\xcb\xf3\x70\x39\x8d\xa4\xff\x22\xd5\x11\xd2\xd3\x45\xbd\xf8\xbf\x62\xf7\xf2\xc9\x33\x4f\xeb\xfc\xef\xac\xe9\x4a\x8f\xbb\x66\x3d\xf1\x30\x66\x30\x3d\xec\x8e\x97\x07\xc5\x38\x7f\xbf\xce\x38\x84\xf9\x86\x21\x85\xd5\x9b\x95\xfe\x92\x73\x34\x93\xa2\x57\x53\x65\xc8\x8e\x26\xe2\x9e\x86\x8b\x50\x3e\x27\x8d\xcd\xe3\x05\x67\xe2\xbd\x1c\x39\x48\x5b\x95\xe3\xa5\x14\x4b\x49\xfa\x42\x90\xfc\xbe\x04\x8b\x3b\xd7\xdc\x08\xff\xce\xcd\xed\x56\x74\x42\xe6\x2a\xfa\x12\xaa\x31\x1a\xdc\x93\x7e\xbc\x4e\xb7\xee\x4c\xb4\x45\x20\xde\x88\xaf\xfa\xcf\x49\x0d\xf6\x19\x6c\x47\x99\x7f\x0f\xa4\xd9\xd6\xbe\xb4\x5a\xe1\x55\x20\xf9\xbb\xbf\xb0\xde\xd7\xda\x80\x61\x24\x49\x5a\xcc\x21\x7b\xc8\x2e\xd9\xdf\xc8\xb5\xdf\x1a\x04\xf1\x93\x57\xd9\x17\x02\x9c\xff\xbf\xb3\x2c\xb3\xbe\x6d\x52\x2b\xcc\x5f\xac\x9d\xbd\x4a\xb4\xd0\xf0\xb9\x16\xfc\xc2\x9f\xe8\x97\xe2\x18\xc8\xab\xf3\x56\x25\x38\xb9\x17\xe5\x58\xfd\x45\x1a\x4c\x1c\x46\x84\x2a\xd7\x19\xb3\x69\x82\xd7\x4b\x01\xcd\x48\xe5\x49\x47\xf4\x13\x93\x84\x2f\x37\xa5\xbb\xc5\x49\x12\x7e\xe7\x60\x6a\x70\x4e\x18\x9f\xef\xd7\xbf\xb1\xf4\xb9\x71\x4d\x84\x07\xf2\x1a\x2f\x10\x9c\x71\x70\xff\x9a\x65\x8a\x01\xd2\xbc\x6d\x9f\x78\x3c\x8b\x59\x94\xca\x6f\xe3\x3f\x04\x5e\xa3\xaf\xea\x6c\xbd\x24\xbf\x93\x0f\x31\x03\x64\xa4\xf9\x7a\xb9\x2c\xc2\xf3\x3c\xed\x37\x83\xfa\xc8\x27\x36\x0a\xb6\x2d\xf2\x6a\x37\xac\x6d\x5e\x38\x88\x3a\x71\x50\x4e\xd1\xac\x4a\x53\x2f\xc0\xf9\x3b\x27\x7f\xcd\x85\xca\x05\xe3\xef\x2b\xb3\x78\x18\x4d\xb1\x8f\x7a\x14\xf7\x25\x12\xa8\x72\xbc\xf6\x5a\x08\xd5\x71\x79\x25\x6e\x7b\x34\xb0\x44\xa9\xda\xf8\x7c\xcb\x52\x30\xc0\x89\x44\xb3\x6b\x8c\xa5\x92\x44\xe4\x1c\x61\x4b\xdf\xe7\x04\x04\x65\xa6\x69\x6a\x47\x0e\xbe\xe9\x67\xbf\x2c\xe8\xce\x85\x7b\x74\x3c\x07\xa4\xcf\x0c\x67\x4e\x2b\xb4\x7f\x8b\x7a\x8d\x9b\x23\xdb\x01\x1c\x57\xc2\x23\x16\xaa\x5c\xb8\x4d\x58\x8b\x68\x2b\x90\x22\xf9\x94\xbf\x5d\x55\x2e\xfd\xbf\xf7\x65\x36\xa0\x84\xce\xbf\x45\xe1\xa3\x0b\xca\xf4\x11\xb9\xa4\x98\x0d\x9a\xce\xe2\x73\x54\xce\xbb\x68\x05\x44\x5d\xf9\x88\xe2\xa2\x1c\x91\x81\xa2\xa1\x14\x6b\xfe\xed\x6e\xa0\xe2\x37\xfd\x25\x3c\xfe\x3c\x54\x0a\x51\xbf\x4a\x5e\xc9\x5c\xfd\xb0\x21\xda\xd9\x98\xce\x87\xb2\x46\x63\x14\xe2\x74\xc5\xa6\x5a\x16\xd6\xf0\x12\x9d\x5f\xd6\x49\x39\x82\xb0\xce\x40\xc1\xb8\x0e\x7b\x63\x1a\x99\x1b\xdd\x09\x7c\x48\x69\x8d\x9d\xab\x2e\x4b\xa2\x7d\xff\xad\x94\xaa\x93\x97\x82\x3a\xcd\x02\x91\xce\x77\x8d\x47\xa4\x7e\x52\xf7\xa5\x17\xed\xa6\x95\xa1\x9e\x79\x85\x37\xf4\xe3\xfe\xc5\xe3\x9d\x7d\xd3\x9b\x77\x6c\x0d\xc3\x5d\xbe\xb8\x5f\x9b\x06\x4f\x16\xe1\xba\x72\x88\xed\x5e\x25\x35\xad\x7a\x1d\x06\x40\x48\x50\xb8\x74\xeb\x92\x83\x85\x9a\xcb\x0d\xbf\xdc\x1c\xcb\xac\x5f\xb8\x29\xc1\xb3\x5e\x1a\x6d\x17\xe6\x02\x23\x26\xfa\xee\x4e\x15\xb4\xa3\x78\x91\x97\x2c\x38\xea\x0c\x3b\x7d\xf9\x63\xbe\x15\x1d\x89\x55\x44\x37\xaa\xd7\xfd\xf1\x57\x3f\x28\x77\x07\x5a\xaa\xd1\xde\x0d\x1b\xc3\xf0\x51\x72\x53\xb9\x8f\x82\xf9\x05\x54\xe1\xe0\xdb\x4a\x68\x4f\x84\x18\xc3\x20\x5c\x78\x68\xbc\x22\x28\x46\x8f\x20\x2f\xeb\xc6\x28\xde\x14\xe9\x1c\xc6\xb2\x74\xa2\x77\x58\x5f\x4a\xf8\x0d\xef\x00\x58\x25\x40\xdd\x47\xf9\x05\x43\x6e\xee\x65\x3a\x6b\x44\x9a\x72\xf7\x3a\x7d\xfc\x6e\xd9\x46\x30\x7f\x73\x3b\x5d\x66\xb8\x17\x5e\xb0\xdf\xf3\xf2\xb2\x9d\x4e\x0a\x0d\xa0\x96\x04\x12\xb1\x11\x92\x05\x20\x14\x17\xa0\x80\xda\x5b\x83\xf4\x0a\x13\xfd\xe9\xa0\xd4\xf4\x4d\x9d\x4f\xc5\x7e\x97\x4e\xc3\x7e\x6f\xd1\xf1\x9c\xb7\xdf\x3a\x4b\x79\x30\x0f\x41\x76\x50\x89\xc4\xd4\xe4\xba\x21\xd8\xfc\xc9\xa0\xb2\x9b\xc6\xf7\x13\x02\x9e\x31\xdc\x9e\xe8\xf0\x23\x31\xdb\x5f\x67\x1b\x23\x7c\x46\xf5\xd6\xd3\xe6\x7a\xf8\xa8\xbf\x7b\x2d\xa5\x8e\x1d\xa3\x51\xbf\x75\x41\xc3\x71\x40\xf8\x24\xb6\xa9\x23\xf9\x74\x9a\x81\x81\xd0\x12\x8e\xb0\x67\xa3\xdb\xfb\x84\x50\x2b\x40\xbc\xb1\xd2\xd1\xc6\x23\x70\x04\x27\x08\x40\xdf\xb9\xdf\x8c\x0d\x4a\x37\x8c\x05\x7d\xbf\x39\x9a\xcf\x22\x8f\xf2\x8d\xb4\xa8\x3f\x7e\x4a\x90\x7a\x05\xf0\xbd\x29\x3e\xb6\x1e\x81\xa9\x55\x35\x01\x67\x02\x8a\x7f\xdd\x6f\xef\xb8\x75\x18\x6e\x45\x09\x46\xa8\x74\x9b\xca\xfc\xc7\x96\xd4\xb7\x3d\xfb\xd3\x36\xca\xbd\x8c\xda\x25\x9f\xf5\x95\x76\x38\x38\x83\x8c\x15\x2f\xb7\x25\x5b\x70\xf3\x21\x13\xa0\x69\x22\x56\x49\xa7\x91\x5e\x37\x70\x4e\xdb\x2e\x2f\x9e\x0a\x7f\xe6\x14\x06\xd3\x37\x76\xe4\x29\x5a\xf8\x4a\x5d\x67\x60\xd2\x0f\x88\x1b\x00\xd1\xa6\x96\xa3\x05\xb8\xa9\xdf\x40\x25\x64\x51\x96\xbe\x16\xfb\xdd\xcc\x5d\xd3\x24\xa9\xad\x32\x0c\x69\x46\x3f\x51\xbb\x17\x7f\x1e\x16\xaf\x18\x3d\x35\x48\x24\x24\x0b\xa2\x94\xc8\xd6\xec\xbd\x00\xe4\x0d\x59\x37\xe3\x3b\x9e\x5f\x07\x7e\xf3\x70\xad\x45\xa0\x19\x87\x35\x15\x86\x7b\xfa\x11\xc1\x70\xed\x44\x8c\xd3\x8a\xab\xf0\x69\x1e\x4f\x98\xbd\x0a\x0e\x38\x80\xdd\xec\x53\xed\x4d\x83\x20\xa4\x69\x62\x88\x73\x74\x69\x45\x8f\x37\xe4\xde\x77\xef\x23\x4e\x8f\xdd\x13\x5c\x8c\x2d\xc3\xc1\xbd\xf3\x7f\xfc\xfb\x3d\x42\x0d\x48\x23\xd3\x78\x06\x73\xca\x6f\x02\x8e\xca\xeb\xe2\x4d\x80\xf6\x60\xc8\x27\xeb\x65\x5b\x63\xde\xe8\xc2\x41\x2c\xae\x00\xd8\xa0\x27\x21\xf6\xbd\x9d\xcb\x41\x89\x1f\x52\xe2\xa3\x2d\x2c\x36\xda\x69\x30\xc3\xf9\x7e\xf1\xb1\x5a\xb7\x75\x1d\xd4\x02\x30\x7d\x14\x30\xc3\x4a\xd4\xd9\x1e\x80\x33\x23\xd8\x89\xd4\xee\xb8\xd8\x97\x66\x94\x06\x47\x32\x6c\xfa\x5e\x7f\x5f\xe9\xf1\x57\x1a\xe5\xe2\x8a\x2b\x2e\x65\x11\x16\x08\x1c\x13\xc8\x14\xa6\xb7\x8c\xaf\x00\x05\x1b\x60\xb0\xab\xde\x93\xad\x7f\x77\xfd\x49\x30\x2d\x0d\x90\x18\x46\xe0\x40\xde\x6b\x9c\x69\x99\x85\xeb\x55\x05\xb9\x71\xaf\x70\x13\xd8\x45\xd4\x25\x40\x68\xd1\x09\x67\xb2\xcc\xb9\x73\x64\x8c\x09\x30\xcc\x76\xac\xca\x6b\x99\x6e\xd6\x5c\x88\x77\x48\x89\x79\x67\x4b\xe5\x28\x9f\xc3\x9f\xff\xa4\xff\xf3\x32\x52\x18\x1e\xea\x08\xc7\x9b\x1f\xf8\xf3\xe8\xb2\x91\xb3\x58\x0b\x47\xbf\x92\xf2\xe3\x73\x84\x4b\xf1\xcb\x90\xf2\xe8\x08\x4c\x70\x0b\xa6\xec\x01\xb3\xcf\x5b\x30\xdd\xad\x33\xd9\x0d\xa7\x41\x63\x53\x3a\x05\xa6\x0c\x92\x8d\x18\x84\xd7\x70\x7b\x17\x38\x42\x01\x70\x35\xf2\x03\xec\x03\x13\xc0\x55\xe2\x3f\x21\xf4\xbe\x15\xe9\x6d\x8b\x4a\x89\x98\xb0\x0e\x17\xa5\x78\xbd\x0c\x03\xb0\x21\x74\xbd\xa7\x12\xf1\x7f\xeb\x92\xbf\xeb\x28\x47\x9d\xa8\x37\xf1\xfc\x94\xb5\x34\x13\xcd\x7a\xb5\x7c\x24\x7f\x98\x62\x06\x50\x8c\xcf\x42\x28\xb6\xdd\x93\xb3\x27\x38\x83\x04\x00\x1f\x13\xc3\x76\x66\x8a\x6a\x1e\x67\xe4\x36\xfe\x35\xae\x61\xc5\x6a\x15\xb4\xe6\x21\x2a\x3b\x30\xba\x60\xeb\x9d\x80\x08\xf2\x00\xcb\xfd\x75\x89\x89\x65\x63\x00\xa7\x26\xa0\x50\x11\x3e\xfc\xc1\x10\xf5\xc1\x86\x8b\xc1\xe5\xfd\x9c\x65\xfb\xf6\x92\xb4\x3f\x4f\xd5\x9b\x4b\x6c\x13\xd6\x42\xac\x86\x32\x6e\xbf\xcc\x40\xf2\x1f\x04\x44\x55\x33\x78\x77\x8e\xb7\xcd\xe0\x98\x13\xb2\x28\xaa\xe0\x07\x7d\x5b\xb8\x11\x20\x08\xc3\xc1\x20\x12\xf9\x4e\x33\x54\x6b\xd4\x19\x6e\xa2\x3c\x71\x0c\xf2\xb9\x09\xde\x39\xfa\xf2\x2b\xc4\x83\xeb\x84\xea\xe1\x38\xce\x11\x3b\x35\xef\xa5\xc8\x88\x82\x58\x18\x82\xee\xe7\x49\xb6\x4f\x43\x58\x0a\x42\x97\x8c\x01\xdd\x19\x03\xdb\x28\x11\xb3\xbe\xaf\xff\xea\x8b\x4a\x2f\xcb\xbc\x2c\xb0\x88\x8e\x09\xc9\x8c\x22\xdf\xdc\xce\xfd\x32\x17\xd3\x33\xc0\x80\x0d\x99\x83\xc9\xe8\x16\xb1\x48\x29\x00\x87\x9f\xe0\x00\x09\xd3\xf3\xb4\x5b\x78\xa9\x6f\x05\x21\x0b\xf0\x63\xd7\x1a\x6f\x21\x69\xbb\x7a\xb6\xf7\x08\xcf\x65\xf8\x7b\x46\x0e\x38\x31\x03\xd1\xe4\xfb\xb9\x51\xa1\xc5\x46\xd0\x09\xc1\xf4\xf8\x09\x03\x80\x3d\xcb\xcb\x17\x86\xf1\xc1\xaa\x19\xfb\xaf\xa5\x0f\xc6\x17\x3c\x0f\x32\xf6\xf0\xaf\xd6\x5d\xbc\x5b\x81\x44\x60\x5e\x18\x66\x31\x71\x87\x12\xc7\x91\x83\x4e\x50\xc9\xc2\xa4\xc0\xb6\x24\x04\xb7\xff\x40\x18\xd9\x7d\xbe\x89\xc3\x08\x17\x0a\x30\x78\xfd\xad\x16\x30\x3d\x75\x0d\xb7\xe2\x1b\xd6\x2a\x7a\x00\x96\xc5\xc9\xd0\xc0\xca\xf0\x5c\xca\x38\xc6\x80\x8b\x28\xc9\x37\x7c\x25\x70\xb7\x26\x7a\x38\xd1\x77\x1e\x9c\x3d\x00\x1d\x8d\x22\x8d\x9b\x7d\xdf\x4c\x86\xe0\xc6\xee\xab\xa2\xf4\x5c\x7d\xca\x86\x31\x28\xef\x1e\x7f\x44\xc2\xbf\x6b\xc9\xbf\x5f\x62\x06\x53\xdb\xe3\xb7\x33\xd2\x6d\xdb\x26\x2b\xa2\xc4\xe1\xdb\x6d\x91\x09\xc0\x6b\xeb\xc1\xf6\xa0\x70\x2f\x52\x27\x51\xde\x36\x65\x1c\x11\x86\x22\x93\xeb\xe7\x49\x2f\x8f\xf8\x64\xe9\x10\xd3\x1a\x8d\xd6\x33\x93\xfb\x37\x7e\xd6\x16\x89\x28\xa6\xa6\x40\x90\xe9\x3b\x04\x14\xf9\x0b\x54\xf2\xfc\x7e\x28\xdf\xed\x07\x02\xc0\x1c\x04\x80\x2a\x8b\x9c\xd8\xa0\x81\x09\x74\x84\x84\x7d\x1a\xca\x12\x5b\x99\x68\x0a\x02\x1a\x0f\x3c\xa8\x1c\xfe\xf6\x0d\x85\xef\x6a\xf9\x6c\x69\x72\x20\x2d\x0c\x22\x4a\xd9\x97\xcc\x22\xb5\x51\x20\xd9\x00\x80\xc5\x95\xeb\x1e\xf4\x76\x2b\xba\xf0\xbd\xe1\x5c\x32\x27\x8d\x71\xe7\xca\xa1\x55\x7d\x6a\x79\xcd\x00\x64\x1f\x12\x3b\x27\x10\x0e\xd1\xe5\xae\x49\xf2\xb7\x7f\x1c\xfe\x55\xc4\x92\x13\x1c\x4a\x9c\x41\x10\xb4\xda\xa1\xc7\xc8\x32\x02\xc2\xcf\x18\xe6\x44\x9d\x99\x78\xd4\x8c\x71\xcd\xe3\xe3\x55\xf0\x7b\xb9\xab\xcd\x68\x4f\x04\xb1\x7a\x77\xe7\xb6\xfc\x69\x29\x51\x8e\xe6\x60\xa7\xb2\xc0\xc7\xc2\xb0\x48\x38\x5d\x56\x3f\x73\x2e\x08\xdf\xad\x9d\xe7\x79\x5d\xe1\x3c\xdc\x69\x9a\x3d\x36\x6b\x47\x07\xa5\xb5\xe1\x67\x6f\x39\x87\x50\x7d\x0a\x14\x40\xbd\x17\xfc\xcc\xe0\xcf\x0a\x36\x02\x38\xdd\x79\x1d\xf9\xc6\x7f\x5e\xe9\x53\xa2\x83\x98\xd9\xc0\x04\x73\x05\xd3\x6e\xe0\x50\x9f\x6b\x85\xcd\xab\x44\xd3\x08\x5c\xa3\x2f\xc9\x8b\xb1\x50\x35\x67\xea\xf9\xda\xa4\x98\xc6\xd9\x30\x97\x89\x4d\xdf\x5e\x34\xbf\xbf\xff\x6a\xcb\x43\x55\x78\x35\x93\x53\x16\x59\x1a\x67\x53\xf5\x4f\x8b\x29\x64\x7e\xaf\x80\x8a\x21\xfb\x9f\x00\x14\x74\x01\xd8\x92\x0d\xcc\x74\x23\xbd\xbb\xd9\x5b\x37\xd1\x38\x8b\x1c\xb0\x37\x5e\xc1\xf2\xe5\xd9\x23\x28\xea\x97\xe8\xc1\x45\xcb\x50\x7c\xfd\x9c\x90\x4e\xaa\xfb\xe1\x0a\x8c\x12\x13\xa8\x56\xcd\x51\x70\xb8\x51\x38\x78\xb6\x65\xe7\xdb\xcc\x41\x14\x86\x7f\x71\xdd\xa2\x31\xc0\xf9\x8d\x48\x20\xbe\x4c\x6e\x5c\x70\xf2\x9c\xe4\xca\x92\xd1\x6f\x32\x11\x73\x56\xdd\x31\xed\xef\xcc\x51\x55\x54\x6f\xc4\xa0\x36\xd4\xdf\x61\x36\xd5\x7d\xd0\x7f\xca\x86\xed\xc2\x6f\xad\x10\x05\xc2\x73\x26\xd1\x93\xa4\xb5\xac\x9b\x2e\xa4\x4f\x6e\xca\x89\x8d\xce\x18\x82\xd8\x4e\x06\xb0\x51\x58\xf0\x61\xf8\xbd\x6f\x8c\x43\x51\xee\xbb\x72\xe3\x69\x9b\x80\xb4\x57\x11\xce\x64\xc3\x52\x8d\x4f\x42\x77\x32\x80\x10\x7d\x01\xd8\x11\x80\xa3\x3d\x88\xd2\xb6\xe4\x75\x23\x38\x86\x00\x24\xea\x66\xeb\x5a\xb8\xbe\xfb\xfb\x91\xc2\xed\x1b\xad\x41\xcb\x52\xe1\xd4\x5e\x35\x50\x93\xf4\xfe\xe9\x45\x03\x07\xa8\x51\xbc\xff\x51\x24\xf5\x4e\x07\x28\xd1\x7d\x28\xfa\xb6\xef\xe4\x24\x84\x7d\xcc\x4c\x71\xb7\xa3\x96\xed\xa5\xce\x27\x13\x69\xa6\x48\x8d\xae\x6d\x77\x92\xc9\xbb\x1d\x4a\x68\xf5\x87\x16\x13\x07\x6a\x40\x37\x27\x40\x68\x88\xc7\x1d\x03\xa5\xcf\x64\xa4\x39\x0e\xd5\xc0\xc9\x31\x6c\xd3\x97\x1d\xc2\x34\x91\x7f\xff\xb0\x70\xed\x60\x55\xa7\x84\xdf\xc9\xca\x2a\x98\x47\xc7\x27\xc3\x7c\x6b\x29\x6c\x72\x43\xba\x8b\x40\xe4\x54\xb8\x80\x36\x98\xd8\x36\xb0\x6e\x92\x51\x3b\xc9\xa9\xbf\x0a\x6a\x77\x4c\xf3\x32\x0e\x12\x7b\x6d\x1e\x39\x0f\x12\x64\x34\x21\x7c\x32\x38\xf6\x5d\xfb\xab\x65\x50\xa1\x1e\x85\xb4\xe8\xea\xd5\x0f\x97\x9a\x27\xb7\xaf\x74\x5f\xb2\x0c\xdc\x29\x1d\x65\x77\xbb\xbf\x2a\xc9\xea\x19\x61\x57\xf1\xb2\xfc\x41\x88\x85\xbe\x1c\x4d\xef\x16\x52\xe2\xeb\x09\xb8\x2e\x05\x2c\xe4\x0e\x1c\x49\x8d\x58\x7c\x78\xb2\xb6\x88\x14\x87\xd4\xb5\x83\xee\xba\x13\xc1\x1c\x76\xac\x9e\x7d\x99\x09\xf9\x6e\x26\xf9\x61\x34\x6b\x58\xb7\x02\x88\x11\x34\x0d\xd8\x30\xbe\x52\x01\xb2\xd5\xe4\xee\x02\xd5\xc7\x96\x10\xbe\x04\xe4\x62\x1a\xcc\x35\x1d\x64\xde\x18\x38\xae\x3d\x21\xa8\x8d\x9d\xed\x74\xe6\x54\xdc\xfc\x49\x65\x66\xb4\x59\x42\x12\xbf\xe3\x4d\xcb\xc4\x19\xf6\xfc\x9f\x4f\xcb\x8b\x4c\x73\xf5\x3a\xf4\xe3\x0e\x95\xe7\x83\x44\x5d\xc9\x0f\xc7\xb1\x37\xa3\x1b\x29\x65\xa5\x8f\x0b\x20\x9d\x1b\x70\x58\xa4\x30\xab\xdf\xeb\xa9\x29\x90\x29\x5c\xfd\x92\x27\x64\x66\x5b\x3a\x6d\xd9\x30\x6e\x3d\x69\xeb\x92\xd4\xd7\xbf\x6f\x20\x93\x05\xd6\x2d\x18\x9c\xa3\xcf\xc1\xb9\x9e\xe7\x47\xc9\xfa\xee\x1d\x8a\x61\xd1\x37\xd8\xe0\x9a\x77\x86\xfe\x4d\xab\x69\xf5\x5e\xa7\x95\x31\x41\x37\x40\xa8\x47\xca\x72\xd3\x32\x7b\xf9\x32\x1f\xf5\x00\xc1\xb6\x9a\x01\x4e\x13\x54\xcd\x2b\xe1\x74\x0c\xd7\x21\x22\x41\x83\xfe\xe7\x1a\x51\xf3\xe7\xbd\xf2\xfb\xf5\x28\x40\x36\x71\x27\xd9\x54\x37\xb8\x73\x03\x1c\x14\x4e\x8e\x25\xb7\x94\x4f\xe0\x8c\x77\x52\x88\x61\x9a\x45\x12\x8f\x34\xeb\x69\x8e\x95\x5e\x36\x59\xe5\x49\xb1\xfb\x01\xb9\xed\x08\xff\x2b\xdb\xa9\x7b\xfe\xba\x0d\x48\x7a\xc2\x12\xda\x29\x27\x32\x42\xaf\xd8\x90\xbb\x10\xe8\xa9\x62\xf8\x2e\x28\x45\x1e\x7a\x5d\x13\x38\xad\x18\x20\x37\xa7\x7f\xdc\xae\xc3\x2f\x76\x77\x23\x1b\xe2\x70\x4b\x93\x14\x46\x04\xd3\xbe\xf6\x5e\xb7\x89\xcc\x95\x5a\xce\xde\xd9\x07\x7c\x35\xb3\x3c\xcb\xdd\x45\xe7\xc0\x13\xfd\x86\xf6\x5f\x5d\x2a\xcf\x3f\xae\x5d\xaa\x05\x0e\x20\xe1\xff\xf0\x18\xe6\xb7\x78\x1c\xa7\x8b\xb7\x9e\x6c\x77\x24\x3a\xad\x9c\xe9\xa9\x99\xe6\xa6\x69\xd4\x9a\x43\x6d\xf5\xf9\x85\x86\x08\x0a\x39\xbf\x4e\x0f\xc1\x1b\xbd\x78\x26\x93\xe4\x30\x67\xc7\x21\x42\x50\x14\xc5\x4d\xcd\xe2\x33\xf0\x9f\xbd\x6d\xae\xe1\xdc\x85\x3a\x21\x08\xd4\x42\x00\xb9\xd5\xa8\xc5\x0b\x82\xbe\xc7\x3b\x3f\xc7\x13\x6e\x59\xa9\x87\xee\x19\xcc\x4c\x27\xcc\x39\x0c\xcb\xb2\xae\x27\xf6\x16\x9d\xfb\xc6\xa5\x6a\xc9\x4a\x1c\x5c\x8f\xdb\x9e\xeb\x47\xf8\x3b\x9b\xb4\xae\x21\x1a\x0d\x20\x3c\x33\xc3\x97\x92\xcf\xed\x4f\xa3\x3f\x05\x84\x5b\x2d\xc7\x20\x8a\x55\x5b\xf7\x1f\xc6\x10\x1b\xfe\x21\x82\x2d\x66\x9f\x74\x1d\x5e\x35\x3c\xca\x71\x70\x1b\x91\xc8\x2d\x43\xd1\xdc\xe1\xdb\x07\xab\x8b\x37\x59\xf2\xd0\x4c\xd8\x29\x2c\xf2\x02\xb8\xde\x46\xcc\x5f\xfc\x16\xe5\x05\xc8\x0d\xa5\x0d\xa4\xc0\x3c\x2a\x62\xd7\xf4\x75\x01\x40\x96\x00\x7e\x17\x9d\xad\xec\x1f\x5a\x5c\x27\xcc\x8e\xac\xcb\xb6\x99\x8c\xb8\x74\x44\x12\x95\x79\xff\x62\x90\x4a\x11\x21\x11\x9c\x08\xf6\xa8\xb6\x3c\xe3\x30\xcc\xa6\xd2\x55\x0d\xa5\xa8\x40\x2a\xcb\x22\x56\x2d\xff\x1c\xc7\xee\x2b\x14\x48\xa2\x64\x62\x4a\xd6\x0c\xe7\xd8\xfe\x98\x7f\xb5\xe2\x2f\x5d\xf8\x72\x06\x5c\x36\x21\x04\x7f\x31\xd1\x48\xdf\x8a\xc0\xfa\x0a\xcc\x36\x73\x02\x0f\x3d\xee\xe1\x29\x91\x90\x9b\x31\xd9\x06\xb0\x89\xe1\x90\x7f\x72\xe5\x17\xed\xf1\xd0\xe5\xbf\x79\xbd\x25\x18\x47\xc5\x83\x17\x73\xf1\xea\x07\x9b\x65\x45\xbe\xd7\xda\x9e\x33\xb8\xbf\x8e\x45\x88\xad\xe8\x38\x34\x53\x7e\x1a\x81\xbf\x26\xef\x38\x01\xae\x63\x44\x9b\x1e\xe6\x17\xd9\xe8\x06\xd2\x1f\x0e\x61\xb2\x95\x80\x44\xe9\xab\xfd\xe3\xb5\xf6\x05\x5d\xe3\x3f\x68\x62\x85\x8c\x37\x65\x89\x78\x89\x97\x60\x82\x88\xf5\xfd\xae\xa9\xda\x16\x90\x3d\x4d\x6f\x32\xd5\x4c\xb0\x5a\xe5\xef\x47\xc1\x0c\xb9\x31\x25\x06\xf5\xc7\xb3\x4b\x90\xf7\x7d\xfb\xdb\x8f\xe2\x79\x83\xab\x33\xc2\x34\x03\x54\xfd\xfd\x98\xe0\x09\x57\x61\x0e\x39\xf1\x8a\xc4\xeb\xbc\x29\xf7\xab\x17\x46\xfe\xb1\xa9\x2f\x5f\xfd\xc2\x4d\x2e\x42\x11\xc4\xbf\x43\x5e\x63\xb4\xf3\xe5\xf0\x8d\xf7\x3e\x3a\xf7\xd3\x71\xfe\xee\x7b\x9e\xa7\xa3\xc8\xcf\x28\x59\xd0\xb3\x60\xe3\xe0\xff\x7b\xff\x58\xbc\xbd\x09\xec\xb4\xd1\xc5\xa6\xc2\x59\xc9\xbc\x93\x79\x79\x3a\xd4\x59\x34\xbe\x2e\x2d\xb2\xc7\x4c\x8a\xe8\x12\x36\xee\x79\x10\xbd\x80\x5f\xbf\x6d\x23\x90\xaa\x48\xe0\x0a\x06\x0a\x8a\x43\xe7\xdf\xe8\x55\x59\x6a\xc0\xe7\x10\x7f\x3f\x18\x83\x4d\x33\xb7\x8d\x32\xf8\x76\xe4\xb5\x9e\x97\xe2\x5d\x9e\xa0\x48\xcf\x15\x13\xfc\xce\xab\xdb\x02\x4a\xa5\x31\xd0\x2b\x6a\x89\x71\x64\x1b\xe9\x79\x3a\x12\xf9\xf9\x1a\x24\x00\x20\xa1\xfe\x21\xe2\x2b\x74\x0b\x96\x48\x39\x64\x9d\xfc\xb6\xcc\x5d\x4d\x0e\xf5\xff\x6d\x5e\xdd\x3f\x92\x00\xd7\x26\xe8\x17\x86\xa4\xb5\xfa\x5e\xe2\xbb\xb2\x15\x39\xe7\xe9\x3a\x47\xdd\xa8\x74\x79\x12\x74\xeb\x70\xdc\xce\x04\x67\xdb\x4b\x57\x5f\xf7\x1b\x41\x10\xb3\x51\x36\x0a\x71\xbe\xee\xb1\x8e\x37\xc0\x52\xca\xc5\xbf\xc8\x38\x9b\x9d\x2b\xbf\x66\x45\x9e\x89\xca\x97\xb3\xc3\xd1\xfd\x7f\x41\x01\x07\xfd\x2a\x8a\xda\x7f\x29\x08\x55\xf7\xea\x6a\xf8\xc6\x34\x02\xd0\x6c\x4b\x2c\x24\x50\xdf\xce\x0f\xc6\xf2\xb9\xcb\xec\xc0\xbe\xf0\x5b\xd5\x04\xf5\xcc\xda\xa9\x96\xef\xb7\xb5\xea\x36\xe9\x1c\x30\xb1\x5c\x75\xa8\xbd\x08\xdc\xc7\x91\x92\x79\x7c\xf6\xbf\xfe\x91\xa7\xb6\x04\xc9\xd0\x00\xdf\x0f\xc4\xbe\x7f\xee\x14\x43\x8e\xbe\xa0\x9f\x98\xf0\x74\x4e\x06\xe3\x8c\x7d\x6e\xf8\x31\x35\x17\xac\x38\x4b\xac\x3b\xe6\xe2\xf2\x2d\x87\x00\x0d\xf9\xfb\x5d\xd8\xb6\xb5\x17\x9f\xfd\xe7\xa6\x4a\x37\xe3\x2f\x86\x75\x01\x6a\x5d\x81\xee\x59\xae\xc7\x0d\xf1\xf1\xcb\xf9\xda\x01\x87\x0b\x46\xa5\x65\x52\x34\x33\x40\x58\xd0\xca\xd3\x48\xcf\x18\xf2\x1a\x55\x6e\x18\xc2\xfd\x86\xef\x16\x72\x09\x88\xf3\x24\xda\xba\xdf\x24\x9b\x6d\x9f\x5a\x23\x55\xc5\x5a\x89\xf2\x04\xfa\xef\xec\xf3\x99\x38\xba\x81\xf2\x0c\x03\xb2\xe3\xa1\xe5\x46\x30\xcd\x94\x97\xe5\x43\xa1\xb4\x63\xcf\x7d\x48\xb9\x30\xcd\xe7\x9c\x9d\x73\xd9\x71\x6e\x9a\xe7\xc7\x2f\x8c\xf8\x8c\x8b\x33\x19\x03\x71\x0a\x10\xd0\x87\x88\x5a\x96\x16\xf6\x76\xa9\x90\x34\x8b\x90\x57\xbe\x87\xfd\xc7\x5d\xab\xf1\xc1\x8c\x40\xe3\x04\x1a\xc5\xd8\xef\x67\x4b\x02\x88\x32\xba\x50\x7b\x2a\x83\x96\x9a\x59\xf6\xe7\x89\xda\x8f\x88\xdf\x11\xa2\x78\x7e\xdb\xa7\x44\x9c\x5f\x32\x78\xd3\x8e\xdd\x2a\x27\x15\x2f\xfe\x0f\xa0\x12\xef\x1c\x95\x9e\x6d\xab\x42\x8f\xe3\x77\xfa\xff\x7f\xfe\x6a\xe2\x38\xce\x60\x79\x82\x89\x12\xcc\x2f\x32\x45\x87\x30\xd5\x57\xec\xe8\x36\x0d\xdb\xb0\x40\x2b\xeb\xaf\xf7\x78\xb9\xd3\x99\x91\x06\xff\x56\x09\x86\xe2\x25\xf7\xab\xd9\x19\x93\x53\x1c\x94\x1a\x86\x65\xe1\xfb\x18\xf7\xe7\xe6\x79\x99\x9d\x47\xef\xf1\x3f\xbf\xd0\xcb\x80\x36\x84\xe2\xb8\xfa\xc8\xcf\x4e\x94\x9c\xa7\x5f\x71\x00\x90\xbf\x8c\xf2\xba\x74\xc8\xf3\x09\x72\x3d\x3b\x33\xa0\xc4\x20\xe6\xde\x08\x92\x95\x48\x74\x4c\x91\xdc\x49\xbc\x7c\xe8\xdf\x3f\x16\x34\x33\x1a\x73\xe7\x5b\x70\x32\x0d\x41\xd6\x27\x53\xab\xfb\xfb\xf6\x0b\xff\x38\xa0\xa0\xe1\x47\xfd\xa1\x79\x09\x7c\x70\xcd\xe9\x29\xf2\xa9\x99\xd1\xf9\x8a\xaa\x96\x7d\xc0\x5c\x80\x2d\x1e\xce\x70\xd8\x43\x7a\x10\x5b\x87\xe7\xa9\x29\xd5\xc3\x53\x72\x87\x9b\x7c\x87\x58\xc9\xa6\xe6\xde\xc9\xfb\xeb\xc7\xd1\x97\x77\xc3\x3f\x17\x2b\xf4\x87\xab\x99\x7f\x7e\x9e\x3b\x11\x24\xd3\x3f\xf6\xf3\x6e\x98\xcf\x31\xd8\xb0\x27\x7c\x81\xd1\x5e\xe9\xdd\x29\x30\x33\x81\x30\xcd\x0f\x7b\x94\x7f\x7f\xc4\x8f\xe5\xb6\x8f\x73\x19\x9b\x61\x9a\xe4\xba\x63\xef\xde\x7e\x2c\xa2\xf3\x2e\x97\xe4\xd6\x7d\x65\x56\x5a\x6d\x39\x20\xa6\x9e\x14\xdb\xda\x9f\xe6\x6d\xe8\xd7\x37\x83\x94\x1e\x92\x07\xef\xf5\x03\x34\xd6\x6e\x4c\x25\x44\xfa\x04\x93\x1e\x43\x76\x05\x08\x7f\xf4\x29\x68\x63\x5b\x30\xfb\xed\x44\xa2\xc1\xec\x90\xd8\xf7\x4f\x3c\x4d\xf3\x82\x96\x41\xa8\xf1\xaf\x0f\x31\x72\xc4\x97\x63\x91\xa7\xe6\x4a\x87\xff\x57\x6b\xef\x8a\x36\xb6\x38\x2e\x41\x10\x76\xfd\x7b\x67\x1c\x97\x40\xba\x4d\x6c\x5c\x16\x0e\x9b\xb5\xa1\xfc\xed\xe4\x10\xf6\x51\x0c\xfa\x13\x3b\xd2\xf2\x21\x5b\x06\xc3\x91\x01\x7e\xce\x8c\xe1\xfe\x7a\x0b\x0d\x0a\x30\x9c\x04\x85\xb0\xfa\xbd\x84\x63\x34\x2e\xde\x17\x66\x41\x87\xbf\xea\x98\x90\xd1\x6c\xfe\xce\x6a\x5f\xd3\xc6\x6e\x7e\x00\x81\x7f\x27\x8c\x07\x6f\x6e\xe0\x51\x5d\x54\x0a\xed\xf7\xd3\xf7\x48\xb8\x44\x24\xee\x44\xde\xce\x23\x1c\xac\x98\xea\x22\xd2\x24\x80\xf9\x40\xdc\x47\xf9\x54\xdc\xfd\x89\x01\xbf\xef\x37\x46\x20\xa6\x02\x17\x83\x33\x85\x58\x42\xad\x23\xbe\xb4\xc5\x58\x4b\x7f\x7b\xaa\x8f\x27\x2b\x3f\x4d\x02\x13\x5a\x04\xaa\xce\x62\x93\xd4\x88\x48\x36\xf2\x2d\x9a\x43\xfd\x44\xcc\x8d\xe1\x11\x84\x36\x77\xc4\x70\xc3\x4e\x84\x4b\x38\x02\xb9\x0e\x38\xd4\xaf\x5c\x77\xa8\x85\x94\x45\xc0\x2c\x9a\xbd\xfa\xd5\x4c\x7c\x91\xf2\x6d\x15\x69\x0e\x13\xd8\xf6\xd6\xff\xf5\x35\x3d\x2f\x6f\xac\x23\x45\x8a\x29\xef\xe2\x77\x58\x70\x74\x0a\x72\x4e\x25\x91\x5b\xa3\x5e\xbe\x1d\xec\x57\x67\x0a\xb4\xc2\x3b\x3a\xdf\xd9\xe2\x59\x10\xe6\xc6\xa7\x7c\xa9\x29\x6f\xbb\xa7\xc1\x17\x62\x10\x43\xec\x43\xbc\xdc\x4b\x10\x30\xc0\xcc\x8a\x2c\x13\xed\x48\x09\x6f\xc3\x5b\xfe\xc3\xa2\x47\x09\x69\xd5\x17\xe1\xb4\xa7\x29\x4a\x20\x95\x29\x8e\xce\x67\xc8\x59\x33\xab\x88\x6e\x97\x27\x69\xc1\xb2\x2a\xf5\x2a\xa5\x07\x7b\xd3\x12\x71\x87\x12\x00\x7e\x2c\xfa\x2a\xf3\x68\x5a\x17\x48\x95\x02\xb4\x1d\x89\x84\xe7\xe9\xf5\x5b\x7d\x0a\x84\x2b\x33\x98\x9f\x79\xc5\xe5\xa9\x46\x85\x32\x25\xe6\xde\xf7\xff\xbd\xcf\xcb\x80\x14\x6e\x37\x64\x0b\xa6\x8e\x8f\x26\x49\x66\xc0\xb0\x57\x8d\xed\x04\x73\x99\xf3\x12\x6f\x48\x43\x43\x11\xc3\x49\x26\x4a\x36\xcf\xc1\xae\x5c\x51\xd9\x7d\x0d\xdc\xdf\x18\x96\xf5\x2e\x6d\xbb\xa6\xd0\xcc\x5c\xd3\x17\xdb\x78\x9a\x90\xc5\x68\x1b\xf3\xce\x88\xf3\x77\xfb\xe7\xdf\x7f\xf7\xe3\x33\xfd\x5b\x7b\x01\xf5\x0d\xe4\x68\x05\x5c\x53\x98\xee\xa0\xbf\xb0\xb8\xee\x2e\x50\x29\xe1\x95\xa9\x36\x81\x62\xe5\x4d\x79\x41\x12\x00\x18\xf9\xfd\x43\x7a\xb7\x6a\x15\xd7\xab\xe0\x7a\x93\x6f\x27\x2b\xc1\x89\x8e\xcd\x1d\xd5\xb0\x5d\x16\x94\xc1\xa2\x10\x4a\x17\xf3\x0f\x99\xc3\xe4\x6f\x7b\x1e\xb6\x23\xa7\xe3\x05\xda\xcf\xfd\xea\x17\x47\xc7\xde\xff\xf3\xcc\x7b\xb8\x39\x7f\x22\x7d\x0e\x90\x93\x75\x9a\x01\x8e\x66\x30\x89\xd7\x3d\xa9\x92\x49\x2b\xa3\x32\x69\x9f\x0f\xe4\x4f\x90\x5f\x1d\x5d\x5e\xbc\xd4\x32\x36\x87\xb1\x25\x92\xec\x7c\xb5\x9d\x70\xbf\xb0\x13\xd9\x39\x32\x15\xcb\x2f\x6e\x96\x3c\x7c\x5e\xa2\x28\x06\x50\x84\x23\xf3\x39\x4a\xfe\x2f\x1f\xdd\x05\x1d\x66\x6f\x96\x23\x38\x04\x0a\x66\xa1\xe6\x01\x8a\x56\x9e\x5a\xac\xb9\x23\x11\x39\x15\x68\xfb\xe3\x99\xa2\x5c\x2f\xf1\xd3\xb2\xe2\x6e\x38\x09\x72\xb3\x39\x08\x8e\x23\x1c\x03\x35\x19\x7c\xd1\xfd\x32\xd6\x81\xda\xb6\xbe\xe3\x51\x57\x2d\xb7\x60\x1b\xc7\x83\xdd\x0c\x98\x22\x71\x86\x48\xc9\xf9\x7b\x3f\xb6\x4f\xfe\x77\xde\xb5\x73\x45\x82\x11\x45\x5e\x4b\x74\xe1\xc4\x70\x18\x02\x4f\x2a\x01\xe2\x48\x26\x16\x25\x3e\x3b\xcf\xc2\xd3\xfd\x37\xa7\x1a\xd2\xd9\x2a\xca\x7b\x3f\x21\xfb\x98\x12\xa6\xa7\xe4\x71\xf3\x6c\xa8\x03\xc9\xa5\xde\x49\x92\x65\x91\xf6\xc3\x06\xdf\x77\x87\x1c\x74\x40\x13\x06\xe0\x98\xf5\xfe\x7e\xdd\xa3\xb7\xd4\xfc\x79\xf6\x57\xe2\xb6\xf9\x60\x86\x39\x5b\xe9\xad\xa2\x87\x48\x14\x78\x3c\x01\xbe\x1f\x1a\x72\x32\xfc\xe5\xf3\x97\xe7\xed\xc6\x7c\xde\x3f\xa8\xb2\x9e\xbb\xfd\xf8\x1a\xd8\xc2\x3b\xc5\xc5\x0b\x16\x6e\xd1\x95\xf0\x68\xe0\xfa\x87\x1a\x81\xc1\xd1\x35\x0e\x2a\xc2\x2f\x11\xe4\xe8\x01\x0d\xc4\x7d\xf4\xb4\xbb\xf6\xf5\xff\x3c\x85\xc4\xcf\xb6\x01\x75\x1c\xca\xac\x50\x96\xc4\xba\xb8\x2a\x48\xd1\x0b\xa2\x54\xad\xd4\xcb\x5a\xa6\xf3\x0f\x0a\x58\xc6\x28\xe4\x48\x7d\x7d\x26\x24\x3e\x64\x9f\x4a\xb7\x09\x71\xe9\x5a\xf3\xd2\x84\xa3\x27\x69\xdb\x83\x05\xd4\x6c\x70\xb2\x21\x91\x62\x6a\x05\xb5\x87\xfb\xb9\xc6\x84\xad\xa2\xeb\xf2\xad\xa3\x51\x9e\x39\xe1\x8f\x18\x41\x30\xde\x4e\x85\x5f\xcf\xb9\x39\x8a\xf8\xef\x1e\xda\xf3\x8e\xc2\x09\x39\x46\x0b\x65\xb2\x3d\x98\x68\x0d\x2e\xda\x20\x5b\xc1\xab\x36\x29\x5c\xab\x84\xd6\xed\x1a\x02\xea\x34\x17\x4b\x96\x8e\x9c\x18\x6d\x41\xe8\x4d\x0d\xd6\x6e\x94\x6c\x3a\x52\x4c\xae\xdd\xa3\x14\xbc\xc9\x6f\x12\xcc\xd5\x59\xa4\x9b\xae\xd3\x07\xc2\xb4\x4f\xf8\x2c\x53\x52\x36\x91\x28\x49\x44\x8b\xa6\xbd\x32\xfa\x37\x83\xfc\xe3\xe4\x96\x71\xd7\xfe\xd3\x74\xef\x6b\x0b\x80\x3f\xc1\x41\xbf\xe0\x7a\x67\xdd\xf8\xa3\x63\x2b\xe0\x6e\x12\x71\x35\x95\xb8\x53\x17\x0e\xa2\x06\x25\x06\x40\x96\xba\x7e\x1d\x46\x7d\x0f\x40\x2b\x36\xe0\xc7\xd3\x1c\x73\x56\xa3\xf7\xde\x86\x3d\x1f\xa7\x31\xa7\xb9\x45\x33\xa2\xb0\x4f\x67\xda\xec\x4f\xa9\x44\x2a\x6c\xee\xeb\x60\xe1\xa1\x0e\xd2\x09\x94\xfc\xae\x91\xa3\x46\x61\x48\xd4\xc5\x92\x15\x69\x6a\xa2\x22\xf5\x51\xde\x1b\x50\xbc\x09\xbb\xfd\x5b\x17\xf7\x92\x9f\x6d\xbc\x4d\x07\x54\x76\xdc\x27\xef\x47\x5a\xb9\xe9\xaf\x81\x83\x7c\xfd\xfd\x8f\xbf\x40\x8c\xb7\x5f\xcf\xf2\x05\xf1\xd1\xd4\x01\xe7\x64\x04\x23\x9d\x64\xe3\xe6\x8f\x5f\x76\xaf\x36\x89\x6c\xe2\x42\xa3\xc3\x66\x63\x51\x3a\xdc\x5a\x2d\x38\x0e\x8d\x9c\xa2\x4e\x37\xc2\x1f\x49\x18\x8e\x8f\x71\x34\xc6\xe9\x59\xe0\xb5\x50\x3b\xf4\x8a\x2f\x08\xef\x9f\x58\x00\xf5\xf7\x3a\x17\x82\xa9\xa6\x6a\x58\x02\x55\x9d\x88\x06\x6b\x97\x35\xaa\xc8\xdb\x03\x6c\xff\xab\xf1\xbd\x77\x97\x0f\x2f\xc3\xf4\xc4\xb5\xf5\xf0\xb3\x15\xe3\x1b\xab\x8f\x82\x4d\x25\x93\xab\x7d\x6c\x1e\x50\x41\x73\x60\xda\x3a\xcd\x9e\x98\x68\x5c\x95\xea\x8a\xf8\xba\xcb\x41\x20\xd1\x59\xb0\x6e\x6b\xda\xc3\x48\x79\x27\xc7\xdb\x3d\x72\x90\xe8\x56\xd7\xc1\x04\xb5\xff\xe5\x2d\xb7\x08\xeb\x42\x18\xb4\x30\x3b\x39\x0c\x02\x8e\x5d\xda\x3e\x64\x04\xf2\x99\xe6\xbf\x78\x0d\x94\x15\x01\xb1\x6d\xb2\x69\x78\x63\xfe\xeb\xbb\x85\x38\x89\xdf\xc0\xba\xf9\x5c\x13\x29\x36\xf9\x63\x6a\xd2\xb4\x8a\xec\x5a\x07\x17\x16\x8b\x5e\xf3\x0b\xb2\x9c\x48\x02\xee\x44\xc9\x79\x13\xf2\xc1\xea\xef\x39\xfe\x8d\x97\xfe\x4d\xe4\x66\x9e\xae\xde\xe1\x4d\x60\xa3\xb2\xb5\x0b\x7f\xee\xc0\xad\xf2\x8e\xe8\x08\x40\x70\x62\xf2\x2a\xa4\x37\x35\x5c\xba\x0e\xfb\x51\x16\xe1\x0a\x67\x7f\x1e\xb9\x6a\x90\xe7\x3a\x8d\x94\x59\x98\xfb\x7a\xd5\x45\xd5\xb7\xfb\xf9\xc7\x41\xc5\xd0\xae\xdd\xf8\xca\x1c\xe6\xce\x26\x62\x55\xcf\x1a\x8c\x4b\x0c\xa1\xe1\xe7\xb5\x83\x60\x01\x45\x10\xef\x68\x02\xb9\xa6\xd9\x23\xdf\x42\xe4\xf9\xb9\x92\xc7\x14\x2c\x2f\x7d\x03\x4e\x48\x1e\xf1\x82\xeb\xb1\x73\x10\xf4\x0e\x4e\x42\x90\x52\x43\xa1\x32\x02\xc6\x29\x8a\xd7\x6c\xc1\x3f\xa2\x63\x4a\xf8\x98\x49\x8a\x0d\x77\x6c\x6e\x75\x46\xcf\xde\x2d\x4c\xa6\x18\xb9\xed\xc1\xf9\xdc\x71\x2b\x8a\x5a\xe5\xa6\xb1\x7f\x1e\x88\x50\xe6\xd0\x50\xe7\x22\x7c\x7e\xa4\x9d\x4c\xce\x48\x33\x25\x7e\x7b\xdd\x55\x1b\xfb\xf8\x32\x44\x72\x17\x67\xa1\x6a\x26\x36\x35\x14\x05\xa1\x3e\xeb\xee\x84\xe1\x3d\x55\x0d\x92\xbf\x33\x01\x41\xd1\x90\x93\x2a\xa5\xf0\xa6\x0e\xa7\x4d\x79\xf2\xab\x1a\x75\x9c\x45\x5c\xb7\xb5\x98\x14\xe5\xa0\xfb\x07\x00\x6c\xef\x9c\x11\xc2\x2e\x7d\x5f\xa2\x0b\x57\xa1\x5c\xc5\x06\x36\xb1\x24\xf8\x98\x01\xea\x2e\x69\x52\xff\xfa\x4f\x17\x99\xa3\xf0\xa6\xe1\x13\x33\xfb\x5a\x74\x8f\x1a\x61\x38\xff\x22\x9e\x2d\x7d\xed\xbb\xc9\x84\x43\xfb\x56\xae\x56\x8f\xe4\xcc\x99\x70\xcd\xd7\xf6\x8c\xd6\x1a\xf5\x2a\x2b\x6a\x26\xf0\x45\xd6\x7c\x02\x92\xd6\x8d\x14\x7a\xee\x1c\xa4\x12\xe3\x9e\xf4\x92\xe8\x62\x52\xb9\x21\x7e\xd7\x61\xf1\xfc\xd5\x09\x65\xa5\xaa\xb8\xef\x99\x75\xfd\x87\x67\x7e\xe7\x5f\xc7\x5f\x31\x03\xb8\xb4\x35\x61\x42\x52\xb6\x1b\xdf\x4f\x1f\xe6\xcf\xbf\x57\xfb\x8d\xd2\x0f\x80\xf3\x03\xc9\xef\x3d\x2b\x85\xeb\x6e\x26\x46\x4a\x18\xdd\xcb\x01\x07\xa0\xd2\xd8\x9f\x60\x8b\xf0\x95\x46\x73\x43\xba\xe2\xb8\x59\x04\x02\x55\x13\xcf\xd9\xd8\x31\x5d\x0a\x0d\x2b\xb0\xa8\x33\x8d\x09\x47\x68\x3d\x42\xbd\xa9\x12\xc4\x18\xdd\x54\xde\xc9\xe6\x58\x1c\x66\xea\xb6\x83\x15\xfd\x34\xec\x3a\x40\x6c\x46\xa8\x10\x4d\xe9\xde\x12\x4a\x53\xbb\xae\xc3\x64\xa8\x2a\x44\xf6\x74\xff\x91\xea\x7f\x5e\x82\xc3\x90\x99\x43\x70\x42\x35\xa3\x52\x1c\x82\xc8\xbb\x1b\x0d\xca\xca\xe1\x6b\x4c\xd3\x08\xb2\xc8\x2a\x36\x08\x7c\x1f\x48\x28\xad\x3e\x03\x1d\x67\x73\x98\x3e\xfd\x88\x3f\x8a\xad\x50\x61\xd4\x7e\xf7\xe7\x1e\xfc\xe6\x8c\x80\xac\x25\x24\x1e\xe7\xca\x9e\x9d\x9b\x61\x38\x42\x4e\xa3\x58\x7e\x3c\x9d\x73\xaa\x9f\x9f\x03\x5c\x57\xb3\x15\x4f\x50\xb6\x73\xc9\x97\x76\xe4\xe6\x1e\xf4\x45\x06\x73\x14\x43\x89\x72\x77\x3f\x3f\xdb\x7f\x7c\xa9\x5d\x88\x84\xae\x37\x82\x85\x2f\xd2\xc1\x81\x6d\x2a\xe1\xbb\xca\xda\xf9\x30\x77\xc2\x5c\xf4\xcb\xd8\x8c\x27\x36\x25\xcf\x39\x4a\x1d\x57\xe9\x5c\x10\x20\x7b\x41\x50\x6f\x19\x71\x00\xc8\x52\x26\x16\xc5\x10\x32\x1a\xb4\xa6\xb3\x35\x4d\x8c\xe8\x05\xd1\x13\x55\x27\xbf\x00\x5b\x03\x75\xa5\xe1\xef\x4f\x98\xda\x56\xbf\x81\x3a\x16\x5b\xbf\x4f\xd9\xb2\x11\xba\xea\xad\x84\x6c\xbd\xe4\xd4\x4d\x5a\xae\xb8\x3c\xce\xe6\xd6\x4e\x06\x16\xc4\x9e\x5e\xbb\x4b\x64\xbc\x1e\xc4\x5f\xad\x92\x5c\x9b\x47\x46\x23\x7d\xb2\xe1\xa7\x89\x52\x1d\x4b\xe0\xdc\x16\x89\xaf\x4e\x2c\xad\xb5\x44\x8d\x8a\xe6\x28\x19\x4a\x47\xec\xea\xd7\xd8\xd4\xb8\x9b\x6c\xba\xb0\x60\x3c\x46\x1b\x9e\x0c\xd8\x55\x1a\x73\xde\xa5\x7c\xf5\x61\x02\x1d\xfd\xde\x11\x24\x2d\x67\xb2\x34\xc7\xd5\x54\x87\x7a\x23\x81\xca\x33\x5f\x11\xcf\x23\x22\x2c\x73\x47\xdb\x13\x92\x1e\x18\x4e\x43\xc9\x30\x6e\x41\x32\x13\xd1\xa2\x0c\xa1\x1b\xfb\x4f\x4f\xf8\x9a\x52\xc0\x07\x77\xd7\x4b\x88\xa1\xfc\xa0\xab\x40\x72\xf2\x4d\xa3\xfe\xce\x69\x34\xb9\xfd\x19\xe6\xc9\x0e\x33\x31\x70\x22\x52\x29\x02\x11\x38\x14\x31\x3e\x7e\x31\xff\xfd\x60\x5e\xbb\xfa\xd8\xe5\x5f\x12\x10\x5c\xf4\x26\x30\xee\x48\x39\x55\xb9\x3b\xf1\x12\x6c\xe6\xb5\xcf\x52\x6a\x7a\xd9\xa4\xc5\x90\xa1\x0e\xe0\x5e\x51\x2f\x88\x8b\xc8\x4a\xdf\x5c\x8a\x09\x80\x26\xf1\xe4\x04\x69\xec\x09\x90\x41\xf4\x12\x45\x5d\xf7\x2a\xab\x30\xf9\x29\x1e\xf7\x5b\x57\x1a\x86\x2e\x91\x41\x5d\xc0\x84\xb9\x29\xdd\xbd\xe3\x35\x4e\x26\x1d\x2c\x8e\xe7\xb5\x14\x71\x1d\xa3\xe8\x39\xf7\xc0\x6f\xf9\x7f\xb8\x16\x57\x34\x18\xd5\x0e\x43\xa2\x6e\x18\x10\x84\x61\x4d\xde\xb4\x20\x30\x22\xaa\x91\x9f\x34\x32\x0d\x2a\x36\xa2\xd3\x91\xdd\x7e\x1d\x8b\xe6\x26\x41\x55\x18\xc2\x64\x25\xc9\xa6\xa7\x1f\x9f\x43\x59\x9f\xa7\xbd\x11\x41\x86\xed\xbe\x51\x8d\xf4\x22\x83\x84\xa1\x06\xd5\x78\x9f\xb4\xd7\x95\x23\x44\x54\xcf\x86\xcf\x98\xac\xa4\x7c\x07\x1f\xf1\x3d\x0a\x90\x05\x44\x2b\xb1\x11\x7d\xd5\x5a\xea\x59\x62\x59\x00\xb5\x5f\x5e\x50\x94\x26\x8e\xd7\xe5\x96\xaa\xc1\x75\xd2\x5b\x32\xfe\xee\x17\xe2\x1f\xce\xed\xc4\x25\xbe\xa4\x68\x88\x83\x67\x2e\x95\x64\x21\x9c\xe9\x70\x20\xe3\x38\x0d\x07\xe4\x1e\xd8\x08\x47\x74\x49\x02\x65\xee\x4e\x7c\xb5\x3e\xb9\xe8\xb4\xbf\xaf\x58\x5c\x9c\xeb\x49\xa8\x2d\x08\x83\x10\xe3\xfc\x94\x00\x9a\x32\xc8\xa1\x9b\x91\x31\xe5\x24\x0e\xc8\x72\xb4\x91\x37\x51\x98\xe2\xf1\x0b\x05\xc2\x82\x63\xe9\xd7\x13\x2c\xd7\x8b\x36\x2e\x6a\xe6\xbe\x69\x6c\x5d\xe2\x76\x96\x4c\x0d\xe7\xab\xf9\xc2\x76\x77\x3b\x7b\x11\x1d\xb9\x69\x1e\x1f\x76\x3a\xc1\x94\x79\x23\x11\xf0\x99\xfe\x96\xce\xf3\xe7\xbd\x0f\x29\xd5\xff\xbc\x83\x1e\xbf\x6e\xa0\x43\x3c\x21\x48\x2c\x67\xa5\x22\x7a\x40\x9c\xfe\xc6\x52\xf9\x73\x40\x92\x15\xe5\xac\x70\xe1\xd6\x9f\xde\x31\xf8\xd7\x2d\xac\xdd\x83\x1d\x24\x0b\x4d\x4d\xee\xfe\x63\x51\x5d\x3b\x35\x47\x18\x88\xde\x1c\xaa\x29\xaa\x17\x1a\xe4\x2f\x24\x09\x9b\xb2\x6f\x69\x6a\x59\x1f\x6c\xb0\x0c\x85\xd3\x05\x89\xd2\x84\x59\xa0\xb4\xf1\xe2\x4f\x1b\xcf\x80\x3c\x8c\x73\x7b\xf4\x8c\x7e\x42\xf1\xeb\x8e\x0c\x92\xcc\x8d\x23\x8a\x4b\x20\x9c\xbe\x42\x5c\xfb\x2b\x5d\xcd\x66\xcc\x27\x06\xfb\xaa\x43\x4e\x98\x54\xe5\xdd\x60\xcc\x5b\xe8\xfd\xd5\xb7\x68\xaf\x6c\xd6\xb7\x8d\x7d\x1c\x2c\x04\x74\x81\x00\xe9\x14\x91\xe2\x09\xe8\xcc\xe8\x68\xd3\xbb\xea\x8a\x62\xfc\x1f\x17\x96\x2f\xdd\x12\x1e\xb9\x79\x54\xb9\x53\xad\x26\xc3\xcc\xc2\xf0\x18\xcd\xe8\xd5\x4e\xb2\x17\x9f\x89\x54\x52\xb2\xed\x29\x6b\x00\x5e\xdc\xe7\xdf\xc3\xab\x46\xe0\xe8\x16\x16\x23\x70\x0e\xdb\x31\xa1\xad\x18\x1f\xa1\x62\xf0\xd0\xec\x41\x25\xd8\x72\xa6\xb2\x24\x2b\xc6\x49\xee\x69\x7e\x86\x2c\x5c\xc2\x35\x28\xf0\xde\x99\x98\xf8\x5d\x3c\xdc\xd2\x6e\xe1\x1c\xeb\x64\xf0\x60\x69\x2c\xc3\xd5\x75\x25\x63\x03\x4e\x7d\x69\x7d\xfe\xea\x3e\xb5\x5b\x4a\x2c\x03\x20\xb5\xca\x0a\x81\xc9\x92\xdd\x07\xc5\x97\x22\x88\xc9\xc1\xa5\xc9\x33\xee\x86\xc9\xbf\x1c\x4f\xfe\xd9\x78\x6f\x42\x6b\xde\xe4\xe7\x6b\x91\x0a\x93\x78\xd0\x1b\x00\x2e\x7c\xc7\xde\x19\x08\x23\xe2\x5f\x6d\xd6\xc4\x4b\x5c\xd6\x24\xae\x78\x89\x75\x5f\x3c\x03\x8a\x49\xfc\x03\x31\xcb\xd1\x95\x23\x41\x6a\xdd\xc5\x13\x03\x91\x94\xa4\xb8\x13\x17\x8c\xde\x9e\xed\xf3\xed\xd9\x09\xc4\xb1\x98\x5e\x67\x6f\x48\x3f\x60\x1e\x99\xe9\x72\x4e\xba\xee\xd1\x65\x56\xb0\x99\x84\x74\x0c\x6a\xbf\xde\xb8\x7e\xe1\x86\xd8\xf7\x1a\xc2\xa1\x36\x28\x02\x2b\x2b\xcb\x10\x02\xea\x02\xdf\x53\x1f\xeb\xed\xcf\xf3\x46\xbc\x29\x2c\xd2\xcd\xe9\x97\x72\x95\x25\x48\xb0\x7d\x35\x21\x92\x91\x2c\x18\x58\xe2\x7a\x87\xca\xd5\x79\x77\xf5\x75\xdd\xf1\xb0\x65\x5a\xac\xc9\x89\x6d\xa5\xb8\xee\x52\x72\x3e\xa8\x79\xf9\x75\xf1\xe0\x7d\x29\x6b\xa3\x96\x2d\x36\x2e\x0c\x3a\x16\xf6\x79\xda\x8d\xaf\xcd\x02\x83\xc0\x56\xe2\x1b\x1f\x08\xa1\x33\x9f\xf9\xf8\xa1\x3a\xe7\xe2\x7a\x7d\x81\x12\xfc\x45\x2e\x14\x6e\x3f\x71\xc4\xc4\x9e\x4f\x53\xfe\xc3\x5e\x5d\xd4\xfa\x65\xb1\xc3\x97\xe4\x3a\xb1\xe0\xf9\xed\xe2\x39\xf8\xe6\x35\x93\x53\xab\xd3\xf5\x55\xdf\xa7\xcc\xb0\xac\x6b\x4b\xe2\x83\x56\xdd\xc8\x3f\xbf\xe6\x47\xd5\x11\x5c\xdf\x26\x19\x20\x11\x38\xbc\xa4\x7e\x47\x41\xca\x43\xd1\xc4\x61\xf0\x8d\x2f\xae\xfa\x71\x1f\x1f\xad\xe4\x7f\xc8\x04\xff\x70\x10\xfb\x9e\xa3\xbd\xa8\xb7\xc0\x79\xbc\xed\x99\x15\x3e\x29\x1f\x92\xda\x39\x9f\xc6\x3f\x45\x2a\x0d\x65\xd6\xcf\x5d\x77\x7c\xef\x8c\xa2\xc0\x5e\x6e\x69\x67\x56\xdc\x88\xb1\x76\x74\x9e\xf5\x2b\x67\x09\x7d\x41\x52\x2c\x76\x8f\x82\xdd\xd4\xb9\xdd\xaf\x6f\xc9\x3c\xcb\x7d\xdd\x1f\xdf\x49\x01\x28\x42\x5c\x4d\x31\xf4\x34\x7e\x46\xb6\x6c\xdc\xb2\xd1\xcb\x2a\xed\x23\x3c\xfb\xc7\x8d\xed\xba\x92\x54\xbe\x7c\x28\x11\xb3\x2b\x4c\x04\xfe\xed\x38\x8e\xdf\xeb\xae\x62\x9f\x7d\x61\xa8\xff\x96\xba\xff\xee\x59\xb2\x08\xd2\x78\x94\x9f\x5f\x6a\xaa\xa0\x4e\x2c\x34\x16\x2f\x7e\x68\x8f\xec\xec\x41\x9d\xc8\x04\x31\xd5\x3f\xe8\x84\xc8\xe3\x1f\x8e\xa3\x78\x47\x47\x43\x35\xca\xe1\x94\xc1\xbf\x8f\x6d\x7a\x82\x98\xdd\x37\x63\xeb\xc2\x3f\xaf\x41\x78\xc9\x77\x75\xcf\x1f\xaf\xb8\x22\xa3\x07\xe9\xbd\xc7\x3d\x68\x30\x6a\x37\x82\x0d\x52\xce\xa2\x7d\xbc\x7f\xd9\x01\x40\x82\x49\x56\x39\x86\xad\x94\x55\x30\x16\xaf\xbb\x5e\xb3\x30\x28\x42\xc6\x89\x99\xc0\x33\xbd\x35\xd0\xf3\x66\xb4\xa9\x1c\x0d\x22\xc8\x29\x93\xd3\x86\xbc\xd3\x7f\xc3\x6f\xf8\x76\x21\x10\x48\xf5\x1e\xab\xd6\x43\xb1\x6c\xd5\x41\x9f\xf5\x5d\x6e\x86\x70\xf6\xad\xef\xeb\x7e\x4f\x58\x06\xf2\x9a\x5c\xe0\x84\x32\x02\xe7\xa3\xf3\x8d\x3f\x23\x76\xd5\x7a\x2b\xa6\x03\x31\x81\x6b\xd9\x7e\x0b\xa9\xf5\x9c\x1d\x89\x03\x1b\x54\xfe\xf8\xad\xe3\xbd\x64\x78\x14\xcc\x59\x1a\x59\x1b\x03\xc9\xa8\x33\x5a\xed\xee\x38\xc2\xd6\x7b\x7f\x2f\x94\x6a\xc4\x61\x6c\x93\xfd\x9b\x66\x89\xce\x7a\x4c\x00\x94\xe5\xba\x36\xf4\xa7\x3b\xca\x65\x29\xff\xe7\x13\xfc\x5e\x56\x2a\xc7\xd9\x8e\xc1\xce\x84\x02\x3a\x91\x3d\x8e\x13\xf7\x4f\xf7\x89\xe4\x61\x2d\x95\x4f\xda\xcc\x17\xff\x38\x4d\x4e\xd9\x5b\xa3\xbe\x15\x57\x6b\x20\x9e\xa8\x86\xa9\xe9\x7b\xc5\xba\x87\xe9\xe8\x27\xa3\x97\x3b\xfd\x6d\x8e\xbf\xb3\x8b\xfb\x3d\x48\x38\x64\x60\x0b\x51\xfe\x4c\x87\x4b\xf8\xcc\x46\x0b\xf5\x75\x19\xf2\xa0\xcc\xcc\x8e\x0e\x4f\xaf\x4a\xac\x98\xe0\xff\x3f\xae\xae\x6b\xeb\x4d\x64\xe9\x3e\x90\x2e\x04\x08\x90\x74\x49\xce\x39\x73\x87\xc8\x39\x8b\xf0\xf4\x7f\xe3\xb1\x3f\xfb\xfc\x67\xad\x59\xc7\x33\xcb\x82\x0e\x55\xbb\xf6\x2e\xba\xab\xf8\x99\x43\xf2\xa8\x1d\x9b\x5c\xfe\x52\xab\x54\xce\x13\x20\x18\x1f\xd6\x71\x86\x43\x9a\x13\x9c\xae\x1d\xd5\x7f\xd9\x49\x49\x64\x7f\xf3\xe8\x4c\xe3\xe0\xcd\xfb\xf6\x98\xa5\x9b\x20\x1d\xb2\x9c\x22\xcb\xf2\xb9\xce\x51\xa3\x73\x18\xf4\x56\xc2\xd5\xcf\xd0\xab\x1e\x8e\x13\x1b\xf4\x30\x65\x29\x6f\x70\x65\x40\xb1\x48\x04\x7b\xc3\x0a\x9c\x37\x9e\x3d\x77\x22\x24\x38\xc7\xbb\x04\x3f\x93\xfd\x06\x9b\x6e\x7b\x9f\x8f\xfc\x77\xde\x9b\x54\xae\x3a\x85\x22\x29\x81\xb1\xbf\xaf\x3b\xb6\x4b\x84\x2c\x9f\xde\x0f\xb3\xbe\x32\x67\x2d\x61\x30\xee\xa1\x78\xf8\xad\xfa\xd8\x25\xfe\x29\xed\x31\x04\x21\x9f\x00\x28\x9f\x2d\xe3\x69\x3f\x8f\xfb\x0b\x3d\x0d\x9e\x44\x13\xce\x7c\xa5\xbd\xf2\x6f\x8e\x80\x31\x4e\xe5\xa9\xbd\xc5\xfb\xec\xe1\xb1\x9f\x7c\x3a\x80\xd7\x58\xf6\x79\x46\x1f\xad\x15\x75\xed\x18\x66\x6d\xb2\x26\xa9\xf7\x54\xf1\x99\x7a\x95\x84\xe5\x94\xcf\x90\xac\xe9\x91\x66\x87\x53\x1b\x10\x05\x37\xa0\xbf\x06\xe5\xd5\xdb\x7f\x9f\x69\x3d\xdf\x4f\xdc\xf5\xe3\xe3\x65\x36\x9c\xb3\x4c\x21\x92\x8e\x8f\xbc\x92\x1f\x6f\x39\xd6\xce\x6c\xd5\xf4\xf5\xde\xf5\x65\x57\x48\x43\x86\xa2\x32\xdc\x7a\xdc\xbe\x02\xbf\xba\xae\x76\x84\x2c\xad\x73\x54\x9f\x90\x26\xbf\x58\x62\x5c\xff\xf4\xab\x32\xce\xb1\xb3\xef\xa6\x62\xd7\x5b\x10\x8f\x52\xd4\x2e\x60\x67\xfc\x44\x81\xa2\xfc\x99\x04\x5d\x8b\x84\xf8\x83\x24\x31\x44\x5a\xe5\xec\x91\x34\xe4\xab\x13\x33\x1b\x77\x0f\x64\x92\xb5\x72\xeb\x73\x7e\xb9\xa2\x11\x65\xa4\x36\x4c\x9e\x0d\xc5\xff\xe4\x22\x3d\x5a\x0e\x9f\x20\x46\xea\x41\x90\x9c\x6b\x03\xc9\xae\xe8\xfb\x58\xa5\x95\x19\x1f\x05\x88\x0a\x9b\xc5\x73\x2f\x1c\x6d\x52\xe0\x8e\xe2\xc2\x5f\xe7\x4b\xae\xf8\x81\xbc\xf3\x27\xfd\x5c\xae\x33\x31\x35\xad\x1b\xe9\xa0\x2b\xbd\xd1\x20\xff\x99\x44\xce\x96\x1a\x5f\x41\x5e\x15\x47\x8a\x2e\x09\xf3\x01\xc1\xea\x79\x75\x56\xfd\x08\xb3\x73\x7f\x1d\x6f\xc0\x5e\x91\x71\x5f\x1d\x65\x4d\xf2\xb4\x23\xee\x33\xd0\x13\x3d\x76\x46\x40\x80\xc1\xcb\xd5\x51\x23\xf9\xc6\x7a\xda\x7d\x27\x0c\x88\x6d\x95\xc4\xfb\xf7\x61\xfc\xb5\x65\x41\x18\x18\x34\xd3\xcc\xc0\x31\x9e\xcb\x1b\x4e\xa0\xa4\x8b\xb0\x87\x89\xb5\x7d\x78\xa8\x64\x07\x3f\x6f\xcd\xaa\x68\x49\x70\xea\x66\x62\xc6\xe2\x56\x31\x44\xf1\xeb\xef\xf8\xd4\xb3\xa2\xb1\x87\xfb\xfe\x64\x08\xef\x11\x92\xc3\x3d\x7f\xce\x60\x11\x55\x67\xc4\x47\xe9\x5a\x85\x3f\xe1\xd2\x38\x2e\x60\x28\xaa\x6d\xcc\x5e\x62\xf2\xa8\xc3\x6e\xed\x86\x2f\x56\xeb\x78\xf7\x50\x61\x48\x34\xf5\x3b\x71\x9c\xfb\xa5\x47\x0d\x98\x73\x9a\xe1\xe3\x0d\xce\xfc\x29\x1f\xd5\xfb\xbf\xce\xbc\x75\x12\x1c\x98\xe1\x36\xd5\xf7\x0f\xf6\x53\x82\x4f\x5d\xdf\x36\x4d\xf3\xcd\x5d\xdf\xfb\xe6\x2c\xfc\x1a\x7d\x75\x2a\x1a\x86\xa2\x8f\xca\xef\x0b\xb4\x1c\xa1\xaf\xce\xc3\x3b\x3d\xfa\x1c\xf7\xb8\x3a\x01\xac\xd3\x91\x4e\x30\xcb\x6f\xcd\xe7\x60\xd9\xf5\x6f\x7f\x3c\x01\x85\x78\xa0\xea\x6e\x73\x59\x31\x40\xaf\xea\x1f\x84\xae\x22\xab\xc1\x61\xbf\x7a\x24\x3c\x33\x7d\xd8\xf4\x0e\x25\x59\x0a\xd9\x81\x3d\x61\xdb\x95\x6f\x25\x4d\x36\xf2\x30\x10\x6d\x87\xb1\x69\x5d\x20\xce\x78\x10\x4a\xf0\x54\x5f\x1e\xfa\x57\x22\x5f\xb3\xb2\xfd\xce\xb1\x1b\x1b\x60\x5d\x4f\x85\xce\x6b\x58\xa4\x5b\x75\x90\x9e\xc0\x97\xda\xe1\xbd\xd5\xd0\x6b\x94\x0b\x38\x5e\xa0\x7e\xee\xa0\x75\x90\x4d\x38\xb4\x42\x36\x9f\x9b\x7e\x04\xe8\x86\xaf\x9f\xe1\xee\x8b\x6f\xab\xa7\x8b\xed\x35\x09\xcb\x3e\xee\xc2\x46\xfc\xad\x21\x2e\x5c\x7e\x4c\x89\x95\xf0\xdf\x3e\x7f\x52\x44\x2d\x6b\x89\x18\x4e\x97\x0d\x91\xae\xed\x3f\xf4\xf1\x96\x66\x74\xf1\xab\xe3\xb1\x62\x9d\x15\xe4\x33\xdc\xb6\xcf\x15\x39\x64\x61\x46\x96\x8a\x42\x7d\xf2\xfb\x3c\xba\x96\xe2\x3c\xea\xe7\xdb\x03\xbf\xd9\x0c\xa6\xd3\x02\xae\x53\x74\xfb\x5e\x2b\x24\xce\x19\x8e\x6a\x8f\x3a\xf1\x1a\xec\xf9\x95\xfc\x43\x7e\xa9\x6d\x10\xbc\x56\xd1\x9e\x87\xcf\x59\x9a\xe2\x38\xb6\x03\x9b\x1d\xa7\x64\x03\x3e\xdd\xa6\xa7\x67\x05\x32\x16\xfc\x39\x98\x4f\x1a\x19\x01\xa0\x2e\xaf\x6f\x46\xd3\x7a\xcd\x81\x2d\x1f\x0e\x90\x8a\x77\x37\x9f\x6c\x1a\x6a\xb4\x6d\x41\x74\x12\xfa\x49\xe5\x67\x3a\xbf\x8d\x8d\xc9\x0d\x53\xd8\x1c\x37\xf7\x90\xdd\xaf\xe7\xb9\x89\x2f\x42\xad\x75\x68\x9a\xb2\x7b\x42\x67\x7f\x83\xc3\x3f\x72\xfe\xe7\x2e\x13\x25\x7d\xfe\x8b\xab\xaf\xc7\xee\xd2\xff\x61\x0e\x92\xbc\x33\xfb\xa1\x3f\xad\xcd\x3e\x77\x2c\xf0\x5e\x54\xab\x03\x53\xbe\x63\x4f\x7b\x72\x2d\x58\x97\x5a\x10\x3b\xae\x8f\x43\xcf\x34\xf8\xa4\x1f\x74\x7f\x7e\x50\x4b\xe7\x11\x46\xd2\xe2\x99\x3c\x7e\x63\x44\x3f\x0f\x18\x5d\x40\x10\xe4\x01\x05\x7a\x59\x30\x90\x1d\xf8\xdd\x47\xef\x31\x9c\x1d\x64\x1b\x50\xb7\x2d\xfd\x50\x5f\x77\x2c\x9c\xc7\x27\x88\x24\xd9\x6c\x5c\xf7\x3a\x78\xb8\xbc\xdf\x59\x10\x89\xc5\x8e\x48\x7b\xfd\x84\xdf\x36\xf9\x96\xf8\x3f\x5c\x52\xa2\x02\xb1\x4c\x3b\xb3\xce\x78\x9b\x4e\x66\xc0\xcd\x00\x71\x9c\x3e\x20\x2e\x2c\x74\x9e\xda\x9e\x3a\xa4\x9a\x0c\xb0\xdb\x82\x89\xac\x13\x5f\x93\xf6\x44\x53\xea\x01\xcb\x74\x9c\x56\x78\x7a\x7d\xe3\x29\xfa\x98\x53\xf8\xb3\xc7\x80\xcf\xf6\xee\x9a\xa6\x74\xdd\xff\x9c\xff\xea\xc5\x4a\x59\xfc\xee\xc5\x53\xb8\xbf\x3e\xd4\x10\x7b\x4b\x8d\xb5\xbb\x6c\x60\x01\xcd\xe5\xdb\xce\xf2\x81\x1f\x5e\x88\x7e\xfb\xf5\x6b\xcd\xe8\x77\x5b\x98\x9b\x70\x72\xd1\xb9\x7c\xa2\xab\x4a\x30\xd2\x66\x69\x41\x26\xec\x45\x68\x1e\x2c\xab\x89\x50\x1d\xfc\xc1\xcc\xbe\x1d\xda\x10\x09\x39\xd3\xf9\x5c\x9d\x08\x58\x22\xf4\xb3\xc7\x0b\x90\x5e\x6e\x66\xb2\x55\x88\x81\x8f\x74\xc2\xab\x29\xac\xe3\x16\xbb\xef\xaf\xf5\xa8\x08\x73\x38\x58\x65\x0d\xd9\x66\x8d\xb8\xab\x4b\xd7\x79\xa4\xf2\xde\xde\xe1\x5a\xe3\xcf\x4e\x22\x3b\xc9\x51\xbf\x3f\x7d\x71\x4d\x9e\x06\x4a\x9e\x31\x6f\xeb\x33\x8c\xae\x63\xc7\x76\x92\x64\x9c\xae\x38\x16\x52\x7f\x79\x18\xd9\x51\xee\xad\x87\xa9\xa9\x16\x70\x68\xee\x9d\x90\x5b\xae\x08\x74\x9e\xfb\x78\x5f\x67\x8e\xd6\xc9\x5a\x39\xc6\xab\x6a\x83\xbb\xe5\x69\xe0\x85\xc6\xf6\xf7\x7b\x26\xcb\x08\x03\x47\xe6\x31\x6b\xdd\xfa\x1a\xb2\xbd\x65\x8c\x9a\x11\x99\x54\x7d\x49\x2a\xed\x2e\x7a\xe1\xe7\xf3\x4a\x20\x58\xf6\xb6\xe7\xe3\x51\x99\x6c\xbc\xd9\xc3\x1d\x87\xd6\xec\xe1\x3e\x4c\x18\x0c\xc3\x57\x5f\xe5\xe1\x33\xfd\x1d\xbe\x31\xd5\x8e\x15\x71\x43\xd3\x3f\xe7\xb4\x63\x73\xc3\xd2\x69\xab\xbb\xfb\xd9\xc6\x00\x38\x90\x05\x00\xd8\x7b\x06\xe4\x6d\x3c\x0b\xce\x3a\xe0\xf5\xfa\xa3\x45\xa6\x94\x59\xa4\x37\x38\x50\x37\x00\x6e\x1e\xfe\x08\xdf\xed\x71\x02\xbe\x2d\x02\xbe\x6e\xad\xb7\xae\xc5\xf0\x50\x49\x55\xbb\x11\x58\x4c\x28\xfe\xb8\x8f\x49\x0a\x03\xdf\x3f\xad\x6f\xb3\x3f\xb1\xab\x76\x63\x03\x7e\x04\xf4\xc0\x57\xbd\x21\xf9\xad\xe3\xf4\x7b\xa0\xe9\x44\x42\xd1\xfe\xf3\x01\x84\xab\x32\x30\xed\x9c\x3e\x1a\x30\xdc\xe3\xed\x5f\x27\x70\x3c\x77\x95\x1f\xdb\xbb\xa0\xaa\x42\xfc\x7b\xb6\x5d\x10\x6c\xf1\x71\xf5\x53\x3a\xc5\x3b\x06\x9e\xf3\xbc\x8a\x86\xac\xd7\x7d\x98\x3a\xc1\x3c\xaf\xf7\x92\x27\xbc\x7e\xa0\x37\x58\xee\x13\xc5\x6f\xc9\x3a\x78\x75\xb1\x69\x26\xb0\x92\xab\x37\x5c\xf1\x5a\xdc\xdb\x17\x71\xae\x73\xd3\x61\x9b\xd2\x36\x3d\x48\x3f\xbd\xe1\x14\xb2\xf7\x5c\xc0\xc6\x23\xe9\x91\xf1\xcf\xb4\xec\x07\xc2\x85\xb3\x07\x34\xba\xb2\x15\x77\xea\xd4\xde\x8e\xdb\x42\x0a\xdb\x1d\xf0\xce\xa9\xa5\xa3\xa7\x84\x9b\x2a\x2c\x55\x8a\x5e\x44\x5c\x33\x78\x9f\x68\x86\x6e\xfa\xde\x28\x6f\x3d\xcb\x6c\x34\x8e\x82\x54\xfc\xe9\x81\x44\xe6\x8b\xfe\xb4\x89\x27\x8b\x7e\xa5\xfd\x16\x32\xad\x45\xf4\xbc\x34\x8d\x4f\x30\xf8\x90\x6b\x5f\x0f\x4e\xf3\xc8\xf4\xbc\x7b\x73\xe7\x65\x60\x65\x93\x30\xf3\x0a\x94\x32\x9d\x49\x74\xf0\x6e\xc6\xbd\x26\x49\xda\xc3\x1e\xef\xbe\x8b\xa0\xf7\x1b\xd0\x0e\x04\xda\xd4\x75\xa7\x10\x43\x90\xfc\x7d\x87\x2c\x27\xc5\x51\x88\xd0\xb2\xa7\xaf\xf9\xc3\x89\xd3\x9a\x7c\x57\xab\x55\x95\x9b\x27\xf9\xd3\x7a\xba\x79\xae\x0c\x99\x0c\x27\x53\x04\x2f\xdc\x7e\x6a\x5f\xb8\x69\x63\x56\x19\x1a\xc5\xf3\x1f\x2b\x79\xf3\xe8\x3f\x98\x1a\x48\xa5\x08\x94\xc0\x80\x87\xf5\x21\x43\xe2\x95\x0a\xe8\x42\x38\x91\x2d\xfc\x6b\xe3\xa9\xe5\x28\xe2\x03\xd3\x79\xf9\xdc\x04\x21\xc5\xf2\x9a\xbc\x7a\xda\x01\x39\xac\x5d\xff\xcc\xeb\xd8\xc6\x0d\x0a\x04\xce\xe9\x24\x21\x6c\x13\xa5\xc7\xfd\x7d\x6e\x55\x89\x10\x66\x15\x74\x93\x4e\xcf\xb4\x0a\xe0\xe6\x99\xa2\x19\x8f\xe2\x0e\x40\x1f\x51\x44\x58\xf4\x09\x77\x08\x29\x03\x39\x32\xc5\xaf\xcc\x67\xb4\xc2\x66\x10\x6b\xa0\xf5\xc7\xec\x6e\x2b\xbb\x79\xbb\x47\x1d\x7b\xca\xef\x79\x2c\xe4\x78\xaf\x58\x3f\xf7\x70\x2a\x51\x15\x44\x22\x12\xdd\x07\xfe\x01\x58\x3c\x7e\xae\x4d\xbf\xea\xe1\x11\x85\xc0\xcc\xef\x43\x15\xe2\x87\xdd\x19\x2c\x8a\x62\x8f\x5b\x0b\xa4\x8f\x1f\x2a\x26\xd4\x38\xa7\x33\x7a\xc0\x19\xc6\xab\x03\x22\x96\x99\x64\x5a\x2d\xd1\x24\xd1\xd0\x8f\xb6\x11\x4e\x1b\x79\xcc\x63\xfd\x82\xad\xe2\x99\x9e\xc8\x7e\x1d\x8a\x7c\xc8\x0d\x7e\xeb\x81\x2b\xb8\x61\xe0\x51\x14\x85\xbb\xb5\x1d\x27\x5e\xe7\xa7\xf7\x63\xf4\xa0\x06\xbd\xad\xbd\x60\xb5\x60\x7b\xa3\xcc\x87\xe9\x78\x05\xa4\xa2\x04\xe1\x9f\x74\x9b\x40\x7a\x3d\x92\x0a\x4d\x69\xc2\xe9\x73\xb4\x17\x7f\xbe\xc7\xd1\x55\xa7\x15\xcd\xf3\xc6\xb1\x92\x30\x58\x57\x5f\xad\x4c\xef\x0e\x11\xe8\xda\xb9\x63\xdd\x98\xff\xe2\x1e\x14\xd1\xdf\x29\xbb\xdf\x8e\x85\x6f\x5e\xa9\xc5\x7d\x9d\x9d\xc5\xae\x3d\xbd\x8a\xa0\x00\x44\x96\x47\x1c\x69\xfb\x46\x9e\xbe\x79\x98\x6d\x75\xf3\xe0\x1c\x56\x7d\xfe\xce\x02\x53\x34\x2d\xdc\x14\xb3\x14\x4d\xfc\x4b\xaf\x5f\x7c\xf9\x4c\xd7\xd9\x2a\x10\x7c\x7c\x10\x8d\x9f\x36\x9e\x55\x78\x30\x05\x8b\x08\xe3\x49\x9b\x2e\x69\xf6\x42\x1f\x00\x7f\x33\xbf\x56\xfa\xa1\xea\xbf\x49\x04\xc4\x51\xb0\x8c\xc7\xf9\xfd\x3c\xe8\xe7\x3d\xb1\x6b\x10\xdb\x61\x3f\xc6\xeb\x57\x63\x90\x98\xa1\xe8\xd3\xef\xda\x07\x34\x29\x7c\x90\x57\x66\xc6\xa5\x78\xd5\x1e\x5c\xdf\xc8\xe0\xf2\x40\x50\x02\xd2\x14\x95\x63\x62\x37\x8a\xdd\x9b\xdb\x67\x3c\xe7\xdd\x5f\x96\x54\xf7\xa7\xd6\x87\x51\x74\xa1\x47\x3b\xb4\xb5\x92\xf2\xca\xc8\x6d\x9a\x90\x35\x72\x26\x64\xdb\x96\xab\x1a\x71\x68\x04\x9a\x80\x74\xf5\x0c\x10\x87\x18\x3d\xd2\x3a\x83\x5f\xaf\xda\x08\x30\x21\x4e\xec\x53\xc1\xc0\x65\x81\x1a\xa3\xce\x85\xdf\xd7\x7a\x23\x05\xf8\x73\xf4\x7c\x98\x26\x23\x29\x77\x68\x52\x7d\xd8\x47\x1e\x1b\x8f\x6d\xe2\x93\x5c\xfa\xbe\x0c\xca\xfa\xb0\x45\xec\xae\xc1\xcb\xf4\x51\x17\x57\x28\x78\xf6\x16\xd4\x40\xf6\xb3\x04\xd3\xe4\xf7\xc7\x9f\xef\xa4\xd5\x5b\x7c\x8c\xe7\x5d\xac\xcf\x6a\x17\xea\xd5\x06\xd4\x0c\xbe\x65\x87\x64\xb6\x60\x3a\x9d\x88\xa7\x61\xb5\x62\x14\x13\xb6\x77\xff\xfb\x6c\xdf\x77\x1b\xe6\xd2\xdd\x03\xb1\xfa\x93\xfb\x25\x44\x1b\x0b\x43\xe4\x0c\x31\x78\x92\x51\x8c\xde\x84\xb6\xe2\xe1\x13\x28\x0a\xc6\x26\x11\xae\x44\xb0\xf1\xef\x86\xbd\x84\x99\x2e\xcd\xd7\xa3\x08\xa0\x8f\xaf\x03\x59\xdc\x3a\x55\x68\x40\x03\x72\x63\xa3\x2e\x25\xb8\x0f\x5f\x72\x66\xf3\x63\x8f\x2f\xa0\x00\xad\x7b\xa1\x57\xcb\x07\xb2\x61\xd7\xa4\x55\x36\x9a\xe0\x34\x3b\x5d\xd7\x60\x6e\xda\xce\x12\x69\x8b\x3f\x96\xaf\xbf\x3c\x00\x7b\xa8\x47\x92\xa9\x89\xdf\x31\x91\x0c\x12\x51\xb3\x9d\x17\x9b\x97\x74\xef\x40\xec\xf1\xa1\xc4\xbb\xde\x40\x38\x70\xf6\xf4\xd7\x3f\xe8\x97\x41\x43\xab\x95\x90\xb0\xaa\xde\xa9\x9a\x24\x6c\x60\x56\x89\x3e\x50\xb9\x31\xde\x75\x54\x1a\x31\x1f\xd9\x7a\xdf\x4f\x6e\x13\x04\xc4\xf4\x94\xfa\xc1\x66\xb5\xcc\x1b\xb3\x82\xf3\xd7\x3c\x38\x6a\x7f\x26\xe3\xfb\xfd\xb2\x45\x7f\xbd\xee\x85\x4a\x3b\x02\x08\xe5\xfb\x4a\xe5\x51\xa3\xdb\x17\x3d\x57\x1f\x9b\x87\x16\x2e\x89\x70\x1b\xf2\x05\xdc\xc3\x31\x79\x43\x15\xe0\x51\x96\x86\x69\x9a\xf0\x71\x9a\x22\x4e\x9b\xe9\x19\xa1\x5f\xff\x71\x7e\xb6\x88\x3d\xf7\xf1\xe5\xf7\xb2\xa6\xfb\xaf\x8a\x82\xf5\xe3\x85\x27\xf0\xc0\x70\xd3\x68\xe3\xad\xdb\x40\xc5\x41\x3a\x9d\xbc\x14\xa3\x2a\xd2\xa4\x2f\x7f\xc5\x87\xb2\x9f\xe5\x21\x61\x05\x35\xc0\x36\xfc\xe1\xbc\x6e\x55\x23\xa1\x69\x43\xfc\x57\x5b\x43\xa1\x4a\xae\x40\x53\xcb\x8a\x6c\x58\x61\xb6\xcf\x04\x90\x3f\xbb\x6a\xd4\xf4\x10\x47\x9c\xda\xa9\x1c\x8c\x51\x73\x54\x3c\x18\xa3\xe7\x86\x2f\x7d\xb8\x67\xcf\x87\xf6\xd4\x5d\x9b\x0e\x04\xf0\x56\xac\x95\x65\x4c\x04\x54\x5a\x26\xe0\xbf\x39\x1e\x19\x7f\xdb\x43\xd6\x0f\xf9\x97\x56\xd4\x63\xd2\xc3\x0f\x4d\xa0\xd7\x91\xbc\xeb\x3b\x15\x78\x98\xc9\xb5\x66\xf8\xee\xc6\x77\x36\x81\xe7\x65\xa1\xc0\xd4\xc8\x56\x1e\x5a\x62\xe7\x2f\x85\xae\x80\x1b\xbb\x82\xd4\x92\x3f\xe7\x1d\x72\x26\x72\xad\x31\x05\xc2\x3f\x1d\x0c\xf3\xd7\x3e\xdf\xbe\x2f\x7d\x9e\xe6\xa5\x99\x25\x12\x44\xa7\x10\x52\x0b\x47\x0a\x6d\xe1\x23\x6d\xbc\xe1\x98\x19\x8f\x65\x2c\xfe\x3d\x81\xdf\x31\xe8\x2a\xa3\x2a\x18\x0f\xe0\x2c\xad\xfe\xa4\x8c\xbc\xfe\xcf\xa2\x85\xa5\x8b\x79\x2a\x90\xd8\xc0\xb8\xf2\x33\xd8\x5d\x7f\x82\x9f\x25\xf0\x4b\x2f\x20\x6d\x9f\x15\xb2\x8c\xed\x28\xb3\x5d\x22\xa2\xa0\xd3\x56\x01\x89\xc4\x32\x1a\xf7\x0f\xc8\x81\x0b\x5a\x40\xd4\x01\x53\xc4\xae\x76\xa4\xfa\x50\xff\x60\xfb\x2c\x54\x38\xb9\x05\x7d\xde\xe6\xb5\x95\x89\xe8\x97\xc4\x75\x18\x11\x43\xae\x87\xb9\x1c\xd8\x9b\x42\x5a\xca\x8e\x88\x0e\x59\x4b\xc9\x00\xe2\x1a\x74\xf5\x22\x9e\xa0\x5b\xfb\x82\x39\x23\xb6\x9c\xd3\x0b\x78\xb2\xff\xf5\xed\xb7\x27\xe3\x43\xfe\x79\x2e\x5b\x5a\x00\x31\x7a\x84\x2e\x60\x46\xec\x6c\xdc\x37\xf0\xce\x07\x0a\x31\x6e\x6a\xa5\x30\xa4\xc2\x11\x49\x64\xb0\xaa\x12\xe8\x9b\xab\xb6\x1c\xdf\xdf\x7d\x30\x5e\x41\x99\x38\x97\xca\x0c\x9d\x16\x29\x7d\x7b\x1f\x3e\xef\xf4\xff\xcd\x9d\xcd\xeb\x7c\x53\x69\x51\x82\xdb\xde\x6b\xa2\x5f\x10\xe8\x79\xcd\xb4\xae\xa6\xc5\x19\xab\x84\xde\x79\x14\x36\xb8\x12\x42\x2c\x51\x00\xb3\xce\x58\x54\x07\x73\x01\x23\xad\x05\x2d\x38\xf4\x0a\x37\x2d\xca\x0e\xd0\xed\x7e\xfe\x70\x1e\x6a\xf3\xda\x71\x0d\x6a\xcb\x14\x81\x1d\x7d\x9e\xfe\xc7\x87\xdf\x69\xe7\x8c\xdd\x36\xa1\xa6\x35\x9a\x36\x6b\x18\xfc\x95\x87\x7a\x20\x37\x1d\x59\x55\x68\x5d\x8e\x53\x66\x15\xab\x9e\xa7\xfe\xf6\x6b\xe3\x97\x50\x92\x00\xac\xfd\xe8\x04\xc6\x33\x6d\xea\x03\x4c\x3e\xed\x73\xbc\x05\xa2\x6d\xb8\xda\x47\x9b\x8e\xc7\x01\x2d\x27\x89\x3b\xbb\x5b\x7c\xdf\x32\x69\xd4\x77\x6c\xfd\xb1\x55\x31\x99\x9e\x5f\x5c\xf6\x60\xd7\xa5\x1a\x21\xba\xee\x86\x1d\x71\x52\xf8\x7f\x7b\xd1\xb3\x8a\x6d\xbc\x8c\x4e\x73\x9d\x56\x3a\x11\x6f\x43\x3c\xc4\x6d\x86\xd8\x2d\x2d\xcb\xb0\x6a\xe7\x57\x2d\x4f\x46\x68\x79\xa4\x01\x7e\x7f\xee\x80\x8f\x5d\xd8\x0d\x6f\xab\xf2\xe5\x2d\x95\x46\xf7\xd6\x39\x1a\x95\x0a\x7c\xac\x36\x7e\xf0\x04\xb8\x17\xbd\xed\x56\xe1\x2a\x70\x83\x05\x2c\xf1\xdf\xf3\x22\x1b\xf2\xf2\x9a\xe9\x1b\xae\xc7\xc0\xfa\x49\xcf\x49\xfb\x3a\x43\x8c\x09\xb5\x76\xd5\xe6\x79\x2b\xf0\xfb\x71\x93\x8c\xef\xe0\xa0\x93\x1c\x3e\x55\xda\x88\x99\xe5\x64\x70\x8f\xe0\x7c\x8e\xfd\xaf\xee\x0c\xe1\xf8\x65\x64\x73\x26\x14\x0e\xc6\xb3\x31\x54\x05\xb2\x13\xfd\x75\xcf\x47\x79\x0f\x65\x35\x1c\x75\xd3\xd2\x6d\x3f\x52\x54\xcb\x1d\x53\x12\xba\xfa\x5d\x8b\xfb\x29\x32\x6d\x29\xb6\x6e\x53\xf3\x5b\x3c\xfc\xcd\x9f\xf4\x5f\x91\x37\x67\xdf\x68\x8d\xfd\x21\x55\x89\x3b\x26\x9f\xf9\xfd\x99\x92\xee\x39\xde\x06\x97\xea\xa3\x2a\x0e\xcb\xab\x0e\x00\xd7\x7f\x01\x27\xda\x2c\xd1\x31\x5d\x37\xc8\x68\xc5\x4c\x05\x6d\xdf\x34\xb5\x6f\xfd\x15\x28\xfb\xd9\xd9\xda\xed\xa1\x7a\x81\x13\xc6\xdf\xdf\x01\xa2\xb0\x13\x26\xde\xdd\x40\xbe\xae\x1b\x75\xdb\xad\x7b\xbd\x1e\xef\x77\xe2\x48\x45\xab\xee\xa9\xb4\xfb\x38\xbb\xaf\x9f\xa6\x6f\x57\x80\x57\x24\xa4\xad\x2f\x95\x14\x04\xec\xbc\xbe\x81\x5e\x9d\xa7\x8b\x3e\xc4\xad\x9c\x07\x30\xdf\x73\xff\xd9\x53\xf9\x0a\xc2\x71\x42\x39\xd8\x71\x33\x6d\x68\xe7\xfb\x73\x7c\xe6\xaf\x1a\xea\xf8\xe0\x0b\xd6\x53\xc4\x84\x9d\xd4\x44\x93\xde\xd2\x61\xbf\xc9\x57\xb3\x59\xb0\x51\x08\xf0\xa5\xab\x27\xf7\x9c\xf4\x59\x02\xe6\x16\x4d\xa1\xc1\xb2\x27\x01\x29\xb5\x70\xa3\x2b\xe5\xe7\x1c\x0e\xab\x56\xce\x9b\x37\x5e\xfc\x18\x6b\x2b\x4d\x86\xee\xd5\xd7\xf8\xea\x25\xf8\x55\xbe\x57\x9f\xef\xeb\x8a\x04\x84\x34\x6c\xed\x68\x85\x43\xe5\x41\xc5\x33\xa5\xfc\xc1\xb1\x1d\xb9\x0a\x6b\xe2\xcf\x07\xd8\xb1\xb0\x70\xd9\x25\x69\xe6\x0f\xf1\xe6\xa7\x3e\xe2\x57\x0b\x92\x9c\x9b\x58\xfe\x76\xdb\x5e\x61\x05\x4b\x16\x8e\xeb\x46\xc0\xe8\x95\x87\x07\x26\xa0\xad\x46\xfc\x1a\x16\x7d\xb8\x7a\x86\x53\x7d\x46\xf7\x2e\x81\x32\x79\xcb\x6f\x37\x16\xac\x4b\x24\xe3\x9f\x41\x5b\xcd\x0f\x11\x4d\x00\x20\x1c\x1c\xf8\x0a\xbc\xdf\xb1\x08\xfb\xa6\x3c\x19\x70\xc5\x16\x09\xf9\x18\x78\x6c\x39\x27\x95\xf2\x94\xce\x3b\x7c\x07\x5c\x40\x56\xf2\x7f\xe6\xb5\xbd\x88\x82\xdd\x04\x59\x9c\xab\xcd\xaf\x9a\x79\x66\x6b\xd7\xbc\xf3\xf8\xfd\x71\x7b\xdd\x6f\xdb\x02\xf9\xc1\x1b\x68\x2b\xb6\x57\x81\x0f\x99\x5a\xc2\x08\x0b\x1b\x5c\xb9\x60\x28\x62\x9b\x0a\x8c\x35\x46\xef\x6a\x42\xb7\x09\x40\x4d\x19\xf3\x65\xf5\x1e\xb3\xc5\x82\xdd\x86\x67\xb2\xee\xe1\xbe\x63\xfe\x7d\xe7\x2f\xbf\xd2\x9a\x13\xfd\xcd\xab\xd8\x86\xc9\xeb\xa1\x4d\xda\x91\x50\xbc\x27\x0b\xdb\x97\xfe\x3e\xdb\x4e\x89\xeb\x60\x6c\x82\x81\xeb\xdf\xbf\xde\xa1\xee\x85\x26\xa6\xf4\x91\xb6\xdc\xb2\x01\x9c\xe2\xd1\x3b\xeb\x48\x8d\x13\x71\xaf\x57\xf3\xab\xbf\xf9\x95\xa7\xf6\x38\x30\xef\x1d\x59\x5f\x70\x3b\xbf\x9b\xdb\x3b\xd9\x95\xe2\x75\xd5\x13\x40\x67\xdc\x0d\xdd\xa0\x94\xeb\xd0\x2f\xd0\x90\x6f\x1e\xe2\xc3\x23\x0e\x33\x48\xac\xdf\xb9\x63\x49\xa2\x4c\xc8\x66\x01\x50\x13\xd9\x2d\xb2\xa0\x71\x9c\xf0\x8c\x7e\x66\xda\x6d\xcf\x61\xdf\x79\xb7\xc0\x76\x99\xbe\x63\x1e\xfa\x5b\xbe\xd7\x3d\xfe\x2b\xe1\x3e\x37\x8e\x34\xc0\xd2\x90\x88\xe7\x1d\x63\x81\x6f\x6a\xa1\xad\x44\x41\x0d\xb7\x96\xc8\xb8\x26\xcb\x36\x9e\xcb\x5e\xff\xef\xba\xaa\xfb\xeb\x7f\x26\xfc\xa9\xef\x11\x36\xb4\xb7\xd3\x55\xa1\xd3\x54\x3d\x74\x2f\x66\xfe\x15\xa7\x21\x60\xc4\x57\x1e\xbf\x53\x93\x3a\xa7\x4e\x54\x11\x7e\xe3\x63\x59\x43\x09\xb3\x97\x3d\xf9\x92\x94\xa1\x2c\xbc\xa5\x5b\x9a\x87\x7e\x87\xe7\xe3\x1a\x53\x0d\x35\x1d\xd0\x21\x90\xd6\xcd\xb7\x5b\x73\x50\xd3\xba\x9c\x19\x56\x3d\xdb\xc3\x14\xeb\xd9\x29\xad\x50\x64\xeb\x11\x68\xaf\xfa\x3e\x21\xaf\x52\xea\xcb\x51\x92\x95\xe5\x7c\x7e\x6e\xb2\x3d\x08\xb5\x17\x06\x67\x6b\x6c\x9d\x60\x06\xed\x78\x5b\xaa\xe0\xa6\xca\x4d\x65\x1a\xd4\x50\x0c\x50\xc4\xfc\xe1\x57\x94\x50\xbc\xf9\xab\x08\x55\x52\xf1\xf2\x5c\x9e\xf2\xdc\x04\xb7\xdd\x8d\xdd\x57\xc7\xd7\x01\x62\xfe\x6a\xf4\x8e\xb5\x52\xf3\xfb\xe0\x1f\x61\x0c\xb5\x4a\xb6\xfa\xae\xf1\x2e\xa1\x17\x16\x1e\x90\xe9\x7e\x23\xc6\x44\x09\x29\xff\xba\x74\x51\xe6\xe4\xf9\x53\xa3\x96\x34\x94\xf6\x95\x9a\x3a\xe6\x09\x4b\x5f\xb1\xd8\x2d\x60\x5e\x85\xa2\x15\x87\x6e\x4a\xbc\x47\x94\xff\xdc\xcd\x0d\x3b\x4b\xe9\x02\x5d\x60\x77\x76\x71\x82\xaf\x7e\x1a\x5d\xfd\x35\xc9\xad\xdf\xad\xd6\xf8\xf3\xbd\x97\xca\x95\x87\x27\x85\xad\x08\x38\xcf\x9c\xdb\x8c\x07\xed\xe5\xeb\xde\x66\xa9\xb9\x64\xfc\x41\x09\x33\xc9\xfc\xe4\x03\x05\x67\x57\x4e\xc4\xb6\x46\xaf\x27\xee\x52\x71\xc8\x42\x6d\x25\x56\xe1\xa9\xe5\xab\xba\x1f\x6a\x1d\xdc\x69\xf7\x2f\x47\x61\x0d\x2b\xa2\xee\x54\x33\xf3\xe5\x6b\x54\xd7\x57\x95\x3d\x2f\xfb\x04\x52\x83\x48\x03\xf2\xcf\xd9\x35\x89\xd8\xf6\x39\x19\xf4\x1e\x7b\xd5\xf1\xcb\x6b\x70\xa1\x7f\xaa\x6f\x9e\x08\x23\x5a\xf1\x70\x7f\xab\xec\xbf\xf7\x57\x6d\x56\x7b\x3d\xf8\xba\xca\xd0\xd4\x8c\xe2\xde\x26\xf8\x43\xb5\x43\x52\xcf\x9f\xf6\x4f\xbd\x0b\xd2\x06\xac\x6a\x9b\xcf\x18\xac\x11\xfa\x78\xa3\xd0\x46\x9e\xdc\x8d\xca\x48\xb0\x75\x7f\x7a\xc1\x52\x25\x71\x04\xf5\x50\xf6\xf4\x6b\x8c\x06\x8e\x09\xfa\x17\x69\x02\x2e\xa4\x0b\x6e\xe9\xd8\xd5\xcb\x2e\xe0\x9c\x6a\x7f\x34\x1f\xd5\x92\x65\xbd\x06\xa3\x44\xd0\x78\x75\x2a\xac\x24\xba\x6c\x1e\xae\xad\x42\xfc\xbd\x93\x4e\x80\x75\xef\x0f\xba\xd7\x8f\x27\xc1\x02\x2e\xd0\xef\x94\x4c\xd4\xb7\x3a\x67\xfe\x3e\xe7\x55\x78\xfa\x7e\x68\x60\x9f\x5c\xa2\x2b\xcc\x70\x69\x06\x51\xea\x47\xe5\xbe\x2a\x3d\xc5\xe1\xd1\x56\xee\x41\xf2\xa7\x67\x5c\x2a\x9e\x6f\x2a\x17\xb4\xe6\x25\x2b\xc6\xb7\x46\x8f\x92\x69\xc3\x0e\xf8\x6e\x28\xf3\x16\x71\xfb\xc9\xe1\xc8\x57\xd0\x0e\x06\xe2\x2b\xf3\xdb\xd9\xb0\x3d\x95\x4b\xeb\xbd\x34\xbf\xc8\x86\x68\x27\x74\x1a\x3b\x94\xeb\x23\xf6\xf8\x1d\x9b\x5f\xb6\x83\xd8\x15\xae\x10\xaa\x1e\xe9\x25\xca\x2c\x18\x55\x29\xd0\x4c\x2d\x0e\x96\x93\x7f\x72\x65\x02\x7b\xb7\x21\x64\xb3\x4c\x82\xed\x9f\xe4\xcb\x0f\x29\x09\x75\x02\x96\x6a\x39\x71\xc8\xc9\x7f\xe7\x23\x48\x85\x2b\x0d\x2c\x98\xcf\xbd\x2f\x1a\x33\xac\x85\x4f\x63\xe5\x8c\x9a\xdf\xe9\xe6\x2f\x5e\x62\x9c\x67\x91\x84\xc1\xf6\xed\xc4\xcc\xbd\xa8\x90\x74\x3c\x3a\x04\x5d\xc4\x62\xf9\x1c\x76\x80\x21\x7f\xde\x4b\xbd\x5e\xb9\x01\xb1\xc1\xc7\x8d\x58\xb7\x6d\xe9\x52\xcc\xef\x67\x2e\x19\x4b\x06\xe3\x61\x13\xe2\x39\x6d\xba\xfb\x5b\xfa\x6f\x85\xae\x7b\xcd\xe7\x4e\x6e\x23\x89\x95\x93\x42\x3a\xc3\x9e\xa7\x04\x27\xd5\x26\xff\x27\x97\x73\x10\x5f\xc0\x6f\x07\xaa\x7f\xb6\x92\xc2\x9a\x6e\x63\x81\x08\xd6\x13\x2c\xb1\x7a\x3f\xfd\xec\x67\x9e\x32\x2d\xd1\x46\xe6\x32\x17\x5e\x1d\xd7\x12\xb8\xc7\x03\x5b\x29\x7f\xce\xc2\x50\x5b\xdc\x61\x30\xdf\x9b\xb4\xa0\x14\x50\xaf\xc7\xac\x21\x89\x5f\xd5\xc9\x53\xe1\xef\xc5\x4d\x72\x83\x9e\xfa\x4c\x3b\x66\xc1\x28\xb9\xa4\x16\x08\x24\x30\x31\x19\xca\x7a\x18\xd0\x24\x03\xf6\xeb\xf8\xb9\x23\xab\x08\x6c\x88\x2a\x0e\x61\xb8\x85\xb0\xbf\x3b\xad\xa1\xa4\xb0\xa9\x5b\x81\xfe\xfc\xd4\x3a\xda\x66\x88\xa3\x6c\xcc\x20\x84\x7e\xf6\x70\xb8\x66\x09\xb1\xd0\xce\x77\x20\x36\x44\xeb\xf1\xf3\x6f\x36\xb0\x5e\x5c\xb6\x42\x8d\x02\x36\x74\x14\xe2\x90\x76\x0e\x68\x15\x18\x1e\x4a\x51\xa1\xa4\x1b\xc8\xf9\x53\xaf\x80\x34\x46\xce\x68\x9a\x64\xd8\x9e\x42\x07\x21\xa7\x63\x58\xc0\x77\xa5\x59\x22\x06\xf0\xdb\x67\xa0\x6f\x4f\xf2\xe7\xec\x3b\x19\x09\xd3\x24\xf4\xec\x65\x1f\x67\x3e\x7c\x28\x96\x17\x1c\xab\xfa\x8f\xd3\x40\xf9\x4f\x5f\x71\x85\xa0\xc8\x40\x29\xca\x9e\xa2\x50\xae\x35\x84\x1a\x95\xd4\x03\x36\x28\x79\x5c\x21\x44\x60\xff\xd6\x42\x26\x66\x10\xdb\xe3\x21\xcf\x7b\x4a\x81\xb9\x6c\xf7\x8b\x58\x55\x28\xd2\x9d\x67\xa3\xdc\x3c\x86\xcc\x7e\x34\x48\x1e\xe4\x2f\x87\x24\xbd\x11\xf6\x1a\xf8\xe3\xa2\xaa\x38\x51\x3d\x4c\xc9\xa4\x9d\xd8\x42\x26\x44\x26\xf1\x5b\x57\x10\xb3\x2d\x7e\x45\x42\x48\x68\x3e\x7f\x34\x64\x69\xbd\xbc\x07\x73\xb0\xdb\xdf\x9e\xc5\x32\x13\xc0\x9c\x02\xc8\x25\x1d\xb8\x79\x80\xdd\x8e\x1a\xf0\xf6\xda\xf3\x42\xad\x24\xef\x9b\x49\xe8\x23\x4a\xa1\x7f\xfb\xdd\x2f\x64\xbc\x3b\x4e\xd9\x3f\x5a\xf4\x26\x6a\xb4\xfb\x15\x1c\x03\xd8\xa7\x60\x94\x06\xfb\xb7\xee\x5a\x61\xd1\x5f\x43\x62\x8c\x2d\xef\x5f\x6a\x72\xe0\x06\xc1\xd5\x80\x0f\xa2\x3a\x83\x26\x02\xf5\x77\xff\x8c\xde\xa8\x00\xbf\xee\x69\x46\x0c\xe2\x28\xe5\xe0\x2a\xee\x6b\x10\xbb\xad\x82\xc9\xc5\x3f\x79\x5d\x85\xa4\xae\xda\x7d\x8e\x51\x1e\x32\xb5\x02\xcd\xfe\x60\x76\x09\x92\x59\xe2\xaa\x34\xc5\xcc\x3f\xf6\xc2\x08\x46\x32\x12\xb9\xc5\xd1\x6c\x57\xc0\xd1\x03\x27\xb6\x55\x72\xa4\xe0\x6f\x0f\x6d\x2f\xcf\xef\x32\xc0\x1e\x61\x87\x7c\xee\xd9\xa1\x0e\x35\x25\x8e\x60\x9d\x3f\xd8\x74\x0e\x12\xe0\x9e\x40\x13\xe7\x60\xff\x31\xf8\xe5\xeb\x04\xe0\x2d\x80\x99\x10\xe4\x3a\x3a\x62\xf0\xa3\x05\x00\xdb\xb7\xec\xc1\x00\xb6\x58\xba\x4f\xa0\x23\xfc\x48\x22\xd8\x40\xfd\x37\xa7\x7b\x8e\xd2\xce\x31\xc0\xdf\x4b\x53\x0c\xbe\x37\x14\xe5\x4a\x22\x47\x25\x61\x4f\x81\x4d\x7b\xc2\x0f\xf7\xc3\x80\x56\x11\x4d\x80\xe3\x11\x08\xa2\x35\x08\x13\x26\x11\xde\xaf\xc4\x81\xda\xcc\x6a\x8d\x31\x74\xf9\xb7\x0e\x66\x5c\x44\xea\xcb\x69\x30\x96\xa0\xc3\xf1\x9e\x43\xf6\x47\x8d\xca\xe0\x6d\x94\x82\x47\x73\xf8\x6c\x30\x45\xfc\xfb\xdb\x0e\xad\x95\x74\x63\x30\xba\x85\xa8\xb9\xf7\xb1\x23\x45\x90\x14\x9a\x32\x3c\x65\xa5\x84\x3f\x79\x50\xca\x50\x10\x41\x63\x09\xfb\xb9\x43\xd0\x61\x27\x27\x67\x10\xbc\xd1\x12\x4b\xf9\xa3\xa3\x34\x4b\x51\x81\x8d\x53\x82\xe8\xc7\xd0\x66\x23\xf7\xdd\xa4\x68\x00\xb0\xc8\xff\x8c\x3f\xb5\x61\x82\xc1\x98\x06\x50\x91\xd6\x1b\x03\x1d\x5d\x05\x84\x24\x4a\x28\xbe\x6a\x81\xfe\xd4\x2f\xa0\x88\xc7\xc5\x2d\x1a\x67\x30\xc9\x9b\x25\x62\xe5\xd0\x06\x1f\x75\xa8\x4b\xf3\xd7\xbf\xff\x1a\xff\xfd\xef\xdf\x0d\x41\xf8\xa5\xe4\x01\x69\x05\xa7\xb6\x6c\xf0\x37\x4f\xcd\xb8\xbf\x27\xf2\xaa\xb5\xfe\xf3\x72\x91\xf8\x28\x39\xea\x90\x2c\xf4\xb4\x69\x37\xc4\x34\x35\x7f\x3a\xe4\xf0\x77\xfc\x46\xdb\xb5\xf4\x5d\x23\x26\x02\xb5\x88\x4c\x7d\xbd\x6b\xc4\x84\x1c\xc2\x6f\x24\x51\x54\x70\x37\x20\xff\xda\xb6\xdc\x88\xb5\xf0\xaa\x3e\xc0\x1c\x20\xf8\x0c\x9e\xc2\xfd\x85\x7f\xc6\xd4\xa6\xa2\x81\x80\x4c\xfa\x2f\x56\x42\x24\x79\x97\x3b\x81\x7b\xc1\x2c\xd0\xb7\xe1\xe4\x58\x60\x40\x5f\xcc\xd2\xc9\x57\xce\x17\x31\x57\xd3\x7f\xde\x6d\xc4\x14\xf9\x55\x9b\x61\x6a\x05\x44\x97\x04\xfb\x96\xea\x88\x94\x9b\xcc\xff\x3e\x4b\xf2\xcf\xfb\x73\x4f\xe8\x21\x79\xeb\x6c\x37\xc3\x4d\x02\x43\xcb\xf3\x24\xbc\x58\x69\x09\xed\xf9\xa9\x73\xe1\xe7\x5e\x12\xb9\x32\x40\x3f\x1e\xc2\x0b\x68\xfa\x0e\x9a\x5f\x58\x3b\x43\xae\x8e\xc4\x92\x59\x52\xa6\x38\xd8\x8f\x36\x7e\xd2\x0d\x7f\x6c\x99\xc4\x74\x3f\xfe\xf8\x90\xc9\x3b\xcf\x77\x96\x4a\x21\x59\xb8\x44\xd1\x90\x7b\x74\x0f\xf6\xc2\xc3\xcf\xdd\x86\x76\x4d\x2b\x20\x0d\x42\x1f\x61\x9d\x6a\xc1\x89\xf1\xdd\xb2\x29\x97\x44\x08\x6d\x96\x61\x4a\x21\xfc\xb1\x97\x16\xb6\xa4\x9c\x50\xb1\x38\xb5\xde\xcc\xbb\xfb\xbe\x37\x48\xa5\xf7\xa4\x79\x49\x2c\x30\xad\xfb\x08\x2c\x38\x88\xe2\xb3\x98\xc5\xa7\x0b\x27\x27\x9f\xd1\xa1\xea\x7a\x60\x5f\xd6\x8d\x3d\xb6\x44\xfa\xe9\x5f\x0c\x86\x44\x02\xaa\xe6\xdc\xd1\x67\x0d\xac\x66\xf1\xba\x08\x51\x4b\x74\xb3\x54\x5d\x14\xb5\x2a\x40\x34\xb7\x31\x38\xbb\xf2\x1b\x28\x07\x36\x7b\x53\x2c\x12\x0b\x94\xd2\xa0\xff\xd6\xb2\x7c\x48\xa6\x15\x05\x23\x91\xd1\xd5\x4c\x06\x45\x38\xe2\xfd\x18\x22\x61\x97\xbf\x38\x23\x88\x75\x2d\x9c\x94\x2b\xd3\x03\x40\xad\x67\x55\x34\xde\x51\xac\xb8\x47\x37\xb1\x37\x02\xf4\xd5\xa0\x2f\xe8\x66\x97\xcc\xcf\x37\x6c\xa5\x50\x35\x80\x50\x55\xef\xd9\x61\xf4\x55\x87\xd5\xbf\x6b\x4d\x34\x2d\xd1\x78\xc4\x5d\x51\x8b\xdc\xd3\x89\x8f\x17\x5f\xa0\x01\xd0\x2f\xcb\xaf\xa3\x78\x55\xd6\xcc\x4f\x12\xf0\xd7\xa9\x04\xf4\xe3\x1f\x1f\x1d\x48\x69\x78\xb8\x20\x86\x80\x11\xcb\xeb\x3b\x20\x9b\xc9\x0c\xdc\xac\x59\xbd\xeb\xfb\x91\x22\x4e\x7a\xb0\xed\x68\xd6\x6d\x25\x2f\x5c\xbd\x72\xac\x20\x8e\x61\xaf\xf0\x17\xb2\x58\xa0\xd5\xda\xe9\x16\xc4\xe8\xaf\xed\x6f\x7e\xf9\xc3\x65\x35\x23\x3f\x53\xf4\x8e\x29\x49\xb8\xd2\x0f\xa1\x2e\x6d\xd7\x65\xaf\x7c\x46\x8b\xf9\x89\x24\x8b\x7b\x2e\xd9\xce\x7f\xfb\x58\xbd\x92\x65\xaa\x98\x27\x4f\xe0\xfa\x0e\x6b\x3d\xfc\x34\xa3\xc9\x8e\x3e\x95\xaf\x04\x14\xf6\x29\x51\x28\x36\xe8\xbf\x7e\xc6\xb7\xc6\x39\x90\x5f\xb9\x4c\xc8\xe8\x30\xd1\xcc\xc7\x1f\x0c\xfa\x14\xaf\x3e\xe1\xe6\xfc\x11\x19\xae\x03\x78\x5c\xf4\x09\x2f\x83\x28\x0d\x38\x11\x8c\xc7\x61\xec\xe1\xc4\x7e\x47\x3e\x78\x24\x73\x94\x2e\xd9\x36\x17\xf4\x04\xf4\xc3\xa7\xc9\xa3\x56\x70\xe3\xd3\xd2\x85\xc8\xd4\x63\x4a\xdc\xa7\x76\xed\xa3\xeb\x2c\xcc\xd5\xcc\x41\xdb\xe7\xf9\x26\x50\x27\x92\x9e\x04\xca\x5e\xb5\xa6\x5c\x5c\x27\x9c\x78\x35\x3b\x5e\x17\x62\x0f\x03\x74\x28\x81\xf3\xe2\xaf\xcd\x13\x9a\xb2\x9e\x37\x63\x7f\xce\x6a\xf3\x25\x39\x38\x7f\x76\x06\x7e\x5d\x5e\xdc\x3d\x26\xe4\xcc\xab\x67\x0c\xc7\x66\x19\x47\x6e\x92\xd8\x5c\x5d\xa0\x1c\x3f\xa1\x54\x84\x0b\x62\xe0\x1e\x66\xbc\x8f\x34\x20\xd8\x4d\xf1\x17\x33\xe8\x77\xff\xaa\x78\xf4\xc9\x5a\x6e\x72\x9d\xb1\x6c\xac\x70\xfa\xa8\xf0\x83\xc0\x60\x1c\x18\x1f\xcc\x0b\x05\x27\xef\xae\x5c\xbc\x91\x75\x3c\x86\x7c\x61\xfb\xb5\x94\xb4\xbe\xfc\x52\x7b\x60\x04\xe4\xff\xec\x8b\xf1\x1c\x49\x9d\xce\x93\x73\x76\x51\xcf\x79\xd8\x40\xdb\x66\xbb\x27\x8a\x83\x2b\xd0\x39\xea\x62\x4f\x00\x7a\x9c\x38\xc6\xed\x24\x06\xb2\x2c\xcc\x2e\xec\xba\xca\xfa\xc9\x6c\x4a\xfc\x1c\x0a\x23\xe5\x85\x48\xfd\xc5\x03\x1e\xec\x85\xb4\xa7\x2a\x3b\x26\xc0\x71\xe0\x2b\xc2\x53\xa7\x19\xf1\x66\xad\xaa\xf7\xce\x2f\x03\xab\x4c\xaf\x7a\x98\xf5\xdd\x85\x03\x2e\x64\x6b\x04\x09\x73\xba\x3c\xdd\xf6\xc0\xe5\x04\x63\x08\x0c\xe2\x9d\xf7\x78\xfb\x3a\x84\x23\xfc\x4c\x19\x44\x11\x3d\x2c\x6b\x8a\x9d\xc3\x76\x3e\xe0\x34\xa2\xbe\x72\xdc\xba\x4d\xa0\x3d\xf5\xab\x80\xc2\x75\x81\x82\x7a\xe0\x83\x4d\x7d\x6c\xfd\xa4\x02\xc0\x97\xae\x39\x8f\x63\xcf\x49\xd4\x57\x53\x35\x97\xda\x53\x5d\xef\x13\x51\xd2\x73\xc8\x61\x86\x9f\x7b\xc7\x94\x91\x23\x87\x37\xf9\xef\xa0\x57\xfc\xf5\x80\x19\x40\x81\x4b\x49\xf9\x66\x1d\x1a\x72\xac\x7e\x4f\x8e\x98\xcb\xfb\xc6\x99\xd4\xfb\xa7\xc5\xd7\x71\xca\xe9\xdd\x7a\x6f\x62\x51\x85\x45\x79\x0e\x63\x27\x4d\xaf\x58\xc1\x64\x5c\xa8\x85\x37\x2d\xff\xd4\x65\x24\xe2\x90\xf7\x4a\xda\x3a\x8d\xe0\x9b\x35\x35\x65\x0d\xeb\x34\x8c\xcf\xf9\x86\x4f\x57\x5e\x96\x7a\xe6\x41\x40\x5d\x38\x61\x5a\xbc\xbd\x9e\x8f\xe8\xf9\x48\x33\x98\xab\xba\x76\x33\x3c\x2d\x4d\x4e\x41\x71\xbf\x81\x01\xb4\x12\x5b\x5c\x67\x6b\xca\x9f\x6f\x5e\x35\x01\x42\xa3\x75\x04\x44\xfc\x86\xdf\x7a\xf3\xba\x6a\x76\x83\xe7\x0e\x09\x3f\x6c\x01\x4d\x75\x1f\xec\xa5\x92\x63\xda\x0e\xf3\xfd\xb5\x7c\xa2\x16\xe9\xa9\x83\xe5\x64\xc5\xd9\x22\xbd\x75\x12\x28\x58\x39\x99\xd2\x1f\xbc\x60\x56\x3f\xb1\x9e\x06\x4a\x75\xbe\x02\x45\xd1\xd9\x8d\xa4\xb7\x93\x40\xa0\x5c\xbf\xaa\x95\x70\x6a\xaf\xfd\x5b\xbd\x62\x3b\xf4\xaf\x1c\xc2\xf6\xf8\x88\x2e\x82\x2a\x9f\x55\xe1\x3e\x9a\x7c\x4f\xd5\x9c\x71\xb8\xe1\x47\x93\x69\x16\xd5\x81\xb5\x64\xc4\x4c\x8e\x12\x8b\xf4\x29\xdc\xc7\x5f\x7b\x36\x20\x49\x1b\xb6\x9f\x14\xac\xa1\xdf\x3a\x7b\x1b\xf0\xf4\x66\xf3\x42\x67\xb9\xa2\x9a\x7c\x3c\x72\xb7\x3a\xa7\xe5\xae\x67\x92\x45\x72\x2e\x46\xd9\xcf\xc2\xb8\x55\xcc\x8f\x76\x55\x72\x72\x33\x02\x6f\x9f\xf3\x64\x7f\x3a\x30\xec\xc5\xf7\x9e\x17\xeb\x84\x36\xbc\x14\xcb\x3a\x3f\x47\x81\xb6\xfa\x60\x4d\x11\xc9\x7b\x9a\x9d\x88\x77\x44\x75\xe6\x60\x0f\xac\xa8\x84\xfe\x16\xca\xa9\x09\xc6\xc9\xfe\x3b\x4e\x26\x26\x14\x39\x48\x0d\x9b\xf7\x20\xe0\xc3\xe9\x1c\xc2\xf6\xb8\x56\xe8\xa6\x01\x0a\x3e\xbc\xef\x03\x0e\x25\xfc\x8e\xcb\x26\x2e\xb6\xf7\xab\x1f\x01\x3e\x0e\x52\x7e\x5b\xce\x6f\xc5\xe8\xa5\xbd\xb7\x03\xba\xbc\x78\x69\x2b\x24\xc2\xff\xc1\x74\x9f\x24\x17\x81\x0f\x70\x0c\x79\x5d\xff\x4a\x58\x8e\x49\xba\x7c\x82\x00\xa2\xec\x85\x96\xa6\x7b\xac\x9a\x00\xb2\x75\x13\xbf\xe6\x75\x3f\x89\xce\x21\x1d\xbf\x99\xfd\xf3\x54\x50\x6e\xc0\xa3\xee\xbc\xe3\xfe\x51\x03\x61\xa7\xc0\xf4\x49\xbb\xed\xbb\xbf\xd1\x2e\xf0\xfd\xdc\xff\xeb\xfb\x79\x0e\xcd\xb9\xaa\x0f\xca\xb7\x14\xca\x51\x60\xa4\x72\xd2\xee\x43\x12\xc8\x74\x70\x68\xdd\x07\xc8\x48\xbf\x7a\x5d\x3e\xe6\x6b\x77\xc5\x25\xcd\x86\x1a\xc3\xe8\xf5\x5f\xde\xec\x98\x6a\x95\x2d\xb8\xe0\xa7\x2f\x10\x41\x06\xbe\x86\x95\x6f\x4d\xea\x27\x7a\x7f\x58\x77\xff\xea\x69\x05\x9d\xca\x11\x7e\x5f\xe8\xfb\x71\x97\x62\x3a\x99\x5c\xf7\x73\x83\xcb\x70\xde\xfd\x07\x19\xf9\xe1\xf9\x21\x94\xe3\xe7\x0c\x63\x2d\x68\x67\x57\x12\xc2\xa9\x6b\x71\x1d\x9e\x2c\xae\xb8\xc5\xe2\x8e\x93\x34\xbf\x97\xc3\x86\x70\xad\xf8\xbc\xdf\xbe\xf2\x25\xb7\x88\x77\xc6\x2e\x8b\xbe\xe4\x32\xbf\xbb\x57\xd6\xbc\xcc\x08\xf1\x56\xe5\xb3\x5c\x31\x8d\xf5\x49\x62\x9e\x28\xc1\xa0\xfe\xc1\x76\x26\x67\x30\x00\xac\x90\x26\x0c\x30\xd2\x98\x0e\x58\x0d\x55\xbb\x2f\x59\xc2\x42\x19\x4f\xee\x12\x58\xc3\xaa\xc7\xd5\x4e\x7f\xbf\x0f\xbb\x86\xe1\x04\xc0\x7c\x18\x09\xbb\x86\x41\xab\x9c\x57\x42\x6a\x72\x7b\x3c\x63\xc4\x5f\xbf\x24\xe3\xac\x47\x9c\x1b\xe3\x58\xab\xcf\xb8\x8b\xf1\xe5\x91\x9b\x5e\x25\xf4\x94\xc0\x8f\x64\x4c\xbb\xa9\x7d\xf0\x0c\xde\x79\x20\x8a\x10\x30\x1d\xb5\x53\xab\x81\x98\xec\xc4\x31\x80\x1d\xe0\xa3\x71\x10\x56\xc5\xe6\x33\x99\xb8\x53\x7c\xa8\x39\xb9\xf0\xeb\xb1\x9b\x7e\xec\xbe\x69\x61\x12\x50\x15\xcf\x2f\x87\x76\xc6\x93\xd7\xb2\x5b\x60\x8d\x59\x76\x1f\xae\x83\x6a\x1e\xe5\x2a\x67\xd5\xad\xb7\x20\x42\xe7\x77\x58\xc4\xcb\x21\xf2\x27\x00\x8d\x88\xfa\xb0\x9b\xf9\xfb\x39\xf1\x4c\xf2\x28\xc6\xd8\x66\x18\xc9\xdf\xd9\x43\x87\xef\x27\x31\x10\x2b\x83\x8f\xaf\xe3\xb6\xe5\x59\x89\x80\xfb\xd2\xf5\x17\x38\x47\xc1\x10\xe7\x6f\x3d\x45\x00\x41\xbf\x65\x26\x84\xc5\x44\x67\xcc\x71\x52\x2d\xfe\x78\xef\xb6\x36\x81\x17\x83\x4a\xf6\x87\x92\xc5\xb0\x6f\xee\x57\x3e\x9b\x33\x43\xac\x3a\xf9\x3b\xdb\x2e\x83\xc8\x18\x4f\x11\xc8\xa5\xdf\x8b\x7d\xb3\x14\xd9\x80\x9e\x71\xb0\x6e\xdf\x69\x6c\xd7\xef\x4c\x2d\x1d\x60\xa6\x45\xd4\x8f\xfd\xe0\xae\x7c\xab\x7a\xa6\x59\x76\xc7\xad\xab\x75\x25\x7b\xd5\xc1\x9b\x5e\x79\xe0\x48\xbf\x73\x85\x58\xfd\x6a\x91\x99\x7a\x59\xa1\x50\x5b\xfa\x4b\x75\x5d\x67\x92\xbe\x67\xa7\xe3\x6e\xb3\x46\xe3\xe8\xcc\xf4\xd8\x7a\xbe\x92\x57\xa7\xc3\x4a\x61\x68\xca\x95\x48\xcd\xfc\xa6\x23\xbf\x75\x2e\x5d\xe7\xc8\x4c\xbf\x90\x14\x46\x62\x07\x0f\xc6\x79\x92\x5e\x1b\xde\x8e\xe3\x60\x21\x04\xb2\x0c\x45\x7e\xca\x71\x69\x6e\xdb\x44\xf1\x6e\x24\x14\x98\x62\xfd\xe7\x13\xb4\x3c\x61\x7c\x8d\x62\xf9\x63\x81\x2a\x71\xb4\x4e\xb9\x09\x3d\x32\xbe\x63\x26\xf4\x34\xa4\x2f\x7c\x0f\x88\xe9\x49\xb7\xac\x57\xec\xe3\xd6\x97\x0b\xbc\x62\xc8\x06\x5c\xb7\x52\xd2\x66\xb0\xfe\xd4\xa4\xbf\x53\x6d\xcd\x5d\xcf\x78\xcf\x0b\xcc\x57\xe9\x63\xd2\x9e\x00\xb3\xa5\x17\x93\x69\x5d\x7b\x57\xe0\x48\x52\x5b\x33\x98\x5a\x2a\xbe\xe5\x86\xf1\x57\x47\xf3\x32\xa6\xba\x72\xcb\x42\x9d\x52\x5e\x77\xe2\xa7\x45\x1d\x29\x56\xac\x1b\xd3\xf6\x7d\xbf\x9d\x36\x9c\xdf\x6e\xdf\x9d\x62\x31\xce\x41\xf7\x70\x21\xe7\xe2\x57\x1d\x7d\xc6\x7e\xf1\x67\xe4\xfc\x37\x79\x62\xcb\xf0\xb1\x74\x08\x5b\x29\xa0\x4c\x38\x55\x7b\x7a\x87\xd8\x40\x36\x22\xa0\x2c\x88\x64\xf5\xfd\x3d\xec\xb3\x64\xea\xc8\x66\xa3\xf7\xad\x03\xbb\xf6\xa3\xe5\xc8\x03\x70\x15\x2a\x2d\x54\xd8\xf6\xd9\xab\x64\x2b\x1b\xfc\xf7\x7d\x89\xd9\xac\x93\xbd\xeb\x5e\xf4\x98\x39\xad\xdd\x8d\xa9\xcd\xcf\x75\x66\x48\xfa\xaf\xdd\xbc\x86\xef\x02\x09\xdc\x39\x2f\xe3\xf2\x19\x62\xbb\xe2\x79\xec\x22\x27\x26\xf6\xb0\x7d\x0f\x2e\xd3\x7e\xb8\x0f\xc5\x30\x07\x32\x36\x59\x74\x8d\xee\xf4\x77\x91\x8c\xdf\xf9\x4f\x1a\xab\x71\x10\xe1\xdf\x5e\x04\xe2\xed\x40\x5a\x4f\x02\xf3\x2d\xe9\xae\x9e\xb2\x68\x40\x6a\x5e\xdd\x3c\xe8\x61\x56\x60\x3d\x62\x9f\xec\xb6\x69\xc9\xef\x74\xce\xed\xd9\xfe\x1b\x37\xc8\x25\x9a\x34\x32\x49\xed\x9d\x7a\x1e\x01\xe2\xdb\xf9\x7a\x1f\xf2\xc6\xf2\x05\xac\x0b\x4f\x2c\xd0\x5b\x02\xff\x87\x93\x6d\x5b\x48\xf8\x22\xd0\xd6\xbe\xfd\x91\x18\x8d\x7a\xec\x16\xc9\x28\x33\xcf\x7f\xfa\x9c\xff\xfe\xd5\x17\x2a\x83\x54\x94\x9c\x13\xc5\x4b\x29\x8e\x53\x84\x25\x3a\x59\x97\x37\x88\x2d\x77\xb5\x78\xea\xe2\x95\x43\x2c\xfe\xf6\x74\x16\x69\xbd\x47\xe5\x60\x7f\xef\x69\x28\x36\x48\xca\x6e\x0e\x91\x6e\x99\x42\xc6\xff\xe8\xaa\x02\x10\x9b\xf5\x64\xd4\xb3\xf9\x48\x49\xda\xe2\x2a\xca\x22\x1e\x7d\x07\x18\x20\x24\x3f\x3c\x82\xdb\x04\xcd\x17\xe8\xe4\x33\x66\x6c\xac\x76\x47\x4a\x83\x47\x99\x49\xa4\x4f\x39\x6a\xd0\xe7\xff\x6a\x19\x32\xcb\x45\x8b\x59\x02\xb0\xe7\x10\x27\xb0\x2c\xbc\xdd\x56\x19\x92\xd0\x7f\xe6\xdb\x23\x35\x52\xf6\xe4\x03\xfd\x7a\x56\x85\x65\x0f\x2a\x26\x54\xa6\xd9\xf3\xdb\x87\x32\x2b\x48\x41\xff\xd6\x32\x07\x5a\x2f\xb5\xab\x54\x4a\xce\xfc\x16\x8c\x58\x80\x7a\x98\x5c\x19\x62\x2c\x73\x97\x9e\xfb\x67\xae\x95\x70\xa3\x09\xed\x20\x3e\x57\x31\x23\x7a\x5a\x13\x6d\xa5\x97\x90\x6d\x3c\x56\x70\xf0\xff\xd1\x26\xd7\x18\xb5\x3b\x83\xdd\x5d\x8b\xbc\x2e\x04\x1a\xba\x47\x0f\x39\xff\x93\xbf\xa3\x93\x97\x41\x3e\x3b\xfd\x64\xfb\x29\x97\xe4\xdd\x03\x9c\x4f\x6e\xd4\xfc\xab\x17\x33\xe0\xe7\xff\xea\xe0\xab\xff\x2f\xe0\xfb\x63\xce\x6b\x5b\x6a\xee\xa7\xcb\xb8\xbb\x56\x9c\x60\x99\xd3\x0d\x7a\xe4\x3c\x10\xff\x7f\x7a\x69\xd5\xe6\x20\xd4\x76\xa2\xf5\xc4\xeb\x59\x0c\xd1\xcc\x65\x9d\x72\xc4\xb2\xc2\x60\xb8\xb0\xeb\xf1\x3f\xba\x93\x6c\x3f\xc6\x83\x5f\xa5\x94\x85\x5e\x9a\xf1\xee\x34\x1e\x4e\xbf\xa5\x43\xc5\xcf\x22\x06\x74\xd4\x80\xfe\xce\xa5\x23\xd9\x13\x25\xcf\x99\x7d\x7d\x42\x30\x57\x44\x1b\x1e\x0e\xf1\xb9\xbd\x63\x9e\xac\x58\xeb\x9f\x3c\x80\x00\x38\x15\x92\xda\xa2\xd2\x4d\xfd\xa7\x96\xb2\xfe\xab\xef\x07\x64\xcf\x3c\x4d\x90\x7f\xf3\x4d\x58\xff\x7c\x49\xe7\x1a\x22\x2b\x62\x86\x43\x8e\xa2\xed\x2b\x5b\x96\x66\x12\x3b\x9f\x46\xb6\x99\xe1\xab\x83\x28\xa7\xe6\x4f\x9e\xe5\xd8\x69\x93\xec\x5e\x6f\x36\x26\xbd\x77\xb5\xb8\xfd\x9b\xaf\x12\xf8\xca\x46\x9a\xf2\x3b\x70\x8c\xff\x70\xdf\x90\xf0\xd8\x6e\x05\xed\x2e\xf4\xf3\x81\xa0\x0f\xc5\xaa\xb4\x7c\x9f\x3b\x8d\x51\xdd\xeb\x3b\xc9\x68\x28\x8c\xf9\xa7\x36\x95\x52\x86\xc7\xcb\xb3\xdf\x77\x62\xba\x7a\x43\xfc\x5a\x5b\x5d\x4d\x24\xf6\x90\xfa\x86\xe0\x3d\x6a\xf3\x86\xd7\xc2\x32\x16\xd1\xfe\xe4\x8e\x15\xf0\xfc\x32\x35\x25\xed\x83\xa6\xc6\x56\x3d\x8a\x46\xc7\x63\x23\x56\x1f\x89\x2b\x58\xd3\xdf\x9c\x4f\x69\x8a\xfd\xa0\xcc\xd7\xf7\xab\xa1\xed\xbe\x09\x15\xd6\x33\x5c\x9b\xe6\x50\x89\x21\x33\x3c\xa9\xdc\xba\x0a\xde\x75\x28\x02\x51\xe5\xcb\x2f\x45\xf2\xc6\x8f\xff\xe4\xe2\x8c\x60\x76\x3d\x0a\x0f\xb2\x66\x5c\xe0\x86\x40\x7d\xf5\x2c\xc4\x50\x17\x2b\xb2\xda\x5f\xa9\x60\x7e\x15\x3c\x1a\xaa\x3a\x4e\x16\x74\x88\xe9\x26\x54\x4a\x7a\x74\x43\xc3\xfa\x8d\x81\x5e\x2e\x03\x23\x28\xcd\x64\xe5\x01\x49\x55\xd6\xc2\x51\xb9\x12\x41\x36\x84\xdb\x0e\x6e\xa1\x45\x54\x94\x80\x50\xc9\xa2\xbd\x30\x37\xaf\x44\xbf\x37\x74\x27\xdc\x9f\xba\x7f\x14\x1f\x7f\xaa\x84\x95\x78\x65\x6d\xee\x3a\x65\xc3\x6f\x48\x2b\x8e\x22\xa6\x4a\xd3\x22\xc3\x26\x65\x74\x7a\x7b\x60\x77\xcf\xb2\xce\x7c\xc9\x42\x60\xdb\xd1\x64\x98\x86\x4c\x76\x00\xd7\x08\xa7\x39\xfe\xb3\x83\x8d\x11\x51\x8a\xfe\x4a\xdd\x72\xef\xb2\x77\xfa\x1d\xa3\x71\xe6\x81\xf2\x55\x65\x8c\x7f\x2f\x15\xba\x4a\xe1\xc0\xa2\xcf\xaf\x85\x76\x42\xf2\x09\xa3\xc9\x44\xf5\xe5\xad\x4b\x2d\x58\xbb\x07\x2b\xb1\xf3\x3f\xeb\x81\x5a\x9f\x4d\x6a\x6f\x52\x3f\x6f\xdd\x5b\x35\xa0\x33\x75\x8f\x5f\x35\xeb\xec\x16\x09\xa8\x1c\xd2\x4e\xf5\x73\xdd\xd4\xd1\x17\xa5\x48\xc5\x47\x17\x1f\x33\x2b\x5e\xf9\x07\x65\x79\x15\x39\x55\xa2\xcb\x6f\xac\xa5\x0e\xa6\x78\x21\x04\x96\x3e\xa8\x2e\xce\x74\xb7\x81\x5d\x36\x78\xb0\x57\x9f\x85\xca\x6c\x02\x61\x60\x02\xbe\xc0\x07\x20\x78\xe6\x05\x43\x53\x01\xcc\x0f\xf7\xcd\xbe\x9d\xa3\x67\xf1\x75\xa8\xbf\x98\x4f\xe6\x82\x69\xb2\x73\xf2\x5d\x60\x30\xd4\xd3\x7f\xf3\x33\xf5\x5f\xbc\x3c\xe2\x76\x08\xa8\x12\x42\x24\x5d\x0a\x69\xf9\x4d\xa0\x80\x14\x02\xce\xe5\x8a\xf6\xa7\x22\x8a\x14\x3b\xe5\x81\x0c\xee\x27\xfa\x55\xb9\x7f\x7b\x97\xe4\x49\x6e\x79\x72\x18\xdb\x40\x73\x8c\x99\x7e\xbf\xcd\x03\x61\xb0\x9e\x83\x02\x0e\x6a\x52\xd2\x3e\x12\xca\x87\x27\x07\x0d\xe8\x49\x18\x76\xfd\x46\xb3\x5e\x25\xfc\xee\xae\x6e\x41\xd6\xce\xaf\xfc\x6e\x08\x06\xfd\x53\x23\x94\x22\xaf\xcf\xd1\xa6\x55\xe8\xac\xe9\x61\x4b\xa8\x79\xa2\x04\x74\x57\x39\x7e\xce\x2c\xd0\x69\x2e\x38\x5a\xc7\x89\xe0\xa4\x0a\x52\xca\xb0\x62\x3b\x8f\xf9\xfa\x16\x76\x43\x5d\xc2\x70\xeb\x85\xd1\x8d\x97\xa0\x4f\x28\x17\x61\x5a\xe6\x64\xf1\x6f\xae\x3b\x93\xb7\x97\x14\x8c\x47\x4e\xd0\x11\x76\xd7\xc3\xcf\x27\x74\xa4\xca\x41\x55\x79\x0b\xfa\xad\xe7\x72\x0c\xa8\xfb\x1d\xd8\x3d\xd0\x4c\xeb\xb0\x77\xe6\xcd\xc0\x6f\xc7\x82\x02\xc1\x2a\x93\x16\x11\xff\xe4\x69\x09\x69\x17\x3f\xc4\x4b\xfe\x00\x43\x65\x60\x75\x89\xdd\xb2\x74\x8c\x32\x40\x14\x36\xeb\xc3\x5a\x17\x51\xb0\x17\x2d\xd0\xbd\x7b\x5a\xbd\x32\x80\x47\x36\x46\x12\xcd\x27\xc4\x33\x3a\xf8\xe8\x61\x4a\xa4\x2e\x07\xbb\x66\xc7\xf9\xf7\xa9\xb7\x85\xbf\xb9\xe9\x6f\x1d\x40\x4b\x7e\x0b\x99\x7a\x8c\xa5\xfb\xc6\x3e\xae\x3e\xca\x32\xe6\x8b\xa1\x2c\x7e\xae\x93\x61\x21\xaa\xdf\xf5\x47\x07\xf1\x4b\xc3\x65\xf7\x4d\xbb\x8f\x1f\xa4\xfb\xb8\x5d\x7a\xf6\xf6\x5c\x93\x96\xc5\xb0\x21\x75\xbc\x86\x72\xba\x7f\x3e\x86\xbb\xe6\xa7\x2a\x78\x92\x68\x7e\xfb\xec\x20\xa0\x2f\xf8\x6f\x3d\xa3\x25\x3d\xe7\xed\x44\x13\x86\xa2\xc6\x88\x9c\x65\x16\x1a\xa1\xd4\x4b\x29\x16\xc8\x29\x57\xed\x43\x34\x5e\x1a\x0e\xdd\x1f\x37\x87\xe6\x24\x20\x4d\x91\x44\x14\x35\xe8\xfb\x85\x5d\xdc\x06\x9a\x45\x3f\x6f\x69\x5e\xeb\x59\x8a\x61\xb7\xda\x88\xb0\x04\xed\xc6\xf7\x63\x8d\xe5\x42\x61\x5a\x0b\x5e\x81\xcc\xa6\x9e\x6f\x8d\x5c\xf7\x82\x3e\x9f\x28\xb3\x8d\x16\x79\x1e\x7f\xee\x8d\x03\x88\xa9\x0a\xa0\xeb\xeb\x57\x6d\x14\xf8\x71\x9d\x8f\x08\x8a\xbe\xc3\xce\x1b\x84\x44\xb8\x29\x06\xb0\x66\x6b\x3b\x61\x0c\x68\x52\x7f\xa3\xb9\x60\x89\xde\x24\x39\x06\xe2\x38\x63\x2e\x4f\xce\x8a\x87\x13\xd6\x0a\x58\x15\xf6\xd6\xf5\x5d\x32\x26\x2d\x03\xb8\xf8\xef\x0f\x69\x04\x25\xf0\xa6\x90\x21\x71\x58\xab\xca\xe7\xc4\x1e\x12\xa6\xcb\x52\xa0\x92\x9b\x06\x3f\x17\x06\xa7\xf8\x21\xa9\xb2\x67\x46\xe3\x94\xc0\x95\xd1\xd2\x54\x0a\x47\x51\xe2\x8e\xb5\xa5\x24\xc3\x69\x05\x28\xa1\xd4\x01\x5f\xdf\x92\xc1\x78\xa0\xf1\xef\x87\x12\x01\x50\xa4\x92\x37\x08\xe6\x36\x62\xbe\xe4\x49\x0b\x8a\x6f\xa7\x37\x16\x92\xd0\xe7\x25\x18\xa0\xab\xbd\xc7\x92\x4b\x6c\xbf\x7d\xf3\xd7\x11\x51\x4c\x7d\xb7\x33\xda\xb6\xb8\x5d\x3d\x64\x73\xd3\xac\x83\xd7\x5e\x51\x7a\x0e\xe6\xde\xf5\x6f\x26\xf0\x92\x59\xf3\x1c\x49\xaf\xb6\xd6\x50\x57\xfb\x0f\x56\x10\x40\x37\x72\x32\xe1\xab\xe2\xfc\x41\x59\x80\xeb\x0a\x71\xda\xeb\x56\x25\xd8\x5d\xc3\x1e\x31\xb2\x7f\xac\xd8\xa0\x68\x0b\x7b\x84\xec\x7d\x3e\xf6\x89\x69\xf5\x4c\x12\xa6\xf1\xa9\x0d\xd2\x27\xa4\x68\xdd\x86\x5e\xfc\xeb\x99\x6b\xca\x12\xa8\x8d\x90\xf2\x1f\xb9\x59\x05\xfe\xa5\x31\xf9\xe7\xb5\x2a\x7f\xa6\x63\xac\x58\xf1\x51\x1d\x39\xba\xce\x2a\x4d\x7b\xda\xd9\xbd\x1c\x7e\xb4\x7e\x09\x96\xa7\xf7\x58\x9f\x30\xe0\x05\xbc\xa8\xdc\xcf\x77\x84\x73\x8f\xd5\x4f\xdd\x71\x61\x27\xca\x17\x55\xe6\x52\x48\xc1\x6c\x9a\x28\x08\xdf\xf3\x53\x6b\x9d\x43\x9d\xf4\xea\xc3\x48\xfe\x39\x1e\x85\x4b\x4d\xe6\x90\x0b\x35\xfd\x6d\xf6\x3f\x2f\x2b\x45\x58\x9b\x70\xd5\x90\x4a\xe6\xc9\x11\x10\x37\xfb\xb2\xc1\x32\x6e\x78\xaa\x77\x67\xe6\xb0\x63\xdd\x34\x72\x93\x29\x04\x52\xe7\xa9\x06\x1a\xf2\xb2\x8d\xa0\x67\xab\xc6\x95\x43\x24\x71\x42\x5a\x8f\x6a\x51\xc9\xd5\x2a\x80\x4a\xb8\x3c\xac\x8f\x78\x02\xd0\x76\x63\x79\x4e\x9e\x52\xb1\x02\x0f\x4f\x04\xfe\x2e\xff\x39\x57\x49\x30\xf4\x1a\xf5\x95\x19\xd1\xa9\x64\xbc\x9c\xd2\x52\x85\x11\xc7\x96\xa4\x57\x75\x6b\x95\x72\x84\xdf\xee\xde\x5a\x8c\x8c\xff\xf0\xc0\xbb\x0f\xed\x2d\x94\xfa\xac\x8e\x2b\x2a\xbf\xc3\x52\x5d\xd2\xa7\xaf\xb4\x5f\x33\x79\xc6\x50\x29\xd9\x87\x3f\xf8\x19\x97\x20\x1d\x03\xb5\xc2\x1b\xf3\x10\x83\x80\x57\x86\xc6\xeb\x3f\x39\x04\xc0\x2d\x56\x89\x66\xac\xea\x63\xe0\xbe\x5d\x62\x2d\x24\xe6\x13\xc9\x62\x40\x2a\x3d\x6a\xdd\xc2\xef\x1e\xb2\x3c\x16\xfc\x83\xf4\x10\x37\xb8\x92\x98\xe2\xda\xe1\x19\xc7\xe2\x4e\x4d\x39\xde\x3a\xcc\x27\xe1\x84\x0f\x71\x3d\x79\xf6\x58\x82\x87\xbc\x97\xbc\x89\x36\x70\x2c\x9d\xa1\x89\xc9\x85\x0c\x5d\x32\xfe\x70\x13\x42\xa0\xd0\x52\x15\x7c\xc6\xb2\xb5\x4e\xa0\xdd\x6f\x33\xaa\xe6\xe8\x5a\xef\xe5\x09\xdd\xfc\xe3\x9d\x59\x04\x8f\xe6\x2f\x86\x1b\xd6\x5b\x6a\xec\x62\x5d\x45\x93\x6a\x72\x5f\x18\x19\xf7\x1b\x70\xd9\xeb\x96\x0e\x26\x18\x0f\x8e\xd8\x10\xb5\x0a\x43\x99\x8b\x80\xe0\x17\xea\x2b\xde\x83\x18\x13\xe9\x25\x41\x0c\x04\x8d\xc5\x7f\x5c\x49\xc8\x65\xbc\x34\xeb\xaf\x62\xba\xe5\xf3\x13\x7e\x54\xe6\x81\xbc\xe7\xb7\x7f\x95\xeb\x22\x12\x20\xf5\x6f\x63\xb2\xb5\x14\xc4\xaf\xba\x3f\x82\x11\xec\xba\x75\xeb\x6f\x6d\x04\xf0\x0d\x56\xaf\xf3\xe0\x7c\xd8\x02\x8f\x7a\x55\x7b\xe6\xde\xde\x25\xa7\x44\xc1\xcc\xec\xe5\xfd\x2c\x9e\x22\x49\x02\x3f\xe0\x8c\x52\x57\x48\x81\x84\x8f\xd5\x3e\xf1\x07\x20\xd8\xaa\xc6\x6c\xe4\x9f\x8d\xe4\x99\x9d\xd3\xcd\x1e\x0a\x81\x12\xa0\x42\x3b\x9f\xa2\xd9\xa5\x0a\x48\x6b\x1f\x90\x1e\xc0\xea\xe7\xfb\x22\x74\xcb\x4c\xde\x11\x6a\xec\x77\x3f\x1d\xa8\x4a\x8a\x2a\xa6\x7b\xb3\xde\x49\xab\x7a\x80\x90\x86\x42\x16\x4a\xe4\x37\x09\x1d\x1c\xb9\x63\x2d\x24\x75\x13\xf8\xf2\x41\x59\xa4\xa6\x2a\xd0\x94\x64\xd3\x4b\x7f\x4a\x01\x5d\x3c\x81\xec\x23\x6f\x3e\xf3\x83\x21\x14\xf4\xb0\xb5\x02\xb1\x7c\xb2\x91\x7b\x97\xea\xe1\x68\x62\x3e\xc9\xbb\x5d\x42\xd1\xc4\xe0\x98\x31\x7c\xda\x5d\x9f\xc5\x4d\xb7\xac\x4f\xbb\x00\x65\x77\xde\x71\x7e\xd2\xc5\x46\x25\x28\x18\xac\xa7\x37\x22\x5e\x4c\x17\xb1\x7b\x03\x5e\x5f\xdf\x65\xd4\x1b\xd6\xcf\xda\xad\xcf\x26\x18\x9a\xa4\x67\xde\xcf\xd6\x0d\x87\x53\x15\x0b\x4d\x9c\x91\x35\x3c\x50\xbb\x44\x31\x42\xfb\xd7\xae\x52\xb2\x51\x2d\x41\xac\x65\x59\x0f\x1b\x95\x5e\xe6\xe3\xfc\x0c\xa8\x9a\x95\x9a\x1a\xbf\xa3\x67\x9f\x9e\x5b\xfa\x79\x7e\x79\x06\x2c\xc7\x76\x92\xa2\x27\x8e\x23\x7c\x9b\xdd\xb8\xab\x7b\x96\x17\x60\x95\x0a\xcb\xdb\x1b\xd7\xaa\x25\x42\xd4\x51\xcc\xee\xa1\x3e\x97\xb6\x2e\xcf\x80\x97\xb1\xeb\xed\xb0\x05\xff\x7a\xa7\xf7\x3f\xef\x64\x1b\x25\xcc\x8d\x42\x78\x35\xb5\xd2\x3c\x4a\x08\x8b\xbd\x19\x03\x38\x96\x16\xd7\x59\xce\x3b\xf4\xce\xde\x42\x06\xdf\xb2\xfb\xfb\x56\x37\x91\x2c\xda\x6d\x33\x22\x80\x2e\x40\x8c\xf1\x48\x1e\xc9\x09\xbc\xe6\x7d\xeb\xc1\xa6\x4a\x26\x8c\x57\x76\x04\x6c\xde\xb4\xe5\x74\xc0\x24\x25\xc6\x45\x7d\x63\xa8\xb1\xa6\x2c\x71\x0b\x3c\x28\xd7\x37\xf4\xcf\x56\xef\xca\x32\x1b\xa6\x50\x1b\x50\xe6\x35\xc2\x61\x56\xb6\x4d\x3f\x79\xb5\x5b\x5f\x59\xf5\xf2\x73\xac\x1a\x97\x87\xea\xd8\x8f\xb2\x04\x44\xa1\xc4\x7d\x6e\x3b\x71\x8c\x31\x81\x8b\x44\x57\xef\x38\x4a\x60\xa7\x0f\x32\x6d\x09\xef\x89\x4b\xb3\x66\x58\x3a\xc4\x13\x4f\xe0\xb6\xc8\x81\x18\x1c\xea\x00\xaa\x8d\x30\x44\xdd\x78\x5a\xd8\xfe\xc5\x3e\x65\x9d\x1c\xd5\xab\x6f\x97\x60\xa0\x79\x16\x97\x7f\xbe\xad\x12\x86\xbc\x43\x5e\xf9\x38\x04\xb1\xe5\xc3\xa4\xad\x17\xe7\x05\x71\x01\x34\x1f\xf7\x08\x9b\x5f\xdd\x32\x8d\xc8\x84\xe1\x22\x6e\x3a\x41\xbd\x88\x6e\x93\x3d\x3e\x9f\xec\x00\x63\x3b\x3d\x8c\xd8\x58\x80\xa4\xbe\xb7\xee\x03\x05\x22\x16\xc9\x30\x11\x6d\x24\x9f\x6f\xe1\x25\x9f\x8e\x82\x5b\x5f\xa0\xac\xdc\xa6\xe6\x9a\xc2\xff\xfa\x34\x41\x98\x28\x3d\xe1\x34\x79\xda\xa2\x1e\x6a\x22\xd3\x59\xe1\xe4\x43\xab\xab\x18\x05\x47\x6d\x20\x82\x81\x25\x14\x07\x55\x1b\xea\xbd\x66\xd6\x06\x8a\x71\x48\xf8\xd0\xa8\x3f\xfa\x94\x0c\xe1\x8f\x14\x6b\x81\xb0\xe0\x19\xc2\x54\xa1\x3d\x94\x9d\x4e\x13\xa0\xfe\x38\x9d\xa1\x0b\xf8\x89\x22\xe8\xcd\x23\x00\xb3\xbe\xff\x3e\xaf\x08\xb6\x58\xda\x5a\x91\x90\x0e\x2b\x57\xb6\xc3\x5a\x8a\xba\x65\xae\x9e\x83\x92\x82\x25\xc5\xb2\xa6\x37\x36\xf2\xee\x49\x3b\xdf\x8f\x07\xcd\x1b\x23\x8b\x37\x90\xfa\xf2\x4e\x09\xbf\xc1\x7d\x84\xdc\xf4\xbb\xba\xcc\xea\xd7\x19\x28\x11\x87\xe3\x38\x8c\xd0\xed\x7c\x39\x0a\x15\x18\xc3\x40\x64\xc5\x4f\x80\x67\x02\x39\xc8\xd9\x50\x0c\x09\x6c\x62\xf6\x54\x7b\x3f\xb5\x74\xdc\xa5\x87\x8f\x9b\x86\x94\x66\x52\xb5\xd9\x94\x72\x78\xa5\x72\x57\xbf\xdd\xeb\xd9\x25\xe7\x87\x5d\x80\x7a\x17\xde\xfa\x87\x08\xd9\x16\x49\xb0\x55\x98\xaf\x93\xe0\x63\xeb\xa4\xea\xbb\xa1\xc5\x46\x01\x12\x72\x60\x8c\x44\xa0\x5e\x7f\xf7\x2b\x27\xf2\x79\x74\x73\x91\xda\x3a\x4a\x11\x4e\x33\x62\xaa\xdb\x0b\x1f\x9c\xb1\x66\x23\x35\x14\xea\x28\x85\x7d\xee\x30\x87\x93\x0b\xec\xed\xa4\xcc\xec\x99\xc2\xcb\x63\x7d\x6f\xb7\xa7\x7b\x64\xea\xeb\xe2\x17\x3c\x81\xf1\x1f\xe0\x13\xcd\x6a\x65\x79\x48\x1e\x9d\x04\x79\xd4\x1b\xc3\xb9\x58\x93\x80\x54\x31\xf4\xe1\xe7\xf8\x08\x90\xa7\xec\xcd\x6f\x24\xe7\xf0\x4c\x86\xa7\x45\xda\x2a\x22\xdd\xbc\x1b\xc8\x76\x3b\xbf\x93\x0c\x35\xf5\xd9\xd1\xfd\x6d\x61\x55\xb9\x4b\x72\x87\xcc\x3d\xf6\xdb\x3f\xe3\x46\x64\x04\x93\xea\xaf\x04\x23\x55\xc7\x41\xde\x71\xde\x75\xfe\xda\xb5\x7a\x40\x72\x0a\xa7\xcb\x47\x0a\xa1\x83\xe2\x91\xfe\x01\x20\x10\xc4\x2c\xb2\x60\x8a\xd6\x52\xfd\xf2\x65\x94\xa1\xcd\x7d\x8c\x0e\xf7\xd7\x34\x13\x3f\x5e\x16\x76\x2a\x39\x00\xff\xec\xea\xc7\x8d\xdd\x56\xf5\xe9\x2a\xba\x99\x76\x0e\xbc\x26\xb8\xd1\x85\x2f\x03\x93\xb0\xbd\x0e\xb1\x63\xc7\xe9\xa2\x42\xae\x6b\x9a\x04\x6f\x91\xd9\xdf\x18\x29\x10\xe8\xc5\x07\xc2\xcd\xdb\x35\x24\x95\x77\x4a\xf9\xfa\xa7\x4d\xeb\xab\xaa\x96\xcf\xee\xdd\x51\x65\x88\xb9\x2c\xf6\xc4\x81\x8d\x7d\x5d\xec\x9b\x3e\xd7\xee\x8d\x87\x5c\x8f\xf1\x94\xd1\xd6\xe2\x5e\x34\xf2\x41\x6b\xb4\x4d\x85\x72\xdc\x25\x59\xce\xe7\xff\xb8\x33\x5d\x2a\xe2\x57\x05\xb4\x33\x6b\xd3\x56\x0d\xdd\xb6\xda\x42\x3a\xca\x3c\xb2\x47\xda\xed\x30\x93\x57\x55\xe3\xee\x6d\x3a\x24\x88\xab\x61\x88\x83\xda\xec\x7c\x67\x9f\xcf\x43\xc9\xef\x35\x95\xcf\x69\xfb\xd9\x31\xa2\x96\x42\xae\x59\x12\x49\x51\x20\xfc\x0c\x0d\x42\x9e\x72\x8d\x58\x04\xe1\x2b\xff\xd8\xf2\x55\xf8\x5a\x54\xc2\x42\x2f\x6b\x35\x98\xd9\x4e\x1d\x59\xf4\xcd\x9b\x74\x46\x8b\x44\x45\x01\x8e\x20\x05\xd1\xab\xfc\xd0\xe1\xe7\xad\x3c\x90\xe4\x3a\xc3\xbd\x3f\xfa\xcd\x3c\xf5\xf5\x36\x24\x79\x49\x43\x8f\x51\xf7\xf1\x9b\x0b\xf4\x84\x99\x96\x9b\x5d\x4d\xac\x31\x92\xb7\x3a\xa1\xda\x8e\xac\x56\xe1\x32\xa3\x7f\x7c\x95\x36\x31\xb5\x58\x28\x46\xc6\xb9\x31\x6f\x93\x4c\x32\x45\xb5\xf9\x9c\x0d\x3e\xb8\xda\x08\x79\x6b\x73\xb5\x7f\x33\x70\xde\xec\x9e\xcc\xbb\xaa\xdf\xf3\xdd\x90\xde\x9a\xfb\x84\xa6\x9d\xe7\xde\xea\xd1\x4a\x75\x63\x81\x0d\xec\x38\xce\xf9\x0a\x10\x06\x25\xfc\x66\x19\xee\xbf\xf6\xa5\x32\xb9\x1c\xca\xde\x44\x06\x22\x66\x39\x6a\x3a\xc1\xb1\x5c\x66\x9a\xac\xd7\x0b\xf3\x09\x4e\x18\xae\xe5\x7c\xa5\xc6\xe4\xc1\x5f\x27\xc1\x11\xf5\x2a\xef\xd3\xdd\x21\xdd\xfb\xd8\x5c\xba\xc2\x4c\x9a\x9e\xf5\xfc\x6d\xb4\x01\xd2\x9e\xaf\x18\x1a\x5c\x63\xbc\x61\xfb\x15\xd8\x51\xec\x47\x63\x90\x84\x4a\x45\x95\x63\x5d\xf8\xf7\x1c\x46\xfd\x76\xe0\xa2\x75\x22\xd1\x7e\xb5\xb1\x6e\x5c\xa6\x5f\xdc\xf2\x94\xb9\x1e\xee\x60\xad\xd6\xe2\xf0\x98\x1e\x85\xfb\x06\x3a\xa6\xfa\x64\x09\xda\xaf\xef\x82\x53\xc2\x5a\xa9\x87\x0d\xa7\x9c\x20\xc4\xbe\xae\x30\x20\x92\x56\x11\xf3\x2a\xf4\x02\x94\x3f\xff\x72\x7d\x8a\x68\xd7\x0d\x71\xc3\xb7\x66\x91\x62\x32\x44\x6f\x7b\x7c\x90\xc7\x53\x55\x54\x10\x68\x96\xa1\xed\xf1\xdb\x7e\xcb\x1e\xea\xe3\x91\x14\x6f\xfd\xfb\xbe\x67\x5f\x04\xb9\x74\x53\x21\xaa\x13\xe5\x06\xe2\xd1\x40\x54\xec\x05\xdf\x4d\x30\x78\x34\x86\xf2\xc7\xff\x3c\x5b\x64\x32\xab\x76\xa2\xca\x05\x50\xc1\x2c\x80\x81\x54\x4d\x6f\xa5\x48\xb0\xba\xaf\x07\xd2\x45\x3a\x20\x3e\x7b\x5c\xec\xfe\x13\x19\x85\xe7\xfc\xcb\x0f\x63\xb9\x8a\x83\xb7\x28\x25\x04\x29\x29\xf3\xcb\x2d\x9b\xf5\x33\x90\x64\xce\x58\xa1\x80\x9a\x00\xc8\xc8\x2d\x8e\x7e\xdc\x90\x05\xec\xfc\x3a\xf0\x82\x1b\x7e\x5d\x9a\x8b\x3b\x5a\x50\x31\xc3\xb5\x7a\xdd\x1d\xbe\x65\x9a\x38\xa5\xcf\x65\xc4\xd3\xf2\x36\x89\x5c\xc0\x08\xf4\x3b\x09\x4f\x88\x22\x76\xb2\x55\x8b\x3a\xc7\x52\x94\x80\xf2\xef\xdf\x38\x57\x32\x2d\xb0\x95\x0a\xc6\x25\xc4\xb7\xbf\x26\xce\xbb\x62\xa4\x80\x95\x81\xda\xcf\x82\xbc\x59\x07\x8c\x2f\x57\xd4\xaa\xb3\x81\xed\x0e\x09\xd7\x33\x1f\xbe\x00\xc0\xa7\xdc\xe3\x37\x91\x8b\x76\x83\xa5\x41\x4e\x89\x24\xf2\x37\x66\x13\x44\x6d\xb1\x6c\x5d\x07\x7d\x39\x89\x65\xe4\x6b\x73\x42\x8f\x89\x31\x32\x28\xf6\x52\x67\xb5\x30\x92\x32\x77\xc5\x7a\x09\x6f\xe1\x41\x12\x47\x27\x9e\xb1\x4e\xf1\xaa\xbe\xc5\x26\xf1\xc7\x91\x48\xc2\x67\x4a\x73\x20\xb9\x13\x89\x4d\x61\x89\xc3\x87\x57\x15\xdd\xe2\x79\x60\xb7\x12\x23\xe0\x9b\x5b\xa5\x1b\x78\x07\x86\x64\x90\xa7\x95\xd7\x52\xa1\x90\x93\xe9\x9a\xbe\x45\xff\xc3\xbb\x05\x5a\x3a\x91\x00\xcc\xc9\x6b\x49\xe0\xf3\x27\x65\x79\x29\x0a\x0c\x6b\xb4\x8d\xe8\x74\xe8\xbb\x85\x09\x35\x88\xcd\xfc\x11\x3c\xdd\x37\x52\x97\xea\x2b\xd5\x04\x86\x00\x88\xf5\x57\x67\xed\x42\xc2\x58\xee\xb8\x01\x5b\xec\x87\xa2\xbf\xdf\x5e\x64\xa1\x8a\xad\x22\x2b\x73\x6e\xea\xac\x21\x0d\x2e\x58\xb3\x3e\x1a\x04\xee\xf5\x65\x37\x86\x48\x04\xf3\x1f\x5d\x93\xeb\x7d\x5c\xd1\x10\x67\x68\xf2\xb5\x7e\xea\xc8\x04\x19\x7a\xf1\xed\x1c\x7e\x66\xf7\x07\x1e\x0d\x25\xdc\x2a\x37\xc1\xd6\xb1\xaf\x6a\x35\xac\x10\x38\x75\xb4\x9d\x04\x96\x8c\x27\x54\x3c\x2d\x26\xdf\xfe\x9c\xb7\xa3\x04\xf9\xc8\xf8\xb3\x22\x03\xb5\x5c\x12\x10\x97\xa3\x39\x0e\x33\x9d\x8c\xa6\xc1\x7f\x51\x30\x22\xec\x02\x3e\x4f\x54\x1f\x16\xb1\x14\x92\xf8\x9c\xbc\x56\x14\xe6\xc4\x4d\x15\xec\xb3\x50\x7e\xe2\x93\x5e\xf4\xe5\x2c\x46\x46\x59\x9f\x5c\xbe\x1f\xad\xb1\xef\x0c\xb1\x00\xe0\x81\xc6\x35\x5e\x6a\x65\x54\xc8\xaf\x31\xb0\xc1\x29\x84\x61\x58\xee\x4c\x1f\x4e\x45\x49\xbe\x05\xfb\xf7\x1d\xa5\x6b\x24\x01\x0b\x95\x9e\xb1\xd3\x9c\x06\x7b\x05\xc1\xc7\x00\xfe\x87\xb5\x98\xc4\x71\xf7\x28\x64\x7c\x96\x68\x5e\x5b\xe1\x7e\xd4\xc7\x21\xf5\x5f\xf1\x88\x77\x00\xf6\x6a\x2c\x56\x3f\x44\x9a\x24\x84\x15\xd8\xce\x48\xa1\x05\x6d\x87\x1f\x3b\x50\xaa\xb4\x10\xea\x75\x7b\xe3\x38\xe9\x48\x0d\xff\xf1\x7d\x73\x04\xc6\xdd\x19\xb0\xd5\x1c\x5c\x04\xcf\xd4\x21\x6b\x0c\x15\x6d\x73\x5c\xfc\x79\x8a\x48\xd8\xf2\x0c\x96\xe1\x8d\x19\x57\xa7\x50\x56\xe4\x34\x0a\xf0\x73\x7c\x75\x77\x8d\x11\xec\x24\xac\x1d\x88\xc9\xb9\x2e\x19\x6d\xb1\x0d\x6f\xba\x00\x74\xd2\x56\xfd\xbe\xbb\x77\xf9\xd2\xe8\x10\x96\xa9\x89\x82\x53\x1f\x3b\x8a\x23\x1d\xd1\xd4\x33\xdc\x5e\xc7\x03\xac\xd1\x31\x7a\xf0\xdb\x26\xb7\x2c\xa1\x2f\x0b\x5e\x1f\x87\xc1\xb0\x27\x3d\x08\x8c\xbf\x21\x71\xb6\x8b\x43\x72\x07\xae\xe3\x0c\xba\xff\x86\x00\xe1\x79\x2a\x72\xcd\x11\xb0\xaf\x98\x08\xca\xfc\xea\x3b\x0d\x49\x85\x41\x1e\xf5\x86\xe0\xe7\xd1\x90\x31\x99\x08\xe1\x5f\xfb\xa0\x0c\x89\x38\x69\x8c\x22\x7d\x89\x6c\x8e\x35\xde\x67\xb5\x64\xb4\x32\x08\x4f\xa3\x6f\xbd\x16\xd3\xe8\xc7\x98\x59\x28\xd0\x71\x5a\xc9\x0a\x9f\x7f\x78\x86\x41\x08\x2e\x46\xcf\x06\x29\x74\x82\xe1\x06\xa6\xd2\x8b\x94\x60\xc7\x61\x15\x94\x34\xab\x12\x50\x97\xbe\x89\xd8\x74\xff\xdf\x6f\x64\xe0\xaf\xde\x41\x0b\x0a\x3a\x88\xa7\x19\xb0\x54\x21\xd1\x61\x4d\x8d\x5f\x77\x1b\xa5\xb6\xd8\xec\x1a\x5b\x83\x4d\x53\x44\xba\xad\xd5\xdb\x8f\x43\x93\x92\x30\xac\xcd\x4b\xa6\x58\x5d\x0d\xc3\x06\xec\xd7\x84\xe6\x44\x98\x1f\x36\x88\xaa\x5b\xbc\x53\x7c\x53\xe6\x63\x4c\x11\x52\xad\xdd\xfe\xc9\x1d\xc8\x8c\x44\x61\x2c\x61\x7d\xf8\x98\xa7\x17\x56\x30\x14\x82\x73\xbc\xe6\x2a\xc1\x43\xce\x46\x51\xa4\xe6\x91\x5a\x4f\xcd\xa9\xc1\xbe\xe0\xf1\x8f\xdf\x8a\xe2\x47\x8d\x1a\x6f\x70\x85\x82\x1e\x8b\x0a\x4a\x41\x10\xa8\xec\x82\x20\x0b\xec\xf3\x61\x43\xc7\x73\xda\x82\x68\xe3\x9b\x57\x0c\x04\x09\x64\xd2\x3f\xe3\x5c\x19\x35\xcb\x87\xad\x92\x95\x2e\x7a\xd2\x3e\x47\x54\x8c\x69\xba\x1c\xaa\xc1\xe5\xad\x7b\xce\x94\x16\xa1\x4a\xae\xa0\x68\x4d\x11\x3f\xd4\xa6\xf6\x1a\xb6\x20\x02\xc9\x60\x26\x30\xfd\xa8\x9c\x89\xa2\x51\x26\x37\x08\x2b\xe7\xc3\x08\x59\x03\x81\x50\x2a\xd6\x41\x0a\x7e\xf8\x16\xfe\xfc\xc8\xa2\xcb\xc5\x6d\x81\xfd\x93\x14\x2f\xd2\x4a\x54\x79\x3d\x2c\x2d\x0b\x51\x4c\xfa\x67\xa2\xa5\x90\xe6\x59\x61\x1e\xe4\x52\xc8\x0d\x52\xc9\xf5\xbf\x31\x42\x24\x14\x4b\x0a\xea\xeb\xcc\xde\xfc\x5e\xe7\x92\x50\x6b\x5d\x14\xea\xd7\x5d\x3c\x1c\x23\x7f\xb6\x5e\x29\x6d\x8d\x4b\xd6\x34\xf7\x8f\xce\x26\xeb\x83\x8f\xf1\x50\x2b\xeb\xe6\xd8\x6a\xcb\x1e\x0d\x25\xb0\xe6\xde\x35\x7a\x99\x0b\x4e\x74\x20\xa0\x34\x40\x5f\x93\xda\xf2\xd5\x95\x5b\xf9\x71\x54\x83\xb6\x5d\x86\xc5\x55\x29\x94\xd9\x48\x36\x23\xd6\x10\x00\xbc\xe9\xd6\xe6\xcd\xb0\x34\x98\xe4\x61\xf5\xb8\x85\x32\x0c\x58\xa7\xff\xf9\x9d\x29\x5a\x4e\x6d\xe6\x03\xc1\x48\x83\x2f\x7d\xe8\xa8\xc9\xe8\x18\xad\xea\x2f\xa6\xf7\x36\x1d\x38\x8c\xa1\x74\x2b\xca\xa4\x49\x5a\x4d\x7b\xdc\xd6\x51\x2b\xdd\x18\x28\x9a\x7c\xe0\x73\x4a\x2c\x70\x7a\x3e\xfe\xac\x2f\x29\x06\x0b\x3d\x39\x86\x52\x00\x21\x13\x25\xc0\xef\xad\x96\xd5\x53\x11\xd5\xdf\x5f\xab\x4e\x8a\x1b\xbe\x4e\xf3\xf9\x9d\xc1\xb6\x2c\x87\x0c\x70\xfa\xf9\x08\x70\xda\x90\x24\xb7\x29\x82\x0a\xc4\x16\xf1\x5f\x3d\x88\x51\x0d\x1d\x94\xfe\x55\xf8\xe5\xe4\x84\xc8\xdc\x86\xa7\x80\xf9\xd2\x17\xde\x67\xad\x80\x35\x98\x38\xa0\x65\x78\x3b\xa3\x1b\x47\xba\xa6\x09\xb1\x1d\xdd\x6d\x2e\x03\x31\x80\x88\xad\x02\x07\x72\xb5\x14\x1c\x17\xe5\x94\xad\xfc\x33\x40\xca\x50\x3e\x57\xb3\xb8\xe7\xd5\xbc\x58\xcc\x86\x08\x7b\x3c\xd1\x43\x3f\x5f\x19\x14\x60\xea\xb7\x52\xb3\xf8\x43\x1c\x0c\x91\xe7\xac\xd0\xe4\x4a\x51\xc3\x80\x87\x40\xef\x39\xcd\xd5\x67\x1e\x71\xc3\x03\xab\x56\xe3\xbe\x00\xed\x3e\x58\xa5\x04\xfc\x64\xe6\xf8\x8c\xd1\xdc\x01\xe8\x5c\x28\xa3\x80\xa5\x18\xe6\x66\x30\x23\x4f\xb4\xc1\x5d\xeb\x44\xb2\xf8\x99\x8f\x40\x2b\x50\xd2\x99\xaf\x2c\xbd\xdf\xad\x87\x79\x9e\x22\x7e\x92\x55\xbd\x23\x2a\x57\x7b\xa6\x18\xa7\x7c\x21\xc0\xaf\x82\x95\x44\x1b\xa0\x08\x32\xc2\xae\xb5\x1e\x96\x3d\x5b\xa7\xbc\x4c\x56\xbc\x34\xfd\x72\xf8\x7b\x9a\x1d\xe4\xb6\x4e\xde\x32\xc8\x79\x6f\xa1\x41\x1a\x07\x18\x57\x8f\x46\x25\xdf\xde\x8e\xed\x40\x12\xfc\x36\xbb\x59\x96\x41\x30\x01\xb6\xb8\x22\x1f\xca\xf9\x31\x63\xe2\x70\xcd\xc8\xa9\xf7\x26\xad\xbb\x1e\x93\xd4\x01\x59\x79\xa1\x46\xa8\xe5\x13\x7d\xd9\x87\x86\x0d\xcf\x5b\x35\xdb\x6a\x7f\xc6\xd5\xf9\x1d\xbb\x24\x94\xaf\x5c\x37\x1e\x84\x68\xb1\xab\xf2\x90\x35\x88\xca\x12\x4e\xb7\xb7\xf5\xab\xe9\x55\xc0\x7f\x6b\xee\x5f\xbb\xa5\x6a\xa7\x1c\xdd\xaa\x31\x9c\x7c\x2e\xe6\xf4\xd3\x62\xb2\xb2\x48\xb1\x92\xf4\x6d\x15\x7d\x4e\x01\x51\x6d\xa7\x9d\x92\x1b\x37\x26\x6f\x46\xe9\xdf\xd9\x30\xb7\x3d\x25\x28\xd8\x1b\xd7\x5d\x3c\xdf\xb8\xd0\x17\x39\x55\xa2\xde\x2c\x43\xd1\xa7\x40\xff\x35\xd1\xc3\x0e\x0f\x93\x6c\x29\x81\x92\x64\x24\x3a\xcd\x91\xf2\x9e\xe9\x11\xd9\x75\xf4\x19\xd2\x21\x95\xb1\x5d\x4d\x9f\xb8\x34\x1c\xe9\xe3\xbc\xe1\xae\x17\x6e\xe1\x6e\xf7\x75\xbc\x42\x48\xe1\x68\x34\x2a\x90\x40\xf0\x0c\x9e\xee\x60\x2b\x50\x33\x7f\xf9\x6e\xce\x19\x40\x9a\x01\x4b\xdd\x9b\x9d\x11\x80\x98\x77\xb0\x03\x4e\x3b\x10\x9c\x3a\x2b\x9a\x78\xe8\x0d\xf8\x1a\x6d\x40\x62\x66\x49\xfa\xfe\xfe\xae\x2f\x2f\x87\x7e\x91\xd4\xc0\x39\x09\x9f\x5f\x79\x8c\x7c\x99\x30\xee\xbd\xb9\x42\xcd\x0b\xb6\x19\x2c\x53\x0a\x20\xa6\xfd\x97\x53\x38\x2d\x5d\x97\xbc\xc0\x08\x3e\x3a\x1f\xe7\x74\xc4\xa3\x77\xef\x1e\x23\xe0\x36\xac\x91\xf0\x09\x88\x1e\xe9\x43\xd4\xf2\xe1\xce\x63\xf7\xfa\xbd\xa8\x75\x6b\x22\x72\x81\xe9\xc1\xb0\xd1\x91\x69\x76\x4d\xeb\x24\xa9\xdf\x09\x78\xdf\x5b\x47\x28\x59\x02\x08\x03\x4a\x21\xff\x8b\x31\xd4\xe5\x97\x95\x13\xd1\x9a\x62\xc3\x35\x86\x97\x9d\xde\x6a\x09\x5b\xa7\x40\xdb\x74\x57\x63\xb1\xc4\xb7\x84\x07\xa4\x59\xe8\xb3\xc0\x5d\x80\x89\x14\x0f\xde\x5f\xe2\x7e\x78\xd7\x66\x8b\x3f\x62\x3f\xad\xdd\xf0\xe9\x46\x62\xc6\xc8\xb2\x2a\x52\x96\xcf\x98\x40\xaf\x0a\x04\x62\x00\xe2\xb0\x5d\x82\x0d\x82\xde\xcf\xd4\x6f\xae\x52\x1f\xb0\xfb\x48\x3e\x11\xfe\xd5\x31\x30\xe6\x4c\x20\x49\xe1\xe6\xa2\xcb\xfa\x05\x92\x35\xd5\xf9\xc0\x37\xae\x3e\x6b\x81\xd9\x43\xfd\xe3\xb9\x7c\xf5\x9b\x60\xcc\xef\x23\xee\x68\x5b\x22\xa3\xaf\x2b\xf5\x30\xf7\xb8\x0a\x86\x24\x95\x23\x8a\x99\x6c\xaa\xfb\x69\x98\xf4\xe8\x1b\x50\xbc\xc3\x8c\x13\x7e\xdc\x3a\x3d\x02\x48\x9b\xd1\x63\x75\x0e\x52\x23\x35\x06\xf1\x0c\x89\x14\xae\xe3\x94\x10\x0a\x08\x2b\x07\x62\x34\x84\xf5\x00\x64\x7e\x71\x5b\x92\x48\xc7\x72\x19\xdd\xee\x06\x65\xd2\xe2\x3d\x33\x0f\x5e\x4c\x21\xd6\x93\xf6\x14\x0f\xf1\xbf\xe4\xc3\xee\x3b\x2e\x4f\xf6\x96\xca\xdf\x75\x94\x30\x0a\x86\x2e\xdf\xed\x0c\x21\x9d\x1d\x61\x6f\x80\xed\xcb\x63\x39\x5e\x31\xbd\x64\xee\x8a\x8e\x32\x35\xbb\xd1\x2d\x79\xd6\x9f\xef\xe7\x79\x37\x80\xe5\x31\x3b\x27\xf3\x1c\x60\xc6\xca\x1b\xfd\x1e\xf0\x57\x3d\x62\x87\xb9\xe9\x3a\x4a\x55\xb6\x73\xf2\xf8\x2c\x50\x57\x7a\x15\x70\x16\xb0\xf7\x90\x7b\x6d\xcb\xe8\x2d\xeb\xa7\x7b\x96\xaf\x38\xf9\x7e\x75\x9c\x4b\xde\x6f\xcc\xc4\x26\xf1\xca\x6f\xe6\x64\x71\xaf\x5d\xd9\x39\x78\xd1\x11\x82\x1b\xeb\x8e\x8b\xba\x63\xc0\xd8\xa6\x26\x9e\xde\xf1\x95\xbd\x91\xca\x24\xa4\xe7\xe5\x71\xe5\x9f\x5e\x24\xc3\x6c\x34\xa7\x20\xad\x4d\x3c\x18\x2d\x3d\x85\xba\x3e\xf4\xf7\x9d\x44\xbf\xa6\x48\x13\xc9\x58\x17\x1b\xcc\xe4\xc9\x78\x68\x85\x58\xfd\x62\x4c\xa4\x80\x44\x78\xa2\x21\xb7\xe7\x2d\x0c\xe1\xe8\x1d\x8b\x79\x4f\xf6\xd7\x5a\x61\x65\x3d\xc8\xe1\x47\x0e\x85\x8a\x9e\xa9\xdc\x29\x27\xbb\x3f\xfc\xc6\x73\xfb\x95\xed\xcb\x12\x10\xcf\xf1\x99\xa5\xcf\x16\xab\xca\x07\xf6\xd5\x9f\x0f\xf0\xe7\xe9\x99\xcc\x55\xbb\x85\xd7\xbb\x83\x22\x6f\xf5\xf7\x8d\xb4\x6c\x31\xae\xba\x8d\x07\xa6\x43\x84\xb3\x4a\x5e\x3c\xc0\x90\xfb\xdb\xe3\x33\xc1\xa8\x11\x67\xc6\xd8\x30\xd7\xbd\x99\x80\xd8\xd5\x06\xd7\xe6\xa7\x4f\x6d\x57\x45\xb7\x04\x68\xeb\x36\x42\xab\xb3\x22\xda\xfa\xe4\x8f\xe7\x33\x42\x92\xf6\x15\x3f\x1e\x0a\x5a\x75\x1a\xc6\x95\xe2\x44\x69\xe6\xd1\xc6\x6c\x5e\xf2\xf7\x87\x26\x60\x72\x1a\x5c\x75\x92\xe8\x17\x75\x28\x35\xbf\x26\x8e\x63\xe5\xce\x85\x2f\x38\x90\x6b\x96\x8d\x5b\xa2\x92\x2a\x5c\x5f\xa3\x06\x17\xd2\xbf\xf2\x40\x0c\x55\x5e\x67\xcd\xb2\xef\x23\x40\x71\xd6\xa0\x24\xe6\x17\xfe\xba\x0d\xe6\x49\xad\x1a\xee\x1c\x2b\x7c\x6f\xcc\x70\x0c\x6d\xd6\xdd\xd0\x66\x99\xa1\xd6\xb9\xbd\x65\x00\xf0\xc7\xfe\x0e\x07\x9f\xa4\x18\x80\x2b\x93\x8a\xc1\xcb\x0c\x0f\x2c\x62\xa7\x29\x86\x5e\xbd\x77\x5a\xd5\x86\x13\x60\x2b\xb9\xe8\x53\x1d\xaf\x05\x1e\xe4\xd5\x10\xf7\x05\x52\xfd\x88\xbf\x6a\x99\xd8\x23\x11\x57\xf5\x09\x47\xbf\xe2\x8d\x21\x08\x8c\xe1\x57\x63\x69\xc5\x34\xfe\x8b\x84\x90\x61\xce\xf9\xe1\xeb\x2b\x1c\xbb\xc6\xc5\x96\x28\x2b\xc9\xcd\x16\xb1\x4c\x84\xb2\x83\x71\x4c\xb7\x9e\xb1\xb9\xbc\x5f\x77\x47\xbf\xd1\x4a\x62\xf7\xae\xf8\x8c\xd6\x7e\x24\x8f\x0f\xe2\x02\x2e\xd5\x37\xee\x1d\x62\xd6\xe6\xb1\xbe\x1f\x1d\x81\x76\xd2\x94\x2f\xb2\x15\x03\xfb\x71\x38\xf3\xde\xc1\x80\x8b\x00\x5e\x5a\x31\x41\xea\xf4\xe6\x7e\xee\x3d\x9a\x5c\x5c\x6a\xff\xcd\xef\x0c\x61\xf2\x26\x17\x7e\x3e\xd5\x7c\xdf\xaf\xe1\xc8\x32\x53\x92\x6c\xa3\x34\x46\xa1\x63\x69\xcc\xcb\x4b\x34\xc5\xb8\x02\xf4\x05\xc4\xf1\xd3\x74\xf6\x09\xd5\xfb\x93\xff\xe2\x07\x61\x99\x52\x60\x0a\x8f\xf4\x31\x2c\x08\x30\x0e\x39\x37\x60\x3c\xc7\xd7\x42\xb1\xdc\xe2\xe5\x8f\x00\xb4\x7d\x53\x15\xa1\xff\xa3\xe9\x3a\x96\xdd\xc6\x95\xe8\x07\x71\xc1\x9c\x96\x92\x98\x83\x98\x83\xb8\x63\x14\xb3\x98\xd3\xd7\x3f\xf0\x7a\xde\x4c\xb9\x5c\x75\x6d\x4b\x24\xd0\x7d\x02\xd0\x40\xbf\x53\x0f\x60\x01\x0b\x4c\x74\xac\x76\x6c\xdd\x10\x4c\x2f\xbf\xf3\x1a\xaf\x80\x78\x33\xff\x5b\xe3\x1e\x82\x69\x6c\x1e\xcd\xdf\x9c\xcc\xbb\xab\xe9\xce\x6b\x2f\x25\xd2\xf5\xe3\xb9\xdb\x6d\xc5\x5b\xd4\xa5\x1f\x19\xb8\xa5\xb0\x0b\xca\x81\x58\xea\x33\x80\x91\xec\x9b\xf6\x28\xfc\x3e\x1b\xaf\xf1\x52\x64\x2a\x81\x12\xb5\x01\x3a\x18\xca\xd5\x7c\xe1\x86\xfb\x66\xe2\x92\x24\xac\xb4\xd7\x32\x7b\x9d\x75\x7f\x32\xad\x55\x69\x59\x68\x3a\xc2\x97\xe1\x96\x86\xfb\xf7\xdd\x9c\x72\x5f\xdf\x64\x4a\xf5\x2e\x1b\x37\x2f\x3e\xa3\x21\x39\x19\x5f\x26\x5a\xf2\xa1\xef\x37\x17\xcc\x57\xcf\x85\x83\x2d\xfe\x88\xde\x70\x27\x20\x61\x7c\x9b\x94\x5f\xa2\x91\x5e\x1e\x02\x22\x64\xbb\xd7\x48\xe3\x29\x90\xb7\x8e\x0d\x2a\xba\xcf\x00\x2e\xda\x58\xd4\x21\xb1\xf4\x60\x68\x6a\xc0\x03\xe7\xe8\x10\x7f\x91\x1c\x10\xcc\xa3\x17\xdc\xf7\xbc\x14\x8d\xc5\x0b\xd5\x21\x37\x38\x29\xf6\x28\x25\x9d\x86\x68\x09\xff\xad\x87\x34\x24\x5b\x1d\x80\x65\x81\xc2\x68\x6e\x2c\x77\x38\xdd\xd0\xc5\xda\x73\xd2\xbc\x34\x07\xd6\x8c\xe8\x24\xd6\x0b\xb1\x65\xa9\xde\x43\xfa\x71\x95\x86\xd7\x43\x66\x8b\xb0\x60\xe5\x5f\xf3\xd2\x95\x7b\x2d\x40\x89\x0d\x52\x45\x68\x37\x8a\x44\x72\x4e\x1e\x3f\xf1\xcb\x34\x4a\x19\x6f\xb9\xed\xbe\xf5\xef\xa2\xda\xcd\x0f\x05\x7e\x84\xf7\xfc\x9c\xd3\x23\x96\x2f\x20\xf1\xb4\x8d\x00\x9e\x45\xdd\x7a\xce\x5d\xf8\x92\xf7\x5b\xc4\x3f\x1d\x02\x23\x4f\x79\x07\x78\xa9\xbc\x84\x73\x5e\x54\xcf\xa0\xbe\x1c\xf0\x95\x04\x53\x6b\x57\x66\x87\x03\xfa\xf8\x65\x02\x1f\xdd\x9a\x90\x6a\xb1\xd5\x0a\x07\xf9\xee\xce\x6e\x3b\x19\x16\x47\xd3\x4a\xbb\xcc\x60\x0c\xa6\xe2\xbc\xdf\xc8\x96\x6e\x02\xb3\xb7\xc5\x92\x71\x1e\x69\x26\x24\x9c\xc4\xbc\x5f\xe4\x41\x3a\x1c\x6e\xdd\x89\x9f\xfd\x2b\xf7\xc0\xfb\x12\x58\x63\x4d\x5a\x35\xf0\x45\x98\xc8\xd2\x5c\x99\x7c\xff\xa3\xf5\xef\x4d\x39\x4f\xc5\xe6\x05\xef\xf6\x33\x0e\x4f\xfc\x50\xf9\xfe\xe9\xf3\xf1\xde\xc8\xc7\x10\xd7\x97\x67\x10\x58\xd5\x8c\xed\xd9\x17\x4d\x54\x44\xd3\x22\x34\x0b\x62\xfb\x82\x55\x89\xeb\xb6\x90\x28\xda\xe4\xd8\x92\xf8\xf4\x66\xe3\x36\x8b\xd6\x7a\xf4\x1b\x54\x5f\x18\x39\x85\xef\xa6\x23\xd3\x5c\x1e\xbf\xf7\x28\x2c\xe4\x51\x52\xe6\xc2\xe2\xf7\xcd\x7e\x1e\xd5\x38\xb9\xa4\x28\x73\xaf\x06\x8f\x28\x6b\x5e\x03\x6a\xf2\xcb\x58\x0f\xf7\xf3\xce\xc1\x5b\x94\x2d\xca\xb2\x7d\x06\xe6\x1f\x77\xec\xbc\x06\xcf\x19\x8f\xec\x01\x28\x48\x53\x3c\x2f\x10\x9f\xe6\x64\x50\x9e\x9e\x1c\x85\xc7\x0d\x97\x94\xcb\xe1\x0f\x8d\xe3\xb6\x0a\xde\x76\x6f\x52\x7c\x3d\x30\xf0\x9a\xe0\x12\xb6\x0d\x85\x49\x16\x3a\xb2\x68\x99\x84\x9f\xa2\x33\x23\x41\x29\x53\x1a\x3d\xfc\x89\x82\x05\x88\x82\x0c\x4f\x71\x45\x05\xa2\x80\xa3\x61\x0f\x5d\xdf\x48\xe7\xbc\xc7\x79\x79\x86\xc2\xda\x34\x4e\x3a\x78\x8f\xb5\x3d\x3c\x82\x21\xf9\xaa\x3e\xbf\x9b\xc6\x60\x7b\x38\xee\x8f\x2f\xf2\x5f\x9e\x4b\xda\xa9\xf7\x58\x7b\x1f\xbc\xdf\x5f\x9c\xd8\xbb\x4c\x60\xf9\x8f\x51\x78\xdc\x05\xb9\x47\xbe\xbc\x37\xed\x53\x83\xef\xf6\x56\x6c\xc1\x67\xa6\xef\x58\xca\x91\xa3\xbf\x5c\x7f\xd3\x48\x25\x53\x47\x10\x1f\x8a\x21\x2d\xd5\xec\xff\xe4\x6f\xb0\x6c\xb1\x51\x4f\x3c\xcd\x86\x4a\xea\x5f\x4d\x96\xf7\xa8\x01\xb8\xaa\xfd\xc9\x44\x4e\x59\x4e\x74\xb6\x80\xa0\x5d\x03\x16\x0f\x12\xd9\xd1\x97\x36\xdc\x17\xfc\x36\xaf\x27\x26\xc9\xea\xfc\xcf\x93\x3a\x3a\x25\xf3\xce\xbb\xd1\xcb\xbe\xba\x41\x00\x73\x1a\xfc\x20\xa9\x81\x76\x2a\xc9\x51\x05\xcb\x50\x70\x83\xd6\x7b\xd7\xb3\xed\x56\x2f\xd2\x25\x61\xf1\x06\x30\x27\xfb\x08\xd4\xc7\x67\x69\x55\xc0\xaf\x3d\xea\x44\x25\xce\xda\x63\xeb\xc5\xb5\xf2\xad\xaa\xd9\xeb\x9b\x70\xc0\x5e\xf2\xdb\xa1\xc5\xba\x32\x7e\x67\xad\xc6\x13\x10\x3e\xd1\xde\xde\xb7\xa2\x82\xcf\x8c\xfa\x4a\x2e\x0c\xec\xe3\x8d\x93\xc0\x2d\x20\xe2\x9f\xc8\x17\xeb\x57\xf0\x7c\x5c\xeb\x64\xb9\xc6\x8f\x91\xd1\xdf\x97\x06\xc3\x1c\x55\x5c\x10\x53\x6c\xd2\x42\xb0\xcb\x13\xe8\x5b\x98\x65\x83\x20\x9d\xad\xdc\x3a\x03\xd7\x1d\x1a\x18\xce\x8c\x25\x28\xef\xb9\xd7\x34\xf7\x30\xa5\x7e\x42\xd7\xfb\xe4\x51\x67\x2c\x1f\xe0\xcf\x1e\xbf\xd7\x70\x91\xef\xfb\x3a\x34\xa2\x7b\xdb\xcd\x3b\xc9\xf1\xf9\x27\x18\x23\xab\x90\xea\xaa\x39\xc4\x98\x71\x39\xfe\x7c\x28\x2c\xcf\x1a\x4a\x8c\x85\x51\xcf\xa0\x23\x9d\xd3\x58\x99\x9a\xe5\xda\x0f\x61\xea\x8b\x65\xf0\xf2\x88\x6e\x39\xd6\x8d\x65\x4d\x5e\x76\x95\x88\x3f\x62\xa3\xd5\xd4\x34\xfa\xc8\xad\xaf\x0d\x97\x7e\xf7\x35\x63\xcc\x92\x31\xa3\x0c\xfe\x96\xac\x34\x64\x71\xd0\x28\xe6\x4f\xff\x62\xe7\x03\xe6\x86\x07\xf3\x84\x93\x2d\x44\x07\x7b\xce\x71\x37\xb9\xa3\xe9\x53\x8b\x96\x16\xb1\x6b\x87\x07\x47\x02\x92\x9e\x78\x0a\xe8\xc9\xbe\xfe\xb8\x52\x53\x03\x77\x4c\x27\xd5\x69\x20\xcf\x0f\xb2\xc4\x61\xd3\xd1\x7f\x78\x02\x57\x5d\xa9\x86\xc8\x4e\x24\x63\x23\xed\x9b\x0a\x72\x1a\x04\x42\xe5\xe3\xca\x13\xd3\x0c\x71\x8b\x3f\xbe\x9d\xb1\xd5\xb1\x89\x56\x80\x27\x63\xc3\xb5\x38\x72\xde\x28\x1b\x75\x2d\x7f\x29\x37\xd4\x12\x94\x6c\x1f\x1f\x24\xcd\x07\x00\xe2\x29\xcf\x94\xf3\xf3\xf5\xdf\x2b\xc2\xc9\x25\x74\xe3\xee\x7c\xe5\xba\x84\xa4\xce\x43\x68\xa4\xea\xb2\x9e\xcd\x28\x1e\xbf\x5c\xe8\x59\xf6\xa2\x89\x03\xce\x96\x30\x79\x07\x95\x2b\x3d\xd1\xfc\x88\x1e\xdd\xcd\x9e\xd6\xa1\xfd\x5d\xb7\x9c\xa7\x0f\xe9\x2f\x86\x82\x7c\x65\xe6\xd8\xb8\xa6\x6c\x04\x13\xdc\xeb\xd7\x6a\x13\x25\x4f\xf5\xbe\x33\xd1\xcb\xd7\x9d\x7b\xda\x79\x47\x52\xe5\x6e\x22\xc0\xea\xd3\x3b\xb5\x05\xcf\x4c\xc0\x26\x29\x79\x24\x80\x56\xd8\xa4\x2f\x2e\x14\x9d\x31\x05\xef\xf9\xbb\x36\x62\x4c\x90\x68\xa6\xd0\x6c\x38\xf5\x0d\xc5\x68\x0d\x6f\x44\x29\x91\x13\xc6\xe0\xb9\x17\x9d\x55\x10\x01\x47\x80\x63\x56\x36\x3e\xb2\x97\x6e\x3b\x74\x06\xa1\xe7\xea\x9f\xf2\x63\x07\x8a\x4d\x86\x59\xa8\x17\xd9\xfd\xf3\xf8\xd3\xa4\xd9\xa0\x29\x91\x08\xd2\x40\x1f\x73\x94\x5a\x9c\xd1\x1a\xcf\x6d\x7b\x1d\x57\x38\xad\xeb\xa6\x8b\xdf\x8b\x26\x15\x84\xf8\x94\xb5\x18\xd5\x8a\x00\x2f\x74\x80\x02\x6a\xa2\x3e\x0b\xe1\x1d\xb8\xb8\x4e\xf8\xf2\xbd\x05\xb0\x75\x8e\x10\xcd\x37\xd8\x35\xa8\x95\xff\xfa\xaa\xbd\xd0\x79\xf2\x98\x0e\xf1\x76\x12\x0c\x2c\xd9\x0f\xb6\x51\xa0\x50\x7c\x1c\x26\x18\x1a\x36\x92\xa4\x9e\x22\x46\x6a\xd6\x7e\x76\x55\xa5\x5c\xc5\x4c\xa2\x3c\x10\xdf\xe7\x83\xe7\x6d\xc3\x9d\xe9\x2d\x84\x4f\x90\x41\xf7\x79\xcc\x9b\x7e\x57\xbf\x8d\x80\x71\x30\x87\x39\x57\x41\x52\x59\x89\x92\x7e\xe4\xaf\xff\x1a\x5b\xbf\xde\x3e\x6f\x12\x6a\x96\x44\x9b\x2f\x6c\x3f\x59\xff\xa3\x24\xd8\x9f\x3e\x7a\xaa\xad\x36\xaf\x78\x7e\x64\xe3\x2f\x88\xf9\x99\xbc\x9f\xcd\xd3\x2b\xed\xf5\xdd\x3e\x34\x08\x61\x23\x54\x9a\x3c\xb6\x80\xc2\x7d\x04\xb7\x17\x92\x65\x69\x8c\xbb\xb5\xc8\xcd\x2b\x84\x1d\xd6\xff\x32\xe2\x12\x68\x44\x6a\x59\x86\x6c\x48\x70\xba\xbe\x0b\x90\x79\xf9\xeb\xfb\x05\x42\x0d\xa0\xfc\x5c\x3e\x15\x5e\x01\x60\x50\x71\x0a\xf7\x82\x80\x5b\x31\x87\xdb\xd3\x80\x98\x8a\x2c\xcc\xb9\x82\x6f\xaa\x94\x59\x3b\x3b\x8b\x4f\x85\xbf\xb1\xd2\x9e\x11\x48\x3c\xb8\x4c\xb5\x3a\x47\x53\xee\x82\xa5\x07\x8e\x2c\x75\xc3\x6e\x1b\xdc\xa1\x65\x38\xfa\xd6\x10\x3e\x3e\x25\xe6\x96\x5a\xed\xed\x9d\x7a\xee\xf3\x69\x56\x2d\x2b\x8e\x68\xbe\xb9\x3f\xcf\x2e\xd7\x53\x98\xe4\x7a\xd7\x1b\xc4\x64\x69\x76\x69\x65\x1b\x97\x3f\xc2\x0f\x96\x66\x5c\xe2\x9e\xf7\xd2\x9b\xaa\x22\x8b\xe9\xbe\x33\x96\x82\xe8\x22\x49\xc8\x50\x26\x7f\x5f\xa0\x29\xde\xbd\x98\x70\x1f\x5f\x38\xfc\x8e\x79\xcc\x88\xf8\xc1\x8c\x4d\xd8\xf5\xec\x05\x45\x2e\x97\x58\xb6\xf5\x9e\xd3\x76\x89\xd8\x2e\x45\x44\xc3\x2e\x48\xa4\xe5\x7e\xfe\x8b\x1d\x31\xe1\x53\x00\x4f\x75\xd7\xbb\xe4\xfd\xb2\x0d\x53\x62\xcd\xa4\x5b\x6b\x9c\x37\x9f\xc7\x7d\x23\x08\xd0\xe6\xdf\x03\xaa\x23\xbd\xab\x55\x7d\x88\x1e\xdf\x32\xc7\x24\x0c\x98\x61\xf5\x6b\xe9\x92\xb9\xc0\xb4\x91\xcb\x96\x88\xbb\xc3\x53\xae\x3a\x10\xff\x2b\x94\x75\xac\x8a\xc6\x4b\x61\xbc\xca\x27\x95\xe9\x7d\x34\x45\x38\x43\x00\x9d\xc1\x51\xa2\x54\x40\x81\xd4\x89\xda\x42\x01\xc3\x8b\x62\xeb\x8e\x72\x38\x97\xce\xe1\x55\x70\xf4\x13\x5a\x5b\x15\x3a\x17\xc4\x6b\x97\x10\x81\x42\x0c\x4a\xae\xd0\x3c\xa1\xe2\x5a\xc9\x21\xc9\x3b\x7c\xcc\xb4\x35\x2c\x28\xd5\x4a\x23\xea\x3e\xe1\x32\xee\xbb\xda\x06\xe3\xa5\x9d\xa8\xdb\x03\x73\xf7\xbe\xd2\x8b\x53\x9b\x77\xb8\xa5\x1f\xeb\x21\xf3\x42\x30\xa1\xa7\x22\xeb\xee\x5c\xed\xef\xe2\xee\x69\xd0\x46\x71\x20\x97\xd6\x63\x0b\x6d\x0a\xfe\x20\x38\x1e\xba\xb5\xeb\x02\x5f\xb2\x00\x87\x2d\x71\x23\x09\xa6\x7b\x40\x60\xba\x08\xa9\x02\x3f\x52\xfd\x29\x9a\x9f\x8f\xb8\x4c\x14\xf3\xf3\xd5\xe3\xf9\xb9\xd7\x6e\x0c\xa5\xd5\xdf\x1d\x9d\xe6\xe1\x86\xd1\xf3\xda\x08\x48\xe0\x44\x22\x65\x84\x31\x1c\x7e\xf0\x8b\xfe\x61\x7d\x9c\x70\x31\xba\x28\xa7\xb1\xb5\x7a\xd9\x22\x73\x19\x3e\xff\xd5\xa9\x40\xe1\x09\x9d\x3a\x86\xb1\x7d\x2c\x10\xcb\x4e\x0b\xab\x4c\xf8\xcc\x1b\x06\xee\x5b\xb4\x17\x76\x5c\x1c\xce\xa0\x3e\x41\xa5\x8a\x19\x54\x74\xef\xda\xbb\xae\x2c\x70\x02\x39\x8a\x2a\x85\x67\xa2\xba\x78\x49\xda\xbd\x2e\xde\xbc\xaa\x3b\xef\x45\xde\x50\xec\x39\xac\x95\x0b\x87\x8f\x17\xd0\x92\xe9\x3b\x2a\xd0\x07\xf5\x77\xef\xcb\xa1\x75\x19\x71\xef\x2f\xfc\xad\xa3\x3f\x87\x5f\x72\x5f\xdb\x15\x63\x5a\x3f\x91\x89\x3f\xd6\x71\x36\xda\x2d\x99\x0f\x31\x2a\x08\x1f\x37\x8e\x4c\x03\xcb\x3d\xc1\x76\xe5\x76\x51\x47\x52\xe0\xef\xb5\x42\x05\x81\x7d\xf6\x0d\xf4\x9c\xa4\x69\xc0\x1f\x3c\x85\x9f\xae\x7d\xdb\x67\x41\x13\xc3\x3a\x8b\xd6\x29\xb6\x5d\x60\x47\x97\xcb\x78\x0b\x11\xb6\xc4\xaa\x62\x6f\xb3\xc7\xe8\x77\xf7\xcc\x50\xbc\x6f\x6b\xff\xf5\x6b\x9f\x65\x7e\x4a\xc6\x38\x3d\x5e\x0e\x7f\x41\xd9\x14\x77\xc3\x4b\x32\xd4\x83\x5c\x0d\xd3\x4b\x90\xec\xdf\x92\x98\xda\xb9\x0a\x2d\xeb\x4a\xb7\xef\xaf\xc5\x39\x8f\x5a\x61\x52\x09\x0d\x02\x71\xb9\xef\xd1\x8a\x27\x9f\x67\x9b\x7b\x1d\xa5\x44\xd6\x85\x4a\xbe\x15\xe7\xad\xe8\xc9\xb1\xc6\x30\x27\xe2\x4f\x7d\x3e\x54\xf6\x8d\x75\x31\xbd\xe2\x57\xe5\x56\xbd\x4c\x6d\x42\x33\xe4\x49\x73\x34\x6d\xac\x1f\x9d\x87\x37\x91\xb6\xfc\xc4\x7b\xff\x4c\xe6\xa4\x18\x5b\x7e\x56\xc9\x95\xc0\x45\xe5\x1b\x14\x7e\xdf\xc4\x7f\xdb\x40\x4f\x5e\xfc\xa1\xf9\x04\x3c\xcb\x61\xb0\x68\x5e\x7a\xd5\xa8\x55\xfb\xef\x5a\xa2\x93\x5a\x4d\x9b\xda\x3c\x79\x55\xf6\xea\x05\xf4\x1b\x0d\xc2\x01\xc5\x18\x6a\x46\x9e\x88\x9a\x16\x21\x3a\x7d\x05\x48\xd4\x22\x7a\x0b\x72\x8f\xa0\x9f\x9f\x4b\x71\x3c\xb1\x12\x54\x23\x25\x9d\x7e\xd8\x85\xab\x3f\xe3\x61\x31\x29\x3f\x7b\x78\xef\x30\x54\x15\x79\xef\x1e\x7f\x75\x69\xaf\x17\xa7\x29\xcc\x43\x8e\xd7\xcf\x26\x54\xcf\xff\x96\x09\xe5\x26\xd6\x55\xce\x88\x6a\xa3\xa3\x61\x7c\x64\xb7\x91\x7b\x74\x39\x41\x2e\x81\xa3\xa2\xe6\x64\x51\xb8\x0d\x70\xff\x70\x0c\x26\x3e\x27\xbd\x25\x8e\xd6\x45\xa0\x02\x7d\x27\x7d\x5e\x94\x70\xcb\x6c\x6b\x1c\xe8\xc4\xef\x75\x06\xb7\xb6\x7b\x3e\x7a\xce\x78\x38\xa3\x07\x5e\x68\xd0\x29\xa2\x7a\x4b\x35\xaa\x0e\xac\x5f\xa9\x0f\x5e\xbe\x7d\x00\xdf\x38\x13\xe2\x3c\x64\xc6\x5d\x20\x58\xaa\xdb\x16\x65\xaa\xff\xdf\x91\x9d\xa6\xa2\x77\xe6\xdd\x27\x3c\x23\x05\xe9\xa8\x2b\xf2\x8e\x77\x39\xda\xf6\xc8\xfa\x71\xed\x7d\xd4\xc9\xb9\xe8\x19\xe8\xdb\x22\x8e\xaa\x9c\xde\x24\x02\x96\x30\xfc\x7b\x0a\xd6\x16\x00\xb1\x39\x9c\x76\x5b\x2d\xfe\xb7\x07\x0f\xd0\x4b\x40\x7c\x7f\xda\x0a\x19\xb5\xf7\xab\x21\x31\x16\xfe\xb1\xfc\x9e\x2f\x96\xcc\xbd\x94\xc7\xd3\xbc\xf7\xd2\xda\x7b\xbf\xef\xde\x69\xf3\x04\x5d\x74\x0e\x6f\xfe\x7f\xc3\x38\x19\x31\x3a\x84\x24\x98\xac\x01\xf6\xf1\x6e\xda\x89\x90\x5d\x81\x56\x5b\xe1\x31\x75\x79\x2a\xef\x0e\x0f\x3b\xf5\x57\x5d\xdd\xd6\x85\x7c\xc7\x02\xfd\x72\xb1\x0f\x4e\x78\x79\xa1\xda\x7a\x4e\x1f\x93\x53\x07\xb0\x4d\x02\x1e\xd7\xed\x2f\xc9\x8f\xb4\x6e\x40\xe3\x9f\x08\x3c\xde\x62\x0d\x86\x80\x48\x8c\x8e\xd2\xa2\xc3\x3f\x1c\x85\xbb\x0e\x12\x33\x65\xdd\xde\x08\xe2\xf3\x96\x7c\x62\xfb\x7f\x8c\x00\xfd\x28\xb6\x6a\x68\x5b\x6d\x2e\x58\xad\x90\xfa\x6a\x2d\x22\x43\xfb\x71\xdc\x4e\x88\x2e\x2b\x0e\x94\xf8\xbd\x55\xb9\x23\xac\xe9\xdd\x33\xe7\x50\x6d\xe0\x95\xfa\x8e\x71\x53\xcd\xdf\x22\x7e\xac\x3f\x85\xf0\xe9\x93\xce\x60\xb5\x1f\x32\x24\xd7\x41\xd0\x36\xe5\x3f\xa3\x67\xfe\x48\x4e\x99\xe1\x14\x7d\x04\x63\x8f\x89\xb2\xee\x6c\x03\x95\xf5\xc7\xe7\xe7\x57\x8f\x7f\xfb\x37\xac\xf2\xc3\xb2\x50\x2d\x36\xd5\x42\xee\xf4\xfb\xcd\xea\x6b\x79\x97\xe0\xcf\x05\xa5\xa9\xa3\x09\x27\x2d\xfc\xc0\xf9\xde\x65\x7d\x24\x93\x5c\x64\xf5\xa1\x09\x8d\x2b\xcf\xf9\x5a\x8b\x87\x35\x48\xb7\xaa\x95\x75\x37\x03\x2d\xd0\x6c\xf1\x7f\x8b\x8c\xc4\xde\x27\xfd\x3e\x7e\x15\x7f\x6b\xb6\x5f\x4a\x41\x0c\xd2\x59\xa7\x6c\xd1\x47\x80\xc6\x87\xf0\xdf\x15\x3f\x5f\x81\x18\xdb\x60\x7a\xe5\x7c\x5b\x4c\x7c\x0b\x1c\x0e\x99\x27\x1d\x65\x48\xe9\x72\xea\xe4\x62\x0c\xa8\x37\x42\x54\xc4\x1b\x1f\x7a\x4a\x19\x36\xd2\xa1\xce\xfa\x38\x5a\x7b\x3e\x70\x87\xa2\xe1\x38\x3a\xf3\xde\x8d\x30\x7d\xbf\x17\x67\xa8\xee\x0d\x3e\xb5\xa9\x78\xb5\x84\xf4\x3e\xcb\x4e\x1d\x84\xf0\x3a\x8d\xec\x0a\xbe\xb1\xa8\xfe\x5b\x23\x67\xab\xfb\xe5\xc8\x8b\x44\x96\x1d\x6f\xbd\x21\x0a\x05\xe7\x87\x42\xcd\xee\xbe\xfb\x47\x34\x05\x19\x73\xf1\xe2\x17\x25\xba\xe6\x14\x02\xf1\xc3\x34\x67\xb6\xa7\x39\x4a\xe6\x53\xe7\x68\xab\x07\x45\xe6\x53\xcc\x90\x2f\x47\xdd\x35\xac\xb2\x2c\xae\x6b\x11\xc7\xab\x5f\x18\xb6\x7d\x55\x3e\xc1\xaf\xfd\xbf\x5a\xff\x7d\xa8\x00\xf4\x60\x93\x17\x8f\xfd\x72\x33\xc4\x99\x14\x7d\x38\x08\xf5\x82\x89\x8f\xf9\x67\xab\x43\x06\x94\x8a\xac\x33\x5f\x55\xfd\x2d\xc6\x56\xbc\x38\xbe\x76\x6e\x6d\x91\xf5\xa9\x7a\x52\xfe\x87\xdf\xf2\x66\x95\xab\x88\x26\xb8\xcf\x6e\xef\xed\x57\x47\xad\xef\xcb\xf2\x34\x16\x62\xe6\x2e\x9a\xb1\x4f\xc9\xf5\x52\xbc\x75\x68\xe2\x20\xb3\xf6\xff\x38\xda\xec\x4a\xec\x5c\x92\x55\x1b\x5f\x21\xfd\x7c\x09\x5f\x14\x4c\xe9\xda\xd0\x9c\xb1\x3e\x00\x0e\x21\xd2\x92\x4b\xa3\x70\xfe\x24\xef\xe8\x79\xb4\xd3\xcc\x76\x9e\x3d\x20\x89\x6c\x13\xc0\x9e\x00\xdf\x45\xa1\x80\x42\xc7\x65\x5b\x4f\xa7\x42\xf2\xb7\xf4\x12\xb3\x2f\xf1\x34\x06\x12\x08\x3a\xfb\x12\x5f\x06\x37\x27\x28\xc5\x3f\x5e\x9c\x8d\xb3\x63\x91\x43\x12\x09\xc3\xfd\x93\x85\x45\x5f\x7d\x12\xe9\x81\x63\x48\xf6\xec\xff\x1b\x6f\xce\x76\xf9\xa4\x86\x02\x53\x72\x44\xc1\xbc\xf7\x3a\xa6\xe1\xb8\x3a\x47\xdf\x16\x38\xcd\x2b\xc6\x4f\x7d\xa3\xe6\x27\xe2\x39\xcb\x8a\xa9\x70\x8f\x84\x0d\x0a\x48\x8b\xec\xe6\x5a\x5b\xa5\xbd\x5c\xeb\xa7\x39\x78\x40\x25\x8e\x7d\xdf\x2d\x55\xd7\x40\x18\x80\xb4\xbb\x48\xf7\x15\x39\x04\xe2\x86\xec\x84\x7d\x3d\x42\x7a\xf0\xfa\xd3\x6c\x8f\xaf\xee\xc0\x97\x53\x8f\x36\x5e\x64\x6c\x4e\xd2\x30\x3d\x31\xc0\x49\x35\x01\x01\x42\xa7\x26\xe3\xe5\x77\xf5\x79\xfa\x5f\xda\xab\xea\x5b\x12\xba\xbc\x25\x57\x77\x2f\xd1\x6f\x10\x26\x2a\x29\x37\x97\xb6\x8d\x41\xf8\xa2\x37\x06\x65\xe2\x3a\x8e\xe7\x45\xa8\x6d\x1a\xa7\x65\x53\x88\x35\x32\x3e\x43\xbd\xfd\x2e\x42\x7b\x88\xcd\x03\x41\xc4\xcd\x8f\x70\x68\x0f\x2a\xbc\x37\x7a\x7d\x51\xab\xdf\xe2\xac\xf8\xea\x2a\xbf\x2b\xa4\x58\xde\x7e\x00\x7c\xfc\xcb\x3d\xbe\x3d\x9c\xb4\x77\x37\x7c\xe9\xd0\x68\x34\x7b\xb8\x7e\x37\xf7\xad\xcf\x45\xf8\xd3\x03\xd3\x43\xc6\x35\x50\x45\x6f\xd1\x1c\xac\x48\x16\x4c\xfd\x7f\xef\x4c\x89\xd5\xd7\x4e\x51\x47\x21\xfa\x91\xd9\xb2\xa5\xea\x1e\x69\x05\xf8\x4e\xef\x3b\x46\xd5\x18\x0d\x33\xdd\x6f\x46\x2f\x0a\xa1\x4a\x87\xd4\x21\xa6\xb5\x98\x1f\x9d\xbc\x02\xad\x9a\xc5\x7d\x8a\x5b\xac\xe2\x2a\x3c\x56\xbc\xb7\x57\xe9\xd7\xae\x08\x38\xe7\xe6\x9d\xf9\x70\xc1\xe4\xed\x82\x12\x7c\x55\xd7\xa1\xe0\xb0\x58\xf3\x71\xa4\xd1\x03\xf5\x73\xbb\xf3\xd1\x3c\xc4\x21\xc6\xbc\x3b\x77\x7e\x84\x87\x55\xbe\xdd\x15\xbb\x7b\xc8\xb7\xd1\x45\x0d\xf6\x27\x38\xe7\x51\xdd\x26\xbb\x86\x58\x8a\x55\x72\x98\xef\x79\xb3\x3d\x8f\x5c\xdf\x56\xc7\xb9\x5e\xda\x7f\xdb\x5b\xf1\x49\xcb\x61\x58\x97\x0b\x01\x54\xff\x99\x5c\xa9\xf7\x8a\xdd\xda\x66\xf1\xb0\x97\xec\x35\x79\x1b\x02\xef\xf9\x42\x5d\x25\x01\x42\xe0\x6f\x3a\x6f\x60\x6e\x86\x15\x99\x8e\x22\x53\x45\x72\x44\x4e\x51\x7c\x35\xaf\x20\x12\x02\x4e\x4e\x6c\x9f\x37\x6c\x8a\x2c\x41\x28\x3e\xd3\xf5\xc4\x54\x28\x4b\xd9\x39\x08\xdb\x2c\xf4\x07\x52\x21\x25\xee\x11\x73\xb7\xa6\x4e\x9f\xf2\xc3\xda\x8d\xdb\x33\xf8\x6f\xe5\xf7\x56\x86\x67\x4e\x22\xbd\x1b\xfa\xfe\xf2\xa9\xff\xf4\x3f\x39\x63\x45\x01\xb5\x6d\x4b\x20\x1f\xa3\xd0\x3e\x3e\x0a\x29\x4b\x8a\xb1\x39\x9c\x78\x68\xe6\x91\xbd\x47\xeb\x7f\x9b\x5a\xcf\xef\x2e\x00\x45\x6a\x16\x18\x1d\x1d\x1a\xab\xbd\x00\xb5\x79\xce\x4f\x49\x83\x2f\x8a\x40\xb1\x21\xd1\x26\xde\xe3\x4a\xee\x0e\xfd\xd6\x99\x55\x69\xf2\x2a\x18\x58\xc0\x7d\xd5\x2c\x00\x43\x1f\xf8\x45\x4f\x8c\xda\x39\x90\x4f\xc5\x51\x54\xa0\x4b\x11\x20\xbc\x30\xbb\xc3\x46\x54\x6c\x53\x5d\xd9\x05\x2e\x53\xa7\x97\x8d\x76\xa5\xe9\xed\x23\x2c\xda\xca\x57\x3f\x4c\xac\x35\x81\x26\x02\x53\xd8\x5f\x64\x03\x90\x42\xb7\xf6\x2b\xcf\x55\x7e\xff\x6a\x3d\x3e\x33\xe6\xbd\x51\xa0\x88\xbc\x79\x37\x6e\x2c\x33\x28\x56\x06\xa4\x3b\xbe\x0f\xc7\x1c\x80\x77\x7f\x72\xfc\x3c\x7a\x3e\xd1\x13\x7a\x01\xe5\x23\x7d\x3c\xf8\x39\xe4\xec\xbd\xcb\x0b\x28\x42\x3f\xdd\xe1\xf1\xbf\x40\x53\x9a\x6d\x5b\xb7\x03\xae\xff\xf5\x83\x7d\xdb\xea\xd3\x09\x43\x9c\x17\x88\xe1\x25\xdc\xf8\x88\xb1\x53\x3c\x52\x83\xa9\x6c\x76\x84\x8a\x93\x7f\x1f\x1b\x4b\x7b\x73\xd6\x8b\x73\xb1\x47\x64\xd5\xce\x75\x18\x63\x1c\x87\xc2\xfd\x33\x11\x67\x83\x42\x5b\x02\xb4\x0f\xb7\x3b\x4f\xa5\xe9\x3f\xb3\xd4\x30\x7b\xb9\x71\x5d\xba\xc2\x3f\x28\x40\x1a\x26\x45\xc8\xe1\xe4\x86\x58\x0d\xb6\x64\xd4\x37\xfe\x50\x52\x97\xad\xbe\xe8\x35\xa7\xb9\x6d\xa1\xb4\xa1\x01\x8b\xf2\x26\xaf\x32\x08\xa5\x1a\xa7\xd0\x48\xac\x8f\x43\xa1\x4e\x6b\x51\x9a\x05\xe4\x80\xaa\x00\x3d\xfe\xf4\x1f\x3a\xa1\x28\xe4\x6d\xa3\xbe\xe2\x5f\x0f\x52\x3b\x3a\xbe\x64\x96\xe6\x63\x6b\x4c\x67\x2a\x7f\x56\xca\xf7\x89\x91\xb6\x24\x1a\x3d\x5b\xef\xee\x94\xf8\xd1\xff\x9d\x3f\xfd\x25\xac\xc6\x33\x40\xf1\x29\x1e\x9f\x0c\x58\x4b\x5d\x4a\x69\xfb\x0c\xc5\xca\x53\xd2\xe4\x0f\x97\xd3\x55\xaf\xb5\xed\x58\x13\x5d\x24\xd1\xd1\xa0\x19\x7e\x43\x3e\x90\x46\xad\x61\x73\xa5\x7e\x1c\x6a\x1e\x40\x98\x99\x17\x60\x27\x8b\xb0\xec\xe7\xb9\x47\xa1\xb4\xf9\x9f\x00\x9a\xda\xd7\xc8\xe3\x96\x87\xea\x5e\x17\xe5\x21\x81\x5b\xd4\xa7\xa9\x0c\x18\x4f\x35\x85\x6b\x81\x69\xf9\x4e\x24\x7a\xe6\xc8\x9b\x7e\x11\x0c\x51\x88\x0c\xfc\x7c\x55\xaf\xe9\x6f\x0f\x50\x77\x44\x36\x5f\xef\x73\xb0\x3c\x6e\x70\xcc\xf3\x3e\xdf\x43\xa1\xc2\xef\xf3\x9d\x95\x67\xae\x81\x71\xcd\x66\x89\x60\xcb\xef\xbf\x0d\x31\xa8\x7a\x2b\xcc\xa8\x6c\xae\xb7\xf0\xde\x67\x4b\x71\xe5\x24\x7d\xf4\xc0\xf0\xa1\xb6\x97\x27\xb0\xd0\x00\x5f\x69\xd9\x13\xdc\x5f\xa4\xec\x45\x98\xc6\xab\xb8\xf7\x05\x64\x36\x30\xc8\x2d\x38\xeb\x45\x9a\xfd\xc8\x99\x5d\x62\xbf\x6f\x7a\xdf\x0d\x36\xb2\x7c\x43\xd7\x3b\xe0\x4d\xf7\xc9\xbf\x29\x10\xa1\xc6\x8c\x70\x93\xf5\x38\xdc\xb2\x9b\x34\x4b\x83\xc3\xb2\x8f\x65\x78\xf1\xf7\x55\x3d\x9b\xe1\x3d\x2c\xfa\xa7\xd9\x7d\xf4\x73\x6a\x5b\x1d\xd6\xfb\xda\xc4\x75\x51\x49\x93\x0a\xe2\x75\xe0\xeb\xb3\x16\xfc\x87\xfc\x91\xef\xf5\x68\x59\xf9\xac\x7c\x62\x10\x4e\x27\xd8\xc8\xc7\x51\x78\x7c\xd9\x34\x20\xd0\x9c\xf7\xe5\xeb\x76\xa0\xb5\x18\xf7\x6f\xf3\xd6\x78\xcd\x11\xa7\x45\xb5\xbc\x76\x33\xa4\xb6\x7d\xef\x51\x74\xbc\x47\x02\x43\x31\x94\xb0\x55\xe4\xf4\x42\x82\x06\x25\x03\xaf\x39\x29\x20\x50\xf7\x69\x91\xd8\xf7\x51\x20\x9b\xc1\xd7\xc5\x6a\x7e\x0b\xd8\xdb\x45\x08\x4d\x0f\xc8\x63\xaf\xc3\xda\x4d\xcc\x96\x93\xdf\x9e\x22\x6e\x93\x1a\x4e\x4b\x1a\xb6\x24\x34\xc1\x27\xc7\x30\x8b\x94\xbe\xbc\x5a\x58\x5e\x69\x92\xdf\x57\xc7\x78\x4c\xd8\xdc\xfd\x47\xa2\xf8\xd3\x3a\x3f\xfb\x79\x74\x38\x60\x03\xc0\xe5\x6b\x78\xa5\x50\x9e\x1f\xda\x6b\x0b\xde\x33\x02\xc4\x21\xc0\xd1\x4b\x30\xc1\xbb\xfd\x61\x4b\x22\x15\x0c\x64\x4a\x60\x48\x7e\xf6\xfb\x2a\x61\x78\xbb\x7e\x1d\xe2\x0b\x36\xf0\xb3\xee\xa1\x1c\x10\x19\xf8\xed\xbd\x61\x98\x9a\x8f\xbf\x1a\x12\xfd\x19\x51\x61\x40\xc5\x99\xd1\x79\x3d\xbf\x21\x3e\x27\x93\xb7\xf7\x1d\x58\x20\x88\x3c\xb2\x8a\x5b\x7b\xe7\x9e\xba\x13\x8a\x25\x1e\x44\xef\x4c\x45\xfc\x6e\x7b\xf8\xa9\xc4\xfc\x38\x0e\xd9\x04\x68\x32\xf9\x8a\x84\x72\xa4\x37\x3f\xe7\x55\xee\xe9\x6e\xbf\x88\xa9\x57\x14\x5b\x1c\xdf\xee\xb1\x12\x05\x86\x69\xf7\xbd\xd7\x3f\x90\x76\x38\xa4\x50\xde\x4f\xad\x19\xf8\x22\xfb\xcd\xe1\x9d\xcd\x21\xc6\xca\xfe\x21\x33\xcc\x80\xfc\x20\x9d\x40\xd0\x73\xb8\x88\x7c\x35\xcf\x44\x01\x61\x45\x97\xc7\x9e\x44\x82\x18\x37\xa7\x6b\x5a\xbc\x7c\xd4\x55\x0b\xf2\x7a\xb9\xec\x76\x25\x62\x45\x24\x20\x7a\xe7\x1d\xe6\x5f\x7f\x9f\x8f\xf8\x04\x8c\xd9\x00\x8e\x3b\x35\x28\x65\xa2\xb2\x6c\xe8\x68\xb3\xf1\xad\x36\x70\x10\x32\x0d\x92\xb4\x46\xc7\xa0\xb1\xd7\xee\x77\x9f\x78\x67\x91\xb0\x08\x11\xb4\x98\x21\xab\x1c\xbf\x24\xf9\x03\x39\xaf\xf1\xe4\x10\x93\xef\x78\x3d\x7c\x3f\xa0\xf1\x4a\x67\x89\x7e\x94\x9b\x41\xb6\x68\xf8\xaa\xc2\x2a\xf7\x62\xdf\x69\x87\xdc\x17\x1f\x98\x58\x6a\xc4\xba\xfa\x3b\x94\x67\x2a\xbf\x86\xfa\x7a\x32\x2c\x7e\x48\xd7\xa7\x49\xa4\x79\x7a\x36\xa1\x5a\x3a\xbf\xc2\x62\x76\x53\xaf\xcc\x07\xe6\xa0\x1f\xee\x45\x64\x33\x12\xf3\x6e\x46\x9c\x71\x10\xda\xdc\x70\xd9\xd3\x42\xb0\xdd\xa9\xd9\xe9\xfe\x2a\xc4\x2d\x9c\x8c\x7e\xa5\xe7\x64\xff\x6f\x6e\x1e\x20\xb4\xb5\x4f\x55\xc1\x0e\x6b\x22\x95\xa9\x9e\x23\x4d\xb0\x11\x74\x7e\x3c\xeb\x78\x2b\x40\x19\xfb\xce\xd0\xe6\x7e\x37\x9c\xc1\xd7\x2b\xd2\xf9\xfc\xc5\x5e\xc3\xca\x36\xf3\xe2\x43\xd1\xcf\x85\x5a\xe8\x09\x72\xf8\xa2\xb2\xc4\xaf\x48\x3c\x2b\x05\xb7\x2e\xa6\xa3\x4a\x92\x58\xfc\x6a\xb7\x28\xeb\x9c\x1b\x1d\xc5\x40\xb1\x00\x6b\x95\x34\xd7\x8c\x8f\x19\x94\x68\xf0\x5d\x7b\x89\x7e\x46\x51\x96\x4b\xfa\xbb\x55\x2f\x5b\x08\x8b\x6a\x89\xdd\x31\xe3\x36\x9d\xff\x68\x95\x25\xed\x05\x70\x6f\x5b\x30\x3d\x03\x5c\x87\x72\x46\x27\xd6\x89\x35\x69\x7d\x95\x92\x3c\x73\x64\xa8\x62\xe1\x0d\xc6\x6b\x34\xfe\xee\xc5\x3f\xbd\x75\x54\xb0\x56\x5f\xbd\x4e\x33\xbf\x82\xc0\x86\xb1\x76\x9a\x55\xdb\x42\xae\xed\xf7\xad\xbe\x80\xd7\x6e\x26\x9a\x6a\xd4\xb7\x56\x9e\xe0\x33\x63\x27\xe3\xb2\x67\x20\xc1\x43\xea\x07\xbf\x84\xc8\x9f\x4b\xc1\xfb\xb3\xc1\x3b\xcf\x81\x35\x0f\xe0\x1b\xbf\xa1\x31\x7f\xf9\xec\xa0\xf1\x1a\x92\xa0\x16\xe0\x80\x76\x22\xc3\x32\x02\x89\x08\xa0\x34\x56\x76\x94\x60\x14\x2d\x62\x98\x38\x1f\xdf\x61\x53\x39\xbd\xab\xdc\xb5\x67\xcd\xe1\x58\xcf\x0a\xb2\x6d\xf1\xf5\x78\x9d\x58\xa6\xb6\x9f\x32\x0a\x55\x67\x1f\xbb\xba\x1e\x68\x35\x14\x49\x06\x2b\x5c\x62\xa5\x1e\x6a\xf6\x42\x15\xea\x9f\x5e\x54\x5e\xf6\xd0\x60\x59\xa1\x13\x3c\x8f\xe0\x6e\x14\x78\x2d\x0e\xf7\x58\x0f\xd2\x4a\xa9\x2a\xbf\x2a\xdd\xf5\xbe\x6a\x56\x73\x98\x0d\xcd\x3b\x84\x09\x20\xe0\x77\x9d\x17\x22\x83\x39\x09\xf9\x0f\x66\x49\xcf\x08\x92\xf1\x8f\x4e\x3d\x5a\xb1\x7f\x85\x8c\x8b\x95\x7b\x04\x55\x57\xc4\xa4\x6a\xb9\x49\xa4\x0c\x92\x19\x6f\x23\x27\x18\x4c\xe7\xf9\xd1\x8c\x48\xd3\x06\x82\x84\x20\x35\xca\x86\x6d\xe9\x1f\x0c\x54\x80\x79\xbf\xf7\x6f\xa2\x6f\xf9\x48\x94\x47\xf1\x64\xca\xfc\xa0\x09\x2a\xdb\x6a\x4b\xb6\x01\x4c\x8b\x70\xbe\xc9\x12\x74\x62\xf1\x75\x45\x5f\xd2\x62\xdc\x7e\x1c\xa9\xd1\xe8\x6f\x57\xfb\xb1\xff\xcd\x43\x42\x1f\xde\x62\xeb\x27\x4c\xb5\x8b\x40\xb0\xb3\xf6\xd4\xf4\xd5\x90\x84\x16\x42\x81\x0f\x70\x87\xdf\x1e\x8e\xbe\xe7\x74\xa2\x24\x46\xbf\x55\x93\x1e\x54\x6f\x51\x62\x15\x2c\x47\xf5\x41\x8b\xe9\x49\x76\xa2\x35\xbe\xe4\xc7\x55\x6a\xd1\xf7\x6a\x38\xab\x91\x83\x8a\x77\xaa\x15\xc6\x75\x1a\x3e\x0e\x3b\x9f\x8e\x67\x4a\xc2\xbb\x1b\xd9\xa7\x7f\x98\x06\x51\xec\x67\x7b\x6a\x64\xaa\x54\xf3\xaa\xcd\x97\x76\x45\x82\xdc\xa3\x41\x82\x86\xda\x31\xc9\xf3\xba\xe1\x0e\x26\x9f\x2c\xfe\x13\x90\x58\x8f\x95\x19\x55\xbf\x76\x27\xf0\x8f\x39\x84\x09\xf9\x6b\x3d\x82\x60\x8b\xbc\x5a\x0c\x3f\xfa\xd2\xcc\xe3\xba\x6e\xdd\x68\x3d\xcf\x23\xcd\x4c\x2c\xb8\x02\x05\x22\x7c\x8a\x02\x90\xc5\xbf\x6c\x7d\xaf\xff\x6b\x15\x89\xc9\x6c\x5e\x0e\xcd\x1d\x03\xef\xee\x82\x17\xda\xb8\xe6\xcd\x37\x06\x4f\x71\xc2\x7b\x4d\x4c\x98\xf4\x59\x65\x04\xf6\xbd\xd6\x40\x46\x84\x22\x9a\x71\x1f\x24\xe3\xed\x9d\x64\xa6\x12\x04\x1c\x8b\xf1\x7a\x41\x81\xc1\xc6\x54\x05\x2d\x9f\xe5\x31\x39\x4f\xfb\x6d\x48\x26\xb3\xb5\x78\xa7\x02\x6c\x12\x70\x68\xec\x9c\x68\x9b\x28\xae\x9b\x46\x2c\x83\xb5\x52\x49\x6d\x53\x93\xe0\x4f\xe9\xc5\xae\x09\x8c\xd2\x36\x81\x37\x21\x1f\xcd\xe8\x46\x91\x7e\x29\xb3\x37\x37\xfa\x41\xbf\x23\x4e\xc9\x33\x43\x42\xee\xa3\x74\x13\x98\xbe\x51\xed\x16\x02\xef\x20\x96\x86\x54\xa0\x81\xfb\x9a\x9b\x0b\xfd\x6e\xb4\xd5\x7e\x81\x47\x7d\xb5\xb0\x44\xc3\x58\xed\x4f\x76\x76\x7d\x03\x77\xb9\x31\xe3\x8b\x7d\xc1\xcb\x90\xdf\xb0\x10\xf1\x78\xd5\xfb\x9a\x09\x1e\xbf\x3f\xcc\x10\x9f\x7b\x3a\xf5\x0c\xd1\x36\x60\x1a\x6d\xf5\x5b\x3d\x75\x65\x35\x90\x17\x15\xa5\x59\x16\xf8\x3f\x24\x7e\x37\x62\x74\x9a\xb2\x52\x52\xba\xfa\x82\x1f\x4a\x0f\xf7\x8f\xa9\x19\x0c\x9e\x30\x9e\x79\x45\x09\x62\x4a\xd8\x1d\xa4\x6e\xc6\xe3\xf3\x99\x4a\x18\xfa\xca\xa6\x5d\xf5\xd0\xad\x2d\x38\x35\x95\xfc\x92\xd2\xba\x0a\x91\xf4\xbb\xae\x0a\x9e\x30\xfb\x95\x92\x97\x19\x43\x46\xe8\x3d\x2c\x7c\x17\x84\x97\xdf\x1e\x69\xf7\x5a\xa3\x28\x7f\xf7\x43\xe6\x8f\x03\x72\xe6\xf9\x3b\xc0\x49\x82\xc8\x74\x74\x2c\xbd\xe7\x83\x6f\x72\x58\xee\x2e\xa0\x98\x3a\x00\x65\xda\x59\xac\xd6\xf7\x69\x49\x51\xbc\xe0\xd1\x92\xe1\x39\x5e\x3d\x67\x26\xc6\x0a\xc3\x2c\x3f\x73\x68\x96\x70\x01\x8f\x6e\xa0\x33\x9f\xd7\xcf\x0f\x0a\xcd\x65\xd8\x7a\xdb\x76\xf1\xfb\x77\xff\xfe\x6e\x3c\xef\x4b\x5d\xe6\xc0\x35\x5e\xa6\x8b\x02\x7f\xdc\xbd\xb3\x76\xdd\x50\xe0\xff\xa9\xf9\xd3\x2d\x4c\x51\x0b\x96\x5d\xaa\x12\x5b\x71\x22\xeb\x94\xe3\x52\x15\x4d\xd4\xae\xea\x98\x75\x35\xfe\x79\x10\xf6\x58\x84\x55\x2f\xf7\xa7\x2a\x7f\xe5\x12\x59\x8e\x77\x9f\x43\xa5\xf6\xdd\xdd\xd7\xbc\x1f\xe2\x4b\xbe\x36\x86\x56\x35\x9b\x6e\x1e\xd9\xb4\xf7\x93\x9a\xdb\x08\x75\xd4\x7b\x22\xeb\x2c\x30\xac\x9e\x32\xf5\x3c\xfc\x7e\x19\xa8\x58\xb4\xfa\x64\x3a\x05\x75\xdf\x25\x3c\xf9\xb1\x76\x05\xa3\x9d\x76\x1f\xa6\x6b\xe4\x52\xba\x80\xc7\x32\x6a\x5b\x3e\xe6\x58\xdc\xcc\x33\x6d\x5a\x5d\xfd\xbc\x88\x4f\x81\x10\x96\x12\xc5\x6a\x37\xc0\x27\xc2\x53\x29\x12\xd3\xd4\x30\x4e\x32\x96\x93\x76\x38\xfb\xbf\xed\x13\xfe\xe9\x61\xf9\xa1\x0f\x8b\xf0\x43\xaa\x99\x94\x1a\xc9\xcd\x34\xa2\x9e\xe8\xea\x67\xbd\xa8\x90\xcb\xf9\xb0\xf8\x41\x19\x84\xa7\x8c\x4b\xa5\x16\xf5\x4d\x28\x8d\xf4\x77\x80\xf2\x08\x45\x83\xe7\xa5\x8e\xb4\x74\x63\xc6\x3d\x10\x28\x31\x1e\x70\xf6\x71\x21\x63\xd2\x7a\xa9\x45\x89\xf7\xf9\xf9\x70\xb2\xaf\xa7\x46\x71\x26\x24\x7d\x7d\xe2\x0b\x08\x11\x85\xb2\xaa\x2e\x35\x56\x83\xb5\xe4\x6a\xdf\xf5\xed\x35\x11\x15\x34\xfa\xf1\x70\xef\x51\xd3\x5c\x34\xad\x95\x2b\x6d\x78\x77\x35\x98\x03\xc9\x04\x53\x35\x36\x21\xf1\x86\xfe\x2e\x01\xd2\x44\xaa\x58\xdb\x04\x93\x9b\xe1\xe0\x1d\x0f\xc4\x40\x86\xe6\xea\x1a\xaa\x5f\xa1\xeb\x3c\x11\x9f\xc1\xbf\x71\x48\xd1\x7a\x66\x5c\xaf\x7f\x19\xab\x70\x40\xcf\x0f\xe8\xcd\x65\x57\x10\xb7\xa3\x2e\x39\x1f\x27\x82\x1e\xa7\x81\x1c\xc5\x9b\x9f\xde\x9c\x03\x23\x94\x23\x1b\x77\xd1\xe0\x40\x4b\x6d\x20\xd4\xb0\x0b\x87\x48\xb2\x0b\x72\x04\x25\xfb\xb0\x1d\x1c\xf7\x34\xf2\x70\xa7\x49\xe1\x75\xa1\x8f\xdc\xb1\xd6\xec\x88\x25\xb8\xb5\xb6\x15\xef\xe7\x9f\x6c\xd7\xc0\xca\x55\xbc\xdd\xe0\x84\xcc\xf3\xd6\x9b\x47\x68\xe0\xfb\x35\xe7\x37\x35\x69\xdd\x8b\x4f\x87\xfb\xb7\xd6\x2c\xe3\x7c\xe8\x1e\xd0\x35\x83\xa9\xb0\x3f\x6b\x50\xb9\x6b\x8c\x76\x67\xfe\x68\xc4\xff\x0a\x9b\x4f\xa9\xe9\x9c\x6c\x58\xd1\x49\x3d\xbc\x91\x15\x53\xd8\xe2\xf9\x04\x12\xc3\x03\x6e\x66\xed\x2d\xe5\xe4\x41\xa9\xaf\xa7\xbf\x6b\x6c\x45\xc0\xfb\x11\x23\xd7\x35\xbf\x4c\xf4\xad\xd9\x97\xa0\xeb\xc2\x77\x3b\x4e\x21\xaa\x71\x18\xcb\x1e\x85\xbb\xcf\x59\x19\x0b\x7d\xec\x68\x3b\x6b\x63\x2f\x55\x5b\x4a\xa0\x01\x11\xf1\x8b\xd4\x36\xe9\x44\x2e\xff\xd1\xc1\x28\x59\xb7\x5f\x8f\x5e\x62\x71\xd1\x60\x9a\x5d\xa0\xef\xf0\xda\xb8\x80\x84\x38\x7e\x7b\xa6\xe3\x13\x12\x3f\xc5\x02\x4e\xc0\x98\xb2\xc7\xfa\x26\x3e\x7f\xf5\x50\x0f\x4d\x7d\x86\xaf\xcf\xa4\x56\xbf\x9f\x26\x71\x6a\x24\x61\x49\x05\x4d\x1c\xb0\x3f\xb8\xf9\xdc\x57\x6f\xfd\x96\x2f\x97\x18\xa3\xf4\xe1\x97\x03\xed\x32\xc9\x2a\x32\x6a\xc6\x14\x6b\xb5\x91\x0f\xee\xcd\xed\xbc\xfc\xad\x5f\xe2\xb2\x9f\x78\x0a\x62\x68\xd4\xe1\x1a\x2e\x13\x72\x39\x9f\xce\xab\x99\x37\x5a\xc7\xcd\x77\x26\x83\x07\xe5\x9f\x5f\x95\x81\xe9\xc7\xe3\x7b\x52\x17\x9b\xcb\xb8\x49\x1e\xef\xe3\x8b\x98\xc3\xf5\x6c\x97\x6f\x5c\x6a\xa7\xd4\xe5\x21\x1a\x3f\xd5\xf5\x5f\xf1\x72\xc3\xfb\x88\xb1\x62\x32\x53\xab\x09\x6a\x2b\x59\x32\x87\xfc\x74\x78\x83\x5b\x3c\xdf\xc2\x67\x61\xe8\xca\x7f\x43\xfa\xc3\x82\xd1\x47\xf7\x7e\xd6\x5c\x77\xf1\x14\xe6\x3d\xca\x55\xd2\x08\x96\x18\x38\x97\xcc\xf9\xbe\xaa\xbf\x70\x57\x97\xfe\x65\xf0\x2c\x7b\x5d\xef\xf1\x43\xb1\x56\x04\x8d\xa7\xc8\x7c\xcf\x97\xac\xbf\x5a\x47\xa3\x96\xbd\x31\x9f\xd0\xb7\xe1\xf9\xaf\xfa\x35\xcd\x2f\x27\xeb\xab\x86\x2d\xaf\xfd\xa7\x3d\x0f\x35\x62\xc8\x5f\x0a\xb2\x02\x09\x46\x54\x5e\x69\x8e\x59\x43\x2d\x8f\x68\xe9\xfc\xab\x37\x78\x3e\xd8\xea\x3e\xab\x41\x01\x72\xce\x7d\x2a\xf4\x28\x80\xa9\x8d\x35\xe9\x54\x21\xd4\xa9\x2d\x8b\x7e\x48\x25\xfd\xb2\x03\x89\x09\x86\xc8\xf9\x1e\xef\xb2\x61\x98\xef\x0c\xd7\x61\x05\x6f\x79\xca\xa9\x7e\x50\xbf\x9e\xac\x5b\xee\xf8\x00\xe5\x27\x0d\x78\xa3\xfe\x86\x16\xbd\x4a\xfb\x65\x1b\x60\xfe\xf5\xc6\x01\xd8\xb3\xdf\xa8\xf4\x26\x7d\xaa\x7f\xd9\xac\x59\x99\xe9\x84\x4c\xb3\x60\xed\x0d\x08\x10\x18\x7b\xbc\x9e\x60\xfa\x48\x04\x7a\x97\x61\x48\x74\xc4\x1e\x02\x13\xbe\xe3\xb8\x0b\xd9\x27\xe4\xfb\x61\x78\xe2\x95\x39\x39\xb9\x39\xe1\x24\x4f\x5e\xf0\x5f\xad\xa5\xfc\x9a\x65\xd2\x38\x9e\x56\x48\x2a\x8e\x2f\xf8\xfd\x18\x06\xef\x20\x92\x51\x6f\xf6\x75\xf5\x90\x0c\x60\xba\x42\xd8\x17\x40\x56\x5b\x5b\x68\x49\x08\x63\xcc\xec\x4f\x1c\x9e\x91\xc2\xf0\x41\x19\x31\x38\x43\x6d\x64\xeb\x35\xd5\x4b\x87\x85\xe9\xec\xe7\x1c\x7d\x54\x7e\x04\xa3\x49\x94\x7c\x47\xb2\xea\x41\x8c\x13\x34\xbb\x0b\x12\xd5\xf8\xb4\x62\xe3\x89\xae\xfc\x1e\xc8\x63\x23\xd3\x0f\x37\xcf\xdd\x39\x50\x0a\x42\x7e\x98\x16\xd1\xd0\x8a\xf8\xbe\x6c\x85\x2f\xf2\xe6\xf3\xed\xa8\xec\xbf\xb1\x6d\x5b\x75\xf2\x5f\xd1\x59\x9f\x55\xc2\x7f\xbf\x9d\xab\x7f\x7f\xf2\x6a\xe9\xf0\xc7\xfb\x7e\xa6\x56\xf4\x8e\x02\x2a\xcc\x87\xa4\xf3\x8e\xd4\xfa\x6c\x20\xf4\x13\xb2\x29\x64\x72\x7d\xb7\x5c\xd7\xa6\xbe\xdc\xc3\x14\xa6\x3a\x9e\x3f\x4a\x89\x4a\x81\xf3\x2b\x21\x80\x2d\x44\xbd\x3c\x0b\x1c\x7e\x7f\x3c\x7c\xa9\xe1\xed\xb0\x5f\x89\x7b\x98\x49\xae\x01\x25\x66\x13\xe6\x29\x70\xf4\xc7\x85\xd5\x7d\xff\x3d\x78\xeb\x6b\xee\x94\x65\x27\x23\xbd\xb2\xf9\x16\x9c\x70\xf5\xec\x80\xcc\x03\xfc\x51\x43\x5e\x5a\x34\x42\x49\xe4\xd6\xe0\x21\x6e\xda\xe0\x58\x41\x53\xeb\x30\xa6\xbc\xf5\x57\xef\xcf\x3f\xb0\xd7\xe4\x59\x70\x65\x54\x89\xdc\xf4\x28\x30\xdf\x81\x09\x40\x7d\xe4\x8f\xa5\xc2\x7e\x3b\xe9\x71\xb0\x9d\x29\xa5\x88\x32\x47\x5a\xe5\x3d\x14\xed\xf4\x39\x71\x07\x52\x95\x25\x08\x2e\xbb\xab\x43\x86\x84\x02\xb6\x3e\xe3\x9d\x66\x81\xce\xff\xb6\xee\x0b\x49\xdf\x9b\x34\x95\xb5\xaa\x48\xaa\x10\xba\x39\xff\x2e\x72\xca\x7f\xe5\x24\xd1\x0f\x48\x63\x3c\x0d\xd8\x9f\x2c\x87\x7c\xd8\xcf\x4c\xc2\x0c\xdd\x0a\x1e\x2f\xc3\x95\x1e\x89\x26\x77\x3f\x06\x66\xb7\x8d\x95\x3b\x10\x19\xdb\x2e\xe8\x05\x0c\x02\xdf\xd3\xec\x6c\x77\x2d\xfb\x31\x0a\x9d\xae\x18\xff\xd6\x80\x9b\xe1\x43\x02\x90\x79\x1a\xa9\x1d\x18\x6f\xed\xcd\x8f\xa4\x5f\x48\x9b\x1e\xb4\xba\xa6\xcc\x2c\x6d\xf2\x03\xe5\x20\x2a\xbc\xe0\xd2\xea\xf1\x5c\x9d\xc0\x44\xbe\xe0\x9a\xcc\xd0\xb5\xa7\x0f\x9d\xdb\xa6\x06\x63\xae\xde\x4b\x25\x80\xb5\x73\xed\x22\xcf\x99\x0f\xcf\xbf\xa7\x0a\x7f\xf0\x1c\x8c\x75\xf2\xf5\x0c\x17\x36\xb4\x8a\x43\xf9\xbe\xac\x87\x7b\x12\x3b\xb0\x13\x46\xe3\xe8\x9f\x75\x12\x9e\x56\x00\x74\x26\xa3\xe6\x1f\xb8\xc7\xc3\xe3\xf8\x3b\xd9\xef\xb2\x40\x11\x8e\xbe\xfb\xf8\x1c\xaf\xef\xdf\xdd\x1d\xd6\x3b\x19\xb0\x6a\x0b\xda\x7e\x90\xc1\x00\xe1\x61\x67\xb7\x19\xb6\x03\x03\x9d\x3a\x53\x88\xaf\xed\x63\x7d\x0f\x2e\x06\x7b\xbf\xd0\xf4\x32\xe9\x75\xa8\x0c\x5e\x66\xc2\xc7\x91\x47\xcf\x9a\xbc\xd1\x54\x8f\x49\x00\xaf\x4c\x37\x8c\xfa\xcb\xa9\xa4\xf2\x80\x0b\x42\x1d\x4d\xe1\xca\xe7\xf0\xd2\xe8\x27\x2f\x7e\xb7\xef\x0f\x8c\x24\xf6\x7d\xbc\x1e\xb4\x2f\x44\x41\x5f\x7f\xcb\xa8\x15\x61\xf1\xf6\x66\xe3\x7b\xc8\x17\x9a\x81\x1c\x6d\x75\xb1\xac\x27\xe9\x11\xa5\x2e\xee\x1f\x78\x29\x4f\xf4\x50\x67\x6f\x8f\x78\xea\x01\xb3\x43\xff\x5c\xed\x97\x83\xb2\x49\x19\x4b\x7d\xa7\x99\x9b\xa4\x7f\x8d\xec\x48\xde\x6f\xf1\x2d\x47\x5e\x2c\xd3\x2c\xba\x4a\xec\xeb\x65\xf1\x3d\x7b\xe6\x2a\x61\x92\x74\xb3\xd7\xfc\x76\x2c\x87\xd0\x35\xa4\x05\x3d\x9a\x6f\x11\xef\x77\xbd\xc5\x5d\x77\xfa\xe2\x85\x17\xe3\x5e\x45\xbe\x0d\x48\x8a\xac\xf7\x7a\xcb\x42\xad\x40\x31\xae\xf7\xff\xd3\x4a\xad\xf7\x1e\xa0\x5c\x6a\xb3\x23\x58\xf5\x65\x96\x88\x5c\xf6\x5f\xe6\xe2\x74\x7d\x7f\xf3\xb8\xcb\x01\x3b\xca\xa9\x5b\x30\x0a\xde\xbf\x66\xc8\xd5\xe0\x1b\xd3\xdd\x87\xdb\x8a\x5d\x27\xbe\xb0\xf4\x3c\x35\x55\x56\x67\xbf\x0d\x66\xdf\xe5\xa7\x34\x4c\x3b\xd7\x8c\xb3\xc2\xec\xb7\x42\xa2\xa8\xe3\x92\xaa\xc4\x0f\x05\x6f\x0d\x42\xc9\x5c\xde\x76\x39\x55\x32\x2e\x11\x58\x8b\xbd\xe9\x1c\xeb\xb7\x88\xd8\x04\xca\x1c\xee\xc6\xa2\x50\x81\x43\x21\x0e\xf5\x03\xf1\x3d\x60\x9e\xb9\x50\xdd\x3b\x13\x79\xde\xe9\xe7\xb9\xde\x3d\x19\x68\x7d\x1e\xd9\xf8\x07\xbe\x9a\x43\x02\xeb\x14\x3f\x98\x5d\x9c\x5f\xef\xd5\xfc\xbb\xff\xa7\xd9\xc0\x8b\x91\xba\x8c\xca\x23\xaa\x87\x1d\xa1\x16\x54\x23\x3b\x06\xc2\xe2\x91\x33\x3c\x5a\xd8\xcb\x4b\x7c\x92\x9e\x54\x25\xb1\xda\x0b\x45\x82\x62\x08\x92\xed\xcb\x73\xea\xd9\xc7\xe9\xeb\xea\x3f\x4f\xb7\x14\xcb\x0d\xb6\xec\x37\xdb\xa1\x15\x6d\x59\x7d\x85\x5a\xf3\x9b\x85\xae\x34\xd4\x85\xb1\x9a\xf7\xa0\x62\xd0\xce\xa3\x5a\x4f\x14\x83\xc7\x24\x87\xcc\x2a\x56\x71\x37\x0c\x63\x8c\x4d\x13\x75\x97\xf6\x40\x40\xc8\x43\x63\x02\x7e\x66\x2c\xb4\x83\x2c\x74\xaa\x7d\x2b\xae\x9a\xb1\x0a\x0d\x86\x2d\x23\x7b\xae\x31\x8e\xd3\xe8\xdf\x7b\x5a\x32\x6f\x3b\x10\x1c\xaf\x27\x59\xb3\xe9\xca\xe6\xf1\x33\x07\x30\x2b\xf9\x2c\x10\xc0\x64\x76\x75\xe0\x9c\x41\x97\xbc\xbb\x22\x51\x80\x03\x29\xe9\x2c\x77\x77\x22\x7e\x4b\xf5\x6f\x8f\x4d\xfb\x57\x73\x6b\xc6\xd8\xa8\x93\x8d\xdc\x70\x10\x7d\xfd\x1e\xa3\x89\xfa\xeb\x40\xb8\x8d\x1d\x90\x86\x79\x3f\xd0\xc4\x82\xed\x67\x57\xa8\x99\x3b\xa6\x17\x4e\x8a\x45\x4f\x42\x45\x88\x1e\x8e\xd7\x2a\x8e\xb5\xe8\xc8\xe7\xdf\x7d\x58\xd5\x1d\x13\x93\xfa\xd7\xbe\x72\x98\x62\x68\x6a\x60\x2f\xdd\xcc\xf7\x0b\x49\xe2\x99\x6f\xac\x9f\xd1\x08\xd2\x64\xdb\x58\xb9\x11\x73\x7d\x8e\xa7\x1e\x5b\x9b\x6f\x5e\x54\xb4\x0d\xd4\x37\x7d\x99\xa1\xda\x7e\xab\x24\xfe\x40\xb4\x1f\xaf\xb6\x97\xc7\x5d\xfc\xd0\x9e\x36\xaf\x76\x8f\x6f\xa3\x29\x04\xb5\xb1\x7c\x0e\x2d\xdb\x05\x11\x30\xbc\x30\x1b\xd5\x8c\x2d\xd2\x8d\xd7\x7d\x57\xdf\xdd\xc4\x7e\x17\xfa\xaf\x06\x78\x54\xad\x26\xf5\x4a\xb1\x56\x7d\xdb\xd9\x43\x2f\x99\x53\x86\xa5\xca\x28\xc8\x7b\x3f\x5e\x72\x59\x0c\x36\xeb\xe3\xc3\xe4\x90\xd1\x27\xf7\xfa\xd4\x4a\x77\x76\xfa\x58\x92\x08\xbb\x5b\x96\xfa\x2d\xfa\xab\x26\xca\xfd\xf9\x2f\xcf\xbf\x5b\x13\x0d\x41\xd0\x2a\xb1\xd1\x25\x7a\xf7\x16\xea\xa3\x7b\x3c\x65\xd8\x39\xf2\x25\x1c\xad\xd7\xe3\x4b\x7c\x93\x9a\x4a\xf7\x28\xc9\xc5\xaa\x74\xb4\xee\xd8\xbb\xd7\x28\x54\x27\xf9\x96\x24\x89\xc9\x65\x0b\x86\x38\x76\x90\xb8\xf2\x5c\x61\x80\xb6\x0c\xf4\x7e\x95\x16\x91\x26\xe1\x8b\x3c\x5c\x94\xc6\xee\x8e\xc7\x77\xc7\x4f\x03\xae\x05\x81\xc6\xf1\xd3\x08\xcf\x66\xd1\x1c\x2f\x7e\x03\xd1\xfa\x05\x0e\xf0\xba\x8e\x21\x36\x45\x59\xfa\xab\xea\xfe\x1a\xe2\x78\x6f\xe2\xdf\xc8\x4d\xcc\xee\xc1\x33\x99\x29\x71\x2c\x36\x69\x18\xbb\x15\x39\x2c\xcc\xbb\xca\x3b\x5a\x7b\x30\xa1\x6a\x9a\xd1\x7a\xe8\xe7\x86\x7e\x12\x9c\xe3\x16\x53\x4e\x9c\x69\x27\xfd\x0c\x35\x9b\x4f\x46\xb4\x56\x39\x02\x5a\x71\x62\x20\x03\x50\xb4\xe9\x91\xca\x7d\x95\x02\x66\xb7\x0e\x6f\xe0\xd4\x87\x34\xd7\x0e\x65\xf8\x62\x82\xe0\x65\x04\x4f\x39\x46\xdd\x05\xd1\x19\x92\xc1\xcd\xc9\x4c\x9a\xfd\x03\x51\x14\x6a\xcd\xa9\x80\xc7\x1c\x82\xb0\xc5\xcc\xf2\xc5\xbc\x76\xf0\xe8\x48\xaf\xee\x50\x5e\x28\xcd\x92\x6d\x4b\xd2\x7f\xf0\x1e\x23\x07\x23\xc4\xa9\x85\x63\xc0\x90\x7d\x5e\x20\xdb\x1e\x24\xde\x45\xae\x1a\x59\xaa\x62\xab\x83\x37\x2e\xcb\xb2\x2d\x77\xef\xf7\x6c\x9a\xd9\x0b\x02\x22\x33\x54\xee\x9d\x0f\x1b\xd9\x80\x39\x28\x84\x92\x31\x37\x36\x3c\x68\x86\x99\x5f\x4f\xb8\xd8\x70\xda\x65\x4f\x48\x7b\x11\x58\x1a\x11\xcf\x87\xfa\xfc\x21\x77\xbd\x21\x4a\xbd\x25\xd5\x1d\xd6\xae\x22\x46\x15\xcc\x71\x66\x74\x5c\x79\x9c\x83\x35\xbc\xa7\x39\xfb\xec\x99\xa6\x9e\xae\x77\x63\x4b\xab\x02\x7a\x23\x56\x35\x6e\xa8\x8c\xef\xb6\x02\x1d\xd1\x0c\x50\x0d\x4d\xb3\xd9\xef\xfd\x2c\x11\xfe\xe1\x96\x94\xc2\xd7\x2b\x9e\xac\xd8\x84\xd2\x2c\x24\x70\x25\xaa\xa0\xc8\x83\x00\x52\x38\x35\xa4\x8b\x3c\x21\x89\x6b\x86\x96\xda\xfa\xcb\x26\x99\xd5\x1a\x1a\x2a\x35\x33\xb1\xbf\x0f\x70\x7e\x1f\x7c\xcb\x5b\xbe\x7d\xd7\xdf\xe8\x17\x7e\xff\xe8\x29\x6b\x94\x60\x8d\xa6\xa6\x69\x70\xb1\x60\x68\x41\x46\x79\x50\x9e\xf3\x68\xd4\x3f\xea\x29\x0d\xed\x24\x8c\x98\x38\x37\x8f\x5d\x79\x49\xea\xd9\x9e\x8e\xfc\xf8\xde\x17\x5a\x49\xc5\x99\x63\x1b\x9b\xaa\x4f\xfa\x27\x93\x7a\xde\x5a\xb5\xa4\xab\x3b\x47\x21\xb2\x65\xc6\xf3\xbb\x60\x54\xfb\xb3\xb1\x02\xdf\xc1\x4f\x6a\x09\x39\x23\x81\x55\x49\xfd\x32\xd9\x58\x5f\x08\x7e\x7d\x7f\x82\x61\x8a\x35\xc9\x20\x71\xa6\x36\x67\x64\x4a\x7d\x9d\x06\x6b\xa8\x3e\xe0\xbb\x15\xec\x0e\x7c\x91\x50\x92\x8c\x3e\x73\x10\x9c\x16\x26\x4e\x31\x23\xb5\x4d\xbd\x01\x9d\x1f\x8e\xfb\xb1\xe1\x4f\xf9\x8e\xd5\x6a\x74\x3a\x3a\xf3\x71\x2d\xba\x3e\xc5\xbe\xab\xe3\x43\x65\x70\x0c\x8f\x20\xa5\x74\x17\xfa\x91\x5c\xb1\x5d\xe9\x5d\x6f\x9f\x75\x57\xb2\xf5\x66\x1f\xa1\x4c\x0a\xf1\x1a\x6f\xcd\x9d\xb2\xc3\x6f\x06\xfd\x74\xe3\x58\xbe\xfd\xf3\x62\x63\xb7\x7c\xf1\x08\xd4\xa5\x7a\x1f\x8e\x8b\xd1\xbb\x43\x83\x15\x53\x6b\x8d\x7a\xfc\x8c\x28\x7d\xe5\x9e\xf0\x9c\x46\xb9\x82\xe0\xc9\x35\xd9\xef\x2b\x86\x1f\xe1\x05\xc3\x8e\x64\x12\x23\xba\x78\x8f\xef\x2c\x4d\xfe\x58\x2e\xeb\xf6\x94\xea\x7e\xba\xbb\x3d\x3c\x7b\x03\x8f\x66\x08\x76\x5d\x3a\x5b\xb1\xfb\x5e\x92\x31\x07\xa8\x00\x6d\x6c\xf4\x36\xba\x53\xf4\x5c\x7f\x5c\x50\x72\x0e\x2e\xf0\xb7\xa0\xc8\x54\xbd\xb3\x28\xa9\x7f\xec\x69\x3f\x41\xfe\x40\x85\x91\x1b\x17\x98\x6b\x58\x05\x9e\x90\x19\xbe\x3a\x57\x79\x26\xd3\x1c\x15\x1e\xf9\xd2\x2b\x24\xec\x77\x67\x58\x6f\x99\xb7\x72\x47\x80\x1b\x5e\xd1\x1d\xd2\xf2\xe4\xd4\xe4\xe1\xf2\x54\x9e\x2d\xa7\x1d\x0c\xcc\x3f\x37\xf8\x17\x31\x33\x8f\x2d\xb0\xa1\x90\x5f\xa0\x37\xf2\xd7\xd6\xef\x78\xbd\x3e\x2d\x91\xc3\xa7\x16\x03\x6e\x09\xa9\x5e\xbc\x5a\x7a\xc2\xbe\x27\xd9\x20\xe8\x27\x45\xc5\xfa\x47\xaf\x98\xe0\xe5\x58\x5a\xa4\x3d\x77\xc3\xc7\xc9\x08\xca\x3a\x43\xca\x40\xf4\xdd\xf5\x20\x5a\xf9\x41\xb1\x01\xcf\xc2\x70\xc1\x93\x77\x4f\x93\x04\x9b\xd0\x38\x39\x34\x71\xdd\xb9\x11\x8b\xfd\xce\x68\x3e\x29\x92\x55\x14\x1e\xd5\x8f\x47\xd1\x1f\x0f\xe8\x8e\x31\xfa\x09\xed\x74\x64\x9a\x78\x40\xe3\x41\xcf\x5a\x77\xe3\xe4\xfb\xd7\x10\x05\xbe\xf6\x98\x0d\xbc\x3f\x49\x79\xe9\x2e\xe5\x7b\xc4\x58\xb4\x26\x1d\xed\x64\xd5\xe3\xc3\xe9\x53\x7b\x2f\xdf\x0a\x4f\x05\x67\x92\x52\x57\xa6\x8d\x12\x6b\x81\xfe\x08\x24\x7b\xb9\xc1\x06\x6f\x9e\xcf\x67\x05\xe6\x57\x47\x0e\xcc\x23\x21\x7c\x7f\xe2\x97\x05\xcf\x9a\xad\xc4\x27\x35\x31\xf0\x7b\x9b\xe2\xb8\x49\x08\x43\x1c\x54\xbf\x40\xa3\xda\xcf\xc6\x3b\x1b\xca\x40\xe9\x3b\xd8\x30\x25\x31\xe0\x2c\x17\x05\x47\xb1\xfa\xda\x79\xc8\x5f\x30\xa7\xf7\xd2\x1e\x8d\xcc\x5f\xc7\x55\xb9\x1c\x69\x84\x2f\x23\x22\x81\x92\xee\x98\x99\xcd\xe5\x2c\x84\x3f\x79\x8f\xae\xe4\xed\x8c\xac\xf7\x09\x9f\x0f\xe1\x82\x4d\x90\x93\x78\x02\xeb\x7d\x37\xf9\x2b\xf6\xe6\x52\x9c\x83\x0b\x13\x80\xd1\x33\x1d\x21\xd9\x13\x57\xde\x62\x27\x60\x73\x2a\xfc\xf7\x7c\x8e\x8e\xa7\x3c\x5e\xa1\x3a\x14\xaa\x6c\x33\x0e\x41\x79\x9f\xc0\x7c\xae\x65\x85\xb8\x64\x60\xad\x5a\x73\x40\x0d\xe1\xfc\x66\xe9\xf1\x13\x97\x80\x8e\x66\x3c\x51\x05\x45\xef\x6c\x19\xc9\x00\xb0\x6c\x58\x0f\x26\xd2\x28\x77\xe3\x52\x3e\x08\xb1\x15\xf4\x50\x1c\x89\xa5\x0a\x96\x63\x9e\xb8\x9c\xc2\x97\x81\x17\x2b\xae\x3d\x57\xf8\x43\x2f\xd8\xa9\x6b\xfb\xd3\xe8\x47\x6a\x99\x08\x00\x93\xe2\x95\xcd\x85\x21\x92\xe4\x49\xb1\xb4\xa6\x4e\x13\x8d\x76\xfb\xcf\x52\x7e\x25\xdd\x12\xfc\x79\xd7\x5f\x26\x28\x06\x7f\x66\x89\x64\x01\xdb\x6b\xe5\x84\x21\xde\xab\x42\x52\x10\x95\xbd\xbb\xe0\xf0\x2a\x09\x02\xc3\xd0\x34\xbd\x93\x29\x04\x9e\x67\x4d\xd5\x1f\xcb\xff\xa0\x52\x47\x57\x16\x05\xec\x0e\x47\x73\xf0\x96\x32\xdf\xf7\xef\x06\xe4\xea\xd3\x71\x80\x11\x13\x7f\xb4\x88\x4c\x92\x3b\xa2\x8f\xa5\x0b\xeb\x5d\xeb\x8f\x5e\x41\xdf\x7d\xb4\x86\x12\x67\x97\x3c\x0e\x12\x7f\xe6\x5d\xa0\x2d\x97\xf7\xef\x2d\x99\xdd\xf5\x6b\x53\xba\x7a\xa9\x1e\x95\x19\x74\xb1\x30\x3d\xfa\xf5\x3f\x3c\x47\x71\x3d\x79\xa4\x6f\xc0\xce\x36\x18\x16\xae\xee\x07\x7f\x75\xc8\xc2\xa7\x7c\x8a\xfc\xcc\xa1\x26\xbc\x46\xd3\x86\x0c\x6c\x02\x79\xbf\x64\x59\x5e\xb2\xf2\xf4\x73\x07\x06\x82\x41\x0c\x5f\x34\x41\xe5\x93\x73\x43\xc3\x2d\x0c\xe8\xf1\x9c\x3f\xdc\x0b\xe8\x2f\x09\x39\x1b\xc7\xb9\xfb\x84\xa0\xc1\x88\x5d\x3f\xf5\x05\xde\xdc\x66\x6c\xb3\x43\xc0\xd7\xdf\xe7\xb1\xa8\xed\x03\xf2\x50\x2b\x7b\x16\x22\xb9\xf6\x03\xb8\x1b\x58\xf9\xd0\x0f\xef\xe2\x9a\x92\x85\x17\xb2\x9f\xa1\x47\xe5\x15\xee\x22\xa8\xc3\xfb\xf9\xd5\x95\x38\x68\x41\xc4\xb5\x24\x89\xc2\xf8\xe0\x0c\xde\xa5\xd3\xb1\x4d\xe8\xcf\xad\x58\x31\xdf\x24\x41\xd4\xdf\xff\xa1\x7e\x14\x4a\x04\xd3\x7d\x90\xfc\xe2\x22\x4e\x5d\xc2\x69\x16\x6d\x34\x97\x11\x82\xe7\x9e\x6c\x04\x6d\x62\x02\x30\x09\xcf\x8d\x17\x49\x21\xd4\xc4\x43\xee\x57\x2b\xbf\x5f\x52\x45\x35\xa7\x7c\xdf\xfb\x65\xb0\xc8\x02\xed\xfc\x14\xfa\x32\x7b\xb0\xc3\xe1\x38\xf6\xa1\xe7\x91\xf8\x4c\x03\x55\x76\xdc\xcf\x8a\x99\xc1\xe8\x0a\x3f\x0a\x58\xd7\xc3\xe2\x65\x5f\xdb\xd9\x09\xf8\xe2\x03\x61\xa3\xf9\x4a\xd7\xd0\xd8\x3a\x6e\x93\x12\x2e\xaa\xb1\xa6\x54\x03\x6c\x9b\xae\x01\xa3\xe5\x89\x11\x6e\x3e\xba\x75\x54\x6b\x92\xdb\x37\x63\x20\x86\xd9\xfd\x94\xa2\x2c\x72\xa2\x17\x08\xbf\x8a\x7b\xed\xf5\xdd\xc3\xa7\x13\x6b\x2e\xb1\xe1\x64\xa1\xd1\x72\x02\x15\xce\xbc\xc8\x34\x0d\xb4\x42\x55\xb7\x97\x2d\x76\x95\x83\x25\x0f\x0d\x01\x02\x48\xaa\xd8\x11\xcd\x17\xb8\xab\xa3\x79\xd0\x7b\x17\x4b\xcc\x91\x8a\x86\x7c\x9e\x3c\x35\xcb\xd2\x1c\x42\xda\x16\x25\xc6\xb3\xed\x86\x7b\xf0\x50\x18\x3e\xae\x23\xd4\xda\x1d\x3a\x6d\xb9\xaa\x46\xa5\xbb\xa2\x85\xbc\x68\x1a\x37\xbe\x5f\x45\xdf\x5e\x2e\xc1\xee\x69\x01\x9b\x92\x60\x12\x15\xb1\x47\x59\x51\x04\xe1\x49\xea\x7d\x45\xaf\xae\x0d\x78\x18\xce\xe1\x39\x93\x3b\x7a\x9f\xe7\x79\x2b\xa0\x24\xc2\x31\x09\xd1\xd1\x25\xf4\xd9\x7c\x6c\x9d\x35\xf4\x9d\xeb\x7d\x1a\x26\xb6\x02\xc6\x9e\xc8\x05\xc7\x6d\xff\x22\xe7\xb2\x99\x67\x8b\x3d\x61\xa0\xb1\x30\x0a\x66\xdd\xf8\x58\xb6\x18\x76\x61\x16\xbb\x96\x93\xe4\xbf\x17\x90\xd3\x68\x62\xe2\x35\x0c\x17\x38\xcd\x76\xa1\x99\x91\x84\xc2\x9f\x49\x9a\x2e\xeb\x02\xf0\x0f\x0a\xcc\x91\x0e\xda\xc5\x65\x20\x82\xa6\xa9\x23\x59\x4f\x32\xd3\xb6\xd9\x92\xdd\xf5\xeb\x09\x07\x74\xd8\x01\x8e\xe3\xad\xf4\x09\x84\xf2\xce\x31\x6a\x9c\xc6\x8c\x25\xa1\x9c\x05\xfc\xe8\x19\xf3\x4b\x91\xd6\xfb\x78\x79\xae\xd5\x19\x5d\x7a\x85\xe6\x43\x68\xda\xf9\xf5\x07\x33\x99\x00\xdf\x60\xc7\x67\x8f\xe9\x5b\x6a\xf2\x23\x78\xca\x3c\x30\x8a\x2b\x10\xf8\xb8\xc8\x87\xbf\x09\x1f\x5f\x0a\xbd\x0e\x73\x5a\x66\x4d\xf5\x8c\x83\xf2\x40\xdd\x72\x82\x34\xd3\x7a\xbe\xf8\x58\xcd\x34\x11\x9d\x94\x4d\xfb\x4e\x2f\x1a\xdf\x81\x60\x50\x84\x36\x41\x52\x8e\xd7\x53\x56\xd4\x45\x6b\x0e\xb4\xe1\x8b\x15\xee\xaf\x73\x99\x69\xc1\x34\xba\xde\x42\x98\xa5\x60\x83\x05\xcf\xb6\x2e\xc4\x83\x67\x20\x3d\x0b\x01\x3b\xfd\x1b\xbf\xf3\x16\x8d\xfe\xf9\x22\x48\x66\x7b\x6f\x2b\x8c\x63\x31\x05\xd1\xef\x99\x9a\x95\x25\x36\xf9\x1d\xe8\x13\xa1\x66\xfa\x1d\x00\xe4\x9b\x48\x5f\xbf\xe0\xa4\x93\xf0\x32\x35\x76\x22\x29\x32\x33\xf0\x3c\xba\xf2\x18\xe0\x50\xdb\xe1\xdb\x41\xae\x61\x4b\xea\x01\xbc\x20\x14\x9a\xf4\xf8\x74\xbe\xa1\x2c\xdd\x8e\xc6\x00\x6e\x61\xc6\x27\xa5\x86\x08\x0a\x60\x0f\xde\x0f\xc3\xb2\x1d\xdf\x43\x5f\x44\xcf\x77\x90\x30\x0d\x1a\xe1\xf9\xcd\xff\xd5\x8b\xd8\xf7\x62\x7e\x90\xcc\x98\x6e\x48\xdc\xaf\x43\x77\x10\x80\xef\xfb\xae\xa3\x61\xd8\x91\x9a\xe4\xd0\x2c\xf1\x0a\x93\x83\xa0\x03\xda\xe0\xa5\xde\x58\xac\x18\xe3\xeb\x22\x0e\x3b\x95\x36\xb8\xae\xc8\x04\x62\x32\xdd\x78\xbf\x4f\x8a\x29\x06\x21\x18\x99\x80\x38\xc8\x88\x85\x74\xc4\x75\x21\x80\x46\x27\xa3\x6d\xec\x0c\x5e\xec\xf9\x25\x66\x47\x01\x0a\xf0\xac\xdc\x73\x08\x27\x53\x60\xe0\xa3\x08\xf1\x89\xc4\x0f\x96\x69\xc0\xc8\xbe\xf7\x8f\xfd\x7a\xd8\xc1\xd4\x56\x7f\x75\xae\x09\x3d\x91\xe4\x00\xa7\x70\x66\xea\xaa\xda\x78\xaf\x5f\x08\x31\x6b\x0a\x6b\x70\xbb\xa7\x5e\xbc\x82\xf1\xb2\x50\x38\x59\x30\x32\x63\x56\xa9\x0e\xaf\x01\xa9\xb6\x96\xfd\x39\xc3\xb5\x34\xaa\xe6\xeb\x15\xff\x86\x8d\x84\x58\x18\x59\x0e\x07\x3b\x6c\xac\xc3\xb6\x7f\x72\xe8\x3c\x9b\xa1\x7a\xcb\x8f\xb6\x2e\x63\x0b\x0a\x22\x02\x47\xdc\xcc\x09\x81\x07\x70\xa5\xd4\x9f\xb1\x84\xa5\xce\x3c\x34\xf2\xfd\x12\xee\xbd\xef\x89\x9c\x61\x97\x0a\x9d\x8f\xc5\xf4\x21\x00\xbb\x73\xa3\x59\x32\x9e\xe1\x15\xb7\x2a\xe1\x65\x40\x84\x0c\x10\x3f\x37\x21\xce\x05\x38\xcb\x6e\x2e\xe2\x88\x93\x14\x9a\x21\x7a\x5d\x38\x4d\x9b\x1b\x0c\x2d\x29\x6b\xc2\x5b\x34\xc9\x4b\x7f\x14\x94\xd2\xd0\x3e\xa7\xee\xf5\x4b\x21\x67\x0c\xce\xb7\x2c\xc3\x67\x9a\x0f\xf2\x0b\x50\x40\xb0\xb0\x24\xc3\x90\x18\x8e\x93\xc4\x91\x42\x9f\x65\x61\x91\xd8\x3a\xc4\x02\xc4\x3b\x05\x51\xcc\xb6\x5d\x17\x82\xe0\xe2\x5d\xd3\x6b\x16\x70\x59\x5b\x88\xc9\x7d\x77\x86\x2d\xcd\x6f\x7f\xfd\x00\x0e\x32\x76\x16\xf4\x5b\x06\x4b\x8d\x82\x2d\x81\x50\x1d\xb1\xda\x3d\xe1\xde\x10\x69\xd2\x66\x56\x18\xba\xe0\x62\x3f\x2e\x59\x17\x80\x7e\x34\xeb\xa0\xc3\x60\x10\xb7\x04\x3b\x05\x8b\xc8\xa1\x68\x12\xb0\x2b\x88\xaf\xeb\x64\xdb\x65\x0b\xdd\x6c\xc3\x67\xf0\x2c\xe2\x79\x61\x17\x2f\x95\x23\x75\xce\x9b\x5a\x42\x07\x2b\xc3\xa5\x0f\x23\x13\x18\x1f\x98\xa0\x93\x69\x63\x59\x9c\x25\xd2\x54\xe3\x2b\x5f\x4b\x16\x08\x38\xd9\x5f\xb1\x16\x10\xf7\xf8\x5a\xef\xc8\xb8\x7e\xe9\x41\xe3\xf4\x55\x2f\x52\x7d\x1c\x24\x61\x31\xdb\xd0\x83\x51\x94\x29\xa3\xfe\x16\xeb\xba\xc3\xc5\xf8\xe0\x45\x20\xad\xc4\x9b\x9b\x98\x9c\x31\xe1\x16\x4d\xbc\xd3\xa4\x8e\xbe\x39\x36\x20\xa3\x96\x48\xa9\xd8\xa2\x6f\x1c\x55\xa7\x34\x5d\x3e\xbe\x8e\xfc\xea\xb8\xc6\x91\x3f\x95\x67\x1c\xb2\x5c\x56\x36\x65\x2b\x13\x16\x89\xfa\xd4\xd9\x5b\x31\x48\x01\xee\x59\xdd\x3b\x20\x40\xf6\x14\x8a\xa6\xd1\x38\x74\xe1\x6c\x9e\xb3\x28\xfa\x66\x59\xca\x41\x48\x83\x5b\x23\x07\x29\x77\x38\x5b\x8f\xfb\xec\x4a\x82\x2f\x94\xe1\xe9\xee\x30\x1f\x08\x0d\x6f\xe1\xba\xc1\xc0\x43\x38\x66\xdb\xc7\x20\x6f\x43\xbc\x01\x22\xa9\x77\x23\x9a\xd9\x65\xdd\x6c\x65\xe6\xc3\x67\x00\x97\xdb\x04\x92\x85\xee\x04\x62\xe3\x05\x59\x33\x00\xd1\x60\x63\x04\x0f\x0a\xea\x6f\x8a\x4f\x43\x7b\x12\x2c\x0c\xa9\x7a\x51\x6c\x8c\xd4\x5d\x30\x19\x19\x25\x90\x05\x40\x07\x0f\x59\x91\x57\x9d\x18\xa3\x20\xa6\x19\x11\x06\x00\xd7\x4b\x9e\x05\xa5\xa9\x0d\xa2\x9d\x3a\x27\xad\xca\x8c\xf8\x9d\xe9\x41\x6e\xac\x62\xf8\x6e\x4f\x34\xab\xb6\xc1\xee\x72\xf7\xda\xc2\x6d\x83\xf2\x3e\x33\xe1\x0b\xe2\x68\x90\x6b\x5d\x17\x28\x7a\x46\xdf\x75\xf2\x2c\xcb\xd2\x09\x23\x02\xc5\xc6\xc0\x2c\x7a\x24\xf1\x39\x77\x3b\xfa\x02\xf9\x27\x55\x5b\xbf\xad\x57\x9e\x34\x39\x6f\x03\x4c\x4f\x39\x96\x45\x61\xd6\x28\x6d\x27\x47\x7d\xf5\x69\x53\x0c\xb0\x51\xf3\xd5\x00\x8b\xb7\x6d\xf8\x84\xc0\x05\x54\x97\x8b\x40\x5e\x92\xb5\x8b\x34\xbd\xe1\x11\x5c\x8a\x9c\xcb\x11\x24\x5c\x26\x09\x4d\x90\x34\x39\x80\x61\xa9\x57\xc8\xb3\x9a\xdb\x3f\x53\xcf\x4f\x5d\x67\xd7\x20\x60\xd8\xb0\x34\xaf\xfd\xf9\x92\x5e\x2c\xfe\x72\x08\xe0\x0c\x14\x59\xee\x8f\xa0\x95\x5c\xb9\xb5\x8f\x6b\xaf\xd0\xe3\x82\x0e\x66\x20\xa8\xe3\x81\xf5\x3c\x2d\x0a\xd6\x00\x00\x06\x2e\x24\xfc\xdc\x63\x93\x7a\x0d\x24\xcd\x5c\x71\x0b\x54\xce\x2b\x6b\xc6\xd7\xf1\xcb\xa5\x7c\x85\xd8\x67\x5a\x1f\x06\x60\xb6\x75\x33\xc3\xae\x3b\x00\x61\xe0\x94\xa2\x30\x19\x4d\x83\x01\xbe\x95\x0b\x94\xe1\x61\xd8\x37\x68\xb9\x2e\xee\x7c\xce\xb0\xf4\xa5\x24\x1f\x3f\x91\xe2\x2d\x31\x4f\x87\x61\x58\xfc\xe4\x4e\x22\x20\xcd\xe1\xb1\x71\xc0\x97\x92\x8e\x01\xaf\xf7\x67\xdd\x98\xd9\x5f\xc6\xf3\xca\x69\xdc\x81\x20\xc6\x5c\x3f\x3d\xb4\xf9\x1b\x4d\x3a\x40\x9d\x09\xdd\x2b\x7b\xd9\x48\x21\xdd\x39\x5b\x25\xf5\x13\x8b\xb2\x54\xee\x08\xd5\x20\x87\x5b\x67\x8f\xdd\xb8\x08\xb8\xf8\x74\x3d\xf6\xd6\xd1\xf3\xce\xb9\xda\x43\x40\x59\x86\x89\x80\x24\xeb\x2f\xdc\xc5\xa9\x58\x1b\x60\xf5\x95\x2a\x47\xa8\x87\x95\x62\x6d\xdd\x15\xc2\x4b\xeb\xe7\x20\x59\xe6\x43\xb7\x3e\x36\xf7\xf8\x14\x70\xea\x6d\x7c\x1c\xe6\x3d\xe6\xc0\xf9\x6a\x85\xf7\x41\x52\x63\xda\x90\x16\x38\x29\xe8\x33\x73\x21\xf6\xfc\xc9\x1b\x88\xcb\xc2\x00\xc8\x82\xb0\x45\x51\xc0\x1c\xcd\xc2\x4c\x5a\x97\xfb\x51\x4a\x5f\x99\x87\x6a\x96\x04\x60\x81\x92\x28\x7a\xd1\xe7\xbc\xc0\x6e\x50\x01\x52\x9e\xfd\x84\x00\x06\x71\x68\x90\xd8\xf3\x93\xc0\x93\xdd\xcf\x80\x15\x43\xfd\xd2\xee\xb9\x79\x0b\x5a\x32\xf8\xa7\x3b\x9b\xbf\x8b\xed\x4b\x96\x56\x8c\xe6\x47\x2e\x33\x5b\xd9\x5b\xdd\xf3\x29\x0b\x4b\x23\x9a\x14\x79\x66\xbe\xb7\x1e\x1f\xc7\x39\xe6\x9f\xcd\x39\x1c\x4f\x5e\x20\xe8\xb7\x24\x99\x12\x8f\x98\x1f\x80\xc5\x74\x51\xa4\xd9\xb6\xd4\x30\x7d\xfa\xa8\xd7\x23\xd5\x51\x1c\xb8\x94\x8a\x14\x70\x36\x73\xbe\x2c\x3b\x8e\xbf\xb0\x5f\x50\x64\xc0\xd5\x69\x30\x34\xac\xcb\x96\x1b\xc9\x30\x90\x6b\xdc\xd5\x5c\x58\x52\xda\x68\xbf\xbd\xad\xd8\x68\x99\x85\x28\x02\xe8\xe6\x1e\x38\xb1\x73\xd6\x60\x98\xce\xe1\x83\x7c\x3d\x88\xba\xdf\xda\x21\x4a\x6d\xda\x03\xfe\x39\x54\xfd\xf5\x81\x9d\x64\x85\x7d\x7a\xf6\x91\xf5\x13\xfb\x7d\x78\x9d\x9a\x5b\x2a\xfc\x69\x1a\x61\x68\x84\xf8\x9f\x5f\x32\x71\x13\xe7\x42\x0e\xa7\x3e\x65\x11\xd4\x4f\x80\x19\xcf\x37\x49\xc0\x85\x27\x30\x50\x0c\xc3\x14\x8c\x7b\x46\x86\xcb\x22\xc4\x42\x71\x84\x18\x73\x24\x5b\xc1\xbb\x26\x8e\x75\xdb\x4e\xca\x06\x89\x0e\x88\xba\xae\x60\xfc\x94\xad\x4f\x0f\xb4\xcd\xb2\x0d\x50\x47\xd5\x20\xb3\xb8\x0a\xfc\xf3\x97\xa1\xcb\xfc\x13\x26\xc2\x27\x11\xa7\xa1\x53\x16\x66\xb7\xc1\x97\xe3\x1c\x40\xf5\x7e\x5a\x68\x5d\x13\x2c\x97\xe0\xb0\x80\xbf\x4a\xcc\xc6\x5a\x5b\x42\xfd\x53\x92\xc6\xdf\xcf\xb5\x35\x04\x39\xad\xd1\xfe\xd5\x11\x4e\xcc\xe0\xc3\xa0\xc7\x11\x5b\xce\x4b\x26\x59\xc8\x2d\x31\x23\x5b\x3f\x99\x31\x38\x8f\xf2\xd8\x4c\x66\x1c\x82\x29\x69\x4b\x04\xce\xa1\xa2\xd8\xf9\xb0\xac\x12\xf9\x5c\xbd\xc9\x56\xaf\xac\xeb\x10\x83\x7e\xc3\xf0\xef\x80\x19\x46\x95\x68\xe9\xaa\x31\xd4\x2f\x06\xe8\x6e\xdf\x42\x2d\x30\x64\x22\xc5\x66\xf6\x94\xc8\x98\x04\xa9\x8f\x22\xe2\xa2\x14\x6b\x54\x66\xb1\x71\xdc\x71\xb0\x2c\xa7\x41\xc1\x07\xe7\x9a\x53\x91\xe8\x02\x4f\x8a\x2d\x2c\x0a\x0f\x45\x7d\xbc\x60\xe1\xcd\xa7\xb7\x83\x5a\xee\xbd\x49\x0f\xb8\xe1\x6d\x02\x86\xd4\xa2\x4a\x61\xc1\xed\x41\xbc\x17\x2c\x0d\x30\x66\x15\xf4\xc9\x7e\xa2\x2c\xb2\x17\x89\x05\xf9\x1b\x08\xb0\xcf\x2b\xef\x65\x0a\xf6\x20\x98\x3d\xae\x85\x65\x4f\x8a\x00\x3e\xeb\x10\xdf\x33\xe3\x4a\x04\xdc\xc1\x26\x50\xfc\x80\x6b\x56\x33\x79\xc2\x26\xa5\xd9\xe5\x5d\xf3\x03\x17\xf7\xc6\x99\x51\x38\x17\x74\x11\xa9\x13\xf8\x1c\x4c\x96\xcb\x16\xb5\xab\x32\x48\x66\x65\x18\x34\x80\x39\xd2\x3c\x2e\x14\x66\x08\x04\xf7\xf4\x9f\xfe\xd3\x60\xd3\x84\x61\xa6\x06\xbc\x95\x43\x74\x14\x21\x50\x61\x0e\x58\x1a\x51\xc7\x52\x57\x5b\x99\xab\xa3\x62\xb4\xdf\xf6\x33\xb2\x5f\x24\x8b\x69\x47\xe2\xde\xe9\x92\x8c\x72\x8c\x56\x89\xf3\x4b\x85\x35\xe7\xbe\xd4\x47\xae\x7d\x8d\x98\x87\x71\xc5\x74\x4d\x5c\x7e\x61\x66\xa3\x5a\x20\xd7\x33\xb0\x75\x38\xc4\xe8\x6f\xe1\x75\xc4\x10\xc3\x26\x49\x60\xca\xd5\xda\x83\xec\xb3\xb3\x67\xc5\x0b\x9a\xc3\xcc\x6e\x7d\xc1\xd0\x7d\xfe\x31\x2b\x5e\x9a\xab\xd5\x56\x03\x19\x84\x8f\x82\x64\xcc\x80\x0e\xc3\xda\x29\x3e\x36\x95\xb8\x74\xc6\xbc\xcf\x8e\x6d\x14\x3d\x90\x30\xd4\x5f\x2b\xdc\x1d\x5d\xdd\x21\x0a\x9d\xad\x10\x40\xb0\x08\x68\x39\x78\x5d\x5d\x0a\x0d\xb9\x6c\xc1\x9f\x36\x17\x44\x0c\x04\xf2\xec\xb3\x61\x44\xf6\xad\xce\xf5\xbe\xea\x0e\xfd\x94\x31\x56\x1d\xc7\x3d\xf4\x9a\x7f\x22\x8e\xee\x2c\xf7\x59\xd4\xc1\xf6\x3f\xd6\x40\x42\xea\xf0\x99\xd7\x90\x7e\xee\xbf\x49\x70\x20\x19\xde\x44\x07\xbb\xd7\x10\x7a\xf6\x42\x09\x96\x81\x58\xdb\x5a\xa5\xdf\x89\x65\xe9\x1c\xf8\x42\x32\x5c\x10\x8c\x73\xc0\xc0\x38\xb2\x46\x14\x1a\x55\xb6\x22\xad\x59\x77\x6d\x96\xb7\xd2\xb6\xf4\x96\xec\x3d\x33\x3e\x16\x88\xd4\x2c\x89\xa1\xa5\xda\x8a\x1e\x20\x3f\xce\x9e\xb7\xa6\x8b\x38\x7a\x63\x8a\x91\x40\xfa\x7d\xf3\xd3\x72\xb6\x17\xde\xb0\x02\xe1\xb5\x28\x7b\xed\x62\xbf\x63\x74\x9c\xaa\x64\x76\x37\x46\x8d\x39\x17\x52\xe1\x14\x3d\xde\xb2\x9f\x70\xe0\xc8\x34\xe6\xd6\x33\xaa\x7c\xbe\x3c\x50\x86\x03\xfc\x7d\x3d\x23\xd8\x64\x61\xc0\xd7\x2c\xca\xec\x04\x9e\x30\x61\x33\xf6\xb7\xff\x61\xe3\xef\x69\xce\x7b\x6a\x5f\x38\x09\x30\x03\xbf\x7b\xa9\x26\x23\xda\x45\x71\x8c\xd1\x6f\x9a\x85\x80\x4e\xa9\x01\xb2\x05\x41\xd4\x3f\xd9\x82\xc9\xa4\x53\x3c\x3e\x6b\xb0\xd1\x76\x5a\x1d\x2e\xbf\x16\xc9\x2b\x65\x81\xeb\xa5\xce\x9b\x5f\x6a\xf2\xb3\x50\x34\x00\x48\x92\xce\x88\xe6\x8a\xc2\x64\xb6\x3f\xa1\xa8\x74\x47\xd6\x05\x45\x0c\xf2\x85\x35\xf6\x8e\x36\x3b\xae\x77\x93\x29\xd7\xf2\xe3\x78\xd4\x35\x30\xeb\x1c\x8b\xd1\xd2\x82\x17\x5b\x41\xc2\x70\x96\xf2\x23\xc9\x5f\xf7\x26\xb1\x7a\xc4\x6b\x3e\x8a\xe5\x67\xad\x6a\xe6\x88\x92\x15\xca\x37\xab\x7e\x3d\xde\x8c\xe1\xa1\xf0\x13\x66\x38\xe8\x71\x7d\xbb\x9e\x0c\x43\x02\x69\xcf\x77\x83\xe9\x48\x76\x9a\x88\xe5\x00\x55\xa8\x09\xd5\xb0\xac\xab\x24\xd5\xe5\x0f\x57\x0a\x68\xe0\x94\xb3\x59\xd1\x32\xf8\x05\x3b\x6d\x61\x3b\x71\x3e\x7f\x28\x71\xf8\x21\x1f\x53\xbf\x81\x18\x86\xb6\x12\x8c\x87\xf6\xe4\x8e\xf3\xfb\x2a\x1c\xde\x7f\xc4\xbe\xfc\x7d\xbd\xe4\x8f\x5c\xc2\x74\x87\xa9\x44\x18\xfc\x80\x34\x1b\xd6\x44\xf1\x79\x6b\x3c\x31\xe0\xc9\x6e\xdd\x46\x90\x86\x58\x28\x10\xa6\x36\xcc\x89\xa5\x4c\xd6\xbf\x74\x75\xa7\xdf\x15\x44\x40\x9f\x24\xe9\x2f\xb4\xf5\x0b\xa6\xe8\x59\x71\x9b\xb9\x00\xa1\x8a\x3f\x9d\x51\x5d\x00\x4f\x84\xbd\x08\x87\xee\xb7\xe7\x01\x45\x52\x19\x6e\xc2\x26\x82\x90\xf7\xca\x7b\x3d\x11\xeb\x34\x03\xb0\xc1\xba\x0c\x66\x49\x3e\xc3\xd1\xcc\xf5\xf8\x87\x7d\x40\xca\x83\x90\xa2\x0e\x00\x64\xf7\xc2\xe4\x89\xd4\xd9\x6d\xc2\x8b\x4b\x89\xfe\xd6\x30\xa4\x19\xb3\x62\x4e\xb6\x5a\xda\x6d\x45\x6f\x7d\x6c\x3e\xc6\x6e\xc9\x1b\xc3\xd3\xf2\xd5\x94\x45\x2c\x58\x94\x06\xbc\xf7\x86\x83\x27\x60\x85\x9e\x4e\x3f\x77\x6d\xb8\x69\x6e\x3a\x7d\x50\x0c\xbc\xf3\x9e\xee\x58\xf2\x6f\xfa\xc5\x66\xc4\x48\x55\x73\xa0\xe7\x56\x94\xa4\xde\x8e\x9c\xee\x3c\xf6\xb8\x81\x3a\x9f\xa0\x7b\x29\x61\xbb\xef\xc3\x81\x78\x69\x66\x5d\x9a\x21\xf8\xb7\x09\x43\xec\xe6\xe1\xc1\x0b\x3f\x98\x66\xa3\x4e\x23\xca\x7c\xcc\xbe\x0a\x72\xdf\x96\xf3\x5b\xbd\x10\x75\x6e\xb3\xbd\x52\x2d\xfd\x47\x5b\x1f\x3c\x52\x9e\x3c\xf3\xcb\x91\x2a\x09\x84\x99\x46\x9d\xd2\x50\xc6\x11\xf7\x9a\x05\x95\xe1\x90\x37\x8f\x90\x1b\x5b\xf3\x44\xcb\x21\xf0\x4a\xa0\x51\xba\x50\x73\x81\xb5\xfe\xbe\xbc\x8d\x09\x96\xd9\xfa\x85\xfe\xaf\x50\xa8\xcd\x63\x18\x78\xab\x80\xe6\x82\x0a\xc6\x0e\x4c\xe3\x43\xd3\x70\xa1\x6f\x7f\xef\xb3\x7f\x86\x88\x74\x9e\x50\xc1\x9b\x78\xbf\xc1\x2d\x88\x05\x7c\x5a\x7a\x0e\x8a\x28\x62\xbd\x0a\x00\x88\x58\x80\xdd\x21\xbe\xc0\x3c\xb5\x45\xb1\xf3\xb0\x62\x29\xa6\x79\xbf\x3a\x26\xe1\x3c\x7e\x63\xde\xdb\x8c\xf5\xbe\x1a\x76\xbf\xeb\x10\x50\x06\x4b\x8e\xeb\x59\x85\x6b\x1b\xcc\xe1\xf7\x18\x7e\x2e\x7f\xef\x9f\xd0\x3a\x0d\xe6\x18\xae\xd9\x2c\x3f\x04\x8e\xcf\x0d\x3a\x02\x42\x32\xe8\x3a\xca\xb7\xac\xd3\x14\x70\x58\x07\xe9\x76\x8a\x33\xf6\x2b\x82\xb5\x63\x6d\x89\xd1\x0e\xe4\xa1\x1f\xc6\x7b\x70\x69\x3d\x6a\x03\x82\xe6\x14\xe0\xc2\x90\x84\x66\x17\x14\x3b\x29\x3c\x31\x37\x04\x59\x92\xf5\x28\x1a\x66\xc6\x49\xa8\xc8\xbd\x0c\xc2\x9a\xd9\x06\xf6\xd9\xa5\x00\x7c\x95\x08\x84\xf8\x87\xd5\x30\x97\x48\x2b\xba\x2f\xd5\x40\xa4\x7b\x04\x9f\x7b\x83\x55\x91\x26\xfd\x7d\x23\x5b\xbc\xe0\xb0\x62\x9a\x12\xe5\x09\x66\x13\xd0\xd0\x97\x3d\x4e\x3f\x34\x8b\xf0\x5e\xf5\x8c\x48\x98\xc4\x5d\x04\x06\x92\xe7\xf8\x59\xd2\xa5\x05\xf1\x12\xc8\x1f\xf8\x6d\x00\x6c\x9a\x00\x05\x97\xf3\x39\x51\x9c\x2a\x73\x64\xbc\xac\x17\xd4\xb3\x78\xcf\x90\x38\xfb\x3d\xc7\x9a\x59\xdf\xc0\x51\x01\x65\x0d\xf4\x72\x0f\xd3\x04\x78\x97\xef\x57\xeb\xf2\x98\x43\x58\x60\x9e\x98\xe3\x62\xf9\x49\x09\xa3\xef\x68\x7c\x2a\x11\xa6\x87\x40\xcd\xb3\xfe\x43\xf5\x91\xd1\xbb\x7c\x1f\x5f\xc3\xf6\x26\x7f\x4b\x7f\x1d\xd1\xf1\xbd\xbd\x39\x57\x46\xb5\x1d\x68\x08\xf0\x06\x18\x04\x33\x17\x9e\xc3\x3e\x81\x1c\xfc\xcf\x04\x5c\xd6\xb7\x32\xcd\x12\xd4\xdc\x17\x9c\xe9\x0c\xfd\x8e\xca\x60\x18\x74\xe3\x35\x0f\xad\x32\xd7\xaf\xcf\x65\xec\x0f\x93\x2f\x69\x89\x7b\x88\x7d\x7f\x7b\xde\xd4\x80\x33\xf6\xb2\xf0\x37\x95\x31\x2e\x9b\x2c\x9f\x64\x94\xf2\x20\x64\x02\x6c\xfb\x68\x56\x01\x75\xa7\xda\xd8\xfc\x4f\x7f\x4a\x03\x6f\x30\x34\x7d\x7a\x8a\xae\xf3\xc0\xce\x37\xb1\xb6\x38\x5d\xed\xaf\x55\x96\x5f\x52\x9d\xeb\x72\x68\x88\x06\x94\x14\x67\x9a\xe7\xd5\x46\x9e\x14\x98\x94\x03\x08\xc4\x74\x2b\x03\xb7\xde\xa4\xc2\xec\x81\x5e\xd9\x02\x3c\xc3\xa6\xe0\x93\xd6\x82\xc1\xa9\x27\x61\x0c\xf9\xbd\xf0\x26\x49\xf8\xf5\xab\xd2\xb4\x48\x30\xd8\x5c\x27\xcf\xc8\xf1\x64\x03\x84\x61\xd2\xf5\x34\xf9\x59\x1e\x35\x07\xb0\x02\x59\xdb\x2f\x00\x93\x4f\x8a\xca\xd6\x8b\x0b\x11\xd4\x0a\xab\x55\x94\x49\xd3\x60\xf3\x7b\x85\x10\x09\xd3\x8f\x24\x53\x29\xf2\x71\x17\x64\xee\x01\xbe\x03\x50\x83\x9f\x87\xf2\xf8\xd6\x4c\x06\x9c\x30\x8e\x6f\x9b\x13\x6e\x84\xfd\x92\x3d\x9b\xb3\x9f\x10\xb0\x31\x78\x06\xec\x33\x73\xef\x39\x65\x13\xc9\x7c\x59\x51\x36\xc2\x67\x90\x03\x81\x39\xa1\x8a\xe9\x8e\xdd\xfa\x56\x43\x97\xa2\x39\x30\x66\x1d\x4f\xc2\x6d\x5f\x6c\x1b\x22\x01\xda\xff\x22\xf6\xa9\xfb\x28\xc4\xcc\xe6\x7b\xa7\xbe\xe1\x0c\x8c\x1e\x03\xfd\xce\x3c\x87\xdf\xfc\x0b\x7e\x99\x3f\x8b\xb0\x46\x26\x48\x8a\xd6\xfb\xbe\xae\xe7\x5b\x31\x3c\x69\x6a\x7f\x0e\x15\x9d\xae\x21\xe2\xc4\x49\x6e\xc8\x2a\x97\x10\x03\x61\xfd\x27\xff\x18\x24\x6b\xfb\x11\x91\xea\x6f\xd3\x47\xf9\x24\x67\xb1\xac\x8d\x89\xbc\x71\xd9\x12\xcf\x42\x8f\x65\x0a\xc0\x79\xf0\xe6\x79\x64\x1b\x73\xd7\x78\x00\xb2\x39\x92\xf0\x6d\xa9\x17\x19\x17\x9b\xfe\x7e\x53\x09\xd3\x8d\xa9\x67\x6c\x89\x7f\x0b\x26\x86\x4f\x17\xcd\x41\x59\x7a\x86\x78\x60\x42\x08\x49\xa2\x07\xe0\x3f\x49\x42\x03\x52\xe0\xb4\x77\xc2\xe5\x78\xb8\xe7\xa7\xb8\xc6\xac\x44\x8b\x91\xcf\xd8\xc9\x01\xf6\x8e\xd8\x75\x98\xa6\xa6\x3f\x1d\xf2\x8b\xe4\xbe\x62\x7b\x11\xd0\x53\xe8\x75\x31\x69\x4e\x4c\xbc\x3d\xb2\x2b\x9c\x64\xe7\x62\xc4\x55\xa4\x27\xde\xff\x48\x3a\xaf\x65\x47\x71\x20\x0c\x3f\x10\x17\xe4\x74\x69\x82\xc9\x19\x9b\x70\x47\xc6\x60\x92\xc9\x3c\xfd\x88\x33\xb5\xe5\x9d\x9a\xda\xb3\x3e\x84\xee\xbf\xff\x4f\x6a\x49\xb8\xc9\xd2\x30\xbd\x39\xf8\x0f\xc5\xca\x3a\x39\x99\x55\xcb\x22\xd1\xd2\xd6\x0f\xb1\xb8\xf2\x38\x39\xaf\x33\x22\xb8\xa7\xeb\x75\xd8\xeb\xa7\x12\x9d\x66\xa8\x9d\xb7\x45\x82\x40\x30\x80\x61\x7f\xef\x0f\x14\x3e\x55\x9a\x2d\x52\x79\x9e\xd3\x40\x09\x42\xd6\xec\x71\x0b\xb6\x62\xd4\x0d\xdd\x15\x01\xa2\xa2\xbc\x31\x62\x20\xb5\xe0\x83\x96\xde\xfa\x5e\x99\xa4\x26\x1c\x83\xfc\x1a\x71\xa3\x24\xbd\xdd\x5a\x1f\xb6\x47\xe8\xc7\xb2\xf5\x9c\x37\xa6\xbf\xda\xf3\xbf\x1e\x39\x19\x38\x4d\xa0\x23\x4f\x77\x03\x09\x31\xf4\x6b\x41\x1f\x70\x29\xd2\x28\x69\x6d\xe7\x40\xbf\x7b\x5b\xe3\x65\xe5\xa2\x01\x93\x5c\x64\x23\x4e\xf3\x9b\x7c\x0e\x13\x9a\xac\xeb\x6a\x07\x18\x41\xb2\xb9\x73\x5d\x99\xdc\x94\x3e\xf1\xdb\x03\x48\x98\x6d\x8e\xb6\x95\x1d\x86\x61\xb5\xeb\x7b\x88\x9e\xa8\xf9\x77\xbe\x4c\xff\x8d\xe6\x38\x28\x68\x10\xd2\xff\x3a\xcd\xb6\xf0\x8b\xb8\xbd\x36\xe0\x21\x5a\x27\xff\xc6\x0b\x0f\x51\x29\x5b\x4e\x89\x9c\x54\xb4\x8a\x7b\x5c\xe7\xce\x63\xf0\xd3\x97\xd9\xc9\xab\xb8\x29\x2b\xf8\x2a\xb4\xbf\x18\x23\x49\xe4\x9c\xbf\x6e\x7f\x47\xd3\x34\x21\x2f\x85\xe8\x9d\x6b\x79\xd9\x25\x3d\x44\x30\x8c\x1f\x17\x7c\xd8\x2a\xfb\xd6\xf1\x4b\xfb\x6a\x6d\x04\xa7\xa6\x1c\xaf\xd3\xeb\x6b\xc1\xc2\x3d\x16\x1a\xc4\xe9\x33\xb0\xbd\xfe\x35\x7d\xa5\xe6\xa0\xf2\x70\x9b\x41\x4c\x2b\xed\x57\xb0\x78\xda\xf4\x01\x91\xe2\xb6\x8f\xd3\x14\x16\x11\xf9\x6b\x59\x0f\xe7\x01\x93\x27\x9b\xbd\xe0\x55\xa8\x36\xba\x53\x72\xb6\x38\x1a\x18\xcd\x91\xa4\xa4\x32\x7c\x0b\x61\xac\xdc\x7e\x96\xf5\x39\x7f\x33\x5c\x4e\x85\x4c\x57\x24\xe7\xb5\xef\xa7\x2b\xbe\x39\x81\x3f\x66\xce\x17\x1f\x5a\xb8\x85\x41\x6f\x01\x81\x5b\xe9\x6f\xaa\x8e\x47\x41\x3f\x0e\xf1\xf1\x72\x39\x8e\x73\xaa\x27\xd7\x55\xe2\xdf\x06\x59\xcd\xc5\x06\xa1\x5b\xd6\x97\x71\xb2\x06\x54\xb2\x9b\x9d\xc6\xa1\x1b\x01\x50\xa6\xfb\xfe\xf7\x3d\xe8\xad\x2b\x10\xd6\xdb\x66\x04\x14\x65\x19\xe1\xd0\x85\x8f\xdf\x4c\xc1\xc0\x65\xd3\xc4\xe7\xf9\x68\xaf\x0a\x91\x06\x5c\x20\x82\x7a\x4a\xc6\x2a\x92\xe8\x60\x9f\x53\xf0\xea\x1a\xe7\x34\xfa\x0b\x20\x11\xee\x5c\x10\xfb\x8c\x56\x6d\x21\xf7\x73\x10\x92\x76\x10\xc3\xf5\x83\x85\x6f\x33\x90\x31\xb7\xdf\xd6\x8d\xf2\x76\xd7\x79\x1f\x14\x78\x88\xe5\x70\xd5\xf3\x50\x68\x3c\x9c\x9f\x6f\x25\x3e\x01\x1d\x57\x02\xf9\x99\x16\x3b\x1b\x80\x88\xf8\xde\xd7\x9b\x69\x0b\xdf\x3e\x90\x2d\xf7\x17\x89\xcb\xa7\x7d\x3e\x21\xd2\xb0\xc0\x0b\x12\x69\xfa\x7b\x41\x74\x1a\x4e\xa6\x84\xa7\x2c\xca\x6b\x34\xbd\xc3\x1b\x78\xb0\x6f\xab\x47\x57\x56\xf3\x56\x9c\x29\x9e\x63\xd2\xfd\xa0\x0d\xa7\x2c\x39\x90\x29\x45\x91\x19\x3f\x07\xe0\x9c\x6a\xb3\xe6\xbd\xe8\xee\x67\x40\x0f\xc7\x31\xde\x4f\xce\x79\x70\x89\xf1\x19\xae\x07\x73\x2a\xdc\x43\x79\x7e\xae\x62\x0b\x3a\xc1\x5d\x0f\x23\x3e\x5a\x4b\x96\x19\x08\xe8\xf8\x0b\x0a\x26\x77\xe2\x52\x50\x3d\xb5\x73\x1e\x09\x4a\x87\xb8\x13\x0a\x31\x7a\x31\x65\xaa\x66\x05\xe7\x25\x72\xf9\xac\x89\x97\x25\x24\xd3\x51\x08\x7b\x02\xec\x3a\x9b\xbe\x90\x5e\x45\x72\xc3\x6d\x6a\xa6\x4a\x6d\x8e\xdc\xc8\xcd\x89\xef\xc6\x0b\x40\x2d\xc4\x54\x30\x31\x42\x47\xe3\x53\x2d\x61\xeb\x61\x13\x43\x54\x61\xc9\x91\xe3\xef\xc3\xbf\xc3\xbb\x85\x2d\xad\x53\x2b\xbc\x69\x8f\x0f\x9a\x09\x20\xc8\x49\x4d\x79\xe0\x1b\x7e\x91\x33\x9b\x40\xd4\x6c\xc3\xe9\x8a\xf7\x21\x49\xcc\x81\xb1\x40\x7d\xd4\xbe\x58\xc3\xe0\x2a\xe3\x19\xbc\xbf\xf7\x2c\x8b\x71\xd9\xfe\xf7\x83\xcd\x40\x94\xe7\xe6\xb1\x9b\xa8\x19\xbe\x03\x7e\xef\x1c\xf7\xd1\x37\x24\x14\x19\x61\x98\x7c\x2f\xfa\xf9\x3d\x20\x61\x2b\xdc\xce\x40\xc2\x8d\x87\x1a\xf9\xd7\xb8\x85\xc1\xf7\xcd\x46\x41\xa9\x4c\x6c\x23\xc0\x63\x50\x22\xd1\xde\x7e\xd5\xdd\xfb\xeb\xfb\x9a\xfc\xb3\x82\xf4\x39\x63\x49\x64\x4a\x50\xb0\x90\x5a\xe8\x06\xe6\x12\x75\xe4\xd2\xf0\x65\x0f\x03\x56\xcc\xb7\x30\x45\xbb\x5f\x07\x00\x50\xd0\x9b\x80\x25\x3a\x98\xc4\xce\x44\x7f\x86\xc8\x82\x6a\xf1\x5e\x6e\x78\x78\x91\x83\xff\xc8\xc2\x8e\x5c\xc3\xda\x11\x0b\xe7\x67\xe4\x92\x73\xbd\x5f\xad\xad\x76\x97\xdd\x8e\x9a\xd7\xe3\x34\xeb\x18\xaf\x52\xb5\x12\x68\xd3\xbf\x1e\xb1\x3b\xd4\x5b\x8d\x03\xff\xdb\x60\x9b\x73\x19\xe9\x73\xa8\x3d\x97\x6c\x37\xae\x75\x56\x9e\x68\x0e\x06\x3e\xe7\x1e\xba\xf7\xe0\xbb\x50\xb1\x61\xd2\x1a\xae\xe0\x59\x11\xd0\xf7\xfb\xd5\x7b\x3a\x08\x7a\x7c\xa7\xf4\x86\x3e\x0c\x1f\xef\x4c\x76\xb2\x1b\xf5\xc1\x24\xf6\xce\x58\xf2\xc9\xbd\x19\xbb\x87\xad\x9f\xf9\x55\x75\x94\x72\xa0\x97\x05\x95\x46\x16\x2d\x6f\xff\xc0\xb8\x77\xf0\x2a\xfa\x52\x45\x57\xa8\x12\x6b\x63\xa4\x18\xfa\xd8\x9e\xd9\xd0\x83\x6c\x8d\x58\x7d\x33\xe1\xde\x3c\xdb\x0b\x84\x8f\x57\x60\x0a\x91\xb4\x63\x55\xe0\xf2\x46\xe6\xd0\x78\x91\xba\xdd\x93\x4c\xa7\x2a\x5e\x69\xfd\xbe\x18\x9a\x8c\xe3\xeb\x4c\xb6\xf0\x27\x33\x89\xd8\x28\xbf\x78\xc6\xe7\x46\xb9\xe6\xfc\xf3\x41\xee\xc3\xcf\xf9\xd7\xd7\x0d\xd0\x45\x77\xcd\x46\x01\xaf\xee\x44\xa3\x25\xcd\x2e\xc3\xb7\xc1\x0b\x7d\x83\xc8\x29\x56\xf8\xaf\x47\xe7\x8d\x53\x28\xa9\x2e\x01\x9d\x43\x8b\x3f\x34\x0d\x49\x05\xce\x5e\x52\xc2\xc3\xe5\x44\xb1\xb4\x66\xdf\x80\xcd\x36\x76\x34\x5e\xf1\xc2\xc6\x6e\x49\x92\x7b\xd6\x4a\x09\x9b\xfd\xf7\xf4\x5e\xad\xea\x76\xac\xc0\xd8\x21\xee\x1e\x36\xb4\x7d\x94\x56\x0d\x3b\x9b\x89\x26\xf3\xf3\x12\x7f\xe5\xdc\xe4\x2b\x5e\x0a\x4e\x6b\xc1\xb0\x60\xf9\xc3\x36\x3b\xe5\xfa\x43\xee\xf9\x9b\x5a\x54\x6a\xd5\xa7\x96\xcf\x30\x69\xe3\x98\x04\xf3\xbd\xeb\xd0\x78\xaf\x9a\xd3\xbc\x61\x52\x00\xdf\x2d\xb5\xf1\x6e\x0d\x75\xb0\x9f\xb1\x29\x8f\xb9\xf6\x74\x34\xce\x51\xa1\xf0\x80\xc2\x00\xc9\x9b\xbf\xf3\x38\xea\xf7\xfb\x1d\x7e\xe3\x20\x00\x9f\x37\xb0\x1e\xe1\x97\x2c\x42\x62\xba\x5b\xe9\x14\xa6\xb4\xb3\x9f\x7a\x3a\xe2\xeb\x6b\x1f\xed\xb5\x4d\x06\xc3\xed\x5c\x71\x50\x76\x33\x1c\x33\x9e\x0e\xe8\x31\x74\x88\x66\x34\x76\x7f\x7d\x59\xb7\x8d\x25\x6e\x6b\x61\x6d\xb4\x55\xd4\x4c\xc1\x93\x13\x5e\xef\xa7\x79\xcf\x13\xfa\xef\x77\x1c\xc4\x3f\x39\xd2\xb9\xf4\xe7\xa1\x90\xb2\xfe\xa0\xf1\x97\x7c\x06\x8d\x87\xb6\x89\xaf\x36\x1d\xa6\x99\x35\xe5\xab\xca\x38\x84\xa7\x49\xb1\xc5\x95\xad\x8a\x2c\x5c\xe8\x07\x59\x82\xb9\x7e\x6a\x08\x90\x3f\x18\xd6\xbf\x27\xdd\x57\x23\x61\x6b\x11\x56\x6c\x1b\x2d\x7a\xb1\xa9\x30\x9d\x04\x6e\x1d\x61\xdd\xe1\x54\xf8\x07\x0c\x7c\x9f\xf6\x6e\x13\x53\x7e\xa5\xbe\x73\x66\xb4\x95\x6e\xbc\xa3\x04\xee\x6f\x8f\xf6\x8a\xe8\xec\x85\x6a\x5e\x6a\x73\x40\x3e\x8c\x5b\xc1\x9b\x7d\x02\x41\x54\xac\x43\xeb\x12\xe9\x73\x5f\x52\xa5\x25\xdc\x00\x74\x6b\xd0\x3e\xcb\xce\x55\x74\x9d\xe9\x63\xa9\x46\x8d\x78\xcf\xb5\x0a\x9e\xfb\x10\x43\xe6\x11\xf2\xaf\x17\x5f\x25\x7c\xb7\x4c\x49\x96\xa3\xd3\x13\x63\xea\xba\x92\xca\xa6\x73\xbf\x24\xcb\xd1\x98\xf1\xf8\xfe\xb6\x81\x27\x5a\xf8\x23\xf8\xca\xfb\xa1\x18\x35\xc3\x9e\xf4\x55\x1e\xb6\x72\xef\x77\x30\x47\x9d\x7a\x77\xaa\xcd\xa9\x74\x0c\xb1\x74\xb4\xa9\x78\x78\x39\x21\xb6\x3b\x92\x34\x59\xfc\x31\xd2\x36\xd3\x87\x52\x27\x42\x85\xe4\xbf\xfb\x53\x18\x4a\xb6\xc7\xa1\xe9\xa7\x1d\x33\xbd\x5e\xf1\x27\x63\xfc\x0d\xc7\xda\x15\x64\x3e\x89\xbe\x84\xbf\x33\xc9\x44\xd1\x59\xc2\x2b\x69\x5b\x2b\x73\x70\x36\x98\x71\xe6\x30\xe3\x70\xef\xb6\xa7\x39\x1e\x0e\xd6\x51\xd8\x32\x50\xd6\xbd\x3d\xd7\x1d\x32\xe0\x73\xce\x3f\x43\xaf\x67\x9d\x95\x2c\x14\x7e\x3c\xf7\x4a\x84\xf5\x89\xea\xfe\xde\xcc\xef\x64\x36\x4d\x63\x36\xfd\x44\x80\x6b\xf2\x89\xe0\xf9\xe6\x3a\xf1\xbb\x55\x8c\x91\x3f\xe0\xc8\xda\xb0\x34\xc3\x06\xf3\x07\x48\x6c\x73\x4a\xc4\x66\x8d\xd4\x3a\xaf\x11\x81\xbf\xb8\x52\x38\x84\xc5\x0b\xd0\x0e\x57\x13\xe3\x95\x19\x04\x14\xaf\x20\xd8\xa2\x71\x7f\xe8\x70\x7a\x50\xf9\xcc\x2d\x3c\x2a\x04\x67\x6e\x08\x07\x80\xe9\x57\x39\x8d\x2b\xbb\xcc\x26\x02\x6a\x20\x1e\x46\x13\x61\xa6\xa0\xbf\xee\xb9\x17\xf0\xe9\x32\xa1\x36\x5b\xf7\xa5\x70\x46\xf8\x3c\xee\x46\xa6\xe8\xf5\xe4\xee\x30\x75\x41\x4c\x18\x97\x75\xcd\xb4\x76\x19\x97\x7e\x32\x16\x63\x95\x9a\xdd\x1d\xe1\xe4\x43\x29\xa3\x0e\xa5\x37\xb6\x48\xba\x5b\xc1\xef\x4d\xb1\x59\x5f\xca\xc0\x57\x37\xa5\xce\x85\x45\x8c\xbd\xcd\xee\x02\x20\x41\x3a\xdf\x4b\x04\x2f\xe1\x8e\xfe\x35\xed\xc8\x2e\xed\xe2\xe9\x6e\x0a\x1b\xa9\xe2\x9e\xc4\x1d\x70\xe7\xce\x2a\xa8\x6c\x8e\x08\x8d\xbb\xf8\x2f\x4b\xee\x3f\xc7\xa4\xd8\x00\x73\x41\x5e\xfc\x7b\x0a\xf7\x3c\xfb\xeb\x13\x9b\xe0\x17\xe1\x0d\x6d\xed\x33\x03\xcb\x12\x19\xea\xe1\x0f\xf0\x69\x91\xe9\xe2\xdd\x5e\x0c\xdb\xd1\xa8\x7d\xa6\x35\x48\x8b\xe0\x84\x02\x8f\x3c\x4d\xb3\xbf\xda\x46\xf5\x42\x12\xcd\x96\xb0\x90\x1d\xa5\xea\xea\x5f\x0c\x97\x29\x4d\xb3\x3e\x0b\xdb\x76\xdf\xcc\xbd\xed\x21\x8b\xea\xbd\x9e\xc2\xf9\xfa\x30\x84\xf7\xac\x55\x4a\xff\x9c\x76\xcd\xa1\xa6\xf3\x12\x1e\x87\xe9\xbf\xae\x04\x8b\x41\x48\x69\x55\x8a\x71\x55\xa2\xf1\x37\xa6\x7d\x7f\x09\xd6\xb2\xca\xf6\xc5\x2d\x06\x12\xb3\xb0\x97\x36\x91\xfb\xcc\xcb\xb8\x52\xc6\x1d\x2b\x7b\xf5\x06\x76\x11\x39\x3a\x53\x73\xd5\x45\x7c\x54\xa7\xf1\x33\x2e\xf0\x81\xed\xc1\x7f\xba\xaf\xf7\xfd\x36\x80\xa3\x68\x6c\x1f\x65\xed\x10\x65\x1f\xbb\x21\xe4\x0e\x62\x16\x6f\x60\x43\x35\xdb\xc5\xa4\x3d\xa8\x19\xb4\xce\xd8\x2a\x13\xc6\x0d\xc4\xaa\x46\xca\xc2\x8f\x45\x09\xda\xac\xe9\x93\xe9\x7c\xb3\x43\xb7\x12\xd3\x8e\xac\x30\x7a\x06\x98\x04\x3b\x23\xc5\x24\x02\x6a\x00\xcb\x64\x86\x5b\xd1\x65\xaa\x57\xab\x97\x32\xb1\x90\x30\xc1\xac\x70\x57\xed\x2e\x0a\x42\x00\x7c\x5e\xd8\xbd\x15\x22\x9a\x83\x2c\xb6\x7d\xef\x07\x24\xad\x9d\xb5\xfb\xf8\x4d\x50\xd4\x40\xc5\x5a\xfd\x96\xa4\x59\xf2\x3b\xfe\x50\x72\x87\xec\xc3\x93\xeb\x9d\xc1\xd5\x4b\xdd\x3d\x2b\xa0\xd9\xa3\xc2\x41\xbd\xea\x6b\x0b\x6e\x7a\xfd\x4d\x11\x11\x79\xb0\x4e\xf0\xac\x86\x9e\x5e\xca\xf7\xd3\x43\x72\xfb\x59\xf2\x4e\xab\xbe\x85\xef\xcf\x2b\xa5\x71\x4d\x13\x2c\x9f\x0b\x2c\x8d\x57\x3c\x9d\xde\x51\xf9\x05\xc9\xc0\x1f\xe9\xbc\xf9\x1a\x99\x6d\x6d\xe1\x68\x38\xe0\xd6\x74\x99\xb0\x7c\x89\x30\x14\x7c\x80\xa4\x4b\xae\xa5\xa7\x7c\x24\x70\xc8\x3d\x0e\x92\xcb\x1e\x34\x95\x5b\xc3\xc0\x77\x90\x80\x10\x42\xa1\x7e\x6b\x49\xb3\xdc\x5e\x93\xe9\x07\x6f\xad\x03\xef\x21\x7c\x3a\xe1\x73\x37\x2c\xec\xe0\x82\xd1\x20\x29\xc8\x80\xa2\xca\xad\xca\xdf\xd9\x81\x8b\xc8\xb0\xb4\x3a\xf0\x2f\x11\xe9\xae\xd2\xd1\xe0\x6f\x54\x09\xff\x82\xb6\x92\x02\xfe\x0c\xee\x53\xb8\xa0\x9d\xb0\xd2\x7c\x42\x92\xe0\x0d\xde\x71\xd2\x71\x1f\xed\xf7\xbf\x13\x89\x2c\x60\xc4\xcd\xc3\x2f\x55\xb4\xe3\x05\x1e\x7e\xe8\x11\x48\x61\x87\x67\xf4\xf5\x52\x74\x8c\xfb\x37\xca\xa6\x57\x9c\x1d\xd1\x16\xe4\x2a\xec\xc8\x50\xdc\x5c\x43\x2a\x91\x8b\x19\x5c\xa9\xdd\xf9\xef\xf4\xfa\xda\x6d\xc8\x93\x38\x01\xc5\xe6\x5f\xe3\xa9\x3d\xbe\x52\x21\xa6\x29\x3a\x5e\x10\x2a\xb6\xfc\x10\xcb\xb5\xb5\xe8\x0f\x80\xf5\x41\x87\x17\xeb\x10\x7a\x06\xb2\x92\xa1\x45\x61\xbd\xbf\x74\xfe\xb8\x5a\x5a\xa8\x8a\x4b\xfb\x35\x7c\xf3\xc4\xf3\x93\x55\x6d\x90\xef\xed\xa8\x2e\x14\x9b\x00\xcc\x05\xb5\xf2\x25\x96\xce\x12\x50\xe6\x87\x80\xb7\x55\x24\x46\xfa\xd4\xdc\xfa\x21\xf6\x0e\xe5\x13\x42\x03\x0f\xea\xb3\x3f\x4a\x90\xca\x23\x78\xc1\x2a\xf8\xd8\x23\x5e\x86\x3f\x0a\xfa\x2c\xc1\x2f\xf7\x5d\x34\xf9\x6b\xbc\xba\x2f\xef\xf7\x4b\xd6\x65\xa2\x6c\xcd\xdb\x7c\xd8\xab\x7d\x27\xf0\x76\xac\x63\xd0\xcf\xcc\x7e\xe7\xe7\xb0\xb1\x36\xf9\x23\xdc\x95\x43\xbd\x79\x9a\xbb\x10\x66\x02\x6a\xfb\x50\xf5\x98\x90\x3c\x16\x00\x73\xea\xa7\xdd\x46\x3e\x80\x0e\x52\x1b\x03\xc7\xc5\x91\xbf\x1b\x83\x1d\xde\x45\xc9\x75\xcb\xd9\x21\x68\x26\x8a\x86\x63\x48\x0c\xb4\x2d\x97\x10\xa0\xdf\xb4\x84\x31\xd5\xe3\x7d\xaa\xed\xbe\x6a\x31\xca\x08\x6d\xf6\x7e\xa3\x67\x31\x10\x68\x52\xf3\xe6\xdb\x61\xa1\xd8\xaa\x7c\x4b\xf8\x7d\x65\x8c\x71\x31\x08\xec\xa0\x79\x98\x2f\x61\x69\xb3\x26\xd4\x93\x6b\xd9\x9f\xec\x0a\xe1\xc4\x0a\x2f\xb8\x0e\xc2\x0a\x14\xd8\x3c\x83\x95\xf7\x92\x04\x79\x9f\x60\xdf\x31\x0a\x6a\x50\x0d\xdc\x36\x91\x92\x69\x9c\xbc\x76\xd2\x1a\x05\x84\x17\x65\xb3\x74\x07\x24\x15\x59\xec\x32\x44\xa9\x3d\xb3\xe9\x29\x6b\x47\xa4\x39\x75\x0e\x85\x4d\x98\xcc\xdd\x2a\x31\x6d\x13\xbe\xe0\x8b\x92\x99\xad\xd5\x61\x74\xaf\xd8\x50\xfa\xf9\x7c\x72\xf9\xf9\x8a\x81\x27\x69\xb1\x2b\x7e\xf7\x63\x4d\x6e\x4c\xd6\x1e\x88\x87\xdc\xeb\x55\x2d\x83\x4a\x1b\xdf\x08\xc2\x90\xf4\x83\x2b\x5e\x1d\x4a\x9d\x51\x6e\x4b\xf7\xac\x11\x81\x77\x0c\x12\x39\x22\x07\xc1\xf9\xe6\xe4\x4e\x66\x16\x05\xee\x02\xa9\x1b\x5d\xea\x0d\xcc\x9a\xa1\x3f\x5e\xbf\x19\x4a\xa6\xa4\x1f\xa9\xac\x52\x1a\x2e\x56\x5b\x50\x5c\xac\x0d\xc7\xa7\xbb\x7f\x28\xf0\x08\xaf\xf8\x25\x57\x06\x74\x3b\x0b\xa0\x32\xdc\x54\x94\xd5\x03\x20\x5b\x4c\x01\xff\x90\xbf\x36\x37\x0c\x2e\x35\xaf\x1a\x5a\x4d\xb1\x81\xe5\x62\xe1\x41\x81\xeb\x9d\x48\xdd\x9a\x13\xb1\x71\xc6\x23\x1a\xe7\xd6\x9a\xda\x02\xfd\xe5\xe5\xdd\xf1\x40\x98\x5e\x3b\xb7\xf1\x87\x14\x0a\x3e\x85\x5a\x52\xeb\x20\xa8\xbe\x00\xe3\xda\xf7\xf5\x81\xd2\x16\x70\xfd\x7d\x36\x7b\x6a\x62\xc8\x7d\xd8\xa1\xe4\x6c\xc5\xa7\x32\xb9\x61\xe1\x9f\x42\xcd\x50\x85\x45\x94\x66\x3c\x6f\x0f\x7a\xf1\x5f\xa8\x75\x15\x8b\x37\x9f\xb6\xa8\xad\xdf\xe6\x56\xfd\xa9\xd8\x70\xc7\xd5\x61\x1f\x58\x9e\x7b\x0b\x3a\x80\x82\x3b\xf0\x40\x6d\x73\x18\xb4\x10\xa7\xf6\x86\xb1\x35\x42\xe7\xc5\x2f\x9a\x62\x0b\x94\xa6\x77\x94\x4c\xda\xf3\xfb\xf2\x3e\xfc\x29\x33\x47\xaa\xc6\x7d\x2c\xc7\x8b\x0a\x79\xfd\x67\xb8\xf7\x24\x79\x78\x80\xfe\xde\xb2\x08\xfc\x86\xe1\xc9\x0d\x84\xbd\x75\x22\x21\xcc\xf4\xd5\x16\xdc\x73\x4c\xbd\x9a\x3f\x42\xf2\x31\x57\xb9\xf0\x18\xd4\x74\xe9\x26\xd4\x67\x2f\x9e\xd0\xa8\xb5\x19\xa0\x8d\x02\x7f\x7c\x61\x19\x40\x36\x5e\x7e\x91\x3c\x3c\x85\x8a\x81\x5b\x9e\xf9\x9e\x11\x25\x3b\x54\xc5\x3c\xef\x3d\xf5\x67\x72\x2c\x61\xe3\xdd\xcd\x30\xcc\xc8\x59\xe1\x7c\xfa\x86\xa5\xcd\x0d\x80\xfb\x5d\xaa\x7c\x98\x94\x1d\xe4\xfd\xca\xbd\xc9\x1b\x5e\x9d\xae\xea\xf0\x4b\x74\xd2\x6d\x6d\x52\xd6\xc1\x2e\x97\xcd\x09\xb6\xab\x23\x71\xb6\x27\x45\x13\xa7\xd5\x09\xdc\xbb\xef\xcb\x3f\xb4\xe2\x30\x21\x36\x3b\x61\x48\x6e\xbf\x67\x03\x12\xb4\xcc\x28\x66\x2d\x88\x42\xee\x6b\x08\x6e\xda\x2f\xa8\x49\x3f\xc0\x34\xf0\xf3\x60\x6d\x24\x83\xe0\x6c\x03\x0a\x0f\x38\xc1\xb4\x2f\x9c\x73\x74\x8e\xfe\x62\xb4\x5f\xef\xb4\x3f\x4d\x74\x82\x01\xa7\xc3\x94\x77\x7f\xae\xd5\xf4\x20\xba\x9a\x60\xd7\x34\x8f\x98\xac\x66\xc6\x52\xdb\x6d\xdf\xa2\xd7\x51\xe2\xdb\xe0\x29\xc7\xd8\xfa\xe3\x1e\xbe\x2a\x42\xbb\xb3\x7f\x35\x1c\xa2\x43\xe9\x88\x4f\x6e\x78\x6f\x40\x80\x51\x9a\x95\x85\x19\xb7\x3b\x20\x75\xa3\xda\x5b\x40\x0e\xaa\xbb\x89\x09\x82\x72\x7f\x83\xee\x8e\xc1\xb9\x51\x35\x59\xd2\x8d\xe6\xca\x5c\x16\x93\x85\x47\x56\x02\x35\xfe\x44\xb5\x98\x3f\xdb\x4e\x82\x77\x7b\x1e\x69\x20\x4e\x13\x66\xf5\x7e\x5d\xed\xed\x2a\xa3\x14\x5b\xfa\x25\xc9\x4c\x78\x6a\x39\xe3\x14\x77\xf6\x55\xe0\xa0\xcc\xe4\xa0\x44\x53\x10\xfe\xd6\xce\x29\x00\xde\x93\xcc\x37\xfe\xb3\x48\x85\x82\x48\x1d\x1e\xf4\x42\x57\x28\x17\xfa\xb5\x1b\xd6\x12\x15\x57\x51\xf5\x11\xb0\xef\xa5\x12\x67\x59\x6c\x72\xdb\xd8\x28\xc3\x26\xc7\x9a\xbe\x80\x17\x15\xdc\x8a\x68\xed\x53\x3f\xbf\x50\x3f\x2a\x8e\x58\xb3\x27\x59\xbe\x17\xa8\xf8\x18\x67\xf7\xba\x00\xf6\xe3\xec\x03\x3e\x61\x2f\x4f\x95\x07\xf7\xdd\x0c\x44\x15\x9c\x0e\x48\x04\x4a\xfa\xaf\xd3\xb0\xeb\x43\xbf\x08\x58\x17\x3a\x20\x83\xa3\xff\xce\xc3\xe7\x37\x5e\xc3\xd5\x96\x17\xec\x1e\xf9\x9f\xf1\x67\xeb\xa5\x70\x71\x7d\x6b\xbe\x2c\xa7\xe0\xe5\x9a\x5d\x31\x3f\x88\x2e\x91\xe1\xde\x42\x7c\x72\x48\xbd\x2c\x7f\xe1\x0c\xaf\x94\x1f\x0c\x7c\xaa\x27\x93\x95\x23\x53\xc2\x57\xcb\x0f\x6f\xe1\x41\xc2\xc6\xf3\x51\x3d\xcb\x1b\xbb\x6b\x51\xab\x09\x80\x1b\xbc\x03\x3c\xee\xab\x1a\xc4\x61\x12\x9d\xe9\xe9\xa8\x9c\xa2\xc2\x30\x45\x7b\xbc\xe3\x89\x11\xb8\x5f\x5e\x87\xbe\xd8\xc3\x85\x0b\xa8\x98\x60\x1a\x46\xa0\x7b\x5c\x02\xb5\x46\x18\x66\xcd\x63\xca\xdd\xa9\xf4\x29\xe7\x92\xbe\x34\x3c\x84\x30\x4d\x21\x20\x41\x4f\x40\x46\x92\x72\x94\x74\xb4\x79\x2e\x47\x40\x85\xc0\xc1\xf4\xef\x94\x16\x2e\x89\x2d\xbd\xc2\x32\x49\x68\x9e\x14\x03\x17\x46\x10\xad\xa5\x21\xeb\xef\x1f\x83\x4b\x43\x2f\x00\x75\x84\xe1\xab\x73\x81\x5e\x19\x2a\xd1\xff\x00\xc1\x9f\xe0\xf1\x80\x1a\x4b\x03\xc0\x3d\x9f\x45\x1f\xac\xf8\xa9\x8e\x2c\xd4\xfb\xe5\x2b\xb6\x8e\xd8\x46\x4a\x26\x4f\x81\x59\x90\x77\x84\x86\x3e\x4e\x5d\x85\x0a\x2a\xa5\xd0\x4b\x86\x21\xe7\x4b\xe7\xfb\x9e\xe9\x14\x8f\x7d\xda\x0f\x82\xe8\x1d\x4b\xb1\x10\xec\xaf\x08\xbb\x3d\x10\xfd\x31\x5e\xb8\x24\x0b\xf7\x08\x0d\x33\xfb\x2c\x55\x2e\x88\x26\x0a\x66\xa9\x37\xf7\xb8\x01\x3a\xef\x30\x80\x76\x12\x58\x2b\xd3\x38\x3e\x86\x0e\xb4\x35\x05\xb1\x12\xea\x23\x9a\x60\x4a\x9a\x25\x6d\x25\x3e\x9a\x15\xa7\x17\x9c\xc9\xf4\x27\xe0\xb7\xb5\xd5\xad\x27\xfa\xcd\x76\x20\xe4\x62\x40\xb6\x31\x42\x01\x9c\x68\xa9\xdc\x9c\x71\xf9\x7b\x80\xca\xba\x00\x95\x14\x59\x5c\x60\x00\xfe\xf8\x77\xd5\x28\xd6\x90\xc8\x0e\x65\x17\x81\x37\x36\x7a\x3f\xae\x23\x6d\x7a\x1d\x14\xee\x50\x5b\xb4\xf8\x4f\x3c\xb3\x9b\x93\xb4\xfc\x5a\x85\x16\xa9\xaa\x9c\x49\xfe\x1b\x77\x79\xb9\xa2\x0b\x6e\x24\xff\x32\xc3\x07\xa7\x7a\x7f\x6c\xbe\x58\x3e\xfa\x24\x2c\x37\x6c\x25\x1f\x3b\x8d\x93\xa0\xb0\xaf\x38\x15\xdc\x2e\x8a\x2d\x01\x8d\x7f\x3d\x94\xc1\xef\xd5\x19\x2f\xa0\x9c\x3c\x32\xeb\x40\x60\x7f\x57\x4b\xe6\xc0\x53\x1b\x93\x1d\x92\x27\x32\xea\x04\x64\x6f\x00\x94\x49\x06\x68\xf6\x02\x31\xa7\x01\x88\xeb\xec\xdc\x86\x2c\xb7\x10\x21\x25\x09\x94\x2d\x92\x81\x52\xb3\x23\x57\x7c\xfe\xbd\xd1\xac\x57\x3d\x2e\xf8\xfd\x5c\x91\x98\xb4\x73\x2e\xff\x8c\xc8\x7d\x32\x4a\x49\x63\x34\x20\xda\x03\xd4\x84\xf9\x3b\xbe\x9a\xed\x7b\x58\x1e\xf0\xfc\xa1\x7c\xd6\x4a\xeb\x95\xdd\xd8\x19\xdc\x07\xfc\x84\x53\xd8\x92\xa7\x64\x6c\xb1\x8a\x1d\xce\xbd\x55\xd3\x54\x1f\x4c\x57\x3f\x70\xbd\xc0\x75\x93\x8f\xd7\x86\x7b\xda\x0d\x8c\xc3\x27\xe4\x69\xae\x91\xcc\x23\x46\x41\xab\x12\x45\xeb\x8b\x9f\x7e\x8f\x9e\x22\x21\x6a\x23\xb3\xb2\x6f\xd9\x09\x4d\x3f\x47\xb6\x26\x9d\xa0\xbf\xab\xc0\xd2\xe4\xe3\xf9\x4d\xe3\x44\xa1\x99\x70\x70\xf3\xb8\xc0\x34\xe8\x4a\xc8\xdd\x52\xcf\x02\xa8\x49\xc3\x81\x7b\x20\x94\xc8\x5d\x4a\xe8\x0c\x45\x3b\xfc\x5c\x5c\xcc\x99\xef\x78\xf4\xda\xbf\xba\x15\x9a\x27\x39\xa1\xc5\xea\x09\xa5\x69\xf4\x34\x5f\xdb\xa2\xaf\x62\x02\x62\x0e\x1e\x0f\xdb\x17\xa8\xee\xe2\xa8\x65\xfd\x66\x2c\xe4\x4d\x0a\x01\xf0\x9b\x8e\x7d\xe0\x09\x03\xfe\x1b\xee\x2f\xf8\xfb\x73\xa4\xfe\x90\x4e\x01\xf7\x7a\x7f\x4b\x42\x80\x2a\x26\xb7\x97\x8b\xdf\x2b\x55\x7c\xf1\x0f\xa7\x17\x46\x92\x99\x79\x08\x0e\x74\xf6\x37\x7e\xbd\xa8\x21\xfa\x9e\x81\x4a\x13\x2b\x56\x52\xb5\x9b\x00\x68\xa3\x43\x64\xa6\xec\xc7\x73\xa7\x51\x40\x8f\xdf\xf6\x03\xa4\xd5\x40\xad\xba\x87\x66\xe1\x17\x3c\xf2\x4f\x6f\x1e\x59\x2a\xbb\xc6\x0d\xe5\x61\xdd\x7d\x05\xfc\xa1\xe2\x77\x43\xe1\x09\x74\x6a\xe9\x62\x09\xc8\x4a\x2e\xba\x99\x85\x2b\x3d\x78\xda\x36\x8e\x53\xa3\x86\x2d\x4d\x20\x36\xef\x06\xbc\x4a\x41\x58\x16\x16\xfa\xb6\xf5\x11\x02\x3e\x4b\x0c\x00\x4b\xbc\xc8\xda\x46\x86\x89\x95\xa2\x5a\xe3\xbd\xc9\xc1\xfd\x81\xca\x2f\x39\x24\x72\xcd\xe4\xd2\x81\x54\x44\x44\x2f\x20\x48\x28\x64\x11\x7c\xf2\xf3\x6a\x2f\x83\xb6\xa9\x20\xb0\x38\xe7\xc9\xdd\xe3\x00\x20\xae\xf1\xdd\xb6\x2e\x34\x61\x73\x2c\x35\x67\x4b\xda\x4d\x5a\x80\xae\x30\x61\xd4\x85\x1b\x51\xe9\x85\x72\x2f\xd8\xd4\xb0\x86\x55\x65\x17\x7d\x9b\xbf\x12\x7a\xc0\xdb\x8b\x26\x60\x93\xd8\x0c\x10\x73\x9f\x08\xfb\x10\x33\x21\x3b\x04\x84\x84\x38\x7d\xd5\xb8\x29\x6d\x17\x55\x65\xef\xcf\xcd\x69\x6d\x30\x10\x53\xe7\x5a\x7b\x03\x72\x28\x5c\xa9\xb5\xa7\x59\xef\x0e\x6c\x50\x0a\xd5\x57\x2f\x91\xea\xa9\x7f\xae\x95\x80\x77\xae\x18\x47\x49\x9a\xb1\x9e\xe5\xda\xbe\x7b\xa9\xde\xfb\x1b\x65\x86\x74\x8d\x13\x2b\x55\xec\xe4\x9f\x62\xd6\xee\x0a\x1c\x7d\x45\x7c\xa2\x61\xb8\x45\x9e\x3c\xa3\x4f\xa7\x00\x79\xc4\xee\x72\xf3\x03\x4b\x56\x1b\x57\x82\xf3\xda\x49\xa1\xf1\x44\x09\xc8\x90\xfe\x1d\xf6\x4c\x93\x7e\x50\x30\xfd\xa6\xe7\x62\x67\x68\x6c\x27\x92\x4b\x25\x63\x9f\x94\x10\x91\x5e\x20\xce\xdd\x7e\x25\x80\x1c\x23\x1a\x0f\xe3\x07\xa4\x6f\x4a\xcf\x8b\x8c\xd7\x67\x9a\x4e\xd1\x25\xf8\x35\x9d\xa2\xef\xfd\x83\x1a\xf2\x44\xb8\xf7\x26\x5b\x30\x16\x64\x35\x28\x79\xc0\x6c\x86\x7e\x0d\xdb\x8d\xc2\x10\xc0\x9b\xe5\xa8\x4e\x4a\x4a\x66\xc9\xb5\xa3\x70\xaa\xd5\xf9\x46\x14\xc1\x2d\x8b\xb0\xa5\x27\x15\x74\x65\xab\xec\x09\xc3\xd3\x5f\xaf\xf8\x34\x55\x23\xc3\x27\x36\x8d\x48\x92\xf7\xb3\x0d\xe7\xf3\x72\x64\x76\xbd\x9b\x14\x27\x60\xcf\x7e\xe5\xbe\xa8\x9f\x46\xcd\xc3\x1b\x99\x22\x75\x96\x8d\xba\x32\xee\x25\x50\xcf\xa3\x08\x9f\x80\x4b\x55\x1d\x25\x94\x24\xb2\x7d\xca\x76\x4f\x95\x28\x9f\xfb\xf4\xfc\x1c\x11\x48\x6a\x7f\x1f\x3c\x07\x4f\x16\xe0\xaf\x13\xa8\x4c\x61\x86\x7b\x50\x0d\xb4\xd8\xbd\xd9\xe7\xc9\xdd\xc5\x2a\x37\x2e\xcd\x32\x86\x24\xcc\x26\xbf\xd7\x46\x61\x33\xe5\x3e\x18\x87\xf3\x7e\xe6\x18\x9b\xed\xb9\x33\x3f\xc1\xed\xd5\x43\x22\xad\x7e\xbc\xbb\xa0\xb2\xee\x02\x48\x12\x40\x74\x57\xd4\xc5\xcb\x45\x30\x6e\x45\x02\x93\x30\x2f\xb2\x2f\xa1\x52\xe7\xc9\x47\x01\x48\x9a\x80\xb2\xd5\x57\xee\x31\x9e\x7b\x28\xe3\x65\x54\xab\x73\x5a\x8d\xe4\x9b\x3d\x57\x39\xd2\xad\xcd\xd4\xe2\xab\x2d\x14\x7e\x49\x57\x4f\x59\x2d\xd0\x99\xef\x46\x9e\xd2\x63\x7f\x03\xb0\x2d\x3f\xdf\xd7\xbd\xe6\x2a\x2f\xf4\x28\xcb\x84\xc7\xb3\x9a\x9e\xc0\x00\x14\x10\x66\x63\xba\x70\x8c\xe5\x03\x0a\x4f\x0c\xfd\x04\x63\x6f\x93\x28\xf0\x15\x8f\x1e\x7b\xe1\xe1\x8c\x1a\xdd\x91\x61\x19\x63\xfd\x18\xad\x66\x8c\xfa\x3a\x47\xc3\x8c\xdb\x15\x6f\xcb\xc7\x1a\xea\xe4\x67\xf6\x0b\x35\x01\x97\x17\xe1\x07\x53\x0f\x64\x31\x7a\x9f\x61\x52\x10\x96\xfd\x56\xfc\x57\x46\xdb\xcf\x87\x84\x72\xdb\xa6\xda\x33\x4a\xcf\x57\x74\x2e\x30\x14\x1a\x92\x37\x98\xa0\x22\xae\xf1\x70\x7e\xc6\x71\x77\xcb\x48\x92\x03\x8f\x84\x24\x81\x23\xe6\x50\xdf\x7e\x6f\xdd\x92\x50\x95\xd9\x21\x39\xae\x58\x5a\x66\xc8\x05\xad\x7d\x16\x86\x49\x26\x06\x1c\xb6\xf5\x14\x78\xf2\x03\x56\x1a\xa5\x5c\x3c\x07\x5d\xd4\xc3\x2f\x2b\xa0\x6a\x31\x40\xe2\xef\x30\xaa\xfa\xe1\xc9\x82\xc5\xa7\xaf\x9a\xa7\x48\xef\xf5\x15\x63\xa2\x18\xe8\x9d\xd5\x0f\x9a\x64\x68\x17\xd1\x85\xfe\x22\x59\x1d\x6e\x0c\x51\xf6\xfb\xbf\x73\x41\x00\xe7\xef\x6d\xcf\xfc\xad\xd8\xd3\x62\x76\xeb\x98\x0b\xfc\x0c\x0c\x07\xbf\x6a\x50\xbc\x27\xf0\xe3\x50\x73\xaf\xa7\x08\x1b\x02\xea\xdd\xeb\x89\x19\x69\x70\x98\x3e\xb2\x6b\x92\x00\x28\xbc\xb0\x7a\x9d\x98\x85\xba\xb0\xb1\x7a\x4a\xd4\x07\x6b\xd3\x24\x45\x66\x23\xf0\xe4\xac\x96\xca\x36\x28\x11\x69\xa3\x0e\xd7\x86\xa6\x33\x0e\x95\x0b\x6a\xd6\x3f\xf9\x1a\x91\xdc\xc2\x73\xa8\x8b\x5d\x24\xb2\x19\x8e\x4f\x59\xc2\x31\x7c\x11\xcb\xab\x6b\xb6\x18\xa6\xa6\x67\x10\xd3\x2f\xcb\xea\xcb\x65\x9a\xa0\x4d\xb8\x3e\xb1\xe2\x47\x94\xfa\x79\xec\xad\xba\xb3\x26\xe6\x3d\x6e\xcf\x68\xa5\x76\xbf\x01\xc7\x1c\x8e\x4a\xfa\x7e\x73\x0e\x63\xa7\x07\xe3\xd2\xbf\x81\xe2\x2b\xe7\x29\xff\xed\x9d\x7c\x20\x50\x66\x18\x69\xaa\x5d\xd5\xa0\xd9\xd7\x2b\x89\x55\xfc\x50\x55\xbb\x13\xcf\x6e\x21\x60\x7b\x01\xf5\xe2\xe1\xdf\xbd\xea\x0a\x7f\x54\xc1\x04\x78\xb3\xd9\x0a\x0e\x24\x5b\x56\x6c\x42\x31\x94\xc4\x03\x96\x86\xb9\x62\x06\x53\x51\x85\x89\x28\x69\x46\x34\x67\xff\x9b\xfd\x50\x66\x93\x71\xa9\xf9\xbc\xe5\x11\x60\x9c\x69\xb2\x56\xcc\x23\xf5\xa7\xa7\x5f\xd9\x88\x8d\x6e\x5d\x5b\x6a\xe8\x01\xd3\x75\xc8\xd4\x6b\x10\x0f\xd2\xaf\x62\xff\xbd\xee\x7b\x69\xcd\x9f\x75\x9a\xc3\x3a\x43\x9a\x03\x66\xbb\x0b\xc2\xe5\xce\x0c\x68\x1e\x05\xcf\xc9\x3f\xdb\xb3\x9a\xe0\xe7\x2f\x45\xfc\x55\x15\x54\x72\xf1\xfd\x14\xfd\x25\x20\xc0\x61\xb2\x21\x9c\xc4\x23\xd9\x8a\x7a\xdb\xfc\xf1\x81\x7e\x6c\x0d\x1e\xda\xbd\x5e\xa9\xdc\x66\xea\x6d\xa8\x29\x8e\x97\xf8\x7d\xee\x68\x5f\x20\x28\xf0\x2a\x31\xdc\x53\x4c\x43\xc2\x5b\xdf\x70\x7b\x0b\xd8\xaf\xed\x97\xa4\x95\x1a\x2b\x2c\x17\x0b\xd4\x32\x88\x8b\x96\x00\x19\xbb\x0c\x02\x9e\xe3\xc7\x2d\x69\xba\xcc\x67\xae\x7b\xc8\x57\x8d\xb2\xd0\xd2\xc9\xc9\xb5\x04\x08\x4f\xe6\xd2\xcc\x70\xa1\x57\x53\xf1\xde\x42\x72\x2b\x7a\xd8\xb2\x7b\xff\x72\x57\x84\x29\xa5\x17\x65\x95\xd4\x1b\xed\xae\xe8\x2e\xf5\xd9\x16\x40\xdb\x37\x7e\xbd\xfb\x6f\x32\xf8\xdd\x61\x08\x1a\x9f\xcc\xe9\xf3\xa8\x09\x22\xf7\xd2\x40\x30\xb9\x71\x91\xa4\x46\xbb\x07\x82\x1f\x7a\xfa\x91\xa7\xde\xfe\x74\xa1\x1e\x9e\x4e\xe7\x75\xc7\x75\x73\x21\x66\x0b\x75\x9b\x3f\x5d\xe2\xcc\xad\x41\x22\x4f\x98\x5f\x80\xdc\x4f\xb0\x4f\x22\xa0\xf8\xbc\xc8\xcc\x7c\x54\x45\x5a\x45\xaf\x88\x04\xa1\x62\xd6\x19\xdb\x32\xf2\x0a\xb7\x8c\x6b\x0e\xba\x50\x7d\x5a\xaf\x32\xd6\x9f\xa9\x51\x6c\x02\xa4\x64\x44\x1c\x89\x71\x5d\x99\x22\x32\x78\xb5\x38\x93\x06\x91\x07\xbb\x70\xe8\x8a\x90\xe1\xaa\x2d\x52\xbf\x8e\xb6\x6e\xc4\x20\xfe\xf1\xc9\x22\xd4\xf2\x68\x57\xd3\x97\x17\x1f\x2e\x17\x1f\xb6\x46\x3b\x4d\x53\xbc\xfc\x9f\x07\x43\x89\x6c\x43\xfc\xa7\xb3\x9b\x65\xeb\x27\xd9\x07\x06\xb4\x5a\x1b\x7f\xd6\x5a\x95\x2f\x6d\x18\xbc\xc2\x81\x99\xcf\x73\x1a\x87\x0c\xce\xcf\x22\x85\x23\xbb\x58\xb8\xe2\x67\x98\xe0\xd9\xe4\x42\x35\x78\x09\x1d\x8c\x6f\x9d\xbf\x66\x76\xa5\x4b\x16\xbe\xc7\x51\x12\xe0\xe7\x6a\xe2\x85\x02\x61\x4c\x17\x5f\xda\xe7\xfa\xe7\x33\x99\x75\x01\x3d\xfd\xfa\xe5\x68\x7e\xb2\x05\xf8\x0f\xdc\x74\x3c\x9b\xef\xf4\x78\xfe\xb6\xc7\x05\x7b\x75\xd6\x8f\x10\xbf\xbf\x1e\x8b\xce\xa3\x4d\x2c\xd4\x08\xd5\x0a\x19\x5c\x82\x7a\xf9\xfc\x1d\x5f\xf2\x01\x22\x83\xab\x9b\x4d\x47\x80\x26\xd9\x99\xed\x5f\xed\x2f\xa6\x5f\x7b\x06\x50\xc4\x6c\xdc\x22\x84\xad\x11\x8d\xb6\xc7\xe4\x40\xb7\x7f\x84\x60\xa1\x7e\x50\x42\x35\x03\xc7\xe0\xa5\x9f\xd4\x21\x22\xab\x8e\x51\xf3\xc9\xb5\x6e\x95\x89\x8d\x00\x32\x87\x7b\x02\x0d\x6f\xdf\x9f\x0e\x10\x78\x82\xcf\xad\x65\x35\x76\xed\xcc\xc8\x92\xba\x2d\x90\xb7\x5c\x8e\x31\xf8\xfb\x21\xc8\xcc\xfa\x54\x63\xf2\xfa\x72\x75\x30\x12\xb2\x46\x0e\x4c\xf6\x40\xa1\x58\xac\x95\x3c\x7c\x7f\x93\xcf\x42\x0b\xd9\x2a\xd3\x4d\xf9\x8e\x82\x9f\x96\x6c\xdb\xc5\x24\x9f\x93\x3b\x8f\xa2\xf3\x55\x06\xd4\x52\x2a\x59\xb7\x0e\xd8\x84\xed\x95\x9a\xa4\x8a\xe0\x63\x30\x89\x98\x74\x74\x34\x47\x7b\xba\x0b\xbb\x4b\x05\x2b\xd8\x69\x89\xf8\x0f\xe2\x44\x1b\xdd\xe0\x64\x2a\x4e\x03\x3b\x92\xf9\xfb\x1e\xdc\xdd\x75\xeb\xab\x5d\x43\xa0\x4d\xd0\x05\x32\xe6\x7d\xa8\xab\x83\xda\x85\x71\x44\x05\x01\x3f\x12\x3b\x2a\x69\xd1\x40\x57\x84\x78\x9d\xc0\xb2\xa3\x2d\xf6\x6c\x80\x1e\x61\xc2\x8e\x28\xa1\x0e\x7f\x75\x8f\x50\x6d\x8d\xd7\xdc\xc4\xb0\x28\x36\xe2\x72\xcf\x95\xbd\x7d\xb5\x8f\xe7\x07\x8d\x66\xd9\xa6\x85\x4d\xb0\x28\x07\x17\xcf\x19\x78\x07\x16\xe0\x34\x88\xfa\x6f\xc8\x75\x30\x3f\x4b\x5c\x15\x01\x8e\x40\x4f\xda\xda\x15\x35\xf9\x4c\xd3\xf2\x7b\x1f\x51\xd0\x52\xc5\xa3\xf7\xc9\xbb\xdf\x36\x2f\x1e\xf5\x32\x21\x89\xfe\x6c\x63\xa1\xba\x6b\xd8\xd9\x0a\xef\xa8\xb0\x2a\x24\x68\x56\xb9\x26\xfa\x1d\x81\x43\x99\xb2\xc4\xd7\xa3\x8a\xfb\xf9\x88\x65\x04\x35\x2f\x97\x60\x8b\x5d\xd1\xec\xfe\x47\x68\x7c\xd6\x73\x90\x21\x7f\x7f\x0b\xa8\xa5\xa7\x73\x0a\x6a\x5b\x7d\x1e\xaf\xa7\x1b\xf6\xd7\xc8\xe2\xaa\x50\x2b\xc1\x37\xff\xf2\x39\xdf\xa5\xf9\xea\x0c\x98\x04\xfb\x25\x92\xe7\xb3\xa2\x22\xad\xc3\xb8\x04\x0a\x8c\x68\x24\x3d\xb5\x73\x98\x1e\x15\x7c\x6f\x13\x5c\x7b\xaf\x59\x7d\xb8\xc1\xac\x77\xcf\x3a\xd8\xe1\x8b\x37\x14\xa6\x42\x81\x74\x7f\xed\xbe\xd9\xdd\x1e\xa7\xc0\x7d\xdd\x00\x5d\x59\x05\xce\xfc\x96\x4f\x2e\x09\xad\x88\x14\x22\x96\x4e\x33\x70\xef\xd7\x9c\xee\x5a\xe2\xf7\xda\x69\x63\xf6\xd7\x19\xbe\xa0\x9a\x18\x67\x62\xa4\x16\xb1\x72\x4d\x25\x16\x8f\x67\x06\x8b\x75\xda\xa1\x82\xd1\xbf\x91\xe5\x97\x0a\x7e\xf3\x8d\x95\xe6\x3b\x30\x96\xb0\x4f\x62\xb5\xc9\x18\xa4\x36\x69\xd8\x30\x70\xa7\x3f\x3f\xe7\x0b\x33\x2a\xd1\xe5\x7f\x80\xb6\x1c\x11\xaa\xf2\x6c\xc5\x47\x53\xfb\x6e\x21\x6a\xba\xd9\x2c\xd5\x35\xa5\x4b\xcd\xeb\xcb\x7a\x53\xe2\xb5\x8b\x14\x02\xe5\x7a\x0a\xf5\xc0\x0f\x45\xf9\x25\xee\x31\x41\xe3\x4b\x89\xf3\x02\xc1\xe1\xc5\x6d\xdb\xaf\x29\x6b\xe1\x11\x35\xb7\x77\xaf\x77\x95\x4f\x93\x63\xce\xe4\xad\x53\x93\x00\x5d\x7e\x28\x45\x26\x5b\xa8\x48\x4f\xd2\xf4\x3e\xb3\x2e\xec\x61\xbf\x33\x03\x2f\xc4\x6a\x6f\x07\x07\x66\x89\x1c\xc5\x27\x1e\xef\x69\xcd\x70\x01\x5d\xd0\x5b\x07\xa5\x0b\x66\x0a\x75\x55\xb0\xa6\x95\x06\xb1\x43\x8b\xfe\x71\xa1\x52\xa3\x72\xe4\xfb\x68\x8d\x7a\x82\xca\x10\xa9\xa3\xc9\x72\xc2\xc4\x53\xe0\xd5\x9d\x85\x86\xc6\x7c\x15\xa1\x81\x3b\xf5\xaa\x05\x7d\x30\xc5\x56\x0d\xf7\x38\xff\x7b\xb1\xc3\xeb\x28\x4c\xd7\xe5\x49\x62\xfd\xbd\xa7\x53\x73\xd7\xc7\x94\xc0\x8e\xc1\xe7\x2b\x1d\xdf\x8b\xdc\xf5\xc8\x96\x90\xf8\x23\xd2\x13\xb3\x2c\xfa\x0f\xf1\x85\x6d\x95\xfb\x38\x00\x3a\xc7\x57\x01\x50\x68\xbd\xdf\xf0\x1f\x26\x88\xbf\x8b\x6c\x84\xef\xd2\x21\xaa\x4b\xbd\x18\x1f\xbf\x9c\x04\x09\xf6\xef\x9e\x06\x8e\x4c\x32\xc0\x0e\x05\xa0\xb6\xd7\x07\x03\xf4\x95\xac\x23\x0f\x5b\x37\x80\x6b\xbf\xd8\x80\x99\x87\x0c\x4c\x63\xab\xfc\x00\xfa\x55\x8f\x90\x86\x8c\x05\x03\x2e\x0a\x6b\xa9\xbe\x20\xa0\xfd\x63\x30\x5a\xaf\x0f\xb3\x24\xb6\x05\x60\xb9\x48\x78\x04\x70\xfa\x26\xf6\xc9\x53\xfd\xdc\x39\x8c\x26\x05\x0e\x52\xac\x79\x10\x62\x50\x29\x25\xdd\x38\x00\xc3\xc2\xdc\x5f\xee\x53\x68\x0a\x7c\xea\x1b\xb8\xcd\x99\x2e\x57\x45\x94\x4d\x2e\xec\x71\x10\x5a\x73\x6e\xc9\x12\xfb\x8b\x89\x3c\x78\x29\xc1\x15\x63\x2e\x63\x74\x39\x8b\x2d\x7d\xba\xb3\x64\x04\x20\xf1\x69\x06\x84\x23\x94\x0a\x5b\x0a\x24\x4c\x44\xda\x93\x2c\x00\xee\x2c\x84\xd3\x32\x5d\x66\xf7\xb6\xd4\xf7\x28\x2d\x38\xbb\x49\x66\x79\x71\xf3\xa8\xb0\x67\x32\x54\xf6\x34\x71\x05\xba\xaa\x5c\x07\xbb\xaa\xe7\x1a\xf1\x3c\x78\xce\x5f\xe4\x2d\x13\x47\x45\x19\x88\xc5\x55\x81\xf8\x14\x1c\xc6\x82\xe0\x72\xaa\x67\xa7\xfa\xbc\x41\xca\x16\xdf\xb7\x91\x5f\x9a\xfe\x85\x77\x14\x4a\xb3\x71\xfe\x1e\xfc\x04\x2d\xfa\xcc\x8d\x59\xa6\x19\xe4\xac\x6f\xf8\xe1\xdd\x0c\x5e\x9f\x6d\xe7\xb3\x2b\xe0\x30\x71\xe0\x43\xf7\xf4\x3a\x83\x3e\x02\x4d\xa5\xe0\xeb\xf0\x21\x46\x47\x3c\x87\x68\x77\x1c\xa9\x07\x61\x8c\x85\x05\xdd\xe2\xa5\x1a\xe8\xbc\x71\xab\x50\xe3\x5a\x7e\x6e\x75\xbe\xfa\x75\xd7\x38\xe6\x01\xba\xea\x99\x47\x36\xb2\xf0\x05\x46\x8a\x9a\x31\x57\x25\x88\x8d\x2a\xc8\x19\x4b\xe9\x6b\xd9\x23\x93\x66\xa0\xd7\xa8\x79\x9d\x77\xc5\x39\xf0\xc7\x0e\xf0\x88\x98\x72\x76\x11\x4e\x13\x37\xf7\x75\x80\xd2\xcb\xcd\x3b\xc9\x1c\xf1\xd9\x21\x45\x31\x96\xe8\xee\x5b\x39\x45\xe0\xaf\x5e\x9a\x85\x53\x33\xc8\x0c\x0c\x02\x6f\x74\xcf\x30\xa3\x5f\x28\x00\x58\x0b\x0b\x97\xe8\xae\xd7\x17\x29\x02\xde\x99\x7d\xc9\x51\xae\x5a\xb1\xd4\xfe\x92\x30\x4e\x3f\xef\x1a\x3f\x91\xc5\x1a\x4d\x1c\x67\xe8\x6b\x9f\x2e\x80\xb4\xec\xe7\xe6\xbe\x84\x07\x61\xb3\xf5\x4e\x52\x45\xb8\xe9\x03\x70\x55\x5c\x07\xea\x23\xcd\x2e\x78\x2a\xe5\x0b\x3f\x33\xe4\x63\x44\xf3\x32\xb8\x87\x74\xb9\xa4\x26\x74\xeb\x9c\x16\x79\x50\x4e\x77\xd3\x7e\xa4\xe2\x89\xdc\xb3\x36\x65\x16\x3a\x20\x39\xd2\x9c\xc2\xd3\xee\xb9\x6b\x93\xfa\x6e\xbb\xf4\x8e\x75\x33\x91\x00\xe2\x4a\x42\x9c\xa2\x4f\xfe\x29\x7c\x7d\x2e\x46\x35\xa1\x44\xb9\x51\xea\x34\xb8\xd7\x3e\xf5\x8a\xeb\xbb\x3a\xab\xc6\xcc\xf4\xb6\x75\x18\x49\xf1\x71\x65\x5d\x31\x4a\xcf\x5b\x26\x4d\xd4\x68\xdb\x9b\xc3\xbd\xa3\x2e\x1c\x0a\x3d\xf7\xc3\x73\xb7\x63\x6b\x5c\xab\x21\xc5\x34\xed\x79\x05\xe1\xb2\x75\x26\x2b\x46\x8a\x4c\xb9\x3f\x71\x50\x71\x41\xec\x18\xaa\xce\x93\xf7\x80\xe0\x3d\xb6\x24\xb4\x66\x1e\x4f\x40\xb7\x41\xfc\xe6\x10\xc5\x95\xe5\xfc\x9d\xd1\x84\xb6\xbb\x1d\x2b\x20\xbd\xf5\x02\x59\x6e\xe8\x00\x4d\x90\x25\x29\x89\xc8\x90\xd3\xf1\x60\xa8\x58\x22\x2d\xf2\xbe\xfe\xc9\x0c\xd6\x39\x4d\x00\x8b\xf1\x2b\x49\x6f\x61\x73\x8d\x94\x69\xe1\x4b\xf0\x53\xe7\xc8\x0a\x7e\x2d\x3b\x22\xf4\xac\x6c\x8a\x4f\x09\x3e\x95\xc2\x2c\xbc\x6d\xd3\x12\x2c\xaa\x29\x2a\x39\xe4\xca\xf7\x10\x92\x0e\xc3\x95\xfb\xe2\x1e\x0c\xee\x98\x16\xbc\x8b\x42\x64\x18\xa7\xd6\x28\xde\x83\xea\x47\x5b\xfe\x11\x94\xe5\xa9\x22\xa4\x17\x9f\xd1\xba\x32\xb6\x39\x22\x1a\x08\xc4\xa6\xce\x4b\x62\x35\xd1\xfd\x77\x90\x70\x0b\x93\x0c\xed\xf5\x2b\x22\x1c\xad\xea\x3d\x0a\x9f\x75\xa2\x41\x07\xb0\xd0\xd5\xe7\x49\x37\xe7\x7a\xd7\x67\x88\x69\x67\x4e\x94\xa1\xf3\x5e\x43\xc5\xf0\xe9\x74\x01\x7d\xb4\x5e\xbf\xf7\x55\x91\x27\x52\xd4\x8b\x11\x3d\xf6\x4d\xc0\x81\x60\x5c\x73\xd5\x37\x6b\xe4\xc7\xdd\x87\x89\x79\x2f\xf1\xd7\x00\xb8\xaa\x06\xe0\x2a\xa6\xcf\x9f\x78\x0b\x41\x80\xa6\x66\xb7\xbf\xa8\x33\x3a\x99\xf5\x93\xfa\xb8\x86\x85\xf2\x63\x59\xd2\x5a\xc7\x04\xa6\x0f\xbe\x4c\xdd\x58\x99\xaf\x3f\x11\x64\xa3\xd0\x1c\xa3\x8c\xbe\xf9\x6d\x18\xf5\x09\xb8\x34\xc6\xf4\x0f\x63\xae\xc3\x4f\xe5\xde\xdf\x38\x18\x54\x18\xfe\xc5\x2b\xae\xea\xf0\xf8\x06\xe2\x17\x65\x85\xcd\x45\x44\xaa\xd2\x62\x01\x0d\x58\xf7\x21\x6d\x7f\xf0\x2c\xf9\xca\x2e\xa3\x5c\x45\x2b\x44\x17\xfa\xa0\xa8\x9c\xf5\x60\x4d\x35\x26\x3b\xc6\xc0\x65\x6e\x6f\xc3\x4f\x4a\x3f\x66\xa0\xd8\xc0\x36\x4b\xd6\xf6\x47\x52\x7d\xd6\xed\xbd\xdb\xb2\x40\xb5\x2e\x43\xc6\x54\x55\x73\xf7\x36\x3d\x05\xf3\x6c\x8c\xb1\x13\xea\x51\x60\xa1\x37\xeb\xbe\x72\x69\xd9\x8e\xb5\x8a\x4c\x4d\x7f\x5e\xcd\x63\x54\xba\x17\xb8\xac\x25\xd0\x63\xa3\x7c\x20\xd4\x06\x3d\xae\x7c\xbd\xba\xdf\x7b\xa9\xea\x53\xf5\x9e\x12\xb8\x80\x14\x91\xd9\xdf\x86\xd2\x04\x1b\x78\x5c\x9e\x87\x39\xc2\x3d\xf6\x92\x4f\x86\xe4\x59\xb7\x1d\xa4\xb5\x3e\x26\x7f\x9e\x2b\xbe\xab\x50\x59\x57\x6c\x5c\x5d\xd6\x29\xbe\x40\x0a\xd8\x07\x48\x03\x82\x1c\xfd\x12\x78\x3d\x23\x1c\xf6\x59\xb2\x0f\xcb\x7c\x2e\x96\x21\x93\x08\x43\xa5\xc1\x37\x00\xd8\xb0\x56\x4f\xd4\x66\xe2\x9a\x31\xe3\x19\x23\x96\xdf\x68\xf8\x34\x8e\xd2\x49\xd1\x95\x0c\x94\xe8\x2b\x7c\x1f\x7b\x17\xe9\xfc\xe3\xca\xd6\xce\xa2\xd7\x21\xea\x9c\xcc\xb6\x98\x8d\x7d\x00\xe9\x1b\xaf\x74\x42\x37\x04\xca\xb5\x41\x12\x09\x12\xbc\x2a\x14\x62\x8b\x21\x28\x5e\xe4\x00\xd2\x11\x32\x99\x1d\x56\x2e\xe3\x7c\x31\x72\x12\xfb\x56\x22\x7e\x5c\xc3\x06\x7c\x98\xfd\x9e\xed\x35\xf5\xf5\x17\xff\x1d\xe4\x69\x4a\x3b\x12\xd8\x12\x2c\x15\xdb\x13\xc4\x00\xe5\xdf\xc7\xf2\x7d\x7d\x15\xc2\xd3\x85\x82\xe1\x8c\x56\xdb\xcf\xf0\xe6\x89\x68\xfc\x9e\x78\xcb\xf4\xdb\xc7\xa2\x7f\xca\xfb\xbc\x50\xb9\xc9\x9c\x2d\x30\xac\x63\xd1\x1d\xe6\x29\xfb\xe2\xbe\x28\xfc\xcf\x7b\xd4\x5c\xd9\x93\xb7\xff\x7c\x1c\xfe\x8c\x4f\x06\xad\x16\xa4\x8c\x27\xb2\x4c\xb4\xef\x86\x0f\x7b\x1f\xd3\x8f\x83\xa0\x72\xbb\x67\xbc\xfe\xc2\xb4\xe3\xfb\x21\x4b\xbb\x0f\x29\x53\xba\xa8\xb7\x09\xf9\xb1\xb7\x06\xf0\x45\xa2\x5a\x3f\x7c\xc2\xf0\x62\xe1\x80\x2f\xd3\x50\xbd\xb2\x89\xcc\xb6\xe1\x92\xcc\x21\xd8\xdb\xa7\x10\xe5\xfb\x7e\x77\x40\x14\xfd\xc7\x76\x82\x87\xe7\x9a\xac\xee\x57\xc5\xdc\xdf\xe2\x46\xad\x06\xfd\x5e\x49\x06\xb5\xa3\x16\xc4\xe9\x07\xc4\xa9\x4b\x4d\x94\x98\x35\x0b\x7f\x45\xaf\x1d\x70\x22\xf2\xf9\x88\xb3\x70\xdc\xdb\x23\xb0\x70\xf8\x02\x56\x97\xed\x34\x32\xac\x69\xe5\x22\x83\x1f\xfa\x43\xc5\xd0\x67\x99\x32\x1b\xee\xf9\xfe\x30\x65\x57\x64\xf4\xd5\x82\x3b\xe0\xfd\x5b\xc1\x38\x86\xd0\xcb\x74\x8f\x13\x7c\x51\x0d\x7f\xa3\x79\xc8\x2c\xc1\xf7\x78\x03\xfb\x2b\xbd\xc8\xfc\xca\x8a\xec\xbe\xb6\x76\x33\x65\x60\xbe\x62\xb9\x1a\xc0\xa3\x77\x6b\x7b\xcd\xc7\x8f\x30\x64\x20\xc7\xa3\x52\x45\xa8\x92\xd9\xd2\x03\x4a\xa9\xa0\x37\xb6\x6f\xde\xab\x48\x7f\x73\xd2\xd8\x11\x33\x6e\xf7\x17\x6a\xbe\xdf\x25\xde\x3d\xc9\xaa\xc5\x22\x1c\x80\x2e\xd7\xce\x29\x9e\x44\x3f\x3b\xa6\xae\x78\x6e\xd5\x02\x4d\x35\xe1\x9e\x8d\x99\xf1\x14\x86\x9b\xa3\xbd\xc2\xdf\xbd\x21\x3b\xdc\x12\xed\x35\x4b\xd1\xf3\xf1\xe0\x2b\x22\xb5\xeb\xdd\x5b\x4f\x62\x4c\xde\xdf\xe0\x5a\xe9\x27\xf1\xad\x5c\x1f\x09\x75\xf4\xcc\xac\x1e\xa1\xf2\xda\x9c\x64\x3d\xdf\xf0\x14\xc4\x66\xac\x13\xac\x1a\xbc\xbe\x66\xb2\x86\x2c\xac\xce\xae\x99\xc0\x99\x01\x9c\x15\x9a\xf7\x6f\xa0\x23\x9d\xee\x27\xdd\xb7\xbe\xc7\x1e\xef\x81\x76\x4c\x03\xb1\xf8\xe4\x76\xfb\xca\x70\x56\x8f\x8f\xa7\xe5\xf7\x21\x7d\xec\x8f\x77\x7c\xd5\x5a\xd6\x87\x9f\x87\xe3\x3e\x48\x95\x3b\x30\x65\x4c\xce\x79\x93\x85\x43\x69\x3a\xb4\x9d\xbe\x1c\x65\xb7\x7e\xb1\x11\x26\x2c\x87\xc0\xab\x03\x2b\xb1\x2e\x38\x55\xa8\x4f\x41\x54\xf7\x6b\x4e\x0a\x31\x2c\x74\xae\x46\xf2\xde\x03\xb1\xf8\x1d\xe3\x80\xb2\x53\x18\xe9\x6f\xf4\xb3\x64\xbf\x65\x32\x26\x35\x70\x75\xcf\x98\x00\xf9\xea\x57\x8e\x33\x4c\x62\x96\xf7\x7a\xce\x21\x6a\x84\xe8\x69\x8d\xf8\x42\x16\x08\x94\x18\x75\x87\x35\x89\x27\xde\x7d\x29\x9d\x1f\x37\xd0\xcf\x89\x91\x7b\xba\x7d\x9f\x35\x7e\x9a\x7e\x13\x0d\xb0\xff\x9e\x91\xbe\x97\x73\xcd\xcc\x05\x4f\x2e\x21\x91\x02\x06\xea\xb5\xeb\x10\xe5\x33\x7f\xbd\x3b\xe3\x5b\x2c\x41\x64\xab\xcc\x2b\x69\xee\x1f\x8b\xd8\x62\x7d\x6f\x7a\xce\x90\xf9\xcc\x2b\x21\x6f\xd0\xf2\xa3\xbd\x5a\x3a\x9f\x54\x83\xaf\x55\xcc\xeb\xf2\xf7\xdb\x7d\x13\x76\xfb\xb6\xee\xc1\x73\x5c\xe7\xac\x46\x31\x4b\x53\x78\xa1\x00\xcc\xd2\x0f\xd3\x1f\x3d\x24\x04\x1b\x0c\x77\xe9\x7b\x06\x7a\x91\x3f\x61\x7b\x07\x75\x61\x6d\x8c\x46\x39\x41\x79\x67\x3e\x59\x84\x35\x77\x23\xec\x6c\x41\xfa\xed\x79\x12\x5b\x6a\xc4\xb8\x01\x12\x63\xd1\x38\xa7\x79\xc8\xf0\xe0\x52\x94\xd9\x04\x60\x77\x4d\x21\xe2\x36\x3d\x45\x4d\x90\xb3\xf8\x8b\x61\xa6\x0d\x78\xec\x7b\x83\x0a\xf5\xf9\x53\x97\x21\xed\x9e\x87\x65\x55\x8a\x3a\x67\x69\x33\x74\x23\x55\x48\x95\x42\x27\xcb\x11\x2f\xa3\xe5\xe6\xa0\x46\x01\x8f\x0a\x55\x18\x33\xc2\x03\x78\x34\xa0\x26\x9b\x34\xb5\xb9\xe3\x57\xa4\x2c\x14\xc9\x39\x27\x79\xde\x67\x87\x80\xa2\x07\x8a\xeb\x75\x37\x09\x97\xf0\x85\xab\x04\x55\x94\x00\xdd\xf5\xfa\x5e\x2b\x77\x3c\x7d\xe8\xe8\x1e\xfb\x9d\xcf\xf8\x84\xd2\x26\x71\xa1\xe3\xc4\xb7\xa3\xee\x36\x28\x42\xce\x8b\xa8\x14\xc4\x0a\x17\xba\x57\x81\x0b\x77\x5a\x18\xf3\x2d\x68\xf3\x27\xdc\x5d\xb1\xe7\xeb\x78\x71\x7a\x1c\x25\xce\x45\xb3\x10\xf1\x0e\xb1\xe2\xad\xa3\x18\x16\xd0\xee\x50\xf9\x34\x2c\x8b\xb9\x7c\x50\x20\xe7\x9a\xfc\x13\x34\x19\xcf\xf2\x4d\x24\xdb\x7b\xa1\x5c\xd5\x20\x29\xe8\xc2\x49\xc1\x77\x4c\xc5\xc3\x48\xf9\x04\x70\xae\x79\x0f\x53\xbb\x18\xe3\xba\x26\x31\xe8\xfc\x2e\xbe\x25\xeb\xc2\x3c\xe3\x3e\x08\xe1\x5d\x4f\x56\x3f\xb2\x45\x9f\xa2\x30\xf2\x70\x79\x17\xf0\x27\x73\xbe\xb5\x83\x5d\xbe\x03\x4a\xd1\xf9\xbd\x24\x21\x97\x9f\x14\xe6\x41\x1f\x10\x16\x50\x0c\xc4\x54\x6f\xe9\xcf\xaf\x88\xb3\x0d\x8f\x41\x38\x88\xee\x3a\xe0\x0c\xa7\xe6\x2b\x1e\x11\x85\x0d\xa5\x15\xc1\x0b\x36\x20\x36\xd8\x3e\x88\x58\x2c\xfb\xee\x72\xe7\xe3\x93\xc1\x0c\x41\x30\x50\x59\x2e\xd5\x4f\xc8\xf2\x38\x08\xbf\xbf\x7c\xc5\x92\x60\xf9\x0d\xc7\xbb\x55\xf8\x88\x92\xbe\xbc\x29\x8e\x06\xb9\xc1\xfd\xa3\x22\x32\xeb\xe1\xba\x86\x8f\xb0\x70\x5b\x56\x3c\x01\x4d\xa1\x27\xa2\x80\xec\xfd\xb4\xd8\xef\x71\x77\x8c\xe5\xe0\xd8\x4f\xb8\x8f\x92\xeb\xd2\x3d\xde\x00\x65\xe0\x62\x75\xf2\x15\xc0\x95\xc8\xcd\x8a\x32\x9e\x59\x6b\xcb\xb7\x05\xc4\xa1\xf7\xdd\xd0\x74\x2b\xd3\x8e\x92\xbf\x52\x3e\x18\xe4\x59\x89\xed\xcb\xd2\x9c\x27\x7c\xf7\x29\x7b\x64\x39\x77\x23\xd3\xd8\x92\xa3\x52\x13\xc1\x8a\xb5\x98\xb5\xaa\x17\xa8\x3e\xf0\x72\x33\x64\x63\xa1\xbf\x1e\xa1\x66\x1e\x99\xf0\xc9\xfc\xf7\x8c\xb1\xb8\x8b\x3e\x73\xa6\x03\x6c\xa1\x2d\xdd\x95\xd4\xcf\xa8\x81\x8f\x84\xcb\x80\x47\xc7\xd3\x9a\x6c\xa9\x29\x92\x20\xcd\x97\xcf\xbe\x3f\x80\x6c\xc3\xfd\x51\xdd\xdd\xe3\x9f\x88\xb9\xf7\x56\x93\xb3\x0a\x28\x29\x55\xe0\xe9\x6a\x48\xdd\xfb\x3b\x39\x6f\xfc\x64\x60\x1b\x38\xb6\xd9\xd6\xc4\xcf\xfb\x8c\x01\x6c\x15\xf4\x2a\x34\xf3\xac\x34\xca\xe7\xd1\xda\xbf\x2f\xfb\x61\x32\xd7\x9c\x39\xf8\xdc\x80\xce\x0d\xb4\x80\xed\x38\xe3\x8b\x9c\x88\xae\x96\x06\x74\xc1\xec\x8e\xe4\xc8\xa0\x6f\xfb\x79\x7e\x27\x34\xc9\x43\x15\xa9\xcd\x97\x61\xf7\xbb\xd8\x94\xc8\xb7\x10\x8e\x7b\x63\x33\x7f\x56\x7f\x2c\x6e\x9e\xbb\x50\x91\x1c\xc9\xd9\xd1\x17\x03\x1a\xe2\x5e\x0e\xf2\x85\xbe\x3d\x40\x19\x7d\x81\xb8\xe1\xc7\xef\x99\x09\x15\x76\xa1\xfb\x34\x9b\x80\xb7\x9e\x2c\xc1\xd5\x66\x02\x78\x6b\x09\x57\x19\xc7\x38\xa2\xc9\x9e\x19\x32\xcf\x43\xfe\x1b\x18\xf2\x0f\x0e\xd1\xe0\x8b\xa4\xad\x95\x78\x64\xd5\x07\xf5\xe1\x84\x96\x8f\x70\x1e\xb8\x7f\x1c\xc4\x06\x0a\xc8\xe6\x43\x58\x64\x42\xac\x7a\x63\xf6\x70\x24\xca\x92\x9a\x06\xc0\x63\xd8\xbd\x4f\x98\x65\xfc\x58\x67\xa0\x49\xce\x24\x3a\x2f\xf5\x31\xb5\x57\xff\x8b\x30\xae\x42\x8c\x60\xe4\x29\xa1\x6a\x8a\x2d\xbc\xf7\xbf\x31\xd2\x21\x39\xd5\x50\x7f\xef\x9c\x3c\x9a\xb1\x7c\xef\xd9\x82\x31\x44\x7e\x4f\x0b\x25\xb6\xb6\x21\xf3\x84\xa1\x51\x6c\x4a\x80\x8f\xcd\xef\x50\x17\x8e\xc2\x57\xaf\x4d\x01\x05\x84\xfe\x7e\x3e\xc5\x8f\xfc\xcc\x62\x6d\xbc\x85\x70\xb6\x46\xd6\x1e\xcb\x8d\x84\x12\xfe\x04\xff\x64\xf7\xa4\xca\x23\x01\x5c\x62\x22\xb9\x5e\x1e\x40\xdc\xf2\xb4\x78\xe4\xcc\x6f\xd7\xb9\x2f\x02\xa5\xf7\x59\x05\xc7\x27\x2c\x57\xa4\x0b\xcd\xf5\x17\x46\xfa\x41\xb4\xe4\xc6\x26\xeb\xcf\xc5\xe5\x4b\xc4\x6c\xf6\x43\x94\x95\x65\x1f\x88\xf5\x6b\x13\x88\x28\xe8\x4a\xae\x23\x07\x59\x18\x5e\x47\x6d\x78\x85\xa9\x80\xa0\x73\x70\x23\x28\x43\xe8\x64\x72\x14\x1a\xf0\x29\x1f\xb4\x5c\x1d\x15\x8b\xb9\xf4\xac\xdf\x52\xe3\xa2\xe6\xd0\x6a\xf6\xac\xb8\x8e\x76\x31\xfe\xbd\x78\xd1\x2a\xc9\xcb\x74\x09\x50\x46\xb4\x75\xf9\xf9\x28\x4d\x56\xbb\x14\x3c\x2c\x16\xfb\xa1\xd7\x78\x7d\x5e\x4f\xd7\x79\x81\x18\x4c\x93\x4e\xe2\x86\x9d\x48\x3e\xaf\x7b\xbd\x30\x90\xa7\x7b\x6e\x5a\xfa\x3c\x6b\xfd\x9e\x94\xa0\x96\xde\xc5\xe6\x78\xe3\x5d\x45\xf0\xb0\xca\xa9\xc4\xea\x4f\x4f\x9f\x53\xbe\xc2\xee\x7e\xb8\xa9\xcd\x4b\x8a\xac\xb2\xef\x87\x19\xbe\x50\xfd\x61\xad\x8d\x1c\x2d\xfa\x83\x7b\x4b\xb6\x46\x1d\xbf\x01\xc0\xe4\x0a\x62\x1b\x0a\x5f\xd7\x87\x76\x91\x0c\xed\xe0\xac\x32\xbe\x87\x26\x55\x08\xb6\x69\x6f\x0d\x3d\x81\xdd\x5d\x08\x7c\x2e\x6c\xf9\xee\x33\x51\x1c\x48\xd9\x5d\x4e\x03\xb2\x07\x14\xf5\x2a\x16\xaa\x2c\x31\xf5\x00\x82\xd6\x76\x2e\x5c\xce\xd8\x8a\xdf\x73\xef\x07\x29\x17\xb3\xd4\x36\x7a\x63\x84\x32\xce\xac\xa1\x22\xfc\x46\x60\xbe\xee\xb9\xc5\x88\xcf\x3e\xaf\x6e\x3e\x63\x1c\xcb\x7a\x75\x37\x04\x07\xe1\x38\xc0\x01\x43\x23\x3f\xa4\x56\x15\x0b\xbb\x91\x9b\x03\xae\x7f\x48\x8c\x40\x7f\xd7\xb0\x02\x53\x60\x58\x26\xf1\x2a\xec\x70\xb3\x20\xc9\xe8\xa0\x0f\x47\xee\xfa\xea\xd8\x74\x0d\xdb\xd7\x0b\x7d\x46\xe8\xc2\x5b\xc0\x66\x45\x05\x00\x73\xc4\xa9\x9f\xd0\xc3\x3e\x26\x5d\x91\x15\xfd\x4b\xcd\x8f\x89\x8f\x5e\x7c\x2e\x7b\x6e\x25\xa4\x49\x0b\xfc\xf2\x5b\xb4\x6c\xf0\x3e\x6a\x7f\xc5\xe9\x83\xf7\x0b\x65\x0e\x74\x3f\xde\xf0\x48\x1d\x1f\xef\x0f\x64\x3e\x41\x32\x00\x7f\xde\xd9\x2e\x30\x2a\xc3\xb7\x59\x33\xa2\x7e\x8e\x11\xc6\x7e\x44\xf9\x81\xf8\x14\xa6\x3c\x3f\x1f\x0d\x85\xe5\x86\xbf\xb7\x9a\x3e\x04\x13\x64\xd3\xb3\x2c\xc9\x2e\xee\x0a\xa9\x7e\xba\xec\xdd\x22\x55\x28\xb4\x74\x80\x27\xa2\x7c\x86\x9d\x7f\x4b\xc6\xd9\x39\x06\xb0\xf2\xda\xf0\xf4\x9d\x24\x8d\x2b\x3a\x96\x00\xee\xa8\x67\x76\xcf\x49\x44\xca\xc5\xf6\xf7\xfc\xe1\x28\x54\xa2\x2c\x0e\xf0\x95\xa2\xec\x3d\x13\x4d\xc9\x82\x1f\x94\xed\xf4\x14\x8b\x41\x9b\x7f\xad\x92\x56\xa4\x75\xb4\xa9\x63\xc6\x94\x17\x79\x9f\x94\x17\x37\x45\x12\xeb\x28\xe5\xf9\x66\xc4\x72\xa0\xce\x43\xf5\xfa\x1b\x9f\xfc\x10\x0a\xff\x44\xf9\x65\xd5\xaa\x48\x0f\x10\x51\x9d\x92\xae\x92\xee\xe6\xd1\xf1\xa4\xa4\xe7\x9c\x8b\x87\xe4\x0e\x11\xf1\xbd\x9b\x27\xfd\x1c\xc0\xcd\x54\x0d\x0a\xcf\xf1\x15\xa5\x1f\xf9\x44\xc4\xa1\x71\x31\x81\x87\x80\xff\x61\x62\x57\xa0\x89\x5e\xaa\x1b\x10\xd1\xd8\x0f\x42\x06\x96\x18\x33\xdb\xe8\xb7\xb5\xf9\x04\x95\xf7\xee\x65\x89\xee\xe0\xe9\x30\x4b\x12\x60\x96\xeb\x58\x95\x21\x0d\x71\x06\xde\xb8\x43\xeb\x2b\x96\x2c\x52\x6e\xfb\xa6\x23\x4a\x23\xf4\xd8\x31\xaf\x1a\x78\x0f\x5e\xaf\x3e\x00\x13\x1b\xd1\xb0\x67\x52\x25\x88\xfc\x3e\x47\xe1\x11\x67\xb9\x25\x7d\x9c\x8b\xfd\x1c\x09\xcf\xbc\x66\xa8\xb4\xa8\x9c\x3f\x14\x78\xa8\xa2\x0c\xb0\xbe\x04\xe7\x9b\x0a\x9e\x73\xd4\x4b\xf0\xb8\xa7\x28\x05\xc1\x17\x33\xf1\x68\xe9\x5f\x02\xc2\x01\xff\xe0\x15\xaf\x77\x1c\x70\x5f\x5f\x2f\x6c\xf0\x5e\xc1\x7d\x8f\xe0\x96\x5f\x16\xea\x2d\xa9\x87\x90\xb6\xe0\x2e\xf7\x52\xdd\x95\xe7\x1e\x98\x4e\x55\xdd\x95\x6f\x2d\xaa\x7b\xfb\xda\xbc\xc5\x73\x98\xb4\x1a\xf8\x8a\xf8\xed\x20\xa6\x20\x5b\x40\x98\xbe\xac\xea\xbd\x48\xa9\x85\x02\x67\xc3\xd7\xe9\x52\x61\xbb\x5d\x72\xe8\x05\x43\x6a\x6e\xeb\x0d\x0b\xe9\xdb\xa7\x30\xe8\x24\x88\x3b\xb3\xdb\xac\x54\x38\x07\xb1\xe5\xee\x9d\x91\xab\x41\x94\x87\x8a\xf0\xd4\x26\xea\x9f\xb7\xfe\xbf\x40\x99\xa3\xa1\x56\x83\x7c\x62\x86\x57\x32\x67\xc4\x90\x9a\x5b\xf7\x1b\x17\xc1\xd8\x9e\x25\x17\xdf\x82\x58\x94\xac\xe5\xc2\x4b\x9d\x9e\x08\x02\xb5\xbf\x37\x05\x7b\x48\xfe\xe4\xb4\xd3\x53\x93\x93\x0d\x31\xeb\xfd\x03\x9a\xba\x9b\x42\x15\x81\x1a\x40\x0e\xf9\xe3\x17\x7c\x27\x50\x2c\xf0\x62\xf0\x11\xf0\xde\x85\xb3\xd1\x29\xee\x91\x08\xc9\x1d\x9b\x88\xa9\x4a\xbb\xf5\xdc\x87\xe7\x34\xef\x3c\xbd\x0f\xd5\x0f\xe4\x17\xf1\xd3\x87\x18\x08\x1f\xdf\x23\xe4\xbd\x82\xa5\xb3\x5e\x58\xf9\x6c\x34\x10\xb6\x71\x25\xf5\xc4\x28\x2a\x8d\xfc\x9e\x3e\x6a\x7b\xdc\x73\x56\x4d\x35\x3f\xe5\x75\x82\x8d\x92\xf4\xbd\x31\x05\xf5\x2e\xe0\x26\x5a\x8d\x05\x2d\xfc\xbd\x4f\x4e\x48\x1f\xed\xb1\xf2\xb5\xc3\x3e\x44\xcf\x53\x1c\xde\xa0\x0a\xdb\x99\x87\x44\x02\x1e\xcd\xe8\x5c\x66\x32\x83\xa8\x04\x00\xf5\xf0\xf8\x4e\x6a\x66\x67\xa3\xb6\x5a\x65\xa8\xf0\x4d\x16\x02\xe0\x8c\x11\xb8\xbd\x7c\x43\x28\x5b\x0e\x80\xe1\x97\xea\x19\xb8\x77\x6d\x3c\x23\x55\x7a\x32\x70\x89\xd6\x9c\xc7\x96\xeb\x76\xd5\xfb\x9e\x21\xec\xc2\x12\xf0\xbd\xff\x48\x3b\x68\x3f\x2d\x86\x15\x2e\xb1\x95\x1d\x94\x85\xeb\xf5\xc0\xd0\x17\xec\x85\x15\x6f\x5d\xa8\x52\xf6\xc2\x8a\xd5\x6f\xf1\xa0\x24\xa1\xa2\x8f\x58\xa5\x92\xcf\x73\x50\xaa\x47\xa5\x08\x7d\x8c\xe5\x86\x5f\x7d\x2b\x19\xf8\xf2\x2f\x28\xa0\xae\x25\x67\xb3\xde\x1c\x27\xe4\xb7\x0b\x57\x43\x01\x40\x1a\x51\x02\xff\xa2\x1f\x42\x1f\x38\x5e\xe2\x39\x32\xc2\x42\xdf\xf2\x42\x4e\xd7\xdc\x83\x80\x29\x65\x6c\x0f\xb4\xd7\xf7\x6e\x8f\xaf\xc6\xd3\xf8\xd8\x50\x89\x81\xda\xf7\xdc\x55\x83\xac\x99\xe9\xa1\x07\xf8\x82\xdd\xfd\xd9\x95\x02\x50\xaf\x53\x9f\x40\x9f\x25\x09\x2e\xef\xa9\xfe\x0c\xd6\x45\x3e\x14\x62\x2c\x04\x95\xdc\x4e\x42\x57\xa7\xbd\x6b\x21\x20\x45\x78\x38\xa0\x6e\xb6\x70\x7e\x51\xfb\x9b\x88\xef\x75\x10\x81\x58\x29\xd2\xb6\x6c\x95\xc2\x0a\x89\x44\x02\x62\x08\x9f\x5c\x84\x3e\x45\xc3\x89\xf4\x01\x7e\x90\xb0\x05\xe0\x0b\xd3\xbe\x4d\xc4\xb7\x46\x8b\x98\xdc\xb4\xbc\x21\xb8\x60\xba\x38\x77\xe5\x8a\x28\x9e\xa2\xee\xb8\xfc\xbd\x0f\x54\x61\x48\xed\xc7\x9d\x52\x51\xb2\x10\xd4\x6d\x2f\xb7\x80\xfc\x5d\x4c\xdd\x50\xee\xf8\x0b\x2b\x8d\x50\xb7\xeb\x1f\xe5\xea\xd1\xf2\xf3\xce\x4f\xed\x9f\x04\xc4\x35\xdf\xc7\x87\x37\x04\xe3\x92\x2e\xf6\x78\xd4\xa4\x05\xbe\xe9\x78\x9d\x19\xe2\x04\xfa\x03\x6d\x5e\x57\x97\x1d\x5c\xb5\x97\x7a\xdd\x58\xbb\x5a\x78\x40\x84\x31\x2a\x2f\x8d\xe0\x58\x36\xbc\x57\x56\x5d\x23\xe4\xd5\x36\xa9\xa5\x80\x33\xee\xb1\x17\x9f\x05\xd2\x05\xfb\x7a\x3c\xf0\xe3\xd0\xc5\x2a\x11\x88\xc2\xd0\x71\xb1\x85\xe9\xee\xc8\x6e\xef\x59\x6c\x33\x0b\xd0\x4a\xe5\x23\xa6\xdc\xb1\x1f\x05\x95\x6b\x3d\x3b\x1f\x5e\x7c\xf8\xf7\x41\xe0\x3f\x47\x0f\x15\xe6\xd1\xec\x9e\xd3\x9f\x7f\xef\xaf\x4e\x82\x67\x8b\xbc\xa8\xe2\xf7\x89\x2a\x21\x31\x94\x92\x01\x8f\xf8\xd5\x0b\xbb\x15\xb2\xde\x07\x04\xe1\x11\xdb\xed\x29\x88\xb3\x3a\x63\x82\xeb\x34\x08\x6b\x83\x67\x5f\xc0\xf2\xf1\x43\x21\xd8\xed\x97\xaf\x74\xa1\x2c\x5c\x22\xb2\xb0\x1f\xb8\x4c\x90\x81\xc9\x71\x2a\xc9\x94\x17\x03\x9b\x80\x1b\x77\x55\x6f\x16\x1c\x6e\xae\xd9\xf0\x58\x00\xcf\xf1\xc4\xc7\xdf\x60\x17\x88\x07\x0c\x92\x27\x5d\xe9\xc6\x25\xb9\xf8\xa1\x8d\x36\x39\x9d\x36\x46\x08\xd0\xbd\xc8\x05\xd0\x88\xdb\xfa\x9f\x2f\xb3\x17\x0f\x1c\xbb\xdb\x76\xe6\x2d\xd0\x1d\xa7\x71\x5f\x3f\xe1\x11\x37\x54\xf4\xfb\x06\x3c\x53\x79\x4e\x64\x4b\x89\xb6\xfc\x1c\x64\x08\x9e\x4b\xfa\x21\x02\x60\xfd\x3d\xa6\x30\x2f\xe7\xd4\x6a\x1b\xa7\xc9\x41\x57\x94\x8a\x13\xa5\x7b\xa1\x89\x5e\x9c\x20\x6f\x3b\x67\xec\x19\x56\xbe\x7d\xb0\x96\xc2\x2c\x3a\x3a\xf0\xd5\x39\xa7\x8a\x60\xb1\x2e\x41\x5d\x1f\x75\x2a\x5c\x5e\xa4\x41\x37\xf3\x0e\x24\x30\xb6\x52\xb2\x7d\x29\x03\x40\xb5\x2d\x48\x29\xc3\x1f\xf2\xbb\x33\xe4\x59\x6b\x1a\x6b\xb4\x7b\xef\x32\xa5\x33\x60\xe2\xe2\xe4\x30\x7a\x36\xa7\x77\x0d\x50\x59\x01\x83\xe2\x71\x9c\xd8\xd3\x24\x7b\x43\xe9\x2e\x19\x63\x11\x3c\x52\x49\xea\x86\x84\xe2\xbf\x30\x12\x1b\xfe\xe3\xb0\xc8\x6d\xc7\x9f\x9c\xf3\xc2\xed\x1f\xce\x1d\x2e\xd3\x8e\xfc\xc3\xf4\xe9\x32\xe3\x61\x08\xdf\x80\x4d\xc1\x44\x74\x44\xa8\x12\xd4\x9e\x83\x16\x6b\xf6\x32\x70\xf3\x80\x7f\xd4\x50\x31\x5e\xc5\xbc\x3f\xf7\xdc\xc7\x03\x65\xf8\x61\xd2\x75\xaf\xdd\x5c\x0c\x1e\x5b\xc0\x12\xf9\x56\x05\x0c\xda\x01\x4b\xa1\xcb\x9f\xc2\x26\x45\x51\xf1\x34\x4c\x7f\xff\x56\x39\xfc\xde\x7b\xcc\x2b\x0f\x4e\x75\xc5\xe7\x8b\x3b\xd7\xa8\x1d\x4f\x26\xdf\x5e\x89\x69\xc7\xe1\x1d\x07\xc8\x08\xa0\xea\x9e\x37\x99\x39\x2c\x9a\x1c\x91\x28\xe4\x9a\x50\x27\x81\xab\x58\x10\x9c\x91\xf9\x40\x95\xc9\x12\x2a\xa2\xe1\x9a\x91\xf7\x48\x9a\x02\x1e\x7f\x9f\x55\x1e\x94\x70\x6c\x30\x9f\xc3\x7d\xa0\x13\x86\x97\xeb\xeb\x69\xfa\xce\x95\x43\x7c\xd4\x42\x5c\xf5\x79\xee\x3f\xb3\xbf\x66\x6e\xca\x7e\x7d\x46\xf9\x66\x4f\x28\xd2\x8b\x9f\x93\x0a\x0a\x9f\xa6\x1e\xee\x39\x1c\x18\xe2\xa3\x95\x33\x29\xbe\x0c\xc8\x37\xab\x80\x3a\x15\x57\xd3\x07\x4d\xbd\x3c\xc8\x61\x3e\x0a\x21\x80\xe8\x5e\x91\xd4\x9b\x2f\x39\xa4\x95\x06\x85\x1e\x1b\x25\xb9\x62\x39\x54\x46\xbe\xb3\xb6\x24\x6c\xee\x4d\xea\x2d\xa5\xc5\xcc\x10\xe4\x4e\xab\xf3\xd1\x9b\x4d\x93\xf3\x0b\x7c\xe2\xc0\xab\xd4\x0b\xe4\x01\x89\xb3\xd8\x09\xec\x31\xb9\xfa\xdd\x4c\xfe\x3a\x62\xe5\x81\xc7\xa5\x2c\x7c\x03\x75\xd0\x75\xb6\xbb\xfb\x66\x3b\x38\x26\x33\x7a\x0f\x58\x20\x32\x2b\x37\x90\xe7\xe1\xa7\x6e\x88\x44\xe2\xa6\x38\x1b\x8d\xf5\x85\xe3\x34\x40\xb1\x42\x46\x0b\xff\x82\xf2\xa7\xfb\x02\xa9\x09\xf4\xff\x33\xfc\xd4\x7b\x7c\x58\x7d\x9d\xa9\x9f\x08\x2e\x42\xa0\x85\x9b\xc8\x34\x13\xf6\x07\x73\xaf\x5b\xfc\x59\xe9\x60\x04\xe6\x7d\xe6\xe9\xee\x88\xc3\xd3\x06\xdf\x32\x49\x21\x2d\x3c\x22\xe1\x8b\x6d\xac\x74\xcf\xa8\x7f\xf6\x55\xaf\xa2\xd7\x57\xc1\xd5\xde\x7e\x8f\xe9\x22\x67\xf8\x42\x14\x6c\x25\x01\x27\x11\x49\x11\xc4\xe8\x80\xe3\x98\x55\x86\x37\x7b\xf5\x9e\x35\x88\x0f\x16\xca\x19\xf3\x19\x7f\x66\xb3\x9f\x83\xd4\xec\x07\xe7\x8e\x8f\xed\xdb\xd4\xc3\x25\x7d\xa3\x0b\x36\xfd\x71\x9a\x86\x89\xb5\x23\xfd\x1e\x83\x7b\x9e\x6c\x56\x99\xaf\x8c\xb8\x5e\x92\x05\xbf\x6a\xfe\xa9\x95\x32\x00\xbd\xdd\x7f\x03\xcf\x76\xa2\xd9\xd6\x6a\xf2\x23\x84\x3d\xfc\x41\xf4\x12\x60\xeb\x8a\x89\xad\xd5\x0b\xd3\xe6\x25\x3c\x2a\xa0\x75\x5f\x62\xae\xf1\xf8\xf9\xd1\x9e\x44\x69\x25\xb3\x8d\xba\xef\xb7\x2f\xbe\xc6\xe8\xc3\x57\xb3\x9e\x15\xa1\xcd\xc5\x81\xd5\x44\x30\x87\xa8\xe2\x8c\xa4\x2c\xc1\x68\x82\x23\xba\x0c\x72\xb7\x7b\x76\x07\x03\xf1\xe8\xfc\xf0\x38\x4d\xea\x7e\x0d\x1d\x08\x64\x61\x7a\xc7\xbd\x7d\x8d\x35\xa4\x97\x8a\x9d\x36\x82\x0f\x1f\xa5\xc6\x81\x89\x45\x3a\xdf\x82\x7e\x1f\xe1\x3b\xf2\xe1\x37\x7e\xe7\x5b\xa8\x3c\xef\x67\x40\x32\xb4\xb4\xe7\xf1\xc8\xd6\xcc\xbe\x03\xef\xc7\x0f\xd8\x5b\x7d\x02\xa8\xe5\xc6\xb0\x20\x5e\x48\x33\x02\x7e\x98\x65\xcb\xf5\xaa\x4d\x27\x18\xa3\x01\xfe\x66\xc3\x05\x06\x93\xe5\xc8\xfc\xdd\x93\x29\x20\x1d\xea\xff\xfa\x00\x90\xff\xbd\xd2\x79\x94\x4e\xdb\x87\x98\x62\x0b\x2a\xf0\xfb\x7c\xed\x21\x33\xec\x3a\x13\x2a\x1d\x3c\x2f\x00\x2a\xb1\xe9\xb0\x23\x0d\xd8\xe2\x9d\xac\x10\x07\x87\x7a\x94\x8f\x7b\xf5\x51\x34\xbe\xda\x3e\x74\x0e\x72\x95\x2e\xf0\x05\xa2\x3b\x32\x72\x79\x8f\x08\xd2\xe2\xcc\xdb\xf8\xfd\xb3\x86\x49\xac\x32\x64\x17\xdd\x29\x17\x7c\xb4\x7c\xef\x19\xc7\xbd\xaa\x96\x80\xda\xf7\x01\xee\xf0\x1e\x5b\x92\x59\x88\xe6\x93\x08\xc7\xe5\xbd\x21\x61\xe5\xc7\x6a\xc5\x9e\xc9\x22\x87\xa7\xe8\x84\xbb\x17\x07\x79\x7d\x8c\xb3\x2a\x2f\x72\xaf\x27\x1f\xfc\xcd\x53\xd2\x41\xa8\x41\x07\xe4\xbe\xd2\xea\x6b\x50\xb0\x15\xc2\xab\xac\x3d\x92\x8e\xc1\x0a\x4b\x6e\xbd\xf5\x33\x92\x63\x4b\x95\xf5\xba\xcd\xaa\x92\x00\x34\xd7\x69\xde\xe2\x18\x8a\xe8\x9b\x03\x7f\xe6\x3c\x22\x3a\x71\x12\x7c\x6f\xce\x9c\xd5\xa1\x71\xfb\x7b\xd5\xd8\xf4\x59\xf6\x0f\x8f\x1a\xa5\x87\xfc\x34\xb4\x50\x49\xa7\x6f\x00\x63\x35\xb6\x44\xc1\x00\xa2\xb1\xe6\xd4\x59\xe9\x97\x43\xb0\xdf\xba\xcf\x1f\xb8\xb6\x1f\x09\xa5\x18\xec\x35\xf3\x3d\x87\xd5\x1c\x03\x5b\x00\x5e\x86\x5f\x62\xbd\x87\xc0\x28\x6c\xea\x88\x14\xef\xfb\x6c\x3e\xbd\x0a\x5a\x44\xea\xe3\x40\x71\x60\x3f\x6e\x8f\xde\xe0\x3e\x7b\x57\x67\x5b\x28\xba\xcd\xe4\x50\xb9\x3f\x32\x4c\x9c\xfd\x12\xb6\x98\x5f\x4f\xce\x77\x9a\x24\x7d\x7c\xcd\x4f\x40\x2f\x27\x24\x94\x4b\x36\x52\xd3\xc4\x2f\x0b\x22\x49\xad\x18\xc6\x67\x0e\x2c\xfc\x9e\x17\xd7\x4b\xcc\x70\x46\xb9\x7b\x21\x3d\xcd\xe5\x9f\xdc\x4e\xd9\x5c\x6d\x74\xed\xab\x62\xc4\xc8\xe8\xdd\x21\x7b\x3e\x9c\xaf\x24\x9c\x13\x5a\x00\x2b\xdb\x62\x66\x13\x9f\x32\x48\xbd\xfe\xba\xcc\x93\x99\x85\xa7\xec\xe3\x8c\x29\xf8\x08\x63\x6d\xcb\xea\x1d\x4b\xfa\x46\x6f\x9d\x2b\x35\xa7\x66\x3a\xc8\x60\x4a\x45\xb3\xf1\x20\x39\x20\x93\xe3\xdd\x28\x7c\x92\x90\xfa\x29\x5f\x99\xf9\xd6\xad\xc6\x47\x59\xaa\x77\xd1\xdc\x07\x4e\x45\x2d\x75\xd9\x47\x3b\x41\x8c\xe6\xea\x23\x94\xc4\xf5\x9d\x48\x63\x0d\x75\x26\xa8\xc3\xa7\xea\xcd\x9b\x60\x73\x39\x4a\xe7\x36\xdb\xb0\xdd\xc1\x52\x7a\xca\x1b\xd5\x69\xba\xbd\xbd\x90\xc5\x2f\x39\xc9\x57\xf5\xb1\xef\xb5\x31\x9a\x27\x7e\x49\x74\xb9\x97\x2c\xfc\x26\xa0\x39\xe4\x53\xad\x9a\x8f\xd8\x7b\xeb\x8c\x01\xea\xfc\xa0\xe9\xf2\x52\x1b\x2f\xd2\xc8\xb5\xec\x9c\xe1\x65\xd6\x1d\x91\x96\x1b\x5e\x6c\x3f\x6d\x37\x20\x28\x77\xee\x85\x74\xdf\xe2\x9e\xdb\x19\x48\x8b\x12\xdf\xfe\x2b\x07\x11\x6c\x87\xbf\x4a\x83\x15\x97\x21\x01\x8c\x40\xf2\x28\x52\xb2\xbf\x60\xef\xa7\x19\xa6\x94\xa6\xb4\xa3\xe2\xb1\x6d\x43\x29\xe1\x0e\xc1\xe8\x91\xc9\x20\xac\xef\xd5\x2a\xf7\x20\xf2\xcf\x1c\x50\xdc\x30\x72\x76\x40\xa9\xf8\xe1\x62\xc6\xc9\xaf\xe1\xaf\x35\x26\x03\x68\x4e\x7a\xc9\xd0\xc4\xff\x90\x59\xd9\x76\x8e\x35\x5b\xee\x5e\xf9\x38\xc1\x28\x7f\xa2\x8a\xbb\xb3\xc5\xd7\xb7\x30\xc4\x3f\x0b\xfd\xda\xff\x46\x94\xa3\xcc\x92\xf6\x88\xf6\x8f\x37\x27\xaa\x5d\x7d\xfb\x2d\x9c\xcd\xc6\x07\xae\xff\x48\x10\xeb\xfd\x07\x94\x6d\x16\x0d\x83\x77\xa7\xa6\x40\x94\xef\x95\x8c\xea\x27\xea\xde\x4b\x1a\xac\xfd\xe3\x9a\xbd\xda\x3c\x96\xd5\x58\x74\x07\x71\x44\x51\xaa\x2e\x20\x81\xad\x83\x7c\xbf\x8e\xd8\x3c\x56\x51\x8e\x73\xef\x8d\x66\x72\x3f\x7d\x05\xd5\x48\xc2\x7a\xb5\x22\x59\xc9\x79\x67\xfb\x1e\x8c\x15\x4d\xf2\x83\xec\x47\xf3\x0c\x5f\xaa\xc8\x99\xe3\xcc\x0e\xf3\xf7\x0d\x5b\x77\x95\xdb\x41\x76\xe0\x4c\x5f\x6f\x61\x8a\x5f\x10\xcc\xb5\x08\x7f\x71\xaf\x1a\x40\x28\x70\x3d\x3f\xa2\x72\xc9\x34\xad\x4f\x2a\xd5\x32\x9b\x22\x94\x3a\x53\x52\x14\x63\x1e\xfc\x16\x5f\x19\x63\xa9\xe7\x57\x17\xd1\x25\x0a\xa6\x4f\x1b\x20\x35\xc7\x1c\x03\xf9\x35\x3e\x00\x52\xd6\x37\x0c\x58\x17\xc2\xe5\x2f\xb9\x34\x4e\xa7\xfd\x26\x64\xe1\x5c\xa7\x35\xbe\x6d\xb1\x2d\x44\x44\x81\x84\xb3\xd5\x6d\x24\x3e\x8f\x2c\x7a\x7e\x70\xc7\xb3\x8f\x7d\xa6\xb2\xce\x27\x5a\x4d\x94\xd9\x95\xd9\x34\xef\xcb\x5d\xe4\x53\xca\xe0\xde\x53\xdf\x0d\x87\xf7\x38\x15\xf1\x6c\x33\x4f\xd2\x3d\x56\x0d\x79\xd0\xa5\x91\xd9\x32\xe8\x5c\xc8\xd5\xab\x5d\x79\x7c\x05\xf7\xdb\x83\x18\xd2\x04\x7b\x7e\xf9\xdd\x67\x21\x68\xfa\x02\x76\x20\xf5\x1e\x14\x8b\xc3\x7f\x7d\x89\x24\x18\x27\x68\xfb\xd1\x43\x84\xc0\x7e\xe5\x8a\x0f\x04\xee\x64\xe1\x68\x3f\xd2\x4e\x9b\xb3\xe2\xcf\x6b\xee\xe5\x61\x88\x42\x69\x7d\x31\xf5\x09\x7e\x3f\x01\xd5\x21\x2a\x54\x4c\xd8\x20\x0d\xdb\x34\x07\xa6\xab\x6d\xb3\x4a\xaf\xd8\xfe\xc1\xd0\xe3\x91\xf2\xc9\x90\xc9\xdc\x2c\x62\xb8\xa6\xb8\x0f\x45\xa8\x21\x9a\xfb\xcc\xf1\xc6\x70\x0f\xdc\x3b\x88\xc3\xe2\x15\x1b\xb6\xee\x9e\x23\x21\xc2\x8c\x43\xc7\xde\x77\x9b\xb9\x42\x64\x16\xf8\xb5\xf7\xee\xcf\x3c\x77\x0f\x46\xa6\xdc\x85\xb8\x22\x49\x64\x54\x8e\x11\x1c\x90\xcc\x5f\x7e\x7b\xde\xd0\x7b\xd5\xdb\x46\x42\xb3\xf5\x0a\xf5\x43\xf1\x4f\x66\xd3\x91\x77\xa5\x39\x49\xe9\xab\x30\x24\x09\x59\xf9\x8c\xb4\xa3\x35\x37\x7b\xdf\x1d\x33\x72\x8a\x13\xf6\x5c\x02\x68\x89\x17\x80\x44\x70\x57\xd9\x40\x2a\xe6\x19\x6d\x92\xa7\x7e\x86\x41\xc3\x36\x60\x68\x0a\xb8\xb4\x71\xfc\x7c\x3e\x05\x67\x7c\xcf\x78\x07\xbc\x47\x10\x03\x29\x4d\x87\xa8\x4a\x49\xae\x89\xa6\x17\x75\x76\xf9\x82\xb1\x1c\xde\xdd\x47\x29\xb3\xdb\x7d\x9e\x78\x88\xe1\x23\xb1\xfa\x73\x2c\x71\x55\x25\x90\x0a\x53\xb7\xd2\xb2\xb2\x7e\xde\xa7\x18\x20\xe5\x90\xcc\x6d\x83\x01\xec\xfd\x3c\x9c\xd7\x2e\x90\x79\x63\x03\x93\x83\x44\x4a\xb5\x5d\x32\xc2\xfc\x5a\xed\x6d\xb4\x33\x85\x27\xd8\x32\xde\x8c\x6a\xf6\x5b\x2f\x57\x32\xb9\xde\x8b\x11\x37\xfc\xf7\xbd\xf7\x9e\xe0\x5c\x82\x1f\x79\xc0\x70\x76\x73\xa4\xe5\x98\x3a\xa2\x7c\xcf\x85\x1c\xdb\x88\x65\x77\xe3\xd1\x2a\xfb\x3f\xee\xd3\x28\x24\x00\x4b\x5c\x86\x1e\xc7\x57\x79\xde\xe3\xc8\x4d\x3c\xe3\x90\x53\x56\xd4\xb9\x10\xaa\xea\x94\xe5\xce\x27\x32\x06\xc7\xf3\xe7\x65\x5d\x9e\xf1\x06\xd6\xcd\xba\xe7\x42\x98\x69\x1e\xb3\x66\xca\xed\x15\xb6\xa1\xbc\x9a\xa9\x1c\x52\x1a\x00\x90\xba\xab\x64\x64\x43\x82\x04\xda\x53\xe1\x37\xa5\x34\x4b\xdd\x67\x19\x23\x53\xbe\x4b\x44\x0e\xdc\x11\xf2\xa5\x13\x95\x93\x0c\xdc\x8f\x0c\xc1\xe5\xa2\x11\x24\xa7\xde\x60\x54\x15\xfc\x24\x47\xc1\x3f\x6a\x9d\xd4\x4a\x20\xed\xd5\x0f\xcb\x2d\x74\xc4\xa6\x3d\x76\x3f\x1d\xaf\x08\x50\x9f\xd2\x10\xd4\x7b\x0e\xbd\xdd\xcb\x18\x2d\x37\xc3\xf5\xfe\xc9\x1f\x05\xc9\x16\x2d\x1d\xe5\x17\x01\x40\x1c\x3b\xb2\x52\x8e\x08\xf6\x24\xf9\x52\xac\x58\x0a\x11\x77\xbf\xb6\x5c\xfd\x27\x66\xbd\xfe\x51\xa5\x62\x7f\xb0\x6c\x0e\x51\xd5\x84\xba\xe4\xdc\x54\xaf\xdc\xf0\xc8\x04\x2d\x10\xa7\x3e\x14\xa5\x81\x8a\x96\xb4\xfc\x8e\x34\x04\xcd\xac\x61\xe2\xf1\x60\xb2\xce\x6b\x7a\x72\x4b\xef\xf9\x7f\x96\x9b\x18\xef\xf9\x35\xfd\x00\x6f\xc8\x16\x8b\xc6\xad\xc5\xef\xe9\x9e\x6b\x78\x62\xec\x28\x2c\x7f\xe3\xcc\xbe\xda\xf2\xd6\xa9\xf4\x53\x03\x84\xbf\x35\xf6\x2d\x8f\x83\x88\xef\xd3\x1a\x68\x6a\x0c\x7e\x7a\x6b\xde\x6a\x65\x09\x75\x75\x76\x08\xd4\x03\x2b\xee\xef\x3c\xcc\xf7\x48\xf0\x79\x54\x6b\x3f\x52\x21\xf0\x70\x64\x84\x4b\x18\x9b\x6d\x30\x01\x69\xfb\x12\xdc\xbb\x46\xca\x90\xe1\x3b\x31\x2f\x19\x16\x78\xde\x6f\x2d\x06\x85\xb7\x67\x48\xb3\xd8\x1e\x95\xce\xc7\x08\xcb\x10\x0c\xf4\xfb\x61\x8c\x3b\xb0\xf1\x1a\x1e\x24\xa4\xf5\xbe\x7e\xa8\x25\x23\x57\x8c\xcd\xd3\xca\x1b\xa2\x8b\x2a\x3b\x6d\xe9\x98\xd3\xe8\x10\xd3\x2e\x7c\xee\x99\xc2\x2f\x74\xcf\xee\x30\x4d\x67\xcb\x0a\x35\xa2\x8a\x64\x72\x04\x89\x9c\xba\xc6\x5d\x22\xbe\xa3\x56\xf1\x7c\xa6\xb1\x1d\x79\x11\x0d\xb5\x37\x40\x70\x51\x44\x2c\x36\x4a\x80\x27\x4b\x85\xd0\xe5\x7c\xd9\x38\xca\xba\xaf\x52\xec\x37\x26\xee\xe6\x7b\xdd\x01\x4e\x9c\xb0\xe0\x41\x6c\x39\x92\xca\xf4\x78\xe5\xa2\x67\xa7\x22\xdc\xfd\x14\x68\xea\xbe\xd3\xbd\x4f\x29\xc7\x05\x70\xf1\x50\x29\xcf\xab\x5f\x85\x8d\x13\xc6\x64\x26\x4d\x8c\xc0\x51\x54\x2c\xca\xc0\xca\x01\xfa\x8b\xb7\x14\xdc\x8f\xf7\x38\x74\x8f\x59\x57\xfd\x43\xed\xdd\x2c\x9f\x6f\x44\x29\xa4\x7a\xe7\x35\xf6\x43\x66\x58\x9e\x35\x4a\x55\x79\x0f\x03\x38\xbf\x24\x08\xd4\xe2\x5d\x22\xc6\xf0\x94\x12\xa6\x0c\xe7\x95\x5e\xae\xee\x5e\x02\xd1\xd4\x70\x39\x21\xb9\xed\xe3\x85\x7d\xaf\x19\xa3\x41\x12\x92\xf0\x49\x66\x67\xaf\x9e\xf7\xaa\x83\xf0\xd3\x92\x9c\x55\x83\x92\x48\xc0\x42\x57\x29\x66\xd4\xb4\x23\xd0\x9c\x3d\xe3\xa7\xfb\x48\x92\x7b\x01\x63\x22\xfd\x62\x29\x31\xbe\x6c\x81\xc9\xf9\x7a\x98\xe9\x33\x8a\x5e\x63\x25\x21\xed\xd6\xee\xc2\x5b\x16\x06\x60\x08\xd7\x1f\x41\x8a\x8d\x0a\x7c\xc6\xf4\x35\x21\x98\xc1\xd3\x03\xde\x56\x3c\x9d\x6d\x7a\x61\x6d\x3f\x44\xfd\x10\x58\xfd\xd7\x5b\xe6\x88\xf0\x5e\x13\xec\xcc\xbf\x64\xa7\xf2\xf5\x37\x60\xd3\x1c\xca\xb3\x0c\xab\xc2\xe0\x15\x8d\xd2\xb3\xea\xf1\x33\x56\xe3\xf8\x47\xd3\x75\x6c\x39\x8a\x2c\xd1\x0f\x62\x81\xf0\xb0\xc4\x09\x23\xbc\x91\x10\x3b\xbc\x37\x12\xc2\x7e\xfd\xcb\xac\x9e\xb7\xa8\x33\x35\x7d\xaa\xab\x51\x12\xe6\xde\xc8\x88\x1b\xfb\xea\x88\x48\x69\xb9\x09\x9c\xc7\x7c\xe5\xcd\x1b\x25\xba\x2f\x0b\xf2\x20\x38\xe6\x4a\xf9\x70\x08\x9a\x0a\xcc\xf5\xa4\x68\x0b\x07\x54\xd1\x96\x75\xa4\x91\x0e\x87\x77\x24\xf0\x5e\x11\x95\xc1\xd8\x3e\x12\x49\x36\xcb\xed\x31\x09\xe5\xdd\x04\xb1\xea\x13\x82\x3c\x2d\x7e\x90\x2e\x22\x35\xc4\x6b\x7c\x41\xdb\x8f\xb1\x65\xe2\x97\xcb\x4a\x2d\x02\x00\x98\xee\x4c\x1c\xaf\x99\xed\xdf\xf8\xc6\xf5\xa5\x80\xf7\xa6\x91\x0a\x05\xbc\x8f\xe5\x4f\x89\x60\xa0\x80\xbf\x0a\x55\x02\x32\x7b\xa2\xac\x70\x10\x7e\x9c\xe8\x45\xb7\xd9\x9b\xa3\x1d\xf3\x16\x3e\x4d\x91\xd0\x2e\x37\xb9\x12\x0c\x2d\x09\xff\x49\x39\xde\x45\x33\x39\x71\x1d\x0c\xff\x4a\x19\x67\x3c\xf3\xe4\xf5\x5c\xdb\xc5\xf7\xe5\xeb\x95\xa2\x6b\xc4\x0b\x8c\xb0\x78\x94\x96\x6b\x64\x07\x45\xa5\x9e\x5d\xf9\x3d\x98\xf6\xa0\x48\x5c\x6e\xec\xcf\xfc\x4d\x2a\x4d\x96\x58\x77\xcb\x12\x49\xbb\x4c\x8a\xe5\x8a\xfd\x3d\xd1\xd6\xe3\x37\xd0\x00\x80\x6e\xfb\x1b\x37\x66\x4b\xc1\x97\x74\xb8\x00\x46\x7b\x8a\xa2\xf9\x54\xbd\x6d\x04\xb1\x5e\xb8\xf9\xa7\xc9\x5d\xab\x04\x50\x4e\xf0\xc2\xda\xf1\x11\x9c\x0f\x53\xfe\x7e\xb1\xcc\xa2\xa9\x52\x22\x6a\xa3\x2d\xf7\xec\x85\x6d\xa9\x54\xdf\x18\x7d\x12\xd7\xd3\xad\x10\xb9\x71\x51\xa4\x94\x5d\xda\x36\x0e\x6b\x20\x52\xfc\x9b\x6f\x2d\xa5\xe8\x9a\x59\x6d\xcb\x2b\x88\xcd\x99\x3d\xa2\x09\x70\xf8\x24\xe0\x6a\x11\x6e\xe7\x01\x5f\x00\x79\x6e\x9f\x2f\xea\x1e\x1f\x6b\xfe\x28\xf5\xf4\x6f\x16\x79\x9c\xff\x16\x41\xd8\x5f\x78\xf9\x09\xbe\x1f\xc1\xf7\x70\x3e\xb9\x65\x51\xfb\xbe\xed\x15\x00\x63\x9f\xd2\xf5\x12\x07\x12\x47\x7c\x69\x35\xf1\x7e\xeb\xed\x14\x1e\x2b\x08\x66\x95\x6c\x9f\xe3\x17\x61\xf4\x6e\xcc\xef\xbf\x6b\xb6\xfb\x29\x79\xad\x20\x12\x89\x48\x1e\x2f\x78\xa2\x85\xb2\xac\xfe\x90\xcd\x78\x9c\x66\x6b\x5e\xf2\xed\x63\x79\x1f\x47\xb8\xd6\xf9\x2e\x0b\x9a\x2f\x1f\xa1\xf5\xb8\x6a\x13\x5d\xdf\x4d\x31\x5d\xfb\xcb\xf8\xd1\x52\x1c\x24\xf5\xce\x96\xc0\x0f\x18\x0a\xb9\x16\x43\x62\x95\x78\x78\xf6\x7c\x94\x92\x74\x11\x4c\x0d\x8f\x6f\xfe\xfb\x95\x00\x5f\xfd\x3e\x01\xe8\xdd\xc6\x53\x7f\x76\x8d\x59\xa9\x8a\xb0\x38\xe3\x51\x83\x5f\xdb\xdf\x7a\x9d\x1d\x45\x06\x4e\x08\x4b\xca\x92\xbb\x9e\x84\xbc\xa4\xd3\xd6\xe4\xa6\xfd\xce\x24\x78\xf0\xb3\x30\xc7\x3b\xc8\xff\x21\x56\x07\x34\xee\x8b\xee\xc7\x68\x48\xe0\xc7\x14\x00\xa0\x5f\x8c\x43\xb9\x27\x14\x4a\x80\x77\x88\x2f\xe0\x09\x4f\xac\x8c\x76\x53\xe0\xff\x93\x12\x28\x03\xf8\x75\x63\x9d\xfc\xa3\x39\x5a\x4b\x55\x0f\x7a\xdd\x01\xde\xfc\xe4\x36\x5a\xa8\x01\x8f\x4a\xbf\xb5\x11\xc8\x7b\x83\x4c\xd7\x3c\x08\x67\xa4\x28\x86\xd3\xd2\x59\xa7\xef\xd6\xeb\x73\xef\xe3\x17\xb4\x49\x5b\xa8\x5d\xdc\x7f\x83\x1c\x99\xec\x16\x59\x09\xb2\xfc\x56\x6a\x00\x18\x5e\xf0\x6e\xd8\xbb\x32\x6e\xa5\xca\x10\x90\x6f\xf7\x15\xbe\x55\x4f\x9e\xef\x57\x7f\x60\x6c\xb7\x55\x42\x48\x23\x0f\x59\x26\x28\xcd\x3b\xb2\x51\x67\x4f\xc7\x3f\x34\xe0\xb4\x19\x9e\xe6\x53\xa7\x87\xca\xfa\xe1\x17\x44\xfe\x7a\x33\x7d\x24\xf1\x6f\xa7\x61\xbd\xc8\xbf\xd5\xda\x38\x89\xbc\x76\x6b\xeb\xe4\xa7\x34\xc7\xfb\x17\x3d\x1c\xe0\xbc\x50\x37\x63\xf9\xde\x55\xa8\x99\x00\xbf\x60\x95\x97\x40\x2f\xd6\xe7\x5e\xd4\xf8\xa5\x11\xa8\x13\x00\xbf\xa6\x58\xad\x7b\x02\x75\x41\xac\x57\xa7\xaa\x38\xbb\xf2\xfa\xdc\x13\x31\x59\xf6\x5f\xa1\x7d\x06\x21\xc3\xca\x31\x7d\xae\x84\xfb\xe9\x39\x64\xf3\x67\xb8\x09\x0c\xe0\xd4\xa8\xf5\xc3\x67\x2e\x4d\x52\x10\xf3\xef\xf7\x82\x38\xd0\x72\x78\x7a\xc6\x68\xcd\xfd\x72\x82\x1c\x53\x90\x77\xd1\xaf\x7e\x7e\x8b\xa2\x8b\x78\x03\xec\x99\x5c\xef\xd7\x0a\x7d\x0a\x70\x26\x5a\xf2\x9f\x24\xcc\xd1\x50\x93\x87\x5e\xb7\xef\x49\x0e\xc2\xc3\x1f\x75\x10\x5f\x72\xfb\xda\x9a\x27\xf5\x03\x90\x2b\x9d\x4b\x47\xe2\xf9\xd2\x13\xc0\x01\x01\x90\x76\x21\xef\x23\xa9\xde\x00\x6e\x95\x50\xbf\x69\x06\x6f\xd3\x3d\xd3\x1e\xfc\xf7\x99\x22\x98\x51\x35\x08\xdb\xe6\x0e\xdf\xc9\xae\x7b\x3f\xe9\xbc\xfc\xb5\xdc\xe7\xb2\x94\xab\xd0\x3d\x51\x8b\x89\x05\xdf\x9e\x45\x36\x9f\x25\x42\xea\xb8\x7b\x0e\x7f\x33\xfc\xef\x41\x07\x26\x6d\x05\x20\x9e\x07\x32\x1c\x2f\xc4\xac\x3c\x7a\x02\x33\xe0\x3b\x01\x2a\x6a\xbc\x78\x27\x62\x4d\xc9\x25\xac\x2b\x23\xbc\x27\x88\xbf\x6f\x58\xd1\x18\xc0\xd3\xc6\x37\x4b\x8f\x9b\x57\x3f\xa5\x54\x16\xfa\x85\x1c\xfd\x10\xf4\x4e\x28\xf6\x4d\xc4\x80\x5f\xef\x0e\xc9\x68\xb6\x75\xf7\xfe\xea\xc3\xfb\x1e\x6b\x33\x67\x4b\x5b\xb9\xf3\xe6\xe9\x88\x64\x24\x0e\x8f\x76\x3a\x53\xc0\x3d\x3c\x87\x08\x47\xe4\xc6\x7f\x0b\xef\x87\x93\x83\x3e\x1a\x4f\x74\x26\x3f\x3f\xe5\x8a\xbb\x65\xeb\xd9\xb1\x62\x7f\xb2\xde\xd8\x6a\xf9\x4b\x06\xec\x87\x16\xa9\xa5\x9c\xb5\x00\xd8\x22\x60\xac\x3e\x9b\x2c\xd8\x47\x09\xde\x3f\x43\x74\xc3\x5f\xaf\x20\x5d\x7a\x3f\x98\x8b\xe6\x4c\x6f\xf2\x04\xa5\x7b\x68\xd7\xce\x79\x00\x3e\x9e\xe7\x3b\x0e\x28\x15\x95\x25\xba\x1c\xe1\xf6\x72\xf0\xc5\x22\x12\x82\x26\x2c\x4a\xa9\x0f\x6a\x06\xe7\x30\xc4\x6b\xfa\xc2\xe0\xb4\xf5\x1c\xbf\xfa\xfa\xfd\x36\xe3\xec\xfd\xf1\xfb\xd9\x05\x2f\xa6\x68\xdf\xbc\x8f\xf7\x32\x4f\xe6\x76\x25\x01\x36\xe8\x04\xb7\xd5\xfb\xec\x81\x2f\x96\x9a\xf3\x66\x11\xa7\xfc\x72\xcf\x8f\xa5\xba\x00\x25\xd2\xb9\xea\x91\x97\xa7\xc5\x54\x4f\x29\x1e\x22\xed\x5e\x68\x88\xdf\x86\xdc\xb2\xb9\x49\xe1\x59\xa6\xf6\x55\xb1\x65\xa9\xc9\xfe\x26\x40\x9d\x16\xd9\xf7\xcc\x58\xb2\xfa\x92\x6c\x5c\xbf\xc9\xe9\x61\x23\x9f\x7e\x82\x6f\xd1\xfd\x8b\x26\xba\x16\x08\x6f\xc3\x5b\x70\xef\x81\xbf\xfd\xe8\x1c\xd1\xea\x8e\x88\x5c\xb2\x08\x70\x9e\x06\xd8\x1a\x37\x6e\x3a\x35\xbc\x87\xe5\xd3\x45\x2e\x80\xcf\x1e\xe0\xe8\x9a\xf4\xe4\x84\x8e\xb9\xb7\x8b\xa4\xf1\xad\x9f\x4b\x87\x5a\xd4\x5a\x73\x8b\x53\x6b\x40\xc2\xdd\x2b\x49\xce\x11\x98\x2d\x78\x7d\x3f\x03\x17\x84\x3e\x8a\x32\x4d\xfa\x38\x97\xe9\xd5\x7b\xef\xe5\x65\x3c\xd7\x1b\xf8\xc9\xf3\x19\x2e\xc0\x2e\xac\x9b\x1f\x5e\x3c\xb5\x94\x29\x9e\xaf\xed\xec\xf9\xcd\x18\xe1\xcc\xa0\x34\xfb\xed\x15\xcd\x49\xd1\x4f\x0f\xdf\x70\xfc\x87\x80\xa8\xe2\x8e\x12\x9f\x23\x36\x4f\x10\x9f\x83\x63\x68\xf8\x3d\x50\xdd\x1b\x3b\x44\x36\x89\xca\x04\xc0\x24\xa8\x2a\xf2\x28\x8f\xaa\x35\x80\x8d\x8a\x45\x73\x39\xc3\x21\x5d\xcb\x32\x4c\x4f\xad\x6f\xb1\xaf\x5f\x44\x3a\x39\x54\x16\x1b\xfe\x3a\xdc\xd2\x4b\xe3\x0c\xc5\xca\x8b\x2d\x3c\x53\x2b\x5a\xcb\xde\x0d\xfb\x87\xe0\x3e\x5c\x52\x97\xee\x0d\x4a\xf9\x67\x0a\xe7\x64\x6e\x8a\x8e\x3a\x02\x60\x49\x80\xcf\x15\x20\x53\xbb\x47\xa3\x88\x9a\x28\x90\x6d\xfd\x99\xa7\x64\x38\xb2\x6d\x78\x0c\xe0\xbb\xdc\x36\x53\xc8\x4f\xe5\x99\x1d\xcb\x0f\xc1\x84\x4f\xc0\xf3\xbf\xc9\x91\xe4\x2b\x9e\x06\x1b\x93\x0f\xc4\x8f\x71\xc4\x5a\x9d\x45\xd8\x5f\x2d\x60\x39\x38\x5f\xb2\x78\x85\x55\xfb\xe6\x8e\x7e\x73\x5f\xa6\x0e\xde\x90\x0a\x17\x03\x8c\x17\x87\x0a\xf3\xe9\x60\xec\x07\xbf\x7b\xe4\xee\x69\x09\xbc\x7a\xa3\x32\x9e\x3a\xcd\x4f\x01\x75\x7d\x6a\x40\x0b\xd6\xf4\xc3\x64\xaf\x61\x9e\x63\x28\x09\xc5\x1f\xe4\x7d\xfa\x98\x8d\xee\xab\xe0\x0c\x5e\x71\x93\x54\xc3\xf7\x65\x59\x11\xcd\x9c\x6f\x60\xe0\x2e\x48\x31\xca\x7d\xb2\xf4\x4f\xb9\x71\xe8\x83\xf2\x17\xde\xf2\xb9\x62\x95\x04\xc8\x99\xb9\xe1\xb9\xe9\x70\xb1\xb6\x52\x2f\x01\x4f\x2f\x14\xe0\xd5\xc6\xf1\xd2\x6b\x55\xd4\x34\xbe\x8b\x36\x67\xbc\x99\x12\x4f\x8c\x57\x4c\x05\xcf\xbb\x2f\xa7\xdb\x29\xc3\x1e\x8f\x3f\xad\xe7\x71\xa3\x2d\xd1\x7f\x4f\x96\x33\xf7\x20\x64\x03\x66\x84\x83\x94\x77\x63\x7e\xe2\xa1\x51\xf4\x6b\xd8\xdb\x6a\xa1\x68\x58\x0b\xa8\x3b\xef\x9e\x80\x8f\x09\x42\x63\x04\x52\xc6\xd3\xf0\xbb\x99\xc7\x1c\xa3\xb3\x15\x84\xd7\x34\x1f\x20\x45\x87\x52\x2f\x56\xfc\xfc\x86\x5b\xa2\xc9\xaa\xa4\xdf\xeb\x6f\x8f\x73\xaf\x9e\x2a\xa4\xa6\x7e\x47\xf7\x6b\xa1\x0b\x5a\x38\x2a\xe3\x64\xec\x31\xc8\x11\xb4\x38\xcb\x2b\x1c\x9a\x93\x24\xfb\x77\xd2\xe6\x09\x5b\x44\xb6\xa9\xaa\x7a\xf3\x7e\x29\x82\xde\x55\xc5\x0f\x65\x38\x09\x21\x51\x56\x50\x57\x61\x1a\x1d\xea\x60\x2d\x29\x5e\xb8\x9c\xa4\x4d\x25\x8a\x68\x0c\xae\x1d\x1a\x66\xde\xfd\xc3\x90\x99\xb3\x89\xef\x46\xe4\x1f\x26\xd4\x61\x09\xe5\x76\x8f\xc8\x25\xda\xd1\x58\xeb\x15\x45\x76\x57\x25\x8a\x9b\x73\x0c\x66\xa6\xcb\xbe\x43\xae\x0a\xc0\x72\xaf\x2f\x91\xab\x7f\x7b\x72\xee\xd9\x31\x0b\xd1\x40\x16\x00\x48\xf4\xbd\x1f\xd1\x7e\xd0\x41\x6c\xe8\xab\x2d\xab\x74\x85\x71\x14\x3a\x8b\x96\x5c\xea\xde\x64\x21\x92\xcb\x5e\xde\x84\xdb\xdb\x21\x8d\xe1\x60\x09\x33\xd3\xb5\x53\x5b\x7e\xb2\x77\x7b\xb5\xa2\xe7\x92\x81\xae\x78\xe6\x17\x71\x54\x54\x43\x5c\x19\x8a\x6e\x55\xd3\x43\xac\x2b\x5c\x17\x83\x18\xb6\xdd\xca\x3b\xbc\xc3\xaf\x15\xfe\x54\x5a\x84\x7b\xbf\x4c\xfc\x8a\x59\xc0\x73\x8f\xd2\xe8\xba\x85\x55\x1b\x94\xe5\x94\xfe\x1d\x64\x88\xa7\xa1\xf7\x5b\x2d\x8a\x20\x76\x4a\xcf\x1b\x9c\x41\x22\x38\x1e\xa4\x11\xdb\xc2\x5b\x19\x2f\x19\x78\xe7\x06\xf8\x27\x1b\xd3\x56\x8c\xa2\xbf\x83\x02\x90\xa2\xa8\x15\xfc\xab\x97\xa6\x26\x68\x86\xb8\x77\xda\x64\x85\x3f\xe3\xc1\xf8\x61\xd6\xd7\xb1\xeb\x91\xd8\x6e\xe6\xbc\xf0\x90\xb3\xde\xfc\x38\x03\xb5\xd5\x7c\x68\x75\x7d\x9a\x6f\xc4\x09\x00\x94\x26\x23\x9d\x8e\x5e\x14\xcb\x18\xa5\x5e\xea\x12\xd1\x57\xb9\x5f\x41\x79\x86\xb7\x49\xfb\xf7\xfd\x05\x6f\x07\x1a\x40\x99\xf5\xf1\xb4\xc4\x1a\xce\x3a\x2f\xce\x70\x97\xd9\xc2\x3e\x29\xfd\x0e\x71\x1f\x8c\x98\x95\x06\x8b\xaa\x9f\xd6\x9b\x50\x11\x97\x4d\xd7\xbb\xef\x0e\x16\x05\xf4\x2c\x0e\x01\x77\x30\x6f\x03\xb5\xbf\x92\xf9\x94\xa3\x27\x91\x43\x5d\x37\x8a\x45\x72\x8b\x16\x4b\x9c\x4c\x31\x9a\x91\x9d\xac\x32\xe7\xd3\x64\xd5\xf2\x61\x55\x44\x7d\xb6\x3d\xf1\xe5\xe3\xa5\x43\x4a\xb3\x96\xfc\x43\xa5\xb6\xd8\x37\x9e\xc1\x0d\x75\x0e\x74\xdf\xc3\x38\x7a\x1e\x99\xa3\x88\x8f\xef\xa1\x48\x87\x2d\xbf\x60\x21\x94\xcc\x1d\xa5\x49\x6d\xb6\x25\x1f\x7d\x1a\x1d\x68\xf0\xa5\x3d\x45\x05\x64\xfc\x36\x49\x56\x3c\xa1\x87\x52\xd9\x5f\xc5\x0b\x63\x31\x5f\x6b\x9f\x9c\xe0\x79\xb5\x07\xc9\x08\x09\x6c\xab\xec\x8f\x67\xe0\x62\xad\x74\x93\xdd\xe5\xa5\x8f\xf1\x91\xe3\xa8\xd5\xc8\x8d\xe7\xc4\xa9\x94\xd0\xb7\xa0\x05\xc1\xf1\xd3\x68\xcd\x83\xf3\x48\x24\x36\x87\xf1\xe4\x5e\x5b\x24\xf0\x9a\x50\x6c\x5a\xe0\x8c\x04\x2d\x3c\xea\x21\xd1\x5a\xeb\xa0\x07\x75\x4a\xe4\x7a\x12\xbe\x55\x56\xb9\xf2\xe4\x5d\xcd\xf5\x46\xa2\x52\xa4\x85\x6e\x7e\x70\xfb\xd3\xd4\xd8\xf9\x05\x67\x30\x0c\x70\x0e\xad\x84\xb9\xf5\xa3\x33\x94\x17\xbd\xf3\xd6\xf0\x75\x01\x14\x53\x2b\x51\xbe\x84\x2a\x26\xab\x87\x2f\x1d\x64\xe5\x2d\x1a\xf6\x82\x83\x20\x01\xc5\xb2\xba\xb7\x0d\xa3\xc4\x11\x7f\xf3\x79\x77\xd1\x05\xfe\x4f\x21\x51\xdd\x62\xa2\xac\x69\x95\xf2\x0e\xec\x84\x14\x0b\xcb\xa9\x63\x74\xa5\x90\x44\x61\x9e\x49\xb2\x7f\x81\x13\x1e\x25\xb2\xbe\x24\xb2\x7b\x28\x00\x52\xde\xa1\x1f\x4c\x27\x8f\x08\xca\x72\x91\x1c\x8e\xd7\x5a\x1c\x5b\x21\x8f\xbe\xbb\xe4\xb3\x7f\xd0\xcc\xad\xef\x1f\x8d\xa3\xe6\xfc\x59\xa5\x00\x29\x1b\x01\x38\x7a\x52\xfb\x5a\xd9\x1a\x9d\xd4\xf4\xd1\xc4\x32\xe1\x1f\xf0\x4e\x31\x18\xe9\x67\x6b\x94\x89\x14\xde\x23\x89\x2b\xb9\x4e\x98\x72\x35\x38\xf8\x5b\x07\x37\xd0\xaa\xdd\xc3\x16\x70\x15\xf6\x08\xbf\xb5\x3c\x11\xbb\xdf\xde\xe9\xd2\xdb\x8d\x18\x09\x69\x36\x00\x1a\xa5\xf0\x9d\x55\x8d\xe9\xee\xa6\x04\x12\xd7\xa8\xdf\xfd\x7b\x33\x75\x8c\x79\xb5\x61\x2c\xb9\xc7\x6c\xb9\xa1\x2a\x8c\x3d\xce\x00\x0c\x1d\x17\x6b\xb0\x93\xd9\xf7\xe1\xb7\x41\xa7\xe0\xe2\x35\xe4\x35\xde\x92\x00\xea\x17\x9d\x30\x0e\xee\x1f\xee\x30\x11\xc3\x6e\x49\xf3\xc7\x01\x2c\x73\x94\x7f\xcf\x0c\x7d\xb5\x16\x73\xb7\xf1\xc7\x64\xcc\xf5\xe4\x09\x0c\x76\x8d\x9f\x91\x54\x57\x69\xe7\x75\xb7\x5c\xa2\xa4\x50\x91\x9e\xc3\xef\xf1\x68\xb4\xf5\x90\x96\xea\xcc\x86\x81\x29\x56\x47\x86\xf5\x00\xb7\x33\xef\x55\xeb\x44\xd7\x4e\xd4\x92\x2c\x07\xe7\xeb\xde\xa7\x29\x37\xe0\x56\x71\x91\x4b\x49\x4a\xc2\x2a\xf0\x8c\x18\x17\x24\xcf\x2c\xf8\xc5\x2d\xac\xce\xb7\xf5\x8e\x1a\xa8\x70\x56\x11\x11\x2a\x20\x7e\xc6\x2f\x6f\x68\x7b\x6d\xda\x87\x70\x07\x61\xe7\xb5\x37\xe2\x57\x40\xa5\xaa\xd9\xc8\x8a\x71\x30\x52\xe1\x2a\x80\x7b\xbd\x58\xf6\xba\xde\xf0\x89\x0d\x63\xeb\x88\x76\x45\x1c\xd6\x6d\x1b\x93\xc6\x90\x6d\x57\x70\xab\xcb\x9f\xf7\x10\xcd\x67\x3e\xd9\xbe\x4f\x5d\xf6\xc2\xe8\x4e\x64\xa6\xf4\xdc\x1c\x72\x29\xa0\x06\xce\x2b\xfc\x35\x61\xf7\x10\xea\xd7\x22\x83\x90\x0f\x30\x9e\x2d\x56\x6f\xd7\x13\xe7\x37\x00\x36\x6b\x14\x50\xc0\x8c\xdf\x34\xbc\x7c\xbf\x5f\xc6\xad\x0e\x1e\x27\x0b\xf8\xb2\xb5\xc1\xa9\x96\x83\x2c\xf7\x3b\xc8\x91\x46\x9c\x3c\x2b\xc4\x4b\x32\xf0\x0e\x73\x5e\x63\xf3\x37\xff\x76\xfe\x9f\xf7\xc0\x5b\xa6\xb4\x03\x04\xd1\xe0\x48\x1a\xf9\x14\x8f\xc2\x0a\x6b\xb3\x6c\xc7\xf7\x6a\x74\x6c\x9f\x03\x50\xf4\x63\x1f\x0d\x48\xbc\x5f\xcf\x1d\xe2\xf0\xe9\xf0\x3c\xc0\x37\x5b\x7a\xb2\x76\xbd\x9b\xd3\xcb\x09\xe6\x1b\xd7\x5d\x31\x5d\x7f\x7d\x13\xf6\x21\x00\xaf\x00\x41\xce\x12\xbe\xd6\xc5\xb1\xa5\xb6\x63\x82\xfc\x18\xda\x0f\x9d\x11\x49\xf6\xed\x70\xa3\xb9\x06\x26\xff\xe5\x05\xf1\x6c\xd8\xad\x9f\x9a\xc2\x82\xf3\xc3\x6f\x67\xf4\xe7\xb7\x8a\xf0\x3e\xec\x63\xe0\xad\x5d\x2f\x1b\x38\xbd\x1a\xb9\xa2\x03\x48\xce\xef\xbb\x70\x3c\x25\x94\x07\xb5\x64\xc2\xc5\x15\x1f\x84\x3f\x9d\x53\xd4\xe0\x1c\xea\x79\x84\xdb\xc4\x03\xc7\x69\xa7\xcf\xeb\x8a\x2b\x99\x79\xb2\xe6\x80\xfe\xa4\xdd\x54\xc7\x0c\x19\x9a\x4f\x12\x62\x85\x59\x81\x74\x8f\xb7\xd3\x4b\xe1\x8d\x58\xeb\x02\x19\x16\x42\x8e\x8a\x3a\xa9\xfc\x0b\xc8\xaf\x99\x6b\xae\x20\xaa\xc6\x72\x15\x39\xb3\x5e\xcb\xa6\xa4\x39\xde\xfd\x00\xb2\x3e\xf2\x8d\x66\xd0\x8a\x57\xf6\x85\xfa\xf6\x35\xe2\x45\xdf\x33\x01\x30\x45\xc0\xd8\xe3\x4d\xa5\xcc\xbf\x7a\xb7\x9e\xbc\x2a\x10\x85\x8e\xba\x2c\x2f\x60\xaa\x2c\x27\xd8\x1e\x81\x2f\xb7\x67\xc6\x44\xaa\x7a\x2a\x1e\xee\x7b\x27\x95\xad\xe4\xcb\xb3\x9b\xf9\xf1\x1c\xca\xae\xd3\x42\x15\xe7\x26\x10\x81\xfb\xbe\x5d\x9e\xd5\xfb\x31\xf8\xca\x91\xe9\x4a\x87\x19\xca\x41\x64\x4b\x6a\x6c\x0e\x5c\xc5\x1a\x19\x33\xd9\xbd\xe7\xd7\x26\x53\x7a\x51\x5e\x93\x9c\x00\xc8\x4f\xf2\xe8\x51\x37\x00\x17\xf9\xf2\x8e\xa8\x90\x05\xe6\x2b\x40\x0a\x87\xbf\x46\xd2\x71\xa3\x1c\xf0\x8f\xea\xce\x86\x33\xa5\xb2\xd2\x71\xe6\x8a\xd3\x0b\xe6\xcf\x9b\x52\xd8\xcf\x41\xaf\xa6\xdf\x99\x86\xd8\xa4\x3e\x35\x44\xe3\xb4\x38\xda\x28\xf6\x6e\xab\xd1\x09\x8c\x9f\x16\x43\x9e\x01\xe7\x5c\x02\x82\x4f\xea\x1b\x6a\x6a\x6e\x4d\x75\x3f\x37\x8e\x01\xbb\x35\x3b\x53\x9e\x47\x57\x43\x60\x74\x19\xbf\xb3\x2e\x55\x54\xd3\xb5\x70\x1d\x30\xec\xe3\x3c\x2a\x2b\x53\xbe\x8b\x18\x4a\x88\x59\xe0\x09\x5e\x46\xdf\xfe\xc6\xb4\xc0\xcb\xdc\xb0\xe5\x2c\x99\x1e\x41\x8e\x0b\xf4\x51\xca\x56\x03\x5e\x33\xe0\x54\x39\x10\x04\xd1\xe2\xc0\x88\x2e\x40\xef\x1f\xb0\xe7\x41\xa0\x5a\x5f\x86\x02\x18\x0f\xcf\x1c\x99\xfc\x73\x84\x67\x15\x9e\xab\xba\xf2\xf8\xfb\x7a\x85\x27\x9b\x24\xd9\x27\x35\x2a\xf5\xdb\x7e\xcd\x16\x98\x01\xaa\x54\x0b\xb1\x99\x58\xa4\xd3\x77\xc0\x4f\xab\x5b\xa8\x77\xad\x05\xf0\xa3\x1e\x74\xb1\xe3\x0b\xeb\xef\x44\xf2\x64\x05\x40\xb1\x36\xfc\xdb\xfa\xca\xab\x2f\x4e\xbf\x75\x7b\xc6\xed\xac\x73\x3e\xc7\xa8\xa9\xd1\x73\x85\x52\xb1\x1c\x41\x02\x13\xdb\x1f\x5c\xf1\x1c\xd2\x01\xe6\x84\x48\xdd\xb0\x69\xe6\x75\x86\xb1\xff\x7a\xbf\xc5\x64\x9b\x1b\x8a\x50\x65\xd7\xaf\xef\xf7\x7d\xc5\xe8\xbb\x04\xb8\x2d\xa0\x78\x0c\x9b\xe0\xd4\x9a\x76\xf3\x99\xfd\x3e\xe9\x4f\x02\x39\xf9\x7b\x50\x2c\x9d\x4e\xb7\xb3\xb8\xd1\x16\xba\x46\x6f\x44\xa9\xfd\x70\xd4\x69\x80\x01\x6f\x69\x41\x34\x8b\x56\xfb\x0f\x56\xbf\x79\x53\xc6\x73\x19\xff\xed\xd9\x8b\x74\xab\xe8\x10\xda\xb2\x3e\x71\xd4\x0f\x87\x97\x27\xc5\xda\x9e\x18\xc0\xaf\xec\x11\x00\xb5\xf6\xdd\xe9\xaa\x94\xdb\xf3\x87\x7c\x4c\x7c\x74\x7f\x69\x16\x9f\x6d\x3c\xdf\xb9\x50\xb1\x04\x83\x55\x92\x62\x25\xa6\x67\x28\x99\xe4\x43\xaf\x13\xa4\x54\xf6\x9b\x24\xbd\x7b\xc2\x02\x24\x13\x50\x95\x85\x7c\x47\x6e\x23\x86\x42\xd6\x6a\xa7\xd9\x6a\xb4\x53\x94\xe5\x0c\x32\x38\x88\x2f\x17\x32\x6e\x61\xcf\x70\x27\xd9\x42\x9d\x9a\x28\x4b\x98\xfc\xe8\x62\x58\x9f\xa1\x2d\x3d\x82\xda\x0f\xe4\x9a\x5d\xf9\x82\xd3\xbf\x84\x48\x7f\xba\x52\x6e\x6e\xc2\xa6\x6c\xce\xb8\xdf\xb3\xd4\x19\xc9\x92\x1a\xa3\x6c\x24\x95\x56\xdc\x1d\xce\xc8\x04\xcd\x4b\x28\x92\xd2\xa0\x40\xdc\xe2\x3b\x7f\x80\x97\xad\x5b\xc4\x1a\xfa\xa8\xbb\xa3\xd5\x7e\x15\xe7\x84\xfb\xec\x99\xca\xf4\x1a\x17\xdb\xa3\xe5\x1d\xe6\x27\xcb\x8b\x9e\xe0\xa0\x7c\x65\x6f\x20\x5c\xaa\xb9\x59\xcb\x32\xeb\xbf\x31\xee\xc9\xb0\x8e\x0f\xa7\x31\xbe\x4b\x09\xf2\xd1\x9e\x85\xc6\x1d\xe7\xb1\x25\xaa\x32\xd7\xe3\x63\xd8\xf7\x36\x51\x56\x3b\xdf\x68\x1b\x16\xbb\x67\x90\x64\x0d\xc7\xca\xe3\x8e\xb2\x73\xc0\x48\x22\xd8\x3c\x05\xbf\x1f\x28\xfb\xdb\xee\xe3\xe5\xc2\x39\x03\x90\xfe\xbf\x07\x79\x3e\xd1\xaa\xcd\x7e\x9a\x48\x2d\x16\x86\x35\xed\xaf\x4e\xd0\x38\xaa\xd0\x16\xc7\x70\x59\xed\x95\x4d\x41\x54\x88\xfd\x30\x63\x59\x4a\x1d\xd1\x4f\xa1\x89\x60\x83\xe6\xf7\x71\xc8\x2a\x5d\xdb\x70\xd9\x34\x6a\xe1\x8c\xf1\xc3\x69\x32\x22\xf0\xf6\x86\xe6\x88\xf2\x09\x08\x5b\xc4\x7a\xdf\x63\x1f\x51\x82\x14\x68\xb6\x4e\x4a\xea\x76\xbe\x15\x9e\x6f\xa4\xb4\xd5\x77\x66\xd5\x3e\xd4\x62\x04\xbc\x69\xb0\xb2\x77\x58\x35\xca\xd9\x7e\x3e\x00\x05\x7f\xa8\xdf\x8b\x59\x71\x2e\x02\x18\xf3\x39\xc4\xe0\xf1\xd3\x91\x42\x51\xb6\x00\xd0\x54\xe4\x50\x84\xaa\xcb\x0e\x2a\x46\xe5\xe6\x58\xf8\x15\x09\x65\x0a\x5f\x4c\xdc\x25\xaf\x7b\x3d\x65\xe8\x7b\x29\x35\x97\xbf\x9d\xe4\xf1\xb3\xb1\x42\xe6\xb4\xd7\x6b\xaa\x69\x36\x3b\x60\x4e\x35\x8e\xe0\xd1\xe2\xb6\x2f\xc4\xf2\x3c\x7d\xec\xe6\xc6\x07\xb1\x26\x69\x4d\x38\xa7\x27\x79\x83\x02\xb7\xc2\xe7\xaf\xd6\x22\xde\x3b\xa1\x62\xdd\xa2\x84\x35\x51\xc9\x6a\xcf\x82\x03\xff\xfc\xed\xcc\x1d\x5c\x5a\x31\x7d\x5b\x2d\xc0\x3c\xc2\xe3\x96\x49\xf9\xb1\xa4\x34\x92\xeb\x93\xc5\xef\x1f\x41\x56\x3b\xf9\xaf\xae\x07\x00\xe6\xf9\xfb\xd2\x38\x87\x18\xf5\x43\x6f\xa6\x15\x80\x5a\xf0\x4a\x8e\x10\x3c\x65\x8c\x3c\xb6\xef\xed\x93\x8a\x3b\x6b\xd9\xe3\x9f\x5e\x42\x0d\xfe\x5c\x65\x10\x54\xe8\x77\x29\xb6\x6e\x70\x5e\x12\x16\x80\xa9\x7b\x74\x1d\x1d\x92\x69\x8e\xad\x2a\x8c\x94\xfc\xe8\x07\xab\x1a\x2c\xf2\x34\xf0\xb2\xbe\x7e\xb8\x21\xbd\x53\x34\x0c\xba\xfb\xa6\x0e\x07\xd6\x2d\xcf\xf1\x89\x59\xef\x3a\xd4\x03\x46\xd2\x2e\x43\x86\xda\x1c\x98\x55\xcc\xb4\x66\x2d\xac\x0d\x52\x39\x03\xf5\xa0\x80\xed\x73\xe3\x5b\x0d\x23\x17\x70\xb7\xd9\xf7\x7b\x45\xd4\xa1\xc2\xef\x4f\x92\x01\x6a\xa7\xaf\xf8\x07\xeb\xd2\x8e\xdc\x93\xfc\xa7\x8a\x55\xc1\x93\xd1\xed\x20\xe1\xbd\x40\xe8\x14\x8f\x88\x93\xbc\x9b\xd7\x91\x89\x20\x28\x77\x80\xd4\x7c\x15\x83\x3c\xef\xdf\x62\xcf\x3a\xf5\xa6\x25\x22\x50\x2a\x02\xbc\x27\x7b\xdd\x6d\x37\x42\x1d\x22\x9a\x59\xdd\x29\xa2\x1e\x18\xe0\x08\x97\xd8\x52\x30\x44\x3d\xad\xab\x74\xf7\xcc\xb9\xad\xcd\x2d\x03\x87\x7b\xa2\x71\x0d\xf5\x7c\xeb\xd9\x10\xf3\x2d\x05\xaf\xc4\x0d\x19\x4d\x36\x7e\xbd\xf6\x70\x93\xe6\x0e\x73\x76\x24\x92\x11\xfd\x1b\x98\xaf\x70\x96\xa4\xa7\xc6\x9a\xfb\x31\x0e\x3c\xd4\xa6\x27\xff\x56\xbd\x88\x43\x18\x7f\x5e\xbe\x32\x03\xb9\x71\xa5\xcc\x7d\x1c\x57\x65\x4f\x95\x4c\x92\x04\xb3\xc0\xbb\xca\xbe\xa6\xaa\x7a\x61\xec\xa0\x3f\x32\xc2\xd0\x9f\x0f\xce\x58\xcd\x09\x55\x6d\x82\xa0\xad\xc7\x39\xf4\x4c\x46\x30\xfa\x51\x43\xcd\x5b\x3c\x64\x1f\xa6\xde\x29\xf5\xf4\x06\x5f\x69\x89\xd2\x05\xd4\x61\x5a\x46\x1d\xaa\xff\x5e\x0b\xc7\x8d\x1b\x31\xbc\xba\x99\x8e\x80\x07\xe4\xc1\xfb\x93\xd9\x4c\x8b\x54\xdf\xc7\xce\x26\x9b\x37\x29\x01\xb5\x43\xd9\x96\x4c\x2a\x7f\x83\x82\x0a\x08\xd1\x8b\x41\x78\xb3\xe0\xfb\xe2\x30\xf0\xc8\x63\x08\x3f\xae\x58\x55\x8f\x37\x4b\x84\xf3\xf8\x61\x3d\x25\x51\x3e\x9f\xf5\xfb\x98\xb3\x6d\xaa\xce\xe3\xe0\x96\x33\xf6\x9f\xe6\x70\xde\x62\x40\x95\xb1\x01\xaa\x30\xbb\x41\xa4\x1a\x27\xb9\x1e\x1b\x5f\x99\xec\xf3\x5e\x00\x06\xe0\x69\x85\xad\xbe\x30\x00\x70\x29\x1a\x71\x67\xd7\x44\x6a\xed\xa6\xc5\x96\x72\x1b\x98\xf3\x52\xbd\x1b\xc8\xd1\xc2\x0b\x6e\x09\xff\x4a\x4e\xbe\x1f\x7d\xcd\xcb\x6e\x22\xb9\x58\xee\x04\x58\x6e\x5d\x99\x2a\x91\xc8\xec\xfc\x5d\x6d\xfe\x8c\xe0\xf6\x73\x7c\x60\x24\x17\xb0\x1d\x97\x00\x7f\xa9\x63\x5e\x27\x52\x16\x0b\xc8\x6a\x04\xc7\xb4\x18\x7d\xda\x5f\x8f\xcf\x8e\x81\xdd\x46\x16\x90\x2e\x34\xc1\xc1\x29\x99\x47\xd0\x50\x0f\x5f\x5e\xf8\x4d\xb3\x53\x55\x8e\x40\xec\xb0\xba\xec\xf9\x7c\xed\x29\x57\x42\xad\x97\x23\x11\x95\xf3\x5f\xec\x92\xa2\xae\xb1\xba\x55\x44\xa8\x7c\x7b\x7e\xe0\xac\x16\x9e\x57\xb9\x04\x02\x19\xf8\x1f\x12\xd6\x99\x4d\xe9\xd2\x2e\x13\x18\x06\x27\xcb\xe1\x2a\x97\xb2\x24\x10\x5c\x7d\xf0\x7b\x00\x3c\x03\x2f\xd8\xeb\x55\xaf\xb7\xf8\x94\xed\x73\x71\x45\x19\x24\xa2\x9d\xfe\xd2\x41\x7f\xea\x7a\x69\x1c\xa1\x20\xca\xbc\xeb\xa9\xb0\x35\x78\x83\xd7\xa7\x2b\x81\x32\x3f\xf4\x89\x63\x3f\x80\x86\x43\xec\xe4\x4a\xfd\x8b\xd1\x48\xa9\xf7\xb7\xee\xe7\x3f\xe3\xcc\xa8\xb3\x47\x5f\x9e\x37\x4a\xae\x0f\xf3\x5a\x7f\xd5\x8d\x54\x2d\x60\xac\x3d\xf5\xba\x23\xa3\x6a\x74\x54\x11\x0b\xde\xec\xd2\x00\x87\x79\xc8\x3b\x5c\x81\xaf\x3d\x9f\xa9\x00\x00\xed\x48\x4a\x1a\xaa\x89\xed\x1d\xc0\xf3\x46\x64\x04\xf9\x09\x80\xf2\x85\xd0\x8f\xf6\xb3\xff\x08\x7a\x61\x54\x5c\xe4\x2f\x15\x95\xef\xc2\xd2\xef\x74\x9e\x5a\xb7\x9f\xe6\x87\x77\xbe\x93\xa7\x50\x16\xa8\xfb\x15\x9f\x48\xe6\xec\x48\xea\xf5\xf7\xf0\x29\xec\x54\x51\x7b\x8a\xfc\xd6\xaa\x46\xf4\xea\x85\xeb\x7f\x4c\x3e\xd3\x45\xb4\x82\xa4\xb0\xe0\xd6\x4a\x2d\xa9\x05\xf0\x4e\xb8\x21\xf4\x6f\xdd\xbe\xcc\x87\xb6\xeb\x0e\x51\x81\x1d\x23\x84\x53\x38\x8f\xf6\x21\x31\x8f\x7a\x4a\x3a\xfd\xe3\xbc\x6b\x63\x47\xdb\x21\xd2\x59\x84\x17\x28\x4c\x0a\x42\xd6\x0d\x75\xed\x8b\x68\xf6\xc5\xda\xdc\xf6\xd6\x13\x6e\x77\xf1\x42\x7a\x7e\xb0\xbf\xbc\x2d\xa8\xb8\xef\x1c\x76\xa1\xa7\x1c\x82\xf4\x20\xf5\x98\x81\x04\x60\x90\x01\xf0\x35\x71\x87\x9f\xa3\x28\xab\xca\x93\x18\x96\xaf\xf4\x4a\x00\xd4\x7b\x8d\x67\xe3\x1c\xb8\xe6\xa5\x54\xef\xaf\x2d\x41\x09\x31\x60\xd8\x21\x70\x22\x68\x63\xbe\x36\xce\x4c\x31\x99\x80\x95\xd0\x47\x92\x97\xea\x83\xca\xc5\xd6\x23\x40\x0e\xf8\x45\x05\x31\x53\xf6\x7c\xdb\x0e\x8d\xc1\x50\x94\x60\x7a\xb6\x0e\x4f\x3a\x4d\x90\xad\xa5\xab\xd7\x96\x32\x29\x7f\x54\xe7\xac\xe4\x52\x34\x86\x1c\x4f\xdc\x6e\x80\x2b\xa4\xf5\x7d\x2b\x8f\xe7\x4f\x7d\xdd\xa6\x4f\x61\x34\x24\xbc\x25\xa9\x13\xf0\xfe\x32\x73\x0a\xfc\x1d\xe0\x78\x53\xff\x39\x6f\x5c\xa8\xf3\x34\x70\xe1\xad\x2c\x8f\xe6\x90\xf3\x1a\xe3\x35\xb3\x23\xcf\xbc\xdf\x8a\x50\x8b\x3e\x4c\x2e\xd3\x2c\x6b\xf5\xc7\xaa\x97\xbb\xe2\x42\xf6\x3d\xf2\x2f\x79\x1f\x67\x22\x29\x09\x40\x78\x18\x5e\xe7\x70\x81\xd7\x05\x5f\x95\xf6\xbd\x7b\x19\xbe\x01\x35\x40\xd1\x0c\x6a\x1a\x0b\x82\x07\x02\x6e\x5b\x38\x2d\xf9\x76\x00\x0b\xd2\xec\x40\xc0\x97\x34\xc1\x97\x98\xfe\xea\xdc\x96\x3d\x55\xef\x8a\x17\x02\xce\x7b\xa3\xeb\x35\x87\xe4\x9d\xd7\xf4\x97\x11\x74\x80\x79\xf3\xb5\x13\x1c\xfd\xf5\x92\xe1\x15\x10\x66\x49\xaf\x89\x7d\x13\x33\x0d\x8e\xf0\x47\x85\xb5\xe3\xef\x79\x68\x5e\xee\xe9\x76\x8b\xb7\x86\x2f\x00\x84\x65\x58\xa9\x9d\x1e\xc9\xdd\x1d\xf4\xd7\x53\x48\xb7\x49\x91\xe5\x2e\x50\x9e\x3d\x15\x47\x46\xa7\x9b\x54\x14\xad\x00\xa5\x37\x98\x38\x61\x3f\x0b\xce\x46\x80\xc8\xc8\xf9\x9f\x10\x5f\x80\xbf\xd1\xb1\x3d\xd2\x49\x35\xc9\x02\xf6\xba\x1d\x66\x00\x08\x2c\x9c\x43\x4a\x07\x72\xdd\x96\xb0\xd6\x71\x34\x20\x68\x4d\xd7\x35\x4f\x99\xd0\x91\x46\x92\x9b\xe2\xa4\x39\xc8\xd3\x39\x82\x6a\xae\xbe\x8e\xe2\xaf\xa3\x66\xdb\x57\x79\xed\x6b\x8b\x7c\xe5\x42\x8e\x16\x1e\x25\x8c\x23\x61\xa3\x41\x9d\xf8\x95\x2c\xd4\x95\x2c\xd5\x9e\xea\xb8\xec\x55\xb6\xe1\xfc\x08\xf4\x72\x8f\xe1\x0c\x02\x93\x9f\xd8\x87\x84\xdd\x03\x07\x95\xe0\x42\xc5\xeb\x61\x19\x10\xab\x84\x44\xea\xa7\x8b\x49\x25\xff\x05\x53\x2e\x7d\x97\xe6\xaf\xce\x90\x36\x51\x51\xc9\x08\x42\x3c\x0a\x7d\x15\x84\xfd\xac\x2d\xa1\xb4\x47\xa4\x3c\x0a\x4d\x14\x81\x81\x39\x1e\x56\xa4\xd5\xb6\x68\xd2\x4d\xc4\x60\x5d\x10\xea\xf0\x9d\x13\xff\x8b\x87\x78\x00\x71\x7f\xbb\x71\xe6\x71\x5b\x2a\x5d\x85\xd4\x6c\x90\x5c\x57\x22\x5c\x9b\x6e\x20\x46\x6c\xdf\x61\xa9\x2f\xa4\xa9\xb7\x07\x2a\xc5\xdd\xfb\x2d\x99\xf1\xdb\xc1\x10\x53\x85\xba\xfa\xfa\xa3\xfd\x7e\x98\xd5\x7c\xe9\x32\xac\xc5\x2d\xb1\x63\x86\xec\xf4\xe0\x79\xbe\xe2\xe5\x5e\x76\x9f\xee\x48\xc8\x39\xf9\x10\xa7\x8f\x3f\x5c\x01\x2c\x3e\x24\x58\xb1\x75\x01\x66\xf0\xee\x0f\xc9\x08\x1d\x6e\xe0\xfb\x98\xf2\x34\x0b\x1a\xaa\xf2\xd8\x71\x7c\x1e\xf6\xf7\xc4\xf9\xfd\x76\x7f\xfe\xb3\xdd\x7e\x77\x6c\x09\xb1\xfb\x17\xa9\xfd\xde\xf7\xdf\x77\xd0\x3f\xc9\xfa\xad\x48\x4d\x5c\xad\x2a\x54\x85\xbd\x04\x78\xf6\xf6\xb7\xb3\x42\x1b\x02\xfe\xfe\xb3\x86\xcb\xe5\x99\xe9\x0b\x08\x91\xa7\xb5\x6d\x7c\x55\x93\x2f\xff\x24\x3e\x95\x04\x66\x7e\x02\xe6\x64\x06\xc0\x8e\x00\xec\xc0\x65\xe3\x20\x09\xe3\x09\xe7\x68\xc7\xaa\xe1\x35\xb7\x91\x17\x43\xbc\x86\x2b\xe6\x50\x6e\x3b\xa9\x4f\x6e\x8f\xfe\xeb\xa0\x00\x4c\x54\x25\xd8\x28\x72\x72\x6d\x00\x85\x49\x6f\x77\x5d\x7c\x47\xe2\xfc\x70\x3b\x49\x26\x3f\x44\xb6\x03\x98\x2a\x03\x7c\xa1\x5d\x09\x99\xbc\xb4\xed\x61\xc2\xfc\x0b\x5e\xa0\x52\xc9\xc3\x0b\x03\x79\xa8\x30\x79\xd7\xef\x11\xee\xd6\x29\x5f\xd8\x5b\xa5\x92\xc9\x6a\xd5\x18\x91\x13\x39\x0f\x67\x36\x7e\x7a\x19\x6e\x34\x16\x3e\xef\xae\x6c\xc8\x4f\xdd\x1f\x4f\xe1\x1d\xc6\x76\x07\x30\x2f\x78\xfe\x0d\xce\x44\xc2\xfd\x61\x82\x10\x74\x6c\x54\x8d\x6d\x7d\x1b\x77\x9a\xe6\x82\xae\xa7\x50\xbb\xf2\x26\x40\xa5\xbd\xcd\xc1\x38\xd6\x06\xbc\x9f\x07\x76\x71\x3c\xfc\x6e\x42\xde\x6c\xae\x8c\xe4\x90\x6f\xb8\x28\xc4\xc2\xc4\x30\x16\x70\x2e\x3a\x19\xbc\xf9\xcd\xfe\x00\xcb\xe1\x7b\x0f\xf8\xdb\x1e\xd7\xcd\xeb\xee\xab\x67\xe1\x5b\xf3\xdb\xad\xa5\x87\x96\x33\xac\x0d\x72\x83\x90\x5e\xf6\x3b\x09\x53\x77\x18\x9a\x89\xd6\x78\xec\x59\x2d\xd8\x22\x08\x15\x27\x3d\xe7\xd6\xda\x59\x91\xff\xe3\xf7\x8a\xd0\x79\x0f\xd7\xc6\x7f\x4a\x5d\xf3\xe7\xeb\x09\xef\xbf\x6d\xde\x7d\x56\xbe\x86\x3a\x0c\x02\x07\x46\x39\x4d\x04\x08\x70\x28\xcc\xfe\x28\x96\x78\xf0\x64\x0f\xf8\xe3\x9c\x7b\x84\x94\x1e\xe4\xa6\xc1\xfb\x99\xf0\xe9\xfc\xfe\xf4\x4a\xdc\x3b\x48\xb8\x66\x7e\x70\x85\xec\xdd\x30\xc7\x8f\x4d\x0c\x6a\xd7\xf8\xf4\xf7\xfd\x10\xab\x1e\x6a\x23\x7c\xfc\x02\x4b\x5f\x93\x33\x1e\x33\x55\x95\xf3\x61\x38\x63\x4b\xde\x9f\x86\x23\xaf\x67\x2f\x6f\x1f\xc5\x28\x76\xc7\x32\xe2\x59\xf2\x41\x80\x7d\x1a\x07\xc3\xed\xb4\xa3\x84\xfa\x1d\xe2\x1d\x58\xb7\x16\x9a\xf6\x3d\xe1\xb9\x03\x78\x38\x66\x19\xe9\x0c\x9b\xd8\x38\x9b\x09\x14\x4c\xda\x91\xef\xf3\x1b\x87\x82\x94\x7d\x7c\x2d\x78\x2f\xaf\xf0\xae\xc1\x96\x7b\xe0\x45\x7e\x56\x9a\xfc\x8b\x15\x8d\x66\x37\xad\x4b\x50\xce\x64\x82\xf5\xa3\xed\x0a\x93\x62\x5c\x31\x67\x5d\xbe\xf7\x85\x48\x59\xfd\x83\x54\x11\xf9\x66\xdc\x0a\x7e\x1e\x15\xce\xe6\x17\xd1\x4f\xf5\xc8\x27\x1e\xa1\x3c\x6f\xdc\xd7\x07\x08\xff\x90\x7b\x04\x4a\xcc\x9a\x97\x7c\x80\x64\xe6\x56\x77\xdd\xf0\x3b\xe0\x14\x8f\x96\x4f\x1e\xae\x0c\x7d\xa6\x79\x0f\x15\x57\x58\xaf\x7e\xad\x3e\xda\x82\x68\x4e\xc0\xad\xe9\x8f\xcc\x42\x9e\x28\xe3\x53\x0b\xa9\x4c\xa3\x48\x73\xc8\x76\x46\xa4\xc4\xfa\x92\xdc\xe7\xba\xfc\x9b\x0f\xc0\x98\x7e\xfd\x14\x3f\x65\x0c\x84\x5e\xfa\xa1\x5f\x8c\x51\x94\xb8\xe3\x77\xf6\x81\x3c\x41\xee\x74\xdc\xcc\xf2\x74\x10\x30\x7d\x5d\x66\xf8\x68\xc2\xd8\xde\x90\x3c\xf3\x21\xb8\xa2\xf8\x8d\xbf\x18\x0b\x90\x5b\x45\xb7\x02\x5c\x4b\x28\xc5\xee\x13\xcb\x4b\x58\x3b\xc0\xa0\xfe\xa8\xe1\x63\x47\x0a\x7b\xb4\x3e\x8f\x8f\x59\x6b\xaf\xc0\xb0\xf0\xe5\x9d\xf8\xd3\xd7\xf9\x13\x0f\x38\xd0\xb6\x13\xe0\xf2\x0a\xb1\xfa\x7e\x48\xdb\x87\xbb\x72\xe2\x06\xb6\x65\x7d\x1b\xe9\x90\x66\xf0\xc6\xaa\x46\x82\x9b\x69\x02\x2b\xd4\xf5\xb7\xbe\x02\xd7\x6e\xde\xb6\x1a\x4c\xd5\x83\x12\x6f\xe9\x6c\x29\x5c\x83\x21\xa9\x28\xbd\x1e\x4f\xf1\x01\x22\xa8\x3e\x9b\x7a\xbe\x7e\x95\xa7\x78\xe9\x32\xff\xb9\xb7\x07\xd5\xa0\x41\x75\x57\x24\x8c\xfe\xab\xe1\x7d\x84\x0a\x50\x61\xfd\x2e\x73\xae\xe0\x86\xf7\x7f\xfd\xd3\x91\x4c\x8e\xf2\xdf\x07\x98\xc8\x35\xb8\xa1\x4a\xa0\xc3\x7e\xcb\x69\xd6\x9d\x4b\x63\xf9\x51\xfc\x4c\xb9\x7f\x24\x5c\x66\x87\x36\xb1\x8e\xf9\xf2\xae\xe2\xa0\x62\x66\x9c\xe9\x64\x0e\xfd\x3e\x27\xc1\xd9\x00\xd0\x17\x42\xaf\x20\x68\xd6\x7b\xaf\x2f\x10\x33\x1d\xb9\xd6\x3b\x3a\xfc\x28\x27\xdf\x6d\x72\xcf\x75\xb1\xe2\xf2\xe2\xaa\x77\xc1\x28\x65\x4e\xb0\xf3\x58\xfa\xb8\x16\x10\x82\x4a\xb9\x9e\xdd\xab\xca\xda\x0a\xcb\x44\xd4\xb8\x81\xc4\x94\x11\xf7\xdd\x34\x51\x63\xe7\xcc\x21\x60\x37\xfd\xe4\x34\x95\x05\xa7\x38\x4b\x91\x59\x4a\x9f\x1f\xc5\xd8\xb5\x97\xbc\x6f\xb2\xad\xaa\x8b\xad\x88\xb5\x7c\x93\x5d\xac\x7d\xe3\x51\x7c\x66\xa6\x4c\xba\x82\x7c\xef\x24\x00\x37\x7f\xc5\x8d\xc9\x89\x96\x2a\xb4\x9f\xb4\x19\x90\x1f\xc1\x89\x45\xa3\xbd\xbf\x0e\x04\x35\x99\x9f\x7d\x69\xf8\xde\xbb\xc3\x5f\xc0\xc4\xb1\x37\x78\x9f\x85\xda\x63\x77\x4a\xb8\x0e\x0e\xcb\xe7\x14\x6e\x8c\xe2\xcf\xfe\xd9\xf7\xb1\x18\xac\x22\x0f\x72\x24\xef\xd4\xdd\xd5\x29\x92\x00\xde\xd3\xe2\x04\x5f\x66\x8f\xd3\x59\xe8\xef\xa8\x3f\xe4\xb0\x0f\x95\xef\x7d\x26\xdb\xba\xb3\xae\x01\xd3\xd4\x4e\xb5\xba\x66\x12\x41\x9b\x1d\x7f\x5d\xef\x59\x16\x33\x4b\x9d\x79\xa8\xbc\x7f\x84\xae\xd4\xd3\x0c\x83\x94\xbf\xba\x16\x79\xad\x5a\xaa\x0f\xd4\x98\x43\xa6\x3d\x5e\x90\xd4\x9c\x7f\xf7\x89\xe5\xb9\xa9\x7b\xca\xe7\x9b\x02\x64\xdd\xc3\x73\x69\x4e\xdf\x9f\xe4\xf3\xe1\x67\x36\xac\x26\xe1\xe2\x58\x32\xc7\x65\xe6\xc8\x57\x7c\x7f\x1d\xb7\x86\x21\x2b\xce\xb9\xd1\xed\x0d\xb8\x26\x5e\x69\x8f\xe8\x8b\x9d\x77\x97\x4d\xdd\x46\x85\x75\xfa\x35\x22\xed\xec\xb2\x06\xce\xdb\x91\xec\xe2\x07\x1b\x76\xa4\x42\xac\xec\x9a\x2a\xb9\x12\x19\xe4\x94\x33\x13\xf6\xaa\xc7\x9e\xce\x79\xbe\xc5\xaa\x90\xc0\x0f\x6f\x13\x8f\x45\x2e\xc0\x98\x89\xc5\x07\xe4\xf8\xaa\x27\x5f\xac\x17\x19\x15\x15\x59\x65\x3e\xb0\x6b\xc2\x4a\xc4\x0a\x4e\x14\x26\x34\x57\x28\xa2\x0c\x81\xe6\x79\x65\xb5\x37\xe1\xa9\x33\xba\xe6\x0a\x7b\x75\x5e\x80\x08\xeb\xc2\xf2\x82\x1a\xf4\x2f\x6c\x16\x83\x3e\x61\x33\x87\x14\x85\x9a\xd1\xab\x17\xf6\x3e\x70\xf7\xc4\x19\xef\xd7\xd0\x64\x93\x55\x14\x08\xfa\x2b\x3f\x96\x16\x4e\xb2\x6f\x2b\x35\x14\x31\xd4\x5a\x78\x1f\x23\x7c\x7b\x49\x3a\xe3\xa3\xe1\xc7\xf8\xa1\x53\x28\x80\x4b\xb0\xd9\xde\xad\x53\x70\x08\x42\x72\xce\x25\xb5\x21\x56\x1b\x62\xf7\xcc\x36\x25\xeb\xaf\x5e\x05\xef\x17\xb9\x49\x10\xda\x32\xc2\x6a\xfb\x66\x0c\x00\x7b\x17\xdb\xe8\xe9\xdd\x77\xe3\x49\xf4\x6e\x8f\x17\x69\x7d\x90\xb1\xb5\xb1\x77\x76\x7f\x87\xe0\xf9\x05\xb8\x6b\x06\x38\x31\xc9\xae\x0e\xca\x7f\xea\xf0\xdb\x9f\x47\xb1\xa9\x0c\x40\xc8\x18\xac\xb7\xb1\xd9\xe3\xfe\x7e\xfe\x1e\x73\xaf\xd8\xf2\x8c\xe7\xf0\x3e\x6a\x99\x7b\x7e\xfa\xfb\x99\xe5\x78\x0b\xd6\xef\xc7\xd8\xc0\x4e\x0e\xf4\x64\x5b\x69\x07\x29\xb6\x7e\xbf\x54\x96\x88\x6a\xc0\x39\xe2\x1f\xde\x54\xf3\x23\x51\x8e\x46\xdf\xdb\xa6\x3c\xc8\x17\x27\x3e\x95\x0f\xe0\xfa\x2e\x5b\x38\x26\xdf\xd6\x18\x7f\xc7\xe5\x7e\x82\x3d\xc3\x6a\x30\xe3\xde\xbd\xbc\x57\xe9\xcb\xfa\xbd\xb0\xef\x69\x86\x7f\x73\xd5\xbd\x4a\xc7\x07\xfe\x38\xde\x66\xd6\x9c\xb9\x46\x3f\xbb\x29\x08\x4a\x82\x5a\xca\x07\x80\x7e\x77\x81\x20\x28\xee\x1d\x3c\xa5\xea\x66\x76\x45\x33\x98\x6d\x43\xfe\x40\xc8\x0c\xe1\x5e\x27\x35\x10\x76\xcd\x04\xf9\xb7\x11\x77\x47\x45\x41\xf2\x66\x16\xdb\x75\xe8\x35\xc3\x4b\x1b\x41\xf7\x29\xb4\x8e\x98\xe5\xc0\x39\x01\xcc\x0b\x82\x18\x6d\x36\x5e\x1c\xae\x2f\x69\xdd\x51\xcd\xe2\x51\xd2\x79\xff\xc6\x3b\x39\x09\x7e\x6c\x0d\xf9\x49\xf9\x47\xfe\x0e\xf2\x0a\xdb\x7e\x8f\xfe\x73\xfb\x45\xae\xf4\xaa\x43\xa1\xf2\xd4\xe9\xee\x79\x18\xc4\xcb\x56\x1d\xb3\x1d\x59\xb1\x6f\xa7\xea\xf9\xd0\x2f\x02\x15\xce\x19\xd8\xde\x6e\x4f\x22\xe0\x0b\x97\xe6\xd9\xe9\x57\x2f\xb7\xf7\x62\x5e\x66\x10\xaa\xd2\x64\x8a\x7b\x71\x3f\xed\x3d\xbc\xa0\xc4\xc1\xb6\x11\x8f\x14\x97\x29\xcf\xb0\x0e\x60\x1e\xd9\x1a\x19\x3d\x08\xfe\x2f\xe5\xed\xc7\x65\x46\x58\x97\xda\x1e\x74\x2d\x51\x81\x04\x92\x7c\xb9\x18\xe1\x04\x6b\x59\x8a\xd7\xf9\xf4\x49\x7e\x64\xbe\x06\x20\x65\xb1\xc1\x7b\xee\x19\x17\x4b\x43\x92\xad\x1a\xfd\x08\x5e\xcf\x91\xc2\x68\xe3\xde\x9d\xb9\xb9\xa9\x0e\xc3\x7d\xd9\x7e\xec\xdc\x26\x2c\x1f\xdf\x27\xea\x0c\x17\x3f\xee\x2c\x8b\xda\x57\x97\x06\xba\x79\xfa\x71\xb8\x01\x83\x77\x79\xe1\x09\x68\x7f\x1e\xbd\xb0\xe5\xa3\xd8\xb0\x86\x77\x97\x25\x26\x13\x28\x6e\xd9\x63\x75\x42\xd4\x30\xcc\xc5\x3f\x09\x0e\xc1\x6a\xae\xfe\x76\x38\x24\x59\xc9\xcb\xe0\x40\x8d\xb7\x82\x83\xed\xcd\x65\x43\xd2\x63\x81\x0b\x85\x27\xe3\xd2\xd7\xba\x77\x00\x37\xc0\xf1\x24\xf0\x9b\x73\x85\x09\x0e\xa8\x7b\xf6\xe4\x77\xbf\x79\x3c\x6f\x27\xb3\x1a\x15\x1f\x7f\x44\x90\xf8\xbe\xf6\x61\x7a\xcd\x20\x0f\x51\x78\xe6\x4e\x03\x9e\x95\xd3\xee\xe7\xa0\x0f\x31\x57\xb4\xb1\x8c\xbd\x2f\xda\xe1\xbd\x33\xba\x48\x11\x29\x1d\x0a\x29\x47\x7e\x07\x7f\x2d\x59\x9c\xec\x40\xec\xf0\x2d\x57\xa2\xe0\xc1\x2a\x18\xf2\x26\x6e\xa9\xd3\x2c\x3d\x5c\x61\xb1\x5b\xe5\x06\x35\xa8\x13\xfd\xd6\xdd\x00\x8e\x1a\x1d\x83\x49\x49\x51\x84\xb9\x1f\x5e\x89\x9e\xef\x37\x05\xef\x22\xc4\x34\xb8\xfb\xf0\xa2\xfc\xe5\xca\x3d\x70\xe3\x2e\xb5\xc6\xab\xfe\x5b\x17\xf2\x80\x02\xdb\xb0\x5f\x64\x62\x64\xcd\x9d\x4b\x33\x1e\x78\x58\x14\x82\xf8\x6b\x8a\x1e\x85\xd3\xe9\xf8\x09\xe2\x48\x8a\x9d\x0a\x83\x8f\xd1\x97\xe8\x31\xc9\xdd\x61\x47\x0c\x9b\x49\x55\x8e\xef\x25\xd3\x7a\x24\x3b\x45\x4f\x1a\x64\xf8\xb7\x82\xb3\xe8\x78\x38\x6a\x6b\xcb\x82\xd8\xcc\x3e\xc8\xef\xda\x57\x5c\xbf\x8d\x7a\xf0\x3c\x8e\x33\x0c\x9c\x66\x91\xce\xc8\x5f\x6c\x6a\x4a\x84\x06\xc0\xf0\xda\xd3\x50\x64\xdb\xca\xc5\x6c\x4e\x3d\x26\xf7\x10\x31\xf7\xa3\x7e\xf3\x8d\xc8\x37\x0f\x7f\xda\xbb\xf0\x9e\xed\x9e\x7c\x36\xa2\xec\xf1\xf7\x56\xd9\x6c\xbb\x28\x96\x95\x7e\x63\xfa\x6d\x9f\x26\x80\x99\x6d\xdf\xfc\x7c\x34\xf1\x51\x89\xb5\x27\xf8\xae\x23\xa9\x6a\x55\xae\x42\xc6\x60\x14\x91\x7b\xcf\x6f\xf1\x9d\x19\xf4\xcb\x3a\xd4\x35\x3a\xf6\xb3\xcd\xd1\x67\x6c\xe5\xc4\x13\x7b\xa6\x37\x00\x8f\xe6\x49\xae\x04\xfe\xb3\x64\x48\x5e\x3e\xc2\x11\x01\xe9\x25\xf6\x01\x61\xfa\xec\x9d\x7c\x4b\x73\x49\x12\x35\x29\x23\x34\xdc\x6a\xab\x2a\x52\x8e\x25\x39\xf5\xb6\xe1\xc6\x68\x0d\x8c\x52\xb8\xed\xe2\x70\x26\x69\x50\x61\xb7\xae\x93\x57\x3d\xa5\x9c\xe8\xd3\xbe\xae\x91\x17\x76\x3b\x87\x43\xf1\x6e\xbf\xdd\xeb\xf8\x86\x56\xc6\x0b\xd9\x25\x2b\x72\x69\x34\x50\x53\x5d\x6d\xf5\x2b\x5c\x84\x96\x16\x44\x51\xc3\x44\xb8\xf3\xc1\x44\xa9\x5a\xfd\x7d\xd6\x7c\x8c\x31\xcb\xfa\x75\x34\xaa\x07\xfc\x82\x94\x3b\xad\xb8\xeb\x03\x5f\xbe\x64\xbf\x6e\x6a\xfb\x3b\x9f\xd6\x07\x6e\xa3\xb6\xd5\xd4\x60\xda\xc7\xf0\xf9\x54\x64\x69\xba\xc6\x8f\x77\x05\x0d\xb0\x53\xfa\xca\x72\x7a\xf6\x1f\xa1\x2f\xfa\xdf\x27\x4d\x3d\x80\xa9\x28\x92\x38\x4a\x24\x2a\xb3\x80\x43\xea\xf7\xa5\x49\x90\xc2\xcc\xa4\xa5\x98\xdd\x3d\xfb\x4d\xfd\xba\x50\x76\xd4\xbf\x9f\xef\x86\x78\xfb\x6a\x0d\x1b\xec\x62\xf9\xb7\x00\x4a\x8e\x56\xd5\xc2\x6b\xc5\xc9\x46\x32\x88\x5e\xf6\xe9\x5f\x09\x40\x94\xd3\xaa\x2d\xe6\xfb\x76\xff\x69\xa2\xd9\x0d\xc9\x50\x4f\xf8\x83\xe2\x8a\x9b\xf7\xc4\xa7\xd3\x6a\x0b\x5c\x67\xaa\x1c\xb3\xfd\x33\xbb\x05\x4b\xca\xad\x6d\xdc\x21\x3b\x7b\xf9\xb6\xda\xe2\xfc\x63\x0d\xf7\xf0\x7e\x14\xa5\x4d\x2c\xaf\xec\xc5\xdf\x1c\x82\x43\x97\xea\x85\x14\x8e\xdc\xe8\x4d\xac\x80\x23\x60\xc9\xad\xd2\xc1\x9f\xd1\x05\xd1\xb8\x84\x5b\x19\xbc\x1d\x00\xac\x53\xab\x1b\xa5\xfd\xe6\xef\x09\x30\x18\x91\xe4\x6e\xd5\xf6\xe5\xf7\x46\xdf\x96\xfd\x87\xf5\x8a\xd7\xc4\x5f\xed\x03\x0c\xd7\x92\x52\x3c\xee\x97\x21\x2c\x1c\x55\xbc\xcd\x8f\x50\xf9\x4e\xe4\x08\xf7\x4e\x49\xc8\x8e\xb8\x46\xee\xc0\x52\x6c\x46\x08\xe7\x21\x14\x82\x6b\xb5\x8c\x4d\x46\xa2\x46\xd0\x87\x23\xb8\x5e\xb5\xb9\xa8\x8b\x6d\xc0\x47\x20\xe3\xae\xaa\x57\x63\x9e\x59\x2f\x2a\xe9\x9c\x82\xf4\x6b\xb7\x43\x1b\x6f\x66\xfb\x4e\x60\x9f\x23\xc1\xfc\xc0\x79\x6e\x55\x6d\x52\x0e\x40\x57\xda\x85\x59\x72\xeb\x81\x3c\xbb\x13\xfe\x8f\xb9\x03\xe7\xfc\xd9\x4a\xaa\xf7\xfe\x18\x6a\x85\xea\x3d\xef\xf9\xf0\x29\xa0\x16\x1d\x76\xd6\x1b\x78\x61\xbc\x66\x47\xe4\xf2\x44\x38\x81\x4d\xd0\x72\x24\x50\x62\xc4\xe4\x0e\xe4\xfd\x4f\xe8\xa4\xbf\x8f\xf7\x40\xd0\xb6\xe6\xa9\x55\xbc\xd1\x1c\xe0\x1c\xda\xfd\x5e\x87\x2f\xb5\xed\x59\xe5\x81\xdb\x00\xad\xe5\x92\xd9\x5a\x97\x1f\xe5\x71\x2b\x50\xaa\x2d\xa0\x1f\x61\x29\x99\xdb\x93\x76\xe8\xcb\x19\x2f\x56\x1d\x5b\x5c\x7d\x54\x1e\xad\x7d\x97\x77\x9b\xa1\xe3\x0a\x75\x29\x1e\xb5\x3f\xdd\x4a\x47\x1d\x02\xa2\x70\xb9\xa1\x50\x1f\x69\x95\x04\x29\xf1\x05\xcf\xce\x7e\x61\x19\xd8\xff\xe8\x10\xbf\x60\x37\xb5\x1b\x5e\xb8\x29\x45\x04\xc9\x2d\xd5\x9b\x6d\xb5\xc3\xf4\xe5\x8f\x77\xfb\x2d\x39\x30\x76\x99\xda\x4d\x10\xf2\x6e\x99\x0a\xf8\x29\xdf\xc0\x46\x52\xed\xb4\xb4\x54\xe2\x38\x33\x74\x0d\x65\x1d\x7a\xd9\x4a\x05\x4c\xbf\xf7\x71\x11\xc9\x07\xb7\xf7\x0f\x19\xf6\x64\x25\x80\xa6\x7b\x46\xe9\xb0\x6b\x26\x9a\x9c\xea\xdf\xec\x79\x34\xce\xac\xd3\x6d\xb9\x23\x27\x77\x2d\x2f\x04\xdd\xcc\x4a\x3c\x84\xa4\x96\x08\x10\x76\x61\x8b\xdf\xea\x46\x75\xed\x2d\x80\x27\xb2\x51\x13\xfa\x93\x97\x88\x29\x78\x8f\x22\xdc\x83\x20\x8b\xe7\xfe\x22\xf2\x8e\xfa\xb8\x36\x9b\xb0\xde\x17\x0a\x6f\xcf\x6b\x78\x58\x27\xff\x53\x88\xe8\x3b\x8c\xc1\x5c\xb9\xc6\x65\x6e\x86\x4d\x04\x95\x76\x9f\x92\x3e\x8a\x01\x56\x57\xa7\x32\x62\x2a\x11\x6e\x5a\xe2\x7e\xc3\x95\x35\x2f\x78\xcf\x68\xbe\x86\x2c\x59\x1e\xa9\x85\xdd\x01\x1b\xd3\x96\x50\xbe\x0b\xfb\xab\x34\x13\xc3\x15\x78\x91\xef\xc9\xf5\x2e\x69\xeb\x53\x76\x22\xfc\x11\x67\x58\xb8\x7c\x13\x5c\xef\xeb\xa4\xec\x49\x64\x20\xb5\x2b\x77\xaa\x7d\xa9\x9e\x2f\x90\xed\x7e\x84\xc1\x0b\xdf\x90\x19\x7e\x03\x53\xb8\xe3\x29\x86\x65\x56\x38\x81\xf4\xe3\x6d\xde\x50\xe7\x50\xcd\x88\xb0\x77\x00\x69\xd5\x05\x2d\x47\x54\x13\x4d\x6a\x75\xd2\xdb\x7d\xf9\x3e\x3e\x9f\x66\x10\x41\x7e\x21\x72\xf9\x19\x7e\x8a\xa8\x26\x59\xb5\xea\x52\x92\x13\xee\xe4\xe3\xad\x7a\x62\x53\xb0\x70\xbf\xc0\x71\xc5\x2c\x82\x94\x68\x56\x18\xef\x5b\xd2\x9e\x66\xcb\x70\x27\xd2\x06\xcd\x5e\xd7\xe8\xfc\x28\x02\x60\xa7\x64\x3f\xdc\x1e\x97\xb4\xa9\x3a\xc9\x80\xc3\xc1\xbf\xfe\xcc\x77\x09\xcf\x8b\xae\x5c\x67\xa9\x4f\xfb\x19\x9c\xd3\xa4\x7d\x42\xae\x22\xb6\x41\xce\x7d\x7a\xe0\xe5\x73\x5a\x52\x84\xdf\xdf\x5a\x1d\x3e\xce\x38\xa0\x8d\xb2\x7e\x17\xe0\xe8\x14\xfd\x66\x11\x0c\xdc\x35\x82\xb0\x05\xfb\x7a\xa8\xad\xd7\xd8\x38\xaf\xb3\x6e\x31\x92\xab\x06\x02\x3e\xac\x03\xff\xba\xb3\x22\x6d\x51\xae\x01\x36\x88\x55\xf3\xf9\x9c\x93\x47\x9d\x18\xaf\x28\xf6\xfa\x9b\xb6\x76\xeb\x2e\x6a\xad\x39\x52\xde\x94\x2a\x86\x47\xe4\xa2\xf7\x26\x8d\xd7\xf7\x09\x17\xc3\x51\x5d\x2a\x5b\xb9\xc0\xb3\xfd\x40\x27\xe7\xfa\xfd\xd1\x67\xe2\x59\x89\x52\x85\x70\x56\x10\x4f\xf3\xe1\x61\x1b\x82\x8e\xe1\x4c\x7e\x69\xf5\x10\x7e\xe0\x5e\x23\x19\xa9\x83\x9d\x33\x0a\xa2\x20\xd2\x45\x16\x11\xef\x5c\x13\x8b\x2b\x9f\x2a\xc3\xcb\xbc\xbb\x87\x28\x36\x78\x5d\xdc\x88\x79\xaf\x0c\xf5\x57\x3e\xcf\x5f\x7b\xc7\x37\x40\xce\x84\xb7\x26\x7e\x45\xf4\xde\xa0\x1c\xe0\x1e\x37\xca\x96\x7e\x9f\x22\x10\x40\x8e\x04\x46\xb5\x69\x4f\xe0\xa3\x80\x00\xc0\x3b\xb4\xaa\xda\x76\xa1\x08\xdb\x89\xfb\x26\xca\x17\xa7\xad\x41\x4a\xf5\xce\x6f\x5e\xc1\x75\x4c\x38\xec\x5b\x98\xfc\x3d\xd5\xaf\x85\x44\xca\x15\xf0\x07\x47\x0e\xd6\xb1\x9c\xf1\xcf\x8f\x69\x29\x26\x07\xdf\xff\x30\x75\x84\xbd\x2b\xb0\x2d\x91\xcd\xd1\x7c\x85\x77\x02\x13\xcd\xae\x10\xb3\x55\x78\x15\xe1\x2f\x7c\x57\xb8\xc9\xe4\x82\x53\x29\x74\x10\xa5\xe3\xe2\x89\x46\x51\x2f\x8e\x76\x3b\x25\xf4\xca\xb4\x1f\x97\xe5\x1f\x15\x9c\x0d\x1d\x25\x10\x66\x1a\xcc\xc2\xb7\x74\x25\x66\x5b\xe8\x89\xf4\xc5\x96\xd1\xa5\x3f\xb7\x3f\xad\x1e\x87\x20\x58\xdf\x90\x78\x80\x95\xec\x6e\xc4\x93\x1c\xf9\x86\x27\xa0\x0d\x7c\x1f\x3a\x3c\xef\x41\x50\xe0\x3d\xba\x39\x6c\xa5\x1b\xfa\x49\xec\x05\x1c\xca\xfe\x73\x80\x2b\xce\xe9\x3d\x46\x02\xad\x8b\x76\x64\xc4\x01\x7a\xcf\xa2\x3b\xdc\x4d\xe1\xfe\xd6\xa0\x89\x9e\x5f\xec\xd6\xb7\x3d\x7a\x7a\xd1\x4c\x6b\x46\x26\x95\xac\x5f\x21\xe3\xef\x57\xb1\xbf\x9f\x0c\xf0\x34\x86\xf4\x1e\xcf\xdb\xe0\x8d\x44\x80\xc6\x50\xd9\x16\x05\x73\xb7\x38\x2b\xe2\x44\xbf\xf6\x3d\x3c\x90\x5c\xce\x3e\x8f\x73\x0b\x6e\x9c\x25\x55\x93\x09\x1e\x78\x41\x53\xb3\x75\x97\x3b\xaf\x18\x08\xff\x10\xfd\x24\x9e\x26\x80\x85\x0e\x13\xb8\x94\x5b\xde\xd2\xde\xb8\x63\x58\x1e\xbd\xb5\xbb\x50\x65\x77\xf3\x9a\xaa\xf1\x07\x58\x81\x53\x64\x64\xc4\x03\xbe\x96\x2e\x5e\xa6\x95\x9f\xe8\x7b\xa0\xce\x48\xed\xb2\x04\xec\x18\xa3\xed\x6b\x49\x01\xc6\xf1\x0d\x43\x84\x2d\xca\x5d\xe3\xd9\x9d\xbf\x6d\x80\xc4\x3a\xcf\x0d\x25\x81\xff\xf4\xad\xaf\xb2\x3e\xcf\xf3\x14\x40\x04\x4f\x2f\xe2\xaf\x08\x4d\x2c\x10\xde\x62\xd8\x83\xbe\xe7\x3a\xe9\xf0\xaf\xd7\x91\x15\x95\x1f\x9b\x48\x59\x2e\x20\x88\xbc\xe9\x47\xf5\x69\x8d\x9f\x6b\x6c\x91\xaf\x33\xda\x83\xb5\xbb\x9b\x29\x95\x50\x97\x11\xdd\xf9\xed\x40\xdb\xdd\x7e\xb4\x5c\xa9\x4c\x6f\xfc\xd9\x7b\xd1\xf1\xae\x50\x76\x0d\x58\xc0\x15\xa2\xa7\xff\x2a\x80\x9d\x44\x00\xfb\x02\x2c\x37\x06\x6f\x78\xd7\xbe\x71\xc8\x88\xc4\x62\xbc\xbe\x18\x6b\xa8\xa2\x8b\x9a\x5f\x21\xa0\x4d\xab\x59\x2d\x0f\x71\xa9\x90\xdd\x98\x71\x9a\x06\xb8\x85\xef\x6a\x54\x15\xca\xa1\xc8\xf0\x42\x92\x04\xfe\x87\xa0\xc5\x91\x05\x20\xb3\x67\x95\xe4\xcd\xb7\x29\x20\xf9\x8f\x04\xef\x71\xfa\x93\x4a\x82\x32\x1b\x04\xe3\xe6\x36\xb7\x64\x7a\x3e\xa8\x01\xd1\xaa\x02\xc9\xdf\x66\x33\x7e\xba\xd3\x11\xcf\x0c\xb3\xcf\xee\xb6\x2b\x20\x2a\xa5\x75\x62\xe1\x43\x90\xfd\x80\x03\x4a\x1b\xf4\x17\xfc\x7d\x26\xa7\xc9\xe9\xb4\xfb\x8b\x9c\x65\x30\x87\x65\xfa\x9c\xeb\x6e\x74\x09\x52\xaa\xe8\x9d\x32\x00\x0f\x88\x39\xa4\xd8\x52\x45\x06\x54\x4e\x55\x51\x15\x8e\xb0\xc3\x7d\xa5\xfa\x84\xb8\xc7\x36\x80\x53\x09\x35\x7e\x70\x70\xc5\x2b\x6f\xb5\x47\xde\x8a\x20\xbd\x4c\x58\xaf\xbd\x67\xeb\xab\x23\x6e\x31\x4f\x3e\x60\xe9\x6a\x08\xe2\x81\x4e\x59\xb4\x50\x29\x2e\xcd\x0a\x74\xdd\xa2\x3b\x82\x2e\x20\xb7\x64\x27\x7d\xdb\x24\xd7\x34\x1e\x52\x99\xb5\xe6\x23\xb4\x25\xe1\xbb\x7a\x51\xbc\xbf\xe5\x25\x58\x0c\x1d\x07\x99\x82\xca\x8c\x39\x5f\x86\x17\xda\x90\x04\x5a\x2e\x9e\x6d\x05\xde\x0c\x3e\x47\xad\x67\x76\x48\xde\x34\xdc\xf8\x9c\x5b\x6c\xf9\x34\x9c\x1c\x90\xa9\x29\x7c\xde\x8f\xbc\x04\x5e\x51\x17\xcc\xbd\x2d\xcd\xa2\x3a\x2a\x85\xff\x0a\x1f\xbd\x56\x84\x19\x90\xbe\xbb\x28\xf6\xfd\xa9\x90\x99\x8e\xf1\xde\x22\x72\xb2\x07\xcc\x68\x03\xf0\x57\xef\xa9\x05\xce\x26\x76\xd3\xcb\x60\x37\xe7\xbc\xf1\xd5\xac\x09\x0f\x80\xa9\xa8\x52\xd3\x70\xec\xf1\xd7\x8f\x0e\x58\xc4\x54\xed\xfb\x3d\xef\x4c\x89\x29\x70\x66\x20\xaa\xb7\x2c\x80\x38\x19\xc8\xb5\xdd\x77\x69\xc8\xfb\x77\xcf\xea\x3e\xa8\x43\x43\xa7\xd7\x51\xae\xa6\x87\xf9\x13\x59\xc3\x95\xd0\xcb\x57\x09\xdc\xe3\x49\xb3\xbe\xa4\x5d\xf3\x4d\x09\xf4\xf5\x96\x77\x71\x1f\xc4\xf5\x84\x25\x3f\x7f\xce\xce\x42\x14\x72\x1a\xc9\xe3\xcd\xfb\xde\x10\xd8\xe6\x9d\xaf\x20\x87\x44\xeb\x05\xf2\xb1\x94\xfe\x70\xba\xde\x62\xf9\x99\x39\x46\xb7\xef\x99\x23\xf3\xd9\x8b\x44\x1d\x8a\x68\xe9\x56\x94\x50\xb1\xea\x2c\xe0\x2e\xce\x0d\xc9\x04\xbe\xea\x01\x06\x93\xaa\x2c\x39\x7e\xdf\x79\x27\xf3\xd0\x36\x79\x57\x29\x4a\x67\xc4\x44\x59\x6c\x2f\xfa\x17\x7e\xab\xcf\x73\xa6\x19\xe1\xfa\x14\x0c\x29\x16\xb6\xce\xdc\x0c\x80\x97\x84\x33\x23\xcc\xc8\x78\x9e\x1a\x16\xa3\xfe\xb3\xff\xa5\x2b\x6e\xc4\x6c\x85\xc4\x43\xae\x4d\xa5\x7d\x92\x8b\x3b\x3d\xc4\xaa\x3a\xff\x3b\x07\x9b\x44\x15\xd6\x1b\x7b\x63\x42\xbc\xbf\xb9\xf6\x35\xda\xef\x7d\x38\x7d\x65\x97\x2d\x83\x79\xda\xa7\x9c\xca\x8f\x19\xc4\x8a\x83\x64\x00\x32\x9d\xef\xe8\x76\x3b\x9f\xf6\x79\x5d\x42\x47\xcd\x2e\xd5\x9e\x77\x49\xd4\x41\x1c\x7e\x86\xcf\xbc\x19\xc2\x9b\x2b\xc7\x16\xae\x88\x96\x95\x36\xdf\x27\xce\x51\xb0\x86\x87\xd7\xdb\x2c\x9d\x76\x6b\x9d\x44\x7c\xa2\xcd\xae\x7e\x24\x22\xbf\xa5\x96\x52\xf3\x8b\x29\x02\xd3\xd3\x40\xae\x64\x40\xb8\x82\x4b\xb6\x5f\x02\xb5\xd7\x5b\x11\xa0\x0a\x76\xe4\x80\xd8\xf0\x37\xee\x24\x29\x25\x54\xaa\xef\x8c\x5e\x0f\x5d\xaf\x12\x90\x4f\xad\x97\xde\xc3\x55\xa2\x6d\x36\xae\xf7\xb2\xbf\xa7\xf2\xb5\x0c\xfd\xeb\x7b\x73\xe9\x3e\xd9\xb6\x57\xfa\x66\x1b\xed\xe3\x79\xcb\x77\xb8\x83\x33\x15\xaa\x43\xa8\x2b\x15\xf1\xaf\x38\x96\xd2\xc9\x54\x69\x64\xfc\xfa\x50\x58\xd2\x5b\xf0\xce\x01\x6e\x6b\xa0\x0d\x01\x5e\x35\x2c\xbf\xcb\xe4\x76\xdf\x30\x43\xa3\xdf\x42\x80\x03\xe4\xdf\x1a\x6d\xd1\x29\xa2\x2f\xc2\x15\x48\x0e\xc5\xc7\x76\x12\x5a\x61\x36\xea\xa4\x39\x04\x61\x85\xcb\x3f\x23\x95\x7a\xc9\xbc\xfd\x00\x4c\xbb\x1c\x0a\x8b\xe7\x66\x89\xda\x95\x91\xfa\xf7\x37\xec\x65\x38\xb8\x7d\x5b\x9e\x86\x2e\xfb\x51\xeb\x9a\x1c\xac\xdd\xb4\x68\x70\x02\x90\x3a\xd4\x99\x74\xc1\x2b\x7a\xae\x64\xc6\xfb\xcd\x12\x9b\xa9\x59\xbb\x56\x3e\xad\x95\xf1\x96\xb3\xfc\x28\x95\x30\x31\x1b\x80\x8d\xb7\x83\x7a\xbf\x14\x7a\xb4\x8f\xa5\xea\x7f\x15\x5c\x20\x08\x7f\xcf\x72\x3d\x5f\x70\x4f\x02\xac\x53\xde\x9a\x96\xc2\x41\xa8\x40\xd0\x92\x6b\xf2\xf7\xa4\x27\x39\x08\x65\x53\xa9\x88\x4d\xbf\x7f\x4a\x67\x90\xef\xec\x7e\xdb\xf9\x7c\x96\x2c\xc4\x68\x60\xfb\x03\xb4\x9d\x3e\x8c\x74\xe0\xd3\x11\x6b\x47\xf6\xb1\xcb\xc4\x00\x9b\xb4\x21\x2e\x02\x34\x3b\xe5\x7a\xb6\x9c\xce\x6e\x33\x18\x54\xab\x45\xf5\x8e\x1a\x27\x2b\xa0\xe5\x06\xf2\xf4\x0e\x5b\xc7\xf1\x76\xa2\x13\x79\x39\xa9\x1b\x75\x13\xd1\xe6\x4f\x53\xd0\x19\xbf\x32\xad\x09\xe6\x20\x79\xba\xf2\x01\x74\x9c\xb1\x4f\x6a\xa1\xe3\x06\xf5\x5e\x1b\x31\xb5\x27\x20\x50\x4e\x64\xbe\x64\xca\x4c\x5d\xf4\x66\xaa\x41\x62\x32\x8f\x75\xf3\x45\xf7\xb1\x8e\x62\x0d\x18\xf4\x4b\x9b\x95\x4c\x6a\xeb\x3b\x57\xe9\x9c\x37\xa1\xca\xeb\xd8\x79\x93\x37\x02\x9b\xa8\x4d\x39\x72\xeb\x46\x91\xd6\xec\x69\x5e\xe6\x91\xaa\x7e\xf7\x33\x1a\xa2\xc2\x99\x13\x01\x64\xa6\x3f\x9d\x8d\x67\x95\xc6\x3b\x30\x9a\x2a\x88\x92\x50\x8d\xa6\x7b\x32\x3f\xbf\xae\x68\x3b\x90\x49\xcd\x64\x1f\x5c\xd7\x7f\x8d\xd7\x01\x48\x79\x20\xcd\xce\x84\x42\x79\x9a\xee\x8a\x61\x6b\x39\x6d\xe1\x71\xf2\x22\x3f\x4a\x8b\xb7\x7a\x17\x5d\xb5\xc5\x44\x3f\x1a\xcd\x49\x14\x79\x1e\xb7\x44\xe9\x26\xd2\xa4\x33\xd5\x1c\x1d\x7f\xef\x44\xc2\x7d\x43\x1d\x6e\x9f\xe1\xde\xbb\xdd\x00\xe6\x4e\xc6\x62\xed\xd2\x4f\x2f\xdb\xae\x2f\xb6\x6f\x00\xbb\x96\x32\x45\x4c\x5f\xc3\xc7\x73\x3b\x22\x94\x63\x67\x4b\x99\xff\x02\xa2\x9d\x0c\xc0\xdc\xc8\xcc\xd0\xfb\xb1\xc5\xb8\x79\xa4\xca\xcf\x87\x41\x38\xaf\x8c\x41\x4a\x81\x63\x78\x52\xc4\x27\x55\x0f\x62\xa0\x9c\x30\x1c\xe0\xcc\x42\x27\x25\x9e\x2f\x78\xa6\x65\xe1\x9c\x92\x6c\xea\x71\x75\x59\x3b\x17\xc4\x8f\x02\x14\x38\x76\x1f\x04\x43\x61\x34\x12\xed\x99\xe4\x19\xd5\xca\x14\x2b\x94\xfa\x7d\x7d\xc4\x88\x94\x90\xa0\x07\xaf\x38\x4f\x32\xdc\x05\xbe\x6f\x94\x5a\xaa\x9e\xd9\x89\x3c\xed\xa1\x3d\x62\x7f\x7a\x8d\xf3\x23\x30\x87\x56\x91\x52\x75\x9a\x10\xf9\xbe\x91\xab\xa5\xb6\x28\xac\x0c\x56\xc7\x0e\x58\xb5\x9e\x22\x2d\xba\x17\x0e\x80\x88\x11\xf0\xf7\xe1\xad\x48\xe0\x38\x1b\x8d\xea\x5c\x15\x36\x99\x10\xd1\x76\xd3\xee\x75\x45\x3d\x2c\x35\xb8\x23\x82\x4d\xa4\xac\xcd\xdf\x2c\xe9\x35\x84\xa8\x54\x9d\xb0\xb1\xf7\xfe\xaa\x31\xee\x29\xc0\x3d\xe2\x04\xb6\x9e\xdd\x21\xfb\xb2\xfb\xa3\x4d\xce\xd1\xe0\x2a\x2c\x59\x64\x2f\xe7\x62\xb8\xf0\x8b\x5d\x81\x0e\xa0\x9a\xe6\x1c\x2f\x87\x9d\x52\x24\x31\xf9\x4a\xec\xe1\x60\x71\xa1\x37\x61\x2d\xf5\x3a\x46\x59\x42\xdd\x85\xb5\xbc\x98\xd2\x60\xc4\x9f\xcb\xc6\x61\xce\x9a\x8c\x7b\x83\x87\xb7\xee\xb3\xc0\xfd\x30\x30\x87\x13\xe9\x71\xf0\x27\x1e\x60\xf2\xd6\x2c\xcd\xd3\x98\xe3\x92\xc9\xb5\x73\xfb\x32\x6a\xe8\xcc\x6f\x7e\xe1\x05\xa7\x5e\xca\x15\xff\xe0\xdf\x89\xb2\x6f\x5e\x25\x94\xc0\x46\xb9\x98\x4b\x97\x73\x99\x1f\x98\xa4\x3c\xdd\x49\x97\xf4\x89\x2e\x3b\xfd\xf5\xf4\xd2\xab\xdb\xac\x23\xb3\x7b\x94\x24\x01\xf5\x82\x73\x56\x72\x03\xdc\x46\xd2\xaf\xdb\x34\xaa\x32\x8f\x88\x73\xd8\x75\xdd\xb4\x09\x97\x45\xdf\x23\xd9\x92\xde\xd4\x71\xe3\x96\xb6\x01\x31\x9d\xf8\x02\x4f\x5f\x89\xc9\x7a\xfd\x30\xe7\x93\x9c\xcb\x28\x71\x23\x33\x2d\x91\x71\xf0\x0f\x3b\xf1\xe7\x4f\x30\xbe\xc7\x52\xa0\x27\xcc\x14\x66\x82\xc2\xf5\xac\xe0\x56\x22\x0f\x42\xcc\xd4\xc7\xc9\x86\xbd\x3c\x07\xbd\x6b\x7c\xa7\x43\xe1\xef\x09\x70\x67\xb6\x92\x7e\x8f\xa0\xd7\x6b\xb9\xbc\x3b\x03\x06\xe8\xed\x72\x51\x2b\x9c\xeb\xe6\xb1\x23\x9b\xef\x3e\xe9\x81\x17\xb6\xbc\x2e\x2a\xc2\x4a\xc4\x05\x38\xcb\x73\xd1\x95\xc0\xd8\x3d\x25\x28\xd8\xeb\x12\x9e\x6d\x06\x10\x9d\x8a\x71\x37\x3b\xe3\x53\x5a\xd2\xb9\x4d\xba\xa8\x1b\x1a\xdd\xe0\x3d\xf8\xe7\xee\x10\x28\x9e\x3a\xa9\xf9\x82\xcd\x42\x49\x3d\x88\x53\x7b\x27\x7b\xa8\xf1\xcb\x24\x8b\x7c\x7f\x10\xa7\xfb\x68\x8a\x94\xd1\x1a\x5a\xa6\x55\x7e\x1c\x59\xb6\xac\x1f\x81\x9f\x5b\x0f\x1a\xc4\x57\x58\xa3\x10\x85\x77\xa2\xd4\xad\xce\xdd\x29\xa5\xde\xc9\x18\x24\x8c\x9f\xf1\x29\x25\x40\x15\x79\xf8\xc8\x11\xf6\x4b\x1a\xa6\xc4\x35\x88\x43\xe0\x5c\x6f\x77\xc7\x31\x9e\xbd\x1a\x2b\xfb\xa4\xa9\xc2\x7e\x6c\xf0\xca\xfc\xad\xed\x47\x74\x1a\x0f\x92\xcd\x75\xe2\xe7\xed\xb7\xc2\x7e\xab\xaa\x6d\xf1\x42\x35\xbb\x25\x30\x7f\xcb\xf2\x76\xaf\x84\x83\x79\x5f\x60\x08\xad\x7d\x85\x2f\xe0\x5b\x68\xf6\x56\x84\x4d\x73\x37\x0f\xf8\xf8\xe5\x4d\x37\x59\x78\xd4\xe1\xd2\x75\x2d\x94\xd8\x7c\x6e\x94\x37\x86\x6b\x34\xb6\xc7\x47\xbb\x8b\x74\x48\xac\xb1\x63\x50\x3e\x00\xc8\x72\x95\x28\x89\xcb\xe3\x72\xa0\x90\x88\x05\xdc\x35\xc5\xd4\xf6\xf9\x28\xd6\xa7\xea\xdd\x9e\xd6\x78\x7d\x7e\x3f\xc3\x0d\x2d\x1f\x7b\x42\xcd\xe0\xe9\x3a\x39\xf4\x3b\x03\x00\xfe\x51\xc3\xbb\x19\xdc\xb6\xf4\x84\x05\x55\xed\x20\x11\x1d\xfa\xc6\x49\xe5\x9d\x3e\x04\xe9\xef\xd4\x83\x46\x75\x4e\x16\xe7\x72\x34\x5b\x97\x83\x2d\x1c\x8b\x61\x6b\xf7\x47\x3a\x4a\xc7\x79\x22\xad\xd6\x34\x97\x6d\x95\xce\x74\x25\x3b\x2e\xcf\x0a\x10\xba\xd4\xfc\xf3\x09\x21\x38\xbf\x77\xa8\x65\xe3\x8f\xf5\x7c\x23\xcb\xed\x52\x37\x4c\xe6\x1a\x92\xb6\x4b\x14\x4f\x68\x19\xfc\xc7\x60\x3e\x00\x3b\x87\x2f\x83\xc3\x23\x9f\xe6\x7a\xe6\x76\x62\x76\x62\x29\x98\xe5\x87\x4b\xf3\xc2\x93\xa7\x71\xbf\x06\x60\x4f\xc9\x40\x7d\xb4\xbe\xa1\x9f\x51\xd9\x61\xd6\x95\xa5\x98\x72\x23\x33\x87\xa4\x95\x57\x05\x1e\x27\x93\xe1\xce\xcf\x88\xf8\xfe\xd3\xc9\x38\xcc\xc6\xe3\xc6\xc7\xfe\xe4\x8d\xea\x8e\xde\xbb\xb2\x4a\x10\x74\x24\x95\x20\x9e\xb5\x2f\x7a\x92\xb8\x55\xcd\x1d\xc1\x18\x17\xfb\x93\xe2\xf0\x27\x41\x4c\xc6\xb4\x1c\x1e\xc4\x24\x00\xf5\xd7\xaa\xf5\x68\x9d\x7d\x47\xba\x2d\x9f\xb3\x42\xfa\xbb\x4f\xba\x57\xc6\x4c\xad\x79\x96\x1c\x1c\x0a\x07\xcc\x7a\x92\xc5\x7d\xa7\x4d\xed\x3e\x2f\x45\x07\x67\xc5\x98\x9a\x2c\x6e\xcd\x86\xc2\xbc\xc6\x22\xa9\xf9\x7d\x22\x85\x2b\xf5\x5e\x78\xe7\xf7\xa2\x78\x74\xb4\x5d\x4f\x35\xaf\x2b\xed\xd1\x5b\x79\x3f\xbb\x5e\x97\x2a\x6d\xb1\xa0\xeb\xc7\x9c\xd8\x6c\x6c\xe1\xdf\x87\xf5\xe3\xcf\xfd\xcd\xbf\x01\xfc\x2f\x0a\x7a\xc1\x9f\xad\x10\x58\xc9\x5c\x69\x92\xe1\x30\xc3\x87\x0e\xf3\x1b\xcd\x51\x56\x39\x18\xef\xdf\x73\x21\x3e\x2f\xa6\x02\xf6\x09\xc8\x5b\x49\x8c\x0b\xc0\x29\xb7\x69\xfe\x9d\x5e\xca\xe4\x03\x57\x70\x8e\x02\x4c\x20\x97\x07\x6f\x7d\x07\x54\x8f\xf7\xbe\xac\xac\x3c\x7a\x46\x14\x0b\xf7\x74\x16\xe5\xf0\xa0\xf2\x47\x5a\x9b\x6d\x9d\xc1\x99\xdd\xed\xe0\xd0\xa7\x51\x6c\xb7\x9c\xeb\x8e\x08\xb5\x7f\x4c\x14\x13\x01\x7f\xc6\x8e\x5f\xc2\xdb\x1e\xbd\xd6\x1e\x5e\x57\x75\x09\xc9\xe3\xf9\xb3\x83\x77\xf9\x6d\x47\xd9\xc9\x1d\xbb\x69\x87\xfb\x28\xae\x85\x91\xcf\x6b\x47\x00\x2b\x81\xc3\x83\x01\x8f\x1a\x98\x3d\x06\x4a\x9b\xaf\x86\x41\x9c\xea\xed\x29\xa3\x52\x7c\x84\x20\xbe\xcb\xcf\x6f\x05\xb9\x25\xab\xa8\x22\xae\xca\xba\xe8\x76\x9a\x00\x78\x98\xaa\x01\x9c\x92\xb5\xc5\x74\x55\x19\x94\xe0\x3c\x08\x7a\xea\xd1\x68\xb8\x72\x73\xd4\xef\xd9\x0e\x35\x48\x8b\x68\x66\xa6\x90\x14\xaa\x07\x08\xca\xf5\xe3\x65\xf4\xb4\x18\x86\xba\xff\xed\x11\xe6\xb7\xad\x4e\x94\xf9\x06\x96\xab\x5e\x52\x38\x95\x76\x2f\xbc\x51\x02\x29\x15\xce\x45\x3f\x5d\x47\xf6\xf6\xd0\x51\x50\x5b\x35\xee\xef\x56\x4d\x99\x11\xf6\x77\xcd\xef\x35\xea\x34\xf6\x87\x76\x28\x82\xf9\x70\xc9\xca\x13\xf8\xa5\xbc\xf3\x2a\x22\x93\xac\xad\xe3\x6a\xb9\x6e\xa1\x76\x51\x77\xdf\x09\x3d\x78\xdc\x70\xc6\xa0\x78\xab\xbf\x97\xdb\xcd\x86\x7f\xe5\x1b\xde\x82\x74\x7f\xb1\x94\x1d\x0f\xe2\x0e\x12\x0c\xfe\xb6\xf1\xe9\x5d\xb3\x77\xb9\xc3\x55\xa4\xab\x2c\x3c\x18\x66\x71\x38\x5f\x34\xbc\xa4\x7c\x2b\xd1\x5e\x37\x45\xb7\xcb\xfc\xa2\x36\x73\xb8\x92\xd1\x83\xb9\x49\xb5\x8a\x22\x6d\x88\x64\x0e\x15\xa4\xca\xb5\xbc\x24\x14\x6d\xb5\xdd\xac\xf9\x07\xa2\xd8\xce\xe8\x13\x09\xee\x46\xfa\xc9\x4e\xdc\x32\xab\xab\xc8\x3d\xd6\x9c\xbe\x09\x91\xfa\xda\x4f\xa1\x12\x4c\x10\x0a\x85\x8a\x06\xc7\x81\x8b\xe9\x7a\xe7\x08\x0a\x4d\x7f\x50\xd3\xc3\xf7\xcd\xf1\x72\xf9\xe8\xbe\x87\x77\x21\xed\x1e\x73\xc7\x57\x2f\xe3\x89\xb7\xa9\xaf\xfa\x8d\x59\x78\x5b\xe3\xb0\x21\x36\xa2\xad\x5b\x7d\x60\x3d\x34\x87\x33\x14\xd6\x4a\x7c\xab\x9a\x71\x41\x2c\x09\xd2\x27\x61\xed\x19\xef\x96\xa4\x1c\x9c\xc9\x68\x96\xdd\xe3\x69\xc1\x5d\xe8\x7d\x31\x35\x3e\x38\x82\xd8\xc4\xb3\x1c\x65\x54\x3d\x74\xf8\x1c\xa3\xb9\x1c\x60\xab\xdb\xcb\x11\xef\x9a\xf2\x19\x3c\xb8\x14\x45\x93\x25\x81\xd3\x70\xa5\x51\x85\xfd\xed\x6e\x58\x85\xc7\xf6\x6b\xf8\x00\xa6\x30\xc4\x92\xe5\x47\xdf\x9e\x1d\xdc\x57\x5a\x33\xde\x97\x20\x98\x37\xab\x80\xb3\xce\x7c\x15\x80\xa6\x03\x1d\x1c\x9d\xd9\x0c\x27\x51\x94\xfa\xfd\xb4\xd0\x01\x3b\xdc\x50\x13\xdc\xdd\x02\x5c\x61\x9e\x71\x26\x8c\xc9\x4f\xd9\x1c\xd3\xad\x40\xd1\x3d\x8b\xe9\xa2\x27\x18\x6e\xaf\x0b\xd9\xbd\x0b\xef\xa7\xe7\xb4\xf4\x14\xb8\x42\xb5\xfe\x00\xc0\x6f\xf0\x6c\xdb\xa5\xf4\x70\xb0\xe4\x89\x8e\x8f\xbf\x3c\x9b\xca\x9b\x49\x95\x86\xea\xfb\x11\x83\x5d\x20\x76\x16\xa5\xf9\x5a\x87\x9f\x86\xf8\xc3\xfc\x05\x48\x67\x55\x23\x23\x2a\xe5\x2d\xba\x7d\x0a\x74\x32\xc3\x41\x6f\x72\x0d\x09\x15\x6e\xa4\x0e\xb9\xf5\x4e\xa3\xe2\x25\x44\x33\x56\xa7\xfd\xbb\xfb\x07\x58\x13\x6a\x91\xf6\xeb\xec\xe9\x82\xa1\x6f\x2d\xc6\xdc\xd9\x33\x6d\x01\xf8\xe5\x4a\x73\x70\x36\x9a\x68\xc0\xa7\x37\x30\x3c\xf1\x70\x35\x19\xe0\xba\xfe\x6e\xc6\x6a\x74\x2e\xbb\xd8\x0e\xd8\xb3\x6a\xaa\x41\x14\xc6\x60\x26\x8e\x8f\x4b\xd9\x9b\x59\xd9\xd3\x33\xd3\x05\x3d\xdf\x88\x24\x17\x5e\x4a\x6c\x8f\x38\x3d\xc4\x43\xfc\xe4\x39\xef\xd5\x4f\x80\xfb\x32\x19\x8f\x6e\x84\x8f\x9b\xa2\xfc\x86\xfd\x73\xcf\x1f\xf1\xf5\x66\x22\x9e\x30\xd8\x2f\x81\x48\x84\xe8\xc0\xbe\x2c\x4a\xfe\xb1\xce\xeb\x8b\xc1\xba\x24\xc1\x8c\xd2\x8d\x2e\x6c\x59\xc5\xdf\x44\xbf\xc5\x78\x99\x38\x9b\x2b\xf0\x2a\xf3\xa8\xc0\xef\xd2\xc9\x3d\xed\x29\x3b\xa8\x30\x29\x74\x59\x49\xef\x60\x60\x8b\x75\xff\xb6\xe8\xc0\xab\x27\xcc\x0a\x1e\xfe\xc5\xf2\x36\xc0\xc4\x4b\x84\xa2\xc8\xad\xa5\x1e\xb0\x45\x1f\x35\xc6\xab\xfc\x21\x47\x48\xcf\xb3\x7e\x0c\xe3\xfc\x49\x87\xdd\x61\x38\x93\x2e\x9d\x87\x38\x2d\xbd\x93\x1c\x97\x48\x98\xfd\x49\x95\xf5\x5c\x49\x00\x73\x15\x65\xc8\xdc\x6f\xcb\xfc\xb9\xbe\x27\x75\x17\xae\x89\xf8\xe1\x0c\xd1\x98\xdc\x78\x71\x4c\xbb\x7e\xd1\xcc\x63\xd1\xf2\xde\xd0\x85\x36\xa0\x5f\x0e\x31\x28\x2a\x50\x02\xbf\x0a\xd1\x36\xee\xc5\x81\x90\xe4\xf1\x3d\xf7\xf6\x25\xfa\x2f\xe0\x67\xc6\x00\xf7\xe5\x40\xcd\x2c\xcf\x90\x78\xf2\xa1\x55\xf7\xf7\xf3\xee\x87\x3d\x08\x25\x2e\x92\xc1\xde\x61\x0f\x70\xd5\xb1\x9d\xa9\xe5\x77\x01\xda\xcf\x90\x64\x66\x91\x28\x23\x2f\xb8\xfe\x56\x67\xb3\x84\xf7\x34\x7a\xce\x27\x06\x73\xdb\x6b\x14\x8e\x05\x62\x5c\x84\x36\x3a\x69\x88\x74\x64\x73\x33\x21\xd9\x93\xc7\xdf\xab\xd6\xf4\x55\x2f\x25\xaf\x6d\xc1\x4b\x47\x06\xb4\x55\xa7\xee\x1a\xf6\xe1\xd2\x1f\x0a\xe2\x10\x88\xad\xf7\xe0\xfe\xb9\x94\x9a\x6a\x37\xb1\xd1\xdf\xcb\xcf\x10\xcf\xae\x8c\x03\x88\x87\x00\x37\x47\x1c\xae\x74\x0c\x5f\xe6\xd4\x0f\x12\xef\x36\xd4\x0f\x88\x41\xfc\x93\x8e\x93\x96\xf8\xbb\x7d\xb2\x7a\x9d\xe9\xd6\x8b\x49\x80\x55\x55\x15\xc3\xf3\x68\xdb\x15\xdf\xe5\x18\x3b\x6a\x4d\x1b\xba\x33\xac\xed\x35\x7e\x28\x73\x60\x50\xae\x7e\x42\xdd\x29\x6f\x13\xb8\xbf\x3e\x69\xa6\xdc\x14\xa9\x67\x0f\x13\xe4\x04\xba\x29\xd7\xa0\xe7\xa8\xe9\x54\x24\x6f\xf3\xcd\x0b\x76\x8e\xbc\xea\x29\x91\x65\x11\xbf\xb2\xd5\xb8\x07\xf5\x4e\x4d\xd9\xe8\x0e\x32\xdf\xd2\xdc\xca\xa9\x8b\xc9\x13\x00\xfd\xeb\x29\x07\x10\x9c\xf4\x80\x42\xf4\x61\x69\x0b\x2c\x20\x9b\x4b\xaf\x97\x04\x1a\x6d\x04\xf5\x20\x7e\x51\xda\xb3\x45\xe9\x4e\x2a\x1e\xb4\xb5\x83\x76\x36\x97\x94\x88\x86\xae\xf1\xf3\xca\x36\x94\x2a\xc1\x67\xcc\xb5\xef\x1a\x4e\x50\x9e\xef\x57\xf5\xf2\x2e\xbd\xb9\xf6\xf1\x1c\xae\xdf\x8f\x9d\x5d\x88\x17\x5b\x1b\xd5\x80\xdd\xaf\xa9\x8d\x8f\xe2\x61\x89\x20\x9c\x7b\x44\x23\xbd\x6d\x69\x83\xbb\x9a\xb4\x2c\x86\x3d\x8a\x70\x5f\x02\xde\x7f\x13\xcc\xda\xbf\xa6\x2f\x7b\x02\xba\x85\x90\x33\xc6\xc6\x65\x25\x7c\xbd\xfb\x4a\xeb\x18\x04\xc0\xdd\xe6\x6c\x0b\x49\x79\x61\x08\x53\xce\xf8\x2d\x63\x64\x71\xe1\x11\x27\x6d\xb2\x5b\x89\xdc\x45\xb1\xa5\x86\x0c\xc0\x5b\x38\x94\x5c\xe9\xe6\xb8\x85\x39\xed\x4c\xab\xed\xb5\x1b\xf9\xc4\x60\x97\x06\x5c\x3b\x71\xdf\x15\xe2\xc2\x2f\x61\x88\x4b\xb9\xde\x99\x9f\xad\x5e\x4b\xf7\x81\xf9\x2b\x16\xcd\x0b\x50\xfb\x43\x91\x1e\x72\xaa\xa9\xcb\x20\x1b\xf6\x54\xf2\x52\x4c\x50\x08\xba\x9d\xc0\x4e\x92\xdf\xeb\xde\xfb\x61\xa3\x39\x41\x42\xef\x8b\x2a\x09\x9b\x33\x7c\x9f\x34\xed\x77\xc8\x7a\x8f\x70\x6f\x4b\x6f\x28\xfb\x2b\xa1\x4a\x0d\x88\xc9\x47\x5e\x8a\xdf\x5e\xe3\x3a\x11\x29\xbf\xf4\xe4\x82\x38\x35\x52\xb0\xb3\xc2\x51\x03\x72\x8f\xa9\xd2\xfe\x5d\x24\xe6\xea\xa7\xd6\xec\x4b\x69\xbc\xe8\xd9\x23\xc7\x07\x75\xa3\x63\xc7\xa5\xab\xd4\xc2\x69\x36\x2f\x7f\x78\xb2\xbe\xc1\x5b\x2f\x22\x10\x83\x2f\x0e\x55\x91\x37\xc4\x4f\xab\xbb\x63\x02\xf0\x1b\xbd\xa5\x71\xc4\xb3\x94\x2b\x76\xb1\xd9\x06\x3f\xcd\x23\xf1\xef\x26\x60\xbc\xf3\x3b\x96\x02\xae\xb2\x21\x98\x5f\x6d\x5f\x59\x6e\x4a\x53\x11\x74\xb1\x7c\xc0\xbb\x4c\x0b\x7c\x94\x13\xc1\x45\x34\x42\x9e\xb0\xbb\x3f\xfe\xbd\x3e\x53\x41\x16\x77\x96\x2e\x7b\xec\xf9\x52\xf2\xdf\x70\xbd\x1a\xe4\xfd\x8c\x35\xd9\x06\x34\x53\x33\x95\x37\x71\x66\xbc\x0f\xa0\xf2\xfd\x83\xa7\xf2\xb0\xef\x70\x0e\xe5\x6b\x0d\x84\xea\x08\x53\xf7\x02\x54\x27\x0d\x55\x7b\xdd\x1e\x58\xae\x48\xf5\x66\xb7\x15\x91\x6d\xa7\xc9\x1a\xca\xd5\x2d\x36\xdc\x2b\xc4\xdc\x83\x9d\x43\x54\xe7\x9e\x9f\x02\x77\x77\xd4\x4f\xda\x3b\xc1\x13\x25\x2a\xc4\xbc\xf3\xcb\xbd\x36\x59\xbf\x5e\xd4\xfa\x88\x65\x86\x26\x79\xde\xf0\xfd\x51\xdf\x59\xa8\xc1\x04\x39\xd4\xbd\x0e\x9f\x9a\x37\x97\x0f\x9f\xdd\x08\x66\xa6\x4e\xee\x88\x17\xfa\x05\x8e\xe8\xa4\x5a\xc6\xfa\x2d\xf8\x5b\xb3\xb5\x52\x4a\xf2\x84\xc5\x93\x09\xfb\x10\x1d\xdb\x74\x89\x1c\xc1\xac\x5f\x38\xfd\x56\x02\xbf\x7d\xb9\x8c\x44\x78\x2f\x58\xe5\x7b\x3b\x1c\x72\x81\x18\x3f\x9d\x43\xd6\x05\xa3\x82\x71\xf9\x8f\x55\xf8\x5b\x4a\x0a\x34\x69\xa9\xfb\xe8\x04\x18\x97\xe6\x0b\x71\x4b\xe3\xb8\x1b\xa0\x5f\x45\x3b\x6b\xab\x45\xb5\x53\xf9\xea\x4f\xa3\x92\xbd\xfb\x5b\xd5\xe5\x38\x53\xc2\x78\xd3\xfc\x0a\xad\x8b\x4b\xc9\x60\x97\x7d\x78\x27\x47\x93\x8d\xf8\x18\xac\xdd\x16\x13\xc7\x97\x6d\xf5\x6b\xa2\xcd\x56\xf4\xde\xef\x47\x69\x8f\xb1\x18\x77\xe7\x98\x35\x21\x59\x1b\x27\xbb\x6d\x84\x41\x99\xed\xd2\x4c\x34\xdc\x23\x37\x7e\xef\xcb\x9c\x64\x03\xb5\x32\xdb\xa3\xf7\xe9\xdc\x06\xc4\xb8\xe8\x97\xf4\xf1\x43\x40\xa0\x62\x8b\x2d\x4a\xf1\x21\x74\x26\x1d\x00\xf1\x7e\x94\xe6\xdb\x62\x28\x87\x96\xff\x02\x7b\x4c\x6f\xf8\xbd\xd8\x4a\x4d\x1d\xf9\x6a\x40\x6f\x2f\xf5\xb4\x79\x71\x8f\x5e\xe0\xf1\x8b\xa6\x0f\x79\x84\xd8\xdf\x99\xa3\x8e\x62\xe1\xec\x00\x9d\x8b\x3c\xef\x87\x9e\xf0\x14\xa7\xef\xe3\x66\xf1\x74\x7b\x70\xec\x2f\x48\x6f\xc8\x06\xdb\x0d\x7c\x02\x70\xce\x87\x10\xd8\x83\x14\x1a\x7c\x89\x34\x2f\xb4\x5c\x6f\x78\x69\x4f\xf6\xb1\x63\x79\xf4\xe4\xfd\xdc\x91\x6a\xf6\xe4\xcc\x6f\x7f\xd2\x57\x99\xae\x91\xc2\x79\x9b\x04\xc8\x15\x93\xad\xd5\xde\x87\x96\x59\x96\x1b\x86\xbe\x88\x47\x2c\x79\x4b\xe5\x7c\xeb\x5b\x69\xdf\x86\x36\xdf\xb6\xf1\xea\xc5\x86\x8e\x7c\xae\xf3\x8e\x97\x71\x8c\xe8\x86\x4b\xa5\xf9\xce\x56\x95\x2d\xd2\x47\x9a\x04\xba\x18\x8c\x29\x4e\xbe\x81\xf1\xf0\x05\x65\x3c\x3f\x3b\x30\xe2\x8f\xff\x4d\x9c\x0f\x1d\x5b\x03\xc2\x14\x2b\x9d\x0b\xd5\x1e\xdf\xda\x5f\x03\xd7\x78\x68\x4c\x23\x93\xb8\x00\xf0\x87\x37\xb4\x3f\xc2\xda\xe0\xcc\x40\x55\xbd\xce\x47\x61\x37\xb0\x77\x77\x6e\xf0\xf4\x93\xed\x8a\x7c\xdc\x9e\x54\x10\xf9\x19\xb2\x0d\x46\xfe\x28\x32\xd9\x8f\xa1\x02\x08\xb4\xb3\xb6\x1e\x7b\xf9\x58\x82\x86\x62\x53\x8c\x47\x8f\x47\xe1\x81\x00\x85\x22\x08\x09\x10\xd1\x29\xd7\x5e\xe8\xa3\x04\x94\x05\x85\xa5\x87\x8f\xd1\xf0\x32\x5f\xf4\x7a\xf2\x52\xdb\x63\xdf\x4d\xeb\x97\x99\x20\x9f\x42\x6d\x94\x52\xcb\x9a\xe9\x34\x5b\xa7\x07\x88\x09\x1c\xda\xf6\x94\xe2\xe6\x7d\xaf\xd1\xdf\xef\x1c\x3c\xd3\x77\xbe\x0f\x90\x1f\x1c\x94\xb8\xb7\x8f\x82\x99\xbe\x3d\x4d\x9d\xbf\x2d\xa0\x51\x9a\x43\xe8\xdd\x4c\x0a\xbf\xf5\x70\x8b\x2d\xf5\xf7\xef\x15\xea\xb8\xc1\xa5\x28\xf6\x78\x7e\x31\x04\x70\x5e\x5a\xd7\x79\xce\x4d\x5b\x26\x1e\xb1\xaf\x15\x7d\xf1\xee\x9a\x7b\x8b\xbd\xe9\x67\x36\x3e\xf0\xf4\xb7\xef\x31\x23\x32\x52\x19\xbe\xa6\xe7\x5d\xf7\xb3\x75\x6c\x8e\x9c\x1d\x82\x51\x4b\x6d\xe0\x99\x95\x6b\x82\xec\xdf\x9d\xce\x19\xa6\x0a\xb5\xc0\x1d\xba\xb0\x7e\xac\x5d\xa3\xf2\x05\xb9\x55\xd7\xa8\x4f\x1c\xc2\x21\x6d\x62\x95\xcd\x37\xc4\x81\x0f\x58\x27\x17\xf8\x1e\x64\x58\x8a\x45\x0b\x96\x4e\x10\xc3\x9b\xf0\xc8\xa0\xce\xf9\x15\x7e\xf3\xb4\xcb\xa4\xf6\x89\xe5\x61\x74\xcd\x6c\x49\xaf\xd4\x91\x39\xac\xd0\x85\xad\x4c\x58\x3c\xf0\xb6\x88\x5b\xa3\xb2\x34\xb5\xff\xb1\xf7\x25\x3b\xaf\x32\xcb\x96\xf3\xfb\x18\x35\x2b\x31\xa0\xef\x54\xaa\x81\x6d\x0c\x18\xd3\x99\x1e\x66\xb4\x06\x4c\xdf\x83\x54\xef\x5e\x99\xdf\x5f\x83\x73\x6a\x76\xe7\xc7\x92\xb5\xb5\xad\xcf\x0d\x49\x64\xc4\x5a\x19\x11\x2b\xb8\xb2\x8f\xb2\xc7\x2f\x75\xd5\xe2\x17\x90\x72\x4d\x6a\x97\x76\xbd\xcc\xad\x02\x8e\x78\xc9\x79\x9e\x6b\x9e\x73\x37\xb8\x4c\xa1\x74\xf5\xad\xad\x77\xe3\xb6\x3d\x7e\xfd\x5b\xaf\xf9\xe3\xa4\x48\x9c\x12\xd9\x6c\x45\x81\x3f\x23\xbc\x85\xdb\x50\xb0\x1d\x05\x62\xf1\x26\xf3\x95\x9b\xfd\xe3\x1a\xf2\x65\x25\x92\x30\xd5\xe4\x70\x94\x78\x8c\x73\x94\x1f\x95\x6a\xc1\xeb\x77\x7c\x32\x1e\x45\xd8\x0c\x55\x9b\xeb\x40\x27\x7a\xf6\xc1\xf6\x79\xbc\xaa\x70\x7e\x53\x5c\x02\x60\xe1\xf3\xd0\xec\xb7\x43\x61\x06\x96\xc9\x19\x80\x62\x50\x67\xf2\x25\x10\x82\x78\xdf\x0a\x61\x2c\x3a\x25\x27\x17\xb6\x04\x71\xb2\xfe\x7e\xc2\xd1\xf4\xaf\xec\x5d\x74\x02\xfa\x4d\xe5\x95\xfd\x19\x92\x00\x0b\x6b\x7c\x2f\x9a\xc2\xe5\xd9\xff\x52\xeb\x09\xf5\xd6\xc8\x9f\xfb\xb4\x25\xe7\x50\xb6\x02\x1b\x69\x1e\xc1\xf0\x44\x1f\xd7\x71\x9c\xa7\xf1\xfe\x00\x61\x1f\x0a\x0d\xce\xd3\x93\xda\xde\xef\xc7\xcc\x90\x0a\x2f\xcb\x00\x9b\xd8\x68\x94\x00\xc3\xb2\x5d\x70\xf7\xb3\x0a\x9e\xeb\x41\xed\x79\xfb\xf6\xc1\xe4\xd6\x94\xda\x09\xce\x6e\x74\x61\x3f\x55\x95\x82\xd8\x99\xbb\x38\x7d\x0b\x53\x9f\x6f\x01\x1d\x33\x62\xda\x14\x3e\x84\xa3\x77\x52\xed\x7c\x90\x99\x2a\xb8\xfb\xc7\x85\xf3\x87\xff\x6a\xa9\x6f\xc0\x59\xf8\xcb\xc4\x8c\x59\x37\xd1\xac\x13\x71\x2c\x20\x47\x98\xdc\x7c\x52\x58\x1a\xcd\x83\x6b\xfb\x7b\xaf\xf9\x0a\x0d\xae\x50\x89\x61\xfb\xc5\xcd\x1b\xfd\xd1\xb9\x9f\x3d\xbe\xdf\xd7\xe3\x33\xb6\xb9\xea\xe3\xeb\xd4\x33\xbb\xcd\xbd\x8d\xec\x47\xbf\x73\xb4\xc0\x99\x74\xeb\x01\x67\x86\x39\xe2\xe7\xad\xfc\xe5\x26\xdf\x75\xbc\x04\xe2\x14\xfc\x78\x69\xdf\xa5\x25\x98\x76\x1a\x93\x18\x7b\xe8\xad\x67\x24\xb9\x0d\x61\x0f\xf6\x51\xb9\xad\xd9\xd5\xb8\x15\x85\xfb\x57\xec\x37\x15\xae\x45\xd8\x3d\xf1\x10\xcf\x12\xba\xa3\x5a\xbd\xbc\x0d\xc0\x7e\xc6\x8c\x37\xea\xbb\x4d\x07\x16\x88\x66\xfd\xfb\x9f\xf1\xe2\x50\x8e\x74\xa9\xb0\xe9\x4f\x23\x8b\x82\x3d\x83\xe6\x98\x29\xf9\x1a\x7c\x72\xe0\xdf\x23\x2c\x6d\x55\x5e\x49\x10\xad\xba\x16\x9e\xd9\x1c\x3e\x47\xf3\xbe\xbb\x8d\x90\xe9\xd2\xe1\xe6\x8e\x8b\x9a\x6d\xad\xe3\x75\x59\xd3\x46\x86\x69\xd9\x6f\x2d\x90\x8b\x82\x1c\xf9\xe2\xa4\x53\x0a\xc0\xdf\x67\xac\x4b\x8b\x4f\x16\x17\x22\x91\xfd\xfc\x7b\xce\xad\xce\xf0\xa9\xe0\x0c\x87\xe6\x80\xcd\x7d\x7e\xba\x90\xe0\x97\x8d\x48\x22\x0f\x6a\x9c\xab\x51\xc3\x83\x8d\x77\x4a\xd9\xe5\x84\x62\x6f\x96\xcf\x0d\xc0\x57\x1e\x01\x30\xfc\x12\x8c\x66\xb0\x6b\xf4\xc0\x66\xb6\x33\xc8\xa0\xd7\x64\x38\xf1\x0f\x84\x90\x5a\xe0\x53\xfc\x80\x25\x56\xf0\xfc\x2c\x37\xd5\x2f\x00\xa7\xda\xb4\xb3\xa4\xb8\x01\x16\x8f\xfb\x81\xf5\xab\x3c\xce\x1c\x83\x22\x79\x01\x47\x53\xbd\xea\x17\xa1\xe7\x07\xac\xed\x3e\x59\x40\x9d\x17\xe9\xba\x2e\xde\xc3\xde\x25\xa6\x5d\xe9\xdf\x4e\xd2\xd8\x7c\x6b\x0d\x10\x8e\xc0\x95\x8e\x07\x5a\x42\x81\x32\x38\xf8\xd8\x75\xf9\x3c\x82\x05\x89\xce\x09\xe0\x3f\x70\x55\x7c\xa4\x7f\x91\xe0\x42\xd2\x44\xb2\x20\xdb\x00\x80\x4c\xff\x52\x59\x7e\x7c\x43\x5f\xbc\x13\xb8\xc6\xc3\x5a\x49\xca\x35\xe4\x48\x56\xe0\x8c\xd0\x86\xbe\x58\x03\x36\xf0\xf4\x24\xf7\x1e\x9a\x74\x0b\x68\xca\x34\x65\x94\xc5\x2b\x72\x5c\xd0\xf0\xd4\x05\x3b\xd5\xfc\xad\xdd\x84\xe6\x62\x2c\x4d\x87\xbd\x92\x60\x5b\x39\xee\x65\x5c\x74\x05\xf3\xcb\x75\x38\xbb\xad\xa3\xac\x5f\x1f\xc7\x17\xdd\x49\xf1\x4f\x7d\x3e\x0b\x93\x3c\xbf\x28\xf3\x5b\x83\x84\xd5\xb2\xfc\x7e\xf3\xee\x3f\x7e\x88\xed\x9f\x25\xd0\x8c\x68\x72\x8c\x59\x05\x4d\x11\x0c\xf1\x5a\x1e\xeb\xa7\xfa\x9a\x0b\xb0\x41\xf0\x5e\xf0\xc1\xa4\x4e\xd4\x15\x96\x06\xd6\xe9\x02\xbf\xf4\xa3\xf2\x49\xad\xa8\x91\x59\xcc\xa4\xf5\xe9\x2e\xf2\xef\x5f\xca\x50\x47\x62\xcc\xb6\x8e\x89\x24\x6b\xdd\x55\x44\x05\xfc\x08\x7b\x6d\x41\x30\xb1\x7c\x45\x7a\x9f\x83\x4e\xd9\x31\x5c\xa0\x80\x1f\x43\x85\x05\x20\x17\x45\x9f\xc5\x6b\xd0\x69\xb4\x29\x1e\xbe\xc2\x3c\xca\x3e\x97\x61\xd6\x6e\xa5\x7c\xfa\x97\x68\xa7\xdb\xcb\x24\x83\x98\x62\x75\x6a\xfe\x8e\xe9\x02\x87\xca\x47\xd4\xb9\xe6\x84\x8f\x04\xc9\x02\x64\xf3\xb6\xa3\x82\xf4\xc9\x7c\x00\xb1\x7c\x88\x43\x28\xe8\xe6\x37\x34\x08\x70\xf9\x1b\xb8\xd6\x81\x55\x4f\xf1\xbe\xc7\x57\x11\x46\x9c\xdb\x85\x21\xa4\x2c\x20\xf2\x5c\xba\x3f\x65\x2b\x9b\xd7\x3f\x45\x5f\xfd\x4b\xf2\x9e\xc0\xfc\xf2\x55\x78\x52\x6f\xb1\x22\x68\xfe\x01\xfc\x8e\x0e\x02\xff\x46\x32\xba\x7f\x39\xd1\x4c\xf0\x0a\xc2\x21\x05\xbf\x0a\x69\x20\x62\xf0\xb0\xd1\x45\xea\xae\xa6\x79\x7b\x26\x88\x64\xf3\xbf\x80\x57\x50\x21\x9f\x68\x7d\x6a\x48\x6e\xd0\x7d\x6a\xd3\xc1\x60\x4f\xe5\xe9\x83\xd8\xd3\x24\x54\x21\x33\x70\xd6\xa3\x54\x97\xcb\x16\xb5\xac\x74\x7e\xd7\x19\xbc\xe7\x65\xca\xdb\xba\xf7\xae\x2a\x1a\x28\xae\x34\x0b\x40\x0e\x21\xd2\x03\xb4\xcd\x93\x52\x4b\x23\xdd\x42\xa8\x09\x0f\x73\x54\x5a\xbd\xdf\xe3\x63\x9b\x6e\x36\xb5\xc2\x18\x8f\xf1\xaa\xdd\x37\xde\x0f\x8a\x6d\x4f\x38\xc1\x83\x4b\x99\xcd\xc7\x6f\xb0\xed\xb0\x0b\xa5\xa3\x9a\x5b\xb0\xc3\x7a\x95\x2b\x20\xbe\x4f\xac\x85\x1c\xc9\x99\x7d\x26\x34\x22\x3b\x0b\x5e\x7a\xfc\x41\x4e\xc4\xd5\xeb\x02\x40\x94\xe1\xc7\x34\x1c\x5c\x37\x03\x81\xa5\xc2\x6f\x19\xdc\x75\xd9\x61\xf1\x15\xce\xae\x65\xb8\x2a\xe4\xe5\xb7\x61\x03\xf7\xa9\x9c\x13\xcf\xf0\xa8\x96\xeb\xda\xf5\xc1\x22\x33\xf7\xb0\x4e\xe7\xd0\xdb\x96\x44\x33\xc9\xf0\x80\xc9\x4e\xc1\x4c\xde\xa8\x08\x7d\x03\xbb\x78\x77\x13\x45\x69\x32\xd4\x0b\x03\xeb\xc4\x78\xf8\x67\x5f\x4c\x12\x45\xab\x84\xd7\xf7\x11\x65\x2d\xe2\x8a\x16\xa1\xeb\xf7\xaf\x1b\x75\xdf\x47\x70\x12\x64\x34\x36\x3e\x8a\x6e\x38\x0c\xc8\xcb\x27\xcb\x87\x20\x05\x0b\x9d\x00\xdf\x9e\xd0\x34\x85\x8e\x20\xf8\xf1\x10\xd0\xff\xf2\x07\x20\xf7\x3f\x26\x01\x86\x74\xff\x6d\x4f\x26\x05\x5b\xce\x03\x1c\xb8\x28\xf7\xa8\xb5\x3d\xb3\xdf\xc5\xf9\x55\xde\x5e\x9d\xb9\x11\x5c\x61\x5e\x31\x71\x7c\x5f\xca\xc6\x0a\xb8\x86\xc4\x5c\xc9\xfd\x0c\x57\x4d\x7c\x72\x01\x44\x88\x35\x48\x6f\x8f\x97\x75\x95\x1d\xa2\xf3\x10\xa7\xa3\x59\xe0\xc7\xa8\x15\xf6\x43\xd3\xcf\xc8\x08\x7f\x4f\xe1\x3a\x01\xf3\x43\xb6\x1e\x44\x2e\x7a\xc6\x87\x93\x31\x22\x06\xe2\x53\x59\x80\x93\x0a\xb7\x4f\x2f\xd8\x85\xe5\x62\xf7\xfb\x27\x95\x55\x82\xdc\x6c\x5a\xe7\x43\xbd\xfc\x5a\xcf\x03\x84\xce\xa5\x39\x81\x63\x06\x80\x7d\x4b\x00\x34\x66\xad\x26\x33\x6b\x2a\xe9\x96\x8e\x9c\xf0\xf9\x7e\x7d\x93\x17\x7f\xbf\x98\x82\x45\xea\x1f\xa1\xe2\x6c\xcd\x01\x5f\xc5\x95\x04\x49\xfb\x20\x28\xbe\x65\xfe\x40\xc1\xe6\xdf\x3a\xa8\xc6\x07\xbc\x95\xd8\x46\x63\xcc\x2e\x2d\xe9\xe1\x8b\x4c\x13\xb8\xfd\x1c\x48\xf9\x40\xd1\x00\x38\xdd\x0f\x88\x4c\x63\x93\x5e\xb1\xf6\x4a\x5b\xd8\xbc\x4a\x7e\x72\xb0\x28\x2c\xd7\xa6\x54\x67\x04\xdb\xda\x19\xcf\xda\x1a\x1f\x67\xfc\x00\x9b\x99\x2c\x1a\xae\x0c\xa0\xd7\x78\x95\xd9\x55\x71\x68\x87\x80\xe0\xcc\x20\xc5\x7c\xc5\x62\xf2\xb9\x18\x95\x46\xcc\x6f\x00\xf3\xed\x9d\x33\xe0\xe9\x3a\x85\x7b\xc6\xe6\x5d\xd5\xd6\xe1\xfd\xad\xd0\xf0\xec\x83\x97\x2d\x37\x7a\x5a\x35\xce\xa0\x45\x45\x26\xb7\xd4\x06\x56\x30\x2c\x24\xfb\x13\x4c\x04\x70\x78\x7e\x6b\x10\x12\x41\x1f\xac\x07\x56\x3a\x72\x68\x8e\x01\x37\xd3\xf6\x71\x5f\x00\xb4\x16\xc4\xe8\xcd\xd9\xd1\xde\x78\x95\x3b\x52\xf7\x8c\x39\x68\x8a\xfa\xe9\x01\xff\x5f\xc0\xce\x0b\xc3\xf0\x5e\x72\xba\xe2\x3c\xaf\x74\x0e\xbc\xc4\x79\xee\xda\x67\x7e\x3e\xe0\xb9\x10\x75\xc6\x9a\x7c\xe1\xad\x60\xba\xfc\xf3\xc1\x08\xc3\x46\x6e\x04\x6b\x92\x88\x2a\xd6\x8b\xd1\x53\x7a\x8b\x5a\xdb\x13\x4b\xca\x23\x86\x07\x2d\x33\xe1\x29\x10\x9a\xfa\x11\x0e\x3c\xeb\xf6\x22\xde\x10\x61\xd9\x5d\xe9\xb8\x4a\x1a\xdc\x8f\x85\xa6\x3a\xd4\x45\xd2\x35\x88\x60\x0c\x4d\x9a\x4d\x83\x02\xa0\x7d\x53\x1d\x91\xd3\x7c\x73\x69\x59\x00\x07\x4b\x96\x06\xb9\xe2\xfb\x47\x7b\x18\xe7\xfe\x33\x1f\xfc\x4a\x15\x3d\xc0\x8b\x9b\x40\x7d\x1a\x00\xf7\xd1\x0d\x9e\xdf\x10\x4b\xfd\xe1\x16\x38\x1f\xf3\xeb\xe7\xa6\x9b\xcb\x1a\x22\x1f\xb9\x86\x27\x8b\x7c\xc7\x32\xe9\x4a\xb6\x86\x54\x9b\x8a\x18\x18\x0f\x2c\xa2\xf2\x0e\x54\x9c\x43\x2a\x6a\x40\xc0\x5a\x28\x27\x5b\x05\x73\x87\xab\xb4\x7c\xa3\xc4\x32\xf4\x57\xb4\x00\x34\x6f\x3b\xb4\x56\xe1\x3a\xcd\x2c\x19\x63\x03\x8e\x74\x64\x07\xc0\x74\x86\xf5\x7b\xa2\xe3\x09\xe0\x1f\x3a\x93\x4f\xb9\x48\x3f\xcf\x45\x8d\x71\x95\xf2\xa5\x90\xc7\x3e\x13\x40\xa6\xca\xcc\x24\x66\x6f\x36\x9d\x18\xdf\xa5\x05\xe0\x31\x9c\xc0\x43\x07\x95\xdb\x92\xb6\xca\x73\xab\x29\x92\xe7\x80\x17\xd9\xa1\x4a\xe8\xc2\xe6\xd7\x92\x48\xf8\x02\x78\x40\x85\x3c\xbd\x35\x69\xd9\x47\x7b\x15\x07\x57\xc0\x39\x1f\xac\x7c\xa4\xbe\x72\xf8\x2f\xa6\x53\x7c\xbd\x4e\x09\x38\x53\x38\xe2\xb8\x41\x68\x01\xfc\x13\x0e\x8c\xc9\x95\x1b\xf2\xc2\xfc\x76\x18\xc1\xae\x9a\xb2\x89\x8c\x23\x5d\xda\x53\xb9\xda\x52\x15\x78\xaa\x31\xdf\x58\x40\x19\x01\x0b\x81\x83\xda\x16\xd4\x89\xad\xa5\x17\xf1\x22\x50\xd2\xd5\x87\x9a\x7c\xba\x9e\xaa\x00\xea\x42\x6a\x26\x5c\x7d\xfa\x20\x9e\x69\xdb\x91\x08\x75\xe9\xbd\x4f\x23\x75\xf9\x42\x37\x14\x55\x0c\x49\xe1\x92\x26\xed\x09\xad\x06\x4b\x3d\xa5\xfb\xa2\xfe\x53\x41\xaa\x5d\x90\x3f\xc6\x01\xb6\xc6\xc6\x3e\x0b\x37\x5e\x75\x30\xde\xb4\xb1\xda\xb4\x35\x5c\xcf\xbd\x05\x5b\x16\xb3\xbb\xa8\x23\xe9\xe6\x1a\x86\x69\x28\xa3\x25\x04\x9f\xc4\x02\x81\xa7\x39\x8f\x38\x33\x20\x37\x39\x56\xe3\x7e\x18\x39\x56\xc8\x5d\x80\x72\x57\xaf\x74\xcc\x0a\xee\x1d\x0d\xec\xa2\x52\x2f\xcd\x4d\x19\x0c\x44\x10\x53\x16\xa8\x9f\xf0\x5c\x00\xa3\x4d\x36\x04\x35\x7b\x2c\x37\x30\x63\xfc\x13\x87\x4c\x94\x19\x9f\x09\xbc\x8d\x09\x1d\xfc\xc4\xa6\x21\x12\x6b\x70\x71\x45\xb8\x09\x20\xf0\x44\x3f\x88\xc7\x14\x1b\x6a\x5c\xfb\x68\x45\x9e\x36\x97\xbb\xfa\x81\xcf\xe4\x16\xeb\xed\x49\x27\x21\xa0\xb7\xc8\xec\x11\xc1\x1b\x11\x2a\x79\xe7\xe5\x00\xbf\x00\xfa\x78\x57\x44\xfd\xa5\x11\xc6\x41\x9a\x4d\xbd\xd2\x24\x07\xae\x61\x56\x1e\xf9\xc0\xe6\x83\xce\x23\x1c\x1a\x90\x9f\x2b\xb0\x0e\x26\x37\x65\x40\x07\x90\x74\xd9\x65\xdc\xff\xb6\xb0\xf6\x92\x21\x6a\xd4\x89\x74\x3e\x35\x28\xae\x90\x36\xfc\xe1\x46\xf3\xf4\xc0\x34\x01\x66\xa9\xc0\xae\x90\x6a\xfb\xd0\x84\xdb\x57\x7d\x99\xe8\xd5\x45\x84\xf5\x83\xad\x9b\x91\x04\x6e\x65\x0c\x80\xdc\x16\x80\xf0\x0c\x45\xac\x9f\x0f\xf2\x29\xb8\x87\x2e\xc0\xc4\xd6\x03\xd8\x79\x84\x9c\xa6\xb7\x1b\xce\xc1\xed\xec\x84\x67\xf7\xe5\x82\xba\x87\x4e\x48\x68\xd0\x8e\x26\x9f\x80\xcd\x2a\xb3\xf3\xc4\xf5\x0a\x60\x7c\x78\xa8\x12\x43\x59\x1e\xd8\x88\xf5\x53\xaa\xcf\x0f\xfc\xfe\xa6\x8f\x05\x37\x8b\x61\x4c\xe9\x9c\xfb\xf1\x6a\xfa\xa1\xe4\x34\xc5\x90\xc5\x93\x67\xe8\xac\xba\x69\x13\x9f\x93\x41\xc6\xfb\xb1\x1e\x39\x79\x68\x7d\xc9\xe9\x37\x99\x06\xea\xa2\x6f\x60\x53\xc0\x49\xff\x0d\x40\x4b\x74\xbb\xff\xb9\xb4\x20\x43\xde\x6d\x41\x59\x5e\x80\x29\x9d\xbf\x56\x0d\x3c\x8b\xc5\xcf\x68\x96\x68\x91\x37\x9d\xf7\x27\x51\x05\x1f\x59\x50\x71\x01\x8c\x52\xc0\xd5\x2b\xd5\xcf\xfd\xfe\x9e\x43\x00\xb0\x77\xd2\xd2\x92\xd3\x45\x46\xe1\x42\x1f\x11\x06\x83\xb0\x80\x08\xe1\xb3\xe2\xa9\x14\x3e\xcb\x40\xe1\x28\x88\x13\x6e\x3f\xb2\xad\x00\xbf\x53\xa6\xde\x24\xc3\x79\xe6\xd1\x9f\x49\x62\x31\x9d\x37\x9e\xdf\x8c\x6f\x62\x3c\x6a\x80\x44\x0e\x80\xe0\x94\xfc\xc7\x02\xae\xb0\x31\x97\xc1\xb1\x19\xaf\x12\x7d\x6a\x76\x1c\x44\x32\xd1\x1c\x4b\x8e\xb7\x4e\x6f\xe4\x4f\x80\x77\xe0\x91\xef\x17\xca\xf0\x8d\xb1\x34\xcc\x71\x60\x90\x49\xc6\x33\x36\x2c\xcb\x60\x72\xd6\xef\xd9\x92\x5a\x9e\xa5\xeb\x8a\x86\xf5\xa3\x11\x8b\xbb\xe6\x8e\x69\x14\x1f\x10\xdf\xd1\xea\x1a\x31\xf2\xdd\x4e\x88\x91\xcb\xdf\x32\x38\x5f\x7a\x43\xcd\x26\x07\xf0\xdc\xac\xe5\x1b\x2b\x9f\x69\x33\xd0\x0c\x85\x72\x82\x89\xfa\x89\x9d\xf9\xcc\xa3\x1d\x3a\x58\x12\xb9\xf7\xe2\xfb\x6d\xc4\xef\x37\xb1\x74\x31\x87\xf2\x65\x30\xe1\x54\x29\x9a\x77\x32\x45\x0a\xb3\xbf\x4a\xf5\x29\xf8\xa1\x59\xb3\x88\x73\xed\xb9\x03\x0f\x21\x00\x4f\x0d\x98\xbc\xac\xff\x86\x02\xc4\xc4\xdf\xbf\x7d\xdc\x96\x00\x89\x8c\x55\xe4\xc2\xf9\x4c\xee\xe1\xbe\xbc\xdb\xe7\x61\x0e\x20\x6a\xbe\xef\x1f\x9e\xe6\x0b\x74\xc4\x9f\xaf\xb1\x01\xc0\x07\xdb\xe0\x19\x8c\xca\x70\xfd\x74\x7e\x87\xb7\x25\x79\xd5\x73\x78\xbe\x06\xf1\xe5\x89\xe5\xc7\x17\xff\xaa\xbe\x3e\x1d\x0d\x19\x0f\x2c\x80\x47\x0a\x07\xd5\x74\x53\x80\x75\x0f\x0c\x82\x0e\x28\x8b\x32\x4e\xa2\xca\x4b\x5b\x05\x13\x93\xe9\xd2\xa3\x74\x3e\x45\x71\xbf\xbd\x4b\x17\x6c\xba\xdb\xae\x0b\xd6\x36\xe8\xed\x14\xce\x92\x2c\x94\x3d\x81\xc1\x39\x01\xba\x10\xb8\xf0\xe7\x97\xee\x0b\x1e\x4e\x8a\x56\xea\x6e\x4e\x42\xac\x3f\x2f\xf3\xbd\x57\xf9\xb6\xd7\x89\xe1\x9e\xe0\xf5\x88\xbf\xcc\x35\x83\xeb\xab\x5c\x5b\xb7\x53\xae\xce\xf8\xe5\xa4\x93\xe7\x46\x17\x26\x53\x29\xe1\x92\x05\x22\x69\x99\xf5\x2f\xbd\x7a\x93\xe5\xa1\x0c\x62\x98\x69\xed\xe3\x24\x72\xa3\xb5\x3f\x3e\xbd\x36\x77\xc2\x38\x39\x47\x3a\x5e\x5f\x96\x77\x79\x3c\xf2\x87\x29\x46\x82\x9f\x77\x62\x9f\xc7\x23\xd2\x3a\xa1\xb6\x4f\xda\x64\xb6\xd0\x02\xd7\x2d\xc9\x04\xf1\xb0\xec\x97\xcd\x5e\xf7\x02\x72\xd4\xee\x4b\xe9\x58\x16\xf8\x51\xbe\x37\xaa\x78\x22\x34\x9c\x3c\x35\x6e\xea\x06\x22\x59\x64\xfa\xea\xcf\x96\xc7\x9c\xa0\xc8\x49\xe7\xe3\xd9\xff\x05\xe6\x9c\x6b\x45\xde\x5a\xe7\xea\xed\x6b\xc3\x48\xaa\x08\x70\xae\x7c\xd1\x2c\x3b\x9c\x1b\x3b\x91\x9a\x54\xa2\x5d\x2a\x54\xc0\x31\xd3\xe2\x3a\x33\x05\xac\xff\x65\xd6\x90\xf9\xbd\x62\x5e\x19\xb8\xa3\x87\x02\x2e\x61\xff\xee\x7b\x54\xa5\x72\x11\x6a\x06\x4b\xb2\x71\x9b\xfe\x7a\x70\xa2\x74\x85\x58\x62\x46\x4e\x86\x10\x52\x24\xf8\x72\x50\x97\x0f\xd6\x4d\xce\x3e\xe5\x03\xeb\x5c\x59\x96\x13\x10\xe5\x7b\x98\x09\x40\xeb\x50\x87\xb6\xbd\xf0\xcb\xab\x13\x40\x90\xae\x23\x17\x76\x7f\x91\x0d\x38\x06\xb6\xc4\xb8\x08\x4e\xe4\xab\xa3\xe0\x45\xc1\xbc\xa1\xa9\x3b\xd9\xed\xdc\x72\xe2\x89\x3b\xf6\xb9\x41\xf0\xd9\xe4\x16\x07\x28\x9a\xf7\x58\xd1\x64\xe1\x0f\x8e\x19\xdf\xf9\x76\x51\xd4\x38\x31\x00\xf8\x45\xe6\x9d\x4b\x99\xcc\xa0\x39\x5e\x46\xea\x81\xb5\x7d\xc7\x13\x90\xb2\x39\xe9\x32\x35\xf7\xe9\x4f\x9f\x97\x63\x8a\x08\x61\x69\x9a\xb0\x3a\x92\x65\x44\x12\xb8\xd2\x6c\x9b\xdc\x38\x9b\x72\x77\x00\xa4\xca\x40\xe3\x15\xcb\x9d\x7d\xf8\x08\x91\x20\x63\x72\xa4\xaa\xb4\xcb\x64\x66\x4b\x1a\x9b\xfa\x9b\x6d\x55\x27\xde\x60\x83\x17\xab\x86\xda\x18\xae\x27\x69\xfd\xe9\x83\x0f\xfb\x26\x80\x29\xba\xbc\xe9\xf0\x1f\x63\xca\x6e\xe5\xcb\xda\x3e\xbf\xe7\x17\x58\x3d\xa7\x7f\x8e\x23\xb4\xed\xb7\x35\x4b\xfc\xbe\xc9\x80\xee\x75\x1b\x42\xbe\x8a\x7b\x6a\xab\x80\x29\x12\x70\xce\x88\x75\xcc\xd2\x9d\xb1\x8a\xc7\xb7\x8b\xd6\x08\x20\x7b\x5e\xb3\x0e\xe1\x45\xa3\x69\xce\x6a\xfe\xe7\x34\x66\x9c\xb6\x80\xe1\x53\x92\x0c\x30\xcd\x3b\x5a\x4d\xef\x20\x61\xd2\x89\xa1\x6e\xfe\xbe\x7f\x19\xc1\x5a\x57\x92\x2d\x4b\x86\x62\x17\xe0\x2d\x98\xb9\x1e\xe5\x96\x4f\x0f\x70\xe9\x4b\x98\x34\x17\xbd\x33\x84\x5c\x20\x1d\x0b\x2c\x88\xd0\xcb\x90\x80\x4e\x25\x22\x33\xcc\xd7\x65\x18\xe3\x5d\xd1\x74\x61\xbd\x58\xcb\x46\xb3\x94\x07\xf5\x4e\xb1\x6a\x15\x12\x8a\x95\x4d\xb7\x7c\x13\x30\xbe\x51\x2c\x37\x96\xbd\x77\xf2\xd3\x32\xcd\x5b\xb9\xc9\xb6\xbb\x21\xf6\x3b\xe5\xd4\x0c\xed\x81\xae\x5d\x70\x29\xfd\xeb\x56\x4b\xf7\x36\xe9\xd8\xfd\x94\x9e\x3f\xfe\x11\xbd\x6c\x6c\x99\x70\x9a\xcd\x16\x91\x48\xdf\x55\xc6\xf0\xeb\x80\x23\xc6\xd7\xd2\x8d\x13\x5d\x49\xe7\x78\xf5\xaf\xaf\x40\xb0\x79\xff\xa6\xe4\x7d\x15\x5c\xa8\x35\xec\x4f\x00\xae\xdd\xbb\x86\xe2\x8c\xc7\x23\x78\xce\xc7\x5a\x5c\xe5\x0e\x83\x6e\x5d\x16\x1a\x9f\x6f\xbe\x45\x49\x2b\x88\x18\x30\x58\xc4\x95\x51\xa0\x13\xc5\xf9\xba\xe1\x7c\x69\xc1\xb9\x28\x42\x29\x43\x1c\x79\xf3\x55\x37\x21\x5f\x0e\xf9\x01\xa0\xd1\x9c\x88\x5e\x5b\x80\xe1\x18\xe3\xa3\x19\xb4\xcb\xc5\xcd\x40\x9d\xdf\xda\x4c\x28\xaf\x56\xaf\x5c\x59\xc7\x47\x13\x20\x8b\x88\xd2\xde\x24\x73\xaf\xe9\x19\xf1\x13\xa1\x6f\x38\x5f\x1e\xbb\xdd\xf1\x41\x9c\x93\xe4\x95\x6c\xeb\x62\x6f\x3d\x40\xec\x26\xca\x5e\x37\x7f\x2a\xd2\xc2\xd4\x1f\x7b\xe8\x1a\xcf\x6f\xb5\xc3\x1c\x68\x94\x12\xf1\x06\xc7\xeb\xbd\xee\xb7\xaf\xb4\x58\x64\x1b\x47\x06\x58\x53\x84\xda\xc3\x27\x8a\xf0\x80\xb9\xbf\xcf\x56\x45\x17\x01\x3d\x3e\xc2\xf9\x41\x36\x80\x24\xab\x61\xa8\xb5\x64\x49\x76\xc3\x3c\xe0\x3c\x1e\xc0\x5b\x84\x7b\x65\x91\x00\x15\x11\x80\xde\xe4\x8f\x5b\x15\x6a\x04\xb7\x46\xc0\x82\x0a\x77\x69\xa3\x2a\x6c\xa5\x8e\x57\xad\x5f\x28\x7d\x38\x8e\xfb\xb1\x62\xa7\x6e\x18\xe3\xc4\x05\x2d\xd9\xfd\xf4\x66\xf8\x6c\x83\xd4\x45\x6d\x8a\xb4\xfc\x08\x69\x02\x02\xfd\x35\x9c\xa8\x52\x59\xb3\x23\xab\x53\x35\xf3\xa6\x45\x78\xfe\x8e\xe6\xe6\x68\xf6\x1c\x69\x4e\x6c\x7e\x6a\x9d\xd4\x62\x39\x79\xff\x51\xc3\xf3\x0d\xb0\x87\x65\x0b\x00\x83\xcf\xf6\x59\x41\x5c\xfc\x53\xf5\xb9\xef\xa6\xfd\x25\x01\x9f\x86\x37\x24\x96\xd0\xbc\x2e\x6d\x05\xca\x39\x37\x3b\x5f\x92\x78\xb7\x1e\x73\x1f\x4a\xf7\x9a\xcb\x7d\x01\x1d\x75\x29\x74\xb7\x07\x9e\xe1\xf5\xa1\xd4\x39\xd4\xd4\x42\x0b\xb3\xbc\x5d\x89\x1c\x72\x7a\xcb\x45\x0c\x92\xdf\xfc\xcc\x80\xe3\x32\x7a\xa4\xfb\x58\x88\x29\xd5\x4e\x36\x13\x53\xc9\x92\x38\x05\x47\xf9\x33\xdd\x93\x53\xb2\x92\x45\xf5\x46\x3c\x34\xcf\x34\x65\x3d\x60\x20\xbf\xbe\x5e\xb5\x36\xdf\x65\x01\x42\x0d\x5c\x73\x3e\x4f\xd1\x93\x1a\x18\xab\xfb\x33\xd2\xf8\x6c\x09\x8d\x4c\x7b\xa2\xd7\xce\x00\x2f\xe9\xb1\x39\x7a\xee\x37\xa6\xbb\xb5\xc1\x79\x90\xb5\xb1\x87\xf8\xa7\x2e\xfa\x77\x28\x71\x64\xb0\xc2\x9c\x0c\xac\x35\xb6\xe6\xf3\x04\x74\xea\xb6\x67\xc5\x88\x0d\x00\xea\xbf\x6d\x28\x95\x37\xd8\x78\xe6\xbc\x18\x53\xb0\x7a\x9a\xce\x83\xa6\xbe\x3b\xbb\xdc\x99\x1d\x08\xd9\x35\xeb\xf5\xad\xa7\x96\xc6\xbb\x98\x4d\x8d\x42\xc6\xda\xde\x15\xa5\x89\x0a\xa8\x33\x37\x1b\xac\xc2\xed\xb1\xfd\x2e\x2e\xac\x98\x7e\x36\xae\xab\x31\x39\x68\x44\xfa\xbc\x37\x64\x8f\x25\x5a\x37\x25\x83\x3e\x2a\xc3\x16\xe6\xcc\x76\x5f\x82\xf7\xb7\x1e\xf1\x39\x71\x75\x43\x26\xde\x5e\x3d\xa3\x9a\x42\x44\x6b\xd1\x5a\x21\x96\x82\x15\xc2\x43\x82\xdd\x3d\xe0\x59\xb7\xe1\x92\x90\xad\xb3\xa9\x24\x48\x06\x62\x09\xdc\xeb\x76\x79\x9f\x04\x70\xf0\x8e\x8e\x38\x13\x67\x55\x00\xd7\x03\x58\x0b\xeb\xaa\xba\x36\x10\x80\x56\x86\xc5\x4a\xe6\xfa\x3e\xd0\x99\xa8\xd2\xcd\xa5\x7c\xf1\x14\xb0\x12\x03\xce\x9d\xb7\x9e\xfa\xdb\x7a\xbe\xcb\x74\x09\xa6\xa6\xba\x92\x91\xd4\x3c\xe4\x29\x60\x6f\xc3\xb4\x9b\xa7\x59\x0a\x64\x32\x75\x12\x1d\x98\xc8\x11\xee\x5c\x6a\xc0\xfa\x96\x90\x92\x94\xbb\xf6\xf8\xa6\x77\x78\xee\xfe\xad\x4e\x11\x16\x1b\x62\xc4\xa5\xdd\x11\xfe\x71\x68\x35\xf0\x45\x91\x9c\xb0\xd6\x6a\x85\x9e\xe3\x1b\x94\x78\x9b\xa5\x5a\xa1\x5a\x8c\x5d\x56\x0d\xe7\xb3\xbc\xf8\x9e\x00\x55\xd6\x07\x41\x4d\x55\xd3\x58\x7e\xd2\x5e\x19\x82\x98\x81\x37\x3c\x5b\x87\x9c\x19\x3e\x0a\xa8\xb8\xbf\x44\x40\x73\x38\x23\x7c\xdc\x7d\x65\x71\xc4\xe5\x1a\xdb\x99\xcd\x49\x93\x7c\x8e\xfb\x5b\x5c\x7c\xca\x7e\x84\x3f\x2a\x33\x86\x5d\x31\x0d\x58\x63\x7f\x6b\x7f\xa5\x19\xac\xee\x1a\x68\x94\xdc\xdd\xa7\x8a\x7a\xdd\x9d\xa2\x87\x52\x57\xb6\xf0\x72\x2d\xc4\x1b\xbf\xcf\x69\x19\xdd\xe6\x2f\x27\x15\xb6\xb7\xef\x0d\x40\xb4\x56\x91\x0d\x7b\x1c\xc6\x77\x49\xe5\xdd\x0f\x20\x0c\xcb\x6c\x85\xca\xea\x4a\x0e\x56\x50\x86\xa1\x90\x33\x05\xe3\xf7\xa3\x56\xa7\xd9\xae\xab\x20\x0e\xb9\x94\x8a\x9c\x4b\x9b\xe4\x57\xff\xc8\x8c\x2e\x45\xf2\x8b\xfd\x40\x4d\x4c\x34\xbf\x80\xc9\x99\x01\xc9\x7a\x1d\xcf\xec\xf4\x8c\x77\x28\xa2\x02\x3a\x08\xf0\x1a\xef\x14\x12\x8e\x21\x84\xc9\x4a\x70\x4f\x13\xb1\xfe\x7c\x88\xae\x28\x88\x43\xe8\x3f\x6e\x0a\x57\x31\xb1\x2f\x56\x5b\x57\x4d\xd1\x88\x87\xc3\xcb\x48\x40\xe4\x9c\x81\x83\x6b\xbf\x9d\x67\xa8\x17\x92\xf0\x7a\x9b\x5c\xdb\x2e\xb3\xda\x77\x78\x79\x90\xa3\x58\xee\xec\x03\xbe\x77\x11\xfb\x4d\xb1\xd2\x3a\x8b\xbd\x7c\xf1\x13\x1c\x07\xb4\x43\x93\x8a\xc1\x8c\xd6\x38\x14\x1f\xf3\xb6\x3c\xea\xf9\x9b\xdc\xf6\xe4\x8f\x18\xa8\x28\xa1\x3e\x3b\x87\xe6\x47\x32\xe9\x71\x69\x30\xb0\xc7\xc7\x7e\xb8\x0e\x85\xbc\x62\x29\x88\xe6\x33\xb6\x0b\x9d\x56\x5c\xb0\xb6\xe3\x03\x41\xe7\x16\xc9\xfc\xad\x05\x38\xa1\xc7\xb5\xa7\xa2\x17\xdf\x6d\x21\xdd\xfc\xa2\xa5\xe8\xe7\x89\x00\x45\xaf\x7b\x6c\x48\xc5\x7d\xe7\x43\x80\x6d\x2b\xb9\x43\x47\x31\x90\xdc\x9a\x43\x68\x8e\x12\x01\xaf\xf7\x6a\x34\xf5\xe1\x40\x58\x72\x6e\x57\xd1\xde\x10\x11\xdf\xdb\x6b\x5a\x08\xe6\xdc\x6e\x4f\x6b\xdb\x98\xbe\x4c\xfa\x31\x24\x84\x1b\x1a\x55\x65\x8b\x12\xab\xb2\xa7\x7e\xd0\x64\xb2\x33\xe0\x8a\xa8\x18\x3c\x4d\xf1\xce\xc0\xf1\x1a\x49\xb6\xc2\xf3\x92\xfb\x7c\x88\xa2\x8e\xa5\x08\xfd\x79\x6c\x13\x13\x7a\x0f\xf1\x02\x6b\x8a\x1b\x87\x4e\x5d\x1d\xf8\x36\xe1\xb8\x17\x9b\x8c\x5f\x3e\xb9\x53\xda\x4d\xa5\xd1\x8d\x60\xa8\xac\x47\xe1\x1c\x95\x7d\x9d\x73\x5a\x73\xe4\xcf\x8f\x1f\x03\x14\xb8\xf8\xda\x7f\xdd\xfb\x44\x42\x38\x76\x96\xd1\x05\xe9\x02\xaa\xab\x7e\x0d\xcc\x5b\x17\x1b\x8b\x88\x9c\xfe\x80\xf3\x15\xf1\xf1\x7e\xbf\xa1\x63\xc1\x49\x37\x33\xe3\x9d\xd8\x64\x1b\x36\x17\x04\x6a\x8a\xa3\xda\xe2\xf6\x08\x89\x32\xd9\xd6\x72\xa3\x56\xd8\x5f\xe4\x67\x5d\x76\x5d\x5f\xda\x38\xe9\x14\x72\x28\xf1\x91\xa0\x07\xb6\xe6\xec\xec\xdc\x3e\x22\x14\x23\x75\xe0\x94\x80\x12\x59\xf0\x34\xf0\xc4\x7e\x10\x0b\xda\xd8\x3a\x85\x59\x04\x82\x9f\xe2\xa5\xcb\xe6\xfa\x1c\xbf\x0a\xee\x79\x78\x04\x38\x5a\xf5\x34\xb8\x37\x27\x09\xb0\x15\x6a\x5d\xcf\x19\x5c\xc5\x52\x49\xbb\x32\x36\x13\xce\x50\x00\x6f\xfd\x15\xfc\xde\x5f\xa9\x28\x94\x3b\x29\xa4\xd8\xc0\x40\xae\x39\xfc\xce\x2c\xdf\x14\xf7\x76\x37\x03\x7b\x7a\x7b\xf3\xa4\x9e\xe5\xeb\xe7\x00\x30\xc0\x82\xfb\x92\xe8\x98\x5d\xcb\xcd\x04\x38\x1d\xc6\xa7\xc1\x65\xfd\x66\xa8\x11\x3c\xbe\x8e\x9e\x4b\xa8\x57\xbf\xc4\x86\xf3\x08\xe5\x62\xbc\x8f\x07\xc5\xde\xe8\x26\x21\x8a\x2e\x3d\x0a\xc3\xa1\x7f\x8c\x67\x7f\xdd\xbe\x95\xac\xb0\xb5\x7e\xba\x8c\x96\xdf\x45\x50\x29\x4b\x47\x5b\xce\xfe\xb6\x6c\x25\x7c\x31\x13\xde\xbe\x4f\x11\xa0\xc1\xdc\xf8\x53\x07\x7e\xa9\xb6\x15\x1c\x9c\xbd\x7d\xf4\x54\x52\x92\x13\xf7\xae\x42\x47\xf9\xe1\x15\xd2\x04\x7b\xae\x5e\xe5\x0b\x0b\x9f\xc1\xe7\x3a\x78\xf3\x5d\xf9\xd7\x4b\x40\x96\xfb\x40\xc8\xc2\xc0\xb5\x01\x0b\x7c\x3d\xa6\x01\x17\xcc\x7a\x80\xaf\x0b\x8e\x84\x98\x6d\xc5\x74\x88\x95\x00\x9e\xce\x5a\x78\xa3\x1d\x80\x5a\xb8\xd9\x85\xae\xa6\x44\x0d\xa1\x8a\xf2\x8e\xb4\x87\xb2\xc8\xd0\xa6\x84\x82\xcf\x13\xcb\x39\x69\x4f\x70\x17\x32\x01\x30\xa1\x05\x25\x87\xe6\x8a\xa0\x5d\x70\x45\xcd\x65\x77\xea\x34\xa6\x78\xca\x56\x10\xbf\x33\xfe\xe8\x0f\x3f\x94\x0c\xc2\x7f\x87\x57\xac\x2b\x3f\x8e\x0f\x17\xc0\xe3\x99\x9d\xeb\xdf\x12\x21\x20\xa3\x16\xeb\x12\xac\xc5\xcc\xa7\x5b\x1f\x9a\x14\xd9\x68\x66\xb0\xb0\xb9\x64\xf8\x4e\xc9\xcf\x48\xe3\xae\xb2\xe8\xc5\xc0\x11\x75\xeb\xf7\xd1\xc3\x7c\x59\x44\xec\x58\xcc\x6a\x49\x99\x2a\x6f\x28\xb1\x32\x8d\xbc\xfc\x62\xfa\x42\xa5\x13\x00\xc2\x94\xfd\x88\xf9\x04\x50\x2a\x7d\x6e\x01\x32\xa6\xe6\xf3\x05\x7b\xd8\xa8\x58\x2c\x21\x1b\x1d\x9f\x98\x51\x32\xc6\x6f\x50\xad\x05\x41\x43\x89\xf8\x62\x61\x61\xf9\xc4\xe5\x1f\xc0\xcc\x6b\x84\xc9\xb5\xce\x93\xbe\x59\x00\x9b\x31\x37\x92\x99\x57\x3d\x06\xdc\xcf\xeb\x9c\x9e\xe2\x73\xb4\xd8\x18\xeb\xc9\x9b\x6c\x86\x00\xdb\xf2\x17\x6b\x93\x01\xe7\x65\x04\x9e\x60\x75\x98\x8c\xef\xf1\x18\x8d\x55\x2b\x0f\x3a\x3a\x74\x9f\xf7\xcb\x6c\xf6\xb5\x30\x3a\x82\xef\x12\x2a\x95\x38\x63\xc3\xf8\xc2\xdd\x4a\x2a\x73\x0a\xf1\xe6\x3c\x69\x80\xae\x91\xb4\x46\x64\xbb\x1d\xe3\x4e\xa1\x51\xa3\xee\x7e\x21\xe0\x84\x0f\x11\x5e\xd6\x32\x60\xac\x2f\x9c\x13\x96\x39\x9a\xfa\xa0\x56\x16\x0e\xf3\x42\x03\x96\x26\x77\xa4\xe0\x09\x89\x0f\x00\xf0\x6c\x50\xbe\x91\x27\x8c\x05\xd0\x73\x0d\x32\x48\xe8\xc6\xb8\xea\x19\x4d\x45\xd6\x3c\xdc\xda\x98\x8f\x17\xee\xf8\xf1\x52\xbd\x85\x98\x72\x96\x7d\x2c\xb3\xcf\x1b\x57\x87\x08\xa0\x59\x69\x03\x0f\xd7\x5f\xa7\x5a\x00\x66\x59\x6a\x5d\xad\x34\x48\x3c\x7a\x5e\xf9\x8d\xa6\x13\xb9\x7f\xde\x82\xf7\x31\xb6\x3b\xfa\x49\x5f\xf7\x70\x2b\xf2\xa4\x58\xc8\xa7\xd8\x7c\x7f\xc6\x1a\x08\xc4\xfe\xd8\xfb\xb7\x33\x50\xd4\x33\xd8\xcb\x11\x10\x4d\xf9\x4d\x2e\x03\xcf\x04\xc1\x2d\x66\xf2\xef\x1e\x85\x6d\xd9\x9f\xa6\x35\xe5\x56\x08\x3c\xf9\xd6\x4e\xaf\xf1\xfd\xa8\xdb\x0d\x63\xa7\xbc\x50\x41\x28\xf5\x9a\x5d\x85\x27\x39\xb9\xc9\x1f\x4c\xdc\x0d\x08\x58\xaa\x09\x97\xeb\x9d\x48\xf4\x49\x39\xdf\x5c\xec\x02\xa8\x2c\xdc\x77\x36\x5f\x03\x82\x1d\xc6\x48\xea\xc6\x25\x84\x59\x42\xa8\x67\x0e\xe7\x93\x0d\xaf\x70\x24\xab\xb0\x41\x82\xca\x0c\x67\x1b\x07\xe0\x30\x37\xfd\x20\xf6\xcc\x4b\xb3\xa3\xdf\x9e\x74\x47\x9a\x3c\x4e\xcf\xc2\x4f\x24\x9d\xdd\x9b\xc8\x9c\xcf\x28\xbc\x79\x27\x1d\xc1\x3a\x71\x2f\x0d\x1f\x0c\xbb\xbe\xdb\xc9\x9b\x99\x39\x20\xf9\xc8\xa3\x73\xb2\xfe\xa2\x28\x86\x14\x4c\x6d\x46\xe1\xcc\x70\x79\x6a\x48\x02\x3c\x73\x64\x00\x4c\x8f\x30\x1a\x2c\x04\x9c\xff\x46\x21\xcc\xf7\x8f\x44\x82\xb7\xa1\x56\xc5\x53\x8d\xcb\xd9\x95\xfd\xe1\x54\xe3\xa2\x20\x4f\x64\xd0\xed\xa8\x62\x0c\x5b\x92\x0f\xb7\x39\x87\x9c\x77\xd3\xfb\xcc\xe2\x17\x36\x45\x70\x4e\xd0\x2d\xa5\xa4\xd7\x0d\x5d\xfb\xf1\x0d\x40\x8a\xa1\x93\x39\x31\x3a\x76\xa7\x36\xdc\x4b\x07\xde\x81\x45\x4a\x40\x77\xbf\x27\xf7\x14\x01\x5b\xe9\x97\x86\xbf\x53\xa8\x1c\xf3\xeb\xda\x85\xeb\x64\x53\x48\x6e\x46\xbe\xdb\x88\xe5\x15\x58\x4f\xeb\x99\xce\xbe\x7a\x48\xea\x11\x28\xc9\x0c\x35\x3d\x7f\xab\xaf\xfa\x9e\xc3\xf7\x28\x87\x9a\x20\x7e\x12\x31\x5a\x85\x48\x40\x1f\x08\xb8\xa2\xc7\xbd\xa2\xc3\x39\xda\xf2\x07\xc6\x02\x56\x71\x37\xe5\xba\x01\xc4\xe1\x87\x19\xde\xfe\x06\xf1\xfb\xab\xa5\xe5\xf6\x63\x73\xf3\xc2\x6d\x1b\x0f\x38\xdb\xe5\x02\xd1\x4c\x18\x2e\xd2\x88\xa2\x5a\xdd\xeb\x03\xfb\xd2\xe7\xf3\xa7\x8d\xf0\x18\x7b\x11\xc4\xe7\xfb\x7c\x45\xd4\x5f\x8d\xd8\xd2\x5e\xa1\x78\xdf\xdd\x5a\x94\x15\xe3\x7d\xb7\xd7\x60\x5a\xfd\x73\x3a\x42\x6d\xb0\xad\x9f\x23\xf2\xe7\x62\x17\x52\xa5\x76\x5c\x50\x5e\xf4\x8c\x01\x42\xec\xf4\x35\x7a\x1c\xf0\xc8\x07\x49\x85\xdb\xef\x2d\x7c\xe1\x70\x77\xfd\x8d\x15\xf8\x5b\x11\x1f\x38\x8f\x6e\xf0\xac\xbe\xba\xb9\x97\xe8\x39\x2e\x69\x5e\xc7\x8c\x03\xac\x9c\x3a\xcf\xe3\x65\x09\x70\x08\x8e\xcb\x6f\x13\x27\x83\x3d\x52\x36\xf6\x92\xe4\xc0\x89\x18\x60\x3b\xdf\x1b\x67\x98\xfb\x31\x86\x7d\xc8\x42\x3e\xa6\x86\x6c\x7f\x11\xb5\xc9\xd6\x16\x17\x45\x2b\xf5\xbd\x13\x07\xfb\xd3\x69\x1d\xe0\xab\xdf\x50\xbd\x4e\xbb\x8c\x0b\xfd\x6a\x12\x7f\xdf\x3e\x1b\x2e\xd5\xd6\x7a\xcd\xf7\x77\xde\x25\xfc\xb8\x6b\x4e\xcf\xf8\x5f\x6a\x5a\x68\x3f\x23\x53\x45\xac\xf8\x8a\x0c\x13\xf1\xf9\xaa\x1b\x8c\x32\x04\x98\xdb\xff\xa5\xf2\x68\xd4\x3d\x6b\x34\x50\xab\x69\xfa\x6a\x3f\xc5\x9c\xae\x94\x35\xcc\xae\x20\x12\xa3\x16\x6d\x38\x5b\xa3\x50\xf6\x2d\x9b\x62\xe2\x07\xf6\xf3\x31\x33\x89\xf2\xc5\x9e\x43\x62\x17\xe4\x91\x06\x70\xda\xcf\xb2\xd3\xa7\xf9\xfd\x09\xb1\x2e\x23\xf6\xa7\x71\x37\x1b\x41\x06\xde\x51\x5f\xe2\x9a\x2c\x0c\xc5\xa5\x85\x41\x92\xfa\x99\xc2\x22\xdb\xdc\xf9\xd1\xaa\xf5\xc5\x52\x55\xba\x7f\x93\x33\xe5\x5a\xb1\x0c\xbd\xc9\x1b\x89\x77\x7e\xaf\x8f\x17\xc9\xcf\x91\x64\x63\x70\xae\xb4\xc1\xae\x05\x81\x2a\xea\x6b\x90\x01\x2a\xc7\x58\x45\xa8\x29\x58\xf7\x2c\x69\x13\x2d\x02\x00\x72\xc0\xf8\xf8\xc5\x0a\x23\x56\x80\x5f\x8a\x5f\xf7\x76\xe6\x8a\x42\xc5\x2e\xb0\x42\xce\x41\xa1\xcd\x8c\x78\xbd\x0a\x6e\x71\x65\xf0\xa6\x42\xb2\xfc\x53\x8c\x6f\x55\xab\xe4\x66\xb9\x9f\x4c\x02\x05\x87\xa3\xc7\xcd\x63\x5e\x2a\xf2\xa8\x88\xe2\x82\xf5\x85\x9f\x8a\xcf\xd7\x6e\xeb\x84\x26\xe6\xe1\x59\x27\x9f\x5f\xde\x88\xe5\x5b\x07\x05\x51\x3b\xc5\xe6\x6d\x60\x2a\xb0\x97\x6c\xb5\x4a\x75\x6a\xdf\x55\x3f\x38\xe5\xce\xae\x9f\x6b\x4f\xa3\xc8\xf6\x6b\x6b\x2c\x4c\x92\x33\x84\xef\xc8\xa4\x39\xce\x44\x6d\xd8\x32\xc8\xea\x9e\x48\x10\x13\x3a\x40\x42\xea\x48\x81\x40\xdd\x97\xfb\x86\xc1\x3e\xa5\x89\xb2\x0a\x61\x1a\xf6\x6f\x1a\x14\xc6\x1b\x5f\x26\x81\x90\x84\x7b\xf7\xa5\xaa\x37\x5f\xcb\x2d\x26\x5b\x7c\xe0\x8a\x77\xc0\x1b\xde\xe2\x88\x6c\xb7\xe2\x6b\x32\x2f\x42\xfa\x36\x50\x83\x27\xd8\x8e\xbd\x77\x5d\xf9\x59\x26\xfe\x35\xff\xf8\xbb\xd2\xda\x97\x08\xe0\xbd\x6d\x9f\x84\x58\xc2\xf3\xf9\x74\x62\xc8\xa6\xd8\xa1\xbe\x36\xc0\xab\x19\x21\x23\x4a\x99\x10\xdc\xd6\x1d\x12\x95\xc1\x1a\xa2\x54\x07\x6f\x7f\xd9\xdb\xe6\xca\x08\x00\x54\x24\x20\x6f\xf9\x67\xcf\xb8\x6a\x56\x43\xa8\xc0\x5c\x31\x72\x09\x87\xcb\x4d\x1e\xd2\xb2\xe3\xde\x44\xd2\xc1\x7d\x1e\xc1\x2d\x34\x53\x52\xb5\xf1\x05\xf0\x08\x6f\x9b\x30\x2e\x37\xc5\xdf\x6b\x81\xfe\x1a\x4a\xa3\x9c\xa9\x8a\x3d\xbe\xf1\xdd\x24\x59\xb8\x36\x07\x9c\xe5\xfe\x41\x78\x10\x98\xbc\x00\xc7\x69\x77\x0a\xa3\xec\x11\x00\x36\x59\x03\x44\xfd\x64\xda\x69\x24\x8b\x81\x98\x83\x6c\x67\xf4\x66\xc4\xe3\xd3\xf8\xe6\x5a\x8d\xf2\x66\xec\x77\xc3\x12\x03\x8e\x02\xd6\xa9\x00\xf1\x6d\xf1\x2e\x11\xea\xbf\x13\x4e\x7c\xb1\x50\x1f\x07\x44\x39\xd3\x05\x4c\xd0\x70\x2e\xa7\xec\x0b\x19\xe5\x56\xa3\x68\x32\x6e\x82\x4d\x72\x08\xcc\xf5\x9e\x5a\x2d\x3b\x19\x53\x06\xc0\x92\x7d\x78\x06\x09\x7e\x83\x87\x65\xcf\x63\xb9\x1e\xe4\xa2\xbe\xcf\x25\xf1\x1a\xec\x0c\x69\xf4\xfc\xc1\xc4\xfd\xa0\x15\x32\xbf\xa2\x7f\xf3\x60\x9b\xd7\x20\x51\xc0\x0b\x72\xd3\xf3\xb0\x5f\x84\x0c\x40\x6c\xb7\x83\x9d\xe8\x79\x99\xff\x8c\x7f\xef\x12\x9e\xf9\x5f\x9a\x6a\xef\x53\x14\x69\x07\xac\x59\x39\xf9\xe0\x3a\x50\xb9\xeb\x07\x5e\x83\xc9\xec\x43\x51\x1f\x4f\xf7\xb1\x6d\x38\x7b\xa1\xaf\x2b\x25\xdf\xc4\x6f\x8a\x0f\x6c\x50\x6d\x46\x6f\x4b\xd3\x61\x45\xb3\x7d\xdf\xa0\xe6\x8e\xe7\xdf\x97\x29\x36\xa0\xa9\xb5\xe0\x99\x38\x7a\x42\x1b\x8f\x6a\x7f\x1d\x03\x46\x2a\x57\xca\x78\x7c\xa3\x49\x02\x19\xe6\xba\xf4\xa2\x7b\x0d\xcf\xa0\xdc\x18\xb8\xcd\xd7\x49\xb0\xe9\xc0\xe2\xfa\xb3\x6f\xdf\xc7\xfa\xdc\x67\xf5\x17\x48\x39\x93\xd4\xe9\x54\xbf\xdf\x73\x0f\xee\x05\xac\x43\x18\x91\xa2\xd5\x20\xbf\x56\x6d\x0c\xde\x92\x6d\xfe\x72\x4e\x99\xea\xaa\x83\xc1\x9a\x86\xc3\xcc\x95\x3b\xd8\x9f\x50\x13\x18\x18\xf6\x1b\x36\x4d\xe1\x4b\xec\x4f\xd1\x8a\x31\xb1\xfe\x39\xd6\xc7\x9d\x1a\x95\x2a\xe9\x08\x9c\x0f\xa0\xdc\x78\x70\x16\x12\xd1\x01\x6c\x41\x2c\x38\xcb\x77\xf7\x23\x4b\xfd\x67\xea\x34\x16\x3c\x0c\xa6\x51\xc0\xb6\xf0\x7c\x33\x41\x78\x8f\x0c\xbf\x2e\xb5\xad\x81\xf3\x91\xc7\x06\x85\x3a\x1a\x2c\x1f\x6b\xc0\xb5\xde\x39\x26\xb1\x01\x2b\x75\x47\x3a\xc0\x61\x11\x6c\xfc\x71\x25\xc4\x87\x39\xff\x32\x0a\x3c\x2f\x05\x6f\x73\xe6\xaf\xf3\x39\x74\xe1\x73\x69\xac\x01\xe5\x24\xce\x65\x48\xe8\xdb\x77\xd5\x6a\x92\x5b\x94\x6b\x63\x21\xa3\x81\xf3\x49\x0a\x33\x18\xc5\x70\x15\x7a\x46\x2a\xb1\x8c\xb5\x66\x58\x13\x5b\x62\x6c\xe6\x5b\x87\xdd\xf5\xb7\xdf\x5d\xaf\xe6\xa2\xf6\x2f\x6f\x86\xbd\x57\xa8\x58\x62\xcb\xcf\x11\xce\x0f\x55\x55\x7d\xab\x42\x7a\x96\x22\x28\x40\xaf\xc9\x1c\x44\x4b\xff\xb8\xdd\x84\x57\xf5\x37\x6b\xb7\xa2\xd6\x57\x41\xca\xfc\x89\x66\x18\x8f\x3c\x67\x76\x02\x60\x06\x5c\xb4\x54\xe7\x14\xba\xf2\x7f\x7d\x56\x6f\xd2\x34\xcf\x0e\xe6\x0e\x7c\x36\x5b\x81\x7d\x13\xaa\x03\x50\x45\x89\x39\x45\x85\x2d\x6a\x01\xa0\x44\xbe\xc1\x48\x8c\x6c\x35\x3b\x8a\xd4\xfd\xd0\x04\x16\x71\xc0\x92\x1b\xd6\xd3\x7c\x1d\xb4\x6c\xd5\x8c\x5a\xb7\x89\xac\x4e\xd9\xa3\xcf\x1e\x48\x96\xcf\x84\xd0\x92\xf1\xd2\xe2\xf2\x9e\x58\x4f\xf0\x7b\x46\x88\xa3\x49\x15\xbf\x78\x14\xf8\x3f\x0e\xa9\x7a\xd8\x24\x85\x34\xe8\xfe\x7d\xdf\x7b\xc9\xe8\x60\x6c\x04\xe0\x3f\x1d\x3e\x5b\xdb\xde\xc0\x43\xab\x2e\x1e\xdc\x71\x58\x9f\x63\x3d\x3d\xd1\x0c\x50\xa2\x96\x71\xda\x6b\x2c\xd7\x83\xf9\xbd\x6c\x66\xe1\x50\x53\x4c\x93\xff\xce\x14\x04\x8f\x67\x58\x5a\x02\x41\x16\xf8\x64\xf3\x43\x69\x03\x14\xaf\x60\x4d\x9a\xff\x6b\xde\x6d\x62\x1a\xc0\x9b\x64\x7b\x7b\x00\x10\xdc\xcc\xe4\x8e\x98\x25\xfa\xc3\xbe\xbf\x14\x58\x14\xe6\xc9\x30\x2d\x7c\x4c\x38\xc2\xbf\xab\x79\x0a\xb9\x31\xe2\xc8\x2f\xf7\x3c\x0c\x58\x2a\x01\x75\x59\xad\xfe\x17\xa8\x7f\x47\xf9\xdb\x97\x12\xf6\xfb\xd9\x4f\x27\x87\x1a\x80\x8f\xc3\xb9\x41\x32\x79\x22\xb2\x28\x59\xdf\x78\xb9\x7e\x38\xcc\x9b\x43\x33\xbc\xef\xa9\x54\x4e\xae\x96\xdc\xf7\x42\x13\xbf\xe9\xed\xf6\x7a\xa0\x70\x40\x0f\xc0\x08\x66\x4d\xad\x3a\xac\x19\xc2\xd3\x95\x6a\xb8\x03\x38\x90\x75\x18\xa0\x12\x04\x5f\xbc\xa7\xe1\x6f\xf4\x90\x3e\xd9\x04\x3c\x8f\x69\xf6\x29\x7b\x29\x8a\x1a\xb6\x7a\xdd\x5d\x34\x03\xf5\xc2\x39\x3c\x5d\x82\x45\xc3\xcc\x03\x31\x0f\x38\x43\x1f\xdc\xbb\x81\x4c\x06\xbd\x45\x63\xa3\x1e\xea\xef\x6d\xbe\x19\xd2\x1d\x45\x19\x6f\x23\x60\xf3\x7c\xc0\x81\x0b\x4c\x0b\x59\x01\xb1\x71\x18\xfd\x16\xf3\x27\x53\xbd\xc3\xf2\x2e\xed\x9f\xc6\x79\x6c\x9e\xec\x1d\x96\x72\x81\x27\x7f\xce\xb7\x0f\xec\x69\x56\xe0\x57\x59\x1c\xa2\x8a\x27\x5b\x51\xb8\x6e\xb9\xc0\x59\x97\x9e\xa8\x3b\x33\xc4\x34\x12\xe9\x4f\x12\x4b\xba\xa3\xf8\xa9\xe4\xfe\x0e\x0b\x42\x65\x98\x70\x2a\x48\xa8\xc6\x4f\x26\x3c\xd7\x2a\x76\xd8\x6c\x24\x91\x40\xed\x21\xe0\xfc\x28\x75\xc8\xa7\x91\x01\x7b\x14\x04\x2a\x98\xf2\x8c\x7c\xbc\x09\x09\x43\x90\x12\xef\x63\xc2\x8e\x04\x38\xb3\xb0\x3f\x55\x60\x7a\x6f\x08\x3c\x6c\xf3\xa2\xa8\x50\x9f\x09\xf6\x6c\xc1\x36\x5b\xea\x90\xc0\x6b\x97\x50\x9b\x8a\x9c\xc1\x35\x4b\x6d\xb9\xdf\xf8\x59\xa6\x90\x37\x9a\x2f\x80\x31\xe4\x74\xc1\xf1\x2d\x0e\xdb\x8c\x5a\x58\x9a\xf4\x97\xfe\xab\x42\xfc\xc9\xed\xd0\x8b\xe2\xb1\xa4\x7b\xf7\xef\xed\x76\x7f\xd2\x8a\xf5\x14\x5d\xd8\xdf\xc5\x9b\x76\x2c\x95\x3f\x5c\xf7\x81\xfb\xd4\x6b\xf7\xd4\xbf\x2f\x09\xc7\xee\x37\xf9\x28\x60\xcd\x3c\x1c\xbb\x4f\x70\x36\x1c\xc3\x0a\x9e\x36\x19\xc7\xcd\x80\x35\xf5\x0b\x92\x00\x98\xa1\xe9\xa5\x06\xec\x74\xd8\xf6\x02\xad\x68\x4e\xe2\x13\x66\xf2\x3e\x05\x34\xe3\xa2\x81\x87\x91\xcd\x68\xff\x06\x58\x2a\x25\x59\xdd\xc0\x80\xf0\x00\x7f\x17\xfc\xb4\xfb\xe7\x23\x79\x13\x1a\x71\x66\xc3\xc3\xb3\xbf\xe3\x93\x9b\x52\xfd\xc1\x62\x9d\x00\x70\x52\x77\x3e\x84\xe6\x3c\xe1\xf9\xf7\xeb\xfe\x00\x78\xed\x41\xc1\x89\x85\x03\x78\x0d\xce\x8b\xfa\x9b\xc4\x16\xe7\x4d\x04\x30\x33\x8d\x38\x3f\xfb\x8d\xde\xa1\x66\x3d\x9c\x89\xf9\x37\xc1\x0f\xfc\x96\x96\xae\x62\x5f\x5c\x12\x0a\x9b\xcd\x9b\xb1\x94\x85\x02\xec\x16\xf0\x88\x4e\x43\x8a\x14\xec\x46\x74\xdb\x69\xfd\xe2\x60\x1a\x96\xf4\xce\x8f\xdd\x14\xb4\xf9\x37\x3a\xd2\x05\x20\xbd\x08\x0a\xd8\xc3\x2f\xf7\x48\x07\x3b\xee\xff\x06\x57\xbf\xe1\x7c\x5e\xb0\x86\x37\xc5\xfb\xba\xe0\x35\x58\xb7\xf7\xae\xc6\x11\x4e\x25\xad\x93\x4f\xb2\xdc\x6f\x23\x25\xb5\x4d\x13\x0b\xf7\x66\xd4\x33\x19\xae\xaf\xf3\xe1\x76\x60\xfe\xcf\xd7\xef\xd9\x7a\x6d\x24\x5f\x0c\xff\xf8\x75\xc6\x99\xb2\xca\x35\xa3\x2a\x8b\xf4\xf0\x8c\x60\x16\xef\xae\xdb\xbc\x5a\x71\xc8\xbd\xe6\x2f\xe0\xcd\xbf\x1f\xb8\x25\x52\xc5\x04\x23\x63\xff\x3c\x39\xaf\xff\x39\x00\x55\x80\xf1\x09\x2e\xa6\xff\x63\xae\xd8\xe2\xc0\x27\x08\x93\x89\xaf\xf9\x65\x05\xe2\x1b\x08\x31\x99\x29\x50\x4f\x11\xde\x83\xb3\x01\xb1\x2f\x0f\x7e\xb4\x64\x41\xb9\xa0\x86\x2e\x81\xdd\x03\x00\x87\x07\x5e\xf7\xf8\x2d\xcf\x57\x27\x46\x7e\xd4\x84\x81\x99\x17\xf0\xe3\x33\x8b\x48\xd6\x89\xd6\xc9\x04\x59\xf2\x63\xf1\x5c\x51\xf8\x72\x68\xf7\x7e\x77\xbe\xeb\x79\x96\x0b\xaf\xfd\x4f\x5b\xc5\xbb\xc3\x04\x62\x36\x3e\x00\xc2\x7e\xdf\xef\x80\x32\x83\xeb\xb5\x30\xa9\xf6\x46\x18\x88\xea\x18\x63\x3f\x61\x02\x22\x31\x00\xb8\x93\x3a\x5a\x0d\x7e\xa6\x93\x72\x99\x08\x88\x55\x96\xff\xb6\x1e\xe0\x6a\x1b\x39\xe3\x9e\x4b\x13\xc5\xde\xf3\x35\xb6\xff\x14\x28\x8e\xd3\x74\x6c\x26\x8d\x3e\x78\x41\x85\xff\xfd\xa9\xb8\xf1\x53\xf0\x2c\x04\x38\xcb\x9a\x09\xac\x25\xdd\x19\xf6\x4f\x7e\xb1\x84\x01\x84\x07\xce\xbd\x7e\xcd\xaf\x1b\xf7\x4d\x6a\x0a\xd6\x65\xff\xbf\xc7\xfe\x84\xfd\x1c\x01\xd5\xdd\xb4\x1b\x1c\xc2\x91\x7e\x6e\xff\xf2\x78\x7c\xac\xeb\x7c\xde\xfe\xed\x21\xfc\x9e\x5a\x22\xdf\xfe\xf5\xef\x9e\xb7\x3c\x0c\xf6\xf4\xdf\xfe\xcc\xf8\x58\xc7\x9c\xde\xff\xf5\xa5\xcf\x9d\x2e\x8b\xfb\xfe\x6f\x7f\x46\xdf\x65\xe9\xd8\xff\xf5\x2b\xc0\x96\x6a\x45\x4e\xfe\xff\xbf\x33\xfd\xcf\x77\xfe\xe7\x3b\xff\x1b\xdf\xb9\x61\xc5\x84\x94\x4d\x60\x2c\x72\x4b\xfc\xfe\x5e\xb5\x01\x2a\xb0\xde\xf4\x23\x7c\xbd\xfe\xf7\xff\xf8\x9f\xff\xeb\xbf\xfe\xcf\x7f\xfd\xdf\x00\x00\x00\xff\xff\xbb\x94\x2f\x4d\xe9\x06\x02\x00") +var _pagesAssetsStylesContainersCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\xb9\xd7\x8e\xe3\x68\x9a\x28\x78\xdf\x4f\x91\x3b\x83\x05\xce\x39\xec\x6c\x7a\x57\x85\xbd\xa0\x11\x45\x27\x7a\x7f\xb3\xa0\x27\x25\x7a\x27\x92\x85\x79\xf7\x85\x22\x22\x23\xb3\x4c\x57\x75\xcf\x6c\x20\x95\x11\xfc\xf9\x7f\xde\x7f\xfa\xdb\x3f\xca\xbe\x2f\x9b\xfc\xeb\x56\xcf\x6b\xdc\xd4\x67\xbc\xd4\x7d\xf7\x75\xe9\xfb\x26\x89\xa7\x5f\x8a\xbe\x5b\xbe\xce\xf5\x99\xff\x04\x43\xd0\xff\xfd\x5f\x7f\x7a\xf9\xcb\x9f\xbe\xfd\x9a\xef\x43\x3f\x2d\x5f\xeb\xf7\x4b\x7f\xff\xff\x01\x55\x16\x2f\xf1\xff\x08\x4f\xb5\xb4\xcd\xd7\xb4\xcf\xf2\x5f\xda\x78\x2a\xeb\xee\xeb\x54\x97\xd5\xf2\xd3\x3f\xe0\xbc\xfd\x73\x51\xbf\x43\xbe\x78\x69\xe2\xee\xed\xed\xbb\xb6\x9e\xf9\x1b\x92\xa4\x6f\xb2\xbf\x40\xd2\x3f\xbe\x26\xeb\xb2\xf4\xdd\x2f\x43\x9c\x65\x75\x57\xfe\x84\x0c\xfb\x5f\xc0\x2c\x53\x1d\x77\x65\x93\xff\x32\xf4\x73\xfd\x7a\xf3\x53\x9c\xcc\x7d\xb3\x2e\xf9\xcf\xef\xcc\x43\x3f\x2f\xfd\xf0\x13\xf4\x17\x68\xd2\x78\x78\x7f\x8e\x93\x26\xff\xe5\x59\x67\x4b\xf5\x66\xe1\x9f\xbf\x71\x02\xfd\xfc\xae\x92\x9f\xa0\x9f\x93\x7e\xca\xf2\xe9\xf3\x8f\xaf\x69\xdf\x34\xf1\x30\xe7\x3f\x7d\xfb\xe3\x2f\x68\xcd\x6d\xdc\x34\x5f\xb3\x3a\x6e\xfa\xf2\x83\x14\x0e\x41\x7f\x29\x69\x52\x97\xbf\x06\xa2\xfe\x05\xa0\x1f\x69\xfd\xb9\x6b\xfc\x88\xff\xf7\xba\x4c\xe2\xf4\x51\x4e\xfd\xda\x65\x2f\x71\xfb\xe9\xa7\xff\x4c\xe1\x8c\x2e\x8a\x6f\xca\x80\x87\xfd\xcb\xdc\x37\x75\xf6\xe5\x3f\xd1\x18\x27\x49\xec\x53\x71\xd4\xbf\xc5\xe3\xd7\xe4\x5f\x67\xf3\x6b\x52\xfe\xf2\x7b\xbe\xb2\x2c\xfb\xf9\xf7\xfc\xbf\xf9\xc0\xcf\x4d\x5e\x2c\x7f\xe9\x0a\xbf\x62\x67\xa9\x97\xbf\x8a\xcd\x1f\x39\x7a\xbb\xfe\x07\x4c\xe5\x50\x9e\x15\xf9\xcf\x1f\x4f\x10\x04\xfd\x9c\xae\xd3\xdc\x4f\x3f\x0d\x7d\xdd\x2d\xf9\xf4\xa3\xb6\xbe\x73\x3f\xe5\x4d\xbc\xd4\x5b\xfe\xf3\x0f\x59\x07\x19\x96\x9f\x7f\x1b\x56\x3f\x6f\xf9\xb4\xd4\x69\xdc\x7c\x8d\x9b\xba\xec\x7e\x6a\xeb\x2c\x6b\xfe\x1d\x2f\xfc\x9a\xf6\xdd\x92\x77\xcb\xbf\x2e\xe8\x07\xc0\x1f\x88\x5a\x14\xc5\xa7\x34\xd8\xb0\xff\x8a\xd9\xae\x9f\xda\xb8\xf9\xb9\xdf\xf2\xa9\x68\xfa\xe7\x4f\xf1\xba\xf4\xff\xb6\x35\xbe\xa6\x4d\x3f\xff\xbb\x36\x79\x07\xfa\x81\xdd\x9f\x96\x29\xee\xe6\x21\x9e\xf2\x6e\xf9\xb2\x4e\xcd\xff\x7a\xbb\xf0\xff\x26\xfd\xfe\x8f\xb2\x2e\xfe\xf7\x97\xae\xff\x3a\xe5\x43\x1e\x2f\x5f\xe6\x74\xea\x9b\xe6\x4b\x9a\xbf\x19\xaa\x7a\x97\x04\xc6\x7f\x34\xd4\x6f\x52\x0e\x0c\x0d\xfb\x9b\xc7\xbd\xac\xf9\x91\x4b\xf0\x7f\x2f\x0c\x3e\xf4\xfb\xa5\x2e\xa6\xb8\xfd\x37\x84\xfd\x35\xdc\x8f\xd9\xe5\x1b\xe7\xe4\xdb\xc3\xef\xc2\x36\x69\xe2\xf4\xf1\x5f\xff\x48\xab\x78\x5a\xe6\xaf\x75\xd7\xd4\x5d\xfe\x35\x69\xfa\xf4\xf1\xcb\xef\xfd\x31\xab\xe7\xa1\x89\x8f\x9f\xbe\xb6\xfd\xf9\x79\xb7\xdf\x3f\xcf\x7f\x04\xff\xaf\xff\xf3\xe5\x55\x1c\xbe\xfc\x11\xea\xbf\xff\x9f\x9f\x8a\x7a\x9a\x97\xaf\x69\x55\x37\x19\xf0\x4f\xef\xfd\xf2\x6b\xc4\x9f\x6c\xb6\x79\xb7\xfe\x68\xd3\x37\xe7\xfb\x9e\x95\xdf\xd2\x54\x9a\x7e\xf9\x4f\x82\x20\x3e\xfe\x4b\xd3\xf4\xdb\x85\x79\x39\x9a\xfc\xa7\x37\xe9\xbf\x1d\x7d\xd8\x6a\xd8\xbf\x85\x67\x96\x17\xf1\xda\xbc\x47\xdc\x87\xf7\x7e\x81\xd1\x61\xff\xc2\x4c\x75\xdc\xfc\x7d\x8e\xbb\xf9\xeb\x9c\x4f\x75\xf1\xbd\x3a\xf4\xeb\xf2\xe2\xf1\xa7\xae\xef\xf2\x1f\x03\xe1\x0b\xf4\x07\xfe\xf2\xd2\x5e\x96\xef\x3f\x21\x10\x04\x41\xbf\x12\xeb\x5b\x25\xfc\x51\xba\x2c\xcb\xde\x5c\x15\x04\xe7\xb9\xf9\x47\x39\x2f\xf1\x52\xa7\xff\x48\xfb\x16\xcc\xb3\x7a\xe9\x27\xf0\x1d\xe6\x6b\x52\xfe\x63\xe8\xca\xff\xfd\xe5\xdd\x81\xbf\xee\x5f\x96\x7e\xf8\xf2\xca\x7d\xdf\x4b\xd7\x3f\xcf\x44\x4d\x3d\x2f\x1f\xba\x79\x13\xe1\x43\x30\x64\xd8\xff\x58\x34\xe8\xe7\x25\xdf\x97\xaf\x59\x9e\xf6\xd3\x9b\x5b\xbe\xbf\xfe\x27\x29\xe9\xf7\x12\x7e\xed\xd7\x25\x9f\x5e\xee\xf3\xf7\x3f\x7a\x5b\x77\xdd\xfb\xdb\x5f\xfe\xb9\xd9\x3e\x84\x89\xe3\xf8\xb7\x64\x97\x7e\xf8\x73\x9a\xbf\xfc\xa6\xaa\x7f\x77\x81\x97\xbd\xbe\x89\xf8\x87\x38\xbe\x73\xf6\x0d\xc7\x97\xaf\xf0\x67\x68\x7d\x20\x82\xbe\xbc\x8e\xbe\x21\x7a\x79\x0e\x36\xec\xbf\x0d\x89\x3f\xc6\xfa\x56\xac\x5e\x18\xff\xec\xfa\xb4\xfc\xf1\xf9\x77\x01\x3f\xd1\x7c\x24\xa7\xb7\x9c\xfb\xdf\xc0\xf8\x9d\xb1\x1f\xf1\xfc\xf3\xf8\xfd\x4b\xa1\xfe\x35\xd0\xbf\x66\xe7\x0d\xe5\x6f\xe4\xfb\xe9\xa7\xa9\xef\x97\x3f\x02\xfc\xe5\x2d\xab\x7c\xe4\x42\xe8\x4f\x2e\xfe\xa8\xc2\x7f\x15\xe4\x07\xa6\xfe\x55\x90\x8f\xc6\xf3\x57\x00\xef\x89\xe6\xcf\xa0\xb2\xa9\x1f\xb2\xfe\xf9\x87\x60\x7f\x78\xbf\x9e\x5f\x8d\x6d\xf6\x63\xbd\xae\xdb\xb8\x7c\x8f\xe5\xff\xab\x6e\x5f\xf3\x43\xdc\x2d\x3f\xf7\x43\x9c\xd6\xcb\xf1\xd3\x3f\xd0\x9f\xdf\x92\xfb\x0f\xcf\x45\xdd\x2c\xf9\xf4\x53\xdc\x0c\x55\xfc\xbf\x3e\xce\xff\x1f\x14\xfa\xdf\x7f\x4a\xf0\xcf\x35\xfb\x87\x11\xff\xa7\xa0\x9f\x1a\xfe\xf7\x41\x3f\x34\xfd\xef\x03\x7e\x2a\xfb\x23\xcf\xa0\x28\xfa\x83\xc6\x7e\x9d\x83\x68\x9a\xfe\xfe\xee\xcf\xc2\xec\x1b\xc5\x3f\x2b\x81\x7f\x68\xc1\xef\xf9\xf8\x95\x5a\x7e\x60\xe4\x33\x5b\xfd\xfa\xfc\x0f\xcd\x53\xbd\x5a\xb0\xff\x86\x6d\xfe\x39\xdc\xef\xf2\xf4\x37\x85\xa4\xc5\x97\xff\x24\xe8\xfc\xe3\x3f\x32\x2e\xfe\x82\xb5\x38\x7d\xb5\x18\x7f\x48\xbd\x1f\xf2\xee\x0f\x3a\xce\x24\x49\x7e\x9c\x4f\x3e\xab\x6c\xd2\x2f\x4b\xdf\xbe\x15\xbe\x3f\xa4\x54\xf4\xe9\x3a\xff\xb7\x5c\xf4\xcf\x20\xff\x89\x22\xfa\x29\xee\xca\x3f\x2e\x80\xdf\x52\xc0\x77\x03\xbe\xb5\x0b\x5f\xa0\x7f\xb5\x9a\x7d\x3a\xe8\x8f\xcd\xe9\x7b\xfd\x21\x5f\x05\xe9\x7b\x0b\xf1\xa7\xdd\xc3\xfb\xaf\x8f\xa6\xf2\xbd\x83\xf8\xde\x05\x7f\x45\x29\xea\xad\x28\xfe\x8b\x3c\x7d\x9b\x85\xdf\x57\x08\x7f\xa8\xc5\x5f\x5f\xf9\x6f\x98\xe1\x5f\x40\xf0\xdb\x22\xfd\xb1\xd1\xf8\xe3\x8a\xfe\x89\xef\xe5\x32\x7f\x4e\xf1\x75\xe3\x2f\xaa\xc6\x07\xc1\x6f\x33\xe7\x7f\x0b\xdb\xef\xd8\x7f\xc7\xf6\x2d\xe9\x7c\x2b\x7d\xdf\x46\xef\xa2\x28\xfe\x9a\xd0\x1f\x5e\xa8\xf2\xf4\xf1\xaf\x3a\xf4\x6f\xa9\x66\x59\xf6\x2b\xaa\xf5\x92\xb7\xbf\xfc\xd0\x60\xfe\x75\xf3\xfc\x4f\x7a\x4e\xe8\x57\xfd\x33\x99\xb7\x6f\x81\x81\xbc\x4d\x55\x55\xbd\xe4\x5f\xe7\x21\x4e\x5f\x20\xcf\x29\x1e\x7e\xc7\xc2\x6f\x9f\x5f\xad\xc4\xb7\x18\x7b\x97\x81\xcc\xdb\x6f\x14\x3e\xfc\x02\x79\xdb\x56\xfc\xa8\x84\xae\x7f\xd3\x4d\xd2\xef\x5f\x7e\x8b\xf0\xef\xbf\xb9\x58\xa7\x7d\xf7\xbb\x4b\xbf\xa6\x08\x23\xbf\xc7\x1f\xa7\x69\xde\xfc\x73\xb8\x0f\xc6\xa0\xdf\x00\xbe\x49\xf4\x6d\x0a\xff\x77\x94\xfd\x7b\x2c\x7f\x58\xfc\xde\xde\xbc\xb1\xf6\xf7\x7f\x03\xe0\x37\x0c\xa5\x69\xfa\x4f\xb2\xfd\x5f\xe0\x79\xa9\xf2\x97\xff\x69\x2f\xf2\x86\xa9\xaa\xcb\xaa\xf9\x5d\x0a\x7a\x7f\xf5\x2a\x66\x7f\xb4\x41\x22\x72\xba\xa0\x7e\x53\xd8\x7f\x7d\xf8\xee\xab\x59\xbf\x2c\xf9\xef\x87\xc7\xef\x93\xc3\xd7\xf7\x12\xf4\xea\xfb\x3f\x8f\x96\x7e\x78\x3d\xff\x81\x31\x3f\xfc\xec\xf7\x8c\xbe\x69\xe3\x07\x3e\xdf\x53\xf2\x4f\x9f\xc9\xf9\x73\x29\x41\x0c\xfb\xfb\x8e\x8b\xf8\x93\xed\xc4\xab\x41\xfe\xe3\xf1\xec\xdb\xae\x82\xf8\x23\xf6\x7e\xdb\x88\xff\x05\xcf\x7f\x78\xfd\x4d\x90\x37\x06\xdf\x98\x78\xe7\xe7\x47\x6a\xfd\xfb\x16\x76\xce\x9b\x3c\x5d\xfe\xd0\xc1\x7e\x4b\xf0\x2f\x21\x7e\xa3\xbc\xff\x49\x09\xc4\x5f\xe1\xfb\x05\xfa\xbd\x6e\xde\xe2\xe4\x97\xef\x2d\xe0\xcf\x59\x3d\xe5\xe9\x9b\xf2\x9b\x65\xfa\xf9\xbb\xc4\xdf\x4b\xfc\x9f\x59\xe8\x63\xa4\x7e\x37\xcd\xdb\xd1\xbf\x68\x8e\x77\x3e\x3e\x6a\xc4\x0f\xd6\xfe\x01\xdd\xef\xba\xa1\x37\xc0\xb6\xcb\xdb\xbe\xab\xd3\xaf\x55\xdd\x2d\xbf\xfc\x76\xa0\x5f\xbb\x2c\x9f\x7e\xb7\x78\xf9\x35\xe0\x9c\x0f\xf1\x14\x2f\xfd\xf4\xa3\x1a\x7e\xb5\xb7\xfc\x1e\x02\x6f\x0c\xbe\xe6\xe0\xbf\xfd\xed\x1f\x2f\x1b\x7c\x6d\xe2\x24\x6f\xbe\xfc\xf2\xb7\x2f\x5f\xbe\x7c\xf9\xdd\x72\xf3\x6f\xff\xf5\xb7\x7f\xac\x5d\xfd\xeb\x5b\x1f\x44\xa8\xb7\x9f\x9f\xbf\x03\xbe\x07\x66\xbd\xc4\x4d\x9d\xbe\x41\xbe\xb7\x93\x5f\xd3\x61\xfd\xa7\xf8\x7f\xc0\x07\xbd\xfd\xbc\x01\xd6\xdd\xef\x40\x7f\x43\xf4\xbf\xfe\xf6\x8f\x29\x7e\x7e\x7d\x49\x30\xff\x88\xbc\x88\xdb\xba\x39\x7e\xfa\xf2\x1f\x5c\xbf\x4e\x75\x3e\x7d\xd1\xf2\xe7\x7f\xbc\x93\xf9\xb1\x6c\x7d\x19\xa6\xfc\xeb\xab\x72\xbd\x93\x9b\xfb\xe6\x63\xab\x57\x2f\x4d\xfe\x6b\x8a\xc2\xdb\xcf\xdb\xbd\x21\x2e\x5f\x03\x5f\x9c\xe5\xd3\x97\x0a\xfe\xb8\xf6\xec\xa7\xec\x0d\xd5\x4f\x5f\x92\x29\x8f\x1f\x5f\x5f\x07\x6f\xd7\xdf\xbe\xcf\xf8\x3a\xf5\xcf\x3f\x64\x30\x7d\x67\xf0\x3f\xfe\xfe\xe5\x3f\xda\xbe\xeb\xdf\xf8\xfa\x8f\x1f\xb5\xf9\x32\xdd\x97\xb7\x76\xf2\xed\xf0\x07\x3f\xfa\xf2\xe6\x5e\xef\xc7\xbf\x49\x26\x5f\x96\x7e\x78\x7f\xf1\xb1\x6e\xfa\xf2\x89\xe0\xc7\x2e\xe6\x0b\xfa\x9b\xd3\x77\x87\xfd\xdd\xf1\x2b\x61\xfe\xee\xf0\x23\xb1\xbe\x9f\xff\xd7\xdf\xfe\x31\xaf\xc9\xab\xf6\xc4\xf5\xab\x57\xf9\xd8\x16\x7e\xad\xbb\x61\x5d\x3e\x04\xff\x15\x65\xec\x1b\xb6\xf7\x84\xf7\x05\x83\xde\xd1\xfc\x67\xd3\x97\xfd\x07\xc0\x47\x4e\xfd\x82\xbc\xed\x4b\x7f\xc7\x10\xf2\x79\xfa\xfb\xc4\xfc\x3d\x67\xfc\xee\xc6\xbb\x46\x3f\x58\xfd\xdd\xdb\xcf\x84\xf0\x6d\xdb\xfc\xdb\x0b\xef\x33\xfb\x2b\x85\xfd\x47\x16\x2f\xf1\x4f\x6f\xcf\xe0\xd0\x95\x3f\x27\xf1\x9c\x13\xd8\xdf\x6b\x8f\xd5\xad\x27\xa4\x5c\xcb\x9e\x61\x18\x46\xb3\xdd\xea\xe2\x96\x0c\xc3\x92\xee\xeb\xb1\xe6\x18\x89\x61\x18\x8e\x45\xcc\x01\x65\x18\x46\xb1\xfd\x86\x37\x61\xf6\x74\x1f\x19\x27\x5d\x1a\xc1\x3c\xc3\x5d\x77\x42\x44\x75\xa4\xf5\x66\x32\x4c\xae\x8d\x99\x8b\x66\xe1\x03\x4c\x7d\x63\x01\xd1\xc8\xa4\x7d\x73\xb9\x3f\xe7\x28\x9b\x4b\x93\xa9\x25\xe2\x29\x1d\x2c\x1b\xf5\x15\x67\x33\xd7\xeb\xe5\xc2\xca\xcc\x1e\xfa\x12\xd7\x84\xae\x60\x5d\x53\x5b\x08\x2e\xe5\xe2\x2a\xb6\x8c\x48\xd8\xc8\xf4\xeb\x35\x63\xeb\xbe\x8a\x6b\xd8\x4b\x75\x1d\x2b\x50\x25\x87\x8b\x60\xda\xc8\x1c\x25\x61\x70\xa5\x70\xfc\xec\xc0\x1b\x8e\x9f\x4f\x80\xb9\x58\x52\xfb\xc8\xe3\x3a\x2e\x19\xdc\xed\x5d\x4a\x5f\xca\xe2\x0e\xd1\xd2\x7e\x6b\xe9\x92\x91\x3c\x5b\x67\x2e\x12\xcb\xb7\x07\x25\x77\x6c\xea\x32\x8c\xc1\xf0\x79\x50\x01\x99\xca\x80\x20\x73\xdd\x92\x27\xc3\x31\x22\xef\xa9\xb5\x69\xef\x80\x08\x96\xe4\x60\xca\x4d\xca\x48\xf2\x85\xc1\x38\xc9\xc6\x9f\x33\xfb\x10\x24\xe6\xe0\x70\xf7\x60\x4d\xe6\x60\x4b\x66\x16\xf4\x33\x62\x7a\xa6\x61\x18\x26\x11\x1b\xca\xac\x25\x66\x2c\x21\x86\x34\x2c\xd9\x28\x5d\x06\x51\x5a\x07\x65\x53\x06\x51\xa4\x74\x34\x4b\xe6\x6e\x5e\x98\xd6\xae\x44\x99\x91\x99\xf5\xc9\x96\x5e\x28\xd8\x2a\xa3\x32\xcf\x92\x2b\xa7\x0b\x53\xab\xa5\xc3\x4c\xe5\x95\xf1\x93\xf0\xb0\x9e\x0a\xb3\x99\x2e\x93\xf5\x78\xf8\x60\x68\x26\x64\x38\xa6\x75\xa5\xf9\x64\x98\x52\x67\x24\xc6\xdc\x31\xe7\x34\x6f\xa5\xc3\xe8\xe5\x4d\x53\x40\x4c\x69\x8a\x54\xf2\x31\x9b\xb9\x30\xcf\xdb\xea\x9d\x51\xa6\x42\xf7\x9b\xbb\xca\x81\x79\xed\x8a\x83\xd2\xf9\x5a\xca\x55\x2e\x51\x05\x2e\xb4\xd2\xe1\x72\x0d\x65\x9c\x53\xd2\x06\x9f\xef\x17\xe8\xde\x31\xd0\xa9\xf3\x0c\xc3\x5c\xb7\xce\x7a\x16\x18\x66\xe0\x7c\x87\xaf\x4e\x85\xb7\x49\x97\xe8\x20\xb4\xc7\x2a\x10\x83\xec\x26\xdd\xb1\x8a\xca\x40\x60\x93\x9e\x1c\xcb\x30\xa6\x33\x83\x1b\xd2\x80\x0d\x9e\x85\x7c\x7a\x4b\xd9\x59\xf4\xc1\x98\x68\x12\x46\x1b\x7c\xe6\x7a\x2f\x00\x0f\x3a\x91\x67\x5b\xfa\xe5\x64\xe6\x5b\xab\xe6\xce\x9d\x32\x59\x22\xef\x3d\x5e\x32\x58\x28\xe5\xca\x59\x25\x6d\xaf\xee\x13\xe8\x89\x61\x33\x00\x9e\x46\x95\x00\x9c\x5a\x6c\x09\x65\xb2\x24\x80\xa0\xd3\x93\x11\xaf\xb1\x29\xb7\xcb\x53\xd1\x79\x30\x10\xaa\xa4\x8b\x57\xb7\x27\xbb\xe3\x69\x71\x37\x9f\x44\xf1\xc3\x00\x76\xcc\x03\xc1\x10\x1b\xa0\x5c\x82\x66\xef\x39\x0b\xe1\xb4\xfb\x52\x8b\xb9\x9c\xac\xed\x68\x8b\xbb\x83\x70\x91\xd2\xd6\xc3\x2a\x75\x28\x4e\x75\x17\xf1\x84\xe6\x22\x0d\xe5\x4d\x6e\xae\x1e\x20\xe3\x4c\xa1\xb8\xa4\xcb\xfc\x14\xc9\x95\x31\x15\x95\x6f\xee\x76\x56\xb2\x4c\xb1\xdd\x96\x3b\xdb\xab\x0f\x93\x31\xa3\xd3\x3c\xf2\x22\x65\x18\x59\x07\x81\x90\x66\x94\xe7\x85\x39\xa3\xfc\x81\x3d\x19\x66\xd3\xcb\x30\x50\x6a\x57\x80\xce\x2b\xc7\x30\x8c\xa5\x70\xac\x32\xb1\x2c\xfb\x3c\x59\x41\x39\x19\x7e\x38\x59\x31\x39\x19\xe1\x29\x57\xec\xc3\x62\x78\xce\x61\x0c\x96\xe5\xd8\xd5\x66\x44\x66\xac\xae\x72\xc4\x5e\x3d\x87\xd1\x97\xf2\xb2\x24\x0c\x7f\x1d\x19\xab\x5d\x2f\xe6\x72\xbb\xec\x3a\x83\x76\x18\x2b\xa7\x65\xbe\x3c\x85\x67\x54\x5e\x65\x92\xbb\xaa\xc7\x95\x33\x2d\xf6\x60\x4a\x27\xb4\x2f\x44\xcd\x0a\xf5\x7d\x29\xeb\xb3\x2c\x83\x36\xc4\x2e\x52\x2b\x48\x9a\xac\x30\x03\xc7\x0f\x35\x6b\x59\xd2\x1c\xbc\x9c\x90\x1b\x5d\x79\x7c\x78\xb0\x24\x81\xd2\x92\x56\x26\x7e\xf7\x76\x06\x18\xf8\xe4\xe0\x98\xa3\xde\x0e\x65\xbb\xa4\x7b\x23\x5d\x0f\xd7\x34\x5c\xa6\xf3\x98\x35\x2e\x8b\x6b\x3f\x5d\x7b\xd1\xb0\x32\xde\x34\x82\x90\xf3\xfb\x76\xb3\xae\x93\x99\x1b\x21\x87\xf4\x63\x61\xd9\x40\x05\x67\x0c\x4b\xd7\x3d\x7e\x2f\xb5\xcb\xce\xb7\xf1\x0d\xf1\x85\xf4\x2e\x65\x42\x28\x35\xe1\xb5\x4e\x44\xa1\x35\x1a\x9f\xf7\xfc\xfb\xe9\xdd\x45\xaf\x44\xb3\xca\x4d\x9e\x32\x5e\x91\xcf\xf2\xc1\xf4\x2b\x73\x01\x9e\x52\xd0\x9b\xe6\xb3\x3d\xb8\x87\xcc\x8a\xfe\x65\x0f\x4d\xa2\x6c\x48\x4e\x87\x2e\x53\x2f\x79\xcf\x96\xaf\x78\x91\x93\x0f\xc5\x19\x2f\x00\x24\x07\xbd\x0d\xa4\x16\x16\xde\xc7\xfd\x21\x54\xd7\x89\x4b\x56\xc9\xc2\xaa\xae\xf6\x72\xf9\x89\x39\x01\xae\x49\x32\x43\xca\x8f\xd5\xd2\xb9\xfa\xd2\x3c\x78\x59\xe6\xa0\x66\xb2\xb5\x45\x52\x63\xcb\x19\x78\xd2\xbe\x5c\xdb\xd4\xe1\x92\xe9\x71\x45\x65\x74\x35\xa5\xb9\xe7\x66\x49\xce\xad\x05\x67\x8c\xc7\x05\xb0\x01\xaa\xe3\x71\x35\x75\xf5\xd9\x97\xb0\xc7\x53\xee\x6b\xcb\x1e\x64\xd3\xb6\xef\x5e\x63\x00\xee\x65\x88\xa8\xc3\x1c\xda\x72\x6c\x44\x6d\x8c\x48\x97\x53\x46\x49\x1f\xe8\xd8\xf6\x91\x32\x6b\x98\xcd\xc5\xf2\xe1\x72\x5a\x70\x5b\x07\x5a\xbb\x47\xfc\x41\x98\x4b\x4f\x07\x66\xdb\x36\x5d\x5c\x64\xbd\x0a\x34\xd0\x5a\x76\x59\xb9\xe3\x42\x43\x73\x01\xd4\x6e\x3d\x0b\x74\x1d\x11\x1a\x50\xf6\x7c\x6a\x55\x89\xf0\x3b\x54\xd5\x0a\xdb\x4c\xd7\x60\x8e\x86\xbd\x46\xaf\x36\x10\x39\x4a\x28\x40\x78\x1e\x1d\x82\xf9\x84\x4f\x29\x69\xfd\x3c\xe4\xf1\x6a\xf3\xbc\x72\xa4\xeb\x81\x12\x22\x51\xb9\x0c\x2e\xd1\x78\xb1\x57\x0c\x41\x37\x36\x96\x97\xc2\x2e\x08\x07\xed\xc8\xc1\xf6\xe4\x99\xc0\x14\x34\x11\x3d\x3c\x22\x6f\x86\xf9\xfb\x68\x76\xae\x30\x6e\xde\x68\xc1\xde\x4a\x3c\x90\x69\xc6\xed\x0c\x56\x0c\xf7\x46\x5b\x01\xa1\x03\x01\x88\x70\x40\x7b\xd3\xe6\x3e\x16\xac\x91\xbb\xda\x8a\xe6\x86\x64\x71\xbd\x86\x50\x25\xcc\xe1\x11\x15\x42\x68\x2e\xd1\xe1\x95\xc6\xa4\x5e\xd7\xd0\xf1\xe5\x64\xde\xba\xd9\x11\x43\x01\xd8\x17\x44\x45\x97\x9b\x0b\x69\xe7\xd8\xc6\x73\x34\x08\x6d\x97\x47\xfb\x69\x5e\xf4\x7d\x12\x4b\x8a\xef\xa2\xee\x32\xe9\x52\x8a\x69\x67\x37\x2f\xcc\x01\x81\x6a\x22\xfa\xf1\x08\xb7\x53\x40\x2c\x1a\x3d\x10\xc8\x44\xc6\xe1\x0a\x1f\xa4\x95\x2c\x04\x3d\x6d\x59\xc0\x65\xa6\x0c\xcd\x5d\xe1\x12\x89\x33\xa1\x99\xd9\x12\xda\x34\x58\x6b\xef\x13\x08\x1a\x18\xc4\x9d\x74\x42\x60\xc1\x09\xb3\x83\x8f\xcd\xd5\x89\x0c\xb5\x2c\xd0\x5b\x68\xc5\x80\x05\x60\xda\xe0\x15\xb4\xc4\x33\x7d\x6a\x4c\x89\x3c\xd8\x66\xbe\x39\xd5\x9d\xba\x1d\x66\x08\x54\x53\x7b\x6d\x31\xa8\xe0\x2e\x58\x5c\x5a\x07\x52\x13\x8f\xd4\xea\x7b\x5a\x90\xfb\x23\xc7\xe4\x95\x10\x23\xe0\x06\xe7\x6c\x0a\x44\xe3\xbe\x89\x57\x65\xd6\x34\xbc\x41\xaf\x33\x15\xfa\xf2\x70\x5b\xd6\xc7\xae\x38\x02\xae\x62\xc3\x19\x59\x53\xdb\xc6\x04\x94\x38\x4e\x76\x3b\x6f\x07\x77\xa6\x93\x56\xcf\x47\x7e\xe8\x7a\xe6\xa7\x31\x8e\x57\xdb\xd2\x52\x08\x78\x68\x55\xec\x09\xdd\xcd\x53\xea\x33\x56\x77\x3c\x89\x9b\xee\x54\xd9\x28\xd2\x9a\x2d\x9f\x5b\x21\x04\xbc\xae\xf1\x69\x2f\x09\xa6\x4b\xe7\x07\xfa\x3c\x13\x08\xea\x7b\xc8\x6e\x5e\xe1\x3c\xe1\xe5\x99\x68\xa9\x15\x19\x15\x24\x99\x52\x0b\x69\x11\xb4\x10\x74\xc9\xbd\x1f\x9d\xad\x14\x9e\x93\x2c\xfd\x4e\x1a\xe7\xcc\xad\x47\x4c\x32\xc9\xa2\x17\x51\x45\xd7\x01\x92\x14\x89\x21\xa6\xcf\xf4\x52\xa1\xbe\x8e\x9a\x64\x21\xca\x50\x96\xee\x48\x22\x72\x14\x41\x38\x95\x76\xd3\x87\x5d\xe9\x78\xc2\xcb\xba\x2b\x92\x57\x29\x8e\x9e\x9a\x95\xb7\x36\xce\xab\x97\x21\x43\x9a\x3d\x73\x92\x38\x57\x06\x84\x28\xf2\x79\xf5\x70\x6b\x5a\xd7\x45\x81\x21\xd0\xbf\xb7\xe4\x9a\xa0\x0a\x1a\x25\x99\x93\x9d\x3c\x2a\x14\xf1\x46\x3a\x36\x91\x5c\xa9\x26\x7b\x9e\xe8\x66\x16\xce\x93\x86\xef\x75\x9a\x9e\xf7\x2e\xce\x93\x81\x52\xcf\x87\x9e\x6e\x41\x17\xe5\xbe\x47\x92\x9b\x85\x1b\x33\xfe\x6c\xbb\x25\x7c\x26\xe9\x3d\xd9\x85\xad\xdc\xd2\x85\x0c\xf9\x1e\x30\xfc\x80\x38\xd7\x07\x6f\xcc\x21\xc0\x0c\x34\xd1\x61\x39\x30\x4c\x58\x8d\x9e\x08\x20\xa1\xa4\x5f\x0c\x0d\xc0\x82\x47\x0e\x9c\x1b\x71\x80\x88\x01\xa8\x60\x95\x17\x92\x4f\xb9\x98\x10\x32\x22\xcb\xe4\x2e\xbb\x85\x97\xb8\x4c\x6e\x7c\xfc\xbc\x15\xac\xfc\xb8\x0c\x66\x0a\xb3\x21\x24\xac\xcf\x70\xe3\x79\xcc\x33\xcb\xa7\xcc\x7b\x8f\x22\x1d\xb4\xed\xc9\x16\xc7\x15\x6c\xee\x37\x7a\xef\x54\x79\xb2\x84\xb4\x97\x3a\xcb\x8b\xaf\x60\xff\x3c\xb9\xe8\x26\x2e\xa1\x75\xef\x13\x83\xd3\x28\xb3\x68\x81\x16\x70\xcf\xe1\x54\x43\xa9\xd6\x59\x31\x91\x6a\x4c\x44\x1e\x51\x6b\x15\x78\x61\x99\x83\x72\x57\x46\x75\x1d\xac\x45\xd0\xa0\x34\x70\x50\x55\x8b\x67\x5c\xe8\xc8\x88\x44\x74\x2a\x04\x86\xbb\xfa\x20\x11\x64\x44\xd2\x2e\xea\xa6\xeb\x30\xbb\xed\x7e\x27\xe5\x15\x2b\xd5\x7a\x5c\x25\x01\xab\xc0\x4a\xa0\xa2\xd4\xce\xd8\xdb\x83\xcb\x11\x19\xbf\x39\xe1\xce\x23\x32\x86\xde\x38\x1c\x39\xe2\x1b\x7e\x3e\xda\xc6\xf6\xb3\xab\xbe\xe2\xd9\x51\xaf\x56\xd1\x12\x29\xa9\x76\x5d\x4a\xf9\x8e\x17\x3d\xc4\x27\x56\x45\xa5\xdd\x90\x12\x88\x87\xb7\xd2\x6c\x98\xed\x7a\x01\x9b\x01\xc1\x35\xd1\x32\x8e\x4a\x5e\x05\x07\xf2\x81\xbe\x47\x6a\x37\xb9\xa2\xeb\xa5\xa7\x1e\x6b\x9c\x79\x43\x80\xe8\x1a\x44\x16\xae\x41\xc4\x52\x64\x58\x5d\x70\xbd\x3d\x1b\xc3\xad\x17\xfc\x61\xb5\xf6\x6a\x1b\xa7\xe3\x45\x17\x78\x21\xe6\x93\x6e\x76\xc4\x86\xf0\x46\x3e\xdc\x4e\xd1\x6c\xde\x6f\xfd\x85\xdb\x82\x9b\x9a\xf6\x0b\x44\xb7\xca\xb1\x3a\x7c\x6e\xe1\x78\x8b\x2a\x57\x5c\x17\x8f\xad\x78\x48\x60\x73\x52\xf4\xec\x25\x92\x77\x83\x62\x1d\x72\x47\xdc\xe4\xab\xe8\xa6\x12\xe5\x94\x0b\x73\xe8\xa3\x35\x66\xab\xb0\xe4\x2f\xe6\x89\x22\x09\x40\x6c\x8f\x3b\x87\x49\x7e\xa1\x22\xe6\x2c\x70\xd8\xac\x1a\xe1\x2a\x56\x11\x95\x33\xf5\x06\xf9\xa4\x50\xeb\xaa\xbb\x67\xa8\x7a\x17\x32\x77\x1a\x1e\xf9\xb5\x7b\x42\x1d\xaa\xc6\xb7\xf5\x68\x36\xd8\xc4\x9a\xca\xf6\x0a\x79\xcc\xb3\xf3\xb8\x37\x0a\x0f\x8d\x7e\x63\x1e\x2b\xe7\x9d\xb6\x37\x46\x8e\x7c\x20\xc4\x4a\x0b\x23\x1e\xee\x5e\xd5\xf8\x96\x47\x22\x63\x00\x7b\x8b\x5f\x1c\x7d\xd0\x78\xc0\x9c\x2a\x47\x3f\x6d\xf5\xd3\x9a\xee\x2d\xd6\x64\x7a\x40\x7b\x14\x1d\x34\x0b\xb2\x4c\xb9\x3d\x15\x0a\x99\x2f\x12\x41\x38\x53\x32\x9e\xa8\x9f\x00\x9b\x3d\xc1\xa3\x99\x05\x66\xb5\x31\xda\x64\x6d\xfb\x3d\x77\x93\x00\x81\x15\xb4\xb3\xab\xbc\x9d\xe0\xfb\x8c\x40\xaf\xec\xc0\x9c\x5e\xa5\xe5\x70\x72\xaa\xf1\x8c\x80\x4a\xa5\x8d\x06\x92\x0f\x30\x18\xa4\x8b\x0f\xc6\xc8\xb4\x90\x64\x24\x2f\x93\xbf\xd1\x30\x9a\x83\x37\xbd\xdc\x21\x4f\xa7\xc9\xad\xd1\x0f\x6a\xb1\x17\xcc\x43\x56\xda\x0a\x50\x38\x59\xd4\xb5\x5c\x10\xe3\xda\x4a\xc9\x3a\x81\x6d\xb1\x20\x98\x85\x66\xc6\x1e\x11\x46\x4e\x78\x24\x0b\x46\x02\x09\x2c\x63\x76\xa5\x67\x54\x01\xc0\x8d\x94\xe4\xc4\x93\x90\xbb\x85\x4b\x7a\xc7\x37\x2d\xc6\x6e\xc8\xb0\x2d\x6d\x97\xc3\xa9\xd0\x8f\xfc\x2c\xb3\x78\x7a\xe9\x50\x22\xa2\x72\x40\x33\x09\x45\xd4\x9f\xf4\xc9\x9f\x19\x10\x15\x64\x01\x73\xfa\x22\xe5\xf6\x66\xeb\x13\x0d\x4f\x1c\x72\x4f\x62\x86\xee\x13\x74\x23\xa4\xe3\xde\x59\x70\x2e\xba\x39\xb0\x80\x34\x40\x9e\xe2\x3d\x44\x03\x51\x0b\xe9\xa0\x1b\xb9\x4c\xe1\xd1\x1d\xc8\x6d\xee\x01\xe8\x5d\xa4\xe4\x79\xe7\x62\xa0\x91\xd9\x11\x2a\x76\xa8\x63\x1c\x51\x0c\xc3\x56\x90\xc0\x9d\x49\x01\xb9\xb1\x67\x10\xf9\x38\xd0\x00\x2c\x64\x8a\x26\xbb\x3b\x8c\x3e\x37\x91\x87\xa4\x2d\xab\x91\xc3\x47\x6d\x02\xa2\xa7\x3b\x2c\x16\x1d\x4f\x63\x6e\xbd\xf9\x08\x38\x45\x45\xa1\x92\x5e\x4a\x4d\x9d\x03\x39\xf9\x4c\x42\x39\xe8\x14\xe0\x30\x3e\x35\xef\x84\xc1\x7b\xa0\x36\x48\x91\x27\xe8\xb6\xaf\xcf\x64\x41\xb0\x16\xb5\x0e\x4c\x4e\x26\x18\x10\x13\x84\xb4\x32\x94\x5b\xf1\x1b\x2a\xc0\xc4\x1d\xad\x37\x50\x25\x63\x30\xef\x45\xa0\x04\xc7\x82\x74\x80\xd9\x0f\x98\x24\xe7\xb1\xf0\xc6\x96\x27\xa5\x45\x3c\x40\xe9\x5c\x98\xe7\xe0\xe0\x80\x10\x56\x54\xd0\xa3\xb8\x59\xb4\x7b\xb7\x6a\x5d\xbb\xe3\x50\x21\xee\xb3\x76\x9d\xd0\x23\xba\x11\x0e\x16\xe7\xc7\xb0\x1b\xc6\xd1\xe1\x3e\x88\x76\x53\x4a\x6c\x1d\x0a\xa2\x35\x00\x6d\x86\x6f\x9c\x21\xc5\x6c\x78\x4d\x01\xe0\xd4\xb5\x03\x85\xaa\xdb\x48\xb4\x9b\x3e\xa7\xf7\x7d\x07\xa8\xb3\x7b\xd0\x54\x9c\x50\x53\x4a\x26\x45\x0e\x60\x24\x39\x15\x3b\x09\x15\xad\x7d\xa7\x4c\x03\x37\x29\x5a\x24\x42\x2a\xef\xa0\x0b\x88\x1a\x6b\x46\x81\xdb\x73\xa3\x31\xe7\x04\x20\x50\x96\x22\xea\x35\xe7\x5d\xc3\xc7\x22\x5a\x0c\x0f\x32\x06\xc5\x80\x04\x47\x0f\xf8\xed\x75\x2e\xa7\x97\x2a\x4a\x9f\x0c\xa3\xd6\x37\x86\xe1\xb0\x3b\x13\xd4\x8d\x81\x86\xaf\x77\x62\x76\x69\x34\xcb\x2c\x72\xb6\x34\x6d\xe9\x6e\xdc\x99\xf5\x35\x29\x32\x25\x73\x69\x2e\xa6\x67\x61\xc8\x7a\x66\x19\xc2\x26\x30\xda\xa1\xa9\x2f\x59\xd2\xe5\x62\xcb\xea\x1d\x1d\x6a\x4b\x4f\xc2\x26\x5e\xea\x20\x6a\x56\x73\xc9\xd3\xfe\x3e\x47\xc8\xc3\x4f\x11\x1d\x3a\xa2\x05\x23\xad\x0d\x42\xad\x87\x3e\xb7\xc9\xd0\x36\x57\x8c\x84\x1b\x9f\xd2\x62\x78\x62\xda\x0a\xb2\x14\x91\x93\x1a\xf2\x0e\xb1\x8f\x92\x65\xef\xd2\x86\xf2\x84\x07\x88\x26\x2d\x48\xbd\x40\xf2\x18\xbf\xe1\x4f\x00\x7d\xd8\x6d\x8a\x9f\x64\x47\xdd\x54\x0a\x2b\xd8\xb4\xc9\x8a\x89\x37\xdf\x64\x62\x24\xae\xc4\x44\x86\xe0\x9f\x2e\x53\x30\x92\x39\xaf\x34\x94\x5f\xad\x46\x16\x31\x6e\x1a\x94\x50\xf8\x76\xc9\xf5\x60\x07\xa0\xe2\x24\x81\x1f\x9d\xdc\x96\x42\x29\xf0\x0e\x44\x1b\x64\x05\xd2\xf8\x3a\xe9\x53\x0b\x87\x8c\x07\x81\x02\xd8\x5d\xde\x40\x4c\x8d\x0b\xdb\xa8\xc3\xef\x3b\x48\xef\xba\x77\xa8\x1e\x72\xe4\x1a\x42\x2c\x8e\x68\x41\x85\x79\x31\x35\x7e\x22\x72\x88\xce\x0d\xd6\xb4\x91\x65\xb2\x1f\xd3\x21\x9c\x20\xa8\x5b\x3d\x17\xf0\xe8\x91\x9a\x2f\x2c\x2c\xe3\x6a\x0d\x88\xe9\x5c\xf5\x84\x0a\xee\x39\x2b\x90\xbf\xa2\x47\xe4\x6e\xc1\xe4\x41\x8e\x60\x79\x82\xff\x64\x2e\x43\x41\x02\x60\x79\x13\x79\x18\xee\xe3\xe4\x91\x52\x19\x8c\x92\x27\xdc\x0c\xb6\x0f\xb1\x49\x45\xe0\xfa\xbb\xac\xa5\xc2\xd6\x0b\xbd\x81\x60\x98\x82\xd9\xd4\xa4\x0d\x08\x74\xce\x98\x93\x9d\x2c\x25\x77\x37\x8e\x99\x83\xed\x79\xe6\x79\x13\xbb\xb3\x73\x05\xed\xa4\xd0\xad\xea\xee\x8f\x95\x1c\x97\x02\x88\x64\x65\x88\x25\xfc\xa9\xb9\x77\xf1\x99\xbe\xe1\x63\xe5\x19\x45\xe9\x01\x27\x3a\xc7\x03\x40\xf0\x91\x3e\x46\x20\x9b\xe1\x91\x1e\x24\x9e\x13\xcd\x37\x54\xe8\xd9\x51\x60\xeb\x50\xf3\xb2\xac\x9b\x1f\x08\x54\x1b\x40\x2c\x59\xb6\x9f\x3c\x5d\x99\x53\xbb\x93\xc0\x03\xa7\x00\xd9\xed\x6c\x16\x24\xd2\x86\xdd\x19\xd3\x58\xb1\x88\x7f\xce\x2a\xf7\x3c\x6e\x9b\x22\x27\xe8\xae\x8d\x74\x60\xcb\x39\x17\x3f\x24\x8a\x7f\xb7\x8b\x6a\xde\x28\x0a\x80\x69\x8b\xc2\x6c\x03\x14\xec\x07\x5e\x4a\xec\x59\xf9\x0e\x35\xaf\x9b\x3f\x25\xf0\x8e\x3d\xc3\x98\xf5\x9e\x13\xf5\xcd\x2e\x2c\x3b\xc6\xc8\x06\x92\x39\x08\xa6\x92\xbb\x41\x7a\x03\x1d\x78\xb8\xfa\xc9\xd2\x66\x81\x05\x69\x3a\xc4\x49\xca\x09\x80\xbd\x80\xf2\x0d\x34\x5c\x4d\x4a\xe5\x68\xad\xd7\x04\x10\x24\x86\xec\x1e\xb6\x72\x2f\xa0\xdc\x02\xc8\x90\xfa\x86\xf0\xc2\x98\xc7\xbc\xa9\x8e\x8b\xeb\xd7\xea\x99\x02\x53\xb9\xa5\x6a\x93\xee\x10\x90\x4e\xca\xb8\xfa\x89\x8c\x41\xd9\x08\xc7\xd0\xf9\xb0\x4b\xe6\x02\xd1\x5b\x42\x53\x44\xf5\xdc\xb3\xd8\xdf\xc8\x9a\x5e\x92\x1a\x2b\xfd\x0b\x46\xf1\xf3\x2c\x52\x1f\x8a\xe5\x52\x67\x40\xd6\x7c\xd3\x97\xce\x2b\xce\xc6\x1b\x97\x6c\xbb\xd6\x95\xbf\x05\x53\xdf\xaa\xf7\xd8\xdb\x18\xd6\x09\xe0\x2c\xa0\xcf\x51\xe4\x27\x2b\xdd\x82\x35\x08\x0a\x60\xdc\x2d\x54\x3b\xe6\xf5\x91\xdc\x98\xed\x6d\xee\x64\x18\x8e\xc1\x74\x0b\xd2\x37\x10\x46\x51\x0a\xbb\x9d\xda\xd9\x78\xc0\x06\xf9\xe5\xa8\xcc\xe3\x16\x90\x85\x9f\xf0\x89\x63\x98\x9c\x12\x5f\xc1\x4d\x17\x1d\xec\x50\x7c\x64\x19\x37\x50\x81\x1a\xd9\xf6\x40\x02\x5b\xb3\x41\x74\x18\xb2\x53\x28\xee\x8d\x3f\xa6\xd2\xb1\x5c\xac\x84\xdc\x6b\x06\x62\x1d\x27\x50\x9d\x0c\x0b\x37\x92\x1c\x89\x66\xa4\x98\x5e\xfa\x98\x26\x7a\x0d\x5c\x99\x32\x78\xe8\x22\xc9\x8b\xda\xd0\x53\xae\x07\x07\xd6\x13\xc6\xe9\x6f\x60\x4d\xb5\x9e\x4a\x58\xd8\x33\x06\x9c\xfb\xb7\x18\x5b\x7c\x67\xc7\xc6\xcd\xd8\x0f\xc0\x91\xf5\x6e\x46\x92\x89\x00\x3a\x43\xe0\xf6\x28\x5d\x10\x7c\x89\xdb\x5e\x49\x4c\xa7\xf4\x20\x54\x13\x30\x2c\xd5\xb3\x29\x83\x4e\x5d\xdd\x88\xcd\x8b\xab\xcc\x6f\x34\x8d\x0f\xb5\x44\xda\x9f\x1f\xb6\xb6\x67\xda\xb0\x21\x5c\x0f\x9a\x67\x6a\xb0\x31\x48\x48\x0f\x3b\x4f\x93\x6b\xd5\xc7\x57\x6c\x56\x38\x02\x20\x93\x16\xf6\xa3\x3a\xd1\x58\x9d\x4d\x82\x11\x44\x51\xa3\xbd\x3e\xa1\x5c\x3f\x57\x29\xa7\x23\xb2\x66\x8b\x9b\xc6\x96\x86\xc6\x5e\x63\xad\x60\x9f\xef\x26\xbf\x3d\x7d\x15\x1e\xb1\x9c\x02\x93\x19\x5c\xc9\x17\x9c\xf9\xd8\xd4\x2a\x8a\x7d\x54\x3e\x52\x82\x8e\x17\xd5\xbe\x4b\x03\x4e\x31\xf8\x83\xb0\x07\x5e\xeb\x08\x0c\xcb\x8b\x20\x7b\x64\xa2\xa3\x2f\x64\x25\xd0\xac\x1e\x72\xa0\xbc\x7f\xf8\xd0\xd3\x87\x2b\x6b\xeb\x8a\xa2\xe8\x41\xf1\x86\xa7\x41\x9c\x83\x7d\xac\x83\xbd\x7d\xa1\x8d\x15\x21\xb3\x75\x95\x04\x0a\x78\x8c\xa5\xd6\xec\x2b\x8d\x7a\x5a\x12\x6c\x5b\xb7\xdd\xc2\x29\xd0\xc1\xcc\xbb\xc9\x8d\x06\x14\x15\x9e\xb1\x79\xcc\x7d\xe7\xf3\xb8\x59\xad\x66\x85\xbe\xe0\xa4\xa0\x91\x06\xc4\x88\x2e\x00\x18\xe1\x38\x6e\xd8\x8f\x21\x5e\x91\x08\xb6\x82\x36\xf2\x47\xa4\xdd\x4c\x6e\x7d\xcc\x46\xa5\x8b\x3e\x41\xcc\x8e\xec\xc2\x9a\xe3\x92\x38\x71\xba\xae\xaa\xc0\xe6\x28\x24\x90\x80\x3f\xd4\x86\x0e\xa6\x81\x29\xdf\x43\xb7\xe6\x5d\x38\x40\xef\x2d\x92\x67\x14\x80\x8f\xbb\xbc\x18\x23\x1c\xaf\xbe\xda\xb4\x33\x04\x74\xfd\x4d\x62\xa6\x56\x3e\x52\x43\x24\x6b\x5c\x6f\x47\x62\x68\xa3\xab\x05\x00\xd3\x65\x6c\x80\x75\x0c\x40\x7a\x98\xb5\x45\xab\x42\x8e\x0c\x8d\x27\xf6\x86\x94\x13\xd5\xb3\x2e\x47\xcd\x1a\x0d\x2d\xda\x8c\x2a\x86\xc7\x19\x1e\x10\x32\x9b\xe8\x93\x30\x38\x05\x4f\xe7\xd1\x23\x08\xe9\x2e\x1d\x8f\xf3\xc9\x00\xe1\xd5\x7a\xe0\xb7\x9a\xdc\x81\x69\x3a\xc9\x2e\x4b\x06\x00\xcc\x85\xa8\x95\xd7\x0b\x76\x13\x8b\xf9\x33\x57\xa9\x14\x8a\x76\xe7\x94\x09\x3e\xdc\xc1\x18\x65\xf0\x3b\x75\xe4\xb2\x30\xc2\xf9\x56\xdf\xfd\x28\xe6\x7d\xe6\x95\x6c\xc8\x81\xc8\x7b\x28\x37\x34\x0f\xc0\xa4\x4b\x6b\x77\x58\x8c\xd1\x51\xb8\x28\x70\x3a\x0f\x74\xc0\x88\xaa\x00\x8a\xef\x41\x60\x82\xb7\x41\xb1\x41\x24\xb8\x9f\x6b\x76\x56\xb7\xce\xc1\x91\x75\xac\xb1\x45\xf5\xda\x33\x6e\xbc\x31\x2e\x7b\x8d\x85\x64\x9f\xc2\x7c\x3f\xa4\x72\x7d\x41\x33\x08\x10\x5d\x77\xf1\x86\xcc\x6f\xe4\xdb\x82\x5d\x71\x69\xa7\x3e\xd0\xd9\x60\x27\x9f\x33\xa1\xdf\xfb\x23\x6d\x64\xf0\x89\x56\x54\x70\x1f\x89\x75\x9a\x88\x75\x3a\x29\x50\xf5\x27\x01\xf7\x7c\xa1\x62\x10\x4c\x34\xb1\x20\x26\x4f\x3a\xf1\xc4\x73\x41\x0a\xb1\x7a\x58\x32\x4e\xfa\x8d\xe5\x0a\x57\x48\xc4\x7b\x9c\xfa\xe4\x51\x30\x47\xcf\x6f\x64\x2a\x6c\x9d\x01\x31\x43\x02\x96\x13\x84\x78\xc5\xb7\xfd\x18\x78\x7f\xf2\x60\xdf\x6d\x90\x07\x74\xdd\x7a\x83\xe5\xaf\x24\x1a\x90\x07\xac\x37\xce\x40\x2c\x14\x80\x73\xbc\x72\xcc\x93\x1a\x07\x67\x79\x05\x01\x0e\x13\xcf\x6f\xb1\xd5\xc7\xdc\xb4\x82\x5b\x00\x82\x41\x71\x2b\xa9\x58\xb0\x7c\x38\x9d\x83\x43\x48\xd7\xc0\x72\xad\xcb\x8d\xf1\x98\x07\xfb\x88\x44\x07\x06\xc0\x9b\x1d\xcd\xa8\xbb\x36\xd0\xa6\xa7\x8e\x1b\x9f\x19\x45\x51\x26\xba\x2a\x3d\x6b\x7c\xcf\x79\x8c\x3d\xdf\xa5\x33\x84\xa0\xb6\xa6\xdd\x11\x27\x58\xc7\x85\x0d\x92\xdf\x9f\x54\xba\x39\x99\x65\xce\x93\xd2\xe4\xab\x7d\xa9\xa4\x90\x53\x18\x49\xe3\x7d\xb8\x23\xa9\xfd\xd6\xfa\x70\x93\x80\x46\x40\x9e\xdc\xa6\x1e\x69\xd9\x89\x8c\x47\x55\xdf\xec\x5e\x49\xa3\xfd\x58\xe5\xfb\x0e\x81\x92\x41\x90\x0e\xe1\xec\xf0\xba\x0e\x90\x17\x78\x95\x99\x5e\xc7\x63\x70\x05\xb6\xe8\x6e\xac\xc5\x49\xe8\x15\x47\x83\x02\xc1\xb1\x23\xd3\xf9\x12\xd3\x95\xa6\xba\xc6\xee\x43\x4e\x9f\x22\xc6\x6d\x8f\x0f\x07\x65\xdd\x53\xa6\x40\x07\x17\x28\x90\x57\x36\x98\xde\xde\xca\x37\x32\x8c\xe1\x43\x65\x0f\x3c\x9c\x84\x7a\x4f\xc6\x8c\xef\x5b\xd6\x2c\xa5\x0b\xae\x3b\x03\x44\x64\xd3\x38\xae\x73\xb6\x2d\x47\x13\xd7\xde\xb8\x75\xe7\xb1\xd4\x56\xc9\x16\x92\xf5\x61\x2a\xc9\x56\x48\xe5\x98\x6b\xa9\x96\x88\xbc\x19\xa2\x74\x0e\xc5\xaa\xc1\x29\x02\xc9\x80\x27\x95\x06\xea\xf0\xa0\xc2\xde\x3b\x10\x4d\x93\xc7\xf0\x7a\x11\x22\xc3\x01\xc0\xfd\x71\xbc\xe5\x33\x5a\xec\x29\x89\xf6\xed\xc7\xb0\xaf\x9a\xb5\x86\x02\xc5\x06\x9f\x3d\xc4\x28\x70\x13\xec\x7a\x42\x15\x78\x30\x6d\x4b\xee\xed\x84\xe8\xa2\x70\xb2\x97\x4f\x76\x78\x09\x4e\xc8\x5d\xa0\xd6\x00\x07\x82\xe6\x76\xe1\x18\x7d\xa1\x17\x9a\xec\x4e\x9e\xc8\x34\x0f\x75\x20\xda\xac\x5c\xa4\x00\x31\x2a\x2a\x8b\xa7\x54\x7c\xe6\x2c\xa9\x75\xe8\xad\xab\x79\x1c\xb8\xfa\xb6\xcc\xbb\x88\xe6\xa4\x88\x66\x17\x97\xfd\xa0\x93\xa5\x73\xf6\xbe\x77\xa9\xac\xa4\x4d\x78\xb9\x63\xb9\xe0\x79\x99\x8b\x2e\xd7\xd4\x37\xdc\xad\xc5\xda\xbd\x3a\x59\xa3\x34\x01\xe7\x3d\x99\x48\x92\xe9\x0a\x56\xd4\x6b\xec\xc0\x9e\x8f\x06\xdb\x70\xd1\x82\x32\x98\x44\x17\x1c\xc4\xae\x6c\xe4\xe7\xad\x12\xa5\x9b\x0d\xd1\x7a\xa8\x5e\x58\x3d\x18\x01\x14\x70\x65\xd5\xf3\x02\x78\x77\xd7\x40\xbe\x3c\xec\x19\xaa\xce\x40\xd8\x6d\xb7\x56\x1c\xb6\xf8\x11\xb7\xd3\xd3\xc5\x98\x76\xfa\xfe\xaa\x43\x17\xf5\x06\x36\xe9\x12\xf8\xdd\xd8\x2e\x46\xa4\xe7\xdd\x14\x51\x48\xa2\x1e\x73\xa3\xe4\x98\xd9\x61\x2d\x05\xb7\x23\x41\x0c\x53\x3c\xae\xb3\x57\xce\xe5\x50\x28\x98\x3d\x32\x27\xd1\x52\x41\x4d\x67\xef\xa1\xc5\x5d\xee\xaf\x98\x07\xd0\x74\x71\xe6\xd2\xbe\xbb\x21\xaf\x7b\xcd\xe0\xce\xbe\x8a\x84\xa4\x9e\xb3\xe7\x7b\x5d\x58\x26\xc7\x85\x17\x1b\x59\xa7\x52\xa5\x1d\x6a\xb8\xe4\x60\x6e\xde\x81\xe0\x41\x8d\x4f\xfe\x29\x17\xb1\xc1\x3c\xdf\x8b\xbe\x0d\x89\xa5\xc1\x74\x0e\x16\x70\xe9\x34\xf6\x40\xe0\xf9\x59\x3b\x8c\x47\x64\x88\x75\x65\x05\x0d\xdb\xeb\xec\xd5\x74\xda\x58\xdc\xa9\x4d\x49\x10\x47\x47\xa2\x79\xbf\x39\x97\xa7\xe0\x2e\x0f\xa2\x3b\x28\x52\x09\xb7\x9e\x41\x0f\xe9\xa3\x04\x70\x97\x66\x76\x2e\xbb\x7e\xef\x89\x5b\x27\x1f\x26\x37\xae\x09\x0d\x62\x0a\x92\xad\x34\x99\xaf\x04\x80\xe5\x37\xd1\xde\xc3\xe5\x4c\x51\x3d\xb4\x00\x36\xce\x9d\x23\xaf\xe6\xb8\x6d\x87\x29\x5e\xb6\x04\x31\xf9\xdd\x94\x9c\x79\xb2\x89\xb9\x39\x4a\x8d\xba\x5f\xa9\xf1\xdd\xfe\xbc\xa4\xa4\x77\x43\x47\x75\x44\x5d\x79\xe5\xd5\x4f\x66\xc1\xab\x25\x09\x60\xaa\x10\xf7\x7a\x8f\x7c\x4f\xb6\x83\x3d\x0d\x84\x5b\xb4\x1d\x14\x3a\xd2\xdd\x06\x36\x74\x30\xbe\xfe\x89\x8f\xe9\x04\x6d\xd0\x05\x88\x79\x03\x3d\x65\x86\xaf\x33\xda\x14\xc4\xe0\x2a\x55\xdf\x6f\x00\xb9\x76\x93\x06\x67\x45\xd0\x9d\x0f\xda\x70\x9e\xc5\xf3\x1e\xcf\x65\x47\x3c\x2e\x85\x44\x7e\xe6\x20\x29\xcf\xe6\xa0\x40\xd5\x89\x7c\xc6\x14\x0f\xda\x23\x6c\x45\x6d\xf4\xf0\xde\xfa\x12\xdb\xb5\x2e\x96\x70\x23\xe8\xe0\xcc\xa7\x97\x17\x1b\x08\xe1\x77\xe2\x72\x33\xaa\xd5\x78\x1a\x15\x65\x54\xad\xdc\x46\xa9\x33\x66\x37\x88\xe8\x20\xa0\x81\xce\x7b\xd5\x75\xbc\xb6\x36\xf4\x36\xa4\x53\x93\xaa\x53\x91\x90\x41\x4c\x06\x36\x19\xe0\xee\x4e\xc1\x0f\xad\x70\xe6\x16\xf6\x47\xd8\x1f\x69\x2f\x1b\x96\x60\xcc\xd4\xe9\x49\x19\xec\x13\x8c\x40\xa0\x7f\xcd\x15\x05\x35\x61\x0f\x10\xf4\x76\x2a\xba\xa6\xdd\xa0\x2f\xd9\x98\x5c\xcf\x39\x11\x50\xfa\xd5\xcf\xcc\xc9\x75\x97\xd4\x3a\x55\xd1\x73\x9d\x89\x76\x50\xdc\xe7\x84\x09\xdb\x67\x9d\xaa\xe4\x83\x03\xf9\xc3\x53\x56\x16\xbd\x8b\x2d\x8d\xce\xc4\x3a\xbd\x3e\xaf\x1a\x58\xa5\x9e\xd0\x44\x6e\x73\x03\x0a\x8f\x72\x76\x0e\x11\xaa\xd0\x26\x82\x18\x91\x8f\xb4\x1d\x8e\x78\x1e\xda\x16\x1f\xe3\x76\x78\x7d\x8e\x78\x7e\xc0\x1a\x92\xa3\x8e\x36\x6d\x59\x32\xa5\xa4\xc8\xe0\xf2\xa3\xb2\x07\x27\x92\x1e\x76\x24\xa7\xea\x92\xce\xe0\x88\xc7\x53\x48\x50\x2a\x27\xd5\xb7\xbb\x54\xbf\x5c\x45\xa9\x27\x25\xe6\xcd\xf8\x9e\x26\xfd\xa8\xdc\xfb\x56\xaf\x43\xe2\x5a\x6b\xd6\x7c\xe3\x5a\x99\xc8\x8d\x2e\x07\xb0\xfc\x8c\xd6\x91\x5c\xc9\x91\xc3\x15\xc5\xb0\x6c\xbe\xd4\x01\xc6\xd8\xda\xf2\xbd\xe7\x7c\xb0\x37\x4f\x88\x7c\xb7\x79\x25\x52\xd6\x4c\x1b\xc0\xd8\x73\x79\x8c\x5b\x7c\x8d\xdb\x27\x74\x35\x51\x71\x2f\x27\xc5\x7e\x6c\x27\x65\xa8\x5e\x2c\x66\x87\x43\x88\x31\xa9\x7a\xf1\x14\x65\x7b\x3d\x7b\xe3\xe2\x8d\x9b\x10\x0e\x6d\xda\xc9\x63\xd8\xc9\x47\xd8\x8a\x0c\x26\x5e\x04\xfc\x88\xa4\x47\x10\x92\xe4\x04\x32\xf0\x23\xba\x5a\x37\xe7\xb2\x0f\x43\x1d\xb6\xf2\xbd\x47\xb4\x2a\x7c\x50\x0f\x37\x3e\x55\x61\x9f\xfd\x38\x6c\x15\x0e\x6c\xeb\xa0\x8d\xda\x68\x1f\x93\x96\x02\xd2\x44\x9d\x7c\x78\xcd\xd0\x55\x52\x57\x62\x53\xf7\x34\x59\x10\xc6\xc0\xb9\xcf\x38\x74\x03\x3c\x0f\x16\xfe\x81\x01\xf4\xae\xb3\x07\xbc\xf8\xd9\x18\x53\xf4\xc5\x7a\x84\xab\xcf\x73\xe0\xa2\x98\x98\x7a\xa6\x28\xc7\x87\xae\x03\xc1\xda\x3d\x3c\xf4\x17\xe5\x3b\x06\x18\x77\x0c\x31\xee\x18\xa0\xbd\x7e\x23\xc8\x13\x39\xfb\x93\xbe\xa9\x2f\xfd\x17\x09\xfb\x0c\xaf\xc6\xc6\x77\xf1\xe4\x12\x72\x9d\x5c\x45\x36\x0d\x22\x0c\x3b\x77\x2a\x10\xf6\xd4\x8f\xce\x40\xdc\xa3\xee\x66\x76\xb7\xe7\x69\x38\x68\x86\x8a\x67\x55\x5c\xb4\xbb\x7b\x4b\x6a\xf2\xe8\xa4\x03\xd1\x70\x06\x24\x19\x20\xff\x98\x9d\x84\xb7\xa4\x0b\x91\xe2\x6d\x63\x0d\xb8\xb9\x96\xc7\xb5\x1f\x55\x0e\xdb\xba\x93\x7b\xce\x2a\x2d\x8e\x34\xc0\xf8\x24\x9a\x93\x15\x16\x5d\x2b\x2c\x7f\xe5\xd4\xeb\xdb\xe7\x91\xbd\xfd\x1d\xb5\x56\xe3\x4f\xf2\x9b\x6c\xed\x7e\x2b\x44\x99\x32\xbb\xfd\x96\x76\x32\x67\x3e\x64\x3b\xb8\xb6\x14\xc4\x52\xe9\x2c\x7a\xe3\x0a\x8f\x45\xc3\x85\x88\xe6\x44\x70\x1e\xec\xc0\x4d\x06\x86\x8e\x20\x86\x02\xd4\xef\x18\xd0\x55\xae\x0a\xb0\x27\xf9\xd9\x1f\xd8\x65\xa7\x9f\xb3\x74\xaf\x79\xb0\xde\x9f\xba\x85\xa2\xf4\x5a\x4c\x44\xba\x8f\x9a\x5c\xa7\x64\x4e\x13\x54\xdf\x35\x42\x95\x2b\x8f\x84\x25\x8c\x08\xa9\xfa\x5c\x64\xfb\x58\x64\x9f\x94\x28\xcd\xc9\x24\x84\x0d\xdf\x47\x06\xef\x44\x64\x11\xae\x2b\x88\xd2\x38\x6a\x4d\x9a\x3c\x61\x80\x51\x3f\x5e\x69\x6f\x97\x9c\x07\xae\xdb\x6e\xa3\x5b\xd8\x0c\xb7\xe6\x0c\xb7\x54\xd0\xd2\x86\x03\x00\x42\x33\x24\x2d\x77\x40\x05\x5a\xdf\x8a\x5d\x51\xea\xbe\xbc\x8b\x8c\x43\x57\xe0\xf9\x51\x13\x2e\x0e\x4d\x2b\x4d\xc1\x33\x94\x51\x01\x9c\xf0\xb2\x81\x60\x25\x0f\x1c\x28\x3a\x1c\x28\x9a\x6b\xf9\xbc\xea\x61\x8e\x20\xfe\x49\x83\xa6\x46\x83\x05\x4a\x33\x4f\x9d\x2f\xa1\x57\x84\xe8\xd5\x6c\xdc\xd0\xd7\xec\xb8\xae\xf6\x63\xd0\x6d\x17\x97\x9d\x07\xae\x3a\x6f\x6d\x73\x63\xf0\xcf\x94\x7f\xa8\xb3\x50\xce\xc2\x01\xc0\x41\xb2\x63\x84\x27\x27\x08\xe8\x40\x19\x53\xe9\xe6\xab\x1f\x2b\x50\x14\x4d\x17\x9b\x35\x0e\xf6\xb3\x5f\x57\xe4\x1c\x05\x85\x6b\xe6\xc2\x8b\x22\x66\xcc\xe4\xbd\xdc\xbe\xe8\xf0\xd6\xea\x22\xa4\xe8\xa2\x6b\x1a\xdd\xdd\xb8\xe0\xcf\x0b\xac\x65\x81\x83\xd0\x45\x82\xa0\x33\x2e\x0c\x40\xd8\x5e\xf9\x8a\x4d\xaf\xc7\x2d\xda\xb4\xd8\x6f\x87\x38\x6e\x07\xc2\x6f\x86\xd7\xdf\xe0\xbd\x26\x22\x64\x9f\x27\x45\x3f\x47\x42\x3f\x67\x12\xa1\x43\x74\xa7\x8c\x9b\x45\x6e\x6d\x70\x0e\x8d\xef\x29\x70\x43\x96\x3c\x60\xde\x9f\xef\xbe\x65\x36\x96\x46\x46\x5d\x10\x2c\x34\x2b\xd2\x98\x23\xec\xf9\x2b\x86\xac\x47\xf4\xea\x4e\xc6\xf8\x31\x48\xd4\x4a\xa0\x8d\x3a\xe4\xd3\x42\xe6\xdb\x40\xe6\xe8\x40\xe4\xe8\x40\x16\x41\x38\x89\x26\xa2\x73\xad\x3b\x76\x35\x06\xdc\xce\xdb\x22\x9d\xd0\x72\x3b\xa1\xc5\x70\xa0\x46\xee\x32\xf4\xc0\x77\x7f\x5a\xc8\x9d\x0a\xaf\x6c\x8d\x6d\xa2\x3c\x6b\xd5\x4a\x17\x29\xdd\x19\xa0\x31\xdc\xa5\x1d\x02\x4a\x1e\x63\x80\xfc\x33\x26\x3d\x21\x6a\xd9\x07\x8c\x6d\xa0\xb8\xbf\xea\x0b\xf5\xf2\x25\xbc\x00\x07\xaa\x79\xd8\x8f\xe1\x76\x97\x28\xf4\x55\xb7\x5f\xb1\x2f\x5a\xae\x27\x5a\xda\x72\x97\x4e\x97\x08\x9c\xad\x73\x93\x85\x0e\xa6\x25\xdb\xb6\x07\xae\x3b\x25\x24\xb2\x68\x86\x66\x9d\x07\x16\x26\xc4\xb2\xe2\xd0\x9b\xee\x44\xa7\xe4\xed\x2e\x1d\xb7\xbb\x7c\xd0\xed\x9e\xf9\x42\x1d\x3a\x63\xa6\x3a\xd0\xa6\x9e\xb7\x53\x3a\x6f\xfb\xcd\x7e\x8c\xb7\x5b\x35\x15\x20\x74\x55\xe5\xcb\xe3\xbc\x9d\x37\x64\x45\xe1\xf1\x95\x7b\xd3\x4e\x4d\xc3\xea\x11\x7d\x44\x58\x2c\x96\xa4\x56\xc2\xfa\x5a\x35\xf1\xab\xfe\x6b\xbd\x09\x30\x1b\x49\x0a\x31\xf3\x51\xbb\x78\xb3\x91\xeb\x30\xe6\x99\x58\x7c\x42\x97\xc9\x18\x5e\x99\xcf\x8b\xa7\x18\x0a\x0c\x40\x2e\x82\x90\x94\x64\xb7\x3b\x72\xfe\xa4\xc2\xfb\x94\x9f\x80\x77\x64\x81\x85\x64\x9d\x85\x6c\x5b\xda\x11\x1b\xd5\xd8\x91\x9a\x90\x71\x24\xc0\x47\xbf\xa8\x9e\x7f\x87\x32\x46\x7c\x5e\x40\x77\x79\x6f\x50\x98\x8b\xaa\xda\x10\x2d\xf7\xcf\xfa\xc0\x02\xee\xad\xc6\x21\xeb\xb3\x13\x29\x2b\xcb\xee\xb3\xbb\xa9\x7b\x4d\x3c\x7d\x48\xb9\x30\x28\xae\xbf\x83\x94\x99\xe2\x37\x43\x26\x5d\x18\x4e\xba\x8b\xcf\x82\xaa\xbb\x6f\x03\x14\x47\x70\x32\xc6\x70\x1c\xa1\x21\xbb\x53\x3a\x9f\x73\x3b\x6f\x36\xe9\x04\xa4\x26\xc3\xbd\x6a\x68\x1d\x3e\x64\x9a\x11\x9f\xe2\xe7\x6c\xcb\xf7\xf5\x3d\x4f\x9e\x94\xc1\x13\xe6\x8d\xb9\xd9\x6e\x27\xc7\x8d\xab\x6c\x3d\x03\x30\xe0\x27\xdd\x81\x73\x3b\x99\xbe\x5c\x18\x49\xcd\x7b\x41\xb1\x63\x53\x2d\xbd\xef\xbb\x01\xb3\x19\xf6\x1b\xc8\x58\x8c\xcb\x75\x69\xcf\x30\xe0\xe7\xdc\x24\xd9\x10\xce\x39\xc8\xfd\x79\x33\x3d\x41\xb6\xa5\x07\xc4\x80\xd2\xf0\x39\xff\x40\x95\xe4\xe4\x46\x98\x31\x57\xdc\x34\xa5\xb2\xfe\xac\xb3\xaa\x7d\xb1\x74\xa9\x63\x38\xd5\x26\x40\x77\xbf\x39\x22\xc4\x14\xcc\xf7\x3d\xd1\xa5\x56\xb5\xa8\x81\xf4\x0a\xa6\x19\x8e\x8b\x2b\xc9\xc2\xda\x92\xc7\xae\xe0\xb7\x39\x80\x77\x5f\xbd\x0d\x64\x9a\x4c\x7f\x17\xce\xf8\xa9\x52\x77\xf4\x9b\xae\xf8\x91\x53\x5e\x2a\xac\x0d\xb2\x64\xa2\xcf\x7d\xd5\x45\xc9\x10\xf7\x29\xb1\x2e\xcf\xf8\xb8\x1e\xc9\x25\x0f\x58\x77\xec\x43\x05\x15\x2c\x0f\xba\x2c\x97\x8c\xe9\xd8\x07\x2a\xcf\x3c\x78\xdc\x52\xf6\xed\x95\x22\xea\x02\xab\xf1\x97\x27\x27\xc9\x7d\x94\x5c\x00\x16\xfc\xdc\x9f\x09\x4c\x10\x1e\xca\x85\xa9\x99\xf4\x42\xa6\xed\xd3\x00\xa5\xef\x39\x18\x23\xf4\xa1\x6f\x19\x96\x53\x9c\xb1\x70\x08\x30\x78\xc9\x88\x7e\xca\xa8\x94\xa7\xf5\x48\x6c\x96\x61\x6b\x34\xca\x6f\xd6\xd0\x33\x87\xc4\x7e\xea\x8e\x98\x55\xfe\x89\xba\x84\x18\x40\x8c\xc4\x10\xf7\x47\x0a\x2e\x0c\xdf\x7e\xe6\x88\x0b\x1b\x46\x17\xf7\xe2\x30\x4c\x05\xb9\x80\x8a\xfa\x25\xfb\x5d\x56\x96\xbf\xea\x09\xc5\xec\x6a\x3f\x54\x81\xe6\x30\xab\xc5\x18\xe5\xbb\xea\x18\xe3\x81\x31\x37\x61\xb5\xcb\x68\xb5\x7b\x26\xfd\x94\x93\x29\x55\x18\x2b\x1c\x96\xe1\x6b\x48\xca\x4e\xf7\xa9\x3e\x4c\xfe\x43\x3f\x17\x2e\xb4\x46\xbd\xe2\x4c\x0e\x53\xcc\x6b\x55\x7d\xf3\x4b\x89\x79\xde\xa3\xbe\xe7\x7a\x56\xd2\x8e\xe0\x48\xdd\x97\x6a\xdf\xf9\x63\x24\x6b\xd0\x8c\x83\xe1\x2f\x4c\x19\xdf\x5d\x54\x76\x39\x9f\x3c\xbd\xf8\xa3\x7f\x67\x64\xb1\x19\x98\x92\xdd\x73\x15\x4d\x1b\x86\xc1\xbf\xf3\xce\xb4\xb6\x25\x6b\x0c\xc7\xe8\x77\x2a\xe3\x2f\x4f\xe6\x47\xb9\xda\x47\x58\xd7\x0c\x53\x5f\x78\x00\x62\xf2\xe8\x5b\xdf\xc0\x98\xf8\xb0\xef\x50\x69\x32\xd8\x50\x47\x6d\x7c\x91\x4b\xe6\xfc\xb4\x05\x27\x1a\x37\xfd\x5a\x72\x8c\x2c\xac\xf6\xea\xdc\x4b\xf6\x87\x77\xf2\x9a\xcb\x15\x25\x4a\x2c\x23\x6a\x87\xc7\x08\xeb\x37\xbf\x67\x4d\x1c\xf4\x88\xc4\x09\x93\xc2\x64\xca\x7b\xdf\xc9\x76\xf4\x1b\x1b\xbd\x5a\xbd\xfb\x33\xef\x66\x4a\x36\x39\xc6\xb9\xec\x37\x88\x89\x18\xf6\x73\xf6\xd1\xac\x48\x15\xe2\x57\xda\xe9\x21\xda\x70\x0c\x45\x72\x1e\x8c\xf8\x19\x77\x30\x03\x19\x3c\x7d\xbb\x30\xba\x9a\xb5\x8f\xa8\x67\x56\x76\xfb\xc1\xb7\x50\x8b\xc7\xf4\x52\x98\x9d\x8b\xac\x7e\xf7\xab\x98\xe8\x16\x3c\x6d\x19\x96\xd5\xd4\xdf\xf8\x9c\xe4\x22\xf6\xa0\x91\xb9\xb1\xf5\x8c\xc9\xdb\x59\x90\x41\xbf\xf6\xb9\xcb\x7d\x22\x57\x7c\x5f\xbd\x13\x62\x42\xb6\xaf\xfa\xf8\x4a\x8a\x21\x59\x98\xfc\x0f\xb9\x86\xb7\xdb\x9a\x4e\x7b\xe6\xc1\xb0\x9c\x25\xbb\x8f\x45\x55\xd0\xdf\xc6\xf5\x98\xb4\xed\x83\x63\xf8\x0b\xac\xf1\x89\xc5\xde\xb8\xed\x7b\xbc\x5c\xa7\x2d\x81\xef\x99\x68\xbb\x46\xc9\x98\x2e\xb4\x4c\x04\xe0\x3c\x64\xf1\x85\x23\xfb\xc4\xb1\x3e\x88\x5c\x7f\xb8\x0e\xc3\xdc\x55\x0c\xbc\xa6\xd3\x38\xb6\x3c\xc6\x83\xdf\xe3\x55\x76\x0b\x90\x62\x2a\x62\x66\x2e\xda\x21\x3f\x88\xbc\x1d\x88\x62\x60\x00\xa6\xfb\xd4\x11\xcb\xc1\x11\x40\xe7\x13\x9d\xa9\xe2\x93\x93\x4e\x5d\x78\x6e\xa2\xd1\xdf\xde\x68\x59\x9f\xb4\xea\x71\x98\xe2\x9a\xce\xe2\xf1\x66\x30\x37\x0b\xa5\x16\x67\x38\x67\x6c\x7d\xab\x73\xdf\x73\xca\x6b\xda\x81\xc8\xe5\x80\xdb\x13\x63\x38\xa6\xb6\x65\x1e\x05\xb1\xc7\xe6\xd7\x66\x13\x33\x45\x9d\xd6\x0d\xd5\x30\xdf\x66\x3b\x35\x46\xe8\x35\xcb\x73\x59\x3c\x0b\xe6\x72\x69\xb6\x3b\x06\x48\x69\x5e\x70\xcc\x2e\x85\x82\xcf\xf0\xf8\xe5\x5b\xcc\x71\xdc\x55\xbc\xef\x4f\x3a\x35\x98\xcc\x8e\xe4\x9e\x0d\x39\xe6\xb2\x63\x79\xb1\xe4\x59\x86\xdb\x5e\xb3\x30\xca\x53\x28\xbe\xdb\x31\x15\x87\x4c\x25\x21\x6a\x5c\xb4\x33\x45\x20\xe6\xc1\x32\x3e\x89\x8c\xe9\x62\x68\x1a\xd1\xb8\x4a\xd3\xb3\x27\xfb\xbd\x6e\x00\x12\x72\xbb\xdf\xc9\x93\x34\x0c\xfe\x49\xe9\x10\xf3\x60\xcc\xe3\xb6\xa9\x5b\x01\xe6\xf9\x21\xdd\x25\xe4\x21\xdc\x2e\xc5\xe7\x4e\x5a\xd2\x32\xaa\xcf\x83\xc6\x83\x71\x58\x67\x0f\x88\x79\xf0\x66\x2d\xad\x1a\x5a\x90\x0c\x18\xb7\x83\x92\x98\x5c\xcb\x6c\x9f\x3b\x8c\x1b\xbf\x11\xe4\x24\xd0\xc0\x93\x7e\x62\x7c\xcd\x60\xec\x2d\x17\x27\x7c\x21\x70\xa8\xd9\x53\x1f\x62\x86\x12\xfe\xf4\x31\x91\x3f\x72\xfe\xd8\x36\x50\x6c\x5b\x47\xeb\x62\xd3\x67\x42\xc5\xb3\x47\x27\x9e\x37\x40\x24\x08\x3a\xb1\xb8\x96\xf3\x51\xc8\xf9\xbe\x23\xbf\xea\x28\x82\xd3\x38\xb9\x75\xfa\x59\xe3\x31\x63\xf3\xbd\x17\xd9\x41\x92\xa0\x93\xd3\xc3\x57\xf3\x58\x99\x18\x72\x01\xfe\x5b\x58\xb5\xda\x3d\x44\x41\x0c\x3b\xdf\xfa\x41\x88\x79\x70\xd2\x71\xeb\xf4\xa2\xe3\x49\xd0\xba\x58\x97\xc4\xe4\x56\x2e\xf9\xc4\xdf\x6b\xaa\x87\x16\x28\x74\xa3\xc0\x88\x0c\xa2\x98\xb1\xb9\x87\xcc\x85\x0f\xc3\x50\x25\x13\xbd\xee\xf3\xeb\xbe\x38\x7d\xe7\x47\x13\x43\xd8\x70\xec\x83\x00\x88\x80\x7b\xf1\xc3\x5c\x2c\xd7\x13\x8c\xe2\x34\xe9\xcd\x86\x34\xa1\x67\x03\xee\xfb\x8e\xe7\xa1\xd4\xe3\xd4\x75\xe7\x14\x21\xb6\xac\x5d\x14\x86\x13\xd4\x89\xce\xb6\x02\xe0\x00\x50\x7d\x52\x7e\x29\xa4\xfc\xf7\xdd\xcd\xf3\x6d\xcf\x6f\x60\x3c\x0b\x19\xcb\x38\x1b\x7c\xe6\xc6\xf7\x9b\x2d\xd5\xd2\x2c\x97\x1c\x43\x19\x30\xd0\x40\xfa\x00\xeb\x83\xa7\x0c\x70\x3e\x3e\x67\x9e\xdb\x60\x60\x83\xf3\x06\x7a\xcd\xc7\x4b\x76\x1f\x33\xe8\x49\x88\x21\x3d\x54\x1d\x99\x24\x64\x76\x9b\xaf\x8c\x59\x37\x6e\xef\x5d\xad\x47\x74\x0d\x1a\xfc\xb0\xe6\x75\x42\x6b\xcd\x1a\x35\x7b\xf4\xcc\xd1\xf3\xaa\xb0\xe5\x2c\x59\x7c\x34\xc7\x0a\x3f\xd7\x85\xde\xaa\x94\x2f\xd3\xfb\xda\x0d\x71\xb4\x69\x64\x17\x93\x26\x31\x58\xfe\x08\x23\x08\x1d\x93\xc7\x63\x50\x7d\xde\x60\x02\x92\xd8\x3f\x63\x92\x51\xb3\x69\x81\xc9\xfb\x40\x61\xd7\xd4\x0c\x46\x2d\x17\x5f\xa3\xa1\x3c\x3b\xe2\xab\x87\x6f\x73\xa3\x76\xb8\xc8\x49\x94\xe7\xa0\xd4\x83\x32\xd0\x86\x86\x2d\xee\xc3\x4e\xd4\x28\xd1\x62\x99\x8b\x37\x41\x6f\xb1\x48\xdc\xe7\xe4\xf5\xb9\xee\x7d\xde\x0d\x47\x1a\xd6\x30\x7b\x11\x85\x7d\x0e\x1f\x32\xe7\xc7\x27\xe2\x1f\x7a\x7d\x06\x42\xdb\xca\xda\x6b\xb6\x3c\x5e\xcd\xe1\xd9\x61\x4b\x34\x46\x6d\xd4\xa6\xed\x24\xc7\x13\x1b\x4f\x78\xa1\x70\xe2\x0e\x65\xd7\x1d\x8b\xb8\x5c\x4d\x03\x05\xf6\x51\x74\x52\x9b\x35\x50\x9b\x49\xf1\x4b\x6e\xfe\xfe\x7d\xd9\x4b\x87\xe0\x46\x5c\x11\xd0\x87\x35\xf3\x8a\x04\x9e\x60\x3d\xa2\x47\xd4\xc6\xef\x0d\xfb\xeb\x33\x26\x97\xfd\xe6\xdc\xd4\x2a\xa6\xe4\x57\xbf\xfc\x9a\x39\x40\x94\x66\x40\x94\x06\x33\x88\x36\x62\xfd\x1e\x1e\xcf\xe7\xc1\x85\xb8\x6e\x3f\xa6\xdb\x79\x6b\x64\xdb\x5d\x34\xdb\x1d\x14\xfb\x41\x19\xda\x59\x48\xd0\x68\x6b\x7c\x08\x18\x0b\x03\x42\x5a\x51\xa0\x74\x11\xc0\x34\xea\x10\xa8\x49\x94\x44\xdb\x28\x43\x30\xe2\xc3\xb2\x06\xaa\x46\x08\xf1\xac\xae\x9a\x8c\xfe\xb0\xdf\x64\xec\x48\x85\xa8\x71\xdd\xe0\x2c\x2f\x38\x8c\x54\xeb\x10\xd1\xce\x74\xd3\x8e\x74\x52\x8e\x79\x52\x1c\xa9\x36\x9a\xe3\x62\x6e\xa4\x32\x8c\x71\xbb\x4e\x2b\xb1\x92\x2b\xf9\x1a\x2e\x72\xb4\x21\xfd\x2b\xba\xab\x3d\x2d\x3c\x22\x3f\x6a\x23\x24\x6b\x22\xc4\x6b\xa2\x36\xe9\xe9\x60\x12\xc8\x23\xe5\x4b\x4c\xcf\x3a\x0f\xce\xd0\x0c\x5d\xc8\x1c\x42\xda\x13\xc2\x80\xe9\x04\xaa\x75\x0b\x50\x94\xa1\x89\x27\x8a\xe9\xfa\x67\xef\xc7\xc8\x97\xce\xa6\x0e\x80\x82\xb5\xbb\x2b\x68\x6c\xd0\x67\x42\x9f\x4e\xca\xc9\x95\xb3\x5a\x63\xbd\x72\xd9\x6f\x76\xa5\xa0\x4e\x34\x69\xd9\x26\xd6\xc3\x90\xf8\x30\x9d\x2b\x0d\xe1\xb7\xba\x4a\x15\x73\xeb\x1e\x6d\x3f\x2b\xdc\xb3\x57\xb8\xd7\xbc\xbf\x3b\xc6\x7e\x07\x0c\x38\xdf\x36\x02\x80\x97\xd8\x6f\x96\xd8\x47\x17\x12\x78\x4a\xb4\xe1\xad\x64\xb4\x05\x9a\x46\xa3\x12\x52\xde\x80\xcb\xa7\x5e\xf8\x27\x2b\xf6\xd8\xb4\x78\x23\xbe\xbb\x5e\x33\xc4\xae\xc0\xba\xde\xd1\x71\x7a\x75\xa5\x48\x94\x46\xb3\x22\x21\xaa\x39\xbe\xee\x8f\xc2\x50\xd2\x22\xa8\xcf\x3c\xb1\xa1\x41\xb5\xa1\x41\x71\x71\xdd\x61\xc6\x65\x5f\x97\x33\x45\xb4\x88\x02\x0b\x92\xa0\x7b\x48\xb7\x99\xbb\x77\x95\x0e\x49\x34\x4a\xf2\x33\x97\x3e\x19\x6b\xd5\x15\xdc\x1f\x81\xd4\x13\xa2\xd8\x6b\x66\x22\xf1\x76\x2b\x9c\x8b\x5a\xcc\x13\x34\xbf\xf7\xa4\x4e\x3d\x21\x0d\xa7\x88\xa2\xc3\x71\x64\xe6\xce\xfd\xe1\x3e\x5b\x17\xf2\x70\xdf\x6f\x06\xdb\x1f\x14\x7b\x64\x8b\x9a\x82\xdb\x18\xa9\x66\xbd\x2b\x80\xe2\x92\x89\xd1\xc1\xfb\x1b\x42\x2e\xed\xb0\xac\xe8\xad\x8e\x59\x9e\x60\x3e\x67\xcf\x4b\x4d\x05\x2b\x78\xaa\xe4\x19\x42\x6c\x55\x62\x49\x89\xab\x2d\x29\x3f\x66\x5f\x15\x0e\xe4\x56\xf7\xbd\x32\x57\xcd\xbe\xd2\x88\x76\x77\x21\x78\x49\xbc\x85\xb4\x90\xd9\x81\x8f\xf6\x63\x9f\x1d\xcf\x5d\xb5\x9b\xee\x15\xf0\x47\x48\x9f\xc7\x39\xb9\x5a\xc8\x32\xc6\x0f\x3a\x25\x13\x3d\x9a\x6e\x82\xb7\x06\xc1\xe4\x2d\x24\x46\x85\xda\x74\x01\x4b\x30\xbd\x8b\x8c\xf9\xee\x74\xb8\xe2\x05\xc1\x88\x4c\xe3\x13\x08\x3b\x72\xf0\xc6\x32\x38\x71\x02\x0e\xb7\xfb\x13\xd5\xa0\x62\xc7\x11\x94\x40\xa8\x7b\x1f\x8b\x1e\xec\x04\x9e\x46\xa6\xe7\x8d\x67\x66\x38\xba\x78\xa2\x45\xd0\xe9\xec\x3c\x7b\xe3\x39\x11\x8c\x04\x8a\x10\x7a\x56\xcf\xbe\x75\x86\xb3\x27\xd7\xa7\xd2\x93\x12\x94\xc0\x0d\x0d\xa2\x4e\xef\x2b\x1b\x0f\xa2\x44\x27\x7f\xab\x73\x65\xae\xc2\x1a\x4d\xcc\xd3\x88\xc9\xb5\x20\xc3\xfa\x82\xd6\x6f\xdf\x35\xc0\xc5\xb5\xa5\xa0\x4a\x73\xd3\xf3\x76\x1a\x9e\x96\xb8\x9d\x33\x10\x87\x3f\x22\x33\x22\x73\xf6\x63\x38\xa8\xbc\xf1\x1a\xdf\x6b\x07\x6b\xbc\xc9\xa3\xf9\x72\xa6\x99\xcc\xb6\xf3\x02\x84\xf1\xd5\xe4\xdb\xac\xb8\x6d\xad\x13\xcf\xa3\x47\xca\x75\x99\x6e\x9f\xb5\xb5\xf4\xc5\x80\xbc\xa3\xa2\x83\x3f\xdd\x8d\x22\x24\xee\x66\x8c\x5e\x14\xa8\xcd\x81\xa8\xb5\x54\x4a\x48\xda\xda\xb2\xde\x50\x26\xa5\x5b\x12\x40\xe9\x7c\x89\xec\x99\xa4\xe5\xc9\x83\xd4\xd7\xc9\x9b\xa8\xcd\x38\xcb\x8d\x08\x64\x85\x64\xc2\xe9\x92\x1a\xe8\xf5\x18\xa7\xe9\x4a\x06\xa1\x1a\x8c\x83\x32\x24\xd3\x9d\x5e\x56\x5f\x6d\xba\x1b\x54\x06\xdc\xf7\xfe\x5a\xac\x0e\x4d\x40\x69\x80\x4c\x54\xb4\xb6\xf2\x09\x06\xe8\x78\x52\xbc\xc8\x9d\xe8\xa0\xa7\xdd\x3d\xf4\x85\x35\x81\xf3\x19\xc8\x74\x10\xd4\xfb\xf4\x76\xef\x09\x0d\x92\x8e\xaa\x89\xda\x68\x0e\x54\x0a\x50\x0f\x20\xf0\x9a\x27\x72\x73\x84\x1d\xb8\xdd\xad\x76\x19\xe2\x3b\x94\xda\xab\x4b\xc0\x7e\x87\x82\x45\x91\xfa\x2a\x7e\x37\x1a\x46\xfc\xa8\x65\x0c\x03\x65\x81\xdf\x75\xcd\xb2\xef\x73\x0d\x3e\xb9\x09\x02\x1e\xa3\x47\xe0\xe1\x8c\x0e\x9e\xa2\x53\x11\x78\xd6\xb6\xac\x05\x41\x77\x6e\xcf\xb3\xbe\xaa\xbb\x2b\xa1\xe5\x23\x8a\xe3\x75\xbc\xd2\x4e\xea\x0a\x56\x60\xd7\x25\x95\x2c\x70\xa9\x8b\xce\x40\xe1\xed\x91\x61\x62\xbe\x38\xe7\x79\xb8\x17\x1c\xd1\x36\x5d\xb8\x5c\xd2\x6f\xb5\xd9\xf4\x37\x5d\x68\xda\xbc\xc8\x61\xc2\xde\x35\xe4\xe6\x7b\x42\x9e\x2d\xba\x76\x45\xb4\x3a\x1c\xea\x59\x41\x39\x12\x4d\x73\xbd\x3b\xab\x83\x16\x90\x0e\x82\x1e\x28\xd3\x0c\x50\xa6\x39\x57\xde\x9a\x7d\x35\x7e\x4a\x78\xa6\xb9\xd3\x9c\x30\x98\xce\xaf\x86\x0f\xa0\x4b\xe2\xaa\x3e\x21\xb2\xa1\x71\x87\x30\x8c\x6a\xe5\x23\x3d\x7d\xb3\x6a\x3e\x67\x0d\x51\x84\xe9\x22\x00\xf1\x29\x07\x2f\x67\x64\x9d\x6e\x65\xa0\xa4\xdc\xb8\x48\x74\x65\xef\x1a\xdc\xbc\x72\xfb\x96\x2c\x06\xcc\x92\x78\x7d\x2c\xdc\xc5\x8a\x27\x3f\xf2\xa2\xdc\x83\x09\x3a\xbe\x56\x58\xe1\xdc\xe3\xcd\x85\x35\x9b\x8a\x00\x30\x9f\x13\x61\xbf\xa5\xf3\xd9\xba\x47\x01\xa6\x47\xd7\x8f\xfa\xbd\xb5\xdb\x8b\x6a\x7c\xd4\x70\x89\x2b\x27\x21\x99\x26\x94\xa4\x5b\xaa\x93\x6d\x53\x98\x6a\xac\x7c\xa2\xe2\xe9\x38\xe1\x1c\xa8\xbe\xa9\x92\xf6\x09\xd1\x5b\x0c\x6c\xab\xa1\x95\xa9\xc0\xfa\x95\xc0\x70\xe5\x74\x24\x24\x08\x37\x53\x8d\xe9\xc2\xb0\x4f\xd9\xbe\xd2\xe4\x26\xde\x2b\x88\x28\x34\xe7\x4e\x99\x55\x18\xb4\xc3\x48\x8c\x69\x51\xe0\x8e\x61\xb0\xdc\xf1\xe9\x3f\x9c\x12\xb7\x51\x87\xd3\x3e\x08\xe4\x28\xfb\xb4\x6f\x7c\x6c\x3f\x56\x25\xa1\xdb\x43\xb7\xfb\xb1\x6e\xdb\x58\x0b\x41\x91\x02\x88\x1d\xc3\x52\x5d\x44\x63\xd2\x08\x2c\x3e\x95\xaf\xd6\x25\x5a\xb6\xad\xeb\xaa\x67\x39\xc4\x37\xab\x78\xf5\x88\xdb\x06\x0a\xad\x07\xe7\x68\xa9\x06\x9a\x72\x0c\x04\x71\xbb\x88\x80\x6a\x1a\x7d\xd8\x7c\xeb\x9b\x4b\x51\x01\x03\x80\xca\xbb\x0e\x81\x87\xc4\xf2\x97\xf9\xd5\x6e\x69\xcb\xb6\xf9\x01\x00\x8a\xdd\xed\xe1\x02\xb7\xbb\x44\xae\x88\x21\xb4\x16\x92\x76\x93\xc5\xfa\xb9\xd7\x0d\xcd\x8c\x24\xf7\x4b\x78\x9f\x0a\x5e\xee\x72\x18\xf2\x8a\x20\x2f\x8a\x59\x30\x78\x6d\x7c\xf9\xfc\x19\x2d\x6b\xd4\x63\x66\x39\x7f\xcb\x41\x3c\x87\x14\x06\x82\x76\xb9\x21\x5a\xf9\x32\x0e\x6a\xcd\x06\x45\x5a\x34\xcb\xc5\x62\x4c\x07\xbf\x68\xf9\x04\x16\x59\x48\xa5\x86\xc8\x9f\x3d\xe5\x56\x90\x79\x94\xd7\x12\x24\x11\x1f\xa1\x16\xe5\x58\x1b\x21\xc1\x60\xed\x4e\x02\xd0\xbc\x6e\xaf\x3e\xbe\x6e\x92\x10\x9e\xb6\x35\x50\xf7\x5e\xb2\xf4\x8b\x7b\xb9\x7d\xfa\xe8\x81\xb7\x67\x16\x03\x14\x30\x0c\xa6\xfc\x6a\xaa\x6a\x24\xd1\x0e\x38\x9b\x87\x7b\x44\x45\x3a\xb0\x4d\x44\x10\x74\x38\x1c\x89\xb6\xeb\x95\x65\xad\x9f\xdb\xd4\xb5\x70\xe2\xd8\xa1\x33\x15\x8c\x68\x47\x92\xbe\x75\x46\xff\x8a\xe7\x2a\x9d\x9a\x45\x98\x96\x10\xa3\x01\xa9\x9e\xcf\xc7\xb3\xe1\x6c\xee\xf2\x2d\xb5\x4b\x83\x0a\x80\x20\x9d\x83\x40\x8c\xaa\xb8\xa5\x74\x83\xe6\xb8\x8d\xb8\x6d\xe8\x10\x9b\x8f\x1b\x3f\x03\x72\xe0\x10\xd9\x81\xc7\x68\xb1\xb4\x89\x0e\x99\xcd\x63\x6c\xfc\x89\xe6\xb3\x7c\xf3\xc9\xe5\x3a\x79\x89\xc3\x27\xe0\x48\xea\x03\x41\xc5\x5e\x20\xd7\x61\xbb\x73\x8f\x41\xbf\x4f\x04\x87\x83\xa4\xb2\x13\x6b\xa9\x71\x04\x11\x5d\xbf\xcd\xc2\x97\x9b\x03\xd1\x60\xba\x81\x00\x0e\xde\x85\x7e\xc6\x64\x1b\x8e\x7d\x51\x4c\xa6\xa4\xe8\x33\x7e\x68\xad\x1d\x7b\xd5\x90\x8d\xcc\x4e\xc1\x3c\x57\xef\x52\x3d\xa2\x3c\xa7\x68\x04\x54\x4f\xaa\xad\x05\xe3\xfa\x44\x10\x6c\xde\x36\x5a\xf5\xe1\x1a\xd7\x6d\xe7\x81\x23\x21\x4d\x53\x95\x46\xe9\xbd\x6a\x9a\xce\xc7\x5e\x80\xe5\x05\x11\x24\xb1\xec\xba\x4d\x96\x7b\x55\x20\xbf\x84\xfc\x33\xda\xfc\x09\x9f\x95\xe2\x56\xcf\x24\x01\x6c\x6d\x5e\x14\xb4\x30\x2e\x99\xa4\xb4\xb1\xdf\x0d\x27\xfc\x44\x49\x24\x1d\x6d\xe9\xb4\x23\x15\x11\xcf\x0a\xa3\x35\xf8\x8e\x0d\x36\x34\x76\x6a\xf3\xf2\x9d\x96\x1d\x2f\xdc\x67\xac\x31\x26\x5f\x41\xc0\xbc\x81\x8c\xe9\x5e\x95\x3a\x24\x74\x74\x23\x99\xc2\xea\x06\x22\x3d\x54\x69\xdd\x11\xe0\xc5\x6b\xb0\xcb\xc3\x05\x81\x4d\x1f\x94\xb1\xc7\xab\x0d\x94\x85\x91\x0e\x6c\xee\xe1\x42\xda\x3d\xa6\xa9\x65\x98\x9c\x31\xed\x2d\x68\x59\x5e\x7d\x39\x56\xba\x6a\xcb\xe6\x17\x66\xfb\x46\x87\x3f\x5e\xee\x5d\x80\x1b\x69\x40\xb5\x2d\x5f\xa4\x5d\x49\x3b\x99\x3f\x01\xc8\xb0\xc3\xb6\xea\x1a\xeb\xc1\x59\x72\x42\x9e\xb8\xf7\x40\x97\xab\xd7\x57\x25\xbe\xac\xa8\x5a\x21\xa7\x3f\x11\xbd\x72\x00\xe0\x46\x74\x1d\xda\x20\x69\x27\x2b\xd5\x55\xaa\xa5\x5a\x01\x28\xb5\x05\xeb\x1e\xd1\x22\x0f\x33\xe9\xdb\x37\x7f\x67\x94\x99\xde\x16\x03\x04\x9b\xe9\x69\xe1\xb6\x00\x57\x66\x81\xd3\x34\x4d\xdc\x61\x60\x8d\x84\xfd\x92\x1a\x9d\xec\x76\x1a\x35\x72\x97\x21\x9e\xfc\x24\x09\x82\xdc\x6b\x86\xc4\xe4\x2a\x21\x9c\xb2\x04\xcc\x8b\x31\xea\x63\xa1\xba\x84\x93\x7c\xde\xee\x18\xad\xa4\x39\x76\xb0\x07\xcb\xa3\xda\x03\xa2\x00\xdb\x7a\xef\x7b\x19\x66\x20\xc0\xde\x0f\x5e\x4e\x6d\x29\xd5\x83\x88\x54\x81\xa6\x0f\xfa\x1e\x67\x7b\x5d\xdf\x3a\xfd\x9c\x2b\xa9\x20\xb9\xca\x8a\x11\x1a\x6c\xf8\xe8\xea\x5c\xa4\x27\x05\x7a\x42\x15\x9a\xdc\x7c\x09\x1d\x26\x14\x9a\xd8\xa5\xc1\x04\xbe\x87\x80\xa1\xc0\xe4\x6d\xbf\xd9\x17\x04\x80\xd6\xe3\x46\x77\x41\xc5\xa7\x00\x53\x4a\xef\x52\x71\x0f\x08\x0e\x3c\x01\x1e\xe2\x17\xad\x33\x1f\xbc\x8c\xde\x81\x2b\x3e\x37\x96\xa7\xe5\xde\x96\x94\xf4\xb6\xc0\xfa\x4c\x0a\xf4\x74\xed\x47\xe5\x2e\x8a\xe8\x0c\x29\xa7\xee\x78\x65\x25\x4c\x74\x0a\x82\x3a\x8f\x60\x65\x70\x5a\xf6\xbd\x45\x8c\x8b\x23\x5a\x48\xe6\x30\x23\x77\x05\x40\xe2\x5d\x1e\x5e\xb8\x4b\x84\x4e\x76\x0d\x39\x3d\x6b\x6f\x52\xc1\x0a\x18\x96\x6d\x1d\x2e\xd1\xc5\xd3\x2a\x33\x15\x79\xfe\x84\x42\xb1\xc2\x75\x05\x3d\x85\x88\x97\x69\x62\x13\xc4\xc7\x2e\x39\x71\xe8\x33\x1a\x3b\x69\x45\x51\xe4\x2e\x2c\xe4\x43\x57\x36\x8f\xda\xa6\x41\x7d\x78\xf5\xf2\xe7\x1b\x1d\xe3\xa3\xe7\xbc\x30\x51\x30\x82\xe8\xe0\x65\x79\xe6\x8c\x59\xdd\xe4\x47\x9e\x69\x9a\x06\xef\xa0\xe8\xdc\xea\x79\x39\xd2\xee\x92\x82\x80\x5b\x5d\x2a\x49\xf0\x4f\x01\xa6\x36\xa3\x73\xee\x27\x15\x27\x67\xe2\x70\xed\x75\x80\xf3\x61\xf1\x01\x3a\x5e\x5b\x7b\xc7\x06\x2f\x54\xe5\x18\xcd\x56\xbc\xb6\x2a\xfe\x86\x22\x04\xf4\x2e\x0f\x57\xd6\x8a\xb1\x89\xeb\x36\x10\x9e\x4f\xdd\x39\x24\xd1\x08\x64\x9c\xae\x26\xb1\xcb\xb9\xd5\x6d\x64\x2f\xef\xd8\x7e\x15\x2b\x88\x18\x8e\xf0\x0c\xae\x86\x01\x0e\xf2\x83\x6a\x2e\xca\xd3\xee\xdc\xb1\x59\x37\x00\xf5\x23\x77\x0d\x14\x81\x94\xdb\x44\x83\x4f\x2b\x8b\x5b\xf6\x72\x51\xc0\xcf\x18\xe2\xaa\x3e\x17\x79\x12\x3f\x6d\xe3\x72\x24\xcb\x81\x6d\x9d\xda\x70\x63\x78\x77\x15\xbb\x1d\xee\xe4\x01\x49\x46\x85\x39\x3b\x93\x45\xd1\x6d\x18\x2a\xd1\x00\x05\x29\x13\x4d\x68\x32\x4b\xe9\x35\xb3\x2c\xcd\xb2\x8d\x71\xd9\x7b\xe4\x61\x8b\x3e\x40\x11\x01\x83\xbd\x68\xc8\xc5\x67\xfc\xa4\x9b\x40\x6e\x0a\x01\xd0\xaf\x59\xb2\xb1\xe1\x3b\x9a\xf5\xaf\xfa\xba\x46\x4e\xcf\xd9\x48\xd4\xe2\xfd\xcd\x30\x14\xde\x8b\xdb\xbb\xb0\x38\x52\x7c\x8f\x40\x6a\xe7\xf4\xd7\x24\x08\x49\x3d\xd7\x7b\x92\x94\x1e\x67\xf9\x1a\xc1\x19\xdb\xb5\x58\x4f\x19\x97\x8c\xc6\xad\x40\xdd\x19\xc4\x91\x5a\xf9\xc8\x50\x72\x99\xb4\x8c\x63\xfa\x47\xf8\x31\x93\xea\x16\x42\x2d\xd6\xb0\xbb\xb4\xef\x27\x02\x85\x84\x50\xa2\x9d\x4c\x50\xda\xe5\xa6\x82\x05\x90\x03\xb4\x37\xc2\x3e\x84\xad\x7d\xc4\x4b\xd1\x4b\xae\xa7\xd9\x3d\xa9\xc9\x2c\xb1\x78\x0a\x88\x57\x5e\xe7\x40\xf5\x6c\x38\xf4\x7e\x6a\x2d\x61\x23\xf0\xe2\x30\x39\x47\x09\xeb\x4d\x78\xaf\x17\x0c\xce\x9b\xbb\x9e\x74\xe0\xf3\x22\x34\x31\x5c\x3f\x43\x03\x5b\xfc\x33\x3c\x05\x4c\x98\xd0\xe9\xa8\x11\x84\xa0\x2b\x07\x4f\xe5\x10\xbe\x6e\x05\x0a\x00\xb8\xe2\x3c\x90\x46\x28\x35\x79\x5c\x8a\xa2\xc8\x10\x5a\xa9\x67\xe9\x04\x6e\x71\xa2\x9f\x50\xce\xd3\x3a\x2b\x7d\xd6\x23\xce\x84\x53\x22\x5b\x91\xa8\x8d\x2a\x73\x96\xb8\x1b\x0d\x46\xf8\xe2\xc3\xee\x98\x55\x94\xb8\x8c\x9e\xda\x8c\x7b\xb2\x62\x21\x10\x48\x08\x49\x4e\xcf\xbb\x76\xe6\xa2\x51\x9a\xd0\xe6\x91\x20\x25\x19\x49\x88\x28\xae\xc1\x2f\x40\x26\x3a\x10\xa4\x5f\xee\x27\xe3\x73\xfc\x77\x3f\x06\xa6\x18\x0a\xae\xfb\x98\x08\xdc\xb3\xd4\xee\x09\xf2\xcc\x51\x94\x40\x4d\x0a\xe3\x2f\x61\xa2\x1d\xcf\x6d\x3c\xa0\x8a\xc7\x53\x24\x4c\x60\x18\xce\xdd\x86\xd6\x45\x89\x65\x9c\x0b\x68\x3c\xcd\x27\x38\xd2\xf9\x45\x81\x3b\x1e\x42\x7d\xed\x1e\x22\xc6\x8d\x0d\x25\xf9\xdb\x8e\xd3\xe4\x62\x5b\xe6\x3a\xb2\xe2\x73\xda\xd8\x0e\xab\x22\x23\xd1\x72\xdd\x5d\xa0\x04\x76\xf0\xe4\x65\xcb\x37\xfd\x2e\xed\x90\xbf\x09\xbb\x32\x4f\xea\x34\x81\xab\xbe\xf5\xa6\x26\x28\xf6\x03\x00\x68\x1c\xc1\x04\xee\xd5\x13\x3a\x0b\x4a\x22\x97\xfa\x72\xf9\xbe\x9b\xbd\xdd\x1b\x00\x5b\x1d\x89\x50\x6a\x8e\xf5\x0f\x9a\xa2\xc8\xcb\x7e\x31\x5b\x69\xa8\xfa\x25\xeb\x45\x72\xda\x82\x58\x3a\x1e\x82\x05\xf8\x8f\x41\xa6\x76\x00\x41\xa1\x30\x2d\x5d\xd8\x0a\xd7\xab\x48\xf3\x66\xef\xa7\xba\xc0\xd9\xd0\x32\x29\xbb\xce\xf6\x97\xcb\xa7\xce\x4b\x0a\x6e\x73\xa0\x30\x43\xd3\x55\x7d\x75\x69\xb3\x40\xdc\x99\x3a\xac\x81\x9b\x73\xd9\xb5\x1d\x3d\x4f\x78\xd4\xcc\x42\x01\xf1\x56\xe2\x6e\x37\x9e\xa6\x41\xd1\x75\x65\x96\x48\x06\x38\x06\x0a\x4d\x81\x95\x67\x29\x20\x24\x8a\x87\x8f\x3a\x6c\x98\x94\xfb\x36\xce\xf1\x12\x96\xf2\x6c\xb6\x5b\x94\x7a\xcd\x80\x60\x25\xaf\x7c\xbe\x46\x95\xcf\x79\x2d\xbe\x9c\x10\x06\xa1\x50\x5f\xa0\x2b\xba\x25\x5e\xa7\xa5\xa2\x08\x49\x76\x3d\x7a\xc4\x4a\x2c\x19\xe5\x27\xa7\xdb\x7b\x37\x5e\x3a\xde\x16\xa2\xfd\xaf\xf0\x62\x68\x7a\x97\xec\x0b\xba\x5c\x63\xef\x7a\xc7\xfa\x03\xed\x0c\x54\x9b\xfc\x58\xc4\xae\x3c\x92\x0f\x5e\x53\x18\xdd\x49\xdc\x8c\x86\x80\x93\x95\x88\xfb\x59\x66\x00\x96\xbf\xf2\xcf\x80\x07\x8b\x22\xeb\x35\x76\x6c\xb8\xee\xde\x41\xd7\x6b\x07\x51\xcd\x45\x62\xee\xcf\x6f\xfb\x11\x46\xa5\xc9\x1c\xa0\x81\x3b\x95\xdf\x61\xbd\x4a\x48\xf2\x74\x62\xde\x3c\x38\x48\xdc\xa6\xfb\xb2\xe2\xc0\x75\x0a\x7d\xa1\x22\xfc\x66\x20\x10\x00\xeb\xee\xd8\x65\x8b\x6c\xb7\x61\x67\x54\xd9\xa2\xe9\xe6\xc4\x09\x59\x70\x56\x4f\x3d\xb9\xb2\xe4\x3f\xe6\x69\x9e\xd9\xc8\x81\xcc\x87\x31\x6e\x71\x37\x2e\x72\x5f\xc1\x43\x5f\x60\xd3\x9d\x53\xa4\xfa\x76\xd7\x76\x02\xde\xa1\x0a\xed\x9d\x67\xaa\x41\x74\x86\xd0\x5e\x2a\xcc\x3b\xae\xda\xe3\x7c\x97\x36\x15\xce\x07\xc8\x05\x52\xe3\xea\x9f\x48\x54\x0a\x2c\xdf\x2f\xea\x7b\xfd\x64\x00\xcd\x67\x4b\x80\xea\xb5\xc0\xb2\xdd\x55\xd5\xb4\x67\xb0\xcc\x99\xa5\x0f\xe4\xdb\x4e\x10\x1d\xc8\x7c\x5b\xd0\xec\x99\x8a\x6c\x1d\xce\x72\x3d\x67\x75\x3b\x0c\xcf\x75\x40\x8d\xab\x12\xb4\xb4\x3e\x42\x48\xa0\x00\x46\xcd\x73\xe1\xdb\xce\xea\xba\x73\xc5\x45\x26\xac\x6e\x88\xf3\x6e\x40\xb2\x29\x91\x23\x66\x52\xba\xca\xf4\x05\xc1\x5e\x03\x51\xac\x71\xa5\x35\xc1\x20\x49\xb6\x6b\xe3\x14\xe2\x4e\xb9\x02\x11\xef\x80\x36\x24\x08\xb8\xc5\x3a\xd8\x93\x00\x95\x88\x6c\x99\x5e\xf7\x15\xf6\x95\xa7\xe3\x8d\x9b\x43\x44\xfb\xae\x2f\xd0\xda\x40\xf1\x1d\xca\x1b\x08\xcb\xc5\xea\x16\xc7\x61\xcb\x56\x6f\x7b\x32\xd9\x7e\x8d\x1d\x10\x6c\x38\x10\xad\x9e\x14\xf8\xe2\x1e\x10\xc7\xda\x1d\x5b\x04\x7d\x8d\x65\x28\x88\x8f\x40\x37\xc4\xae\xb7\x9a\x6e\xae\x6f\xd3\x82\x43\x14\x42\x9d\xf6\xb5\xfc\xcc\x81\xc6\xd1\xcf\xc4\x36\x61\xb3\xa7\xd6\xe5\xb1\x78\xe3\x8a\x24\x09\xac\x8e\x4f\x24\xef\xd0\x67\x63\x27\x93\x59\xe8\x42\x5a\x14\x08\x9e\x02\x59\xfc\x32\x61\x8e\x0e\x6d\xe1\x0f\x5a\xd8\xca\x75\xf1\x10\x58\xdb\x6f\xe4\xdc\xf5\x84\xd7\xcb\xe8\x6a\x3d\x20\xd1\x19\x86\x6a\x46\x97\x29\xca\x45\xf6\x91\xf1\xa9\xb0\x2d\x84\xca\x95\xa3\xa7\x0a\x65\xe1\x08\x45\x00\xd1\x9a\x9d\xe9\xc1\xb6\xa2\x6a\x77\xad\xfa\x58\xbf\x97\x44\x70\x9c\xc1\xd4\x40\x83\xe2\x0c\x18\x58\xc0\x38\x9e\xbb\x5e\x64\x05\xcd\x9e\x06\xa2\x89\xb2\x4d\x1d\xb6\xf2\xba\xf9\xc1\x69\x1f\x00\x38\xce\xf7\x7e\x20\xd6\x11\x26\xf0\xe8\x4c\x9a\x2b\x77\x2d\xc7\x89\xce\x54\xe1\x63\x76\x2d\x36\x85\x44\x41\xd0\x18\x92\x10\xb1\xc2\x28\x7f\xcd\xac\xe9\xf5\x99\x37\x87\x35\xe4\xd7\xba\xdf\x36\x32\xf5\x11\x80\x72\x3d\xcd\xc1\x40\xdd\x41\x55\x2f\x4e\xbc\x06\xcf\x73\x7f\x3c\x26\x6f\x82\x81\xe4\x81\x97\x11\xbb\xd3\x3d\xa9\x77\x24\xb9\x9e\xc0\x05\xd9\xb2\x38\x57\xef\xab\x0d\x83\x94\xd9\xf1\x54\x34\xf3\x0f\xfc\x6a\x75\x16\x55\x54\x26\x56\xa0\x64\x36\x93\x3a\xcf\xf7\x14\x9d\x1b\xb5\x54\x85\x73\xe7\x0c\xc7\x3c\x29\x2f\x9f\x37\xee\x35\x82\x80\xe0\x4e\xf8\x59\xec\xd7\xd4\x78\xeb\x9c\xe6\xa8\x7c\x34\xd1\xba\x5b\xbb\x43\x9c\xf0\xed\xbb\x84\x1b\x5b\xe4\xdd\x40\x16\xa0\x5f\x80\x44\x20\x41\xd7\xe8\x44\xd9\x14\x04\xcf\x36\x73\xaa\xec\xa1\x26\x5e\x3c\x15\x1b\x4a\x76\xdb\x34\x25\x79\xdc\xe2\x13\x45\x15\x23\x9e\x07\x8f\x44\x6b\xcf\x70\xbb\x7a\xaa\xdf\x0d\xb1\xc9\x67\xe3\xbe\x2f\x9b\xb7\x14\x6e\xb5\xd8\x28\x72\xc0\x89\x36\xc2\xe9\x6c\xab\xd8\x34\xae\xc3\xec\x77\xe8\xd4\xc0\x64\xb6\x02\x79\x27\x9f\x10\x10\xae\x13\x9c\x0f\x42\xfd\xff\x51\x75\x1d\x6b\xae\x22\xcd\xf2\x81\x58\x14\x1e\x6a\x29\x09\x09\x6f\x84\x87\x1d\xde\x7b\xcf\xd3\xdf\xaf\xcf\x3f\xa7\x67\xee\xba\xf5\xa9\x1b\xaa\x32\x33\x22\x33\x32\xfa\x0c\xd7\x5d\xef\xf9\x0e\xa7\x69\xd9\x96\xbf\x3d\x22\xcd\xab\x3b\x02\xb8\x6b\xb9\x3e\x62\x3a\x12\x24\x3a\x77\x00\x70\xae\x19\xf2\x6e\x2e\x50\x90\xd2\x77\x20\xfa\xeb\xb2\xf2\x7f\xf4\xc5\xdc\x43\x80\x4c\xb4\x79\x2b\x19\xbe\x2d\x73\xc8\x10\xc0\x40\xfa\x1d\x70\xd7\x07\xf7\x1e\xc7\x47\x4a\x1c\x82\xe8\xfd\xfe\xbb\xf8\x4a\x79\x24\x82\x5e\xef\x0c\xc8\x57\x1a\xdb\xf9\x13\x5f\xe7\x08\x83\x34\x9b\xf8\x34\x52\x4f\x9c\x68\x89\xbd\x84\x66\xad\x53\xb8\xd5\x40\xc8\xd7\xc2\x02\x0f\xb3\x1a\xeb\x73\x0d\x95\x78\x19\xb0\x5e\xd7\xed\x05\x39\x69\x9b\x95\xf7\xa9\xda\xb2\x1b\x6d\x38\x11\xa3\xab\x5c\x4f\xd3\x18\xb9\xd8\xb9\x09\x07\x19\xac\xcc\x9e\x32\x08\xd8\xa9\x9a\x61\x18\x06\x1d\x96\x1d\xee\x31\x2e\x55\x4e\x2f\x5d\xdf\xe6\xa9\x57\xe9\x37\x02\xfe\x7a\x4d\x67\x99\xde\x35\xeb\x15\x28\x5f\x38\xf9\xfb\x98\xff\x8c\x3d\xfe\x77\x26\x8f\xfd\x07\x03\xa5\x08\x13\x0d\x6c\xfd\xfd\x98\x7e\x3b\x61\xa9\xfb\xec\x53\x06\x85\x8a\x1d\x33\x3d\x86\xed\x37\x5b\xf4\x46\x7f\xaf\xed\xa2\x8d\x08\xc8\x3b\xb8\x33\xa4\x00\x11\x22\xdf\x89\x09\xf3\xa6\x63\x90\x5f\x85\xb2\x2d\x7c\xb4\xba\xdd\x26\xab\xb6\x83\x6a\x43\xfc\x82\xd4\x28\x8f\xfe\x4c\x0e\x19\x61\x7e\x7d\x94\x5f\x5f\x24\xbb\xcb\x72\x45\xee\x71\x1c\x53\x48\xd2\x2b\xf7\x97\xd0\xef\x1b\x23\x32\x86\xb0\x50\x5f\x99\x6f\x04\xef\x56\x2c\x44\x76\x35\xec\x35\x3e\x6c\xe2\xc7\x6a\x15\xd0\xc8\xb0\x97\xc5\xee\x0d\x25\xd9\xec\xf7\x60\x75\x2e\xc2\x92\xc5\xbd\x6a\x34\xe7\xf8\x12\x7d\xfe\xce\x93\x58\x71\x85\xc8\x01\x50\x98\xfb\x8a\x81\x53\xe4\xa6\xd3\x25\xf3\x05\x03\xcc\xc7\x6f\x24\x48\x5b\xbc\x91\x69\x0a\xef\x0c\x83\xb9\x4f\x8d\x90\x23\xaa\xa4\x97\x50\x36\x31\x80\xd0\x75\x38\x18\x52\x65\xaa\x86\x49\x79\x5c\x33\x62\x35\xa3\x12\xe1\xeb\xb6\xba\xdd\xfe\x55\x48\xa3\xfd\xdf\x3e\xc6\x31\x7c\x9e\x11\x4b\x74\xcf\x60\x21\xe2\xf5\x18\x1c\xc5\xa6\x50\x56\xb7\x51\xc8\x04\x6c\xf9\xc3\x25\x88\x95\xbe\x29\x68\x49\xcd\xd5\x8d\x53\xd6\x8f\xf4\x57\x70\x04\xc9\x95\xdb\xf0\x72\x3c\x61\xef\x66\xe3\xe4\x36\x88\x6d\x03\xe4\x03\x3e\x78\xe4\x72\xf1\x2c\xff\xed\xd7\x20\x07\x8e\xe0\xfb\x3e\x53\x5c\x53\xd9\x54\xc9\x30\x25\xb2\x6d\x72\x35\x8c\xaf\x11\x7a\x34\x6b\x70\x18\x0f\xa3\xd8\x96\x23\x5b\x42\x19\x3a\x0a\xca\x11\x01\x96\x44\x5e\x29\xce\xa4\x43\x28\x9c\x48\xde\x53\x6c\xfe\x55\x31\xc9\x76\xba\x71\x9a\x48\x89\x29\xdc\x42\xd5\x2b\xc2\x20\x9e\x80\x7d\xe2\x58\x7e\xb8\x23\x9d\x75\xb1\xd6\x21\xdb\x1f\xe5\x5f\x39\x5f\xe8\xf9\xe4\xbe\xa8\xc6\xa4\x1b\xbe\xcd\xf4\x96\x6b\x04\x44\xfc\xcf\x99\x0c\x82\xcd\x87\x9c\xac\xd5\x22\x43\xcf\x17\xe6\xab\xdc\x40\x6f\xbd\xd2\x56\xd3\x83\x25\xbf\xe9\xf3\x57\x5b\xa0\x3f\x99\x93\xa4\xf3\x4d\xa8\xcf\x66\xbf\xeb\x1f\xe0\xfa\xbf\x1a\xec\x46\x82\x37\x68\xca\xd5\x8c\x57\xb2\x1b\x3a\x71\x0f\x8b\xc1\x22\x0d\xf3\xd4\xf0\x94\xa4\x90\x37\xe3\xd2\xa9\xf1\x91\x2c\xb7\x5b\xee\xa6\xc0\x4b\xf1\x07\xaa\x9d\x6a\x2a\xe4\xc6\xc9\xbd\x1d\x02\xd4\xe7\x80\x96\x99\x61\xde\x21\x6f\x37\xb6\x9d\xe7\x84\x36\x5b\xf8\x4a\xa4\x4c\x0c\x4d\xa4\x1f\x99\x94\xb9\x71\x64\x2e\xdb\x5c\x17\x5e\x65\x20\x5c\x2f\xc7\xe4\xb3\x7e\x74\xd3\xd8\x67\x7b\x14\xd3\xf5\xf3\x1c\xa3\xa8\x93\x0a\xbf\xa5\x75\x54\x4c\xfe\xe2\xb3\x43\x4d\x1a\xcb\x9f\xc7\xd6\x4d\xfb\xb0\x8b\x1b\x01\xcc\x38\x8e\x53\x92\xed\x34\xd2\x1d\xc7\x3d\xb5\xc5\x1d\x85\x24\x39\x2e\x80\xc7\x4c\xab\x2a\x57\xd0\xc8\xe2\xe9\xc2\x85\x78\xd3\x24\x17\x62\xa5\x6b\x9e\x5a\x2b\xd6\x44\x4f\xb3\x61\x92\xa3\xfc\x4a\x20\xd1\xdd\x59\xb6\x66\xa9\x98\x57\x4f\xe7\x53\x06\xdd\x27\x9a\x89\xf8\x79\x7e\x11\x83\x2a\x57\x26\xf3\x77\x44\x23\x77\x97\xe6\xcf\x25\x82\xc8\x9d\x35\x94\xe7\x76\xa1\xe7\x4a\x3e\x15\x73\x8f\x88\xc3\x11\x62\xa4\xf5\xcb\xc9\xf1\x3a\x6e\x79\xc2\x1c\x06\x8f\x7d\x5c\x4a\xf1\x3b\x67\x12\xae\x65\xca\xdb\x57\x1a\xa0\xaf\x12\x1b\x1a\xe9\xca\xd3\xad\x73\x15\xd9\x40\x5e\x39\x4a\xe9\x75\xdd\x67\xb9\x7e\xa7\x01\x41\xa6\x66\x28\x37\x0b\x9e\xeb\x42\x8d\x5d\xa1\xce\x57\x66\x26\xe6\x86\xf9\xce\x84\x8d\x42\xf5\x7a\x63\xb6\x41\xba\xce\x0e\x84\x4b\xd5\x60\x9a\xed\x36\x1f\xe6\x8c\x66\x97\x22\x80\xef\xf5\x36\x45\x46\xbc\xd9\x9f\x34\xfa\xc0\x3b\x9c\xd8\x71\x62\x15\xca\x26\xf3\x14\x97\xdd\xc0\xac\x4d\x28\x26\xd9\x13\x3d\xce\x04\x4f\x13\xb7\xae\x45\xb3\x16\xc9\xec\xac\x88\xd7\xbb\xce\x9e\xcf\x4f\x91\x9e\xd2\x3f\x7a\x06\xee\x98\xa3\x79\x8a\x1a\x9f\x27\x7c\x8e\xe3\xc2\x13\xc9\x60\xee\xcd\x71\x9e\x64\xd3\xa2\x3e\x30\x9c\xcd\x0c\xfe\xb4\x89\xfb\x1a\xcd\x34\xff\x28\x6c\x1f\x61\xd1\x8e\x6e\x3b\x57\xe0\xc8\xf6\x93\xf8\xae\x66\x54\xbe\xc4\xfd\x34\xd1\x90\xcf\x77\x56\x00\xa7\xe8\x7e\x2c\x9f\xf3\xb8\x35\xcb\x01\x6a\x73\x37\x64\x97\xd8\x75\x59\x89\x0c\x38\x31\xc0\xa6\x6b\x6f\x05\x98\xcf\xf0\x1b\xc3\x24\x67\x45\xeb\xaf\x6e\xe1\xf1\xcc\x97\xb6\x58\xda\x8b\xc6\x2e\x1b\x6e\x5e\x3b\x4f\xe0\x07\x16\x0a\x30\xf0\xb4\x82\xe8\xf7\xb2\x1b\xab\x43\xf8\xfe\x69\xad\xdf\x83\x41\x30\x24\x47\x00\x02\x92\x53\x32\xfa\x06\x26\x56\x62\xe5\xb6\xae\xf7\x5c\xe1\x7b\x66\x40\x89\xac\x0f\xd6\xcb\x1c\xce\x59\x0d\x0b\xec\x01\x43\x50\x61\x3f\xab\xb4\x7e\x37\x2c\x00\x53\x47\x40\xe4\x30\xf7\x57\x32\xbb\xf4\x25\xd6\xe2\xf5\xcd\xe1\x71\x87\xc8\xc2\x0a\x05\x9c\xdf\x03\xff\xc1\xaf\x7f\xee\xa1\x94\xeb\xbd\x8c\xdb\x00\x7e\x8e\xc0\x3b\xb2\xfc\x44\xb8\x23\xe7\xde\x2b\x45\x7f\xe3\xb8\x84\x19\x48\x11\x64\x16\x84\xf2\x88\x04\x53\x67\xa4\x69\x99\xdc\xe7\xa0\x96\x1d\x1f\x50\xba\xdd\x8d\xa3\x52\x05\x98\xcf\x84\x48\x81\xc6\xee\x84\x65\x52\x02\x03\x6e\xc8\xeb\xcb\x07\x24\xb3\x40\x84\x6d\x75\x93\xa7\x15\x9f\x86\xd9\xe2\x57\x04\xd8\xb8\x28\x9e\xf3\xf6\xf5\x3a\x16\xab\x08\xdc\x7f\x7a\x9a\x5c\x61\xe1\xf9\x4c\x6f\x4e\xae\x71\x0d\x35\xc5\xaf\xa3\xd0\x23\x10\x22\xdd\x15\x9a\x0b\x1e\x8f\xe6\xba\x69\xb1\x87\x35\x2c\x84\x6d\xa9\x54\x4c\x45\x75\xea\xa7\xf0\x14\x6a\x89\xec\xa7\xc6\xc6\x03\x16\x81\xf2\x41\x1b\x38\x02\x07\x6c\xbf\x84\xe6\x42\x04\xc3\x30\xf6\x85\xb0\x89\x53\xa1\x34\x24\xf9\xf9\xec\xe4\xd2\xbb\x8b\x3c\x56\x92\x3f\xd2\xe9\xe4\x9f\xa5\xff\x37\x7f\x3c\x6e\x22\x45\xe1\x40\xeb\x35\x3b\x20\x4c\xb8\x3a\xd3\xb2\x88\x46\x66\x9c\x76\xcd\x2e\x14\xf1\x67\x7c\x9f\x03\x7a\xd6\xfa\x68\x61\x45\x9c\x7a\xb9\x32\x15\xce\x9a\x34\x17\xdd\xe7\xb2\xe5\x28\x6a\x4a\x95\xa8\xf3\x2b\x80\x86\x4f\xd8\xed\x82\x5d\x75\x5f\x93\xa8\xfc\xde\xf3\x9c\x57\xb4\x71\xd5\x6e\x31\xfe\xa9\x03\xad\x45\xe5\xa2\x81\x53\x4a\x84\xec\x28\xe4\xbe\xca\xbb\xe0\x7f\x9b\x92\x24\xa7\xf5\xf4\x69\x07\xba\x59\xa4\x82\x8b\x79\x6e\x33\xdf\xc6\xf5\x20\x14\x1c\xa4\x69\xb6\x37\x82\xf6\xe9\x16\x82\x58\x65\x8c\xa5\xd2\x5c\x6e\xba\x07\x2e\xd5\x03\xb9\x29\x17\xab\xd4\x4b\xb7\xfa\x4a\x73\x45\x8a\x84\x08\xc4\xdc\x34\x4e\xda\x08\x33\x8f\xcc\x3b\xad\xf4\x60\x67\x4b\xcd\x99\xe8\x7a\x0c\x87\x54\x10\x85\x1c\xa3\x0c\x89\xba\xa9\x73\x0d\xea\x6f\x51\xfc\xe6\x7f\x0d\x1c\xd9\x8c\x6a\xb5\x43\x5c\x35\xb6\x51\x49\xe1\x86\xa4\x93\xd1\x4c\x1e\x30\xe1\x93\x31\x49\xff\xc1\xb2\x01\xb6\xbb\x23\xbe\xbd\x67\xb5\x9c\xb0\xe4\x73\x60\x2a\x0d\xfd\x19\xa2\x95\xa7\x78\x29\x99\xb7\x63\xe7\xae\x5e\x75\x12\x12\x36\xc6\x1d\x83\xb0\x2d\x04\x56\x72\xa6\x14\xf7\x3e\xd5\xc8\x6b\x5f\xfd\x89\x67\x12\xc5\x0a\x0f\xfe\xf3\xfb\xdc\xcf\x2d\xed\x5d\xcc\x76\x30\xf5\xe2\xe8\xd9\x8e\x92\x46\x36\x58\x46\xbe\x46\xef\x5c\xe2\xf7\xc5\x21\x23\xaa\xcf\x00\xbb\x3d\xe0\x61\x30\x51\x70\x89\x6b\x46\xd9\x66\x81\x72\x3e\x7a\x18\x7f\xaa\x33\x98\x92\x89\x42\xbf\x5a\xb1\x30\xe7\x7b\x6e\x6f\x87\xd0\x08\x80\x5d\x18\x3c\xf5\xe7\xf1\xd2\x3a\xdb\xbd\x4a\xff\xe2\xe0\x6c\xe2\x56\xbf\x2c\xb6\xf1\x28\xa9\xbf\x7d\xd9\x27\x4b\x12\x17\xf7\xe8\x17\xde\x22\x27\x45\xbc\xc4\x2a\x32\x28\x01\xed\x26\x4c\xbe\x16\x17\xe7\xde\xd0\xb0\x09\x78\x47\x10\xee\xb1\x7e\x3b\xec\x2b\x7b\xaa\x7c\x2f\xfb\x47\x91\x3e\xbc\xd9\xa5\xa1\x19\x6a\xe7\x0d\x73\x3f\x47\xd2\x75\xb7\x28\xb1\xf1\x1a\xc3\x42\xd7\x3f\x0c\xa2\x11\x5a\xcb\x1a\xd5\xa8\x0b\xdb\xa0\x7e\x14\xfe\x2f\xff\xd2\xa8\x29\x52\xd8\x02\xc8\x9f\xbe\xf4\x91\xda\x40\x27\x4f\xae\xb9\xe5\x54\x73\x1e\x9b\x89\x13\xcb\x85\x33\x59\xc5\x60\xe9\x38\x90\x47\xe2\xa1\x12\x8f\x5e\xbb\x96\x53\xb5\x9a\xc1\x9a\xad\x89\x21\x2c\x4a\x94\xb2\x90\x4c\x70\x3a\x53\x67\xb6\x4a\x8c\x3b\x58\x4c\x80\x20\x04\x22\x66\x4f\x2d\x18\x96\xa7\xad\x97\x9b\xab\xf3\x8b\xd2\x3d\xff\xee\xce\xbe\x1e\xdc\x71\xa8\xdc\x67\x6c\x73\xb4\x4c\x83\x46\x7a\xa5\x7d\x84\x47\x32\x4a\xba\x04\xd4\x7b\x5e\x92\x5b\x61\xbd\x22\x17\xee\x0c\x64\x59\x36\xb0\x05\xf2\xfc\x4c\x69\xfd\x8d\xee\x44\x96\xab\x85\x83\x66\xbb\x54\x44\x91\xbe\x0a\x52\xe7\x9e\x83\xf6\xec\x85\xc1\xd1\x7d\x81\x59\xda\x34\xcf\x32\xdf\x75\x31\xd2\x8c\x03\x71\xba\x96\x15\xd5\x47\x42\x2d\x98\x90\x48\x95\x32\x51\x7e\x20\xab\xc9\xfd\xf6\x10\x8c\xfe\x55\x8e\x8e\x8f\x7c\xbf\xbe\xfa\x6a\xd8\xc4\xc0\xf9\xd3\x53\xad\x51\xba\xd4\xfa\xcb\xf2\x42\x0b\x63\x1f\xcb\x41\x73\xde\xac\x17\x07\xe4\x0b\x12\x89\x0e\x85\x11\x7a\x5e\x27\x39\x2f\x87\xea\x13\xba\xcf\xf7\xe1\x5e\xdd\xa9\xc8\x5f\x4d\x2f\xa1\xf9\x13\xf5\xc1\x35\x9c\x2c\xd1\x73\xec\x8e\xcf\xe2\xd8\xfa\x44\xb8\x69\xc4\x56\x51\x79\x94\xf1\xe9\xfb\xfb\x1f\xce\x5e\xbc\x14\x2a\x53\xda\xab\xa3\x55\x80\xee\xdc\x17\x35\x32\x04\x81\x84\x7a\x3f\xce\xd3\x5a\xa5\x69\xb5\xba\xab\xbf\x19\x36\xaf\x10\x80\x68\xf2\x13\xe4\xdb\xa7\x9b\xa2\x77\x29\x5a\xe8\xaa\x99\x0f\xf0\x22\x67\xbf\x7e\xe6\x60\x20\x1e\x2e\x88\x6b\x01\x10\x22\xe3\x07\x8a\xeb\xca\xfc\xb0\x22\x0f\x65\xcc\x67\x9c\x00\x0c\x93\xf4\x92\x15\x7d\x68\xa7\xfd\x64\xd2\x8e\x14\x8a\x33\xb1\xf2\xf7\x75\xff\x6a\xf8\xa4\x6a\xee\xc2\x2e\x24\x56\x12\xe9\xbe\xb9\x76\x25\xb4\x5e\x0f\xa4\x37\x15\x20\xcf\x80\xc4\xb8\xd3\x82\xe9\x55\xc8\x4f\xf2\x54\x0d\xa7\xb7\x51\x18\x00\xd4\x37\xe5\x0a\x54\x7b\x41\xc7\x42\xfd\xb4\xf4\x27\xd7\x3a\x96\x81\xcd\xf4\x5c\xa1\x27\x1a\x7e\x4e\xd4\xba\x49\x0d\xee\x91\xc0\x1d\x4f\x08\xc0\xde\x3e\xe0\x95\x10\x52\x93\x83\x00\x38\xfb\x22\xa0\xd9\xe3\x57\x2e\xa7\x9e\xae\x89\x67\x3d\x50\x53\xb5\xa2\x02\xd7\xd8\x77\x55\xbd\x7d\x17\xf3\x3e\x65\x60\xbe\xcd\xb7\x23\xba\xe1\x70\x3a\x88\xc0\x3b\x0d\xa5\xdb\x00\xd4\x4d\x83\x2a\xd8\x28\x7f\x1b\xd6\x50\xce\xea\x51\x72\x7b\x23\x19\xfd\x7e\x8a\x24\x62\xd4\x04\x60\x01\x38\x0f\xef\xd3\x45\xaa\xf6\x98\xdd\xe9\x5d\x3c\xfb\x19\xd2\xac\xca\x3d\x89\x78\xc5\xab\x54\xb5\x57\x77\x4c\x9d\xf6\x58\x58\xfa\x59\x93\x88\xf6\x12\xec\xe0\x93\xeb\x07\xf1\x7a\xfd\xd3\x7a\x55\x4f\xd3\xc3\x36\xe6\x7e\xe9\x93\x2b\x4f\x16\x59\xf8\x55\x2a\xbf\x88\x15\x64\x00\xec\x86\xcf\x40\xa7\xc3\xf6\xaf\xe8\xbc\xa1\x66\x27\xb8\x8e\x11\x99\x88\x52\x32\x89\x6b\x95\x0a\x0d\xfb\x81\x54\xe4\xec\xcf\xcf\xc7\x11\x19\x8d\x81\xdc\x82\x01\xee\xb2\x87\x92\x41\xa6\x11\xf3\x7e\xf8\x10\xaa\x09\xe0\x4d\x36\xff\xd0\xc9\x3a\x3a\x23\x2b\x55\x36\xf0\x0e\xf5\x78\xfd\xab\xad\xa5\xa2\x6e\xdf\x1b\xa1\x7f\x33\xfa\xb5\x4c\x72\x31\x24\xf6\x7c\x14\x08\x00\x15\x6b\x94\x9b\x71\x03\x1c\xc1\xf0\xc1\x0b\x85\x46\x18\x11\x36\x35\xed\x9f\xda\x41\xce\x56\xbb\x2a\x5f\x72\x51\x18\x85\xd2\x00\xc8\x0e\x5f\xa8\x4f\x22\x5e\x89\x3c\xef\xcf\x28\xb0\xe3\xc7\x27\x66\x74\xc9\x11\x63\x37\xda\x09\x33\x07\xe7\xb7\x57\xe2\x86\xe2\xbf\x71\xed\x2b\x3b\xe4\xc1\x4c\x3f\x0a\xae\xfc\x9d\xdb\xbe\x82\x37\x9d\xdb\xba\x5d\x90\xb2\xa1\x17\x2c\x39\xc8\x67\xd6\x3f\x8a\x9c\x60\x26\x7a\x9b\x88\x7d\xcb\x87\x1a\x8f\x62\x74\x52\xb3\x2a\xe8\x25\x02\x9c\xd8\xc7\xa8\x56\xd9\x1b\x16\xee\xf5\xd8\x7f\x62\xb0\xc3\xb6\x78\x20\x8b\x33\xae\x53\xa6\x04\x80\x7d\xe7\x20\x27\x3f\x5a\x15\xfb\x85\x74\x65\xfd\x53\x6e\x1b\xc0\x50\x70\x8d\x3d\xac\x28\xad\xda\x99\x1a\xf9\x75\xac\x8d\x30\x5b\xf3\x44\x6d\x84\x25\x56\xc6\xdf\x3c\xad\xbe\x92\x1f\x7a\x67\x49\x6a\xc3\x46\xf2\xfb\x20\xb3\x58\xfd\x41\x2b\x39\x08\xfb\xc5\x83\x46\x4a\xb2\xe4\x82\x18\x67\x66\xcc\x0c\x72\x38\x63\xb8\x80\xcd\xf8\xa2\x1a\x17\x88\x4e\x43\x55\x01\xff\x5c\xe7\xd7\x68\xef\xcb\x7a\xff\xd1\x04\xc9\x68\x71\xde\x37\x20\xfc\x37\x34\x6a\xaa\x50\x8c\xea\x58\x66\x39\x15\x86\xf7\x8d\x4b\x37\xa0\x97\x34\x9f\x3f\x91\x15\x88\x6b\x7f\xb3\x31\x7f\xaa\xe1\x12\xe0\xa0\x7b\xca\xd7\x6f\x1c\xab\x56\x9c\x2f\xb4\x5b\xaa\xf6\xfb\xbc\x9c\x51\x2c\x5a\x00\x5e\xec\xc5\xaa\xdc\xe3\x62\x01\x8a\xd0\x7a\xbd\x7f\xba\x10\x47\x88\x96\xfe\xe1\xe9\xa2\xea\xd2\x3b\xa4\xbb\x1c\x7c\xac\x84\x2a\xbf\xde\xe7\x61\xcb\x29\xd5\xb3\x57\x16\x0b\x5d\x58\x05\x88\x41\xec\xf9\x0e\xfa\x94\x7c\x6e\x89\x25\x15\x68\x4c\x3e\x3d\x6c\x8d\xd2\x0d\x75\x28\x87\x4f\x9f\x3f\x0c\xa7\x04\x3a\xb1\xfa\xda\xa7\x97\xc5\xfa\xaf\x3e\x93\x7b\xf4\x86\x8d\x43\x75\x60\x07\xbb\x0d\x87\x15\x6e\x79\x9e\xcf\x23\x07\xce\xf2\xcb\x6a\x54\xe2\x85\x42\x6f\x10\x51\x0b\x7d\x17\x0b\x51\x3a\x73\xe5\x6f\x50\x28\x43\xf5\x74\xcf\x61\x3f\xfb\x9e\x60\x22\x6d\x77\xfb\x27\x55\x90\x82\x48\x29\xed\x45\x4b\xab\x1e\xc4\x65\x38\x31\x04\x60\x88\x9c\x58\x58\xa1\x7c\x4f\x55\x50\x89\x97\x5a\x7d\x11\x86\x47\xd9\x19\x3e\x1f\x5a\x26\xff\x7b\x3e\x39\xcc\x19\x8a\xf1\x8a\x98\x42\xfc\xee\xe5\x1b\x8b\x72\xdf\x70\x5f\xdd\x01\xb0\x62\x86\x69\xb1\x5f\xc5\x72\xb6\x4e\x11\xe9\xc5\x89\xc0\x62\x04\x40\xbc\xf1\x29\x27\xbd\x76\x63\xfc\xe4\x22\x1a\xac\x12\x9f\x3f\xc3\x59\x0b\xcb\xf7\xb4\xb8\xdb\xaa\x28\x0c\x83\xbe\x93\x6d\xb1\x46\xb3\x0d\x67\x37\xfa\x79\x17\xa5\x34\x21\xfb\xca\x64\xbd\x87\x40\xc9\x29\xce\x9f\x77\xf2\xcd\x59\xfe\xf1\x1f\x4f\x81\x43\x3f\x35\x1b\x85\xb1\xf2\x8c\xc2\x27\x4b\xe8\x57\xa9\x94\x78\x97\x76\x61\x4b\xb1\x60\x70\x0c\xc0\xf4\x9f\xa0\x6b\x97\x0f\x2f\x0a\x13\x9b\xd7\xba\xdf\x57\x23\x5f\xce\xe3\xc4\x97\xdf\xf0\x25\x7c\xb6\x19\x43\x36\xbb\x09\x0d\x1e\x5c\x87\x19\xb2\xfc\xa7\x0c\x22\x84\x85\x8a\x92\xc6\x3b\x38\xfa\x93\x05\x79\x73\x7d\xff\xd4\x8e\x4b\x28\x38\x8e\xb9\x21\xa7\xbf\x5c\x49\x76\x5b\xab\xbf\x2b\x83\x80\x94\xae\x7e\x85\xbf\x7d\x06\x9e\xc3\x29\x8d\x8d\xf9\xe7\x12\xf3\x27\x9a\x2a\x89\x8c\x31\x70\xa2\x58\x44\x45\x78\x58\xdd\x16\x59\xd8\x25\xbe\x4d\x13\x9a\xf2\x66\x61\x26\xda\x02\x58\xd6\x6b\x9f\x72\xf9\xee\xb3\x99\x7e\x29\x1c\x2f\xa7\xdc\x94\x2a\x0c\x40\xd1\x26\x47\x26\x7a\xb6\xdd\xc4\xe0\x8e\x4b\x74\xe4\xa4\x22\x88\x22\x45\x53\x3f\xc8\x0c\x5f\x7a\x97\xef\xe1\x52\x6f\xa9\x31\x06\x89\x4d\x7a\xd9\x32\x09\xf3\x95\xfc\x6a\xb7\xb8\x90\x3f\x27\x4b\x3f\x6d\xa5\xed\x09\x40\xb2\x39\x75\xa9\x44\xdd\x22\x18\xcc\x68\xc0\x91\xee\x8b\x3d\xea\x14\xdf\x5f\x42\xb7\xd4\xed\x09\x84\xca\xe0\xdf\x60\xbd\x4e\xa9\xd3\x83\x36\xa7\x14\x9a\x80\x24\xfd\x93\x68\x9b\x1d\x48\xf4\x1e\xef\x19\x3e\xb5\x64\xf9\x55\xb9\x07\x9d\x1a\xfd\x19\xde\xef\x16\x90\x88\xb6\x7d\x7a\xc3\xa4\xf3\x60\x5e\xf6\x5b\x3d\x25\x35\xec\x25\x96\x13\x7e\xe5\xb7\xea\x95\x01\x6d\xb3\x9f\x69\xab\x78\x58\xea\x63\x50\x30\x59\x5f\x00\x69\x27\x55\xc1\x92\xce\xf3\xb5\xc6\x81\x03\x09\xc8\xbe\xb9\x27\x6b\x26\x5a\x4b\xef\x2e\xc5\x2d\xfe\x7e\x43\xf2\x88\x38\xd1\x6a\x4e\x27\x30\xe5\x74\xbb\x83\x24\x70\x01\xc2\x2a\xf7\xcd\x02\xf5\x7e\x95\x31\x69\x6b\x00\xc8\x2a\x69\x02\x08\xbe\x3c\xa6\xd9\x0e\x34\xea\xa3\x72\x2f\x03\x9e\x17\x5b\x8b\xb2\x8e\xb8\xef\x67\xff\x0f\x16\x7a\x16\x70\xfb\x1a\x46\x2d\xde\x68\xe3\x91\x2c\x97\x66\x04\x21\xb4\x0a\x51\x77\x74\x94\xb9\x84\xa3\x20\x1b\x04\x88\xbd\x56\x8b\xfa\x3a\x96\x58\xcb\xf5\xde\xa4\x0d\x13\xbc\xaf\xa0\x93\xaa\x27\xd7\x6d\x14\xa2\x35\xa1\x6c\x2b\xf9\x8b\xe3\x4d\x7c\xdc\xa3\x7b\xf5\x7d\x02\xf9\x28\x67\x91\x0b\x04\x58\x31\x37\x71\x67\xe1\x49\x46\xef\x3a\xf0\xa9\x42\x7c\x1d\xfb\x9d\xcd\xd8\x5e\xb5\x9f\x2c\x6c\x22\x9e\xf8\x18\x1c\xe8\x79\xb1\xfe\xcb\x07\xb8\x27\x23\xd2\xfa\x45\x6d\x6a\x54\xdb\xc3\x28\x3b\xfd\x39\x11\x01\xdd\x07\x79\x96\x65\xb9\xec\xdf\x2a\x6b\x18\x37\x43\x00\x4c\x9f\xbe\xb3\xd1\xdf\x1b\x11\x21\xa9\xde\xb8\xb9\x4e\xeb\xe5\x80\x65\xcd\xf4\xb6\x46\xc9\x42\x51\x73\x73\xf9\x51\x76\x64\x07\x82\x38\x8e\x01\xf8\xcc\xa0\xd7\x72\x80\x75\xb1\x60\xaa\xd3\x77\x04\xec\xa6\xe7\xba\x84\xe9\x4d\x94\x5e\x0c\xe6\xa3\x8e\x48\xba\x52\xbe\xbd\x5a\xd0\xae\x8f\xb9\xf4\xfe\xd5\x9d\x77\x96\xc4\xb7\x55\xd0\x28\xfa\x3b\x54\xad\xe6\xfe\x46\x75\x26\xfa\xf9\x7e\x07\x49\xbc\xa7\xa0\xcc\x00\x23\x35\xc0\x58\x89\x0c\xab\x42\x90\x59\xb4\x4f\x43\x80\xc0\x14\xbc\xfd\x9b\x15\xe0\xc6\xda\x43\x70\x3b\xd8\xc7\x32\x37\xea\x3b\x99\xfd\x05\x72\x08\xf3\xbe\xba\x63\x4c\xb3\x8c\x1c\x7c\x6b\x33\x19\x98\x24\xbf\xc8\x45\x4e\xa4\xdd\x4b\x8b\x40\xe7\xd8\xcd\xd7\xe5\x96\xe2\xbf\x8d\xcc\xb9\xd1\xe6\x24\xa8\x2d\x6d\x64\x86\x5a\x62\xa5\xfe\xe6\x60\x74\xb1\xdf\xe5\xcb\x94\x92\x81\x0e\x5a\xe9\x68\x8e\xc1\xcd\x43\x53\xe9\xd3\x79\x07\x4c\xbd\x02\x09\x20\xe5\xad\x40\x92\xde\xb2\x55\xb1\x88\x6a\xa6\x00\x57\x1e\xb4\x92\xa8\xa6\x9c\xb4\xb2\x75\x7d\x50\x6b\x88\x0f\xe5\x73\x31\x28\xdc\xcd\xec\x76\xf3\x8d\x60\xf2\xfd\xb6\xf3\xc6\x68\xdc\x26\x13\x6a\x52\xa0\x00\xeb\x37\x5c\xa2\x1e\xac\xf8\xd6\xe5\x19\xcb\xe6\x77\xf9\xf8\x52\x26\x63\x06\x73\x7c\xa6\xdf\xee\x5f\xdd\xb2\x17\x8a\x00\x9a\x5c\xf9\x0d\x3c\x4b\x92\x50\x3a\xcb\xc5\x69\x67\xea\x15\x9d\x5c\x80\x64\xf9\x7e\x11\x8d\x8e\x18\x14\x44\x30\x8a\x04\x7b\xf7\xf0\x38\xc4\x6e\x28\xb5\x8a\xe5\x54\xb3\xdf\x83\xb3\x36\xee\xb4\xda\x03\x62\xb4\xcc\xa9\x36\x64\x62\x10\x0c\xe6\x83\x9b\xcb\x01\x62\x50\x53\xd0\xe1\xde\x78\xeb\x23\x06\x00\x42\xec\xde\xeb\x7a\x2e\x8e\x41\x75\xf5\x3c\x9e\xe7\x36\xee\xfc\x9e\xd1\xbe\xa9\xdb\x28\xb8\xeb\xa2\x3d\x19\xc6\xfa\x07\xd4\xfc\xa4\x44\xc3\x7b\x85\xad\xd0\x0a\x7d\x4c\xa2\xe9\xa4\x6b\xf0\xb0\xa3\x5c\xde\x15\xac\xbf\x59\x08\xe0\xf8\x65\xd7\x10\x45\xf2\x7c\x64\x08\x02\xbd\x0a\x29\xfa\xbe\x84\x4f\xb9\x6b\xcd\x72\x14\xea\x61\x50\x22\xa5\x34\xf4\xfb\x41\xba\xba\x50\xc3\x13\xba\x2c\xab\xde\xc6\x8d\x59\x10\x8c\xf1\x36\x5b\x64\xfc\x32\x9e\x8c\x91\x02\x80\x08\xc8\x3c\xd1\x85\xd4\x1e\x7e\x8a\xa7\x46\x4c\x40\xab\xcd\xcc\x41\x59\x34\x4c\x9e\x19\x9e\xf5\xfe\xeb\x59\x73\x6b\xb2\x73\x5b\xf1\x5d\xe9\x21\xb9\x20\x92\xef\xfb\x3e\x0d\x15\x1f\x69\xbd\x2c\xcf\xb2\xc0\x37\x00\x42\xed\x44\x66\xf6\xf7\x48\xb1\xed\x9e\x23\x72\x1c\x33\x5f\xba\x90\x7c\x33\x2a\xde\x29\x1a\xcd\x6e\xd4\x5c\x2d\x7f\x1b\xb4\xb8\xe8\xaf\x7e\xa4\x93\x98\x2f\xa7\x8d\x8e\x60\xa0\x48\xc1\x9e\x6f\xbc\x22\x98\x68\x9a\x57\x84\x4a\xf9\x12\x64\x98\x3d\x07\xc1\x6a\x5c\xa5\xab\xb9\xa1\x7f\x45\x37\x93\x29\x46\x46\x2f\x4b\x8f\x84\xc5\x27\x31\xfe\xce\xae\xd5\xc7\x62\x3b\x98\x76\xd9\x57\xa5\x5b\x94\xce\x46\xdb\xd6\x43\xb7\xc3\xa2\x1c\x50\x24\x00\xe0\x0d\xc0\x89\xb8\x17\x12\x75\x93\xf1\x83\xb2\x10\x6d\xf6\x89\x84\x14\x44\x1e\x2b\x3f\x63\xec\x6d\x5f\xd0\x03\xb4\xc6\x46\x3f\x54\xf8\x10\x98\x9f\xfa\xe0\xb2\xdc\xb8\x11\x89\x6b\x69\xe1\x79\x24\x10\x41\x6a\x03\x83\xb9\x8f\x6c\xa0\x65\x59\x7c\xcd\x09\x26\x25\x7c\xac\x2a\xa6\x08\x99\x5d\x82\x4a\xaf\x9c\xa6\xae\xd3\xa6\xf4\x87\xc9\xff\xed\xf3\x76\x2f\x2f\x26\x2c\xa6\x4f\xde\x61\x3d\xbe\xe9\xde\x01\x91\xb5\xbb\xcc\x8e\xe4\x46\x1f\x82\x94\x48\x19\x06\xc3\xba\x24\x03\x98\xb9\xc7\x34\xdc\x2d\x6a\x0a\xbb\xbc\xf7\x05\x70\x17\x19\x84\x50\x9d\x9f\x78\xdd\x82\x2e\x9d\xb7\x3d\xf5\x90\xcb\x60\xad\xc8\xe6\x15\x5c\xba\x03\xdc\xdd\xdf\x51\x38\x12\xbd\x37\x11\xde\x0d\x80\x1b\x52\x80\x22\xa1\x8a\x00\x16\x97\xa8\x29\xea\xec\xfb\x66\x2f\xb9\xb5\xc7\x43\x39\xd7\xb6\xd9\x0f\xbe\x39\xd8\x0a\x92\x70\x80\x5c\xf8\x5b\x63\x9e\x61\x37\xc7\x0a\xb2\x14\x98\x43\xde\x97\xe8\x85\xbe\x0b\xd3\xa4\x18\x99\x8e\xda\x22\x61\xbd\x01\xc9\x70\x86\x91\x71\x47\xd6\x43\xd3\x4e\xe3\x79\x6a\x82\x24\xcb\x77\xc2\xc5\x0e\x89\xf8\xd8\x0e\xa1\x55\x6d\x56\xa0\xbd\x93\x7f\xae\x77\x81\x21\x51\x87\x27\xe0\x6b\xd2\x06\x85\xa4\x86\x91\xfb\x7e\x0f\xe0\xcb\x24\x36\xc6\x26\xc7\x53\x7f\x5e\x00\xd9\x9c\xdd\x00\x04\x39\x82\x91\x05\x76\x67\xc7\xc2\x48\x67\xe5\xd7\xa8\x2e\xb5\x16\x19\x37\xf2\x12\x04\x5b\xd9\x9d\x09\xac\xf1\xb0\xff\xd5\xb8\xde\x9a\xae\x3b\xd0\xb3\xd4\x4e\x2a\x87\xd3\x02\x54\xd0\xed\xb3\xf0\x81\x65\xd6\xcf\xf4\x14\x02\x84\xd1\x85\x95\x43\x98\x7c\xc5\x10\x6b\xfc\x74\xe0\x1e\xfc\x8e\xea\x20\x64\xc9\xe6\x4f\x6f\xc5\x0f\xf1\xf4\x11\xe3\xb2\xd2\x52\x8b\x1b\x1f\xfc\x3b\x8c\xbd\xf3\xfc\x7a\x22\xfb\x8a\xf6\xbb\x16\x5c\xba\x1a\x27\xbf\x1d\x10\xd2\x00\x60\x02\x00\x5b\x41\x6e\x20\x8b\x9f\xd8\x53\x3a\x33\x00\xc7\x7b\x82\x20\x8c\x4d\x20\x00\x5b\xbe\x05\xe8\x92\x35\x96\xcd\x20\xaf\xce\x60\x97\xb1\xe9\x69\x4d\x9e\x5c\x85\x2e\x16\xd9\x53\x66\xa7\xe8\x21\x5a\xe8\xa2\xfc\xa3\x0f\xb9\x49\xea\x32\xb5\x5c\x16\xab\x61\xb4\x80\x24\xee\x7e\x7c\x37\x0d\x4c\xc7\x18\x07\x00\x41\x20\x4b\xc1\x0c\x5c\xf3\xbd\xd6\xeb\x42\xc4\xe9\xe4\x74\x92\x89\xb6\x3e\x30\x49\xff\x91\x18\xbd\x39\x50\xd8\xc2\x84\x80\x0f\x1c\xee\x93\xc2\xcf\x47\xa1\x18\x0b\xad\x3f\x9f\x4a\xab\x72\x39\xfa\x58\xf8\x43\xd9\x35\xad\x7e\x1c\xaa\x91\xfb\xac\x5f\xb0\x33\xc3\x5c\xd7\xc0\xf8\x3e\x44\x8e\x24\xd3\x3d\x8f\x09\x16\x3f\x0e\xd5\x81\xe9\x23\x90\xec\xa9\xef\x62\x4c\xba\x41\x2a\x60\x33\xbd\x09\x79\x93\xfc\xd4\x77\x7b\x51\xd9\x2c\x57\x83\xa3\x04\xfc\x00\xdf\xa4\x56\x93\x1b\x4e\x3c\x2a\x83\x0f\x1e\x08\x57\xff\x37\x67\x52\x6c\xfd\x98\x7a\xd3\xe3\xcb\xc0\xc5\x52\x22\x67\xe0\xea\x22\x48\xae\xe5\x40\x83\x39\x10\x14\xa4\x28\x5c\xa5\xbd\xc8\x55\xbe\x80\x71\x27\x98\x64\x3b\x3b\xf3\x15\xbe\xa4\x5e\xcf\x11\x9e\x0a\x26\xa1\x99\x89\xef\x62\xd8\xb8\x87\xea\xc1\xe1\x6f\x96\x1d\xe9\x5c\x9b\x2d\xcf\xa2\x57\x59\xd6\x83\xdb\xfd\xb0\xb7\x9f\x13\x3f\x68\x00\x0a\x2f\xe3\x64\x0c\x82\x89\x73\x62\xdf\x31\xdc\xff\xdc\x09\xda\xf9\x4a\x5b\x9d\xa9\xd7\x9a\x4e\x2b\xe1\xe9\x27\xef\xfb\x16\xe9\xff\xc7\x27\xd6\x39\xc2\x17\x3a\xd1\x5d\x0d\x6e\xcd\x7c\x12\x69\xf4\x22\xd0\xb0\x93\xd0\x39\xd3\x6c\xf6\x3e\x00\x75\x56\xe2\xfa\x57\x23\x79\x58\x38\x99\x0b\x91\x04\x5b\x4b\xac\xc4\xd2\x02\x94\x41\x23\xc6\x88\x80\x71\xcd\xe7\xd8\x1b\x97\x98\x1f\x17\xa0\xa9\x06\xdd\x8e\xab\xfb\xb1\x1c\x35\x99\x06\xb7\xdb\x97\x74\x5c\xd7\xab\x0c\x9b\x22\x2f\x04\xfb\x0d\x0d\xef\x3a\xbc\xd0\x84\x6f\x39\x51\x2c\xa4\x7e\x69\xe6\x44\xf8\x34\xe5\x66\xac\x41\x20\x99\xd6\x9f\x6c\xfe\x81\x19\xc8\x37\x9c\xd9\x09\x76\x67\xd1\xce\x39\xf9\x01\xfb\xec\xaa\x52\xa6\xca\xf8\x73\x7e\xef\xf3\x9d\x3e\xfa\xe9\x55\xbb\x6e\x28\xf8\xbb\x9a\xd8\xf7\x53\x97\xbf\xff\xe1\x78\x92\xd3\x67\xb9\x76\x16\xea\xab\x44\x2e\x5f\xa5\xbe\x46\x33\x6d\x29\xb6\x55\xac\x5b\x2d\x6e\xf9\x0a\x2f\x01\x83\xc0\x99\x7b\x91\x55\x16\xc5\x7c\xfb\xf9\x13\xaa\xc3\x59\xad\xee\xb4\xba\xdd\x22\x2a\x7e\x19\x6e\xd5\xec\xd0\xbb\xa2\x92\x6e\xa3\x14\x0a\x38\xf3\xf7\xff\x72\xd5\xf1\xba\x25\x41\x68\x02\x4e\x98\x3f\xca\xdd\x35\x41\xb7\x87\xb5\x88\x18\xb2\xbb\x3d\xc8\x75\x43\xcb\x08\x9b\x72\xfe\x4a\xa0\xd9\x39\x7e\xe8\x50\x02\x95\xb0\x3f\xb8\xf9\x77\x66\xca\xbf\x3c\x49\xe8\xef\x24\xc4\xf4\x11\xb9\x31\xbb\x39\x55\x4b\xbf\x5e\xf0\x61\x7c\xe0\x41\xcd\xab\x3b\xb9\x56\xe5\x46\xde\x69\xe6\xec\x4b\x52\xb9\xef\x82\xe8\x9f\xc8\xa7\x74\x5f\x7f\xf9\xbc\xf9\x77\x2f\x32\xdc\x97\x7a\x74\x67\x4f\xb8\x26\xf7\x66\x73\xe9\xb5\xa3\xf5\x53\x37\x5e\xdf\x57\x3b\x06\x9d\xfc\x82\x59\x7b\xdb\x53\x6a\xb3\x41\x22\xd3\x82\x75\x09\x73\xb7\xb8\xe3\xe7\xf1\xdd\x38\xd0\xc9\xef\xcf\x5f\xec\x8c\x7a\x05\x9a\x14\x74\xdf\xfa\x19\xc9\x51\xeb\xa9\x8f\x2d\x9a\x13\x9c\xae\xbf\xb5\x55\xfd\xa6\xb2\x65\xab\x37\xb7\x46\x7d\x0e\x63\xd6\x7e\x57\xab\x32\x7b\xfc\xf3\xa9\x54\x41\xef\xfc\xcf\xa7\x8b\x0f\x25\x11\x01\x48\x12\xba\x11\x19\xc2\xd2\xcf\xec\x1a\x6c\x1f\x54\x4e\x61\xb0\xba\x13\xc9\x62\xee\x1b\x17\x94\x39\x99\xdb\xb0\x07\x54\xc8\x5e\x74\xfb\x61\xae\x65\x42\xb7\x1a\xab\xb9\xf1\xfd\x8c\x7f\x71\xeb\x5a\x43\xeb\x9a\x0f\xce\xc9\x1a\x7b\x58\xb1\x6d\x59\xe4\x22\x8e\xae\x07\x45\x22\xca\x5b\xeb\x6e\x6a\xd0\xb1\xc5\x16\xf7\xec\x41\x30\xe7\x25\x5c\x39\x7b\x7f\xff\xce\x71\x19\xb5\x46\x4a\x2e\xdb\x97\x35\x9b\x31\x6f\x0a\xe1\x0f\x39\xfe\xe4\x23\x96\x3b\xe6\x0b\xa3\xac\xbd\xfa\x3e\x6b\x0a\x2b\xef\x6f\x5e\x15\x65\x7e\xe4\x02\x28\x8c\xec\xdf\xfc\xae\x96\x35\x9a\x14\x4c\xdf\x5a\x66\x3b\x63\xa9\x72\xea\x6a\xae\x4f\xc4\x55\x9b\x4e\x59\x1b\x54\x61\xb9\x94\xc4\x9a\xf3\xeb\xc0\xfa\x1b\xb4\xfd\x6d\xad\x50\x0d\x3f\xcc\xf1\x1c\xf4\xa7\x15\x64\xc7\xaf\x7e\x59\xd1\x1a\x54\x5d\xa2\x2c\x2e\xa0\x30\x79\xbb\xcb\x22\x0d\x42\x1a\xd9\x20\x9c\xb5\xe1\x4c\xfb\x5c\x20\xb6\xf1\x52\x1a\x92\x3e\x29\xe3\x76\x70\x43\xfe\x7a\xbb\x44\xc7\xd2\xf1\xff\xea\x61\x08\x49\x84\x69\x7d\xca\x09\x04\x53\xe5\x24\x63\xe3\xee\xf7\x4b\xd3\xe2\x35\x1d\x7a\xef\x33\xe6\xca\x99\x7e\xdf\x52\x88\xe9\x9f\xf3\x6d\xbe\x5d\x79\xae\x00\x51\xff\x97\x03\xb4\x9d\xa5\x67\x4f\xcb\x78\xe1\x5a\x15\xac\xe6\x94\x0f\x0c\x6e\x84\x86\x34\xf2\xc7\x53\x18\xa0\x70\x18\x9a\x6b\xaa\xb5\x60\xc7\xef\x0e\xeb\xf2\x43\xf1\x6b\xca\xa5\xf2\x3f\xeb\x91\x2e\xcb\x31\x7a\xf1\xcf\xf7\x4c\x72\x35\x6c\xdf\xe4\xae\x85\xda\x31\x42\xda\xb5\x26\xf7\xa5\x7e\x3c\x56\x6c\xee\x8e\x72\xd6\x43\xff\x1c\x2f\xad\xf0\x4e\xf6\x52\xd9\x56\xb5\x3f\x6c\x4e\x73\xea\xb4\xdd\x4b\xc5\x6c\x93\x5c\x0f\x54\x49\xbc\xfe\x9b\x47\x6e\xc1\x44\x7d\x51\x97\x50\x59\xec\x42\x39\xba\xe6\x9b\xd9\xa7\x65\x94\x93\xc1\x13\xf9\x02\x61\xc6\xd2\xdb\xc5\xd0\xf9\xcc\x07\xd8\xc6\xc9\x93\x17\x6e\x6a\x7a\x5f\x33\xd1\xf4\xa3\x22\xec\xf7\xb3\xff\x1b\x47\xc3\xe6\x6b\x27\x82\xe1\xe4\x22\x16\x21\xf7\x08\xee\xf7\xbc\x0b\x14\x92\xf5\x65\x74\xa8\x27\x6d\x50\xc2\x97\xf6\x72\xee\x29\xdd\x0e\x66\xe7\xef\x88\x31\xe4\x2d\xcb\x23\xe3\x8b\xff\x07\xdb\x06\x93\xde\xd8\x4e\xbe\xc2\x76\xa9\x5a\x78\x85\x5d\xc0\xb3\x08\x15\xf3\x66\x2f\xaf\x84\x29\x17\xb2\xd3\x86\xdd\x3b\xec\xc2\x66\x71\x6c\x88\xba\x79\x83\xc5\xd4\x66\xc5\x78\x3b\x6a\xcf\xa9\x46\x93\x8a\xfd\x62\xf5\x7f\xbf\x4f\xa9\x5d\x6f\x74\x15\x51\xfb\xf3\x8c\x2e\xfc\x1e\xca\x21\xf8\xe8\xd6\x8f\x85\xad\x9d\x38\x66\x3b\xec\xe0\xbd\x9f\x8e\xdb\x86\x56\x72\xbf\x66\x8c\x0d\x67\xe3\x83\x73\x1a\x8e\x98\xb1\x57\x45\xb6\x95\x50\xc4\x6b\x7b\x46\xbf\xba\x17\x3e\x94\x26\xe8\xcb\x59\x62\xcb\xa7\x6a\xbd\xc9\x31\x4d\xbe\x1c\xb3\x45\xa0\xf9\x20\xc1\xec\x8b\xaa\x62\x21\x5b\xfd\x92\xaa\x34\x64\xe9\x93\xea\x81\x46\xef\xa1\x7a\x29\x15\x7e\x77\x51\xc6\x7e\xbb\x7f\xff\x3e\x3c\x54\x6f\x44\x79\x46\xed\x97\x3d\x17\x42\xbb\xc4\x4a\xac\x3a\x21\xc9\xbb\x1a\x82\x22\x13\xb1\x97\xb4\x19\x15\xc3\x75\xd4\x85\x04\xf7\x35\x63\x43\x6c\xa1\xab\x54\x05\x3c\xef\xce\x9d\x44\x67\xe9\xdc\x27\x4b\x81\xfa\x33\xf8\x72\xcf\xe1\x31\xff\xee\xc8\xab\x57\xd6\xbf\xa1\xb7\x6a\xed\x12\xcf\x69\x8c\x67\xab\x3b\x41\xa7\x1d\x23\x5f\xdd\x68\x38\x68\xd2\x6c\xa9\x9b\xcf\x44\xf1\x27\x3a\xb3\xcb\x38\x3d\xc9\xdc\xc5\xf8\x62\x7b\xd1\x9b\x2a\xc0\x78\xee\xdb\x8c\x8a\x3d\xb3\x39\x52\x5f\x7e\x35\xde\xcf\x4e\xb9\x9a\xd3\x49\x98\xf2\x5c\x62\xe1\x13\xc3\x86\x6c\xc4\x5c\xae\x8a\xe1\xcd\xbf\x01\x58\xeb\xa0\x93\x6a\xf8\xf6\x84\x67\x4b\x79\xee\x94\xfa\x6f\x93\xa1\x99\xc2\xfd\x0e\xf9\xa1\x86\x3c\xe5\x62\x87\x95\x74\x52\xcd\xed\xef\x67\x43\xfc\x9d\x15\x30\x2f\xa7\x97\xd8\x86\xea\xd5\xeb\xbc\x9b\x34\x5a\xfb\x23\x64\x11\x72\xb6\x0e\x77\x18\x97\xbc\x5e\x82\x89\xce\xb1\xeb\xfd\x34\xe1\xa8\xbd\xa8\x60\x11\x5f\x18\x3d\xab\xf1\xc5\x29\x2d\x06\xee\x60\x93\xef\x59\x1e\x5b\x61\x7f\x4b\xcb\x2f\x9f\xd4\x3a\x5b\xcf\x8b\x80\x37\x31\x13\x48\x8a\x72\x2d\x9b\xe6\xb8\x1f\x75\x77\xa0\xe3\xb6\xc1\xe4\x2f\xc6\x80\x4b\x45\x93\x25\xfe\x72\xc3\x9a\xec\x5e\xa6\x74\x35\xc0\x9e\x5a\x6f\x71\x43\x20\xfe\xd9\xfd\x53\x4f\x67\x17\xef\x32\xc8\xdb\x6d\x7c\xbe\xcd\xb7\x15\xb5\x37\xb6\x08\xf3\xf0\x6b\xe0\x76\x64\x3f\xf1\x13\xf2\x66\x13\x8b\x9a\x76\x17\xe8\x6c\x14\x6d\x74\x5b\xd1\xc7\xda\x3c\x15\xb8\x77\x78\x7f\xa3\xcf\x45\x45\xa3\x50\x84\xc7\x21\x2e\xd3\x00\x6a\xd6\xa9\xea\x81\xd6\xe5\x96\xf9\x4c\xd0\x9b\xbc\x09\x65\x45\xb6\xe9\x39\x54\x79\xb2\x11\xc6\x74\xc4\xfd\x7e\x85\xc3\xe7\xf7\x77\x48\x74\x33\xca\xb1\xac\x69\xf6\x97\x94\x54\xb1\x25\x98\x27\xf2\x00\x2a\x92\xe2\xbb\x7f\x9a\x44\xae\x16\x8f\x87\xf8\x78\x4a\xe6\xfb\xe3\xcc\xa9\x36\x68\xe2\xe4\xab\x76\x81\x4a\x82\xec\x97\x85\x25\x32\x67\xe2\x28\x68\xa9\xd9\x9e\xff\xb9\x57\x82\xe6\xb2\xc5\x9d\x51\xde\x92\xb8\x9e\xa8\xd9\x9d\x7a\x16\x82\xca\xfd\xc6\xf1\x53\x57\x6b\xc5\x0a\xcd\x75\x8e\x84\x5a\x24\xc1\x7b\xc8\x97\x76\xc6\x26\xf2\xe4\x1f\xa7\x0a\xcc\x73\xc5\x95\xd2\x2c\x39\x85\x7e\x1e\xe1\x9b\x19\xc5\x82\x8a\x88\xfc\xe2\xd3\x57\x42\x79\xdf\xe6\xc5\xbd\x14\xf4\x52\xeb\x01\xa7\xfc\x17\x13\x96\xcb\xae\x5e\x3c\x37\x89\x76\xfd\xcf\x8c\x86\x7b\xf4\xbc\xd9\x5d\x65\x0a\x36\x0d\xcf\x1a\x53\x68\xeb\xeb\x41\xf0\x8f\x73\xc6\x68\xac\xa6\xb7\xfc\xf5\x79\x6e\xcc\xd2\xcb\xed\x4b\xf2\x51\x08\x32\x85\x78\x95\xcf\x6b\xde\x47\x6a\x5c\xc3\x55\xd0\x50\x12\x45\x89\x32\x7b\xc9\xcd\xae\x6a\x8f\xb1\x48\x7f\x7b\x72\xd2\x2d\xee\x1c\x7e\x6c\x74\x2a\x94\xf2\x86\x90\x2c\xc9\x74\xc6\x44\xe1\xca\xd9\x2e\x58\x34\xbb\xf1\xa5\x5e\x49\x2b\x4d\x84\xfb\xa2\xde\x31\x06\x8d\x90\xde\x93\x01\x18\xb3\x35\x4c\x7c\x8d\x00\xa3\x5b\x70\xa6\x23\xfd\xe0\x8a\xcd\x06\x1a\x33\x7e\xd6\x7c\x40\xf0\x9b\x52\x90\x63\x49\xbf\xfe\x13\x5b\xd2\x4f\x9d\xee\x58\xfc\xe2\xd2\xdc\xc5\x2c\xe2\xe5\x5a\x30\xdc\xea\xef\xad\x52\x46\xd8\x9f\xb8\x6b\xf5\xbe\xd0\xfb\x99\xec\x88\x4d\x71\x21\x8d\xcc\x18\xf1\xf8\xfe\xbe\x33\xd4\x6c\xbc\x4f\x1f\x0b\xbe\x9f\x5d\x29\x9f\xad\xc3\x24\x56\xd2\x95\x0a\xe5\x7b\xa0\x37\x66\x6c\xf8\x6b\x53\xee\x4c\x15\x9f\xff\xee\x42\x52\xd7\x42\x68\x8d\x87\x2e\xc9\x57\xd1\x36\x04\x81\x25\xdd\xe5\xbd\xe7\x2b\x2d\xe9\x16\x6e\x5d\x09\x9a\x05\xdf\x4d\xb8\xe0\x31\x49\x4b\x95\x27\x60\xf7\x42\x42\x08\xd1\xf9\x5b\xb6\xfa\x48\x68\x8f\xb3\x34\xd6\x84\xd0\xee\xce\x9f\xc4\x5f\x4d\x09\xf7\xf4\x11\x5b\xe6\x45\x59\xab\x03\x4c\xb3\x9d\x4b\x4a\x60\x86\x11\xc4\xf3\x9d\x0a\x09\xb1\xdc\xac\x82\x3f\x4f\xd6\x19\x9f\xca\x09\x49\x44\xf8\xc1\xcc\x55\xcb\x37\x87\xf7\x22\x23\xb8\x7a\xee\xc6\x2e\xa3\xec\xb5\x44\xfc\x44\xf6\x6f\xe5\x42\xc3\x46\xad\x51\x62\x4f\xe0\x37\x4d\xc0\xd6\x6f\xe9\xaf\x47\x02\xd7\xc9\x15\x34\xb0\xf2\xd5\x58\x54\x45\x26\xda\x02\xd3\xdb\x60\x30\x7a\x3a\x26\xbe\xfe\x58\x15\x9f\xdd\x7a\x8b\xea\xfb\xda\x12\xef\x85\x41\x0e\x3f\x97\x93\xa1\x83\xc4\xbe\xef\x0e\xb2\x63\x8c\xce\xcf\xd0\xe1\x38\x9c\xf2\x27\xd2\x13\x49\x65\xa2\x29\x77\x55\x7e\xf0\xbf\x6c\xf5\xd2\xcd\x31\x6f\xf3\xfe\x77\xd6\xf4\x53\x1e\x4f\xd5\x7c\xe3\x41\xc4\x60\x5a\xd0\x5d\xa2\xbb\xe7\x80\x7b\x4e\x72\x31\x7c\x96\x07\x86\xe4\x66\x6f\x54\x9a\x28\x65\x68\x2a\x84\x62\x53\xa5\xc8\x89\xc6\xfc\x99\x04\xeb\xa7\x7c\xcf\x2a\x9b\x45\x2b\xce\x44\x67\x39\x41\xc9\xe9\xe5\x4b\x94\xf3\xb5\x24\xbd\x8f\x1f\x1f\x03\xc1\xe2\xf6\xcf\xd9\x7c\xfe\x9e\xcd\xe3\x91\x77\x9f\xd4\x91\xb5\x35\x50\x22\xd4\x7f\xc6\xfd\x44\xeb\xf5\xf0\x64\xc2\x3d\x04\xd1\x4e\x0c\xca\x9f\x49\x0d\x56\x8c\x96\x2d\x2f\xc7\x0b\x69\xf6\xad\x2f\xcd\xf6\x23\xe6\x48\xf6\xed\x7f\x72\xbd\xa7\xb6\x3e\xc3\x08\x82\xb0\x1a\x63\xfa\x92\x1c\xb2\x7f\x90\x5b\xbf\x37\x08\xe2\xc5\x62\xd9\xe7\x1f\xf1\x45\xfd\xce\xb2\x8c\xfa\xb1\x0b\xed\x67\x19\xb0\x76\x71\x2b\xde\x44\x83\xf7\x96\x73\x2b\x77\xa3\x03\x05\x19\xea\x6b\x64\xad\x42\x40\xa9\xe7\xa5\x48\x39\x42\xd5\xa8\x18\x3d\x44\xe5\x73\x89\xdf\x86\x01\x44\x51\x06\xcd\x44\x65\x71\x47\xf4\x33\x13\x07\xa2\x93\xd0\xdd\x6a\xc7\x31\x77\x42\x77\x82\xf6\x7d\x25\xdf\xaf\xf8\x37\x96\x8a\x07\x6c\x42\xdc\x97\xb6\x68\x75\x7a\x09\x07\xcf\xc1\x28\x13\x0c\x90\xc6\x63\x2f\xa2\xe9\xce\x17\x5e\x28\x87\xc6\x7b\x7d\x38\x95\xd6\xea\x00\xd7\x4a\x72\x98\xbd\x75\x8e\x40\x4a\x1a\xa2\xe8\xb0\x08\xc7\x71\xb4\xd7\x8c\xca\x2b\x9b\xd9\xd0\xdf\xf7\xd0\xad\x9d\xa0\xb6\xb8\xcf\x45\xd4\xb1\x8d\x42\x59\x35\x2b\x55\xf9\x49\x38\xbf\x73\x72\x71\xc9\x15\xe8\x4f\xc7\x20\xb1\x78\x10\xce\x91\x87\xba\x14\x1c\x88\x18\xb6\x96\xdb\xfe\x5c\x84\xea\xaa\xc4\x4a\xdc\xcf\x70\x64\x89\x52\xb1\xf0\xe5\x91\x26\x60\x4c\x85\x10\x4d\x7f\xde\xb1\x50\x92\x88\x94\x21\x6c\xe9\x79\xf0\x83\xa0\xcc\x3c\xcf\xed\x04\x03\xd1\x29\x4e\x7f\x82\xfe\xbd\xc2\x57\xc7\x41\x20\x14\xcb\xe3\x91\xab\xb9\xfa\x57\xd4\xab\x3f\x6c\xc9\xf2\x3f\xcb\x40\xb8\xc4\x4a\x95\x2b\xdc\x3f\x5b\x1e\xee\x39\x92\xc7\x45\x79\x9c\x8a\xfc\xc3\xff\xcf\xbe\x4c\x47\x94\xd0\xb8\x2f\xff\x29\xb4\x8f\x3c\x17\x3c\x8c\xf3\x45\xa7\xe9\x34\xba\x27\xf9\x7e\xf2\xa6\x4f\xd4\x95\x87\xc8\x0e\x0a\x89\x14\xe4\x0d\x25\x9b\xcb\x71\x3a\xbe\x82\x3f\x34\xf1\xf3\xfa\xf5\x50\xc9\x79\x2d\x73\xdc\x0f\x99\x29\x05\x1b\xa0\x9d\x85\x69\x5c\x20\xa9\x34\x46\x21\x76\x97\xef\x8a\x69\x62\x0d\x27\xd0\x19\xba\x1a\x76\x86\x20\xac\x3d\x52\xb4\x54\x05\xbd\x3e\x4f\xcc\x83\xee\x3e\x5c\x40\xa9\x8d\x95\x29\x0e\x4b\xa2\x7d\x3f\x54\x72\xd5\x49\x6b\x4e\xdd\x46\x8e\x08\xf7\xb7\xc6\x43\x52\xbb\xa9\xe7\xda\xf3\x56\xd3\x4a\x76\x73\x8a\xc1\x03\x2d\x9c\xdf\x78\x7c\xb2\x5f\x7a\x77\xaf\xbd\x61\x60\x96\xc4\xfc\x60\xd1\xe0\xcd\x22\xb0\x2b\xc7\xc8\xea\x15\x52\x55\x2b\xf1\xd2\x01\x42\x82\xdc\xa1\x5b\x87\x1c\x4d\xd4\x58\x1f\x78\x4d\x66\x9f\x32\xed\x57\x38\xc7\x78\xda\x0b\x93\xe5\x9c\x2a\xd0\x23\xa2\xef\x9e\x54\x4e\xdb\xb2\x1b\xba\xf1\x8a\xa3\xf6\x78\xd2\x3b\x06\xf7\xaf\xac\x21\x91\x82\x68\x7a\x25\x3e\x5f\xbf\xfa\x41\xa9\xbb\xd0\x52\x09\xcf\x6e\xdc\x19\x86\x0b\xe3\x87\x02\x0b\x19\xf3\x72\x04\xc9\xc1\xd0\x0a\x68\x4f\x04\x18\xc3\x20\x30\xb8\x54\x4e\xfe\xc8\x7a\x8f\x20\xa2\xf9\x60\x64\x77\x0e\x35\x88\xb1\x2c\x1d\x6b\x1d\xd6\x97\x02\xfe\xc0\x3b\x00\x36\x01\x50\xcf\x49\x12\x69\xbd\x5e\x7a\x89\x4e\x1b\x9e\xa6\x9c\xb3\x4e\x5e\xc7\x23\xdd\x09\xe6\xf7\x6c\x67\x33\xf0\x3e\x3f\xf9\x82\x1d\xee\x16\xfa\xf3\x7c\x53\xa8\x4f\xef\x0a\x10\x88\x9d\x10\x4c\xe0\xfb\x59\x0e\xf2\x85\x4e\xd4\x19\x1b\x30\xde\x9b\x2f\x4a\x49\xbe\xd4\xfd\x96\xad\x6f\x69\x37\xec\xf0\x08\xaf\xf7\xb2\x1f\xdb\x22\x64\xfe\x32\xfa\xe9\x45\xc5\x02\x53\x93\xdb\x8e\x60\x4b\x91\xc2\xac\x9d\xa7\xef\xfb\x2d\xbd\xf4\xf1\xf1\x46\xc7\x83\xc4\x2c\x6f\x5b\x2c\x8c\xf0\x18\xc5\xdd\x6e\x0b\xf6\x60\x13\x8e\x67\x2d\x24\xb6\x15\xa1\x61\xbf\x77\x7e\x03\x21\xf8\x14\xb1\x65\x68\x48\x36\xdf\x86\xaf\x23\xb4\x80\x23\xec\xdd\x68\xd6\x39\x23\xd4\x06\x10\x77\xaa\x34\xb4\x71\x09\x1c\xc1\x09\x02\xd0\x4f\x78\x2c\xd8\x28\x77\xe3\x94\xd3\xcf\x87\xad\x7a\x2c\xf2\x2a\xbf\x48\x8b\x7a\x53\x51\x82\xc4\xcd\x81\xe7\xce\xd1\xb5\xf7\x88\xd9\x5d\x8a\x01\xa0\x01\x28\x4e\x7c\x3e\xbe\x51\x6b\x33\x70\x43\x09\xe6\x53\x69\x16\x95\x7a\xaf\x3d\xae\x1f\x67\xfa\xcb\x6d\xe4\x67\x19\xb6\x6b\xb6\x68\x1b\x6d\xc3\x78\xc5\x19\x33\x5a\x1f\x6b\xba\xe2\xc6\x4b\x22\x40\xd3\x84\xac\x9c\xcc\x13\xbd\xed\xe0\x9e\xf7\x53\x5a\x5d\x65\xc5\x99\xfb\x33\x1a\x9e\x7e\x22\x6f\xde\xc4\x37\x2a\x56\x9e\x91\x70\x00\x7e\x07\x20\xdc\x95\x72\x32\x01\x9c\xfb\x1d\x54\x9f\x34\x4c\x13\x71\xb5\xbe\xcd\xd2\x35\x4d\x9c\x58\x0a\xc3\x90\x46\x78\xf0\xea\x33\xff\xf5\xb0\x10\x23\xf4\x56\x9f\x47\x28\x98\x4b\xfc\xe6\xd9\x9a\x7d\xe6\x80\x7c\x20\xdb\xae\x0f\xd3\x3d\xd8\x13\xbd\x8d\x3f\x77\x11\xa8\xfa\x65\xce\xb9\xee\xdc\x5e\x48\x30\xb0\x9d\x89\x69\xde\x70\xc5\x55\xd6\xd7\x1b\xd3\xec\x1c\x02\x1b\xb0\xbb\x75\x2b\xbd\xa1\x13\x84\x30\xcf\x0c\x71\x4f\x0e\x2d\x6b\xd1\x8e\x3c\xfb\xee\x7b\x45\xc9\x75\xba\x1f\x07\x63\xcb\x60\x74\x9e\xdc\x2f\xfe\xfe\x4e\xd3\x3e\xd3\xc8\x3c\xdd\xfe\x92\x70\xfb\x07\x47\xa5\x6d\x75\x67\x40\xbb\x00\xd9\xe2\x8d\xd9\xa8\xd3\x78\xd0\xb9\x8d\x98\x30\x07\xd8\xa8\xc5\x01\x36\x3c\xee\xf5\xa2\xf8\x82\x14\xb8\x70\x0f\xf2\x9d\xb6\x1b\x4c\xb7\x87\x01\x9f\xaa\x6d\xdf\xb6\x51\xc9\x01\xd3\x87\x3e\x33\x6e\x44\x9d\x9e\x3e\xb8\x53\x82\x9d\x49\xf5\x89\xf3\x7d\x69\x84\x89\x7f\xc5\xe3\xae\x9d\xf5\x20\x26\xd7\xaf\x34\xca\xc1\x65\x87\x5f\xcb\x3c\xc8\x91\xe7\x43\x1c\xdf\xdf\xf9\x2b\xe1\x1b\x40\xc1\x0e\x18\xec\x5c\x62\x9e\xad\x8f\xa7\xf6\x26\x98\x96\x06\x48\x84\xa7\xfd\x48\x3e\x6b\x9c\x69\x99\x15\xf6\x8a\x8c\x3c\xa0\x18\xec\x1f\x76\xe5\x35\x01\x10\x6a\x78\xc3\x78\x2d\x33\x78\x4f\x8c\x3e\x03\x86\xd9\xaf\x4d\x16\xd7\xf9\x61\x2e\x39\xff\x2c\x02\x9e\xb3\xf7\x44\x0a\xb3\x25\x38\xbc\x37\xfd\xaf\x97\x91\xcc\x70\xa8\x3f\xdb\xee\xf2\xc2\xdf\x57\x97\x4e\xd0\x64\x4d\x1c\x1d\x04\xf9\xe0\x32\x04\x26\x38\xbd\xcd\xe3\xd5\x11\xd8\xc7\xc9\x99\xb2\x07\xcc\xb9\xec\xfe\xfc\x34\xef\xf8\xd4\xed\x06\x8d\x0c\xe1\xfe\x30\xa5\x1f\xef\xc4\xf8\x11\xc7\xc7\x37\xc7\x11\x0a\x00\x42\x43\x73\x80\x15\xa1\xbf\x7f\x22\xaf\x9d\x11\xfa\xdc\xf3\xe4\xb1\x87\xa5\x40\xcc\x58\x87\xf3\x42\xb4\xe1\xeb\x14\x61\x63\xe0\xb8\x6f\x39\xe4\x7e\xef\x25\xf7\xd4\x50\x48\xdd\xa8\x3b\x73\xdc\x9c\xb6\x34\x13\x2e\x5a\xb5\x16\x82\x37\xce\x11\x03\x28\xc6\x63\x09\x8d\xb3\x9c\x1b\x5a\xf3\xb4\xcf\x04\x00\x85\x81\x61\x27\x33\x87\x35\x87\x33\x52\x1b\x1d\x8d\xa3\x9b\x91\x52\xf9\xad\x71\xf1\xf2\x09\xf4\xce\xdf\x7b\xdb\x27\xfc\xcc\xc7\x32\x6f\x5b\x23\x62\xdd\x19\x00\x95\x18\xe4\x0a\xc2\x05\xc7\x26\x1c\x1e\xd8\x71\xde\x8f\x48\x18\xa6\xe9\xb9\x8b\x82\xfa\xeb\xa9\xfa\x70\x88\x7d\xc6\x5a\xb4\xb3\x42\xf5\x3a\xc3\x2e\xec\xb2\x83\xcc\x3e\x8a\xaa\x73\xce\x12\xed\xbb\x0e\x99\x3b\xc0\x34\x2a\xe7\x46\x6d\x5f\xe1\x04\x10\x84\x81\xe9\x8a\xf3\x5c\xa7\xea\x8a\x39\x69\x0c\x9c\x29\x97\x9f\xfc\x6c\x69\xfc\x6f\x86\x8a\x5e\x85\xb8\x4a\x0e\xa8\xbe\x07\xcc\x12\xb2\x73\xf3\x5d\xf3\x94\xc8\x89\x95\x21\xe8\x7e\x99\x25\xeb\xd6\x3f\x6b\x4e\x68\x82\x3e\xa2\x27\xa3\x63\x3b\xc5\x63\xe6\x20\xfe\xab\x2f\x2a\xdd\x34\x75\x53\xdf\x24\x3a\x26\x20\x53\x8a\xfc\xc2\x13\x1e\xa9\x83\x69\x29\x60\xc0\x8e\x2c\xfe\xac\x77\x2b\x9f\x27\x14\xc8\x01\x46\x40\x40\x92\xc3\x3c\x9f\x26\x5e\x6a\x7b\x4e\x48\x1f\x7d\x44\xb7\x1a\x6f\x0d\x1b\x25\x13\x5d\x38\x43\x3c\x93\x00\x03\xf4\x0c\x40\x3e\x05\xe1\xec\x79\x99\x5e\xa1\xf9\x4e\xd0\x31\xc1\xf4\xf8\x4d\xe7\x36\x7b\x97\xa3\x2b\x8f\x8c\x07\x36\x55\x3f\x8f\x96\xbe\x18\xef\xe3\xba\x58\x4d\x07\xbf\x5a\x77\xfe\x69\xfa\x02\x81\xb9\x41\x90\x46\xc4\x73\xa0\x75\x5b\xf2\xbb\x8f\x42\xe6\x06\x05\xf6\x35\x26\xe0\x79\x80\x20\xb4\xfa\x6c\xe7\xc7\x29\xde\x09\xa0\x73\xda\x57\xc9\x1f\x68\xd1\x35\x70\xc3\x77\xac\x95\x35\x1f\xac\xab\x9d\xa2\xbe\x99\xe2\x99\x90\x42\x46\xa7\x00\x88\xb3\x1d\xdf\x08\xdc\xa9\x89\x9e\x00\xe0\xc9\x81\xbb\x07\xa0\xa3\x51\xa4\x71\xd2\xe1\xcb\xa4\x08\xae\x9f\x9e\xc2\x0b\xef\xcd\xa3\xac\x6d\xdf\xa4\xd3\xe5\xae\xf0\xf3\xf7\x2e\x79\xcf\x1f\x32\x83\x29\xed\x75\x9c\x8c\xf0\xd8\xf7\xd9\x0c\x29\x7e\x1c\xba\x3d\x34\x00\x10\xf7\x1e\xec\x2f\x0a\x77\x43\x65\xe6\xa5\x7d\x97\xa7\x09\x61\x28\x32\xfe\xf9\x3c\xe9\x66\x21\x17\xaf\x1d\x62\x98\x93\xde\xba\x46\xfc\x1c\xa2\x77\x6d\x92\x88\x6c\xa8\xf2\x3c\x33\x7d\x87\x80\x3c\x13\x41\x25\x2d\xdf\x97\x3c\xec\x07\xf0\x01\x73\x11\xe0\x5e\x09\x72\x66\xfd\x86\x6e\x9d\x09\x41\xe0\x3c\x96\x25\xb6\x31\xe1\xec\xfb\x34\xee\xbb\x05\xda\xfd\xf6\x0d\x3f\xc3\x66\x7a\x6c\x69\x40\x90\xe4\x3a\x11\x26\xac\x28\xb1\x48\xad\xe7\x48\x3a\x02\x60\xc2\x72\x3b\xfd\xde\x6a\x79\x87\x00\x20\xa1\x00\x73\xd3\x18\xbc\x37\x88\x56\xf5\xad\x66\x35\x03\x90\x73\x8c\xad\x8c\x40\x20\xa2\x49\x5d\x13\x67\x5f\xef\xba\x3c\xb8\xc7\x78\x46\x40\x94\xb8\x7d\xdf\x6f\xd5\x4b\x8b\x90\x75\x02\x84\x97\x32\xcc\x8d\xda\x0b\xf1\xaa\x19\xfd\xe7\x1c\x5f\x62\xce\x9d\xe5\xa9\x34\x93\x35\x13\xc4\xe6\x3e\xed\xc7\xfa\xcb\xa5\x78\x29\x5c\xfc\x93\x4a\x7d\x0f\x0b\x82\x3c\x86\x9a\xa4\x14\x4b\xf6\xf9\x0c\x7b\xbb\x2c\xcb\xb6\x01\xf0\x7c\xd2\x34\x7b\xed\xe6\x89\x8e\x72\x6b\x31\xcc\xbd\x67\x10\xa1\xfa\x04\xc8\x80\xfa\xae\xf8\x9d\x7e\x86\xfd\x63\x21\x00\x6a\xb6\x78\x65\x3b\x57\x88\xc9\x5b\xa0\xfd\x88\xd9\xc1\xbc\x03\xc0\xb4\x3b\xb8\x94\xf7\x56\x61\xcb\x26\xd0\x34\x02\x01\x29\x0a\x6e\x84\x05\x8a\xb1\x50\x6f\x71\x17\x22\x1a\x67\x83\x4c\x22\x76\x6d\x17\x69\xee\xfc\xfe\x6a\xcb\x03\xe5\x23\x36\xb3\x5d\xe6\x69\x12\xa5\x73\xf5\x67\xc5\xb4\x24\x11\xd1\xa7\x22\xb9\x1a\x66\x00\x8c\xd9\x07\x7b\xbc\x83\x85\x6e\x84\x6f\xb7\xb8\xdb\xce\xeb\x77\x9e\x01\xf6\xc1\xc9\x58\xb6\xbe\x7b\x04\x45\xbd\x12\xbd\x60\xb8\x8e\xf9\xe0\x65\x84\x70\x53\xdd\x81\xcb\x80\x24\x0d\xa0\x98\x35\xa4\x08\x00\x50\xdf\xf7\x2d\xd3\xca\xf6\x05\x82\x1d\x10\x00\xc0\x1d\x80\xd1\x07\x4c\x48\x02\x5e\x34\xe0\xb4\xe2\xe4\x3d\x4b\x95\x29\xa1\x43\x3c\x13\x4b\x5a\x3d\x31\xf5\x77\xe6\xa8\xc8\x8a\x3b\x61\xb9\x8b\x69\xdf\x20\x9d\xeb\xde\xef\x8b\xb2\x61\xbb\x60\xa8\x65\x22\x47\x38\x68\x10\x3d\x49\x9a\xeb\xb6\x6b\x9f\xe4\x0d\xe7\x8c\xd8\xe9\x94\x21\x88\xfd\x66\x00\x1b\x06\x39\x17\x04\xc3\x73\x67\x6c\x8a\x72\xbe\x95\x13\xcd\xfb\x0c\x84\xb3\x0a\x71\x26\x1d\xd7\x6a\x7a\x13\x9a\x9d\x02\x84\xe8\x73\xc0\x4e\x00\x5c\xed\x45\x94\x96\x29\x6d\x3b\x01\x19\x02\x90\xa8\x93\x6e\x5b\xee\x78\xce\x71\x90\x9f\xc7\x10\x6e\x7e\xcb\x52\xc1\xdc\xae\xb1\x87\xcd\xc2\xf7\xd0\xf2\x66\xf6\x41\x23\xbb\xff\x40\x24\xe5\x49\xfb\x28\xd1\x15\x14\xfd\x38\x4f\x72\xfe\x04\x7d\xc4\xcc\x51\x77\xa2\xa6\xe5\x26\x76\x91\xf2\x34\x93\x27\x7a\xd7\xb6\x27\xc9\x64\xdd\x79\x25\xad\x72\xa0\xf9\x0c\x41\x0d\xe8\xe6\x06\x08\xcd\x00\xaa\x63\x26\x5a\x9f\xf5\x24\xc3\xb5\x3a\xb8\x21\xc3\x36\x7d\xd9\x21\x4c\x13\x7a\xcf\x82\xd5\x24\x05\xab\x3a\x39\x18\x66\x33\xad\x60\x0e\xa6\x37\xc3\x0c\xb5\x10\x34\x99\x2e\x3c\x79\xc0\x43\x45\x6e\xad\x1d\x20\xd1\x0e\xb6\x5d\xd0\x6b\x3b\xbe\x35\x31\xa7\x4e\xdb\x30\xb8\x82\xd4\xf9\x5e\x5d\x26\xe8\xd2\x18\x85\xc6\x84\x47\xfa\xd7\x79\xaa\xbf\x5a\x06\xe5\x45\x46\xdd\x38\x71\x25\x8a\x04\x6b\xcd\x91\xfb\x20\x3c\xd7\x34\x05\x4f\x4a\x43\xd9\xd3\xea\x99\x89\xde\xea\x05\x61\x37\xde\x6b\xd7\x08\x21\x56\x3a\xec\xcc\xe6\x69\x22\x25\xbe\xdd\x00\x76\x09\x60\x81\x0d\x20\x49\x4d\x58\x74\xb9\x92\xba\xf2\x14\x44\xea\xda\x46\x4f\xcd\x0e\x73\x1c\xb9\x36\xd7\xea\x9c\xab\xf3\x9c\x54\xf0\x82\x70\x51\xb1\x6e\x03\xf2\x34\xd1\x34\x60\x83\xe8\xa7\x14\x20\x7b\x4d\x9e\x0e\x50\x3c\x6c\x0d\x76\x80\xb8\x39\x50\x3b\x7f\xef\xec\xe6\xc4\xc0\xa5\xdd\x05\x0a\x0d\xdb\xde\x6f\x7b\x49\xf8\xdd\x9b\x15\x66\x41\x9b\x35\x20\xf1\x27\xde\xb4\x4c\x94\x62\xef\x7f\x7c\x5a\x44\x32\xc9\x94\x66\xcf\x73\x78\x29\x1c\xe7\xc7\xca\x46\x16\x10\xb2\x0f\xbd\x9b\x28\x79\xa3\xaf\x9f\x04\x69\x3f\x80\xcd\x22\xb9\x51\x1d\xe2\x5b\x95\x9f\x0f\x31\x66\x98\xfb\xbe\xe7\x7d\x4f\xe6\x3d\x1d\xa7\xbd\x27\x2d\x4d\x10\xfa\xfa\x18\x7c\x89\xcc\xb1\x6e\xc5\x6a\x40\x17\x17\x74\x5c\xd7\x0b\xe3\xed\xdb\xdb\x14\xc3\xa2\x5f\xb0\x67\x84\x60\x8f\xfd\x97\x56\x92\xea\xbb\xcd\x1b\x63\x80\x6e\x24\x98\x1e\x29\xcb\x5d\x4d\xad\x75\x60\x0a\xe5\x02\xfe\xbe\x19\x3e\x4e\x13\x54\xcd\xc9\xc1\x7c\x8d\x04\x60\x4b\x82\x06\xfd\xe1\xe8\x61\xf3\xeb\xbd\x72\x1c\x3d\x0a\x90\x9d\x3f\x49\x36\xd1\x74\x78\xef\x00\x22\x79\x6c\x9b\x52\x4b\x79\x04\xce\xb8\x37\x85\xe8\x86\x91\xc7\xd1\x44\xb3\xae\x6a\x9b\xc9\xe6\x2b\x6d\x79\x53\xec\x79\xe1\x04\x31\x4d\xd3\x54\xb6\x73\xf7\x3e\xba\x1d\x08\x5a\xcc\x12\xea\x2d\xc5\x12\x42\x6f\xd8\x98\x39\x77\x0f\xa8\x7c\x1c\x56\x94\x22\x2f\xad\xae\x09\x9c\x96\x75\x90\x19\xf3\x1f\xb7\xeb\x60\xc0\x9e\x4e\x68\xcd\x33\xd3\xd2\x24\x85\x11\xfe\x7c\x6e\xbd\xdb\xed\x3c\xf3\x53\x5a\xee\xde\x3e\x47\x7c\x33\xd2\x2c\xcd\x9c\x55\x83\xe0\x8d\x0e\x81\xf5\xab\x4b\xe5\xb8\xd7\xa5\xd6\xc3\xca\x30\x37\xe1\x1d\x78\xc4\xde\x65\x34\x4d\xf3\x0f\x6e\xbd\xd9\xee\x8a\x35\x5a\xbe\x93\x5b\x35\x8c\x5d\x55\xa9\x2d\xcb\x11\xa1\x38\x02\x9d\x07\xb9\x94\xb9\x58\x4a\x80\x2f\xfa\x83\x33\x99\x38\x23\x56\x26\x0a\x10\x82\xa2\x28\x38\x37\xab\xc7\x64\x2e\xe6\xee\x4b\x5d\x40\x18\x68\xc4\xe7\x43\xad\x04\x90\x5a\x95\x5a\x5d\xdf\xef\x7b\xbc\xf3\x32\x3c\x86\xeb\x46\xbd\x34\x57\x67\x16\x3a\x66\xee\x71\x5c\xd7\x6d\xbb\xb1\x2f\x6f\x3f\x77\x98\x28\x25\x2b\x40\x48\x52\xfb\x99\x69\x57\x70\xdc\x4d\x52\xd7\x00\xa0\x23\x08\xee\x54\xf7\x84\xb8\x78\xfc\x72\xf4\xf7\x07\x81\x9b\x69\xeb\x44\xbe\xa9\xdb\x79\x60\x0c\xb1\xe3\x05\xe1\xef\x11\xfb\xa6\xeb\x80\x35\x8c\x5b\xbe\x2e\xb8\x13\xb1\xd4\x32\x14\x0d\x2f\xcf\xba\x58\x8d\x7f\x48\x82\x8b\xa6\x9f\x93\xc2\x42\xd7\xdf\xf3\x7c\xc2\xbc\xd5\x6b\x51\xee\xf3\x2c\x02\x61\x07\x09\x30\xae\x8a\x38\x55\x6d\x5b\x01\x90\x04\x80\x3f\x79\x7b\x2f\xfb\x97\x1a\xd5\x31\x73\x22\xdb\xba\xef\x06\xc3\xaf\x1d\x11\x87\x65\xd6\x8b\x0c\x52\xc9\xfc\xee\xcf\x33\xc1\x5e\xd5\x9e\xa5\x10\xc3\x2c\x2a\xd9\x94\x40\x08\x73\xa4\x32\x4d\x62\x53\xb3\xe2\xba\x4e\x4f\xa6\x40\x1c\xc6\x33\x53\xb2\x46\xb0\x44\x56\x61\xfc\x6a\xc5\x45\xed\x33\x40\x7d\x07\x30\xc0\x02\x85\x8f\x55\xd2\x33\x43\xb0\x89\xbe\xd1\xa6\xb6\xef\xa2\xd7\x33\xb8\x05\x12\xec\x38\x93\xee\x00\x9b\x19\x88\xfc\xa9\x95\x03\xda\xe3\x81\xc3\x0d\x59\xbd\xc7\x18\xa4\xa2\xd1\x8d\x60\xb4\x79\xfe\x6e\x9a\xa1\xe7\xb6\x96\x6b\x8f\xce\xd1\xb1\x08\xb1\xe7\x1d\x44\x53\xf9\x50\x09\x5c\x9c\xdd\xeb\x06\xb8\x86\x11\x6d\x72\x19\x03\xb2\xd3\x4d\xa2\x0b\x10\x61\xd2\x8d\x00\x39\x18\xd4\x3f\x5e\x6b\x03\xe8\x1a\xef\x45\x13\x1b\xbd\xcd\x09\x4b\x44\x6b\xb4\xfa\x33\xc3\x0c\xc3\xb0\x25\x4a\x9b\x4b\x1f\x7d\xfe\x92\x89\x6a\x80\xcd\x2c\x8f\x83\xf2\x3d\x6c\x67\x4a\x0c\xb0\xfb\xbb\x8b\x91\xef\x73\xff\xed\x47\x71\x9c\x0e\xeb\x94\x30\x0c\x1f\x55\x8e\x83\xf1\xdf\x1a\x04\x19\x00\xc4\x86\x44\xdb\xb2\xcb\xcf\xe4\x56\x6f\xe9\x60\x13\x4f\x3a\x12\xe1\xd9\x64\xbc\xb9\xc4\xdc\x37\xe0\x54\x46\xbd\x45\x9b\x6b\xdc\xef\xd5\x39\x45\x07\xbd\xd3\x73\x5d\x57\x43\x91\x43\x2f\x59\xd0\xb3\x60\x87\xae\xeb\xba\x7f\x2c\xde\xbe\x04\x76\x5b\xe8\x6a\x51\xc1\x22\xa7\xee\xcd\x88\xae\xa6\x30\x0c\x8d\x6f\x6b\x8b\x9c\x11\x93\x20\x9a\x80\x4d\x67\xe6\x87\x22\xf0\xea\xaf\xa5\xfb\x42\x15\x7e\x60\xce\xb0\xf5\x71\x69\xdc\x17\x55\xed\xf7\xa9\xdf\xea\xcd\x1f\x47\xf7\x3e\x9a\x66\x69\x1b\x79\xf4\xac\xd0\x6d\x5d\x37\xc1\xbb\x2c\x46\x91\x1e\xe6\x33\x0b\xf6\x99\x47\xe6\x99\x46\x26\x5f\xab\xa8\x35\xc2\x91\x7d\xa2\x97\xf9\x8a\xa5\xb7\x38\x0a\x00\xac\x11\x71\x20\xbc\x18\x38\x39\x4b\x24\x10\xd9\x66\xaf\x2d\x33\x47\x95\x02\xed\x9f\xe6\xd5\xb3\x10\x3e\x84\xbf\x83\x7e\x65\x48\x5a\xad\x9f\x25\x7e\xca\x7b\x9e\x41\x57\xd3\x20\xf5\xa0\x92\xf5\x4d\xd0\xad\x0d\xe1\xc9\xf8\x77\xdb\x0b\x76\x14\x33\x5f\x04\x41\x8c\x46\xde\x29\xc4\x1e\x9c\x6b\x9b\x1e\x80\xa5\xe4\x1f\xfc\x45\x46\xe9\x62\xff\xd4\xd7\x34\xcf\x52\x5e\x1e\xa0\x15\x4c\xce\xff\x82\xe2\xc1\x71\x96\x24\xa1\xe7\x91\x80\x40\x71\x22\x08\xf7\x21\xa2\x11\x80\xa6\x7b\x6c\x22\xbe\xf2\xb5\x8f\x2c\x47\xee\x53\x62\x47\x56\xc4\x1f\x55\xe3\xd7\x0b\x6b\x25\x6a\x76\x3e\xb6\xaa\xdb\x85\x7b\xc4\xf8\x72\xd3\xf0\x0d\x10\xb8\x87\x23\x25\xf3\x2a\xce\xdf\xfd\x91\xb7\xba\xfa\xf1\xd8\x00\xcf\xf3\xf9\xbe\x7f\x9f\x14\x43\x4e\xde\x47\xbb\xb1\xcf\xdb\xbe\x19\x0c\xea\xe7\xd2\x70\x53\x62\xac\x58\x7e\x97\x58\x77\x2d\x39\x89\x18\xd5\x7d\xdf\xd8\x4e\x3d\x3f\xfb\xbe\xf5\xfc\xbb\x2f\x1e\x8a\xf0\xd0\x7f\x63\x58\xfb\x6c\xbb\xfe\xa1\x7b\x16\xf6\xb8\xce\xbf\x8e\x8c\xab\x6d\x70\x39\x60\x92\x5b\x26\x41\x53\x1d\x04\x39\x2d\xbf\xf5\xe4\x8e\x00\x30\x14\xa9\x61\x08\x67\x08\xbe\x6d\xc3\x76\x82\xd0\x93\x68\xeb\x0c\x71\xba\x58\x1e\xb5\x85\x8a\x82\xb5\x02\xe5\x7e\xe8\xdf\xd9\xe7\x3b\xb6\x35\x1d\xe5\x18\x06\xa4\xd7\x4b\xcd\x74\x7f\x5e\x28\x37\xcd\xc6\x5c\x6e\xa7\x1e\x16\xa4\x94\x1b\xc6\x7b\x49\xef\xa5\xec\xa0\x93\x64\xd9\x75\x04\x21\x97\xc2\x28\x95\x30\x10\x25\x00\x01\x7d\x80\x28\x65\x69\x62\x5f\x87\x0a\x48\x23\x0f\x38\x79\xb8\xac\x5f\xec\x5a\x4d\x2f\x66\x02\x2a\xfc\xd0\x28\xc6\x0e\xc5\x1e\xfb\x0c\x45\x6b\x9f\xda\x55\x18\xb4\x54\x8d\xb2\xbf\x6f\xd4\x7a\x85\xdc\x89\x10\xf9\x7b\x68\xdf\x02\x71\x0f\xa4\xff\xa5\x6d\xab\x95\x6f\x2a\x5a\xbd\x03\xa0\x02\x67\x5f\x95\x96\xee\x9b\x4c\x4f\xd3\x30\xff\xff\xef\xdf\x0c\x1c\xc7\x19\x2c\x8b\x31\x5e\xd8\xf9\x53\xa2\xe8\xa0\x1b\xa7\x8a\x9d\x9c\xa6\x61\x1b\x16\xa8\x65\x3d\xb8\x2f\xd1\x99\xef\x94\xd4\xb9\xaf\x42\x30\x14\x27\x38\x83\x6a\xa5\x4c\x46\x41\x10\x84\xba\x69\xe2\xe7\x14\xf5\xf7\xee\xba\xa9\x95\x85\xdf\xe9\x5f\xbf\x50\x21\x60\xf2\x80\x61\xf6\xaa\x90\xde\x1d\x2f\xd8\x6f\xaf\x82\x00\x90\x47\x4a\xb9\x5d\x32\x66\xd9\x3c\xfa\xc0\x4a\xf5\xc6\x49\x89\xa5\xd7\xfd\x78\x23\x62\x0d\x93\x05\x67\xe6\x4f\xd5\x7e\x7f\x0f\x16\x34\x0b\x1a\xc1\xfb\xfb\xb1\x53\x15\x41\xb6\x37\x53\x2b\xe7\xf7\x71\x04\xbf\x18\xf0\xa3\xe2\x57\x5d\xd0\x9c\x00\x0a\x5c\xb5\x7b\x8a\x7c\xab\x46\x78\x8b\x61\xd5\xb2\x2f\xbf\xef\xb1\xd5\xc5\x19\x88\xbd\x84\x17\xb1\x77\x78\x96\x18\x42\x3d\xbe\x05\x67\x7c\x48\x4f\x99\x02\x6c\x62\x9c\x9d\x74\x8a\x07\xa4\x51\x12\x25\xfe\xfc\x63\x85\xfe\x72\x54\xe3\xd7\xcf\xf3\x24\xfc\x78\xfe\x63\x3f\xef\x04\xd9\x12\x81\x1d\x7b\x43\x00\x26\x6b\xa3\x4f\x3b\xc7\x8c\x78\x37\x18\x6e\x3c\xc3\x6c\x38\x88\x83\x85\x7b\x61\x3f\x48\x9d\xc3\x54\xc1\x71\xa6\xde\x79\x1c\x2c\xa2\x71\x0e\x8c\x33\xf3\xb9\x31\x1b\xad\xb4\x10\xf0\x89\x2b\x44\x96\xfa\xcb\x79\x1b\x5a\x1c\x52\x88\x50\x8e\xeb\xba\xe2\x01\x68\xac\xdd\x99\xea\x13\x6a\x73\x9c\x11\x0c\xd9\xe5\x20\x38\xe8\xfb\xa3\x4e\x6d\xce\x9c\x8f\x1b\x09\x47\xa3\x43\x22\xcf\xbb\xf1\x24\xc9\x72\x5a\x02\x81\xca\x89\x05\x31\x41\x62\x80\x2c\xf2\x56\x1d\xe1\xf2\x7e\xb5\xf6\x0e\x6f\x61\xab\xed\x10\x04\x61\xd5\xc7\x37\x85\x30\xf6\x7d\x9f\xd8\x61\x1a\x8c\xbb\xb9\xa3\xdc\xe3\x86\x08\xfb\xca\x47\xed\x8d\x5d\x49\xf9\x92\x4c\x9d\x81\xa4\x8f\xdf\x0b\xa3\x3b\x47\x6f\xa2\x7e\x0e\xc6\x9b\xa0\x10\x56\x7b\x96\xe2\x01\xa7\xd5\x1d\x88\x7c\xb3\x39\x7b\xca\x6c\x64\x32\x9a\xdf\x59\xad\x38\xef\xec\xee\xf9\xb3\x7b\x9d\x84\xfe\xe2\x8c\x1d\xbc\xaa\x1f\x28\x85\xf6\xe7\xed\xb9\x64\xa8\x9b\x02\xbc\x91\xaf\xfd\x0a\x46\x33\xa2\xba\x90\x34\x08\x60\xbc\x10\xe7\x55\xbe\x65\xe7\x7c\x63\xc0\xeb\xfb\x9d\xf9\x10\x73\x8e\xf3\xfe\x9d\x44\x34\x42\x6d\x13\xbe\xb6\xf9\x54\x0b\xbf\x3d\xd5\xd7\x9b\x95\xde\x06\x81\x7d\x5a\xe4\x63\x14\xf9\x2e\x28\x21\x11\xef\xe4\x97\x37\xc6\xfa\x8d\x18\x3b\xc3\x21\x08\x6d\x9c\x88\xee\x04\x1d\xdf\x8d\x53\x08\x32\x0d\x40\xd4\xab\x1c\x67\xac\x3f\x09\x8b\x80\x85\x37\x7a\x65\x50\x0d\x7c\x15\xb2\x7d\xe3\x69\x88\x7d\xd8\xf6\xd1\xff\xee\x35\xbd\xf9\x03\xc7\xaf\x04\xc9\xe7\xac\x8b\xbe\x41\x0e\xe9\x04\x64\x50\x21\x91\x47\xa3\xa8\x9c\x78\xb1\x83\xc6\xe4\x68\x85\x77\x74\x76\xb2\xf9\x3b\x27\x8c\x9d\x4b\xb8\x52\x95\xbf\x56\x4f\x83\xe1\xbe\x6f\x86\x38\xc7\x68\x7d\x96\xc0\x67\x80\x91\xe6\x69\xca\x5b\xa1\x1c\x3c\xc6\xaf\xf4\x9b\x8b\x5e\xe5\x14\x75\x03\x02\xd5\xb7\xc1\x0b\x20\x91\x28\x48\x67\xcb\xee\xcd\xa9\x99\x87\x0f\x9d\x2b\x40\xce\xb2\x0a\x25\x96\xc2\x8b\x7d\xa8\x31\x7f\xce\x10\xdc\x0c\x81\x8a\x65\x16\xce\xdb\x6a\x18\xbb\x8f\xb6\x13\x11\x73\x1c\xbd\x0d\x55\x91\x23\xb0\x4c\xb9\x21\xe3\x64\x87\xa3\x1a\x05\x5c\x6d\x04\xbf\xcf\x7f\x9e\x47\xd4\xc7\x29\x3a\x75\xc9\x14\x00\x28\x54\x41\x30\x7c\x86\x2d\x5f\xa6\x34\x5b\xe8\x6a\x8b\xfc\x03\x69\xe8\x74\xdb\xa0\x60\xa0\x64\xf3\x1e\xad\xca\xe1\xe5\xd3\x53\xc1\xf3\x8b\x61\x69\xef\xd0\x96\x63\x7c\x9a\x05\x36\x7d\xbe\x4f\xb7\xe1\xef\xb9\xba\x33\xdf\x94\xb8\x8f\xc7\x9f\x9f\x1f\xcf\xab\x98\xff\x6a\x2f\x1e\xca\x93\x58\x99\x1c\xe5\x1e\x98\x66\xa3\x47\x90\xaf\x4c\xb6\x2b\xd4\x47\x4c\x15\x8b\x40\xb1\xf2\x21\x8b\x89\x2e\x00\x46\xfa\x1e\x48\xef\x54\xad\xec\xb8\x95\x64\xea\xd2\xe3\x66\x05\x7c\x6d\x23\xe3\x44\x55\xec\x94\x3e\xf2\x68\x52\x08\xa5\xf1\x59\x41\x66\xaa\x01\x2c\xd7\xc5\x4e\xe4\xb6\x5d\x5f\x3d\x9c\x41\xfb\xc1\xe8\xd8\xf7\x1f\xcf\xbc\x97\x93\x71\x37\xd2\x67\x00\xb9\x59\xbb\x19\x0d\x5e\xf0\x67\x9e\xcd\x10\x4d\x30\x68\x79\x92\x67\xb5\x28\x3a\x22\x5e\x01\xb8\xba\x2c\x17\x95\x32\x32\xc6\xa9\x25\xe2\xf4\x16\xdb\xee\xf3\xfc\xc9\x9d\xc8\x09\xc9\x84\x2f\x07\xdc\x28\xb9\x95\xc9\x88\x3c\x1f\x41\x1e\x4c\x4c\x71\x95\xdc\x6f\x3d\x7a\x7e\x34\xfb\x7d\xb2\x90\x80\xc8\x5b\xdc\x3f\x35\x07\x50\xb4\x72\x95\x7c\xcb\x6c\x81\xc8\x28\x5f\x3d\x5f\xef\x04\x85\xbd\xc0\xcd\xeb\x86\x3b\xc1\xfc\x91\x9a\xdd\x46\x70\x1c\x81\x8c\x26\x29\xb2\xe3\x9e\x75\x80\x1b\x04\x00\xf5\x13\x0f\xbb\x6a\x7d\xf8\xfb\x34\x5d\xec\xae\xe7\xc8\x8d\x33\x44\x42\x2e\xc3\xf3\xda\x8b\xec\x77\xde\x75\xc2\x3c\xc6\x88\x3c\xab\x05\x3a\xb7\xa3\x4c\x35\x7c\x57\x28\x01\x62\x0b\x06\x16\xc6\x1e\xbb\x2c\x9f\xb7\xf3\xb7\xa6\xea\xc2\xdd\xca\xf2\xf7\xbc\xcf\xcc\x9f\x63\xa6\xa7\xa4\x69\x77\xad\xaa\x93\xc9\xb5\x3e\x49\x92\x65\x91\xb6\x60\xfd\xe1\xdb\x21\x17\xed\xd3\x84\x0e\x20\xb3\x3d\xbf\xe2\x33\xfc\x0a\xcd\xaf\x67\x7f\xc5\xef\xbb\x07\x96\x2c\x47\xe4\xde\xcc\x7b\xd7\x75\x7d\x97\x23\xc0\x50\xd0\xab\x3f\xe3\xa2\xc7\x71\xc1\x4f\x7c\x15\xdf\x03\x1a\xf6\xfb\xb4\x5e\x83\x8e\xad\x9c\x9d\xff\xe0\x82\x15\xae\x9a\x1c\x5c\x0d\x0d\x86\x79\x66\x18\x1c\xdd\x22\xbf\x22\xbc\x12\x41\xae\x1e\xd0\x80\x3f\x27\x57\x7d\xaa\x83\xf7\xeb\x29\xc4\x17\xfb\x0e\x94\x69\x2c\xd3\x5c\x5e\x63\xf3\x07\xab\x82\x04\xfd\x49\x51\x8a\x5a\x6a\x65\x2d\xd1\x59\x81\x02\x96\xd1\x73\x29\x54\xc4\x62\x46\xa2\x4b\xf2\xa8\x64\x9f\x11\x87\xae\x55\x37\x89\x21\x3d\x0b\xfb\xe9\xaf\xa0\x66\xfd\x9b\x0d\x88\x04\x53\x2a\x67\xd5\x9c\xe2\xe7\x9d\xb0\x55\xc8\x66\x7a\x7f\x35\xf2\x3b\x23\xbc\x09\x23\x08\xc6\x3d\xa9\x60\x70\xed\x87\x2d\xf3\x7f\x7b\x68\xef\x27\x6a\x10\xe0\x9a\x4c\x94\x49\x4f\x7f\xa6\x55\x4c\xb3\xfd\x74\x03\x62\x6d\x50\xb8\x5a\x7d\x5a\xa7\x6b\x88\x1e\x29\x1d\x2c\x5e\x3b\x72\x66\xd4\x15\xa1\x77\xc5\xdf\xba\x49\xb0\xe8\x50\x36\x60\x7b\x86\x09\xf8\x92\x43\xec\x2f\xd5\x9d\x27\xbb\xa6\xd1\x17\xc2\xb4\xef\x04\x53\xe6\xb8\x6c\x42\x5e\x10\x88\x16\x4d\x7a\x79\xf2\x1e\x3a\xf9\x8b\xc9\x4d\xfd\xa9\xfe\xcb\xe9\xbe\x7d\xc4\xcc\xdc\x0d\x2e\x5a\xe4\xb3\x82\x75\xa2\x42\xc3\x36\x00\x1f\x02\xc1\xc0\x89\x72\xe6\x2e\x18\x79\xb5\x0e\x58\x80\xac\x75\x2d\x5e\x7a\xfd\xf4\x41\xcb\x37\xe0\xe0\x68\xc8\xdc\xd5\xe4\x7e\xf7\xf1\xcc\xa6\x79\xca\x68\xb8\xaa\x7a\x18\xf4\xc9\x42\x1b\xfd\x2d\x94\x48\x85\x2d\x7d\xed\xaf\x5c\x86\xc7\x1a\x81\x92\xc3\x16\xda\x4a\x18\x04\x44\x9d\xaf\x69\x9e\x24\x06\xca\x53\x85\xfc\xdd\x81\xec\xce\xd8\xe3\xaf\x2e\x4e\x94\xde\x6d\xb4\xcf\x17\xb3\x13\xb0\xc8\xfa\x89\x96\x1f\x9a\x38\x42\x15\x1a\xdf\x3f\xfe\x02\x11\xde\x0e\xae\xe9\x7d\xf8\x57\x53\xfb\xd0\x4e\x09\x46\xb8\xc9\xc6\xc9\x5e\x47\xfa\xac\x76\x81\x6c\xa2\x5c\xa5\x83\x66\x67\x51\x3a\xd8\x5b\xd5\xbf\x2e\x95\x9c\xc3\x4e\xd3\x83\x83\x24\x74\xdb\xc3\x20\x8d\x41\x2d\xf5\xdd\x36\xf4\xdc\x5e\xf6\x3e\x9f\xef\xc1\xe7\x40\x39\xc4\x7b\x25\x98\x6a\xae\xc6\xd5\x57\x94\x99\x68\xb0\x76\xdd\xc2\x8a\x7c\xbc\xc0\xfe\x8f\xc6\xf7\xd9\x35\xce\xd1\x31\x4c\x4f\xec\x83\xf0\x3c\x2c\x59\x1f\x22\xe5\x95\xb3\x89\x60\xc0\xda\xc3\x96\x11\xfd\xa8\xf6\xc2\xe8\xb7\xd1\x13\x33\x8d\x2b\x42\x5d\x11\x83\xb3\x5e\x04\x12\xde\x39\xeb\xb4\x86\x35\x4e\x94\x7b\x43\xce\xea\x91\x8b\x44\xf7\xba\xf6\x67\x65\x23\xc7\x75\xdf\xd6\xcf\xb6\xfe\x1f\x55\xd7\xb5\xeb\x36\xcf\x6c\x1f\x48\x17\xea\xed\x52\xbd\xf7\xae\x3b\x75\xc9\xea\xcd\x2a\x4f\x7f\x90\x7c\xc9\xce\x7f\x0c\x18\x89\x01\x6f\x52\x34\x87\x53\xd6\x0c\xd7\xa0\x16\x21\xee\x7e\xf5\x8d\x40\x9a\x3a\x86\x29\x21\x45\x4c\x28\xaa\x2b\x3b\x63\xed\x04\xc0\xcc\xb3\xa9\x22\x61\xc8\x7f\xf7\x6e\x25\xed\x46\x18\xf0\xfc\x46\x74\x9f\x6a\x1e\x76\x91\x1f\xcc\x76\xeb\xf2\x97\x1c\xfc\xd2\xc5\x52\xd8\x5f\x71\x59\xa1\x79\x4c\xbf\x10\xb6\x7f\xc5\x6a\x71\x27\xb6\x42\xe6\xec\x98\x1c\xb4\xb2\xab\xe2\x0c\x9f\x70\x03\xbf\x78\x79\x8e\xc9\x15\x2c\xf4\xa9\xde\x80\x09\x80\x00\x82\x6e\x61\x07\x4c\xb6\x81\xc8\xb4\xed\x43\x10\x05\xd0\xb5\x7f\x0b\x4f\xa5\x5b\xd8\x7b\x6e\x2b\x6e\xd7\xf6\x7d\xae\x74\xac\x7d\x18\xf6\xfd\xf1\x41\xa5\xc4\xfb\x04\xd9\x2f\xcb\x61\xdf\x54\x2e\x75\x9f\xdd\x38\xe8\x03\x06\x08\x04\xdd\x86\x45\x74\x41\x4d\x94\x58\x28\x07\xc0\xc9\x9e\x80\xb9\x96\x78\x7e\xef\xd4\xb5\x00\x0f\xc5\xfc\x82\x7e\x82\x3d\xd9\x81\x98\x99\xff\xa0\xc4\x0d\xbe\xa8\x28\x17\x96\x86\x97\xe8\xf7\x0b\x42\xc8\x87\xaa\x79\x2e\x7d\xb6\x9c\xcf\xc8\xbc\xfe\x22\xbe\x47\x9f\xfe\x1a\x7a\xb7\x0b\xab\x38\xa9\x0e\x13\xf8\x0a\x37\xe2\xa6\xe9\xa0\x31\x06\xf5\xc3\x81\x38\x0a\x17\x21\x7f\x41\x80\xaf\x9e\x62\x54\xb1\x1d\xe8\xb7\x3c\x1a\x8e\xe3\xfc\x66\x11\x72\x2c\xa9\x3a\x66\x65\xa2\xdb\xb9\x87\x2f\x75\x8d\xea\xc2\x67\x7c\x03\xe2\xb3\x75\x3d\x50\x39\xa5\x08\x40\x50\x42\xcb\x9d\x56\x87\xdb\x88\x10\xb6\xba\x45\xdd\x07\xf2\xfd\x43\x3a\xbf\x67\xbd\x69\xda\x43\x4c\x1c\x08\x52\x93\xff\xa6\x00\x75\x4c\x53\x0b\x1d\x74\x07\xd1\x1d\x15\x7b\xe8\x91\x23\x6b\x09\xe2\xac\x6c\xc8\x93\xf2\x2f\x2e\xb2\x57\xd1\x21\x54\x9c\x24\xef\xb3\x1e\xb9\x0f\x40\xd2\xd1\x2f\xc7\x73\x20\x08\xb2\x2e\x54\xd4\x27\x22\xb7\xd2\x3b\x2e\x7f\x2b\x32\x39\xab\x73\x78\xd3\xf3\x03\x85\x9d\x9b\xf6\x1b\x38\x03\x67\xb5\x81\xb2\x31\xae\x38\xf4\xde\x74\x41\x01\xeb\x9d\x4f\xb2\x14\xc0\x72\xfb\x05\xa2\x71\x84\xb3\x7d\x36\x51\xed\xc4\xbb\x6c\x9a\xc8\xf3\xfc\xed\x67\xce\xfb\x35\xf2\xbf\xce\x0c\x48\x17\x83\xbd\x6a\x9b\xf6\x65\xf8\x69\x6b\xc8\x1f\xfe\x5e\xe3\x5a\xe5\x0b\x04\xdf\x06\xdd\x27\xb6\x6c\xc5\x7c\x13\x13\x52\xce\x49\x33\xac\x40\x1a\xd4\xe1\xe1\x16\xc0\x6f\x8a\x9c\x04\x54\x59\xf2\xaf\x73\xdc\x1f\x22\x0a\xe9\x79\xe8\x7f\xa9\xb5\x38\x6a\x03\xae\xe1\x74\xb4\xad\x0d\x01\x08\x33\x85\xc2\xad\x13\xa5\x0c\xfa\xea\xbc\x5f\xee\x99\xb4\xec\x38\x73\x83\x27\xd4\xf4\xd4\xb9\x6c\x1b\x09\xe0\x09\x54\x10\x93\x2b\xb6\xb6\xb1\x13\xd6\x87\xc4\xbb\x04\xb8\x8b\xfb\xc2\xf4\x7f\x5c\x82\xcb\x52\xda\x4b\xfc\x92\x24\xa8\xe3\x34\x00\xa8\x77\x90\x2e\xda\x49\x23\x67\x46\x10\x00\x70\xa8\x3a\xbc\x88\xfc\x14\xcb\x10\xa1\x0b\xb1\x89\x50\x95\xd4\xce\x51\xca\x3f\xf5\xb7\xd6\x87\xe3\x9c\x6f\xe1\x8e\xaf\xbd\x44\x37\x1a\x4c\x50\xee\x3d\xa9\x77\x0c\x4a\x18\x01\xb0\x6d\x95\xda\x26\x34\x69\xbf\xbb\xa2\x0a\x44\x4c\xbd\x3c\x91\x1c\xa2\xc6\x00\x53\x8c\xa7\xb2\xef\x78\xaa\x4b\xe0\x21\x48\x5c\x52\x47\xf6\x6d\xbe\xff\xfc\xa5\xe1\x40\x73\xe2\xf3\x45\xa9\xa6\xa7\xc6\xc2\x96\xfb\x4e\x9c\x4f\xd5\x78\x39\xfb\x46\xed\xc3\xac\x00\x1a\xe0\xd1\xaf\x56\x55\x34\xae\xaf\xa7\xfc\x1e\x00\xa8\x86\x71\xfc\xf9\x96\xe8\x03\x06\x17\xbb\x51\x10\x0c\x60\xe9\x62\xf4\xa3\x67\x18\x52\x4a\x1c\x80\x99\xeb\x26\x36\x83\xf0\x19\xeb\x27\x01\xd0\xc0\x06\xeb\x43\x77\x2d\xf8\x73\x78\x26\xbb\x95\xc7\x17\x35\xf5\xf0\x44\x55\x57\x51\x8b\x20\x1f\xe8\x7a\xcd\x46\x7c\x1f\xbc\x7c\xa1\xc0\x2c\x34\x3f\xc1\x91\x5a\x0a\x87\xfe\xd4\x2a\xa9\x1f\xfb\x29\x09\x60\xca\xbf\xc8\x6b\x43\xf8\x48\xa1\x08\xfd\x4d\x25\x65\x94\x5a\xf7\x6c\x21\xab\x23\x68\x5c\xd5\x75\x18\x06\xc7\x72\xfb\xea\xd9\xb8\x79\x44\xed\xe6\x00\x98\x7e\x91\x7c\x81\x73\xe9\x2e\x5e\x56\xae\xce\x88\x24\x91\x35\x9a\x7c\x51\x36\x2a\xb2\x2c\x2a\x44\x2f\x4c\x81\x06\xf3\x08\x3f\xab\x13\x08\x43\x34\x85\xcb\x60\xf5\x42\x31\x9f\x40\xcb\xef\x71\x35\x3b\x10\x30\xdf\xd1\xf4\xd0\x96\x24\xc8\x22\x21\x14\x67\x5b\x8e\xf9\x98\x0d\xc2\x1c\x5d\xda\x06\x3a\x45\x8c\x56\x19\x03\xff\xc9\xd3\x18\xea\x70\x59\xf6\x4b\x2d\x3b\xba\xd0\x12\xd0\x69\x22\x1a\xfb\x38\xba\x72\x57\xc6\xcf\x0d\x1c\x0e\x67\x04\x67\x70\xf6\x8d\x51\x3a\x75\x50\x98\x7e\x0a\x5a\xd7\x58\x3f\x3b\xe2\xaf\x4d\x7f\x4a\xb4\x35\xcc\xb6\x2f\xea\xa5\x84\x7c\x90\x56\xd2\x49\x94\x0e\x89\x92\xe7\x4a\xce\x50\x10\xca\xb3\xcd\x8f\x8b\x2c\x14\xc3\x30\x9e\x64\x1c\x8f\xbe\xf1\xa6\xe7\x69\xae\x85\xf4\x75\x9e\x44\xbd\x69\x68\x49\x9f\x08\x99\x54\xb6\xcc\x86\x8f\xb2\x6e\x36\x11\x1f\x7e\x18\x0e\x38\x1a\xc7\xf1\x60\x56\x34\x87\x30\xd5\x3f\xbd\x96\x75\x04\xb8\xea\x23\x0c\xa4\xe3\xb2\x00\x00\x49\xd9\xbc\xed\xda\x3e\x04\xe8\x56\xf5\x12\xc0\xb6\xe8\xf0\x0a\x6d\x4f\xc9\x5c\x23\x05\x55\x36\x8a\x77\x30\x40\x96\x2d\x46\x15\x6f\x94\xbd\x4b\xfb\x79\x5f\xef\x8b\xc6\x25\x7c\x47\x56\xb7\x12\x87\x0a\xe6\x24\xbe\xe8\x96\xf3\x12\xe1\xd8\xae\xe7\xb6\x86\xde\x37\xde\xf2\x13\x53\x59\xb0\x91\x9c\x55\x2c\x4f\x30\x3d\xd1\x2f\x3a\x75\x83\xab\xbf\x2d\x5c\xc6\x01\x6c\x56\x35\x8e\x1b\xd2\x3a\x14\x47\xac\x5b\xf4\x28\x3b\xb2\xf5\xd3\x5f\x88\xe7\x7c\xe6\x45\x64\xbe\xc5\x89\x1b\x71\xdf\x4a\x6e\xb1\x5a\x7c\x8b\xe5\x01\xd6\x75\x5b\x1e\x3c\x99\xe1\x15\xce\xe0\x23\x8f\xb5\x7d\x7c\x91\xd3\x6d\x2a\xc9\x1f\xae\x59\xaa\x7f\xf9\x5c\x02\xaa\x0f\x60\x12\x27\x30\x1d\x15\x28\x68\x68\x8b\x9a\x04\x25\x96\xe1\x7e\xee\x83\x65\x05\xf5\xea\x57\x12\xb7\x6c\x9d\xbf\xd1\x76\x20\x70\x31\x87\xa2\x1b\x84\xe9\x97\x4e\xfb\x7d\xea\x7b\xcf\x94\xe9\x9b\xc2\x0a\xcb\x9f\x8d\x48\xfc\xb2\xc1\xe8\x1d\x92\xaf\xf6\x3d\xd7\x50\xdb\x0b\x6e\x65\xb8\xa2\x31\x5f\x9a\x8e\xfc\xbe\x57\xe8\x3c\x72\x61\xfe\x70\x07\x71\xd7\xb8\x10\x09\x92\xa3\x18\x5c\x51\x72\x9d\x72\xc5\xa8\xce\x99\xdc\x5e\x3e\x98\x97\x75\xbb\x6b\x74\xf2\x9d\xde\xf0\x59\xa2\x63\xf3\x90\x91\xa3\x16\xd9\x85\x0a\x9b\x66\x2f\x0a\x32\x8d\xd7\xf0\xc5\x05\x9d\xec\xa5\xdb\xd2\xcf\x41\x80\x95\x02\xe4\x49\xdf\x4e\x03\x81\x1f\x27\x47\xc5\xc7\x52\xfb\x63\x9c\x6b\x7d\x52\xc6\xda\x90\x1d\xd1\xf6\xe5\x49\xb0\x4a\xb2\xca\x5b\x43\x6b\xda\x20\xc4\xc6\x78\x16\xc3\x2a\xeb\x49\xb3\x16\x14\xdf\x48\x43\x23\xfc\x4c\xc7\x0f\x55\x92\x4d\x06\xde\xa7\x09\xa1\x68\xde\xb5\xac\x45\xda\x4c\x12\xfe\xd4\xb7\x18\x4a\xb9\x9b\xdf\x2f\xc5\x3d\x94\xe8\x10\x22\x0a\x16\x5b\x8a\x49\x2f\x48\x94\xd6\x48\xd8\x61\x7b\xd0\xdf\x0c\xf9\xcd\xc2\x32\x13\x03\x1a\x62\xdf\x10\x6f\x6f\x7c\x30\xd4\x1e\xa8\x48\x1e\x26\x48\xb3\xbb\x31\xea\x97\x3f\x93\xea\x98\xec\x79\x5b\xd9\x83\x48\xcd\xee\x17\x17\x76\x2b\xe8\x9b\x2e\x9c\x01\x95\xdc\x0e\x6b\x4e\xb8\x19\xb2\xae\x03\x1a\x42\x25\x87\xe7\xf0\xf1\x16\xaa\xac\x6a\xd6\x8b\xdd\x45\xf5\x26\x54\x65\xcb\x1f\xb0\x46\x26\x7f\x23\x33\xa7\xe6\x82\xd6\x1b\x8e\x3c\x36\xb1\x98\xa3\x08\xb8\x44\xf4\xf3\xc4\x32\x0b\x5e\xe1\xd6\x6d\x7e\xea\x3e\x0d\xa6\x40\x8f\x05\xc4\x8c\xce\x4d\x40\x9b\xc2\xc6\x06\x42\x8e\x3a\xce\xb0\x25\x20\xb0\x37\x1b\x97\x2d\x82\x97\xfc\xbf\x36\x93\x7d\xe2\xee\x5f\x55\x50\x0e\xb9\xb6\x51\x8e\xf8\x82\x60\x40\x94\xd6\xe4\x2f\xa8\x95\xf2\xca\x50\xf6\xd9\x91\xb5\x1f\x0c\xd1\xc2\xdc\x65\x8f\xd0\x92\x64\x10\x69\x4e\x54\xf5\x4d\xed\xc9\x81\x8f\x19\x20\xb9\x05\xc8\x5a\x5e\xb3\xe8\xef\x52\x33\x61\x10\x9c\xd0\xcb\x47\x7c\xcf\x88\x73\x0f\x97\xa2\x01\xf7\x95\xdc\x7a\xd8\xfc\xdd\x47\x97\x3c\xc1\xaf\x8d\xca\xcf\xa2\x4f\x27\x43\x4f\x07\xbd\x64\x51\xd8\xa3\x3e\xfe\xb5\xc5\xbe\x73\xcb\x12\x40\xc3\x30\x8c\x42\x9d\x3b\x99\x1f\xce\x1b\x89\xd1\x28\x60\xdc\x8b\x19\x0f\xb4\x23\xce\xe1\xfb\xb4\xef\xe2\xc5\x28\x70\xa1\xd0\x5f\x6b\xe8\x02\x93\x0f\xce\xc8\x34\xfd\x10\x3e\xb6\xc3\xdd\xfc\xcc\xd3\x6a\x5f\xb8\x0d\xbf\x81\x6c\xde\x81\x4c\x1e\x74\x7e\x45\xd6\xd6\x47\x75\xa9\xac\xb6\x88\x4c\xbc\xf7\xed\xb6\x66\x8f\x02\x2d\x14\x3e\xd1\x39\x7b\x00\xd4\x24\x9b\xfd\xb9\x20\x93\x0e\x10\xf3\xf3\x4b\x29\x39\x90\x49\x27\x22\x73\x49\x2b\x2c\x4d\x7c\x51\xf0\x0d\x65\xf3\xd7\x63\xf2\x17\x65\xf1\x2d\x76\x6e\x14\x28\xcc\x63\xb6\xc7\x73\xf5\x21\x2b\xfc\xf4\xc7\xa9\x9b\xa6\x82\x5c\x8e\xf3\x1c\x30\x64\x31\x3a\x06\xfb\xe1\x6b\xe6\xba\x11\xa5\xa7\x21\x2f\x41\x0c\x98\xfc\x05\x33\x59\x08\x2c\x78\x2a\x9e\x69\x38\x0c\x7f\xfb\xaa\x4d\xc0\x35\x46\xcb\x5f\xc0\x76\x01\x1b\x5d\x2f\xa5\xb0\x7a\x87\xce\xc4\x3e\xe7\x78\x3b\x25\x36\x05\x9f\x60\xc6\xbb\xbf\xd6\xef\x22\x95\x1e\xb7\x3f\xc2\x6d\xfa\x51\xf8\xa6\x69\xec\x1d\x4c\x31\xda\x1d\xbd\xc2\x94\x97\xbe\xef\x47\xa9\x28\xd4\x3c\x80\x02\xce\x82\xa7\xa6\xbe\xfa\x3e\xdc\xbf\x66\x29\x43\x37\x50\x58\x6e\xde\x34\x10\x02\x50\xfa\xc2\x37\x62\x5b\x9b\x95\x6a\xfb\xa0\xed\xcd\xb6\x2b\xa6\x14\x29\x7f\xb3\xb1\xa9\xbf\x1c\xaa\xa6\x90\x6e\xc0\x1e\x6b\x1b\x40\xca\x71\x5d\xd7\x39\xff\x65\x87\x29\x05\x86\x22\x47\x1e\xff\xf5\x59\x72\x51\xcc\xe2\xda\xe6\x2a\x6c\x1d\xfc\xe4\x2e\x94\x49\xbf\xfc\x43\x6f\xa5\xf6\x70\xfd\x86\x64\x9c\xe1\x13\x47\xe4\x68\x95\x5d\x08\x02\x21\x23\x91\x2e\xdd\xaa\x26\x5b\x99\xe1\x53\xe6\x11\xdb\x79\x12\x53\xbf\x0e\xc1\x3a\x04\xca\x22\x2a\x2a\xab\xdf\x15\xa7\x64\x1d\x96\x72\x58\xe8\xac\x77\xdc\xc3\xf8\x6d\xc5\xdf\x5c\xea\xea\x81\x73\xae\xf2\x01\xc1\x1c\x96\xdd\x76\x4d\x06\xb9\xec\x0e\xfa\x5b\xe8\x5b\x5d\x26\x71\x9d\x90\x7e\x46\xc6\xa1\x1d\x9e\xb1\x59\xf5\xab\x87\x57\x50\x9c\xe6\x7c\x96\xbf\x5e\xe6\x3f\x91\xb3\x0e\xc1\x3c\x26\xa0\x88\xe9\x6c\xa6\xbb\x9c\xe6\x7a\xba\x0f\x09\x1f\x56\xed\x97\x64\x8f\xdc\x59\x61\xd9\x9c\x22\xfd\x72\xaf\x44\x5a\x6c\x53\xf0\xe5\xc6\xc8\xfa\x21\x62\xd7\x5d\x47\xb3\x7d\x8a\x7b\xe8\x81\x9a\xbe\x09\x7e\xbe\xbb\x2f\xd3\xe0\xf7\x19\x2b\x84\x19\xf9\x30\x5f\xb8\x9a\x7c\x5b\xab\x1c\x32\x50\xb6\x3e\x25\xa1\x8f\x2c\x02\x50\x9f\x7b\x62\x6b\xad\x5b\x91\xe3\x2d\xb0\xc9\x21\x28\x74\x74\xb9\x0d\x04\xdb\xf6\x3c\x7b\xa2\x19\x9f\xf6\x38\xda\x3f\x3c\xc1\xce\x71\xe2\x15\x42\x8d\x24\xfc\xe6\x38\x68\xa2\x25\xf7\xbc\x48\xf4\x06\x02\x50\x25\x1f\xb9\x15\x08\xbb\x3a\xa2\xe7\xb5\x69\xed\x1e\xac\x0f\x53\xfb\x6b\xb9\x21\xb9\x6e\xd9\x86\x79\x77\x54\xf0\xd8\xbe\xf9\x92\x66\x7b\x13\x73\xff\xfc\xe4\x2e\x58\x36\xce\x69\x60\xa1\x6a\x49\x6d\xb6\x27\x40\x23\xf2\x4b\x88\x9f\x91\x8a\xbb\x45\xdb\xc9\x1b\x5a\x84\xb0\xcb\xdd\x0c\xe5\xe5\x5d\x42\x9a\x6c\x5c\x87\x46\xff\x72\xa7\xd6\xed\x1b\x42\x7f\x73\x31\x08\x96\x47\xdb\x4b\x82\xef\x03\x33\xa6\xfc\xb2\x63\xea\x7f\x38\xba\x30\x04\xc4\x40\x03\xe8\xae\x01\x8a\xf6\xe8\x7a\x85\x1c\x47\x1e\xc2\x1e\x8a\xed\x69\x32\x7b\xa5\xd4\x93\x69\xf4\x41\x83\xa0\x70\xf8\x65\xab\x2b\xd9\x91\xba\x84\x13\x91\x0c\x8e\x96\x33\x1b\x97\x62\x8f\xc2\x8d\xd1\xe0\x86\x98\x4a\xe2\x2d\x6f\x00\x76\xc3\x11\xdc\x9f\xe6\x0f\xee\xcd\x1a\xc0\x05\x42\x2a\xab\xa9\xcd\x46\xef\x7e\x00\x1f\x19\x72\xe4\x73\x9c\xd6\xf3\xc7\xdd\xad\x52\xc0\x25\xd4\x88\x08\xe0\x93\xfb\x1d\x91\x77\xfe\x9a\xb2\xe1\xc3\xa0\x11\x5e\x1f\xeb\xeb\x93\x0f\x48\x61\xaf\x23\xb3\x58\x29\xb9\x54\x35\x1b\xff\x8b\x11\x08\xce\x6b\x90\x16\xad\x82\x7b\x44\x14\x71\x99\x4f\xe5\x94\xe2\x75\x4e\x66\xb9\x35\xaa\xb6\xf5\x2c\xbb\xb5\x79\x9b\x36\x47\xa6\x4a\x56\xd1\x47\xc3\x1b\x2e\x16\x58\xd1\x8d\x58\x77\x22\xb8\x2b\x05\x28\x20\x2e\xab\xc5\xa0\x66\xff\xdf\x98\x1e\x49\x93\x44\x18\x17\x0f\xe5\x0e\x52\x70\x6c\x29\x52\xad\x68\xf3\xd1\x51\x5a\x2f\xac\xb7\x3e\x2d\xfb\x04\xa7\xb9\x9b\x5a\x6d\xa9\x31\x4c\x87\xc7\x48\xba\xcf\x5c\x6a\xf7\x7c\x2b\x53\x91\xb7\x25\x6e\x2e\x59\x57\x3e\x3c\xb5\xe8\x7f\xfa\x55\x39\xef\x3a\xf9\xa0\x6b\xf8\xfd\x95\x14\xab\x96\x8d\xc7\x86\xd0\x71\x69\x40\x59\x43\x96\xc9\x34\x22\x29\x81\xb2\x2c\x8e\x68\xa7\x5e\xa3\xe5\xc0\x52\x93\x5a\xfb\x44\xf8\x20\x9b\x6e\x75\xd7\xdc\xc8\xc7\x2f\x6b\xc4\x39\x95\x0f\xb3\xef\xc0\xc9\x3f\x58\x64\xc4\xeb\x29\x69\x63\xbc\x9d\x24\xe5\x7b\x0e\x90\x1e\xaa\x71\x8c\x7f\xac\xae\x96\xb3\x04\x31\x61\xb7\x25\xef\x36\xb0\x36\x03\x9e\x38\x29\xfd\x5d\x5f\xf2\xcb\x7e\x20\x74\x43\xf2\xe4\x41\x0c\xc1\xda\xf3\xb6\x53\x2d\xb6\x31\x3b\x03\xf2\x9f\x48\x34\x62\x67\xc9\x1f\x28\xfa\x14\x99\x61\x6b\xca\xfe\x40\xb0\xf9\x06\xb0\xe9\xe7\xca\x1e\x80\xd4\x43\x23\xaf\x8d\xac\xf7\x19\x18\x67\xd9\x54\x13\x03\xee\xa2\x94\xcd\xf8\x9b\xa9\x5b\x04\x1f\x69\x15\xc2\xe5\xb7\xb0\xab\xe9\xbb\xe1\xfe\x4e\x9a\x2c\x31\xd3\x8f\xf3\x4f\x96\x15\x65\x11\xb0\xda\x72\x93\xc0\x21\x0f\x1a\x2e\xa1\x72\xca\x70\xd4\xc5\xc7\x39\x7d\x4c\x76\x82\x49\x60\x38\x0d\xab\x4c\x5e\xdb\x2d\xdd\x42\xbd\x3e\x02\xd3\xfe\xfe\x4e\xcc\x91\x1f\x1e\x47\x43\x3a\xaf\x11\x39\x62\xb4\x40\x22\x7f\x6a\xb0\x98\xcf\xe4\x14\x4f\x17\x7a\x6d\xbc\x11\xda\xba\x1e\x5b\x04\x9b\xbe\xb3\x47\xa5\x2b\x63\x81\x78\x8d\x17\x71\x78\x63\x10\x81\xa9\x21\xb0\x58\x15\x4f\xea\xba\xcf\xc7\x8c\x39\xb0\x14\x0c\x4b\x1e\x2d\xc1\x9e\x77\xe8\x87\xfe\xaf\x33\x6f\x5f\x26\x0f\xee\x84\xc3\xe7\xfb\x57\xf7\x73\x4a\xcc\x7d\x73\x98\x76\x5d\x5a\x0a\xc3\x30\xdc\xeb\xf4\xeb\xcc\x9f\xd7\xb0\x70\x0c\x43\x3f\xf1\xdc\x62\xdd\x0a\x7d\x6d\x19\xbe\xf9\x35\x96\x24\x14\x00\xbf\xc4\xb9\x3d\xd5\x06\x8b\xf2\x35\xe4\x8f\x28\x9e\xff\xfa\xe3\x29\x18\x24\x1b\xd7\x0a\xec\xdd\x47\xf0\xfd\xc3\xce\x11\xfe\x93\x79\x03\x01\xc7\x1f\xb4\x94\x85\x2d\x17\x2b\x10\x2a\xeb\x0a\xf2\x13\x7f\xc3\x2f\x49\xbb\x23\xd6\x15\xb3\x08\x5f\xb2\x68\x59\x87\x31\x14\x5b\x5b\x36\xde\x9d\xa8\xec\x03\xb5\xbf\x1a\x4b\xed\xc6\xf5\x07\x63\x77\x2e\xe3\x35\x48\x83\x6f\x7a\x58\xe5\x47\x73\xd1\x48\x34\xc2\xc7\x85\xbe\x7a\x88\x5a\xf5\x16\x2e\x0e\x68\xde\x27\xe8\x5c\x74\x17\x4e\xbd\x54\x6c\xf6\x61\x5e\xb5\x6e\x25\xce\x7c\x01\x63\x95\xf6\x66\xbe\xbd\xa8\x4d\x39\xee\xf5\x56\x2e\xe6\x1f\x87\xb8\xf2\xeb\x1c\x73\xea\x47\xf9\x6f\x9f\xf3\x0a\x31\xbb\x5e\x63\x96\x37\x14\x53\x64\x1a\xe7\x9c\x7f\x68\x6d\xc7\x8e\xf8\xf3\xa0\x27\x3e\x79\x49\xb3\xc3\xe3\x48\x9e\xc8\xa3\x2b\x3b\x72\x7c\x38\x2c\x66\xbf\xe4\x33\x8d\x9c\x14\x71\x3f\xb9\x07\xf9\xf2\x05\xdc\xe6\x15\xc2\xe6\xf8\x91\x3e\x3f\x48\xd1\x08\x12\x37\x3e\x7d\x19\x0d\x38\xf9\xd5\xe2\x47\xa7\xcc\x31\x49\xa8\x53\xf5\xf7\x25\x7f\x3b\x57\x5d\xd7\x71\x11\xeb\xe7\xd5\x7c\x44\xe6\xc7\xea\x8d\xbc\x44\xc7\x93\xbf\x85\xf9\xac\x53\x33\x25\xc1\x37\x3d\xe0\x0c\x63\x34\x3c\xf8\x91\x4b\xc7\x76\xd0\xd3\xfe\x8a\x55\x6a\xf1\xbe\x07\xf1\x65\x1a\x97\x9f\xb8\xb6\xe5\x6b\x1d\x5c\x69\xd9\xd2\xe1\x01\xc2\x47\x0f\xbf\x51\x14\x96\xb1\x0a\x8d\xde\x63\x59\xc6\x1d\x29\x93\xff\x4d\x9e\xf8\x69\xe4\x9f\xbb\x4c\x9c\x96\xff\x67\x57\x29\xf4\x0e\xf9\xff\x74\x0e\x52\xd2\xb5\x8f\xda\xa4\x77\xf9\xef\x8d\x27\x11\xc5\x8d\xf6\x63\xb2\x20\x4e\xfa\x5b\xe8\xc1\xb6\x36\xae\xc8\xe1\x07\xb0\x49\x56\x49\x5e\xe5\xd8\x4d\xe6\x98\x67\xcb\x88\xa0\x59\xc5\xce\x3e\x7f\x74\xc4\xbc\x2f\x38\xdf\x42\x10\x14\xf5\xa3\xf7\x4b\x82\xcf\x6d\x25\xc0\x18\x03\x0b\xb8\x7e\xd8\x31\xe1\x80\xab\xca\xb9\x6f\xb8\xb6\x01\x9a\x27\x99\xa6\xbb\x43\x18\x96\x61\x19\x1f\x34\x5d\x27\x99\xda\xde\x88\x76\xf7\x24\x4c\xfb\x2c\xad\xc9\x7f\x7d\x49\x8d\x4b\xd4\xae\x9a\xdc\xbe\x96\x7d\xbe\xdc\xc3\x30\xca\xc7\x65\xcb\x11\xfa\x7b\xf0\x4d\xe5\x47\xe6\x52\x59\x7a\x43\x4c\x1e\xcc\xd4\x93\x4a\x6d\x16\x89\x55\x1c\x0a\xeb\x7c\x51\x7d\x88\xea\xdd\x49\xab\x9d\x0b\xc9\x90\xdf\x19\xaf\x2d\x77\x0e\xcf\xaa\xe2\xfb\xf9\xa7\xfe\x6b\x56\x3f\xc6\x11\x4f\x94\xcc\x11\xf1\x89\x9a\x29\x4e\x6b\x83\x77\x87\x62\xe2\x2d\x3a\x1c\xfb\xc1\x91\xc3\x68\x94\x62\xdf\xf9\xfc\x7a\x3b\xf6\xbd\x0e\x01\x50\x5e\x29\x7b\x8f\x3c\x43\x8e\x2d\x43\xc6\xba\x6a\xd9\x52\xfc\xe5\xd0\xa0\xa2\x68\xa9\x50\x9f\xfc\xd5\x99\xf3\xb8\x8c\x29\x92\x4a\x6e\x90\xdb\xa0\xa8\x88\x4c\x1a\xd7\x28\xb5\xac\x99\xb4\x0b\xf5\xa9\x14\x62\x05\x4e\x0a\x35\xb4\xde\x03\x14\x21\xfd\xf5\xd0\x0f\xe3\x2e\x8f\x68\x9c\xa9\x38\x9c\x99\xf4\x99\x49\xeb\x7d\x2a\xfd\x1e\x41\xb8\xb7\xe4\x77\xd2\xd8\x49\x0b\xcc\xef\x4f\x5f\x5c\x57\xe6\xf1\xe7\x10\x5c\xe0\x24\xd3\x8c\x00\xb6\xd5\x2f\xcb\x5a\xb2\x8d\xc0\x43\xfa\xaf\x0c\x23\x37\x26\xd1\x76\x5a\xb9\x66\x0b\xa7\xee\x3d\x29\x8d\x17\xaa\x70\x19\x87\x28\x0d\x6a\xeb\x7a\x6e\xde\x29\x09\xd1\xa7\x77\x24\xa0\xa9\x92\x28\x75\xae\x7f\xf9\x4c\x51\x50\x16\x89\x6d\x0a\xd1\x03\xe6\x1e\xf2\xa3\x63\xcd\x86\x15\xd9\x4c\xfb\x28\x3f\x16\xa8\x46\x69\x9e\x53\x25\x04\xeb\xd1\x45\xa2\xe8\xc7\x15\x8b\xcb\x5f\x40\x02\x3a\x6b\x34\x44\x5d\xb8\x2c\xeb\xd8\xa4\xba\x27\x16\x66\x10\x06\x84\xcf\x8d\xb7\xc5\xc0\xf3\x3f\x75\xda\x85\x7b\xe1\xd5\x76\xf5\x13\xf8\x8e\x05\xff\xc9\x90\x63\xc9\x23\x7a\x2f\x6c\x7d\x7d\x5b\xc9\x7b\xe0\xf3\xd7\x7f\x3d\xb6\xe2\xdc\xb6\x02\xe0\xc4\xbc\x82\x3d\x8f\x08\x34\xa5\xc7\xe7\x5d\xb3\x51\xed\x51\xdf\x3b\x81\x69\xc4\x89\xd4\xa8\x4c\x7f\x50\x44\x5c\x69\xff\x1e\x1f\x97\x55\x16\x79\x26\xbd\xef\x70\x93\x38\x6e\xab\xf8\xf0\xbc\x6b\x3e\xe2\x5f\x13\x40\x1a\x60\x92\x6c\x30\xb1\x6c\xa6\xe4\xf8\x98\x44\xb7\xe5\x31\x16\x61\xdc\x2b\x74\xe8\x9e\xf8\xa1\xe3\x0a\x3d\xc8\x28\x3c\x75\xf4\xa2\x5b\xee\xd3\xaa\xff\x6a\xdb\x15\xc5\x57\xd1\xfd\x1d\x83\x57\x05\xf1\x06\x98\x48\x60\x5b\x89\xf3\xde\x73\xa1\x2f\xf1\x28\x9a\xa3\x92\x84\xcf\x1c\xa2\x5d\xb3\x7d\x31\x02\x28\xcf\x25\xea\xdb\xcb\x72\x91\x63\x8b\xd0\x83\x6c\xa9\x23\x04\xbe\x48\xe0\xee\xb5\x94\x8e\x15\xef\xf3\x8b\xf6\xd3\x1b\xce\x60\xe7\x28\x84\xc0\x22\xd3\xd0\x5a\x26\xab\x6e\x5e\x98\x10\xae\x51\x68\x0d\x75\xaf\x98\xcc\x6d\x04\x1e\xe0\x60\x95\x0b\x7c\x40\x70\x1b\xf9\x8c\xd4\x08\xd7\x84\xb5\x8f\x61\xb7\x99\x34\x2c\x51\x9e\xed\x10\x60\xdf\x83\x41\xdb\x75\xed\x63\x45\x96\x54\xea\x4f\x0f\x24\xb6\x39\x6c\xd2\x67\x48\x11\xfb\x6a\x37\x90\x0a\xa3\xc7\xcc\xb2\xb6\xad\xe4\x79\xef\xa9\x34\x52\xa8\x64\x45\x6c\xf5\x82\xd1\x3e\x45\x75\x8f\xfa\x65\x5a\x47\x2d\xc6\xb9\xc1\xa6\x06\xc4\xb4\x13\xd1\x50\x96\xe3\xe3\xaf\x60\x1c\x22\x18\x08\x00\x93\xcf\x60\x43\xdf\x4f\x06\xb3\x24\xe5\xbf\x39\x74\xbd\x6c\x9f\x56\x85\x8e\xbb\xa2\xf6\x5c\x52\xb7\xb3\xfc\x9e\xde\x68\x1a\x40\xa4\xc5\xdb\xf9\x86\x4d\x63\x2c\xb5\x0e\x97\x5b\x06\x1f\xd2\xfd\x5a\x5f\x78\x18\x0b\xd1\x58\x06\x23\x8a\xd1\x93\x05\x22\xfe\xaf\x4e\x4d\xb4\x4e\xed\x8a\x69\x21\xd2\xfe\xd1\x21\x55\x74\x83\x70\x4a\xe1\x52\xf7\x88\xaf\x4f\x54\x5e\x60\xa8\x28\x6e\xcb\xfa\x7b\x29\x4a\x85\x37\x3d\x5b\xe5\x68\x45\x7f\x33\xeb\xd7\x7b\x3f\xd7\xb1\x18\xb0\xc9\x5f\xde\xa0\x4c\x61\x9f\xe9\x22\xe9\xdf\xb8\x9f\x8f\x0a\xe1\x5e\xcb\x0f\xd5\x46\x56\x9f\x04\x1e\xc8\x0a\xab\x65\x8c\x08\x32\xb5\x55\x55\x44\xc4\x48\x78\x42\x58\x9d\x6a\xfb\xad\xa0\xea\x58\xb0\x5a\x5f\x40\xbc\x85\xb7\xd1\x3d\xbc\x4e\xf1\x8a\xee\x88\x7b\xee\x4a\xbe\x9b\x42\x69\x88\xd9\xf0\x7e\xee\xe1\x7c\x54\x53\x51\x99\x4c\x0d\x51\x22\x7f\x80\x70\xcd\x7f\x6d\xba\xf5\xec\x2b\xd3\x2a\xc2\x4e\x3f\xa6\x52\xa0\xfe\xe4\x88\x18\x86\xa3\xc0\x08\xa0\x74\x9c\x1a\x2e\x34\x04\x6f\xb0\x46\x78\xf5\x4b\x94\xc8\x13\xaf\x5d\xb6\xfa\x1c\xd9\xa6\xf1\xd0\x4f\x6c\xa3\xbc\x3e\x82\xee\x6b\x4f\xc1\x5e\x4b\x56\x2f\x72\x23\xe6\x27\x41\xf5\x81\x00\xe6\x35\x1b\xc3\x34\x89\x38\x8e\x23\xc2\xde\x2f\xca\x68\x8a\x2b\xf0\x59\x23\x68\xc0\x80\x73\x56\xbc\x31\x95\xc6\xac\x8e\x61\xbe\x38\xe3\x8d\xe8\xbe\x39\xcc\x86\x43\xa2\x51\x68\xf9\xc1\x2a\x9e\x09\xe6\x06\x9b\xd5\x9f\x7c\x1c\xff\x99\xac\x76\x20\x01\x49\xd4\x94\xc5\x0b\xe1\x0a\xad\xed\xe9\x51\x83\x33\xda\x27\x31\x2c\xe4\x2f\x11\x41\x19\xff\xdd\x6a\x10\x78\x0e\x79\xa0\x2a\x4f\xfa\x06\xb7\x88\xff\xda\x53\x3f\x40\x4d\x84\xfe\xea\x2b\x81\x8c\xf3\xa0\x6f\xdf\x26\xad\xaf\x7e\x40\xa5\x40\x34\xc9\x3f\x28\x30\xc7\xf3\x0a\x60\xb8\x9d\xea\x12\x5f\xfe\xfc\x12\x47\xbe\xa5\x51\x38\xa4\x48\x19\x47\xf0\x41\xfa\x44\xfd\x21\x92\x2d\x39\x54\x98\x28\xc7\xea\xa8\x6a\x0a\x43\xfd\xe0\xa8\xe3\xde\x98\x97\xcf\xfc\x2d\x33\x85\x65\x93\x63\x7d\xde\x6f\x8e\xf2\x24\x58\xfa\xbd\xdd\x63\x70\x5c\x10\x3d\x35\x38\x2c\xee\x18\xf6\xf6\x87\xfb\x80\x67\x95\x1c\xa1\x6a\xb7\xe8\x54\x04\x80\x91\x93\x46\x96\x50\x56\x9f\x62\x52\xd7\xac\x5b\x4b\x7f\x30\xfc\xd9\xbd\xf2\xf5\xdd\xef\xf8\x38\x2a\x3b\xde\xc6\x18\xc6\xb0\x83\x5f\xfd\xd4\xb7\x3a\x2e\xea\xb2\x70\x18\x52\xd1\x69\x84\x54\x1c\x47\xe9\x33\xa8\xcb\xa0\xf0\x0c\x64\x9b\x6f\x82\x04\xcc\x1a\xb1\xde\x9b\xfc\x87\x2f\x31\x9d\xea\x4a\xea\x5c\x29\x0e\xa1\x2b\xdc\x9a\x4d\x21\x4c\xff\xfa\xbd\x91\x76\xcd\xa6\x8c\x44\x5d\x57\xd0\x0c\x10\xda\xcc\x18\x8e\x11\xf4\x92\xf1\x4b\x25\xd9\x63\x9e\xbb\xa4\xeb\x1f\x5f\xc5\x41\x0b\x3e\xb6\xdc\x3c\x42\xa5\x95\x45\x20\xe9\x51\x98\x16\x19\x61\x68\x40\xf4\x6f\x9e\xf4\x43\xab\xe8\xfa\x82\x6a\xff\x7e\x6e\xa5\x3f\x7d\x14\x00\x61\xa0\x7e\x34\x77\x54\xd7\x6c\x52\x89\x2a\xfd\x9c\x38\x27\xa4\x23\x18\x7f\xc9\x91\x06\x7d\x58\xaa\xee\xc8\x24\xab\xbc\x89\x3b\x88\x77\x0e\x81\x69\x04\x66\x89\x34\xa7\x5d\xa3\x0d\x1b\xd5\x27\x66\x30\x6c\xca\x48\x8d\x09\x35\x46\x2c\xfe\x34\xec\x65\xdc\xea\x18\xbe\x11\xc7\x20\x23\x81\x00\xdf\x55\x3a\xb7\x0f\x96\xf0\x02\x6e\xfb\x58\xc8\x29\x21\x1a\x6b\xc1\xee\xe6\xfe\x4a\x55\x47\xe4\x81\xad\xfd\x39\x72\xc8\x87\x43\x97\x37\xc5\x6c\x83\xab\xfa\x0d\x43\x47\x00\xac\x5b\x64\xaa\x91\x40\x8f\x6f\x7c\xa0\x5b\xe8\xf5\x2b\x2b\xf4\xcc\x1f\x9b\xc8\x26\xa5\x6a\xf9\x01\x25\x36\x1d\x3f\x07\x90\xf8\xe4\x9c\x0a\xda\x03\x44\x4c\x0b\x51\xfd\x7e\x63\x5f\x01\x4b\xbd\x51\x43\xd2\xcf\x87\xae\xcc\xb2\x14\x13\xf7\x53\xda\x0b\xd7\x38\x2b\x68\x63\xda\x8a\xc7\xc8\x35\xc7\x71\x09\x6c\xd0\x3a\x04\x5b\x15\x27\x97\x37\x0a\x34\xee\x25\xef\x7f\x58\x0d\x77\x93\xe5\x4a\xd3\x94\xaf\xc6\xe7\x7a\xad\x92\x76\x23\xc6\x6b\xd0\xc6\x6b\xf8\xdc\x1a\xce\xed\x2c\xf5\xcf\x15\x61\x6d\xc8\x22\xd2\x85\x7c\x69\xba\x0e\x5c\xd9\x31\x15\x78\xd5\xb5\x65\xdb\x36\x62\xdd\xb6\x4c\xb2\x76\x7e\x47\x78\xea\x3f\x9f\x5f\x6c\x8b\x28\x44\xbf\xf2\xdd\xf5\xfc\xfc\x35\xb1\x98\xc1\x64\x85\x24\x80\x39\xbd\x2c\xde\xa1\x6d\xdf\x20\x2d\xc8\xe6\x4b\xca\x70\x3e\x6d\x55\xce\xdd\x6f\xfb\xd0\xcd\xbb\xbe\x94\xa2\x62\x26\xf8\x45\xa0\x01\x05\x7c\x06\x0d\xab\x06\xe6\x3f\x6e\x0d\x83\xeb\xa4\x16\xab\x3c\x2f\xf3\x61\x43\xb8\xf2\xad\x96\xc9\x3a\xd9\xe3\x7c\x86\x24\xe6\xb5\x5e\xe3\x11\x9c\x5e\xe2\x8a\xc5\x59\xa3\x30\xa5\xec\x05\xac\x49\xd4\x22\xed\xd0\xe7\x13\xc5\xe2\x1d\x7c\xd4\x75\x5c\x1d\xc6\x50\x67\xe0\x7f\x18\x8f\x4e\xd0\xfe\x52\xcf\x4b\xf3\xe5\x0d\xf3\xd9\xec\x34\xe7\x19\xcc\x7a\x8d\x57\xb8\x08\x99\x2b\x16\x57\x1a\xdd\x94\x9e\x56\xba\xde\xc0\x9a\xac\x53\x45\xe8\x91\xab\x7b\xac\xd2\x6f\x28\x83\xff\x04\xa8\x19\x2a\xda\xc8\xfe\xd4\x3b\x34\x42\x16\x7a\x6b\x25\xb7\x42\xb5\x38\xee\xef\x7d\x06\xbe\x94\xbd\x6f\xfb\x31\xec\x1a\xeb\x15\x53\x0a\x99\x6d\xa0\xa5\xbe\x92\x6b\x97\xec\x04\x6e\x2d\xe3\xb5\x48\x7c\x5f\x00\x46\x04\xec\xd4\x31\xd3\x5f\xea\xaf\x7a\x8f\x36\xc9\x39\x4d\xff\x9f\x44\x2b\xc7\x54\xc8\x5c\xa2\x89\x89\x13\xae\xdf\x10\x07\x6d\xb2\x96\xf1\x12\xa6\xec\x16\xb2\xee\xdd\x60\xbb\xc2\xcf\x6a\x3f\x64\x32\x0e\x7a\x7d\x93\x00\x63\xbc\xe6\x89\xf8\x81\x02\xb8\xe5\x15\xc4\x5c\x70\x43\x9d\xfa\x40\xeb\x1f\xf3\xaf\x6e\xdf\x95\x0f\xc1\x5e\xc9\xdc\x8c\x4d\xef\xd5\x2a\xf6\x65\x09\x1b\x46\xd4\x54\x9a\x61\xa9\xa1\xc4\xc6\x60\x3d\xe3\x46\xd4\x80\xed\xb5\x72\x09\x88\x09\x02\xbe\x70\xb5\x41\xc0\x48\xc1\x92\x53\x78\xc1\x1b\x25\x32\x3b\xff\xce\xfd\xce\x6c\xf1\xe8\x3f\xe3\x8a\x9d\xb7\x96\xfe\x8c\xf0\x2d\x2c\xa8\x93\x4f\xc4\x0e\x31\xc5\x21\x5c\x16\x43\x6f\xb4\x8e\xd6\x06\x2a\x8b\x2c\xde\xa7\x63\x5d\xb1\xc8\xbf\xa5\x3c\x83\x31\x01\xc6\x8a\xb1\x49\x21\x57\x3b\x36\xaf\x72\xf6\x45\x3f\xb1\x1c\xcc\xff\xad\x5d\x6c\xfa\xe6\x32\x79\x55\x83\xc7\x39\x1a\xb2\xdf\x2a\x30\x8a\x86\xed\x3c\x5d\x4f\x72\x4e\x0d\x03\x65\x0c\x76\xa4\x0e\x42\x3c\x55\xa9\x79\xa2\x16\x31\x9b\x25\x6c\x08\x18\x7b\xc5\x4a\x1e\xfb\x43\xb8\x1e\xe7\x27\xd8\x05\xbe\x3f\x3e\x0f\x77\x45\xe3\x7a\x26\xbd\xe7\xaa\xf9\x56\xe7\x64\x9c\xc7\x30\x5d\x4d\xc1\x3a\x5d\x1b\xe6\x7a\xab\xeb\x8b\x8e\x23\xa7\x39\x9f\xa1\x08\x60\x23\xa7\x09\x9d\xc7\xf3\xea\xa2\xe1\xf5\xfb\x36\x03\xbf\x37\xfe\x48\x35\x2d\x62\xbd\x9f\x38\x41\x88\x5c\x9f\xcb\xe5\xbb\xab\xe6\x86\x18\x97\x75\x58\xdc\x20\x14\xdd\x20\x92\xee\x88\xd5\xd4\x5b\xbc\x3d\x79\x1e\x85\x2a\x9b\x27\xb1\xcf\x7d\x53\x2d\x37\xf2\x4b\xe8\x11\x1c\x86\xdc\xa0\x64\x6c\x93\x48\x4f\x51\xb6\xf1\xbf\x5e\xf4\xa2\xe1\x3b\x94\x33\x59\x61\x30\x6a\x2f\x12\x5d\x48\x84\x84\xc3\x52\x84\x9d\xe7\x39\x5e\x1f\xfc\xe6\xf2\x14\x94\x51\x46\x86\xca\x2c\xdf\xfb\x89\x9f\x5f\xba\x1b\xbe\x4e\xe3\x2b\x7b\x26\x8f\xdd\x63\xf0\x0c\x26\x97\xc4\x78\xef\xfc\xe8\x13\x51\x31\xf9\xeb\xf6\xda\xd0\x80\x07\x3c\x11\x99\xff\xc6\xcb\x7c\x28\x6a\x7a\x61\x1e\xa4\x19\x17\x31\x5b\x23\x37\xeb\x1b\x2c\x05\xae\xf4\x56\x0a\x5b\x0b\x6d\xc0\x34\x0a\x68\xce\x77\x09\xb0\x4d\x4f\x49\x93\x77\x0a\xe1\x78\x05\x22\x62\xa4\x58\x12\xff\xe3\x9d\x61\x82\xb8\xcb\x7c\xc9\x85\xd2\xc5\x21\x07\xc7\x34\x20\xbf\xb4\x29\xb0\x59\xf5\x3b\xd5\xcd\x74\xb5\x5d\xcf\xf6\xe3\xcc\x30\xbd\x70\xad\x58\x08\x18\x20\x4b\xbd\x5f\x55\x18\x3b\x75\x0c\x87\x5e\xbe\x8a\xe5\x1f\x7e\x32\x7f\x55\xd9\xdd\x63\x67\x74\x6e\x54\xfb\x94\xe1\x5a\xe6\x3b\x9d\x6f\xe5\x44\xae\xc0\x12\x72\x73\xf6\x29\xd2\x0e\x8a\x1a\x48\x9a\xbf\xa2\xb1\x5c\x9e\x1a\xb8\x61\x98\xd4\xbc\xe1\x56\x8a\x75\x5f\x96\x39\x8f\xf1\x59\xca\xee\x1e\x5c\xe3\x85\x9a\x51\x12\xa4\xc5\xf7\x8f\x81\x68\xfd\x52\x28\xee\x30\xd1\xb5\x75\x05\xa6\x0b\x98\x28\x0a\xa5\xe9\x32\xd0\xda\xd1\xbc\x2b\xed\x8e\x09\xf1\x3e\xf3\x61\x1e\xcf\xf4\xb2\x58\xc8\x3a\x29\x93\x55\x14\xfc\x5d\x4a\x7b\x81\x4a\xe9\x6e\xe7\x94\xf0\x1a\xd9\xc7\xc2\x59\xfa\x4f\x9e\x3a\x2a\x49\xd7\x0d\x93\xe0\x20\xac\xad\x65\xdc\x41\x72\x25\x1b\xaa\x87\x26\x39\xf9\x8a\x98\xad\xe2\xca\xcd\x5a\xaa\xcb\x5f\xd5\x72\x03\xba\xa7\x5a\x03\x72\xc2\xc8\x48\xc1\xe7\x41\x7f\xf7\x72\xae\xcb\x7c\x2b\xb3\x2d\x75\x44\xf1\x65\x20\xa3\x57\x00\xfe\x63\xfc\xd4\xe1\x88\xe6\x27\xa0\x65\x87\x92\xd7\xc2\x3a\x79\x36\x0d\x8f\xfb\xd7\xdf\x1d\xf6\xd7\xf8\xae\xa1\xb3\x8e\xc1\x33\x42\xc8\x20\xf6\x81\xd5\x06\x5c\x93\x7c\x64\xa1\xd3\x73\x02\xbf\x91\x81\xf8\x86\x04\x89\xa6\xa4\x99\xb6\xa1\x78\x94\xc3\x9e\x33\xb4\xbc\xcd\x99\x7c\x7a\x90\x16\x00\x6a\xf7\xe7\xd8\xce\x86\xa8\x78\xba\xf2\xac\xbf\x5e\x51\xf7\x44\xe4\x4a\x5a\xa7\x53\x50\xcb\x61\x2f\x05\xdf\x14\xdc\x5c\xf3\x73\xc8\x60\x42\x33\xca\x17\x20\x5e\x16\x9b\xe9\x44\xbe\x58\xa7\x9b\x33\xd9\x16\x10\x53\x40\xa0\x08\x00\xdf\x20\x9e\xe1\xdf\x4a\x66\x13\xa9\xbd\x32\xa5\x59\x93\x48\xec\xf6\xf2\x63\x90\xda\x0b\xc2\x20\x12\x30\xba\xd1\xfc\xcf\xba\x2e\x8a\x69\xc5\x4b\xd1\xd5\xfd\x73\xc5\x9f\x61\xdf\xc5\x3e\x74\x41\x99\x00\x51\x80\x02\x81\xeb\x80\xe2\x84\x16\x94\x45\x9c\x4d\x56\x53\x5d\xab\x14\x94\x43\x4c\x74\x36\xd3\xa1\x4c\x1c\x3e\xeb\xba\x16\x18\x68\x96\xfc\x58\xfa\x4b\xad\xe3\xb1\x6e\x82\x85\xd8\x1e\x38\xb0\x90\xe5\x79\xa7\xf7\x8d\xc7\xe0\x2d\xff\x3a\x57\xd6\xf0\x62\x7f\xfc\x2a\x71\x10\x9a\x7e\x19\xcb\x71\x65\x8c\x88\x14\x61\xff\x57\xfc\xfd\x8e\x93\x51\xf4\xc9\x3a\x24\x8b\x34\xd3\xbf\xe7\x30\xef\xd6\x52\x2b\xfe\xa9\x46\xe9\xb8\xe4\x19\x94\x31\x50\x0c\xb4\x21\xc8\x24\x8a\x1a\x7e\xf7\x37\xe7\xb3\xfc\x8d\x24\x14\x01\x6e\xe4\xa4\xe0\x71\xa7\x07\x80\x2e\x6f\xa3\xa5\xec\xa5\xe4\xb0\x9d\x08\xd3\x30\xe9\xf4\x3e\x8d\x5b\x2c\x95\x07\x54\x45\x23\xe6\x71\x93\xd2\xfb\x83\x1d\x6b\x1a\xe7\x42\xbe\x48\xc4\x0f\x53\x03\x99\x07\xad\xeb\x46\xd4\x3c\x59\x5b\xc0\xdd\xc0\x71\x40\x8f\xc1\x35\x0a\xf3\x24\xa0\x36\xad\x83\xfd\x4c\xfc\x06\xdc\xf7\x21\xd0\x16\x58\x5b\x4a\xf5\x05\x71\xd1\x5a\x68\x2b\xf5\x8d\x2c\xe9\xe1\xd1\x53\x85\xd0\x15\xc5\x21\x0a\xc5\x5f\xff\x86\xa1\x19\xfe\x7e\xb9\x70\xde\x83\x19\xbe\x8c\xc0\x1b\x9a\xd0\xeb\x9a\x11\x76\xb7\xbb\x4c\x15\x55\xba\x66\x63\xbf\x0e\xc1\x64\x96\x7d\xc3\xbd\x98\xa1\xfc\xd1\x8f\x5d\x0f\x95\xc2\xdd\xcd\x2c\xa5\x19\x4b\xd7\x46\xc7\x74\x0c\xa8\x0d\xc2\xfb\xf3\xeb\x99\x7a\x68\x98\x8c\x65\x80\xac\x69\x07\x80\xe1\xe1\xb6\xf3\x78\x6b\xfc\x43\x8e\x8f\xab\xf6\x7b\xd0\x79\xa9\x2a\xf6\xeb\x03\x82\x3d\xb8\x21\x54\xa7\xcd\xdd\xaa\xe9\xc6\xf1\x92\x39\xa0\xfb\x8b\xd2\x47\x69\xf2\x8e\xce\x35\x29\x6e\x32\xae\xc0\xf1\x49\x00\x53\x1f\x3e\xae\xc3\x2d\xed\x02\x65\xc2\x5f\xff\x8a\x53\x5a\x5a\x9e\x06\xcf\x2d\x3f\xb2\xbe\x77\xaf\xbe\x0f\x09\x70\x87\x45\x48\x4d\x72\x9f\x20\xee\xef\x46\xef\xf8\xa8\x0d\x7f\x0a\xff\x18\x67\xe9\x4d\x76\xb4\x6f\x4b\x0e\x19\xbb\xf5\x88\x84\xad\x6e\x80\x59\x4b\x23\xe5\x62\xa8\x14\xef\xae\x61\xdf\x1f\x8e\x5a\xd6\x31\x46\xaa\x72\x6d\x3c\x52\x8e\xf9\x23\xe2\x40\x22\x50\xad\x61\xb5\x8f\xed\x6a\x72\xc4\x74\xff\x73\x37\x37\x9d\x3c\x63\x4a\x6c\x45\xbc\xc5\x23\x48\xbe\xf6\xeb\x4c\xfd\xd7\x65\xaf\xf9\xf6\x46\xe7\x6f\xbe\x97\x6b\x0c\x34\xd2\xd2\x51\xed\x7a\x7e\x6f\x7c\x21\x82\xee\x8e\x02\xc7\xba\x72\x8f\x5a\x7e\x38\x65\x67\x85\x1f\x3c\x50\x09\x6e\xe3\x45\x7c\x6f\x8d\x66\x06\xd4\xda\x47\x57\x7a\xaf\xf4\xda\xc8\xec\xa8\x0f\xf8\x98\x7d\x02\xf2\xe1\x3f\x1f\x45\x74\xbc\x8c\x03\xb9\x61\x97\x3b\x6a\x35\x4f\xea\x53\x93\xbf\xe4\xf3\x51\x03\xa6\x4a\xd8\xbf\xb5\x6b\x1a\x73\xdd\x7b\xb9\xd8\x33\x4e\xf5\x05\x15\x0d\x84\x32\x93\x26\x2d\x33\x69\xc6\x1b\x11\x11\x5f\x1f\xff\xdf\xfd\x55\x5f\xb4\x28\x54\xee\x3f\x35\x56\xb9\x59\x31\xfb\x8c\xfc\x98\x7e\xca\xda\x0d\xe9\xff\xf0\x5d\xb0\x3e\xf3\x5a\xd7\xfe\x16\x95\x6b\x63\x28\x8d\x41\x17\xfb\x4a\x00\x57\xb3\xef\xf8\xd3\x0b\x96\xeb\x98\x27\xe9\x97\x6e\xe6\xa9\x35\x5b\x24\x21\x99\x29\xd6\xdd\x70\xcb\x56\xc2\x2e\xf0\x3f\x94\xdf\xc2\x0d\x37\xfe\xc4\x7c\xdc\xc8\x76\xfd\x99\xac\x1a\xc3\x13\x9f\xd7\x10\x35\x35\x14\x9b\xf4\x1c\x0d\xe6\xdf\x9d\x74\x26\xe5\xec\xf9\xe1\x67\xfb\x21\x19\x51\xe5\xec\xf9\xe6\x74\xa6\x07\xfa\x46\xf8\x37\x0e\xd5\x46\xf6\xfd\x58\xae\x26\x87\xcc\xd4\xba\xe9\x31\x2c\xaa\x36\xaf\x06\x78\x1a\x33\x27\x11\xd9\xd5\xdd\x49\xf9\xb7\x67\x5c\xa5\xbe\x34\xd7\x28\xd6\x40\xe9\x86\xf3\xed\xb1\xa7\x13\xc6\x74\x4a\x73\x3e\xd5\x65\x8f\x01\x7e\x30\x1c\xfd\x97\xd1\x4e\x16\xe6\xab\xcb\xd7\x3b\x88\x33\xd7\x68\x27\xd8\xb9\x5f\xe4\x42\xac\x17\x7a\x9d\x1b\x6a\xec\x15\x47\xff\xd8\x66\xca\x0f\x10\xff\x43\x18\x8c\x69\x67\x76\x87\x09\x07\xce\x7d\x0c\x68\xe7\x8e\x00\x6f\xd8\xbf\x58\x99\x22\x82\x3e\x84\x5c\x9e\xcb\x88\x33\xc9\x52\x71\xca\x69\x58\x90\x88\xdc\x28\xa9\x4b\xc3\xfe\xef\x7a\x14\xad\x0d\xb5\x45\x94\x43\x06\x9c\xdb\xc1\x4d\x7b\x25\x1f\xbc\x46\x30\x1b\x90\x1f\xfe\xe9\x4b\x5c\x8a\x3c\x96\x71\xc4\x79\xdc\x84\x7d\x56\x0d\x96\x2f\xd6\x80\xe1\xdb\x42\xed\xc8\xe5\x66\xea\x9f\x79\x39\x8a\x6a\x1c\x48\x4c\xf2\x30\x13\xc3\x71\xe4\x3b\xb5\x01\xdf\x46\x73\x8e\x1a\x26\xd2\x21\x25\x1a\xde\x0d\x6f\x5a\xfb\x13\xc7\x2a\xf7\xf5\xde\xec\xb5\xb2\x78\xb7\x19\x6c\xb0\xdc\x4d\xc5\x48\x5a\xef\xca\x7f\xb1\x9c\x87\xf9\xe2\x16\xb3\x70\x33\x39\x6a\x86\xe8\x86\x83\xe7\xa9\xd6\xcc\x88\xcc\x19\xfd\xf4\xb3\xdf\x65\xce\xf5\x54\x1f\xd9\xbb\x46\xa1\x26\x69\x64\x88\x48\xae\xd9\xb7\xfb\xa9\x85\xe1\xae\x62\xc2\x61\x79\x76\x79\xc5\x68\xa1\xd9\x2e\x44\x47\x53\xbf\x66\xd0\x54\xca\xbf\x8b\x9b\xec\x05\x91\xf6\xce\x07\x6e\x2b\x18\x8d\x66\xb6\x08\xa4\x08\x05\x9b\xea\x76\x9a\xf0\xac\x20\x7b\xcc\xf3\x73\x47\xd6\x50\xc4\x14\x33\x02\xc6\x09\x5b\xe5\xa6\x27\x6b\xe0\xb4\x74\xe8\x47\x85\xcf\x7f\xb8\x8e\xae\x1d\x92\x38\x1f\x77\x18\x65\xde\x23\x02\xee\x45\x46\x6d\xad\x97\x4e\xd4\x81\x19\x23\x79\xff\xe3\x0d\x9c\xbf\x7c\xd9\x0f\xe6\xb4\xb0\x63\x63\x90\x84\x8c\x7b\xc2\x9b\x9c\x3d\x63\x1c\x97\x6a\xb6\x83\xbc\x3f\x7c\x05\xac\xb3\x4a\xce\x30\x94\xcb\x45\x2a\x13\x84\xbc\x81\xe3\xb5\x8f\xae\xed\x1a\xb3\xc0\x8e\x4d\x26\xf6\x45\xb2\x3f\xb5\xef\x6c\xa6\x6c\x9b\x32\x8b\xbf\xe4\xe3\x6d\x96\x9c\x13\x65\x25\xf0\x3e\xff\xf9\x34\x50\xf3\xd3\x57\xdc\x60\x38\x36\x31\xda\x6e\xe6\x38\x4c\x1a\x1d\xa5\xc7\x34\xf3\x81\x1d\x4e\x5f\x4f\x08\x51\xc4\x7f\x5c\xc8\xcc\x1e\x70\x4d\xb1\x34\xcd\xcc\x19\xb0\x54\xdf\x71\x5b\x98\x06\xc7\x86\xfb\xee\x74\x57\x24\xb0\xf5\x4f\x0c\xd2\x24\x0d\x15\xb0\x6c\xb4\xc2\xd1\x00\xe7\x21\x66\xaa\x1b\x37\xc3\x9c\xce\xfa\xa5\xaf\xd4\x4a\xe6\x32\x7f\xe2\x0a\x66\xf7\xd5\xaf\xca\x28\x25\x2f\x37\xe8\xc0\x76\x1e\x15\xa1\xc2\x23\x5e\xff\x7a\x16\xeb\x42\x02\x4b\xc6\x7b\x3f\x7c\x12\x36\x09\x0e\x3c\x3d\xeb\x8a\x7d\x14\xa5\x56\xc7\x82\x97\xcb\xd8\x2b\xc6\x61\xff\xfa\xdd\x1f\x6c\x71\x07\x41\x37\xa3\x23\x06\xa8\x16\x1f\x7e\x95\xc0\xe1\xdb\x42\x71\x3a\x47\xfc\xc7\xbb\xd6\x7a\xfc\xd7\xd1\x04\xe7\x6a\x66\xca\x2c\x1f\xc2\x61\xa4\x1e\x02\x06\xcc\x16\xb0\x52\xe1\xfe\xed\x9f\x33\x3b\x1f\xdc\x32\x66\x5e\x50\x93\x22\xab\x24\xf8\x53\xcc\xbd\xd0\xf4\x5e\x2b\x34\xea\x5f\x5c\xd7\x60\x39\xd7\xf8\xc8\x81\xd3\x3d\x3a\x77\x6a\x4e\x8b\x0a\xb7\x06\xe9\x22\xb3\xa2\x21\x27\xec\x3f\xf2\x22\x28\x4e\xb9\x32\x8d\x27\xf1\xe2\xd4\xc2\x19\x4a\x30\xd7\xa9\x05\x5a\xf2\xaf\x87\x76\xd4\x34\xa0\x3e\x3f\xbc\x72\x43\xb1\x44\x4e\x58\xc0\x6d\x65\xa0\x78\xef\x8f\x6e\x7a\x17\x6d\x09\x7f\xc5\xc4\x0d\xa9\x4c\x38\x4c\xc5\x36\xa3\xee\x1f\x93\xd5\x18\xf6\x5c\x03\x35\xf9\x89\x05\xd4\x5b\xf4\xfc\xc5\x51\xf8\xbc\x0b\x49\x39\xcd\xe3\x4c\x63\xc4\xc4\xfc\x5f\x4c\xf7\x5d\xb5\x5b\x12\x42\x06\xec\x5c\x35\xf9\x02\x18\x26\x75\x4c\x83\x69\xca\x5d\x19\x01\x13\x29\x3f\xbe\x1f\xce\x5d\x91\xea\xd2\x32\x93\x75\xab\xd6\xf7\x5e\xe9\x32\x29\x18\x86\x8e\x60\x0e\xbb\xd9\xe3\x02\xdf\xfd\xe3\xc1\x2c\xda\xcc\xa4\x82\x01\x17\x19\x3e\x5d\xc1\x06\xf2\x73\x33\xeb\x12\xda\xe9\x94\x88\x97\x88\xdd\x11\xda\xe2\x4f\x6e\x87\xb7\x3a\x7e\x70\x04\xdb\x43\xcc\x26\xca\xfd\xcc\x50\x34\x83\xe7\x9c\xc8\x38\x39\xe5\x2f\x0e\xca\x39\x06\xa2\x58\x22\xe3\x93\x37\x04\x3d\x7e\xf9\x4a\x0e\x23\x3b\x23\x73\x74\x3f\x71\x94\xe5\x19\xe6\xa6\xcc\x9c\xa2\xc6\x05\x74\xf9\x08\x78\xbb\x1c\xff\x74\x02\xf2\xff\x9e\xbf\xf2\x61\x46\xc0\x85\x21\x0c\xc3\x31\x5a\x13\x1b\x3b\x15\x84\x65\x3a\xa8\xc0\x2d\xc3\xf9\xe1\x2f\xe0\x18\xf4\x97\x6f\x31\x04\x8b\xcb\x02\x9e\x8a\x77\xcb\x98\xe4\xe6\xd2\x77\xee\xef\xcf\xbf\x9f\x1f\xfc\xf7\xdd\x94\xbd\x66\x4e\x5f\x90\x51\x09\x7a\xcf\x4f\x72\xf3\xb5\x1c\x90\xde\x58\x70\x92\xfe\x4d\xae\x32\xb9\xd1\x60\x01\x2b\x42\xa4\xcf\x87\x29\x6e\x99\x0d\x19\xb0\xcb\xbf\xe7\x77\xc6\x69\xe4\x41\x8b\xd9\x18\xcc\x63\x6a\x93\xa2\x7b\xc4\x85\x02\x26\x1e\x34\x55\x35\x88\x30\x61\xff\xc9\xb6\x3e\xa8\xbd\x42\x7d\xf2\xf7\x29\x20\xf8\x4d\x48\x05\xa4\x88\x7c\xad\x7c\x2e\x5b\x18\xc8\xe5\xff\xe9\x4a\x88\x65\x41\x7d\x52\x24\x0a\x16\xf3\x6f\x99\x6e\x81\xa7\x74\xf2\x17\xf7\x6c\x96\x6a\xe4\xb6\x90\x7a\xfe\xef\xdc\x4e\xc1\xb1\x5f\x73\x58\xb6\x51\x41\x6c\x4d\xf1\x81\xca\x46\xb4\xc6\x15\xfe\xff\x58\x5a\xfc\x82\xe4\x5d\xf2\x4b\x49\xdb\xe2\xb4\xc3\x43\x09\x43\x07\xf9\x32\x51\x61\x8c\x8c\x45\xe6\x7d\xa3\xfc\xdc\x4b\x62\x4f\xe1\xf4\x3f\x8f\x42\xf5\x5e\x3d\x41\x3b\x85\x8f\x3b\x14\xda\x48\xa1\xb9\x1d\xe7\xaa\x8b\x8f\x8e\x05\xc9\x0f\xf2\x73\xd5\x9a\x30\xfd\x9c\x47\x54\x67\x41\x59\x9e\x3c\x93\x43\xea\xf4\xc8\xb2\xa5\x89\xf8\x39\xb8\xc6\x88\x78\x6f\x1f\xba\x2d\xab\x85\x2c\x08\x43\xd3\xbe\xb2\x92\x17\x97\xa7\xe3\x32\x7e\x85\x08\xa9\x2f\x0a\x42\xa7\xa4\x3f\xf2\x32\xc2\x9e\xd6\x30\x26\x5e\x54\x1e\x2d\xd0\xd3\x97\xbe\x20\x93\xbf\xcb\x81\xd2\x44\x27\x32\xc0\xb5\x5b\xb5\x24\x2b\xde\x76\x57\xc9\x10\x2e\x5f\xb9\xe6\x53\x33\x8c\xc2\x14\x3f\x2f\xf1\xb9\x4a\xed\xa7\x7f\x31\xc7\xa0\x2c\xfb\x2a\x01\x88\x91\x7d\x18\x86\x47\x34\x65\x88\xd9\x61\x97\x67\xda\xaa\x6a\x7d\x12\xc4\x0a\x07\x47\xf2\x3f\xf1\x00\x35\x91\x71\x02\x86\xc7\xe2\x89\xd1\x39\xfc\x3f\x2e\x4b\x54\x73\xbd\x2c\x59\x99\x9a\xff\xec\x6c\xd2\xa6\x2b\x31\xaf\x29\x92\x4e\x0d\x25\x39\x49\x61\x5b\xe9\x66\xf0\x0c\x66\x85\x4d\x32\x8b\x26\x56\xdc\x18\xde\x82\x19\xa0\xce\x4e\x82\x51\x03\x46\x41\x80\xdf\x09\x3f\x39\x6c\xa3\x35\xad\x1e\x02\x3e\x73\xe4\xa7\xd9\xd7\x5c\xce\x18\xb4\x86\x6c\x3b\xb2\xf5\x29\xa6\xb6\x57\x25\x32\x28\x1e\x4a\x6e\xb1\x64\x17\xfb\xe3\x77\x29\xde\xa7\x1e\x76\x92\xa5\xe5\x69\xeb\x68\xae\xf9\x9f\x33\xba\xb0\xda\x82\x86\xe5\x72\xe1\x89\xa1\x9f\x74\xc2\x0e\x9b\x9b\x84\xf5\x70\x46\x6c\x53\x88\x86\xba\xd9\xc9\x75\x63\xf5\x74\x75\xb2\xf2\xc6\x21\xec\x25\x45\x01\x47\x6d\x7c\xb0\xed\x01\x9d\xde\xcd\x8f\x06\x1b\x7c\xfd\xf8\x8a\xbb\x1f\x5f\xd6\x72\x9a\xb7\xc2\x40\xdc\x28\xd3\x93\x47\x95\xbe\xf3\xc3\x50\xac\xa6\x60\x1d\xf1\xb8\xd4\x74\xf5\x6e\x34\x3f\xf8\x6f\x1f\x3f\x54\x79\x6c\x1f\x81\x94\x19\xc2\xbe\x61\x6b\x86\x49\x37\xdb\xfc\x2c\xff\xc4\x46\xc2\xe1\x79\x87\x41\x85\xc3\xff\x3b\x67\xf2\xe8\xbc\x0b\xfb\xd5\xbb\x92\xcd\x1e\x17\xab\x63\x02\x15\x30\x52\x15\x95\x5f\xa1\x75\xae\x0a\xd2\x24\x34\x7d\x3b\x97\xb2\xce\xa6\xba\x1f\x20\x30\x51\xa4\x45\x44\x30\x37\x88\xe4\x44\xa6\x4b\x9c\xad\xf9\xbe\x94\xcc\x0c\xf4\xe3\x4f\xb3\x4f\x6f\x10\x4e\x3e\xf2\xad\x2a\xf4\x6b\xc5\x80\xdb\x78\xce\x59\x47\x05\x8f\xe9\x07\xb4\x75\xef\x3b\xa0\x70\x2f\x52\xbd\x0c\x26\x32\xc8\x08\x86\x84\xcd\x04\xc5\xe9\x4e\xb2\xad\x14\x11\x6e\x34\x72\x09\x37\xed\x3f\x99\x67\x2c\xe3\x7c\x01\xe7\x26\x77\x73\xf8\xb2\x12\xdc\x90\x93\x43\xd8\x08\x82\xdc\x91\x90\x4a\x2e\x60\xdf\x95\x24\xd6\xb5\xc4\x5e\x9a\x3a\x18\xde\xa2\x06\x71\xc9\x99\x88\x94\x14\x14\x3e\xba\xc5\xbd\xf2\xa2\xe3\x0d\xed\x3f\x9d\xc1\xd3\x33\xf5\x91\x31\x52\xf4\xc2\x72\xcb\xd6\x79\xf0\xd2\x2d\x37\x61\x94\xc1\x61\xc2\xfa\x24\xb0\xac\xb4\x92\x7e\x87\x7a\x4b\x23\xe7\xfa\x2c\xcd\x21\xce\x67\xa7\x59\x73\xf7\xe5\xee\xc4\x49\xd8\xff\xb7\x2f\x0e\xb9\xb2\x36\xdf\x94\xef\x1e\x62\x51\x80\xfa\xa0\x4c\xd4\x77\xa4\xaa\x4b\xa8\xf0\x0d\x16\xe2\xe4\x18\x5c\x92\xba\x16\xe3\xa6\x26\xba\xae\xec\x21\x1c\x86\xc6\x99\xd7\x3e\xa7\xe6\x8f\x21\x68\x4d\xab\x72\xff\xf4\x81\xbc\xb0\x5f\xed\xae\x4c\x71\x2d\xc3\x28\x84\x7f\x59\x78\xee\x75\x33\xd9\xed\x4d\x13\x9c\xe2\x2e\xf1\xba\x4a\x72\xfb\xbc\x07\x43\x38\x91\x52\xb1\x47\x90\xb4\xe1\xbb\x37\x1c\x1f\x42\x2f\x71\x81\xc1\x21\x39\xa0\x57\xe0\x1b\x30\x81\xf2\xb3\x64\x5c\xe0\xed\xb4\xeb\x39\x71\x4f\xc7\xfd\x81\xab\x8c\xfb\xea\xc5\x18\x0e\x89\x45\xda\x10\x6d\xff\xbe\x40\xc1\xa1\xc4\xe2\x73\xb9\x6f\xbf\x5c\xf2\x46\xc9\xaf\x35\xaf\xeb\x2c\x69\xdc\xd7\x32\xad\x90\xbb\x2b\xdb\x9e\x4b\x55\xb3\x1b\x28\x10\x96\x9f\x7b\xc7\x9c\xd3\x20\x4f\xb4\xc5\x74\x32\x1b\xf1\xf9\xc0\x42\xca\x69\x9d\x66\x7c\xeb\x09\x4b\x25\xd1\x06\xcb\xa7\x90\x9a\x79\x08\x36\x13\xcc\x47\xe2\x5c\xb7\x86\xbf\x3d\xfa\x52\xdb\x4f\xda\x76\xef\xb2\x4e\xda\x46\x15\x06\xae\x13\x4a\xaf\xd0\xbc\xfe\xc3\xcb\xc8\x14\xa9\x1c\x75\xbc\xf7\x3a\xc9\xb7\x1e\x7a\xce\x5b\xce\x6d\x59\xc9\x1d\x20\xb6\x86\x32\x78\x8e\x6c\x92\x84\xfb\xa5\x27\x5c\x4f\xf6\xcf\x17\xcd\x48\xb4\xaa\x61\xe9\x33\x8d\x97\x13\x59\x55\xf9\x2a\x46\xf8\x4d\x9c\x19\xa7\xc4\x56\x7e\x0a\xa7\xfb\xc9\x79\xf5\x8c\xd5\xf1\xde\x93\x30\x05\x0d\xd3\xf6\x40\x95\xcb\x71\x90\x3b\xb0\x94\xf2\x72\x25\x3c\x37\xe5\x38\x65\xb2\x6b\x35\x2e\x3b\x48\x1d\x79\x36\x22\x33\xf7\x88\x92\x6e\x04\x57\x66\x8f\x41\x09\x25\xa7\xa4\x73\x36\x2a\x2b\xee\xe7\xc7\xd6\xf3\xfb\x47\xde\x7f\x19\x8a\x76\xf2\x07\xcd\x1e\x37\x85\xc1\xa4\xf9\x34\x3f\xca\x6b\x51\xf7\xf7\x43\x15\x7e\x1a\x03\x37\x72\x5e\x68\xae\x86\x08\x66\xe4\xa7\x21\xe5\x96\x0e\x56\x66\x23\x04\xd2\xf2\x13\x93\x59\x1e\x37\xc5\x74\x22\xa8\xb5\x9e\x95\x1e\x1b\x73\x44\x4c\x50\x77\xbd\x20\xe5\x98\x8e\x79\x05\xe6\x63\x3c\x06\xf7\x98\xc8\xfc\xe5\xcb\xca\xe4\x85\xaa\x59\xe6\x11\x7b\x7b\x53\x30\x4a\xbf\xc6\x64\xdb\xf2\x3d\x9c\x6e\xde\x95\xf5\xfa\x08\x3f\xb1\xab\xd1\xb0\x97\x93\x44\xf7\xde\x94\x37\x19\xc0\x70\x54\x80\xb3\xac\xf6\x25\xef\x44\x15\x5e\x4f\x71\x83\x19\xe0\x99\xe3\x43\x9b\xe9\x77\x55\xbf\x48\xf4\x64\x7d\x1d\xe0\x28\xde\x7e\x94\x19\x48\xf5\xca\x6d\x84\x40\xfc\xdf\xe7\x14\x0a\xc6\xd0\x93\xca\xf1\xe5\x08\x42\x46\xb0\xda\x53\xd8\x5f\xcf\x0f\x76\x59\x6a\x6b\x2d\x34\xb8\x10\x50\x29\xdf\x84\xee\x12\xea\x08\x46\x2b\x1a\x11\xeb\xa2\x35\xc0\xf1\x7e\x3f\x82\xdd\xf9\xf7\xb8\x60\x07\x25\x6b\x57\xab\x31\xf1\x8f\x4e\x8f\x59\xf6\x50\xe4\x84\xc0\x11\xea\xd7\x47\xc6\x0b\x5c\x36\x94\x4b\xe4\x84\x90\x28\xf5\x2c\x3b\x12\xcd\x32\xcd\x63\x40\xfd\xba\xca\x42\x1b\x7c\x03\xd9\x04\xe0\xce\xe4\x6b\x60\xd2\x42\x64\xd3\x0b\x12\xf1\xd3\x73\x8d\x66\xc0\xfc\xcb\x87\x23\x3d\x03\x7c\xe8\x78\x43\x13\xff\x3b\xfb\x4d\x03\xed\x8d\x69\x2f\xc6\xb7\x53\xba\x55\x11\xb4\x6e\xb3\xc0\xa5\x4c\x74\x3e\x79\xac\x29\xb7\x06\x2a\xfe\x50\xbf\xce\x58\x6c\x81\x46\xc8\xba\x03\xb7\xa6\x19\xf5\x1f\x6e\xf6\x6c\xbd\x29\xb6\x52\xf2\xd3\x17\x88\x61\x93\xd8\xc2\x3b\xda\xd2\xe6\x8d\xbf\x51\x0f\x8c\x8d\xd7\x78\xa1\xd7\x78\xd2\x2f\x85\xd1\x28\xa8\x15\x7c\xb9\x85\x61\x0e\xc0\x5d\xba\xdf\x31\xca\x66\x71\xfa\xe6\x8c\xf1\xfc\xd4\x30\xf6\x8a\xf5\x4e\x1d\xa3\xbc\xb6\x55\xf4\xe9\x2b\x12\x46\xd8\x1e\xe1\xba\x69\x3b\x7d\x3c\x3e\x44\x58\x6d\x4e\xd3\xb1\xf1\x65\xaf\x4c\x0e\xd6\xa9\xce\xbe\xec\xb1\xd3\x13\x55\x0f\x94\x9b\x21\xd1\x69\xe4\xc7\x2f\x9b\x26\xc6\x2c\xb3\x6f\x9c\xe2\x70\xff\xa3\xdb\x85\x46\xc0\x8b\xd3\x85\x2c\x65\x81\x91\xc1\x0d\x00\x3e\x34\x2d\xf0\xa8\x4b\x11\xaa\x65\xf6\xd6\x16\xda\xf8\xcc\x84\x39\xd9\x34\xfd\xf8\x3d\x0c\x97\xa5\xac\xa7\x99\x72\x5b\x38\x74\xea\xcd\x47\xa9\x5c\xe9\x2e\x76\x9c\xf9\x77\x2e\xd9\xa2\x9e\x91\x00\x10\x02\xef\x8c\x85\xf0\x70\xbe\x32\x02\xd8\x9f\x92\xdf\x4a\x18\x2d\xd7\x6a\xda\x46\x54\x16\x88\x29\x22\x50\x81\x81\xf9\x6c\xdc\x46\x0b\x49\xa7\xa0\x28\xf6\x07\xce\x48\xb4\x48\xd2\x4f\x7b\xc5\x42\xad\xde\x9c\x9c\x5a\x41\xa3\xfc\xe7\xbb\xdb\xcf\x1d\xbb\x1e\xae\x8d\x18\x40\x7e\x25\x6c\x72\x48\xd9\xaa\x81\xc4\x5b\xeb\x1a\x5c\x02\xd8\xf4\x23\x2e\x34\xde\xcf\x74\x02\x49\x86\xed\x74\xda\x16\xc7\xa3\xca\xaf\xd2\x2b\x19\x97\x8b\x97\xfb\x67\x9c\x62\x67\x65\x0c\x17\x7c\x37\xcd\xf4\xef\x1e\x61\xcb\x37\x2f\x1d\xc4\xab\xe1\xe7\x1b\x84\x63\xf7\x7e\xd4\x81\x92\xf9\xfe\xab\xac\x57\x2b\x30\xef\x9f\x78\x8a\x69\x58\xe0\xaa\x5d\x08\x2f\x98\xc9\xd9\x8b\xf2\x73\xc4\x2b\x38\x5d\x63\x09\x1f\x0e\x57\xde\xa8\x51\x17\x70\xec\xde\xc0\x00\x59\x92\x9b\xe2\x9f\x57\x06\xc5\xf1\x58\x54\xc1\x21\xd5\xa7\xff\x8b\x4d\x01\x9e\xa1\x3b\x10\x59\x24\xe7\xf5\xdd\xd6\xf1\xfc\xee\xdc\x31\x05\xac\xd8\x66\xf3\x3a\x2f\xe1\x29\x8f\x66\xe4\xba\xdd\xf4\x00\x53\x6f\x1b\x35\xd5\x27\x34\x7f\xca\x96\x27\xfc\xc1\x0a\xf1\x9e\x1a\x91\x9d\xa3\xbc\x54\xe9\x3d\x9b\x32\xc3\x30\xd8\xb4\xef\x3b\xd9\x44\x38\x9c\xd9\xba\x06\x3b\xbf\x8e\x51\x6c\x34\x9f\x37\x10\xb5\x34\x75\xf5\x8f\xca\xed\xf2\x65\x23\x7f\xe2\x5c\xbe\x6f\x90\x9d\xa7\x90\x0a\x46\x8a\x80\x48\xd6\x7d\xd3\xa8\x8b\x18\xd7\x75\xf1\x10\x06\x39\x96\xb6\x79\xf5\xa2\x73\xaf\x6b\xe3\xe4\x30\x53\x5a\xdc\xf0\xfe\x3b\x13\xbc\xbe\xe1\x72\x8f\xe1\x0d\x7a\x40\x1f\x75\xf5\x5e\x7d\x48\x23\xb6\x00\x71\x17\x22\x1d\xed\x0b\x83\x09\xb3\x91\xfc\x28\x46\xed\xbd\x5e\x73\x77\xc0\x27\x8e\x5c\xb2\x76\x7d\x8c\x6a\x58\xbc\xbf\x9c\xf4\x20\x37\xf6\xd2\xaf\x31\xe8\xfd\x80\xe5\x4f\x85\x6e\x16\x79\x6e\x8b\x46\x09\xb5\x35\x8d\xa0\x01\x67\x9a\x39\xba\xc9\x36\x72\x05\xd0\x38\xce\xbf\x38\x5a\xd6\x71\x33\xd4\x47\x11\x9a\x8c\x8e\x50\xe6\x72\x3b\xcc\x95\x13\xd5\x7e\x70\xfd\x38\x8e\xc7\xed\x22\xe4\x0b\xf8\xde\x9c\x88\x4b\x01\x76\xa7\x07\xbb\xb7\xbf\x79\xf4\x05\x9f\x92\xdf\x2c\xf8\x13\xe8\x5e\x35\xb1\x76\x01\xe3\x1b\x2d\x54\x2b\xaf\xe9\x6f\x74\x8a\x2f\xec\xa0\xfa\x01\x82\x68\xde\x3c\x83\xe9\x5c\x97\xdb\xc4\x0e\x17\x7f\x5f\x53\xcf\x32\x3f\xb1\x1c\xfb\x38\xf9\xc8\x55\xad\x09\xfb\xb1\x78\xf8\x79\x2e\x26\xff\xe5\x97\x84\xcb\x7b\x45\xd0\x8e\x32\x74\x97\xac\xf1\x76\xb6\xb1\x79\xcf\x5d\x60\xf9\x7f\x72\x43\x2d\xdf\x03\x52\xa4\x77\x3f\xd6\x23\x5f\x0a\xff\x23\xcb\xf8\x2f\xe7\xc4\xc5\x51\x3f\x8e\xe0\xae\x9a\x17\x70\x69\x97\x3d\xd1\xf1\xcd\xe3\x7b\xec\xe6\xbf\x87\xe6\xfc\xc1\x3f\x79\xbc\x27\xe0\x68\xa5\xa3\xec\x8d\x92\x85\xf5\x48\x06\x8f\x3d\x0d\x34\x5f\x5d\x75\x20\xb3\xf9\x00\x11\x84\xba\x9f\x72\x3b\x8a\x98\x9d\xae\xed\x68\x40\xbe\x91\xee\xfa\xfe\xa3\x37\xd8\x23\xdb\x2c\xb6\xac\xfc\x9b\x23\x9f\x04\x89\xfd\xe6\x04\x97\x66\xf0\x62\x05\x9f\xd2\x17\x4f\xec\x91\x21\xfe\xc7\x27\xbb\xae\x94\x89\xd5\xa6\xf7\x62\x3f\xd7\x04\x8b\x43\x6f\x8f\x15\x8c\x5d\x96\xf3\xb9\x91\xbf\xff\xe2\x0b\x53\x40\x3e\x9c\xde\x30\x2d\x65\xb4\xcf\xab\xc2\x1a\x5f\x9e\x07\x7d\x1a\x12\x68\xb6\xa4\xad\xb2\x76\x43\xb6\xff\x7a\x3a\xab\xbc\x3d\x63\x7a\x72\xd3\x77\x95\xaa\x03\x52\x89\x57\xc0\x54\x57\x6d\xb0\xc5\xff\xc4\x55\x2d\xf3\x30\xe7\x2b\x98\xef\x90\x6b\x65\x35\x12\x26\x26\x22\x11\x0f\xaa\x37\xa7\x94\x3f\x7e\x84\x74\x29\x56\xac\xf0\x65\xbe\xd6\x62\x61\x4e\x4f\xc5\x5f\x01\xe3\x96\x99\xbd\x35\x98\xc3\xbf\xff\x3f\x96\x61\xeb\x46\xf5\x84\x23\x21\xd6\x0e\x92\x14\x51\x84\x2f\xe0\xd4\x21\x0d\xfb\x9f\xf5\xce\x48\x8f\x74\x33\x8b\x62\xdf\xc8\xfb\xe0\x35\xca\x15\x8c\x29\x0c\x77\x03\xe4\x9c\xfb\x81\x0c\xec\x1f\x97\xf9\x9b\x90\x95\xff\xa9\xb4\xf2\x6d\x80\x64\xc5\x13\x2c\xc2\xf5\x8f\xa3\x16\xba\xf4\x2b\x9e\xfb\x9f\xb5\x7e\x14\x80\x67\xac\x87\xc9\xdb\x6c\x5d\xf9\xed\x2c\xad\x93\x3f\x52\x71\x88\x44\x25\x20\xfe\x5f\x6c\xf2\xeb\x19\x2d\x50\xc0\xc1\xd0\x63\xe5\xcf\xbc\x3b\x76\xc4\x2f\x8d\xfc\x83\xdf\xf1\x25\xe5\xb0\xe4\x64\xbf\xe2\xbc\x35\x9a\x7e\x47\xda\x5d\xe9\x83\xd9\x7c\xed\x76\x87\x8a\xff\x17\x07\x9b\xcb\x61\xf6\x9d\xbf\x36\xb2\x75\x55\xee\xfd\x86\x42\x78\x5b\xed\x1b\x30\x55\x75\x41\x68\x23\x3b\xdd\x5f\x1e\x45\xbe\x77\x17\xa5\xf7\x4b\x6b\x66\x28\xb2\x5d\xb2\x5d\xaa\x27\xe3\x29\x74\x43\xc0\x09\xe5\xb6\x8b\xff\x89\x3b\xd9\x31\x77\x50\xf9\xd4\x2a\x11\xa2\x2c\x87\x9e\x2c\x19\xae\xbe\x5d\xc0\x15\x64\x5b\xa8\x9c\xed\x40\xff\xd6\x32\xb1\xe2\x8b\xb1\xef\x2e\x52\x79\x9a\x8a\x03\x62\x2d\x68\xc0\xe4\x00\x5d\xc8\xec\x47\xf4\xfe\x07\x07\x50\x9e\x84\x41\x2a\x5f\x35\xa6\x6d\xce\x7b\xad\x9e\xbf\xf6\xfd\x40\xfe\x2e\xf3\x0c\xfb\x0f\x6f\xc2\x67\x92\xd2\xde\x33\x45\x4e\xc4\x4d\x97\x06\xc3\x46\xaa\x3e\x8e\x61\x53\xa7\x98\x47\xae\x5d\x90\x3f\x0f\xd3\x6d\xc3\x5f\x9c\xe5\xb9\x79\x97\x9d\x28\x5a\x2c\xd8\x88\xfe\x1c\xe1\x4c\xcb\x9f\x12\x66\x98\x5d\x76\x75\x3a\x09\x9c\xff\xf4\xbe\xa3\x11\x85\x3f\x2a\x16\xa8\xcc\xfb\x83\x60\xa8\xe1\x7d\xac\xe6\xde\x27\x4b\x30\x43\x51\x0c\xc3\xd5\x31\x04\xf7\x2f\x37\x95\xd1\xa5\x0f\x15\xf9\x34\xc8\x6c\xf2\x4c\xcb\xbf\x7f\x5b\xdb\x2c\x35\xf1\xd1\xe6\x81\x91\x23\xee\x8a\x16\xea\x10\x05\x8f\x19\x7f\xb0\x63\x83\x28\xfc\xae\x72\x35\x2b\xc7\x2a\xe7\xfa\xa0\xed\x60\x13\x85\x53\x98\x68\x19\x2a\xde\xf6\x0f\xf3\xe9\x5c\x75\x5e\x8c\x5d\x67\x33\x7d\x19\xa7\x6f\xc9\xa5\xfd\x0e\xf7\xae\xbb\x7c\xd4\x54\x58\x48\xae\xf1\xbe\x3b\x0d\x4e\x18\x02\x71\x1d\x15\x77\x2a\x0b\xc8\xeb\xff\x60\x71\x4e\xb2\x87\x11\x47\x24\xf5\xb0\x1e\xf0\xc0\x60\xb1\xf9\xb6\x6a\x6a\xab\x1f\xf6\x73\x53\x95\xe2\x7e\x0d\x22\x5b\x3e\x7d\x51\x1e\xd8\x52\xf0\x43\x6a\x74\xfc\x1a\xa6\x8e\xf7\x47\x07\x46\x8d\xce\xf0\x7d\xe7\x96\xa7\x7c\x4a\xba\x71\xb6\x81\x29\x75\x08\x72\x21\xd2\xf5\x48\x07\xaf\x62\xaa\xc6\x37\x65\x9d\xdd\xad\x7b\x45\x1d\xf6\x05\xb0\x9b\x09\x7f\x78\xff\x38\xb9\xc8\x3f\xa5\xa8\xc9\xc6\x39\x80\x36\xe7\xc3\x34\x64\xb5\x4f\x5b\x70\x9d\xeb\xb1\xe9\x50\x09\x36\x7f\xa1\x38\x18\x79\xde\xdb\x1c\x75\x8a\x83\x61\xb6\x39\xae\xa3\xb3\x53\x8f\xdd\x4c\x30\x3c\xff\xc9\xc1\x25\xa8\x18\xc7\x7f\xb5\xe9\x00\xa7\x9a\xae\xbe\x6b\xb6\xee\x32\xdb\x14\xa6\x8e\xcb\xf4\xf1\xc1\x4e\x2d\x5d\x44\x8c\xfc\x7a\xd8\xa4\x94\x79\x9a\x6d\x2e\x66\x1f\xb4\xad\x8d\x9d\xab\xa2\xa2\x26\xee\xff\xf3\x7b\x60\x5e\x7e\x69\x23\xa0\xcd\xfb\x35\xd1\xa6\x03\xbd\x55\xf8\xfc\xe6\xac\xf3\x47\x24\xe1\x1a\xc8\x7a\xcd\x3c\x0c\x87\xd4\x3e\x8c\xb6\x52\xd1\xa9\x78\x76\x51\x2d\xde\x76\x37\x0e\xaa\x6d\xb8\x0e\x3b\xfe\xe8\x5a\xee\x11\x5a\x0a\x61\xf0\x0a\xe5\xa6\xa2\xb6\xc3\x01\x0e\xc5\x04\x15\xef\x3d\x97\x3f\xee\x90\x28\x8b\x90\xc8\x2d\xb1\xac\xeb\xbc\x1f\x38\x56\x29\x47\x9d\x12\xb1\x3b\x8f\x7b\x46\xb6\xdf\x80\xfb\xa7\xf3\xd9\x46\x71\x5d\x71\x2f\xbf\x07\xac\x89\xfb\x1b\xd3\xf2\xce\xfd\x67\x2f\x9f\x62\x5c\x12\xae\x83\x10\xcd\xd6\x52\x5e\xa7\x19\xcc\xd2\xe6\xc1\x0d\x42\xd5\xcf\x3f\x4c\x5b\xe1\xaf\xbe\xb0\x09\xf8\x62\x5f\x53\xfa\xdf\xde\x25\x4d\xd9\x78\x91\x9e\x16\xfe\x5a\x8d\x6b\x6d\x83\xc0\xbe\x30\x8e\x18\x05\x58\x25\xb9\x2e\xa7\xdd\x2b\x63\xe4\x32\xbb\x58\x4b\xa8\xc0\x70\x18\x0f\x96\x47\x75\x30\x3d\x7d\x29\x68\xf4\x6e\xf9\x94\x6f\x47\x71\xf8\x1f\x8e\x50\x8e\xfd\x8a\x98\xed\x7a\xad\x2d\xba\x11\x7e\xa4\x56\xa4\x6a\x23\x71\x76\x6b\xfe\xd6\x89\xcd\x4b\xc9\x33\x06\x41\x06\x97\x9f\xa4\xe2\x1c\xaf\xf0\x9b\x42\xee\x81\x74\x5a\xfa\x0e\x86\xc7\x28\xcd\x00\x59\x83\xf2\x54\x6f\xd3\xaa\x6b\xd8\xf6\x7f\xb1\xee\x5a\xbf\x28\x2d\x59\x9f\x86\xe1\x33\x1c\xb4\xd3\x3c\x4f\x03\xed\x13\x60\xa6\x7e\x25\xf3\x35\x4b\x0d\x6e\xfa\xc1\x9d\xe9\x4b\x9e\x8d\xe7\x72\x4f\x2e\xe0\x10\xc0\x73\x60\x5e\x57\xe9\xac\xc7\x14\x3f\x38\x2d\xa3\xdd\x6a\xce\x50\x7a\xde\xb9\xa5\x00\x9b\x47\x11\x76\x5d\xe0\x74\x09\x62\x88\xf5\x9c\xf6\xb6\x8a\x25\x72\x3b\xc2\x11\x77\x57\x1f\xaa\x6e\x0b\xd5\xc7\x59\x66\xc8\x53\xa2\xe6\x93\xdc\x4e\x2b\xa6\x0a\x25\x38\x74\x27\x29\x06\xb7\xd9\x57\xfe\x61\xd3\xdf\x3e\x81\x8e\x06\x48\x85\x7e\x2d\x34\xf0\x12\x51\x46\xff\x9d\x33\x56\x53\x5d\xcd\xd5\x35\x9b\x52\xcc\x06\x6d\x74\x82\xe4\x63\x90\x6a\xf0\xb2\xc0\x35\x47\xa6\x3c\x9c\xaa\x77\xf6\xf7\x9e\xf5\x3c\x41\x4c\xb9\x87\x5a\xba\x0d\xcc\x73\x27\x3c\x9b\xd7\x54\x22\x4d\x75\xbf\x73\xfd\x30\xd0\x37\xcf\x9d\x59\xb0\xca\x59\x8a\x6e\x66\x48\x53\xd5\x12\x54\xc9\x73\x5b\x8b\x31\xfa\xa3\x53\x5b\xe4\xd5\x3f\x23\xaa\x3a\x94\x45\x40\x20\x0a\x04\xbc\xa4\xc9\xfe\x89\x94\xaa\x6a\x41\xdf\x2f\x1c\x12\xbe\xb2\xd0\xf6\x0b\x54\x4d\x6f\xd7\x15\x8e\x03\xbd\x93\xe1\x25\x36\xad\x34\x7a\x16\x7a\x6b\x08\xa3\x07\x9f\x77\x65\x73\x24\x6d\xb1\xe7\xdd\xf2\x2f\x89\x09\xd7\xea\xb1\xef\xf3\xf7\xde\x38\xc3\x32\x9f\x36\x50\xda\x9e\xea\x9d\x96\x78\x3a\x28\x6a\x92\x76\x9e\xf0\x17\x80\x90\x8c\x70\xd5\x04\xb6\x7c\xeb\x66\x9c\x05\x2b\xfb\x6f\xb6\xb7\x22\x33\xbb\xac\x24\x40\x92\xe4\xec\xdd\x2b\x79\xc5\xf2\xc2\x56\x0b\x9b\xca\x3d\x86\x71\xc8\x16\xac\xe7\x58\xed\xf3\x27\x91\xc6\x70\x8a\xec\x2a\x35\x52\xa4\xbd\x69\xe4\x2f\x8e\x6a\xb8\xad\x6b\x89\xc9\x5e\x16\x4c\x1e\x02\xc1\xc9\x4b\xf9\xa9\xc9\x9a\x27\x38\x45\xea\xb2\x63\xf8\x18\x12\xc7\xa9\x37\x3e\x76\x9a\x0e\x57\x9f\x4b\xd6\xb4\x69\xdd\xe5\xab\x5c\x1c\x14\x2b\xfe\x0c\xca\x24\x6d\xf9\x6a\xd1\xa2\xb8\xd7\x8a\xc7\x5a\xa4\x1d\x18\x71\xbd\xd1\xda\x6a\xca\xdc\x74\x22\x33\x87\x16\xbd\x76\x52\xe9\xc7\x23\x2d\x47\xe8\x41\xe2\x26\x3d\xee\xd8\x38\x12\xfe\x07\xd5\xdd\xcb\xf2\x1e\xd9\xa2\xb2\xea\x5d\xdc\x7b\x9a\x69\x21\x89\xca\xdd\x8a\x02\xcd\xfe\x5c\xa3\x63\x9e\xfe\x5f\x5d\xc1\x28\x72\x22\xe9\x4c\x6c\xaa\x7b\x8e\x89\x33\x2d\x1b\xcc\xeb\x9f\xd7\xa7\xc4\x41\x0b\x47\x0b\xe4\xce\xbd\xc2\xe1\x78\x0f\x47\x53\x11\xdc\x9f\x7b\x13\x46\xbb\xd6\x94\x6d\x25\xad\x45\xcb\x53\x8e\xb7\x7d\x88\x92\x29\xb2\xb1\x8c\x23\x31\x07\xa5\x92\x73\x7d\x38\x15\x99\xb2\x84\x26\xa7\x4e\xe3\xef\x72\x9c\x13\x6f\x73\x33\xd0\xb3\x39\x1a\xb2\xed\xae\x26\x7f\xd6\xd3\xdc\x9a\x8f\xe4\x20\x23\xf4\x24\x61\x7e\x3b\x65\xd5\x00\x5f\x3a\x23\x24\xf4\x8c\xab\x70\x3d\xc4\x8d\x8b\x55\x53\xf8\x15\x21\x25\xbb\xeb\x62\x56\xfb\xee\xa4\x35\x06\x8f\xb9\xd9\x9f\x5c\xd0\xe2\x77\x7d\xda\x90\xdb\xdc\xa5\x51\x7a\xfe\x3b\xdc\x7f\x27\xeb\x54\xd8\xda\x08\xd3\xd1\x3a\x81\x94\x18\x48\xda\x63\xdd\x11\x85\x30\x7d\x4d\x30\xd8\x25\xfc\x39\x2f\x8b\xbd\x74\x0e\x81\xcc\x7d\xeb\x3b\x46\xf9\x25\x1b\xc9\x2c\x7e\x86\x50\x4f\x91\x32\x48\x79\x3b\xeb\x55\xa3\x31\x3f\x09\xd4\xc1\xdd\xe3\xe5\xea\x1b\x66\x5b\x58\xe8\x7b\x49\x6a\xed\xd9\xb0\x6d\xa9\xc8\xa0\xfe\xb7\xae\x92\x11\xf8\x33\x9b\x3f\x6e\xc6\x57\x9a\x43\x05\x9d\x67\x2a\x2b\x81\x1f\xe5\x6c\xda\xde\xa9\x35\x88\x7c\x81\xd1\xd9\xae\x42\x8c\x46\xf8\x73\x3e\x16\xad\x74\xf6\x6e\xae\x27\xa6\xd3\x69\x67\x1e\x15\x19\x1b\xe3\xd7\x2d\xc9\x02\xea\x34\xff\x89\x97\xb8\x96\x4a\x64\x12\xa0\x51\xa1\xf1\x08\x71\x18\xf8\x14\x78\xa2\xff\x8b\x21\x30\x1c\x73\x6a\xbc\xe0\x7d\x72\x87\x88\xfd\x0e\x1f\x21\xb5\xd9\x58\x11\x0f\x4f\x19\xed\x6d\x8f\x00\x23\xe4\x40\x0f\x22\x47\x66\x48\x5a\x42\x4d\xad\x08\xeb\x89\x9c\xe7\x08\xb7\xa1\x5b\x81\x09\x8f\x59\xb8\x94\x53\xc2\x2e\xc9\x19\x2f\x89\x54\x8e\x4a\x9a\x19\x93\xc0\xb3\x05\x9e\xd9\x42\xc8\xb1\x35\xe7\xaf\x6f\xc2\x28\x1c\xd6\x99\x4a\x2c\x78\xbe\x35\x29\x7c\xf8\x1d\x56\xd3\x5d\x43\x8f\x3e\x48\x08\x88\x1f\xba\xf6\x18\x19\x6b\x28\x41\x5a\x4e\xa0\x72\x6e\xb5\xff\x64\x9b\xe9\x4a\x5f\x18\x59\x6f\xc0\x7e\x01\x7c\xc9\x22\x5c\x71\x50\x89\xb9\x10\xf3\x93\xa6\xba\x94\x69\xf3\xa6\xf4\xbf\xec\x3d\x76\x38\x99\xdd\x31\xcc\xc2\xf0\x78\xf1\xf7\x28\x29\x8d\x4e\x74\x6e\xff\x35\xdc\xb0\x23\xf3\x34\x37\x05\x14\xa1\x77\x3a\x5e\x69\x74\x66\xca\xd7\xb6\x80\xb5\xbc\x46\x0e\x92\x4f\x3b\x5e\x81\xf8\xb9\x6d\x0f\x98\x81\x31\xcb\xed\x14\x36\xb7\x0c\x3e\xe4\x74\xac\x3e\x17\xf5\xb9\xeb\x10\xa0\x3b\xc9\xc8\x92\x5d\xb8\x3b\xf0\x6d\x49\x95\x65\xa7\x99\x96\x9c\xce\x36\x58\x85\x85\x9f\xd3\x7f\x09\x94\x79\x18\xd3\x12\x2e\xf6\xef\x46\xca\xc2\x2d\xd9\xee\x0c\xa5\x53\xfa\x72\xa9\xdf\x6c\xd9\x1e\x72\x2d\x64\x8d\x28\x64\x27\xb0\x99\x7f\x29\xc6\xf6\xdc\x92\xce\x30\xe7\x06\xe3\x6a\xe1\x3e\x5a\xf6\x11\x26\x5a\x8c\x5e\xde\xb4\x13\x84\x75\x0c\xb6\x35\xb2\x78\x28\xf9\xe4\x69\x02\xef\x60\x39\x40\x91\x3b\x94\xf3\x58\xcb\x34\xa0\xad\xac\x37\xca\x26\xb5\x84\x6f\x49\x6e\xec\x59\x20\x16\x7e\x74\x08\x07\xa1\xbe\xd5\x22\x5e\xcc\x0e\xfa\x1c\x72\x33\x9c\x6d\x42\x5e\xd2\xe3\x91\xaa\x2e\x0e\x17\x82\x13\xf3\xe1\x49\xb6\x80\xed\x79\xf9\x78\x5c\xc0\xf7\x05\x09\x79\xb3\xd5\xc1\x64\x38\xb8\x73\xd5\x68\x45\xa2\x82\x6f\x8b\x10\xa0\xb2\xaa\x07\x75\x2c\x5a\xce\xfc\x9c\x4e\x72\x48\x96\xa1\x9c\x05\x9a\x1c\xc3\x74\x79\x4d\xb5\xb5\xd4\x1d\x39\xd3\x07\xf3\x3b\x0c\x67\xac\xff\x95\xab\x8a\x1d\x4c\x4f\x51\x7b\x5d\xb7\xd3\xc1\xe4\x8f\xfd\x79\xf3\x05\x33\xeb\xce\x32\x0b\x3a\x23\xe7\xea\xbd\xaa\x9c\xfc\xca\x02\x0a\xd9\xd7\xcb\xaa\x91\xba\xae\x30\xb0\x87\xc5\xd4\xcf\xa2\xac\xc0\x26\x97\x76\x00\x4d\x58\x9f\x23\x43\xcc\x55\xad\xc1\xd4\xde\x3b\xdf\xd6\xf7\x61\x3d\xc4\x13\x78\x7c\x25\xfe\x35\x67\xf4\xff\xe6\x14\x07\x23\x6d\x9c\x56\xa1\x86\xde\x18\xd0\x0e\xc2\x8b\x68\xc7\xc7\x91\xa8\x5a\xb2\x96\x71\x10\xa2\x6b\x5a\xa9\x61\xa0\x06\x69\xa0\x1f\x32\x5d\xf5\xc7\x61\x45\x20\x44\x83\x04\x07\x2d\xd1\xf2\x2d\xa0\x8e\x06\x66\x83\x55\x34\x17\x26\x3e\x7e\xb6\x84\x9a\xeb\xeb\xd5\x82\x6b\x46\x41\xa8\xf6\x25\x70\x6b\xcf\x79\xea\x95\x44\x50\x63\x5f\xd8\xdf\xad\xbe\x8d\x63\x77\x5c\xa5\x77\xa0\x3a\x1a\x94\xc7\xfd\xf8\x3e\x4f\xca\xe6\x74\x52\xf5\x87\x8a\x1b\xfc\xb3\x1e\xa8\x19\xf8\x68\xd7\x39\x8a\xd3\x11\xb1\x74\xbd\x04\x2e\xb8\xcc\x16\x66\x1b\x1c\xad\x9c\x22\x6e\x39\xb2\x5d\xa5\x1c\xa9\xc7\x70\xd6\x78\xb5\x14\x9b\xcc\x10\xbe\x2a\x8d\x70\x94\xda\x6f\xb4\x3a\x69\x8a\x85\xc5\x76\x88\x33\x25\x92\xba\xcd\xae\x66\xd4\x65\xbe\xe2\x60\x4d\x5d\x74\x7f\x73\xab\x8c\xa3\xdf\x50\xd4\xa1\x8f\xa2\x8e\x72\x5a\x8e\xfd\x11\x50\x90\x94\x40\xfb\x03\x66\xf8\x4e\x4d\xc7\xb6\x22\x1b\x4e\xa8\x84\x1b\x24\xfd\xa1\x86\x43\x8d\xe6\x79\xfd\x1c\xa8\xf9\x46\x38\x73\x89\x77\x35\xc5\xd1\x79\x2f\xdc\xec\xb2\xac\x20\x64\xbc\x53\xe6\xdf\x36\x2a\xf3\x89\x83\xc7\x58\xe1\xbc\xc6\xe7\xf6\x9e\x23\xfe\x9d\x69\x86\x71\x31\x7e\x23\x78\xf6\xf5\x55\x3b\xb5\x54\x61\xf2\xd2\x2d\x86\xce\xd0\x70\x5a\x89\xbb\xf2\x17\xcf\x96\x50\x5d\x4c\x6b\xe9\xef\x5e\x38\x07\xa8\x20\x20\x25\xe7\xb1\x78\x8d\x39\x1d\x22\xd0\x0a\x1f\x27\x8a\x96\x05\xc6\x35\xa1\x3b\xd5\x83\xc9\x52\xa0\xf9\x79\x83\x65\x4a\xe4\x8d\x63\xf8\x2b\x62\x1c\x8f\x01\xff\xd4\x2b\x32\x0c\xa7\x5d\xa3\xca\x68\x8f\xd7\x18\xd7\xe3\x1d\x6d\x3f\x0a\xfe\x5a\xfa\x9a\x81\x97\xed\x71\x56\x80\x98\x45\x60\x39\xee\xe0\x83\xf2\xb2\xb3\x8a\xc4\x00\x99\x54\xf4\x6a\x04\x00\xcf\x19\x02\xd8\xa0\x79\xec\xe6\x37\x58\x38\x95\x80\x8b\x22\xcd\xb0\xeb\xa5\x02\x83\x4b\x9c\x65\x61\xea\xf6\xc7\xc0\x0b\x89\x9e\x34\x62\xaa\xa6\x0c\xbe\x09\x77\x65\xd1\xa4\x55\xad\xb7\x86\xc6\x84\xeb\x68\x55\xfd\x7f\x5c\xbd\xc5\xb2\xec\xca\xce\x35\xfa\x40\x6e\x98\xa9\x69\x66\x66\xf7\x5c\x66\x66\x7c\xfa\x1b\x6b\xed\xfd\x9d\x73\xfe\x1b\xb3\x37\x23\x5c\x95\x95\x29\x69\x8c\xa1\x94\x25\xad\xbb\x7d\xce\x78\xa3\xd6\x00\xcd\x6b\xa2\xc8\xa9\xf8\x7e\xe2\xa1\x3e\x8c\x42\xdb\x3f\x26\x15\x47\xa4\xc0\x4f\x65\x87\xd6\x21\x58\xc7\xa0\x34\xe9\x81\x57\x07\x63\x39\xcc\x45\x70\x0a\x85\xa3\xfe\x7b\x5e\x35\x53\xef\x6b\x58\xab\xdc\x3d\x71\x86\xf2\xb9\x99\xd0\x01\x14\xb1\x04\x6b\x2f\x66\x66\xaa\xf4\x59\x09\xc7\xd2\xeb\x2e\x9f\x94\xf8\xf7\xc7\xb9\x15\x59\xc2\x07\x7a\xd2\x37\x40\x86\x6f\x65\x52\x7f\xf8\x85\xcc\xe0\xf2\x6f\x58\x8f\xe1\xf4\xaa\x3a\x65\xdf\x49\x83\x22\x8e\xc6\x09\x29\xb7\x34\x83\xc8\x1c\x7b\xf9\x4f\xf9\x08\xc3\xf0\x22\x10\x0f\x5a\xf0\x46\xae\x20\xf3\x2a\xef\x35\x99\xed\x82\x0e\x72\x03\xdf\xb5\xe9\xd0\xd0\x7f\x13\x3f\x03\x87\x68\xea\x53\x51\x07\x6c\x1d\x89\xd7\x4c\xe6\x83\x2a\x28\x2e\x37\x17\xfc\x56\x70\x7d\x9e\xd4\x93\x14\x65\xa1\xb7\x86\xde\xec\x2c\x58\x13\x4c\xf5\xca\x21\x7c\xd2\xa0\xe5\xff\x05\x20\x86\x11\x3c\xb6\x11\x9a\xd1\x33\xe3\x96\x72\xda\xd4\x97\x7e\xce\x44\xc4\x67\x59\xa9\xbf\xa8\x4a\x27\x93\x5d\x7a\x63\x98\x7a\x14\x10\xef\xd3\x24\x43\xc3\x76\xcb\x29\x80\xcf\x82\x70\xa6\x94\x72\x70\x0d\x7f\xfa\x14\x7f\x1f\x82\x6f\x3a\x44\x7b\x22\x96\x91\x3d\xb6\xfa\x2f\x46\x2a\x0c\xf6\x87\x0f\xa4\x77\xf4\x58\x48\xa9\x3f\x9c\x71\xc5\x9f\xcf\xdb\xa7\x69\xb6\xe4\x44\x4f\x5c\x9b\xe2\xa1\x88\x93\x84\x0e\x11\x57\x88\x5f\x25\x79\x4e\x34\x91\x4a\x33\x2e\x73\xce\xd8\xab\x4f\x33\xe8\x2f\x6f\xf1\x3e\x97\xea\xf9\x54\x54\xb5\x5c\xff\x8f\x3b\xf3\xad\xa1\x5e\xa6\xa9\x44\xd5\x58\x8e\x66\x1a\x8e\xdd\x9d\xf2\x59\x15\xb1\x33\x32\xde\xaf\x5b\x50\x5d\x4f\x84\xc0\xf6\x6a\x90\xd4\xc3\x90\x04\x8d\xd5\x47\x57\xbf\x1f\x6a\xd4\x60\xcf\xd5\x7b\x39\xfe\x1e\x9c\xe9\xb5\x54\x1a\x8e\x42\x33\x0c\x88\xf8\x52\x87\xd1\xb7\xda\x62\x0e\x45\xb9\xf4\xff\xd8\x32\x63\x8d\xab\x6a\xa4\x8d\xdd\xf6\x66\xb2\x8b\x93\xb9\x8a\x18\x2d\xbb\x7c\xc5\xab\x4c\xc7\x65\x5b\xa8\x25\x19\xd5\xfe\xf8\xf4\x47\x1b\x28\x52\xcc\x60\x4c\x3c\xe8\x7c\xbb\x9f\x7d\x02\x4b\x51\xb7\x3c\x84\xae\x76\x4c\x00\xe1\x3b\x06\x6e\xd9\xde\x7e\xb7\x89\xce\xca\x02\x7d\xc1\x8d\x13\xdb\x9d\xca\x1f\x33\xfa\x1f\x5f\xe5\x5d\xdc\x6c\x0e\x4e\xd0\x09\x69\xad\xc7\xa2\xd2\x5c\xd5\x1c\x7e\xdf\x40\x2c\xa1\xb5\x42\xd1\x39\x08\x5e\x36\x38\x84\xec\x4e\xa4\x40\x77\x3d\xbd\x83\x8e\x46\x5b\x21\x09\x6d\x8f\x2c\xd1\xe6\x3b\x6a\xfd\xe0\xa9\xbf\x68\x92\xa4\xe0\x52\x20\x1c\x2a\xe4\xdb\x73\xc2\xff\xb5\x2f\x53\xa8\xf5\x54\x8f\x36\x36\x51\x71\x2f\x30\xcb\x0d\xce\xf5\xb6\xb2\x74\xbb\x3f\x84\x5f\xf2\xc1\x70\xaf\xd7\x27\xb7\x16\xa8\x4c\x97\x53\x80\x98\xbf\x81\xae\x26\x10\xb2\xa3\x9f\x2f\x95\x27\x2c\x94\xe5\xd7\xef\xd7\x60\x2d\x90\x45\x52\x39\xb4\x84\xce\x0a\xe0\xcf\x1f\x60\xc7\xf0\xff\x68\x0c\x96\x31\xb9\xac\x0b\xbc\x3f\xf1\x8f\x5c\x56\x1b\x78\x09\xd5\xfb\x90\xec\xc9\xb6\x30\x1b\x42\x61\x3e\xc2\xf6\xd3\xa5\x19\x9e\x60\xab\xb7\xf2\xf4\xdd\xd0\x26\xa4\x3b\xaa\xea\x7e\x55\x81\xcd\x27\xdd\x48\x46\xda\x1b\xfd\x72\x13\x5c\x90\xa4\xf8\x15\x2a\x0b\xa2\x59\x1d\xb3\x9f\xca\xac\x40\x35\xf9\x5f\xae\xcf\x31\xe3\x79\x23\x61\x4a\x5b\x1e\xab\x16\x4b\x46\xfb\x2b\xca\xbe\xa4\x69\x98\x83\x91\x1e\xcb\x38\x13\xc0\x03\x54\xa8\x89\xa2\x45\x43\xdb\x17\x0d\x56\x17\x82\xfc\xd1\x4d\x8d\x6a\x6e\x5c\x98\xa8\xef\x00\x71\x79\x94\x5c\xb7\xe2\xc8\x58\x0e\xd5\xe8\xff\xf3\xd9\xaa\x50\x79\x7d\x90\x75\xe1\x3a\x04\xc2\xf1\x3e\x76\x37\xcc\x5e\x89\x24\x67\x48\xa1\xc8\x94\xd9\x0f\x60\x3f\x79\xf3\xc4\x24\xb2\x2a\xe4\xfe\xd7\x0f\x73\xbd\xcb\x13\x5a\xd5\x0a\x86\xd5\x8c\x9d\x0a\xdb\xe1\xfc\x2d\x2c\x5b\x0b\x5e\xaa\x60\xae\xb3\x2c\xec\x9d\x67\xff\x71\x43\xd1\x3c\xfd\x1a\xd3\x14\xc2\x89\xfb\xd6\x3d\xc2\xd5\x83\x9a\x1d\xee\x4d\x5d\xd9\x11\xa0\xb2\xd4\xad\x24\x8f\x95\x28\x5b\x60\x53\xa5\x44\x50\x78\xba\x48\x3f\x88\x63\x1e\x76\x34\x9b\xbe\xc6\x4b\x8c\x81\xea\xeb\xbf\x38\xd7\x0a\xe3\x12\x5a\x1d\x4c\x68\x48\xec\x5f\x2e\x21\x87\x6a\x66\x78\xac\x0a\x8d\xbf\x03\xa1\xc5\x40\x50\xdc\xda\x30\xbb\xc9\xdf\x42\x6d\x29\xa4\x59\xf8\xc9\x8d\xb1\x1c\x06\x98\xd3\x4c\xad\xfa\x03\x5e\x26\x35\xa7\xb2\xc8\x7f\x31\x9b\x61\x7a\x4f\x14\xfb\x3e\x99\xdb\x4d\x6d\xb3\xd8\xda\x0b\x7e\x2d\x9c\x55\xc0\x70\xca\xdc\xcd\xc6\x29\xda\x3a\x54\xfb\x23\x05\xd2\x97\x65\xde\x49\xfd\x72\x9b\x93\x4d\xfb\xce\x5d\xe6\xff\x1c\x89\x65\x62\xa1\x75\x17\x56\xfa\x90\xdc\x55\x8e\x3c\x45\xa3\xae\x99\x8e\x28\xa2\xfd\xb5\x70\x12\x79\x00\x3a\xdb\x21\xa6\x50\x5b\x1c\xf6\xf3\xea\x5e\x6b\x0c\x76\x73\x43\x37\xf6\xf8\xff\xe1\xdd\x0a\xaf\x7d\x48\xe2\x12\x72\x34\xb2\x69\x38\x7e\x9c\x17\x95\x18\xa1\x7a\xab\xef\x64\x5f\xc0\x83\x1e\xae\xf4\xc3\x59\xc9\x6f\x42\x86\x34\xd2\xb7\x26\x55\x5a\x8a\xc0\x10\xce\xf4\x5f\x9d\xf5\x28\x85\xe0\x85\xeb\x8d\x64\xcf\xbc\x34\x33\x08\x50\x6c\x63\xaa\xa3\xa1\x1b\x7b\xed\xda\xa2\xa3\x2d\x21\x21\x87\x73\xb6\x28\x12\x75\x89\xb7\xc0\x14\x8a\xfb\x3f\xba\xa6\xb6\xe7\xbc\xe3\x21\xc9\xb1\xf4\x3f\xfb\x67\xae\x42\x52\x61\x7f\xf8\x76\x0d\x93\x15\x88\x12\xd9\xd2\xc2\xa3\x01\x28\xbe\x8d\x5f\xa6\x37\x88\x4a\x12\xf4\xd9\xfd\x31\x78\xb1\x7e\x50\x43\x7a\x42\x7d\xef\xff\xe1\x80\xfa\x5b\xc9\x5f\xc7\x26\x66\x7b\x14\xaa\x30\x65\x7b\x9e\x56\x36\x9b\x6d\x4b\x4c\x71\x30\xa2\x3c\x0a\xb1\x6f\xdc\x9c\x36\xb9\x96\xb2\xc4\x5e\x50\x27\x06\x4b\xea\x6d\x2a\xfe\xd7\x18\xff\xc1\x27\xbb\x99\xdb\x5d\xcd\x9c\xb6\xff\xa4\xfa\x79\x47\xe7\x79\x04\xe6\xe0\x21\x14\x5a\xcf\xfc\xe8\x8d\xd5\x60\x2f\x67\x11\x93\x4f\x49\xd3\xb4\x7d\x84\x39\xdd\x9a\x96\xa5\x15\xff\xdf\x77\x94\xfe\x4e\x47\x16\xa1\x36\x72\x1e\x5e\xb2\xe0\xa8\x61\xe4\x3c\x9d\xcc\xe5\x6c\x36\x75\x7d\x22\x0e\x59\xc9\x16\xab\x7b\x2f\x7d\xde\xfe\x7d\xb5\xf9\x52\xdf\xfc\x61\x64\xcf\xcc\xd5\xee\x3f\x44\x9a\x65\x94\xd3\x1f\xf0\x95\xc3\x1a\xde\x4f\x7f\x7e\x62\x74\x65\xa3\xf4\xe7\x4d\x13\x04\x1b\x68\x83\xfc\x8b\x63\x77\x3d\xc2\x75\x72\x60\x6f\x78\xa5\x0c\xde\xb9\x57\xb7\x04\x2e\xbb\xf7\xbc\xf9\xbf\x4f\x51\x19\x5f\xdf\xa7\x6c\xa7\x71\xa7\x3c\xc2\x55\x54\x25\x8b\x93\x6c\x97\x38\xc3\xc7\x12\x14\xbf\x48\xfb\x00\x12\x6a\x69\x2a\x56\x5f\x1d\x53\xc0\x56\x04\x9e\xb8\xbb\x7f\xdf\xdd\xfb\xe3\x4b\x6b\xc0\x78\xae\xa5\x2a\x41\xff\x3e\x18\x81\x4c\xcc\xd0\xef\xf0\x08\x47\x2b\xec\xad\x81\x33\x0b\xb5\x34\xd4\x9e\xa7\xcc\x6d\x23\xdb\xeb\xb2\x38\xfe\x66\x27\x89\xf3\x5f\x48\xdc\xfd\xe6\xd5\xc2\x45\x9a\x24\x87\x9f\xaf\xb4\xe3\x32\x99\xcb\x42\x77\x45\xcd\x2f\x67\x92\xb6\x0e\x1e\x69\x86\xb4\xc6\x61\xdf\xfe\x46\x88\xef\x1d\xd8\x9c\x2d\x94\xf4\xbf\xf6\xc1\x39\x1a\xf3\xf1\x38\xc7\xc6\x1a\x3b\xbc\x67\xfe\xec\x66\x2b\x58\x6d\x92\x7e\xce\x3c\x46\x23\x6e\xf1\xe8\x5a\x79\x58\xec\xb7\x56\x2b\x2a\xbf\xff\xe1\x19\x0e\xa3\x84\x38\xbf\x3b\xac\x32\x29\x4e\x98\xb8\xc6\xac\x72\x8a\x9f\xa7\x5d\xd2\xf2\xa2\xc9\x40\x53\x49\x33\xb9\x1b\xfe\xff\x9e\xd1\x07\xbc\x8c\x5e\x5e\x31\xb0\x45\xfd\xdc\x44\xe4\x1a\x8d\x4f\x7b\x6e\xbd\xc2\x7b\xd5\xc6\xe6\xf6\x7b\xfc\x4c\x6e\xcb\x50\xf9\xb1\x37\x81\xff\x38\x34\xab\x29\xcb\x39\x50\x3a\x27\xda\x66\x9a\x0e\x3f\x3f\xd9\xb0\x9a\x49\xeb\xd7\x57\x2f\xf3\xce\x1f\x4e\x1e\xda\x7a\xcd\x39\x46\xeb\x2d\xe0\x7f\x72\x07\xba\xa0\x71\xb8\xc8\x78\x3f\x39\x97\xf9\x43\x54\x1c\x83\x91\x82\x68\x08\x9a\xde\x64\x77\xa7\x69\x4a\xf7\x2d\x3d\xd2\x0a\x7a\x9e\xb8\x89\xfc\x3f\x7e\xab\xaa\x3f\x33\x1b\xa2\x25\x54\x1a\x7e\x6d\x3a\xa8\xdc\xc2\xac\xf3\x1b\x86\x6d\xf0\xdf\x4f\x4c\x83\x28\x18\x1b\x66\xcc\x81\xa8\x59\x18\xb6\x67\xff\x77\x9d\xa7\x60\x56\xf5\x72\x77\xba\x31\x65\x24\x1f\x4b\x4c\x27\xb8\x6e\x28\x61\x16\xdc\x02\x13\xb9\x73\x56\x86\x19\xb5\x81\x61\x3d\xc7\xfc\x87\xda\xf4\xd1\x20\x36\x4c\xa2\x39\xc2\xd6\xe3\x67\xd6\xee\x4c\x33\x18\x5b\x98\xa4\x5d\xf0\x13\x94\x6a\x80\xac\x15\x52\xfb\xa4\x34\x6a\x83\x56\xfe\xef\x21\x8f\x6f\x8f\x70\xb4\xe0\x88\xe5\x64\x95\x37\xb2\x2e\x9a\x61\xed\x38\x98\x66\xb3\x7f\x1b\xaf\xa5\xbc\x2c\x2a\xfb\xa2\xb7\x4a\xed\xb0\x46\x6d\xff\x17\x23\x54\xc6\xf0\xb4\xa4\x1f\x83\x7b\xdc\xe9\x73\x6f\x19\xb3\xb7\x55\xa5\xa7\x40\xf5\x0d\x9c\x9a\x1c\xa3\x56\xbb\x87\x90\xed\x79\xe9\x7f\x74\x36\xdb\xbf\x72\x4e\xa4\x56\xdb\x0f\xef\xdd\x7b\xfe\xea\x18\x89\xb7\xcf\xa1\x33\xeb\x52\xf2\x61\x0b\x03\x95\x09\x46\x6d\xe6\x28\x77\x8a\xfc\x3f\x8e\xea\xf0\x7e\x28\x88\x84\xa9\xa5\xba\x98\xe9\x6e\x26\x3a\x0a\x43\x38\xb6\x77\x47\x3b\xac\x2d\x2e\xfb\x7a\x33\xe1\x61\x82\x20\x31\xff\xef\x73\xae\xea\x05\xbd\x5b\x2f\x8c\xa0\x2d\xb1\xf6\xe3\xb3\xa1\xe2\x73\xac\xeb\x2f\xdc\x9e\x7d\x3e\x09\x04\xc7\x98\x4e\x4c\x28\x8b\xb2\xdb\x9e\x7c\xec\xb3\x51\x03\x04\x28\xdb\xe2\x22\xed\x8d\x5c\x91\xec\x7a\xfd\xcf\xfe\xb2\x6a\x72\xf0\x5b\xe0\x18\x0d\x14\xb5\x59\x71\xfa\x83\x37\x8a\x76\xa9\x62\x36\x7d\x79\x7d\xd1\x00\xc4\xb9\xed\xdf\xb5\xd7\x06\x76\xbc\x7a\x1a\x8e\x24\x9a\x10\xbc\xa3\x69\xe1\xd0\x24\x1d\xa7\xb2\xea\xff\xea\x41\x9c\x1b\xf8\xa4\x8d\x59\x6a\x52\x3f\x49\xc9\xdc\x7b\x21\x15\x3c\xd6\x2e\xf8\xd9\xad\x06\xb6\x60\xe6\x85\x8e\x85\x0e\xd6\x30\xcf\x6c\xcb\x52\x72\x3f\x03\x7d\xa9\x72\x09\x99\xc9\xbd\x86\xf8\x2d\x58\xab\x04\x21\x26\x19\x77\xfb\x7f\x0b\xe4\x1c\xe3\xb7\x12\xe7\x45\xd2\x60\x5d\xaa\xd5\x92\xe1\x28\x89\xbd\xf6\x47\x55\x50\x82\x9b\x57\x67\x56\xf9\x8f\x79\x05\xa6\xae\x45\x65\xa8\x8d\xa6\x87\xa5\x19\x86\xe8\xbd\xac\x4d\xb2\xce\xa4\x05\xc5\xbb\xd3\x01\x8f\xa2\xda\x16\xaf\xd5\x96\x73\xd8\x25\xb9\x12\xac\x70\xb1\xba\x03\xaa\x38\xc6\xe3\x1d\xf7\x76\x84\x55\x66\xc6\x04\xb4\x26\x95\x6d\xfe\xf3\x7b\x14\xde\x80\x8a\xc9\xa5\xaa\x12\x04\x3d\xd4\xfd\x3e\x95\xf8\xd8\xae\x7f\x10\x53\xea\x23\x57\xcd\x4b\xb9\x51\x60\xaa\x11\x35\xd5\xd7\x1a\x07\x59\xe1\xd0\x3b\x5f\xcf\xdf\xbd\x4f\x3f\x36\x2f\x3f\x86\xf9\x78\xe3\xa7\xac\x5e\xf6\x3e\xb7\xe8\x58\xf4\x7a\xf6\xb0\xa4\xcc\x13\x5c\xea\x57\xa7\xd3\x01\x3a\xf0\x03\x48\x83\x69\x77\xda\x75\xdd\x13\xfe\xd8\xe2\x89\xfc\xb8\xe0\x3f\x66\xcc\xbc\xa1\x9b\x05\xfd\x33\x94\xfd\x34\xe3\x9a\xb9\x20\xa7\xac\xf4\x08\x77\xfc\xb2\x4b\x44\x2d\x7c\x21\x81\x6e\xf7\xcd\xf9\xcb\xbb\xef\x5a\xa7\x22\xd5\xa5\xe4\x1d\x89\x24\xc5\x9a\xc7\xd4\x97\x6a\x40\x4c\x91\x09\xa6\x67\xec\xa9\x61\x36\x39\xc6\xea\xa5\xff\xb5\x5b\xae\x0f\xda\x35\xec\x06\x27\xa8\xf7\x66\x2f\x7f\x23\xae\x1b\x87\x96\x1b\xc5\x3c\x76\xd9\xef\x53\x10\xd3\x0f\xc6\xad\x00\xa4\xb5\xa0\x05\x63\xa6\xab\x65\x1f\x67\x4e\x31\x70\x9a\xb0\x43\xa2\xbe\xa5\x34\x56\x25\x53\xe3\x68\x51\xe0\xf8\x4f\xe1\xff\x6b\xa2\xaf\x9f\xbe\x2e\x3b\x72\x0a\xa7\xe9\x48\xf6\xb9\x2b\x17\x91\xe5\x9b\xf9\x7d\xf6\x5b\xca\xa5\xd4\xf1\xc7\x2c\x49\x42\x5b\xde\x12\xfd\x00\x22\x8c\xd2\x3b\x7d\xfc\xb9\xcf\x4f\x08\x69\x02\x8b\xc7\x14\x36\x0b\xbd\x25\xb2\x03\xfc\x74\xda\xf4\xbf\x7c\xb7\x96\x9c\x4f\x4a\xa0\xa8\x7d\x86\x47\x50\xc2\x6c\x0b\xf0\x17\x2e\xa7\x46\xe9\x27\x2f\xdb\x64\x88\x56\xdc\x9c\x77\x20\xb5\xf2\x34\xfb\xa1\xaf\x93\x8a\x6a\xe8\x2f\x49\x4d\x82\x8f\x89\xe5\x53\xc6\x59\xca\x85\x89\x88\x96\x1a\xb3\x6e\xc4\x61\xf1\x5c\x2d\x81\x84\xf1\x7f\x39\x45\x30\xf2\x7d\x2b\x2b\x82\x12\x63\xfb\xfb\x6d\x6f\xbe\x46\xe0\x84\xae\xb4\xbf\x8a\x4e\x21\x17\xa8\xf9\x95\xa8\x6a\xd5\x0b\x28\xe3\x60\x4f\x1f\x66\x3f\xba\x88\xde\xe0\x76\xb2\xdc\x7c\xe6\xba\xd3\x30\x06\x45\x19\x4f\x0a\x31\xcf\xde\x9b\x6a\x9e\xb2\x3b\xac\xd1\xe8\xff\x1b\x63\xb8\x3f\x7e\xd9\x05\x19\x6f\x19\x3e\xdc\xe3\x44\x3b\xd9\xa3\x55\x88\x7d\x29\x41\xe3\x74\x6c\x19\x5c\xc4\x9e\x82\x42\x96\x87\x91\x0d\x11\x62\x46\xcd\xc9\x2b\xed\xb7\x44\x9c\x82\xd6\xee\xc9\x6f\x1e\x97\x7d\x98\x92\x61\xa6\x56\x82\xae\x9b\x2a\xe7\xc5\x82\x7b\x7f\x9c\xc2\x20\x4e\xff\x49\xf7\x1f\xc1\x06\x41\x34\x59\xc6\x03\x5c\xc4\x21\x1c\xa2\xc5\x2f\x23\x2e\x1b\x07\x65\xbc\x52\x58\x56\x01\x42\xec\x38\x2f\x42\xca\x4b\x5b\x4e\x62\x87\x61\x24\x36\x71\x67\x68\x46\xc9\xe3\xb2\x01\xc5\xd9\xe9\x37\x9f\x78\x5f\x63\xb3\x2b\xd4\x66\x58\x42\x8b\x38\x44\x8b\x2e\x50\xd5\x4a\x77\xcd\xe7\x73\x5c\x7e\x8d\x1d\x28\x7f\x60\x21\x48\x7f\x61\x5f\xbe\x09\x64\xed\xd8\x7b\x06\x2f\x6b\xb1\x96\x80\x44\x8e\xc6\x2a\x4a\x21\xbb\x10\x96\x19\x9e\x34\xb7\x0d\x84\xcf\x8e\xd1\xfc\xe5\xb6\x2c\x53\xae\xed\xb1\x86\x13\x00\x55\xda\x11\x91\x55\x04\x1f\xae\x92\xdb\xc5\xf8\xa9\xaf\xfa\x4f\xf2\xe1\x89\x83\x50\x66\x67\xcf\x94\x41\x1b\x63\x9c\x46\xe0\x5b\x7a\xdc\x21\x64\xf2\x33\x9c\x3e\xc2\xf1\x40\x8f\x97\xca\xf9\xa3\x0a\x4f\x6c\xd5\xb9\x3d\xcc\x80\x82\xec\x7f\xd7\x8f\x04\x1d\x97\x1d\x85\x47\xd2\x65\xc9\xec\x26\x83\xc6\xae\x17\xbe\xcc\x37\x0f\x04\xc0\xb6\x31\xae\xf3\x83\x4f\x26\x76\x85\x5b\x42\x4d\xb5\x04\x6e\x74\x26\x28\xfc\x73\x2c\x6b\x74\x9c\xbf\x89\x6c\xa9\xbc\xb8\x2e\x9b\x90\x0a\x9a\xc6\x5d\x7c\x53\x73\x87\x61\x6a\xb6\x01\xfb\x50\x0f\x5e\x59\x0d\x94\x04\x10\xc3\xf5\x30\x1f\x5c\x71\xf3\x6d\xc8\x37\x3a\x77\x59\x56\xd0\xda\x22\xe5\xf7\x03\xed\xa8\xb8\xa6\x58\x41\xb8\x79\xc9\x40\x46\x9f\x41\x05\xab\xfc\x94\xbe\x7f\x6d\x1a\x64\xb1\xcb\x55\x79\xa6\x58\xfb\xe6\x86\x85\xba\x58\x5f\xab\x51\xbb\xbf\x8c\x89\x55\x90\x8c\x28\x2c\x04\x20\x81\x34\x85\x33\x3a\x57\xeb\x99\x9d\xff\xec\x15\xde\xf6\x8b\x9e\xfe\xf4\x54\xe9\xf8\x9d\xab\x83\x76\xf3\xe7\x37\x1e\xa2\x70\x3e\xc5\xb9\x6d\x39\x45\x5f\xc9\xaa\x24\x47\xbc\x6b\x51\xfc\xb2\x49\xb4\x24\xc7\x8d\x2c\xf6\x6e\xbc\xd3\x3f\xdf\x9d\x34\xf5\x68\xd3\x00\xeb\xf9\x6a\xde\x4d\xb7\x5c\xf6\x21\x93\xee\x26\xfb\x87\x07\x38\xfa\x0c\xa0\xbf\x0d\xc6\x9c\xbc\x72\xd6\x41\x60\x18\x5e\x49\x98\xc7\x1c\x08\x6b\x27\x63\xee\xd6\x2d\xdb\x28\x70\xa6\x1f\x33\xac\xfb\x3a\x66\xec\x3f\xf9\x25\xc9\x0c\x29\x46\x2a\x47\x51\x03\xeb\x26\x0b\x97\x5a\x75\xe3\x2c\xf7\x1d\x73\xb1\x6e\x65\x10\xb5\x14\x5c\x2f\x93\x8e\xc3\x62\x9e\xe2\x5e\xa3\x97\xcf\x22\x08\xbc\x3a\xf8\x13\x5f\x88\xea\x42\x3c\x9f\xf0\x54\xa3\x34\xa4\xb9\xc7\x1c\x29\xe5\xff\xe6\x81\x04\xae\x5d\xd7\x75\xad\x2e\x34\xc1\x08\xd1\xe1\x34\xe1\x6f\xfc\x0d\x07\x3c\xd2\x46\x33\x7d\x24\x51\xb9\x00\x61\x79\x97\xb1\x9a\x00\x6c\x38\x76\x68\x0c\x00\x5a\xcf\xa4\xe5\x7d\xe8\x74\x89\x59\x4e\x28\x97\x72\x33\x71\xf8\xd8\xe1\x45\x44\xfc\xb2\xc4\x31\x83\xb6\xb3\xd1\xf4\xe1\x02\x3d\xde\x5a\x8d\xb9\x49\xb6\x92\x08\x8a\x7a\x48\xba\x94\xb5\x7f\xf3\xcb\x6c\x0b\x7f\x65\xf2\xae\xff\xe0\xec\x2f\xde\x38\x8a\x22\x38\x71\xb7\xb6\x5e\xce\x13\x7f\x49\x08\x9b\xd6\x52\x9c\x52\x97\xf2\x3e\x96\x94\x7b\xaa\x6e\x14\x80\xaf\xe2\x95\x0a\x55\xaf\x10\xb8\x61\xbf\xe3\x7b\x0b\xde\x80\x78\x5f\xd9\xc9\xe2\xe0\xd4\xfc\x56\xef\x79\x0b\xf4\x87\x84\xd1\x10\xcc\x43\x08\x42\xc2\x39\xa0\x27\x8d\x4e\x0c\x36\x69\x5b\x7d\xe8\x5e\x1e\xae\x47\x20\xb9\xe0\x04\xf3\xda\x1f\x5e\xda\x09\x49\x19\xcc\xee\xf3\x3d\x33\x56\xfc\xe1\x52\xcf\xbf\xfc\xce\x51\xb6\x68\x0b\x61\x92\x34\xeb\xe7\xf9\xb3\x1c\x5d\x17\x5a\x56\x1c\x8c\xc1\x69\x6c\xbc\xcc\x65\xfd\xc8\xb6\x9c\x30\x60\x44\x81\x24\x79\xdb\xbe\xb9\xe0\xe6\x78\x8b\x29\x79\x51\x8e\xad\x44\x4b\x12\x2d\xd1\xe5\x40\x46\xbc\xd3\x6b\x07\x26\x6a\xe2\x6c\x0c\x2f\x6c\xa8\x78\xa5\x45\x21\x76\x4d\x15\x32\xf3\x00\x3b\x4e\x1a\x19\xe1\x4c\x1b\xe9\xae\xc7\xa8\x49\x31\xcb\x0e\x6d\x19\xb6\xb7\xff\xcd\x71\x2f\xd1\xb6\xf6\x4c\xff\xf7\x4c\xf6\xdb\xd7\x0d\x8f\xbb\x1b\x19\xf7\xc3\x6c\x1f\x6f\x57\x0d\x0e\xed\x98\x56\x0a\x1c\x08\xe4\x03\xca\x9e\x02\xa7\xe2\x2b\x51\xda\x24\x03\x02\x75\xb4\x26\xd0\x05\x39\xb5\xd5\x48\x4d\x87\x08\x5e\x2c\xf5\xeb\x6b\xb0\xe7\xeb\x42\x3a\x7e\x3f\x5a\xbe\x3b\x85\xfe\xde\x6e\x7a\xa9\xc1\x69\xf5\x22\xb6\x3d\xb1\xa6\xf8\xa3\xe7\xff\xf9\x6e\x5e\x25\xca\x6f\xb7\xe5\xee\x56\xac\x3f\xb8\xc8\xa6\xcb\xef\xa5\x42\x05\x1b\x70\xc6\xb8\xff\x60\xc1\xfe\x4d\x7c\xbc\xb8\xd2\x8c\x4d\x96\xbf\x65\xc5\x19\xba\xb8\xc2\x49\x56\xfe\x05\x10\xad\x67\x97\x2a\xfc\xc1\x86\x48\xb9\x46\x3a\x6a\xc9\xa9\x80\x68\xd2\x45\xd2\x11\xca\x64\x86\x22\x89\x05\x8d\xbc\x67\x84\xc2\x43\xf6\xba\xc9\x5a\x83\xc8\x5b\x78\xbb\xea\x1d\x41\x6c\x1f\xa5\x47\x71\x69\x82\x09\xf9\xb5\x24\x47\xfc\x37\x1f\xd2\xe3\x74\xfb\x24\xef\xb8\x97\x75\xff\x27\x96\x7b\xbc\x61\x19\x52\x17\x78\x79\xd9\xd8\x0b\x6d\xa7\xe4\x2f\x33\x2a\x69\xa0\x89\x29\x80\xa6\xf5\x94\x17\x8e\x51\xe8\x2a\xae\x68\x65\xee\x39\x43\xed\x4d\x5d\x51\x33\x0b\xd7\x20\xd2\x4f\x53\x09\xdf\x7f\xcc\x2c\xd5\x54\xaf\x36\xd9\x55\xba\xbe\x69\xd4\x87\xe6\xf6\x33\xfc\xbd\x83\x10\x84\x25\x6f\xa4\xb4\x50\x01\xd2\xeb\x5a\x11\xb8\x4b\x86\xc3\xee\x63\xcc\x29\xf7\x1f\x12\xcf\x7a\x18\x82\xbf\xca\x5d\x33\x8c\xca\x89\xef\x7e\x68\x81\x45\xd4\x3c\x06\x4b\x18\xd5\xe9\x5f\xe1\xc6\x0b\xcc\xcc\x85\x28\xa4\x7f\x38\x21\x31\x20\xa7\x13\x2f\x8a\xd9\x25\xb0\xeb\x15\x48\x96\x6e\x27\xe9\x53\x8b\xb5\xd8\xaa\x67\x9a\xd0\x95\x5f\x22\x75\x0f\xd5\x51\xf0\x01\x6e\xff\x70\xf0\x97\x09\x61\x55\x46\xf9\xf2\xf8\xdd\x28\x25\x77\xad\x4c\xf7\xc7\x60\x48\xef\x6c\x7a\xbb\x08\x55\xfc\x53\xe4\xbd\xb5\x85\x69\x26\x8d\xfa\x0f\xe4\xb0\xaa\x2b\x88\xc1\x1f\x3d\xe3\x09\xd8\x0c\x2b\x7f\xfe\xcb\x32\xe6\x85\x33\x4b\xd6\x7d\x81\x85\x21\x6d\xbf\x0e\xef\x54\xf5\x69\x95\x6e\x87\xd8\x1f\x90\x1b\x8a\x4e\x2b\x9d\xd7\x81\xc3\x70\x5f\x22\xc7\x2f\x24\x2f\x17\x75\x69\xb8\x33\xd2\x79\xd1\x42\x71\xe5\x55\x61\xdc\x9e\x42\xf7\x05\x54\x81\x4d\xce\x81\x98\x86\xb0\x0f\x1a\xed\xa0\xa8\x0b\x88\xde\x2b\x65\x55\xdd\x27\x2d\x62\xd2\xa2\xe7\x16\xd8\x16\x8e\xb5\x5b\xfe\xac\x77\x8f\x4c\x49\x71\x08\xc7\x0d\x29\x50\x60\xfe\xd8\x0e\xb7\x04\xde\xfa\x14\x0c\xc6\x30\xba\x1a\x04\x91\xc4\xda\x9b\x45\x04\xc6\xef\xa9\x02\x7e\xf9\xe4\x52\x89\x67\x38\xcb\x86\x36\x32\xdd\xc9\x26\x84\x6e\xa1\xc0\xf3\x87\xca\xc8\xb5\x54\x36\x5e\x19\xd0\xa1\x17\x32\xfa\x4a\xde\x0e\x45\x8d\x42\xe8\xe4\xf2\x97\x14\x1c\x72\x81\x16\x68\x8e\xaa\x5a\xbd\x80\x3c\x09\x06\xf0\x69\x42\xa3\x67\xae\xfb\xc1\xc6\xe2\xd9\xf7\x5e\xbe\x04\xcc\x39\x3c\x01\x46\xe1\x42\xdb\xbd\xf5\xa5\x53\xc8\x1d\xaf\x37\x53\x43\xff\xfa\xb9\xac\xbf\xc6\x84\x0c\xd2\xdf\x5e\xc5\xbc\x34\xf9\x54\xe4\x84\xcc\x2a\x32\xb1\x05\x1a\x4f\x79\x98\x97\x9e\x74\x32\xfa\x06\x27\x72\xa0\x3b\x35\x8d\x34\xe1\x29\xe9\x5f\x5f\x37\x49\xa8\x55\x88\x27\xca\x1e\xd5\x92\x8f\x76\x0f\x67\xa5\x8e\x8e\x2b\xb3\xba\x4d\x20\xe9\x58\xcd\xc3\xaf\x2f\xca\x09\xb6\xb6\x21\x1f\x66\x05\x2b\x09\xc7\x4b\xdf\xc1\xd1\x58\xdf\x02\xa5\x07\x87\x6e\x98\xd3\x97\xd2\x96\xbb\x9e\x63\x11\x59\xd1\xf6\x7f\x34\xa9\x67\x10\x8a\xe0\x99\xbd\xd1\x4c\xed\x9f\x20\x80\x78\x3d\xfa\xe0\xc4\x42\x7a\xad\xec\x69\xa2\x63\xa9\xa8\x45\x1a\x93\x1f\xb8\xee\x60\x54\xf9\xf1\xa3\xd1\xbe\xb8\x2e\x9a\x89\x34\x26\x39\x06\x6d\x09\xb5\x09\xf6\xd2\x06\xa5\xdd\x75\x08\xb2\x4e\xad\xdb\x76\x0f\xa6\x3e\x5e\x10\x4e\x31\x3d\x52\xea\x5a\x6b\x7e\x3b\x2d\xdb\xc4\xbe\x4c\xef\xc1\x59\x87\xc0\x52\xd1\x74\x6a\x95\xca\x42\x92\x60\xdd\x44\xfe\xd8\x25\x83\x85\x6a\x64\x3a\x4b\x5b\xe6\x07\xaf\x28\x75\x61\x4d\xad\x69\x5c\xd6\x0c\xe4\x89\xea\x03\xa8\xea\x92\x0f\x8c\x3e\xd8\xd9\xe4\x40\x9a\x8e\xa2\x7c\x77\x4a\xe7\x8d\x7c\x7f\xe9\x41\xb0\xb0\x8e\xa8\xf9\x73\xf6\xba\xee\x3f\xb6\x3c\x6d\xf0\x09\x6a\xf1\x37\x5a\x47\xb2\xcf\x21\x33\x73\xcb\x87\x9b\x2a\x5c\xc4\xd8\x68\xba\xbd\xf9\x2b\xd1\x7d\x16\xad\x95\x56\x71\xed\xd4\x3d\x6c\x2d\xf8\x12\x65\x19\x95\x16\x68\x4b\xcd\x90\x38\x9d\x28\x78\x25\x4b\x12\x69\x72\xbb\x39\xa7\x25\xce\x43\xa9\x89\xb8\x00\x1b\x8f\xe7\xbc\x68\xda\x16\x14\x5f\x4d\x85\x27\xb3\x06\x5d\xcb\xd3\x44\x19\x42\x7d\xf9\x0c\xe0\x5a\x09\xca\x6e\x28\x3b\x2d\xc0\xba\xa1\xe5\xa5\xc8\xa2\x5e\xb5\x67\xa3\x46\x5e\x06\xe4\x17\x86\x62\xc1\xdf\x15\xc3\x8b\xbb\x97\xa8\xff\xfb\x63\x4d\x49\x27\x39\x7a\x4a\x9f\x23\x1a\x3d\x3f\xc3\x61\x31\x56\x84\x5f\x9a\xfb\x8b\x95\xba\x16\xf9\x6b\xbe\x69\x5e\x0f\x04\x61\x54\xfc\x3c\x3a\x5f\x43\x26\x10\xf9\xf6\xcb\x75\x48\xf1\x52\x05\x59\xc9\xd0\x56\xa1\xd7\xc2\x20\xa2\x5c\x4f\x01\xdb\x76\x80\x3f\xc2\xd5\xf4\xd6\xc1\x40\x36\x52\xc5\x63\x8d\x8e\xcf\xea\x29\x05\xab\xe9\xb5\xb3\x99\x73\x7e\xe9\x64\xe0\x77\x25\xa1\x29\x29\xc9\x33\x42\xaf\xb2\x13\xde\x1c\x1a\x33\x97\xa2\xf8\x11\xfb\xd9\xf8\x72\xa5\x21\x43\xb9\xc7\x88\xbd\xdc\x7e\x0e\xdb\xaf\xd2\x33\x97\xe2\x44\xd3\x1f\x89\x3d\x60\x71\xc4\x3f\x33\x6a\x7d\x99\x85\xcb\x27\x65\xc6\x3f\xe8\xe9\x3c\xfa\xdf\x76\xcb\x65\xce\xc8\x7f\x6d\x28\x2a\x4f\x6a\xcf\xac\x6f\x2b\xd6\x24\x58\x27\xe3\x3b\x5d\xac\x11\x88\x29\xf4\x36\xf2\xa8\xfd\x7d\x22\x3d\x33\x95\x5b\xff\x92\xe8\xa8\x7d\x83\x57\x3f\xd0\xc2\x9e\x8a\x2f\xc7\x9f\x1f\x05\x4e\xf4\x6f\xaa\x3e\x18\xde\x11\x15\x9d\x84\xc5\x7d\xa6\xf5\x07\xa5\x3b\x01\x17\xcb\x6b\x5c\x30\x42\xea\x68\x2f\xc9\x3f\xe5\x47\x59\x02\xcf\x91\x45\x0b\x60\x60\xfa\xfb\xd1\x27\x9d\x3d\x05\x67\xb8\x1e\x59\x00\xf0\x7b\x86\xaf\xc2\xdc\x2c\x2b\x28\x20\x0d\x4c\x12\x7d\x27\xcc\x5f\x4e\x5a\x2c\xba\x9a\x4a\xb6\xdc\x19\x6b\x09\x13\x87\xb7\x3a\xeb\x7b\x5d\xdc\xf3\xc5\xdb\x79\x5e\x86\x54\x7f\x24\xae\x42\x58\xd2\x74\x52\xda\xa9\x22\x78\x90\x11\x5c\x7e\x3b\x91\x1c\x58\xf0\xa0\xd2\xb9\xa1\x47\xfd\x87\x00\x3b\xef\x0a\x90\x42\x8f\x7c\x8b\xd6\x86\x5c\xad\x4d\xe2\x18\x28\x6b\xbe\x64\xd7\x8b\x51\xa0\xec\x32\x74\xaf\x02\xb1\xc4\x3c\xf6\x02\x11\x74\x2a\xcb\x13\x81\xad\xc4\xae\xcf\x6e\xdb\xe6\x7c\x4b\x6d\x92\xb2\x60\x35\xcb\x08\x82\x6b\xf9\x3b\x79\xc5\xe0\x4b\xbb\xab\xc9\x6a\x7f\x25\xe9\x19\x0e\x69\x90\xf1\xf6\xb2\x97\x5a\x90\x75\xce\x4f\xcd\x13\xa5\x0e\xb9\x75\x08\xbb\x2b\x31\x71\xa0\x3f\x7e\xfa\xfe\x21\xf7\x4b\x87\x89\xfa\x43\xfe\xf2\x23\x56\x1b\xf4\xfd\x44\xcb\xa7\x58\xe7\x28\x13\x76\xfc\xcf\xda\x02\xa3\xd5\xb9\xfa\x4a\x48\xa9\x89\xac\x58\xed\xcb\xcc\x09\xf5\x80\x89\xfe\x68\x21\x45\x91\xd7\x6c\x3c\xab\xd2\xfe\x62\xd0\xa3\xc3\x9a\x92\x8e\x48\xc7\x72\xc7\xb1\x14\x4b\x06\xf3\xd3\xac\x00\xaa\x2a\xb9\xba\xd6\x04\xa6\x66\x98\xbd\x61\x55\x41\x35\x26\xbf\xe5\x55\x9e\x03\xe4\x95\xb6\x97\x3f\x9a\xa6\x93\x81\xd4\x41\xbc\x2f\xaa\x73\xb5\x29\x86\xdd\x3b\x42\x22\x9e\xd7\x56\x67\xd3\x0f\x37\xc1\x26\xd7\xbb\x12\xce\xf9\x0f\x94\x19\x14\x3a\xba\x9e\xbe\x2e\x70\x84\x9b\x78\x0d\x9d\x25\x66\x92\x06\xf1\x1b\xbd\x0b\xee\x51\x7b\xef\xfd\xb5\xdb\x81\x96\x56\xb8\xbc\xfc\x39\x70\x9b\xf3\x15\x37\xa5\xbb\x8d\x1e\xb2\x69\x92\x3e\x06\xc5\x45\x95\x44\x9c\x41\x79\x47\x65\x9e\xdd\x1d\x56\xd1\x34\xe8\xb0\x7d\xb3\xa0\x09\x80\xac\x7e\x3f\x3c\x56\xf0\xb9\x16\x18\xc6\x9c\xa4\x1f\x9f\x84\xe2\x13\x8e\x14\xb3\x43\x52\x82\x58\x97\x78\x1b\x05\x07\xa4\x3e\xff\x73\x5c\xc7\xdc\xf3\xe1\x48\xe9\x31\x87\x24\xcb\xad\x70\x68\xe0\xe7\x90\xa3\x57\x44\x4c\x2a\x9a\x2c\xd1\x93\x84\xcb\xe9\xb8\x96\xed\xe7\xec\xb8\xdf\xe9\x7c\xb0\xbf\x4f\x12\x89\x6d\x1d\xb4\xf5\x03\x74\xa9\x31\x76\x9a\xb1\xa4\x4c\xdd\x94\x88\x8c\x30\xaf\xaf\xd5\x8e\x21\xdb\x07\x48\x5a\xa5\xe2\x48\xa8\xbf\xb0\x4a\x3b\x06\xeb\x74\x02\xc5\x48\x6b\x70\x76\x54\x16\xd7\xb0\x44\x61\x4c\xe9\x96\xa2\x14\xc6\x32\x0c\x4f\x48\x72\x05\x44\xf2\x28\xe9\x07\x01\x45\x2d\x8c\x9c\x37\xcc\xa3\x7c\xbe\xc7\x5f\xc5\x93\x2c\x70\x0e\x1a\xf0\x1e\x50\x30\x1c\x31\x04\xc4\x08\xf0\xfb\x62\xfb\x05\xaa\xef\xc4\x97\x5f\x39\xa2\x6b\xa1\x9f\x71\x45\x68\x4e\x9e\x12\x43\x93\xe9\xeb\x7d\x6b\x43\xb4\x7e\xfa\x0b\xfb\xd3\x9b\x4f\xe6\x97\x7f\xbc\xd6\x9b\xf1\x95\x27\x0e\xa3\x08\x62\xb4\xc1\xaf\xaa\x18\xfe\xde\xde\x66\x15\x8a\x61\x38\xa4\x59\xa4\x34\x0e\x73\xc5\x2e\x01\x26\x10\x8a\xc6\x7e\xe7\xfb\xb9\x5a\x1f\xbc\x03\xc9\xfc\x8a\x1b\x93\xbf\x40\x20\x59\xc5\x44\x85\x3e\xb9\xc1\x4a\x76\x92\x48\xc7\x46\x50\x73\xa8\x3d\x6c\xc2\x30\x9c\x63\xa9\x83\x61\x8e\x64\x5e\xc6\x17\x42\xee\x67\x2f\x42\x91\x97\x4a\x84\x15\x67\x60\x9c\xa0\x1f\x39\x23\x53\xf6\xe3\x33\xf8\x50\x5f\xeb\x1a\x8c\x66\x80\xf6\x26\x66\xff\xa9\x53\x01\xe2\x17\x78\x0d\x04\xa1\xa7\x4c\xc4\x8e\x9b\x14\x4f\x05\x0b\x29\x13\x2c\x51\x55\x72\x0f\x7a\x3d\x3c\xde\x22\x92\xa8\xd5\xa4\x02\xa8\x46\xb3\x0b\xbe\xaf\x88\xbc\x48\x49\xd3\x56\x15\xa8\xb4\xab\x38\x59\x57\x7c\xca\xea\xb9\xf6\x8f\xdf\x4b\x82\xa5\xba\x7b\xdc\xa9\x1f\x0a\x3e\x9c\xa5\x30\xb9\x99\x56\x30\x43\xfc\xed\xfb\xf2\xe8\x63\x81\x51\xa5\xf5\x4f\x1e\x9d\x5d\xe6\x5f\x3b\xef\x7a\x86\xe8\xd3\x86\xff\xc2\xb5\xcb\x8a\xd5\x1d\xf0\x72\xc9\x60\x51\x4c\xfc\x2c\xb5\x2d\xa4\x0c\x44\xd7\x57\x86\x43\x5b\x71\x51\xd8\xe9\x73\x57\x21\x30\xa4\x4d\x7c\xff\xc9\xba\x8e\x57\x2a\x2b\xce\x86\x5e\x0f\x6c\x45\x62\xcb\xb9\x4b\xce\x2b\x0d\x63\xe4\xa6\x9f\x4f\x05\x07\x16\x0f\xd8\xa9\x21\xa6\x3d\x21\xa4\x39\xb2\x05\x8c\x4e\x43\x17\x72\xf3\xc0\x36\xe5\x2b\x5b\xeb\xc6\x70\x9e\xf0\x01\xc5\x96\x8d\x0b\x27\x5b\xda\x83\x9f\x96\x1d\xfc\xa0\xe2\x9f\x94\x98\x36\xfa\x2a\xa9\x18\xea\x78\xdf\xdc\xe1\xbd\x4f\xa7\x52\xb9\x0c\x47\x91\x74\x84\xeb\x15\x66\x5b\x28\xd0\x3d\xd2\x04\x56\x03\x9d\x07\xf1\xab\x5b\x3e\x38\xe1\x97\xa7\xad\x65\xff\x49\xb3\xc6\x32\x1a\x6d\x22\x63\x46\x9e\xe8\xd7\xfa\xed\xa4\x10\x97\xd8\x2f\xe5\xaf\x7f\xfa\x21\x33\x9e\x31\x40\xfb\x54\x3f\x66\xc9\x91\xb1\x5c\xe1\xe5\x0c\x39\x66\xa7\xe1\x1b\xb8\x40\xcb\x0b\x88\x6b\x13\xfb\xf7\x1a\x88\x15\xa4\x19\x2e\xb7\xef\x99\x1f\x8b\x86\xcb\x26\x68\x57\xbd\xbd\xe7\xef\x48\x5f\xe2\xb4\x5d\xe2\x0a\x94\x53\xbd\x5b\x4e\x15\x46\xf2\x61\x13\x18\xa1\x88\x1d\x62\x21\x2d\xaf\x62\x78\xab\x45\x40\xd2\x53\xf2\x8a\xca\x00\x23\xd9\xe4\x53\xbd\x40\x6a\x45\xcd\xca\x71\x6f\x5a\x6e\xf1\x9b\xde\x6c\x39\x6c\x22\x2c\x98\xc0\x8c\x63\x4d\x55\xee\x91\xf9\x5b\x97\xc6\x71\xbc\xae\x52\x8c\x92\x9d\xc9\x25\xb6\xec\xbf\x69\x42\xa5\xcf\x0c\x8d\xb7\xd2\xce\x1a\x49\x10\x5d\xe9\x6b\xe5\x99\xb1\xc4\xf0\x23\xf2\x34\xd8\xde\x1c\x02\x75\xdf\x33\x7c\x3c\x8b\xca\xde\xcd\x18\xb0\x67\xf0\x21\xa0\x82\xcd\xdf\x54\x56\x0d\x38\x50\xd7\x99\x45\x06\x36\x73\x6f\xf4\x87\xdb\xb1\xcc\xc4\x5b\x8c\xb7\x06\xab\xde\x2e\x06\x81\xb5\xa6\xdc\xc1\xda\x42\x87\xad\xc6\x08\xca\x1f\x1d\x20\xf4\xde\x06\x79\x8c\x42\xf9\x07\x00\xca\xdd\x30\xc0\x54\xfb\x7f\x3d\xb2\xf3\x5c\x0a\xde\x72\x4c\xe2\x37\x55\xa1\x91\xf8\xd2\xe0\x31\x9b\xd5\x75\x57\x3a\xcc\xba\x20\xd1\x36\xef\x23\x77\xb8\x33\xaa\x2c\x6d\x4b\xf2\x92\x31\x50\x46\xd0\xfa\x15\x9d\x2b\x3a\x7f\xe8\xf2\xba\x43\x7b\x84\xf5\x64\x31\xde\x24\x47\xf9\x92\x0c\x2d\xb4\xea\x26\xd7\xe3\x08\x0d\xce\xb4\x70\x97\x87\xa3\xf0\x9c\xca\xb0\xb6\xde\x31\xcc\xd0\x18\xcb\x11\x6a\x8b\x13\x88\x86\xe4\x3d\xc1\xfe\x7f\x03\xe3\x14\xc8\x1a\x21\x1c\xa3\x8a\x1e\x26\x49\xdf\xb4\x20\x08\x1f\x2b\xb8\xbd\xaa\x80\xea\x9a\x57\x35\x47\x34\x1e\xb5\xb9\xfd\xc6\x6b\x8c\x85\x91\x7e\xce\xeb\xa3\x19\x5e\xe4\x82\x58\x1b\x02\x6f\xca\xf0\x6d\xf4\x3b\x5d\x16\x02\xd7\x9f\x3e\x39\x4c\xf5\x71\x81\xb3\x59\x1a\x08\xe4\x70\x16\x4b\x84\x64\xca\x80\x49\xc9\x13\x18\x4f\xe5\xbf\x07\x47\x6c\xc5\x70\x2f\x0c\x4b\x4c\x39\xc4\xae\xff\xb3\x11\xc1\x33\xa5\x41\x8b\x5d\x67\x28\x45\x67\x10\xf3\x50\xeb\x24\x68\x19\x12\xcf\x1f\xc5\xf4\x73\xb2\x48\xcd\xcc\xab\x2d\x3d\xf1\xcc\xb1\x6d\x95\x1e\xcd\x65\x14\x7a\x1a\x29\x3f\xd7\xc3\x2b\x15\xd6\x2e\xa9\xc4\x64\xfa\x8d\x16\xad\xcf\xd0\xf2\xfb\x1e\x8c\x74\x89\x90\x4d\xd9\x92\xf9\xbd\x0a\xc5\xab\xc6\x3a\x0c\x30\x22\x29\x86\x77\x2d\x44\x31\x3d\xc9\x1c\xb6\xcc\x3f\xf7\x37\xb4\x3a\x23\x45\xac\x55\x97\xe6\x40\x7f\xdc\x6f\xde\x35\xee\x30\x9b\xb0\x65\x44\xb5\xef\xd2\x0d\xc5\x1d\xf4\x41\x85\xc9\xa7\x43\xa8\x90\x7d\xe8\x0c\x81\x0d\xce\xda\xc0\xab\x9d\x23\x40\x7a\x68\x3c\xb5\xd6\x99\x43\x4e\xa9\xe0\xe2\x08\xe7\x43\x81\xb2\x20\xc9\x6b\x66\x6e\x85\x3f\x9c\x6d\xce\x09\x80\x82\x46\xe7\x55\x1c\xf2\x89\xe0\xec\x11\xff\x6d\xf1\x53\x8b\xd8\x3a\x44\x1b\x57\x0a\x43\xb5\x09\x83\x1b\x8a\x78\xf9\x1b\x09\x4b\xce\x8f\xd7\xc0\x0f\x6b\x81\x83\x15\x20\x52\xc1\x4a\xc8\x2d\xa7\xe8\xd4\x00\x46\x27\xf1\xf4\xe1\x65\x50\x8f\x20\xc1\x2c\x7d\xcb\xc9\x4f\x11\xe3\x76\xf4\x19\x20\x46\x53\x60\x98\xbe\x15\xb4\x06\x30\xa6\xa2\x78\x0d\x8b\xca\xce\x6d\xa5\x4f\x38\x7b\xaa\xf6\xdf\x1c\x39\xdd\xfe\xf9\x71\xf8\x87\x43\xc7\x8d\x0e\xc1\x92\xc6\xa2\x37\xc3\x40\x7f\xfb\xe6\xc4\xa4\x5b\x54\x50\x9f\x20\xd5\x30\x36\xf6\xaf\x18\x49\x09\xd5\xbf\xc5\x9d\x97\x30\x5e\x6e\xa3\xa7\x9f\x01\x90\xda\xac\x54\x40\x35\x4f\x38\xe8\x1f\xec\x97\xce\xb3\xca\xb2\x33\xac\x2c\xd7\xfd\xda\x10\x13\xce\xe9\x9f\x5a\xff\x7b\x69\x47\x5f\x45\xb6\x20\x5b\xa7\xe3\x0f\x42\xbc\xbf\x6a\x8a\x17\xb1\x3b\x10\x89\xd9\x67\x57\x5b\x0a\x77\x35\x15\x83\xaa\x35\x6d\x3e\xac\xab\xe2\x78\xa1\xf3\xfe\x70\x8b\x62\xca\xb5\x97\x08\x13\xe1\x2a\xfb\x53\x69\x53\x12\xe3\x93\xdb\xbd\x87\xda\x80\x9d\x9a\x73\x02\x9d\x06\xa8\x7d\x4c\x77\x24\x69\xf8\x49\xce\xae\x11\xfe\x79\xd0\xae\xff\x9f\x1d\x5d\x6e\x2b\x8d\x3e\x4e\x6b\x7d\xa8\xe2\x61\x79\xc4\x1c\x01\x12\x86\xbe\xf4\x6f\x66\x2c\xc8\x94\x61\x79\xc3\xe7\x69\xbc\x27\x3f\x33\x65\x9f\x61\xdb\xe9\x31\x70\x17\xe8\xa7\xb8\x58\xe0\xba\x01\x46\x11\x70\xd4\xc2\xeb\x71\x9d\xaf\xd7\x42\xa5\x29\x73\x52\x51\x63\xac\xb5\xe0\x10\x96\xb8\x9f\xc4\x59\xfc\xfe\x83\x09\x81\xe1\x78\x17\xa5\xd7\xaa\x04\x64\x1c\x04\x27\x96\x06\xa5\x50\x63\xb1\xfc\x41\x11\xa8\x60\xa7\x7f\xf7\x9b\x77\x7d\xe1\xd7\x01\x91\x2d\x7b\x92\x68\x53\x93\xfa\x6d\xcb\xf3\x8d\x9e\x71\x1d\x60\x5e\xb6\x54\x98\x87\x56\x27\x6c\x18\xbb\x2b\xaa\xad\xf2\xcc\x8f\x8e\x2a\x40\x4f\xdd\xfe\x3b\x07\x75\xf8\x7c\x67\xd6\x3d\x34\x22\x7e\x9e\x3b\xbe\xae\xda\x75\x07\x48\x72\x41\xfc\xe1\x3e\x97\x7a\x18\xe4\xc7\xf4\x86\xd4\x01\x26\x33\x82\xc1\xda\xc3\x53\x1b\x1e\xf8\x79\xdd\xea\xa2\x55\x41\x97\x38\x09\x92\x1b\xd5\xb6\x7b\x1f\x61\xa9\x01\x74\x78\x76\xcc\xdf\x54\xe6\xff\xba\xbd\xa6\x99\xb2\x38\x96\x03\x7e\xfa\x77\x03\xd7\x51\xfc\xd3\x70\xa5\xff\xf4\x6b\x8d\x62\x8e\xbc\x28\x98\xca\xba\x2c\xdb\x0f\xb1\x73\x49\x94\x54\x6c\x31\xd3\xf1\xec\x8d\x8d\xa1\x3e\xc4\xe1\x91\x7a\x06\x82\xa4\x2b\x4c\x51\xe0\x8e\x5a\x74\xb2\x26\xe3\xd0\xda\xf9\xf0\x4e\xf4\xf4\xd5\xf9\x8b\x09\x5a\x70\x99\x88\x65\xfe\xfa\x9e\x30\x3c\x5e\x3e\xf9\x17\x7a\x8c\x70\xba\xda\x13\xd8\x99\x3d\x5c\x14\x55\x15\xcf\x46\x64\x07\xd0\x7a\x46\x9a\x14\x1c\xba\x87\x54\xbf\x03\xd1\xfe\x6f\x76\xa6\x4c\x1b\xe7\xa8\x6a\xab\x98\xce\x78\x71\x5c\xb9\x76\xa7\x7a\x75\x85\x69\x50\xaf\x69\xbb\xa6\xcb\x4e\x4e\x97\x35\x49\x62\xac\x91\x31\xf1\x48\x79\x27\x95\xcf\xa8\x9c\x3a\x57\x17\xd9\x94\xa3\x0e\xad\xfa\xaa\x80\x54\xe6\xc5\x35\x61\xe7\x4b\x7a\x7b\xff\xc1\x9d\xfd\xf1\x19\x8e\xbf\x45\x35\xaa\x35\xdf\x23\xc0\xb8\x3a\xcb\x75\x25\xe1\x07\x0e\x4b\x77\x0c\xe1\x32\x46\x01\xca\x66\x19\x9d\x4d\x44\xc6\x69\x4c\xff\x44\x00\xcb\xb6\x87\xf4\x23\x16\x37\x89\xde\x7d\xd5\xae\xcd\xed\x00\x9a\xa0\xd5\x12\x14\x26\xc1\x1e\xde\xa7\x34\xae\xd3\xf3\x3e\x4e\xff\xf7\x7a\x2b\x7b\x49\x25\x8e\xbb\xe6\xc0\x88\xe4\x78\x7f\x5f\x1e\x70\x99\xdf\xb9\x34\x1a\x4f\xb2\x7b\xfe\x4c\x4b\x14\x82\x50\xec\xda\x5f\x04\x61\xa8\x49\x96\x3d\xc8\xef\xa0\xaa\x90\x69\x6a\x6b\x50\x09\x29\x39\x8c\x9e\xf6\x17\xa5\x62\xc4\x2b\x3f\x37\x14\x2c\x97\xc0\x1b\x4e\x2a\xd8\xfc\x7c\x11\x0d\x28\x72\x7a\x8f\xe2\xa1\x88\xc3\x05\x57\x71\x99\x67\x32\xfe\x0f\xa7\xce\x59\x85\x71\x6e\xeb\x8f\x66\x08\x4d\x75\x36\xd5\x85\x2d\x71\x68\xf2\xe3\x30\x3c\x92\xee\x2f\xff\xc7\x77\xa4\xaa\x80\x61\x18\x30\x28\xb1\x2a\x3d\x09\x61\x40\x3d\x72\x84\x2e\xc1\x5f\x00\x17\x01\x3e\x05\xa4\xf1\xf7\x52\x8b\xad\x6f\x11\x61\x5e\xbb\x42\xc8\xf4\xd1\x69\x9d\x33\xe5\x2e\xf0\x66\x35\x8f\x6a\x18\x02\x32\x4b\x26\x6d\x74\x42\xd5\xd2\x5f\xa6\x6b\xb4\xdb\xc6\x16\xb4\xc7\x67\xb4\x85\x6e\x77\x71\x09\xb5\x28\xac\x26\x6c\xd5\xdf\x05\x67\x55\x4f\xd5\xa0\xa8\x85\xcc\x2e\x40\xdc\x11\x59\x61\x69\xc8\x0d\xf5\x16\xf9\x42\xdb\x38\x17\x1e\x1b\x3b\xb8\x57\x50\x72\xd5\xda\x78\x6c\x64\xb0\x75\xbc\xd2\xb9\x7a\xfa\xf0\x9e\xd9\x67\xc3\xb9\xbf\xb2\xd4\x84\xbb\xd6\x27\x74\xa7\xec\x42\x76\x21\x55\x12\xec\xd4\xd7\xd3\xa6\x00\x32\x75\x81\xc6\xa7\x66\x3c\x7b\x51\x18\x86\xe5\x85\x7d\x0d\x42\x6c\xc2\x8c\x0a\x28\x57\xf2\x61\x84\x3d\xe6\xdd\x7b\x2c\x2b\x20\x85\x93\xf1\x09\x84\x39\xd2\xd5\xfe\xba\xce\xeb\x01\xbb\x7f\xe6\xc1\x9a\xae\xc6\x7a\x71\x8c\x0a\x22\xb6\x70\xe2\x9f\xf8\x88\xd0\x5b\xb6\x12\x8b\xad\x5e\x6e\x0a\x4b\x5b\xb8\x28\xbd\x9f\x4f\xf6\x6e\x54\xef\xe1\xae\xd0\xa9\xbf\xe7\xb2\x66\x28\x0a\xc4\x77\xb2\x61\x6f\x0f\x03\xd7\x0f\x39\x66\xfe\xf6\x58\xb5\x9f\x92\x5d\xee\xa9\xbb\xb9\xf8\x31\x3f\xc1\x19\x88\xa0\x9e\xca\x21\x7c\x79\xf9\x25\xd3\xa2\xeb\xb7\x1a\x97\xf0\xa8\xb9\x4f\xb7\x35\xfc\xed\x79\xe9\x3a\x30\x69\xe9\xaf\xb8\x99\xf8\xd7\x44\xb1\xdc\xa1\x04\x9c\x4a\xdd\xf3\xa8\xc4\xeb\x1c\x6a\x7f\x18\xe7\xa8\xa9\xd1\xfa\xb1\x21\x63\x60\xaa\x8a\xff\x91\x51\xb5\xf4\x77\x06\xa9\x9b\x3e\x35\x5e\xe4\xe5\x3a\x58\xdb\x9b\x2b\xc9\x49\x84\x21\xb6\x92\x8e\x4c\xc2\xef\x10\xd0\xb6\x0f\x25\xc6\x3f\xef\x9f\xce\x3f\x5a\x17\xa8\x30\xdb\xd4\x40\xf8\x2d\xc8\x40\x7c\x6a\xe3\x86\x14\x41\x2b\xdb\xaf\x2f\x19\x9f\x37\xb4\x60\x70\xdd\x4c\x97\x7c\xe8\x67\xc0\x51\xbf\xcc\x4b\xb9\xe0\x56\xa7\x23\x7b\xab\x25\x1e\xb1\x2f\xb8\xcc\xdb\xdf\x48\x58\x0e\xe6\xb8\xec\x7b\xa7\xb1\x7c\x85\x49\x04\x6c\x03\xb7\x0a\xa8\x13\xc0\x46\x30\xa6\x65\x8c\xa1\x0e\x91\xf4\xad\x05\xa2\xb9\xae\xf2\xc3\x48\x6b\xf5\x86\xc3\x6f\x09\x99\x24\x87\x51\x58\x25\x51\x20\xcb\xb5\xdc\xf6\xf7\x0e\xd0\xf0\x24\xba\x3c\xc9\x73\x5b\x04\xd4\xe2\x29\xb6\xb2\x41\x80\x80\xc5\x39\xa9\x77\x95\x2d\x75\x18\xb8\x8a\x5d\xc6\xe8\xa6\xfe\xe7\x42\x0c\x68\x4d\x95\x5a\xd5\xcb\x0f\x0e\x21\x48\xae\x1c\x55\x5f\x3c\x84\x1f\x04\x5d\x3a\xf7\x60\xdb\x90\x9b\xd4\x8f\x54\x02\xd1\x9f\x53\xf5\xae\xe2\x3c\x3b\xa5\x7b\xaa\x00\xbb\x07\x77\x50\x05\x8b\x49\x22\xe9\x44\x29\xdc\x06\x99\xeb\x3c\xf9\x85\xd9\x4a\x0b\x3d\xd9\xdd\xa6\xc0\xf8\xac\x60\x12\x2d\x64\x5a\x3b\xc4\x6f\x0e\xf3\xf8\xcd\xb8\xe9\x8e\x0e\xc6\xcd\x94\x29\xe0\x11\xde\xa7\xf6\xf6\x8b\xb9\x1c\x46\xd2\xdf\x21\x9c\xbc\xfa\xd5\xc5\xdd\x7d\xf6\x59\x57\xb5\xf2\xa6\xe9\x5c\xbd\x08\xdd\xdb\x89\x21\xa3\x24\x0a\x10\x0b\x8c\xa2\x26\xa7\xf0\xb3\x30\x6f\x14\x5d\x28\xf1\x54\x01\x3d\x2e\x7d\x68\x21\xcf\xfc\x42\xc3\x8d\xf4\x01\xe1\xff\xb9\xbc\xb5\xb8\x3d\xe5\xf5\xb4\x53\xce\x71\x07\xb4\x61\x9a\x02\x82\xcc\xee\x54\xa4\x08\x8a\x10\xaf\x16\xdf\x38\x28\xea\x61\x3c\x0a\xfa\x97\x80\xed\xed\xde\x0e\x99\x36\x9f\x0a\xba\x2c\xa1\xab\x4e\xbb\xae\xc0\xe0\x96\x00\x38\x7f\x80\x80\xfe\x1e\xe7\xb6\x11\x57\xf9\xcd\x77\x0e\xf9\x7d\x6e\x79\x03\x6e\xb9\xb2\xd8\x47\x49\x89\x20\x0e\x2e\xd7\x82\x56\x39\x41\x63\xe3\x35\x37\x52\x01\x15\xf7\x26\x3b\xc1\x69\x96\x0c\xde\xec\xb2\xcf\x88\x0e\xf8\x1f\x2c\x3f\xe3\x2f\x07\xca\xf2\xd1\xb9\x2b\x32\x77\x68\x84\x70\x5f\x15\x3e\xd1\x66\x94\xe4\x6f\x6c\xf9\xc9\x15\x05\xd8\xb2\xf6\xf6\xb3\x6b\x7e\x0d\x08\x5e\xdf\x3c\x42\xa1\xe8\xa6\xc6\xe8\x3f\xea\x03\xe0\x51\x38\xe4\xa5\x2d\xe7\x36\xf3\xb7\x86\xc4\x60\x53\x22\x8e\x88\xac\xb0\xc6\x60\x12\x2e\x28\xe4\x15\xfc\x8f\xf6\x5d\x68\xf2\x89\x02\xbc\xcd\x06\xf7\xe6\x59\xc3\x8b\xa5\x06\x8d\x52\xb3\xd0\xa0\x70\xbc\x98\x30\x97\xa9\x99\xe7\xa1\x4b\x04\x36\x5b\x68\x71\xa0\x84\x26\x3b\x79\xbf\xe6\xce\x6f\x97\xc3\xb6\x49\x55\x5d\x69\x35\xfd\xe7\xc4\x2a\x04\xd1\x99\x8e\x56\xe7\xe6\xe2\x51\x40\x25\x82\x59\xeb\x28\xf0\xc3\xa7\xcb\x13\xbc\xcb\xc3\xd6\xd6\x9d\xa1\x1d\xa4\x88\x30\xc4\xbd\x48\x34\x4a\xb0\x4a\x43\xad\x2c\x24\x11\xa2\x25\x5f\x40\x58\xec\x07\x59\x7f\x30\x5d\xd7\xb3\x23\xd1\x4e\x3d\x2a\xbb\xe3\x73\x87\x13\xcb\x54\x09\x03\xc8\x5b\xf0\xa8\x7f\xe6\xfb\x24\x12\x8b\x9f\x7e\xef\xab\xf3\xab\x03\x39\x95\x36\x4d\x4f\xa6\x97\x8b\x5e\x9d\x85\x6e\xba\xd3\x43\xbf\xc1\x1a\x29\x38\x0b\x86\xbb\xef\xa9\xde\x3b\x64\x24\x85\x44\x3d\xa3\xf0\xb6\x44\x3f\x59\x49\x00\x8f\x5b\x5f\x1e\xb2\x85\x51\x30\x62\x93\x01\xd6\x2f\xdf\x65\x92\x69\x2e\x0b\x1f\xe0\x98\x6b\xe3\xb6\x0c\xb2\xd0\x1b\x96\x32\x94\x18\x44\x6a\x74\xec\x3c\xc3\x1b\x28\x0b\x4d\x38\x63\xe3\x7c\x29\x1a\x7d\xe4\x2f\xe9\x7f\xf2\xbe\xb1\x7d\xac\x35\xde\x5c\x39\xd4\x6d\x1b\xad\xcd\x20\x1e\x9c\xf0\x1c\x56\xec\x50\x26\xf8\x05\xf6\x66\x51\xec\xf2\xcb\xe7\x6e\x07\x46\x8f\xaf\xee\xe6\x37\x57\x49\x57\xbc\x59\xd3\x49\xee\xbf\xfb\xdf\xb3\x61\xde\x7e\xd1\x93\xb6\x05\x3d\xda\x86\x5a\x5b\x7b\x57\x12\xa3\x53\xe0\x4d\x02\xe7\x31\x55\xa4\x88\x43\x6f\x19\xca\x70\x5c\xde\xa8\x0e\xaa\x7c\x7f\xe7\x2c\xe8\x69\xc5\xa5\x38\x21\x96\xc2\x52\xec\xc4\x09\xc3\x97\x1a\x56\x64\xe1\x84\xb2\x5d\xad\xf8\xf3\xb0\x3d\x4d\x96\xa5\x6a\xee\xfc\xaa\xe9\x4a\x7e\xf5\x54\x0b\x46\x22\x64\x50\xf3\x52\xb7\x12\x3b\x6a\xe0\xa8\x3e\x27\x99\x64\xd3\xb4\x28\x65\xc3\x1c\xb4\xcf\x15\xe3\xaa\x3d\x32\x7f\x2d\xf8\xcb\x10\x12\xbd\x75\xe4\xbb\x52\xb2\xf3\x8a\x36\x36\x42\x0d\xa0\xa4\x0c\xec\xdc\x68\x9b\x34\x4e\xf9\x57\x16\x9e\x02\xb4\x34\x78\x81\x68\x07\x67\xf5\x5d\xfd\xc3\xb7\x9e\x16\xd4\xbb\x6f\x32\x48\x6a\xae\x30\x64\x59\x3b\xaf\x3f\xf5\x2b\xe6\x87\xe9\xbe\xba\x0f\xaf\xd4\x7e\x23\x89\x5e\x33\xf5\xe6\x65\x23\x34\xf3\x0a\xbe\x60\x23\x19\x5c\xf2\x30\x9a\x7f\x58\xc9\x1e\x95\x10\xee\x96\xe0\xb1\x0b\x6d\x3f\x67\x72\xd5\xb1\xb5\xd7\x42\xf1\x90\x68\x07\xc8\xc0\x10\xde\xa7\xfe\x42\xcb\xb1\x46\x2d\x9c\x6d\x6a\xa6\xde\x30\x46\xa9\x7a\x4a\x51\x59\xb9\x9a\x71\xdf\x7a\x93\xaf\x0e\xfd\x0e\xf7\x8f\xe7\xb0\x2d\xe0\xba\x12\xc7\x70\x2f\x52\x68\x43\xd2\xa4\xb1\xe6\xdd\xeb\xd8\x75\x0b\xa9\xc5\x12\x4e\x21\x95\x8f\x9d\x04\xa3\x15\x1c\xac\x12\xff\xf0\x45\x95\x73\x97\x1e\x29\x2a\x03\x13\x04\x08\xf5\xd3\x28\x18\x50\x70\x42\x26\x63\xf4\xd5\xb6\x0d\xdb\xc6\x3f\xb7\x80\x98\x74\x8f\xba\xe0\x72\x84\xa8\x08\xd0\x54\xc5\xe3\x20\x65\x7f\xe7\x58\x48\x10\x47\x66\x53\x40\x41\x13\x83\x60\x06\x69\xe2\x62\xca\x47\x9a\x3b\x05\xda\x2f\xa5\x72\xad\xb9\x64\x5c\x81\x46\x08\x1d\x52\x2f\x5a\x6c\x8f\x4d\x74\x2b\xd5\xf5\x05\xc3\x01\x40\x4b\x8b\xe5\x3a\x26\x86\x02\x2a\xe0\xfd\x7b\x7f\x93\xd6\x0d\xf3\x53\x99\x8a\xa5\x9a\xf2\x21\x31\xa2\xb8\x3a\x47\x71\x05\xd4\x92\xc0\xf2\x52\x64\xe0\x45\xb2\xef\x4b\x6b\xdc\xa1\xfc\x69\x5d\x89\xd5\x9a\xfe\xa8\xda\xc4\xfd\xe7\x1c\x7e\xe4\x13\x1c\xae\xf1\x82\xc4\x70\x88\x18\xbd\xeb\xac\x6e\x9c\x96\x2c\x0e\x00\xfc\xab\x26\x7f\x99\xef\x78\x0d\x03\x6f\x94\x64\x29\x9d\x4f\x5d\x66\x88\xc9\x21\xa4\x36\x3a\x9e\x36\x81\xab\x8d\xc5\x47\xc9\x59\x39\x85\xf9\x1a\x3d\xad\xbf\x9e\x77\x7a\x25\x6a\x05\xaf\x3d\x41\xd4\x20\xc1\xe7\x71\xcb\xed\x61\x73\x1c\xbc\xfd\xd4\x7d\xc3\xc7\xb6\xb0\xea\x7e\x87\x57\xc7\x73\xb5\xdd\x4f\x7d\xff\xf4\x2f\x15\x95\x09\x8e\x7e\x70\xac\x3f\x9b\xb2\x9f\x17\xea\x21\xca\x4b\xa3\xb3\x08\x65\x46\xa6\xee\xb0\x56\xbb\xa3\x28\x30\x7b\x0c\x62\x4a\xed\x30\x51\x74\xa5\x41\x27\xc5\x89\x71\xf4\xfb\x7a\x9e\xd7\xb8\x3a\xec\xfb\xe4\x85\x8d\x44\x5f\xa4\x02\x58\x48\x10\xa9\x31\x0a\x9c\x6b\xdc\xdd\xbf\xa3\x22\x11\x85\x2e\x9b\xa5\xff\x63\x03\xe6\xf8\x81\x07\x69\x7d\xfb\x15\x5a\x4b\xa0\x7a\xf1\x90\x66\x91\xb8\x19\xbb\x46\x89\xb4\x79\x76\xb0\xb4\xc5\x12\x5c\xf0\x09\x54\x08\xee\x8d\x53\x5b\x13\xcd\x3f\x1a\x11\x8c\x8a\xa8\x95\x09\xd1\x54\xb8\x61\x9b\x67\xf3\x58\xd7\xb4\x64\x9b\xba\x06\x74\xd4\x44\x88\x16\x51\x60\x1d\xbd\xf4\xda\x08\x7e\xdc\x56\xa4\x00\xf5\x46\xcd\x5d\x5b\x97\xc1\xa4\x09\x32\xdf\x7e\x89\xf0\xda\xb4\xda\xc5\x99\x7e\xf5\xd3\xd4\xf8\xd4\x3d\xd8\x7b\xe3\x21\xcd\x94\x57\xcb\xc2\x92\xa1\x6f\x27\xad\x0d\x23\x8a\x55\x1b\x0f\x0c\x1d\x01\x9a\x04\xb4\xf6\xde\xa7\x8e\xdf\x2b\xe3\x9e\x6b\x79\xa8\x41\x7e\xe1\x06\x50\x26\x41\xa4\x0b\x37\xb7\xf8\xea\xc8\x3f\xfe\xc4\x8c\x1a\xa9\x43\x6b\xc1\xeb\xb8\x92\xd0\xec\x34\xa6\x8e\x8a\x98\xf9\x6f\xcc\x90\xd8\x3b\xdf\x26\x0a\x1b\xfa\x78\x0d\x5d\xad\x6e\x59\x43\x3d\x2d\x88\x23\xd2\xbc\x28\xa2\x70\x86\x32\xb3\x97\xd2\xd7\x56\xd4\x86\x30\x34\x0e\x64\xd4\x09\x9c\x98\xad\x5f\x2c\x01\xb3\xd8\xb2\x25\x44\x29\xc7\xdc\x11\xd0\x2e\x8b\x49\x92\xad\x01\x81\x5a\xb1\xdd\x76\x02\xfe\x70\x0b\x5e\xcb\xe5\xb0\x21\xf4\xb1\x85\x64\xc3\x80\x8a\x09\xdc\x10\x97\xcb\xf1\xcf\xce\x00\x2b\x0e\x18\x07\xbd\x45\x91\x0b\x87\x27\x1f\xb9\x33\x4d\x4b\x73\x5a\x8a\x70\x5d\xa0\xb7\x2c\xcd\x08\xc5\x31\xac\x30\xe0\xb5\x09\x58\x46\xe8\x4b\x50\x19\x3f\x15\x17\xc6\x24\x70\xf4\xb7\x3a\x9d\x9a\x75\xe4\x34\x3b\xd0\xf4\x28\xd0\x12\x6d\xd9\x9d\xca\x90\xca\xb2\x9b\x64\x8f\xed\x06\xac\xc0\xd5\x8f\x0c\x2a\xe1\xe6\x30\xaa\x74\x9f\xa2\xbb\xeb\xba\xa5\xfa\x6f\xff\xfd\xdb\x62\x03\xef\x8c\xf7\xc8\xb7\x38\xdb\x87\xc7\xfe\x1d\xcd\x62\x38\x2f\x18\xe9\x21\x62\x4f\xc6\x83\xaa\x3a\xd1\x71\x1b\x4d\xa6\x5b\x5e\xa2\xbd\x66\x3d\xda\xaa\x4f\x87\x53\x5b\x8b\xb1\x43\x13\x06\x73\xd7\x2a\x6e\x27\x65\x7a\x35\xa5\x56\x1a\xe8\x78\xcc\xa9\x04\x1a\xbd\xbe\x7d\x6e\xbf\x1f\x89\x53\xbe\x8b\x22\x35\xdd\x25\x7b\xa6\xd8\xee\x69\xd3\x4a\x17\x22\x9e\xee\xfe\x29\x06\x9d\xc6\x7b\xa0\x6e\x93\x00\x9a\x9c\x05\x4b\xd5\x60\x6c\xb6\x57\x11\xfe\xa2\xf4\x5b\x98\xe9\x5f\xb4\xba\xf9\x98\x50\x63\xaf\x34\xf2\x77\x8c\xb0\xd5\xb9\xca\xb3\x67\xd2\x65\xbf\x79\x3f\x18\x5a\xc2\x61\x49\x05\x61\x8e\x9a\x66\xda\xb8\x80\x2f\x24\x10\x39\x94\x91\xc4\xb2\x6e\x0a\x52\xe2\x6e\xbc\x87\xf3\x95\xc4\x7f\xf9\xb0\xc2\x18\xcb\x21\xce\x50\xbb\xe3\x72\x2f\xfb\x85\x8e\x75\x1b\xd9\xce\x0e\x47\xc4\x7c\x29\xc4\xd5\x0c\x14\x00\x9a\x53\x3e\x91\x3b\x44\xfd\x23\x74\x3c\xbc\xe7\xce\x87\x08\x52\x2b\x5d\xe2\xc9\x1b\x3f\xa3\xfc\x07\x02\x7e\x16\x03\x16\x89\x0f\x58\x9b\x3e\xc9\x03\x8c\x99\x6f\x92\xf0\x4a\x68\xe4\x56\xf5\xfe\x70\xf2\x4b\xb2\xcf\x09\x1a\x95\x70\xda\x31\xb7\x4e\x8b\x76\x94\xf6\xbe\x8d\x8b\xdb\xb0\x16\x58\xc3\x6c\x79\xf7\x43\x23\xf9\x74\x3b\x5b\x5f\xbe\xd0\xf1\xeb\x11\x0f\x50\x30\xaa\xed\x5d\x4c\x16\x2c\xc3\x6c\x5c\x86\x49\x35\xa9\x73\x31\xaa\xb4\xe3\x25\x78\x18\xc8\x82\x96\xfe\x1b\x7b\x62\x3a\x81\xef\x7d\xa1\x90\x42\xeb\x2c\x26\x48\xa3\xb0\x3e\xee\x1f\x8f\x55\xf9\x14\x96\x16\xf8\x0f\x96\x7d\x51\x36\xac\x86\xec\x25\x5e\x0a\x30\xaf\x05\x3d\x95\x29\x6c\x26\xef\x81\x10\xe1\x29\xd6\x47\x55\xd0\x42\xca\x43\x24\x76\xa0\x0f\xc6\xd0\xef\x16\x95\x14\xf8\xdd\xcb\xf5\xf0\x3c\x6b\x95\xf1\x4d\xe2\x22\xf7\xc1\x4c\xe9\x39\x67\xf1\x64\x32\x38\x38\xd7\x89\x4e\xfb\xac\xb8\x1d\xc8\xef\xad\xe0\xf6\x28\xa6\x08\x82\x63\x0a\x10\x49\x4d\xaa\xee\xcd\x5b\x9f\x77\x93\xc4\x7a\xfc\x3f\xb9\x66\x05\x15\x62\xff\x01\xbe\x9d\xc8\x21\x37\x39\xa3\xd6\x3f\x33\x78\x7c\x4b\xa6\x97\xfe\x2d\x6c\x7e\xe5\x7e\xf4\x8a\xe5\x84\x37\xed\x09\x56\x5a\xca\x41\x47\x10\x7e\x80\x14\x3f\x60\xbf\xeb\xa6\x5c\xe2\x0f\xa1\x71\x6c\x78\xeb\x74\x8b\x81\xf7\x93\x41\xdf\xb7\x73\x36\x6c\xea\xee\x27\x1a\x86\x58\x5f\xcf\x2b\xa6\x1d\x0a\x22\x05\x53\xf9\xf7\x5e\x34\x99\x38\x65\x9e\x7e\xd3\x2e\xc2\x69\xfa\xd1\x70\x23\x05\x49\x35\xd4\xb9\xb8\x97\xfa\x42\x62\x70\x35\xe3\xfc\xd1\xeb\x29\x27\x55\x1f\x59\x00\xa8\x3f\xbb\x26\xda\x59\xdf\xf2\xb9\xcf\x7c\x17\x06\xba\x41\x19\x2b\x55\xe0\xcf\x28\x2c\xfa\x39\x4d\x2c\xf9\x5b\x0f\xc5\xe8\x1a\x1b\x73\xc9\xa6\xb5\xf3\xac\xcb\xbc\x96\xca\xc8\xaf\x05\x36\xfe\x04\x67\xd4\x66\xef\x33\x38\xeb\x86\xf3\xb1\x35\xcd\x99\xb0\x59\x48\x9f\xfa\x9d\x12\xa5\x15\x54\x75\xb6\x17\xce\xf0\x26\x7f\x0b\x4a\xdd\x71\xd2\x71\xbf\x68\x4e\x3c\xf9\x6a\x80\x1d\xd8\xfc\xf0\xe3\x65\x3d\xae\xdf\x2f\xd2\x40\x6d\xb3\x50\xa0\xce\x15\xd8\x5a\xa3\x40\x92\x61\xea\x97\xf8\xe8\x52\x41\x6d\xfc\x31\x9f\x1a\xb2\x97\x8f\x1d\x8e\x3a\x6b\xf4\x57\x1e\xcb\x18\xce\x58\xed\xfc\xa7\x78\xb9\x17\x42\xc8\x3a\x11\x85\xea\xb4\x1f\xec\xaa\xc5\x6f\x8f\x85\xed\x09\x16\xbf\x62\x4d\x31\x39\x28\xb2\x0d\x4d\xc0\x60\x1c\x10\x66\x46\x93\xed\xf8\xf1\x13\x08\x24\x60\x9a\x53\xd6\x31\x1a\x5b\x78\x1f\x2f\x85\xa9\xed\x6a\x70\xec\x9a\xf0\xb3\x04\x9a\xfe\x3e\x73\x4d\x08\xda\x49\x81\xf5\x95\xa8\xfa\xe5\x14\x83\x1b\x3c\x9d\x38\xee\xde\x66\x81\xba\x17\x84\x5a\xab\x6d\xbb\xe6\x15\xe3\xd4\x91\x83\xbb\x67\x9d\x7d\xb4\x94\xc2\xe7\x1c\xf8\x59\x50\xb4\xc2\xca\x49\xf2\xd4\x19\xeb\x65\x4a\xca\xef\xdf\x7a\x03\x96\xa1\x5b\x56\x85\x46\x02\x1d\xd2\x32\x24\xe2\x80\xa8\x5b\xb6\x77\x36\x83\xa8\xc4\x2e\x77\x15\x29\x8c\x89\xdf\x74\xdc\xe8\xa6\xbf\x68\xee\xd5\x8f\xd9\xf4\x14\x55\xef\x60\x17\xb7\xe0\x55\xe6\xbc\x16\x46\x1d\xc7\xd2\x7e\x73\xa3\x0b\x50\xbe\x24\x0a\xac\x5d\x1d\x3b\xe4\x29\xdf\x9f\x6b\x15\x4c\x65\xf4\xde\xa4\x4c\xf7\x9f\xa8\x64\xe2\x21\x31\x71\x2e\x6d\xb7\x76\xbe\x41\xdb\x2e\x3a\x77\xcf\x54\x3e\x88\x30\x1c\xab\xcb\x3c\x0e\x01\x66\x13\xc7\xd8\x88\xdd\xf1\xf4\xe1\x37\x8a\xfa\x80\xfb\x02\x61\x18\xc7\x2f\xda\xda\x9b\x57\xda\x1b\x8a\x0b\xf8\x07\xfe\xad\xb5\x54\xb8\x5d\xc1\xad\x87\x75\x62\x5c\xf5\x42\x31\x9c\xd6\x38\x32\xa3\x54\x81\x83\x3d\x34\xb4\x47\xb6\x48\x3a\x89\xc1\x50\x04\xd6\xd0\xb9\x62\x47\x86\x28\x6b\xa7\x67\x69\x61\x53\x95\x12\xa2\x26\xa5\x50\x8a\xb8\xf0\x21\xe8\x5b\xce\x00\xc5\xed\x9d\xf6\x12\x66\xda\x30\x05\xe1\x5f\xfa\xab\x57\xbc\x9d\x34\x8e\xc5\x48\xfa\x16\x65\xa2\x0f\x49\xd5\x45\x7f\x86\x3a\x33\x10\x73\xe1\x79\xc2\xef\xfb\xf8\x2e\x84\x0a\xe1\x09\x35\x40\x3a\xdc\x62\x35\xe7\xaa\x42\x55\xf6\x49\x3d\x12\xc5\xbf\x7b\x3b\x0c\xda\x16\x72\xe9\xdb\xbd\xed\x4f\xa8\xeb\xd1\x37\xea\x59\x39\x1d\x03\x4c\x82\x3a\xd9\x06\x29\x78\x2a\xa0\xb2\x19\xd9\x10\x3c\x79\x08\xe9\x48\x9c\x36\xe8\x52\xf1\xdf\x57\x5f\xa5\xa1\x6f\x53\x73\xc7\x39\x48\x8c\x82\xf0\x34\x32\x91\x5f\x5d\xdc\x00\x14\x5a\x63\xdd\xc1\x56\x28\x68\x26\x01\x7a\x74\xe0\xf5\xb8\xdc\xcf\x7f\xec\x5f\xa9\xc7\x42\xe2\x62\xf6\x2b\xf2\x64\xe2\x83\xda\x7d\xcf\x8c\xe0\xd4\xf6\x4d\x38\xee\x6f\x25\x4f\xba\xbc\xa2\x17\x6c\xd9\xb1\xa8\x8c\xe1\xbc\x3a\x20\xc8\xab\x5e\x6c\xb0\xd2\x59\x02\xc8\xcf\x7b\x14\xa9\x48\xe2\x5c\xd6\x5c\x70\xfe\xd6\xfb\x0b\x0c\xc2\x6d\x81\x03\xb6\x56\xfb\x53\xfa\x09\x76\x5c\x36\xb2\xfb\xc1\x58\x85\xe7\x68\x91\xf9\xc6\x03\x1e\x74\x0b\xb5\x91\x60\xea\xc9\xdb\x72\x02\xd2\x9b\x7c\x37\xfe\x81\xda\xa6\x79\x19\xc5\x1d\xbb\x98\xc2\x81\x88\xee\xde\xec\x26\x69\x3d\x69\xeb\xc1\xe7\xa0\xdc\xbc\xe4\xad\xe9\x34\x55\xd6\xc4\xd8\x2f\x05\xb3\x2a\x89\x90\x2b\x71\x6c\x5a\xa0\xde\x62\x2d\x30\xdc\x1c\x0f\x67\x5c\xb6\x90\x11\xcb\x70\x22\x86\xb3\x7c\x99\xf9\xe9\xca\x38\x53\x20\x7d\x5d\xb4\x32\xe2\x37\x7a\xdd\xa2\x51\x81\xc7\xdd\x07\xba\x5b\xdc\xbe\xe3\x32\xab\x38\x1a\xaa\xf5\x4f\x0e\xb8\x5f\x12\xfc\x68\x38\xd6\xca\xdd\xc8\x32\x75\x53\x58\xf1\xb0\x92\x2f\x23\x1a\x0c\x5d\xdd\x69\xd2\x16\x16\xc2\x83\x34\xf0\x40\xe5\x33\x10\xf8\xee\x07\x62\xe5\x81\xea\x0a\x45\x76\x81\xb1\x8c\xfe\x90\x5b\x94\x7d\x06\x9c\x86\x31\x1d\xed\xbb\x55\x59\x52\x89\x20\x98\x5b\x8b\x32\x02\x0f\x22\xa3\xf2\xb1\xf1\x41\xc7\x4e\xf5\xa8\x35\xe7\x30\xfe\x8b\xdd\x6c\x9a\x5a\xbd\x67\x24\xe7\x26\xb2\x4e\xe4\x2f\x33\xa5\x95\x09\x38\xa1\xf1\xf3\xfc\x7d\xb3\xdf\xa7\xa3\x1f\xbc\x86\x3e\x93\x3c\x5c\xfd\xb7\x77\x87\x63\xfe\x16\xa4\xbd\xa2\x61\x5a\x94\xec\x26\xd1\x78\x74\x87\x02\xb9\xe7\x3b\xcf\xbd\x2d\x46\xcf\x81\x39\xcd\xc5\x47\xc0\x60\x8e\xed\xa0\x90\xb9\x47\xa3\xd0\xa6\x10\x13\x4f\x59\x03\x67\x0b\x56\x5b\x7b\x36\xd1\x50\x2d\xb2\xa7\xb4\xb9\x24\x7e\x6d\x20\x0b\x27\xec\xe9\x2a\xdf\xb0\x0b\xa7\x93\xac\x20\xd5\x57\x3d\x33\x2e\x8b\xd4\x0c\xc7\x90\xa1\x98\x46\x53\x57\x37\xe9\x20\x81\xd2\x1f\x6d\xb6\x9a\x4b\x79\x90\x14\xe0\xe9\xa7\x8f\x14\x13\x4e\xae\x30\xf1\xf1\xff\x04\x2f\x95\x85\x1f\x6d\x0f\xee\x54\x20\x18\x90\x5e\x26\xf6\x74\x39\x0f\xa6\x7f\x4d\x26\x4f\xa3\x6e\x5f\xb2\x51\x5b\xc5\xf3\x33\x4d\xc9\x54\xd2\x20\x53\x48\x1a\x3e\x65\x9a\xe3\x1c\x61\xa2\xdf\x52\xc3\x6c\x9c\xec\xef\x4e\xb8\x9e\xe3\x11\xc7\x1e\x77\x00\xa6\xaf\xab\xec\x66\x04\xc6\x61\x05\xe1\xe6\x04\x91\xa3\xfc\xaf\x2a\xaf\x05\xca\xa1\x53\x87\x81\xeb\x20\xce\x6f\x27\xcf\x3f\x7f\xdb\x49\x9c\xb3\xc6\x32\x4a\xa3\xef\x9e\xe8\x74\x9f\xdd\x40\x4a\x33\xd5\xd4\xc7\x1b\xc6\x6d\x0a\xa8\xcf\x1b\xe7\xcb\x6b\x57\xb4\x8a\xc1\x3f\xc3\x90\xdb\x25\xb4\x36\xd4\x4a\x79\x27\xf3\xbd\xec\x43\xf2\xf7\xd5\x35\x45\xdb\xc3\x21\xda\x43\x5f\xd8\xf2\x38\x1f\x7d\x3b\x2b\x2a\x7b\xba\x2a\x99\x20\x9e\x4f\x6e\x7f\x61\x2c\x06\x67\x14\xcb\xf6\x61\xba\xcd\xd6\x2a\xa8\x8c\x21\x03\x62\x92\x25\x32\x5d\x29\x76\x89\x84\xbd\x10\xe7\xf6\x02\x15\x0a\xc4\x28\x30\x2d\x58\xfd\x80\x02\xf5\xc1\x46\xf0\xfe\x94\xfd\x26\xd9\xf7\x0c\xee\xb1\x27\x8d\x7d\xa5\xb3\x99\x77\x32\x1e\x8a\x9c\x57\x4a\x10\xb7\x7a\xeb\x80\xeb\xff\xe9\xff\xd3\x5f\xe7\xb7\xe3\x86\x02\x2b\x2b\x6c\xc4\x23\xa6\x55\x44\xaf\x78\x16\x44\xa3\xa9\xb7\x30\x03\x18\x94\x0d\xba\xc9\x2c\xd1\xca\xb4\xce\xc1\x50\x54\x2d\xd1\xef\xaa\x05\x5e\x7b\xa7\x2c\xe7\xbe\x29\x61\xfd\x46\x6a\x2e\xd0\x71\x4d\x7a\x84\x5b\xd2\x71\xa6\x16\x76\x76\x93\x06\xbe\x3c\x36\xc4\xb5\xdd\xef\xa8\xa5\xe0\x31\x20\x86\x40\x92\x22\x66\x53\x62\xea\x94\xda\x6c\x5c\x96\x35\x43\xb6\x8d\x00\xae\x95\x00\xae\x8d\x00\xd6\xdf\xb8\x2c\xd6\x41\x7a\xd0\x41\xe6\x7a\xdd\xf2\xed\x8e\xb4\x70\xb4\x5c\x05\x3e\xf1\xbd\xf5\xbc\xd6\x64\xde\x79\x43\x99\x6e\x24\x7a\xc1\x84\xd3\x76\x3f\x36\x3d\x33\xdb\x0b\x79\x92\xe5\x2e\x62\xde\xe4\x8f\x5d\xe4\xbd\xd1\xf8\x33\xc7\xea\xa7\x2e\x3d\xdc\x90\x45\xe9\xdf\x58\x66\xca\xdd\x7c\x67\xb6\x3b\x77\xfc\x59\x50\x2e\xec\x15\x2b\xbf\x3c\xd8\xd4\x99\x6b\xba\x11\x7f\x27\x10\x5e\xeb\xf8\xec\x59\x39\x2d\x24\x76\x20\xf7\x3b\x56\x5a\xe1\xaf\xf9\x87\xe2\x52\x35\xe1\x40\x15\xc3\x8f\x17\x0c\xaa\xe7\x1c\x06\x94\xfc\xd3\x0f\xab\xfd\x63\x13\x9b\xf6\x77\x7c\xe5\xb2\x65\xc0\xd6\x83\x41\x7e\xd9\x26\x07\xfd\xb2\x5d\xe8\x9d\xd9\xea\x45\x79\x73\x5d\xa4\xb9\xb0\xbd\x7b\xd7\xd7\xc8\x9c\x2b\xb4\x3f\x22\xbd\x16\xa2\xce\x39\x3b\xd6\x86\xba\xfd\x65\x09\x40\x86\xd9\xe9\x06\x65\x36\x66\x8c\xce\xba\x82\x36\x32\x75\xaf\xab\x18\x71\xd1\x42\x09\x1c\xd7\x07\x60\x20\x78\x50\x17\xd1\xaf\x03\x34\xae\x1f\x52\xc2\x48\x8a\x49\xdf\x2d\x4e\xb5\xce\xdd\xb3\xd6\x6e\xda\x97\x23\x83\x66\xba\x05\x63\x34\xd4\xab\x80\x72\x6b\x55\x38\x46\x95\x96\xec\xd3\x08\x68\x77\x4f\x42\x95\x80\x35\xfd\x28\xc0\x96\x4f\x72\x74\x73\xe6\xf8\xa5\x48\x31\xa5\x48\x38\xc0\x73\xbb\x11\xfe\x1c\x72\x41\xe8\x06\xa1\xb8\x44\xd1\xa0\x66\xd6\xf8\x33\x46\x53\xec\x9e\x91\x61\x15\xd0\x7b\xca\x23\x5e\x1d\x8e\xa9\xb1\xfa\xd7\x11\xf9\x9d\xfe\x4a\xa9\x6d\x3c\x7d\x7c\xee\x91\x5b\xc5\xf6\xc5\x4d\x59\x96\xa9\x52\x71\x40\x80\xa7\x17\x99\x6f\xde\x13\xdc\xf8\x87\x02\x4c\xae\x71\xb0\xfc\x17\x73\xf8\xe3\xc3\x24\x92\x8d\x7f\xb6\xeb\xd8\x2c\xb0\x13\x45\x12\x45\x5f\x2b\x7e\xfb\x43\xf7\x82\xcc\x94\x3a\xb7\xc6\xa9\xed\xfb\x9e\x25\xb3\x25\x45\xfe\x5b\xd5\x5d\x5b\xd2\xba\x65\xe3\xf2\x27\x72\x63\xbb\xff\x08\x54\x61\xcb\x3c\x8d\x6c\x3a\x42\x5f\x55\x09\x8a\xfb\xad\x09\x9e\x3e\x3c\x54\xac\xd9\x76\x7a\x3e\xc6\x7b\xc1\xc9\x0f\xe5\xf9\xc3\x56\x7e\xde\x76\xe3\x61\x01\xdb\x7d\x52\x60\x83\xd3\xac\x57\x07\x78\x59\xf9\x92\x30\xdc\x4f\x50\xeb\x73\x8d\x88\xb8\x83\x27\x58\x28\x91\xe0\xf6\x39\xc2\x94\x50\x6d\x00\x78\xac\xd9\x78\xac\xe9\xf8\x01\x64\x01\x15\x60\xff\x52\x9b\xee\xce\x58\x66\xc6\x7a\xff\xaa\x52\xe7\x2e\x51\x3c\x20\x76\xc3\x51\xdc\x7d\xe8\x1e\x34\x69\x37\x50\x56\x6a\x7f\x14\xd7\xf1\x9b\x12\x74\x42\xf0\xc5\x8a\x51\xe2\xe0\x29\x87\x63\x12\xae\x0e\x38\x06\x47\xc7\xd4\xd7\x52\x47\x53\x5d\x6d\x09\xd6\xe3\x38\xae\xc3\xf2\x7b\xbc\xd8\x76\xfa\x03\x84\xc4\x88\x55\x21\x08\x45\x17\xba\x12\x1f\xa8\xc4\x86\xb2\x2f\x3a\x7e\x48\x8a\xda\x39\x16\xac\x2e\x94\xf4\xe9\x17\xd0\x39\x0c\xc9\x53\x8c\x65\x34\x76\x86\x4a\x5b\xee\x60\xc2\x94\x35\x7f\x39\xc7\x16\x5b\xb5\x27\xa1\x0a\x6b\xe4\x9b\xe7\x5d\x9c\xc5\xdc\xf6\x22\xb9\x0b\x5d\x7b\xfd\xe0\x4f\x6c\x19\xb4\xc1\xe7\xb0\x53\xcb\x7a\xa2\x10\xc6\xab\x82\x57\xb8\xa0\x49\x9b\x24\xe9\x62\x36\xd9\x06\x12\x18\xbf\x21\x54\xa1\x3b\xd1\xdf\x89\x6c\x30\x49\x03\x22\xdf\xc0\x2a\x0c\x31\x98\x54\x43\xb9\x25\x7f\xf8\x0b\xc8\x7c\xbf\x0c\xc4\x35\x7d\x2e\x4e\x9d\xce\xd2\x13\xb9\x5d\x48\xd3\xfe\xb7\x2d\x80\x30\x08\x4e\xe8\x1a\x53\xba\x19\x1f\xba\xff\xad\xc7\xd7\x09\xd1\x59\x6d\x5d\xd7\xc1\xea\x40\xe0\x0a\x4f\xcb\xa8\x79\xf7\xd5\xea\x66\x82\x95\x97\x61\x13\x57\x44\xda\x7b\xe6\x56\x39\x59\x7b\x87\xd7\x53\x98\x3a\xcd\xfd\x55\xae\xde\x12\xb9\xe8\x5c\x63\xc9\x59\xc1\x8d\x72\x70\x3a\xd9\xd0\x6e\x9e\x80\x14\xc7\xce\x76\xb3\xa2\x34\x37\xb9\x68\x51\x18\x41\x96\x38\x62\xde\xfa\x81\x9a\xac\xd5\x54\xb1\x76\x1f\x84\x7e\xf5\x2c\x5a\xb6\xd4\xe1\x14\x94\x15\x5a\xff\xa6\xb6\x3c\x75\x79\x74\xc6\x1a\x03\x76\x33\x69\xdd\x54\x69\x8b\x0d\x4e\x19\x3b\x0f\x80\x79\x65\xa3\x04\xb5\x12\xd7\x36\x59\xc0\x9b\xf0\xfc\x4c\xc7\xb3\x5a\xaf\xed\x69\x8d\x06\xbc\x0b\x59\x27\xf9\x21\x41\x9b\xed\x93\x10\x05\x98\x81\x2b\x46\x95\x86\x0f\xcc\x38\x5f\x5d\x5f\xbe\xae\xeb\x5a\x8c\xdf\xef\x9a\xec\x29\x85\xa9\x1c\x10\x74\xc1\xd9\x47\xf5\x06\x4d\x0a\x4e\xc6\x75\x6d\xcc\xf0\xfd\xe8\xcc\x6f\x38\x01\x02\xc6\xdc\x98\xe2\xf5\xb0\x26\x7f\xe9\x91\x6a\x1b\x9c\xd5\xc8\xd8\x94\x30\x4e\x9e\x05\xf7\x3c\x2d\x55\x08\xfd\x7d\x9b\x6b\x7e\x19\xc8\xc4\x1f\x08\x7a\xb2\x8d\xad\xf0\x11\x30\xf5\x2e\x6f\xe1\xda\x1c\xe7\xc5\xca\xdd\xb4\x05\x5c\x9d\xb3\x93\x85\xa6\x3b\x00\xfa\x3e\x59\x9c\x48\xf9\xdd\xe5\x5a\x22\x25\x0c\x5c\x74\x6a\x5a\xe3\x2b\x05\x7e\xb8\x1e\x30\xbe\x47\x5f\xba\x03\x40\x6a\x6b\xc1\x5b\x35\xc4\x3f\xe8\xe9\xb2\x32\x4f\x03\x95\x55\x5a\x1f\xfa\x3b\x41\xed\x7b\x5f\x6a\xa9\x0d\xbe\x0d\x6c\xaa\x7f\x5a\x34\x0d\x65\x2e\xc6\x5c\x73\xb4\x1c\x53\x11\x9c\xd2\x13\xc1\x5e\x50\x0d\x0f\x77\x02\x25\xb7\x05\xb0\x79\x55\x76\xe0\xf5\x87\x02\x05\xf6\x02\xe7\x94\xda\x05\xe4\x00\x2d\x15\xaf\x1f\xb5\x2e\xb9\x6b\xba\xd1\xee\x64\x1d\x89\x47\xb7\x01\x21\x0b\x00\x6a\x39\x41\x6b\x02\xf1\xbe\x7f\xc5\x22\x1a\x2f\x41\x64\x46\x62\xb4\x54\xc4\x79\x8e\x9e\xea\xec\x6d\x85\x28\x9e\x02\xc5\x68\xc9\xc5\x89\xfe\xfc\x03\x00\xf5\x26\x81\x91\x05\x2d\xe2\xf8\x40\x7f\xe6\x44\xe2\x18\xfd\x23\x51\x7c\xe9\xb3\x6e\xf4\x53\x1a\x99\xdf\x74\x7f\x09\x9c\x56\x55\x01\x36\x1e\xa6\x9a\x1e\x06\xf8\x63\x63\x24\x0b\xdc\x64\x6a\xdb\x68\x44\xa2\xd1\x44\x3b\xe7\x9f\xc0\xbe\xad\xc4\x92\x46\xa1\xce\xec\x16\x3a\xbd\xb8\x72\x8c\x9f\x5a\x3f\x19\x92\x9e\xbf\x91\xf4\x8a\x96\x49\x78\x63\x1b\xf2\xfd\x9d\x45\x56\x45\xa9\x5f\x63\xa8\xdb\x45\x48\x9d\x48\x26\x22\x4e\x7f\x7e\x74\x81\x57\x10\x0a\x45\x85\x84\xed\x53\xd6\xd7\x83\x89\xf5\x2c\xd5\xf4\x89\xfe\x8a\x13\x4b\x72\x1b\xf9\x15\xe7\x90\xa3\xa8\x8d\x89\x4b\x16\xb5\x73\xa4\x13\x43\x72\x09\xde\x05\x53\x40\x6e\x46\x17\xa2\xfe\x2c\xb0\x28\x25\xd1\x53\x9d\xa9\xf3\x18\xa5\x0e\x98\x5a\x66\x88\x89\x84\xf6\xda\xf3\x35\xbe\x84\x7a\xb1\xa6\x24\x28\x52\xf3\x1b\xb1\x8b\xbd\xd9\xc5\x78\x56\xee\xf4\xfb\x99\xde\x4a\x07\x49\xcc\x32\xe2\x07\xda\x24\x0d\xa0\x3f\xd0\x98\xc6\x2d\x3c\x11\x93\xcf\x51\x1e\xac\xec\xce\x5d\xd8\x7c\x05\x94\x40\x3a\x05\x87\xde\x6e\x74\x69\xd1\x99\x65\x57\x2f\x50\x19\x2e\xd6\x96\x4a\x53\x5c\xca\xc3\x88\x20\x89\x6c\xf6\x6c\x5a\xc8\xc7\x23\xe7\xd4\xfb\x07\xe8\x31\x6f\xde\x65\x66\x96\x8e\x88\x4c\x77\xf4\xa7\x89\xaa\x31\xba\x0a\x54\x94\xff\x1f\x49\x67\xad\x24\xbd\x0e\x05\xe1\x07\x72\x20\x33\x84\x63\x98\x31\x33\x67\x66\x66\xf6\xd3\xdf\xda\xff\x46\x5b\x9b\xb8\x64\xa9\x75\xfa\x6b\xd5\x19\xcb\x14\x4f\x74\xe4\xce\xd1\xa8\x2f\xe3\x95\x23\x18\x3f\x4b\x6a\x2e\xef\xd4\x52\xbe\x96\x63\x3e\x98\x94\x81\xd7\xc0\xca\x03\x53\xd9\x03\x44\xd4\x8e\x3e\x9a\x7a\xb1\xc6\xb8\x90\xfb\x8a\xe3\x89\xfe\x7b\xf3\xad\x34\x7e\x04\xf1\x90\x0c\xa5\x2a\xeb\x4a\x21\xc3\x35\x59\xf2\x54\x53\x3d\x2e\x3c\x7e\x1f\x7b\x29\x82\x82\x68\x13\x09\xc6\x81\x77\xb5\x5e\x51\xd8\xe3\x1a\x38\x83\x4a\x63\x74\x77\x0c\x1c\xe2\xf7\x4b\xd3\x14\x45\x5d\x44\x06\xe5\x85\x79\x64\xca\xc4\x08\x13\x54\x6b\xc8\xc1\x20\xa9\x3e\x80\x78\x0b\x74\x31\xf7\x7d\x3f\x40\xf6\x54\x61\x1d\xe7\x81\xfc\xdf\x44\xfd\xe0\x55\x74\x17\xe4\xb3\x0f\x61\x7b\xa9\xe3\x3d\xca\x88\x3e\xc6\x47\x28\xf2\x76\x2d\x60\x85\xf9\xdd\x04\x77\x7e\xed\x5d\x9f\x74\xd1\x1c\xde\xa9\xcf\xa8\x86\x53\x3c\x32\x37\xa8\x72\xa7\x47\xa4\xf2\x23\x81\x27\xf9\x91\xb8\x33\x3d\x54\x7a\x7b\xc3\x52\xbe\x1d\x67\xff\x70\x88\xd2\x27\x7d\x92\x88\xb6\x50\xfd\x72\x8b\x69\x43\x06\xba\x9e\xa3\xb9\xe7\x79\x51\x33\xd2\x3a\xb9\x33\x0d\x81\x7c\x30\x5e\x0a\x27\x8b\xd5\xf9\x2b\x0d\x7f\x60\x40\x2d\xcf\x16\xf1\x5c\x32\xf1\x22\xfc\x74\x8e\x33\xfb\xdc\x82\x04\x0b\xfa\x4e\x0a\x07\xef\xaa\x4d\xdb\xe6\x00\x93\xb9\xb1\xfb\xc3\x4e\x9e\xd1\x5c\x69\x6a\x3d\x32\x10\xc1\xf7\x51\x61\x88\x2f\x53\x84\x7e\xe8\xc3\xb9\x58\x33\x60\x27\xc6\x0d\xfa\x34\x5e\xe9\xee\x5f\x65\xd6\xd9\x4a\x93\x93\xa0\x9f\x93\xa0\x27\x08\x04\x60\xb3\x33\x7b\xaf\x46\x25\x36\xae\xb1\x67\x79\xa0\xbe\x49\xc4\xc1\xbf\x7b\xbe\x10\x3f\x0e\x45\x9c\x1e\x22\xb8\x78\xf9\x98\x57\xf6\x70\xdd\x7e\x36\x52\x48\x30\x2e\xf0\x2c\x13\x43\xe7\x2f\x75\xe7\x0e\x2b\x0c\x8e\x20\x61\x72\x15\x20\xb7\x52\xeb\xaa\x22\x14\x44\x75\x6a\xdd\xed\x32\x03\xfc\x18\x4b\x18\xd9\xef\x58\xe7\x1f\x66\xbe\x1d\xc7\xbe\xb5\x22\xfe\xb1\x59\xa0\x48\x8e\x1b\x1d\xa8\x19\x2c\xee\x77\x22\x65\x5a\xb8\x2d\x41\xf2\xd5\x8b\x59\xfd\x30\xbc\x61\x26\xde\xde\xec\x08\x8d\x73\xe0\x4f\x31\xe5\xe3\x16\xed\x6a\x25\x40\xcf\xf5\x9d\x51\x4a\x5a\xe9\xef\x9f\x1f\xfd\x71\x54\x6f\x12\x67\x95\xd3\x10\x4d\x5f\x7e\x46\x92\x16\xb1\x52\x3b\x84\xbd\x25\xda\xfa\xab\x3e\x82\xc7\x49\x54\x17\x3f\x31\xa2\x54\x29\x29\x85\x4a\x67\xdb\x25\x8a\x5a\xdf\xb7\x69\xfb\xd7\xfe\x0d\x8d\x83\xa6\x1f\x15\xd6\xed\x5c\x6c\x98\x05\x29\x76\x30\xb4\xf1\x36\x6b\xa3\x8b\xa6\xe6\x42\xc6\x73\xb1\xad\x9e\x92\xe7\x59\x01\xc1\x7d\x8f\xe0\xcb\xd3\x0f\xf3\xdf\xe4\x21\x00\xdc\xef\x1d\xaa\xfd\x05\x3d\xb6\xd4\x34\x8b\x3c\xbc\xf1\x4e\xbc\x14\x85\x19\x55\x25\x6b\x27\xe7\xe2\xcc\x95\x95\xc0\x14\xbf\x26\xde\xe0\x57\x9c\x97\x65\x10\x3e\x84\x36\x36\xd4\xe1\xda\x13\x5c\x80\x02\x6c\xb9\x34\x50\xd7\xb6\x6d\x67\x09\xa5\x31\x86\x8a\xb0\x86\xec\xa1\xcf\x14\x4b\xef\x1c\xa1\xef\xbc\xfa\x63\x98\xe8\x61\x8a\xed\x4a\xec\x18\x66\xfb\x2f\xb1\xd5\xdd\xb6\x59\xcc\x03\xbe\xed\x8d\x92\x80\x71\x93\x7b\x3f\x13\xe0\x02\x06\x7d\xf7\x87\x10\xaa\x77\x40\x1a\x24\x35\xb1\x16\x80\x12\xa3\x98\x21\x34\x73\x02\x97\x85\x27\xcd\xb2\xfd\xd8\xb7\x87\x84\x02\x73\xa1\x82\x7e\x77\x69\x08\xa7\x28\xf2\x4e\x8f\x87\xc8\xd5\x73\xb3\x24\xf7\xa8\xbc\xef\x0d\xdd\x76\x80\x61\x58\x2f\x46\xc1\xb7\xfe\xdb\x63\xe4\xb2\x2e\x39\x43\x40\x05\x63\xfe\x5a\xcf\xd8\x38\x59\x3c\x3a\x16\x12\x0b\xb5\xcd\xa9\xda\x2b\x55\x1f\x42\xb2\xc1\x6f\x23\xd4\xa4\x03\xec\x04\x8e\xcf\xdc\x6b\x55\xab\xd2\x27\x60\x25\xc1\x4f\xd6\x03\x69\x28\xec\x27\x84\xd3\x8a\x2d\x9c\x4c\x1d\xf3\x96\xd5\x79\xd7\xb0\x49\x50\xdf\x88\x5b\xaf\x90\x6a\x5a\x2c\x27\x24\x4a\xae\xfe\x90\x55\x3e\xd5\x6a\xe5\x28\xec\x3a\xc7\x57\xfe\xf6\x29\x9c\xf1\x82\x96\x31\x3f\xed\x67\x6d\x81\x3a\x57\x68\xe9\x4e\x83\x4b\xaf\x3b\xaa\x52\xed\x19\x02\x86\x04\x06\x53\x30\xe6\xb1\xe3\x1f\x81\x86\xb4\x3c\x3c\x80\xf2\xff\xfc\x3d\x7f\xd0\xe8\x3f\x1c\x4e\xd0\xa7\x7e\x1e\x00\x43\x13\x12\xa2\xf4\x8d\xdc\xe4\x3d\x31\x85\x2b\x33\xc4\x6f\x4b\x8f\x17\x84\xa5\x3a\x9e\x71\x53\xf0\x50\x69\xf8\x9a\x2a\xb3\x12\x24\x91\x1b\x58\x11\xbf\x45\xb2\xae\x54\x3f\x60\xe7\x4d\x1c\x61\x4f\x68\x01\xd8\x61\x12\x49\x47\x6c\x7d\x74\x28\xcf\xce\xbb\x33\x6a\x2a\xdf\xb0\x55\x6e\x21\x9c\xa4\x28\x0a\x1b\xe7\x79\x3f\xef\xea\xd6\xf6\x9f\xe7\x3b\x70\x98\x05\xdd\x97\xad\x8a\xff\xfb\x45\xec\x09\x4e\xf4\x20\xdd\x50\xcd\x10\xf9\x69\x40\x2e\x07\x4d\x75\xaa\x40\xf6\x79\xbe\xe0\x96\xe0\x91\x3c\xf5\x4a\x93\x87\xa0\x1b\x3a\xc1\xde\x9e\x0c\x5a\x2e\xc9\xfb\xe2\xb7\x9d\x89\x27\x68\x1b\x22\x85\xe8\x5c\x33\x74\xfd\x21\xe9\x72\xfe\x06\x0b\x1d\xe0\x37\x11\x33\x90\x06\xbb\x2e\x44\x95\xfb\x43\xab\x27\xb3\x65\x86\xc8\x56\xf8\xe6\xc8\x27\x46\x3d\x8d\xfb\xcc\xe1\x6a\x7e\x69\x70\x97\x21\xb6\x12\xd8\xcd\xd0\x9d\xfc\xed\xf5\x2b\xb2\xb9\x8f\x1d\xac\x7d\xf3\xaf\xcf\x35\xa5\x56\x82\x98\x41\x06\x72\x53\x53\x94\xce\xe3\xa6\x10\xa2\x8f\x0c\xa8\xa0\xbf\x32\x2f\x39\x84\x2b\xb3\x10\x90\xee\x28\x91\xd3\x87\xd8\x86\xef\x0c\x37\x67\xcf\x4c\xce\xfc\xee\x9d\xa2\xfa\x5a\x23\xe8\xc0\x48\xf1\x9d\x96\xa4\x70\xb6\xc3\xce\xba\x6d\x7b\x92\x42\x87\xed\xe6\x46\x97\x3e\x7d\x5b\x27\x16\x14\xc4\x38\x06\xbb\xb9\x13\x0e\xf7\xe5\x8a\x99\xbf\xa1\x29\x43\x3e\x45\x68\x14\xd7\xfb\x05\xe0\x7c\x57\x62\x03\x2e\x19\x3a\x91\x45\x8f\x21\xbc\xab\xcf\x49\x31\x44\xb2\x81\x03\xb3\x9a\x2f\x67\x40\xb8\x04\x67\x50\x61\x42\xbc\x6b\x6f\x18\x73\xba\xb0\xf3\x5b\xc5\xd0\x0c\x91\xf7\xc5\x28\xca\x3c\x01\xb4\x67\x8c\x09\xce\x78\x95\xf6\xf1\x2e\x49\xb9\xa3\x7c\x5e\xb9\x5a\x4e\x26\x36\x14\x14\x67\x9e\x63\x1b\x25\x04\xc5\x8b\xec\x69\xb0\x33\x04\x4d\x13\x28\x86\x11\xf8\x9d\x41\xd1\xbe\x33\x70\x62\xdd\xbf\x32\x67\x08\x12\x22\xe9\xf3\x7c\x5f\x18\xc6\x7e\xb5\x67\xd4\x66\x09\xea\xd6\x82\x4d\xbe\xba\x68\xa6\x36\xab\xf1\x9d\x04\x9e\xa5\xed\x3c\x18\xcf\x1c\x88\x9d\x8c\xee\xc1\xb7\xb9\x13\x65\x60\xc1\x68\xfc\x28\xc2\xa6\x0f\x00\xbd\xa0\xbc\xee\x57\xd2\xbe\x74\x61\x9a\x6d\x30\xa0\x60\x47\x55\x9c\x59\x83\xfd\xc7\x23\x48\x1a\x30\xc7\xba\x52\xef\xc3\xf4\xfb\x19\xba\xf9\x89\x6d\x28\x86\xfd\x9e\x17\x7d\x05\xb1\x5e\xc8\x67\x3b\x95\x1a\xba\x19\x09\xd4\x3e\x80\xd7\x2f\x00\x00\xa7\xd2\xf5\x64\x18\x8c\xc1\xb3\x4c\x15\x1a\x5f\x4d\x77\x88\x3a\xa8\xa9\x3c\x4a\x88\xff\x54\x96\x1e\x1b\xef\x94\xdd\x14\x46\xbd\xed\x2e\xb6\xf7\x4d\xe0\x16\x7d\xce\xe3\x49\x31\x12\x69\xb4\x55\x79\x1c\x17\x28\x97\x8f\xf0\xfb\x5e\xd7\xef\xcf\x9b\xe8\x82\x36\x41\x8f\xa4\xde\x63\x92\xf7\xd8\xdd\x67\x1d\x21\x7b\x2c\x37\x4c\x39\x76\x8e\xa2\x91\xaa\x26\xdd\x95\x23\x71\x03\xdf\x39\x52\xd4\x78\xc6\x2d\x49\x75\x63\x93\xb6\xbc\xa2\xf1\x4f\x5b\x07\xfb\x2c\x67\x31\xc0\x3c\x6b\xd0\x03\xdc\x54\x99\x52\x56\x55\x0a\x83\x5e\x8c\x29\x0a\x06\x41\x74\x86\x21\x1d\x98\x30\xf8\x23\x76\xe0\xfa\x02\xf9\x71\x8f\x0c\xf3\xa6\xd8\x4e\x1a\x9e\xe6\xce\xdb\x0d\x53\xe0\x0c\x8f\x13\xa4\x07\xea\x98\xfd\x98\x3c\xfb\x1a\x62\x1d\x1e\x65\xa3\x1b\x53\xf4\x25\x69\x66\x2f\xd1\x91\x90\x6b\xa3\xdb\xa7\x90\xf4\x1d\x9e\xc2\x14\x39\xc8\xda\x0a\x50\x04\x27\xfd\xf5\xa0\xa0\xad\x32\x6c\x9d\xfb\x07\x67\x00\xa4\x68\x65\x79\xd2\xe2\xf0\x02\x22\x36\x6a\x70\xfc\x71\xf0\x9c\x97\x45\x33\xfc\x12\x24\x84\x68\xfa\x07\x30\x0c\x1b\x45\xcf\x82\xb2\xcc\xce\x4d\x8d\x7c\x56\xb5\xc9\x8d\x44\xcf\xb5\xa0\x30\x8e\x5f\xa8\xf7\x0f\x92\x37\xe7\x6c\x0f\x85\xfb\x9e\xe1\x79\x42\xc5\x98\x9b\xe0\x85\x78\x2a\x66\xa0\x61\x08\x64\x2d\xa7\xa0\xf0\x81\x18\x86\xa1\x52\xfa\x47\x43\x19\x0d\x18\xe4\x4e\x93\x67\x1b\x2e\x84\xcb\x0c\x51\x6c\xce\xf1\x3c\xde\x22\xed\x0a\xc1\x0e\x7d\x26\xe3\x19\x06\x01\x8c\x51\xdb\x4e\x81\xf8\x0a\x6b\x93\xb4\x49\x51\xdb\xdb\x11\xd8\x70\x9e\xd8\x0a\x83\x12\x6a\xeb\xfd\x4b\xbc\xa2\x75\xfd\x28\xea\xc4\x62\x50\xff\x78\x97\xc7\x09\x50\xa7\x29\x85\x13\x14\x31\xaf\x21\xd6\x1e\x90\x67\x75\x7f\xf9\x99\x64\xa3\xb6\xcd\xdf\xf9\x8b\xa2\xf3\xde\x71\x17\xcb\x89\x1c\x83\x71\x0e\xce\xb3\x40\x96\xa4\xf1\x0e\x7a\xd1\x95\x7a\xfb\x7e\xaf\x06\xb9\x5f\xe8\xa6\x67\x9c\xbc\x3f\xe8\x28\x50\xbf\xaf\x35\x43\x27\x00\xa5\x88\x3d\x57\x62\x92\xdc\x4c\x50\xf4\x9b\xf4\xee\xfc\x72\x79\xb7\x70\xf7\x54\x88\xc5\x01\x31\x6c\xd6\xde\xc6\xf0\xc6\xc7\x69\x86\xc3\x70\x43\x38\x85\x91\xb2\x4c\xe7\x14\x55\x9e\xf4\x1f\xb9\x40\x39\x16\x86\x63\x87\xd4\xc7\xee\x6e\xcf\x06\xc4\x8a\x14\x7d\xec\x81\x4b\x5d\xa4\x59\x87\xa6\x19\xec\xe1\x1f\x3c\x20\xcc\xf9\x73\xf2\x37\x45\x13\x8e\x01\x8e\xbf\x67\xfd\xd5\xcc\xf1\x35\xd8\xb7\xa0\x30\x07\x82\x68\xf3\x88\x46\xe8\xf4\x4f\x8a\x70\x7c\x3f\xf8\x0e\x5c\xce\xd9\x70\x29\xfe\xed\xd9\x26\x6d\x59\x34\xce\x33\x69\xc0\x15\x83\x98\xff\x38\x7b\x19\x96\xfd\x8b\xfd\x58\xd7\x63\xfe\x38\x7a\xbb\x78\x57\xfd\x7c\x11\x86\xa6\x63\x83\x2a\xc7\x17\x73\x31\x32\x51\x67\xa0\x70\x99\x7c\x87\x5a\xd8\xc8\xd6\x39\xbc\x21\xd8\x7b\xbf\xa0\x0e\x6a\xbb\x35\x2b\xb2\xf9\x4f\x54\x82\xcc\x3b\x85\x24\x2c\x46\xd4\x01\xc5\x61\x85\xe6\xcc\x98\xc6\x7a\xc2\xfd\x0b\x00\x14\x6d\x7c\x88\xb2\x93\x74\xa6\x07\x5a\x1a\xe6\x09\x60\xa6\x2c\x4b\xc0\x53\x0c\xa0\xb3\xb6\xbe\xee\x5a\xac\x24\x01\x6a\x19\x82\x20\x21\x84\x40\x90\x97\x7a\xb6\x1d\xb8\x41\x93\xdc\xfb\xe6\xa7\x38\x79\xae\x73\x07\x27\x9e\x9f\x06\x9e\xe4\x46\x33\x5a\xce\x2d\xa7\xfe\xad\x8d\xfe\x55\xd3\xd9\x7f\xdc\xcd\x9c\x5e\x66\xac\x19\x4a\x36\xba\x89\xd8\x37\xa6\xb1\xcf\x76\x14\x32\x06\x88\x0b\x92\x96\x45\x6e\xea\xe7\x88\x2d\xcb\x96\x08\x6c\xf7\xcc\x37\x2b\x7c\x71\x4a\x17\x45\x53\x14\x60\x33\x4a\x77\x94\x2a\xcb\x2c\x3f\xf7\x16\x50\x8f\x8f\x78\x23\xdc\xdc\xe5\x8d\x89\xd9\x8f\x84\x40\xb9\x15\xfb\x7e\x61\x18\x87\x4e\x41\x99\x13\x5b\xa0\x02\x68\x3e\xf6\xb3\x30\xd2\x79\x26\x8e\x64\x68\xf9\xb0\x26\xd5\xc5\xd6\xbd\xb3\x3c\x29\x89\x81\x48\x3c\x83\xf2\x71\xbc\xb0\x67\x53\x01\xa0\x0a\x70\x13\xdc\x07\x6f\xc7\xb3\x9f\xe3\xcc\xa6\x3c\x3b\x3a\x43\xc5\x3f\x3e\xe8\x43\x34\x68\x34\x32\x9f\x7c\x5c\x99\xea\xe3\x0d\x4a\x61\x29\x20\xea\xba\xef\xdc\x7d\x93\xff\xf3\x92\x89\x99\x18\x1f\xf2\x18\x19\xd5\x65\xd0\xb2\xb7\x24\xb1\x3a\x81\x83\xd2\xfb\xd2\x50\x02\x00\x09\x30\xcf\xc8\x31\xe9\x07\x31\x50\x12\xc3\xc6\x16\x4b\x56\xa0\xb7\xf8\x7d\x9c\xe7\x43\xda\xa3\xdb\x43\x94\xde\x36\x00\x7b\x24\x2b\x1a\xd1\x77\xdf\xcf\x19\x1a\xc8\x36\x33\x44\xbe\x01\x80\xe4\x0c\x4d\x12\x58\x80\x87\x2c\x9e\x64\xa1\x53\x97\xe6\x70\x82\xd7\x71\x6e\x38\x17\xa3\x1e\x3a\x8e\x14\x2d\x44\x10\x96\xa0\x92\x13\x26\x51\xfb\x1a\x1a\x59\x51\x5c\xa6\xc9\xb5\x55\x18\x7e\xac\xc5\x9e\xda\x18\xc3\x37\xbe\x01\xd0\xe7\x4e\x2c\x87\x93\x08\x06\x72\x6b\xd4\xc8\x8f\x28\x37\x66\xe7\x53\xdf\xa7\x49\x2f\x73\xb0\xa6\x7d\x0d\x83\x02\x2a\xcb\x4b\x08\xeb\x26\x95\x9e\xc3\x5b\x6d\xe5\xcd\x87\x01\x36\x28\x1d\x80\xe9\x06\x34\xad\x88\x94\xf8\xb6\x28\xe2\x97\x33\xf4\x2c\xcb\x42\xee\x00\x32\xe1\xf2\x34\x47\xf2\x47\x9b\x38\xa1\x2d\x3f\xd8\x45\x48\xc6\x68\xcc\xf2\xe4\xf9\xfb\x66\x18\x5e\x85\x82\x08\xe3\xbb\x47\x16\xa9\x12\x4b\xcb\x33\x2c\x4b\x0f\x41\x7c\xac\x64\xc0\xe9\x53\xe7\x4d\xee\xe1\x0d\x3a\x0f\xa5\xf2\x73\x25\x8f\xd5\x22\xeb\xef\x8e\xd9\xf3\x6f\x74\x87\xd6\x88\x61\xa3\x81\xa2\x7c\xfa\x49\x3f\xe6\x25\xd0\xa0\xd0\xdb\x08\x8d\xb8\x62\x94\x48\xe0\x41\x80\xb9\xdf\x9d\x61\x1e\x12\xa7\x76\xf4\xfe\xe9\x1b\xed\x8a\x38\x18\x80\x09\xb0\x99\xe9\xf7\xc3\x4c\x59\x60\x92\xaa\x5d\x33\xe0\xaf\x0c\x50\xe2\xf3\x31\x4a\xe7\x85\x5e\x3c\x73\x02\x9f\x07\x44\xbd\x9f\x71\x7f\xc8\xb3\x68\x36\x86\x41\x31\x0c\x43\x98\xf7\x8b\x00\x1a\x87\x31\x4f\x9b\xb4\x49\x05\xa6\x09\x00\xdd\xf6\xfb\x59\x40\x54\x1c\xc3\x50\x69\xce\x68\x16\x93\xf7\xde\x36\x67\x5d\x28\x8b\x6c\xf4\x55\x1f\x2d\x4c\x05\xe7\x09\xe5\x88\xbc\x9e\xed\xe9\x22\x25\x48\x93\x3a\x53\xf6\x3d\x0a\xbe\x22\x23\xa9\xf5\x55\x7c\x9b\x97\x03\xd5\xd4\xdf\x3e\x85\xb9\x8d\xa8\x81\xd4\x6e\x1e\xd7\x60\x10\xad\xe9\x5f\xee\x4e\x20\x9a\x49\xd3\xc0\x94\x9a\x63\x2c\xcb\xd2\xce\xd9\x46\xf8\xaa\x0e\xbd\xb9\xed\x0b\x20\xfc\x06\x79\x5e\x72\xaa\xab\xb6\x56\x07\x19\xb8\x8f\x30\x04\x91\x93\x14\x85\xf6\x6b\x72\x9f\x0a\xfe\x6a\xb4\xc9\x50\x05\x76\x92\xd4\x4c\x00\x68\x7c\x0f\x30\xdc\x43\x3b\xc0\x32\x95\x1f\x10\x04\xf2\x38\x1d\x31\x70\x1c\x2e\x89\x84\x7c\xbe\x63\xac\xcd\x07\x31\x0d\xb1\xc2\x37\x3a\x51\x3c\xaf\x9a\xe7\x00\xe5\x89\x22\x51\x9d\xa0\xcd\x7d\xff\x4d\xbd\xea\x3f\xb0\xa3\x39\x7b\x9d\x99\xf5\x6c\xfb\x91\x35\x13\x90\x32\x47\xdb\x11\x52\xec\x35\xad\x5f\x07\x92\xc0\xf9\x73\x50\xf2\x58\x97\x91\x79\x11\x9c\xa1\x21\xc6\xb6\x0e\x71\x7a\xd0\x3c\xdb\x02\xff\x9b\xce\x2f\x04\x30\x9e\x3c\x5e\x47\x52\xf1\x52\x25\xeb\xfe\x47\xa9\xd6\x71\x06\xab\x77\x50\xb6\xa8\x8b\xf6\x95\x1b\x91\xa5\xc2\x70\x9e\x26\xd0\xde\x9c\xe5\x18\x62\x2d\xc6\x3c\x7f\x4c\x17\xf3\xd4\x49\x97\x0b\x0e\x8f\xd7\xe9\x67\xf5\x66\xef\x82\x61\x05\x5f\x6e\x97\xaf\xd6\x45\xa7\x7b\x71\x9c\xa6\xa6\x2f\x37\x41\x8c\xad\xf8\x66\xdf\xe7\xe7\x09\x96\xcd\x82\xc0\x91\x28\xd4\x6d\x37\x44\x8e\x2a\x41\x3e\xb1\x19\x54\x1c\x1b\x03\x93\x01\xb2\xaa\x32\x08\x7d\xe1\x58\x4a\x87\xdd\x32\xfe\xe5\x1f\x26\xa9\x1e\x73\xbb\x32\xfb\xc5\x88\x63\x3f\x31\x95\xbd\xe0\x74\x41\x86\x38\x49\x50\x4a\xa7\x18\x08\xc5\xb0\x36\xf1\xfc\x20\x88\x47\x96\x29\xe9\x5c\x7c\x7e\x77\x74\x04\x27\x65\x67\xcd\xed\x0a\x47\x99\x72\x19\x13\xaa\x5f\xf2\xf9\xf3\x97\x96\x88\x76\x92\x42\x5e\x8a\xa0\x72\xbc\x7b\xe3\x30\xdd\xec\x28\xfc\xc9\xc3\x9d\x0f\x41\x99\x2c\x0b\xc9\x18\xd7\x40\x99\x03\x3f\xba\xe9\x5a\xa8\xc5\x7d\x7f\xda\x36\xd0\x45\x9e\x41\x29\x71\xc7\xca\xb3\x24\x00\xc8\x33\x61\x21\x84\xb7\x7a\x38\x49\xb9\x93\xa3\x58\x7e\x75\x74\x34\x2d\x7d\xc7\xe9\x01\x15\xa7\xd5\x72\x1f\x9d\x36\x3c\x04\xb0\x80\xe6\xa1\xcf\x5b\x0d\x23\x11\x86\x38\xdc\x3f\x7a\x87\x6a\x70\xfe\x98\xb0\xe5\x48\xfb\xa8\x7e\x9b\x79\x3f\x0e\x51\x6c\xeb\x09\x93\x4b\x68\xe6\xe5\xa7\x3b\x90\x3a\x98\x82\x8b\xb2\xd0\x0b\x7f\xd8\x09\xc1\x6f\x3f\x14\x12\x72\x9a\xf1\x79\xee\x9b\xaf\xf1\x51\x59\xfe\x7e\x2a\xae\x74\x04\xff\x93\xf8\x52\xc5\x71\x52\x24\xd5\x80\x1a\x50\x05\x0f\x83\x09\x00\x7c\x3e\x52\xd9\x17\xac\xe5\x41\xf7\x33\xf9\xe3\x36\x9c\x30\x7e\xa5\x0c\xa1\x4a\x47\x3f\x68\x46\xe7\x23\xa7\x29\x17\xa5\x37\x10\x0e\x45\x69\x3a\xbe\x48\xef\x97\x74\x39\x32\xbf\x73\xe3\x03\x98\x2c\xff\x71\x46\xf3\x02\x9a\xfe\x5e\x65\x38\x0f\xd3\x55\x04\x24\x41\xe6\x98\x09\x4c\x18\x26\xd0\x7c\x8c\xdb\x15\x3f\xd6\x8d\x12\x5f\x74\xc8\x01\x43\x08\x39\x86\xe4\xae\x27\x7c\xec\x1b\x92\x3f\xb8\x18\x0f\x86\xc8\x0f\x1c\x2a\xad\x84\xc6\x9c\x2b\x56\xbe\x72\xfc\xef\x0c\x43\xdc\x50\x2b\xe1\x25\xab\xa7\xdc\xfe\xe7\x1d\x9f\xd3\x47\x99\x33\xd5\x51\x2c\xab\xb9\xae\x2e\x93\xaf\x45\xaa\x7e\x18\x9e\x58\x31\xe6\xcc\x77\xa4\xb2\x28\x17\x6d\xd8\x34\x4f\x8d\xba\x49\x1a\x5c\x82\xa7\x39\x96\x34\xad\x53\x62\xc6\xb4\xd8\x74\x37\xf2\x9c\x65\x4d\x68\xfd\xc2\x6b\xce\xe7\x4a\x3a\x68\xf0\x71\x6a\x14\x53\x66\xa8\x3e\x0e\x24\x88\x1b\xe3\x52\x34\x2e\xe8\x26\x80\x98\xd3\xc3\x02\x0e\xbb\xe9\xee\x24\x1f\x23\xce\x7d\xd4\x7e\x4b\xe2\x3a\xf7\xa7\x6a\x38\x58\xd9\xfa\xfc\x6a\x14\x4b\x9b\x28\x2b\xc2\x62\x99\x15\xe8\xa9\x80\x9b\x34\xf8\x6e\x14\xe2\xd4\x86\xbc\x2c\x98\xd7\xed\x88\x04\x42\xc1\xbc\x43\x7e\xe9\xcd\x07\xa9\xe7\xc0\xab\xc5\xe2\x18\x42\xd5\xcd\xcb\xb2\xe2\xbc\x93\x0e\xf6\xcd\x9a\x42\x7f\x2a\x65\xf2\xf4\x68\x1a\x9c\x0d\xcf\x30\x50\x49\xdb\x81\x69\x44\x14\x05\x4a\xed\xfc\xf7\x3e\x57\x34\xc7\x84\xc3\x42\xa5\x60\x62\xe3\x09\xfa\x79\x3f\xb0\x75\x1f\x79\x28\x26\xf1\xe3\x2d\x4f\x00\xd0\x00\xfd\x93\xf8\x0e\x04\xf2\x8c\x13\xe7\x63\x25\x62\x42\x09\x7e\x73\xaf\xdf\xe7\x9e\x96\x62\xb4\x69\x4b\x7f\x3b\xe6\x8a\x69\x62\x42\x68\x34\xbd\x5f\xb6\x09\x8f\x3e\xd8\xc2\xea\x9e\x27\x57\x10\x5d\x06\xa5\x34\x2a\x4d\x47\xd0\x32\x79\x71\x7f\x79\xa1\x30\xa8\xf8\x3c\xa1\x60\x18\x48\xdf\xb2\x1e\xf3\x8b\x01\x8d\x0e\xbb\xe7\xb7\xa1\x53\x19\x1c\x03\x63\x8b\xb4\x7a\xc3\x1f\xed\x36\xf4\xd9\xa5\xb4\xb8\x0f\x70\x8a\x97\xb9\x29\x84\x53\x8a\xd9\x11\xf4\x21\xb1\xd4\x3c\x61\x78\x4f\x8f\xbb\xec\xe8\x0d\x23\xa0\xb2\xf0\x72\x08\xed\x36\x9b\xe5\x04\x97\xcc\x77\xac\x86\x21\xd8\xbf\xad\x8e\x7e\x7f\x94\xac\xf9\x62\x6b\xcb\xab\x87\x0b\x85\x37\x5b\x0d\x61\x52\x95\x0e\x9f\xc9\x8e\x01\xd9\x34\x45\xd2\xfb\x9a\x5d\x40\x41\x15\x73\x3f\x7e\x68\x96\xe1\xba\x90\x47\x4c\x00\x02\x73\x61\x70\xa6\xc7\x3d\x59\xe2\xab\x06\xc9\x1e\x48\x11\xd0\x8d\x33\x58\xd7\x73\x86\xea\xed\x59\x49\x5e\x91\x78\x22\xd9\x8f\x17\x1a\x19\x6c\xa4\x09\x8c\xa9\x9e\xa5\xa5\x0f\x7d\x4f\x03\x0c\xc3\xc2\xf3\x1c\x01\x85\xdf\xf0\xa7\xaa\xd4\xa1\x48\x78\x98\x31\x4b\x40\xdf\x2f\x23\xac\x72\x18\x57\x8b\x11\x35\x3f\x40\xcd\x81\x52\xe4\x63\x44\x8e\xb1\x31\xba\xc2\x98\xbc\xf3\xa9\x13\xd3\x3e\xbe\x77\x7c\x57\x7f\xd9\x9c\xaf\xe3\xd6\x0e\x54\xf8\x0c\x0f\x14\x02\xf4\x8b\x15\xc0\xc7\xe1\x5b\x98\x4c\x11\x07\x63\x2f\x51\x0c\x4e\x6e\x63\xc9\x9b\xce\x3c\x5e\x88\xd4\x6d\xb6\x66\x70\xdb\xdc\xcb\x5b\xcb\x45\xaf\x71\x7d\x4c\xa1\xa6\x44\xfe\xf3\x1b\xc7\xbf\xcc\x9b\x19\x20\x67\x5e\x0b\xd3\xc9\x9c\x76\x99\x74\x8f\xd2\x45\x2c\x82\x90\x0e\xd0\x33\x52\xad\x12\x1a\x1e\xa5\xb3\x85\x49\x63\xc5\x59\x30\x68\x8a\x7a\x3c\x59\xd3\x84\x71\x9e\xbb\x44\xdd\x9d\xa1\xf5\x8f\x26\x2f\x5e\xb1\x2d\x34\x29\x34\x7e\x06\x94\x96\x4f\x56\x14\xcd\x49\x3c\x24\x0c\xef\xb7\x61\x9e\xd9\x59\x07\x6e\x7b\x8a\xa5\x39\xee\xfb\x79\x06\x58\x8e\xae\x41\x94\xb5\x5f\x83\x57\x1e\xdc\x98\x8b\xa0\x9f\x13\x51\xc4\xde\xa9\xc9\xb2\x32\x45\x81\x79\xac\x9e\x51\x60\xe9\x09\xce\x9f\x49\xb5\xeb\xea\xe7\x45\xdc\xdd\xa0\x84\xf2\x7e\xdc\x19\x84\x7e\x48\x32\x3f\x5e\x3e\x84\x11\x2b\x6c\x8e\x9f\x44\x98\x06\x53\xa0\xfb\x9a\xc0\x61\x16\x89\x12\x99\xc1\x91\xbb\xc3\xdb\x68\xd9\xac\xfa\x6d\x00\x7b\xcb\x9f\xaa\xa5\xf3\x17\xa3\x30\xec\x3c\x9d\xf0\xc4\x6d\x4e\xf2\x6c\xde\x66\xa1\x33\x3c\xb1\xdc\x80\x70\xba\x28\xe5\x2e\x5f\x09\xba\x62\x7e\x92\x11\xb2\x41\x31\x62\xcb\x8a\xc8\xa6\xbb\x0c\x87\xae\x84\x2e\x49\xf1\xfc\xe7\x37\x08\x04\xe8\xc7\xf2\x3c\x61\x11\x01\x74\x05\xdb\x8f\xe6\x23\x10\xbd\x99\xfa\x45\x56\xe1\x16\xe0\x26\x0d\x4d\x4f\x51\x00\x5d\xe0\x00\x67\x4e\x16\x6e\x2d\x74\x90\x96\xbd\x57\x71\x2f\xab\xcb\x86\x27\xae\xfd\xe4\x90\xf1\xe3\x1a\x3f\x0c\x7f\x88\x13\x3e\xa4\x1a\xa2\x21\x74\x8c\x8a\xc8\x20\x18\xdb\x8f\xf1\x4c\xd3\x4d\x1f\x11\xd2\x82\x41\xf3\x3e\xc1\x8b\xce\x65\x6a\x2c\x0f\x3d\x86\x2e\x9b\xb3\x04\xa7\xe7\x11\x7d\xc2\xbf\xcb\x8d\x61\xed\x9d\x86\xba\xa5\xbc\x44\x52\x9e\x9a\xae\x93\x29\x3d\x2c\x99\x67\x9c\xa9\xff\x07\x4c\xb4\x90\xed\xaa\x83\x30\xd4\x06\x09\x40\xac\x70\x51\xa4\xe6\x17\x63\x08\x5c\xa5\x28\xf4\xb1\x2f\xdc\xe5\x05\x30\x0a\x6b\xd2\xa2\x56\xaa\x26\x70\xb4\x0c\x52\x80\xea\x31\x73\xcc\xeb\xda\x8d\x8f\x43\x54\x70\xe1\xcb\xb6\x17\xff\xa4\x1f\xf2\xbe\x74\x56\xe0\xab\x60\x2f\xcc\x01\xd2\xfc\xd9\x8d\xa4\x89\xb5\xd4\xc3\x74\x86\x02\xd4\x69\x61\x2b\x82\x96\x75\xf2\xd0\x87\x92\x45\x82\xa1\x1c\x0d\xbe\xdb\xe2\xbc\x58\xde\x13\xe1\xec\xd7\x76\x06\xd4\x5b\x65\x7c\x50\x34\x79\x70\xce\x88\xe7\x71\x5a\xd2\xcc\xd5\x6f\xa0\xf0\x2b\x53\x4c\x91\x8a\xdb\x96\x06\x52\x10\x32\xfa\x88\x19\xc0\x88\x11\x3b\xb4\x0f\xd8\xa6\x2d\xc9\x47\xf1\x89\x50\x82\x06\x29\x9d\xc3\x3f\xe8\xa4\xc6\x2d\x8d\xe8\xb5\xb8\x95\x92\xd1\xec\x8c\x86\x19\x61\xea\xb3\x9f\x23\xeb\xcc\xe9\x5a\x3b\x6e\xef\x10\x8b\x86\x51\x38\x32\x73\xd4\x30\x11\x10\x4d\x79\x3b\xf2\x01\xa5\x40\x21\x84\x71\x3e\x13\xe5\x8f\xa6\xc2\x89\xd2\x4b\x25\xf7\xfe\x12\xad\xb0\x6c\x3e\xf1\x9d\x16\x24\x39\x8e\xc3\x0c\x50\x9c\x60\x72\xeb\x7d\x33\xb1\x2d\x5d\x7c\xbd\x02\x88\xdf\x4c\x96\x32\xa5\x0b\x00\x20\x0f\xe3\x08\x51\x0b\xb9\xad\x8f\xa7\xbb\x3e\x92\x63\x0c\x4e\x40\xf0\xb8\x0e\x8a\x69\x60\x2f\xfe\xc7\xda\x65\x09\x28\x95\xf8\x77\x5e\x78\x0b\x52\xd9\xb1\x52\x64\xa5\x82\x51\xf8\x1b\x9a\xfe\xed\x63\x78\x5c\x5f\x7d\x10\x0f\xe1\x94\x0e\x6a\x21\x91\xf1\xa5\xb5\x24\x11\x73\xee\xfd\xe3\x3b\x8a\xa2\x70\x71\x2f\x04\xe7\x39\xca\xd7\x2c\xa9\x29\x02\x00\xbb\x5f\x70\x9b\x32\xe3\xab\xd8\xab\xf4\x4a\x17\x81\x54\x17\xe3\x63\xf1\x7a\x03\xf0\x87\x29\xb6\x41\x9c\x7e\x03\xd3\x19\xbd\xa5\xff\xb5\x37\x99\x87\xe7\x46\x17\xa5\xd4\xf5\xbc\xc1\x51\xba\x9b\x63\x21\x66\xba\x18\x45\xa2\x11\x9e\x7b\xfb\x71\x5b\x1f\x40\x3c\x4c\xe6\x81\x83\xaf\x4e\x6a\x90\x72\xa6\xb8\x5b\x80\xe4\x70\x52\x92\x19\x76\x86\x00\x2d\xcf\xd5\x30\x9a\x67\xdd\x40\xb9\x14\x22\x55\x11\xac\xd3\xf9\x5f\x5b\xf0\x59\x9e\xbb\x37\xd6\x15\x3e\x4a\x78\x86\xc1\x68\xe8\x7b\x7a\x50\x7d\x2a\xcf\x77\x41\x7d\x6e\xe1\xe3\xd9\x2c\xcb\x5a\xd5\x97\x1d\x2a\xe1\xdf\x07\xb2\xda\x97\x09\x42\xbb\xac\x5f\xed\x61\x34\xa8\x64\x4e\x33\x8d\x43\x3b\x02\x39\x44\x8d\xe3\xda\xdf\xd4\x39\x14\x30\xe3\x9c\x1b\x5c\x0b\x98\x08\xb3\xc8\xce\xc5\x3e\x5d\xd0\xa0\x6c\xdb\xf8\x79\x3e\xdd\x5b\xc1\xbf\x09\xe3\xf1\xa0\x5e\x92\xb9\x8a\x7e\x54\x70\x6d\x69\x72\xef\xad\xf5\x68\xe3\x4b\xe9\x2d\x66\xbd\x10\xf3\x8d\x0e\x65\x27\xae\x67\xe2\x93\x6e\x12\xc2\xa3\x41\x43\x5f\x0f\x44\xd4\x1e\xcf\xe3\x24\x9d\xcb\xb6\xfc\x9b\xbc\x4d\xb9\x9c\xde\x7a\x9b\x0a\x85\x03\xf9\xe3\x4b\xf1\x13\x1b\x54\xc5\x13\xcd\xb2\x9b\xd9\xb4\xaf\x89\xeb\xf4\xce\x46\x19\xd8\xd9\x40\xa6\x38\xbe\x04\x26\x3e\xe6\xf3\x85\x08\xcd\x10\x73\x4e\xa0\xa8\xfe\x85\xa8\x34\x5c\xf4\x1f\x96\x32\x08\xa7\x50\xd4\x05\x4e\x8c\x22\x7d\x63\x44\x0e\x46\x71\x0e\x8c\x2e\xbe\x73\x32\xac\xd0\x89\x91\x86\x18\x88\xa4\x24\x89\xb4\x9b\x43\xd1\x96\x2a\x9b\xe2\x78\xd4\xb0\x6a\xd0\xc7\xb2\x34\xff\xcb\x5a\x1f\x36\xd1\x9a\xe9\xfd\xd0\x8f\xc4\x7e\xa4\x6f\xf3\x16\x67\x30\xf0\xf6\x71\x6b\xf1\xdd\x19\xa2\x48\x43\xa6\x33\x7b\x50\xb0\xd8\x0b\x9b\x32\x28\xa5\x3c\xdb\x8c\x93\x2a\xc4\x3e\x50\x88\x52\xbb\x2e\x92\x35\xc3\x5b\x9e\xc0\xe6\x9b\x22\xbc\x06\x9f\x2c\x77\xc1\x5f\x09\x1f\xc4\x4c\xea\xc1\xa3\x0c\xe7\x9a\xdd\xd6\x74\x95\x9a\x2c\x71\x12\xa7\x15\x3b\x5e\x2f\x13\xe6\x8d\x2f\x05\x1d\xc3\x54\x34\x7f\xe5\x12\x18\x1f\x13\x9f\xa2\x0a\x4d\xee\x1c\xf3\x6f\xf7\x4f\xde\x1d\x30\x94\x41\xae\xb0\xb6\xbb\x1b\x24\xe3\x73\x8c\x21\x14\xe9\x83\x9d\xd8\x4b\x6c\x4c\x02\x91\x9b\x09\xd2\x03\x1b\x43\x02\xdf\x02\x6d\x87\xc6\xa8\xf3\x18\x4d\x63\x2b\xed\x1b\xf8\x7d\xe8\xc3\xb9\xf6\x9a\x6e\xdf\xa0\xdb\x9a\xc0\x5b\xfb\xb9\x74\x44\x0f\xfd\x80\xbb\x06\xcb\xfe\x8c\x2d\x01\x45\x5a\x18\x26\xfd\x4b\x7d\xfb\x1b\xe2\xcf\xc2\x1e\x34\x38\x3c\x39\xa8\x15\xd7\xd6\x2e\x34\x6e\x6c\x4f\x12\x4a\x45\xfc\x9c\x75\x02\xbf\x5f\x06\x19\x4d\xaf\x1e\xfc\xde\x75\x15\x71\x35\x82\xf4\xbb\xa1\x49\xa4\xff\xa0\x60\x27\x94\xd0\x0e\xf4\x3d\x1a\x88\xbd\xe5\xca\x11\x78\x08\x92\x9f\x61\x8a\x0c\xeb\xf0\x12\x28\xaf\xb6\x01\x83\x0f\x80\x40\x9f\x44\xfd\x86\xf0\x8e\x28\xf1\x55\x9e\x58\xf8\x12\x93\xfb\xc9\xc2\x81\x38\xc2\xda\x12\x0a\x6b\xd5\xf2\x9f\xf5\xfa\x5e\x67\xca\xc3\x6b\x76\xb3\xe2\x8c\x18\xc5\x58\x9a\x57\xca\x46\x02\x9d\x6a\xef\xe0\x97\x45\xfa\x72\x1c\xb8\x7d\x8b\x9e\xd6\xab\xa5\xdf\xa9\x76\x6c\xa2\x3b\xd9\xce\x3a\x38\xbc\xbd\x69\xf0\x6c\x23\x94\xad\x7d\xf6\x22\x42\x4b\xa7\x35\xa8\xc0\x26\xf1\x88\xef\x7b\xa3\xa3\x32\xa7\x89\x5d\xa4\xda\x52\xb7\xe6\x62\x83\xce\x2c\x66\x2b\x7f\xe8\xc4\xbc\x68\x43\x7c\x58\x9f\x36\x47\x60\xac\x7a\x2f\xab\x08\x69\x41\x9e\x01\x95\x5a\x16\xed\xbe\x7b\xa3\xac\x1f\x78\xc5\x58\xca\xc8\x01\x55\x42\xad\xcd\x24\x4d\xdd\xe7\x37\x9b\xc6\x16\x20\x11\xa3\x9e\x3a\x18\xf5\xa7\x7b\x25\xf6\xe3\x14\xa8\x84\x27\xdd\x5c\x15\x98\x78\x12\x39\x34\xbf\x84\x6a\x8e\x04\x3d\xc8\x92\x53\x1a\x6b\x8f\x22\xc9\x3c\x7b\x4f\x72\x86\xab\x48\x27\x42\x2b\xad\xf1\x86\x6d\xad\xf4\x6e\x79\xd3\xc0\x39\x3f\xe7\x9c\xd7\xdb\x01\xb2\xab\xb6\xde\x4a\xe8\xb6\x3e\x48\xb4\xa7\xd9\xab\xb9\xa6\x0f\xe7\xbe\xe3\xf5\xc5\x01\xfe\xf5\xe8\xf8\x18\x89\x10\xf2\x1e\x50\x39\xb4\xbb\x53\xdb\x12\x64\x60\x5d\x25\xc9\x7f\x6c\x56\x10\x4a\x63\x73\x35\xa0\x77\xb1\xa5\x70\x92\x13\xb6\x66\x47\x10\xec\xb7\x96\x4a\xa0\x8f\xfd\xe3\x78\x9d\x6c\x0f\x0c\x4f\x9b\x21\x66\xdf\x26\x74\x36\x52\x27\x87\x83\x49\x47\x8b\xde\x78\xc2\x5a\x6e\x6d\x7e\x60\x25\x6f\x75\x06\x00\xbc\xe1\x4e\xe7\x66\x95\xc7\x0a\x23\x0d\x92\xd6\x82\x54\xcb\x2e\xb9\x37\xd3\xa2\xcc\x73\x12\x6c\xab\xe2\x74\xb3\xf2\xfc\x2d\xd7\xb4\x48\x4d\x4d\xef\xb5\xe6\x77\x9a\x3c\x99\xdf\x58\x17\xe7\x5c\xf9\x5a\x0a\x6b\xc9\x50\x78\x43\x61\x00\xe7\xed\xbf\xfb\x38\x6a\xdf\xf7\xc3\x3e\x0e\x82\x3e\x0e\xfc\x7e\x4e\xc2\x9e\x28\x42\x7c\xa9\xd9\x99\x93\xe8\xd2\xcc\x56\xf9\xb1\x04\xaf\x37\xef\xee\x3d\x17\x8d\x66\x2f\xb6\xb8\x49\xb3\x9d\xee\x0d\x4b\x27\xe4\x9e\x06\x58\xd1\x5a\x73\x7c\x7b\xc6\xee\xe2\x1f\x7b\x76\x40\x99\x4d\x19\xd1\xd3\x00\xd9\x79\xcf\xff\xea\xbe\xef\xfb\xae\xef\xc7\x41\xbc\x8a\x91\xca\xa6\xab\x83\x40\xd2\xb1\x42\xf3\x9a\x34\x93\xc2\x41\xe7\xc2\x55\xa7\x0a\x28\xfa\x48\xb9\xaa\xd2\x6e\xfe\xab\x93\x4c\xf1\x66\x87\x24\xf2\x2f\xd2\xc0\x7b\xb0\xd5\x5f\x05\xa6\x41\x09\x80\xda\x3f\xd4\x58\xcd\xb8\xa9\x44\x68\x71\x9e\x94\xe0\xc4\xba\x44\x0f\xbf\x6d\x55\x60\xc6\x9e\x1e\x89\xfb\x00\x11\x07\x8a\xdf\x25\xba\xe8\xa5\xae\xf5\x64\x94\x91\x9e\x9c\x25\x05\xf6\x7a\x45\x57\x85\x0f\xe6\x4e\xb6\x9e\xdc\xde\x90\x0b\x30\x23\xf0\x99\x2f\x6a\x8f\x92\x71\x2b\x43\xf2\x6b\xfe\x86\x54\x29\x09\x3b\x29\xce\x31\x29\xcd\x7e\xb1\x15\x55\x67\xea\x5c\xca\x51\x2b\x44\x3c\x97\xf0\x8e\xfd\x11\x42\xfa\x13\x72\x9e\xc7\x55\x09\x37\xec\x4b\x92\xe5\xc8\xf2\x45\xe9\xba\xae\x7e\x65\x3b\xd8\x3d\xc1\xb0\x14\xaa\x7d\xfa\xf5\x9c\x38\xbc\x03\x0d\xef\x4a\xfe\x47\xd2\x6a\x9a\x79\xa8\xb7\xbc\x4d\xe9\x67\x3d\xbf\x2d\x1a\xe4\x26\x19\xe6\x2d\xfd\xdd\x53\xfc\xbb\xbb\x54\xb8\x9d\x1c\x17\xba\x0b\x4e\xda\x2c\x6e\xb4\xb4\xcb\xd4\xa9\x54\xf1\x50\x22\xb8\xfe\xfa\xf2\x53\xc9\x8c\x18\xb4\xac\xca\xbd\x51\xc7\x1b\x37\x19\xed\x9e\x18\xda\x1d\x1b\x9a\x10\x88\xc7\xff\xbb\x93\x4c\x10\xac\x3d\x7c\x93\xae\x33\x32\x0b\x63\x82\x0d\xa3\x6f\x3d\x0e\xaf\xe1\xfc\xea\xf3\x6d\xa1\x03\x89\xee\x13\x69\x0c\xf3\x92\xfc\x49\xa6\x99\x96\x67\x5b\x35\xb5\xde\x54\xe6\x67\x20\xe0\xf3\xbd\x2a\x01\xa8\x0b\x39\xfc\x5b\x99\xf5\xa1\x4f\x45\xa1\x4f\xf5\x81\x77\xd5\x71\xf1\xe0\xeb\xb3\x83\xd0\x9f\x15\xad\xe5\x1f\x10\x19\x27\x9a\x66\xe8\xa4\xaf\xac\x40\x9f\x56\x09\x9b\x8c\x96\x1a\xcf\x3b\xc3\xa0\xc7\xa4\xc2\xc2\x0d\x8e\x87\x2e\x50\x2d\xb4\x53\x66\x50\xfb\xb9\x0a\x9c\x29\x5a\x7b\x45\xa6\xc7\x81\xca\x6f\x6e\x60\x51\xc1\x5b\x5b\x8b\x5b\xb9\xeb\xf5\xd2\xa3\xbd\xd9\xab\xb7\xd1\xad\xb9\xc2\xad\xb5\x11\xaa\xf3\xaa\x87\xec\x7f\x1a\x4a\x87\x8c\xaf\xf5\xce\xf6\x24\x56\x0b\xbf\xb7\xe7\x7f\xed\xc8\xfb\xb2\x7f\x32\xb5\x69\x50\x6a\xaf\xf1\x6e\x94\xf2\x6a\xaf\xfa\xd0\x06\x6d\x94\x8a\x39\xdc\xe1\xe2\x42\x29\x2d\x4f\xa5\x33\x77\x70\x7a\x19\xc1\xea\x93\x4c\x36\x96\xa2\x28\x62\x6d\xa9\xb2\x61\x11\xa3\xbe\x3e\xbc\xd3\x3e\x12\x56\xff\x0a\xe9\xef\xfe\x53\xff\x91\x0e\xc4\x90\x0e\xf1\x92\x0c\xf3\x3a\x93\x45\x3f\x27\xc1\x84\x59\x7f\xbb\x0a\x2a\xdb\x3b\x42\xe2\x21\xfe\xb7\x4b\xfe\xfe\xce\x49\x71\xa6\x14\x03\x39\xf1\xfa\xe5\x61\x32\x37\xbc\x26\xd6\x83\xd5\xc7\x5a\xca\xb8\x36\x1a\x88\x3f\x22\x54\xc3\xf5\xbb\x51\x45\xa6\x0a\xe4\x31\x2f\xc0\x8c\x66\xa5\x59\x8e\x20\x2d\x82\x07\x0a\x1c\xe2\xd1\xf5\xf1\xed\x5a\xd9\x09\x09\x24\xdb\xc3\x42\xb4\xa4\x6a\xa8\xd7\x18\x94\x29\x45\x31\x2e\x03\x4c\x73\x6c\xb7\xd1\x74\xe0\x5d\x76\xbc\x2f\xff\x78\x0d\x8d\x3b\xdf\x5a\x26\xd5\xe6\x31\x6b\x16\xd1\x2d\x8f\xff\xdc\xba\xeb\xbd\x09\x1a\x6f\xd1\xa0\x54\x29\xca\x56\x89\xc2\xfd\xc5\xb4\x7e\x4d\xd0\x8e\x91\xce\x1e\x33\x68\x48\xc8\xc2\xf1\x77\x0a\x6c\xb3\xed\xf3\x41\x6a\x7f\x5a\xb9\x2a\x3f\x19\x4d\xf8\x1e\x74\xc5\x96\x77\xe1\x53\x3d\xda\xaa\xbd\xda\xaa\x01\x73\x72\xbf\xb6\xe7\xff\xad\x86\xf5\x68\xad\xe9\x22\x8c\x19\x22\xcc\xe7\xd2\xf8\xdc\x82\xf5\xc2\x3f\x60\x5b\x31\x6d\xf4\x77\x05\x35\x8d\xd4\x19\x53\x65\xfc\x7c\xaa\x78\xa8\x10\x22\xbf\x32\x08\x4e\xe9\x35\xf5\xd0\x83\xab\x0f\xc8\x59\xa2\xca\x9d\x15\xda\x48\xa7\xe1\x62\x66\x84\x90\x44\xbe\xeb\x03\x91\xc8\x30\x23\x7a\x75\xf9\xed\xd4\x52\xc4\x77\x02\xe0\xf4\x01\x86\xea\xb2\x11\xcd\x15\x10\xcd\xf5\x50\xbd\x8d\x10\x24\x17\xbd\xd4\x74\x9d\x75\x56\x9c\x6e\x53\x3e\x95\xfc\x94\x23\x28\x4f\xec\x70\x3b\x82\x62\x88\x7e\x5e\x11\xe2\x82\xcc\xdb\x11\xeb\x8b\xc6\xe4\x57\xbe\x1c\x23\xa0\x98\xbb\xc2\x30\x8a\x19\x6b\x03\xb4\xa3\xea\x93\x78\x44\xdc\x8c\x15\x7c\xab\x69\xa4\xf6\xd2\xff\x3a\x70\x6e\x7e\x4b\xce\xea\x64\x9f\xef\x57\xa7\xfc\xcd\x47\x9a\xa0\xf9\x56\xa0\x69\x7c\x60\xe9\xe2\x47\x65\x7f\x55\x02\x77\xa7\xdb\xe9\x2a\x44\x76\x76\x85\xa5\x60\x69\x80\xa5\xfb\x82\xe6\x7b\x84\x22\x7b\x84\xea\x5d\xfc\xb3\x0d\x35\xe5\x22\x9e\x85\x73\xd1\x86\x73\xd1\x81\x96\xf2\x6c\x69\xf0\x27\x92\x61\x5e\x11\x68\x3c\x3b\x42\x2f\x4f\x6f\xd1\xdd\xc0\x57\x06\x1a\x12\xc2\xaf\x15\x7e\x2f\xcd\x40\x6f\x36\x98\x35\x82\x84\x34\x28\xaa\xec\xaa\x5c\x9f\x61\x3e\xd2\x0c\x4d\xab\x1b\xeb\xf1\x48\xb5\xa5\x81\xca\xd0\x94\x2c\xc1\x1a\x74\xd5\x2f\xe0\x9e\x60\x4d\x90\x1d\xba\x70\x23\xcd\x17\x38\x09\xfc\x75\x21\x93\x81\x6d\x94\xf5\xff\x4e\x24\xa2\x00\xb0\x9d\x87\x3d\x59\x74\xf3\xfb\xd0\x43\xe8\xe0\x70\x61\x86\x4f\xd4\x3b\x29\x32\xc7\xa3\x8f\x30\xe9\x1b\x67\x77\x74\x06\xb9\x0c\x2c\x11\x8a\xdb\x77\x4a\x7f\xc4\xae\x07\x6f\x6a\x0e\xae\x9f\xbe\xbd\xd9\x85\x1c\x81\xe1\x50\xac\xff\x6b\x3c\x35\x67\x2f\xe5\x63\x8a\xa4\xe2\x1d\x26\x63\xc3\x0d\xd1\x5c\x39\x8a\xf1\x26\x92\x3d\x18\xb0\xe2\x98\x42\x47\x83\x0f\x22\x34\x48\x74\x74\xf7\xc1\x9d\x0f\x43\x09\x65\x61\xef\x7a\xcd\xd5\x1f\x2c\x7f\x18\xd9\x9c\x1e\xa7\x9b\xe5\x9d\x64\x12\x74\x0d\xd0\x7d\xf5\x84\xd2\xda\x03\x52\x6f\x70\x70\x1e\x02\x3e\x53\x8f\x62\xd7\x1f\x61\xb4\x48\x17\xe7\x5b\x30\xc9\xdf\xf1\x2e\xd5\x87\x9e\xdd\x8e\x90\xdd\x8e\x30\x67\xac\x0c\x57\x12\x6a\xf6\x60\xcd\x5d\x1b\x49\xfe\x35\x5e\xfd\x0d\x6f\x5d\x93\x63\x5f\x48\x53\x71\x4e\x17\x38\xb5\x6b\x05\xce\x85\x0e\x34\xd2\x6c\x4c\xbf\x7d\xa7\x93\x31\x89\x15\xb7\x0f\x16\x71\xb6\x65\x1b\x42\x40\x07\xe4\xd9\x90\xf5\x9c\x10\x1c\x1a\x8c\xc8\xe1\xa6\xc3\x49\x7c\x16\xa5\x21\x4f\x1a\xc4\xc5\x9d\xfb\xad\xc6\x4c\x7e\x51\xb2\xc3\xfe\x0c\x30\x92\x09\x82\x66\x69\x3f\x1a\x3a\xf7\x97\x0f\x90\x3e\x2d\x01\x2a\x3b\x9c\x4b\x76\x43\x2f\x17\xb3\x08\x53\xfa\xe8\xb6\x6a\x16\x13\x5c\x4f\x28\xce\xf6\x47\x58\x08\x7a\x48\x7d\x09\xfc\x37\xa3\xb5\x97\x86\x81\x85\xe4\x61\xbe\x87\xa5\xc9\xe8\xd0\x48\x1c\xe5\xf8\x30\x07\x84\xe1\x07\xd8\x31\x95\xc8\x4e\x89\x2e\xf3\x0c\x48\xfe\x9e\x04\xf9\x98\xa0\xfd\x1c\x05\xf5\x14\xff\xec\x2e\xf9\x25\xcb\xbc\x38\xdd\xa2\xb4\x52\xc4\xb3\xa4\xc9\x50\x03\x6e\x70\xf0\x6e\x96\x21\x42\x5e\x99\x49\x2d\x59\x37\xc3\xed\xa3\xb2\x08\xd0\x01\x91\xdb\x55\xa2\x9b\x3a\x78\xc1\x4b\x8a\xf4\xd9\xa9\x00\xb9\x2a\x26\xfc\xad\x2e\x97\xbc\x6e\x7e\xa0\x6e\x47\x18\xcc\x81\xed\x01\x15\x2f\x76\x4c\xd4\xce\xe8\x23\xb9\x33\xca\x4a\x06\x95\x26\x76\xe2\xb8\xf6\x53\x6f\xb6\xf0\x06\x84\x7c\xa2\xdc\xfc\xa5\x3b\x4a\xe1\xd8\x40\xc3\x91\x25\xb0\x10\xc8\x4f\x2b\xb7\x32\xbd\x28\x30\x1b\x26\xf3\xd9\x26\xfd\x0f\x9d\x68\xea\xc7\x5b\x37\x28\x59\x92\x71\x26\xb3\x4a\x6a\xd9\x58\xee\xe6\x25\x31\x4e\x0c\x5b\x92\xa0\x9f\x03\x07\x77\x8a\x35\x79\xb3\xf0\x7b\x67\x01\x54\x86\xa7\x8c\x30\x6a\x80\xe8\x16\x5d\x80\x15\xfe\xd7\xe6\x86\x82\x52\x71\xaa\xa9\x53\x24\x33\xe7\x67\x06\x4c\x12\xa8\x2f\x3c\xb5\x6b\x56\x40\xe7\x0d\x8b\x28\x8c\x3d\x6a\xf2\x0c\x54\xcf\xc9\x87\xfb\x03\xd3\xa3\xf2\x9c\xf3\x0a\x17\x12\xb6\x84\x4a\x52\xab\x01\xba\xf7\x24\x1a\x75\xfe\xdb\x40\x69\x07\xc4\x0a\xd1\xdd\x20\xd5\x51\x98\xfc\x61\xc7\xcf\x3a\x8b\xa6\xd2\xd9\x69\xe7\xbe\x7c\x4d\x93\x85\x81\x97\x7a\xbc\x9d\x1f\x6a\x77\x3d\xc4\x78\x8b\xdd\xd9\x1e\x53\x50\x8e\xbe\xfd\xab\xfa\x4b\x71\x62\x96\xad\x02\xf7\xb1\x04\xff\x7b\xfb\xd5\x49\x5d\x74\x69\x76\xed\xad\x51\x7c\x9c\x9a\x27\xca\xd4\x30\x95\x17\x6b\xb4\xc4\x06\xb2\xa7\x7e\x94\x2c\xca\xb7\xf7\x9c\x86\x7b\x44\xfa\x4e\xe5\x78\x8c\xc5\x78\x97\x21\x67\x6c\xa6\xcf\x87\xfb\x7c\x1c\xcf\x66\x7d\x51\x90\xdb\x5b\x73\xc4\x16\x42\x7d\x15\x4f\x70\x3d\xf5\xba\x82\xfd\xce\xa9\x53\x73\x77\x48\x7c\xb6\x2a\xe7\x3f\x93\x9c\xee\xc3\x82\xb8\xcc\xcb\xe1\x0a\x79\xb4\x13\x74\x92\xe4\xd1\xf6\x40\x04\x40\xc6\xca\x1e\xce\xc3\x87\xaf\x68\xd0\x71\x74\xff\x44\xa4\x68\x91\x15\xfd\xad\xb4\xba\xdb\x88\xb9\x04\x9a\x3f\x6c\x00\xd0\x62\x56\x58\xcd\xd8\x32\x94\x7e\x1e\x66\xf0\x67\x55\x2e\x20\x44\x0b\xf6\xbd\xdc\x59\x9c\xc9\x1b\x54\x59\x05\x9e\x60\xa5\xe7\xd1\xa6\x8c\x85\xbe\x36\x93\xe3\xcc\x50\x47\xc2\x66\x2e\x92\x22\x2c\x87\x15\xd8\x73\x12\xf4\xee\xad\x14\xb7\x0e\x31\xd9\x03\x20\xb1\xeb\x9f\x76\xb4\xc8\x32\x23\xe9\xa3\xc0\x0b\x71\xac\x21\xd0\x76\xbd\xec\x78\x6b\xdf\xa0\xe0\x7b\x33\x26\x9c\x41\x20\x3b\xc3\xc5\x1c\x31\x4a\x37\x5f\x8c\xb5\x54\x96\xea\x51\xca\xad\x2f\xca\x5d\x16\x2a\x41\xb7\xf4\x47\x97\x46\x3b\x91\x46\x3b\xa6\x3b\xda\x06\x97\xa2\x38\xf8\x62\xb4\x1b\x9a\x9a\x76\xe7\x0b\xce\x40\x0a\xbe\xc6\x91\x96\x76\x8e\x37\xba\xaf\x49\x11\x9a\x83\xb9\xd6\x20\x44\xa6\xd2\x12\xbe\xec\xe4\x9f\x58\xba\x23\x14\x23\xf2\x1b\x66\x0e\x61\x4f\xce\xf2\x68\xac\x0b\x59\x95\x18\xc5\x40\x50\xee\x9e\x10\xb5\xa3\xcf\xd6\xca\x8a\xf8\x53\xb5\xf6\xcd\x6c\x06\x15\xf9\x4f\x56\xfa\xc3\xdc\x44\xb5\x90\x7f\xbb\xe1\x07\x2e\x73\x9b\xa9\xfc\x61\x16\xd4\x18\xdd\xba\xba\xba\x43\x44\x48\xa6\x74\x4b\x82\x5e\xb0\xd4\xb0\xe6\x25\x1e\xcc\xb7\xc0\xca\x13\xcb\x1f\x5d\x27\x21\xcc\x57\x9e\x25\x50\xfb\x87\xc8\x4f\xae\xd9\x7f\x85\x04\xff\x06\x2c\x18\xf9\xa1\x90\x5e\xa4\x37\x5b\xc6\x10\x24\x5b\x92\xd5\xf9\x02\xe7\x2b\xe3\x4f\x59\x9c\x62\xd7\x9a\x08\xcd\x24\xf7\x91\x7a\x89\x2e\xf2\x76\x85\x77\xe6\xa3\x3e\x3d\x34\xce\x92\x25\xd4\xcc\x43\x94\xfe\x0e\x15\x8d\xf6\x0c\xde\x3b\xae\x3d\xc6\x7c\xc0\x03\x9c\x3c\x95\x3e\x6c\x7f\x6a\xb0\xcc\x5b\x03\x91\x9d\x08\xe1\x7a\x8f\x66\xd6\xb7\xfa\xe2\x40\xe5\x87\x3d\x58\x67\xd7\xcf\xc3\x6f\x1f\x1f\xe1\x61\x8a\x3b\x4a\xe6\x98\xb9\x61\xdf\xce\x49\x41\xf1\xf6\x35\x57\x96\x4b\xe0\xd9\xfa\x50\x6c\x1f\x7c\x48\x44\x30\x1a\xb0\x4b\x4c\xa9\x93\xe5\x1e\x46\x73\x52\xd9\xa0\x52\xd9\x54\x5f\x3a\x2b\x67\xba\x04\x6f\xc7\x4d\x3e\xff\x21\x80\xf6\xfd\x54\xdf\xf2\x2f\x76\xd7\x82\x52\xe3\x06\x00\x9c\xe5\x71\x95\x57\x4d\xc2\xb4\x08\xd6\xf2\xb5\x64\x56\x92\x01\x20\x29\x87\xb3\x1c\x21\xb2\x25\x99\x53\xa1\x1e\xfd\xd8\xa0\x80\x8a\x05\x50\x00\x86\x2a\xf8\x37\x21\xc6\x0c\x00\xa3\xdf\x4b\x6e\x2f\xa5\x4b\x5a\xef\xaf\xa7\xc0\x14\x02\x8a\x84\x1b\x28\x7d\x02\xeb\xfa\x49\x77\x49\x45\xa7\x63\xb3\x38\x54\xf0\x2c\xa0\xd6\xe7\xb7\xb3\x49\x6c\xa8\x15\x9a\xfd\xf8\xf6\x4b\xd2\xa0\xd0\x82\xe8\x28\x35\x51\xf5\x57\x1a\xfb\x4d\x23\x9f\xa0\x3d\x00\xef\x60\x67\x50\xa9\xc9\xf8\xb8\xa6\x26\xfb\x10\xd9\xb9\x22\x10\x95\x9f\xe1\xf3\x2d\xc6\xe0\xc0\x1e\x79\x66\xa0\xd1\x2d\xbd\xd8\xb8\x63\x13\x2e\xe9\x3c\x05\xe5\x29\x5e\x30\x05\x35\x56\x5d\x85\x12\xf2\x4b\x21\x4f\x04\x90\xd5\x53\xf9\x75\x65\x2a\xc9\xa1\x4d\xd7\xc0\xb0\x3a\x30\x24\x03\x01\xf7\x80\x99\xf3\x03\xab\x9f\xf9\xc5\x7e\x22\x5f\xbf\xda\x43\x6f\x2e\x43\x96\x3b\xac\x08\xbc\x5e\xaa\xad\xc9\x12\x27\xb2\x5d\x60\x6c\x09\x42\x3a\x7b\x5d\xbb\x1b\x4d\xed\x08\x23\x3d\xb1\x3c\x54\x67\x24\x41\xa5\x34\x4b\xba\x4a\xf8\xb4\x07\x46\xed\x18\x9d\xa9\xdf\x03\x2b\x8f\x4e\x35\xbe\x48\x9f\x5d\x26\x43\x09\x01\xd1\xc5\x30\x19\xf1\x5c\x47\xe6\xfa\x86\x89\xfd\xed\x86\xe8\xfe\x66\xa1\xc0\x60\x3c\xcd\x7f\x75\xf7\xcf\x35\x8a\x23\xc4\xb3\x5b\xba\x84\x47\x7b\xb5\xd1\x8d\xeb\x48\x59\xbc\x9b\xc4\x2c\xf2\x8c\x76\xf7\x8b\x65\x66\xfb\x10\x86\x5b\xcb\xd0\xfe\xab\x2a\x6b\x11\xff\x9d\xbb\x78\xb6\x60\x33\x10\xc8\x7b\x7a\x6a\x30\x72\x74\xe7\xb6\x47\xf3\xd9\x25\x80\xd8\x32\x95\x78\x5f\x14\x46\x24\xe8\x7c\x60\x64\xf0\x47\x51\x4c\xe9\xfb\x5e\xef\x20\x34\x66\x7b\xfe\xd7\x43\x74\x97\x83\x37\x55\x79\xce\xf5\xed\x88\xfc\xd5\x5e\x6d\x31\x43\xe2\x81\x67\x15\x87\xcc\xf3\x0c\x57\x82\x3e\xb0\x74\x87\xe8\x47\xdb\x56\xe5\x19\xec\x96\x28\xcf\x10\x26\x7e\xbf\x7a\x8a\x09\x1a\x4a\xf5\x81\x38\xb0\x6d\xf5\x91\x6c\x94\x1d\x36\x58\x57\x5b\xc0\x17\xe5\xd9\xca\x7f\x20\x22\x3b\x5e\x57\x52\x28\x95\x1f\xd8\x9d\x85\xdf\xad\x9f\xbd\xf6\xec\x6f\xc3\x11\x6e\x2d\x14\x9f\x5a\xea\x9c\x72\x98\x07\x8d\x6d\xf2\x03\xb3\x0a\xf3\xe7\x48\x19\x53\x1c\xc2\x80\xb1\xbe\xac\xeb\xf2\x87\x1e\xea\x0f\xa6\x16\x98\xaa\x73\xf1\xd1\xb2\x5f\xb3\x05\x18\x78\x20\x47\xb1\xb5\x64\x9b\x51\x12\x3a\xa4\x28\x3a\x3c\x6e\x59\x3f\x23\x49\x40\xe4\x49\x64\xe5\xd8\x31\x0b\x92\x36\x77\x76\x24\x03\xaf\xfa\x55\x60\x28\xe2\xfd\xed\xd3\x38\x91\x28\x3a\x9c\xec\x3c\x2e\x50\x05\x7a\x13\xe2\x32\xe4\xa7\x58\x17\xb2\x65\x89\x03\xc3\xa5\xc8\xde\x4b\xe8\x09\x05\x33\x6c\x5e\x36\x66\x75\x3f\x9e\x9d\xee\x9f\x6f\x85\xfa\x43\x2c\x48\x71\x38\x7c\xa9\x6b\x23\xc5\xd5\xa6\xe0\xca\x28\x0f\xeb\x93\xc3\x01\xf3\xc5\x0f\x20\xcc\x4a\x36\x9e\xda\x4e\xfc\x25\x85\xc0\xff\x3a\x96\x79\x63\x09\x6d\xbe\x38\xe6\xee\x98\xdf\xdc\xa9\x3b\xa5\x4b\xc0\x7a\x7e\x5f\xe2\x3c\x54\xd1\xb9\xb9\xbf\xdc\x55\xc9\x82\xc7\x7d\xac\x91\x9f\x09\x7a\xe3\x20\x10\xa8\xcc\x3a\xf7\x4e\xd4\xe2\xe3\x48\x43\xa5\x8e\x16\x07\x21\x9b\x6d\xb0\xaf\x89\x85\x67\xba\xe8\xc6\xdb\xa0\x90\x85\x38\xfa\xe6\xc7\xba\x7e\x13\x79\xa8\x0e\x92\x85\x3d\xbe\x28\xcd\xa8\xdf\x59\x2a\xda\xda\x5f\x28\x0f\xeb\xa1\xe7\xb1\x8f\x8c\x69\x86\xc8\x3f\x92\xac\xee\x43\xfc\x73\xbd\x27\x17\xec\xcc\xc0\xa4\x31\x3f\x30\x13\xc3\xc8\x59\x41\xf7\x36\x10\x5a\xbf\x25\x68\x88\xe7\xf7\x9d\x81\xfa\xae\xbe\x43\xaf\x97\x12\x6d\x78\x27\x4e\x60\x4c\x2d\x43\x85\x4a\x92\x8d\xf9\xdd\xa8\xbf\xe0\x65\x40\x65\x4f\x4c\x89\x58\xd3\xf9\xef\x86\x2b\x3c\xa2\xf6\x95\xa0\x49\x78\xe7\x5d\xa2\xf1\xba\x57\xa3\x4c\x32\x08\x0c\xd6\xfa\xb2\xbe\xef\xfb\x79\x98\x63\x97\x69\xbc\x48\xc2\xe4\x68\xaa\x6f\xc6\xef\xd2\x29\x1e\x7a\xc3\x84\x96\x77\x76\x46\x7e\x1e\xc2\x7a\x40\x57\xd0\x96\x91\x45\x1b\xf1\xf5\xb5\x84\x3e\xe0\xf4\x28\x1c\xe8\xf8\xa9\xad\xca\xd3\x44\x68\x83\x6f\xb8\x68\xe1\x10\x1c\x62\xd4\x5b\x63\xfa\xef\x7c\xc9\x2a\xf3\x9b\xbf\x9c\xd6\x05\x13\xbe\x0c\xb6\x71\xb5\x48\x1e\x86\x07\x79\x8c\x14\xe3\xfc\x09\x3b\xf0\x7b\xd9\x1b\x7f\x84\xfc\xa8\xcd\x7b\xe0\xe0\x62\x8b\x79\xfe\xfd\x36\x74\x64\xd8\x6e\x1c\x3c\xd9\xf1\xfb\x28\xd3\x7e\xef\xbc\x30\xbf\x8a\x59\xdc\x47\xc8\xba\x4b\x02\x51\x2f\x60\x0b\x05\x40\x07\x7f\x39\x5a\x5d\x1e\x1e\x72\xf0\xcb\x66\xb7\x0f\x9a\x1c\x26\x26\x05\xcf\x7b\x11\x7c\xeb\x08\x3f\x2a\x3f\xd5\x7e\xba\x32\xe5\xb7\x42\xc1\xb2\x2e\xdf\xdd\xcc\x90\xd8\x4c\x7e\x36\x99\xcc\x63\x52\x42\x78\xfa\x0a\xb7\x66\x8f\x07\xee\x12\x13\xac\x70\x00\xbb\x21\xf5\x94\x46\x4e\xa0\x9d\x31\x53\x54\x92\x2a\x01\xe8\x06\x49\xbd\xc6\x0f\x39\xe5\x09\x2f\x4b\x54\xbc\xa3\xcc\x89\x51\x14\x23\x52\xfa\x18\xba\x35\x30\x5b\x89\xc6\x77\x94\xca\x11\x95\xf8\x49\x99\x21\xd6\x96\xc4\xca\xc6\xe0\x6a\x51\x04\x3a\x06\x66\x4a\xe7\x57\x50\x95\x29\x33\x0f\x00\xcb\xbf\x5e\xf1\x65\xa9\x66\x9a\x4b\x4c\x0a\xfe\xfd\x9c\xd5\xd4\xac\xc6\xb3\x44\xe6\x80\x4d\xbe\x5a\x9c\x62\x5d\xcb\x6b\x97\x9b\x56\xce\xc3\xbf\xc8\x14\xc9\x9b\xa8\xd5\x95\xa6\xa2\xcc\xf9\xbd\x8b\xf0\x9b\xed\xa1\xac\x22\xb8\x94\x44\xa6\x4b\x9a\xf6\x23\xe3\xe5\xf7\x5a\xbe\xcd\x1d\x6d\xa5\xe9\x5e\x93\x63\x61\xc9\xbe\x6c\x43\x02\x95\x29\xa0\xd9\x0f\xd9\x42\xbb\x39\xea\x63\x9e\x4c\x70\xa2\x8b\xad\x4d\x31\xb4\xf6\xe3\x37\x9d\xbb\x6a\xad\x30\xe9\xf2\x9a\xb4\xdb\xf2\xbf\x39\xca\x64\x57\x6e\x6d\xdf\x13\xa3\xea\x29\xf9\x1d\x6e\x7c\xd9\xbf\x42\xba\xf8\x17\xc7\x2e\xc8\x7c\xa3\x21\xde\x5f\x9c\xb6\x2b\x02\x5f\x8c\x6d\x17\xdd\x1f\xf2\x1b\x1c\xf1\x2e\x8e\x79\xc1\xa1\xec\x70\xa5\x2e\xd1\xc5\x25\x69\x26\x4f\xab\x0e\xeb\x31\xda\x9f\xab\x8f\x6c\x65\xfd\xfe\x6a\x33\xb9\xbb\x72\x07\x85\x3d\x61\xab\x29\xa3\x04\x2a\xdd\x9f\xc4\xf3\xfb\x5c\xfe\xd7\xf6\xca\xa6\xf7\xec\x09\x4f\xf2\x42\x8d\xb2\x8c\xff\x7c\xab\xe5\x8b\x90\x4c\x01\xa1\x26\xaa\xf2\xf7\x5c\x7e\xa0\xf0\x41\x91\x26\x98\x47\x93\x40\x20\x28\xff\x8c\xa8\x87\x85\x1b\xa2\x0d\x77\x86\x66\xb4\xb1\xd2\x4a\x4d\x6b\xf5\xfb\xcc\x9a\x1e\x77\x07\xd6\x95\x9f\x23\x54\x89\x66\x73\x0b\x39\x39\xe6\x25\xc2\x6e\xba\x9e\x88\x62\x76\x9a\x69\x91\x60\x86\xe9\x2b\xae\x17\x91\xae\x69\x08\x28\x37\x4d\xb2\x7b\xa2\xf4\xf1\xa2\x67\x07\x50\xa8\xfd\x9c\x49\xff\x49\xf7\x11\x4f\x4f\x33\xcf\x97\x5d\x46\x3f\x31\x70\x08\xe8\xc7\xb3\xf8\x16\xaa\xe7\xea\xab\xc6\x0f\x91\xe9\x0b\x12\xe3\x8a\xa1\x44\x9a\xd8\x91\xda\x65\x00\x20\xe8\x38\xd9\x83\x73\x24\xa1\x32\x9d\xd0\x52\x2b\xc5\xe2\x3b\xa9\x82\x1a\xf6\x0c\x8f\xc8\xc5\x04\x09\xeb\xad\x55\xf5\xc7\x11\x79\x83\x4b\xbd\x9a\x23\x09\xc7\xeb\x85\x18\x2f\x26\xea\x62\xd4\x9b\x22\x68\xca\x86\x55\x7e\x7c\x09\x46\x05\xad\x26\x88\xee\xf8\xef\x5e\x90\xcf\xa5\x5d\xdd\x48\xff\xfb\xc5\x9e\x12\x33\xe7\x40\xbf\xe3\x4b\x00\x10\xac\xd5\x24\x39\x5f\xf6\xa8\xa1\x36\x83\x4a\x23\x6c\x71\x68\xb4\xdf\x2f\xaa\xa5\xc1\xad\xbb\xf0\xa5\xfc\xf8\xfa\xa2\x0b\x63\x54\xf1\x8d\xaf\x0b\x13\xad\x97\x44\xfe\x30\x26\x45\x90\x44\x36\xa7\x3a\xca\x28\xa9\x68\x0e\xc4\x91\xb6\xf2\xf4\x9e\x48\xba\x61\x50\xb9\x23\x7a\xbd\x8a\xef\x0c\xe7\x06\x96\x43\x43\x6c\xc3\x91\x49\xb3\x5c\xca\xe0\x96\xe6\x0a\x68\x5e\xbd\x9b\x41\xd3\x35\xb5\x99\x32\xe3\x19\xc6\x58\xee\xcb\x02\x9d\xfc\xdb\xc4\x92\x1b\x91\x72\xf3\xb9\x3a\xf9\x62\x74\xd4\xf9\xfc\x31\xa3\x91\x9a\xe3\x29\x02\x10\xce\x52\xea\xfb\xac\x45\x9b\xe9\x4d\xdb\xd4\x3a\x91\x5c\x65\x7d\xc5\x7f\xdf\x4e\xbe\x61\x28\xd3\xb4\x34\x55\xde\x6a\x52\xcc\xd7\x4b\x62\x19\xbb\x65\xd9\x1c\x84\x67\xd8\x71\x60\xee\x0b\x92\x7e\x5c\xbf\x8d\x50\x89\xbb\xab\x60\x59\xc8\xa3\x3d\x0b\x36\x33\xc4\xac\x38\xf9\x62\x2a\xf1\x0f\xf8\x4d\x5b\x45\x4f\xba\x24\xf3\x0b\x5e\x52\xb4\xa0\x6f\x6e\x9f\xad\x08\x7d\x8a\xd8\xaf\x6d\x7c\x71\x9e\xe2\x9f\xae\x33\x46\xcc\xc1\x75\x33\x52\x5e\x36\xa3\xb3\x5d\xd7\x86\x1c\x3a\x74\x09\x6e\x91\xf4\x26\xe1\x26\xdc\x2a\x76\xfd\xe3\xba\x4a\x63\x6b\x8e\x65\x0b\xeb\x0c\x6e\x6f\xc0\x0c\x2f\x84\x89\x83\x1e\x50\x1c\x22\x4f\xaf\xfb\x74\x4f\xb5\x80\xef\x9a\xc2\xee\x21\xf3\x32\xb1\xbb\x6e\x8a\xac\x89\x2b\x77\x80\x68\x71\x2b\x71\x08\xa6\x22\x7d\x93\xbb\x1b\x68\x65\x6a\xcd\x15\x40\xb9\xa3\xe5\xb9\x91\xbe\x26\xa7\x18\x56\x62\x2b\x92\xa9\x63\x01\x23\x77\xa3\xc5\x60\x24\xe9\x96\x00\xe7\xd8\xb2\x57\x07\x95\x66\x37\xee\x49\xf7\x6b\x8d\xb0\xdc\x8d\x91\xe2\x20\x36\xda\x03\x78\x1e\x32\x48\x1b\xdd\x95\xdd\xd3\x74\xdf\x9e\x5c\x75\xe0\x5e\x8e\xb2\xd0\x50\x89\xc5\x36\x78\x08\x4b\xb6\x52\xcf\x30\x7e\x94\x53\x61\x57\x1d\xf4\x2c\x46\x60\x98\xa3\xfb\xda\x07\x4c\x97\x3f\x8f\x34\x4a\xd2\x47\x86\x37\xfa\xb3\xfa\xec\x0c\xa0\xb3\x8f\x3d\x7f\xec\x93\xc9\x1d\x6e\x8d\x57\xb8\x64\x4b\xbf\x77\x8d\xe3\xb9\x93\x06\xbc\xce\xce\xfb\xef\xd7\x2a\xe7\xc2\x55\x1f\x35\x6d\xc4\x65\x34\x9b\x21\x54\xc3\xc7\x1a\x9c\xe1\x7e\xff\x72\x21\x6a\xf2\x75\x97\x7f\x6d\xfc\xc9\x8d\xe9\x47\x3c\x80\xdb\x15\xa7\x5b\x80\x4b\xc0\x89\x58\x7b\x44\xa6\x7f\xaa\x22\xad\x22\x2f\x22\x6a\x6a\xd3\xeb\x8c\xe9\x68\xf1\x00\x1d\x6d\xeb\x93\xca\x57\x4d\xe7\x54\xda\xb1\xea\x0a\xc9\x24\xbb\xe8\xce\xb0\xf5\xa3\x6d\x5b\x24\xf1\x0c\x1c\x06\xab\x53\x58\x0e\x01\x1b\x84\xb6\x00\x69\xb6\xdc\xc1\xb5\x77\x77\x75\x2b\x04\xf1\xca\x25\x3b\x5f\x8b\xb3\x59\x2d\x3d\x27\x7c\x6c\x36\xbe\x4d\x85\xb2\xda\xb6\xf0\xdc\xd5\x01\x50\x22\x9a\x10\xd7\x0c\x66\xbb\x9f\xe3\x22\xba\xd8\x23\x57\x47\xeb\x6e\x4a\x27\x73\xa5\x09\x06\x3d\x98\xe8\xed\x79\x96\x79\xca\x40\xfe\x14\x29\x88\xcc\x62\x67\x8b\x55\xd3\x87\x37\xca\xf9\x6a\x72\x12\x2a\x98\x7d\x95\x7b\x37\xe6\xa0\x4a\x06\xa0\xa3\xbb\x27\xfb\xaf\xaa\x71\x0f\x39\x31\x2a\xdd\xdd\xdf\xb5\xd5\xab\x4b\x67\xc6\x3b\xc1\x49\xef\x96\xb3\xde\x64\xfb\x43\x2c\x98\x6e\x39\x26\x37\xa8\xf1\xd6\x77\xf7\x0b\x9c\x3a\x1b\x67\x88\xbb\xbc\xcf\xae\x72\x48\x1b\xf3\x35\x4c\x76\x7c\x06\xca\x26\x42\xbf\xeb\xdd\x13\x1f\xa6\xd6\xd8\xba\x3d\x55\xb8\x99\x16\x33\x33\xdd\xb7\x5b\x63\xca\xbb\x32\xa1\x66\xf4\xd6\x2e\x42\x60\xcc\x48\x74\x7e\x16\x0b\xfa\xe3\x47\x08\xf0\xf5\x87\xe4\xab\xcd\x10\x79\x27\x6d\x52\x0b\x8f\x8c\x3a\x46\xf4\x2f\xdb\xd9\x55\x26\xb4\xfc\xa4\x98\xec\x17\x65\xb2\xce\x6f\x06\x74\xef\x13\x6c\xeb\x0c\xa3\x35\x6b\x6b\x83\xf7\xd4\xee\x1e\x2f\xca\xc5\x18\x05\x7d\x83\x13\x99\xd1\x54\x73\xe2\xf5\x6c\x1d\xcc\xb8\xa8\x10\x13\x9d\x7d\x10\x28\x16\x6a\x29\x0f\xfd\x3e\x69\x76\x8a\xcf\x0e\x91\x6a\x4b\x3f\x0a\x56\x25\x39\xcf\x97\x4e\x9a\x87\x7d\xee\x62\x70\x65\x3a\x58\x56\x32\x39\xce\x81\xe2\xa1\xd3\x4b\x75\x42\x86\xb1\x39\x58\x04\xf4\x77\x0f\x14\x4b\x39\xaa\x0d\xec\xbd\x02\x12\xfa\x18\x02\xb6\x42\xac\x60\x22\x27\x48\x96\xe2\xd1\xd0\x3b\xd9\x7a\x7f\xb2\x2f\xdb\xae\xdf\xee\x08\xf9\xfa\x82\x5e\x40\xb4\xfe\x2d\x1f\x16\x62\x16\xda\x1d\x15\x38\xf8\x24\x66\x54\x52\x82\x86\x1c\x30\xee\x3d\x18\xb5\x23\x1d\xfa\x6d\xc5\x77\x46\xf9\x0b\x96\x42\x15\xf4\xaa\x83\xcb\xa6\xc2\x29\x76\xa2\x19\x24\x13\xb1\xb9\x63\x8b\xce\x75\x98\xf7\xb7\x41\xa2\x4d\x34\x29\xfe\xe4\x0d\xd2\xc2\x84\x67\x9b\x17\x86\xc1\x99\x81\xca\x8f\x3e\x64\x07\xc0\x6d\x3f\xb6\x8a\x44\xbe\x46\x1e\xca\xb8\x24\x39\x69\x96\x65\x5f\xfd\x3b\x0a\x3a\xb2\xf8\x8c\x2e\x41\x6c\x81\x9a\x17\x9f\x7a\x5f\xe0\x44\xfd\x76\x31\x5f\xfd\x79\xd8\xd3\xf1\x7e\x54\x18\x15\x1c\xb4\x87\x58\xe3\xe3\x05\x83\x50\x24\x0d\xc1\xfb\x54\xf1\xb8\xdd\xb1\x08\x23\xfa\x6b\xe3\x4c\x71\x49\x8a\x39\xae\xb8\xc2\x65\x23\x0b\x69\x62\xbf\xee\x18\x55\x3f\xd6\xc3\xcb\x5d\xd5\x7c\xbc\xaf\x1d\x8e\xef\xcc\x60\x32\x5f\x4b\x41\x9f\xf7\x5c\xce\x0d\x69\x7e\x58\x13\xfa\x03\x6e\x09\xe7\xf9\x26\xc9\x70\x67\xd1\x36\x8e\x78\x7e\x1f\xfd\xbe\xca\x33\x2d\x9f\x0a\xe4\xf6\xa2\xd7\x8e\xb7\xc9\x1f\x3b\xd8\xd4\xe1\x5b\x07\x17\x78\x39\x4d\xa2\x2b\x84\x38\xd2\xde\x1c\xdb\xcb\x1e\x31\x52\xe4\xeb\xbf\x00\x5d\x19\x05\x46\xaf\x7b\x93\xff\xf8\x4e\x80\x0b\x01\x4d\x97\xed\xc0\xac\x77\x4b\x2f\x25\x71\x47\xe5\x31\x51\xb3\xb7\xa6\xde\xf6\x7c\xed\x49\xb4\xd4\xc0\x0f\xb6\xad\x84\xe2\xf3\xcd\x80\x50\xa7\x03\xc2\x6b\xa3\x0f\xef\x6b\xca\xbb\x6d\x1f\x4b\x6d\x3f\xd1\x06\x7f\x2d\x42\x75\x8a\x28\x24\xb7\x69\xd8\xd2\x60\x50\xbf\xcd\xe3\xa1\x5a\x25\xd8\xdc\xda\x11\x86\x25\x40\x55\x9e\x1d\xd8\xac\x2b\xfd\x19\x22\xba\x9d\x6d\xbf\xba\x26\xd5\x5f\xeb\xf5\x8c\xb3\x24\x4e\xb7\xff\xc2\x74\xdf\xbe\x7c\x3d\x71\x53\x51\xf6\xf8\xc6\xf4\x9b\xd6\x93\xc2\xb6\x43\x20\x7c\xd9\xf3\x5c\xdb\xb2\xe6\x3f\x51\xfb\xc7\xee\xf5\x25\x73\x69\x72\x6f\x99\x78\x0e\x72\x12\x20\xfb\x8a\x90\x44\x72\x86\xd2\xef\x4b\xe8\x4e\xb3\xa9\xfc\x15\x8e\x17\x3d\x71\x7c\x2c\x8f\x66\x70\xa3\x86\xc0\x92\x5c\xe2\x70\x8e\xd2\x4e\x2f\x27\x7c\xd4\xce\x42\xa8\x82\x5e\x42\x55\xe6\x8d\xe5\xa0\x50\xfe\xa2\x04\xf7\x7e\x91\x5f\x2b\xb3\x84\x7f\x77\x5a\xbd\x40\x65\x08\xd7\xd1\x62\x58\x61\xe2\x48\xe0\xb0\x37\xbe\xa5\x50\x57\x86\x29\x0f\xd1\x9d\x6a\x47\x3e\x74\x71\x56\x93\xec\x78\x5f\x7f\x37\xc3\xf7\x2e\x74\xdb\xe6\x08\xfc\x58\xfd\xe5\x51\xec\xe3\xb3\x24\xc0\xd2\xb8\xfc\xa0\xe2\x35\x41\x77\x35\x32\x7f\x70\xdc\x08\xd4\x42\xef\xbb\xba\xc2\x2e\x7f\x1e\xe2\x18\x07\x9d\x53\x71\x55\xc0\x43\x98\x3a\x9e\xd8\x8a\xf2\xc2\xfa\x12\x2d\xdf\xef\x03\x2c\xdb\xa4\x47\xbb\xd8\x6b\x25\x70\x70\xf5\x57\x1a\x58\x22\x41\xfb\x5f\x3b\x18\x5f\xa2\xbe\x69\x93\xaf\x89\x3a\x72\xd0\xe3\x54\x9e\x6d\x8d\x35\x40\x7f\x44\x2e\x31\x3b\x69\xc5\x21\xb3\xfa\x84\x14\xa4\xed\x28\xdd\x9f\x68\x47\x8e\x05\x0e\x5d\x8d\x46\x2b\xa3\x3a\x6d\x3f\xa1\x2b\xb2\xf0\x1b\xf1\x9f\x00\xa4\x3e\x7e\x2d\x8e\xec\xe6\xd6\xad\xb5\x29\xca\x9c\x42\xcd\x49\x32\x0c\x95\xbf\x64\x98\x27\x40\xd0\xf4\xdf\xc3\x5d\x12\x49\x61\xa6\xf4\x31\x8a\xd9\xa8\xf2\x90\x04\x51\x67\xc3\x11\x23\x8e\x74\xcb\x0d\xf1\xc7\xac\x31\x9e\x07\x9e\x14\xbc\x31\x6a\xd3\xda\x90\x33\xe8\x3e\xa6\x17\x43\x44\xb7\x16\x7e\xf5\x00\xb7\xf8\x52\x62\x4a\x9e\x00\x78\xa4\x7c\x89\x22\xec\xf1\x1d\xb7\x3a\x7a\xc8\xcc\xd1\xfc\x8d\x23\x42\xf1\xd6\xa5\x13\x59\x5e\xfc\xe5\x51\xfe\xca\x44\xa8\x1c\x29\xfc\x0d\x54\x59\x7a\x6f\xe6\x90\x9f\x23\xe2\x38\xd9\xf1\x7a\xd8\x17\xf1\xbb\x22\x35\xd8\x60\xab\x40\xf8\xf2\x16\x6d\x40\xa0\x5c\xea\xcd\xaa\x1a\x1f\x79\xa8\xa2\xf7\xb5\xfc\x55\xd4\x1e\x5c\x08\x94\x66\xf3\xd6\xdf\xdc\x02\xed\xea\xc6\xce\x59\xa6\x68\xc4\xa6\x9e\xd8\xed\xfc\x65\xf0\xfa\xe9\x06\x97\x39\x46\xdf\x14\x26\x2e\xb4\x1f\x67\xd0\xa8\x3b\x50\x64\x12\xbc\xb7\x0b\xd1\x2a\xec\x58\x78\x77\x61\x70\x3d\xf1\x73\xcc\xef\xc8\x19\xef\xd5\x44\xe5\xad\x5d\x85\x0a\xdb\x71\x5b\xa7\x72\xd5\x3a\xbc\xf3\x9c\x07\xc8\xa1\x66\x0e\xd1\x8a\x7c\x4f\x17\x06\xb9\xa1\xb6\x8c\xe3\x27\x59\x10\x1b\x9a\x52\xef\x7e\x45\x3a\x45\x43\xde\xac\x38\x83\xf3\xc6\xf9\x8b\xd3\xd6\x16\xaa\xa8\xf4\x0c\x11\x46\xe1\x7f\xb9\x6f\x38\xc3\xb5\x3c\x9d\x87\xc8\x61\x97\x99\x52\x04\x65\xf0\xe1\xef\x55\x1e\x21\x37\x30\x4f\x31\x30\x72\x0b\xd3\x1d\x85\x3e\x21\x75\x65\xa8\x36\xee\x24\xf4\x01\x3b\x03\x4a\xe4\x52\xeb\x97\x10\xa2\x5e\xd8\xdc\x9f\x25\xbd\xb5\x64\xc8\xe3\xfb\x43\x59\xf5\xf9\xf3\xf8\x85\x28\x8e\x68\x61\x59\x4d\x3d\xc6\x74\x77\xba\xd9\xfc\x9e\xb6\xc7\x7f\x70\x93\xa9\x2f\x82\x2c\xc2\x53\x9d\x32\x4d\x63\x07\x53\xa1\x28\x66\xc7\xd2\x5f\xbe\x73\x1b\x4d\x7c\x66\x24\x2f\x83\xfa\xc2\x53\x36\xa9\x71\xd5\x78\x96\x5d\x9c\xa4\xc7\x3e\x95\x95\x90\x1c\x81\xfd\xd6\xba\xc8\x40\x37\x24\x46\x8a\x55\x38\x4a\x37\x2b\x8e\x4e\xf6\xe7\xf5\xf3\x63\x55\x4f\x7e\x6e\xbc\xfd\xf8\x38\x45\xbe\xdc\x97\xef\x5d\x36\x46\x14\xbe\x44\xd8\xf9\x37\x28\x60\x54\x9a\xfa\xc0\xd4\x4b\xde\x64\x6d\xa3\x47\xd3\xb8\xb5\xa4\x68\x6c\x51\x95\xb4\xd2\x71\xf6\x45\x11\x14\xca\x74\xb6\xf0\x1a\xc8\x17\x83\x42\xc7\x6e\x38\xf6\x8f\xd8\x5a\xdb\x68\x09\x21\x4d\x47\x4e\x82\xd9\xec\xd8\x88\x8a\xfe\x45\xba\x38\x3e\xd8\x89\xfd\x69\x47\x93\x55\x8e\x40\x48\xa6\x5c\x11\x88\xe2\x3b\x3d\x8f\x97\x66\x59\xe6\x09\xe4\x10\xc9\x96\xe5\xd6\x6f\x48\x42\x99\xc3\x85\x16\x90\xda\x39\x81\x28\xb6\x54\x80\x24\xf0\x9e\x94\x78\xa4\x89\xe9\x7c\xd3\x64\xfc\x23\x0c\xe2\x6f\xfc\x8b\x1e\x1c\x5b\x9a\x3c\x00\x70\x07\x41\x9d\x61\xfb\xce\xa4\x6e\x60\x7b\xb0\xca\x5b\x64\x04\x6b\xc7\xcc\x30\xb5\x49\xa7\xe4\x92\xbc\x4b\xa6\x80\x01\xe7\xb9\xec\xc1\x2e\xeb\x82\x94\x43\xb6\x88\x51\x3b\xa6\x02\x50\xd9\x1e\xfb\xa1\x31\x4b\x37\xc0\x25\xf0\x91\xa6\x3d\x4a\x2b\x39\x1f\x72\x9c\x4d\x71\xc5\x49\xc3\x91\x05\x48\x2d\x9a\xd9\x78\x33\xa6\xbd\x23\x2a\x41\xf7\x53\xde\xf6\xc4\x68\xa3\xbf\xff\x49\x24\xdd\xe9\x64\xea\xde\xb5\x88\x30\xa4\xaa\xaf\x28\xfc\xd6\x89\x02\xdd\xb1\xe4\x56\xcd\x97\x6a\x9f\xe3\xcf\x9f\x21\xba\xdb\x58\x41\x84\x9e\x5c\x1b\x5d\x9a\x4b\x97\xf7\x13\xb5\x86\xb7\xfa\x6f\x45\x3c\x70\x51\xef\x5a\xf4\xb9\x4e\x1e\x1b\x5f\xe2\xdd\xaa\xb1\x3d\x22\x37\x1e\x1a\x3a\xe6\x9c\xc4\x3d\x02\xd1\x9d\xdb\x78\x47\x51\x75\x6b\xe2\x33\x54\x9c\x21\xd5\x87\xcb\x23\x9f\xe8\xa1\x8f\x26\x75\x31\x05\x0d\xc5\xcf\xbe\xa7\xb5\x8a\xf2\xf4\x18\xf4\x74\xdd\x1a\x99\xab\x7e\x61\xf8\x24\x91\x1c\x25\xb5\xb1\x5d\x4f\x94\x6c\x02\x36\x8d\x51\xb5\xa1\xf5\x63\x5a\x65\xd6\xef\xe3\x60\x92\x01\x58\xe3\x03\x93\x55\x30\xfb\x6b\x82\x46\x59\x61\xb2\x11\x9e\xca\x94\x50\x40\x13\x3a\x34\x84\xe9\x4e\x8e\x21\xbe\xd9\xab\x95\x87\x60\x84\xc8\x4e\xdd\x24\x99\x33\x0e\x50\x64\x6d\x31\x63\x34\x1e\x9a\xd3\xd7\xdc\xa4\x74\x63\x1a\x8a\x35\xf4\x34\x44\xe5\xfa\x24\x55\x73\x9c\xfe\x65\x8a\x3c\xd9\xd9\x34\x11\x93\x55\xcd\x0a\x1f\x8b\x2d\xe8\x6f\xab\xcd\x03\x5f\xcf\x3c\x03\xf9\x8c\xed\xe5\xbf\xfd\xbc\x8f\x2a\xd2\x15\xf5\xfb\xb6\x9f\x59\x1a\xbc\x3e\x0e\xf6\x40\x8d\xb5\xf2\x03\x93\x27\xf4\x79\xf3\xe3\x1d\x56\x7f\xaf\xea\x47\x76\xbe\x3f\x64\xa7\x52\x58\x64\xd6\x13\xa1\x70\x26\x70\xd8\x3c\x0f\x73\x98\xfd\x5c\x25\x97\x4c\xc9\xb7\xee\x06\x48\xe9\x5c\x54\x6c\xbe\x07\x76\xc9\x50\x59\x57\x4c\x5c\xbd\xc6\x23\x78\x56\xe1\x98\x77\xe1\x28\x38\x31\xbb\x65\x39\xeb\x5a\x38\x5d\xdb\xcf\xbc\x0d\xfd\xbb\x1b\x9a\x48\xc0\x34\x99\x06\x7d\x50\xc5\xee\x51\x7d\x11\x93\x8e\x6b\x5a\x8f\x37\x14\xdf\xd7\x59\x73\x29\x0c\xa1\x92\x62\x28\x69\x28\x51\x0f\xa0\xfd\x5a\x2f\x52\xb9\xcf\x9b\x1d\x83\x41\x1d\x53\x34\x58\x99\x69\xd0\x27\xf3\x71\xbc\x7e\x7e\xd3\x05\x39\x61\x28\x57\xa6\x9f\x80\x13\xa9\x3e\x20\x10\x53\x4c\x41\xe1\x11\x93\xc8\x40\x90\x4e\x5f\x40\x7a\xb5\xc7\xa3\xc5\x24\x76\x8d\x44\x68\x6c\xcd\x14\xdd\x31\x5b\xbf\xdd\xbb\x8c\x75\x8f\xad\x37\xf1\xe8\xbf\x0b\x0e\xcc\x1f\xf8\x15\xe7\xd7\x49\x5c\xd2\xfd\x36\xb7\xd4\xbb\x32\x84\xa5\x3b\x09\x40\x46\xc9\x5d\x33\xf9\x1c\x1e\xcd\xfd\x83\x75\xf4\x78\x36\x06\xb5\x4a\xfe\xf3\x22\x62\x9b\x59\x67\xa0\x19\xf7\xae\x5a\xf4\x57\x74\x85\x6b\x97\xb8\xd5\xf9\xd4\x6c\x39\x12\x7f\xfc\xf9\xb9\xdd\x0d\x5b\x34\x4a\x2e\x08\x11\x4b\x44\x11\xef\xfc\x96\x0b\x47\x17\x55\xef\x1b\x27\x73\x73\xa4\x9d\xf1\x45\x95\xbb\x6f\x88\xd2\x1c\x43\x52\xff\xbd\xa4\xaf\x43\x6e\xec\x1c\x01\x78\x09\x44\x19\xa7\x26\x0c\x5f\x06\x04\x5c\x99\x86\xf2\x9b\x2d\x44\x76\x4e\xef\x4f\x9f\x82\xab\xfb\xf2\x51\x7e\x5d\x8b\xd2\x4c\xc5\xd8\x98\x56\xf0\x71\x6c\x9d\x51\xdd\xaa\xd8\xc6\xbf\xe2\x46\x1e\x1a\xe5\x1f\x04\x8d\x98\x51\x17\xf4\x74\xd3\x1a\x99\x4d\x2e\xa4\x90\xb5\x3b\xf7\x46\xde\x35\x08\x0f\xdc\x34\xc2\xc6\xdf\x6c\xb6\x40\x0c\x08\xbd\x5c\x8c\x99\x41\x21\xc2\x9a\x92\x5e\x22\x58\x91\x15\x11\x42\x97\xa1\xcb\x6c\x52\x9a\xe5\x08\x53\xe6\x80\x67\x57\x2e\xd8\x1b\x5c\x7d\x05\x30\x14\xa6\xf6\xe5\x98\x97\xa8\x47\x14\xcc\x47\xf2\x90\xde\x83\xfe\xf6\xfd\x28\xf8\x79\x44\xfe\x66\x45\xf6\x37\xb6\xee\xd4\xc5\xe1\x5b\xc7\x62\x35\x99\xa2\x6b\xd7\xe6\x91\xcf\x0d\x3f\x65\x6f\xc6\x44\xa5\x0c\x93\x25\x7d\xa6\x37\x94\x92\xc1\xa8\xfd\x47\xd3\x59\x2c\x59\xcb\x34\x5b\xf8\x82\x18\xe0\x36\xc4\x36\xee\xce\x0c\x77\x77\xae\xfe\x44\xbf\xdf\xf9\x07\x44\x74\x74\xec\x01\x55\x64\xad\x5c\x4f\x42\x65\x5d\x43\x31\x29\xd0\xf4\xc7\x49\xcb\x88\xed\xa8\x35\x7d\xb0\x11\x04\x15\x3a\xfe\xf0\xba\x47\x62\xb4\x9e\x55\xb6\xdf\x33\x34\x8d\x37\x2b\x21\xbe\x64\xef\x95\x12\xce\x54\x7e\x26\xcc\x6e\x47\x33\x10\xec\x9e\xfe\x8b\x36\x54\xf8\x61\x60\x8f\xf5\xdf\x2e\xc6\x3f\x86\xe1\x6a\x2c\xb3\x9a\xdb\x3d\x5f\x6c\x49\x83\x21\xfc\x4e\xf2\x87\x0d\xb5\xe3\x41\x91\x06\xbf\xb9\x39\x41\x44\xd1\x18\xab\xa4\x15\x17\x9a\xe1\x10\x95\x68\x18\xad\x84\xfe\x60\xa4\x67\x44\x83\xca\xee\x18\x29\x98\xeb\x59\xfa\xc0\xc5\x14\xf8\x5b\x30\x6a\x5e\x3a\x0e\x4d\x22\x7a\xfe\x09\xd1\x17\xa2\xd2\x8c\xfb\x63\x6f\xeb\xcb\x51\x5a\x4b\x9e\x9f\xe9\x4d\x11\xf9\xdc\x4c\x90\x7c\x8d\x9a\x4f\x51\xcb\xd8\x0e\x83\x2b\xec\x83\xc8\x4b\xfa\xee\x97\xc4\x3f\x72\x37\xc2\xfd\x3a\xb0\x84\xd5\x7b\xe5\x85\x19\xa0\x14\x49\xdf\x82\x92\xf4\x79\xa0\x44\xa9\xfc\x78\x41\xb9\xbf\x3d\x2d\x85\xa8\xd4\xd8\x06\x2a\x26\x17\xcd\x8e\x61\x49\x42\xc2\xca\x40\x68\xfa\x43\x3f\x53\xf2\x7a\x2a\xa7\x32\x1d\x55\xee\x9c\x0a\xa1\x41\xfb\x0a\x94\xa2\x52\xa3\x7a\xe1\xa2\x9d\xe3\x8e\x8f\x7f\xe6\x82\x1e\x78\x09\x01\xa9\xde\x8c\x48\x97\xba\x82\xee\x09\xcf\xe8\x25\x1d\xb0\xd9\x09\x44\x9c\xdb\x7a\xef\x2a\xb7\xae\xdb\x4a\x0e\xf9\xbf\x17\xf0\xeb\xba\x12\x3b\xf5\x81\xab\x83\x89\x38\x8f\xe0\x3b\xe2\xd8\x58\xf5\x2b\xfc\x60\xd4\x87\xf2\x08\x63\x4b\xa1\xfc\xb4\xfb\xfb\x59\x4c\x97\x67\x70\x69\x05\x85\x17\x3b\x27\x47\x9c\x4e\x4a\x4c\xff\xf5\x64\xb1\x2a\x3a\xd7\x28\x88\x3b\x16\x41\xe0\x04\x98\xd5\x07\xe6\xaa\xbe\x3b\xaa\xb1\x66\x27\x1b\x95\xc1\xfb\x70\x01\x80\x59\x4b\x4d\xcf\x04\xf0\xe1\x05\x82\x63\x16\xec\x4f\xe9\x16\x3f\xd0\xba\xf9\x58\x3f\x3b\xbd\x93\xdf\xec\x40\xa8\x36\x8f\x91\xee\xb4\xa4\x6e\x37\x01\xed\xcf\xf3\xa4\x96\xd8\x09\x49\x27\xf8\xb6\x49\xa2\xac\xea\x42\x33\xc3\x66\x30\x75\xf1\x21\x7c\x18\x7c\xcc\x5e\x5a\x06\x1b\x20\x98\xa3\x3e\x45\xad\x57\x8f\x9b\xce\x8e\x66\xca\x6f\x53\x8e\x39\x1b\x7f\x8f\x69\xd6\xb2\xb2\xe7\x59\x37\x8f\x0b\x51\x8a\xb5\x4c\xa6\xc7\x93\x1c\x8b\xe9\x14\x28\x79\x6c\xc1\x0a\xd4\x08\xb5\x80\x33\x71\x6e\x27\xaa\x19\x24\x71\x39\xcb\x20\x10\x26\x0c\x15\xac\x9d\xfe\x92\x1d\x89\x8f\x70\xb3\x6f\xfd\x33\xbc\x00\xae\xc0\x0f\x55\x30\xa2\xac\xa4\xc6\xd7\x9a\xf7\xf4\xb7\xe7\xe7\x01\xcf\xc8\xdc\x7f\xeb\x19\x5d\x61\xd2\xc0\x3e\x78\x59\xb9\x7e\xd1\x9c\x0e\x86\xf0\xfd\x10\xe4\x12\x3b\xc1\x52\x73\xeb\x99\x61\xed\x1e\x44\x3c\x13\xb8\xbc\x15\x75\x4e\xe4\xe7\x3f\x3e\xab\x25\x71\x6a\x7f\x24\x0d\x60\x41\x84\x94\x81\x06\x23\x48\x48\x3a\x73\xed\x91\xa0\x24\x14\xd2\x43\x40\xe4\xd1\x15\x6d\xd8\xe5\x1c\xcd\x75\xb1\x64\xdd\xa5\xfc\xd5\xb3\x28\xc3\x07\x2b\x86\xc3\x92\x09\x8f\x9e\x71\xa9\x8d\xc5\x46\x10\x14\x91\x83\x50\x8e\x63\x60\xb3\xc6\xdd\x42\x20\x9a\x1f\xe2\xea\x94\x55\x48\x41\xb3\x9a\xd3\x42\x97\x53\x06\x83\x10\xe3\x70\x8e\xab\x39\xd4\x1b\xa8\x0f\x7d\x0c\x33\x4c\x90\xc5\x9d\x9b\x52\x21\xfd\x08\xc4\x05\xda\x6d\x25\x80\x84\x06\x00\xad\x27\xdb\xad\x4c\xf2\x0b\x4d\x0a\x3f\x10\x9c\x73\x46\x29\x56\x29\x4e\x34\xc6\x4a\x0b\xc8\x6a\x8c\xe3\x2d\xa5\xaf\x41\xeb\xc1\x12\xa1\x9a\xc6\xcf\xd9\x9f\x36\x07\x29\x0c\xa3\x80\xaa\x3a\xea\x8d\xcf\x8b\x24\x8c\x86\xad\x38\x91\x34\x3c\xb6\xf9\x09\x7a\x99\x8b\x09\x71\xe0\x0c\x61\xd1\xf1\x0b\x9c\x98\x1a\xcb\x4d\xc6\x71\x74\x0f\xa2\xc1\xbe\xaa\x39\x0c\x58\x23\x57\x80\x8d\xce\xf1\xb2\xf2\x0e\x8a\xa8\x40\x68\x16\x4c\xbc\x94\x6d\xe5\x42\x13\xbf\x9d\x3e\x81\xfc\xce\x4d\x0d\xf7\x43\xb0\x16\xd8\x5d\x96\x97\x37\xef\x2d\xe9\xcf\x02\xa2\x40\x00\x11\x85\xf9\xa7\x4c\x37\x8c\x6f\x95\xf4\x50\xd0\xaf\x16\x7a\xdf\x54\xed\x1f\x08\x16\x00\xe9\xe2\xd5\x3e\x2e\x54\x67\x89\xb6\x42\xac\x18\x2d\x34\x42\xde\x2b\x6e\xa8\x78\x34\xf0\xec\x80\x85\x44\xde\xf9\x44\xaa\xf1\xe4\x7c\x9b\x7b\xc1\x8e\xd0\xa8\x03\xff\x0a\x6a\x7c\xf7\x4d\x3d\xc6\x2f\x6d\x7e\x71\x07\x3e\x29\x9b\x03\x99\x81\x66\x0d\xde\x13\x6b\x2c\x02\xaa\x27\xbd\xd3\xf4\x7c\x34\x08\x4e\x4f\x8d\x7e\xd8\xd3\xc6\x54\x6a\x39\xb3\x94\xd7\x6a\xbb\x12\x25\x9a\x9d\xba\x38\x06\xc3\x6a\x07\xe8\x4b\x81\xd6\x85\x92\xbb\xa5\x0a\x6d\xf0\x26\x1f\x2c\x96\xe4\xc9\x77\xfb\x2e\x77\x72\xcb\xf4\xd6\x36\xd0\x2d\x95\x3b\xc6\xce\x82\xef\x45\x98\xdd\x4c\xf2\xc8\x8d\x52\x9e\xc0\x0a\xf0\x69\xaa\x68\x76\x18\xe3\x93\x3e\x39\x30\xf4\xed\x6f\x58\xe1\xb4\x88\x14\xa8\x31\x7c\xdd\x9a\x6e\xa1\xab\xa0\xa1\xe4\x9f\x12\x30\x27\x6f\x57\x36\x1a\x35\xde\x9b\xaf\x71\x16\x67\xad\x78\x40\x20\x53\x72\x3e\x1b\x1a\x80\x61\xca\x20\x5a\x3b\x00\x76\xde\xb8\x3b\x37\x80\xd2\x2a\x35\x8f\xa4\x53\x1a\x00\xd2\x23\xfc\xfa\x9c\x1f\xb6\x22\x65\x6b\xfd\x59\x16\x38\xbd\x73\x5d\xe2\x38\xc0\x0b\x5e\xb2\x6c\x51\x80\x1c\x10\x48\xbc\x7a\x91\x83\x4e\x6d\x56\x18\x3b\x32\x3d\x88\x75\xa7\xe9\x41\x8b\x13\x85\xf1\x32\x6a\x31\x13\x4f\xb1\x53\xeb\x8c\x09\x8c\x05\x49\x54\xb2\x70\x0b\x0e\x6b\xf2\x30\xa3\x4a\x98\x73\xf7\x84\xc7\x5e\x05\xdb\x57\x98\xb5\xff\xa6\x2d\x46\xd8\x1a\xd2\xc3\x85\x23\xf8\xba\x2b\xaf\xc8\x85\x0e\x4d\xcf\xe6\xf4\x55\x22\x2d\xb8\x59\x69\x31\x12\x29\x08\x02\x18\xa1\xb0\xc2\xe9\x13\x31\xb5\xd4\x0b\xda\x57\x04\x8e\x13\x43\xa4\x87\xdd\x18\xe6\xa6\xb4\x65\xae\xf6\x2f\x79\xfa\x60\x72\x68\xdb\x72\xc3\xdb\x5d\x68\xf4\x80\x8f\x76\x73\xa1\xad\xa5\xba\x70\x20\xe5\x5e\xee\xe5\x72\xd8\xf0\x42\x26\xdd\x91\xcc\x80\x0a\xad\x7a\xfc\xb4\x2b\xb2\x92\x29\xa8\xed\xd6\xd8\x01\x02\x32\xf5\xed\xe7\xa7\x8d\xaa\x13\x1a\x23\xe3\xdc\xa2\x58\x7b\xb0\x1e\xbf\xe8\xf4\xdc\x1c\x54\xfa\x04\xc4\xa2\x5b\xac\xaa\x4d\xeb\x81\xcc\xad\x4f\x01\xac\x24\x6b\xa9\x89\x6d\xe8\xa0\x38\x0d\xb6\xc0\x13\x24\x42\x8c\x2c\xca\x2b\x82\x29\x4c\xc3\xd3\xa7\x54\x33\x63\x6c\xe1\xea\xb4\x15\x24\x61\xb3\xb7\x09\xc4\xce\x81\x8d\xb9\x57\xad\x5d\x76\x6c\xf5\xa3\x3c\x99\x44\x3c\xb3\xc2\x3f\xc3\xc1\x6e\x26\x50\xcf\x63\xf3\x60\x12\xaf\x6f\x31\x64\x4c\x1a\xd9\xe0\x6f\xf9\x5a\xff\xe7\xd8\xfe\x31\x7e\x59\x3a\x8a\xec\x7c\x63\x69\xeb\x9b\x12\xdf\x1e\xe1\x16\xda\xb7\x28\xb6\xbf\x46\xfb\x5d\x28\x49\x1c\x93\x83\xec\xc9\xc5\x39\x32\xef\x22\xb5\x5d\x0b\xf5\x3f\x3d\xfd\xad\xc5\x09\x3a\xf7\xe3\x64\x16\x27\xca\x92\x42\x07\x8c\x11\xf9\xb0\xc6\x98\x67\x27\xc5\x87\xc6\xb0\x81\x68\xa9\xc4\xb3\xcd\x00\x58\x9d\x68\xd6\x00\x91\xff\xb5\xa4\x03\xe5\xf0\x08\xe6\xb5\x3e\x3c\xaa\x58\x43\xc8\xa5\x06\x2a\xfc\x12\x6d\x78\x60\xe8\x5e\x5a\xd2\x4d\x55\x96\x6c\x03\xf2\xed\xb0\x2a\xd7\x2f\x5b\xb0\x7e\xe5\x41\x54\x15\xa2\x3c\x41\x84\xf4\xa3\x03\x56\x3b\x72\xa2\x2e\x67\xbb\x0f\x2e\x95\xbb\xd8\x77\x5a\xa7\x47\x12\x4a\x9d\x91\xcc\x6f\x0b\xe1\xfd\x50\xef\x40\x63\x2e\x6f\xfd\x71\x7f\x13\x14\xc9\x27\xe5\xd6\x79\x1b\x62\xd9\xd4\xec\xe6\x4e\x62\xc4\x5e\x11\x4a\xab\x93\xba\x07\x6c\x36\x28\x81\x80\x7f\xf7\x70\xa2\x69\xac\x9b\x06\xe6\x97\x56\x74\x99\x80\xa8\x8f\x40\xcb\xe2\xb7\x76\xda\x16\xd9\x80\xd6\xe7\xc3\xbf\x18\x3e\x38\xb3\xb2\xa6\xb8\x2c\x42\x1f\xb2\x9b\x1f\xc0\x58\xcf\xaa\xc9\x92\xac\x0d\xc4\xce\xac\x5c\xec\x73\x85\xe4\x3a\x35\x9f\xa5\x3d\xed\xf8\x81\x60\x5a\x8e\xad\x36\xde\x89\x92\x0f\xe7\x95\xf2\x1e\x6a\x5e\x72\xa1\xb1\xb2\x30\x41\x0b\x18\xbf\x65\x81\x09\xa2\x18\x2d\xc7\x9a\xbe\x79\xe8\xce\x1c\x6b\x7e\x4b\x8c\xd0\xad\x20\x31\x90\x47\x20\xf2\xaf\x6d\x55\x18\x94\x3a\x0e\xa3\x4a\xeb\xe1\x0d\x20\x3d\x7e\x55\x85\x8f\xc9\x58\x8a\xcd\xcf\xa1\x45\xa7\x4f\x4b\x99\x14\x9f\x13\x75\xe5\x76\xbe\xb9\x40\xd4\xdf\xd1\xd6\x25\x9e\x50\xe7\x9f\x67\xa7\x59\x52\x93\x89\x58\xc6\xa8\xf2\xe6\xcd\x4d\x95\xb1\xfc\xd1\x93\xbe\xa9\xef\xc2\xd7\x82\x24\xcc\xe0\x97\xc1\x34\x42\x16\x27\x21\xf1\x5e\x58\xf5\xeb\x4f\x28\x67\x75\xdf\x7a\x39\xab\x71\xf3\xe9\x33\xdb\x48\x08\x37\x76\xdb\x8c\x13\x2e\x59\x14\x9a\x38\xe3\xb8\x6e\x41\x8a\xf1\x73\xe6\xda\xff\x57\x9f\x6c\x31\x99\xfb\xc1\xdc\x71\xaa\x75\xac\x85\x90\xa0\xac\xe9\x58\x8b\x6b\x3a\x2e\xcb\x4b\x88\xbf\xbd\x10\x1e\xd1\x99\x63\x6c\xb0\x22\x98\xf6\x8a\x0b\x21\xd6\x7a\x96\x39\x96\xab\x09\xed\x29\x56\x2c\x89\xf4\x8f\x0a\x5d\x28\x1d\x97\x95\x3e\xbf\xb4\x71\x33\x4d\x07\xb0\xce\x62\x30\x49\xf2\x04\xc4\xe8\xe3\xed\xea\x8b\x15\xa8\xa4\xe2\x44\x53\xcd\x46\xb3\x79\x17\xc5\xf3\x0a\xbe\xe7\x94\xe7\x2c\x42\x29\xf0\x62\x1f\x75\xaa\x69\xbc\xcc\xd8\x6b\xc8\x16\x98\x84\xc8\x65\xa4\xfc\xc6\xc6\x2a\x4e\xab\x5b\xb5\x93\x3b\x41\xb7\x76\x5c\xc1\xb0\x42\x7b\xa1\x85\x49\xf2\xc2\x14\x5b\xfb\xa3\xdb\x27\xe5\x28\x7f\x07\x2a\x93\x28\xb8\x47\x06\xe7\x3a\xce\x59\xed\x15\xc1\xe2\x52\xc6\x64\x8c\x27\x11\x5c\xee\x0c\x26\x00\xf0\xa3\x56\x0e\xae\xbc\x8f\x87\xd8\x4e\xf0\xdd\xd2\x0f\x92\x90\x1d\x3c\xad\xb4\xf6\xf0\x6f\xdc\xcb\x9a\x8e\xbe\x09\xbb\x47\xe6\x42\xb8\xc5\x3b\x47\xba\xae\xc4\xc9\xb1\x0c\xa2\x11\xf5\xf8\x15\x57\x0f\x6b\xee\x7d\x76\x81\xf0\xce\xab\xda\xec\x68\x96\x04\x36\x64\xf0\x92\xa9\x44\xda\x40\x2b\xae\x8f\x8b\x3d\x10\xda\x17\x7a\xae\x9f\x02\x5a\xfd\x51\x00\x3e\x08\x28\x85\xa5\x75\x34\xa0\x5d\x6d\xa9\x93\x69\x98\x8c\xc6\x78\x99\x19\xff\xce\x42\xcf\x06\x41\x14\xd5\xb3\x20\xcd\x35\xe6\x2a\x5d\x3c\xfd\xfe\xf4\xdf\x0f\x8a\x88\x04\x7a\x15\xf0\xb0\x1d\x3c\xf1\x82\x12\x22\x62\xef\x9d\x21\x29\xc3\xa5\x7f\x2b\x36\xf9\x13\xc4\xb2\xa2\x4d\x07\x3c\x9a\xec\x85\x20\xa0\xdf\x02\x02\x74\xa1\xe2\xc7\xaa\xaf\xab\xa4\x2f\x1d\x21\x66\xb0\xd9\xab\x70\x1b\x7c\x1d\x77\x15\x84\xcf\x05\xb3\x85\xc3\x8a\x66\x07\x5a\xce\x1e\x94\xb6\x2f\xff\x76\x1a\xc1\x32\x29\x9f\xfe\xc5\x26\x64\x28\xe2\x6d\xfe\xee\xf9\xb7\xee\x37\x47\xde\x73\xbd\x49\xdd\x83\x6d\xda\x9c\x54\x27\xc4\x4d\x10\x5e\x5e\xe1\x38\x9a\x3e\x52\xfd\x3a\x55\x74\xfa\xa4\x16\x27\x6c\x11\xe4\x4e\x0a\xd6\x56\xe9\x9f\x63\x4b\xcd\xae\xde\x7f\xd2\xb9\x82\x7a\x85\x7b\xee\x92\x59\xce\x1c\xb2\x2b\xa9\x24\xbc\x1a\x6d\xc1\xcb\xf2\x19\xd3\x3f\x27\xd7\xd8\x34\x23\xb8\xae\x6c\x73\x3a\x51\x5a\xf6\x3e\xa7\xa2\xb3\xa3\xfa\xe8\x50\xab\x11\xc6\xd5\x21\x73\x8c\xcb\x8d\x62\xb7\xdb\x17\x71\x35\x0a\x45\x44\x01\x5e\xf2\xeb\xb9\x2c\xaa\x0b\x15\x17\x44\x58\x52\xc8\xcf\x84\xd8\xec\x91\x06\xab\xcb\x1b\x2b\xe2\x8f\x02\x2b\xb8\x61\x5d\xba\x3a\xaf\xaf\xb9\xef\x1c\xa2\x0f\x1a\x03\xcd\xc6\x71\xfb\x59\xdd\xd4\x04\x94\xd9\xd4\x92\xef\xa6\xb4\x3f\x9f\x41\x60\x1f\x74\xa3\x9a\x33\x3f\x58\xae\x26\xfe\x44\x9a\x40\x78\x08\x91\xaf\xc9\x27\x51\x88\xb4\xfd\xcd\x72\xcd\xd4\x32\x3f\x25\x48\xa1\x7b\xf5\x50\x4b\x28\x49\x0f\xe6\xe4\x39\xa6\x94\xef\x5a\xf7\xbc\x80\xd7\x1f\x6c\x03\x84\x52\x3d\x0b\xa2\x54\xcf\x24\xc3\x4f\xa1\xed\xa6\xae\x2d\x41\x34\x30\x54\x1f\xf4\x3a\xc6\x1d\x86\x54\x25\x21\x77\xa8\xfa\xc3\x9e\x89\x4f\xbd\xbc\x7a\x6b\x01\x15\xb2\x05\xc7\xef\x56\x74\xbc\xa1\x56\x46\x0b\xd1\x03\x19\x96\x34\xac\x65\x75\x9a\x47\xe5\x67\xd7\x82\x28\x82\x95\x0f\x1b\x5e\x0e\x6a\x02\x17\xf1\x09\x12\x59\xd3\x6d\xa5\x91\xa3\x91\xee\x77\x60\x80\xcc\x33\x76\x95\x30\x3d\x58\x7c\xc4\x1d\x60\x09\x10\x3d\x40\x28\xd4\xb2\x78\x1d\x57\x2d\xd3\x7c\x2a\xe2\x0d\x54\x44\x3f\x36\x86\x7f\x82\x6e\xc7\xda\x0c\x32\x38\x68\x5a\x92\x87\xa8\x43\x17\x73\xbd\xde\x43\x06\xbb\x1e\x01\x00\x96\xd4\x98\x14\x8e\x54\x63\xe5\x4f\xd0\x6c\x87\x2b\x4c\xb4\x2c\x75\xb1\x6f\x9d\x35\x13\x44\x13\x82\x9d\xfe\x73\x4a\xc0\xbb\x85\xcc\x89\xa4\x91\xfb\x90\x4a\x8f\x34\xab\xd9\x08\x47\x8b\x8f\xcd\x7d\xdb\xc6\x7b\x31\x80\xed\x06\xa6\xe5\x74\x5e\xff\xc4\x8f\x7e\x98\x06\x37\xb9\xc2\x7c\xfc\x37\x87\xec\x50\x63\xe0\xce\xff\xc6\xfc\x61\xeb\xbb\xd2\x9a\xce\xbc\x95\xd2\xad\xac\x09\x21\x8a\x4a\x0f\x9f\xe3\x42\x27\xf9\xd4\x54\x4c\x3a\x2d\x83\x38\x4a\x30\x67\x99\xbb\x6c\x0f\x40\xe3\xad\x8f\x61\xd0\xe7\xd1\x84\x3a\xe5\xb1\x52\xd7\x50\xa1\x07\xc9\xf1\xc9\xff\xbc\x67\x79\xed\xb4\x9a\x4f\x0a\x17\x53\xd5\x8d\x6c\x04\x50\x9d\xcd\x6e\xb7\x9c\xc0\x78\xce\x3a\xf8\x9b\xad\x45\x32\xc5\x74\xb7\x6b\x4f\xef\xbf\xe7\xd7\xa4\xe1\xaf\x87\x7c\xa2\xdc\xda\xb8\xe6\x53\x5d\xae\x28\xd8\xf0\xfc\x89\xbf\xcd\x88\x76\xdb\x39\x15\x9f\xc4\xea\x5f\x5e\xd8\x95\x1d\xe1\x1d\xbb\x83\x68\x2b\xe2\x93\x12\x94\x9e\x0d\x06\x40\x67\x3a\x06\xf1\x83\x69\xb0\x82\x24\xfe\x7e\x50\x09\xc3\x43\x83\x65\x15\x9c\xaa\x3e\x0a\x34\x2e\x34\xbb\x15\xad\x3b\x50\xb0\xfb\x76\xdd\xa5\xf1\x70\x4b\x56\x2e\x19\xc2\x9b\xc7\x18\x10\xc2\xcb\xec\x24\x3b\x07\x67\x13\x46\x5d\x2c\x7c\x7d\x2d\x04\xe3\x01\xb7\x5f\xd4\x5a\x56\x9c\xde\x6b\x07\xea\x2e\x19\x14\x29\xb7\x95\xd8\xaf\x50\xb3\xed\xce\xf1\x37\x9e\x49\x3a\x22\xde\x86\x90\xa3\x6a\xd7\x8e\x2d\x31\x55\x8f\xcd\x86\xe6\xf0\x77\x64\x2d\x16\x4a\xd6\xed\x52\xa5\xf1\xd9\xaf\xda\x58\x28\x89\xcf\x9a\x2c\xd7\xac\x20\x42\x47\xb8\x6b\xe5\x9b\x54\xe7\x68\x2f\x13\x45\x4b\x7f\x3e\x58\xcd\x40\x1a\x5e\x6c\xf0\x1b\xed\x57\x81\x90\x44\x13\x81\x71\x8a\x47\x05\xac\x3e\x5c\x27\xbb\xfd\xde\x43\x2d\x31\x33\xbc\xf7\xe5\x59\x7d\xf7\x2b\xcc\x08\xdd\x9b\x0b\x0b\x95\xc3\x5f\xa3\xaa\xb4\xde\xdf\x93\x43\x55\xf6\x8c\x08\x87\x5d\x80\xf0\xdb\xbd\xee\x37\x03\x55\xed\x60\xb7\xcb\xb2\xc2\x44\xe2\xf4\x1f\x94\xde\xa2\xbe\x94\x21\x93\x89\xe2\x38\xa7\x04\x37\x80\x50\xa2\x7b\xcc\x63\xe2\xd7\x8d\xfe\x58\xdb\x47\xad\x0d\x65\x1f\x87\xea\x17\x8e\x31\x3c\xb2\xca\x39\x10\x40\xaf\x0b\x25\x11\x01\x5e\x20\xa2\x52\xd6\xf4\x21\x85\x86\xfe\x74\xd4\x78\xc0\x8d\x98\x6b\xca\xad\xa9\xa0\x2d\xab\x01\x63\x60\x8a\x9b\x57\x4d\x73\xfb\xcb\x41\xc0\xa5\x4f\xc2\xa8\xb8\xea\x90\x82\xc7\x6a\x47\x34\xa9\x2d\x2d\x5c\x10\x64\x57\x45\xb4\x60\x3b\xa5\x68\x60\x6f\x86\x91\x19\x56\x71\x84\x9f\xcf\xbe\x67\xdc\x2f\x2f\x55\x5c\x7e\x6a\x58\x49\xf4\x17\x07\xd0\xe2\x91\xa0\x25\x78\xca\xce\x22\xf1\x6a\x0b\x58\x29\x35\x98\xb2\xf2\x6c\x4d\x23\x44\x11\x1b\x0c\x2c\xaf\x26\x5f\x63\x1d\xdb\x2d\x9c\x8b\x93\x04\x90\x19\xf7\xae\x70\xc7\xaf\x42\x66\xe3\x37\x33\xb1\xc8\x22\x68\x75\xfa\x3f\xc3\xb3\xbf\x02\xe0\xe2\x1e\x60\xeb\xf6\x77\x6f\xc6\xf4\xed\xec\x9a\x6f\x53\x4e\x78\xc6\x84\xc9\xa2\xcf\xed\x69\x0d\x44\x3f\x43\x8b\xee\x02\x0c\x75\x81\xe9\xa5\x5c\x4c\x3e\x1d\xf0\x8c\x3a\x24\x5e\xd9\x51\xb5\x59\x55\x3e\x17\xb0\xa9\x56\xc6\xf8\x6b\xa7\x4f\x28\x73\xf7\x4f\x8a\x48\xb9\x83\x01\xe6\x22\x44\x47\xa8\xe6\x5a\x2f\x6e\xda\x12\xf9\xcb\xf9\x23\xf5\x9e\x50\x13\x6a\x0e\x0b\xbb\xd7\xb8\x38\xa0\xb3\xf4\x1d\x36\x0f\x9e\x39\x85\xf0\x05\xc6\xc3\x51\x1a\x79\xfb\x44\xc4\x4f\x6f\xdc\xf1\x6d\xc4\x4e\x0e\xc9\x0c\xc2\x44\x2f\x6a\xe5\x1c\xfb\x3a\x10\xb2\xb8\x1e\x96\xca\xf5\xc9\x95\x25\x19\xcf\xab\xcb\xbb\x85\xa8\x6d\x3a\x2c\x15\xd9\x35\xc9\x17\xfd\xf4\x51\x94\xf4\x20\xba\x94\xe0\xd2\xfb\x80\xe2\xe7\xf8\x65\x7b\x74\xaa\xd8\xce\x9b\xf2\x50\x44\xa2\xf8\x6f\xe6\xa5\xbc\x03\x61\x70\xe9\xa4\x12\x49\x45\xd3\x43\xd9\xbe\xc0\x6e\x66\x36\xeb\xa1\x01\x15\x92\x77\xdb\xc2\xfc\xb3\x3c\x88\x5e\xc5\x88\xe4\x99\x98\x1f\x90\x8b\x16\xc9\xe2\x44\xdb\xfb\xd4\xea\xd8\x1f\x64\x54\x99\xac\x60\xc9\x0e\x29\x47\x0f\xac\xa4\x6b\x71\x5c\xd6\x58\x8c\x01\x4a\x93\x3e\x9c\x3a\x25\xf0\xb2\x4e\xf7\xd7\x40\x44\x45\x03\x05\x65\xfc\x92\x76\x37\xa6\x3d\xcc\x8c\x69\xb6\xff\xe2\xe3\x1a\xba\x66\xfe\xc4\x21\xfe\x40\xc3\x5b\xd6\x75\x5e\x69\x2b\xd6\xd8\x6a\xc2\x7f\x2f\x9d\xd7\x86\x9f\x63\x9f\x2f\x9a\xa0\xdf\x70\x3f\xb5\x92\x56\x8c\xbe\xbd\xc0\x9a\xbe\x17\xce\xaf\x5e\x95\x98\x08\x74\x51\x06\x9b\x44\x88\x3c\x6a\x2a\x31\x4f\x37\xca\x3a\x9f\x67\x6a\x3d\xd2\x06\x6c\x6f\xd0\xe4\xd7\xaa\x3f\xac\x32\xd3\xdd\x82\x9d\x20\xf0\x04\x7f\x89\x5b\xae\xde\xb5\xbc\x8c\x2c\x36\x09\xcd\x2e\x06\x59\x48\x11\x76\x28\xa3\x31\x4a\xe5\x6d\xc1\xa1\x20\x54\x9c\xa7\xf1\xa1\x00\x0e\xde\x19\x97\x55\xc5\x71\xeb\xc8\x90\xc7\x4b\xc3\x7d\x8c\x2e\x46\xcc\x39\xfb\x14\xe4\xb5\x20\x74\x6e\xe5\x06\x05\x2e\x15\x1a\x3d\x13\xd8\x5a\x7e\x58\xb8\x68\x48\x82\xe2\x8a\xe4\xdf\xdf\x1c\xe0\x14\x29\xde\x45\xb2\xd0\x0d\x75\xdf\xfa\xa6\x72\x33\x12\x28\x3f\xb8\x88\xd8\x25\x2a\x31\x1f\xea\x16\xb1\x73\x76\xc9\x74\xdc\xfa\xd2\x30\x4a\xef\x20\xb6\xbb\x50\x9e\x42\x24\x29\x36\x36\x6c\x55\xdb\xed\x94\x9a\xff\xf4\x81\x2e\xa7\xe0\x24\x8b\x38\x5b\xaf\x16\x5b\x13\x13\x28\x51\x6f\x81\xc0\x39\xd7\xad\x26\xe7\x6b\xed\xf7\xd2\xe5\x15\x25\x86\x4d\x2f\xe4\x31\x7e\x41\x7a\x02\x2c\x18\x69\x71\xb1\xdc\x75\x2b\xab\x5c\x7d\xb5\x64\x81\x08\x30\x59\xa2\x07\x40\x8e\x78\xec\x70\x2e\x16\x66\xe5\x5b\xf4\x49\xb0\x99\xf3\x2a\xd4\x39\x74\x0b\xce\x5a\xf0\x1e\x5c\x05\x77\xce\xb2\x7e\xdd\x63\x40\x1f\x3c\xc0\xa5\xae\x2b\xb1\x4b\x34\x40\x72\x69\x8c\xa2\xd2\xdd\xe1\xa0\xbc\xd1\x6a\x79\xe7\x92\xc0\xa2\x19\xbc\xa2\xce\xc7\x02\xee\x94\xa0\xb4\xc2\x09\xac\xff\xe3\xc2\x7f\xef\x29\xc9\x30\x52\x81\x07\x70\xfc\xac\x1e\x74\x02\x34\x23\xf0\x94\x54\x26\x1d\x29\xa4\x34\xa5\xde\x3d\xdb\x05\x5f\x7a\xa2\x6a\xce\x6b\x57\xe4\xf4\xdd\x37\x8d\xe4\x4c\x96\x22\xb0\xa9\x7b\xd0\x5f\xc1\x41\x82\x9d\xa4\xe1\xf0\xc7\x99\xbb\x32\x77\xce\x34\xaf\x6a\xbb\xb6\xc7\xdd\x72\xb0\x5e\xb9\xd0\xa6\xc2\xa5\x82\xdb\x53\x07\x93\x78\x67\x89\x04\xb8\xc2\x29\xd2\xbd\x1a\x2d\x6e\x05\x00\x7a\xbd\xf3\xdb\xe0\x15\xdd\x70\x20\x43\x40\xb7\xdb\xf1\x1d\xc9\xba\x67\xa6\xcb\x03\x60\x41\x5f\x68\xee\x28\x41\x8a\x4b\x59\xa0\x32\xd0\x06\x84\xd7\xea\xb0\x87\xc4\x29\x09\x65\x1b\xf4\x92\xfe\x99\x74\xb6\xbd\xc7\x26\xbf\x22\xc1\xe9\x56\x9b\x28\xbc\x85\xa2\x92\x7c\x4b\xe9\x72\xf7\x7f\xac\x67\x77\x69\xc6\x0c\x46\x1b\x92\xc7\x0b\xf0\xd5\x91\x2f\xc4\xba\x72\xc7\x01\x89\x62\x2f\x44\xc9\x5b\xd8\x46\x72\x17\xe5\xe7\x0b\x39\x4a\xc9\x99\xe4\xe8\xae\xea\x70\x3f\xf6\x26\x2c\xb6\xd1\xc7\xde\xaf\x29\x21\xd6\x27\x67\xce\x7f\x8c\x3d\x88\xfc\xbb\xc2\xe5\xb2\xa6\x3d\x62\x74\xc9\x2b\xcd\x3f\x6b\xfa\x3e\xe3\xa5\x76\xfe\x27\x79\x28\x65\xf0\x1e\x44\x99\xd7\x71\xba\xcf\x91\x05\xf0\x9f\xce\x55\xaa\xdd\x50\x23\xa0\x53\x95\xac\x5a\x68\x98\x3e\x80\xc1\x72\x4e\x1c\xfd\x70\x40\x69\x2b\x3f\x37\x02\xcd\xec\x3c\x98\x26\x26\x07\x2e\xbc\xb0\x96\x95\x4a\x93\x3c\x78\xe4\x85\x78\xaf\x5b\xbe\xc2\xbe\x61\xc5\xf5\x33\xd2\xa8\xb0\x89\x7e\x8a\xbb\x5f\xbc\xc5\x16\x30\x59\x58\x74\x47\x8f\x0f\x4d\x68\x19\xa7\xd7\xaf\xe1\x4c\xd6\x81\x97\x5b\xfa\xe2\x7e\xdd\x5a\xda\x4b\x2d\xaa\x2b\x0c\x38\x7c\x24\x6b\x3a\x6e\xab\xc8\xae\xf8\x4f\xa9\xbb\x56\x98\xdc\x73\x47\x00\xb0\x6a\xe1\xec\xf0\x95\xce\x8d\x55\xfc\xac\x46\x7b\xf6\x8d\x66\xc4\xb2\xea\x42\xcb\x6b\x53\x6f\x1d\x00\x0a\xfb\xf7\xf8\xc1\x50\xfa\x5b\xf0\xcd\xb8\x49\x08\x81\xe7\x17\x2f\x5d\x5a\xd1\x56\xab\xa0\xec\x50\x78\xda\xb8\x80\xb4\x08\x84\xe4\x1d\x48\xf0\x33\xa2\x8c\x50\xe5\x7e\x91\x5d\xba\xef\x08\x39\xba\x01\x10\x7e\x72\x49\xe5\xea\x39\x11\x9d\x99\x30\xbb\xcd\x98\x61\x54\xd7\x0b\x7a\x86\x89\x84\x71\x10\xfd\xe5\xce\x68\xeb\xf5\x55\x4f\xda\x3d\xfb\x24\x60\xe5\x36\x68\x97\xaf\x9b\xa5\x8d\x9e\x6d\xff\x90\x07\x84\xb9\x17\x96\x9d\x9b\x2e\x07\xcf\x44\x20\xef\x2d\xb5\xef\xfe\x57\x51\x8e\x73\x53\xbc\x63\xd2\x7b\x02\x56\x50\xc6\xe6\xcf\x6f\xa1\x74\xbe\x30\xa8\xb6\xe1\x2b\xea\x4c\xad\x85\x92\x34\x1c\x85\xc1\xa8\x64\x17\xf5\x6f\x27\xa3\xd2\xc6\x63\x70\x64\xe1\x39\x31\xdf\xee\x36\xc6\x73\x9c\xfa\xa1\xd9\x90\x2d\x08\x62\xfd\xfd\x1a\xa8\xb7\xa1\x61\xb0\x85\x8e\x39\x05\x29\x29\xdc\x00\xce\xa5\x69\x1d\x78\x45\x4f\xa3\xe6\x34\x63\x49\x2e\x38\xfb\x1a\x1e\xca\x8c\x57\x89\xc1\xa7\xc5\x78\x23\x5f\x11\x58\x63\xd9\xe9\x79\x1f\x02\xd0\xfc\xcb\x72\xb7\xc9\x52\x28\x35\x35\x57\x94\xa1\x1f\x00\xb2\x3d\xc4\x7d\xac\xdf\x9c\xa8\x0b\xd1\xd6\x86\xd5\x0e\x9e\x65\xcd\x4b\x64\x6a\x6e\x11\x98\xdc\xe4\x72\x06\x23\x14\xc3\x5d\xc9\x97\x53\xa6\xf2\x0e\x9a\x00\x1f\x71\xb8\xb6\x7d\x08\x35\x2c\xf5\xcc\xf8\xa0\xb7\x42\x44\x9c\x01\x08\x4a\x1d\x80\x4a\x03\x7e\x74\xf6\xa8\x6e\x2b\x74\xb0\x8e\xdd\xeb\x43\x5f\x5e\x07\x16\x13\x77\xcb\x59\xca\xb5\x60\x2d\x93\xc7\xbf\x16\xb5\x5d\xeb\xb9\x77\x22\x1f\x3d\xac\x57\x05\x89\x3e\xa9\x4b\x75\x07\xf6\xc3\x7f\x62\x0e\x4e\xae\x12\x74\x2c\x3a\xa1\x44\xcc\xd1\xdd\xbe\x8a\xdb\x7a\xef\x80\x0b\x7c\x2a\x9e\x1f\xb3\xc6\x46\x6c\x73\x5a\xb5\xcb\xd5\xe0\x74\x31\xd8\x9c\xa5\xc8\x6f\xe0\x6e\x8f\x06\x80\x75\xe8\x76\x1b\xd7\xa6\x8a\x06\x1e\xcf\x1f\xb0\x34\x5c\x56\xe0\xda\xc8\x39\x86\x40\xaf\x76\x04\x06\x02\x47\x89\x7f\xfa\x56\xbc\x49\x63\x97\xbd\xfd\x2c\xdc\x22\x8a\x60\x20\x6b\x3e\xaa\x79\xd9\x0f\xc7\x80\x26\x82\xf9\x9a\x8a\x3a\xa8\xa3\xbb\xee\x41\x34\xa5\xef\x4e\xd1\x4f\xac\x0d\x04\x18\x26\xe3\xd2\x39\x97\xd8\x5d\x40\x50\x55\x76\x18\x99\x6f\x00\x92\x6d\xf7\xe4\xa2\x58\x06\x75\x1f\xec\x31\x39\xd9\x02\xcd\xdd\x94\x78\x3e\x46\xf4\x47\x43\x82\x7d\x53\x5f\x19\xcb\x4d\xfe\xe9\xb1\xd4\x10\x39\xb6\x92\x1e\x2a\x63\x3f\xc8\x11\x70\x2c\x27\x0a\x04\x63\xd7\x82\xdf\x8a\x3f\xcf\x1b\xb9\x7e\x73\x5d\x38\xb0\x9b\x7e\xa4\x3d\xb2\xf7\x52\x97\x06\x05\xb5\x6a\xa7\x95\xa7\x80\x80\xc8\xe7\xd5\x2f\x56\x9f\xde\xb8\xac\xfb\xb6\x8d\xd8\x2e\x5f\xd0\x75\x30\xff\xc7\xba\xe1\x16\x7c\xce\x29\xe9\x50\x4d\xfd\xe2\x4b\x74\x95\x76\x9e\x55\xe4\xaa\x69\xa4\x04\x2b\x0b\x45\xdf\xdf\x8f\xb7\x97\x60\x47\xc7\xe4\xd3\xc3\x04\x34\xa3\x6c\x8e\xeb\x0c\x67\xbb\x78\xf5\x89\x77\x2c\x0e\x84\x66\xd1\xb1\xca\x0e\x84\xbe\xb2\x91\x30\x23\x04\x5d\xb0\xd3\xdb\x13\x91\xad\x6b\x1e\x97\xa9\xa6\x17\x8f\x93\xf6\x8a\x29\x43\x60\xf7\x88\xf0\xc2\xd2\x29\xa0\x32\x7f\x8f\xed\xdf\x3c\x5e\x74\x56\xf4\x33\xa0\x58\xae\xaf\x4f\x82\xa8\xad\x57\x03\xbd\xdf\x09\x34\x45\x8e\xe5\x8f\x51\x8d\xe9\x9a\xa4\x5a\xc2\x4f\x15\xcf\xaf\x0b\xdd\x06\xb7\x0f\x7e\xac\x83\x71\x0b\xf7\xa3\x40\xab\x7b\xb2\x6a\xc9\x6c\x41\x92\xbe\x05\x7d\xae\x05\xc9\x45\xb6\x8e\x4f\xc9\xdb\xd8\xb6\x93\x71\x50\xaf\x50\x09\x60\x9e\x41\xfe\x25\x61\x34\x74\xc9\x8e\x02\x76\x55\x13\xef\x81\x29\x8a\x5d\x55\x37\x97\x4a\x08\x98\xec\xad\x6f\x7e\xae\x1e\xf0\x35\x66\x56\x2f\x5c\x50\xeb\xbe\xe4\xdd\x5a\x58\x27\x68\x01\x45\xbd\x13\x05\x20\x77\x33\x21\x6a\x8e\x9c\xe3\x1d\x9e\x4b\xd3\x9d\xf1\xdb\x9a\x91\x34\x41\x97\x60\x06\xad\xc5\x2d\x62\x05\x42\x16\xd0\x40\xa6\x0a\x2b\xea\xa8\x17\xeb\xbc\xc3\xc6\x4b\x1b\x8f\x5a\x87\x10\x75\xb8\x89\xb6\x8c\xb6\x4a\x93\x36\x72\x28\xde\xf5\x86\x14\x26\xbc\x20\xeb\x9d\x38\xed\xc8\xc9\x3c\x30\x65\x24\x00\x4c\xae\x4d\x5e\x44\xd9\x2f\xa6\x93\xa3\xda\xf4\xe3\x9e\x12\xa7\xcb\x9e\x8c\x8b\x0f\x43\xb3\x03\x79\xf2\x4a\x8a\x31\xfa\xc5\xb9\x4a\xa8\x69\x02\x12\x6e\xaf\x31\x1d\x6d\x13\xf2\x49\x6b\x15\xb1\xbc\x19\x9a\x2e\x00\xa2\x5e\x61\x07\xdf\xbb\xda\x2f\x74\x17\x4f\xe1\x12\xb2\x9b\x47\x96\x3b\xa0\xec\x71\xd3\x1b\x71\x9d\x57\x8d\x06\xc4\x18\x86\xca\x47\xb7\x9b\xf0\x2b\x43\x2f\x94\xa4\xd9\x95\x72\x7f\x83\xe1\x85\x68\x87\xf7\x48\xbc\x5c\x3d\x4a\x9c\xdb\xfa\xcd\x3f\x84\x5e\xf8\xe3\x5f\x9d\xd9\x53\x7a\xce\x7c\xe5\x69\xed\x64\xd5\xea\xf5\xfb\x2a\x92\x30\xe6\xa6\xac\xf1\x83\x21\x21\xce\xed\xea\x02\xa5\x36\xf9\xa6\x7e\x47\x08\x98\xe6\x9a\xf2\x6e\x0e\xe4\x26\x28\x6c\x99\xfa\x9c\x16\x22\x2a\x4e\x14\x8f\x51\x11\xa1\xf3\x0b\xc4\x00\xf5\x3e\x42\x88\xae\x2a\x09\xd0\x3d\x3b\xe1\x44\xdd\x04\x2d\x20\x50\x93\x61\xf7\x26\x0a\x37\xca\x8b\xa9\x35\x2e\x81\x68\x0a\xa3\x80\x6d\x43\x28\x67\xa6\x93\x33\x7a\x70\x40\x9d\x3c\xed\x51\x2a\x4a\xaa\x29\x8b\x23\xe5\x00\x20\xcb\x3a\x7f\x2d\xf1\xd9\xb3\xf8\x11\xb2\x31\xfa\xdd\xb9\xcc\x1d\xe4\x44\xdf\x20\x49\xe6\xc7\x09\x74\x82\x02\xe5\x52\x0c\x08\xac\x72\x26\x63\x2a\x04\x71\x2f\xbb\x1e\xd5\x59\xb6\x74\x08\xba\x32\xe9\xd7\x85\x12\x58\x22\x74\x72\x88\xa6\x47\x0d\x91\xd5\xfe\x59\x28\x4c\x3b\x7e\x25\x4c\x17\x95\x8c\x3b\x96\x1b\x12\x8a\xbd\x20\xef\x02\x74\xb5\xe0\xf2\xca\xf8\x85\xe0\x5a\x99\x00\x8e\x9b\x0c\xac\xe3\xb0\x5e\xe8\x06\xb1\x6c\x08\x96\x8c\x42\xb8\x6e\xe3\x97\x16\x8a\xe9\xab\x91\x76\x09\x04\xc6\x71\x79\xc8\x33\x2d\x85\xf0\x96\x5c\x19\x46\x01\x2e\xf3\x68\x2e\x75\x9e\x5a\x4b\xdc\xe3\x2e\xbd\x01\x24\x97\x62\x73\x73\x2a\xdd\xe2\x39\x52\xe4\x9d\x5c\xd7\x2e\xa3\x3f\x46\x97\x86\xa1\x52\x06\x15\xa4\xcf\x3f\x31\xa5\xaa\x68\x3f\xc9\xe3\x1b\xbd\x64\x1f\xbb\x06\xac\x56\xa8\xb0\x3c\xb4\xb4\xca\xc8\x1a\xc9\x03\xa1\x71\xf0\xc5\xf3\x77\x52\xde\x20\x08\x82\xa8\xed\x71\xd6\x6c\x7c\xa5\xc3\x40\x7e\xac\x65\x23\xee\xfa\x85\x62\x99\x3b\xe7\xd6\x25\x0c\x87\x35\x9d\x96\x54\xdc\x12\x31\xd5\x07\xba\x44\xa4\xe2\x7c\x8c\xec\x17\xc7\xfe\x52\x8b\x50\x7f\xf5\x37\x1f\x48\xfc\x8c\xad\xea\xb9\x61\xb8\xd0\x29\xc4\xba\xae\x83\x01\x80\x14\x9a\x3d\xe0\x75\xa2\xd9\x6e\x91\x07\x6d\x79\x11\xec\x45\x3f\xc7\xf7\x03\x89\xc5\x22\x16\x2a\x24\x7b\xdf\xd2\x9b\x28\xce\x6d\x46\xd6\x3d\x92\x76\x09\x54\xf8\xd9\x2d\x3b\x79\xa2\x95\x67\xd3\x4f\xfd\xb9\x4f\x8b\x03\x2a\xc3\x4e\xa7\x00\x2e\xc2\xa2\x8d\x41\xb4\xdf\xa8\xef\x86\x72\x43\xaa\xc5\x95\x06\xc0\x8c\x25\xbf\x00\x27\x0c\x64\x22\x71\x53\x50\x80\x96\x7f\x2c\xc6\xe2\x65\xee\x00\x24\x12\xa6\x86\x88\xc3\xa8\xbc\x30\xa7\xd4\x17\x6e\xbd\xb2\xd0\xd5\xef\x17\x99\x5b\x81\x3e\xc2\x64\xc0\x69\x5d\x56\xbe\x9f\xa9\x23\x93\xd0\xa6\xf8\x0e\xc8\xba\x47\xb1\x66\x9a\x91\xf5\xee\xdf\xf6\x8d\x6f\xc3\x69\x82\xce\x22\x89\x58\xb7\xf5\xd9\xff\x75\x22\x18\xf1\x36\x1e\xd9\x3a\x15\x9d\x39\x15\xcf\x6d\x21\xca\x69\x26\x76\xc5\xa4\x20\x4b\x7e\x96\xcb\x0f\x74\x0e\x95\x3f\x3b\xfd\x52\x18\xac\x50\x37\xc0\x2d\xe7\x23\xc8\x02\xfd\x1e\x92\x09\x33\xd2\x9a\xde\x22\x0d\x83\xb3\xdb\x5d\x57\xf8\xc2\x0c\x3c\x23\x86\x25\xd9\xdd\xc1\xe5\x42\xc6\xfa\x0d\xa7\xea\xa0\xaf\xb6\x87\xec\x1e\x1c\x43\x84\xd6\x5c\x97\x2d\xad\x65\x81\xa7\xec\x2b\x4f\x79\xf9\xd3\x71\x8a\x2e\xef\x78\x26\x0c\xf5\x18\x89\x34\x1c\xae\x3b\x46\xb4\xc5\x10\x91\x3d\x1b\xbf\x72\x59\x03\x8e\xd3\x03\xc9\xb9\x26\x1c\xd8\x59\xc8\x7d\x75\xfa\x3b\xf9\xd9\x37\xbc\x10\xee\x26\xd5\x7b\x55\x5d\xd8\x36\x38\x37\x08\xbc\xe2\xd1\x46\xeb\xaa\x3b\x0f\xe1\x2b\xe3\x1b\x88\x54\x66\xee\x7c\xed\x1a\x10\x5a\x1b\x04\x2a\xc1\x26\x4c\xed\x31\x46\x34\x43\xb6\xe2\xea\x70\x51\x91\xf5\xfa\xda\x43\x2f\xd1\x17\xea\x89\xe6\xf0\xd7\xa4\x1e\xdd\x70\xfe\xa0\xb8\xfe\xa0\xa4\x74\x79\xad\x1b\x68\x3f\xab\xb1\xac\x62\x33\xff\xb7\x17\x79\x5a\xfe\x1d\x04\x61\x6e\x33\xf1\x37\x59\xe7\xb4\x12\xe6\xb1\xa5\x48\x47\x81\xe6\xef\xba\x6b\x38\x3b\xd6\xca\x76\x52\xeb\x0f\x1c\x91\xbd\x93\xb9\x1f\x34\x98\xd9\xdf\xb4\x66\x07\x52\x0b\xe6\x3b\x6d\x00\xa9\xf4\x53\xf1\x3b\xbe\xc5\x1c\xe6\x34\x3c\x2f\x94\xe4\x80\x22\xd9\x91\x54\xf6\x05\x41\x3a\x80\x4b\x53\x5f\xbd\xd3\x3f\x01\x5a\x0d\x67\xb5\xd8\xef\x5c\x7e\x02\x2b\xbb\xc2\xe3\x1b\xea\xd7\xe8\xe0\x19\xb7\xe5\xfc\xdd\xa1\x76\x10\x7c\xe2\xa5\xcd\x4d\x55\xe4\x81\x90\x38\xf0\xed\x1a\x4f\x89\xc9\x18\x0c\x4c\x94\x61\x44\xe9\xcd\x2d\x83\x5c\x6e\x1c\xa6\xe3\xb0\x6e\xc1\x0a\x97\xd7\xf4\x2a\x41\xdf\xea\xb5\x24\xb2\xbb\x35\x3d\x8d\xec\x0a\x03\x34\x28\xd4\xc4\x91\x93\xa2\xe6\xbc\xb8\x17\xb6\xc3\x03\x21\xff\x9a\xb2\xd0\x76\xdb\x82\x65\x07\xf2\x96\xfa\xf4\x73\x8b\xc8\x87\x1b\x8f\x40\x5c\xce\x5e\xb5\x16\x3b\xb5\x16\x07\xc0\x6a\x83\x69\x90\x0e\xc2\x60\x48\x02\xb8\x88\x42\xa8\x90\x02\xb8\x8a\x6e\x9d\x65\xfe\xbf\x95\x40\xe5\xfd\x5d\x10\x65\x15\xab\x6c\xc9\x1d\x5e\xab\xc4\x79\x4b\x8b\xb0\x16\x26\x58\x4a\x1e\x03\xf2\xc7\xd9\xb2\xd8\xaf\x05\xe6\x6f\x19\xd9\x37\x12\x45\xcd\xea\x88\xbc\x57\x6e\x23\x5c\x7f\x43\x12\xfe\xc5\xa4\xc9\x36\x36\xe2\xc6\xc8\xb1\xa4\xb7\x81\xd5\xac\x20\xc4\x62\xb3\xa9\x6f\xe8\x99\xc0\xe5\x7c\x39\x7d\xe2\x95\x5f\xfc\x1c\x3b\xf4\x63\xc9\x11\x96\xdf\x37\x3c\x30\xd5\x5f\x35\xeb\x13\x80\x2a\x08\x28\x2e\x3b\x4f\x3e\x29\xd4\x6b\xb9\x8f\x2c\xb1\x58\x8e\x64\xc5\xdc\x2b\xbe\x78\xae\xcc\x0e\x08\x9b\xb3\x10\x4f\x9a\x1c\x37\x41\x95\xc6\xe7\x42\x8d\x3c\xcd\x1c\x23\x43\x5d\x93\x1e\x62\xfb\xc4\x47\xa4\x5a\x40\x65\xfc\xee\x5a\xd8\xb7\x9f\xf4\x73\xfc\xe0\xef\x12\x9d\x3e\x41\xc1\x8f\x72\xe9\x10\x9f\x36\x02\xe8\x93\xbf\xff\x88\xce\x9c\x48\xcd\x80\x82\x36\x44\x57\xd2\x5c\x97\x6f\x5f\x7d\xeb\x2f\xe5\xd2\xfd\x3e\x4a\x79\x1d\xd9\x1c\xae\xa6\x2c\x38\x51\x7b\x1d\x68\xe0\x72\x97\x59\x65\x99\x00\xce\xa3\xce\xf5\x83\x82\x9f\x79\x2f\x61\xe2\x78\x07\xac\xbf\xc8\x61\x88\x05\x26\x64\x7b\xa3\x59\x21\xc1\xff\xb8\x8b\x08\x87\x25\xe6\x38\x1b\x70\x46\x7d\x2c\xe8\xf3\xf7\x9d\x7f\x6b\xca\x5b\x28\x82\x77\x03\xec\x2f\x47\x77\x0f\x05\x12\xe7\xb5\xbd\xd8\xc8\xaa\xee\xa4\xd4\xe2\x5a\x98\xdf\xd5\x06\xf8\xb1\x9b\x52\xb6\x54\x16\xcf\x30\x95\xc3\xf6\x57\x2d\xb1\xfb\x07\xc4\x4f\x5a\xc7\xd2\x43\x55\xbf\x25\x1d\x97\x30\x18\xec\x37\x1b\x96\x30\x08\x32\x00\xd6\xea\x16\xa0\xba\xc2\x62\x7a\xc1\xb6\x7f\x2f\x51\x54\x47\x47\xaf\x9f\x21\x7e\xa5\xe2\x70\x72\x82\xee\xc8\x15\x94\xf9\xf2\x56\x00\xa6\x20\xf6\x3b\xfe\xdb\xc3\x1f\x8f\xca\x8e\xa4\x86\xa7\x3f\x86\x27\x7c\xfa\xa7\xc3\x46\x11\x05\x10\x65\x31\x3d\x9b\x0c\x4b\x1a\x32\x56\x44\xe9\xbc\x8d\x1a\x5f\x8e\x3a\x81\xbf\xd4\xf1\xb8\xac\xf1\xa8\xba\x53\x02\x19\x4a\xd2\x86\xc3\x9c\xe1\xb9\xef\x96\x42\x74\x00\xe0\x0f\x15\x4d\x88\x83\xf9\x06\xba\x2d\x8c\x94\x4d\xe3\xe7\xfc\xab\x0f\xdf\x77\x22\x2f\xb4\xc9\x5f\xd5\xcd\xe8\xaf\xc5\x61\x11\x37\xaa\xdd\xfc\x66\xb4\xd1\x3b\x16\xea\x4f\x00\xc4\x6c\xa5\x73\x20\xd8\xa8\x4c\x5a\x00\x2e\xd8\x7a\x88\x5f\xd2\xef\xd7\x40\x4d\x35\x75\x08\x4a\x6b\x4a\xd5\x91\x8e\xf0\x01\x96\x99\x21\xbe\x0d\xdb\xfb\xb5\x2f\x34\x2e\x95\xee\xf0\x2a\x7a\xf1\xa1\x71\xb6\x7f\x0c\x22\xd0\x67\xbf\x87\xfc\x08\x5a\x77\x66\x87\x15\x7b\x55\xfe\x6e\xda\x71\x95\xf6\x7d\xe3\xc4\xc3\x25\x50\xe0\x89\x6a\xc2\x4f\xaf\xc7\x4f\x8f\x02\x78\x00\x4c\x29\x10\x97\x54\x7c\xd9\x91\x74\x4c\xce\x2c\x84\x97\x34\x1c\x96\x24\x1c\x9a\x38\xd6\x93\x3c\x5e\xdd\x61\xb1\xc5\xb5\x28\xbb\x98\x71\x91\x41\x60\xb0\xc2\xac\xf9\xf1\xa1\x2d\x0f\x3a\x9d\xf5\xf6\x5c\xae\x92\xad\x98\x02\xac\x6a\xa3\x83\xd5\x90\x6c\x02\x4d\x89\x42\x72\xb0\xcf\x91\x13\x7c\xc0\x45\x07\xe0\x6f\xc7\xd7\xb8\xad\xc5\xae\x7c\x69\xb3\xbf\xb9\xcc\xcc\xaf\xa6\xaa\x4a\x16\xdc\x8b\xd5\x33\xf3\x15\x5c\x47\x4f\x78\x63\xa8\xb0\xd6\x76\xdb\x82\x18\x2f\x2c\x70\x53\xe4\x8a\x7e\x1b\x98\x2a\xb2\xc7\xc6\x9a\xb3\x23\x8e\x8a\xc4\x6e\xf4\x4e\x60\xfd\x03\x38\x3a\xdd\x59\xd6\xa6\xac\x15\x4e\xe9\xe9\x52\xf0\x31\x1e\xf7\xb5\x8f\x6c\xff\xc7\x3a\xf9\x15\xc9\x7c\x40\xb3\x3d\xf9\xeb\x76\x5e\x66\x3a\xb7\xe0\x1f\xa9\x6c\xe4\x16\x4a\x32\x63\x04\xfc\xdb\xa9\x30\xda\x62\xc9\xcb\x0b\xb7\x75\xa4\x3d\xdf\x05\x41\xb2\xcd\xd4\x77\x9f\xc3\xc1\x89\xf7\x50\x0b\x4e\x28\x33\xc6\x37\xf0\xf7\x4f\xff\x0c\xc8\xf5\x3f\x06\xdf\xab\x0c\x29\xce\x6e\x71\xdc\x76\x8a\x10\x72\x14\xdb\x1b\x0a\xa3\x25\x2d\x87\x59\x75\x35\xcb\x55\x59\x40\xe2\x6e\x10\x5d\x9f\x44\x7f\xfd\x41\xf1\x9e\xb1\x65\x6e\x4f\xb2\x21\x6a\x8c\x4c\x0c\x14\xd0\x71\x93\x41\x89\x63\x40\x06\x94\x9a\x27\xaf\x44\x83\xa0\x0b\x92\x06\xfa\x8e\x22\xc9\x01\x3f\x63\x6e\x68\x42\x34\x9b\x2d\x3c\x4f\x34\xf7\x1c\xa1\xec\x93\x69\x4d\x34\x8a\xf2\xf2\xdf\xcc\x88\xce\x6a\xb0\xfd\x41\x65\x6d\xd5\xc6\x14\xfe\xd7\x82\xb8\xfb\x66\x87\x39\x91\x90\xa8\x80\x16\xfb\x78\x3e\x7c\xc4\xa5\x21\xd5\xf6\xd3\x8a\x9c\xcc\xb1\x58\xd7\xac\xcb\x9c\x8e\x4f\x7e\x8d\xea\xb8\xcc\x69\x61\xea\xd9\x1f\x9f\x0a\x0b\x35\x55\x2b\x4a\xfa\x81\xe2\xee\x5b\xfa\xa4\xc5\x89\x64\xde\x45\x16\x23\x7a\x90\x16\xd7\x48\x0b\xa7\x1f\x08\xc5\xc2\xc5\x0a\xa7\x58\x19\xfa\x75\x17\xd3\xcf\x70\xd9\xa1\xae\xd8\x6e\x2b\x95\x96\xd5\x4d\x1f\x0d\xb2\xcb\x6b\xc1\xd4\x8a\xfc\x1c\xec\x76\xe4\x74\x59\xd3\x11\xcf\x19\xfc\xd5\xd7\x72\x5c\xd6\xb4\xe9\x83\xdf\x99\xad\x64\x1e\x8e\xcb\x92\xa4\xe1\xbe\x31\x0f\xf6\x9b\x57\xbd\x55\x5c\x09\x94\x9a\x30\x69\xd3\x7a\xdc\x42\xc3\x88\x08\xf2\x8d\x47\xf8\xb0\x91\x54\x16\x7f\xb3\xa1\xac\xd5\x45\x83\x2a\xee\xee\x8c\xe1\xd2\xe5\xc9\xb3\x7f\xcc\x4c\x8f\xc1\xa5\x44\x43\x92\x8a\xcd\xee\x31\xc4\x8e\x3f\xc7\xa9\x3d\xa1\xd2\x48\x9c\x2c\x33\x7d\x74\x59\x13\xa4\xf3\x0c\x3a\x7d\x09\xee\x05\x3f\x57\xc8\xae\x57\x78\xf7\x4d\xfd\xd7\xeb\x79\xba\x08\x83\x73\xe3\xd9\xb0\x96\x61\x48\x42\xfa\xca\x90\x29\x3b\x20\xf2\xe0\x1e\x19\x27\xc2\xf1\xee\xea\x1d\x27\xd2\x71\x59\x9b\xde\xf9\xa5\x6e\x2b\x41\x74\x15\x05\x70\x11\x68\x6e\xbf\x30\xb0\xa5\xf5\xa6\x08\x30\xb2\xec\x62\x14\x60\xe1\xd2\x47\x71\xeb\x31\x42\xa9\x2c\x48\xbc\xf2\x6b\xb6\x01\xa1\xc3\x01\x2f\xf9\xb6\x89\xa3\xdf\xb7\x13\x25\xc1\x3e\xb5\xf6\x92\xe6\xe4\x15\x00\x58\xbe\xd5\xe7\x8f\xed\x8b\x61\x43\x9c\x76\x45\x4a\x95\x91\xa9\x4b\x92\xd2\xc6\xa1\xc8\x2a\x7d\x5d\x1e\x20\x49\xf3\x00\x06\x52\xac\x74\xb2\xf3\x64\xe1\x0f\x65\xf0\xc9\x4e\x17\x18\xa1\x8b\x51\x44\xc0\xe6\xb4\x12\xe3\xc2\xd8\xff\x3c\x64\x6e\x5d\x5c\xdc\x72\x8c\xaa\x6f\x29\x7c\xf8\x42\x77\x47\xd8\x1e\xdd\x60\x22\x0f\xa2\x28\xd8\xa7\x18\x25\xed\x3b\x79\x0b\xd9\xe7\xdb\x58\x48\x2c\x52\x9c\xdf\x86\x16\xd2\xbf\x73\x72\x7e\xf9\xb3\xb0\xd1\x88\x95\x83\xe2\x0e\x83\x1b\x11\xae\xd7\xff\x79\x43\x57\xea\x28\xb1\x2f\xb5\xa7\x54\x28\xb0\xa2\x33\x1b\x12\xd8\x48\xa8\x06\xe1\x62\xa1\xd8\xc2\xb4\xf1\xa1\x50\x3d\x57\xe4\x57\xde\x0f\xc1\x81\xc2\x8e\x73\x6c\xcc\x53\x44\x47\xdf\x00\x4b\x02\x65\xc0\x16\xfa\x3f\xc4\x9c\x55\xae\xa9\x11\x85\xf3\x92\x31\x33\x46\xe1\x1e\x81\x96\x6d\x44\xe6\x15\x3b\x80\x8e\x43\x1d\xf9\x12\x0a\xf3\x7f\x4f\xa5\xf5\xfd\x4e\x49\x2d\x48\xd1\xe2\x10\x7b\x39\xe0\xc8\xe0\x0f\x6a\x38\x4e\x36\x0d\x3e\x80\xe8\x93\xac\x50\x9a\x89\x39\xce\x34\x90\x4e\x40\x2a\x12\xd9\x82\x63\x0b\x08\x2a\x21\x8c\x04\x04\x8f\x07\x3f\x10\xb2\x6c\x44\x64\x53\x2a\x5d\x66\x65\x8d\xbb\x7b\x79\x36\xfc\x43\x53\x49\xd7\xcf\x87\x26\xb1\x1d\x0c\xbe\xf5\x82\x61\x55\x21\x1f\xf4\xd5\x1a\xf1\xab\x61\x7c\xa3\x1f\xb2\xe2\x42\xdf\x94\x2e\x65\x01\xe8\x15\xf0\xc3\x29\x52\xab\x94\x4a\xe1\xd1\xa1\x2e\xdc\x7a\x5c\xda\x38\xd6\x09\xf7\x77\x87\x4c\x2c\xb2\x6d\xcd\xe3\xca\xf4\x1a\x5c\x13\x1e\x5b\xba\x5b\xe3\x4f\xa0\x4a\xf3\xc5\x95\xdf\x9f\xef\xfb\x53\xcc\x5a\x96\x55\xae\x5e\x3b\x67\x06\x39\x44\xd0\x6d\xe7\x77\x5b\x70\xe4\x11\x0b\x37\x7a\xf4\x43\xc6\x1a\x68\x6e\xbc\x1e\x08\x51\x80\x16\x5b\xb2\xa3\x38\x05\x14\x06\xc1\x55\x08\x96\xc1\x04\x29\x58\x79\xad\x2f\xaf\x4e\x49\x95\x6a\xd4\x68\xf3\x76\x03\xba\x31\xc9\xde\x03\x95\xde\xf0\xee\x23\xe1\x57\xe2\x6a\x81\x07\x81\xd6\x03\xde\xb7\x9f\x44\xc1\x93\x5b\x22\xa7\x6e\x8f\xc8\x3f\xa6\x10\xce\xab\xda\x62\x85\x25\xb6\x99\x49\x75\x98\x3a\x64\xd1\x03\x7a\x1b\xe1\x88\x12\x68\x75\xd0\xcc\x1b\xc9\x0c\x3e\x62\x6d\x6e\xa2\xe3\x27\x5c\x71\x36\x2e\x36\xff\xcd\x57\xf7\x60\x24\x9b\xd6\x58\x66\x0d\x4f\xe0\xd9\x70\xc7\x43\x82\xbd\x87\xca\x94\x3c\x05\x02\x1a\xad\xd0\x3a\x56\x92\xf1\x29\x01\x79\x9d\xfa\xee\x6b\x2b\xb7\x2a\xed\x60\x40\xa2\x8f\xd3\x4b\x87\x57\xc4\x32\x32\x5b\x5e\xb2\x67\x4d\x28\xc1\xaa\xcd\x98\xca\x9d\xf1\x10\xa3\x34\xa7\x42\x33\xb3\x5b\x9d\xd7\xb6\x30\x3b\x5f\xfb\xc5\x40\x54\x71\x04\xdb\x2f\x2a\x7d\x07\xba\x4c\x2d\x61\x3a\x2e\xb3\x86\x53\x40\xc7\xc3\x76\xa3\xf6\x9a\x18\x12\x37\x63\x8c\x9b\x0d\xd3\x95\x54\x73\xc2\xc7\xd6\x09\x56\xab\x2e\xff\x60\xb5\xb3\xcb\x70\xa8\xbe\xfb\xe6\xe1\x14\xa5\x38\xd7\x38\xf1\x34\xfa\x6f\x7f\xde\x8f\xb3\x9f\x50\xc1\x81\xa8\xe9\x60\x4e\x90\xe5\x5a\x8c\x3d\x33\xc5\xb8\xd2\xb0\x9a\x04\x3c\x71\x20\x15\xc9\x20\x4d\xef\xcd\x9c\xbc\xa7\x02\xce\x90\xc7\x7a\x55\x6c\x64\xf7\xf7\xb7\x0e\xe6\x97\x01\x58\x71\xff\x30\x1a\x41\x1a\x39\x49\x0c\x9f\x01\xe3\x3e\x5d\xef\x15\xcc\xed\xe6\xb7\xca\x34\xbe\x14\x41\x9d\x21\x64\xa1\x79\x0f\x78\x63\xf2\x66\xe4\x67\xf4\xe2\xf3\x2a\x73\x55\xca\xa8\x1b\x0c\x80\xde\x44\x04\x9d\x56\xa5\xbc\xff\x8b\x78\xba\xa2\x7b\x76\x2e\x24\xef\x61\xa0\xfe\xc7\xda\xa1\xd4\xab\x26\x8b\x48\x44\x61\x4d\xb1\x5c\xa4\x5c\x7f\xdc\xbd\xc2\xc7\x76\x44\xf2\x40\x7b\xcd\x84\xc9\xfb\x71\x5e\xb7\xba\x7d\xeb\xbc\x93\x5f\x93\xf2\x73\x7f\xed\xdc\x93\xfa\xd7\xf9\x09\x6f\x3f\x8b\x61\xfb\x12\x3b\x0d\x08\xd9\xdc\x54\x52\x9e\xde\x8d\xe5\x9b\xea\x76\x5e\x2f\x22\xdc\x37\x16\x0d\xd2\x61\xdb\x4c\x94\x3d\x3b\x8d\xf6\x3f\xdf\xa1\x03\x9a\xd9\x61\xfa\x41\x17\x51\xf0\x54\xff\xee\xf9\x6f\xad\x36\x5c\x61\xb7\xee\x94\x4e\x85\x92\x06\x43\x2d\x9f\x49\x10\xf1\x4d\x9d\xf5\x4e\x0f\x15\x3c\xce\xfb\x22\x1f\x8c\x87\xaa\xb6\xf2\xf9\xf0\x7b\xfd\xe6\xe3\x48\x96\xa7\x25\x00\xea\x7d\xd8\xbd\xfe\xab\x3b\x2b\xfa\x6e\xb4\xe1\x05\xc1\x7b\xc3\xdf\x90\x65\xf4\x88\x18\xe5\x87\xed\x15\xc6\xb3\x27\xcb\x90\x5c\x52\x62\x0c\xb9\x23\x1f\xbd\x53\x0a\xd3\x35\x37\xa8\x81\xec\x5b\x47\xa8\x2f\xba\xfd\x92\x84\xce\xd8\x0d\xf2\x7c\x8f\xfe\x3d\x28\x6e\x78\xb7\xdc\xc6\x82\x7c\xdd\x5e\x58\x4d\x5a\x30\x26\xd2\xf5\x6b\xb9\x4e\x22\x38\xfd\xa0\xb9\xe8\x05\x53\x4d\x44\xd8\x1c\x72\x46\x5b\xdf\xea\x04\x0c\x5c\xb7\x88\x18\x7d\x11\xfc\x7c\xb0\x58\x98\xf4\xda\x02\x45\x70\xfc\xe8\x87\xe6\x3a\x1f\x5c\x16\xb6\x97\x26\x7c\x64\xa1\x7f\xb4\x7e\xaf\xb2\x4d\xb8\x0b\x95\x35\xb5\xf1\x68\x72\x75\x6c\x3b\xdc\x12\x87\xc3\x72\x46\x1e\xbe\xaf\x6d\x4c\xc8\x3c\x63\xff\x3e\x0d\x6a\x3c\xf5\xa5\x76\x8b\x34\xae\x8b\x28\xf1\x07\xab\xee\x5f\x61\xea\x5a\x92\x06\x35\xe0\xa4\x39\xd4\xff\x0a\x46\xa6\x8a\x98\x89\xad\xff\xe5\xbd\x5f\xc4\xe3\xf2\x13\x04\x3f\xef\x49\x5b\xe1\xe5\x9e\xd2\xf0\x1b\xbd\xea\xa6\xf8\xd4\x7a\x6a\x28\xd6\xdb\x3b\x28\xb5\x5d\x97\x79\x73\xec\x31\xf1\x03\x8b\x61\x5c\x47\xbf\xb2\x97\x32\x9b\x5b\x9f\x43\xcb\x5b\x20\xba\xff\x12\xa2\xd9\x5c\x5d\xeb\x9e\xb7\x5f\xd4\x98\xe3\x0c\x76\x33\x3e\x9a\xaa\xe4\x1b\x66\x05\x75\xec\x56\x22\x47\xd3\x7c\xeb\x11\xad\xfd\x46\xb2\x38\x8a\x12\x0d\x5a\xea\x1a\xe6\xb6\x34\x66\x82\xab\x63\x6b\x72\x97\x58\x02\x18\x17\xf0\xfa\x83\x31\x6e\xa5\x6a\x43\xde\x60\x23\x9b\xb3\xa2\x10\x3a\xb6\x9d\x66\x70\xb6\x7a\xf0\x3d\x67\x3f\xba\x5c\x01\xe6\xb5\x5e\x4e\xa6\xa4\x13\x7c\x1f\xff\x9a\x99\x27\x54\xba\x79\x0d\xbf\xa4\x16\xc8\x80\xd2\x47\xf0\xe0\x6f\x5d\x9a\x72\x60\x6c\xd7\xd4\x87\x4b\xbd\xb6\x43\x1d\xe9\xe6\x50\x64\xb4\x44\xee\x3d\xa1\xb9\x39\xf5\xa9\xf1\x17\x2f\x36\x11\xd9\xf5\x42\xb6\x59\x4e\xd2\xf6\xaf\x2c\xc8\xf3\xdb\x2f\x31\x2b\x90\xfe\x88\x36\xe2\x29\x2e\x82\x04\x6b\x46\xbc\x77\x7c\x1b\x1a\xc0\x89\xb6\x37\x35\x27\x92\x85\xa9\x27\xc6\x33\xf2\xbf\x7a\xb7\x92\x86\xf5\x2c\xb3\x4f\x53\x55\x5f\x11\x05\x14\xcd\x9a\x0e\x8a\xec\x50\x90\x93\x91\x24\xbd\xa2\x83\xb8\xce\x8b\xe7\x27\x16\x3a\x66\xbb\xa8\xc1\x58\xf5\xbd\xec\x4b\x08\x3d\xef\xd6\x38\x0c\xdd\x1e\xd4\xb1\x3a\xba\xe2\x93\x2b\x62\x0f\x6b\xe2\x83\xe6\x7b\xa6\x5d\x16\xff\x50\x40\xa4\x2d\x58\x1f\x2f\xe1\x25\xe0\x4a\x59\x7d\xb3\x90\xbe\x63\x84\x31\xe0\xd3\xb4\x9c\xcc\xb9\xc2\x0d\x48\x7f\x14\x58\x9c\xd3\x97\x3c\xee\x19\xf1\x0f\x84\x5b\x92\xf4\x2a\xd6\x85\x90\x95\x78\x12\x49\x6e\x73\x73\xf8\x97\x3f\x21\xb1\x34\x83\x51\xa9\xe7\xe3\xcd\x7c\x78\x96\x02\x19\x90\x69\x39\x89\x2e\x9c\xfa\x99\x52\xf4\x62\x3c\x4b\x70\x3e\x43\x3e\xf8\x5e\xe1\x15\x8f\x29\x17\xa8\xcb\x76\x83\xf7\x87\x9d\x24\xde\xdc\xea\xbd\x2e\x2c\x93\x2d\x03\x7f\xea\x32\x6d\x8b\xc2\xd7\x78\xdb\x77\x1b\x01\x5c\x1b\x8d\x1a\x4f\x6d\xe4\xe2\xb6\x73\x3e\x0f\xe8\x25\x92\x22\x55\xb4\x0d\x10\xd9\xf1\x82\x60\xfb\x1d\x6d\x08\xc4\x74\x20\xa4\xa7\x4c\x7c\x7e\x6a\x28\x49\xc3\x08\x5e\x8d\x28\x8a\x76\x88\xb7\x40\xdf\x42\x9c\x6a\x3b\xa7\x22\x8b\x77\xae\x40\x9a\xdf\xae\x3a\xfa\x44\x16\xeb\xe3\xbf\xb5\xff\x9e\xd2\xc9\x20\xf1\x17\xfa\x2f\x95\xa6\xf9\x9a\x69\xb5\xb4\x75\x9b\xde\xbd\xd6\x0b\x8a\xf5\x8e\x5e\x3a\x1c\x29\xc4\xef\x0d\xbd\x1a\xf2\x95\xbe\x33\x3c\x1f\x56\xbc\x3e\xb1\x5c\xf6\x3c\x5e\xa0\x48\xcf\x79\x15\x1a\xcd\x85\xce\xb0\xa8\x37\x84\x88\x15\x73\x41\xcc\xbc\xb7\xd6\x67\x92\xa5\x28\x38\xa7\x0e\x07\x68\x14\xab\x1e\xfc\x56\xe9\x32\x18\xb3\xf1\x2f\x27\x44\xd2\x05\xcf\x0b\xa3\x90\xa4\xf9\xef\xdb\x6f\x2e\xbd\x96\x16\x47\x25\xc1\x76\x9b\xdf\xef\x3e\x61\xe2\xc7\xb3\x58\x6e\x4a\x19\x49\xa5\x08\x7e\x66\xfd\xf2\xe6\xc7\x9a\x1d\x7c\x71\xa1\xdb\x83\x53\x44\x36\x43\x6f\x09\x11\x06\x78\x46\x31\x20\x36\xae\x3f\x29\x04\x5d\x9e\x50\x56\xa2\xed\x2e\x37\xae\x4a\x29\x90\x33\xe7\x0c\x9d\x33\xdb\x40\x7d\x98\x5d\x47\x0f\xdb\x55\xcd\x8b\x80\xae\x3f\x86\x0e\x9f\xc8\x77\xaa\x3d\x6f\x6f\x4e\x14\x60\x75\x71\xaf\x48\x7c\x61\x2e\x2b\xa6\xce\x4c\xf4\x0b\x65\x83\xc9\x2f\x86\xe9\x6d\xc9\x4b\x76\x98\x38\xb7\xa5\x3c\xd1\x39\xf0\x79\x1d\x53\x95\x26\x05\x2a\xf1\x86\x78\x3e\x1e\x50\x23\x0c\x86\xcc\xfc\x76\x2c\x8e\xec\x96\xf3\xd9\xbc\x93\x5f\xbd\x93\x09\xab\xac\xaa\x85\x02\x8a\xca\x9a\x3e\x60\xba\xfc\x81\xa4\x5f\xac\x53\xdf\x6b\x8b\xf2\x94\x2c\x9e\x3e\x51\x5c\x7f\x20\x0c\x25\x9a\x3a\x1c\xc7\xce\xfc\x2b\x76\x84\x38\x52\x34\x3b\x14\xb1\xba\xec\x94\xca\xa8\x82\xb4\xb7\xb7\x52\x48\xde\xe0\x5b\xad\x6a\x79\x89\x10\xed\x5b\xec\xfc\xd8\x6b\x43\xb6\x4c\x2b\x0d\x37\xb9\x9a\xe9\xdd\x71\x5d\x89\xfd\x8a\x28\x4d\x99\x14\x7b\x32\xba\x4d\xb4\x5e\x96\x19\x06\xb2\xd6\x9d\xd6\x86\xef\x68\x8f\xfd\xe2\xa5\x18\xce\x61\x2d\x90\xa9\xcd\x2b\xda\x7a\xa9\xd0\x1b\x41\xa0\xdc\x18\xa6\x03\x92\xb2\xdc\x62\x52\xa0\x6d\xaf\xfa\x1f\x7b\xe7\xbe\xf6\x43\x18\x78\x8f\xea\xdc\x76\x98\xc4\x86\x0c\x7e\xc6\x8d\x6e\x81\x08\x73\xca\x48\x60\x51\xdf\x5d\xb3\x8c\x22\xe9\x71\xb3\x18\xf0\x33\x9a\x12\xa4\xf8\xfb\x7b\xc4\xcd\xad\xbb\xa7\xcf\xde\x55\x6e\x4d\xf4\x71\x7b\xb0\x37\x00\xeb\x2e\x3f\x64\x0e\xdf\x0d\x18\x6e\xbb\xa3\x49\xc1\x24\xaa\xc1\x0e\x81\x11\x41\x1a\xc4\x4b\x04\xa4\x3f\xef\x07\x6b\xfb\x5e\x29\x80\xf2\xb2\x6d\xa4\x0d\xc4\xbe\xa9\x8f\x20\x11\x8d\x59\x4d\x38\x00\x1a\x08\xa9\x1d\x08\x81\x45\x28\xd2\x41\x60\x01\x88\xab\x87\x9a\x1c\x3c\xb8\x0e\xa5\x46\x29\x50\x82\xf9\x39\x8b\x99\xdd\xbb\x86\xff\xc6\x40\x65\x4a\x71\x6e\x34\xae\xd1\xc5\x30\x49\x03\xa3\x91\xc7\x7e\xdd\x8a\x6f\xb7\xae\x5b\x0a\xaf\xf8\x11\x92\x27\x42\x47\x74\x1c\x06\x63\x32\xe0\x67\x36\xe1\x20\x48\x95\x96\x04\x72\x34\x08\xe0\x4d\xd5\x2b\x20\x48\x14\xfa\x54\xba\x35\xb6\x12\xe7\x16\x92\x49\x9f\x86\xbf\x66\xce\xc1\x78\xaf\x64\x9b\x81\x5e\xec\x39\x4c\xb8\x14\x68\x39\x0c\xe7\x86\xa0\xf2\xe7\x2f\xa7\x6a\x8f\xa7\x76\x88\xe9\xb2\x89\xb0\xcc\xab\xd9\x42\x8c\x97\xc8\xbc\xdc\xfa\x4b\xf6\x62\xd0\xa2\xba\x33\xbb\xfe\xab\xb5\x70\xbf\x9e\xad\x29\xbb\xac\x18\x8b\x97\x79\xa3\x7b\x4b\xba\xb4\x24\xe8\x2d\x2c\x84\x3f\x61\xe5\x3a\x8d\x21\x09\xfd\x07\xca\xf9\xe2\xd9\x33\x02\x28\x94\xd9\x60\xee\x95\x15\xa4\x5e\xf8\x57\xd7\x3b\xb6\xf4\x3d\x36\x02\xa1\x01\xad\x51\x95\x76\x3e\x35\xee\xde\x35\xeb\xf1\xc3\x5f\x93\x00\xea\xb5\x41\x6b\xc6\xdd\x94\x61\x4e\xff\xfa\x25\x34\x7e\xf8\x93\x48\x00\x64\x87\x9b\x4f\x0c\x48\x88\x07\xe1\x44\xb3\x1d\xff\x45\xdf\xd3\x03\xb9\x6c\x99\x92\x48\xf2\xe9\x41\xa8\x94\xa4\x51\x40\xa0\x21\x55\xf3\x1d\x88\xc6\xc7\x19\xe8\x7b\xfd\xef\x92\xc6\x07\xee\xf7\x60\x0a\x60\x23\x6e\x7c\xc5\x23\x79\xf9\xd3\x04\x02\x77\x7d\xd8\x28\x17\x42\x36\x76\xca\xec\x9a\x9b\xfc\xf2\x48\xd0\x3b\x99\x9e\x62\xc9\x8f\x6c\x50\x6a\x16\xd7\x1d\x44\x4e\xe9\x17\xf5\x3d\x78\x01\x6a\x38\xe2\x4b\x0e\x89\x9f\x31\x4b\x18\x30\x66\xad\x13\x89\x75\x04\xf0\x7a\x30\x40\x9d\x3c\xdf\x2a\xd5\x88\xe6\x1d\xc8\xe9\xb1\x94\x65\xc5\x9f\x2c\xd7\xae\x04\xff\x71\xde\x7f\x07\x7b\x36\x99\x33\xef\x11\x0a\xe2\x91\x85\x3f\x79\xf8\x33\xed\x08\xb4\xd0\x68\xa1\x14\xab\x8c\x06\xdc\x2c\xa6\xe4\xcc\x46\xfc\x4f\xa2\x02\xe3\xab\xec\x3b\xb7\xa0\xb3\x85\xf2\xd2\x92\x5e\x30\x69\x82\x20\x09\x9b\x45\xe3\x8a\x2b\xf3\x97\xcc\xf6\x49\x59\xd0\x8e\x41\x56\xed\xb4\xfd\xfd\xe5\xec\x88\xc3\x22\xe2\x18\xc9\x8d\x7d\x2b\xcc\x91\x12\xd9\x5e\xb5\x07\xf1\xe5\x39\x60\x62\xc9\x89\x68\x80\x74\x97\x7d\x13\xc8\x3f\x36\xae\xc5\x65\x48\x92\xba\x1a\xf0\x8a\x4c\x53\x6f\x61\x19\x5b\xbc\xcf\x4c\x92\x3e\x98\x1a\x15\x35\x47\x35\x25\x50\x69\xed\xd4\x67\x50\x32\x51\x94\x30\xd4\x77\x1c\xc8\x1c\x25\x95\xa7\x61\x05\xc1\x46\x7c\x4a\xd5\x95\x5e\x6c\xe6\x58\x6c\xe6\xac\x02\x89\x92\x03\xad\x6f\x9f\x94\x37\xff\xd3\x68\x9a\x9e\x2e\x74\x0c\xfb\x85\x88\x26\x1c\x28\xbc\x78\xcd\x4d\xb2\x03\xea\x4d\xbd\xa9\xf4\x72\x66\xd1\xc3\xef\xf4\x5c\xd6\x9c\xaf\x8e\x51\x04\x59\x00\x1d\x38\xcf\x87\x8c\xbf\xe7\x45\xc3\xf2\x1c\x4c\xfe\xdf\x70\xb9\xba\x56\x63\x0a\xf5\x97\x69\xa5\x1c\x31\x15\xd7\xf5\xdc\xd4\x25\xbf\xe6\xfa\x7d\x1e\x7a\x7f\x13\x37\xd0\xc7\x17\x4a\xc4\x66\x87\x47\xf5\xed\x17\xdb\x8b\x24\xed\xc5\xce\xe7\x62\x6a\x9d\x0a\x7e\xa5\xcc\xca\x8e\x5c\x9a\x52\x08\x67\x08\x89\x13\x80\xbd\xd8\x3a\xd0\xc8\x90\x9c\x18\x22\x34\x92\xef\x27\x39\x50\x1a\xd6\x6c\x78\xac\xe9\xb8\xf1\x56\x71\x3f\x43\xc3\x08\x76\xca\xdb\x70\x61\x79\x70\x61\x7c\xb9\xc4\x63\xc0\x62\xfd\x7b\xb5\x79\x68\x1e\x74\x58\xae\xde\xc9\x9f\x0f\x1b\x36\xba\xa6\x63\x4f\x86\x2f\x50\x95\x3b\x52\x45\x28\x4d\x76\x30\xf1\x9a\x9b\xc3\xe4\xcf\x48\x5d\x13\xf5\xe1\x14\x98\x22\xcd\x1c\xeb\x8f\xd7\xe2\xaa\x2b\xec\xcc\x25\x9b\x99\x24\x44\x83\x78\x19\x7d\x1e\x04\xe1\x9d\xd1\xd5\xf4\xe1\xe0\x93\x72\xe2\xfb\x9f\x76\xf1\x51\xdf\x1a\xfd\xc9\x01\x78\x71\x05\xab\xf5\xe5\x28\x52\xd4\x05\x6f\x43\xc6\x6a\x7d\x58\x73\x53\x95\xce\x7f\xf2\xa7\x97\x96\x44\x0b\x82\x7f\x0a\x95\xc0\xb3\x28\xdd\x3c\xcc\xed\x9d\x68\x86\x94\xd4\x17\x36\x27\x94\xbc\x82\xf9\xee\x36\x27\x60\xb9\x79\x13\x1b\xe1\x0d\xaf\xa2\x54\xda\xe3\xb3\x9c\xc0\xd8\x8e\xf4\xce\xab\x7a\x65\x07\x42\x9f\x28\x48\x1e\x60\x80\xc0\x07\x59\x9e\x3e\xfc\xd2\x95\xb2\xc1\x04\x50\x29\x03\xd4\x1f\x6e\x90\xe4\x5a\x93\xab\x43\xf5\x42\xb8\xd0\x3c\xfa\x77\x1e\x35\x84\x49\x46\x72\x66\x03\x1e\xfe\x80\x49\xd2\x7a\xbc\x4c\x58\x67\xb1\x09\x7c\xcf\x1d\x20\xf6\xcf\x60\x0a\x82\x20\x63\x61\xe0\x9a\x30\x5e\x06\x65\xae\xfb\x39\x50\xd8\x72\x24\x2b\x04\xa2\xdb\x7f\x00\xa1\x76\xeb\x7d\xa0\xc4\x4e\x4a\x08\xc7\x7c\x12\x28\xfc\xd8\x7d\xb8\x89\x22\x33\xa0\x43\x76\xfd\x1f\xd3\x0b\xb3\x2f\xb0\xf8\xef\x4b\x5e\x20\xb7\x6e\x20\x73\x86\x9f\x1f\xb0\x37\x5e\x36\x8e\x28\xc4\x72\xdd\x72\x4e\xb3\xd3\xc3\x41\x16\x0b\x51\x46\xe7\x15\x6d\x3b\x62\x9c\xf8\x9e\x19\x5f\xf2\xf8\x17\x40\x1c\xe7\xb5\x91\x2b\x61\x36\x3d\x20\xcd\xa0\x04\xa0\x56\x69\xa9\x9d\xca\x93\x6a\x33\xa7\xbd\xb2\x5a\x71\xa3\xdd\x60\x37\x46\x0a\x05\x30\x2c\x0e\xf3\x9e\x4f\xd9\xbe\x22\x6f\x80\x6c\x7e\x94\x49\x5f\xb1\x92\xd2\xb7\x8d\x94\x7c\xb0\xc2\xff\xf2\x36\x2b\x21\xae\xf5\x98\xa5\x92\xd1\x00\x30\xc4\x30\xad\x7b\xbc\xdd\xe0\x9a\xfa\x52\xe8\xef\x6f\x1c\x65\x55\xd7\x0e\x4f\x52\x4c\xad\xd4\x6c\x4a\x97\x67\xb2\x68\xef\x48\xb7\xa1\x58\xc7\x9b\xc9\xdb\x58\x6e\xf8\x41\xe0\x3f\x0d\xfb\x17\x63\xae\x3c\x2d\x64\x39\xeb\x22\x1f\x10\x4f\x5a\x54\x92\x8a\x17\x5c\xe7\xa0\x40\x65\x1e\x51\x89\x2e\xb8\xb9\x40\xd7\x23\x93\x30\x08\xa2\xe4\x40\x35\xfe\x4b\x64\x29\x70\x75\x44\x1d\x5e\x19\x99\x31\x4f\xfd\x2e\x62\xc1\x47\x93\x4f\x33\x28\x04\x05\x8a\x90\x35\xbf\xab\x7a\x82\x43\x0a\xa1\x79\x2d\xb5\x16\xdb\xfe\xc6\x9f\x6a\x4d\x9e\xeb\xb3\xe7\xde\x4f\x69\xe8\xca\x61\xc5\x08\xdb\x14\x99\x67\xe3\xa6\x37\x32\x60\xf1\xc7\xbc\xda\xf4\x2d\xd4\xc4\x90\x71\x2c\xb2\x0d\xe7\xfe\x25\x97\x79\x11\xe4\x66\x35\x9a\xfd\x27\xda\x7f\xf4\x3d\x31\xa1\x70\x4f\x0b\x9a\x56\x68\x1d\xa1\x24\xa3\xd0\x08\xcb\x28\xac\x2b\xf1\xf7\xdd\x87\x9a\xab\x85\x99\x81\x80\xf9\xab\x6f\x3a\xcb\x3a\xfd\x1e\x74\xa5\xd5\x61\xb1\x75\xb7\x9c\x6c\x7a\x2c\xb2\x67\x29\xb2\x27\xc4\xa6\xd0\x57\x1e\x48\xce\x97\xec\xe8\x06\x03\x24\x78\x7e\x8b\x8f\xfd\x18\x59\x09\x35\xaf\x77\x30\x80\x69\x2c\xef\x19\xbe\x50\x18\x94\x3f\x85\xe6\xc3\x99\x8a\xd1\x85\x10\xeb\xf8\xc0\xfd\xc6\x72\xef\xc2\xd7\x3f\xfb\xb5\xfb\xdd\x39\xfd\x90\x02\x22\x81\xb6\x3c\x68\x56\xd3\x9f\x3d\x2a\x61\xc0\x66\xd7\x2c\x0a\x42\xef\x89\xc1\x80\x27\x91\xd6\x2b\x3a\x1e\x45\x27\xbe\x0d\x2d\xcc\xcd\xf0\x61\xc8\x7b\xa8\x69\x0f\x42\xbb\xab\x8f\xec\xbe\xf6\x23\x12\x73\x22\xd2\x7a\x16\x58\x38\x84\x1e\xdd\x4b\xb9\xbe\xe4\x9f\x32\x1b\xb1\xf3\xda\xfd\x46\x41\x40\x0f\x25\x64\x45\x91\x1d\x71\x06\x27\x02\x48\x21\xd1\xca\x8a\xca\x94\x0a\x00\x94\x6d\xe5\x9c\xb8\xa3\xc7\x17\xd3\x95\x18\x79\x33\x39\xa6\xb6\xff\x18\xcd\x7f\xaa\x3f\x1d\xf1\x5b\x79\x59\xd2\xf0\xc4\x4a\xe9\xc4\x2a\x69\xc0\x7b\x3a\x0f\xab\xce\x5f\x54\x4f\xa9\xee\x84\x3e\xbf\x94\x2c\x5e\x78\xc5\x44\xb6\x8e\x1f\x3c\x45\xd8\x9a\x51\xfc\xca\x43\x4f\x1e\x88\xa4\xb5\x4f\x30\xb1\x38\xbc\xb9\xe0\xb7\xbd\xfd\x57\x67\xc8\xda\xa8\xac\x05\x00\x40\xd5\x52\x39\x59\xf6\x7e\x1b\x83\xad\xcc\x09\xa8\x9e\x52\xe6\x38\x1b\xcb\x2d\x07\x2e\xb3\xfa\xda\x65\x1e\xe2\xe0\x77\xdf\xd4\xf6\xc9\xcf\x77\x66\x8e\x64\x4c\xc6\x5a\x5c\x2e\x88\xd6\x1f\x68\xaf\x15\xe9\x0f\xcd\x46\xde\xb6\x79\xd4\x36\x89\xf6\xcf\x23\x76\xb1\x5f\x29\x3b\xa6\x2b\xdd\x03\xf2\x49\x1f\xc7\xbc\x9e\xc4\x16\x0c\xe8\x12\xe3\xb0\x82\xa2\x76\xdb\x4a\x9e\x7a\xa8\x08\xbe\xd0\xdd\x7b\x62\xe9\x3e\x35\xab\x0c\xc3\xd4\x8c\x30\x08\x76\x60\x4f\xa8\x50\x60\x2a\x37\xaf\xee\xf8\x79\x41\x10\x04\x29\x5c\x5e\xbd\x07\x6b\x8c\x7d\x00\x39\xaa\xbc\xeb\xba\xae\xba\x30\x2f\xac\x0c\x4a\x0c\xfc\x3c\xab\x6a\x6e\x2f\xc2\xdc\xd0\x2f\xf8\x2f\x76\x87\xdb\x32\x79\xc0\x1c\x42\x4c\x3e\xe2\xdf\xb1\x8d\xca\x9a\x9e\x5b\x8d\xc9\xdc\x69\xd4\xbe\xc4\xde\x95\x97\xec\xd0\xbf\x33\x2b\xe4\xd1\x63\x7e\x87\x31\x7e\x36\x43\xce\xdb\x43\x01\x8e\xdc\x75\xc9\x57\xcf\xae\x70\xf0\x4c\xc6\xb3\xe4\x12\xb8\xe2\xa3\x7b\xc2\xa0\x70\xfe\x80\x08\xda\x83\xa1\x5a\x10\x69\xf0\x3b\xd5\x2d\x23\xdb\xad\xb0\x6b\xdc\x37\x7e\x09\x0d\xd2\xd7\x8b\xaf\x85\x39\xb9\xe1\x83\x43\x84\x29\xf1\x14\x50\x99\x2f\xdd\x79\xcb\x9a\x8c\xd0\x4f\xe1\xe2\x88\x5b\x54\xbb\xe7\x05\x6c\x45\xf3\x7b\x52\x6c\x01\xd1\x78\xf9\x4b\xb1\x34\x94\x2f\x55\xff\xcb\xbf\x6c\x1d\x8b\xb5\x30\x86\xf0\xdb\x2f\xa5\xce\xd8\xee\x00\xd0\x50\x2f\x6e\x46\x9c\x9b\x12\x96\x9e\x46\x03\xa3\x05\x5a\x30\x47\xe6\x42\x87\x52\xf9\x17\x01\xfb\xc1\xcf\x16\x34\x21\x50\xdc\xe9\x65\x63\x3f\x31\xfb\x81\xfc\xbb\xff\xcb\xc6\x62\x03\x2e\x3c\x9f\x65\xbd\x9e\x8a\xea\xa9\x6b\xa0\xe9\x26\x08\xda\xeb\x07\x1c\x34\x6b\x67\xe6\x38\xc3\xb9\x2c\x98\xa6\xcc\xd8\x76\x18\x61\x76\x1e\xd5\xed\x67\x20\xa6\x0a\x71\xc2\xc6\xe2\x42\x38\x36\x61\x67\x92\x34\xce\x6f\x21\xd2\xd1\x59\x62\xea\xd0\x5c\x88\x19\x1c\x12\x3c\xef\xa4\x69\xc3\x9f\x2b\xbd\xa5\x6b\x2c\xb1\xdd\xf0\xaa\x5c\x90\x94\xa9\x54\x1a\x9b\x7d\x66\x9c\xfa\x99\x3d\x8e\xed\x4c\xc8\x0c\x1c\xd4\x3b\xbc\xb3\x6c\x4d\xf3\xc1\xd2\x19\x37\xc5\x31\xff\xf8\x5e\x64\x7b\x47\xb5\x4d\xe4\x10\x9b\x86\x79\xc3\xa0\x5f\x64\xce\x64\xec\xa0\x76\x65\xd0\x22\x81\x7a\x66\x58\x5a\xe6\xa0\x9c\x1f\x4b\x7d\x78\xca\x3d\x19\x1d\xc1\x11\x83\x61\x29\x1c\x94\xcf\x1e\xec\x92\x4f\xaf\xc7\xfd\xc0\x3a\xfe\xf5\x2b\xb1\x7f\x76\xca\xeb\xc5\x43\x97\x82\x03\xc1\x96\x9b\xe8\xb0\xe3\x07\xba\x4b\x6c\xb1\xca\xd5\x83\x3e\x79\xd4\xea\x96\x70\x16\xce\xd6\xf4\x2c\x78\x5d\x2d\x8f\x66\x4d\x1d\xf6\x0b\x34\x4b\x38\xdf\x41\xb8\x56\x51\x2b\x6f\xcb\xd0\x92\x85\x77\x83\xc0\x0f\xb4\x87\xa4\x6f\xc2\x12\x7d\xe5\xf7\xe7\x77\xb6\x01\xa1\xd9\xb6\x8b\x67\xa4\xb0\x8a\x28\x80\x0d\x2d\x5b\x56\xb5\x9d\x69\x93\xf4\x44\x98\xbf\x81\x2d\xd8\x12\x9f\xe5\xf3\xd5\x95\xbd\x78\x0f\xfd\x9f\x0c\x1b\x9e\x7f\xed\xb2\x9b\x57\x3a\x13\x52\x9c\xd6\xde\xba\xf1\xb1\xe2\x9b\xce\xaa\xda\xca\xd7\xe7\xa7\xe5\x74\xc2\xd6\xb9\x6f\xbf\x1d\xcd\x28\x65\x05\xea\x08\x8b\x49\xbb\xfe\x1b\x8f\xe4\xa6\x1e\x51\x46\x87\xe4\x60\x01\x12\x81\x0c\xa3\xfd\x4e\x95\xb7\xb1\x3f\xf6\xf0\xc4\x84\xd2\x3f\xe1\xf1\x03\xd6\xae\x7f\x8a\xe6\xf6\xeb\xba\xaa\x1d\x93\xaa\xb6\xf0\xb7\x66\xda\x78\xac\xe9\xd2\x08\x87\xb3\x5e\xe5\x1d\x90\x2d\x8f\x3e\xb3\x03\xcb\x7d\x06\xad\x92\x57\xf6\xf1\x5c\xc6\x31\x7d\xcc\x6f\x92\xc3\xb9\xe6\xe3\xed\xe0\xdc\xff\xdb\x1f\x00\x93\xc3\xb9\x96\x87\x38\x79\xec\xc0\x1f\xe0\x06\x93\xa2\x98\xf4\xcc\x4d\xa9\x40\xf0\xf3\x03\xcb\xce\x0d\x47\x09\x29\xc0\x55\x04\x92\x89\x66\x98\x1a\x34\xde\xd1\x55\xd6\xe6\xb8\x2d\xd9\x60\x8a\x34\xbf\x9a\xe8\x58\x5f\xb0\x1d\x3e\xb1\x03\xb8\xa8\xce\xe9\x4b\xe0\x13\xcd\x0e\xcd\x85\x9f\xcc\x55\xda\x79\x55\x57\xbd\x91\x43\x4f\x33\x90\x3d\x4e\xdd\x79\xb3\xfe\x35\x0f\x78\xc0\xae\x67\x65\xaa\xb2\xb8\x7a\x5b\x31\xd3\x9d\x51\x1e\x4b\xda\x6c\x24\xcc\xad\xe5\x1f\x7e\xa9\x96\xa7\x6e\xf9\x13\xa5\x4a\xcf\xf0\x15\x25\x56\xce\x6d\x54\xda\xd8\x94\xbc\xb9\x56\x71\x0e\xca\x16\x43\xa4\x5b\x18\xc8\x38\x3e\x54\x03\x4e\x85\x8f\x4c\x59\x74\xa5\x38\x37\x31\xe0\x3e\x45\x60\xd6\x5f\xf7\xe0\x2d\xe8\xd5\x3f\x91\x87\x89\x7f\x35\xbc\x95\xad\x5d\x7f\x54\x7e\x02\x6d\xb3\xb6\xff\xfb\xef\xfb\xe9\x48\xc0\x26\xe1\xdf\x00\x66\xec\xf4\x20\x50\xf4\x94\x6f\xc6\xcd\x79\x51\xac\x4f\xa6\x98\x89\x5b\xe7\xc2\x7d\x52\x3a\x37\x7d\x13\x3d\xa7\x62\x8f\xeb\xc4\xab\xc9\x05\x21\x7b\x81\x06\xb7\x60\x66\xad\x0b\x6a\x38\xd6\x77\x4a\x94\xa0\x9c\xf8\x0c\x6b\x71\xb1\x84\x46\xe9\x09\x7f\x15\x5f\xa6\xbf\x84\x81\xee\x13\xd1\x66\xb8\x53\xe9\xbd\x89\xcf\x2d\xef\x66\xe0\x4c\xfd\xf6\x87\x02\x2a\xa1\x59\xec\xaf\xce\xbb\x1a\xce\x39\x50\x83\x68\xcb\xcb\xd1\xdf\xad\xeb\xa0\x76\xd3\xfa\xe8\x51\x97\xf2\xd2\xb2\x44\xad\xea\xba\xf0\x91\x5e\xf1\xeb\x81\x93\x66\xe3\xa4\x31\x24\x98\x92\xb4\x9b\x22\xd7\x08\x90\x60\xc3\x5d\x8c\x44\xc9\x9b\xeb\x02\x66\xb3\xc2\xaf\xe7\x3f\x1f\x3e\x4a\x88\x2c\xd0\x0e\x2f\xe5\x83\xbf\xb4\x3f\x3e\xda\x82\xf5\xd3\xba\x5f\xf8\x00\xa0\x4e\x1e\xe6\x27\x23\xf7\x60\x8f\xff\x04\x13\x81\x63\x98\x22\x4b\x69\x80\x7f\x38\xfb\x3d\x34\x5c\x2c\xd9\x4a\xec\x1b\xf3\x0e\xc1\x30\x24\x9c\x77\x72\x8c\x20\xf4\x8c\xd5\xf4\x5f\x2f\xf2\x2c\x61\x6e\xbb\xe5\x6d\xe4\x9d\x64\x0b\x3b\xfc\x40\x77\x2c\x24\xef\x40\x98\xc1\x25\xf3\xab\x7f\x9b\x66\xc0\x4f\xf9\x95\xea\x6f\xc1\x00\xb0\xbd\x91\xf0\x8b\x17\x81\xcb\x0d\x69\x61\x86\x24\x0c\x1e\xdf\xe6\x07\x82\x24\x81\xea\x68\x1a\x8e\x91\xeb\xbd\x5e\x0d\x76\x39\x80\xf9\x4e\x76\x20\xd3\x97\xe3\x37\x53\x0c\x3d\xf7\x81\xf0\xc6\xb8\x5b\x4c\x0e\x52\xf0\x4b\x16\xaf\xe9\xba\x32\x0b\xe5\xd7\x33\xfb\xd1\x14\x56\x20\x02\xf9\x14\x27\x72\x87\x0f\xd4\x92\x58\x4d\x5b\x10\xd1\x41\xc1\x96\x20\xb5\xac\x46\x1b\xfc\xfe\x6c\x2a\xb3\x5b\x49\x7d\xf7\xf5\x8c\x30\x33\xff\x8c\x91\x76\x6e\x20\xff\x98\xd1\x9c\x57\xa5\xfd\xf3\xca\xb6\x2e\x61\x27\x9a\xff\x31\xe5\x42\xfa\x83\xe4\x50\xef\xff\xb1\x74\xd6\x5a\xd3\x32\x4b\x14\xbe\x20\x02\xdc\x42\x9c\xc1\xdd\x32\xdc\xdd\xb9\xfa\xb3\xde\xef\x3f\x93\x4c\x32\xb0\x58\x3d\x5d\xb5\x9f\xdd\x54\x57\x5b\xef\x1b\x73\x75\xc9\x8f\xb4\x73\xcd\x0c\x1c\xd9\xd0\xf1\x4b\x0d\xc6\xc3\xa6\xb0\x99\x5d\xae\xd9\x05\x90\x93\x04\x99\x5c\x0b\x39\x80\x8d\x94\xab\xd7\x74\x5c\x52\x82\x2e\x25\x4e\xf8\x03\xcd\xf7\xcb\x1b\x67\x46\x32\x6b\xb2\xf5\x73\xc4\xdb\x38\x14\x1d\x5f\x61\xf7\x50\x75\xf7\x2d\x84\x17\xce\x1b\x52\x2a\xb7\x30\x8e\x6d\x48\xa5\x0e\xe1\xf8\x41\xec\x17\x21\x9d\xa3\x25\xb0\x36\xaf\xf1\x82\x39\x4e\x66\xaa\x0c\x04\xa3\x62\x23\xd3\x24\xce\xff\x75\x1f\x4e\x91\xec\x36\xf0\xfc\x9b\x3c\x2d\x33\x25\xaa\x82\x83\x56\x87\x21\xe6\x9c\xd9\x4d\x56\x9c\x08\x9b\xbe\x4b\x85\x5f\x80\xd1\xf9\xb0\x98\x9b\x3a\x6f\xfc\x5b\xaf\xda\x37\xe6\xa1\x67\x96\xed\xaa\x08\x6e\x4c\x48\x1b\xf1\x32\x29\xaf\xc9\x51\xfa\xed\x62\x30\x50\x34\xa7\x0f\x33\x56\x60\xea\x4c\x38\xce\xc5\xd8\xff\xd5\x2d\x3b\x24\x61\x88\x66\x07\x46\x9d\x16\xc8\xac\x8d\xbf\x0d\xef\x53\x5e\x32\x79\x9c\x17\x4c\xd2\x30\x42\xe5\xaa\x18\x07\x87\xba\x0c\x92\x29\x2c\x48\xc1\xc4\x1c\xb7\x2f\x03\x33\xff\xfb\xcd\xfe\xc4\xac\x71\x1c\xa4\x29\xf1\xec\x03\xbe\x54\xc7\xdf\xae\x70\x34\x71\x28\x53\x68\xd4\x30\xb7\x97\x1c\x48\x5b\x2f\x6a\x2a\x3d\xad\x72\x77\x6d\xf5\x60\x21\xcd\x05\xd2\xea\x0f\x8a\x4d\x95\x96\xce\x74\x0d\xcc\x88\x88\x30\xcc\x4a\x1b\x8f\xb2\xb7\x20\x8e\x58\x89\x75\x16\x1a\x47\x08\x6f\xaf\xee\xff\xdb\x57\x3d\xc8\x44\xf2\x20\xea\x13\xeb\x79\xfb\x16\x3f\x22\xe8\x67\xcf\xab\x50\x7c\xaf\x54\xa9\x8e\x45\x16\x45\x71\x3a\xf6\x02\xbe\x86\xf4\xbe\x6c\x47\xbd\x6b\xb1\x43\xb5\x05\x1f\x36\xa2\x40\xf6\xd8\xfb\xa7\xc7\x52\xdd\x72\xb7\x25\x83\x40\x65\x92\xbb\x69\x5b\xc4\x99\x23\x95\x09\x80\xf7\xec\x1b\x4f\x42\xd1\xe5\x35\xd9\xb8\xd9\xce\x2b\xa1\xb7\x4e\xe2\x9f\x21\x7f\xde\xe0\xcf\x60\x40\xcc\x8a\x8f\x49\xc4\x66\xd6\x4d\x8c\xb1\x78\x71\xf7\x29\x62\xaf\xa8\xe1\xeb\x50\x87\x15\x3a\x22\x9b\x0f\x1b\x9f\xad\x1d\x79\x16\x1d\x07\xfe\xe3\x65\xa3\x49\xa8\x1e\xab\xa9\xd8\xaa\x07\xc6\x77\x4b\x4f\x26\x4b\xf4\x30\x9d\xdb\x9c\x39\x3e\x58\xbf\x9f\x63\x66\x9b\x52\x5d\xf1\xae\x7f\xba\xe7\xcb\xfc\xac\x73\x77\x29\xbe\xe6\xed\x7f\xb3\xc6\xdd\xd7\x85\xaa\x19\x22\xe0\x8e\x66\x3c\x05\x73\xe4\x67\xa4\x0d\x41\x10\x84\x52\xec\x26\x55\x8e\x1a\x9f\xdc\x3d\x44\xc3\xe3\x1e\x0f\xd3\x54\xb5\x6b\xfe\x6c\x3b\x4c\x22\x39\xbd\x4b\xbc\xd8\x2a\x30\x8d\x29\xf3\xbb\xb9\x02\xd3\x40\xda\x70\xe6\x63\x54\xdd\x2a\x8f\x17\x06\x13\x0e\x13\x9a\xd8\xbf\x85\x7e\xc9\x16\x49\x6f\xd4\x30\xf5\x76\xeb\x57\xea\x16\x80\xd6\xf8\x31\xd3\x4d\x51\xa0\xf9\xf5\x99\xa7\xe8\xaf\x9b\xf8\x57\x00\x1b\x36\xc3\x06\xd4\xa8\x14\x51\x08\xef\xab\x64\xa6\x68\x76\x88\x02\x4f\xe6\x2c\x4e\xef\x77\x22\xcf\x80\xec\xfb\x05\xf7\xaf\x05\x07\x6b\xb4\xdf\x00\x3d\x16\x86\xd5\xc2\x3e\x5a\x3b\x3d\xec\x25\xcd\x36\xa7\x55\xb5\x18\x31\x95\x08\x5b\x3a\x02\xc2\x6f\x86\xd8\xef\xf0\xce\xb3\x35\xcd\x06\x54\x21\x91\xde\x43\x05\xa2\x13\x30\xb7\xdb\xaa\x01\xf4\x92\xa7\x56\x33\xc9\xca\xad\xeb\xba\x99\x8f\xee\xb4\xa3\x30\x46\xfe\x5b\x58\x6d\x6f\xb7\xf4\x4f\x7c\x47\x65\x4c\xe8\xb2\x4b\x04\x38\xfe\x08\x8b\x71\xde\xe8\xc3\x38\xa0\xb2\x70\xa0\x9a\x98\x7b\x5d\xd7\x74\xb7\xf2\x07\x30\xfd\x58\xa8\x39\xd6\xc1\xcf\x6c\x02\x62\x14\xca\xac\x76\x1f\x14\xaf\xc7\x6f\xa3\xba\xe8\x15\xce\x52\x05\xea\xa1\xc2\xf3\x27\x4b\x23\x33\x8c\xe3\xfe\xb4\xff\x4d\xe9\xf2\x8d\x63\xdc\x60\x37\x83\xcb\x3c\xd1\x1d\xfe\xc2\xc3\x16\x86\x85\xf3\xfa\xcc\x98\xbe\xe6\xdf\x71\x21\xaa\xd4\xcc\xc9\x98\x9c\xd9\x4c\x0a\x3f\x7b\xa9\xf4\x64\x64\x22\x1b\x94\xff\xf8\x6b\x8e\xd4\xd2\xea\x15\xe4\x85\x8e\x5f\x06\xbf\x12\x89\x4c\xd1\x86\x0e\x30\x6f\xdf\xa6\x21\x3a\x54\xce\xd7\x05\x72\x57\x64\xe7\x60\xd4\x1c\x05\x44\xbf\xae\xb1\x84\x50\xe0\xf4\x58\x72\x67\x0a\x2c\xd7\x2e\x6e\x38\x9c\xbf\x8d\x3b\xb7\x56\x7e\x18\x06\x41\x48\x92\x2e\xaf\x88\x7f\x23\x77\x37\xf1\x39\x65\xdb\x1d\xd3\x1b\xe7\x07\x02\xd7\x55\xed\x7a\xfb\x2a\x09\x76\xfb\x80\x7e\x3f\x4d\xcc\xb4\x1c\xd3\xaa\xee\x7c\xf7\xbe\x98\xdf\x8e\xf0\xb6\x9c\xe0\x30\x62\x27\x5d\xa6\x59\x96\xfb\x49\xc4\xb0\x02\xdd\xf3\xfc\xe3\x4e\xd3\xd5\xd7\xf5\xc7\xa9\x35\xd7\x38\xac\x6b\x5b\xbc\x2c\xd7\xd5\xc9\xe6\x24\x8c\xa3\x85\x13\x6c\xe5\xb6\x90\xe0\x46\x59\xf8\x37\x59\x66\xd0\x15\x60\x90\x18\x05\x1a\xc0\x41\x06\xad\x6a\xbb\xcc\x42\xcd\x32\xeb\x9e\x03\x45\xa5\xfa\x13\x80\xdc\x43\xe2\xfa\x9a\xb8\xde\xbd\x00\x65\x05\xcf\x73\x3f\x3e\x47\x7f\x88\xd1\xd5\x75\x24\x3d\x7b\xfa\x2a\x5d\x4b\x4f\xd1\xe9\x69\x15\x0b\xdd\xdc\xf8\xa6\x99\x57\xc3\x50\xdf\x0b\xa7\x92\xe1\x56\xb4\x76\xe1\x37\x31\xec\x6d\x16\xa5\xd5\xc9\xf6\x70\x89\x4d\x02\x81\xb5\x16\x02\x37\x6f\x44\x36\x01\x7a\x72\xa6\xc8\x9d\xf2\xf9\x3b\xdb\x11\x2c\xc7\xfd\x60\x0e\x3e\xb2\x40\x07\xf1\x46\x3e\xd6\xb3\x98\x12\xd8\x30\x8e\x9e\x00\x15\x8f\xd9\x81\xea\x26\x24\xfb\x54\x91\x7d\xc3\x86\xf3\x92\xbb\xe3\x0d\x8c\x75\xaa\xaa\xca\x94\x33\x8d\xec\xd4\x71\x5d\x6b\xac\xd2\x6d\xed\x60\x6c\xf6\x17\x66\x06\xf1\xe5\x05\xb1\xb8\xaa\xef\x72\xee\x16\x10\xb8\xea\xf5\xb8\xc4\x73\x13\x8f\x81\x02\x65\x79\x90\x22\xee\x6d\x0a\x94\x7a\xce\xef\xe5\x62\xdf\xf9\x31\x0f\xe7\x8e\x9b\xd1\x10\x07\x71\x8b\xc6\xae\xdc\x84\xc1\x90\x24\xc2\xb1\xc3\x20\x08\xd6\xf5\xce\xfc\xca\x97\x8a\x04\x4f\x78\xcc\xd7\xfd\x52\xb5\x9d\xe7\xf3\xb7\xeb\x31\x24\x1e\x3f\x4e\xef\xc7\x74\x6c\x66\x44\xc5\xe9\x12\x72\x02\x64\x7e\x8d\xae\x44\x14\xb2\x2e\x60\xd3\x7d\x73\xc8\xdb\x33\xfa\xec\x92\x1e\xb8\xa9\xcf\x35\xe5\x0e\x61\xd4\xd3\xbf\x7d\xf1\x29\x2b\x13\xdd\xc3\x3c\x64\x20\x0b\xa5\xc1\xbd\x0e\x81\xd2\x12\x5a\xa5\x4d\xa4\xf5\x2c\x28\xec\xaa\x95\xbd\x0e\x89\x12\x6d\x6d\xd4\xae\x35\xc6\xf4\x92\x19\x6b\xe4\x0b\xff\x1d\xcb\xf6\x52\x95\x85\xa6\x85\x5d\x77\x43\xb5\x41\x04\xb4\xdf\x07\x3c\x48\x4e\x9b\x6c\xbf\xd5\xac\x67\x83\xcf\x90\x64\xd8\x47\xbf\xb4\x64\x0e\x5a\x54\x5f\xda\x66\x6c\x7a\xa9\x4b\xe5\x81\x1b\xb0\xb5\xc2\xe2\xee\x5d\xcb\x51\xf6\x7d\xd8\x92\xb5\x8d\x8e\x34\xb1\x88\xfb\xa1\xc4\x63\xb1\xb6\x53\x5f\x36\x68\xc3\x97\x31\x7d\x7f\x8e\xbb\xae\xc3\x56\x7f\xf3\x81\x93\xb2\x25\x33\xe7\xd5\xec\xc6\x2e\xb9\xf4\x2e\x4e\xd3\x71\x58\x51\xf2\x80\x14\xf1\xaa\x1b\x1d\xb7\x16\x84\xfc\x7d\xb0\x21\x74\x0e\xc8\x49\x37\xea\x1e\xa4\xb8\xc2\xd9\x61\x4a\x99\x32\xb8\x93\xff\x2b\x65\x27\x10\x8b\x71\x2d\xfb\x45\x75\xe1\xb7\xb9\x0e\xc6\x66\x7e\x66\x84\xed\x01\x40\xb3\x54\x0a\x56\x13\x0a\xa2\x13\x2c\xf4\xfb\x7a\xae\xbe\x95\x1d\xab\xa3\x02\x60\xd7\x30\xf8\xc9\x41\x04\x0d\x5a\xe4\x4f\x14\x1b\x3f\x94\xbb\x81\x92\x54\xc4\x54\x7a\xa2\xe0\xf5\xce\xf8\xdc\xa8\x48\x3a\x16\x97\x4d\x16\x5c\xd9\xbd\x22\xa1\x80\xb0\x88\xcf\x9a\x3e\x4a\x9e\x3a\x44\x56\x6b\x87\xf8\x6d\x7b\xdc\xe5\xe0\x74\xde\x58\xda\xaa\x8d\x3b\x43\x95\x25\x8f\x1e\x5a\xda\xf4\x58\xca\x6a\x56\xa7\x5e\x86\x6e\x42\xe7\x50\x9b\xfa\x1e\xbc\xbb\x2a\x7f\xfc\x02\x43\x72\x3f\x86\x88\xce\x47\x28\x46\xef\x75\x4c\x75\xbf\x47\x77\x85\xd5\x81\x8e\xbd\x50\x32\x5c\xc0\x6f\x3d\x10\x1d\x28\x97\x3f\x9b\x61\x5a\xbd\xd3\xbf\xdf\x6b\xfc\x32\x9e\xa6\x75\xdf\xd6\xa4\x73\x1c\x04\x23\x63\x61\x45\x1c\x92\x32\x12\x1e\xfa\x1e\x54\x21\xd4\x82\x33\x1d\x93\xd1\xd1\x2a\x8b\x3a\x73\x4e\xa7\x65\x17\x32\x97\x49\x7b\xf3\x5e\x31\x85\x1e\x9b\xed\xb3\xfa\x00\xf0\xd2\x6b\xee\x61\xd3\x86\x47\xab\x16\x6b\xe3\x51\x39\xed\xa8\x69\x9c\x7d\xea\x1a\x2a\x6a\x7d\x77\x76\x52\x2e\xbb\x77\x8d\x3b\xd1\xea\x14\xb8\xf7\x0e\xd1\xa2\xc7\x57\xdb\xa4\x52\xca\xd9\x60\x82\x2e\x97\xd3\x7f\x8c\x97\x39\x24\x34\xda\xc6\xc9\x5b\x6a\x5b\xfb\xf4\x4b\x33\x51\xaf\xfe\x89\x73\x3a\x44\xc9\x89\x52\xf2\x5c\x45\x64\xcd\x41\x85\xec\xd0\xc7\xf8\xe5\x6d\x58\x56\xdf\xac\x87\x63\x9e\xee\x6a\x66\xc0\xa2\x35\x3d\xbf\xdd\x17\x44\xf6\x0e\x2b\x3d\xd5\x6c\x96\xe1\x98\x01\x3b\x45\xfe\x77\x06\x82\x15\x21\x6a\x92\xc3\xfe\xbe\xa5\x88\x32\x34\x69\x35\x60\xc0\x88\xfd\xbe\xc2\xaa\xef\xbd\x0e\xc2\x20\x08\x0e\x54\x63\xd8\xcd\x27\xc7\x63\x24\x4b\x7b\x7a\x39\xbf\xca\x4b\xcb\xe3\x0f\xc6\x64\x34\x79\xf1\xe5\x1c\xf5\x07\x8b\x19\x1c\x85\xfd\x15\x80\xac\x83\x69\x23\xcf\x4a\x77\xef\x9b\xba\xae\xed\xc8\xb1\x35\x8d\x16\x42\xe0\xaf\x65\xd4\x60\x94\x5c\xf7\x19\x46\xb3\x22\xa6\xc6\xb2\xc3\xb5\x25\x85\xdf\xa6\xf2\x7c\x09\x05\x00\x15\x98\x97\x5a\x0c\xa5\xdd\xab\x77\x24\xfd\x02\x9d\xd7\xde\x4d\x03\x2e\x6a\xe9\xa1\xe4\x81\x0d\x23\xa4\x7e\xfc\x25\x2b\x18\x09\x13\x34\xb2\xb9\x0b\xd3\xa7\x0c\xc3\xd9\x42\x93\x67\x2e\xe1\xe6\xeb\x3a\xaf\x84\x8b\x0a\x75\x44\xb5\xc0\x7b\xcf\x2a\x52\x05\xf3\x9e\x01\xcc\x1d\xff\x1a\x5f\x7d\x13\x8f\xd0\xaa\x26\x2e\xc5\x39\x95\x14\xc8\x40\x49\xfa\xc5\x2b\x80\x2a\xa9\x50\x95\x3b\xa7\x35\x11\x46\xa1\xec\x72\xc2\xce\xdf\xb9\xfd\x5b\x07\x3e\xfa\xb7\xc6\x4c\x4e\x68\x74\xcf\x4f\x64\x3d\x08\x96\x54\x6d\x52\x2d\x8c\x12\x67\x80\x7e\x67\x7f\xde\xdc\xaf\xd3\x27\xdc\x99\x33\x49\x73\xd0\x82\x73\x62\x4c\x0b\xb7\x00\x3a\x34\x17\xef\x33\xc1\x28\x58\x86\x1a\x46\x22\x7d\xcf\xed\x20\xde\xd4\x31\x52\xa9\xf6\x57\xb5\x5d\x91\xac\x18\x55\x53\x63\x15\x18\x21\x8b\xef\xd7\x8c\xfe\xba\x2e\xab\x2b\x00\x8d\x77\xd3\x5a\x89\x96\x68\xb6\x0b\x1c\xe0\xbc\x67\x6a\xd0\x55\x20\x93\x8c\xc0\xd8\xb7\x0f\xc2\xa3\xd3\x27\x2d\x57\x0c\xd2\xd8\x6c\xc2\xfb\x1e\x9d\x88\x5c\x73\xad\xb2\xf1\x8f\xdb\x38\x50\x6c\x41\xba\xc3\x4b\x08\x37\xf9\x63\x2d\x3d\xd6\x8e\xc4\x10\x2d\xae\x5f\x80\xed\x41\x12\x06\x53\x82\x14\x75\x7d\xdd\x6c\xe9\x77\x33\xbd\xa5\xd2\x86\x10\xc6\xc8\x67\x4a\xef\xb6\xa1\xf7\x3d\x33\x02\x1f\x59\x38\xbb\x77\xa6\x7c\x3b\x06\x54\xe7\x17\x2f\x96\xe0\x9d\x53\xb5\x20\xeb\x41\x76\x38\x59\x9c\x53\x75\xc0\xf2\x84\xf5\xaa\x94\x19\xe3\x4b\x15\x60\x71\x7a\x3e\x64\xcc\x04\x75\xfe\x31\x5b\x8d\xd4\x11\x12\x22\xb7\x44\xcf\x3a\xed\xbd\x52\xa9\xf0\x7b\x99\x94\x01\x18\x45\x03\x37\x99\xdd\x9c\x12\x27\xd9\xad\x36\xc5\xa8\xb5\xf8\xd2\xe5\xc4\x1f\xa4\xd8\xc2\x06\x72\x65\x27\xba\x98\xec\x80\x66\x21\x55\x45\x9f\x12\x5c\xff\x7a\xf5\x58\x28\x4a\xb9\x1a\xcf\xf4\x6f\x61\xf6\x13\x92\x16\xc0\xe6\xbf\xb9\xc6\x31\x83\x6f\x31\x8c\xf3\x07\x05\x8e\xda\x2f\x7e\xc7\x43\xe0\x9a\x9a\xfb\x26\xbc\xf7\x61\x69\x6f\xbe\x64\x62\x02\x78\xbf\x3e\xba\x81\x09\x79\x93\x27\x8f\xc4\x15\x2e\x4f\xfb\x38\xbd\x36\x0a\x36\x18\x1a\xba\x01\x7c\x9d\x68\x21\x7e\x5a\xce\x57\x94\x5b\x03\xd3\x71\xd4\xd4\x71\x08\x97\x4c\xc2\xc0\xe0\x30\x8c\xb9\xba\x42\xa4\xbe\x3b\x9e\x5f\x91\xb7\xf4\xbb\x75\x02\x56\x74\x74\xf1\xa8\x02\x85\x90\xaf\xea\x7b\x79\x10\x6d\xf0\xf5\xac\x47\x9f\xb2\x83\x99\xde\xd9\xbb\xc8\x48\x1a\xc0\xa8\x9c\x9b\x26\xf3\x5c\x59\xf8\xa3\x57\x03\x66\x57\x50\x36\x68\x22\x0c\x17\x51\xfc\x13\xd9\x3a\x17\xf5\x6f\xae\xa7\x03\x2f\x13\xab\xcc\xb1\x88\xc1\x00\x30\xdb\x9d\xfc\x57\xad\xd1\xf6\x80\xd6\x84\xdf\x02\x2f\xd4\x11\x4c\x98\xdf\x9e\x49\xcd\xec\x6a\x1a\x47\x9c\xd7\xd6\xb7\x8e\xd9\xbb\xd7\x45\x01\x95\x15\x5c\x20\xd6\x96\xd4\xd0\xb9\x32\xe5\x32\x0c\x83\x07\x70\x10\x38\x11\xf3\x45\x60\x6a\xec\x85\x92\x14\x91\x0f\xdf\x85\x82\x59\x4c\x18\x3e\x79\x59\xbb\x89\x0e\x54\xd5\x6e\x6b\x5f\x4c\xa8\xf5\xda\x69\x87\xad\x5d\x91\xab\x90\x3f\x95\x32\x7b\x48\xe7\xab\x0b\x26\x31\xf0\x66\xae\x07\xec\x6e\x53\xed\xe8\x4a\x9a\x63\x24\x18\x9c\xe8\x89\x6b\x90\x3a\x3d\x6a\x50\xec\x28\x70\xc3\x12\x3e\xb2\x48\xee\x1e\x28\xb3\x26\x2f\xa6\xc3\x2b\xba\x68\x60\x02\x12\x2e\x39\x43\xd2\x18\xeb\xe8\xc3\x97\xd0\x1f\x78\xfe\xd4\xeb\x5d\xe5\xf6\x1a\xb8\xb5\x05\x21\x88\xc4\x28\x98\xbe\x01\x65\xb6\x1a\xcb\x1c\x29\x79\x9e\x65\x0e\x00\x2c\x9f\xdc\x13\x28\x2b\xaf\x79\x67\x81\x66\x0f\x63\x56\xfe\xa5\x2e\x6d\x78\xf1\xd4\xab\xf2\x91\xd5\x20\xbb\x85\xd2\x39\x50\xf1\x11\xf8\xd5\x25\x50\xc4\x7a\x3b\xad\xfd\x6b\x71\x6f\x0e\x9b\x6f\x0f\xdd\xd2\xf4\x72\x59\x93\x1a\xc8\xe8\xe5\x47\xb8\x05\xfc\xf5\x17\x2f\x48\xfc\xa6\xaf\x4e\x2b\x84\x7d\x44\xd6\x3e\xea\xe3\x3e\xaf\xef\x79\x6b\x7d\x0a\x54\x32\x28\xe2\x9a\x73\x9b\x09\x0d\x94\x57\x26\x09\xc5\x89\xc8\x32\x28\x23\x64\x71\x1d\x21\x59\x28\x33\x60\x3f\xd7\x68\xf6\x90\xff\x63\x46\x0b\x91\x9c\x0a\x6a\x1c\x0c\x2a\xbd\xec\xd3\xdf\x7d\x53\xc5\xfc\x0c\x7b\x14\x4a\x18\x4c\x55\xdb\x79\x1d\xbd\x64\x24\x32\x0a\x2c\x65\x9c\xce\xf2\x12\x3c\xaf\x48\x04\xc0\x3d\x10\x9d\xfc\x25\xa0\x8b\xb7\x75\x4d\xe5\xab\xbc\xd3\x55\xdf\xe4\xd9\xed\x74\xa2\xe4\x8e\x85\xdd\xdb\x35\x05\x01\xc0\x0b\xcf\xb5\xa5\xd8\xc7\x10\x6c\x31\x14\xac\x76\xc7\x34\x3c\x67\x09\xb7\xa0\x51\x72\xd3\xc7\xa0\x1f\xa2\xad\xef\x95\x18\x2e\x11\x0c\x49\x20\xe0\xb3\x1f\x88\x4f\x51\xf1\x4c\xdf\x94\xa4\xd8\x55\x7a\x59\x3f\xb5\xc4\x6c\xec\xaa\x34\x12\xbb\x34\x71\x28\x72\xdc\x30\xbc\x12\x96\x2b\x30\xe3\xec\x1c\x2d\x38\x7b\x26\x5d\xd1\x86\x2a\x03\xbe\x17\x51\x04\xf7\x73\xa8\x51\x97\xf5\x42\x4c\xbd\xfc\x58\x55\x11\x77\xbc\xfa\xfd\x10\x58\xfd\x57\x8f\x4e\x9c\xdb\x5c\xdf\xb7\x58\xf4\x3a\x4f\x96\x08\x39\xa2\x75\x2c\xb0\x54\xa8\x7a\x42\x63\x0e\x7d\xe6\x33\xae\xe8\x18\xfd\x0a\x5a\xc4\x5f\xd0\x2b\x20\xdd\x10\xe3\xb2\x46\xc6\xf8\xa5\xc4\xbe\x49\x9e\xfd\x04\x04\xe5\xf2\xbf\x6f\x81\x24\x4f\x39\xa1\xa2\x4f\x06\x2f\x69\x66\x38\x3d\xdc\x25\x7f\x4b\x8e\x2d\x08\xa0\x48\x2e\x67\x83\x80\x70\x58\x92\xe2\x44\xfd\x21\x3a\x3f\xfc\xd6\xf9\xec\x40\x88\xe6\x4a\x84\x20\xb7\xb4\xfe\xbe\x73\x4b\x60\xf2\x10\x03\x2d\x1c\xed\x88\x8e\xe3\x41\xae\xee\x0d\x00\xcc\x2c\x08\xc8\x59\xa6\x1e\xf6\x30\xe7\xeb\x3c\x7d\x8e\x6d\xb9\xb1\xc2\x37\x75\xc6\x96\xca\xca\x9a\x60\x4e\xe0\xba\x8f\x38\xfc\xad\x5e\x83\x85\x20\xd9\x6f\x2d\x49\x8c\x2b\x4d\x85\x84\x34\x13\x8b\xd8\x37\x47\xf5\x48\x0b\xde\x1f\x9c\x80\x6e\x30\x1c\xd9\x89\x68\x09\x55\x03\xc9\x58\xfc\xe6\xca\x7c\xb1\xdd\x9e\x55\xae\xae\xdf\xff\x8f\x83\x89\x81\x12\xe5\x4c\x83\x36\x03\xce\xbf\x7d\xed\x67\x74\x8b\x83\x3f\x6f\x82\x4d\x55\xde\x32\xdf\x73\x81\x17\xcf\x92\x5f\xd1\x83\x91\xe5\x62\x2f\x22\x78\x41\x6f\x60\xbe\xdf\xc7\xf6\xf8\x62\xe3\xdd\x2b\xf2\x9c\x92\x84\x41\xe0\x07\x45\x3b\xfa\x90\x2d\x24\x06\x22\x71\x86\x91\xb5\x5b\x80\xd0\xf8\x89\x66\x07\xd2\x5c\x0b\xff\x9a\x9d\xf1\xa2\xc9\x0b\xb6\xb7\xbc\xf2\x68\x01\x65\x86\xd4\x30\xbb\xce\xbd\xfb\xf6\xfb\x12\x8a\xa4\xdc\xba\x0f\x44\x27\x64\xf1\xbb\xb9\x4a\x0f\x94\xe0\xa7\x80\x79\x9b\x81\xe8\x17\xc3\x25\x5f\xaa\xb7\x05\xfc\x54\x45\xa9\xd3\x18\x4a\x8d\x50\x19\x86\xdf\xab\x77\xf9\x74\x8a\xd5\x20\x66\xc2\xb7\x8f\x43\xb8\x41\x36\x31\xa4\xd7\x15\x66\x31\xd5\xfe\x56\xc7\xd9\xb7\x51\x04\x72\x96\xad\x1f\xb6\xa9\x65\xc0\xfd\x92\x84\xcf\x66\x5d\x26\x80\x69\x73\x09\xab\xf7\x9c\x1d\xe9\x2d\xa4\xe4\x35\xb0\x45\x8d\xf1\xa3\x80\xca\x14\xb0\x4b\xbc\x60\xed\x47\xc4\xac\x87\x14\x53\xd2\x69\x5d\xd9\x4b\x9c\xcb\x39\x1d\x5e\x59\x38\x93\x98\xa9\x6f\xf8\xf9\xa4\x60\xfa\xe8\xf9\x35\x22\x1c\x5a\xc6\x0f\xbc\x0e\x1d\xea\x7b\x7c\x16\x0e\x27\x4b\xbb\x47\xdd\x49\xf2\x43\xbc\xf9\x83\x90\x8e\xdb\x0a\xed\x81\xa6\x08\x6e\xd4\xd9\x3a\xad\xba\xfb\xd6\x81\xde\xab\x88\xd7\xd8\xe4\xfc\xb7\xa4\xe1\x40\x57\xe4\x24\x42\x06\xd7\xce\xed\xd9\x77\xc2\x6b\x9c\xa4\xb3\xbf\xd5\x2a\xd5\xec\x4c\x5e\xd6\xf4\x41\x0f\x1e\x87\x12\x31\x99\xcf\x5e\x0f\x47\x9d\x22\xc3\xf2\x77\x9f\xfd\x0b\x42\xec\x2d\x4c\x81\x59\x45\xa8\xed\x70\xe4\x08\x37\x00\xac\xe8\xb6\x88\x67\x25\x2d\xac\xc9\x9b\x2b\x89\x6b\x87\x7b\xad\xac\x51\x10\xa9\x1b\xba\x99\x62\xe1\x0d\x40\x6b\xdb\xf9\xd4\xfe\xe6\xce\xe0\x47\x8a\xe8\xe4\x11\x65\x46\xe6\x73\x0b\xe8\x98\x8e\xcb\xfa\xc7\x45\xfb\x68\x65\xf4\x40\x55\xf3\xdb\x5f\x1a\x09\xfe\x1a\x4e\x16\x41\xed\xa5\x58\xb0\xba\x84\xf7\xbd\x5d\xba\x3c\x91\x6e\x26\x52\x61\x7f\x71\x08\x87\x38\xb0\xfd\xd7\x53\xd0\x9a\x36\x81\xf8\xb1\xfa\xc8\x3b\x8a\xb4\xee\xf0\x4e\x9a\x2f\xbe\x13\x49\x0b\x3a\xe1\x85\xce\xdd\xbb\x03\x95\x15\xe9\xa1\x80\xeb\x99\x0d\x42\xba\xec\xa5\x3a\xa9\x9e\x97\xcb\xd9\xea\x39\x71\x4d\x75\xd1\xe1\x6f\x91\x72\xbe\x6b\x44\xba\x56\x68\x67\x06\xa5\xf0\xb9\x19\x9d\xd1\x3c\x13\x6d\x74\x21\xb2\x9b\x56\xe2\xcf\x3c\xd0\x3f\xfd\xc9\x64\xb7\x3f\xb4\x16\xad\x11\xf2\x05\x4c\xb9\x1b\x5e\xeb\x62\x28\xa9\x75\x1e\x98\xc0\x4b\xb4\x42\x65\xad\xed\x03\xf2\x70\x9b\x9a\x30\x3d\x01\xfb\xe9\x94\x4a\xf7\xc3\xa6\x85\x4f\x11\x05\x1e\xbf\x58\x33\xf8\x51\xa0\xd1\x7f\x49\x13\x47\x22\x61\x20\x49\x1a\x62\xab\xd4\x21\x9d\xd2\x47\x5f\x63\x90\xd1\x41\x80\x05\x06\x02\xc1\x03\xa5\x52\x3f\x63\x3a\x91\xcb\xfa\x64\xb9\x77\xcf\xa1\x76\xbc\xaa\xed\xe8\x92\x74\x7c\x9b\xad\x2a\x35\x58\xc2\x35\x36\x11\x38\xf9\xf5\x6d\xf0\x7d\x8d\x5f\x5e\x09\x38\x3a\x6f\x9a\x8b\x14\x66\x84\x4a\xcf\x4d\x55\x02\xb3\xe1\x73\x9a\x8e\xc6\xf8\x61\xb9\xa6\x0c\x53\x07\xd3\xcb\x84\x57\xeb\x4a\x02\xb4\x53\x25\x44\x62\x10\xe5\x34\xf3\x11\x93\xd6\x43\x2d\x31\x42\x4a\xd2\x85\x13\xb0\x3d\x9f\x3a\x2e\xeb\xe8\x86\x81\xd0\x52\x7a\xc9\xcf\xd7\xe7\xdd\x52\xa2\x07\x2e\x3d\x7b\x62\xab\x28\x89\xc3\x04\x10\xdd\x39\xef\x68\xf5\x49\x96\x67\x66\x8c\x70\xb8\x72\x11\xc6\x03\xde\x20\x3a\x79\x91\xe6\x88\x5d\xbf\xb7\x56\xfd\x32\xf9\xcd\x5f\x20\x30\xc7\xee\x49\xdc\x39\x9c\x16\xd5\xd3\xc7\x4e\xe2\x33\x79\x9e\x01\x41\xbc\xb0\xd3\x90\x3b\x50\xc1\x41\xab\x7e\x6e\x4f\xab\x94\x0c\xe8\xc0\xbb\xb4\xa0\xdf\x19\x71\x4a\x32\xc6\x12\x5f\x13\x66\xfb\xc3\x7b\x5b\x0e\x87\x25\x45\xa3\x0b\xfa\x89\x4d\x8d\xab\x86\xec\x89\x00\x6b\xa2\x19\x65\x32\x90\xc1\x87\xa3\x0f\xf2\xf5\x9b\x9f\xd1\x2b\x86\x0d\x4c\x07\x6c\x12\x7a\x03\x0a\x9f\x6f\xff\x08\xae\x60\x1f\x84\x4e\x5b\x3f\x9f\x63\x6c\x81\xa3\x3e\xeb\x23\x69\x7f\x83\x3f\x4f\xc1\x80\xea\x67\x3d\xa1\x45\xcd\x19\x90\xea\x4c\xcd\x0d\x6d\x3c\x6a\xa5\xd2\xfa\x0d\x3f\x28\x30\x6e\xb0\x4d\xef\x37\xc2\xae\xf3\xa3\x96\xac\x9f\x89\xfc\x69\xd6\xac\x89\x2d\xe2\x43\xfd\xba\x23\xc7\x96\xfe\x69\x38\x9a\x3d\x0f\xf3\x22\x1e\x2c\x5c\xed\xde\x06\xda\x92\x54\x64\xf1\x7b\xaf\x8d\x94\x7d\x6b\x89\x99\x9d\x61\xad\x66\xaf\x4e\x64\x45\xb6\x19\x37\x21\xa7\x66\xab\x0b\x9d\xe9\x84\xce\xf6\x77\x5f\x54\x98\x97\x02\x7b\x56\x78\x65\x26\xaa\x5e\x09\x03\x27\xfb\xfa\xcb\x78\x72\x73\x00\x31\x8c\xea\x7e\xdd\x43\x81\x42\xfb\xdc\x02\xaf\x7c\xd0\x3c\xc9\x02\x03\x70\x8b\xdf\xf7\xfd\x7c\xb1\x9f\x41\x88\x91\x60\xf0\x31\xfe\x40\xf4\xde\xb5\x39\x5f\xa3\xdb\x40\x57\x27\x3a\x1b\xe1\x01\x5b\x6b\xfa\xee\x13\x4f\x4f\xe4\xbc\x47\xda\xc3\xa8\x66\xea\x2e\xab\x37\xc5\x53\xc5\x12\x33\xac\xb3\x0b\x8a\x23\x4a\x5e\xd2\x27\x5a\x78\x3e\xac\x2b\xd3\x6c\x86\x43\x93\x3d\xc4\xfd\x63\x7a\x85\x4c\x91\x63\xe6\x81\x9b\xaa\xf9\x43\xf5\x06\xa5\x11\x2a\xd1\x1a\xe1\x15\xce\xf6\x0f\x3f\xf9\x1a\x33\x19\xf8\xc9\x17\xd1\xc5\x1c\x4e\x49\xf6\xf0\xc3\x23\xb8\x02\xec\xeb\xa2\x1c\x1b\x3c\x51\x98\xba\x33\x14\x0f\x82\x24\xf4\xdf\x2e\x7f\xf4\x4a\x86\x69\xc8\xcc\x99\x8c\xe0\x15\xfa\xe2\x3f\x1c\x02\x23\x68\x50\x5c\x7f\x15\x2d\x14\x44\x32\x2b\xd3\xc3\x32\x1a\xf0\xb4\x19\xb9\xb9\x13\xb1\xc1\xdf\x82\x91\x4c\x77\x41\x54\xd1\xd7\x56\xdb\x32\x23\x7f\x2d\x21\x10\x32\x33\x4d\x14\x55\x35\xaa\xe7\x16\x86\x4a\x78\xce\xee\x09\x8f\xc9\xb1\x71\x2a\x35\x9d\x42\x8b\xb8\xd4\xdc\x58\x92\x84\xc1\xa1\xad\x15\x7f\xef\x1a\xf3\xf7\xc8\x11\x7c\xa4\x2d\x59\x21\xbf\x3f\x0e\x29\x23\x6b\xec\x45\x04\x66\xa8\xaf\x35\xf2\x35\xcb\x24\x6a\x35\xdf\x6b\x73\xaf\x6e\x98\xc0\x79\x7a\x30\xaa\x50\xd0\xc3\xb9\xa1\xd2\x8c\x65\xd9\x34\x18\xb6\x5e\xec\x0a\x25\x71\xc3\x70\x6e\xa7\x0a\x44\xc7\xdf\xc4\x16\xe9\xcc\xcf\x0f\x3b\x98\x06\xf3\x58\x62\xaf\x9f\x7d\x39\xfd\x97\x7c\xce\x0c\x09\xac\xda\xf8\x7b\xdf\x77\xe1\x16\x1c\xc1\x85\x3b\x93\x7f\x46\x53\xf7\xac\x3f\x91\x23\x7c\xf4\x4c\x2c\x0d\x77\xf1\xfc\x12\xea\x54\x4a\x6d\x06\x11\x3c\x09\x03\x0c\x63\xfc\x32\x58\xee\x02\xb5\x3c\x03\xd9\x81\x02\x63\xfa\xd6\xe3\xd0\x6c\xdf\x70\xe1\x40\xf7\x84\x67\xfe\x5e\x1a\xdc\x96\xd7\x89\x56\xd9\x17\x75\x0f\xba\xb2\x37\x47\x8d\xef\xf7\x60\x80\xf2\x17\x1b\x2f\x5e\xf4\xca\xe8\x65\xc7\xab\x78\xad\x6c\xbd\x14\x42\x17\x60\x7e\xee\x0f\x55\x5a\x06\x49\x35\xf6\x81\x59\x52\x4f\x3b\x1c\x21\x37\x04\x9d\x5f\xb5\x42\xf6\x15\x35\xed\x41\x4d\x95\x54\xa6\xff\x8b\x09\xd6\x7b\x37\x51\xea\x9c\xdd\x9d\x9a\x05\xc2\xaa\xeb\x93\x2f\x58\xa0\x5b\x8c\x30\x2b\x10\x49\x09\xc1\xac\x40\x8d\x5c\x19\x86\xf1\x43\x8d\x46\x22\x97\xa0\x07\x12\x7a\x61\x33\x35\x24\xd8\x70\xfd\xbd\x0d\x91\x34\xd0\xc4\x6f\x54\xa6\x39\x1d\xf1\xf5\x37\xb4\x44\x10\x55\x3d\x6c\x7c\x79\x06\x4b\x10\x96\x5b\x18\x21\x85\x35\xd5\xd8\xb9\xb0\x0d\x2d\x12\xa1\xdb\x7f\x7d\x32\x1e\xbd\x75\xe8\x49\xbd\x03\x46\xab\x45\x50\xec\xab\x3a\x05\xc0\x09\x93\xbc\x64\xf9\x6d\xe0\x8b\x21\x46\xbd\xf4\x28\xa9\x7d\xd4\xc1\x27\xfe\xc1\xff\x31\x19\xd9\xd1\x88\x97\x60\x58\x5b\x7e\xe7\x6f\x00\x9b\x7c\x9b\x88\xae\x0a\x16\x09\x73\x6f\x17\xb3\xbf\x9c\x9c\x3b\xfd\xad\xe8\x53\x6b\x89\x75\x6d\x67\x81\xbb\x6f\x42\xff\x89\xcb\x5e\xf6\x4e\xbc\x87\x64\x83\x95\x50\x7b\x81\x7f\xba\x46\x01\x99\xbe\x05\x40\x69\xf3\x83\xe3\x8b\xcc\x5d\x96\x6a\x4f\x98\xcd\xdc\x30\x8a\xd4\x3d\x83\x51\x0c\x8b\xed\xf4\x99\xd4\x95\x3b\x78\xae\xfa\x4c\xe5\x53\xf7\x77\x3d\x71\x6e\xeb\x2a\xc6\x4c\x6c\xaa\x5d\x59\x12\x3b\x12\x74\xac\x67\xa4\x4b\xfd\xe3\x35\x8b\x1c\x57\xc2\x2f\x20\x82\xc6\x8d\x6a\xd4\xe2\x23\xd8\xd1\x35\x24\xeb\x30\x38\xb2\x13\xad\xd0\x69\x87\x32\x03\x9a\x97\xe3\x75\x32\xb2\x18\xe9\x92\xb6\xa4\x2e\x50\x0b\x61\x74\xce\xd8\xc3\x07\x64\x70\x05\xe9\x64\xc0\x37\xc2\xa9\x48\x1c\x92\xb2\x1a\x55\xbc\x50\xb3\x46\xef\x9a\x9c\xfd\xb9\xc2\xf5\xd0\x60\xa0\x95\x17\x54\xd0\xfd\x13\x81\xe6\x41\x46\x09\xea\x31\x6f\x62\xb9\x55\xbd\xa6\xa3\xd2\xfc\x54\xa7\xaf\xfb\x14\x63\x90\x22\xe8\xd9\x3a\x96\xba\x1e\x37\x53\x11\x86\x7e\x8f\xad\x96\xdf\x4e\x0a\xef\x77\x03\x99\x35\xa5\xe1\xb0\x78\x0c\xa8\xc1\xe6\xe4\x49\x5d\x71\x6a\x1a\xfa\xca\x50\x20\x80\x7c\xf2\xf8\x83\xe8\x08\xc1\x56\xff\x79\x4b\x4a\x92\x39\x44\x16\x14\xce\xee\x7f\x6c\xc4\x60\xf2\x4f\x1f\xbd\xbc\x2b\xe7\xaf\xce\xbf\x79\xe8\x1e\x94\x98\x07\x30\x1a\xbf\x42\x9f\x14\x31\xbf\x55\xae\x5f\xca\x68\x21\x67\x1f\x63\x6b\x55\x70\x85\x46\x0d\xb5\x81\xe0\x7c\x5f\x71\xb7\x01\x20\x8f\xeb\xb4\xa2\xdc\xd5\xe0\x42\x76\xd2\xd2\xaa\x7f\x62\xe9\x4c\x7c\x40\x1e\xab\xd4\xcc\x81\x6d\x09\xce\xed\x5b\x12\x68\xca\x9a\x18\x77\x72\x46\x4e\xef\xbc\xaa\x4b\x7c\x46\xfd\x8f\x3a\xc0\x1e\x04\x60\x77\x83\x09\x3c\x08\x44\x47\xb8\x19\x19\x10\x30\xca\x54\x10\xb9\x3a\x2f\xff\xf7\xe1\xa2\x6b\xf9\xce\xdf\x70\x63\x7b\x69\x96\xb1\x7c\x84\x76\xbf\x68\xee\x57\x5c\x48\xe7\x99\xe8\x47\xe1\x66\x32\x72\x37\x1a\x5d\x48\x6c\x22\x73\xdc\x50\xa2\xd0\x23\x32\xd0\xd7\x06\xe2\x8d\x0b\x37\xbe\x21\xf1\xf9\xf0\x11\x4b\xd1\xdd\xb4\x65\x7f\x0b\xcc\x2e\xb7\x8b\x7f\x62\x91\x4a\x42\x7c\x23\x83\x40\xe7\x03\xb9\x85\x7b\x99\xf4\xed\x21\x0f\x82\xdd\xef\xd6\x1b\x46\x05\x24\xd3\x9a\x5c\x34\x45\xec\x48\x79\xa9\x99\xde\x17\xf9\xe4\x68\xf5\x2c\x08\x88\x8d\xe4\xf0\x7e\xd9\x9a\xd5\xe9\x8b\x67\x6b\x22\xd4\x06\x84\xcb\x4e\x91\x46\x71\x30\x3b\x60\xf7\x88\x5c\x57\x9f\x3e\x9b\x89\xc4\xdb\x17\xd9\xac\x57\x97\x9e\xa9\x43\x2d\x40\xba\xcc\x95\xdd\x56\x2f\x9d\xab\xb5\x28\x1f\x9e\xc0\xce\xae\xd7\x6a\x83\x88\xc2\xc2\xf6\xd2\x38\xd1\xad\x6e\x48\xdb\x30\x46\x2f\x0b\x50\xe3\xce\x19\xbb\xc2\x04\xef\x4d\x27\xbd\xea\xd5\xc0\xd0\x3d\x1f\x19\xca\xb9\x75\xfb\x45\x4b\x74\x24\x2f\x40\x52\x56\x7c\x8b\x29\x60\x82\x2e\xe4\x0f\x87\x42\x8b\x13\x7f\xd2\x3a\x3a\x15\x8f\x83\x3f\x81\x67\xe9\x1f\x22\xb5\x32\x7b\xc7\xf6\x05\xd7\x48\x62\x86\xe3\x5a\x56\xd6\x98\xf0\x86\x1b\x6d\x03\x35\xda\x61\xd6\x90\xce\x86\xa2\x64\x4c\x49\xa2\x6b\xe5\xae\xfc\xe9\xcf\x03\x8e\x96\x42\x5e\x9a\x95\x4a\x52\x13\x07\x06\x38\xc2\x8f\xed\xff\x58\xfb\x36\x80\x64\x5c\x16\x84\xf4\x13\x6c\xad\xda\x67\x86\x4a\x10\xbc\xf3\x84\x28\x07\x94\xa4\xef\xa6\x14\x6c\x91\x8d\x03\xc7\xea\x88\xd9\xb3\xd9\xfa\x3c\x4e\x34\x6b\x91\xfc\xba\xf9\xec\xb1\xe0\x34\x00\x27\xf5\x9f\xce\x66\xc2\xa5\xe3\x95\x26\xbb\x6e\x44\xc2\x9f\x31\x7e\x65\xa5\x87\xe7\x78\xfc\x00\x77\x5c\xb6\x95\x04\x4e\x39\xd2\xa2\x4a\xb8\x22\x68\x2d\xc1\x59\xf7\x47\xa5\x2d\x7e\x80\x2f\xd1\x13\xfe\x08\x9d\xf3\x6a\x35\xc3\x03\x3f\xed\xb4\xba\x7f\xef\xfe\xe9\xf2\xf4\x83\x24\x1c\xce\xc5\x51\x58\x4d\xb9\x3a\x98\x14\xa9\x37\xeb\xb0\xb7\xa0\x2b\x7d\xb4\x2e\x02\x6d\x13\x33\xd4\x60\x24\x75\x10\x39\x1d\x33\x92\x06\xfa\x05\x6e\xc0\xa5\xea\x13\xd3\xa3\xde\xba\xad\x47\x8e\x9d\xbc\x05\x7d\x56\x1b\x37\x2f\xbd\x36\xe7\x20\x57\x58\xa5\xb8\xd0\xb4\x60\x43\x29\x31\x27\x84\x18\x93\x31\x09\x18\xda\x09\x87\x99\xc8\x28\x32\x67\xc0\x0b\x75\x11\x9d\x13\x62\xc3\xff\xb7\x6e\xb8\x39\x0b\x9a\xcc\x70\x10\x04\x01\xc0\xa3\x9c\x05\x4e\x04\x80\x0b\x07\x65\x85\x1b\x0c\x8b\xd6\x84\x92\x13\x0f\x11\xa5\x29\xc8\x48\x8c\x0e\x57\x82\x54\xa9\x75\xd9\x2c\x23\x93\x6a\x0d\x5e\xa8\x82\xdd\xd9\x80\x9b\x5e\x0d\xf3\xbe\x4d\xf1\x4a\xff\x97\xd8\x12\xc5\x85\x76\xc5\x9c\xbc\x19\x36\x3c\xd5\xfd\x28\xc6\x94\xbd\x74\x8f\x40\x10\x80\x3a\x5c\x75\xfd\x49\x01\xb5\xe9\xab\x0e\xe0\xf1\x89\x65\x51\x9e\x71\x5a\xd6\x6c\xbc\x2d\x92\xd6\x89\xca\x52\xb9\x79\x1f\xac\xf4\xf9\x38\x54\x1f\x5e\xbc\x6a\x96\x9a\x07\xf9\xba\xac\x7c\x52\x84\xf6\x65\xfd\xb6\x17\x17\xd9\x6f\x46\x0f\x84\x44\x5b\x9d\x9e\x3e\x9a\xec\xce\x0d\xcc\x1d\x0a\xac\xc4\x96\x28\x7f\x23\xb8\xd1\x80\x86\xe3\x9e\xe4\xb9\xb5\x0f\x76\xc9\xc0\x8d\x28\x2f\x4c\xf1\x32\x98\x1f\xe7\x86\xde\xb8\x68\x23\x00\x56\xeb\xb2\xa6\xbd\xa3\xf1\x0c\xa6\xfe\x6a\x31\x0e\x44\xd7\x1f\xe6\x01\xb4\x81\xdc\xf0\x7c\xd8\xb9\xb1\x62\xea\x16\x7c\x3f\xbe\x31\x04\x49\x0c\xcb\x0d\x0c\x24\x85\x1d\x51\x62\x79\xd1\x2b\xe9\xd9\x53\xa5\x60\x52\x8d\x84\xee\x06\x04\x3f\x9c\x82\xe9\x08\x6c\x15\x4c\xe3\x88\xc8\xa4\x17\x94\x37\x67\x87\x11\xeb\x4e\x77\x65\x27\xc3\xbe\x6b\x47\x2a\x4b\xf8\xcd\x95\x82\x8b\x3f\x78\xa5\xb3\x03\x3c\xad\xa8\x50\x33\xd1\x13\xd7\x4f\x6a\xf0\xee\xe2\x5a\x25\xde\x0f\x8d\x7b\xfb\x2a\xf1\xfe\x78\xe8\x5b\x20\xc0\xa2\x2b\x4b\x73\x05\x5a\x5e\x81\xe4\x36\xc5\x21\x09\x13\x7d\xf4\xf8\xe7\x25\x78\x46\x34\x5f\x4a\x69\x72\xc5\x08\xc9\x74\x5e\xd5\xba\x26\x19\x06\xec\xfa\x72\xdb\x9f\xa9\xc7\xcf\xac\x25\x7a\xcd\xb8\xc2\x69\xc5\xf5\x91\x04\xe9\x26\x08\x83\x51\x71\x2e\x96\xfe\x57\x27\x4d\x56\x97\xc4\x0f\xd4\xa3\x43\x99\x41\xb4\xd5\xe9\x0d\x34\x3e\xbf\x12\xef\x5c\xae\xfe\xa9\xf0\x91\x85\xcd\x9c\x0a\x02\x87\x7c\xf9\xa9\x89\x5e\x73\xe3\x73\x3e\xd9\xa3\xc0\x74\x04\x7d\xd2\xf2\xae\x33\x28\x55\x09\x4a\x46\x13\xf7\x8f\x57\xc3\x61\xc9\xfc\xca\x64\x29\xf1\x82\xf7\x41\xa9\x50\x30\xba\x50\x5c\x45\x8f\x28\x1b\xa8\xb2\xb2\x67\x19\xf1\xba\xc6\x02\x7b\x93\x4e\x2b\xe0\x07\x9e\x49\xf0\xe5\x17\x88\x57\x0b\x04\x14\xbf\xed\xf4\xe7\xc0\x9a\xbe\xa3\x1e\x84\x9b\x8f\xe9\x4e\x0d\xc6\xef\x38\xa8\xc5\xfe\xe3\xc5\xce\x04\x7f\x55\x9f\x9c\x99\x89\x4c\xdc\x63\x70\xda\x40\x38\x68\xcb\xc7\x26\x7f\x65\x08\x7d\xfd\xf2\x44\x0a\x06\xdc\xfd\xf3\xe6\xc3\x96\xc2\xc6\xbd\xe9\xae\xe0\xb0\xe0\xe5\xff\x79\xc6\x44\xfb\x8c\x94\x69\x6e\x57\xea\x2c\x0d\x6d\xe3\x51\x5f\x4c\x36\xad\x3e\x18\x20\xab\x05\x81\x72\x52\xe0\x76\x06\xb0\xb2\x36\x87\x2a\x40\xe4\xb8\x0e\x1f\xf3\xae\xcd\xc7\x65\x4d\x6b\x45\x9f\x2e\xbf\x20\xac\xf9\x34\x9d\xee\xc2\x02\x78\x48\xc2\x60\x47\x33\x50\xbc\x25\xf4\x43\x3e\x76\x4c\x2a\xa1\xb9\xc9\xc3\x94\xbf\xbd\x5f\xff\xf4\x2b\xe1\xf4\x6f\x01\xbf\x47\xe2\x55\x21\xfb\xc9\xfb\x28\x68\xe6\x5c\x31\x7c\x82\xe2\x00\x78\xbd\x38\x05\xa7\x47\x28\x0e\xae\xdf\xfe\x2c\x2f\x25\xee\x5d\xe6\xd9\xcb\x1a\xb7\x80\x20\xdc\x1e\x38\xc5\x08\x71\xae\x0c\x02\xa9\xa3\xa2\xab\x05\x67\x22\xf1\x29\x2a\x6e\x1b\x7e\x74\xcf\x01\xd5\x46\xcc\xb6\xcd\xd6\x13\xbe\xa6\xe3\x62\xc9\x1e\x76\x27\x78\x65\x1e\x1f\x06\xdb\xca\xfb\x6b\xef\xbd\xd2\x42\x62\x71\xb0\x49\xc5\x21\x22\xb1\x6c\xa2\xce\x0c\x84\xa0\x8a\xea\x40\xd2\x33\x8e\x06\xbc\x8c\x40\x52\xfe\x68\x50\x06\xe2\x3f\x7e\x3a\xed\x1b\x66\x29\xb0\x52\x3a\x02\x01\x1c\x43\xfa\x12\x1b\x5e\xcc\xea\x40\x18\x20\x39\x20\x16\x66\xac\xe3\xd9\xcb\x60\x48\x42\x94\x3c\x1a\xf3\xcb\x0b\x9d\x9f\x4b\xaf\x4f\x84\xa7\xa8\x54\xdf\x48\x8f\xf0\x05\x10\x0e\x8c\x80\xa0\x5f\xd4\x37\x39\xc2\x75\x2e\xb1\x52\xa4\x88\x6a\x80\x83\x50\x2a\x8e\xf1\x0b\x5b\x20\x0e\x92\x9f\x60\xca\xfa\xf4\xd3\xa5\x18\x7d\x73\xc6\xbd\x77\x4d\x5c\x91\x4c\x18\xef\xdb\xbc\xa2\x6d\x33\x46\x54\xb6\xd8\xb9\x0f\x91\x63\xcb\x7c\xd9\x3c\x2f\x15\x2e\x24\xbe\xb9\xcc\xae\x46\xf3\xeb\xd5\x29\x4d\xfa\xfa\xdd\x94\x51\xf2\x20\x45\xef\xa6\x01\xd9\x12\x8b\x97\xa5\x45\x4b\x5e\xb3\xc1\xf2\x02\x10\xad\x01\x5d\x64\x76\xb1\xd1\x29\xb7\xd9\xe5\xe6\x49\x04\x92\xc0\x18\x46\x73\xdd\x49\xb9\xa9\xb8\xf8\xb0\x3f\x0f\x25\x36\x7e\xf0\x73\x96\x4a\x75\xa9\x0b\x25\x17\xfc\xa5\x9f\x64\x27\xc2\xa2\x3a\x5e\xbc\x23\x8d\x63\x47\xe2\x9f\xf9\xab\xf8\xb4\x48\x29\x24\x9d\xe1\x15\xed\xa9\xb6\x4f\x85\xe8\x4f\xf5\x4b\x6b\xb8\xaa\xd3\x8a\x42\x9b\xe4\x51\x27\xf4\x03\xf1\x89\x2d\x1a\xf8\x1e\xa1\x9b\xdf\x31\xef\xbd\x49\x82\xe9\xe2\xa0\x24\x06\xca\x30\x96\xc0\x0c\xf9\x9e\x2c\x0f\xa6\xb3\x62\x47\xa1\x2c\x49\xfa\xf1\x2f\xae\xa2\x9b\x32\xe5\xb2\xbe\xf1\xe2\x74\xe7\x49\xca\xe3\x01\xaa\xfb\x02\x21\xab\xbf\x7c\xd3\x1e\xe5\xaf\x4f\x2a\x5e\xa3\xf6\x7b\x8c\xd3\xa7\xcd\x27\x64\xf2\xce\xfe\x4a\xd0\x67\xa3\x3a\xe5\x9b\x09\xbd\xe3\x9c\x38\x56\x2b\x73\x4a\xb8\xa4\x7f\xa7\xbc\xf5\xb1\x46\x7b\xa9\xeb\x42\x35\x5c\xef\xf6\x76\x26\xdc\xfe\x90\xa6\x4d\xdc\x97\x34\x1f\xf1\x93\xbc\xd4\xc1\x25\x0a\x73\x5a\xd4\x72\xd8\x33\xf5\x00\x5a\x05\xa3\xca\x2b\xca\x90\xd1\xb7\x66\xa5\xfa\xb1\xc3\xc4\x2f\xd0\xae\x49\xcf\xaf\x38\x3c\x73\xca\x20\x44\x2c\xaf\xea\x27\x4f\x4c\x3d\x82\x50\x28\xbf\x26\xc3\xdd\x51\x08\x1f\x59\xd9\x0e\x3e\x03\xa0\x77\x9c\x5b\xf2\xc4\x95\xd6\xcd\x30\x0c\xc7\x30\xae\xef\xb0\x01\x37\x6f\x2a\x64\x30\x44\xf7\xd0\xd4\xe1\x65\x10\x70\x71\x40\x65\xb9\xe8\xac\xf0\x2a\xeb\x99\x23\xef\x6b\x4c\x05\xb4\x21\x58\x9d\x10\x52\x99\xb3\xf9\xdc\x70\x11\x05\x8c\x5b\x58\x7c\x43\xbd\xb4\xbe\x0d\x2f\xf1\x55\xd9\x19\x49\xb4\x73\xf1\xcd\x8d\x91\xf9\x59\xdf\x83\x6f\xe8\x55\x75\xc1\x60\x88\xaa\x09\xef\xec\xb5\xb5\x35\x50\x65\x42\x63\x57\x5c\xd7\xf4\x0d\x5c\x4b\x44\x2e\xdd\x3b\x4f\xa8\x3d\x13\x78\x21\x7c\xa5\xc7\xf9\x29\x53\x65\xa6\x66\xa9\xa7\x70\xde\x94\x21\x58\x6c\xca\x28\x53\xe2\x5a\xb0\xde\x3a\x3f\xaf\xee\x96\x5a\x2b\x91\x18\x23\x40\x96\x27\x51\xb0\xf5\x9d\x40\xdd\xd1\x0e\x2d\x5e\xfd\xc8\x56\xc0\x10\x16\x49\x4c\x67\xec\x0e\xd4\xb8\x78\x1b\x32\xea\x3a\x7c\xd5\xd2\x6c\xb7\x95\x3c\x97\x16\xc9\xd6\xfc\x96\x84\x07\x0a\x70\x2f\x72\x73\xe0\x1a\xb5\x42\x2d\x73\xc1\x4d\x50\xe3\xcb\xff\xe6\x59\xd7\x4c\x83\xf0\xec\x5e\x8b\x53\x19\xcc\x80\x8f\x5a\x3a\x68\x76\x80\x00\x80\x95\x73\xfb\x0a\x8d\xe3\xbb\x20\x6a\x74\x31\xc2\xd7\x84\xb9\x6a\x2d\x23\x30\xe5\xa0\xa4\xa1\xdc\x3d\xf7\xad\x1b\x47\xae\xf3\x4a\x4f\x84\xc3\x52\xfd\xf2\x76\x7e\xf5\xce\x1a\x3e\xfc\x6f\xd0\xae\x80\x4f\xda\x58\x6c\xc0\xe3\x78\x47\x47\x77\xad\x4d\x75\x05\xda\x02\x51\xb1\x53\x4b\x72\xde\x06\x02\x7f\x8f\xcb\x23\x40\x82\x06\x88\x5b\x4f\x4b\xb7\x73\x10\x83\xaa\x94\xf8\x08\x7d\x05\xd1\xe8\x0c\x84\xd5\x60\x83\x01\x7f\x0b\x08\x45\x61\x68\x3b\xeb\xc8\x64\x82\x37\x23\xda\x90\xfe\x5b\x06\x83\x82\x94\x37\x9f\x54\x24\x3b\xee\x3b\x21\x39\x92\xaf\xfc\x70\x0e\x44\xc5\xcd\xcf\xa9\x7d\x0a\x6a\xf4\xa6\x5f\x66\x9a\x5d\x5d\xdb\x3a\x6e\x7a\xfd\x6b\xbd\x7e\x26\xe1\x3b\xdf\xdc\x7f\xd9\xcd\xfd\x7d\x93\xb4\xad\x69\xaf\xfc\xf0\x35\xf1\x61\xba\x92\xd1\x53\xd0\xe3\x3f\x0e\x54\xb5\xf5\xbd\x58\x66\x30\x3c\x1f\xa7\xc0\x92\x22\x52\x40\x73\x66\x24\xd2\xf0\x77\x09\xfd\xad\xc8\xfa\x9c\xef\x02\xb8\xf0\xa3\x6f\xa1\x2a\xe2\xc4\x9f\xdc\xa2\xd8\xde\xef\x04\xd4\x60\x02\xf1\x89\xe8\x33\xaa\x2a\xfd\x47\x35\x73\x52\x70\x7d\xee\x6b\x55\x1f\xa1\x72\x87\xea\x9f\xfe\xfd\xac\xab\x35\xe5\xef\x28\x69\x9a\x1a\x84\x7d\x5a\x7c\xa2\x52\xa6\x8e\x19\xbb\xdb\x64\x2e\xae\x9f\x55\xa3\xa3\x9f\x17\x43\x61\x4c\x24\x8b\x13\x34\xbf\x1c\x09\x0e\xea\x02\x29\x53\xe6\x91\x23\xd8\xac\x5f\x69\xcd\xdc\xb7\x94\xc7\x89\x64\x71\xae\xcb\xf1\x2a\xd1\x10\xe5\x29\x3d\x96\xeb\xd1\xaf\x7f\xec\x82\x06\x01\xb2\x00\xb5\xe1\x7b\xc0\x0d\xdf\xc3\xd1\xb7\xb8\x5f\x1b\xef\x2a\x46\x65\xc6\xf8\x09\x8f\xee\xaa\x1e\x06\x99\x50\x21\x17\xc5\x85\xaa\x5c\x3d\xff\x78\x84\x17\xd9\xab\xe2\xd7\x6a\x52\x4a\xf4\x20\x1b\xbf\x32\xbb\xda\x8e\x57\x2b\xfc\x0a\xb5\x9a\x78\xb0\xce\xe5\x93\xec\x4d\x89\x2f\xa2\x00\x0e\x83\x64\x8b\x0f\x61\xee\x73\x47\x88\x8a\x13\x45\x7b\x5f\x70\x25\xef\x51\xae\x0a\x5a\x71\x1a\x80\xe0\xcc\x58\xcf\x75\xdd\xb7\x95\xe5\xe6\x55\xdd\x37\xf5\xdd\x37\x01\xbb\x54\x95\xdb\x09\x54\xa1\x65\xf9\xd9\x53\x17\x4c\xb2\x9a\x30\x5d\xdf\xed\x9c\xa2\x8d\x57\xb5\xed\xd9\x20\x70\x19\x1b\x92\x47\x4b\x1a\x37\xff\x2f\xfd\x0f\x4b\x1a\xb6\x79\x30\xe0\xa5\x0f\xe3\x4c\x9c\x87\xf4\x08\x9b\x93\x99\xe2\x16\x6f\x23\x9e\x31\x49\x9d\x67\x03\x3b\x56\x51\xac\xed\x07\x62\x10\xfc\xab\xa5\x66\x7e\xec\x10\x1e\x1b\xb1\x16\xd3\x86\x93\x5e\x42\x91\xf1\x19\x41\xf2\x60\xe7\x87\xe6\x42\x74\x65\x76\xff\xae\xb5\x7e\xb1\x49\x55\x1a\xb2\x5c\x7d\x3a\xa8\x60\x8f\x97\x61\xc1\xd5\xf5\x8f\xb3\xd7\xb1\xd4\x42\xf8\xdc\x66\xe2\x76\x29\xd5\x2c\x7a\x5c\x2d\xc1\x0a\x26\xf2\x6b\x5e\xdb\x79\x5d\xe7\x55\x60\x9a\xbe\xb4\xe8\x69\xa2\x25\x20\x86\xff\x6e\x2f\xdd\xb7\x74\x44\xdb\x8d\x43\x12\xe1\x2e\xb3\x23\x24\x92\x3f\x20\xee\xe2\x3e\xad\x3f\x5a\x53\x07\x3b\x49\x7c\xd7\xe2\x7c\x69\x7f\x63\x11\x4f\x02\x1c\xc3\x45\x86\x4f\xd8\x68\x34\xcc\xd2\xfb\xdd\x5a\xd0\x66\xc7\xba\x78\xe4\x04\x43\x32\xab\xff\x1d\x2f\xbe\xa8\xae\x70\xb4\xd0\xf6\xaf\x47\x16\x06\x54\xa6\x6c\xad\x85\x52\x9e\x91\x5d\x92\x3c\x9a\x40\xf9\xa8\xd1\x4a\x06\xe8\xed\x77\xd0\xc4\xe5\xd1\x25\x58\xce\x13\xb3\xfe\x39\x5d\x3c\xbe\xfc\xf5\xd0\x8a\x6b\xf4\x82\xa9\x18\xc6\xc4\xb4\x1c\x57\xd5\x23\xb9\xaa\xd0\x95\xae\x5e\x3c\xc7\x60\xc3\x13\x52\x43\x3a\x42\xb4\xfa\x00\x09\x9d\xf7\x5e\xd8\x47\x83\xa0\x73\xde\x5b\x1e\xdd\xeb\x89\xf0\xb5\xa7\x18\xa1\x8f\x0b\xc9\x92\xc0\x0f\x04\x47\x4b\x06\x3a\x9f\xd4\x57\x2a\x3e\x2f\x16\x67\xab\x11\x2e\xb0\x4b\x68\x00\x25\xa7\x8f\x37\x87\xc5\xed\xc0\x07\xda\xc9\xc9\x44\xa3\x59\x97\x79\xfb\xd6\xf1\xe2\xec\x78\x3a\x87\x9f\x31\x39\x33\x1e\xb8\xa9\xd2\xd2\xea\x4a\x7a\xf4\xed\x26\x51\xf1\xa2\x22\x11\x0e\x23\xa7\x6f\x03\xca\x5a\xa3\x2a\xfb\xad\x5a\xdb\xfe\xba\x1f\x62\x94\x8f\xf6\x90\xf4\x4b\x0e\x60\x74\x48\xdf\xf7\xd1\x01\xa4\x36\x90\xfe\xe5\xff\x22\x49\x27\xcb\x6b\x34\xa7\x6e\x59\xd3\x71\x7d\xc0\xc6\xf0\x42\x78\xcf\xc4\xc7\xf7\xe9\x32\x59\xfd\x41\xf1\x5e\xf0\x42\xe5\xee\xa1\x13\xa3\x06\xa2\x0f\xc8\x33\xc9\xf9\x73\x1b\x57\x86\x18\x35\x56\x94\x4f\x1d\x87\x22\x8b\xc0\x3a\x7d\x5a\x20\x83\xf9\xa6\x9c\xc8\xca\xfc\x37\xce\xf8\x47\x9a\x36\x96\x1b\x33\x4a\xa9\xcb\x90\x5f\x11\x8e\x59\x96\x0c\x92\x70\x8b\xae\x07\x18\xbf\x06\xef\xe6\x7a\x78\x8d\x17\x3f\x7c\x84\xa3\x1b\xa2\xe3\x07\xc2\xa3\x7b\xfe\x67\x7e\x78\x8b\xa4\x05\xd0\xc5\xbb\x3f\x7a\xca\x59\x87\x30\x7c\x18\x5e\x0e\xdb\xdd\x2b\x54\x16\xfa\xd6\x20\xd1\x9f\x51\x46\xea\x45\xc9\x32\x01\xdb\xd3\x4b\xea\xf6\x0e\x8f\x13\xa2\x45\x11\x56\x1b\x0d\x55\xb4\xa4\x67\xf3\x9c\x76\x5b\x5b\x87\x16\xc2\x5e\x0e\xeb\x9e\x8f\x1a\x48\xd7\x42\x79\xe4\xbc\xfe\x60\x78\x3d\x56\x6e\x5a\x8b\xad\xc4\x61\x65\x63\x88\x4f\x49\xc8\xd6\x98\xa9\xad\xc8\x5a\x5c\x13\x91\x48\xce\x79\x6b\x80\x16\x6e\x30\xf4\xbb\xa2\x68\x23\xe9\x16\x0d\xec\x07\xcf\xc9\x35\x3e\x46\xf2\x40\x08\x2c\xae\x00\xb0\xaa\xe6\x22\x3d\xa3\x49\xc7\x2d\xf1\x09\x15\x82\x6b\xe6\x52\x6e\x89\x73\x3b\xb1\x10\xef\x33\xfd\xf5\x67\x19\x25\x00\x4b\x6c\x5f\x3d\xbc\x21\x83\xa7\x40\xf9\x49\x26\xdf\xda\xe0\x15\x41\xc9\xe2\x65\x55\x37\xa9\xd0\x10\x2d\x17\xc2\xed\x97\x34\x0e\xc5\x26\x0d\x07\x3c\xd4\x9e\x52\x5d\xd3\x7e\x21\xb5\x57\x64\xef\xf4\xab\xe2\x84\xf2\xa7\x38\xfe\xb3\x2c\xc6\x97\x7f\x46\xb8\x15\x27\x59\x76\xbd\x62\x9c\xe1\x27\x05\xc2\x11\xa2\xe5\xc9\x0b\x98\x2a\xb6\x08\x4e\x73\xb5\x1d\x1b\xe5\x15\x5d\x28\x61\x84\x9f\x97\xec\x08\xad\x00\x14\x50\xd1\x27\x9f\x47\x22\x14\x88\x8e\xef\x03\xdd\xd4\xe1\xb4\xbb\x23\x48\x76\x85\xf5\xaa\xd6\x58\x4c\x67\xfa\x9c\x9b\x92\x1f\x4d\x76\x67\x79\x90\x7d\xe7\xd6\x1b\x3a\xba\x3b\x64\x58\x25\x13\x28\x79\xa0\x52\xd7\x1c\x57\x32\x92\xd2\x5b\x9f\xfb\xaa\xd6\x3f\x4b\xbe\xce\x7b\xf6\x35\xd1\x04\x61\x65\x38\x42\xf8\x88\x81\x19\xca\x49\x1a\x95\x46\x1c\x98\x0e\x44\xcb\x68\xd4\x18\x3f\xbd\xbb\xd9\xf4\xb9\x36\xc6\xc5\xce\x3f\x8d\x87\x68\xcd\x9d\x87\xa0\xe7\xea\x5d\xdb\x60\x84\x2e\xbb\x7e\xb7\xb8\x7e\x71\xdd\x78\x8a\xa5\xa7\xdd\xc7\xaa\x42\x67\x8d\xaa\xfe\xf8\x3e\x73\x0e\x74\x45\x77\x52\xc8\x70\x40\xf6\x0e\xb8\x09\xe8\x07\xdd\x90\x6f\x36\x78\x63\x44\x63\xdb\x32\x3d\xd8\xb0\x22\x9e\xc4\xe2\xba\x89\x58\x43\xf6\x48\xf8\x44\x3c\x05\x22\xa8\x36\xa6\x65\xd5\x74\xd5\x7d\x53\xde\x8d\x26\x68\x50\x2f\x0d\xfd\xb3\xa1\xc4\x2a\x03\x68\x32\x28\x90\xb9\xb2\x64\x47\x09\xda\x9c\xbc\x2d\xda\x51\x06\x4b\x40\xb5\xc5\x56\x75\xda\x30\x4c\x97\x0d\xe9\x2b\xbb\xa9\x23\x02\xd8\xbe\x0f\x0b\x05\xc1\x36\xa3\x8d\x7b\x05\x49\x07\xf9\x92\x83\x9f\xe6\xbb\xf6\x93\xa9\xe6\xa2\x17\x41\x93\x75\x08\x41\xf0\x82\xff\x04\xf9\xb0\x8b\x72\x89\xf2\x40\x74\xb2\xe2\x44\x33\x1c\xc7\xc0\x55\xc3\x5f\xfa\x0f\xe8\xfb\x92\x4b\x4c\xaf\x27\xb2\x63\x24\xd9\xfe\x12\x88\x3c\x13\x9f\xe0\xc5\xab\xaa\xb9\x93\xd1\x0d\xac\xf9\x16\xf7\x5f\xc3\xfc\x26\xeb\x42\xa8\xca\xfa\x52\xe4\xa9\x7f\xca\x45\xf2\xb0\x0e\xa4\x54\x43\xf5\xa6\xaf\x65\x21\x7a\x64\x07\x42\x9a\x68\x70\xa7\xc7\x79\xca\x1e\x32\x05\x80\x37\xe1\x24\xa0\xb7\xd8\x69\x74\x31\x8c\x0b\x89\x19\xf7\x02\xff\xbd\x99\x41\x00\xd7\x9c\x19\x23\xbe\xc3\xcb\x4b\x98\x09\xf1\xc7\xa7\x32\xff\x60\x44\x71\xd9\x33\xef\x56\x8e\x0f\xb1\xac\x9d\xcb\x1a\x82\x5e\x2e\x6e\xd0\xb1\xd1\xd4\x8e\xf0\x98\x5f\x7e\x0c\xef\x19\x41\x21\x72\x5c\xd9\x06\x13\xa4\x33\x14\x56\x87\x65\xd3\x31\xa1\x1b\xbc\xb3\x5f\x9d\xfd\x68\xf6\x23\x2a\x12\xe8\x7a\x44\x83\xc9\x8e\xc2\x8b\x93\x6a\x10\x14\x0f\xb9\x7a\x56\x65\xfa\x01\xf3\x2b\xba\xa6\xb7\xd4\x27\x7d\xbb\xc5\x31\x59\x53\xf2\x18\xd1\x00\x3e\x64\x1c\x81\x5d\x61\x41\xe5\x07\x04\x23\xba\x04\xed\x38\x0f\xd7\x21\xff\x52\xfd\x97\x8f\xeb\x7a\x6e\xa8\x5d\xe2\x55\x45\x52\x63\x8e\x4d\x66\x74\x9d\x93\x29\x74\xce\xca\xbd\x29\xe7\xa3\x06\x5a\x0d\x54\x13\xfd\x65\x8d\x5f\x53\x7c\x2d\x05\x4e\x00\x46\x65\x04\x50\xed\x5f\x2a\x66\xf6\x47\x68\x38\x60\xd5\x91\xb3\x67\xd2\xe4\x2d\x70\x7e\x6e\xf1\x5d\x90\xe5\xd4\x8e\x5d\xcc\xaa\x0a\x6e\x85\x1b\x4c\xcb\x8e\x9f\x08\x4e\x07\x13\x60\xd5\xa2\x19\x93\xbb\xe6\xe4\x2d\x07\x4a\xf6\xbc\x05\xcc\x95\x42\x5f\x03\x80\x02\x20\x47\x06\x07\x42\x26\x1e\x4e\x11\xc5\x89\xba\x21\x1c\xf2\x49\xf0\xe1\x34\x70\x79\x37\x38\x9b\xbf\xe6\x06\xba\x99\xb0\x16\x5d\xd1\xec\x19\xa9\xac\xa3\xbc\xa2\x38\x8e\xd9\x86\x32\x14\x4f\xf8\xf2\x3d\x0a\x32\x4f\xb8\x75\x7b\x17\xb8\x76\x5e\x55\xec\x4d\x75\xf9\x83\x47\xde\xf2\x69\x81\x23\xf8\xe5\x42\x2f\x84\xb4\x50\x40\x13\xbb\xc3\x9c\x31\x63\x04\x9d\x4b\x80\xb2\xe6\x49\x8f\x70\x4b\x76\x24\x50\xfe\xd0\x34\x4c\x60\xc5\xf5\xaf\x1f\xa2\xfe\x11\x96\x3b\x35\x9e\xaf\xe4\x11\xfb\x1c\x38\x36\x81\x3e\x90\x9f\x51\xf2\xa7\xa1\xd9\x70\xe9\xc4\xba\xae\xf3\xd0\x3e\x89\x37\xd4\xa5\x74\x1c\x2b\x92\x65\xc7\x00\x7c\x29\x6b\xeb\x9c\xf9\xde\xbd\xc5\xd1\x27\x56\xcd\x06\x55\x5d\x3c\x66\x0f\x47\x56\x82\x97\x29\x7b\x29\x72\x74\x36\x75\x00\x68\x76\xd4\x61\x69\xf9\xa5\xac\x03\xf2\x53\xea\x70\x76\xc8\x2c\x54\x48\x5f\x76\x0d\xa8\x36\xb4\xc8\x42\x04\xac\xaa\x28\x6a\xa4\xc1\x14\xd0\x62\x0b\x00\x5c\x9e\xf2\x92\x6d\xb4\x4f\xb0\x86\xcb\x0c\x26\x36\x71\x78\x82\xd5\xb1\x65\xd7\xa3\x8f\x0a\x35\xe9\x56\x43\x98\xd7\x46\xd2\x2b\xb9\x20\x93\xb7\x9c\xf5\x0b\xae\xef\xb7\x50\xe0\x8e\x0a\x72\x95\xdb\xc2\xa1\xa5\xb0\x86\x85\x52\x4c\x43\xf6\xf6\xe6\x93\xb2\x13\x99\x35\x5b\xc3\x24\xa6\xac\x74\x00\x64\x01\x23\x70\xec\x81\xf2\xd8\xe0\x4e\xf3\x5e\x1d\x86\xd2\x14\xad\xb9\xf7\x4e\x9a\xdf\x41\x96\xdf\x91\x49\xf0\x91\x7a\x4a\x0b\x08\xc1\x99\x8d\x24\x37\x7e\xd5\x43\x55\xf2\xb3\xc1\xa4\xfc\xe4\xa1\xf2\x84\x3f\x62\x52\x42\xa3\xcb\x11\x80\x01\x8f\x84\xa2\x16\x7e\xcc\x75\x99\x7f\x20\xa2\x54\x18\xe0\x07\x85\xe3\xb2\x66\x07\xb2\x15\x1b\x9a\x26\x86\x74\xe7\x72\x7b\xe5\x9a\xe6\xce\x6b\x79\x91\x3b\x12\x5f\xd3\x47\x98\xdd\x7c\x80\x5e\xea\x1c\xb3\x08\x57\x91\x92\x9f\x21\x35\xd5\x94\x61\xe4\x1a\x4e\x81\x7f\xd6\x8c\xff\xe6\x9c\x43\x84\x7c\x9c\x50\x00\xfb\x8c\x39\xc4\x81\xae\xf9\x81\x17\x08\x2a\xa6\xa4\x50\xd9\x90\xcf\x88\xde\xa5\xc8\xb1\xe5\xf7\xa1\xfd\x57\x41\xaa\x7f\x7f\xfe\x31\x8d\xa0\x33\x35\xef\x9d\x67\x68\xcd\x83\x68\xcb\x85\x3a\xcb\xd5\x61\xa3\x0c\x0e\xe8\x38\xac\xe9\xc3\x9e\x6c\xda\xbb\x3f\x99\x1e\x33\x63\xe4\x23\x3b\x73\x2c\xf1\x19\xde\x27\x2d\xcc\x3f\x6f\xf2\x9c\x26\xfb\x98\x25\x54\xc9\x53\x04\x52\xdf\xac\x4c\xc4\x09\x67\x07\x1e\x9f\x51\xab\x7d\xba\x9f\x13\x90\xe1\xf9\x96\xcc\x63\x3d\x2f\x1c\x34\xf0\x65\x17\x00\x5a\x33\x54\x9a\x90\xb9\xfe\x6b\x0e\x99\x29\x3b\xbc\x23\xf0\x98\x22\x46\x97\x22\xc3\x80\x64\xce\xe2\xc3\x0a\xcf\xf0\x3e\x6c\x24\xfd\x1f\x8f\x29\x6e\x25\x3f\x54\x08\xb6\xe8\xeb\x52\xa5\x6f\x3c\xf0\x8e\x5e\xa9\x31\xbe\x78\x16\x17\x08\x09\xec\x01\x12\xa9\x00\xdf\xca\x37\x2d\x47\xf0\x47\xbf\xa4\xda\x22\x5d\x8d\x03\x84\x07\x0c\x97\xf6\xe5\x59\xc9\xd5\xf3\xae\x70\xe5\x42\x96\x8b\x41\x03\x14\x18\xa1\xf6\x17\x39\x0f\x51\x5a\x32\x55\x11\x40\x7e\xdc\x32\x1c\xd6\x23\x4c\xd0\x25\x81\x74\xa0\x97\x18\x74\x6e\x62\x54\x25\x5d\x30\xe7\x27\xfb\xc6\x41\x3a\x9f\xa3\xc6\x67\x43\x86\xd4\xb9\x8f\xce\x33\xb5\xf6\xb3\xc0\x6f\x4a\x10\xa7\x4f\xfe\x08\x45\x0a\xc7\x25\x2d\xc1\xf2\x8a\xce\x68\x12\x1f\xdb\x17\x38\x54\xe0\xfd\xc7\xe0\x1f\x0c\x50\x38\xe4\xe8\x12\xe0\xb5\x82\xdb\xf4\x1e\xea\x26\x37\xb8\x60\x8f\x0f\x97\x55\xdc\x8b\x11\xfd\x6f\x1e\x6d\x21\xb2\x6f\x21\xbc\x7b\x02\x6c\xb4\x45\x71\x45\x03\x5e\xa6\xfd\xa2\xc6\xa3\xd2\xc6\xbd\xd2\xda\xbd\xc2\x95\xc3\x9c\xf2\x7e\x91\xfe\x69\xca\xe4\xb1\xcf\x6f\x98\x97\x86\xd2\x15\x53\x16\x5f\x9a\xc0\x8b\x96\xd1\x37\xba\x44\xa3\x82\x0e\x53\x23\xf1\xca\xd8\xa9\xd1\xad\xdf\x2c\x13\xf4\x41\xd5\x9d\x57\xa3\x8b\xff\x1d\x80\x96\x19\xee\xdc\xfb\x38\x2f\xff\xf9\x6e\x07\x2a\x64\x1b\x36\x3c\xef\xdf\x56\x0d\xb8\x48\x45\x7b\xb5\x1a\xb0\x2a\x87\x29\xf8\xd7\xa2\xea\xef\x53\x44\x2d\x15\xfd\xa9\x54\x8b\x9d\x4a\xdb\xfb\x75\x2f\x2c\x51\x8f\x97\xd9\x88\x4b\xde\x94\x98\x95\xff\x97\x23\xe2\x68\xe1\x0f\xd2\x44\x43\x52\x7c\x95\x2a\x24\x09\xdb\x97\xd9\x3f\x4e\x60\x7a\x74\x6c\xa9\xd1\x53\xb6\xd9\x42\xe3\x7d\xa7\xc1\xde\x42\xa1\x14\x2f\x87\x20\x1c\x56\x15\x59\x9f\x2e\x0e\xc5\x87\x34\x6d\xa5\xec\x49\xd8\x9c\x2e\xe2\x33\x29\xb2\xa0\x35\x64\xce\xad\x89\xfa\x23\x99\x64\x4f\x25\x2f\x38\x37\x15\xf8\xd7\x80\x77\xa1\x81\xba\x4e\x52\xa9\x59\x53\x69\xd9\xd3\xc8\x44\xb3\x82\x26\xdc\x74\x5c\x56\xa2\x24\xc3\x99\x6c\xb0\x43\x68\x7c\x5f\x34\x9d\x1e\x07\x1c\xea\xdb\x27\x62\x50\xc2\x70\x58\x56\x67\x1a\xc4\x24\xf4\x27\x3e\x05\xbe\xf0\x2a\xae\xf5\x08\x2f\xd0\x1a\xca\xc8\x2e\xad\x4e\x66\x48\xf9\xcd\x87\x05\x27\x30\x90\xe2\x2d\x30\xcc\xdc\x22\x24\xb8\x71\x99\xe2\xc5\x12\xee\x59\x54\x55\x33\x55\x55\xe4\x98\x52\x0a\xa4\x9b\x68\x83\xb1\x46\xb4\x58\x34\x07\x2a\x6b\xfe\x1a\x4d\xe0\xc3\xd8\xea\x48\xc0\xfb\xee\xd2\x83\xff\x8c\x17\x5d\x45\x44\xd9\x74\xff\x0e\x05\x48\x91\x7f\xdf\x73\x3a\x36\x3d\x57\xaf\x6d\xe2\xfb\xb0\xe1\xf9\x8f\xff\x0b\x18\x9b\xb3\x16\xe0\x9a\x55\xd6\xa6\x71\xba\x02\x57\x58\xf8\xad\x03\x29\xbd\xd0\xa5\xbd\xd4\xa5\x11\xd4\xbc\xbd\xf5\xa2\x3a\x52\xd0\x0a\x8b\xf0\x5b\xc4\x5f\x20\x36\x76\x28\xfe\xab\xfa\xb2\x27\xfc\xcf\xf1\x84\xc1\x90\x00\x95\x07\xea\x86\xc5\xf7\x79\xb7\x10\x00\xb8\x80\x24\x48\x78\x99\x26\x1f\x63\x1b\x6d\x44\x61\x48\x5c\xe3\xd9\x55\xc5\x32\x6a\xe3\x23\x46\xc7\xdc\x06\xef\x5c\x8b\x31\x6e\xf1\x2e\xc9\x7c\x33\x23\xd0\xa1\xd9\x90\xc1\x47\xfe\xdf\xe3\x37\xfe\x6f\x48\xc2\x40\x74\x72\xff\xf2\x32\xe4\xec\x83\x22\x0c\x7e\x8d\xea\x9e\x1b\x41\x09\x81\xe8\x24\xf4\x67\x9d\xc5\xdf\xf8\x2a\xdf\x35\xdd\x98\x6f\x10\x61\xb3\x19\xe8\x7b\xe1\x95\x45\xb4\x4a\x7c\x14\x91\x88\x3a\x56\xd7\xe7\xdf\x6c\x91\x34\x50\x59\x53\x5c\xe8\x23\xf7\x22\xa5\x39\xba\x76\x88\x9f\x03\x8b\x98\x2f\xe5\x49\xcf\xaf\x26\x69\x9f\x86\x93\x70\xd9\x52\x20\xea\x83\x17\xb2\x39\x2e\xd1\x27\xbe\x73\x5f\xdc\x22\xae\xd8\x11\x7e\x8b\x24\x23\x08\xe7\xb8\x3f\x97\xfc\xd8\xea\xcf\xa3\x4e\x35\x66\x40\x45\x14\x26\xe5\x3d\x68\xe2\x0b\xe0\x65\xa9\x4b\xeb\xa5\x5d\xc9\x8e\x24\x56\xa8\xf5\xae\xbc\x96\x08\x86\x6e\x06\x9d\xee\x61\x1f\x59\x7b\xa9\x57\xe5\xe8\xbc\x67\x70\x9f\x03\x21\x69\x62\x1c\x1b\xf2\x87\x93\xe4\xf2\x5e\xe4\x86\xea\x52\x03\x4e\x39\xdf\x66\x07\x82\x8b\xe7\x4e\x54\x41\xb0\xa4\xc4\x19\x13\xfd\x2f\xa5\x95\x85\x7a\x66\xa2\xd0\xa7\x78\x56\xe7\x19\xd4\xb0\x52\xdc\x82\x15\x96\x64\x93\xd9\xfe\xed\xc1\x49\xf2\xf3\x8f\x25\x76\xe0\x25\x10\x3e\x07\xa2\x9a\x52\xb9\x7a\x85\x8f\x2c\xda\x43\x2c\x5c\x56\xe2\x24\x49\x8a\x07\x94\xfa\xb1\x32\x7f\x96\x49\x9a\xa0\xc7\x0f\xfe\x82\x2e\xfb\xf4\xef\x7b\x4a\xfe\x0e\x0f\xd9\x6c\x7c\xad\x69\x20\x2a\x41\xc8\xe2\xec\x92\xe8\x87\xc9\x9a\x18\x5b\x86\x57\x30\xef\x55\x22\x02\xec\xb9\xef\xf5\x07\x9f\x43\xe9\x50\xc9\x99\x05\xdc\x09\x66\x07\xfd\x50\xc4\xaa\x96\xd7\x87\x61\xeb\x46\x8c\x4b\x9f\x58\x2c\x95\x13\x85\x89\x53\xb4\x0c\x74\x0b\xe9\x86\x5e\xc0\x03\xcd\xf0\xe2\x4d\x6e\xdd\xdb\xbf\xfe\xbc\x14\x51\x25\x00\x89\xe3\x88\x33\xa1\x24\x21\xa2\x91\x0a\x14\xd7\xe6\xa7\xc5\x56\xfa\xcb\x47\x9a\x26\x98\x9e\x50\xe9\xdd\x8b\xcd\x27\xbc\x0c\xc9\x89\xa6\xe1\x3e\x51\x58\x23\x6a\x5e\x5a\xbf\xbb\x9a\x81\xa8\x27\xd3\x57\xa7\x0e\xba\x10\x6c\x64\x79\x67\xcf\x91\x4d\xaa\x48\x30\x24\x3e\x6d\x79\xb4\x6d\x6e\x05\xd3\xfc\x9c\xcb\xee\x85\xba\xe7\x6a\xca\xb0\x9f\x27\x76\x5d\xd5\xd9\x25\xfa\xbe\x64\xb9\x7b\xa6\x0b\x40\x7f\x15\x9b\xbb\x9a\xfe\xe5\x88\x35\x7d\x9f\xf3\xec\x12\x4b\x38\x15\x57\x4f\xc9\x99\x8c\x38\x40\xeb\xce\xc3\xff\x70\x30\x2f\x49\x3d\xb4\x5f\x73\x87\x71\x27\x0e\x45\x4c\x92\x7d\x5a\x50\x93\xd3\x0a\x1e\x74\x41\x93\x99\xc0\x98\xf0\xbe\x6b\x82\x77\xce\x13\x25\x9b\x86\xc0\xc8\xa3\x9c\x16\x62\xef\x56\x79\xa4\xf3\xe7\xc5\x9b\x23\xce\x86\x0f\xbf\x09\x44\xae\x80\x89\x54\xdf\x1d\x31\x9a\x18\xf9\x4b\x2a\x09\x5a\x40\xa1\x21\xff\x69\xbc\x2f\x5a\xbe\xc0\xac\xe2\x48\x26\xbb\x54\x46\xdd\x8d\x91\x5a\x1b\x23\x8a\x53\x6c\x4c\x79\xf1\x10\x3d\x28\x8e\x9f\xca\x81\x9a\xf5\x7a\xa1\x07\x27\xb5\xb9\xee\xb4\xa4\xe1\xa4\xbc\xba\xa9\x73\xe0\x39\x45\x9f\x32\xff\x98\x4e\x62\xc7\x6c\x22\xef\x57\x12\x7a\x9a\x4b\x7e\x2e\x74\x6c\x30\x4e\x16\x87\x88\xe4\x6a\x5b\x10\xf4\xb9\xc0\x80\x59\x3b\x86\xf9\x82\x27\xea\x3d\xbf\xf9\x57\xf3\x08\x59\xce\x2a\x26\xdf\x27\xef\x57\xe2\x92\x86\xdb\x85\x90\xec\x34\x60\x94\xc9\x71\x91\xb0\x3f\x67\xf5\x35\xf7\x9f\xe8\x76\x4d\xa5\xd3\xe5\x15\x3a\x98\x74\x46\x03\xfe\x27\x16\x69\x6b\x56\xe0\x86\x51\xa1\x61\x7a\x35\xce\x7b\x1f\x86\x28\x4d\x0c\x03\x2a\xdd\x4e\x1b\x50\x53\x40\x9f\x18\xd2\xf0\x02\x46\xe7\xa0\x3b\x69\xae\xdc\xb0\xe8\x9f\x0f\x5b\x91\xb6\xab\xfa\x8e\x28\xbf\xd1\x68\x7d\xd9\x80\x57\x4b\xc3\xf9\x04\xd3\x55\x94\x60\x3b\x7c\x07\xc2\x8c\x9f\x07\x2a\x94\xd7\xe9\xf6\x42\xb0\xbc\x24\xf9\x44\xc7\xae\xba\xc7\x00\xe8\xa6\x0d\x73\xcf\x2b\xdc\xaa\xbc\xb2\x0c\xee\x8e\x7d\x53\xa8\xdb\x5b\x64\xe3\x20\xc9\x91\xf4\x8a\x34\x58\xfd\xb1\x4c\x2d\x1d\x0e\x3a\xa6\x89\x39\x92\x09\x80\xdd\xb1\x00\x02\xb4\xeb\x0f\xea\x3b\x6a\xe0\xc1\x83\x8f\xcd\xbf\x36\x70\xad\xeb\xda\x2e\x4b\xa7\x67\x47\x76\x9b\xd6\xb3\xf4\x44\x75\x8c\x24\xcf\xb6\x0e\x3a\xaf\x25\x92\x15\x67\xc9\x31\x6d\xac\x23\xd4\x99\x38\xbb\x54\xf9\xc7\x98\xb4\xf1\x28\x4d\xb4\xe6\xf4\xb1\x64\x53\x14\xd5\x93\xe2\xa4\x5d\x10\xe1\xa5\x15\x2e\xb9\xf3\xa6\x12\x74\x71\xfd\x59\x17\x6d\xa8\xf2\xc6\xe6\xf3\x0c\x26\xe8\x6f\x79\x41\xa5\x75\x76\x4f\xd6\xb6\x76\xa7\x2d\x07\x09\xc2\x1b\x2c\xad\xd5\x9a\x29\xd4\xda\xc8\xf2\xd5\x27\x69\x84\x4a\x94\xed\xb1\x45\x50\xd1\xd7\x75\x5c\x1e\xa7\x81\xdd\x7d\xdb\x3f\x2e\xee\x35\x63\x9f\xa7\xed\xfe\x49\x24\x0d\xc0\x03\x0a\x65\x38\x6d\x48\x57\x05\x52\x1e\xe3\x96\x47\x96\xde\x0e\xb7\xcf\xb1\xc4\x76\x54\x19\xf2\xe0\x6a\x48\xb1\x7f\x71\x70\x01\x77\x8f\xd2\x95\xeb\x4a\xec\x60\x65\x35\xcc\x97\xc9\x31\x65\x8c\x54\x42\x00\x25\x13\x16\x26\x42\x5f\xd9\x0c\x4c\xb6\x03\x58\x52\xe7\x15\x3b\xb2\x35\x24\x0a\x63\x5f\xfe\xe9\xc4\x24\x50\x4a\xd1\x90\xa0\x31\x88\x8f\x1e\x58\x96\x6c\x44\xc4\x9f\xbf\xfe\x7e\x9d\xbe\xb3\x32\xff\x87\x1a\xb0\xee\xd9\x82\x18\x48\xc3\x9f\x56\xcf\x6f\xa2\xd3\xc5\x11\x9b\x85\x2e\x80\xdf\x4d\x40\x45\x14\x90\x25\xf8\xde\x0c\x31\x31\x63\xf4\x3e\x68\x67\xde\x31\x6c\x77\xd5\xac\xc6\x12\x85\x46\x67\xf0\x97\xec\x87\x24\x70\xf6\xf7\xad\x67\x95\xb9\x8b\x6a\x85\x96\xfc\x8c\x54\xb7\x9e\x7f\xec\xe2\xc2\x85\xf7\x23\x2c\xde\x99\x71\xbc\x8c\x86\x8e\xf5\x6e\x79\xb2\x26\xd8\x9c\x3a\x32\x98\xc7\x40\x6b\x4c\xb5\xda\x2d\x1d\x03\xd6\xce\xbd\x15\x65\x48\xaa\x8d\x00\xae\xdd\x24\x15\xea\x4e\x5d\xb5\xfa\xa0\x6a\xeb\x5d\xd8\xd0\x52\x74\xd1\x91\x5c\x60\x07\x74\x86\x32\x7d\xda\xb2\xc5\x58\x95\xe5\x8a\x4b\xe2\x62\x8f\x48\xad\xbb\x15\xde\x33\xdf\x30\x65\x44\x0d\xba\x1d\xd4\x15\x24\x39\xab\xd1\x89\xa1\x9c\xbe\x32\x38\x46\xc8\x3b\xa0\x54\xee\x5a\x3e\x09\xb8\x26\x17\xcb\xa2\x6c\x41\x8e\xc8\xff\x98\x2f\xb0\x33\x5a\x56\x27\x3c\xa1\x2c\x98\xd4\xee\x9d\x8c\x62\x28\x35\x7c\xcd\xd0\x17\x04\x39\xae\xb8\x3a\xd1\xd2\xb8\x17\xbc\x10\x35\x7c\xf8\x94\x1a\xce\xa9\xea\x32\xd1\x00\x2e\x1c\xc1\x50\x1d\x41\x6d\xf2\x23\xda\x86\xf6\xcb\x56\x54\x0f\x00\x81\x87\x54\xd3\x72\x07\xc1\x6a\x78\x34\xdb\x26\x09\x8f\x2c\xe0\x89\x6f\x2a\x37\x47\xe7\x8c\x63\x4c\x52\x58\x9d\xab\x73\x16\x44\x8d\xae\x6e\x5f\xb1\x44\x0f\x1c\x42\x3e\x9d\x05\x68\xee\xd1\xbb\x9a\xe0\x13\x39\x23\x9d\xd3\x89\x03\x2f\x34\x31\x91\xd9\xa5\x4e\xc1\x46\x88\x3c\x4e\x1d\xa6\x8b\xb2\xaa\x5f\x43\xea\xba\x07\xc1\xb6\x76\x18\x9c\x30\x1b\xbf\x02\x00\xac\x28\x58\x84\xd1\x43\x77\x82\x4e\x22\x2c\x9d\x3f\x11\x97\x19\xca\x8c\x39\x36\x54\x0e\x4f\x3c\xbe\x75\xdc\xc9\x12\xb5\x50\x61\xbd\x55\xf1\x08\x31\x97\x8b\x7b\xac\x30\x97\x5b\xb1\xcc\x1c\x29\x79\x66\xec\x1b\x2b\x3a\xfd\x33\xd2\x31\x79\x62\xb7\x16\xfb\xb1\x5e\x35\xa7\xe1\xd0\xb8\xfc\xcf\x77\x80\x60\xad\x85\xed\x58\xfd\xe1\xdf\x3b\xa9\x78\x64\x6a\x66\xf4\x94\x51\x91\x4d\x77\x5d\x56\xb5\xc1\xca\xa9\x17\x1b\xdb\xb1\x46\xbe\x75\xa6\x86\xc2\xa5\x67\x8f\x63\xbe\x24\x2a\x22\x9c\x57\xbd\xcb\x8b\xdb\xd0\xdc\xf7\xf2\x31\x0d\x78\x8f\x31\x2b\xbf\x99\x2b\xcc\x29\x07\xca\x8f\xb4\xd1\x5c\xe7\xc1\xf2\x23\xa0\xc2\x8a\x50\x32\x98\x68\xe2\xc6\x77\x78\x02\x01\xcd\x7c\xef\x3d\x8d\x68\xaf\x92\x60\x08\x40\x2c\x52\xfa\x8b\x69\x24\x35\x04\x4e\xf4\x45\x5e\x5c\xe2\x90\x63\x14\xaa\x25\xd2\x50\x6c\xaf\xa9\xdd\x92\x15\x8e\x97\x9f\x99\xad\xc4\xb9\xc7\xa3\x32\xd6\x53\x60\x6a\x1f\x90\xd1\xc6\x98\x7d\xd7\x2d\x93\x7a\xbd\xfc\x82\x3f\x8f\xe2\xf8\x7b\x48\xd2\xeb\x87\xdc\x8c\xe2\xe4\x5d\x91\x06\xe5\x11\x66\x30\x0c\x7c\x99\x2e\x55\x8b\x95\x9c\x69\x2c\x72\xfb\x75\x70\xdd\x5e\x67\xcc\x9d\xfd\x33\x06\x1a\x88\x68\xc2\xe4\xe1\xf4\x8a\x66\x33\x2c\x2d\x26\xc4\xd9\x2e\xe7\x7b\x18\xf0\x4b\xa5\x28\xd9\xdf\xd4\xad\x0c\x5c\xf1\xb1\xc2\x5c\x39\x00\xdc\x47\xa0\x08\xaf\x91\xdc\xd0\x19\xd6\x05\xc5\xa8\xea\xeb\x40\xfd\xf2\xc3\xa5\xa4\x0f\x44\xcf\x87\xcf\x3b\x35\xa5\x8a\xbd\xe9\x38\x1c\xd6\x56\x9e\xc0\x55\x8c\x24\xbf\xa3\x00\x9c\xc2\xc4\x03\x21\x83\x0e\xcc\xc3\x75\x25\x4e\x74\x1f\x4f\xd1\xbd\x00\x11\xbe\xc7\x6f\x3b\x10\xe2\xbd\x18\xc1\xb9\x2e\x62\x6e\xb2\x79\x8d\x11\x9e\x01\x93\xb6\x19\x41\xe4\x54\xee\x3c\x8c\x86\x42\xf6\x16\x58\x11\x15\x93\xc6\x31\xda\x5b\x28\x5a\x47\xd1\x91\x17\x3e\x79\x2e\x97\x24\x99\x48\x0c\x31\x84\xe7\xda\x88\x38\xe0\xc4\x2f\x2b\x4e\xd8\x7c\x0c\xec\x9b\xc0\x3c\xe4\x1f\xb6\xba\x64\xf8\x0b\xd1\x1b\xd3\x19\x0d\x07\x2f\x84\xc0\x8a\x19\x64\x6a\x8d\xbb\xcf\xbd\xc4\x75\x4f\xb6\x7b\x7a\x8d\xc0\x79\xa0\xba\xf0\xc7\xce\x99\x04\x50\xe4\x2e\x83\x07\x30\x45\xd8\xd4\xf6\xc3\xb8\xac\x69\x75\x91\x80\x48\x19\xdc\x02\x11\x15\xbc\xb2\x2c\x03\xae\x15\x25\x31\x56\x41\x7b\xa9\x45\x0e\x64\xc9\xf3\xd8\x96\x26\x9d\x43\xdd\x09\x90\x14\xb2\xab\x97\x66\xa7\x90\x7d\x12\x16\x53\xf1\x7d\x35\x6e\xbe\x78\xfe\xe7\xa1\x44\x2e\x03\x1f\xe8\x2c\xc9\xdd\x63\x6c\xd1\x5b\x20\xda\xf3\x03\xc9\x69\x80\x03\xce\xa3\x40\x9c\x17\xb1\xc2\xcd\x6b\x52\x88\x83\x47\xe8\x2d\x3d\xa6\x62\xef\xde\xb5\x56\xe0\x20\x80\x13\x82\x2e\x5b\xc1\xa4\x54\x4a\xe2\x9b\x4d\x78\xcf\xf3\xdd\x35\xee\x3e\x5a\xe9\x56\xd6\x61\x83\x09\x4c\xe5\xea\x7f\x05\xbf\xec\x2f\x17\xf9\xe6\x46\xf9\x1c\x5a\x88\x3f\xaf\xb9\xf4\x6f\x51\x5e\x8a\xcf\xb0\x56\xe4\x6e\x6a\xb0\x6f\xda\xdb\xfc\x7a\xef\xc3\x6f\x12\x21\x83\xcc\x80\xdc\x4e\x1e\xb6\x04\x71\x20\x3a\x8f\x3e\xa7\xdf\xc3\x3f\x3f\xf1\x7b\x66\x2a\xc3\x7e\xf3\x91\x9a\x1e\x17\xcb\xd5\xca\xae\x0f\x46\x32\xf8\x90\x21\xd5\x94\x3f\x95\xe9\xe1\x3d\x11\xb8\xb5\x3f\x8f\x92\x13\x8f\x4e\x6f\xc8\x60\x53\x1f\xbc\x86\x39\x06\x38\x52\x6e\x3d\x92\x2d\x5f\x43\xd6\xdf\xdf\x67\x57\x11\x18\xed\x43\xb8\x4d\x1b\x4c\xe8\x57\x45\x89\x8e\xed\x3f\x33\x96\x35\xe8\x46\xa9\x6d\xec\x29\x3d\xdc\x02\x43\x74\x97\xda\xd7\xfc\xa0\x58\x88\xec\xef\xa1\x2d\xb5\x0d\xbf\x1f\x0f\x1c\xec\x82\xc8\xfc\x42\x8d\x11\xc9\x3f\x18\xa4\xe3\x65\x44\x06\x3a\x6c\xf0\x9e\x04\x58\x63\x4b\x4c\x80\x93\x65\xc6\x48\x3a\xf0\xa0\x3f\xbe\x0f\xfb\xc5\x07\x9e\x96\x84\x2d\xb1\x06\xd2\x9e\x74\xc7\xb2\x48\xe0\x96\x04\x5a\x6a\x2b\x36\x7b\x36\xbe\xe0\x03\x15\xbc\x3f\xf1\x07\x88\x2e\xc3\x97\xfc\xcd\x0b\xaa\xea\xa8\x82\xc5\x5e\x73\x4b\xb7\xe2\x4c\x72\xa4\xa0\x9f\xf9\x09\x63\xc9\x44\x42\x35\xfe\x1f\x7b\xdf\xad\x73\x31\x8f\x6d\xd7\xdf\xc7\x70\x67\xa8\x50\x4e\x30\x5c\x48\xe7\x28\xe7\x1c\x3a\xe5\x9c\xb3\x00\xbf\xbb\x71\xbe\x01\x8c\x7f\xdc\xdd\x7e\x08\xa8\x10\x41\x70\x8b\xe4\x02\xf7\x5e\x14\xc9\xf5\x26\xba\xdc\x51\x74\xb4\x9f\x00\x48\x5c\xd4\xa4\x08\xc8\x17\x58\xb4\x44\x17\x08\x3a\x3b\x8b\x95\x99\x22\x13\x43\x7b\xcd\x0c\x77\xb2\x10\x8c\xc0\xad\xe9\x0d\xe8\xbd\x43\xe4\xfd\xe4\x08\xb5\xf1\xa8\x3e\xd3\xa4\xe8\x6d\x8c\x5c\x50\x42\x6a\x69\x9d\xc9\x8a\xd3\x2d\xcb\xba\xd0\xa2\x44\x4c\xa5\x8a\xa7\x31\x9a\xcb\xd7\x9d\xd0\x69\x06\x94\xfa\x36\xbc\x7e\x8b\x6d\x8f\xe4\x8f\x31\x82\x25\x7c\xfd\x63\xa3\x0b\x07\x19\x35\x61\x74\xb3\x6a\xef\x00\x18\x09\x48\x05\x45\xa5\x1d\x20\x6f\x70\x97\xa7\xd8\x02\x44\xa1\x8d\xbe\x50\xe5\xe1\x0b\x80\xe7\x89\x12\xdb\xa1\x27\xbd\x1c\xf8\xa3\x3b\x61\x74\x01\x96\x27\x61\x73\xb4\x49\xe6\x00\xbd\x26\xc1\x6e\x9f\x62\xc2\x5b\xc4\x97\x46\x48\x7d\x85\x09\x7c\x82\x13\x30\x51\xed\x22\x1c\xf1\xc8\xe3\xd8\xd7\xec\xaf\xa3\x34\x46\x84\x1e\x53\x2c\x13\x28\xe3\x84\xe8\xd2\x3b\x6b\x2c\x77\x4b\x9e\x71\x39\xdc\xc0\x29\x20\x6b\x01\xd1\x19\x96\x64\x94\x71\xd0\x68\xc7\x2e\xaa\x79\xf3\xc3\xff\x9a\xb5\xcf\x10\x19\x7c\x9f\x15\xca\x5d\x4d\xfd\x60\x07\xb9\x19\xe2\x17\x0c\x49\x1c\xbd\x80\x92\x46\x04\x3a\x9c\x89\xa2\x07\xe9\x5e\x5c\x21\x52\x17\xd5\x23\xcc\x7f\x84\x6e\x49\x9a\x89\xd0\x54\xe0\x28\xa2\x73\x48\xe8\x64\xa7\xee\x8e\x16\xda\x33\x82\xe4\xa7\x9e\x12\x91\xe4\x18\xaa\x8d\x00\x1d\x7d\xb2\x9e\xb7\x3d\x4f\x7a\xd4\x72\x22\x8c\x5a\x1b\x5b\xb9\x07\x92\xc5\xf7\xeb\x2a\x5e\x1f\x80\xb5\x94\xaf\x6f\x19\x27\x0b\x5a\x99\xc4\x46\x67\x59\xa4\xe5\x8e\x72\x7c\x5f\x75\xc6\x11\x7e\x91\xeb\x73\x4d\x8a\x3b\x63\x18\x17\x5e\xf5\xa2\x3e\x94\xa8\xa0\xfb\x4c\x13\x61\xc8\x24\x44\x51\x5d\x71\x34\xd4\xd3\x63\xda\x6b\x61\x47\xb9\x19\x9e\xc3\x2a\x2d\xca\xa7\x1d\x4e\x88\x5c\x8b\x52\x2d\x0f\xd4\xef\x2f\xd5\xf3\x79\xbb\x30\xe9\x9b\x48\xc6\x19\x30\x46\x64\x85\xc5\xf6\x42\x52\x7d\x95\x1f\x85\x4a\xbc\x5e\xb6\xbf\xec\x45\x16\x47\x88\x90\xf3\x12\x0b\xe3\xb2\x47\x8e\xd7\xcf\x8f\xfe\xf9\xd3\x27\x9b\xa5\x68\x41\x9b\xa8\x07\xc2\xc6\x8c\x36\x07\x06\xb0\xab\x30\x83\x30\xf1\xcd\x57\x73\xe2\xee\x4a\xc7\x3b\x4b\x3f\x8f\x6f\xc3\x0f\x90\x6d\x1e\xc3\x13\x0f\x17\x47\x8c\xff\xe0\x71\x79\xa0\x93\x9f\x45\x1f\x82\x3c\x94\x61\xf5\x37\x62\x0b\x51\x3a\xf6\xf1\x02\x6d\x2b\x10\x84\x80\x92\x68\xcd\x38\xda\x08\xaa\xc8\x0c\xe1\x0b\x9e\x86\x48\x38\xe3\x1c\x43\x78\x59\xa4\x0a\x9e\xed\x18\x40\x54\x7f\x24\x32\x44\x69\xd0\x6e\x68\xac\xf7\x28\xa7\x71\x2c\x4a\x35\x5e\xec\xc7\x13\x09\xf0\xbc\x9b\x04\x82\xf6\xd4\xa2\x4e\xf7\x16\x8b\x71\x55\x9e\x3c\x91\xa0\x35\xa6\x09\x3a\x65\x32\x4c\x90\x18\xf0\x98\x16\xa5\xdd\x40\x43\x47\x0b\x64\x71\x9d\x51\xed\x29\x49\x47\xca\x91\x04\xea\xd2\x1c\xab\x87\xe2\x78\x3b\x0a\xa6\xbd\xa7\x59\x0c\x14\x13\xfa\x38\xc6\xe8\x58\x1d\x0c\x28\xcc\x38\xf0\x7a\xbe\x7e\x43\x9b\xb3\xb9\x6c\x0b\xd4\x5b\x50\xef\x50\x4e\x37\x68\x56\x9c\xee\x08\xd4\xc0\x77\xe9\x09\xa4\x40\xf3\xc2\x37\x24\x01\x9b\x08\x08\xf1\x1b\xd8\x08\xea\xc3\x36\x78\xb4\xc5\x67\xf1\x81\x48\x07\xda\x59\x53\x6c\x7b\x84\x2c\x3a\xc8\xf0\x2f\x65\x5e\x94\x4a\xcb\xea\xb3\x23\x0b\xf3\x85\x1d\x07\x0e\x29\xc7\xa3\x42\xde\x4c\x09\x2a\xd6\x90\xb2\x39\xbc\xd7\x9a\xb0\x5a\xdc\x9e\x4e\x5b\x52\x02\x28\xf7\x2f\xcf\x29\x8f\x14\x63\x7f\x7b\xc4\xf6\xe1\x8d\x78\xf6\xf2\x5a\x5e\x94\x0d\x85\x75\x8e\x70\x3d\x82\x67\xbd\x23\x6d\x76\xec\xce\xe5\xe9\x67\x77\x4a\xa1\x51\x47\x2a\xac\x5f\x7c\x83\x72\x6d\x74\xa7\x16\xbc\x6f\xcb\x13\x59\x20\xfb\x32\x9d\xf2\xad\xaa\x49\xfa\xe8\x0a\x54\xc2\x8a\xcc\x7f\x60\x1a\x3c\x29\x3c\x3f\x1a\xc6\x7b\x79\xdf\xf5\x50\xf3\xbd\x37\xd8\x65\x9c\xcc\xe5\x6e\xc9\xfe\x86\x30\x5d\x7a\xf4\xb9\x52\xe2\x41\x6e\x75\xef\xec\x69\x61\x86\xbb\x21\xb6\x00\xdb\xbb\xf3\x36\x2d\xc9\xf0\xe3\x01\xc5\x92\x19\xa2\x53\x01\x6a\x9f\x1f\x03\xcc\xf3\x76\x16\xf8\x0f\x5c\x1a\xa3\x3b\xb8\xc3\xbc\x28\xf4\x99\xf9\xda\x6b\xbc\x60\xa5\x09\x34\x7b\x5a\x27\x2c\xb4\xf6\xf1\x6e\xac\x52\x8c\x29\xbd\x5c\x9a\x3b\x11\x41\x85\xad\x3b\x1e\xe4\x68\x26\xf3\x0d\xdd\xa0\x51\xca\x73\x52\xdb\x43\x98\xf1\x9d\x3d\xa2\xec\x32\x71\x31\xda\x89\x34\x7a\x61\x74\xd9\xb5\xd2\x3a\xd9\x5c\xdf\x8c\x34\xcc\xb1\x44\x52\xa3\xe5\x9d\xc7\xeb\xe5\x52\xbe\xce\x7c\x4d\x90\xce\x10\xbf\xf7\x46\xa4\x72\x05\x71\x73\xea\x94\xe8\x9d\x85\x30\x0d\xd2\xfb\x85\x3f\x66\xd5\x7d\x13\x5d\x04\x1c\xab\xf7\x4e\x07\x00\x66\xda\x55\x25\xfe\x48\x77\x02\xa3\xb2\xd2\x40\x51\xfd\xc9\x6a\x46\x01\x0a\xb7\xc3\x55\xbb\x82\x32\x55\x60\xab\xf4\xc9\xa8\x81\xaf\x23\x7f\xf5\x17\x44\x29\xd8\xf6\x96\x50\x7a\x8b\x05\x07\x8a\xcd\xee\x31\xc8\xa3\x44\x40\x59\x95\x66\x31\x3b\x42\x88\x94\xbf\x2d\x06\xa4\xe6\x28\x68\x2b\xce\x77\x3e\x7f\xff\xfc\x63\x05\x95\x46\x22\xe3\x14\x90\x48\xec\xb0\x51\x65\xa9\x42\xaf\x31\xba\xee\x8d\x81\xfd\x06\xf8\x93\x9a\x20\x7b\x63\xd0\xa6\x8c\x92\x34\xc7\x27\x4c\x33\xc8\x85\x59\x5f\x0f\x91\xea\xbf\xe8\xff\xc3\xf8\x84\xa4\x02\x9f\x06\x29\xdf\x0d\x29\x4d\xab\xa1\x8b\x63\x3c\xc7\x6f\x9f\xd0\x43\x3c\xc4\x74\xf1\xfa\x0b\x54\x9c\xe3\x91\x0e\xf8\x28\x3b\xb4\xc3\xb3\x57\x44\x35\xd2\x61\xd7\xea\x3a\x28\xcd\x34\xbb\xf5\x45\x1e\xd6\x7b\x65\x71\xec\x04\xad\xbd\x94\x26\x4a\x19\xdf\x6a\x21\xb2\x02\x26\xe2\x21\x1a\x08\xe0\xf0\x1e\x20\x4c\x10\x7d\x21\x0e\x75\xc1\xbe\xf5\x35\xd5\xd7\x09\x39\xdd\xae\xae\x98\x5d\x7e\xd7\xf9\xaa\xb2\xb0\x34\x14\x78\x5f\xbf\x88\xf0\x65\xc7\x0a\x6b\x14\xba\x15\x07\x48\xb4\xe9\xd0\xe3\xd9\x09\x4a\x15\x7e\x01\x4e\xa6\xac\x4c\x42\x42\x84\xaa\xd7\x1f\x20\x0f\xcf\xfb\x9a\x3c\x4f\xe4\xea\x34\x78\xb7\x8e\x66\xe5\xc1\x79\x79\x03\xf5\x1d\xe7\x41\xf8\x9a\x2a\xc5\x3b\x5b\x09\xb4\x2f\x2f\xeb\x33\x05\xb9\x31\xe6\x88\x08\xc8\x75\x8a\x50\xe7\x78\x0b\x58\x0e\x96\x07\x94\xe9\x22\x57\x4b\xce\x79\x7a\x22\x70\xae\x04\xba\xe8\x42\x61\x5d\x39\xd5\x6c\x6a\xd4\x4a\x8f\xd6\x10\x62\xed\x03\x64\xb1\xfa\xc0\x40\x2e\x57\x1f\x0b\x37\x65\x7d\x42\x26\x32\x33\x54\x75\xe0\xdd\xe6\x74\xff\x5c\x21\xaa\x30\xf9\x4e\xda\x7f\xf3\x35\x0e\x94\xe3\x93\xa9\xd0\xa7\x4a\x58\x13\x25\x7f\x7d\x73\x6f\xa9\x70\x5b\x00\x2d\x07\xbe\x1f\xc2\x30\xee\xad\x51\x9c\x7f\x42\x92\x06\x5a\x0f\x53\x39\x62\x58\x17\xb4\x9c\x91\x2d\xcc\x2f\x42\xef\x17\x38\x79\x8c\xaa\xd0\x5a\x90\x36\x93\x60\x9c\xf7\x64\x0f\x7f\xfd\x54\x9e\x28\xb1\xfb\x2f\x5f\x6b\x65\x8b\xb8\xc9\x4b\xe6\x0f\xee\x60\x74\x61\x7a\xb0\xe6\x1a\xee\xeb\xd6\x53\x29\x82\xd4\x61\x94\x7d\x4e\xad\xa7\x39\xbe\x80\x7a\x17\xca\xa3\xb5\xa2\x9b\x13\x75\xe8\xf5\x72\xe0\xc1\xba\xeb\xfb\xa1\x0f\xe5\xdc\xbd\xbf\x1f\x74\x57\x95\x67\x4f\xfd\x1e\x7a\x22\x1c\x7c\xba\x57\x7b\xb5\x59\x2b\x45\xfa\x00\xff\xf4\x60\x7b\x69\x16\xb0\x55\x79\xa8\x95\xbb\x1d\x09\x11\x0f\xde\x19\x2f\x9e\xb7\x7d\x3f\x0f\xb8\xa4\x53\x6a\x48\x77\xbd\x57\x53\x9d\x6b\x8d\x63\xed\x86\x72\x31\x7f\xe8\xf0\xbd\x41\x71\x9c\x66\x5a\x23\x77\x84\xb8\x65\xf5\xc3\x79\x9f\xf3\x84\xc9\x17\x94\xde\x0c\x55\x90\x6e\x4d\x6e\x68\x56\x1d\x42\x1f\x6a\xd3\x25\x79\x73\x50\x98\xfe\xe7\xed\x03\x76\x5f\x13\xe3\x07\xb5\x21\x1d\xf0\xd4\xd5\x53\xdc\xf8\x34\x97\x74\xcf\x10\x2a\xbf\x19\xe1\xd3\xbd\x26\x7c\xd1\xa8\xd0\x05\x09\x9f\x34\x38\x67\x2d\x8f\xa7\x4a\xf1\x7d\x10\x32\x9b\x49\x58\xe7\xa6\x41\xb9\x0f\xee\xda\xd4\x2e\x14\x0a\x22\x6d\xb3\xb5\x55\x94\x6d\xfa\x54\xc9\x92\x0c\xcb\x02\x94\x83\xf6\xe3\xd7\xaa\x03\xfd\x86\xe4\xdc\x2a\xca\xad\x33\x5d\x75\xa1\x46\x6a\xa5\xdb\x2c\x64\xd6\xed\xfe\xee\x04\x6e\xa6\x59\x41\xf6\x35\x81\xf7\x24\x58\xe3\x03\x22\x12\xdd\xba\x8f\x0f\x8b\x2d\x72\x93\x8e\x08\x4c\x87\xe9\x8e\x50\xe1\x53\x0a\xc8\x48\xaf\x09\xb2\xc3\x24\x3d\xb2\x77\x9e\x05\x5c\xe6\xf6\x76\xe8\xc3\x34\x0e\x26\x79\x02\x17\xa7\x39\x11\x5a\x6c\x04\x6d\xad\x9d\xfd\x3e\xbc\xfe\xd2\x83\x60\x39\xa2\x24\x9d\x68\xcf\xee\xb0\x14\x91\x3a\x54\x79\x7a\x0b\x1e\xc2\x4a\xd0\xcf\x89\xe5\x09\x40\xc0\xdf\x81\x5c\xc7\xa1\xef\x67\xb5\x76\xba\x5b\xe5\x5a\xb7\xfe\xb5\x5e\x8d\x34\xae\x4d\xfd\x3c\xfb\x9c\xe2\x4c\x75\x68\x2d\x4a\xed\xf2\x7b\x92\x3f\x46\xb3\x23\x64\x51\x9a\xe1\xc2\x47\xc7\x77\x22\x84\x1a\xca\x49\x7b\xf3\xcd\xf1\xad\x21\x32\x0f\xec\xdb\x19\x27\xa6\x63\xf5\x66\x2b\xdb\xe0\xf5\x37\x74\xed\x69\x90\xaf\xa1\xbd\x73\xbf\x8f\x85\x35\xcd\x34\xa8\x3f\x7a\x96\x01\xa0\x3b\xc3\xe9\x16\xc6\xfb\xf4\x61\x98\xaf\xd4\xfc\x69\xed\x36\xd8\x21\x95\xa8\x48\x3f\x60\x0e\xd1\x00\xb7\x91\x2b\x51\xf4\x30\x49\x0b\x6d\x81\x81\x07\xfd\x77\xce\x4a\x41\x4d\xf3\x19\xb1\x45\x69\x02\x32\x3f\x42\x92\x46\x54\x37\x1a\xea\x1a\x72\xcb\x06\xda\xd5\xf2\x84\xc8\xe2\xfc\x79\x62\xe0\x6c\xc9\x85\xc7\xd8\x5b\xfb\x92\x80\xeb\x76\xb8\x61\x73\xa6\x74\xe3\xa2\xdd\x12\x6a\x3b\xa4\xa2\xba\xe6\x9f\x29\xff\x00\x79\xb1\x21\xdf\x01\x4d\xf6\x01\x16\xaf\xd4\xe6\x18\xe6\xbb\xfc\xe2\x68\x54\x85\x5f\x1a\x24\xe8\x82\x02\x9a\xe9\xd9\x56\x05\xe8\xc1\xab\x52\xd8\x49\x30\xc6\x9f\x6f\xcc\x8b\x33\x9b\xad\x73\x18\x18\x86\x61\xb4\xe6\xa5\x55\x07\x92\x31\xa0\xb4\x39\x9f\x37\x43\x10\x69\x45\x18\xf7\x7b\xdb\xf3\x8d\x77\x27\xf3\x8d\x34\xc2\x74\x82\x34\xf1\x6f\x4d\xe1\xeb\xd3\x04\x89\x0b\xa6\xd8\x22\x4a\x61\x5a\x98\x36\xcb\xf7\x1b\x93\x26\x4e\xff\x1d\xde\xed\x13\xbc\x38\xc2\xf4\x54\xfc\x0c\x13\x18\x33\x65\x01\xb3\x06\x3b\xa8\xea\xb2\x54\xb8\x21\x5f\xb4\x7f\xc8\x5a\x61\x80\x56\x9a\x6d\x8d\xa8\x25\xa6\xd0\x8a\xe2\x6e\xc3\x8d\x37\x24\xd5\x11\xd0\x9e\xba\x50\xfd\x5b\xca\x3f\x2b\xec\x7b\xb1\xcf\xb4\x3e\x14\x68\x0c\xae\x0c\x01\xa5\x29\xa2\x0f\x20\xf2\x82\x5d\x25\xfb\xdb\xc1\xac\x95\x89\x3f\x18\xb2\x57\x26\xd4\xab\xa7\xa5\xec\x55\x6a\x7c\x95\x31\x8c\xf4\x01\x17\x62\x98\x9b\x08\x30\x5b\xec\xd0\xcb\x12\x5d\xe0\xec\xc0\x7a\xea\xd6\xfb\xe5\x98\xe7\xc0\x1f\x63\xba\x54\xd6\xf9\x4f\x7a\x48\x5f\x1d\xa4\x7c\xa1\xb2\xbf\xd6\x5c\x92\x65\x35\x1a\xf4\x76\x7c\x71\x82\x2e\x4c\x91\x82\xb3\x3d\xdc\x35\xc8\xbc\x01\xf3\x7e\x35\x54\x0f\xc8\x7c\x46\xd3\x59\x1f\xc0\xc4\x68\xe7\xb6\x62\x36\xc6\x10\x58\x10\x24\xfc\x13\x41\xc8\xfc\x0c\xa9\x54\xb8\xb3\x52\x94\x1f\xaf\x9f\x97\x60\x80\x82\xd5\x54\x59\xcf\xe7\x7d\xed\x5f\x07\xe7\xa1\x6d\x75\xae\x5d\x75\xa0\x5d\x75\xe8\x67\x63\xac\xcf\xb3\xad\xf2\xcf\x94\x4d\x01\x2a\xff\x90\x0d\x06\xeb\xb6\x37\x38\x6f\xed\xf3\xba\xbb\xfd\x62\x1a\x01\x0d\x56\x81\x44\xbd\x85\xb7\x1a\x71\x62\x19\xe6\xc3\x88\xb8\xe0\x8e\x25\x4a\xd0\xc5\x81\xa6\x34\x35\xc8\x4e\xd4\x9f\x28\x92\x8e\x31\xac\xbf\x64\x8e\xa9\x73\xb1\x2e\xc4\xbe\x26\x43\x3c\x24\xc8\xbe\xc6\x01\xdc\x47\x88\xf1\x15\x52\xdf\x32\x61\xdf\xf7\x13\xba\x38\xa7\x47\x6d\xa0\x5d\xf9\x05\x1e\x8e\xf9\x62\x58\xa4\x6f\x08\xf9\x0c\xfd\x9c\xec\x6d\x84\xc0\xad\x87\xa8\x7d\x83\x6e\x01\x99\x0b\x43\x7d\x31\xf4\x26\x62\x80\x02\x16\x7b\x0e\xd0\x05\x5e\x52\xf4\x00\x27\x41\x3f\x0f\xf6\x10\x0f\x7f\xbf\xff\x9a\x08\xe6\xa8\xeb\x37\x8b\xc2\x89\xa0\xfb\x6c\xc5\x30\x2c\x87\xcb\x36\xc7\x7b\x79\x18\xc2\xb4\xe9\x24\x42\xdd\xc1\x7a\x30\x2f\x89\xde\x7a\x8f\x5e\x49\x02\x0c\xb1\x8c\x78\x97\x45\xd8\xe3\x56\xa7\x7e\x10\xca\xe9\x70\xe3\x07\x7a\x07\x4d\x92\x7e\x86\xfa\x56\xfa\x91\x00\x44\x6f\x99\x49\xe8\x5d\xeb\xd6\x5c\x0f\xf9\xa1\x68\x4b\x93\x47\x6f\xa3\xcb\x2a\x7f\x30\x2e\x7b\x58\x76\xbc\x7e\x71\xba\x59\xb0\x87\x58\xb0\xc7\x99\x08\xc6\xf9\xf7\x5d\xbf\xda\x58\xcb\x12\xfc\x15\x8c\x29\xb3\xa7\x43\x9f\x2c\x6e\xab\x30\x85\xd6\x82\x12\x1d\xc1\x37\x44\x77\x2d\x44\x73\x39\x44\xaf\x23\x89\xfd\x54\xd5\xf4\xc1\xb0\x43\x6d\x66\xcd\xe5\x72\x00\x2c\xfe\x94\xd8\x92\xa2\x8f\x09\x67\xc4\x01\xb7\x73\x14\x90\x5d\x88\x63\x15\xee\x2e\xfd\x53\xf0\xbb\xb7\x74\xc0\x9b\x24\xe0\xf7\x14\x83\x36\x93\x31\xf6\xba\x94\x1f\x0a\x54\x1f\x6a\xd4\x80\x32\x7b\x69\x10\x3c\x2f\x5c\x7f\xa9\x53\x7d\x33\xd4\x7f\x2c\xa7\x2f\x71\xf3\x4f\x3a\xd2\xf3\xf1\xa2\x0c\xcb\xec\x5b\x65\xe2\x04\x8c\x93\xf2\xa9\xfe\x84\xab\x95\x56\xc2\x41\xdd\x67\x19\xd9\xaf\xbc\x4f\xf5\xb7\x6f\x4f\x69\x96\x25\xe8\x97\xa4\x4d\xad\x74\x67\x99\x05\x13\x86\xbe\x4f\xbe\x6c\xbf\xe8\xb9\xf8\xeb\x5f\xd7\xa2\x2e\x86\x91\x38\xa9\xe3\x06\x7f\x88\xc5\x97\xa0\x3f\xdd\x68\x3c\x19\x29\xbf\x1b\xa8\x92\xc0\xb4\xa9\x9f\x6b\xe3\x59\xcf\xeb\xa5\x81\x9f\x0b\xbf\xff\x73\x78\x5b\xd7\xcd\x4b\x22\x34\x44\xb8\x10\x4e\xe7\x8b\x45\xfb\xaf\x05\x50\xd9\x81\xf6\xaf\x07\xe9\xff\x82\x2b\xb4\xbb\xbf\xc7\x83\xf5\x34\xd0\x82\xba\x81\x74\xd7\xf2\xf8\xdc\xfc\x62\x1c\xff\x1b\x83\xa7\xb7\x7d\xbf\x08\x3b\x5c\xb0\xfb\xf8\x37\xa0\xb5\xe7\xff\x02\x38\x38\xf4\xc7\x4f\xb7\x73\xd2\xc8\xc7\x41\xdc\x47\xa1\x59\x94\xbf\xea\x73\x1b\x49\x8f\x15\xd7\xd1\x14\xd8\x8b\x7b\xf7\x3d\xfe\x5b\x51\xe0\xa8\x28\x63\xe0\xf9\xbe\xed\xfd\xda\xfe\x77\xb7\x8a\xcf\xe6\xa1\x0f\xe7\xcb\x07\xdf\x20\x85\x65\x2f\x28\xd1\x73\xd1\x86\x84\xd6\x5f\x7e\x8e\xa8\x4d\x20\xd2\x8a\x52\xe5\xa1\x8e\x77\x5b\xd5\xc5\xee\xe1\x27\x5b\xe5\xd7\x04\xb2\x80\xb7\x03\xc5\xfe\x78\xbd\xd4\x8b\x39\xc5\xed\x7d\x9c\xf8\x9c\xb4\x0c\xff\xda\xa0\xb8\xac\xeb\x7d\x9a\x38\xf8\xa1\xbf\xea\xef\xb5\x53\x61\xa3\x93\xe1\x3c\x42\x84\xaf\xbd\x21\xd0\x80\x7a\x1b\x2f\xb4\x76\x05\xa5\x44\x31\xae\x49\x30\x2f\xd2\x26\x31\x54\x95\xb6\xd8\xc5\xfc\xbf\x74\x71\x0a\xbc\xa7\x21\x36\x32\x1a\x83\x62\xe5\x9d\x59\xcc\x3f\xd2\xc7\xb2\xdf\x87\x63\xfe\x2d\x7d\x3b\x4e\x4b\x45\xe6\x9f\xe5\x38\xa6\x88\xc2\x2b\xfb\xb7\x62\x86\x65\xdf\x5b\xc6\xfe\x33\xcb\x62\xf1\xba\x64\xaf\x7f\x2b\x86\xb3\xa2\x70\x5f\xff\x34\xc1\x32\xe2\xc0\x53\xe2\xff\x6f\x33\xfb\x8f\xcd\xff\xd8\xfc\x6f\xd8\x3c\xa1\x72\x05\xea\x3e\x34\x76\x71\x40\xba\xbf\x5c\xc7\xf3\x0d\x5b\xc1\x3f\x91\x24\xfd\xef\xff\xf1\x3f\xff\xd7\x7f\xfd\x9f\xff\xfa\xbf\x01\x00\x00\xff\xff\xbb\x94\x2f\x4d\xe9\x06\x02\x00") func pagesAssetsStylesContainersCssBytes() ([]byte, error) { return bindataRead( diff --git a/vendor/github.com/google/cadvisor/pages/static/static.go b/vendor/github.com/google/cadvisor/pages/static/static.go index 1c78166ceafa1..cac3776af89ac 100644 --- a/vendor/github.com/google/cadvisor/pages/static/static.go +++ b/vendor/github.com/google/cadvisor/pages/static/static.go @@ -22,6 +22,8 @@ import ( "net/http" "net/url" "path" + + "github.com/golang/glog" ) const StaticResource = "/static/" @@ -47,16 +49,18 @@ var staticFiles = map[string][]byte{ "jquery-1.10.2.min.js": jqueryJs, } -func HandleRequest(w http.ResponseWriter, u *url.URL) error { +func HandleRequest(w http.ResponseWriter, u *url.URL) { if len(u.Path) <= len(StaticResource) { - return fmt.Errorf("unknown static resource %q", u.Path) + http.Error(w, fmt.Sprintf("unknown static resource %q", u.Path), http.StatusNotFound) + return } // Get the static content if it exists. resource := u.Path[len(StaticResource):] content, ok := staticFiles[resource] if !ok { - return fmt.Errorf("unknown static resource %q", resource) + http.Error(w, fmt.Sprintf("unknown static resource %q", u.Path), http.StatusNotFound) + return } // Set Content-Type if we were able to detect it. @@ -65,6 +69,7 @@ func HandleRequest(w http.ResponseWriter, u *url.URL) error { w.Header().Set("Content-Type", contentType) } - _, err := w.Write(content) - return err + if _, err := w.Write(content); err != nil { + glog.Errorf("Failed to write response: %v", err) + } } diff --git a/vendor/github.com/google/cadvisor/pages/templates.go b/vendor/github.com/google/cadvisor/pages/templates.go index 3ff79441f7a1e..75ffc94df86c7 100644 --- a/vendor/github.com/google/cadvisor/pages/templates.go +++ b/vendor/github.com/google/cadvisor/pages/templates.go @@ -83,7 +83,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _pagesAssetsHtmlContainersHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\x5a\x5b\x73\xdb\xb8\x15\x7e\x96\x7f\xc5\x29\xa7\x0f\xdb\x19\x93\x8a\x93\xbc\x74\x2b\x6b\x46\x2b\x27\x5d\x75\x1d\x3b\x63\xd9\xbb\xb3\x8f\x10\x09\x49\x88\x21\x82\x0b\x80\x96\x55\x8f\xff\x7b\x0f\x00\x52\x02\x6f\x92\x6f\x93\x54\x19\xc7\x22\x81\xf3\x9d\xef\xdc\x80\x03\xd2\x83\xbf\x85\xe1\x11\xc0\x58\x64\x1b\xc9\x16\x4b\x0d\xef\xdf\x9d\x7c\x84\x7f\x0b\xb1\xe0\x14\x26\x69\x1c\xc1\x88\x73\xb8\x32\x43\x0a\xae\xa8\xa2\xf2\x8e\x26\xd1\x11\x8a\x9c\xb3\x98\xa6\x8a\x26\x90\xa7\x09\x95\xa0\x97\x14\x46\x19\x89\xf1\x57\x31\x72\x0c\xbf\x53\xa9\x98\x48\xe1\x7d\xf4\x0e\x7e\x32\x13\x82\x62\x28\xf8\xc7\xbf\x10\x61\x23\x72\x58\x91\x0d\xa4\x42\x43\xae\x28\x42\x30\x05\x73\x86\x8a\xe9\x7d\x4c\x33\x0d\x2c\x85\x58\xac\x32\xce\x48\x1a\x53\x58\x33\xbd\xb4\x6a\x0a\x90\x08\x21\xfe\x2c\x20\xc4\x4c\x13\x9c\x4d\x70\x7e\x86\x57\x73\x7f\x1e\x10\x6d\xf8\x9a\xcf\x52\xeb\xec\xe7\x7e\x7f\xbd\x5e\x47\xc4\x72\x8d\x84\x5c\xf4\xb9\x9b\xa7\xfa\xe7\x93\xf1\xa7\x8b\xe9\xa7\x10\xf9\x1a\x89\x9b\x94\x53\xa5\x40\xd2\xbf\x72\x26\xd1\xd0\xd9\x06\x48\x86\x6c\x62\x32\x43\x8e\x9c\xac\x41\x48\x20\x0b\x49\x71\x4c\x0b\xc3\x76\x2d\x99\x66\xe9\xe2\x18\x94\x98\xeb\x35\x91\x14\x51\x12\xa6\xb4\x64\xb3\x5c\x57\x5c\x55\x72\x43\x8b\xfd\x09\xe8\x2c\x92\x42\x30\x9a\xc2\x64\x1a\xc0\x2f\xa3\xe9\x64\x7a\x8c\x18\x7f\x4c\xae\x7f\xbd\xbc\xb9\x86\x3f\x46\x57\x57\xa3\x8b\xeb\xc9\xa7\x29\x5c\x5e\xc1\xf8\xf2\xe2\x6c\x72\x3d\xb9\xbc\xc0\xab\xcf\x30\xba\xf8\x13\x7e\x9b\x5c\x9c\x1d\x03\x45\x47\xa1\x1a\x7a\x9f\x49\xc3\x1f\x49\x32\xe3\x44\x13\x37\x80\x29\xa5\x15\x02\x73\xe1\x08\xa9\x8c\xc6\x6c\xce\x62\xb4\x2b\x5d\xe4\x64\x41\x61\x21\xee\xa8\x4c\xd1\x1c\xc8\xa8\x5c\x31\x65\x42\xa9\x90\x5e\x82\x28\x9c\xad\x98\x26\xda\xde\x69\x18\x15\x1d\x85\xe1\xf0\xe8\x68\xb0\xd4\x2b\x3e\xc4\xc9\x83\x25\x25\xc9\xd0\x86\x60\xa0\x99\xe6\x74\x18\x8f\x92\x3b\xa6\x50\x73\x08\x0f\x0f\xd1\x19\x53\x19\x27\x9b\x0b\xb2\xa2\x8f\x8f\x83\xbe\x9b\xe2\xa6\x63\x76\xc2\x39\xd1\x54\x69\x9b\x09\x98\x1b\x89\x61\x00\x2b\x96\x22\x59\xbc\x18\x4f\xa7\x60\xb4\xd9\xd9\x9c\xa5\xb7\x18\x2e\x7e\x1a\x28\xbd\xc1\xd8\x2d\x29\xd5\x01\x2c\x25\x9d\x9f\x06\xa8\xe7\x4a\x08\xfd\xf8\xa8\x0c\xef\xb8\x3f\xc3\x0b\xf4\x3b\xc9\xc2\x0f\xd1\x09\xfe\x43\xc4\x28\x56\x2a\x18\x1e\xed\x34\x5f\x66\xc6\x42\xc2\x8d\x71\x2b\xfa\x5a\x3d\x16\xa4\x43\xdb\x73\x10\x63\x91\x9a\x64\xc7\xda\x6a\x10\xde\xeb\xaa\xff\x90\x3b\x32\x8d\x25\xc3\xc2\xda\x5a\xa2\xdc\xb5\x92\x71\x53\xcf\xb7\xbf\x72\x2a\x37\x21\xd2\x7d\x17\xbd\xb7\x8c\xbf\xa1\xb6\x41\xdf\xc9\x3c\x01\xa0\xcd\xc5\xdd\x10\x7a\x93\xd1\xd3\x40\xd3\x7b\xdd\xff\x86\x4c\xdd\xdd\xa0\x1d\x79\x61\xd7\xa7\xf0\x9b\x22\x19\xab\x41\xbe\x18\xd3\x73\xeb\x1b\x91\x8c\x97\x44\xea\x26\xda\xa0\x5f\xd6\xc3\x60\x26\x92\x4d\xa1\x20\x61\x77\x10\x73\xa2\xd4\x69\xb0\x65\xe2\xf2\x2e\x54\x4b\xb1\x8e\x09\xae\x9a\x30\x2c\xd6\xb1\x01\xa9\xe7\x46\xb0\x13\xe6\xa1\x5a\x85\x27\xef\x03\x60\xc9\x69\xc0\xc5\x42\x04\x5b\xb1\x3e\xd9\x7e\xad\xe8\x2b\x45\x86\x47\x3d\x7f\x20\xc3\x65\x20\x34\x64\xa9\x34\x43\xa6\x92\x4f\x86\xcd\x82\xc5\x9b\x28\xd7\x47\x41\xf3\x5b\xf0\x52\x7c\x26\x51\x34\x96\xf9\x6a\xe6\xa4\x1f\x1e\x24\xae\x2d\x14\xfe\x9e\xe1\xca\x98\xea\xf1\xd6\xcc\x9f\x4f\x21\xfa\x5a\xbd\xa7\x1e\x1f\xad\x42\xce\x86\x9e\xb1\x75\xc9\xe8\x1c\xeb\x06\x8d\x1f\xb6\x0c\x5d\x63\x90\x0c\x3b\x82\xce\x47\x14\x47\x80\xa6\x89\x01\x1e\xf4\x05\xdf\x39\xc5\x12\x77\x17\x0f\x0f\x6c\x0e\xd1\x44\x39\xa7\x1e\xf0\x15\x14\x9f\xc1\xf2\xe3\x8e\x64\x14\xf5\x13\x11\xdf\x1a\x8f\x9d\xd9\xdf\xb0\xb3\xc9\x91\xc1\xd9\xed\xaa\x1d\x39\x9f\xc8\x34\x9f\xc5\xbe\x47\x5e\x17\xbb\x0f\xc3\x0a\x1e\x32\xf9\xe0\x07\xce\x13\xe6\xb8\x25\x85\x0b\x29\xf2\xac\x16\x39\xe5\x01\xd8\xb0\xd5\x19\xf6\x2a\xc9\x59\x99\x5f\x06\xab\xa9\x24\x64\x9a\xae\x6c\x10\x2b\xf3\x77\x11\xac\x05\xcf\xf3\x5a\xb7\x0b\x9d\x07\x5d\x0c\xa6\x58\x91\xf9\x5b\x38\xf0\x4c\x32\xdc\x14\xc1\xe1\xd5\x1d\x98\xf3\x83\xfe\x73\xa9\xa1\xac\xb8\xf5\x5f\x8d\x9f\x4b\x79\x07\x03\x2d\x2e\x1a\xa8\x0c\xfb\x83\x42\x8b\x81\x09\x39\x99\x51\x6e\x7d\xe7\x63\x47\xbf\xd1\x8d\x71\x9d\x99\x3e\x84\xfa\xe0\xef\x84\xe7\xb6\x72\xeb\x75\x51\xf5\x9a\x33\x76\xc7\xad\xf7\x32\x6a\x53\x2d\x24\xfa\x72\x30\x93\xc3\x82\x90\x81\xea\x72\x56\x6f\xe7\x2b\xab\xbe\xe1\xab\x6e\x56\xcf\xf5\x97\x87\xdf\xf4\x97\x3f\x58\xf5\x57\x6f\xeb\x2e\x0c\x7d\xce\xad\x35\xa5\x27\x8b\x1b\x5d\xd9\xda\x56\xe3\xce\xaa\xc9\x0a\x5d\x74\x38\x43\x61\xfb\xe9\x4e\x55\xf0\x3e\x26\x67\x1d\xb4\x4b\x56\x6f\xc4\xe7\xe5\xd0\xcc\x7e\xe1\xf2\x24\x64\x56\xc6\xec\x5b\x95\x59\x26\x84\xf8\x73\xd4\x86\xd1\x66\x1b\x1e\x18\x44\x2e\x63\xaa\x46\x77\x84\x71\xd3\x36\xbf\x41\x0d\x4e\x94\xe0\xb6\xf5\xac\xd5\x9f\x53\x39\xce\x72\x5f\x59\x67\xa2\x79\x9e\xe8\xcc\x1f\x20\xb1\xc6\x34\xc0\x26\xbd\xd0\x18\xda\xde\x14\x30\x49\x28\x77\xdf\x83\xe1\xf8\xeb\x8d\x0b\xff\x0e\xb1\x58\xbc\xb1\xa3\x36\x74\x70\xdd\xc3\x66\x79\x6b\xf8\x7e\x95\xfb\xea\x08\xdb\x09\x13\xc7\x32\x47\x33\xc9\x52\xed\x6e\x36\x95\x41\x05\x26\x4f\xd9\x16\x46\xf9\x30\x4d\xe6\x7e\x10\x5b\x6c\xf9\x42\xee\xdf\xc8\x1c\x44\x02\x0b\x55\xb3\x68\x2c\xaa\x06\xed\x34\x76\xdb\x14\x8b\x57\x99\xa4\x6e\x5f\x6f\x0e\x1e\x93\xc5\xda\x1c\x48\x44\x33\x48\x46\x43\x4d\x21\xe0\xff\xf1\x12\xb7\xb9\x49\x3a\x17\xd1\x45\xbe\xb2\x72\xe5\x1a\xd3\x64\x5f\x2e\x35\xdb\x6b\x67\xc4\x17\xba\x12\x72\xf3\x7d\x13\xde\xe9\xdc\x93\xf3\x6e\x42\xe4\x9e\x16\x58\x98\xd7\xbb\xd7\x03\xab\x57\x00\xfb\x2f\xdd\xa3\xb8\x3b\x69\x0a\xf9\x1b\xbc\xb5\x47\xfe\x25\x59\x55\xe0\xbc\x51\xa1\xb4\x15\x49\xd3\xe8\x83\x35\xd2\x69\x6e\x21\xf9\x0a\x43\xa7\x6b\x92\xbd\xd5\x22\x87\x50\xad\xcb\x42\xd3\x62\x4f\xeb\x0b\xac\xf6\xa4\x0f\x58\x5e\x2f\xbd\xc2\xba\x4a\x17\xfa\xe2\xcd\xec\x46\x99\xd6\xa8\xbb\x13\xb7\x95\x57\xd4\x1f\x5a\xb2\x22\x72\xb3\xa7\x0d\x30\xb3\x8c\x06\x96\x2e\x9a\x8d\x40\x75\x5a\x51\xcc\x97\xd8\xe5\xdc\x31\xba\xde\xdf\x1e\x80\xd7\x21\xe4\x86\x71\xb8\x20\xf9\x82\x06\x55\x48\x73\x9a\xdd\xb6\x0c\x3f\xc4\x9a\xaf\x52\x60\xb3\xa1\x0e\x75\x3b\xbe\x39\x59\x29\x12\x6a\x91\x3d\xc9\xa0\x8e\x3e\xe3\x3b\x9a\x69\x5b\x8e\xa7\x18\xd8\x62\x4d\x4d\xc1\xc7\xe1\xb5\xd0\x84\x43\x99\x87\x1f\x6d\x66\x7a\xfe\x89\xb3\x1c\x3d\x83\x53\x42\x17\x78\xfb\x50\x63\xe7\x14\x3b\xd7\x3c\x7a\x32\x50\xc8\x0b\xce\x05\x49\x60\x84\x59\xb5\x07\x8f\xe3\x9c\x2a\xd0\xf6\x89\x94\xcf\xcc\x72\x32\x0f\x1f\xed\xa6\xda\x05\x86\xe3\xa1\xd9\xff\x5b\xf9\xb5\x43\xfe\x22\x29\xb9\x4d\xc4\x3a\xed\xc2\x74\x50\xb3\x72\x5a\x27\x68\x33\x35\x0e\xee\xce\xdf\x31\x4d\xca\x8d\xfa\x3b\x65\xca\xca\xaa\x3b\x1c\x86\x99\xec\xd7\xee\x78\x04\xa4\x58\x43\xfb\x81\x67\x6f\x08\x6b\xd3\x9a\xcb\xf1\x3f\xed\xd9\xb2\x62\xaa\x14\x0b\xf3\x7c\xbc\xa1\xa4\xe1\x93\x62\x62\x38\x23\x12\xfc\x8b\x30\x31\x07\x55\x19\x94\xeb\x88\x1b\x58\x0a\x1d\x3a\x57\xb4\x22\x43\x75\xaf\x52\x32\x14\x29\xc7\xa9\xbf\x0a\x0d\x65\xc0\xdc\x21\xb9\x45\xb2\xe9\xcd\xe7\xd0\x65\xd8\x6a\xd6\xc8\xa2\x77\x92\x97\xb0\x1d\xa3\xdc\x53\xe9\xf6\x7a\xad\xbc\xdb\x6f\x36\x23\xf7\x21\xf0\xb3\xcb\x3c\x7a\xad\xad\x3e\xcf\x2c\xca\x0b\xaa\xd7\x42\xde\x3e\xb3\x2a\x7b\xaf\x2f\xc7\x42\x71\xb1\xd9\x3f\xa7\x10\x7b\xf5\xd1\x44\x8a\xcc\x24\x7f\xb3\x40\x66\xb9\xd6\x62\x1b\xaf\x99\x4e\x01\x7f\xc2\x84\xce\x49\xce\x35\x94\x72\xb8\xa2\x2f\x16\xc8\xa9\x78\x9e\xed\x84\x9c\x9f\x53\xc7\x32\x54\x94\xd3\xd8\x1e\x01\xb6\xca\x20\x21\x9a\x14\xa2\x1e\x07\x20\x92\x91\x70\x49\x54\x26\xb2\x3c\x3b\x0d\xb4\xcc\x69\x71\x93\xde\xa3\x1d\x09\x45\xd8\x39\xe1\x8a\xb6\xa4\x98\x4b\xaf\x76\xc5\x65\xac\xdb\xf3\xab\x92\x98\x31\x9e\x69\xbd\xb9\xbd\x32\x13\x9c\x65\x0d\x2f\xe1\x11\xa9\x55\x65\x50\x77\x30\xd6\x46\x9a\x07\x20\x85\xb1\xd8\x7d\xb7\x86\xd9\xee\x92\xd3\x64\xb6\xd9\xeb\xb1\x66\xce\x17\x8f\x87\xf6\xa4\xed\x73\x16\xe4\x25\xb6\xd4\x8b\x65\x96\xeb\xe6\x2a\xb8\x5d\x96\x4b\x7a\xb3\x8d\xc6\x26\xa7\xb1\x7d\xbf\x40\xed\x27\x29\x85\x7d\x7c\xdc\xd8\x02\x4a\x5d\xd4\xce\xe8\x56\x56\x33\xbe\x56\xa1\x9f\xd5\x0f\xdb\x32\x3f\x33\x4e\xd5\x46\xe1\x19\xe5\xe9\x1d\xe4\x7c\x2b\xe3\xf6\xbe\xd6\x26\xb2\x1b\xa9\x63\x99\x1a\xe7\x4a\x8b\xd5\x17\xaa\x25\x8b\x9f\xeb\x8f\x03\x8b\x55\x6f\x9f\x07\x46\xee\x0d\xb7\xc9\x63\x28\xb4\xd7\x57\xac\x7d\xb9\x52\xeb\xa5\xac\x11\x58\x44\x16\xe7\x60\x3e\xf4\xea\x87\xcd\x96\xb7\x20\x3f\x2c\x35\x5a\xde\x9d\x1c\xca\x8e\xa7\x35\x55\x19\x98\xbe\xd9\xb6\x35\x3f\xd7\xd7\x0b\x96\x62\x71\x57\x5a\x5d\xff\x0d\x49\x98\xb8\x17\x71\xb8\x8d\xe7\xa9\x0e\x5a\xf7\xef\xed\xd6\xdd\x26\x67\xe1\x3b\xe4\xee\xcc\x43\xef\xd3\x93\x77\x35\xca\xdd\x0b\x4d\x2b\xc3\x4a\x37\x58\x43\x6a\x5f\x00\x5f\xe8\x43\xd7\x8c\x1c\x74\x63\xd1\x46\xfc\x7f\x7a\xb2\xd2\x6a\x39\x2d\xb8\xf3\x70\x4f\xcd\x8c\x8b\xf8\xb6\xee\x81\xe6\xfe\x58\xef\xc9\xdf\x30\x2c\x1d\x4b\x77\xcb\xa0\x3f\xe4\x0d\xec\x7f\x95\x5e\x0a\x2b\x8d\xd4\xbe\x22\xc9\x9f\x1e\x1e\xa2\xed\x1b\x54\xf7\xc6\xf9\xd8\xfc\xd1\x48\xf5\xfc\x6d\x6f\x35\x8e\x5b\xf6\xae\x7b\x95\x6b\xbf\x96\xef\x75\xed\x5f\x1f\x99\x4f\x22\xc9\xda\xbd\x1e\x31\x6a\xaa\x6f\x62\x8a\x49\xd5\x37\xf7\xee\x85\x3d\x86\xce\xfe\x69\xcb\xff\x02\x00\x00\xff\xff\x4b\x13\x4b\x6c\x3d\x25\x00\x00") +var _pagesAssetsHtmlContainersHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\xcd\x72\xdb\x38\x12\x3e\x4b\x4f\xd1\xc3\xda\xc3\x6c\x55\x48\xc5\x49\x2e\x9b\x95\x55\xa5\x51\x92\x1d\xed\x38\xb6\xcb\xb2\x67\x6a\x8e\x10\xd9\x22\x11\x83\x00\x07\x00\x25\x6b\x5d\x7e\xf7\x2d\x00\xa4\xc4\x5f\xc9\x7f\x95\x8c\x2e\x96\x08\x74\xf7\xd7\x5f\x77\x03\x0d\xc2\xe3\x9f\x7c\x7f\x08\x30\x13\xd9\x56\xd2\x38\xd1\xf0\xee\xed\xc9\x07\xf8\x8f\x10\x31\x43\x98\xf3\x30\x80\x29\x63\x70\x65\x86\x14\x5c\xa1\x42\xb9\xc6\x28\x18\x0e\x01\xce\x68\x88\x5c\x61\x04\x39\x8f\x50\x82\x4e\x10\xa6\x19\x09\x13\x2c\x47\xde\xc0\xef\x28\x15\x15\x1c\xde\x05\x6f\xe1\x67\x33\xc1\x2b\x86\xbc\x7f\xfe\x7b\x08\xb0\x15\x39\xa4\x64\x0b\x5c\x68\xc8\x15\x82\x4e\xa8\x82\x15\x65\x08\x78\x17\x62\xa6\x81\x72\x08\x45\x9a\x31\x4a\x78\x88\xb0\xa1\x3a\xb1\x66\x0a\x25\xc1\x10\xe0\xcf\x42\x85\x58\x6a\x42\x39\x10\x08\x45\xb6\x05\xb1\xaa\xce\x03\xa2\x0d\x5e\xf3\x49\xb4\xce\x3e\x8e\x46\x9b\xcd\x26\x20\x16\x6b\x20\x64\x3c\x62\x6e\x9e\x1a\x9d\xcd\x67\x9f\xcf\x17\x9f\xfd\x77\xc1\x5b\x23\x71\xc3\x19\x2a\x05\x12\xff\xca\xa9\xc4\x08\x96\x5b\x20\x59\xc6\x68\x48\x96\x0c\x81\x91\x0d\x08\x09\x24\x96\x88\x11\x68\x61\xd0\x6e\x24\xd5\x94\xc7\x6f\x40\x89\x95\xde\x10\x89\x43\x80\x88\x2a\x2d\xe9\x32\xd7\x35\xaa\x4a\x6c\x54\xd5\x26\x08\x0e\x84\x83\x37\x5d\xc0\x7c\xe1\xc1\x2f\xd3\xc5\x7c\xf1\x66\x08\xf0\xc7\xfc\xfa\xd7\x8b\x9b\x6b\xf8\x63\x7a\x75\x35\x3d\xbf\x9e\x7f\x5e\xc0\xc5\x15\xcc\x2e\xce\x3f\xcd\xaf\xe7\x17\xe7\x0b\xb8\xf8\x02\xd3\xf3\x3f\xe1\xb7\xf9\xf9\xa7\x37\x80\x54\x27\x28\x01\xef\x32\x69\xf0\x0b\x09\xd4\x90\x68\xe2\x06\xb0\x40\xac\x01\x58\x09\x07\x48\x65\x18\xd2\x15\x0d\x81\x11\x1e\xe7\x24\x46\x88\xc5\x1a\x25\xa7\x3c\x86\x0c\x65\x4a\x95\x09\xa5\x02\xc2\xa3\x21\x00\xa3\x29\xd5\x44\xdb\x27\x2d\xa7\x82\xa1\xef\x4f\x86\xc3\x71\xa2\x53\x36\x19\x02\x8c\x13\x24\xd1\xc4\x86\x60\xac\xa9\x66\x38\x09\xa7\xd1\x9a\x2a\x21\xc1\x87\xfb\xfb\xe0\x13\x55\x19\x23\xdb\x73\x92\xe2\xc3\xc3\x78\xe4\xa6\xb8\xe9\x3f\xf9\x3e\x9c\x11\x8d\x4a\xdb\x4c\xa0\x0c\x23\x83\x00\x52\xca\xe9\x8a\x62\x04\xb3\xc5\x02\x8c\x35\x3b\x9b\x51\x7e\x0b\x12\xd9\xa9\xa7\xf4\x96\xa1\x4a\x10\xb5\x07\x89\xc4\xd5\xa9\x77\x7f\x1f\x5c\x09\xa1\x1f\x1e\x94\xc1\x1d\x8e\x96\x42\x68\xa5\x25\xc9\xfc\xf7\xc1\x49\x70\x12\xa4\x94\x07\xa1\x52\xde\x64\xb8\xb7\x7c\x91\x19\x0f\x09\x33\xce\xa5\xf8\x52\x3b\x56\x49\x8f\xb5\xa7\x68\x0c\x05\x37\xc9\x8e\x52\xb5\x00\x1f\xa4\xea\xbf\x64\x4d\x16\xa1\xa4\x99\xde\x7b\xa2\xdc\x6f\x25\xc3\xb6\x9d\x6f\x7f\xe5\x28\xb7\xfe\x49\x70\xf2\x36\x78\x67\x11\x7f\x53\xde\x64\x3c\x72\x32\x8f\x50\xd0\x45\x71\xbf\x0a\xbd\xcd\xf0\xd4\xd3\x78\xa7\x47\xdf\xc8\x9a\xb8\xa7\x5e\xb7\xe6\xd8\xae\x4f\xfe\x37\x45\x32\xda\x50\xf9\x6c\x9d\x15\x5a\x5f\x09\x64\x98\x10\xa9\xdb\xda\xc6\xa3\xb2\x1e\xc6\x4b\x11\x6d\x0b\x03\x11\x5d\x43\xc8\x88\x52\xa7\xde\x0e\x89\xcb\x3b\x5f\x25\x62\x13\x12\x85\x1e\x4c\x8a\x75\x6c\x4c\x9a\xb9\xe1\xed\x85\x99\xaf\x52\xff\xe4\x9d\x07\x34\x3a\xf5\x98\x88\x85\xb7\x13\x1b\x91\xdd\xd7\x9a\xbd\x52\x64\x32\x1c\x54\x07\x32\x12\xa3\x6f\xc0\xa2\x34\x43\xa6\x92\x4f\x26\xed\x82\x4d\x4e\x8c\xdc\x28\xa2\x6b\xf3\x57\xb0\x52\x7c\x29\x91\x44\xa1\xcc\xd3\xa5\x93\xbe\xbf\x97\x84\xc7\x08\xff\xc8\x88\x44\xae\x67\x3b\x37\x3f\x9e\x42\x70\x59\x7f\xa6\x1e\x1e\xac\x41\x46\x27\x15\x67\x9b\x92\xc1\x19\xe5\xb7\x0f\x0f\xde\xa4\x63\xe8\x1a\xef\xb4\x41\x47\x26\xe3\x11\xa3\x05\x00\xe4\x91\x51\x3c\x1e\x09\xb6\x27\xc5\x02\x77\x3f\xee\xef\xe9\x0a\x82\xb9\x72\xa4\x1e\xe1\x0a\x8a\xcf\x38\xf9\xb0\x07\x19\x04\xa3\x48\x84\xb7\x86\xb1\x4f\xf6\x2f\xec\x7d\x72\x60\x92\x0f\x3d\xa6\x1d\xb8\x2a\x90\x45\xbe\x0c\xab\x8c\xbc\x2c\x76\xef\x27\x35\x7d\xe3\x51\xf2\xbe\x1a\xb8\x8a\x30\xa3\x4a\xfb\xb1\x14\x79\xd6\x88\x9c\xaa\x28\xb0\x61\x6b\x22\x1c\xd4\x92\xb3\x36\xbf\x0c\x56\xdb\x88\x4f\x35\xa6\x36\x88\xb5\xf9\xfb\x08\x36\x82\x57\x61\xad\x9f\x42\xc7\xa0\x8b\xc1\x42\x13\x9d\xbf\x06\x81\x9f\x24\x5d\xa3\x04\xa7\xaf\x49\x60\xce\x8e\xf2\xe7\x52\x43\x59\x71\xcb\x5f\x03\x9f\x4b\x79\xa7\x06\x3a\x28\x1a\xab\x8c\xf0\xd2\x8a\x51\xe3\x33\xb2\x44\x66\xb9\xab\xea\x0e\x7e\xc3\xad\xa1\xce\x4c\x9f\x40\x73\xf0\x77\xc2\x72\x5b\xb9\xcd\xba\xa8\xb3\xe6\x9c\xdd\x63\x1b\x3c\x0f\xda\x42\x0b\x49\x62\x1c\x2f\xe5\xa4\x00\x64\x54\xf5\x91\x35\xd8\x73\x65\xcd\xb7\xb8\xea\x47\xf5\x54\xbe\x2a\xfa\xdb\x7c\x55\x07\xeb\x7c\x0d\x76\x74\x0d\xc6\xa3\x9c\x59\x6f\x4a\x26\x8b\x07\x7d\xd9\xda\x55\xe3\xce\xab\x79\x4a\x62\x3c\x9e\xa1\xb0\xfb\xf4\xa7\x2a\x54\x3e\x26\x67\x9d\x6a\x97\xac\x95\x91\x2a\x2e\xa7\xcd\xec\x17\x2e\x4f\x7c\x6a\x65\xcc\xbe\x55\x9b\x65\x42\xb8\x94\xfb\xdf\xc7\x7c\xbb\x42\x25\x72\x19\xa2\x9a\xae\x09\x65\xa6\x6d\x7e\x85\x1a\x9c\x2b\xc1\x6c\xeb\xd9\xa8\x3f\x67\x72\x96\xe5\x55\x63\xbd\x89\x56\x61\xa2\x37\x7f\x80\x84\x9a\xae\x4d\x93\x5e\x58\xf4\x6d\x6f\x0a\x19\xe1\xc8\xdc\x77\x6f\x32\xbb\xbc\x71\xe1\xdf\x6b\x2c\x16\xef\x0c\x43\x03\x27\x38\x33\xcd\xf2\xce\xf1\xc3\x26\x0f\xd5\x51\x42\xa4\x89\x63\x99\xa3\x99\xa4\x5c\xbb\x87\x6d\x63\x50\x53\x93\x73\xba\x53\xa3\xaa\x6a\xda\xc8\xab\x41\xec\xf0\xe5\x2b\xb9\x7b\x25\x77\xbe\x92\x3b\xb0\xaa\x1a\x1e\xcd\x44\xdd\xa1\xbd\xc5\x7e\x9f\x42\xf1\x22\x97\xd4\xed\xcb\xdd\x99\x32\x26\x36\xe6\x40\x22\xda\x41\x32\x16\x1a\x06\x21\xf8\x4a\xc2\x84\x72\x9c\xf3\x95\x08\xce\xf3\xd4\xca\x95\x6b\x4c\x1b\x7d\xb9\xd4\xec\x7e\x3b\x27\xbe\x62\x2a\xe4\xf6\xfb\x26\xbc\xb3\x79\x20\xe7\xdd\x84\xc0\xbd\x2d\xb0\x6a\x5e\x4e\x6f\x45\x59\xb3\x02\xe8\xff\xf0\x80\xe1\xfe\xa4\x29\xe4\x6f\x38\xd5\x07\xe4\x9f\x93\x55\x85\x9e\x57\x2a\x94\xae\x22\x69\x3b\x7d\xb4\x46\x7a\xdd\x2d\x24\x5f\xe0\xe8\x62\x43\xb2\xd7\x5a\xe4\x36\x24\xeb\x5c\x16\xda\x1e\x57\xac\x3e\xc3\xeb\x8a\xf4\x11\xcf\x9b\xa5\x57\x78\x57\xeb\x42\x9f\xbd\x99\xdd\x28\xd3\x1a\xf5\x77\xe2\xb6\xf2\x8a\xfa\xcb\x24\x4d\x89\xdc\x1e\x68\x03\xcc\x2c\x63\x81\xf2\xb8\xdd\x08\xd4\xa7\x15\xc5\x7c\xb1\x46\xb9\xa6\xb8\x39\xdc\x1e\x54\x3b\x84\xdc\x20\xf6\x63\x92\xc7\xe8\xd5\x55\x9a\xd3\xec\xae\x65\xf8\x21\xde\x5c\x4a\x11\xa2\x52\xc7\xba\x9d\xaa\x3b\x59\x29\xe2\x6b\x91\x3d\xca\xa1\x9e\x3e\xe3\x3b\xba\x69\x5b\x8e\xc7\x38\xd8\xe1\x4d\xc3\xc0\x87\xc9\xb5\xd0\x84\x41\x99\x87\x1f\x6c\x66\x56\xf8\x09\xb3\xdc\xd7\x66\x8a\xef\x02\x6f\x5f\x6a\xec\x49\x81\xf2\xd5\x93\x51\x35\xbb\xbc\x81\x33\x41\x22\x98\xae\x51\x1e\xd0\xc7\x04\x89\xea\x8a\x76\x6f\xa4\xaa\xc8\x2c\x26\xc8\xec\x11\x5a\xf6\x2a\xcb\x50\xfa\x66\xff\xef\xc4\xd7\xad\xf2\x17\x89\xe4\x36\x12\x1b\xde\xa7\xd3\xa9\x5a\x96\xd3\x7a\x95\xb6\x53\xe3\xe8\xee\xfc\x1d\xd3\xa4\xdc\xa8\xbf\x53\xa6\xa4\xd6\xdc\xf1\x30\x2c\xe5\xa8\xf1\xa4\x02\x40\x8a\x0d\x74\x1f\x78\x0e\x86\xb0\x31\xad\xbd\x1c\xff\xcb\x9e\x2d\x6b\xae\x4a\x11\x4b\xb4\x2f\x50\xa1\xf5\xe9\x9a\xe8\x2f\x89\x84\xea\x0f\x3f\x32\x07\x55\xe9\x95\xeb\x88\x1b\x48\x84\xf6\x1d\x15\x9d\x9a\xa1\xbe\x57\x29\xe9\x0b\xce\xb6\xde\xe4\x57\xa1\xa1\x0c\x98\x3b\x24\x77\x48\xb6\xd9\x7c\x0a\x5c\xca\x57\xa2\x01\x36\x14\x2c\x7a\x0e\xda\x99\x60\xd1\x63\xe1\x0e\x06\x9d\xb8\xbb\x1f\xb6\x23\xf7\xde\xab\x66\x97\xc6\xbb\xe6\xea\xf3\xc4\xa2\x3c\x47\xbd\x11\xf2\xf6\x89\x55\x39\x78\x79\x39\x16\x86\x8b\xcd\xfe\x29\x85\x38\x68\x8e\x46\x52\x64\x26\xf9\xdb\x05\xb2\xcc\xb5\x16\xbb\x78\x2d\x35\x87\xa5\xe6\x7e\x84\x2b\x92\x33\x0d\xa5\x9c\xaf\x45\x1c\x33\xf4\x8a\xf7\xd9\x4e\xc8\xf1\xcc\x1d\x4a\x5f\x21\xc3\xd0\x1e\x01\x76\xc6\x20\x22\x9a\x14\xa2\x15\x0c\x40\x24\x25\x7e\x42\x54\x26\xb2\x3c\x3b\xf5\xb4\xcc\xb1\x78\x88\x77\x19\xe1\x11\x46\xa7\xde\x8a\x30\x85\x1d\x29\xe6\xd2\xab\xdb\x70\x19\xeb\xee\xfc\xaa\x25\x66\x48\x24\x56\xe6\x0e\xca\x4c\x70\x9e\xb5\x58\xca\x59\xb7\x49\xaf\x49\xb0\x9f\x22\xcf\x3d\x90\xc2\x78\xec\xbe\x5b\xc7\x6c\x77\xc9\x30\x5a\x6e\x0f\x32\xd6\xce\xf9\xe2\xf5\xd0\x81\xb4\x7d\xca\x82\x9c\x48\x91\xc7\x49\x96\xeb\xf6\x2a\xb8\x5b\x96\x4b\x78\xcb\xad\x46\xd5\xde\xbe\x9f\x61\xf6\xb3\x94\xc2\xbe\x3e\x6e\x6d\x01\xa5\x2d\xb4\x33\xfa\x8d\x35\x9c\x6f\x54\xe8\x17\xf5\xc3\xb6\xcc\x2f\x94\xa1\xda\x2a\x8d\xe9\xe3\x3b\xc8\xd5\x4e\xc6\xed\x7d\x9d\x4d\x64\xbf\xa6\x9e\x65\x6a\x96\x2b\x2d\xd2\xaf\xa8\x25\x0d\x9f\xca\xc7\x91\xc5\x6a\x70\x88\x81\xa9\xbb\xe1\x36\x79\x0c\x85\xf5\xe6\x8a\x75\x28\x57\x1a\xbd\x94\x75\xc2\x4f\x9d\x9e\xa3\xf9\x30\x68\x1e\x36\x3b\x6e\x41\x7e\x58\x6a\x74\xdc\x9d\x1c\xcb\x8e\xc7\x35\x55\x19\x98\xbe\xd9\xb6\x35\x1f\x9b\xeb\x05\xe5\x59\xae\x6b\xad\x6e\xf5\x86\xc4\x8f\xdc\x45\x9c\x1f\x8a\x9c\x6b\xaf\x73\xff\xde\x6d\xdd\x5d\x72\x56\x7d\x8f\xdc\x9a\xb0\x1c\x4f\x4f\xde\x36\x20\xf7\x2f\x34\x9d\x08\x6b\xdd\x60\x43\x53\xf7\x02\xf8\x4c\x0e\x5d\x33\x72\x94\xc6\xa2\x8d\xf8\x7b\x32\x59\x6b\xb5\x9c\x15\x29\x18\xab\x98\x59\x32\x11\xde\x36\x19\x68\xef\x8f\xcd\x9e\xfc\x15\xc3\xd2\xb3\x74\x77\x0c\x56\x87\x2a\x03\x87\xaf\xd2\x4b\x61\xa5\x89\xd4\x97\x24\xc6\x9f\xef\xef\x83\xdd\x0d\xaa\xbb\x71\x7e\x03\xe6\x59\xed\xfc\x6d\x1f\xb5\x8e\x5b\xf6\xa9\xbb\xca\xb5\x5f\xcb\x7b\x5d\xfb\xdf\x47\xe6\x13\x49\xb2\x71\xd7\x23\xc6\x4c\xfd\x26\xa6\x98\x54\xbf\xb9\x77\x17\xf6\xe3\x91\xfb\xd7\x96\xff\x07\x00\x00\xff\xff\x4b\x13\x4b\x6c\x3d\x25\x00\x00") func pagesAssetsHtmlContainersHtmlBytes() ([]byte, error) { return bindataRead( diff --git a/vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go b/vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go index ada23c28ded54..ae277d269990d 100644 --- a/vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go +++ b/vendor/github.com/google/cadvisor/utils/oomparser/oomparser.go @@ -32,7 +32,7 @@ import ( var ( containerRegexp = regexp.MustCompile(`Task in (.*) killed as a result of limit of (.*)`) - lastLineRegexp = regexp.MustCompile(`(^[A-Z][a-z]{2} .*[0-9]{1,2} [0-9]{1,2}:[0-9]{2}:[0-9]{2}) .* Killed process ([0-9]+) \(([\w]+)\)`) + lastLineRegexp = regexp.MustCompile(`(^[A-Z][a-z]{2} .*[0-9]{1,2} [0-9]{1,2}:[0-9]{2}:[0-9]{2}) .* Killed process ([0-9]+) \((.+)\)`) firstLineRegexp = regexp.MustCompile(`invoked oom-killer:`) ) From 0af9f756cd669a6095c627d59276aa80a78d80cb Mon Sep 17 00:00:00 2001 From: Michael Taufen Date: Wed, 16 Aug 2017 10:33:15 -0700 Subject: [PATCH 121/403] Don't register the kubeletconfig group with the default Scheme --- cmd/kubelet/app/options/BUILD | 3 +- cmd/kubelet/app/options/options.go | 14 +++--- cmd/kubelet/app/server.go | 8 ++- cmd/kubelet/kubelet.go | 5 +- pkg/kubelet/apis/kubeletconfig/BUILD | 2 +- .../apis/kubeletconfig/install/install.go | 49 ------------------- .../kubeletconfig/{install => scheme}/BUILD | 18 ++----- .../apis/kubeletconfig/scheme/scheme.go | 40 +++++++++++++++ pkg/kubelet/kubeletconfig/checkpoint/BUILD | 4 +- .../kubeletconfig/checkpoint/checkpoint.go | 3 +- .../checkpoint/checkpoint_test.go | 28 +++++------ .../kubeletconfig/checkpoint/configmap.go | 23 ++++++--- .../checkpoint/configmap_test.go | 37 +++++++++++--- .../kubeletconfig/checkpoint/download.go | 9 +++- .../kubeletconfig/checkpoint/download_test.go | 8 ++- pkg/kubelet/kubeletconfig/configfiles/BUILD | 2 + .../kubeletconfig/configfiles/configfiles.go | 20 ++++++-- pkg/kubelet/kubeletconfig/controller.go | 15 ++++-- pkg/kubelet/kubeletconfig/util/codec/BUILD | 3 +- pkg/kubelet/kubeletconfig/util/codec/codec.go | 26 +++------- test/e2e_node/BUILD | 1 + test/e2e_node/util.go | 22 ++++----- .../etcd/etcd_storage_path_test.go | 4 -- 23 files changed, 189 insertions(+), 155 deletions(-) delete mode 100644 pkg/kubelet/apis/kubeletconfig/install/install.go rename pkg/kubelet/apis/kubeletconfig/{install => scheme}/BUILD (55%) create mode 100644 pkg/kubelet/apis/kubeletconfig/scheme/scheme.go diff --git a/cmd/kubelet/app/options/BUILD b/cmd/kubelet/app/options/BUILD index 2cb6e59bdb6e5..9b19054d13241 100644 --- a/cmd/kubelet/app/options/BUILD +++ b/cmd/kubelet/app/options/BUILD @@ -12,11 +12,10 @@ go_library( "options.go", ], deps = [ - "//pkg/api:go_default_library", "//pkg/apis/componentconfig:go_default_library", "//pkg/features:go_default_library", "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/install:go_default_library", + "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", "//pkg/kubelet/apis/kubeletconfig/v1alpha1:go_default_library", "//pkg/kubelet/apis/kubeletconfig/validation:go_default_library", "//pkg/util/taints:go_default_library", diff --git a/cmd/kubelet/app/options/options.go b/cmd/kubelet/app/options/options.go index 118d9c620a51c..ad60d5fa83c3a 100644 --- a/cmd/kubelet/app/options/options.go +++ b/cmd/kubelet/app/options/options.go @@ -25,14 +25,12 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/flag" utilflag "k8s.io/apiserver/pkg/util/flag" - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/componentconfig" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - kubeletconfigvalidation "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation" - // Need to make sure the kubeletconfig api is installed so defaulting funcs work - _ "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/install" + kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1" + kubeletconfigvalidation "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation" utiltaints "k8s.io/kubernetes/pkg/util/taints" "github.com/spf13/pflag" @@ -142,10 +140,14 @@ func ValidateKubeletFlags(f *KubeletFlags) error { // NewKubeletConfiguration will create a new KubeletConfiguration with default values func NewKubeletConfiguration() (*kubeletconfig.KubeletConfiguration, error) { + scheme, _, err := kubeletscheme.NewSchemeAndCodecs() + if err != nil { + return nil, err + } versioned := &v1alpha1.KubeletConfiguration{} - api.Scheme.Default(versioned) + scheme.Default(versioned) config := &kubeletconfig.KubeletConfiguration{} - if err := api.Scheme.Convert(versioned, config, nil); err != nil { + if err := scheme.Convert(versioned, config, nil); err != nil { return nil, err } return config, nil diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 69a2a5d8c1ff5..bade6b9907a46 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -756,7 +756,8 @@ func parseResourceList(m kubeletconfiginternal.ConfigurationMap) (v1.ResourceLis } // BootstrapKubeletConfigController constructs and bootstrap a configuration controller -func BootstrapKubeletConfigController(flags *options.KubeletFlags, +func BootstrapKubeletConfigController( + flags *options.KubeletFlags, defaultConfig *kubeletconfiginternal.KubeletConfiguration) (*kubeletconfiginternal.KubeletConfiguration, *kubeletconfig.Controller, error) { var err error // Alpha Dynamic Configuration Implementation; this section only loads config from disk, it does not contact the API server @@ -777,7 +778,10 @@ func BootstrapKubeletConfigController(flags *options.KubeletFlags, } // get the latest KubeletConfiguration checkpoint from disk, or load the init or default config if no valid checkpoints exist - kubeletConfigController := kubeletconfig.NewController(initConfigDir, dynamicConfigDir, defaultConfig) + kubeletConfigController, err := kubeletconfig.NewController(initConfigDir, dynamicConfigDir, defaultConfig) + if err != nil { + return nil, nil, fmt.Errorf("failed to construct controller, error: %v", err) + } kubeletConfig, err := kubeletConfigController.Bootstrap() if err != nil { return nil, nil, fmt.Errorf("failed to determine a valid configuration, error: %v", err) diff --git a/cmd/kubelet/kubelet.go b/cmd/kubelet/kubelet.go index d26d213e5eb7f..f63526f5c2c27 100644 --- a/cmd/kubelet/kubelet.go +++ b/cmd/kubelet/kubelet.go @@ -89,7 +89,10 @@ func main() { } // construct a KubeletServer from kubeletFlags and kubeletConfig - kubeletServer := &options.KubeletServer{KubeletFlags: *kubeletFlags, KubeletConfiguration: *kubeletConfig} + kubeletServer := &options.KubeletServer{ + KubeletFlags: *kubeletFlags, + KubeletConfiguration: *kubeletConfig, + } // use kubeletServer to construct the default KubeletDeps kubeletDeps, err := app.UnsecuredDependencies(kubeletServer) diff --git a/pkg/kubelet/apis/kubeletconfig/BUILD b/pkg/kubelet/apis/kubeletconfig/BUILD index 92d82340d23f4..07c85a597d6ec 100644 --- a/pkg/kubelet/apis/kubeletconfig/BUILD +++ b/pkg/kubelet/apis/kubeletconfig/BUILD @@ -36,7 +36,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//pkg/kubelet/apis/kubeletconfig/install:all-srcs", + "//pkg/kubelet/apis/kubeletconfig/scheme:all-srcs", "//pkg/kubelet/apis/kubeletconfig/v1alpha1:all-srcs", "//pkg/kubelet/apis/kubeletconfig/validation:all-srcs", ], diff --git a/pkg/kubelet/apis/kubeletconfig/install/install.go b/pkg/kubelet/apis/kubeletconfig/install/install.go deleted file mode 100644 index 731791f9d0837..0000000000000 --- a/pkg/kubelet/apis/kubeletconfig/install/install.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package install installs the experimental API group, making it available as -// an option to all of the API encoding/decoding machinery. -package install - -import ( - "k8s.io/apimachinery/pkg/apimachinery/announced" - "k8s.io/apimachinery/pkg/apimachinery/registered" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1" -) - -func init() { - // TODO(mtaufen): probably want to create a kubelet scheme rather than reusing the api scheme, but need to ask lavalamp - Install(api.GroupFactoryRegistry, api.Registry, api.Scheme) -} - -// Install registers the API group and adds types to a scheme -func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { - if err := announced.NewGroupMetaFactory( - &announced.GroupMetaFactoryArgs{ - GroupName: kubeletconfig.GroupName, - VersionPreferenceOrder: []string{v1alpha1.SchemeGroupVersion.Version}, - AddInternalObjectsToScheme: kubeletconfig.AddToScheme, - }, - announced.VersionToSchemeFunc{ - v1alpha1.SchemeGroupVersion.Version: v1alpha1.AddToScheme, - }, - ).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil { - panic(err) - } -} diff --git a/pkg/kubelet/apis/kubeletconfig/install/BUILD b/pkg/kubelet/apis/kubeletconfig/scheme/BUILD similarity index 55% rename from pkg/kubelet/apis/kubeletconfig/install/BUILD rename to pkg/kubelet/apis/kubeletconfig/scheme/BUILD index 111801fa0b6b9..44660bf9818f4 100644 --- a/pkg/kubelet/apis/kubeletconfig/install/BUILD +++ b/pkg/kubelet/apis/kubeletconfig/scheme/BUILD @@ -1,23 +1,14 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = ["install.go"], - tags = ["automanaged"], + srcs = ["scheme.go"], + visibility = ["//visibility:public"], deps = [ - "//pkg/api:go_default_library", "//pkg/kubelet/apis/kubeletconfig:go_default_library", "//pkg/kubelet/apis/kubeletconfig/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", ], ) @@ -32,4 +23,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/pkg/kubelet/apis/kubeletconfig/scheme/scheme.go b/pkg/kubelet/apis/kubeletconfig/scheme/scheme.go new file mode 100644 index 0000000000000..76f042818e6d7 --- /dev/null +++ b/pkg/kubelet/apis/kubeletconfig/scheme/scheme.go @@ -0,0 +1,40 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package scheme + +import ( + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1" +) + +// Utility functions for the Kubelet's kubeletconfig API group + +// NewSchemeAndCodecs is a utility funciton that returns a Scheme and CodecFactory +// that understand the types in the kubeletconfig API group. +func NewSchemeAndCodecs() (*runtime.Scheme, *serializer.CodecFactory, error) { + scheme := runtime.NewScheme() + if err := kubeletconfig.AddToScheme(scheme); err != nil { + return nil, nil, err + } + if err := v1alpha1.AddToScheme(scheme); err != nil { + return nil, nil, err + } + codecs := serializer.NewCodecFactory(scheme) + return scheme, &codecs, nil +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/BUILD b/pkg/kubelet/kubeletconfig/checkpoint/BUILD index 8e2844f81c451..c4d1fa6f88491 100644 --- a/pkg/kubelet/kubeletconfig/checkpoint/BUILD +++ b/pkg/kubelet/kubeletconfig/checkpoint/BUILD @@ -15,8 +15,8 @@ go_test( ], library = ":go_default_library", deps = [ - "//pkg/api:go_default_library", "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", "//pkg/kubelet/apis/kubeletconfig/v1alpha1:go_default_library", "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", "//pkg/kubelet/kubeletconfig/util/test:go_default_library", @@ -40,12 +40,14 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", "//pkg/kubelet/kubeletconfig/util/log:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", ], ) diff --git a/pkg/kubelet/kubeletconfig/checkpoint/checkpoint.go b/pkg/kubelet/kubeletconfig/checkpoint/checkpoint.go index e9a6c29d70142..852ea71488906 100644 --- a/pkg/kubelet/kubeletconfig/checkpoint/checkpoint.go +++ b/pkg/kubelet/kubeletconfig/checkpoint/checkpoint.go @@ -30,7 +30,7 @@ import ( type Checkpoint interface { // UID returns the UID of the config source object behind the Checkpoint UID() string - // Parse parses the checkpoint into the internal KubeletConfiguration type + // Parse extracts the KubeletConfiguration from the checkpoint, applies defaults, and converts to the internal type Parse() (*kubeletconfig.KubeletConfiguration, error) // Encode returns a []byte representation of the config source object behind the Checkpoint Encode() ([]byte, error) @@ -56,6 +56,7 @@ func DecodeCheckpoint(data []byte) (Checkpoint, error) { if err != nil { return nil, fmt.Errorf("failed to convert decoded object into a v1 ConfigMap, error: %v", err) } + return NewConfigMapCheckpoint(cm) } diff --git a/pkg/kubelet/kubeletconfig/checkpoint/checkpoint_test.go b/pkg/kubelet/kubeletconfig/checkpoint/checkpoint_test.go index d9cc259524986..abcf9981b1c26 100644 --- a/pkg/kubelet/kubeletconfig/checkpoint/checkpoint_test.go +++ b/pkg/kubelet/kubeletconfig/checkpoint/checkpoint_test.go @@ -30,20 +30,6 @@ import ( utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" ) -// newUnsupportedEncoded returns an encoding of an object that does not have a Checkpoint implementation -func newUnsupportedEncoded(t *testing.T) []byte { - encoder, err := utilcodec.NewJSONEncoder(apiv1.GroupName) - if err != nil { - t.Fatalf("could not create an encoder, error: %v", err) - } - unsupported := &apiv1.Node{} - data, err := runtime.Encode(encoder, unsupported) - if err != nil { - t.Fatalf("could not encode object, error: %v", err) - } - return data -} - func TestDecodeCheckpoint(t *testing.T) { // generate correct Checkpoint for v1/ConfigMap test case cm, err := NewConfigMapCheckpoint(&apiv1.ConfigMap{ObjectMeta: metav1.ObjectMeta{UID: types.UID("uid")}}) @@ -87,3 +73,17 @@ func TestDecodeCheckpoint(t *testing.T) { } } } + +// newUnsupportedEncoded returns an encoding of an object that does not have a Checkpoint implementation +func newUnsupportedEncoded(t *testing.T) []byte { + encoder, err := utilcodec.NewJSONEncoder(apiv1.GroupName) + if err != nil { + t.Fatalf("could not create an encoder, error: %v", err) + } + unsupported := &apiv1.Node{} + data, err := runtime.Encode(encoder, unsupported) + if err != nil { + t.Fatalf("could not encode object, error: %v", err) + } + return data +} diff --git a/pkg/kubelet/kubeletconfig/checkpoint/configmap.go b/pkg/kubelet/kubeletconfig/checkpoint/configmap.go index b0a8ecdea98de..7472384889f5f 100644 --- a/pkg/kubelet/kubeletconfig/checkpoint/configmap.go +++ b/pkg/kubelet/kubeletconfig/checkpoint/configmap.go @@ -21,7 +21,9 @@ import ( apiv1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec" ) @@ -29,7 +31,8 @@ const configMapConfigKey = "kubelet" // configMapCheckpoint implements Checkpoint, backed by a v1/ConfigMap config source object type configMapCheckpoint struct { - configMap *apiv1.ConfigMap + kubeletCodecs *serializer.CodecFactory // codecs for the KubeletConfiguration + configMap *apiv1.ConfigMap } // NewConfigMapCheckpoint returns a Checkpoint backed by `cm`. `cm` must be non-nil @@ -40,7 +43,13 @@ func NewConfigMapCheckpoint(cm *apiv1.ConfigMap) (Checkpoint, error) { } else if len(cm.ObjectMeta.UID) == 0 { return nil, fmt.Errorf("ConfigMap must have a UID to be treated as a Checkpoint") } - return &configMapCheckpoint{cm}, nil + + _, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs() + if err != nil { + return nil, err + } + + return &configMapCheckpoint{kubeletCodecs, cm}, nil } // UID returns the UID of a configMapCheckpoint @@ -48,25 +57,23 @@ func (c *configMapCheckpoint) UID() string { return string(c.configMap.UID) } -// implements Parse for v1/ConfigMap checkpoints +// Parse extracts the KubeletConfiguration from v1/ConfigMap checkpoints, applies defaults, and converts to the internal type func (c *configMapCheckpoint) Parse() (*kubeletconfig.KubeletConfiguration, error) { const emptyCfgErr = "config was empty, but some parameters are required" - cm := c.configMap - - if len(cm.Data) == 0 { + if len(c.configMap.Data) == 0 { return nil, fmt.Errorf(emptyCfgErr) } // TODO(mtaufen): Once the KubeletConfiguration type is decomposed, extend this to a key for each sub-object - config, ok := cm.Data[configMapConfigKey] + config, ok := c.configMap.Data[configMapConfigKey] if !ok { return nil, fmt.Errorf("key %q not found in ConfigMap", configMapConfigKey) } else if len(config) == 0 { return nil, fmt.Errorf(emptyCfgErr) } - return utilcodec.DecodeKubeletConfiguration([]byte(config)) + return utilcodec.DecodeKubeletConfiguration(c.kubeletCodecs, []byte(config)) } // Encode encodes a configMapCheckpoint diff --git a/pkg/kubelet/kubeletconfig/checkpoint/configmap_test.go b/pkg/kubelet/kubeletconfig/checkpoint/configmap_test.go index 07092e4446d6c..98d8a37eb2adc 100644 --- a/pkg/kubelet/kubeletconfig/checkpoint/configmap_test.go +++ b/pkg/kubelet/kubeletconfig/checkpoint/configmap_test.go @@ -26,8 +26,8 @@ import ( apiequality "k8s.io/apimachinery/pkg/api/equality" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" kubeletconfigv1alpha1 "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1" utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" ) @@ -66,9 +66,15 @@ func TestNewConfigMapCheckpoint(t *testing.T) { } func TestConfigMapCheckpointUID(t *testing.T) { + _, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + cases := []string{"", "uid", "376dfb73-56db-11e7-a01e-42010a800002"} for _, uidIn := range cases { cpt := &configMapCheckpoint{ + kubeletCodecs, &apiv1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{UID: types.UID(uidIn)}, }, @@ -82,11 +88,16 @@ func TestConfigMapCheckpointUID(t *testing.T) { } func TestConfigMapCheckpointParse(t *testing.T) { + kubeletScheme, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + // get the built-in default configuration external := &kubeletconfigv1alpha1.KubeletConfiguration{} - api.Scheme.Default(external) + kubeletScheme.Default(external) defaultConfig := &kubeletconfig.KubeletConfiguration{} - err := api.Scheme.Convert(external, defaultConfig, nil) + err = kubeletScheme.Convert(external, defaultConfig, nil) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -123,7 +134,7 @@ apiVersion: kubeletconfig/v1alpha1`}}, defaultConfig, ""}, "kubelet": `{"kind":"KubeletConfiguration","apiVersion":"kubeletconfig/v1alpha1"}`}}, defaultConfig, ""}, } for _, c := range cases { - cpt := &configMapCheckpoint{c.cm} + cpt := &configMapCheckpoint{kubeletCodecs, c.cm} kc, err := cpt.Parse() if utiltest.SkipRest(t, c.desc, err, c.err) { continue @@ -136,6 +147,11 @@ apiVersion: kubeletconfig/v1alpha1`}}, defaultConfig, ""}, } func TestConfigMapCheckpointEncode(t *testing.T) { + _, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + // only one case, based on output from the existing encoder, and since // this is hard to test (key order isn't guaranteed), we should probably // just stick to this test case and mostly rely on the round-trip test. @@ -146,7 +162,7 @@ func TestConfigMapCheckpointEncode(t *testing.T) { }{ // we expect Checkpoints to be encoded as a json representation of the underlying API object {"one-key", - &configMapCheckpoint{&apiv1.ConfigMap{ + &configMapCheckpoint{kubeletCodecs, &apiv1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{Name: "one-key"}, Data: map[string]string{"one": ""}}}, `{"kind":"ConfigMap","apiVersion":"v1","metadata":{"name":"one-key","creationTimestamp":null},"data":{"one":""}} @@ -166,6 +182,11 @@ func TestConfigMapCheckpointEncode(t *testing.T) { } func TestConfigMapCheckpointRoundTrip(t *testing.T) { + _, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + cases := []struct { desc string cpt *configMapCheckpoint @@ -173,7 +194,7 @@ func TestConfigMapCheckpointRoundTrip(t *testing.T) { }{ // empty data {"empty data", - &configMapCheckpoint{&apiv1.ConfigMap{ + &configMapCheckpoint{kubeletCodecs, &apiv1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: "empty-data-sha256-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", UID: "uid", @@ -182,7 +203,7 @@ func TestConfigMapCheckpointRoundTrip(t *testing.T) { ""}, // two keys {"two keys", - &configMapCheckpoint{&apiv1.ConfigMap{ + &configMapCheckpoint{kubeletCodecs, &apiv1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: "two-keys-sha256-2bff03d6249c8a9dc9a1436d087c124741361ccfac6615b81b67afcff5c42431", UID: "uid", @@ -191,7 +212,7 @@ func TestConfigMapCheckpointRoundTrip(t *testing.T) { ""}, // missing uid {"missing uid", - &configMapCheckpoint{&apiv1.ConfigMap{ + &configMapCheckpoint{kubeletCodecs, &apiv1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: "two-keys-sha256-2bff03d6249c8a9dc9a1436d087c124741361ccfac6615b81b67afcff5c42431", UID: "", diff --git a/pkg/kubelet/kubeletconfig/checkpoint/download.go b/pkg/kubelet/kubeletconfig/checkpoint/download.go index b61b394ab4b80..14374a4cbf3f5 100644 --- a/pkg/kubelet/kubeletconfig/checkpoint/download.go +++ b/pkg/kubelet/kubeletconfig/checkpoint/download.go @@ -113,7 +113,6 @@ func (r *remoteConfigMap) UID() string { func (r *remoteConfigMap) Download(client clientset.Interface) (Checkpoint, string, error) { var reason string - uid := string(r.source.ConfigMapRef.UID) utillog.Infof("attempting to download ConfigMap with UID %q", uid) @@ -131,8 +130,14 @@ func (r *remoteConfigMap) Download(client clientset.Interface) (Checkpoint, stri return nil, reason, fmt.Errorf(reason) } + checkpoint, err := NewConfigMapCheckpoint(cm) + if err != nil { + reason = fmt.Sprintf("invalid downloaded object") + return nil, reason, fmt.Errorf("%s, error: %v", reason, err) + } + utillog.Infof("successfully downloaded ConfigMap with UID %q", uid) - return &configMapCheckpoint{cm}, "", nil + return checkpoint, "", nil } func (r *remoteConfigMap) Encode() ([]byte, error) { diff --git a/pkg/kubelet/kubeletconfig/checkpoint/download_test.go b/pkg/kubelet/kubeletconfig/checkpoint/download_test.go index 496353919f42f..da3f60e343034 100644 --- a/pkg/kubelet/kubeletconfig/checkpoint/download_test.go +++ b/pkg/kubelet/kubeletconfig/checkpoint/download_test.go @@ -26,6 +26,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" fakeclient "k8s.io/client-go/kubernetes/fake" + kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" utiltest "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/test" ) @@ -92,6 +93,11 @@ func TestRemoteConfigMapUID(t *testing.T) { } func TestRemoteConfigMapDownload(t *testing.T) { + _, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + cm := &apiv1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: "name", @@ -118,7 +124,7 @@ func TestRemoteConfigMapDownload(t *testing.T) { // successful download {"object exists and reference is correct", &remoteConfigMap{&apiv1.NodeConfigSource{ConfigMapRef: &apiv1.ObjectReference{Name: "name", Namespace: "namespace", UID: "uid"}}}, - &configMapCheckpoint{cm}, ""}, + &configMapCheckpoint{kubeletCodecs, cm}, ""}, } for _, c := range cases { diff --git a/pkg/kubelet/kubeletconfig/configfiles/BUILD b/pkg/kubelet/kubeletconfig/configfiles/BUILD index 94a32a7191c24..2884d0cfbf721 100644 --- a/pkg/kubelet/kubeletconfig/configfiles/BUILD +++ b/pkg/kubelet/kubeletconfig/configfiles/BUILD @@ -10,8 +10,10 @@ go_library( srcs = ["configfiles.go"], deps = [ "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", "//pkg/kubelet/kubeletconfig/util/filesystem:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", ], ) diff --git a/pkg/kubelet/kubeletconfig/configfiles/configfiles.go b/pkg/kubelet/kubeletconfig/configfiles/configfiles.go index 449c5c8112ee2..c3ad50e22ff84 100644 --- a/pkg/kubelet/kubeletconfig/configfiles/configfiles.go +++ b/pkg/kubelet/kubeletconfig/configfiles/configfiles.go @@ -20,7 +20,9 @@ import ( "fmt" "path/filepath" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec" utilfs "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/filesystem" ) @@ -35,16 +37,24 @@ type Loader interface { type fsLoader struct { // fs is the filesystem where the config files exist; can be mocked for testing fs utilfs.Filesystem + // kubeletCodecs is the scheme used to decode config files + kubeletCodecs *serializer.CodecFactory // configDir is the absolute path to the directory containing the configuration files configDir string } // NewFSLoader returns a Loader that loads a KubeletConfiguration from the files in `configDir` -func NewFSLoader(fs utilfs.Filesystem, configDir string) Loader { - return &fsLoader{ - fs: fs, - configDir: configDir, +func NewFSLoader(fs utilfs.Filesystem, configDir string) (Loader, error) { + _, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs() + if err != nil { + return nil, err } + + return &fsLoader{ + fs: fs, + kubeletCodecs: kubeletCodecs, + configDir: configDir, + }, nil } func (loader *fsLoader) Load() (*kubeletconfig.KubeletConfiguration, error) { @@ -62,5 +72,5 @@ func (loader *fsLoader) Load() (*kubeletconfig.KubeletConfiguration, error) { return nil, fmt.Errorf(errfmt, fmt.Errorf("config file was empty, but some parameters are required")) } - return utilcodec.DecodeKubeletConfiguration(data) + return utilcodec.DecodeKubeletConfiguration(loader.kubeletCodecs, data) } diff --git a/pkg/kubelet/kubeletconfig/controller.go b/pkg/kubelet/kubeletconfig/controller.go index f6f0c34e6d2eb..afee768085f4c 100644 --- a/pkg/kubelet/kubeletconfig/controller.go +++ b/pkg/kubelet/kubeletconfig/controller.go @@ -53,7 +53,7 @@ const ( // - validates configuration // - monitors for potential crash-loops caused by new configurations // - tracks the last-known-good configuration, and rolls-back to last-known-good when necessary -// For more information, see the proposal: https://github.com/kubernetes/kubernetes/pull/29459 +// For more information, see the proposal: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/dynamic-kubelet-configuration.md type Controller struct { // dynamicConfig, if true, indicates that we should sync config from the API server dynamicConfig bool @@ -90,12 +90,19 @@ type Controller struct { // If the `initConfigDir` is an empty string, skips trying to load the init config. // If the `dynamicConfigDir` is an empty string, skips trying to load checkpoints or download new config, // but will still sync the ConfigOK condition if you call StartSync with a non-nil client. -func NewController(initConfigDir string, dynamicConfigDir string, defaultConfig *kubeletconfig.KubeletConfiguration) *Controller { +func NewController(initConfigDir string, + dynamicConfigDir string, + defaultConfig *kubeletconfig.KubeletConfiguration) (*Controller, error) { + var err error + fs := utilfs.DefaultFs{} var initLoader configfiles.Loader if len(initConfigDir) > 0 { - initLoader = configfiles.NewFSLoader(fs, initConfigDir) + initLoader, err = configfiles.NewFSLoader(fs, initConfigDir) + if err != nil { + return nil, err + } } dynamicConfig := false if len(dynamicConfigDir) > 0 { @@ -120,7 +127,7 @@ func NewController(initConfigDir string, dynamicConfigDir string, defaultConfig badConfigTracker: badconfig.NewFsTracker(fs, filepath.Join(dynamicConfigDir, badConfigTrackingDir, kubeletVersion)), startupTracker: startups.NewFsTracker(fs, filepath.Join(dynamicConfigDir, startupTrackingDir, kubeletVersion)), initLoader: initLoader, - } + }, nil } // Bootstrap attempts to return a valid KubeletConfiguration based on the configuration of the Controller, diff --git a/pkg/kubelet/kubeletconfig/util/codec/BUILD b/pkg/kubelet/kubeletconfig/util/codec/BUILD index 9a55c12caf4a2..df4916b26c879 100644 --- a/pkg/kubelet/kubeletconfig/util/codec/BUILD +++ b/pkg/kubelet/kubeletconfig/util/codec/BUILD @@ -12,9 +12,8 @@ go_library( "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/install:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", ], ) diff --git a/pkg/kubelet/kubeletconfig/util/codec/codec.go b/pkg/kubelet/kubeletconfig/util/codec/codec.go index 14432dae6e319..148967caba83a 100644 --- a/pkg/kubelet/kubeletconfig/util/codec/codec.go +++ b/pkg/kubelet/kubeletconfig/util/codec/codec.go @@ -21,13 +21,11 @@ import ( // ensure the core apis are installed _ "k8s.io/kubernetes/pkg/api/install" - // ensure the kubeletconfig apis are installed - _ "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/install" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - kubeletconfigv1alpha1 "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1" ) // TODO(mtaufen): allow an encoder to be injected into checkpoint objects at creation time? (then we could ultimately instantiate only one encoder) @@ -50,28 +48,18 @@ func NewJSONEncoder(groupName string) (runtime.Encoder, error) { return api.Codecs.EncoderForVersion(info.Serializer, versions[0]), nil } -// DecodeKubeletConfiguration decodes an encoded (v1alpha1) KubeletConfiguration object to the internal type -func DecodeKubeletConfiguration(data []byte) (*kubeletconfig.KubeletConfiguration, error) { - // decode the object, note we use the external version scheme to decode, because users provide the external version - obj, err := runtime.Decode(api.Codecs.UniversalDecoder(kubeletconfigv1alpha1.SchemeGroupVersion), data) +// DecodeKubeletConfiguration decodes a serialized KubeletConfiguration to the internal type +func DecodeKubeletConfiguration(kubeletCodecs *serializer.CodecFactory, data []byte) (*kubeletconfig.KubeletConfiguration, error) { + // the UniversalDecoder runs defaulting and returns the internal type by default + obj, gvk, err := kubeletCodecs.UniversalDecoder().Decode(data, nil, nil) if err != nil { return nil, fmt.Errorf("failed to decode, error: %v", err) } - externalKC, ok := obj.(*kubeletconfigv1alpha1.KubeletConfiguration) + internalKC, ok := obj.(*kubeletconfig.KubeletConfiguration) if !ok { - return nil, fmt.Errorf("failed to cast object to KubeletConfiguration, object: %#v", obj) + return nil, fmt.Errorf("failed to cast object to KubeletConfiguration, unexpected type: %v", gvk) } - // TODO(mtaufen): confirm whether api.Codecs.UniversalDecoder runs the defaulting, which would make this redundant - // run the defaulter on the decoded configuration before converting to internal type - api.Scheme.Default(externalKC) - - // convert to internal type - internalKC := &kubeletconfig.KubeletConfiguration{} - err = api.Scheme.Convert(externalKC, internalKC, nil) - if err != nil { - return nil, err - } return internalKC, nil } diff --git a/test/e2e_node/BUILD b/test/e2e_node/BUILD index fad63ad1cba61..719f488102371 100644 --- a/test/e2e_node/BUILD +++ b/test/e2e_node/BUILD @@ -30,6 +30,7 @@ go_library( "//pkg/kubelet/apis/cri:go_default_library", "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", "//pkg/kubelet/apis/kubeletconfig/v1alpha1:go_default_library", "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", "//pkg/kubelet/metrics:go_default_library", diff --git a/test/e2e_node/util.go b/test/e2e_node/util.go index 3cbca9dd85fd7..80cf72a4aa271 100644 --- a/test/e2e_node/util.go +++ b/test/e2e_node/util.go @@ -37,6 +37,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" kubeletconfigv1alpha1 "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1" stats "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" kubeletmetrics "k8s.io/kubernetes/pkg/kubelet/metrics" @@ -262,7 +263,7 @@ func makeKubeletConfigMap(internalKC *kubeletconfig.KubeletConfiguration) *v1.Co externalKC := &kubeletconfigv1alpha1.KubeletConfiguration{} api.Scheme.Convert(internalKC, externalKC, nil) - encoder, err := newJSONEncoder(kubeletconfig.GroupName) + encoder, err := newKubeletConfigJSONEncoder() framework.ExpectNoError(err) data, err := runtime.Encode(encoder, externalKC) @@ -310,21 +311,18 @@ func logKubeletMetrics(metricKeys ...string) { } } -func newJSONEncoder(groupName string) (runtime.Encoder, error) { - // encode to json +func newKubeletConfigJSONEncoder() (runtime.Encoder, error) { + _, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs() + if err != nil { + return nil, err + } + mediaType := "application/json" - info, ok := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), mediaType) + info, ok := runtime.SerializerInfoForMediaType(kubeletCodecs.SupportedMediaTypes(), mediaType) if !ok { return nil, fmt.Errorf("unsupported media type %q", mediaType) } - - versions := api.Registry.EnabledVersionsForGroup(groupName) - if len(versions) == 0 { - return nil, fmt.Errorf("no enabled versions for group %q", groupName) - } - - // the "best" version supposedly comes first in the list returned from api.Registry.EnabledVersionsForGroup - return api.Codecs.EncoderForVersion(info.Serializer, versions[0]), nil + return kubeletCodecs.EncoderForVersion(info.Serializer, kubeletconfigv1alpha1.SchemeGroupVersion), nil } // runCommand runs the cmd and returns the combined stdout and stderr, or an diff --git a/test/integration/etcd/etcd_storage_path_test.go b/test/integration/etcd/etcd_storage_path_test.go index b3462acdb0d4e..d94be2fe09f00 100644 --- a/test/integration/etcd/etcd_storage_path_test.go +++ b/test/integration/etcd/etcd_storage_path_test.go @@ -434,10 +434,6 @@ var ephemeralWhiteList = createEphemeralWhiteList( gvr("componentconfig", "v1alpha1", "kubeproxyconfigurations"), // not stored in etcd // -- - // k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1 - gvr("kubeletconfig", "v1alpha1", "kubeletconfigurations"), // not stored in etcd - // -- - // k8s.io/kubernetes/pkg/apis/extensions/v1beta1 gvr("extensions", "v1beta1", "deploymentrollbacks"), // used to rollback deployment, not stored in etcd gvr("extensions", "v1beta1", "replicationcontrollerdummies"), // not stored in etcd From 70b942d6638e99484fe9eb11e878d7300dd8d9ae Mon Sep 17 00:00:00 2001 From: Christoph Blecker Date: Sat, 12 Aug 2017 13:36:41 -0700 Subject: [PATCH 122/403] Allow zsh completion to be autoloaded by compinit --- pkg/kubectl/cmd/completion.go | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/pkg/kubectl/cmd/completion.go b/pkg/kubectl/cmd/completion.go index 20414218c7213..10b773c5e93fe 100644 --- a/pkg/kubectl/cmd/completion.go +++ b/pkg/kubectl/cmd/completion.go @@ -87,7 +87,7 @@ source '$HOME/.kube/completion.bash.inc' ) var ( - completion_shells = map[string]func(out io.Writer, cmd *cobra.Command) error{ + completion_shells = map[string]func(out io.Writer, boilerPlate string, cmd *cobra.Command) error{ "bash": runCompletionBash, "zsh": runCompletionZsh, } @@ -126,20 +126,32 @@ func RunCompletion(out io.Writer, boilerPlate string, cmd *cobra.Command, args [ return cmdutil.UsageErrorf(cmd, "Unsupported shell type %q.", args[0]) } + return run(out, boilerPlate, cmd.Parent()) +} + +func runCompletionBash(out io.Writer, boilerPlate string, kubectl *cobra.Command) error { if len(boilerPlate) == 0 { boilerPlate = defaultBoilerPlate } if _, err := out.Write([]byte(boilerPlate)); err != nil { return err } - return run(out, cmd.Parent()) -} -func runCompletionBash(out io.Writer, kubectl *cobra.Command) error { return kubectl.GenBashCompletion(out) } -func runCompletionZsh(out io.Writer, kubectl *cobra.Command) error { +func runCompletionZsh(out io.Writer, boilerPlate string, kubectl *cobra.Command) error { + zsh_head := `#compdef kubectl +` + out.Write([]byte(zsh_head)) + + if len(boilerPlate) == 0 { + boilerPlate = defaultBoilerPlate + } + if _, err := out.Write([]byte(boilerPlate)); err != nil { + return err + } + zsh_initialization := ` __kubectl_bash_source() { alias shopt=':' @@ -293,6 +305,7 @@ BASH_COMPLETION_EOF } __kubectl_bash_source <(__kubectl_convert_bash_to_zsh) +_complete kubectl 2>/dev/null ` out.Write([]byte(zsh_tail)) return nil From 0153f8de1a17668cb8e0a38b02c81d77711a8285 Mon Sep 17 00:00:00 2001 From: Christoph Blecker Date: Mon, 14 Aug 2017 11:24:33 -0700 Subject: [PATCH 123/403] Update help/example for kubectl completion --- pkg/kubectl/cmd/completion.go | 57 +++++++++++++++++------------------ 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/pkg/kubectl/cmd/completion.go b/pkg/kubectl/cmd/completion.go index 10b773c5e93fe..d14ca66329b49 100644 --- a/pkg/kubectl/cmd/completion.go +++ b/pkg/kubectl/cmd/completion.go @@ -50,40 +50,37 @@ var ( completion of kubectl commands. This can be done by sourcing it from the .bash_profile. - Note: this requires the bash-completion framework, which is not installed - by default on Mac. This can be installed by using homebrew: - - $ brew install bash-completion - - Once installed, bash_completion must be evaluated. This can be done by adding the - following line to the .bash_profile - - $ source $(brew --prefix)/etc/bash_completion + Detailed instructions on how to do this are available here: + https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion Note for zsh users: [1] zsh completions are only supported in versions of zsh >= 5.2`)) completion_example = templates.Examples(i18n.T(` - # Install bash completion on a Mac using homebrew - brew install bash-completion - printf " -# Bash completion support -source $(brew --prefix)/etc/bash_completion -" >> $HOME/.bash_profile - source $HOME/.bash_profile - - # Load the kubectl completion code for bash into the current shell - source <(kubectl completion bash) - - # Write bash completion code to a file and source if from .bash_profile - kubectl completion bash > ~/.kube/completion.bash.inc - printf " -# Kubectl shell completion -source '$HOME/.kube/completion.bash.inc' -" >> $HOME/.bash_profile - source $HOME/.bash_profile + # Installing bash completion on macOS using homebrew + ## If running Bash 3.2 included with macOS + brew install bash-completion + ## or, if running Bash 4.1+ + brew install bash-completion@2 + ## If kubectl is installed via homebrew, this should start working immediately. + ## If you've installed via other means, you may need add the completion to your completion directory + kubectl completion bash > $(brew --prefix)/etc/bash_completion.d/kubectl + + + # Installing bash completion on Linux + ## Load the kubectl completion code for bash into the current shell + source <(kubectl completion bash) + ## Write bash completion code to a file and source if from .bash_profile + kubectl completion bash > ~/.kube/completion.bash.inc + printf " + # Kubectl shell completion + source '$HOME/.kube/completion.bash.inc' + " >> $HOME/.bash_profile + source $HOME/.bash_profile # Load the kubectl completion code for zsh[1] into the current shell - source <(kubectl completion zsh)`)) + source <(kubectl completion zsh) + # Set the kubectl completion code for zsh[1] to autoload on startup + kubectl completion zsh > "${fpath[1]}/_kubectl"`)) ) var ( @@ -141,8 +138,8 @@ func runCompletionBash(out io.Writer, boilerPlate string, kubectl *cobra.Command } func runCompletionZsh(out io.Writer, boilerPlate string, kubectl *cobra.Command) error { - zsh_head := `#compdef kubectl -` + zsh_head := "#compdef kubectl\n" + out.Write([]byte(zsh_head)) if len(boilerPlate) == 0 { From d1acdf162762917c170180c2327bd58df4f24fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Sat, 19 Aug 2017 00:45:16 +0300 Subject: [PATCH 124/403] kubeadm: Make the self-hosting with certificates in Secrets mode work again --- cmd/kubeadm/app/constants/constants.go | 6 + .../app/phases/controlplane/manifests.go | 7 +- .../app/phases/controlplane/volumes.go | 10 +- cmd/kubeadm/app/phases/etcd/local.go | 3 +- .../phases/selfhosting/podspec_mutation.go | 102 ++++-- .../app/phases/selfhosting/selfhosting.go | 29 +- .../phases/selfhosting/selfhosting_volumes.go | 308 +++++++----------- cmd/kubeadm/app/util/apiclient/idempotency.go | 14 + cmd/kubeadm/app/util/apiclient/wait.go | 19 ++ cmd/kubeadm/app/util/arguments.go | 96 ++++++ 10 files changed, 354 insertions(+), 240 deletions(-) create mode 100644 cmd/kubeadm/app/util/arguments.go diff --git a/cmd/kubeadm/app/constants/constants.go b/cmd/kubeadm/app/constants/constants.go index 8a5a98c0ab7e7..e558aa5db11bb 100644 --- a/cmd/kubeadm/app/constants/constants.go +++ b/cmd/kubeadm/app/constants/constants.go @@ -113,6 +113,12 @@ const ( // SelfHostingPrefix describes the prefix workloads that are self-hosted by kubeadm has SelfHostingPrefix = "self-hosted-" + // KubeCertificatesVolumeName specifies the name for the Volume that is used for injecting certificates to control plane components (can be both a hostPath volume or a projected, all-in-one volume) + KubeCertificatesVolumeName = "k8s-certs" + + // KubeConfigVolumeName specifies the name for the Volume that is used for injecting the kubeconfig to talk securely to the api server for a control plane component if applicable + KubeConfigVolumeName = "kubeconfig" + // NodeBootstrapTokenAuthGroup specifies which group a Node Bootstrap Token should be authenticated in // TODO: This should be changed in the v1.8 dev cycle to a node-BT-specific group instead of the generic Bootstrap Token group that is used now NodeBootstrapTokenAuthGroup = "system:bootstrappers" diff --git a/cmd/kubeadm/app/phases/controlplane/manifests.go b/cmd/kubeadm/app/phases/controlplane/manifests.go index ed073cedd5f82..81c379f241b29 100644 --- a/cmd/kubeadm/app/phases/controlplane/manifests.go +++ b/cmd/kubeadm/app/phases/controlplane/manifests.go @@ -28,6 +28,7 @@ import ( kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/images" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" staticpodutil "k8s.io/kubernetes/cmd/kubeadm/app/util/staticpod" authzmodes "k8s.io/kubernetes/pkg/kubeapiserver/authorizer/modes" "k8s.io/kubernetes/pkg/util/version" @@ -159,7 +160,7 @@ func getAPIServerCommand(cfg *kubeadmapi.MasterConfiguration, k8sVersion *versio } command := []string{"kube-apiserver"} - command = append(command, staticpodutil.GetExtraParameters(cfg.APIServerExtraArgs, defaultArguments)...) + command = append(command, kubeadmutil.BuildArgumentListFromMap(defaultArguments, cfg.APIServerExtraArgs)...) command = append(command, getAuthzParameters(cfg.AuthorizationModes)...) // Check if the user decided to use an external etcd cluster @@ -206,7 +207,7 @@ func getControllerManagerCommand(cfg *kubeadmapi.MasterConfiguration, k8sVersion } command := []string{"kube-controller-manager"} - command = append(command, staticpodutil.GetExtraParameters(cfg.ControllerManagerExtraArgs, defaultArguments)...) + command = append(command, kubeadmutil.BuildArgumentListFromMap(defaultArguments, cfg.ControllerManagerExtraArgs)...) if cfg.CloudProvider != "" { command = append(command, "--cloud-provider="+cfg.CloudProvider) @@ -234,7 +235,7 @@ func getSchedulerCommand(cfg *kubeadmapi.MasterConfiguration) []string { } command := []string{"kube-scheduler"} - command = append(command, staticpodutil.GetExtraParameters(cfg.SchedulerExtraArgs, defaultArguments)...) + command = append(command, kubeadmutil.BuildArgumentListFromMap(defaultArguments, cfg.SchedulerExtraArgs)...) return command } diff --git a/cmd/kubeadm/app/phases/controlplane/volumes.go b/cmd/kubeadm/app/phases/controlplane/volumes.go index db60823788be1..cf8f8e8765e49 100644 --- a/cmd/kubeadm/app/phases/controlplane/volumes.go +++ b/cmd/kubeadm/app/phases/controlplane/volumes.go @@ -30,11 +30,9 @@ import ( ) const ( - k8sCertsVolumeName = "k8s-certs" caCertsVolumeName = "ca-certs" caCertsVolumePath = "/etc/ssl/certs" caCertsPkiVolumeName = "ca-certs-etc-pki" - kubeConfigVolumeName = "kubeconfig" ) // caCertsPkiVolumePath specifies the path that can be conditionally mounted into the apiserver and controller-manager containers @@ -49,7 +47,7 @@ func getHostPathVolumesForTheControlPlane(cfg *kubeadmapi.MasterConfiguration) c // HostPath volumes for the API Server // Read-only mount for the certificates directory // TODO: Always mount the K8s Certificates directory to a static path inside of the container - mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, k8sCertsVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) + mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, kubeadmconstants.KubeCertificatesVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) // Read-only mount for the ca certs (/etc/ssl/certs) directory mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true) @@ -62,17 +60,17 @@ func getHostPathVolumesForTheControlPlane(cfg *kubeadmapi.MasterConfiguration) c // HostPath volumes for the controller manager // Read-only mount for the certificates directory // TODO: Always mount the K8s Certificates directory to a static path inside of the container - mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, k8sCertsVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, kubeadmconstants.KubeCertificatesVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) // Read-only mount for the ca certs (/etc/ssl/certs) directory mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true) // Read-only mount for the controller manager kubeconfig file controllerManagerKubeConfigFile := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ControllerManagerKubeConfigFileName) - mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, kubeConfigVolumeName, controllerManagerKubeConfigFile, controllerManagerKubeConfigFile, true) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, kubeadmconstants.KubeConfigVolumeName, controllerManagerKubeConfigFile, controllerManagerKubeConfigFile, true) // HostPath volumes for the scheduler // Read-only mount for the scheduler kubeconfig file schedulerKubeConfigFile := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.SchedulerKubeConfigFileName) - mounts.NewHostPathMount(kubeadmconstants.KubeScheduler, kubeConfigVolumeName, schedulerKubeConfigFile, schedulerKubeConfigFile, true) + mounts.NewHostPathMount(kubeadmconstants.KubeScheduler, kubeadmconstants.KubeConfigVolumeName, schedulerKubeConfigFile, schedulerKubeConfigFile, true) // On some systems were we host-mount /etc/ssl/certs, it is also required to mount /etc/pki. This is needed // due to symlinks pointing from files in /etc/ssl/certs into /etc/pki/ diff --git a/cmd/kubeadm/app/phases/etcd/local.go b/cmd/kubeadm/app/phases/etcd/local.go index 17f2af83814a8..2645e00b92d6b 100644 --- a/cmd/kubeadm/app/phases/etcd/local.go +++ b/cmd/kubeadm/app/phases/etcd/local.go @@ -21,6 +21,7 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/images" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" staticpodutil "k8s.io/kubernetes/cmd/kubeadm/app/util/staticpod" ) @@ -60,6 +61,6 @@ func getEtcdCommand(cfg *kubeadmapi.MasterConfiguration) []string { } command := []string{"etcd"} - command = append(command, staticpodutil.GetExtraParameters(cfg.Etcd.ExtraArgs, defaultArguments)...) + command = append(command, kubeadmutil.BuildArgumentListFromMap(defaultArguments, cfg.Etcd.ExtraArgs)...) return command } diff --git a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation.go b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation.go index 3bb36afca67d3..65575bb27b4b2 100644 --- a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation.go +++ b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation.go @@ -17,43 +17,55 @@ limitations under the License. package selfhosting import ( + "path/filepath" + "k8s.io/api/core/v1" - kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" ) -// mutatePodSpec makes a Static Pod-hosted PodSpec suitable for self-hosting -func mutatePodSpec(cfg *kubeadmapi.MasterConfiguration, name string, podSpec *v1.PodSpec) { - mutators := map[string][]func(*kubeadmapi.MasterConfiguration, *v1.PodSpec){ +const ( + // selfHostedKubeConfigDir sets the directory where kubeconfig files for the scheduler and controller-manager should be mounted + // Due to how the projected volume mount works (can only be a full directory, not mount individual files), we must change this from + // the default as mounts cannot be nested (/etc/kubernetes would override /etc/kubernetes/pki) + selfHostedKubeConfigDir = "/etc/kubernetes/kubeconfig" +) + +// PodSpecMutatorFunc is a function capable of mutating a PodSpec +type PodSpecMutatorFunc func(*v1.PodSpec) + +// getDefaultMutators gets the mutator functions that alwasy should be used +func getDefaultMutators() map[string][]PodSpecMutatorFunc { + return map[string][]PodSpecMutatorFunc{ kubeadmconstants.KubeAPIServer: { addNodeSelectorToPodSpec, setMasterTolerationOnPodSpec, setRightDNSPolicyOnPodSpec, - setVolumesOnKubeAPIServerPodSpec, }, kubeadmconstants.KubeControllerManager: { addNodeSelectorToPodSpec, setMasterTolerationOnPodSpec, setRightDNSPolicyOnPodSpec, - setVolumesOnKubeControllerManagerPodSpec, }, kubeadmconstants.KubeScheduler: { addNodeSelectorToPodSpec, setMasterTolerationOnPodSpec, setRightDNSPolicyOnPodSpec, - setVolumesOnKubeSchedulerPodSpec, }, } +} +// mutatePodSpec makes a Static Pod-hosted PodSpec suitable for self-hosting +func mutatePodSpec(mutators map[string][]PodSpecMutatorFunc, name string, podSpec *v1.PodSpec) { // Get the mutator functions for the component in question, then loop through and execute them mutatorsForComponent := mutators[name] for _, mutateFunc := range mutatorsForComponent { - mutateFunc(cfg, podSpec) + mutateFunc(podSpec) } } // addNodeSelectorToPodSpec makes Pod require to be scheduled on a node marked with the master label -func addNodeSelectorToPodSpec(cfg *kubeadmapi.MasterConfiguration, podSpec *v1.PodSpec) { +func addNodeSelectorToPodSpec(podSpec *v1.PodSpec) { if podSpec.NodeSelector == nil { podSpec.NodeSelector = map[string]string{kubeadmconstants.LabelNodeRoleMaster: ""} return @@ -63,7 +75,7 @@ func addNodeSelectorToPodSpec(cfg *kubeadmapi.MasterConfiguration, podSpec *v1.P } // setMasterTolerationOnPodSpec makes the Pod tolerate the master taint -func setMasterTolerationOnPodSpec(cfg *kubeadmapi.MasterConfiguration, podSpec *v1.PodSpec) { +func setMasterTolerationOnPodSpec(podSpec *v1.PodSpec) { if podSpec.Tolerations == nil { podSpec.Tolerations = []v1.Toleration{kubeadmconstants.MasterToleration} return @@ -73,38 +85,68 @@ func setMasterTolerationOnPodSpec(cfg *kubeadmapi.MasterConfiguration, podSpec * } // setRightDNSPolicyOnPodSpec makes sure the self-hosted components can look up things via kube-dns if necessary -func setRightDNSPolicyOnPodSpec(cfg *kubeadmapi.MasterConfiguration, podSpec *v1.PodSpec) { +func setRightDNSPolicyOnPodSpec(podSpec *v1.PodSpec) { podSpec.DNSPolicy = v1.DNSClusterFirstWithHostNet } -// setVolumesOnKubeAPIServerPodSpec makes sure the self-hosted api server has the required files -func setVolumesOnKubeAPIServerPodSpec(cfg *kubeadmapi.MasterConfiguration, podSpec *v1.PodSpec) { - setK8sVolume(apiServerVolume, cfg, podSpec) - for _, c := range podSpec.Containers { - c.VolumeMounts = append(c.VolumeMounts, k8sSelfHostedVolumeMount()) +// setSelfHostedVolumesForAPIServer makes sure the self-hosted api server has the right volume source coming from a self-hosted cluster +func setSelfHostedVolumesForAPIServer(podSpec *v1.PodSpec) { + for i, v := range podSpec.Volumes { + // If the volume name matches the expected one; switch the volume source from hostPath to cluster-hosted + if v.Name == kubeadmconstants.KubeCertificatesVolumeName { + podSpec.Volumes[i].VolumeSource = apiServerCertificatesVolumeSource() + } } } -// setVolumesOnKubeControllerManagerPodSpec makes sure the self-hosted controller manager has the required files -func setVolumesOnKubeControllerManagerPodSpec(cfg *kubeadmapi.MasterConfiguration, podSpec *v1.PodSpec) { - setK8sVolume(controllerManagerVolume, cfg, podSpec) - for _, c := range podSpec.Containers { - c.VolumeMounts = append(c.VolumeMounts, k8sSelfHostedVolumeMount()) +// setSelfHostedVolumesForControllerManager makes sure the self-hosted controller manager has the right volume source coming from a self-hosted cluster +func setSelfHostedVolumesForControllerManager(podSpec *v1.PodSpec) { + for i, v := range podSpec.Volumes { + // If the volume name matches the expected one; switch the volume source from hostPath to cluster-hosted + if v.Name == kubeadmconstants.KubeCertificatesVolumeName { + podSpec.Volumes[i].VolumeSource = controllerManagerCertificatesVolumeSource() + } else if v.Name == kubeadmconstants.KubeConfigVolumeName { + podSpec.Volumes[i].VolumeSource = kubeConfigVolumeSource(kubeadmconstants.ControllerManagerKubeConfigFileName) + } } -} -// setVolumesOnKubeSchedulerPodSpec makes sure the self-hosted scheduler has the required files -func setVolumesOnKubeSchedulerPodSpec(cfg *kubeadmapi.MasterConfiguration, podSpec *v1.PodSpec) { - setK8sVolume(schedulerVolume, cfg, podSpec) - for _, c := range podSpec.Containers { - c.VolumeMounts = append(c.VolumeMounts, k8sSelfHostedVolumeMount()) + // Change directory for the kubeconfig directory to selfHostedKubeConfigDir + for i, vm := range podSpec.Containers[0].VolumeMounts { + if vm.Name == kubeadmconstants.KubeConfigVolumeName { + podSpec.Containers[0].VolumeMounts[i].MountPath = selfHostedKubeConfigDir + } } + + // Rewrite the --kubeconfig path as the volume mount path may not overlap with certs dir, which it does by default (/etc/kubernetes and /etc/kubernetes/pki) + // This is not a problem with hostPath mounts as hostPath supports mounting one file only, instead of always a full directory. Secrets and Projected Volumes + // don't support that. + podSpec.Containers[0].Command = kubeadmutil.ReplaceArgument(podSpec.Containers[0].Command, func(argMap map[string]string) map[string]string { + argMap["kubeconfig"] = filepath.Join(selfHostedKubeConfigDir, kubeadmconstants.ControllerManagerKubeConfigFileName) + return argMap + }) } -func setK8sVolume(cb func(cfg *kubeadmapi.MasterConfiguration) v1.Volume, cfg *kubeadmapi.MasterConfiguration, podSpec *v1.PodSpec) { +// setSelfHostedVolumesForScheduler makes sure the self-hosted scheduler has the right volume source coming from a self-hosted cluster +func setSelfHostedVolumesForScheduler(podSpec *v1.PodSpec) { for i, v := range podSpec.Volumes { - if v.Name == "k8s" { - podSpec.Volumes[i] = cb(cfg) + // If the volume name matches the expected one; switch the volume source from hostPath to cluster-hosted + if v.Name == kubeadmconstants.KubeConfigVolumeName { + podSpec.Volumes[i].VolumeSource = kubeConfigVolumeSource(kubeadmconstants.SchedulerKubeConfigFileName) } } + + // Change directory for the kubeconfig directory to selfHostedKubeConfigDir + for i, vm := range podSpec.Containers[0].VolumeMounts { + if vm.Name == kubeadmconstants.KubeConfigVolumeName { + podSpec.Containers[0].VolumeMounts[i].MountPath = selfHostedKubeConfigDir + } + } + + // Rewrite the --kubeconfig path as the volume mount path may not overlap with certs dir, which it does by default (/etc/kubernetes and /etc/kubernetes/pki) + // This is not a problem with hostPath mounts as hostPath supports mounting one file only, instead of always a full directory. Secrets and Projected Volumes + // don't support that. + podSpec.Containers[0].Command = kubeadmutil.ReplaceArgument(podSpec.Containers[0].Command, func(argMap map[string]string) map[string]string { + argMap["kubeconfig"] = filepath.Join(selfHostedKubeConfigDir, kubeadmconstants.SchedulerKubeConfigFileName) + return argMap + }) } diff --git a/cmd/kubeadm/app/phases/selfhosting/selfhosting.go b/cmd/kubeadm/app/phases/selfhosting/selfhosting.go index 454d6d928c517..0929aab5d992c 100644 --- a/cmd/kubeadm/app/phases/selfhosting/selfhosting.go +++ b/cmd/kubeadm/app/phases/selfhosting/selfhosting.go @@ -37,6 +37,9 @@ import ( const ( // selfHostingWaitTimeout describes the maximum amount of time a self-hosting wait process should wait before timing out selfHostingWaitTimeout = 2 * time.Minute + + // selfHostingFailureThreshold describes how many times kubeadm will retry creating the DaemonSets + selfHostingFailureThreshold uint8 = 5 ) // CreateSelfHostedControlPlane is responsible for turning a Static Pod-hosted control plane to a self-hosted one @@ -53,13 +56,23 @@ const ( // 9. Do that for the kube-apiserver, kube-controller-manager and kube-scheduler in a loop func CreateSelfHostedControlPlane(cfg *kubeadmapi.MasterConfiguration, client clientset.Interface) error { + // Here the map of different mutators to use for the control plane's podspec is stored + mutators := getDefaultMutators() + + // Some extra work to be done if we should store the control plane certificates in Secrets if features.Enabled(cfg.FeatureFlags, features.StoreCertsInSecrets) { - if err := createTLSSecrets(cfg, client); err != nil { + + // Upload the certificates and kubeconfig files from disk to the cluster as Secrets + if err := uploadTLSSecrets(client, cfg.CertificatesDir); err != nil { return err } - if err := createOpaqueSecrets(cfg, client); err != nil { + if err := uploadKubeConfigSecrets(client); err != nil { return err } + // Add the store-certs-in-secrets-specific mutators here so that the self-hosted component starts using them + mutators[kubeadmconstants.KubeAPIServer] = append(mutators[kubeadmconstants.KubeAPIServer], setSelfHostedVolumesForAPIServer) + mutators[kubeadmconstants.KubeControllerManager] = append(mutators[kubeadmconstants.KubeControllerManager], setSelfHostedVolumesForControllerManager) + mutators[kubeadmconstants.KubeScheduler] = append(mutators[kubeadmconstants.KubeScheduler], setSelfHostedVolumesForScheduler) } for _, componentName := range kubeadmconstants.MasterComponents { @@ -79,10 +92,12 @@ func CreateSelfHostedControlPlane(cfg *kubeadmapi.MasterConfiguration, client cl } // Build a DaemonSet object from the loaded PodSpec - ds := buildDaemonSet(cfg, componentName, podSpec) + ds := buildDaemonSet(componentName, podSpec, mutators) - // Create the DaemonSet in the API Server - if err := apiclient.CreateOrUpdateDaemonSet(client, ds); err != nil { + // Create or update the DaemonSet in the API Server, and retry selfHostingFailureThreshold times if it errors out + if err := apiclient.TryRunCommand(func() error { + return apiclient.CreateOrUpdateDaemonSet(client, ds) + }, selfHostingFailureThreshold); err != nil { return err } @@ -115,10 +130,10 @@ func CreateSelfHostedControlPlane(cfg *kubeadmapi.MasterConfiguration, client cl } // buildDaemonSet is responsible for mutating the PodSpec and return a DaemonSet which is suitable for the self-hosting purporse -func buildDaemonSet(cfg *kubeadmapi.MasterConfiguration, name string, podSpec *v1.PodSpec) *extensions.DaemonSet { +func buildDaemonSet(name string, podSpec *v1.PodSpec, mutators map[string][]PodSpecMutatorFunc) *extensions.DaemonSet { // Mutate the PodSpec so it's suitable for self-hosting - mutatePodSpec(cfg, name, podSpec) + mutatePodSpec(mutators, name, podSpec) // Return a DaemonSet based on that Spec return &extensions.DaemonSet{ diff --git a/cmd/kubeadm/app/phases/selfhosting/selfhosting_volumes.go b/cmd/kubeadm/app/phases/selfhosting/selfhosting_volumes.go index 4c5c7f37db90d..015e7c24682f1 100644 --- a/cmd/kubeadm/app/phases/selfhosting/selfhosting_volumes.go +++ b/cmd/kubeadm/app/phases/selfhosting/selfhosting_volumes.go @@ -24,14 +24,8 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" - kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" - "k8s.io/kubernetes/cmd/kubeadm/app/cmd/features" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" -) - -const ( - volumeName = "k8s" - volumeMountName = "k8s" + "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" ) type tlsKeyPair struct { @@ -40,234 +34,164 @@ type tlsKeyPair struct { key string } -func k8sSelfHostedVolumeMount() v1.VolumeMount { - return v1.VolumeMount{ - Name: volumeMountName, - MountPath: kubeadmconstants.KubernetesDir, - ReadOnly: true, - } -} - -func apiServerVolume(cfg *kubeadmapi.MasterConfiguration) v1.Volume { - var volumeSource v1.VolumeSource - if features.Enabled(cfg.FeatureFlags, features.StoreCertsInSecrets) { - volumeSource = v1.VolumeSource{ - Projected: &v1.ProjectedVolumeSource{ - Sources: []v1.VolumeProjection{ - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.CACertAndKeyBaseName, - }, - Items: []v1.KeyToPath{ - { - Key: v1.TLSCertKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.CACertName), - }, - { - Key: v1.TLSPrivateKeyKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.CAKeyName), - }, - }, +func apiServerCertificatesVolumeSource() v1.VolumeSource { + return v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: kubeadmconstants.CACertAndKeyBaseName, }, - }, - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.APIServerCertAndKeyBaseName, - }, - Items: []v1.KeyToPath{ - { - Key: v1.TLSCertKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.APIServerCertName), - }, - { - Key: v1.TLSPrivateKeyKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.APIServerKeyName), - }, + Items: []v1.KeyToPath{ + { + Key: v1.TLSCertKey, + Path: kubeadmconstants.CACertName, }, }, }, - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.APIServerKubeletClientCertAndKeyBaseName, + }, + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: kubeadmconstants.APIServerCertAndKeyBaseName, + }, + Items: []v1.KeyToPath{ + { + Key: v1.TLSCertKey, + Path: kubeadmconstants.APIServerCertName, }, - Items: []v1.KeyToPath{ - { - Key: v1.TLSCertKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.APIServerKubeletClientCertName), - }, - { - Key: v1.TLSPrivateKeyKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.APIServerKubeletClientKeyName), - }, + { + Key: v1.TLSPrivateKeyKey, + Path: kubeadmconstants.APIServerKeyName, }, }, }, - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.ServiceAccountKeyBaseName, + }, + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: kubeadmconstants.APIServerKubeletClientCertAndKeyBaseName, + }, + Items: []v1.KeyToPath{ + { + Key: v1.TLSCertKey, + Path: kubeadmconstants.APIServerKubeletClientCertName, }, - Items: []v1.KeyToPath{ - { - Key: v1.TLSCertKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.ServiceAccountPublicKeyName), - }, - { - Key: v1.TLSPrivateKeyKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.ServiceAccountPrivateKeyName), - }, + { + Key: v1.TLSPrivateKeyKey, + Path: kubeadmconstants.APIServerKubeletClientKeyName, }, }, }, - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.FrontProxyCACertAndKeyBaseName, - }, - Items: []v1.KeyToPath{ - { - Key: v1.TLSCertKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.FrontProxyCACertName), - }, + }, + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: kubeadmconstants.ServiceAccountKeyBaseName, + }, + Items: []v1.KeyToPath{ + { + Key: v1.TLSCertKey, + Path: kubeadmconstants.ServiceAccountPublicKeyName, }, }, }, - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.FrontProxyClientCertAndKeyBaseName, - }, - Items: []v1.KeyToPath{ - { - Key: v1.TLSCertKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.FrontProxyClientCertName), - }, - { - Key: v1.TLSPrivateKeyKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.FrontProxyClientKeyName), - }, + }, + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: kubeadmconstants.FrontProxyCACertAndKeyBaseName, + }, + Items: []v1.KeyToPath{ + { + Key: v1.TLSCertKey, + Path: kubeadmconstants.FrontProxyCACertName, }, }, }, }, - }, - } - } else { - volumeSource = v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{ - Path: kubeadmconstants.KubernetesDir, - }, - } - } - return v1.Volume{ - Name: volumeName, - VolumeSource: volumeSource, - } -} - -func schedulerVolume(cfg *kubeadmapi.MasterConfiguration) v1.Volume { - var volumeSource v1.VolumeSource - if features.Enabled(cfg.FeatureFlags, features.StoreCertsInSecrets) { - volumeSource = v1.VolumeSource{ - Projected: &v1.ProjectedVolumeSource{ - Sources: []v1.VolumeProjection{ - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.SchedulerKubeConfigFileName, + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: kubeadmconstants.FrontProxyClientCertAndKeyBaseName, + }, + Items: []v1.KeyToPath{ + { + Key: v1.TLSCertKey, + Path: kubeadmconstants.FrontProxyClientCertName, + }, + { + Key: v1.TLSPrivateKeyKey, + Path: kubeadmconstants.FrontProxyClientKeyName, }, }, }, }, }, - } - } else { - volumeSource = v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{ - Path: kubeadmconstants.KubernetesDir, - }, - } - } - return v1.Volume{ - Name: volumeName, - VolumeSource: volumeSource, + }, } } -func controllerManagerVolume(cfg *kubeadmapi.MasterConfiguration) v1.Volume { - var volumeSource v1.VolumeSource - if features.Enabled(cfg.FeatureFlags, features.StoreCertsInSecrets) { - volumeSource = v1.VolumeSource{ - Projected: &v1.ProjectedVolumeSource{ - Sources: []v1.VolumeProjection{ - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.ControllerManagerKubeConfigFileName, - }, +func controllerManagerCertificatesVolumeSource() v1.VolumeSource { + return v1.VolumeSource{ + Projected: &v1.ProjectedVolumeSource{ + Sources: []v1.VolumeProjection{ + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: kubeadmconstants.CACertAndKeyBaseName, }, - }, - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.CACertAndKeyBaseName, + Items: []v1.KeyToPath{ + { + Key: v1.TLSCertKey, + Path: kubeadmconstants.CACertName, }, - Items: []v1.KeyToPath{ - { - Key: v1.TLSCertKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.CACertName), - }, - { - Key: v1.TLSPrivateKeyKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.CAKeyName), - }, + { + Key: v1.TLSPrivateKeyKey, + Path: kubeadmconstants.CAKeyName, }, }, }, - { - Secret: &v1.SecretProjection{ - LocalObjectReference: v1.LocalObjectReference{ - Name: kubeadmconstants.ServiceAccountKeyBaseName, - }, - Items: []v1.KeyToPath{ - { - Key: v1.TLSPrivateKeyKey, - Path: path.Join(path.Base(cfg.CertificatesDir), kubeadmconstants.ServiceAccountPrivateKeyName), - }, + }, + { + Secret: &v1.SecretProjection{ + LocalObjectReference: v1.LocalObjectReference{ + Name: kubeadmconstants.ServiceAccountKeyBaseName, + }, + Items: []v1.KeyToPath{ + { + Key: v1.TLSPrivateKeyKey, + Path: kubeadmconstants.ServiceAccountPrivateKeyName, }, }, }, }, }, - } - } else { - volumeSource = v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{ - Path: kubeadmconstants.KubernetesDir, - }, - } + }, } - return v1.Volume{ - Name: volumeName, - VolumeSource: volumeSource, +} + +func kubeConfigVolumeSource(kubeconfigSecretName string) v1.VolumeSource { + return v1.VolumeSource{ + Secret: &v1.SecretVolumeSource{ + SecretName: kubeconfigSecretName, + }, } } -func createTLSSecrets(cfg *kubeadmapi.MasterConfiguration, client clientset.Interface) error { +func uploadTLSSecrets(client clientset.Interface, certDir string) error { for _, tlsKeyPair := range getTLSKeyPairs() { secret, err := createTLSSecretFromFiles( tlsKeyPair.name, - path.Join(cfg.CertificatesDir, tlsKeyPair.cert), - path.Join(cfg.CertificatesDir, tlsKeyPair.key), + path.Join(certDir, tlsKeyPair.cert), + path.Join(certDir, tlsKeyPair.key), ) if err != nil { return err } - if _, err := client.CoreV1().Secrets(metav1.NamespaceSystem).Create(secret); err != nil { + if err := apiclient.CreateOrUpdateSecret(client, secret); err != nil { return err } fmt.Printf("[self-hosted] Created TLS secret %q from %s and %s\n", tlsKeyPair.name, tlsKeyPair.cert, tlsKeyPair.key) @@ -276,24 +200,22 @@ func createTLSSecrets(cfg *kubeadmapi.MasterConfiguration, client clientset.Inte return nil } -func createOpaqueSecrets(cfg *kubeadmapi.MasterConfiguration, client clientset.Interface) error { +func uploadKubeConfigSecrets(client clientset.Interface) error { files := []string{ kubeadmconstants.SchedulerKubeConfigFileName, kubeadmconstants.ControllerManagerKubeConfigFileName, } for _, file := range files { - secret, err := createOpaqueSecretFromFile( - file, - path.Join(kubeadmconstants.KubernetesDir, file), - ) + kubeConfigPath := path.Join(kubeadmconstants.KubernetesDir, file) + secret, err := createOpaqueSecretFromFile(file, kubeConfigPath) if err != nil { return err } - if _, err := client.CoreV1().Secrets(metav1.NamespaceSystem).Create(secret); err != nil { + if err := apiclient.CreateOrUpdateSecret(client, secret); err != nil { return err } - fmt.Printf("[self-hosted] Created secret %q\n", file) + fmt.Printf("[self-hosted] Created secret for kubeconfig file %q\n", file) } return nil diff --git a/cmd/kubeadm/app/util/apiclient/idempotency.go b/cmd/kubeadm/app/util/apiclient/idempotency.go index ecae7d87c9566..ae5886bf4d39c 100644 --- a/cmd/kubeadm/app/util/apiclient/idempotency.go +++ b/cmd/kubeadm/app/util/apiclient/idempotency.go @@ -43,6 +43,20 @@ func CreateOrUpdateConfigMap(client clientset.Interface, cm *v1.ConfigMap) error return nil } +// CreateOrUpdateSecret creates a Secret if the target resource doesn't exist. If the resource exists already, this function will update the resource instead. +func CreateOrUpdateSecret(client clientset.Interface, secret *v1.Secret) error { + if _, err := client.CoreV1().Secrets(secret.ObjectMeta.Namespace).Create(secret); err != nil { + if !apierrors.IsAlreadyExists(err) { + return fmt.Errorf("unable to create secret: %v", err) + } + + if _, err := client.CoreV1().Secrets(secret.ObjectMeta.Namespace).Update(secret); err != nil { + return fmt.Errorf("unable to update secret: %v", err) + } + } + return nil +} + // CreateOrUpdateServiceAccount creates a ServiceAccount if the target resource doesn't exist. If the resource exists already, this function will update the resource instead. func CreateOrUpdateServiceAccount(client clientset.Interface, sa *v1.ServiceAccount) error { if _, err := client.CoreV1().ServiceAccounts(sa.ObjectMeta.Namespace).Create(sa); err != nil { diff --git a/cmd/kubeadm/app/util/apiclient/wait.go b/cmd/kubeadm/app/util/apiclient/wait.go index 93629a8caaf8b..d964d5aab9c40 100644 --- a/cmd/kubeadm/app/util/apiclient/wait.go +++ b/cmd/kubeadm/app/util/apiclient/wait.go @@ -88,3 +88,22 @@ func WaitForStaticPodToDisappear(client clientset.Interface, timeout time.Durati return false, nil }) } + +// TryRunCommand runs a function a maximum of failureThreshold times, and retries on error. If failureThreshold is hit; the last error is returned +func TryRunCommand(f func() error, failureThreshold uint8) error { + var numFailures uint8 + return wait.PollImmediate(5*time.Second, 20*time.Minute, func() (bool, error) { + err := f() + if err != nil { + numFailures++ + // If we've reached the maximum amount of failures, error out + if numFailures == failureThreshold { + return false, err + } + // Retry + return false, nil + } + // The last f() call was a success! + return true, nil + }) +} diff --git a/cmd/kubeadm/app/util/arguments.go b/cmd/kubeadm/app/util/arguments.go new file mode 100644 index 0000000000000..323b2da944cce --- /dev/null +++ b/cmd/kubeadm/app/util/arguments.go @@ -0,0 +1,96 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "fmt" + "strings" +) + +// BuildArgumentListFromMap takes two string-string maps, one with the base arguments and one with optional override arguments +func BuildArgumentListFromMap(baseArguments map[string]string, overrideArguments map[string]string) []string { + var command []string + for k, v := range overrideArguments { + // values of "" are allowed as well + command = append(command, fmt.Sprintf("--%s=%s", k, v)) + } + for k, v := range baseArguments { + if _, overrideExists := overrideArguments[k]; !overrideExists { + command = append(command, fmt.Sprintf("--%s=%s", k, v)) + } + } + return command +} + +// ParseArgumentListToMap parses a CLI argument list in the form "--foo=bar" to a string-string map +func ParseArgumentListToMap(arguments []string) map[string]string { + resultingMap := map[string]string{} + for i, arg := range arguments { + key, val, err := parseArgument(arg) + + // Ignore if the first argument doesn't satisfy the criteria, it's most often the binary name + // Warn in all other cases, but don't error out. This can happen only if the user has edited the argument list by hand, so they might know what they are doing + if err != nil { + if i != 0 { + fmt.Printf("[kubeadm] WARNING: The component argument %q could not be parsed correctly. The argument must be of the form %q. Skipping...", arg, "--") + } + continue + } + + resultingMap[key] = val + } + return resultingMap +} + +// ReplaceArgument gets a command list; converts it to a map for easier modification, runs the provided function that +// returns a new modified map, and then converts the map back to a command string slice +func ReplaceArgument(command []string, argMutateFunc func(map[string]string) map[string]string) []string { + argMap := ParseArgumentListToMap(command) + + // Save the first command (the executable) if we're sure it's not an argument (i.e. no --) + var newCommand []string + if len(command) > 0 && !strings.HasPrefix(command[0], "--") { + newCommand = append(newCommand, command[0]) + } + newArgMap := argMutateFunc(argMap) + newCommand = append(newCommand, BuildArgumentListFromMap(newArgMap, map[string]string{})...) + return newCommand +} + +// parseArgument parses the argument "--foo=bar" to "foo" and "bar" +func parseArgument(arg string) (string, string, error) { + if !strings.HasPrefix(arg, "--") { + return "", "", fmt.Errorf("the argument should start with '--'") + } + if !strings.Contains(arg, "=") { + return "", "", fmt.Errorf("the argument should have a '=' between the flag and the value") + } + // Remove the starting -- + arg = strings.TrimPrefix(arg, "--") + // Split the string on =. Return only two substrings, since we want only key/value, but the value can include '=' as well + keyvalSlice := strings.SplitN(arg, "=", 2) + + // Make sure both a key and value is present + if len(keyvalSlice) != 2 { + return "", "", fmt.Errorf("the argument must have both a key and a value") + } + if len(keyvalSlice[0]) == 0 { + return "", "", fmt.Errorf("the argument must have a key") + } + + return keyvalSlice[0], keyvalSlice[1], nil +} From 21eeb5c925e82c74b4966498abd3b449ff3156e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Sat, 19 Aug 2017 00:45:49 +0300 Subject: [PATCH 125/403] kubeadm: Adding unit tests for newly added funcs --- .../selfhosting/podspec_mutation_test.go | 284 +++++++++++++- .../phases/selfhosting/selfhosting_test.go | 364 ++++++------------ cmd/kubeadm/app/util/arguments_test.go | 341 ++++++++++++++++ 3 files changed, 742 insertions(+), 247 deletions(-) create mode 100644 cmd/kubeadm/app/util/arguments_test.go diff --git a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go index 9b2ce07b38b6b..60dacbfab83d0 100644 --- a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go +++ b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go @@ -18,10 +18,10 @@ package selfhosting import ( "reflect" + "sort" "testing" "k8s.io/api/core/v1" - kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" ) @@ -72,9 +72,8 @@ func TestMutatePodSpec(t *testing.T) { }, } - cfg := &kubeadmapi.MasterConfiguration{} for _, rt := range tests { - mutatePodSpec(cfg, rt.component, rt.podSpec) + mutatePodSpec(getDefaultMutators(), rt.component, rt.podSpec) if !reflect.DeepEqual(*rt.podSpec, rt.expected) { t.Errorf("failed mutatePodSpec:\nexpected:\n%v\nsaw:\n%v", rt.expected, *rt.podSpec) @@ -110,9 +109,8 @@ func TestAddNodeSelectorToPodSpec(t *testing.T) { }, } - cfg := &kubeadmapi.MasterConfiguration{} for _, rt := range tests { - addNodeSelectorToPodSpec(cfg, rt.podSpec) + addNodeSelectorToPodSpec(rt.podSpec) if !reflect.DeepEqual(*rt.podSpec, rt.expected) { t.Errorf("failed addNodeSelectorToPodSpec:\nexpected:\n%v\nsaw:\n%v", rt.expected, *rt.podSpec) @@ -148,9 +146,8 @@ func TestSetMasterTolerationOnPodSpec(t *testing.T) { }, } - cfg := &kubeadmapi.MasterConfiguration{} for _, rt := range tests { - setMasterTolerationOnPodSpec(cfg, rt.podSpec) + setMasterTolerationOnPodSpec(rt.podSpec) if !reflect.DeepEqual(*rt.podSpec, rt.expected) { t.Errorf("failed setMasterTolerationOnPodSpec:\nexpected:\n%v\nsaw:\n%v", rt.expected, *rt.podSpec) @@ -179,12 +176,281 @@ func TestSetRightDNSPolicyOnPodSpec(t *testing.T) { }, } - cfg := &kubeadmapi.MasterConfiguration{} for _, rt := range tests { - setRightDNSPolicyOnPodSpec(cfg, rt.podSpec) + setRightDNSPolicyOnPodSpec(rt.podSpec) if !reflect.DeepEqual(*rt.podSpec, rt.expected) { t.Errorf("failed setRightDNSPolicyOnPodSpec:\nexpected:\n%v\nsaw:\n%v", rt.expected, *rt.podSpec) } } } + +func TestSetSelfHostedVolumesForAPIServer(t *testing.T) { + var tests = []struct { + podSpec *v1.PodSpec + expected v1.PodSpec + }{ + { + podSpec: &v1.PodSpec{ + Containers: []v1.Container{ + { + VolumeMounts: []v1.VolumeMount{ + { + Name: "ca-certs", + MountPath: "/etc/ssl/certs", + }, + { + Name: "k8s-certs", + MountPath: "/etc/kubernetes/pki", + }, + }, + Command: []string{ + "--foo=bar", + }, + }, + }, + Volumes: []v1.Volume{ + { + Name: "ca-certs", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/ssl/certs", + }, + }, + }, + { + Name: "k8s-certs", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/kubernetes/pki", + }, + }, + }, + }, + }, + expected: v1.PodSpec{ + Containers: []v1.Container{ + { + VolumeMounts: []v1.VolumeMount{ + { + Name: "ca-certs", + MountPath: "/etc/ssl/certs", + }, + { + Name: "k8s-certs", + MountPath: "/etc/kubernetes/pki", + }, + }, + Command: []string{ + "--foo=bar", + }, + }, + }, + Volumes: []v1.Volume{ + { + Name: "ca-certs", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/ssl/certs", + }, + }, + }, + { + Name: "k8s-certs", + VolumeSource: apiServerCertificatesVolumeSource(), + }, + }, + }, + }, + } + + for _, rt := range tests { + setSelfHostedVolumesForAPIServer(rt.podSpec) + sort.Strings(rt.podSpec.Containers[0].Command) + sort.Strings(rt.expected.Containers[0].Command) + + if !reflect.DeepEqual(*rt.podSpec, rt.expected) { + t.Errorf("failed setSelfHostedVolumesForAPIServer:\nexpected:\n%v\nsaw:\n%v", rt.expected, *rt.podSpec) + } + } +} + +func TestSetSelfHostedVolumesForControllerManager(t *testing.T) { + var tests = []struct { + podSpec *v1.PodSpec + expected v1.PodSpec + }{ + { + podSpec: &v1.PodSpec{ + Containers: []v1.Container{ + { + VolumeMounts: []v1.VolumeMount{ + { + Name: "ca-certs", + MountPath: "/etc/ssl/certs", + }, + { + Name: "k8s-certs", + MountPath: "/etc/kubernetes/pki", + }, + { + Name: "kubeconfig", + MountPath: "/etc/kubernetes/controller-manager.conf", + }, + }, + Command: []string{ + "--kubeconfig=/etc/kubernetes/controller-manager.conf", + "--foo=bar", + }, + }, + }, + Volumes: []v1.Volume{ + { + Name: "ca-certs", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/ssl/certs", + }, + }, + }, + { + Name: "k8s-certs", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/kubernetes/pki", + }, + }, + }, + { + Name: "kubeconfig", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/kubernetes/controller-manager.conf", + }, + }, + }, + }, + }, + expected: v1.PodSpec{ + Containers: []v1.Container{ + { + VolumeMounts: []v1.VolumeMount{ + { + Name: "ca-certs", + MountPath: "/etc/ssl/certs", + }, + { + Name: "k8s-certs", + MountPath: "/etc/kubernetes/pki", + }, + { + Name: "kubeconfig", + MountPath: "/etc/kubernetes/kubeconfig", + }, + }, + Command: []string{ + "--kubeconfig=/etc/kubernetes/kubeconfig/controller-manager.conf", + "--foo=bar", + }, + }, + }, + Volumes: []v1.Volume{ + { + Name: "ca-certs", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/ssl/certs", + }, + }, + }, + { + Name: "k8s-certs", + VolumeSource: controllerManagerCertificatesVolumeSource(), + }, + { + Name: "kubeconfig", + VolumeSource: kubeConfigVolumeSource(kubeadmconstants.ControllerManagerKubeConfigFileName), + }, + }, + }, + }, + } + + for _, rt := range tests { + setSelfHostedVolumesForControllerManager(rt.podSpec) + sort.Strings(rt.podSpec.Containers[0].Command) + sort.Strings(rt.expected.Containers[0].Command) + + if !reflect.DeepEqual(*rt.podSpec, rt.expected) { + t.Errorf("failed setSelfHostedVolumesForControllerManager:\nexpected:\n%v\nsaw:\n%v", rt.expected, *rt.podSpec) + } + } +} + +func TestSetSelfHostedVolumesForScheduler(t *testing.T) { + var tests = []struct { + podSpec *v1.PodSpec + expected v1.PodSpec + }{ + { + podSpec: &v1.PodSpec{ + Containers: []v1.Container{ + { + VolumeMounts: []v1.VolumeMount{ + { + Name: "kubeconfig", + MountPath: "/etc/kubernetes/scheduler.conf", + }, + }, + Command: []string{ + "--kubeconfig=/etc/kubernetes/scheduler.conf", + "--foo=bar", + }, + }, + }, + Volumes: []v1.Volume{ + { + Name: "kubeconfig", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/kubernetes/scheduler.conf", + }, + }, + }, + }, + }, + expected: v1.PodSpec{ + Containers: []v1.Container{ + { + VolumeMounts: []v1.VolumeMount{ + { + Name: "kubeconfig", + MountPath: "/etc/kubernetes/kubeconfig", + }, + }, + Command: []string{ + "--kubeconfig=/etc/kubernetes/kubeconfig/scheduler.conf", + "--foo=bar", + }, + }, + }, + Volumes: []v1.Volume{ + { + Name: "kubeconfig", + VolumeSource: kubeConfigVolumeSource(kubeadmconstants.SchedulerKubeConfigFileName), + }, + }, + }, + }, + } + + for _, rt := range tests { + setSelfHostedVolumesForScheduler(rt.podSpec) + sort.Strings(rt.podSpec.Containers[0].Command) + sort.Strings(rt.expected.Containers[0].Command) + + if !reflect.DeepEqual(*rt.podSpec, rt.expected) { + t.Errorf("failed setSelfHostedVolumesForScheduler:\nexpected:\n%v\nsaw:\n%v", rt.expected, *rt.podSpec) + } + } +} diff --git a/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go b/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go index 0a1afc69b7f55..aa73f012731b3 100644 --- a/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go +++ b/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go @@ -21,88 +21,13 @@ import ( "fmt" "io/ioutil" "os" - "strings" "testing" "github.com/ghodss/yaml" - kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" - "k8s.io/kubernetes/cmd/kubeadm/app/cmd/features" - kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" ) const ( - apiProjectedSecret = `- name: k8s - projected: - sources: - - secret: - items: - - key: tls.crt - path: ca.crt - - key: tls.key - path: ca.key - name: ca - - secret: - items: - - key: tls.crt - path: apiserver.crt - - key: tls.key - path: apiserver.key - name: apiserver - - secret: - items: - - key: tls.crt - path: apiserver-kubelet-client.crt - - key: tls.key - path: apiserver-kubelet-client.key - name: apiserver-kubelet-client - - secret: - items: - - key: tls.crt - path: sa.pub - - key: tls.key - path: sa.key - name: sa - - secret: - items: - - key: tls.crt - path: front-proxy-ca.crt - name: front-proxy-ca - - secret: - items: - - key: tls.crt - path: front-proxy-client.crt - - key: tls.key - path: front-proxy-client.key - name: front-proxy-client` - - controllerManagerProjectedSecret = `- name: k8s - projected: - sources: - - secret: - name: controller-manager.conf - - secret: - items: - - key: tls.crt - path: ca.crt - - key: tls.key - path: ca.key - name: ca - - secret: - items: - - key: tls.key - path: sa.key - name: sa` - - schedulerProjectedSecret = `- name: k8s - projected: - sources: - - secret: - name: scheduler.conf` - - hostPathVol = `- hostPath: - path: /etc/kubernetes - name: k8s` - testAPIServerPod = ` apiVersion: v1 kind: Pod @@ -110,39 +35,36 @@ metadata: annotations: scheduler.alpha.kubernetes.io/critical-pod: "" creationTimestamp: null - labels: - component: kube-apiserver - tier: control-plane name: kube-apiserver namespace: kube-system spec: containers: - command: - kube-apiserver - - --client-ca-file=/etc/kubernetes/pki/ca.crt - - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key - - --allow-privileged=true - - --service-cluster-ip-range=10.96.0.0/12 - --service-account-key-file=/etc/kubernetes/pki/sa.pub + - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key + - --secure-port=6443 + - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt + - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname + - --requestheader-group-headers=X-Remote-Group + - --service-cluster-ip-range=10.96.0.0/12 - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt - - --secure-port=6443 + - --advertise-address=192.168.1.115 + - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt - --insecure-port=0 - - --admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota - - --requestheader-extra-headers-prefix=X-Remote-Extra- - - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt - --experimental-bootstrap-token-auth=true - - --requestheader-group-headers=X-Remote-Group + - --requestheader-username-headers=X-Remote-User + - --requestheader-extra-headers-prefix=X-Remote-Extra- - --requestheader-allowed-names=front-proxy-client - - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key - - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt + - --admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota + - --allow-privileged=true + - --client-ca-file=/etc/kubernetes/pki/ca.crt + - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key - - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname - - --requestheader-username-headers=X-Remote-User - --authorization-mode=Node,RBAC - - --advertise-address=192.168.200.101 - --etcd-servers=http://127.0.0.1:2379 - image: gcr.io/google_containers/kube-apiserver-amd64:v1.7.0 + image: gcr.io/google_containers/kube-apiserver-amd64:v1.7.4 livenessProbe: failureThreshold: 8 httpGet: @@ -157,22 +79,26 @@ spec: requests: cpu: 250m volumeMounts: - - mountPath: /etc/kubernetes - name: k8s + - mountPath: /etc/kubernetes/pki + name: k8s-certs readOnly: true - mountPath: /etc/ssl/certs - name: certs + name: ca-certs + readOnly: true - mountPath: /etc/pki - name: pki + name: ca-certs-etc-pki + readOnly: true hostNetwork: true volumes: - %s + - hostPath: + path: /etc/kubernetes/pki + name: k8s-certs - hostPath: path: /etc/ssl/certs - name: certs + name: ca-certs - hostPath: path: /etc/pki - name: pki + name: ca-certs-etc-pki status: {} ` @@ -192,30 +118,30 @@ spec: containers: - command: - kube-apiserver - - --client-ca-file=/etc/kubernetes/pki/ca.crt - - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key - - --allow-privileged=true - - --service-cluster-ip-range=10.96.0.0/12 - --service-account-key-file=/etc/kubernetes/pki/sa.pub + - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key + - --secure-port=6443 + - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt + - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname + - --requestheader-group-headers=X-Remote-Group + - --service-cluster-ip-range=10.96.0.0/12 - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt - - --secure-port=6443 + - --advertise-address=192.168.1.115 + - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt - --insecure-port=0 - - --admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota - - --requestheader-extra-headers-prefix=X-Remote-Extra- - - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt - --experimental-bootstrap-token-auth=true - - --requestheader-group-headers=X-Remote-Group + - --requestheader-username-headers=X-Remote-User + - --requestheader-extra-headers-prefix=X-Remote-Extra- - --requestheader-allowed-names=front-proxy-client - - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key - - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt + - --admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota + - --allow-privileged=true + - --client-ca-file=/etc/kubernetes/pki/ca.crt + - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key - - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname - - --requestheader-username-headers=X-Remote-User - --authorization-mode=Node,RBAC - - --advertise-address=192.168.200.101 - --etcd-servers=http://127.0.0.1:2379 - image: gcr.io/google_containers/kube-apiserver-amd64:v1.7.0 + image: gcr.io/google_containers/kube-apiserver-amd64:v1.7.4 livenessProbe: failureThreshold: 8 httpGet: @@ -230,13 +156,15 @@ spec: requests: cpu: 250m volumeMounts: - - mountPath: /etc/kubernetes - name: k8s + - mountPath: /etc/kubernetes/pki + name: k8s-certs readOnly: true - mountPath: /etc/ssl/certs - name: certs + name: ca-certs + readOnly: true - mountPath: /etc/pki - name: pki + name: ca-certs-etc-pki + readOnly: true dnsPolicy: ClusterFirstWithHostNet hostNetwork: true nodeSelector: @@ -245,13 +173,15 @@ spec: - effect: NoSchedule key: node-role.kubernetes.io/master volumes: - %s + - hostPath: + path: /etc/kubernetes/pki + name: k8s-certs - hostPath: path: /etc/ssl/certs - name: certs + name: ca-certs - hostPath: path: /etc/pki - name: pki + name: ca-certs-etc-pki updateStrategy: {} status: currentNumberScheduled: 0 @@ -267,25 +197,22 @@ metadata: annotations: scheduler.alpha.kubernetes.io/critical-pod: "" creationTimestamp: null - labels: - component: kube-controller-manager - tier: control-plane name: kube-controller-manager namespace: kube-system spec: containers: - command: - kube-controller-manager - - --service-account-private-key-file=/etc/kubernetes/pki/sa.key - - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt - - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key - --leader-elect=true - - --kubeconfig=/etc/kubernetes/controller-manager.conf - --controllers=*,bootstrapsigner,tokencleaner + - --kubeconfig=/etc/kubernetes/controller-manager.conf - --root-ca-file=/etc/kubernetes/pki/ca.crt + - --service-account-private-key-file=/etc/kubernetes/pki/sa.key + - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt + - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key - --address=127.0.0.1 - --use-service-account-credentials=true - image: gcr.io/google_containers/kube-controller-manager-amd64:v1.7.0 + image: gcr.io/google_containers/kube-controller-manager-amd64:v1.7.4 livenessProbe: failureThreshold: 8 httpGet: @@ -300,22 +227,32 @@ spec: requests: cpu: 200m volumeMounts: - - mountPath: /etc/kubernetes - name: k8s + - mountPath: /etc/kubernetes/pki + name: k8s-certs readOnly: true - mountPath: /etc/ssl/certs - name: certs + name: ca-certs + readOnly: true + - mountPath: /etc/kubernetes/controller-manager.conf + name: kubeconfig + readOnly: true - mountPath: /etc/pki - name: pki + name: ca-certs-etc-pki + readOnly: true hostNetwork: true volumes: - %s + - hostPath: + path: /etc/kubernetes/pki + name: k8s-certs - hostPath: path: /etc/ssl/certs - name: certs + name: ca-certs + - hostPath: + path: /etc/kubernetes/controller-manager.conf + name: kubeconfig - hostPath: path: /etc/pki - name: pki + name: ca-certs-etc-pki status: {} ` @@ -335,16 +272,16 @@ spec: containers: - command: - kube-controller-manager - - --service-account-private-key-file=/etc/kubernetes/pki/sa.key - - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt - - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key - --leader-elect=true - - --kubeconfig=/etc/kubernetes/controller-manager.conf - --controllers=*,bootstrapsigner,tokencleaner + - --kubeconfig=/etc/kubernetes/controller-manager.conf - --root-ca-file=/etc/kubernetes/pki/ca.crt + - --service-account-private-key-file=/etc/kubernetes/pki/sa.key + - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt + - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key - --address=127.0.0.1 - --use-service-account-credentials=true - image: gcr.io/google_containers/kube-controller-manager-amd64:v1.7.0 + image: gcr.io/google_containers/kube-controller-manager-amd64:v1.7.4 livenessProbe: failureThreshold: 8 httpGet: @@ -359,13 +296,18 @@ spec: requests: cpu: 200m volumeMounts: - - mountPath: /etc/kubernetes - name: k8s + - mountPath: /etc/kubernetes/pki + name: k8s-certs readOnly: true - mountPath: /etc/ssl/certs - name: certs + name: ca-certs + readOnly: true + - mountPath: /etc/kubernetes/controller-manager.conf + name: kubeconfig + readOnly: true - mountPath: /etc/pki - name: pki + name: ca-certs-etc-pki + readOnly: true dnsPolicy: ClusterFirstWithHostNet hostNetwork: true nodeSelector: @@ -374,13 +316,18 @@ spec: - effect: NoSchedule key: node-role.kubernetes.io/master volumes: - %s + - hostPath: + path: /etc/kubernetes/pki + name: k8s-certs - hostPath: path: /etc/ssl/certs - name: certs + name: ca-certs + - hostPath: + path: /etc/kubernetes/controller-manager.conf + name: kubeconfig - hostPath: path: /etc/pki - name: pki + name: ca-certs-etc-pki updateStrategy: {} status: currentNumberScheduled: 0 @@ -396,19 +343,16 @@ metadata: annotations: scheduler.alpha.kubernetes.io/critical-pod: "" creationTimestamp: null - labels: - component: kube-scheduler - tier: control-plane name: kube-scheduler namespace: kube-system spec: containers: - command: - kube-scheduler - - --address=127.0.0.1 - --leader-elect=true - --kubeconfig=/etc/kubernetes/scheduler.conf - image: gcr.io/google_containers/kube-scheduler-amd64:v1.7.0 + - --address=127.0.0.1 + image: gcr.io/google_containers/kube-scheduler-amd64:v1.7.4 livenessProbe: failureThreshold: 8 httpGet: @@ -423,12 +367,14 @@ spec: requests: cpu: 100m volumeMounts: - - mountPath: /etc/kubernetes - name: k8s + - mountPath: /etc/kubernetes/scheduler.conf + name: kubeconfig readOnly: true hostNetwork: true volumes: - %s + - hostPath: + path: /etc/kubernetes/scheduler.conf + name: kubeconfig status: {} ` @@ -448,10 +394,10 @@ spec: containers: - command: - kube-scheduler - - --address=127.0.0.1 - --leader-elect=true - --kubeconfig=/etc/kubernetes/scheduler.conf - image: gcr.io/google_containers/kube-scheduler-amd64:v1.7.0 + - --address=127.0.0.1 + image: gcr.io/google_containers/kube-scheduler-amd64:v1.7.4 livenessProbe: failureThreshold: 8 httpGet: @@ -466,8 +412,8 @@ spec: requests: cpu: 100m volumeMounts: - - mountPath: /etc/kubernetes - name: k8s + - mountPath: /etc/kubernetes/scheduler.conf + name: kubeconfig readOnly: true dnsPolicy: ClusterFirstWithHostNet hostNetwork: true @@ -477,7 +423,9 @@ spec: - effect: NoSchedule key: node-role.kubernetes.io/master volumes: - %s + - hostPath: + path: /etc/kubernetes/scheduler.conf + name: kubeconfig updateStrategy: {} status: currentNumberScheduled: 0 @@ -487,67 +435,26 @@ status: ` ) -var ( - testAPIServerSecretsPod = fmt.Sprintf(testAPIServerPod, apiProjectedSecret) - testAPIServerSecretsDS = fmt.Sprintf(testAPIServerDaemonSet, indentString(apiProjectedSecret, 4)) - testAPIServerHostPathPod = fmt.Sprintf(testAPIServerPod, hostPathVol) - testAPIServerHostPathDS = fmt.Sprintf(testAPIServerDaemonSet, indentString(hostPathVol, 4)) - - testSchedulerSecretsPod = fmt.Sprintf(testSchedulerPod, schedulerProjectedSecret) - testSchedulerSecretsDS = fmt.Sprintf(testSchedulerDaemonSet, indentString(schedulerProjectedSecret, 4)) - testSchedulerHostPathPod = fmt.Sprintf(testSchedulerPod, hostPathVol) - testSchedulerHostPathDS = fmt.Sprintf(testSchedulerDaemonSet, indentString(hostPathVol, 4)) - - testControllerManagerSecretsPod = fmt.Sprintf(testControllerManagerPod, controllerManagerProjectedSecret) - testControllerManagerSecretsDS = fmt.Sprintf(testControllerManagerDaemonSet, indentString(controllerManagerProjectedSecret, 4)) - testControllerManagerHostPathPod = fmt.Sprintf(testControllerManagerPod, hostPathVol) - testControllerManagerHostPathDS = fmt.Sprintf(testControllerManagerDaemonSet, indentString(hostPathVol, 4)) -) - func TestBuildDaemonSet(t *testing.T) { var tests = []struct { - component string - podBytes []byte - dsBytes []byte - selfHostedSecrets bool + component string + podBytes []byte + dsBytes []byte }{ - // vols as secrets - { - component: kubeadmconstants.KubeAPIServer, - podBytes: []byte(testAPIServerSecretsPod), - dsBytes: []byte(testAPIServerSecretsDS), - selfHostedSecrets: true, - }, - { - component: kubeadmconstants.KubeControllerManager, - podBytes: []byte(testControllerManagerSecretsPod), - dsBytes: []byte(testControllerManagerSecretsDS), - selfHostedSecrets: true, - }, - { - component: kubeadmconstants.KubeScheduler, - podBytes: []byte(testSchedulerSecretsPod), - dsBytes: []byte(testSchedulerSecretsDS), - selfHostedSecrets: true, - }, - // hostPath vols { - component: kubeadmconstants.KubeAPIServer, - podBytes: []byte(testAPIServerHostPathPod), - dsBytes: []byte(testAPIServerHostPathDS), - selfHostedSecrets: false, + component: constants.KubeAPIServer, + podBytes: []byte(testAPIServerPod), + dsBytes: []byte(testAPIServerDaemonSet), }, { - component: kubeadmconstants.KubeControllerManager, - podBytes: []byte(testControllerManagerHostPathPod), - dsBytes: []byte(testControllerManagerHostPathDS), - selfHostedSecrets: false, + component: constants.KubeControllerManager, + podBytes: []byte(testControllerManagerPod), + dsBytes: []byte(testControllerManagerDaemonSet), }, { - component: kubeadmconstants.KubeScheduler, - podBytes: []byte(testSchedulerHostPathPod), - dsBytes: []byte(testSchedulerHostPathDS), - selfHostedSecrets: false, + component: constants.KubeScheduler, + podBytes: []byte(testSchedulerPod), + dsBytes: []byte(testSchedulerDaemonSet), }, } @@ -557,21 +464,17 @@ func TestBuildDaemonSet(t *testing.T) { podSpec, err := loadPodSpecFromFile(tempFile) if err != nil { - t.Fatalf("couldn't load the specified Pod: %v", err) + t.Fatalf("couldn't load the specified Pod") } - cfg := &kubeadmapi.MasterConfiguration{ - FeatureFlags: map[string]bool{string(features.StoreCertsInSecrets): rt.selfHostedSecrets}, - } - - ds := buildDaemonSet(cfg, rt.component, podSpec) + ds := buildDaemonSet(rt.component, podSpec, getDefaultMutators()) dsBytes, err := yaml.Marshal(ds) if err != nil { t.Fatalf("failed to marshal daemonset to YAML: %v", err) } if !bytes.Equal(dsBytes, rt.dsBytes) { - t.Errorf("failed TestBuildDaemonSet for name=%s (secrets=%t):\nexpected:\n%s\nsaw:\n%s", rt.component, rt.selfHostedSecrets, rt.dsBytes, dsBytes) + t.Errorf("failed TestBuildDaemonSet:\nexpected:\n%s\nsaw:\n%s", rt.dsBytes, dsBytes) } } } @@ -651,18 +554,3 @@ func createTempFileWithContent(content []byte) (string, error) { } return tempFile.Name(), nil } - -func indentString(input string, count int) string { - output := "" - lines := strings.Split(input, "\n") - for i, line := range lines { - if i > 0 { - output += strings.Repeat(" ", count) - } - output += line - if i < len(lines)-1 { - output += "\n" - } - } - return output -} diff --git a/cmd/kubeadm/app/util/arguments_test.go b/cmd/kubeadm/app/util/arguments_test.go new file mode 100644 index 0000000000000..f2c6373bf8151 --- /dev/null +++ b/cmd/kubeadm/app/util/arguments_test.go @@ -0,0 +1,341 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "reflect" + "sort" + "testing" +) + +func TestBuildArgumentListFromMap(t *testing.T) { + var tests = []struct { + base map[string]string + overrides map[string]string + expected []string + }{ + { // override an argument from the base + base: map[string]string{ + "admission-control": "NamespaceLifecycle", + "insecure-bind-address": "127.0.0.1", + "allow-privileged": "true", + }, + overrides: map[string]string{ + "admission-control": "NamespaceLifecycle,LimitRanger", + }, + expected: []string{ + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + }, + }, + { // add an argument that is not in base + base: map[string]string{ + "insecure-bind-address": "127.0.0.1", + "allow-privileged": "true", + }, + overrides: map[string]string{ + "admission-control": "NamespaceLifecycle,LimitRanger", + }, + expected: []string{ + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + }, + }, + { // allow empty strings in base + base: map[string]string{ + "insecure-bind-address": "127.0.0.1", + "allow-privileged": "true", + "something-that-allows-empty-string": "", + }, + overrides: map[string]string{ + "admission-control": "NamespaceLifecycle,LimitRanger", + }, + expected: []string{ + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + "--something-that-allows-empty-string=", + }, + }, + { // allow empty strings in overrides + base: map[string]string{ + "insecure-bind-address": "127.0.0.1", + "allow-privileged": "true", + "something-that-allows-empty-string": "foo", + }, + overrides: map[string]string{ + "admission-control": "NamespaceLifecycle,LimitRanger", + "something-that-allows-empty-string": "", + }, + expected: []string{ + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + "--something-that-allows-empty-string=", + }, + }, + } + + for _, rt := range tests { + actual := BuildArgumentListFromMap(rt.base, rt.overrides) + sort.Strings(actual) + sort.Strings(rt.expected) + if !reflect.DeepEqual(actual, rt.expected) { + t.Errorf("failed BuildArgumentListFromMap:\nexpected:\n%v\nsaw:\n%v", rt.expected, actual) + } + } +} + +func TestParseArgumentListToMap(t *testing.T) { + var tests = []struct { + args []string + expectedMap map[string]string + }{ + { + // normal case + args: []string{ + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + }, + expectedMap: map[string]string{ + "admission-control": "NamespaceLifecycle,LimitRanger", + "insecure-bind-address": "127.0.0.1", + "allow-privileged": "true", + }, + }, + { + // test that feature-gates is working + args: []string{ + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + "--feature-gates=EnableFoo=true,EnableBar=false", + }, + expectedMap: map[string]string{ + "admission-control": "NamespaceLifecycle,LimitRanger", + "insecure-bind-address": "127.0.0.1", + "allow-privileged": "true", + "feature-gates": "EnableFoo=true,EnableBar=false", + }, + }, + { + // test that a binary can be the first arg + args: []string{ + "kube-apiserver", + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + "--feature-gates=EnableFoo=true,EnableBar=false", + }, + expectedMap: map[string]string{ + "admission-control": "NamespaceLifecycle,LimitRanger", + "insecure-bind-address": "127.0.0.1", + "allow-privileged": "true", + "feature-gates": "EnableFoo=true,EnableBar=false", + }, + }, + } + + for _, rt := range tests { + actualMap := ParseArgumentListToMap(rt.args) + if !reflect.DeepEqual(actualMap, rt.expectedMap) { + t.Errorf("failed ParseArgumentListToMap:\nexpected:\n%v\nsaw:\n%v", rt.expectedMap, actualMap) + } + } +} + +func TestReplaceArgument(t *testing.T) { + var tests = []struct { + args []string + mutateFunc func(map[string]string) map[string]string + expectedArgs []string + }{ + { + // normal case + args: []string{ + "kube-apiserver", + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + }, + mutateFunc: func(argMap map[string]string) map[string]string { + argMap["admission-control"] = "NamespaceLifecycle,LimitRanger,ResourceQuota" + return argMap + }, + expectedArgs: []string{ + "kube-apiserver", + "--admission-control=NamespaceLifecycle,LimitRanger,ResourceQuota", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + }, + }, + { + // normal case + args: []string{ + "kube-apiserver", + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + }, + mutateFunc: func(argMap map[string]string) map[string]string { + argMap["new-arg-here"] = "foo" + return argMap + }, + expectedArgs: []string{ + "kube-apiserver", + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + "--new-arg-here=foo", + }, + }, + } + + for _, rt := range tests { + actualArgs := ReplaceArgument(rt.args, rt.mutateFunc) + sort.Strings(actualArgs) + sort.Strings(rt.expectedArgs) + if !reflect.DeepEqual(actualArgs, rt.expectedArgs) { + t.Errorf("failed ReplaceArgument:\nexpected:\n%v\nsaw:\n%v", rt.expectedArgs, actualArgs) + } + } +} + +func TestRoundtrip(t *testing.T) { + var tests = []struct { + args []string + }{ + { + // normal case + args: []string{ + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + }, + }, + { + // test that feature-gates is working + args: []string{ + "--admission-control=NamespaceLifecycle,LimitRanger", + "--insecure-bind-address=127.0.0.1", + "--allow-privileged=true", + "--feature-gates=EnableFoo=true,EnableBar=false", + }, + }, + } + + for _, rt := range tests { + // These two methods should be each other's opposite functions, test that by chaining the methods and see if you get the same result back + actual := BuildArgumentListFromMap(ParseArgumentListToMap(rt.args), map[string]string{}) + sort.Strings(actual) + sort.Strings(rt.args) + + if !reflect.DeepEqual(actual, rt.args) { + t.Errorf("failed TestRoundtrip:\nexpected:\n%v\nsaw:\n%v", rt.args, actual) + } + } +} + +func TestParseArgument(t *testing.T) { + var tests = []struct { + arg string + expectedKey string + expectedVal string + expectedErr bool + }{ + { + // cannot be empty + arg: "", + expectedErr: true, + }, + { + // must contain -- and = + arg: "a", + expectedErr: true, + }, + { + // must contain -- and = + arg: "a-z", + expectedErr: true, + }, + { + // must contain -- + arg: "a=b", + expectedErr: true, + }, + { + // must contain a key + arg: "--=b", + expectedErr: true, + }, + { + // can contain key but no value + arg: "--a=", + expectedKey: "a", + expectedVal: "", + expectedErr: false, + }, + { + // simple case + arg: "--a=b", + expectedKey: "a", + expectedVal: "b", + expectedErr: false, + }, + { + // keys/values with '-' should be supported + arg: "--very-long-flag-name=some-value", + expectedKey: "very-long-flag-name", + expectedVal: "some-value", + expectedErr: false, + }, + { + // numbers should be handled correctly + arg: "--some-number=0.2", + expectedKey: "some-number", + expectedVal: "0.2", + expectedErr: false, + }, + { + // lists should be handled correctly + arg: "--admission-control=foo,bar,baz", + expectedKey: "admission-control", + expectedVal: "foo,bar,baz", + expectedErr: false, + }, + { + // more than one '=' should be allowed + arg: "--feature-gates=EnableFoo=true,EnableBar=false", + expectedKey: "feature-gates", + expectedVal: "EnableFoo=true,EnableBar=false", + expectedErr: false, + }, + } + + for _, rt := range tests { + key, val, actual := parseArgument(rt.arg) + if (actual != nil) != rt.expectedErr { + t.Errorf("failed parseArgument:\nexpected error:\n%t\nsaw error:\n%v", rt.expectedErr, actual) + } + if (key != rt.expectedKey) || (val != rt.expectedVal) { + t.Errorf("failed parseArgument:\nexpected key: %s\nsaw key: %s\nexpected value: %s\nsaw value: %s", rt.expectedKey, key, rt.expectedVal, val) + } + } +} From d2e08fd739fae0c4deea0d1a7bd7fb61d51689c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Sat, 19 Aug 2017 00:46:38 +0300 Subject: [PATCH 126/403] autogenerated bazel --- cmd/kubeadm/app/phases/controlplane/BUILD | 1 + cmd/kubeadm/app/phases/etcd/BUILD | 1 + cmd/kubeadm/app/phases/selfhosting/BUILD | 3 +-- cmd/kubeadm/app/util/BUILD | 2 ++ 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cmd/kubeadm/app/phases/controlplane/BUILD b/cmd/kubeadm/app/phases/controlplane/BUILD index 71b71eebcc89d..c88f404feff6a 100644 --- a/cmd/kubeadm/app/phases/controlplane/BUILD +++ b/cmd/kubeadm/app/phases/controlplane/BUILD @@ -33,6 +33,7 @@ go_library( "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/images:go_default_library", + "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/staticpod:go_default_library", "//pkg/kubeapiserver/authorizer/modes:go_default_library", "//pkg/util/version:go_default_library", diff --git a/cmd/kubeadm/app/phases/etcd/BUILD b/cmd/kubeadm/app/phases/etcd/BUILD index 91d159ac60ffa..ba43cd2aff7ac 100644 --- a/cmd/kubeadm/app/phases/etcd/BUILD +++ b/cmd/kubeadm/app/phases/etcd/BUILD @@ -28,6 +28,7 @@ go_library( "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/images:go_default_library", + "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/staticpod:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", ], diff --git a/cmd/kubeadm/app/phases/selfhosting/BUILD b/cmd/kubeadm/app/phases/selfhosting/BUILD index 4f541f6c0fec3..ae5a836f7690a 100644 --- a/cmd/kubeadm/app/phases/selfhosting/BUILD +++ b/cmd/kubeadm/app/phases/selfhosting/BUILD @@ -15,8 +15,6 @@ go_test( ], library = ":go_default_library", deps = [ - "//cmd/kubeadm/app/apis/kubeadm:go_default_library", - "//cmd/kubeadm/app/cmd/features:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -34,6 +32,7 @@ go_library( "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/cmd/features:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", + "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/apiclient:go_default_library", "//pkg/api:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/cmd/kubeadm/app/util/BUILD b/cmd/kubeadm/app/util/BUILD index b762a5d1fb25a..3f0e5f233b0c6 100644 --- a/cmd/kubeadm/app/util/BUILD +++ b/cmd/kubeadm/app/util/BUILD @@ -9,6 +9,7 @@ load( go_library( name = "go_default_library", srcs = [ + "arguments.go", "endpoint.go", "error.go", "template.go", @@ -24,6 +25,7 @@ go_library( go_test( name = "go_default_test", srcs = [ + "arguments_test.go", "endpoint_test.go", "error_test.go", "template_test.go", From faee6d6d5d0bf6d753a60c1338c6fbf17a2d956d Mon Sep 17 00:00:00 2001 From: Renaud Gaubert Date: Fri, 11 Aug 2017 11:37:46 -0700 Subject: [PATCH 127/403] Updated gRPC version to support Keep Alive --- Godeps/Godeps.json | 123 +- Godeps/LICENSES | 3379 ++++++++++- staging/src/k8s.io/api/Godeps/Godeps.json | 32 +- .../Godeps/Godeps.json | 86 +- .../k8s.io/apimachinery/Godeps/Godeps.json | 38 +- .../src/k8s.io/apiserver/Godeps/Godeps.json | 86 +- .../src/k8s.io/client-go/Godeps/Godeps.json | 36 +- .../k8s.io/code-generator/Godeps/Godeps.json | 32 +- .../k8s.io/kube-aggregator/Godeps/Godeps.json | 86 +- staging/src/k8s.io/metrics/Godeps/Godeps.json | 32 +- .../sample-apiserver/Godeps/Godeps.json | 86 +- vendor/BUILD | 4 +- vendor/golang.org/x/net/context/BUILD | 2 + vendor/golang.org/x/net/context/context.go | 112 +- vendor/golang.org/x/net/context/go17.go | 4 +- vendor/golang.org/x/net/context/go19.go | 20 + vendor/golang.org/x/net/context/pre_go17.go | 18 +- vendor/golang.org/x/net/context/pre_go19.go | 109 + vendor/golang.org/x/net/http2/BUILD | 5 +- vendor/golang.org/x/net/http2/ciphers.go | 641 ++ .../x/net/http2/client_conn_pool.go | 2 +- .../x/net/http2/configure_transport.go | 2 +- vendor/golang.org/x/net/http2/databuffer.go | 146 + vendor/golang.org/x/net/http2/errors.go | 13 +- vendor/golang.org/x/net/http2/fixed_buffer.go | 60 - vendor/golang.org/x/net/http2/frame.go | 81 +- vendor/golang.org/x/net/http2/go16.go | 27 - vendor/golang.org/x/net/http2/go18.go | 8 +- vendor/golang.org/x/net/http2/go19.go | 16 + vendor/golang.org/x/net/http2/hpack/encode.go | 29 +- vendor/golang.org/x/net/http2/hpack/hpack.go | 104 +- vendor/golang.org/x/net/http2/hpack/tables.go | 255 +- vendor/golang.org/x/net/http2/http2.go | 8 +- vendor/golang.org/x/net/http2/not_go16.go | 25 - vendor/golang.org/x/net/http2/not_go18.go | 2 + vendor/golang.org/x/net/http2/not_go19.go | 16 + vendor/golang.org/x/net/http2/pipe.go | 18 +- vendor/golang.org/x/net/http2/server.go | 442 +- vendor/golang.org/x/net/http2/transport.go | 256 +- .../x/net/http2/writesched_priority.go | 2 +- vendor/golang.org/x/net/idna/BUILD | 7 + vendor/golang.org/x/net/idna/idna.go | 682 ++- vendor/golang.org/x/net/idna/punycode.go | 23 +- vendor/golang.org/x/net/idna/tables.go | 4477 ++++++++++++++ vendor/golang.org/x/net/idna/trie.go | 72 + vendor/golang.org/x/net/idna/trieval.go | 114 + .../x/net/internal/timeseries/timeseries.go | 2 +- vendor/golang.org/x/net/proxy/per_host.go | 6 +- vendor/golang.org/x/net/proxy/proxy.go | 44 +- vendor/golang.org/x/net/proxy/socks5.go | 57 +- vendor/golang.org/x/net/trace/BUILD | 2 + vendor/golang.org/x/net/trace/events.go | 6 +- vendor/golang.org/x/net/trace/trace.go | 71 +- vendor/golang.org/x/net/trace/trace_go16.go | 21 + vendor/golang.org/x/net/trace/trace_go17.go | 21 + vendor/golang.org/x/text/cases/BUILD | 2 + vendor/golang.org/x/text/cases/cases.go | 53 +- vendor/golang.org/x/text/cases/context.go | 101 +- vendor/golang.org/x/text/cases/fold.go | 10 +- vendor/golang.org/x/text/cases/gen.go | 24 +- vendor/golang.org/x/text/cases/gen_trieval.go | 12 +- vendor/golang.org/x/text/cases/icu.go | 61 + vendor/golang.org/x/text/cases/info.go | 15 +- vendor/golang.org/x/text/cases/map.go | 381 +- vendor/golang.org/x/text/cases/tables.go | 390 +- vendor/golang.org/x/text/cases/trieval.go | 14 +- vendor/golang.org/x/text/encoding/encoding.go | 8 +- .../internal/identifier/identifier.go | 2 +- .../text/encoding/internal/identifier/mib.go | 2 +- vendor/golang.org/x/text/internal/BUILD | 36 + vendor/golang.org/x/text/internal/gen.go | 52 + vendor/golang.org/x/text/internal/internal.go | 51 + vendor/golang.org/x/text/internal/match.go | 67 + vendor/golang.org/x/text/internal/tables.go | 117 + vendor/golang.org/x/text/language/common.go | 2 +- .../x/text/language/{maketables.go => gen.go} | 208 +- vendor/golang.org/x/text/language/index.go | 1505 ++--- vendor/golang.org/x/text/language/language.go | 15 +- vendor/golang.org/x/text/language/match.go | 177 +- vendor/golang.org/x/text/language/tables.go | 5197 ++++++++++------- vendor/golang.org/x/text/runes/cond.go | 77 +- vendor/golang.org/x/text/runes/runes.go | 139 +- .../x/text/secure/bidirule/bidirule.go | 110 +- vendor/golang.org/x/text/secure/precis/BUILD | 1 + .../x/text/secure/precis/options.go | 59 +- .../x/text/secure/precis/profile.go | 214 +- .../x/text/secure/precis/profiles.go | 96 +- .../golang.org/x/text/secure/precis/tables.go | 2 +- .../x/text/secure/precis/trieval.go | 2 +- .../golang.org/x/text/transform/transform.go | 52 +- .../golang.org/x/text/unicode/bidi/bracket.go | 42 +- vendor/golang.org/x/text/unicode/bidi/core.go | 5 +- .../golang.org/x/text/unicode/bidi/tables.go | 2 +- .../golang.org/x/text/unicode/bidi/trieval.go | 2 +- .../x/text/unicode/norm/composition.go | 18 +- .../x/text/unicode/norm/forminfo.go | 49 +- .../golang.org/x/text/unicode/norm/input.go | 8 +- vendor/golang.org/x/text/unicode/norm/iter.go | 31 +- .../x/text/unicode/norm/maketables.go | 12 +- .../x/text/unicode/norm/normalize.go | 55 +- .../x/text/unicode/norm/readwriter.go | 1 - .../golang.org/x/text/unicode/norm/tables.go | 1020 ++-- vendor/golang.org/x/text/width/kind_string.go | 2 +- vendor/golang.org/x/text/width/tables.go | 2 +- vendor/golang.org/x/text/width/transform.go | 77 + vendor/golang.org/x/text/width/trieval.go | 2 +- vendor/golang.org/x/text/width/width.go | 9 +- vendor/google.golang.org/genproto/LICENSE | 202 + .../genproto/googleapis/rpc/status/BUILD | 31 + .../googleapis/rpc/status/status.pb.go | 143 + vendor/google.golang.org/grpc/.travis.yml | 13 +- vendor/google.golang.org/grpc/AUTHORS | 1 + vendor/google.golang.org/grpc/BUILD | 16 + vendor/google.golang.org/grpc/CONTRIBUTING.md | 60 +- vendor/google.golang.org/grpc/LICENSE | 230 +- vendor/google.golang.org/grpc/PATENTS | 22 - vendor/google.golang.org/grpc/README.md | 21 +- vendor/google.golang.org/grpc/backoff.go | 18 + vendor/google.golang.org/grpc/balancer.go | 55 +- vendor/google.golang.org/grpc/call.go | 189 +- vendor/google.golang.org/grpc/clientconn.go | 438 +- vendor/google.golang.org/grpc/codec.go | 104 + vendor/google.golang.org/grpc/codegen.sh | 2 +- vendor/google.golang.org/grpc/codes/codes.go | 37 +- vendor/google.golang.org/grpc/coverage.sh | 3 +- .../google.golang.org/grpc/credentials/BUILD | 1 + .../grpc/credentials/credentials.go | 51 +- .../grpc/credentials/credentials_util_go17.go | 38 +- .../grpc/credentials/credentials_util_go18.go | 38 + .../credentials/credentials_util_pre_go17.go | 37 +- vendor/google.golang.org/grpc/doc.go | 2 +- vendor/google.golang.org/grpc/go16.go | 98 + vendor/google.golang.org/grpc/go17.go | 98 + vendor/google.golang.org/grpc/grpclb.go | 757 +++ .../grpc/grpclb/grpc_lb_v1/BUILD | 34 + .../grpc/grpclb/grpc_lb_v1/grpclb.pb.go | 629 ++ .../grpc/grpclb/grpc_lb_v1/grpclb.proto | 164 + vendor/google.golang.org/grpc/grpclog/BUILD | 6 +- .../google.golang.org/grpc/grpclog/grpclog.go | 135 + .../google.golang.org/grpc/grpclog/logger.go | 104 +- .../grpc/grpclog/loggerv2.go | 204 + vendor/google.golang.org/grpc/interceptor.go | 43 +- .../grpc/internal/internal.go | 35 +- vendor/google.golang.org/grpc/keepalive/BUILD | 27 + .../grpc/keepalive/keepalive.go | 65 + .../grpc/metadata/metadata.go | 138 +- .../google.golang.org/grpc/naming/naming.go | 35 +- vendor/google.golang.org/grpc/peer/peer.go | 38 +- vendor/google.golang.org/grpc/proxy.go | 130 + vendor/google.golang.org/grpc/rpc_util.go | 397 +- vendor/google.golang.org/grpc/server.go | 571 +- vendor/google.golang.org/grpc/stats/BUILD | 31 + .../google.golang.org/grpc/stats/handlers.go | 64 + vendor/google.golang.org/grpc/stats/stats.go | 208 + vendor/google.golang.org/grpc/status/BUILD | 32 + .../google.golang.org/grpc/status/status.go | 130 + vendor/google.golang.org/grpc/stream.go | 309 +- vendor/google.golang.org/grpc/tap/BUILD | 28 + vendor/google.golang.org/grpc/tap/tap.go | 39 + vendor/google.golang.org/grpc/trace.go | 35 +- vendor/google.golang.org/grpc/transport/BUILD | 10 +- .../grpc/transport/bdp_estimator.go | 125 + .../grpc/transport/control.go | 151 +- .../google.golang.org/grpc/transport/go16.go | 49 +- .../google.golang.org/grpc/transport/go17.go | 52 +- .../grpc/transport/handler_server.go | 106 +- .../grpc/transport/http2_client.go | 658 ++- .../grpc/transport/http2_server.go | 601 +- .../grpc/transport/http_util.go | 214 +- .../google.golang.org/grpc/transport/log.go | 50 + .../grpc/transport/pre_go16.go | 51 - .../grpc/transport/transport.go | 337 +- 172 files changed, 24118 insertions(+), 7261 deletions(-) create mode 100644 vendor/golang.org/x/net/context/go19.go create mode 100644 vendor/golang.org/x/net/context/pre_go19.go create mode 100644 vendor/golang.org/x/net/http2/ciphers.go create mode 100644 vendor/golang.org/x/net/http2/databuffer.go delete mode 100644 vendor/golang.org/x/net/http2/fixed_buffer.go create mode 100644 vendor/golang.org/x/net/http2/go19.go create mode 100644 vendor/golang.org/x/net/http2/not_go19.go create mode 100644 vendor/golang.org/x/net/idna/tables.go create mode 100644 vendor/golang.org/x/net/idna/trie.go create mode 100644 vendor/golang.org/x/net/idna/trieval.go create mode 100644 vendor/golang.org/x/net/trace/trace_go16.go create mode 100644 vendor/golang.org/x/net/trace/trace_go17.go create mode 100644 vendor/golang.org/x/text/cases/icu.go create mode 100644 vendor/golang.org/x/text/internal/BUILD create mode 100644 vendor/golang.org/x/text/internal/gen.go create mode 100644 vendor/golang.org/x/text/internal/internal.go create mode 100644 vendor/golang.org/x/text/internal/match.go create mode 100644 vendor/golang.org/x/text/internal/tables.go rename vendor/golang.org/x/text/language/{maketables.go => gen.go} (91%) create mode 100644 vendor/google.golang.org/genproto/LICENSE create mode 100644 vendor/google.golang.org/genproto/googleapis/rpc/status/BUILD create mode 100644 vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go create mode 100644 vendor/google.golang.org/grpc/AUTHORS delete mode 100644 vendor/google.golang.org/grpc/PATENTS create mode 100644 vendor/google.golang.org/grpc/codec.go create mode 100644 vendor/google.golang.org/grpc/credentials/credentials_util_go18.go create mode 100644 vendor/google.golang.org/grpc/go16.go create mode 100644 vendor/google.golang.org/grpc/go17.go create mode 100644 vendor/google.golang.org/grpc/grpclb.go create mode 100644 vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/BUILD create mode 100644 vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.pb.go create mode 100644 vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.proto create mode 100644 vendor/google.golang.org/grpc/grpclog/grpclog.go create mode 100644 vendor/google.golang.org/grpc/grpclog/loggerv2.go create mode 100644 vendor/google.golang.org/grpc/keepalive/BUILD create mode 100644 vendor/google.golang.org/grpc/keepalive/keepalive.go create mode 100644 vendor/google.golang.org/grpc/proxy.go create mode 100644 vendor/google.golang.org/grpc/stats/BUILD create mode 100644 vendor/google.golang.org/grpc/stats/handlers.go create mode 100644 vendor/google.golang.org/grpc/stats/stats.go create mode 100644 vendor/google.golang.org/grpc/status/BUILD create mode 100644 vendor/google.golang.org/grpc/status/status.go create mode 100644 vendor/google.golang.org/grpc/tap/BUILD create mode 100644 vendor/google.golang.org/grpc/tap/tap.go create mode 100644 vendor/google.golang.org/grpc/transport/bdp_estimator.go create mode 100644 vendor/google.golang.org/grpc/transport/log.go delete mode 100644 vendor/google.golang.org/grpc/transport/pre_go16.go diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 056b4ee93fd25..8890a09ff4d16 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -2715,51 +2715,51 @@ }, { "ImportPath": "golang.org/x/net/context", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/context/ctxhttp", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html/atom", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/internal/timeseries", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/proxy", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/trace", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/websocket", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/oauth2", @@ -2791,63 +2791,67 @@ }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/encoding", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/encoding/internal", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/encoding/internal/identifier", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/encoding/unicode", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/utf8internal", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/time/rate", @@ -2909,50 +2913,79 @@ "ImportPath": "google.golang.org/api/pubsub/v1", "Rev": "98825bb0065da4054e5da6db34f5fc598e50bc24" }, + { + "ImportPath": "google.golang.org/genproto/googleapis/rpc/status", + "Rev": "09f6ed296fc66555a25fe4ce95173148778dfa85" + }, { "ImportPath": "google.golang.org/grpc", - "Comment": "v1.0.4", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/codes", - "Comment": "v1.0.4", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/credentials", - "Comment": "v1.0.4", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1", + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/grpclog", - "Comment": "v1.0.4", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/internal", - "Comment": "v1.0.4", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/keepalive", + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/metadata", - "Comment": "v1.0.4", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/naming", - "Comment": "v1.0.4", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/peer", - "Comment": "v1.0.4", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/stats", + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/status", + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/tap", + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/transport", - "Comment": "v1.0.4", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Comment": "v1.5.1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "gopkg.in/gcfg.v1", diff --git a/Godeps/LICENSES b/Godeps/LICENSES index b5c59d6a43487..d63120393d798 100644 --- a/Godeps/LICENSES +++ b/Godeps/LICENSES @@ -86430,6 +86430,41 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================================================ +================================================================================ += vendor/golang.org/x/text/internal licensed under: = + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/golang.org/x/text/LICENSE 5d4950ecb7b26d2c5e4e7b4e0dd74707 - +================================================================================ + + ================================================================================ = vendor/golang.org/x/text/internal/tag licensed under: = @@ -87306,326 +87341,3152 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================================================ -= vendor/google.golang.org/grpc licensed under: = += vendor/google.golang.org/genproto/googleapis/rpc/status licensed under: = -Copyright 2014, Google Inc. -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 1. Definitions. -= vendor/google.golang.org/grpc/LICENSE a4bad33881612090c6035d8393175996 - -================================================================================ + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -================================================================================ -= vendor/google.golang.org/grpc/codes licensed under: = + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Copyright 2014, Google Inc. -All rights reserved. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -= vendor/google.golang.org/grpc/LICENSE a4bad33881612090c6035d8393175996 - -================================================================================ + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -================================================================================ -= vendor/google.golang.org/grpc/credentials licensed under: = + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Copyright 2014, Google Inc. -All rights reserved. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -= vendor/google.golang.org/grpc/LICENSE a4bad33881612090c6035d8393175996 - -================================================================================ + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -================================================================================ -= vendor/google.golang.org/grpc/grpclog licensed under: = + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -Copyright 2014, Google Inc. -All rights reserved. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -= vendor/google.golang.org/grpc/LICENSE a4bad33881612090c6035d8393175996 - -================================================================================ + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -================================================================================ -= vendor/google.golang.org/grpc/internal licensed under: = + END OF TERMS AND CONDITIONS -Copyright 2014, Google Inc. -All rights reserved. + APPENDIX: How to apply the Apache License to your work. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + Copyright [yyyy] [name of copyright owner] -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -= vendor/google.golang.org/grpc/LICENSE a4bad33881612090c6035d8393175996 - -================================================================================ + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. += vendor/google.golang.org/genproto/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - ================================================================================ -= vendor/google.golang.org/grpc/metadata licensed under: = - -Copyright 2014, Google Inc. -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. +================================================================================ += vendor/google.golang.org/grpc licensed under: = -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -= vendor/google.golang.org/grpc/LICENSE a4bad33881612090c6035d8393175996 - -================================================================================ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -================================================================================ -= vendor/google.golang.org/grpc/naming licensed under: = + 1. Definitions. -Copyright 2014, Google Inc. -All rights reserved. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -= vendor/google.golang.org/grpc/LICENSE a4bad33881612090c6035d8393175996 - -================================================================================ + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -================================================================================ -= vendor/google.golang.org/grpc/peer licensed under: = + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -Copyright 2014, Google Inc. -All rights reserved. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -= vendor/google.golang.org/grpc/LICENSE a4bad33881612090c6035d8393175996 - -================================================================================ + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -================================================================================ -= vendor/google.golang.org/grpc/transport licensed under: = + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -Copyright 2014, Google Inc. -All rights reserved. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/codes licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/credentials licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/grpclb/grpc_lb_v1 licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/grpclog licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/internal licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/keepalive licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/metadata licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/naming licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/peer licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/stats licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/status licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/tap licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - +================================================================================ + + +================================================================================ += vendor/google.golang.org/grpc/transport licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -= vendor/google.golang.org/grpc/LICENSE a4bad33881612090c6035d8393175996 - += vendor/google.golang.org/grpc/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 - ================================================================================ diff --git a/staging/src/k8s.io/api/Godeps/Godeps.json b/staging/src/k8s.io/api/Godeps/Godeps.json index 0da1215b6b451..babb6ba48c061 100644 --- a/staging/src/k8s.io/api/Godeps/Godeps.json +++ b/staging/src/k8s.io/api/Godeps/Godeps.json @@ -84,59 +84,63 @@ }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "gopkg.in/inf.v0", diff --git a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json index d55a95c8eafa5..c0a282a2cdc98 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json @@ -304,43 +304,43 @@ }, { "ImportPath": "golang.org/x/net/context", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html/atom", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/internal/timeseries", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/trace", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/websocket", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/sys/unix", @@ -348,79 +348,107 @@ }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "google.golang.org/genproto/googleapis/rpc/status", + "Rev": "09f6ed296fc66555a25fe4ce95173148778dfa85" }, { "ImportPath": "google.golang.org/grpc", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/codes", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/credentials", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/grpclog", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/internal", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/keepalive", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/metadata", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/naming", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/peer", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/stats", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/status", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/tap", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/transport", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "gopkg.in/inf.v0", diff --git a/staging/src/k8s.io/apimachinery/Godeps/Godeps.json b/staging/src/k8s.io/apimachinery/Godeps/Godeps.json index 8793842a07cce..50b644b46b787 100644 --- a/staging/src/k8s.io/apimachinery/Godeps/Godeps.json +++ b/staging/src/k8s.io/apimachinery/Godeps/Godeps.json @@ -136,71 +136,75 @@ }, { "ImportPath": "golang.org/x/net/html", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html/atom", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/websocket", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "gopkg.in/inf.v0", diff --git a/staging/src/k8s.io/apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiserver/Godeps/Godeps.json index 123f5c9918e80..154ea27651df4 100644 --- a/staging/src/k8s.io/apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiserver/Godeps/Godeps.json @@ -580,43 +580,43 @@ }, { "ImportPath": "golang.org/x/net/context", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html/atom", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/internal/timeseries", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/trace", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/websocket", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/sys/unix", @@ -624,83 +624,111 @@ }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/time/rate", "Rev": "f51c12702a4d776e4c1fa9b0fabab841babae631" }, + { + "ImportPath": "google.golang.org/genproto/googleapis/rpc/status", + "Rev": "09f6ed296fc66555a25fe4ce95173148778dfa85" + }, { "ImportPath": "google.golang.org/grpc", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/codes", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/credentials", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/grpclog", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/internal", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/keepalive", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/metadata", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/naming", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/peer", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/stats", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/status", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/tap", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/transport", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "gopkg.in/inf.v0", diff --git a/staging/src/k8s.io/client-go/Godeps/Godeps.json b/staging/src/k8s.io/client-go/Godeps/Godeps.json index 5e68697cc6c4e..1eccbc0571226 100644 --- a/staging/src/k8s.io/client-go/Godeps/Godeps.json +++ b/staging/src/k8s.io/client-go/Godeps/Godeps.json @@ -256,27 +256,27 @@ }, { "ImportPath": "golang.org/x/net/context", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/context/ctxhttp", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/oauth2", @@ -304,43 +304,47 @@ }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "gopkg.in/inf.v0", diff --git a/staging/src/k8s.io/code-generator/Godeps/Godeps.json b/staging/src/k8s.io/code-generator/Godeps/Godeps.json index 27edd8a3bb495..18ce3e05c1e66 100644 --- a/staging/src/k8s.io/code-generator/Godeps/Godeps.json +++ b/staging/src/k8s.io/code-generator/Godeps/Godeps.json @@ -224,59 +224,63 @@ }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "gopkg.in/inf.v0", diff --git a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json index 46cff8e267bf5..6c6c435de8713 100644 --- a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json +++ b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json @@ -300,43 +300,43 @@ }, { "ImportPath": "golang.org/x/net/context", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html/atom", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/internal/timeseries", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/trace", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/websocket", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/sys/unix", @@ -344,79 +344,107 @@ }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "google.golang.org/genproto/googleapis/rpc/status", + "Rev": "09f6ed296fc66555a25fe4ce95173148778dfa85" }, { "ImportPath": "google.golang.org/grpc", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/codes", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/credentials", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/grpclog", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/internal", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/keepalive", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/metadata", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/naming", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/peer", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/stats", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/status", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/tap", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/transport", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "gopkg.in/inf.v0", diff --git a/staging/src/k8s.io/metrics/Godeps/Godeps.json b/staging/src/k8s.io/metrics/Godeps/Godeps.json index 84161570f62b8..f3b84309abca4 100644 --- a/staging/src/k8s.io/metrics/Godeps/Godeps.json +++ b/staging/src/k8s.io/metrics/Godeps/Godeps.json @@ -124,59 +124,63 @@ }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "gopkg.in/inf.v0", diff --git a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json index 85d2888314521..6b66a878ebbd3 100644 --- a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json @@ -292,43 +292,43 @@ }, { "ImportPath": "golang.org/x/net/context", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/html/atom", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/idna", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/internal/timeseries", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/trace", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/net/websocket", - "Rev": "f2499483f923065a842d38eb4c7f1927e6fc6e6d" + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" }, { "ImportPath": "golang.org/x/sys/unix", @@ -336,79 +336,107 @@ }, { "ImportPath": "golang.org/x/text/cases", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/internal", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/internal/tag", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/language", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/runes", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/secure/precis", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/transform", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" }, { "ImportPath": "golang.org/x/text/width", - "Rev": "2910a502d2bf9e43193af9d68ca516529614eed3" + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "google.golang.org/genproto/googleapis/rpc/status", + "Rev": "09f6ed296fc66555a25fe4ce95173148778dfa85" }, { "ImportPath": "google.golang.org/grpc", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/codes", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/credentials", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/grpclb/grpc_lb_v1", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/grpclog", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/internal", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/keepalive", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/metadata", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/naming", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/peer", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/stats", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/status", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" + }, + { + "ImportPath": "google.golang.org/grpc/tap", + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "google.golang.org/grpc/transport", - "Rev": "777daa17ff9b5daef1cfdf915088a2ada3332bf0" + "Rev": "b8669c35455183da6d5c474ea6e72fbf55183274" }, { "ImportPath": "gopkg.in/inf.v0", diff --git a/vendor/BUILD b/vendor/BUILD index 340d437d82330..5250904625235 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -338,8 +338,7 @@ filegroup( "//vendor/golang.org/x/sys/windows:all-srcs", "//vendor/golang.org/x/text/cases:all-srcs", "//vendor/golang.org/x/text/encoding:all-srcs", - "//vendor/golang.org/x/text/internal/tag:all-srcs", - "//vendor/golang.org/x/text/internal/utf8internal:all-srcs", + "//vendor/golang.org/x/text/internal:all-srcs", "//vendor/golang.org/x/text/language:all-srcs", "//vendor/golang.org/x/text/runes:all-srcs", "//vendor/golang.org/x/text/secure/bidirule:all-srcs", @@ -362,6 +361,7 @@ filegroup( "//vendor/google.golang.org/api/logging/v2beta1:all-srcs", "//vendor/google.golang.org/api/monitoring/v3:all-srcs", "//vendor/google.golang.org/api/pubsub/v1:all-srcs", + "//vendor/google.golang.org/genproto/googleapis/rpc/status:all-srcs", "//vendor/google.golang.org/grpc:all-srcs", "//vendor/gopkg.in/gcfg.v1:all-srcs", "//vendor/gopkg.in/inf.v0:all-srcs", diff --git a/vendor/golang.org/x/net/context/BUILD b/vendor/golang.org/x/net/context/BUILD index 6096003516102..09b1fb3fa79b9 100644 --- a/vendor/golang.org/x/net/context/BUILD +++ b/vendor/golang.org/x/net/context/BUILD @@ -5,7 +5,9 @@ go_library( srcs = [ "context.go", "go17.go", + "go19.go", "pre_go17.go", + "pre_go19.go", ], visibility = ["//visibility:public"], ) diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go index ea1a7cd53a12e..a25301a76fa46 100644 --- a/vendor/golang.org/x/net/context/context.go +++ b/vendor/golang.org/x/net/context/context.go @@ -7,7 +7,7 @@ // and between processes. // // Incoming requests to a server should create a Context, and outgoing calls to -// servers should accept a Context. The chain of function calls between must +// servers should accept a Context. The chain of function calls between must // propagate the Context, optionally replacing it with a modified copy created // using WithDeadline, WithTimeout, WithCancel, or WithValue. // @@ -16,14 +16,14 @@ // propagation: // // Do not store Contexts inside a struct type; instead, pass a Context -// explicitly to each function that needs it. The Context should be the first +// explicitly to each function that needs it. The Context should be the first // parameter, typically named ctx: // // func DoSomething(ctx context.Context, arg Arg) error { // // ... use ctx ... // } // -// Do not pass a nil Context, even if a function permits it. Pass context.TODO +// Do not pass a nil Context, even if a function permits it. Pass context.TODO // if you are unsure about which Context to use. // // Use context Values only for request-scoped data that transits processes and @@ -36,112 +36,15 @@ // Contexts. package context -import "time" - -// A Context carries a deadline, a cancelation signal, and other values across -// API boundaries. -// -// Context's methods may be called by multiple goroutines simultaneously. -type Context interface { - // Deadline returns the time when work done on behalf of this context - // should be canceled. Deadline returns ok==false when no deadline is - // set. Successive calls to Deadline return the same results. - Deadline() (deadline time.Time, ok bool) - - // Done returns a channel that's closed when work done on behalf of this - // context should be canceled. Done may return nil if this context can - // never be canceled. Successive calls to Done return the same value. - // - // WithCancel arranges for Done to be closed when cancel is called; - // WithDeadline arranges for Done to be closed when the deadline - // expires; WithTimeout arranges for Done to be closed when the timeout - // elapses. - // - // Done is provided for use in select statements: - // - // // Stream generates values with DoSomething and sends them to out - // // until DoSomething returns an error or ctx.Done is closed. - // func Stream(ctx context.Context, out chan<- Value) error { - // for { - // v, err := DoSomething(ctx) - // if err != nil { - // return err - // } - // select { - // case <-ctx.Done(): - // return ctx.Err() - // case out <- v: - // } - // } - // } - // - // See http://blog.golang.org/pipelines for more examples of how to use - // a Done channel for cancelation. - Done() <-chan struct{} - - // Err returns a non-nil error value after Done is closed. Err returns - // Canceled if the context was canceled or DeadlineExceeded if the - // context's deadline passed. No other values for Err are defined. - // After Done is closed, successive calls to Err return the same value. - Err() error - - // Value returns the value associated with this context for key, or nil - // if no value is associated with key. Successive calls to Value with - // the same key returns the same result. - // - // Use context values only for request-scoped data that transits - // processes and API boundaries, not for passing optional parameters to - // functions. - // - // A key identifies a specific value in a Context. Functions that wish - // to store values in Context typically allocate a key in a global - // variable then use that key as the argument to context.WithValue and - // Context.Value. A key can be any type that supports equality; - // packages should define keys as an unexported type to avoid - // collisions. - // - // Packages that define a Context key should provide type-safe accessors - // for the values stores using that key: - // - // // Package user defines a User type that's stored in Contexts. - // package user - // - // import "golang.org/x/net/context" - // - // // User is the type of value stored in the Contexts. - // type User struct {...} - // - // // key is an unexported type for keys defined in this package. - // // This prevents collisions with keys defined in other packages. - // type key int - // - // // userKey is the key for user.User values in Contexts. It is - // // unexported; clients use user.NewContext and user.FromContext - // // instead of using this key directly. - // var userKey key = 0 - // - // // NewContext returns a new Context that carries value u. - // func NewContext(ctx context.Context, u *User) context.Context { - // return context.WithValue(ctx, userKey, u) - // } - // - // // FromContext returns the User value stored in ctx, if any. - // func FromContext(ctx context.Context) (*User, bool) { - // u, ok := ctx.Value(userKey).(*User) - // return u, ok - // } - Value(key interface{}) interface{} -} - // Background returns a non-nil, empty Context. It is never canceled, has no -// values, and has no deadline. It is typically used by the main function, +// values, and has no deadline. It is typically used by the main function, // initialization, and tests, and as the top-level Context for incoming // requests. func Background() Context { return background } -// TODO returns a non-nil, empty Context. Code should use context.TODO when +// TODO returns a non-nil, empty Context. Code should use context.TODO when // it's unclear which Context to use or it is not yet available (because the // surrounding function has not yet been extended to accept a Context // parameter). TODO is recognized by static analysis tools that determine @@ -149,8 +52,3 @@ func Background() Context { func TODO() Context { return todo } - -// A CancelFunc tells an operation to abandon its work. -// A CancelFunc does not wait for the work to stop. -// After the first call, subsequent calls to a CancelFunc do nothing. -type CancelFunc func() diff --git a/vendor/golang.org/x/net/context/go17.go b/vendor/golang.org/x/net/context/go17.go index f8cda19adaee9..d20f52b7de93f 100644 --- a/vendor/golang.org/x/net/context/go17.go +++ b/vendor/golang.org/x/net/context/go17.go @@ -35,8 +35,8 @@ func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { } // WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned // context's Done channel is closed when the deadline expires, when the returned // cancel function is called, or when the parent context's Done channel is // closed, whichever happens first. diff --git a/vendor/golang.org/x/net/context/go19.go b/vendor/golang.org/x/net/context/go19.go new file mode 100644 index 0000000000000..d88bd1db127dd --- /dev/null +++ b/vendor/golang.org/x/net/context/go19.go @@ -0,0 +1,20 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.9 + +package context + +import "context" // standard library's context, as of Go 1.7 + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context = context.Context + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc = context.CancelFunc diff --git a/vendor/golang.org/x/net/context/pre_go17.go b/vendor/golang.org/x/net/context/pre_go17.go index 5a30acabd03c3..0f35592df5188 100644 --- a/vendor/golang.org/x/net/context/pre_go17.go +++ b/vendor/golang.org/x/net/context/pre_go17.go @@ -13,7 +13,7 @@ import ( "time" ) -// An emptyCtx is never canceled, has no values, and has no deadline. It is not +// An emptyCtx is never canceled, has no values, and has no deadline. It is not // struct{}, since vars of this type must have distinct addresses. type emptyCtx int @@ -104,7 +104,7 @@ func propagateCancel(parent Context, child canceler) { } // parentCancelCtx follows a chain of parent references until it finds a -// *cancelCtx. This function understands how each of the concrete types in this +// *cancelCtx. This function understands how each of the concrete types in this // package represents its parent. func parentCancelCtx(parent Context) (*cancelCtx, bool) { for { @@ -134,14 +134,14 @@ func removeChild(parent Context, child canceler) { p.mu.Unlock() } -// A canceler is a context type that can be canceled directly. The +// A canceler is a context type that can be canceled directly. The // implementations are *cancelCtx and *timerCtx. type canceler interface { cancel(removeFromParent bool, err error) Done() <-chan struct{} } -// A cancelCtx can be canceled. When canceled, it also cancels any children +// A cancelCtx can be canceled. When canceled, it also cancels any children // that implement canceler. type cancelCtx struct { Context @@ -193,8 +193,8 @@ func (c *cancelCtx) cancel(removeFromParent bool, err error) { } // WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned // context's Done channel is closed when the deadline expires, when the returned // cancel function is called, or when the parent context's Done channel is // closed, whichever happens first. @@ -226,8 +226,8 @@ func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { return c, func() { c.cancel(true, Canceled) } } -// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to -// implement Done and Err. It implements cancel by stopping its timer then +// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to +// implement Done and Err. It implements cancel by stopping its timer then // delegating to cancelCtx.cancel. type timerCtx struct { *cancelCtx @@ -281,7 +281,7 @@ func WithValue(parent Context, key interface{}, val interface{}) Context { return &valueCtx{parent, key, val} } -// A valueCtx carries a key-value pair. It implements Value for that key and +// A valueCtx carries a key-value pair. It implements Value for that key and // delegates all other calls to the embedded Context. type valueCtx struct { Context diff --git a/vendor/golang.org/x/net/context/pre_go19.go b/vendor/golang.org/x/net/context/pre_go19.go new file mode 100644 index 0000000000000..b105f80be4fe2 --- /dev/null +++ b/vendor/golang.org/x/net/context/pre_go19.go @@ -0,0 +1,109 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.9 + +package context + +import "time" + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context interface { + // Deadline returns the time when work done on behalf of this context + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. + Deadline() (deadline time.Time, ok bool) + + // Done returns a channel that's closed when work done on behalf of this + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. + // + // WithCancel arranges for Done to be closed when cancel is called; + // WithDeadline arranges for Done to be closed when the deadline + // expires; WithTimeout arranges for Done to be closed when the timeout + // elapses. + // + // Done is provided for use in select statements: + // + // // Stream generates values with DoSomething and sends them to out + // // until DoSomething returns an error or ctx.Done is closed. + // func Stream(ctx context.Context, out chan<- Value) error { + // for { + // v, err := DoSomething(ctx) + // if err != nil { + // return err + // } + // select { + // case <-ctx.Done(): + // return ctx.Err() + // case out <- v: + // } + // } + // } + // + // See http://blog.golang.org/pipelines for more examples of how to use + // a Done channel for cancelation. + Done() <-chan struct{} + + // Err returns a non-nil error value after Done is closed. Err returns + // Canceled if the context was canceled or DeadlineExceeded if the + // context's deadline passed. No other values for Err are defined. + // After Done is closed, successive calls to Err return the same value. + Err() error + + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. Successive calls to Value with + // the same key returns the same result. + // + // Use context values only for request-scoped data that transits + // processes and API boundaries, not for passing optional parameters to + // functions. + // + // A key identifies a specific value in a Context. Functions that wish + // to store values in Context typically allocate a key in a global + // variable then use that key as the argument to context.WithValue and + // Context.Value. A key can be any type that supports equality; + // packages should define keys as an unexported type to avoid + // collisions. + // + // Packages that define a Context key should provide type-safe accessors + // for the values stores using that key: + // + // // Package user defines a User type that's stored in Contexts. + // package user + // + // import "golang.org/x/net/context" + // + // // User is the type of value stored in the Contexts. + // type User struct {...} + // + // // key is an unexported type for keys defined in this package. + // // This prevents collisions with keys defined in other packages. + // type key int + // + // // userKey is the key for user.User values in Contexts. It is + // // unexported; clients use user.NewContext and user.FromContext + // // instead of using this key directly. + // var userKey key = 0 + // + // // NewContext returns a new Context that carries value u. + // func NewContext(ctx context.Context, u *User) context.Context { + // return context.WithValue(ctx, userKey, u) + // } + // + // // FromContext returns the User value stored in ctx, if any. + // func FromContext(ctx context.Context) (*User, bool) { + // u, ok := ctx.Value(userKey).(*User) + // return u, ok + // } + Value(key interface{}) interface{} +} + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc func() diff --git a/vendor/golang.org/x/net/http2/BUILD b/vendor/golang.org/x/net/http2/BUILD index 0a361dc209bdd..0fedd97ebebbe 100644 --- a/vendor/golang.org/x/net/http2/BUILD +++ b/vendor/golang.org/x/net/http2/BUILD @@ -3,22 +3,25 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ + "ciphers.go", "client_conn_pool.go", "configure_transport.go", + "databuffer.go", "errors.go", - "fixed_buffer.go", "flow.go", "frame.go", "go16.go", "go17.go", "go17_not18.go", "go18.go", + "go19.go", "gotrack.go", "headermap.go", "http2.go", "not_go16.go", "not_go17.go", "not_go18.go", + "not_go19.go", "pipe.go", "server.go", "transport.go", diff --git a/vendor/golang.org/x/net/http2/ciphers.go b/vendor/golang.org/x/net/http2/ciphers.go new file mode 100644 index 0000000000000..698860b77755d --- /dev/null +++ b/vendor/golang.org/x/net/http2/ciphers.go @@ -0,0 +1,641 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package http2 + +// A list of the possible cipher suite ids. Taken from +// http://www.iana.org/assignments/tls-parameters/tls-parameters.txt + +const ( + cipher_TLS_NULL_WITH_NULL_NULL uint16 = 0x0000 + cipher_TLS_RSA_WITH_NULL_MD5 uint16 = 0x0001 + cipher_TLS_RSA_WITH_NULL_SHA uint16 = 0x0002 + cipher_TLS_RSA_EXPORT_WITH_RC4_40_MD5 uint16 = 0x0003 + cipher_TLS_RSA_WITH_RC4_128_MD5 uint16 = 0x0004 + cipher_TLS_RSA_WITH_RC4_128_SHA uint16 = 0x0005 + cipher_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 uint16 = 0x0006 + cipher_TLS_RSA_WITH_IDEA_CBC_SHA uint16 = 0x0007 + cipher_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0008 + cipher_TLS_RSA_WITH_DES_CBC_SHA uint16 = 0x0009 + cipher_TLS_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x000A + cipher_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x000B + cipher_TLS_DH_DSS_WITH_DES_CBC_SHA uint16 = 0x000C + cipher_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA uint16 = 0x000D + cipher_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x000E + cipher_TLS_DH_RSA_WITH_DES_CBC_SHA uint16 = 0x000F + cipher_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x0010 + cipher_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0011 + cipher_TLS_DHE_DSS_WITH_DES_CBC_SHA uint16 = 0x0012 + cipher_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA uint16 = 0x0013 + cipher_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0014 + cipher_TLS_DHE_RSA_WITH_DES_CBC_SHA uint16 = 0x0015 + cipher_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x0016 + cipher_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 uint16 = 0x0017 + cipher_TLS_DH_anon_WITH_RC4_128_MD5 uint16 = 0x0018 + cipher_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA uint16 = 0x0019 + cipher_TLS_DH_anon_WITH_DES_CBC_SHA uint16 = 0x001A + cipher_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA uint16 = 0x001B + // Reserved uint16 = 0x001C-1D + cipher_TLS_KRB5_WITH_DES_CBC_SHA uint16 = 0x001E + cipher_TLS_KRB5_WITH_3DES_EDE_CBC_SHA uint16 = 0x001F + cipher_TLS_KRB5_WITH_RC4_128_SHA uint16 = 0x0020 + cipher_TLS_KRB5_WITH_IDEA_CBC_SHA uint16 = 0x0021 + cipher_TLS_KRB5_WITH_DES_CBC_MD5 uint16 = 0x0022 + cipher_TLS_KRB5_WITH_3DES_EDE_CBC_MD5 uint16 = 0x0023 + cipher_TLS_KRB5_WITH_RC4_128_MD5 uint16 = 0x0024 + cipher_TLS_KRB5_WITH_IDEA_CBC_MD5 uint16 = 0x0025 + cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA uint16 = 0x0026 + cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA uint16 = 0x0027 + cipher_TLS_KRB5_EXPORT_WITH_RC4_40_SHA uint16 = 0x0028 + cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 uint16 = 0x0029 + cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 uint16 = 0x002A + cipher_TLS_KRB5_EXPORT_WITH_RC4_40_MD5 uint16 = 0x002B + cipher_TLS_PSK_WITH_NULL_SHA uint16 = 0x002C + cipher_TLS_DHE_PSK_WITH_NULL_SHA uint16 = 0x002D + cipher_TLS_RSA_PSK_WITH_NULL_SHA uint16 = 0x002E + cipher_TLS_RSA_WITH_AES_128_CBC_SHA uint16 = 0x002F + cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA uint16 = 0x0030 + cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA uint16 = 0x0031 + cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA uint16 = 0x0032 + cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0x0033 + cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA uint16 = 0x0034 + cipher_TLS_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0035 + cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA uint16 = 0x0036 + cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0037 + cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA uint16 = 0x0038 + cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0039 + cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA uint16 = 0x003A + cipher_TLS_RSA_WITH_NULL_SHA256 uint16 = 0x003B + cipher_TLS_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003C + cipher_TLS_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x003D + cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA256 uint16 = 0x003E + cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003F + cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 uint16 = 0x0040 + cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0041 + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0042 + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0043 + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0044 + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0045 + cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA uint16 = 0x0046 + // Reserved uint16 = 0x0047-4F + // Reserved uint16 = 0x0050-58 + // Reserved uint16 = 0x0059-5C + // Unassigned uint16 = 0x005D-5F + // Reserved uint16 = 0x0060-66 + cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x0067 + cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA256 uint16 = 0x0068 + cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x0069 + cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 uint16 = 0x006A + cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 uint16 = 0x006B + cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA256 uint16 = 0x006C + cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA256 uint16 = 0x006D + // Unassigned uint16 = 0x006E-83 + cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0084 + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0085 + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0086 + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0087 + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0088 + cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA uint16 = 0x0089 + cipher_TLS_PSK_WITH_RC4_128_SHA uint16 = 0x008A + cipher_TLS_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0x008B + cipher_TLS_PSK_WITH_AES_128_CBC_SHA uint16 = 0x008C + cipher_TLS_PSK_WITH_AES_256_CBC_SHA uint16 = 0x008D + cipher_TLS_DHE_PSK_WITH_RC4_128_SHA uint16 = 0x008E + cipher_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0x008F + cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA uint16 = 0x0090 + cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA uint16 = 0x0091 + cipher_TLS_RSA_PSK_WITH_RC4_128_SHA uint16 = 0x0092 + cipher_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0x0093 + cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA uint16 = 0x0094 + cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA uint16 = 0x0095 + cipher_TLS_RSA_WITH_SEED_CBC_SHA uint16 = 0x0096 + cipher_TLS_DH_DSS_WITH_SEED_CBC_SHA uint16 = 0x0097 + cipher_TLS_DH_RSA_WITH_SEED_CBC_SHA uint16 = 0x0098 + cipher_TLS_DHE_DSS_WITH_SEED_CBC_SHA uint16 = 0x0099 + cipher_TLS_DHE_RSA_WITH_SEED_CBC_SHA uint16 = 0x009A + cipher_TLS_DH_anon_WITH_SEED_CBC_SHA uint16 = 0x009B + cipher_TLS_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009C + cipher_TLS_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009D + cipher_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009E + cipher_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009F + cipher_TLS_DH_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x00A0 + cipher_TLS_DH_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x00A1 + cipher_TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 uint16 = 0x00A2 + cipher_TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 uint16 = 0x00A3 + cipher_TLS_DH_DSS_WITH_AES_128_GCM_SHA256 uint16 = 0x00A4 + cipher_TLS_DH_DSS_WITH_AES_256_GCM_SHA384 uint16 = 0x00A5 + cipher_TLS_DH_anon_WITH_AES_128_GCM_SHA256 uint16 = 0x00A6 + cipher_TLS_DH_anon_WITH_AES_256_GCM_SHA384 uint16 = 0x00A7 + cipher_TLS_PSK_WITH_AES_128_GCM_SHA256 uint16 = 0x00A8 + cipher_TLS_PSK_WITH_AES_256_GCM_SHA384 uint16 = 0x00A9 + cipher_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 uint16 = 0x00AA + cipher_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 uint16 = 0x00AB + cipher_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 uint16 = 0x00AC + cipher_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 uint16 = 0x00AD + cipher_TLS_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0x00AE + cipher_TLS_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0x00AF + cipher_TLS_PSK_WITH_NULL_SHA256 uint16 = 0x00B0 + cipher_TLS_PSK_WITH_NULL_SHA384 uint16 = 0x00B1 + cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0x00B2 + cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0x00B3 + cipher_TLS_DHE_PSK_WITH_NULL_SHA256 uint16 = 0x00B4 + cipher_TLS_DHE_PSK_WITH_NULL_SHA384 uint16 = 0x00B5 + cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0x00B6 + cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0x00B7 + cipher_TLS_RSA_PSK_WITH_NULL_SHA256 uint16 = 0x00B8 + cipher_TLS_RSA_PSK_WITH_NULL_SHA384 uint16 = 0x00B9 + cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BA + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BB + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BC + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BD + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BE + cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0x00BF + cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C0 + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C1 + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C2 + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C3 + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C4 + cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 uint16 = 0x00C5 + // Unassigned uint16 = 0x00C6-FE + cipher_TLS_EMPTY_RENEGOTIATION_INFO_SCSV uint16 = 0x00FF + // Unassigned uint16 = 0x01-55,* + cipher_TLS_FALLBACK_SCSV uint16 = 0x5600 + // Unassigned uint16 = 0x5601 - 0xC000 + cipher_TLS_ECDH_ECDSA_WITH_NULL_SHA uint16 = 0xC001 + cipher_TLS_ECDH_ECDSA_WITH_RC4_128_SHA uint16 = 0xC002 + cipher_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC003 + cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA uint16 = 0xC004 + cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA uint16 = 0xC005 + cipher_TLS_ECDHE_ECDSA_WITH_NULL_SHA uint16 = 0xC006 + cipher_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA uint16 = 0xC007 + cipher_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC008 + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA uint16 = 0xC009 + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA uint16 = 0xC00A + cipher_TLS_ECDH_RSA_WITH_NULL_SHA uint16 = 0xC00B + cipher_TLS_ECDH_RSA_WITH_RC4_128_SHA uint16 = 0xC00C + cipher_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC00D + cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA uint16 = 0xC00E + cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA uint16 = 0xC00F + cipher_TLS_ECDHE_RSA_WITH_NULL_SHA uint16 = 0xC010 + cipher_TLS_ECDHE_RSA_WITH_RC4_128_SHA uint16 = 0xC011 + cipher_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC012 + cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0xC013 + cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0xC014 + cipher_TLS_ECDH_anon_WITH_NULL_SHA uint16 = 0xC015 + cipher_TLS_ECDH_anon_WITH_RC4_128_SHA uint16 = 0xC016 + cipher_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA uint16 = 0xC017 + cipher_TLS_ECDH_anon_WITH_AES_128_CBC_SHA uint16 = 0xC018 + cipher_TLS_ECDH_anon_WITH_AES_256_CBC_SHA uint16 = 0xC019 + cipher_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC01A + cipher_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xC01B + cipher_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA uint16 = 0xC01C + cipher_TLS_SRP_SHA_WITH_AES_128_CBC_SHA uint16 = 0xC01D + cipher_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA uint16 = 0xC01E + cipher_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA uint16 = 0xC01F + cipher_TLS_SRP_SHA_WITH_AES_256_CBC_SHA uint16 = 0xC020 + cipher_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA uint16 = 0xC021 + cipher_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA uint16 = 0xC022 + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC023 + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC024 + cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC025 + cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC026 + cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC027 + cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC028 + cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xC029 + cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 uint16 = 0xC02A + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC02B + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC02C + cipher_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC02D + cipher_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC02E + cipher_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC02F + cipher_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC030 + cipher_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xC031 + cipher_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xC032 + cipher_TLS_ECDHE_PSK_WITH_RC4_128_SHA uint16 = 0xC033 + cipher_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA uint16 = 0xC034 + cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA uint16 = 0xC035 + cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA uint16 = 0xC036 + cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 uint16 = 0xC037 + cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 uint16 = 0xC038 + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA uint16 = 0xC039 + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA256 uint16 = 0xC03A + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA384 uint16 = 0xC03B + cipher_TLS_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC03C + cipher_TLS_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC03D + cipher_TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC03E + cipher_TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC03F + cipher_TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC040 + cipher_TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC041 + cipher_TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC042 + cipher_TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC043 + cipher_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC044 + cipher_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC045 + cipher_TLS_DH_anon_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC046 + cipher_TLS_DH_anon_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC047 + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC048 + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC049 + cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC04A + cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC04B + cipher_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC04C + cipher_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC04D + cipher_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC04E + cipher_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC04F + cipher_TLS_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC050 + cipher_TLS_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC051 + cipher_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC052 + cipher_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC053 + cipher_TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC054 + cipher_TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC055 + cipher_TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC056 + cipher_TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC057 + cipher_TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC058 + cipher_TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC059 + cipher_TLS_DH_anon_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC05A + cipher_TLS_DH_anon_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC05B + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC05C + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC05D + cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC05E + cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC05F + cipher_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC060 + cipher_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC061 + cipher_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC062 + cipher_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC063 + cipher_TLS_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC064 + cipher_TLS_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC065 + cipher_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC066 + cipher_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC067 + cipher_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC068 + cipher_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC069 + cipher_TLS_PSK_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC06A + cipher_TLS_PSK_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC06B + cipher_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC06C + cipher_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC06D + cipher_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 uint16 = 0xC06E + cipher_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 uint16 = 0xC06F + cipher_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 uint16 = 0xC070 + cipher_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 uint16 = 0xC071 + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC072 + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC073 + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC074 + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC075 + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC076 + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC077 + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC078 + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC079 + cipher_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC07A + cipher_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC07B + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC07C + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC07D + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC07E + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC07F + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC080 + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC081 + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC082 + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC083 + cipher_TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC084 + cipher_TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC085 + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC086 + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC087 + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC088 + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC089 + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC08A + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC08B + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC08C + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC08D + cipher_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC08E + cipher_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC08F + cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC090 + cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC091 + cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 uint16 = 0xC092 + cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 uint16 = 0xC093 + cipher_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC094 + cipher_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC095 + cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC096 + cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC097 + cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC098 + cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC099 + cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 uint16 = 0xC09A + cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 uint16 = 0xC09B + cipher_TLS_RSA_WITH_AES_128_CCM uint16 = 0xC09C + cipher_TLS_RSA_WITH_AES_256_CCM uint16 = 0xC09D + cipher_TLS_DHE_RSA_WITH_AES_128_CCM uint16 = 0xC09E + cipher_TLS_DHE_RSA_WITH_AES_256_CCM uint16 = 0xC09F + cipher_TLS_RSA_WITH_AES_128_CCM_8 uint16 = 0xC0A0 + cipher_TLS_RSA_WITH_AES_256_CCM_8 uint16 = 0xC0A1 + cipher_TLS_DHE_RSA_WITH_AES_128_CCM_8 uint16 = 0xC0A2 + cipher_TLS_DHE_RSA_WITH_AES_256_CCM_8 uint16 = 0xC0A3 + cipher_TLS_PSK_WITH_AES_128_CCM uint16 = 0xC0A4 + cipher_TLS_PSK_WITH_AES_256_CCM uint16 = 0xC0A5 + cipher_TLS_DHE_PSK_WITH_AES_128_CCM uint16 = 0xC0A6 + cipher_TLS_DHE_PSK_WITH_AES_256_CCM uint16 = 0xC0A7 + cipher_TLS_PSK_WITH_AES_128_CCM_8 uint16 = 0xC0A8 + cipher_TLS_PSK_WITH_AES_256_CCM_8 uint16 = 0xC0A9 + cipher_TLS_PSK_DHE_WITH_AES_128_CCM_8 uint16 = 0xC0AA + cipher_TLS_PSK_DHE_WITH_AES_256_CCM_8 uint16 = 0xC0AB + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CCM uint16 = 0xC0AC + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CCM uint16 = 0xC0AD + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 uint16 = 0xC0AE + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 uint16 = 0xC0AF + // Unassigned uint16 = 0xC0B0-FF + // Unassigned uint16 = 0xC1-CB,* + // Unassigned uint16 = 0xCC00-A7 + cipher_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCA8 + cipher_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCA9 + cipher_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAA + cipher_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAB + cipher_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAC + cipher_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAD + cipher_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 uint16 = 0xCCAE +) + +// isBadCipher reports whether the cipher is blacklisted by the HTTP/2 spec. +// References: +// https://tools.ietf.org/html/rfc7540#appendix-A +// Reject cipher suites from Appendix A. +// "This list includes those cipher suites that do not +// offer an ephemeral key exchange and those that are +// based on the TLS null, stream or block cipher type" +func isBadCipher(cipher uint16) bool { + switch cipher { + case cipher_TLS_NULL_WITH_NULL_NULL, + cipher_TLS_RSA_WITH_NULL_MD5, + cipher_TLS_RSA_WITH_NULL_SHA, + cipher_TLS_RSA_EXPORT_WITH_RC4_40_MD5, + cipher_TLS_RSA_WITH_RC4_128_MD5, + cipher_TLS_RSA_WITH_RC4_128_SHA, + cipher_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5, + cipher_TLS_RSA_WITH_IDEA_CBC_SHA, + cipher_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_RSA_WITH_DES_CBC_SHA, + cipher_TLS_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DH_DSS_WITH_DES_CBC_SHA, + cipher_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DH_RSA_WITH_DES_CBC_SHA, + cipher_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_DES_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_DES_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5, + cipher_TLS_DH_anon_WITH_RC4_128_MD5, + cipher_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA, + cipher_TLS_DH_anon_WITH_DES_CBC_SHA, + cipher_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_KRB5_WITH_DES_CBC_SHA, + cipher_TLS_KRB5_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_KRB5_WITH_RC4_128_SHA, + cipher_TLS_KRB5_WITH_IDEA_CBC_SHA, + cipher_TLS_KRB5_WITH_DES_CBC_MD5, + cipher_TLS_KRB5_WITH_3DES_EDE_CBC_MD5, + cipher_TLS_KRB5_WITH_RC4_128_MD5, + cipher_TLS_KRB5_WITH_IDEA_CBC_MD5, + cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA, + cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA, + cipher_TLS_KRB5_EXPORT_WITH_RC4_40_SHA, + cipher_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5, + cipher_TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5, + cipher_TLS_KRB5_EXPORT_WITH_RC4_40_MD5, + cipher_TLS_PSK_WITH_NULL_SHA, + cipher_TLS_DHE_PSK_WITH_NULL_SHA, + cipher_TLS_RSA_PSK_WITH_NULL_SHA, + cipher_TLS_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA, + cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA, + cipher_TLS_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA, + cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA, + cipher_TLS_RSA_WITH_NULL_SHA256, + cipher_TLS_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_RSA_WITH_AES_256_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_AES_128_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_AES_256_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_AES_256_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + cipher_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + cipher_TLS_DH_anon_WITH_AES_128_CBC_SHA256, + cipher_TLS_DH_anon_WITH_AES_256_CBC_SHA256, + cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA, + cipher_TLS_PSK_WITH_RC4_128_SHA, + cipher_TLS_PSK_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_PSK_WITH_AES_128_CBC_SHA, + cipher_TLS_PSK_WITH_AES_256_CBC_SHA, + cipher_TLS_DHE_PSK_WITH_RC4_128_SHA, + cipher_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, + cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, + cipher_TLS_RSA_PSK_WITH_RC4_128_SHA, + cipher_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, + cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, + cipher_TLS_RSA_WITH_SEED_CBC_SHA, + cipher_TLS_DH_DSS_WITH_SEED_CBC_SHA, + cipher_TLS_DH_RSA_WITH_SEED_CBC_SHA, + cipher_TLS_DHE_DSS_WITH_SEED_CBC_SHA, + cipher_TLS_DHE_RSA_WITH_SEED_CBC_SHA, + cipher_TLS_DH_anon_WITH_SEED_CBC_SHA, + cipher_TLS_RSA_WITH_AES_128_GCM_SHA256, + cipher_TLS_RSA_WITH_AES_256_GCM_SHA384, + cipher_TLS_DH_RSA_WITH_AES_128_GCM_SHA256, + cipher_TLS_DH_RSA_WITH_AES_256_GCM_SHA384, + cipher_TLS_DH_DSS_WITH_AES_128_GCM_SHA256, + cipher_TLS_DH_DSS_WITH_AES_256_GCM_SHA384, + cipher_TLS_DH_anon_WITH_AES_128_GCM_SHA256, + cipher_TLS_DH_anon_WITH_AES_256_GCM_SHA384, + cipher_TLS_PSK_WITH_AES_128_GCM_SHA256, + cipher_TLS_PSK_WITH_AES_256_GCM_SHA384, + cipher_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, + cipher_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, + cipher_TLS_PSK_WITH_AES_128_CBC_SHA256, + cipher_TLS_PSK_WITH_AES_256_CBC_SHA384, + cipher_TLS_PSK_WITH_NULL_SHA256, + cipher_TLS_PSK_WITH_NULL_SHA384, + cipher_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, + cipher_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, + cipher_TLS_DHE_PSK_WITH_NULL_SHA256, + cipher_TLS_DHE_PSK_WITH_NULL_SHA384, + cipher_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, + cipher_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, + cipher_TLS_RSA_PSK_WITH_NULL_SHA256, + cipher_TLS_RSA_PSK_WITH_NULL_SHA384, + cipher_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256, + cipher_TLS_EMPTY_RENEGOTIATION_INFO_SCSV, + cipher_TLS_ECDH_ECDSA_WITH_NULL_SHA, + cipher_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, + cipher_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_NULL_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDH_RSA_WITH_NULL_SHA, + cipher_TLS_ECDH_RSA_WITH_RC4_128_SHA, + cipher_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDHE_RSA_WITH_NULL_SHA, + cipher_TLS_ECDHE_RSA_WITH_RC4_128_SHA, + cipher_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDH_anon_WITH_NULL_SHA, + cipher_TLS_ECDH_anon_WITH_RC4_128_SHA, + cipher_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDH_anon_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDH_anon_WITH_AES_256_CBC_SHA, + cipher_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_SRP_SHA_WITH_AES_128_CBC_SHA, + cipher_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA, + cipher_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA, + cipher_TLS_SRP_SHA_WITH_AES_256_CBC_SHA, + cipher_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA, + cipher_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, + cipher_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, + cipher_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, + cipher_TLS_ECDHE_PSK_WITH_RC4_128_SHA, + cipher_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, + cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, + cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, + cipher_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, + cipher_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA, + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA256, + cipher_TLS_ECDHE_PSK_WITH_NULL_SHA384, + cipher_TLS_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DH_anon_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DH_anon_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_RSA_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_RSA_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_DH_anon_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_DH_anon_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_PSK_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_PSK_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_PSK_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_PSK_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, + cipher_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, + cipher_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, + cipher_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, + cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, + cipher_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, + cipher_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, + cipher_TLS_RSA_WITH_AES_128_CCM, + cipher_TLS_RSA_WITH_AES_256_CCM, + cipher_TLS_RSA_WITH_AES_128_CCM_8, + cipher_TLS_RSA_WITH_AES_256_CCM_8, + cipher_TLS_PSK_WITH_AES_128_CCM, + cipher_TLS_PSK_WITH_AES_256_CCM, + cipher_TLS_PSK_WITH_AES_128_CCM_8, + cipher_TLS_PSK_WITH_AES_256_CCM_8: + return true + default: + return false + } +} diff --git a/vendor/golang.org/x/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go index b13941258a35c..bdf5652b01ce6 100644 --- a/vendor/golang.org/x/net/http2/client_conn_pool.go +++ b/vendor/golang.org/x/net/http2/client_conn_pool.go @@ -247,7 +247,7 @@ func filterOutClientConn(in []*ClientConn, exclude *ClientConn) []*ClientConn { } // noDialClientConnPool is an implementation of http2.ClientConnPool -// which never dials. We let the HTTP/1.1 client dial and use its TLS +// which never dials. We let the HTTP/1.1 client dial and use its TLS // connection instead. type noDialClientConnPool struct{ *clientConnPool } diff --git a/vendor/golang.org/x/net/http2/configure_transport.go b/vendor/golang.org/x/net/http2/configure_transport.go index 4f720f530b009..b65fc6d423d3d 100644 --- a/vendor/golang.org/x/net/http2/configure_transport.go +++ b/vendor/golang.org/x/net/http2/configure_transport.go @@ -56,7 +56,7 @@ func configureTransport(t1 *http.Transport) (*Transport, error) { } // registerHTTPSProtocol calls Transport.RegisterProtocol but -// convering panics into errors. +// converting panics into errors. func registerHTTPSProtocol(t *http.Transport, rt http.RoundTripper) (err error) { defer func() { if e := recover(); e != nil { diff --git a/vendor/golang.org/x/net/http2/databuffer.go b/vendor/golang.org/x/net/http2/databuffer.go new file mode 100644 index 0000000000000..a3067f8de7413 --- /dev/null +++ b/vendor/golang.org/x/net/http2/databuffer.go @@ -0,0 +1,146 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package http2 + +import ( + "errors" + "fmt" + "sync" +) + +// Buffer chunks are allocated from a pool to reduce pressure on GC. +// The maximum wasted space per dataBuffer is 2x the largest size class, +// which happens when the dataBuffer has multiple chunks and there is +// one unread byte in both the first and last chunks. We use a few size +// classes to minimize overheads for servers that typically receive very +// small request bodies. +// +// TODO: Benchmark to determine if the pools are necessary. The GC may have +// improved enough that we can instead allocate chunks like this: +// make([]byte, max(16<<10, expectedBytesRemaining)) +var ( + dataChunkSizeClasses = []int{ + 1 << 10, + 2 << 10, + 4 << 10, + 8 << 10, + 16 << 10, + } + dataChunkPools = [...]sync.Pool{ + {New: func() interface{} { return make([]byte, 1<<10) }}, + {New: func() interface{} { return make([]byte, 2<<10) }}, + {New: func() interface{} { return make([]byte, 4<<10) }}, + {New: func() interface{} { return make([]byte, 8<<10) }}, + {New: func() interface{} { return make([]byte, 16<<10) }}, + } +) + +func getDataBufferChunk(size int64) []byte { + i := 0 + for ; i < len(dataChunkSizeClasses)-1; i++ { + if size <= int64(dataChunkSizeClasses[i]) { + break + } + } + return dataChunkPools[i].Get().([]byte) +} + +func putDataBufferChunk(p []byte) { + for i, n := range dataChunkSizeClasses { + if len(p) == n { + dataChunkPools[i].Put(p) + return + } + } + panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) +} + +// dataBuffer is an io.ReadWriter backed by a list of data chunks. +// Each dataBuffer is used to read DATA frames on a single stream. +// The buffer is divided into chunks so the server can limit the +// total memory used by a single connection without limiting the +// request body size on any single stream. +type dataBuffer struct { + chunks [][]byte + r int // next byte to read is chunks[0][r] + w int // next byte to write is chunks[len(chunks)-1][w] + size int // total buffered bytes + expected int64 // we expect at least this many bytes in future Write calls (ignored if <= 0) +} + +var errReadEmpty = errors.New("read from empty dataBuffer") + +// Read copies bytes from the buffer into p. +// It is an error to read when no data is available. +func (b *dataBuffer) Read(p []byte) (int, error) { + if b.size == 0 { + return 0, errReadEmpty + } + var ntotal int + for len(p) > 0 && b.size > 0 { + readFrom := b.bytesFromFirstChunk() + n := copy(p, readFrom) + p = p[n:] + ntotal += n + b.r += n + b.size -= n + // If the first chunk has been consumed, advance to the next chunk. + if b.r == len(b.chunks[0]) { + putDataBufferChunk(b.chunks[0]) + end := len(b.chunks) - 1 + copy(b.chunks[:end], b.chunks[1:]) + b.chunks[end] = nil + b.chunks = b.chunks[:end] + b.r = 0 + } + } + return ntotal, nil +} + +func (b *dataBuffer) bytesFromFirstChunk() []byte { + if len(b.chunks) == 1 { + return b.chunks[0][b.r:b.w] + } + return b.chunks[0][b.r:] +} + +// Len returns the number of bytes of the unread portion of the buffer. +func (b *dataBuffer) Len() int { + return b.size +} + +// Write appends p to the buffer. +func (b *dataBuffer) Write(p []byte) (int, error) { + ntotal := len(p) + for len(p) > 0 { + // If the last chunk is empty, allocate a new chunk. Try to allocate + // enough to fully copy p plus any additional bytes we expect to + // receive. However, this may allocate less than len(p). + want := int64(len(p)) + if b.expected > want { + want = b.expected + } + chunk := b.lastChunkOrAlloc(want) + n := copy(chunk[b.w:], p) + p = p[n:] + b.w += n + b.size += n + b.expected -= int64(n) + } + return ntotal, nil +} + +func (b *dataBuffer) lastChunkOrAlloc(want int64) []byte { + if len(b.chunks) != 0 { + last := b.chunks[len(b.chunks)-1] + if b.w < len(last) { + return last + } + } + chunk := getDataBufferChunk(want) + b.chunks = append(b.chunks, chunk) + b.w = 0 + return chunk +} diff --git a/vendor/golang.org/x/net/http2/errors.go b/vendor/golang.org/x/net/http2/errors.go index 20fd7626a56db..71f2c4631787e 100644 --- a/vendor/golang.org/x/net/http2/errors.go +++ b/vendor/golang.org/x/net/http2/errors.go @@ -87,13 +87,16 @@ type goAwayFlowError struct{} func (goAwayFlowError) Error() string { return "connection exceeded flow control window size" } -// connErrorReason wraps a ConnectionError with an informative error about why it occurs. - +// connError represents an HTTP/2 ConnectionError error code, along +// with a string (for debugging) explaining why. +// // Errors of this type are only returned by the frame parser functions -// and converted into ConnectionError(ErrCodeProtocol). +// and converted into ConnectionError(Code), after stashing away +// the Reason into the Framer's errDetail field, accessible via +// the (*Framer).ErrorDetail method. type connError struct { - Code ErrCode - Reason string + Code ErrCode // the ConnectionError error code + Reason string // additional reason } func (e connError) Error() string { diff --git a/vendor/golang.org/x/net/http2/fixed_buffer.go b/vendor/golang.org/x/net/http2/fixed_buffer.go deleted file mode 100644 index 47da0f0bf71f0..0000000000000 --- a/vendor/golang.org/x/net/http2/fixed_buffer.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package http2 - -import ( - "errors" -) - -// fixedBuffer is an io.ReadWriter backed by a fixed size buffer. -// It never allocates, but moves old data as new data is written. -type fixedBuffer struct { - buf []byte - r, w int -} - -var ( - errReadEmpty = errors.New("read from empty fixedBuffer") - errWriteFull = errors.New("write on full fixedBuffer") -) - -// Read copies bytes from the buffer into p. -// It is an error to read when no data is available. -func (b *fixedBuffer) Read(p []byte) (n int, err error) { - if b.r == b.w { - return 0, errReadEmpty - } - n = copy(p, b.buf[b.r:b.w]) - b.r += n - if b.r == b.w { - b.r = 0 - b.w = 0 - } - return n, nil -} - -// Len returns the number of bytes of the unread portion of the buffer. -func (b *fixedBuffer) Len() int { - return b.w - b.r -} - -// Write copies bytes from p into the buffer. -// It is an error to write more data than the buffer can hold. -func (b *fixedBuffer) Write(p []byte) (n int, err error) { - // Slide existing data to beginning. - if b.r > 0 && len(p) > len(b.buf)-b.w { - copy(b.buf, b.buf[b.r:b.w]) - b.w -= b.r - b.r = 0 - } - - // Write new data. - n = copy(b.buf[b.w:], p) - b.w += n - if n < len(p) { - err = errWriteFull - } - return n, err -} diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go index 358833fedfe48..3b14890728f5f 100644 --- a/vendor/golang.org/x/net/http2/frame.go +++ b/vendor/golang.org/x/net/http2/frame.go @@ -122,7 +122,7 @@ var flagName = map[FrameType]map[Flags]string{ // a frameParser parses a frame given its FrameHeader and payload // bytes. The length of payload will always equal fh.Length (which // might be 0). -type frameParser func(fh FrameHeader, payload []byte) (Frame, error) +type frameParser func(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) var frameParsers = map[FrameType]frameParser{ FrameData: parseDataFrame, @@ -312,7 +312,7 @@ type Framer struct { MaxHeaderListSize uint32 // TODO: track which type of frame & with which flags was sent - // last. Then return an error (unless AllowIllegalWrites) if + // last. Then return an error (unless AllowIllegalWrites) if // we're in the middle of a header block and a // non-Continuation or Continuation on a different stream is // attempted to be written. @@ -323,6 +323,8 @@ type Framer struct { debugFramerBuf *bytes.Buffer debugReadLoggerf func(string, ...interface{}) debugWriteLoggerf func(string, ...interface{}) + + frameCache *frameCache // nil if frames aren't reused (default) } func (fr *Framer) maxHeaderListSize() uint32 { @@ -398,6 +400,27 @@ const ( maxFrameSize = 1<<24 - 1 ) +// SetReuseFrames allows the Framer to reuse Frames. +// If called on a Framer, Frames returned by calls to ReadFrame are only +// valid until the next call to ReadFrame. +func (fr *Framer) SetReuseFrames() { + if fr.frameCache != nil { + return + } + fr.frameCache = &frameCache{} +} + +type frameCache struct { + dataFrame DataFrame +} + +func (fc *frameCache) getDataFrame() *DataFrame { + if fc == nil { + return &DataFrame{} + } + return &fc.dataFrame +} + // NewFramer returns a Framer that writes frames to w and reads them from r. func NewFramer(w io.Writer, r io.Reader) *Framer { fr := &Framer{ @@ -477,7 +500,7 @@ func (fr *Framer) ReadFrame() (Frame, error) { if _, err := io.ReadFull(fr.r, payload); err != nil { return nil, err } - f, err := typeFrameParser(fh.Type)(fh, payload) + f, err := typeFrameParser(fh.Type)(fr.frameCache, fh, payload) if err != nil { if ce, ok := err.(connError); ok { return nil, fr.connError(ce.Code, ce.Reason) @@ -565,7 +588,7 @@ func (f *DataFrame) Data() []byte { return f.data } -func parseDataFrame(fh FrameHeader, payload []byte) (Frame, error) { +func parseDataFrame(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) { if fh.StreamID == 0 { // DATA frames MUST be associated with a stream. If a // DATA frame is received whose stream identifier @@ -574,9 +597,9 @@ func parseDataFrame(fh FrameHeader, payload []byte) (Frame, error) { // PROTOCOL_ERROR. return nil, connError{ErrCodeProtocol, "DATA frame with stream ID 0"} } - f := &DataFrame{ - FrameHeader: fh, - } + f := fc.getDataFrame() + f.FrameHeader = fh + var padSize byte if fh.Flags.Has(FlagDataPadded) { var err error @@ -600,6 +623,7 @@ var ( errStreamID = errors.New("invalid stream ID") errDepStreamID = errors.New("invalid dependent stream ID") errPadLength = errors.New("pad length too large") + errPadBytes = errors.New("padding bytes must all be zeros unless AllowIllegalWrites is enabled") ) func validStreamIDOrZero(streamID uint32) bool { @@ -623,6 +647,7 @@ func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error { // // If pad is nil, the padding bit is not sent. // The length of pad must not exceed 255 bytes. +// The bytes of pad must all be zero, unless f.AllowIllegalWrites is set. // // It will perform exactly one Write to the underlying Writer. // It is the caller's responsibility not to violate the maximum frame size @@ -631,8 +656,18 @@ func (f *Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []by if !validStreamID(streamID) && !f.AllowIllegalWrites { return errStreamID } - if len(pad) > 255 { - return errPadLength + if len(pad) > 0 { + if len(pad) > 255 { + return errPadLength + } + if !f.AllowIllegalWrites { + for _, b := range pad { + if b != 0 { + // "Padding octets MUST be set to zero when sending." + return errPadBytes + } + } + } } var flags Flags if endStream { @@ -660,10 +695,10 @@ type SettingsFrame struct { p []byte } -func parseSettingsFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseSettingsFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if fh.Flags.Has(FlagSettingsAck) && fh.Length > 0 { // When this (ACK 0x1) bit is set, the payload of the - // SETTINGS frame MUST be empty. Receipt of a + // SETTINGS frame MUST be empty. Receipt of a // SETTINGS frame with the ACK flag set and a length // field value other than 0 MUST be treated as a // connection error (Section 5.4.1) of type @@ -672,7 +707,7 @@ func parseSettingsFrame(fh FrameHeader, p []byte) (Frame, error) { } if fh.StreamID != 0 { // SETTINGS frames always apply to a connection, - // never a single stream. The stream identifier for a + // never a single stream. The stream identifier for a // SETTINGS frame MUST be zero (0x0). If an endpoint // receives a SETTINGS frame whose stream identifier // field is anything other than 0x0, the endpoint MUST @@ -762,7 +797,7 @@ type PingFrame struct { func (f *PingFrame) IsAck() bool { return f.Flags.Has(FlagPingAck) } -func parsePingFrame(fh FrameHeader, payload []byte) (Frame, error) { +func parsePingFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) { if len(payload) != 8 { return nil, ConnectionError(ErrCodeFrameSize) } @@ -802,7 +837,7 @@ func (f *GoAwayFrame) DebugData() []byte { return f.debugData } -func parseGoAwayFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseGoAwayFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if fh.StreamID != 0 { return nil, ConnectionError(ErrCodeProtocol) } @@ -842,7 +877,7 @@ func (f *UnknownFrame) Payload() []byte { return f.p } -func parseUnknownFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseUnknownFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { return &UnknownFrame{fh, p}, nil } @@ -853,7 +888,7 @@ type WindowUpdateFrame struct { Increment uint32 // never read with high bit set } -func parseWindowUpdateFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseWindowUpdateFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if len(p) != 4 { return nil, ConnectionError(ErrCodeFrameSize) } @@ -918,12 +953,12 @@ func (f *HeadersFrame) HasPriority() bool { return f.FrameHeader.Flags.Has(FlagHeadersPriority) } -func parseHeadersFrame(fh FrameHeader, p []byte) (_ Frame, err error) { +func parseHeadersFrame(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) { hf := &HeadersFrame{ FrameHeader: fh, } if fh.StreamID == 0 { - // HEADERS frames MUST be associated with a stream. If a HEADERS frame + // HEADERS frames MUST be associated with a stream. If a HEADERS frame // is received whose stream identifier field is 0x0, the recipient MUST // respond with a connection error (Section 5.4.1) of type // PROTOCOL_ERROR. @@ -1045,7 +1080,7 @@ type PriorityParam struct { Exclusive bool // Weight is the stream's zero-indexed weight. It should be - // set together with StreamDep, or neither should be set. Per + // set together with StreamDep, or neither should be set. Per // the spec, "Add one to the value to obtain a weight between // 1 and 256." Weight uint8 @@ -1055,7 +1090,7 @@ func (p PriorityParam) IsZero() bool { return p == PriorityParam{} } -func parsePriorityFrame(fh FrameHeader, payload []byte) (Frame, error) { +func parsePriorityFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) { if fh.StreamID == 0 { return nil, connError{ErrCodeProtocol, "PRIORITY frame with stream ID 0"} } @@ -1102,7 +1137,7 @@ type RSTStreamFrame struct { ErrCode ErrCode } -func parseRSTStreamFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseRSTStreamFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if len(p) != 4 { return nil, ConnectionError(ErrCodeFrameSize) } @@ -1132,7 +1167,7 @@ type ContinuationFrame struct { headerFragBuf []byte } -func parseContinuationFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseContinuationFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if fh.StreamID == 0 { return nil, connError{ErrCodeProtocol, "CONTINUATION frame with stream ID 0"} } @@ -1182,7 +1217,7 @@ func (f *PushPromiseFrame) HeadersEnded() bool { return f.FrameHeader.Flags.Has(FlagPushPromiseEndHeaders) } -func parsePushPromise(fh FrameHeader, p []byte) (_ Frame, err error) { +func parsePushPromise(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) { pp := &PushPromiseFrame{ FrameHeader: fh, } diff --git a/vendor/golang.org/x/net/http2/go16.go b/vendor/golang.org/x/net/http2/go16.go index 2b72855f55210..00b2e9e3cf3ae 100644 --- a/vendor/golang.org/x/net/http2/go16.go +++ b/vendor/golang.org/x/net/http2/go16.go @@ -7,7 +7,6 @@ package http2 import ( - "crypto/tls" "net/http" "time" ) @@ -15,29 +14,3 @@ import ( func transportExpectContinueTimeout(t1 *http.Transport) time.Duration { return t1.ExpectContinueTimeout } - -// isBadCipher reports whether the cipher is blacklisted by the HTTP/2 spec. -func isBadCipher(cipher uint16) bool { - switch cipher { - case tls.TLS_RSA_WITH_RC4_128_SHA, - tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA, - tls.TLS_RSA_WITH_AES_128_CBC_SHA, - tls.TLS_RSA_WITH_AES_256_CBC_SHA, - tls.TLS_RSA_WITH_AES_128_GCM_SHA256, - tls.TLS_RSA_WITH_AES_256_GCM_SHA384, - tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, - tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, - tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: - // Reject cipher suites from Appendix A. - // "This list includes those cipher suites that do not - // offer an ephemeral key exchange and those that are - // based on the TLS null, stream or block cipher type" - return true - default: - return false - } -} diff --git a/vendor/golang.org/x/net/http2/go18.go b/vendor/golang.org/x/net/http2/go18.go index 633202c39fd11..4f30d228a889c 100644 --- a/vendor/golang.org/x/net/http2/go18.go +++ b/vendor/golang.org/x/net/http2/go18.go @@ -12,7 +12,11 @@ import ( "net/http" ) -func cloneTLSConfig(c *tls.Config) *tls.Config { return c.Clone() } +func cloneTLSConfig(c *tls.Config) *tls.Config { + c2 := c.Clone() + c2.GetClientCertificate = c.GetClientCertificate // golang.org/issue/19264 + return c2 +} var _ http.Pusher = (*responseWriter)(nil) @@ -48,3 +52,5 @@ func reqGetBody(req *http.Request) func() (io.ReadCloser, error) { func reqBodyIsNoBody(body io.ReadCloser) bool { return body == http.NoBody } + +func go18httpNoBody() io.ReadCloser { return http.NoBody } // for tests only diff --git a/vendor/golang.org/x/net/http2/go19.go b/vendor/golang.org/x/net/http2/go19.go new file mode 100644 index 0000000000000..38124ba56e259 --- /dev/null +++ b/vendor/golang.org/x/net/http2/go19.go @@ -0,0 +1,16 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.9 + +package http2 + +import ( + "net/http" +) + +func configureServer19(s *http.Server, conf *Server) error { + s.RegisterOnShutdown(conf.state.startGracefulShutdown) + return nil +} diff --git a/vendor/golang.org/x/net/http2/hpack/encode.go b/vendor/golang.org/x/net/http2/hpack/encode.go index f9bb033984835..54726c2a3c521 100644 --- a/vendor/golang.org/x/net/http2/hpack/encode.go +++ b/vendor/golang.org/x/net/http2/hpack/encode.go @@ -39,13 +39,14 @@ func NewEncoder(w io.Writer) *Encoder { tableSizeUpdate: false, w: w, } + e.dynTab.table.init() e.dynTab.setMaxSize(initialHeaderTableSize) return e } // WriteField encodes f into a single Write to e's underlying Writer. // This function may also produce bytes for "Header Table Size Update" -// if necessary. If produced, it is done before encoding f. +// if necessary. If produced, it is done before encoding f. func (e *Encoder) WriteField(f HeaderField) error { e.buf = e.buf[:0] @@ -88,29 +89,17 @@ func (e *Encoder) WriteField(f HeaderField) error { // only name matches, i points to that index and nameValueMatch // becomes false. func (e *Encoder) searchTable(f HeaderField) (i uint64, nameValueMatch bool) { - for idx, hf := range staticTable { - if !constantTimeStringCompare(hf.Name, f.Name) { - continue - } - if i == 0 { - i = uint64(idx + 1) - } - if f.Sensitive { - continue - } - if !constantTimeStringCompare(hf.Value, f.Value) { - continue - } - i = uint64(idx + 1) - nameValueMatch = true - return + i, nameValueMatch = staticTable.search(f) + if nameValueMatch { + return i, true } - j, nameValueMatch := e.dynTab.search(f) + j, nameValueMatch := e.dynTab.table.search(f) if nameValueMatch || (i == 0 && j != 0) { - i = j + uint64(len(staticTable)) + return j + uint64(staticTable.len()), nameValueMatch } - return + + return i, false } // SetMaxDynamicTableSize changes the dynamic header table size to v. diff --git a/vendor/golang.org/x/net/http2/hpack/hpack.go b/vendor/golang.org/x/net/http2/hpack/hpack.go index 135b9f62cd645..176644acdacec 100644 --- a/vendor/golang.org/x/net/http2/hpack/hpack.go +++ b/vendor/golang.org/x/net/http2/hpack/hpack.go @@ -61,7 +61,7 @@ func (hf HeaderField) String() string { func (hf HeaderField) Size() uint32 { // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1 // "The size of the dynamic table is the sum of the size of - // its entries. The size of an entry is the sum of its name's + // its entries. The size of an entry is the sum of its name's // length in octets (as defined in Section 5.2), its value's // length in octets (see Section 5.2), plus 32. The size of // an entry is calculated using the length of the name and @@ -102,6 +102,7 @@ func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decod emit: emitFunc, emitEnabled: true, } + d.dynTab.table.init() d.dynTab.allowedMaxSize = maxDynamicTableSize d.dynTab.setMaxSize(maxDynamicTableSize) return d @@ -154,12 +155,9 @@ func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) { } type dynamicTable struct { - // ents is the FIFO described at // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2 - // The newest (low index) is append at the end, and items are - // evicted from the front. - ents []HeaderField - size uint32 + table headerFieldTable + size uint32 // in bytes maxSize uint32 // current maxSize allowedMaxSize uint32 // maxSize may go up to this, inclusive } @@ -169,95 +167,45 @@ func (dt *dynamicTable) setMaxSize(v uint32) { dt.evict() } -// TODO: change dynamicTable to be a struct with a slice and a size int field, -// per http://http2.github.io/http2-spec/compression.html#rfc.section.4.1: -// -// -// Then make add increment the size. maybe the max size should move from Decoder to -// dynamicTable and add should return an ok bool if there was enough space. -// -// Later we'll need a remove operation on dynamicTable. - func (dt *dynamicTable) add(f HeaderField) { - dt.ents = append(dt.ents, f) + dt.table.addEntry(f) dt.size += f.Size() dt.evict() } -// If we're too big, evict old stuff (front of the slice) +// If we're too big, evict old stuff. func (dt *dynamicTable) evict() { - base := dt.ents // keep base pointer of slice - for dt.size > dt.maxSize { - dt.size -= dt.ents[0].Size() - dt.ents = dt.ents[1:] - } - - // Shift slice contents down if we evicted things. - if len(dt.ents) != len(base) { - copy(base, dt.ents) - dt.ents = base[:len(dt.ents)] + var n int + for dt.size > dt.maxSize && n < dt.table.len() { + dt.size -= dt.table.ents[n].Size() + n++ } -} - -// constantTimeStringCompare compares string a and b in a constant -// time manner. -func constantTimeStringCompare(a, b string) bool { - if len(a) != len(b) { - return false - } - - c := byte(0) - - for i := 0; i < len(a); i++ { - c |= a[i] ^ b[i] - } - - return c == 0 -} - -// Search searches f in the table. The return value i is 0 if there is -// no name match. If there is name match or name/value match, i is the -// index of that entry (1-based). If both name and value match, -// nameValueMatch becomes true. -func (dt *dynamicTable) search(f HeaderField) (i uint64, nameValueMatch bool) { - l := len(dt.ents) - for j := l - 1; j >= 0; j-- { - ent := dt.ents[j] - if !constantTimeStringCompare(ent.Name, f.Name) { - continue - } - if i == 0 { - i = uint64(l - j) - } - if f.Sensitive { - continue - } - if !constantTimeStringCompare(ent.Value, f.Value) { - continue - } - i = uint64(l - j) - nameValueMatch = true - return - } - return + dt.table.evictOldest(n) } func (d *Decoder) maxTableIndex() int { - return len(d.dynTab.ents) + len(staticTable) + // This should never overflow. RFC 7540 Section 6.5.2 limits the size of + // the dynamic table to 2^32 bytes, where each entry will occupy more than + // one byte. Further, the staticTable has a fixed, small length. + return d.dynTab.table.len() + staticTable.len() } func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) { - if i < 1 { + // See Section 2.3.3. + if i == 0 { return } + if i <= uint64(staticTable.len()) { + return staticTable.ents[i-1], true + } if i > uint64(d.maxTableIndex()) { return } - if i <= uint64(len(staticTable)) { - return staticTable[i-1], true - } - dents := d.dynTab.ents - return dents[len(dents)-(int(i)-len(staticTable))], true + // In the dynamic table, newer entries have lower indices. + // However, dt.ents[0] is the oldest entry. Hence, dt.ents is + // the reversed dynamic table. + dt := d.dynTab.table + return dt.ents[dt.len()-(int(i)-staticTable.len())], true } // Decode decodes an entire block. @@ -307,7 +255,7 @@ func (d *Decoder) Write(p []byte) (n int, err error) { err = d.parseHeaderFieldRepr() if err == errNeedMore { // Extra paranoia, making sure saveBuf won't - // get too large. All the varint and string + // get too large. All the varint and string // reading code earlier should already catch // overlong things and return ErrStringLength, // but keep this as a last resort. diff --git a/vendor/golang.org/x/net/http2/hpack/tables.go b/vendor/golang.org/x/net/http2/hpack/tables.go index b9283a0233023..a66cfbea69d91 100644 --- a/vendor/golang.org/x/net/http2/hpack/tables.go +++ b/vendor/golang.org/x/net/http2/hpack/tables.go @@ -4,73 +4,200 @@ package hpack -func pair(name, value string) HeaderField { - return HeaderField{Name: name, Value: value} +import ( + "fmt" +) + +// headerFieldTable implements a list of HeaderFields. +// This is used to implement the static and dynamic tables. +type headerFieldTable struct { + // For static tables, entries are never evicted. + // + // For dynamic tables, entries are evicted from ents[0] and added to the end. + // Each entry has a unique id that starts at one and increments for each + // entry that is added. This unique id is stable across evictions, meaning + // it can be used as a pointer to a specific entry. As in hpack, unique ids + // are 1-based. The unique id for ents[k] is k + evictCount + 1. + // + // Zero is not a valid unique id. + // + // evictCount should not overflow in any remotely practical situation. In + // practice, we will have one dynamic table per HTTP/2 connection. If we + // assume a very powerful server that handles 1M QPS per connection and each + // request adds (then evicts) 100 entries from the table, it would still take + // 2M years for evictCount to overflow. + ents []HeaderField + evictCount uint64 + + // byName maps a HeaderField name to the unique id of the newest entry with + // the same name. See above for a definition of "unique id". + byName map[string]uint64 + + // byNameValue maps a HeaderField name/value pair to the unique id of the newest + // entry with the same name and value. See above for a definition of "unique id". + byNameValue map[pairNameValue]uint64 +} + +type pairNameValue struct { + name, value string +} + +func (t *headerFieldTable) init() { + t.byName = make(map[string]uint64) + t.byNameValue = make(map[pairNameValue]uint64) +} + +// len reports the number of entries in the table. +func (t *headerFieldTable) len() int { + return len(t.ents) +} + +// addEntry adds a new entry. +func (t *headerFieldTable) addEntry(f HeaderField) { + id := uint64(t.len()) + t.evictCount + 1 + t.byName[f.Name] = id + t.byNameValue[pairNameValue{f.Name, f.Value}] = id + t.ents = append(t.ents, f) +} + +// evictOldest evicts the n oldest entries in the table. +func (t *headerFieldTable) evictOldest(n int) { + if n > t.len() { + panic(fmt.Sprintf("evictOldest(%v) on table with %v entries", n, t.len())) + } + for k := 0; k < n; k++ { + f := t.ents[k] + id := t.evictCount + uint64(k) + 1 + if t.byName[f.Name] == id { + delete(t.byName, f.Name) + } + if p := (pairNameValue{f.Name, f.Value}); t.byNameValue[p] == id { + delete(t.byNameValue, p) + } + } + copy(t.ents, t.ents[n:]) + for k := t.len() - n; k < t.len(); k++ { + t.ents[k] = HeaderField{} // so strings can be garbage collected + } + t.ents = t.ents[:t.len()-n] + if t.evictCount+uint64(n) < t.evictCount { + panic("evictCount overflow") + } + t.evictCount += uint64(n) +} + +// search finds f in the table. If there is no match, i is 0. +// If both name and value match, i is the matched index and nameValueMatch +// becomes true. If only name matches, i points to that index and +// nameValueMatch becomes false. +// +// The returned index is a 1-based HPACK index. For dynamic tables, HPACK says +// that index 1 should be the newest entry, but t.ents[0] is the oldest entry, +// meaning t.ents is reversed for dynamic tables. Hence, when t is a dynamic +// table, the return value i actually refers to the entry t.ents[t.len()-i]. +// +// All tables are assumed to be a dynamic tables except for the global +// staticTable pointer. +// +// See Section 2.3.3. +func (t *headerFieldTable) search(f HeaderField) (i uint64, nameValueMatch bool) { + if !f.Sensitive { + if id := t.byNameValue[pairNameValue{f.Name, f.Value}]; id != 0 { + return t.idToIndex(id), true + } + } + if id := t.byName[f.Name]; id != 0 { + return t.idToIndex(id), false + } + return 0, false +} + +// idToIndex converts a unique id to an HPACK index. +// See Section 2.3.3. +func (t *headerFieldTable) idToIndex(id uint64) uint64 { + if id <= t.evictCount { + panic(fmt.Sprintf("id (%v) <= evictCount (%v)", id, t.evictCount)) + } + k := id - t.evictCount - 1 // convert id to an index t.ents[k] + if t != staticTable { + return uint64(t.len()) - k // dynamic table + } + return k + 1 } // http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B -var staticTable = [...]HeaderField{ - pair(":authority", ""), // index 1 (1-based) - pair(":method", "GET"), - pair(":method", "POST"), - pair(":path", "/"), - pair(":path", "/index.html"), - pair(":scheme", "http"), - pair(":scheme", "https"), - pair(":status", "200"), - pair(":status", "204"), - pair(":status", "206"), - pair(":status", "304"), - pair(":status", "400"), - pair(":status", "404"), - pair(":status", "500"), - pair("accept-charset", ""), - pair("accept-encoding", "gzip, deflate"), - pair("accept-language", ""), - pair("accept-ranges", ""), - pair("accept", ""), - pair("access-control-allow-origin", ""), - pair("age", ""), - pair("allow", ""), - pair("authorization", ""), - pair("cache-control", ""), - pair("content-disposition", ""), - pair("content-encoding", ""), - pair("content-language", ""), - pair("content-length", ""), - pair("content-location", ""), - pair("content-range", ""), - pair("content-type", ""), - pair("cookie", ""), - pair("date", ""), - pair("etag", ""), - pair("expect", ""), - pair("expires", ""), - pair("from", ""), - pair("host", ""), - pair("if-match", ""), - pair("if-modified-since", ""), - pair("if-none-match", ""), - pair("if-range", ""), - pair("if-unmodified-since", ""), - pair("last-modified", ""), - pair("link", ""), - pair("location", ""), - pair("max-forwards", ""), - pair("proxy-authenticate", ""), - pair("proxy-authorization", ""), - pair("range", ""), - pair("referer", ""), - pair("refresh", ""), - pair("retry-after", ""), - pair("server", ""), - pair("set-cookie", ""), - pair("strict-transport-security", ""), - pair("transfer-encoding", ""), - pair("user-agent", ""), - pair("vary", ""), - pair("via", ""), - pair("www-authenticate", ""), +var staticTable = newStaticTable() +var staticTableEntries = [...]HeaderField{ + {Name: ":authority"}, + {Name: ":method", Value: "GET"}, + {Name: ":method", Value: "POST"}, + {Name: ":path", Value: "/"}, + {Name: ":path", Value: "/index.html"}, + {Name: ":scheme", Value: "http"}, + {Name: ":scheme", Value: "https"}, + {Name: ":status", Value: "200"}, + {Name: ":status", Value: "204"}, + {Name: ":status", Value: "206"}, + {Name: ":status", Value: "304"}, + {Name: ":status", Value: "400"}, + {Name: ":status", Value: "404"}, + {Name: ":status", Value: "500"}, + {Name: "accept-charset"}, + {Name: "accept-encoding", Value: "gzip, deflate"}, + {Name: "accept-language"}, + {Name: "accept-ranges"}, + {Name: "accept"}, + {Name: "access-control-allow-origin"}, + {Name: "age"}, + {Name: "allow"}, + {Name: "authorization"}, + {Name: "cache-control"}, + {Name: "content-disposition"}, + {Name: "content-encoding"}, + {Name: "content-language"}, + {Name: "content-length"}, + {Name: "content-location"}, + {Name: "content-range"}, + {Name: "content-type"}, + {Name: "cookie"}, + {Name: "date"}, + {Name: "etag"}, + {Name: "expect"}, + {Name: "expires"}, + {Name: "from"}, + {Name: "host"}, + {Name: "if-match"}, + {Name: "if-modified-since"}, + {Name: "if-none-match"}, + {Name: "if-range"}, + {Name: "if-unmodified-since"}, + {Name: "last-modified"}, + {Name: "link"}, + {Name: "location"}, + {Name: "max-forwards"}, + {Name: "proxy-authenticate"}, + {Name: "proxy-authorization"}, + {Name: "range"}, + {Name: "referer"}, + {Name: "refresh"}, + {Name: "retry-after"}, + {Name: "server"}, + {Name: "set-cookie"}, + {Name: "strict-transport-security"}, + {Name: "transfer-encoding"}, + {Name: "user-agent"}, + {Name: "vary"}, + {Name: "via"}, + {Name: "www-authenticate"}, +} + +func newStaticTable() *headerFieldTable { + t := &headerFieldTable{} + t.init() + for _, e := range staticTableEntries[:] { + t.addEntry(e) + } + return t } var huffmanCodes = [256]uint32{ diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go index a91fed5706910..15d7aff382932 100644 --- a/vendor/golang.org/x/net/http2/http2.go +++ b/vendor/golang.org/x/net/http2/http2.go @@ -376,12 +376,16 @@ func (s *sorter) SortStrings(ss []string) { // validPseudoPath reports whether v is a valid :path pseudo-header // value. It must be either: // -// *) a non-empty string starting with '/', but not with with "//", +// *) a non-empty string starting with '/' // *) the string '*', for OPTIONS requests. // // For now this is only used a quick check for deciding when to clean // up Opaque URLs before sending requests from the Transport. // See golang.org/issue/16847 +// +// We used to enforce that the path also didn't start with "//", but +// Google's GFE accepts such paths and Chrome sends them, so ignore +// that part of the spec. See golang.org/issue/19103. func validPseudoPath(v string) bool { - return (len(v) > 0 && v[0] == '/' && (len(v) == 1 || v[1] != '/')) || v == "*" + return (len(v) > 0 && v[0] == '/') || v == "*" } diff --git a/vendor/golang.org/x/net/http2/not_go16.go b/vendor/golang.org/x/net/http2/not_go16.go index efd2e1282cf60..508cebcc4db29 100644 --- a/vendor/golang.org/x/net/http2/not_go16.go +++ b/vendor/golang.org/x/net/http2/not_go16.go @@ -7,7 +7,6 @@ package http2 import ( - "crypto/tls" "net/http" "time" ) @@ -20,27 +19,3 @@ func transportExpectContinueTimeout(t1 *http.Transport) time.Duration { return 0 } - -// isBadCipher reports whether the cipher is blacklisted by the HTTP/2 spec. -func isBadCipher(cipher uint16) bool { - switch cipher { - case tls.TLS_RSA_WITH_RC4_128_SHA, - tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA, - tls.TLS_RSA_WITH_AES_128_CBC_SHA, - tls.TLS_RSA_WITH_AES_256_CBC_SHA, - tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, - tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, - tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: - // Reject cipher suites from Appendix A. - // "This list includes those cipher suites that do not - // offer an ephemeral key exchange and those that are - // based on the TLS null, stream or block cipher type" - return true - default: - return false - } -} diff --git a/vendor/golang.org/x/net/http2/not_go18.go b/vendor/golang.org/x/net/http2/not_go18.go index efbf83c32c45a..6f8d3f86fa83f 100644 --- a/vendor/golang.org/x/net/http2/not_go18.go +++ b/vendor/golang.org/x/net/http2/not_go18.go @@ -25,3 +25,5 @@ func reqGetBody(req *http.Request) func() (io.ReadCloser, error) { } func reqBodyIsNoBody(io.ReadCloser) bool { return false } + +func go18httpNoBody() io.ReadCloser { return nil } // for tests only diff --git a/vendor/golang.org/x/net/http2/not_go19.go b/vendor/golang.org/x/net/http2/not_go19.go new file mode 100644 index 0000000000000..5ae07726b743f --- /dev/null +++ b/vendor/golang.org/x/net/http2/not_go19.go @@ -0,0 +1,16 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.9 + +package http2 + +import ( + "net/http" +) + +func configureServer19(s *http.Server, conf *Server) error { + // not supported prior to go1.9 + return nil +} diff --git a/vendor/golang.org/x/net/http2/pipe.go b/vendor/golang.org/x/net/http2/pipe.go index 53b7a1daf630a..a6140099cb37c 100644 --- a/vendor/golang.org/x/net/http2/pipe.go +++ b/vendor/golang.org/x/net/http2/pipe.go @@ -10,13 +10,13 @@ import ( "sync" ) -// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like +// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like // io.Pipe except there are no PipeReader/PipeWriter halves, and the // underlying buffer is an interface. (io.Pipe is always unbuffered) type pipe struct { mu sync.Mutex - c sync.Cond // c.L lazily initialized to &p.mu - b pipeBuffer + c sync.Cond // c.L lazily initialized to &p.mu + b pipeBuffer // nil when done reading err error // read error once empty. non-nil means closed. breakErr error // immediate read error (caller doesn't see rest of b) donec chan struct{} // closed on error @@ -32,6 +32,9 @@ type pipeBuffer interface { func (p *pipe) Len() int { p.mu.Lock() defer p.mu.Unlock() + if p.b == nil { + return 0 + } return p.b.Len() } @@ -47,7 +50,7 @@ func (p *pipe) Read(d []byte) (n int, err error) { if p.breakErr != nil { return 0, p.breakErr } - if p.b.Len() > 0 { + if p.b != nil && p.b.Len() > 0 { return p.b.Read(d) } if p.err != nil { @@ -55,6 +58,7 @@ func (p *pipe) Read(d []byte) (n int, err error) { p.readFn() // e.g. copy trailers p.readFn = nil // not sticky like p.err } + p.b = nil return 0, p.err } p.c.Wait() @@ -75,6 +79,9 @@ func (p *pipe) Write(d []byte) (n int, err error) { if p.err != nil { return 0, errClosedPipeWrite } + if p.breakErr != nil { + return len(d), nil // discard when there is no reader + } return p.b.Write(d) } @@ -109,6 +116,9 @@ func (p *pipe) closeWithError(dst *error, err error, fn func()) { return } p.readFn = fn + if dst == &p.breakErr { + p.b = nil + } *dst = err p.closeDoneLocked() } diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 3c6b90ccd55fa..eae143ddff108 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -110,9 +110,41 @@ type Server struct { // activity for the purposes of IdleTimeout. IdleTimeout time.Duration + // MaxUploadBufferPerConnection is the size of the initial flow + // control window for each connections. The HTTP/2 spec does not + // allow this to be smaller than 65535 or larger than 2^32-1. + // If the value is outside this range, a default value will be + // used instead. + MaxUploadBufferPerConnection int32 + + // MaxUploadBufferPerStream is the size of the initial flow control + // window for each stream. The HTTP/2 spec does not allow this to + // be larger than 2^32-1. If the value is zero or larger than the + // maximum, a default value will be used instead. + MaxUploadBufferPerStream int32 + // NewWriteScheduler constructs a write scheduler for a connection. // If nil, a default scheduler is chosen. NewWriteScheduler func() WriteScheduler + + // Internal state. This is a pointer (rather than embedded directly) + // so that we don't embed a Mutex in this struct, which will make the + // struct non-copyable, which might break some callers. + state *serverInternalState +} + +func (s *Server) initialConnRecvWindowSize() int32 { + if s.MaxUploadBufferPerConnection > initialWindowSize { + return s.MaxUploadBufferPerConnection + } + return 1 << 20 +} + +func (s *Server) initialStreamRecvWindowSize() int32 { + if s.MaxUploadBufferPerStream > 0 { + return s.MaxUploadBufferPerStream + } + return 1 << 20 } func (s *Server) maxReadFrameSize() uint32 { @@ -129,6 +161,40 @@ func (s *Server) maxConcurrentStreams() uint32 { return defaultMaxStreams } +type serverInternalState struct { + mu sync.Mutex + activeConns map[*serverConn]struct{} +} + +func (s *serverInternalState) registerConn(sc *serverConn) { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + s.activeConns[sc] = struct{}{} + s.mu.Unlock() +} + +func (s *serverInternalState) unregisterConn(sc *serverConn) { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + delete(s.activeConns, sc) + s.mu.Unlock() +} + +func (s *serverInternalState) startGracefulShutdown() { + if s == nil { + return // if the Server was used without calling ConfigureServer + } + s.mu.Lock() + for sc := range s.activeConns { + sc.startGracefulShutdown() + } + s.mu.Unlock() +} + // ConfigureServer adds HTTP/2 support to a net/http Server. // // The configuration conf may be nil. @@ -141,9 +207,13 @@ func ConfigureServer(s *http.Server, conf *Server) error { if conf == nil { conf = new(Server) } + conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})} if err := configureServer18(s, conf); err != nil { return err } + if err := configureServer19(s, conf); err != nil { + return err + } if s.TLSConfig == nil { s.TLSConfig = new(tls.Config) @@ -255,35 +325,37 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { defer cancel() sc := &serverConn{ - srv: s, - hs: opts.baseConfig(), - conn: c, - baseCtx: baseCtx, - remoteAddrStr: c.RemoteAddr().String(), - bw: newBufferedWriter(c), - handler: opts.handler(), - streams: make(map[uint32]*stream), - readFrameCh: make(chan readFrameResult), - wantWriteFrameCh: make(chan FrameWriteRequest, 8), - wantStartPushCh: make(chan startPushRequest, 8), - wroteFrameCh: make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync - bodyReadCh: make(chan bodyReadMsg), // buffering doesn't matter either way - doneServing: make(chan struct{}), - clientMaxStreams: math.MaxUint32, // Section 6.5.2: "Initially, there is no limit to this value" - advMaxStreams: s.maxConcurrentStreams(), - initialWindowSize: initialWindowSize, - maxFrameSize: initialMaxFrameSize, - headerTableSize: initialHeaderTableSize, - serveG: newGoroutineLock(), - pushEnabled: true, - } + srv: s, + hs: opts.baseConfig(), + conn: c, + baseCtx: baseCtx, + remoteAddrStr: c.RemoteAddr().String(), + bw: newBufferedWriter(c), + handler: opts.handler(), + streams: make(map[uint32]*stream), + readFrameCh: make(chan readFrameResult), + wantWriteFrameCh: make(chan FrameWriteRequest, 8), + serveMsgCh: make(chan interface{}, 8), + wroteFrameCh: make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync + bodyReadCh: make(chan bodyReadMsg), // buffering doesn't matter either way + doneServing: make(chan struct{}), + clientMaxStreams: math.MaxUint32, // Section 6.5.2: "Initially, there is no limit to this value" + advMaxStreams: s.maxConcurrentStreams(), + initialStreamSendWindowSize: initialWindowSize, + maxFrameSize: initialMaxFrameSize, + headerTableSize: initialHeaderTableSize, + serveG: newGoroutineLock(), + pushEnabled: true, + } + + s.state.registerConn(sc) + defer s.state.unregisterConn(sc) // The net/http package sets the write deadline from the // http.Server.WriteTimeout during the TLS handshake, but then - // passes the connection off to us with the deadline already - // set. Disarm it here so that it is not applied to additional - // streams opened on this connection. - // TODO: implement WriteTimeout fully. See Issue 18437. + // passes the connection off to us with the deadline already set. + // Write deadlines are set per stream in serverConn.newStream. + // Disarm the net.Conn write deadline here. if sc.hs.WriteTimeout != 0 { sc.conn.SetWriteDeadline(time.Time{}) } @@ -294,6 +366,9 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { sc.writeSched = NewRandomWriteScheduler() } + // These start at the RFC-specified defaults. If there is a higher + // configured value for inflow, that will be updated when we send a + // WINDOW_UPDATE shortly after sending SETTINGS. sc.flow.add(initialWindowSize) sc.inflow.add(initialWindowSize) sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf) @@ -376,10 +451,9 @@ type serverConn struct { doneServing chan struct{} // closed when serverConn.serve ends readFrameCh chan readFrameResult // written by serverConn.readFrames wantWriteFrameCh chan FrameWriteRequest // from handlers -> serve - wantStartPushCh chan startPushRequest // from handlers -> serve wroteFrameCh chan frameWriteResult // from writeFrameAsync -> serve, tickles more frame writes bodyReadCh chan bodyReadMsg // from handlers -> serve - testHookCh chan func(int) // code to run on the serve loop + serveMsgCh chan interface{} // misc messages & code to send to / run on the serve loop flow flow // conn-wide (not stream-specific) outbound flow control inflow flow // conn-wide inbound flow control tlsState *tls.ConnectionState // shared by all handlers, like net/http @@ -387,38 +461,39 @@ type serverConn struct { writeSched WriteScheduler // Everything following is owned by the serve loop; use serveG.check(): - serveG goroutineLock // used to verify funcs are on serve() - pushEnabled bool - sawFirstSettings bool // got the initial SETTINGS frame after the preface - needToSendSettingsAck bool - unackedSettings int // how many SETTINGS have we sent without ACKs? - clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) - advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client - curClientStreams uint32 // number of open streams initiated by the client - curPushedStreams uint32 // number of open streams initiated by server push - maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests - maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes - streams map[uint32]*stream - initialWindowSize int32 - maxFrameSize int32 - headerTableSize uint32 - peerMaxHeaderListSize uint32 // zero means unknown (default) - canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case - writingFrame bool // started writing a frame (on serve goroutine or separate) - writingFrameAsync bool // started a frame on its own goroutine but haven't heard back on wroteFrameCh - needsFrameFlush bool // last frame write wasn't a flush - inGoAway bool // we've started to or sent GOAWAY - inFrameScheduleLoop bool // whether we're in the scheduleFrameWrite loop - needToSendGoAway bool // we need to schedule a GOAWAY frame write - goAwayCode ErrCode - shutdownTimerCh <-chan time.Time // nil until used - shutdownTimer *time.Timer // nil until used - idleTimer *time.Timer // nil if unused - idleTimerCh <-chan time.Time // nil if unused + serveG goroutineLock // used to verify funcs are on serve() + pushEnabled bool + sawFirstSettings bool // got the initial SETTINGS frame after the preface + needToSendSettingsAck bool + unackedSettings int // how many SETTINGS have we sent without ACKs? + clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) + advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client + curClientStreams uint32 // number of open streams initiated by the client + curPushedStreams uint32 // number of open streams initiated by server push + maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests + maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes + streams map[uint32]*stream + initialStreamSendWindowSize int32 + maxFrameSize int32 + headerTableSize uint32 + peerMaxHeaderListSize uint32 // zero means unknown (default) + canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case + writingFrame bool // started writing a frame (on serve goroutine or separate) + writingFrameAsync bool // started a frame on its own goroutine but haven't heard back on wroteFrameCh + needsFrameFlush bool // last frame write wasn't a flush + inGoAway bool // we've started to or sent GOAWAY + inFrameScheduleLoop bool // whether we're in the scheduleFrameWrite loop + needToSendGoAway bool // we need to schedule a GOAWAY frame write + goAwayCode ErrCode + shutdownTimer *time.Timer // nil until used + idleTimer *time.Timer // nil if unused // Owned by the writeFrameAsync goroutine: headerWriteBuf bytes.Buffer hpackEncoder *hpack.Encoder + + // Used by startGracefulShutdown. + shutdownOnce sync.Once } func (sc *serverConn) maxHeaderListSize() uint32 { @@ -463,10 +538,10 @@ type stream struct { numTrailerValues int64 weight uint8 state streamState - resetQueued bool // RST_STREAM queued for write; set by sc.resetStream - gotTrailerHeader bool // HEADER frame for trailers was seen - wroteHeaders bool // whether we wrote headers (not status 100) - reqBuf []byte // if non-nil, body pipe buffer to return later at EOF + resetQueued bool // RST_STREAM queued for write; set by sc.resetStream + gotTrailerHeader bool // HEADER frame for trailers was seen + wroteHeaders bool // whether we wrote headers (not status 100) + writeDeadline *time.Timer // nil if unused trailer http.Header // accumulated trailers reqTrailer http.Header // handler's Request.Trailer @@ -696,48 +771,48 @@ func (sc *serverConn) serve() { {SettingMaxFrameSize, sc.srv.maxReadFrameSize()}, {SettingMaxConcurrentStreams, sc.advMaxStreams}, {SettingMaxHeaderListSize, sc.maxHeaderListSize()}, - - // TODO: more actual settings, notably - // SettingInitialWindowSize, but then we also - // want to bump up the conn window size the - // same amount here right after the settings + {SettingInitialWindowSize, uint32(sc.srv.initialStreamRecvWindowSize())}, }, }) sc.unackedSettings++ + // Each connection starts with intialWindowSize inflow tokens. + // If a higher value is configured, we add more tokens. + if diff := sc.srv.initialConnRecvWindowSize() - initialWindowSize; diff > 0 { + sc.sendWindowUpdate(nil, int(diff)) + } + if err := sc.readPreface(); err != nil { sc.condlogf(err, "http2: server: error reading preface from client %v: %v", sc.conn.RemoteAddr(), err) return } // Now that we've got the preface, get us out of the - // "StateNew" state. We can't go directly to idle, though. + // "StateNew" state. We can't go directly to idle, though. // Active means we read some data and anticipate a request. We'll // do another Active when we get a HEADERS frame. sc.setConnState(http.StateActive) sc.setConnState(http.StateIdle) if sc.srv.IdleTimeout != 0 { - sc.idleTimer = time.NewTimer(sc.srv.IdleTimeout) + sc.idleTimer = time.AfterFunc(sc.srv.IdleTimeout, sc.onIdleTimer) defer sc.idleTimer.Stop() - sc.idleTimerCh = sc.idleTimer.C - } - - var gracefulShutdownCh <-chan struct{} - if sc.hs != nil { - gracefulShutdownCh = h1ServerShutdownChan(sc.hs) } go sc.readFrames() // closed by defer sc.conn.Close above - settingsTimer := time.NewTimer(firstSettingsTimeout) + settingsTimer := time.AfterFunc(firstSettingsTimeout, sc.onSettingsTimer) + defer settingsTimer.Stop() + loopNum := 0 for { loopNum++ select { case wr := <-sc.wantWriteFrameCh: + if se, ok := wr.write.(StreamError); ok { + sc.resetStream(se) + break + } sc.writeFrame(wr) - case spr := <-sc.wantStartPushCh: - sc.startPush(spr) case res := <-sc.wroteFrameCh: sc.wroteFrame(res) case res := <-sc.readFrameCh: @@ -745,26 +820,37 @@ func (sc *serverConn) serve() { return } res.readMore() - if settingsTimer.C != nil { + if settingsTimer != nil { settingsTimer.Stop() - settingsTimer.C = nil + settingsTimer = nil } case m := <-sc.bodyReadCh: sc.noteBodyRead(m.st, m.n) - case <-settingsTimer.C: - sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr()) - return - case <-gracefulShutdownCh: - gracefulShutdownCh = nil - sc.startGracefulShutdown() - case <-sc.shutdownTimerCh: - sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr()) - return - case <-sc.idleTimerCh: - sc.vlogf("connection is idle") - sc.goAway(ErrCodeNo) - case fn := <-sc.testHookCh: - fn(loopNum) + case msg := <-sc.serveMsgCh: + switch v := msg.(type) { + case func(int): + v(loopNum) // for testing + case *serverMessage: + switch v { + case settingsTimerMsg: + sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr()) + return + case idleTimerMsg: + sc.vlogf("connection is idle") + sc.goAway(ErrCodeNo) + case shutdownTimerMsg: + sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr()) + return + case gracefulShutdownMsg: + sc.startGracefulShutdownInternal() + default: + panic("unknown timer") + } + case *startPushRequest: + sc.startPush(v) + default: + panic(fmt.Sprintf("unexpected type %T", v)) + } } if sc.inGoAway && sc.curOpenStreams() == 0 && !sc.needToSendGoAway && !sc.writingFrame { @@ -773,6 +859,36 @@ func (sc *serverConn) serve() { } } +func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) { + select { + case <-sc.doneServing: + case <-sharedCh: + close(privateCh) + } +} + +type serverMessage int + +// Message values sent to serveMsgCh. +var ( + settingsTimerMsg = new(serverMessage) + idleTimerMsg = new(serverMessage) + shutdownTimerMsg = new(serverMessage) + gracefulShutdownMsg = new(serverMessage) +) + +func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) } +func (sc *serverConn) onIdleTimer() { sc.sendServeMsg(idleTimerMsg) } +func (sc *serverConn) onShutdownTimer() { sc.sendServeMsg(shutdownTimerMsg) } + +func (sc *serverConn) sendServeMsg(msg interface{}) { + sc.serveG.checkNotOn() // NOT + select { + case sc.serveMsgCh <- msg: + case <-sc.doneServing: + } +} + // readPreface reads the ClientPreface greeting from the peer // or returns an error on timeout or an invalid greeting. func (sc *serverConn) readPreface() error { @@ -1014,7 +1130,11 @@ func (sc *serverConn) wroteFrame(res frameWriteResult) { // stateClosed after the RST_STREAM frame is // written. st.state = stateHalfClosedLocal - sc.resetStream(streamError(st.id, ErrCodeCancel)) + // Section 8.1: a server MAY request that the client abort + // transmission of a request without error by sending a + // RST_STREAM with an error code of NO_ERROR after sending + // a complete response. + sc.resetStream(streamError(st.id, ErrCodeNo)) case stateHalfClosedRemote: sc.closeStream(st, errHandlerComplete) } @@ -1086,10 +1206,19 @@ func (sc *serverConn) scheduleFrameWrite() { sc.inFrameScheduleLoop = false } -// startGracefulShutdown sends a GOAWAY with ErrCodeNo to tell the -// client we're gracefully shutting down. The connection isn't closed -// until all current streams are done. +// startGracefulShutdown gracefully shuts down a connection. This +// sends GOAWAY with ErrCodeNo to tell the client we're gracefully +// shutting down. The connection isn't closed until all current +// streams are done. +// +// startGracefulShutdown returns immediately; it does not wait until +// the connection has shut down. func (sc *serverConn) startGracefulShutdown() { + sc.serveG.checkNotOn() // NOT + sc.shutdownOnce.Do(func() { sc.sendServeMsg(gracefulShutdownMsg) }) +} + +func (sc *serverConn) startGracefulShutdownInternal() { sc.goAwayIn(ErrCodeNo, 0) } @@ -1121,8 +1250,7 @@ func (sc *serverConn) goAwayIn(code ErrCode, forceCloseIn time.Duration) { func (sc *serverConn) shutDownIn(d time.Duration) { sc.serveG.check() - sc.shutdownTimer = time.NewTimer(d) - sc.shutdownTimerCh = sc.shutdownTimer.C + sc.shutdownTimer = time.AfterFunc(d, sc.onShutdownTimer) } func (sc *serverConn) resetStream(se StreamError) { @@ -1305,6 +1433,9 @@ func (sc *serverConn) closeStream(st *stream, err error) { panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state)) } st.state = stateClosed + if st.writeDeadline != nil { + st.writeDeadline.Stop() + } if st.isPushed() { sc.curPushedStreams-- } else { @@ -1317,7 +1448,7 @@ func (sc *serverConn) closeStream(st *stream, err error) { sc.idleTimer.Reset(sc.srv.IdleTimeout) } if h1ServerKeepAlivesDisabled(sc.hs) { - sc.startGracefulShutdown() + sc.startGracefulShutdownInternal() } } if p := st.body; p != nil { @@ -1395,9 +1526,9 @@ func (sc *serverConn) processSettingInitialWindowSize(val uint32) error { // adjust the size of all stream flow control windows that it // maintains by the difference between the new value and the // old value." - old := sc.initialWindowSize - sc.initialWindowSize = int32(val) - growth := sc.initialWindowSize - old // may be negative + old := sc.initialStreamSendWindowSize + sc.initialStreamSendWindowSize = int32(val) + growth := int32(val) - old // may be negative for _, st := range sc.streams { if !st.flow.add(growth) { // 6.9.2 Initial Flow Control Window Size @@ -1504,7 +1635,7 @@ func (sc *serverConn) processGoAway(f *GoAwayFrame) error { } else { sc.vlogf("http2: received GOAWAY %+v, starting graceful shutdown", f) } - sc.startGracefulShutdown() + sc.startGracefulShutdownInternal() // http://tools.ietf.org/html/rfc7540#section-6.8 // We should not create any new streams, which means we should disable push. sc.pushEnabled = false @@ -1543,6 +1674,12 @@ func (st *stream) copyTrailersToHandlerRequest() { } } +// onWriteTimeout is run on its own goroutine (from time.AfterFunc) +// when the stream's WriteTimeout has fired. +func (st *stream) onWriteTimeout() { + st.sc.writeFrameFromHandler(FrameWriteRequest{write: streamError(st.id, ErrCodeInternal)}) +} + func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { sc.serveG.check() id := f.StreamID @@ -1719,9 +1856,12 @@ func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream } st.cw.Init() st.flow.conn = &sc.flow // link to conn-level counter - st.flow.add(sc.initialWindowSize) - st.inflow.conn = &sc.inflow // link to conn-level counter - st.inflow.add(initialWindowSize) // TODO: update this when we send a higher initial window size in the initial settings + st.flow.add(sc.initialStreamSendWindowSize) + st.inflow.conn = &sc.inflow // link to conn-level counter + st.inflow.add(sc.srv.initialStreamRecvWindowSize()) + if sc.hs.WriteTimeout != 0 { + st.writeDeadline = time.AfterFunc(sc.hs.WriteTimeout, st.onWriteTimeout) + } sc.streams[id] = st sc.writeSched.OpenStream(st.id, OpenStreamOptions{PusherID: pusherID}) @@ -1785,16 +1925,14 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res return nil, nil, err } if bodyOpen { - st.reqBuf = getRequestBodyBuf() - req.Body.(*requestBody).pipe = &pipe{ - b: &fixedBuffer{buf: st.reqBuf}, - } - if vv, ok := rp.header["Content-Length"]; ok { req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64) } else { req.ContentLength = -1 } + req.Body.(*requestBody).pipe = &pipe{ + b: &dataBuffer{expected: req.ContentLength}, + } } return rw, req, nil } @@ -1890,24 +2028,6 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r return rw, req, nil } -var reqBodyCache = make(chan []byte, 8) - -func getRequestBodyBuf() []byte { - select { - case b := <-reqBodyCache: - return b - default: - return make([]byte, initialWindowSize) - } -} - -func putRequestBodyBuf(b []byte) { - select { - case reqBodyCache <- b: - default: - } -} - // Run on its own goroutine. func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { didPanic := true @@ -2003,12 +2123,6 @@ func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int, err error) { case <-sc.doneServing: } } - if err == io.EOF { - if buf := st.reqBuf; buf != nil { - st.reqBuf = nil // shouldn't matter; field unused by other - putRequestBodyBuf(buf) - } - } } func (sc *serverConn) noteBodyRead(st *stream, n int) { @@ -2103,8 +2217,8 @@ func (b *requestBody) Read(p []byte) (n int, err error) { return } -// responseWriter is the http.ResponseWriter implementation. It's -// intentionally small (1 pointer wide) to minimize garbage. The +// responseWriter is the http.ResponseWriter implementation. It's +// intentionally small (1 pointer wide) to minimize garbage. The // responseWriterState pointer inside is zeroed at the end of a // request (in handlerDone) and calls on the responseWriter thereafter // simply crash (caller's mistake), but the much larger responseWriterState @@ -2138,6 +2252,7 @@ type responseWriterState struct { wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. sentHeader bool // have we sent the header frame? handlerDone bool // handler has finished + dirty bool // a Write failed; don't reuse this responseWriterState sentContentLen int64 // non-zero if handler set a Content-Length header wroteBytes int64 @@ -2219,6 +2334,7 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { date: date, }) if err != nil { + rws.dirty = true return 0, err } if endStream { @@ -2240,6 +2356,7 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { if len(p) > 0 || endStream { // only send a 0 byte DATA frame if we're ending the stream. if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { + rws.dirty = true return 0, err } } @@ -2251,6 +2368,9 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { trailers: rws.trailers, endStream: true, }) + if err != nil { + rws.dirty = true + } return len(p), err } return len(p), nil @@ -2278,7 +2398,7 @@ const TrailerPrefix = "Trailer:" // says you SHOULD (but not must) predeclare any trailers in the // header, the official ResponseWriter rules said trailers in Go must // be predeclared, and then we reuse the same ResponseWriter.Header() -// map to mean both Headers and Trailers. When it's time to write the +// map to mean both Headers and Trailers. When it's time to write the // Trailers, we pick out the fields of Headers that were declared as // trailers. That worked for a while, until we found the first major // user of Trailers in the wild: gRPC (using them only over http2), @@ -2390,7 +2510,7 @@ func cloneHeader(h http.Header) http.Header { // // * Handler calls w.Write or w.WriteString -> // * -> rws.bw (*bufio.Writer) -> -// * (Handler migth call Flush) +// * (Handler might call Flush) // * -> chunkWriter{rws} // * -> responseWriterState.writeChunk(p []byte) // * -> responseWriterState.writeChunk (most of the magic; see comment there) @@ -2429,10 +2549,19 @@ func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, func (w *responseWriter) handlerDone() { rws := w.rws + dirty := rws.dirty rws.handlerDone = true w.Flush() w.rws = nil - responseWriterStatePool.Put(rws) + if !dirty { + // Only recycle the pool if all prior Write calls to + // the serverConn goroutine completed successfully. If + // they returned earlier due to resets from the peer + // there might still be write goroutines outstanding + // from the serverConn referencing the rws memory. See + // issue 20704. + responseWriterStatePool.Put(rws) + } } // Push errors. @@ -2514,7 +2643,7 @@ func (w *responseWriter) push(target string, opts pushOptions) error { return fmt.Errorf("method %q must be GET or HEAD", opts.Method) } - msg := startPushRequest{ + msg := &startPushRequest{ parent: st, method: opts.Method, url: u, @@ -2527,7 +2656,7 @@ func (w *responseWriter) push(target string, opts pushOptions) error { return errClientDisconnected case <-st.cw: return errStreamClosed - case sc.wantStartPushCh <- msg: + case sc.serveMsgCh <- msg: } select { @@ -2549,7 +2678,7 @@ type startPushRequest struct { done chan error } -func (sc *serverConn) startPush(msg startPushRequest) { +func (sc *serverConn) startPush(msg *startPushRequest) { sc.serveG.check() // http://tools.ietf.org/html/rfc7540#section-6.6. @@ -2588,7 +2717,7 @@ func (sc *serverConn) startPush(msg startPushRequest) { // A server that is unable to establish a new stream identifier can send a GOAWAY // frame so that the client is forced to open a new connection for new streams. if sc.maxPushPromiseID+2 >= 1<<31 { - sc.startGracefulShutdown() + sc.startGracefulShutdownInternal() return 0, ErrPushLimitReached } sc.maxPushPromiseID += 2 @@ -2713,31 +2842,6 @@ var badTrailer = map[string]bool{ "Www-Authenticate": true, } -// h1ServerShutdownChan returns a channel that will be closed when the -// provided *http.Server wants to shut down. -// -// This is a somewhat hacky way to get at http1 innards. It works -// when the http2 code is bundled into the net/http package in the -// standard library. The alternatives ended up making the cmd/go tool -// depend on http Servers. This is the lightest option for now. -// This is tested via the TestServeShutdown* tests in net/http. -func h1ServerShutdownChan(hs *http.Server) <-chan struct{} { - if fn := testh1ServerShutdownChan; fn != nil { - return fn(hs) - } - var x interface{} = hs - type I interface { - getDoneChan() <-chan struct{} - } - if hs, ok := x.(I); ok { - return hs.getDoneChan() - } - return nil -} - -// optional test hook for h1ServerShutdownChan. -var testh1ServerShutdownChan func(hs *http.Server) <-chan struct{} - // h1ServerKeepAlivesDisabled reports whether hs has its keep-alives // disabled. See comments on h1ServerShutdownChan above for why // the code is written this way. diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 0c7e859db1ed3..e0dfe9f6a6972 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -18,6 +18,7 @@ import ( "io/ioutil" "log" "math" + mathrand "math/rand" "net" "net/http" "sort" @@ -164,6 +165,7 @@ type ClientConn struct { goAwayDebug string // goAway frame's debug data, retained as a string streams map[uint32]*clientStream // client-initiated nextStreamID uint32 + pendingRequests int // requests blocked and waiting to be sent because len(streams) == maxConcurrentStreams pings map[[8]byte]chan struct{} // in flight ping data to notification channel bw *bufio.Writer br *bufio.Reader @@ -216,35 +218,45 @@ type clientStream struct { resTrailer *http.Header // client's Response.Trailer } -// awaitRequestCancel runs in its own goroutine and waits for the user -// to cancel a RoundTrip request, its context to expire, or for the -// request to be done (any way it might be removed from the cc.streams -// map: peer reset, successful completion, TCP connection breakage, -// etc) -func (cs *clientStream) awaitRequestCancel(req *http.Request) { +// awaitRequestCancel waits for the user to cancel a request or for the done +// channel to be signaled. A non-nil error is returned only if the request was +// canceled. +func awaitRequestCancel(req *http.Request, done <-chan struct{}) error { ctx := reqContext(req) if req.Cancel == nil && ctx.Done() == nil { - return + return nil } select { case <-req.Cancel: - cs.cancelStream() - cs.bufPipe.CloseWithError(errRequestCanceled) + return errRequestCanceled case <-ctx.Done(): + return ctx.Err() + case <-done: + return nil + } +} + +// awaitRequestCancel waits for the user to cancel a request, its context to +// expire, or for the request to be done (any way it might be removed from the +// cc.streams map: peer reset, successful completion, TCP connection breakage, +// etc). If the request is canceled, then cs will be canceled and closed. +func (cs *clientStream) awaitRequestCancel(req *http.Request) { + if err := awaitRequestCancel(req, cs.done); err != nil { cs.cancelStream() - cs.bufPipe.CloseWithError(ctx.Err()) - case <-cs.done: + cs.bufPipe.CloseWithError(err) } } func (cs *clientStream) cancelStream() { - cs.cc.mu.Lock() + cc := cs.cc + cc.mu.Lock() didReset := cs.didReset cs.didReset = true - cs.cc.mu.Unlock() + cc.mu.Unlock() if !didReset { - cs.cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + cc.forgetStreamID(cs.ID) } } @@ -329,7 +341,7 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res } addr := authorityAddr(req.URL.Scheme, req.URL.Host) - for { + for retry := 0; ; retry++ { cc, err := t.connPool().GetClientConn(req, addr) if err != nil { t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err) @@ -337,9 +349,25 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res } traceGotConn(req, cc) res, err := cc.RoundTrip(req) - if err != nil { - if req, err = shouldRetryRequest(req, err); err == nil { - continue + if err != nil && retry <= 6 { + afterBodyWrite := false + if e, ok := err.(afterReqBodyWriteError); ok { + err = e + afterBodyWrite = true + } + if req, err = shouldRetryRequest(req, err, afterBodyWrite); err == nil { + // After the first retry, do exponential backoff with 10% jitter. + if retry == 0 { + continue + } + backoff := float64(uint(1) << (uint(retry) - 1)) + backoff += backoff * (0.1 * mathrand.Float64()) + select { + case <-time.After(time.Second * time.Duration(backoff)): + continue + case <-reqContext(req).Done(): + return nil, reqContext(req).Err() + } } } if err != nil { @@ -360,43 +388,60 @@ func (t *Transport) CloseIdleConnections() { } var ( - errClientConnClosed = errors.New("http2: client conn is closed") - errClientConnUnusable = errors.New("http2: client conn not usable") - - errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY") - errClientConnGotGoAwayAfterSomeReqBody = errors.New("http2: Transport received Server's graceful shutdown GOAWAY; some request body already written") + errClientConnClosed = errors.New("http2: client conn is closed") + errClientConnUnusable = errors.New("http2: client conn not usable") + errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY") ) +// afterReqBodyWriteError is a wrapper around errors returned by ClientConn.RoundTrip. +// It is used to signal that err happened after part of Request.Body was sent to the server. +type afterReqBodyWriteError struct { + err error +} + +func (e afterReqBodyWriteError) Error() string { + return e.err.Error() + "; some request body already written" +} + // shouldRetryRequest is called by RoundTrip when a request fails to get // response headers. It is always called with a non-nil error. // It returns either a request to retry (either the same request, or a // modified clone), or an error if the request can't be replayed. -func shouldRetryRequest(req *http.Request, err error) (*http.Request, error) { - switch err { - default: +func shouldRetryRequest(req *http.Request, err error, afterBodyWrite bool) (*http.Request, error) { + if !canRetryError(err) { return nil, err - case errClientConnUnusable, errClientConnGotGoAway: + } + if !afterBodyWrite { return req, nil - case errClientConnGotGoAwayAfterSomeReqBody: - // If the Body is nil (or http.NoBody), it's safe to reuse - // this request and its Body. - if req.Body == nil || reqBodyIsNoBody(req.Body) { - return req, nil - } - // Otherwise we depend on the Request having its GetBody - // func defined. - getBody := reqGetBody(req) // Go 1.8: getBody = req.GetBody - if getBody == nil { - return nil, errors.New("http2: Transport: peer server initiated graceful shutdown after some of Request.Body was written; define Request.GetBody to avoid this error") - } - body, err := getBody() - if err != nil { - return nil, err - } - newReq := *req - newReq.Body = body - return &newReq, nil } + // If the Body is nil (or http.NoBody), it's safe to reuse + // this request and its Body. + if req.Body == nil || reqBodyIsNoBody(req.Body) { + return req, nil + } + // Otherwise we depend on the Request having its GetBody + // func defined. + getBody := reqGetBody(req) // Go 1.8: getBody = req.GetBody + if getBody == nil { + return nil, fmt.Errorf("http2: Transport: cannot retry err [%v] after Request.Body was written; define Request.GetBody to avoid this error", err) + } + body, err := getBody() + if err != nil { + return nil, err + } + newReq := *req + newReq.Body = body + return &newReq, nil +} + +func canRetryError(err error) bool { + if err == errClientConnUnusable || err == errClientConnGotGoAway { + return true + } + if se, ok := err.(StreamError); ok { + return se.Code == ErrCodeRefusedStream + } + return false } func (t *Transport) dialClientConn(addr string, singleUse bool) (*ClientConn, error) { @@ -560,6 +605,8 @@ func (cc *ClientConn) setGoAway(f *GoAwayFrame) { } } +// CanTakeNewRequest reports whether the connection can take a new request, +// meaning it has not been closed or received or sent a GOAWAY. func (cc *ClientConn) CanTakeNewRequest() bool { cc.mu.Lock() defer cc.mu.Unlock() @@ -571,11 +618,10 @@ func (cc *ClientConn) canTakeNewRequestLocked() bool { return false } return cc.goAway == nil && !cc.closed && - int64(len(cc.streams)+1) < int64(cc.maxConcurrentStreams) && - cc.nextStreamID < math.MaxInt32 + int64(cc.nextStreamID)+int64(cc.pendingRequests) < math.MaxInt32 } -// onIdleTimeout is called from a time.AfterFunc goroutine. It will +// onIdleTimeout is called from a time.AfterFunc goroutine. It will // only be called when we're idle, but because we're coming from a new // goroutine, there could be a new request coming in at the same time, // so this simply calls the synchronized closeIfIdle to shut down this @@ -694,7 +740,7 @@ func checkConnHeaders(req *http.Request) error { // req.ContentLength, where 0 actually means zero (not unknown) and -1 // means unknown. func actualContentLength(req *http.Request) int64 { - if req.Body == nil { + if req.Body == nil || reqBodyIsNoBody(req.Body) { return 0 } if req.ContentLength != 0 { @@ -718,15 +764,14 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { hasTrailers := trailers != "" cc.mu.Lock() - cc.lastActive = time.Now() - if cc.closed || !cc.canTakeNewRequestLocked() { + if err := cc.awaitOpenSlotForRequest(req); err != nil { cc.mu.Unlock() - return nil, errClientConnUnusable + return nil, err } body := req.Body - hasBody := body != nil contentLen := actualContentLength(req) + hasBody := contentLen != 0 // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? var requestedGzip bool @@ -809,21 +854,20 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { // 2xx, however, then assume the server DOES potentially // want our body (e.g. full-duplex streaming: // golang.org/issue/13444). If it turns out the server - // doesn't, they'll RST_STREAM us soon enough. This is a - // heuristic to avoid adding knobs to Transport. Hopefully + // doesn't, they'll RST_STREAM us soon enough. This is a + // heuristic to avoid adding knobs to Transport. Hopefully // we can keep it. bodyWriter.cancel() cs.abortRequestBodyWrite(errStopReqBodyWrite) } if re.err != nil { - if re.err == errClientConnGotGoAway { - cc.mu.Lock() - if cs.startedWrite { - re.err = errClientConnGotGoAwayAfterSomeReqBody - } - cc.mu.Unlock() - } + cc.mu.Lock() + afterBodyWrite := cs.startedWrite + cc.mu.Unlock() cc.forgetStreamID(cs.ID) + if afterBodyWrite { + return nil, afterReqBodyWriteError{re.err} + } return nil, re.err } res.Request = req @@ -836,31 +880,31 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { case re := <-readLoopResCh: return handleReadLoopResponse(re) case <-respHeaderTimer: - cc.forgetStreamID(cs.ID) if !hasBody || bodyWritten { cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) } else { bodyWriter.cancel() cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) } + cc.forgetStreamID(cs.ID) return nil, errTimeout case <-ctx.Done(): - cc.forgetStreamID(cs.ID) if !hasBody || bodyWritten { cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) } else { bodyWriter.cancel() cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) } + cc.forgetStreamID(cs.ID) return nil, ctx.Err() case <-req.Cancel: - cc.forgetStreamID(cs.ID) if !hasBody || bodyWritten { cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) } else { bodyWriter.cancel() cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) } + cc.forgetStreamID(cs.ID) return nil, errRequestCanceled case <-cs.peerReset: // processResetStream already removed the @@ -887,6 +931,45 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { } } +// awaitOpenSlotForRequest waits until len(streams) < maxConcurrentStreams. +// Must hold cc.mu. +func (cc *ClientConn) awaitOpenSlotForRequest(req *http.Request) error { + var waitingForConn chan struct{} + var waitingForConnErr error // guarded by cc.mu + for { + cc.lastActive = time.Now() + if cc.closed || !cc.canTakeNewRequestLocked() { + return errClientConnUnusable + } + if int64(len(cc.streams))+1 <= int64(cc.maxConcurrentStreams) { + if waitingForConn != nil { + close(waitingForConn) + } + return nil + } + // Unfortunately, we cannot wait on a condition variable and channel at + // the same time, so instead, we spin up a goroutine to check if the + // request is canceled while we wait for a slot to open in the connection. + if waitingForConn == nil { + waitingForConn = make(chan struct{}) + go func() { + if err := awaitRequestCancel(req, waitingForConn); err != nil { + cc.mu.Lock() + waitingForConnErr = err + cc.cond.Broadcast() + cc.mu.Unlock() + } + }() + } + cc.pendingRequests++ + cc.cond.Wait() + cc.pendingRequests-- + if waitingForConnErr != nil { + return waitingForConnErr + } + } +} + // requires cc.wmu be held func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, hdrs []byte) error { first := true // first frame written (HEADERS is first, then CONTINUATION) @@ -1246,7 +1329,9 @@ func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { cc.idleTimer.Reset(cc.idleTimeout) } close(cs.done) - cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl + // Wake up checkResetOrDone via clientStream.awaitFlowControl and + // wake up RoundTrip if there is a pending request. + cc.cond.Broadcast() } return cs } @@ -1345,8 +1430,9 @@ func (rl *clientConnReadLoop) run() error { cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err) } if se, ok := err.(StreamError); ok { - if cs := cc.streamByID(se.StreamID, true /*ended; remove it*/); cs != nil { + if cs := cc.streamByID(se.StreamID, false); cs != nil { cs.cc.writeStreamReset(cs.ID, se.Code, err) + cs.cc.forgetStreamID(cs.ID) if se.Cause == nil { se.Cause = cc.fr.errDetail } @@ -1528,8 +1614,7 @@ func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFra return res, nil } - buf := new(bytes.Buffer) // TODO(bradfitz): recycle this garbage - cs.bufPipe = pipe{b: buf} + cs.bufPipe = pipe{b: &dataBuffer{expected: res.ContentLength}} cs.bytesRemain = res.ContentLength res.Body = transportResponseBody{cs} go cs.awaitRequestCancel(cs.req) @@ -1656,6 +1741,7 @@ func (b transportResponseBody) Close() error { cc.wmu.Lock() if !serverSentStreamEnd { cc.fr.WriteRSTStream(cs.ID, ErrCodeCancel) + cs.didReset = true } // Return connection-level flow control. if unread > 0 { @@ -1668,6 +1754,7 @@ func (b transportResponseBody) Close() error { } cs.bufPipe.BreakWithError(errClosedResponseBody) + cc.forgetStreamID(cs.ID) return nil } @@ -1703,12 +1790,6 @@ func (rl *clientConnReadLoop) processData(f *DataFrame) error { return nil } if f.Length > 0 { - if len(data) > 0 && cs.bufPipe.b == nil { - // Data frame after it's already closed? - cc.logf("http2: Transport received DATA frame for closed stream; closing connection") - return ConnectionError(ErrCodeProtocol) - } - // Check connection-level flow control. cc.mu.Lock() if cs.inflow.available() >= int32(f.Length) { @@ -1719,16 +1800,27 @@ func (rl *clientConnReadLoop) processData(f *DataFrame) error { } // Return any padded flow control now, since we won't // refund it later on body reads. - if pad := int32(f.Length) - int32(len(data)); pad > 0 { - cs.inflow.add(pad) - cc.inflow.add(pad) + var refund int + if pad := int(f.Length) - len(data); pad > 0 { + refund += pad + } + // Return len(data) now if the stream is already closed, + // since data will never be read. + didReset := cs.didReset + if didReset { + refund += len(data) + } + if refund > 0 { + cc.inflow.add(int32(refund)) cc.wmu.Lock() - cc.fr.WriteWindowUpdate(0, uint32(pad)) - cc.fr.WriteWindowUpdate(cs.ID, uint32(pad)) + cc.fr.WriteWindowUpdate(0, uint32(refund)) + if !didReset { + cs.inflow.add(int32(refund)) + cc.fr.WriteWindowUpdate(cs.ID, uint32(refund)) + } cc.bw.Flush() cc.wmu.Unlock() } - didReset := cs.didReset cc.mu.Unlock() if len(data) > 0 && !didReset { diff --git a/vendor/golang.org/x/net/http2/writesched_priority.go b/vendor/golang.org/x/net/http2/writesched_priority.go index 01132721bddda..848fed6ec7693 100644 --- a/vendor/golang.org/x/net/http2/writesched_priority.go +++ b/vendor/golang.org/x/net/http2/writesched_priority.go @@ -53,7 +53,7 @@ type PriorityWriteSchedulerConfig struct { } // NewPriorityWriteScheduler constructs a WriteScheduler that schedules -// frames by following HTTP/2 priorities as described in RFC 7340 Section 5.3. +// frames by following HTTP/2 priorities as described in RFC 7540 Section 5.3. // If cfg is nil, default options are used. func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler { if cfg == nil { diff --git a/vendor/golang.org/x/net/idna/BUILD b/vendor/golang.org/x/net/idna/BUILD index f16a929c55fa0..58f9b754402ed 100644 --- a/vendor/golang.org/x/net/idna/BUILD +++ b/vendor/golang.org/x/net/idna/BUILD @@ -5,8 +5,15 @@ go_library( srcs = [ "idna.go", "punycode.go", + "tables.go", + "trie.go", + "trieval.go", ], visibility = ["//visibility:public"], + deps = [ + "//vendor/golang.org/x/text/secure/bidirule:go_default_library", + "//vendor/golang.org/x/text/unicode/norm:go_default_library", + ], ) filegroup( diff --git a/vendor/golang.org/x/net/idna/idna.go b/vendor/golang.org/x/net/idna/idna.go index 35ff39d81b15a..1810100bfd861 100644 --- a/vendor/golang.org/x/net/idna/idna.go +++ b/vendor/golang.org/x/net/idna/idna.go @@ -1,61 +1,673 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package idna implements IDNA2008 (Internationalized Domain Names for -// Applications), defined in RFC 5890, RFC 5891, RFC 5892, RFC 5893 and -// RFC 5894. +// Package idna implements IDNA2008 using the compatibility processing +// defined by UTS (Unicode Technical Standard) #46, which defines a standard to +// deal with the transition from IDNA2003. +// +// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC +// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894. +// UTS #46 is defined in http://www.unicode.org/reports/tr46. +// See http://unicode.org/cldr/utility/idna.jsp for a visualization of the +// differences between these two standards. package idna import ( + "fmt" "strings" "unicode/utf8" -) -// TODO(nigeltao): specify when errors occur. For example, is ToASCII(".") or -// ToASCII("foo\x00") an error? See also http://www.unicode.org/faq/idn.html#11 + "golang.org/x/text/secure/bidirule" + "golang.org/x/text/unicode/norm" +) -// acePrefix is the ASCII Compatible Encoding prefix. -const acePrefix = "xn--" +// NOTE: Unlike common practice in Go APIs, the functions will return a +// sanitized domain name in case of errors. Browsers sometimes use a partially +// evaluated string as lookup. +// TODO: the current error handling is, in my opinion, the least opinionated. +// Other strategies are also viable, though: +// Option 1) Return an empty string in case of error, but allow the user to +// specify explicitly which errors to ignore. +// Option 2) Return the partially evaluated string if it is itself a valid +// string, otherwise return the empty string in case of error. +// Option 3) Option 1 and 2. +// Option 4) Always return an empty string for now and implement Option 1 as +// needed, and document that the return string may not be empty in case of +// error in the future. +// I think Option 1 is best, but it is quite opinionated. -// ToASCII converts a domain or domain label to its ASCII form. For example, -// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and -// ToASCII("golang") is "golang". +// ToASCII is a wrapper for Punycode.ToASCII. func ToASCII(s string) (string, error) { - if ascii(s) { - return s, nil - } - labels := strings.Split(s, ".") - for i, label := range labels { - if !ascii(label) { - a, err := encode(acePrefix, label) - if err != nil { - return "", err - } - labels[i] = a + return Punycode.process(s, true) +} + +// ToUnicode is a wrapper for Punycode.ToUnicode. +func ToUnicode(s string) (string, error) { + return Punycode.process(s, false) +} + +// An Option configures a Profile at creation time. +type Option func(*options) + +// Transitional sets a Profile to use the Transitional mapping as defined in UTS +// #46. This will cause, for example, "ß" to be mapped to "ss". Using the +// transitional mapping provides a compromise between IDNA2003 and IDNA2008 +// compatibility. It is used by most browsers when resolving domain names. This +// option is only meaningful if combined with MapForLookup. +func Transitional(transitional bool) Option { + return func(o *options) { o.transitional = true } +} + +// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts +// are longer than allowed by the RFC. +func VerifyDNSLength(verify bool) Option { + return func(o *options) { o.verifyDNSLength = verify } +} + +// RemoveLeadingDots removes leading label separators. Leading runes that map to +// dots, such as U+3002, are removed as well. +// +// This is the behavior suggested by the UTS #46 and is adopted by some +// browsers. +func RemoveLeadingDots(remove bool) Option { + return func(o *options) { o.removeLeadingDots = remove } +} + +// ValidateLabels sets whether to check the mandatory label validation criteria +// as defined in Section 5.4 of RFC 5891. This includes testing for correct use +// of hyphens ('-'), normalization, validity of runes, and the context rules. +func ValidateLabels(enable bool) Option { + return func(o *options) { + // Don't override existing mappings, but set one that at least checks + // normalization if it is not set. + if o.mapping == nil && enable { + o.mapping = normalize } + o.trie = trie + o.validateLabels = enable + o.fromPuny = validateFromPunycode + } +} + +// StrictDomainName limits the set of permissable ASCII characters to those +// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the +// hyphen). This is set by default for MapForLookup and ValidateForRegistration. +// +// This option is useful, for instance, for browsers that allow characters +// outside this range, for example a '_' (U+005F LOW LINE). See +// http://www.rfc-editor.org/std/std3.txt for more details This option +// corresponds to the UseSTD3ASCIIRules option in UTS #46. +func StrictDomainName(use bool) Option { + return func(o *options) { + o.trie = trie + o.useSTD3Rules = use + o.fromPuny = validateFromPunycode + } +} + +// NOTE: the following options pull in tables. The tables should not be linked +// in as long as the options are not used. + +// BidiRule enables the Bidi rule as defined in RFC 5893. Any application +// that relies on proper validation of labels should include this rule. +func BidiRule() Option { + return func(o *options) { o.bidirule = bidirule.ValidString } +} + +// ValidateForRegistration sets validation options to verify that a given IDN is +// properly formatted for registration as defined by Section 4 of RFC 5891. +func ValidateForRegistration() Option { + return func(o *options) { + o.mapping = validateRegistration + StrictDomainName(true)(o) + ValidateLabels(true)(o) + VerifyDNSLength(true)(o) + BidiRule()(o) + } +} + +// MapForLookup sets validation and mapping options such that a given IDN is +// transformed for domain name lookup according to the requirements set out in +// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894, +// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option +// to add this check. +// +// The mappings include normalization and mapping case, width and other +// compatibility mappings. +func MapForLookup() Option { + return func(o *options) { + o.mapping = validateAndMap + StrictDomainName(true)(o) + ValidateLabels(true)(o) + RemoveLeadingDots(true)(o) + } +} + +type options struct { + transitional bool + useSTD3Rules bool + validateLabels bool + verifyDNSLength bool + removeLeadingDots bool + + trie *idnaTrie + + // fromPuny calls validation rules when converting A-labels to U-labels. + fromPuny func(p *Profile, s string) error + + // mapping implements a validation and mapping step as defined in RFC 5895 + // or UTS 46, tailored to, for example, domain registration or lookup. + mapping func(p *Profile, s string) (string, error) + + // bidirule, if specified, checks whether s conforms to the Bidi Rule + // defined in RFC 5893. + bidirule func(s string) bool +} + +// A Profile defines the configuration of a IDNA mapper. +type Profile struct { + options +} + +func apply(o *options, opts []Option) { + for _, f := range opts { + f(o) } - return strings.Join(labels, "."), nil +} + +// New creates a new Profile. +// +// With no options, the returned Profile is the most permissive and equals the +// Punycode Profile. Options can be passed to further restrict the Profile. The +// MapForLookup and ValidateForRegistration options set a collection of options, +// for lookup and registration purposes respectively, which can be tailored by +// adding more fine-grained options, where later options override earlier +// options. +func New(o ...Option) *Profile { + p := &Profile{} + apply(&p.options, o) + return p +} + +// ToASCII converts a domain or domain label to its ASCII form. For example, +// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and +// ToASCII("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToASCII(s string) (string, error) { + return p.process(s, true) } // ToUnicode converts a domain or domain label to its Unicode form. For example, // ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and -// ToUnicode("golang") is "golang". -func ToUnicode(s string) (string, error) { - if !strings.Contains(s, acePrefix) { - return s, nil +// ToUnicode("golang") is "golang". If an error is encountered it will return +// an error and a (partially) processed result. +func (p *Profile) ToUnicode(s string) (string, error) { + pp := *p + pp.transitional = false + return pp.process(s, false) +} + +// String reports a string with a description of the profile for debugging +// purposes. The string format may change with different versions. +func (p *Profile) String() string { + s := "" + if p.transitional { + s = "Transitional" + } else { + s = "NonTransitional" + } + if p.useSTD3Rules { + s += ":UseSTD3Rules" + } + if p.validateLabels { + s += ":ValidateLabels" } - labels := strings.Split(s, ".") - for i, label := range labels { + if p.verifyDNSLength { + s += ":VerifyDNSLength" + } + return s +} + +var ( + // Punycode is a Profile that does raw punycode processing with a minimum + // of validation. + Punycode *Profile = punycode + + // Lookup is the recommended profile for looking up domain names, according + // to Section 5 of RFC 5891. The exact configuration of this profile may + // change over time. + Lookup *Profile = lookup + + // Display is the recommended profile for displaying domain names. + // The configuration of this profile may change over time. + Display *Profile = display + + // Registration is the recommended profile for checking whether a given + // IDN is valid for registration, according to Section 4 of RFC 5891. + Registration *Profile = registration + + punycode = &Profile{} + lookup = &Profile{options{ + transitional: true, + useSTD3Rules: true, + validateLabels: true, + removeLeadingDots: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + display = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + removeLeadingDots: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateAndMap, + bidirule: bidirule.ValidString, + }} + registration = &Profile{options{ + useSTD3Rules: true, + validateLabels: true, + verifyDNSLength: true, + trie: trie, + fromPuny: validateFromPunycode, + mapping: validateRegistration, + bidirule: bidirule.ValidString, + }} + + // TODO: profiles + // Register: recommended for approving domain names: don't do any mappings + // but rather reject on invalid input. Bundle or block deviation characters. +) + +type labelError struct{ label, code_ string } + +func (e labelError) code() string { return e.code_ } +func (e labelError) Error() string { + return fmt.Sprintf("idna: invalid label %q", e.label) +} + +type runeError rune + +func (e runeError) code() string { return "P1" } +func (e runeError) Error() string { + return fmt.Sprintf("idna: disallowed rune %U", e) +} + +// process implements the algorithm described in section 4 of UTS #46, +// see http://www.unicode.org/reports/tr46. +func (p *Profile) process(s string, toASCII bool) (string, error) { + var err error + if p.mapping != nil { + s, err = p.mapping(p, s) + } + // Remove leading empty labels. + if p.removeLeadingDots { + for ; len(s) > 0 && s[0] == '.'; s = s[1:] { + } + } + // It seems like we should only create this error on ToASCII, but the + // UTS 46 conformance tests suggests we should always check this. + if err == nil && p.verifyDNSLength && s == "" { + err = &labelError{s, "A4"} + } + labels := labelIter{orig: s} + for ; !labels.done(); labels.next() { + label := labels.label() + if label == "" { + // Empty labels are not okay. The label iterator skips the last + // label if it is empty. + if err == nil && p.verifyDNSLength { + err = &labelError{s, "A4"} + } + continue + } if strings.HasPrefix(label, acePrefix) { - u, err := decode(label[len(acePrefix):]) - if err != nil { - return "", err + u, err2 := decode(label[len(acePrefix):]) + if err2 != nil { + if err == nil { + err = err2 + } + // Spec says keep the old label. + continue + } + labels.set(u) + if err == nil && p.validateLabels { + err = p.fromPuny(p, u) + } + if err == nil { + // This should be called on NonTransitional, according to the + // spec, but that currently does not have any effect. Use the + // original profile to preserve options. + err = p.validateLabel(u) } - labels[i] = u + } else if err == nil { + err = p.validateLabel(label) } } - return strings.Join(labels, "."), nil + if toASCII { + for labels.reset(); !labels.done(); labels.next() { + label := labels.label() + if !ascii(label) { + a, err2 := encode(acePrefix, label) + if err == nil { + err = err2 + } + label = a + labels.set(a) + } + n := len(label) + if p.verifyDNSLength && err == nil && (n == 0 || n > 63) { + err = &labelError{label, "A4"} + } + } + } + s = labels.result() + if toASCII && p.verifyDNSLength && err == nil { + // Compute the length of the domain name minus the root label and its dot. + n := len(s) + if n > 0 && s[n-1] == '.' { + n-- + } + if len(s) < 1 || n > 253 { + err = &labelError{s, "A4"} + } + } + return s, err +} + +func normalize(p *Profile, s string) (string, error) { + return norm.NFC.String(s), nil +} + +func validateRegistration(p *Profile, s string) (string, error) { + if !norm.NFC.IsNormalString(s) { + return s, &labelError{s, "V1"} + } + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + // TODO: handle the NV8 defined in the Unicode idna data set to allow + // for strict conformance to IDNA2008. + case valid, deviation: + case disallowed, mapped, unknown, ignored: + r, _ := utf8.DecodeRuneInString(s[i:]) + return s, runeError(r) + } + i += sz + } + return s, nil +} + +func validateAndMap(p *Profile, s string) (string, error) { + var ( + err error + b []byte + k int + ) + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + start := i + i += sz + // Copy bytes not copied so far. + switch p.simplify(info(v).category()) { + case valid: + continue + case disallowed: + if err == nil { + r, _ := utf8.DecodeRuneInString(s[start:]) + err = runeError(r) + } + continue + case mapped, deviation: + b = append(b, s[k:start]...) + b = info(v).appendMapping(b, s[start:i]) + case ignored: + b = append(b, s[k:start]...) + // drop the rune + case unknown: + b = append(b, s[k:start]...) + b = append(b, "\ufffd"...) + } + k = i + } + if k == 0 { + // No changes so far. + s = norm.NFC.String(s) + } else { + b = append(b, s[k:]...) + if norm.NFC.QuickSpan(b) != len(b) { + b = norm.NFC.Bytes(b) + } + // TODO: the punycode converters require strings as input. + s = string(b) + } + return s, err +} + +// A labelIter allows iterating over domain name labels. +type labelIter struct { + orig string + slice []string + curStart int + curEnd int + i int +} + +func (l *labelIter) reset() { + l.curStart = 0 + l.curEnd = 0 + l.i = 0 +} + +func (l *labelIter) done() bool { + return l.curStart >= len(l.orig) +} + +func (l *labelIter) result() string { + if l.slice != nil { + return strings.Join(l.slice, ".") + } + return l.orig +} + +func (l *labelIter) label() string { + if l.slice != nil { + return l.slice[l.i] + } + p := strings.IndexByte(l.orig[l.curStart:], '.') + l.curEnd = l.curStart + p + if p == -1 { + l.curEnd = len(l.orig) + } + return l.orig[l.curStart:l.curEnd] +} + +// next sets the value to the next label. It skips the last label if it is empty. +func (l *labelIter) next() { + l.i++ + if l.slice != nil { + if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" { + l.curStart = len(l.orig) + } + } else { + l.curStart = l.curEnd + 1 + if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' { + l.curStart = len(l.orig) + } + } +} + +func (l *labelIter) set(s string) { + if l.slice == nil { + l.slice = strings.Split(l.orig, ".") + } + l.slice[l.i] = s +} + +// acePrefix is the ASCII Compatible Encoding prefix. +const acePrefix = "xn--" + +func (p *Profile) simplify(cat category) category { + switch cat { + case disallowedSTD3Mapped: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = mapped + } + case disallowedSTD3Valid: + if p.useSTD3Rules { + cat = disallowed + } else { + cat = valid + } + case deviation: + if !p.transitional { + cat = valid + } + case validNV8, validXV8: + // TODO: handle V2008 + cat = valid + } + return cat +} + +func validateFromPunycode(p *Profile, s string) error { + if !norm.NFC.IsNormalString(s) { + return &labelError{s, "V1"} + } + for i := 0; i < len(s); { + v, sz := trie.lookupString(s[i:]) + if c := p.simplify(info(v).category()); c != valid && c != deviation { + return &labelError{s, "V6"} + } + i += sz + } + return nil +} + +const ( + zwnj = "\u200c" + zwj = "\u200d" +) + +type joinState int8 + +const ( + stateStart joinState = iota + stateVirama + stateBefore + stateBeforeVirama + stateAfter + stateFAIL +) + +var joinStates = [][numJoinTypes]joinState{ + stateStart: { + joiningL: stateBefore, + joiningD: stateBefore, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateVirama, + }, + stateVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + }, + stateBefore: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + joinZWNJ: stateAfter, + joinZWJ: stateFAIL, + joinVirama: stateBeforeVirama, + }, + stateBeforeVirama: { + joiningL: stateBefore, + joiningD: stateBefore, + joiningT: stateBefore, + }, + stateAfter: { + joiningL: stateFAIL, + joiningD: stateBefore, + joiningT: stateAfter, + joiningR: stateStart, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateAfter, // no-op as we can't accept joiners here + }, + stateFAIL: { + 0: stateFAIL, + joiningL: stateFAIL, + joiningD: stateFAIL, + joiningT: stateFAIL, + joiningR: stateFAIL, + joinZWNJ: stateFAIL, + joinZWJ: stateFAIL, + joinVirama: stateFAIL, + }, +} + +// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are +// already implicitly satisfied by the overall implementation. +func (p *Profile) validateLabel(s string) error { + if s == "" { + if p.verifyDNSLength { + return &labelError{s, "A4"} + } + return nil + } + if p.bidirule != nil && !p.bidirule(s) { + return &labelError{s, "B"} + } + if !p.validateLabels { + return nil + } + trie := p.trie // p.validateLabels is only set if trie is set. + if len(s) > 4 && s[2] == '-' && s[3] == '-' { + return &labelError{s, "V2"} + } + if s[0] == '-' || s[len(s)-1] == '-' { + return &labelError{s, "V3"} + } + // TODO: merge the use of this in the trie. + v, sz := trie.lookupString(s) + x := info(v) + if x.isModifier() { + return &labelError{s, "V5"} + } + // Quickly return in the absence of zero-width (non) joiners. + if strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 { + return nil + } + st := stateStart + for i := 0; ; { + jt := x.joinType() + if s[i:i+sz] == zwj { + jt = joinZWJ + } else if s[i:i+sz] == zwnj { + jt = joinZWNJ + } + st = joinStates[st][jt] + if x.isViramaModifier() { + st = joinStates[st][joinVirama] + } + if i += sz; i == len(s) { + break + } + v, sz = trie.lookupString(s[i:]) + x = info(v) + } + if st == stateFAIL || st == stateAfter { + return &labelError{s, "C"} + } + return nil } func ascii(s string) bool { diff --git a/vendor/golang.org/x/net/idna/punycode.go b/vendor/golang.org/x/net/idna/punycode.go index 92e733f6a7b11..02c7d59af3b41 100644 --- a/vendor/golang.org/x/net/idna/punycode.go +++ b/vendor/golang.org/x/net/idna/punycode.go @@ -1,4 +1,6 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -7,7 +9,6 @@ package idna // This file implements the Punycode algorithm from RFC 3492. import ( - "fmt" "math" "strings" "unicode/utf8" @@ -27,6 +28,8 @@ const ( tmin int32 = 1 ) +func punyError(s string) error { return &labelError{s, "A3"} } + // decode decodes a string as specified in section 6.2. func decode(encoded string) (string, error) { if encoded == "" { @@ -34,7 +37,7 @@ func decode(encoded string) (string, error) { } pos := 1 + strings.LastIndex(encoded, "-") if pos == 1 { - return "", fmt.Errorf("idna: invalid label %q", encoded) + return "", punyError(encoded) } if pos == len(encoded) { return encoded[:len(encoded)-1], nil @@ -50,16 +53,16 @@ func decode(encoded string) (string, error) { oldI, w := i, int32(1) for k := base; ; k += base { if pos == len(encoded) { - return "", fmt.Errorf("idna: invalid label %q", encoded) + return "", punyError(encoded) } digit, ok := decodeDigit(encoded[pos]) if !ok { - return "", fmt.Errorf("idna: invalid label %q", encoded) + return "", punyError(encoded) } pos++ i += digit * w if i < 0 { - return "", fmt.Errorf("idna: invalid label %q", encoded) + return "", punyError(encoded) } t := k - bias if t < tmin { @@ -72,7 +75,7 @@ func decode(encoded string) (string, error) { } w *= base - t if w >= math.MaxInt32/base { - return "", fmt.Errorf("idna: invalid label %q", encoded) + return "", punyError(encoded) } } x := int32(len(output) + 1) @@ -80,7 +83,7 @@ func decode(encoded string) (string, error) { n += i / x i %= x if n > utf8.MaxRune || len(output) >= 1024 { - return "", fmt.Errorf("idna: invalid label %q", encoded) + return "", punyError(encoded) } output = append(output, 0) copy(output[i+1:], output[i:]) @@ -121,14 +124,14 @@ func encode(prefix, s string) (string, error) { } delta += (m - n) * (h + 1) if delta < 0 { - return "", fmt.Errorf("idna: invalid label %q", s) + return "", punyError(s) } n = m for _, r := range s { if r < n { delta++ if delta < 0 { - return "", fmt.Errorf("idna: invalid label %q", s) + return "", punyError(s) } continue } diff --git a/vendor/golang.org/x/net/idna/tables.go b/vendor/golang.org/x/net/idna/tables.go new file mode 100644 index 0000000000000..d2819345fcd81 --- /dev/null +++ b/vendor/golang.org/x/net/idna/tables.go @@ -0,0 +1,4477 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package idna + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "9.0.0" + +var mappings string = "" + // Size: 8176 bytes + "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + + "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + + "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + + "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + + "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + + "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + + "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + + "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + + "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + + "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + + "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + + "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + + "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + + "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + + "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + + "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + + "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + + "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + + "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + + "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + + "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + + "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + + "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + + "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + + "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + + "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + + ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + + "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + + "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + + "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + + "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + + "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + + "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + + "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + + "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + + "月\x0511月\x0512月\x02hg\x02ev\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニング\x09" + + "インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー\x09ガロ" + + "ン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0fキロワッ" + + "ト\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル\x0fサンチ" + + "ーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット\x09ハイツ" + + "\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0cフィート" + + "\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ\x0cポイ" + + "ント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク\x0fマ" + + "ンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09ユアン" + + "\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x042点" + + "\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + + "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + + "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + + "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + + "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + + "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + + "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + + "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + + "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + + "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + + "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + + "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x04𤋮\x04𢡊\x04𢡄\x04𣏕\x04𥉉" + + "\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ\x04יִ" + + "\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּׂ\x04א" + + "ַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04ךּ\x04" + + "כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ\x04תּ" + + "\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ\x02ڤ" + + "\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ\x02ڳ" + + "\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ\x02ۅ" + + "\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02ی\x04" + + "ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04تح" + + "\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج\x04حم" + + "\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح\x04ضخ" + + "\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ\x04فم" + + "\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل\x04كم" + + "\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ\x04مم" + + "\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى\x04هي" + + "\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 ٍّ\x05" + + " َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04تر\x04تز" + + "\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04ين\x04ئخ" + + "\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه\x04شم\x04شه" + + "\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي\x04سى\x04سي" + + "\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي\x04ضى\x04ضي" + + "\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06تحج\x06تحم" + + "\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سجح\x06سجى" + + "\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم\x06ضحى" + + "\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي\x06غمى" + + "\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح\x06محج" + + "\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم\x06نحم" + + "\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى\x06تخي" + + "\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي\x06ضحي" + + "\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي\x06كمي" + + "\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي\x06سخي" + + "\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08عليه" + + "\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:\x01!" + + "\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\\x01$" + + "\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ\x02إ" + + "\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز\x02س" + + "\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن\x02ه" + + "\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~\x02¢" + + "\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲\x08𝆹" + + "𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η\x02" + + "κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ\x02ڡ" + + "\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029,\x03(a)" + + "\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)\x03(k)" + + "\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)\x03(u)" + + "\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03ppv\x02w" + + "c\x02mc\x02md\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ\x03二\x03多\x03解" + + "\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終\x03生\x03販\x03声" + + "\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指\x03走\x03打\x03禁" + + "\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔三〕\x09〔二〕\x09〔安" + + "〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03丸\x03乁\x03你\x03" + + "侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03具\x03㒹\x03內\x03" + + "冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03㔕\x03勇\x03勉\x03" + + "勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03灰\x03及\x03叟\x03" + + "叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03啣\x03善\x03喙\x03" + + "喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03埴\x03堍\x03型\x03" + + "堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03姘\x03婦\x03㛮\x03" + + "嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03屮\x03峀\x03岍\x03" + + "嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03㡢\x03㡼\x03庰\x03" + + "庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03忍\x03志\x03忹\x03" + + "悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03憤\x03憯\x03懞\x03" + + "懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03掃\x03揤\x03搢\x03" + + "揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03書\x03晉\x03㬙\x03" + + "暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03朡\x03杞\x03杓\x03" + + "㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03槪\x03檨\x03櫛\x03" + + "㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03汧\x03洖\x03派\x03" + + "海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03淹\x03潮\x03濆\x03" + + "瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03爵\x03牐\x03犀\x03" + + "犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03㼛\x03甤\x03甾\x03" + + "異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03䂖\x03硎\x03碌\x03" + + "磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03築\x03䈧\x03糒\x03" + + "䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03罺\x03羕\x03翺\x03" + + "者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03䑫\x03芑\x03芋\x03" + + "芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03莽\x03菧\x03著\x03" + + "荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03䕫\x03虐\x03虜\x03" + + "虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03蠁\x03䗹\x03衠\x03" + + "衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03豕\x03貫\x03賁\x03" + + "贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03鈸\x03鋗\x03鋘\x03" + + "鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03䩶\x03韠\x03䪲\x03" + + "頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03鳽\x03䳎\x03䳭\x03" + + "鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" + +var xorData string = "" + // Size: 4855 bytes + "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + + "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + + "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + + "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + + "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + + "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + + "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + + "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + + "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + + "\x03\x037 \x03\x0b+\x03\x02\x01\x04\x02\x01\x02\x02\x019\x02\x03\x1c\x02" + + "\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03\xc1r\x02" + + "\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<\x03\xc1s*" + + "\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03\x83\xab" + + "\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96\xe1\xcd" + + "\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03\x9a\xec" + + "\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c!\x03" + + "\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03ʦ\x93" + + "\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7\x03" + + "\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca\xfa" + + "\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e\x03" + + "\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca\xe3" + + "\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99\x03" + + "\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca\xe8" + + "\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03\x0b" + + "\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06\x05" + + "\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03\x0786" + + "\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/\x03" + + "\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f\x03" + + "\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-\x03" + + "\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03\x07" + + "\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03\x07" + + "\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03\x07" + + "\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b\x0a" + + "\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03\x07" + + "\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+\x03" + + "\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03\x04" + + "4\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03\x04+ " + + "\x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!\x22" + + "\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04\x03" + + "\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>\x03" + + "\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03\x054" + + "\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03\x05)" + + ":\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$\x1e" + + "\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226\x03" + + "\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05\x1b" + + "\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05\x03" + + "\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03\x06" + + "\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08\x03" + + "\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03\x0a6" + + "\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a\x1f" + + "\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03\x0a" + + "\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f\x02" + + "\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/\x03" + + "\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a\x00" + + "\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+\x10" + + "\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#<" + + "\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!\x00" + + "\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18.\x03" + + "\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15\x22" + + "\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b\x12" + + "\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05<" + + "\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + + "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + + "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + + "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + + "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + + "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + + "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + + "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + + "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + + "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + + "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + + "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + + "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + + "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + + "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + + "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + + "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + + "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + + "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + + "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + + "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + + "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + + "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + + "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + + "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + + "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + + "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + + "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + + "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + + "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + + "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + + "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + + ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + + "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + + "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + + "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + + "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + + "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + + "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + + "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + + "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + + "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + + "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + + "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + + "(\x04\x023 \x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!\x10\x03\x0b!0" + + "\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b\x03\x09\x1f" + + "\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14\x03\x0a\x01" + + "\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03\x08='\x03" + + "\x08\x1a\x0a\x03\x07\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07\x01\x00" + + "\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03\x09\x11" + + "\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03\x0a/1" + + "\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03\x07<3" + + "\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06\x13\x00" + + "\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(;\x03" + + "\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08\x14$" + + "\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03\x0a" + + "\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19\x01" + + "\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18\x03" + + "\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03\x07" + + "\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03\x0a" + + "\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03\x0b" + + "\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03\x08" + + "\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05\x03" + + "\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11\x03" + + "\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03\x09" + + "\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a." + + "\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + + "\x04\x03\x0c?\x05\x03\x0c" + + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x01\x1e\x03\x0f$!\x03" + + "\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08\x18\x03\x0f" + + "\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$\x03\x0e\x0d)" + + "\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d\x03\x0d. \x03" + + "\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03\x0d\x0d\x0f\x03" + + "\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03\x0c\x09:\x03\x0e" + + "\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18\x03\x0c\x1f\x1c" + + "\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03\x0b<+\x03\x0b8" + + "\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d\x22&\x03\x0b\x1a" + + "\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03\x0a!\x1a\x03\x0a!" + + "7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03\x0a\x00 \x03\x0a" + + "\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a\x1b-\x03\x09-" + + "\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091\x1f\x03\x093" + + "\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(\x16\x03\x09" + + "\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!\x03\x09\x1a" + + "\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03\x08\x02*" + + "\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03\x070\x0c" + + "\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x0671\x03" + + "\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 \x1d\x03" + + "\x05\x22\x05\x03\x050\x1d" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// idnaTrie. Total size: 28496 bytes (27.83 KiB). Checksum: 43288b883596640e. +type idnaTrie struct{} + +func newIdnaTrie(i int) *idnaTrie { + return &idnaTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 123: + return uint16(idnaValues[n<<6+uint32(b)]) + default: + n -= 123 + return uint16(idnaSparse.lookup(n, b)) + } +} + +// idnaValues: 125 blocks, 8000 entries, 16000 bytes +// The third block is the zero block. +var idnaValues = [8000]uint16{ + // Block 0x0, offset 0x0 + 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, + 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, + 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, + 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, + 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, + 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, + 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, + 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, + 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, + 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, + 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, + // Block 0x1, offset 0x40 + 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, + 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, + 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, + 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, + 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, + 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, + 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, + 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, + 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, + 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, + 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, + 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, + 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, + // Block 0x4, offset 0x100 + 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, + 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, + 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, + 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, + 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, + 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, + 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, + 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, + 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, + 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, + // Block 0x5, offset 0x140 + 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, + 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, + 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, + 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, + 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, + 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, + 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, + 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, + 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, + // Block 0x6, offset 0x180 + 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, + 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, + 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, + 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, + 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, + 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, + 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, + 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, + 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, + 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, + 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, + 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, + 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, + 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, + 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, + 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, + 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, + 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, + 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, + 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, + 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, + // Block 0x8, offset 0x200 + 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, + 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, + 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, + 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, + 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, + 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, + 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, + 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, + 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, + // Block 0x9, offset 0x240 + 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, + 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, + 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, + 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, + 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, + 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, + 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, + 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, + 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, + 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, + // Block 0xa, offset 0x280 + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x1308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, + 0x286: 0x1308, 0x287: 0x1308, 0x288: 0x1308, 0x289: 0x1308, 0x28a: 0x1308, 0x28b: 0x1308, + 0x28c: 0x1308, 0x28d: 0x1308, 0x28e: 0x1308, 0x28f: 0x13c0, 0x290: 0x1308, 0x291: 0x1308, + 0x292: 0x1308, 0x293: 0x1308, 0x294: 0x1308, 0x295: 0x1308, 0x296: 0x1308, 0x297: 0x1308, + 0x298: 0x1308, 0x299: 0x1308, 0x29a: 0x1308, 0x29b: 0x1308, 0x29c: 0x1308, 0x29d: 0x1308, + 0x29e: 0x1308, 0x29f: 0x1308, 0x2a0: 0x1308, 0x2a1: 0x1308, 0x2a2: 0x1308, 0x2a3: 0x1308, + 0x2a4: 0x1308, 0x2a5: 0x1308, 0x2a6: 0x1308, 0x2a7: 0x1308, 0x2a8: 0x1308, 0x2a9: 0x1308, + 0x2aa: 0x1308, 0x2ab: 0x1308, 0x2ac: 0x1308, 0x2ad: 0x1308, 0x2ae: 0x1308, 0x2af: 0x1308, + 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, + 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, + 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, + 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, + 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, + 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, + 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, + 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, + 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, + 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, + 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, + // Block 0xc, offset 0x300 + 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, + 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, + 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, + 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, + 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, + 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, + 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, + 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, + 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, + 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, + 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, + // Block 0xd, offset 0x340 + 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, + 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, + 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, + 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, + 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, + 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, + 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, + 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, + 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, + 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, + 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, + // Block 0xe, offset 0x380 + 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x1308, 0x384: 0x1308, 0x385: 0x1308, + 0x386: 0x1308, 0x387: 0x1308, 0x388: 0x1318, 0x389: 0x1318, 0x38a: 0xe00d, 0x38b: 0x0008, + 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, + 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, + 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, + 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, + 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, + 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, + 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, + 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, + 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, + 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, + 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, + 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, + 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, + 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, + 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, + 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, + 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, + 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, + 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, + // Block 0x10, offset 0x400 + 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, + 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, + 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, + 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, + 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, + 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, + 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, + 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, + 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, + 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, + 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, + // Block 0x11, offset 0x440 + 0x440: 0x0040, 0x441: 0x0040, 0x442: 0x0040, 0x443: 0x0040, 0x444: 0x0040, 0x445: 0x0040, + 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0018, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0018, + 0x44c: 0x0018, 0x44d: 0x0018, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x1308, 0x451: 0x1308, + 0x452: 0x1308, 0x453: 0x1308, 0x454: 0x1308, 0x455: 0x1308, 0x456: 0x1308, 0x457: 0x1308, + 0x458: 0x1308, 0x459: 0x1308, 0x45a: 0x1308, 0x45b: 0x0018, 0x45c: 0x0340, 0x45d: 0x0040, + 0x45e: 0x0018, 0x45f: 0x0018, 0x460: 0x0208, 0x461: 0x0008, 0x462: 0x0408, 0x463: 0x0408, + 0x464: 0x0408, 0x465: 0x0408, 0x466: 0x0208, 0x467: 0x0408, 0x468: 0x0208, 0x469: 0x0408, + 0x46a: 0x0208, 0x46b: 0x0208, 0x46c: 0x0208, 0x46d: 0x0208, 0x46e: 0x0208, 0x46f: 0x0408, + 0x470: 0x0408, 0x471: 0x0408, 0x472: 0x0408, 0x473: 0x0208, 0x474: 0x0208, 0x475: 0x0208, + 0x476: 0x0208, 0x477: 0x0208, 0x478: 0x0208, 0x479: 0x0208, 0x47a: 0x0208, 0x47b: 0x0208, + 0x47c: 0x0208, 0x47d: 0x0208, 0x47e: 0x0208, 0x47f: 0x0208, + // Block 0x12, offset 0x480 + 0x480: 0x0408, 0x481: 0x0208, 0x482: 0x0208, 0x483: 0x0408, 0x484: 0x0408, 0x485: 0x0408, + 0x486: 0x0408, 0x487: 0x0408, 0x488: 0x0408, 0x489: 0x0408, 0x48a: 0x0408, 0x48b: 0x0408, + 0x48c: 0x0208, 0x48d: 0x0408, 0x48e: 0x0208, 0x48f: 0x0408, 0x490: 0x0208, 0x491: 0x0208, + 0x492: 0x0408, 0x493: 0x0408, 0x494: 0x0018, 0x495: 0x0408, 0x496: 0x1308, 0x497: 0x1308, + 0x498: 0x1308, 0x499: 0x1308, 0x49a: 0x1308, 0x49b: 0x1308, 0x49c: 0x1308, 0x49d: 0x0040, + 0x49e: 0x0018, 0x49f: 0x1308, 0x4a0: 0x1308, 0x4a1: 0x1308, 0x4a2: 0x1308, 0x4a3: 0x1308, + 0x4a4: 0x1308, 0x4a5: 0x0008, 0x4a6: 0x0008, 0x4a7: 0x1308, 0x4a8: 0x1308, 0x4a9: 0x0018, + 0x4aa: 0x1308, 0x4ab: 0x1308, 0x4ac: 0x1308, 0x4ad: 0x1308, 0x4ae: 0x0408, 0x4af: 0x0408, + 0x4b0: 0x0008, 0x4b1: 0x0008, 0x4b2: 0x0008, 0x4b3: 0x0008, 0x4b4: 0x0008, 0x4b5: 0x0008, + 0x4b6: 0x0008, 0x4b7: 0x0008, 0x4b8: 0x0008, 0x4b9: 0x0008, 0x4ba: 0x0208, 0x4bb: 0x0208, + 0x4bc: 0x0208, 0x4bd: 0x0008, 0x4be: 0x0008, 0x4bf: 0x0208, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0018, 0x4c1: 0x0018, 0x4c2: 0x0018, 0x4c3: 0x0018, 0x4c4: 0x0018, 0x4c5: 0x0018, + 0x4c6: 0x0018, 0x4c7: 0x0018, 0x4c8: 0x0018, 0x4c9: 0x0018, 0x4ca: 0x0018, 0x4cb: 0x0018, + 0x4cc: 0x0018, 0x4cd: 0x0018, 0x4ce: 0x0040, 0x4cf: 0x0340, 0x4d0: 0x0408, 0x4d1: 0x1308, + 0x4d2: 0x0208, 0x4d3: 0x0208, 0x4d4: 0x0208, 0x4d5: 0x0408, 0x4d6: 0x0408, 0x4d7: 0x0408, + 0x4d8: 0x0408, 0x4d9: 0x0408, 0x4da: 0x0208, 0x4db: 0x0208, 0x4dc: 0x0208, 0x4dd: 0x0208, + 0x4de: 0x0408, 0x4df: 0x0208, 0x4e0: 0x0208, 0x4e1: 0x0208, 0x4e2: 0x0208, 0x4e3: 0x0208, + 0x4e4: 0x0208, 0x4e5: 0x0208, 0x4e6: 0x0208, 0x4e7: 0x0208, 0x4e8: 0x0408, 0x4e9: 0x0208, + 0x4ea: 0x0408, 0x4eb: 0x0208, 0x4ec: 0x0408, 0x4ed: 0x0208, 0x4ee: 0x0208, 0x4ef: 0x0408, + 0x4f0: 0x1308, 0x4f1: 0x1308, 0x4f2: 0x1308, 0x4f3: 0x1308, 0x4f4: 0x1308, 0x4f5: 0x1308, + 0x4f6: 0x1308, 0x4f7: 0x1308, 0x4f8: 0x1308, 0x4f9: 0x1308, 0x4fa: 0x1308, 0x4fb: 0x1308, + 0x4fc: 0x1308, 0x4fd: 0x1308, 0x4fe: 0x1308, 0x4ff: 0x1308, + // Block 0x14, offset 0x500 + 0x500: 0x1008, 0x501: 0x1308, 0x502: 0x1308, 0x503: 0x1308, 0x504: 0x1308, 0x505: 0x1308, + 0x506: 0x1308, 0x507: 0x1308, 0x508: 0x1308, 0x509: 0x1008, 0x50a: 0x1008, 0x50b: 0x1008, + 0x50c: 0x1008, 0x50d: 0x1b08, 0x50e: 0x1008, 0x50f: 0x1008, 0x510: 0x0008, 0x511: 0x1308, + 0x512: 0x1308, 0x513: 0x1308, 0x514: 0x1308, 0x515: 0x1308, 0x516: 0x1308, 0x517: 0x1308, + 0x518: 0x04c9, 0x519: 0x0501, 0x51a: 0x0539, 0x51b: 0x0571, 0x51c: 0x05a9, 0x51d: 0x05e1, + 0x51e: 0x0619, 0x51f: 0x0651, 0x520: 0x0008, 0x521: 0x0008, 0x522: 0x1308, 0x523: 0x1308, + 0x524: 0x0018, 0x525: 0x0018, 0x526: 0x0008, 0x527: 0x0008, 0x528: 0x0008, 0x529: 0x0008, + 0x52a: 0x0008, 0x52b: 0x0008, 0x52c: 0x0008, 0x52d: 0x0008, 0x52e: 0x0008, 0x52f: 0x0008, + 0x530: 0x0018, 0x531: 0x0008, 0x532: 0x0008, 0x533: 0x0008, 0x534: 0x0008, 0x535: 0x0008, + 0x536: 0x0008, 0x537: 0x0008, 0x538: 0x0008, 0x539: 0x0008, 0x53a: 0x0008, 0x53b: 0x0008, + 0x53c: 0x0008, 0x53d: 0x0008, 0x53e: 0x0008, 0x53f: 0x0008, + // Block 0x15, offset 0x540 + 0x540: 0x0008, 0x541: 0x1308, 0x542: 0x1008, 0x543: 0x1008, 0x544: 0x0040, 0x545: 0x0008, + 0x546: 0x0008, 0x547: 0x0008, 0x548: 0x0008, 0x549: 0x0008, 0x54a: 0x0008, 0x54b: 0x0008, + 0x54c: 0x0008, 0x54d: 0x0040, 0x54e: 0x0040, 0x54f: 0x0008, 0x550: 0x0008, 0x551: 0x0040, + 0x552: 0x0040, 0x553: 0x0008, 0x554: 0x0008, 0x555: 0x0008, 0x556: 0x0008, 0x557: 0x0008, + 0x558: 0x0008, 0x559: 0x0008, 0x55a: 0x0008, 0x55b: 0x0008, 0x55c: 0x0008, 0x55d: 0x0008, + 0x55e: 0x0008, 0x55f: 0x0008, 0x560: 0x0008, 0x561: 0x0008, 0x562: 0x0008, 0x563: 0x0008, + 0x564: 0x0008, 0x565: 0x0008, 0x566: 0x0008, 0x567: 0x0008, 0x568: 0x0008, 0x569: 0x0040, + 0x56a: 0x0008, 0x56b: 0x0008, 0x56c: 0x0008, 0x56d: 0x0008, 0x56e: 0x0008, 0x56f: 0x0008, + 0x570: 0x0008, 0x571: 0x0040, 0x572: 0x0008, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040, + 0x576: 0x0008, 0x577: 0x0008, 0x578: 0x0008, 0x579: 0x0008, 0x57a: 0x0040, 0x57b: 0x0040, + 0x57c: 0x1308, 0x57d: 0x0008, 0x57e: 0x1008, 0x57f: 0x1008, + // Block 0x16, offset 0x580 + 0x580: 0x1008, 0x581: 0x1308, 0x582: 0x1308, 0x583: 0x1308, 0x584: 0x1308, 0x585: 0x0040, + 0x586: 0x0040, 0x587: 0x1008, 0x588: 0x1008, 0x589: 0x0040, 0x58a: 0x0040, 0x58b: 0x1008, + 0x58c: 0x1008, 0x58d: 0x1b08, 0x58e: 0x0008, 0x58f: 0x0040, 0x590: 0x0040, 0x591: 0x0040, + 0x592: 0x0040, 0x593: 0x0040, 0x594: 0x0040, 0x595: 0x0040, 0x596: 0x0040, 0x597: 0x1008, + 0x598: 0x0040, 0x599: 0x0040, 0x59a: 0x0040, 0x59b: 0x0040, 0x59c: 0x0689, 0x59d: 0x06c1, + 0x59e: 0x0040, 0x59f: 0x06f9, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x1308, 0x5a3: 0x1308, + 0x5a4: 0x0040, 0x5a5: 0x0040, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, + 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, + 0x5b0: 0x0008, 0x5b1: 0x0008, 0x5b2: 0x0018, 0x5b3: 0x0018, 0x5b4: 0x0018, 0x5b5: 0x0018, + 0x5b6: 0x0018, 0x5b7: 0x0018, 0x5b8: 0x0018, 0x5b9: 0x0018, 0x5ba: 0x0018, 0x5bb: 0x0018, + 0x5bc: 0x0040, 0x5bd: 0x0040, 0x5be: 0x0040, 0x5bf: 0x0040, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0040, 0x5c1: 0x1308, 0x5c2: 0x1308, 0x5c3: 0x1008, 0x5c4: 0x0040, 0x5c5: 0x0008, + 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0040, + 0x5cc: 0x0040, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040, + 0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008, + 0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008, + 0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008, + 0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040, + 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, + 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0731, 0x5f4: 0x0040, 0x5f5: 0x0008, + 0x5f6: 0x0769, 0x5f7: 0x0040, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040, + 0x5fc: 0x1308, 0x5fd: 0x0040, 0x5fe: 0x1008, 0x5ff: 0x1008, + // Block 0x18, offset 0x600 + 0x600: 0x1008, 0x601: 0x1308, 0x602: 0x1308, 0x603: 0x0040, 0x604: 0x0040, 0x605: 0x0040, + 0x606: 0x0040, 0x607: 0x1308, 0x608: 0x1308, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x1308, + 0x60c: 0x1308, 0x60d: 0x1b08, 0x60e: 0x0040, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x1308, + 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x0040, + 0x618: 0x0040, 0x619: 0x07a1, 0x61a: 0x07d9, 0x61b: 0x0811, 0x61c: 0x0008, 0x61d: 0x0040, + 0x61e: 0x0849, 0x61f: 0x0040, 0x620: 0x0040, 0x621: 0x0040, 0x622: 0x0040, 0x623: 0x0040, + 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x1308, 0x631: 0x1308, 0x632: 0x0008, 0x633: 0x0008, 0x634: 0x0008, 0x635: 0x1308, + 0x636: 0x0040, 0x637: 0x0040, 0x638: 0x0040, 0x639: 0x0040, 0x63a: 0x0040, 0x63b: 0x0040, + 0x63c: 0x0040, 0x63d: 0x0040, 0x63e: 0x0040, 0x63f: 0x0040, + // Block 0x19, offset 0x640 + 0x640: 0x0040, 0x641: 0x1308, 0x642: 0x1308, 0x643: 0x1008, 0x644: 0x0040, 0x645: 0x0008, + 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0008, + 0x64c: 0x0008, 0x64d: 0x0008, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0008, + 0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008, + 0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008, + 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, + 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, + 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0008, 0x674: 0x0040, 0x675: 0x0008, + 0x676: 0x0008, 0x677: 0x0008, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, + 0x67c: 0x1308, 0x67d: 0x0008, 0x67e: 0x1008, 0x67f: 0x1008, + // Block 0x1a, offset 0x680 + 0x680: 0x1008, 0x681: 0x1308, 0x682: 0x1308, 0x683: 0x1308, 0x684: 0x1308, 0x685: 0x1308, + 0x686: 0x0040, 0x687: 0x1308, 0x688: 0x1308, 0x689: 0x1008, 0x68a: 0x0040, 0x68b: 0x1008, + 0x68c: 0x1008, 0x68d: 0x1b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0008, 0x691: 0x0040, + 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, + 0x698: 0x0040, 0x699: 0x0040, 0x69a: 0x0040, 0x69b: 0x0040, 0x69c: 0x0040, 0x69d: 0x0040, + 0x69e: 0x0040, 0x69f: 0x0040, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x1308, 0x6a3: 0x1308, + 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, + 0x6b0: 0x0018, 0x6b1: 0x0018, 0x6b2: 0x0040, 0x6b3: 0x0040, 0x6b4: 0x0040, 0x6b5: 0x0040, + 0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040, + 0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x0040, 0x6c1: 0x1308, 0x6c2: 0x1008, 0x6c3: 0x1008, 0x6c4: 0x0040, 0x6c5: 0x0008, + 0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008, + 0x6cc: 0x0008, 0x6cd: 0x0040, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0040, + 0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008, + 0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008, + 0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008, + 0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040, + 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, + 0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008, + 0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040, + 0x6fc: 0x1308, 0x6fd: 0x0008, 0x6fe: 0x1008, 0x6ff: 0x1308, + // Block 0x1c, offset 0x700 + 0x700: 0x1008, 0x701: 0x1308, 0x702: 0x1308, 0x703: 0x1308, 0x704: 0x1308, 0x705: 0x0040, + 0x706: 0x0040, 0x707: 0x1008, 0x708: 0x1008, 0x709: 0x0040, 0x70a: 0x0040, 0x70b: 0x1008, + 0x70c: 0x1008, 0x70d: 0x1b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0040, 0x711: 0x0040, + 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x1308, 0x717: 0x1008, + 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0881, 0x71d: 0x08b9, + 0x71e: 0x0040, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x1308, 0x723: 0x1308, + 0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008, + 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, + 0x730: 0x0018, 0x731: 0x0008, 0x732: 0x0018, 0x733: 0x0018, 0x734: 0x0018, 0x735: 0x0018, + 0x736: 0x0018, 0x737: 0x0018, 0x738: 0x0040, 0x739: 0x0040, 0x73a: 0x0040, 0x73b: 0x0040, + 0x73c: 0x0040, 0x73d: 0x0040, 0x73e: 0x0040, 0x73f: 0x0040, + // Block 0x1d, offset 0x740 + 0x740: 0x0040, 0x741: 0x0040, 0x742: 0x1308, 0x743: 0x0008, 0x744: 0x0040, 0x745: 0x0008, + 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0040, + 0x74c: 0x0040, 0x74d: 0x0040, 0x74e: 0x0008, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040, + 0x752: 0x0008, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0040, 0x757: 0x0040, + 0x758: 0x0040, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0040, 0x75c: 0x0008, 0x75d: 0x0040, + 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0040, 0x761: 0x0040, 0x762: 0x0040, 0x763: 0x0008, + 0x764: 0x0008, 0x765: 0x0040, 0x766: 0x0040, 0x767: 0x0040, 0x768: 0x0008, 0x769: 0x0008, + 0x76a: 0x0008, 0x76b: 0x0040, 0x76c: 0x0040, 0x76d: 0x0040, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0008, 0x771: 0x0008, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0008, 0x775: 0x0008, + 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040, + 0x77c: 0x0040, 0x77d: 0x0040, 0x77e: 0x1008, 0x77f: 0x1008, + // Block 0x1e, offset 0x780 + 0x780: 0x1308, 0x781: 0x1008, 0x782: 0x1008, 0x783: 0x1008, 0x784: 0x1008, 0x785: 0x0040, + 0x786: 0x1308, 0x787: 0x1308, 0x788: 0x1308, 0x789: 0x0040, 0x78a: 0x1308, 0x78b: 0x1308, + 0x78c: 0x1308, 0x78d: 0x1b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, + 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x1308, 0x796: 0x1308, 0x797: 0x0040, + 0x798: 0x0008, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0040, 0x79c: 0x0040, 0x79d: 0x0040, + 0x79e: 0x0040, 0x79f: 0x0040, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x1308, 0x7a3: 0x1308, + 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, + 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, + 0x7b0: 0x0040, 0x7b1: 0x0040, 0x7b2: 0x0040, 0x7b3: 0x0040, 0x7b4: 0x0040, 0x7b5: 0x0040, + 0x7b6: 0x0040, 0x7b7: 0x0040, 0x7b8: 0x0018, 0x7b9: 0x0018, 0x7ba: 0x0018, 0x7bb: 0x0018, + 0x7bc: 0x0018, 0x7bd: 0x0018, 0x7be: 0x0018, 0x7bf: 0x0018, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0008, 0x7c1: 0x1308, 0x7c2: 0x1008, 0x7c3: 0x1008, 0x7c4: 0x0040, 0x7c5: 0x0008, + 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0008, + 0x7cc: 0x0008, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040, + 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0008, 0x7d7: 0x0008, + 0x7d8: 0x0008, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0008, 0x7dc: 0x0008, 0x7dd: 0x0008, + 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x0008, 0x7e3: 0x0008, + 0x7e4: 0x0008, 0x7e5: 0x0008, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0040, + 0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008, + 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0040, 0x7f5: 0x0008, + 0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040, + 0x7fc: 0x1308, 0x7fd: 0x0008, 0x7fe: 0x1008, 0x7ff: 0x1308, + // Block 0x20, offset 0x800 + 0x800: 0x1008, 0x801: 0x1008, 0x802: 0x1008, 0x803: 0x1008, 0x804: 0x1008, 0x805: 0x0040, + 0x806: 0x1308, 0x807: 0x1008, 0x808: 0x1008, 0x809: 0x0040, 0x80a: 0x1008, 0x80b: 0x1008, + 0x80c: 0x1308, 0x80d: 0x1b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040, + 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x1008, 0x816: 0x1008, 0x817: 0x0040, + 0x818: 0x0040, 0x819: 0x0040, 0x81a: 0x0040, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040, + 0x81e: 0x0008, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x1308, 0x823: 0x1308, + 0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008, + 0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008, + 0x830: 0x0040, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040, + 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0040, 0x839: 0x0040, 0x83a: 0x0040, 0x83b: 0x0040, + 0x83c: 0x0040, 0x83d: 0x0040, 0x83e: 0x0040, 0x83f: 0x0040, + // Block 0x21, offset 0x840 + 0x840: 0x1008, 0x841: 0x1308, 0x842: 0x1308, 0x843: 0x1308, 0x844: 0x1308, 0x845: 0x0040, + 0x846: 0x1008, 0x847: 0x1008, 0x848: 0x1008, 0x849: 0x0040, 0x84a: 0x1008, 0x84b: 0x1008, + 0x84c: 0x1008, 0x84d: 0x1b08, 0x84e: 0x0008, 0x84f: 0x0018, 0x850: 0x0040, 0x851: 0x0040, + 0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x1008, + 0x858: 0x0018, 0x859: 0x0018, 0x85a: 0x0018, 0x85b: 0x0018, 0x85c: 0x0018, 0x85d: 0x0018, + 0x85e: 0x0018, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x1308, 0x863: 0x1308, + 0x864: 0x0040, 0x865: 0x0040, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0008, + 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, + 0x870: 0x0018, 0x871: 0x0018, 0x872: 0x0018, 0x873: 0x0018, 0x874: 0x0018, 0x875: 0x0018, + 0x876: 0x0018, 0x877: 0x0018, 0x878: 0x0018, 0x879: 0x0018, 0x87a: 0x0008, 0x87b: 0x0008, + 0x87c: 0x0008, 0x87d: 0x0008, 0x87e: 0x0008, 0x87f: 0x0008, + // Block 0x22, offset 0x880 + 0x880: 0x0040, 0x881: 0x0008, 0x882: 0x0008, 0x883: 0x0040, 0x884: 0x0008, 0x885: 0x0040, + 0x886: 0x0040, 0x887: 0x0008, 0x888: 0x0008, 0x889: 0x0040, 0x88a: 0x0008, 0x88b: 0x0040, + 0x88c: 0x0040, 0x88d: 0x0008, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040, + 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x0008, + 0x898: 0x0040, 0x899: 0x0008, 0x89a: 0x0008, 0x89b: 0x0008, 0x89c: 0x0008, 0x89d: 0x0008, + 0x89e: 0x0008, 0x89f: 0x0008, 0x8a0: 0x0040, 0x8a1: 0x0008, 0x8a2: 0x0008, 0x8a3: 0x0008, + 0x8a4: 0x0040, 0x8a5: 0x0008, 0x8a6: 0x0040, 0x8a7: 0x0008, 0x8a8: 0x0040, 0x8a9: 0x0040, + 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0040, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, + 0x8b0: 0x0008, 0x8b1: 0x1308, 0x8b2: 0x0008, 0x8b3: 0x0929, 0x8b4: 0x1308, 0x8b5: 0x1308, + 0x8b6: 0x1308, 0x8b7: 0x1308, 0x8b8: 0x1308, 0x8b9: 0x1308, 0x8ba: 0x0040, 0x8bb: 0x1308, + 0x8bc: 0x1308, 0x8bd: 0x0008, 0x8be: 0x0040, 0x8bf: 0x0040, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0008, 0x8c1: 0x0008, 0x8c2: 0x0008, 0x8c3: 0x09d1, 0x8c4: 0x0008, 0x8c5: 0x0008, + 0x8c6: 0x0008, 0x8c7: 0x0008, 0x8c8: 0x0040, 0x8c9: 0x0008, 0x8ca: 0x0008, 0x8cb: 0x0008, + 0x8cc: 0x0008, 0x8cd: 0x0a09, 0x8ce: 0x0008, 0x8cf: 0x0008, 0x8d0: 0x0008, 0x8d1: 0x0008, + 0x8d2: 0x0a41, 0x8d3: 0x0008, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x0a79, + 0x8d8: 0x0008, 0x8d9: 0x0008, 0x8da: 0x0008, 0x8db: 0x0008, 0x8dc: 0x0ab1, 0x8dd: 0x0008, + 0x8de: 0x0008, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x0008, 0x8e3: 0x0008, + 0x8e4: 0x0008, 0x8e5: 0x0008, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0ae9, + 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0040, 0x8ee: 0x0040, 0x8ef: 0x0040, + 0x8f0: 0x0040, 0x8f1: 0x1308, 0x8f2: 0x1308, 0x8f3: 0x0b21, 0x8f4: 0x1308, 0x8f5: 0x0b59, + 0x8f6: 0x0b91, 0x8f7: 0x0bc9, 0x8f8: 0x0c19, 0x8f9: 0x0c51, 0x8fa: 0x1308, 0x8fb: 0x1308, + 0x8fc: 0x1308, 0x8fd: 0x1308, 0x8fe: 0x1308, 0x8ff: 0x1008, + // Block 0x24, offset 0x900 + 0x900: 0x1308, 0x901: 0x0ca1, 0x902: 0x1308, 0x903: 0x1308, 0x904: 0x1b08, 0x905: 0x0018, + 0x906: 0x1308, 0x907: 0x1308, 0x908: 0x0008, 0x909: 0x0008, 0x90a: 0x0008, 0x90b: 0x0008, + 0x90c: 0x0008, 0x90d: 0x1308, 0x90e: 0x1308, 0x90f: 0x1308, 0x910: 0x1308, 0x911: 0x1308, + 0x912: 0x1308, 0x913: 0x0cd9, 0x914: 0x1308, 0x915: 0x1308, 0x916: 0x1308, 0x917: 0x1308, + 0x918: 0x0040, 0x919: 0x1308, 0x91a: 0x1308, 0x91b: 0x1308, 0x91c: 0x1308, 0x91d: 0x0d11, + 0x91e: 0x1308, 0x91f: 0x1308, 0x920: 0x1308, 0x921: 0x1308, 0x922: 0x0d49, 0x923: 0x1308, + 0x924: 0x1308, 0x925: 0x1308, 0x926: 0x1308, 0x927: 0x0d81, 0x928: 0x1308, 0x929: 0x1308, + 0x92a: 0x1308, 0x92b: 0x1308, 0x92c: 0x0db9, 0x92d: 0x1308, 0x92e: 0x1308, 0x92f: 0x1308, + 0x930: 0x1308, 0x931: 0x1308, 0x932: 0x1308, 0x933: 0x1308, 0x934: 0x1308, 0x935: 0x1308, + 0x936: 0x1308, 0x937: 0x1308, 0x938: 0x1308, 0x939: 0x0df1, 0x93a: 0x1308, 0x93b: 0x1308, + 0x93c: 0x1308, 0x93d: 0x0040, 0x93e: 0x0018, 0x93f: 0x0018, + // Block 0x25, offset 0x940 + 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0008, 0x944: 0x0008, 0x945: 0x0008, + 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, + 0x94c: 0x0008, 0x94d: 0x0008, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, + 0x952: 0x0008, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0008, + 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0008, 0x95d: 0x0008, + 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, + 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0008, + 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0039, 0x96d: 0x0ed1, 0x96e: 0x0ee9, 0x96f: 0x0008, + 0x970: 0x0ef9, 0x971: 0x0f09, 0x972: 0x0f19, 0x973: 0x0f31, 0x974: 0x0249, 0x975: 0x0f41, + 0x976: 0x0259, 0x977: 0x0f51, 0x978: 0x0359, 0x979: 0x0f61, 0x97a: 0x0f71, 0x97b: 0x0008, + 0x97c: 0x00d9, 0x97d: 0x0f81, 0x97e: 0x0f99, 0x97f: 0x0269, + // Block 0x26, offset 0x980 + 0x980: 0x0fa9, 0x981: 0x0fb9, 0x982: 0x0279, 0x983: 0x0039, 0x984: 0x0fc9, 0x985: 0x0fe1, + 0x986: 0x059d, 0x987: 0x0ee9, 0x988: 0x0ef9, 0x989: 0x0f09, 0x98a: 0x0ff9, 0x98b: 0x1011, + 0x98c: 0x1029, 0x98d: 0x0f31, 0x98e: 0x0008, 0x98f: 0x0f51, 0x990: 0x0f61, 0x991: 0x1041, + 0x992: 0x00d9, 0x993: 0x1059, 0x994: 0x05b5, 0x995: 0x05b5, 0x996: 0x0f99, 0x997: 0x0fa9, + 0x998: 0x0fb9, 0x999: 0x059d, 0x99a: 0x1071, 0x99b: 0x1089, 0x99c: 0x05cd, 0x99d: 0x1099, + 0x99e: 0x10b1, 0x99f: 0x10c9, 0x9a0: 0x10e1, 0x9a1: 0x10f9, 0x9a2: 0x0f41, 0x9a3: 0x0269, + 0x9a4: 0x0fb9, 0x9a5: 0x1089, 0x9a6: 0x1099, 0x9a7: 0x10b1, 0x9a8: 0x1111, 0x9a9: 0x10e1, + 0x9aa: 0x10f9, 0x9ab: 0x0008, 0x9ac: 0x0008, 0x9ad: 0x0008, 0x9ae: 0x0008, 0x9af: 0x0008, + 0x9b0: 0x0008, 0x9b1: 0x0008, 0x9b2: 0x0008, 0x9b3: 0x0008, 0x9b4: 0x0008, 0x9b5: 0x0008, + 0x9b6: 0x0008, 0x9b7: 0x0008, 0x9b8: 0x1129, 0x9b9: 0x0008, 0x9ba: 0x0008, 0x9bb: 0x0008, + 0x9bc: 0x0008, 0x9bd: 0x0008, 0x9be: 0x0008, 0x9bf: 0x0008, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, + 0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, + 0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008, + 0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008, + 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x1141, 0x9dc: 0x1159, 0x9dd: 0x1169, + 0x9de: 0x1181, 0x9df: 0x1029, 0x9e0: 0x1199, 0x9e1: 0x11a9, 0x9e2: 0x11c1, 0x9e3: 0x11d9, + 0x9e4: 0x11f1, 0x9e5: 0x1209, 0x9e6: 0x1221, 0x9e7: 0x05e5, 0x9e8: 0x1239, 0x9e9: 0x1251, + 0x9ea: 0xe17d, 0x9eb: 0x1269, 0x9ec: 0x1281, 0x9ed: 0x1299, 0x9ee: 0x12b1, 0x9ef: 0x12c9, + 0x9f0: 0x12e1, 0x9f1: 0x12f9, 0x9f2: 0x1311, 0x9f3: 0x1329, 0x9f4: 0x1341, 0x9f5: 0x1359, + 0x9f6: 0x1371, 0x9f7: 0x1389, 0x9f8: 0x05fd, 0x9f9: 0x13a1, 0x9fa: 0x13b9, 0x9fb: 0x13d1, + 0x9fc: 0x13e1, 0x9fd: 0x13f9, 0x9fe: 0x1411, 0x9ff: 0x1429, + // Block 0x28, offset 0xa00 + 0xa00: 0xe00d, 0xa01: 0x0008, 0xa02: 0xe00d, 0xa03: 0x0008, 0xa04: 0xe00d, 0xa05: 0x0008, + 0xa06: 0xe00d, 0xa07: 0x0008, 0xa08: 0xe00d, 0xa09: 0x0008, 0xa0a: 0xe00d, 0xa0b: 0x0008, + 0xa0c: 0xe00d, 0xa0d: 0x0008, 0xa0e: 0xe00d, 0xa0f: 0x0008, 0xa10: 0xe00d, 0xa11: 0x0008, + 0xa12: 0xe00d, 0xa13: 0x0008, 0xa14: 0xe00d, 0xa15: 0x0008, 0xa16: 0xe00d, 0xa17: 0x0008, + 0xa18: 0xe00d, 0xa19: 0x0008, 0xa1a: 0xe00d, 0xa1b: 0x0008, 0xa1c: 0xe00d, 0xa1d: 0x0008, + 0xa1e: 0xe00d, 0xa1f: 0x0008, 0xa20: 0xe00d, 0xa21: 0x0008, 0xa22: 0xe00d, 0xa23: 0x0008, + 0xa24: 0xe00d, 0xa25: 0x0008, 0xa26: 0xe00d, 0xa27: 0x0008, 0xa28: 0xe00d, 0xa29: 0x0008, + 0xa2a: 0xe00d, 0xa2b: 0x0008, 0xa2c: 0xe00d, 0xa2d: 0x0008, 0xa2e: 0xe00d, 0xa2f: 0x0008, + 0xa30: 0xe00d, 0xa31: 0x0008, 0xa32: 0xe00d, 0xa33: 0x0008, 0xa34: 0xe00d, 0xa35: 0x0008, + 0xa36: 0xe00d, 0xa37: 0x0008, 0xa38: 0xe00d, 0xa39: 0x0008, 0xa3a: 0xe00d, 0xa3b: 0x0008, + 0xa3c: 0xe00d, 0xa3d: 0x0008, 0xa3e: 0xe00d, 0xa3f: 0x0008, + // Block 0x29, offset 0xa40 + 0xa40: 0xe00d, 0xa41: 0x0008, 0xa42: 0xe00d, 0xa43: 0x0008, 0xa44: 0xe00d, 0xa45: 0x0008, + 0xa46: 0xe00d, 0xa47: 0x0008, 0xa48: 0xe00d, 0xa49: 0x0008, 0xa4a: 0xe00d, 0xa4b: 0x0008, + 0xa4c: 0xe00d, 0xa4d: 0x0008, 0xa4e: 0xe00d, 0xa4f: 0x0008, 0xa50: 0xe00d, 0xa51: 0x0008, + 0xa52: 0xe00d, 0xa53: 0x0008, 0xa54: 0xe00d, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, + 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0615, 0xa5b: 0x0635, 0xa5c: 0x0008, 0xa5d: 0x0008, + 0xa5e: 0x1441, 0xa5f: 0x0008, 0xa60: 0xe00d, 0xa61: 0x0008, 0xa62: 0xe00d, 0xa63: 0x0008, + 0xa64: 0xe00d, 0xa65: 0x0008, 0xa66: 0xe00d, 0xa67: 0x0008, 0xa68: 0xe00d, 0xa69: 0x0008, + 0xa6a: 0xe00d, 0xa6b: 0x0008, 0xa6c: 0xe00d, 0xa6d: 0x0008, 0xa6e: 0xe00d, 0xa6f: 0x0008, + 0xa70: 0xe00d, 0xa71: 0x0008, 0xa72: 0xe00d, 0xa73: 0x0008, 0xa74: 0xe00d, 0xa75: 0x0008, + 0xa76: 0xe00d, 0xa77: 0x0008, 0xa78: 0xe00d, 0xa79: 0x0008, 0xa7a: 0xe00d, 0xa7b: 0x0008, + 0xa7c: 0xe00d, 0xa7d: 0x0008, 0xa7e: 0xe00d, 0xa7f: 0x0008, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0008, 0xa81: 0x0008, 0xa82: 0x0008, 0xa83: 0x0008, 0xa84: 0x0008, 0xa85: 0x0008, + 0xa86: 0x0040, 0xa87: 0x0040, 0xa88: 0xe045, 0xa89: 0xe045, 0xa8a: 0xe045, 0xa8b: 0xe045, + 0xa8c: 0xe045, 0xa8d: 0xe045, 0xa8e: 0x0040, 0xa8f: 0x0040, 0xa90: 0x0008, 0xa91: 0x0008, + 0xa92: 0x0008, 0xa93: 0x0008, 0xa94: 0x0008, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008, + 0xa98: 0x0040, 0xa99: 0xe045, 0xa9a: 0x0040, 0xa9b: 0xe045, 0xa9c: 0x0040, 0xa9d: 0xe045, + 0xa9e: 0x0040, 0xa9f: 0xe045, 0xaa0: 0x0008, 0xaa1: 0x0008, 0xaa2: 0x0008, 0xaa3: 0x0008, + 0xaa4: 0x0008, 0xaa5: 0x0008, 0xaa6: 0x0008, 0xaa7: 0x0008, 0xaa8: 0xe045, 0xaa9: 0xe045, + 0xaaa: 0xe045, 0xaab: 0xe045, 0xaac: 0xe045, 0xaad: 0xe045, 0xaae: 0xe045, 0xaaf: 0xe045, + 0xab0: 0x0008, 0xab1: 0x1459, 0xab2: 0x0008, 0xab3: 0x1471, 0xab4: 0x0008, 0xab5: 0x1489, + 0xab6: 0x0008, 0xab7: 0x14a1, 0xab8: 0x0008, 0xab9: 0x14b9, 0xaba: 0x0008, 0xabb: 0x14d1, + 0xabc: 0x0008, 0xabd: 0x14e9, 0xabe: 0x0040, 0xabf: 0x0040, + // Block 0x2b, offset 0xac0 + 0xac0: 0x1501, 0xac1: 0x1531, 0xac2: 0x1561, 0xac3: 0x1591, 0xac4: 0x15c1, 0xac5: 0x15f1, + 0xac6: 0x1621, 0xac7: 0x1651, 0xac8: 0x1501, 0xac9: 0x1531, 0xaca: 0x1561, 0xacb: 0x1591, + 0xacc: 0x15c1, 0xacd: 0x15f1, 0xace: 0x1621, 0xacf: 0x1651, 0xad0: 0x1681, 0xad1: 0x16b1, + 0xad2: 0x16e1, 0xad3: 0x1711, 0xad4: 0x1741, 0xad5: 0x1771, 0xad6: 0x17a1, 0xad7: 0x17d1, + 0xad8: 0x1681, 0xad9: 0x16b1, 0xada: 0x16e1, 0xadb: 0x1711, 0xadc: 0x1741, 0xadd: 0x1771, + 0xade: 0x17a1, 0xadf: 0x17d1, 0xae0: 0x1801, 0xae1: 0x1831, 0xae2: 0x1861, 0xae3: 0x1891, + 0xae4: 0x18c1, 0xae5: 0x18f1, 0xae6: 0x1921, 0xae7: 0x1951, 0xae8: 0x1801, 0xae9: 0x1831, + 0xaea: 0x1861, 0xaeb: 0x1891, 0xaec: 0x18c1, 0xaed: 0x18f1, 0xaee: 0x1921, 0xaef: 0x1951, + 0xaf0: 0x0008, 0xaf1: 0x0008, 0xaf2: 0x1981, 0xaf3: 0x19b1, 0xaf4: 0x19d9, 0xaf5: 0x0040, + 0xaf6: 0x0008, 0xaf7: 0x1a01, 0xaf8: 0xe045, 0xaf9: 0xe045, 0xafa: 0x064d, 0xafb: 0x1459, + 0xafc: 0x19b1, 0xafd: 0x0666, 0xafe: 0x1a31, 0xaff: 0x0686, + // Block 0x2c, offset 0xb00 + 0xb00: 0x06a6, 0xb01: 0x1a4a, 0xb02: 0x1a79, 0xb03: 0x1aa9, 0xb04: 0x1ad1, 0xb05: 0x0040, + 0xb06: 0x0008, 0xb07: 0x1af9, 0xb08: 0x06c5, 0xb09: 0x1471, 0xb0a: 0x06dd, 0xb0b: 0x1489, + 0xb0c: 0x1aa9, 0xb0d: 0x1b2a, 0xb0e: 0x1b5a, 0xb0f: 0x1b8a, 0xb10: 0x0008, 0xb11: 0x0008, + 0xb12: 0x0008, 0xb13: 0x1bb9, 0xb14: 0x0040, 0xb15: 0x0040, 0xb16: 0x0008, 0xb17: 0x0008, + 0xb18: 0xe045, 0xb19: 0xe045, 0xb1a: 0x06f5, 0xb1b: 0x14a1, 0xb1c: 0x0040, 0xb1d: 0x1bd2, + 0xb1e: 0x1c02, 0xb1f: 0x1c32, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x1c61, + 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, + 0xb2a: 0x070d, 0xb2b: 0x14d1, 0xb2c: 0xe04d, 0xb2d: 0x1c7a, 0xb2e: 0x03d2, 0xb2f: 0x1caa, + 0xb30: 0x0040, 0xb31: 0x0040, 0xb32: 0x1cb9, 0xb33: 0x1ce9, 0xb34: 0x1d11, 0xb35: 0x0040, + 0xb36: 0x0008, 0xb37: 0x1d39, 0xb38: 0x0725, 0xb39: 0x14b9, 0xb3a: 0x0515, 0xb3b: 0x14e9, + 0xb3c: 0x1ce9, 0xb3d: 0x073e, 0xb3e: 0x075e, 0xb3f: 0x0040, + // Block 0x2d, offset 0xb40 + 0xb40: 0x000a, 0xb41: 0x000a, 0xb42: 0x000a, 0xb43: 0x000a, 0xb44: 0x000a, 0xb45: 0x000a, + 0xb46: 0x000a, 0xb47: 0x000a, 0xb48: 0x000a, 0xb49: 0x000a, 0xb4a: 0x000a, 0xb4b: 0x03c0, + 0xb4c: 0x0003, 0xb4d: 0x0003, 0xb4e: 0x0340, 0xb4f: 0x0340, 0xb50: 0x0018, 0xb51: 0xe00d, + 0xb52: 0x0018, 0xb53: 0x0018, 0xb54: 0x0018, 0xb55: 0x0018, 0xb56: 0x0018, 0xb57: 0x077e, + 0xb58: 0x0018, 0xb59: 0x0018, 0xb5a: 0x0018, 0xb5b: 0x0018, 0xb5c: 0x0018, 0xb5d: 0x0018, + 0xb5e: 0x0018, 0xb5f: 0x0018, 0xb60: 0x0018, 0xb61: 0x0018, 0xb62: 0x0018, 0xb63: 0x0018, + 0xb64: 0x0040, 0xb65: 0x0040, 0xb66: 0x0040, 0xb67: 0x0018, 0xb68: 0x0040, 0xb69: 0x0040, + 0xb6a: 0x0340, 0xb6b: 0x0340, 0xb6c: 0x0340, 0xb6d: 0x0340, 0xb6e: 0x0340, 0xb6f: 0x000a, + 0xb70: 0x0018, 0xb71: 0x0018, 0xb72: 0x0018, 0xb73: 0x1d69, 0xb74: 0x1da1, 0xb75: 0x0018, + 0xb76: 0x1df1, 0xb77: 0x1e29, 0xb78: 0x0018, 0xb79: 0x0018, 0xb7a: 0x0018, 0xb7b: 0x0018, + 0xb7c: 0x1e7a, 0xb7d: 0x0018, 0xb7e: 0x079e, 0xb7f: 0x0018, + // Block 0x2e, offset 0xb80 + 0xb80: 0x0018, 0xb81: 0x0018, 0xb82: 0x0018, 0xb83: 0x0018, 0xb84: 0x0018, 0xb85: 0x0018, + 0xb86: 0x0018, 0xb87: 0x1e92, 0xb88: 0x1eaa, 0xb89: 0x1ec2, 0xb8a: 0x0018, 0xb8b: 0x0018, + 0xb8c: 0x0018, 0xb8d: 0x0018, 0xb8e: 0x0018, 0xb8f: 0x0018, 0xb90: 0x0018, 0xb91: 0x0018, + 0xb92: 0x0018, 0xb93: 0x0018, 0xb94: 0x0018, 0xb95: 0x0018, 0xb96: 0x0018, 0xb97: 0x1ed9, + 0xb98: 0x0018, 0xb99: 0x0018, 0xb9a: 0x0018, 0xb9b: 0x0018, 0xb9c: 0x0018, 0xb9d: 0x0018, + 0xb9e: 0x0018, 0xb9f: 0x000a, 0xba0: 0x03c0, 0xba1: 0x0340, 0xba2: 0x0340, 0xba3: 0x0340, + 0xba4: 0x03c0, 0xba5: 0x0040, 0xba6: 0x0040, 0xba7: 0x0040, 0xba8: 0x0040, 0xba9: 0x0040, + 0xbaa: 0x0340, 0xbab: 0x0340, 0xbac: 0x0340, 0xbad: 0x0340, 0xbae: 0x0340, 0xbaf: 0x0340, + 0xbb0: 0x1f41, 0xbb1: 0x0f41, 0xbb2: 0x0040, 0xbb3: 0x0040, 0xbb4: 0x1f51, 0xbb5: 0x1f61, + 0xbb6: 0x1f71, 0xbb7: 0x1f81, 0xbb8: 0x1f91, 0xbb9: 0x1fa1, 0xbba: 0x1fb2, 0xbbb: 0x07bd, + 0xbbc: 0x1fc2, 0xbbd: 0x1fd2, 0xbbe: 0x1fe2, 0xbbf: 0x0f71, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x1f41, 0xbc1: 0x00c9, 0xbc2: 0x0069, 0xbc3: 0x0079, 0xbc4: 0x1f51, 0xbc5: 0x1f61, + 0xbc6: 0x1f71, 0xbc7: 0x1f81, 0xbc8: 0x1f91, 0xbc9: 0x1fa1, 0xbca: 0x1fb2, 0xbcb: 0x07d5, + 0xbcc: 0x1fc2, 0xbcd: 0x1fd2, 0xbce: 0x1fe2, 0xbcf: 0x0040, 0xbd0: 0x0039, 0xbd1: 0x0f09, + 0xbd2: 0x00d9, 0xbd3: 0x0369, 0xbd4: 0x0ff9, 0xbd5: 0x0249, 0xbd6: 0x0f51, 0xbd7: 0x0359, + 0xbd8: 0x0f61, 0xbd9: 0x0f71, 0xbda: 0x0f99, 0xbdb: 0x01d9, 0xbdc: 0x0fa9, 0xbdd: 0x0040, + 0xbde: 0x0040, 0xbdf: 0x0040, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, + 0xbe4: 0x0018, 0xbe5: 0x0018, 0xbe6: 0x0018, 0xbe7: 0x0018, 0xbe8: 0x1ff1, 0xbe9: 0x0018, + 0xbea: 0x0018, 0xbeb: 0x0018, 0xbec: 0x0018, 0xbed: 0x0018, 0xbee: 0x0018, 0xbef: 0x0018, + 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x0018, 0xbf4: 0x0018, 0xbf5: 0x0018, + 0xbf6: 0x0018, 0xbf7: 0x0018, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, + 0xbfc: 0x0018, 0xbfd: 0x0018, 0xbfe: 0x0018, 0xbff: 0x0040, + // Block 0x30, offset 0xc00 + 0xc00: 0x07ee, 0xc01: 0x080e, 0xc02: 0x1159, 0xc03: 0x082d, 0xc04: 0x0018, 0xc05: 0x084e, + 0xc06: 0x086e, 0xc07: 0x1011, 0xc08: 0x0018, 0xc09: 0x088d, 0xc0a: 0x0f31, 0xc0b: 0x0249, + 0xc0c: 0x0249, 0xc0d: 0x0249, 0xc0e: 0x0249, 0xc0f: 0x2009, 0xc10: 0x0f41, 0xc11: 0x0f41, + 0xc12: 0x0359, 0xc13: 0x0359, 0xc14: 0x0018, 0xc15: 0x0f71, 0xc16: 0x2021, 0xc17: 0x0018, + 0xc18: 0x0018, 0xc19: 0x0f99, 0xc1a: 0x2039, 0xc1b: 0x0269, 0xc1c: 0x0269, 0xc1d: 0x0269, + 0xc1e: 0x0018, 0xc1f: 0x0018, 0xc20: 0x2049, 0xc21: 0x08ad, 0xc22: 0x2061, 0xc23: 0x0018, + 0xc24: 0x13d1, 0xc25: 0x0018, 0xc26: 0x2079, 0xc27: 0x0018, 0xc28: 0x13d1, 0xc29: 0x0018, + 0xc2a: 0x0f51, 0xc2b: 0x2091, 0xc2c: 0x0ee9, 0xc2d: 0x1159, 0xc2e: 0x0018, 0xc2f: 0x0f09, + 0xc30: 0x0f09, 0xc31: 0x1199, 0xc32: 0x0040, 0xc33: 0x0f61, 0xc34: 0x00d9, 0xc35: 0x20a9, + 0xc36: 0x20c1, 0xc37: 0x20d9, 0xc38: 0x20f1, 0xc39: 0x0f41, 0xc3a: 0x0018, 0xc3b: 0x08cd, + 0xc3c: 0x2109, 0xc3d: 0x10b1, 0xc3e: 0x10b1, 0xc3f: 0x2109, + // Block 0x31, offset 0xc40 + 0xc40: 0x08ed, 0xc41: 0x0018, 0xc42: 0x0018, 0xc43: 0x0018, 0xc44: 0x0018, 0xc45: 0x0ef9, + 0xc46: 0x0ef9, 0xc47: 0x0f09, 0xc48: 0x0f41, 0xc49: 0x0259, 0xc4a: 0x0018, 0xc4b: 0x0018, + 0xc4c: 0x0018, 0xc4d: 0x0018, 0xc4e: 0x0008, 0xc4f: 0x0018, 0xc50: 0x2121, 0xc51: 0x2151, + 0xc52: 0x2181, 0xc53: 0x21b9, 0xc54: 0x21e9, 0xc55: 0x2219, 0xc56: 0x2249, 0xc57: 0x2279, + 0xc58: 0x22a9, 0xc59: 0x22d9, 0xc5a: 0x2309, 0xc5b: 0x2339, 0xc5c: 0x2369, 0xc5d: 0x2399, + 0xc5e: 0x23c9, 0xc5f: 0x23f9, 0xc60: 0x0f41, 0xc61: 0x2421, 0xc62: 0x0905, 0xc63: 0x2439, + 0xc64: 0x1089, 0xc65: 0x2451, 0xc66: 0x0925, 0xc67: 0x2469, 0xc68: 0x2491, 0xc69: 0x0369, + 0xc6a: 0x24a9, 0xc6b: 0x0945, 0xc6c: 0x0359, 0xc6d: 0x1159, 0xc6e: 0x0ef9, 0xc6f: 0x0f61, + 0xc70: 0x0f41, 0xc71: 0x2421, 0xc72: 0x0965, 0xc73: 0x2439, 0xc74: 0x1089, 0xc75: 0x2451, + 0xc76: 0x0985, 0xc77: 0x2469, 0xc78: 0x2491, 0xc79: 0x0369, 0xc7a: 0x24a9, 0xc7b: 0x09a5, + 0xc7c: 0x0359, 0xc7d: 0x1159, 0xc7e: 0x0ef9, 0xc7f: 0x0f61, + // Block 0x32, offset 0xc80 + 0xc80: 0x0018, 0xc81: 0x0018, 0xc82: 0x0018, 0xc83: 0x0018, 0xc84: 0x0018, 0xc85: 0x0018, + 0xc86: 0x0018, 0xc87: 0x0018, 0xc88: 0x0018, 0xc89: 0x0018, 0xc8a: 0x0018, 0xc8b: 0x0040, + 0xc8c: 0x0040, 0xc8d: 0x0040, 0xc8e: 0x0040, 0xc8f: 0x0040, 0xc90: 0x0040, 0xc91: 0x0040, + 0xc92: 0x0040, 0xc93: 0x0040, 0xc94: 0x0040, 0xc95: 0x0040, 0xc96: 0x0040, 0xc97: 0x0040, + 0xc98: 0x0040, 0xc99: 0x0040, 0xc9a: 0x0040, 0xc9b: 0x0040, 0xc9c: 0x0040, 0xc9d: 0x0040, + 0xc9e: 0x0040, 0xc9f: 0x0040, 0xca0: 0x00c9, 0xca1: 0x0069, 0xca2: 0x0079, 0xca3: 0x1f51, + 0xca4: 0x1f61, 0xca5: 0x1f71, 0xca6: 0x1f81, 0xca7: 0x1f91, 0xca8: 0x1fa1, 0xca9: 0x2601, + 0xcaa: 0x2619, 0xcab: 0x2631, 0xcac: 0x2649, 0xcad: 0x2661, 0xcae: 0x2679, 0xcaf: 0x2691, + 0xcb0: 0x26a9, 0xcb1: 0x26c1, 0xcb2: 0x26d9, 0xcb3: 0x26f1, 0xcb4: 0x0a06, 0xcb5: 0x0a26, + 0xcb6: 0x0a46, 0xcb7: 0x0a66, 0xcb8: 0x0a86, 0xcb9: 0x0aa6, 0xcba: 0x0ac6, 0xcbb: 0x0ae6, + 0xcbc: 0x0b06, 0xcbd: 0x270a, 0xcbe: 0x2732, 0xcbf: 0x275a, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x2782, 0xcc1: 0x27aa, 0xcc2: 0x27d2, 0xcc3: 0x27fa, 0xcc4: 0x2822, 0xcc5: 0x284a, + 0xcc6: 0x2872, 0xcc7: 0x289a, 0xcc8: 0x0040, 0xcc9: 0x0040, 0xcca: 0x0040, 0xccb: 0x0040, + 0xccc: 0x0040, 0xccd: 0x0040, 0xcce: 0x0040, 0xccf: 0x0040, 0xcd0: 0x0040, 0xcd1: 0x0040, + 0xcd2: 0x0040, 0xcd3: 0x0040, 0xcd4: 0x0040, 0xcd5: 0x0040, 0xcd6: 0x0040, 0xcd7: 0x0040, + 0xcd8: 0x0040, 0xcd9: 0x0040, 0xcda: 0x0040, 0xcdb: 0x0040, 0xcdc: 0x0b26, 0xcdd: 0x0b46, + 0xcde: 0x0b66, 0xcdf: 0x0b86, 0xce0: 0x0ba6, 0xce1: 0x0bc6, 0xce2: 0x0be6, 0xce3: 0x0c06, + 0xce4: 0x0c26, 0xce5: 0x0c46, 0xce6: 0x0c66, 0xce7: 0x0c86, 0xce8: 0x0ca6, 0xce9: 0x0cc6, + 0xcea: 0x0ce6, 0xceb: 0x0d06, 0xcec: 0x0d26, 0xced: 0x0d46, 0xcee: 0x0d66, 0xcef: 0x0d86, + 0xcf0: 0x0da6, 0xcf1: 0x0dc6, 0xcf2: 0x0de6, 0xcf3: 0x0e06, 0xcf4: 0x0e26, 0xcf5: 0x0e46, + 0xcf6: 0x0039, 0xcf7: 0x0ee9, 0xcf8: 0x1159, 0xcf9: 0x0ef9, 0xcfa: 0x0f09, 0xcfb: 0x1199, + 0xcfc: 0x0f31, 0xcfd: 0x0249, 0xcfe: 0x0f41, 0xcff: 0x0259, + // Block 0x34, offset 0xd00 + 0xd00: 0x0f51, 0xd01: 0x0359, 0xd02: 0x0f61, 0xd03: 0x0f71, 0xd04: 0x00d9, 0xd05: 0x0f99, + 0xd06: 0x2039, 0xd07: 0x0269, 0xd08: 0x01d9, 0xd09: 0x0fa9, 0xd0a: 0x0fb9, 0xd0b: 0x1089, + 0xd0c: 0x0279, 0xd0d: 0x0369, 0xd0e: 0x0289, 0xd0f: 0x13d1, 0xd10: 0x0039, 0xd11: 0x0ee9, + 0xd12: 0x1159, 0xd13: 0x0ef9, 0xd14: 0x0f09, 0xd15: 0x1199, 0xd16: 0x0f31, 0xd17: 0x0249, + 0xd18: 0x0f41, 0xd19: 0x0259, 0xd1a: 0x0f51, 0xd1b: 0x0359, 0xd1c: 0x0f61, 0xd1d: 0x0f71, + 0xd1e: 0x00d9, 0xd1f: 0x0f99, 0xd20: 0x2039, 0xd21: 0x0269, 0xd22: 0x01d9, 0xd23: 0x0fa9, + 0xd24: 0x0fb9, 0xd25: 0x1089, 0xd26: 0x0279, 0xd27: 0x0369, 0xd28: 0x0289, 0xd29: 0x13d1, + 0xd2a: 0x1f41, 0xd2b: 0x0018, 0xd2c: 0x0018, 0xd2d: 0x0018, 0xd2e: 0x0018, 0xd2f: 0x0018, + 0xd30: 0x0018, 0xd31: 0x0018, 0xd32: 0x0018, 0xd33: 0x0018, 0xd34: 0x0018, 0xd35: 0x0018, + 0xd36: 0x0018, 0xd37: 0x0018, 0xd38: 0x0018, 0xd39: 0x0018, 0xd3a: 0x0018, 0xd3b: 0x0018, + 0xd3c: 0x0018, 0xd3d: 0x0018, 0xd3e: 0x0018, 0xd3f: 0x0018, + // Block 0x35, offset 0xd40 + 0xd40: 0x0008, 0xd41: 0x0008, 0xd42: 0x0008, 0xd43: 0x0008, 0xd44: 0x0008, 0xd45: 0x0008, + 0xd46: 0x0008, 0xd47: 0x0008, 0xd48: 0x0008, 0xd49: 0x0008, 0xd4a: 0x0008, 0xd4b: 0x0008, + 0xd4c: 0x0008, 0xd4d: 0x0008, 0xd4e: 0x0008, 0xd4f: 0x0008, 0xd50: 0x0008, 0xd51: 0x0008, + 0xd52: 0x0008, 0xd53: 0x0008, 0xd54: 0x0008, 0xd55: 0x0008, 0xd56: 0x0008, 0xd57: 0x0008, + 0xd58: 0x0008, 0xd59: 0x0008, 0xd5a: 0x0008, 0xd5b: 0x0008, 0xd5c: 0x0008, 0xd5d: 0x0008, + 0xd5e: 0x0008, 0xd5f: 0x0040, 0xd60: 0xe00d, 0xd61: 0x0008, 0xd62: 0x2971, 0xd63: 0x0ebd, + 0xd64: 0x2989, 0xd65: 0x0008, 0xd66: 0x0008, 0xd67: 0xe07d, 0xd68: 0x0008, 0xd69: 0xe01d, + 0xd6a: 0x0008, 0xd6b: 0xe03d, 0xd6c: 0x0008, 0xd6d: 0x0fe1, 0xd6e: 0x1281, 0xd6f: 0x0fc9, + 0xd70: 0x1141, 0xd71: 0x0008, 0xd72: 0xe00d, 0xd73: 0x0008, 0xd74: 0x0008, 0xd75: 0xe01d, + 0xd76: 0x0008, 0xd77: 0x0008, 0xd78: 0x0008, 0xd79: 0x0008, 0xd7a: 0x0008, 0xd7b: 0x0008, + 0xd7c: 0x0259, 0xd7d: 0x1089, 0xd7e: 0x29a1, 0xd7f: 0x29b9, + // Block 0x36, offset 0xd80 + 0xd80: 0xe00d, 0xd81: 0x0008, 0xd82: 0xe00d, 0xd83: 0x0008, 0xd84: 0xe00d, 0xd85: 0x0008, + 0xd86: 0xe00d, 0xd87: 0x0008, 0xd88: 0xe00d, 0xd89: 0x0008, 0xd8a: 0xe00d, 0xd8b: 0x0008, + 0xd8c: 0xe00d, 0xd8d: 0x0008, 0xd8e: 0xe00d, 0xd8f: 0x0008, 0xd90: 0xe00d, 0xd91: 0x0008, + 0xd92: 0xe00d, 0xd93: 0x0008, 0xd94: 0xe00d, 0xd95: 0x0008, 0xd96: 0xe00d, 0xd97: 0x0008, + 0xd98: 0xe00d, 0xd99: 0x0008, 0xd9a: 0xe00d, 0xd9b: 0x0008, 0xd9c: 0xe00d, 0xd9d: 0x0008, + 0xd9e: 0xe00d, 0xd9f: 0x0008, 0xda0: 0xe00d, 0xda1: 0x0008, 0xda2: 0xe00d, 0xda3: 0x0008, + 0xda4: 0x0008, 0xda5: 0x0018, 0xda6: 0x0018, 0xda7: 0x0018, 0xda8: 0x0018, 0xda9: 0x0018, + 0xdaa: 0x0018, 0xdab: 0xe03d, 0xdac: 0x0008, 0xdad: 0xe01d, 0xdae: 0x0008, 0xdaf: 0x1308, + 0xdb0: 0x1308, 0xdb1: 0x1308, 0xdb2: 0xe00d, 0xdb3: 0x0008, 0xdb4: 0x0040, 0xdb5: 0x0040, + 0xdb6: 0x0040, 0xdb7: 0x0040, 0xdb8: 0x0040, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, + 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x26fd, 0xdc1: 0x271d, 0xdc2: 0x273d, 0xdc3: 0x275d, 0xdc4: 0x277d, 0xdc5: 0x279d, + 0xdc6: 0x27bd, 0xdc7: 0x27dd, 0xdc8: 0x27fd, 0xdc9: 0x281d, 0xdca: 0x283d, 0xdcb: 0x285d, + 0xdcc: 0x287d, 0xdcd: 0x289d, 0xdce: 0x28bd, 0xdcf: 0x28dd, 0xdd0: 0x28fd, 0xdd1: 0x291d, + 0xdd2: 0x293d, 0xdd3: 0x295d, 0xdd4: 0x297d, 0xdd5: 0x299d, 0xdd6: 0x0040, 0xdd7: 0x0040, + 0xdd8: 0x0040, 0xdd9: 0x0040, 0xdda: 0x0040, 0xddb: 0x0040, 0xddc: 0x0040, 0xddd: 0x0040, + 0xdde: 0x0040, 0xddf: 0x0040, 0xde0: 0x0040, 0xde1: 0x0040, 0xde2: 0x0040, 0xde3: 0x0040, + 0xde4: 0x0040, 0xde5: 0x0040, 0xde6: 0x0040, 0xde7: 0x0040, 0xde8: 0x0040, 0xde9: 0x0040, + 0xdea: 0x0040, 0xdeb: 0x0040, 0xdec: 0x0040, 0xded: 0x0040, 0xdee: 0x0040, 0xdef: 0x0040, + 0xdf0: 0x0040, 0xdf1: 0x0040, 0xdf2: 0x0040, 0xdf3: 0x0040, 0xdf4: 0x0040, 0xdf5: 0x0040, + 0xdf6: 0x0040, 0xdf7: 0x0040, 0xdf8: 0x0040, 0xdf9: 0x0040, 0xdfa: 0x0040, 0xdfb: 0x0040, + 0xdfc: 0x0040, 0xdfd: 0x0040, 0xdfe: 0x0040, 0xdff: 0x0040, + // Block 0x38, offset 0xe00 + 0xe00: 0x000a, 0xe01: 0x0018, 0xe02: 0x29d1, 0xe03: 0x0018, 0xe04: 0x0018, 0xe05: 0x0008, + 0xe06: 0x0008, 0xe07: 0x0008, 0xe08: 0x0018, 0xe09: 0x0018, 0xe0a: 0x0018, 0xe0b: 0x0018, + 0xe0c: 0x0018, 0xe0d: 0x0018, 0xe0e: 0x0018, 0xe0f: 0x0018, 0xe10: 0x0018, 0xe11: 0x0018, + 0xe12: 0x0018, 0xe13: 0x0018, 0xe14: 0x0018, 0xe15: 0x0018, 0xe16: 0x0018, 0xe17: 0x0018, + 0xe18: 0x0018, 0xe19: 0x0018, 0xe1a: 0x0018, 0xe1b: 0x0018, 0xe1c: 0x0018, 0xe1d: 0x0018, + 0xe1e: 0x0018, 0xe1f: 0x0018, 0xe20: 0x0018, 0xe21: 0x0018, 0xe22: 0x0018, 0xe23: 0x0018, + 0xe24: 0x0018, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018, + 0xe2a: 0x1308, 0xe2b: 0x1308, 0xe2c: 0x1308, 0xe2d: 0x1308, 0xe2e: 0x1018, 0xe2f: 0x1018, + 0xe30: 0x0018, 0xe31: 0x0018, 0xe32: 0x0018, 0xe33: 0x0018, 0xe34: 0x0018, 0xe35: 0x0018, + 0xe36: 0xe125, 0xe37: 0x0018, 0xe38: 0x29bd, 0xe39: 0x29dd, 0xe3a: 0x29fd, 0xe3b: 0x0018, + 0xe3c: 0x0008, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018, + // Block 0x39, offset 0xe40 + 0xe40: 0x2b3d, 0xe41: 0x2b5d, 0xe42: 0x2b7d, 0xe43: 0x2b9d, 0xe44: 0x2bbd, 0xe45: 0x2bdd, + 0xe46: 0x2bdd, 0xe47: 0x2bdd, 0xe48: 0x2bfd, 0xe49: 0x2bfd, 0xe4a: 0x2bfd, 0xe4b: 0x2bfd, + 0xe4c: 0x2c1d, 0xe4d: 0x2c1d, 0xe4e: 0x2c1d, 0xe4f: 0x2c3d, 0xe50: 0x2c5d, 0xe51: 0x2c5d, + 0xe52: 0x2a7d, 0xe53: 0x2a7d, 0xe54: 0x2c5d, 0xe55: 0x2c5d, 0xe56: 0x2c7d, 0xe57: 0x2c7d, + 0xe58: 0x2c5d, 0xe59: 0x2c5d, 0xe5a: 0x2a7d, 0xe5b: 0x2a7d, 0xe5c: 0x2c5d, 0xe5d: 0x2c5d, + 0xe5e: 0x2c3d, 0xe5f: 0x2c3d, 0xe60: 0x2c9d, 0xe61: 0x2c9d, 0xe62: 0x2cbd, 0xe63: 0x2cbd, + 0xe64: 0x0040, 0xe65: 0x2cdd, 0xe66: 0x2cfd, 0xe67: 0x2d1d, 0xe68: 0x2d1d, 0xe69: 0x2d3d, + 0xe6a: 0x2d5d, 0xe6b: 0x2d7d, 0xe6c: 0x2d9d, 0xe6d: 0x2dbd, 0xe6e: 0x2ddd, 0xe6f: 0x2dfd, + 0xe70: 0x2e1d, 0xe71: 0x2e3d, 0xe72: 0x2e3d, 0xe73: 0x2e5d, 0xe74: 0x2e7d, 0xe75: 0x2e7d, + 0xe76: 0x2e9d, 0xe77: 0x2ebd, 0xe78: 0x2e5d, 0xe79: 0x2edd, 0xe7a: 0x2efd, 0xe7b: 0x2edd, + 0xe7c: 0x2e5d, 0xe7d: 0x2f1d, 0xe7e: 0x2f3d, 0xe7f: 0x2f5d, + // Block 0x3a, offset 0xe80 + 0xe80: 0x2f7d, 0xe81: 0x2f9d, 0xe82: 0x2cfd, 0xe83: 0x2cdd, 0xe84: 0x2fbd, 0xe85: 0x2fdd, + 0xe86: 0x2ffd, 0xe87: 0x301d, 0xe88: 0x303d, 0xe89: 0x305d, 0xe8a: 0x307d, 0xe8b: 0x309d, + 0xe8c: 0x30bd, 0xe8d: 0x30dd, 0xe8e: 0x30fd, 0xe8f: 0x0040, 0xe90: 0x0018, 0xe91: 0x0018, + 0xe92: 0x311d, 0xe93: 0x313d, 0xe94: 0x315d, 0xe95: 0x317d, 0xe96: 0x319d, 0xe97: 0x31bd, + 0xe98: 0x31dd, 0xe99: 0x31fd, 0xe9a: 0x321d, 0xe9b: 0x323d, 0xe9c: 0x315d, 0xe9d: 0x325d, + 0xe9e: 0x327d, 0xe9f: 0x329d, 0xea0: 0x0008, 0xea1: 0x0008, 0xea2: 0x0008, 0xea3: 0x0008, + 0xea4: 0x0008, 0xea5: 0x0008, 0xea6: 0x0008, 0xea7: 0x0008, 0xea8: 0x0008, 0xea9: 0x0008, + 0xeaa: 0x0008, 0xeab: 0x0008, 0xeac: 0x0008, 0xead: 0x0008, 0xeae: 0x0008, 0xeaf: 0x0008, + 0xeb0: 0x0008, 0xeb1: 0x0008, 0xeb2: 0x0008, 0xeb3: 0x0008, 0xeb4: 0x0008, 0xeb5: 0x0008, + 0xeb6: 0x0008, 0xeb7: 0x0008, 0xeb8: 0x0008, 0xeb9: 0x0008, 0xeba: 0x0008, 0xebb: 0x0040, + 0xebc: 0x0040, 0xebd: 0x0040, 0xebe: 0x0040, 0xebf: 0x0040, + // Block 0x3b, offset 0xec0 + 0xec0: 0x36a2, 0xec1: 0x36d2, 0xec2: 0x3702, 0xec3: 0x3732, 0xec4: 0x32bd, 0xec5: 0x32dd, + 0xec6: 0x32fd, 0xec7: 0x331d, 0xec8: 0x0018, 0xec9: 0x0018, 0xeca: 0x0018, 0xecb: 0x0018, + 0xecc: 0x0018, 0xecd: 0x0018, 0xece: 0x0018, 0xecf: 0x0018, 0xed0: 0x333d, 0xed1: 0x3761, + 0xed2: 0x3779, 0xed3: 0x3791, 0xed4: 0x37a9, 0xed5: 0x37c1, 0xed6: 0x37d9, 0xed7: 0x37f1, + 0xed8: 0x3809, 0xed9: 0x3821, 0xeda: 0x3839, 0xedb: 0x3851, 0xedc: 0x3869, 0xedd: 0x3881, + 0xede: 0x3899, 0xedf: 0x38b1, 0xee0: 0x335d, 0xee1: 0x337d, 0xee2: 0x339d, 0xee3: 0x33bd, + 0xee4: 0x33dd, 0xee5: 0x33dd, 0xee6: 0x33fd, 0xee7: 0x341d, 0xee8: 0x343d, 0xee9: 0x345d, + 0xeea: 0x347d, 0xeeb: 0x349d, 0xeec: 0x34bd, 0xeed: 0x34dd, 0xeee: 0x34fd, 0xeef: 0x351d, + 0xef0: 0x353d, 0xef1: 0x355d, 0xef2: 0x357d, 0xef3: 0x359d, 0xef4: 0x35bd, 0xef5: 0x35dd, + 0xef6: 0x35fd, 0xef7: 0x361d, 0xef8: 0x363d, 0xef9: 0x365d, 0xefa: 0x367d, 0xefb: 0x369d, + 0xefc: 0x38c9, 0xefd: 0x3901, 0xefe: 0x36bd, 0xeff: 0x0018, + // Block 0x3c, offset 0xf00 + 0xf00: 0x36dd, 0xf01: 0x36fd, 0xf02: 0x371d, 0xf03: 0x373d, 0xf04: 0x375d, 0xf05: 0x377d, + 0xf06: 0x379d, 0xf07: 0x37bd, 0xf08: 0x37dd, 0xf09: 0x37fd, 0xf0a: 0x381d, 0xf0b: 0x383d, + 0xf0c: 0x385d, 0xf0d: 0x387d, 0xf0e: 0x389d, 0xf0f: 0x38bd, 0xf10: 0x38dd, 0xf11: 0x38fd, + 0xf12: 0x391d, 0xf13: 0x393d, 0xf14: 0x395d, 0xf15: 0x397d, 0xf16: 0x399d, 0xf17: 0x39bd, + 0xf18: 0x39dd, 0xf19: 0x39fd, 0xf1a: 0x3a1d, 0xf1b: 0x3a3d, 0xf1c: 0x3a5d, 0xf1d: 0x3a7d, + 0xf1e: 0x3a9d, 0xf1f: 0x3abd, 0xf20: 0x3add, 0xf21: 0x3afd, 0xf22: 0x3b1d, 0xf23: 0x3b3d, + 0xf24: 0x3b5d, 0xf25: 0x3b7d, 0xf26: 0x127d, 0xf27: 0x3b9d, 0xf28: 0x3bbd, 0xf29: 0x3bdd, + 0xf2a: 0x3bfd, 0xf2b: 0x3c1d, 0xf2c: 0x3c3d, 0xf2d: 0x3c5d, 0xf2e: 0x239d, 0xf2f: 0x3c7d, + 0xf30: 0x3c9d, 0xf31: 0x3939, 0xf32: 0x3951, 0xf33: 0x3969, 0xf34: 0x3981, 0xf35: 0x3999, + 0xf36: 0x39b1, 0xf37: 0x39c9, 0xf38: 0x39e1, 0xf39: 0x39f9, 0xf3a: 0x3a11, 0xf3b: 0x3a29, + 0xf3c: 0x3a41, 0xf3d: 0x3a59, 0xf3e: 0x3a71, 0xf3f: 0x3a89, + // Block 0x3d, offset 0xf40 + 0xf40: 0x3aa1, 0xf41: 0x3ac9, 0xf42: 0x3af1, 0xf43: 0x3b19, 0xf44: 0x3b41, 0xf45: 0x3b69, + 0xf46: 0x3b91, 0xf47: 0x3bb9, 0xf48: 0x3be1, 0xf49: 0x3c09, 0xf4a: 0x3c39, 0xf4b: 0x3c69, + 0xf4c: 0x3c99, 0xf4d: 0x3cbd, 0xf4e: 0x3cb1, 0xf4f: 0x3cdd, 0xf50: 0x3cfd, 0xf51: 0x3d15, + 0xf52: 0x3d2d, 0xf53: 0x3d45, 0xf54: 0x3d5d, 0xf55: 0x3d5d, 0xf56: 0x3d45, 0xf57: 0x3d75, + 0xf58: 0x07bd, 0xf59: 0x3d8d, 0xf5a: 0x3da5, 0xf5b: 0x3dbd, 0xf5c: 0x3dd5, 0xf5d: 0x3ded, + 0xf5e: 0x3e05, 0xf5f: 0x3e1d, 0xf60: 0x3e35, 0xf61: 0x3e4d, 0xf62: 0x3e65, 0xf63: 0x3e7d, + 0xf64: 0x3e95, 0xf65: 0x3e95, 0xf66: 0x3ead, 0xf67: 0x3ead, 0xf68: 0x3ec5, 0xf69: 0x3ec5, + 0xf6a: 0x3edd, 0xf6b: 0x3ef5, 0xf6c: 0x3f0d, 0xf6d: 0x3f25, 0xf6e: 0x3f3d, 0xf6f: 0x3f3d, + 0xf70: 0x3f55, 0xf71: 0x3f55, 0xf72: 0x3f55, 0xf73: 0x3f6d, 0xf74: 0x3f85, 0xf75: 0x3f9d, + 0xf76: 0x3fb5, 0xf77: 0x3f9d, 0xf78: 0x3fcd, 0xf79: 0x3fe5, 0xf7a: 0x3f6d, 0xf7b: 0x3ffd, + 0xf7c: 0x4015, 0xf7d: 0x4015, 0xf7e: 0x4015, 0xf7f: 0x0040, + // Block 0x3e, offset 0xf80 + 0xf80: 0x3cc9, 0xf81: 0x3d31, 0xf82: 0x3d99, 0xf83: 0x3e01, 0xf84: 0x3e51, 0xf85: 0x3eb9, + 0xf86: 0x3f09, 0xf87: 0x3f59, 0xf88: 0x3fd9, 0xf89: 0x4041, 0xf8a: 0x4091, 0xf8b: 0x40e1, + 0xf8c: 0x4131, 0xf8d: 0x4199, 0xf8e: 0x4201, 0xf8f: 0x4251, 0xf90: 0x42a1, 0xf91: 0x42d9, + 0xf92: 0x4329, 0xf93: 0x4391, 0xf94: 0x43f9, 0xf95: 0x4431, 0xf96: 0x44b1, 0xf97: 0x4549, + 0xf98: 0x45c9, 0xf99: 0x4619, 0xf9a: 0x4699, 0xf9b: 0x4719, 0xf9c: 0x4781, 0xf9d: 0x47d1, + 0xf9e: 0x4821, 0xf9f: 0x4871, 0xfa0: 0x48d9, 0xfa1: 0x4959, 0xfa2: 0x49c1, 0xfa3: 0x4a11, + 0xfa4: 0x4a61, 0xfa5: 0x4ab1, 0xfa6: 0x4ae9, 0xfa7: 0x4b21, 0xfa8: 0x4b59, 0xfa9: 0x4b91, + 0xfaa: 0x4be1, 0xfab: 0x4c31, 0xfac: 0x4cb1, 0xfad: 0x4d01, 0xfae: 0x4d69, 0xfaf: 0x4de9, + 0xfb0: 0x4e39, 0xfb1: 0x4e71, 0xfb2: 0x4ea9, 0xfb3: 0x4f29, 0xfb4: 0x4f91, 0xfb5: 0x5011, + 0xfb6: 0x5061, 0xfb7: 0x50e1, 0xfb8: 0x5119, 0xfb9: 0x5169, 0xfba: 0x51b9, 0xfbb: 0x5209, + 0xfbc: 0x5259, 0xfbd: 0x52a9, 0xfbe: 0x5311, 0xfbf: 0x5361, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x5399, 0xfc1: 0x53e9, 0xfc2: 0x5439, 0xfc3: 0x5489, 0xfc4: 0x54f1, 0xfc5: 0x5541, + 0xfc6: 0x5591, 0xfc7: 0x55e1, 0xfc8: 0x5661, 0xfc9: 0x56c9, 0xfca: 0x5701, 0xfcb: 0x5781, + 0xfcc: 0x57b9, 0xfcd: 0x5821, 0xfce: 0x5889, 0xfcf: 0x58d9, 0xfd0: 0x5929, 0xfd1: 0x5979, + 0xfd2: 0x59e1, 0xfd3: 0x5a19, 0xfd4: 0x5a69, 0xfd5: 0x5ad1, 0xfd6: 0x5b09, 0xfd7: 0x5b89, + 0xfd8: 0x5bd9, 0xfd9: 0x5c01, 0xfda: 0x5c29, 0xfdb: 0x5c51, 0xfdc: 0x5c79, 0xfdd: 0x5ca1, + 0xfde: 0x5cc9, 0xfdf: 0x5cf1, 0xfe0: 0x5d19, 0xfe1: 0x5d41, 0xfe2: 0x5d69, 0xfe3: 0x5d99, + 0xfe4: 0x5dc9, 0xfe5: 0x5df9, 0xfe6: 0x5e29, 0xfe7: 0x5e59, 0xfe8: 0x5e89, 0xfe9: 0x5eb9, + 0xfea: 0x5ee9, 0xfeb: 0x5f19, 0xfec: 0x5f49, 0xfed: 0x5f79, 0xfee: 0x5fa9, 0xfef: 0x5fd9, + 0xff0: 0x6009, 0xff1: 0x402d, 0xff2: 0x6039, 0xff3: 0x6051, 0xff4: 0x404d, 0xff5: 0x6069, + 0xff6: 0x6081, 0xff7: 0x6099, 0xff8: 0x406d, 0xff9: 0x406d, 0xffa: 0x60b1, 0xffb: 0x60c9, + 0xffc: 0x6101, 0xffd: 0x6139, 0xffe: 0x6171, 0xfff: 0x61a9, + // Block 0x40, offset 0x1000 + 0x1000: 0x6211, 0x1001: 0x6229, 0x1002: 0x408d, 0x1003: 0x6241, 0x1004: 0x6259, 0x1005: 0x6271, + 0x1006: 0x6289, 0x1007: 0x62a1, 0x1008: 0x40ad, 0x1009: 0x62b9, 0x100a: 0x62e1, 0x100b: 0x62f9, + 0x100c: 0x40cd, 0x100d: 0x40cd, 0x100e: 0x6311, 0x100f: 0x6329, 0x1010: 0x6341, 0x1011: 0x40ed, + 0x1012: 0x410d, 0x1013: 0x412d, 0x1014: 0x414d, 0x1015: 0x416d, 0x1016: 0x6359, 0x1017: 0x6371, + 0x1018: 0x6389, 0x1019: 0x63a1, 0x101a: 0x63b9, 0x101b: 0x418d, 0x101c: 0x63d1, 0x101d: 0x63e9, + 0x101e: 0x6401, 0x101f: 0x41ad, 0x1020: 0x41cd, 0x1021: 0x6419, 0x1022: 0x41ed, 0x1023: 0x420d, + 0x1024: 0x422d, 0x1025: 0x6431, 0x1026: 0x424d, 0x1027: 0x6449, 0x1028: 0x6479, 0x1029: 0x6211, + 0x102a: 0x426d, 0x102b: 0x428d, 0x102c: 0x42ad, 0x102d: 0x42cd, 0x102e: 0x64b1, 0x102f: 0x64f1, + 0x1030: 0x6539, 0x1031: 0x6551, 0x1032: 0x42ed, 0x1033: 0x6569, 0x1034: 0x6581, 0x1035: 0x6599, + 0x1036: 0x430d, 0x1037: 0x65b1, 0x1038: 0x65c9, 0x1039: 0x65b1, 0x103a: 0x65e1, 0x103b: 0x65f9, + 0x103c: 0x432d, 0x103d: 0x6611, 0x103e: 0x6629, 0x103f: 0x6611, + // Block 0x41, offset 0x1040 + 0x1040: 0x434d, 0x1041: 0x436d, 0x1042: 0x0040, 0x1043: 0x6641, 0x1044: 0x6659, 0x1045: 0x6671, + 0x1046: 0x6689, 0x1047: 0x0040, 0x1048: 0x66c1, 0x1049: 0x66d9, 0x104a: 0x66f1, 0x104b: 0x6709, + 0x104c: 0x6721, 0x104d: 0x6739, 0x104e: 0x6401, 0x104f: 0x6751, 0x1050: 0x6769, 0x1051: 0x6781, + 0x1052: 0x438d, 0x1053: 0x6799, 0x1054: 0x6289, 0x1055: 0x43ad, 0x1056: 0x43cd, 0x1057: 0x67b1, + 0x1058: 0x0040, 0x1059: 0x43ed, 0x105a: 0x67c9, 0x105b: 0x67e1, 0x105c: 0x67f9, 0x105d: 0x6811, + 0x105e: 0x6829, 0x105f: 0x6859, 0x1060: 0x6889, 0x1061: 0x68b1, 0x1062: 0x68d9, 0x1063: 0x6901, + 0x1064: 0x6929, 0x1065: 0x6951, 0x1066: 0x6979, 0x1067: 0x69a1, 0x1068: 0x69c9, 0x1069: 0x69f1, + 0x106a: 0x6a21, 0x106b: 0x6a51, 0x106c: 0x6a81, 0x106d: 0x6ab1, 0x106e: 0x6ae1, 0x106f: 0x6b11, + 0x1070: 0x6b41, 0x1071: 0x6b71, 0x1072: 0x6ba1, 0x1073: 0x6bd1, 0x1074: 0x6c01, 0x1075: 0x6c31, + 0x1076: 0x6c61, 0x1077: 0x6c91, 0x1078: 0x6cc1, 0x1079: 0x6cf1, 0x107a: 0x6d21, 0x107b: 0x6d51, + 0x107c: 0x6d81, 0x107d: 0x6db1, 0x107e: 0x6de1, 0x107f: 0x440d, + // Block 0x42, offset 0x1080 + 0x1080: 0xe00d, 0x1081: 0x0008, 0x1082: 0xe00d, 0x1083: 0x0008, 0x1084: 0xe00d, 0x1085: 0x0008, + 0x1086: 0xe00d, 0x1087: 0x0008, 0x1088: 0xe00d, 0x1089: 0x0008, 0x108a: 0xe00d, 0x108b: 0x0008, + 0x108c: 0xe00d, 0x108d: 0x0008, 0x108e: 0xe00d, 0x108f: 0x0008, 0x1090: 0xe00d, 0x1091: 0x0008, + 0x1092: 0xe00d, 0x1093: 0x0008, 0x1094: 0xe00d, 0x1095: 0x0008, 0x1096: 0xe00d, 0x1097: 0x0008, + 0x1098: 0xe00d, 0x1099: 0x0008, 0x109a: 0xe00d, 0x109b: 0x0008, 0x109c: 0xe00d, 0x109d: 0x0008, + 0x109e: 0xe00d, 0x109f: 0x0008, 0x10a0: 0xe00d, 0x10a1: 0x0008, 0x10a2: 0xe00d, 0x10a3: 0x0008, + 0x10a4: 0xe00d, 0x10a5: 0x0008, 0x10a6: 0xe00d, 0x10a7: 0x0008, 0x10a8: 0xe00d, 0x10a9: 0x0008, + 0x10aa: 0xe00d, 0x10ab: 0x0008, 0x10ac: 0xe00d, 0x10ad: 0x0008, 0x10ae: 0x0008, 0x10af: 0x1308, + 0x10b0: 0x1318, 0x10b1: 0x1318, 0x10b2: 0x1318, 0x10b3: 0x0018, 0x10b4: 0x1308, 0x10b5: 0x1308, + 0x10b6: 0x1308, 0x10b7: 0x1308, 0x10b8: 0x1308, 0x10b9: 0x1308, 0x10ba: 0x1308, 0x10bb: 0x1308, + 0x10bc: 0x1308, 0x10bd: 0x1308, 0x10be: 0x0018, 0x10bf: 0x0008, + // Block 0x43, offset 0x10c0 + 0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008, + 0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008, + 0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008, + 0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008, + 0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0x0ea1, 0x10dd: 0x6e11, + 0x10de: 0x1308, 0x10df: 0x1308, 0x10e0: 0x0008, 0x10e1: 0x0008, 0x10e2: 0x0008, 0x10e3: 0x0008, + 0x10e4: 0x0008, 0x10e5: 0x0008, 0x10e6: 0x0008, 0x10e7: 0x0008, 0x10e8: 0x0008, 0x10e9: 0x0008, + 0x10ea: 0x0008, 0x10eb: 0x0008, 0x10ec: 0x0008, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x0008, + 0x10f0: 0x0008, 0x10f1: 0x0008, 0x10f2: 0x0008, 0x10f3: 0x0008, 0x10f4: 0x0008, 0x10f5: 0x0008, + 0x10f6: 0x0008, 0x10f7: 0x0008, 0x10f8: 0x0008, 0x10f9: 0x0008, 0x10fa: 0x0008, 0x10fb: 0x0008, + 0x10fc: 0x0008, 0x10fd: 0x0008, 0x10fe: 0x0008, 0x10ff: 0x0008, + // Block 0x44, offset 0x1100 + 0x1100: 0x0018, 0x1101: 0x0018, 0x1102: 0x0018, 0x1103: 0x0018, 0x1104: 0x0018, 0x1105: 0x0018, + 0x1106: 0x0018, 0x1107: 0x0018, 0x1108: 0x0018, 0x1109: 0x0018, 0x110a: 0x0018, 0x110b: 0x0018, + 0x110c: 0x0018, 0x110d: 0x0018, 0x110e: 0x0018, 0x110f: 0x0018, 0x1110: 0x0018, 0x1111: 0x0018, + 0x1112: 0x0018, 0x1113: 0x0018, 0x1114: 0x0018, 0x1115: 0x0018, 0x1116: 0x0018, 0x1117: 0x0008, + 0x1118: 0x0008, 0x1119: 0x0008, 0x111a: 0x0008, 0x111b: 0x0008, 0x111c: 0x0008, 0x111d: 0x0008, + 0x111e: 0x0008, 0x111f: 0x0008, 0x1120: 0x0018, 0x1121: 0x0018, 0x1122: 0xe00d, 0x1123: 0x0008, + 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, + 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0xe00d, 0x112f: 0x0008, + 0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0xe00d, 0x1133: 0x0008, 0x1134: 0xe00d, 0x1135: 0x0008, + 0x1136: 0xe00d, 0x1137: 0x0008, 0x1138: 0xe00d, 0x1139: 0x0008, 0x113a: 0xe00d, 0x113b: 0x0008, + 0x113c: 0xe00d, 0x113d: 0x0008, 0x113e: 0xe00d, 0x113f: 0x0008, + // Block 0x45, offset 0x1140 + 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, + 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, + 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, + 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, + 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0xe00d, 0x115d: 0x0008, + 0x115e: 0xe00d, 0x115f: 0x0008, 0x1160: 0xe00d, 0x1161: 0x0008, 0x1162: 0xe00d, 0x1163: 0x0008, + 0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008, + 0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008, + 0x1170: 0xe0fd, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, + 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0xe01d, 0x117a: 0x0008, 0x117b: 0xe03d, + 0x117c: 0x0008, 0x117d: 0x442d, 0x117e: 0xe00d, 0x117f: 0x0008, + // Block 0x46, offset 0x1180 + 0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008, + 0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0x0008, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0xe03d, + 0x118c: 0x0008, 0x118d: 0x11d9, 0x118e: 0x0008, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008, + 0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0x0008, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008, + 0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008, + 0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, + 0x11aa: 0x6e29, 0x11ab: 0x1029, 0x11ac: 0x11c1, 0x11ad: 0x6e41, 0x11ae: 0x1221, 0x11af: 0x0040, + 0x11b0: 0x6e59, 0x11b1: 0x6e71, 0x11b2: 0x1239, 0x11b3: 0x444d, 0x11b4: 0xe00d, 0x11b5: 0x0008, + 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0x0040, 0x11b9: 0x0040, 0x11ba: 0x0040, 0x11bb: 0x0040, + 0x11bc: 0x0040, 0x11bd: 0x0040, 0x11be: 0x0040, 0x11bf: 0x0040, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x64d5, 0x11c1: 0x64f5, 0x11c2: 0x6515, 0x11c3: 0x6535, 0x11c4: 0x6555, 0x11c5: 0x6575, + 0x11c6: 0x6595, 0x11c7: 0x65b5, 0x11c8: 0x65d5, 0x11c9: 0x65f5, 0x11ca: 0x6615, 0x11cb: 0x6635, + 0x11cc: 0x6655, 0x11cd: 0x6675, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0x6695, 0x11d1: 0x0008, + 0x11d2: 0x66b5, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x66d5, 0x11d6: 0x66f5, 0x11d7: 0x6715, + 0x11d8: 0x6735, 0x11d9: 0x6755, 0x11da: 0x6775, 0x11db: 0x6795, 0x11dc: 0x67b5, 0x11dd: 0x67d5, + 0x11de: 0x67f5, 0x11df: 0x0008, 0x11e0: 0x6815, 0x11e1: 0x0008, 0x11e2: 0x6835, 0x11e3: 0x0008, + 0x11e4: 0x0008, 0x11e5: 0x6855, 0x11e6: 0x6875, 0x11e7: 0x0008, 0x11e8: 0x0008, 0x11e9: 0x0008, + 0x11ea: 0x6895, 0x11eb: 0x68b5, 0x11ec: 0x68d5, 0x11ed: 0x68f5, 0x11ee: 0x6915, 0x11ef: 0x6935, + 0x11f0: 0x6955, 0x11f1: 0x6975, 0x11f2: 0x6995, 0x11f3: 0x69b5, 0x11f4: 0x69d5, 0x11f5: 0x69f5, + 0x11f6: 0x6a15, 0x11f7: 0x6a35, 0x11f8: 0x6a55, 0x11f9: 0x6a75, 0x11fa: 0x6a95, 0x11fb: 0x6ab5, + 0x11fc: 0x6ad5, 0x11fd: 0x6af5, 0x11fe: 0x6b15, 0x11ff: 0x6b35, + // Block 0x48, offset 0x1200 + 0x1200: 0x7a95, 0x1201: 0x7ab5, 0x1202: 0x7ad5, 0x1203: 0x7af5, 0x1204: 0x7b15, 0x1205: 0x7b35, + 0x1206: 0x7b55, 0x1207: 0x7b75, 0x1208: 0x7b95, 0x1209: 0x7bb5, 0x120a: 0x7bd5, 0x120b: 0x7bf5, + 0x120c: 0x7c15, 0x120d: 0x7c35, 0x120e: 0x7c55, 0x120f: 0x6ec9, 0x1210: 0x6ef1, 0x1211: 0x6f19, + 0x1212: 0x7c75, 0x1213: 0x7c95, 0x1214: 0x7cb5, 0x1215: 0x6f41, 0x1216: 0x6f69, 0x1217: 0x6f91, + 0x1218: 0x7cd5, 0x1219: 0x7cf5, 0x121a: 0x0040, 0x121b: 0x0040, 0x121c: 0x0040, 0x121d: 0x0040, + 0x121e: 0x0040, 0x121f: 0x0040, 0x1220: 0x0040, 0x1221: 0x0040, 0x1222: 0x0040, 0x1223: 0x0040, + 0x1224: 0x0040, 0x1225: 0x0040, 0x1226: 0x0040, 0x1227: 0x0040, 0x1228: 0x0040, 0x1229: 0x0040, + 0x122a: 0x0040, 0x122b: 0x0040, 0x122c: 0x0040, 0x122d: 0x0040, 0x122e: 0x0040, 0x122f: 0x0040, + 0x1230: 0x0040, 0x1231: 0x0040, 0x1232: 0x0040, 0x1233: 0x0040, 0x1234: 0x0040, 0x1235: 0x0040, + 0x1236: 0x0040, 0x1237: 0x0040, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040, + 0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040, + // Block 0x49, offset 0x1240 + 0x1240: 0x6fb9, 0x1241: 0x6fd1, 0x1242: 0x6fe9, 0x1243: 0x7d15, 0x1244: 0x7d35, 0x1245: 0x7001, + 0x1246: 0x7001, 0x1247: 0x0040, 0x1248: 0x0040, 0x1249: 0x0040, 0x124a: 0x0040, 0x124b: 0x0040, + 0x124c: 0x0040, 0x124d: 0x0040, 0x124e: 0x0040, 0x124f: 0x0040, 0x1250: 0x0040, 0x1251: 0x0040, + 0x1252: 0x0040, 0x1253: 0x7019, 0x1254: 0x7041, 0x1255: 0x7069, 0x1256: 0x7091, 0x1257: 0x70b9, + 0x1258: 0x0040, 0x1259: 0x0040, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x70e1, + 0x125e: 0x1308, 0x125f: 0x7109, 0x1260: 0x7131, 0x1261: 0x20a9, 0x1262: 0x20f1, 0x1263: 0x7149, + 0x1264: 0x7161, 0x1265: 0x7179, 0x1266: 0x7191, 0x1267: 0x71a9, 0x1268: 0x71c1, 0x1269: 0x1fb2, + 0x126a: 0x71d9, 0x126b: 0x7201, 0x126c: 0x7229, 0x126d: 0x7261, 0x126e: 0x7299, 0x126f: 0x72c1, + 0x1270: 0x72e9, 0x1271: 0x7311, 0x1272: 0x7339, 0x1273: 0x7361, 0x1274: 0x7389, 0x1275: 0x73b1, + 0x1276: 0x73d9, 0x1277: 0x0040, 0x1278: 0x7401, 0x1279: 0x7429, 0x127a: 0x7451, 0x127b: 0x7479, + 0x127c: 0x74a1, 0x127d: 0x0040, 0x127e: 0x74c9, 0x127f: 0x0040, + // Block 0x4a, offset 0x1280 + 0x1280: 0x74f1, 0x1281: 0x7519, 0x1282: 0x0040, 0x1283: 0x7541, 0x1284: 0x7569, 0x1285: 0x0040, + 0x1286: 0x7591, 0x1287: 0x75b9, 0x1288: 0x75e1, 0x1289: 0x7609, 0x128a: 0x7631, 0x128b: 0x7659, + 0x128c: 0x7681, 0x128d: 0x76a9, 0x128e: 0x76d1, 0x128f: 0x76f9, 0x1290: 0x7721, 0x1291: 0x7721, + 0x1292: 0x7739, 0x1293: 0x7739, 0x1294: 0x7739, 0x1295: 0x7739, 0x1296: 0x7751, 0x1297: 0x7751, + 0x1298: 0x7751, 0x1299: 0x7751, 0x129a: 0x7769, 0x129b: 0x7769, 0x129c: 0x7769, 0x129d: 0x7769, + 0x129e: 0x7781, 0x129f: 0x7781, 0x12a0: 0x7781, 0x12a1: 0x7781, 0x12a2: 0x7799, 0x12a3: 0x7799, + 0x12a4: 0x7799, 0x12a5: 0x7799, 0x12a6: 0x77b1, 0x12a7: 0x77b1, 0x12a8: 0x77b1, 0x12a9: 0x77b1, + 0x12aa: 0x77c9, 0x12ab: 0x77c9, 0x12ac: 0x77c9, 0x12ad: 0x77c9, 0x12ae: 0x77e1, 0x12af: 0x77e1, + 0x12b0: 0x77e1, 0x12b1: 0x77e1, 0x12b2: 0x77f9, 0x12b3: 0x77f9, 0x12b4: 0x77f9, 0x12b5: 0x77f9, + 0x12b6: 0x7811, 0x12b7: 0x7811, 0x12b8: 0x7811, 0x12b9: 0x7811, 0x12ba: 0x7829, 0x12bb: 0x7829, + 0x12bc: 0x7829, 0x12bd: 0x7829, 0x12be: 0x7841, 0x12bf: 0x7841, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x7841, 0x12c1: 0x7841, 0x12c2: 0x7859, 0x12c3: 0x7859, 0x12c4: 0x7871, 0x12c5: 0x7871, + 0x12c6: 0x7889, 0x12c7: 0x7889, 0x12c8: 0x78a1, 0x12c9: 0x78a1, 0x12ca: 0x78b9, 0x12cb: 0x78b9, + 0x12cc: 0x78d1, 0x12cd: 0x78d1, 0x12ce: 0x78e9, 0x12cf: 0x78e9, 0x12d0: 0x78e9, 0x12d1: 0x78e9, + 0x12d2: 0x7901, 0x12d3: 0x7901, 0x12d4: 0x7901, 0x12d5: 0x7901, 0x12d6: 0x7919, 0x12d7: 0x7919, + 0x12d8: 0x7919, 0x12d9: 0x7919, 0x12da: 0x7931, 0x12db: 0x7931, 0x12dc: 0x7931, 0x12dd: 0x7931, + 0x12de: 0x7949, 0x12df: 0x7949, 0x12e0: 0x7961, 0x12e1: 0x7961, 0x12e2: 0x7961, 0x12e3: 0x7961, + 0x12e4: 0x7979, 0x12e5: 0x7979, 0x12e6: 0x7991, 0x12e7: 0x7991, 0x12e8: 0x7991, 0x12e9: 0x7991, + 0x12ea: 0x79a9, 0x12eb: 0x79a9, 0x12ec: 0x79a9, 0x12ed: 0x79a9, 0x12ee: 0x79c1, 0x12ef: 0x79c1, + 0x12f0: 0x79d9, 0x12f1: 0x79d9, 0x12f2: 0x0018, 0x12f3: 0x0018, 0x12f4: 0x0018, 0x12f5: 0x0018, + 0x12f6: 0x0018, 0x12f7: 0x0018, 0x12f8: 0x0018, 0x12f9: 0x0018, 0x12fa: 0x0018, 0x12fb: 0x0018, + 0x12fc: 0x0018, 0x12fd: 0x0018, 0x12fe: 0x0018, 0x12ff: 0x0018, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0018, 0x1301: 0x0018, 0x1302: 0x0040, 0x1303: 0x0040, 0x1304: 0x0040, 0x1305: 0x0040, + 0x1306: 0x0040, 0x1307: 0x0040, 0x1308: 0x0040, 0x1309: 0x0040, 0x130a: 0x0040, 0x130b: 0x0040, + 0x130c: 0x0040, 0x130d: 0x0040, 0x130e: 0x0040, 0x130f: 0x0040, 0x1310: 0x0040, 0x1311: 0x0040, + 0x1312: 0x0040, 0x1313: 0x79f1, 0x1314: 0x79f1, 0x1315: 0x79f1, 0x1316: 0x79f1, 0x1317: 0x7a09, + 0x1318: 0x7a09, 0x1319: 0x7a21, 0x131a: 0x7a21, 0x131b: 0x7a39, 0x131c: 0x7a39, 0x131d: 0x0479, + 0x131e: 0x7a51, 0x131f: 0x7a51, 0x1320: 0x7a69, 0x1321: 0x7a69, 0x1322: 0x7a81, 0x1323: 0x7a81, + 0x1324: 0x7a99, 0x1325: 0x7a99, 0x1326: 0x7a99, 0x1327: 0x7a99, 0x1328: 0x7ab1, 0x1329: 0x7ab1, + 0x132a: 0x7ac9, 0x132b: 0x7ac9, 0x132c: 0x7af1, 0x132d: 0x7af1, 0x132e: 0x7b19, 0x132f: 0x7b19, + 0x1330: 0x7b41, 0x1331: 0x7b41, 0x1332: 0x7b69, 0x1333: 0x7b69, 0x1334: 0x7b91, 0x1335: 0x7b91, + 0x1336: 0x7bb9, 0x1337: 0x7bb9, 0x1338: 0x7bb9, 0x1339: 0x7be1, 0x133a: 0x7be1, 0x133b: 0x7be1, + 0x133c: 0x7c09, 0x133d: 0x7c09, 0x133e: 0x7c09, 0x133f: 0x7c09, + // Block 0x4d, offset 0x1340 + 0x1340: 0x85f9, 0x1341: 0x8621, 0x1342: 0x8649, 0x1343: 0x8671, 0x1344: 0x8699, 0x1345: 0x86c1, + 0x1346: 0x86e9, 0x1347: 0x8711, 0x1348: 0x8739, 0x1349: 0x8761, 0x134a: 0x8789, 0x134b: 0x87b1, + 0x134c: 0x87d9, 0x134d: 0x8801, 0x134e: 0x8829, 0x134f: 0x8851, 0x1350: 0x8879, 0x1351: 0x88a1, + 0x1352: 0x88c9, 0x1353: 0x88f1, 0x1354: 0x8919, 0x1355: 0x8941, 0x1356: 0x8969, 0x1357: 0x8991, + 0x1358: 0x89b9, 0x1359: 0x89e1, 0x135a: 0x8a09, 0x135b: 0x8a31, 0x135c: 0x8a59, 0x135d: 0x8a81, + 0x135e: 0x8aaa, 0x135f: 0x8ada, 0x1360: 0x8b0a, 0x1361: 0x8b3a, 0x1362: 0x8b6a, 0x1363: 0x8b9a, + 0x1364: 0x8bc9, 0x1365: 0x8bf1, 0x1366: 0x7c71, 0x1367: 0x8c19, 0x1368: 0x7be1, 0x1369: 0x7c99, + 0x136a: 0x8c41, 0x136b: 0x8c69, 0x136c: 0x7d39, 0x136d: 0x8c91, 0x136e: 0x7d61, 0x136f: 0x7d89, + 0x1370: 0x8cb9, 0x1371: 0x8ce1, 0x1372: 0x7e29, 0x1373: 0x8d09, 0x1374: 0x7e51, 0x1375: 0x7e79, + 0x1376: 0x8d31, 0x1377: 0x8d59, 0x1378: 0x7ec9, 0x1379: 0x8d81, 0x137a: 0x7ef1, 0x137b: 0x7f19, + 0x137c: 0x83a1, 0x137d: 0x83c9, 0x137e: 0x8441, 0x137f: 0x8469, + // Block 0x4e, offset 0x1380 + 0x1380: 0x8491, 0x1381: 0x8531, 0x1382: 0x8559, 0x1383: 0x8581, 0x1384: 0x85a9, 0x1385: 0x8649, + 0x1386: 0x8671, 0x1387: 0x8699, 0x1388: 0x8da9, 0x1389: 0x8739, 0x138a: 0x8dd1, 0x138b: 0x8df9, + 0x138c: 0x8829, 0x138d: 0x8e21, 0x138e: 0x8851, 0x138f: 0x8879, 0x1390: 0x8a81, 0x1391: 0x8e49, + 0x1392: 0x8e71, 0x1393: 0x89b9, 0x1394: 0x8e99, 0x1395: 0x89e1, 0x1396: 0x8a09, 0x1397: 0x7c21, + 0x1398: 0x7c49, 0x1399: 0x8ec1, 0x139a: 0x7c71, 0x139b: 0x8ee9, 0x139c: 0x7cc1, 0x139d: 0x7ce9, + 0x139e: 0x7d11, 0x139f: 0x7d39, 0x13a0: 0x8f11, 0x13a1: 0x7db1, 0x13a2: 0x7dd9, 0x13a3: 0x7e01, + 0x13a4: 0x7e29, 0x13a5: 0x8f39, 0x13a6: 0x7ec9, 0x13a7: 0x7f41, 0x13a8: 0x7f69, 0x13a9: 0x7f91, + 0x13aa: 0x7fb9, 0x13ab: 0x7fe1, 0x13ac: 0x8031, 0x13ad: 0x8059, 0x13ae: 0x8081, 0x13af: 0x80a9, + 0x13b0: 0x80d1, 0x13b1: 0x80f9, 0x13b2: 0x8f61, 0x13b3: 0x8121, 0x13b4: 0x8149, 0x13b5: 0x8171, + 0x13b6: 0x8199, 0x13b7: 0x81c1, 0x13b8: 0x81e9, 0x13b9: 0x8239, 0x13ba: 0x8261, 0x13bb: 0x8289, + 0x13bc: 0x82b1, 0x13bd: 0x82d9, 0x13be: 0x8301, 0x13bf: 0x8329, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x8351, 0x13c1: 0x8379, 0x13c2: 0x83f1, 0x13c3: 0x8419, 0x13c4: 0x84b9, 0x13c5: 0x84e1, + 0x13c6: 0x8509, 0x13c7: 0x8531, 0x13c8: 0x8559, 0x13c9: 0x85d1, 0x13ca: 0x85f9, 0x13cb: 0x8621, + 0x13cc: 0x8649, 0x13cd: 0x8f89, 0x13ce: 0x86c1, 0x13cf: 0x86e9, 0x13d0: 0x8711, 0x13d1: 0x8739, + 0x13d2: 0x87b1, 0x13d3: 0x87d9, 0x13d4: 0x8801, 0x13d5: 0x8829, 0x13d6: 0x8fb1, 0x13d7: 0x88a1, + 0x13d8: 0x88c9, 0x13d9: 0x8fd9, 0x13da: 0x8941, 0x13db: 0x8969, 0x13dc: 0x8991, 0x13dd: 0x89b9, + 0x13de: 0x9001, 0x13df: 0x7c71, 0x13e0: 0x8ee9, 0x13e1: 0x7d39, 0x13e2: 0x8f11, 0x13e3: 0x7e29, + 0x13e4: 0x8f39, 0x13e5: 0x7ec9, 0x13e6: 0x9029, 0x13e7: 0x80d1, 0x13e8: 0x9051, 0x13e9: 0x9079, + 0x13ea: 0x90a1, 0x13eb: 0x8531, 0x13ec: 0x8559, 0x13ed: 0x8649, 0x13ee: 0x8829, 0x13ef: 0x8fb1, + 0x13f0: 0x89b9, 0x13f1: 0x9001, 0x13f2: 0x90c9, 0x13f3: 0x9101, 0x13f4: 0x9139, 0x13f5: 0x9171, + 0x13f6: 0x9199, 0x13f7: 0x91c1, 0x13f8: 0x91e9, 0x13f9: 0x9211, 0x13fa: 0x9239, 0x13fb: 0x9261, + 0x13fc: 0x9289, 0x13fd: 0x92b1, 0x13fe: 0x92d9, 0x13ff: 0x9301, + // Block 0x50, offset 0x1400 + 0x1400: 0x9329, 0x1401: 0x9351, 0x1402: 0x9379, 0x1403: 0x93a1, 0x1404: 0x93c9, 0x1405: 0x93f1, + 0x1406: 0x9419, 0x1407: 0x9441, 0x1408: 0x9469, 0x1409: 0x9491, 0x140a: 0x94b9, 0x140b: 0x94e1, + 0x140c: 0x9079, 0x140d: 0x9509, 0x140e: 0x9531, 0x140f: 0x9559, 0x1410: 0x9581, 0x1411: 0x9171, + 0x1412: 0x9199, 0x1413: 0x91c1, 0x1414: 0x91e9, 0x1415: 0x9211, 0x1416: 0x9239, 0x1417: 0x9261, + 0x1418: 0x9289, 0x1419: 0x92b1, 0x141a: 0x92d9, 0x141b: 0x9301, 0x141c: 0x9329, 0x141d: 0x9351, + 0x141e: 0x9379, 0x141f: 0x93a1, 0x1420: 0x93c9, 0x1421: 0x93f1, 0x1422: 0x9419, 0x1423: 0x9441, + 0x1424: 0x9469, 0x1425: 0x9491, 0x1426: 0x94b9, 0x1427: 0x94e1, 0x1428: 0x9079, 0x1429: 0x9509, + 0x142a: 0x9531, 0x142b: 0x9559, 0x142c: 0x9581, 0x142d: 0x9491, 0x142e: 0x94b9, 0x142f: 0x94e1, + 0x1430: 0x9079, 0x1431: 0x9051, 0x1432: 0x90a1, 0x1433: 0x8211, 0x1434: 0x8059, 0x1435: 0x8081, + 0x1436: 0x80a9, 0x1437: 0x9491, 0x1438: 0x94b9, 0x1439: 0x94e1, 0x143a: 0x8211, 0x143b: 0x8239, + 0x143c: 0x95a9, 0x143d: 0x95a9, 0x143e: 0x0018, 0x143f: 0x0018, + // Block 0x51, offset 0x1440 + 0x1440: 0x0040, 0x1441: 0x0040, 0x1442: 0x0040, 0x1443: 0x0040, 0x1444: 0x0040, 0x1445: 0x0040, + 0x1446: 0x0040, 0x1447: 0x0040, 0x1448: 0x0040, 0x1449: 0x0040, 0x144a: 0x0040, 0x144b: 0x0040, + 0x144c: 0x0040, 0x144d: 0x0040, 0x144e: 0x0040, 0x144f: 0x0040, 0x1450: 0x95d1, 0x1451: 0x9609, + 0x1452: 0x9609, 0x1453: 0x9641, 0x1454: 0x9679, 0x1455: 0x96b1, 0x1456: 0x96e9, 0x1457: 0x9721, + 0x1458: 0x9759, 0x1459: 0x9759, 0x145a: 0x9791, 0x145b: 0x97c9, 0x145c: 0x9801, 0x145d: 0x9839, + 0x145e: 0x9871, 0x145f: 0x98a9, 0x1460: 0x98a9, 0x1461: 0x98e1, 0x1462: 0x9919, 0x1463: 0x9919, + 0x1464: 0x9951, 0x1465: 0x9951, 0x1466: 0x9989, 0x1467: 0x99c1, 0x1468: 0x99c1, 0x1469: 0x99f9, + 0x146a: 0x9a31, 0x146b: 0x9a31, 0x146c: 0x9a69, 0x146d: 0x9a69, 0x146e: 0x9aa1, 0x146f: 0x9ad9, + 0x1470: 0x9ad9, 0x1471: 0x9b11, 0x1472: 0x9b11, 0x1473: 0x9b49, 0x1474: 0x9b81, 0x1475: 0x9bb9, + 0x1476: 0x9bf1, 0x1477: 0x9bf1, 0x1478: 0x9c29, 0x1479: 0x9c61, 0x147a: 0x9c99, 0x147b: 0x9cd1, + 0x147c: 0x9d09, 0x147d: 0x9d09, 0x147e: 0x9d41, 0x147f: 0x9d79, + // Block 0x52, offset 0x1480 + 0x1480: 0xa949, 0x1481: 0xa981, 0x1482: 0xa9b9, 0x1483: 0xa8a1, 0x1484: 0x9bb9, 0x1485: 0x9989, + 0x1486: 0xa9f1, 0x1487: 0xaa29, 0x1488: 0x0040, 0x1489: 0x0040, 0x148a: 0x0040, 0x148b: 0x0040, + 0x148c: 0x0040, 0x148d: 0x0040, 0x148e: 0x0040, 0x148f: 0x0040, 0x1490: 0x0040, 0x1491: 0x0040, + 0x1492: 0x0040, 0x1493: 0x0040, 0x1494: 0x0040, 0x1495: 0x0040, 0x1496: 0x0040, 0x1497: 0x0040, + 0x1498: 0x0040, 0x1499: 0x0040, 0x149a: 0x0040, 0x149b: 0x0040, 0x149c: 0x0040, 0x149d: 0x0040, + 0x149e: 0x0040, 0x149f: 0x0040, 0x14a0: 0x0040, 0x14a1: 0x0040, 0x14a2: 0x0040, 0x14a3: 0x0040, + 0x14a4: 0x0040, 0x14a5: 0x0040, 0x14a6: 0x0040, 0x14a7: 0x0040, 0x14a8: 0x0040, 0x14a9: 0x0040, + 0x14aa: 0x0040, 0x14ab: 0x0040, 0x14ac: 0x0040, 0x14ad: 0x0040, 0x14ae: 0x0040, 0x14af: 0x0040, + 0x14b0: 0xaa61, 0x14b1: 0xaa99, 0x14b2: 0xaad1, 0x14b3: 0xab19, 0x14b4: 0xab61, 0x14b5: 0xaba9, + 0x14b6: 0xabf1, 0x14b7: 0xac39, 0x14b8: 0xac81, 0x14b9: 0xacc9, 0x14ba: 0xad02, 0x14bb: 0xae12, + 0x14bc: 0xae91, 0x14bd: 0x0018, 0x14be: 0x0040, 0x14bf: 0x0040, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x13c0, 0x14c1: 0x13c0, 0x14c2: 0x13c0, 0x14c3: 0x13c0, 0x14c4: 0x13c0, 0x14c5: 0x13c0, + 0x14c6: 0x13c0, 0x14c7: 0x13c0, 0x14c8: 0x13c0, 0x14c9: 0x13c0, 0x14ca: 0x13c0, 0x14cb: 0x13c0, + 0x14cc: 0x13c0, 0x14cd: 0x13c0, 0x14ce: 0x13c0, 0x14cf: 0x13c0, 0x14d0: 0xaeda, 0x14d1: 0x7d55, + 0x14d2: 0x0040, 0x14d3: 0xaeea, 0x14d4: 0x03c2, 0x14d5: 0xaefa, 0x14d6: 0xaf0a, 0x14d7: 0x7d75, + 0x14d8: 0x7d95, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040, + 0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x1308, 0x14e1: 0x1308, 0x14e2: 0x1308, 0x14e3: 0x1308, + 0x14e4: 0x1308, 0x14e5: 0x1308, 0x14e6: 0x1308, 0x14e7: 0x1308, 0x14e8: 0x1308, 0x14e9: 0x1308, + 0x14ea: 0x1308, 0x14eb: 0x1308, 0x14ec: 0x1308, 0x14ed: 0x1308, 0x14ee: 0x1308, 0x14ef: 0x1308, + 0x14f0: 0x0040, 0x14f1: 0x7db5, 0x14f2: 0x7dd5, 0x14f3: 0xaf1a, 0x14f4: 0xaf1a, 0x14f5: 0x1fd2, + 0x14f6: 0x1fe2, 0x14f7: 0xaf2a, 0x14f8: 0xaf3a, 0x14f9: 0x7df5, 0x14fa: 0x7e15, 0x14fb: 0x7e35, + 0x14fc: 0x7df5, 0x14fd: 0x7e55, 0x14fe: 0x7e75, 0x14ff: 0x7e55, + // Block 0x54, offset 0x1500 + 0x1500: 0x7e95, 0x1501: 0x7eb5, 0x1502: 0x7ed5, 0x1503: 0x7eb5, 0x1504: 0x7ef5, 0x1505: 0x0018, + 0x1506: 0x0018, 0x1507: 0xaf4a, 0x1508: 0xaf5a, 0x1509: 0x7f16, 0x150a: 0x7f36, 0x150b: 0x7f56, + 0x150c: 0x7f76, 0x150d: 0xaf1a, 0x150e: 0xaf1a, 0x150f: 0xaf1a, 0x1510: 0xaeda, 0x1511: 0x7f95, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x03c2, 0x1515: 0xaeea, 0x1516: 0xaf0a, 0x1517: 0xaefa, + 0x1518: 0x7fb5, 0x1519: 0x1fd2, 0x151a: 0x1fe2, 0x151b: 0xaf2a, 0x151c: 0xaf3a, 0x151d: 0x7e95, + 0x151e: 0x7ef5, 0x151f: 0xaf6a, 0x1520: 0xaf7a, 0x1521: 0xaf8a, 0x1522: 0x1fb2, 0x1523: 0xaf99, + 0x1524: 0xafaa, 0x1525: 0xafba, 0x1526: 0x1fc2, 0x1527: 0x0040, 0x1528: 0xafca, 0x1529: 0xafda, + 0x152a: 0xafea, 0x152b: 0xaffa, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0x7fd6, 0x1531: 0xb009, 0x1532: 0x7ff6, 0x1533: 0x0008, 0x1534: 0x8016, 0x1535: 0x0040, + 0x1536: 0x8036, 0x1537: 0xb031, 0x1538: 0x8056, 0x1539: 0xb059, 0x153a: 0x8076, 0x153b: 0xb081, + 0x153c: 0x8096, 0x153d: 0xb0a9, 0x153e: 0x80b6, 0x153f: 0xb0d1, + // Block 0x55, offset 0x1540 + 0x1540: 0xb0f9, 0x1541: 0xb111, 0x1542: 0xb111, 0x1543: 0xb129, 0x1544: 0xb129, 0x1545: 0xb141, + 0x1546: 0xb141, 0x1547: 0xb159, 0x1548: 0xb159, 0x1549: 0xb171, 0x154a: 0xb171, 0x154b: 0xb171, + 0x154c: 0xb171, 0x154d: 0xb189, 0x154e: 0xb189, 0x154f: 0xb1a1, 0x1550: 0xb1a1, 0x1551: 0xb1a1, + 0x1552: 0xb1a1, 0x1553: 0xb1b9, 0x1554: 0xb1b9, 0x1555: 0xb1d1, 0x1556: 0xb1d1, 0x1557: 0xb1d1, + 0x1558: 0xb1d1, 0x1559: 0xb1e9, 0x155a: 0xb1e9, 0x155b: 0xb1e9, 0x155c: 0xb1e9, 0x155d: 0xb201, + 0x155e: 0xb201, 0x155f: 0xb201, 0x1560: 0xb201, 0x1561: 0xb219, 0x1562: 0xb219, 0x1563: 0xb219, + 0x1564: 0xb219, 0x1565: 0xb231, 0x1566: 0xb231, 0x1567: 0xb231, 0x1568: 0xb231, 0x1569: 0xb249, + 0x156a: 0xb249, 0x156b: 0xb261, 0x156c: 0xb261, 0x156d: 0xb279, 0x156e: 0xb279, 0x156f: 0xb291, + 0x1570: 0xb291, 0x1571: 0xb2a9, 0x1572: 0xb2a9, 0x1573: 0xb2a9, 0x1574: 0xb2a9, 0x1575: 0xb2c1, + 0x1576: 0xb2c1, 0x1577: 0xb2c1, 0x1578: 0xb2c1, 0x1579: 0xb2d9, 0x157a: 0xb2d9, 0x157b: 0xb2d9, + 0x157c: 0xb2d9, 0x157d: 0xb2f1, 0x157e: 0xb2f1, 0x157f: 0xb2f1, + // Block 0x56, offset 0x1580 + 0x1580: 0xb2f1, 0x1581: 0xb309, 0x1582: 0xb309, 0x1583: 0xb309, 0x1584: 0xb309, 0x1585: 0xb321, + 0x1586: 0xb321, 0x1587: 0xb321, 0x1588: 0xb321, 0x1589: 0xb339, 0x158a: 0xb339, 0x158b: 0xb339, + 0x158c: 0xb339, 0x158d: 0xb351, 0x158e: 0xb351, 0x158f: 0xb351, 0x1590: 0xb351, 0x1591: 0xb369, + 0x1592: 0xb369, 0x1593: 0xb369, 0x1594: 0xb369, 0x1595: 0xb381, 0x1596: 0xb381, 0x1597: 0xb381, + 0x1598: 0xb381, 0x1599: 0xb399, 0x159a: 0xb399, 0x159b: 0xb399, 0x159c: 0xb399, 0x159d: 0xb3b1, + 0x159e: 0xb3b1, 0x159f: 0xb3b1, 0x15a0: 0xb3b1, 0x15a1: 0xb3c9, 0x15a2: 0xb3c9, 0x15a3: 0xb3c9, + 0x15a4: 0xb3c9, 0x15a5: 0xb3e1, 0x15a6: 0xb3e1, 0x15a7: 0xb3e1, 0x15a8: 0xb3e1, 0x15a9: 0xb3f9, + 0x15aa: 0xb3f9, 0x15ab: 0xb3f9, 0x15ac: 0xb3f9, 0x15ad: 0xb411, 0x15ae: 0xb411, 0x15af: 0x7ab1, + 0x15b0: 0x7ab1, 0x15b1: 0xb429, 0x15b2: 0xb429, 0x15b3: 0xb429, 0x15b4: 0xb429, 0x15b5: 0xb441, + 0x15b6: 0xb441, 0x15b7: 0xb469, 0x15b8: 0xb469, 0x15b9: 0xb491, 0x15ba: 0xb491, 0x15bb: 0xb4b9, + 0x15bc: 0xb4b9, 0x15bd: 0x0040, 0x15be: 0x0040, 0x15bf: 0x03c0, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x0040, 0x15c1: 0xaefa, 0x15c2: 0xb4e2, 0x15c3: 0xaf6a, 0x15c4: 0xafda, 0x15c5: 0xafea, + 0x15c6: 0xaf7a, 0x15c7: 0xb4f2, 0x15c8: 0x1fd2, 0x15c9: 0x1fe2, 0x15ca: 0xaf8a, 0x15cb: 0x1fb2, + 0x15cc: 0xaeda, 0x15cd: 0xaf99, 0x15ce: 0x29d1, 0x15cf: 0xb502, 0x15d0: 0x1f41, 0x15d1: 0x00c9, + 0x15d2: 0x0069, 0x15d3: 0x0079, 0x15d4: 0x1f51, 0x15d5: 0x1f61, 0x15d6: 0x1f71, 0x15d7: 0x1f81, + 0x15d8: 0x1f91, 0x15d9: 0x1fa1, 0x15da: 0xaeea, 0x15db: 0x03c2, 0x15dc: 0xafaa, 0x15dd: 0x1fc2, + 0x15de: 0xafba, 0x15df: 0xaf0a, 0x15e0: 0xaffa, 0x15e1: 0x0039, 0x15e2: 0x0ee9, 0x15e3: 0x1159, + 0x15e4: 0x0ef9, 0x15e5: 0x0f09, 0x15e6: 0x1199, 0x15e7: 0x0f31, 0x15e8: 0x0249, 0x15e9: 0x0f41, + 0x15ea: 0x0259, 0x15eb: 0x0f51, 0x15ec: 0x0359, 0x15ed: 0x0f61, 0x15ee: 0x0f71, 0x15ef: 0x00d9, + 0x15f0: 0x0f99, 0x15f1: 0x2039, 0x15f2: 0x0269, 0x15f3: 0x01d9, 0x15f4: 0x0fa9, 0x15f5: 0x0fb9, + 0x15f6: 0x1089, 0x15f7: 0x0279, 0x15f8: 0x0369, 0x15f9: 0x0289, 0x15fa: 0x13d1, 0x15fb: 0xaf4a, + 0x15fc: 0xafca, 0x15fd: 0xaf5a, 0x15fe: 0xb512, 0x15ff: 0xaf1a, + // Block 0x58, offset 0x1600 + 0x1600: 0x1caa, 0x1601: 0x0039, 0x1602: 0x0ee9, 0x1603: 0x1159, 0x1604: 0x0ef9, 0x1605: 0x0f09, + 0x1606: 0x1199, 0x1607: 0x0f31, 0x1608: 0x0249, 0x1609: 0x0f41, 0x160a: 0x0259, 0x160b: 0x0f51, + 0x160c: 0x0359, 0x160d: 0x0f61, 0x160e: 0x0f71, 0x160f: 0x00d9, 0x1610: 0x0f99, 0x1611: 0x2039, + 0x1612: 0x0269, 0x1613: 0x01d9, 0x1614: 0x0fa9, 0x1615: 0x0fb9, 0x1616: 0x1089, 0x1617: 0x0279, + 0x1618: 0x0369, 0x1619: 0x0289, 0x161a: 0x13d1, 0x161b: 0xaf2a, 0x161c: 0xb522, 0x161d: 0xaf3a, + 0x161e: 0xb532, 0x161f: 0x80d5, 0x1620: 0x80f5, 0x1621: 0x29d1, 0x1622: 0x8115, 0x1623: 0x8115, + 0x1624: 0x8135, 0x1625: 0x8155, 0x1626: 0x8175, 0x1627: 0x8195, 0x1628: 0x81b5, 0x1629: 0x81d5, + 0x162a: 0x81f5, 0x162b: 0x8215, 0x162c: 0x8235, 0x162d: 0x8255, 0x162e: 0x8275, 0x162f: 0x8295, + 0x1630: 0x82b5, 0x1631: 0x82d5, 0x1632: 0x82f5, 0x1633: 0x8315, 0x1634: 0x8335, 0x1635: 0x8355, + 0x1636: 0x8375, 0x1637: 0x8395, 0x1638: 0x83b5, 0x1639: 0x83d5, 0x163a: 0x83f5, 0x163b: 0x8415, + 0x163c: 0x81b5, 0x163d: 0x8435, 0x163e: 0x8455, 0x163f: 0x8215, + // Block 0x59, offset 0x1640 + 0x1640: 0x8475, 0x1641: 0x8495, 0x1642: 0x84b5, 0x1643: 0x84d5, 0x1644: 0x84f5, 0x1645: 0x8515, + 0x1646: 0x8535, 0x1647: 0x8555, 0x1648: 0x84d5, 0x1649: 0x8575, 0x164a: 0x84d5, 0x164b: 0x8595, + 0x164c: 0x8595, 0x164d: 0x85b5, 0x164e: 0x85b5, 0x164f: 0x85d5, 0x1650: 0x8515, 0x1651: 0x85f5, + 0x1652: 0x8615, 0x1653: 0x85f5, 0x1654: 0x8635, 0x1655: 0x8615, 0x1656: 0x8655, 0x1657: 0x8655, + 0x1658: 0x8675, 0x1659: 0x8675, 0x165a: 0x8695, 0x165b: 0x8695, 0x165c: 0x8615, 0x165d: 0x8115, + 0x165e: 0x86b5, 0x165f: 0x86d5, 0x1660: 0x0040, 0x1661: 0x86f5, 0x1662: 0x8715, 0x1663: 0x8735, + 0x1664: 0x8755, 0x1665: 0x8735, 0x1666: 0x8775, 0x1667: 0x8795, 0x1668: 0x87b5, 0x1669: 0x87b5, + 0x166a: 0x87d5, 0x166b: 0x87d5, 0x166c: 0x87f5, 0x166d: 0x87f5, 0x166e: 0x87d5, 0x166f: 0x87d5, + 0x1670: 0x8815, 0x1671: 0x8835, 0x1672: 0x8855, 0x1673: 0x8875, 0x1674: 0x8895, 0x1675: 0x88b5, + 0x1676: 0x88b5, 0x1677: 0x88b5, 0x1678: 0x88d5, 0x1679: 0x88d5, 0x167a: 0x88d5, 0x167b: 0x88d5, + 0x167c: 0x87b5, 0x167d: 0x87b5, 0x167e: 0x87b5, 0x167f: 0x0040, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0040, 0x1681: 0x0040, 0x1682: 0x8715, 0x1683: 0x86f5, 0x1684: 0x88f5, 0x1685: 0x86f5, + 0x1686: 0x8715, 0x1687: 0x86f5, 0x1688: 0x0040, 0x1689: 0x0040, 0x168a: 0x8915, 0x168b: 0x8715, + 0x168c: 0x8935, 0x168d: 0x88f5, 0x168e: 0x8935, 0x168f: 0x8715, 0x1690: 0x0040, 0x1691: 0x0040, + 0x1692: 0x8955, 0x1693: 0x8975, 0x1694: 0x8875, 0x1695: 0x8935, 0x1696: 0x88f5, 0x1697: 0x8935, + 0x1698: 0x0040, 0x1699: 0x0040, 0x169a: 0x8995, 0x169b: 0x89b5, 0x169c: 0x8995, 0x169d: 0x0040, + 0x169e: 0x0040, 0x169f: 0x0040, 0x16a0: 0xb541, 0x16a1: 0xb559, 0x16a2: 0xb571, 0x16a3: 0x89d6, + 0x16a4: 0xb589, 0x16a5: 0xb5a1, 0x16a6: 0x89f5, 0x16a7: 0x0040, 0x16a8: 0x8a15, 0x16a9: 0x8a35, + 0x16aa: 0x8a55, 0x16ab: 0x8a35, 0x16ac: 0x8a75, 0x16ad: 0x8a95, 0x16ae: 0x8ab5, 0x16af: 0x0040, + 0x16b0: 0x0040, 0x16b1: 0x0040, 0x16b2: 0x0040, 0x16b3: 0x0040, 0x16b4: 0x0040, 0x16b5: 0x0040, + 0x16b6: 0x0040, 0x16b7: 0x0040, 0x16b8: 0x0040, 0x16b9: 0x0340, 0x16ba: 0x0340, 0x16bb: 0x0340, + 0x16bc: 0x0040, 0x16bd: 0x0040, 0x16be: 0x0040, 0x16bf: 0x0040, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x0208, 0x16c1: 0x0208, 0x16c2: 0x0208, 0x16c3: 0x0208, 0x16c4: 0x0208, 0x16c5: 0x0408, + 0x16c6: 0x0008, 0x16c7: 0x0408, 0x16c8: 0x0018, 0x16c9: 0x0408, 0x16ca: 0x0408, 0x16cb: 0x0008, + 0x16cc: 0x0008, 0x16cd: 0x0108, 0x16ce: 0x0408, 0x16cf: 0x0408, 0x16d0: 0x0408, 0x16d1: 0x0408, + 0x16d2: 0x0408, 0x16d3: 0x0208, 0x16d4: 0x0208, 0x16d5: 0x0208, 0x16d6: 0x0208, 0x16d7: 0x0108, + 0x16d8: 0x0208, 0x16d9: 0x0208, 0x16da: 0x0208, 0x16db: 0x0208, 0x16dc: 0x0208, 0x16dd: 0x0408, + 0x16de: 0x0208, 0x16df: 0x0208, 0x16e0: 0x0208, 0x16e1: 0x0408, 0x16e2: 0x0008, 0x16e3: 0x0008, + 0x16e4: 0x0408, 0x16e5: 0x1308, 0x16e6: 0x1308, 0x16e7: 0x0040, 0x16e8: 0x0040, 0x16e9: 0x0040, + 0x16ea: 0x0040, 0x16eb: 0x0218, 0x16ec: 0x0218, 0x16ed: 0x0218, 0x16ee: 0x0218, 0x16ef: 0x0418, + 0x16f0: 0x0018, 0x16f1: 0x0018, 0x16f2: 0x0018, 0x16f3: 0x0018, 0x16f4: 0x0018, 0x16f5: 0x0018, + 0x16f6: 0x0018, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0040, 0x16fa: 0x0040, 0x16fb: 0x0040, + 0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0208, 0x1701: 0x0408, 0x1702: 0x0208, 0x1703: 0x0408, 0x1704: 0x0408, 0x1705: 0x0408, + 0x1706: 0x0208, 0x1707: 0x0208, 0x1708: 0x0208, 0x1709: 0x0408, 0x170a: 0x0208, 0x170b: 0x0208, + 0x170c: 0x0408, 0x170d: 0x0208, 0x170e: 0x0408, 0x170f: 0x0408, 0x1710: 0x0208, 0x1711: 0x0408, + 0x1712: 0x0040, 0x1713: 0x0040, 0x1714: 0x0040, 0x1715: 0x0040, 0x1716: 0x0040, 0x1717: 0x0040, + 0x1718: 0x0040, 0x1719: 0x0018, 0x171a: 0x0018, 0x171b: 0x0018, 0x171c: 0x0018, 0x171d: 0x0040, + 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x0040, 0x1721: 0x0040, 0x1722: 0x0040, 0x1723: 0x0040, + 0x1724: 0x0040, 0x1725: 0x0040, 0x1726: 0x0040, 0x1727: 0x0040, 0x1728: 0x0040, 0x1729: 0x0418, + 0x172a: 0x0418, 0x172b: 0x0418, 0x172c: 0x0418, 0x172d: 0x0218, 0x172e: 0x0218, 0x172f: 0x0018, + 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, + 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0040, 0x173a: 0x0040, 0x173b: 0x0040, + 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, + // Block 0x5d, offset 0x1740 + 0x1740: 0x1308, 0x1741: 0x1308, 0x1742: 0x1008, 0x1743: 0x1008, 0x1744: 0x0040, 0x1745: 0x0008, + 0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008, + 0x174c: 0x0008, 0x174d: 0x0040, 0x174e: 0x0040, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0040, + 0x1752: 0x0040, 0x1753: 0x0008, 0x1754: 0x0008, 0x1755: 0x0008, 0x1756: 0x0008, 0x1757: 0x0008, + 0x1758: 0x0008, 0x1759: 0x0008, 0x175a: 0x0008, 0x175b: 0x0008, 0x175c: 0x0008, 0x175d: 0x0008, + 0x175e: 0x0008, 0x175f: 0x0008, 0x1760: 0x0008, 0x1761: 0x0008, 0x1762: 0x0008, 0x1763: 0x0008, + 0x1764: 0x0008, 0x1765: 0x0008, 0x1766: 0x0008, 0x1767: 0x0008, 0x1768: 0x0008, 0x1769: 0x0040, + 0x176a: 0x0008, 0x176b: 0x0008, 0x176c: 0x0008, 0x176d: 0x0008, 0x176e: 0x0008, 0x176f: 0x0008, + 0x1770: 0x0008, 0x1771: 0x0040, 0x1772: 0x0008, 0x1773: 0x0008, 0x1774: 0x0040, 0x1775: 0x0008, + 0x1776: 0x0008, 0x1777: 0x0008, 0x1778: 0x0008, 0x1779: 0x0008, 0x177a: 0x0040, 0x177b: 0x0040, + 0x177c: 0x1308, 0x177d: 0x0008, 0x177e: 0x1008, 0x177f: 0x1008, + // Block 0x5e, offset 0x1780 + 0x1780: 0x1308, 0x1781: 0x1008, 0x1782: 0x1008, 0x1783: 0x1008, 0x1784: 0x1008, 0x1785: 0x0040, + 0x1786: 0x0040, 0x1787: 0x1008, 0x1788: 0x1008, 0x1789: 0x0040, 0x178a: 0x0040, 0x178b: 0x1008, + 0x178c: 0x1008, 0x178d: 0x1808, 0x178e: 0x0040, 0x178f: 0x0040, 0x1790: 0x0008, 0x1791: 0x0040, + 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x1008, + 0x1798: 0x0040, 0x1799: 0x0040, 0x179a: 0x0040, 0x179b: 0x0040, 0x179c: 0x0040, 0x179d: 0x0008, + 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x1008, 0x17a3: 0x1008, + 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x1308, 0x17a7: 0x1308, 0x17a8: 0x1308, 0x17a9: 0x1308, + 0x17aa: 0x1308, 0x17ab: 0x1308, 0x17ac: 0x1308, 0x17ad: 0x0040, 0x17ae: 0x0040, 0x17af: 0x0040, + 0x17b0: 0x1308, 0x17b1: 0x1308, 0x17b2: 0x1308, 0x17b3: 0x1308, 0x17b4: 0x1308, 0x17b5: 0x0040, + 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, + 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x0039, 0x17c1: 0x0ee9, 0x17c2: 0x1159, 0x17c3: 0x0ef9, 0x17c4: 0x0f09, 0x17c5: 0x1199, + 0x17c6: 0x0f31, 0x17c7: 0x0249, 0x17c8: 0x0f41, 0x17c9: 0x0259, 0x17ca: 0x0f51, 0x17cb: 0x0359, + 0x17cc: 0x0f61, 0x17cd: 0x0f71, 0x17ce: 0x00d9, 0x17cf: 0x0f99, 0x17d0: 0x2039, 0x17d1: 0x0269, + 0x17d2: 0x01d9, 0x17d3: 0x0fa9, 0x17d4: 0x0fb9, 0x17d5: 0x1089, 0x17d6: 0x0279, 0x17d7: 0x0369, + 0x17d8: 0x0289, 0x17d9: 0x13d1, 0x17da: 0x0039, 0x17db: 0x0ee9, 0x17dc: 0x1159, 0x17dd: 0x0ef9, + 0x17de: 0x0f09, 0x17df: 0x1199, 0x17e0: 0x0f31, 0x17e1: 0x0249, 0x17e2: 0x0f41, 0x17e3: 0x0259, + 0x17e4: 0x0f51, 0x17e5: 0x0359, 0x17e6: 0x0f61, 0x17e7: 0x0f71, 0x17e8: 0x00d9, 0x17e9: 0x0f99, + 0x17ea: 0x2039, 0x17eb: 0x0269, 0x17ec: 0x01d9, 0x17ed: 0x0fa9, 0x17ee: 0x0fb9, 0x17ef: 0x1089, + 0x17f0: 0x0279, 0x17f1: 0x0369, 0x17f2: 0x0289, 0x17f3: 0x13d1, 0x17f4: 0x0039, 0x17f5: 0x0ee9, + 0x17f6: 0x1159, 0x17f7: 0x0ef9, 0x17f8: 0x0f09, 0x17f9: 0x1199, 0x17fa: 0x0f31, 0x17fb: 0x0249, + 0x17fc: 0x0f41, 0x17fd: 0x0259, 0x17fe: 0x0f51, 0x17ff: 0x0359, + // Block 0x60, offset 0x1800 + 0x1800: 0x0f61, 0x1801: 0x0f71, 0x1802: 0x00d9, 0x1803: 0x0f99, 0x1804: 0x2039, 0x1805: 0x0269, + 0x1806: 0x01d9, 0x1807: 0x0fa9, 0x1808: 0x0fb9, 0x1809: 0x1089, 0x180a: 0x0279, 0x180b: 0x0369, + 0x180c: 0x0289, 0x180d: 0x13d1, 0x180e: 0x0039, 0x180f: 0x0ee9, 0x1810: 0x1159, 0x1811: 0x0ef9, + 0x1812: 0x0f09, 0x1813: 0x1199, 0x1814: 0x0f31, 0x1815: 0x0040, 0x1816: 0x0f41, 0x1817: 0x0259, + 0x1818: 0x0f51, 0x1819: 0x0359, 0x181a: 0x0f61, 0x181b: 0x0f71, 0x181c: 0x00d9, 0x181d: 0x0f99, + 0x181e: 0x2039, 0x181f: 0x0269, 0x1820: 0x01d9, 0x1821: 0x0fa9, 0x1822: 0x0fb9, 0x1823: 0x1089, + 0x1824: 0x0279, 0x1825: 0x0369, 0x1826: 0x0289, 0x1827: 0x13d1, 0x1828: 0x0039, 0x1829: 0x0ee9, + 0x182a: 0x1159, 0x182b: 0x0ef9, 0x182c: 0x0f09, 0x182d: 0x1199, 0x182e: 0x0f31, 0x182f: 0x0249, + 0x1830: 0x0f41, 0x1831: 0x0259, 0x1832: 0x0f51, 0x1833: 0x0359, 0x1834: 0x0f61, 0x1835: 0x0f71, + 0x1836: 0x00d9, 0x1837: 0x0f99, 0x1838: 0x2039, 0x1839: 0x0269, 0x183a: 0x01d9, 0x183b: 0x0fa9, + 0x183c: 0x0fb9, 0x183d: 0x1089, 0x183e: 0x0279, 0x183f: 0x0369, + // Block 0x61, offset 0x1840 + 0x1840: 0x0289, 0x1841: 0x13d1, 0x1842: 0x0039, 0x1843: 0x0ee9, 0x1844: 0x1159, 0x1845: 0x0ef9, + 0x1846: 0x0f09, 0x1847: 0x1199, 0x1848: 0x0f31, 0x1849: 0x0249, 0x184a: 0x0f41, 0x184b: 0x0259, + 0x184c: 0x0f51, 0x184d: 0x0359, 0x184e: 0x0f61, 0x184f: 0x0f71, 0x1850: 0x00d9, 0x1851: 0x0f99, + 0x1852: 0x2039, 0x1853: 0x0269, 0x1854: 0x01d9, 0x1855: 0x0fa9, 0x1856: 0x0fb9, 0x1857: 0x1089, + 0x1858: 0x0279, 0x1859: 0x0369, 0x185a: 0x0289, 0x185b: 0x13d1, 0x185c: 0x0039, 0x185d: 0x0040, + 0x185e: 0x1159, 0x185f: 0x0ef9, 0x1860: 0x0040, 0x1861: 0x0040, 0x1862: 0x0f31, 0x1863: 0x0040, + 0x1864: 0x0040, 0x1865: 0x0259, 0x1866: 0x0f51, 0x1867: 0x0040, 0x1868: 0x0040, 0x1869: 0x0f71, + 0x186a: 0x00d9, 0x186b: 0x0f99, 0x186c: 0x2039, 0x186d: 0x0040, 0x186e: 0x01d9, 0x186f: 0x0fa9, + 0x1870: 0x0fb9, 0x1871: 0x1089, 0x1872: 0x0279, 0x1873: 0x0369, 0x1874: 0x0289, 0x1875: 0x13d1, + 0x1876: 0x0039, 0x1877: 0x0ee9, 0x1878: 0x1159, 0x1879: 0x0ef9, 0x187a: 0x0040, 0x187b: 0x1199, + 0x187c: 0x0040, 0x187d: 0x0249, 0x187e: 0x0f41, 0x187f: 0x0259, + // Block 0x62, offset 0x1880 + 0x1880: 0x0f51, 0x1881: 0x0359, 0x1882: 0x0f61, 0x1883: 0x0f71, 0x1884: 0x0040, 0x1885: 0x0f99, + 0x1886: 0x2039, 0x1887: 0x0269, 0x1888: 0x01d9, 0x1889: 0x0fa9, 0x188a: 0x0fb9, 0x188b: 0x1089, + 0x188c: 0x0279, 0x188d: 0x0369, 0x188e: 0x0289, 0x188f: 0x13d1, 0x1890: 0x0039, 0x1891: 0x0ee9, + 0x1892: 0x1159, 0x1893: 0x0ef9, 0x1894: 0x0f09, 0x1895: 0x1199, 0x1896: 0x0f31, 0x1897: 0x0249, + 0x1898: 0x0f41, 0x1899: 0x0259, 0x189a: 0x0f51, 0x189b: 0x0359, 0x189c: 0x0f61, 0x189d: 0x0f71, + 0x189e: 0x00d9, 0x189f: 0x0f99, 0x18a0: 0x2039, 0x18a1: 0x0269, 0x18a2: 0x01d9, 0x18a3: 0x0fa9, + 0x18a4: 0x0fb9, 0x18a5: 0x1089, 0x18a6: 0x0279, 0x18a7: 0x0369, 0x18a8: 0x0289, 0x18a9: 0x13d1, + 0x18aa: 0x0039, 0x18ab: 0x0ee9, 0x18ac: 0x1159, 0x18ad: 0x0ef9, 0x18ae: 0x0f09, 0x18af: 0x1199, + 0x18b0: 0x0f31, 0x18b1: 0x0249, 0x18b2: 0x0f41, 0x18b3: 0x0259, 0x18b4: 0x0f51, 0x18b5: 0x0359, + 0x18b6: 0x0f61, 0x18b7: 0x0f71, 0x18b8: 0x00d9, 0x18b9: 0x0f99, 0x18ba: 0x2039, 0x18bb: 0x0269, + 0x18bc: 0x01d9, 0x18bd: 0x0fa9, 0x18be: 0x0fb9, 0x18bf: 0x1089, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0279, 0x18c1: 0x0369, 0x18c2: 0x0289, 0x18c3: 0x13d1, 0x18c4: 0x0039, 0x18c5: 0x0ee9, + 0x18c6: 0x0040, 0x18c7: 0x0ef9, 0x18c8: 0x0f09, 0x18c9: 0x1199, 0x18ca: 0x0f31, 0x18cb: 0x0040, + 0x18cc: 0x0040, 0x18cd: 0x0259, 0x18ce: 0x0f51, 0x18cf: 0x0359, 0x18d0: 0x0f61, 0x18d1: 0x0f71, + 0x18d2: 0x00d9, 0x18d3: 0x0f99, 0x18d4: 0x2039, 0x18d5: 0x0040, 0x18d6: 0x01d9, 0x18d7: 0x0fa9, + 0x18d8: 0x0fb9, 0x18d9: 0x1089, 0x18da: 0x0279, 0x18db: 0x0369, 0x18dc: 0x0289, 0x18dd: 0x0040, + 0x18de: 0x0039, 0x18df: 0x0ee9, 0x18e0: 0x1159, 0x18e1: 0x0ef9, 0x18e2: 0x0f09, 0x18e3: 0x1199, + 0x18e4: 0x0f31, 0x18e5: 0x0249, 0x18e6: 0x0f41, 0x18e7: 0x0259, 0x18e8: 0x0f51, 0x18e9: 0x0359, + 0x18ea: 0x0f61, 0x18eb: 0x0f71, 0x18ec: 0x00d9, 0x18ed: 0x0f99, 0x18ee: 0x2039, 0x18ef: 0x0269, + 0x18f0: 0x01d9, 0x18f1: 0x0fa9, 0x18f2: 0x0fb9, 0x18f3: 0x1089, 0x18f4: 0x0279, 0x18f5: 0x0369, + 0x18f6: 0x0289, 0x18f7: 0x13d1, 0x18f8: 0x0039, 0x18f9: 0x0ee9, 0x18fa: 0x0040, 0x18fb: 0x0ef9, + 0x18fc: 0x0f09, 0x18fd: 0x1199, 0x18fe: 0x0f31, 0x18ff: 0x0040, + // Block 0x64, offset 0x1900 + 0x1900: 0x0f41, 0x1901: 0x0259, 0x1902: 0x0f51, 0x1903: 0x0359, 0x1904: 0x0f61, 0x1905: 0x0040, + 0x1906: 0x00d9, 0x1907: 0x0040, 0x1908: 0x0040, 0x1909: 0x0040, 0x190a: 0x01d9, 0x190b: 0x0fa9, + 0x190c: 0x0fb9, 0x190d: 0x1089, 0x190e: 0x0279, 0x190f: 0x0369, 0x1910: 0x0289, 0x1911: 0x0040, + 0x1912: 0x0039, 0x1913: 0x0ee9, 0x1914: 0x1159, 0x1915: 0x0ef9, 0x1916: 0x0f09, 0x1917: 0x1199, + 0x1918: 0x0f31, 0x1919: 0x0249, 0x191a: 0x0f41, 0x191b: 0x0259, 0x191c: 0x0f51, 0x191d: 0x0359, + 0x191e: 0x0f61, 0x191f: 0x0f71, 0x1920: 0x00d9, 0x1921: 0x0f99, 0x1922: 0x2039, 0x1923: 0x0269, + 0x1924: 0x01d9, 0x1925: 0x0fa9, 0x1926: 0x0fb9, 0x1927: 0x1089, 0x1928: 0x0279, 0x1929: 0x0369, + 0x192a: 0x0289, 0x192b: 0x13d1, 0x192c: 0x0039, 0x192d: 0x0ee9, 0x192e: 0x1159, 0x192f: 0x0ef9, + 0x1930: 0x0f09, 0x1931: 0x1199, 0x1932: 0x0f31, 0x1933: 0x0249, 0x1934: 0x0f41, 0x1935: 0x0259, + 0x1936: 0x0f51, 0x1937: 0x0359, 0x1938: 0x0f61, 0x1939: 0x0f71, 0x193a: 0x00d9, 0x193b: 0x0f99, + 0x193c: 0x2039, 0x193d: 0x0269, 0x193e: 0x01d9, 0x193f: 0x0fa9, + // Block 0x65, offset 0x1940 + 0x1940: 0x0fb9, 0x1941: 0x1089, 0x1942: 0x0279, 0x1943: 0x0369, 0x1944: 0x0289, 0x1945: 0x13d1, + 0x1946: 0x0039, 0x1947: 0x0ee9, 0x1948: 0x1159, 0x1949: 0x0ef9, 0x194a: 0x0f09, 0x194b: 0x1199, + 0x194c: 0x0f31, 0x194d: 0x0249, 0x194e: 0x0f41, 0x194f: 0x0259, 0x1950: 0x0f51, 0x1951: 0x0359, + 0x1952: 0x0f61, 0x1953: 0x0f71, 0x1954: 0x00d9, 0x1955: 0x0f99, 0x1956: 0x2039, 0x1957: 0x0269, + 0x1958: 0x01d9, 0x1959: 0x0fa9, 0x195a: 0x0fb9, 0x195b: 0x1089, 0x195c: 0x0279, 0x195d: 0x0369, + 0x195e: 0x0289, 0x195f: 0x13d1, 0x1960: 0x0039, 0x1961: 0x0ee9, 0x1962: 0x1159, 0x1963: 0x0ef9, + 0x1964: 0x0f09, 0x1965: 0x1199, 0x1966: 0x0f31, 0x1967: 0x0249, 0x1968: 0x0f41, 0x1969: 0x0259, + 0x196a: 0x0f51, 0x196b: 0x0359, 0x196c: 0x0f61, 0x196d: 0x0f71, 0x196e: 0x00d9, 0x196f: 0x0f99, + 0x1970: 0x2039, 0x1971: 0x0269, 0x1972: 0x01d9, 0x1973: 0x0fa9, 0x1974: 0x0fb9, 0x1975: 0x1089, + 0x1976: 0x0279, 0x1977: 0x0369, 0x1978: 0x0289, 0x1979: 0x13d1, 0x197a: 0x0039, 0x197b: 0x0ee9, + 0x197c: 0x1159, 0x197d: 0x0ef9, 0x197e: 0x0f09, 0x197f: 0x1199, + // Block 0x66, offset 0x1980 + 0x1980: 0x0f31, 0x1981: 0x0249, 0x1982: 0x0f41, 0x1983: 0x0259, 0x1984: 0x0f51, 0x1985: 0x0359, + 0x1986: 0x0f61, 0x1987: 0x0f71, 0x1988: 0x00d9, 0x1989: 0x0f99, 0x198a: 0x2039, 0x198b: 0x0269, + 0x198c: 0x01d9, 0x198d: 0x0fa9, 0x198e: 0x0fb9, 0x198f: 0x1089, 0x1990: 0x0279, 0x1991: 0x0369, + 0x1992: 0x0289, 0x1993: 0x13d1, 0x1994: 0x0039, 0x1995: 0x0ee9, 0x1996: 0x1159, 0x1997: 0x0ef9, + 0x1998: 0x0f09, 0x1999: 0x1199, 0x199a: 0x0f31, 0x199b: 0x0249, 0x199c: 0x0f41, 0x199d: 0x0259, + 0x199e: 0x0f51, 0x199f: 0x0359, 0x19a0: 0x0f61, 0x19a1: 0x0f71, 0x19a2: 0x00d9, 0x19a3: 0x0f99, + 0x19a4: 0x2039, 0x19a5: 0x0269, 0x19a6: 0x01d9, 0x19a7: 0x0fa9, 0x19a8: 0x0fb9, 0x19a9: 0x1089, + 0x19aa: 0x0279, 0x19ab: 0x0369, 0x19ac: 0x0289, 0x19ad: 0x13d1, 0x19ae: 0x0039, 0x19af: 0x0ee9, + 0x19b0: 0x1159, 0x19b1: 0x0ef9, 0x19b2: 0x0f09, 0x19b3: 0x1199, 0x19b4: 0x0f31, 0x19b5: 0x0249, + 0x19b6: 0x0f41, 0x19b7: 0x0259, 0x19b8: 0x0f51, 0x19b9: 0x0359, 0x19ba: 0x0f61, 0x19bb: 0x0f71, + 0x19bc: 0x00d9, 0x19bd: 0x0f99, 0x19be: 0x2039, 0x19bf: 0x0269, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x01d9, 0x19c1: 0x0fa9, 0x19c2: 0x0fb9, 0x19c3: 0x1089, 0x19c4: 0x0279, 0x19c5: 0x0369, + 0x19c6: 0x0289, 0x19c7: 0x13d1, 0x19c8: 0x0039, 0x19c9: 0x0ee9, 0x19ca: 0x1159, 0x19cb: 0x0ef9, + 0x19cc: 0x0f09, 0x19cd: 0x1199, 0x19ce: 0x0f31, 0x19cf: 0x0249, 0x19d0: 0x0f41, 0x19d1: 0x0259, + 0x19d2: 0x0f51, 0x19d3: 0x0359, 0x19d4: 0x0f61, 0x19d5: 0x0f71, 0x19d6: 0x00d9, 0x19d7: 0x0f99, + 0x19d8: 0x2039, 0x19d9: 0x0269, 0x19da: 0x01d9, 0x19db: 0x0fa9, 0x19dc: 0x0fb9, 0x19dd: 0x1089, + 0x19de: 0x0279, 0x19df: 0x0369, 0x19e0: 0x0289, 0x19e1: 0x13d1, 0x19e2: 0x0039, 0x19e3: 0x0ee9, + 0x19e4: 0x1159, 0x19e5: 0x0ef9, 0x19e6: 0x0f09, 0x19e7: 0x1199, 0x19e8: 0x0f31, 0x19e9: 0x0249, + 0x19ea: 0x0f41, 0x19eb: 0x0259, 0x19ec: 0x0f51, 0x19ed: 0x0359, 0x19ee: 0x0f61, 0x19ef: 0x0f71, + 0x19f0: 0x00d9, 0x19f1: 0x0f99, 0x19f2: 0x2039, 0x19f3: 0x0269, 0x19f4: 0x01d9, 0x19f5: 0x0fa9, + 0x19f6: 0x0fb9, 0x19f7: 0x1089, 0x19f8: 0x0279, 0x19f9: 0x0369, 0x19fa: 0x0289, 0x19fb: 0x13d1, + 0x19fc: 0x0039, 0x19fd: 0x0ee9, 0x19fe: 0x1159, 0x19ff: 0x0ef9, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0f09, 0x1a01: 0x1199, 0x1a02: 0x0f31, 0x1a03: 0x0249, 0x1a04: 0x0f41, 0x1a05: 0x0259, + 0x1a06: 0x0f51, 0x1a07: 0x0359, 0x1a08: 0x0f61, 0x1a09: 0x0f71, 0x1a0a: 0x00d9, 0x1a0b: 0x0f99, + 0x1a0c: 0x2039, 0x1a0d: 0x0269, 0x1a0e: 0x01d9, 0x1a0f: 0x0fa9, 0x1a10: 0x0fb9, 0x1a11: 0x1089, + 0x1a12: 0x0279, 0x1a13: 0x0369, 0x1a14: 0x0289, 0x1a15: 0x13d1, 0x1a16: 0x0039, 0x1a17: 0x0ee9, + 0x1a18: 0x1159, 0x1a19: 0x0ef9, 0x1a1a: 0x0f09, 0x1a1b: 0x1199, 0x1a1c: 0x0f31, 0x1a1d: 0x0249, + 0x1a1e: 0x0f41, 0x1a1f: 0x0259, 0x1a20: 0x0f51, 0x1a21: 0x0359, 0x1a22: 0x0f61, 0x1a23: 0x0f71, + 0x1a24: 0x00d9, 0x1a25: 0x0f99, 0x1a26: 0x2039, 0x1a27: 0x0269, 0x1a28: 0x01d9, 0x1a29: 0x0fa9, + 0x1a2a: 0x0fb9, 0x1a2b: 0x1089, 0x1a2c: 0x0279, 0x1a2d: 0x0369, 0x1a2e: 0x0289, 0x1a2f: 0x13d1, + 0x1a30: 0x0039, 0x1a31: 0x0ee9, 0x1a32: 0x1159, 0x1a33: 0x0ef9, 0x1a34: 0x0f09, 0x1a35: 0x1199, + 0x1a36: 0x0f31, 0x1a37: 0x0249, 0x1a38: 0x0f41, 0x1a39: 0x0259, 0x1a3a: 0x0f51, 0x1a3b: 0x0359, + 0x1a3c: 0x0f61, 0x1a3d: 0x0f71, 0x1a3e: 0x00d9, 0x1a3f: 0x0f99, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x2039, 0x1a41: 0x0269, 0x1a42: 0x01d9, 0x1a43: 0x0fa9, 0x1a44: 0x0fb9, 0x1a45: 0x1089, + 0x1a46: 0x0279, 0x1a47: 0x0369, 0x1a48: 0x0289, 0x1a49: 0x13d1, 0x1a4a: 0x0039, 0x1a4b: 0x0ee9, + 0x1a4c: 0x1159, 0x1a4d: 0x0ef9, 0x1a4e: 0x0f09, 0x1a4f: 0x1199, 0x1a50: 0x0f31, 0x1a51: 0x0249, + 0x1a52: 0x0f41, 0x1a53: 0x0259, 0x1a54: 0x0f51, 0x1a55: 0x0359, 0x1a56: 0x0f61, 0x1a57: 0x0f71, + 0x1a58: 0x00d9, 0x1a59: 0x0f99, 0x1a5a: 0x2039, 0x1a5b: 0x0269, 0x1a5c: 0x01d9, 0x1a5d: 0x0fa9, + 0x1a5e: 0x0fb9, 0x1a5f: 0x1089, 0x1a60: 0x0279, 0x1a61: 0x0369, 0x1a62: 0x0289, 0x1a63: 0x13d1, + 0x1a64: 0xba81, 0x1a65: 0xba99, 0x1a66: 0x0040, 0x1a67: 0x0040, 0x1a68: 0xbab1, 0x1a69: 0x1099, + 0x1a6a: 0x10b1, 0x1a6b: 0x10c9, 0x1a6c: 0xbac9, 0x1a6d: 0xbae1, 0x1a6e: 0xbaf9, 0x1a6f: 0x1429, + 0x1a70: 0x1a31, 0x1a71: 0xbb11, 0x1a72: 0xbb29, 0x1a73: 0xbb41, 0x1a74: 0xbb59, 0x1a75: 0xbb71, + 0x1a76: 0xbb89, 0x1a77: 0x2109, 0x1a78: 0x1111, 0x1a79: 0x1429, 0x1a7a: 0xbba1, 0x1a7b: 0xbbb9, + 0x1a7c: 0xbbd1, 0x1a7d: 0x10e1, 0x1a7e: 0x10f9, 0x1a7f: 0xbbe9, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x2079, 0x1a81: 0xbc01, 0x1a82: 0xbab1, 0x1a83: 0x1099, 0x1a84: 0x10b1, 0x1a85: 0x10c9, + 0x1a86: 0xbac9, 0x1a87: 0xbae1, 0x1a88: 0xbaf9, 0x1a89: 0x1429, 0x1a8a: 0x1a31, 0x1a8b: 0xbb11, + 0x1a8c: 0xbb29, 0x1a8d: 0xbb41, 0x1a8e: 0xbb59, 0x1a8f: 0xbb71, 0x1a90: 0xbb89, 0x1a91: 0x2109, + 0x1a92: 0x1111, 0x1a93: 0xbba1, 0x1a94: 0xbba1, 0x1a95: 0xbbb9, 0x1a96: 0xbbd1, 0x1a97: 0x10e1, + 0x1a98: 0x10f9, 0x1a99: 0xbbe9, 0x1a9a: 0x2079, 0x1a9b: 0xbc21, 0x1a9c: 0xbac9, 0x1a9d: 0x1429, + 0x1a9e: 0xbb11, 0x1a9f: 0x10e1, 0x1aa0: 0x1111, 0x1aa1: 0x2109, 0x1aa2: 0xbab1, 0x1aa3: 0x1099, + 0x1aa4: 0x10b1, 0x1aa5: 0x10c9, 0x1aa6: 0xbac9, 0x1aa7: 0xbae1, 0x1aa8: 0xbaf9, 0x1aa9: 0x1429, + 0x1aaa: 0x1a31, 0x1aab: 0xbb11, 0x1aac: 0xbb29, 0x1aad: 0xbb41, 0x1aae: 0xbb59, 0x1aaf: 0xbb71, + 0x1ab0: 0xbb89, 0x1ab1: 0x2109, 0x1ab2: 0x1111, 0x1ab3: 0x1429, 0x1ab4: 0xbba1, 0x1ab5: 0xbbb9, + 0x1ab6: 0xbbd1, 0x1ab7: 0x10e1, 0x1ab8: 0x10f9, 0x1ab9: 0xbbe9, 0x1aba: 0x2079, 0x1abb: 0xbc01, + 0x1abc: 0xbab1, 0x1abd: 0x1099, 0x1abe: 0x10b1, 0x1abf: 0x10c9, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0xbac9, 0x1ac1: 0xbae1, 0x1ac2: 0xbaf9, 0x1ac3: 0x1429, 0x1ac4: 0x1a31, 0x1ac5: 0xbb11, + 0x1ac6: 0xbb29, 0x1ac7: 0xbb41, 0x1ac8: 0xbb59, 0x1ac9: 0xbb71, 0x1aca: 0xbb89, 0x1acb: 0x2109, + 0x1acc: 0x1111, 0x1acd: 0xbba1, 0x1ace: 0xbba1, 0x1acf: 0xbbb9, 0x1ad0: 0xbbd1, 0x1ad1: 0x10e1, + 0x1ad2: 0x10f9, 0x1ad3: 0xbbe9, 0x1ad4: 0x2079, 0x1ad5: 0xbc21, 0x1ad6: 0xbac9, 0x1ad7: 0x1429, + 0x1ad8: 0xbb11, 0x1ad9: 0x10e1, 0x1ada: 0x1111, 0x1adb: 0x2109, 0x1adc: 0xbab1, 0x1add: 0x1099, + 0x1ade: 0x10b1, 0x1adf: 0x10c9, 0x1ae0: 0xbac9, 0x1ae1: 0xbae1, 0x1ae2: 0xbaf9, 0x1ae3: 0x1429, + 0x1ae4: 0x1a31, 0x1ae5: 0xbb11, 0x1ae6: 0xbb29, 0x1ae7: 0xbb41, 0x1ae8: 0xbb59, 0x1ae9: 0xbb71, + 0x1aea: 0xbb89, 0x1aeb: 0x2109, 0x1aec: 0x1111, 0x1aed: 0x1429, 0x1aee: 0xbba1, 0x1aef: 0xbbb9, + 0x1af0: 0xbbd1, 0x1af1: 0x10e1, 0x1af2: 0x10f9, 0x1af3: 0xbbe9, 0x1af4: 0x2079, 0x1af5: 0xbc01, + 0x1af6: 0xbab1, 0x1af7: 0x1099, 0x1af8: 0x10b1, 0x1af9: 0x10c9, 0x1afa: 0xbac9, 0x1afb: 0xbae1, + 0x1afc: 0xbaf9, 0x1afd: 0x1429, 0x1afe: 0x1a31, 0x1aff: 0xbb11, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0xbb29, 0x1b01: 0xbb41, 0x1b02: 0xbb59, 0x1b03: 0xbb71, 0x1b04: 0xbb89, 0x1b05: 0x2109, + 0x1b06: 0x1111, 0x1b07: 0xbba1, 0x1b08: 0xbba1, 0x1b09: 0xbbb9, 0x1b0a: 0xbbd1, 0x1b0b: 0x10e1, + 0x1b0c: 0x10f9, 0x1b0d: 0xbbe9, 0x1b0e: 0x2079, 0x1b0f: 0xbc21, 0x1b10: 0xbac9, 0x1b11: 0x1429, + 0x1b12: 0xbb11, 0x1b13: 0x10e1, 0x1b14: 0x1111, 0x1b15: 0x2109, 0x1b16: 0xbab1, 0x1b17: 0x1099, + 0x1b18: 0x10b1, 0x1b19: 0x10c9, 0x1b1a: 0xbac9, 0x1b1b: 0xbae1, 0x1b1c: 0xbaf9, 0x1b1d: 0x1429, + 0x1b1e: 0x1a31, 0x1b1f: 0xbb11, 0x1b20: 0xbb29, 0x1b21: 0xbb41, 0x1b22: 0xbb59, 0x1b23: 0xbb71, + 0x1b24: 0xbb89, 0x1b25: 0x2109, 0x1b26: 0x1111, 0x1b27: 0x1429, 0x1b28: 0xbba1, 0x1b29: 0xbbb9, + 0x1b2a: 0xbbd1, 0x1b2b: 0x10e1, 0x1b2c: 0x10f9, 0x1b2d: 0xbbe9, 0x1b2e: 0x2079, 0x1b2f: 0xbc01, + 0x1b30: 0xbab1, 0x1b31: 0x1099, 0x1b32: 0x10b1, 0x1b33: 0x10c9, 0x1b34: 0xbac9, 0x1b35: 0xbae1, + 0x1b36: 0xbaf9, 0x1b37: 0x1429, 0x1b38: 0x1a31, 0x1b39: 0xbb11, 0x1b3a: 0xbb29, 0x1b3b: 0xbb41, + 0x1b3c: 0xbb59, 0x1b3d: 0xbb71, 0x1b3e: 0xbb89, 0x1b3f: 0x2109, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x1111, 0x1b41: 0xbba1, 0x1b42: 0xbba1, 0x1b43: 0xbbb9, 0x1b44: 0xbbd1, 0x1b45: 0x10e1, + 0x1b46: 0x10f9, 0x1b47: 0xbbe9, 0x1b48: 0x2079, 0x1b49: 0xbc21, 0x1b4a: 0xbac9, 0x1b4b: 0x1429, + 0x1b4c: 0xbb11, 0x1b4d: 0x10e1, 0x1b4e: 0x1111, 0x1b4f: 0x2109, 0x1b50: 0xbab1, 0x1b51: 0x1099, + 0x1b52: 0x10b1, 0x1b53: 0x10c9, 0x1b54: 0xbac9, 0x1b55: 0xbae1, 0x1b56: 0xbaf9, 0x1b57: 0x1429, + 0x1b58: 0x1a31, 0x1b59: 0xbb11, 0x1b5a: 0xbb29, 0x1b5b: 0xbb41, 0x1b5c: 0xbb59, 0x1b5d: 0xbb71, + 0x1b5e: 0xbb89, 0x1b5f: 0x2109, 0x1b60: 0x1111, 0x1b61: 0x1429, 0x1b62: 0xbba1, 0x1b63: 0xbbb9, + 0x1b64: 0xbbd1, 0x1b65: 0x10e1, 0x1b66: 0x10f9, 0x1b67: 0xbbe9, 0x1b68: 0x2079, 0x1b69: 0xbc01, + 0x1b6a: 0xbab1, 0x1b6b: 0x1099, 0x1b6c: 0x10b1, 0x1b6d: 0x10c9, 0x1b6e: 0xbac9, 0x1b6f: 0xbae1, + 0x1b70: 0xbaf9, 0x1b71: 0x1429, 0x1b72: 0x1a31, 0x1b73: 0xbb11, 0x1b74: 0xbb29, 0x1b75: 0xbb41, + 0x1b76: 0xbb59, 0x1b77: 0xbb71, 0x1b78: 0xbb89, 0x1b79: 0x2109, 0x1b7a: 0x1111, 0x1b7b: 0xbba1, + 0x1b7c: 0xbba1, 0x1b7d: 0xbbb9, 0x1b7e: 0xbbd1, 0x1b7f: 0x10e1, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x10f9, 0x1b81: 0xbbe9, 0x1b82: 0x2079, 0x1b83: 0xbc21, 0x1b84: 0xbac9, 0x1b85: 0x1429, + 0x1b86: 0xbb11, 0x1b87: 0x10e1, 0x1b88: 0x1111, 0x1b89: 0x2109, 0x1b8a: 0xbc41, 0x1b8b: 0xbc41, + 0x1b8c: 0x0040, 0x1b8d: 0x0040, 0x1b8e: 0x1f41, 0x1b8f: 0x00c9, 0x1b90: 0x0069, 0x1b91: 0x0079, + 0x1b92: 0x1f51, 0x1b93: 0x1f61, 0x1b94: 0x1f71, 0x1b95: 0x1f81, 0x1b96: 0x1f91, 0x1b97: 0x1fa1, + 0x1b98: 0x1f41, 0x1b99: 0x00c9, 0x1b9a: 0x0069, 0x1b9b: 0x0079, 0x1b9c: 0x1f51, 0x1b9d: 0x1f61, + 0x1b9e: 0x1f71, 0x1b9f: 0x1f81, 0x1ba0: 0x1f91, 0x1ba1: 0x1fa1, 0x1ba2: 0x1f41, 0x1ba3: 0x00c9, + 0x1ba4: 0x0069, 0x1ba5: 0x0079, 0x1ba6: 0x1f51, 0x1ba7: 0x1f61, 0x1ba8: 0x1f71, 0x1ba9: 0x1f81, + 0x1baa: 0x1f91, 0x1bab: 0x1fa1, 0x1bac: 0x1f41, 0x1bad: 0x00c9, 0x1bae: 0x0069, 0x1baf: 0x0079, + 0x1bb0: 0x1f51, 0x1bb1: 0x1f61, 0x1bb2: 0x1f71, 0x1bb3: 0x1f81, 0x1bb4: 0x1f91, 0x1bb5: 0x1fa1, + 0x1bb6: 0x1f41, 0x1bb7: 0x00c9, 0x1bb8: 0x0069, 0x1bb9: 0x0079, 0x1bba: 0x1f51, 0x1bbb: 0x1f61, + 0x1bbc: 0x1f71, 0x1bbd: 0x1f81, 0x1bbe: 0x1f91, 0x1bbf: 0x1fa1, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0xe115, 0x1bc1: 0xe115, 0x1bc2: 0xe135, 0x1bc3: 0xe135, 0x1bc4: 0xe115, 0x1bc5: 0xe115, + 0x1bc6: 0xe175, 0x1bc7: 0xe175, 0x1bc8: 0xe115, 0x1bc9: 0xe115, 0x1bca: 0xe135, 0x1bcb: 0xe135, + 0x1bcc: 0xe115, 0x1bcd: 0xe115, 0x1bce: 0xe1f5, 0x1bcf: 0xe1f5, 0x1bd0: 0xe115, 0x1bd1: 0xe115, + 0x1bd2: 0xe135, 0x1bd3: 0xe135, 0x1bd4: 0xe115, 0x1bd5: 0xe115, 0x1bd6: 0xe175, 0x1bd7: 0xe175, + 0x1bd8: 0xe115, 0x1bd9: 0xe115, 0x1bda: 0xe135, 0x1bdb: 0xe135, 0x1bdc: 0xe115, 0x1bdd: 0xe115, + 0x1bde: 0x8b05, 0x1bdf: 0x8b05, 0x1be0: 0x04b5, 0x1be1: 0x04b5, 0x1be2: 0x0208, 0x1be3: 0x0208, + 0x1be4: 0x0208, 0x1be5: 0x0208, 0x1be6: 0x0208, 0x1be7: 0x0208, 0x1be8: 0x0208, 0x1be9: 0x0208, + 0x1bea: 0x0208, 0x1beb: 0x0208, 0x1bec: 0x0208, 0x1bed: 0x0208, 0x1bee: 0x0208, 0x1bef: 0x0208, + 0x1bf0: 0x0208, 0x1bf1: 0x0208, 0x1bf2: 0x0208, 0x1bf3: 0x0208, 0x1bf4: 0x0208, 0x1bf5: 0x0208, + 0x1bf6: 0x0208, 0x1bf7: 0x0208, 0x1bf8: 0x0208, 0x1bf9: 0x0208, 0x1bfa: 0x0208, 0x1bfb: 0x0208, + 0x1bfc: 0x0208, 0x1bfd: 0x0208, 0x1bfe: 0x0208, 0x1bff: 0x0208, + // Block 0x70, offset 0x1c00 + 0x1c00: 0xb189, 0x1c01: 0xb1a1, 0x1c02: 0xb201, 0x1c03: 0xb249, 0x1c04: 0x0040, 0x1c05: 0xb411, + 0x1c06: 0xb291, 0x1c07: 0xb219, 0x1c08: 0xb309, 0x1c09: 0xb429, 0x1c0a: 0xb399, 0x1c0b: 0xb3b1, + 0x1c0c: 0xb3c9, 0x1c0d: 0xb3e1, 0x1c0e: 0xb2a9, 0x1c0f: 0xb339, 0x1c10: 0xb369, 0x1c11: 0xb2d9, + 0x1c12: 0xb381, 0x1c13: 0xb279, 0x1c14: 0xb2c1, 0x1c15: 0xb1d1, 0x1c16: 0xb1e9, 0x1c17: 0xb231, + 0x1c18: 0xb261, 0x1c19: 0xb2f1, 0x1c1a: 0xb321, 0x1c1b: 0xb351, 0x1c1c: 0xbc59, 0x1c1d: 0x7949, + 0x1c1e: 0xbc71, 0x1c1f: 0xbc89, 0x1c20: 0x0040, 0x1c21: 0xb1a1, 0x1c22: 0xb201, 0x1c23: 0x0040, + 0x1c24: 0xb3f9, 0x1c25: 0x0040, 0x1c26: 0x0040, 0x1c27: 0xb219, 0x1c28: 0x0040, 0x1c29: 0xb429, + 0x1c2a: 0xb399, 0x1c2b: 0xb3b1, 0x1c2c: 0xb3c9, 0x1c2d: 0xb3e1, 0x1c2e: 0xb2a9, 0x1c2f: 0xb339, + 0x1c30: 0xb369, 0x1c31: 0xb2d9, 0x1c32: 0xb381, 0x1c33: 0x0040, 0x1c34: 0xb2c1, 0x1c35: 0xb1d1, + 0x1c36: 0xb1e9, 0x1c37: 0xb231, 0x1c38: 0x0040, 0x1c39: 0xb2f1, 0x1c3a: 0x0040, 0x1c3b: 0xb351, + 0x1c3c: 0x0040, 0x1c3d: 0x0040, 0x1c3e: 0x0040, 0x1c3f: 0x0040, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x0040, 0x1c41: 0x0040, 0x1c42: 0xb201, 0x1c43: 0x0040, 0x1c44: 0x0040, 0x1c45: 0x0040, + 0x1c46: 0x0040, 0x1c47: 0xb219, 0x1c48: 0x0040, 0x1c49: 0xb429, 0x1c4a: 0x0040, 0x1c4b: 0xb3b1, + 0x1c4c: 0x0040, 0x1c4d: 0xb3e1, 0x1c4e: 0xb2a9, 0x1c4f: 0xb339, 0x1c50: 0x0040, 0x1c51: 0xb2d9, + 0x1c52: 0xb381, 0x1c53: 0x0040, 0x1c54: 0xb2c1, 0x1c55: 0x0040, 0x1c56: 0x0040, 0x1c57: 0xb231, + 0x1c58: 0x0040, 0x1c59: 0xb2f1, 0x1c5a: 0x0040, 0x1c5b: 0xb351, 0x1c5c: 0x0040, 0x1c5d: 0x7949, + 0x1c5e: 0x0040, 0x1c5f: 0xbc89, 0x1c60: 0x0040, 0x1c61: 0xb1a1, 0x1c62: 0xb201, 0x1c63: 0x0040, + 0x1c64: 0xb3f9, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0xb219, 0x1c68: 0xb309, 0x1c69: 0xb429, + 0x1c6a: 0xb399, 0x1c6b: 0x0040, 0x1c6c: 0xb3c9, 0x1c6d: 0xb3e1, 0x1c6e: 0xb2a9, 0x1c6f: 0xb339, + 0x1c70: 0xb369, 0x1c71: 0xb2d9, 0x1c72: 0xb381, 0x1c73: 0x0040, 0x1c74: 0xb2c1, 0x1c75: 0xb1d1, + 0x1c76: 0xb1e9, 0x1c77: 0xb231, 0x1c78: 0x0040, 0x1c79: 0xb2f1, 0x1c7a: 0xb321, 0x1c7b: 0xb351, + 0x1c7c: 0xbc59, 0x1c7d: 0x0040, 0x1c7e: 0xbc71, 0x1c7f: 0x0040, + // Block 0x72, offset 0x1c80 + 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0xb3f9, 0x1c85: 0xb411, + 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0x0040, 0x1c8b: 0xb3b1, + 0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9, + 0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231, + 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0x0040, 0x1c9d: 0x0040, + 0x1c9e: 0x0040, 0x1c9f: 0x0040, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0xb249, + 0x1ca4: 0x0040, 0x1ca5: 0xb411, 0x1ca6: 0xb291, 0x1ca7: 0xb219, 0x1ca8: 0xb309, 0x1ca9: 0xb429, + 0x1caa: 0x0040, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339, + 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0xb279, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1, + 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0xb261, 0x1cb9: 0xb2f1, 0x1cba: 0xb321, 0x1cbb: 0xb351, + 0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0040, 0x1cc1: 0xbca2, 0x1cc2: 0xbcba, 0x1cc3: 0xbcd2, 0x1cc4: 0xbcea, 0x1cc5: 0xbd02, + 0x1cc6: 0xbd1a, 0x1cc7: 0xbd32, 0x1cc8: 0xbd4a, 0x1cc9: 0xbd62, 0x1cca: 0xbd7a, 0x1ccb: 0x0018, + 0x1ccc: 0x0018, 0x1ccd: 0x0040, 0x1cce: 0x0040, 0x1ccf: 0x0040, 0x1cd0: 0xbd92, 0x1cd1: 0xbdb2, + 0x1cd2: 0xbdd2, 0x1cd3: 0xbdf2, 0x1cd4: 0xbe12, 0x1cd5: 0xbe32, 0x1cd6: 0xbe52, 0x1cd7: 0xbe72, + 0x1cd8: 0xbe92, 0x1cd9: 0xbeb2, 0x1cda: 0xbed2, 0x1cdb: 0xbef2, 0x1cdc: 0xbf12, 0x1cdd: 0xbf32, + 0x1cde: 0xbf52, 0x1cdf: 0xbf72, 0x1ce0: 0xbf92, 0x1ce1: 0xbfb2, 0x1ce2: 0xbfd2, 0x1ce3: 0xbff2, + 0x1ce4: 0xc012, 0x1ce5: 0xc032, 0x1ce6: 0xc052, 0x1ce7: 0xc072, 0x1ce8: 0xc092, 0x1ce9: 0xc0b2, + 0x1cea: 0xc0d1, 0x1ceb: 0x1159, 0x1cec: 0x0269, 0x1ced: 0x6671, 0x1cee: 0xc111, 0x1cef: 0x0040, + 0x1cf0: 0x0039, 0x1cf1: 0x0ee9, 0x1cf2: 0x1159, 0x1cf3: 0x0ef9, 0x1cf4: 0x0f09, 0x1cf5: 0x1199, + 0x1cf6: 0x0f31, 0x1cf7: 0x0249, 0x1cf8: 0x0f41, 0x1cf9: 0x0259, 0x1cfa: 0x0f51, 0x1cfb: 0x0359, + 0x1cfc: 0x0f61, 0x1cfd: 0x0f71, 0x1cfe: 0x00d9, 0x1cff: 0x0f99, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x2039, 0x1d01: 0x0269, 0x1d02: 0x01d9, 0x1d03: 0x0fa9, 0x1d04: 0x0fb9, 0x1d05: 0x1089, + 0x1d06: 0x0279, 0x1d07: 0x0369, 0x1d08: 0x0289, 0x1d09: 0x13d1, 0x1d0a: 0xc129, 0x1d0b: 0x65b1, + 0x1d0c: 0xc141, 0x1d0d: 0x1441, 0x1d0e: 0xc159, 0x1d0f: 0xc179, 0x1d10: 0x0018, 0x1d11: 0x0018, + 0x1d12: 0x0018, 0x1d13: 0x0018, 0x1d14: 0x0018, 0x1d15: 0x0018, 0x1d16: 0x0018, 0x1d17: 0x0018, + 0x1d18: 0x0018, 0x1d19: 0x0018, 0x1d1a: 0x0018, 0x1d1b: 0x0018, 0x1d1c: 0x0018, 0x1d1d: 0x0018, + 0x1d1e: 0x0018, 0x1d1f: 0x0018, 0x1d20: 0x0018, 0x1d21: 0x0018, 0x1d22: 0x0018, 0x1d23: 0x0018, + 0x1d24: 0x0018, 0x1d25: 0x0018, 0x1d26: 0x0018, 0x1d27: 0x0018, 0x1d28: 0x0018, 0x1d29: 0x0018, + 0x1d2a: 0xc191, 0x1d2b: 0xc1a9, 0x1d2c: 0x0040, 0x1d2d: 0x0040, 0x1d2e: 0x0040, 0x1d2f: 0x0040, + 0x1d30: 0x0018, 0x1d31: 0x0018, 0x1d32: 0x0018, 0x1d33: 0x0018, 0x1d34: 0x0018, 0x1d35: 0x0018, + 0x1d36: 0x0018, 0x1d37: 0x0018, 0x1d38: 0x0018, 0x1d39: 0x0018, 0x1d3a: 0x0018, 0x1d3b: 0x0018, + 0x1d3c: 0x0018, 0x1d3d: 0x0018, 0x1d3e: 0x0018, 0x1d3f: 0x0018, + // Block 0x75, offset 0x1d40 + 0x1d40: 0xc1d9, 0x1d41: 0xc211, 0x1d42: 0xc249, 0x1d43: 0x0040, 0x1d44: 0x0040, 0x1d45: 0x0040, + 0x1d46: 0x0040, 0x1d47: 0x0040, 0x1d48: 0x0040, 0x1d49: 0x0040, 0x1d4a: 0x0040, 0x1d4b: 0x0040, + 0x1d4c: 0x0040, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xc269, 0x1d51: 0xc289, + 0x1d52: 0xc2a9, 0x1d53: 0xc2c9, 0x1d54: 0xc2e9, 0x1d55: 0xc309, 0x1d56: 0xc329, 0x1d57: 0xc349, + 0x1d58: 0xc369, 0x1d59: 0xc389, 0x1d5a: 0xc3a9, 0x1d5b: 0xc3c9, 0x1d5c: 0xc3e9, 0x1d5d: 0xc409, + 0x1d5e: 0xc429, 0x1d5f: 0xc449, 0x1d60: 0xc469, 0x1d61: 0xc489, 0x1d62: 0xc4a9, 0x1d63: 0xc4c9, + 0x1d64: 0xc4e9, 0x1d65: 0xc509, 0x1d66: 0xc529, 0x1d67: 0xc549, 0x1d68: 0xc569, 0x1d69: 0xc589, + 0x1d6a: 0xc5a9, 0x1d6b: 0xc5c9, 0x1d6c: 0xc5e9, 0x1d6d: 0xc609, 0x1d6e: 0xc629, 0x1d6f: 0xc649, + 0x1d70: 0xc669, 0x1d71: 0xc689, 0x1d72: 0xc6a9, 0x1d73: 0xc6c9, 0x1d74: 0xc6e9, 0x1d75: 0xc709, + 0x1d76: 0xc729, 0x1d77: 0xc749, 0x1d78: 0xc769, 0x1d79: 0xc789, 0x1d7a: 0xc7a9, 0x1d7b: 0xc7c9, + 0x1d7c: 0x0040, 0x1d7d: 0x0040, 0x1d7e: 0x0040, 0x1d7f: 0x0040, + // Block 0x76, offset 0x1d80 + 0x1d80: 0xcaf9, 0x1d81: 0xcb19, 0x1d82: 0xcb39, 0x1d83: 0x8b1d, 0x1d84: 0xcb59, 0x1d85: 0xcb79, + 0x1d86: 0xcb99, 0x1d87: 0xcbb9, 0x1d88: 0xcbd9, 0x1d89: 0xcbf9, 0x1d8a: 0xcc19, 0x1d8b: 0xcc39, + 0x1d8c: 0xcc59, 0x1d8d: 0x8b3d, 0x1d8e: 0xcc79, 0x1d8f: 0xcc99, 0x1d90: 0xccb9, 0x1d91: 0xccd9, + 0x1d92: 0x8b5d, 0x1d93: 0xccf9, 0x1d94: 0xcd19, 0x1d95: 0xc429, 0x1d96: 0x8b7d, 0x1d97: 0xcd39, + 0x1d98: 0xcd59, 0x1d99: 0xcd79, 0x1d9a: 0xcd99, 0x1d9b: 0xcdb9, 0x1d9c: 0x8b9d, 0x1d9d: 0xcdd9, + 0x1d9e: 0xcdf9, 0x1d9f: 0xce19, 0x1da0: 0xce39, 0x1da1: 0xce59, 0x1da2: 0xc789, 0x1da3: 0xce79, + 0x1da4: 0xce99, 0x1da5: 0xceb9, 0x1da6: 0xced9, 0x1da7: 0xcef9, 0x1da8: 0xcf19, 0x1da9: 0xcf39, + 0x1daa: 0xcf59, 0x1dab: 0xcf79, 0x1dac: 0xcf99, 0x1dad: 0xcfb9, 0x1dae: 0xcfd9, 0x1daf: 0xcff9, + 0x1db0: 0xd019, 0x1db1: 0xd039, 0x1db2: 0xd039, 0x1db3: 0xd039, 0x1db4: 0x8bbd, 0x1db5: 0xd059, + 0x1db6: 0xd079, 0x1db7: 0xd099, 0x1db8: 0x8bdd, 0x1db9: 0xd0b9, 0x1dba: 0xd0d9, 0x1dbb: 0xd0f9, + 0x1dbc: 0xd119, 0x1dbd: 0xd139, 0x1dbe: 0xd159, 0x1dbf: 0xd179, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xd199, 0x1dc1: 0xd1b9, 0x1dc2: 0xd1d9, 0x1dc3: 0xd1f9, 0x1dc4: 0xd219, 0x1dc5: 0xd239, + 0x1dc6: 0xd239, 0x1dc7: 0xd259, 0x1dc8: 0xd279, 0x1dc9: 0xd299, 0x1dca: 0xd2b9, 0x1dcb: 0xd2d9, + 0x1dcc: 0xd2f9, 0x1dcd: 0xd319, 0x1dce: 0xd339, 0x1dcf: 0xd359, 0x1dd0: 0xd379, 0x1dd1: 0xd399, + 0x1dd2: 0xd3b9, 0x1dd3: 0xd3d9, 0x1dd4: 0xd3f9, 0x1dd5: 0xd419, 0x1dd6: 0xd439, 0x1dd7: 0xd459, + 0x1dd8: 0xd479, 0x1dd9: 0x8bfd, 0x1dda: 0xd499, 0x1ddb: 0xd4b9, 0x1ddc: 0xd4d9, 0x1ddd: 0xc309, + 0x1dde: 0xd4f9, 0x1ddf: 0xd519, 0x1de0: 0x8c1d, 0x1de1: 0x8c3d, 0x1de2: 0xd539, 0x1de3: 0xd559, + 0x1de4: 0xd579, 0x1de5: 0xd599, 0x1de6: 0xd5b9, 0x1de7: 0xd5d9, 0x1de8: 0x0040, 0x1de9: 0xd5f9, + 0x1dea: 0xd619, 0x1deb: 0xd619, 0x1dec: 0x8c5d, 0x1ded: 0xd639, 0x1dee: 0xd659, 0x1def: 0xd679, + 0x1df0: 0xd699, 0x1df1: 0x8c7d, 0x1df2: 0xd6b9, 0x1df3: 0xd6d9, 0x1df4: 0x0040, 0x1df5: 0xd6f9, + 0x1df6: 0xd719, 0x1df7: 0xd739, 0x1df8: 0xd759, 0x1df9: 0xd779, 0x1dfa: 0xd799, 0x1dfb: 0x8c9d, + 0x1dfc: 0xd7b9, 0x1dfd: 0x8cbd, 0x1dfe: 0xd7d9, 0x1dff: 0xd7f9, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xd819, 0x1e01: 0xd839, 0x1e02: 0xd859, 0x1e03: 0xd879, 0x1e04: 0xd899, 0x1e05: 0xd8b9, + 0x1e06: 0xd8d9, 0x1e07: 0xd8f9, 0x1e08: 0xd919, 0x1e09: 0x8cdd, 0x1e0a: 0xd939, 0x1e0b: 0xd959, + 0x1e0c: 0xd979, 0x1e0d: 0xd999, 0x1e0e: 0xd9b9, 0x1e0f: 0x8cfd, 0x1e10: 0xd9d9, 0x1e11: 0x8d1d, + 0x1e12: 0x8d3d, 0x1e13: 0xd9f9, 0x1e14: 0xda19, 0x1e15: 0xda19, 0x1e16: 0xda39, 0x1e17: 0x8d5d, + 0x1e18: 0x8d7d, 0x1e19: 0xda59, 0x1e1a: 0xda79, 0x1e1b: 0xda99, 0x1e1c: 0xdab9, 0x1e1d: 0xdad9, + 0x1e1e: 0xdaf9, 0x1e1f: 0xdb19, 0x1e20: 0xdb39, 0x1e21: 0xdb59, 0x1e22: 0xdb79, 0x1e23: 0xdb99, + 0x1e24: 0x8d9d, 0x1e25: 0xdbb9, 0x1e26: 0xdbd9, 0x1e27: 0xdbf9, 0x1e28: 0xdc19, 0x1e29: 0xdbf9, + 0x1e2a: 0xdc39, 0x1e2b: 0xdc59, 0x1e2c: 0xdc79, 0x1e2d: 0xdc99, 0x1e2e: 0xdcb9, 0x1e2f: 0xdcd9, + 0x1e30: 0xdcf9, 0x1e31: 0xdd19, 0x1e32: 0xdd39, 0x1e33: 0xdd59, 0x1e34: 0xdd79, 0x1e35: 0xdd99, + 0x1e36: 0xddb9, 0x1e37: 0xddd9, 0x1e38: 0x8dbd, 0x1e39: 0xddf9, 0x1e3a: 0xde19, 0x1e3b: 0xde39, + 0x1e3c: 0xde59, 0x1e3d: 0xde79, 0x1e3e: 0x8ddd, 0x1e3f: 0xde99, + // Block 0x79, offset 0x1e40 + 0x1e40: 0xe599, 0x1e41: 0xe5b9, 0x1e42: 0xe5d9, 0x1e43: 0xe5f9, 0x1e44: 0xe619, 0x1e45: 0xe639, + 0x1e46: 0x8efd, 0x1e47: 0xe659, 0x1e48: 0xe679, 0x1e49: 0xe699, 0x1e4a: 0xe6b9, 0x1e4b: 0xe6d9, + 0x1e4c: 0xe6f9, 0x1e4d: 0x8f1d, 0x1e4e: 0xe719, 0x1e4f: 0xe739, 0x1e50: 0x8f3d, 0x1e51: 0x8f5d, + 0x1e52: 0xe759, 0x1e53: 0xe779, 0x1e54: 0xe799, 0x1e55: 0xe7b9, 0x1e56: 0xe7d9, 0x1e57: 0xe7f9, + 0x1e58: 0xe819, 0x1e59: 0xe839, 0x1e5a: 0xe859, 0x1e5b: 0x8f7d, 0x1e5c: 0xe879, 0x1e5d: 0x8f9d, + 0x1e5e: 0xe899, 0x1e5f: 0x0040, 0x1e60: 0xe8b9, 0x1e61: 0xe8d9, 0x1e62: 0xe8f9, 0x1e63: 0x8fbd, + 0x1e64: 0xe919, 0x1e65: 0xe939, 0x1e66: 0x8fdd, 0x1e67: 0x8ffd, 0x1e68: 0xe959, 0x1e69: 0xe979, + 0x1e6a: 0xe999, 0x1e6b: 0xe9b9, 0x1e6c: 0xe9d9, 0x1e6d: 0xe9d9, 0x1e6e: 0xe9f9, 0x1e6f: 0xea19, + 0x1e70: 0xea39, 0x1e71: 0xea59, 0x1e72: 0xea79, 0x1e73: 0xea99, 0x1e74: 0xeab9, 0x1e75: 0x901d, + 0x1e76: 0xead9, 0x1e77: 0x903d, 0x1e78: 0xeaf9, 0x1e79: 0x905d, 0x1e7a: 0xeb19, 0x1e7b: 0x907d, + 0x1e7c: 0x909d, 0x1e7d: 0x90bd, 0x1e7e: 0xeb39, 0x1e7f: 0xeb59, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0xeb79, 0x1e81: 0x90dd, 0x1e82: 0x90fd, 0x1e83: 0x911d, 0x1e84: 0x913d, 0x1e85: 0xeb99, + 0x1e86: 0xebb9, 0x1e87: 0xebb9, 0x1e88: 0xebd9, 0x1e89: 0xebf9, 0x1e8a: 0xec19, 0x1e8b: 0xec39, + 0x1e8c: 0xec59, 0x1e8d: 0x915d, 0x1e8e: 0xec79, 0x1e8f: 0xec99, 0x1e90: 0xecb9, 0x1e91: 0xecd9, + 0x1e92: 0x917d, 0x1e93: 0xecf9, 0x1e94: 0x919d, 0x1e95: 0x91bd, 0x1e96: 0xed19, 0x1e97: 0xed39, + 0x1e98: 0xed59, 0x1e99: 0xed79, 0x1e9a: 0xed99, 0x1e9b: 0xedb9, 0x1e9c: 0x91dd, 0x1e9d: 0x91fd, + 0x1e9e: 0x921d, 0x1e9f: 0x0040, 0x1ea0: 0xedd9, 0x1ea1: 0x923d, 0x1ea2: 0xedf9, 0x1ea3: 0xee19, + 0x1ea4: 0xee39, 0x1ea5: 0x925d, 0x1ea6: 0xee59, 0x1ea7: 0xee79, 0x1ea8: 0xee99, 0x1ea9: 0xeeb9, + 0x1eaa: 0xeed9, 0x1eab: 0x927d, 0x1eac: 0xeef9, 0x1ead: 0xef19, 0x1eae: 0xef39, 0x1eaf: 0xef59, + 0x1eb0: 0xef79, 0x1eb1: 0xef99, 0x1eb2: 0x929d, 0x1eb3: 0x92bd, 0x1eb4: 0xefb9, 0x1eb5: 0x92dd, + 0x1eb6: 0xefd9, 0x1eb7: 0x92fd, 0x1eb8: 0xeff9, 0x1eb9: 0xf019, 0x1eba: 0xf039, 0x1ebb: 0x931d, + 0x1ebc: 0x933d, 0x1ebd: 0xf059, 0x1ebe: 0x935d, 0x1ebf: 0xf079, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0xf6b9, 0x1ec1: 0xf6d9, 0x1ec2: 0xf6f9, 0x1ec3: 0xf719, 0x1ec4: 0xf739, 0x1ec5: 0x951d, + 0x1ec6: 0xf759, 0x1ec7: 0xf779, 0x1ec8: 0xf799, 0x1ec9: 0xf7b9, 0x1eca: 0xf7d9, 0x1ecb: 0x953d, + 0x1ecc: 0x955d, 0x1ecd: 0xf7f9, 0x1ece: 0xf819, 0x1ecf: 0xf839, 0x1ed0: 0xf859, 0x1ed1: 0xf879, + 0x1ed2: 0xf899, 0x1ed3: 0x957d, 0x1ed4: 0xf8b9, 0x1ed5: 0xf8d9, 0x1ed6: 0xf8f9, 0x1ed7: 0xf919, + 0x1ed8: 0x959d, 0x1ed9: 0x95bd, 0x1eda: 0xf939, 0x1edb: 0xf959, 0x1edc: 0xf979, 0x1edd: 0x95dd, + 0x1ede: 0xf999, 0x1edf: 0xf9b9, 0x1ee0: 0x6815, 0x1ee1: 0x95fd, 0x1ee2: 0xf9d9, 0x1ee3: 0xf9f9, + 0x1ee4: 0xfa19, 0x1ee5: 0x961d, 0x1ee6: 0xfa39, 0x1ee7: 0xfa59, 0x1ee8: 0xfa79, 0x1ee9: 0xfa99, + 0x1eea: 0xfab9, 0x1eeb: 0xfad9, 0x1eec: 0xfaf9, 0x1eed: 0x963d, 0x1eee: 0xfb19, 0x1eef: 0xfb39, + 0x1ef0: 0xfb59, 0x1ef1: 0x965d, 0x1ef2: 0xfb79, 0x1ef3: 0xfb99, 0x1ef4: 0xfbb9, 0x1ef5: 0xfbd9, + 0x1ef6: 0x7b35, 0x1ef7: 0x967d, 0x1ef8: 0xfbf9, 0x1ef9: 0xfc19, 0x1efa: 0xfc39, 0x1efb: 0x969d, + 0x1efc: 0xfc59, 0x1efd: 0x96bd, 0x1efe: 0xfc79, 0x1eff: 0xfc79, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0xfc99, 0x1f01: 0x96dd, 0x1f02: 0xfcb9, 0x1f03: 0xfcd9, 0x1f04: 0xfcf9, 0x1f05: 0xfd19, + 0x1f06: 0xfd39, 0x1f07: 0xfd59, 0x1f08: 0xfd79, 0x1f09: 0x96fd, 0x1f0a: 0xfd99, 0x1f0b: 0xfdb9, + 0x1f0c: 0xfdd9, 0x1f0d: 0xfdf9, 0x1f0e: 0xfe19, 0x1f0f: 0xfe39, 0x1f10: 0x971d, 0x1f11: 0xfe59, + 0x1f12: 0x973d, 0x1f13: 0x975d, 0x1f14: 0x977d, 0x1f15: 0xfe79, 0x1f16: 0xfe99, 0x1f17: 0xfeb9, + 0x1f18: 0xfed9, 0x1f19: 0xfef9, 0x1f1a: 0xff19, 0x1f1b: 0xff39, 0x1f1c: 0xff59, 0x1f1d: 0x979d, + 0x1f1e: 0x0040, 0x1f1f: 0x0040, 0x1f20: 0x0040, 0x1f21: 0x0040, 0x1f22: 0x0040, 0x1f23: 0x0040, + 0x1f24: 0x0040, 0x1f25: 0x0040, 0x1f26: 0x0040, 0x1f27: 0x0040, 0x1f28: 0x0040, 0x1f29: 0x0040, + 0x1f2a: 0x0040, 0x1f2b: 0x0040, 0x1f2c: 0x0040, 0x1f2d: 0x0040, 0x1f2e: 0x0040, 0x1f2f: 0x0040, + 0x1f30: 0x0040, 0x1f31: 0x0040, 0x1f32: 0x0040, 0x1f33: 0x0040, 0x1f34: 0x0040, 0x1f35: 0x0040, + 0x1f36: 0x0040, 0x1f37: 0x0040, 0x1f38: 0x0040, 0x1f39: 0x0040, 0x1f3a: 0x0040, 0x1f3b: 0x0040, + 0x1f3c: 0x0040, 0x1f3d: 0x0040, 0x1f3e: 0x0040, 0x1f3f: 0x0040, +} + +// idnaIndex: 35 blocks, 2240 entries, 4480 bytes +// Block 0 is the zero block. +var idnaIndex = [2240]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x7b, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, + 0xc8: 0x06, 0xc9: 0x7c, 0xca: 0x7d, 0xcb: 0x07, 0xcc: 0x7e, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, + 0xd0: 0x7f, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x80, 0xd6: 0x81, 0xd7: 0x82, + 0xd8: 0x0f, 0xd9: 0x83, 0xda: 0x84, 0xdb: 0x10, 0xdc: 0x11, 0xdd: 0x85, 0xde: 0x86, 0xdf: 0x87, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, + 0xf0: 0x1c, 0xf1: 0x1d, 0xf2: 0x1d, 0xf3: 0x1f, 0xf4: 0x20, + // Block 0x4, offset 0x100 + 0x120: 0x88, 0x121: 0x89, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x12, 0x126: 0x13, 0x127: 0x14, + 0x128: 0x15, 0x129: 0x16, 0x12a: 0x17, 0x12b: 0x18, 0x12c: 0x19, 0x12d: 0x1a, 0x12e: 0x1b, 0x12f: 0x8d, + 0x130: 0x8e, 0x131: 0x1c, 0x132: 0x1d, 0x133: 0x1e, 0x134: 0x8f, 0x135: 0x1f, 0x136: 0x90, 0x137: 0x91, + 0x138: 0x92, 0x139: 0x93, 0x13a: 0x20, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x21, 0x13e: 0x22, 0x13f: 0x96, + // Block 0x5, offset 0x140 + 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9b, 0x147: 0x9b, + 0x148: 0x9d, 0x149: 0x9e, 0x14a: 0x9f, 0x14b: 0xa0, 0x14c: 0xa1, 0x14d: 0xa2, 0x14e: 0xa3, 0x14f: 0xa4, + 0x150: 0xa5, 0x151: 0x9d, 0x152: 0x9d, 0x153: 0x9d, 0x154: 0x9d, 0x155: 0x9d, 0x156: 0x9d, 0x157: 0x9d, + 0x158: 0x9d, 0x159: 0xa6, 0x15a: 0xa7, 0x15b: 0xa8, 0x15c: 0xa9, 0x15d: 0xaa, 0x15e: 0xab, 0x15f: 0xac, + 0x160: 0xad, 0x161: 0xae, 0x162: 0xaf, 0x163: 0xb0, 0x164: 0xb1, 0x165: 0xb2, 0x166: 0xb3, 0x167: 0xb4, + 0x168: 0xb5, 0x169: 0xb6, 0x16a: 0xb7, 0x16b: 0xb8, 0x16c: 0xb9, 0x16d: 0xba, 0x16e: 0xbb, 0x16f: 0xbc, + 0x170: 0xbd, 0x171: 0xbe, 0x172: 0xbf, 0x173: 0xc0, 0x174: 0x23, 0x175: 0x24, 0x176: 0x25, 0x177: 0xc1, + 0x178: 0x26, 0x179: 0x26, 0x17a: 0x27, 0x17b: 0x26, 0x17c: 0xc2, 0x17d: 0x28, 0x17e: 0x29, 0x17f: 0x2a, + // Block 0x6, offset 0x180 + 0x180: 0x2b, 0x181: 0x2c, 0x182: 0x2d, 0x183: 0xc3, 0x184: 0x2e, 0x185: 0x2f, 0x186: 0xc4, 0x187: 0x9b, + 0x188: 0xc5, 0x189: 0xc6, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc7, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0xc8, + 0x190: 0xc9, 0x191: 0x30, 0x192: 0x31, 0x193: 0x32, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b, + 0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b, + 0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b, + 0x1a8: 0xca, 0x1a9: 0xcb, 0x1aa: 0x9b, 0x1ab: 0xcc, 0x1ac: 0x9b, 0x1ad: 0xcd, 0x1ae: 0xce, 0x1af: 0xcf, + 0x1b0: 0xd0, 0x1b1: 0x33, 0x1b2: 0x26, 0x1b3: 0x34, 0x1b4: 0xd1, 0x1b5: 0xd2, 0x1b6: 0xd3, 0x1b7: 0xd4, + 0x1b8: 0xd5, 0x1b9: 0xd6, 0x1ba: 0xd7, 0x1bb: 0xd8, 0x1bc: 0xd9, 0x1bd: 0xda, 0x1be: 0xdb, 0x1bf: 0x35, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x36, 0x1c1: 0xdc, 0x1c2: 0xdd, 0x1c3: 0xde, 0x1c4: 0xdf, 0x1c5: 0x37, 0x1c6: 0x38, 0x1c7: 0xe0, + 0x1c8: 0xe1, 0x1c9: 0x39, 0x1ca: 0x3a, 0x1cb: 0x3b, 0x1cc: 0x3c, 0x1cd: 0x3d, 0x1ce: 0x3e, 0x1cf: 0x3f, + 0x1d0: 0x9d, 0x1d1: 0x9d, 0x1d2: 0x9d, 0x1d3: 0x9d, 0x1d4: 0x9d, 0x1d5: 0x9d, 0x1d6: 0x9d, 0x1d7: 0x9d, + 0x1d8: 0x9d, 0x1d9: 0x9d, 0x1da: 0x9d, 0x1db: 0x9d, 0x1dc: 0x9d, 0x1dd: 0x9d, 0x1de: 0x9d, 0x1df: 0x9d, + 0x1e0: 0x9d, 0x1e1: 0x9d, 0x1e2: 0x9d, 0x1e3: 0x9d, 0x1e4: 0x9d, 0x1e5: 0x9d, 0x1e6: 0x9d, 0x1e7: 0x9d, + 0x1e8: 0x9d, 0x1e9: 0x9d, 0x1ea: 0x9d, 0x1eb: 0x9d, 0x1ec: 0x9d, 0x1ed: 0x9d, 0x1ee: 0x9d, 0x1ef: 0x9d, + 0x1f0: 0x9d, 0x1f1: 0x9d, 0x1f2: 0x9d, 0x1f3: 0x9d, 0x1f4: 0x9d, 0x1f5: 0x9d, 0x1f6: 0x9d, 0x1f7: 0x9d, + 0x1f8: 0x9d, 0x1f9: 0x9d, 0x1fa: 0x9d, 0x1fb: 0x9d, 0x1fc: 0x9d, 0x1fd: 0x9d, 0x1fe: 0x9d, 0x1ff: 0x9d, + // Block 0x8, offset 0x200 + 0x200: 0x9d, 0x201: 0x9d, 0x202: 0x9d, 0x203: 0x9d, 0x204: 0x9d, 0x205: 0x9d, 0x206: 0x9d, 0x207: 0x9d, + 0x208: 0x9d, 0x209: 0x9d, 0x20a: 0x9d, 0x20b: 0x9d, 0x20c: 0x9d, 0x20d: 0x9d, 0x20e: 0x9d, 0x20f: 0x9d, + 0x210: 0x9d, 0x211: 0x9d, 0x212: 0x9d, 0x213: 0x9d, 0x214: 0x9d, 0x215: 0x9d, 0x216: 0x9d, 0x217: 0x9d, + 0x218: 0x9d, 0x219: 0x9d, 0x21a: 0x9d, 0x21b: 0x9d, 0x21c: 0x9d, 0x21d: 0x9d, 0x21e: 0x9d, 0x21f: 0x9d, + 0x220: 0x9d, 0x221: 0x9d, 0x222: 0x9d, 0x223: 0x9d, 0x224: 0x9d, 0x225: 0x9d, 0x226: 0x9d, 0x227: 0x9d, + 0x228: 0x9d, 0x229: 0x9d, 0x22a: 0x9d, 0x22b: 0x9d, 0x22c: 0x9d, 0x22d: 0x9d, 0x22e: 0x9d, 0x22f: 0x9d, + 0x230: 0x9d, 0x231: 0x9d, 0x232: 0x9d, 0x233: 0x9d, 0x234: 0x9d, 0x235: 0x9d, 0x236: 0xb0, 0x237: 0x9b, + 0x238: 0x9d, 0x239: 0x9d, 0x23a: 0x9d, 0x23b: 0x9d, 0x23c: 0x9d, 0x23d: 0x9d, 0x23e: 0x9d, 0x23f: 0x9d, + // Block 0x9, offset 0x240 + 0x240: 0x9d, 0x241: 0x9d, 0x242: 0x9d, 0x243: 0x9d, 0x244: 0x9d, 0x245: 0x9d, 0x246: 0x9d, 0x247: 0x9d, + 0x248: 0x9d, 0x249: 0x9d, 0x24a: 0x9d, 0x24b: 0x9d, 0x24c: 0x9d, 0x24d: 0x9d, 0x24e: 0x9d, 0x24f: 0x9d, + 0x250: 0x9d, 0x251: 0x9d, 0x252: 0x9d, 0x253: 0x9d, 0x254: 0x9d, 0x255: 0x9d, 0x256: 0x9d, 0x257: 0x9d, + 0x258: 0x9d, 0x259: 0x9d, 0x25a: 0x9d, 0x25b: 0x9d, 0x25c: 0x9d, 0x25d: 0x9d, 0x25e: 0x9d, 0x25f: 0x9d, + 0x260: 0x9d, 0x261: 0x9d, 0x262: 0x9d, 0x263: 0x9d, 0x264: 0x9d, 0x265: 0x9d, 0x266: 0x9d, 0x267: 0x9d, + 0x268: 0x9d, 0x269: 0x9d, 0x26a: 0x9d, 0x26b: 0x9d, 0x26c: 0x9d, 0x26d: 0x9d, 0x26e: 0x9d, 0x26f: 0x9d, + 0x270: 0x9d, 0x271: 0x9d, 0x272: 0x9d, 0x273: 0x9d, 0x274: 0x9d, 0x275: 0x9d, 0x276: 0x9d, 0x277: 0x9d, + 0x278: 0x9d, 0x279: 0x9d, 0x27a: 0x9d, 0x27b: 0x9d, 0x27c: 0x9d, 0x27d: 0x9d, 0x27e: 0x9d, 0x27f: 0x9d, + // Block 0xa, offset 0x280 + 0x280: 0x9d, 0x281: 0x9d, 0x282: 0x9d, 0x283: 0x9d, 0x284: 0x9d, 0x285: 0x9d, 0x286: 0x9d, 0x287: 0x9d, + 0x288: 0x9d, 0x289: 0x9d, 0x28a: 0x9d, 0x28b: 0x9d, 0x28c: 0x9d, 0x28d: 0x9d, 0x28e: 0x9d, 0x28f: 0x9d, + 0x290: 0x9d, 0x291: 0x9d, 0x292: 0x9d, 0x293: 0x9d, 0x294: 0x9d, 0x295: 0x9d, 0x296: 0x9d, 0x297: 0x9d, + 0x298: 0x9d, 0x299: 0x9d, 0x29a: 0x9d, 0x29b: 0x9d, 0x29c: 0x9d, 0x29d: 0x9d, 0x29e: 0x9d, 0x29f: 0x9d, + 0x2a0: 0x9d, 0x2a1: 0x9d, 0x2a2: 0x9d, 0x2a3: 0x9d, 0x2a4: 0x9d, 0x2a5: 0x9d, 0x2a6: 0x9d, 0x2a7: 0x9d, + 0x2a8: 0x9d, 0x2a9: 0x9d, 0x2aa: 0x9d, 0x2ab: 0x9d, 0x2ac: 0x9d, 0x2ad: 0x9d, 0x2ae: 0x9d, 0x2af: 0x9d, + 0x2b0: 0x9d, 0x2b1: 0x9d, 0x2b2: 0x9d, 0x2b3: 0x9d, 0x2b4: 0x9d, 0x2b5: 0x9d, 0x2b6: 0x9d, 0x2b7: 0x9d, + 0x2b8: 0x9d, 0x2b9: 0x9d, 0x2ba: 0x9d, 0x2bb: 0x9d, 0x2bc: 0x9d, 0x2bd: 0x9d, 0x2be: 0x9d, 0x2bf: 0xe2, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x9d, 0x2c1: 0x9d, 0x2c2: 0x9d, 0x2c3: 0x9d, 0x2c4: 0x9d, 0x2c5: 0x9d, 0x2c6: 0x9d, 0x2c7: 0x9d, + 0x2c8: 0x9d, 0x2c9: 0x9d, 0x2ca: 0x9d, 0x2cb: 0x9d, 0x2cc: 0x9d, 0x2cd: 0x9d, 0x2ce: 0x9d, 0x2cf: 0x9d, + 0x2d0: 0x9d, 0x2d1: 0x9d, 0x2d2: 0xe3, 0x2d3: 0xe4, 0x2d4: 0x9d, 0x2d5: 0x9d, 0x2d6: 0x9d, 0x2d7: 0x9d, + 0x2d8: 0xe5, 0x2d9: 0x40, 0x2da: 0x41, 0x2db: 0xe6, 0x2dc: 0x42, 0x2dd: 0x43, 0x2de: 0x44, 0x2df: 0xe7, + 0x2e0: 0xe8, 0x2e1: 0xe9, 0x2e2: 0xea, 0x2e3: 0xeb, 0x2e4: 0xec, 0x2e5: 0xed, 0x2e6: 0xee, 0x2e7: 0xef, + 0x2e8: 0xf0, 0x2e9: 0xf1, 0x2ea: 0xf2, 0x2eb: 0xf3, 0x2ec: 0xf4, 0x2ed: 0xf5, 0x2ee: 0xf6, 0x2ef: 0xf7, + 0x2f0: 0x9d, 0x2f1: 0x9d, 0x2f2: 0x9d, 0x2f3: 0x9d, 0x2f4: 0x9d, 0x2f5: 0x9d, 0x2f6: 0x9d, 0x2f7: 0x9d, + 0x2f8: 0x9d, 0x2f9: 0x9d, 0x2fa: 0x9d, 0x2fb: 0x9d, 0x2fc: 0x9d, 0x2fd: 0x9d, 0x2fe: 0x9d, 0x2ff: 0x9d, + // Block 0xc, offset 0x300 + 0x300: 0x9d, 0x301: 0x9d, 0x302: 0x9d, 0x303: 0x9d, 0x304: 0x9d, 0x305: 0x9d, 0x306: 0x9d, 0x307: 0x9d, + 0x308: 0x9d, 0x309: 0x9d, 0x30a: 0x9d, 0x30b: 0x9d, 0x30c: 0x9d, 0x30d: 0x9d, 0x30e: 0x9d, 0x30f: 0x9d, + 0x310: 0x9d, 0x311: 0x9d, 0x312: 0x9d, 0x313: 0x9d, 0x314: 0x9d, 0x315: 0x9d, 0x316: 0x9d, 0x317: 0x9d, + 0x318: 0x9d, 0x319: 0x9d, 0x31a: 0x9d, 0x31b: 0x9d, 0x31c: 0x9d, 0x31d: 0x9d, 0x31e: 0xf8, 0x31f: 0xf9, + // Block 0xd, offset 0x340 + 0x340: 0xb8, 0x341: 0xb8, 0x342: 0xb8, 0x343: 0xb8, 0x344: 0xb8, 0x345: 0xb8, 0x346: 0xb8, 0x347: 0xb8, + 0x348: 0xb8, 0x349: 0xb8, 0x34a: 0xb8, 0x34b: 0xb8, 0x34c: 0xb8, 0x34d: 0xb8, 0x34e: 0xb8, 0x34f: 0xb8, + 0x350: 0xb8, 0x351: 0xb8, 0x352: 0xb8, 0x353: 0xb8, 0x354: 0xb8, 0x355: 0xb8, 0x356: 0xb8, 0x357: 0xb8, + 0x358: 0xb8, 0x359: 0xb8, 0x35a: 0xb8, 0x35b: 0xb8, 0x35c: 0xb8, 0x35d: 0xb8, 0x35e: 0xb8, 0x35f: 0xb8, + 0x360: 0xb8, 0x361: 0xb8, 0x362: 0xb8, 0x363: 0xb8, 0x364: 0xb8, 0x365: 0xb8, 0x366: 0xb8, 0x367: 0xb8, + 0x368: 0xb8, 0x369: 0xb8, 0x36a: 0xb8, 0x36b: 0xb8, 0x36c: 0xb8, 0x36d: 0xb8, 0x36e: 0xb8, 0x36f: 0xb8, + 0x370: 0xb8, 0x371: 0xb8, 0x372: 0xb8, 0x373: 0xb8, 0x374: 0xb8, 0x375: 0xb8, 0x376: 0xb8, 0x377: 0xb8, + 0x378: 0xb8, 0x379: 0xb8, 0x37a: 0xb8, 0x37b: 0xb8, 0x37c: 0xb8, 0x37d: 0xb8, 0x37e: 0xb8, 0x37f: 0xb8, + // Block 0xe, offset 0x380 + 0x380: 0xb8, 0x381: 0xb8, 0x382: 0xb8, 0x383: 0xb8, 0x384: 0xb8, 0x385: 0xb8, 0x386: 0xb8, 0x387: 0xb8, + 0x388: 0xb8, 0x389: 0xb8, 0x38a: 0xb8, 0x38b: 0xb8, 0x38c: 0xb8, 0x38d: 0xb8, 0x38e: 0xb8, 0x38f: 0xb8, + 0x390: 0xb8, 0x391: 0xb8, 0x392: 0xb8, 0x393: 0xb8, 0x394: 0xb8, 0x395: 0xb8, 0x396: 0xb8, 0x397: 0xb8, + 0x398: 0xb8, 0x399: 0xb8, 0x39a: 0xb8, 0x39b: 0xb8, 0x39c: 0xb8, 0x39d: 0xb8, 0x39e: 0xb8, 0x39f: 0xb8, + 0x3a0: 0xb8, 0x3a1: 0xb8, 0x3a2: 0xb8, 0x3a3: 0xb8, 0x3a4: 0xfa, 0x3a5: 0xfb, 0x3a6: 0xfc, 0x3a7: 0xfd, + 0x3a8: 0x45, 0x3a9: 0xfe, 0x3aa: 0xff, 0x3ab: 0x46, 0x3ac: 0x47, 0x3ad: 0x48, 0x3ae: 0x49, 0x3af: 0x4a, + 0x3b0: 0x100, 0x3b1: 0x4b, 0x3b2: 0x4c, 0x3b3: 0x4d, 0x3b4: 0x4e, 0x3b5: 0x4f, 0x3b6: 0x101, 0x3b7: 0x50, + 0x3b8: 0x51, 0x3b9: 0x52, 0x3ba: 0x53, 0x3bb: 0x54, 0x3bc: 0x55, 0x3bd: 0x56, 0x3be: 0x57, 0x3bf: 0x58, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x102, 0x3c1: 0x103, 0x3c2: 0x9d, 0x3c3: 0x104, 0x3c4: 0x105, 0x3c5: 0x9b, 0x3c6: 0x106, 0x3c7: 0x107, + 0x3c8: 0xb8, 0x3c9: 0xb8, 0x3ca: 0x108, 0x3cb: 0x109, 0x3cc: 0x10a, 0x3cd: 0x10b, 0x3ce: 0x10c, 0x3cf: 0x10d, + 0x3d0: 0x10e, 0x3d1: 0x9d, 0x3d2: 0x10f, 0x3d3: 0x110, 0x3d4: 0x111, 0x3d5: 0x112, 0x3d6: 0xb8, 0x3d7: 0xb8, + 0x3d8: 0x9d, 0x3d9: 0x9d, 0x3da: 0x9d, 0x3db: 0x9d, 0x3dc: 0x113, 0x3dd: 0x114, 0x3de: 0xb8, 0x3df: 0xb8, + 0x3e0: 0x115, 0x3e1: 0x116, 0x3e2: 0x117, 0x3e3: 0x118, 0x3e4: 0x119, 0x3e5: 0xb8, 0x3e6: 0x11a, 0x3e7: 0x11b, + 0x3e8: 0x11c, 0x3e9: 0x11d, 0x3ea: 0x11e, 0x3eb: 0x59, 0x3ec: 0x11f, 0x3ed: 0x120, 0x3ee: 0x5a, 0x3ef: 0xb8, + 0x3f0: 0x9d, 0x3f1: 0x121, 0x3f2: 0x122, 0x3f3: 0x123, 0x3f4: 0xb8, 0x3f5: 0xb8, 0x3f6: 0xb8, 0x3f7: 0xb8, + 0x3f8: 0xb8, 0x3f9: 0x124, 0x3fa: 0xb8, 0x3fb: 0xb8, 0x3fc: 0xb8, 0x3fd: 0xb8, 0x3fe: 0xb8, 0x3ff: 0xb8, + // Block 0x10, offset 0x400 + 0x400: 0x125, 0x401: 0x126, 0x402: 0x127, 0x403: 0x128, 0x404: 0x129, 0x405: 0x12a, 0x406: 0x12b, 0x407: 0x12c, + 0x408: 0x12d, 0x409: 0xb8, 0x40a: 0x12e, 0x40b: 0x12f, 0x40c: 0x5b, 0x40d: 0x5c, 0x40e: 0xb8, 0x40f: 0xb8, + 0x410: 0x130, 0x411: 0x131, 0x412: 0x132, 0x413: 0x133, 0x414: 0xb8, 0x415: 0xb8, 0x416: 0x134, 0x417: 0x135, + 0x418: 0x136, 0x419: 0x137, 0x41a: 0x138, 0x41b: 0x139, 0x41c: 0x13a, 0x41d: 0xb8, 0x41e: 0xb8, 0x41f: 0xb8, + 0x420: 0xb8, 0x421: 0xb8, 0x422: 0x13b, 0x423: 0x13c, 0x424: 0xb8, 0x425: 0xb8, 0x426: 0xb8, 0x427: 0xb8, + 0x428: 0xb8, 0x429: 0xb8, 0x42a: 0xb8, 0x42b: 0x13d, 0x42c: 0xb8, 0x42d: 0xb8, 0x42e: 0xb8, 0x42f: 0xb8, + 0x430: 0x13e, 0x431: 0x13f, 0x432: 0x140, 0x433: 0xb8, 0x434: 0xb8, 0x435: 0xb8, 0x436: 0xb8, 0x437: 0xb8, + 0x438: 0xb8, 0x439: 0xb8, 0x43a: 0xb8, 0x43b: 0xb8, 0x43c: 0xb8, 0x43d: 0xb8, 0x43e: 0xb8, 0x43f: 0xb8, + // Block 0x11, offset 0x440 + 0x440: 0x9d, 0x441: 0x9d, 0x442: 0x9d, 0x443: 0x9d, 0x444: 0x9d, 0x445: 0x9d, 0x446: 0x9d, 0x447: 0x9d, + 0x448: 0x9d, 0x449: 0x9d, 0x44a: 0x9d, 0x44b: 0x9d, 0x44c: 0x9d, 0x44d: 0x9d, 0x44e: 0x141, 0x44f: 0xb8, + 0x450: 0x9b, 0x451: 0x142, 0x452: 0x9d, 0x453: 0x9d, 0x454: 0x9d, 0x455: 0x143, 0x456: 0xb8, 0x457: 0xb8, + 0x458: 0xb8, 0x459: 0xb8, 0x45a: 0xb8, 0x45b: 0xb8, 0x45c: 0xb8, 0x45d: 0xb8, 0x45e: 0xb8, 0x45f: 0xb8, + 0x460: 0xb8, 0x461: 0xb8, 0x462: 0xb8, 0x463: 0xb8, 0x464: 0xb8, 0x465: 0xb8, 0x466: 0xb8, 0x467: 0xb8, + 0x468: 0xb8, 0x469: 0xb8, 0x46a: 0xb8, 0x46b: 0xb8, 0x46c: 0xb8, 0x46d: 0xb8, 0x46e: 0xb8, 0x46f: 0xb8, + 0x470: 0xb8, 0x471: 0xb8, 0x472: 0xb8, 0x473: 0xb8, 0x474: 0xb8, 0x475: 0xb8, 0x476: 0xb8, 0x477: 0xb8, + 0x478: 0xb8, 0x479: 0xb8, 0x47a: 0xb8, 0x47b: 0xb8, 0x47c: 0xb8, 0x47d: 0xb8, 0x47e: 0xb8, 0x47f: 0xb8, + // Block 0x12, offset 0x480 + 0x480: 0x9d, 0x481: 0x9d, 0x482: 0x9d, 0x483: 0x9d, 0x484: 0x9d, 0x485: 0x9d, 0x486: 0x9d, 0x487: 0x9d, + 0x488: 0x9d, 0x489: 0x9d, 0x48a: 0x9d, 0x48b: 0x9d, 0x48c: 0x9d, 0x48d: 0x9d, 0x48e: 0x9d, 0x48f: 0x9d, + 0x490: 0x144, 0x491: 0xb8, 0x492: 0xb8, 0x493: 0xb8, 0x494: 0xb8, 0x495: 0xb8, 0x496: 0xb8, 0x497: 0xb8, + 0x498: 0xb8, 0x499: 0xb8, 0x49a: 0xb8, 0x49b: 0xb8, 0x49c: 0xb8, 0x49d: 0xb8, 0x49e: 0xb8, 0x49f: 0xb8, + 0x4a0: 0xb8, 0x4a1: 0xb8, 0x4a2: 0xb8, 0x4a3: 0xb8, 0x4a4: 0xb8, 0x4a5: 0xb8, 0x4a6: 0xb8, 0x4a7: 0xb8, + 0x4a8: 0xb8, 0x4a9: 0xb8, 0x4aa: 0xb8, 0x4ab: 0xb8, 0x4ac: 0xb8, 0x4ad: 0xb8, 0x4ae: 0xb8, 0x4af: 0xb8, + 0x4b0: 0xb8, 0x4b1: 0xb8, 0x4b2: 0xb8, 0x4b3: 0xb8, 0x4b4: 0xb8, 0x4b5: 0xb8, 0x4b6: 0xb8, 0x4b7: 0xb8, + 0x4b8: 0xb8, 0x4b9: 0xb8, 0x4ba: 0xb8, 0x4bb: 0xb8, 0x4bc: 0xb8, 0x4bd: 0xb8, 0x4be: 0xb8, 0x4bf: 0xb8, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xb8, 0x4c1: 0xb8, 0x4c2: 0xb8, 0x4c3: 0xb8, 0x4c4: 0xb8, 0x4c5: 0xb8, 0x4c6: 0xb8, 0x4c7: 0xb8, + 0x4c8: 0xb8, 0x4c9: 0xb8, 0x4ca: 0xb8, 0x4cb: 0xb8, 0x4cc: 0xb8, 0x4cd: 0xb8, 0x4ce: 0xb8, 0x4cf: 0xb8, + 0x4d0: 0x9d, 0x4d1: 0x9d, 0x4d2: 0x9d, 0x4d3: 0x9d, 0x4d4: 0x9d, 0x4d5: 0x9d, 0x4d6: 0x9d, 0x4d7: 0x9d, + 0x4d8: 0x9d, 0x4d9: 0x145, 0x4da: 0xb8, 0x4db: 0xb8, 0x4dc: 0xb8, 0x4dd: 0xb8, 0x4de: 0xb8, 0x4df: 0xb8, + 0x4e0: 0xb8, 0x4e1: 0xb8, 0x4e2: 0xb8, 0x4e3: 0xb8, 0x4e4: 0xb8, 0x4e5: 0xb8, 0x4e6: 0xb8, 0x4e7: 0xb8, + 0x4e8: 0xb8, 0x4e9: 0xb8, 0x4ea: 0xb8, 0x4eb: 0xb8, 0x4ec: 0xb8, 0x4ed: 0xb8, 0x4ee: 0xb8, 0x4ef: 0xb8, + 0x4f0: 0xb8, 0x4f1: 0xb8, 0x4f2: 0xb8, 0x4f3: 0xb8, 0x4f4: 0xb8, 0x4f5: 0xb8, 0x4f6: 0xb8, 0x4f7: 0xb8, + 0x4f8: 0xb8, 0x4f9: 0xb8, 0x4fa: 0xb8, 0x4fb: 0xb8, 0x4fc: 0xb8, 0x4fd: 0xb8, 0x4fe: 0xb8, 0x4ff: 0xb8, + // Block 0x14, offset 0x500 + 0x500: 0xb8, 0x501: 0xb8, 0x502: 0xb8, 0x503: 0xb8, 0x504: 0xb8, 0x505: 0xb8, 0x506: 0xb8, 0x507: 0xb8, + 0x508: 0xb8, 0x509: 0xb8, 0x50a: 0xb8, 0x50b: 0xb8, 0x50c: 0xb8, 0x50d: 0xb8, 0x50e: 0xb8, 0x50f: 0xb8, + 0x510: 0xb8, 0x511: 0xb8, 0x512: 0xb8, 0x513: 0xb8, 0x514: 0xb8, 0x515: 0xb8, 0x516: 0xb8, 0x517: 0xb8, + 0x518: 0xb8, 0x519: 0xb8, 0x51a: 0xb8, 0x51b: 0xb8, 0x51c: 0xb8, 0x51d: 0xb8, 0x51e: 0xb8, 0x51f: 0xb8, + 0x520: 0x9d, 0x521: 0x9d, 0x522: 0x9d, 0x523: 0x9d, 0x524: 0x9d, 0x525: 0x9d, 0x526: 0x9d, 0x527: 0x9d, + 0x528: 0x13d, 0x529: 0x146, 0x52a: 0xb8, 0x52b: 0x147, 0x52c: 0x148, 0x52d: 0x149, 0x52e: 0x14a, 0x52f: 0xb8, + 0x530: 0xb8, 0x531: 0xb8, 0x532: 0xb8, 0x533: 0xb8, 0x534: 0xb8, 0x535: 0xb8, 0x536: 0xb8, 0x537: 0xb8, + 0x538: 0xb8, 0x539: 0xb8, 0x53a: 0xb8, 0x53b: 0xb8, 0x53c: 0x9d, 0x53d: 0x14b, 0x53e: 0x14c, 0x53f: 0x14d, + // Block 0x15, offset 0x540 + 0x540: 0x9d, 0x541: 0x9d, 0x542: 0x9d, 0x543: 0x9d, 0x544: 0x9d, 0x545: 0x9d, 0x546: 0x9d, 0x547: 0x9d, + 0x548: 0x9d, 0x549: 0x9d, 0x54a: 0x9d, 0x54b: 0x9d, 0x54c: 0x9d, 0x54d: 0x9d, 0x54e: 0x9d, 0x54f: 0x9d, + 0x550: 0x9d, 0x551: 0x9d, 0x552: 0x9d, 0x553: 0x9d, 0x554: 0x9d, 0x555: 0x9d, 0x556: 0x9d, 0x557: 0x9d, + 0x558: 0x9d, 0x559: 0x9d, 0x55a: 0x9d, 0x55b: 0x9d, 0x55c: 0x9d, 0x55d: 0x9d, 0x55e: 0x9d, 0x55f: 0x14e, + 0x560: 0x9d, 0x561: 0x9d, 0x562: 0x9d, 0x563: 0x9d, 0x564: 0x9d, 0x565: 0x9d, 0x566: 0x9d, 0x567: 0x9d, + 0x568: 0x9d, 0x569: 0x9d, 0x56a: 0x9d, 0x56b: 0x14f, 0x56c: 0xb8, 0x56d: 0xb8, 0x56e: 0xb8, 0x56f: 0xb8, + 0x570: 0xb8, 0x571: 0xb8, 0x572: 0xb8, 0x573: 0xb8, 0x574: 0xb8, 0x575: 0xb8, 0x576: 0xb8, 0x577: 0xb8, + 0x578: 0xb8, 0x579: 0xb8, 0x57a: 0xb8, 0x57b: 0xb8, 0x57c: 0xb8, 0x57d: 0xb8, 0x57e: 0xb8, 0x57f: 0xb8, + // Block 0x16, offset 0x580 + 0x580: 0x150, 0x581: 0xb8, 0x582: 0xb8, 0x583: 0xb8, 0x584: 0xb8, 0x585: 0xb8, 0x586: 0xb8, 0x587: 0xb8, + 0x588: 0xb8, 0x589: 0xb8, 0x58a: 0xb8, 0x58b: 0xb8, 0x58c: 0xb8, 0x58d: 0xb8, 0x58e: 0xb8, 0x58f: 0xb8, + 0x590: 0xb8, 0x591: 0xb8, 0x592: 0xb8, 0x593: 0xb8, 0x594: 0xb8, 0x595: 0xb8, 0x596: 0xb8, 0x597: 0xb8, + 0x598: 0xb8, 0x599: 0xb8, 0x59a: 0xb8, 0x59b: 0xb8, 0x59c: 0xb8, 0x59d: 0xb8, 0x59e: 0xb8, 0x59f: 0xb8, + 0x5a0: 0xb8, 0x5a1: 0xb8, 0x5a2: 0xb8, 0x5a3: 0xb8, 0x5a4: 0xb8, 0x5a5: 0xb8, 0x5a6: 0xb8, 0x5a7: 0xb8, + 0x5a8: 0xb8, 0x5a9: 0xb8, 0x5aa: 0xb8, 0x5ab: 0xb8, 0x5ac: 0xb8, 0x5ad: 0xb8, 0x5ae: 0xb8, 0x5af: 0xb8, + 0x5b0: 0x9d, 0x5b1: 0x151, 0x5b2: 0x152, 0x5b3: 0xb8, 0x5b4: 0xb8, 0x5b5: 0xb8, 0x5b6: 0xb8, 0x5b7: 0xb8, + 0x5b8: 0xb8, 0x5b9: 0xb8, 0x5ba: 0xb8, 0x5bb: 0xb8, 0x5bc: 0xb8, 0x5bd: 0xb8, 0x5be: 0xb8, 0x5bf: 0xb8, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x153, 0x5c4: 0x154, 0x5c5: 0x155, 0x5c6: 0x156, 0x5c7: 0x157, + 0x5c8: 0x9b, 0x5c9: 0x158, 0x5ca: 0xb8, 0x5cb: 0xb8, 0x5cc: 0x9b, 0x5cd: 0x159, 0x5ce: 0xb8, 0x5cf: 0xb8, + 0x5d0: 0x5d, 0x5d1: 0x5e, 0x5d2: 0x5f, 0x5d3: 0x60, 0x5d4: 0x61, 0x5d5: 0x62, 0x5d6: 0x63, 0x5d7: 0x64, + 0x5d8: 0x65, 0x5d9: 0x66, 0x5da: 0x67, 0x5db: 0x68, 0x5dc: 0x69, 0x5dd: 0x6a, 0x5de: 0x6b, 0x5df: 0x6c, + 0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b, + 0x5e8: 0x15a, 0x5e9: 0x15b, 0x5ea: 0x15c, 0x5eb: 0xb8, 0x5ec: 0xb8, 0x5ed: 0xb8, 0x5ee: 0xb8, 0x5ef: 0xb8, + 0x5f0: 0xb8, 0x5f1: 0xb8, 0x5f2: 0xb8, 0x5f3: 0xb8, 0x5f4: 0xb8, 0x5f5: 0xb8, 0x5f6: 0xb8, 0x5f7: 0xb8, + 0x5f8: 0xb8, 0x5f9: 0xb8, 0x5fa: 0xb8, 0x5fb: 0xb8, 0x5fc: 0xb8, 0x5fd: 0xb8, 0x5fe: 0xb8, 0x5ff: 0xb8, + // Block 0x18, offset 0x600 + 0x600: 0x15d, 0x601: 0xb8, 0x602: 0xb8, 0x603: 0xb8, 0x604: 0xb8, 0x605: 0xb8, 0x606: 0xb8, 0x607: 0xb8, + 0x608: 0xb8, 0x609: 0xb8, 0x60a: 0xb8, 0x60b: 0xb8, 0x60c: 0xb8, 0x60d: 0xb8, 0x60e: 0xb8, 0x60f: 0xb8, + 0x610: 0xb8, 0x611: 0xb8, 0x612: 0xb8, 0x613: 0xb8, 0x614: 0xb8, 0x615: 0xb8, 0x616: 0xb8, 0x617: 0xb8, + 0x618: 0xb8, 0x619: 0xb8, 0x61a: 0xb8, 0x61b: 0xb8, 0x61c: 0xb8, 0x61d: 0xb8, 0x61e: 0xb8, 0x61f: 0xb8, + 0x620: 0x9d, 0x621: 0x9d, 0x622: 0x9d, 0x623: 0x15e, 0x624: 0x6d, 0x625: 0x15f, 0x626: 0xb8, 0x627: 0xb8, + 0x628: 0xb8, 0x629: 0xb8, 0x62a: 0xb8, 0x62b: 0xb8, 0x62c: 0xb8, 0x62d: 0xb8, 0x62e: 0xb8, 0x62f: 0xb8, + 0x630: 0xb8, 0x631: 0xb8, 0x632: 0xb8, 0x633: 0xb8, 0x634: 0xb8, 0x635: 0xb8, 0x636: 0xb8, 0x637: 0xb8, + 0x638: 0x6e, 0x639: 0x6f, 0x63a: 0x70, 0x63b: 0x160, 0x63c: 0xb8, 0x63d: 0xb8, 0x63e: 0xb8, 0x63f: 0xb8, + // Block 0x19, offset 0x640 + 0x640: 0x161, 0x641: 0x9b, 0x642: 0x162, 0x643: 0x163, 0x644: 0x71, 0x645: 0x72, 0x646: 0x164, 0x647: 0x165, + 0x648: 0x73, 0x649: 0x166, 0x64a: 0xb8, 0x64b: 0xb8, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b, + 0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b, + 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x167, 0x65c: 0x9b, 0x65d: 0x168, 0x65e: 0x9b, 0x65f: 0x169, + 0x660: 0x16a, 0x661: 0x16b, 0x662: 0x16c, 0x663: 0xb8, 0x664: 0x16d, 0x665: 0x16e, 0x666: 0x16f, 0x667: 0x170, + 0x668: 0xb8, 0x669: 0xb8, 0x66a: 0xb8, 0x66b: 0xb8, 0x66c: 0xb8, 0x66d: 0xb8, 0x66e: 0xb8, 0x66f: 0xb8, + 0x670: 0xb8, 0x671: 0xb8, 0x672: 0xb8, 0x673: 0xb8, 0x674: 0xb8, 0x675: 0xb8, 0x676: 0xb8, 0x677: 0xb8, + 0x678: 0xb8, 0x679: 0xb8, 0x67a: 0xb8, 0x67b: 0xb8, 0x67c: 0xb8, 0x67d: 0xb8, 0x67e: 0xb8, 0x67f: 0xb8, + // Block 0x1a, offset 0x680 + 0x680: 0x9d, 0x681: 0x9d, 0x682: 0x9d, 0x683: 0x9d, 0x684: 0x9d, 0x685: 0x9d, 0x686: 0x9d, 0x687: 0x9d, + 0x688: 0x9d, 0x689: 0x9d, 0x68a: 0x9d, 0x68b: 0x9d, 0x68c: 0x9d, 0x68d: 0x9d, 0x68e: 0x9d, 0x68f: 0x9d, + 0x690: 0x9d, 0x691: 0x9d, 0x692: 0x9d, 0x693: 0x9d, 0x694: 0x9d, 0x695: 0x9d, 0x696: 0x9d, 0x697: 0x9d, + 0x698: 0x9d, 0x699: 0x9d, 0x69a: 0x9d, 0x69b: 0x171, 0x69c: 0x9d, 0x69d: 0x9d, 0x69e: 0x9d, 0x69f: 0x9d, + 0x6a0: 0x9d, 0x6a1: 0x9d, 0x6a2: 0x9d, 0x6a3: 0x9d, 0x6a4: 0x9d, 0x6a5: 0x9d, 0x6a6: 0x9d, 0x6a7: 0x9d, + 0x6a8: 0x9d, 0x6a9: 0x9d, 0x6aa: 0x9d, 0x6ab: 0x9d, 0x6ac: 0x9d, 0x6ad: 0x9d, 0x6ae: 0x9d, 0x6af: 0x9d, + 0x6b0: 0x9d, 0x6b1: 0x9d, 0x6b2: 0x9d, 0x6b3: 0x9d, 0x6b4: 0x9d, 0x6b5: 0x9d, 0x6b6: 0x9d, 0x6b7: 0x9d, + 0x6b8: 0x9d, 0x6b9: 0x9d, 0x6ba: 0x9d, 0x6bb: 0x9d, 0x6bc: 0x9d, 0x6bd: 0x9d, 0x6be: 0x9d, 0x6bf: 0x9d, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x9d, 0x6c1: 0x9d, 0x6c2: 0x9d, 0x6c3: 0x9d, 0x6c4: 0x9d, 0x6c5: 0x9d, 0x6c6: 0x9d, 0x6c7: 0x9d, + 0x6c8: 0x9d, 0x6c9: 0x9d, 0x6ca: 0x9d, 0x6cb: 0x9d, 0x6cc: 0x9d, 0x6cd: 0x9d, 0x6ce: 0x9d, 0x6cf: 0x9d, + 0x6d0: 0x9d, 0x6d1: 0x9d, 0x6d2: 0x9d, 0x6d3: 0x9d, 0x6d4: 0x9d, 0x6d5: 0x9d, 0x6d6: 0x9d, 0x6d7: 0x9d, + 0x6d8: 0x9d, 0x6d9: 0x9d, 0x6da: 0x9d, 0x6db: 0x9d, 0x6dc: 0x172, 0x6dd: 0x9d, 0x6de: 0x9d, 0x6df: 0x9d, + 0x6e0: 0x173, 0x6e1: 0x9d, 0x6e2: 0x9d, 0x6e3: 0x9d, 0x6e4: 0x9d, 0x6e5: 0x9d, 0x6e6: 0x9d, 0x6e7: 0x9d, + 0x6e8: 0x9d, 0x6e9: 0x9d, 0x6ea: 0x9d, 0x6eb: 0x9d, 0x6ec: 0x9d, 0x6ed: 0x9d, 0x6ee: 0x9d, 0x6ef: 0x9d, + 0x6f0: 0x9d, 0x6f1: 0x9d, 0x6f2: 0x9d, 0x6f3: 0x9d, 0x6f4: 0x9d, 0x6f5: 0x9d, 0x6f6: 0x9d, 0x6f7: 0x9d, + 0x6f8: 0x9d, 0x6f9: 0x9d, 0x6fa: 0x9d, 0x6fb: 0x9d, 0x6fc: 0x9d, 0x6fd: 0x9d, 0x6fe: 0x9d, 0x6ff: 0x9d, + // Block 0x1c, offset 0x700 + 0x700: 0x9d, 0x701: 0x9d, 0x702: 0x9d, 0x703: 0x9d, 0x704: 0x9d, 0x705: 0x9d, 0x706: 0x9d, 0x707: 0x9d, + 0x708: 0x9d, 0x709: 0x9d, 0x70a: 0x9d, 0x70b: 0x9d, 0x70c: 0x9d, 0x70d: 0x9d, 0x70e: 0x9d, 0x70f: 0x9d, + 0x710: 0x9d, 0x711: 0x9d, 0x712: 0x9d, 0x713: 0x9d, 0x714: 0x9d, 0x715: 0x9d, 0x716: 0x9d, 0x717: 0x9d, + 0x718: 0x9d, 0x719: 0x9d, 0x71a: 0x9d, 0x71b: 0x9d, 0x71c: 0x9d, 0x71d: 0x9d, 0x71e: 0x9d, 0x71f: 0x9d, + 0x720: 0x9d, 0x721: 0x9d, 0x722: 0x9d, 0x723: 0x9d, 0x724: 0x9d, 0x725: 0x9d, 0x726: 0x9d, 0x727: 0x9d, + 0x728: 0x9d, 0x729: 0x9d, 0x72a: 0x9d, 0x72b: 0x9d, 0x72c: 0x9d, 0x72d: 0x9d, 0x72e: 0x9d, 0x72f: 0x9d, + 0x730: 0x9d, 0x731: 0x9d, 0x732: 0x9d, 0x733: 0x9d, 0x734: 0x9d, 0x735: 0x9d, 0x736: 0x9d, 0x737: 0x9d, + 0x738: 0x9d, 0x739: 0x9d, 0x73a: 0x174, 0x73b: 0xb8, 0x73c: 0xb8, 0x73d: 0xb8, 0x73e: 0xb8, 0x73f: 0xb8, + // Block 0x1d, offset 0x740 + 0x740: 0xb8, 0x741: 0xb8, 0x742: 0xb8, 0x743: 0xb8, 0x744: 0xb8, 0x745: 0xb8, 0x746: 0xb8, 0x747: 0xb8, + 0x748: 0xb8, 0x749: 0xb8, 0x74a: 0xb8, 0x74b: 0xb8, 0x74c: 0xb8, 0x74d: 0xb8, 0x74e: 0xb8, 0x74f: 0xb8, + 0x750: 0xb8, 0x751: 0xb8, 0x752: 0xb8, 0x753: 0xb8, 0x754: 0xb8, 0x755: 0xb8, 0x756: 0xb8, 0x757: 0xb8, + 0x758: 0xb8, 0x759: 0xb8, 0x75a: 0xb8, 0x75b: 0xb8, 0x75c: 0xb8, 0x75d: 0xb8, 0x75e: 0xb8, 0x75f: 0xb8, + 0x760: 0x74, 0x761: 0x75, 0x762: 0x76, 0x763: 0x175, 0x764: 0x77, 0x765: 0x78, 0x766: 0x176, 0x767: 0x79, + 0x768: 0x7a, 0x769: 0xb8, 0x76a: 0xb8, 0x76b: 0xb8, 0x76c: 0xb8, 0x76d: 0xb8, 0x76e: 0xb8, 0x76f: 0xb8, + 0x770: 0xb8, 0x771: 0xb8, 0x772: 0xb8, 0x773: 0xb8, 0x774: 0xb8, 0x775: 0xb8, 0x776: 0xb8, 0x777: 0xb8, + 0x778: 0xb8, 0x779: 0xb8, 0x77a: 0xb8, 0x77b: 0xb8, 0x77c: 0xb8, 0x77d: 0xb8, 0x77e: 0xb8, 0x77f: 0xb8, + // Block 0x1e, offset 0x780 + 0x790: 0x0d, 0x791: 0x0e, 0x792: 0x0f, 0x793: 0x10, 0x794: 0x11, 0x795: 0x0b, 0x796: 0x12, 0x797: 0x07, + 0x798: 0x13, 0x799: 0x0b, 0x79a: 0x0b, 0x79b: 0x14, 0x79c: 0x0b, 0x79d: 0x15, 0x79e: 0x16, 0x79f: 0x17, + 0x7a0: 0x07, 0x7a1: 0x07, 0x7a2: 0x07, 0x7a3: 0x07, 0x7a4: 0x07, 0x7a5: 0x07, 0x7a6: 0x07, 0x7a7: 0x07, + 0x7a8: 0x07, 0x7a9: 0x07, 0x7aa: 0x18, 0x7ab: 0x19, 0x7ac: 0x1a, 0x7ad: 0x0b, 0x7ae: 0x0b, 0x7af: 0x1b, + 0x7b0: 0x0b, 0x7b1: 0x0b, 0x7b2: 0x0b, 0x7b3: 0x0b, 0x7b4: 0x0b, 0x7b5: 0x0b, 0x7b6: 0x0b, 0x7b7: 0x0b, + 0x7b8: 0x0b, 0x7b9: 0x0b, 0x7ba: 0x0b, 0x7bb: 0x0b, 0x7bc: 0x0b, 0x7bd: 0x0b, 0x7be: 0x0b, 0x7bf: 0x0b, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0b, 0x7c1: 0x0b, 0x7c2: 0x0b, 0x7c3: 0x0b, 0x7c4: 0x0b, 0x7c5: 0x0b, 0x7c6: 0x0b, 0x7c7: 0x0b, + 0x7c8: 0x0b, 0x7c9: 0x0b, 0x7ca: 0x0b, 0x7cb: 0x0b, 0x7cc: 0x0b, 0x7cd: 0x0b, 0x7ce: 0x0b, 0x7cf: 0x0b, + 0x7d0: 0x0b, 0x7d1: 0x0b, 0x7d2: 0x0b, 0x7d3: 0x0b, 0x7d4: 0x0b, 0x7d5: 0x0b, 0x7d6: 0x0b, 0x7d7: 0x0b, + 0x7d8: 0x0b, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x0b, 0x7dc: 0x0b, 0x7dd: 0x0b, 0x7de: 0x0b, 0x7df: 0x0b, + 0x7e0: 0x0b, 0x7e1: 0x0b, 0x7e2: 0x0b, 0x7e3: 0x0b, 0x7e4: 0x0b, 0x7e5: 0x0b, 0x7e6: 0x0b, 0x7e7: 0x0b, + 0x7e8: 0x0b, 0x7e9: 0x0b, 0x7ea: 0x0b, 0x7eb: 0x0b, 0x7ec: 0x0b, 0x7ed: 0x0b, 0x7ee: 0x0b, 0x7ef: 0x0b, + 0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b, + 0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b, + // Block 0x20, offset 0x800 + 0x800: 0x177, 0x801: 0x178, 0x802: 0xb8, 0x803: 0xb8, 0x804: 0x179, 0x805: 0x179, 0x806: 0x179, 0x807: 0x17a, + 0x808: 0xb8, 0x809: 0xb8, 0x80a: 0xb8, 0x80b: 0xb8, 0x80c: 0xb8, 0x80d: 0xb8, 0x80e: 0xb8, 0x80f: 0xb8, + 0x810: 0xb8, 0x811: 0xb8, 0x812: 0xb8, 0x813: 0xb8, 0x814: 0xb8, 0x815: 0xb8, 0x816: 0xb8, 0x817: 0xb8, + 0x818: 0xb8, 0x819: 0xb8, 0x81a: 0xb8, 0x81b: 0xb8, 0x81c: 0xb8, 0x81d: 0xb8, 0x81e: 0xb8, 0x81f: 0xb8, + 0x820: 0xb8, 0x821: 0xb8, 0x822: 0xb8, 0x823: 0xb8, 0x824: 0xb8, 0x825: 0xb8, 0x826: 0xb8, 0x827: 0xb8, + 0x828: 0xb8, 0x829: 0xb8, 0x82a: 0xb8, 0x82b: 0xb8, 0x82c: 0xb8, 0x82d: 0xb8, 0x82e: 0xb8, 0x82f: 0xb8, + 0x830: 0xb8, 0x831: 0xb8, 0x832: 0xb8, 0x833: 0xb8, 0x834: 0xb8, 0x835: 0xb8, 0x836: 0xb8, 0x837: 0xb8, + 0x838: 0xb8, 0x839: 0xb8, 0x83a: 0xb8, 0x83b: 0xb8, 0x83c: 0xb8, 0x83d: 0xb8, 0x83e: 0xb8, 0x83f: 0xb8, + // Block 0x21, offset 0x840 + 0x840: 0x0b, 0x841: 0x0b, 0x842: 0x0b, 0x843: 0x0b, 0x844: 0x0b, 0x845: 0x0b, 0x846: 0x0b, 0x847: 0x0b, + 0x848: 0x0b, 0x849: 0x0b, 0x84a: 0x0b, 0x84b: 0x0b, 0x84c: 0x0b, 0x84d: 0x0b, 0x84e: 0x0b, 0x84f: 0x0b, + 0x850: 0x0b, 0x851: 0x0b, 0x852: 0x0b, 0x853: 0x0b, 0x854: 0x0b, 0x855: 0x0b, 0x856: 0x0b, 0x857: 0x0b, + 0x858: 0x0b, 0x859: 0x0b, 0x85a: 0x0b, 0x85b: 0x0b, 0x85c: 0x0b, 0x85d: 0x0b, 0x85e: 0x0b, 0x85f: 0x0b, + 0x860: 0x1e, 0x861: 0x0b, 0x862: 0x0b, 0x863: 0x0b, 0x864: 0x0b, 0x865: 0x0b, 0x866: 0x0b, 0x867: 0x0b, + 0x868: 0x0b, 0x869: 0x0b, 0x86a: 0x0b, 0x86b: 0x0b, 0x86c: 0x0b, 0x86d: 0x0b, 0x86e: 0x0b, 0x86f: 0x0b, + 0x870: 0x0b, 0x871: 0x0b, 0x872: 0x0b, 0x873: 0x0b, 0x874: 0x0b, 0x875: 0x0b, 0x876: 0x0b, 0x877: 0x0b, + 0x878: 0x0b, 0x879: 0x0b, 0x87a: 0x0b, 0x87b: 0x0b, 0x87c: 0x0b, 0x87d: 0x0b, 0x87e: 0x0b, 0x87f: 0x0b, + // Block 0x22, offset 0x880 + 0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b, + 0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b, +} + +// idnaSparseOffset: 256 entries, 512 bytes +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x5c, 0x60, 0x6f, 0x74, 0x7b, 0x87, 0x95, 0xa3, 0xa8, 0xb1, 0xc1, 0xcf, 0xdc, 0xe8, 0xf9, 0x103, 0x10a, 0x117, 0x128, 0x12f, 0x13a, 0x149, 0x157, 0x161, 0x163, 0x167, 0x169, 0x175, 0x180, 0x188, 0x18e, 0x194, 0x199, 0x19e, 0x1a1, 0x1a5, 0x1ab, 0x1b0, 0x1bc, 0x1c6, 0x1cc, 0x1dd, 0x1e7, 0x1ea, 0x1f2, 0x1f5, 0x202, 0x20a, 0x20e, 0x215, 0x21d, 0x22d, 0x239, 0x23b, 0x245, 0x251, 0x25d, 0x269, 0x271, 0x276, 0x280, 0x291, 0x295, 0x2a0, 0x2a4, 0x2ad, 0x2b5, 0x2bb, 0x2c0, 0x2c3, 0x2c6, 0x2ca, 0x2d0, 0x2d4, 0x2d8, 0x2de, 0x2e5, 0x2eb, 0x2f3, 0x2fa, 0x305, 0x30f, 0x313, 0x316, 0x31c, 0x320, 0x322, 0x325, 0x327, 0x32a, 0x334, 0x337, 0x346, 0x34a, 0x34f, 0x352, 0x356, 0x35b, 0x360, 0x366, 0x36c, 0x37b, 0x381, 0x385, 0x394, 0x399, 0x3a1, 0x3ab, 0x3b6, 0x3be, 0x3cf, 0x3d8, 0x3e8, 0x3f5, 0x3ff, 0x404, 0x411, 0x415, 0x41a, 0x41c, 0x420, 0x422, 0x426, 0x42f, 0x435, 0x439, 0x449, 0x453, 0x458, 0x45b, 0x461, 0x468, 0x46d, 0x471, 0x477, 0x47c, 0x485, 0x48a, 0x490, 0x497, 0x49e, 0x4a5, 0x4a9, 0x4ae, 0x4b1, 0x4b6, 0x4c2, 0x4c8, 0x4cd, 0x4d4, 0x4dc, 0x4e1, 0x4e5, 0x4f5, 0x4fc, 0x500, 0x504, 0x50b, 0x50e, 0x511, 0x515, 0x519, 0x51f, 0x528, 0x534, 0x53b, 0x544, 0x54c, 0x553, 0x561, 0x56e, 0x57b, 0x584, 0x588, 0x596, 0x59e, 0x5a9, 0x5b2, 0x5b8, 0x5c0, 0x5c9, 0x5d3, 0x5d6, 0x5e2, 0x5e5, 0x5ea, 0x5ed, 0x5f7, 0x600, 0x60c, 0x60f, 0x614, 0x617, 0x61a, 0x61d, 0x624, 0x62b, 0x62f, 0x63a, 0x63d, 0x643, 0x648, 0x64c, 0x64f, 0x652, 0x655, 0x65a, 0x664, 0x667, 0x66b, 0x67a, 0x686, 0x68a, 0x68f, 0x694, 0x698, 0x69d, 0x6a6, 0x6b1, 0x6b7, 0x6bf, 0x6c3, 0x6c7, 0x6cd, 0x6d3, 0x6d8, 0x6db, 0x6e9, 0x6f0, 0x6f3, 0x6f6, 0x6fa, 0x700, 0x705, 0x70f, 0x714, 0x717, 0x71a, 0x71d, 0x720, 0x724, 0x727, 0x737, 0x748, 0x74d, 0x74f, 0x751} + +// idnaSparseValues: 1876 entries, 7504 bytes +var idnaSparseValues = [1876]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x07}, + {value: 0xe105, lo: 0x80, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x97}, + {value: 0xe105, lo: 0x98, hi: 0x9e}, + {value: 0x001f, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbf}, + // Block 0x1, offset 0x8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0xe01d, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0335, lo: 0x83, hi: 0x83}, + {value: 0x034d, lo: 0x84, hi: 0x84}, + {value: 0x0365, lo: 0x85, hi: 0x85}, + {value: 0xe00d, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0xe00d, lo: 0x88, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x89}, + {value: 0xe00d, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe00d, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0x8d}, + {value: 0xe00d, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0xbf}, + // Block 0x2, offset 0x19 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0249, lo: 0xb0, hi: 0xb0}, + {value: 0x037d, lo: 0xb1, hi: 0xb1}, + {value: 0x0259, lo: 0xb2, hi: 0xb2}, + {value: 0x0269, lo: 0xb3, hi: 0xb3}, + {value: 0x034d, lo: 0xb4, hi: 0xb4}, + {value: 0x0395, lo: 0xb5, hi: 0xb5}, + {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, + {value: 0x0279, lo: 0xb7, hi: 0xb7}, + {value: 0x0289, lo: 0xb8, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbf}, + // Block 0x3, offset 0x25 + {value: 0x0000, lo: 0x01}, + {value: 0x1308, lo: 0x80, hi: 0xbf}, + // Block 0x4, offset 0x27 + {value: 0x0000, lo: 0x04}, + {value: 0x03f5, lo: 0x80, hi: 0x8f}, + {value: 0xe105, lo: 0x90, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x5, offset 0x2c + {value: 0x0000, lo: 0x07}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x0545, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x6, offset 0x34 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0401, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x88}, + {value: 0x0018, lo: 0x89, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x1308, lo: 0x91, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbe}, + {value: 0x1308, lo: 0xbf, hi: 0xbf}, + // Block 0x7, offset 0x3f + {value: 0x0000, lo: 0x0b}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x83}, + {value: 0x1308, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x1308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x8, offset 0x4b + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0208, lo: 0x81, hi: 0x87}, + {value: 0x0408, lo: 0x88, hi: 0x88}, + {value: 0x0208, lo: 0x89, hi: 0x8a}, + {value: 0x1308, lo: 0x8b, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xad}, + {value: 0x0208, lo: 0xae, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb0}, + {value: 0x0408, lo: 0xb1, hi: 0xb3}, + {value: 0x0008, lo: 0xb4, hi: 0xb4}, + {value: 0x0429, lo: 0xb5, hi: 0xb5}, + {value: 0x0451, lo: 0xb6, hi: 0xb6}, + {value: 0x0479, lo: 0xb7, hi: 0xb7}, + {value: 0x04a1, lo: 0xb8, hi: 0xb8}, + {value: 0x0208, lo: 0xb9, hi: 0xbf}, + // Block 0x9, offset 0x5c + {value: 0x0000, lo: 0x03}, + {value: 0x0208, lo: 0x80, hi: 0x87}, + {value: 0x0408, lo: 0x88, hi: 0x99}, + {value: 0x0208, lo: 0x9a, hi: 0xbf}, + // Block 0xa, offset 0x60 + {value: 0x0000, lo: 0x0e}, + {value: 0x1308, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0408, lo: 0x8d, hi: 0x8d}, + {value: 0x0208, lo: 0x8e, hi: 0x98}, + {value: 0x0408, lo: 0x99, hi: 0x9b}, + {value: 0x0208, lo: 0x9c, hi: 0xaa}, + {value: 0x0408, lo: 0xab, hi: 0xac}, + {value: 0x0208, lo: 0xad, hi: 0xb0}, + {value: 0x0408, lo: 0xb1, hi: 0xb1}, + {value: 0x0208, lo: 0xb2, hi: 0xb2}, + {value: 0x0408, lo: 0xb3, hi: 0xb4}, + {value: 0x0208, lo: 0xb5, hi: 0xb7}, + {value: 0x0408, lo: 0xb8, hi: 0xb9}, + {value: 0x0208, lo: 0xba, hi: 0xbf}, + // Block 0xb, offset 0x6f + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x1308, lo: 0xa6, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xc, offset 0x74 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0208, lo: 0x8a, hi: 0xaa}, + {value: 0x1308, lo: 0xab, hi: 0xb3}, + {value: 0x0008, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0xd, offset 0x7b + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x1308, lo: 0x96, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9a}, + {value: 0x1308, lo: 0x9b, hi: 0xa3}, + {value: 0x0008, lo: 0xa4, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xa8}, + {value: 0x1308, lo: 0xa9, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xe, offset 0x87 + {value: 0x0000, lo: 0x0d}, + {value: 0x0408, lo: 0x80, hi: 0x80}, + {value: 0x0208, lo: 0x81, hi: 0x85}, + {value: 0x0408, lo: 0x86, hi: 0x87}, + {value: 0x0208, lo: 0x88, hi: 0x88}, + {value: 0x0408, lo: 0x89, hi: 0x89}, + {value: 0x0208, lo: 0x8a, hi: 0x93}, + {value: 0x0408, lo: 0x94, hi: 0x94}, + {value: 0x0208, lo: 0x95, hi: 0x95}, + {value: 0x0008, lo: 0x96, hi: 0x98}, + {value: 0x1308, lo: 0x99, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xf, offset 0x95 + {value: 0x0000, lo: 0x0d}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xa9}, + {value: 0x0408, lo: 0xaa, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0408, lo: 0xae, hi: 0xae}, + {value: 0x0208, lo: 0xaf, hi: 0xb0}, + {value: 0x0408, lo: 0xb1, hi: 0xb2}, + {value: 0x0208, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0208, lo: 0xb6, hi: 0xb8}, + {value: 0x0408, lo: 0xb9, hi: 0xb9}, + {value: 0x0208, lo: 0xba, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x10, offset 0xa3 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x93}, + {value: 0x1308, lo: 0x94, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x1308, lo: 0xa3, hi: 0xbf}, + // Block 0x11, offset 0xa8 + {value: 0x0000, lo: 0x08}, + {value: 0x1308, lo: 0x80, hi: 0x82}, + {value: 0x1008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb9}, + {value: 0x1308, lo: 0xba, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbf}, + // Block 0x12, offset 0xb1 + {value: 0x0000, lo: 0x0f}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x1008, lo: 0x81, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x85}, + {value: 0x1008, lo: 0x86, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x1008, lo: 0x8a, hi: 0x8c}, + {value: 0x1b08, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x96}, + {value: 0x1008, lo: 0x97, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x13, offset 0xc1 + {value: 0x0000, lo: 0x0d}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x1008, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x1308, lo: 0xbe, hi: 0xbf}, + // Block 0x14, offset 0xcf + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbf}, + // Block 0x15, offset 0xdc + {value: 0x0000, lo: 0x0b}, + {value: 0x0040, lo: 0x80, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x16, offset 0xe8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x89}, + {value: 0x1b08, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x1008, lo: 0x8f, hi: 0x91}, + {value: 0x1308, lo: 0x92, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x95}, + {value: 0x1308, lo: 0x96, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x1008, lo: 0x98, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb1}, + {value: 0x1008, lo: 0xb2, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x17, offset 0xf9 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xb0}, + {value: 0x1308, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x08f1, lo: 0xb3, hi: 0xb3}, + {value: 0x1308, lo: 0xb4, hi: 0xb9}, + {value: 0x1b08, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x18, offset 0x103 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x1308, lo: 0x87, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0xbf}, + // Block 0x19, offset 0x10a + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x1308, lo: 0x88, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0961, lo: 0x9c, hi: 0x9c}, + {value: 0x0999, lo: 0x9d, hi: 0x9d}, + {value: 0x0008, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1a, offset 0x117 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe03d, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x97}, + {value: 0x1308, lo: 0x98, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb4}, + {value: 0x1308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb6}, + {value: 0x1308, lo: 0xb7, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xb8}, + {value: 0x1308, lo: 0xb9, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbf}, + // Block 0x1b, offset 0x128 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x1308, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0x1c, offset 0x12f + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x1008, lo: 0xab, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xb0}, + {value: 0x1008, lo: 0xb1, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb7}, + {value: 0x1008, lo: 0xb8, hi: 0xb8}, + {value: 0x1b08, lo: 0xb9, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbc}, + {value: 0x1308, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x1d, offset 0x13a + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x1008, lo: 0x96, hi: 0x97}, + {value: 0x1308, lo: 0x98, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x1308, lo: 0x9e, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x1008, lo: 0xa2, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xa6}, + {value: 0x1008, lo: 0xa7, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x1308, lo: 0xb1, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbf}, + // Block 0x1e, offset 0x149 + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x1308, lo: 0x82, hi: 0x82}, + {value: 0x1008, lo: 0x83, hi: 0x84}, + {value: 0x1308, lo: 0x85, hi: 0x86}, + {value: 0x1008, lo: 0x87, hi: 0x8c}, + {value: 0x1308, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x1008, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x1008, lo: 0x9a, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1f, offset 0x157 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x86}, + {value: 0x055d, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8c}, + {value: 0x055d, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0xe105, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0x20, offset 0x161 + {value: 0x0000, lo: 0x01}, + {value: 0x0018, lo: 0x80, hi: 0xbf}, + // Block 0x21, offset 0x163 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbf}, + // Block 0x22, offset 0x167 + {value: 0x0000, lo: 0x01}, + {value: 0x0008, lo: 0x80, hi: 0xbf}, + // Block 0x23, offset 0x169 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x24, offset 0x175 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x25, offset 0x180 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x26, offset 0x188 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x27, offset 0x18e + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x28, offset 0x194 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x29, offset 0x199 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x2a, offset 0x19e + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x2b, offset 0x1a1 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xbf}, + // Block 0x2c, offset 0x1a5 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x2d, offset 0x1ab + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x2e, offset 0x1b0 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x91}, + {value: 0x1308, lo: 0x92, hi: 0x93}, + {value: 0x1b08, lo: 0x94, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb3}, + {value: 0x1b08, lo: 0xb4, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x2f, offset 0x1bc + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x1308, lo: 0x92, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x30, offset 0x1c6 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xb3}, + {value: 0x1340, lo: 0xb4, hi: 0xb5}, + {value: 0x1008, lo: 0xb6, hi: 0xb6}, + {value: 0x1308, lo: 0xb7, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbf}, + // Block 0x31, offset 0x1cc + {value: 0x0000, lo: 0x10}, + {value: 0x1008, lo: 0x80, hi: 0x85}, + {value: 0x1308, lo: 0x86, hi: 0x86}, + {value: 0x1008, lo: 0x87, hi: 0x88}, + {value: 0x1308, lo: 0x89, hi: 0x91}, + {value: 0x1b08, lo: 0x92, hi: 0x92}, + {value: 0x1308, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0x96}, + {value: 0x0008, lo: 0x97, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x32, offset 0x1dd + {value: 0x0000, lo: 0x09}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x86}, + {value: 0x0218, lo: 0x87, hi: 0x87}, + {value: 0x0018, lo: 0x88, hi: 0x8a}, + {value: 0x13c0, lo: 0x8b, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xbf}, + // Block 0x33, offset 0x1e7 + {value: 0x0000, lo: 0x02}, + {value: 0x0208, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x34, offset 0x1ea + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x1308, lo: 0x85, hi: 0x86}, + {value: 0x0208, lo: 0x87, hi: 0xa8}, + {value: 0x1308, lo: 0xa9, hi: 0xa9}, + {value: 0x0208, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x35, offset 0x1f2 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x36, offset 0x1f5 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x1308, lo: 0xa0, hi: 0xa2}, + {value: 0x1008, lo: 0xa3, hi: 0xa6}, + {value: 0x1308, lo: 0xa7, hi: 0xa8}, + {value: 0x1008, lo: 0xa9, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x1008, lo: 0xb0, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb2}, + {value: 0x1008, lo: 0xb3, hi: 0xb8}, + {value: 0x1308, lo: 0xb9, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x37, offset 0x202 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x38, offset 0x20a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x39, offset 0x20e + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0028, lo: 0x9a, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xbf}, + // Block 0x3a, offset 0x215 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x1308, lo: 0x97, hi: 0x98}, + {value: 0x1008, lo: 0x99, hi: 0x9a}, + {value: 0x1308, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x3b, offset 0x21d + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x94}, + {value: 0x1008, lo: 0x95, hi: 0x95}, + {value: 0x1308, lo: 0x96, hi: 0x96}, + {value: 0x1008, lo: 0x97, hi: 0x97}, + {value: 0x1308, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x1b08, lo: 0xa0, hi: 0xa0}, + {value: 0x1008, lo: 0xa1, hi: 0xa1}, + {value: 0x1308, lo: 0xa2, hi: 0xa2}, + {value: 0x1008, lo: 0xa3, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xac}, + {value: 0x1008, lo: 0xad, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x1308, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x22d + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xbd}, + {value: 0x1318, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x3d, offset 0x239 + {value: 0x0000, lo: 0x01}, + {value: 0x0040, lo: 0x80, hi: 0xbf}, + // Block 0x3e, offset 0x23b + {value: 0x0000, lo: 0x09}, + {value: 0x1308, lo: 0x80, hi: 0x83}, + {value: 0x1008, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xb3}, + {value: 0x1308, lo: 0xb4, hi: 0xb4}, + {value: 0x1008, lo: 0xb5, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbc}, + {value: 0x1008, lo: 0xbd, hi: 0xbf}, + // Block 0x3f, offset 0x245 + {value: 0x0000, lo: 0x0b}, + {value: 0x1008, lo: 0x80, hi: 0x81}, + {value: 0x1308, lo: 0x82, hi: 0x82}, + {value: 0x1008, lo: 0x83, hi: 0x83}, + {value: 0x1808, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xaa}, + {value: 0x1308, lo: 0xab, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x40, offset 0x251 + {value: 0x0000, lo: 0x0b}, + {value: 0x1308, lo: 0x80, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa0}, + {value: 0x1008, lo: 0xa1, hi: 0xa1}, + {value: 0x1308, lo: 0xa2, hi: 0xa5}, + {value: 0x1008, lo: 0xa6, hi: 0xa7}, + {value: 0x1308, lo: 0xa8, hi: 0xa9}, + {value: 0x1808, lo: 0xaa, hi: 0xaa}, + {value: 0x1b08, lo: 0xab, hi: 0xab}, + {value: 0x1308, lo: 0xac, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xbf}, + // Block 0x41, offset 0x25d + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x1308, lo: 0xa6, hi: 0xa6}, + {value: 0x1008, lo: 0xa7, hi: 0xa7}, + {value: 0x1308, lo: 0xa8, hi: 0xa9}, + {value: 0x1008, lo: 0xaa, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xad}, + {value: 0x1008, lo: 0xae, hi: 0xae}, + {value: 0x1308, lo: 0xaf, hi: 0xb1}, + {value: 0x1808, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x42, offset 0x269 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x1008, lo: 0xa4, hi: 0xab}, + {value: 0x1308, lo: 0xac, hi: 0xb3}, + {value: 0x1008, lo: 0xb4, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x43, offset 0x271 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x44, offset 0x276 + {value: 0x0000, lo: 0x09}, + {value: 0x0e29, lo: 0x80, hi: 0x80}, + {value: 0x0e41, lo: 0x81, hi: 0x81}, + {value: 0x0e59, lo: 0x82, hi: 0x82}, + {value: 0x0e71, lo: 0x83, hi: 0x83}, + {value: 0x0e89, lo: 0x84, hi: 0x85}, + {value: 0x0ea1, lo: 0x86, hi: 0x86}, + {value: 0x0eb9, lo: 0x87, hi: 0x87}, + {value: 0x057d, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0x45, offset 0x280 + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x1308, lo: 0x90, hi: 0x92}, + {value: 0x0018, lo: 0x93, hi: 0x93}, + {value: 0x1308, lo: 0x94, hi: 0xa0}, + {value: 0x1008, lo: 0xa1, hi: 0xa1}, + {value: 0x1308, lo: 0xa2, hi: 0xa8}, + {value: 0x0008, lo: 0xa9, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb1}, + {value: 0x1008, lo: 0xb2, hi: 0xb3}, + {value: 0x1308, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x46, offset 0x291 + {value: 0x0000, lo: 0x03}, + {value: 0x1308, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x1308, lo: 0xbb, hi: 0xbf}, + // Block 0x47, offset 0x295 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x87}, + {value: 0xe045, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0xe045, lo: 0x98, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0xe045, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbf}, + // Block 0x48, offset 0x2a0 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x1318, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x49, offset 0x2a4 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x24c1, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x4a, offset 0x2ad + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x24f1, lo: 0xac, hi: 0xac}, + {value: 0x2529, lo: 0xad, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xae}, + {value: 0x2579, lo: 0xaf, hi: 0xaf}, + {value: 0x25b1, lo: 0xb0, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x4b, offset 0x2b5 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x9f}, + {value: 0x0080, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xad}, + {value: 0x0080, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x4c, offset 0x2bb + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa8}, + {value: 0x09c5, lo: 0xa9, hi: 0xa9}, + {value: 0x09e5, lo: 0xaa, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xbf}, + // Block 0x4d, offset 0x2c0 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x4e, offset 0x2c3 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0x4f, offset 0x2c6 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x28c1, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x50, offset 0x2ca + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0e66, lo: 0xb4, hi: 0xb4}, + {value: 0x292a, lo: 0xb5, hi: 0xb5}, + {value: 0x0e86, lo: 0xb6, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x51, offset 0x2d0 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9b}, + {value: 0x2941, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0xbf}, + // Block 0x52, offset 0x2d4 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x53, offset 0x2d8 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbc}, + {value: 0x0018, lo: 0xbd, hi: 0xbf}, + // Block 0x54, offset 0x2de + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0xab}, + {value: 0x0018, lo: 0xac, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x55, offset 0x2e5 + {value: 0x0000, lo: 0x05}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x03f5, lo: 0x90, hi: 0x9f}, + {value: 0x0ea5, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x56, offset 0x2eb + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x57, offset 0x2f3 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xae}, + {value: 0xe075, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0x58, offset 0x2fa + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x59, offset 0x305 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x1308, lo: 0xa0, hi: 0xbf}, + // Block 0x5a, offset 0x30f + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x5b, offset 0x313 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0xbf}, + // Block 0x5c, offset 0x316 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9e}, + {value: 0x0edd, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x5d, offset 0x31c + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb2}, + {value: 0x0efd, lo: 0xb3, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x5e, offset 0x320 + {value: 0x0020, lo: 0x01}, + {value: 0x0f1d, lo: 0x80, hi: 0xbf}, + // Block 0x5f, offset 0x322 + {value: 0x0020, lo: 0x02}, + {value: 0x171d, lo: 0x80, hi: 0x8f}, + {value: 0x18fd, lo: 0x90, hi: 0xbf}, + // Block 0x60, offset 0x325 + {value: 0x0020, lo: 0x01}, + {value: 0x1efd, lo: 0x80, hi: 0xbf}, + // Block 0x61, offset 0x327 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x62, offset 0x32a + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x1308, lo: 0x99, hi: 0x9a}, + {value: 0x29e2, lo: 0x9b, hi: 0x9b}, + {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9e}, + {value: 0x2a31, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x63, offset 0x334 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x2a69, lo: 0xbf, hi: 0xbf}, + // Block 0x64, offset 0x337 + {value: 0x0000, lo: 0x0e}, + {value: 0x0040, lo: 0x80, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xb0}, + {value: 0x2a1d, lo: 0xb1, hi: 0xb1}, + {value: 0x2a3d, lo: 0xb2, hi: 0xb2}, + {value: 0x2a5d, lo: 0xb3, hi: 0xb3}, + {value: 0x2a7d, lo: 0xb4, hi: 0xb4}, + {value: 0x2a5d, lo: 0xb5, hi: 0xb5}, + {value: 0x2a9d, lo: 0xb6, hi: 0xb6}, + {value: 0x2abd, lo: 0xb7, hi: 0xb7}, + {value: 0x2add, lo: 0xb8, hi: 0xb9}, + {value: 0x2afd, lo: 0xba, hi: 0xbb}, + {value: 0x2b1d, lo: 0xbc, hi: 0xbd}, + {value: 0x2afd, lo: 0xbe, hi: 0xbf}, + // Block 0x65, offset 0x346 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x66, offset 0x34a + {value: 0x0030, lo: 0x04}, + {value: 0x2aa2, lo: 0x80, hi: 0x9d}, + {value: 0x305a, lo: 0x9e, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x30a2, lo: 0xa0, hi: 0xbf}, + // Block 0x67, offset 0x34f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x68, offset 0x352 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x69, offset 0x356 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x6a, offset 0x35b + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0x6b, offset 0x360 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb1}, + {value: 0x0018, lo: 0xb2, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6c, offset 0x366 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xb7}, + {value: 0x2009, lo: 0xb8, hi: 0xb8}, + {value: 0x6e89, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xbf}, + // Block 0x6d, offset 0x36c + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x1308, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x85}, + {value: 0x1b08, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x1308, lo: 0x8b, hi: 0x8b}, + {value: 0x0008, lo: 0x8c, hi: 0xa2}, + {value: 0x1008, lo: 0xa3, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xa6}, + {value: 0x1008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x6e, offset 0x37b + {value: 0x0000, lo: 0x05}, + {value: 0x0208, lo: 0x80, hi: 0xb1}, + {value: 0x0108, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6f, offset 0x381 + {value: 0x0000, lo: 0x03}, + {value: 0x1008, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0xb3}, + {value: 0x1008, lo: 0xb4, hi: 0xbf}, + // Block 0x70, offset 0x385 + {value: 0x0000, lo: 0x0e}, + {value: 0x1008, lo: 0x80, hi: 0x83}, + {value: 0x1b08, lo: 0x84, hi: 0x84}, + {value: 0x1308, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x1308, lo: 0xa0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xba}, + {value: 0x0008, lo: 0xbb, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x71, offset 0x394 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x1308, lo: 0xa6, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x72, offset 0x399 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x1308, lo: 0x87, hi: 0x91}, + {value: 0x1008, lo: 0x92, hi: 0x92}, + {value: 0x1808, lo: 0x93, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x73, offset 0x3a1 + {value: 0x0000, lo: 0x09}, + {value: 0x1308, lo: 0x80, hi: 0x82}, + {value: 0x1008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xb3}, + {value: 0x1008, lo: 0xb4, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xb9}, + {value: 0x1008, lo: 0xba, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbc}, + {value: 0x1008, lo: 0xbd, hi: 0xbf}, + // Block 0x74, offset 0x3ab + {value: 0x0000, lo: 0x0a}, + {value: 0x1808, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x75, offset 0x3b6 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa8}, + {value: 0x1308, lo: 0xa9, hi: 0xae}, + {value: 0x1008, lo: 0xaf, hi: 0xb0}, + {value: 0x1308, lo: 0xb1, hi: 0xb2}, + {value: 0x1008, lo: 0xb3, hi: 0xb4}, + {value: 0x1308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x76, offset 0x3be + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x82}, + {value: 0x1308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8b}, + {value: 0x1308, lo: 0x8c, hi: 0x8c}, + {value: 0x1008, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbc}, + {value: 0x1008, lo: 0xbd, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0x77, offset 0x3cf + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x1308, lo: 0xb7, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbd}, + {value: 0x1308, lo: 0xbe, hi: 0xbf}, + // Block 0x78, offset 0x3d8 + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x9a}, + {value: 0x0008, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xaa}, + {value: 0x1008, lo: 0xab, hi: 0xab}, + {value: 0x1308, lo: 0xac, hi: 0xad}, + {value: 0x1008, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb4}, + {value: 0x1008, lo: 0xb5, hi: 0xb5}, + {value: 0x1b08, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x79, offset 0x3e8 + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x90}, + {value: 0x0008, lo: 0x91, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x7a, offset 0x3f5 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x4465, lo: 0x9c, hi: 0x9c}, + {value: 0x447d, lo: 0x9d, hi: 0x9d}, + {value: 0x2971, lo: 0x9e, hi: 0x9e}, + {value: 0xe06d, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xaf}, + {value: 0x4495, lo: 0xb0, hi: 0xbf}, + // Block 0x7b, offset 0x3ff + {value: 0x0000, lo: 0x04}, + {value: 0x44b5, lo: 0x80, hi: 0x8f}, + {value: 0x44d5, lo: 0x90, hi: 0x9f}, + {value: 0x44f5, lo: 0xa0, hi: 0xaf}, + {value: 0x44d5, lo: 0xb0, hi: 0xbf}, + // Block 0x7c, offset 0x404 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x1008, lo: 0xa3, hi: 0xa4}, + {value: 0x1308, lo: 0xa5, hi: 0xa5}, + {value: 0x1008, lo: 0xa6, hi: 0xa7}, + {value: 0x1308, lo: 0xa8, hi: 0xa8}, + {value: 0x1008, lo: 0xa9, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xab}, + {value: 0x1008, lo: 0xac, hi: 0xac}, + {value: 0x1b08, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x7d, offset 0x411 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x7e, offset 0x415 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x7f, offset 0x41a + {value: 0x0020, lo: 0x01}, + {value: 0x4515, lo: 0x80, hi: 0xbf}, + // Block 0x80, offset 0x41c + {value: 0x0020, lo: 0x03}, + {value: 0x4d15, lo: 0x80, hi: 0x94}, + {value: 0x4ad5, lo: 0x95, hi: 0x95}, + {value: 0x4fb5, lo: 0x96, hi: 0xbf}, + // Block 0x81, offset 0x420 + {value: 0x0020, lo: 0x01}, + {value: 0x54f5, lo: 0x80, hi: 0xbf}, + // Block 0x82, offset 0x422 + {value: 0x0020, lo: 0x03}, + {value: 0x5cf5, lo: 0x80, hi: 0x84}, + {value: 0x5655, lo: 0x85, hi: 0x85}, + {value: 0x5d95, lo: 0x86, hi: 0xbf}, + // Block 0x83, offset 0x426 + {value: 0x0020, lo: 0x08}, + {value: 0x6b55, lo: 0x80, hi: 0x8f}, + {value: 0x6d15, lo: 0x90, hi: 0x90}, + {value: 0x6d55, lo: 0x91, hi: 0xab}, + {value: 0x6ea1, lo: 0xac, hi: 0xac}, + {value: 0x70b5, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x70d5, lo: 0xb0, hi: 0xbf}, + // Block 0x84, offset 0x42f + {value: 0x0020, lo: 0x05}, + {value: 0x72d5, lo: 0x80, hi: 0xad}, + {value: 0x6535, lo: 0xae, hi: 0xae}, + {value: 0x7895, lo: 0xaf, hi: 0xb5}, + {value: 0x6f55, lo: 0xb6, hi: 0xb6}, + {value: 0x7975, lo: 0xb7, hi: 0xbf}, + // Block 0x85, offset 0x435 + {value: 0x0028, lo: 0x03}, + {value: 0x7c21, lo: 0x80, hi: 0x82}, + {value: 0x7be1, lo: 0x83, hi: 0x83}, + {value: 0x7c99, lo: 0x84, hi: 0xbf}, + // Block 0x86, offset 0x439 + {value: 0x0038, lo: 0x0f}, + {value: 0x9db1, lo: 0x80, hi: 0x83}, + {value: 0x9e59, lo: 0x84, hi: 0x85}, + {value: 0x9e91, lo: 0x86, hi: 0x87}, + {value: 0x9ec9, lo: 0x88, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0xa089, lo: 0x92, hi: 0x97}, + {value: 0xa1a1, lo: 0x98, hi: 0x9c}, + {value: 0xa281, lo: 0x9d, hi: 0xb3}, + {value: 0x9d41, lo: 0xb4, hi: 0xb4}, + {value: 0x9db1, lo: 0xb5, hi: 0xb5}, + {value: 0xa789, lo: 0xb6, hi: 0xbb}, + {value: 0xa869, lo: 0xbc, hi: 0xbc}, + {value: 0xa7f9, lo: 0xbd, hi: 0xbd}, + {value: 0xa8d9, lo: 0xbe, hi: 0xbf}, + // Block 0x87, offset 0x449 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x88, offset 0x453 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x89, offset 0x458 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x8a, offset 0x45b + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x8b, offset 0x461 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x8c, offset 0x468 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbc}, + {value: 0x1308, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x8d, offset 0x46d + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8e, offset 0x471 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x9f}, + {value: 0x1308, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x8f, offset 0x477 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x90, offset 0x47c + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x91, offset 0x485 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x92, offset 0x48a + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x93, offset 0x490 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x97}, + {value: 0x8ad5, lo: 0x98, hi: 0x9f}, + {value: 0x8aed, lo: 0xa0, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xbf}, + // Block 0x94, offset 0x497 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x8aed, lo: 0xb0, hi: 0xb7}, + {value: 0x8ad5, lo: 0xb8, hi: 0xbf}, + // Block 0x95, offset 0x49e + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x96, offset 0x4a5 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x97, offset 0x4a9 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xae}, + {value: 0x0018, lo: 0xaf, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x98, offset 0x4ae + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x99, offset 0x4b1 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xbf}, + // Block 0x9a, offset 0x4b6 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x9b, offset 0x4c2 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x9c, offset 0x4c8 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa6}, + {value: 0x0018, lo: 0xa7, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x9d, offset 0x4cd + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb3}, + {value: 0x0008, lo: 0xb4, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x9e, offset 0x4d4 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0018, lo: 0x96, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x9f, offset 0x4dc + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0xa0, offset 0x4e1 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xbf}, + // Block 0xa1, offset 0x4e5 + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x1308, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8b}, + {value: 0x1308, lo: 0x8c, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x94}, + {value: 0x0008, lo: 0x95, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xa2, offset 0x4f5 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbc}, + {value: 0x0018, lo: 0xbd, hi: 0xbf}, + // Block 0xa3, offset 0x4fc + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xa4, offset 0x500 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xbf}, + // Block 0xa5, offset 0x504 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbf}, + // Block 0xa6, offset 0x50b + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xa7, offset 0x50e + {value: 0x0000, lo: 0x02}, + {value: 0x03dd, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xa8, offset 0x511 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xa9, offset 0x515 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xaa, offset 0x519 + {value: 0x0000, lo: 0x05}, + {value: 0x1008, lo: 0x80, hi: 0x80}, + {value: 0x1308, lo: 0x81, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xbf}, + // Block 0xab, offset 0x51f + {value: 0x0000, lo: 0x08}, + {value: 0x1308, lo: 0x80, hi: 0x85}, + {value: 0x1b08, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xac, offset 0x528 + {value: 0x0000, lo: 0x0b}, + {value: 0x1308, lo: 0x80, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xaf}, + {value: 0x1008, lo: 0xb0, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xb6}, + {value: 0x1008, lo: 0xb7, hi: 0xb8}, + {value: 0x1b08, lo: 0xb9, hi: 0xb9}, + {value: 0x1308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbc}, + {value: 0x0340, lo: 0xbd, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0xad, offset 0x534 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xae, offset 0x53b + {value: 0x0000, lo: 0x08}, + {value: 0x1308, lo: 0x80, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa6}, + {value: 0x1308, lo: 0xa7, hi: 0xab}, + {value: 0x1008, lo: 0xac, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xb2}, + {value: 0x1b08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xbf}, + // Block 0xaf, offset 0x544 + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xb0, offset 0x54c + {value: 0x0000, lo: 0x06}, + {value: 0x1308, lo: 0x80, hi: 0x81}, + {value: 0x1008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb2}, + {value: 0x1008, lo: 0xb3, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xbe}, + {value: 0x1008, lo: 0xbf, hi: 0xbf}, + // Block 0xb1, offset 0x553 + {value: 0x0000, lo: 0x0d}, + {value: 0x1808, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x89}, + {value: 0x1308, lo: 0x8a, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xb2, offset 0x561 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0xab}, + {value: 0x1008, lo: 0xac, hi: 0xae}, + {value: 0x1308, lo: 0xaf, hi: 0xb1}, + {value: 0x1008, lo: 0xb2, hi: 0xb3}, + {value: 0x1308, lo: 0xb4, hi: 0xb4}, + {value: 0x1808, lo: 0xb5, hi: 0xb5}, + {value: 0x1308, lo: 0xb6, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbd}, + {value: 0x1308, lo: 0xbe, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xb3, offset 0x56e + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xb4, offset 0x57b + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x1308, lo: 0x9f, hi: 0x9f}, + {value: 0x1008, lo: 0xa0, hi: 0xa2}, + {value: 0x1308, lo: 0xa3, hi: 0xa9}, + {value: 0x1b08, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb5, offset 0x584 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x1008, lo: 0xb5, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xbf}, + // Block 0xb6, offset 0x588 + {value: 0x0000, lo: 0x0d}, + {value: 0x1008, lo: 0x80, hi: 0x81}, + {value: 0x1b08, lo: 0x82, hi: 0x82}, + {value: 0x1308, lo: 0x83, hi: 0x84}, + {value: 0x1008, lo: 0x85, hi: 0x85}, + {value: 0x1308, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xb7, offset 0x596 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x1008, lo: 0xb0, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xb8}, + {value: 0x1008, lo: 0xb9, hi: 0xb9}, + {value: 0x1308, lo: 0xba, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbe}, + {value: 0x1308, lo: 0xbf, hi: 0xbf}, + // Block 0xb8, offset 0x59e + {value: 0x0000, lo: 0x0a}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x1008, lo: 0x81, hi: 0x81}, + {value: 0x1b08, lo: 0x82, hi: 0x82}, + {value: 0x1308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xb9, offset 0x5a9 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x1008, lo: 0xaf, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x1008, lo: 0xb8, hi: 0xbb}, + {value: 0x1308, lo: 0xbc, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xba, offset 0x5b2 + {value: 0x0000, lo: 0x05}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9b}, + {value: 0x1308, lo: 0x9c, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xbb, offset 0x5b8 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x1008, lo: 0xb0, hi: 0xb2}, + {value: 0x1308, lo: 0xb3, hi: 0xba}, + {value: 0x1008, lo: 0xbb, hi: 0xbc}, + {value: 0x1308, lo: 0xbd, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbc, offset 0x5c0 + {value: 0x0000, lo: 0x08}, + {value: 0x1308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xbd, offset 0x5c9 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x1308, lo: 0xab, hi: 0xab}, + {value: 0x1008, lo: 0xac, hi: 0xac}, + {value: 0x1308, lo: 0xad, hi: 0xad}, + {value: 0x1008, lo: 0xae, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb5}, + {value: 0x1808, lo: 0xb6, hi: 0xb6}, + {value: 0x1308, lo: 0xb7, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0xbe, offset 0x5d3 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xbf, offset 0x5d6 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9f}, + {value: 0x1008, lo: 0xa0, hi: 0xa1}, + {value: 0x1308, lo: 0xa2, hi: 0xa5}, + {value: 0x1008, lo: 0xa6, hi: 0xa6}, + {value: 0x1308, lo: 0xa7, hi: 0xaa}, + {value: 0x1b08, lo: 0xab, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xc0, offset 0x5e2 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xbf}, + // Block 0xc1, offset 0x5e5 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xc2, offset 0x5ea + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xc3, offset 0x5ed + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xae}, + {value: 0x1008, lo: 0xaf, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x1308, lo: 0xb8, hi: 0xbd}, + {value: 0x1008, lo: 0xbe, hi: 0xbe}, + {value: 0x1b08, lo: 0xbf, hi: 0xbf}, + // Block 0xc4, offset 0x5f7 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xbf}, + // Block 0xc5, offset 0x600 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x1308, lo: 0x92, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa8}, + {value: 0x1008, lo: 0xa9, hi: 0xa9}, + {value: 0x1308, lo: 0xaa, hi: 0xb0}, + {value: 0x1008, lo: 0xb1, hi: 0xb1}, + {value: 0x1308, lo: 0xb2, hi: 0xb3}, + {value: 0x1008, lo: 0xb4, hi: 0xb4}, + {value: 0x1308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xc6, offset 0x60c + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xc7, offset 0x60f + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xc8, offset 0x614 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xc9, offset 0x617 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xbf}, + // Block 0xca, offset 0x61a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xbf}, + // Block 0xcb, offset 0x61d + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xcc, offset 0x624 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xcd, offset 0x62b + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x1308, lo: 0xb0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0xce, offset 0x62f + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0xcf, offset 0x63a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xd0, offset 0x63d + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x1008, lo: 0x91, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd1, offset 0x643 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8e}, + {value: 0x1308, lo: 0x8f, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xd2, offset 0x648 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0xd3, offset 0x64c + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xd4, offset 0x64f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xd5, offset 0x652 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0xbf}, + // Block 0xd6, offset 0x655 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0xd7, offset 0x65a + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9c}, + {value: 0x1308, lo: 0x9d, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x03c0, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xd8, offset 0x664 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xd9, offset 0x667 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xbf}, + // Block 0xda, offset 0x66b + {value: 0x0000, lo: 0x0e}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0xb5b9, lo: 0x9e, hi: 0x9e}, + {value: 0xb601, lo: 0x9f, hi: 0x9f}, + {value: 0xb649, lo: 0xa0, hi: 0xa0}, + {value: 0xb6b1, lo: 0xa1, hi: 0xa1}, + {value: 0xb719, lo: 0xa2, hi: 0xa2}, + {value: 0xb781, lo: 0xa3, hi: 0xa3}, + {value: 0xb7e9, lo: 0xa4, hi: 0xa4}, + {value: 0x1018, lo: 0xa5, hi: 0xa6}, + {value: 0x1318, lo: 0xa7, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xac}, + {value: 0x1018, lo: 0xad, hi: 0xb2}, + {value: 0x0340, lo: 0xb3, hi: 0xba}, + {value: 0x1318, lo: 0xbb, hi: 0xbf}, + // Block 0xdb, offset 0x67a + {value: 0x0000, lo: 0x0b}, + {value: 0x1318, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x84}, + {value: 0x1318, lo: 0x85, hi: 0x8b}, + {value: 0x0018, lo: 0x8c, hi: 0xa9}, + {value: 0x1318, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xba}, + {value: 0xb851, lo: 0xbb, hi: 0xbb}, + {value: 0xb899, lo: 0xbc, hi: 0xbc}, + {value: 0xb8e1, lo: 0xbd, hi: 0xbd}, + {value: 0xb949, lo: 0xbe, hi: 0xbe}, + {value: 0xb9b1, lo: 0xbf, hi: 0xbf}, + // Block 0xdc, offset 0x686 + {value: 0x0000, lo: 0x03}, + {value: 0xba19, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xbf}, + // Block 0xdd, offset 0x68a + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x1318, lo: 0x82, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0xbf}, + // Block 0xde, offset 0x68f + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xdf, offset 0x694 + {value: 0x0000, lo: 0x03}, + {value: 0x1308, lo: 0x80, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xba}, + {value: 0x1308, lo: 0xbb, hi: 0xbf}, + // Block 0xe0, offset 0x698 + {value: 0x0000, lo: 0x04}, + {value: 0x1308, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xb4}, + {value: 0x1308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0xe1, offset 0x69d + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x1308, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9a}, + {value: 0x1308, lo: 0x9b, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x1308, lo: 0xa1, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0xe2, offset 0x6a6 + {value: 0x0000, lo: 0x0a}, + {value: 0x1308, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x1308, lo: 0x88, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9a}, + {value: 0x1308, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x1308, lo: 0xa3, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xa5}, + {value: 0x1308, lo: 0xa6, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0xe3, offset 0x6b1 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8f}, + {value: 0x1308, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xe4, offset 0x6b7 + {value: 0x0000, lo: 0x07}, + {value: 0x0208, lo: 0x80, hi: 0x83}, + {value: 0x1308, lo: 0x84, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xe5, offset 0x6bf + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xe6, offset 0x6c3 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0xe7, offset 0x6c7 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0xe8, offset 0x6cd + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xe9, offset 0x6d3 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0xc1c1, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xea, offset 0x6d8 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xbf}, + // Block 0xeb, offset 0x6db + {value: 0x0000, lo: 0x0d}, + {value: 0xc7e9, lo: 0x80, hi: 0x80}, + {value: 0xc839, lo: 0x81, hi: 0x81}, + {value: 0xc889, lo: 0x82, hi: 0x82}, + {value: 0xc8d9, lo: 0x83, hi: 0x83}, + {value: 0xc929, lo: 0x84, hi: 0x84}, + {value: 0xc979, lo: 0x85, hi: 0x85}, + {value: 0xc9c9, lo: 0x86, hi: 0x86}, + {value: 0xca19, lo: 0x87, hi: 0x87}, + {value: 0xca69, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0xcab9, lo: 0x90, hi: 0x90}, + {value: 0xcad9, lo: 0x91, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0xbf}, + // Block 0xec, offset 0x6e9 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xed, offset 0x6f0 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0xee, offset 0x6f3 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0xbf}, + // Block 0xef, offset 0x6f6 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0xf0, offset 0x6fa + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0xf1, offset 0x700 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0xf2, offset 0x705 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb2}, + {value: 0x0018, lo: 0xb3, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xf3, offset 0x70f + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xbf}, + // Block 0xf4, offset 0x714 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0xbf}, + // Block 0xf5, offset 0x717 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0xbf}, + // Block 0xf6, offset 0x71a + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0xf7, offset 0x71d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xf8, offset 0x720 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0xf9, offset 0x724 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xbf}, + // Block 0xfa, offset 0x727 + {value: 0x0020, lo: 0x0f}, + {value: 0xdeb9, lo: 0x80, hi: 0x89}, + {value: 0x8dfd, lo: 0x8a, hi: 0x8a}, + {value: 0xdff9, lo: 0x8b, hi: 0x9c}, + {value: 0x8e1d, lo: 0x9d, hi: 0x9d}, + {value: 0xe239, lo: 0x9e, hi: 0xa2}, + {value: 0x8e3d, lo: 0xa3, hi: 0xa3}, + {value: 0xe2d9, lo: 0xa4, hi: 0xab}, + {value: 0x7ed5, lo: 0xac, hi: 0xac}, + {value: 0xe3d9, lo: 0xad, hi: 0xaf}, + {value: 0x8e5d, lo: 0xb0, hi: 0xb0}, + {value: 0xe439, lo: 0xb1, hi: 0xb6}, + {value: 0x8e7d, lo: 0xb7, hi: 0xb9}, + {value: 0xe4f9, lo: 0xba, hi: 0xba}, + {value: 0x8edd, lo: 0xbb, hi: 0xbb}, + {value: 0xe519, lo: 0xbc, hi: 0xbf}, + // Block 0xfb, offset 0x737 + {value: 0x0020, lo: 0x10}, + {value: 0x937d, lo: 0x80, hi: 0x80}, + {value: 0xf099, lo: 0x81, hi: 0x86}, + {value: 0x939d, lo: 0x87, hi: 0x8a}, + {value: 0xd9f9, lo: 0x8b, hi: 0x8b}, + {value: 0xf159, lo: 0x8c, hi: 0x96}, + {value: 0x941d, lo: 0x97, hi: 0x97}, + {value: 0xf2b9, lo: 0x98, hi: 0xa3}, + {value: 0x943d, lo: 0xa4, hi: 0xa6}, + {value: 0xf439, lo: 0xa7, hi: 0xaa}, + {value: 0x949d, lo: 0xab, hi: 0xab}, + {value: 0xf4b9, lo: 0xac, hi: 0xac}, + {value: 0x94bd, lo: 0xad, hi: 0xad}, + {value: 0xf4d9, lo: 0xae, hi: 0xaf}, + {value: 0x94dd, lo: 0xb0, hi: 0xb1}, + {value: 0xf519, lo: 0xb2, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xfc, offset 0x748 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0340, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x9f}, + {value: 0x0340, lo: 0xa0, hi: 0xbf}, + // Block 0xfd, offset 0x74d + {value: 0x0000, lo: 0x01}, + {value: 0x0340, lo: 0x80, hi: 0xbf}, + // Block 0xfe, offset 0x74f + {value: 0x0000, lo: 0x01}, + {value: 0x13c0, lo: 0x80, hi: 0xbf}, + // Block 0xff, offset 0x751 + {value: 0x0000, lo: 0x02}, + {value: 0x13c0, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, +} + +// Total table size 41559 bytes (40KiB); checksum: F4A1FA4E diff --git a/vendor/golang.org/x/net/idna/trie.go b/vendor/golang.org/x/net/idna/trie.go new file mode 100644 index 0000000000000..c4ef847e7a37d --- /dev/null +++ b/vendor/golang.org/x/net/idna/trie.go @@ -0,0 +1,72 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package idna + +// appendMapping appends the mapping for the respective rune. isMapped must be +// true. A mapping is a categorization of a rune as defined in UTS #46. +func (c info) appendMapping(b []byte, s string) []byte { + index := int(c >> indexShift) + if c&xorBit == 0 { + s := mappings[index:] + return append(b, s[1:s[0]+1]...) + } + b = append(b, s...) + if c&inlineXOR == inlineXOR { + // TODO: support and handle two-byte inline masks + b[len(b)-1] ^= byte(index) + } else { + for p := len(b) - int(xorData[index]); p < len(b); p++ { + index++ + b[p] ^= xorData[index] + } + } + return b +} + +// Sparse block handling code. + +type valueRange struct { + value uint16 // header: value:stride + lo, hi byte // header: lo:n +} + +type sparseBlocks struct { + values []valueRange + offset []uint16 +} + +var idnaSparse = sparseBlocks{ + values: idnaSparseValues[:], + offset: idnaSparseOffset[:], +} + +// Don't use newIdnaTrie to avoid unconditional linking in of the table. +var trie = &idnaTrie{} + +// lookup determines the type of block n and looks up the value for b. +// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block +// is a list of ranges with an accompanying value. Given a matching range r, +// the value for b is by r.value + (b - r.lo) * stride. +func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { + offset := t.offset[n] + header := t.values[offset] + lo := offset + 1 + hi := lo + uint16(header.lo) + for lo < hi { + m := lo + (hi-lo)/2 + r := t.values[m] + if r.lo <= b && b <= r.hi { + return r.value + uint16(b-r.lo)*header.value + } + if b < r.lo { + hi = m + } else { + lo = m + 1 + } + } + return 0 +} diff --git a/vendor/golang.org/x/net/idna/trieval.go b/vendor/golang.org/x/net/idna/trieval.go new file mode 100644 index 0000000000000..63cb03b59b120 --- /dev/null +++ b/vendor/golang.org/x/net/idna/trieval.go @@ -0,0 +1,114 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package idna + +// This file contains definitions for interpreting the trie value of the idna +// trie generated by "go run gen*.go". It is shared by both the generator +// program and the resultant package. Sharing is achieved by the generator +// copying gen_trieval.go to trieval.go and changing what's above this comment. + +// info holds information from the IDNA mapping table for a single rune. It is +// the value returned by a trie lookup. In most cases, all information fits in +// a 16-bit value. For mappings, this value may contain an index into a slice +// with the mapped string. Such mappings can consist of the actual mapped value +// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the +// input rune. This technique is used by the cases packages and reduces the +// table size significantly. +// +// The per-rune values have the following format: +// +// if mapped { +// if inlinedXOR { +// 15..13 inline XOR marker +// 12..11 unused +// 10..3 inline XOR mask +// } else { +// 15..3 index into xor or mapping table +// } +// } else { +// 15..13 unused +// 12 modifier (including virama) +// 11 virama modifier +// 10..8 joining type +// 7..3 category type +// } +// 2 use xor pattern +// 1..0 mapped category +// +// See the definitions below for a more detailed description of the various +// bits. +type info uint16 + +const ( + catSmallMask = 0x3 + catBigMask = 0xF8 + indexShift = 3 + xorBit = 0x4 // interpret the index as an xor pattern + inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined. + + joinShift = 8 + joinMask = 0x07 + + viramaModifier = 0x0800 + modifier = 0x1000 +) + +// A category corresponds to a category defined in the IDNA mapping table. +type category uint16 + +const ( + unknown category = 0 // not defined currently in unicode. + mapped category = 1 + disallowedSTD3Mapped category = 2 + deviation category = 3 +) + +const ( + valid category = 0x08 + validNV8 category = 0x18 + validXV8 category = 0x28 + disallowed category = 0x40 + disallowedSTD3Valid category = 0x80 + ignored category = 0xC0 +) + +// join types and additional rune information +const ( + joiningL = (iota + 1) + joiningD + joiningT + joiningR + + //the following types are derived during processing + joinZWJ + joinZWNJ + joinVirama + numJoinTypes +) + +func (c info) isMapped() bool { + return c&0x3 != 0 +} + +func (c info) category() category { + small := c & catSmallMask + if small != 0 { + return category(small) + } + return category(c & catBigMask) +} + +func (c info) joinType() info { + if c.isMapped() { + return 0 + } + return (c >> joinShift) & joinMask +} + +func (c info) isModifier() bool { + return c&(modifier|catSmallMask) == modifier +} + +func (c info) isViramaModifier() bool { + return c&(viramaModifier|catSmallMask) == viramaModifier +} diff --git a/vendor/golang.org/x/net/internal/timeseries/timeseries.go b/vendor/golang.org/x/net/internal/timeseries/timeseries.go index 3f90b7300d458..4b24137ffbc61 100644 --- a/vendor/golang.org/x/net/internal/timeseries/timeseries.go +++ b/vendor/golang.org/x/net/internal/timeseries/timeseries.go @@ -371,7 +371,7 @@ func (ts *timeSeries) ComputeRange(start, finish time.Time, num int) []Observabl } } - // Failed to find a level that covers the desired range. So just + // Failed to find a level that covers the desired range. So just // extract from the last level, even if it doesn't cover the entire // desired range. ts.extract(ts.levels[len(ts.levels)-1], start, finish, num, results) diff --git a/vendor/golang.org/x/net/proxy/per_host.go b/vendor/golang.org/x/net/proxy/per_host.go index f540b196f7d44..242d5623f8016 100644 --- a/vendor/golang.org/x/net/proxy/per_host.go +++ b/vendor/golang.org/x/net/proxy/per_host.go @@ -9,7 +9,7 @@ import ( "strings" ) -// A PerHost directs connections to a default Dialer unless the hostname +// A PerHost directs connections to a default Dialer unless the host name // requested matches one of a number of exceptions. type PerHost struct { def, bypass Dialer @@ -76,7 +76,7 @@ func (p *PerHost) dialerForRequest(host string) Dialer { // AddFromString parses a string that contains comma-separated values // specifying hosts that should use the bypass proxy. Each value is either an -// IP address, a CIDR range, a zone (*.example.com) or a hostname +// IP address, a CIDR range, a zone (*.example.com) or a host name // (localhost). A best effort is made to parse the string and errors are // ignored. func (p *PerHost) AddFromString(s string) { @@ -131,7 +131,7 @@ func (p *PerHost) AddZone(zone string) { p.bypassZones = append(p.bypassZones, zone) } -// AddHost specifies a hostname that will use the bypass proxy. +// AddHost specifies a host name that will use the bypass proxy. func (p *PerHost) AddHost(host string) { if strings.HasSuffix(host, ".") { host = host[:len(host)-1] diff --git a/vendor/golang.org/x/net/proxy/proxy.go b/vendor/golang.org/x/net/proxy/proxy.go index 8ccb0c5f756f8..9f232f8b5b70e 100644 --- a/vendor/golang.org/x/net/proxy/proxy.go +++ b/vendor/golang.org/x/net/proxy/proxy.go @@ -11,6 +11,7 @@ import ( "net" "net/url" "os" + "sync" ) // A Dialer is a means to establish a connection. @@ -27,7 +28,7 @@ type Auth struct { // FromEnvironment returns the dialer specified by the proxy related variables in // the environment. func FromEnvironment() Dialer { - allProxy := os.Getenv("all_proxy") + allProxy := allProxyEnv.Get() if len(allProxy) == 0 { return Direct } @@ -41,7 +42,7 @@ func FromEnvironment() Dialer { return Direct } - noProxy := os.Getenv("no_proxy") + noProxy := noProxyEnv.Get() if len(noProxy) == 0 { return proxy } @@ -92,3 +93,42 @@ func FromURL(u *url.URL, forward Dialer) (Dialer, error) { return nil, errors.New("proxy: unknown scheme: " + u.Scheme) } + +var ( + allProxyEnv = &envOnce{ + names: []string{"ALL_PROXY", "all_proxy"}, + } + noProxyEnv = &envOnce{ + names: []string{"NO_PROXY", "no_proxy"}, + } +) + +// envOnce looks up an environment variable (optionally by multiple +// names) once. It mitigates expensive lookups on some platforms +// (e.g. Windows). +// (Borrowed from net/http/transport.go) +type envOnce struct { + names []string + once sync.Once + val string +} + +func (e *envOnce) Get() string { + e.once.Do(e.init) + return e.val +} + +func (e *envOnce) init() { + for _, n := range e.names { + e.val = os.Getenv(n) + if e.val != "" { + return + } + } +} + +// reset is used by tests +func (e *envOnce) reset() { + e.once = sync.Once{} + e.val = "" +} diff --git a/vendor/golang.org/x/net/proxy/socks5.go b/vendor/golang.org/x/net/proxy/socks5.go index 9b9628239a131..2efec6e8d7e56 100644 --- a/vendor/golang.org/x/net/proxy/socks5.go +++ b/vendor/golang.org/x/net/proxy/socks5.go @@ -72,24 +72,28 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { if err != nil { return nil, err } - closeConn := &conn - defer func() { - if closeConn != nil { - (*closeConn).Close() - } - }() + if err := s.connect(conn, addr); err != nil { + conn.Close() + return nil, err + } + return conn, nil +} - host, portStr, err := net.SplitHostPort(addr) +// connect takes an existing connection to a socks5 proxy server, +// and commands the server to extend that connection to target, +// which must be a canonical address with a host and port. +func (s *socks5) connect(conn net.Conn, target string) error { + host, portStr, err := net.SplitHostPort(target) if err != nil { - return nil, err + return err } port, err := strconv.Atoi(portStr) if err != nil { - return nil, errors.New("proxy: failed to parse port number: " + portStr) + return errors.New("proxy: failed to parse port number: " + portStr) } if port < 1 || port > 0xffff { - return nil, errors.New("proxy: port number out of range: " + portStr) + return errors.New("proxy: port number out of range: " + portStr) } // the size here is just an estimate @@ -103,17 +107,17 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { } if _, err := conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if buf[0] != 5 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) } if buf[1] == 0xff { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") } if buf[1] == socks5AuthPassword { @@ -125,15 +129,15 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { buf = append(buf, s.password...) if _, err := conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if buf[1] != 0 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") } } @@ -150,7 +154,7 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { buf = append(buf, ip...) } else { if len(host) > 255 { - return nil, errors.New("proxy: destination hostname too long: " + host) + return errors.New("proxy: destination host name too long: " + host) } buf = append(buf, socks5Domain) buf = append(buf, byte(len(host))) @@ -159,11 +163,11 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { buf = append(buf, byte(port>>8), byte(port)) if _, err := conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if _, err := io.ReadFull(conn, buf[:4]); err != nil { - return nil, errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } failure := "unknown error" @@ -172,7 +176,7 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { } if len(failure) > 0 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) } bytesToDiscard := 0 @@ -184,11 +188,11 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { case socks5Domain: _, err := io.ReadFull(conn, buf[:1]) if err != nil { - return nil, errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } bytesToDiscard = int(buf[0]) default: - return nil, errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) + return errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) } if cap(buf) < bytesToDiscard { @@ -197,14 +201,13 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { buf = buf[:bytesToDiscard] } if _, err := io.ReadFull(conn, buf); err != nil { - return nil, errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } // Also need to discard the port number if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } - closeConn = nil - return conn, nil + return nil } diff --git a/vendor/golang.org/x/net/trace/BUILD b/vendor/golang.org/x/net/trace/BUILD index c43efc450800d..4af84f24e5279 100644 --- a/vendor/golang.org/x/net/trace/BUILD +++ b/vendor/golang.org/x/net/trace/BUILD @@ -6,6 +6,8 @@ go_library( "events.go", "histogram.go", "trace.go", + "trace_go16.go", + "trace_go17.go", ], visibility = ["//visibility:public"], deps = [ diff --git a/vendor/golang.org/x/net/trace/events.go b/vendor/golang.org/x/net/trace/events.go index d8daec1a791fb..c646a6952e5e3 100644 --- a/vendor/golang.org/x/net/trace/events.go +++ b/vendor/golang.org/x/net/trace/events.go @@ -39,9 +39,9 @@ var buckets = []bucket{ } // RenderEvents renders the HTML page typically served at /debug/events. -// It does not do any auth checking; see AuthRequest for the default auth check -// used by the handler registered on http.DefaultServeMux. -// req may be nil. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Events handler. func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) { now := time.Now() data := &struct { diff --git a/vendor/golang.org/x/net/trace/trace.go b/vendor/golang.org/x/net/trace/trace.go index 9eb55e7fd4496..7d112ba613a1a 100644 --- a/vendor/golang.org/x/net/trace/trace.go +++ b/vendor/golang.org/x/net/trace/trace.go @@ -77,7 +77,6 @@ import ( "sync/atomic" "time" - "golang.org/x/net/context" "golang.org/x/net/internal/timeseries" ) @@ -111,30 +110,46 @@ var AuthRequest = func(req *http.Request) (any, sensitive bool) { } func init() { - http.HandleFunc("/debug/requests", func(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - w.Header().Set("Content-Type", "text/html; charset=utf-8") - Render(w, req, sensitive) - }) - http.HandleFunc("/debug/events", func(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - w.Header().Set("Content-Type", "text/html; charset=utf-8") - RenderEvents(w, req, sensitive) - }) + // TODO(jbd): Serve Traces from /debug/traces in the future? + // There is no requirement for a request to be present to have traces. + http.HandleFunc("/debug/requests", Traces) + http.HandleFunc("/debug/events", Events) +} + +// Traces responds with traces from the program. +// The package initialization registers it in http.DefaultServeMux +// at /debug/requests. +// +// It performs authorization by running AuthRequest. +func Traces(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + Render(w, req, sensitive) +} + +// Events responds with a page of events collected by EventLogs. +// The package initialization registers it in http.DefaultServeMux +// at /debug/events. +// +// It performs authorization by running AuthRequest. +func Events(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + RenderEvents(w, req, sensitive) } // Render renders the HTML page typically served at /debug/requests. -// It does not do any auth checking; see AuthRequest for the default auth check -// used by the handler registered on http.DefaultServeMux. -// req may be nil. +// It does not do any auth checking. The request may be nil. +// +// Most users will use the Traces handler. func Render(w io.Writer, req *http.Request, sensitive bool) { data := &struct { Families []string @@ -271,18 +286,6 @@ type contextKeyT string var contextKey = contextKeyT("golang.org/x/net/trace.Trace") -// NewContext returns a copy of the parent context -// and associates it with a Trace. -func NewContext(ctx context.Context, tr Trace) context.Context { - return context.WithValue(ctx, contextKey, tr) -} - -// FromContext returns the Trace bound to the context, if any. -func FromContext(ctx context.Context) (tr Trace, ok bool) { - tr, ok = ctx.Value(contextKey).(Trace) - return -} - // Trace represents an active request. type Trace interface { // LazyLog adds x to the event log. It will be evaluated each time the diff --git a/vendor/golang.org/x/net/trace/trace_go16.go b/vendor/golang.org/x/net/trace/trace_go16.go new file mode 100644 index 0000000000000..d6081911853f5 --- /dev/null +++ b/vendor/golang.org/x/net/trace/trace_go16.go @@ -0,0 +1,21 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.7 + +package trace + +import "golang.org/x/net/context" + +// NewContext returns a copy of the parent context +// and associates it with a Trace. +func NewContext(ctx context.Context, tr Trace) context.Context { + return context.WithValue(ctx, contextKey, tr) +} + +// FromContext returns the Trace bound to the context, if any. +func FromContext(ctx context.Context) (tr Trace, ok bool) { + tr, ok = ctx.Value(contextKey).(Trace) + return +} diff --git a/vendor/golang.org/x/net/trace/trace_go17.go b/vendor/golang.org/x/net/trace/trace_go17.go new file mode 100644 index 0000000000000..df6e1fba7cafa --- /dev/null +++ b/vendor/golang.org/x/net/trace/trace_go17.go @@ -0,0 +1,21 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.7 + +package trace + +import "context" + +// NewContext returns a copy of the parent context +// and associates it with a Trace. +func NewContext(ctx context.Context, tr Trace) context.Context { + return context.WithValue(ctx, contextKey, tr) +} + +// FromContext returns the Trace bound to the context, if any. +func FromContext(ctx context.Context) (tr Trace, ok bool) { + tr, ok = ctx.Value(contextKey).(Trace) + return +} diff --git a/vendor/golang.org/x/text/cases/BUILD b/vendor/golang.org/x/text/cases/BUILD index 80ec339c6099e..934a5eb1753aa 100644 --- a/vendor/golang.org/x/text/cases/BUILD +++ b/vendor/golang.org/x/text/cases/BUILD @@ -11,8 +11,10 @@ go_library( "tables.go", "trieval.go", ], + cgo = True, visibility = ["//visibility:public"], deps = [ + "//vendor/golang.org/x/text/internal:go_default_library", "//vendor/golang.org/x/text/language:go_default_library", "//vendor/golang.org/x/text/transform:go_default_library", "//vendor/golang.org/x/text/unicode/norm:go_default_library", diff --git a/vendor/golang.org/x/text/cases/cases.go b/vendor/golang.org/x/text/cases/cases.go index 13b3a5716d9f4..cf70630e1212b 100644 --- a/vendor/golang.org/x/text/cases/cases.go +++ b/vendor/golang.org/x/text/cases/cases.go @@ -35,7 +35,7 @@ import ( // A Caser may be stateful and should therefore not be shared between // goroutines. type Caser struct { - t transform.Transformer + t transform.SpanningTransformer } // Bytes returns a new byte slice with the result of converting b to the case @@ -56,12 +56,17 @@ func (c Caser) String(s string) string { // Transform. func (c Caser) Reset() { c.t.Reset() } -// Transform implements the Transformer interface and transforms the given input -// to the case form implemented by c. +// Transform implements the transform.Transformer interface and transforms the +// given input to the case form implemented by c. func (c Caser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { return c.t.Transform(dst, src, atEOF) } +// Span implements the transform.SpanningTransformer interface. +func (c Caser) Span(src []byte, atEOF bool) (n int, err error) { + return c.t.Span(src, atEOF) +} + // Upper returns a Caser for language-specific uppercasing. func Upper(t language.Tag, opts ...Option) Caser { return Caser{makeUpper(t, getOpts(opts...))} @@ -83,14 +88,20 @@ func Title(t language.Tag, opts ...Option) Caser { // // Case folding does not normalize the input and may not preserve a normal form. // Use the collate or search package for more convenient and linguistically -// sound comparisons. Use unicode/precis for string comparisons where security -// aspects are a concern. +// sound comparisons. Use golang.org/x/text/secure/precis for string comparisons +// where security aspects are a concern. func Fold(opts ...Option) Caser { return Caser{makeFold(getOpts(opts...))} } // An Option is used to modify the behavior of a Caser. -type Option func(o *options) +type Option func(o options) options + +// TODO: consider these options to take a boolean as well, like FinalSigma. +// The advantage of using this approach is that other providers of a lower-case +// algorithm could set different defaults by prefixing a user-provided slice +// of options with their own. This is handy, for instance, for the precis +// package which would override the default to not handle the Greek final sigma. var ( // NoLower disables the lowercasing of non-leading letters for a title @@ -110,20 +121,42 @@ type options struct { // TODO: segmenter, max ignorable, alternative versions, etc. - noFinalSigma bool // Only used for testing. + ignoreFinalSigma bool } func getOpts(o ...Option) (res options) { for _, f := range o { - f(&res) + res = f(res) } return } -func noLower(o *options) { +func noLower(o options) options { o.noLower = true + return o } -func compact(o *options) { +func compact(o options) options { o.simple = true + return o +} + +// HandleFinalSigma specifies whether the special handling of Greek final sigma +// should be enabled. Unicode prescribes handling the Greek final sigma for all +// locales, but standards like IDNA and PRECIS override this default. +func HandleFinalSigma(enable bool) Option { + if enable { + return handleFinalSigma + } + return ignoreFinalSigma +} + +func ignoreFinalSigma(o options) options { + o.ignoreFinalSigma = true + return o +} + +func handleFinalSigma(o options) options { + o.ignoreFinalSigma = false + return o } diff --git a/vendor/golang.org/x/text/cases/context.go b/vendor/golang.org/x/text/cases/context.go index 0d2e497ebc367..e9aa9e1936fa2 100644 --- a/vendor/golang.org/x/text/cases/context.go +++ b/vendor/golang.org/x/text/cases/context.go @@ -4,9 +4,7 @@ package cases -import ( - "golang.org/x/text/transform" -) +import "golang.org/x/text/transform" // A context is used for iterating over source bytes, fetching case info and // writing to a destination buffer. @@ -56,6 +54,14 @@ func (c *context) ret() (nDst, nSrc int, err error) { return c.nDst, c.nSrc, transform.ErrShortSrc } +// retSpan returns the return values for the Span method. It checks whether +// there were insufficient bytes in src to complete and introduces an error +// accordingly, if necessary. +func (c *context) retSpan() (n int, err error) { + _, nSrc, err := c.ret() + return nSrc, err +} + // checkpoint sets the return value buffer points for Transform to the current // positions. func (c *context) checkpoint() { @@ -200,6 +206,23 @@ func lower(c *context) bool { return c.copy() } +func isLower(c *context) bool { + ct := c.caseType() + if c.info&hasMappingMask == 0 || ct == cLower { + return true + } + if c.info&exceptionBit == 0 { + c.err = transform.ErrEndOfSpan + return false + } + e := exceptions[c.info>>exceptionShift:] + if nLower := (e[1] >> lengthBits) & lengthMask; nLower != noChange { + c.err = transform.ErrEndOfSpan + return false + } + return true +} + // upper writes the uppercase version of the current rune to dst. func upper(c *context) bool { ct := c.caseType() @@ -226,6 +249,29 @@ func upper(c *context) bool { return c.copy() } +// isUpper writes the isUppercase version of the current rune to dst. +func isUpper(c *context) bool { + ct := c.caseType() + if c.info&hasMappingMask == 0 || ct == cUpper { + return true + } + if c.info&exceptionBit == 0 { + c.err = transform.ErrEndOfSpan + return false + } + e := exceptions[c.info>>exceptionShift:] + // Get length of first special case mapping. + n := (e[1] >> lengthBits) & lengthMask + if ct == cTitle { + n = e[1] & lengthMask + } + if n != noChange { + c.err = transform.ErrEndOfSpan + return false + } + return true +} + // title writes the title case version of the current rune to dst. func title(c *context) bool { ct := c.caseType() @@ -257,6 +303,33 @@ func title(c *context) bool { return c.copy() } +// isTitle reports whether the current rune is in title case. +func isTitle(c *context) bool { + ct := c.caseType() + if c.info&hasMappingMask == 0 || ct == cTitle { + return true + } + if c.info&exceptionBit == 0 { + if ct == cLower { + c.err = transform.ErrEndOfSpan + return false + } + return true + } + // Get the exception data. + e := exceptions[c.info>>exceptionShift:] + if nTitle := e[1] & lengthMask; nTitle != noChange { + c.err = transform.ErrEndOfSpan + return false + } + nFirst := (e[1] >> lengthBits) & lengthMask + if ct == cLower && nFirst != noChange { + c.err = transform.ErrEndOfSpan + return false + } + return true +} + // foldFull writes the foldFull version of the current rune to dst. func foldFull(c *context) bool { if c.info&hasMappingMask == 0 { @@ -279,3 +352,25 @@ func foldFull(c *context) bool { } return c.writeString(e[2 : 2+n]) } + +// isFoldFull reports whether the current run is mapped to foldFull +func isFoldFull(c *context) bool { + if c.info&hasMappingMask == 0 { + return true + } + ct := c.caseType() + if c.info&exceptionBit == 0 { + if ct != cLower || c.info&inverseFoldBit != 0 { + c.err = transform.ErrEndOfSpan + return false + } + return true + } + e := exceptions[c.info>>exceptionShift:] + n := e[0] & lengthMask + if n == 0 && ct == cLower { + return true + } + c.err = transform.ErrEndOfSpan + return false +} diff --git a/vendor/golang.org/x/text/cases/fold.go b/vendor/golang.org/x/text/cases/fold.go index e95bfa8ea2665..85cc434fac0f6 100644 --- a/vendor/golang.org/x/text/cases/fold.go +++ b/vendor/golang.org/x/text/cases/fold.go @@ -18,7 +18,15 @@ func (t *caseFolder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err return c.ret() } -func makeFold(o options) transform.Transformer { +func (t *caseFolder) Span(src []byte, atEOF bool) (n int, err error) { + c := context{src: src, atEOF: atEOF} + for c.next() && isFoldFull(&c) { + c.checkpoint() + } + return c.retSpan() +} + +func makeFold(o options) transform.SpanningTransformer { // TODO: Special case folding, through option Language, Special/Turkic, or // both. // TODO: Implement Compact options. diff --git a/vendor/golang.org/x/text/cases/gen.go b/vendor/golang.org/x/text/cases/gen.go index f46170fca1e72..24b72300396de 100644 --- a/vendor/golang.org/x/text/cases/gen.go +++ b/vendor/golang.org/x/text/cases/gen.go @@ -76,7 +76,7 @@ type breakCategory int const ( breakBreak breakCategory = iota breakLetter - breakIgnored + breakMid ) // mapping returns the case mapping for the given case type. @@ -162,9 +162,14 @@ func parseUCD() []runeInfo { // We collapse the word breaking properties onto the categories we need. switch p.String(1) { // TODO: officially we need to canonicalize. - case "Format", "MidLetter", "MidNumLet", "Single_Quote": - ri.BreakCat = breakIgnored - case "ALetter", "Hebrew_Letter", "Numeric", "Extend", "ExtendNumLet": + case "MidLetter", "MidNumLet", "Single_Quote": + ri.BreakCat = breakMid + if !ri.CaseIgnorable { + // finalSigma relies on the fact that all breakMid runes are + // also a Case_Ignorable. Revisit this code when this changes. + log.Fatalf("Rune %U, which has a break category mid, is not a case ignorable", ri) + } + case "ALetter", "Hebrew_Letter", "Numeric", "Extend", "ExtendNumLet", "Format", "ZWJ": ri.BreakCat = breakLetter } }) @@ -240,8 +245,11 @@ func makeEntry(ri *runeInfo) { case above: // Above ccc = cccAbove } - if ri.BreakCat == breakBreak { + switch ri.BreakCat { + case breakBreak: ccc = cccBreak + case breakMid: + ri.entry |= isMidBit } ri.entry |= ccc @@ -588,7 +596,7 @@ func verifyProperties(chars []runeInfo) { // decomposition is greater than U+00FF, the rune is always // great and not a modifier. if f := runes[0]; unicode.IsMark(f) || f > 0xFF && !unicode.Is(unicode.Greek, f) { - log.Fatalf("%U: expeced first rune of Greek decomposition to be letter, found %U", r, f) + log.Fatalf("%U: expected first rune of Greek decomposition to be letter, found %U", r, f) } // A.6.2: Any follow-up rune in a Greek decomposition is a // modifier of which the first should be gobbled in @@ -597,7 +605,7 @@ func verifyProperties(chars []runeInfo) { switch m { case 0x0313, 0x0314, 0x0301, 0x0300, 0x0306, 0x0342, 0x0308, 0x0304, 0x345: default: - log.Fatalf("%U: modifier %U is outside of expeced Greek modifier set", r, m) + log.Fatalf("%U: modifier %U is outside of expected Greek modifier set", r, m) } } } @@ -690,7 +698,7 @@ func genTablesTest() { parse("auxiliary/WordBreakProperty.txt", func(p *ucd.Parser) { switch p.String(1) { case "Extend", "Format", "MidLetter", "MidNumLet", "Single_Quote", - "ALetter", "Hebrew_Letter", "Numeric", "ExtendNumLet": + "ALetter", "Hebrew_Letter", "Numeric", "ExtendNumLet", "ZWJ": notBreak[p.Rune(0)] = true } }) diff --git a/vendor/golang.org/x/text/cases/gen_trieval.go b/vendor/golang.org/x/text/cases/gen_trieval.go index cf1a99d5e5e42..376d22c8f9d5c 100644 --- a/vendor/golang.org/x/text/cases/gen_trieval.go +++ b/vendor/golang.org/x/text/cases/gen_trieval.go @@ -26,6 +26,7 @@ package main // Only 13..8 are used for XOR patterns. // 7 inverseFold (fold to upper, not to lower) // 6 index: interpret the XOR pattern as an index +// or isMid if case mode is cIgnorableUncased. // 5..4 CCC: zero (normal or break), above or other // } // 3 exception: interpret this value as an exception index @@ -48,6 +49,7 @@ const ( ignorableValue = 0x0004 inverseFoldBit = 1 << 7 + isMidBit = 1 << 6 exceptionBit = 1 << 3 exceptionShift = 5 @@ -57,7 +59,7 @@ const ( xorShift = 8 // There is no mapping if all xor bits and the exception bit are zero. - hasMappingMask = 0xffc0 | exceptionBit + hasMappingMask = 0xff80 | exceptionBit ) // The case mode bits encodes the case type of a rune. This includes uncased, @@ -95,10 +97,6 @@ func (c info) isCaseIgnorable() bool { return c&ignorableMask == ignorableValue } -func (c info) isCaseIgnorableAndNonBreakStarter() bool { - return c&(fullCasedMask|cccMask) == (ignorableValue | cccZero) -} - func (c info) isNotCasedAndNotCaseIgnorable() bool { return c&fullCasedMask == 0 } @@ -107,6 +105,10 @@ func (c info) isCaseIgnorableAndNotCased() bool { return c&fullCasedMask == cIgnorableUncased } +func (c info) isMid() bool { + return c&(fullCasedMask|isMidBit) == isMidBit|cIgnorableUncased +} + // The case mapping implementation will need to know about various Canonical // Combining Class (CCC) values. We encode two of these in the trie value: // cccZero (0) and cccAbove (230). If the value is cccOther, it means that diff --git a/vendor/golang.org/x/text/cases/icu.go b/vendor/golang.org/x/text/cases/icu.go new file mode 100644 index 0000000000000..46530d1e40855 --- /dev/null +++ b/vendor/golang.org/x/text/cases/icu.go @@ -0,0 +1,61 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build icu + +package cases + +// Ideally these functions would be defined in a test file, but go test doesn't +// allow CGO in tests. The build tag should ensure either way that these +// functions will not end up in the package. + +// TODO: Ensure that the correct ICU version is set. + +/* +#cgo LDFLAGS: -licui18n.57 -licuuc.57 +#include +#include +#include +#include +#include +*/ +import "C" + +import "unsafe" + +func doICU(tag, caser, input string) string { + err := C.UErrorCode(0) + loc := C.CString(tag) + cm := C.ucasemap_open(loc, C.uint32_t(0), &err) + + buf := make([]byte, len(input)*4) + dst := (*C.char)(unsafe.Pointer(&buf[0])) + src := C.CString(input) + + cn := C.int32_t(0) + + switch caser { + case "fold": + cn = C.ucasemap_utf8FoldCase(cm, + dst, C.int32_t(len(buf)), + src, C.int32_t(len(input)), + &err) + case "lower": + cn = C.ucasemap_utf8ToLower(cm, + dst, C.int32_t(len(buf)), + src, C.int32_t(len(input)), + &err) + case "upper": + cn = C.ucasemap_utf8ToUpper(cm, + dst, C.int32_t(len(buf)), + src, C.int32_t(len(input)), + &err) + case "title": + cn = C.ucasemap_utf8ToTitle(cm, + dst, C.int32_t(len(buf)), + src, C.int32_t(len(input)), + &err) + } + return string(buf[:cn]) +} diff --git a/vendor/golang.org/x/text/cases/info.go b/vendor/golang.org/x/text/cases/info.go index 669d7ae1fae74..3b51f03d681b3 100644 --- a/vendor/golang.org/x/text/cases/info.go +++ b/vendor/golang.org/x/text/cases/info.go @@ -28,9 +28,6 @@ func (c info) cccType() info { // only makes sense, though, if the performance and/or space penalty of using // the generic breaker is big. Extra data will only be needed for non-cased // runes, which means there are sufficient bits left in the caseType. -// Also note that the standard breaking algorithm doesn't always make sense -// for title casing. For example, a4a -> A4a, but a"4a -> A"4A (where " stands -// for modifier \u0308). // ICU prohibits breaking in such cases as well. // For the purpose of title casing we use an approximation of the Unicode Word @@ -41,17 +38,19 @@ func (c info) cccType() info { // categories, with associated rules: // // 1) Letter: -// ALetter, Hebrew_Letter, Numeric, ExtendNumLet, Extend. +// ALetter, Hebrew_Letter, Numeric, ExtendNumLet, Extend, Format_FE, ZWJ. // Rule: Never break between consecutive runes of this category. // // 2) Mid: -// Format, MidLetter, MidNumLet, Single_Quote. -// (Cf. case-ignorable: MidLetter, MidNumLet or cat is Mn, Me, Cf, Lm or Sk). +// MidLetter, MidNumLet, Single_Quote. +// (Cf. case-ignorable: MidLetter, MidNumLet, Single_Quote or cat is Mn, +// Me, Cf, Lm or Sk). // Rule: Don't break between Letter and Mid, but break between two Mids. // // 3) Break: -// Any other category, including NewLine, CR, LF and Double_Quote. These -// categories should always result in a break between two cased letters. +// Any other category: NewLine, MidNum, CR, LF, Double_Quote, Katakana, and +// Other. +// These categories should always result in a break between two cased letters. // Rule: Always break. // // Note 1: the Katakana and MidNum categories can, in esoteric cases, result in diff --git a/vendor/golang.org/x/text/cases/map.go b/vendor/golang.org/x/text/cases/map.go index f2a8e96d09e7b..4baebaaa6ef29 100644 --- a/vendor/golang.org/x/text/cases/map.go +++ b/vendor/golang.org/x/text/cases/map.go @@ -13,6 +13,7 @@ import ( "unicode" "unicode/utf8" + "golang.org/x/text/internal" "golang.org/x/text/language" "golang.org/x/text/transform" "golang.org/x/text/unicode/norm" @@ -24,6 +25,11 @@ import ( // dst so far won't need changing as we see more source bytes. type mapFunc func(*context) bool +// A spanFunc takes a context set to the current rune and returns whether this +// rune would be altered when written to the output. It may advance the context +// to the next rune. It returns whether a checkpoint is possible. +type spanFunc func(*context) bool + // maxIgnorable defines the maximum number of ignorables to consider for // lookahead operations. const maxIgnorable = 30 @@ -36,12 +42,12 @@ func init() { for _, s := range strings.Split(supported, " ") { tags = append(tags, language.MustParse(s)) } - matcher = language.NewMatcher(tags) + matcher = internal.NewInheritanceMatcher(tags) Supported = language.NewCoverage(tags) } var ( - matcher language.Matcher + matcher *internal.InheritanceMatcher Supported language.Coverage @@ -50,56 +56,69 @@ var ( // Some uppercase mappers are stateless, so we can precompute the // Transformers and save a bit on runtime allocations. - upperFunc = []mapFunc{ - nil, // und - nil, // af - aztrUpper(upper), // az - elUpper, // el - ltUpper(upper), // lt - nil, // nl - aztrUpper(upper), // tr + upperFunc = []struct { + upper mapFunc + span spanFunc + }{ + {nil, nil}, // und + {nil, nil}, // af + {aztrUpper(upper), isUpper}, // az + {elUpper, noSpan}, // el + {ltUpper(upper), noSpan}, // lt + {nil, nil}, // nl + {aztrUpper(upper), isUpper}, // tr } - undUpper transform.Transformer = &undUpperCaser{} + undUpper transform.SpanningTransformer = &undUpperCaser{} + undLower transform.SpanningTransformer = &undLowerCaser{} + undLowerIgnoreSigma transform.SpanningTransformer = &undLowerIgnoreSigmaCaser{} lowerFunc = []mapFunc{ - lower, // und - lower, // af + nil, // und + nil, // af aztrLower, // az - lower, // el + nil, // el ltLower, // lt - lower, // nl + nil, // nl aztrLower, // tr } titleInfos = []struct { - title, lower mapFunc - rewrite func(*context) + title mapFunc + lower mapFunc + titleSpan spanFunc + rewrite func(*context) }{ - {title, lower, nil}, // und - {title, lower, afnlRewrite}, // af - {aztrUpper(title), aztrLower, nil}, // az - {title, lower, nil}, // el - {ltUpper(title), ltLower, nil}, // lt - {nlTitle, lower, afnlRewrite}, // nl - {aztrUpper(title), aztrLower, nil}, // tr + {title, lower, isTitle, nil}, // und + {title, lower, isTitle, afnlRewrite}, // af + {aztrUpper(title), aztrLower, isTitle, nil}, // az + {title, lower, isTitle, nil}, // el + {ltUpper(title), ltLower, noSpan, nil}, // lt + {nlTitle, lower, nlTitleSpan, afnlRewrite}, // nl + {aztrUpper(title), aztrLower, isTitle, nil}, // tr } ) -func makeUpper(t language.Tag, o options) transform.Transformer { +func makeUpper(t language.Tag, o options) transform.SpanningTransformer { _, i, _ := matcher.Match(t) - f := upperFunc[i] + f := upperFunc[i].upper if f == nil { return undUpper } - return &simpleCaser{f: f} + return &simpleCaser{f: f, span: upperFunc[i].span} } -func makeLower(t language.Tag, o options) transform.Transformer { +func makeLower(t language.Tag, o options) transform.SpanningTransformer { _, i, _ := matcher.Match(t) f := lowerFunc[i] - if o.noFinalSigma { - return &simpleCaser{f: f} + if f == nil { + if o.ignoreFinalSigma { + return undLowerIgnoreSigma + } + return undLower + } + if o.ignoreFinalSigma { + return &simpleCaser{f: f, span: isLower} } return &lowerCaser{ first: f, @@ -107,22 +126,28 @@ func makeLower(t language.Tag, o options) transform.Transformer { } } -func makeTitle(t language.Tag, o options) transform.Transformer { +func makeTitle(t language.Tag, o options) transform.SpanningTransformer { _, i, _ := matcher.Match(t) x := &titleInfos[i] lower := x.lower if o.noLower { lower = (*context).copy - } else if !o.noFinalSigma { + } else if !o.ignoreFinalSigma { lower = finalSigma(lower) } return &titleCaser{ - title: x.title, - lower: lower, - rewrite: x.rewrite, + title: x.title, + lower: lower, + titleSpan: x.titleSpan, + rewrite: x.rewrite, } } +func noSpan(c *context) bool { + c.err = transform.ErrEndOfSpan + return false +} + // TODO: consider a similar special case for the fast majority lower case. This // is a bit more involved so will require some more precise benchmarking to // justify it. @@ -132,7 +157,7 @@ type undUpperCaser struct{ transform.NopResetter } // undUpperCaser implements the Transformer interface for doing an upper case // mapping for the root locale (und). It eliminates the need for an allocation // as it prevents escaping by not using function pointers. -func (t *undUpperCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { +func (t undUpperCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { c := context{dst: dst, src: src, atEOF: atEOF} for c.next() { upper(&c) @@ -141,26 +166,117 @@ func (t *undUpperCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, return c.ret() } +func (t undUpperCaser) Span(src []byte, atEOF bool) (n int, err error) { + c := context{src: src, atEOF: atEOF} + for c.next() && isUpper(&c) { + c.checkpoint() + } + return c.retSpan() +} + +// undLowerIgnoreSigmaCaser implements the Transformer interface for doing +// a lower case mapping for the root locale (und) ignoring final sigma +// handling. This casing algorithm is used in some performance-critical packages +// like secure/precis and x/net/http/idna, which warrants its special-casing. +type undLowerIgnoreSigmaCaser struct{ transform.NopResetter } + +func (t undLowerIgnoreSigmaCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + c := context{dst: dst, src: src, atEOF: atEOF} + for c.next() && lower(&c) { + c.checkpoint() + } + return c.ret() + +} + +// Span implements a generic lower-casing. This is possible as isLower works +// for all lowercasing variants. All lowercase variants only vary in how they +// transform a non-lowercase letter. They will never change an already lowercase +// letter. In addition, there is no state. +func (t undLowerIgnoreSigmaCaser) Span(src []byte, atEOF bool) (n int, err error) { + c := context{src: src, atEOF: atEOF} + for c.next() && isLower(&c) { + c.checkpoint() + } + return c.retSpan() +} + type simpleCaser struct { context - f mapFunc + f mapFunc + span spanFunc } // simpleCaser implements the Transformer interface for doing a case operation // on a rune-by-rune basis. func (t *simpleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - t.context = context{dst: dst, src: src, atEOF: atEOF} - c := &t.context - for c.next() && t.f(c) { + c := context{dst: dst, src: src, atEOF: atEOF} + for c.next() && t.f(&c) { + c.checkpoint() + } + return c.ret() +} + +func (t *simpleCaser) Span(src []byte, atEOF bool) (n int, err error) { + c := context{src: src, atEOF: atEOF} + for c.next() && t.span(&c) { + c.checkpoint() + } + return c.retSpan() +} + +// undLowerCaser implements the Transformer interface for doing a lower case +// mapping for the root locale (und) ignoring final sigma handling. This casing +// algorithm is used in some performance-critical packages like secure/precis +// and x/net/http/idna, which warrants its special-casing. +type undLowerCaser struct{ transform.NopResetter } + +func (t undLowerCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + c := context{dst: dst, src: src, atEOF: atEOF} + + for isInterWord := true; c.next(); { + if isInterWord { + if c.info.isCased() { + if !lower(&c) { + break + } + isInterWord = false + } else if !c.copy() { + break + } + } else { + if c.info.isNotCasedAndNotCaseIgnorable() { + if !c.copy() { + break + } + isInterWord = true + } else if !c.hasPrefix("Σ") { + if !lower(&c) { + break + } + } else if !finalSigmaBody(&c) { + break + } + } c.checkpoint() } return c.ret() } +func (t undLowerCaser) Span(src []byte, atEOF bool) (n int, err error) { + c := context{src: src, atEOF: atEOF} + for c.next() && isLower(&c) { + c.checkpoint() + } + return c.retSpan() +} + // lowerCaser implements the Transformer interface. The default Unicode lower // casing requires different treatment for the first and subsequent characters // of a word, most notably to handle the Greek final Sigma. type lowerCaser struct { + undLowerIgnoreSigmaCaser + context first, midWord mapFunc @@ -202,7 +318,9 @@ type titleCaser struct { context // rune mappings used by the actual casing algorithms. - title, lower mapFunc + title mapFunc + lower mapFunc + titleSpan spanFunc rewrite func(*context) } @@ -228,10 +346,10 @@ func (t *titleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err t.rewrite(c) } - wasMid := p.isCaseIgnorableAndNonBreakStarter() + wasMid := p.isMid() // Break out of this loop on failure to ensure we do not modify the // state incorrectly. - if p.isCased() && !p.isCaseIgnorableAndNotCased() { + if p.isCased() { if !c.isMidWord { if !t.title(c) { break @@ -242,26 +360,69 @@ func (t *titleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err } } else if !c.copy() { break + } else if p.isBreak() { + c.isMidWord = false + } + + // As we save the state of the transformer, it is safe to call + // checkpoint after any successful write. + if !(c.isMidWord && wasMid) { + c.checkpoint() } - // TODO: make this an "else if" if we can prove that no rune that does - // not match the first condition of the if statement can be a break. - if p.isBreak() { + if !c.next() { + break + } + if wasMid && c.info.isMid() { c.isMidWord = false } + } + return c.ret() +} + +func (t *titleCaser) Span(src []byte, atEOF bool) (n int, err error) { + t.context = context{src: src, atEOF: atEOF, isMidWord: t.isMidWord} + c := &t.context + + if !c.next() { + return c.retSpan() + } + + for { + p := c.info + if t.rewrite != nil { + t.rewrite(c) + } + wasMid := p.isMid() + // Break out of this loop on failure to ensure we do not modify the + // state incorrectly. + if p.isCased() { + if !c.isMidWord { + if !t.titleSpan(c) { + break + } + c.isMidWord = true + } else if !isLower(c) { + break + } + } else if p.isBreak() { + c.isMidWord = false + } // As we save the state of the transformer, it is safe to call // checkpoint after any successful write. - c.checkpoint() + if !(c.isMidWord && wasMid) { + c.checkpoint() + } if !c.next() { break } - if wasMid && c.info.isCaseIgnorableAndNonBreakStarter() { + if wasMid && c.info.isMid() { c.isMidWord = false } } - return c.ret() + return c.retSpan() } // finalSigma adds Greek final Sigma handing to another casing function. It @@ -269,44 +430,69 @@ func (t *titleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err // case-ignorables and a cased letters. func finalSigma(f mapFunc) mapFunc { return func(c *context) bool { - // ::NFD(); - // # 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA - // Σ } [:case-ignorable:]* [:cased:] → σ; - // [:cased:] [:case-ignorable:]* { Σ → ς; - // ::Any-Lower; - // ::NFC(); - if !c.hasPrefix("Σ") { return f(c) } + return finalSigmaBody(c) + } +} - p := c.pDst - c.writeString("ς") - // We need to do one more iteration after maxIgnorable, as a cased - // letter is not an ignorable and may modify the result. - for i := 0; i < maxIgnorable+1; i++ { - if !c.next() { - return false - } - if !c.info.isCaseIgnorable() { - if c.info.isCased() { - // p+1 is guaranteed to be in bounds: if writing ς was - // successful, p+1 will contain the second byte of ς. If not, - // this function will have returned after c.next returned false. - c.dst[p+1]++ // ς → σ - } - c.unreadRune() - return true +func finalSigmaBody(c *context) bool { + // Current rune must be ∑. + + // ::NFD(); + // # 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA + // Σ } [:case-ignorable:]* [:cased:] → σ; + // [:cased:] [:case-ignorable:]* { Σ → ς; + // ::Any-Lower; + // ::NFC(); + + p := c.pDst + c.writeString("ς") + + // TODO: we should do this here, but right now this will never have an + // effect as this is called when the prefix is Sigma, whereas Dutch and + // Afrikaans only test for an apostrophe. + // + // if t.rewrite != nil { + // t.rewrite(c) + // } + + // We need to do one more iteration after maxIgnorable, as a cased + // letter is not an ignorable and may modify the result. + wasMid := false + for i := 0; i < maxIgnorable+1; i++ { + if !c.next() { + return false + } + if !c.info.isCaseIgnorable() { + // All Midword runes are also case ignorable, so we are + // guaranteed to have a letter or word break here. As we are + // unreading the run, there is no need to unset c.isMidWord; + // the title caser will handle this. + if c.info.isCased() { + // p+1 is guaranteed to be in bounds: if writing ς was + // successful, p+1 will contain the second byte of ς. If not, + // this function will have returned after c.next returned false. + c.dst[p+1]++ // ς → σ } - // A case ignorable may also introduce a word break, so we may need - // to continue searching even after detecting a break. - c.isMidWord = c.isMidWord && !c.info.isBreak() - c.copy() + c.unreadRune() + return true } - return true + // A case ignorable may also introduce a word break, so we may need + // to continue searching even after detecting a break. + isMid := c.info.isMid() + if (wasMid && isMid) || c.info.isBreak() { + c.isMidWord = false + } + wasMid = isMid + c.copy() } + return true } +// finalSigmaSpan would be the same as isLower. + // elUpper implements Greek upper casing, which entails removing a predefined // set of non-blocked modifiers. Note that these accents should not be removed // for title casing! @@ -376,6 +562,8 @@ func elUpper(c *context) bool { return i == maxIgnorable } +// TODO: implement elUpperSpan (low-priority: complex and infrequent). + func ltLower(c *context) bool { // From CLDR: // # Introduce an explicit dot above when lowercasing capital I's and J's @@ -390,10 +578,10 @@ func ltLower(c *context) bool { // ::NFD(); // I } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0307; // J } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → j \u0307; - // Į } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → į \u0307; - // Ì → i \u0307 \u0300; - // Í → i \u0307 \u0301; - // Ĩ → i \u0307 \u0303; + // I \u0328 (Į) } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0328 \u0307; + // I \u0300 (Ì) → i \u0307 \u0300; + // I \u0301 (Í) → i \u0307 \u0301; + // I \u0303 (Ĩ) → i \u0307 \u0303; // ::Any-Lower(); // ::NFC(); @@ -445,9 +633,16 @@ func ltLower(c *context) bool { return i == maxIgnorable } +// ltLowerSpan would be the same as isLower. + func ltUpper(f mapFunc) mapFunc { return func(c *context) bool { + // Unicode: + // 0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE + // // From CLDR: + // # Remove \u0307 following soft-dotteds (i, j, and the like), with possible + // # intervening non-230 marks. // ::NFD(); // [:Soft_Dotted:] [^[:ccc=Not_Reordered:][:ccc=Above:]]* { \u0307 → ; // ::Any-Upper(); @@ -511,6 +706,8 @@ func ltUpper(f mapFunc) mapFunc { } } +// TODO: implement ltUpperSpan (low priority: complex and infrequent). + func aztrUpper(f mapFunc) mapFunc { return func(c *context) bool { // i→İ; @@ -571,6 +768,8 @@ Loop: return c.writeString("ı") && c.writeBytes(c.src[start:c.pSrc+c.sz]) && done } +// aztrLowerSpan would be the same as isLower. + func nlTitle(c *context) bool { // From CLDR: // # Special titlecasing for Dutch initial "ij". @@ -591,6 +790,24 @@ func nlTitle(c *context) bool { return true } +func nlTitleSpan(c *context) bool { + // From CLDR: + // # Special titlecasing for Dutch initial "ij". + // ::Any-Title(); + // # Fix up Ij at the beginning of a "word" (per Any-Title, notUAX #29) + // [:^WB=ALetter:] [:WB=Extend:]* [[:WB=MidLetter:][:WB=MidNumLet:]]? { Ij } → IJ ; + if c.src[c.pSrc] != 'I' { + return isTitle(c) + } + if !c.next() || c.src[c.pSrc] == 'j' { + return false + } + if c.src[c.pSrc] != 'J' { + c.unreadRune() + } + return true +} + // Not part of CLDR, but see http://unicode.org/cldr/trac/ticket/7078. func afnlRewrite(c *context) { if c.hasPrefix("'") || c.hasPrefix("’") { diff --git a/vendor/golang.org/x/text/cases/tables.go b/vendor/golang.org/x/text/cases/tables.go index 4257e57aef2c8..e6e95a68542ae 100644 --- a/vendor/golang.org/x/text/cases/tables.go +++ b/vendor/golang.org/x/text/cases/tables.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package cases @@ -216,7 +216,7 @@ func (t *caseTrie) lookupStringUnsafe(s string) uint16 { return 0 } -// caseTrie. Total size: 11750 bytes (11.47 KiB). Checksum: 9ec26581a3006e0d. +// caseTrie. Total size: 11742 bytes (11.47 KiB). Checksum: 147a11466b427436. type caseTrie struct{} func newCaseTrie(i int) *caseTrie { @@ -238,10 +238,10 @@ func (t *caseTrie) lookupValue(n uint32, b byte) uint16 { // The third block is the zero block. var caseValues = [1280]uint16{ // Block 0x0, offset 0x0 - 0x27: 0x0014, - 0x2e: 0x0014, + 0x27: 0x0054, + 0x2e: 0x0054, 0x30: 0x0010, 0x31: 0x0010, 0x32: 0x0010, 0x33: 0x0010, 0x34: 0x0010, 0x35: 0x0010, - 0x36: 0x0010, 0x37: 0x0010, 0x38: 0x0010, 0x39: 0x0010, 0x3a: 0x0014, + 0x36: 0x0010, 0x37: 0x0010, 0x38: 0x0010, 0x39: 0x0010, 0x3a: 0x0054, // Block 0x1, offset 0x40 0x41: 0x2013, 0x42: 0x2013, 0x43: 0x2013, 0x44: 0x2013, 0x45: 0x2013, 0x46: 0x2013, 0x47: 0x2013, 0x48: 0x2013, 0x49: 0x2013, 0x4a: 0x2013, 0x4b: 0x2013, @@ -316,7 +316,7 @@ var caseValues = [1280]uint16{ 0x1fc: 0x5052, 0x1fd: 0x5052, 0x1ff: 0x5353, // Block 0x8, offset 0x200 0x204: 0x0004, 0x205: 0x0004, - 0x206: 0x2a13, 0x207: 0x0014, 0x208: 0x2513, 0x209: 0x2713, 0x20a: 0x2513, + 0x206: 0x2a13, 0x207: 0x0054, 0x208: 0x2513, 0x209: 0x2713, 0x20a: 0x2513, 0x20c: 0x5653, 0x20e: 0x5953, 0x20f: 0x5c53, 0x210: 0x1e2a, 0x211: 0x2013, 0x212: 0x2013, 0x213: 0x2013, 0x214: 0x2013, 0x215: 0x2013, 0x216: 0x2013, 0x217: 0x2013, 0x218: 0x2013, 0x219: 0x2013, 0x21a: 0x2013, 0x21b: 0x2013, 0x21c: 0x2013, 0x21d: 0x2013, @@ -571,10 +571,10 @@ var caseIndex = [1600]uint16{ } // sparseOffsets: 272 entries, 544 bytes -var sparseOffsets = []uint16{0x0, 0x9, 0xf, 0x18, 0x24, 0x2e, 0x3a, 0x3d, 0x41, 0x44, 0x48, 0x52, 0x54, 0x59, 0x69, 0x70, 0x75, 0x83, 0x84, 0x92, 0xa1, 0xab, 0xae, 0xb4, 0xbc, 0xbe, 0xc0, 0xce, 0xd4, 0xe2, 0xed, 0xf8, 0x103, 0x10f, 0x119, 0x124, 0x12f, 0x13b, 0x147, 0x14f, 0x157, 0x161, 0x16c, 0x178, 0x17e, 0x189, 0x18e, 0x196, 0x199, 0x19e, 0x1a2, 0x1a6, 0x1ad, 0x1b6, 0x1be, 0x1bf, 0x1c8, 0x1cf, 0x1d7, 0x1dd, 0x1e3, 0x1e8, 0x1ec, 0x1ef, 0x1f1, 0x1f4, 0x1f9, 0x1fa, 0x1fc, 0x1fe, 0x200, 0x207, 0x20c, 0x210, 0x219, 0x21c, 0x21f, 0x225, 0x226, 0x231, 0x232, 0x233, 0x238, 0x245, 0x24d, 0x255, 0x25e, 0x267, 0x270, 0x275, 0x278, 0x281, 0x28e, 0x290, 0x297, 0x299, 0x2a4, 0x2a5, 0x2b0, 0x2b8, 0x2c2, 0x2c8, 0x2c9, 0x2d7, 0x2dc, 0x2df, 0x2e4, 0x2e8, 0x2ee, 0x2f3, 0x2f6, 0x2fb, 0x300, 0x301, 0x307, 0x309, 0x30a, 0x30c, 0x30e, 0x311, 0x312, 0x314, 0x317, 0x31d, 0x321, 0x323, 0x329, 0x330, 0x334, 0x33d, 0x33e, 0x346, 0x34a, 0x34f, 0x357, 0x35d, 0x363, 0x36d, 0x372, 0x37b, 0x381, 0x388, 0x38c, 0x394, 0x396, 0x398, 0x39b, 0x39d, 0x39f, 0x3a0, 0x3a1, 0x3a3, 0x3a5, 0x3ab, 0x3b0, 0x3b2, 0x3b8, 0x3bb, 0x3bd, 0x3c3, 0x3c8, 0x3ca, 0x3cb, 0x3cc, 0x3cd, 0x3cf, 0x3d1, 0x3d3, 0x3d6, 0x3d8, 0x3db, 0x3e3, 0x3e6, 0x3ea, 0x3f2, 0x3f4, 0x3f5, 0x3f6, 0x3f8, 0x3fe, 0x400, 0x401, 0x403, 0x405, 0x407, 0x414, 0x415, 0x416, 0x41a, 0x41c, 0x41d, 0x41e, 0x41f, 0x420, 0x424, 0x428, 0x42e, 0x430, 0x437, 0x43a, 0x43e, 0x444, 0x44d, 0x453, 0x459, 0x463, 0x46d, 0x46f, 0x476, 0x47c, 0x482, 0x488, 0x48b, 0x491, 0x494, 0x49c, 0x49d, 0x4a4, 0x4a5, 0x4a8, 0x4a9, 0x4af, 0x4b2, 0x4ba, 0x4bb, 0x4bc, 0x4bd, 0x4be, 0x4c0, 0x4c2, 0x4c4, 0x4c8, 0x4c9, 0x4cb, 0x4cc, 0x4cd, 0x4cf, 0x4d4, 0x4d9, 0x4dd, 0x4de, 0x4e1, 0x4e5, 0x4f0, 0x4f4, 0x4fc, 0x501, 0x505, 0x508, 0x50c, 0x50f, 0x512, 0x517, 0x51b, 0x51f, 0x523, 0x527, 0x529, 0x52b, 0x52e, 0x533, 0x535, 0x53a, 0x543, 0x548, 0x549, 0x54c, 0x54d, 0x54e, 0x550, 0x551, 0x552} +var sparseOffsets = []uint16{0x0, 0x9, 0xf, 0x18, 0x24, 0x2e, 0x3a, 0x3d, 0x41, 0x44, 0x48, 0x52, 0x54, 0x59, 0x69, 0x70, 0x75, 0x83, 0x84, 0x92, 0xa1, 0xab, 0xae, 0xb4, 0xbc, 0xbe, 0xc0, 0xce, 0xd4, 0xe2, 0xed, 0xf8, 0x103, 0x10f, 0x119, 0x124, 0x12f, 0x13b, 0x147, 0x14f, 0x157, 0x161, 0x16c, 0x178, 0x17e, 0x189, 0x18e, 0x196, 0x199, 0x19e, 0x1a2, 0x1a6, 0x1ad, 0x1b6, 0x1be, 0x1bf, 0x1c8, 0x1cf, 0x1d7, 0x1dd, 0x1e3, 0x1e8, 0x1ec, 0x1ef, 0x1f1, 0x1f4, 0x1f9, 0x1fa, 0x1fc, 0x1fe, 0x200, 0x207, 0x20c, 0x210, 0x219, 0x21c, 0x21f, 0x225, 0x226, 0x231, 0x232, 0x233, 0x238, 0x245, 0x24d, 0x255, 0x25e, 0x267, 0x270, 0x275, 0x278, 0x281, 0x28e, 0x290, 0x297, 0x299, 0x2a4, 0x2a5, 0x2b0, 0x2b8, 0x2c0, 0x2c6, 0x2c7, 0x2d5, 0x2da, 0x2dd, 0x2e2, 0x2e6, 0x2ec, 0x2f1, 0x2f4, 0x2f9, 0x2fe, 0x2ff, 0x305, 0x307, 0x308, 0x30a, 0x30c, 0x30f, 0x310, 0x312, 0x315, 0x31b, 0x31f, 0x321, 0x327, 0x32e, 0x332, 0x33b, 0x33c, 0x344, 0x348, 0x34d, 0x355, 0x35b, 0x361, 0x36b, 0x370, 0x379, 0x37f, 0x386, 0x38a, 0x392, 0x394, 0x396, 0x399, 0x39b, 0x39d, 0x39e, 0x39f, 0x3a1, 0x3a3, 0x3a9, 0x3ae, 0x3b0, 0x3b6, 0x3b9, 0x3bb, 0x3c1, 0x3c6, 0x3c8, 0x3c9, 0x3ca, 0x3cb, 0x3cd, 0x3cf, 0x3d1, 0x3d4, 0x3d6, 0x3d9, 0x3e1, 0x3e4, 0x3e8, 0x3f0, 0x3f2, 0x3f3, 0x3f4, 0x3f6, 0x3fc, 0x3fe, 0x3ff, 0x401, 0x403, 0x405, 0x412, 0x413, 0x414, 0x418, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x422, 0x426, 0x42c, 0x42e, 0x435, 0x438, 0x43c, 0x442, 0x44b, 0x451, 0x457, 0x461, 0x46b, 0x46d, 0x474, 0x47a, 0x480, 0x486, 0x489, 0x48f, 0x492, 0x49a, 0x49b, 0x4a2, 0x4a3, 0x4a6, 0x4a7, 0x4ad, 0x4b0, 0x4b8, 0x4b9, 0x4ba, 0x4bb, 0x4bc, 0x4be, 0x4c0, 0x4c2, 0x4c6, 0x4c7, 0x4c9, 0x4ca, 0x4cb, 0x4cd, 0x4d2, 0x4d7, 0x4db, 0x4dc, 0x4df, 0x4e3, 0x4ee, 0x4f2, 0x4fa, 0x4ff, 0x503, 0x506, 0x50a, 0x50d, 0x510, 0x515, 0x519, 0x51d, 0x521, 0x525, 0x527, 0x529, 0x52c, 0x531, 0x533, 0x538, 0x541, 0x546, 0x547, 0x54a, 0x54b, 0x54c, 0x54e, 0x54f, 0x550} -// sparseValues: 1362 entries, 5448 bytes -var sparseValues = [1362]valueRange{ +// sparseValues: 1360 entries, 5440 bytes +var sparseValues = [1360]valueRange{ // Block 0x0, offset 0x0 {value: 0x0004, lo: 0xa8, hi: 0xa8}, {value: 0x0012, lo: 0xaa, hi: 0xaa}, @@ -582,7 +582,7 @@ var sparseValues = [1362]valueRange{ {value: 0x0004, lo: 0xaf, hi: 0xaf}, {value: 0x0004, lo: 0xb4, hi: 0xb4}, {value: 0x002a, lo: 0xb5, hi: 0xb5}, - {value: 0x0014, lo: 0xb7, hi: 0xb7}, + {value: 0x0054, lo: 0xb7, hi: 0xb7}, {value: 0x0004, lo: 0xb8, hi: 0xb8}, {value: 0x0012, lo: 0xba, hi: 0xba}, // Block 0x1, offset 0x9 @@ -631,7 +631,7 @@ var sparseValues = [1362]valueRange{ {value: 0x0004, lo: 0x82, hi: 0x85}, {value: 0x0014, lo: 0x86, hi: 0x91}, {value: 0x0004, lo: 0x92, hi: 0x96}, - {value: 0x0014, lo: 0x97, hi: 0x97}, + {value: 0x0054, lo: 0x97, hi: 0x97}, {value: 0x0004, lo: 0x98, hi: 0x9f}, {value: 0x0015, lo: 0xa0, hi: 0xa4}, {value: 0x0004, lo: 0xa5, hi: 0xab}, @@ -701,7 +701,7 @@ var sparseValues = [1362]valueRange{ {value: 0x0034, lo: 0x87, hi: 0x87}, {value: 0x0010, lo: 0x90, hi: 0xaa}, {value: 0x0010, lo: 0xb0, hi: 0xb3}, - {value: 0x0014, lo: 0xb4, hi: 0xb4}, + {value: 0x0054, lo: 0xb4, hi: 0xb4}, // Block 0xf, offset 0x70 {value: 0x0014, lo: 0x80, hi: 0x85}, {value: 0x0024, lo: 0x90, hi: 0x97}, @@ -1372,25 +1372,23 @@ var sparseValues = [1362]valueRange{ {value: 0x0813, lo: 0xb8, hi: 0xbf}, // Block 0x63, offset 0x2b8 {value: 0x0004, lo: 0x8b, hi: 0x8b}, - {value: 0x0014, lo: 0x8c, hi: 0x8c}, - {value: 0x0004, lo: 0x8d, hi: 0x8d}, - {value: 0x0014, lo: 0x8e, hi: 0x8f}, - {value: 0x0014, lo: 0x98, hi: 0x99}, - {value: 0x0014, lo: 0xa4, hi: 0xa4}, - {value: 0x0014, lo: 0xa7, hi: 0xa7}, + {value: 0x0014, lo: 0x8c, hi: 0x8f}, + {value: 0x0054, lo: 0x98, hi: 0x99}, + {value: 0x0054, lo: 0xa4, hi: 0xa4}, + {value: 0x0054, lo: 0xa7, hi: 0xa7}, {value: 0x0014, lo: 0xaa, hi: 0xae}, {value: 0x0010, lo: 0xaf, hi: 0xaf}, {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0x64, offset 0x2c2 + // Block 0x64, offset 0x2c0 {value: 0x0010, lo: 0x80, hi: 0x80}, {value: 0x0010, lo: 0x94, hi: 0x94}, {value: 0x0014, lo: 0xa0, hi: 0xa4}, {value: 0x0014, lo: 0xa6, hi: 0xaf}, {value: 0x0015, lo: 0xb1, hi: 0xb1}, {value: 0x0015, lo: 0xbf, hi: 0xbf}, - // Block 0x65, offset 0x2c8 + // Block 0x65, offset 0x2c6 {value: 0x0015, lo: 0x90, hi: 0x9c}, - // Block 0x66, offset 0x2c9 + // Block 0x66, offset 0x2c7 {value: 0x0024, lo: 0x90, hi: 0x91}, {value: 0x0034, lo: 0x92, hi: 0x93}, {value: 0x0024, lo: 0x94, hi: 0x97}, @@ -1405,112 +1403,112 @@ var sparseValues = [1362]valueRange{ {value: 0x0024, lo: 0xa9, hi: 0xa9}, {value: 0x0034, lo: 0xaa, hi: 0xaf}, {value: 0x0024, lo: 0xb0, hi: 0xb0}, - // Block 0x67, offset 0x2d7 + // Block 0x67, offset 0x2d5 {value: 0x0016, lo: 0x85, hi: 0x86}, {value: 0x0012, lo: 0x87, hi: 0x89}, {value: 0x9d52, lo: 0x8e, hi: 0x8e}, {value: 0x1013, lo: 0xa0, hi: 0xaf}, {value: 0x1012, lo: 0xb0, hi: 0xbf}, - // Block 0x68, offset 0x2dc + // Block 0x68, offset 0x2da {value: 0x0010, lo: 0x80, hi: 0x82}, {value: 0x0716, lo: 0x83, hi: 0x84}, {value: 0x0010, lo: 0x85, hi: 0x88}, - // Block 0x69, offset 0x2df + // Block 0x69, offset 0x2dd {value: 0xa053, lo: 0xb6, hi: 0xb7}, {value: 0xa353, lo: 0xb8, hi: 0xb9}, {value: 0xa653, lo: 0xba, hi: 0xbb}, {value: 0xa353, lo: 0xbc, hi: 0xbd}, {value: 0xa053, lo: 0xbe, hi: 0xbf}, - // Block 0x6a, offset 0x2e4 + // Block 0x6a, offset 0x2e2 {value: 0x3013, lo: 0x80, hi: 0x8f}, {value: 0x6553, lo: 0x90, hi: 0x9f}, {value: 0xa953, lo: 0xa0, hi: 0xae}, {value: 0x3012, lo: 0xb0, hi: 0xbf}, - // Block 0x6b, offset 0x2e8 + // Block 0x6b, offset 0x2e6 {value: 0x0117, lo: 0x80, hi: 0xa3}, {value: 0x0012, lo: 0xa4, hi: 0xa4}, {value: 0x0716, lo: 0xab, hi: 0xac}, {value: 0x0316, lo: 0xad, hi: 0xae}, {value: 0x0024, lo: 0xaf, hi: 0xb1}, {value: 0x0117, lo: 0xb2, hi: 0xb3}, - // Block 0x6c, offset 0x2ee + // Block 0x6c, offset 0x2ec {value: 0x6c52, lo: 0x80, hi: 0x9f}, {value: 0x7052, lo: 0xa0, hi: 0xa5}, {value: 0x7052, lo: 0xa7, hi: 0xa7}, {value: 0x7052, lo: 0xad, hi: 0xad}, {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0x6d, offset 0x2f3 + // Block 0x6d, offset 0x2f1 {value: 0x0010, lo: 0x80, hi: 0xa7}, {value: 0x0014, lo: 0xaf, hi: 0xaf}, {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0x6e, offset 0x2f6 + // Block 0x6e, offset 0x2f4 {value: 0x0010, lo: 0x80, hi: 0x96}, {value: 0x0010, lo: 0xa0, hi: 0xa6}, {value: 0x0010, lo: 0xa8, hi: 0xae}, {value: 0x0010, lo: 0xb0, hi: 0xb6}, {value: 0x0010, lo: 0xb8, hi: 0xbe}, - // Block 0x6f, offset 0x2fb + // Block 0x6f, offset 0x2f9 {value: 0x0010, lo: 0x80, hi: 0x86}, {value: 0x0010, lo: 0x88, hi: 0x8e}, {value: 0x0010, lo: 0x90, hi: 0x96}, {value: 0x0010, lo: 0x98, hi: 0x9e}, {value: 0x0024, lo: 0xa0, hi: 0xbf}, - // Block 0x70, offset 0x300 + // Block 0x70, offset 0x2fe {value: 0x0014, lo: 0xaf, hi: 0xaf}, - // Block 0x71, offset 0x301 + // Block 0x71, offset 0x2ff {value: 0x0014, lo: 0x85, hi: 0x85}, {value: 0x0034, lo: 0xaa, hi: 0xad}, {value: 0x0030, lo: 0xae, hi: 0xaf}, {value: 0x0004, lo: 0xb1, hi: 0xb5}, {value: 0x0014, lo: 0xbb, hi: 0xbb}, {value: 0x0010, lo: 0xbc, hi: 0xbc}, - // Block 0x72, offset 0x307 + // Block 0x72, offset 0x305 {value: 0x0034, lo: 0x99, hi: 0x9a}, {value: 0x0004, lo: 0x9b, hi: 0x9e}, - // Block 0x73, offset 0x309 + // Block 0x73, offset 0x307 {value: 0x0004, lo: 0xbc, hi: 0xbe}, - // Block 0x74, offset 0x30a + // Block 0x74, offset 0x308 {value: 0x0010, lo: 0x85, hi: 0xad}, {value: 0x0010, lo: 0xb1, hi: 0xbf}, - // Block 0x75, offset 0x30c + // Block 0x75, offset 0x30a {value: 0x0010, lo: 0x80, hi: 0x8e}, {value: 0x0010, lo: 0xa0, hi: 0xba}, - // Block 0x76, offset 0x30e + // Block 0x76, offset 0x30c {value: 0x0010, lo: 0x80, hi: 0x94}, {value: 0x0014, lo: 0x95, hi: 0x95}, {value: 0x0010, lo: 0x96, hi: 0xbf}, - // Block 0x77, offset 0x311 + // Block 0x77, offset 0x30f {value: 0x0010, lo: 0x80, hi: 0x8c}, - // Block 0x78, offset 0x312 + // Block 0x78, offset 0x310 {value: 0x0010, lo: 0x90, hi: 0xb7}, {value: 0x0014, lo: 0xb8, hi: 0xbd}, - // Block 0x79, offset 0x314 + // Block 0x79, offset 0x312 {value: 0x0010, lo: 0x80, hi: 0x8b}, {value: 0x0014, lo: 0x8c, hi: 0x8c}, {value: 0x0010, lo: 0x90, hi: 0xab}, - // Block 0x7a, offset 0x317 + // Block 0x7a, offset 0x315 {value: 0x0117, lo: 0x80, hi: 0xad}, {value: 0x0010, lo: 0xae, hi: 0xae}, {value: 0x0024, lo: 0xaf, hi: 0xaf}, {value: 0x0014, lo: 0xb0, hi: 0xb2}, {value: 0x0024, lo: 0xb4, hi: 0xbd}, {value: 0x0014, lo: 0xbf, hi: 0xbf}, - // Block 0x7b, offset 0x31d + // Block 0x7b, offset 0x31b {value: 0x0117, lo: 0x80, hi: 0x9b}, {value: 0x0015, lo: 0x9c, hi: 0x9d}, {value: 0x0024, lo: 0x9e, hi: 0x9f}, {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0x7c, offset 0x321 + // Block 0x7c, offset 0x31f {value: 0x0010, lo: 0x80, hi: 0xaf}, {value: 0x0024, lo: 0xb0, hi: 0xb1}, - // Block 0x7d, offset 0x323 + // Block 0x7d, offset 0x321 {value: 0x0004, lo: 0x80, hi: 0x96}, {value: 0x0014, lo: 0x97, hi: 0x9f}, {value: 0x0004, lo: 0xa0, hi: 0xa1}, {value: 0x0117, lo: 0xa2, hi: 0xaf}, {value: 0x0012, lo: 0xb0, hi: 0xb1}, {value: 0x0117, lo: 0xb2, hi: 0xbf}, - // Block 0x7e, offset 0x329 + // Block 0x7e, offset 0x327 {value: 0x0117, lo: 0x80, hi: 0xaf}, {value: 0x0015, lo: 0xb0, hi: 0xb0}, {value: 0x0012, lo: 0xb1, hi: 0xb8}, @@ -1518,12 +1516,12 @@ var sparseValues = [1362]valueRange{ {value: 0x0716, lo: 0xbb, hi: 0xbc}, {value: 0x8453, lo: 0xbd, hi: 0xbd}, {value: 0x0117, lo: 0xbe, hi: 0xbf}, - // Block 0x7f, offset 0x330 + // Block 0x7f, offset 0x32e {value: 0x0010, lo: 0xb7, hi: 0xb7}, {value: 0x0015, lo: 0xb8, hi: 0xb9}, {value: 0x0012, lo: 0xba, hi: 0xba}, {value: 0x0010, lo: 0xbb, hi: 0xbf}, - // Block 0x80, offset 0x334 + // Block 0x80, offset 0x332 {value: 0x0010, lo: 0x80, hi: 0x81}, {value: 0x0014, lo: 0x82, hi: 0x82}, {value: 0x0010, lo: 0x83, hi: 0x85}, @@ -1533,9 +1531,9 @@ var sparseValues = [1362]valueRange{ {value: 0x0010, lo: 0x8c, hi: 0xa4}, {value: 0x0014, lo: 0xa5, hi: 0xa6}, {value: 0x0010, lo: 0xa7, hi: 0xa7}, - // Block 0x81, offset 0x33d + // Block 0x81, offset 0x33b {value: 0x0010, lo: 0x80, hi: 0xb3}, - // Block 0x82, offset 0x33e + // Block 0x82, offset 0x33c {value: 0x0010, lo: 0x80, hi: 0x83}, {value: 0x0034, lo: 0x84, hi: 0x84}, {value: 0x0014, lo: 0x85, hi: 0x85}, @@ -1544,18 +1542,18 @@ var sparseValues = [1362]valueRange{ {value: 0x0010, lo: 0xb2, hi: 0xb7}, {value: 0x0010, lo: 0xbb, hi: 0xbb}, {value: 0x0010, lo: 0xbd, hi: 0xbd}, - // Block 0x83, offset 0x346 + // Block 0x83, offset 0x344 {value: 0x0010, lo: 0x80, hi: 0xa5}, {value: 0x0014, lo: 0xa6, hi: 0xaa}, {value: 0x0034, lo: 0xab, hi: 0xad}, {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0x84, offset 0x34a + // Block 0x84, offset 0x348 {value: 0x0010, lo: 0x80, hi: 0x86}, {value: 0x0014, lo: 0x87, hi: 0x91}, {value: 0x0010, lo: 0x92, hi: 0x92}, {value: 0x0030, lo: 0x93, hi: 0x93}, {value: 0x0010, lo: 0xa0, hi: 0xbc}, - // Block 0x85, offset 0x34f + // Block 0x85, offset 0x34d {value: 0x0014, lo: 0x80, hi: 0x82}, {value: 0x0010, lo: 0x83, hi: 0xb2}, {value: 0x0034, lo: 0xb3, hi: 0xb3}, @@ -1564,21 +1562,21 @@ var sparseValues = [1362]valueRange{ {value: 0x0010, lo: 0xba, hi: 0xbb}, {value: 0x0014, lo: 0xbc, hi: 0xbc}, {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0x86, offset 0x357 + // Block 0x86, offset 0x355 {value: 0x0030, lo: 0x80, hi: 0x80}, {value: 0x0014, lo: 0x8f, hi: 0x8f}, {value: 0x0010, lo: 0x90, hi: 0x99}, {value: 0x0014, lo: 0xa5, hi: 0xa5}, {value: 0x0004, lo: 0xa6, hi: 0xa6}, {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0x87, offset 0x35d + // Block 0x87, offset 0x35b {value: 0x0010, lo: 0x80, hi: 0xa8}, {value: 0x0014, lo: 0xa9, hi: 0xae}, {value: 0x0010, lo: 0xaf, hi: 0xb0}, {value: 0x0014, lo: 0xb1, hi: 0xb2}, {value: 0x0010, lo: 0xb3, hi: 0xb4}, {value: 0x0014, lo: 0xb5, hi: 0xb6}, - // Block 0x88, offset 0x363 + // Block 0x88, offset 0x361 {value: 0x0010, lo: 0x80, hi: 0x82}, {value: 0x0014, lo: 0x83, hi: 0x83}, {value: 0x0010, lo: 0x84, hi: 0x8b}, @@ -1589,13 +1587,13 @@ var sparseValues = [1362]valueRange{ {value: 0x0010, lo: 0xbb, hi: 0xbb}, {value: 0x0014, lo: 0xbc, hi: 0xbc}, {value: 0x0010, lo: 0xbd, hi: 0xbd}, - // Block 0x89, offset 0x36d + // Block 0x89, offset 0x36b {value: 0x0024, lo: 0xb0, hi: 0xb0}, {value: 0x0024, lo: 0xb2, hi: 0xb3}, {value: 0x0034, lo: 0xb4, hi: 0xb4}, {value: 0x0024, lo: 0xb7, hi: 0xb8}, {value: 0x0024, lo: 0xbe, hi: 0xbf}, - // Block 0x8a, offset 0x372 + // Block 0x8a, offset 0x370 {value: 0x0024, lo: 0x81, hi: 0x81}, {value: 0x0004, lo: 0x9d, hi: 0x9d}, {value: 0x0010, lo: 0xa0, hi: 0xab}, @@ -1605,14 +1603,14 @@ var sparseValues = [1362]valueRange{ {value: 0x0014, lo: 0xb3, hi: 0xb4}, {value: 0x0010, lo: 0xb5, hi: 0xb5}, {value: 0x0034, lo: 0xb6, hi: 0xb6}, - // Block 0x8b, offset 0x37b + // Block 0x8b, offset 0x379 {value: 0x0010, lo: 0x81, hi: 0x86}, {value: 0x0010, lo: 0x89, hi: 0x8e}, {value: 0x0010, lo: 0x91, hi: 0x96}, {value: 0x0010, lo: 0xa0, hi: 0xa6}, {value: 0x0010, lo: 0xa8, hi: 0xae}, {value: 0x0012, lo: 0xb0, hi: 0xbf}, - // Block 0x8c, offset 0x381 + // Block 0x8c, offset 0x37f {value: 0x0012, lo: 0x80, hi: 0x92}, {value: 0xac52, lo: 0x93, hi: 0x93}, {value: 0x0012, lo: 0x94, hi: 0x9a}, @@ -1620,12 +1618,12 @@ var sparseValues = [1362]valueRange{ {value: 0x0015, lo: 0x9c, hi: 0x9f}, {value: 0x0012, lo: 0xa0, hi: 0xa5}, {value: 0x74d2, lo: 0xb0, hi: 0xbf}, - // Block 0x8d, offset 0x388 + // Block 0x8d, offset 0x386 {value: 0x78d2, lo: 0x80, hi: 0x8f}, {value: 0x7cd2, lo: 0x90, hi: 0x9f}, {value: 0x80d2, lo: 0xa0, hi: 0xaf}, {value: 0x7cd2, lo: 0xb0, hi: 0xbf}, - // Block 0x8e, offset 0x38c + // Block 0x8e, offset 0x38a {value: 0x0010, lo: 0x80, hi: 0xa4}, {value: 0x0014, lo: 0xa5, hi: 0xa5}, {value: 0x0010, lo: 0xa6, hi: 0xa7}, @@ -1634,105 +1632,105 @@ var sparseValues = [1362]valueRange{ {value: 0x0010, lo: 0xac, hi: 0xac}, {value: 0x0034, lo: 0xad, hi: 0xad}, {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0x8f, offset 0x394 + // Block 0x8f, offset 0x392 {value: 0x0010, lo: 0x80, hi: 0xa3}, {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0x90, offset 0x396 + // Block 0x90, offset 0x394 {value: 0x0010, lo: 0x80, hi: 0x86}, {value: 0x0010, lo: 0x8b, hi: 0xbb}, - // Block 0x91, offset 0x398 + // Block 0x91, offset 0x396 {value: 0x0010, lo: 0x80, hi: 0x81}, {value: 0x0010, lo: 0x83, hi: 0x84}, {value: 0x0010, lo: 0x86, hi: 0xbf}, - // Block 0x92, offset 0x39b + // Block 0x92, offset 0x399 {value: 0x0010, lo: 0x80, hi: 0xb1}, {value: 0x0004, lo: 0xb2, hi: 0xbf}, - // Block 0x93, offset 0x39d + // Block 0x93, offset 0x39b {value: 0x0004, lo: 0x80, hi: 0x81}, {value: 0x0010, lo: 0x93, hi: 0xbf}, - // Block 0x94, offset 0x39f + // Block 0x94, offset 0x39d {value: 0x0010, lo: 0x80, hi: 0xbd}, - // Block 0x95, offset 0x3a0 + // Block 0x95, offset 0x39e {value: 0x0010, lo: 0x90, hi: 0xbf}, - // Block 0x96, offset 0x3a1 + // Block 0x96, offset 0x39f {value: 0x0010, lo: 0x80, hi: 0x8f}, {value: 0x0010, lo: 0x92, hi: 0xbf}, - // Block 0x97, offset 0x3a3 + // Block 0x97, offset 0x3a1 {value: 0x0010, lo: 0x80, hi: 0x87}, {value: 0x0010, lo: 0xb0, hi: 0xbb}, - // Block 0x98, offset 0x3a5 + // Block 0x98, offset 0x3a3 {value: 0x0014, lo: 0x80, hi: 0x8f}, - {value: 0x0014, lo: 0x93, hi: 0x93}, + {value: 0x0054, lo: 0x93, hi: 0x93}, {value: 0x0024, lo: 0xa0, hi: 0xa6}, {value: 0x0034, lo: 0xa7, hi: 0xad}, {value: 0x0024, lo: 0xae, hi: 0xaf}, {value: 0x0010, lo: 0xb3, hi: 0xb4}, - // Block 0x99, offset 0x3ab + // Block 0x99, offset 0x3a9 {value: 0x0010, lo: 0x8d, hi: 0x8f}, - {value: 0x0014, lo: 0x92, hi: 0x92}, - {value: 0x0014, lo: 0x95, hi: 0x95}, + {value: 0x0054, lo: 0x92, hi: 0x92}, + {value: 0x0054, lo: 0x95, hi: 0x95}, {value: 0x0010, lo: 0xb0, hi: 0xb4}, {value: 0x0010, lo: 0xb6, hi: 0xbf}, - // Block 0x9a, offset 0x3b0 + // Block 0x9a, offset 0x3ae {value: 0x0010, lo: 0x80, hi: 0xbc}, {value: 0x0014, lo: 0xbf, hi: 0xbf}, - // Block 0x9b, offset 0x3b2 - {value: 0x0014, lo: 0x87, hi: 0x87}, - {value: 0x0014, lo: 0x8e, hi: 0x8e}, - {value: 0x0014, lo: 0x9a, hi: 0x9a}, + // Block 0x9b, offset 0x3b0 + {value: 0x0054, lo: 0x87, hi: 0x87}, + {value: 0x0054, lo: 0x8e, hi: 0x8e}, + {value: 0x0054, lo: 0x9a, hi: 0x9a}, {value: 0x5f53, lo: 0xa1, hi: 0xba}, {value: 0x0004, lo: 0xbe, hi: 0xbe}, {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0x9c, offset 0x3b8 + // Block 0x9c, offset 0x3b6 {value: 0x0004, lo: 0x80, hi: 0x80}, {value: 0x5f52, lo: 0x81, hi: 0x9a}, {value: 0x0004, lo: 0xb0, hi: 0xb0}, - // Block 0x9d, offset 0x3bb + // Block 0x9d, offset 0x3b9 {value: 0x0014, lo: 0x9e, hi: 0x9f}, {value: 0x0010, lo: 0xa0, hi: 0xbe}, - // Block 0x9e, offset 0x3bd + // Block 0x9e, offset 0x3bb {value: 0x0010, lo: 0x82, hi: 0x87}, {value: 0x0010, lo: 0x8a, hi: 0x8f}, {value: 0x0010, lo: 0x92, hi: 0x97}, {value: 0x0010, lo: 0x9a, hi: 0x9c}, {value: 0x0004, lo: 0xa3, hi: 0xa3}, {value: 0x0014, lo: 0xb9, hi: 0xbb}, - // Block 0x9f, offset 0x3c3 + // Block 0x9f, offset 0x3c1 {value: 0x0010, lo: 0x80, hi: 0x8b}, {value: 0x0010, lo: 0x8d, hi: 0xa6}, {value: 0x0010, lo: 0xa8, hi: 0xba}, {value: 0x0010, lo: 0xbc, hi: 0xbd}, {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0xa0, offset 0x3c8 + // Block 0xa0, offset 0x3c6 {value: 0x0010, lo: 0x80, hi: 0x8d}, {value: 0x0010, lo: 0x90, hi: 0x9d}, - // Block 0xa1, offset 0x3ca + // Block 0xa1, offset 0x3c8 {value: 0x0010, lo: 0x80, hi: 0xba}, - // Block 0xa2, offset 0x3cb + // Block 0xa2, offset 0x3c9 {value: 0x0010, lo: 0x80, hi: 0xb4}, - // Block 0xa3, offset 0x3cc + // Block 0xa3, offset 0x3ca {value: 0x0034, lo: 0xbd, hi: 0xbd}, - // Block 0xa4, offset 0x3cd + // Block 0xa4, offset 0x3cb {value: 0x0010, lo: 0x80, hi: 0x9c}, {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0xa5, offset 0x3cf + // Block 0xa5, offset 0x3cd {value: 0x0010, lo: 0x80, hi: 0x90}, {value: 0x0034, lo: 0xa0, hi: 0xa0}, - // Block 0xa6, offset 0x3d1 + // Block 0xa6, offset 0x3cf {value: 0x0010, lo: 0x80, hi: 0x9f}, {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0xa7, offset 0x3d3 + // Block 0xa7, offset 0x3d1 {value: 0x0010, lo: 0x80, hi: 0x8a}, {value: 0x0010, lo: 0x90, hi: 0xb5}, {value: 0x0024, lo: 0xb6, hi: 0xba}, - // Block 0xa8, offset 0x3d6 + // Block 0xa8, offset 0x3d4 {value: 0x0010, lo: 0x80, hi: 0x9d}, {value: 0x0010, lo: 0xa0, hi: 0xbf}, - // Block 0xa9, offset 0x3d8 + // Block 0xa9, offset 0x3d6 {value: 0x0010, lo: 0x80, hi: 0x83}, {value: 0x0010, lo: 0x88, hi: 0x8f}, {value: 0x0010, lo: 0x91, hi: 0x95}, - // Block 0xaa, offset 0x3db + // Block 0xaa, offset 0x3d9 {value: 0x2813, lo: 0x80, hi: 0x87}, {value: 0x3813, lo: 0x88, hi: 0x8f}, {value: 0x2813, lo: 0x90, hi: 0x97}, @@ -1741,16 +1739,16 @@ var sparseValues = [1362]valueRange{ {value: 0x2812, lo: 0xa8, hi: 0xaf}, {value: 0x3812, lo: 0xb0, hi: 0xb7}, {value: 0x2812, lo: 0xb8, hi: 0xbf}, - // Block 0xab, offset 0x3e3 + // Block 0xab, offset 0x3e1 {value: 0xaf52, lo: 0x80, hi: 0x87}, {value: 0xb252, lo: 0x88, hi: 0x8f}, {value: 0x0010, lo: 0x90, hi: 0xbf}, - // Block 0xac, offset 0x3e6 + // Block 0xac, offset 0x3e4 {value: 0x0010, lo: 0x80, hi: 0x9d}, {value: 0x0010, lo: 0xa0, hi: 0xa9}, {value: 0xb253, lo: 0xb0, hi: 0xb7}, {value: 0xaf53, lo: 0xb8, hi: 0xbf}, - // Block 0xad, offset 0x3ea + // Block 0xad, offset 0x3e8 {value: 0x2813, lo: 0x80, hi: 0x87}, {value: 0x3813, lo: 0x88, hi: 0x8f}, {value: 0x2813, lo: 0x90, hi: 0x93}, @@ -1759,38 +1757,38 @@ var sparseValues = [1362]valueRange{ {value: 0x2812, lo: 0xa8, hi: 0xaf}, {value: 0x3812, lo: 0xb0, hi: 0xb7}, {value: 0x2812, lo: 0xb8, hi: 0xbb}, - // Block 0xae, offset 0x3f2 + // Block 0xae, offset 0x3f0 {value: 0x0010, lo: 0x80, hi: 0xa7}, {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0xaf, offset 0x3f4 + // Block 0xaf, offset 0x3f2 {value: 0x0010, lo: 0x80, hi: 0xa3}, - // Block 0xb0, offset 0x3f5 + // Block 0xb0, offset 0x3f3 {value: 0x0010, lo: 0x80, hi: 0xb6}, - // Block 0xb1, offset 0x3f6 + // Block 0xb1, offset 0x3f4 {value: 0x0010, lo: 0x80, hi: 0x95}, {value: 0x0010, lo: 0xa0, hi: 0xa7}, - // Block 0xb2, offset 0x3f8 + // Block 0xb2, offset 0x3f6 {value: 0x0010, lo: 0x80, hi: 0x85}, {value: 0x0010, lo: 0x88, hi: 0x88}, {value: 0x0010, lo: 0x8a, hi: 0xb5}, {value: 0x0010, lo: 0xb7, hi: 0xb8}, {value: 0x0010, lo: 0xbc, hi: 0xbc}, {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0xb3, offset 0x3fe + // Block 0xb3, offset 0x3fc {value: 0x0010, lo: 0x80, hi: 0x95}, {value: 0x0010, lo: 0xa0, hi: 0xb6}, - // Block 0xb4, offset 0x400 + // Block 0xb4, offset 0x3fe {value: 0x0010, lo: 0x80, hi: 0x9e}, - // Block 0xb5, offset 0x401 + // Block 0xb5, offset 0x3ff {value: 0x0010, lo: 0xa0, hi: 0xb2}, {value: 0x0010, lo: 0xb4, hi: 0xb5}, - // Block 0xb6, offset 0x403 + // Block 0xb6, offset 0x401 {value: 0x0010, lo: 0x80, hi: 0x95}, {value: 0x0010, lo: 0xa0, hi: 0xb9}, - // Block 0xb7, offset 0x405 + // Block 0xb7, offset 0x403 {value: 0x0010, lo: 0x80, hi: 0xb7}, {value: 0x0010, lo: 0xbe, hi: 0xbf}, - // Block 0xb8, offset 0x407 + // Block 0xb8, offset 0x405 {value: 0x0010, lo: 0x80, hi: 0x80}, {value: 0x0014, lo: 0x81, hi: 0x83}, {value: 0x0014, lo: 0x85, hi: 0x86}, @@ -1804,47 +1802,47 @@ var sparseValues = [1362]valueRange{ {value: 0x0024, lo: 0xb8, hi: 0xb8}, {value: 0x0034, lo: 0xb9, hi: 0xba}, {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xb9, offset 0x414 + // Block 0xb9, offset 0x412 {value: 0x0010, lo: 0xa0, hi: 0xbc}, - // Block 0xba, offset 0x415 + // Block 0xba, offset 0x413 {value: 0x0010, lo: 0x80, hi: 0x9c}, - // Block 0xbb, offset 0x416 + // Block 0xbb, offset 0x414 {value: 0x0010, lo: 0x80, hi: 0x87}, {value: 0x0010, lo: 0x89, hi: 0xa4}, {value: 0x0024, lo: 0xa5, hi: 0xa5}, {value: 0x0034, lo: 0xa6, hi: 0xa6}, - // Block 0xbc, offset 0x41a + // Block 0xbc, offset 0x418 {value: 0x0010, lo: 0x80, hi: 0x95}, {value: 0x0010, lo: 0xa0, hi: 0xb2}, - // Block 0xbd, offset 0x41c + // Block 0xbd, offset 0x41a {value: 0x0010, lo: 0x80, hi: 0x91}, - // Block 0xbe, offset 0x41d + // Block 0xbe, offset 0x41b {value: 0x0010, lo: 0x80, hi: 0x88}, - // Block 0xbf, offset 0x41e + // Block 0xbf, offset 0x41c {value: 0x5653, lo: 0x80, hi: 0xb2}, - // Block 0xc0, offset 0x41f + // Block 0xc0, offset 0x41d {value: 0x5652, lo: 0x80, hi: 0xb2}, - // Block 0xc1, offset 0x420 + // Block 0xc1, offset 0x41e {value: 0x0010, lo: 0x80, hi: 0x80}, {value: 0x0014, lo: 0x81, hi: 0x81}, {value: 0x0010, lo: 0x82, hi: 0xb7}, {value: 0x0014, lo: 0xb8, hi: 0xbf}, - // Block 0xc2, offset 0x424 + // Block 0xc2, offset 0x422 {value: 0x0014, lo: 0x80, hi: 0x85}, {value: 0x0034, lo: 0x86, hi: 0x86}, {value: 0x0010, lo: 0xa6, hi: 0xaf}, {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xc3, offset 0x428 + // Block 0xc3, offset 0x426 {value: 0x0014, lo: 0x80, hi: 0x81}, {value: 0x0010, lo: 0x82, hi: 0xb2}, {value: 0x0014, lo: 0xb3, hi: 0xb6}, {value: 0x0010, lo: 0xb7, hi: 0xb8}, {value: 0x0034, lo: 0xb9, hi: 0xba}, {value: 0x0014, lo: 0xbd, hi: 0xbd}, - // Block 0xc4, offset 0x42e + // Block 0xc4, offset 0x42c {value: 0x0010, lo: 0x90, hi: 0xa8}, {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0xc5, offset 0x430 + // Block 0xc5, offset 0x42e {value: 0x0024, lo: 0x80, hi: 0x82}, {value: 0x0010, lo: 0x83, hi: 0xa6}, {value: 0x0014, lo: 0xa7, hi: 0xab}, @@ -1852,23 +1850,23 @@ var sparseValues = [1362]valueRange{ {value: 0x0014, lo: 0xad, hi: 0xb2}, {value: 0x0034, lo: 0xb3, hi: 0xb4}, {value: 0x0010, lo: 0xb6, hi: 0xbf}, - // Block 0xc6, offset 0x437 + // Block 0xc6, offset 0x435 {value: 0x0010, lo: 0x90, hi: 0xb2}, {value: 0x0034, lo: 0xb3, hi: 0xb3}, {value: 0x0010, lo: 0xb6, hi: 0xb6}, - // Block 0xc7, offset 0x43a + // Block 0xc7, offset 0x438 {value: 0x0014, lo: 0x80, hi: 0x81}, {value: 0x0010, lo: 0x82, hi: 0xb5}, {value: 0x0014, lo: 0xb6, hi: 0xbe}, {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0xc8, offset 0x43e + // Block 0xc8, offset 0x43c {value: 0x0030, lo: 0x80, hi: 0x80}, {value: 0x0010, lo: 0x81, hi: 0x84}, {value: 0x0034, lo: 0x8a, hi: 0x8a}, {value: 0x0014, lo: 0x8b, hi: 0x8c}, {value: 0x0010, lo: 0x90, hi: 0x9a}, {value: 0x0010, lo: 0x9c, hi: 0x9c}, - // Block 0xc9, offset 0x444 + // Block 0xc9, offset 0x442 {value: 0x0010, lo: 0x80, hi: 0x91}, {value: 0x0010, lo: 0x93, hi: 0xae}, {value: 0x0014, lo: 0xaf, hi: 0xb1}, @@ -1878,21 +1876,21 @@ var sparseValues = [1362]valueRange{ {value: 0x0034, lo: 0xb6, hi: 0xb6}, {value: 0x0014, lo: 0xb7, hi: 0xb7}, {value: 0x0014, lo: 0xbe, hi: 0xbe}, - // Block 0xca, offset 0x44d + // Block 0xca, offset 0x44b {value: 0x0010, lo: 0x80, hi: 0x86}, {value: 0x0010, lo: 0x88, hi: 0x88}, {value: 0x0010, lo: 0x8a, hi: 0x8d}, {value: 0x0010, lo: 0x8f, hi: 0x9d}, {value: 0x0010, lo: 0x9f, hi: 0xa8}, {value: 0x0010, lo: 0xb0, hi: 0xbf}, - // Block 0xcb, offset 0x453 + // Block 0xcb, offset 0x451 {value: 0x0010, lo: 0x80, hi: 0x9e}, {value: 0x0014, lo: 0x9f, hi: 0x9f}, {value: 0x0010, lo: 0xa0, hi: 0xa2}, {value: 0x0014, lo: 0xa3, hi: 0xa8}, {value: 0x0034, lo: 0xa9, hi: 0xaa}, {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0xcc, offset 0x459 + // Block 0xcc, offset 0x457 {value: 0x0014, lo: 0x80, hi: 0x81}, {value: 0x0010, lo: 0x82, hi: 0x83}, {value: 0x0010, lo: 0x85, hi: 0x8c}, @@ -1903,7 +1901,7 @@ var sparseValues = [1362]valueRange{ {value: 0x0010, lo: 0xb5, hi: 0xb9}, {value: 0x0034, lo: 0xbc, hi: 0xbc}, {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0xcd, offset 0x463 + // Block 0xcd, offset 0x461 {value: 0x0014, lo: 0x80, hi: 0x80}, {value: 0x0010, lo: 0x81, hi: 0x84}, {value: 0x0010, lo: 0x87, hi: 0x88}, @@ -1914,10 +1912,10 @@ var sparseValues = [1362]valueRange{ {value: 0x0010, lo: 0x9d, hi: 0xa3}, {value: 0x0024, lo: 0xa6, hi: 0xac}, {value: 0x0024, lo: 0xb0, hi: 0xb4}, - // Block 0xce, offset 0x46d + // Block 0xce, offset 0x46b {value: 0x0010, lo: 0x80, hi: 0xb7}, {value: 0x0014, lo: 0xb8, hi: 0xbf}, - // Block 0xcf, offset 0x46f + // Block 0xcf, offset 0x46d {value: 0x0010, lo: 0x80, hi: 0x81}, {value: 0x0034, lo: 0x82, hi: 0x82}, {value: 0x0014, lo: 0x83, hi: 0x84}, @@ -1925,43 +1923,43 @@ var sparseValues = [1362]valueRange{ {value: 0x0034, lo: 0x86, hi: 0x86}, {value: 0x0010, lo: 0x87, hi: 0x8a}, {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0xd0, offset 0x476 + // Block 0xd0, offset 0x474 {value: 0x0010, lo: 0x80, hi: 0xb2}, {value: 0x0014, lo: 0xb3, hi: 0xb8}, {value: 0x0010, lo: 0xb9, hi: 0xb9}, {value: 0x0014, lo: 0xba, hi: 0xba}, {value: 0x0010, lo: 0xbb, hi: 0xbe}, {value: 0x0014, lo: 0xbf, hi: 0xbf}, - // Block 0xd1, offset 0x47c + // Block 0xd1, offset 0x47a {value: 0x0014, lo: 0x80, hi: 0x80}, {value: 0x0010, lo: 0x81, hi: 0x81}, {value: 0x0034, lo: 0x82, hi: 0x83}, {value: 0x0010, lo: 0x84, hi: 0x85}, {value: 0x0010, lo: 0x87, hi: 0x87}, {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0xd2, offset 0x482 + // Block 0xd2, offset 0x480 {value: 0x0010, lo: 0x80, hi: 0xb1}, {value: 0x0014, lo: 0xb2, hi: 0xb5}, {value: 0x0010, lo: 0xb8, hi: 0xbb}, {value: 0x0014, lo: 0xbc, hi: 0xbd}, {value: 0x0010, lo: 0xbe, hi: 0xbe}, {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xd3, offset 0x488 + // Block 0xd3, offset 0x486 {value: 0x0034, lo: 0x80, hi: 0x80}, {value: 0x0010, lo: 0x98, hi: 0x9b}, {value: 0x0014, lo: 0x9c, hi: 0x9d}, - // Block 0xd4, offset 0x48b + // Block 0xd4, offset 0x489 {value: 0x0010, lo: 0x80, hi: 0xb2}, {value: 0x0014, lo: 0xb3, hi: 0xba}, {value: 0x0010, lo: 0xbb, hi: 0xbc}, {value: 0x0014, lo: 0xbd, hi: 0xbd}, {value: 0x0010, lo: 0xbe, hi: 0xbe}, {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xd5, offset 0x491 + // Block 0xd5, offset 0x48f {value: 0x0014, lo: 0x80, hi: 0x80}, {value: 0x0010, lo: 0x84, hi: 0x84}, {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0xd6, offset 0x494 + // Block 0xd6, offset 0x492 {value: 0x0010, lo: 0x80, hi: 0xaa}, {value: 0x0014, lo: 0xab, hi: 0xab}, {value: 0x0010, lo: 0xac, hi: 0xac}, @@ -1970,9 +1968,9 @@ var sparseValues = [1362]valueRange{ {value: 0x0014, lo: 0xb0, hi: 0xb5}, {value: 0x0030, lo: 0xb6, hi: 0xb6}, {value: 0x0034, lo: 0xb7, hi: 0xb7}, - // Block 0xd7, offset 0x49c + // Block 0xd7, offset 0x49a {value: 0x0010, lo: 0x80, hi: 0x89}, - // Block 0xd8, offset 0x49d + // Block 0xd8, offset 0x49b {value: 0x0014, lo: 0x9d, hi: 0x9f}, {value: 0x0010, lo: 0xa0, hi: 0xa1}, {value: 0x0014, lo: 0xa2, hi: 0xa5}, @@ -1980,26 +1978,26 @@ var sparseValues = [1362]valueRange{ {value: 0x0014, lo: 0xa7, hi: 0xaa}, {value: 0x0034, lo: 0xab, hi: 0xab}, {value: 0x0010, lo: 0xb0, hi: 0xb9}, - // Block 0xd9, offset 0x4a4 + // Block 0xd9, offset 0x4a2 {value: 0x5f53, lo: 0xa0, hi: 0xbf}, - // Block 0xda, offset 0x4a5 + // Block 0xda, offset 0x4a3 {value: 0x5f52, lo: 0x80, hi: 0x9f}, {value: 0x0010, lo: 0xa0, hi: 0xa9}, {value: 0x0010, lo: 0xbf, hi: 0xbf}, - // Block 0xdb, offset 0x4a8 + // Block 0xdb, offset 0x4a6 {value: 0x0010, lo: 0x80, hi: 0xb8}, - // Block 0xdc, offset 0x4a9 + // Block 0xdc, offset 0x4a7 {value: 0x0010, lo: 0x80, hi: 0x88}, {value: 0x0010, lo: 0x8a, hi: 0xaf}, {value: 0x0014, lo: 0xb0, hi: 0xb6}, {value: 0x0014, lo: 0xb8, hi: 0xbd}, {value: 0x0010, lo: 0xbe, hi: 0xbe}, {value: 0x0034, lo: 0xbf, hi: 0xbf}, - // Block 0xdd, offset 0x4af + // Block 0xdd, offset 0x4ad {value: 0x0010, lo: 0x80, hi: 0x80}, {value: 0x0010, lo: 0x90, hi: 0x99}, {value: 0x0010, lo: 0xb2, hi: 0xbf}, - // Block 0xde, offset 0x4b2 + // Block 0xde, offset 0x4b0 {value: 0x0010, lo: 0x80, hi: 0x8f}, {value: 0x0014, lo: 0x92, hi: 0xa7}, {value: 0x0010, lo: 0xa9, hi: 0xa9}, @@ -2008,69 +2006,69 @@ var sparseValues = [1362]valueRange{ {value: 0x0014, lo: 0xb2, hi: 0xb3}, {value: 0x0010, lo: 0xb4, hi: 0xb4}, {value: 0x0014, lo: 0xb5, hi: 0xb6}, - // Block 0xdf, offset 0x4ba + // Block 0xdf, offset 0x4b8 {value: 0x0010, lo: 0x80, hi: 0x99}, - // Block 0xe0, offset 0x4bb + // Block 0xe0, offset 0x4b9 {value: 0x0010, lo: 0x80, hi: 0xae}, - // Block 0xe1, offset 0x4bc + // Block 0xe1, offset 0x4ba {value: 0x0010, lo: 0x80, hi: 0x83}, - // Block 0xe2, offset 0x4bd + // Block 0xe2, offset 0x4bb {value: 0x0010, lo: 0x80, hi: 0x86}, - // Block 0xe3, offset 0x4be + // Block 0xe3, offset 0x4bc {value: 0x0010, lo: 0x80, hi: 0x9e}, {value: 0x0010, lo: 0xa0, hi: 0xa9}, - // Block 0xe4, offset 0x4c0 + // Block 0xe4, offset 0x4be {value: 0x0010, lo: 0x90, hi: 0xad}, {value: 0x0034, lo: 0xb0, hi: 0xb4}, - // Block 0xe5, offset 0x4c2 + // Block 0xe5, offset 0x4c0 {value: 0x0010, lo: 0x80, hi: 0xaf}, {value: 0x0024, lo: 0xb0, hi: 0xb6}, - // Block 0xe6, offset 0x4c4 + // Block 0xe6, offset 0x4c2 {value: 0x0014, lo: 0x80, hi: 0x83}, {value: 0x0010, lo: 0x90, hi: 0x99}, {value: 0x0010, lo: 0xa3, hi: 0xb7}, {value: 0x0010, lo: 0xbd, hi: 0xbf}, - // Block 0xe7, offset 0x4c8 + // Block 0xe7, offset 0x4c6 {value: 0x0010, lo: 0x80, hi: 0x8f}, - // Block 0xe8, offset 0x4c9 + // Block 0xe8, offset 0x4c7 {value: 0x0010, lo: 0x80, hi: 0x84}, {value: 0x0010, lo: 0x90, hi: 0xbe}, - // Block 0xe9, offset 0x4cb + // Block 0xe9, offset 0x4c9 {value: 0x0014, lo: 0x8f, hi: 0x9f}, - // Block 0xea, offset 0x4cc + // Block 0xea, offset 0x4ca {value: 0x0014, lo: 0xa0, hi: 0xa0}, - // Block 0xeb, offset 0x4cd + // Block 0xeb, offset 0x4cb {value: 0x0010, lo: 0x80, hi: 0xaa}, {value: 0x0010, lo: 0xb0, hi: 0xbc}, - // Block 0xec, offset 0x4cf + // Block 0xec, offset 0x4cd {value: 0x0010, lo: 0x80, hi: 0x88}, {value: 0x0010, lo: 0x90, hi: 0x99}, {value: 0x0014, lo: 0x9d, hi: 0x9d}, {value: 0x0034, lo: 0x9e, hi: 0x9e}, {value: 0x0014, lo: 0xa0, hi: 0xa3}, - // Block 0xed, offset 0x4d4 + // Block 0xed, offset 0x4d2 {value: 0x0030, lo: 0xa5, hi: 0xa6}, {value: 0x0034, lo: 0xa7, hi: 0xa9}, {value: 0x0030, lo: 0xad, hi: 0xb2}, {value: 0x0014, lo: 0xb3, hi: 0xba}, {value: 0x0034, lo: 0xbb, hi: 0xbf}, - // Block 0xee, offset 0x4d9 + // Block 0xee, offset 0x4d7 {value: 0x0034, lo: 0x80, hi: 0x82}, {value: 0x0024, lo: 0x85, hi: 0x89}, {value: 0x0034, lo: 0x8a, hi: 0x8b}, {value: 0x0024, lo: 0xaa, hi: 0xad}, - // Block 0xef, offset 0x4dd + // Block 0xef, offset 0x4db {value: 0x0024, lo: 0x82, hi: 0x84}, - // Block 0xf0, offset 0x4de + // Block 0xf0, offset 0x4dc {value: 0x0013, lo: 0x80, hi: 0x99}, {value: 0x0012, lo: 0x9a, hi: 0xb3}, {value: 0x0013, lo: 0xb4, hi: 0xbf}, - // Block 0xf1, offset 0x4e1 + // Block 0xf1, offset 0x4df {value: 0x0013, lo: 0x80, hi: 0x8d}, {value: 0x0012, lo: 0x8e, hi: 0x94}, {value: 0x0012, lo: 0x96, hi: 0xa7}, {value: 0x0013, lo: 0xa8, hi: 0xbf}, - // Block 0xf2, offset 0x4e5 + // Block 0xf2, offset 0x4e3 {value: 0x0013, lo: 0x80, hi: 0x81}, {value: 0x0012, lo: 0x82, hi: 0x9b}, {value: 0x0013, lo: 0x9c, hi: 0x9c}, @@ -2082,12 +2080,12 @@ var sparseValues = [1362]valueRange{ {value: 0x0012, lo: 0xb6, hi: 0xb9}, {value: 0x0012, lo: 0xbb, hi: 0xbb}, {value: 0x0012, lo: 0xbd, hi: 0xbf}, - // Block 0xf3, offset 0x4f0 + // Block 0xf3, offset 0x4ee {value: 0x0012, lo: 0x80, hi: 0x83}, {value: 0x0012, lo: 0x85, hi: 0x8f}, {value: 0x0013, lo: 0x90, hi: 0xa9}, {value: 0x0012, lo: 0xaa, hi: 0xbf}, - // Block 0xf4, offset 0x4f4 + // Block 0xf4, offset 0x4f2 {value: 0x0012, lo: 0x80, hi: 0x83}, {value: 0x0013, lo: 0x84, hi: 0x85}, {value: 0x0013, lo: 0x87, hi: 0x8a}, @@ -2096,86 +2094,86 @@ var sparseValues = [1362]valueRange{ {value: 0x0012, lo: 0x9e, hi: 0xb7}, {value: 0x0013, lo: 0xb8, hi: 0xb9}, {value: 0x0013, lo: 0xbb, hi: 0xbe}, - // Block 0xf5, offset 0x4fc + // Block 0xf5, offset 0x4fa {value: 0x0013, lo: 0x80, hi: 0x84}, {value: 0x0013, lo: 0x86, hi: 0x86}, {value: 0x0013, lo: 0x8a, hi: 0x90}, {value: 0x0012, lo: 0x92, hi: 0xab}, {value: 0x0013, lo: 0xac, hi: 0xbf}, - // Block 0xf6, offset 0x501 + // Block 0xf6, offset 0x4ff {value: 0x0013, lo: 0x80, hi: 0x85}, {value: 0x0012, lo: 0x86, hi: 0x9f}, {value: 0x0013, lo: 0xa0, hi: 0xb9}, {value: 0x0012, lo: 0xba, hi: 0xbf}, - // Block 0xf7, offset 0x505 + // Block 0xf7, offset 0x503 {value: 0x0012, lo: 0x80, hi: 0x93}, {value: 0x0013, lo: 0x94, hi: 0xad}, {value: 0x0012, lo: 0xae, hi: 0xbf}, - // Block 0xf8, offset 0x508 + // Block 0xf8, offset 0x506 {value: 0x0012, lo: 0x80, hi: 0x87}, {value: 0x0013, lo: 0x88, hi: 0xa1}, {value: 0x0012, lo: 0xa2, hi: 0xbb}, {value: 0x0013, lo: 0xbc, hi: 0xbf}, - // Block 0xf9, offset 0x50c + // Block 0xf9, offset 0x50a {value: 0x0013, lo: 0x80, hi: 0x95}, {value: 0x0012, lo: 0x96, hi: 0xaf}, {value: 0x0013, lo: 0xb0, hi: 0xbf}, - // Block 0xfa, offset 0x50f + // Block 0xfa, offset 0x50d {value: 0x0013, lo: 0x80, hi: 0x89}, {value: 0x0012, lo: 0x8a, hi: 0xa5}, {value: 0x0013, lo: 0xa8, hi: 0xbf}, - // Block 0xfb, offset 0x512 + // Block 0xfb, offset 0x510 {value: 0x0013, lo: 0x80, hi: 0x80}, {value: 0x0012, lo: 0x82, hi: 0x9a}, {value: 0x0012, lo: 0x9c, hi: 0xa1}, {value: 0x0013, lo: 0xa2, hi: 0xba}, {value: 0x0012, lo: 0xbc, hi: 0xbf}, - // Block 0xfc, offset 0x517 + // Block 0xfc, offset 0x515 {value: 0x0012, lo: 0x80, hi: 0x94}, {value: 0x0012, lo: 0x96, hi: 0x9b}, {value: 0x0013, lo: 0x9c, hi: 0xb4}, {value: 0x0012, lo: 0xb6, hi: 0xbf}, - // Block 0xfd, offset 0x51b + // Block 0xfd, offset 0x519 {value: 0x0012, lo: 0x80, hi: 0x8e}, {value: 0x0012, lo: 0x90, hi: 0x95}, {value: 0x0013, lo: 0x96, hi: 0xae}, {value: 0x0012, lo: 0xb0, hi: 0xbf}, - // Block 0xfe, offset 0x51f + // Block 0xfe, offset 0x51d {value: 0x0012, lo: 0x80, hi: 0x88}, {value: 0x0012, lo: 0x8a, hi: 0x8f}, {value: 0x0013, lo: 0x90, hi: 0xa8}, {value: 0x0012, lo: 0xaa, hi: 0xbf}, - // Block 0xff, offset 0x523 + // Block 0xff, offset 0x521 {value: 0x0012, lo: 0x80, hi: 0x82}, {value: 0x0012, lo: 0x84, hi: 0x89}, {value: 0x0017, lo: 0x8a, hi: 0x8b}, {value: 0x0010, lo: 0x8e, hi: 0xbf}, - // Block 0x100, offset 0x527 + // Block 0x100, offset 0x525 {value: 0x0014, lo: 0x80, hi: 0xb6}, {value: 0x0014, lo: 0xbb, hi: 0xbf}, - // Block 0x101, offset 0x529 + // Block 0x101, offset 0x527 {value: 0x0014, lo: 0x80, hi: 0xac}, {value: 0x0014, lo: 0xb5, hi: 0xb5}, - // Block 0x102, offset 0x52b + // Block 0x102, offset 0x529 {value: 0x0014, lo: 0x84, hi: 0x84}, {value: 0x0014, lo: 0x9b, hi: 0x9f}, {value: 0x0014, lo: 0xa1, hi: 0xaf}, - // Block 0x103, offset 0x52e + // Block 0x103, offset 0x52c {value: 0x0024, lo: 0x80, hi: 0x86}, {value: 0x0024, lo: 0x88, hi: 0x98}, {value: 0x0024, lo: 0x9b, hi: 0xa1}, {value: 0x0024, lo: 0xa3, hi: 0xa4}, {value: 0x0024, lo: 0xa6, hi: 0xaa}, - // Block 0x104, offset 0x533 + // Block 0x104, offset 0x531 {value: 0x0010, lo: 0x80, hi: 0x84}, {value: 0x0034, lo: 0x90, hi: 0x96}, - // Block 0x105, offset 0x535 + // Block 0x105, offset 0x533 {value: 0xb552, lo: 0x80, hi: 0x81}, {value: 0xb852, lo: 0x82, hi: 0x83}, {value: 0x0024, lo: 0x84, hi: 0x89}, {value: 0x0034, lo: 0x8a, hi: 0x8a}, {value: 0x0010, lo: 0x90, hi: 0x99}, - // Block 0x106, offset 0x53a + // Block 0x106, offset 0x538 {value: 0x0010, lo: 0x80, hi: 0x83}, {value: 0x0010, lo: 0x85, hi: 0x9f}, {value: 0x0010, lo: 0xa1, hi: 0xa2}, @@ -2185,29 +2183,29 @@ var sparseValues = [1362]valueRange{ {value: 0x0010, lo: 0xb4, hi: 0xb7}, {value: 0x0010, lo: 0xb9, hi: 0xb9}, {value: 0x0010, lo: 0xbb, hi: 0xbb}, - // Block 0x107, offset 0x543 + // Block 0x107, offset 0x541 {value: 0x0010, lo: 0x80, hi: 0x89}, {value: 0x0010, lo: 0x8b, hi: 0x9b}, {value: 0x0010, lo: 0xa1, hi: 0xa3}, {value: 0x0010, lo: 0xa5, hi: 0xa9}, {value: 0x0010, lo: 0xab, hi: 0xbb}, - // Block 0x108, offset 0x548 + // Block 0x108, offset 0x546 {value: 0x0013, lo: 0xb0, hi: 0xbf}, - // Block 0x109, offset 0x549 + // Block 0x109, offset 0x547 {value: 0x0013, lo: 0x80, hi: 0x89}, {value: 0x0013, lo: 0x90, hi: 0xa9}, {value: 0x0013, lo: 0xb0, hi: 0xbf}, - // Block 0x10a, offset 0x54c + // Block 0x10a, offset 0x54a {value: 0x0013, lo: 0x80, hi: 0x89}, - // Block 0x10b, offset 0x54d + // Block 0x10b, offset 0x54b {value: 0x0004, lo: 0xbb, hi: 0xbf}, - // Block 0x10c, offset 0x54e + // Block 0x10c, offset 0x54c {value: 0x0014, lo: 0x81, hi: 0x81}, {value: 0x0014, lo: 0xa0, hi: 0xbf}, - // Block 0x10d, offset 0x550 + // Block 0x10d, offset 0x54e {value: 0x0014, lo: 0x80, hi: 0xbf}, - // Block 0x10e, offset 0x551 + // Block 0x10e, offset 0x54f {value: 0x0014, lo: 0x80, hi: 0xaf}, } -// Total table size 13819 bytes (13KiB); checksum: 4CC48DA3 +// Total table size 13811 bytes (13KiB); checksum: 4CC48DA3 diff --git a/vendor/golang.org/x/text/cases/trieval.go b/vendor/golang.org/x/text/cases/trieval.go index 7f2aa5b01b588..fb221f843f40b 100644 --- a/vendor/golang.org/x/text/cases/trieval.go +++ b/vendor/golang.org/x/text/cases/trieval.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package cases @@ -22,6 +22,7 @@ package cases // Only 13..8 are used for XOR patterns. // 7 inverseFold (fold to upper, not to lower) // 6 index: interpret the XOR pattern as an index +// or isMid if case mode is cIgnorableUncased. // 5..4 CCC: zero (normal or break), above or other // } // 3 exception: interpret this value as an exception index @@ -44,6 +45,7 @@ const ( ignorableValue = 0x0004 inverseFoldBit = 1 << 7 + isMidBit = 1 << 6 exceptionBit = 1 << 3 exceptionShift = 5 @@ -53,7 +55,7 @@ const ( xorShift = 8 // There is no mapping if all xor bits and the exception bit are zero. - hasMappingMask = 0xffc0 | exceptionBit + hasMappingMask = 0xff80 | exceptionBit ) // The case mode bits encodes the case type of a rune. This includes uncased, @@ -91,10 +93,6 @@ func (c info) isCaseIgnorable() bool { return c&ignorableMask == ignorableValue } -func (c info) isCaseIgnorableAndNonBreakStarter() bool { - return c&(fullCasedMask|cccMask) == (ignorableValue | cccZero) -} - func (c info) isNotCasedAndNotCaseIgnorable() bool { return c&fullCasedMask == 0 } @@ -103,6 +101,10 @@ func (c info) isCaseIgnorableAndNotCased() bool { return c&fullCasedMask == cIgnorableUncased } +func (c info) isMid() bool { + return c&(fullCasedMask|isMidBit) == isMidBit|cIgnorableUncased +} + // The case mapping implementation will need to know about various Canonical // Combining Class (CCC) values. We encode two of these in the trie value: // cccZero (0) and cccAbove (230). If the value is cccOther, it means that diff --git a/vendor/golang.org/x/text/encoding/encoding.go b/vendor/golang.org/x/text/encoding/encoding.go index 47fcd1fb16cc4..abc2c9ad15bec 100644 --- a/vendor/golang.org/x/text/encoding/encoding.go +++ b/vendor/golang.org/x/text/encoding/encoding.go @@ -52,7 +52,7 @@ type Decoder struct { } // Bytes converts the given encoded bytes to UTF-8. It returns the converted -// bytes or 0, err if any error occurred. +// bytes or nil, err if any error occurred. func (d *Decoder) Bytes(b []byte) ([]byte, error) { b, _, err := transform.Bytes(d, b) if err != nil { @@ -62,7 +62,7 @@ func (d *Decoder) Bytes(b []byte) ([]byte, error) { } // String converts the given encoded string to UTF-8. It returns the converted -// string or 0, err if any error occurred. +// string or "", err if any error occurred. func (d *Decoder) String(s string) (string, error) { s, _, err := transform.String(d, s) if err != nil { @@ -95,7 +95,7 @@ type Encoder struct { _ struct{} } -// Bytes converts bytes from UTF-8. It returns the converted bytes or 0, err if +// Bytes converts bytes from UTF-8. It returns the converted bytes or nil, err if // any error occurred. func (e *Encoder) Bytes(b []byte) ([]byte, error) { b, _, err := transform.Bytes(e, b) @@ -106,7 +106,7 @@ func (e *Encoder) Bytes(b []byte) ([]byte, error) { } // String converts a string from UTF-8. It returns the converted string or -// 0, err if any error occurred. +// "", err if any error occurred. func (e *Encoder) String(s string) (string, error) { s, _, err := transform.String(e, s) if err != nil { diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go index 2a2da0ef253d3..7351b4ef8af04 100644 --- a/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go +++ b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go @@ -36,8 +36,8 @@ package identifier // - http://www.ietf.org/rfc/rfc2978.txt // - http://www.unicode.org/reports/tr22/ // - http://www.w3.org/TR/encoding/ -// - http://www.w3.org/TR/encoding/indexes/encodings.json // - https://encoding.spec.whatwg.org/ +// - https://encoding.spec.whatwg.org/encodings.json // - https://tools.ietf.org/html/rfc6657#section-5 // Interface can be implemented by Encodings to define the CCS or CES for which diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go index 915abfa297340..768842b0a5a4b 100644 --- a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go +++ b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package identifier diff --git a/vendor/golang.org/x/text/internal/BUILD b/vendor/golang.org/x/text/internal/BUILD new file mode 100644 index 0000000000000..db72573882e32 --- /dev/null +++ b/vendor/golang.org/x/text/internal/BUILD @@ -0,0 +1,36 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "internal.go", + "match.go", + "tables.go", + ], + tags = ["automanaged"], + deps = ["//vendor/golang.org/x/text/language:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/golang.org/x/text/internal/tag:all-srcs", + "//vendor/golang.org/x/text/internal/utf8internal:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/vendor/golang.org/x/text/internal/gen.go b/vendor/golang.org/x/text/internal/gen.go new file mode 100644 index 0000000000000..1d678af574059 --- /dev/null +++ b/vendor/golang.org/x/text/internal/gen.go @@ -0,0 +1,52 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +import ( + "log" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/language" + "golang.org/x/text/unicode/cldr" +) + +func main() { + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + data, err := d.DecodeZip(r) + if err != nil { + log.Fatalf("DecodeZip: %v", err) + } + + w := gen.NewCodeWriter() + defer w.WriteGoFile("tables.go", "internal") + + // Create parents table. + parents := make([]uint16, language.NumCompactTags) + for _, loc := range data.Locales() { + tag := language.MustParse(loc) + index, ok := language.CompactIndex(tag) + if !ok { + continue + } + parentIndex := 0 // und + for p := tag.Parent(); p != language.Und; p = p.Parent() { + if x, ok := language.CompactIndex(p); ok { + parentIndex = x + break + } + } + parents[index] = uint16(parentIndex) + } + + w.WriteComment(` + Parent maps a compact index of a tag to the compact index of the parent of + this tag.`) + w.WriteVar("Parent", parents) +} diff --git a/vendor/golang.org/x/text/internal/internal.go b/vendor/golang.org/x/text/internal/internal.go new file mode 100644 index 0000000000000..b39dc212245d8 --- /dev/null +++ b/vendor/golang.org/x/text/internal/internal.go @@ -0,0 +1,51 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate go run gen.go + +// Package internal contains non-exported functionality that are used by +// packages in the text repository. +package internal + +import ( + "sort" + + "golang.org/x/text/language" +) + +// SortTags sorts tags in place. +func SortTags(tags []language.Tag) { + sort.Sort(sorter(tags)) +} + +type sorter []language.Tag + +func (s sorter) Len() int { + return len(s) +} + +func (s sorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s sorter) Less(i, j int) bool { + return s[i].String() < s[j].String() +} + +// UniqueTags sorts and filters duplicate tags in place and returns a slice with +// only unique tags. +func UniqueTags(tags []language.Tag) []language.Tag { + if len(tags) <= 1 { + return tags + } + SortTags(tags) + k := 0 + for i := 1; i < len(tags); i++ { + if tags[k].String() < tags[i].String() { + k++ + tags[k] = tags[i] + } + } + return tags[:k+1] +} diff --git a/vendor/golang.org/x/text/internal/match.go b/vendor/golang.org/x/text/internal/match.go new file mode 100644 index 0000000000000..a67fcaca13f29 --- /dev/null +++ b/vendor/golang.org/x/text/internal/match.go @@ -0,0 +1,67 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal + +// This file contains matchers that implement CLDR inheritance. +// +// See http://unicode.org/reports/tr35/#Locale_Inheritance. +// +// Some of the inheritance described in this document is already handled by +// the cldr package. + +import ( + "golang.org/x/text/language" +) + +// TODO: consider if (some of the) matching algorithm needs to be public after +// getting some feel about what is generic and what is specific. + +// NewInheritanceMatcher returns a matcher that matches based on the inheritance +// chain. +// +// The matcher uses canonicalization and the parent relationship to find a +// match. The resulting match will always be either Und or a language with the +// same language and script as the requested language. It will not match +// languages for which there is understood to be mutual or one-directional +// intelligibility. +// +// A Match will indicate an Exact match if the language matches after +// canonicalization and High if the matched tag is a parent. +func NewInheritanceMatcher(t []language.Tag) *InheritanceMatcher { + tags := &InheritanceMatcher{make(map[language.Tag]int)} + for i, tag := range t { + ct, err := language.All.Canonicalize(tag) + if err != nil { + ct = tag + } + tags.index[ct] = i + } + return tags +} + +type InheritanceMatcher struct { + index map[language.Tag]int +} + +func (m InheritanceMatcher) Match(want ...language.Tag) (language.Tag, int, language.Confidence) { + for _, t := range want { + ct, err := language.All.Canonicalize(t) + if err != nil { + ct = t + } + conf := language.Exact + for { + if index, ok := m.index[ct]; ok { + return ct, index, conf + } + if ct == language.Und { + break + } + ct = ct.Parent() + conf = language.High + } + } + return language.Und, 0, language.No +} diff --git a/vendor/golang.org/x/text/internal/tables.go b/vendor/golang.org/x/text/internal/tables.go new file mode 100644 index 0000000000000..a53042aab3e64 --- /dev/null +++ b/vendor/golang.org/x/text/internal/tables.go @@ -0,0 +1,117 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +package internal + +// Parent maps a compact index of a tag to the compact index of the parent of +// this tag. +var Parent = []uint16{ // 754 elements + // Entry 0 - 3F + 0x0000, 0x0053, 0x00e5, 0x0000, 0x0003, 0x0003, 0x0000, 0x0006, + 0x0000, 0x0008, 0x0000, 0x000a, 0x0000, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x0000, 0x0000, 0x002a, 0x0000, 0x002c, 0x0000, 0x002e, + 0x0000, 0x0000, 0x0031, 0x0030, 0x0030, 0x0000, 0x0035, 0x0000, + 0x0037, 0x0000, 0x0039, 0x0000, 0x003b, 0x0000, 0x003d, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0040, 0x0000, 0x0042, 0x0042, 0x0000, 0x0045, 0x0045, + 0x0000, 0x0048, 0x0000, 0x004a, 0x0000, 0x0000, 0x004d, 0x004c, + 0x004c, 0x0000, 0x0051, 0x0051, 0x0051, 0x0051, 0x0000, 0x0056, + 0x0000, 0x0058, 0x0000, 0x005a, 0x0000, 0x005c, 0x005c, 0x0000, + 0x005f, 0x0000, 0x0061, 0x0000, 0x0063, 0x0000, 0x0065, 0x0065, + 0x0000, 0x0068, 0x0000, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, + 0x006a, 0x006a, 0x0000, 0x0072, 0x0000, 0x0074, 0x0000, 0x0076, + 0x0000, 0x0000, 0x0079, 0x0000, 0x007b, 0x0000, 0x007d, 0x0000, + // Entry 80 - BF + 0x007f, 0x007f, 0x0000, 0x0082, 0x0082, 0x0000, 0x0085, 0x0086, + 0x0086, 0x0086, 0x0085, 0x0087, 0x0086, 0x0086, 0x0086, 0x0085, + 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0087, 0x0086, + 0x0086, 0x0086, 0x0086, 0x0087, 0x0086, 0x0087, 0x0086, 0x0086, + 0x0087, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, + 0x0086, 0x0086, 0x0085, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, + 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, + 0x0086, 0x0086, 0x0086, 0x0086, 0x0085, 0x0086, 0x0085, 0x0086, + // Entry C0 - FF + 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0087, + 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0085, + 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0087, 0x0086, 0x0086, + 0x0087, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, + 0x0086, 0x0086, 0x0086, 0x0086, 0x0085, 0x0085, 0x0086, 0x0086, + 0x0085, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0000, 0x00ee, + 0x0000, 0x00f0, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, + 0x00f1, 0x00f1, 0x00f1, 0x00f0, 0x00f1, 0x00f0, 0x00f0, 0x00f1, + // Entry 100 - 13F + 0x00f1, 0x00f0, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f0, 0x00f1, + 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x0000, 0x010d, 0x0000, + 0x010f, 0x0000, 0x0111, 0x0000, 0x0113, 0x0113, 0x0000, 0x0116, + 0x0116, 0x0116, 0x0116, 0x0000, 0x011b, 0x0000, 0x011d, 0x0000, + 0x011f, 0x011f, 0x0000, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, + 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, + 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, + 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, + // Entry 140 - 17F + 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, + 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, + 0x0122, 0x0000, 0x0151, 0x0000, 0x0153, 0x0000, 0x0155, 0x0000, + 0x0157, 0x0000, 0x0159, 0x0000, 0x015b, 0x015b, 0x015b, 0x0000, + 0x015f, 0x0000, 0x0000, 0x0162, 0x0000, 0x0164, 0x0000, 0x0166, + 0x0166, 0x0166, 0x0000, 0x016a, 0x0000, 0x016c, 0x0000, 0x016e, + 0x0000, 0x0170, 0x0170, 0x0000, 0x0173, 0x0000, 0x0175, 0x0000, + 0x0177, 0x0000, 0x0179, 0x0000, 0x017b, 0x0000, 0x017d, 0x0000, + // Entry 180 - 1BF + 0x017f, 0x0000, 0x0181, 0x0181, 0x0181, 0x0181, 0x0000, 0x0000, + 0x0187, 0x0000, 0x0000, 0x018a, 0x0000, 0x018c, 0x0000, 0x0000, + 0x018f, 0x0000, 0x0191, 0x0000, 0x0000, 0x0194, 0x0000, 0x0000, + 0x0197, 0x0000, 0x0199, 0x0000, 0x019b, 0x0000, 0x019d, 0x0000, + 0x019f, 0x0000, 0x01a1, 0x0000, 0x01a3, 0x0000, 0x01a5, 0x0000, + 0x01a7, 0x0000, 0x01a9, 0x0000, 0x01ab, 0x01ab, 0x0000, 0x01ae, + 0x0000, 0x01b0, 0x0000, 0x01b2, 0x0000, 0x01b4, 0x0000, 0x01b6, + 0x0000, 0x0000, 0x01b9, 0x0000, 0x01bb, 0x0000, 0x01bd, 0x0000, + // Entry 1C0 - 1FF + 0x01bf, 0x0000, 0x01c1, 0x0000, 0x01c3, 0x0000, 0x01c5, 0x01c5, + 0x01c5, 0x01c5, 0x0000, 0x01ca, 0x0000, 0x01cc, 0x01cc, 0x0000, + 0x01cf, 0x0000, 0x01d1, 0x0000, 0x01d3, 0x0000, 0x01d5, 0x0000, + 0x01d7, 0x0000, 0x01d9, 0x01d9, 0x0000, 0x01dc, 0x0000, 0x01de, + 0x0000, 0x01e0, 0x0000, 0x01e2, 0x0000, 0x01e4, 0x0000, 0x01e6, + 0x0000, 0x01e8, 0x0000, 0x01ea, 0x0000, 0x01ec, 0x0000, 0x01ee, + 0x01ee, 0x01ee, 0x0000, 0x01f2, 0x0000, 0x01f4, 0x0000, 0x01f6, + 0x0000, 0x01f8, 0x0000, 0x0000, 0x01fb, 0x0000, 0x01fd, 0x01fd, + // Entry 200 - 23F + 0x0000, 0x0200, 0x0000, 0x0202, 0x0202, 0x0000, 0x0205, 0x0205, + 0x0000, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, + 0x0000, 0x0210, 0x0000, 0x0212, 0x0000, 0x0214, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x021a, 0x0000, 0x0000, 0x021d, 0x0000, + 0x021f, 0x021f, 0x0000, 0x0222, 0x0000, 0x0224, 0x0224, 0x0000, + 0x0000, 0x0228, 0x0227, 0x0227, 0x0000, 0x0000, 0x022d, 0x0000, + 0x022f, 0x0000, 0x0231, 0x0000, 0x023d, 0x0233, 0x023d, 0x023d, + 0x023d, 0x023d, 0x023d, 0x023d, 0x023d, 0x0233, 0x023d, 0x023d, + // Entry 240 - 27F + 0x0000, 0x0240, 0x0240, 0x0240, 0x0000, 0x0244, 0x0000, 0x0246, + 0x0000, 0x0248, 0x0248, 0x0000, 0x024b, 0x0000, 0x024d, 0x024d, + 0x024d, 0x024d, 0x024d, 0x024d, 0x0000, 0x0254, 0x0000, 0x0256, + 0x0000, 0x0258, 0x0000, 0x025a, 0x0000, 0x025c, 0x0000, 0x0000, + 0x025f, 0x025f, 0x025f, 0x0000, 0x0263, 0x0000, 0x0265, 0x0000, + 0x0267, 0x0000, 0x0000, 0x026a, 0x0269, 0x0269, 0x0000, 0x026e, + 0x0000, 0x0270, 0x0000, 0x0272, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0277, 0x0000, 0x0000, 0x027a, 0x0000, 0x027c, 0x027c, 0x027c, + // Entry 280 - 2BF + 0x027c, 0x0000, 0x0281, 0x0281, 0x0281, 0x0000, 0x0285, 0x0285, + 0x0285, 0x0285, 0x0285, 0x0000, 0x028b, 0x028b, 0x028b, 0x028b, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0293, 0x0293, 0x0293, 0x0000, + 0x0297, 0x0297, 0x0297, 0x0297, 0x0000, 0x0000, 0x029d, 0x029d, + 0x029d, 0x029d, 0x0000, 0x02a2, 0x0000, 0x02a4, 0x02a4, 0x0000, + 0x02a7, 0x0000, 0x02a9, 0x02a9, 0x0000, 0x0000, 0x02ad, 0x0000, + 0x0000, 0x02b0, 0x0000, 0x02b2, 0x02b2, 0x0000, 0x0000, 0x02b6, + 0x0000, 0x02b8, 0x0000, 0x02ba, 0x0000, 0x02bc, 0x0000, 0x02be, + // Entry 2C0 - 2FF + 0x02be, 0x0000, 0x0000, 0x02c2, 0x0000, 0x02c4, 0x02c1, 0x02c1, + 0x0000, 0x0000, 0x02c9, 0x02c8, 0x02c8, 0x0000, 0x0000, 0x02ce, + 0x0000, 0x02d0, 0x0000, 0x02d2, 0x0000, 0x0000, 0x02d5, 0x0000, + 0x0000, 0x0000, 0x02d9, 0x0000, 0x02db, 0x0000, 0x02dd, 0x0000, + 0x02df, 0x02df, 0x0000, 0x02e2, 0x0000, 0x02e4, 0x0000, 0x02e6, + 0x02e6, 0x02e6, 0x02e6, 0x02e6, 0x0000, 0x02ec, 0x02ed, 0x02ec, + 0x0000, 0x02f0, +} // Size: 1532 bytes + +// Total table size 1532 bytes (1KiB); checksum: 90718A2 diff --git a/vendor/golang.org/x/text/language/common.go b/vendor/golang.org/x/text/language/common.go index a255bb0a50261..9d86e18554339 100644 --- a/vendor/golang.org/x/text/language/common.go +++ b/vendor/golang.org/x/text/language/common.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package language diff --git a/vendor/golang.org/x/text/language/maketables.go b/vendor/golang.org/x/text/language/gen.go similarity index 91% rename from vendor/golang.org/x/text/language/maketables.go rename to vendor/golang.org/x/text/language/gen.go index 2cc995b379e01..153269bc1005e 100644 --- a/vendor/golang.org/x/text/language/maketables.go +++ b/vendor/golang.org/x/text/language/gen.go @@ -678,6 +678,8 @@ func (b *builder) parseIndices() { b.locale.parse(meta.DefaultContent.Locales) } +// TODO: region inclusion data will probably not be use used in future matchers. + func (b *builder) computeRegionGroups() { b.groups = make(map[int]index) @@ -686,6 +688,11 @@ func (b *builder) computeRegionGroups() { b.groups[i] = index(len(b.groups)) } for _, g := range b.supp.TerritoryContainment.Group { + // Skip UN and EURO zone as they are flattening the containment + // relationship. + if g.Type == "EZ" || g.Type == "UN" { + continue + } group := b.region.index(g.Type) if _, ok := b.groups[group]; !ok { b.groups[group] = index(len(b.groups)) @@ -782,6 +789,7 @@ func (b *builder) writeLanguage() { lang.updateLater("tw", "twi") lang.updateLater("nb", "nob") lang.updateLater("ak", "aka") + lang.updateLater("bh", "bih") // Ensure that each 2-letter code is matched with a 3-letter code. for _, v := range lang.s[1:] { @@ -798,10 +806,10 @@ func (b *builder) writeLanguage() { } } - // Complete canonialized language tags. + // Complete canonicalized language tags. lang.freeze() for i, v := range lang.s { - // We can avoid these manual entries by using the IANI registry directly. + // We can avoid these manual entries by using the IANA registry directly. // Seems easier to update the list manually, as changes are rare. // The panic in this loop will trigger if we miss an entry. add := "" @@ -908,7 +916,7 @@ func (b *builder) writeRegion() { i := b.region.index(s) for _, d := range e.description { if strings.Contains(d, "Private use") { - regionTypes[i] = iso3166UserAssgined + regionTypes[i] = iso3166UserAssigned } } regionTypes[i] |= bcp47Region @@ -1065,7 +1073,7 @@ const ( ) const ( - iso3166UserAssgined = 1 << iota + iso3166UserAssigned = 1 << iota ccTLD bcp47Region ) @@ -1355,42 +1363,23 @@ func (b *builder) writeLikelyData() { type mutualIntelligibility struct { want, have uint16 - conf uint8 + distance uint8 oneway bool } type scriptIntelligibility struct { - lang uint16 // langID or 0 if * - want, have uint8 - conf uint8 -} - -type sortByConf []mutualIntelligibility - -func (l sortByConf) Less(a, b int) bool { - return l[a].conf > l[b].conf + wantLang, haveLang uint16 + wantScript, haveScript uint8 + distance uint8 + // Always oneway } -func (l sortByConf) Swap(a, b int) { - l[a], l[b] = l[b], l[a] -} - -func (l sortByConf) Len() int { - return len(l) -} - -// toConf converts a percentage value [0, 100] to a confidence class. -func toConf(pct uint8) uint8 { - switch { - case pct == 100: - return 3 // Exact - case pct >= 90: - return 2 // High - case pct > 50: - return 1 // Low - default: - return 0 // No - } +type regionIntelligibility struct { + lang uint16 // compact language id + script uint8 // 0 means any + group uint8 // 0 means any; if bit 7 is set it means inverse + distance uint8 + // Always twoway. } // writeMatchData writes tables with languages and scripts for which there is @@ -1400,13 +1389,50 @@ func toConf(pct uint8) uint8 { // We also drop all region-related data as we use a different algorithm to // determine region equivalence. func (b *builder) writeMatchData() { - b.writeType(mutualIntelligibility{}) - b.writeType(scriptIntelligibility{}) lm := b.supp.LanguageMatching.LanguageMatches - cldr.MakeSlice(&lm).SelectAnyOf("type", "written") + cldr.MakeSlice(&lm).SelectAnyOf("type", "written_new") + + regionHierarchy := map[string][]string{} + for _, g := range b.supp.TerritoryContainment.Group { + regions := strings.Split(g.Contains, " ") + regionHierarchy[g.Type] = append(regionHierarchy[g.Type], regions...) + } + regionToGroups := make([]uint8, len(b.region.s)) - matchLang := []mutualIntelligibility{} + idToIndex := map[string]uint8{} + for i, mv := range lm[0].MatchVariable { + if i > 6 { + log.Fatalf("Too many groups: %d", i) + } + idToIndex[mv.Id] = uint8(i + 1) + // TODO: also handle '-' + for _, r := range strings.Split(mv.Value, "+") { + todo := []string{r} + for k := 0; k < len(todo); k++ { + r := todo[k] + regionToGroups[b.region.index(r)] |= 1 << uint8(i) + todo = append(todo, regionHierarchy[r]...) + } + } + } + b.writeSlice("regionToGroups", regionToGroups) + + b.writeType(mutualIntelligibility{}) + b.writeType(scriptIntelligibility{}) + b.writeType(regionIntelligibility{}) + + matchLang := []mutualIntelligibility{{ + // TODO: remove once CLDR is fixed. + want: uint16(b.langIndex("sr")), + have: uint16(b.langIndex("hr")), + distance: uint8(5), + }, { + want: uint16(b.langIndex("sr")), + have: uint16(b.langIndex("bs")), + distance: uint8(5), + }} matchScript := []scriptIntelligibility{} + matchRegion := []regionIntelligibility{} // Convert the languageMatch entries in lists keyed by desired language. for _, m := range lm[0].LanguageMatch { // Different versions of CLDR use different separators. @@ -1414,33 +1440,38 @@ func (b *builder) writeMatchData() { supported := strings.Replace(m.Supported, "-", "_", -1) d := strings.Split(desired, "_") s := strings.Split(supported, "_") - if len(d) != len(s) || len(d) > 2 { - // Skip all entries with regions and work around CLDR bug. + if len(d) != len(s) { + log.Fatalf("not supported: desired=%q; supported=%q", desired, supported) continue } - pct, _ := strconv.ParseInt(m.Percent, 10, 8) - if len(d) == 2 && d[0] == s[0] && len(d[1]) == 4 { - // language-script pair. - lang := uint16(0) - if d[0] != "*" { - lang = uint16(b.langIndex(d[0])) + distance, _ := strconv.ParseInt(m.Distance, 10, 8) + switch len(d) { + case 2: + if desired == supported && desired == "*_*" { + continue } + // language-script pair. matchScript = append(matchScript, scriptIntelligibility{ - lang: lang, - want: uint8(b.script.index(d[1])), - have: uint8(b.script.index(s[1])), - conf: toConf(uint8(pct)), + wantLang: uint16(b.langIndex(d[0])), + haveLang: uint16(b.langIndex(s[0])), + wantScript: uint8(b.script.index(d[1])), + haveScript: uint8(b.script.index(s[1])), + distance: uint8(distance), }) if m.Oneway != "true" { matchScript = append(matchScript, scriptIntelligibility{ - lang: lang, - want: uint8(b.script.index(s[1])), - have: uint8(b.script.index(d[1])), - conf: toConf(uint8(pct)), + wantLang: uint16(b.langIndex(s[0])), + haveLang: uint16(b.langIndex(d[0])), + wantScript: uint8(b.script.index(s[1])), + haveScript: uint8(b.script.index(d[1])), + distance: uint8(distance), }) } - } else if len(d) == 1 && d[0] != "*" { - if pct == 100 { + case 1: + if desired == supported && desired == "*" { + continue + } + if distance == 1 { // nb == no is already handled by macro mapping. Check there // really is only this case. if d[0] != "no" || s[0] != "nb" { @@ -1448,28 +1479,57 @@ func (b *builder) writeMatchData() { } continue } + // TODO: consider dropping oneway field and just doubling the entry. matchLang = append(matchLang, mutualIntelligibility{ - want: uint16(b.langIndex(d[0])), - have: uint16(b.langIndex(s[0])), - conf: uint8(pct), - oneway: m.Oneway == "true", + want: uint16(b.langIndex(d[0])), + have: uint16(b.langIndex(s[0])), + distance: uint8(distance), + oneway: m.Oneway == "true", }) - } else { - // TODO: Handle other mappings. - a := []string{"*;*", "*_*;*_*", "es_MX;es_419"} - s := strings.Join([]string{desired, supported}, ";") - if i := sort.SearchStrings(a, s); i == len(a) || a[i] != s { - log.Printf("%q not handled", s) + case 3: + if desired == supported && desired == "*_*_*" { + continue + } + if desired != supported { // (Weird but correct.) + log.Fatalf("not supported: desired=%q; supported=%q", desired, supported) + continue + } + ri := regionIntelligibility{ + lang: b.langIndex(d[0]), + distance: uint8(distance), } + if d[1] != "*" { + ri.script = uint8(b.script.index(d[1])) + } + switch { + case d[2] == "*": + ri.group = 0x80 // not contained in anything + case strings.HasPrefix(d[2], "$!"): + ri.group = 0x80 + d[2] = "$" + d[2][len("$!"):] + fallthrough + case strings.HasPrefix(d[2], "$"): + ri.group |= idToIndex[d[2]] + } + matchRegion = append(matchRegion, ri) + default: + log.Fatalf("not supported: desired=%q; supported=%q", desired, supported) } } - sort.Stable(sortByConf(matchLang)) - // collapse percentage into confidence classes - for i, m := range matchLang { - matchLang[i].conf = toConf(m.conf) - } + sort.SliceStable(matchLang, func(i, j int) bool { + return matchLang[i].distance < matchLang[j].distance + }) b.writeSlice("matchLang", matchLang) + + sort.SliceStable(matchScript, func(i, j int) bool { + return matchScript[i].distance < matchScript[j].distance + }) b.writeSlice("matchScript", matchScript) + + sort.SliceStable(matchRegion, func(i, j int) bool { + return matchRegion[i].distance < matchRegion[j].distance + }) + b.writeSlice("matchRegion", matchRegion) } func (b *builder) writeRegionInclusionData() { @@ -1482,6 +1542,11 @@ func (b *builder) writeRegionInclusionData() { containment = make(map[index][]index) ) for _, g := range b.supp.TerritoryContainment.Group { + // Skip UN and EURO zone as they are flattening the containment + // relationship. + if g.Type == "EZ" || g.Type == "UN" { + continue + } group := b.region.index(g.Type) groupIdx := b.groups[group] for _, mem := range strings.Split(g.Contains, " ") { @@ -1508,7 +1573,6 @@ func (b *builder) writeRegionInclusionData() { for _, v := range l { regionContainment[g] |= 1 << v } - // log.Printf("%d: %X", g, regionContainment[g]) } b.writeSlice("regionContainment", regionContainment) diff --git a/vendor/golang.org/x/text/language/index.go b/vendor/golang.org/x/text/language/index.go index 7fa9cc82d1db2..973db9fd54f82 100644 --- a/vendor/golang.org/x/text/language/index.go +++ b/vendor/golang.org/x/text/language/index.go @@ -1,762 +1,769 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package language // NumCompactTags is the number of common tags. The maximum tag is // NumCompactTags-1. -const NumCompactTags = 747 +const NumCompactTags = 754 var specialTags = []Tag{ // 2 elements - 0: {lang: 0x61, region: 0x6d, script: 0x0, pVariant: 0x5, pExt: 0xe, str: "ca-ES-valencia"}, - 1: {lang: 0x9b, region: 0x132, script: 0x0, pVariant: 0x5, pExt: 0x5, str: "en-US-u-va-posix"}, + 0: {lang: 0xd7, region: 0x6d, script: 0x0, pVariant: 0x5, pExt: 0xe, str: "ca-ES-valencia"}, + 1: {lang: 0x138, region: 0x134, script: 0x0, pVariant: 0x5, pExt: 0x5, str: "en-US-u-va-posix"}, } // Size: 72 bytes var coreTags = map[uint32]uint16{ 0x0: 0, // und - 0x00a00000: 3, // af - 0x00a000d0: 4, // af-NA - 0x00a0015e: 5, // af-ZA - 0x00b00000: 6, // agq - 0x00b00051: 7, // agq-CM - 0x00d00000: 8, // ak - 0x00d0007e: 9, // ak-GH - 0x01100000: 10, // am - 0x0110006e: 11, // am-ET - 0x01500000: 12, // ar - 0x01500001: 13, // ar-001 - 0x01500022: 14, // ar-AE - 0x01500038: 15, // ar-BH - 0x01500061: 16, // ar-DJ - 0x01500066: 17, // ar-DZ - 0x0150006a: 18, // ar-EG - 0x0150006b: 19, // ar-EH - 0x0150006c: 20, // ar-ER - 0x01500095: 21, // ar-IL - 0x01500099: 22, // ar-IQ - 0x0150009f: 23, // ar-JO - 0x015000a6: 24, // ar-KM - 0x015000aa: 25, // ar-KW - 0x015000ae: 26, // ar-LB - 0x015000b7: 27, // ar-LY - 0x015000b8: 28, // ar-MA - 0x015000c7: 29, // ar-MR - 0x015000df: 30, // ar-OM - 0x015000eb: 31, // ar-PS - 0x015000f1: 32, // ar-QA - 0x01500106: 33, // ar-SA - 0x01500109: 34, // ar-SD - 0x01500113: 35, // ar-SO - 0x01500115: 36, // ar-SS - 0x0150011a: 37, // ar-SY - 0x0150011e: 38, // ar-TD - 0x01500126: 39, // ar-TN - 0x0150015b: 40, // ar-YE - 0x01c00000: 41, // as - 0x01c00097: 42, // as-IN - 0x01d00000: 43, // asa - 0x01d0012d: 44, // asa-TZ - 0x01f00000: 45, // ast - 0x01f0006d: 46, // ast-ES - 0x02400000: 47, // az - 0x0241e000: 48, // az-Cyrl - 0x0241e031: 49, // az-Cyrl-AZ - 0x02452000: 50, // az-Latn - 0x02452031: 51, // az-Latn-AZ - 0x02a00000: 52, // bas - 0x02a00051: 53, // bas-CM - 0x02f00000: 54, // be - 0x02f00046: 55, // be-BY - 0x03100000: 56, // bem - 0x0310015f: 57, // bem-ZM - 0x03300000: 58, // bez - 0x0330012d: 59, // bez-TZ - 0x03800000: 60, // bg - 0x03800037: 61, // bg-BG - 0x03c00000: 62, // bh - 0x04900000: 63, // bm - 0x049000c1: 64, // bm-ML - 0x04b00000: 65, // bn - 0x04b00034: 66, // bn-BD - 0x04b00097: 67, // bn-IN - 0x04c00000: 68, // bo - 0x04c00052: 69, // bo-CN - 0x04c00097: 70, // bo-IN - 0x05000000: 71, // br - 0x05000076: 72, // br-FR - 0x05300000: 73, // brx - 0x05300097: 74, // brx-IN - 0x05400000: 75, // bs - 0x0541e000: 76, // bs-Cyrl - 0x0541e032: 77, // bs-Cyrl-BA - 0x05452000: 78, // bs-Latn - 0x05452032: 79, // bs-Latn-BA - 0x06100000: 80, // ca - 0x06100021: 81, // ca-AD - 0x0610006d: 82, // ca-ES - 0x06100076: 83, // ca-FR - 0x0610009c: 84, // ca-IT - 0x06400000: 85, // ce - 0x06400104: 86, // ce-RU - 0x06600000: 87, // cgg - 0x0660012f: 88, // cgg-UG - 0x06c00000: 89, // chr - 0x06c00132: 90, // chr-US - 0x06f00000: 91, // ckb - 0x06f00099: 92, // ckb-IQ - 0x06f0009a: 93, // ckb-IR - 0x07900000: 94, // cs - 0x0790005d: 95, // cs-CZ - 0x07d00000: 96, // cu - 0x07d00104: 97, // cu-RU - 0x07f00000: 98, // cy - 0x07f00079: 99, // cy-GB - 0x08000000: 100, // da - 0x08000062: 101, // da-DK - 0x08000080: 102, // da-GL - 0x08300000: 103, // dav - 0x083000a2: 104, // dav-KE - 0x08500000: 105, // de - 0x0850002d: 106, // de-AT - 0x08500035: 107, // de-BE - 0x0850004d: 108, // de-CH - 0x0850005f: 109, // de-DE - 0x085000b0: 110, // de-LI - 0x085000b5: 111, // de-LU - 0x08800000: 112, // dje - 0x088000d2: 113, // dje-NE - 0x08b00000: 114, // dsb - 0x08b0005f: 115, // dsb-DE - 0x08f00000: 116, // dua - 0x08f00051: 117, // dua-CM - 0x09000000: 118, // dv - 0x09100000: 119, // dyo - 0x09100112: 120, // dyo-SN - 0x09300000: 121, // dz - 0x09300042: 122, // dz-BT - 0x09400000: 123, // ebu - 0x094000a2: 124, // ebu-KE - 0x09500000: 125, // ee - 0x0950007e: 126, // ee-GH - 0x09500120: 127, // ee-TG - 0x09a00000: 128, // el - 0x09a0005c: 129, // el-CY - 0x09a00085: 130, // el-GR - 0x09b00000: 131, // en - 0x09b00001: 132, // en-001 - 0x09b0001a: 133, // en-150 - 0x09b00024: 134, // en-AG - 0x09b00025: 135, // en-AI - 0x09b0002c: 136, // en-AS - 0x09b0002d: 137, // en-AT - 0x09b0002e: 138, // en-AU - 0x09b00033: 139, // en-BB - 0x09b00035: 140, // en-BE - 0x09b00039: 141, // en-BI - 0x09b0003c: 142, // en-BM - 0x09b00041: 143, // en-BS - 0x09b00045: 144, // en-BW - 0x09b00047: 145, // en-BZ - 0x09b00048: 146, // en-CA - 0x09b00049: 147, // en-CC - 0x09b0004d: 148, // en-CH - 0x09b0004f: 149, // en-CK - 0x09b00051: 150, // en-CM - 0x09b0005b: 151, // en-CX - 0x09b0005c: 152, // en-CY - 0x09b0005f: 153, // en-DE - 0x09b00060: 154, // en-DG - 0x09b00062: 155, // en-DK - 0x09b00063: 156, // en-DM - 0x09b0006c: 157, // en-ER - 0x09b00070: 158, // en-FI - 0x09b00071: 159, // en-FJ - 0x09b00072: 160, // en-FK - 0x09b00073: 161, // en-FM - 0x09b00079: 162, // en-GB - 0x09b0007a: 163, // en-GD - 0x09b0007d: 164, // en-GG - 0x09b0007e: 165, // en-GH - 0x09b0007f: 166, // en-GI - 0x09b00081: 167, // en-GM - 0x09b00088: 168, // en-GU - 0x09b0008a: 169, // en-GY - 0x09b0008b: 170, // en-HK - 0x09b00094: 171, // en-IE - 0x09b00095: 172, // en-IL - 0x09b00096: 173, // en-IM - 0x09b00097: 174, // en-IN - 0x09b00098: 175, // en-IO - 0x09b0009d: 176, // en-JE - 0x09b0009e: 177, // en-JM - 0x09b000a2: 178, // en-KE - 0x09b000a5: 179, // en-KI - 0x09b000a7: 180, // en-KN - 0x09b000ab: 181, // en-KY - 0x09b000af: 182, // en-LC - 0x09b000b2: 183, // en-LR - 0x09b000b3: 184, // en-LS - 0x09b000bd: 185, // en-MG - 0x09b000be: 186, // en-MH - 0x09b000c4: 187, // en-MO - 0x09b000c5: 188, // en-MP - 0x09b000c8: 189, // en-MS - 0x09b000c9: 190, // en-MT - 0x09b000ca: 191, // en-MU - 0x09b000cc: 192, // en-MW - 0x09b000ce: 193, // en-MY - 0x09b000d0: 194, // en-NA - 0x09b000d3: 195, // en-NF - 0x09b000d4: 196, // en-NG - 0x09b000d7: 197, // en-NL - 0x09b000db: 198, // en-NR - 0x09b000dd: 199, // en-NU - 0x09b000de: 200, // en-NZ - 0x09b000e4: 201, // en-PG - 0x09b000e5: 202, // en-PH - 0x09b000e6: 203, // en-PK - 0x09b000e9: 204, // en-PN - 0x09b000ea: 205, // en-PR - 0x09b000ee: 206, // en-PW - 0x09b00105: 207, // en-RW - 0x09b00107: 208, // en-SB - 0x09b00108: 209, // en-SC - 0x09b00109: 210, // en-SD - 0x09b0010a: 211, // en-SE - 0x09b0010b: 212, // en-SG - 0x09b0010c: 213, // en-SH - 0x09b0010d: 214, // en-SI - 0x09b00110: 215, // en-SL - 0x09b00115: 216, // en-SS - 0x09b00119: 217, // en-SX - 0x09b0011b: 218, // en-SZ - 0x09b0011d: 219, // en-TC - 0x09b00123: 220, // en-TK - 0x09b00127: 221, // en-TO - 0x09b0012a: 222, // en-TT - 0x09b0012b: 223, // en-TV - 0x09b0012d: 224, // en-TZ - 0x09b0012f: 225, // en-UG - 0x09b00131: 226, // en-UM - 0x09b00132: 227, // en-US - 0x09b00136: 228, // en-VC - 0x09b00139: 229, // en-VG - 0x09b0013a: 230, // en-VI - 0x09b0013c: 231, // en-VU - 0x09b0013f: 232, // en-WS - 0x09b0015e: 233, // en-ZA - 0x09b0015f: 234, // en-ZM - 0x09b00161: 235, // en-ZW - 0x09c00000: 236, // eo - 0x09c00001: 237, // eo-001 - 0x09d00000: 238, // es - 0x09d0001e: 239, // es-419 - 0x09d0002b: 240, // es-AR - 0x09d0003e: 241, // es-BO - 0x09d00040: 242, // es-BR - 0x09d00050: 243, // es-CL - 0x09d00053: 244, // es-CO - 0x09d00055: 245, // es-CR - 0x09d00058: 246, // es-CU - 0x09d00064: 247, // es-DO - 0x09d00067: 248, // es-EA - 0x09d00068: 249, // es-EC - 0x09d0006d: 250, // es-ES - 0x09d00084: 251, // es-GQ - 0x09d00087: 252, // es-GT - 0x09d0008d: 253, // es-HN - 0x09d00092: 254, // es-IC - 0x09d000cd: 255, // es-MX - 0x09d000d6: 256, // es-NI - 0x09d000e0: 257, // es-PA - 0x09d000e2: 258, // es-PE - 0x09d000e5: 259, // es-PH - 0x09d000ea: 260, // es-PR - 0x09d000ef: 261, // es-PY - 0x09d00118: 262, // es-SV - 0x09d00132: 263, // es-US - 0x09d00133: 264, // es-UY - 0x09d00138: 265, // es-VE - 0x09f00000: 266, // et - 0x09f00069: 267, // et-EE - 0x0a100000: 268, // eu - 0x0a10006d: 269, // eu-ES - 0x0a200000: 270, // ewo - 0x0a200051: 271, // ewo-CM - 0x0a400000: 272, // fa - 0x0a400023: 273, // fa-AF - 0x0a40009a: 274, // fa-IR - 0x0a600000: 275, // ff - 0x0a600051: 276, // ff-CM - 0x0a600082: 277, // ff-GN - 0x0a6000c7: 278, // ff-MR - 0x0a600112: 279, // ff-SN - 0x0a800000: 280, // fi - 0x0a800070: 281, // fi-FI - 0x0aa00000: 282, // fil - 0x0aa000e5: 283, // fil-PH - 0x0ad00000: 284, // fo - 0x0ad00062: 285, // fo-DK - 0x0ad00074: 286, // fo-FO - 0x0af00000: 287, // fr - 0x0af00035: 288, // fr-BE - 0x0af00036: 289, // fr-BF - 0x0af00039: 290, // fr-BI - 0x0af0003a: 291, // fr-BJ - 0x0af0003b: 292, // fr-BL - 0x0af00048: 293, // fr-CA - 0x0af0004a: 294, // fr-CD - 0x0af0004b: 295, // fr-CF - 0x0af0004c: 296, // fr-CG - 0x0af0004d: 297, // fr-CH - 0x0af0004e: 298, // fr-CI - 0x0af00051: 299, // fr-CM - 0x0af00061: 300, // fr-DJ - 0x0af00066: 301, // fr-DZ - 0x0af00076: 302, // fr-FR - 0x0af00078: 303, // fr-GA - 0x0af0007c: 304, // fr-GF - 0x0af00082: 305, // fr-GN - 0x0af00083: 306, // fr-GP - 0x0af00084: 307, // fr-GQ - 0x0af0008f: 308, // fr-HT - 0x0af000a6: 309, // fr-KM - 0x0af000b5: 310, // fr-LU - 0x0af000b8: 311, // fr-MA - 0x0af000b9: 312, // fr-MC - 0x0af000bc: 313, // fr-MF - 0x0af000bd: 314, // fr-MG - 0x0af000c1: 315, // fr-ML - 0x0af000c6: 316, // fr-MQ - 0x0af000c7: 317, // fr-MR - 0x0af000ca: 318, // fr-MU - 0x0af000d1: 319, // fr-NC - 0x0af000d2: 320, // fr-NE - 0x0af000e3: 321, // fr-PF - 0x0af000e8: 322, // fr-PM - 0x0af00100: 323, // fr-RE - 0x0af00105: 324, // fr-RW - 0x0af00108: 325, // fr-SC - 0x0af00112: 326, // fr-SN - 0x0af0011a: 327, // fr-SY - 0x0af0011e: 328, // fr-TD - 0x0af00120: 329, // fr-TG - 0x0af00126: 330, // fr-TN - 0x0af0013c: 331, // fr-VU - 0x0af0013d: 332, // fr-WF - 0x0af0015c: 333, // fr-YT - 0x0b600000: 334, // fur - 0x0b60009c: 335, // fur-IT - 0x0b900000: 336, // fy - 0x0b9000d7: 337, // fy-NL - 0x0ba00000: 338, // ga - 0x0ba00094: 339, // ga-IE - 0x0c200000: 340, // gd - 0x0c200079: 341, // gd-GB - 0x0c800000: 342, // gl - 0x0c80006d: 343, // gl-ES - 0x0d200000: 344, // gsw - 0x0d20004d: 345, // gsw-CH - 0x0d200076: 346, // gsw-FR - 0x0d2000b0: 347, // gsw-LI - 0x0d300000: 348, // gu - 0x0d300097: 349, // gu-IN - 0x0d700000: 350, // guw - 0x0d800000: 351, // guz - 0x0d8000a2: 352, // guz-KE - 0x0d900000: 353, // gv - 0x0d900096: 354, // gv-IM - 0x0dc00000: 355, // ha - 0x0dc0007e: 356, // ha-GH - 0x0dc000d2: 357, // ha-NE - 0x0dc000d4: 358, // ha-NG - 0x0de00000: 359, // haw - 0x0de00132: 360, // haw-US - 0x0e000000: 361, // he - 0x0e000095: 362, // he-IL - 0x0e100000: 363, // hi - 0x0e100097: 364, // hi-IN - 0x0ee00000: 365, // hr - 0x0ee00032: 366, // hr-BA - 0x0ee0008e: 367, // hr-HR - 0x0ef00000: 368, // hsb - 0x0ef0005f: 369, // hsb-DE - 0x0f200000: 370, // hu - 0x0f200090: 371, // hu-HU - 0x0f300000: 372, // hy - 0x0f300027: 373, // hy-AM - 0x0f800000: 374, // id - 0x0f800093: 375, // id-ID - 0x0fa00000: 376, // ig - 0x0fa000d4: 377, // ig-NG - 0x0fb00000: 378, // ii - 0x0fb00052: 379, // ii-CN - 0x10200000: 380, // is - 0x1020009b: 381, // is-IS - 0x10300000: 382, // it - 0x1030004d: 383, // it-CH - 0x1030009c: 384, // it-IT - 0x10300111: 385, // it-SM - 0x10400000: 386, // iu - 0x10700000: 387, // ja - 0x107000a0: 388, // ja-JP - 0x10900000: 389, // jbo - 0x10a00000: 390, // jgo - 0x10a00051: 391, // jgo-CM - 0x10c00000: 392, // jmc - 0x10c0012d: 393, // jmc-TZ - 0x10f00000: 394, // jv - 0x11100000: 395, // ka - 0x1110007b: 396, // ka-GE - 0x11300000: 397, // kab - 0x11300066: 398, // kab-DZ - 0x11500000: 399, // kaj - 0x11600000: 400, // kam - 0x116000a2: 401, // kam-KE - 0x11900000: 402, // kcg - 0x11b00000: 403, // kde - 0x11b0012d: 404, // kde-TZ - 0x11d00000: 405, // kea - 0x11d00059: 406, // kea-CV - 0x12800000: 407, // khq - 0x128000c1: 408, // khq-ML - 0x12b00000: 409, // ki - 0x12b000a2: 410, // ki-KE - 0x12f00000: 411, // kk - 0x12f000ac: 412, // kk-KZ - 0x13000000: 413, // kkj - 0x13000051: 414, // kkj-CM - 0x13100000: 415, // kl - 0x13100080: 416, // kl-GL - 0x13200000: 417, // kln - 0x132000a2: 418, // kln-KE - 0x13300000: 419, // km - 0x133000a4: 420, // km-KH - 0x13500000: 421, // kn - 0x13500097: 422, // kn-IN - 0x13600000: 423, // ko - 0x136000a8: 424, // ko-KP - 0x136000a9: 425, // ko-KR - 0x13800000: 426, // kok - 0x13800097: 427, // kok-IN - 0x14100000: 428, // ks - 0x14100097: 429, // ks-IN - 0x14200000: 430, // ksb - 0x1420012d: 431, // ksb-TZ - 0x14300000: 432, // ksf - 0x14300051: 433, // ksf-CM - 0x14400000: 434, // ksh - 0x1440005f: 435, // ksh-DE - 0x14500000: 436, // ku - 0x14a00000: 437, // kw - 0x14a00079: 438, // kw-GB - 0x14d00000: 439, // ky - 0x14d000a3: 440, // ky-KG - 0x15100000: 441, // lag - 0x1510012d: 442, // lag-TZ - 0x15400000: 443, // lb - 0x154000b5: 444, // lb-LU - 0x15a00000: 445, // lg - 0x15a0012f: 446, // lg-UG - 0x16100000: 447, // lkt - 0x16100132: 448, // lkt-US - 0x16400000: 449, // ln - 0x16400029: 450, // ln-AO - 0x1640004a: 451, // ln-CD - 0x1640004b: 452, // ln-CF - 0x1640004c: 453, // ln-CG - 0x16500000: 454, // lo - 0x165000ad: 455, // lo-LA - 0x16800000: 456, // lrc - 0x16800099: 457, // lrc-IQ - 0x1680009a: 458, // lrc-IR - 0x16900000: 459, // lt - 0x169000b4: 460, // lt-LT - 0x16b00000: 461, // lu - 0x16b0004a: 462, // lu-CD - 0x16d00000: 463, // luo - 0x16d000a2: 464, // luo-KE - 0x16e00000: 465, // luy - 0x16e000a2: 466, // luy-KE - 0x17000000: 467, // lv - 0x170000b6: 468, // lv-LV - 0x17a00000: 469, // mas - 0x17a000a2: 470, // mas-KE - 0x17a0012d: 471, // mas-TZ - 0x18000000: 472, // mer - 0x180000a2: 473, // mer-KE - 0x18200000: 474, // mfe - 0x182000ca: 475, // mfe-MU - 0x18300000: 476, // mg - 0x183000bd: 477, // mg-MG - 0x18400000: 478, // mgh - 0x184000cf: 479, // mgh-MZ - 0x18500000: 480, // mgo - 0x18500051: 481, // mgo-CM - 0x18c00000: 482, // mk - 0x18c000c0: 483, // mk-MK - 0x18d00000: 484, // ml - 0x18d00097: 485, // ml-IN - 0x18f00000: 486, // mn - 0x18f000c3: 487, // mn-MN - 0x19600000: 488, // mr - 0x19600097: 489, // mr-IN - 0x19a00000: 490, // ms - 0x19a0003d: 491, // ms-BN - 0x19a000ce: 492, // ms-MY - 0x19a0010b: 493, // ms-SG - 0x19b00000: 494, // mt - 0x19b000c9: 495, // mt-MT - 0x19d00000: 496, // mua - 0x19d00051: 497, // mua-CM - 0x1a500000: 498, // my - 0x1a5000c2: 499, // my-MM - 0x1a900000: 500, // mzn - 0x1a90009a: 501, // mzn-IR - 0x1ab00000: 502, // nah - 0x1ae00000: 503, // naq - 0x1ae000d0: 504, // naq-NA - 0x1af00000: 505, // nb - 0x1af000d8: 506, // nb-NO - 0x1af0010e: 507, // nb-SJ - 0x1b100000: 508, // nd - 0x1b100161: 509, // nd-ZW - 0x1b400000: 510, // ne - 0x1b400097: 511, // ne-IN - 0x1b4000d9: 512, // ne-NP - 0x1bd00000: 513, // nl - 0x1bd0002f: 514, // nl-AW - 0x1bd00035: 515, // nl-BE - 0x1bd0003f: 516, // nl-BQ - 0x1bd0005a: 517, // nl-CW - 0x1bd000d7: 518, // nl-NL - 0x1bd00114: 519, // nl-SR - 0x1bd00119: 520, // nl-SX - 0x1be00000: 521, // nmg - 0x1be00051: 522, // nmg-CM - 0x1bf00000: 523, // nn - 0x1bf000d8: 524, // nn-NO - 0x1c000000: 525, // nnh - 0x1c000051: 526, // nnh-CM - 0x1c100000: 527, // no - 0x1c500000: 528, // nqo - 0x1c600000: 529, // nr - 0x1c800000: 530, // nso - 0x1c900000: 531, // nus - 0x1c900115: 532, // nus-SS - 0x1cc00000: 533, // ny - 0x1ce00000: 534, // nyn - 0x1ce0012f: 535, // nyn-UG - 0x1d200000: 536, // om - 0x1d20006e: 537, // om-ET - 0x1d2000a2: 538, // om-KE - 0x1d300000: 539, // or - 0x1d300097: 540, // or-IN - 0x1d400000: 541, // os - 0x1d40007b: 542, // os-GE - 0x1d400104: 543, // os-RU - 0x1d700000: 544, // pa - 0x1d705000: 545, // pa-Arab - 0x1d7050e6: 546, // pa-Arab-PK - 0x1d72f000: 547, // pa-Guru - 0x1d72f097: 548, // pa-Guru-IN - 0x1db00000: 549, // pap - 0x1e700000: 550, // pl - 0x1e7000e7: 551, // pl-PL - 0x1ed00000: 552, // prg - 0x1ed00001: 553, // prg-001 - 0x1ee00000: 554, // ps - 0x1ee00023: 555, // ps-AF - 0x1ef00000: 556, // pt - 0x1ef00029: 557, // pt-AO - 0x1ef00040: 558, // pt-BR - 0x1ef0004d: 559, // pt-CH - 0x1ef00059: 560, // pt-CV - 0x1ef00084: 561, // pt-GQ - 0x1ef00089: 562, // pt-GW - 0x1ef000b5: 563, // pt-LU - 0x1ef000c4: 564, // pt-MO - 0x1ef000cf: 565, // pt-MZ - 0x1ef000ec: 566, // pt-PT - 0x1ef00116: 567, // pt-ST - 0x1ef00124: 568, // pt-TL - 0x1f100000: 569, // qu - 0x1f10003e: 570, // qu-BO - 0x1f100068: 571, // qu-EC - 0x1f1000e2: 572, // qu-PE - 0x1fc00000: 573, // rm - 0x1fc0004d: 574, // rm-CH - 0x20100000: 575, // rn - 0x20100039: 576, // rn-BI - 0x20300000: 577, // ro - 0x203000ba: 578, // ro-MD - 0x20300102: 579, // ro-RO - 0x20500000: 580, // rof - 0x2050012d: 581, // rof-TZ - 0x20700000: 582, // ru - 0x20700046: 583, // ru-BY - 0x207000a3: 584, // ru-KG - 0x207000ac: 585, // ru-KZ - 0x207000ba: 586, // ru-MD - 0x20700104: 587, // ru-RU - 0x2070012e: 588, // ru-UA - 0x20a00000: 589, // rw - 0x20a00105: 590, // rw-RW - 0x20b00000: 591, // rwk - 0x20b0012d: 592, // rwk-TZ - 0x20f00000: 593, // sah - 0x20f00104: 594, // sah-RU - 0x21000000: 595, // saq - 0x210000a2: 596, // saq-KE - 0x21400000: 597, // sbp - 0x2140012d: 598, // sbp-TZ - 0x21c00000: 599, // sdh - 0x21d00000: 600, // se - 0x21d00070: 601, // se-FI - 0x21d000d8: 602, // se-NO - 0x21d0010a: 603, // se-SE - 0x21f00000: 604, // seh - 0x21f000cf: 605, // seh-MZ - 0x22100000: 606, // ses - 0x221000c1: 607, // ses-ML - 0x22200000: 608, // sg - 0x2220004b: 609, // sg-CF - 0x22600000: 610, // shi - 0x22652000: 611, // shi-Latn - 0x226520b8: 612, // shi-Latn-MA - 0x226d2000: 613, // shi-Tfng - 0x226d20b8: 614, // shi-Tfng-MA - 0x22800000: 615, // si - 0x228000b1: 616, // si-LK - 0x22a00000: 617, // sk - 0x22a0010f: 618, // sk-SK - 0x22c00000: 619, // sl - 0x22c0010d: 620, // sl-SI - 0x23000000: 621, // sma - 0x23100000: 622, // smi - 0x23200000: 623, // smj - 0x23300000: 624, // smn - 0x23300070: 625, // smn-FI - 0x23500000: 626, // sms - 0x23600000: 627, // sn - 0x23600161: 628, // sn-ZW - 0x23800000: 629, // so - 0x23800061: 630, // so-DJ - 0x2380006e: 631, // so-ET - 0x238000a2: 632, // so-KE - 0x23800113: 633, // so-SO - 0x23a00000: 634, // sq - 0x23a00026: 635, // sq-AL - 0x23a000c0: 636, // sq-MK - 0x23a0014a: 637, // sq-XK - 0x23b00000: 638, // sr - 0x23b1e000: 639, // sr-Cyrl - 0x23b1e032: 640, // sr-Cyrl-BA - 0x23b1e0bb: 641, // sr-Cyrl-ME - 0x23b1e103: 642, // sr-Cyrl-RS - 0x23b1e14a: 643, // sr-Cyrl-XK - 0x23b52000: 644, // sr-Latn - 0x23b52032: 645, // sr-Latn-BA - 0x23b520bb: 646, // sr-Latn-ME - 0x23b52103: 647, // sr-Latn-RS - 0x23b5214a: 648, // sr-Latn-XK - 0x24000000: 649, // ss - 0x24100000: 650, // ssy - 0x24200000: 651, // st - 0x24700000: 652, // sv - 0x24700030: 653, // sv-AX - 0x24700070: 654, // sv-FI - 0x2470010a: 655, // sv-SE - 0x24800000: 656, // sw - 0x2480004a: 657, // sw-CD - 0x248000a2: 658, // sw-KE - 0x2480012d: 659, // sw-TZ - 0x2480012f: 660, // sw-UG - 0x24f00000: 661, // syr - 0x25100000: 662, // ta - 0x25100097: 663, // ta-IN - 0x251000b1: 664, // ta-LK - 0x251000ce: 665, // ta-MY - 0x2510010b: 666, // ta-SG - 0x25800000: 667, // te - 0x25800097: 668, // te-IN - 0x25a00000: 669, // teo - 0x25a000a2: 670, // teo-KE - 0x25a0012f: 671, // teo-UG - 0x25d00000: 672, // th - 0x25d00121: 673, // th-TH - 0x26100000: 674, // ti - 0x2610006c: 675, // ti-ER - 0x2610006e: 676, // ti-ET - 0x26200000: 677, // tig - 0x26400000: 678, // tk - 0x26400125: 679, // tk-TM - 0x26b00000: 680, // tn - 0x26c00000: 681, // to - 0x26c00127: 682, // to-TO - 0x26f00000: 683, // tr - 0x26f0005c: 684, // tr-CY - 0x26f00129: 685, // tr-TR - 0x27200000: 686, // ts - 0x27e00000: 687, // twq - 0x27e000d2: 688, // twq-NE - 0x28200000: 689, // tzm - 0x282000b8: 690, // tzm-MA - 0x28400000: 691, // ug - 0x28400052: 692, // ug-CN - 0x28600000: 693, // uk - 0x2860012e: 694, // uk-UA - 0x28c00000: 695, // ur - 0x28c00097: 696, // ur-IN - 0x28c000e6: 697, // ur-PK - 0x28d00000: 698, // uz - 0x28d05000: 699, // uz-Arab - 0x28d05023: 700, // uz-Arab-AF - 0x28d1e000: 701, // uz-Cyrl - 0x28d1e134: 702, // uz-Cyrl-UZ - 0x28d52000: 703, // uz-Latn - 0x28d52134: 704, // uz-Latn-UZ - 0x28e00000: 705, // vai - 0x28e52000: 706, // vai-Latn - 0x28e520b2: 707, // vai-Latn-LR - 0x28ed9000: 708, // vai-Vaii - 0x28ed90b2: 709, // vai-Vaii-LR - 0x28f00000: 710, // ve - 0x29200000: 711, // vi - 0x2920013b: 712, // vi-VN - 0x29700000: 713, // vo - 0x29700001: 714, // vo-001 - 0x29a00000: 715, // vun - 0x29a0012d: 716, // vun-TZ - 0x29b00000: 717, // wa - 0x29c00000: 718, // wae - 0x29c0004d: 719, // wae-CH - 0x2a400000: 720, // wo - 0x2a900000: 721, // xh - 0x2b100000: 722, // xog - 0x2b10012f: 723, // xog-UG - 0x2b700000: 724, // yav - 0x2b700051: 725, // yav-CM - 0x2b900000: 726, // yi - 0x2b900001: 727, // yi-001 - 0x2ba00000: 728, // yo - 0x2ba0003a: 729, // yo-BJ - 0x2ba000d4: 730, // yo-NG - 0x2bd00000: 731, // yue - 0x2bd0008b: 732, // yue-HK - 0x2c300000: 733, // zgh - 0x2c3000b8: 734, // zgh-MA - 0x2c400000: 735, // zh - 0x2c434000: 736, // zh-Hans - 0x2c434052: 737, // zh-Hans-CN - 0x2c43408b: 738, // zh-Hans-HK - 0x2c4340c4: 739, // zh-Hans-MO - 0x2c43410b: 740, // zh-Hans-SG - 0x2c435000: 741, // zh-Hant - 0x2c43508b: 742, // zh-Hant-HK - 0x2c4350c4: 743, // zh-Hant-MO - 0x2c43512c: 744, // zh-Hant-TW - 0x2c600000: 745, // zu - 0x2c60015e: 746, // zu-ZA + 0x01600000: 3, // af + 0x016000d1: 4, // af-NA + 0x01600160: 5, // af-ZA + 0x01c00000: 6, // agq + 0x01c00051: 7, // agq-CM + 0x02100000: 8, // ak + 0x0210007f: 9, // ak-GH + 0x02700000: 10, // am + 0x0270006e: 11, // am-ET + 0x03a00000: 12, // ar + 0x03a00001: 13, // ar-001 + 0x03a00022: 14, // ar-AE + 0x03a00038: 15, // ar-BH + 0x03a00061: 16, // ar-DJ + 0x03a00066: 17, // ar-DZ + 0x03a0006a: 18, // ar-EG + 0x03a0006b: 19, // ar-EH + 0x03a0006c: 20, // ar-ER + 0x03a00096: 21, // ar-IL + 0x03a0009a: 22, // ar-IQ + 0x03a000a0: 23, // ar-JO + 0x03a000a7: 24, // ar-KM + 0x03a000ab: 25, // ar-KW + 0x03a000af: 26, // ar-LB + 0x03a000b8: 27, // ar-LY + 0x03a000b9: 28, // ar-MA + 0x03a000c8: 29, // ar-MR + 0x03a000e0: 30, // ar-OM + 0x03a000ec: 31, // ar-PS + 0x03a000f2: 32, // ar-QA + 0x03a00107: 33, // ar-SA + 0x03a0010a: 34, // ar-SD + 0x03a00114: 35, // ar-SO + 0x03a00116: 36, // ar-SS + 0x03a0011b: 37, // ar-SY + 0x03a0011f: 38, // ar-TD + 0x03a00127: 39, // ar-TN + 0x03a0015d: 40, // ar-YE + 0x04000000: 41, // ars + 0x04300000: 42, // as + 0x04300098: 43, // as-IN + 0x04400000: 44, // asa + 0x0440012e: 45, // asa-TZ + 0x04800000: 46, // ast + 0x0480006d: 47, // ast-ES + 0x05800000: 48, // az + 0x0581e000: 49, // az-Cyrl + 0x0581e031: 50, // az-Cyrl-AZ + 0x05852000: 51, // az-Latn + 0x05852031: 52, // az-Latn-AZ + 0x05e00000: 53, // bas + 0x05e00051: 54, // bas-CM + 0x07100000: 55, // be + 0x07100046: 56, // be-BY + 0x07500000: 57, // bem + 0x07500161: 58, // bem-ZM + 0x07900000: 59, // bez + 0x0790012e: 60, // bez-TZ + 0x07e00000: 61, // bg + 0x07e00037: 62, // bg-BG + 0x08200000: 63, // bh + 0x0a000000: 64, // bm + 0x0a0000c2: 65, // bm-ML + 0x0a500000: 66, // bn + 0x0a500034: 67, // bn-BD + 0x0a500098: 68, // bn-IN + 0x0a900000: 69, // bo + 0x0a900052: 70, // bo-CN + 0x0a900098: 71, // bo-IN + 0x0b200000: 72, // br + 0x0b200077: 73, // br-FR + 0x0b500000: 74, // brx + 0x0b500098: 75, // brx-IN + 0x0b700000: 76, // bs + 0x0b71e000: 77, // bs-Cyrl + 0x0b71e032: 78, // bs-Cyrl-BA + 0x0b752000: 79, // bs-Latn + 0x0b752032: 80, // bs-Latn-BA + 0x0d700000: 81, // ca + 0x0d700021: 82, // ca-AD + 0x0d70006d: 83, // ca-ES + 0x0d700077: 84, // ca-FR + 0x0d70009d: 85, // ca-IT + 0x0dc00000: 86, // ce + 0x0dc00105: 87, // ce-RU + 0x0df00000: 88, // cgg + 0x0df00130: 89, // cgg-UG + 0x0e500000: 90, // chr + 0x0e500134: 91, // chr-US + 0x0e900000: 92, // ckb + 0x0e90009a: 93, // ckb-IQ + 0x0e90009b: 94, // ckb-IR + 0x0f900000: 95, // cs + 0x0f90005d: 96, // cs-CZ + 0x0fd00000: 97, // cu + 0x0fd00105: 98, // cu-RU + 0x0ff00000: 99, // cy + 0x0ff0007a: 100, // cy-GB + 0x10000000: 101, // da + 0x10000062: 102, // da-DK + 0x10000081: 103, // da-GL + 0x10700000: 104, // dav + 0x107000a3: 105, // dav-KE + 0x10c00000: 106, // de + 0x10c0002d: 107, // de-AT + 0x10c00035: 108, // de-BE + 0x10c0004d: 109, // de-CH + 0x10c0005f: 110, // de-DE + 0x10c0009d: 111, // de-IT + 0x10c000b1: 112, // de-LI + 0x10c000b6: 113, // de-LU + 0x11600000: 114, // dje + 0x116000d3: 115, // dje-NE + 0x11e00000: 116, // dsb + 0x11e0005f: 117, // dsb-DE + 0x12300000: 118, // dua + 0x12300051: 119, // dua-CM + 0x12700000: 120, // dv + 0x12a00000: 121, // dyo + 0x12a00113: 122, // dyo-SN + 0x12c00000: 123, // dz + 0x12c00042: 124, // dz-BT + 0x12e00000: 125, // ebu + 0x12e000a3: 126, // ebu-KE + 0x12f00000: 127, // ee + 0x12f0007f: 128, // ee-GH + 0x12f00121: 129, // ee-TG + 0x13500000: 130, // el + 0x1350005c: 131, // el-CY + 0x13500086: 132, // el-GR + 0x13800000: 133, // en + 0x13800001: 134, // en-001 + 0x1380001a: 135, // en-150 + 0x13800024: 136, // en-AG + 0x13800025: 137, // en-AI + 0x1380002c: 138, // en-AS + 0x1380002d: 139, // en-AT + 0x1380002e: 140, // en-AU + 0x13800033: 141, // en-BB + 0x13800035: 142, // en-BE + 0x13800039: 143, // en-BI + 0x1380003c: 144, // en-BM + 0x13800041: 145, // en-BS + 0x13800045: 146, // en-BW + 0x13800047: 147, // en-BZ + 0x13800048: 148, // en-CA + 0x13800049: 149, // en-CC + 0x1380004d: 150, // en-CH + 0x1380004f: 151, // en-CK + 0x13800051: 152, // en-CM + 0x1380005b: 153, // en-CX + 0x1380005c: 154, // en-CY + 0x1380005f: 155, // en-DE + 0x13800060: 156, // en-DG + 0x13800062: 157, // en-DK + 0x13800063: 158, // en-DM + 0x1380006c: 159, // en-ER + 0x13800071: 160, // en-FI + 0x13800072: 161, // en-FJ + 0x13800073: 162, // en-FK + 0x13800074: 163, // en-FM + 0x1380007a: 164, // en-GB + 0x1380007b: 165, // en-GD + 0x1380007e: 166, // en-GG + 0x1380007f: 167, // en-GH + 0x13800080: 168, // en-GI + 0x13800082: 169, // en-GM + 0x13800089: 170, // en-GU + 0x1380008b: 171, // en-GY + 0x1380008c: 172, // en-HK + 0x13800095: 173, // en-IE + 0x13800096: 174, // en-IL + 0x13800097: 175, // en-IM + 0x13800098: 176, // en-IN + 0x13800099: 177, // en-IO + 0x1380009e: 178, // en-JE + 0x1380009f: 179, // en-JM + 0x138000a3: 180, // en-KE + 0x138000a6: 181, // en-KI + 0x138000a8: 182, // en-KN + 0x138000ac: 183, // en-KY + 0x138000b0: 184, // en-LC + 0x138000b3: 185, // en-LR + 0x138000b4: 186, // en-LS + 0x138000be: 187, // en-MG + 0x138000bf: 188, // en-MH + 0x138000c5: 189, // en-MO + 0x138000c6: 190, // en-MP + 0x138000c9: 191, // en-MS + 0x138000ca: 192, // en-MT + 0x138000cb: 193, // en-MU + 0x138000cd: 194, // en-MW + 0x138000cf: 195, // en-MY + 0x138000d1: 196, // en-NA + 0x138000d4: 197, // en-NF + 0x138000d5: 198, // en-NG + 0x138000d8: 199, // en-NL + 0x138000dc: 200, // en-NR + 0x138000de: 201, // en-NU + 0x138000df: 202, // en-NZ + 0x138000e5: 203, // en-PG + 0x138000e6: 204, // en-PH + 0x138000e7: 205, // en-PK + 0x138000ea: 206, // en-PN + 0x138000eb: 207, // en-PR + 0x138000ef: 208, // en-PW + 0x13800106: 209, // en-RW + 0x13800108: 210, // en-SB + 0x13800109: 211, // en-SC + 0x1380010a: 212, // en-SD + 0x1380010b: 213, // en-SE + 0x1380010c: 214, // en-SG + 0x1380010d: 215, // en-SH + 0x1380010e: 216, // en-SI + 0x13800111: 217, // en-SL + 0x13800116: 218, // en-SS + 0x1380011a: 219, // en-SX + 0x1380011c: 220, // en-SZ + 0x1380011e: 221, // en-TC + 0x13800124: 222, // en-TK + 0x13800128: 223, // en-TO + 0x1380012b: 224, // en-TT + 0x1380012c: 225, // en-TV + 0x1380012e: 226, // en-TZ + 0x13800130: 227, // en-UG + 0x13800132: 228, // en-UM + 0x13800134: 229, // en-US + 0x13800138: 230, // en-VC + 0x1380013b: 231, // en-VG + 0x1380013c: 232, // en-VI + 0x1380013e: 233, // en-VU + 0x13800141: 234, // en-WS + 0x13800160: 235, // en-ZA + 0x13800161: 236, // en-ZM + 0x13800163: 237, // en-ZW + 0x13b00000: 238, // eo + 0x13b00001: 239, // eo-001 + 0x13d00000: 240, // es + 0x13d0001e: 241, // es-419 + 0x13d0002b: 242, // es-AR + 0x13d0003e: 243, // es-BO + 0x13d00040: 244, // es-BR + 0x13d00047: 245, // es-BZ + 0x13d00050: 246, // es-CL + 0x13d00053: 247, // es-CO + 0x13d00055: 248, // es-CR + 0x13d00058: 249, // es-CU + 0x13d00064: 250, // es-DO + 0x13d00067: 251, // es-EA + 0x13d00068: 252, // es-EC + 0x13d0006d: 253, // es-ES + 0x13d00085: 254, // es-GQ + 0x13d00088: 255, // es-GT + 0x13d0008e: 256, // es-HN + 0x13d00093: 257, // es-IC + 0x13d000ce: 258, // es-MX + 0x13d000d7: 259, // es-NI + 0x13d000e1: 260, // es-PA + 0x13d000e3: 261, // es-PE + 0x13d000e6: 262, // es-PH + 0x13d000eb: 263, // es-PR + 0x13d000f0: 264, // es-PY + 0x13d00119: 265, // es-SV + 0x13d00134: 266, // es-US + 0x13d00135: 267, // es-UY + 0x13d0013a: 268, // es-VE + 0x13f00000: 269, // et + 0x13f00069: 270, // et-EE + 0x14400000: 271, // eu + 0x1440006d: 272, // eu-ES + 0x14500000: 273, // ewo + 0x14500051: 274, // ewo-CM + 0x14700000: 275, // fa + 0x14700023: 276, // fa-AF + 0x1470009b: 277, // fa-IR + 0x14d00000: 278, // ff + 0x14d00051: 279, // ff-CM + 0x14d00083: 280, // ff-GN + 0x14d000c8: 281, // ff-MR + 0x14d00113: 282, // ff-SN + 0x15000000: 283, // fi + 0x15000071: 284, // fi-FI + 0x15200000: 285, // fil + 0x152000e6: 286, // fil-PH + 0x15700000: 287, // fo + 0x15700062: 288, // fo-DK + 0x15700075: 289, // fo-FO + 0x15d00000: 290, // fr + 0x15d00035: 291, // fr-BE + 0x15d00036: 292, // fr-BF + 0x15d00039: 293, // fr-BI + 0x15d0003a: 294, // fr-BJ + 0x15d0003b: 295, // fr-BL + 0x15d00048: 296, // fr-CA + 0x15d0004a: 297, // fr-CD + 0x15d0004b: 298, // fr-CF + 0x15d0004c: 299, // fr-CG + 0x15d0004d: 300, // fr-CH + 0x15d0004e: 301, // fr-CI + 0x15d00051: 302, // fr-CM + 0x15d00061: 303, // fr-DJ + 0x15d00066: 304, // fr-DZ + 0x15d00077: 305, // fr-FR + 0x15d00079: 306, // fr-GA + 0x15d0007d: 307, // fr-GF + 0x15d00083: 308, // fr-GN + 0x15d00084: 309, // fr-GP + 0x15d00085: 310, // fr-GQ + 0x15d00090: 311, // fr-HT + 0x15d000a7: 312, // fr-KM + 0x15d000b6: 313, // fr-LU + 0x15d000b9: 314, // fr-MA + 0x15d000ba: 315, // fr-MC + 0x15d000bd: 316, // fr-MF + 0x15d000be: 317, // fr-MG + 0x15d000c2: 318, // fr-ML + 0x15d000c7: 319, // fr-MQ + 0x15d000c8: 320, // fr-MR + 0x15d000cb: 321, // fr-MU + 0x15d000d2: 322, // fr-NC + 0x15d000d3: 323, // fr-NE + 0x15d000e4: 324, // fr-PF + 0x15d000e9: 325, // fr-PM + 0x15d00101: 326, // fr-RE + 0x15d00106: 327, // fr-RW + 0x15d00109: 328, // fr-SC + 0x15d00113: 329, // fr-SN + 0x15d0011b: 330, // fr-SY + 0x15d0011f: 331, // fr-TD + 0x15d00121: 332, // fr-TG + 0x15d00127: 333, // fr-TN + 0x15d0013e: 334, // fr-VU + 0x15d0013f: 335, // fr-WF + 0x15d0015e: 336, // fr-YT + 0x16800000: 337, // fur + 0x1680009d: 338, // fur-IT + 0x16c00000: 339, // fy + 0x16c000d8: 340, // fy-NL + 0x16d00000: 341, // ga + 0x16d00095: 342, // ga-IE + 0x17c00000: 343, // gd + 0x17c0007a: 344, // gd-GB + 0x18e00000: 345, // gl + 0x18e0006d: 346, // gl-ES + 0x1a100000: 347, // gsw + 0x1a10004d: 348, // gsw-CH + 0x1a100077: 349, // gsw-FR + 0x1a1000b1: 350, // gsw-LI + 0x1a200000: 351, // gu + 0x1a200098: 352, // gu-IN + 0x1a700000: 353, // guw + 0x1a900000: 354, // guz + 0x1a9000a3: 355, // guz-KE + 0x1aa00000: 356, // gv + 0x1aa00097: 357, // gv-IM + 0x1b200000: 358, // ha + 0x1b20007f: 359, // ha-GH + 0x1b2000d3: 360, // ha-NE + 0x1b2000d5: 361, // ha-NG + 0x1b600000: 362, // haw + 0x1b600134: 363, // haw-US + 0x1ba00000: 364, // he + 0x1ba00096: 365, // he-IL + 0x1bc00000: 366, // hi + 0x1bc00098: 367, // hi-IN + 0x1cf00000: 368, // hr + 0x1cf00032: 369, // hr-BA + 0x1cf0008f: 370, // hr-HR + 0x1d000000: 371, // hsb + 0x1d00005f: 372, // hsb-DE + 0x1d300000: 373, // hu + 0x1d300091: 374, // hu-HU + 0x1d500000: 375, // hy + 0x1d500027: 376, // hy-AM + 0x1df00000: 377, // id + 0x1df00094: 378, // id-ID + 0x1e500000: 379, // ig + 0x1e5000d5: 380, // ig-NG + 0x1e800000: 381, // ii + 0x1e800052: 382, // ii-CN + 0x1f600000: 383, // is + 0x1f60009c: 384, // is-IS + 0x1f700000: 385, // it + 0x1f70004d: 386, // it-CH + 0x1f70009d: 387, // it-IT + 0x1f700112: 388, // it-SM + 0x1f700137: 389, // it-VA + 0x1f800000: 390, // iu + 0x1fe00000: 391, // ja + 0x1fe000a1: 392, // ja-JP + 0x20100000: 393, // jbo + 0x20500000: 394, // jgo + 0x20500051: 395, // jgo-CM + 0x20800000: 396, // jmc + 0x2080012e: 397, // jmc-TZ + 0x20c00000: 398, // jv + 0x20e00000: 399, // ka + 0x20e0007c: 400, // ka-GE + 0x21000000: 401, // kab + 0x21000066: 402, // kab-DZ + 0x21400000: 403, // kaj + 0x21500000: 404, // kam + 0x215000a3: 405, // kam-KE + 0x21d00000: 406, // kcg + 0x22100000: 407, // kde + 0x2210012e: 408, // kde-TZ + 0x22500000: 409, // kea + 0x22500059: 410, // kea-CV + 0x23200000: 411, // khq + 0x232000c2: 412, // khq-ML + 0x23700000: 413, // ki + 0x237000a3: 414, // ki-KE + 0x24000000: 415, // kk + 0x240000ad: 416, // kk-KZ + 0x24200000: 417, // kkj + 0x24200051: 418, // kkj-CM + 0x24300000: 419, // kl + 0x24300081: 420, // kl-GL + 0x24400000: 421, // kln + 0x244000a3: 422, // kln-KE + 0x24800000: 423, // km + 0x248000a5: 424, // km-KH + 0x24f00000: 425, // kn + 0x24f00098: 426, // kn-IN + 0x25200000: 427, // ko + 0x252000a9: 428, // ko-KP + 0x252000aa: 429, // ko-KR + 0x25400000: 430, // kok + 0x25400098: 431, // kok-IN + 0x26800000: 432, // ks + 0x26800098: 433, // ks-IN + 0x26900000: 434, // ksb + 0x2690012e: 435, // ksb-TZ + 0x26b00000: 436, // ksf + 0x26b00051: 437, // ksf-CM + 0x26c00000: 438, // ksh + 0x26c0005f: 439, // ksh-DE + 0x27200000: 440, // ku + 0x27f00000: 441, // kw + 0x27f0007a: 442, // kw-GB + 0x28800000: 443, // ky + 0x288000a4: 444, // ky-KG + 0x28f00000: 445, // lag + 0x28f0012e: 446, // lag-TZ + 0x29300000: 447, // lb + 0x293000b6: 448, // lb-LU + 0x2a100000: 449, // lg + 0x2a100130: 450, // lg-UG + 0x2ad00000: 451, // lkt + 0x2ad00134: 452, // lkt-US + 0x2b300000: 453, // ln + 0x2b300029: 454, // ln-AO + 0x2b30004a: 455, // ln-CD + 0x2b30004b: 456, // ln-CF + 0x2b30004c: 457, // ln-CG + 0x2b600000: 458, // lo + 0x2b6000ae: 459, // lo-LA + 0x2bd00000: 460, // lrc + 0x2bd0009a: 461, // lrc-IQ + 0x2bd0009b: 462, // lrc-IR + 0x2be00000: 463, // lt + 0x2be000b5: 464, // lt-LT + 0x2c000000: 465, // lu + 0x2c00004a: 466, // lu-CD + 0x2c200000: 467, // luo + 0x2c2000a3: 468, // luo-KE + 0x2c300000: 469, // luy + 0x2c3000a3: 470, // luy-KE + 0x2c500000: 471, // lv + 0x2c5000b7: 472, // lv-LV + 0x2cf00000: 473, // mas + 0x2cf000a3: 474, // mas-KE + 0x2cf0012e: 475, // mas-TZ + 0x2e700000: 476, // mer + 0x2e7000a3: 477, // mer-KE + 0x2eb00000: 478, // mfe + 0x2eb000cb: 479, // mfe-MU + 0x2ef00000: 480, // mg + 0x2ef000be: 481, // mg-MG + 0x2f000000: 482, // mgh + 0x2f0000d0: 483, // mgh-MZ + 0x2f200000: 484, // mgo + 0x2f200051: 485, // mgo-CM + 0x2fd00000: 486, // mk + 0x2fd000c1: 487, // mk-MK + 0x30200000: 488, // ml + 0x30200098: 489, // ml-IN + 0x30900000: 490, // mn + 0x309000c4: 491, // mn-MN + 0x31900000: 492, // mr + 0x31900098: 493, // mr-IN + 0x31d00000: 494, // ms + 0x31d0003d: 495, // ms-BN + 0x31d000cf: 496, // ms-MY + 0x31d0010c: 497, // ms-SG + 0x31e00000: 498, // mt + 0x31e000ca: 499, // mt-MT + 0x32300000: 500, // mua + 0x32300051: 501, // mua-CM + 0x32f00000: 502, // my + 0x32f000c3: 503, // my-MM + 0x33800000: 504, // mzn + 0x3380009b: 505, // mzn-IR + 0x33f00000: 506, // nah + 0x34300000: 507, // naq + 0x343000d1: 508, // naq-NA + 0x34500000: 509, // nb + 0x345000d9: 510, // nb-NO + 0x3450010f: 511, // nb-SJ + 0x34c00000: 512, // nd + 0x34c00163: 513, // nd-ZW + 0x34e00000: 514, // nds + 0x34e0005f: 515, // nds-DE + 0x34e000d8: 516, // nds-NL + 0x34f00000: 517, // ne + 0x34f00098: 518, // ne-IN + 0x34f000da: 519, // ne-NP + 0x36500000: 520, // nl + 0x3650002f: 521, // nl-AW + 0x36500035: 522, // nl-BE + 0x3650003f: 523, // nl-BQ + 0x3650005a: 524, // nl-CW + 0x365000d8: 525, // nl-NL + 0x36500115: 526, // nl-SR + 0x3650011a: 527, // nl-SX + 0x36600000: 528, // nmg + 0x36600051: 529, // nmg-CM + 0x36800000: 530, // nn + 0x368000d9: 531, // nn-NO + 0x36a00000: 532, // nnh + 0x36a00051: 533, // nnh-CM + 0x36d00000: 534, // no + 0x37300000: 535, // nqo + 0x37400000: 536, // nr + 0x37800000: 537, // nso + 0x37e00000: 538, // nus + 0x37e00116: 539, // nus-SS + 0x38500000: 540, // ny + 0x38700000: 541, // nyn + 0x38700130: 542, // nyn-UG + 0x38e00000: 543, // om + 0x38e0006e: 544, // om-ET + 0x38e000a3: 545, // om-KE + 0x39300000: 546, // or + 0x39300098: 547, // or-IN + 0x39600000: 548, // os + 0x3960007c: 549, // os-GE + 0x39600105: 550, // os-RU + 0x39b00000: 551, // pa + 0x39b05000: 552, // pa-Arab + 0x39b050e7: 553, // pa-Arab-PK + 0x39b2f000: 554, // pa-Guru + 0x39b2f098: 555, // pa-Guru-IN + 0x39f00000: 556, // pap + 0x3b100000: 557, // pl + 0x3b1000e8: 558, // pl-PL + 0x3bb00000: 559, // prg + 0x3bb00001: 560, // prg-001 + 0x3bc00000: 561, // ps + 0x3bc00023: 562, // ps-AF + 0x3be00000: 563, // pt + 0x3be00029: 564, // pt-AO + 0x3be00040: 565, // pt-BR + 0x3be0004d: 566, // pt-CH + 0x3be00059: 567, // pt-CV + 0x3be00085: 568, // pt-GQ + 0x3be0008a: 569, // pt-GW + 0x3be000b6: 570, // pt-LU + 0x3be000c5: 571, // pt-MO + 0x3be000d0: 572, // pt-MZ + 0x3be000ed: 573, // pt-PT + 0x3be00117: 574, // pt-ST + 0x3be00125: 575, // pt-TL + 0x3c200000: 576, // qu + 0x3c20003e: 577, // qu-BO + 0x3c200068: 578, // qu-EC + 0x3c2000e3: 579, // qu-PE + 0x3d200000: 580, // rm + 0x3d20004d: 581, // rm-CH + 0x3d700000: 582, // rn + 0x3d700039: 583, // rn-BI + 0x3da00000: 584, // ro + 0x3da000bb: 585, // ro-MD + 0x3da00103: 586, // ro-RO + 0x3dc00000: 587, // rof + 0x3dc0012e: 588, // rof-TZ + 0x3e000000: 589, // ru + 0x3e000046: 590, // ru-BY + 0x3e0000a4: 591, // ru-KG + 0x3e0000ad: 592, // ru-KZ + 0x3e0000bb: 593, // ru-MD + 0x3e000105: 594, // ru-RU + 0x3e00012f: 595, // ru-UA + 0x3e300000: 596, // rw + 0x3e300106: 597, // rw-RW + 0x3e400000: 598, // rwk + 0x3e40012e: 599, // rwk-TZ + 0x3e900000: 600, // sah + 0x3e900105: 601, // sah-RU + 0x3ea00000: 602, // saq + 0x3ea000a3: 603, // saq-KE + 0x3f100000: 604, // sbp + 0x3f10012e: 605, // sbp-TZ + 0x3fa00000: 606, // sdh + 0x3fb00000: 607, // se + 0x3fb00071: 608, // se-FI + 0x3fb000d9: 609, // se-NO + 0x3fb0010b: 610, // se-SE + 0x3fd00000: 611, // seh + 0x3fd000d0: 612, // seh-MZ + 0x3ff00000: 613, // ses + 0x3ff000c2: 614, // ses-ML + 0x40000000: 615, // sg + 0x4000004b: 616, // sg-CF + 0x40600000: 617, // shi + 0x40652000: 618, // shi-Latn + 0x406520b9: 619, // shi-Latn-MA + 0x406d2000: 620, // shi-Tfng + 0x406d20b9: 621, // shi-Tfng-MA + 0x40a00000: 622, // si + 0x40a000b2: 623, // si-LK + 0x41000000: 624, // sk + 0x41000110: 625, // sk-SK + 0x41400000: 626, // sl + 0x4140010e: 627, // sl-SI + 0x41a00000: 628, // sma + 0x41b00000: 629, // smi + 0x41c00000: 630, // smj + 0x41d00000: 631, // smn + 0x41d00071: 632, // smn-FI + 0x42000000: 633, // sms + 0x42100000: 634, // sn + 0x42100163: 635, // sn-ZW + 0x42700000: 636, // so + 0x42700061: 637, // so-DJ + 0x4270006e: 638, // so-ET + 0x427000a3: 639, // so-KE + 0x42700114: 640, // so-SO + 0x42f00000: 641, // sq + 0x42f00026: 642, // sq-AL + 0x42f000c1: 643, // sq-MK + 0x42f0014c: 644, // sq-XK + 0x43000000: 645, // sr + 0x4301e000: 646, // sr-Cyrl + 0x4301e032: 647, // sr-Cyrl-BA + 0x4301e0bc: 648, // sr-Cyrl-ME + 0x4301e104: 649, // sr-Cyrl-RS + 0x4301e14c: 650, // sr-Cyrl-XK + 0x43052000: 651, // sr-Latn + 0x43052032: 652, // sr-Latn-BA + 0x430520bc: 653, // sr-Latn-ME + 0x43052104: 654, // sr-Latn-RS + 0x4305214c: 655, // sr-Latn-XK + 0x43500000: 656, // ss + 0x43800000: 657, // ssy + 0x43900000: 658, // st + 0x44200000: 659, // sv + 0x44200030: 660, // sv-AX + 0x44200071: 661, // sv-FI + 0x4420010b: 662, // sv-SE + 0x44300000: 663, // sw + 0x4430004a: 664, // sw-CD + 0x443000a3: 665, // sw-KE + 0x4430012e: 666, // sw-TZ + 0x44300130: 667, // sw-UG + 0x44c00000: 668, // syr + 0x44e00000: 669, // ta + 0x44e00098: 670, // ta-IN + 0x44e000b2: 671, // ta-LK + 0x44e000cf: 672, // ta-MY + 0x44e0010c: 673, // ta-SG + 0x45f00000: 674, // te + 0x45f00098: 675, // te-IN + 0x46200000: 676, // teo + 0x462000a3: 677, // teo-KE + 0x46200130: 678, // teo-UG + 0x46900000: 679, // th + 0x46900122: 680, // th-TH + 0x46d00000: 681, // ti + 0x46d0006c: 682, // ti-ER + 0x46d0006e: 683, // ti-ET + 0x46f00000: 684, // tig + 0x47400000: 685, // tk + 0x47400126: 686, // tk-TM + 0x47e00000: 687, // tn + 0x48000000: 688, // to + 0x48000128: 689, // to-TO + 0x48800000: 690, // tr + 0x4880005c: 691, // tr-CY + 0x4880012a: 692, // tr-TR + 0x48c00000: 693, // ts + 0x4a200000: 694, // twq + 0x4a2000d3: 695, // twq-NE + 0x4a700000: 696, // tzm + 0x4a7000b9: 697, // tzm-MA + 0x4aa00000: 698, // ug + 0x4aa00052: 699, // ug-CN + 0x4ac00000: 700, // uk + 0x4ac0012f: 701, // uk-UA + 0x4b200000: 702, // ur + 0x4b200098: 703, // ur-IN + 0x4b2000e7: 704, // ur-PK + 0x4ba00000: 705, // uz + 0x4ba05000: 706, // uz-Arab + 0x4ba05023: 707, // uz-Arab-AF + 0x4ba1e000: 708, // uz-Cyrl + 0x4ba1e136: 709, // uz-Cyrl-UZ + 0x4ba52000: 710, // uz-Latn + 0x4ba52136: 711, // uz-Latn-UZ + 0x4bc00000: 712, // vai + 0x4bc52000: 713, // vai-Latn + 0x4bc520b3: 714, // vai-Latn-LR + 0x4bcd9000: 715, // vai-Vaii + 0x4bcd90b3: 716, // vai-Vaii-LR + 0x4be00000: 717, // ve + 0x4c100000: 718, // vi + 0x4c10013d: 719, // vi-VN + 0x4c700000: 720, // vo + 0x4c700001: 721, // vo-001 + 0x4ca00000: 722, // vun + 0x4ca0012e: 723, // vun-TZ + 0x4cc00000: 724, // wa + 0x4cd00000: 725, // wae + 0x4cd0004d: 726, // wae-CH + 0x4e300000: 727, // wo + 0x4f000000: 728, // xh + 0x4f900000: 729, // xog + 0x4f900130: 730, // xog-UG + 0x50700000: 731, // yav + 0x50700051: 732, // yav-CM + 0x51000000: 733, // yi + 0x51000001: 734, // yi-001 + 0x51600000: 735, // yo + 0x5160003a: 736, // yo-BJ + 0x516000d5: 737, // yo-NG + 0x51d00000: 738, // yue + 0x51d0008c: 739, // yue-HK + 0x52600000: 740, // zgh + 0x526000b9: 741, // zgh-MA + 0x52700000: 742, // zh + 0x52734000: 743, // zh-Hans + 0x52734052: 744, // zh-Hans-CN + 0x5273408c: 745, // zh-Hans-HK + 0x527340c5: 746, // zh-Hans-MO + 0x5273410c: 747, // zh-Hans-SG + 0x52735000: 748, // zh-Hant + 0x5273508c: 749, // zh-Hant-HK + 0x527350c5: 750, // zh-Hant-MO + 0x5273512d: 751, // zh-Hant-TW + 0x52c00000: 752, // zu + 0x52c00160: 753, // zu-ZA } -// Total table size 4550 bytes (4KiB); checksum: B6D49547 +// Total table size 4592 bytes (4KiB); checksum: C25F8AFF diff --git a/vendor/golang.org/x/text/language/language.go b/vendor/golang.org/x/text/language/language.go index 5c6dcbd94d48a..e2da1ab1796cd 100644 --- a/vendor/golang.org/x/text/language/language.go +++ b/vendor/golang.org/x/text/language/language.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:generate go run maketables.go gen_common.go -output tables.go +//go:generate go run gen.go gen_common.go -output tables.go //go:generate go run gen_index.go // Package language implements BCP 47 language tags and related functionality. @@ -129,8 +129,15 @@ const ( // specific language or locale. All language tag values are guaranteed to be // well-formed. type Tag struct { - lang langID - region regionID + lang langID + region regionID + // TODO: we will soon run out of positions for script. Idea: instead of + // storing lang, region, and script codes, store only the compact index and + // have a lookup table from this code to its expansion. This greatly speeds + // up table lookup, speed up common variant cases. + // This will also immediately free up 3 extra bytes. Also, the pVariant + // field can now be moved to the lookup table, as the compact index uniquely + // determines the offset of a possible variant. script scriptID pVariant byte // offset in str, includes preceding '-' pExt uint16 // offset of first extension, includes preceding '-' @@ -593,7 +600,7 @@ func (t Tag) Extension(x byte) (ext Extension, ok bool) { return Extension{ext}, true } } - return Extension{string(x)}, false + return Extension{}, false } // Extensions returns all extensions of t. diff --git a/vendor/golang.org/x/text/language/match.go b/vendor/golang.org/x/text/language/match.go index eec72bcc1f0c4..63bc744a39ea4 100644 --- a/vendor/golang.org/x/text/language/match.go +++ b/vendor/golang.org/x/text/language/match.go @@ -6,6 +6,16 @@ package language import "errors" +// A MatchOption configures a Matcher. +type MatchOption func(*matcher) + +// PreferSameScript will, in the absence of a match, result in the first +// preferred tag with the same script as a supported tag to match this supported +// tag. The default is currently true, but this may change in the future. +func PreferSameScript(preferSame bool) MatchOption { + return func(m *matcher) { m.preferSameScript = preferSame } +} + // Matcher is the interface that wraps the Match method. // // Match returns the best match for any of the given tags, along with @@ -36,23 +46,44 @@ func Comprehends(speaker, alternative Tag) Confidence { // matched tag in t, but is augmented with the Unicode extension ('u')of the // corresponding preferred tag. This allows user locale options to be passed // transparently. -func NewMatcher(t []Tag) Matcher { - return newMatcher(t) +func NewMatcher(t []Tag, options ...MatchOption) Matcher { + return newMatcher(t, options) } func (m *matcher) Match(want ...Tag) (t Tag, index int, c Confidence) { match, w, c := m.getBest(want...) - if match == nil { - t = m.default_.tag - } else { + if match != nil { t, index = match.tag, match.index + } else { + // TODO: this should be an option + t = m.default_.tag + if m.preferSameScript { + outer: + for _, w := range want { + script, _ := w.Script() + if script.scriptID == 0 { + // Don't do anything if there is no script, such as with + // private subtags. + continue + } + for i, h := range m.supported { + if script.scriptID == h.maxScript { + t, index = h.tag, i + break outer + } + } + } + } + // TODO: select first language tag based on script. + } + if w.region != 0 && t.region != 0 && t.region.contains(w.region) { + t, _ = Raw.Compose(t, Region{w.region}) } // Copy options from the user-provided tag into the result tag. This is hard // to do after the fact, so we do it here. - // TODO: consider also adding in variants that are compatible with the - // matched language. - // TODO: Add back region if it is non-ambiguous? Or create another tag to - // preserve the region? + // TODO: add in alternative variants to -u-va-. + // TODO: add preferred region to -u-rg-. + // TODO: add other extensions. Merge with existing extensions. if u, ok := w.Extension('u'); ok { t, _ = Raw.Compose(t, u) } @@ -388,16 +419,18 @@ func minimizeTags(t Tag) (Tag, error) { // matcher keeps a set of supported language tags, indexed by language. type matcher struct { - default_ *haveTag - index map[langID]*matchHeader - passSettings bool + default_ *haveTag + supported []*haveTag + index map[langID]*matchHeader + passSettings bool + preferSameScript bool } // matchHeader has the lists of tags for exact matches and matches based on // maximized and canonicalized tags for a given language. type matchHeader struct { - exact []haveTag - max []haveTag + exact []*haveTag + max []*haveTag } // haveTag holds a supported Tag and its maximized script and region. The maximized @@ -440,8 +473,10 @@ func makeHaveTag(tag Tag, index int) (haveTag, langID) { // script to map to another and we rely on this to keep the code simple. func altScript(l langID, s scriptID) scriptID { for _, alt := range matchScript { - if (alt.lang == 0 || langID(alt.lang) == l) && scriptID(alt.have) == s { - return scriptID(alt.want) + // TODO: also match cases where language is not the same. + if (langID(alt.wantLang) == l || langID(alt.haveLang) == l) && + scriptID(alt.haveScript) == s { + return scriptID(alt.wantScript) } } return 0 @@ -457,7 +492,7 @@ func (h *matchHeader) addIfNew(n haveTag, exact bool) { } } if exact { - h.exact = append(h.exact, n) + h.exact = append(h.exact, &n) } // Allow duplicate maximized tags, but create a linked list to allow quickly // comparing the equivalents and bail out. @@ -472,7 +507,7 @@ func (h *matchHeader) addIfNew(n haveTag, exact bool) { break } } - h.max = append(h.max, n) + h.max = append(h.max, &n) } // header returns the matchHeader for the given language. It creates one if @@ -486,12 +521,26 @@ func (m *matcher) header(l langID) *matchHeader { return h } +func toConf(d uint8) Confidence { + if d <= 10 { + return High + } + if d < 30 { + return Low + } + return No +} + // newMatcher builds an index for the given supported tags and returns it as // a matcher. It also expands the index by considering various equivalence classes // for a given tag. -func newMatcher(supported []Tag) *matcher { +func newMatcher(supported []Tag, options []MatchOption) *matcher { m := &matcher{ - index: make(map[langID]*matchHeader), + index: make(map[langID]*matchHeader), + preferSameScript: true, + } + for _, o := range options { + o(m) } if len(supported) == 0 { m.default_ = &haveTag{} @@ -502,8 +551,9 @@ func newMatcher(supported []Tag) *matcher { for i, tag := range supported { pair, _ := makeHaveTag(tag, i) m.header(tag.lang).addIfNew(pair, true) + m.supported = append(m.supported, &pair) } - m.default_ = &m.header(supported[0].lang).exact[0] + m.default_ = m.header(supported[0].lang).exact[0] for i, tag := range supported { pair, max := makeHaveTag(tag, i) if max != tag.lang { @@ -511,6 +561,9 @@ func newMatcher(supported []Tag) *matcher { } } + // TODO: include alt script. + // - don't replace regions, but allow regions to be made more specific. + // update is used to add indexes in the map for equivalent languages. // If force is true, the update will also apply to derived entries. To // avoid applying a "transitive closure", use false. @@ -520,7 +573,8 @@ func newMatcher(supported []Tag) *matcher { return } hw := m.header(langID(want)) - for _, v := range hh.max { + for _, ht := range hh.max { + v := *ht if conf < v.conf { v.conf = conf } @@ -536,9 +590,9 @@ func newMatcher(supported []Tag) *matcher { // Add entries for languages with mutual intelligibility as defined by CLDR's // languageMatch data. for _, ml := range matchLang { - update(ml.want, ml.have, Confidence(ml.conf), false) + update(ml.want, ml.have, toConf(ml.distance), false) if !ml.oneway { - update(ml.have, ml.want, Confidence(ml.conf), false) + update(ml.have, ml.want, toConf(ml.distance), false) } } @@ -580,7 +634,7 @@ func (m *matcher) getBest(want ...Tag) (got *haveTag, orig Tag, c Confidence) { continue } for i := range h.exact { - have := &h.exact[i] + have := h.exact[i] if have.tag.equalsRest(w) { return have, w, Exact } @@ -591,7 +645,7 @@ func (m *matcher) getBest(want ...Tag) (got *haveTag, orig Tag, c Confidence) { // Base language is not defined. if h != nil { for i := range h.exact { - have := &h.exact[i] + have := h.exact[i] if have.tag.equalsRest(w) { return have, w, Exact } @@ -609,11 +663,11 @@ func (m *matcher) getBest(want ...Tag) (got *haveTag, orig Tag, c Confidence) { } // Check for match based on maximized tag. for i := range h.max { - have := &h.max[i] + have := h.max[i] best.update(have, w, max.script, max.region) if best.conf == Exact { for have.nextMax != 0 { - have = &h.max[have.nextMax] + have = h.max[have.nextMax] best.update(have, w, max.script, max.region) } return best.have, best.want, High @@ -635,11 +689,12 @@ type bestMatch struct { want Tag conf Confidence // Cached results from applying tie-breaking rules. - origLang bool - origReg bool - regDist uint8 - origScript bool - parentDist uint8 // 255 if have is not an ancestor of want tag. + origLang bool + origReg bool + regGroupDist uint8 + regDist uint8 + origScript bool + parentDist uint8 // 255 if have is not an ancestor of want tag. } // update updates the existing best match if the new pair is considered to be a @@ -693,6 +748,14 @@ func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion beaten = true } + regGroupDist := regionGroupDist(have.maxRegion, maxRegion, maxScript, tag.lang) + if !beaten && m.regGroupDist != regGroupDist { + if regGroupDist > m.regGroupDist { + return + } + beaten = true + } + // We prefer if the pre-maximized region was specified and identical. origReg := have.tag.region == tag.region && tag.region != 0 if !beaten && m.origReg != origReg { @@ -702,8 +765,22 @@ func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion beaten = true } - // Next we prefer smaller distances between regions, as defined by regionDist. - regDist := regionDist(have.maxRegion, maxRegion, tag.lang) + // TODO: remove the region distance rule. Region distance has been replaced + // by the region grouping rule. For now we leave it as it still seems to + // have a net positive effect when applied after the grouping rule. + // Possible solutions: + // - apply the primary locale rule first to effectively disable region + // region distance if groups are defined. + // - express the following errors in terms of grouping (if possible) + // - find another method of handling the following cases. + // maximization of legacy: find mo in + // "sr-Cyrl, sr-Latn, ro, ro-MD": have ro; want ro-MD (High) + // region distance French: find fr-US in + // "en, fr, fr-CA, fr-CH": have fr; want fr-CA (High) + + // Next we prefer smaller distances between regions, as defined by + // regionDist. + regDist := uint8(regionDistance(have.maxRegion, maxRegion)) if !beaten && m.regDist != regDist { if regDist > m.regDist { return @@ -721,6 +798,9 @@ func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion } // Finally we prefer tags which have a closer parent relationship. + // TODO: the parent relationship no longer seems necessary. It doesn't hurt + // to leave it in as the final tie-breaker, though, especially until the + // grouping data has further matured. parentDist := parentDistance(have.tag.region, tag) if !beaten && m.parentDist != parentDist { if parentDist > m.parentDist { @@ -737,6 +817,7 @@ func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion m.origLang = origLang m.origReg = origReg m.origScript = origScript + m.regGroupDist = regGroupDist m.regDist = regDist m.parentDist = parentDist } @@ -759,15 +840,27 @@ func parentDistance(haveRegion regionID, tag Tag) uint8 { return d } -// regionDist wraps regionDistance with some exceptions to the algorithmic distance. -func regionDist(a, b regionID, lang langID) uint8 { - if lang == _en { - // Two variants of non-US English are close to each other, regardless of distance. - if a != _US && b != _US { - return 2 +// regionGroupDist computes the distance between two regions based on their +// CLDR grouping. +func regionGroupDist(a, b regionID, script scriptID, lang langID) uint8 { + aGroup := uint(regionToGroups[a]) << 1 + bGroup := uint(regionToGroups[b]) << 1 + for _, ri := range matchRegion { + if langID(ri.lang) == lang && (ri.script == 0 || scriptID(ri.script) == script) { + group := uint(1 << (ri.group &^ 0x80)) + if 0x80&ri.group == 0 { + if aGroup&bGroup&group != 0 { // Both regions are in the group. + return ri.distance + } + } else { + if (aGroup|bGroup)&group == 0 { // Both regions are not in the group. + return ri.distance + } + } } } - return uint8(regionDistance(a, b)) + const defaultDistance = 4 + return defaultDistance } // regionDistance computes the distance between two regions based on the diff --git a/vendor/golang.org/x/text/language/tables.go b/vendor/golang.org/x/text/language/tables.go index 5de0f856af33c..a108554a41061 100644 --- a/vendor/golang.org/x/text/language/tables.go +++ b/vendor/golang.org/x/text/language/tables.go @@ -1,122 +1,122 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package language import "golang.org/x/text/internal/tag" // CLDRVersion is the CLDR version from which the tables in this package are derived. -const CLDRVersion = "29" +const CLDRVersion = "31" const numLanguages = 8654 const numScripts = 230 -const numRegions = 354 +const numRegions = 356 type fromTo struct { from uint16 to uint16 } -const nonCanonicalUnd = 649 +const nonCanonicalUnd = 1199 const ( - _af = 10 - _am = 17 - _ar = 21 - _az = 36 - _bg = 56 - _bn = 75 - _ca = 97 - _cs = 121 - _da = 128 - _de = 133 - _el = 154 - _en = 155 - _es = 157 - _et = 159 - _fa = 164 - _fi = 168 - _fil = 170 - _fr = 175 - _gu = 211 - _he = 224 - _hi = 225 - _hr = 238 - _hu = 242 - _hy = 243 - _id = 248 - _is = 258 - _it = 259 - _ja = 263 - _ka = 273 - _kk = 303 - _km = 307 - _kn = 309 - _ko = 310 - _ky = 333 - _lo = 357 - _lt = 361 - _lv = 368 - _mk = 396 - _ml = 397 - _mn = 399 - _mo = 402 - _mr = 406 - _ms = 410 - _mul = 414 - _my = 421 - _nb = 431 - _ne = 436 - _nl = 445 - _no = 449 - _pa = 471 - _pl = 487 - _pt = 495 - _ro = 515 - _ru = 519 - _sh = 549 - _si = 552 - _sk = 554 - _sl = 556 - _sq = 570 - _sr = 571 - _sv = 583 - _sw = 584 - _ta = 593 - _te = 600 - _th = 605 - _tl = 616 - _tn = 619 - _tr = 623 - _uk = 646 - _ur = 652 - _uz = 653 - _vi = 658 - _zh = 708 - _zu = 710 - _jbo = 265 - _ami = 1033 - _bnn = 1740 - _hak = 221 - _tlh = 13850 - _lb = 340 - _nv = 458 - _pwn = 11438 - _tao = 13571 - _tay = 13581 - _tsu = 14045 - _nn = 447 - _sfb = 13012 - _vgt = 15084 - _sgg = 13043 - _cmn = 2390 - _nan = 428 - _hsn = 240 + _af = 22 + _am = 39 + _ar = 58 + _az = 88 + _bg = 126 + _bn = 165 + _ca = 215 + _cs = 249 + _da = 256 + _de = 268 + _el = 309 + _en = 312 + _es = 317 + _et = 319 + _fa = 327 + _fi = 336 + _fil = 338 + _fr = 349 + _gu = 418 + _he = 442 + _hi = 444 + _hr = 463 + _hu = 467 + _hy = 469 + _id = 479 + _is = 502 + _it = 503 + _ja = 510 + _ka = 526 + _kk = 576 + _km = 584 + _kn = 591 + _ko = 594 + _ky = 648 + _lo = 694 + _lt = 702 + _lv = 709 + _mk = 765 + _ml = 770 + _mn = 777 + _mo = 782 + _mr = 793 + _ms = 797 + _mul = 804 + _my = 815 + _nb = 837 + _ne = 847 + _nl = 869 + _no = 877 + _pa = 923 + _pl = 945 + _pt = 958 + _ro = 986 + _ru = 992 + _sh = 1029 + _si = 1034 + _sk = 1040 + _sl = 1044 + _sq = 1071 + _sr = 1072 + _sv = 1090 + _sw = 1091 + _ta = 1102 + _te = 1119 + _th = 1129 + _tl = 1144 + _tn = 1150 + _tr = 1160 + _uk = 1196 + _ur = 1202 + _uz = 1210 + _vi = 1217 + _zh = 1319 + _zu = 1324 + _jbo = 513 + _ami = 1647 + _bnn = 2354 + _hak = 436 + _tlh = 14464 + _lb = 659 + _nv = 897 + _pwn = 12052 + _tao = 14185 + _tay = 14195 + _tsu = 14659 + _nn = 872 + _sfb = 13626 + _vgt = 15698 + _sgg = 13657 + _cmn = 3004 + _nan = 833 + _hsn = 465 ) -const langPrivateStart = 0x2d09 +const langPrivateStart = 0x2f6f -const langPrivateEnd = 0x2f10 +const langPrivateEnd = 0x3176 // lang holds an alphabetically sorted list of ISO-639 language identifiers. // All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag. @@ -125,72 +125,133 @@ const langPrivateEnd = 0x2f10 // the second and third letter of the 3-letter ISO code. // - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3. // For 3-byte language identifiers the 4th byte is 0. -var lang tag.Index = "" + // Size: 2856 bytes - "---\x00aaarabbkabr\x00ace\x00ach\x00ada\x00ady\x00aeveaeb\x00affragq\x00" + - "aho\x00akkaakk\x00aln\x00alt\x00ammhamo\x00anrgaoz\x00arraarc\x00arn\x00" + - "aro\x00arq\x00ary\x00arz\x00assmasa\x00ase\x00ast\x00atj\x00avvaawa\x00a" + - "yymazzebaakbal\x00ban\x00bap\x00bar\x00bas\x00bax\x00bbc\x00bbj\x00bci" + - "\x00beelbej\x00bem\x00bew\x00bez\x00bfd\x00bfq\x00bft\x00bfy\x00bgulbgc" + - "\x00bgn\x00bgx\x00bhihbhb\x00bhi\x00bhk\x00bho\x00biisbik\x00bin\x00bjj" + - "\x00bjn\x00bkm\x00bku\x00blt\x00bmambmq\x00bnenboodbpy\x00bqi\x00bqv\x00" + - "brrebra\x00brh\x00brx\x00bsosbsq\x00bss\x00bto\x00btv\x00bua\x00buc\x00b" + - "ug\x00bum\x00bvb\x00byn\x00byv\x00bze\x00caatcch\x00ccp\x00ceheceb\x00cg" + - "g\x00chhachk\x00chm\x00cho\x00chp\x00chr\x00cja\x00cjm\x00ckb\x00cooscop" + - "\x00cps\x00crrecrj\x00crk\x00crl\x00crm\x00crs\x00csescsb\x00csw\x00ctd" + - "\x00cuhucvhvcyymdaandak\x00dar\x00dav\x00dcc\x00deeuden\x00dgr\x00dje" + - "\x00dnj\x00doi\x00dsb\x00dtm\x00dtp\x00dty\x00dua\x00dvivdyo\x00dyu\x00d" + - "zzoebu\x00eeweefi\x00egl\x00egy\x00eky\x00elllenngeopoes\x00\x05esu\x00e" + - "tstett\x00euusewo\x00ext\x00faasfan\x00ffulffm\x00fiinfia\x00fil\x00fit" + - "\x00fjijfoaofon\x00frrafrc\x00frp\x00frr\x00frs\x00fud\x00fuq\x00fur\x00" + - "fuv\x00fvr\x00fyrygalegaa\x00gag\x00gan\x00gay\x00gbm\x00gbz\x00gcr\x00g" + - "dlagez\x00ggn\x00gil\x00gjk\x00gju\x00gllgglk\x00gnrngom\x00gon\x00gor" + - "\x00gos\x00got\x00grc\x00grt\x00gsw\x00guujgub\x00guc\x00gur\x00guw\x00g" + - "uz\x00gvlvgvr\x00gwi\x00haauhak\x00haw\x00haz\x00heebhiinhif\x00hil\x00h" + - "lu\x00hmd\x00hnd\x00hne\x00hnj\x00hnn\x00hno\x00homohoc\x00hoj\x00hrrvhs" + - "b\x00hsn\x00htathuunhyyehzerianaiba\x00ibb\x00idndieleigboiiiiikpkikt" + - "\x00ilo\x00inndinh\x00iodoisslittaiukuiw\x00\x03izh\x00japnjam\x00jbo" + - "\x00jgo\x00ji\x00\x06jmc\x00jml\x00jut\x00jvavjwavkaatkaa\x00kab\x00kac" + - "\x00kaj\x00kam\x00kao\x00kbd\x00kcg\x00kck\x00kde\x00kdt\x00kea\x00ken" + - "\x00kfo\x00kfr\x00kfy\x00kgonkge\x00kgp\x00kha\x00khb\x00khn\x00khq\x00k" + - "ht\x00khw\x00kiikkiu\x00kjuakjg\x00kkazkkj\x00klalkln\x00kmhmkmb\x00knan" + - "koorkoi\x00kok\x00kos\x00kpe\x00kraukrc\x00kri\x00krj\x00krl\x00kru\x00k" + - "sasksb\x00ksf\x00ksh\x00kuurkum\x00kvomkvr\x00kvx\x00kw\x00\x01kxm\x00kx" + - "p\x00kyirlaatlab\x00lad\x00lag\x00lah\x00laj\x00lbtzlbe\x00lbw\x00lcp" + - "\x00lep\x00lez\x00lgugliimlif\x00lij\x00lis\x00ljp\x00lki\x00lkt\x00lmn" + - "\x00lmo\x00lninloaolol\x00loz\x00lrc\x00ltitltg\x00luublua\x00luo\x00luy" + - "\x00luz\x00lvavlwl\x00lzh\x00lzz\x00mad\x00maf\x00mag\x00mai\x00mak\x00m" + - "an\x00mas\x00maz\x00mdf\x00mdh\x00mdr\x00men\x00mer\x00mfa\x00mfe\x00mgl" + - "gmgh\x00mgo\x00mgp\x00mgy\x00mhahmirimin\x00mis\x00mkkdmlalmls\x00mnonmn" + - "i\x00mnw\x00moolmoe\x00moh\x00mos\x00mrarmrd\x00mrj\x00mro\x00mssamtltmt" + - "r\x00mua\x00mul\x00mus\x00mvy\x00mwk\x00mwr\x00mwv\x00mxc\x00myyamyv\x00" + - "myx\x00myz\x00mzn\x00naaunah\x00nan\x00nap\x00naq\x00nbobnch\x00nddendc" + - "\x00nds\x00neepnew\x00ngdongl\x00nhe\x00nhw\x00nij\x00niu\x00njo\x00nlld" + - "nmg\x00nnnonnh\x00noornod\x00noe\x00non\x00nqo\x00nrblnsk\x00nso\x00nus" + - "\x00nvavnxq\x00nyyanym\x00nyn\x00nzi\x00occiojjiomrmorriosssosa\x00otk" + - "\x00paanpag\x00pal\x00pam\x00pap\x00pau\x00pcd\x00pcm\x00pdc\x00pdt\x00p" + - "eo\x00pfl\x00phn\x00pilipka\x00pko\x00plolpms\x00pnt\x00pon\x00pra\x00pr" + - "d\x00prg\x00psusptorpuu\x00quuequc\x00qug\x00raj\x00rcf\x00rej\x00rgn" + - "\x00ria\x00rif\x00rjs\x00rkt\x00rmohrmf\x00rmo\x00rmt\x00rmu\x00rnunrng" + - "\x00roonrob\x00rof\x00rtm\x00ruusrue\x00rug\x00rw\x00\x04rwk\x00ryu\x00s" + - "aansaf\x00sah\x00saq\x00sas\x00sat\x00saz\x00sbp\x00scrdsck\x00scn\x00sc" + - "o\x00scs\x00sdndsdc\x00sdh\x00semesef\x00seh\x00sei\x00ses\x00sgagsga" + - "\x00sgs\x00sh\x00\x02shi\x00shn\x00siinsid\x00sklkskr\x00sllvsli\x00sly" + - "\x00smmosma\x00smi\x00smj\x00smn\x00smp\x00sms\x00snnasnk\x00soomsou\x00" + - "sqqisrrpsrb\x00srn\x00srr\x00srx\x00ssswssy\x00stotstq\x00suunsuk\x00sus" + - "\x00svweswwaswb\x00swc\x00swg\x00swv\x00sxn\x00syl\x00syr\x00szl\x00taam" + - "taj\x00tbw\x00tcy\x00tdd\x00tdg\x00tdh\x00teeltem\x00teo\x00tet\x00tggkt" + - "hhathl\x00thq\x00thr\x00tiirtig\x00tiv\x00tkuktkl\x00tkr\x00tkt\x00tlglt" + - "ly\x00tmh\x00tnsntoontog\x00tpi\x00trurtru\x00trv\x00tssotsd\x00tsf\x00t" + - "sg\x00tsj\x00ttatttj\x00tts\x00ttt\x00tum\x00tvl\x00twwitwq\x00txg\x00ty" + - "ahtyv\x00tzm\x00udm\x00ugiguga\x00ukkruli\x00umb\x00und\x00unr\x00unx" + - "\x00urrduzzbvai\x00veenvec\x00vep\x00viievic\x00vls\x00vmf\x00vmw\x00voo" + - "lvot\x00vro\x00vun\x00walnwae\x00wal\x00war\x00wbp\x00wbq\x00wbr\x00wls" + - "\x00wni\x00woolwtm\x00wuu\x00xav\x00xcr\x00xhhoxlc\x00xld\x00xmf\x00xmn" + - "\x00xmr\x00xna\x00xnr\x00xog\x00xpr\x00xsa\x00xsr\x00yao\x00yap\x00yav" + - "\x00ybb\x00yiidyooryrl\x00yua\x00yue\x00zahazag\x00zbl\x00zdj\x00zea\x00" + - "zgh\x00zhhozmi\x00zuulzxx\x00zza\x00\xff\xff\xff\xff" +const lang tag.Index = "" + // Size: 5312 bytes + "---\x00aaaraai\x00aak\x00aau\x00abbkabi\x00abq\x00abr\x00abt\x00aby\x00a" + + "cd\x00ace\x00ach\x00ada\x00ade\x00adj\x00ady\x00adz\x00aeveaeb\x00aey" + + "\x00affragc\x00agd\x00agg\x00agm\x00ago\x00agq\x00aha\x00ahl\x00aho\x00a" + + "jg\x00akkaakk\x00ala\x00ali\x00aln\x00alt\x00ammhamm\x00amn\x00amo\x00am" + + "p\x00anrganc\x00ank\x00ann\x00any\x00aoj\x00aom\x00aoz\x00apc\x00apd\x00" + + "ape\x00apr\x00aps\x00apz\x00arraarc\x00arh\x00arn\x00aro\x00arq\x00ars" + + "\x00ary\x00arz\x00assmasa\x00ase\x00asg\x00aso\x00ast\x00ata\x00atg\x00a" + + "tj\x00auy\x00avvaavl\x00avn\x00avt\x00avu\x00awa\x00awb\x00awo\x00awx" + + "\x00ayymayb\x00azzebaakbal\x00ban\x00bap\x00bar\x00bas\x00bav\x00bax\x00" + + "bba\x00bbb\x00bbc\x00bbd\x00bbj\x00bbp\x00bbr\x00bcf\x00bch\x00bci\x00bc" + + "m\x00bcn\x00bco\x00bcq\x00bcu\x00bdd\x00beelbef\x00beh\x00bej\x00bem\x00" + + "bet\x00bew\x00bex\x00bez\x00bfd\x00bfq\x00bft\x00bfy\x00bgulbgc\x00bgn" + + "\x00bgx\x00bhihbhb\x00bhg\x00bhi\x00bhk\x00bhl\x00bho\x00bhy\x00biisbib" + + "\x00big\x00bik\x00bim\x00bin\x00bio\x00biq\x00bjh\x00bji\x00bjj\x00bjn" + + "\x00bjo\x00bjr\x00bjt\x00bjz\x00bkc\x00bkm\x00bkq\x00bku\x00bkv\x00blt" + + "\x00bmambmh\x00bmk\x00bmq\x00bmu\x00bnenbng\x00bnm\x00bnp\x00boodboj\x00" + + "bom\x00bon\x00bpy\x00bqc\x00bqi\x00bqp\x00bqv\x00brrebra\x00brh\x00brx" + + "\x00brz\x00bsosbsj\x00bsq\x00bss\x00bst\x00bto\x00btt\x00btv\x00bua\x00b" + + "uc\x00bud\x00bug\x00buk\x00bum\x00buo\x00bus\x00buu\x00bvb\x00bwd\x00bwr" + + "\x00bxh\x00bye\x00byn\x00byr\x00bys\x00byv\x00byx\x00bza\x00bze\x00bzf" + + "\x00bzh\x00bzw\x00caatcan\x00cbj\x00cch\x00ccp\x00ceheceb\x00cfa\x00cgg" + + "\x00chhachk\x00chm\x00cho\x00chp\x00chr\x00cja\x00cjm\x00cjv\x00ckb\x00c" + + "kl\x00cko\x00cky\x00cla\x00cme\x00cooscop\x00cps\x00crrecrh\x00crj\x00cr" + + "k\x00crl\x00crm\x00crs\x00csescsb\x00csw\x00ctd\x00cuhucvhvcyymdaandad" + + "\x00daf\x00dag\x00dah\x00dak\x00dar\x00dav\x00dbd\x00dbq\x00dcc\x00ddn" + + "\x00deeuded\x00den\x00dga\x00dgh\x00dgi\x00dgl\x00dgr\x00dgz\x00dia\x00d" + + "je\x00dnj\x00dob\x00doi\x00dop\x00dow\x00dri\x00drs\x00dsb\x00dtm\x00dtp" + + "\x00dts\x00dty\x00dua\x00duc\x00dud\x00dug\x00dvivdva\x00dww\x00dyo\x00d" + + "yu\x00dzzodzg\x00ebu\x00eeweefi\x00egl\x00egy\x00eka\x00eky\x00elllema" + + "\x00emi\x00enngenn\x00enq\x00eopoeri\x00es\x00\x05esu\x00etstetr\x00ett" + + "\x00etu\x00etx\x00euusewo\x00ext\x00faasfaa\x00fab\x00fag\x00fai\x00fan" + + "\x00ffulffi\x00ffm\x00fiinfia\x00fil\x00fit\x00fjijflr\x00fmp\x00foaofod" + + "\x00fon\x00for\x00fpe\x00fqs\x00frrafrc\x00frp\x00frr\x00frs\x00fub\x00f" + + "ud\x00fue\x00fuf\x00fuh\x00fuq\x00fur\x00fuv\x00fuy\x00fvr\x00fyrygalega" + + "a\x00gaf\x00gag\x00gah\x00gaj\x00gam\x00gan\x00gaw\x00gay\x00gbf\x00gbm" + + "\x00gby\x00gbz\x00gcr\x00gdlagde\x00gdn\x00gdr\x00geb\x00gej\x00gel\x00g" + + "ez\x00gfk\x00ggn\x00ghs\x00gil\x00gim\x00gjk\x00gjn\x00gju\x00gkn\x00gkp" + + "\x00gllgglk\x00gmm\x00gmv\x00gnrngnd\x00gng\x00god\x00gof\x00goi\x00gom" + + "\x00gon\x00gor\x00gos\x00got\x00grb\x00grc\x00grt\x00grw\x00gsw\x00guujg" + + "ub\x00guc\x00gud\x00gur\x00guw\x00gux\x00guz\x00gvlvgvf\x00gvr\x00gvs" + + "\x00gwc\x00gwi\x00gwt\x00gyi\x00haauhag\x00hak\x00ham\x00haw\x00haz\x00h" + + "bb\x00hdy\x00heebhhy\x00hiinhia\x00hif\x00hig\x00hih\x00hil\x00hla\x00hl" + + "u\x00hmd\x00hmt\x00hnd\x00hne\x00hnj\x00hnn\x00hno\x00homohoc\x00hoj\x00" + + "hot\x00hrrvhsb\x00hsn\x00htathuunhui\x00hyyehzerianaian\x00iar\x00iba" + + "\x00ibb\x00iby\x00ica\x00ich\x00idndidd\x00idi\x00idu\x00ieleife\x00igbo" + + "igb\x00ige\x00iiiiijj\x00ikpkikk\x00ikt\x00ikw\x00ikx\x00ilo\x00imo\x00i" + + "nndinh\x00iodoiou\x00iri\x00isslittaiukuiw\x00\x03iwm\x00iws\x00izh\x00i" + + "zi\x00japnjab\x00jam\x00jbo\x00jbu\x00jen\x00jgk\x00jgo\x00ji\x00\x06jib" + + "\x00jmc\x00jml\x00jra\x00jut\x00jvavjwavkaatkaa\x00kab\x00kac\x00kad\x00" + + "kai\x00kaj\x00kam\x00kao\x00kbd\x00kbm\x00kbp\x00kbq\x00kbx\x00kby\x00kc" + + "g\x00kck\x00kcl\x00kct\x00kde\x00kdh\x00kdl\x00kdt\x00kea\x00ken\x00kez" + + "\x00kfo\x00kfr\x00kfy\x00kgonkge\x00kgf\x00kgp\x00kha\x00khb\x00khn\x00k" + + "hq\x00khs\x00kht\x00khw\x00khz\x00kiikkij\x00kiu\x00kiw\x00kjuakjd\x00kj" + + "g\x00kjs\x00kjy\x00kkazkkc\x00kkj\x00klalkln\x00klq\x00klt\x00klx\x00kmh" + + "mkmb\x00kmh\x00kmo\x00kms\x00kmu\x00kmw\x00knanknf\x00knp\x00koorkoi\x00" + + "kok\x00kol\x00kos\x00koz\x00kpe\x00kpf\x00kpo\x00kpr\x00kpx\x00kqb\x00kq" + + "f\x00kqs\x00kqy\x00kraukrc\x00kri\x00krj\x00krl\x00krs\x00kru\x00ksasksb" + + "\x00ksd\x00ksf\x00ksh\x00ksj\x00ksr\x00ktb\x00ktm\x00kto\x00kuurkub\x00k" + + "ud\x00kue\x00kuj\x00kum\x00kun\x00kup\x00kus\x00kvomkvg\x00kvr\x00kvx" + + "\x00kw\x00\x01kwj\x00kwo\x00kxa\x00kxc\x00kxm\x00kxp\x00kxw\x00kxz\x00ky" + + "irkye\x00kyx\x00kzr\x00laatlab\x00lad\x00lag\x00lah\x00laj\x00las\x00lbt" + + "zlbe\x00lbu\x00lbw\x00lcm\x00lcp\x00ldb\x00led\x00lee\x00lem\x00lep\x00l" + + "eq\x00leu\x00lez\x00lguglgg\x00liimlia\x00lid\x00lif\x00lig\x00lih\x00li" + + "j\x00lis\x00ljp\x00lki\x00lkt\x00lle\x00lln\x00lmn\x00lmo\x00lmp\x00lnin" + + "lns\x00lnu\x00loaoloj\x00lok\x00lol\x00lor\x00los\x00loz\x00lrc\x00ltitl" + + "tg\x00luublua\x00luo\x00luy\x00luz\x00lvavlwl\x00lzh\x00lzz\x00mad\x00ma" + + "f\x00mag\x00mai\x00mak\x00man\x00mas\x00maw\x00maz\x00mbh\x00mbo\x00mbq" + + "\x00mbu\x00mbw\x00mci\x00mcp\x00mcq\x00mcr\x00mcu\x00mda\x00mde\x00mdf" + + "\x00mdh\x00mdj\x00mdr\x00mdx\x00med\x00mee\x00mek\x00men\x00mer\x00met" + + "\x00meu\x00mfa\x00mfe\x00mfn\x00mfo\x00mfq\x00mglgmgh\x00mgl\x00mgo\x00m" + + "gp\x00mgy\x00mhahmhi\x00mhl\x00mirimif\x00min\x00mis\x00miw\x00mkkdmki" + + "\x00mkl\x00mkp\x00mkw\x00mlalmle\x00mlp\x00mls\x00mmo\x00mmu\x00mmx\x00m" + + "nonmna\x00mnf\x00mni\x00mnw\x00moolmoa\x00moe\x00moh\x00mos\x00mox\x00mp" + + "p\x00mps\x00mpt\x00mpx\x00mql\x00mrarmrd\x00mrj\x00mro\x00mssamtltmtc" + + "\x00mtf\x00mti\x00mtr\x00mua\x00mul\x00mur\x00mus\x00mva\x00mvn\x00mvy" + + "\x00mwk\x00mwr\x00mwv\x00mxc\x00mxm\x00myyamyk\x00mym\x00myv\x00myw\x00m" + + "yx\x00myz\x00mzk\x00mzm\x00mzn\x00mzp\x00mzw\x00mzz\x00naaunac\x00naf" + + "\x00nah\x00nak\x00nan\x00nap\x00naq\x00nas\x00nbobnca\x00nce\x00ncf\x00n" + + "ch\x00nco\x00ncu\x00nddendc\x00nds\x00neepneb\x00new\x00nex\x00nfr\x00ng" + + "donga\x00ngb\x00ngl\x00nhb\x00nhe\x00nhw\x00nif\x00nii\x00nij\x00nin\x00" + + "niu\x00niy\x00niz\x00njo\x00nkg\x00nko\x00nlldnmg\x00nmz\x00nnnonnf\x00n" + + "nh\x00nnk\x00nnm\x00noornod\x00noe\x00non\x00nop\x00nou\x00nqo\x00nrblnr" + + "b\x00nsk\x00nsn\x00nso\x00nss\x00ntm\x00ntr\x00nui\x00nup\x00nus\x00nuv" + + "\x00nux\x00nvavnwb\x00nxq\x00nxr\x00nyyanym\x00nyn\x00nzi\x00occiogc\x00" + + "ojjiokr\x00okv\x00omrmong\x00onn\x00ons\x00opm\x00orrioro\x00oru\x00osss" + + "osa\x00ota\x00otk\x00ozm\x00paanpag\x00pal\x00pam\x00pap\x00pau\x00pbi" + + "\x00pcd\x00pcm\x00pdc\x00pdt\x00ped\x00peo\x00pex\x00pfl\x00phl\x00phn" + + "\x00pilipil\x00pip\x00pka\x00pko\x00plolpla\x00pms\x00png\x00pnn\x00pnt" + + "\x00pon\x00ppo\x00pra\x00prd\x00prg\x00psuspss\x00ptorptp\x00puu\x00pwa" + + "\x00quuequc\x00qug\x00rai\x00raj\x00rao\x00rcf\x00rej\x00rel\x00res\x00r" + + "gn\x00rhg\x00ria\x00rif\x00rjs\x00rkt\x00rmohrmf\x00rmo\x00rmt\x00rmu" + + "\x00rnunrna\x00rng\x00roonrob\x00rof\x00roo\x00rro\x00rtm\x00ruusrue\x00" + + "rug\x00rw\x00\x04rwk\x00rwo\x00ryu\x00saansaf\x00sah\x00saq\x00sas\x00sa" + + "t\x00sav\x00saz\x00sba\x00sbe\x00sbp\x00scrdsck\x00scl\x00scn\x00sco\x00" + + "scs\x00sdndsdc\x00sdh\x00semesef\x00seh\x00sei\x00ses\x00sgagsga\x00sgs" + + "\x00sgw\x00sgz\x00sh\x00\x02shi\x00shk\x00shn\x00shu\x00siinsid\x00sig" + + "\x00sil\x00sim\x00sjr\x00sklkskc\x00skr\x00sks\x00sllvsld\x00sli\x00sll" + + "\x00sly\x00smmosma\x00smi\x00smj\x00smn\x00smp\x00smq\x00sms\x00snnasnc" + + "\x00snk\x00snp\x00snx\x00sny\x00soomsok\x00soq\x00sou\x00soy\x00spd\x00s" + + "pl\x00sps\x00sqqisrrpsrb\x00srn\x00srr\x00srx\x00ssswssd\x00ssg\x00ssy" + + "\x00stotstk\x00stq\x00suunsua\x00sue\x00suk\x00sur\x00sus\x00svweswwaswb" + + "\x00swc\x00swg\x00swp\x00swv\x00sxn\x00sxw\x00syl\x00syr\x00szl\x00taamt" + + "aj\x00tal\x00tan\x00taq\x00tbc\x00tbd\x00tbf\x00tbg\x00tbo\x00tbw\x00tbz" + + "\x00tci\x00tcy\x00tdd\x00tdg\x00tdh\x00teelted\x00tem\x00teo\x00tet\x00t" + + "fi\x00tggktgc\x00tgo\x00tgu\x00thhathl\x00thq\x00thr\x00tiirtif\x00tig" + + "\x00tik\x00tim\x00tio\x00tiv\x00tkuktkl\x00tkr\x00tkt\x00tlgltlf\x00tlx" + + "\x00tly\x00tmh\x00tmy\x00tnsntnh\x00toontof\x00tog\x00toq\x00tpi\x00tpm" + + "\x00tpz\x00tqo\x00trurtru\x00trv\x00trw\x00tssotsd\x00tsf\x00tsg\x00tsj" + + "\x00tsw\x00ttatttd\x00tte\x00ttj\x00ttr\x00tts\x00ttt\x00tuh\x00tul\x00t" + + "um\x00tuq\x00tvd\x00tvl\x00tvu\x00twwitwh\x00twq\x00txg\x00tyahtya\x00ty" + + "v\x00tzm\x00ubu\x00udm\x00ugiguga\x00ukkruli\x00umb\x00und\x00unr\x00unx" + + "\x00urrduri\x00urt\x00urw\x00usa\x00utr\x00uvh\x00uvl\x00uzzbvag\x00vai" + + "\x00van\x00veenvec\x00vep\x00viievic\x00viv\x00vls\x00vmf\x00vmw\x00vool" + + "vot\x00vro\x00vun\x00vut\x00walnwae\x00waj\x00wal\x00wan\x00war\x00wbp" + + "\x00wbq\x00wbr\x00wci\x00wer\x00wgi\x00whg\x00wib\x00wiu\x00wiv\x00wja" + + "\x00wji\x00wls\x00wmo\x00wnc\x00wni\x00wnu\x00woolwob\x00wos\x00wrs\x00w" + + "sk\x00wtm\x00wuu\x00wuv\x00wwa\x00xav\x00xbi\x00xcr\x00xes\x00xhhoxla" + + "\x00xlc\x00xld\x00xmf\x00xmn\x00xmr\x00xna\x00xnr\x00xog\x00xon\x00xpr" + + "\x00xrb\x00xsa\x00xsi\x00xsm\x00xsr\x00xwe\x00yam\x00yao\x00yap\x00yas" + + "\x00yat\x00yav\x00yay\x00yaz\x00yba\x00ybb\x00yby\x00yer\x00ygr\x00ygw" + + "\x00yiidyko\x00yle\x00ylg\x00yll\x00yml\x00yooryon\x00yrb\x00yre\x00yrl" + + "\x00yss\x00yua\x00yue\x00yuj\x00yut\x00yuw\x00zahazag\x00zbl\x00zdj\x00z" + + "ea\x00zgh\x00zhhozia\x00zlm\x00zmi\x00zne\x00zuulzxx\x00zza\x00\xff\xff" + + "\xff\xff" -const langNoIndexOffset = 713 +const langNoIndexOffset = 1327 // langNoIndex is a bit vector of all 3-letter language codes that are not used as an index // in lookup tables. The language ids for these language codes are derived directly @@ -198,194 +259,194 @@ const langNoIndexOffset = 713 // Size: 2197 bytes, 2197 elements var langNoIndex = [2197]uint8{ // Entry 0 - 3F - 0xff, 0xfd, 0xfd, 0xfe, 0xef, 0xf7, 0xbf, 0xd2, - 0xfb, 0xbf, 0xfe, 0xfa, 0xb7, 0x1d, 0x3c, 0x57, - 0x6f, 0x97, 0x73, 0xf8, 0xff, 0xef, 0xff, 0x70, - 0xaf, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x85, 0x62, - 0xe9, 0xbf, 0xfd, 0xff, 0xff, 0xf7, 0xfd, 0x77, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0xc9, 0xff, 0xff, 0xff, 0x4d, 0xb8, 0x0a, 0x6a, - 0x7e, 0xfa, 0xe3, 0xfe, 0x7e, 0xff, 0x77, 0xff, + 0xff, 0xf8, 0xed, 0xfe, 0xeb, 0xd3, 0x3b, 0xd2, + 0xfb, 0xbf, 0x7a, 0xfa, 0x37, 0x1d, 0x3c, 0x57, + 0x6e, 0x97, 0x73, 0x38, 0xfb, 0xea, 0xbf, 0x70, + 0xad, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x84, 0x62, + 0xe9, 0xbf, 0xfd, 0xbf, 0xbf, 0xf7, 0xfd, 0x77, + 0x0f, 0xff, 0xef, 0x6f, 0xff, 0xfb, 0xdf, 0xe2, + 0xc9, 0xf8, 0x7f, 0x7e, 0x4d, 0xb8, 0x0a, 0x6a, + 0x7c, 0xea, 0xe3, 0xfa, 0x7a, 0xbf, 0x67, 0xff, // Entry 40 - 7F - 0xff, 0xff, 0xff, 0xdf, 0x2b, 0xf4, 0xf1, 0xe0, - 0x5d, 0xe7, 0x9f, 0x14, 0x07, 0x20, 0xdf, 0xed, - 0x9f, 0x3f, 0xc9, 0x21, 0xf8, 0x3f, 0x94, 0xf7, - 0x7e, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0x5f, 0xfc, 0xdb, 0xfd, 0xbf, 0xb5, - 0x7b, 0xdf, 0x7f, 0xf7, 0xeb, 0xfe, 0xff, 0xa7, - 0xbd, 0xff, 0x7f, 0xf7, 0xff, 0xef, 0xef, 0xef, - 0xff, 0xff, 0x9f, 0xff, 0xff, 0xef, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xdf, 0x2a, 0x54, 0x91, 0xc0, + 0x5d, 0xe3, 0x97, 0x14, 0x07, 0x20, 0xdd, 0xed, + 0x9f, 0x3f, 0xc9, 0x21, 0xf8, 0x3f, 0x94, 0x35, + 0x7c, 0x5f, 0xff, 0x5f, 0x8e, 0x6e, 0xdf, 0xff, + 0xff, 0xff, 0x55, 0x7c, 0xd3, 0xfd, 0xbf, 0xb5, + 0x7b, 0xdf, 0x7f, 0xf7, 0xca, 0xfe, 0xdb, 0xa3, + 0xa8, 0xff, 0x1f, 0x67, 0x7d, 0xeb, 0xef, 0xce, + 0xff, 0xff, 0x9f, 0xff, 0xb7, 0xef, 0xfe, 0xcf, // Entry 80 - BF - 0xff, 0xff, 0xf3, 0xff, 0xfb, 0x2f, 0xff, 0xff, - 0xfb, 0xee, 0xff, 0xbd, 0xdb, 0xff, 0xdf, 0xf7, - 0xff, 0xfa, 0xfd, 0xff, 0x7e, 0xaf, 0x7b, 0xfe, - 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xdf, 0xfb, 0xff, 0xfd, 0xfc, 0xfb, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x7f, 0xbf, 0xfd, 0xd5, + 0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x2f, 0xff, 0xff, + 0xbb, 0xee, 0xf7, 0xbd, 0xdb, 0xff, 0x5f, 0xf7, + 0xfd, 0xf2, 0xfd, 0xff, 0x5e, 0x2f, 0x3b, 0xba, + 0x7e, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xdd, 0xff, + 0xfd, 0xdf, 0xfb, 0xfe, 0x9d, 0xb4, 0xd3, 0xff, + 0xef, 0xff, 0xdf, 0xf7, 0x7f, 0xb7, 0xfd, 0xd5, 0xa5, 0x77, 0x40, 0xff, 0x9c, 0xc1, 0x41, 0x2c, - 0x08, 0x24, 0x41, 0x00, 0x50, 0x40, 0x00, 0x80, + 0x08, 0x20, 0x41, 0x00, 0x50, 0x40, 0x00, 0x80, // Entry C0 - FF 0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96, - 0x9b, 0x14, 0x88, 0xf6, 0x7b, 0xe7, 0x17, 0x56, - 0x55, 0x7d, 0x0e, 0x1c, 0x37, 0x71, 0xf3, 0xef, + 0x1b, 0x14, 0x08, 0xf2, 0x2b, 0xe7, 0x17, 0x56, + 0x45, 0x7d, 0x0e, 0x1c, 0x37, 0x71, 0xf3, 0xef, 0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10, - 0xbc, 0x87, 0xaf, 0xdf, 0xff, 0xf7, 0x73, 0x35, + 0xbc, 0x85, 0xaf, 0xdf, 0xff, 0xf7, 0x73, 0x35, 0x3e, 0x87, 0xc7, 0xdf, 0xff, 0x00, 0x81, 0x00, 0xb0, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, - 0x40, 0x00, 0x40, 0x92, 0x21, 0xd0, 0xbf, 0x5d, + 0x40, 0x00, 0x40, 0x92, 0x21, 0x50, 0xb1, 0x5d, // Entry 100 - 13F - 0xfd, 0xde, 0xfe, 0x5e, 0x00, 0x00, 0x02, 0x64, - 0x8d, 0x19, 0xc1, 0xdf, 0x79, 0x22, 0x00, 0x00, - 0x00, 0xdf, 0x6d, 0xdc, 0x26, 0xe5, 0xd9, 0xf3, + 0xfd, 0xdc, 0xbe, 0x5e, 0x00, 0x00, 0x02, 0x64, + 0x0d, 0x19, 0x41, 0xdf, 0x79, 0x22, 0x00, 0x00, + 0x00, 0x5e, 0x64, 0xdc, 0x24, 0xe5, 0xd9, 0xe3, 0xfe, 0xff, 0xfd, 0xcb, 0x9f, 0x14, 0x01, 0x0c, 0x86, 0x00, 0xd1, 0x00, 0xf0, 0xc5, 0x67, 0x5f, - 0x56, 0x89, 0x5e, 0xb7, 0xec, 0xef, 0x03, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xc0, 0x77, 0xda, 0x57, - 0x90, 0x69, 0x01, 0x2c, 0x96, 0x79, 0xe0, 0xff, + 0x56, 0x89, 0x5e, 0xb5, 0x6c, 0xaf, 0x03, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xc0, 0x37, 0xda, 0x56, + 0x90, 0x69, 0x01, 0x2c, 0x96, 0x69, 0x20, 0xfb, // Entry 140 - 17F - 0xff, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x08, 0x56, - 0x01, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x16, + 0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x08, 0x16, + 0x01, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x06, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x09, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x04, 0x08, 0x00, 0x00, 0x04, 0x00, 0x80, 0x28, 0x04, - 0x00, 0x00, 0x50, 0xd5, 0x2d, 0x00, 0x64, 0x35, - 0x24, 0x53, 0xf5, 0xd4, 0xbd, 0xe2, 0xcd, 0x03, + 0x00, 0x00, 0x40, 0xd5, 0x2d, 0x00, 0x64, 0x35, + 0x24, 0x52, 0xf4, 0xd4, 0xbd, 0x62, 0xc9, 0x03, // Entry 180 - 1BF 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x17, 0x39, 0x01, 0xdd, 0x57, 0x98, - 0x21, 0x98, 0xa5, 0x00, 0x00, 0x01, 0x40, 0x82, + 0x00, 0x04, 0x13, 0x39, 0x01, 0xdd, 0x57, 0x98, + 0x21, 0x18, 0x81, 0x00, 0x00, 0x01, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0xb0, 0xfe, + 0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0x80, 0xea, 0xa9, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // Entry 1C0 - 1FF 0x00, 0x01, 0x28, 0x05, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x20, 0x04, 0xa6, 0x08, 0x04, 0x00, 0x08, - 0x81, 0x50, 0x00, 0x00, 0x08, 0x11, 0x86, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x06, 0x55, - 0x02, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x60, - 0x3b, 0x83, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, + 0x04, 0x20, 0x04, 0xa6, 0x00, 0x04, 0x00, 0x00, + 0x81, 0x50, 0x00, 0x00, 0x00, 0x11, 0x84, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x55, + 0x02, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x40, + 0x30, 0x83, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xbe, 0xdf, 0xff, 0xfe, 0xbf, + 0x00, 0x00, 0x00, 0x1e, 0xcd, 0xbf, 0x7e, 0xbf, // Entry 200 - 23F - 0xdf, 0xc7, 0x83, 0x82, 0xc0, 0xff, 0xdf, 0x27, - 0xcf, 0x5f, 0xe7, 0x01, 0x10, 0x20, 0xb2, 0xc5, - 0xa4, 0x45, 0x25, 0x9b, 0x03, 0xcf, 0xf0, 0xdf, - 0x03, 0xc4, 0x08, 0x10, 0x01, 0x0e, 0x01, 0xe3, - 0x92, 0x54, 0xdb, 0x38, 0xf1, 0x7f, 0xf7, 0x6d, - 0xf9, 0xff, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01, - 0x21, 0x12, 0x6c, 0x5f, 0xdd, 0x0f, 0x85, 0x4f, - 0x40, 0x40, 0x00, 0x04, 0xf9, 0xfd, 0xbd, 0xd4, + 0xdf, 0xc3, 0x83, 0x82, 0xc0, 0xfb, 0x57, 0x27, + 0xcd, 0x55, 0xe7, 0x01, 0x00, 0x20, 0xb2, 0xc5, + 0xa4, 0x45, 0x25, 0x9b, 0x02, 0xcf, 0xe0, 0xdf, + 0x03, 0x44, 0x08, 0x10, 0x01, 0x04, 0x01, 0xe3, + 0x92, 0x54, 0xdb, 0x28, 0xd1, 0x5f, 0xf6, 0x6d, + 0x79, 0xed, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01, + 0x21, 0x12, 0x64, 0x5f, 0xdd, 0x0e, 0x85, 0x4f, + 0x40, 0x40, 0x00, 0x04, 0xf1, 0xfd, 0x3d, 0x54, // Entry 240 - 27F - 0xe8, 0x13, 0xf4, 0x27, 0xa3, 0x0d, 0x00, 0x00, - 0x20, 0x7b, 0x39, 0x02, 0x05, 0x84, 0x00, 0xf0, - 0xbf, 0x7f, 0xda, 0x00, 0x18, 0x04, 0x81, 0x00, - 0x00, 0x00, 0x80, 0x10, 0x94, 0x1c, 0x01, 0x00, + 0xe8, 0x03, 0xb4, 0x27, 0x23, 0x0d, 0x00, 0x00, + 0x20, 0x7b, 0x38, 0x02, 0x05, 0x84, 0x00, 0xf0, + 0xbb, 0x7e, 0x5a, 0x00, 0x18, 0x04, 0x81, 0x00, + 0x00, 0x00, 0x80, 0x10, 0x90, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x04, - 0x08, 0xb4, 0x7c, 0xa5, 0x0c, 0x40, 0x00, 0x00, - 0x11, 0x04, 0x04, 0x6c, 0x00, 0x20, 0x70, 0xff, - 0xfb, 0x7f, 0x60, 0x00, 0x05, 0x9b, 0xdd, 0x6e, + 0x08, 0xa0, 0x70, 0xa5, 0x0c, 0x40, 0x00, 0x00, + 0x11, 0x04, 0x04, 0x68, 0x00, 0x20, 0x70, 0xff, + 0x7b, 0x7f, 0x60, 0x00, 0x05, 0x9b, 0xdd, 0x66, // Entry 280 - 2BF 0x03, 0x00, 0x11, 0x00, 0x00, 0x00, 0x40, 0x05, 0xb5, 0xb6, 0x80, 0x08, 0x04, 0x00, 0x04, 0x51, - 0xe2, 0xff, 0xfd, 0x3f, 0x05, 0x09, 0x08, 0x05, + 0xe2, 0xef, 0xfd, 0x3f, 0x05, 0x09, 0x08, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x02, 0x60, - 0xe5, 0x48, 0x14, 0x89, 0x20, 0xc0, 0x47, 0x80, - 0x07, 0x00, 0x00, 0x00, 0xcc, 0x50, 0x40, 0x24, - 0x85, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x60, + 0xe5, 0x48, 0x00, 0x81, 0x20, 0xc0, 0x05, 0x80, + 0x03, 0x00, 0x00, 0x00, 0x8c, 0x50, 0x40, 0x04, + 0x84, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20, // Entry 2C0 - 2FF - 0x02, 0x50, 0x88, 0x11, 0x00, 0xd1, 0x6c, 0xee, - 0x50, 0x27, 0x1d, 0x11, 0x69, 0x06, 0x59, 0xe9, - 0x33, 0x08, 0x00, 0x20, 0x05, 0x40, 0x10, 0x00, - 0x00, 0x00, 0x50, 0x44, 0x96, 0x49, 0xd6, 0x5d, + 0x02, 0x50, 0x80, 0x11, 0x00, 0x91, 0x6c, 0xe2, + 0x50, 0x27, 0x1d, 0x11, 0x29, 0x06, 0x59, 0xe9, + 0x33, 0x08, 0x00, 0x20, 0x04, 0x40, 0x10, 0x00, + 0x00, 0x00, 0x50, 0x44, 0x92, 0x49, 0xd6, 0x5d, 0xa7, 0x81, 0x47, 0x97, 0xfb, 0x00, 0x10, 0x00, - 0x08, 0x00, 0x80, 0x00, 0x40, 0x45, 0x00, 0x01, - 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x04, 0x08, - 0xf8, 0xeb, 0xf6, 0x39, 0xc4, 0x89, 0x16, 0x00, + 0x08, 0x00, 0x80, 0x00, 0x40, 0x04, 0x00, 0x01, + 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x08, + 0xd8, 0xeb, 0xf6, 0x39, 0xc4, 0x89, 0x12, 0x00, // Entry 300 - 33F - 0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa2, - 0x01, 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00, - 0x04, 0x10, 0xf0, 0x9d, 0x95, 0x13, 0x04, 0x80, + 0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa0, + 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x04, 0x10, 0xd0, 0x9d, 0x95, 0x13, 0x04, 0x80, 0x00, 0x01, 0xd0, 0x12, 0x40, 0x00, 0x10, 0xb0, 0x10, 0x62, 0x4c, 0xd2, 0x02, 0x01, 0x4a, 0x00, - 0x46, 0x04, 0x00, 0x08, 0x02, 0x00, 0x20, 0xc0, + 0x46, 0x04, 0x00, 0x08, 0x02, 0x00, 0x20, 0x80, 0x00, 0x80, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xd8, 0x6f, 0x15, 0x02, 0x08, 0x00, // Entry 340 - 37F 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, - 0x00, 0x10, 0x00, 0x00, 0x00, 0xf8, 0x85, 0xe3, - 0xdd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0x7f, 0xfb, - 0xff, 0xfc, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xf6, - 0xfb, 0xfe, 0xf7, 0x1f, 0xff, 0xb3, 0xed, 0xff, - 0xdb, 0xed, 0xff, 0xfe, 0xff, 0xfe, 0xdf, 0xff, - 0xff, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xff, 0xff, - 0xfd, 0xff, 0xdf, 0xaf, 0x9c, 0xff, 0xfb, 0xff, + 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x84, 0xe3, + 0xdd, 0xbf, 0xf9, 0xf9, 0x3b, 0x7f, 0x7f, 0xdb, + 0xfd, 0xfc, 0xfe, 0xdf, 0xff, 0xfd, 0xff, 0xf6, + 0xfb, 0xfc, 0xf7, 0x1f, 0xff, 0xb3, 0x6c, 0xff, + 0xd9, 0xad, 0xdf, 0xfe, 0xef, 0xba, 0xdf, 0xff, + 0xff, 0xff, 0xb7, 0xdd, 0x7d, 0xbf, 0xab, 0x7f, + 0xfd, 0xfd, 0xdf, 0x2f, 0x9c, 0xdf, 0xf3, 0x6f, // Entry 380 - 3BF - 0xff, 0xff, 0xff, 0xff, 0xef, 0xd2, 0xbb, 0xdf, - 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, - 0xfd, 0xff, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0xff, - 0xef, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x5f, 0xd3, 0x7b, 0xfd, 0xd9, 0xdf, 0xef, - 0xbc, 0x18, 0x05, 0x2c, 0xff, 0x07, 0xf0, 0xff, - 0xf7, 0x5f, 0x00, 0x08, 0x00, 0xc3, 0x3d, 0x1b, - 0x06, 0xe6, 0x72, 0xf0, 0xdd, 0x3c, 0x7f, 0x44, + 0xdf, 0xdd, 0xff, 0xfb, 0xee, 0xd2, 0xab, 0x5f, + 0xd5, 0xdf, 0x7f, 0xff, 0xeb, 0xff, 0xe4, 0x4d, + 0xf9, 0xff, 0xfe, 0xf7, 0xfd, 0xdf, 0xfb, 0xbf, + 0xee, 0xdb, 0x6f, 0xef, 0xff, 0x7f, 0xff, 0xff, + 0xf7, 0x5f, 0xd3, 0x3b, 0xfd, 0xd9, 0xdf, 0xeb, + 0xbc, 0x08, 0x05, 0x24, 0xff, 0x07, 0x70, 0xfe, + 0xe6, 0x5e, 0x00, 0x08, 0x00, 0x83, 0x3d, 0x1b, + 0x06, 0xe6, 0x72, 0x60, 0xd1, 0x3c, 0x7f, 0x44, // Entry 3C0 - 3FF - 0x02, 0x30, 0x9f, 0x7a, 0x16, 0xfd, 0xff, 0x57, - 0xf2, 0xff, 0x39, 0xff, 0xf2, 0x1e, 0x95, 0xf7, - 0xf7, 0xff, 0x45, 0x80, 0x01, 0x02, 0x00, 0x00, + 0x02, 0x30, 0x9f, 0x7a, 0x16, 0xbd, 0x7f, 0x57, + 0xf2, 0xff, 0x31, 0xff, 0xf2, 0x1e, 0x90, 0xf7, + 0xf1, 0xf9, 0x45, 0x80, 0x01, 0x02, 0x00, 0x00, 0x40, 0x54, 0x9f, 0x8a, 0xd9, 0xd9, 0x0e, 0x11, 0x84, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x00, 0x01, 0x05, 0xd1, 0x50, 0x58, 0x00, 0x00, 0x00, 0x10, 0x04, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x17, 0xd2, - 0xf9, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb9, 0xfd, 0xfc, 0xba, 0xfe, 0xef, 0xc7, 0xbe, // Entry 400 - 43F - 0xd7, 0x6f, 0xff, 0xff, 0xdf, 0x7d, 0xbb, 0xff, - 0xff, 0xff, 0xf7, 0xf3, 0xef, 0xff, 0xff, 0xf7, - 0xff, 0xdf, 0xdb, 0x7f, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xbc, 0xff, 0xff, 0xfb, - 0xff, 0xfb, 0xff, 0xde, 0x76, 0xbd, 0xff, 0xf7, - 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xf3, 0xfe, - 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xde, - 0xf7, 0xbb, 0xef, 0xf7, 0xff, 0xfb, 0xbf, 0xdf, + 0x53, 0x6f, 0xdf, 0xe7, 0xdb, 0x65, 0xbb, 0x7f, + 0xfa, 0xff, 0x77, 0xf3, 0xef, 0xbf, 0xfd, 0xf7, + 0xdf, 0xdf, 0x9b, 0x7f, 0xff, 0xff, 0x7f, 0x6f, + 0xf7, 0xfb, 0xeb, 0xdf, 0xbc, 0xff, 0xbf, 0x6b, + 0x7b, 0xfb, 0xff, 0xce, 0x76, 0xbd, 0xf7, 0xf7, + 0xdf, 0xdc, 0xf7, 0xf7, 0xff, 0xdf, 0xf3, 0xfe, + 0xef, 0xff, 0xff, 0xff, 0xb6, 0x7f, 0x7f, 0xde, + 0xf7, 0xb9, 0xeb, 0x77, 0xff, 0xfb, 0xbf, 0xdf, // Entry 440 - 47F - 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0x5f, 0x7d, - 0x7f, 0xff, 0xff, 0xf7, 0xe5, 0xfc, 0xff, 0xfd, - 0x7f, 0x7f, 0xff, 0x9e, 0xae, 0xff, 0xee, 0xff, - 0x7f, 0xf7, 0x7b, 0x02, 0x82, 0x04, 0xff, 0xf7, - 0xff, 0xbf, 0xd7, 0xef, 0xfe, 0xdf, 0xf7, 0xfe, - 0xe2, 0x8e, 0xe7, 0xff, 0xf7, 0xff, 0x56, 0xbd, - 0xcd, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0xef, 0xff, - 0xe5, 0xdf, 0x7d, 0x0f, 0xa7, 0x51, 0x04, 0x44, + 0xfd, 0xfe, 0xfb, 0xff, 0xfe, 0xeb, 0x1f, 0x7d, + 0x2f, 0xfd, 0xb6, 0xb5, 0xa5, 0xfc, 0xff, 0xfd, + 0x7f, 0x4e, 0xbf, 0x8e, 0xae, 0xff, 0xee, 0xdf, + 0x7f, 0xf7, 0x73, 0x02, 0x02, 0x04, 0xfc, 0xf7, + 0xff, 0xb7, 0xd7, 0xef, 0xfe, 0xcd, 0xf5, 0xce, + 0xe2, 0x8e, 0xe7, 0xbf, 0xb7, 0xff, 0x56, 0xbd, + 0xcd, 0xff, 0xfb, 0xff, 0xdf, 0xd7, 0xea, 0xff, + 0xe5, 0x5f, 0x6d, 0x0f, 0xa7, 0x51, 0x04, 0x44, // Entry 480 - 4BF - 0x13, 0xd0, 0x5d, 0xaf, 0xa6, 0xfd, 0xb9, 0xff, - 0x63, 0x5d, 0x5b, 0xff, 0xff, 0xbf, 0x3f, 0x20, - 0x14, 0x00, 0x57, 0x51, 0x82, 0x65, 0xf5, 0x49, + 0x13, 0x50, 0x5d, 0xaf, 0xa6, 0xfd, 0x99, 0xfb, + 0x63, 0x1d, 0x53, 0xff, 0xef, 0xb7, 0x35, 0x20, + 0x14, 0x00, 0x55, 0x51, 0x82, 0x65, 0xf5, 0x41, 0xe2, 0xff, 0xfc, 0xdf, 0x00, 0x05, 0xc5, 0x05, 0x00, 0x22, 0x00, 0x74, 0x69, 0x10, 0x08, 0x04, 0x41, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x51, 0x60, 0x05, 0x04, 0x01, 0x00, 0x00, + 0x00, 0x51, 0x20, 0x05, 0x04, 0x01, 0x00, 0x00, 0x06, 0x01, 0x20, 0x00, 0x18, 0x01, 0x92, 0xb1, // Entry 4C0 - 4FF - 0xfd, 0x67, 0x4b, 0x06, 0x95, 0x06, 0x57, 0xed, - 0xfb, 0x4c, 0x9d, 0x7b, 0x83, 0x04, 0x62, 0x40, - 0x00, 0x15, 0x42, 0x00, 0x00, 0x00, 0x54, 0x83, - 0xf9, 0x4f, 0x10, 0x8c, 0xc9, 0x46, 0xde, 0xf7, + 0xfd, 0x47, 0x49, 0x06, 0x95, 0x06, 0x57, 0xed, + 0xfb, 0x4c, 0x1c, 0x6b, 0x83, 0x04, 0x62, 0x40, + 0x00, 0x11, 0x42, 0x00, 0x00, 0x00, 0x54, 0x83, + 0xb8, 0x4f, 0x10, 0x8c, 0x89, 0x46, 0xde, 0xf7, 0x13, 0x31, 0x00, 0x20, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00, - 0x01, 0x40, 0x00, 0xf0, 0x5b, 0xf4, 0xbe, 0x7d, + 0x01, 0x00, 0x00, 0xf0, 0x5b, 0xf4, 0xbe, 0x3d, 0xba, 0xcf, 0xf7, 0xaf, 0x42, 0x04, 0x84, 0x41, // Entry 500 - 53F - 0xb0, 0xff, 0x79, 0x7a, 0x04, 0x00, 0x00, 0x49, - 0x2d, 0x14, 0x27, 0x77, 0xed, 0xf1, 0xbf, 0xef, - 0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xfc, - 0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xf5, 0xff, - 0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7f, 0x10, + 0x30, 0xff, 0x79, 0x72, 0x04, 0x00, 0x00, 0x49, + 0x2d, 0x14, 0x27, 0x57, 0xed, 0xf1, 0x3f, 0xe7, + 0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xf8, + 0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xe5, 0xf7, + 0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7e, 0x10, 0x01, 0x01, 0x84, 0x6d, 0xff, 0xf7, 0xdd, 0xf9, - 0x5f, 0x05, 0x86, 0xef, 0xf5, 0x77, 0xbd, 0x3c, - 0x00, 0x00, 0x00, 0x43, 0x71, 0x42, 0x00, 0x40, + 0x5b, 0x05, 0x86, 0xed, 0xf5, 0x77, 0xbd, 0x3c, + 0x00, 0x00, 0x00, 0x42, 0x71, 0x42, 0x00, 0x40, // Entry 540 - 57F 0x00, 0x00, 0x01, 0x43, 0x19, 0x00, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -399,43 +460,43 @@ var langNoIndex = [2197]uint8{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xab, 0xbd, 0xe7, 0x57, 0xee, 0x13, 0x5d, 0x09, 0xc1, 0x40, 0x21, 0xfa, 0x17, 0x01, 0x80, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xde, 0xff, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xce, 0xfb, 0xbf, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x30, 0x95, 0xe3, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x04, 0x16, 0x00, 0x01, 0x02, 0x00, 0x81, + 0x00, 0x30, 0x15, 0xa3, 0x10, 0x00, 0x00, 0x00, + 0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x00, 0x81, 0xa3, 0x01, 0x50, 0x00, 0x00, 0x83, 0x11, 0x40, // Entry 5C0 - 5FF - 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x7e, 0x02, - 0xaa, 0x10, 0x5d, 0xd8, 0x52, 0x00, 0x80, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x02, 0x02, + 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x3e, 0x02, + 0xaa, 0x10, 0x5d, 0x98, 0x52, 0x00, 0x80, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x02, 0x19, 0x00, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d, - 0x31, 0x00, 0x00, 0x00, 0x01, 0x50, 0x02, 0x20, + 0x31, 0x00, 0x00, 0x00, 0x01, 0x10, 0x02, 0x20, 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x20, 0x00, - 0x00, 0x1f, 0xdf, 0xf2, 0xfd, 0xff, 0xfd, 0x3f, - 0x9f, 0x18, 0xcf, 0x9c, 0xbf, 0xaf, 0x5f, 0xfe, + 0x00, 0x1f, 0xdf, 0xd2, 0xb9, 0xff, 0xfd, 0x3f, + 0x1f, 0x18, 0xcf, 0x9c, 0xbf, 0xaf, 0x5f, 0xfe, // Entry 600 - 63F - 0x7b, 0x4b, 0x40, 0x10, 0xe1, 0xfd, 0xaf, 0xfd, - 0xb7, 0xf7, 0xff, 0xf3, 0xdf, 0xff, 0x6f, 0xf1, - 0x7b, 0xf1, 0x7f, 0xdf, 0x7f, 0xbf, 0xfe, 0xb7, - 0xee, 0x1c, 0xfb, 0xdb, 0xef, 0xdf, 0xff, 0xfd, - 0x7e, 0xbe, 0x57, 0xff, 0x6f, 0x81, 0x76, 0x1f, - 0xd4, 0x77, 0xf5, 0xfd, 0xff, 0xff, 0xeb, 0xfe, - 0xbf, 0x5f, 0x57, 0x1b, 0xeb, 0x5f, 0x50, 0x18, - 0x02, 0xfa, 0xff, 0x9d, 0x15, 0x97, 0x15, 0x0f, + 0x7b, 0x4b, 0x40, 0x10, 0xe1, 0xfd, 0xaf, 0xd9, + 0xb7, 0xf6, 0xfb, 0xb3, 0xc7, 0xff, 0x6f, 0xf1, + 0x73, 0xb1, 0x7f, 0x9f, 0x7f, 0xbd, 0xfc, 0xb7, + 0xee, 0x1c, 0xfa, 0xcb, 0xef, 0xdd, 0xf9, 0xbd, + 0x6e, 0xae, 0x55, 0xfd, 0x6e, 0x81, 0x76, 0x1f, + 0xd4, 0x77, 0xf5, 0x7d, 0xfb, 0xff, 0xeb, 0xfe, + 0xbe, 0x5f, 0x46, 0x1b, 0xe9, 0x5f, 0x50, 0x18, + 0x02, 0xfa, 0xf7, 0x9d, 0x15, 0x97, 0x05, 0x0f, // Entry 640 - 67F - 0x75, 0xc4, 0x7d, 0x81, 0x82, 0xf1, 0xd7, 0x7e, - 0xff, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xdd, 0xde, - 0xfc, 0xfd, 0xf6, 0x5f, 0x7a, 0x1f, 0x40, 0x98, - 0x02, 0xff, 0xe3, 0xff, 0xf3, 0xd6, 0xf2, 0xff, - 0xfb, 0xdf, 0x7d, 0x50, 0x1e, 0x15, 0x7b, 0xb4, - 0xf5, 0xbe, 0xff, 0xff, 0xf3, 0xf7, 0xff, 0xf7, - 0x7f, 0xff, 0xff, 0xbe, 0xdb, 0xf7, 0xd7, 0xf9, - 0xef, 0x2f, 0x80, 0xbf, 0xc5, 0xff, 0xff, 0xf3, + 0x75, 0xc4, 0x7d, 0x81, 0x82, 0xf1, 0x57, 0x6c, + 0xff, 0xe4, 0xef, 0x6f, 0xff, 0xfc, 0xdd, 0xde, + 0xfc, 0xfd, 0x76, 0x5f, 0x7a, 0x1f, 0x00, 0x98, + 0x02, 0xfb, 0xa3, 0xef, 0xf3, 0xd6, 0xf2, 0xff, + 0xb9, 0xda, 0x7d, 0x50, 0x1e, 0x15, 0x7b, 0xb4, + 0xf5, 0x3e, 0xff, 0xff, 0xf1, 0xf7, 0xff, 0xe7, + 0x5f, 0xff, 0xff, 0x9e, 0xdb, 0xf6, 0xd7, 0xb9, + 0xef, 0x27, 0x80, 0xbb, 0xc5, 0xff, 0xff, 0xe3, // Entry 680 - 6BF - 0x97, 0x9d, 0xff, 0xff, 0xf7, 0xcf, 0xfd, 0xbf, - 0xde, 0x7f, 0x06, 0x1d, 0x57, 0xff, 0xf8, 0xda, - 0x5d, 0xce, 0x7d, 0x16, 0xb9, 0xea, 0x69, 0xa0, - 0x1a, 0x20, 0x00, 0x30, 0x02, 0x04, 0x24, 0x48, + 0x97, 0x9d, 0xbf, 0x9f, 0xf7, 0xc7, 0xfd, 0x37, + 0xce, 0x7f, 0x04, 0x1d, 0x53, 0x7f, 0xf8, 0xda, + 0x5d, 0xce, 0x7d, 0x06, 0xb9, 0xea, 0x69, 0xa0, + 0x1a, 0x20, 0x00, 0x30, 0x02, 0x04, 0x24, 0x08, 0x04, 0x00, 0x00, 0x40, 0xd4, 0x02, 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x01, 0x06, 0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00, @@ -443,64 +504,64 @@ var langNoIndex = [2197]uint8{ // Entry 6C0 - 6FF 0x14, 0x4d, 0xf1, 0x16, 0x44, 0xd1, 0x42, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, - 0x00, 0xdc, 0xff, 0xeb, 0x1f, 0x58, 0x08, 0x41, - 0x04, 0xa0, 0x04, 0x00, 0x30, 0x12, 0x40, 0x22, + 0x00, 0xdc, 0xfb, 0xcb, 0x0e, 0x58, 0x08, 0x41, + 0x04, 0x20, 0x04, 0x00, 0x30, 0x12, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x80, 0x10, 0x10, 0xaf, - 0x6f, 0x93, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0x10, 0x10, 0xab, + 0x6d, 0x93, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x25, 0x00, 0x00, // Entry 700 - 73F 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x80, 0x86, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x86, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0x18, 0x00, 0x00, 0x02, 0xf0, 0xfd, 0x79, 0x3b, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x03, 0x00, 0x09, 0x20, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 740 - 77F - 0x00, 0x00, 0x00, 0xef, 0xf7, 0xfd, 0xcf, 0x7e, - 0xa0, 0x11, 0x10, 0x00, 0x00, 0x92, 0x01, 0x44, - 0xcd, 0xf9, 0x5e, 0x00, 0x01, 0x00, 0x30, 0x14, - 0x04, 0x55, 0x10, 0x01, 0x04, 0xf6, 0x3f, 0x7a, - 0x05, 0x04, 0x00, 0xb0, 0x80, 0x00, 0x55, 0x55, - 0x97, 0x7c, 0x9f, 0x71, 0xcc, 0x78, 0xd1, 0x43, - 0xf5, 0x57, 0x67, 0x14, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2c, 0xf7, 0xdb, 0x1f, 0x54, 0x60, + 0x00, 0x00, 0x00, 0xef, 0xd5, 0xfd, 0xcf, 0x7e, + 0xa0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x44, + 0xcd, 0xf9, 0x5c, 0x00, 0x01, 0x00, 0x30, 0x04, + 0x04, 0x55, 0x00, 0x01, 0x04, 0xf4, 0x3f, 0x4a, + 0x01, 0x00, 0x00, 0xb0, 0x80, 0x00, 0x55, 0x55, + 0x97, 0x7c, 0x9f, 0x31, 0xcc, 0x68, 0xd1, 0x03, + 0xd5, 0x57, 0x27, 0x14, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2c, 0xf7, 0xcb, 0x1f, 0x14, 0x60, // Entry 780 - 7BF - 0x03, 0x68, 0x01, 0x10, 0x8b, 0x38, 0xaa, 0x01, - 0x00, 0x00, 0x30, 0x00, 0x24, 0x44, 0x00, 0x00, + 0x03, 0x68, 0x01, 0x10, 0x8b, 0x38, 0x8a, 0x01, + 0x00, 0x00, 0x20, 0x00, 0x24, 0x44, 0x00, 0x00, 0x10, 0x03, 0x11, 0x02, 0x01, 0x00, 0x00, 0xf0, - 0xf5, 0xff, 0xd5, 0xd7, 0xbc, 0x70, 0xd6, 0x78, - 0x78, 0x15, 0x50, 0x00, 0xa4, 0x84, 0xe9, 0x41, + 0xf5, 0xff, 0xd5, 0x97, 0xbc, 0x70, 0xd6, 0x78, + 0x78, 0x15, 0x50, 0x00, 0xa4, 0x84, 0xa9, 0x41, 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x00, 0xe8, 0x30, 0x90, 0x6a, 0x92, 0x00, 0x00, 0x02, - 0xff, 0xef, 0xff, 0x4f, 0x85, 0x53, 0xf4, 0xed, + 0xff, 0xef, 0xff, 0x4b, 0x85, 0x53, 0xf4, 0xed, // Entry 7C0 - 7FF - 0xdd, 0xbf, 0x72, 0x19, 0xc7, 0x0c, 0xf5, 0x42, - 0x54, 0xdd, 0x77, 0x14, 0x00, 0x80, 0xc0, 0x56, - 0xcc, 0x16, 0x9e, 0xfb, 0x35, 0x7d, 0xef, 0xff, - 0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x5d, + 0xdd, 0xbf, 0x72, 0x19, 0xc7, 0x0c, 0xd5, 0x42, + 0x54, 0xdd, 0x77, 0x14, 0x00, 0x80, 0x40, 0x56, + 0xcc, 0x16, 0x9e, 0xea, 0x35, 0x7d, 0xef, 0xff, + 0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x4d, 0x4e, 0x4a, 0x08, 0x50, 0x28, 0x30, 0xe0, 0x80, - 0x10, 0x20, 0x24, 0x00, 0xff, 0x3f, 0xdf, 0x67, - 0xfe, 0x01, 0x06, 0x88, 0x0a, 0x40, 0x16, 0x01, - 0x01, 0x15, 0x2b, 0x3e, 0x01, 0x00, 0x00, 0x10, + 0x10, 0x20, 0x24, 0x00, 0xff, 0x2f, 0xd3, 0x60, + 0xfe, 0x01, 0x02, 0x88, 0x0a, 0x40, 0x16, 0x01, + 0x01, 0x15, 0x2b, 0x3c, 0x01, 0x00, 0x00, 0x10, // Entry 800 - 83F - 0x90, 0x69, 0x45, 0x02, 0x02, 0x01, 0xe1, 0xbf, - 0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa7, 0xd1, - 0x54, 0x9e, 0x44, 0xdf, 0xfd, 0x8f, 0x66, 0xb3, - 0x55, 0x20, 0xd4, 0xc3, 0xd8, 0x30, 0x3d, 0x80, - 0x00, 0x00, 0x00, 0x4c, 0xd4, 0x11, 0xc5, 0x84, - 0x6e, 0x50, 0x00, 0x22, 0x50, 0x6e, 0xbf, 0xdb, + 0x90, 0x49, 0x41, 0x02, 0x02, 0x01, 0xe1, 0xbf, + 0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa3, 0xd1, + 0x40, 0x9c, 0x44, 0xdf, 0xf5, 0x8f, 0x66, 0xb3, + 0x55, 0x20, 0xd4, 0xc1, 0xd8, 0x30, 0x3d, 0x80, + 0x00, 0x00, 0x00, 0x04, 0xd4, 0x11, 0xc5, 0x84, + 0x2e, 0x50, 0x00, 0x22, 0x50, 0x6e, 0xbd, 0x93, 0x07, 0x00, 0x20, 0x10, 0x84, 0xb2, 0x45, 0x10, 0x06, 0x44, 0x00, 0x00, 0x12, 0x02, 0x11, 0x00, // Entry 840 - 87F 0xf0, 0xfb, 0xfd, 0x3f, 0x05, 0x00, 0x12, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28, - 0x84, 0x00, 0x33, 0xc0, 0x23, 0x24, 0x00, 0x00, - 0x00, 0xcb, 0xe4, 0x3a, 0x42, 0xc8, 0x14, 0xf1, - 0xef, 0xff, 0x7f, 0x16, 0x01, 0x01, 0x84, 0x50, + 0x84, 0x00, 0x23, 0xc0, 0x23, 0x24, 0x00, 0x00, + 0x00, 0xcb, 0xe4, 0x3a, 0x42, 0x88, 0x14, 0xf1, + 0xef, 0xff, 0x7f, 0x12, 0x01, 0x01, 0x84, 0x50, 0x07, 0xfc, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x40, 0x10, 0x38, 0x01, 0x01, 0x1c, 0x12, 0x40, 0xe1, // Entry 880 - 8BF @@ -512,194 +573,196 @@ var langNoIndex = [2197]uint8{ // altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives // to 2-letter language codes that cannot be derived using the method described above. // Each 3-letter code is followed by its 1-byte langID. -var altLangISO3 tag.Index = "---\x00cor\x00hbs\x01heb\x02kin\x03spa\x04yid\x05\xff\xff\xff\xff" +const altLangISO3 tag.Index = "---\x00cor\x00hbs\x01heb\x02kin\x03spa\x04yid\x05\xff\xff\xff\xff" // altLangIndex is used to convert indexes in altLangISO3 to langIDs. // Size: 12 bytes, 6 elements var altLangIndex = [6]uint16{ - 0x014a, 0x0225, 0x0105, 0x020a, 0x009d, 0x010b, + 0x027f, 0x0405, 0x01f9, 0x03e3, 0x013d, 0x0206, } // langAliasMap maps langIDs to their suggested replacements. -// Size: 640 bytes, 160 elements -var langAliasMap = [160]fromTo{ - 0: {from: 0xc4, to: 0xda}, - 1: {from: 0xff, to: 0xf8}, - 2: {from: 0x105, to: 0xe0}, - 3: {from: 0x10b, to: 0x2b9}, - 4: {from: 0x110, to: 0x10f}, - 5: {from: 0x192, to: 0x203}, - 6: {from: 0x1af, to: 0x1c1}, - 7: {from: 0x225, to: 0x23b}, - 8: {from: 0x268, to: 0xaa}, - 9: {from: 0x274, to: 0x252}, - 10: {from: 0x27d, to: 0xd}, - 11: {from: 0x2d5, to: 0x2db}, - 12: {from: 0x326, to: 0x93}, - 13: {from: 0x3c7, to: 0x1c48}, - 14: {from: 0x3e8, to: 0x23a}, - 15: {from: 0x3f9, to: 0x23a}, - 16: {from: 0x484, to: 0x15}, - 17: {from: 0x48f, to: 0xf3}, - 18: {from: 0x4d5, to: 0x1f38}, - 19: {from: 0x54a, to: 0x23}, - 20: {from: 0x550, to: 0x2732}, - 21: {from: 0x55c, to: 0x24}, - 22: {from: 0x57d, to: 0xa1}, - 23: {from: 0x5a3, to: 0x26}, - 24: {from: 0x5ac, to: 0x42}, - 25: {from: 0x615, to: 0x5a7}, - 26: {from: 0x65a, to: 0xc7a}, - 27: {from: 0x786, to: 0x1a5}, - 28: {from: 0x7cd, to: 0x16e}, - 29: {from: 0x7d4, to: 0x59}, - 30: {from: 0x855, to: 0x30b9}, - 31: {from: 0x8cf, to: 0x2c4}, - 32: {from: 0x90c, to: 0x23f1}, - 33: {from: 0x915, to: 0x95a}, - 34: {from: 0x932, to: 0x24f}, - 35: {from: 0x953, to: 0x3fc0}, - 36: {from: 0x956, to: 0x2c4}, - 37: {from: 0x995, to: 0x2b3e}, - 38: {from: 0x9c5, to: 0x2f18}, - 39: {from: 0xa50, to: 0x73}, - 40: {from: 0xa9f, to: 0x79}, - 41: {from: 0xb5f, to: 0x8a}, - 42: {from: 0xb6e, to: 0x1a2}, - 43: {from: 0xb8f, to: 0xb92}, - 44: {from: 0xb95, to: 0x2c8}, - 45: {from: 0xc76, to: 0x1df1}, - 46: {from: 0xc85, to: 0x2c31}, - 47: {from: 0xcd0, to: 0x1bd}, - 48: {from: 0xe67, to: 0x9f}, - 49: {from: 0xe9b, to: 0x179}, - 50: {from: 0xf37, to: 0xfc}, - 51: {from: 0x1010, to: 0xd}, - 52: {from: 0x11bb, to: 0xaf}, - 53: {from: 0x1207, to: 0xa6}, - 54: {from: 0x12b6, to: 0xb32}, - 55: {from: 0x12ba, to: 0x1d2}, - 56: {from: 0x12c9, to: 0x145c}, - 57: {from: 0x1317, to: 0x111}, - 58: {from: 0x131a, to: 0x85}, - 59: {from: 0x133a, to: 0x3a46}, - 60: {from: 0x1401, to: 0xcc}, - 61: {from: 0x145f, to: 0x9a}, - 62: {from: 0x1497, to: 0x278f}, - 63: {from: 0x14af, to: 0xca}, - 64: {from: 0x14be, to: 0xcd6}, - 65: {from: 0x1511, to: 0x12bb}, - 66: {from: 0x15a0, to: 0x154d}, - 67: {from: 0x15ad, to: 0x168a}, - 68: {from: 0x1621, to: 0x23f}, - 69: {from: 0x1710, to: 0x1a98}, - 70: {from: 0x180b, to: 0x2947}, - 71: {from: 0x1821, to: 0x102}, - 72: {from: 0x18f1, to: 0x104}, - 73: {from: 0x191d, to: 0x12ac}, - 74: {from: 0x1dcf, to: 0x3548}, - 75: {from: 0x1dd4, to: 0x1e74}, - 76: {from: 0x1df1, to: 0x18f}, - 77: {from: 0x1e7a, to: 0x145}, - 78: {from: 0x1e85, to: 0x13b}, - 79: {from: 0x1e89, to: 0x122}, - 80: {from: 0x1e90, to: 0x138}, - 81: {from: 0x1ea6, to: 0x1f82}, - 82: {from: 0x1ecc, to: 0x147}, - 83: {from: 0x1f30, to: 0x8d}, - 84: {from: 0x1f65, to: 0x12f8}, - 85: {from: 0x1f7d, to: 0x4235}, - 86: {from: 0x1f8b, to: 0x371a}, - 87: {from: 0x1fc4, to: 0x8d}, - 88: {from: 0x1fce, to: 0x8d}, - 89: {from: 0x1ff9, to: 0x6c1}, - 90: {from: 0x20ad, to: 0x2fbd}, - 91: {from: 0x2119, to: 0x30fc}, - 92: {from: 0x2209, to: 0x170}, - 93: {from: 0x227b, to: 0x18c}, - 94: {from: 0x2287, to: 0x189}, - 95: {from: 0x2291, to: 0x19a}, - 96: {from: 0x22e7, to: 0x8f2}, - 97: {from: 0x2340, to: 0x69}, - 98: {from: 0x23d5, to: 0x179}, - 99: {from: 0x2460, to: 0x244b}, - 100: {from: 0x2490, to: 0x1f4}, - 101: {from: 0x24be, to: 0x3a46}, - 102: {from: 0x24fc, to: 0x244b}, - 103: {from: 0x2520, to: 0x40ef}, - 104: {from: 0x2686, to: 0x25ce}, - 105: {from: 0x26ab, to: 0x1b4}, - 106: {from: 0x271d, to: 0x2b3e}, - 107: {from: 0x28b1, to: 0x1d1}, - 108: {from: 0x2993, to: 0x1d3}, - 109: {from: 0x29d6, to: 0x3a46}, - 110: {from: 0x2a93, to: 0x1ee}, - 111: {from: 0x2aaa, to: 0x32e}, - 112: {from: 0x2ade, to: 0xa4}, - 113: {from: 0x2adf, to: 0xa4}, - 114: {from: 0x2b96, to: 0x183}, - 115: {from: 0x2b9f, to: 0x1763}, - 116: {from: 0x2bb1, to: 0x2b2c}, - 117: {from: 0x2bb8, to: 0x152}, - 118: {from: 0x2beb, to: 0x37}, - 119: {from: 0x2bfc, to: 0x2019}, - 120: {from: 0x2c37, to: 0x2c32}, - 121: {from: 0x2c86, to: 0x2c6e}, - 122: {from: 0x2f2a, to: 0x1f1}, - 123: {from: 0x30fd, to: 0x3125}, - 124: {from: 0x31c1, to: 0x203}, - 125: {from: 0x3285, to: 0x1667}, - 126: {from: 0x337d, to: 0x22a}, - 127: {from: 0x33ef, to: 0x132}, - 128: {from: 0x340d, to: 0x215}, - 129: {from: 0x3494, to: 0x248}, - 130: {from: 0x3557, to: 0x8d}, - 131: {from: 0x35ad, to: 0x3689}, - 132: {from: 0x35c2, to: 0x2a32}, - 133: {from: 0x35c6, to: 0x4c}, - 134: {from: 0x35c9, to: 0x2fbf}, - 135: {from: 0x3603, to: 0x373d}, - 136: {from: 0x3629, to: 0x3d57}, - 137: {from: 0x363c, to: 0x376e}, - 138: {from: 0x364b, to: 0x1d3b}, - 139: {from: 0x364c, to: 0x2c31}, - 140: {from: 0x36f3, to: 0x26a}, - 141: {from: 0x38e5, to: 0xb28}, - 142: {from: 0x390f, to: 0xe91}, - 143: {from: 0x3a30, to: 0x28d}, - 144: {from: 0x3d54, to: 0x7f}, - 145: {from: 0x3f9f, to: 0x828}, - 146: {from: 0x4055, to: 0x30a}, - 147: {from: 0x4090, to: 0x3cf7}, - 148: {from: 0x410f, to: 0x13a}, - 149: {from: 0x4162, to: 0x3462}, - 150: {from: 0x4164, to: 0x86}, - 151: {from: 0x4246, to: 0x30b9}, - 152: {from: 0x427a, to: 0x2b9}, - 153: {from: 0x4361, to: 0x21a0}, - 154: {from: 0x4374, to: 0x2473}, - 155: {from: 0x43a7, to: 0x4645}, - 156: {from: 0x4445, to: 0x4437}, - 157: {from: 0x44d5, to: 0x44dc}, - 158: {from: 0x46ad, to: 0x19a}, - 159: {from: 0x473e, to: 0x2be}, +// Size: 644 bytes, 161 elements +var langAliasMap = [161]fromTo{ + 0: {from: 0x82, to: 0x88}, + 1: {from: 0x185, to: 0x1ac}, + 2: {from: 0x1f1, to: 0x1df}, + 3: {from: 0x1f9, to: 0x1ba}, + 4: {from: 0x206, to: 0x510}, + 5: {from: 0x20d, to: 0x20c}, + 6: {from: 0x30e, to: 0x3da}, + 7: {from: 0x345, to: 0x36d}, + 8: {from: 0x405, to: 0x430}, + 9: {from: 0x478, to: 0x152}, + 10: {from: 0x48e, to: 0x44f}, + 11: {from: 0x4a0, to: 0x21}, + 12: {from: 0x53b, to: 0x541}, + 13: {from: 0x58c, to: 0x12c}, + 14: {from: 0x62d, to: 0x1eae}, + 15: {from: 0x64e, to: 0x42f}, + 16: {from: 0x65f, to: 0x42f}, + 17: {from: 0x6ea, to: 0x3a}, + 18: {from: 0x6f5, to: 0x1d5}, + 19: {from: 0x73b, to: 0x219e}, + 20: {from: 0x7b0, to: 0x56}, + 21: {from: 0x7b6, to: 0x2998}, + 22: {from: 0x7c2, to: 0x58}, + 23: {from: 0x7e3, to: 0x144}, + 24: {from: 0x809, to: 0x5a}, + 25: {from: 0x812, to: 0x8d}, + 26: {from: 0x87b, to: 0x80d}, + 27: {from: 0x8c0, to: 0xee0}, + 28: {from: 0x9ec, to: 0x32f}, + 29: {from: 0xa33, to: 0x2c3}, + 30: {from: 0xa3a, to: 0xbf}, + 31: {from: 0xabb, to: 0x331f}, + 32: {from: 0xb35, to: 0x527}, + 33: {from: 0xb72, to: 0x2657}, + 34: {from: 0xb7b, to: 0xbc0}, + 35: {from: 0xb98, to: 0x44c}, + 36: {from: 0xbb9, to: 0x4226}, + 37: {from: 0xbbc, to: 0x527}, + 38: {from: 0xbfb, to: 0x2da4}, + 39: {from: 0xc2b, to: 0x317e}, + 40: {from: 0xcb6, to: 0xf2}, + 41: {from: 0xd05, to: 0xf9}, + 42: {from: 0xdc5, to: 0x119}, + 43: {from: 0xdd4, to: 0x32b}, + 44: {from: 0xdf5, to: 0xdf8}, + 45: {from: 0xdfb, to: 0x52e}, + 46: {from: 0xedc, to: 0x2057}, + 47: {from: 0xeeb, to: 0x2e97}, + 48: {from: 0xf36, to: 0x365}, + 49: {from: 0x10cd, to: 0x13f}, + 50: {from: 0x1101, to: 0x2ce}, + 51: {from: 0x119d, to: 0x1ea}, + 52: {from: 0x1276, to: 0x21}, + 53: {from: 0x1421, to: 0x15d}, + 54: {from: 0x146d, to: 0x14d}, + 55: {from: 0x151c, to: 0xd98}, + 56: {from: 0x1520, to: 0x38e}, + 57: {from: 0x152f, to: 0x19d}, + 58: {from: 0x157d, to: 0x20e}, + 59: {from: 0x1580, to: 0x10c}, + 60: {from: 0x15a0, to: 0x3cac}, + 61: {from: 0x1667, to: 0x199}, + 62: {from: 0x16c5, to: 0x135}, + 63: {from: 0x16fd, to: 0x29f5}, + 64: {from: 0x1715, to: 0x192}, + 65: {from: 0x1724, to: 0xf3c}, + 66: {from: 0x1777, to: 0x1521}, + 67: {from: 0x1806, to: 0x17b3}, + 68: {from: 0x1813, to: 0x18f0}, + 69: {from: 0x1887, to: 0x434}, + 70: {from: 0x1976, to: 0x1cfe}, + 71: {from: 0x1a71, to: 0x2bad}, + 72: {from: 0x1a87, to: 0x1f6}, + 73: {from: 0x1b57, to: 0x1f8}, + 74: {from: 0x1b83, to: 0x1512}, + 75: {from: 0x2035, to: 0x37ae}, + 76: {from: 0x203a, to: 0x20da}, + 77: {from: 0x2057, to: 0x309}, + 78: {from: 0x20e0, to: 0x272}, + 79: {from: 0x20eb, to: 0x261}, + 80: {from: 0x20ef, to: 0x22b}, + 81: {from: 0x20f6, to: 0x254}, + 82: {from: 0x210c, to: 0x21e8}, + 83: {from: 0x2132, to: 0x27b}, + 84: {from: 0x2196, to: 0x120}, + 85: {from: 0x21cb, to: 0x155e}, + 86: {from: 0x21e3, to: 0x502}, + 87: {from: 0x21f1, to: 0x49d}, + 88: {from: 0x222a, to: 0x120}, + 89: {from: 0x2234, to: 0x120}, + 90: {from: 0x225f, to: 0x927}, + 91: {from: 0x2313, to: 0x3223}, + 92: {from: 0x237f, to: 0x3362}, + 93: {from: 0x246f, to: 0x2c5}, + 94: {from: 0x24e1, to: 0x2fd}, + 95: {from: 0x24ed, to: 0x2f8}, + 96: {from: 0x24f7, to: 0x31d}, + 97: {from: 0x254d, to: 0xb58}, + 98: {from: 0x25a6, to: 0xe2}, + 99: {from: 0x263b, to: 0x2ce}, + 100: {from: 0x26c6, to: 0x26b1}, + 101: {from: 0x26f6, to: 0x3c6}, + 102: {from: 0x2724, to: 0x3cac}, + 103: {from: 0x2762, to: 0x26b1}, + 104: {from: 0x2786, to: 0x4355}, + 105: {from: 0x28ec, to: 0x2834}, + 106: {from: 0x2911, to: 0x34f}, + 107: {from: 0x2983, to: 0x2da4}, + 108: {from: 0x2b17, to: 0x38b}, + 109: {from: 0x2bf9, to: 0x393}, + 110: {from: 0x2c3c, to: 0x3cac}, + 111: {from: 0x2cf9, to: 0x3bc}, + 112: {from: 0x2d10, to: 0x594}, + 113: {from: 0x2d44, to: 0x147}, + 114: {from: 0x2d45, to: 0x147}, + 115: {from: 0x2dfc, to: 0x2ef}, + 116: {from: 0x2e05, to: 0x19c9}, + 117: {from: 0x2e17, to: 0x2d92}, + 118: {from: 0x2e1e, to: 0x290}, + 119: {from: 0x2e51, to: 0x7d}, + 120: {from: 0x2e62, to: 0x227f}, + 121: {from: 0x2e9d, to: 0x2e98}, + 122: {from: 0x2eec, to: 0x2ed4}, + 123: {from: 0x3190, to: 0x3c2}, + 124: {from: 0x3363, to: 0x338b}, + 125: {from: 0x3427, to: 0x3da}, + 126: {from: 0x34eb, to: 0x18cd}, + 127: {from: 0x35e3, to: 0x410}, + 128: {from: 0x3655, to: 0x244}, + 129: {from: 0x3673, to: 0x3f2}, + 130: {from: 0x36fa, to: 0x443}, + 131: {from: 0x37bd, to: 0x120}, + 132: {from: 0x3813, to: 0x38ef}, + 133: {from: 0x3828, to: 0x2c98}, + 134: {from: 0x382c, to: 0xa9}, + 135: {from: 0x382f, to: 0x3225}, + 136: {from: 0x3869, to: 0x39a3}, + 137: {from: 0x388f, to: 0x3fbd}, + 138: {from: 0x38a2, to: 0x39d4}, + 139: {from: 0x38b1, to: 0x1fa1}, + 140: {from: 0x38b2, to: 0x2e97}, + 141: {from: 0x3959, to: 0x47c}, + 142: {from: 0x3b4b, to: 0xd8e}, + 143: {from: 0x3b75, to: 0x136}, + 144: {from: 0x3c96, to: 0x4ba}, + 145: {from: 0x3fba, to: 0xff}, + 146: {from: 0x4205, to: 0xa8e}, + 147: {from: 0x42bb, to: 0x570}, + 148: {from: 0x42f6, to: 0x3f5d}, + 149: {from: 0x4375, to: 0x258}, + 150: {from: 0x43c8, to: 0x36c8}, + 151: {from: 0x43ca, to: 0x10e}, + 152: {from: 0x44ac, to: 0x331f}, + 153: {from: 0x44e0, to: 0x510}, + 154: {from: 0x45c7, to: 0x2406}, + 155: {from: 0x45da, to: 0x26d9}, + 156: {from: 0x460d, to: 0x48ab}, + 157: {from: 0x46ab, to: 0x469d}, + 158: {from: 0x473b, to: 0x4742}, + 159: {from: 0x4913, to: 0x31d}, + 160: {from: 0x49a4, to: 0x521}, } -// Size: 160 bytes, 160 elements -var langAliasTypes = [160]langAliasType{ +// Size: 161 bytes, 161 elements +var langAliasTypes = [161]langAliasType{ // Entry 0 - 3F - 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2, 1, - 1, 2, 0, 1, 0, 1, 2, 1, 1, 0, 0, 2, 1, 1, 0, 2, - 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 1, 1, 0, 0, 2, - 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 2, 0, 1, 2, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2, + 1, 1, 2, 0, 1, 0, 1, 2, 1, 1, 0, 0, 2, 1, 1, 0, + 2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 1, 1, 0, 0, + 2, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 2, 0, 1, 2, 0, // Entry 40 - 7F - 0, 1, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 1, 1, 1, 1, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 2, 2, - 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, - 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2, 1, + 1, 0, 1, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 1, 1, 1, + 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 2, + 2, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, + 0, 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2, // Entry 80 - BF - 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, - 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 1, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, + 1, } const ( @@ -717,7 +780,7 @@ const ( // script is an alphabetically sorted list of ISO 15924 codes. The index // of the script in the string, divided by 4, is the internal scriptID. -var script tag.Index = "" + // Size: 928 bytes +const script tag.Index = "" + // Size: 928 bytes "----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopo" + "BrahBraiBugiBuhdCakmCansCariChamCherCirtCoptCprtCyrlCyrsDevaDsrtDuplEgyd" + "EgyhEgypElbaEthiGeokGeorGlagGothGranGrekGujrGuruHanbHangHaniHanoHansHant" + @@ -735,110 +798,195 @@ var script tag.Index = "" + // Size: 928 bytes // suppressScript is an index from langID to the dominant script for that language, // if it exists. If a script is given, it should be suppressed from the language tag. -// Size: 713 bytes, 713 elements -var suppressScript = [713]uint8{ +// Size: 1327 bytes, 1327 elements +var suppressScript = [1327]uint8{ // Entry 0 - 3F - 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x27, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 40 - 7F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 40 - 7F 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, // Entry 80 - BF - 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - 0xd4, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2d, 0x52, 0x52, 0x52, 0x00, 0x52, - 0x00, 0x52, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x52, - 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry C0 - FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x2e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x37, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, - 0x00, 0x52, 0x52, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - // Entry 100 - 13F - 0x00, 0x00, 0x52, 0x52, 0x00, 0x37, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, - 0x00, 0x52, 0x00, 0x46, 0x00, 0x4a, 0x4b, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 140 - 17F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + // Entry 100 - 13F + 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, + // Entry 140 - 17F + 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, + 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 180 - 1BF - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x1e, 0x64, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x52, 0x00, 0x52, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x52, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x37, 0x00, 0x20, 0x00, 0x00, 0x00, // Entry 1C0 - 1FF - 0x00, 0x52, 0x00, 0x00, 0x00, 0x70, 0x52, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x75, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x52, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x52, 0x52, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, + 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, // Entry 200 - 23F - 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x1e, - 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc1, 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 240 - 27F - 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x1e, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, + 0x00, 0x00, 0x4b, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 280 - 2BF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x4f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + // Entry 2C0 - 2FF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + // Entry 300 - 33F + 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, + // Entry 340 - 37F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xd0, 0x52, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, - 0x00, 0x27, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x52, 0x00, 0x52, 0x52, 0x52, 0x00, 0x52, 0x52, + // Entry 380 - 3BF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x52, 0x00, + // Entry 3C0 - 3FF 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, - // Entry 280 - 2BF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 400 - 43F + 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 440 - 47F + 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, + 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd5, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, + // Entry 480 - 4BF + 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, + // Entry 4C0 - 4FF 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 2C0 - 2FF - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 500 - 53F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, } const ( @@ -847,15 +995,15 @@ const ( _BR = 64 _CA = 72 _ES = 109 - _GB = 121 - _MD = 186 - _PT = 236 - _UK = 304 - _US = 306 - _ZZ = 354 - _XA = 320 - _XC = 322 - _XK = 330 + _GB = 122 + _MD = 187 + _PT = 237 + _UK = 305 + _US = 308 + _ZZ = 356 + _XA = 322 + _XC = 324 + _XK = 332 ) // isoRegionOffset needs to be added to the index of regionISO to obtain the regionID @@ -864,8 +1012,8 @@ const ( const isoRegionOffset = 31 // regionTypes defines the status of a region for various standards. -// Size: 355 bytes, 355 elements -var regionTypes = [355]uint8{ +// Size: 357 bytes, 357 elements +var regionTypes = [357]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -882,41 +1030,41 @@ var regionTypes = [355]uint8{ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry 80 - BF 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, - // Entry C0 - FF 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + // Entry C0 - FF + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, - 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, - 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, - 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, + 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, // Entry 100 - 13F - 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x05, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, + 0x06, 0x02, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry 140 - 17F + 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, - 0x04, 0x06, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x05, } // regionISO holds a list of alphabetically sorted 2-letter ISO region codes. @@ -924,68 +1072,68 @@ var regionTypes = [355]uint8{ // - [A-Z}{2}: the first letter of the 2-letter code plus these two // letters form the 3-letter ISO code. // - 0, n: index into altRegionISO3. -var regionISO tag.Index = "" + // Size: 1300 bytes +const regionISO tag.Index = "" + // Size: 1308 bytes "AAAAACSCADNDAEREAFFGAGTGAIIAALLBAMRMANNTAOGOAQTAARRGASSMATUTAUUSAWBWAXLA" + "AZZEBAIHBBRBBDGDBEELBFFABGGRBHHRBIDIBJENBLLMBMMUBNRNBOOLBQESBRRABSHSBTTN" + "BUURBVVTBWWABYLRBZLZCAANCCCKCDODCFAFCGOGCHHECIIVCKOKCLHLCMMRCNHNCOOLCPPT" + "CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADOOMDY" + - "HYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03FIINFJJIFKLKFMSMFOROFQ" + - "\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQNQGRRC" + - "GS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERLILSRIM" + - "MNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM\x00\x09" + - "KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSOLTTULUUX" + - "LVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNPMQTQMRRT" + - "MSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLDNOORNPPL" + - "NQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM\x00\x12" + - "PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSSQTTTQU" + - "\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLBSCYCSD" + - "DNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXMSYYRSZ" + - "WZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTTTOTVUV" + - "TWWNTZZAUAKRUGGAUK UMMIUSSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVNNMVUUTWFLF" + - "WKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXNNNXOOOXPPP" + - "XQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUGZAAFZMMBZR" + - "ARZWWEZZZZ\xff\xff\xff\xff" + "HYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03EZ FIINFJJIFKLKFMSMFORO" + + "FQ\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQNQGR" + + "RCGS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERLILSR" + + "IMMNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM\x00" + + "\x09KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSOLTTU" + + "LUUXLVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNPMQTQ" + + "MRRTMSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLDNOOR" + + "NPPLNQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM\x00" + + "\x12PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSSQTTT" + + "QU\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLBSCYC" + + "SDDNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXMSYYR" + + "SZWZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTTTOTV" + + "UVTWWNTZZAUAKRUGGAUK UMMIUN USSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVNNMVU" + + "UTWFLFWKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXNNNXO" + + "OOXPPPXQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUGZAAF" + + "ZMMBZRARZWWEZZZZ\xff\xff\xff\xff" // altRegionISO3 holds a list of 3-letter region codes that cannot be // mapped to 2-letter codes using the default algorithm. This is a short list. -var altRegionISO3 string = "SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN" +const altRegionISO3 string = "SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN" // altRegionIDs holds a list of regionIDs the positions of which match those // of the 3-letter ISO codes in altRegionISO3. // Size: 22 bytes, 11 elements var altRegionIDs = [11]uint16{ - 0x0056, 0x006f, 0x0086, 0x00a6, 0x00a8, 0x00ab, 0x00e8, 0x0103, - 0x011f, 0x015c, 0x00da, + 0x0056, 0x006f, 0x0087, 0x00a7, 0x00a9, 0x00ac, 0x00e9, 0x0104, + 0x0120, 0x015e, 0x00db, } // Size: 80 bytes, 20 elements var regionOldMap = [20]fromTo{ - 0: {from: 0x43, to: 0xc2}, - 1: {from: 0x57, to: 0xa5}, + 0: {from: 0x43, to: 0xc3}, + 1: {from: 0x57, to: 0xa6}, 2: {from: 0x5e, to: 0x5f}, 3: {from: 0x65, to: 0x3a}, - 4: {from: 0x77, to: 0x76}, - 5: {from: 0x91, to: 0x36}, - 6: {from: 0xa1, to: 0x131}, - 7: {from: 0xbf, to: 0x131}, - 8: {from: 0xd5, to: 0x13c}, - 9: {from: 0xda, to: 0x2a}, - 10: {from: 0xed, to: 0x131}, - 11: {from: 0xf0, to: 0xe0}, - 12: {from: 0xfa, to: 0x6f}, - 13: {from: 0x101, to: 0x161}, - 14: {from: 0x128, to: 0x124}, - 15: {from: 0x130, to: 0x79}, - 16: {from: 0x137, to: 0x13b}, - 17: {from: 0x13e, to: 0x131}, - 18: {from: 0x15a, to: 0x15b}, - 19: {from: 0x160, to: 0x4a}, + 4: {from: 0x78, to: 0x77}, + 5: {from: 0x92, to: 0x36}, + 6: {from: 0xa2, to: 0x132}, + 7: {from: 0xc0, to: 0x132}, + 8: {from: 0xd6, to: 0x13e}, + 9: {from: 0xdb, to: 0x2a}, + 10: {from: 0xee, to: 0x132}, + 11: {from: 0xf1, to: 0xe1}, + 12: {from: 0xfb, to: 0x6f}, + 13: {from: 0x102, to: 0x163}, + 14: {from: 0x129, to: 0x125}, + 15: {from: 0x131, to: 0x7a}, + 16: {from: 0x139, to: 0x13d}, + 17: {from: 0x140, to: 0x132}, + 18: {from: 0x15c, to: 0x15d}, + 19: {from: 0x162, to: 0x4a}, } // m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are // codes indicating collections of regions. -// Size: 710 bytes, 355 elements -var m49 = [355]int16{ +// Size: 714 bytes, 357 elements +var m49 = [357]int16{ // Entry 0 - 3F 0, 1, 2, 3, 5, 9, 11, 13, 14, 15, 17, 18, 19, 21, 29, 30, @@ -1002,41 +1150,41 @@ var m49 = [355]int16{ 192, 132, 531, 162, 196, 203, 278, 276, 0, 262, 208, 212, 214, 204, 12, 0, 218, 233, 818, 732, 232, 724, 231, 967, - 246, 242, 238, 583, 234, 0, 250, 249, - 266, 826, 308, 268, 254, 831, 288, 292, + 0, 246, 242, 238, 583, 234, 0, 250, + 249, 266, 826, 308, 268, 254, 831, 288, // Entry 80 - BF - 304, 270, 324, 312, 226, 300, 239, 320, - 316, 624, 328, 344, 334, 340, 191, 332, - 348, 854, 0, 360, 372, 376, 833, 356, - 86, 368, 364, 352, 380, 832, 388, 400, - 392, 581, 404, 417, 116, 296, 174, 659, - 408, 410, 414, 136, 398, 418, 422, 662, - 438, 144, 430, 426, 440, 442, 428, 434, - 504, 492, 498, 499, 663, 450, 584, 581, + 292, 304, 270, 324, 312, 226, 300, 239, + 320, 316, 624, 328, 344, 334, 340, 191, + 332, 348, 854, 0, 360, 372, 376, 833, + 356, 86, 368, 364, 352, 380, 832, 388, + 400, 392, 581, 404, 417, 116, 296, 174, + 659, 408, 410, 414, 136, 398, 418, 422, + 662, 438, 144, 430, 426, 440, 442, 428, + 434, 504, 492, 498, 499, 663, 450, 584, // Entry C0 - FF - 807, 466, 104, 496, 446, 580, 474, 478, - 500, 470, 480, 462, 454, 484, 458, 508, - 516, 540, 562, 574, 566, 548, 558, 528, - 578, 524, 10, 520, 536, 570, 554, 512, - 591, 0, 604, 258, 598, 608, 586, 616, - 666, 612, 630, 275, 620, 581, 585, 600, - 591, 634, 959, 960, 961, 962, 963, 964, - 965, 966, 967, 968, 969, 970, 971, 972, + 581, 807, 466, 104, 496, 446, 580, 474, + 478, 500, 470, 480, 462, 454, 484, 458, + 508, 516, 540, 562, 574, 566, 548, 558, + 528, 578, 524, 10, 520, 536, 570, 554, + 512, 591, 0, 604, 258, 598, 608, 586, + 616, 666, 612, 630, 275, 620, 581, 585, + 600, 591, 634, 959, 960, 961, 962, 963, + 964, 965, 966, 967, 968, 969, 970, 971, // Entry 100 - 13F - 638, 716, 642, 688, 643, 646, 682, 90, - 690, 729, 752, 702, 654, 705, 744, 703, - 694, 674, 686, 706, 740, 728, 678, 810, - 222, 534, 760, 748, 0, 796, 148, 260, - 768, 764, 762, 772, 626, 795, 788, 776, - 626, 792, 780, 798, 158, 834, 804, 800, - 826, 581, 840, 858, 860, 336, 670, 704, - 862, 92, 850, 704, 548, 876, 581, 882, + 972, 638, 716, 642, 688, 643, 646, 682, + 90, 690, 729, 752, 702, 654, 705, 744, + 703, 694, 674, 686, 706, 740, 728, 678, + 810, 222, 534, 760, 748, 0, 796, 148, + 260, 768, 764, 762, 772, 626, 795, 788, + 776, 626, 792, 780, 798, 158, 834, 804, + 800, 826, 581, 0, 840, 858, 860, 336, + 670, 704, 862, 92, 850, 704, 548, 876, // Entry 140 - 17F - 973, 974, 975, 976, 977, 978, 979, 980, - 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 720, 887, 175, 891, 710, 894, - 180, 716, 999, + 581, 882, 973, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 984, 985, 986, + 987, 988, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 720, 887, 175, 891, + 710, 894, 180, 716, 999, } // m49Index gives indexes into fromM49 based on the three most significant bits @@ -1060,50 +1208,50 @@ var fromM49 = [332]uint16{ 0x402b, 0x4410, 0x4611, 0x482e, 0x4e12, 0x502d, 0x5841, 0x6038, 0x6434, 0x6627, 0x6833, 0x6a13, 0x6c14, 0x7035, 0x7215, 0x783c, 0x7a16, 0x8042, 0x883e, 0x8c32, 0x9045, 0x9444, 0x9840, 0xa847, - 0xac98, 0xb507, 0xb939, 0xc03d, 0xc837, 0xd0c2, 0xd839, 0xe046, - 0xe8a4, 0xf051, 0xf848, 0x0859, 0x10ab, 0x184b, 0x1c17, 0x1e18, + 0xac99, 0xb508, 0xb93b, 0xc03d, 0xc837, 0xd0c3, 0xd839, 0xe046, + 0xe8a5, 0xf051, 0xf848, 0x0859, 0x10ac, 0x184b, 0x1c17, 0x1e18, // Entry 40 - 7F - 0x20b1, 0x2219, 0x291e, 0x2c1a, 0x2e1b, 0x3050, 0x341c, 0x361d, - 0x3852, 0x3d2c, 0x445b, 0x4c49, 0x5453, 0x5ca6, 0x5f5c, 0x644c, - 0x684a, 0x704f, 0x7855, 0x7e8e, 0x8058, 0x885c, 0x965d, 0x983a, - 0xa062, 0xa863, 0xac64, 0xb468, 0xbd18, 0xc484, 0xcc6e, 0xce6e, - 0xd06c, 0xd269, 0xd474, 0xdc72, 0xde86, 0xe471, 0xec70, 0xf030, - 0xf277, 0xf476, 0xfc7c, 0x04e3, 0x091f, 0x0c61, 0x1478, 0x187b, - 0x1c81, 0x26eb, 0x285f, 0x2c5e, 0x305f, 0x407e, 0x487f, 0x50a5, - 0x5885, 0x6080, 0x687a, 0x7083, 0x7888, 0x8087, 0x8882, 0x908a, + 0x20b2, 0x2219, 0x291f, 0x2c1a, 0x2e1b, 0x3050, 0x341c, 0x361d, + 0x3852, 0x3d2d, 0x445b, 0x4c49, 0x5453, 0x5ca7, 0x5f5e, 0x644c, + 0x684a, 0x704f, 0x7855, 0x7e8f, 0x8058, 0x885c, 0x965d, 0x983a, + 0xa062, 0xa863, 0xac64, 0xb468, 0xbd19, 0xc485, 0xcc6e, 0xce6e, + 0xd06c, 0xd269, 0xd475, 0xdc73, 0xde87, 0xe472, 0xec71, 0xf030, + 0xf278, 0xf477, 0xfc7d, 0x04e4, 0x0920, 0x0c61, 0x1479, 0x187c, + 0x1c82, 0x26ec, 0x285f, 0x2c5e, 0x305f, 0x407f, 0x4880, 0x50a6, + 0x5886, 0x6081, 0x687b, 0x7084, 0x7889, 0x8088, 0x8883, 0x908b, // Entry 80 - BF - 0x988f, 0x9c8c, 0xa135, 0xa88d, 0xb08b, 0xb890, 0xc09b, 0xc897, - 0xd093, 0xd89a, 0xe099, 0xe894, 0xf095, 0xf89c, 0x004e, 0x089e, - 0x10a0, 0x1cac, 0x209f, 0x28a2, 0x30a8, 0x34a9, 0x3caa, 0x42a3, - 0x44ad, 0x461e, 0x4cae, 0x54b3, 0x58b6, 0x5cb2, 0x64b7, 0x6cb0, - 0x70b4, 0x74b5, 0x7cc4, 0x84bd, 0x8ccc, 0x94ce, 0x9ccb, 0xa4c1, - 0xacc9, 0xb4c6, 0xbcc7, 0xc0ca, 0xc8cd, 0xd8b9, 0xe0c3, 0xe4ba, - 0xe6bb, 0xe8c8, 0xf0b8, 0xf8cf, 0x00df, 0x08d0, 0x10db, 0x18d9, - 0x20d7, 0x2428, 0x265a, 0x2a2f, 0x2d19, 0x2e3f, 0x30dc, 0x38d1, + 0x9890, 0x9c8d, 0xa137, 0xa88e, 0xb08c, 0xb891, 0xc09c, 0xc898, + 0xd094, 0xd89b, 0xe09a, 0xe895, 0xf096, 0xf89d, 0x004e, 0x089f, + 0x10a1, 0x1cad, 0x20a0, 0x28a3, 0x30a9, 0x34aa, 0x3cab, 0x42a4, + 0x44ae, 0x461e, 0x4caf, 0x54b4, 0x58b7, 0x5cb3, 0x64b8, 0x6cb1, + 0x70b5, 0x74b6, 0x7cc5, 0x84be, 0x8ccd, 0x94cf, 0x9ccc, 0xa4c2, + 0xacca, 0xb4c7, 0xbcc8, 0xc0cb, 0xc8ce, 0xd8ba, 0xe0c4, 0xe4bb, + 0xe6bc, 0xe8c9, 0xf0b9, 0xf8d0, 0x00e0, 0x08d1, 0x10dc, 0x18da, + 0x20d8, 0x2428, 0x265a, 0x2a2f, 0x2d1a, 0x2e3f, 0x30dd, 0x38d2, // Entry C0 - FF - 0x493c, 0x54de, 0x5cd6, 0x64d2, 0x6cd4, 0x74dd, 0x7cd3, 0x84d8, - 0x88c5, 0x8b31, 0x8e73, 0x90be, 0x92ee, 0x94e6, 0x9ee0, 0xace4, - 0xb0ef, 0xb8e2, 0xc0e5, 0xc8e9, 0xd0e7, 0xd8ec, 0xe089, 0xe524, - 0xecea, 0xf4f1, 0xfd00, 0x0502, 0x0704, 0x0d05, 0x183b, 0x1d0c, - 0x26a7, 0x2825, 0x2caf, 0x2ebc, 0x34e8, 0x3d36, 0x4511, 0x4d16, - 0x5506, 0x5d12, 0x6103, 0x6508, 0x6d10, 0x7d0b, 0x7f0f, 0x813b, - 0x830d, 0x8513, 0x8d5e, 0x9961, 0xa15a, 0xa86d, 0xb115, 0xb309, - 0xb86b, 0xc109, 0xc914, 0xd10e, 0xd91b, 0xe10a, 0xe84d, 0xf11a, + 0x493e, 0x54df, 0x5cd7, 0x64d3, 0x6cd5, 0x74de, 0x7cd4, 0x84d9, + 0x88c6, 0x8b32, 0x8e74, 0x90bf, 0x92ef, 0x94e7, 0x9ee1, 0xace5, + 0xb0f0, 0xb8e3, 0xc0e6, 0xc8ea, 0xd0e8, 0xd8ed, 0xe08a, 0xe525, + 0xeceb, 0xf4f2, 0xfd01, 0x0503, 0x0705, 0x0d06, 0x183b, 0x1d0d, + 0x26a8, 0x2825, 0x2cb0, 0x2ebd, 0x34e9, 0x3d38, 0x4512, 0x4d17, + 0x5507, 0x5d13, 0x6104, 0x6509, 0x6d11, 0x7d0c, 0x7f10, 0x813d, + 0x830e, 0x8514, 0x8d60, 0x9963, 0xa15c, 0xa86d, 0xb116, 0xb30a, + 0xb86b, 0xc10a, 0xc915, 0xd10f, 0xd91c, 0xe10b, 0xe84d, 0xf11b, // Entry 100 - 13F - 0xf522, 0xf921, 0x0120, 0x0923, 0x1127, 0x192a, 0x2022, 0x2926, - 0x3129, 0x3725, 0x391d, 0x3d2b, 0x412f, 0x492e, 0x4ec0, 0x5517, - 0x646a, 0x7479, 0x7e7d, 0x809d, 0x8296, 0x852d, 0x9132, 0xa53a, - 0xac36, 0xb533, 0xb934, 0xbd38, 0xd93d, 0xe53f, 0xed5b, 0xef5b, - 0xf656, 0xfd5f, 0x7c1f, 0x7ef2, 0x80f3, 0x82f4, 0x84f5, 0x86f6, - 0x88f7, 0x8af8, 0x8cf9, 0x8e6f, 0x90fb, 0x92fc, 0x94fd, 0x96fe, - 0x98ff, 0x9b40, 0x9d41, 0x9f42, 0xa143, 0xa344, 0xa545, 0xa746, - 0xa947, 0xab48, 0xad49, 0xaf4a, 0xb14b, 0xb34c, 0xb54d, 0xb74e, + 0xf523, 0xf922, 0x0121, 0x0924, 0x1128, 0x192b, 0x2022, 0x2927, + 0x312a, 0x3726, 0x391e, 0x3d2c, 0x4130, 0x492f, 0x4ec1, 0x5518, + 0x646a, 0x747a, 0x7e7e, 0x809e, 0x8297, 0x852e, 0x9134, 0xa53c, + 0xac36, 0xb535, 0xb936, 0xbd3a, 0xd93f, 0xe541, 0xed5d, 0xef5d, + 0xf656, 0xfd61, 0x7c1f, 0x7ef3, 0x80f4, 0x82f5, 0x84f6, 0x86f7, + 0x88f8, 0x8af9, 0x8cfa, 0x8e6f, 0x90fc, 0x92fd, 0x94fe, 0x96ff, + 0x9900, 0x9b42, 0x9d43, 0x9f44, 0xa145, 0xa346, 0xa547, 0xa748, + 0xa949, 0xab4a, 0xad4b, 0xaf4c, 0xb14d, 0xb34e, 0xb54f, 0xb750, // Entry 140 - 17F - 0xb94f, 0xbb50, 0xbd51, 0xbf52, 0xc153, 0xc354, 0xc555, 0xc756, - 0xc957, 0xcb58, 0xcd59, 0xcf62, + 0xb951, 0xbb52, 0xbd53, 0xbf54, 0xc155, 0xc356, 0xc557, 0xc758, + 0xc959, 0xcb5a, 0xcd5b, 0xcf64, } -// Size: 1444 bytes +// Size: 1463 bytes var variantIndex = map[string]uint8{ "1606nict": 0x0, "1694acad": 0x1, @@ -1132,8 +1280,9 @@ var variantIndex = map[string]uint8{ "ekavsk": 0x15, "emodeng": 0x16, "fonipa": 0x48, - "fonupa": 0x49, - "fonxsamp": 0x4a, + "fonnapa": 0x49, + "fonupa": 0x4a, + "fonxsamp": 0x4b, "hepburn": 0x17, "heploc": 0x46, "hognorsk": 0x18, @@ -1166,7 +1315,7 @@ var variantIndex = map[string]uint8{ "rumgr": 0x30, "scotland": 0x31, "scouse": 0x32, - "simple": 0x4b, + "simple": 0x4c, "solba": 0x44, "sotav": 0x33, "surmiran": 0x34, @@ -1198,145 +1347,145 @@ type likelyLangRegion struct { // languages and regions given a script. // Size: 928 bytes, 232 elements var likelyScript = [232]likelyLangRegion{ - 1: {lang: 0xa6, region: 0x82}, - 3: {lang: 0x159, region: 0x104}, - 4: {lang: 0xc, region: 0x97}, - 5: {lang: 0x15, region: 0x6a}, - 7: {lang: 0x16, region: 0x9a}, - 8: {lang: 0xf3, region: 0x27}, - 9: {lang: 0x8, region: 0x9a}, - 10: {lang: 0x27, region: 0x93}, - 11: {lang: 0x2b, region: 0x51}, - 12: {lang: 0x55, region: 0xb2}, - 13: {lang: 0x2c, region: 0x93}, - 14: {lang: 0x4b, region: 0x34}, - 15: {lang: 0x20d, region: 0x97}, - 17: {lang: 0x2c4, region: 0x12c}, - 18: {lang: 0x1e5, region: 0x97}, - 19: {lang: 0xaf, region: 0x76}, - 20: {lang: 0x5b, region: 0x93}, - 21: {lang: 0x47, region: 0xe5}, - 22: {lang: 0x63, region: 0x34}, - 23: {lang: 0x73, region: 0x48}, - 24: {lang: 0x2a8, region: 0x129}, - 25: {lang: 0x6e, region: 0x13b}, - 26: {lang: 0x6c, region: 0x132}, - 28: {lang: 0x71, region: 0x6a}, - 29: {lang: 0xd0, region: 0x5c}, - 30: {lang: 0x207, region: 0x104}, - 32: {lang: 0xe1, region: 0x97}, - 34: {lang: 0xaf, region: 0x76}, - 37: {lang: 0x98, region: 0x6a}, - 38: {lang: 0x23a, region: 0x26}, - 39: {lang: 0x11, region: 0x6e}, - 41: {lang: 0x111, region: 0x7b}, - 42: {lang: 0x7d, region: 0x37}, - 43: {lang: 0xcf, region: 0x12e}, - 44: {lang: 0x20d, region: 0x97}, - 45: {lang: 0x9a, region: 0x85}, - 46: {lang: 0xd3, region: 0x97}, - 47: {lang: 0x1d7, region: 0x97}, - 48: {lang: 0x2c4, region: 0x12c}, - 49: {lang: 0x136, region: 0xa9}, - 50: {lang: 0x2c4, region: 0x52}, - 51: {lang: 0xe9, region: 0xe5}, - 52: {lang: 0x2c4, region: 0x52}, - 53: {lang: 0x2c4, region: 0x12c}, - 54: {lang: 0x18b, region: 0x99}, - 55: {lang: 0xe0, region: 0x95}, - 56: {lang: 0x107, region: 0xa0}, - 57: {lang: 0xe4, region: 0x129}, - 58: {lang: 0xe8, region: 0xad}, - 60: {lang: 0xf2, region: 0x90}, - 62: {lang: 0xa0, region: 0x9c}, - 63: {lang: 0x136, region: 0xa9}, - 64: {lang: 0x10f, region: 0x93}, - 65: {lang: 0x107, region: 0xa0}, - 67: {lang: 0x99, region: 0xc2}, - 68: {lang: 0x107, region: 0xa0}, - 69: {lang: 0x1eb, region: 0xe6}, - 70: {lang: 0x133, region: 0xa4}, - 71: {lang: 0x21a, region: 0x97}, - 74: {lang: 0x135, region: 0x97}, - 75: {lang: 0x136, region: 0xa9}, - 77: {lang: 0x40, region: 0x97}, - 78: {lang: 0x1c2, region: 0x121}, - 79: {lang: 0x165, region: 0xad}, - 84: {lang: 0x158, region: 0x97}, - 85: {lang: 0x15c, region: 0x97}, - 86: {lang: 0x14f, region: 0x85}, - 87: {lang: 0xd0, region: 0x85}, - 88: {lang: 0x15e, region: 0x52}, - 90: {lang: 0x2aa, region: 0x129}, - 91: {lang: 0x2ab, region: 0x129}, - 92: {lang: 0xe1, region: 0x97}, - 93: {lang: 0x1a8, region: 0x9a}, - 94: {lang: 0x2ad, region: 0x52}, - 95: {lang: 0x4c, region: 0x52}, - 97: {lang: 0x17f, region: 0x110}, - 98: {lang: 0x2ae, region: 0x109}, - 99: {lang: 0x2ae, region: 0x109}, - 100: {lang: 0x18d, region: 0x97}, - 101: {lang: 0x196, region: 0x97}, - 102: {lang: 0x18f, region: 0x52}, - 104: {lang: 0x199, region: 0x34}, - 105: {lang: 0x190, region: 0x97}, - 106: {lang: 0x22b, region: 0xe6}, - 107: {lang: 0x1a5, region: 0xc2}, - 108: {lang: 0x2af, region: 0x106}, - 109: {lang: 0x16, region: 0x9f}, - 110: {lang: 0x1b5, region: 0xd9}, - 112: {lang: 0x179, region: 0x82}, - 114: {lang: 0x223, region: 0x94}, - 115: {lang: 0x212, region: 0x97}, - 116: {lang: 0x1d6, region: 0xc3}, - 117: {lang: 0x1d3, region: 0x97}, - 118: {lang: 0x1d5, region: 0x132}, - 119: {lang: 0x238, region: 0x113}, - 120: {lang: 0x16, region: 0x11a}, - 121: {lang: 0x7c, region: 0xc2}, - 122: {lang: 0x147, region: 0x104}, - 123: {lang: 0x172, region: 0x52}, - 124: {lang: 0x1d9, region: 0x9a}, - 125: {lang: 0x1d9, region: 0x52}, - 127: {lang: 0x1e3, region: 0xae}, - 129: {lang: 0xe5, region: 0x52}, - 130: {lang: 0x2b2, region: 0x9a}, - 181: {lang: 0x1f6, region: 0x93}, - 183: {lang: 0x1c4, region: 0x10a}, - 184: {lang: 0x234, region: 0x95}, - 186: {lang: 0x2b3, region: 0x15b}, - 187: {lang: 0x213, region: 0x97}, - 188: {lang: 0x1e, region: 0x132}, - 189: {lang: 0x9b, region: 0x79}, - 190: {lang: 0x20d, region: 0x97}, - 191: {lang: 0x20d, region: 0x97}, - 192: {lang: 0x21a, region: 0x97}, - 193: {lang: 0x228, region: 0xb1}, - 194: {lang: 0x23c, region: 0x97}, - 195: {lang: 0x244, region: 0x93}, - 196: {lang: 0x24e, region: 0x34}, - 197: {lang: 0x24f, region: 0x99}, - 201: {lang: 0x253, region: 0xe5}, - 202: {lang: 0x8a, region: 0x97}, - 203: {lang: 0x255, region: 0x52}, - 204: {lang: 0x126, region: 0x52}, - 205: {lang: 0x251, region: 0x97}, - 206: {lang: 0x27f, region: 0x52}, - 207: {lang: 0x48, region: 0x13b}, - 208: {lang: 0x258, region: 0x97}, - 210: {lang: 0x2c3, region: 0xb8}, - 211: {lang: 0xaa, region: 0xe5}, - 212: {lang: 0x90, region: 0xcb}, - 213: {lang: 0x25d, region: 0x121}, - 214: {lang: 0x4c, region: 0x52}, - 215: {lang: 0x177, region: 0x97}, - 216: {lang: 0x285, region: 0x11a}, - 217: {lang: 0x28e, region: 0xb2}, - 219: {lang: 0xec, region: 0x97}, - 221: {lang: 0x1e1, region: 0x9a}, - 222: {lang: 0xe, region: 0x99}, - 223: {lang: 0xfb, region: 0x52}, + 1: {lang: 0x14d, region: 0x83}, + 3: {lang: 0x2a0, region: 0x105}, + 4: {lang: 0x1f, region: 0x98}, + 5: {lang: 0x3a, region: 0x6a}, + 7: {lang: 0x3b, region: 0x9b}, + 8: {lang: 0x1d5, region: 0x27}, + 9: {lang: 0x13, region: 0x9b}, + 10: {lang: 0x5b, region: 0x94}, + 11: {lang: 0x60, region: 0x51}, + 12: {lang: 0xb9, region: 0xb3}, + 13: {lang: 0x63, region: 0x94}, + 14: {lang: 0xa5, region: 0x34}, + 15: {lang: 0x3e7, region: 0x98}, + 17: {lang: 0x527, region: 0x12d}, + 18: {lang: 0x3af, region: 0x98}, + 19: {lang: 0x15d, region: 0x77}, + 20: {lang: 0xc2, region: 0x94}, + 21: {lang: 0x9d, region: 0xe6}, + 22: {lang: 0xdb, region: 0x34}, + 23: {lang: 0xf2, region: 0x48}, + 24: {lang: 0x4ee, region: 0x12a}, + 25: {lang: 0xe7, region: 0x13d}, + 26: {lang: 0xe5, region: 0x134}, + 28: {lang: 0xf0, region: 0x6a}, + 29: {lang: 0x19e, region: 0x5c}, + 30: {lang: 0x3e0, region: 0x105}, + 32: {lang: 0x1bc, region: 0x98}, + 34: {lang: 0x15d, region: 0x77}, + 37: {lang: 0x132, region: 0x6a}, + 38: {lang: 0x42f, region: 0x26}, + 39: {lang: 0x27, region: 0x6e}, + 41: {lang: 0x20e, region: 0x7c}, + 42: {lang: 0xfd, region: 0x37}, + 43: {lang: 0x19c, region: 0x12f}, + 44: {lang: 0x3e7, region: 0x98}, + 45: {lang: 0x135, region: 0x86}, + 46: {lang: 0x1a2, region: 0x98}, + 47: {lang: 0x39b, region: 0x98}, + 48: {lang: 0x527, region: 0x12d}, + 49: {lang: 0x252, region: 0xaa}, + 50: {lang: 0x527, region: 0x52}, + 51: {lang: 0x1c9, region: 0xe6}, + 52: {lang: 0x527, region: 0x52}, + 53: {lang: 0x527, region: 0x12d}, + 54: {lang: 0x2fb, region: 0x9a}, + 55: {lang: 0x1ba, region: 0x96}, + 56: {lang: 0x1fe, region: 0xa1}, + 57: {lang: 0x1c3, region: 0x12a}, + 58: {lang: 0x1c8, region: 0xae}, + 60: {lang: 0x1d3, region: 0x91}, + 62: {lang: 0x141, region: 0x9d}, + 63: {lang: 0x252, region: 0xaa}, + 64: {lang: 0x20c, region: 0x94}, + 65: {lang: 0x1fe, region: 0xa1}, + 67: {lang: 0x134, region: 0xc3}, + 68: {lang: 0x1fe, region: 0xa1}, + 69: {lang: 0x3b9, region: 0xe7}, + 70: {lang: 0x248, region: 0xa5}, + 71: {lang: 0x3f8, region: 0x98}, + 74: {lang: 0x24f, region: 0x98}, + 75: {lang: 0x252, region: 0xaa}, + 77: {lang: 0x88, region: 0x98}, + 78: {lang: 0x36e, region: 0x122}, + 79: {lang: 0x2b6, region: 0xae}, + 84: {lang: 0x29d, region: 0x98}, + 85: {lang: 0x2a6, region: 0x98}, + 86: {lang: 0x28d, region: 0x86}, + 87: {lang: 0x19e, region: 0x86}, + 88: {lang: 0x2aa, region: 0x52}, + 90: {lang: 0x4f2, region: 0x12a}, + 91: {lang: 0x4f3, region: 0x12a}, + 92: {lang: 0x1bc, region: 0x98}, + 93: {lang: 0x335, region: 0x9b}, + 94: {lang: 0x4f5, region: 0x52}, + 95: {lang: 0xa9, region: 0x52}, + 97: {lang: 0x2e6, region: 0x111}, + 98: {lang: 0x4f6, region: 0x10a}, + 99: {lang: 0x4f6, region: 0x10a}, + 100: {lang: 0x302, region: 0x98}, + 101: {lang: 0x319, region: 0x98}, + 102: {lang: 0x309, region: 0x52}, + 104: {lang: 0x31c, region: 0x34}, + 105: {lang: 0x30c, region: 0x98}, + 106: {lang: 0x412, region: 0xe7}, + 107: {lang: 0x32f, region: 0xc3}, + 108: {lang: 0x4f7, region: 0x107}, + 109: {lang: 0x3b, region: 0xa0}, + 110: {lang: 0x351, region: 0xda}, + 112: {lang: 0x2ce, region: 0x83}, + 114: {lang: 0x401, region: 0x95}, + 115: {lang: 0x3ec, region: 0x98}, + 116: {lang: 0x399, region: 0xc4}, + 117: {lang: 0x393, region: 0x98}, + 118: {lang: 0x397, region: 0x134}, + 119: {lang: 0x427, region: 0x114}, + 120: {lang: 0x3b, region: 0x11b}, + 121: {lang: 0xfc, region: 0xc3}, + 122: {lang: 0x27b, region: 0x105}, + 123: {lang: 0x2c7, region: 0x52}, + 124: {lang: 0x39d, region: 0x9b}, + 125: {lang: 0x39d, region: 0x52}, + 127: {lang: 0x3ab, region: 0xaf}, + 129: {lang: 0x1c4, region: 0x52}, + 130: {lang: 0x4fb, region: 0x9b}, + 181: {lang: 0x3c9, region: 0x94}, + 183: {lang: 0x370, region: 0x10b}, + 184: {lang: 0x41e, region: 0x96}, + 186: {lang: 0x4fd, region: 0x15d}, + 187: {lang: 0x3ee, region: 0x98}, + 188: {lang: 0x45, region: 0x134}, + 189: {lang: 0x138, region: 0x7a}, + 190: {lang: 0x3e7, region: 0x98}, + 191: {lang: 0x3e7, region: 0x98}, + 192: {lang: 0x3f8, region: 0x98}, + 193: {lang: 0x40a, region: 0xb2}, + 194: {lang: 0x431, region: 0x98}, + 195: {lang: 0x43c, region: 0x94}, + 196: {lang: 0x44b, region: 0x34}, + 197: {lang: 0x44c, region: 0x9a}, + 201: {lang: 0x458, region: 0xe6}, + 202: {lang: 0x119, region: 0x98}, + 203: {lang: 0x45c, region: 0x52}, + 204: {lang: 0x230, region: 0x52}, + 205: {lang: 0x44e, region: 0x98}, + 206: {lang: 0x4a3, region: 0x52}, + 207: {lang: 0x9f, region: 0x13d}, + 208: {lang: 0x45f, region: 0x98}, + 210: {lang: 0x526, region: 0xb9}, + 211: {lang: 0x152, region: 0xe6}, + 212: {lang: 0x127, region: 0xcc}, + 213: {lang: 0x469, region: 0x122}, + 214: {lang: 0xa9, region: 0x52}, + 215: {lang: 0x2cc, region: 0x98}, + 216: {lang: 0x4ab, region: 0x11b}, + 217: {lang: 0x4bc, region: 0xb3}, + 219: {lang: 0x1cc, region: 0x98}, + 221: {lang: 0x3a7, region: 0x9b}, + 222: {lang: 0x22, region: 0x9a}, + 223: {lang: 0x1e8, region: 0x52}, } type likelyScriptRegion struct { @@ -1349,807 +1498,1419 @@ type likelyScriptRegion struct { // scripts and regions given incomplete information. If more entries exist for a // given language, region and script are the index and size respectively // of the list in likelyLangList. -// Size: 2852 bytes, 713 elements -var likelyLang = [713]likelyScriptRegion{ - 0: {region: 0x132, script: 0x52, flags: 0x0}, - 1: {region: 0x6e, script: 0x52, flags: 0x0}, - 2: {region: 0x7b, script: 0x1e, flags: 0x0}, - 3: {region: 0x7e, script: 0x52, flags: 0x0}, - 4: {region: 0x93, script: 0x52, flags: 0x0}, - 5: {region: 0x12f, script: 0x52, flags: 0x0}, - 6: {region: 0x7e, script: 0x52, flags: 0x0}, - 7: {region: 0x104, script: 0x1e, flags: 0x0}, - 8: {region: 0x9a, script: 0x9, flags: 0x0}, - 9: {region: 0x126, script: 0x5, flags: 0x0}, - 10: {region: 0x15e, script: 0x52, flags: 0x0}, - 11: {region: 0x51, script: 0x52, flags: 0x0}, - 12: {region: 0x97, script: 0x4, flags: 0x0}, - 13: {region: 0x7e, script: 0x52, flags: 0x0}, - 14: {region: 0x99, script: 0xde, flags: 0x0}, - 15: {region: 0x14a, script: 0x52, flags: 0x0}, - 16: {region: 0x104, script: 0x1e, flags: 0x0}, - 17: {region: 0x6e, script: 0x27, flags: 0x0}, - 18: {region: 0xd4, script: 0x52, flags: 0x0}, - 20: {region: 0x93, script: 0x52, flags: 0x0}, - 21: {region: 0x6a, script: 0x5, flags: 0x0}, - 22: {region: 0x0, script: 0x3, flags: 0x1}, - 23: {region: 0x50, script: 0x52, flags: 0x0}, - 24: {region: 0x3e, script: 0x52, flags: 0x0}, - 25: {region: 0x66, script: 0x5, flags: 0x0}, - 26: {region: 0xb8, script: 0x5, flags: 0x0}, - 27: {region: 0x6a, script: 0x5, flags: 0x0}, - 28: {region: 0x97, script: 0xe, flags: 0x0}, - 29: {region: 0x12d, script: 0x52, flags: 0x0}, - 30: {region: 0x132, script: 0xbc, flags: 0x0}, - 31: {region: 0x6d, script: 0x52, flags: 0x0}, - 32: {region: 0x48, script: 0x52, flags: 0x0}, - 33: {region: 0x104, script: 0x1e, flags: 0x0}, - 34: {region: 0x97, script: 0x20, flags: 0x0}, - 35: {region: 0x3e, script: 0x52, flags: 0x0}, - 36: {region: 0x3, script: 0x5, flags: 0x1}, - 37: {region: 0x104, script: 0x1e, flags: 0x0}, - 38: {region: 0xe6, script: 0x5, flags: 0x0}, - 39: {region: 0x93, script: 0x52, flags: 0x0}, - 40: {region: 0xd9, script: 0x20, flags: 0x0}, - 41: {region: 0x2d, script: 0x52, flags: 0x0}, - 42: {region: 0x51, script: 0x52, flags: 0x0}, - 43: {region: 0x51, script: 0xb, flags: 0x0}, - 44: {region: 0x93, script: 0x52, flags: 0x0}, - 45: {region: 0x51, script: 0x52, flags: 0x0}, - 46: {region: 0x4e, script: 0x52, flags: 0x0}, - 47: {region: 0x46, script: 0x1e, flags: 0x0}, - 48: {region: 0x109, script: 0x5, flags: 0x0}, - 49: {region: 0x15f, script: 0x52, flags: 0x0}, - 50: {region: 0x93, script: 0x52, flags: 0x0}, - 51: {region: 0x12d, script: 0x52, flags: 0x0}, - 52: {region: 0x51, script: 0x52, flags: 0x0}, - 53: {region: 0x97, script: 0xcd, flags: 0x0}, - 54: {region: 0xe6, script: 0x5, flags: 0x0}, - 55: {region: 0x97, script: 0x20, flags: 0x0}, - 56: {region: 0x37, script: 0x1e, flags: 0x0}, - 57: {region: 0x97, script: 0x20, flags: 0x0}, - 58: {region: 0xe6, script: 0x5, flags: 0x0}, - 59: {region: 0x129, script: 0x2d, flags: 0x0}, - 61: {region: 0x97, script: 0x20, flags: 0x0}, - 62: {region: 0x97, script: 0x20, flags: 0x0}, - 63: {region: 0xe5, script: 0x52, flags: 0x0}, - 64: {region: 0x97, script: 0x20, flags: 0x0}, - 65: {region: 0x13c, script: 0x52, flags: 0x0}, - 66: {region: 0xe5, script: 0x52, flags: 0x0}, - 67: {region: 0xd4, script: 0x52, flags: 0x0}, - 68: {region: 0x97, script: 0x20, flags: 0x0}, - 69: {region: 0x93, script: 0x52, flags: 0x0}, - 70: {region: 0x51, script: 0x52, flags: 0x0}, - 71: {region: 0xe5, script: 0x52, flags: 0x0}, - 72: {region: 0x13b, script: 0xcf, flags: 0x0}, - 73: {region: 0xc1, script: 0x52, flags: 0x0}, - 74: {region: 0xc1, script: 0x52, flags: 0x0}, - 75: {region: 0x34, script: 0xe, flags: 0x0}, - 76: {region: 0x52, script: 0xd6, flags: 0x0}, - 77: {region: 0x97, script: 0xe, flags: 0x0}, - 78: {region: 0x9a, script: 0x5, flags: 0x0}, - 79: {region: 0x4e, script: 0x52, flags: 0x0}, - 80: {region: 0x76, script: 0x52, flags: 0x0}, - 81: {region: 0x97, script: 0x20, flags: 0x0}, - 82: {region: 0xe6, script: 0x5, flags: 0x0}, - 83: {region: 0x97, script: 0x20, flags: 0x0}, - 84: {region: 0x32, script: 0x52, flags: 0x0}, - 85: {region: 0xb2, script: 0xc, flags: 0x0}, - 86: {region: 0x51, script: 0x52, flags: 0x0}, - 87: {region: 0xe5, script: 0x52, flags: 0x0}, - 88: {region: 0xe6, script: 0x20, flags: 0x0}, - 89: {region: 0x104, script: 0x1e, flags: 0x0}, - 90: {region: 0x15c, script: 0x52, flags: 0x0}, - 91: {region: 0x93, script: 0x52, flags: 0x0}, - 92: {region: 0x51, script: 0x52, flags: 0x0}, - 93: {region: 0x84, script: 0x52, flags: 0x0}, - 94: {region: 0x6c, script: 0x27, flags: 0x0}, - 95: {region: 0x51, script: 0x52, flags: 0x0}, - 96: {region: 0xc1, script: 0x52, flags: 0x0}, - 97: {region: 0x6d, script: 0x52, flags: 0x0}, - 98: {region: 0xd4, script: 0x52, flags: 0x0}, - 99: {region: 0x8, script: 0x2, flags: 0x1}, - 100: {region: 0x104, script: 0x1e, flags: 0x0}, - 101: {region: 0xe5, script: 0x52, flags: 0x0}, - 102: {region: 0x12f, script: 0x52, flags: 0x0}, - 103: {region: 0x88, script: 0x52, flags: 0x0}, - 104: {region: 0x73, script: 0x52, flags: 0x0}, - 105: {region: 0x104, script: 0x1e, flags: 0x0}, - 106: {region: 0x132, script: 0x52, flags: 0x0}, - 107: {region: 0x48, script: 0x52, flags: 0x0}, - 108: {region: 0x132, script: 0x1a, flags: 0x0}, - 109: {region: 0xa4, script: 0x5, flags: 0x0}, - 110: {region: 0x13b, script: 0x19, flags: 0x0}, - 111: {region: 0x99, script: 0x5, flags: 0x0}, - 112: {region: 0x76, script: 0x52, flags: 0x0}, - 113: {region: 0x6a, script: 0x1c, flags: 0x0}, - 114: {region: 0xe5, script: 0x52, flags: 0x0}, - 115: {region: 0x48, script: 0x17, flags: 0x0}, - 116: {region: 0x48, script: 0x17, flags: 0x0}, - 117: {region: 0x48, script: 0x17, flags: 0x0}, - 118: {region: 0x48, script: 0x17, flags: 0x0}, - 119: {region: 0x48, script: 0x17, flags: 0x0}, - 120: {region: 0x108, script: 0x52, flags: 0x0}, - 121: {region: 0x5d, script: 0x52, flags: 0x0}, - 122: {region: 0xe7, script: 0x52, flags: 0x0}, - 123: {region: 0x48, script: 0x17, flags: 0x0}, - 124: {region: 0xc2, script: 0x79, flags: 0x0}, - 125: {region: 0xa, script: 0x2, flags: 0x1}, - 126: {region: 0x104, script: 0x1e, flags: 0x0}, - 127: {region: 0x79, script: 0x52, flags: 0x0}, - 128: {region: 0x62, script: 0x52, flags: 0x0}, - 129: {region: 0x132, script: 0x52, flags: 0x0}, - 130: {region: 0x104, script: 0x1e, flags: 0x0}, - 131: {region: 0xa2, script: 0x52, flags: 0x0}, - 132: {region: 0x97, script: 0x5, flags: 0x0}, - 133: {region: 0x5f, script: 0x52, flags: 0x0}, - 134: {region: 0x48, script: 0x52, flags: 0x0}, - 135: {region: 0x48, script: 0x52, flags: 0x0}, - 136: {region: 0xd2, script: 0x52, flags: 0x0}, - 137: {region: 0x4e, script: 0x52, flags: 0x0}, - 138: {region: 0x97, script: 0x5, flags: 0x0}, - 139: {region: 0x5f, script: 0x52, flags: 0x0}, - 140: {region: 0xc1, script: 0x52, flags: 0x0}, - 141: {region: 0xce, script: 0x52, flags: 0x0}, - 142: {region: 0xd9, script: 0x20, flags: 0x0}, - 143: {region: 0x51, script: 0x52, flags: 0x0}, - 144: {region: 0xcb, script: 0xd4, flags: 0x0}, - 145: {region: 0x112, script: 0x52, flags: 0x0}, - 146: {region: 0x36, script: 0x52, flags: 0x0}, - 147: {region: 0x42, script: 0xd6, flags: 0x0}, - 148: {region: 0xa2, script: 0x52, flags: 0x0}, - 149: {region: 0x7e, script: 0x52, flags: 0x0}, - 150: {region: 0xd4, script: 0x52, flags: 0x0}, - 151: {region: 0x9c, script: 0x52, flags: 0x0}, - 152: {region: 0x6a, script: 0x25, flags: 0x0}, - 153: {region: 0xc2, script: 0x43, flags: 0x0}, - 154: {region: 0x85, script: 0x2d, flags: 0x0}, - 155: {region: 0xc, script: 0x2, flags: 0x1}, - 156: {region: 0x1, script: 0x52, flags: 0x0}, - 157: {region: 0x6d, script: 0x52, flags: 0x0}, - 158: {region: 0x132, script: 0x52, flags: 0x0}, - 159: {region: 0x69, script: 0x52, flags: 0x0}, - 160: {region: 0x9c, script: 0x3e, flags: 0x0}, - 161: {region: 0x6d, script: 0x52, flags: 0x0}, - 162: {region: 0x51, script: 0x52, flags: 0x0}, - 163: {region: 0x6d, script: 0x52, flags: 0x0}, - 164: {region: 0x9a, script: 0x5, flags: 0x0}, - 165: {region: 0x84, script: 0x52, flags: 0x0}, - 166: {region: 0xe, script: 0x2, flags: 0x1}, - 167: {region: 0xc1, script: 0x52, flags: 0x0}, - 168: {region: 0x70, script: 0x52, flags: 0x0}, - 169: {region: 0x109, script: 0x5, flags: 0x0}, - 170: {region: 0xe5, script: 0x52, flags: 0x0}, - 171: {region: 0x10a, script: 0x52, flags: 0x0}, - 172: {region: 0x71, script: 0x52, flags: 0x0}, - 173: {region: 0x74, script: 0x52, flags: 0x0}, - 174: {region: 0x3a, script: 0x52, flags: 0x0}, - 175: {region: 0x76, script: 0x52, flags: 0x0}, - 176: {region: 0x132, script: 0x52, flags: 0x0}, - 177: {region: 0x76, script: 0x52, flags: 0x0}, - 178: {region: 0x5f, script: 0x52, flags: 0x0}, - 179: {region: 0x5f, script: 0x52, flags: 0x0}, - 180: {region: 0x13d, script: 0x52, flags: 0x0}, - 181: {region: 0xd2, script: 0x52, flags: 0x0}, - 182: {region: 0x9c, script: 0x52, flags: 0x0}, - 183: {region: 0xd4, script: 0x52, flags: 0x0}, - 184: {region: 0x109, script: 0x52, flags: 0x0}, - 185: {region: 0xd7, script: 0x52, flags: 0x0}, - 186: {region: 0x94, script: 0x52, flags: 0x0}, - 187: {region: 0x7e, script: 0x52, flags: 0x0}, - 188: {region: 0xba, script: 0x52, flags: 0x0}, - 189: {region: 0x52, script: 0x34, flags: 0x0}, - 190: {region: 0x93, script: 0x52, flags: 0x0}, - 191: {region: 0x97, script: 0x20, flags: 0x0}, - 192: {region: 0x9a, script: 0x5, flags: 0x0}, - 193: {region: 0x7c, script: 0x52, flags: 0x0}, - 194: {region: 0x79, script: 0x52, flags: 0x0}, - 195: {region: 0x6e, script: 0x27, flags: 0x0}, - 196: {region: 0xd9, script: 0x20, flags: 0x0}, - 197: {region: 0xa5, script: 0x52, flags: 0x0}, - 198: {region: 0xe6, script: 0x5, flags: 0x0}, - 199: {region: 0xe6, script: 0x5, flags: 0x0}, - 200: {region: 0x6d, script: 0x52, flags: 0x0}, - 201: {region: 0x9a, script: 0x5, flags: 0x0}, - 202: {region: 0xef, script: 0x52, flags: 0x0}, - 203: {region: 0x97, script: 0x20, flags: 0x0}, - 204: {region: 0x97, script: 0xd0, flags: 0x0}, - 205: {region: 0x93, script: 0x52, flags: 0x0}, - 206: {region: 0xd7, script: 0x52, flags: 0x0}, - 207: {region: 0x12e, script: 0x2b, flags: 0x0}, - 208: {region: 0x10, script: 0x2, flags: 0x1}, - 209: {region: 0x97, script: 0xe, flags: 0x0}, - 210: {region: 0x4d, script: 0x52, flags: 0x0}, - 211: {region: 0x97, script: 0x2e, flags: 0x0}, - 212: {region: 0x40, script: 0x52, flags: 0x0}, - 213: {region: 0x53, script: 0x52, flags: 0x0}, - 214: {region: 0x7e, script: 0x52, flags: 0x0}, - 216: {region: 0xa2, script: 0x52, flags: 0x0}, - 217: {region: 0x96, script: 0x52, flags: 0x0}, - 218: {region: 0xd9, script: 0x20, flags: 0x0}, - 219: {region: 0x48, script: 0x52, flags: 0x0}, - 220: {region: 0x12, script: 0x3, flags: 0x1}, - 221: {region: 0x52, script: 0x34, flags: 0x0}, - 222: {region: 0x132, script: 0x52, flags: 0x0}, - 223: {region: 0x23, script: 0x5, flags: 0x0}, - 224: {region: 0x95, script: 0x37, flags: 0x0}, - 225: {region: 0x97, script: 0x20, flags: 0x0}, - 226: {region: 0x71, script: 0x52, flags: 0x0}, - 227: {region: 0xe5, script: 0x52, flags: 0x0}, - 228: {region: 0x129, script: 0x39, flags: 0x0}, - 229: {region: 0x52, script: 0x81, flags: 0x0}, - 230: {region: 0xe6, script: 0x5, flags: 0x0}, - 231: {region: 0x97, script: 0x20, flags: 0x0}, - 232: {region: 0xad, script: 0x3a, flags: 0x0}, - 233: {region: 0xe5, script: 0x52, flags: 0x0}, - 234: {region: 0xe6, script: 0x5, flags: 0x0}, - 235: {region: 0xe4, script: 0x52, flags: 0x0}, - 236: {region: 0x97, script: 0x20, flags: 0x0}, - 237: {region: 0x97, script: 0x20, flags: 0x0}, - 238: {region: 0x8e, script: 0x52, flags: 0x0}, - 239: {region: 0x5f, script: 0x52, flags: 0x0}, - 240: {region: 0x52, script: 0x34, flags: 0x0}, - 241: {region: 0x8f, script: 0x52, flags: 0x0}, - 242: {region: 0x90, script: 0x52, flags: 0x0}, - 243: {region: 0x27, script: 0x8, flags: 0x0}, - 244: {region: 0xd0, script: 0x52, flags: 0x0}, - 245: {region: 0x76, script: 0x52, flags: 0x0}, - 246: {region: 0xce, script: 0x52, flags: 0x0}, - 247: {region: 0xd4, script: 0x52, flags: 0x0}, - 248: {region: 0x93, script: 0x52, flags: 0x0}, - 250: {region: 0xd4, script: 0x52, flags: 0x0}, - 251: {region: 0x52, script: 0xdf, flags: 0x0}, - 252: {region: 0x132, script: 0x52, flags: 0x0}, - 253: {region: 0x48, script: 0x52, flags: 0x0}, - 254: {region: 0xe5, script: 0x52, flags: 0x0}, - 255: {region: 0x93, script: 0x52, flags: 0x0}, - 256: {region: 0x104, script: 0x1e, flags: 0x0}, - 258: {region: 0x9b, script: 0x52, flags: 0x0}, - 259: {region: 0x9c, script: 0x52, flags: 0x0}, - 260: {region: 0x48, script: 0x17, flags: 0x0}, - 261: {region: 0x95, script: 0x37, flags: 0x0}, - 262: {region: 0x104, script: 0x52, flags: 0x0}, - 263: {region: 0xa0, script: 0x41, flags: 0x0}, - 264: {region: 0x9e, script: 0x52, flags: 0x0}, - 266: {region: 0x51, script: 0x52, flags: 0x0}, - 267: {region: 0x12e, script: 0x37, flags: 0x0}, - 268: {region: 0x12d, script: 0x52, flags: 0x0}, - 269: {region: 0xd9, script: 0x20, flags: 0x0}, - 270: {region: 0x62, script: 0x52, flags: 0x0}, - 271: {region: 0x93, script: 0x52, flags: 0x0}, - 272: {region: 0x93, script: 0x52, flags: 0x0}, - 273: {region: 0x7b, script: 0x29, flags: 0x0}, - 274: {region: 0x134, script: 0x1e, flags: 0x0}, - 275: {region: 0x66, script: 0x52, flags: 0x0}, - 276: {region: 0xc2, script: 0x52, flags: 0x0}, - 277: {region: 0xd4, script: 0x52, flags: 0x0}, - 278: {region: 0xa2, script: 0x52, flags: 0x0}, - 279: {region: 0xc1, script: 0x52, flags: 0x0}, - 280: {region: 0x104, script: 0x1e, flags: 0x0}, - 281: {region: 0xd4, script: 0x52, flags: 0x0}, - 282: {region: 0x161, script: 0x52, flags: 0x0}, - 283: {region: 0x12d, script: 0x52, flags: 0x0}, - 284: {region: 0x121, script: 0xd5, flags: 0x0}, - 285: {region: 0x59, script: 0x52, flags: 0x0}, - 286: {region: 0x51, script: 0x52, flags: 0x0}, - 287: {region: 0x4e, script: 0x52, flags: 0x0}, - 288: {region: 0x97, script: 0x20, flags: 0x0}, - 289: {region: 0x97, script: 0x20, flags: 0x0}, - 290: {region: 0x4a, script: 0x52, flags: 0x0}, - 291: {region: 0x93, script: 0x52, flags: 0x0}, - 292: {region: 0x40, script: 0x52, flags: 0x0}, - 293: {region: 0x97, script: 0x52, flags: 0x0}, - 294: {region: 0x52, script: 0xcc, flags: 0x0}, - 295: {region: 0x97, script: 0x20, flags: 0x0}, - 296: {region: 0xc1, script: 0x52, flags: 0x0}, - 297: {region: 0x97, script: 0x6b, flags: 0x0}, - 298: {region: 0xe6, script: 0x5, flags: 0x0}, - 299: {region: 0xa2, script: 0x52, flags: 0x0}, - 300: {region: 0x129, script: 0x52, flags: 0x0}, - 301: {region: 0xd0, script: 0x52, flags: 0x0}, - 302: {region: 0xad, script: 0x4f, flags: 0x0}, - 303: {region: 0x15, script: 0x6, flags: 0x1}, - 304: {region: 0x51, script: 0x52, flags: 0x0}, - 305: {region: 0x80, script: 0x52, flags: 0x0}, - 306: {region: 0xa2, script: 0x52, flags: 0x0}, - 307: {region: 0xa4, script: 0x46, flags: 0x0}, - 308: {region: 0x29, script: 0x52, flags: 0x0}, - 309: {region: 0x97, script: 0x4a, flags: 0x0}, - 310: {region: 0xa9, script: 0x4b, flags: 0x0}, - 311: {region: 0x104, script: 0x1e, flags: 0x0}, - 312: {region: 0x97, script: 0x20, flags: 0x0}, - 313: {region: 0x73, script: 0x52, flags: 0x0}, - 314: {region: 0xb2, script: 0x52, flags: 0x0}, - 316: {region: 0x104, script: 0x1e, flags: 0x0}, - 317: {region: 0x110, script: 0x52, flags: 0x0}, - 318: {region: 0xe5, script: 0x52, flags: 0x0}, - 319: {region: 0x104, script: 0x52, flags: 0x0}, - 320: {region: 0x97, script: 0x20, flags: 0x0}, - 321: {region: 0x97, script: 0x5, flags: 0x0}, - 322: {region: 0x12d, script: 0x52, flags: 0x0}, - 323: {region: 0x51, script: 0x52, flags: 0x0}, - 324: {region: 0x5f, script: 0x52, flags: 0x0}, - 325: {region: 0x1b, script: 0x3, flags: 0x1}, - 326: {region: 0x104, script: 0x1e, flags: 0x0}, - 327: {region: 0x104, script: 0x1e, flags: 0x0}, - 328: {region: 0x93, script: 0x52, flags: 0x0}, - 329: {region: 0xe6, script: 0x5, flags: 0x0}, - 330: {region: 0x79, script: 0x52, flags: 0x0}, - 331: {region: 0x121, script: 0xd5, flags: 0x0}, - 332: {region: 0xe6, script: 0x5, flags: 0x0}, - 333: {region: 0x1e, script: 0x5, flags: 0x1}, - 334: {region: 0x135, script: 0x52, flags: 0x0}, - 335: {region: 0x85, script: 0x56, flags: 0x0}, - 336: {region: 0x95, script: 0x37, flags: 0x0}, - 337: {region: 0x12d, script: 0x52, flags: 0x0}, - 338: {region: 0xe6, script: 0x5, flags: 0x0}, - 339: {region: 0x12f, script: 0x52, flags: 0x0}, - 340: {region: 0xb5, script: 0x52, flags: 0x0}, - 341: {region: 0x104, script: 0x1e, flags: 0x0}, - 342: {region: 0x93, script: 0x52, flags: 0x0}, - 343: {region: 0x52, script: 0xd5, flags: 0x0}, - 344: {region: 0x97, script: 0x54, flags: 0x0}, - 345: {region: 0x104, script: 0x1e, flags: 0x0}, - 346: {region: 0x12f, script: 0x52, flags: 0x0}, - 347: {region: 0xd7, script: 0x52, flags: 0x0}, - 348: {region: 0x23, script: 0x2, flags: 0x1}, - 349: {region: 0x9c, script: 0x52, flags: 0x0}, - 350: {region: 0x52, script: 0x58, flags: 0x0}, - 351: {region: 0x93, script: 0x52, flags: 0x0}, - 352: {region: 0x9a, script: 0x5, flags: 0x0}, - 353: {region: 0x132, script: 0x52, flags: 0x0}, - 354: {region: 0x97, script: 0xd0, flags: 0x0}, - 355: {region: 0x9c, script: 0x52, flags: 0x0}, - 356: {region: 0x4a, script: 0x52, flags: 0x0}, - 357: {region: 0xad, script: 0x4f, flags: 0x0}, - 358: {region: 0x4a, script: 0x52, flags: 0x0}, - 359: {region: 0x15f, script: 0x52, flags: 0x0}, - 360: {region: 0x9a, script: 0x5, flags: 0x0}, - 361: {region: 0xb4, script: 0x52, flags: 0x0}, - 362: {region: 0xb6, script: 0x52, flags: 0x0}, - 363: {region: 0x4a, script: 0x52, flags: 0x0}, - 364: {region: 0x4a, script: 0x52, flags: 0x0}, - 365: {region: 0xa2, script: 0x52, flags: 0x0}, - 366: {region: 0xa2, script: 0x52, flags: 0x0}, - 367: {region: 0x9a, script: 0x5, flags: 0x0}, - 368: {region: 0xb6, script: 0x52, flags: 0x0}, - 369: {region: 0x121, script: 0xd5, flags: 0x0}, - 370: {region: 0x52, script: 0x34, flags: 0x0}, - 371: {region: 0x129, script: 0x52, flags: 0x0}, - 372: {region: 0x93, script: 0x52, flags: 0x0}, - 373: {region: 0x51, script: 0x52, flags: 0x0}, - 374: {region: 0x97, script: 0x20, flags: 0x0}, - 375: {region: 0x97, script: 0x20, flags: 0x0}, - 376: {region: 0x93, script: 0x52, flags: 0x0}, - 377: {region: 0x25, script: 0x3, flags: 0x1}, - 378: {region: 0xa2, script: 0x52, flags: 0x0}, - 379: {region: 0xcd, script: 0x52, flags: 0x0}, - 380: {region: 0x104, script: 0x1e, flags: 0x0}, - 381: {region: 0xe5, script: 0x52, flags: 0x0}, - 382: {region: 0x93, script: 0x52, flags: 0x0}, - 383: {region: 0x110, script: 0x52, flags: 0x0}, - 384: {region: 0xa2, script: 0x52, flags: 0x0}, - 385: {region: 0x121, script: 0x5, flags: 0x0}, - 386: {region: 0xca, script: 0x52, flags: 0x0}, - 387: {region: 0xbd, script: 0x52, flags: 0x0}, - 388: {region: 0xcf, script: 0x52, flags: 0x0}, - 389: {region: 0x51, script: 0x52, flags: 0x0}, - 390: {region: 0xd9, script: 0x20, flags: 0x0}, - 391: {region: 0x12d, script: 0x52, flags: 0x0}, - 392: {region: 0xbe, script: 0x52, flags: 0x0}, - 393: {region: 0xde, script: 0x52, flags: 0x0}, - 394: {region: 0x93, script: 0x52, flags: 0x0}, - 395: {region: 0x99, script: 0x36, flags: 0x0}, - 396: {region: 0xc0, script: 0x1e, flags: 0x0}, - 397: {region: 0x97, script: 0x64, flags: 0x0}, - 398: {region: 0x109, script: 0x52, flags: 0x0}, - 399: {region: 0x28, script: 0x3, flags: 0x1}, - 400: {region: 0x97, script: 0xe, flags: 0x0}, - 401: {region: 0xc2, script: 0x6b, flags: 0x0}, - 403: {region: 0x48, script: 0x52, flags: 0x0}, - 404: {region: 0x48, script: 0x52, flags: 0x0}, - 405: {region: 0x36, script: 0x52, flags: 0x0}, - 406: {region: 0x97, script: 0x20, flags: 0x0}, - 407: {region: 0xd9, script: 0x20, flags: 0x0}, - 408: {region: 0x104, script: 0x1e, flags: 0x0}, - 409: {region: 0x34, script: 0x68, flags: 0x0}, - 410: {region: 0x2b, script: 0x3, flags: 0x1}, - 411: {region: 0xc9, script: 0x52, flags: 0x0}, - 412: {region: 0x97, script: 0x20, flags: 0x0}, - 413: {region: 0x51, script: 0x52, flags: 0x0}, - 415: {region: 0x132, script: 0x52, flags: 0x0}, - 416: {region: 0xe6, script: 0x5, flags: 0x0}, - 417: {region: 0xc1, script: 0x52, flags: 0x0}, - 418: {region: 0x97, script: 0x20, flags: 0x0}, - 419: {region: 0x93, script: 0x52, flags: 0x0}, - 420: {region: 0x161, script: 0x52, flags: 0x0}, - 421: {region: 0xc2, script: 0x6b, flags: 0x0}, - 422: {region: 0x104, script: 0x1e, flags: 0x0}, - 423: {region: 0x12f, script: 0x52, flags: 0x0}, - 424: {region: 0x9a, script: 0x5d, flags: 0x0}, - 425: {region: 0x9a, script: 0x5, flags: 0x0}, - 426: {region: 0xdb, script: 0x52, flags: 0x0}, - 428: {region: 0x52, script: 0x34, flags: 0x0}, - 429: {region: 0x9c, script: 0x52, flags: 0x0}, - 430: {region: 0xd0, script: 0x52, flags: 0x0}, - 431: {region: 0xd8, script: 0x52, flags: 0x0}, - 432: {region: 0xcd, script: 0x52, flags: 0x0}, - 433: {region: 0x161, script: 0x52, flags: 0x0}, - 434: {region: 0xcf, script: 0x52, flags: 0x0}, - 435: {region: 0x5f, script: 0x52, flags: 0x0}, - 436: {region: 0xd9, script: 0x20, flags: 0x0}, - 437: {region: 0xd9, script: 0x20, flags: 0x0}, - 438: {region: 0xd0, script: 0x52, flags: 0x0}, - 439: {region: 0xcf, script: 0x52, flags: 0x0}, - 440: {region: 0xcd, script: 0x52, flags: 0x0}, - 441: {region: 0xcd, script: 0x52, flags: 0x0}, - 442: {region: 0x93, script: 0x52, flags: 0x0}, - 443: {region: 0xdd, script: 0x52, flags: 0x0}, - 444: {region: 0x97, script: 0x52, flags: 0x0}, - 445: {region: 0xd7, script: 0x52, flags: 0x0}, - 446: {region: 0x51, script: 0x52, flags: 0x0}, - 447: {region: 0xd8, script: 0x52, flags: 0x0}, - 448: {region: 0x51, script: 0x52, flags: 0x0}, - 449: {region: 0xd8, script: 0x52, flags: 0x0}, - 450: {region: 0x121, script: 0x4e, flags: 0x0}, - 451: {region: 0x97, script: 0x20, flags: 0x0}, - 452: {region: 0x10a, script: 0xb7, flags: 0x0}, - 453: {region: 0x82, script: 0x70, flags: 0x0}, - 454: {region: 0x15e, script: 0x52, flags: 0x0}, - 455: {region: 0x48, script: 0x17, flags: 0x0}, - 456: {region: 0x15e, script: 0x52, flags: 0x0}, - 457: {region: 0x115, script: 0x52, flags: 0x0}, - 458: {region: 0x132, script: 0x52, flags: 0x0}, - 459: {region: 0x52, script: 0x52, flags: 0x0}, - 460: {region: 0xcc, script: 0x52, flags: 0x0}, - 461: {region: 0x12d, script: 0x52, flags: 0x0}, - 462: {region: 0x12f, script: 0x52, flags: 0x0}, - 463: {region: 0x7e, script: 0x52, flags: 0x0}, - 464: {region: 0x76, script: 0x52, flags: 0x0}, - 466: {region: 0x6e, script: 0x52, flags: 0x0}, - 467: {region: 0x97, script: 0x75, flags: 0x0}, - 468: {region: 0x7b, script: 0x1e, flags: 0x0}, - 469: {region: 0x132, script: 0x76, flags: 0x0}, - 470: {region: 0xc3, script: 0x74, flags: 0x0}, - 471: {region: 0x2e, script: 0x3, flags: 0x1}, - 472: {region: 0xe5, script: 0x52, flags: 0x0}, - 473: {region: 0x31, script: 0x2, flags: 0x1}, - 474: {region: 0xe5, script: 0x52, flags: 0x0}, - 475: {region: 0x2f, script: 0x52, flags: 0x0}, - 476: {region: 0xee, script: 0x52, flags: 0x0}, - 477: {region: 0x76, script: 0x52, flags: 0x0}, - 478: {region: 0xd4, script: 0x52, flags: 0x0}, - 479: {region: 0x132, script: 0x52, flags: 0x0}, - 480: {region: 0x48, script: 0x52, flags: 0x0}, - 481: {region: 0x9a, script: 0xdd, flags: 0x0}, - 482: {region: 0x5f, script: 0x52, flags: 0x0}, - 483: {region: 0xae, script: 0x7f, flags: 0x0}, - 485: {region: 0x97, script: 0x12, flags: 0x0}, - 486: {region: 0xa2, script: 0x52, flags: 0x0}, - 487: {region: 0xe7, script: 0x52, flags: 0x0}, - 488: {region: 0x9c, script: 0x52, flags: 0x0}, - 489: {region: 0x85, script: 0x2d, flags: 0x0}, - 490: {region: 0x73, script: 0x52, flags: 0x0}, - 491: {region: 0xe6, script: 0x45, flags: 0x0}, - 492: {region: 0x9a, script: 0x5, flags: 0x0}, - 493: {region: 0x1, script: 0x52, flags: 0x0}, - 494: {region: 0x23, script: 0x5, flags: 0x0}, - 495: {region: 0x40, script: 0x52, flags: 0x0}, - 496: {region: 0x78, script: 0x52, flags: 0x0}, - 497: {region: 0xe2, script: 0x52, flags: 0x0}, - 498: {region: 0x87, script: 0x52, flags: 0x0}, - 499: {region: 0x68, script: 0x52, flags: 0x0}, - 500: {region: 0x97, script: 0x20, flags: 0x0}, - 501: {region: 0x100, script: 0x52, flags: 0x0}, - 502: {region: 0x93, script: 0x52, flags: 0x0}, - 503: {region: 0x9c, script: 0x52, flags: 0x0}, - 504: {region: 0x97, script: 0x52, flags: 0x0}, - 505: {region: 0x33, script: 0x2, flags: 0x1}, - 506: {region: 0xd9, script: 0x20, flags: 0x0}, - 507: {region: 0x34, script: 0xe, flags: 0x0}, - 508: {region: 0x4d, script: 0x52, flags: 0x0}, - 509: {region: 0x70, script: 0x52, flags: 0x0}, - 510: {region: 0x4d, script: 0x52, flags: 0x0}, - 511: {region: 0x9a, script: 0x5, flags: 0x0}, - 512: {region: 0x10a, script: 0x52, flags: 0x0}, - 513: {region: 0x39, script: 0x52, flags: 0x0}, - 514: {region: 0xcf, script: 0x52, flags: 0x0}, - 515: {region: 0x102, script: 0x52, flags: 0x0}, - 516: {region: 0x93, script: 0x52, flags: 0x0}, - 517: {region: 0x12d, script: 0x52, flags: 0x0}, - 518: {region: 0x71, script: 0x52, flags: 0x0}, - 519: {region: 0x104, script: 0x1e, flags: 0x0}, - 520: {region: 0x12e, script: 0x1e, flags: 0x0}, - 521: {region: 0x107, script: 0x52, flags: 0x0}, - 522: {region: 0x105, script: 0x52, flags: 0x0}, - 523: {region: 0x12d, script: 0x52, flags: 0x0}, - 524: {region: 0xa0, script: 0x44, flags: 0x0}, - 525: {region: 0x97, script: 0x20, flags: 0x0}, - 526: {region: 0x7e, script: 0x52, flags: 0x0}, - 527: {region: 0x104, script: 0x1e, flags: 0x0}, - 528: {region: 0xa2, script: 0x52, flags: 0x0}, - 529: {region: 0x93, script: 0x52, flags: 0x0}, - 530: {region: 0x97, script: 0x52, flags: 0x0}, - 531: {region: 0x97, script: 0xbb, flags: 0x0}, - 532: {region: 0x12d, script: 0x52, flags: 0x0}, - 533: {region: 0x9c, script: 0x52, flags: 0x0}, - 534: {region: 0x97, script: 0x20, flags: 0x0}, - 535: {region: 0x9c, script: 0x52, flags: 0x0}, - 536: {region: 0x79, script: 0x52, flags: 0x0}, - 537: {region: 0x48, script: 0x52, flags: 0x0}, - 538: {region: 0x35, script: 0x4, flags: 0x1}, - 539: {region: 0x9c, script: 0x52, flags: 0x0}, - 540: {region: 0x9a, script: 0x5, flags: 0x0}, - 541: {region: 0xd8, script: 0x52, flags: 0x0}, - 542: {region: 0x4e, script: 0x52, flags: 0x0}, - 543: {region: 0xcf, script: 0x52, flags: 0x0}, - 544: {region: 0xcd, script: 0x52, flags: 0x0}, - 545: {region: 0xc1, script: 0x52, flags: 0x0}, - 546: {region: 0x4b, script: 0x52, flags: 0x0}, - 547: {region: 0x94, script: 0x72, flags: 0x0}, - 548: {region: 0xb4, script: 0x52, flags: 0x0}, - 550: {region: 0xb8, script: 0xd2, flags: 0x0}, - 551: {region: 0xc2, script: 0x6b, flags: 0x0}, - 552: {region: 0xb1, script: 0xc1, flags: 0x0}, - 553: {region: 0x6e, script: 0x52, flags: 0x0}, - 554: {region: 0x10f, script: 0x52, flags: 0x0}, - 555: {region: 0xe6, script: 0x5, flags: 0x0}, - 556: {region: 0x10d, script: 0x52, flags: 0x0}, - 557: {region: 0xe7, script: 0x52, flags: 0x0}, - 558: {region: 0x93, script: 0x52, flags: 0x0}, - 559: {region: 0x13f, script: 0x52, flags: 0x0}, - 560: {region: 0x10a, script: 0x52, flags: 0x0}, - 562: {region: 0x10a, script: 0x52, flags: 0x0}, - 563: {region: 0x70, script: 0x52, flags: 0x0}, - 564: {region: 0x95, script: 0xb8, flags: 0x0}, - 565: {region: 0x70, script: 0x52, flags: 0x0}, - 566: {region: 0x161, script: 0x52, flags: 0x0}, - 567: {region: 0xc1, script: 0x52, flags: 0x0}, - 568: {region: 0x113, script: 0x52, flags: 0x0}, - 569: {region: 0x121, script: 0xd5, flags: 0x0}, - 570: {region: 0x26, script: 0x52, flags: 0x0}, - 571: {region: 0x39, script: 0x5, flags: 0x1}, - 572: {region: 0x97, script: 0xc2, flags: 0x0}, - 573: {region: 0x114, script: 0x52, flags: 0x0}, - 574: {region: 0x112, script: 0x52, flags: 0x0}, - 575: {region: 0x97, script: 0x20, flags: 0x0}, - 576: {region: 0x15e, script: 0x52, flags: 0x0}, - 577: {region: 0x6c, script: 0x52, flags: 0x0}, - 578: {region: 0x15e, script: 0x52, flags: 0x0}, - 579: {region: 0x5f, script: 0x52, flags: 0x0}, - 580: {region: 0x93, script: 0x52, flags: 0x0}, - 581: {region: 0x12d, script: 0x52, flags: 0x0}, - 582: {region: 0x82, script: 0x52, flags: 0x0}, - 583: {region: 0x10a, script: 0x52, flags: 0x0}, - 584: {region: 0x12d, script: 0x52, flags: 0x0}, - 585: {region: 0x15c, script: 0x5, flags: 0x0}, - 586: {region: 0x4a, script: 0x52, flags: 0x0}, - 587: {region: 0x5f, script: 0x52, flags: 0x0}, - 588: {region: 0x97, script: 0x20, flags: 0x0}, - 589: {region: 0x93, script: 0x52, flags: 0x0}, - 590: {region: 0x34, script: 0xe, flags: 0x0}, - 591: {region: 0x99, script: 0xc5, flags: 0x0}, - 592: {region: 0xe7, script: 0x52, flags: 0x0}, - 593: {region: 0x97, script: 0xcd, flags: 0x0}, - 594: {region: 0xd9, script: 0x20, flags: 0x0}, - 595: {region: 0xe5, script: 0x52, flags: 0x0}, - 596: {region: 0x97, script: 0x4a, flags: 0x0}, - 597: {region: 0x52, script: 0xcb, flags: 0x0}, - 598: {region: 0xd9, script: 0x20, flags: 0x0}, - 599: {region: 0xd9, script: 0x20, flags: 0x0}, - 600: {region: 0x97, script: 0xd0, flags: 0x0}, - 601: {region: 0x110, script: 0x52, flags: 0x0}, - 602: {region: 0x12f, script: 0x52, flags: 0x0}, - 603: {region: 0x124, script: 0x52, flags: 0x0}, - 604: {region: 0x3e, script: 0x3, flags: 0x1}, - 605: {region: 0x121, script: 0xd5, flags: 0x0}, - 606: {region: 0xd9, script: 0x20, flags: 0x0}, - 607: {region: 0xd9, script: 0x20, flags: 0x0}, - 608: {region: 0xd9, script: 0x20, flags: 0x0}, - 609: {region: 0x6e, script: 0x27, flags: 0x0}, - 610: {region: 0x6c, script: 0x27, flags: 0x0}, - 611: {region: 0xd4, script: 0x52, flags: 0x0}, - 612: {region: 0x125, script: 0x52, flags: 0x0}, - 613: {region: 0x123, script: 0x52, flags: 0x0}, - 614: {region: 0x31, script: 0x52, flags: 0x0}, - 615: {region: 0xd9, script: 0x20, flags: 0x0}, - 616: {region: 0xe5, script: 0x52, flags: 0x0}, - 617: {region: 0x31, script: 0x52, flags: 0x0}, - 618: {region: 0xd2, script: 0x52, flags: 0x0}, - 619: {region: 0x15e, script: 0x52, flags: 0x0}, - 620: {region: 0x127, script: 0x52, flags: 0x0}, - 621: {region: 0xcc, script: 0x52, flags: 0x0}, - 622: {region: 0xe4, script: 0x52, flags: 0x0}, - 623: {region: 0x129, script: 0x52, flags: 0x0}, - 624: {region: 0x129, script: 0x52, flags: 0x0}, - 625: {region: 0x12c, script: 0x52, flags: 0x0}, - 626: {region: 0x15e, script: 0x52, flags: 0x0}, - 627: {region: 0x85, script: 0x2d, flags: 0x0}, - 628: {region: 0xd9, script: 0x20, flags: 0x0}, - 629: {region: 0xe5, script: 0x52, flags: 0x0}, - 630: {region: 0x42, script: 0xd6, flags: 0x0}, - 631: {region: 0x104, script: 0x1e, flags: 0x0}, - 632: {region: 0x12f, script: 0x52, flags: 0x0}, - 633: {region: 0x121, script: 0xd5, flags: 0x0}, - 634: {region: 0x31, script: 0x52, flags: 0x0}, - 635: {region: 0xcc, script: 0x52, flags: 0x0}, - 636: {region: 0x12b, script: 0x52, flags: 0x0}, - 638: {region: 0xd2, script: 0x52, flags: 0x0}, - 639: {region: 0x52, script: 0xce, flags: 0x0}, - 640: {region: 0xe3, script: 0x52, flags: 0x0}, - 641: {region: 0x104, script: 0x1e, flags: 0x0}, - 642: {region: 0xb8, script: 0x52, flags: 0x0}, - 643: {region: 0x104, script: 0x1e, flags: 0x0}, - 644: {region: 0x41, script: 0x4, flags: 0x1}, - 645: {region: 0x11a, script: 0xd8, flags: 0x0}, - 646: {region: 0x12e, script: 0x1e, flags: 0x0}, - 647: {region: 0x73, script: 0x52, flags: 0x0}, - 648: {region: 0x29, script: 0x52, flags: 0x0}, - 650: {region: 0x45, script: 0x3, flags: 0x1}, - 651: {region: 0x97, script: 0xe, flags: 0x0}, - 652: {region: 0xe6, script: 0x5, flags: 0x0}, - 653: {region: 0x48, script: 0x4, flags: 0x1}, - 654: {region: 0xb2, script: 0xd9, flags: 0x0}, - 655: {region: 0x15e, script: 0x52, flags: 0x0}, - 656: {region: 0x9c, script: 0x52, flags: 0x0}, - 657: {region: 0x104, script: 0x52, flags: 0x0}, - 658: {region: 0x13b, script: 0x52, flags: 0x0}, - 659: {region: 0x119, script: 0x52, flags: 0x0}, - 660: {region: 0x35, script: 0x52, flags: 0x0}, - 661: {region: 0x5f, script: 0x52, flags: 0x0}, - 662: {region: 0xcf, script: 0x52, flags: 0x0}, - 663: {region: 0x1, script: 0x52, flags: 0x0}, - 664: {region: 0x104, script: 0x52, flags: 0x0}, - 665: {region: 0x69, script: 0x52, flags: 0x0}, - 666: {region: 0x12d, script: 0x52, flags: 0x0}, - 667: {region: 0x35, script: 0x52, flags: 0x0}, - 668: {region: 0x4d, script: 0x52, flags: 0x0}, - 669: {region: 0x6e, script: 0x27, flags: 0x0}, - 670: {region: 0xe5, script: 0x52, flags: 0x0}, - 671: {region: 0x2e, script: 0x52, flags: 0x0}, - 672: {region: 0x97, script: 0xd0, flags: 0x0}, - 673: {region: 0x97, script: 0x20, flags: 0x0}, - 674: {region: 0x13d, script: 0x52, flags: 0x0}, - 675: {region: 0xa6, script: 0x5, flags: 0x0}, - 676: {region: 0x112, script: 0x52, flags: 0x0}, - 677: {region: 0x97, script: 0x20, flags: 0x0}, - 678: {region: 0x52, script: 0x34, flags: 0x0}, - 679: {region: 0x40, script: 0x52, flags: 0x0}, - 680: {region: 0x129, script: 0x18, flags: 0x0}, - 681: {region: 0x15e, script: 0x52, flags: 0x0}, - 682: {region: 0x129, script: 0x5a, flags: 0x0}, - 683: {region: 0x129, script: 0x5b, flags: 0x0}, - 684: {region: 0x7b, script: 0x29, flags: 0x0}, - 685: {region: 0x52, script: 0x5e, flags: 0x0}, - 686: {region: 0x109, script: 0x62, flags: 0x0}, - 687: {region: 0x106, script: 0x6c, flags: 0x0}, - 688: {region: 0x97, script: 0x20, flags: 0x0}, - 689: {region: 0x12f, script: 0x52, flags: 0x0}, - 690: {region: 0x9a, script: 0x82, flags: 0x0}, - 691: {region: 0x15b, script: 0xba, flags: 0x0}, - 692: {region: 0xd9, script: 0x20, flags: 0x0}, - 693: {region: 0xcf, script: 0x52, flags: 0x0}, - 694: {region: 0x73, script: 0x52, flags: 0x0}, - 695: {region: 0x51, script: 0x52, flags: 0x0}, - 696: {region: 0x51, script: 0x52, flags: 0x0}, - 697: {region: 0x1, script: 0x37, flags: 0x0}, - 698: {region: 0xd4, script: 0x52, flags: 0x0}, - 699: {region: 0x40, script: 0x52, flags: 0x0}, - 700: {region: 0xcd, script: 0x52, flags: 0x0}, - 701: {region: 0x4c, script: 0x3, flags: 0x1}, - 702: {region: 0x52, script: 0x52, flags: 0x0}, - 703: {region: 0x109, script: 0x52, flags: 0x0}, - 705: {region: 0xa6, script: 0x5, flags: 0x0}, - 706: {region: 0xd7, script: 0x52, flags: 0x0}, - 707: {region: 0xb8, script: 0xd2, flags: 0x0}, - 708: {region: 0x4f, script: 0x14, flags: 0x1}, - 709: {region: 0xce, script: 0x52, flags: 0x0}, - 710: {region: 0x15e, script: 0x52, flags: 0x0}, - 712: {region: 0x129, script: 0x52, flags: 0x0}, +// Size: 5308 bytes, 1327 elements +var likelyLang = [1327]likelyScriptRegion{ + 0: {region: 0x134, script: 0x52, flags: 0x0}, + 1: {region: 0x6e, script: 0x52, flags: 0x0}, + 2: {region: 0x164, script: 0x52, flags: 0x0}, + 3: {region: 0x164, script: 0x52, flags: 0x0}, + 4: {region: 0x164, script: 0x52, flags: 0x0}, + 5: {region: 0x7c, script: 0x1e, flags: 0x0}, + 6: {region: 0x164, script: 0x52, flags: 0x0}, + 7: {region: 0x164, script: 0x1e, flags: 0x0}, + 8: {region: 0x7f, script: 0x52, flags: 0x0}, + 9: {region: 0x164, script: 0x52, flags: 0x0}, + 10: {region: 0x164, script: 0x52, flags: 0x0}, + 11: {region: 0x164, script: 0x52, flags: 0x0}, + 12: {region: 0x94, script: 0x52, flags: 0x0}, + 13: {region: 0x130, script: 0x52, flags: 0x0}, + 14: {region: 0x7f, script: 0x52, flags: 0x0}, + 15: {region: 0x164, script: 0x52, flags: 0x0}, + 16: {region: 0x164, script: 0x52, flags: 0x0}, + 17: {region: 0x105, script: 0x1e, flags: 0x0}, + 18: {region: 0x164, script: 0x52, flags: 0x0}, + 19: {region: 0x9b, script: 0x9, flags: 0x0}, + 20: {region: 0x127, script: 0x5, flags: 0x0}, + 21: {region: 0x164, script: 0x52, flags: 0x0}, + 22: {region: 0x160, script: 0x52, flags: 0x0}, + 23: {region: 0x164, script: 0x52, flags: 0x0}, + 24: {region: 0x164, script: 0x52, flags: 0x0}, + 25: {region: 0x164, script: 0x52, flags: 0x0}, + 26: {region: 0x164, script: 0x52, flags: 0x0}, + 27: {region: 0x164, script: 0x52, flags: 0x0}, + 28: {region: 0x51, script: 0x52, flags: 0x0}, + 29: {region: 0x164, script: 0x52, flags: 0x0}, + 30: {region: 0x164, script: 0x52, flags: 0x0}, + 31: {region: 0x98, script: 0x4, flags: 0x0}, + 32: {region: 0x164, script: 0x52, flags: 0x0}, + 33: {region: 0x7f, script: 0x52, flags: 0x0}, + 34: {region: 0x9a, script: 0xde, flags: 0x0}, + 35: {region: 0x164, script: 0x52, flags: 0x0}, + 36: {region: 0x164, script: 0x52, flags: 0x0}, + 37: {region: 0x14c, script: 0x52, flags: 0x0}, + 38: {region: 0x105, script: 0x1e, flags: 0x0}, + 39: {region: 0x6e, script: 0x27, flags: 0x0}, + 40: {region: 0x164, script: 0x52, flags: 0x0}, + 41: {region: 0x164, script: 0x52, flags: 0x0}, + 42: {region: 0xd5, script: 0x52, flags: 0x0}, + 43: {region: 0x164, script: 0x52, flags: 0x0}, + 45: {region: 0x164, script: 0x52, flags: 0x0}, + 46: {region: 0x164, script: 0x52, flags: 0x0}, + 47: {region: 0x164, script: 0x52, flags: 0x0}, + 48: {region: 0x164, script: 0x52, flags: 0x0}, + 49: {region: 0x164, script: 0x52, flags: 0x0}, + 50: {region: 0x164, script: 0x52, flags: 0x0}, + 51: {region: 0x94, script: 0x52, flags: 0x0}, + 52: {region: 0x164, script: 0x5, flags: 0x0}, + 53: {region: 0x121, script: 0x5, flags: 0x0}, + 54: {region: 0x164, script: 0x52, flags: 0x0}, + 55: {region: 0x164, script: 0x52, flags: 0x0}, + 56: {region: 0x164, script: 0x52, flags: 0x0}, + 57: {region: 0x164, script: 0x52, flags: 0x0}, + 58: {region: 0x6a, script: 0x5, flags: 0x0}, + 59: {region: 0x0, script: 0x3, flags: 0x1}, + 60: {region: 0x164, script: 0x52, flags: 0x0}, + 61: {region: 0x50, script: 0x52, flags: 0x0}, + 62: {region: 0x3e, script: 0x52, flags: 0x0}, + 63: {region: 0x66, script: 0x5, flags: 0x0}, + 65: {region: 0xb9, script: 0x5, flags: 0x0}, + 66: {region: 0x6a, script: 0x5, flags: 0x0}, + 67: {region: 0x98, script: 0xe, flags: 0x0}, + 68: {region: 0x12e, script: 0x52, flags: 0x0}, + 69: {region: 0x134, script: 0xbc, flags: 0x0}, + 70: {region: 0x164, script: 0x52, flags: 0x0}, + 71: {region: 0x164, script: 0x52, flags: 0x0}, + 72: {region: 0x6d, script: 0x52, flags: 0x0}, + 73: {region: 0x164, script: 0x52, flags: 0x0}, + 74: {region: 0x164, script: 0x52, flags: 0x0}, + 75: {region: 0x48, script: 0x52, flags: 0x0}, + 76: {region: 0x164, script: 0x52, flags: 0x0}, + 77: {region: 0x105, script: 0x1e, flags: 0x0}, + 78: {region: 0x164, script: 0x5, flags: 0x0}, + 79: {region: 0x164, script: 0x52, flags: 0x0}, + 80: {region: 0x164, script: 0x52, flags: 0x0}, + 81: {region: 0x164, script: 0x52, flags: 0x0}, + 82: {region: 0x98, script: 0x20, flags: 0x0}, + 83: {region: 0x164, script: 0x52, flags: 0x0}, + 84: {region: 0x164, script: 0x52, flags: 0x0}, + 85: {region: 0x164, script: 0x52, flags: 0x0}, + 86: {region: 0x3e, script: 0x52, flags: 0x0}, + 87: {region: 0x164, script: 0x52, flags: 0x0}, + 88: {region: 0x3, script: 0x5, flags: 0x1}, + 89: {region: 0x105, script: 0x1e, flags: 0x0}, + 90: {region: 0xe7, script: 0x5, flags: 0x0}, + 91: {region: 0x94, script: 0x52, flags: 0x0}, + 92: {region: 0xda, script: 0x20, flags: 0x0}, + 93: {region: 0x2d, script: 0x52, flags: 0x0}, + 94: {region: 0x51, script: 0x52, flags: 0x0}, + 95: {region: 0x164, script: 0x52, flags: 0x0}, + 96: {region: 0x51, script: 0xb, flags: 0x0}, + 97: {region: 0x164, script: 0x52, flags: 0x0}, + 98: {region: 0x164, script: 0x52, flags: 0x0}, + 99: {region: 0x94, script: 0x52, flags: 0x0}, + 100: {region: 0x164, script: 0x52, flags: 0x0}, + 101: {region: 0x51, script: 0x52, flags: 0x0}, + 102: {region: 0x164, script: 0x52, flags: 0x0}, + 103: {region: 0x164, script: 0x52, flags: 0x0}, + 104: {region: 0x164, script: 0x52, flags: 0x0}, + 105: {region: 0x164, script: 0x52, flags: 0x0}, + 106: {region: 0x4e, script: 0x52, flags: 0x0}, + 107: {region: 0x164, script: 0x52, flags: 0x0}, + 108: {region: 0x164, script: 0x52, flags: 0x0}, + 109: {region: 0x164, script: 0x52, flags: 0x0}, + 110: {region: 0x164, script: 0x27, flags: 0x0}, + 111: {region: 0x164, script: 0x52, flags: 0x0}, + 112: {region: 0x164, script: 0x52, flags: 0x0}, + 113: {region: 0x46, script: 0x1e, flags: 0x0}, + 114: {region: 0x164, script: 0x52, flags: 0x0}, + 115: {region: 0x164, script: 0x52, flags: 0x0}, + 116: {region: 0x10a, script: 0x5, flags: 0x0}, + 117: {region: 0x161, script: 0x52, flags: 0x0}, + 118: {region: 0x164, script: 0x52, flags: 0x0}, + 119: {region: 0x94, script: 0x52, flags: 0x0}, + 120: {region: 0x164, script: 0x52, flags: 0x0}, + 121: {region: 0x12e, script: 0x52, flags: 0x0}, + 122: {region: 0x51, script: 0x52, flags: 0x0}, + 123: {region: 0x98, script: 0xcd, flags: 0x0}, + 124: {region: 0xe7, script: 0x5, flags: 0x0}, + 125: {region: 0x98, script: 0x20, flags: 0x0}, + 126: {region: 0x37, script: 0x1e, flags: 0x0}, + 127: {region: 0x98, script: 0x20, flags: 0x0}, + 128: {region: 0xe7, script: 0x5, flags: 0x0}, + 129: {region: 0x12a, script: 0x2d, flags: 0x0}, + 131: {region: 0x98, script: 0x20, flags: 0x0}, + 132: {region: 0x164, script: 0x52, flags: 0x0}, + 133: {region: 0x98, script: 0x20, flags: 0x0}, + 134: {region: 0xe6, script: 0x52, flags: 0x0}, + 135: {region: 0x164, script: 0x52, flags: 0x0}, + 136: {region: 0x98, script: 0x20, flags: 0x0}, + 137: {region: 0x164, script: 0x52, flags: 0x0}, + 138: {region: 0x13e, script: 0x52, flags: 0x0}, + 139: {region: 0x164, script: 0x52, flags: 0x0}, + 140: {region: 0x164, script: 0x52, flags: 0x0}, + 141: {region: 0xe6, script: 0x52, flags: 0x0}, + 142: {region: 0x164, script: 0x52, flags: 0x0}, + 143: {region: 0xd5, script: 0x52, flags: 0x0}, + 144: {region: 0x164, script: 0x52, flags: 0x0}, + 145: {region: 0x164, script: 0x52, flags: 0x0}, + 146: {region: 0x164, script: 0x52, flags: 0x0}, + 147: {region: 0x164, script: 0x27, flags: 0x0}, + 148: {region: 0x98, script: 0x20, flags: 0x0}, + 149: {region: 0x94, script: 0x52, flags: 0x0}, + 150: {region: 0x164, script: 0x52, flags: 0x0}, + 151: {region: 0x164, script: 0x52, flags: 0x0}, + 152: {region: 0x113, script: 0x52, flags: 0x0}, + 153: {region: 0x164, script: 0x52, flags: 0x0}, + 154: {region: 0x164, script: 0x52, flags: 0x0}, + 155: {region: 0x51, script: 0x52, flags: 0x0}, + 156: {region: 0x164, script: 0x52, flags: 0x0}, + 157: {region: 0xe6, script: 0x52, flags: 0x0}, + 158: {region: 0x164, script: 0x52, flags: 0x0}, + 159: {region: 0x13d, script: 0xcf, flags: 0x0}, + 160: {region: 0xc2, script: 0x52, flags: 0x0}, + 161: {region: 0x164, script: 0x52, flags: 0x0}, + 162: {region: 0x164, script: 0x52, flags: 0x0}, + 163: {region: 0xc2, script: 0x52, flags: 0x0}, + 164: {region: 0x164, script: 0x52, flags: 0x0}, + 165: {region: 0x34, script: 0xe, flags: 0x0}, + 166: {region: 0x164, script: 0x52, flags: 0x0}, + 167: {region: 0x164, script: 0x52, flags: 0x0}, + 168: {region: 0x164, script: 0x52, flags: 0x0}, + 169: {region: 0x52, script: 0xd6, flags: 0x0}, + 170: {region: 0x164, script: 0x52, flags: 0x0}, + 171: {region: 0x164, script: 0x52, flags: 0x0}, + 172: {region: 0x164, script: 0x52, flags: 0x0}, + 173: {region: 0x98, script: 0xe, flags: 0x0}, + 174: {region: 0x164, script: 0x52, flags: 0x0}, + 175: {region: 0x9b, script: 0x5, flags: 0x0}, + 176: {region: 0x164, script: 0x52, flags: 0x0}, + 177: {region: 0x4e, script: 0x52, flags: 0x0}, + 178: {region: 0x77, script: 0x52, flags: 0x0}, + 179: {region: 0x98, script: 0x20, flags: 0x0}, + 180: {region: 0xe7, script: 0x5, flags: 0x0}, + 181: {region: 0x98, script: 0x20, flags: 0x0}, + 182: {region: 0x164, script: 0x52, flags: 0x0}, + 183: {region: 0x32, script: 0x52, flags: 0x0}, + 184: {region: 0x164, script: 0x52, flags: 0x0}, + 185: {region: 0xb3, script: 0xc, flags: 0x0}, + 186: {region: 0x51, script: 0x52, flags: 0x0}, + 187: {region: 0x164, script: 0x27, flags: 0x0}, + 188: {region: 0xe6, script: 0x52, flags: 0x0}, + 189: {region: 0x164, script: 0x52, flags: 0x0}, + 190: {region: 0xe7, script: 0x20, flags: 0x0}, + 191: {region: 0x105, script: 0x1e, flags: 0x0}, + 192: {region: 0x15e, script: 0x52, flags: 0x0}, + 193: {region: 0x164, script: 0x52, flags: 0x0}, + 194: {region: 0x94, script: 0x52, flags: 0x0}, + 195: {region: 0x164, script: 0x52, flags: 0x0}, + 196: {region: 0x51, script: 0x52, flags: 0x0}, + 197: {region: 0x164, script: 0x52, flags: 0x0}, + 198: {region: 0x164, script: 0x52, flags: 0x0}, + 199: {region: 0x164, script: 0x52, flags: 0x0}, + 200: {region: 0x85, script: 0x52, flags: 0x0}, + 201: {region: 0x164, script: 0x52, flags: 0x0}, + 202: {region: 0x164, script: 0x52, flags: 0x0}, + 203: {region: 0x164, script: 0x52, flags: 0x0}, + 204: {region: 0x164, script: 0x52, flags: 0x0}, + 205: {region: 0x6c, script: 0x27, flags: 0x0}, + 206: {region: 0x164, script: 0x52, flags: 0x0}, + 207: {region: 0x164, script: 0x52, flags: 0x0}, + 208: {region: 0x51, script: 0x52, flags: 0x0}, + 209: {region: 0x164, script: 0x52, flags: 0x0}, + 210: {region: 0x164, script: 0x52, flags: 0x0}, + 211: {region: 0xc2, script: 0x52, flags: 0x0}, + 212: {region: 0x164, script: 0x52, flags: 0x0}, + 213: {region: 0x164, script: 0x52, flags: 0x0}, + 214: {region: 0x164, script: 0x52, flags: 0x0}, + 215: {region: 0x6d, script: 0x52, flags: 0x0}, + 216: {region: 0x164, script: 0x52, flags: 0x0}, + 217: {region: 0x164, script: 0x52, flags: 0x0}, + 218: {region: 0xd5, script: 0x52, flags: 0x0}, + 219: {region: 0x34, script: 0x16, flags: 0x0}, + 220: {region: 0x105, script: 0x1e, flags: 0x0}, + 221: {region: 0xe6, script: 0x52, flags: 0x0}, + 222: {region: 0x164, script: 0x52, flags: 0x0}, + 223: {region: 0x130, script: 0x52, flags: 0x0}, + 224: {region: 0x89, script: 0x52, flags: 0x0}, + 225: {region: 0x74, script: 0x52, flags: 0x0}, + 226: {region: 0x105, script: 0x1e, flags: 0x0}, + 227: {region: 0x134, script: 0x52, flags: 0x0}, + 228: {region: 0x48, script: 0x52, flags: 0x0}, + 229: {region: 0x134, script: 0x1a, flags: 0x0}, + 230: {region: 0xa5, script: 0x5, flags: 0x0}, + 231: {region: 0x13d, script: 0x19, flags: 0x0}, + 232: {region: 0x164, script: 0x52, flags: 0x0}, + 233: {region: 0x9a, script: 0x5, flags: 0x0}, + 234: {region: 0x164, script: 0x52, flags: 0x0}, + 235: {region: 0x164, script: 0x52, flags: 0x0}, + 236: {region: 0x164, script: 0x52, flags: 0x0}, + 237: {region: 0x164, script: 0x52, flags: 0x0}, + 238: {region: 0x164, script: 0x52, flags: 0x0}, + 239: {region: 0x77, script: 0x52, flags: 0x0}, + 240: {region: 0x6a, script: 0x1c, flags: 0x0}, + 241: {region: 0xe6, script: 0x52, flags: 0x0}, + 242: {region: 0x48, script: 0x17, flags: 0x0}, + 243: {region: 0x12f, script: 0x1e, flags: 0x0}, + 244: {region: 0x48, script: 0x17, flags: 0x0}, + 245: {region: 0x48, script: 0x17, flags: 0x0}, + 246: {region: 0x48, script: 0x17, flags: 0x0}, + 247: {region: 0x48, script: 0x17, flags: 0x0}, + 248: {region: 0x109, script: 0x52, flags: 0x0}, + 249: {region: 0x5d, script: 0x52, flags: 0x0}, + 250: {region: 0xe8, script: 0x52, flags: 0x0}, + 251: {region: 0x48, script: 0x17, flags: 0x0}, + 252: {region: 0xc3, script: 0x79, flags: 0x0}, + 253: {region: 0x8, script: 0x2, flags: 0x1}, + 254: {region: 0x105, script: 0x1e, flags: 0x0}, + 255: {region: 0x7a, script: 0x52, flags: 0x0}, + 256: {region: 0x62, script: 0x52, flags: 0x0}, + 257: {region: 0x164, script: 0x52, flags: 0x0}, + 258: {region: 0x164, script: 0x52, flags: 0x0}, + 259: {region: 0x164, script: 0x52, flags: 0x0}, + 260: {region: 0x164, script: 0x52, flags: 0x0}, + 261: {region: 0x134, script: 0x52, flags: 0x0}, + 262: {region: 0x105, script: 0x1e, flags: 0x0}, + 263: {region: 0xa3, script: 0x52, flags: 0x0}, + 264: {region: 0x164, script: 0x52, flags: 0x0}, + 265: {region: 0x164, script: 0x52, flags: 0x0}, + 266: {region: 0x98, script: 0x5, flags: 0x0}, + 267: {region: 0x164, script: 0x52, flags: 0x0}, + 268: {region: 0x5f, script: 0x52, flags: 0x0}, + 269: {region: 0x164, script: 0x52, flags: 0x0}, + 270: {region: 0x48, script: 0x52, flags: 0x0}, + 271: {region: 0x164, script: 0x52, flags: 0x0}, + 272: {region: 0x164, script: 0x52, flags: 0x0}, + 273: {region: 0x164, script: 0x52, flags: 0x0}, + 274: {region: 0x164, script: 0x5, flags: 0x0}, + 275: {region: 0x48, script: 0x52, flags: 0x0}, + 276: {region: 0x164, script: 0x52, flags: 0x0}, + 277: {region: 0x164, script: 0x52, flags: 0x0}, + 278: {region: 0xd3, script: 0x52, flags: 0x0}, + 279: {region: 0x4e, script: 0x52, flags: 0x0}, + 280: {region: 0x164, script: 0x52, flags: 0x0}, + 281: {region: 0x98, script: 0x5, flags: 0x0}, + 282: {region: 0x164, script: 0x52, flags: 0x0}, + 283: {region: 0x164, script: 0x52, flags: 0x0}, + 284: {region: 0x164, script: 0x52, flags: 0x0}, + 285: {region: 0x164, script: 0x27, flags: 0x0}, + 286: {region: 0x5f, script: 0x52, flags: 0x0}, + 287: {region: 0xc2, script: 0x52, flags: 0x0}, + 288: {region: 0xcf, script: 0x52, flags: 0x0}, + 289: {region: 0x164, script: 0x52, flags: 0x0}, + 290: {region: 0xda, script: 0x20, flags: 0x0}, + 291: {region: 0x51, script: 0x52, flags: 0x0}, + 292: {region: 0x164, script: 0x52, flags: 0x0}, + 293: {region: 0x164, script: 0x52, flags: 0x0}, + 294: {region: 0x164, script: 0x52, flags: 0x0}, + 295: {region: 0xcc, script: 0xd4, flags: 0x0}, + 296: {region: 0x164, script: 0x52, flags: 0x0}, + 297: {region: 0x164, script: 0x52, flags: 0x0}, + 298: {region: 0x113, script: 0x52, flags: 0x0}, + 299: {region: 0x36, script: 0x52, flags: 0x0}, + 300: {region: 0x42, script: 0xd6, flags: 0x0}, + 301: {region: 0x164, script: 0x52, flags: 0x0}, + 302: {region: 0xa3, script: 0x52, flags: 0x0}, + 303: {region: 0x7f, script: 0x52, flags: 0x0}, + 304: {region: 0xd5, script: 0x52, flags: 0x0}, + 305: {region: 0x9d, script: 0x52, flags: 0x0}, + 306: {region: 0x6a, script: 0x25, flags: 0x0}, + 307: {region: 0x164, script: 0x52, flags: 0x0}, + 308: {region: 0xc3, script: 0x43, flags: 0x0}, + 309: {region: 0x86, script: 0x2d, flags: 0x0}, + 310: {region: 0x164, script: 0x52, flags: 0x0}, + 311: {region: 0x164, script: 0x52, flags: 0x0}, + 312: {region: 0xa, script: 0x2, flags: 0x1}, + 313: {region: 0x164, script: 0x52, flags: 0x0}, + 314: {region: 0x164, script: 0x52, flags: 0x0}, + 315: {region: 0x1, script: 0x52, flags: 0x0}, + 316: {region: 0x164, script: 0x52, flags: 0x0}, + 317: {region: 0x6d, script: 0x52, flags: 0x0}, + 318: {region: 0x134, script: 0x52, flags: 0x0}, + 319: {region: 0x69, script: 0x52, flags: 0x0}, + 320: {region: 0x164, script: 0x52, flags: 0x0}, + 321: {region: 0x9d, script: 0x3e, flags: 0x0}, + 322: {region: 0x164, script: 0x52, flags: 0x0}, + 323: {region: 0x164, script: 0x52, flags: 0x0}, + 324: {region: 0x6d, script: 0x52, flags: 0x0}, + 325: {region: 0x51, script: 0x52, flags: 0x0}, + 326: {region: 0x6d, script: 0x52, flags: 0x0}, + 327: {region: 0x9b, script: 0x5, flags: 0x0}, + 328: {region: 0x164, script: 0x52, flags: 0x0}, + 329: {region: 0x164, script: 0x52, flags: 0x0}, + 330: {region: 0x164, script: 0x52, flags: 0x0}, + 331: {region: 0x164, script: 0x52, flags: 0x0}, + 332: {region: 0x85, script: 0x52, flags: 0x0}, + 333: {region: 0xc, script: 0x2, flags: 0x1}, + 334: {region: 0x164, script: 0x52, flags: 0x0}, + 335: {region: 0xc2, script: 0x52, flags: 0x0}, + 336: {region: 0x71, script: 0x52, flags: 0x0}, + 337: {region: 0x10a, script: 0x5, flags: 0x0}, + 338: {region: 0xe6, script: 0x52, flags: 0x0}, + 339: {region: 0x10b, script: 0x52, flags: 0x0}, + 340: {region: 0x72, script: 0x52, flags: 0x0}, + 341: {region: 0x164, script: 0x52, flags: 0x0}, + 342: {region: 0x164, script: 0x52, flags: 0x0}, + 343: {region: 0x75, script: 0x52, flags: 0x0}, + 344: {region: 0x164, script: 0x52, flags: 0x0}, + 345: {region: 0x3a, script: 0x52, flags: 0x0}, + 346: {region: 0x164, script: 0x52, flags: 0x0}, + 347: {region: 0x164, script: 0x52, flags: 0x0}, + 348: {region: 0x164, script: 0x52, flags: 0x0}, + 349: {region: 0x77, script: 0x52, flags: 0x0}, + 350: {region: 0x134, script: 0x52, flags: 0x0}, + 351: {region: 0x77, script: 0x52, flags: 0x0}, + 352: {region: 0x5f, script: 0x52, flags: 0x0}, + 353: {region: 0x5f, script: 0x52, flags: 0x0}, + 354: {region: 0x51, script: 0x5, flags: 0x0}, + 355: {region: 0x13f, script: 0x52, flags: 0x0}, + 356: {region: 0x164, script: 0x52, flags: 0x0}, + 357: {region: 0x83, script: 0x52, flags: 0x0}, + 358: {region: 0x164, script: 0x52, flags: 0x0}, + 359: {region: 0xd3, script: 0x52, flags: 0x0}, + 360: {region: 0x9d, script: 0x52, flags: 0x0}, + 361: {region: 0xd5, script: 0x52, flags: 0x0}, + 362: {region: 0x164, script: 0x52, flags: 0x0}, + 363: {region: 0x10a, script: 0x52, flags: 0x0}, + 364: {region: 0xd8, script: 0x52, flags: 0x0}, + 365: {region: 0x95, script: 0x52, flags: 0x0}, + 366: {region: 0x7f, script: 0x52, flags: 0x0}, + 367: {region: 0x164, script: 0x52, flags: 0x0}, + 368: {region: 0xbb, script: 0x52, flags: 0x0}, + 369: {region: 0x164, script: 0x52, flags: 0x0}, + 370: {region: 0x164, script: 0x52, flags: 0x0}, + 371: {region: 0x164, script: 0x52, flags: 0x0}, + 372: {region: 0x52, script: 0x34, flags: 0x0}, + 373: {region: 0x164, script: 0x52, flags: 0x0}, + 374: {region: 0x94, script: 0x52, flags: 0x0}, + 375: {region: 0x164, script: 0x52, flags: 0x0}, + 376: {region: 0x98, script: 0x20, flags: 0x0}, + 377: {region: 0x164, script: 0x52, flags: 0x0}, + 378: {region: 0x9b, script: 0x5, flags: 0x0}, + 379: {region: 0x7d, script: 0x52, flags: 0x0}, + 380: {region: 0x7a, script: 0x52, flags: 0x0}, + 381: {region: 0x164, script: 0x52, flags: 0x0}, + 382: {region: 0x164, script: 0x52, flags: 0x0}, + 383: {region: 0x164, script: 0x52, flags: 0x0}, + 384: {region: 0x164, script: 0x52, flags: 0x0}, + 385: {region: 0x164, script: 0x52, flags: 0x0}, + 386: {region: 0x164, script: 0x52, flags: 0x0}, + 387: {region: 0x6e, script: 0x27, flags: 0x0}, + 388: {region: 0x164, script: 0x52, flags: 0x0}, + 389: {region: 0xda, script: 0x20, flags: 0x0}, + 390: {region: 0x164, script: 0x52, flags: 0x0}, + 391: {region: 0xa6, script: 0x52, flags: 0x0}, + 392: {region: 0x164, script: 0x52, flags: 0x0}, + 393: {region: 0xe7, script: 0x5, flags: 0x0}, + 394: {region: 0x164, script: 0x52, flags: 0x0}, + 395: {region: 0xe7, script: 0x5, flags: 0x0}, + 396: {region: 0x164, script: 0x52, flags: 0x0}, + 397: {region: 0x164, script: 0x52, flags: 0x0}, + 398: {region: 0x6d, script: 0x52, flags: 0x0}, + 399: {region: 0x9b, script: 0x5, flags: 0x0}, + 400: {region: 0x164, script: 0x52, flags: 0x0}, + 401: {region: 0x164, script: 0x27, flags: 0x0}, + 402: {region: 0xf0, script: 0x52, flags: 0x0}, + 403: {region: 0x164, script: 0x52, flags: 0x0}, + 404: {region: 0x164, script: 0x52, flags: 0x0}, + 405: {region: 0x164, script: 0x52, flags: 0x0}, + 406: {region: 0x164, script: 0x27, flags: 0x0}, + 407: {region: 0x164, script: 0x52, flags: 0x0}, + 408: {region: 0x98, script: 0x20, flags: 0x0}, + 409: {region: 0x98, script: 0xd0, flags: 0x0}, + 410: {region: 0x94, script: 0x52, flags: 0x0}, + 411: {region: 0xd8, script: 0x52, flags: 0x0}, + 412: {region: 0x12f, script: 0x2b, flags: 0x0}, + 413: {region: 0x164, script: 0x52, flags: 0x0}, + 414: {region: 0xe, script: 0x2, flags: 0x1}, + 415: {region: 0x98, script: 0xe, flags: 0x0}, + 416: {region: 0x164, script: 0x52, flags: 0x0}, + 417: {region: 0x4d, script: 0x52, flags: 0x0}, + 418: {region: 0x98, script: 0x2e, flags: 0x0}, + 419: {region: 0x40, script: 0x52, flags: 0x0}, + 420: {region: 0x53, script: 0x52, flags: 0x0}, + 421: {region: 0x164, script: 0x52, flags: 0x0}, + 422: {region: 0x7f, script: 0x52, flags: 0x0}, + 423: {region: 0x164, script: 0x52, flags: 0x0}, + 424: {region: 0x164, script: 0x52, flags: 0x0}, + 425: {region: 0xa3, script: 0x52, flags: 0x0}, + 426: {region: 0x97, script: 0x52, flags: 0x0}, + 427: {region: 0x164, script: 0x52, flags: 0x0}, + 428: {region: 0xda, script: 0x20, flags: 0x0}, + 429: {region: 0x164, script: 0x52, flags: 0x0}, + 430: {region: 0x164, script: 0x5, flags: 0x0}, + 431: {region: 0x48, script: 0x52, flags: 0x0}, + 432: {region: 0x164, script: 0x5, flags: 0x0}, + 433: {region: 0x164, script: 0x52, flags: 0x0}, + 434: {region: 0x10, script: 0x3, flags: 0x1}, + 435: {region: 0x164, script: 0x52, flags: 0x0}, + 436: {region: 0x52, script: 0x34, flags: 0x0}, + 437: {region: 0x164, script: 0x52, flags: 0x0}, + 438: {region: 0x134, script: 0x52, flags: 0x0}, + 439: {region: 0x23, script: 0x5, flags: 0x0}, + 440: {region: 0x164, script: 0x52, flags: 0x0}, + 441: {region: 0x164, script: 0x27, flags: 0x0}, + 442: {region: 0x96, script: 0x37, flags: 0x0}, + 443: {region: 0x164, script: 0x52, flags: 0x0}, + 444: {region: 0x98, script: 0x20, flags: 0x0}, + 445: {region: 0x164, script: 0x52, flags: 0x0}, + 446: {region: 0x72, script: 0x52, flags: 0x0}, + 447: {region: 0x164, script: 0x52, flags: 0x0}, + 448: {region: 0x164, script: 0x52, flags: 0x0}, + 449: {region: 0xe6, script: 0x52, flags: 0x0}, + 450: {region: 0x164, script: 0x52, flags: 0x0}, + 451: {region: 0x12a, script: 0x39, flags: 0x0}, + 452: {region: 0x52, script: 0x81, flags: 0x0}, + 453: {region: 0x164, script: 0x52, flags: 0x0}, + 454: {region: 0xe7, script: 0x5, flags: 0x0}, + 455: {region: 0x98, script: 0x20, flags: 0x0}, + 456: {region: 0xae, script: 0x3a, flags: 0x0}, + 457: {region: 0xe6, script: 0x52, flags: 0x0}, + 458: {region: 0xe7, script: 0x5, flags: 0x0}, + 459: {region: 0xe5, script: 0x52, flags: 0x0}, + 460: {region: 0x98, script: 0x20, flags: 0x0}, + 461: {region: 0x98, script: 0x20, flags: 0x0}, + 462: {region: 0x164, script: 0x52, flags: 0x0}, + 463: {region: 0x8f, script: 0x52, flags: 0x0}, + 464: {region: 0x5f, script: 0x52, flags: 0x0}, + 465: {region: 0x52, script: 0x34, flags: 0x0}, + 466: {region: 0x90, script: 0x52, flags: 0x0}, + 467: {region: 0x91, script: 0x52, flags: 0x0}, + 468: {region: 0x164, script: 0x52, flags: 0x0}, + 469: {region: 0x27, script: 0x8, flags: 0x0}, + 470: {region: 0xd1, script: 0x52, flags: 0x0}, + 471: {region: 0x77, script: 0x52, flags: 0x0}, + 472: {region: 0x164, script: 0x52, flags: 0x0}, + 473: {region: 0x164, script: 0x52, flags: 0x0}, + 474: {region: 0xcf, script: 0x52, flags: 0x0}, + 475: {region: 0xd5, script: 0x52, flags: 0x0}, + 476: {region: 0x164, script: 0x52, flags: 0x0}, + 477: {region: 0x164, script: 0x52, flags: 0x0}, + 478: {region: 0x164, script: 0x52, flags: 0x0}, + 479: {region: 0x94, script: 0x52, flags: 0x0}, + 480: {region: 0x164, script: 0x52, flags: 0x0}, + 481: {region: 0x164, script: 0x52, flags: 0x0}, + 482: {region: 0x164, script: 0x52, flags: 0x0}, + 484: {region: 0x121, script: 0x52, flags: 0x0}, + 485: {region: 0xd5, script: 0x52, flags: 0x0}, + 486: {region: 0x164, script: 0x52, flags: 0x0}, + 487: {region: 0x164, script: 0x52, flags: 0x0}, + 488: {region: 0x52, script: 0xdf, flags: 0x0}, + 489: {region: 0x164, script: 0x52, flags: 0x0}, + 490: {region: 0x134, script: 0x52, flags: 0x0}, + 491: {region: 0x164, script: 0x52, flags: 0x0}, + 492: {region: 0x48, script: 0x52, flags: 0x0}, + 493: {region: 0x164, script: 0x52, flags: 0x0}, + 494: {region: 0x164, script: 0x52, flags: 0x0}, + 495: {region: 0xe6, script: 0x52, flags: 0x0}, + 496: {region: 0x164, script: 0x52, flags: 0x0}, + 497: {region: 0x94, script: 0x52, flags: 0x0}, + 498: {region: 0x105, script: 0x1e, flags: 0x0}, + 500: {region: 0x164, script: 0x52, flags: 0x0}, + 501: {region: 0x164, script: 0x52, flags: 0x0}, + 502: {region: 0x9c, script: 0x52, flags: 0x0}, + 503: {region: 0x9d, script: 0x52, flags: 0x0}, + 504: {region: 0x48, script: 0x17, flags: 0x0}, + 505: {region: 0x96, script: 0x37, flags: 0x0}, + 506: {region: 0x164, script: 0x52, flags: 0x0}, + 507: {region: 0x164, script: 0x52, flags: 0x0}, + 508: {region: 0x105, script: 0x52, flags: 0x0}, + 509: {region: 0x164, script: 0x52, flags: 0x0}, + 510: {region: 0xa1, script: 0x41, flags: 0x0}, + 511: {region: 0x164, script: 0x52, flags: 0x0}, + 512: {region: 0x9f, script: 0x52, flags: 0x0}, + 514: {region: 0x164, script: 0x52, flags: 0x0}, + 515: {region: 0x164, script: 0x52, flags: 0x0}, + 516: {region: 0x164, script: 0x52, flags: 0x0}, + 517: {region: 0x51, script: 0x52, flags: 0x0}, + 518: {region: 0x12f, script: 0x37, flags: 0x0}, + 519: {region: 0x164, script: 0x52, flags: 0x0}, + 520: {region: 0x12e, script: 0x52, flags: 0x0}, + 521: {region: 0xda, script: 0x20, flags: 0x0}, + 522: {region: 0x164, script: 0x52, flags: 0x0}, + 523: {region: 0x62, script: 0x52, flags: 0x0}, + 524: {region: 0x94, script: 0x52, flags: 0x0}, + 525: {region: 0x94, script: 0x52, flags: 0x0}, + 526: {region: 0x7c, script: 0x29, flags: 0x0}, + 527: {region: 0x136, script: 0x1e, flags: 0x0}, + 528: {region: 0x66, script: 0x52, flags: 0x0}, + 529: {region: 0xc3, script: 0x52, flags: 0x0}, + 530: {region: 0x164, script: 0x52, flags: 0x0}, + 531: {region: 0x164, script: 0x52, flags: 0x0}, + 532: {region: 0xd5, script: 0x52, flags: 0x0}, + 533: {region: 0xa3, script: 0x52, flags: 0x0}, + 534: {region: 0xc2, script: 0x52, flags: 0x0}, + 535: {region: 0x105, script: 0x1e, flags: 0x0}, + 536: {region: 0x164, script: 0x52, flags: 0x0}, + 537: {region: 0x164, script: 0x52, flags: 0x0}, + 538: {region: 0x164, script: 0x52, flags: 0x0}, + 539: {region: 0x164, script: 0x52, flags: 0x0}, + 540: {region: 0xd3, script: 0x5, flags: 0x0}, + 541: {region: 0xd5, script: 0x52, flags: 0x0}, + 542: {region: 0x163, script: 0x52, flags: 0x0}, + 543: {region: 0x164, script: 0x52, flags: 0x0}, + 544: {region: 0x164, script: 0x52, flags: 0x0}, + 545: {region: 0x12e, script: 0x52, flags: 0x0}, + 546: {region: 0x121, script: 0x5, flags: 0x0}, + 547: {region: 0x164, script: 0x52, flags: 0x0}, + 548: {region: 0x122, script: 0xd5, flags: 0x0}, + 549: {region: 0x59, script: 0x52, flags: 0x0}, + 550: {region: 0x51, script: 0x52, flags: 0x0}, + 551: {region: 0x164, script: 0x52, flags: 0x0}, + 552: {region: 0x4e, script: 0x52, flags: 0x0}, + 553: {region: 0x98, script: 0x20, flags: 0x0}, + 554: {region: 0x98, script: 0x20, flags: 0x0}, + 555: {region: 0x4a, script: 0x52, flags: 0x0}, + 556: {region: 0x94, script: 0x52, flags: 0x0}, + 557: {region: 0x164, script: 0x52, flags: 0x0}, + 558: {region: 0x40, script: 0x52, flags: 0x0}, + 559: {region: 0x98, script: 0x52, flags: 0x0}, + 560: {region: 0x52, script: 0xcc, flags: 0x0}, + 561: {region: 0x98, script: 0x20, flags: 0x0}, + 562: {region: 0xc2, script: 0x52, flags: 0x0}, + 563: {region: 0x164, script: 0x52, flags: 0x0}, + 564: {region: 0x98, script: 0x6b, flags: 0x0}, + 565: {region: 0xe7, script: 0x5, flags: 0x0}, + 566: {region: 0x164, script: 0x52, flags: 0x0}, + 567: {region: 0xa3, script: 0x52, flags: 0x0}, + 568: {region: 0x164, script: 0x52, flags: 0x0}, + 569: {region: 0x12a, script: 0x52, flags: 0x0}, + 570: {region: 0x164, script: 0x52, flags: 0x0}, + 571: {region: 0xd1, script: 0x52, flags: 0x0}, + 572: {region: 0x164, script: 0x52, flags: 0x0}, + 573: {region: 0xae, script: 0x4f, flags: 0x0}, + 574: {region: 0x164, script: 0x52, flags: 0x0}, + 575: {region: 0x164, script: 0x52, flags: 0x0}, + 576: {region: 0x13, script: 0x6, flags: 0x1}, + 577: {region: 0x164, script: 0x52, flags: 0x0}, + 578: {region: 0x51, script: 0x52, flags: 0x0}, + 579: {region: 0x81, script: 0x52, flags: 0x0}, + 580: {region: 0xa3, script: 0x52, flags: 0x0}, + 581: {region: 0x164, script: 0x52, flags: 0x0}, + 582: {region: 0x164, script: 0x52, flags: 0x0}, + 583: {region: 0x164, script: 0x52, flags: 0x0}, + 584: {region: 0xa5, script: 0x46, flags: 0x0}, + 585: {region: 0x29, script: 0x52, flags: 0x0}, + 586: {region: 0x164, script: 0x52, flags: 0x0}, + 587: {region: 0x164, script: 0x52, flags: 0x0}, + 588: {region: 0x164, script: 0x52, flags: 0x0}, + 589: {region: 0x164, script: 0x52, flags: 0x0}, + 590: {region: 0x164, script: 0x52, flags: 0x0}, + 591: {region: 0x98, script: 0x4a, flags: 0x0}, + 592: {region: 0x113, script: 0x52, flags: 0x0}, + 593: {region: 0x164, script: 0x52, flags: 0x0}, + 594: {region: 0xaa, script: 0x4b, flags: 0x0}, + 595: {region: 0x105, script: 0x1e, flags: 0x0}, + 596: {region: 0x98, script: 0x20, flags: 0x0}, + 597: {region: 0x164, script: 0x52, flags: 0x0}, + 598: {region: 0x74, script: 0x52, flags: 0x0}, + 599: {region: 0x164, script: 0x52, flags: 0x0}, + 600: {region: 0xb3, script: 0x52, flags: 0x0}, + 601: {region: 0x164, script: 0x52, flags: 0x0}, + 602: {region: 0x164, script: 0x52, flags: 0x0}, + 603: {region: 0x164, script: 0x52, flags: 0x0}, + 604: {region: 0x164, script: 0x52, flags: 0x0}, + 605: {region: 0x164, script: 0x52, flags: 0x0}, + 606: {region: 0x164, script: 0x52, flags: 0x0}, + 607: {region: 0x164, script: 0x52, flags: 0x0}, + 608: {region: 0x164, script: 0x27, flags: 0x0}, + 610: {region: 0x105, script: 0x1e, flags: 0x0}, + 611: {region: 0x111, script: 0x52, flags: 0x0}, + 612: {region: 0xe6, script: 0x52, flags: 0x0}, + 613: {region: 0x105, script: 0x52, flags: 0x0}, + 614: {region: 0x164, script: 0x52, flags: 0x0}, + 615: {region: 0x98, script: 0x20, flags: 0x0}, + 616: {region: 0x98, script: 0x5, flags: 0x0}, + 617: {region: 0x12e, script: 0x52, flags: 0x0}, + 618: {region: 0x164, script: 0x52, flags: 0x0}, + 619: {region: 0x51, script: 0x52, flags: 0x0}, + 620: {region: 0x5f, script: 0x52, flags: 0x0}, + 621: {region: 0x164, script: 0x52, flags: 0x0}, + 622: {region: 0x164, script: 0x52, flags: 0x0}, + 623: {region: 0x164, script: 0x27, flags: 0x0}, + 624: {region: 0x164, script: 0x52, flags: 0x0}, + 625: {region: 0x164, script: 0x52, flags: 0x0}, + 626: {region: 0x19, script: 0x3, flags: 0x1}, + 627: {region: 0x164, script: 0x52, flags: 0x0}, + 628: {region: 0x164, script: 0x52, flags: 0x0}, + 629: {region: 0x164, script: 0x52, flags: 0x0}, + 630: {region: 0x164, script: 0x52, flags: 0x0}, + 631: {region: 0x105, script: 0x1e, flags: 0x0}, + 632: {region: 0x164, script: 0x52, flags: 0x0}, + 633: {region: 0x164, script: 0x52, flags: 0x0}, + 634: {region: 0x164, script: 0x52, flags: 0x0}, + 635: {region: 0x105, script: 0x1e, flags: 0x0}, + 636: {region: 0x164, script: 0x52, flags: 0x0}, + 637: {region: 0x94, script: 0x52, flags: 0x0}, + 638: {region: 0xe7, script: 0x5, flags: 0x0}, + 639: {region: 0x7a, script: 0x52, flags: 0x0}, + 640: {region: 0x164, script: 0x52, flags: 0x0}, + 641: {region: 0x164, script: 0x52, flags: 0x0}, + 642: {region: 0x164, script: 0x52, flags: 0x0}, + 643: {region: 0x164, script: 0x27, flags: 0x0}, + 644: {region: 0x122, script: 0xd5, flags: 0x0}, + 645: {region: 0xe7, script: 0x5, flags: 0x0}, + 646: {region: 0x164, script: 0x52, flags: 0x0}, + 647: {region: 0x164, script: 0x52, flags: 0x0}, + 648: {region: 0x1c, script: 0x5, flags: 0x1}, + 649: {region: 0x164, script: 0x52, flags: 0x0}, + 650: {region: 0x164, script: 0x52, flags: 0x0}, + 651: {region: 0x164, script: 0x52, flags: 0x0}, + 652: {region: 0x137, script: 0x52, flags: 0x0}, + 653: {region: 0x86, script: 0x56, flags: 0x0}, + 654: {region: 0x96, script: 0x37, flags: 0x0}, + 655: {region: 0x12e, script: 0x52, flags: 0x0}, + 656: {region: 0xe7, script: 0x5, flags: 0x0}, + 657: {region: 0x130, script: 0x52, flags: 0x0}, + 658: {region: 0x164, script: 0x52, flags: 0x0}, + 659: {region: 0xb6, script: 0x52, flags: 0x0}, + 660: {region: 0x105, script: 0x1e, flags: 0x0}, + 661: {region: 0x164, script: 0x52, flags: 0x0}, + 662: {region: 0x94, script: 0x52, flags: 0x0}, + 663: {region: 0x164, script: 0x52, flags: 0x0}, + 664: {region: 0x52, script: 0xd5, flags: 0x0}, + 665: {region: 0x164, script: 0x52, flags: 0x0}, + 666: {region: 0x164, script: 0x52, flags: 0x0}, + 667: {region: 0x164, script: 0x52, flags: 0x0}, + 668: {region: 0x164, script: 0x52, flags: 0x0}, + 669: {region: 0x98, script: 0x54, flags: 0x0}, + 670: {region: 0x164, script: 0x52, flags: 0x0}, + 671: {region: 0x164, script: 0x52, flags: 0x0}, + 672: {region: 0x105, script: 0x1e, flags: 0x0}, + 673: {region: 0x130, script: 0x52, flags: 0x0}, + 674: {region: 0x164, script: 0x52, flags: 0x0}, + 675: {region: 0xd8, script: 0x52, flags: 0x0}, + 676: {region: 0x164, script: 0x52, flags: 0x0}, + 677: {region: 0x164, script: 0x52, flags: 0x0}, + 678: {region: 0x21, script: 0x2, flags: 0x1}, + 679: {region: 0x164, script: 0x52, flags: 0x0}, + 680: {region: 0x164, script: 0x52, flags: 0x0}, + 681: {region: 0x9d, script: 0x52, flags: 0x0}, + 682: {region: 0x52, script: 0x58, flags: 0x0}, + 683: {region: 0x94, script: 0x52, flags: 0x0}, + 684: {region: 0x9b, script: 0x5, flags: 0x0}, + 685: {region: 0x134, script: 0x52, flags: 0x0}, + 686: {region: 0x164, script: 0x52, flags: 0x0}, + 687: {region: 0x164, script: 0x52, flags: 0x0}, + 688: {region: 0x98, script: 0xd0, flags: 0x0}, + 689: {region: 0x9d, script: 0x52, flags: 0x0}, + 690: {region: 0x164, script: 0x52, flags: 0x0}, + 691: {region: 0x4a, script: 0x52, flags: 0x0}, + 692: {region: 0x164, script: 0x52, flags: 0x0}, + 693: {region: 0x164, script: 0x52, flags: 0x0}, + 694: {region: 0xae, script: 0x4f, flags: 0x0}, + 695: {region: 0x164, script: 0x52, flags: 0x0}, + 696: {region: 0x164, script: 0x52, flags: 0x0}, + 697: {region: 0x4a, script: 0x52, flags: 0x0}, + 698: {region: 0x164, script: 0x52, flags: 0x0}, + 699: {region: 0x164, script: 0x52, flags: 0x0}, + 700: {region: 0x161, script: 0x52, flags: 0x0}, + 701: {region: 0x9b, script: 0x5, flags: 0x0}, + 702: {region: 0xb5, script: 0x52, flags: 0x0}, + 703: {region: 0xb7, script: 0x52, flags: 0x0}, + 704: {region: 0x4a, script: 0x52, flags: 0x0}, + 705: {region: 0x4a, script: 0x52, flags: 0x0}, + 706: {region: 0xa3, script: 0x52, flags: 0x0}, + 707: {region: 0xa3, script: 0x52, flags: 0x0}, + 708: {region: 0x9b, script: 0x5, flags: 0x0}, + 709: {region: 0xb7, script: 0x52, flags: 0x0}, + 710: {region: 0x122, script: 0xd5, flags: 0x0}, + 711: {region: 0x52, script: 0x34, flags: 0x0}, + 712: {region: 0x12a, script: 0x52, flags: 0x0}, + 713: {region: 0x94, script: 0x52, flags: 0x0}, + 714: {region: 0x51, script: 0x52, flags: 0x0}, + 715: {region: 0x98, script: 0x20, flags: 0x0}, + 716: {region: 0x98, script: 0x20, flags: 0x0}, + 717: {region: 0x94, script: 0x52, flags: 0x0}, + 718: {region: 0x23, script: 0x3, flags: 0x1}, + 719: {region: 0xa3, script: 0x52, flags: 0x0}, + 720: {region: 0x164, script: 0x52, flags: 0x0}, + 721: {region: 0xce, script: 0x52, flags: 0x0}, + 722: {region: 0x164, script: 0x52, flags: 0x0}, + 723: {region: 0x164, script: 0x52, flags: 0x0}, + 724: {region: 0x164, script: 0x52, flags: 0x0}, + 725: {region: 0x164, script: 0x52, flags: 0x0}, + 726: {region: 0x164, script: 0x52, flags: 0x0}, + 727: {region: 0x164, script: 0x52, flags: 0x0}, + 728: {region: 0x164, script: 0x52, flags: 0x0}, + 729: {region: 0x164, script: 0x52, flags: 0x0}, + 730: {region: 0x164, script: 0x52, flags: 0x0}, + 731: {region: 0x164, script: 0x52, flags: 0x0}, + 732: {region: 0x164, script: 0x52, flags: 0x0}, + 733: {region: 0x164, script: 0x5, flags: 0x0}, + 734: {region: 0x105, script: 0x1e, flags: 0x0}, + 735: {region: 0xe6, script: 0x52, flags: 0x0}, + 736: {region: 0x164, script: 0x52, flags: 0x0}, + 737: {region: 0x94, script: 0x52, flags: 0x0}, + 738: {region: 0x164, script: 0x27, flags: 0x0}, + 739: {region: 0x164, script: 0x52, flags: 0x0}, + 740: {region: 0x164, script: 0x52, flags: 0x0}, + 741: {region: 0x164, script: 0x52, flags: 0x0}, + 742: {region: 0x111, script: 0x52, flags: 0x0}, + 743: {region: 0xa3, script: 0x52, flags: 0x0}, + 744: {region: 0x164, script: 0x52, flags: 0x0}, + 745: {region: 0x164, script: 0x52, flags: 0x0}, + 746: {region: 0x122, script: 0x5, flags: 0x0}, + 747: {region: 0xcb, script: 0x52, flags: 0x0}, + 748: {region: 0x164, script: 0x52, flags: 0x0}, + 749: {region: 0x164, script: 0x52, flags: 0x0}, + 750: {region: 0x164, script: 0x52, flags: 0x0}, + 751: {region: 0xbe, script: 0x52, flags: 0x0}, + 752: {region: 0xd0, script: 0x52, flags: 0x0}, + 753: {region: 0x164, script: 0x52, flags: 0x0}, + 754: {region: 0x51, script: 0x52, flags: 0x0}, + 755: {region: 0xda, script: 0x20, flags: 0x0}, + 756: {region: 0x12e, script: 0x52, flags: 0x0}, + 757: {region: 0xbf, script: 0x52, flags: 0x0}, + 758: {region: 0x164, script: 0x52, flags: 0x0}, + 759: {region: 0x164, script: 0x52, flags: 0x0}, + 760: {region: 0xdf, script: 0x52, flags: 0x0}, + 761: {region: 0x164, script: 0x52, flags: 0x0}, + 762: {region: 0x94, script: 0x52, flags: 0x0}, + 763: {region: 0x9a, script: 0x36, flags: 0x0}, + 764: {region: 0x164, script: 0x52, flags: 0x0}, + 765: {region: 0xc1, script: 0x1e, flags: 0x0}, + 766: {region: 0x164, script: 0x5, flags: 0x0}, + 767: {region: 0x164, script: 0x52, flags: 0x0}, + 768: {region: 0x164, script: 0x52, flags: 0x0}, + 769: {region: 0x164, script: 0x52, flags: 0x0}, + 770: {region: 0x98, script: 0x64, flags: 0x0}, + 771: {region: 0x164, script: 0x52, flags: 0x0}, + 772: {region: 0x164, script: 0x52, flags: 0x0}, + 773: {region: 0x10a, script: 0x52, flags: 0x0}, + 774: {region: 0x164, script: 0x52, flags: 0x0}, + 775: {region: 0x164, script: 0x52, flags: 0x0}, + 776: {region: 0x164, script: 0x52, flags: 0x0}, + 777: {region: 0x26, script: 0x3, flags: 0x1}, + 778: {region: 0x164, script: 0x52, flags: 0x0}, + 779: {region: 0x164, script: 0x52, flags: 0x0}, + 780: {region: 0x98, script: 0xe, flags: 0x0}, + 781: {region: 0xc3, script: 0x6b, flags: 0x0}, + 783: {region: 0x164, script: 0x52, flags: 0x0}, + 784: {region: 0x48, script: 0x52, flags: 0x0}, + 785: {region: 0x48, script: 0x52, flags: 0x0}, + 786: {region: 0x36, script: 0x52, flags: 0x0}, + 787: {region: 0x164, script: 0x52, flags: 0x0}, + 788: {region: 0x164, script: 0x52, flags: 0x0}, + 789: {region: 0x164, script: 0x52, flags: 0x0}, + 790: {region: 0x164, script: 0x52, flags: 0x0}, + 791: {region: 0x164, script: 0x52, flags: 0x0}, + 792: {region: 0x164, script: 0x52, flags: 0x0}, + 793: {region: 0x98, script: 0x20, flags: 0x0}, + 794: {region: 0xda, script: 0x20, flags: 0x0}, + 795: {region: 0x105, script: 0x1e, flags: 0x0}, + 796: {region: 0x34, script: 0x68, flags: 0x0}, + 797: {region: 0x29, script: 0x3, flags: 0x1}, + 798: {region: 0xca, script: 0x52, flags: 0x0}, + 799: {region: 0x164, script: 0x52, flags: 0x0}, + 800: {region: 0x164, script: 0x52, flags: 0x0}, + 801: {region: 0x164, script: 0x52, flags: 0x0}, + 802: {region: 0x98, script: 0x20, flags: 0x0}, + 803: {region: 0x51, script: 0x52, flags: 0x0}, + 805: {region: 0x164, script: 0x52, flags: 0x0}, + 806: {region: 0x134, script: 0x52, flags: 0x0}, + 807: {region: 0x164, script: 0x52, flags: 0x0}, + 808: {region: 0x164, script: 0x52, flags: 0x0}, + 809: {region: 0xe7, script: 0x5, flags: 0x0}, + 810: {region: 0xc2, script: 0x52, flags: 0x0}, + 811: {region: 0x98, script: 0x20, flags: 0x0}, + 812: {region: 0x94, script: 0x52, flags: 0x0}, + 813: {region: 0x163, script: 0x52, flags: 0x0}, + 814: {region: 0x164, script: 0x52, flags: 0x0}, + 815: {region: 0xc3, script: 0x6b, flags: 0x0}, + 816: {region: 0x164, script: 0x52, flags: 0x0}, + 817: {region: 0x164, script: 0x27, flags: 0x0}, + 818: {region: 0x105, script: 0x1e, flags: 0x0}, + 819: {region: 0x164, script: 0x52, flags: 0x0}, + 820: {region: 0x130, script: 0x52, flags: 0x0}, + 821: {region: 0x9b, script: 0x5d, flags: 0x0}, + 822: {region: 0x164, script: 0x52, flags: 0x0}, + 823: {region: 0x164, script: 0x52, flags: 0x0}, + 824: {region: 0x9b, script: 0x5, flags: 0x0}, + 825: {region: 0x164, script: 0x52, flags: 0x0}, + 826: {region: 0x164, script: 0x52, flags: 0x0}, + 827: {region: 0x164, script: 0x52, flags: 0x0}, + 828: {region: 0xdc, script: 0x52, flags: 0x0}, + 829: {region: 0x164, script: 0x52, flags: 0x0}, + 830: {region: 0x164, script: 0x52, flags: 0x0}, + 832: {region: 0x164, script: 0x52, flags: 0x0}, + 833: {region: 0x52, script: 0x34, flags: 0x0}, + 834: {region: 0x9d, script: 0x52, flags: 0x0}, + 835: {region: 0xd1, script: 0x52, flags: 0x0}, + 836: {region: 0x164, script: 0x52, flags: 0x0}, + 837: {region: 0xd9, script: 0x52, flags: 0x0}, + 838: {region: 0x164, script: 0x52, flags: 0x0}, + 839: {region: 0x164, script: 0x52, flags: 0x0}, + 840: {region: 0x164, script: 0x52, flags: 0x0}, + 841: {region: 0xce, script: 0x52, flags: 0x0}, + 842: {region: 0x164, script: 0x52, flags: 0x0}, + 843: {region: 0x164, script: 0x52, flags: 0x0}, + 844: {region: 0x163, script: 0x52, flags: 0x0}, + 845: {region: 0xd0, script: 0x52, flags: 0x0}, + 846: {region: 0x5f, script: 0x52, flags: 0x0}, + 847: {region: 0xda, script: 0x20, flags: 0x0}, + 848: {region: 0x164, script: 0x52, flags: 0x0}, + 849: {region: 0xda, script: 0x20, flags: 0x0}, + 850: {region: 0x164, script: 0x52, flags: 0x0}, + 851: {region: 0x164, script: 0x52, flags: 0x0}, + 852: {region: 0xd1, script: 0x52, flags: 0x0}, + 853: {region: 0x164, script: 0x52, flags: 0x0}, + 854: {region: 0x164, script: 0x52, flags: 0x0}, + 855: {region: 0xd0, script: 0x52, flags: 0x0}, + 856: {region: 0x164, script: 0x52, flags: 0x0}, + 857: {region: 0xce, script: 0x52, flags: 0x0}, + 858: {region: 0xce, script: 0x52, flags: 0x0}, + 859: {region: 0x164, script: 0x52, flags: 0x0}, + 860: {region: 0x164, script: 0x52, flags: 0x0}, + 861: {region: 0x94, script: 0x52, flags: 0x0}, + 862: {region: 0x164, script: 0x52, flags: 0x0}, + 863: {region: 0xde, script: 0x52, flags: 0x0}, + 864: {region: 0x164, script: 0x52, flags: 0x0}, + 865: {region: 0x164, script: 0x52, flags: 0x0}, + 866: {region: 0x98, script: 0x52, flags: 0x0}, + 867: {region: 0x164, script: 0x52, flags: 0x0}, + 868: {region: 0x164, script: 0x52, flags: 0x0}, + 869: {region: 0xd8, script: 0x52, flags: 0x0}, + 870: {region: 0x51, script: 0x52, flags: 0x0}, + 871: {region: 0x164, script: 0x52, flags: 0x0}, + 872: {region: 0xd9, script: 0x52, flags: 0x0}, + 873: {region: 0x164, script: 0x52, flags: 0x0}, + 874: {region: 0x51, script: 0x52, flags: 0x0}, + 875: {region: 0x164, script: 0x52, flags: 0x0}, + 876: {region: 0x164, script: 0x52, flags: 0x0}, + 877: {region: 0xd9, script: 0x52, flags: 0x0}, + 878: {region: 0x122, script: 0x4e, flags: 0x0}, + 879: {region: 0x98, script: 0x20, flags: 0x0}, + 880: {region: 0x10b, script: 0xb7, flags: 0x0}, + 881: {region: 0x164, script: 0x52, flags: 0x0}, + 882: {region: 0x164, script: 0x52, flags: 0x0}, + 883: {region: 0x83, script: 0x70, flags: 0x0}, + 884: {region: 0x160, script: 0x52, flags: 0x0}, + 885: {region: 0x164, script: 0x52, flags: 0x0}, + 886: {region: 0x48, script: 0x17, flags: 0x0}, + 887: {region: 0x164, script: 0x52, flags: 0x0}, + 888: {region: 0x160, script: 0x52, flags: 0x0}, + 889: {region: 0x164, script: 0x52, flags: 0x0}, + 890: {region: 0x164, script: 0x52, flags: 0x0}, + 891: {region: 0x164, script: 0x52, flags: 0x0}, + 892: {region: 0x164, script: 0x52, flags: 0x0}, + 893: {region: 0x164, script: 0x52, flags: 0x0}, + 894: {region: 0x116, script: 0x52, flags: 0x0}, + 895: {region: 0x164, script: 0x52, flags: 0x0}, + 896: {region: 0x164, script: 0x52, flags: 0x0}, + 897: {region: 0x134, script: 0x52, flags: 0x0}, + 898: {region: 0x164, script: 0x52, flags: 0x0}, + 899: {region: 0x52, script: 0x52, flags: 0x0}, + 900: {region: 0x164, script: 0x52, flags: 0x0}, + 901: {region: 0xcd, script: 0x52, flags: 0x0}, + 902: {region: 0x12e, script: 0x52, flags: 0x0}, + 903: {region: 0x130, script: 0x52, flags: 0x0}, + 904: {region: 0x7f, script: 0x52, flags: 0x0}, + 905: {region: 0x77, script: 0x52, flags: 0x0}, + 906: {region: 0x164, script: 0x52, flags: 0x0}, + 908: {region: 0x164, script: 0x52, flags: 0x0}, + 909: {region: 0x164, script: 0x52, flags: 0x0}, + 910: {region: 0x6e, script: 0x52, flags: 0x0}, + 911: {region: 0x164, script: 0x52, flags: 0x0}, + 912: {region: 0x164, script: 0x52, flags: 0x0}, + 913: {region: 0x164, script: 0x52, flags: 0x0}, + 914: {region: 0x164, script: 0x52, flags: 0x0}, + 915: {region: 0x98, script: 0x75, flags: 0x0}, + 916: {region: 0x164, script: 0x52, flags: 0x0}, + 917: {region: 0x164, script: 0x5, flags: 0x0}, + 918: {region: 0x7c, script: 0x1e, flags: 0x0}, + 919: {region: 0x134, script: 0x76, flags: 0x0}, + 920: {region: 0x164, script: 0x5, flags: 0x0}, + 921: {region: 0xc4, script: 0x74, flags: 0x0}, + 922: {region: 0x164, script: 0x52, flags: 0x0}, + 923: {region: 0x2c, script: 0x3, flags: 0x1}, + 924: {region: 0xe6, script: 0x52, flags: 0x0}, + 925: {region: 0x2f, script: 0x2, flags: 0x1}, + 926: {region: 0xe6, script: 0x52, flags: 0x0}, + 927: {region: 0x2f, script: 0x52, flags: 0x0}, + 928: {region: 0xef, script: 0x52, flags: 0x0}, + 929: {region: 0x164, script: 0x52, flags: 0x0}, + 930: {region: 0x77, script: 0x52, flags: 0x0}, + 931: {region: 0xd5, script: 0x52, flags: 0x0}, + 932: {region: 0x134, script: 0x52, flags: 0x0}, + 933: {region: 0x48, script: 0x52, flags: 0x0}, + 934: {region: 0x164, script: 0x52, flags: 0x0}, + 935: {region: 0x9b, script: 0xdd, flags: 0x0}, + 936: {region: 0x164, script: 0x52, flags: 0x0}, + 937: {region: 0x5f, script: 0x52, flags: 0x0}, + 938: {region: 0x164, script: 0x5, flags: 0x0}, + 939: {region: 0xaf, script: 0x7f, flags: 0x0}, + 941: {region: 0x164, script: 0x52, flags: 0x0}, + 942: {region: 0x164, script: 0x52, flags: 0x0}, + 943: {region: 0x98, script: 0x12, flags: 0x0}, + 944: {region: 0xa3, script: 0x52, flags: 0x0}, + 945: {region: 0xe8, script: 0x52, flags: 0x0}, + 946: {region: 0x164, script: 0x52, flags: 0x0}, + 947: {region: 0x9d, script: 0x52, flags: 0x0}, + 948: {region: 0x164, script: 0x52, flags: 0x0}, + 949: {region: 0x164, script: 0x52, flags: 0x0}, + 950: {region: 0x86, script: 0x2d, flags: 0x0}, + 951: {region: 0x74, script: 0x52, flags: 0x0}, + 952: {region: 0x164, script: 0x52, flags: 0x0}, + 953: {region: 0xe7, script: 0x45, flags: 0x0}, + 954: {region: 0x9b, script: 0x5, flags: 0x0}, + 955: {region: 0x1, script: 0x52, flags: 0x0}, + 956: {region: 0x23, script: 0x5, flags: 0x0}, + 957: {region: 0x164, script: 0x52, flags: 0x0}, + 958: {region: 0x40, script: 0x52, flags: 0x0}, + 959: {region: 0x164, script: 0x52, flags: 0x0}, + 960: {region: 0x79, script: 0x52, flags: 0x0}, + 961: {region: 0x164, script: 0x52, flags: 0x0}, + 962: {region: 0xe3, script: 0x52, flags: 0x0}, + 963: {region: 0x88, script: 0x52, flags: 0x0}, + 964: {region: 0x68, script: 0x52, flags: 0x0}, + 965: {region: 0x164, script: 0x52, flags: 0x0}, + 966: {region: 0x98, script: 0x20, flags: 0x0}, + 967: {region: 0x164, script: 0x52, flags: 0x0}, + 968: {region: 0x101, script: 0x52, flags: 0x0}, + 969: {region: 0x94, script: 0x52, flags: 0x0}, + 970: {region: 0x164, script: 0x52, flags: 0x0}, + 971: {region: 0x164, script: 0x52, flags: 0x0}, + 972: {region: 0x9d, script: 0x52, flags: 0x0}, + 973: {region: 0x164, script: 0x5, flags: 0x0}, + 974: {region: 0x98, script: 0x52, flags: 0x0}, + 975: {region: 0x31, script: 0x2, flags: 0x1}, + 976: {region: 0xda, script: 0x20, flags: 0x0}, + 977: {region: 0x34, script: 0xe, flags: 0x0}, + 978: {region: 0x4d, script: 0x52, flags: 0x0}, + 979: {region: 0x71, script: 0x52, flags: 0x0}, + 980: {region: 0x4d, script: 0x52, flags: 0x0}, + 981: {region: 0x9b, script: 0x5, flags: 0x0}, + 982: {region: 0x10b, script: 0x52, flags: 0x0}, + 983: {region: 0x39, script: 0x52, flags: 0x0}, + 984: {region: 0x164, script: 0x52, flags: 0x0}, + 985: {region: 0xd0, script: 0x52, flags: 0x0}, + 986: {region: 0x103, script: 0x52, flags: 0x0}, + 987: {region: 0x94, script: 0x52, flags: 0x0}, + 988: {region: 0x12e, script: 0x52, flags: 0x0}, + 989: {region: 0x164, script: 0x52, flags: 0x0}, + 990: {region: 0x164, script: 0x52, flags: 0x0}, + 991: {region: 0x72, script: 0x52, flags: 0x0}, + 992: {region: 0x105, script: 0x1e, flags: 0x0}, + 993: {region: 0x12f, script: 0x1e, flags: 0x0}, + 994: {region: 0x108, script: 0x52, flags: 0x0}, + 995: {region: 0x106, script: 0x52, flags: 0x0}, + 996: {region: 0x12e, script: 0x52, flags: 0x0}, + 997: {region: 0x164, script: 0x52, flags: 0x0}, + 998: {region: 0xa1, script: 0x44, flags: 0x0}, + 999: {region: 0x98, script: 0x20, flags: 0x0}, + 1000: {region: 0x7f, script: 0x52, flags: 0x0}, + 1001: {region: 0x105, script: 0x1e, flags: 0x0}, + 1002: {region: 0xa3, script: 0x52, flags: 0x0}, + 1003: {region: 0x94, script: 0x52, flags: 0x0}, + 1004: {region: 0x98, script: 0x52, flags: 0x0}, + 1005: {region: 0x113, script: 0x52, flags: 0x0}, + 1006: {region: 0x98, script: 0xbb, flags: 0x0}, + 1007: {region: 0x164, script: 0x52, flags: 0x0}, + 1008: {region: 0x164, script: 0x52, flags: 0x0}, + 1009: {region: 0x12e, script: 0x52, flags: 0x0}, + 1010: {region: 0x9d, script: 0x52, flags: 0x0}, + 1011: {region: 0x98, script: 0x20, flags: 0x0}, + 1012: {region: 0x164, script: 0x5, flags: 0x0}, + 1013: {region: 0x9d, script: 0x52, flags: 0x0}, + 1014: {region: 0x7a, script: 0x52, flags: 0x0}, + 1015: {region: 0x48, script: 0x52, flags: 0x0}, + 1016: {region: 0x33, script: 0x4, flags: 0x1}, + 1017: {region: 0x9d, script: 0x52, flags: 0x0}, + 1018: {region: 0x9b, script: 0x5, flags: 0x0}, + 1019: {region: 0xd9, script: 0x52, flags: 0x0}, + 1020: {region: 0x4e, script: 0x52, flags: 0x0}, + 1021: {region: 0xd0, script: 0x52, flags: 0x0}, + 1022: {region: 0xce, script: 0x52, flags: 0x0}, + 1023: {region: 0xc2, script: 0x52, flags: 0x0}, + 1024: {region: 0x4b, script: 0x52, flags: 0x0}, + 1025: {region: 0x95, script: 0x72, flags: 0x0}, + 1026: {region: 0xb5, script: 0x52, flags: 0x0}, + 1027: {region: 0x164, script: 0x27, flags: 0x0}, + 1028: {region: 0x164, script: 0x52, flags: 0x0}, + 1030: {region: 0xb9, script: 0xd2, flags: 0x0}, + 1031: {region: 0x164, script: 0x52, flags: 0x0}, + 1032: {region: 0xc3, script: 0x6b, flags: 0x0}, + 1033: {region: 0x164, script: 0x5, flags: 0x0}, + 1034: {region: 0xb2, script: 0xc1, flags: 0x0}, + 1035: {region: 0x6e, script: 0x52, flags: 0x0}, + 1036: {region: 0x164, script: 0x52, flags: 0x0}, + 1037: {region: 0x164, script: 0x52, flags: 0x0}, + 1038: {region: 0x164, script: 0x52, flags: 0x0}, + 1039: {region: 0x164, script: 0x52, flags: 0x0}, + 1040: {region: 0x110, script: 0x52, flags: 0x0}, + 1041: {region: 0x164, script: 0x52, flags: 0x0}, + 1042: {region: 0xe7, script: 0x5, flags: 0x0}, + 1043: {region: 0x164, script: 0x52, flags: 0x0}, + 1044: {region: 0x10e, script: 0x52, flags: 0x0}, + 1045: {region: 0x164, script: 0x52, flags: 0x0}, + 1046: {region: 0xe8, script: 0x52, flags: 0x0}, + 1047: {region: 0x164, script: 0x52, flags: 0x0}, + 1048: {region: 0x94, script: 0x52, flags: 0x0}, + 1049: {region: 0x141, script: 0x52, flags: 0x0}, + 1050: {region: 0x10b, script: 0x52, flags: 0x0}, + 1052: {region: 0x10b, script: 0x52, flags: 0x0}, + 1053: {region: 0x71, script: 0x52, flags: 0x0}, + 1054: {region: 0x96, script: 0xb8, flags: 0x0}, + 1055: {region: 0x164, script: 0x52, flags: 0x0}, + 1056: {region: 0x71, script: 0x52, flags: 0x0}, + 1057: {region: 0x163, script: 0x52, flags: 0x0}, + 1058: {region: 0x164, script: 0x52, flags: 0x0}, + 1059: {region: 0xc2, script: 0x52, flags: 0x0}, + 1060: {region: 0x164, script: 0x52, flags: 0x0}, + 1061: {region: 0x164, script: 0x52, flags: 0x0}, + 1062: {region: 0x164, script: 0x52, flags: 0x0}, + 1063: {region: 0x114, script: 0x52, flags: 0x0}, + 1064: {region: 0x164, script: 0x52, flags: 0x0}, + 1065: {region: 0x164, script: 0x52, flags: 0x0}, + 1066: {region: 0x122, script: 0xd5, flags: 0x0}, + 1067: {region: 0x164, script: 0x52, flags: 0x0}, + 1068: {region: 0x164, script: 0x52, flags: 0x0}, + 1069: {region: 0x164, script: 0x52, flags: 0x0}, + 1070: {region: 0x164, script: 0x52, flags: 0x0}, + 1071: {region: 0x26, script: 0x52, flags: 0x0}, + 1072: {region: 0x37, script: 0x5, flags: 0x1}, + 1073: {region: 0x98, script: 0xc2, flags: 0x0}, + 1074: {region: 0x115, script: 0x52, flags: 0x0}, + 1075: {region: 0x113, script: 0x52, flags: 0x0}, + 1076: {region: 0x98, script: 0x20, flags: 0x0}, + 1077: {region: 0x160, script: 0x52, flags: 0x0}, + 1078: {region: 0x164, script: 0x52, flags: 0x0}, + 1079: {region: 0x164, script: 0x52, flags: 0x0}, + 1080: {region: 0x6c, script: 0x52, flags: 0x0}, + 1081: {region: 0x160, script: 0x52, flags: 0x0}, + 1082: {region: 0x164, script: 0x52, flags: 0x0}, + 1083: {region: 0x5f, script: 0x52, flags: 0x0}, + 1084: {region: 0x94, script: 0x52, flags: 0x0}, + 1085: {region: 0x164, script: 0x52, flags: 0x0}, + 1086: {region: 0x164, script: 0x52, flags: 0x0}, + 1087: {region: 0x12e, script: 0x52, flags: 0x0}, + 1088: {region: 0x164, script: 0x52, flags: 0x0}, + 1089: {region: 0x83, script: 0x52, flags: 0x0}, + 1090: {region: 0x10b, script: 0x52, flags: 0x0}, + 1091: {region: 0x12e, script: 0x52, flags: 0x0}, + 1092: {region: 0x15e, script: 0x5, flags: 0x0}, + 1093: {region: 0x4a, script: 0x52, flags: 0x0}, + 1094: {region: 0x5f, script: 0x52, flags: 0x0}, + 1095: {region: 0x164, script: 0x52, flags: 0x0}, + 1096: {region: 0x98, script: 0x20, flags: 0x0}, + 1097: {region: 0x94, script: 0x52, flags: 0x0}, + 1098: {region: 0x164, script: 0x52, flags: 0x0}, + 1099: {region: 0x34, script: 0xe, flags: 0x0}, + 1100: {region: 0x9a, script: 0xc5, flags: 0x0}, + 1101: {region: 0xe8, script: 0x52, flags: 0x0}, + 1102: {region: 0x98, script: 0xcd, flags: 0x0}, + 1103: {region: 0xda, script: 0x20, flags: 0x0}, + 1104: {region: 0x164, script: 0x52, flags: 0x0}, + 1105: {region: 0x164, script: 0x52, flags: 0x0}, + 1106: {region: 0x164, script: 0x52, flags: 0x0}, + 1107: {region: 0x164, script: 0x52, flags: 0x0}, + 1108: {region: 0x164, script: 0x52, flags: 0x0}, + 1109: {region: 0x164, script: 0x52, flags: 0x0}, + 1110: {region: 0x164, script: 0x52, flags: 0x0}, + 1111: {region: 0x164, script: 0x52, flags: 0x0}, + 1112: {region: 0xe6, script: 0x52, flags: 0x0}, + 1113: {region: 0x164, script: 0x52, flags: 0x0}, + 1114: {region: 0x164, script: 0x52, flags: 0x0}, + 1115: {region: 0x98, script: 0x4a, flags: 0x0}, + 1116: {region: 0x52, script: 0xcb, flags: 0x0}, + 1117: {region: 0xda, script: 0x20, flags: 0x0}, + 1118: {region: 0xda, script: 0x20, flags: 0x0}, + 1119: {region: 0x98, script: 0xd0, flags: 0x0}, + 1120: {region: 0x164, script: 0x52, flags: 0x0}, + 1121: {region: 0x111, script: 0x52, flags: 0x0}, + 1122: {region: 0x130, script: 0x52, flags: 0x0}, + 1123: {region: 0x125, script: 0x52, flags: 0x0}, + 1124: {region: 0x164, script: 0x52, flags: 0x0}, + 1125: {region: 0x3c, script: 0x3, flags: 0x1}, + 1126: {region: 0x164, script: 0x52, flags: 0x0}, + 1127: {region: 0x164, script: 0x52, flags: 0x0}, + 1128: {region: 0x164, script: 0x52, flags: 0x0}, + 1129: {region: 0x122, script: 0xd5, flags: 0x0}, + 1130: {region: 0xda, script: 0x20, flags: 0x0}, + 1131: {region: 0xda, script: 0x20, flags: 0x0}, + 1132: {region: 0xda, script: 0x20, flags: 0x0}, + 1133: {region: 0x6e, script: 0x27, flags: 0x0}, + 1134: {region: 0x164, script: 0x52, flags: 0x0}, + 1135: {region: 0x6c, script: 0x27, flags: 0x0}, + 1136: {region: 0x164, script: 0x52, flags: 0x0}, + 1137: {region: 0x164, script: 0x52, flags: 0x0}, + 1138: {region: 0x164, script: 0x52, flags: 0x0}, + 1139: {region: 0xd5, script: 0x52, flags: 0x0}, + 1140: {region: 0x126, script: 0x52, flags: 0x0}, + 1141: {region: 0x124, script: 0x52, flags: 0x0}, + 1142: {region: 0x31, script: 0x52, flags: 0x0}, + 1143: {region: 0xda, script: 0x20, flags: 0x0}, + 1144: {region: 0xe6, script: 0x52, flags: 0x0}, + 1145: {region: 0x164, script: 0x52, flags: 0x0}, + 1146: {region: 0x164, script: 0x52, flags: 0x0}, + 1147: {region: 0x31, script: 0x52, flags: 0x0}, + 1148: {region: 0xd3, script: 0x52, flags: 0x0}, + 1149: {region: 0x164, script: 0x52, flags: 0x0}, + 1150: {region: 0x160, script: 0x52, flags: 0x0}, + 1151: {region: 0x164, script: 0x52, flags: 0x0}, + 1152: {region: 0x128, script: 0x52, flags: 0x0}, + 1153: {region: 0x164, script: 0x52, flags: 0x0}, + 1154: {region: 0xcd, script: 0x52, flags: 0x0}, + 1155: {region: 0x164, script: 0x52, flags: 0x0}, + 1156: {region: 0xe5, script: 0x52, flags: 0x0}, + 1157: {region: 0x164, script: 0x52, flags: 0x0}, + 1158: {region: 0x164, script: 0x52, flags: 0x0}, + 1159: {region: 0x164, script: 0x52, flags: 0x0}, + 1160: {region: 0x12a, script: 0x52, flags: 0x0}, + 1161: {region: 0x12a, script: 0x52, flags: 0x0}, + 1162: {region: 0x12d, script: 0x52, flags: 0x0}, + 1163: {region: 0x164, script: 0x5, flags: 0x0}, + 1164: {region: 0x160, script: 0x52, flags: 0x0}, + 1165: {region: 0x86, script: 0x2d, flags: 0x0}, + 1166: {region: 0xda, script: 0x20, flags: 0x0}, + 1167: {region: 0xe6, script: 0x52, flags: 0x0}, + 1168: {region: 0x42, script: 0xd6, flags: 0x0}, + 1169: {region: 0x164, script: 0x52, flags: 0x0}, + 1170: {region: 0x105, script: 0x1e, flags: 0x0}, + 1171: {region: 0x164, script: 0x52, flags: 0x0}, + 1172: {region: 0x164, script: 0x52, flags: 0x0}, + 1173: {region: 0x130, script: 0x52, flags: 0x0}, + 1174: {region: 0x164, script: 0x52, flags: 0x0}, + 1175: {region: 0x122, script: 0xd5, flags: 0x0}, + 1176: {region: 0x31, script: 0x52, flags: 0x0}, + 1177: {region: 0x164, script: 0x52, flags: 0x0}, + 1178: {region: 0x164, script: 0x52, flags: 0x0}, + 1179: {region: 0xcd, script: 0x52, flags: 0x0}, + 1180: {region: 0x164, script: 0x52, flags: 0x0}, + 1181: {region: 0x164, script: 0x52, flags: 0x0}, + 1182: {region: 0x12c, script: 0x52, flags: 0x0}, + 1183: {region: 0x164, script: 0x52, flags: 0x0}, + 1185: {region: 0x164, script: 0x52, flags: 0x0}, + 1186: {region: 0xd3, script: 0x52, flags: 0x0}, + 1187: {region: 0x52, script: 0xce, flags: 0x0}, + 1188: {region: 0xe4, script: 0x52, flags: 0x0}, + 1189: {region: 0x164, script: 0x52, flags: 0x0}, + 1190: {region: 0x105, script: 0x1e, flags: 0x0}, + 1191: {region: 0xb9, script: 0x52, flags: 0x0}, + 1192: {region: 0x164, script: 0x52, flags: 0x0}, + 1193: {region: 0x105, script: 0x1e, flags: 0x0}, + 1194: {region: 0x3f, script: 0x4, flags: 0x1}, + 1195: {region: 0x11b, script: 0xd8, flags: 0x0}, + 1196: {region: 0x12f, script: 0x1e, flags: 0x0}, + 1197: {region: 0x74, script: 0x52, flags: 0x0}, + 1198: {region: 0x29, script: 0x52, flags: 0x0}, + 1200: {region: 0x43, script: 0x3, flags: 0x1}, + 1201: {region: 0x98, script: 0xe, flags: 0x0}, + 1202: {region: 0xe7, script: 0x5, flags: 0x0}, + 1203: {region: 0x164, script: 0x52, flags: 0x0}, + 1204: {region: 0x164, script: 0x52, flags: 0x0}, + 1205: {region: 0x164, script: 0x52, flags: 0x0}, + 1206: {region: 0x164, script: 0x52, flags: 0x0}, + 1207: {region: 0x164, script: 0x52, flags: 0x0}, + 1208: {region: 0x164, script: 0x52, flags: 0x0}, + 1209: {region: 0x164, script: 0x52, flags: 0x0}, + 1210: {region: 0x46, script: 0x4, flags: 0x1}, + 1211: {region: 0x164, script: 0x52, flags: 0x0}, + 1212: {region: 0xb3, script: 0xd9, flags: 0x0}, + 1213: {region: 0x164, script: 0x52, flags: 0x0}, + 1214: {region: 0x160, script: 0x52, flags: 0x0}, + 1215: {region: 0x9d, script: 0x52, flags: 0x0}, + 1216: {region: 0x105, script: 0x52, flags: 0x0}, + 1217: {region: 0x13d, script: 0x52, flags: 0x0}, + 1218: {region: 0x11a, script: 0x52, flags: 0x0}, + 1219: {region: 0x164, script: 0x52, flags: 0x0}, + 1220: {region: 0x35, script: 0x52, flags: 0x0}, + 1221: {region: 0x5f, script: 0x52, flags: 0x0}, + 1222: {region: 0xd0, script: 0x52, flags: 0x0}, + 1223: {region: 0x1, script: 0x52, flags: 0x0}, + 1224: {region: 0x105, script: 0x52, flags: 0x0}, + 1225: {region: 0x69, script: 0x52, flags: 0x0}, + 1226: {region: 0x12e, script: 0x52, flags: 0x0}, + 1227: {region: 0x164, script: 0x52, flags: 0x0}, + 1228: {region: 0x35, script: 0x52, flags: 0x0}, + 1229: {region: 0x4d, script: 0x52, flags: 0x0}, + 1230: {region: 0x164, script: 0x52, flags: 0x0}, + 1231: {region: 0x6e, script: 0x27, flags: 0x0}, + 1232: {region: 0x164, script: 0x52, flags: 0x0}, + 1233: {region: 0xe6, script: 0x52, flags: 0x0}, + 1234: {region: 0x2e, script: 0x52, flags: 0x0}, + 1235: {region: 0x98, script: 0xd0, flags: 0x0}, + 1236: {region: 0x98, script: 0x20, flags: 0x0}, + 1237: {region: 0x164, script: 0x52, flags: 0x0}, + 1238: {region: 0x164, script: 0x52, flags: 0x0}, + 1239: {region: 0x164, script: 0x52, flags: 0x0}, + 1240: {region: 0x164, script: 0x52, flags: 0x0}, + 1241: {region: 0x164, script: 0x52, flags: 0x0}, + 1242: {region: 0x164, script: 0x52, flags: 0x0}, + 1243: {region: 0x164, script: 0x52, flags: 0x0}, + 1244: {region: 0x164, script: 0x52, flags: 0x0}, + 1245: {region: 0x164, script: 0x52, flags: 0x0}, + 1246: {region: 0x13f, script: 0x52, flags: 0x0}, + 1247: {region: 0x164, script: 0x52, flags: 0x0}, + 1248: {region: 0x164, script: 0x52, flags: 0x0}, + 1249: {region: 0xa7, script: 0x5, flags: 0x0}, + 1250: {region: 0x164, script: 0x52, flags: 0x0}, + 1251: {region: 0x113, script: 0x52, flags: 0x0}, + 1252: {region: 0x164, script: 0x52, flags: 0x0}, + 1253: {region: 0x164, script: 0x52, flags: 0x0}, + 1254: {region: 0x164, script: 0x52, flags: 0x0}, + 1255: {region: 0x164, script: 0x52, flags: 0x0}, + 1256: {region: 0x98, script: 0x20, flags: 0x0}, + 1257: {region: 0x52, script: 0x34, flags: 0x0}, + 1258: {region: 0x164, script: 0x52, flags: 0x0}, + 1259: {region: 0x164, script: 0x52, flags: 0x0}, + 1260: {region: 0x40, script: 0x52, flags: 0x0}, + 1261: {region: 0x164, script: 0x52, flags: 0x0}, + 1262: {region: 0x12a, script: 0x18, flags: 0x0}, + 1263: {region: 0x164, script: 0x52, flags: 0x0}, + 1264: {region: 0x160, script: 0x52, flags: 0x0}, + 1265: {region: 0x164, script: 0x52, flags: 0x0}, + 1266: {region: 0x12a, script: 0x5a, flags: 0x0}, + 1267: {region: 0x12a, script: 0x5b, flags: 0x0}, + 1268: {region: 0x7c, script: 0x29, flags: 0x0}, + 1269: {region: 0x52, script: 0x5e, flags: 0x0}, + 1270: {region: 0x10a, script: 0x62, flags: 0x0}, + 1271: {region: 0x107, script: 0x6c, flags: 0x0}, + 1272: {region: 0x98, script: 0x20, flags: 0x0}, + 1273: {region: 0x130, script: 0x52, flags: 0x0}, + 1274: {region: 0x164, script: 0x52, flags: 0x0}, + 1275: {region: 0x9b, script: 0x82, flags: 0x0}, + 1276: {region: 0x164, script: 0x52, flags: 0x0}, + 1277: {region: 0x15d, script: 0xba, flags: 0x0}, + 1278: {region: 0x164, script: 0x52, flags: 0x0}, + 1279: {region: 0x164, script: 0x52, flags: 0x0}, + 1280: {region: 0xda, script: 0x20, flags: 0x0}, + 1281: {region: 0x164, script: 0x52, flags: 0x0}, + 1282: {region: 0x164, script: 0x52, flags: 0x0}, + 1283: {region: 0xd0, script: 0x52, flags: 0x0}, + 1284: {region: 0x74, script: 0x52, flags: 0x0}, + 1285: {region: 0x164, script: 0x52, flags: 0x0}, + 1286: {region: 0x164, script: 0x52, flags: 0x0}, + 1287: {region: 0x51, script: 0x52, flags: 0x0}, + 1288: {region: 0x164, script: 0x52, flags: 0x0}, + 1289: {region: 0x164, script: 0x52, flags: 0x0}, + 1290: {region: 0x164, script: 0x52, flags: 0x0}, + 1291: {region: 0x51, script: 0x52, flags: 0x0}, + 1292: {region: 0x164, script: 0x52, flags: 0x0}, + 1293: {region: 0x164, script: 0x52, flags: 0x0}, + 1294: {region: 0x164, script: 0x52, flags: 0x0}, + 1295: {region: 0x164, script: 0x52, flags: 0x0}, + 1296: {region: 0x1, script: 0x37, flags: 0x0}, + 1297: {region: 0x164, script: 0x52, flags: 0x0}, + 1298: {region: 0x164, script: 0x52, flags: 0x0}, + 1299: {region: 0x164, script: 0x52, flags: 0x0}, + 1300: {region: 0x164, script: 0x52, flags: 0x0}, + 1301: {region: 0x164, script: 0x52, flags: 0x0}, + 1302: {region: 0xd5, script: 0x52, flags: 0x0}, + 1303: {region: 0x164, script: 0x52, flags: 0x0}, + 1304: {region: 0x164, script: 0x52, flags: 0x0}, + 1305: {region: 0x164, script: 0x52, flags: 0x0}, + 1306: {region: 0x40, script: 0x52, flags: 0x0}, + 1307: {region: 0x164, script: 0x52, flags: 0x0}, + 1308: {region: 0xce, script: 0x52, flags: 0x0}, + 1309: {region: 0x4a, script: 0x3, flags: 0x1}, + 1310: {region: 0x164, script: 0x52, flags: 0x0}, + 1311: {region: 0x164, script: 0x52, flags: 0x0}, + 1312: {region: 0x164, script: 0x52, flags: 0x0}, + 1313: {region: 0x52, script: 0x52, flags: 0x0}, + 1314: {region: 0x10a, script: 0x52, flags: 0x0}, + 1316: {region: 0xa7, script: 0x5, flags: 0x0}, + 1317: {region: 0xd8, script: 0x52, flags: 0x0}, + 1318: {region: 0xb9, script: 0xd2, flags: 0x0}, + 1319: {region: 0x4d, script: 0x14, flags: 0x1}, + 1320: {region: 0x164, script: 0x52, flags: 0x0}, + 1321: {region: 0x121, script: 0x52, flags: 0x0}, + 1322: {region: 0xcf, script: 0x52, flags: 0x0}, + 1323: {region: 0x164, script: 0x52, flags: 0x0}, + 1324: {region: 0x160, script: 0x52, flags: 0x0}, + 1326: {region: 0x12a, script: 0x52, flags: 0x0}, } // likelyLangList holds lists info associated with likelyLang. -// Size: 396 bytes, 99 elements -var likelyLangList = [99]likelyScriptRegion{ - 0: {region: 0x9a, script: 0x7, flags: 0x0}, - 1: {region: 0x9f, script: 0x6d, flags: 0x2}, - 2: {region: 0x11a, script: 0x78, flags: 0x2}, +// Size: 388 bytes, 97 elements +var likelyLangList = [97]likelyScriptRegion{ + 0: {region: 0x9b, script: 0x7, flags: 0x0}, + 1: {region: 0xa0, script: 0x6d, flags: 0x2}, + 2: {region: 0x11b, script: 0x78, flags: 0x2}, 3: {region: 0x31, script: 0x52, flags: 0x0}, - 4: {region: 0x99, script: 0x5, flags: 0x4}, - 5: {region: 0x9a, script: 0x5, flags: 0x4}, - 6: {region: 0x104, script: 0x1e, flags: 0x4}, - 7: {region: 0x9a, script: 0x5, flags: 0x2}, - 8: {region: 0x97, script: 0xe, flags: 0x0}, - 9: {region: 0x34, script: 0x16, flags: 0x2}, - 10: {region: 0x104, script: 0x1e, flags: 0x0}, - 11: {region: 0x37, script: 0x2a, flags: 0x2}, - 12: {region: 0x132, script: 0x52, flags: 0x0}, - 13: {region: 0x79, script: 0xbd, flags: 0x2}, - 14: {region: 0x112, script: 0x52, flags: 0x0}, - 15: {region: 0x82, script: 0x1, flags: 0x2}, - 16: {region: 0x5c, script: 0x1d, flags: 0x0}, - 17: {region: 0x85, script: 0x57, flags: 0x2}, - 18: {region: 0xd4, script: 0x52, flags: 0x0}, - 19: {region: 0x51, script: 0x5, flags: 0x4}, - 20: {region: 0x109, script: 0x5, flags: 0x4}, - 21: {region: 0xac, script: 0x1e, flags: 0x0}, - 22: {region: 0x23, script: 0x5, flags: 0x4}, - 23: {region: 0x52, script: 0x5, flags: 0x4}, - 24: {region: 0x9a, script: 0x5, flags: 0x4}, - 25: {region: 0xc3, script: 0x5, flags: 0x4}, - 26: {region: 0x52, script: 0x5, flags: 0x2}, - 27: {region: 0x129, script: 0x52, flags: 0x0}, - 28: {region: 0xae, script: 0x5, flags: 0x4}, - 29: {region: 0x99, script: 0x5, flags: 0x2}, - 30: {region: 0xa3, script: 0x1e, flags: 0x0}, - 31: {region: 0x52, script: 0x5, flags: 0x4}, - 32: {region: 0x129, script: 0x52, flags: 0x4}, - 33: {region: 0x52, script: 0x5, flags: 0x2}, - 34: {region: 0x129, script: 0x52, flags: 0x2}, - 35: {region: 0xd9, script: 0x20, flags: 0x0}, - 36: {region: 0x97, script: 0x55, flags: 0x2}, - 37: {region: 0x81, script: 0x52, flags: 0x0}, - 38: {region: 0x82, script: 0x70, flags: 0x4}, - 39: {region: 0x82, script: 0x70, flags: 0x2}, - 40: {region: 0xc3, script: 0x1e, flags: 0x0}, - 41: {region: 0x52, script: 0x66, flags: 0x4}, - 42: {region: 0x52, script: 0x66, flags: 0x2}, - 43: {region: 0xce, script: 0x52, flags: 0x0}, - 44: {region: 0x49, script: 0x5, flags: 0x4}, - 45: {region: 0x93, script: 0x5, flags: 0x4}, - 46: {region: 0x97, script: 0x2f, flags: 0x0}, - 47: {region: 0xe6, script: 0x5, flags: 0x4}, - 48: {region: 0xe6, script: 0x5, flags: 0x2}, - 49: {region: 0x9a, script: 0x7c, flags: 0x0}, - 50: {region: 0x52, script: 0x7d, flags: 0x2}, - 51: {region: 0xb8, script: 0xd2, flags: 0x0}, - 52: {region: 0xd7, script: 0x52, flags: 0x4}, - 53: {region: 0xe6, script: 0x5, flags: 0x0}, - 54: {region: 0x97, script: 0x20, flags: 0x2}, - 55: {region: 0x97, script: 0x47, flags: 0x2}, - 56: {region: 0x97, script: 0xc0, flags: 0x2}, - 57: {region: 0x103, script: 0x1e, flags: 0x0}, - 58: {region: 0xbb, script: 0x52, flags: 0x4}, - 59: {region: 0x102, script: 0x52, flags: 0x4}, - 60: {region: 0x104, script: 0x52, flags: 0x4}, - 61: {region: 0x129, script: 0x52, flags: 0x4}, - 62: {region: 0x122, script: 0x1e, flags: 0x0}, - 63: {region: 0xe6, script: 0x5, flags: 0x4}, - 64: {region: 0xe6, script: 0x5, flags: 0x2}, - 65: {region: 0x52, script: 0x5, flags: 0x0}, - 66: {region: 0xac, script: 0x1e, flags: 0x4}, - 67: {region: 0xc3, script: 0x1e, flags: 0x4}, - 68: {region: 0xac, script: 0x1e, flags: 0x2}, - 69: {region: 0x97, script: 0xe, flags: 0x0}, - 70: {region: 0xd9, script: 0x20, flags: 0x4}, - 71: {region: 0xd9, script: 0x20, flags: 0x2}, - 72: {region: 0x134, script: 0x52, flags: 0x0}, - 73: {region: 0x23, script: 0x5, flags: 0x4}, - 74: {region: 0x52, script: 0x1e, flags: 0x4}, - 75: {region: 0x23, script: 0x5, flags: 0x2}, - 76: {region: 0x8b, script: 0x35, flags: 0x0}, - 77: {region: 0x52, script: 0x34, flags: 0x4}, - 78: {region: 0x52, script: 0x34, flags: 0x2}, - 79: {region: 0x52, script: 0x34, flags: 0x0}, - 80: {region: 0x2e, script: 0x35, flags: 0x4}, - 81: {region: 0x3d, script: 0x35, flags: 0x4}, - 82: {region: 0x79, script: 0x35, flags: 0x4}, - 83: {region: 0x7c, script: 0x35, flags: 0x4}, - 84: {region: 0x8b, script: 0x35, flags: 0x4}, - 85: {region: 0x93, script: 0x35, flags: 0x4}, - 86: {region: 0xc4, script: 0x35, flags: 0x4}, - 87: {region: 0xce, script: 0x35, flags: 0x4}, - 88: {region: 0xe0, script: 0x35, flags: 0x4}, - 89: {region: 0xe3, script: 0x35, flags: 0x4}, - 90: {region: 0xe5, script: 0x35, flags: 0x4}, - 91: {region: 0x114, script: 0x35, flags: 0x4}, - 92: {region: 0x121, script: 0x35, flags: 0x4}, - 93: {region: 0x12c, script: 0x35, flags: 0x4}, - 94: {region: 0x132, script: 0x35, flags: 0x4}, - 95: {region: 0x13b, script: 0x35, flags: 0x4}, - 96: {region: 0x12c, script: 0x11, flags: 0x2}, - 97: {region: 0x12c, script: 0x30, flags: 0x2}, - 98: {region: 0x12c, script: 0x35, flags: 0x2}, + 4: {region: 0x9a, script: 0x5, flags: 0x4}, + 5: {region: 0x9b, script: 0x5, flags: 0x4}, + 6: {region: 0x105, script: 0x1e, flags: 0x4}, + 7: {region: 0x9b, script: 0x5, flags: 0x2}, + 8: {region: 0x105, script: 0x1e, flags: 0x0}, + 9: {region: 0x37, script: 0x2a, flags: 0x2}, + 10: {region: 0x134, script: 0x52, flags: 0x0}, + 11: {region: 0x7a, script: 0xbd, flags: 0x2}, + 12: {region: 0x113, script: 0x52, flags: 0x0}, + 13: {region: 0x83, script: 0x1, flags: 0x2}, + 14: {region: 0x5c, script: 0x1d, flags: 0x0}, + 15: {region: 0x86, script: 0x57, flags: 0x2}, + 16: {region: 0xd5, script: 0x52, flags: 0x0}, + 17: {region: 0x51, script: 0x5, flags: 0x4}, + 18: {region: 0x10a, script: 0x5, flags: 0x4}, + 19: {region: 0xad, script: 0x1e, flags: 0x0}, + 20: {region: 0x23, script: 0x5, flags: 0x4}, + 21: {region: 0x52, script: 0x5, flags: 0x4}, + 22: {region: 0x9b, script: 0x5, flags: 0x4}, + 23: {region: 0xc4, script: 0x5, flags: 0x4}, + 24: {region: 0x52, script: 0x5, flags: 0x2}, + 25: {region: 0x12a, script: 0x52, flags: 0x0}, + 26: {region: 0xaf, script: 0x5, flags: 0x4}, + 27: {region: 0x9a, script: 0x5, flags: 0x2}, + 28: {region: 0xa4, script: 0x1e, flags: 0x0}, + 29: {region: 0x52, script: 0x5, flags: 0x4}, + 30: {region: 0x12a, script: 0x52, flags: 0x4}, + 31: {region: 0x52, script: 0x5, flags: 0x2}, + 32: {region: 0x12a, script: 0x52, flags: 0x2}, + 33: {region: 0xda, script: 0x20, flags: 0x0}, + 34: {region: 0x98, script: 0x55, flags: 0x2}, + 35: {region: 0x82, script: 0x52, flags: 0x0}, + 36: {region: 0x83, script: 0x70, flags: 0x4}, + 37: {region: 0x83, script: 0x70, flags: 0x2}, + 38: {region: 0xc4, script: 0x1e, flags: 0x0}, + 39: {region: 0x52, script: 0x66, flags: 0x4}, + 40: {region: 0x52, script: 0x66, flags: 0x2}, + 41: {region: 0xcf, script: 0x52, flags: 0x0}, + 42: {region: 0x49, script: 0x5, flags: 0x4}, + 43: {region: 0x94, script: 0x5, flags: 0x4}, + 44: {region: 0x98, script: 0x2f, flags: 0x0}, + 45: {region: 0xe7, script: 0x5, flags: 0x4}, + 46: {region: 0xe7, script: 0x5, flags: 0x2}, + 47: {region: 0x9b, script: 0x7c, flags: 0x0}, + 48: {region: 0x52, script: 0x7d, flags: 0x2}, + 49: {region: 0xb9, script: 0xd2, flags: 0x0}, + 50: {region: 0xd8, script: 0x52, flags: 0x4}, + 51: {region: 0xe7, script: 0x5, flags: 0x0}, + 52: {region: 0x98, script: 0x20, flags: 0x2}, + 53: {region: 0x98, script: 0x47, flags: 0x2}, + 54: {region: 0x98, script: 0xc0, flags: 0x2}, + 55: {region: 0x104, script: 0x1e, flags: 0x0}, + 56: {region: 0xbc, script: 0x52, flags: 0x4}, + 57: {region: 0x103, script: 0x52, flags: 0x4}, + 58: {region: 0x105, script: 0x52, flags: 0x4}, + 59: {region: 0x12a, script: 0x52, flags: 0x4}, + 60: {region: 0x123, script: 0x1e, flags: 0x0}, + 61: {region: 0xe7, script: 0x5, flags: 0x4}, + 62: {region: 0xe7, script: 0x5, flags: 0x2}, + 63: {region: 0x52, script: 0x5, flags: 0x0}, + 64: {region: 0xad, script: 0x1e, flags: 0x4}, + 65: {region: 0xc4, script: 0x1e, flags: 0x4}, + 66: {region: 0xad, script: 0x1e, flags: 0x2}, + 67: {region: 0x98, script: 0xe, flags: 0x0}, + 68: {region: 0xda, script: 0x20, flags: 0x4}, + 69: {region: 0xda, script: 0x20, flags: 0x2}, + 70: {region: 0x136, script: 0x52, flags: 0x0}, + 71: {region: 0x23, script: 0x5, flags: 0x4}, + 72: {region: 0x52, script: 0x1e, flags: 0x4}, + 73: {region: 0x23, script: 0x5, flags: 0x2}, + 74: {region: 0x8c, script: 0x35, flags: 0x0}, + 75: {region: 0x52, script: 0x34, flags: 0x4}, + 76: {region: 0x52, script: 0x34, flags: 0x2}, + 77: {region: 0x52, script: 0x34, flags: 0x0}, + 78: {region: 0x2e, script: 0x35, flags: 0x4}, + 79: {region: 0x3d, script: 0x35, flags: 0x4}, + 80: {region: 0x7a, script: 0x35, flags: 0x4}, + 81: {region: 0x7d, script: 0x35, flags: 0x4}, + 82: {region: 0x8c, script: 0x35, flags: 0x4}, + 83: {region: 0x94, script: 0x35, flags: 0x4}, + 84: {region: 0xc5, script: 0x35, flags: 0x4}, + 85: {region: 0xcf, script: 0x35, flags: 0x4}, + 86: {region: 0xe1, script: 0x35, flags: 0x4}, + 87: {region: 0xe4, script: 0x35, flags: 0x4}, + 88: {region: 0xe6, script: 0x35, flags: 0x4}, + 89: {region: 0x115, script: 0x35, flags: 0x4}, + 90: {region: 0x122, script: 0x35, flags: 0x4}, + 91: {region: 0x12d, script: 0x35, flags: 0x4}, + 92: {region: 0x134, script: 0x35, flags: 0x4}, + 93: {region: 0x13d, script: 0x35, flags: 0x4}, + 94: {region: 0x12d, script: 0x11, flags: 0x2}, + 95: {region: 0x12d, script: 0x30, flags: 0x2}, + 96: {region: 0x12d, script: 0x35, flags: 0x2}, } type likelyLangScript struct { @@ -2163,307 +2924,308 @@ type likelyLangScript struct { // for a given regionID, lang and script are the index and size respectively // of the list in likelyRegionList. // TODO: exclude containers and user-definable regions from the list. -// Size: 1420 bytes, 355 elements -var likelyRegion = [355]likelyLangScript{ - 33: {lang: 0x61, script: 0x52, flags: 0x0}, - 34: {lang: 0x15, script: 0x5, flags: 0x0}, +// Size: 1428 bytes, 357 elements +var likelyRegion = [357]likelyLangScript{ + 33: {lang: 0xd7, script: 0x52, flags: 0x0}, + 34: {lang: 0x3a, script: 0x5, flags: 0x0}, 35: {lang: 0x0, script: 0x2, flags: 0x1}, 38: {lang: 0x2, script: 0x2, flags: 0x1}, 39: {lang: 0x4, script: 0x2, flags: 0x1}, - 41: {lang: 0x1ef, script: 0x52, flags: 0x0}, + 41: {lang: 0x3be, script: 0x52, flags: 0x0}, 42: {lang: 0x0, script: 0x52, flags: 0x0}, - 43: {lang: 0x9d, script: 0x52, flags: 0x0}, - 44: {lang: 0x22f, script: 0x52, flags: 0x0}, - 45: {lang: 0x85, script: 0x52, flags: 0x0}, - 47: {lang: 0x1bd, script: 0x52, flags: 0x0}, - 48: {lang: 0x247, script: 0x52, flags: 0x0}, - 49: {lang: 0x24, script: 0x52, flags: 0x0}, + 43: {lang: 0x13d, script: 0x52, flags: 0x0}, + 44: {lang: 0x419, script: 0x52, flags: 0x0}, + 45: {lang: 0x10c, script: 0x52, flags: 0x0}, + 47: {lang: 0x365, script: 0x52, flags: 0x0}, + 48: {lang: 0x442, script: 0x52, flags: 0x0}, + 49: {lang: 0x58, script: 0x52, flags: 0x0}, 50: {lang: 0x6, script: 0x2, flags: 0x1}, - 52: {lang: 0x4b, script: 0xe, flags: 0x0}, - 53: {lang: 0x1bd, script: 0x52, flags: 0x0}, - 54: {lang: 0xaf, script: 0x52, flags: 0x0}, - 55: {lang: 0x38, script: 0x1e, flags: 0x0}, - 56: {lang: 0x15, script: 0x5, flags: 0x0}, - 57: {lang: 0x201, script: 0x52, flags: 0x0}, - 58: {lang: 0xaf, script: 0x52, flags: 0x0}, - 59: {lang: 0xaf, script: 0x52, flags: 0x0}, - 61: {lang: 0x19a, script: 0x52, flags: 0x0}, - 62: {lang: 0x9d, script: 0x52, flags: 0x0}, - 63: {lang: 0x1db, script: 0x52, flags: 0x0}, - 64: {lang: 0x1ef, script: 0x52, flags: 0x0}, + 52: {lang: 0xa5, script: 0xe, flags: 0x0}, + 53: {lang: 0x365, script: 0x52, flags: 0x0}, + 54: {lang: 0x15d, script: 0x52, flags: 0x0}, + 55: {lang: 0x7e, script: 0x1e, flags: 0x0}, + 56: {lang: 0x3a, script: 0x5, flags: 0x0}, + 57: {lang: 0x3d7, script: 0x52, flags: 0x0}, + 58: {lang: 0x15d, script: 0x52, flags: 0x0}, + 59: {lang: 0x15d, script: 0x52, flags: 0x0}, + 61: {lang: 0x31d, script: 0x52, flags: 0x0}, + 62: {lang: 0x13d, script: 0x52, flags: 0x0}, + 63: {lang: 0x39f, script: 0x52, flags: 0x0}, + 64: {lang: 0x3be, script: 0x52, flags: 0x0}, 66: {lang: 0x8, script: 0x2, flags: 0x1}, 68: {lang: 0x0, script: 0x52, flags: 0x0}, - 70: {lang: 0x2f, script: 0x1e, flags: 0x0}, - 72: {lang: 0x2b9, script: 0x37, flags: 0x2}, - 73: {lang: 0x19a, script: 0x5, flags: 0x2}, - 74: {lang: 0x248, script: 0x52, flags: 0x0}, - 75: {lang: 0xaf, script: 0x52, flags: 0x0}, - 76: {lang: 0xaf, script: 0x52, flags: 0x0}, - 77: {lang: 0x85, script: 0x52, flags: 0x0}, - 78: {lang: 0xaf, script: 0x52, flags: 0x0}, - 80: {lang: 0x9d, script: 0x52, flags: 0x0}, - 81: {lang: 0xaf, script: 0x52, flags: 0x0}, + 70: {lang: 0x71, script: 0x1e, flags: 0x0}, + 72: {lang: 0x510, script: 0x37, flags: 0x2}, + 73: {lang: 0x31d, script: 0x5, flags: 0x2}, + 74: {lang: 0x443, script: 0x52, flags: 0x0}, + 75: {lang: 0x15d, script: 0x52, flags: 0x0}, + 76: {lang: 0x15d, script: 0x52, flags: 0x0}, + 77: {lang: 0x10c, script: 0x52, flags: 0x0}, + 78: {lang: 0x15d, script: 0x52, flags: 0x0}, + 80: {lang: 0x13d, script: 0x52, flags: 0x0}, + 81: {lang: 0x15d, script: 0x52, flags: 0x0}, 82: {lang: 0xa, script: 0x5, flags: 0x1}, - 83: {lang: 0x9d, script: 0x52, flags: 0x0}, + 83: {lang: 0x13d, script: 0x52, flags: 0x0}, 84: {lang: 0x0, script: 0x52, flags: 0x0}, - 85: {lang: 0x9d, script: 0x52, flags: 0x0}, - 88: {lang: 0x9d, script: 0x52, flags: 0x0}, - 89: {lang: 0x1ef, script: 0x52, flags: 0x0}, - 90: {lang: 0x1db, script: 0x52, flags: 0x0}, + 85: {lang: 0x13d, script: 0x52, flags: 0x0}, + 88: {lang: 0x13d, script: 0x52, flags: 0x0}, + 89: {lang: 0x3be, script: 0x52, flags: 0x0}, + 90: {lang: 0x39f, script: 0x52, flags: 0x0}, 92: {lang: 0xf, script: 0x2, flags: 0x1}, - 93: {lang: 0x79, script: 0x52, flags: 0x0}, - 95: {lang: 0x85, script: 0x52, flags: 0x0}, + 93: {lang: 0xf9, script: 0x52, flags: 0x0}, + 95: {lang: 0x10c, script: 0x52, flags: 0x0}, 97: {lang: 0x1, script: 0x52, flags: 0x0}, - 98: {lang: 0x80, script: 0x52, flags: 0x0}, - 100: {lang: 0x9d, script: 0x52, flags: 0x0}, + 98: {lang: 0x100, script: 0x52, flags: 0x0}, + 100: {lang: 0x13d, script: 0x52, flags: 0x0}, 102: {lang: 0x11, script: 0x2, flags: 0x1}, - 103: {lang: 0x9d, script: 0x52, flags: 0x0}, - 104: {lang: 0x9d, script: 0x52, flags: 0x0}, - 105: {lang: 0x9f, script: 0x52, flags: 0x0}, - 106: {lang: 0x15, script: 0x5, flags: 0x0}, - 107: {lang: 0x15, script: 0x5, flags: 0x0}, - 108: {lang: 0x261, script: 0x27, flags: 0x0}, - 109: {lang: 0x9d, script: 0x52, flags: 0x0}, + 103: {lang: 0x13d, script: 0x52, flags: 0x0}, + 104: {lang: 0x13d, script: 0x52, flags: 0x0}, + 105: {lang: 0x13f, script: 0x52, flags: 0x0}, + 106: {lang: 0x3a, script: 0x5, flags: 0x0}, + 107: {lang: 0x3a, script: 0x5, flags: 0x0}, + 108: {lang: 0x46d, script: 0x27, flags: 0x0}, + 109: {lang: 0x13d, script: 0x52, flags: 0x0}, 110: {lang: 0x13, script: 0x2, flags: 0x1}, - 112: {lang: 0xa8, script: 0x52, flags: 0x0}, - 113: {lang: 0xe2, script: 0x20, flags: 0x2}, - 116: {lang: 0xad, script: 0x52, flags: 0x0}, - 118: {lang: 0xaf, script: 0x52, flags: 0x0}, - 120: {lang: 0xaf, script: 0x52, flags: 0x0}, - 121: {lang: 0x15, script: 0x2, flags: 0x1}, - 123: {lang: 0x17, script: 0x3, flags: 0x1}, - 124: {lang: 0xaf, script: 0x52, flags: 0x0}, - 126: {lang: 0xd, script: 0x52, flags: 0x0}, - 128: {lang: 0x131, script: 0x52, flags: 0x0}, - 130: {lang: 0xaf, script: 0x52, flags: 0x0}, - 131: {lang: 0xaf, script: 0x52, flags: 0x0}, - 132: {lang: 0x9d, script: 0x52, flags: 0x0}, - 133: {lang: 0x1a, script: 0x2, flags: 0x1}, - 134: {lang: 0x0, script: 0x52, flags: 0x0}, - 135: {lang: 0x9d, script: 0x52, flags: 0x0}, - 137: {lang: 0x1ef, script: 0x52, flags: 0x0}, - 139: {lang: 0x2c4, script: 0x35, flags: 0x0}, - 140: {lang: 0x0, script: 0x52, flags: 0x0}, - 141: {lang: 0x9d, script: 0x52, flags: 0x0}, - 142: {lang: 0xee, script: 0x52, flags: 0x0}, - 143: {lang: 0xf1, script: 0x52, flags: 0x0}, - 144: {lang: 0xf2, script: 0x52, flags: 0x0}, - 146: {lang: 0x9d, script: 0x52, flags: 0x0}, - 147: {lang: 0x1c, script: 0x2, flags: 0x1}, - 149: {lang: 0xe0, script: 0x37, flags: 0x0}, - 151: {lang: 0x1e, script: 0x3, flags: 0x1}, - 153: {lang: 0x15, script: 0x5, flags: 0x0}, - 154: {lang: 0x21, script: 0x2, flags: 0x1}, - 155: {lang: 0x102, script: 0x52, flags: 0x0}, - 156: {lang: 0x103, script: 0x52, flags: 0x0}, - 159: {lang: 0x15, script: 0x5, flags: 0x0}, - 160: {lang: 0x107, script: 0x41, flags: 0x0}, - 162: {lang: 0x248, script: 0x52, flags: 0x0}, - 163: {lang: 0x14d, script: 0x1e, flags: 0x0}, - 164: {lang: 0x23, script: 0x3, flags: 0x1}, - 166: {lang: 0x26, script: 0x2, flags: 0x1}, - 168: {lang: 0x136, script: 0x4b, flags: 0x0}, - 169: {lang: 0x136, script: 0x4b, flags: 0x0}, - 170: {lang: 0x15, script: 0x5, flags: 0x0}, - 172: {lang: 0x207, script: 0x1e, flags: 0x0}, - 173: {lang: 0x28, script: 0x2, flags: 0x1}, - 174: {lang: 0x15, script: 0x5, flags: 0x0}, - 176: {lang: 0x85, script: 0x52, flags: 0x0}, - 177: {lang: 0x228, script: 0xc1, flags: 0x0}, - 179: {lang: 0x242, script: 0x52, flags: 0x0}, - 180: {lang: 0x169, script: 0x52, flags: 0x0}, - 181: {lang: 0xaf, script: 0x52, flags: 0x0}, - 182: {lang: 0x170, script: 0x52, flags: 0x0}, - 183: {lang: 0x15, script: 0x5, flags: 0x0}, - 184: {lang: 0x2a, script: 0x2, flags: 0x1}, - 185: {lang: 0xaf, script: 0x52, flags: 0x0}, - 186: {lang: 0x2c, script: 0x2, flags: 0x1}, - 187: {lang: 0x23b, script: 0x52, flags: 0x0}, - 188: {lang: 0xaf, script: 0x52, flags: 0x0}, - 189: {lang: 0x183, script: 0x52, flags: 0x0}, - 192: {lang: 0x2e, script: 0x2, flags: 0x1}, - 193: {lang: 0x49, script: 0x52, flags: 0x0}, - 194: {lang: 0x30, script: 0x2, flags: 0x1}, - 195: {lang: 0x32, script: 0x2, flags: 0x1}, - 196: {lang: 0x34, script: 0x2, flags: 0x1}, - 198: {lang: 0xaf, script: 0x52, flags: 0x0}, - 199: {lang: 0x36, script: 0x2, flags: 0x1}, - 201: {lang: 0x19b, script: 0x52, flags: 0x0}, - 202: {lang: 0x38, script: 0x3, flags: 0x1}, - 203: {lang: 0x90, script: 0xd4, flags: 0x0}, - 205: {lang: 0x9d, script: 0x52, flags: 0x0}, - 206: {lang: 0x19a, script: 0x52, flags: 0x0}, - 207: {lang: 0x1ef, script: 0x52, flags: 0x0}, - 208: {lang: 0xa, script: 0x52, flags: 0x0}, - 209: {lang: 0xaf, script: 0x52, flags: 0x0}, - 210: {lang: 0xdc, script: 0x52, flags: 0x0}, - 212: {lang: 0xdc, script: 0x5, flags: 0x2}, - 214: {lang: 0x9d, script: 0x52, flags: 0x0}, - 215: {lang: 0x1bd, script: 0x52, flags: 0x0}, - 216: {lang: 0x1af, script: 0x52, flags: 0x0}, - 217: {lang: 0x1b4, script: 0x20, flags: 0x0}, - 223: {lang: 0x15, script: 0x5, flags: 0x0}, - 224: {lang: 0x9d, script: 0x52, flags: 0x0}, - 226: {lang: 0x9d, script: 0x52, flags: 0x0}, - 227: {lang: 0xaf, script: 0x52, flags: 0x0}, - 228: {lang: 0x26e, script: 0x52, flags: 0x0}, - 229: {lang: 0xaa, script: 0x52, flags: 0x0}, - 230: {lang: 0x3b, script: 0x3, flags: 0x1}, - 231: {lang: 0x3e, script: 0x2, flags: 0x1}, - 232: {lang: 0xaf, script: 0x52, flags: 0x0}, - 234: {lang: 0x9d, script: 0x52, flags: 0x0}, - 235: {lang: 0x15, script: 0x5, flags: 0x0}, - 236: {lang: 0x1ef, script: 0x52, flags: 0x0}, - 238: {lang: 0x1dc, script: 0x52, flags: 0x0}, - 239: {lang: 0xca, script: 0x52, flags: 0x0}, - 241: {lang: 0x15, script: 0x5, flags: 0x0}, - 256: {lang: 0xaf, script: 0x52, flags: 0x0}, - 258: {lang: 0x40, script: 0x2, flags: 0x1}, - 259: {lang: 0x23b, script: 0x1e, flags: 0x0}, - 260: {lang: 0x42, script: 0x2, flags: 0x1}, - 261: {lang: 0x20a, script: 0x52, flags: 0x0}, - 262: {lang: 0x15, script: 0x5, flags: 0x0}, - 264: {lang: 0xaf, script: 0x52, flags: 0x0}, - 265: {lang: 0x15, script: 0x5, flags: 0x0}, - 266: {lang: 0x44, script: 0x2, flags: 0x1}, - 269: {lang: 0x22c, script: 0x52, flags: 0x0}, - 270: {lang: 0x1af, script: 0x52, flags: 0x0}, - 271: {lang: 0x46, script: 0x2, flags: 0x1}, - 273: {lang: 0x103, script: 0x52, flags: 0x0}, - 274: {lang: 0xaf, script: 0x52, flags: 0x0}, - 275: {lang: 0x238, script: 0x52, flags: 0x0}, - 276: {lang: 0x1bd, script: 0x52, flags: 0x0}, - 278: {lang: 0x1ef, script: 0x52, flags: 0x0}, - 280: {lang: 0x9d, script: 0x52, flags: 0x0}, - 282: {lang: 0x48, script: 0x2, flags: 0x1}, - 286: {lang: 0xaf, script: 0x52, flags: 0x0}, - 287: {lang: 0xaf, script: 0x52, flags: 0x0}, - 288: {lang: 0xaf, script: 0x52, flags: 0x0}, - 289: {lang: 0x4a, script: 0x3, flags: 0x1}, - 290: {lang: 0x4d, script: 0x2, flags: 0x1}, - 291: {lang: 0x265, script: 0x52, flags: 0x0}, - 292: {lang: 0x1ef, script: 0x52, flags: 0x0}, - 293: {lang: 0x264, script: 0x52, flags: 0x0}, - 294: {lang: 0x4f, script: 0x2, flags: 0x1}, - 295: {lang: 0x26c, script: 0x52, flags: 0x0}, - 297: {lang: 0x51, script: 0x4, flags: 0x1}, - 299: {lang: 0x27c, script: 0x52, flags: 0x0}, - 300: {lang: 0x55, script: 0x2, flags: 0x1}, - 301: {lang: 0x248, script: 0x52, flags: 0x0}, - 302: {lang: 0x57, script: 0x3, flags: 0x1}, - 303: {lang: 0x248, script: 0x52, flags: 0x0}, - 306: {lang: 0x2b9, script: 0x37, flags: 0x2}, - 307: {lang: 0x9d, script: 0x52, flags: 0x0}, - 308: {lang: 0x28d, script: 0x52, flags: 0x0}, - 309: {lang: 0x103, script: 0x52, flags: 0x0}, - 312: {lang: 0x9d, script: 0x52, flags: 0x0}, - 315: {lang: 0x292, script: 0x52, flags: 0x0}, - 316: {lang: 0x41, script: 0x52, flags: 0x0}, - 317: {lang: 0xaf, script: 0x52, flags: 0x0}, - 319: {lang: 0x22f, script: 0x52, flags: 0x0}, - 330: {lang: 0x5a, script: 0x2, flags: 0x1}, - 347: {lang: 0x15, script: 0x5, flags: 0x0}, - 348: {lang: 0x5c, script: 0x2, flags: 0x1}, - 353: {lang: 0x236, script: 0x52, flags: 0x0}, + 112: {lang: 0x10c, script: 0x52, flags: 0x0}, + 113: {lang: 0x150, script: 0x52, flags: 0x0}, + 114: {lang: 0x1be, script: 0x20, flags: 0x2}, + 117: {lang: 0x157, script: 0x52, flags: 0x0}, + 119: {lang: 0x15d, script: 0x52, flags: 0x0}, + 121: {lang: 0x15d, script: 0x52, flags: 0x0}, + 122: {lang: 0x15, script: 0x2, flags: 0x1}, + 124: {lang: 0x17, script: 0x3, flags: 0x1}, + 125: {lang: 0x15d, script: 0x52, flags: 0x0}, + 127: {lang: 0x21, script: 0x52, flags: 0x0}, + 129: {lang: 0x243, script: 0x52, flags: 0x0}, + 131: {lang: 0x15d, script: 0x52, flags: 0x0}, + 132: {lang: 0x15d, script: 0x52, flags: 0x0}, + 133: {lang: 0x13d, script: 0x52, flags: 0x0}, + 134: {lang: 0x1a, script: 0x2, flags: 0x1}, + 135: {lang: 0x0, script: 0x52, flags: 0x0}, + 136: {lang: 0x13d, script: 0x52, flags: 0x0}, + 138: {lang: 0x3be, script: 0x52, flags: 0x0}, + 140: {lang: 0x527, script: 0x35, flags: 0x0}, + 141: {lang: 0x0, script: 0x52, flags: 0x0}, + 142: {lang: 0x13d, script: 0x52, flags: 0x0}, + 143: {lang: 0x1cf, script: 0x52, flags: 0x0}, + 144: {lang: 0x1d2, script: 0x52, flags: 0x0}, + 145: {lang: 0x1d3, script: 0x52, flags: 0x0}, + 147: {lang: 0x13d, script: 0x52, flags: 0x0}, + 148: {lang: 0x1c, script: 0x2, flags: 0x1}, + 150: {lang: 0x1ba, script: 0x37, flags: 0x0}, + 152: {lang: 0x1e, script: 0x3, flags: 0x1}, + 154: {lang: 0x3a, script: 0x5, flags: 0x0}, + 155: {lang: 0x21, script: 0x2, flags: 0x1}, + 156: {lang: 0x1f6, script: 0x52, flags: 0x0}, + 157: {lang: 0x1f7, script: 0x52, flags: 0x0}, + 160: {lang: 0x3a, script: 0x5, flags: 0x0}, + 161: {lang: 0x1fe, script: 0x41, flags: 0x0}, + 163: {lang: 0x443, script: 0x52, flags: 0x0}, + 164: {lang: 0x288, script: 0x1e, flags: 0x0}, + 165: {lang: 0x23, script: 0x3, flags: 0x1}, + 167: {lang: 0x26, script: 0x2, flags: 0x1}, + 169: {lang: 0x252, script: 0x4b, flags: 0x0}, + 170: {lang: 0x252, script: 0x4b, flags: 0x0}, + 171: {lang: 0x3a, script: 0x5, flags: 0x0}, + 173: {lang: 0x3e0, script: 0x1e, flags: 0x0}, + 174: {lang: 0x28, script: 0x2, flags: 0x1}, + 175: {lang: 0x3a, script: 0x5, flags: 0x0}, + 177: {lang: 0x10c, script: 0x52, flags: 0x0}, + 178: {lang: 0x40a, script: 0xc1, flags: 0x0}, + 180: {lang: 0x439, script: 0x52, flags: 0x0}, + 181: {lang: 0x2be, script: 0x52, flags: 0x0}, + 182: {lang: 0x15d, script: 0x52, flags: 0x0}, + 183: {lang: 0x2c5, script: 0x52, flags: 0x0}, + 184: {lang: 0x3a, script: 0x5, flags: 0x0}, + 185: {lang: 0x2a, script: 0x2, flags: 0x1}, + 186: {lang: 0x15d, script: 0x52, flags: 0x0}, + 187: {lang: 0x2c, script: 0x2, flags: 0x1}, + 188: {lang: 0x430, script: 0x52, flags: 0x0}, + 189: {lang: 0x15d, script: 0x52, flags: 0x0}, + 190: {lang: 0x2ef, script: 0x52, flags: 0x0}, + 193: {lang: 0x2e, script: 0x2, flags: 0x1}, + 194: {lang: 0xa0, script: 0x52, flags: 0x0}, + 195: {lang: 0x30, script: 0x2, flags: 0x1}, + 196: {lang: 0x32, script: 0x2, flags: 0x1}, + 197: {lang: 0x34, script: 0x2, flags: 0x1}, + 199: {lang: 0x15d, script: 0x52, flags: 0x0}, + 200: {lang: 0x36, script: 0x2, flags: 0x1}, + 202: {lang: 0x31e, script: 0x52, flags: 0x0}, + 203: {lang: 0x38, script: 0x3, flags: 0x1}, + 204: {lang: 0x127, script: 0xd4, flags: 0x0}, + 206: {lang: 0x13d, script: 0x52, flags: 0x0}, + 207: {lang: 0x31d, script: 0x52, flags: 0x0}, + 208: {lang: 0x3be, script: 0x52, flags: 0x0}, + 209: {lang: 0x16, script: 0x52, flags: 0x0}, + 210: {lang: 0x15d, script: 0x52, flags: 0x0}, + 211: {lang: 0x1b2, script: 0x52, flags: 0x0}, + 213: {lang: 0x1b2, script: 0x5, flags: 0x2}, + 215: {lang: 0x13d, script: 0x52, flags: 0x0}, + 216: {lang: 0x365, script: 0x52, flags: 0x0}, + 217: {lang: 0x345, script: 0x52, flags: 0x0}, + 218: {lang: 0x34f, script: 0x20, flags: 0x0}, + 224: {lang: 0x3a, script: 0x5, flags: 0x0}, + 225: {lang: 0x13d, script: 0x52, flags: 0x0}, + 227: {lang: 0x13d, script: 0x52, flags: 0x0}, + 228: {lang: 0x15d, script: 0x52, flags: 0x0}, + 229: {lang: 0x484, script: 0x52, flags: 0x0}, + 230: {lang: 0x152, script: 0x52, flags: 0x0}, + 231: {lang: 0x3b, script: 0x3, flags: 0x1}, + 232: {lang: 0x3b1, script: 0x52, flags: 0x0}, + 233: {lang: 0x15d, script: 0x52, flags: 0x0}, + 235: {lang: 0x13d, script: 0x52, flags: 0x0}, + 236: {lang: 0x3a, script: 0x5, flags: 0x0}, + 237: {lang: 0x3be, script: 0x52, flags: 0x0}, + 239: {lang: 0x3a0, script: 0x52, flags: 0x0}, + 240: {lang: 0x192, script: 0x52, flags: 0x0}, + 242: {lang: 0x3a, script: 0x5, flags: 0x0}, + 257: {lang: 0x15d, script: 0x52, flags: 0x0}, + 259: {lang: 0x3e, script: 0x2, flags: 0x1}, + 260: {lang: 0x430, script: 0x1e, flags: 0x0}, + 261: {lang: 0x40, script: 0x2, flags: 0x1}, + 262: {lang: 0x3e3, script: 0x52, flags: 0x0}, + 263: {lang: 0x3a, script: 0x5, flags: 0x0}, + 265: {lang: 0x15d, script: 0x52, flags: 0x0}, + 266: {lang: 0x3a, script: 0x5, flags: 0x0}, + 267: {lang: 0x42, script: 0x2, flags: 0x1}, + 270: {lang: 0x414, script: 0x52, flags: 0x0}, + 271: {lang: 0x345, script: 0x52, flags: 0x0}, + 272: {lang: 0x44, script: 0x2, flags: 0x1}, + 274: {lang: 0x1f7, script: 0x52, flags: 0x0}, + 275: {lang: 0x15d, script: 0x52, flags: 0x0}, + 276: {lang: 0x427, script: 0x52, flags: 0x0}, + 277: {lang: 0x365, script: 0x52, flags: 0x0}, + 279: {lang: 0x3be, script: 0x52, flags: 0x0}, + 281: {lang: 0x13d, script: 0x52, flags: 0x0}, + 283: {lang: 0x46, script: 0x2, flags: 0x1}, + 287: {lang: 0x15d, script: 0x52, flags: 0x0}, + 288: {lang: 0x15d, script: 0x52, flags: 0x0}, + 289: {lang: 0x48, script: 0x2, flags: 0x1}, + 290: {lang: 0x4a, script: 0x3, flags: 0x1}, + 291: {lang: 0x4d, script: 0x2, flags: 0x1}, + 292: {lang: 0x475, script: 0x52, flags: 0x0}, + 293: {lang: 0x3be, script: 0x52, flags: 0x0}, + 294: {lang: 0x474, script: 0x52, flags: 0x0}, + 295: {lang: 0x4f, script: 0x2, flags: 0x1}, + 296: {lang: 0x480, script: 0x52, flags: 0x0}, + 298: {lang: 0x51, script: 0x4, flags: 0x1}, + 300: {lang: 0x49e, script: 0x52, flags: 0x0}, + 301: {lang: 0x55, script: 0x2, flags: 0x1}, + 302: {lang: 0x443, script: 0x52, flags: 0x0}, + 303: {lang: 0x57, script: 0x3, flags: 0x1}, + 304: {lang: 0x443, script: 0x52, flags: 0x0}, + 308: {lang: 0x510, script: 0x37, flags: 0x2}, + 309: {lang: 0x13d, script: 0x52, flags: 0x0}, + 310: {lang: 0x4ba, script: 0x52, flags: 0x0}, + 311: {lang: 0x1f7, script: 0x52, flags: 0x0}, + 314: {lang: 0x13d, script: 0x52, flags: 0x0}, + 317: {lang: 0x4c1, script: 0x52, flags: 0x0}, + 318: {lang: 0x8a, script: 0x52, flags: 0x0}, + 319: {lang: 0x15d, script: 0x52, flags: 0x0}, + 321: {lang: 0x419, script: 0x52, flags: 0x0}, + 332: {lang: 0x5a, script: 0x2, flags: 0x1}, + 349: {lang: 0x3a, script: 0x5, flags: 0x0}, + 350: {lang: 0x5c, script: 0x2, flags: 0x1}, + 355: {lang: 0x421, script: 0x52, flags: 0x0}, } // likelyRegionList holds lists info associated with likelyRegion. // Size: 376 bytes, 94 elements var likelyRegionList = [94]likelyLangScript{ - 0: {lang: 0xa4, script: 0x5, flags: 0x0}, - 1: {lang: 0x264, script: 0x52, flags: 0x0}, - 2: {lang: 0x23a, script: 0x52, flags: 0x0}, - 3: {lang: 0x18c, script: 0x1e, flags: 0x0}, - 4: {lang: 0xf3, script: 0x8, flags: 0x0}, - 5: {lang: 0x145, script: 0x52, flags: 0x0}, - 6: {lang: 0x54, script: 0x52, flags: 0x0}, - 7: {lang: 0x23b, script: 0x1e, flags: 0x0}, - 8: {lang: 0x93, script: 0xd6, flags: 0x0}, - 9: {lang: 0x1b4, script: 0x20, flags: 0x0}, - 10: {lang: 0x2c4, script: 0x34, flags: 0x0}, - 11: {lang: 0x284, script: 0x5, flags: 0x0}, - 12: {lang: 0x2bd, script: 0x35, flags: 0x0}, - 13: {lang: 0x2be, script: 0x52, flags: 0x0}, - 14: {lang: 0x157, script: 0xd5, flags: 0x0}, - 15: {lang: 0x9a, script: 0x2d, flags: 0x0}, - 16: {lang: 0x26f, script: 0x52, flags: 0x0}, - 17: {lang: 0x15, script: 0x5, flags: 0x0}, - 18: {lang: 0xaf, script: 0x52, flags: 0x0}, - 19: {lang: 0x11, script: 0x27, flags: 0x0}, - 20: {lang: 0x9b, script: 0x52, flags: 0x0}, - 21: {lang: 0x141, script: 0x5, flags: 0x2}, - 22: {lang: 0x2b9, script: 0x37, flags: 0x2}, - 23: {lang: 0x111, script: 0x29, flags: 0x0}, - 24: {lang: 0x2, script: 0x1e, flags: 0x0}, - 25: {lang: 0x145, script: 0x52, flags: 0x0}, - 26: {lang: 0x9a, script: 0x2d, flags: 0x0}, - 27: {lang: 0x18c, script: 0x1e, flags: 0x0}, - 28: {lang: 0xf8, script: 0x52, flags: 0x0}, - 29: {lang: 0x19a, script: 0x5, flags: 0x0}, - 30: {lang: 0xe1, script: 0x20, flags: 0x0}, - 31: {lang: 0x28c, script: 0x5, flags: 0x0}, - 32: {lang: 0x129, script: 0x6b, flags: 0x0}, - 33: {lang: 0xa4, script: 0x5, flags: 0x0}, - 34: {lang: 0x264, script: 0x52, flags: 0x0}, - 35: {lang: 0x133, script: 0x46, flags: 0x0}, - 36: {lang: 0x6d, script: 0x5, flags: 0x0}, - 37: {lang: 0x11c, script: 0xd5, flags: 0x0}, - 38: {lang: 0x15, script: 0x5, flags: 0x0}, - 39: {lang: 0xaf, script: 0x52, flags: 0x0}, - 40: {lang: 0x165, script: 0x4f, flags: 0x0}, - 41: {lang: 0x11c, script: 0xd5, flags: 0x0}, - 42: {lang: 0x15, script: 0x5, flags: 0x0}, - 43: {lang: 0xaf, script: 0x52, flags: 0x0}, - 44: {lang: 0x203, script: 0x52, flags: 0x0}, - 45: {lang: 0x286, script: 0x1e, flags: 0x0}, - 46: {lang: 0x18c, script: 0x1e, flags: 0x0}, - 47: {lang: 0x23a, script: 0x52, flags: 0x0}, - 48: {lang: 0x1a5, script: 0x6b, flags: 0x0}, - 49: {lang: 0x114, script: 0x52, flags: 0x0}, - 50: {lang: 0x18f, script: 0x1e, flags: 0x0}, - 51: {lang: 0x12f, script: 0x5, flags: 0x0}, - 52: {lang: 0x2c4, script: 0x35, flags: 0x0}, - 53: {lang: 0x1ef, script: 0x52, flags: 0x0}, - 54: {lang: 0x15, script: 0x5, flags: 0x0}, - 55: {lang: 0xaf, script: 0x52, flags: 0x0}, - 56: {lang: 0x182, script: 0x52, flags: 0x0}, - 57: {lang: 0x28c, script: 0x5, flags: 0x0}, - 58: {lang: 0x40, script: 0x20, flags: 0x0}, - 59: {lang: 0x28c, script: 0x5, flags: 0x0}, - 60: {lang: 0x28c, script: 0x5, flags: 0x0}, - 61: {lang: 0x58, script: 0x20, flags: 0x0}, - 62: {lang: 0x1e7, script: 0x52, flags: 0x0}, - 63: {lang: 0x2f, script: 0x1e, flags: 0x0}, - 64: {lang: 0x203, script: 0x52, flags: 0x0}, - 65: {lang: 0x38, script: 0x1e, flags: 0x0}, - 66: {lang: 0x207, script: 0x1e, flags: 0x0}, - 67: {lang: 0x13f, script: 0x52, flags: 0x0}, - 68: {lang: 0x247, script: 0x52, flags: 0x0}, - 69: {lang: 0x2b9, script: 0x37, flags: 0x0}, - 70: {lang: 0x22a, script: 0x52, flags: 0x0}, - 71: {lang: 0x286, script: 0x1e, flags: 0x0}, - 72: {lang: 0x15, script: 0x5, flags: 0x0}, - 73: {lang: 0xaf, script: 0x52, flags: 0x0}, - 74: {lang: 0x25d, script: 0xd5, flags: 0x0}, - 75: {lang: 0x181, script: 0x5, flags: 0x0}, - 76: {lang: 0x191, script: 0x6b, flags: 0x0}, - 77: {lang: 0x25c, script: 0x1e, flags: 0x0}, - 78: {lang: 0xa4, script: 0x5, flags: 0x0}, - 79: {lang: 0x15, script: 0x5, flags: 0x0}, - 80: {lang: 0xaf, script: 0x52, flags: 0x0}, - 81: {lang: 0x26f, script: 0x52, flags: 0x0}, - 82: {lang: 0x24, script: 0x5, flags: 0x0}, - 83: {lang: 0x118, script: 0x1e, flags: 0x0}, - 84: {lang: 0x3b, script: 0x2d, flags: 0x0}, - 85: {lang: 0x2c4, script: 0x35, flags: 0x0}, - 86: {lang: 0x271, script: 0x52, flags: 0x0}, - 87: {lang: 0x286, script: 0x1e, flags: 0x0}, - 88: {lang: 0x2b9, script: 0x37, flags: 0x0}, - 89: {lang: 0x1e7, script: 0x52, flags: 0x0}, - 90: {lang: 0x23a, script: 0x52, flags: 0x0}, - 91: {lang: 0x23b, script: 0x1e, flags: 0x0}, - 92: {lang: 0xaf, script: 0x52, flags: 0x0}, - 93: {lang: 0x249, script: 0x5, flags: 0x0}, + 0: {lang: 0x147, script: 0x5, flags: 0x0}, + 1: {lang: 0x474, script: 0x52, flags: 0x0}, + 2: {lang: 0x42f, script: 0x52, flags: 0x0}, + 3: {lang: 0x2fd, script: 0x1e, flags: 0x0}, + 4: {lang: 0x1d5, script: 0x8, flags: 0x0}, + 5: {lang: 0x272, script: 0x52, flags: 0x0}, + 6: {lang: 0xb7, script: 0x52, flags: 0x0}, + 7: {lang: 0x430, script: 0x1e, flags: 0x0}, + 8: {lang: 0x12c, script: 0xd6, flags: 0x0}, + 9: {lang: 0x34f, script: 0x20, flags: 0x0}, + 10: {lang: 0x527, script: 0x34, flags: 0x0}, + 11: {lang: 0x4aa, script: 0x5, flags: 0x0}, + 12: {lang: 0x51d, script: 0x35, flags: 0x0}, + 13: {lang: 0x521, script: 0x52, flags: 0x0}, + 14: {lang: 0x298, script: 0xd5, flags: 0x0}, + 15: {lang: 0x135, script: 0x2d, flags: 0x0}, + 16: {lang: 0x488, script: 0x52, flags: 0x0}, + 17: {lang: 0x3a, script: 0x5, flags: 0x0}, + 18: {lang: 0x15d, script: 0x52, flags: 0x0}, + 19: {lang: 0x27, script: 0x27, flags: 0x0}, + 20: {lang: 0x138, script: 0x52, flags: 0x0}, + 21: {lang: 0x268, script: 0x5, flags: 0x2}, + 22: {lang: 0x510, script: 0x37, flags: 0x2}, + 23: {lang: 0x20e, script: 0x29, flags: 0x0}, + 24: {lang: 0x5, script: 0x1e, flags: 0x0}, + 25: {lang: 0x272, script: 0x52, flags: 0x0}, + 26: {lang: 0x135, script: 0x2d, flags: 0x0}, + 27: {lang: 0x2fd, script: 0x1e, flags: 0x0}, + 28: {lang: 0x1df, script: 0x52, flags: 0x0}, + 29: {lang: 0x31d, script: 0x5, flags: 0x0}, + 30: {lang: 0x1bc, script: 0x20, flags: 0x0}, + 31: {lang: 0x4b2, script: 0x5, flags: 0x0}, + 32: {lang: 0x234, script: 0x6b, flags: 0x0}, + 33: {lang: 0x147, script: 0x5, flags: 0x0}, + 34: {lang: 0x474, script: 0x52, flags: 0x0}, + 35: {lang: 0x248, script: 0x46, flags: 0x0}, + 36: {lang: 0xe6, script: 0x5, flags: 0x0}, + 37: {lang: 0x224, script: 0xd5, flags: 0x0}, + 38: {lang: 0x3a, script: 0x5, flags: 0x0}, + 39: {lang: 0x15d, script: 0x52, flags: 0x0}, + 40: {lang: 0x2b6, script: 0x4f, flags: 0x0}, + 41: {lang: 0x224, script: 0xd5, flags: 0x0}, + 42: {lang: 0x3a, script: 0x5, flags: 0x0}, + 43: {lang: 0x15d, script: 0x52, flags: 0x0}, + 44: {lang: 0x3da, script: 0x52, flags: 0x0}, + 45: {lang: 0x4ac, script: 0x1e, flags: 0x0}, + 46: {lang: 0x2fd, script: 0x1e, flags: 0x0}, + 47: {lang: 0x42f, script: 0x52, flags: 0x0}, + 48: {lang: 0x32f, script: 0x6b, flags: 0x0}, + 49: {lang: 0x211, script: 0x52, flags: 0x0}, + 50: {lang: 0x309, script: 0x1e, flags: 0x0}, + 51: {lang: 0x240, script: 0x5, flags: 0x0}, + 52: {lang: 0x527, script: 0x35, flags: 0x0}, + 53: {lang: 0x3be, script: 0x52, flags: 0x0}, + 54: {lang: 0x3a, script: 0x5, flags: 0x0}, + 55: {lang: 0x15d, script: 0x52, flags: 0x0}, + 56: {lang: 0x2eb, script: 0x52, flags: 0x0}, + 57: {lang: 0x4b2, script: 0x5, flags: 0x0}, + 58: {lang: 0x88, script: 0x20, flags: 0x0}, + 59: {lang: 0x4b2, script: 0x5, flags: 0x0}, + 60: {lang: 0x4b2, script: 0x5, flags: 0x0}, + 61: {lang: 0xbe, script: 0x20, flags: 0x0}, + 62: {lang: 0x3da, script: 0x52, flags: 0x0}, + 63: {lang: 0x7e, script: 0x1e, flags: 0x0}, + 64: {lang: 0x3e0, script: 0x1e, flags: 0x0}, + 65: {lang: 0x265, script: 0x52, flags: 0x0}, + 66: {lang: 0x442, script: 0x52, flags: 0x0}, + 67: {lang: 0x510, script: 0x37, flags: 0x0}, + 68: {lang: 0x410, script: 0x52, flags: 0x0}, + 69: {lang: 0x4ac, script: 0x1e, flags: 0x0}, + 70: {lang: 0x3a, script: 0x5, flags: 0x0}, + 71: {lang: 0x15d, script: 0x52, flags: 0x0}, + 72: {lang: 0x15d, script: 0x52, flags: 0x0}, + 73: {lang: 0x35, script: 0x5, flags: 0x0}, + 74: {lang: 0x469, script: 0xd5, flags: 0x0}, + 75: {lang: 0x2ea, script: 0x5, flags: 0x0}, + 76: {lang: 0x30d, script: 0x6b, flags: 0x0}, + 77: {lang: 0x465, script: 0x1e, flags: 0x0}, + 78: {lang: 0x147, script: 0x5, flags: 0x0}, + 79: {lang: 0x3a, script: 0x5, flags: 0x0}, + 80: {lang: 0x15d, script: 0x52, flags: 0x0}, + 81: {lang: 0x488, script: 0x52, flags: 0x0}, + 82: {lang: 0x58, script: 0x5, flags: 0x0}, + 83: {lang: 0x217, script: 0x1e, flags: 0x0}, + 84: {lang: 0x81, script: 0x2d, flags: 0x0}, + 85: {lang: 0x527, script: 0x35, flags: 0x0}, + 86: {lang: 0x48a, script: 0x52, flags: 0x0}, + 87: {lang: 0x4ac, script: 0x1e, flags: 0x0}, + 88: {lang: 0x510, script: 0x37, flags: 0x0}, + 89: {lang: 0x3b1, script: 0x52, flags: 0x0}, + 90: {lang: 0x42f, script: 0x52, flags: 0x0}, + 91: {lang: 0x430, script: 0x1e, flags: 0x0}, + 92: {lang: 0x15d, script: 0x52, flags: 0x0}, + 93: {lang: 0x444, script: 0x5, flags: 0x0}, } type likelyTag struct { @@ -2474,186 +3236,287 @@ type likelyTag struct { // Size: 192 bytes, 32 elements var likelyRegionGroup = [32]likelyTag{ - 1: {lang: 0x9b, region: 0xd4, script: 0x52}, - 2: {lang: 0x9b, region: 0x132, script: 0x52}, - 3: {lang: 0x1ef, region: 0x40, script: 0x52}, - 4: {lang: 0x9b, region: 0x2e, script: 0x52}, - 5: {lang: 0x9b, region: 0xd4, script: 0x52}, - 6: {lang: 0x9d, region: 0xcd, script: 0x52}, - 7: {lang: 0x248, region: 0x12d, script: 0x52}, - 8: {lang: 0x15, region: 0x6a, script: 0x5}, - 9: {lang: 0x248, region: 0x4a, script: 0x52}, - 10: {lang: 0x9b, region: 0x15e, script: 0x52}, - 11: {lang: 0x9b, region: 0x132, script: 0x52}, - 12: {lang: 0x9b, region: 0x132, script: 0x52}, - 13: {lang: 0x9d, region: 0x58, script: 0x52}, - 14: {lang: 0x2c4, region: 0x52, script: 0x34}, - 15: {lang: 0xe1, region: 0x97, script: 0x20}, - 16: {lang: 0xf8, region: 0x93, script: 0x52}, - 17: {lang: 0x103, region: 0x9c, script: 0x52}, - 18: {lang: 0x9b, region: 0x2e, script: 0x52}, - 19: {lang: 0x9b, region: 0xe4, script: 0x52}, - 20: {lang: 0x9b, region: 0x88, script: 0x52}, - 21: {lang: 0x22f, region: 0x13f, script: 0x52}, - 22: {lang: 0x2c4, region: 0x52, script: 0x34}, - 23: {lang: 0x28d, region: 0x134, script: 0x52}, - 24: {lang: 0x15, region: 0x106, script: 0x5}, - 25: {lang: 0x207, region: 0x104, script: 0x1e}, - 26: {lang: 0x207, region: 0x104, script: 0x1e}, - 27: {lang: 0x9b, region: 0x79, script: 0x52}, - 28: {lang: 0x85, region: 0x5f, script: 0x52}, - 29: {lang: 0x9d, region: 0x1e, script: 0x52}, - 30: {lang: 0x9b, region: 0x98, script: 0x52}, - 31: {lang: 0x9b, region: 0x79, script: 0x52}, + 1: {lang: 0x138, region: 0xd5, script: 0x52}, + 2: {lang: 0x138, region: 0x134, script: 0x52}, + 3: {lang: 0x3be, region: 0x40, script: 0x52}, + 4: {lang: 0x138, region: 0x2e, script: 0x52}, + 5: {lang: 0x138, region: 0xd5, script: 0x52}, + 6: {lang: 0x13d, region: 0xce, script: 0x52}, + 7: {lang: 0x443, region: 0x12e, script: 0x52}, + 8: {lang: 0x3a, region: 0x6a, script: 0x5}, + 9: {lang: 0x443, region: 0x4a, script: 0x52}, + 10: {lang: 0x138, region: 0x160, script: 0x52}, + 11: {lang: 0x138, region: 0x134, script: 0x52}, + 12: {lang: 0x138, region: 0x134, script: 0x52}, + 13: {lang: 0x13d, region: 0x58, script: 0x52}, + 14: {lang: 0x527, region: 0x52, script: 0x34}, + 15: {lang: 0x1bc, region: 0x98, script: 0x20}, + 16: {lang: 0x1df, region: 0x94, script: 0x52}, + 17: {lang: 0x1f7, region: 0x9d, script: 0x52}, + 18: {lang: 0x138, region: 0x2e, script: 0x52}, + 19: {lang: 0x138, region: 0xe5, script: 0x52}, + 20: {lang: 0x138, region: 0x89, script: 0x52}, + 21: {lang: 0x419, region: 0x141, script: 0x52}, + 22: {lang: 0x527, region: 0x52, script: 0x34}, + 23: {lang: 0x4ba, region: 0x136, script: 0x52}, + 24: {lang: 0x3a, region: 0x107, script: 0x5}, + 25: {lang: 0x3e0, region: 0x105, script: 0x1e}, + 26: {lang: 0x3e0, region: 0x105, script: 0x1e}, + 27: {lang: 0x138, region: 0x7a, script: 0x52}, + 28: {lang: 0x10c, region: 0x5f, script: 0x52}, + 29: {lang: 0x13d, region: 0x1e, script: 0x52}, + 30: {lang: 0x138, region: 0x99, script: 0x52}, + 31: {lang: 0x138, region: 0x7a, script: 0x52}, +} + +// Size: 357 bytes, 357 elements +var regionToGroups = [357]uint8{ + // Entry 0 - 3F + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, + // Entry 40 - 7F + 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, + // Entry 80 - BF + 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x01, 0x00, 0x04, 0x02, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, + // Entry C0 - FF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x04, + 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 100 - 13F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, 0x00, 0x00, + 0x04, 0x00, 0x04, 0x04, 0x05, 0x00, 0x00, 0x00, + // Entry 140 - 17F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, } type mutualIntelligibility struct { - want uint16 - have uint16 - conf uint8 - oneway bool + want uint16 + have uint16 + distance uint8 + oneway bool } type scriptIntelligibility struct { - lang uint16 - want uint8 - have uint8 - conf uint8 + wantLang uint16 + haveLang uint16 + wantScript uint8 + haveScript uint8 + distance uint8 +} + +type regionIntelligibility struct { + lang uint16 + script uint8 + group uint8 + distance uint8 } // matchLang holds pairs of langIDs of base languages that are typically // mutually intelligible. Each pair is associated with a confidence and // whether the intelligibility goes one or both ways. -// Size: 708 bytes, 118 elements -var matchLang = [118]mutualIntelligibility{ - 0: {want: 0x1c1, have: 0x1af, conf: 0x2, oneway: false}, - 1: {want: 0x145, have: 0x6f, conf: 0x2, oneway: false}, - 2: {want: 0xee, have: 0x54, conf: 0x2, oneway: false}, - 3: {want: 0x225, have: 0x54, conf: 0x2, oneway: false}, - 4: {want: 0x23b, have: 0x54, conf: 0x2, oneway: false}, - 5: {want: 0x225, have: 0xee, conf: 0x2, oneway: false}, - 6: {want: 0x23b, have: 0xee, conf: 0x2, oneway: false}, - 7: {want: 0x225, have: 0x23b, conf: 0x2, oneway: false}, - 8: {want: 0x241, have: 0x1, conf: 0x2, oneway: false}, - 9: {want: 0xd2, have: 0x85, conf: 0x2, oneway: true}, - 10: {want: 0x154, have: 0x85, conf: 0x2, oneway: true}, - 11: {want: 0x80, have: 0x1c1, conf: 0x2, oneway: false}, - 12: {want: 0x80, have: 0x1af, conf: 0x2, oneway: false}, - 13: {want: 0x6f, have: 0x145, conf: 0x2, oneway: false}, - 14: {want: 0x2, have: 0x207, conf: 0x2, oneway: true}, - 15: {want: 0x5, have: 0x9b, conf: 0x2, oneway: true}, - 16: {want: 0xa, have: 0x1bd, conf: 0x2, oneway: true}, - 17: {want: 0xd, have: 0x9b, conf: 0x2, oneway: true}, - 18: {want: 0x23, have: 0x9d, conf: 0x2, oneway: true}, - 19: {want: 0x24, have: 0x207, conf: 0x2, oneway: true}, - 20: {want: 0x2f, have: 0x207, conf: 0x2, oneway: true}, - 21: {want: 0x31, have: 0x9b, conf: 0x2, oneway: true}, - 22: {want: 0x3c, have: 0xe1, conf: 0x2, oneway: true}, - 23: {want: 0x4b, have: 0x9b, conf: 0x2, oneway: true}, - 24: {want: 0x50, have: 0xaf, conf: 0x2, oneway: true}, - 25: {want: 0x65, have: 0xaa, conf: 0x2, oneway: true}, - 26: {want: 0x6c, have: 0x9b, conf: 0x2, oneway: true}, - 27: {want: 0x6f, have: 0x15, conf: 0x2, oneway: true}, - 28: {want: 0x70, have: 0xaf, conf: 0x2, oneway: true}, - 29: {want: 0x78, have: 0xaf, conf: 0x2, oneway: true}, - 30: {want: 0x7f, have: 0x9b, conf: 0x2, oneway: true}, - 31: {want: 0x95, have: 0x9b, conf: 0x2, oneway: true}, - 32: {want: 0x9c, have: 0x9b, conf: 0x2, oneway: true}, - 33: {want: 0x9f, have: 0xa8, conf: 0x2, oneway: true}, - 34: {want: 0xa1, have: 0x9d, conf: 0x2, oneway: true}, - 35: {want: 0xad, have: 0x80, conf: 0x2, oneway: true}, - 36: {want: 0xb9, have: 0x1bd, conf: 0x2, oneway: true}, - 37: {want: 0xba, have: 0x9b, conf: 0x2, oneway: true}, - 38: {want: 0xbb, have: 0x9b, conf: 0x2, oneway: true}, - 39: {want: 0xc2, have: 0x9b, conf: 0x2, oneway: true}, - 40: {want: 0xc8, have: 0x9d, conf: 0x2, oneway: true}, - 41: {want: 0xca, have: 0x9d, conf: 0x2, oneway: true}, - 42: {want: 0xd3, have: 0xe1, conf: 0x2, oneway: true}, - 43: {want: 0xdc, have: 0x9b, conf: 0x2, oneway: true}, - 44: {want: 0xde, have: 0x9b, conf: 0x2, oneway: true}, - 45: {want: 0xf1, have: 0xaf, conf: 0x2, oneway: true}, - 46: {want: 0xf3, have: 0x207, conf: 0x2, oneway: true}, - 47: {want: 0xf5, have: 0x9b, conf: 0x2, oneway: true}, - 48: {want: 0xfa, have: 0x9b, conf: 0x2, oneway: true}, - 49: {want: 0x102, have: 0x9b, conf: 0x2, oneway: true}, - 50: {want: 0x10f, have: 0xf8, conf: 0x2, oneway: true}, - 51: {want: 0x111, have: 0x9b, conf: 0x2, oneway: true}, - 52: {want: 0x122, have: 0xaf, conf: 0x2, oneway: true}, - 53: {want: 0x12f, have: 0x207, conf: 0x2, oneway: true}, - 54: {want: 0x133, have: 0x9b, conf: 0x2, oneway: true}, - 55: {want: 0x135, have: 0x9b, conf: 0x2, oneway: true}, - 56: {want: 0x13d, have: 0x9b, conf: 0x2, oneway: true}, - 57: {want: 0x145, have: 0x26f, conf: 0x2, oneway: true}, - 58: {want: 0x14d, have: 0x207, conf: 0x2, oneway: true}, - 59: {want: 0x14e, have: 0x103, conf: 0x2, oneway: true}, - 60: {want: 0x15a, have: 0x9b, conf: 0x2, oneway: true}, - 61: {want: 0x164, have: 0xaf, conf: 0x2, oneway: true}, - 62: {want: 0x165, have: 0x9b, conf: 0x2, oneway: true}, - 63: {want: 0x167, have: 0x9b, conf: 0x2, oneway: true}, - 64: {want: 0x16c, have: 0xaf, conf: 0x2, oneway: true}, - 65: {want: 0x182, have: 0x9b, conf: 0x2, oneway: true}, - 66: {want: 0x183, have: 0xaf, conf: 0x2, oneway: true}, - 67: {want: 0x189, have: 0x9b, conf: 0x2, oneway: true}, - 68: {want: 0x18c, have: 0x38, conf: 0x2, oneway: true}, - 69: {want: 0x18d, have: 0x9b, conf: 0x2, oneway: true}, - 70: {want: 0x18f, have: 0x207, conf: 0x2, oneway: true}, - 71: {want: 0x196, have: 0xe1, conf: 0x2, oneway: true}, - 72: {want: 0x19a, have: 0xf8, conf: 0x2, oneway: true}, - 73: {want: 0x19b, have: 0x9b, conf: 0x2, oneway: true}, - 74: {want: 0x1a5, have: 0x9b, conf: 0x2, oneway: true}, - 75: {want: 0x1b4, have: 0x9b, conf: 0x2, oneway: true}, - 76: {want: 0x1bf, have: 0x1af, conf: 0x2, oneway: false}, - 77: {want: 0x1bf, have: 0x1c1, conf: 0x2, oneway: true}, - 78: {want: 0x1c8, have: 0x9b, conf: 0x2, oneway: true}, - 79: {want: 0x1cc, have: 0x9b, conf: 0x2, oneway: true}, - 80: {want: 0x1ce, have: 0x9b, conf: 0x2, oneway: true}, - 81: {want: 0x1d0, have: 0xaf, conf: 0x2, oneway: true}, - 82: {want: 0x1d2, have: 0x9b, conf: 0x2, oneway: true}, - 83: {want: 0x1d3, have: 0x9b, conf: 0x2, oneway: true}, - 84: {want: 0x1d7, have: 0x9b, conf: 0x2, oneway: true}, - 85: {want: 0x1de, have: 0x9b, conf: 0x2, oneway: true}, - 86: {want: 0x1ee, have: 0x9b, conf: 0x2, oneway: true}, - 87: {want: 0x1f1, have: 0x9d, conf: 0x2, oneway: true}, - 88: {want: 0x1fc, have: 0x85, conf: 0x2, oneway: true}, - 89: {want: 0x201, have: 0x9b, conf: 0x2, oneway: true}, - 90: {want: 0x20a, have: 0xaf, conf: 0x2, oneway: true}, - 91: {want: 0x20d, have: 0xe1, conf: 0x2, oneway: true}, - 92: {want: 0x21a, have: 0x9b, conf: 0x2, oneway: true}, - 93: {want: 0x228, have: 0x9b, conf: 0x2, oneway: true}, - 94: {want: 0x236, have: 0x9b, conf: 0x2, oneway: true}, - 95: {want: 0x238, have: 0x9b, conf: 0x2, oneway: true}, - 96: {want: 0x23a, have: 0x9b, conf: 0x2, oneway: true}, - 97: {want: 0x242, have: 0x9b, conf: 0x2, oneway: true}, - 98: {want: 0x244, have: 0xf8, conf: 0x2, oneway: true}, - 99: {want: 0x248, have: 0x9b, conf: 0x2, oneway: true}, - 100: {want: 0x251, have: 0x9b, conf: 0x2, oneway: true}, - 101: {want: 0x258, have: 0x9b, conf: 0x2, oneway: true}, - 102: {want: 0x25c, have: 0x207, conf: 0x2, oneway: true}, - 103: {want: 0x261, have: 0x9b, conf: 0x2, oneway: true}, - 104: {want: 0x264, have: 0x207, conf: 0x2, oneway: true}, - 105: {want: 0x361a, have: 0x9b, conf: 0x2, oneway: true}, - 106: {want: 0x26b, have: 0x9b, conf: 0x2, oneway: true}, - 107: {want: 0x26c, have: 0x9b, conf: 0x2, oneway: true}, - 108: {want: 0x277, have: 0x207, conf: 0x2, oneway: true}, - 109: {want: 0x27b, have: 0x9b, conf: 0x2, oneway: true}, - 110: {want: 0x284, have: 0x2c4, conf: 0x2, oneway: true}, - 111: {want: 0x28c, have: 0x9b, conf: 0x2, oneway: true}, - 112: {want: 0x28d, have: 0x207, conf: 0x2, oneway: true}, - 113: {want: 0x2a4, have: 0xaf, conf: 0x2, oneway: true}, - 114: {want: 0x2a9, have: 0x9b, conf: 0x2, oneway: true}, - 115: {want: 0x2b9, have: 0x9b, conf: 0x2, oneway: true}, - 116: {want: 0x2ba, have: 0x9b, conf: 0x2, oneway: true}, - 117: {want: 0x2c6, have: 0x9b, conf: 0x2, oneway: true}, +// Size: 690 bytes, 115 elements +var matchLang = [115]mutualIntelligibility{ + 0: {want: 0x1cf, have: 0xb7, distance: 0x4, oneway: false}, + 1: {want: 0x405, have: 0xb7, distance: 0x4, oneway: false}, + 2: {want: 0x405, have: 0x1cf, distance: 0x4, oneway: false}, + 3: {want: 0x405, have: 0x430, distance: 0x4, oneway: false}, + 4: {want: 0x438, have: 0x1, distance: 0x4, oneway: false}, + 5: {want: 0x1a1, have: 0x10c, distance: 0x4, oneway: true}, + 6: {want: 0x293, have: 0x10c, distance: 0x4, oneway: true}, + 7: {want: 0x430, have: 0x1cf, distance: 0x5, oneway: false}, + 8: {want: 0x430, have: 0xb7, distance: 0x5, oneway: false}, + 9: {want: 0x100, have: 0x36d, distance: 0x8, oneway: false}, + 10: {want: 0x100, have: 0x345, distance: 0x8, oneway: false}, + 11: {want: 0x5, have: 0x3e0, distance: 0xa, oneway: true}, + 12: {want: 0xd, have: 0x138, distance: 0xa, oneway: true}, + 13: {want: 0x16, have: 0x365, distance: 0xa, oneway: true}, + 14: {want: 0x21, have: 0x138, distance: 0xa, oneway: true}, + 15: {want: 0x56, have: 0x13d, distance: 0xa, oneway: true}, + 16: {want: 0x58, have: 0x3e0, distance: 0xa, oneway: true}, + 17: {want: 0x71, have: 0x3e0, distance: 0xa, oneway: true}, + 18: {want: 0x75, have: 0x138, distance: 0xa, oneway: true}, + 19: {want: 0x82, have: 0x1bc, distance: 0xa, oneway: true}, + 20: {want: 0xa5, have: 0x138, distance: 0xa, oneway: true}, + 21: {want: 0xb2, have: 0x15d, distance: 0xa, oneway: true}, + 22: {want: 0xdd, have: 0x152, distance: 0xa, oneway: true}, + 23: {want: 0xe5, have: 0x138, distance: 0xa, oneway: true}, + 24: {want: 0xe9, have: 0x3a, distance: 0xa, oneway: true}, + 25: {want: 0xef, have: 0x15d, distance: 0xa, oneway: true}, + 26: {want: 0xf8, have: 0x15d, distance: 0xa, oneway: true}, + 27: {want: 0xff, have: 0x138, distance: 0xa, oneway: true}, + 28: {want: 0x12f, have: 0x138, distance: 0xa, oneway: true}, + 29: {want: 0x13b, have: 0x138, distance: 0xa, oneway: true}, + 30: {want: 0x13f, have: 0x150, distance: 0xa, oneway: true}, + 31: {want: 0x144, have: 0x13d, distance: 0xa, oneway: true}, + 32: {want: 0x157, have: 0x100, distance: 0xa, oneway: true}, + 33: {want: 0x16c, have: 0x365, distance: 0xa, oneway: true}, + 34: {want: 0x16d, have: 0x138, distance: 0xa, oneway: true}, + 35: {want: 0x16e, have: 0x138, distance: 0xa, oneway: true}, + 36: {want: 0x17c, have: 0x138, distance: 0xa, oneway: true}, + 37: {want: 0x18e, have: 0x13d, distance: 0xa, oneway: true}, + 38: {want: 0x192, have: 0x13d, distance: 0xa, oneway: true}, + 39: {want: 0x1a2, have: 0x1bc, distance: 0xa, oneway: true}, + 40: {want: 0x1b2, have: 0x138, distance: 0xa, oneway: true}, + 41: {want: 0x1b6, have: 0x138, distance: 0xa, oneway: true}, + 42: {want: 0x1d2, have: 0x15d, distance: 0xa, oneway: true}, + 43: {want: 0x1d5, have: 0x3e0, distance: 0xa, oneway: true}, + 44: {want: 0x1d7, have: 0x138, distance: 0xa, oneway: true}, + 45: {want: 0x1e5, have: 0x138, distance: 0xa, oneway: true}, + 46: {want: 0x1f6, have: 0x138, distance: 0xa, oneway: true}, + 47: {want: 0x20c, have: 0x1df, distance: 0xa, oneway: true}, + 48: {want: 0x20e, have: 0x138, distance: 0xa, oneway: true}, + 49: {want: 0x22b, have: 0x15d, distance: 0xa, oneway: true}, + 50: {want: 0x240, have: 0x3e0, distance: 0xa, oneway: true}, + 51: {want: 0x248, have: 0x138, distance: 0xa, oneway: true}, + 52: {want: 0x24f, have: 0x138, distance: 0xa, oneway: true}, + 53: {want: 0x263, have: 0x138, distance: 0xa, oneway: true}, + 54: {want: 0x272, have: 0x488, distance: 0xa, oneway: true}, + 55: {want: 0x288, have: 0x3e0, distance: 0xa, oneway: true}, + 56: {want: 0x28c, have: 0x1f7, distance: 0xa, oneway: true}, + 57: {want: 0x2a1, have: 0x138, distance: 0xa, oneway: true}, + 58: {want: 0x2b3, have: 0x15d, distance: 0xa, oneway: true}, + 59: {want: 0x2b6, have: 0x138, distance: 0xa, oneway: true}, + 60: {want: 0x2bc, have: 0x138, distance: 0xa, oneway: true}, + 61: {want: 0x2c1, have: 0x15d, distance: 0xa, oneway: true}, + 62: {want: 0x2eb, have: 0x138, distance: 0xa, oneway: true}, + 63: {want: 0x2ef, have: 0x15d, distance: 0xa, oneway: true}, + 64: {want: 0x2f8, have: 0x138, distance: 0xa, oneway: true}, + 65: {want: 0x2fd, have: 0x7e, distance: 0xa, oneway: true}, + 66: {want: 0x302, have: 0x138, distance: 0xa, oneway: true}, + 67: {want: 0x309, have: 0x3e0, distance: 0xa, oneway: true}, + 68: {want: 0x319, have: 0x1bc, distance: 0xa, oneway: true}, + 69: {want: 0x31d, have: 0x1df, distance: 0xa, oneway: true}, + 70: {want: 0x31e, have: 0x138, distance: 0xa, oneway: true}, + 71: {want: 0x32f, have: 0x138, distance: 0xa, oneway: true}, + 72: {want: 0x34f, have: 0x138, distance: 0xa, oneway: true}, + 73: {want: 0x368, have: 0x345, distance: 0xa, oneway: false}, + 74: {want: 0x368, have: 0x36d, distance: 0xa, oneway: true}, + 75: {want: 0x378, have: 0x138, distance: 0xa, oneway: true}, + 76: {want: 0x385, have: 0x138, distance: 0xa, oneway: true}, + 77: {want: 0x387, have: 0x138, distance: 0xa, oneway: true}, + 78: {want: 0x389, have: 0x15d, distance: 0xa, oneway: true}, + 79: {want: 0x38e, have: 0x138, distance: 0xa, oneway: true}, + 80: {want: 0x393, have: 0x138, distance: 0xa, oneway: true}, + 81: {want: 0x39b, have: 0x138, distance: 0xa, oneway: true}, + 82: {want: 0x3a3, have: 0x138, distance: 0xa, oneway: true}, + 83: {want: 0x3bc, have: 0x138, distance: 0xa, oneway: true}, + 84: {want: 0x3c2, have: 0x13d, distance: 0xa, oneway: true}, + 85: {want: 0x3d2, have: 0x10c, distance: 0xa, oneway: true}, + 86: {want: 0x3d7, have: 0x138, distance: 0xa, oneway: true}, + 87: {want: 0x3e3, have: 0x15d, distance: 0xa, oneway: true}, + 88: {want: 0x3e7, have: 0x1bc, distance: 0xa, oneway: true}, + 89: {want: 0x3f8, have: 0x138, distance: 0xa, oneway: true}, + 90: {want: 0x40a, have: 0x138, distance: 0xa, oneway: true}, + 91: {want: 0x421, have: 0x138, distance: 0xa, oneway: true}, + 92: {want: 0x427, have: 0x138, distance: 0xa, oneway: true}, + 93: {want: 0x42f, have: 0x138, distance: 0xa, oneway: true}, + 94: {want: 0x439, have: 0x138, distance: 0xa, oneway: true}, + 95: {want: 0x43c, have: 0x1df, distance: 0xa, oneway: true}, + 96: {want: 0x443, have: 0x138, distance: 0xa, oneway: true}, + 97: {want: 0x44e, have: 0x138, distance: 0xa, oneway: true}, + 98: {want: 0x45f, have: 0x138, distance: 0xa, oneway: true}, + 99: {want: 0x465, have: 0x3e0, distance: 0xa, oneway: true}, + 100: {want: 0x46d, have: 0x138, distance: 0xa, oneway: true}, + 101: {want: 0x474, have: 0x3e0, distance: 0xa, oneway: true}, + 102: {want: 0x3880, have: 0x138, distance: 0xa, oneway: true}, + 103: {want: 0x47e, have: 0x138, distance: 0xa, oneway: true}, + 104: {want: 0x480, have: 0x138, distance: 0xa, oneway: true}, + 105: {want: 0x492, have: 0x3e0, distance: 0xa, oneway: true}, + 106: {want: 0x49b, have: 0x138, distance: 0xa, oneway: true}, + 107: {want: 0x4aa, have: 0x527, distance: 0xa, oneway: true}, + 108: {want: 0x4b2, have: 0x138, distance: 0xa, oneway: true}, + 109: {want: 0x4ba, have: 0x3e0, distance: 0xa, oneway: true}, + 110: {want: 0x4e3, have: 0x15d, distance: 0xa, oneway: true}, + 111: {want: 0x4f0, have: 0x138, distance: 0xa, oneway: true}, + 112: {want: 0x510, have: 0x138, distance: 0xa, oneway: true}, + 113: {want: 0x516, have: 0x138, distance: 0xa, oneway: true}, + 114: {want: 0x52c, have: 0x138, distance: 0xa, oneway: true}, } // matchScript holds pairs of scriptIDs where readers of one script // can typically also read the other. Each is associated with a confidence. -// Size: 24 bytes, 4 elements -var matchScript = [4]scriptIntelligibility{ - 0: {lang: 0x23b, want: 0x52, have: 0x1e, conf: 0x2}, - 1: {lang: 0x23b, want: 0x1e, have: 0x52, conf: 0x2}, - 2: {lang: 0x0, want: 0x34, have: 0x35, conf: 0x1}, - 3: {lang: 0x0, want: 0x35, have: 0x34, conf: 0x1}, +// Size: 208 bytes, 26 elements +var matchScript = [26]scriptIntelligibility{ + 0: {wantLang: 0x430, haveLang: 0x430, wantScript: 0x52, haveScript: 0x1e, distance: 0x5}, + 1: {wantLang: 0x430, haveLang: 0x430, wantScript: 0x1e, haveScript: 0x52, distance: 0x5}, + 2: {wantLang: 0x58, haveLang: 0x3e0, wantScript: 0x52, haveScript: 0x1e, distance: 0xa}, + 3: {wantLang: 0xa5, haveLang: 0x138, wantScript: 0xe, haveScript: 0x52, distance: 0xa}, + 4: {wantLang: 0x1d5, haveLang: 0x3e0, wantScript: 0x8, haveScript: 0x1e, distance: 0xa}, + 5: {wantLang: 0x20e, haveLang: 0x138, wantScript: 0x29, haveScript: 0x52, distance: 0xa}, + 6: {wantLang: 0x248, haveLang: 0x138, wantScript: 0x46, haveScript: 0x52, distance: 0xa}, + 7: {wantLang: 0x24f, haveLang: 0x138, wantScript: 0x4a, haveScript: 0x52, distance: 0xa}, + 8: {wantLang: 0x2b6, haveLang: 0x138, wantScript: 0x4f, haveScript: 0x52, distance: 0xa}, + 9: {wantLang: 0x302, haveLang: 0x138, wantScript: 0x64, haveScript: 0x52, distance: 0xa}, + 10: {wantLang: 0x32f, haveLang: 0x138, wantScript: 0x6b, haveScript: 0x52, distance: 0xa}, + 11: {wantLang: 0x34f, haveLang: 0x138, wantScript: 0x20, haveScript: 0x52, distance: 0xa}, + 12: {wantLang: 0x393, haveLang: 0x138, wantScript: 0x75, haveScript: 0x52, distance: 0xa}, + 13: {wantLang: 0x39b, haveLang: 0x138, wantScript: 0x2f, haveScript: 0x52, distance: 0xa}, + 14: {wantLang: 0x3bc, haveLang: 0x138, wantScript: 0x5, haveScript: 0x52, distance: 0xa}, + 15: {wantLang: 0x3f8, haveLang: 0x138, wantScript: 0x5, haveScript: 0x52, distance: 0xa}, + 16: {wantLang: 0x40a, haveLang: 0x138, wantScript: 0xc1, haveScript: 0x52, distance: 0xa}, + 17: {wantLang: 0x44e, haveLang: 0x138, wantScript: 0xcd, haveScript: 0x52, distance: 0xa}, + 18: {wantLang: 0x45f, haveLang: 0x138, wantScript: 0xd0, haveScript: 0x52, distance: 0xa}, + 19: {wantLang: 0x46d, haveLang: 0x138, wantScript: 0x27, haveScript: 0x52, distance: 0xa}, + 20: {wantLang: 0x474, haveLang: 0x3e0, wantScript: 0x52, haveScript: 0x1e, distance: 0xa}, + 21: {wantLang: 0x4b2, haveLang: 0x138, wantScript: 0x5, haveScript: 0x52, distance: 0xa}, + 22: {wantLang: 0x4ba, haveLang: 0x3e0, wantScript: 0x52, haveScript: 0x1e, distance: 0xa}, + 23: {wantLang: 0x510, haveLang: 0x138, wantScript: 0x37, haveScript: 0x52, distance: 0xa}, + 24: {wantLang: 0x527, haveLang: 0x527, wantScript: 0x34, haveScript: 0x35, distance: 0xf}, + 25: {wantLang: 0x527, haveLang: 0x527, wantScript: 0x35, haveScript: 0x34, distance: 0x13}, +} + +// Size: 90 bytes, 15 elements +var matchRegion = [15]regionIntelligibility{ + 0: {lang: 0x3a, script: 0x0, group: 0x4, distance: 0x4}, + 1: {lang: 0x3a, script: 0x0, group: 0x84, distance: 0x4}, + 2: {lang: 0x138, script: 0x0, group: 0x1, distance: 0x4}, + 3: {lang: 0x138, script: 0x0, group: 0x81, distance: 0x4}, + 4: {lang: 0x13d, script: 0x0, group: 0x3, distance: 0x4}, + 5: {lang: 0x13d, script: 0x0, group: 0x83, distance: 0x4}, + 6: {lang: 0x3be, script: 0x0, group: 0x3, distance: 0x4}, + 7: {lang: 0x3be, script: 0x0, group: 0x83, distance: 0x4}, + 8: {lang: 0x527, script: 0x35, group: 0x2, distance: 0x4}, + 9: {lang: 0x527, script: 0x35, group: 0x82, distance: 0x4}, + 10: {lang: 0x3a, script: 0x0, group: 0x80, distance: 0x5}, + 11: {lang: 0x138, script: 0x0, group: 0x80, distance: 0x5}, + 12: {lang: 0x13d, script: 0x0, group: 0x80, distance: 0x5}, + 13: {lang: 0x3be, script: 0x0, group: 0x80, distance: 0x5}, + 14: {lang: 0x527, script: 0x35, group: 0x80, distance: 0x5}, } // Size: 128 bytes, 32 elements @@ -2671,8 +3534,8 @@ var regionContainment = [32]uint32{ // regionInclusion maps region identifiers to sets of regions in regionInclusionBits, // where each set holds all groupings that are directly connected in a region // containment graph. -// Size: 355 bytes, 355 elements -var regionInclusion = [355]uint8{ +// Size: 357 bytes, 357 elements +var regionInclusion = [357]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, @@ -2689,41 +3552,41 @@ var regionInclusion = [355]uint8{ 0x25, 0x2c, 0x25, 0x21, 0x36, 0x2d, 0x34, 0x29, 0x21, 0x2e, 0x37, 0x25, 0x25, 0x20, 0x38, 0x38, 0x27, 0x37, 0x38, 0x38, 0x2e, 0x39, 0x2e, 0x1f, - 0x37, 0x3a, 0x27, 0x3b, 0x2b, 0x20, 0x29, 0x34, - 0x26, 0x37, 0x25, 0x23, 0x27, 0x2b, 0x2c, 0x22, + 0x20, 0x37, 0x3a, 0x27, 0x3b, 0x2b, 0x20, 0x29, + 0x34, 0x26, 0x37, 0x25, 0x23, 0x27, 0x2b, 0x2c, // Entry 80 - BF - 0x2f, 0x2c, 0x2c, 0x25, 0x26, 0x39, 0x21, 0x33, - 0x3b, 0x2c, 0x27, 0x35, 0x21, 0x33, 0x39, 0x25, - 0x2d, 0x20, 0x38, 0x30, 0x37, 0x23, 0x2b, 0x24, - 0x21, 0x23, 0x24, 0x2b, 0x39, 0x2b, 0x25, 0x23, - 0x35, 0x20, 0x2e, 0x3c, 0x30, 0x3b, 0x2e, 0x25, - 0x35, 0x35, 0x23, 0x25, 0x3c, 0x30, 0x23, 0x25, - 0x34, 0x24, 0x2c, 0x31, 0x37, 0x29, 0x37, 0x38, - 0x38, 0x34, 0x32, 0x22, 0x25, 0x2e, 0x3b, 0x20, + 0x22, 0x2f, 0x2c, 0x2c, 0x25, 0x26, 0x39, 0x21, + 0x33, 0x3b, 0x2c, 0x27, 0x35, 0x21, 0x33, 0x39, + 0x25, 0x2d, 0x20, 0x38, 0x30, 0x37, 0x23, 0x2b, + 0x24, 0x21, 0x23, 0x24, 0x2b, 0x39, 0x2b, 0x25, + 0x23, 0x35, 0x20, 0x2e, 0x3c, 0x30, 0x3b, 0x2e, + 0x25, 0x35, 0x35, 0x23, 0x25, 0x3c, 0x30, 0x23, + 0x25, 0x34, 0x24, 0x2c, 0x31, 0x37, 0x29, 0x37, + 0x38, 0x38, 0x34, 0x32, 0x22, 0x25, 0x2e, 0x3b, // Entry C0 - FF - 0x22, 0x2c, 0x30, 0x35, 0x35, 0x3b, 0x25, 0x2c, - 0x25, 0x39, 0x2e, 0x24, 0x2e, 0x33, 0x30, 0x2e, - 0x31, 0x3a, 0x2c, 0x2a, 0x2c, 0x20, 0x33, 0x29, - 0x2b, 0x24, 0x20, 0x3b, 0x23, 0x28, 0x2a, 0x23, - 0x33, 0x20, 0x27, 0x28, 0x3a, 0x30, 0x24, 0x2d, - 0x2f, 0x28, 0x25, 0x23, 0x39, 0x20, 0x3b, 0x27, - 0x20, 0x23, 0x20, 0x20, 0x1e, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2c, 0x30, 0x35, 0x35, 0x3b, 0x25, + 0x2c, 0x25, 0x39, 0x2e, 0x24, 0x2e, 0x33, 0x30, + 0x2e, 0x31, 0x3a, 0x2c, 0x2a, 0x2c, 0x20, 0x33, + 0x29, 0x2b, 0x24, 0x20, 0x3b, 0x23, 0x28, 0x2a, + 0x23, 0x33, 0x20, 0x27, 0x28, 0x3a, 0x30, 0x24, + 0x2d, 0x2f, 0x28, 0x25, 0x23, 0x39, 0x20, 0x3b, + 0x27, 0x20, 0x23, 0x20, 0x20, 0x1e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // Entry 100 - 13F - 0x2e, 0x20, 0x2d, 0x22, 0x32, 0x2e, 0x23, 0x3a, - 0x2e, 0x38, 0x37, 0x30, 0x2c, 0x39, 0x2b, 0x2d, - 0x2c, 0x22, 0x2c, 0x2e, 0x27, 0x2e, 0x26, 0x32, - 0x33, 0x25, 0x23, 0x31, 0x21, 0x25, 0x26, 0x21, - 0x2c, 0x30, 0x3c, 0x28, 0x30, 0x3c, 0x38, 0x28, - 0x30, 0x23, 0x25, 0x28, 0x35, 0x2e, 0x32, 0x2e, - 0x20, 0x21, 0x2f, 0x27, 0x3c, 0x22, 0x25, 0x20, - 0x27, 0x25, 0x25, 0x30, 0x3a, 0x28, 0x20, 0x28, + 0x20, 0x2e, 0x20, 0x2d, 0x22, 0x32, 0x2e, 0x23, + 0x3a, 0x2e, 0x38, 0x37, 0x30, 0x2c, 0x39, 0x2b, + 0x2d, 0x2c, 0x22, 0x2c, 0x2e, 0x27, 0x2e, 0x26, + 0x32, 0x33, 0x25, 0x23, 0x31, 0x21, 0x25, 0x26, + 0x21, 0x2c, 0x30, 0x3c, 0x28, 0x30, 0x3c, 0x38, + 0x28, 0x30, 0x23, 0x25, 0x28, 0x35, 0x2e, 0x32, + 0x2e, 0x20, 0x21, 0x20, 0x2f, 0x27, 0x3c, 0x22, + 0x25, 0x20, 0x27, 0x25, 0x25, 0x30, 0x3a, 0x28, // Entry 140 - 17F + 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x23, 0x23, 0x2e, 0x22, 0x31, 0x2e, - 0x26, 0x2e, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x23, 0x2e, 0x22, + 0x31, 0x2e, 0x26, 0x2e, 0x20, } // regionInclusionBits is an array of bit vectors where every vector represents @@ -2779,13 +3642,13 @@ type parentRel struct { fromRegion []uint16 } -// Size: 412 bytes, 5 elements +// Size: 414 bytes, 5 elements var parents = [5]parentRel{ - 0: {lang: 0x9b, script: 0x0, maxScript: 0x52, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x24, 0x25, 0x2e, 0x33, 0x35, 0x3c, 0x41, 0x45, 0x47, 0x48, 0x49, 0x4f, 0x51, 0x5b, 0x5c, 0x60, 0x63, 0x6c, 0x71, 0x72, 0x73, 0x79, 0x7a, 0x7d, 0x7e, 0x7f, 0x81, 0x8a, 0x8b, 0x94, 0x95, 0x96, 0x97, 0x98, 0x9d, 0x9e, 0xa2, 0xa5, 0xa7, 0xab, 0xaf, 0xb2, 0xb3, 0xbd, 0xc4, 0xc8, 0xc9, 0xca, 0xcc, 0xce, 0xd0, 0xd3, 0xd4, 0xdb, 0xdd, 0xde, 0xe4, 0xe5, 0xe6, 0xe9, 0xee, 0x105, 0x107, 0x108, 0x109, 0x10b, 0x10c, 0x110, 0x115, 0x119, 0x11b, 0x11d, 0x123, 0x127, 0x12a, 0x12b, 0x12d, 0x12f, 0x136, 0x139, 0x13c, 0x13f, 0x15e, 0x15f, 0x161}}, - 1: {lang: 0x9b, script: 0x0, maxScript: 0x52, toRegion: 0x1a, fromRegion: []uint16{0x2d, 0x4d, 0x5f, 0x62, 0x70, 0xd7, 0x10a, 0x10d}}, - 2: {lang: 0x9d, script: 0x0, maxScript: 0x52, toRegion: 0x1e, fromRegion: []uint16{0x2b, 0x3e, 0x40, 0x50, 0x53, 0x55, 0x58, 0x64, 0x68, 0x87, 0x8d, 0xcd, 0xd6, 0xe0, 0xe2, 0xea, 0xef, 0x118, 0x132, 0x133, 0x138}}, - 3: {lang: 0x1ef, script: 0x0, maxScript: 0x52, toRegion: 0xec, fromRegion: []uint16{0x29, 0x4d, 0x59, 0x84, 0x89, 0xb5, 0xc4, 0xcf, 0x116, 0x124}}, - 4: {lang: 0x2c4, script: 0x35, maxScript: 0x35, toRegion: 0x8b, fromRegion: []uint16{0xc4}}, + 0: {lang: 0x138, script: 0x0, maxScript: 0x52, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x24, 0x25, 0x2e, 0x33, 0x35, 0x3c, 0x41, 0x45, 0x47, 0x48, 0x49, 0x4f, 0x51, 0x5b, 0x5c, 0x60, 0x63, 0x6c, 0x72, 0x73, 0x74, 0x7a, 0x7b, 0x7e, 0x7f, 0x80, 0x82, 0x8b, 0x8c, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9e, 0x9f, 0xa3, 0xa6, 0xa8, 0xac, 0xb0, 0xb3, 0xb4, 0xbe, 0xc5, 0xc9, 0xca, 0xcb, 0xcd, 0xcf, 0xd1, 0xd4, 0xd5, 0xdc, 0xde, 0xdf, 0xe5, 0xe6, 0xe7, 0xea, 0xef, 0x106, 0x108, 0x109, 0x10a, 0x10c, 0x10d, 0x111, 0x116, 0x11a, 0x11c, 0x11e, 0x124, 0x128, 0x12b, 0x12c, 0x12e, 0x130, 0x138, 0x13b, 0x13e, 0x141, 0x160, 0x161, 0x163}}, + 1: {lang: 0x138, script: 0x0, maxScript: 0x52, toRegion: 0x1a, fromRegion: []uint16{0x2d, 0x4d, 0x5f, 0x62, 0x71, 0xd8, 0x10b, 0x10e}}, + 2: {lang: 0x13d, script: 0x0, maxScript: 0x52, toRegion: 0x1e, fromRegion: []uint16{0x2b, 0x3e, 0x40, 0x47, 0x50, 0x53, 0x55, 0x58, 0x64, 0x68, 0x88, 0x8e, 0xce, 0xd7, 0xe1, 0xe3, 0xeb, 0xf0, 0x119, 0x134, 0x135, 0x13a}}, + 3: {lang: 0x3be, script: 0x0, maxScript: 0x52, toRegion: 0xed, fromRegion: []uint16{0x29, 0x4d, 0x59, 0x85, 0x8a, 0xb6, 0xc5, 0xd0, 0x117, 0x125}}, + 4: {lang: 0x527, script: 0x35, maxScript: 0x35, toRegion: 0x8c, fromRegion: []uint16{0xc5}}, } -// Total table size 20315 bytes (19KiB); checksum: C16EF251 +// Total table size 26496 bytes (25KiB); checksum: 6E24B15A diff --git a/vendor/golang.org/x/text/runes/cond.go b/vendor/golang.org/x/text/runes/cond.go index ae7a921585b14..df7aa02db6d3b 100644 --- a/vendor/golang.org/x/text/runes/cond.go +++ b/vendor/golang.org/x/text/runes/cond.go @@ -41,20 +41,35 @@ func If(s Set, tIn, tNotIn transform.Transformer) Transformer { if tNotIn == nil { tNotIn = transform.Nop } + sIn, ok := tIn.(transform.SpanningTransformer) + if !ok { + sIn = dummySpan{tIn} + } + sNotIn, ok := tNotIn.(transform.SpanningTransformer) + if !ok { + sNotIn = dummySpan{tNotIn} + } + a := &cond{ - tIn: tIn, - tNotIn: tNotIn, + tIn: sIn, + tNotIn: sNotIn, f: s.Contains, } a.Reset() return Transformer{a} } +type dummySpan struct{ transform.Transformer } + +func (d dummySpan) Span(src []byte, atEOF bool) (n int, err error) { + return 0, transform.ErrEndOfSpan +} + type cond struct { - tIn, tNotIn transform.Transformer + tIn, tNotIn transform.SpanningTransformer f func(rune) bool - check func(rune) bool // current check to perform - t transform.Transformer // current transformer to use + check func(rune) bool // current check to perform + t transform.SpanningTransformer // current transformer to use } // Reset implements transform.Transformer. @@ -84,6 +99,51 @@ func (t *cond) isNot(r rune) bool { return false } +// This implementation of Span doesn't help all too much, but it needs to be +// there to satisfy this package's Transformer interface. +// TODO: there are certainly room for improvements, though. For example, if +// t.t == transform.Nop (which will a common occurrence) it will save a bundle +// to special-case that loop. +func (t *cond) Span(src []byte, atEOF bool) (n int, err error) { + p := 0 + for n < len(src) && err == nil { + // Don't process too much at a time as the Spanner that will be + // called on this block may terminate early. + const maxChunk = 4096 + max := len(src) + if v := n + maxChunk; v < max { + max = v + } + atEnd := false + size := 0 + current := t.t + for ; p < max; p += size { + r := rune(src[p]) + if r < utf8.RuneSelf { + size = 1 + } else if r, size = utf8.DecodeRune(src[p:]); size == 1 { + if !atEOF && !utf8.FullRune(src[p:]) { + err = transform.ErrShortSrc + break + } + } + if !t.check(r) { + // The next rune will be the start of a new run. + atEnd = true + break + } + } + n2, err2 := current.Span(src[n:p], atEnd || (atEOF && p == len(src))) + n += n2 + if err2 != nil { + return n, err2 + } + // At this point either err != nil or t.check will pass for the rune at p. + p = n + size + } + return n, err +} + func (t *cond) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { p := 0 for nSrc < len(src) && err == nil { @@ -99,9 +159,10 @@ func (t *cond) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error size := 0 current := t.t for ; p < max; p += size { - var r rune - r, size = utf8.DecodeRune(src[p:]) - if r == utf8.RuneError && size == 1 { + r := rune(src[p]) + if r < utf8.RuneSelf { + size = 1 + } else if r, size = utf8.DecodeRune(src[p:]); size == 1 { if !atEOF && !utf8.FullRune(src[p:]) { err = transform.ErrShortSrc break diff --git a/vendor/golang.org/x/text/runes/runes.go b/vendor/golang.org/x/text/runes/runes.go index 291de656b27ff..6a3195cf3d2ef 100644 --- a/vendor/golang.org/x/text/runes/runes.go +++ b/vendor/golang.org/x/text/runes/runes.go @@ -46,9 +46,19 @@ func Predicate(f func(rune) bool) Set { // Transformer implements the transform.Transformer interface. type Transformer struct { - transform.Transformer + t transform.SpanningTransformer } +func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + return t.t.Transform(dst, src, atEOF) +} + +func (t Transformer) Span(b []byte, atEOF bool) (n int, err error) { + return t.t.Span(b, atEOF) +} + +func (t Transformer) Reset() { t.t.Reset() } + // Bytes returns a new byte slice with the result of converting b using t. It // calls Reset on t. It returns nil if any error was found. This can only happen // if an error-producing Transformer is passed to If. @@ -96,39 +106,57 @@ type remove func(r rune) bool func (remove) Reset() {} +// Span implements transform.Spanner. +func (t remove) Span(src []byte, atEOF bool) (n int, err error) { + for r, size := rune(0), 0; n < len(src); { + if r = rune(src[n]); r < utf8.RuneSelf { + size = 1 + } else if r, size = utf8.DecodeRune(src[n:]); size == 1 { + // Invalid rune. + if !atEOF && !utf8.FullRune(src[n:]) { + err = transform.ErrShortSrc + } else { + err = transform.ErrEndOfSpan + } + break + } + if t(r) { + err = transform.ErrEndOfSpan + break + } + n += size + } + return +} + // Transform implements transform.Transformer. func (t remove) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { for r, size := rune(0), 0; nSrc < len(src); { if r = rune(src[nSrc]); r < utf8.RuneSelf { size = 1 - } else { - r, size = utf8.DecodeRune(src[nSrc:]) - - if size == 1 { - // Invalid rune. - if !atEOF && !utf8.FullRune(src[nSrc:]) { - err = transform.ErrShortSrc + } else if r, size = utf8.DecodeRune(src[nSrc:]); size == 1 { + // Invalid rune. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + // We replace illegal bytes with RuneError. Not doing so might + // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. + // The resulting byte sequence may subsequently contain runes + // for which t(r) is true that were passed unnoticed. + if !t(utf8.RuneError) { + if nDst+3 > len(dst) { + err = transform.ErrShortDst break } - // We replace illegal bytes with RuneError. Not doing so might - // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. - // The resulting byte sequence may subsequently contain runes - // for which t(r) is true that were passed unnoticed. - if !t(utf8.RuneError) { - if nDst+3 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst+0] = runeErrorString[0] - dst[nDst+1] = runeErrorString[1] - dst[nDst+2] = runeErrorString[2] - nDst += 3 - } - nSrc++ - continue + dst[nDst+0] = runeErrorString[0] + dst[nDst+1] = runeErrorString[1] + dst[nDst+2] = runeErrorString[2] + nDst += 3 } + nSrc++ + continue } - if t(r) { nSrc += size continue @@ -157,6 +185,28 @@ type mapper func(rune) rune func (mapper) Reset() {} +// Span implements transform.Spanner. +func (t mapper) Span(src []byte, atEOF bool) (n int, err error) { + for r, size := rune(0), 0; n < len(src); n += size { + if r = rune(src[n]); r < utf8.RuneSelf { + size = 1 + } else if r, size = utf8.DecodeRune(src[n:]); size == 1 { + // Invalid rune. + if !atEOF && !utf8.FullRune(src[n:]) { + err = transform.ErrShortSrc + } else { + err = transform.ErrEndOfSpan + } + break + } + if t(r) != r { + err = transform.ErrEndOfSpan + break + } + } + return n, err +} + // Transform implements transform.Transformer. func (t mapper) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { var replacement rune @@ -230,24 +280,51 @@ func ReplaceIllFormed() Transformer { type replaceIllFormed struct{ transform.NopResetter } +func (t replaceIllFormed) Span(src []byte, atEOF bool) (n int, err error) { + for n < len(src) { + // ASCII fast path. + if src[n] < utf8.RuneSelf { + n++ + continue + } + + r, size := utf8.DecodeRune(src[n:]) + + // Look for a valid non-ASCII rune. + if r != utf8.RuneError || size != 1 { + n += size + continue + } + + // Look for short source data. + if !atEOF && !utf8.FullRune(src[n:]) { + err = transform.ErrShortSrc + break + } + + // We have an invalid rune. + err = transform.ErrEndOfSpan + break + } + return n, err +} + func (t replaceIllFormed) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { for nSrc < len(src) { - r, size := utf8.DecodeRune(src[nSrc:]) - - // Look for an ASCII rune. - if r < utf8.RuneSelf { + // ASCII fast path. + if r := src[nSrc]; r < utf8.RuneSelf { if nDst == len(dst) { err = transform.ErrShortDst break } - dst[nDst] = byte(r) + dst[nDst] = r nDst++ nSrc++ continue } // Look for a valid non-ASCII rune. - if r != utf8.RuneError || size != 1 { + if _, size := utf8.DecodeRune(src[nSrc:]); size != 1 { if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { err = transform.ErrShortDst break diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule.go b/vendor/golang.org/x/text/secure/bidirule/bidirule.go index 277257fd791e9..a7161bdd9b6cf 100644 --- a/vendor/golang.org/x/text/secure/bidirule/bidirule.go +++ b/vendor/golang.org/x/text/secure/bidirule/bidirule.go @@ -123,34 +123,64 @@ var transitions = [...][2]ruleTransition{ // vice versa. const exclusiveRTL = uint16(1<>2) + } + span := append(b.buf[x][:0], b.src[:n]...) + b.src, _, err = transform.Append(t, span, b.src[n:]) b.buf[x] = b.src b.next++ return err } -func (b *buffers) enforce(p *Profile, src []byte) (str []byte, err error) { +// Pre-allocate transformers when possible. In some cases this avoids allocation. +var ( + foldWidthT transform.SpanningTransformer = width.Fold + lowerCaseT transform.SpanningTransformer = cases.Lower(language.Und, cases.HandleFinalSigma(false)) +) + +// TODO: make this a method on profile. + +func (b *buffers) enforce(p *Profile, src []byte, comparing bool) (str []byte, err error) { b.src = src + ascii := true + for _, c := range src { + if c >= utf8.RuneSelf { + ascii = false + break + } + } + // ASCII fast path. + if ascii { + for _, f := range p.options.additional { + if err = b.apply(f()); err != nil { + return nil, err + } + } + switch { + case p.options.asciiLower || (comparing && p.options.ignorecase): + for i, c := range b.src { + if 'A' <= c && c <= 'Z' { + b.src[i] = c ^ 1<<5 + } + } + case p.options.cases != nil: + b.apply(p.options.cases) + } + c := checker{p: p} + if _, err := c.span(b.src, true); err != nil { + return nil, err + } + if p.disallow != nil { + for _, c := range b.src { + if p.disallow.Contains(rune(c)) { + return nil, errDisallowedRune + } + } + } + if p.options.disallowEmpty && len(b.src) == 0 { + return nil, errEmptyString + } + return b.src, nil + } + // These transforms are applied in the order defined in // https://tools.ietf.org/html/rfc7564#section-7 // TODO: allow different width transforms options. - if p.options.foldWidth { - // TODO: use Span, once available. - if err = b.apply(width.Fold); err != nil { - return nil, err - } + if p.options.foldWidth || (p.options.ignorecase && comparing) { + b.apply(foldWidthT) } for _, f := range p.options.additional { if err = b.apply(f()); err != nil { @@ -123,24 +174,14 @@ func (b *buffers) enforce(p *Profile, src []byte) (str []byte, err error) { } } if p.options.cases != nil { - if err = b.apply(p.options.cases); err != nil { - return nil, err - } + b.apply(p.options.cases) } - if n := p.norm.QuickSpan(b.src); n < len(b.src) { - x := b.next & 1 - n = copy(b.buf[x], b.src[:n]) - b.src, _, err = transform.Append(p.norm, b.buf[x][:n], b.src[n:]) - b.buf[x] = b.src - b.next++ - if err != nil { - return nil, err - } + if comparing && p.options.ignorecase { + b.apply(lowerCaseT) } - if p.options.bidiRule { - if err := b.apply(bidirule.New()); err != nil { - return nil, err - } + b.apply(p.norm) + if p.options.bidiRule && !bidirule.Valid(b.src) { + return nil, bidirule.ErrInvalid } c := checker{p: p} if _, err := c.span(b.src, true); err != nil { @@ -155,9 +196,6 @@ func (b *buffers) enforce(p *Profile, src []byte) (str []byte, err error) { i += size } } - - // TODO: Add the disallow empty rule with a dummy transformer? - if p.options.disallowEmpty && len(b.src) == 0 { return nil, errEmptyString } @@ -168,19 +206,16 @@ func (b *buffers) enforce(p *Profile, src []byte) (str []byte, err error) { // It returns an error if the input string is invalid. func (p *Profile) Append(dst, src []byte) ([]byte, error) { var buf buffers - buf.init(8 + len(src) + len(src)>>2) - b, err := buf.enforce(p, src) + b, err := buf.enforce(p, src, false) if err != nil { return nil, err } return append(dst, b...), nil } -// Bytes returns a new byte slice with the result of applying the profile to b. -func (p *Profile) Bytes(b []byte) ([]byte, error) { +func processBytes(p *Profile, b []byte, key bool) ([]byte, error) { var buf buffers - buf.init(8 + len(b) + len(b)>>2) - b, err := buf.enforce(p, b) + b, err := buf.enforce(p, b, key) if err != nil { return nil, err } @@ -192,39 +227,62 @@ func (p *Profile) Bytes(b []byte) ([]byte, error) { return b, nil } -// String returns a string with the result of applying the profile to s. -func (p *Profile) String(s string) (string, error) { +// Bytes returns a new byte slice with the result of applying the profile to b. +func (p *Profile) Bytes(b []byte) ([]byte, error) { + return processBytes(p, b, false) +} + +// AppendCompareKey appends the result of applying p to src (including any +// optional rules to make strings comparable or useful in a map key such as +// applying lowercasing) writing the result to dst. It returns an error if the +// input string is invalid. +func (p *Profile) AppendCompareKey(dst, src []byte) ([]byte, error) { + var buf buffers + b, err := buf.enforce(p, src, true) + if err != nil { + return nil, err + } + return append(dst, b...), nil +} + +func processString(p *Profile, s string, key bool) (string, error) { var buf buffers - buf.init(8 + len(s) + len(s)>>2) - b, err := buf.enforce(p, []byte(s)) + b, err := buf.enforce(p, []byte(s), key) if err != nil { return "", err } return string(b), nil } +// String returns a string with the result of applying the profile to s. +func (p *Profile) String(s string) (string, error) { + return processString(p, s, false) +} + +// CompareKey returns a string that can be used for comparison, hashing, or +// collation. +func (p *Profile) CompareKey(s string) (string, error) { + return processString(p, s, true) +} + // Compare enforces both strings, and then compares them for bit-string identity // (byte-for-byte equality). If either string cannot be enforced, the comparison // is false. func (p *Profile) Compare(a, b string) bool { - a, err := p.String(a) + var buf buffers + + akey, err := buf.enforce(p, []byte(a), true) if err != nil { return false } - b, err = p.String(b) + + buf = buffers{} + bkey, err := buf.enforce(p, []byte(b), true) if err != nil { return false } - // TODO: This is out of order. Need to extract the transformation logic and - // put this in where the normal case folding would go (but only for - // comparison). - if p.options.ignorecase { - a = width.Fold.String(a) - b = width.Fold.String(a) - } - - return a == b + return bytes.Compare(akey, bkey) == 0 } // Allowed returns a runes.Set containing every rune that is a member of the @@ -264,33 +322,35 @@ func (c *checker) span(src []byte, atEOF bool) (n int, err error) { } return n, errDisallowedRune } + doLookAhead := false if property(e) < c.p.class.validFrom { if d.rule == nil { return n, errDisallowedRune } - doLookAhead, err := d.rule(c.beforeBits) + doLookAhead, err = d.rule(c.beforeBits) if err != nil { return n, err } - if doLookAhead { - c.beforeBits &= d.keep - c.beforeBits |= d.set - // We may still have a lookahead rule which we will require to - // complete (by checking termBits == 0) before setting the new - // bits. - if c.termBits != 0 && (!c.checkLookahead() || c.termBits == 0) { - return n, err - } - c.termBits = d.term - c.acceptBits = d.accept - n += sz - continue - } } c.beforeBits &= d.keep c.beforeBits |= d.set - if c.termBits != 0 && !c.checkLookahead() { - return n, errContext + if c.termBits != 0 { + // We are currently in an unterminated lookahead. + if c.beforeBits&c.termBits != 0 { + c.termBits = 0 + c.acceptBits = 0 + } else if c.beforeBits&c.acceptBits == 0 { + // Invalid continuation of the unterminated lookahead sequence. + return n, errContext + } + } + if doLookAhead { + if c.termBits != 0 { + // A previous lookahead run has not been terminated yet. + return n, errContext + } + c.termBits = d.term + c.acceptBits = d.accept } n += sz } @@ -300,18 +360,6 @@ func (c *checker) span(src []byte, atEOF bool) (n int, err error) { return n, err } -func (c *checker) checkLookahead() bool { - switch { - case c.beforeBits&c.termBits != 0: - c.termBits = 0 - c.acceptBits = 0 - case c.beforeBits&c.acceptBits != 0: - default: - return false - } - return true -} - // TODO: we may get rid of this transform if transform.Chain understands // something like a Spanner interface. func (c checker) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { diff --git a/vendor/golang.org/x/text/secure/precis/profiles.go b/vendor/golang.org/x/text/secure/precis/profiles.go index ad50ae857d60b..86010025c95ec 100644 --- a/vendor/golang.org/x/text/secure/precis/profiles.go +++ b/vendor/golang.org/x/text/secure/precis/profiles.go @@ -13,44 +13,66 @@ import ( ) var ( - Nickname *Profile = nickname // Implements the Nickname profile specified in RFC 7700. - UsernameCaseMapped *Profile = usernameCaseMap // Implements the UsernameCaseMapped profile specified in RFC 7613. - UsernameCasePreserved *Profile = usernameNoCaseMap // Implements the UsernameCasePreserved profile specified in RFC 7613. - OpaqueString *Profile = opaquestring // Implements the OpaqueString profile defined in RFC 7613 for passwords and other secure labels. + // Implements the Nickname profile specified in RFC 7700. + // The nickname profile is not idempotent and may need to be applied multiple + // times before being used for comparisons. + Nickname *Profile = nickname + + // Implements the UsernameCaseMapped profile specified in RFC 7613. + UsernameCaseMapped *Profile = usernameCaseMap + + // Implements the UsernameCasePreserved profile specified in RFC 7613. + UsernameCasePreserved *Profile = usernameNoCaseMap + + // Implements the OpaqueString profile defined in RFC 7613 for passwords and other secure labels. + OpaqueString *Profile = opaquestring ) -// TODO: mvl: "Ultimately, I would manually define the structs for the internal -// profiles. This avoid pulling in unneeded tables when they are not used." var ( - nickname = NewFreeform( - AdditionalMapping(func() transform.Transformer { - return &nickAdditionalMapping{} - }), - IgnoreCase, - Norm(norm.NFKC), - DisallowEmpty, - ) - usernameCaseMap = NewIdentifier( - FoldWidth, - FoldCase(), - Norm(norm.NFC), - BidiRule, - ) - usernameNoCaseMap = NewIdentifier( - FoldWidth, - Norm(norm.NFC), - BidiRule, - ) - opaquestring = NewFreeform( - AdditionalMapping(func() transform.Transformer { - return runes.Map(func(r rune) rune { - if unicode.Is(unicode.Zs, r) { - return ' ' - } - return r - }) - }), - Norm(norm.NFC), - DisallowEmpty, - ) + nickname = &Profile{ + options: getOpts( + AdditionalMapping(func() transform.Transformer { + return &nickAdditionalMapping{} + }), + IgnoreCase, + Norm(norm.NFKC), + DisallowEmpty, + ), + class: freeform, + } + usernameCaseMap = &Profile{ + options: getOpts( + FoldWidth, + LowerCase(), + Norm(norm.NFC), + BidiRule, + ), + class: identifier, + } + usernameNoCaseMap = &Profile{ + options: getOpts( + FoldWidth, + Norm(norm.NFC), + BidiRule, + ), + class: identifier, + } + opaquestring = &Profile{ + options: getOpts( + AdditionalMapping(func() transform.Transformer { + return mapSpaces + }), + Norm(norm.NFC), + DisallowEmpty, + ), + class: freeform, + } ) + +// mapSpaces is a shared value of a runes.Map transformer. +var mapSpaces transform.Transformer = runes.Map(func(r rune) rune { + if unicode.Is(unicode.Zs, r) { + return ' ' + } + return r +}) diff --git a/vendor/golang.org/x/text/secure/precis/tables.go b/vendor/golang.org/x/text/secure/precis/tables.go index a9b500deb0ead..2f550c1efa1e2 100644 --- a/vendor/golang.org/x/text/secure/precis/tables.go +++ b/vendor/golang.org/x/text/secure/precis/tables.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package precis diff --git a/vendor/golang.org/x/text/secure/precis/trieval.go b/vendor/golang.org/x/text/secure/precis/trieval.go index fed7d759522ec..4833f9622a989 100644 --- a/vendor/golang.org/x/text/secure/precis/trieval.go +++ b/vendor/golang.org/x/text/secure/precis/trieval.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package precis diff --git a/vendor/golang.org/x/text/transform/transform.go b/vendor/golang.org/x/text/transform/transform.go index 51862b02bf5b3..24dcca6a8c06d 100644 --- a/vendor/golang.org/x/text/transform/transform.go +++ b/vendor/golang.org/x/text/transform/transform.go @@ -24,6 +24,10 @@ var ( // complete the transformation. ErrShortSrc = errors.New("transform: short source buffer") + // ErrEndOfSpan means that the input and output (the transformed input) + // are not identical. + ErrEndOfSpan = errors.New("transform: input and output are not identical") + // errInconsistentByteCount means that Transform returned success (nil // error) but also returned nSrc inconsistent with the src argument. errInconsistentByteCount = errors.New("transform: inconsistent byte count returned") @@ -60,6 +64,41 @@ type Transformer interface { Reset() } +// SpanningTransformer extends the Transformer interface with a Span method +// that determines how much of the input already conforms to the Transformer. +type SpanningTransformer interface { + Transformer + + // Span returns a position in src such that transforming src[:n] results in + // identical output src[:n] for these bytes. It does not necessarily return + // the largest such n. The atEOF argument tells whether src represents the + // last bytes of the input. + // + // Callers should always account for the n bytes consumed before + // considering the error err. + // + // A nil error means that all input bytes are known to be identical to the + // output produced by the Transformer. A nil error can be be returned + // regardless of whether atEOF is true. If err is nil, then then n must + // equal len(src); the converse is not necessarily true. + // + // ErrEndOfSpan means that the Transformer output may differ from the + // input after n bytes. Note that n may be len(src), meaning that the output + // would contain additional bytes after otherwise identical output. + // ErrShortSrc means that src had insufficient data to determine whether the + // remaining bytes would change. Other than the error conditions listed + // here, implementations are free to report other errors that arise. + // + // Calling Span can modify the Transformer state as a side effect. In + // effect, it does the transformation just as calling Transform would, only + // without copying to a destination buffer and only up to a point it can + // determine the input and output bytes are the same. This is obviously more + // limited than calling Transform, but can be more efficient in terms of + // copying and allocating buffers. Calls to Span and Transform may be + // interleaved. + Span(src []byte, atEOF bool) (n int, err error) +} + // NopResetter can be embedded by implementations of Transformer to add a nop // Reset method. type NopResetter struct{} @@ -278,6 +317,10 @@ func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { return n, n, err } +func (nop) Span(src []byte, atEOF bool) (n int, err error) { + return len(src), nil +} + type discard struct{ NopResetter } func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { @@ -289,8 +332,8 @@ var ( // by consuming all bytes and writing nothing. Discard Transformer = discard{} - // Nop is a Transformer that copies src to dst. - Nop Transformer = nop{} + // Nop is a SpanningTransformer that copies src to dst. + Nop SpanningTransformer = nop{} ) // chain is a sequence of links. A chain with N Transformers has N+1 links and @@ -358,6 +401,8 @@ func (c *chain) Reset() { } } +// TODO: make chain use Span (is going to be fun to implement!) + // Transform applies the transformers of c in sequence. func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { // Set up src and dst in the chain. @@ -448,8 +493,7 @@ func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err erro return dstL.n, srcL.p, err } -// RemoveFunc returns a Transformer that removes from the input all runes r for -// which f(r) is true. Illegal bytes in the input are replaced by RuneError. +// Deprecated: use runes.Remove instead. func RemoveFunc(f func(r rune) bool) Transformer { return removeF(f) } diff --git a/vendor/golang.org/x/text/unicode/bidi/bracket.go b/vendor/golang.org/x/text/unicode/bidi/bracket.go index e88119d1b1d86..601e259203ebb 100644 --- a/vendor/golang.org/x/text/unicode/bidi/bracket.go +++ b/vendor/golang.org/x/text/unicode/bidi/bracket.go @@ -84,7 +84,7 @@ func resolvePairedBrackets(s *isolatingRunSequence) { dirEmbed = R } p.locateBrackets(s.p.pairTypes, s.p.pairValues) - p.resolveBrackets(dirEmbed) + p.resolveBrackets(dirEmbed, s.p.initialTypes) } type bracketPairer struct { @@ -125,6 +125,8 @@ func (p *bracketPairer) matchOpener(pairValues []rune, opener, closer int) bool return pairValues[p.indexes[opener]] == pairValues[p.indexes[closer]] } +const maxPairingDepth = 63 + // locateBrackets locates matching bracket pairs according to BD16. // // This implementation uses a linked list instead of a stack, because, while @@ -136,11 +138,17 @@ func (p *bracketPairer) locateBrackets(pairTypes []bracketType, pairValues []run for i, index := range p.indexes { // look at the bracket type for each character - switch pairTypes[index] { - case bpNone: + if pairTypes[index] == bpNone || p.codesIsolatedRun[i] != ON { // continue scanning - + continue + } + switch pairTypes[index] { case bpOpen: + // check if maximum pairing depth reached + if p.openers.Len() == maxPairingDepth { + p.openers.Init() + return + } // remember opener location, most recent first p.openers.PushFront(i) @@ -270,7 +278,7 @@ func (p *bracketPairer) classBeforePair(loc bracketPair) Class { } // assignBracketType implements rule N0 for a single bracket pair. -func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class) { +func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class, initialTypes []Class) { // rule "N0, a", inspect contents of pair dirPair := p.classifyPairContent(loc, dirEmbed) @@ -295,13 +303,33 @@ func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class) { // direction // set the bracket types to the type found + p.setBracketsToType(loc, dirPair, initialTypes) +} + +func (p *bracketPairer) setBracketsToType(loc bracketPair, dirPair Class, initialTypes []Class) { p.codesIsolatedRun[loc.opener] = dirPair p.codesIsolatedRun[loc.closer] = dirPair + + for i := loc.opener + 1; i < loc.closer; i++ { + index := p.indexes[i] + if initialTypes[index] != NSM { + break + } + p.codesIsolatedRun[i] = dirPair + } + + for i := loc.closer + 1; i < len(p.indexes); i++ { + index := p.indexes[i] + if initialTypes[index] != NSM { + break + } + p.codesIsolatedRun[i] = dirPair + } } // resolveBrackets implements rule N0 for a list of pairs. -func (p *bracketPairer) resolveBrackets(dirEmbed Class) { +func (p *bracketPairer) resolveBrackets(dirEmbed Class, initialTypes []Class) { for _, loc := range p.pairPositions { - p.assignBracketType(loc, dirEmbed) + p.assignBracketType(loc, dirEmbed, initialTypes) } } diff --git a/vendor/golang.org/x/text/unicode/bidi/core.go b/vendor/golang.org/x/text/unicode/bidi/core.go index 381f30ad0aef3..d4c1399f0da01 100644 --- a/vendor/golang.org/x/text/unicode/bidi/core.go +++ b/vendor/golang.org/x/text/unicode/bidi/core.go @@ -309,6 +309,9 @@ func (p *paragraph) determineExplicitEmbeddingLevels() { } if isIsolate { p.resultLevels[i] = stack.lastEmbeddingLevel() + if stack.lastDirectionalOverrideStatus() != ON { + p.resultTypes[i] = stack.lastDirectionalOverrideStatus() + } } var newLevel level @@ -723,7 +726,7 @@ loop: continue loop } } - log.Panicf("invalid bidi code %s present in assertOnly at position %d", t, s.indexes[i]) + log.Panicf("invalid bidi code %v present in assertOnly at position %d", t, s.indexes[i]) } } diff --git a/vendor/golang.org/x/text/unicode/bidi/tables.go b/vendor/golang.org/x/text/unicode/bidi/tables.go index 2d4dde07c54a9..7212d5add1518 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/trieval.go b/vendor/golang.org/x/text/unicode/bidi/trieval.go index bebd855efde16..4c459c4b72e0e 100644 --- a/vendor/golang.org/x/text/unicode/bidi/trieval.go +++ b/vendor/golang.org/x/text/unicode/bidi/trieval.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package bidi diff --git a/vendor/golang.org/x/text/unicode/norm/composition.go b/vendor/golang.org/x/text/unicode/norm/composition.go index d17b278adc347..bab4c5de02f5f 100644 --- a/vendor/golang.org/x/text/unicode/norm/composition.go +++ b/vendor/golang.org/x/text/unicode/norm/composition.go @@ -33,17 +33,9 @@ const ( // streamSafe implements the policy of when a CGJ should be inserted. type streamSafe uint8 -// mkStreamSafe is a shorthand for declaring a streamSafe var and calling -// first on it. -func mkStreamSafe(p Properties) streamSafe { - return streamSafe(p.nTrailingNonStarters()) -} - -// first inserts the first rune of a segment. +// first inserts the first rune of a segment. It is a faster version of next if +// it is known p represents the first rune in a segment. func (ss *streamSafe) first(p Properties) { - if *ss != 0 { - panic("!= 0") - } *ss = streamSafe(p.nTrailingNonStarters()) } @@ -66,7 +58,7 @@ func (ss *streamSafe) next(p Properties) ssState { // be a non-starter. Note that it always hold that if nLead > 0 then // nLead == nTrail. if n == 0 { - *ss = 0 + *ss = streamSafe(p.nTrailingNonStarters()) return ssStarter } return ssSuccess @@ -142,7 +134,6 @@ func (rb *reorderBuffer) setFlusher(out []byte, f func(*reorderBuffer) bool) { func (rb *reorderBuffer) reset() { rb.nrune = 0 rb.nbyte = 0 - rb.ss = 0 } func (rb *reorderBuffer) doFlush() bool { @@ -257,6 +248,9 @@ func (rb *reorderBuffer) insertUnsafe(src input, i int, info Properties) { // It flushes the buffer on each new segment start. func (rb *reorderBuffer) insertDecomposed(dcomp []byte) insertErr { rb.tmpBytes.setBytes(dcomp) + // As the streamSafe accounting already handles the counting for modifiers, + // we don't have to call next. However, we do need to keep the accounting + // intact when flushing the buffer. for i := 0; i < len(dcomp); { info := rb.f.info(rb.tmpBytes, i) if info.BoundaryBefore() && rb.nrune > 0 && !rb.doFlush() { diff --git a/vendor/golang.org/x/text/unicode/norm/forminfo.go b/vendor/golang.org/x/text/unicode/norm/forminfo.go index 15a67c653a355..e67e7655c547e 100644 --- a/vendor/golang.org/x/text/unicode/norm/forminfo.go +++ b/vendor/golang.org/x/text/unicode/norm/forminfo.go @@ -10,7 +10,7 @@ package norm // and its corresponding decomposing form share the same trie. Each trie maps // a rune to a uint16. The values take two forms. For v >= 0x8000: // bits -// 15: 1 (inverse of NFD_QD bit of qcInfo) +// 15: 1 (inverse of NFD_QC bit of qcInfo) // 13..7: qcInfo (see below). isYesD is always true (no decompostion). // 6..0: ccc (compressed CCC value). // For v < 0x8000, the respective rune has a decomposition and v is an index @@ -56,28 +56,31 @@ type formInfo struct { nextMain iterFunc } -var formTable []*formInfo - -func init() { - formTable = make([]*formInfo, 4) - - for i := range formTable { - f := &formInfo{} - formTable[i] = f - f.form = Form(i) - if Form(i) == NFKD || Form(i) == NFKC { - f.compatibility = true - f.info = lookupInfoNFKC - } else { - f.info = lookupInfoNFC - } - f.nextMain = nextDecomposed - if Form(i) == NFC || Form(i) == NFKC { - f.nextMain = nextComposed - f.composing = true - } - } -} +var formTable = []*formInfo{{ + form: NFC, + composing: true, + compatibility: false, + info: lookupInfoNFC, + nextMain: nextComposed, +}, { + form: NFD, + composing: false, + compatibility: false, + info: lookupInfoNFC, + nextMain: nextDecomposed, +}, { + form: NFKC, + composing: true, + compatibility: true, + info: lookupInfoNFKC, + nextMain: nextComposed, +}, { + form: NFKD, + composing: false, + compatibility: true, + info: lookupInfoNFKC, + nextMain: nextDecomposed, +}} // We do not distinguish between boundaries for NFC, NFD, etc. to avoid // unexpected behavior for the user. For example, in NFD, there is a boundary diff --git a/vendor/golang.org/x/text/unicode/norm/input.go b/vendor/golang.org/x/text/unicode/norm/input.go index 045d4ccce2ee1..479e35bc2585b 100644 --- a/vendor/golang.org/x/text/unicode/norm/input.go +++ b/vendor/golang.org/x/text/unicode/norm/input.go @@ -90,16 +90,20 @@ func (in *input) charinfoNFKC(p int) (uint16, int) { } func (in *input) hangul(p int) (r rune) { + var size int if in.bytes == nil { if !isHangulString(in.str[p:]) { return 0 } - r, _ = utf8.DecodeRuneInString(in.str[p:]) + r, size = utf8.DecodeRuneInString(in.str[p:]) } else { if !isHangul(in.bytes[p:]) { return 0 } - r, _ = utf8.DecodeRune(in.bytes[p:]) + r, size = utf8.DecodeRune(in.bytes[p:]) + } + if size != hangulUTF8Size { + return 0 } return r } diff --git a/vendor/golang.org/x/text/unicode/norm/iter.go b/vendor/golang.org/x/text/unicode/norm/iter.go index 0a42a72de81c0..ce17f96c2e0ca 100644 --- a/vendor/golang.org/x/text/unicode/norm/iter.go +++ b/vendor/golang.org/x/text/unicode/norm/iter.go @@ -41,6 +41,7 @@ func (i *Iter) Init(f Form, src []byte) { i.next = i.rb.f.nextMain i.asciiF = nextASCIIBytes i.info = i.rb.f.info(i.rb.src, i.p) + i.rb.ss.first(i.info) } // InitString initializes i to iterate over src after normalizing it to Form f. @@ -56,11 +57,12 @@ func (i *Iter) InitString(f Form, src string) { i.next = i.rb.f.nextMain i.asciiF = nextASCIIString i.info = i.rb.f.info(i.rb.src, i.p) + i.rb.ss.first(i.info) } // Seek sets the segment to be returned by the next call to Next to start // at position p. It is the responsibility of the caller to set p to the -// start of a UTF8 rune. +// start of a segment. func (i *Iter) Seek(offset int64, whence int) (int64, error) { var abs int64 switch whence { @@ -84,6 +86,7 @@ func (i *Iter) Seek(offset int64, whence int) (int64, error) { i.multiSeg = nil i.next = i.rb.f.nextMain i.info = i.rb.f.info(i.rb.src, i.p) + i.rb.ss.first(i.info) return abs, nil } @@ -161,6 +164,7 @@ func nextHangul(i *Iter) []byte { if next >= i.rb.nsrc { i.setDone() } else if i.rb.src.hangul(next) == 0 { + i.rb.ss.next(i.info) i.info = i.rb.f.info(i.rb.src, i.p) i.next = i.rb.f.nextMain return i.next(i) @@ -204,12 +208,10 @@ func nextMultiNorm(i *Iter) []byte { if info.BoundaryBefore() { i.rb.compose() seg := i.buf[:i.rb.flushCopy(i.buf[:])] - i.rb.ss.first(info) i.rb.insertUnsafe(input{bytes: d}, j, info) i.multiSeg = d[j+int(info.size):] return seg } - i.rb.ss.next(info) i.rb.insertUnsafe(input{bytes: d}, j, info) j += int(info.size) } @@ -222,9 +224,9 @@ func nextMultiNorm(i *Iter) []byte { func nextDecomposed(i *Iter) (next []byte) { outp := 0 inCopyStart, outCopyStart := i.p, 0 - ss := mkStreamSafe(i.info) for { if sz := int(i.info.size); sz <= 1 { + i.rb.ss = 0 p := i.p i.p++ // ASCII or illegal byte. Either way, advance by 1. if i.p >= i.rb.nsrc { @@ -243,6 +245,8 @@ func nextDecomposed(i *Iter) (next []byte) { p := outp + len(d) if outp > 0 { i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) + // TODO: this condition should not be possible, but we leave it + // in for defensive purposes. if p > len(i.buf) { return i.buf[:outp] } @@ -266,7 +270,7 @@ func nextDecomposed(i *Iter) (next []byte) { } else { i.info = i.rb.f.info(i.rb.src, i.p) } - switch ss.next(i.info) { + switch i.rb.ss.next(i.info) { case ssOverflow: i.next = nextCGJDecompose fallthrough @@ -309,7 +313,7 @@ func nextDecomposed(i *Iter) (next []byte) { } prevCC := i.info.tccc i.info = i.rb.f.info(i.rb.src, i.p) - if v := ss.next(i.info); v == ssStarter { + if v := i.rb.ss.next(i.info); v == ssStarter { break } else if v == ssOverflow { i.next = nextCGJDecompose @@ -335,10 +339,6 @@ doNorm: func doNormDecomposed(i *Iter) []byte { for { - if s := i.rb.ss.next(i.info); s == ssOverflow { - i.next = nextCGJDecompose - break - } i.rb.insertUnsafe(i.rb.src, i.p, i.info) if i.p += int(i.info.size); i.p >= i.rb.nsrc { i.setDone() @@ -348,6 +348,10 @@ func doNormDecomposed(i *Iter) []byte { if i.info.ccc == 0 { break } + if s := i.rb.ss.next(i.info); s == ssOverflow { + i.next = nextCGJDecompose + break + } } // new segment or too many combining characters: exit normalization return i.buf[:i.rb.flushCopy(i.buf[:])] @@ -357,6 +361,7 @@ func nextCGJDecompose(i *Iter) []byte { i.rb.ss = 0 i.rb.insertCGJ() i.next = nextDecomposed + i.rb.ss.first(i.info) buf := doNormDecomposed(i) return buf } @@ -365,7 +370,6 @@ func nextCGJDecompose(i *Iter) []byte { func nextComposed(i *Iter) []byte { outp, startp := 0, i.p var prevCC uint8 - ss := mkStreamSafe(i.info) for { if !i.info.isYesC() { goto doNorm @@ -385,11 +389,12 @@ func nextComposed(i *Iter) []byte { i.setDone() break } else if i.rb.src._byte(i.p) < utf8.RuneSelf { + i.rb.ss = 0 i.next = i.asciiF break } i.info = i.rb.f.info(i.rb.src, i.p) - if v := ss.next(i.info); v == ssStarter { + if v := i.rb.ss.next(i.info); v == ssStarter { break } else if v == ssOverflow { i.next = nextCGJCompose @@ -401,8 +406,10 @@ func nextComposed(i *Iter) []byte { } return i.returnSlice(startp, i.p) doNorm: + // reset to start position i.p = startp i.info = i.rb.f.info(i.rb.src, i.p) + i.rb.ss.first(i.info) if i.info.multiSegment() { d := i.info.Decomposition() info := i.rb.f.info(input{bytes: d}, 0) diff --git a/vendor/golang.org/x/text/unicode/norm/maketables.go b/vendor/golang.org/x/text/unicode/norm/maketables.go index 07bdff6bdcde0..8d418160cad0b 100644 --- a/vendor/golang.org/x/text/unicode/norm/maketables.go +++ b/vendor/golang.org/x/text/unicode/norm/maketables.go @@ -35,12 +35,9 @@ func main() { computeNonStarterCounts() verifyComputed() printChars() - if *test { - testDerived() - printTestdata() - } else { - makeTables() - } + testDerived() + printTestdata() + makeTables() } var ( @@ -602,6 +599,7 @@ func printCharInfoTables(w io.Writer) int { } index := normalDecomp nTrail := chars[r].nTrailingNonStarters + nLead := chars[r].nLeadingNonStarters if tccc > 0 || lccc > 0 || nTrail > 0 { tccc <<= 2 tccc |= nTrail @@ -612,7 +610,7 @@ func printCharInfoTables(w io.Writer) int { index = firstCCC } } - if lccc > 0 { + if lccc > 0 || nLead > 0 { s += string([]byte{lccc}) if index == firstCCC { log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r) diff --git a/vendor/golang.org/x/text/unicode/norm/normalize.go b/vendor/golang.org/x/text/unicode/norm/normalize.go index a70805c266071..2747f6c9a4d0b 100644 --- a/vendor/golang.org/x/text/unicode/norm/normalize.go +++ b/vendor/golang.org/x/text/unicode/norm/normalize.go @@ -2,13 +2,18 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// Note: the file data_test.go that is generated should not be checked in. //go:generate go run maketables.go triegen.go -//go:generate go run maketables.go triegen.go -test +//go:generate go test -tags test // Package norm contains types and functions for normalizing Unicode strings. package norm -import "unicode/utf8" +import ( + "unicode/utf8" + + "golang.org/x/text/transform" +) // A Form denotes a canonical representation of Unicode code points. // The Unicode-defined normalization and equivalence forms are: @@ -263,6 +268,34 @@ func (f Form) QuickSpan(b []byte) int { return n } +// Span implements transform.SpanningTransformer. It returns a boundary n such +// that b[0:n] == f(b[0:n]). It is not guaranteed to return the largest such n. +func (f Form) Span(b []byte, atEOF bool) (n int, err error) { + n, ok := formTable[f].quickSpan(inputBytes(b), 0, len(b), atEOF) + if n < len(b) { + if !ok { + err = transform.ErrEndOfSpan + } else { + err = transform.ErrShortSrc + } + } + return n, err +} + +// SpanString returns a boundary n such that s[0:n] == f(s[0:n]). +// It is not guaranteed to return the largest such n. +func (f Form) SpanString(s string, atEOF bool) (n int, err error) { + n, ok := formTable[f].quickSpan(inputString(s), 0, len(s), atEOF) + if n < len(s) { + if !ok { + err = transform.ErrEndOfSpan + } else { + err = transform.ErrShortSrc + } + } + return n, err +} + // quickSpan returns a boundary n such that src[0:n] == f(src[0:n]) and // whether any non-normalized parts were found. If atEOF is false, n will // not point past the last segment if this segment might be become @@ -291,7 +324,6 @@ func (f *formInfo) quickSpan(src input, i, end int, atEOF bool) (n int, ok bool) // have an overflow for runes that are starters (e.g. with U+FF9E). switch ss.next(info) { case ssStarter: - ss.first(info) lastSegStart = i case ssOverflow: return lastSegStart, false @@ -321,7 +353,7 @@ func (f *formInfo) quickSpan(src input, i, end int, atEOF bool) (n int, ok bool) return lastSegStart, false } -// QuickSpanString returns a boundary n such that b[0:n] == f(s[0:n]). +// QuickSpanString returns a boundary n such that s[0:n] == f(s[0:n]). // It is not guaranteed to return the largest such n. func (f Form) QuickSpanString(s string) int { n, _ := formTable[f].quickSpan(inputString(s), 0, len(s), true) @@ -408,6 +440,8 @@ func (f Form) nextBoundary(src input, nsrc int, atEOF bool) int { } return -1 } + // TODO: Using streamSafe to determine the boundary isn't the same as + // using BoundaryBefore. Determine which should be used. if s := ss.next(info); s != ssSuccess { return i } @@ -472,15 +506,14 @@ func decomposeSegment(rb *reorderBuffer, sp int, atEOF bool) int { if info.size == 0 { return 0 } - if rb.nrune > 0 { - if s := rb.ss.next(info); s == ssStarter { - goto end - } else if s == ssOverflow { - rb.insertCGJ() + if s := rb.ss.next(info); s == ssStarter { + // TODO: this could be removed if we don't support merging. + if rb.nrune > 0 { goto end } - } else { - rb.ss.first(info) + } else if s == ssOverflow { + rb.insertCGJ() + goto end } if err := rb.insertFlush(rb.src, sp, info); err != iSuccess { return int(err) diff --git a/vendor/golang.org/x/text/unicode/norm/readwriter.go b/vendor/golang.org/x/text/unicode/norm/readwriter.go index 4fa0e04b21f4a..d926ee903e56f 100644 --- a/vendor/golang.org/x/text/unicode/norm/readwriter.go +++ b/vendor/golang.org/x/text/unicode/norm/readwriter.go @@ -112,7 +112,6 @@ func (r *normReader) Read(p []byte) (int, error) { } } } - panic("should not reach here") } // Reader returns a new reader that implements Read diff --git a/vendor/golang.org/x/text/unicode/norm/tables.go b/vendor/golang.org/x/text/unicode/norm/tables.go index a56697b571b59..bf9ff8038c459 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables.go +++ b/vendor/golang.org/x/text/unicode/norm/tables.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package norm @@ -27,14 +27,14 @@ const ( firstMulti = 0x186D firstCCC = 0x2C9E endMulti = 0x2F60 - firstLeadingCCC = 0x4A44 - firstCCCZeroExcept = 0x4A5A - firstStarterWithNLead = 0x4A81 - lastDecomp = 0x4A83 + firstLeadingCCC = 0x49AE + firstCCCZeroExcept = 0x4A78 + firstStarterWithNLead = 0x4A9F + lastDecomp = 0x4AA1 maxDecomp = 0x8000 ) -// decomps: 19075 bytes +// decomps: 19105 bytes var decomps = [...]byte{ // Bytes 0 - 3f 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, @@ -2443,283 +2443,287 @@ var decomps = [...]byte{ 0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D, 0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9, 0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43, - 0x73, 0xCC, 0x87, 0xC9, 0x43, 0xE1, 0x85, 0xA1, - 0x01, 0x43, 0xE1, 0x85, 0xA2, 0x01, 0x43, 0xE1, - 0x85, 0xA3, 0x01, 0x43, 0xE1, 0x85, 0xA4, 0x01, - 0x43, 0xE1, 0x85, 0xA5, 0x01, 0x43, 0xE1, 0x85, - 0xA6, 0x01, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x43, + 0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82, + 0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D, + 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE, + 0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC, + 0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9, // Bytes 4300 - 433f - 0xE1, 0x85, 0xA8, 0x01, 0x43, 0xE1, 0x85, 0xA9, - 0x01, 0x43, 0xE1, 0x85, 0xAA, 0x01, 0x43, 0xE1, - 0x85, 0xAB, 0x01, 0x43, 0xE1, 0x85, 0xAC, 0x01, - 0x43, 0xE1, 0x85, 0xAD, 0x01, 0x43, 0xE1, 0x85, - 0xAE, 0x01, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x43, - 0xE1, 0x85, 0xB0, 0x01, 0x43, 0xE1, 0x85, 0xB1, - 0x01, 0x43, 0xE1, 0x85, 0xB2, 0x01, 0x43, 0xE1, - 0x85, 0xB3, 0x01, 0x43, 0xE1, 0x85, 0xB4, 0x01, + 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE, + 0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, + 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9, + 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, + 0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC, + 0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, + 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, + 0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC, // Bytes 4340 - 437f - 0x43, 0xE1, 0x85, 0xB5, 0x01, 0x43, 0xE1, 0x86, - 0xAA, 0x01, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x43, - 0xE1, 0x86, 0xAD, 0x01, 0x43, 0xE1, 0x86, 0xB0, - 0x01, 0x43, 0xE1, 0x86, 0xB1, 0x01, 0x43, 0xE1, - 0x86, 0xB2, 0x01, 0x43, 0xE1, 0x86, 0xB3, 0x01, - 0x43, 0xE1, 0x86, 0xB4, 0x01, 0x43, 0xE1, 0x86, - 0xB5, 0x01, 0x44, 0x20, 0xE3, 0x82, 0x99, 0x0D, - 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D, 0x44, 0xC2, + 0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9, + 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7, + 0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7, + 0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7, // Bytes 4380 - 43bf - 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE, 0x91, 0xCC, - 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC, 0x81, 0xC9, - 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9, 0x44, 0xCE, - 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x9F, 0xCC, - 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x81, 0xC9, - 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x44, 0xCE, - 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB1, 0xCC, - 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC, 0x81, 0xC9, + 0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7, + 0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7, + 0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41, // Bytes 43c0 - 43ff - 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x44, 0xCE, - 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xBF, 0xCC, - 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC, 0x81, 0xC9, - 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9, 0x44, 0xD7, - 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7, 0x90, 0xD6, - 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41, 0x44, 0xD7, - 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7, 0x92, 0xD6, + 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49, + 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7, + 0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6, // Bytes 4400 - 443f - 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41, 0x44, 0xD7, - 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7, 0x95, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41, 0x44, 0xD7, - 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7, 0x99, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31, + 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8, + 0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, + 0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, + 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8, + 0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9, + 0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65, + 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9, // Bytes 4440 - 447f - 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7, 0x9C, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41, 0x44, 0xD7, - 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA3, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49, 0x44, 0xD7, - 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA7, 0xD6, - 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6, 0xBC, 0x41, + 0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9, + 0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75, + 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9, + 0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9, + 0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, + 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB, + 0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88, + 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC, // Bytes 4480 - 44bf - 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41, 0x44, 0xD7, - 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7, 0xA9, 0xD7, - 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6, 0xBC, 0x41, - 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31, 0x44, 0xD8, - 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8, 0xA7, 0xD9, - 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x94, 0xC9, - 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, 0x44, 0xD8, - 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8, 0xB1, 0xD9, + 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82, + 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45, + 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20, + 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, + 0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94, + 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9, + 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91, // Bytes 44c0 - 44ff - 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9, 0x8B, 0x59, - 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65, 0x44, 0xD9, - 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9, 0x80, 0xD9, - 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9, 0x91, 0x71, - 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75, 0x44, 0xD9, - 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x88, 0xD9, - 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9, 0xB0, 0x79, - 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x44, 0xDB, + 0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72, + 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45, + 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20, + 0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB, + 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC, + 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC, + 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6, + 0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6, // Bytes 4500 - 453f - 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB, 0x95, 0xD9, - 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88, 0xCC, 0x80, - 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC, 0x81, 0xCA, - 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82, 0xCA, 0x45, - 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x45, 0x20, - 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, - 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xCC, 0x94, - 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x94, 0xCC, + 0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9, + 0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, + 0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, + 0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1, // Bytes 4540 - 457f - 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94, 0xCD, 0x82, - 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9, 0x91, 0x72, - 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91, 0x72, 0x45, - 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72, 0x45, 0x20, - 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, - 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x91, - 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB, 0x9D, 0xCC, - 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF, + 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1, + 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2, + 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF, + 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97, // Bytes 4580 - 45bf - 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC, 0x88, 0xCC, - 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6, 0xBC, 0xD7, - 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6, 0xBC, 0xD7, - 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9, 0x8E, 0xD9, - 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, 0x8F, 0xD9, - 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9, 0x90, 0xD9, - 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95, 0xE0, 0xA4, - 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96, 0xE0, 0xA4, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8, + 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1, + 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2, + 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2, + 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3, // Bytes 45c0 - 45ff - 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97, 0xE0, 0xA4, - 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C, 0xE0, 0xA4, - 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1, 0xE0, 0xA4, - 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2, 0xE0, 0xA4, - 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB, 0xE0, 0xA4, - 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF, 0xE0, 0xA4, - 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1, 0xE0, 0xA6, - 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2, 0xE0, 0xA6, + 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86, + 0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85, + 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, + 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, + 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, + 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, + 0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2, + 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49, // Bytes 4600 - 463f - 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF, 0xE0, 0xA6, - 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96, 0xE0, 0xA8, - 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97, 0xE0, 0xA8, - 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C, 0xE0, 0xA8, - 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB, 0xE0, 0xA8, - 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2, 0xE0, 0xA8, - 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8, 0xE0, 0xA8, - 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1, 0xE0, 0xAC, - // Bytes 4640 - 467f - 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2, 0xE0, 0xAC, - 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2, 0xE0, 0xBE, - 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3, 0xE0, 0xBE, - 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86, 0xE3, 0x82, - 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85, 0x97, 0xF0, - 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x85, - 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, - 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, - // Bytes 4680 - 46bf - 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, - 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2, 0xE0, 0xBD, - 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49, 0xE0, 0xBE, - 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, + 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, + 0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, + 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, - 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, + 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, - 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, - // Bytes 46c0 - 46ff + 0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, - 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, - 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB1, 0xAE, - 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, - 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE, 0x4C, 0xF0, + // Bytes 4640 - 467f + 0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, + 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE, + 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, + 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, - 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, - 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, + 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, + 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, + 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, + // Bytes 4680 - 46bf + 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, + 0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC, + 0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83, + 0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A, + 0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43, + 0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9, + 0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC, + 0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83, + // Bytes 46c0 - 46ff + 0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3, + 0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F, + 0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9, + 0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC, + 0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83, + 0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8, + 0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53, + 0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9, // Bytes 4700 - 473f - 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, - 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, - 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, - 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x83, 0x41, - 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC, 0x86, 0xC9, - 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83, 0x41, 0xCC, - 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A, 0xC9, 0x83, - 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43, 0xCC, 0xA7, + 0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC, + 0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83, + 0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B, + 0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61, + 0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9, + 0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC, + 0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83, + 0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82, // Bytes 4740 - 477f - 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9, 0x83, 0x45, - 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC, 0xA3, 0xB5, - 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83, 0x49, 0xCC, - 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3, 0xB5, 0x83, - 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F, 0xCC, 0x83, - 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9, 0x83, 0x4F, - 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC, 0x88, 0xC9, - 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83, 0x4F, 0xCC, + 0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65, + 0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5, + 0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC, + 0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83, + 0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84, + 0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F, + 0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD, + 0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, // Bytes 4780 - 47bf - 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8, 0xA5, 0x83, - 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53, 0xCC, 0x81, - 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9, 0x83, 0x53, - 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC, 0x83, 0xC9, - 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83, 0x55, 0xCC, - 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B, 0xAD, 0x83, - 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61, 0xCC, 0x86, - 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9, 0x83, 0x61, + 0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83, + 0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C, + 0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75, + 0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9, + 0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC, + 0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9, + 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE, + 0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC, // Bytes 47c0 - 47ff - 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC, 0x8A, 0xC9, - 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83, 0x63, 0xCC, - 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82, 0xC9, 0x83, - 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65, 0xCC, 0xA3, - 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5, 0x83, 0x69, - 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC, 0xA3, 0xB5, - 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83, 0x6F, 0xCC, - 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84, 0xC9, 0x83, + 0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9, + 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE, + 0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9, + 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE, + 0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, + 0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9, + 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE, // Bytes 4800 - 483f - 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F, 0xCC, 0x88, - 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD, 0x83, 0x6F, - 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0xA8, 0xA5, - 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83, 0x73, 0xCC, - 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C, 0xC9, 0x83, - 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75, 0xCC, 0x83, - 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9, 0x83, 0x75, - 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC, 0x9B, 0xAD, + 0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, + 0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9, + 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE, + 0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9, + 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE, + 0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9, // Bytes 4840 - 487f - 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9, 0x84, 0xCE, - 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x95, 0xCC, - 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC, 0x94, 0xC9, - 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9, 0x84, 0xCE, - 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x99, 0xCC, - 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC, 0x94, 0xC9, - 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9, 0x84, 0xCE, - 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA5, 0xCC, + 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE, + 0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9, + 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF, + 0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC, + 0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9, + 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF, + 0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC, // Bytes 4880 - 48bf - 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x93, 0xC9, - 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9, 0x84, 0xCE, - 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, - 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x93, 0xC9, - 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9, 0x84, 0xCE, - 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE, 0xB5, 0xCC, - 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC, 0x94, 0xC9, - 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9, 0x84, 0xCE, + 0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9, + 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE, + 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, // Bytes 48c0 - 48ff - 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, - 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x94, 0xC9, - 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9, 0x84, 0xCE, - 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, - 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, 0x94, 0xC9, - 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9, 0x84, 0xCE, - 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF, 0x85, 0xCC, - 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x93, 0xC9, + 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, // Bytes 4900 - 493f - 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9, 0x84, 0xCF, - 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF, 0x89, 0xCC, - 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x93, 0xC9, - 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9, 0x84, 0xCF, - 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE, 0x91, 0xCC, - 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x91, 0xCC, - 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x91, 0xCC, - 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0x91, 0xCC, + 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, // Bytes 4940 - 497f - 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x91, 0xCC, - 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x91, 0xCC, - 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0x97, 0xCC, - 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x97, 0xCC, - 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x97, 0xCC, - 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0x97, 0xCC, - 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0x97, 0xCC, - 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0x97, 0xCC, + 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, + 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF, // Bytes 4980 - 49bf - 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, - 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, - 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, - 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, - 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, - 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xA9, 0xCC, - 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, - 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, + 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF, + 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC, + 0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32, + 0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85, // Bytes 49c0 - 49ff - 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, - 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, - 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, - 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB1, 0xCC, - 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, - 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, - 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, - 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, + 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43, + 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43, + 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43, // Bytes 4a00 - 4a3f - 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, - 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE, 0xB7, 0xCC, - 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF, 0x89, 0xCC, - 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF, 0x89, 0xCC, - 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF, 0x89, 0xCC, - 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF, 0x89, 0xCC, - 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF, 0x89, 0xCC, - 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF, 0x89, 0xCC, + 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43, + 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01, + 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43, + 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85, + 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01, // Bytes 4a40 - 4a7f - 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC, 0x80, 0xC9, - 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32, 0x42, 0xCC, - 0x93, 0xC9, 0x32, 0x44, 0xCC, 0x88, 0xCC, 0x81, - 0xCA, 0x32, 0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, - 0x43, 0xE3, 0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, - 0xBD, 0xB1, 0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, - 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, - 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, + 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43, + 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86, + 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01, + 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43, + 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86, + 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01, + 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32, + 0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3, // Bytes 4a80 - 4abf - 0x26, 0x00, 0x01, + 0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1, + 0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD, + 0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0, + 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00, + 0x01, } // lookup returns the trie value for the first UTF-8 encoding in s and @@ -2892,7 +2896,7 @@ func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { return 0 } -// nfcTrie. Total size: 10332 bytes (10.09 KiB). Checksum: ad355b768fddb1b6. +// nfcTrie. Total size: 10332 bytes (10.09 KiB). Checksum: 51cc525b297fc970. type nfcTrie struct{} func newNfcTrie(i int) *nfcTrie { @@ -2928,22 +2932,22 @@ var nfcValues = [2944]uint16{ 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 - 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x471e, 0xc3: 0x2f79, 0xc4: 0x472d, 0xc5: 0x4732, - 0xc6: 0xa000, 0xc7: 0x473c, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x4741, 0xcb: 0x2ffb, - 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x4755, 0xd1: 0x3104, - 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x475f, 0xd5: 0x4764, 0xd6: 0x4773, - 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x47a5, 0xdd: 0x3235, - 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x47af, 0xe3: 0x3285, - 0xe4: 0x47be, 0xe5: 0x47c3, 0xe6: 0xa000, 0xe7: 0x47cd, 0xe8: 0x32ee, 0xe9: 0x32f3, - 0xea: 0x47d2, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x47e6, - 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x47f0, 0xf5: 0x47f5, - 0xf6: 0x4804, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, - 0xfc: 0x4836, 0xfd: 0x3550, 0xff: 0x3569, + 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, + 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, + 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, + 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, + 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, + 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, + 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, + 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, + 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, + 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, + 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, // Block 0x4, offset 0x100 - 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x4723, 0x103: 0x47b4, 0x104: 0x2f9c, 0x105: 0x32a8, + 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, - 0x112: 0x4746, 0x113: 0x47d7, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, + 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, @@ -2954,12 +2958,12 @@ var nfcValues = [2944]uint16{ // Block 0x5, offset 0x140 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, - 0x14c: 0x4769, 0x14d: 0x47fa, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, + 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, - 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x478c, 0x15b: 0x481d, 0x15c: 0x317c, 0x15d: 0x348d, - 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x4791, 0x161: 0x4822, 0x162: 0x31a4, 0x163: 0x34ba, - 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x479b, 0x169: 0x482c, - 0x16a: 0x47a0, 0x16b: 0x4831, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, + 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, + 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, + 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, + 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000, @@ -2971,7 +2975,7 @@ var nfcValues = [2944]uint16{ 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, - 0x1aa: 0x4782, 0x1ab: 0x4813, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, + 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, 0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334, 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, @@ -2982,8 +2986,8 @@ var nfcValues = [2944]uint16{ 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, 0x1de: 0x305a, 0x1df: 0x3366, - 0x1e6: 0x4728, 0x1e7: 0x47b9, 0x1e8: 0x4750, 0x1e9: 0x47e1, - 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x476e, 0x1ef: 0x47ff, + 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, + 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, // Block 0x8, offset 0x200 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, @@ -2998,7 +3002,7 @@ var nfcValues = [2944]uint16{ 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, // Block 0x9, offset 0x240 - 0x240: 0x4a44, 0x241: 0x4a49, 0x242: 0x9932, 0x243: 0x4a4e, 0x244: 0x4a53, 0x245: 0x9936, + 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, @@ -3017,7 +3021,7 @@ var nfcValues = [2944]uint16{ 0x299: 0xa000, 0x29f: 0xa000, 0x2a1: 0xa000, 0x2a5: 0xa000, 0x2a9: 0xa000, - 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x4894, 0x2ad: 0x3697, 0x2ae: 0x48be, 0x2af: 0x36a9, + 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, 0x2b7: 0xa000, 0x2b9: 0xa000, 0x2bf: 0xa000, @@ -3078,15 +3082,15 @@ var nfcValues = [2944]uint16{ 0x424: 0x305f, 0x425: 0x336b, 0x426: 0x3055, 0x427: 0x3361, 0x428: 0x3064, 0x429: 0x3370, 0x42a: 0x3069, 0x42b: 0x3375, 0x42c: 0x30af, 0x42d: 0x33bb, 0x42e: 0x390b, 0x42f: 0x3a9a, 0x430: 0x30b9, 0x431: 0x33ca, 0x432: 0x30c3, 0x433: 0x33d4, 0x434: 0x30cd, 0x435: 0x33de, - 0x436: 0x475a, 0x437: 0x47eb, 0x438: 0x3912, 0x439: 0x3aa1, 0x43a: 0x30e6, 0x43b: 0x33f7, + 0x436: 0x46c4, 0x437: 0x4755, 0x438: 0x3912, 0x439: 0x3aa1, 0x43a: 0x30e6, 0x43b: 0x33f7, 0x43c: 0x30e1, 0x43d: 0x33f2, 0x43e: 0x30eb, 0x43f: 0x33fc, // Block 0x11, offset 0x440 0x440: 0x30f0, 0x441: 0x3401, 0x442: 0x30f5, 0x443: 0x3406, 0x444: 0x3109, 0x445: 0x341a, 0x446: 0x3113, 0x447: 0x3424, 0x448: 0x3122, 0x449: 0x3433, 0x44a: 0x311d, 0x44b: 0x342e, 0x44c: 0x3935, 0x44d: 0x3ac4, 0x44e: 0x3943, 0x44f: 0x3ad2, 0x450: 0x394a, 0x451: 0x3ad9, 0x452: 0x3951, 0x453: 0x3ae0, 0x454: 0x314f, 0x455: 0x3460, 0x456: 0x3154, 0x457: 0x3465, - 0x458: 0x315e, 0x459: 0x346f, 0x45a: 0x4787, 0x45b: 0x4818, 0x45c: 0x3997, 0x45d: 0x3b26, - 0x45e: 0x3177, 0x45f: 0x3488, 0x460: 0x3181, 0x461: 0x3492, 0x462: 0x4796, 0x463: 0x4827, + 0x458: 0x315e, 0x459: 0x346f, 0x45a: 0x46f1, 0x45b: 0x4782, 0x45c: 0x3997, 0x45d: 0x3b26, + 0x45e: 0x3177, 0x45f: 0x3488, 0x460: 0x3181, 0x461: 0x3492, 0x462: 0x4700, 0x463: 0x4791, 0x464: 0x399e, 0x465: 0x3b2d, 0x466: 0x39a5, 0x467: 0x3b34, 0x468: 0x39ac, 0x469: 0x3b3b, 0x46a: 0x3190, 0x46b: 0x34a1, 0x46c: 0x319a, 0x46d: 0x34b0, 0x46e: 0x31ae, 0x46f: 0x34c4, 0x470: 0x31a9, 0x471: 0x34bf, 0x472: 0x31ea, 0x473: 0x3500, 0x474: 0x31f9, 0x475: 0x350f, @@ -3098,16 +3102,16 @@ var nfcValues = [2944]uint16{ 0x48c: 0x322b, 0x48d: 0x3546, 0x48e: 0x3249, 0x48f: 0x3564, 0x490: 0x3262, 0x491: 0x3582, 0x492: 0x3271, 0x493: 0x3591, 0x494: 0x3276, 0x495: 0x3596, 0x496: 0x337a, 0x497: 0x34a6, 0x498: 0x3537, 0x499: 0x3573, 0x49b: 0x35d1, - 0x4a0: 0x4737, 0x4a1: 0x47c8, 0x4a2: 0x2f83, 0x4a3: 0x328f, + 0x4a0: 0x46a1, 0x4a1: 0x4732, 0x4a2: 0x2f83, 0x4a3: 0x328f, 0x4a4: 0x3878, 0x4a5: 0x3a07, 0x4a6: 0x3871, 0x4a7: 0x3a00, 0x4a8: 0x3886, 0x4a9: 0x3a15, 0x4aa: 0x387f, 0x4ab: 0x3a0e, 0x4ac: 0x38be, 0x4ad: 0x3a4d, 0x4ae: 0x3894, 0x4af: 0x3a23, 0x4b0: 0x388d, 0x4b1: 0x3a1c, 0x4b2: 0x38a2, 0x4b3: 0x3a31, 0x4b4: 0x389b, 0x4b5: 0x3a2a, - 0x4b6: 0x38c5, 0x4b7: 0x3a54, 0x4b8: 0x474b, 0x4b9: 0x47dc, 0x4ba: 0x3000, 0x4bb: 0x330c, + 0x4b6: 0x38c5, 0x4b7: 0x3a54, 0x4b8: 0x46b5, 0x4b9: 0x4746, 0x4ba: 0x3000, 0x4bb: 0x330c, 0x4bc: 0x2fec, 0x4bd: 0x32f8, 0x4be: 0x38da, 0x4bf: 0x3a69, // Block 0x13, offset 0x4c0 0x4c0: 0x38d3, 0x4c1: 0x3a62, 0x4c2: 0x38e8, 0x4c3: 0x3a77, 0x4c4: 0x38e1, 0x4c5: 0x3a70, 0x4c6: 0x38fd, 0x4c7: 0x3a8c, 0x4c8: 0x3091, 0x4c9: 0x339d, 0x4ca: 0x30a5, 0x4cb: 0x33b1, - 0x4cc: 0x477d, 0x4cd: 0x480e, 0x4ce: 0x3136, 0x4cf: 0x3447, 0x4d0: 0x3920, 0x4d1: 0x3aaf, + 0x4cc: 0x46e7, 0x4cd: 0x4778, 0x4ce: 0x3136, 0x4cf: 0x3447, 0x4d0: 0x3920, 0x4d1: 0x3aaf, 0x4d2: 0x3919, 0x4d3: 0x3aa8, 0x4d4: 0x392e, 0x4d5: 0x3abd, 0x4d6: 0x3927, 0x4d7: 0x3ab6, 0x4d8: 0x3989, 0x4d9: 0x3b18, 0x4da: 0x396d, 0x4db: 0x3afc, 0x4dc: 0x3966, 0x4dd: 0x3af5, 0x4de: 0x397b, 0x4df: 0x3b0a, 0x4e0: 0x3974, 0x4e1: 0x3b03, 0x4e2: 0x3982, 0x4e3: 0x3b11, @@ -3116,29 +3120,29 @@ var nfcValues = [2944]uint16{ 0x4f0: 0x39f9, 0x4f1: 0x3b88, 0x4f2: 0x3230, 0x4f3: 0x354b, 0x4f4: 0x3258, 0x4f5: 0x3578, 0x4f6: 0x3253, 0x4f7: 0x356e, 0x4f8: 0x323f, 0x4f9: 0x355a, // Block 0x14, offset 0x500 - 0x500: 0x489a, 0x501: 0x48a0, 0x502: 0x49b4, 0x503: 0x49cc, 0x504: 0x49bc, 0x505: 0x49d4, - 0x506: 0x49c4, 0x507: 0x49dc, 0x508: 0x4840, 0x509: 0x4846, 0x50a: 0x4924, 0x50b: 0x493c, - 0x50c: 0x492c, 0x50d: 0x4944, 0x50e: 0x4934, 0x50f: 0x494c, 0x510: 0x48ac, 0x511: 0x48b2, + 0x500: 0x4804, 0x501: 0x480a, 0x502: 0x491e, 0x503: 0x4936, 0x504: 0x4926, 0x505: 0x493e, + 0x506: 0x492e, 0x507: 0x4946, 0x508: 0x47aa, 0x509: 0x47b0, 0x50a: 0x488e, 0x50b: 0x48a6, + 0x50c: 0x4896, 0x50d: 0x48ae, 0x50e: 0x489e, 0x50f: 0x48b6, 0x510: 0x4816, 0x511: 0x481c, 0x512: 0x3db8, 0x513: 0x3dc8, 0x514: 0x3dc0, 0x515: 0x3dd0, - 0x518: 0x484c, 0x519: 0x4852, 0x51a: 0x3ce8, 0x51b: 0x3cf8, 0x51c: 0x3cf0, 0x51d: 0x3d00, - 0x520: 0x48c4, 0x521: 0x48ca, 0x522: 0x49e4, 0x523: 0x49fc, - 0x524: 0x49ec, 0x525: 0x4a04, 0x526: 0x49f4, 0x527: 0x4a0c, 0x528: 0x4858, 0x529: 0x485e, - 0x52a: 0x4954, 0x52b: 0x496c, 0x52c: 0x495c, 0x52d: 0x4974, 0x52e: 0x4964, 0x52f: 0x497c, - 0x530: 0x48dc, 0x531: 0x48e2, 0x532: 0x3e18, 0x533: 0x3e30, 0x534: 0x3e20, 0x535: 0x3e38, - 0x536: 0x3e28, 0x537: 0x3e40, 0x538: 0x4864, 0x539: 0x486a, 0x53a: 0x3d18, 0x53b: 0x3d30, + 0x518: 0x47b6, 0x519: 0x47bc, 0x51a: 0x3ce8, 0x51b: 0x3cf8, 0x51c: 0x3cf0, 0x51d: 0x3d00, + 0x520: 0x482e, 0x521: 0x4834, 0x522: 0x494e, 0x523: 0x4966, + 0x524: 0x4956, 0x525: 0x496e, 0x526: 0x495e, 0x527: 0x4976, 0x528: 0x47c2, 0x529: 0x47c8, + 0x52a: 0x48be, 0x52b: 0x48d6, 0x52c: 0x48c6, 0x52d: 0x48de, 0x52e: 0x48ce, 0x52f: 0x48e6, + 0x530: 0x4846, 0x531: 0x484c, 0x532: 0x3e18, 0x533: 0x3e30, 0x534: 0x3e20, 0x535: 0x3e38, + 0x536: 0x3e28, 0x537: 0x3e40, 0x538: 0x47ce, 0x539: 0x47d4, 0x53a: 0x3d18, 0x53b: 0x3d30, 0x53c: 0x3d20, 0x53d: 0x3d38, 0x53e: 0x3d28, 0x53f: 0x3d40, // Block 0x15, offset 0x540 - 0x540: 0x48e8, 0x541: 0x48ee, 0x542: 0x3e48, 0x543: 0x3e58, 0x544: 0x3e50, 0x545: 0x3e60, - 0x548: 0x4870, 0x549: 0x4876, 0x54a: 0x3d48, 0x54b: 0x3d58, - 0x54c: 0x3d50, 0x54d: 0x3d60, 0x550: 0x48fa, 0x551: 0x4900, + 0x540: 0x4852, 0x541: 0x4858, 0x542: 0x3e48, 0x543: 0x3e58, 0x544: 0x3e50, 0x545: 0x3e60, + 0x548: 0x47da, 0x549: 0x47e0, 0x54a: 0x3d48, 0x54b: 0x3d58, + 0x54c: 0x3d50, 0x54d: 0x3d60, 0x550: 0x4864, 0x551: 0x486a, 0x552: 0x3e80, 0x553: 0x3e98, 0x554: 0x3e88, 0x555: 0x3ea0, 0x556: 0x3e90, 0x557: 0x3ea8, - 0x559: 0x487c, 0x55b: 0x3d68, 0x55d: 0x3d70, - 0x55f: 0x3d78, 0x560: 0x4912, 0x561: 0x4918, 0x562: 0x4a14, 0x563: 0x4a2c, - 0x564: 0x4a1c, 0x565: 0x4a34, 0x566: 0x4a24, 0x567: 0x4a3c, 0x568: 0x4882, 0x569: 0x4888, - 0x56a: 0x4984, 0x56b: 0x499c, 0x56c: 0x498c, 0x56d: 0x49a4, 0x56e: 0x4994, 0x56f: 0x49ac, - 0x570: 0x488e, 0x571: 0x43b4, 0x572: 0x3691, 0x573: 0x43ba, 0x574: 0x48b8, 0x575: 0x43c0, - 0x576: 0x36a3, 0x577: 0x43c6, 0x578: 0x36c1, 0x579: 0x43cc, 0x57a: 0x36d9, 0x57b: 0x43d2, - 0x57c: 0x4906, 0x57d: 0x43d8, + 0x559: 0x47e6, 0x55b: 0x3d68, 0x55d: 0x3d70, + 0x55f: 0x3d78, 0x560: 0x487c, 0x561: 0x4882, 0x562: 0x497e, 0x563: 0x4996, + 0x564: 0x4986, 0x565: 0x499e, 0x566: 0x498e, 0x567: 0x49a6, 0x568: 0x47ec, 0x569: 0x47f2, + 0x56a: 0x48ee, 0x56b: 0x4906, 0x56c: 0x48f6, 0x56d: 0x490e, 0x56e: 0x48fe, 0x56f: 0x4916, + 0x570: 0x47f8, 0x571: 0x431e, 0x572: 0x3691, 0x573: 0x4324, 0x574: 0x4822, 0x575: 0x432a, + 0x576: 0x36a3, 0x577: 0x4330, 0x578: 0x36c1, 0x579: 0x4336, 0x57a: 0x36d9, 0x57b: 0x433c, + 0x57c: 0x4870, 0x57d: 0x4342, // Block 0x16, offset 0x580 0x580: 0x3da0, 0x581: 0x3da8, 0x582: 0x4184, 0x583: 0x41a2, 0x584: 0x418e, 0x585: 0x41ac, 0x586: 0x4198, 0x587: 0x41b6, 0x588: 0x3cd8, 0x589: 0x3ce0, 0x58a: 0x40d0, 0x58b: 0x40ee, @@ -3149,19 +3153,19 @@ var nfcValues = [2944]uint16{ 0x5a4: 0x4206, 0x5a5: 0x4224, 0x5a6: 0x4210, 0x5a7: 0x422e, 0x5a8: 0x3d80, 0x5a9: 0x3d88, 0x5aa: 0x4148, 0x5ab: 0x4166, 0x5ac: 0x4152, 0x5ad: 0x4170, 0x5ae: 0x415c, 0x5af: 0x417a, 0x5b0: 0x3685, 0x5b1: 0x367f, 0x5b2: 0x3d90, 0x5b3: 0x368b, 0x5b4: 0x3d98, - 0x5b6: 0x48a6, 0x5b7: 0x3db0, 0x5b8: 0x35f5, 0x5b9: 0x35ef, 0x5ba: 0x35e3, 0x5bb: 0x4384, + 0x5b6: 0x4810, 0x5b7: 0x3db0, 0x5b8: 0x35f5, 0x5b9: 0x35ef, 0x5ba: 0x35e3, 0x5bb: 0x42ee, 0x5bc: 0x35fb, 0x5bd: 0x8100, 0x5be: 0x01d3, 0x5bf: 0xa100, // Block 0x17, offset 0x5c0 0x5c0: 0x8100, 0x5c1: 0x35a7, 0x5c2: 0x3dd8, 0x5c3: 0x369d, 0x5c4: 0x3de0, - 0x5c6: 0x48d0, 0x5c7: 0x3df8, 0x5c8: 0x3601, 0x5c9: 0x438a, 0x5ca: 0x360d, 0x5cb: 0x4390, + 0x5c6: 0x483a, 0x5c7: 0x3df8, 0x5c8: 0x3601, 0x5c9: 0x42f4, 0x5ca: 0x360d, 0x5cb: 0x42fa, 0x5cc: 0x3619, 0x5cd: 0x3b8f, 0x5ce: 0x3b96, 0x5cf: 0x3b9d, 0x5d0: 0x36b5, 0x5d1: 0x36af, - 0x5d2: 0x3e00, 0x5d3: 0x457a, 0x5d6: 0x36bb, 0x5d7: 0x3e10, - 0x5d8: 0x3631, 0x5d9: 0x362b, 0x5da: 0x361f, 0x5db: 0x4396, 0x5dd: 0x3ba4, - 0x5de: 0x3bab, 0x5df: 0x3bb2, 0x5e0: 0x36eb, 0x5e1: 0x36e5, 0x5e2: 0x3e68, 0x5e3: 0x4582, + 0x5d2: 0x3e00, 0x5d3: 0x44e4, 0x5d6: 0x36bb, 0x5d7: 0x3e10, + 0x5d8: 0x3631, 0x5d9: 0x362b, 0x5da: 0x361f, 0x5db: 0x4300, 0x5dd: 0x3ba4, + 0x5de: 0x3bab, 0x5df: 0x3bb2, 0x5e0: 0x36eb, 0x5e1: 0x36e5, 0x5e2: 0x3e68, 0x5e3: 0x44ec, 0x5e4: 0x36cd, 0x5e5: 0x36d3, 0x5e6: 0x36f1, 0x5e7: 0x3e78, 0x5e8: 0x3661, 0x5e9: 0x365b, - 0x5ea: 0x364f, 0x5eb: 0x43a2, 0x5ec: 0x3649, 0x5ed: 0x359b, 0x5ee: 0x437e, 0x5ef: 0x0081, + 0x5ea: 0x364f, 0x5eb: 0x430c, 0x5ec: 0x3649, 0x5ed: 0x359b, 0x5ee: 0x42e8, 0x5ef: 0x0081, 0x5f2: 0x3eb0, 0x5f3: 0x36f7, 0x5f4: 0x3eb8, - 0x5f6: 0x491e, 0x5f7: 0x3ed0, 0x5f8: 0x363d, 0x5f9: 0x439c, 0x5fa: 0x366d, 0x5fb: 0x43ae, + 0x5f6: 0x4888, 0x5f7: 0x3ed0, 0x5f8: 0x363d, 0x5f9: 0x4306, 0x5fa: 0x366d, 0x5fb: 0x4318, 0x5fc: 0x3679, 0x5fd: 0x4256, 0x5fe: 0xa100, // Block 0x18, offset 0x600 0x601: 0x3c06, 0x603: 0xa000, 0x604: 0x3c0d, 0x605: 0xa000, @@ -3519,8 +3523,8 @@ var nfcSparseValues = [688]valueRange{ {value: 0x8100, lo: 0xb8, hi: 0xb8}, // Block 0x1, offset 0x5 {value: 0x0091, lo: 0x03}, - {value: 0x4778, lo: 0xa0, hi: 0xa1}, - {value: 0x47aa, lo: 0xaf, hi: 0xb0}, + {value: 0x46e2, lo: 0xa0, hi: 0xa1}, + {value: 0x4714, lo: 0xaf, hi: 0xb0}, {value: 0xa000, lo: 0xb7, hi: 0xb7}, // Block 0x2, offset 0x9 {value: 0x0000, lo: 0x01}, @@ -3533,11 +3537,11 @@ var nfcSparseValues = [688]valueRange{ {value: 0xa000, lo: 0x81, hi: 0x81}, {value: 0xa000, lo: 0x85, hi: 0x85}, {value: 0xa000, lo: 0x89, hi: 0x89}, - {value: 0x48d6, lo: 0x8a, hi: 0x8a}, - {value: 0x48f4, lo: 0x8b, hi: 0x8b}, + {value: 0x4840, lo: 0x8a, hi: 0x8a}, + {value: 0x485e, lo: 0x8b, hi: 0x8b}, {value: 0x36c7, lo: 0x8c, hi: 0x8c}, {value: 0x36df, lo: 0x8d, hi: 0x8d}, - {value: 0x490c, lo: 0x8e, hi: 0x8e}, + {value: 0x4876, lo: 0x8e, hi: 0x8e}, {value: 0xa000, lo: 0x92, hi: 0x92}, {value: 0x36fd, lo: 0x93, hi: 0x94}, // Block 0x5, offset 0x18 @@ -3665,7 +3669,7 @@ var nfcSparseValues = [688]valueRange{ {value: 0x812d, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x93, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x94}, - {value: 0x45b2, lo: 0x98, hi: 0x9f}, + {value: 0x451c, lo: 0x98, hi: 0x9f}, // Block 0x12, offset 0x89 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, @@ -3676,18 +3680,18 @@ var nfcSparseValues = [688]valueRange{ {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, - {value: 0x45f2, lo: 0x9c, hi: 0x9d}, - {value: 0x4602, lo: 0x9f, hi: 0x9f}, + {value: 0x455c, lo: 0x9c, hi: 0x9d}, + {value: 0x456c, lo: 0x9f, hi: 0x9f}, // Block 0x14, offset 0x93 {value: 0x0000, lo: 0x03}, - {value: 0x462a, lo: 0xb3, hi: 0xb3}, - {value: 0x4632, lo: 0xb6, hi: 0xb6}, + {value: 0x4594, lo: 0xb3, hi: 0xb3}, + {value: 0x459c, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x15, offset 0x97 {value: 0x0008, lo: 0x03}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x460a, lo: 0x99, hi: 0x9b}, - {value: 0x4622, lo: 0x9e, hi: 0x9e}, + {value: 0x4574, lo: 0x99, hi: 0x9b}, + {value: 0x458c, lo: 0x9e, hi: 0x9e}, // Block 0x16, offset 0x9b {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, @@ -3702,8 +3706,8 @@ var nfcSparseValues = [688]valueRange{ {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x96, hi: 0x97}, - {value: 0x463a, lo: 0x9c, hi: 0x9c}, - {value: 0x4642, lo: 0x9d, hi: 0x9d}, + {value: 0x45a4, lo: 0x9c, hi: 0x9c}, + {value: 0x45ac, lo: 0x9d, hi: 0x9d}, // Block 0x19, offset 0xa8 {value: 0x0000, lo: 0x03}, {value: 0xa000, lo: 0x92, hi: 0x92}, @@ -3787,18 +3791,18 @@ var nfcSparseValues = [688]valueRange{ {value: 0x263d, lo: 0xa9, hi: 0xa9}, {value: 0x8126, lo: 0xb1, hi: 0xb1}, {value: 0x8127, lo: 0xb2, hi: 0xb2}, - {value: 0x4a66, lo: 0xb3, hi: 0xb3}, + {value: 0x4a84, lo: 0xb3, hi: 0xb3}, {value: 0x8128, lo: 0xb4, hi: 0xb4}, - {value: 0x4a6f, lo: 0xb5, hi: 0xb5}, - {value: 0x464a, lo: 0xb6, hi: 0xb6}, + {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, + {value: 0x45b4, lo: 0xb6, hi: 0xb6}, {value: 0x8200, lo: 0xb7, hi: 0xb7}, - {value: 0x4652, lo: 0xb8, hi: 0xb8}, + {value: 0x45bc, lo: 0xb8, hi: 0xb8}, {value: 0x8200, lo: 0xb9, hi: 0xb9}, {value: 0x8127, lo: 0xba, hi: 0xbd}, // Block 0x27, offset 0xf5 {value: 0x0000, lo: 0x0b}, {value: 0x8127, lo: 0x80, hi: 0x80}, - {value: 0x4a78, lo: 0x81, hi: 0x81}, + {value: 0x4a96, lo: 0x81, hi: 0x81}, {value: 0x8132, lo: 0x82, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0x86, hi: 0x87}, @@ -3975,7 +3979,7 @@ var nfcSparseValues = [688]valueRange{ {value: 0x048b, lo: 0xa9, hi: 0xaa}, // Block 0x45, offset 0x189 {value: 0x0000, lo: 0x01}, - {value: 0x4573, lo: 0x9c, hi: 0x9c}, + {value: 0x44dd, lo: 0x9c, hi: 0x9c}, // Block 0x46, offset 0x18b {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0xaf, hi: 0xb1}, @@ -3994,12 +3998,12 @@ var nfcSparseValues = [688]valueRange{ {value: 0x812f, lo: 0xae, hi: 0xaf}, // Block 0x4a, offset 0x197 {value: 0x0000, lo: 0x03}, - {value: 0x4a81, lo: 0xb3, hi: 0xb3}, - {value: 0x4a81, lo: 0xb5, hi: 0xb6}, - {value: 0x4a81, lo: 0xba, hi: 0xbf}, + {value: 0x4a9f, lo: 0xb3, hi: 0xb3}, + {value: 0x4a9f, lo: 0xb5, hi: 0xb6}, + {value: 0x4a9f, lo: 0xba, hi: 0xbf}, // Block 0x4b, offset 0x19b {value: 0x0000, lo: 0x01}, - {value: 0x4a81, lo: 0x8f, hi: 0xa3}, + {value: 0x4a9f, lo: 0x8f, hi: 0xa3}, // Block 0x4c, offset 0x19d {value: 0x0000, lo: 0x01}, {value: 0x8100, lo: 0xae, hi: 0xbe}, @@ -4119,29 +4123,29 @@ var nfcSparseValues = [688]valueRange{ {value: 0xc600, lo: 0x89, hi: 0xa3}, // Block 0x63, offset 0x1fb {value: 0x0006, lo: 0x0d}, - {value: 0x4426, lo: 0x9d, hi: 0x9d}, + {value: 0x4390, lo: 0x9d, hi: 0x9d}, {value: 0x8115, lo: 0x9e, hi: 0x9e}, - {value: 0x4498, lo: 0x9f, hi: 0x9f}, - {value: 0x4486, lo: 0xaa, hi: 0xab}, - {value: 0x458a, lo: 0xac, hi: 0xac}, - {value: 0x4592, lo: 0xad, hi: 0xad}, - {value: 0x43de, lo: 0xae, hi: 0xb1}, - {value: 0x43fc, lo: 0xb2, hi: 0xb4}, - {value: 0x4414, lo: 0xb5, hi: 0xb6}, - {value: 0x4420, lo: 0xb8, hi: 0xb8}, - {value: 0x442c, lo: 0xb9, hi: 0xbb}, - {value: 0x4444, lo: 0xbc, hi: 0xbc}, - {value: 0x444a, lo: 0xbe, hi: 0xbe}, + {value: 0x4402, lo: 0x9f, hi: 0x9f}, + {value: 0x43f0, lo: 0xaa, hi: 0xab}, + {value: 0x44f4, lo: 0xac, hi: 0xac}, + {value: 0x44fc, lo: 0xad, hi: 0xad}, + {value: 0x4348, lo: 0xae, hi: 0xb1}, + {value: 0x4366, lo: 0xb2, hi: 0xb4}, + {value: 0x437e, lo: 0xb5, hi: 0xb6}, + {value: 0x438a, lo: 0xb8, hi: 0xb8}, + {value: 0x4396, lo: 0xb9, hi: 0xbb}, + {value: 0x43ae, lo: 0xbc, hi: 0xbc}, + {value: 0x43b4, lo: 0xbe, hi: 0xbe}, // Block 0x64, offset 0x209 {value: 0x0006, lo: 0x08}, - {value: 0x4450, lo: 0x80, hi: 0x81}, - {value: 0x445c, lo: 0x83, hi: 0x84}, - {value: 0x446e, lo: 0x86, hi: 0x89}, - {value: 0x4492, lo: 0x8a, hi: 0x8a}, - {value: 0x440e, lo: 0x8b, hi: 0x8b}, - {value: 0x43f6, lo: 0x8c, hi: 0x8c}, - {value: 0x443e, lo: 0x8d, hi: 0x8d}, - {value: 0x4468, lo: 0x8e, hi: 0x8e}, + {value: 0x43ba, lo: 0x80, hi: 0x81}, + {value: 0x43c6, lo: 0x83, hi: 0x84}, + {value: 0x43d8, lo: 0x86, hi: 0x89}, + {value: 0x43fc, lo: 0x8a, hi: 0x8a}, + {value: 0x4378, lo: 0x8b, hi: 0x8b}, + {value: 0x4360, lo: 0x8c, hi: 0x8c}, + {value: 0x43a8, lo: 0x8d, hi: 0x8d}, + {value: 0x43d2, lo: 0x8e, hi: 0x8e}, // Block 0x65, offset 0x212 {value: 0x0000, lo: 0x02}, {value: 0x8100, lo: 0xa4, hi: 0xa5}, @@ -4179,16 +4183,16 @@ var nfcSparseValues = [688]valueRange{ {value: 0x8100, lo: 0xb5, hi: 0xba}, // Block 0x6e, offset 0x22c {value: 0x0000, lo: 0x04}, - {value: 0x4a81, lo: 0x9e, hi: 0x9f}, - {value: 0x4a81, lo: 0xa3, hi: 0xa3}, - {value: 0x4a81, lo: 0xa5, hi: 0xa6}, - {value: 0x4a81, lo: 0xaa, hi: 0xaf}, + {value: 0x4a9f, lo: 0x9e, hi: 0x9f}, + {value: 0x4a9f, lo: 0xa3, hi: 0xa3}, + {value: 0x4a9f, lo: 0xa5, hi: 0xa6}, + {value: 0x4a9f, lo: 0xaa, hi: 0xaf}, // Block 0x6f, offset 0x231 {value: 0x0000, lo: 0x05}, - {value: 0x4a81, lo: 0x82, hi: 0x87}, - {value: 0x4a81, lo: 0x8a, hi: 0x8f}, - {value: 0x4a81, lo: 0x92, hi: 0x97}, - {value: 0x4a81, lo: 0x9a, hi: 0x9c}, + {value: 0x4a9f, lo: 0x82, hi: 0x87}, + {value: 0x4a9f, lo: 0x8a, hi: 0x8f}, + {value: 0x4a9f, lo: 0x92, hi: 0x97}, + {value: 0x4a9f, lo: 0x9a, hi: 0x9c}, {value: 0x8100, lo: 0xa3, hi: 0xa3}, // Block 0x70, offset 0x237 {value: 0x0000, lo: 0x01}, @@ -4295,13 +4299,13 @@ var nfcSparseValues = [688]valueRange{ {value: 0x8101, lo: 0x9e, hi: 0x9e}, // Block 0x86, offset 0x288 {value: 0x0000, lo: 0x0c}, - {value: 0x4662, lo: 0x9e, hi: 0x9e}, - {value: 0x466c, lo: 0x9f, hi: 0x9f}, - {value: 0x46a0, lo: 0xa0, hi: 0xa0}, - {value: 0x46ae, lo: 0xa1, hi: 0xa1}, - {value: 0x46bc, lo: 0xa2, hi: 0xa2}, - {value: 0x46ca, lo: 0xa3, hi: 0xa3}, - {value: 0x46d8, lo: 0xa4, hi: 0xa4}, + {value: 0x45cc, lo: 0x9e, hi: 0x9e}, + {value: 0x45d6, lo: 0x9f, hi: 0x9f}, + {value: 0x460a, lo: 0xa0, hi: 0xa0}, + {value: 0x4618, lo: 0xa1, hi: 0xa1}, + {value: 0x4626, lo: 0xa2, hi: 0xa2}, + {value: 0x4634, lo: 0xa3, hi: 0xa3}, + {value: 0x4642, lo: 0xa4, hi: 0xa4}, {value: 0x812b, lo: 0xa5, hi: 0xa6}, {value: 0x8101, lo: 0xa7, hi: 0xa9}, {value: 0x8130, lo: 0xad, hi: 0xad}, @@ -4313,14 +4317,14 @@ var nfcSparseValues = [688]valueRange{ {value: 0x8132, lo: 0x85, hi: 0x89}, {value: 0x812d, lo: 0x8a, hi: 0x8b}, {value: 0x8132, lo: 0xaa, hi: 0xad}, - {value: 0x4676, lo: 0xbb, hi: 0xbb}, - {value: 0x4680, lo: 0xbc, hi: 0xbc}, - {value: 0x46e6, lo: 0xbd, hi: 0xbd}, - {value: 0x4702, lo: 0xbe, hi: 0xbe}, - {value: 0x46f4, lo: 0xbf, hi: 0xbf}, + {value: 0x45e0, lo: 0xbb, hi: 0xbb}, + {value: 0x45ea, lo: 0xbc, hi: 0xbc}, + {value: 0x4650, lo: 0xbd, hi: 0xbd}, + {value: 0x466c, lo: 0xbe, hi: 0xbe}, + {value: 0x465e, lo: 0xbf, hi: 0xbf}, // Block 0x88, offset 0x29f {value: 0x0000, lo: 0x01}, - {value: 0x4710, lo: 0x80, hi: 0x80}, + {value: 0x467a, lo: 0x80, hi: 0x80}, // Block 0x89, offset 0x2a1 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x82, hi: 0x84}, @@ -4513,7 +4517,7 @@ func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { return 0 } -// nfkcTrie. Total size: 16994 bytes (16.60 KiB). Checksum: 146925fc21092b17. +// nfkcTrie. Total size: 16994 bytes (16.60 KiB). Checksum: c3ed54ee046f3c46. type nfkcTrie struct{} func newNfkcTrie(i int) *nfkcTrie { @@ -4549,22 +4553,22 @@ var nfkcValues = [5888]uint16{ 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, // Block 0x2, offset 0x80 // Block 0x3, offset 0xc0 - 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x471e, 0xc3: 0x2f79, 0xc4: 0x472d, 0xc5: 0x4732, - 0xc6: 0xa000, 0xc7: 0x473c, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x4741, 0xcb: 0x2ffb, - 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x4755, 0xd1: 0x3104, - 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x475f, 0xd5: 0x4764, 0xd6: 0x4773, - 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x47a5, 0xdd: 0x3235, - 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x47af, 0xe3: 0x3285, - 0xe4: 0x47be, 0xe5: 0x47c3, 0xe6: 0xa000, 0xe7: 0x47cd, 0xe8: 0x32ee, 0xe9: 0x32f3, - 0xea: 0x47d2, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x47e6, - 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x47f0, 0xf5: 0x47f5, - 0xf6: 0x4804, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, - 0xfc: 0x4836, 0xfd: 0x3550, 0xff: 0x3569, + 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c, + 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb, + 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104, + 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd, + 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235, + 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285, + 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3, + 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750, + 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f, + 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3, + 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569, // Block 0x4, offset 0x100 - 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x4723, 0x103: 0x47b4, 0x104: 0x2f9c, 0x105: 0x32a8, + 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8, 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6, 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5, - 0x112: 0x4746, 0x113: 0x47d7, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, + 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302, 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339, 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352, 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e, @@ -4575,12 +4579,12 @@ var nfkcValues = [5888]uint16{ // Block 0x5, offset 0x140 0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118, 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c, - 0x14c: 0x4769, 0x14d: 0x47fa, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, + 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c, 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483, - 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x478c, 0x15b: 0x481d, 0x15c: 0x317c, 0x15d: 0x348d, - 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x4791, 0x161: 0x4822, 0x162: 0x31a4, 0x163: 0x34ba, - 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x479b, 0x169: 0x482c, - 0x16a: 0x47a0, 0x16b: 0x4831, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, + 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d, + 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba, + 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796, + 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2, 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528, 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267, 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7, @@ -4592,7 +4596,7 @@ var nfkcValues = [5888]uint16{ 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50, 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5, 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf, - 0x1aa: 0x4782, 0x1ab: 0x4813, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, + 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd, 0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334, 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46, 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb, @@ -4603,8 +4607,8 @@ var nfkcValues = [5888]uint16{ 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6, 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5, 0x1de: 0x305a, 0x1df: 0x3366, - 0x1e6: 0x4728, 0x1e7: 0x47b9, 0x1e8: 0x4750, 0x1e9: 0x47e1, - 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x476e, 0x1ef: 0x47ff, + 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b, + 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769, 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f, // Block 0x8, offset 0x200 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, @@ -4619,7 +4623,7 @@ var nfkcValues = [5888]uint16{ 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, // Block 0x9, offset 0x240 - 0x240: 0x4a44, 0x241: 0x4a49, 0x242: 0x9932, 0x243: 0x4a4e, 0x244: 0x4a53, 0x245: 0x9936, + 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936, 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, @@ -4631,22 +4635,22 @@ var nfkcValues = [5888]uint16{ 0x27a: 0x42a5, 0x27e: 0x0037, // Block 0xa, offset 0x280 - 0x284: 0x425a, 0x285: 0x4511, + 0x284: 0x425a, 0x285: 0x447b, 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625, 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000, 0x295: 0xa000, 0x297: 0xa000, 0x299: 0xa000, 0x29f: 0xa000, 0x2a1: 0xa000, 0x2a5: 0xa000, 0x2a9: 0xa000, - 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x4894, 0x2ad: 0x3697, 0x2ae: 0x48be, 0x2af: 0x36a9, + 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9, 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000, 0x2b7: 0xa000, 0x2b9: 0xa000, 0x2bf: 0xa000, // Block 0xb, offset 0x2c0 0x2c1: 0xa000, 0x2c5: 0xa000, - 0x2c9: 0xa000, 0x2ca: 0x48d6, 0x2cb: 0x48f4, - 0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x490c, 0x2d0: 0x01be, 0x2d1: 0x01d0, - 0x2d2: 0x01ac, 0x2d3: 0x43a2, 0x2d4: 0x43a8, 0x2d5: 0x01fa, 0x2d6: 0x01e8, + 0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e, + 0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0, + 0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8, 0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7, 0x2f9: 0x01a6, // Block 0xc, offset 0x300 @@ -4726,15 +4730,15 @@ var nfkcValues = [5888]uint16{ 0x4e4: 0x305f, 0x4e5: 0x336b, 0x4e6: 0x3055, 0x4e7: 0x3361, 0x4e8: 0x3064, 0x4e9: 0x3370, 0x4ea: 0x3069, 0x4eb: 0x3375, 0x4ec: 0x30af, 0x4ed: 0x33bb, 0x4ee: 0x390b, 0x4ef: 0x3a9a, 0x4f0: 0x30b9, 0x4f1: 0x33ca, 0x4f2: 0x30c3, 0x4f3: 0x33d4, 0x4f4: 0x30cd, 0x4f5: 0x33de, - 0x4f6: 0x475a, 0x4f7: 0x47eb, 0x4f8: 0x3912, 0x4f9: 0x3aa1, 0x4fa: 0x30e6, 0x4fb: 0x33f7, + 0x4f6: 0x46c4, 0x4f7: 0x4755, 0x4f8: 0x3912, 0x4f9: 0x3aa1, 0x4fa: 0x30e6, 0x4fb: 0x33f7, 0x4fc: 0x30e1, 0x4fd: 0x33f2, 0x4fe: 0x30eb, 0x4ff: 0x33fc, // Block 0x14, offset 0x500 0x500: 0x30f0, 0x501: 0x3401, 0x502: 0x30f5, 0x503: 0x3406, 0x504: 0x3109, 0x505: 0x341a, 0x506: 0x3113, 0x507: 0x3424, 0x508: 0x3122, 0x509: 0x3433, 0x50a: 0x311d, 0x50b: 0x342e, 0x50c: 0x3935, 0x50d: 0x3ac4, 0x50e: 0x3943, 0x50f: 0x3ad2, 0x510: 0x394a, 0x511: 0x3ad9, 0x512: 0x3951, 0x513: 0x3ae0, 0x514: 0x314f, 0x515: 0x3460, 0x516: 0x3154, 0x517: 0x3465, - 0x518: 0x315e, 0x519: 0x346f, 0x51a: 0x4787, 0x51b: 0x4818, 0x51c: 0x3997, 0x51d: 0x3b26, - 0x51e: 0x3177, 0x51f: 0x3488, 0x520: 0x3181, 0x521: 0x3492, 0x522: 0x4796, 0x523: 0x4827, + 0x518: 0x315e, 0x519: 0x346f, 0x51a: 0x46f1, 0x51b: 0x4782, 0x51c: 0x3997, 0x51d: 0x3b26, + 0x51e: 0x3177, 0x51f: 0x3488, 0x520: 0x3181, 0x521: 0x3492, 0x522: 0x4700, 0x523: 0x4791, 0x524: 0x399e, 0x525: 0x3b2d, 0x526: 0x39a5, 0x527: 0x3b34, 0x528: 0x39ac, 0x529: 0x3b3b, 0x52a: 0x3190, 0x52b: 0x34a1, 0x52c: 0x319a, 0x52d: 0x34b0, 0x52e: 0x31ae, 0x52f: 0x34c4, 0x530: 0x31a9, 0x531: 0x34bf, 0x532: 0x31ea, 0x533: 0x3500, 0x534: 0x31f9, 0x535: 0x350f, @@ -4746,16 +4750,16 @@ var nfkcValues = [5888]uint16{ 0x54c: 0x322b, 0x54d: 0x3546, 0x54e: 0x3249, 0x54f: 0x3564, 0x550: 0x3262, 0x551: 0x3582, 0x552: 0x3271, 0x553: 0x3591, 0x554: 0x3276, 0x555: 0x3596, 0x556: 0x337a, 0x557: 0x34a6, 0x558: 0x3537, 0x559: 0x3573, 0x55a: 0x1be0, 0x55b: 0x42d7, - 0x560: 0x4737, 0x561: 0x47c8, 0x562: 0x2f83, 0x563: 0x328f, + 0x560: 0x46a1, 0x561: 0x4732, 0x562: 0x2f83, 0x563: 0x328f, 0x564: 0x3878, 0x565: 0x3a07, 0x566: 0x3871, 0x567: 0x3a00, 0x568: 0x3886, 0x569: 0x3a15, 0x56a: 0x387f, 0x56b: 0x3a0e, 0x56c: 0x38be, 0x56d: 0x3a4d, 0x56e: 0x3894, 0x56f: 0x3a23, 0x570: 0x388d, 0x571: 0x3a1c, 0x572: 0x38a2, 0x573: 0x3a31, 0x574: 0x389b, 0x575: 0x3a2a, - 0x576: 0x38c5, 0x577: 0x3a54, 0x578: 0x474b, 0x579: 0x47dc, 0x57a: 0x3000, 0x57b: 0x330c, + 0x576: 0x38c5, 0x577: 0x3a54, 0x578: 0x46b5, 0x579: 0x4746, 0x57a: 0x3000, 0x57b: 0x330c, 0x57c: 0x2fec, 0x57d: 0x32f8, 0x57e: 0x38da, 0x57f: 0x3a69, // Block 0x16, offset 0x580 0x580: 0x38d3, 0x581: 0x3a62, 0x582: 0x38e8, 0x583: 0x3a77, 0x584: 0x38e1, 0x585: 0x3a70, 0x586: 0x38fd, 0x587: 0x3a8c, 0x588: 0x3091, 0x589: 0x339d, 0x58a: 0x30a5, 0x58b: 0x33b1, - 0x58c: 0x477d, 0x58d: 0x480e, 0x58e: 0x3136, 0x58f: 0x3447, 0x590: 0x3920, 0x591: 0x3aaf, + 0x58c: 0x46e7, 0x58d: 0x4778, 0x58e: 0x3136, 0x58f: 0x3447, 0x590: 0x3920, 0x591: 0x3aaf, 0x592: 0x3919, 0x593: 0x3aa8, 0x594: 0x392e, 0x595: 0x3abd, 0x596: 0x3927, 0x597: 0x3ab6, 0x598: 0x3989, 0x599: 0x3b18, 0x59a: 0x396d, 0x59b: 0x3afc, 0x59c: 0x3966, 0x59d: 0x3af5, 0x59e: 0x397b, 0x59f: 0x3b0a, 0x5a0: 0x3974, 0x5a1: 0x3b03, 0x5a2: 0x3982, 0x5a3: 0x3b11, @@ -4764,29 +4768,29 @@ var nfkcValues = [5888]uint16{ 0x5b0: 0x39f9, 0x5b1: 0x3b88, 0x5b2: 0x3230, 0x5b3: 0x354b, 0x5b4: 0x3258, 0x5b5: 0x3578, 0x5b6: 0x3253, 0x5b7: 0x356e, 0x5b8: 0x323f, 0x5b9: 0x355a, // Block 0x17, offset 0x5c0 - 0x5c0: 0x489a, 0x5c1: 0x48a0, 0x5c2: 0x49b4, 0x5c3: 0x49cc, 0x5c4: 0x49bc, 0x5c5: 0x49d4, - 0x5c6: 0x49c4, 0x5c7: 0x49dc, 0x5c8: 0x4840, 0x5c9: 0x4846, 0x5ca: 0x4924, 0x5cb: 0x493c, - 0x5cc: 0x492c, 0x5cd: 0x4944, 0x5ce: 0x4934, 0x5cf: 0x494c, 0x5d0: 0x48ac, 0x5d1: 0x48b2, + 0x5c0: 0x4804, 0x5c1: 0x480a, 0x5c2: 0x491e, 0x5c3: 0x4936, 0x5c4: 0x4926, 0x5c5: 0x493e, + 0x5c6: 0x492e, 0x5c7: 0x4946, 0x5c8: 0x47aa, 0x5c9: 0x47b0, 0x5ca: 0x488e, 0x5cb: 0x48a6, + 0x5cc: 0x4896, 0x5cd: 0x48ae, 0x5ce: 0x489e, 0x5cf: 0x48b6, 0x5d0: 0x4816, 0x5d1: 0x481c, 0x5d2: 0x3db8, 0x5d3: 0x3dc8, 0x5d4: 0x3dc0, 0x5d5: 0x3dd0, - 0x5d8: 0x484c, 0x5d9: 0x4852, 0x5da: 0x3ce8, 0x5db: 0x3cf8, 0x5dc: 0x3cf0, 0x5dd: 0x3d00, - 0x5e0: 0x48c4, 0x5e1: 0x48ca, 0x5e2: 0x49e4, 0x5e3: 0x49fc, - 0x5e4: 0x49ec, 0x5e5: 0x4a04, 0x5e6: 0x49f4, 0x5e7: 0x4a0c, 0x5e8: 0x4858, 0x5e9: 0x485e, - 0x5ea: 0x4954, 0x5eb: 0x496c, 0x5ec: 0x495c, 0x5ed: 0x4974, 0x5ee: 0x4964, 0x5ef: 0x497c, - 0x5f0: 0x48dc, 0x5f1: 0x48e2, 0x5f2: 0x3e18, 0x5f3: 0x3e30, 0x5f4: 0x3e20, 0x5f5: 0x3e38, - 0x5f6: 0x3e28, 0x5f7: 0x3e40, 0x5f8: 0x4864, 0x5f9: 0x486a, 0x5fa: 0x3d18, 0x5fb: 0x3d30, + 0x5d8: 0x47b6, 0x5d9: 0x47bc, 0x5da: 0x3ce8, 0x5db: 0x3cf8, 0x5dc: 0x3cf0, 0x5dd: 0x3d00, + 0x5e0: 0x482e, 0x5e1: 0x4834, 0x5e2: 0x494e, 0x5e3: 0x4966, + 0x5e4: 0x4956, 0x5e5: 0x496e, 0x5e6: 0x495e, 0x5e7: 0x4976, 0x5e8: 0x47c2, 0x5e9: 0x47c8, + 0x5ea: 0x48be, 0x5eb: 0x48d6, 0x5ec: 0x48c6, 0x5ed: 0x48de, 0x5ee: 0x48ce, 0x5ef: 0x48e6, + 0x5f0: 0x4846, 0x5f1: 0x484c, 0x5f2: 0x3e18, 0x5f3: 0x3e30, 0x5f4: 0x3e20, 0x5f5: 0x3e38, + 0x5f6: 0x3e28, 0x5f7: 0x3e40, 0x5f8: 0x47ce, 0x5f9: 0x47d4, 0x5fa: 0x3d18, 0x5fb: 0x3d30, 0x5fc: 0x3d20, 0x5fd: 0x3d38, 0x5fe: 0x3d28, 0x5ff: 0x3d40, // Block 0x18, offset 0x600 - 0x600: 0x48e8, 0x601: 0x48ee, 0x602: 0x3e48, 0x603: 0x3e58, 0x604: 0x3e50, 0x605: 0x3e60, - 0x608: 0x4870, 0x609: 0x4876, 0x60a: 0x3d48, 0x60b: 0x3d58, - 0x60c: 0x3d50, 0x60d: 0x3d60, 0x610: 0x48fa, 0x611: 0x4900, + 0x600: 0x4852, 0x601: 0x4858, 0x602: 0x3e48, 0x603: 0x3e58, 0x604: 0x3e50, 0x605: 0x3e60, + 0x608: 0x47da, 0x609: 0x47e0, 0x60a: 0x3d48, 0x60b: 0x3d58, + 0x60c: 0x3d50, 0x60d: 0x3d60, 0x610: 0x4864, 0x611: 0x486a, 0x612: 0x3e80, 0x613: 0x3e98, 0x614: 0x3e88, 0x615: 0x3ea0, 0x616: 0x3e90, 0x617: 0x3ea8, - 0x619: 0x487c, 0x61b: 0x3d68, 0x61d: 0x3d70, - 0x61f: 0x3d78, 0x620: 0x4912, 0x621: 0x4918, 0x622: 0x4a14, 0x623: 0x4a2c, - 0x624: 0x4a1c, 0x625: 0x4a34, 0x626: 0x4a24, 0x627: 0x4a3c, 0x628: 0x4882, 0x629: 0x4888, - 0x62a: 0x4984, 0x62b: 0x499c, 0x62c: 0x498c, 0x62d: 0x49a4, 0x62e: 0x4994, 0x62f: 0x49ac, - 0x630: 0x488e, 0x631: 0x43b4, 0x632: 0x3691, 0x633: 0x43ba, 0x634: 0x48b8, 0x635: 0x43c0, - 0x636: 0x36a3, 0x637: 0x43c6, 0x638: 0x36c1, 0x639: 0x43cc, 0x63a: 0x36d9, 0x63b: 0x43d2, - 0x63c: 0x4906, 0x63d: 0x43d8, + 0x619: 0x47e6, 0x61b: 0x3d68, 0x61d: 0x3d70, + 0x61f: 0x3d78, 0x620: 0x487c, 0x621: 0x4882, 0x622: 0x497e, 0x623: 0x4996, + 0x624: 0x4986, 0x625: 0x499e, 0x626: 0x498e, 0x627: 0x49a6, 0x628: 0x47ec, 0x629: 0x47f2, + 0x62a: 0x48ee, 0x62b: 0x4906, 0x62c: 0x48f6, 0x62d: 0x490e, 0x62e: 0x48fe, 0x62f: 0x4916, + 0x630: 0x47f8, 0x631: 0x431e, 0x632: 0x3691, 0x633: 0x4324, 0x634: 0x4822, 0x635: 0x432a, + 0x636: 0x36a3, 0x637: 0x4330, 0x638: 0x36c1, 0x639: 0x4336, 0x63a: 0x36d9, 0x63b: 0x433c, + 0x63c: 0x4870, 0x63d: 0x4342, // Block 0x19, offset 0x640 0x640: 0x3da0, 0x641: 0x3da8, 0x642: 0x4184, 0x643: 0x41a2, 0x644: 0x418e, 0x645: 0x41ac, 0x646: 0x4198, 0x647: 0x41b6, 0x648: 0x3cd8, 0x649: 0x3ce0, 0x64a: 0x40d0, 0x64b: 0x40ee, @@ -4797,19 +4801,19 @@ var nfkcValues = [5888]uint16{ 0x664: 0x4206, 0x665: 0x4224, 0x666: 0x4210, 0x667: 0x422e, 0x668: 0x3d80, 0x669: 0x3d88, 0x66a: 0x4148, 0x66b: 0x4166, 0x66c: 0x4152, 0x66d: 0x4170, 0x66e: 0x415c, 0x66f: 0x417a, 0x670: 0x3685, 0x671: 0x367f, 0x672: 0x3d90, 0x673: 0x368b, 0x674: 0x3d98, - 0x676: 0x48a6, 0x677: 0x3db0, 0x678: 0x35f5, 0x679: 0x35ef, 0x67a: 0x35e3, 0x67b: 0x4384, + 0x676: 0x4810, 0x677: 0x3db0, 0x678: 0x35f5, 0x679: 0x35ef, 0x67a: 0x35e3, 0x67b: 0x42ee, 0x67c: 0x35fb, 0x67d: 0x4287, 0x67e: 0x01d3, 0x67f: 0x4287, // Block 0x1a, offset 0x680 - 0x680: 0x42a0, 0x681: 0x4518, 0x682: 0x3dd8, 0x683: 0x369d, 0x684: 0x3de0, - 0x686: 0x48d0, 0x687: 0x3df8, 0x688: 0x3601, 0x689: 0x438a, 0x68a: 0x360d, 0x68b: 0x4390, - 0x68c: 0x3619, 0x68d: 0x451f, 0x68e: 0x4526, 0x68f: 0x452d, 0x690: 0x36b5, 0x691: 0x36af, - 0x692: 0x3e00, 0x693: 0x457a, 0x696: 0x36bb, 0x697: 0x3e10, - 0x698: 0x3631, 0x699: 0x362b, 0x69a: 0x361f, 0x69b: 0x4396, 0x69d: 0x4534, - 0x69e: 0x453b, 0x69f: 0x4542, 0x6a0: 0x36eb, 0x6a1: 0x36e5, 0x6a2: 0x3e68, 0x6a3: 0x4582, + 0x680: 0x42a0, 0x681: 0x4482, 0x682: 0x3dd8, 0x683: 0x369d, 0x684: 0x3de0, + 0x686: 0x483a, 0x687: 0x3df8, 0x688: 0x3601, 0x689: 0x42f4, 0x68a: 0x360d, 0x68b: 0x42fa, + 0x68c: 0x3619, 0x68d: 0x4489, 0x68e: 0x4490, 0x68f: 0x4497, 0x690: 0x36b5, 0x691: 0x36af, + 0x692: 0x3e00, 0x693: 0x44e4, 0x696: 0x36bb, 0x697: 0x3e10, + 0x698: 0x3631, 0x699: 0x362b, 0x69a: 0x361f, 0x69b: 0x4300, 0x69d: 0x449e, + 0x69e: 0x44a5, 0x69f: 0x44ac, 0x6a0: 0x36eb, 0x6a1: 0x36e5, 0x6a2: 0x3e68, 0x6a3: 0x44ec, 0x6a4: 0x36cd, 0x6a5: 0x36d3, 0x6a6: 0x36f1, 0x6a7: 0x3e78, 0x6a8: 0x3661, 0x6a9: 0x365b, - 0x6aa: 0x364f, 0x6ab: 0x43a2, 0x6ac: 0x3649, 0x6ad: 0x450a, 0x6ae: 0x4511, 0x6af: 0x0081, + 0x6aa: 0x364f, 0x6ab: 0x430c, 0x6ac: 0x3649, 0x6ad: 0x4474, 0x6ae: 0x447b, 0x6af: 0x0081, 0x6b2: 0x3eb0, 0x6b3: 0x36f7, 0x6b4: 0x3eb8, - 0x6b6: 0x491e, 0x6b7: 0x3ed0, 0x6b8: 0x363d, 0x6b9: 0x439c, 0x6ba: 0x366d, 0x6bb: 0x43ae, + 0x6b6: 0x4888, 0x6b7: 0x3ed0, 0x6b8: 0x363d, 0x6b9: 0x4306, 0x6ba: 0x366d, 0x6bb: 0x4318, 0x6bc: 0x3679, 0x6bd: 0x425a, 0x6be: 0x428c, // Block 0x1b, offset 0x6c0 0x6c0: 0x1bd8, 0x6c1: 0x1bdc, 0x6c2: 0x0047, 0x6c3: 0x1c54, 0x6c5: 0x1be8, @@ -4922,7 +4926,7 @@ var nfkcValues = [5888]uint16{ 0x93c: 0x3fc0, 0x93d: 0x3fc8, // Block 0x25, offset 0x940 0x954: 0x3f00, - 0x959: 0x9903, 0x95a: 0x9903, 0x95b: 0x4372, 0x95c: 0x4378, 0x95d: 0xa000, + 0x959: 0x9903, 0x95a: 0x9903, 0x95b: 0x42dc, 0x95c: 0x42e2, 0x95d: 0xa000, 0x95e: 0x3fd0, 0x95f: 0x26b4, 0x966: 0xa000, 0x96b: 0xa000, 0x96c: 0x3fe0, 0x96d: 0xa000, 0x96e: 0x3fe8, 0x96f: 0xa000, @@ -4942,10 +4946,10 @@ var nfkcValues = [5888]uint16{ // Block 0x27, offset 0x9c0 0x9c0: 0x0367, 0x9c1: 0x032b, 0x9c2: 0x032f, 0x9c3: 0x0333, 0x9c4: 0x037b, 0x9c5: 0x0337, 0x9c6: 0x033b, 0x9c7: 0x033f, 0x9c8: 0x0343, 0x9c9: 0x0347, 0x9ca: 0x034b, 0x9cb: 0x034f, - 0x9cc: 0x0353, 0x9cd: 0x0357, 0x9ce: 0x035b, 0x9cf: 0x42dc, 0x9d0: 0x42e1, 0x9d1: 0x42e6, - 0x9d2: 0x42eb, 0x9d3: 0x42f0, 0x9d4: 0x42f5, 0x9d5: 0x42fa, 0x9d6: 0x42ff, 0x9d7: 0x4304, - 0x9d8: 0x4309, 0x9d9: 0x430e, 0x9da: 0x4313, 0x9db: 0x4318, 0x9dc: 0x431d, 0x9dd: 0x4322, - 0x9de: 0x4327, 0x9df: 0x432c, 0x9e0: 0x4331, 0x9e1: 0x4336, 0x9e2: 0x433b, 0x9e3: 0x4340, + 0x9cc: 0x0353, 0x9cd: 0x0357, 0x9ce: 0x035b, 0x9cf: 0x49bd, 0x9d0: 0x49c3, 0x9d1: 0x49c9, + 0x9d2: 0x49cf, 0x9d3: 0x49d5, 0x9d4: 0x49db, 0x9d5: 0x49e1, 0x9d6: 0x49e7, 0x9d7: 0x49ed, + 0x9d8: 0x49f3, 0x9d9: 0x49f9, 0x9da: 0x49ff, 0x9db: 0x4a05, 0x9dc: 0x4a0b, 0x9dd: 0x4a11, + 0x9de: 0x4a17, 0x9df: 0x4a1d, 0x9e0: 0x4a23, 0x9e1: 0x4a29, 0x9e2: 0x4a2f, 0x9e3: 0x4a35, 0x9e4: 0x03c3, 0x9e5: 0x035f, 0x9e6: 0x0363, 0x9e7: 0x03e7, 0x9e8: 0x03eb, 0x9e9: 0x03ef, 0x9ea: 0x03f3, 0x9eb: 0x03f7, 0x9ec: 0x03fb, 0x9ed: 0x03ff, 0x9ee: 0x036b, 0x9ef: 0x0403, 0x9f0: 0x0407, 0x9f1: 0x036f, 0x9f2: 0x0373, 0x9f3: 0x0377, 0x9f4: 0x037f, 0x9f5: 0x0383, @@ -5148,17 +5152,17 @@ var nfkcValues = [5888]uint16{ 0xe40: 0x19d5, 0xe41: 0x19d8, 0xe42: 0x19db, 0xe43: 0x1c08, 0xe44: 0x1c0c, 0xe45: 0x1a5f, 0xe46: 0x1a5f, 0xe53: 0x1d75, 0xe54: 0x1d66, 0xe55: 0x1d6b, 0xe56: 0x1d7a, 0xe57: 0x1d70, - 0xe5d: 0x4426, - 0xe5e: 0x8115, 0xe5f: 0x4498, 0xe60: 0x022d, 0xe61: 0x0215, 0xe62: 0x021e, 0xe63: 0x0221, + 0xe5d: 0x4390, + 0xe5e: 0x8115, 0xe5f: 0x4402, 0xe60: 0x022d, 0xe61: 0x0215, 0xe62: 0x021e, 0xe63: 0x0221, 0xe64: 0x0224, 0xe65: 0x0227, 0xe66: 0x022a, 0xe67: 0x0230, 0xe68: 0x0233, 0xe69: 0x0017, - 0xe6a: 0x4486, 0xe6b: 0x448c, 0xe6c: 0x458a, 0xe6d: 0x4592, 0xe6e: 0x43de, 0xe6f: 0x43e4, - 0xe70: 0x43ea, 0xe71: 0x43f0, 0xe72: 0x43fc, 0xe73: 0x4402, 0xe74: 0x4408, 0xe75: 0x4414, - 0xe76: 0x441a, 0xe78: 0x4420, 0xe79: 0x442c, 0xe7a: 0x4432, 0xe7b: 0x4438, - 0xe7c: 0x4444, 0xe7e: 0x444a, + 0xe6a: 0x43f0, 0xe6b: 0x43f6, 0xe6c: 0x44f4, 0xe6d: 0x44fc, 0xe6e: 0x4348, 0xe6f: 0x434e, + 0xe70: 0x4354, 0xe71: 0x435a, 0xe72: 0x4366, 0xe73: 0x436c, 0xe74: 0x4372, 0xe75: 0x437e, + 0xe76: 0x4384, 0xe78: 0x438a, 0xe79: 0x4396, 0xe7a: 0x439c, 0xe7b: 0x43a2, + 0xe7c: 0x43ae, 0xe7e: 0x43b4, // Block 0x3a, offset 0xe80 - 0xe80: 0x4450, 0xe81: 0x4456, 0xe83: 0x445c, 0xe84: 0x4462, - 0xe86: 0x446e, 0xe87: 0x4474, 0xe88: 0x447a, 0xe89: 0x4480, 0xe8a: 0x4492, 0xe8b: 0x440e, - 0xe8c: 0x43f6, 0xe8d: 0x443e, 0xe8e: 0x4468, 0xe8f: 0x1d7f, 0xe90: 0x0299, 0xe91: 0x0299, + 0xe80: 0x43ba, 0xe81: 0x43c0, 0xe83: 0x43c6, 0xe84: 0x43cc, + 0xe86: 0x43d8, 0xe87: 0x43de, 0xe88: 0x43e4, 0xe89: 0x43ea, 0xe8a: 0x43fc, 0xe8b: 0x4378, + 0xe8c: 0x4360, 0xe8d: 0x43a8, 0xe8e: 0x43d2, 0xe8f: 0x1d7f, 0xe90: 0x0299, 0xe91: 0x0299, 0xe92: 0x02a2, 0xe93: 0x02a2, 0xe94: 0x02a2, 0xe95: 0x02a2, 0xe96: 0x02a5, 0xe97: 0x02a5, 0xe98: 0x02a5, 0xe99: 0x02a5, 0xe9a: 0x02ab, 0xe9b: 0x02ab, 0xe9c: 0x02ab, 0xe9d: 0x02ab, 0xe9e: 0x029f, 0xe9f: 0x029f, 0xea0: 0x029f, 0xea1: 0x029f, 0xea2: 0x02a8, 0xea3: 0x02a8, @@ -5174,9 +5178,9 @@ var nfkcValues = [5888]uint16{ 0xed2: 0x02db, 0xed3: 0x02db, 0xed4: 0x02db, 0xed5: 0x02db, 0xed6: 0x02e1, 0xed7: 0x02e1, 0xed8: 0x02e1, 0xed9: 0x02e1, 0xeda: 0x02de, 0xedb: 0x02de, 0xedc: 0x02de, 0xedd: 0x02de, 0xede: 0x02e4, 0xedf: 0x02e4, 0xee0: 0x02e7, 0xee1: 0x02e7, 0xee2: 0x02e7, 0xee3: 0x02e7, - 0xee4: 0x4504, 0xee5: 0x4504, 0xee6: 0x02ed, 0xee7: 0x02ed, 0xee8: 0x02ed, 0xee9: 0x02ed, + 0xee4: 0x446e, 0xee5: 0x446e, 0xee6: 0x02ed, 0xee7: 0x02ed, 0xee8: 0x02ed, 0xee9: 0x02ed, 0xeea: 0x02ea, 0xeeb: 0x02ea, 0xeec: 0x02ea, 0xeed: 0x02ea, 0xeee: 0x0308, 0xeef: 0x0308, - 0xef0: 0x44fe, 0xef1: 0x44fe, + 0xef0: 0x4468, 0xef1: 0x4468, // Block 0x3c, offset 0xf00 0xf13: 0x02d8, 0xf14: 0x02d8, 0xf15: 0x02d8, 0xf16: 0x02d8, 0xf17: 0x02f6, 0xf18: 0x02f6, 0xf19: 0x02f3, 0xf1a: 0x02f3, 0xf1b: 0x02f9, 0xf1c: 0x02f9, 0xf1d: 0x204f, @@ -5203,8 +5207,8 @@ var nfkcValues = [5888]uint16{ 0xf86: 0x1fb4, 0xf87: 0x1fb9, 0xf88: 0x1fbe, 0xf89: 0x1fc3, 0xf8a: 0x1fc8, 0xf8b: 0x1fcd, 0xf8c: 0x1fd2, 0xf8d: 0x1fd7, 0xf8e: 0x1fe6, 0xf8f: 0x1ff5, 0xf90: 0x1ffa, 0xf91: 0x1fff, 0xf92: 0x2004, 0xf93: 0x2009, 0xf94: 0x200e, 0xf95: 0x2018, 0xf96: 0x201d, 0xf97: 0x2022, - 0xf98: 0x2031, 0xf99: 0x2040, 0xf9a: 0x2045, 0xf9b: 0x44b6, 0xf9c: 0x44bc, 0xf9d: 0x44f2, - 0xf9e: 0x4549, 0xf9f: 0x4550, 0xfa0: 0x4557, 0xfa1: 0x455e, 0xfa2: 0x4565, 0xfa3: 0x456c, + 0xf98: 0x2031, 0xf99: 0x2040, 0xf9a: 0x2045, 0xf9b: 0x4420, 0xf9c: 0x4426, 0xf9d: 0x445c, + 0xf9e: 0x44b3, 0xf9f: 0x44ba, 0xfa0: 0x44c1, 0xfa1: 0x44c8, 0xfa2: 0x44cf, 0xfa3: 0x44d6, 0xfa4: 0x25c6, 0xfa5: 0x25cd, 0xfa6: 0x25d4, 0xfa7: 0x25db, 0xfa8: 0x25f0, 0xfa9: 0x25f7, 0xfaa: 0x1d98, 0xfab: 0x1d9d, 0xfac: 0x1da2, 0xfad: 0x1da7, 0xfae: 0x1db1, 0xfaf: 0x1db6, 0xfb0: 0x1dca, 0xfb1: 0x1dcf, 0xfb2: 0x1dd4, 0xfb3: 0x1dd9, 0xfb4: 0x1de3, 0xfb5: 0x1de8, @@ -5213,7 +5217,7 @@ var nfkcValues = [5888]uint16{ // Block 0x3f, offset 0xfc0 0xfc0: 0x1f5a, 0xfc1: 0x1f6e, 0xfc2: 0x1f73, 0xfc3: 0x1f78, 0xfc4: 0x1f7d, 0xfc5: 0x1f96, 0xfc6: 0x1fa0, 0xfc7: 0x1fa5, 0xfc8: 0x1faa, 0xfc9: 0x1fbe, 0xfca: 0x1fdc, 0xfcb: 0x1fe1, - 0xfcc: 0x1fe6, 0xfcd: 0x1feb, 0xfce: 0x1ff5, 0xfcf: 0x1ffa, 0xfd0: 0x44f2, 0xfd1: 0x2027, + 0xfcc: 0x1fe6, 0xfcd: 0x1feb, 0xfce: 0x1ff5, 0xfcf: 0x1ffa, 0xfd0: 0x445c, 0xfd1: 0x2027, 0xfd2: 0x202c, 0xfd3: 0x2031, 0xfd4: 0x2036, 0xfd5: 0x2040, 0xfd6: 0x2045, 0xfd7: 0x25b1, 0xfd8: 0x25b8, 0xfd9: 0x25bf, 0xfda: 0x25d4, 0xfdb: 0x25e2, 0xfdc: 0x1d89, 0xfdd: 0x1d8e, 0xfde: 0x1d93, 0xfdf: 0x1da2, 0xfe0: 0x1dac, 0xfe1: 0x1dbb, 0xfe2: 0x1dc0, 0xfe3: 0x1dc5, @@ -5227,11 +5231,11 @@ var nfkcValues = [5888]uint16{ 0x1006: 0x1f69, 0x1007: 0x1f6e, 0x1008: 0x1f73, 0x1009: 0x1f87, 0x100a: 0x1f8c, 0x100b: 0x1f91, 0x100c: 0x1f96, 0x100d: 0x1f9b, 0x100e: 0x1faf, 0x100f: 0x1fb4, 0x1010: 0x1fb9, 0x1011: 0x1fbe, 0x1012: 0x1fcd, 0x1013: 0x1fd2, 0x1014: 0x1fd7, 0x1015: 0x1fe6, 0x1016: 0x1ff0, 0x1017: 0x1fff, - 0x1018: 0x2004, 0x1019: 0x44e6, 0x101a: 0x2018, 0x101b: 0x201d, 0x101c: 0x2022, 0x101d: 0x2031, + 0x1018: 0x2004, 0x1019: 0x4450, 0x101a: 0x2018, 0x101b: 0x201d, 0x101c: 0x2022, 0x101d: 0x2031, 0x101e: 0x203b, 0x101f: 0x25d4, 0x1020: 0x25e2, 0x1021: 0x1da2, 0x1022: 0x1dac, 0x1023: 0x1dd4, 0x1024: 0x1dde, 0x1025: 0x1dfc, 0x1026: 0x1e06, 0x1027: 0x1e6a, 0x1028: 0x1e6f, 0x1029: 0x1e92, 0x102a: 0x1e97, 0x102b: 0x1f6e, 0x102c: 0x1f73, 0x102d: 0x1f96, 0x102e: 0x1fe6, 0x102f: 0x1ff0, - 0x1030: 0x2031, 0x1031: 0x203b, 0x1032: 0x459a, 0x1033: 0x45a2, 0x1034: 0x45aa, 0x1035: 0x1ef1, + 0x1030: 0x2031, 0x1031: 0x203b, 0x1032: 0x4504, 0x1033: 0x450c, 0x1034: 0x4514, 0x1035: 0x1ef1, 0x1036: 0x1ef6, 0x1037: 0x1f0a, 0x1038: 0x1f0f, 0x1039: 0x1f1e, 0x103a: 0x1f23, 0x103b: 0x1e74, 0x103c: 0x1e79, 0x103d: 0x1e9c, 0x103e: 0x1ea1, 0x103f: 0x1e33, // Block 0x41, offset 0x1040 @@ -5245,7 +5249,7 @@ var nfkcValues = [5888]uint16{ 0x106a: 0x1e65, 0x106b: 0x1eb0, 0x106c: 0x1ed3, 0x106d: 0x1e7e, 0x106e: 0x1e83, 0x106f: 0x1e88, 0x1070: 0x1e92, 0x1071: 0x1e6f, 0x1072: 0x1e97, 0x1073: 0x1eec, 0x1074: 0x1e56, 0x1075: 0x1e5b, 0x1076: 0x1e60, 0x1077: 0x1e7e, 0x1078: 0x1e83, 0x1079: 0x1e88, 0x107a: 0x1eec, 0x107b: 0x1efb, - 0x107c: 0x449e, 0x107d: 0x449e, + 0x107c: 0x4408, 0x107d: 0x4408, // Block 0x42, offset 0x1080 0x1090: 0x2311, 0x1091: 0x2326, 0x1092: 0x2326, 0x1093: 0x232d, 0x1094: 0x2334, 0x1095: 0x2349, 0x1096: 0x2350, 0x1097: 0x2357, @@ -5293,13 +5297,13 @@ var nfkcValues = [5888]uint16{ 0x119e: 0x04bb, 0x119f: 0x0007, 0x11a0: 0x000d, 0x11a1: 0x0015, 0x11a2: 0x0017, 0x11a3: 0x001b, 0x11a4: 0x0039, 0x11a5: 0x003d, 0x11a6: 0x003b, 0x11a8: 0x0079, 0x11a9: 0x0009, 0x11aa: 0x000b, 0x11ab: 0x0041, - 0x11b0: 0x42aa, 0x11b1: 0x44c2, 0x11b2: 0x42af, 0x11b4: 0x42b4, - 0x11b6: 0x42b9, 0x11b7: 0x44c8, 0x11b8: 0x42be, 0x11b9: 0x44ce, 0x11ba: 0x42c3, 0x11bb: 0x44d4, - 0x11bc: 0x42c8, 0x11bd: 0x44da, 0x11be: 0x42cd, 0x11bf: 0x44e0, + 0x11b0: 0x42aa, 0x11b1: 0x442c, 0x11b2: 0x42af, 0x11b4: 0x42b4, + 0x11b6: 0x42b9, 0x11b7: 0x4432, 0x11b8: 0x42be, 0x11b9: 0x4438, 0x11ba: 0x42c3, 0x11bb: 0x443e, + 0x11bc: 0x42c8, 0x11bd: 0x4444, 0x11be: 0x42cd, 0x11bf: 0x444a, // Block 0x47, offset 0x11c0 - 0x11c0: 0x0236, 0x11c1: 0x44a4, 0x11c2: 0x44a4, 0x11c3: 0x44aa, 0x11c4: 0x44aa, 0x11c5: 0x44ec, - 0x11c6: 0x44ec, 0x11c7: 0x44b0, 0x11c8: 0x44b0, 0x11c9: 0x44f8, 0x11ca: 0x44f8, 0x11cb: 0x44f8, - 0x11cc: 0x44f8, 0x11cd: 0x0239, 0x11ce: 0x0239, 0x11cf: 0x023c, 0x11d0: 0x023c, 0x11d1: 0x023c, + 0x11c0: 0x0236, 0x11c1: 0x440e, 0x11c2: 0x440e, 0x11c3: 0x4414, 0x11c4: 0x4414, 0x11c5: 0x4456, + 0x11c6: 0x4456, 0x11c7: 0x441a, 0x11c8: 0x441a, 0x11c9: 0x4462, 0x11ca: 0x4462, 0x11cb: 0x4462, + 0x11cc: 0x4462, 0x11cd: 0x0239, 0x11ce: 0x0239, 0x11cf: 0x023c, 0x11d0: 0x023c, 0x11d1: 0x023c, 0x11d2: 0x023c, 0x11d3: 0x023f, 0x11d4: 0x023f, 0x11d5: 0x0242, 0x11d6: 0x0242, 0x11d7: 0x0242, 0x11d8: 0x0242, 0x11d9: 0x0245, 0x11da: 0x0245, 0x11db: 0x0245, 0x11dc: 0x0245, 0x11dd: 0x0248, 0x11de: 0x0248, 0x11df: 0x0248, 0x11e0: 0x0248, 0x11e1: 0x024b, 0x11e2: 0x024b, 0x11e3: 0x024b, @@ -5338,18 +5342,18 @@ var nfkcValues = [5888]uint16{ 0x128c: 0x054b, 0x128d: 0x054f, 0x128e: 0x0553, 0x128f: 0x0557, 0x1290: 0x055b, 0x1291: 0x055f, 0x1292: 0x0563, 0x1293: 0x0567, 0x1294: 0x056f, 0x1295: 0x0577, 0x1296: 0x057f, 0x1297: 0x0583, 0x1298: 0x0587, 0x1299: 0x058b, 0x129a: 0x058f, 0x129b: 0x0593, 0x129c: 0x0597, 0x129d: 0x05a7, - 0x129e: 0x4a5a, 0x129f: 0x4a60, 0x12a0: 0x03c3, 0x12a1: 0x0313, 0x12a2: 0x0317, 0x12a3: 0x4345, - 0x12a4: 0x031b, 0x12a5: 0x434a, 0x12a6: 0x434f, 0x12a7: 0x031f, 0x12a8: 0x0323, 0x12a9: 0x0327, - 0x12aa: 0x4354, 0x12ab: 0x4359, 0x12ac: 0x435e, 0x12ad: 0x4363, 0x12ae: 0x4368, 0x12af: 0x436d, + 0x129e: 0x4a78, 0x129f: 0x4a7e, 0x12a0: 0x03c3, 0x12a1: 0x0313, 0x12a2: 0x0317, 0x12a3: 0x4a3b, + 0x12a4: 0x031b, 0x12a5: 0x4a41, 0x12a6: 0x4a47, 0x12a7: 0x031f, 0x12a8: 0x0323, 0x12a9: 0x0327, + 0x12aa: 0x4a4d, 0x12ab: 0x4a53, 0x12ac: 0x4a59, 0x12ad: 0x4a5f, 0x12ae: 0x4a65, 0x12af: 0x4a6b, 0x12b0: 0x0367, 0x12b1: 0x032b, 0x12b2: 0x032f, 0x12b3: 0x0333, 0x12b4: 0x037b, 0x12b5: 0x0337, 0x12b6: 0x033b, 0x12b7: 0x033f, 0x12b8: 0x0343, 0x12b9: 0x0347, 0x12ba: 0x034b, 0x12bb: 0x034f, 0x12bc: 0x0353, 0x12bd: 0x0357, 0x12be: 0x035b, // Block 0x4b, offset 0x12c0 - 0x12c2: 0x42dc, 0x12c3: 0x42e1, 0x12c4: 0x42e6, 0x12c5: 0x42eb, - 0x12c6: 0x42f0, 0x12c7: 0x42f5, 0x12ca: 0x42fa, 0x12cb: 0x42ff, - 0x12cc: 0x4304, 0x12cd: 0x4309, 0x12ce: 0x430e, 0x12cf: 0x4313, - 0x12d2: 0x4318, 0x12d3: 0x431d, 0x12d4: 0x4322, 0x12d5: 0x4327, 0x12d6: 0x432c, 0x12d7: 0x4331, - 0x12da: 0x4336, 0x12db: 0x433b, 0x12dc: 0x4340, + 0x12c2: 0x49bd, 0x12c3: 0x49c3, 0x12c4: 0x49c9, 0x12c5: 0x49cf, + 0x12c6: 0x49d5, 0x12c7: 0x49db, 0x12ca: 0x49e1, 0x12cb: 0x49e7, + 0x12cc: 0x49ed, 0x12cd: 0x49f3, 0x12ce: 0x49f9, 0x12cf: 0x49ff, + 0x12d2: 0x4a05, 0x12d3: 0x4a0b, 0x12d4: 0x4a11, 0x12d5: 0x4a17, 0x12d6: 0x4a1d, 0x12d7: 0x4a23, + 0x12da: 0x4a29, 0x12db: 0x4a2f, 0x12dc: 0x4a35, 0x12e0: 0x00bf, 0x12e1: 0x00c2, 0x12e2: 0x00cb, 0x12e3: 0x4264, 0x12e4: 0x00c8, 0x12e5: 0x00c5, 0x12e6: 0x0447, 0x12e8: 0x046b, 0x12e9: 0x044b, 0x12ea: 0x044f, 0x12eb: 0x0453, 0x12ec: 0x0457, 0x12ed: 0x046f, 0x12ee: 0x0473, @@ -5426,7 +5430,7 @@ var nfkcValues = [5888]uint16{ // Block 0x52, offset 0x1480 0x1480: 0x26ad, 0x1481: 0x26c2, 0x1482: 0x0503, 0x1490: 0x0c0f, 0x1491: 0x0a47, - 0x1492: 0x08d3, 0x1493: 0x465a, 0x1494: 0x071b, 0x1495: 0x09ef, 0x1496: 0x132f, 0x1497: 0x09ff, + 0x1492: 0x08d3, 0x1493: 0x45c4, 0x1494: 0x071b, 0x1495: 0x09ef, 0x1496: 0x132f, 0x1497: 0x09ff, 0x1498: 0x0727, 0x1499: 0x0cd7, 0x149a: 0x0eaf, 0x149b: 0x0caf, 0x149c: 0x0827, 0x149d: 0x0b6b, 0x149e: 0x07bf, 0x149f: 0x0cb7, 0x14a0: 0x0813, 0x14a1: 0x1117, 0x14a2: 0x0f83, 0x14a3: 0x138b, 0x14a4: 0x09d3, 0x14a5: 0x090b, 0x14a6: 0x0e63, 0x14a7: 0x0c1b, 0x14a8: 0x0c47, 0x14a9: 0x06bf, @@ -5665,8 +5669,8 @@ var nfkcSparseValues = [875]valueRange{ {value: 0x22b2, lo: 0xbe, hi: 0xbe}, // Block 0x1, offset 0xe {value: 0x0091, lo: 0x03}, - {value: 0x4778, lo: 0xa0, hi: 0xa1}, - {value: 0x47aa, lo: 0xaf, hi: 0xb0}, + {value: 0x46e2, lo: 0xa0, hi: 0xa1}, + {value: 0x4714, lo: 0xaf, hi: 0xb0}, {value: 0xa000, lo: 0xb7, hi: 0xb7}, // Block 0x2, offset 0x12 {value: 0x0003, lo: 0x08}, @@ -5814,7 +5818,7 @@ var nfkcSparseValues = [875]valueRange{ {value: 0x812d, lo: 0x92, hi: 0x92}, {value: 0x8132, lo: 0x93, hi: 0x93}, {value: 0x8132, lo: 0x94, hi: 0x94}, - {value: 0x45b2, lo: 0x98, hi: 0x9f}, + {value: 0x451c, lo: 0x98, hi: 0x9f}, // Block 0x11, offset 0x96 {value: 0x0000, lo: 0x02}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, @@ -5825,18 +5829,18 @@ var nfkcSparseValues = [875]valueRange{ {value: 0x2c9e, lo: 0x8b, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x97, hi: 0x97}, - {value: 0x45f2, lo: 0x9c, hi: 0x9d}, - {value: 0x4602, lo: 0x9f, hi: 0x9f}, + {value: 0x455c, lo: 0x9c, hi: 0x9d}, + {value: 0x456c, lo: 0x9f, hi: 0x9f}, // Block 0x13, offset 0xa0 {value: 0x0000, lo: 0x03}, - {value: 0x462a, lo: 0xb3, hi: 0xb3}, - {value: 0x4632, lo: 0xb6, hi: 0xb6}, + {value: 0x4594, lo: 0xb3, hi: 0xb3}, + {value: 0x459c, lo: 0xb6, hi: 0xb6}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, // Block 0x14, offset 0xa4 {value: 0x0008, lo: 0x03}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, - {value: 0x460a, lo: 0x99, hi: 0x9b}, - {value: 0x4622, lo: 0x9e, hi: 0x9e}, + {value: 0x4574, lo: 0x99, hi: 0x9b}, + {value: 0x458c, lo: 0x9e, hi: 0x9e}, // Block 0x15, offset 0xa8 {value: 0x0000, lo: 0x01}, {value: 0x8102, lo: 0xbc, hi: 0xbc}, @@ -5851,8 +5855,8 @@ var nfkcSparseValues = [875]valueRange{ {value: 0x2cbe, lo: 0x8c, hi: 0x8c}, {value: 0x8104, lo: 0x8d, hi: 0x8d}, {value: 0x9900, lo: 0x96, hi: 0x97}, - {value: 0x463a, lo: 0x9c, hi: 0x9c}, - {value: 0x4642, lo: 0x9d, hi: 0x9d}, + {value: 0x45a4, lo: 0x9c, hi: 0x9c}, + {value: 0x45ac, lo: 0x9d, hi: 0x9d}, // Block 0x18, offset 0xb5 {value: 0x0000, lo: 0x03}, {value: 0xa000, lo: 0x92, hi: 0x92}, @@ -5941,18 +5945,18 @@ var nfkcSparseValues = [875]valueRange{ {value: 0x263d, lo: 0xa9, hi: 0xa9}, {value: 0x8126, lo: 0xb1, hi: 0xb1}, {value: 0x8127, lo: 0xb2, hi: 0xb2}, - {value: 0x4a66, lo: 0xb3, hi: 0xb3}, + {value: 0x4a84, lo: 0xb3, hi: 0xb3}, {value: 0x8128, lo: 0xb4, hi: 0xb4}, - {value: 0x4a6f, lo: 0xb5, hi: 0xb5}, - {value: 0x464a, lo: 0xb6, hi: 0xb6}, - {value: 0x468a, lo: 0xb7, hi: 0xb7}, - {value: 0x4652, lo: 0xb8, hi: 0xb8}, - {value: 0x4695, lo: 0xb9, hi: 0xb9}, + {value: 0x4a8d, lo: 0xb5, hi: 0xb5}, + {value: 0x45b4, lo: 0xb6, hi: 0xb6}, + {value: 0x45f4, lo: 0xb7, hi: 0xb7}, + {value: 0x45bc, lo: 0xb8, hi: 0xb8}, + {value: 0x45ff, lo: 0xb9, hi: 0xb9}, {value: 0x8127, lo: 0xba, hi: 0xbd}, // Block 0x26, offset 0x107 {value: 0x0000, lo: 0x0b}, {value: 0x8127, lo: 0x80, hi: 0x80}, - {value: 0x4a78, lo: 0x81, hi: 0x81}, + {value: 0x4a96, lo: 0x81, hi: 0x81}, {value: 0x8132, lo: 0x82, hi: 0x83}, {value: 0x8104, lo: 0x84, hi: 0x84}, {value: 0x8132, lo: 0x86, hi: 0x87}, @@ -6199,7 +6203,7 @@ var nfkcSparseValues = [875]valueRange{ {value: 0x192d, lo: 0xb5, hi: 0xb6}, // Block 0x4a, offset 0x1db {value: 0x0000, lo: 0x01}, - {value: 0x4573, lo: 0x9c, hi: 0x9c}, + {value: 0x44dd, lo: 0x9c, hi: 0x9c}, // Block 0x4b, offset 0x1dd {value: 0x0000, lo: 0x02}, {value: 0x0095, lo: 0xbc, hi: 0xbc}, @@ -6245,16 +6249,16 @@ var nfkcSparseValues = [875]valueRange{ {value: 0x04b3, lo: 0xb6, hi: 0xb6}, {value: 0x0887, lo: 0xb8, hi: 0xba}, // Block 0x53, offset 0x201 - {value: 0x0005, lo: 0x09}, + {value: 0x0006, lo: 0x09}, {value: 0x0313, lo: 0xb1, hi: 0xb1}, {value: 0x0317, lo: 0xb2, hi: 0xb2}, - {value: 0x4345, lo: 0xb3, hi: 0xb3}, + {value: 0x4a3b, lo: 0xb3, hi: 0xb3}, {value: 0x031b, lo: 0xb4, hi: 0xb4}, - {value: 0x434a, lo: 0xb5, hi: 0xb6}, + {value: 0x4a41, lo: 0xb5, hi: 0xb6}, {value: 0x031f, lo: 0xb7, hi: 0xb7}, {value: 0x0323, lo: 0xb8, hi: 0xb8}, {value: 0x0327, lo: 0xb9, hi: 0xb9}, - {value: 0x4354, lo: 0xba, hi: 0xbf}, + {value: 0x4a4d, lo: 0xba, hi: 0xbf}, // Block 0x54, offset 0x20b {value: 0x0000, lo: 0x02}, {value: 0x8132, lo: 0xaf, hi: 0xaf}, @@ -6479,13 +6483,13 @@ var nfkcSparseValues = [875]valueRange{ {value: 0x8101, lo: 0x9e, hi: 0x9e}, // Block 0x83, offset 0x2ba {value: 0x0000, lo: 0x0c}, - {value: 0x4662, lo: 0x9e, hi: 0x9e}, - {value: 0x466c, lo: 0x9f, hi: 0x9f}, - {value: 0x46a0, lo: 0xa0, hi: 0xa0}, - {value: 0x46ae, lo: 0xa1, hi: 0xa1}, - {value: 0x46bc, lo: 0xa2, hi: 0xa2}, - {value: 0x46ca, lo: 0xa3, hi: 0xa3}, - {value: 0x46d8, lo: 0xa4, hi: 0xa4}, + {value: 0x45cc, lo: 0x9e, hi: 0x9e}, + {value: 0x45d6, lo: 0x9f, hi: 0x9f}, + {value: 0x460a, lo: 0xa0, hi: 0xa0}, + {value: 0x4618, lo: 0xa1, hi: 0xa1}, + {value: 0x4626, lo: 0xa2, hi: 0xa2}, + {value: 0x4634, lo: 0xa3, hi: 0xa3}, + {value: 0x4642, lo: 0xa4, hi: 0xa4}, {value: 0x812b, lo: 0xa5, hi: 0xa6}, {value: 0x8101, lo: 0xa7, hi: 0xa9}, {value: 0x8130, lo: 0xad, hi: 0xad}, @@ -6497,14 +6501,14 @@ var nfkcSparseValues = [875]valueRange{ {value: 0x8132, lo: 0x85, hi: 0x89}, {value: 0x812d, lo: 0x8a, hi: 0x8b}, {value: 0x8132, lo: 0xaa, hi: 0xad}, - {value: 0x4676, lo: 0xbb, hi: 0xbb}, - {value: 0x4680, lo: 0xbc, hi: 0xbc}, - {value: 0x46e6, lo: 0xbd, hi: 0xbd}, - {value: 0x4702, lo: 0xbe, hi: 0xbe}, - {value: 0x46f4, lo: 0xbf, hi: 0xbf}, + {value: 0x45e0, lo: 0xbb, hi: 0xbb}, + {value: 0x45ea, lo: 0xbc, hi: 0xbc}, + {value: 0x4650, lo: 0xbd, hi: 0xbd}, + {value: 0x466c, lo: 0xbe, hi: 0xbe}, + {value: 0x465e, lo: 0xbf, hi: 0xbf}, // Block 0x85, offset 0x2d1 {value: 0x0000, lo: 0x01}, - {value: 0x4710, lo: 0x80, hi: 0x80}, + {value: 0x467a, lo: 0x80, hi: 0x80}, // Block 0x86, offset 0x2d3 {value: 0x0000, lo: 0x01}, {value: 0x8132, lo: 0x82, hi: 0x84}, @@ -7624,4 +7628,4 @@ var recompMap = map[uint32]rune{ 0x15B915AF: 0x115BB, } -// Total size of tables: 53KB (53976 bytes) +// Total size of tables: 53KB (54006 bytes) diff --git a/vendor/golang.org/x/text/width/kind_string.go b/vendor/golang.org/x/text/width/kind_string.go index ab4fee542f346..49bfbf726830f 100644 --- a/vendor/golang.org/x/text/width/kind_string.go +++ b/vendor/golang.org/x/text/width/kind_string.go @@ -1,4 +1,4 @@ -// Code generated by "stringer -type=Kind"; DO NOT EDIT +// Code generated by "stringer -type=Kind"; DO NOT EDIT. package width diff --git a/vendor/golang.org/x/text/width/tables.go b/vendor/golang.org/x/text/width/tables.go index 242da0fdb9c4d..e21f0b8385901 100644 --- a/vendor/golang.org/x/text/width/tables.go +++ b/vendor/golang.org/x/text/width/tables.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package width diff --git a/vendor/golang.org/x/text/width/transform.go b/vendor/golang.org/x/text/width/transform.go index 2ed25096acbe3..0049f700a2f68 100644 --- a/vendor/golang.org/x/text/width/transform.go +++ b/vendor/golang.org/x/text/width/transform.go @@ -14,6 +14,32 @@ type foldTransform struct { transform.NopResetter } +func (foldTransform) Span(src []byte, atEOF bool) (n int, err error) { + for n < len(src) { + if src[n] < utf8.RuneSelf { + // ASCII fast path. + for n++; n < len(src) && src[n] < utf8.RuneSelf; n++ { + } + continue + } + v, size := trie.lookup(src[n:]) + if size == 0 { // incomplete UTF-8 encoding + if !atEOF { + err = transform.ErrShortSrc + } else { + n = len(src) + } + break + } + if elem(v)&tagNeedsFold != 0 { + err = transform.ErrEndOfSpan + break + } + n += size + } + return n, err +} + func (foldTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { for nSrc < len(src) { if src[nSrc] < utf8.RuneSelf { @@ -70,6 +96,33 @@ type narrowTransform struct { transform.NopResetter } +func (narrowTransform) Span(src []byte, atEOF bool) (n int, err error) { + for n < len(src) { + if src[n] < utf8.RuneSelf { + // ASCII fast path. + for n++; n < len(src) && src[n] < utf8.RuneSelf; n++ { + } + continue + } + v, size := trie.lookup(src[n:]) + if size == 0 { // incomplete UTF-8 encoding + if !atEOF { + err = transform.ErrShortSrc + } else { + n = len(src) + } + break + } + if k := elem(v).kind(); byte(v) == 0 || k != EastAsianFullwidth && k != EastAsianWide && k != EastAsianAmbiguous { + } else { + err = transform.ErrEndOfSpan + break + } + n += size + } + return n, err +} + func (narrowTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { for nSrc < len(src) { if src[nSrc] < utf8.RuneSelf { @@ -126,6 +179,30 @@ type wideTransform struct { transform.NopResetter } +func (wideTransform) Span(src []byte, atEOF bool) (n int, err error) { + for n < len(src) { + // TODO: Consider ASCII fast path. Special-casing ASCII handling can + // reduce the ns/op of BenchmarkWideASCII by about 30%. This is probably + // not enough to warrant the extra code and complexity. + v, size := trie.lookup(src[n:]) + if size == 0 { // incomplete UTF-8 encoding + if !atEOF { + err = transform.ErrShortSrc + } else { + n = len(src) + } + break + } + if k := elem(v).kind(); byte(v) == 0 || k != EastAsianHalfwidth && k != EastAsianNarrow { + } else { + err = transform.ErrEndOfSpan + break + } + n += size + } + return n, err +} + func (wideTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { for nSrc < len(src) { // TODO: Consider ASCII fast path. Special-casing ASCII handling can diff --git a/vendor/golang.org/x/text/width/trieval.go b/vendor/golang.org/x/text/width/trieval.go index 0ecffb4c64f37..ca8e45fd19ef2 100644 --- a/vendor/golang.org/x/text/width/trieval.go +++ b/vendor/golang.org/x/text/width/trieval.go @@ -1,4 +1,4 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package width diff --git a/vendor/golang.org/x/text/width/width.go b/vendor/golang.org/x/text/width/width.go index c32d772fc700f..0c9aec474edb2 100644 --- a/vendor/golang.org/x/text/width/width.go +++ b/vendor/golang.org/x/text/width/width.go @@ -153,17 +153,22 @@ func (p Properties) Wide() rune { // Transformer implements the transform.Transformer interface. type Transformer struct { - t transform.Transformer + t transform.SpanningTransformer } // Reset implements the transform.Transformer interface. func (t Transformer) Reset() { t.t.Reset() } -// Transform implements the Transformer interface. +// Transform implements the transform.Transformer interface. func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { return t.t.Transform(dst, src, atEOF) } +// Span implements the transform.SpanningTransformer interface. +func (t Transformer) Span(src []byte, atEOF bool) (n int, err error) { + return t.t.Span(src, atEOF) +} + // Bytes returns a new byte slice with the result of applying t to b. func (t Transformer) Bytes(b []byte) []byte { b, _, _ = transform.Bytes(t, b) diff --git a/vendor/google.golang.org/genproto/LICENSE b/vendor/google.golang.org/genproto/LICENSE new file mode 100644 index 0000000000000..d645695673349 --- /dev/null +++ b/vendor/google.golang.org/genproto/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/google.golang.org/genproto/googleapis/rpc/status/BUILD b/vendor/google.golang.org/genproto/googleapis/rpc/status/BUILD new file mode 100644 index 0000000000000..cd4111cbe3c11 --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/rpc/status/BUILD @@ -0,0 +1,31 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["status.pb.go"], + tags = ["automanaged"], + deps = [ + "//vendor/github.com/golang/protobuf/proto:go_default_library", + "//vendor/github.com/golang/protobuf/ptypes/any:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go b/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go new file mode 100644 index 0000000000000..40e79375bf035 --- /dev/null +++ b/vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go @@ -0,0 +1,143 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/rpc/status.proto + +/* +Package status is a generated protocol buffer package. + +It is generated from these files: + google/rpc/status.proto + +It has these top-level messages: + Status +*/ +package status + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/ptypes/any" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +// The `Status` type defines a logical error model that is suitable for different +// programming environments, including REST APIs and RPC APIs. It is used by +// [gRPC](https://github.com/grpc). The error model is designed to be: +// +// - Simple to use and understand for most users +// - Flexible enough to meet unexpected needs +// +// # Overview +// +// The `Status` message contains three pieces of data: error code, error message, +// and error details. The error code should be an enum value of +// [google.rpc.Code][google.rpc.Code], but it may accept additional error codes if needed. The +// error message should be a developer-facing English message that helps +// developers *understand* and *resolve* the error. If a localized user-facing +// error message is needed, put the localized message in the error details or +// localize it in the client. The optional error details may contain arbitrary +// information about the error. There is a predefined set of error detail types +// in the package `google.rpc` which can be used for common error conditions. +// +// # Language mapping +// +// The `Status` message is the logical representation of the error model, but it +// is not necessarily the actual wire format. When the `Status` message is +// exposed in different client libraries and different wire protocols, it can be +// mapped differently. For example, it will likely be mapped to some exceptions +// in Java, but more likely mapped to some error codes in C. +// +// # Other uses +// +// The error model and the `Status` message can be used in a variety of +// environments, either with or without APIs, to provide a +// consistent developer experience across different environments. +// +// Example uses of this error model include: +// +// - Partial errors. If a service needs to return partial errors to the client, +// it may embed the `Status` in the normal response to indicate the partial +// errors. +// +// - Workflow errors. A typical workflow has multiple steps. Each step may +// have a `Status` message for error reporting purpose. +// +// - Batch operations. If a client uses batch request and batch response, the +// `Status` message should be used directly inside batch response, one for +// each error sub-response. +// +// - Asynchronous operations. If an API call embeds asynchronous operation +// results in its response, the status of those operations should be +// represented directly using the `Status` message. +// +// - Logging. If some API errors are stored in logs, the message `Status` could +// be used directly after any stripping needed for security/privacy reasons. +type Status struct { + // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. + Code int32 `protobuf:"varint,1,opt,name=code" json:"code,omitempty"` + // A developer-facing error message, which should be in English. Any + // user-facing error message should be localized and sent in the + // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. + Message string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + // A list of messages that carry the error details. There will be a + // common set of message types for APIs to use. + Details []*google_protobuf.Any `protobuf:"bytes,3,rep,name=details" json:"details,omitempty"` +} + +func (m *Status) Reset() { *m = Status{} } +func (m *Status) String() string { return proto.CompactTextString(m) } +func (*Status) ProtoMessage() {} +func (*Status) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *Status) GetCode() int32 { + if m != nil { + return m.Code + } + return 0 +} + +func (m *Status) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + +func (m *Status) GetDetails() []*google_protobuf.Any { + if m != nil { + return m.Details + } + return nil +} + +func init() { + proto.RegisterType((*Status)(nil), "google.rpc.Status") +} + +func init() { proto.RegisterFile("google/rpc/status.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 209 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4f, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x2a, 0x48, 0xd6, 0x2f, 0x2e, 0x49, 0x2c, 0x29, 0x2d, 0xd6, 0x2b, 0x28, + 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x82, 0x48, 0xe8, 0x15, 0x15, 0x24, 0x4b, 0x49, 0x42, 0x15, 0x81, + 0x65, 0x92, 0x4a, 0xd3, 0xf4, 0x13, 0xf3, 0x2a, 0x21, 0xca, 0x94, 0xd2, 0xb8, 0xd8, 0x82, 0xc1, + 0xda, 0x84, 0x84, 0xb8, 0x58, 0x92, 0xf3, 0x53, 0x52, 0x25, 0x18, 0x15, 0x18, 0x35, 0x58, 0x83, + 0xc0, 0x6c, 0x21, 0x09, 0x2e, 0xf6, 0xdc, 0xd4, 0xe2, 0xe2, 0xc4, 0xf4, 0x54, 0x09, 0x26, 0x05, + 0x46, 0x0d, 0xce, 0x20, 0x18, 0x57, 0x48, 0x8f, 0x8b, 0x3d, 0x25, 0xb5, 0x24, 0x31, 0x33, 0xa7, + 0x58, 0x82, 0x59, 0x81, 0x59, 0x83, 0xdb, 0x48, 0x44, 0x0f, 0x6a, 0x21, 0xcc, 0x12, 0x3d, 0xc7, + 0xbc, 0xca, 0x20, 0x98, 0x22, 0xa7, 0x38, 0x2e, 0xbe, 0xe4, 0xfc, 0x5c, 0x3d, 0x84, 0xa3, 0x9c, + 0xb8, 0x21, 0xf6, 0x06, 0x80, 0x94, 0x07, 0x30, 0x46, 0x99, 0x43, 0xa5, 0xd2, 0xf3, 0x73, 0x12, + 0xf3, 0xd2, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0xd3, 0x53, 0xf3, 0xc0, 0x86, 0xe9, 0x43, 0xa4, 0x12, + 0x0b, 0x32, 0x8b, 0x91, 0xfc, 0x69, 0x0d, 0xa1, 0x16, 0x31, 0x31, 0x07, 0x05, 0x38, 0x27, 0xb1, + 0x81, 0x55, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa4, 0x53, 0xf0, 0x7c, 0x10, 0x01, 0x00, + 0x00, +} diff --git a/vendor/google.golang.org/grpc/.travis.yml b/vendor/google.golang.org/grpc/.travis.yml index 0c1a96c6857d1..9032f8dcdfa01 100644 --- a/vendor/google.golang.org/grpc/.travis.yml +++ b/vendor/google.golang.org/grpc/.travis.yml @@ -1,19 +1,20 @@ language: go go: - - 1.5.4 - - 1.6.3 - - 1.7 + - 1.6.x + - 1.7.x + - 1.8.x go_import_path: google.golang.org/grpc before_install: - - if [[ $TRAVIS_GO_VERSION != 1.5* ]]; then go get github.com/golang/lint/golint; fi + - if [[ $TRAVIS_GO_VERSION = 1.8* ]]; then go get -u github.com/golang/lint/golint honnef.co/go/tools/cmd/staticcheck; fi - go get -u golang.org/x/tools/cmd/goimports github.com/axw/gocov/gocov github.com/mattn/goveralls golang.org/x/tools/cmd/cover script: - '! gofmt -s -d -l . 2>&1 | read' - '! goimports -l . | read' - - 'if [[ $TRAVIS_GO_VERSION != 1.5* ]]; then ! golint ./... | grep -vE "(_string|\.pb)\.go:"; fi' - - '! go tool vet -all . 2>&1 | grep -vE "constant [0-9]+ not a string in call to Errorf" | grep -vF .pb.go:' # https://github.com/golang/protobuf/issues/214 + - 'if [[ $TRAVIS_GO_VERSION = 1.8* ]]; then ! golint ./... | grep -vE "(_mock|_string|\.pb)\.go:"; fi' + - 'if [[ $TRAVIS_GO_VERSION = 1.8* ]]; then ! go tool vet -all . 2>&1 | grep -vF .pb.go:; fi' # https://github.com/golang/protobuf/issues/214 - make test testrace + - 'if [[ $TRAVIS_GO_VERSION = 1.8* ]]; then staticcheck -ignore google.golang.org/grpc/transport/transport_test.go:SA2002 ./...; fi' # TODO(menghanl): fix these diff --git a/vendor/google.golang.org/grpc/AUTHORS b/vendor/google.golang.org/grpc/AUTHORS new file mode 100644 index 0000000000000..e491a9e7f7831 --- /dev/null +++ b/vendor/google.golang.org/grpc/AUTHORS @@ -0,0 +1 @@ +Google Inc. diff --git a/vendor/google.golang.org/grpc/BUILD b/vendor/google.golang.org/grpc/BUILD index 205df7ee74b8a..f2dfb075f3d1d 100644 --- a/vendor/google.golang.org/grpc/BUILD +++ b/vendor/google.golang.org/grpc/BUILD @@ -7,8 +7,13 @@ go_library( "balancer.go", "call.go", "clientconn.go", + "codec.go", "doc.go", + "go16.go", + "go17.go", + "grpclb.go", "interceptor.go", + "proxy.go", "rpc_util.go", "server.go", "stream.go", @@ -22,10 +27,16 @@ go_library( "//vendor/golang.org/x/net/trace:go_default_library", "//vendor/google.golang.org/grpc/codes:go_default_library", "//vendor/google.golang.org/grpc/credentials:go_default_library", + "//vendor/google.golang.org/grpc/grpclb/grpc_lb_v1:go_default_library", "//vendor/google.golang.org/grpc/grpclog:go_default_library", "//vendor/google.golang.org/grpc/internal:go_default_library", + "//vendor/google.golang.org/grpc/keepalive:go_default_library", "//vendor/google.golang.org/grpc/metadata:go_default_library", "//vendor/google.golang.org/grpc/naming:go_default_library", + "//vendor/google.golang.org/grpc/peer:go_default_library", + "//vendor/google.golang.org/grpc/stats:go_default_library", + "//vendor/google.golang.org/grpc/status:go_default_library", + "//vendor/google.golang.org/grpc/tap:go_default_library", "//vendor/google.golang.org/grpc/transport:go_default_library", ], ) @@ -43,11 +54,16 @@ filegroup( ":package-srcs", "//vendor/google.golang.org/grpc/codes:all-srcs", "//vendor/google.golang.org/grpc/credentials:all-srcs", + "//vendor/google.golang.org/grpc/grpclb/grpc_lb_v1:all-srcs", "//vendor/google.golang.org/grpc/grpclog:all-srcs", "//vendor/google.golang.org/grpc/internal:all-srcs", + "//vendor/google.golang.org/grpc/keepalive:all-srcs", "//vendor/google.golang.org/grpc/metadata:all-srcs", "//vendor/google.golang.org/grpc/naming:all-srcs", "//vendor/google.golang.org/grpc/peer:all-srcs", + "//vendor/google.golang.org/grpc/stats:all-srcs", + "//vendor/google.golang.org/grpc/status:all-srcs", + "//vendor/google.golang.org/grpc/tap:all-srcs", "//vendor/google.golang.org/grpc/transport:all-srcs", ], tags = ["automanaged"], diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md index 36cd6f7581bb7..a5c6e06e25507 100644 --- a/vendor/google.golang.org/grpc/CONTRIBUTING.md +++ b/vendor/google.golang.org/grpc/CONTRIBUTING.md @@ -1,46 +1,32 @@ # How to contribute -We definitely welcome patches and contribution to grpc! Here are some guidelines -and information about how to do so. +We definitely welcome your patches and contributions to gRPC! -## Sending patches - -### Getting started - -1. Check out the code: - - $ go get google.golang.org/grpc - $ cd $GOPATH/src/google.golang.org/grpc - -1. Create a fork of the grpc-go repository. -1. Add your fork as a remote: - - $ git remote add fork git@github.com:$YOURGITHUBUSERNAME/grpc-go.git - -1. Make changes, commit them. -1. Run the test suite: - - $ make test - -1. Push your changes to your fork: - - $ git push fork ... - -1. Open a pull request. +If you are new to github, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) ## Legal requirements In order to protect both you and ourselves, you will need to sign the [Contributor License Agreement](https://cla.developers.google.com/clas). -## Filing Issues -When filing an issue, make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -### Contributing code -Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file. +## Guidelines for Pull Requests +How to get your contributions merged smoothly and quickly. + +- Create **small PRs** that are narrowly focused on **addressing a single concern**. We often times receive PRs that are trying to fix several things at a time, but only one fix is considered acceptable, nothing gets merged and both author's & review's time is wasted. Create more PRs to address different concerns and everyone will be happy. + +- For speculative changes, consider opening an issue and discussing it first. If you are suggesting a behavioral or API change, consider starting with a [gRFC proposal](https://github.com/grpc/proposal). + +- Provide a good **PR description** as a record of **what** change is being made and **why** it was made. Link to a github issue if it exists. + +- Don't fix code style and formatting unless you are already changing that line to address an issue. PRs with irrelevant changes won't be merged. If you do want to fix formatting or style, do that in a separate PR. + +- Unless your PR is trivial, you should expect there will be reviewer comments that you'll need to address before merging. We expect you to be reasonably responsive to those comments, otherwise the PR will be closed after 2-3 weeks of inactivity. + +- Maintain **clean commit history** and use **meaningful commit messages**. PRs with messy commit history are difficult to review and won't be merged. Use `rebase -i upstream/master` to curate your commit history and/or to bring in latest changes from master (but avoid rebasing in the middle of a code review). + +- Keep your PR up to date with upstream/master (if there are merge conflicts, we can't really merge your change). + +- **All tests need to be passing** before your change can be merged. We recommend you **run tests locally** before creating your PR to catch breakages early on. + +- Exceptions to the rules can be made if there's a compelling reason for doing so. + diff --git a/vendor/google.golang.org/grpc/LICENSE b/vendor/google.golang.org/grpc/LICENSE index f4988b4507993..d645695673349 100644 --- a/vendor/google.golang.org/grpc/LICENSE +++ b/vendor/google.golang.org/grpc/LICENSE @@ -1,28 +1,202 @@ -Copyright 2014, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/google.golang.org/grpc/PATENTS b/vendor/google.golang.org/grpc/PATENTS deleted file mode 100644 index 69b47959fabac..0000000000000 --- a/vendor/google.golang.org/grpc/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the gRPC project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of gRPC, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of gRPC. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of gRPC or any code incorporated within this -implementation of gRPC constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of gRPC -shall terminate as of the date such litigation is filed. diff --git a/vendor/google.golang.org/grpc/README.md b/vendor/google.golang.org/grpc/README.md index 110a8cf425312..72c7325cc7dd7 100644 --- a/vendor/google.golang.org/grpc/README.md +++ b/vendor/google.golang.org/grpc/README.md @@ -1,8 +1,8 @@ -#gRPC-Go +# gRPC-Go [![Build Status](https://travis-ci.org/grpc/grpc-go.svg)](https://travis-ci.org/grpc/grpc-go) [![GoDoc](https://godoc.org/google.golang.org/grpc?status.svg)](https://godoc.org/google.golang.org/grpc) -The Go implementation of [gRPC](http://www.grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the [gRPC Quick Start](http://www.grpc.io/docs/) guide. +The Go implementation of [gRPC](https://grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the [gRPC Quick Start: Go](https://grpc.io/docs/quickstart/go.html) guide. Installation ------------ @@ -16,7 +16,7 @@ $ go get google.golang.org/grpc Prerequisites ------------- -This requires Go 1.5 or later. +This requires Go 1.6 or later. Constraints ----------- @@ -26,7 +26,20 @@ Documentation ------------- See [API documentation](https://godoc.org/google.golang.org/grpc) for package and API descriptions and find examples in the [examples directory](examples/). +Performance +----------- +See the current benchmarks for some of the languages supported in [this dashboard](https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5652536396611584&widget=490377658&container=1286539696). + Status ------ -GA +General Availability [Google Cloud Platform Launch Stages](https://cloud.google.com/terms/launch-stages). + +FAQ +--- + +#### Compiling error, undefined: grpc.SupportPackageIsVersion +Please update proto package, gRPC package and rebuild the proto files: + - `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}` + - `go get -u google.golang.org/grpc` + - `protoc --go_out=plugins=grpc:. *.proto` diff --git a/vendor/google.golang.org/grpc/backoff.go b/vendor/google.golang.org/grpc/backoff.go index c99024ee302e7..090fbe87c522a 100644 --- a/vendor/google.golang.org/grpc/backoff.go +++ b/vendor/google.golang.org/grpc/backoff.go @@ -1,3 +1,21 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package grpc import ( diff --git a/vendor/google.golang.org/grpc/balancer.go b/vendor/google.golang.org/grpc/balancer.go index 9d943fbadae12..cde472c8120a7 100644 --- a/vendor/google.golang.org/grpc/balancer.go +++ b/vendor/google.golang.org/grpc/balancer.go @@ -1,33 +1,18 @@ /* * - * Copyright 2016, Google Inc. - * All rights reserved. + * Copyright 2016 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -35,6 +20,7 @@ package grpc import ( "fmt" + "net" "sync" "golang.org/x/net/context" @@ -60,6 +46,10 @@ type BalancerConfig struct { // use to dial to a remote load balancer server. The Balancer implementations // can ignore this if it does not need to talk to another party securely. DialCreds credentials.TransportCredentials + // Dialer is the custom dialer the Balancer implementation can use to dial + // to a remote load balancer server. The Balancer implementations + // can ignore this if it doesn't need to talk to remote balancer. + Dialer func(context.Context, string) (net.Conn, error) } // BalancerGetOptions configures a Get call. @@ -167,7 +157,7 @@ type roundRobin struct { func (rr *roundRobin) watchAddrUpdates() error { updates, err := rr.w.Next() if err != nil { - grpclog.Printf("grpc: the naming watcher stops working due to %v.\n", err) + grpclog.Warningf("grpc: the naming watcher stops working due to %v.", err) return err } rr.mu.Lock() @@ -183,7 +173,7 @@ func (rr *roundRobin) watchAddrUpdates() error { for _, v := range rr.addrs { if addr == v.addr { exist = true - grpclog.Println("grpc: The name resolver wanted to add an existing address: ", addr) + grpclog.Infoln("grpc: The name resolver wanted to add an existing address: ", addr) break } } @@ -200,7 +190,7 @@ func (rr *roundRobin) watchAddrUpdates() error { } } default: - grpclog.Println("Unknown update.Op ", update.Op) + grpclog.Errorln("Unknown update.Op ", update.Op) } } // Make a copy of rr.addrs and write it onto rr.addrCh so that gRPC internals gets notified. @@ -211,6 +201,10 @@ func (rr *roundRobin) watchAddrUpdates() error { if rr.done { return ErrClientConnClosing } + select { + case <-rr.addrCh: + default: + } rr.addrCh <- open return nil } @@ -233,7 +227,7 @@ func (rr *roundRobin) Start(target string, config BalancerConfig) error { return err } rr.w = w - rr.addrCh = make(chan []Address) + rr.addrCh = make(chan []Address, 1) go func() { for { if err := rr.watchAddrUpdates(); err != nil { @@ -385,6 +379,9 @@ func (rr *roundRobin) Notify() <-chan []Address { func (rr *roundRobin) Close() error { rr.mu.Lock() defer rr.mu.Unlock() + if rr.done { + return errBalancerClosed + } rr.done = true if rr.w != nil { rr.w.Close() diff --git a/vendor/google.golang.org/grpc/call.go b/vendor/google.golang.org/grpc/call.go index 772c817edd3d0..f0b4591256113 100644 --- a/vendor/google.golang.org/grpc/call.go +++ b/vendor/google.golang.org/grpc/call.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -36,12 +21,14 @@ package grpc import ( "bytes" "io" - "math" "time" "golang.org/x/net/context" "golang.org/x/net/trace" "google.golang.org/grpc/codes" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" "google.golang.org/grpc/transport" ) @@ -49,7 +36,8 @@ import ( // On error, it returns the error and indicates whether the call should be retried. // // TODO(zhaoq): Check whether the received message sequence is valid. -func recvResponse(dopts dialOptions, t transport.ClientTransport, c *callInfo, stream *transport.Stream, reply interface{}) (err error) { +// TODO ctx is used for stats collection and processing. It is the context passed from the application. +func recvResponse(ctx context.Context, dopts dialOptions, t transport.ClientTransport, c *callInfo, stream *transport.Stream, reply interface{}) (err error) { // Try to acquire header metadata from the server if there is any. defer func() { if err != nil { @@ -63,24 +51,37 @@ func recvResponse(dopts dialOptions, t transport.ClientTransport, c *callInfo, s return } p := &parser{r: stream} + var inPayload *stats.InPayload + if dopts.copts.StatsHandler != nil { + inPayload = &stats.InPayload{ + Client: true, + } + } for { - if err = recv(p, dopts.codec, stream, dopts.dc, reply, math.MaxInt32); err != nil { + if c.maxReceiveMessageSize == nil { + return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)") + } + if err = recv(p, dopts.codec, stream, dopts.dc, reply, *c.maxReceiveMessageSize, inPayload); err != nil { if err == io.EOF { break } return } } + if inPayload != nil && err == io.EOF && stream.Status().Code() == codes.OK { + // TODO in the current implementation, inTrailer may be handled before inPayload in some cases. + // Fix the order if necessary. + dopts.copts.StatsHandler.HandleRPC(ctx, inPayload) + } c.trailerMD = stream.Trailer() + if peer, ok := peer.FromContext(stream.Context()); ok { + c.peer = peer + } return nil } // sendRequest writes out various information of an RPC such as Context and Message. -func sendRequest(ctx context.Context, codec Codec, compressor Compressor, callHdr *transport.CallHdr, t transport.ClientTransport, args interface{}, opts *transport.Options) (_ *transport.Stream, err error) { - stream, err := t.NewStream(ctx, callHdr) - if err != nil { - return nil, err - } +func sendRequest(ctx context.Context, dopts dialOptions, compressor Compressor, c *callInfo, callHdr *transport.CallHdr, stream *transport.Stream, t transport.ClientTransport, args interface{}, opts *transport.Options) (err error) { defer func() { if err != nil { // If err is connection error, t will be closed, no need to close stream here. @@ -89,23 +90,41 @@ func sendRequest(ctx context.Context, codec Codec, compressor Compressor, callHd } } }() - var cbuf *bytes.Buffer + var ( + cbuf *bytes.Buffer + outPayload *stats.OutPayload + ) if compressor != nil { cbuf = new(bytes.Buffer) } - outBuf, err := encode(codec, args, compressor, cbuf) + if dopts.copts.StatsHandler != nil { + outPayload = &stats.OutPayload{ + Client: true, + } + } + outBuf, err := encode(dopts.codec, args, compressor, cbuf, outPayload) if err != nil { - return nil, Errorf(codes.Internal, "grpc: %v", err) + return err + } + if c.maxSendMessageSize == nil { + return Errorf(codes.Internal, "callInfo maxSendMessageSize field uninitialized(nil)") + } + if len(outBuf) > *c.maxSendMessageSize { + return Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(outBuf), *c.maxSendMessageSize) } err = t.Write(stream, outBuf, opts) + if err == nil && outPayload != nil { + outPayload.SentTime = time.Now() + dopts.copts.StatsHandler.HandleRPC(ctx, outPayload) + } // t.NewStream(...) could lead to an early rejection of the RPC (e.g., the service/method // does not exist.) so that t.Write could get io.EOF from wait(...). Leave the following // recvResponse to get the final status. if err != nil && err != io.EOF { - return nil, err + return err } // Sent successfully. - return stream, nil + return nil } // Invoke sends the RPC request on the wire and returns after response is received. @@ -118,8 +137,20 @@ func Invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli return invoke(ctx, method, args, reply, cc, opts...) } -func invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) (err error) { +func invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) (e error) { c := defaultCallInfo + mc := cc.GetMethodConfig(method) + if mc.WaitForReady != nil { + c.failFast = !*mc.WaitForReady + } + + if mc.Timeout != nil && *mc.Timeout >= 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, *mc.Timeout) + defer cancel() + } + + opts = append(cc.dopts.callOptions, opts...) for _, o := range opts { if err := o.before(&c); err != nil { return toRPCErr(err) @@ -130,6 +161,10 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli o.after(&c) } }() + + c.maxSendMessageSize = getMaxSize(mc.MaxReqSize, c.maxSendMessageSize, defaultClientMaxSendMessageSize) + c.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) + if EnableTracing { c.traceInfo.tr = trace.New("grpc.Sent."+methodFamily(method), method) defer c.traceInfo.tr.Finish() @@ -140,12 +175,31 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli c.traceInfo.tr.LazyLog(&c.traceInfo.firstLine, false) // TODO(dsymonds): Arrange for c.traceInfo.firstLine.remoteAddr to be set. defer func() { - if err != nil { - c.traceInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) + if e != nil { + c.traceInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{e}}, true) c.traceInfo.tr.SetError() } }() } + ctx = newContextWithRPCInfo(ctx) + sh := cc.dopts.copts.StatsHandler + if sh != nil { + ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast}) + begin := &stats.Begin{ + Client: true, + BeginTime: time.Now(), + FailFast: c.failFast, + } + sh.HandleRPC(ctx, begin) + defer func() { + end := &stats.End{ + Client: true, + EndTime: time.Now(), + Error: e, + } + sh.HandleRPC(ctx, end) + }() + } topts := &transport.Options{ Last: true, Delay: false, @@ -167,13 +221,17 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli if cc.dopts.cp != nil { callHdr.SendCompress = cc.dopts.cp.Type() } + if c.creds != nil { + callHdr.Creds = c.creds + } + gopts := BalancerGetOptions{ BlockingWait: !c.failFast, } t, put, err = cc.getTransport(ctx, gopts) if err != nil { // TODO(zhaoq): Probably revisit the error handling. - if _, ok := err.(*rpcError); ok { + if _, ok := status.FromError(err); ok { return err } if err == errConnClosing || err == errConnUnavailable { @@ -188,33 +246,49 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli if c.traceInfo.tr != nil { c.traceInfo.tr.LazyLog(&payload{sent: true, msg: args}, true) } - stream, err = sendRequest(ctx, cc.dopts.codec, cc.dopts.cp, callHdr, t, args, topts) + stream, err = t.NewStream(ctx, callHdr) if err != nil { if put != nil { + if _, ok := err.(transport.ConnectionError); ok { + // If error is connection error, transport was sending data on wire, + // and we are not sure if anything has been sent on wire. + // If error is not connection error, we are sure nothing has been sent. + updateRPCInfoInContext(ctx, rpcInfo{bytesSent: true, bytesReceived: false}) + } + put() + } + if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast { + continue + } + return toRPCErr(err) + } + err = sendRequest(ctx, cc.dopts, cc.dopts.cp, &c, callHdr, stream, t, args, topts) + if err != nil { + if put != nil { + updateRPCInfoInContext(ctx, rpcInfo{ + bytesSent: stream.BytesSent(), + bytesReceived: stream.BytesReceived(), + }) put() - put = nil } // Retry a non-failfast RPC when // i) there is a connection error; or // ii) the server started to drain before this RPC was initiated. - if _, ok := err.(transport.ConnectionError); ok || err == transport.ErrStreamDrain { - if c.failFast { - return toRPCErr(err) - } + if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast { continue } return toRPCErr(err) } - err = recvResponse(cc.dopts, t, &c, stream, reply) + err = recvResponse(ctx, cc.dopts, t, &c, stream, reply) if err != nil { if put != nil { + updateRPCInfoInContext(ctx, rpcInfo{ + bytesSent: stream.BytesSent(), + bytesReceived: stream.BytesReceived(), + }) put() - put = nil } - if _, ok := err.(transport.ConnectionError); ok || err == transport.ErrStreamDrain { - if c.failFast { - return toRPCErr(err) - } + if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast { continue } return toRPCErr(err) @@ -224,9 +298,12 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli } t.CloseStream(stream, nil) if put != nil { + updateRPCInfoInContext(ctx, rpcInfo{ + bytesSent: stream.BytesSent(), + bytesReceived: stream.BytesReceived(), + }) put() - put = nil } - return Errorf(stream.StatusCode(), "%s", stream.StatusDesc()) + return stream.Status().Err() } } diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index 61674729a77ba..f21a568525d39 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -45,6 +30,8 @@ import ( "golang.org/x/net/trace" "google.golang.org/grpc/credentials" "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/stats" "google.golang.org/grpc/transport" ) @@ -54,6 +41,7 @@ var ( ErrClientConnClosing = errors.New("grpc: the client connection is closing") // ErrClientConnTimeout indicates that the ClientConn cannot establish the // underlying connections within the specified timeout. + // DEPRECATED: Please use context.DeadlineExceeded instead. ErrClientConnTimeout = errors.New("grpc: timed out when dialing") // errNoTransportSecurity indicates that there is no transport security @@ -75,7 +63,8 @@ var ( errConnClosing = errors.New("grpc: the connection is closing") // errConnUnavailable indicates that the connection is unavailable. errConnUnavailable = errors.New("grpc: the connection is unavailable") - errNoAddr = errors.New("grpc: there is no address available to dial") + // errBalancerClosed indicates that the balancer is closed. + errBalancerClosed = errors.New("grpc: balancer is closed") // minimum time to give a connection to complete minConnectTimeout = 20 * time.Second ) @@ -83,22 +72,57 @@ var ( // dialOptions configure a Dial call. dialOptions are set by the DialOption // values passed to Dial. type dialOptions struct { - unaryInt UnaryClientInterceptor - streamInt StreamClientInterceptor - codec Codec - cp Compressor - dc Decompressor - bs backoffStrategy - balancer Balancer - block bool - insecure bool - timeout time.Duration - copts transport.ConnectOptions + unaryInt UnaryClientInterceptor + streamInt StreamClientInterceptor + codec Codec + cp Compressor + dc Decompressor + bs backoffStrategy + balancer Balancer + block bool + insecure bool + timeout time.Duration + scChan <-chan ServiceConfig + copts transport.ConnectOptions + callOptions []CallOption } +const ( + defaultClientMaxReceiveMessageSize = 1024 * 1024 * 4 + defaultClientMaxSendMessageSize = 1024 * 1024 * 4 +) + // DialOption configures how we set up the connection. type DialOption func(*dialOptions) +// WithInitialWindowSize returns a DialOption which sets the value for initial window size on a stream. +// The lower bound for window size is 64K and any value smaller than that will be ignored. +func WithInitialWindowSize(s int32) DialOption { + return func(o *dialOptions) { + o.copts.InitialWindowSize = s + } +} + +// WithInitialConnWindowSize returns a DialOption which sets the value for initial window size on a connection. +// The lower bound for window size is 64K and any value smaller than that will be ignored. +func WithInitialConnWindowSize(s int32) DialOption { + return func(o *dialOptions) { + o.copts.InitialConnWindowSize = s + } +} + +// WithMaxMsgSize returns a DialOption which sets the maximum message size the client can receive. Deprecated: use WithDefaultCallOptions(MaxCallRecvMsgSize(s)) instead. +func WithMaxMsgSize(s int) DialOption { + return WithDefaultCallOptions(MaxCallRecvMsgSize(s)) +} + +// WithDefaultCallOptions returns a DialOption which sets the default CallOptions for calls over the connection. +func WithDefaultCallOptions(cos ...CallOption) DialOption { + return func(o *dialOptions) { + o.callOptions = append(o.callOptions, cos...) + } +} + // WithCodec returns a DialOption which sets a codec for message marshaling and unmarshaling. func WithCodec(c Codec) DialOption { return func(o *dialOptions) { @@ -129,6 +153,13 @@ func WithBalancer(b Balancer) DialOption { } } +// WithServiceConfig returns a DialOption which has a channel to read the service configuration. +func WithServiceConfig(c <-chan ServiceConfig) DialOption { + return func(o *dialOptions) { + o.scChan = c + } +} + // WithBackoffMaxDelay configures the dialer to use the provided maximum delay // when backing off after failed connection attempts. func WithBackoffMaxDelay(md time.Duration) DialOption { @@ -183,7 +214,7 @@ func WithTransportCredentials(creds credentials.TransportCredentials) DialOption } // WithPerRPCCredentials returns a DialOption which sets -// credentials which will place auth state on each outbound RPC. +// credentials and places auth state on each outbound RPC. func WithPerRPCCredentials(creds credentials.PerRPCCredentials) DialOption { return func(o *dialOptions) { o.copts.PerRPCCredentials = append(o.copts.PerRPCCredentials, creds) @@ -192,6 +223,7 @@ func WithPerRPCCredentials(creds credentials.PerRPCCredentials) DialOption { // WithTimeout returns a DialOption that configures a timeout for dialing a ClientConn // initially. This is valid if and only if WithBlock() is present. +// Deprecated: use DialContext and context.WithTimeout instead. func WithTimeout(d time.Duration) DialOption { return func(o *dialOptions) { o.timeout = d @@ -199,6 +231,8 @@ func WithTimeout(d time.Duration) DialOption { } // WithDialer returns a DialOption that specifies a function to use for dialing network addresses. +// If FailOnNonTempDialError() is set to true, and an error is returned by f, gRPC checks the error's +// Temporary() method to decide if it should try to reconnect to the network address. func WithDialer(f func(string, time.Duration) (net.Conn, error)) DialOption { return func(o *dialOptions) { o.copts.Dialer = func(ctx context.Context, addr string) (net.Conn, error) { @@ -210,6 +244,25 @@ func WithDialer(f func(string, time.Duration) (net.Conn, error)) DialOption { } } +// WithStatsHandler returns a DialOption that specifies the stats handler +// for all the RPCs and underlying network connections in this ClientConn. +func WithStatsHandler(h stats.Handler) DialOption { + return func(o *dialOptions) { + o.copts.StatsHandler = h + } +} + +// FailOnNonTempDialError returns a DialOption that specifies if gRPC fails on non-temporary dial errors. +// If f is true, and dialer returns a non-temporary error, gRPC will fail the connection to the network +// address and won't try to reconnect. +// The default value of FailOnNonTempDialError is false. +// This is an EXPERIMENTAL API. +func FailOnNonTempDialError(f bool) DialOption { + return func(o *dialOptions) { + o.copts.FailOnNonTempDialError = f + } +} + // WithUserAgent returns a DialOption that specifies a user agent string for all the RPCs. func WithUserAgent(s string) DialOption { return func(o *dialOptions) { @@ -217,6 +270,13 @@ func WithUserAgent(s string) DialOption { } } +// WithKeepaliveParams returns a DialOption that specifies keepalive paramaters for the client transport. +func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption { + return func(o *dialOptions) { + o.copts.KeepaliveParams = kp + } +} + // WithUnaryInterceptor returns a DialOption that specifies the interceptor for unary RPCs. func WithUnaryInterceptor(f UnaryClientInterceptor) DialOption { return func(o *dialOptions) { @@ -231,22 +291,56 @@ func WithStreamInterceptor(f StreamClientInterceptor) DialOption { } } +// WithAuthority returns a DialOption that specifies the value to be used as +// the :authority pseudo-header. This value only works with WithInsecure and +// has no effect if TransportCredentials are present. +func WithAuthority(a string) DialOption { + return func(o *dialOptions) { + o.copts.Authority = a + } +} + // Dial creates a client connection to the given target. func Dial(target string, opts ...DialOption) (*ClientConn, error) { return DialContext(context.Background(), target, opts...) } // DialContext creates a client connection to the given target. ctx can be used to -// cancel or expire the pending connecting. Once this function returns, the +// cancel or expire the pending connection. Once this function returns, the // cancellation and expiration of ctx will be noop. Users should call ClientConn.Close // to terminate all the pending operations after this function returns. -// This is the EXPERIMENTAL API. func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) { cc := &ClientConn{ target: target, conns: make(map[Address]*addrConn), } cc.ctx, cc.cancel = context.WithCancel(context.Background()) + + for _, opt := range opts { + opt(&cc.dopts) + } + cc.mkp = cc.dopts.copts.KeepaliveParams + + if cc.dopts.copts.Dialer == nil { + cc.dopts.copts.Dialer = newProxyDialer( + func(ctx context.Context, addr string) (net.Conn, error) { + return dialContext(ctx, "tcp", addr) + }, + ) + } + + if cc.dopts.copts.UserAgent != "" { + cc.dopts.copts.UserAgent += " " + grpcUA + } else { + cc.dopts.copts.UserAgent = grpcUA + } + + if cc.dopts.timeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, cc.dopts.timeout) + defer cancel() + } + defer func() { select { case <-ctx.Done(): @@ -259,10 +353,18 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * } }() - for _, opt := range opts { - opt(&cc.dopts) + scSet := false + if cc.dopts.scChan != nil { + // Try to get an initial service config. + select { + case sc, ok := <-cc.dopts.scChan: + if ok { + cc.sc = sc + scSet = true + } + default: + } } - // Set defaults. if cc.dopts.codec == nil { cc.dopts.codec = protoCodec{} @@ -273,56 +375,48 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * creds := cc.dopts.copts.TransportCredentials if creds != nil && creds.Info().ServerName != "" { cc.authority = creds.Info().ServerName + } else if cc.dopts.insecure && cc.dopts.copts.Authority != "" { + cc.authority = cc.dopts.copts.Authority } else { - colonPos := strings.LastIndex(target, ":") - if colonPos == -1 { - colonPos = len(target) - } - cc.authority = target[:colonPos] + cc.authority = target } - var ok bool waitC := make(chan error, 1) go func() { - var addrs []Address - if cc.dopts.balancer == nil { - // Connect to target directly if balancer is nil. - addrs = append(addrs, Address{Addr: target}) - } else { + defer close(waitC) + if cc.dopts.balancer == nil && cc.sc.LB != nil { + cc.dopts.balancer = cc.sc.LB + } + if cc.dopts.balancer != nil { var credsClone credentials.TransportCredentials if creds != nil { credsClone = creds.Clone() } config := BalancerConfig{ DialCreds: credsClone, + Dialer: cc.dopts.copts.Dialer, } if err := cc.dopts.balancer.Start(target, config); err != nil { waitC <- err return } ch := cc.dopts.balancer.Notify() - if ch == nil { - // There is no name resolver installed. - addrs = append(addrs, Address{Addr: target}) - } else { - addrs, ok = <-ch - if !ok || len(addrs) == 0 { - waitC <- errNoAddr - return + if ch != nil { + if cc.dopts.block { + doneChan := make(chan struct{}) + go cc.lbWatcher(doneChan) + <-doneChan + } else { + go cc.lbWatcher(nil) } - } - } - for _, a := range addrs { - if err := cc.resetAddrConn(a, false, nil); err != nil { - waitC <- err return } } - close(waitC) + // No balancer, or no resolver within the balancer. Connect directly. + if err := cc.resetAddrConn(Address{Addr: target}, cc.dopts.block, nil); err != nil { + waitC <- err + return + } }() - var timeoutCh <-chan time.Time - if cc.dopts.timeout > 0 { - timeoutCh = time.After(cc.dopts.timeout) - } select { case <-ctx.Done(): return nil, ctx.Err() @@ -330,14 +424,22 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn * if err != nil { return nil, err } - case <-timeoutCh: - return nil, ErrClientConnTimeout } - // If balancer is nil or balancer.Notify() is nil, ok will be false here. - // The lbWatcher goroutine will not be created. - if ok { - go cc.lbWatcher() + if cc.dopts.scChan != nil && !scSet { + // Blocking wait for the initial service config. + select { + case sc, ok := <-cc.dopts.scChan: + if ok { + cc.sc = sc + } + case <-ctx.Done(): + return nil, ctx.Err() + } } + if cc.dopts.scChan != nil { + go cc.scWatcher() + } + return cc, nil } @@ -384,10 +486,16 @@ type ClientConn struct { dopts dialOptions mu sync.RWMutex + sc ServiceConfig conns map[Address]*addrConn + // Keepalive parameter can be updated if a GoAway is received. + mkp keepalive.ClientParameters } -func (cc *ClientConn) lbWatcher() { +// lbWatcher watches the Notify channel of the balancer in cc and manages +// connections accordingly. If doneChan is not nil, it is closed after the +// first successfull connection is made. +func (cc *ClientConn) lbWatcher(doneChan chan struct{}) { for addrs := range cc.dopts.balancer.Notify() { var ( add []Address // Addresses need to setup connections. @@ -414,7 +522,15 @@ func (cc *ClientConn) lbWatcher() { } cc.mu.Unlock() for _, a := range add { - cc.resetAddrConn(a, true, nil) + if doneChan != nil { + err := cc.resetAddrConn(a, true, nil) + if err == nil { + close(doneChan) + doneChan = nil + } + } else { + cc.resetAddrConn(a, false, nil) + } } for _, c := range del { c.tearDown(errConnDrain) @@ -422,10 +538,32 @@ func (cc *ClientConn) lbWatcher() { } } +func (cc *ClientConn) scWatcher() { + for { + select { + case sc, ok := <-cc.dopts.scChan: + if !ok { + return + } + cc.mu.Lock() + // TODO: load balance policy runtime change is ignored. + // We may revist this decision in the future. + cc.sc = sc + cc.mu.Unlock() + case <-cc.ctx.Done(): + return + } + } +} + // resetAddrConn creates an addrConn for addr and adds it to cc.conns. // If there is an old addrConn for addr, it will be torn down, using tearDownErr as the reason. // If tearDownErr is nil, errConnDrain will be used instead. -func (cc *ClientConn) resetAddrConn(addr Address, skipWait bool, tearDownErr error) error { +// +// We should never need to replace an addrConn with a new one. This function is only used +// as newAddrConn to create new addrConn. +// TODO rename this function and clean up the code. +func (cc *ClientConn) resetAddrConn(addr Address, block bool, tearDownErr error) error { ac := &addrConn{ cc: cc, addr: addr, @@ -461,10 +599,7 @@ func (cc *ClientConn) resetAddrConn(addr Address, skipWait bool, tearDownErr err cc.mu.Unlock() if stale != nil { // There is an addrConn alive on ac.addr already. This could be due to - // 1) a buggy Balancer notifies duplicated Addresses; - // 2) goaway was received, a new ac will replace the old ac. - // The old ac should be deleted from cc.conns, but the - // underlying transport should drain rather than close. + // a buggy Balancer that reports duplicated Addresses. if tearDownErr == nil { // tearDownErr is nil if resetAddrConn is called by // 1) Dial @@ -475,8 +610,7 @@ func (cc *ClientConn) resetAddrConn(addr Address, skipWait bool, tearDownErr err stale.tearDown(tearDownErr) } } - // skipWait may overwrite the decision in ac.dopts.block. - if ac.dopts.block && !skipWait { + if block { if err := ac.resetTransport(false); err != nil { if err != errConnClosing { // Tear down ac and delete it from cc.conns. @@ -496,7 +630,7 @@ func (cc *ClientConn) resetAddrConn(addr Address, skipWait bool, tearDownErr err // Start a goroutine connecting to the server asynchronously. go func() { if err := ac.resetTransport(false); err != nil { - grpclog.Printf("Failed to dial %s: %v; please retry.", ac.addr.Addr, err) + grpclog.Warningf("Failed to dial %s: %v; please retry.", ac.addr.Addr, err) if err != errConnClosing { // Keep this ac in cc.conns, to get the reason it's torn down. ac.tearDown(err) @@ -509,6 +643,25 @@ func (cc *ClientConn) resetAddrConn(addr Address, skipWait bool, tearDownErr err return nil } +// GetMethodConfig gets the method config of the input method. +// If there's an exact match for input method (i.e. /service/method), we return +// the corresponding MethodConfig. +// If there isn't an exact match for the input method, we look for the default config +// under the service (i.e /service/). If there is a default MethodConfig for +// the serivce, we return it. +// Otherwise, we return an empty MethodConfig. +func (cc *ClientConn) GetMethodConfig(method string) MethodConfig { + // TODO: Avoid the locking here. + cc.mu.RLock() + defer cc.mu.RUnlock() + m, ok := cc.sc.Methods[method] + if !ok { + i := strings.LastIndex(method, "/") + m, _ = cc.sc.Methods[method[:i+1]] + } + return m +} + func (cc *ClientConn) getTransport(ctx context.Context, opts BalancerGetOptions) (transport.ClientTransport, func(), error) { var ( ac *addrConn @@ -547,6 +700,7 @@ func (cc *ClientConn) getTransport(ctx context.Context, opts BalancerGetOptions) } if !ok { if put != nil { + updateRPCInfoInContext(ctx, rpcInfo{bytesSent: false, bytesReceived: false}) put() } return nil, nil, errConnClosing @@ -554,6 +708,7 @@ func (cc *ClientConn) getTransport(ctx context.Context, opts BalancerGetOptions) t, err := ac.wait(ctx, cc.dopts.balancer != nil, !opts.BlockingWait) if err != nil { if put != nil { + updateRPCInfoInContext(ctx, rpcInfo{bytesSent: false, bytesReceived: false}) put() } return nil, nil, err @@ -605,6 +760,20 @@ type addrConn struct { tearDownErr error } +// adjustParams updates parameters used to create transports upon +// receiving a GoAway. +func (ac *addrConn) adjustParams(r transport.GoAwayReason) { + switch r { + case transport.TooManyPings: + v := 2 * ac.dopts.copts.KeepaliveParams.Time + ac.cc.mu.Lock() + if v > ac.cc.mkp.Time { + ac.cc.mkp.Time = v + } + ac.cc.mu.Unlock() + } +} + // printf records an event in ac's event log, unless ac has been closed. // REQUIRES ac.mu is held. func (ac *addrConn) printf(format string, a ...interface{}) { @@ -657,26 +826,44 @@ func (ac *addrConn) waitForStateChange(ctx context.Context, sourceState Connecti return ac.state, nil } -func (ac *addrConn) resetTransport(closeTransport bool) error { +// resetTransport recreates a transport to the address for ac. +// For the old transport: +// - if drain is true, it will be gracefully closed. +// - otherwise, it will be closed. +func (ac *addrConn) resetTransport(drain bool) error { + ac.mu.Lock() + if ac.state == Shutdown { + ac.mu.Unlock() + return errConnClosing + } + ac.printf("connecting") + if ac.down != nil { + ac.down(downErrorf(false, true, "%v", errNetworkIO)) + ac.down = nil + } + ac.state = Connecting + ac.stateCV.Broadcast() + t := ac.transport + ac.transport = nil + ac.mu.Unlock() + if t != nil { + if drain { + t.GracefulClose() + } else { + t.Close() + } + } + ac.cc.mu.RLock() + ac.dopts.copts.KeepaliveParams = ac.cc.mkp + ac.cc.mu.RUnlock() for retries := 0; ; retries++ { ac.mu.Lock() - ac.printf("connecting") if ac.state == Shutdown { // ac.tearDown(...) has been invoked. ac.mu.Unlock() return errConnClosing } - if ac.down != nil { - ac.down(downErrorf(false, true, "%v", errNetworkIO)) - ac.down = nil - } - ac.state = Connecting - ac.stateCV.Broadcast() - t := ac.transport ac.mu.Unlock() - if closeTransport && t != nil { - t.Close() - } sleepTime := ac.dopts.bs.backoff(retries) timeout := minConnectTimeout if timeout < sleepTime { @@ -689,13 +876,15 @@ func (ac *addrConn) resetTransport(closeTransport bool) error { Metadata: ac.addr.Metadata, } newTransport, err := transport.NewClientTransport(ctx, sinfo, ac.dopts.copts) + // Don't call cancel in success path due to a race in Go 1.6: + // https://github.com/golang/go/issues/15078. if err != nil { cancel() if e, ok := err.(transport.ConnectionError); ok && !e.Temporary() { return err } - grpclog.Printf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %v", err, ac.addr) + grpclog.Warningf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %v", err, ac.addr) ac.mu.Lock() if ac.state == Shutdown { // ac.tearDown(...) has been invoked. @@ -710,12 +899,14 @@ func (ac *addrConn) resetTransport(closeTransport bool) error { ac.ready = nil } ac.mu.Unlock() - closeTransport = false + timer := time.NewTimer(sleepTime - time.Since(connectTime)) select { - case <-time.After(sleepTime - time.Since(connectTime)): + case <-timer.C: case <-ac.ctx.Done(): + timer.Stop() return ac.ctx.Err() } + timer.Stop() continue } ac.mu.Lock() @@ -759,27 +950,41 @@ func (ac *addrConn) transportMonitor() { } return case <-t.GoAway(): - // If GoAway happens without any network I/O error, ac is closed without shutting down the - // underlying transport (the transport will be closed when all the pending RPCs finished or - // failed.). - // If GoAway and some network I/O error happen concurrently, ac and its underlying transport - // are closed. - // In both cases, a new ac is created. + ac.adjustParams(t.GetGoAwayReason()) + // If GoAway happens without any network I/O error, the underlying transport + // will be gracefully closed, and a new transport will be created. + // (The transport will be closed when all the pending RPCs finished or failed.) + // If GoAway and some network I/O error happen concurrently, the underlying transport + // will be closed, and a new transport will be created. + var drain bool select { case <-t.Error(): - ac.cc.resetAddrConn(ac.addr, true, errNetworkIO) default: - ac.cc.resetAddrConn(ac.addr, true, errConnDrain) + drain = true + } + if err := ac.resetTransport(drain); err != nil { + grpclog.Infof("get error from resetTransport %v, transportMonitor returning", err) + if err != errConnClosing { + // Keep this ac in cc.conns, to get the reason it's torn down. + ac.tearDown(err) + } + return } - return case <-t.Error(): select { case <-ac.ctx.Done(): t.Close() return case <-t.GoAway(): - ac.cc.resetAddrConn(ac.addr, true, errNetworkIO) - return + ac.adjustParams(t.GetGoAwayReason()) + if err := ac.resetTransport(false); err != nil { + grpclog.Infof("get error from resetTransport %v, transportMonitor returning", err) + if err != errConnClosing { + // Keep this ac in cc.conns, to get the reason it's torn down. + ac.tearDown(err) + } + return + } default: } ac.mu.Lock() @@ -791,11 +996,12 @@ func (ac *addrConn) transportMonitor() { ac.state = TransientFailure ac.stateCV.Broadcast() ac.mu.Unlock() - if err := ac.resetTransport(true); err != nil { + if err := ac.resetTransport(false); err != nil { + grpclog.Infof("get error from resetTransport %v, transportMonitor returning", err) ac.mu.Lock() ac.printf("transport exiting: %v", err) ac.mu.Unlock() - grpclog.Printf("grpc: addrConn.transportMonitor exits due to: %v", err) + grpclog.Warningf("grpc: addrConn.transportMonitor exits due to: %v", err) if err != errConnClosing { // Keep this ac in cc.conns, to get the reason it's torn down. ac.tearDown(err) diff --git a/vendor/google.golang.org/grpc/codec.go b/vendor/google.golang.org/grpc/codec.go new file mode 100644 index 0000000000000..905b048e2ac58 --- /dev/null +++ b/vendor/google.golang.org/grpc/codec.go @@ -0,0 +1,104 @@ +/* + * + * Copyright 2014 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "math" + "sync" + + "github.com/golang/protobuf/proto" +) + +// Codec defines the interface gRPC uses to encode and decode messages. +// Note that implementations of this interface must be thread safe; +// a Codec's methods can be called from concurrent goroutines. +type Codec interface { + // Marshal returns the wire format of v. + Marshal(v interface{}) ([]byte, error) + // Unmarshal parses the wire format into v. + Unmarshal(data []byte, v interface{}) error + // String returns the name of the Codec implementation. The returned + // string will be used as part of content type in transmission. + String() string +} + +// protoCodec is a Codec implementation with protobuf. It is the default codec for gRPC. +type protoCodec struct { +} + +type cachedProtoBuffer struct { + lastMarshaledSize uint32 + proto.Buffer +} + +func capToMaxInt32(val int) uint32 { + if val > math.MaxInt32 { + return uint32(math.MaxInt32) + } + return uint32(val) +} + +func (p protoCodec) marshal(v interface{}, cb *cachedProtoBuffer) ([]byte, error) { + protoMsg := v.(proto.Message) + newSlice := make([]byte, 0, cb.lastMarshaledSize) + + cb.SetBuf(newSlice) + cb.Reset() + if err := cb.Marshal(protoMsg); err != nil { + return nil, err + } + out := cb.Bytes() + cb.lastMarshaledSize = capToMaxInt32(len(out)) + return out, nil +} + +func (p protoCodec) Marshal(v interface{}) ([]byte, error) { + cb := protoBufferPool.Get().(*cachedProtoBuffer) + out, err := p.marshal(v, cb) + + // put back buffer and lose the ref to the slice + cb.SetBuf(nil) + protoBufferPool.Put(cb) + return out, err +} + +func (p protoCodec) Unmarshal(data []byte, v interface{}) error { + cb := protoBufferPool.Get().(*cachedProtoBuffer) + cb.SetBuf(data) + v.(proto.Message).Reset() + err := cb.Unmarshal(v.(proto.Message)) + cb.SetBuf(nil) + protoBufferPool.Put(cb) + return err +} + +func (protoCodec) String() string { + return "proto" +} + +var ( + protoBufferPool = &sync.Pool{ + New: func() interface{} { + return &cachedProtoBuffer{ + Buffer: proto.Buffer{}, + lastMarshaledSize: 16, + } + }, + } +) diff --git a/vendor/google.golang.org/grpc/codegen.sh b/vendor/google.golang.org/grpc/codegen.sh index b00948884295e..4cdc6ba7c0909 100755 --- a/vendor/google.golang.org/grpc/codegen.sh +++ b/vendor/google.golang.org/grpc/codegen.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # This script serves as an example to demonstrate how to generate the gRPC-Go # interface and the related messages from .proto file. diff --git a/vendor/google.golang.org/grpc/codes/codes.go b/vendor/google.golang.org/grpc/codes/codes.go index 37c5b860bd6d5..81fe7bf85b39a 100644 --- a/vendor/google.golang.org/grpc/codes/codes.go +++ b/vendor/google.golang.org/grpc/codes/codes.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -44,7 +29,7 @@ const ( // OK is returned on success. OK Code = 0 - // Canceled indicates the operation was cancelled (typically by the caller). + // Canceled indicates the operation was canceled (typically by the caller). Canceled Code = 1 // Unknown error. An example of where this error may be returned is diff --git a/vendor/google.golang.org/grpc/coverage.sh b/vendor/google.golang.org/grpc/coverage.sh index 120235374a422..b85f9181dee9d 100755 --- a/vendor/google.golang.org/grpc/coverage.sh +++ b/vendor/google.golang.org/grpc/coverage.sh @@ -1,4 +1,5 @@ -#!/bin/bash +#!/usr/bin/env bash + set -e diff --git a/vendor/google.golang.org/grpc/credentials/BUILD b/vendor/google.golang.org/grpc/credentials/BUILD index f64933d442b85..e2db54fc98c94 100644 --- a/vendor/google.golang.org/grpc/credentials/BUILD +++ b/vendor/google.golang.org/grpc/credentials/BUILD @@ -5,6 +5,7 @@ go_library( srcs = [ "credentials.go", "credentials_util_go17.go", + "credentials_util_go18.go", "credentials_util_pre_go17.go", ], visibility = ["//visibility:public"], diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go index 4154f1eeba9aa..1ccbaff77a600 100644 --- a/vendor/google.golang.org/grpc/credentials/credentials.go +++ b/vendor/google.golang.org/grpc/credentials/credentials.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -102,6 +87,10 @@ type TransportCredentials interface { // authentication protocol on rawConn for clients. It returns the authenticated // connection and the corresponding auth information about the connection. // Implementations must use the provided context to implement timely cancellation. + // gRPC will try to reconnect if the error returned is a temporary error + // (io.EOF, context.DeadlineExceeded or err.Temporary() == true). + // If the returned error is a wrapper error, implementations should make sure that + // the error implements Temporary() to have the correct retry behaviors. ClientHandshake(context.Context, string, net.Conn) (net.Conn, AuthInfo, error) // ServerHandshake does the authentication handshake for servers. It returns // the authenticated connection and the corresponding auth information about @@ -165,9 +154,7 @@ func (c *tlsCreds) ClientHandshake(ctx context.Context, addr string, rawConn net case <-ctx.Done(): return nil, nil, ctx.Err() } - // TODO(zhaoq): Omit the auth info for client now. It is more for - // information than anything else. - return conn, nil, nil + return conn, TLSInfo{conn.ConnectionState()}, nil } func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) { @@ -194,14 +181,14 @@ func NewTLS(c *tls.Config) TransportCredentials { return tc } -// NewClientTLSFromCert constructs a TLS from the input certificate for client. +// NewClientTLSFromCert constructs TLS credentials from the input certificate for client. // serverNameOverride is for testing only. If set to a non empty string, // it will override the virtual host name of authority (e.g. :authority header field) in requests. func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) TransportCredentials { return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}) } -// NewClientTLSFromFile constructs a TLS from the input certificate file for client. +// NewClientTLSFromFile constructs TLS credentials from the input certificate file for client. // serverNameOverride is for testing only. If set to a non empty string, // it will override the virtual host name of authority (e.g. :authority header field) in requests. func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error) { @@ -216,12 +203,12 @@ func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredent return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}), nil } -// NewServerTLSFromCert constructs a TLS from the input certificate for server. +// NewServerTLSFromCert constructs TLS credentials from the input certificate for server. func NewServerTLSFromCert(cert *tls.Certificate) TransportCredentials { return NewTLS(&tls.Config{Certificates: []tls.Certificate{*cert}}) } -// NewServerTLSFromFile constructs a TLS from the input certificate file and key +// NewServerTLSFromFile constructs TLS credentials from the input certificate file and key // file for server. func NewServerTLSFromFile(certFile, keyFile string) (TransportCredentials, error) { cert, err := tls.LoadX509KeyPair(certFile, keyFile) diff --git a/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go b/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go index 9647b9ec83aec..60409aac0fbc6 100644 --- a/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go +++ b/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go @@ -1,35 +1,21 @@ // +build go1.7 +// +build !go1.8 /* * - * Copyright 2016, Google Inc. - * All rights reserved. + * Copyright 2016 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -44,8 +30,6 @@ import ( // contains a mutex and must not be copied. // // If cfg is nil, a new zero tls.Config is returned. -// -// TODO replace this function with official clone function. func cloneTLSConfig(cfg *tls.Config) *tls.Config { if cfg == nil { return &tls.Config{} diff --git a/vendor/google.golang.org/grpc/credentials/credentials_util_go18.go b/vendor/google.golang.org/grpc/credentials/credentials_util_go18.go new file mode 100644 index 0000000000000..93f0e1d8de23a --- /dev/null +++ b/vendor/google.golang.org/grpc/credentials/credentials_util_go18.go @@ -0,0 +1,38 @@ +// +build go1.8 + +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package credentials + +import ( + "crypto/tls" +) + +// cloneTLSConfig returns a shallow clone of the exported +// fields of cfg, ignoring the unexported sync.Once, which +// contains a mutex and must not be copied. +// +// If cfg is nil, a new zero tls.Config is returned. +func cloneTLSConfig(cfg *tls.Config) *tls.Config { + if cfg == nil { + return &tls.Config{} + } + + return cfg.Clone() +} diff --git a/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go b/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go index 09b8d12c79b78..d6bbcc9fdd95d 100644 --- a/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go +++ b/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go @@ -2,34 +2,19 @@ /* * - * Copyright 2016, Google Inc. - * All rights reserved. + * Copyright 2016 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -44,8 +29,6 @@ import ( // contains a mutex and must not be copied. // // If cfg is nil, a new zero tls.Config is returned. -// -// TODO replace this function with official clone function. func cloneTLSConfig(cfg *tls.Config) *tls.Config { if cfg == nil { return &tls.Config{} diff --git a/vendor/google.golang.org/grpc/doc.go b/vendor/google.golang.org/grpc/doc.go index b4c0e740e9c7b..9221fd2188ad1 100644 --- a/vendor/google.golang.org/grpc/doc.go +++ b/vendor/google.golang.org/grpc/doc.go @@ -1,6 +1,6 @@ /* Package grpc implements an RPC system called gRPC. -See www.grpc.io for more information about gRPC. +See grpc.io for more information about gRPC. */ package grpc diff --git a/vendor/google.golang.org/grpc/go16.go b/vendor/google.golang.org/grpc/go16.go new file mode 100644 index 0000000000000..f3dbf21700fd5 --- /dev/null +++ b/vendor/google.golang.org/grpc/go16.go @@ -0,0 +1,98 @@ +// +build go1.6,!go1.7 + +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "fmt" + "io" + "net" + "net/http" + "os" + + "golang.org/x/net/context" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/grpc/transport" +) + +// dialContext connects to the address on the named network. +func dialContext(ctx context.Context, network, address string) (net.Conn, error) { + return (&net.Dialer{Cancel: ctx.Done()}).Dial(network, address) +} + +func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error { + req.Cancel = ctx.Done() + if err := req.Write(conn); err != nil { + return fmt.Errorf("failed to write the HTTP request: %v", err) + } + return nil +} + +// toRPCErr converts an error into an error from the status package. +func toRPCErr(err error) error { + if _, ok := status.FromError(err); ok { + return err + } + switch e := err.(type) { + case transport.StreamError: + return status.Error(e.Code, e.Desc) + case transport.ConnectionError: + return status.Error(codes.Unavailable, e.Desc) + default: + switch err { + case context.DeadlineExceeded: + return status.Error(codes.DeadlineExceeded, err.Error()) + case context.Canceled: + return status.Error(codes.Canceled, err.Error()) + case ErrClientConnClosing: + return status.Error(codes.FailedPrecondition, err.Error()) + } + } + return status.Error(codes.Unknown, err.Error()) +} + +// convertCode converts a standard Go error into its canonical code. Note that +// this is only used to translate the error returned by the server applications. +func convertCode(err error) codes.Code { + switch err { + case nil: + return codes.OK + case io.EOF: + return codes.OutOfRange + case io.ErrClosedPipe, io.ErrNoProgress, io.ErrShortBuffer, io.ErrShortWrite, io.ErrUnexpectedEOF: + return codes.FailedPrecondition + case os.ErrInvalid: + return codes.InvalidArgument + case context.Canceled: + return codes.Canceled + case context.DeadlineExceeded: + return codes.DeadlineExceeded + } + switch { + case os.IsExist(err): + return codes.AlreadyExists + case os.IsNotExist(err): + return codes.NotFound + case os.IsPermission(err): + return codes.PermissionDenied + } + return codes.Unknown +} diff --git a/vendor/google.golang.org/grpc/go17.go b/vendor/google.golang.org/grpc/go17.go new file mode 100644 index 0000000000000..a3421d99eb488 --- /dev/null +++ b/vendor/google.golang.org/grpc/go17.go @@ -0,0 +1,98 @@ +// +build go1.7 + +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "context" + "io" + "net" + "net/http" + "os" + + netctx "golang.org/x/net/context" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/grpc/transport" +) + +// dialContext connects to the address on the named network. +func dialContext(ctx context.Context, network, address string) (net.Conn, error) { + return (&net.Dialer{}).DialContext(ctx, network, address) +} + +func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error { + req = req.WithContext(ctx) + if err := req.Write(conn); err != nil { + return err + } + return nil +} + +// toRPCErr converts an error into an error from the status package. +func toRPCErr(err error) error { + if _, ok := status.FromError(err); ok { + return err + } + switch e := err.(type) { + case transport.StreamError: + return status.Error(e.Code, e.Desc) + case transport.ConnectionError: + return status.Error(codes.Unavailable, e.Desc) + default: + switch err { + case context.DeadlineExceeded, netctx.DeadlineExceeded: + return status.Error(codes.DeadlineExceeded, err.Error()) + case context.Canceled, netctx.Canceled: + return status.Error(codes.Canceled, err.Error()) + case ErrClientConnClosing: + return status.Error(codes.FailedPrecondition, err.Error()) + } + } + return status.Error(codes.Unknown, err.Error()) +} + +// convertCode converts a standard Go error into its canonical code. Note that +// this is only used to translate the error returned by the server applications. +func convertCode(err error) codes.Code { + switch err { + case nil: + return codes.OK + case io.EOF: + return codes.OutOfRange + case io.ErrClosedPipe, io.ErrNoProgress, io.ErrShortBuffer, io.ErrShortWrite, io.ErrUnexpectedEOF: + return codes.FailedPrecondition + case os.ErrInvalid: + return codes.InvalidArgument + case context.Canceled, netctx.Canceled: + return codes.Canceled + case context.DeadlineExceeded, netctx.DeadlineExceeded: + return codes.DeadlineExceeded + } + switch { + case os.IsExist(err): + return codes.AlreadyExists + case os.IsNotExist(err): + return codes.NotFound + case os.IsPermission(err): + return codes.PermissionDenied + } + return codes.Unknown +} diff --git a/vendor/google.golang.org/grpc/grpclb.go b/vendor/google.golang.org/grpc/grpclb.go new file mode 100644 index 0000000000000..619985e608247 --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclb.go @@ -0,0 +1,757 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "errors" + "fmt" + "math/rand" + "net" + "sync" + "time" + + "golang.org/x/net/context" + "google.golang.org/grpc/codes" + lbpb "google.golang.org/grpc/grpclb/grpc_lb_v1" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/naming" +) + +// Client API for LoadBalancer service. +// Mostly copied from generated pb.go file. +// To avoid circular dependency. +type loadBalancerClient struct { + cc *ClientConn +} + +func (c *loadBalancerClient) BalanceLoad(ctx context.Context, opts ...CallOption) (*balanceLoadClientStream, error) { + desc := &StreamDesc{ + StreamName: "BalanceLoad", + ServerStreams: true, + ClientStreams: true, + } + stream, err := NewClientStream(ctx, desc, c.cc, "/grpc.lb.v1.LoadBalancer/BalanceLoad", opts...) + if err != nil { + return nil, err + } + x := &balanceLoadClientStream{stream} + return x, nil +} + +type balanceLoadClientStream struct { + ClientStream +} + +func (x *balanceLoadClientStream) Send(m *lbpb.LoadBalanceRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *balanceLoadClientStream) Recv() (*lbpb.LoadBalanceResponse, error) { + m := new(lbpb.LoadBalanceResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// AddressType indicates the address type returned by name resolution. +type AddressType uint8 + +const ( + // Backend indicates the server is a backend server. + Backend AddressType = iota + // GRPCLB indicates the server is a grpclb load balancer. + GRPCLB +) + +// AddrMetadataGRPCLB contains the information the name resolver for grpclb should provide. The +// name resolver used by the grpclb balancer is required to provide this type of metadata in +// its address updates. +type AddrMetadataGRPCLB struct { + // AddrType is the type of server (grpc load balancer or backend). + AddrType AddressType + // ServerName is the name of the grpc load balancer. Used for authentication. + ServerName string +} + +// NewGRPCLBBalancer creates a grpclb load balancer. +func NewGRPCLBBalancer(r naming.Resolver) Balancer { + return &balancer{ + r: r, + } +} + +type remoteBalancerInfo struct { + addr string + // the server name used for authentication with the remote LB server. + name string +} + +// grpclbAddrInfo consists of the information of a backend server. +type grpclbAddrInfo struct { + addr Address + connected bool + // dropForRateLimiting indicates whether this particular request should be + // dropped by the client for rate limiting. + dropForRateLimiting bool + // dropForLoadBalancing indicates whether this particular request should be + // dropped by the client for load balancing. + dropForLoadBalancing bool +} + +type balancer struct { + r naming.Resolver + target string + mu sync.Mutex + seq int // a sequence number to make sure addrCh does not get stale addresses. + w naming.Watcher + addrCh chan []Address + rbs []remoteBalancerInfo + addrs []*grpclbAddrInfo + next int + waitCh chan struct{} + done bool + expTimer *time.Timer + rand *rand.Rand + + clientStats lbpb.ClientStats +} + +func (b *balancer) watchAddrUpdates(w naming.Watcher, ch chan []remoteBalancerInfo) error { + updates, err := w.Next() + if err != nil { + grpclog.Warningf("grpclb: failed to get next addr update from watcher: %v", err) + return err + } + b.mu.Lock() + defer b.mu.Unlock() + if b.done { + return ErrClientConnClosing + } + for _, update := range updates { + switch update.Op { + case naming.Add: + var exist bool + for _, v := range b.rbs { + // TODO: Is the same addr with different server name a different balancer? + if update.Addr == v.addr { + exist = true + break + } + } + if exist { + continue + } + md, ok := update.Metadata.(*AddrMetadataGRPCLB) + if !ok { + // TODO: Revisit the handling here and may introduce some fallback mechanism. + grpclog.Errorf("The name resolution contains unexpected metadata %v", update.Metadata) + continue + } + switch md.AddrType { + case Backend: + // TODO: Revisit the handling here and may introduce some fallback mechanism. + grpclog.Errorf("The name resolution does not give grpclb addresses") + continue + case GRPCLB: + b.rbs = append(b.rbs, remoteBalancerInfo{ + addr: update.Addr, + name: md.ServerName, + }) + default: + grpclog.Errorf("Received unknow address type %d", md.AddrType) + continue + } + case naming.Delete: + for i, v := range b.rbs { + if update.Addr == v.addr { + copy(b.rbs[i:], b.rbs[i+1:]) + b.rbs = b.rbs[:len(b.rbs)-1] + break + } + } + default: + grpclog.Errorf("Unknown update.Op %v", update.Op) + } + } + // TODO: Fall back to the basic round-robin load balancing if the resulting address is + // not a load balancer. + select { + case <-ch: + default: + } + ch <- b.rbs + return nil +} + +func (b *balancer) serverListExpire(seq int) { + b.mu.Lock() + defer b.mu.Unlock() + // TODO: gRPC interanls do not clear the connections when the server list is stale. + // This means RPCs will keep using the existing server list until b receives new + // server list even though the list is expired. Revisit this behavior later. + if b.done || seq < b.seq { + return + } + b.next = 0 + b.addrs = nil + // Ask grpc internals to close all the corresponding connections. + b.addrCh <- nil +} + +func convertDuration(d *lbpb.Duration) time.Duration { + if d == nil { + return 0 + } + return time.Duration(d.Seconds)*time.Second + time.Duration(d.Nanos)*time.Nanosecond +} + +func (b *balancer) processServerList(l *lbpb.ServerList, seq int) { + if l == nil { + return + } + servers := l.GetServers() + expiration := convertDuration(l.GetExpirationInterval()) + var ( + sl []*grpclbAddrInfo + addrs []Address + ) + for _, s := range servers { + md := metadata.Pairs("lb-token", s.LoadBalanceToken) + ip := net.IP(s.IpAddress) + ipStr := ip.String() + if ip.To4() == nil { + // Add square brackets to ipv6 addresses, otherwise net.Dial() and + // net.SplitHostPort() will return too many colons error. + ipStr = fmt.Sprintf("[%s]", ipStr) + } + addr := Address{ + Addr: fmt.Sprintf("%s:%d", ipStr, s.Port), + Metadata: &md, + } + sl = append(sl, &grpclbAddrInfo{ + addr: addr, + dropForRateLimiting: s.DropForRateLimiting, + dropForLoadBalancing: s.DropForLoadBalancing, + }) + addrs = append(addrs, addr) + } + b.mu.Lock() + defer b.mu.Unlock() + if b.done || seq < b.seq { + return + } + if len(sl) > 0 { + // reset b.next to 0 when replacing the server list. + b.next = 0 + b.addrs = sl + b.addrCh <- addrs + if b.expTimer != nil { + b.expTimer.Stop() + b.expTimer = nil + } + if expiration > 0 { + b.expTimer = time.AfterFunc(expiration, func() { + b.serverListExpire(seq) + }) + } + } + return +} + +func (b *balancer) sendLoadReport(s *balanceLoadClientStream, interval time.Duration, done <-chan struct{}) { + ticker := time.NewTicker(interval) + defer ticker.Stop() + for { + select { + case <-ticker.C: + case <-done: + return + } + b.mu.Lock() + stats := b.clientStats + b.clientStats = lbpb.ClientStats{} // Clear the stats. + b.mu.Unlock() + t := time.Now() + stats.Timestamp = &lbpb.Timestamp{ + Seconds: t.Unix(), + Nanos: int32(t.Nanosecond()), + } + if err := s.Send(&lbpb.LoadBalanceRequest{ + LoadBalanceRequestType: &lbpb.LoadBalanceRequest_ClientStats{ + ClientStats: &stats, + }, + }); err != nil { + grpclog.Errorf("grpclb: failed to send load report: %v", err) + return + } + } +} + +func (b *balancer) callRemoteBalancer(lbc *loadBalancerClient, seq int) (retry bool) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + stream, err := lbc.BalanceLoad(ctx) + if err != nil { + grpclog.Errorf("grpclb: failed to perform RPC to the remote balancer %v", err) + return + } + b.mu.Lock() + if b.done { + b.mu.Unlock() + return + } + b.mu.Unlock() + initReq := &lbpb.LoadBalanceRequest{ + LoadBalanceRequestType: &lbpb.LoadBalanceRequest_InitialRequest{ + InitialRequest: &lbpb.InitialLoadBalanceRequest{ + Name: b.target, + }, + }, + } + if err := stream.Send(initReq); err != nil { + grpclog.Errorf("grpclb: failed to send init request: %v", err) + // TODO: backoff on retry? + return true + } + reply, err := stream.Recv() + if err != nil { + grpclog.Errorf("grpclb: failed to recv init response: %v", err) + // TODO: backoff on retry? + return true + } + initResp := reply.GetInitialResponse() + if initResp == nil { + grpclog.Errorf("grpclb: reply from remote balancer did not include initial response.") + return + } + // TODO: Support delegation. + if initResp.LoadBalancerDelegate != "" { + // delegation + grpclog.Errorf("TODO: Delegation is not supported yet.") + return + } + streamDone := make(chan struct{}) + defer close(streamDone) + b.mu.Lock() + b.clientStats = lbpb.ClientStats{} // Clear client stats. + b.mu.Unlock() + if d := convertDuration(initResp.ClientStatsReportInterval); d > 0 { + go b.sendLoadReport(stream, d, streamDone) + } + // Retrieve the server list. + for { + reply, err := stream.Recv() + if err != nil { + grpclog.Errorf("grpclb: failed to recv server list: %v", err) + break + } + b.mu.Lock() + if b.done || seq < b.seq { + b.mu.Unlock() + return + } + b.seq++ // tick when receiving a new list of servers. + seq = b.seq + b.mu.Unlock() + if serverList := reply.GetServerList(); serverList != nil { + b.processServerList(serverList, seq) + } + } + return true +} + +func (b *balancer) Start(target string, config BalancerConfig) error { + b.rand = rand.New(rand.NewSource(time.Now().Unix())) + // TODO: Fall back to the basic direct connection if there is no name resolver. + if b.r == nil { + return errors.New("there is no name resolver installed") + } + b.target = target + b.mu.Lock() + if b.done { + b.mu.Unlock() + return ErrClientConnClosing + } + b.addrCh = make(chan []Address) + w, err := b.r.Resolve(target) + if err != nil { + b.mu.Unlock() + grpclog.Errorf("grpclb: failed to resolve address: %v, err: %v", target, err) + return err + } + b.w = w + b.mu.Unlock() + balancerAddrsCh := make(chan []remoteBalancerInfo, 1) + // Spawn a goroutine to monitor the name resolution of remote load balancer. + go func() { + for { + if err := b.watchAddrUpdates(w, balancerAddrsCh); err != nil { + grpclog.Warningf("grpclb: the naming watcher stops working due to %v.\n", err) + close(balancerAddrsCh) + return + } + } + }() + // Spawn a goroutine to talk to the remote load balancer. + go func() { + var ( + cc *ClientConn + // ccError is closed when there is an error in the current cc. + // A new rb should be picked from rbs and connected. + ccError chan struct{} + rb *remoteBalancerInfo + rbs []remoteBalancerInfo + rbIdx int + ) + + defer func() { + if ccError != nil { + select { + case <-ccError: + default: + close(ccError) + } + } + if cc != nil { + cc.Close() + } + }() + + for { + var ok bool + select { + case rbs, ok = <-balancerAddrsCh: + if !ok { + return + } + foundIdx := -1 + if rb != nil { + for i, trb := range rbs { + if trb == *rb { + foundIdx = i + break + } + } + } + if foundIdx >= 0 { + if foundIdx >= 1 { + // Move the address in use to the beginning of the list. + b.rbs[0], b.rbs[foundIdx] = b.rbs[foundIdx], b.rbs[0] + rbIdx = 0 + } + continue // If found, don't dial new cc. + } else if len(rbs) > 0 { + // Pick a random one from the list, instead of always using the first one. + if l := len(rbs); l > 1 && rb != nil { + tmpIdx := b.rand.Intn(l - 1) + b.rbs[0], b.rbs[tmpIdx] = b.rbs[tmpIdx], b.rbs[0] + } + rbIdx = 0 + rb = &rbs[0] + } else { + // foundIdx < 0 && len(rbs) <= 0. + rb = nil + } + case <-ccError: + ccError = nil + if rbIdx < len(rbs)-1 { + rbIdx++ + rb = &rbs[rbIdx] + } else { + rb = nil + } + } + + if rb == nil { + continue + } + + if cc != nil { + cc.Close() + } + // Talk to the remote load balancer to get the server list. + var ( + err error + dopts []DialOption + ) + if creds := config.DialCreds; creds != nil { + if rb.name != "" { + if err := creds.OverrideServerName(rb.name); err != nil { + grpclog.Warningf("grpclb: failed to override the server name in the credentials: %v", err) + continue + } + } + dopts = append(dopts, WithTransportCredentials(creds)) + } else { + dopts = append(dopts, WithInsecure()) + } + if dialer := config.Dialer; dialer != nil { + // WithDialer takes a different type of function, so we instead use a special DialOption here. + dopts = append(dopts, func(o *dialOptions) { o.copts.Dialer = dialer }) + } + ccError = make(chan struct{}) + cc, err = Dial(rb.addr, dopts...) + if err != nil { + grpclog.Warningf("grpclb: failed to setup a connection to the remote balancer %v: %v", rb.addr, err) + close(ccError) + continue + } + b.mu.Lock() + b.seq++ // tick when getting a new balancer address + seq := b.seq + b.next = 0 + b.mu.Unlock() + go func(cc *ClientConn, ccError chan struct{}) { + lbc := &loadBalancerClient{cc} + b.callRemoteBalancer(lbc, seq) + cc.Close() + select { + case <-ccError: + default: + close(ccError) + } + }(cc, ccError) + } + }() + return nil +} + +func (b *balancer) down(addr Address, err error) { + b.mu.Lock() + defer b.mu.Unlock() + for _, a := range b.addrs { + if addr == a.addr { + a.connected = false + break + } + } +} + +func (b *balancer) Up(addr Address) func(error) { + b.mu.Lock() + defer b.mu.Unlock() + if b.done { + return nil + } + var cnt int + for _, a := range b.addrs { + if a.addr == addr { + if a.connected { + return nil + } + a.connected = true + } + if a.connected && !a.dropForRateLimiting && !a.dropForLoadBalancing { + cnt++ + } + } + // addr is the only one which is connected. Notify the Get() callers who are blocking. + if cnt == 1 && b.waitCh != nil { + close(b.waitCh) + b.waitCh = nil + } + return func(err error) { + b.down(addr, err) + } +} + +func (b *balancer) Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) { + var ch chan struct{} + b.mu.Lock() + if b.done { + b.mu.Unlock() + err = ErrClientConnClosing + return + } + seq := b.seq + + defer func() { + if err != nil { + return + } + put = func() { + s, ok := rpcInfoFromContext(ctx) + if !ok { + return + } + b.mu.Lock() + defer b.mu.Unlock() + if b.done || seq < b.seq { + return + } + b.clientStats.NumCallsFinished++ + if !s.bytesSent { + b.clientStats.NumCallsFinishedWithClientFailedToSend++ + } else if s.bytesReceived { + b.clientStats.NumCallsFinishedKnownReceived++ + } + } + }() + + b.clientStats.NumCallsStarted++ + if len(b.addrs) > 0 { + if b.next >= len(b.addrs) { + b.next = 0 + } + next := b.next + for { + a := b.addrs[next] + next = (next + 1) % len(b.addrs) + if a.connected { + if !a.dropForRateLimiting && !a.dropForLoadBalancing { + addr = a.addr + b.next = next + b.mu.Unlock() + return + } + if !opts.BlockingWait { + b.next = next + if a.dropForLoadBalancing { + b.clientStats.NumCallsFinished++ + b.clientStats.NumCallsFinishedWithDropForLoadBalancing++ + } else if a.dropForRateLimiting { + b.clientStats.NumCallsFinished++ + b.clientStats.NumCallsFinishedWithDropForRateLimiting++ + } + b.mu.Unlock() + err = Errorf(codes.Unavailable, "%s drops requests", a.addr.Addr) + return + } + } + if next == b.next { + // Has iterated all the possible address but none is connected. + break + } + } + } + if !opts.BlockingWait { + if len(b.addrs) == 0 { + b.clientStats.NumCallsFinished++ + b.clientStats.NumCallsFinishedWithClientFailedToSend++ + b.mu.Unlock() + err = Errorf(codes.Unavailable, "there is no address available") + return + } + // Returns the next addr on b.addrs for a failfast RPC. + addr = b.addrs[b.next].addr + b.next++ + b.mu.Unlock() + return + } + // Wait on b.waitCh for non-failfast RPCs. + if b.waitCh == nil { + ch = make(chan struct{}) + b.waitCh = ch + } else { + ch = b.waitCh + } + b.mu.Unlock() + for { + select { + case <-ctx.Done(): + b.mu.Lock() + b.clientStats.NumCallsFinished++ + b.clientStats.NumCallsFinishedWithClientFailedToSend++ + b.mu.Unlock() + err = ctx.Err() + return + case <-ch: + b.mu.Lock() + if b.done { + b.clientStats.NumCallsFinished++ + b.clientStats.NumCallsFinishedWithClientFailedToSend++ + b.mu.Unlock() + err = ErrClientConnClosing + return + } + + if len(b.addrs) > 0 { + if b.next >= len(b.addrs) { + b.next = 0 + } + next := b.next + for { + a := b.addrs[next] + next = (next + 1) % len(b.addrs) + if a.connected { + if !a.dropForRateLimiting && !a.dropForLoadBalancing { + addr = a.addr + b.next = next + b.mu.Unlock() + return + } + if !opts.BlockingWait { + b.next = next + if a.dropForLoadBalancing { + b.clientStats.NumCallsFinished++ + b.clientStats.NumCallsFinishedWithDropForLoadBalancing++ + } else if a.dropForRateLimiting { + b.clientStats.NumCallsFinished++ + b.clientStats.NumCallsFinishedWithDropForRateLimiting++ + } + b.mu.Unlock() + err = Errorf(codes.Unavailable, "drop requests for the addreess %s", a.addr.Addr) + return + } + } + if next == b.next { + // Has iterated all the possible address but none is connected. + break + } + } + } + // The newly added addr got removed by Down() again. + if b.waitCh == nil { + ch = make(chan struct{}) + b.waitCh = ch + } else { + ch = b.waitCh + } + b.mu.Unlock() + } + } +} + +func (b *balancer) Notify() <-chan []Address { + return b.addrCh +} + +func (b *balancer) Close() error { + b.mu.Lock() + defer b.mu.Unlock() + if b.done { + return errBalancerClosed + } + b.done = true + if b.expTimer != nil { + b.expTimer.Stop() + } + if b.waitCh != nil { + close(b.waitCh) + } + if b.addrCh != nil { + close(b.addrCh) + } + if b.w != nil { + b.w.Close() + } + return nil +} diff --git a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/BUILD b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/BUILD new file mode 100644 index 0000000000000..0a83dd74169cc --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/BUILD @@ -0,0 +1,34 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["grpclb.pb.go"], + tags = ["automanaged"], + deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) + +filegroup( + name = "go_default_library_protos", + srcs = ["grpclb.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.pb.go b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.pb.go new file mode 100644 index 0000000000000..f63941bd803ab --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.pb.go @@ -0,0 +1,629 @@ +// Code generated by protoc-gen-go. +// source: grpclb.proto +// DO NOT EDIT! + +/* +Package grpc_lb_v1 is a generated protocol buffer package. + +It is generated from these files: + grpclb.proto + +It has these top-level messages: + Duration + Timestamp + LoadBalanceRequest + InitialLoadBalanceRequest + ClientStats + LoadBalanceResponse + InitialLoadBalanceResponse + ServerList + Server +*/ +package grpc_lb_v1 + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Duration struct { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. + Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` +} + +func (m *Duration) Reset() { *m = Duration{} } +func (m *Duration) String() string { return proto.CompactTextString(m) } +func (*Duration) ProtoMessage() {} +func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *Duration) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Duration) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +type Timestamp struct { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` +} + +func (m *Timestamp) Reset() { *m = Timestamp{} } +func (m *Timestamp) String() string { return proto.CompactTextString(m) } +func (*Timestamp) ProtoMessage() {} +func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *Timestamp) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Timestamp) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +type LoadBalanceRequest struct { + // Types that are valid to be assigned to LoadBalanceRequestType: + // *LoadBalanceRequest_InitialRequest + // *LoadBalanceRequest_ClientStats + LoadBalanceRequestType isLoadBalanceRequest_LoadBalanceRequestType `protobuf_oneof:"load_balance_request_type"` +} + +func (m *LoadBalanceRequest) Reset() { *m = LoadBalanceRequest{} } +func (m *LoadBalanceRequest) String() string { return proto.CompactTextString(m) } +func (*LoadBalanceRequest) ProtoMessage() {} +func (*LoadBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +type isLoadBalanceRequest_LoadBalanceRequestType interface { + isLoadBalanceRequest_LoadBalanceRequestType() +} + +type LoadBalanceRequest_InitialRequest struct { + InitialRequest *InitialLoadBalanceRequest `protobuf:"bytes,1,opt,name=initial_request,json=initialRequest,oneof"` +} +type LoadBalanceRequest_ClientStats struct { + ClientStats *ClientStats `protobuf:"bytes,2,opt,name=client_stats,json=clientStats,oneof"` +} + +func (*LoadBalanceRequest_InitialRequest) isLoadBalanceRequest_LoadBalanceRequestType() {} +func (*LoadBalanceRequest_ClientStats) isLoadBalanceRequest_LoadBalanceRequestType() {} + +func (m *LoadBalanceRequest) GetLoadBalanceRequestType() isLoadBalanceRequest_LoadBalanceRequestType { + if m != nil { + return m.LoadBalanceRequestType + } + return nil +} + +func (m *LoadBalanceRequest) GetInitialRequest() *InitialLoadBalanceRequest { + if x, ok := m.GetLoadBalanceRequestType().(*LoadBalanceRequest_InitialRequest); ok { + return x.InitialRequest + } + return nil +} + +func (m *LoadBalanceRequest) GetClientStats() *ClientStats { + if x, ok := m.GetLoadBalanceRequestType().(*LoadBalanceRequest_ClientStats); ok { + return x.ClientStats + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*LoadBalanceRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _LoadBalanceRequest_OneofMarshaler, _LoadBalanceRequest_OneofUnmarshaler, _LoadBalanceRequest_OneofSizer, []interface{}{ + (*LoadBalanceRequest_InitialRequest)(nil), + (*LoadBalanceRequest_ClientStats)(nil), + } +} + +func _LoadBalanceRequest_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*LoadBalanceRequest) + // load_balance_request_type + switch x := m.LoadBalanceRequestType.(type) { + case *LoadBalanceRequest_InitialRequest: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.InitialRequest); err != nil { + return err + } + case *LoadBalanceRequest_ClientStats: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ClientStats); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("LoadBalanceRequest.LoadBalanceRequestType has unexpected type %T", x) + } + return nil +} + +func _LoadBalanceRequest_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*LoadBalanceRequest) + switch tag { + case 1: // load_balance_request_type.initial_request + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(InitialLoadBalanceRequest) + err := b.DecodeMessage(msg) + m.LoadBalanceRequestType = &LoadBalanceRequest_InitialRequest{msg} + return true, err + case 2: // load_balance_request_type.client_stats + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ClientStats) + err := b.DecodeMessage(msg) + m.LoadBalanceRequestType = &LoadBalanceRequest_ClientStats{msg} + return true, err + default: + return false, nil + } +} + +func _LoadBalanceRequest_OneofSizer(msg proto.Message) (n int) { + m := msg.(*LoadBalanceRequest) + // load_balance_request_type + switch x := m.LoadBalanceRequestType.(type) { + case *LoadBalanceRequest_InitialRequest: + s := proto.Size(x.InitialRequest) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *LoadBalanceRequest_ClientStats: + s := proto.Size(x.ClientStats) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type InitialLoadBalanceRequest struct { + // Name of load balanced service (IE, balancer.service.com) + // length should be less than 256 bytes. + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` +} + +func (m *InitialLoadBalanceRequest) Reset() { *m = InitialLoadBalanceRequest{} } +func (m *InitialLoadBalanceRequest) String() string { return proto.CompactTextString(m) } +func (*InitialLoadBalanceRequest) ProtoMessage() {} +func (*InitialLoadBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *InitialLoadBalanceRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +// Contains client level statistics that are useful to load balancing. Each +// count except the timestamp should be reset to zero after reporting the stats. +type ClientStats struct { + // The timestamp of generating the report. + Timestamp *Timestamp `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"` + // The total number of RPCs that started. + NumCallsStarted int64 `protobuf:"varint,2,opt,name=num_calls_started,json=numCallsStarted" json:"num_calls_started,omitempty"` + // The total number of RPCs that finished. + NumCallsFinished int64 `protobuf:"varint,3,opt,name=num_calls_finished,json=numCallsFinished" json:"num_calls_finished,omitempty"` + // The total number of RPCs that were dropped by the client because of rate + // limiting. + NumCallsFinishedWithDropForRateLimiting int64 `protobuf:"varint,4,opt,name=num_calls_finished_with_drop_for_rate_limiting,json=numCallsFinishedWithDropForRateLimiting" json:"num_calls_finished_with_drop_for_rate_limiting,omitempty"` + // The total number of RPCs that were dropped by the client because of load + // balancing. + NumCallsFinishedWithDropForLoadBalancing int64 `protobuf:"varint,5,opt,name=num_calls_finished_with_drop_for_load_balancing,json=numCallsFinishedWithDropForLoadBalancing" json:"num_calls_finished_with_drop_for_load_balancing,omitempty"` + // The total number of RPCs that failed to reach a server except dropped RPCs. + NumCallsFinishedWithClientFailedToSend int64 `protobuf:"varint,6,opt,name=num_calls_finished_with_client_failed_to_send,json=numCallsFinishedWithClientFailedToSend" json:"num_calls_finished_with_client_failed_to_send,omitempty"` + // The total number of RPCs that finished and are known to have been received + // by a server. + NumCallsFinishedKnownReceived int64 `protobuf:"varint,7,opt,name=num_calls_finished_known_received,json=numCallsFinishedKnownReceived" json:"num_calls_finished_known_received,omitempty"` +} + +func (m *ClientStats) Reset() { *m = ClientStats{} } +func (m *ClientStats) String() string { return proto.CompactTextString(m) } +func (*ClientStats) ProtoMessage() {} +func (*ClientStats) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *ClientStats) GetTimestamp() *Timestamp { + if m != nil { + return m.Timestamp + } + return nil +} + +func (m *ClientStats) GetNumCallsStarted() int64 { + if m != nil { + return m.NumCallsStarted + } + return 0 +} + +func (m *ClientStats) GetNumCallsFinished() int64 { + if m != nil { + return m.NumCallsFinished + } + return 0 +} + +func (m *ClientStats) GetNumCallsFinishedWithDropForRateLimiting() int64 { + if m != nil { + return m.NumCallsFinishedWithDropForRateLimiting + } + return 0 +} + +func (m *ClientStats) GetNumCallsFinishedWithDropForLoadBalancing() int64 { + if m != nil { + return m.NumCallsFinishedWithDropForLoadBalancing + } + return 0 +} + +func (m *ClientStats) GetNumCallsFinishedWithClientFailedToSend() int64 { + if m != nil { + return m.NumCallsFinishedWithClientFailedToSend + } + return 0 +} + +func (m *ClientStats) GetNumCallsFinishedKnownReceived() int64 { + if m != nil { + return m.NumCallsFinishedKnownReceived + } + return 0 +} + +type LoadBalanceResponse struct { + // Types that are valid to be assigned to LoadBalanceResponseType: + // *LoadBalanceResponse_InitialResponse + // *LoadBalanceResponse_ServerList + LoadBalanceResponseType isLoadBalanceResponse_LoadBalanceResponseType `protobuf_oneof:"load_balance_response_type"` +} + +func (m *LoadBalanceResponse) Reset() { *m = LoadBalanceResponse{} } +func (m *LoadBalanceResponse) String() string { return proto.CompactTextString(m) } +func (*LoadBalanceResponse) ProtoMessage() {} +func (*LoadBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +type isLoadBalanceResponse_LoadBalanceResponseType interface { + isLoadBalanceResponse_LoadBalanceResponseType() +} + +type LoadBalanceResponse_InitialResponse struct { + InitialResponse *InitialLoadBalanceResponse `protobuf:"bytes,1,opt,name=initial_response,json=initialResponse,oneof"` +} +type LoadBalanceResponse_ServerList struct { + ServerList *ServerList `protobuf:"bytes,2,opt,name=server_list,json=serverList,oneof"` +} + +func (*LoadBalanceResponse_InitialResponse) isLoadBalanceResponse_LoadBalanceResponseType() {} +func (*LoadBalanceResponse_ServerList) isLoadBalanceResponse_LoadBalanceResponseType() {} + +func (m *LoadBalanceResponse) GetLoadBalanceResponseType() isLoadBalanceResponse_LoadBalanceResponseType { + if m != nil { + return m.LoadBalanceResponseType + } + return nil +} + +func (m *LoadBalanceResponse) GetInitialResponse() *InitialLoadBalanceResponse { + if x, ok := m.GetLoadBalanceResponseType().(*LoadBalanceResponse_InitialResponse); ok { + return x.InitialResponse + } + return nil +} + +func (m *LoadBalanceResponse) GetServerList() *ServerList { + if x, ok := m.GetLoadBalanceResponseType().(*LoadBalanceResponse_ServerList); ok { + return x.ServerList + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*LoadBalanceResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _LoadBalanceResponse_OneofMarshaler, _LoadBalanceResponse_OneofUnmarshaler, _LoadBalanceResponse_OneofSizer, []interface{}{ + (*LoadBalanceResponse_InitialResponse)(nil), + (*LoadBalanceResponse_ServerList)(nil), + } +} + +func _LoadBalanceResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*LoadBalanceResponse) + // load_balance_response_type + switch x := m.LoadBalanceResponseType.(type) { + case *LoadBalanceResponse_InitialResponse: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.InitialResponse); err != nil { + return err + } + case *LoadBalanceResponse_ServerList: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ServerList); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("LoadBalanceResponse.LoadBalanceResponseType has unexpected type %T", x) + } + return nil +} + +func _LoadBalanceResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*LoadBalanceResponse) + switch tag { + case 1: // load_balance_response_type.initial_response + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(InitialLoadBalanceResponse) + err := b.DecodeMessage(msg) + m.LoadBalanceResponseType = &LoadBalanceResponse_InitialResponse{msg} + return true, err + case 2: // load_balance_response_type.server_list + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(ServerList) + err := b.DecodeMessage(msg) + m.LoadBalanceResponseType = &LoadBalanceResponse_ServerList{msg} + return true, err + default: + return false, nil + } +} + +func _LoadBalanceResponse_OneofSizer(msg proto.Message) (n int) { + m := msg.(*LoadBalanceResponse) + // load_balance_response_type + switch x := m.LoadBalanceResponseType.(type) { + case *LoadBalanceResponse_InitialResponse: + s := proto.Size(x.InitialResponse) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *LoadBalanceResponse_ServerList: + s := proto.Size(x.ServerList) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type InitialLoadBalanceResponse struct { + // This is an application layer redirect that indicates the client should use + // the specified server for load balancing. When this field is non-empty in + // the response, the client should open a separate connection to the + // load_balancer_delegate and call the BalanceLoad method. Its length should + // be less than 64 bytes. + LoadBalancerDelegate string `protobuf:"bytes,1,opt,name=load_balancer_delegate,json=loadBalancerDelegate" json:"load_balancer_delegate,omitempty"` + // This interval defines how often the client should send the client stats + // to the load balancer. Stats should only be reported when the duration is + // positive. + ClientStatsReportInterval *Duration `protobuf:"bytes,2,opt,name=client_stats_report_interval,json=clientStatsReportInterval" json:"client_stats_report_interval,omitempty"` +} + +func (m *InitialLoadBalanceResponse) Reset() { *m = InitialLoadBalanceResponse{} } +func (m *InitialLoadBalanceResponse) String() string { return proto.CompactTextString(m) } +func (*InitialLoadBalanceResponse) ProtoMessage() {} +func (*InitialLoadBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *InitialLoadBalanceResponse) GetLoadBalancerDelegate() string { + if m != nil { + return m.LoadBalancerDelegate + } + return "" +} + +func (m *InitialLoadBalanceResponse) GetClientStatsReportInterval() *Duration { + if m != nil { + return m.ClientStatsReportInterval + } + return nil +} + +type ServerList struct { + // Contains a list of servers selected by the load balancer. The list will + // be updated when server resolutions change or as needed to balance load + // across more servers. The client should consume the server list in order + // unless instructed otherwise via the client_config. + Servers []*Server `protobuf:"bytes,1,rep,name=servers" json:"servers,omitempty"` + // Indicates the amount of time that the client should consider this server + // list as valid. It may be considered stale after waiting this interval of + // time after receiving the list. If the interval is not positive, the + // client can assume the list is valid until the next list is received. + ExpirationInterval *Duration `protobuf:"bytes,3,opt,name=expiration_interval,json=expirationInterval" json:"expiration_interval,omitempty"` +} + +func (m *ServerList) Reset() { *m = ServerList{} } +func (m *ServerList) String() string { return proto.CompactTextString(m) } +func (*ServerList) ProtoMessage() {} +func (*ServerList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *ServerList) GetServers() []*Server { + if m != nil { + return m.Servers + } + return nil +} + +func (m *ServerList) GetExpirationInterval() *Duration { + if m != nil { + return m.ExpirationInterval + } + return nil +} + +// Contains server information. When none of the [drop_for_*] fields are true, +// use the other fields. When drop_for_rate_limiting is true, ignore all other +// fields. Use drop_for_load_balancing only when it is true and +// drop_for_rate_limiting is false. +type Server struct { + // A resolved address for the server, serialized in network-byte-order. It may + // either be an IPv4 or IPv6 address. + IpAddress []byte `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` + // A resolved port number for the server. + Port int32 `protobuf:"varint,2,opt,name=port" json:"port,omitempty"` + // An opaque but printable token given to the frontend for each pick. All + // frontend requests for that pick must include the token in its initial + // metadata. The token is used by the backend to verify the request and to + // allow the backend to report load to the gRPC LB system. + // + // Its length is variable but less than 50 bytes. + LoadBalanceToken string `protobuf:"bytes,3,opt,name=load_balance_token,json=loadBalanceToken" json:"load_balance_token,omitempty"` + // Indicates whether this particular request should be dropped by the client + // for rate limiting. + DropForRateLimiting bool `protobuf:"varint,4,opt,name=drop_for_rate_limiting,json=dropForRateLimiting" json:"drop_for_rate_limiting,omitempty"` + // Indicates whether this particular request should be dropped by the client + // for load balancing. + DropForLoadBalancing bool `protobuf:"varint,5,opt,name=drop_for_load_balancing,json=dropForLoadBalancing" json:"drop_for_load_balancing,omitempty"` +} + +func (m *Server) Reset() { *m = Server{} } +func (m *Server) String() string { return proto.CompactTextString(m) } +func (*Server) ProtoMessage() {} +func (*Server) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *Server) GetIpAddress() []byte { + if m != nil { + return m.IpAddress + } + return nil +} + +func (m *Server) GetPort() int32 { + if m != nil { + return m.Port + } + return 0 +} + +func (m *Server) GetLoadBalanceToken() string { + if m != nil { + return m.LoadBalanceToken + } + return "" +} + +func (m *Server) GetDropForRateLimiting() bool { + if m != nil { + return m.DropForRateLimiting + } + return false +} + +func (m *Server) GetDropForLoadBalancing() bool { + if m != nil { + return m.DropForLoadBalancing + } + return false +} + +func init() { + proto.RegisterType((*Duration)(nil), "grpc.lb.v1.Duration") + proto.RegisterType((*Timestamp)(nil), "grpc.lb.v1.Timestamp") + proto.RegisterType((*LoadBalanceRequest)(nil), "grpc.lb.v1.LoadBalanceRequest") + proto.RegisterType((*InitialLoadBalanceRequest)(nil), "grpc.lb.v1.InitialLoadBalanceRequest") + proto.RegisterType((*ClientStats)(nil), "grpc.lb.v1.ClientStats") + proto.RegisterType((*LoadBalanceResponse)(nil), "grpc.lb.v1.LoadBalanceResponse") + proto.RegisterType((*InitialLoadBalanceResponse)(nil), "grpc.lb.v1.InitialLoadBalanceResponse") + proto.RegisterType((*ServerList)(nil), "grpc.lb.v1.ServerList") + proto.RegisterType((*Server)(nil), "grpc.lb.v1.Server") +} + +func init() { proto.RegisterFile("grpclb.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 733 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xdd, 0x4e, 0x1b, 0x39, + 0x14, 0x66, 0x36, 0xfc, 0xe5, 0x24, 0x5a, 0x58, 0x93, 0x85, 0xc0, 0xc2, 0x2e, 0x1b, 0xa9, 0x34, + 0xaa, 0x68, 0x68, 0x43, 0x7b, 0xd1, 0x9f, 0x9b, 0x02, 0x45, 0x41, 0xe5, 0xa2, 0x72, 0xa8, 0x7a, + 0x55, 0x59, 0x4e, 0xc6, 0x80, 0xc5, 0xc4, 0x9e, 0xda, 0x4e, 0x68, 0x2f, 0x7b, 0xd9, 0x47, 0xe9, + 0x63, 0x54, 0x7d, 0x86, 0xbe, 0x4f, 0x65, 0x7b, 0x26, 0x33, 0x90, 0x1f, 0xd4, 0xbb, 0xf1, 0xf1, + 0x77, 0xbe, 0xf3, 0xf9, 0xd8, 0xdf, 0x19, 0x28, 0x5f, 0xa8, 0xb8, 0x1b, 0x75, 0x1a, 0xb1, 0x92, + 0x46, 0x22, 0xb0, 0xab, 0x46, 0xd4, 0x69, 0x0c, 0x1e, 0xd7, 0x9e, 0xc3, 0xe2, 0x51, 0x5f, 0x51, + 0xc3, 0xa5, 0x40, 0x55, 0x58, 0xd0, 0xac, 0x2b, 0x45, 0xa8, 0xab, 0xc1, 0x76, 0x50, 0x2f, 0xe0, + 0x74, 0x89, 0x2a, 0x30, 0x27, 0xa8, 0x90, 0xba, 0xfa, 0xc7, 0x76, 0x50, 0x9f, 0xc3, 0x7e, 0x51, + 0x7b, 0x01, 0xc5, 0x33, 0xde, 0x63, 0xda, 0xd0, 0x5e, 0xfc, 0xdb, 0xc9, 0xdf, 0x03, 0x40, 0xa7, + 0x92, 0x86, 0x07, 0x34, 0xa2, 0xa2, 0xcb, 0x30, 0xfb, 0xd8, 0x67, 0xda, 0xa0, 0xb7, 0xb0, 0xc4, + 0x05, 0x37, 0x9c, 0x46, 0x44, 0xf9, 0x90, 0xa3, 0x2b, 0x35, 0xef, 0x35, 0x32, 0xd5, 0x8d, 0x13, + 0x0f, 0x19, 0xcd, 0x6f, 0xcd, 0xe0, 0x3f, 0x93, 0xfc, 0x94, 0xf1, 0x25, 0x94, 0xbb, 0x11, 0x67, + 0xc2, 0x10, 0x6d, 0xa8, 0xf1, 0x2a, 0x4a, 0xcd, 0xb5, 0x3c, 0xdd, 0xa1, 0xdb, 0x6f, 0xdb, 0xed, + 0xd6, 0x0c, 0x2e, 0x75, 0xb3, 0xe5, 0xc1, 0x3f, 0xb0, 0x1e, 0x49, 0x1a, 0x92, 0x8e, 0x2f, 0x93, + 0x8a, 0x22, 0xe6, 0x73, 0xcc, 0x6a, 0x7b, 0xb0, 0x3e, 0x51, 0x09, 0x42, 0x30, 0x2b, 0x68, 0x8f, + 0x39, 0xf9, 0x45, 0xec, 0xbe, 0x6b, 0x5f, 0x67, 0xa1, 0x94, 0x2b, 0x86, 0xf6, 0xa1, 0x68, 0xd2, + 0x0e, 0x26, 0xe7, 0xfc, 0x3b, 0x2f, 0x6c, 0xd8, 0x5e, 0x9c, 0xe1, 0xd0, 0x03, 0xf8, 0x4b, 0xf4, + 0x7b, 0xa4, 0x4b, 0xa3, 0x48, 0xdb, 0x33, 0x29, 0xc3, 0x42, 0x77, 0xaa, 0x02, 0x5e, 0x12, 0xfd, + 0xde, 0xa1, 0x8d, 0xb7, 0x7d, 0x18, 0xed, 0x02, 0xca, 0xb0, 0xe7, 0x5c, 0x70, 0x7d, 0xc9, 0xc2, + 0x6a, 0xc1, 0x81, 0x97, 0x53, 0xf0, 0x71, 0x12, 0x47, 0x04, 0x1a, 0xa3, 0x68, 0x72, 0xcd, 0xcd, + 0x25, 0x09, 0x95, 0x8c, 0xc9, 0xb9, 0x54, 0x44, 0x51, 0xc3, 0x48, 0xc4, 0x7b, 0xdc, 0x70, 0x71, + 0x51, 0x9d, 0x75, 0x4c, 0xf7, 0x6f, 0x33, 0xbd, 0xe7, 0xe6, 0xf2, 0x48, 0xc9, 0xf8, 0x58, 0x2a, + 0x4c, 0x0d, 0x3b, 0x4d, 0xe0, 0x88, 0xc2, 0xde, 0x9d, 0x05, 0x72, 0xed, 0xb6, 0x15, 0xe6, 0x5c, + 0x85, 0xfa, 0x94, 0x0a, 0x59, 0xef, 0x6d, 0x89, 0x0f, 0xf0, 0x70, 0x52, 0x89, 0xe4, 0x19, 0x9c, + 0x53, 0x1e, 0xb1, 0x90, 0x18, 0x49, 0x34, 0x13, 0x61, 0x75, 0xde, 0x15, 0xd8, 0x19, 0x57, 0xc0, + 0x5f, 0xd5, 0xb1, 0xc3, 0x9f, 0xc9, 0x36, 0x13, 0x21, 0x6a, 0xc1, 0xff, 0x63, 0xe8, 0xaf, 0x84, + 0xbc, 0x16, 0x44, 0xb1, 0x2e, 0xe3, 0x03, 0x16, 0x56, 0x17, 0x1c, 0xe5, 0xd6, 0x6d, 0xca, 0x37, + 0x16, 0x85, 0x13, 0x50, 0xed, 0x47, 0x00, 0x2b, 0x37, 0x9e, 0x8d, 0x8e, 0xa5, 0xd0, 0x0c, 0xb5, + 0x61, 0x39, 0x73, 0x80, 0x8f, 0x25, 0x4f, 0x63, 0xe7, 0x2e, 0x0b, 0x78, 0x74, 0x6b, 0x06, 0x2f, + 0x0d, 0x3d, 0x90, 0x90, 0x3e, 0x83, 0x92, 0x66, 0x6a, 0xc0, 0x14, 0x89, 0xb8, 0x36, 0x89, 0x07, + 0x56, 0xf3, 0x7c, 0x6d, 0xb7, 0x7d, 0xca, 0x9d, 0x87, 0x40, 0x0f, 0x57, 0x07, 0x9b, 0xb0, 0x71, + 0xcb, 0x01, 0x9e, 0xd3, 0x5b, 0xe0, 0x5b, 0x00, 0x1b, 0x93, 0xa5, 0xa0, 0x27, 0xb0, 0x9a, 0x4f, + 0x56, 0x24, 0x64, 0x11, 0xbb, 0xa0, 0x26, 0xb5, 0x45, 0x25, 0xca, 0x92, 0xd4, 0x51, 0xb2, 0x87, + 0xde, 0xc1, 0x66, 0xde, 0xb2, 0x44, 0xb1, 0x58, 0x2a, 0x43, 0xb8, 0x30, 0x4c, 0x0d, 0x68, 0x94, + 0xc8, 0xaf, 0xe4, 0xe5, 0xa7, 0x43, 0x0c, 0xaf, 0xe7, 0xdc, 0x8b, 0x5d, 0xde, 0x49, 0x92, 0x56, + 0xfb, 0x12, 0x00, 0x64, 0xc7, 0x44, 0xbb, 0x76, 0x62, 0xd9, 0x95, 0x9d, 0x58, 0x85, 0x7a, 0xa9, + 0x89, 0x46, 0xfb, 0x81, 0x53, 0x08, 0x7a, 0x0d, 0x2b, 0xec, 0x53, 0xcc, 0x7d, 0x95, 0x4c, 0x4a, + 0x61, 0x8a, 0x14, 0x94, 0x25, 0x0c, 0x35, 0xfc, 0x0c, 0x60, 0xde, 0x53, 0xa3, 0x2d, 0x00, 0x1e, + 0x13, 0x1a, 0x86, 0x8a, 0x69, 0x3f, 0x34, 0xcb, 0xb8, 0xc8, 0xe3, 0x57, 0x3e, 0x60, 0xe7, 0x87, + 0x55, 0x9f, 0x4c, 0x4d, 0xf7, 0x6d, 0xed, 0x7c, 0xe3, 0x2e, 0x8c, 0xbc, 0x62, 0xc2, 0x69, 0x28, + 0xe2, 0xe5, 0x5c, 0x2b, 0xcf, 0x6c, 0x1c, 0xed, 0xc3, 0xea, 0x14, 0xdb, 0x2e, 0xe2, 0x95, 0x70, + 0x8c, 0x45, 0x9f, 0xc2, 0xda, 0x34, 0x2b, 0x2e, 0xe2, 0x4a, 0x38, 0xc6, 0x76, 0xcd, 0x0e, 0x94, + 0x73, 0xf7, 0xaf, 0x10, 0x86, 0x52, 0xf2, 0x6d, 0xc3, 0xe8, 0xdf, 0x7c, 0x83, 0x46, 0x87, 0xe5, + 0xc6, 0x7f, 0x13, 0xf7, 0xfd, 0x43, 0xaa, 0x07, 0x8f, 0x82, 0xce, 0xbc, 0xfb, 0x7d, 0xed, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0xff, 0x64, 0xbf, 0xda, 0x5e, 0xce, 0x06, 0x00, 0x00, +} diff --git a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.proto b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.proto new file mode 100644 index 0000000000000..b13b3438cf275 --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/grpclb.proto @@ -0,0 +1,164 @@ +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package grpc.lb.v1; + +message Duration { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. + int64 seconds = 1; + + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + int32 nanos = 2; +} + +message Timestamp { + + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + int64 seconds = 1; + + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + int32 nanos = 2; +} + +service LoadBalancer { + // Bidirectional rpc to get a list of servers. + rpc BalanceLoad(stream LoadBalanceRequest) + returns (stream LoadBalanceResponse); +} + +message LoadBalanceRequest { + oneof load_balance_request_type { + // This message should be sent on the first request to the load balancer. + InitialLoadBalanceRequest initial_request = 1; + + // The client stats should be periodically reported to the load balancer + // based on the duration defined in the InitialLoadBalanceResponse. + ClientStats client_stats = 2; + } +} + +message InitialLoadBalanceRequest { + // Name of load balanced service (IE, balancer.service.com) + // length should be less than 256 bytes. + string name = 1; +} + +// Contains client level statistics that are useful to load balancing. Each +// count except the timestamp should be reset to zero after reporting the stats. +message ClientStats { + // The timestamp of generating the report. + Timestamp timestamp = 1; + + // The total number of RPCs that started. + int64 num_calls_started = 2; + + // The total number of RPCs that finished. + int64 num_calls_finished = 3; + + // The total number of RPCs that were dropped by the client because of rate + // limiting. + int64 num_calls_finished_with_drop_for_rate_limiting = 4; + + // The total number of RPCs that were dropped by the client because of load + // balancing. + int64 num_calls_finished_with_drop_for_load_balancing = 5; + + // The total number of RPCs that failed to reach a server except dropped RPCs. + int64 num_calls_finished_with_client_failed_to_send = 6; + + // The total number of RPCs that finished and are known to have been received + // by a server. + int64 num_calls_finished_known_received = 7; +} + +message LoadBalanceResponse { + oneof load_balance_response_type { + // This message should be sent on the first response to the client. + InitialLoadBalanceResponse initial_response = 1; + + // Contains the list of servers selected by the load balancer. The client + // should send requests to these servers in the specified order. + ServerList server_list = 2; + } +} + +message InitialLoadBalanceResponse { + // This is an application layer redirect that indicates the client should use + // the specified server for load balancing. When this field is non-empty in + // the response, the client should open a separate connection to the + // load_balancer_delegate and call the BalanceLoad method. Its length should + // be less than 64 bytes. + string load_balancer_delegate = 1; + + // This interval defines how often the client should send the client stats + // to the load balancer. Stats should only be reported when the duration is + // positive. + Duration client_stats_report_interval = 2; +} + +message ServerList { + // Contains a list of servers selected by the load balancer. The list will + // be updated when server resolutions change or as needed to balance load + // across more servers. The client should consume the server list in order + // unless instructed otherwise via the client_config. + repeated Server servers = 1; + + // Indicates the amount of time that the client should consider this server + // list as valid. It may be considered stale after waiting this interval of + // time after receiving the list. If the interval is not positive, the + // client can assume the list is valid until the next list is received. + Duration expiration_interval = 3; +} + +// Contains server information. When none of the [drop_for_*] fields are true, +// use the other fields. When drop_for_rate_limiting is true, ignore all other +// fields. Use drop_for_load_balancing only when it is true and +// drop_for_rate_limiting is false. +message Server { + // A resolved address for the server, serialized in network-byte-order. It may + // either be an IPv4 or IPv6 address. + bytes ip_address = 1; + + // A resolved port number for the server. + int32 port = 2; + + // An opaque but printable token given to the frontend for each pick. All + // frontend requests for that pick must include the token in its initial + // metadata. The token is used by the backend to verify the request and to + // allow the backend to report load to the gRPC LB system. + // + // Its length is variable but less than 50 bytes. + string load_balance_token = 3; + + // Indicates whether this particular request should be dropped by the client + // for rate limiting. + bool drop_for_rate_limiting = 4; + + // Indicates whether this particular request should be dropped by the client + // for load balancing. + bool drop_for_load_balancing = 5; +} diff --git a/vendor/google.golang.org/grpc/grpclog/BUILD b/vendor/google.golang.org/grpc/grpclog/BUILD index e6cd27be975d1..63eb1b18a0560 100644 --- a/vendor/google.golang.org/grpc/grpclog/BUILD +++ b/vendor/google.golang.org/grpc/grpclog/BUILD @@ -2,7 +2,11 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = ["logger.go"], + srcs = [ + "grpclog.go", + "logger.go", + "loggerv2.go", + ], visibility = ["//visibility:public"], ) diff --git a/vendor/google.golang.org/grpc/grpclog/grpclog.go b/vendor/google.golang.org/grpc/grpclog/grpclog.go new file mode 100644 index 0000000000000..0a6758a270056 --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclog/grpclog.go @@ -0,0 +1,135 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +// Package grpclog defines logging for grpc. +// +// All logs in transport package only go to verbose level 2. +// All logs in other packages in grpc are logged in spite of the verbosity level. +// +// In the default logger, +// severity level can be set by environment variable GRPC_GO_LOG_SEVERITY_LEVEL, +// verbosity level can be set by GRPC_GO_LOG_VERBOSITY_LEVEL. +package grpclog + +import "os" + +var logger = newLoggerV2() + +// V reports whether verbosity level l is at least the requested verbose level. +func V(l int) bool { + return logger.V(l) +} + +// Info logs to the INFO log. +func Info(args ...interface{}) { + logger.Info(args...) +} + +// Infof logs to the INFO log. Arguments are handled in the manner of fmt.Printf. +func Infof(format string, args ...interface{}) { + logger.Infof(format, args...) +} + +// Infoln logs to the INFO log. Arguments are handled in the manner of fmt.Println. +func Infoln(args ...interface{}) { + logger.Infoln(args...) +} + +// Warning logs to the WARNING log. +func Warning(args ...interface{}) { + logger.Warning(args...) +} + +// Warningf logs to the WARNING log. Arguments are handled in the manner of fmt.Printf. +func Warningf(format string, args ...interface{}) { + logger.Warningf(format, args...) +} + +// Warningln logs to the WARNING log. Arguments are handled in the manner of fmt.Println. +func Warningln(args ...interface{}) { + logger.Warningln(args...) +} + +// Error logs to the ERROR log. +func Error(args ...interface{}) { + logger.Error(args...) +} + +// Errorf logs to the ERROR log. Arguments are handled in the manner of fmt.Printf. +func Errorf(format string, args ...interface{}) { + logger.Errorf(format, args...) +} + +// Errorln logs to the ERROR log. Arguments are handled in the manner of fmt.Println. +func Errorln(args ...interface{}) { + logger.Errorln(args...) +} + +// Fatal logs to the FATAL log. Arguments are handled in the manner of fmt.Print. +// It calls os.Exit() with exit code 1. +func Fatal(args ...interface{}) { + logger.Fatal(args...) + os.Exit(1) +} + +// Fatalf logs to the FATAL log. Arguments are handled in the manner of fmt.Printf. +// It calles os.Exit() with exit code 1. +func Fatalf(format string, args ...interface{}) { + logger.Fatalf(format, args...) + os.Exit(1) +} + +// Fatalln logs to the FATAL log. Arguments are handled in the manner of fmt.Println. +// It calle os.Exit()) with exit code 1. +func Fatalln(args ...interface{}) { + logger.Fatalln(args...) + os.Exit(1) +} + +// Print prints to the logger. Arguments are handled in the manner of fmt.Print. +// Deprecated: use Info. +func Print(args ...interface{}) { + logger.Info(args...) +} + +// Printf prints to the logger. Arguments are handled in the manner of fmt.Printf. +// Deprecated: use Infof. +func Printf(format string, args ...interface{}) { + logger.Infof(format, args...) +} + +// Println prints to the logger. Arguments are handled in the manner of fmt.Println. +// Deprecated: use Infoln. +func Println(args ...interface{}) { + logger.Infoln(args...) +} diff --git a/vendor/google.golang.org/grpc/grpclog/logger.go b/vendor/google.golang.org/grpc/grpclog/logger.go index 2cc09be48945f..d03b2397bfab2 100644 --- a/vendor/google.golang.org/grpc/grpclog/logger.go +++ b/vendor/google.golang.org/grpc/grpclog/logger.go @@ -1,52 +1,25 @@ /* * - * Copyright 2015, Google Inc. - * All rights reserved. + * Copyright 2015 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ -/* -Package grpclog defines logging for grpc. -*/ package grpclog -import ( - "log" - "os" -) - -// Use golang's standard logger by default. -// Access is not mutex-protected: do not modify except in init() -// functions. -var logger Logger = log.New(os.Stderr, "", log.LstdFlags) - // Logger mimics golang's standard Logger as an interface. +// Deprecated: use LoggerV2. type Logger interface { Fatal(args ...interface{}) Fatalf(format string, args ...interface{}) @@ -58,36 +31,53 @@ type Logger interface { // SetLogger sets the logger that is used in grpc. Call only from // init() functions. +// Deprecated: use SetLoggerV2. func SetLogger(l Logger) { - logger = l + logger = &loggerWrapper{Logger: l} +} + +// loggerWrapper wraps Logger into a LoggerV2. +type loggerWrapper struct { + Logger +} + +func (g *loggerWrapper) Info(args ...interface{}) { + g.Logger.Print(args...) +} + +func (g *loggerWrapper) Infoln(args ...interface{}) { + g.Logger.Println(args...) +} + +func (g *loggerWrapper) Infof(format string, args ...interface{}) { + g.Logger.Printf(format, args...) +} + +func (g *loggerWrapper) Warning(args ...interface{}) { + g.Logger.Print(args...) } -// Fatal is equivalent to Print() followed by a call to os.Exit() with a non-zero exit code. -func Fatal(args ...interface{}) { - logger.Fatal(args...) +func (g *loggerWrapper) Warningln(args ...interface{}) { + g.Logger.Println(args...) } -// Fatalf is equivalent to Printf() followed by a call to os.Exit() with a non-zero exit code. -func Fatalf(format string, args ...interface{}) { - logger.Fatalf(format, args...) +func (g *loggerWrapper) Warningf(format string, args ...interface{}) { + g.Logger.Printf(format, args...) } -// Fatalln is equivalent to Println() followed by a call to os.Exit()) with a non-zero exit code. -func Fatalln(args ...interface{}) { - logger.Fatalln(args...) +func (g *loggerWrapper) Error(args ...interface{}) { + g.Logger.Print(args...) } -// Print prints to the logger. Arguments are handled in the manner of fmt.Print. -func Print(args ...interface{}) { - logger.Print(args...) +func (g *loggerWrapper) Errorln(args ...interface{}) { + g.Logger.Println(args...) } -// Printf prints to the logger. Arguments are handled in the manner of fmt.Printf. -func Printf(format string, args ...interface{}) { - logger.Printf(format, args...) +func (g *loggerWrapper) Errorf(format string, args ...interface{}) { + g.Logger.Printf(format, args...) } -// Println prints to the logger. Arguments are handled in the manner of fmt.Println. -func Println(args ...interface{}) { - logger.Println(args...) +func (g *loggerWrapper) V(l int) bool { + // Returns true for all verbose level. + return true } diff --git a/vendor/google.golang.org/grpc/grpclog/loggerv2.go b/vendor/google.golang.org/grpc/grpclog/loggerv2.go new file mode 100644 index 0000000000000..f5193be922feb --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclog/loggerv2.go @@ -0,0 +1,204 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package grpclog + +import ( + "io" + "io/ioutil" + "log" + "os" + "strconv" +) + +// LoggerV2 does underlying logging work for grpclog. +type LoggerV2 interface { + // Info logs to INFO log. Arguments are handled in the manner of fmt.Print. + Info(args ...interface{}) + // Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. + Infoln(args ...interface{}) + // Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. + Infof(format string, args ...interface{}) + // Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. + Warning(args ...interface{}) + // Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. + Warningln(args ...interface{}) + // Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. + Warningf(format string, args ...interface{}) + // Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. + Error(args ...interface{}) + // Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + Errorln(args ...interface{}) + // Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + Errorf(format string, args ...interface{}) + // Fatal logs to ERROR log. Arguments are handled in the manner of fmt.Print. + // This function should call os.Exit() with a non-zero exit code. + Fatal(args ...interface{}) + // Fatalln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + // This function should call os.Exit() with a non-zero exit code. + Fatalln(args ...interface{}) + // Fatalf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + // This function should call os.Exit() with a non-zero exit code. + Fatalf(format string, args ...interface{}) + // V reports whether verbosity level l is at least the requested verbose level. + V(l int) bool +} + +// SetLoggerV2 sets logger that is used in grpc to a V2 logger. +// Not mutex-protected, should be called before any gRPC functions. +func SetLoggerV2(l LoggerV2) { + logger = l +} + +const ( + // infoLog indicates Info severity. + infoLog int = iota + // warningLog indicates Warning severity. + warningLog + // errorLog indicates Error severity. + errorLog + // fatalLog indicates Fatal severity. + fatalLog +) + +// severityName contains the string representation of each severity. +var severityName = []string{ + infoLog: "INFO", + warningLog: "WARNING", + errorLog: "ERROR", + fatalLog: "FATAL", +} + +// loggerT is the default logger used by grpclog. +type loggerT struct { + m []*log.Logger + v int +} + +// NewLoggerV2 creates a loggerV2 with the provided writers. +// Fatal logs will be written to errorW, warningW, infoW, followed by exit(1). +// Error logs will be written to errorW, warningW and infoW. +// Warning logs will be written to warningW and infoW. +// Info logs will be written to infoW. +func NewLoggerV2(infoW, warningW, errorW io.Writer) LoggerV2 { + return NewLoggerV2WithVerbosity(infoW, warningW, errorW, 0) +} + +// NewLoggerV2WithVerbosity creates a loggerV2 with the provided writers and +// verbosity level. +func NewLoggerV2WithVerbosity(infoW, warningW, errorW io.Writer, v int) LoggerV2 { + var m []*log.Logger + m = append(m, log.New(infoW, severityName[infoLog]+": ", log.LstdFlags)) + m = append(m, log.New(io.MultiWriter(infoW, warningW), severityName[warningLog]+": ", log.LstdFlags)) + ew := io.MultiWriter(infoW, warningW, errorW) // ew will be used for error and fatal. + m = append(m, log.New(ew, severityName[errorLog]+": ", log.LstdFlags)) + m = append(m, log.New(ew, severityName[fatalLog]+": ", log.LstdFlags)) + return &loggerT{m: m, v: v} +} + +// newLoggerV2 creates a loggerV2 to be used as default logger. +// All logs are written to stderr. +func newLoggerV2() LoggerV2 { + errorW := ioutil.Discard + warningW := ioutil.Discard + infoW := ioutil.Discard + + logLevel := os.Getenv("GRPC_GO_LOG_SEVERITY_LEVEL") + switch logLevel { + case "", "ERROR", "error": // If env is unset, set level to ERROR. + errorW = os.Stderr + case "WARNING", "warning": + warningW = os.Stderr + case "INFO", "info": + infoW = os.Stderr + } + + var v int + vLevel := os.Getenv("GRPC_GO_LOG_VERBOSITY_LEVEL") + if vl, err := strconv.Atoi(vLevel); err == nil { + v = vl + } + return NewLoggerV2WithVerbosity(infoW, warningW, errorW, v) +} + +func (g *loggerT) Info(args ...interface{}) { + g.m[infoLog].Print(args...) +} + +func (g *loggerT) Infoln(args ...interface{}) { + g.m[infoLog].Println(args...) +} + +func (g *loggerT) Infof(format string, args ...interface{}) { + g.m[infoLog].Printf(format, args...) +} + +func (g *loggerT) Warning(args ...interface{}) { + g.m[warningLog].Print(args...) +} + +func (g *loggerT) Warningln(args ...interface{}) { + g.m[warningLog].Println(args...) +} + +func (g *loggerT) Warningf(format string, args ...interface{}) { + g.m[warningLog].Printf(format, args...) +} + +func (g *loggerT) Error(args ...interface{}) { + g.m[errorLog].Print(args...) +} + +func (g *loggerT) Errorln(args ...interface{}) { + g.m[errorLog].Println(args...) +} + +func (g *loggerT) Errorf(format string, args ...interface{}) { + g.m[errorLog].Printf(format, args...) +} + +func (g *loggerT) Fatal(args ...interface{}) { + g.m[fatalLog].Fatal(args...) +} + +func (g *loggerT) Fatalln(args ...interface{}) { + g.m[fatalLog].Fatalln(args...) +} + +func (g *loggerT) Fatalf(format string, args ...interface{}) { + g.m[fatalLog].Fatalf(format, args...) +} + +func (g *loggerT) V(l int) bool { + return l <= g.v +} diff --git a/vendor/google.golang.org/grpc/interceptor.go b/vendor/google.golang.org/grpc/interceptor.go index 8d932efed7e37..06dc825b9fba8 100644 --- a/vendor/google.golang.org/grpc/interceptor.go +++ b/vendor/google.golang.org/grpc/interceptor.go @@ -1,33 +1,18 @@ /* * - * Copyright 2016, Google Inc. - * All rights reserved. + * Copyright 2016 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -40,17 +25,17 @@ import ( // UnaryInvoker is called by UnaryClientInterceptor to complete RPCs. type UnaryInvoker func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, opts ...CallOption) error -// UnaryClientInterceptor intercepts the execution of a unary RPC on the client. inovker is the handler to complete the RPC +// UnaryClientInterceptor intercepts the execution of a unary RPC on the client. invoker is the handler to complete the RPC // and it is the responsibility of the interceptor to call it. -// This is the EXPERIMENTAL API. +// This is an EXPERIMENTAL API. type UnaryClientInterceptor func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, invoker UnaryInvoker, opts ...CallOption) error // Streamer is called by StreamClientInterceptor to create a ClientStream. type Streamer func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error) // StreamClientInterceptor intercepts the creation of ClientStream. It may return a custom ClientStream to intercept all I/O -// operations. streamer is the handlder to create a ClientStream and it is the responsibility of the interceptor to call it. -// This is the EXPERIMENTAL API. +// operations. streamer is the handler to create a ClientStream and it is the responsibility of the interceptor to call it. +// This is an EXPERIMENTAL API. type StreamClientInterceptor func(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, streamer Streamer, opts ...CallOption) (ClientStream, error) // UnaryServerInfo consists of various information about a unary RPC on diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go index 5489143a85c1a..07083832c3c6f 100644 --- a/vendor/google.golang.org/grpc/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/internal.go @@ -1,32 +1,17 @@ /* - * Copyright 2016, Google Inc. - * All rights reserved. + * Copyright 2016 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ diff --git a/vendor/google.golang.org/grpc/keepalive/BUILD b/vendor/google.golang.org/grpc/keepalive/BUILD new file mode 100644 index 0000000000000..8fa21cedfe958 --- /dev/null +++ b/vendor/google.golang.org/grpc/keepalive/BUILD @@ -0,0 +1,27 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["keepalive.go"], + tags = ["automanaged"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/vendor/google.golang.org/grpc/keepalive/keepalive.go b/vendor/google.golang.org/grpc/keepalive/keepalive.go new file mode 100644 index 0000000000000..f8adc7e6d4fa1 --- /dev/null +++ b/vendor/google.golang.org/grpc/keepalive/keepalive.go @@ -0,0 +1,65 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package keepalive defines configurable parameters for point-to-point healthcheck. +package keepalive + +import ( + "time" +) + +// ClientParameters is used to set keepalive parameters on the client-side. +// These configure how the client will actively probe to notice when a connection is broken +// and send pings so intermediaries will be aware of the liveness of the connection. +// Make sure these parameters are set in coordination with the keepalive policy on the server, +// as incompatible settings can result in closing of connection. +type ClientParameters struct { + // After a duration of this time if the client doesn't see any activity it pings the server to see if the transport is still alive. + Time time.Duration // The current default value is infinity. + // After having pinged for keepalive check, the client waits for a duration of Timeout and if no activity is seen even after that + // the connection is closed. + Timeout time.Duration // The current default value is 20 seconds. + // If true, client runs keepalive checks even with no active RPCs. + PermitWithoutStream bool // false by default. +} + +// ServerParameters is used to set keepalive and max-age parameters on the server-side. +type ServerParameters struct { + // MaxConnectionIdle is a duration for the amount of time after which an idle connection would be closed by sending a GoAway. + // Idleness duration is defined since the most recent time the number of outstanding RPCs became zero or the connection establishment. + MaxConnectionIdle time.Duration // The current default value is infinity. + // MaxConnectionAge is a duration for the maximum amount of time a connection may exist before it will be closed by sending a GoAway. + // A random jitter of +/-10% will be added to MaxConnectionAge to spread out connection storms. + MaxConnectionAge time.Duration // The current default value is infinity. + // MaxConnectinoAgeGrace is an additive period after MaxConnectionAge after which the connection will be forcibly closed. + MaxConnectionAgeGrace time.Duration // The current default value is infinity. + // After a duration of this time if the server doesn't see any activity it pings the client to see if the transport is still alive. + Time time.Duration // The current default value is 2 hours. + // After having pinged for keepalive check, the server waits for a duration of Timeout and if no activity is seen even after that + // the connection is closed. + Timeout time.Duration // The current default value is 20 seconds. +} + +// EnforcementPolicy is used to set keepalive enforcement policy on the server-side. +// Server will close connection with a client that violates this policy. +type EnforcementPolicy struct { + // MinTime is the minimum amount of time a client should wait before sending a keepalive ping. + MinTime time.Duration // The current default value is 5 minutes. + // If true, server expects keepalive pings even when there are no active streams(RPCs). + PermitWithoutStream bool // false by default. +} diff --git a/vendor/google.golang.org/grpc/metadata/metadata.go b/vendor/google.golang.org/grpc/metadata/metadata.go index cb29bf945793b..9ac4750476687 100644 --- a/vendor/google.golang.org/grpc/metadata/metadata.go +++ b/vendor/google.golang.org/grpc/metadata/metadata.go @@ -1,91 +1,53 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ // Package metadata define the structure of the metadata supported by gRPC library. +// Please refer to https://grpc.io/docs/guides/wire.html for more information about custom-metadata. package metadata import ( - "encoding/base64" "fmt" "strings" "golang.org/x/net/context" ) -const ( - binHdrSuffix = "-bin" -) - -// encodeKeyValue encodes key and value qualified for transmission via gRPC. -// Transmitting binary headers violates HTTP/2 spec. -// TODO(zhaoq): Maybe check if k is ASCII also. -func encodeKeyValue(k, v string) (string, string) { - k = strings.ToLower(k) - if strings.HasSuffix(k, binHdrSuffix) { - val := base64.StdEncoding.EncodeToString([]byte(v)) - v = string(val) - } - return k, v -} - -// DecodeKeyValue returns the original key and value corresponding to the -// encoded data in k, v. -// If k is a binary header and v contains comma, v is split on comma before decoded, -// and the decoded v will be joined with comma before returned. +// DecodeKeyValue returns k, v, nil. It is deprecated and should not be used. func DecodeKeyValue(k, v string) (string, string, error) { - if !strings.HasSuffix(k, binHdrSuffix) { - return k, v, nil - } - vvs := strings.Split(v, ",") - for i, vv := range vvs { - val, err := base64.StdEncoding.DecodeString(vv) - if err != nil { - return "", "", err - } - vvs[i] = string(val) - } - return k, strings.Join(vvs, ","), nil + return k, v, nil } // MD is a mapping from metadata keys to values. Users should use the following // two convenience functions New and Pairs to generate MD. type MD map[string][]string -// New creates a MD from given key-value map. +// New creates an MD from a given key-value map. +// +// Only the following ASCII characters are allowed in keys: +// - digits: 0-9 +// - uppercase letters: A-Z (normalized to lower) +// - lowercase letters: a-z +// - special characters: -_. +// Uppercase letters are automatically converted to lowercase. func New(m map[string]string) MD { md := MD{} - for k, v := range m { - key, val := encodeKeyValue(k, v) + for k, val := range m { + key := strings.ToLower(k) md[key] = append(md[key], val) } return md @@ -93,19 +55,25 @@ func New(m map[string]string) MD { // Pairs returns an MD formed by the mapping of key, value ... // Pairs panics if len(kv) is odd. +// +// Only the following ASCII characters are allowed in keys: +// - digits: 0-9 +// - uppercase letters: A-Z (normalized to lower) +// - lowercase letters: a-z +// - special characters: -_. +// Uppercase letters are automatically converted to lowercase. func Pairs(kv ...string) MD { if len(kv)%2 == 1 { panic(fmt.Sprintf("metadata: Pairs got the odd number of input pairs for metadata: %d", len(kv))) } md := MD{} - var k string + var key string for i, s := range kv { if i%2 == 0 { - k = s + key = strings.ToLower(s) continue } - key, val := encodeKeyValue(k, s) - md[key] = append(md[key], val) + md[key] = append(md[key], s) } return md } @@ -120,9 +88,9 @@ func (md MD) Copy() MD { return Join(md) } -// Join joins any number of MDs into a single MD. +// Join joins any number of mds into a single MD. // The order of values for each key is determined by the order in which -// the MDs containing those values are presented to Join. +// the mds containing those values are presented to Join. func Join(mds ...MD) MD { out := MD{} for _, md := range mds { @@ -133,15 +101,41 @@ func Join(mds ...MD) MD { return out } -type mdKey struct{} +type mdIncomingKey struct{} +type mdOutgoingKey struct{} -// NewContext creates a new context with md attached. +// NewContext is a wrapper for NewOutgoingContext(ctx, md). Deprecated. func NewContext(ctx context.Context, md MD) context.Context { - return context.WithValue(ctx, mdKey{}, md) + return NewOutgoingContext(ctx, md) } -// FromContext returns the MD in ctx if it exists. +// NewIncomingContext creates a new context with incoming md attached. +func NewIncomingContext(ctx context.Context, md MD) context.Context { + return context.WithValue(ctx, mdIncomingKey{}, md) +} + +// NewOutgoingContext creates a new context with outgoing md attached. +func NewOutgoingContext(ctx context.Context, md MD) context.Context { + return context.WithValue(ctx, mdOutgoingKey{}, md) +} + +// FromContext is a wrapper for FromIncomingContext(ctx). Deprecated. func FromContext(ctx context.Context) (md MD, ok bool) { - md, ok = ctx.Value(mdKey{}).(MD) + return FromIncomingContext(ctx) +} + +// FromIncomingContext returns the incoming metadata in ctx if it exists. The +// returned MD should not be modified. Writing to it may cause races. +// Modification should be made to copies of the returned MD. +func FromIncomingContext(ctx context.Context) (md MD, ok bool) { + md, ok = ctx.Value(mdIncomingKey{}).(MD) + return +} + +// FromOutgoingContext returns the outgoing metadata in ctx if it exists. The +// returned MD should not be modified. Writing to it may cause races. +// Modification should be made to the copies of the returned MD. +func FromOutgoingContext(ctx context.Context) (md MD, ok bool) { + md, ok = ctx.Value(mdOutgoingKey{}).(MD) return } diff --git a/vendor/google.golang.org/grpc/naming/naming.go b/vendor/google.golang.org/grpc/naming/naming.go index c2e0871e6f8b6..1af7e32f86d05 100644 --- a/vendor/google.golang.org/grpc/naming/naming.go +++ b/vendor/google.golang.org/grpc/naming/naming.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ diff --git a/vendor/google.golang.org/grpc/peer/peer.go b/vendor/google.golang.org/grpc/peer/peer.go index bfa6205ba9ea6..317b8b9d09a58 100644 --- a/vendor/google.golang.org/grpc/peer/peer.go +++ b/vendor/google.golang.org/grpc/peer/peer.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -42,7 +27,8 @@ import ( "google.golang.org/grpc/credentials" ) -// Peer contains the information of the peer for an RPC. +// Peer contains the information of the peer for an RPC, such as the address +// and authentication information. type Peer struct { // Addr is the peer address. Addr net.Addr diff --git a/vendor/google.golang.org/grpc/proxy.go b/vendor/google.golang.org/grpc/proxy.go new file mode 100644 index 0000000000000..2d40236e21806 --- /dev/null +++ b/vendor/google.golang.org/grpc/proxy.go @@ -0,0 +1,130 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +import ( + "bufio" + "errors" + "fmt" + "io" + "net" + "net/http" + "net/http/httputil" + "net/url" + + "golang.org/x/net/context" +) + +var ( + // errDisabled indicates that proxy is disabled for the address. + errDisabled = errors.New("proxy is disabled for the address") + // The following variable will be overwritten in the tests. + httpProxyFromEnvironment = http.ProxyFromEnvironment +) + +func mapAddress(ctx context.Context, address string) (string, error) { + req := &http.Request{ + URL: &url.URL{ + Scheme: "https", + Host: address, + }, + } + url, err := httpProxyFromEnvironment(req) + if err != nil { + return "", err + } + if url == nil { + return "", errDisabled + } + return url.Host, nil +} + +// To read a response from a net.Conn, http.ReadResponse() takes a bufio.Reader. +// It's possible that this reader reads more than what's need for the response and stores +// those bytes in the buffer. +// bufConn wraps the original net.Conn and the bufio.Reader to make sure we don't lose the +// bytes in the buffer. +type bufConn struct { + net.Conn + r io.Reader +} + +func (c *bufConn) Read(b []byte) (int, error) { + return c.r.Read(b) +} + +func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, addr string) (_ net.Conn, err error) { + defer func() { + if err != nil { + conn.Close() + } + }() + + req := (&http.Request{ + Method: http.MethodConnect, + URL: &url.URL{Host: addr}, + Header: map[string][]string{"User-Agent": {grpcUA}}, + }) + + if err := sendHTTPRequest(ctx, req, conn); err != nil { + return nil, fmt.Errorf("failed to write the HTTP request: %v", err) + } + + r := bufio.NewReader(conn) + resp, err := http.ReadResponse(r, req) + if err != nil { + return nil, fmt.Errorf("reading server HTTP response: %v", err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + dump, err := httputil.DumpResponse(resp, true) + if err != nil { + return nil, fmt.Errorf("failed to do connect handshake, status code: %s", resp.Status) + } + return nil, fmt.Errorf("failed to do connect handshake, response: %q", dump) + } + + return &bufConn{Conn: conn, r: r}, nil +} + +// newProxyDialer returns a dialer that connects to proxy first if necessary. +// The returned dialer checks if a proxy is necessary, dial to the proxy with the +// provided dialer, does HTTP CONNECT handshake and returns the connection. +func newProxyDialer(dialer func(context.Context, string) (net.Conn, error)) func(context.Context, string) (net.Conn, error) { + return func(ctx context.Context, addr string) (conn net.Conn, err error) { + var skipHandshake bool + newAddr, err := mapAddress(ctx, addr) + if err != nil { + if err != errDisabled { + return nil, err + } + skipHandshake = true + newAddr = addr + } + + conn, err = dialer(ctx, newAddr) + if err != nil { + return + } + if !skipHandshake { + conn, err = doHTTPConnectHandshake(ctx, conn, addr) + } + return + } +} diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go index a25eaa8a2874e..0dbf62fe39ab7 100644 --- a/vendor/google.golang.org/grpc/rpc_util.go +++ b/vendor/google.golang.org/grpc/rpc_util.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -37,45 +22,22 @@ import ( "bytes" "compress/gzip" "encoding/binary" - "fmt" "io" "io/ioutil" "math" - "os" + "sync" + "time" - "github.com/golang/protobuf/proto" "golang.org/x/net/context" "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" "google.golang.org/grpc/transport" ) -// Codec defines the interface gRPC uses to encode and decode messages. -type Codec interface { - // Marshal returns the wire format of v. - Marshal(v interface{}) ([]byte, error) - // Unmarshal parses the wire format into v. - Unmarshal(data []byte, v interface{}) error - // String returns the name of the Codec implementation. The returned - // string will be used as part of content type in transmission. - String() string -} - -// protoCodec is a Codec implementation with protobuf. It is the default codec for gRPC. -type protoCodec struct{} - -func (protoCodec) Marshal(v interface{}) ([]byte, error) { - return proto.Marshal(v.(proto.Message)) -} - -func (protoCodec) Unmarshal(data []byte, v interface{}) error { - return proto.Unmarshal(data, v.(proto.Message)) -} - -func (protoCodec) String() string { - return "proto" -} - // Compressor defines the interface gRPC uses to compress a message. type Compressor interface { // Do compresses p into w. @@ -84,16 +46,24 @@ type Compressor interface { Type() string } -// NewGZIPCompressor creates a Compressor based on GZIP. -func NewGZIPCompressor() Compressor { - return &gzipCompressor{} +type gzipCompressor struct { + pool sync.Pool } -type gzipCompressor struct { +// NewGZIPCompressor creates a Compressor based on GZIP. +func NewGZIPCompressor() Compressor { + return &gzipCompressor{ + pool: sync.Pool{ + New: func() interface{} { + return gzip.NewWriter(ioutil.Discard) + }, + }, + } } func (c *gzipCompressor) Do(w io.Writer, p []byte) error { - z := gzip.NewWriter(w) + z := c.pool.Get().(*gzip.Writer) + z.Reset(w) if _, err := z.Write(p); err != nil { return err } @@ -113,6 +83,7 @@ type Decompressor interface { } type gzipDecompressor struct { + pool sync.Pool } // NewGZIPDecompressor creates a Decompressor based on GZIP. @@ -121,11 +92,26 @@ func NewGZIPDecompressor() Decompressor { } func (d *gzipDecompressor) Do(r io.Reader) ([]byte, error) { - z, err := gzip.NewReader(r) - if err != nil { - return nil, err + var z *gzip.Reader + switch maybeZ := d.pool.Get().(type) { + case nil: + newZ, err := gzip.NewReader(r) + if err != nil { + return nil, err + } + z = newZ + case *gzip.Reader: + z = maybeZ + if err := z.Reset(r); err != nil { + d.pool.Put(z) + return nil, err + } } - defer z.Close() + + defer func() { + z.Close() + d.pool.Put(z) + }() return ioutil.ReadAll(z) } @@ -135,10 +121,14 @@ func (d *gzipDecompressor) Type() string { // callInfo contains all related configuration and information about an RPC. type callInfo struct { - failFast bool - headerMD metadata.MD - trailerMD metadata.MD - traceInfo traceInfo // in trace.go + failFast bool + headerMD metadata.MD + trailerMD metadata.MD + peer *peer.Peer + traceInfo traceInfo // in trace.go + maxReceiveMessageSize *int + maxSendMessageSize *int + creds credentials.PerRPCCredentials } var defaultCallInfo = callInfo{failFast: true} @@ -155,6 +145,14 @@ type CallOption interface { after(*callInfo) } +// EmptyCallOption does not alter the Call configuration. +// It can be embedded in another structure to carry satellite data for use +// by interceptors. +type EmptyCallOption struct{} + +func (EmptyCallOption) before(*callInfo) error { return nil } +func (EmptyCallOption) after(*callInfo) {} + type beforeCall func(c *callInfo) error func (o beforeCall) before(c *callInfo) error { return o(c) } @@ -181,12 +179,23 @@ func Trailer(md *metadata.MD) CallOption { }) } +// Peer returns a CallOption that retrieves peer information for a +// unary RPC. +func Peer(peer *peer.Peer) CallOption { + return afterCall(func(c *callInfo) { + if c.peer != nil { + *peer = *c.peer + } + }) +} + // FailFast configures the action to take when an RPC is attempted on broken // connections or unreachable servers. If failfast is true, the RPC will fail // immediately. Otherwise, the RPC client will block the call until a // connection is available (or the call is canceled or times out) and will retry // the call if it fails due to a transient error. Please refer to -// https://github.com/grpc/grpc/blob/master/doc/fail_fast.md +// https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md. +// Note: failFast is default to true. func FailFast(failFast bool) CallOption { return beforeCall(func(c *callInfo) error { c.failFast = failFast @@ -194,6 +203,31 @@ func FailFast(failFast bool) CallOption { }) } +// MaxCallRecvMsgSize returns a CallOption which sets the maximum message size the client can receive. +func MaxCallRecvMsgSize(s int) CallOption { + return beforeCall(func(o *callInfo) error { + o.maxReceiveMessageSize = &s + return nil + }) +} + +// MaxCallSendMsgSize returns a CallOption which sets the maximum message size the client can send. +func MaxCallSendMsgSize(s int) CallOption { + return beforeCall(func(o *callInfo) error { + o.maxSendMessageSize = &s + return nil + }) +} + +// PerRPCCredentials returns a CallOption that sets credentials.PerRPCCredentials +// for a call. +func PerRPCCredentials(creds credentials.PerRPCCredentials) CallOption { + return beforeCall(func(c *callInfo) error { + c.creds = creds + return nil + }) +} + // The format of the payload: compressed or not? type payloadFormat uint8 @@ -210,7 +244,7 @@ type parser struct { r io.Reader // The header of a gRPC message. Find more detail - // at http://www.grpc.io/docs/guides/wire.html. + // at https://grpc.io/docs/guides/wire.html. header [5]byte } @@ -227,8 +261,8 @@ type parser struct { // No other error values or types must be returned, which also means // that the underlying io.Reader must not return an incompatible // error. -func (p *parser) recvMsg(maxMsgSize int) (pf payloadFormat, msg []byte, err error) { - if _, err := io.ReadFull(p.r, p.header[:]); err != nil { +func (p *parser) recvMsg(maxReceiveMessageSize int) (pf payloadFormat, msg []byte, err error) { + if _, err := p.r.Read(p.header[:]); err != nil { return 0, nil, err } @@ -238,13 +272,13 @@ func (p *parser) recvMsg(maxMsgSize int) (pf payloadFormat, msg []byte, err erro if length == 0 { return pf, nil, nil } - if length > uint32(maxMsgSize) { - return 0, nil, Errorf(codes.Internal, "grpc: received message length %d exceeding the max size %d", length, maxMsgSize) + if length > uint32(maxReceiveMessageSize) { + return 0, nil, Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", length, maxReceiveMessageSize) } // TODO(bradfitz,zhaoq): garbage. reuse buffer after proto decoding instead // of making it for each message: msg = make([]byte, int(length)) - if _, err := io.ReadFull(p.r, msg); err != nil { + if _, err := p.r.Read(msg); err != nil { if err == io.EOF { err = io.ErrUnexpectedEOF } @@ -255,26 +289,34 @@ func (p *parser) recvMsg(maxMsgSize int) (pf payloadFormat, msg []byte, err erro // encode serializes msg and prepends the message header. If msg is nil, it // generates the message header of 0 message length. -func encode(c Codec, msg interface{}, cp Compressor, cbuf *bytes.Buffer) ([]byte, error) { - var b []byte - var length uint +func encode(c Codec, msg interface{}, cp Compressor, cbuf *bytes.Buffer, outPayload *stats.OutPayload) ([]byte, error) { + var ( + b []byte + length uint + ) if msg != nil { var err error // TODO(zhaoq): optimize to reduce memory alloc and copying. b, err = c.Marshal(msg) if err != nil { - return nil, err + return nil, Errorf(codes.Internal, "grpc: error while marshaling: %v", err.Error()) + } + if outPayload != nil { + outPayload.Payload = msg + // TODO truncate large payload. + outPayload.Data = b + outPayload.Length = len(b) } if cp != nil { if err := cp.Do(cbuf, b); err != nil { - return nil, err + return nil, Errorf(codes.Internal, "grpc: error while compressing: %v", err.Error()) } b = cbuf.Bytes() } length = uint(len(b)) } if length > math.MaxUint32 { - return nil, Errorf(codes.InvalidArgument, "grpc: message too large (%d bytes)", length) + return nil, Errorf(codes.ResourceExhausted, "grpc: message too large (%d bytes)", length) } const ( @@ -295,6 +337,10 @@ func encode(c Codec, msg interface{}, cp Compressor, cbuf *bytes.Buffer) ([]byte // Copy encoded msg to buf copy(buf[5:], b) + if outPayload != nil { + outPayload.WireLength = len(buf) + } + return buf, nil } @@ -311,11 +357,14 @@ func checkRecvPayload(pf payloadFormat, recvCompress string, dc Decompressor) er return nil } -func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{}, maxMsgSize int) error { - pf, d, err := p.recvMsg(maxMsgSize) +func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{}, maxReceiveMessageSize int, inPayload *stats.InPayload) error { + pf, d, err := p.recvMsg(maxReceiveMessageSize) if err != nil { return err } + if inPayload != nil { + inPayload.WireLength = len(d) + } if err := checkRecvPayload(pf, s.RecvCompress(), dc); err != nil { return err } @@ -325,129 +374,142 @@ func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{ return Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err) } } - if len(d) > maxMsgSize { + if len(d) > maxReceiveMessageSize { // TODO: Revisit the error code. Currently keep it consistent with java // implementation. - return Errorf(codes.Internal, "grpc: received a message of %d bytes exceeding %d limit", len(d), maxMsgSize) + return Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", len(d), maxReceiveMessageSize) } if err := c.Unmarshal(d, m); err != nil { return Errorf(codes.Internal, "grpc: failed to unmarshal the received message %v", err) } + if inPayload != nil { + inPayload.RecvTime = time.Now() + inPayload.Payload = m + // TODO truncate large payload. + inPayload.Data = d + inPayload.Length = len(d) + } return nil } -// rpcError defines the status from an RPC. -type rpcError struct { - code codes.Code - desc string +type rpcInfo struct { + bytesSent bool + bytesReceived bool } -func (e *rpcError) Error() string { - return fmt.Sprintf("rpc error: code = %d desc = %s", e.code, e.desc) +type rpcInfoContextKey struct{} + +func newContextWithRPCInfo(ctx context.Context) context.Context { + return context.WithValue(ctx, rpcInfoContextKey{}, &rpcInfo{}) +} + +func rpcInfoFromContext(ctx context.Context) (s *rpcInfo, ok bool) { + s, ok = ctx.Value(rpcInfoContextKey{}).(*rpcInfo) + return +} + +func updateRPCInfoInContext(ctx context.Context, s rpcInfo) { + if ss, ok := rpcInfoFromContext(ctx); ok { + *ss = s + } + return } // Code returns the error code for err if it was produced by the rpc system. // Otherwise, it returns codes.Unknown. +// +// Deprecated; use status.FromError and Code method instead. func Code(err error) codes.Code { - if err == nil { - return codes.OK - } - if e, ok := err.(*rpcError); ok { - return e.code + if s, ok := status.FromError(err); ok { + return s.Code() } return codes.Unknown } // ErrorDesc returns the error description of err if it was produced by the rpc system. // Otherwise, it returns err.Error() or empty string when err is nil. +// +// Deprecated; use status.FromError and Message method instead. func ErrorDesc(err error) string { - if err == nil { - return "" - } - if e, ok := err.(*rpcError); ok { - return e.desc + if s, ok := status.FromError(err); ok { + return s.Message() } return err.Error() } // Errorf returns an error containing an error code and a description; // Errorf returns nil if c is OK. +// +// Deprecated; use status.Errorf instead. func Errorf(c codes.Code, format string, a ...interface{}) error { - if c == codes.OK { - return nil - } - return &rpcError{ - code: c, - desc: fmt.Sprintf(format, a...), - } + return status.Errorf(c, format, a...) } -// toRPCErr converts an error into a rpcError. -func toRPCErr(err error) error { - switch e := err.(type) { - case *rpcError: - return err - case transport.StreamError: - return &rpcError{ - code: e.Code, - desc: e.Desc, - } - case transport.ConnectionError: - return &rpcError{ - code: codes.Internal, - desc: e.Desc, - } - default: - switch err { - case context.DeadlineExceeded: - return &rpcError{ - code: codes.DeadlineExceeded, - desc: err.Error(), - } - case context.Canceled: - return &rpcError{ - code: codes.Canceled, - desc: err.Error(), - } - case ErrClientConnClosing: - return &rpcError{ - code: codes.FailedPrecondition, - desc: err.Error(), - } - } +// MethodConfig defines the configuration recommended by the service providers for a +// particular method. +// This is EXPERIMENTAL and subject to change. +type MethodConfig struct { + // WaitForReady indicates whether RPCs sent to this method should wait until + // the connection is ready by default (!failfast). The value specified via the + // gRPC client API will override the value set here. + WaitForReady *bool + // Timeout is the default timeout for RPCs sent to this method. The actual + // deadline used will be the minimum of the value specified here and the value + // set by the application via the gRPC client API. If either one is not set, + // then the other will be used. If neither is set, then the RPC has no deadline. + Timeout *time.Duration + // MaxReqSize is the maximum allowed payload size for an individual request in a + // stream (client->server) in bytes. The size which is measured is the serialized + // payload after per-message compression (but before stream compression) in bytes. + // The actual value used is the minumum of the value specified here and the value set + // by the application via the gRPC client API. If either one is not set, then the other + // will be used. If neither is set, then the built-in default is used. + MaxReqSize *int + // MaxRespSize is the maximum allowed payload size for an individual response in a + // stream (server->client) in bytes. + MaxRespSize *int +} +// ServiceConfig is provided by the service provider and contains parameters for how +// clients that connect to the service should behave. +// This is EXPERIMENTAL and subject to change. +type ServiceConfig struct { + // LB is the load balancer the service providers recommends. The balancer specified + // via grpc.WithBalancer will override this. + LB Balancer + // Methods contains a map for the methods in this service. + // If there is an exact match for a method (i.e. /service/method) in the map, use the corresponding MethodConfig. + // If there's no exact match, look for the default config for the service (/service/) and use the corresponding MethodConfig if it exists. + // Otherwise, the method has no MethodConfig to use. + Methods map[string]MethodConfig +} + +func min(a, b *int) *int { + if *a < *b { + return a } - return Errorf(codes.Unknown, "%v", err) + return b } -// convertCode converts a standard Go error into its canonical code. Note that -// this is only used to translate the error returned by the server applications. -func convertCode(err error) codes.Code { - switch err { - case nil: - return codes.OK - case io.EOF: - return codes.OutOfRange - case io.ErrClosedPipe, io.ErrNoProgress, io.ErrShortBuffer, io.ErrShortWrite, io.ErrUnexpectedEOF: - return codes.FailedPrecondition - case os.ErrInvalid: - return codes.InvalidArgument - case context.Canceled: - return codes.Canceled - case context.DeadlineExceeded: - return codes.DeadlineExceeded +func getMaxSize(mcMax, doptMax *int, defaultVal int) *int { + if mcMax == nil && doptMax == nil { + return &defaultVal } - switch { - case os.IsExist(err): - return codes.AlreadyExists - case os.IsNotExist(err): - return codes.NotFound - case os.IsPermission(err): - return codes.PermissionDenied + if mcMax != nil && doptMax != nil { + return min(mcMax, doptMax) } - return codes.Unknown + if mcMax != nil { + return mcMax + } + return doptMax } +// SupportPackageIsVersion3 is referenced from generated protocol buffer files. +// The latest support package version is 4. +// SupportPackageIsVersion3 is kept for compability. It will be removed in the +// next support package version update. +const SupportPackageIsVersion3 = true + // SupportPackageIsVersion4 is referenced from generated protocol buffer files // to assert that that code is compatible with this version of the grpc package. // @@ -455,3 +517,8 @@ func convertCode(err error) codes.Code { // requires a synchronised update of grpc-go and protoc-gen-go. This constant // should not be referenced from any other code. const SupportPackageIsVersion4 = true + +// Version is the current grpc version. +const Version = "1.5.1" + +const grpcUA = "grpc-go/" + Version diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go index e0bb187ef9758..5e9da3d952c01 100644 --- a/vendor/google.golang.org/grpc/server.go +++ b/vendor/google.golang.org/grpc/server.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -53,10 +38,19 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal" + "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" + "google.golang.org/grpc/tap" "google.golang.org/grpc/transport" ) +const ( + defaultServerMaxReceiveMessageSize = 1024 * 1024 * 4 + defaultServerMaxSendMessageSize = 1024 * 1024 * 4 +) + type methodHandler func(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor UnaryServerInterceptor) (interface{}, error) // MethodDesc represents an RPC service's method specification. @@ -92,6 +86,7 @@ type Server struct { mu sync.Mutex // guards following lis map[net.Listener]bool conns map[io.Closer]bool + serve bool drain bool ctx context.Context cancel context.CancelFunc @@ -103,22 +98,63 @@ type Server struct { } type options struct { - creds credentials.TransportCredentials - codec Codec - cp Compressor - dc Decompressor - maxMsgSize int - unaryInt UnaryServerInterceptor - streamInt StreamServerInterceptor - maxConcurrentStreams uint32 - useHandlerImpl bool // use http.Handler-based server + creds credentials.TransportCredentials + codec Codec + cp Compressor + dc Decompressor + unaryInt UnaryServerInterceptor + streamInt StreamServerInterceptor + inTapHandle tap.ServerInHandle + statsHandler stats.Handler + maxConcurrentStreams uint32 + maxReceiveMessageSize int + maxSendMessageSize int + useHandlerImpl bool // use http.Handler-based server + unknownStreamDesc *StreamDesc + keepaliveParams keepalive.ServerParameters + keepalivePolicy keepalive.EnforcementPolicy + initialWindowSize int32 + initialConnWindowSize int32 } -var defaultMaxMsgSize = 1024 * 1024 * 4 // use 4MB as the default message size limit +var defaultServerOptions = options{ + maxReceiveMessageSize: defaultServerMaxReceiveMessageSize, + maxSendMessageSize: defaultServerMaxSendMessageSize, +} -// A ServerOption sets options. +// A ServerOption sets options such as credentials, codec and keepalive parameters, etc. type ServerOption func(*options) +// InitialWindowSize returns a ServerOption that sets window size for stream. +// The lower bound for window size is 64K and any value smaller than that will be ignored. +func InitialWindowSize(s int32) ServerOption { + return func(o *options) { + o.initialWindowSize = s + } +} + +// InitialConnWindowSize returns a ServerOption that sets window size for a connection. +// The lower bound for window size is 64K and any value smaller than that will be ignored. +func InitialConnWindowSize(s int32) ServerOption { + return func(o *options) { + o.initialConnWindowSize = s + } +} + +// KeepaliveParams returns a ServerOption that sets keepalive and max-age parameters for the server. +func KeepaliveParams(kp keepalive.ServerParameters) ServerOption { + return func(o *options) { + o.keepaliveParams = kp + } +} + +// KeepaliveEnforcementPolicy returns a ServerOption that sets keepalive enforcement policy for the server. +func KeepaliveEnforcementPolicy(kep keepalive.EnforcementPolicy) ServerOption { + return func(o *options) { + o.keepalivePolicy = kep + } +} + // CustomCodec returns a ServerOption that sets a codec for message marshaling and unmarshaling. func CustomCodec(codec Codec) ServerOption { return func(o *options) { @@ -140,11 +176,25 @@ func RPCDecompressor(dc Decompressor) ServerOption { } } -// MaxMsgSize returns a ServerOption to set the max message size in bytes for inbound mesages. -// If this is not set, gRPC uses the default 4MB. +// MaxMsgSize returns a ServerOption to set the max message size in bytes the server can receive. +// If this is not set, gRPC uses the default limit. Deprecated: use MaxRecvMsgSize instead. func MaxMsgSize(m int) ServerOption { + return MaxRecvMsgSize(m) +} + +// MaxRecvMsgSize returns a ServerOption to set the max message size in bytes the server can receive. +// If this is not set, gRPC uses the default 4MB. +func MaxRecvMsgSize(m int) ServerOption { return func(o *options) { - o.maxMsgSize = m + o.maxReceiveMessageSize = m + } +} + +// MaxSendMsgSize returns a ServerOption to set the max message size in bytes the server can send. +// If this is not set, gRPC uses the default 4MB. +func MaxSendMsgSize(m int) ServerOption { + return func(o *options) { + o.maxSendMessageSize = m } } @@ -169,7 +219,7 @@ func Creds(c credentials.TransportCredentials) ServerOption { func UnaryInterceptor(i UnaryServerInterceptor) ServerOption { return func(o *options) { if o.unaryInt != nil { - panic("The unary server interceptor has been set.") + panic("The unary server interceptor was already set and may not be reset.") } o.unaryInt = i } @@ -180,17 +230,52 @@ func UnaryInterceptor(i UnaryServerInterceptor) ServerOption { func StreamInterceptor(i StreamServerInterceptor) ServerOption { return func(o *options) { if o.streamInt != nil { - panic("The stream server interceptor has been set.") + panic("The stream server interceptor was already set and may not be reset.") } o.streamInt = i } } +// InTapHandle returns a ServerOption that sets the tap handle for all the server +// transport to be created. Only one can be installed. +func InTapHandle(h tap.ServerInHandle) ServerOption { + return func(o *options) { + if o.inTapHandle != nil { + panic("The tap handle was already set and may not be reset.") + } + o.inTapHandle = h + } +} + +// StatsHandler returns a ServerOption that sets the stats handler for the server. +func StatsHandler(h stats.Handler) ServerOption { + return func(o *options) { + o.statsHandler = h + } +} + +// UnknownServiceHandler returns a ServerOption that allows for adding a custom +// unknown service handler. The provided method is a bidi-streaming RPC service +// handler that will be invoked instead of returning the "unimplemented" gRPC +// error whenever a request is received for an unregistered service or method. +// The handling function has full access to the Context of the request and the +// stream, and the invocation passes through interceptors. +func UnknownServiceHandler(streamHandler StreamHandler) ServerOption { + return func(o *options) { + o.unknownStreamDesc = &StreamDesc{ + StreamName: "unknown_service_handler", + Handler: streamHandler, + // We need to assume that the users of the streamHandler will want to use both. + ClientStreams: true, + ServerStreams: true, + } + } +} + // NewServer creates a gRPC server which has no service registered and has not // started to accept requests yet. func NewServer(opt ...ServerOption) *Server { - var opts options - opts.maxMsgSize = defaultMaxMsgSize + opts := defaultServerOptions for _, o := range opt { o(&opts) } @@ -229,8 +314,8 @@ func (s *Server) errorf(format string, a ...interface{}) { } } -// RegisterService register a service and its implementation to the gRPC -// server. Called from the IDL generated code. This must be called before +// RegisterService registers a service and its implementation to the gRPC +// server. It is called from the IDL generated code. This must be called before // invoking Serve. func (s *Server) RegisterService(sd *ServiceDesc, ss interface{}) { ht := reflect.TypeOf(sd.HandlerType).Elem() @@ -245,6 +330,9 @@ func (s *Server) register(sd *ServiceDesc, ss interface{}) { s.mu.Lock() defer s.mu.Unlock() s.printf("RegisterService(%q)", sd.ServiceName) + if s.serve { + grpclog.Fatalf("grpc: Server.RegisterService after Server.Serve for %q", sd.ServiceName) + } if _, ok := s.m[sd.ServiceName]; ok { grpclog.Fatalf("grpc: Server.RegisterService found duplicate service registration for %q", sd.ServiceName) } @@ -275,7 +363,7 @@ type MethodInfo struct { IsServerStream bool } -// ServiceInfo contains unary RPC method info, streaming RPC methid info and metadata for a service. +// ServiceInfo contains unary RPC method info, streaming RPC method info and metadata for a service. type ServiceInfo struct { Methods []MethodInfo // Metadata is the metadata specified in ServiceDesc when registering service. @@ -329,9 +417,11 @@ func (s *Server) useTransportAuthenticator(rawConn net.Conn) (net.Conn, credenti // read gRPC requests and then call the registered handlers to reply to them. // Serve returns when lis.Accept fails with fatal errors. lis will be closed when // this method returns. +// Serve always returns non-nil error. func (s *Server) Serve(lis net.Listener) error { s.mu.Lock() s.printf("serving") + s.serve = true if s.lis == nil { s.mu.Unlock() lis.Close() @@ -367,10 +457,12 @@ func (s *Server) Serve(lis net.Listener) error { s.mu.Lock() s.printf("Accept error: %v; retrying in %v", err, tempDelay) s.mu.Unlock() + timer := time.NewTimer(tempDelay) select { - case <-time.After(tempDelay): + case <-timer.C: case <-s.ctx.Done(): } + timer.Stop() continue } s.mu.Lock() @@ -393,7 +485,7 @@ func (s *Server) handleRawConn(rawConn net.Conn) { s.mu.Lock() s.errorf("ServerHandshake(%q) failed: %v", rawConn.RemoteAddr(), err) s.mu.Unlock() - grpclog.Printf("grpc: Server.Serve failed to complete security handshake from %q: %v", rawConn.RemoteAddr(), err) + grpclog.Warningf("grpc: Server.Serve failed to complete security handshake from %q: %v", rawConn.RemoteAddr(), err) // If serverHandShake returns ErrConnDispatched, keep rawConn open. if err != credentials.ErrConnDispatched { rawConn.Close() @@ -412,23 +504,33 @@ func (s *Server) handleRawConn(rawConn net.Conn) { if s.opts.useHandlerImpl { s.serveUsingHandler(conn) } else { - s.serveNewHTTP2Transport(conn, authInfo) + s.serveHTTP2Transport(conn, authInfo) } } -// serveNewHTTP2Transport sets up a new http/2 transport (using the +// serveHTTP2Transport sets up a http/2 transport (using the // gRPC http2 server transport in transport/http2_server.go) and // serves streams on it. // This is run in its own goroutine (it does network I/O in // transport.NewServerTransport). -func (s *Server) serveNewHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) { - st, err := transport.NewServerTransport("http2", c, s.opts.maxConcurrentStreams, authInfo) +func (s *Server) serveHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) { + config := &transport.ServerConfig{ + MaxStreams: s.opts.maxConcurrentStreams, + AuthInfo: authInfo, + InTapHandle: s.opts.inTapHandle, + StatsHandler: s.opts.statsHandler, + KeepaliveParams: s.opts.keepaliveParams, + KeepalivePolicy: s.opts.keepalivePolicy, + InitialWindowSize: s.opts.initialWindowSize, + InitialConnWindowSize: s.opts.initialConnWindowSize, + } + st, err := transport.NewServerTransport("http2", c, config) if err != nil { s.mu.Lock() s.errorf("NewServerTransport(%q) failed: %v", c.RemoteAddr(), err) s.mu.Unlock() c.Close() - grpclog.Println("grpc: Server.Serve failed to create ServerTransport: ", err) + grpclog.Warningln("grpc: Server.Serve failed to create ServerTransport: ", err) return } if !s.addConn(st) { @@ -448,6 +550,12 @@ func (s *Server) serveStreams(st transport.ServerTransport) { defer wg.Done() s.handleStream(st, stream, s.traceInfo(st, stream)) }() + }, func(ctx context.Context, method string) context.Context { + if !EnableTracing { + return ctx + } + tr := trace.New("grpc.Recv."+methodFamily(method), method) + return trace.NewContext(ctx, tr) }) wg.Wait() } @@ -497,15 +605,17 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // traceInfo returns a traceInfo and associates it with stream, if tracing is enabled. // If tracing is not enabled, it returns nil. func (s *Server) traceInfo(st transport.ServerTransport, stream *transport.Stream) (trInfo *traceInfo) { - if !EnableTracing { + tr, ok := trace.FromContext(stream.Context()) + if !ok { return nil } + trInfo = &traceInfo{ - tr: trace.New("grpc.Recv."+methodFamily(stream.Method()), stream.Method()), + tr: tr, } trInfo.firstLine.client = false trInfo.firstLine.remoteAddr = st.RemoteAddr() - stream.TraceContext(trInfo.tr) + if dl, ok := stream.Context().Deadline(); ok { trInfo.firstLine.deadline = dl.Sub(time.Now()) } @@ -532,25 +642,49 @@ func (s *Server) removeConn(c io.Closer) { } func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Stream, msg interface{}, cp Compressor, opts *transport.Options) error { - var cbuf *bytes.Buffer + var ( + cbuf *bytes.Buffer + outPayload *stats.OutPayload + ) if cp != nil { cbuf = new(bytes.Buffer) } - p, err := encode(s.opts.codec, msg, cp, cbuf) + if s.opts.statsHandler != nil { + outPayload = &stats.OutPayload{} + } + p, err := encode(s.opts.codec, msg, cp, cbuf, outPayload) if err != nil { - // This typically indicates a fatal issue (e.g., memory - // corruption or hardware faults) the application program - // cannot handle. - // - // TODO(zhaoq): There exist other options also such as only closing the - // faulty stream locally and remotely (Other streams can keep going). Find - // the optimal option. - grpclog.Fatalf("grpc: Server failed to encode response %v", err) + grpclog.Errorln("grpc: server failed to encode response: ", err) + return err + } + if len(p) > s.opts.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(p), s.opts.maxSendMessageSize) } - return t.Write(stream, p, opts) + err = t.Write(stream, p, opts) + if err == nil && outPayload != nil { + outPayload.SentTime = time.Now() + s.opts.statsHandler.HandleRPC(stream.Context(), outPayload) + } + return err } func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, md *MethodDesc, trInfo *traceInfo) (err error) { + sh := s.opts.statsHandler + if sh != nil { + begin := &stats.Begin{ + BeginTime: time.Now(), + } + sh.HandleRPC(stream.Context(), begin) + defer func() { + end := &stats.End{ + EndTime: time.Now(), + } + if err != nil && err != io.EOF { + end.Error = toRPCErr(err) + } + sh.HandleRPC(stream.Context(), end) + }() + } if trInfo != nil { defer trInfo.tr.Finish() trInfo.firstLine.client = false @@ -567,133 +701,170 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. stream.SetSendCompress(s.opts.cp.Type()) } p := &parser{r: stream} - for { - pf, req, err := p.recvMsg(s.opts.maxMsgSize) - if err == io.EOF { - // The entire stream is done (for unary RPC only). - return err - } - if err == io.ErrUnexpectedEOF { - err = Errorf(codes.Internal, io.ErrUnexpectedEOF.Error()) - } - if err != nil { - switch err := err.(type) { - case *rpcError: - if err := t.WriteStatus(stream, err.code, err.desc); err != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", err) - } + pf, req, err := p.recvMsg(s.opts.maxReceiveMessageSize) + if err == io.EOF { + // The entire stream is done (for unary RPC only). + return err + } + if err == io.ErrUnexpectedEOF { + err = Errorf(codes.Internal, io.ErrUnexpectedEOF.Error()) + } + if err != nil { + if st, ok := status.FromError(err); ok { + if e := t.WriteStatus(stream, st); e != nil { + grpclog.Warningf("grpc: Server.processUnaryRPC failed to write status %v", e) + } + } else { + switch st := err.(type) { case transport.ConnectionError: // Nothing to do here. case transport.StreamError: - if err := t.WriteStatus(stream, err.Code, err.Desc); err != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", err) + if e := t.WriteStatus(stream, status.New(st.Code, st.Desc)); e != nil { + grpclog.Warningf("grpc: Server.processUnaryRPC failed to write status %v", e) } default: - panic(fmt.Sprintf("grpc: Unexpected error (%T) from recvMsg: %v", err, err)) + panic(fmt.Sprintf("grpc: Unexpected error (%T) from recvMsg: %v", st, st)) } - return err } + return err + } - if err := checkRecvPayload(pf, stream.RecvCompress(), s.opts.dc); err != nil { - switch err := err.(type) { - case *rpcError: - if err := t.WriteStatus(stream, err.code, err.desc); err != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", err) - } - default: - if err := t.WriteStatus(stream, codes.Internal, err.Error()); err != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", err) - } - + if err := checkRecvPayload(pf, stream.RecvCompress(), s.opts.dc); err != nil { + if st, ok := status.FromError(err); ok { + if e := t.WriteStatus(stream, st); e != nil { + grpclog.Warningf("grpc: Server.processUnaryRPC failed to write status %v", e) } return err } - statusCode := codes.OK - statusDesc := "" - df := func(v interface{}) error { - if pf == compressionMade { - var err error - req, err = s.opts.dc.Do(bytes.NewReader(req)) - if err != nil { - if err := t.WriteStatus(stream, codes.Internal, err.Error()); err != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", err) - } - return err - } - } - if len(req) > s.opts.maxMsgSize { - // TODO: Revisit the error code. Currently keep it consistent with - // java implementation. - statusCode = codes.Internal - statusDesc = fmt.Sprintf("grpc: server received a message of %d bytes exceeding %d limit", len(req), s.opts.maxMsgSize) - } - if err := s.opts.codec.Unmarshal(req, v); err != nil { - return err - } - if trInfo != nil { - trInfo.tr.LazyLog(&payload{sent: false, msg: v}, true) - } - return nil - } - reply, appErr := md.Handler(srv.server, stream.Context(), df, s.opts.unaryInt) - if appErr != nil { - if err, ok := appErr.(*rpcError); ok { - statusCode = err.code - statusDesc = err.desc - } else { - statusCode = convertCode(appErr) - statusDesc = appErr.Error() - } - if trInfo != nil && statusCode != codes.OK { - trInfo.tr.LazyLog(stringer(statusDesc), true) - trInfo.tr.SetError() - } - if err := t.WriteStatus(stream, statusCode, statusDesc); err != nil { - grpclog.Printf("grpc: Server.processUnaryRPC failed to write status: %v", err) - return err + if e := t.WriteStatus(stream, status.New(codes.Internal, err.Error())); e != nil { + grpclog.Warningf("grpc: Server.processUnaryRPC failed to write status %v", e) + } + + // TODO checkRecvPayload always return RPC error. Add a return here if necessary. + } + var inPayload *stats.InPayload + if sh != nil { + inPayload = &stats.InPayload{ + RecvTime: time.Now(), + } + } + df := func(v interface{}) error { + if inPayload != nil { + inPayload.WireLength = len(req) + } + if pf == compressionMade { + var err error + req, err = s.opts.dc.Do(bytes.NewReader(req)) + if err != nil { + return Errorf(codes.Internal, err.Error()) } - return nil + } + if len(req) > s.opts.maxReceiveMessageSize { + // TODO: Revisit the error code. Currently keep it consistent with + // java implementation. + return status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", len(req), s.opts.maxReceiveMessageSize) + } + if err := s.opts.codec.Unmarshal(req, v); err != nil { + return status.Errorf(codes.Internal, "grpc: error unmarshalling request: %v", err) + } + if inPayload != nil { + inPayload.Payload = v + inPayload.Data = req + inPayload.Length = len(req) + sh.HandleRPC(stream.Context(), inPayload) } if trInfo != nil { - trInfo.tr.LazyLog(stringer("OK"), false) + trInfo.tr.LazyLog(&payload{sent: false, msg: v}, true) } - opts := &transport.Options{ - Last: true, - Delay: false, + return nil + } + reply, appErr := md.Handler(srv.server, stream.Context(), df, s.opts.unaryInt) + if appErr != nil { + appStatus, ok := status.FromError(appErr) + if !ok { + // Convert appErr if it is not a grpc status error. + appErr = status.Error(convertCode(appErr), appErr.Error()) + appStatus, _ = status.FromError(appErr) + } + if trInfo != nil { + trInfo.tr.LazyLog(stringer(appStatus.Message()), true) + trInfo.tr.SetError() + } + if e := t.WriteStatus(stream, appStatus); e != nil { + grpclog.Warningf("grpc: Server.processUnaryRPC failed to write status: %v", e) + } + return appErr + } + if trInfo != nil { + trInfo.tr.LazyLog(stringer("OK"), false) + } + opts := &transport.Options{ + Last: true, + Delay: false, + } + if err := s.sendResponse(t, stream, reply, s.opts.cp, opts); err != nil { + if err == io.EOF { + // The entire stream is done (for unary RPC only). + return err } - if err := s.sendResponse(t, stream, reply, s.opts.cp, opts); err != nil { - switch err := err.(type) { + if s, ok := status.FromError(err); ok { + if e := t.WriteStatus(stream, s); e != nil { + grpclog.Warningf("grpc: Server.processUnaryRPC failed to write status: %v", e) + } + } else { + switch st := err.(type) { case transport.ConnectionError: // Nothing to do here. case transport.StreamError: - statusCode = err.Code - statusDesc = err.Desc + if e := t.WriteStatus(stream, status.New(st.Code, st.Desc)); e != nil { + grpclog.Warningf("grpc: Server.processUnaryRPC failed to write status %v", e) + } default: - statusCode = codes.Unknown - statusDesc = err.Error() + panic(fmt.Sprintf("grpc: Unexpected error (%T) from sendResponse: %v", st, st)) } - return err - } - if trInfo != nil { - trInfo.tr.LazyLog(&payload{sent: true, msg: reply}, true) } - return t.WriteStatus(stream, statusCode, statusDesc) + return err + } + if trInfo != nil { + trInfo.tr.LazyLog(&payload{sent: true, msg: reply}, true) } + // TODO: Should we be logging if writing status failed here, like above? + // Should the logging be in WriteStatus? Should we ignore the WriteStatus + // error or allow the stats handler to see it? + return t.WriteStatus(stream, status.New(codes.OK, "")) } func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transport.Stream, srv *service, sd *StreamDesc, trInfo *traceInfo) (err error) { + sh := s.opts.statsHandler + if sh != nil { + begin := &stats.Begin{ + BeginTime: time.Now(), + } + sh.HandleRPC(stream.Context(), begin) + defer func() { + end := &stats.End{ + EndTime: time.Now(), + } + if err != nil && err != io.EOF { + end.Error = toRPCErr(err) + } + sh.HandleRPC(stream.Context(), end) + }() + } if s.opts.cp != nil { stream.SetSendCompress(s.opts.cp.Type()) } ss := &serverStream{ - t: t, - s: stream, - p: &parser{r: stream}, - codec: s.opts.codec, - cp: s.opts.cp, - dc: s.opts.dc, - maxMsgSize: s.opts.maxMsgSize, - trInfo: trInfo, + t: t, + s: stream, + p: &parser{r: stream}, + codec: s.opts.codec, + cp: s.opts.cp, + dc: s.opts.dc, + maxReceiveMessageSize: s.opts.maxReceiveMessageSize, + maxSendMessageSize: s.opts.maxSendMessageSize, + trInfo: trInfo, + statsHandler: sh, } if ss.cp != nil { ss.cbuf = new(bytes.Buffer) @@ -712,39 +883,47 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp }() } var appErr error + var server interface{} + if srv != nil { + server = srv.server + } if s.opts.streamInt == nil { - appErr = sd.Handler(srv.server, ss) + appErr = sd.Handler(server, ss) } else { info := &StreamServerInfo{ FullMethod: stream.Method(), IsClientStream: sd.ClientStreams, IsServerStream: sd.ServerStreams, } - appErr = s.opts.streamInt(srv.server, ss, info, sd.Handler) + appErr = s.opts.streamInt(server, ss, info, sd.Handler) } if appErr != nil { - if err, ok := appErr.(*rpcError); ok { - ss.statusCode = err.code - ss.statusDesc = err.desc - } else if err, ok := appErr.(transport.StreamError); ok { - ss.statusCode = err.Code - ss.statusDesc = err.Desc - } else { - ss.statusCode = convertCode(appErr) - ss.statusDesc = appErr.Error() + appStatus, ok := status.FromError(appErr) + if !ok { + switch err := appErr.(type) { + case transport.StreamError: + appStatus = status.New(err.Code, err.Desc) + default: + appStatus = status.New(convertCode(appErr), appErr.Error()) + } + appErr = appStatus.Err() } + if trInfo != nil { + ss.mu.Lock() + ss.trInfo.tr.LazyLog(stringer(appStatus.Message()), true) + ss.trInfo.tr.SetError() + ss.mu.Unlock() + } + t.WriteStatus(ss.s, appStatus) + // TODO: Should we log an error from WriteStatus here and below? + return appErr } if trInfo != nil { ss.mu.Lock() - if ss.statusCode != codes.OK { - ss.trInfo.tr.LazyLog(stringer(ss.statusDesc), true) - ss.trInfo.tr.SetError() - } else { - ss.trInfo.tr.LazyLog(stringer("OK"), false) - } + ss.trInfo.tr.LazyLog(stringer("OK"), false) ss.mu.Unlock() } - return t.WriteStatus(ss.s, ss.statusCode, ss.statusDesc) + return t.WriteStatus(ss.s, status.New(codes.OK, "")) } @@ -759,12 +938,13 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str trInfo.tr.LazyLog(&fmtStringer{"Malformed method name %q", []interface{}{sm}}, true) trInfo.tr.SetError() } - if err := t.WriteStatus(stream, codes.InvalidArgument, fmt.Sprintf("malformed method name: %q", stream.Method())); err != nil { + errDesc := fmt.Sprintf("malformed method name: %q", stream.Method()) + if err := t.WriteStatus(stream, status.New(codes.ResourceExhausted, errDesc)); err != nil { if trInfo != nil { trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) trInfo.tr.SetError() } - grpclog.Printf("grpc: Server.handleStream failed to write status: %v", err) + grpclog.Warningf("grpc: Server.handleStream failed to write status: %v", err) } if trInfo != nil { trInfo.tr.Finish() @@ -775,16 +955,21 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str method := sm[pos+1:] srv, ok := s.m[service] if !ok { + if unknownDesc := s.opts.unknownStreamDesc; unknownDesc != nil { + s.processStreamingRPC(t, stream, nil, unknownDesc, trInfo) + return + } if trInfo != nil { trInfo.tr.LazyLog(&fmtStringer{"Unknown service %v", []interface{}{service}}, true) trInfo.tr.SetError() } - if err := t.WriteStatus(stream, codes.Unimplemented, fmt.Sprintf("unknown service %v", service)); err != nil { + errDesc := fmt.Sprintf("unknown service %v", service) + if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { if trInfo != nil { trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) trInfo.tr.SetError() } - grpclog.Printf("grpc: Server.handleStream failed to write status: %v", err) + grpclog.Warningf("grpc: Server.handleStream failed to write status: %v", err) } if trInfo != nil { trInfo.tr.Finish() @@ -804,12 +989,17 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str trInfo.tr.LazyLog(&fmtStringer{"Unknown method %v", []interface{}{method}}, true) trInfo.tr.SetError() } - if err := t.WriteStatus(stream, codes.Unimplemented, fmt.Sprintf("unknown method %v", method)); err != nil { + if unknownDesc := s.opts.unknownStreamDesc; unknownDesc != nil { + s.processStreamingRPC(t, stream, nil, unknownDesc, trInfo) + return + } + errDesc := fmt.Sprintf("unknown method %v", method) + if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { if trInfo != nil { trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) trInfo.tr.SetError() } - grpclog.Printf("grpc: Server.handleStream failed to write status: %v", err) + grpclog.Warningf("grpc: Server.handleStream failed to write status: %v", err) } if trInfo != nil { trInfo.tr.Finish() @@ -847,8 +1037,9 @@ func (s *Server) Stop() { s.mu.Unlock() } -// GracefulStop stops the gRPC server gracefully. It stops the server to accept new -// connections and RPCs and blocks until all the pending RPCs are finished. +// GracefulStop stops the gRPC server gracefully. It stops the server from +// accepting new connections and RPCs and blocks until all the pending RPCs are +// finished. func (s *Server) GracefulStop() { s.mu.Lock() defer s.mu.Unlock() diff --git a/vendor/google.golang.org/grpc/stats/BUILD b/vendor/google.golang.org/grpc/stats/BUILD new file mode 100644 index 0000000000000..e1b7d95367061 --- /dev/null +++ b/vendor/google.golang.org/grpc/stats/BUILD @@ -0,0 +1,31 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "handlers.go", + "stats.go", + ], + tags = ["automanaged"], + deps = ["//vendor/golang.org/x/net/context:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/vendor/google.golang.org/grpc/stats/handlers.go b/vendor/google.golang.org/grpc/stats/handlers.go new file mode 100644 index 0000000000000..05b384c693186 --- /dev/null +++ b/vendor/google.golang.org/grpc/stats/handlers.go @@ -0,0 +1,64 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package stats + +import ( + "net" + + "golang.org/x/net/context" +) + +// ConnTagInfo defines the relevant information needed by connection context tagger. +type ConnTagInfo struct { + // RemoteAddr is the remote address of the corresponding connection. + RemoteAddr net.Addr + // LocalAddr is the local address of the corresponding connection. + LocalAddr net.Addr +} + +// RPCTagInfo defines the relevant information needed by RPC context tagger. +type RPCTagInfo struct { + // FullMethodName is the RPC method in the format of /package.service/method. + FullMethodName string + // FailFast indicates if this RPC is failfast. + // This field is only valid on client side, it's always false on server side. + FailFast bool +} + +// Handler defines the interface for the related stats handling (e.g., RPCs, connections). +type Handler interface { + // TagRPC can attach some information to the given context. + // The context used for the rest lifetime of the RPC will be derived from + // the returned context. + TagRPC(context.Context, *RPCTagInfo) context.Context + // HandleRPC processes the RPC stats. + HandleRPC(context.Context, RPCStats) + + // TagConn can attach some information to the given context. + // The returned context will be used for stats handling. + // For conn stats handling, the context used in HandleConn for this + // connection will be derived from the context returned. + // For RPC stats handling, + // - On server side, the context used in HandleRPC for all RPCs on this + // connection will be derived from the context returned. + // - On client side, the context is not derived from the context returned. + TagConn(context.Context, *ConnTagInfo) context.Context + // HandleConn processes the Conn stats. + HandleConn(context.Context, ConnStats) +} diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go new file mode 100644 index 0000000000000..b0aa5278ae57a --- /dev/null +++ b/vendor/google.golang.org/grpc/stats/stats.go @@ -0,0 +1,208 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package stats is for collecting and reporting various network and RPC stats. +// This package is for monitoring purpose only. All fields are read-only. +// All APIs are experimental. +package stats + +import ( + "net" + "time" +) + +// RPCStats contains stats information about RPCs. +type RPCStats interface { + isRPCStats() + // IsClient returns true if this RPCStats is from client side. + IsClient() bool +} + +// Begin contains stats when an RPC begins. +// FailFast is only valid if this Begin is from client side. +type Begin struct { + // Client is true if this Begin is from client side. + Client bool + // BeginTime is the time when the RPC begins. + BeginTime time.Time + // FailFast indicates if this RPC is failfast. + FailFast bool +} + +// IsClient indicates if the stats information is from client side. +func (s *Begin) IsClient() bool { return s.Client } + +func (s *Begin) isRPCStats() {} + +// InPayload contains the information for an incoming payload. +type InPayload struct { + // Client is true if this InPayload is from client side. + Client bool + // Payload is the payload with original type. + Payload interface{} + // Data is the serialized message payload. + Data []byte + // Length is the length of uncompressed data. + Length int + // WireLength is the length of data on wire (compressed, signed, encrypted). + WireLength int + // RecvTime is the time when the payload is received. + RecvTime time.Time +} + +// IsClient indicates if the stats information is from client side. +func (s *InPayload) IsClient() bool { return s.Client } + +func (s *InPayload) isRPCStats() {} + +// InHeader contains stats when a header is received. +type InHeader struct { + // Client is true if this InHeader is from client side. + Client bool + // WireLength is the wire length of header. + WireLength int + + // The following fields are valid only if Client is false. + // FullMethod is the full RPC method string, i.e., /package.service/method. + FullMethod string + // RemoteAddr is the remote address of the corresponding connection. + RemoteAddr net.Addr + // LocalAddr is the local address of the corresponding connection. + LocalAddr net.Addr + // Compression is the compression algorithm used for the RPC. + Compression string +} + +// IsClient indicates if the stats information is from client side. +func (s *InHeader) IsClient() bool { return s.Client } + +func (s *InHeader) isRPCStats() {} + +// InTrailer contains stats when a trailer is received. +type InTrailer struct { + // Client is true if this InTrailer is from client side. + Client bool + // WireLength is the wire length of trailer. + WireLength int +} + +// IsClient indicates if the stats information is from client side. +func (s *InTrailer) IsClient() bool { return s.Client } + +func (s *InTrailer) isRPCStats() {} + +// OutPayload contains the information for an outgoing payload. +type OutPayload struct { + // Client is true if this OutPayload is from client side. + Client bool + // Payload is the payload with original type. + Payload interface{} + // Data is the serialized message payload. + Data []byte + // Length is the length of uncompressed data. + Length int + // WireLength is the length of data on wire (compressed, signed, encrypted). + WireLength int + // SentTime is the time when the payload is sent. + SentTime time.Time +} + +// IsClient indicates if this stats information is from client side. +func (s *OutPayload) IsClient() bool { return s.Client } + +func (s *OutPayload) isRPCStats() {} + +// OutHeader contains stats when a header is sent. +type OutHeader struct { + // Client is true if this OutHeader is from client side. + Client bool + // WireLength is the wire length of header. + WireLength int + + // The following fields are valid only if Client is true. + // FullMethod is the full RPC method string, i.e., /package.service/method. + FullMethod string + // RemoteAddr is the remote address of the corresponding connection. + RemoteAddr net.Addr + // LocalAddr is the local address of the corresponding connection. + LocalAddr net.Addr + // Compression is the compression algorithm used for the RPC. + Compression string +} + +// IsClient indicates if this stats information is from client side. +func (s *OutHeader) IsClient() bool { return s.Client } + +func (s *OutHeader) isRPCStats() {} + +// OutTrailer contains stats when a trailer is sent. +type OutTrailer struct { + // Client is true if this OutTrailer is from client side. + Client bool + // WireLength is the wire length of trailer. + WireLength int +} + +// IsClient indicates if this stats information is from client side. +func (s *OutTrailer) IsClient() bool { return s.Client } + +func (s *OutTrailer) isRPCStats() {} + +// End contains stats when an RPC ends. +type End struct { + // Client is true if this End is from client side. + Client bool + // EndTime is the time when the RPC ends. + EndTime time.Time + // Error is the error just happened. It implements status.Status if non-nil. + Error error +} + +// IsClient indicates if this is from client side. +func (s *End) IsClient() bool { return s.Client } + +func (s *End) isRPCStats() {} + +// ConnStats contains stats information about connections. +type ConnStats interface { + isConnStats() + // IsClient returns true if this ConnStats is from client side. + IsClient() bool +} + +// ConnBegin contains the stats of a connection when it is established. +type ConnBegin struct { + // Client is true if this ConnBegin is from client side. + Client bool +} + +// IsClient indicates if this is from client side. +func (s *ConnBegin) IsClient() bool { return s.Client } + +func (s *ConnBegin) isConnStats() {} + +// ConnEnd contains the stats of a connection when it ends. +type ConnEnd struct { + // Client is true if this ConnEnd is from client side. + Client bool +} + +// IsClient indicates if this is from client side. +func (s *ConnEnd) IsClient() bool { return s.Client } + +func (s *ConnEnd) isConnStats() {} diff --git a/vendor/google.golang.org/grpc/status/BUILD b/vendor/google.golang.org/grpc/status/BUILD new file mode 100644 index 0000000000000..50ed9feea9d45 --- /dev/null +++ b/vendor/google.golang.org/grpc/status/BUILD @@ -0,0 +1,32 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["status.go"], + tags = ["automanaged"], + deps = [ + "//vendor/github.com/golang/protobuf/proto:go_default_library", + "//vendor/google.golang.org/genproto/googleapis/rpc/status:go_default_library", + "//vendor/google.golang.org/grpc/codes:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/vendor/google.golang.org/grpc/status/status.go b/vendor/google.golang.org/grpc/status/status.go new file mode 100644 index 0000000000000..68a3ac2f04dfc --- /dev/null +++ b/vendor/google.golang.org/grpc/status/status.go @@ -0,0 +1,130 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package status implements errors returned by gRPC. These errors are +// serialized and transmitted on the wire between server and client, and allow +// for additional data to be transmitted via the Details field in the status +// proto. gRPC service handlers should return an error created by this +// package, and gRPC clients should expect a corresponding error to be +// returned from the RPC call. +// +// This package upholds the invariants that a non-nil error may not +// contain an OK code, and an OK code must result in a nil error. +package status + +import ( + "fmt" + + "github.com/golang/protobuf/proto" + spb "google.golang.org/genproto/googleapis/rpc/status" + "google.golang.org/grpc/codes" +) + +// statusError is an alias of a status proto. It implements error and Status, +// and a nil statusError should never be returned by this package. +type statusError spb.Status + +func (se *statusError) Error() string { + p := (*spb.Status)(se) + return fmt.Sprintf("rpc error: code = %s desc = %s", codes.Code(p.GetCode()), p.GetMessage()) +} + +func (se *statusError) status() *Status { + return &Status{s: (*spb.Status)(se)} +} + +// Status represents an RPC status code, message, and details. It is immutable +// and should be created with New, Newf, or FromProto. +type Status struct { + s *spb.Status +} + +// Code returns the status code contained in s. +func (s *Status) Code() codes.Code { + if s == nil || s.s == nil { + return codes.OK + } + return codes.Code(s.s.Code) +} + +// Message returns the message contained in s. +func (s *Status) Message() string { + if s == nil || s.s == nil { + return "" + } + return s.s.Message +} + +// Proto returns s's status as an spb.Status proto message. +func (s *Status) Proto() *spb.Status { + if s == nil { + return nil + } + return proto.Clone(s.s).(*spb.Status) +} + +// Err returns an immutable error representing s; returns nil if s.Code() is +// OK. +func (s *Status) Err() error { + if s.Code() == codes.OK { + return nil + } + return (*statusError)(s.s) +} + +// New returns a Status representing c and msg. +func New(c codes.Code, msg string) *Status { + return &Status{s: &spb.Status{Code: int32(c), Message: msg}} +} + +// Newf returns New(c, fmt.Sprintf(format, a...)). +func Newf(c codes.Code, format string, a ...interface{}) *Status { + return New(c, fmt.Sprintf(format, a...)) +} + +// Error returns an error representing c and msg. If c is OK, returns nil. +func Error(c codes.Code, msg string) error { + return New(c, msg).Err() +} + +// Errorf returns Error(c, fmt.Sprintf(format, a...)). +func Errorf(c codes.Code, format string, a ...interface{}) error { + return Error(c, fmt.Sprintf(format, a...)) +} + +// ErrorProto returns an error representing s. If s.Code is OK, returns nil. +func ErrorProto(s *spb.Status) error { + return FromProto(s).Err() +} + +// FromProto returns a Status representing s. +func FromProto(s *spb.Status) *Status { + return &Status{s: proto.Clone(s).(*spb.Status)} +} + +// FromError returns a Status representing err if it was produced from this +// package, otherwise it returns nil, false. +func FromError(err error) (s *Status, ok bool) { + if err == nil { + return &Status{s: &spb.Status{Code: int32(codes.OK)}}, true + } + if s, ok := err.(*statusError); ok { + return s.status(), true + } + return nil, false +} diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index 46810544f19f7..1c621ba875a28 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -37,7 +22,6 @@ import ( "bytes" "errors" "io" - "math" "sync" "time" @@ -45,6 +29,9 @@ import ( "golang.org/x/net/trace" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" "google.golang.org/grpc/transport" ) @@ -72,11 +59,17 @@ type Stream interface { // side. On server side, it simply returns the error to the caller. // SendMsg is called by generated code. Also Users can call SendMsg // directly when it is really needed in their use cases. + // It's safe to have a goroutine calling SendMsg and another goroutine calling + // recvMsg on the same stream at the same time. + // But it is not safe to call SendMsg on the same stream in different goroutines. SendMsg(m interface{}) error // RecvMsg blocks until it receives a message or the stream is // done. On client side, it returns io.EOF when the stream is done. On // any other error, it aborts the stream and returns an RPC status. On // server side, it simply returns the error to the caller. + // It's safe to have a goroutine calling SendMsg and another goroutine calling + // recvMsg on the same stream at the same time. + // But it is not safe to call RecvMsg on the same stream in different goroutines. RecvMsg(m interface{}) error } @@ -92,12 +85,17 @@ type ClientStream interface { // CloseSend closes the send direction of the stream. It closes the stream // when non-nil error is met. CloseSend() error + // Stream.SendMsg() may return a non-nil error when something wrong happens sending + // the request. The returned error indicates the status of this sending, not the final + // status of the RPC. + // Always call Stream.RecvMsg() to get the final status if you care about the status of + // the RPC. Stream } // NewClientStream creates a new Stream for the client side. This is called // by generated code. -func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error) { +func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (_ ClientStream, err error) { if cc.dopts.streamInt != nil { return cc.dopts.streamInt(ctx, desc, cc, method, newClientStream, opts...) } @@ -106,24 +104,45 @@ func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (_ ClientStream, err error) { var ( - t transport.ClientTransport - s *transport.Stream - put func() + t transport.ClientTransport + s *transport.Stream + put func() + cancel context.CancelFunc ) c := defaultCallInfo + mc := cc.GetMethodConfig(method) + if mc.WaitForReady != nil { + c.failFast = !*mc.WaitForReady + } + + if mc.Timeout != nil { + ctx, cancel = context.WithTimeout(ctx, *mc.Timeout) + } + + opts = append(cc.dopts.callOptions, opts...) for _, o := range opts { if err := o.before(&c); err != nil { return nil, toRPCErr(err) } } + c.maxSendMessageSize = getMaxSize(mc.MaxReqSize, c.maxSendMessageSize, defaultClientMaxSendMessageSize) + c.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) + callHdr := &transport.CallHdr{ Host: cc.authority, Method: method, - Flush: desc.ServerStreams && desc.ClientStreams, + // If it's not client streaming, we should already have the request to be sent, + // so we don't flush the header. + // If it's client streaming, the user may never send a request or send it any + // time soon, so we ask the transport to flush the header. + Flush: desc.ClientStreams, } if cc.dopts.cp != nil { callHdr.SendCompress = cc.dopts.cp.Type() } + if c.creds != nil { + callHdr.Creds = c.creds + } var trInfo traceInfo if EnableTracing { trInfo.tr = trace.New("grpc.Sent."+methodFamily(method), method) @@ -143,6 +162,27 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth } }() } + ctx = newContextWithRPCInfo(ctx) + sh := cc.dopts.copts.StatsHandler + if sh != nil { + ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast}) + begin := &stats.Begin{ + Client: true, + BeginTime: time.Now(), + FailFast: c.failFast, + } + sh.HandleRPC(ctx, begin) + defer func() { + if err != nil { + // Only handle end stats if err != nil. + end := &stats.End{ + Client: true, + Error: err, + } + sh.HandleRPC(ctx, end) + } + }() + } gopts := BalancerGetOptions{ BlockingWait: !c.failFast, } @@ -150,7 +190,7 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth t, put, err = cc.getTransport(ctx, gopts) if err != nil { // TODO(zhaoq): Probably revisit the error handling. - if _, ok := err.(*rpcError); ok { + if _, ok := status.FromError(err); ok { return nil, err } if err == errConnClosing || err == errConnUnavailable { @@ -165,27 +205,35 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth s, err = t.NewStream(ctx, callHdr) if err != nil { + if _, ok := err.(transport.ConnectionError); ok && put != nil { + // If error is connection error, transport was sending data on wire, + // and we are not sure if anything has been sent on wire. + // If error is not connection error, we are sure nothing has been sent. + updateRPCInfoInContext(ctx, rpcInfo{bytesSent: true, bytesReceived: false}) + } if put != nil { put() put = nil } - if _, ok := err.(transport.ConnectionError); ok || err == transport.ErrStreamDrain { - if c.failFast { - return nil, toRPCErr(err) - } + if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast { continue } return nil, toRPCErr(err) } break } + // Set callInfo.peer object from stream's context. + if peer, ok := peer.FromContext(s.Context()); ok { + c.peer = peer + } cs := &clientStream{ - opts: opts, - c: c, - desc: desc, - codec: cc.dopts.codec, - cp: cc.dopts.cp, - dc: cc.dopts.dc, + opts: opts, + c: c, + desc: desc, + codec: cc.dopts.codec, + cp: cc.dopts.cp, + dc: cc.dopts.dc, + cancel: cancel, put: put, t: t, @@ -194,6 +242,9 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth tracing: EnableTracing, trInfo: trInfo, + + statsCtx: ctx, + statsHandler: cc.dopts.copts.StatsHandler, } if cc.dopts.cp != nil { cs.cbuf = new(bytes.Buffer) @@ -204,14 +255,13 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth select { case <-t.Error(): // Incur transport error, simply exit. + case <-cc.ctx.Done(): + cs.finish(ErrClientConnClosing) + cs.closeTransportStream(ErrClientConnClosing) case <-s.Done(): // TODO: The trace of the RPC is terminated here when there is no pending // I/O, which is probably not the optimal solution. - if s.StatusCode() == codes.OK { - cs.finish(nil) - } else { - cs.finish(Errorf(s.StatusCode(), "%s", s.StatusDesc())) - } + cs.finish(s.Status().Err()) cs.closeTransportStream(nil) case <-s.GoAway(): cs.finish(errConnDrain) @@ -227,25 +277,33 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth // clientStream implements a client side Stream. type clientStream struct { - opts []CallOption - c callInfo - t transport.ClientTransport - s *transport.Stream - p *parser - desc *StreamDesc - codec Codec - cp Compressor - cbuf *bytes.Buffer - dc Decompressor + opts []CallOption + c callInfo + t transport.ClientTransport + s *transport.Stream + p *parser + desc *StreamDesc + codec Codec + cp Compressor + cbuf *bytes.Buffer + dc Decompressor + cancel context.CancelFunc tracing bool // set to EnableTracing when the clientStream is created. - mu sync.Mutex - put func() - closed bool + mu sync.Mutex + put func() + closed bool + finished bool // trInfo.tr is set when the clientStream is created (if EnableTracing is true), // and is set to nil when the clientStream's finish method is called. trInfo traceInfo + + // statsCtx keeps the user context for stats handling. + // All stats collection should use the statsCtx (instead of the stream context) + // so that all the generated stats for a particular RPC can be associated in the processing phase. + statsCtx context.Context + statsHandler stats.Handler } func (cs *clientStream) Context() context.Context { @@ -274,6 +332,8 @@ func (cs *clientStream) SendMsg(m interface{}) (err error) { } cs.mu.Unlock() } + // TODO Investigate how to signal the stats handling party. + // generate error stats if err != nil && err != io.EOF? defer func() { if err != nil { cs.finish(err) @@ -296,20 +356,46 @@ func (cs *clientStream) SendMsg(m interface{}) (err error) { } err = toRPCErr(err) }() - out, err := encode(cs.codec, m, cs.cp, cs.cbuf) + var outPayload *stats.OutPayload + if cs.statsHandler != nil { + outPayload = &stats.OutPayload{ + Client: true, + } + } + out, err := encode(cs.codec, m, cs.cp, cs.cbuf, outPayload) defer func() { if cs.cbuf != nil { cs.cbuf.Reset() } }() if err != nil { - return Errorf(codes.Internal, "grpc: %v", err) + return err + } + if cs.c.maxSendMessageSize == nil { + return Errorf(codes.Internal, "callInfo maxSendMessageSize field uninitialized(nil)") } - return cs.t.Write(cs.s, out, &transport.Options{Last: false}) + if len(out) > *cs.c.maxSendMessageSize { + return Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(out), *cs.c.maxSendMessageSize) + } + err = cs.t.Write(cs.s, out, &transport.Options{Last: false}) + if err == nil && outPayload != nil { + outPayload.SentTime = time.Now() + cs.statsHandler.HandleRPC(cs.statsCtx, outPayload) + } + return err } func (cs *clientStream) RecvMsg(m interface{}) (err error) { - err = recv(cs.p, cs.codec, cs.s, cs.dc, m, math.MaxInt32) + var inPayload *stats.InPayload + if cs.statsHandler != nil { + inPayload = &stats.InPayload{ + Client: true, + } + } + if cs.c.maxReceiveMessageSize == nil { + return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)") + } + err = recv(cs.p, cs.codec, cs.s, cs.dc, m, *cs.c.maxReceiveMessageSize, inPayload) defer func() { // err != nil indicates the termination of the stream. if err != nil { @@ -324,21 +410,28 @@ func (cs *clientStream) RecvMsg(m interface{}) (err error) { } cs.mu.Unlock() } + if inPayload != nil { + cs.statsHandler.HandleRPC(cs.statsCtx, inPayload) + } if !cs.desc.ClientStreams || cs.desc.ServerStreams { return } // Special handling for client streaming rpc. - err = recv(cs.p, cs.codec, cs.s, cs.dc, m, math.MaxInt32) + // This recv expects EOF or errors, so we don't collect inPayload. + if cs.c.maxReceiveMessageSize == nil { + return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)") + } + err = recv(cs.p, cs.codec, cs.s, cs.dc, m, *cs.c.maxReceiveMessageSize, nil) cs.closeTransportStream(err) if err == nil { return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want ")) } if err == io.EOF { - if cs.s.StatusCode() == codes.OK { - cs.finish(err) - return nil + if se := cs.s.Status().Err(); se != nil { + return se } - return Errorf(cs.s.StatusCode(), "%s", cs.s.StatusDesc()) + cs.finish(err) + return nil } return toRPCErr(err) } @@ -346,11 +439,11 @@ func (cs *clientStream) RecvMsg(m interface{}) (err error) { cs.closeTransportStream(err) } if err == io.EOF { - if cs.s.StatusCode() == codes.OK { - // Returns io.EOF to indicate the end of the stream. - return + if statusErr := cs.s.Status().Err(); statusErr != nil { + return statusErr } - return Errorf(cs.s.StatusCode(), "%s", cs.s.StatusDesc()) + // Returns io.EOF to indicate the end of the stream. + return } return toRPCErr(err) } @@ -386,13 +479,37 @@ func (cs *clientStream) closeTransportStream(err error) { func (cs *clientStream) finish(err error) { cs.mu.Lock() defer cs.mu.Unlock() + if cs.finished { + return + } + cs.finished = true + defer func() { + if cs.cancel != nil { + cs.cancel() + } + }() for _, o := range cs.opts { o.after(&cs.c) } if cs.put != nil { + updateRPCInfoInContext(cs.s.Context(), rpcInfo{ + bytesSent: cs.s.BytesSent(), + bytesReceived: cs.s.BytesReceived(), + }) cs.put() cs.put = nil } + if cs.statsHandler != nil { + end := &stats.End{ + Client: true, + EndTime: time.Now(), + } + if err != io.EOF { + // end.Error is nil if the RPC finished successfully. + end.Error = toRPCErr(err) + } + cs.statsHandler.HandleRPC(cs.statsCtx, end) + } if !cs.tracing { return } @@ -429,17 +546,18 @@ type ServerStream interface { // serverStream implements a server side Stream. type serverStream struct { - t transport.ServerTransport - s *transport.Stream - p *parser - codec Codec - cp Compressor - dc Decompressor - cbuf *bytes.Buffer - maxMsgSize int - statusCode codes.Code - statusDesc string - trInfo *traceInfo + t transport.ServerTransport + s *transport.Stream + p *parser + codec Codec + cp Compressor + dc Decompressor + cbuf *bytes.Buffer + maxReceiveMessageSize int + maxSendMessageSize int + trInfo *traceInfo + + statsHandler stats.Handler mu sync.Mutex // protects trInfo.tr after the service handler runs. } @@ -482,19 +600,29 @@ func (ss *serverStream) SendMsg(m interface{}) (err error) { ss.mu.Unlock() } }() - out, err := encode(ss.codec, m, ss.cp, ss.cbuf) + var outPayload *stats.OutPayload + if ss.statsHandler != nil { + outPayload = &stats.OutPayload{} + } + out, err := encode(ss.codec, m, ss.cp, ss.cbuf, outPayload) defer func() { if ss.cbuf != nil { ss.cbuf.Reset() } }() if err != nil { - err = Errorf(codes.Internal, "grpc: %v", err) return err } + if len(out) > ss.maxSendMessageSize { + return Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(out), ss.maxSendMessageSize) + } if err := ss.t.Write(ss.s, out, &transport.Options{Last: false}); err != nil { return toRPCErr(err) } + if outPayload != nil { + outPayload.SentTime = time.Now() + ss.statsHandler.HandleRPC(ss.s.Context(), outPayload) + } return nil } @@ -513,7 +641,11 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { ss.mu.Unlock() } }() - if err := recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxMsgSize); err != nil { + var inPayload *stats.InPayload + if ss.statsHandler != nil { + inPayload = &stats.InPayload{} + } + if err := recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxReceiveMessageSize, inPayload); err != nil { if err == io.EOF { return err } @@ -522,5 +654,8 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { } return toRPCErr(err) } + if inPayload != nil { + ss.statsHandler.HandleRPC(ss.s.Context(), inPayload) + } return nil } diff --git a/vendor/google.golang.org/grpc/tap/BUILD b/vendor/google.golang.org/grpc/tap/BUILD new file mode 100644 index 0000000000000..b6d76557643e0 --- /dev/null +++ b/vendor/google.golang.org/grpc/tap/BUILD @@ -0,0 +1,28 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["tap.go"], + tags = ["automanaged"], + deps = ["//vendor/golang.org/x/net/context:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/vendor/google.golang.org/grpc/tap/tap.go b/vendor/google.golang.org/grpc/tap/tap.go new file mode 100644 index 0000000000000..decb6786b02d3 --- /dev/null +++ b/vendor/google.golang.org/grpc/tap/tap.go @@ -0,0 +1,39 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package tap defines the function handles which are executed on the transport +// layer of gRPC-Go and related information. Everything here is EXPERIMENTAL. +package tap + +import ( + "golang.org/x/net/context" +) + +// Info defines the relevant information needed by the handles. +type Info struct { + // FullMethodName is the string of grpc method (in the format of + // /package.service/method). + FullMethodName string + // TODO: More to be added. +} + +// ServerInHandle defines the function which runs when a new stream is created +// on the server side. Note that it is executed in the per-connection I/O goroutine(s) instead +// of per-RPC goroutine. Therefore, users should NOT have any blocking/time-consuming +// work in this handle. Otherwise all the RPCs would slow down. +type ServerInHandle func(ctx context.Context, info *Info) (context.Context, error) diff --git a/vendor/google.golang.org/grpc/trace.go b/vendor/google.golang.org/grpc/trace.go index f6747e1dfa4bd..b419c9e3dea8b 100644 --- a/vendor/google.golang.org/grpc/trace.go +++ b/vendor/google.golang.org/grpc/trace.go @@ -1,33 +1,18 @@ /* * - * Copyright 2015, Google Inc. - * All rights reserved. + * Copyright 2015 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ diff --git a/vendor/google.golang.org/grpc/transport/BUILD b/vendor/google.golang.org/grpc/transport/BUILD index ec05cd8346366..85527c9955820 100644 --- a/vendor/google.golang.org/grpc/transport/BUILD +++ b/vendor/google.golang.org/grpc/transport/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ + "bdp_estimator.go", "control.go", "go16.go", "go17.go", @@ -10,20 +11,25 @@ go_library( "http2_client.go", "http2_server.go", "http_util.go", - "pre_go16.go", + "log.go", "transport.go", ], visibility = ["//visibility:public"], deps = [ + "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/http2:go_default_library", "//vendor/golang.org/x/net/http2/hpack:go_default_library", - "//vendor/golang.org/x/net/trace:go_default_library", + "//vendor/google.golang.org/genproto/googleapis/rpc/status:go_default_library", "//vendor/google.golang.org/grpc/codes:go_default_library", "//vendor/google.golang.org/grpc/credentials:go_default_library", "//vendor/google.golang.org/grpc/grpclog:go_default_library", + "//vendor/google.golang.org/grpc/keepalive:go_default_library", "//vendor/google.golang.org/grpc/metadata:go_default_library", "//vendor/google.golang.org/grpc/peer:go_default_library", + "//vendor/google.golang.org/grpc/stats:go_default_library", + "//vendor/google.golang.org/grpc/status:go_default_library", + "//vendor/google.golang.org/grpc/tap:go_default_library", ], ) diff --git a/vendor/google.golang.org/grpc/transport/bdp_estimator.go b/vendor/google.golang.org/grpc/transport/bdp_estimator.go new file mode 100644 index 0000000000000..643652adeab82 --- /dev/null +++ b/vendor/google.golang.org/grpc/transport/bdp_estimator.go @@ -0,0 +1,125 @@ +package transport + +import ( + "sync" + "time" +) + +const ( + // bdpLimit is the maximum value the flow control windows + // will be increased to. + bdpLimit = (1 << 20) * 4 + // alpha is a constant factor used to keep a moving average + // of RTTs. + alpha = 0.9 + // If the current bdp sample is greater than or equal to + // our beta * our estimated bdp and the current bandwidth + // sample is the maximum bandwidth observed so far, we + // increase our bbp estimate by a factor of gamma. + beta = 0.66 + // To put our bdp to be smaller than or equal to twice the real BDP, + // we should multiply our current sample with 4/3, however to round things out + // we use 2 as the multiplication factor. + gamma = 2 +) + +var ( + // Adding arbitrary data to ping so that its ack can be + // identified. + // Easter-egg: what does the ping message say? + bdpPing = &ping{data: [8]byte{2, 4, 16, 16, 9, 14, 7, 7}} +) + +type bdpEstimator struct { + // sentAt is the time when the ping was sent. + sentAt time.Time + + mu sync.Mutex + // bdp is the current bdp estimate. + bdp uint32 + // sample is the number of bytes received in one measurement cycle. + sample uint32 + // bwMax is the maximum bandwidth noted so far (bytes/sec). + bwMax float64 + // bool to keep track of the begining of a new measurement cycle. + isSent bool + // Callback to update the window sizes. + updateFlowControl func(n uint32) + // sampleCount is the number of samples taken so far. + sampleCount uint64 + // round trip time (seconds) + rtt float64 +} + +// timesnap registers the time bdp ping was sent out so that +// network rtt can be calculated when its ack is recieved. +// It is called (by controller) when the bdpPing is +// being written on the wire. +func (b *bdpEstimator) timesnap(d [8]byte) { + if bdpPing.data != d { + return + } + b.sentAt = time.Now() +} + +// add adds bytes to the current sample for calculating bdp. +// It returns true only if a ping must be sent. This can be used +// by the caller (handleData) to make decision about batching +// a window update with it. +func (b *bdpEstimator) add(n uint32) bool { + b.mu.Lock() + defer b.mu.Unlock() + if b.bdp == bdpLimit { + return false + } + if !b.isSent { + b.isSent = true + b.sample = n + b.sentAt = time.Time{} + b.sampleCount++ + return true + } + b.sample += n + return false +} + +// calculate is called when an ack for a bdp ping is received. +// Here we calculate the current bdp and bandwidth sample and +// decide if the flow control windows should go up. +func (b *bdpEstimator) calculate(d [8]byte) { + // Check if the ping acked for was the bdp ping. + if bdpPing.data != d { + return + } + b.mu.Lock() + rttSample := time.Since(b.sentAt).Seconds() + if b.sampleCount < 10 { + // Bootstrap rtt with an average of first 10 rtt samples. + b.rtt += (rttSample - b.rtt) / float64(b.sampleCount) + } else { + // Heed to the recent past more. + b.rtt += (rttSample - b.rtt) * float64(alpha) + } + b.isSent = false + // The number of bytes accumalated so far in the sample is smaller + // than or equal to 1.5 times the real BDP on a saturated connection. + bwCurrent := float64(b.sample) / (b.rtt * float64(1.5)) + if bwCurrent > b.bwMax { + b.bwMax = bwCurrent + } + // If the current sample (which is smaller than or equal to the 1.5 times the real BDP) is + // greater than or equal to 2/3rd our perceived bdp AND this is the maximum bandwidth seen so far, we + // should update our perception of the network BDP. + if float64(b.sample) >= beta*float64(b.bdp) && bwCurrent == b.bwMax && b.bdp != bdpLimit { + sampleFloat := float64(b.sample) + b.bdp = uint32(gamma * sampleFloat) + if b.bdp > bdpLimit { + b.bdp = bdpLimit + } + bdp := b.bdp + b.mu.Unlock() + b.updateFlowControl(bdp) + return + } + b.mu.Unlock() +} diff --git a/vendor/google.golang.org/grpc/transport/control.go b/vendor/google.golang.org/grpc/transport/control.go index 4ef0830b56ca0..de9420a393f20 100644 --- a/vendor/google.golang.org/grpc/transport/control.go +++ b/vendor/google.golang.org/grpc/transport/control.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -35,7 +20,9 @@ package transport import ( "fmt" + "math" "sync" + "time" "golang.org/x/net/http2" ) @@ -44,8 +31,19 @@ const ( // The default value of flow control window size in HTTP2 spec. defaultWindowSize = 65535 // The initial window size for flow control. - initialWindowSize = defaultWindowSize // for an RPC - initialConnWindowSize = defaultWindowSize * 16 // for a connection + initialWindowSize = defaultWindowSize // for an RPC + infinity = time.Duration(math.MaxInt64) + defaultClientKeepaliveTime = infinity + defaultClientKeepaliveTimeout = time.Duration(20 * time.Second) + defaultMaxStreamsClient = 100 + defaultMaxConnectionIdle = infinity + defaultMaxConnectionAge = infinity + defaultMaxConnectionAgeGrace = infinity + defaultServerKeepaliveTime = time.Duration(2 * time.Hour) + defaultServerKeepaliveTimeout = time.Duration(20 * time.Second) + defaultKeepalivePolicyMinTime = time.Duration(5 * time.Minute) + // max window limit set by HTTP2 Specs. + maxWindowSize = math.MaxInt32 ) // The following defines various control items which could flow through @@ -54,6 +52,7 @@ const ( type windowUpdate struct { streamID uint32 increment uint32 + flush bool } func (*windowUpdate) item() {} @@ -73,6 +72,8 @@ type resetStream struct { func (*resetStream) item() {} type goAway struct { + code http2.ErrCode + debugData []byte } func (*goAway) item() {} @@ -111,35 +112,9 @@ func newQuotaPool(q int) *quotaPool { return qb } -// add adds n to the available quota and tries to send it on acquire. -func (qb *quotaPool) add(n int) { - qb.mu.Lock() - defer qb.mu.Unlock() - qb.quota += n - if qb.quota <= 0 { - return - } - select { - case qb.c <- qb.quota: - qb.quota = 0 - default: - } -} - -// cancel cancels the pending quota sent on acquire, if any. -func (qb *quotaPool) cancel() { - qb.mu.Lock() - defer qb.mu.Unlock() - select { - case n := <-qb.c: - qb.quota += n - default: - } -} - -// reset cancels the pending quota sent on acquired, incremented by v and sends +// add cancels the pending quota sent on acquired, incremented by v and sends // it back on acquire. -func (qb *quotaPool) reset(v int) { +func (qb *quotaPool) add(v int) { qb.mu.Lock() defer qb.mu.Unlock() select { @@ -151,6 +126,10 @@ func (qb *quotaPool) reset(v int) { if qb.quota <= 0 { return } + // After the pool has been created, this is the only place that sends on + // the channel. Since mu is held at this point and any quota that was sent + // on the channel has been retrieved, we know that this code will always + // place any positive quota value on the channel. select { case qb.c <- qb.quota: qb.quota = 0 @@ -165,16 +144,59 @@ func (qb *quotaPool) acquire() <-chan int { // inFlow deals with inbound flow control type inFlow struct { + mu sync.Mutex // The inbound flow control limit for pending data. limit uint32 - - mu sync.Mutex // pendingData is the overall data which have been received but not been // consumed by applications. pendingData uint32 // The amount of data the application has consumed but grpc has not sent // window update for them. Used to reduce window update frequency. pendingUpdate uint32 + // delta is the extra window update given by receiver when an application + // is reading data bigger in size than the inFlow limit. + delta uint32 +} + +// newLimit updates the inflow window to a new value n. +// It assumes that n is always greater than the old limit. +func (f *inFlow) newLimit(n uint32) uint32 { + f.mu.Lock() + defer f.mu.Unlock() + d := n - f.limit + f.limit = n + return d +} + +func (f *inFlow) maybeAdjust(n uint32) uint32 { + if n > uint32(math.MaxInt32) { + n = uint32(math.MaxInt32) + } + f.mu.Lock() + defer f.mu.Unlock() + // estSenderQuota is the receiver's view of the maximum number of bytes the sender + // can send without a window update. + estSenderQuota := int32(f.limit - (f.pendingData + f.pendingUpdate)) + // estUntransmittedData is the maximum number of bytes the sends might not have put + // on the wire yet. A value of 0 or less means that we have already received all or + // more bytes than the application is requesting to read. + estUntransmittedData := int32(n - f.pendingData) // Casting into int32 since it could be negative. + // This implies that unless we send a window update, the sender won't be able to send all the bytes + // for this message. Therefore we must send an update over the limit since there's an active read + // request from the application. + if estUntransmittedData > estSenderQuota { + // Sender's window shouldn't go more than 2^31 - 1 as speecified in the HTTP spec. + if f.limit+n > maxWindowSize { + f.delta = maxWindowSize - f.limit + } else { + // Send a window update for the whole message and not just the difference between + // estUntransmittedData and estSenderQuota. This will be helpful in case the message + // is padded; We will fallback on the current available window(at least a 1/4th of the limit). + f.delta = n + } + return f.delta + } + return 0 } // onData is invoked when some data frame is received. It updates pendingData. @@ -182,7 +204,7 @@ func (f *inFlow) onData(n uint32) error { f.mu.Lock() defer f.mu.Unlock() f.pendingData += n - if f.pendingData+f.pendingUpdate > f.limit { + if f.pendingData+f.pendingUpdate > f.limit+f.delta { return fmt.Errorf("received %d-bytes data exceeding the limit %d bytes", f.pendingData+f.pendingUpdate, f.limit) } return nil @@ -197,6 +219,13 @@ func (f *inFlow) onRead(n uint32) uint32 { return 0 } f.pendingData -= n + if n > f.delta { + n -= f.delta + f.delta = 0 + } else { + f.delta -= n + n = 0 + } f.pendingUpdate += n if f.pendingUpdate >= f.limit/4 { wu := f.pendingUpdate @@ -206,10 +235,10 @@ func (f *inFlow) onRead(n uint32) uint32 { return 0 } -func (f *inFlow) resetPendingData() uint32 { +func (f *inFlow) resetPendingUpdate() uint32 { f.mu.Lock() defer f.mu.Unlock() - n := f.pendingData - f.pendingData = 0 + n := f.pendingUpdate + f.pendingUpdate = 0 return n } diff --git a/vendor/google.golang.org/grpc/transport/go16.go b/vendor/google.golang.org/grpc/transport/go16.go index ee1c46bad575b..7cffee11e0b99 100644 --- a/vendor/google.golang.org/grpc/transport/go16.go +++ b/vendor/google.golang.org/grpc/transport/go16.go @@ -1,34 +1,20 @@ // +build go1.6,!go1.7 /* - * Copyright 2016, Google Inc. - * All rights reserved. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Copyright 2016 gRPC authors. * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -37,6 +23,8 @@ package transport import ( "net" + "google.golang.org/grpc/codes" + "golang.org/x/net/context" ) @@ -44,3 +32,14 @@ import ( func dialContext(ctx context.Context, network, address string) (net.Conn, error) { return (&net.Dialer{Cancel: ctx.Done()}).Dial(network, address) } + +// ContextErr converts the error from context package into a StreamError. +func ContextErr(err error) StreamError { + switch err { + case context.DeadlineExceeded: + return streamErrorf(codes.DeadlineExceeded, "%v", err) + case context.Canceled: + return streamErrorf(codes.Canceled, "%v", err) + } + return streamErrorf(codes.Internal, "Unexpected error from context packet: %v", err) +} diff --git a/vendor/google.golang.org/grpc/transport/go17.go b/vendor/google.golang.org/grpc/transport/go17.go index 356f13ff19726..2464e69faf5b0 100644 --- a/vendor/google.golang.org/grpc/transport/go17.go +++ b/vendor/google.golang.org/grpc/transport/go17.go @@ -1,46 +1,46 @@ // +build go1.7 /* - * Copyright 2016, Google Inc. - * All rights reserved. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Copyright 2016 gRPC authors. * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package transport import ( + "context" "net" - "golang.org/x/net/context" + "google.golang.org/grpc/codes" + + netctx "golang.org/x/net/context" ) // dialContext connects to the address on the named network. func dialContext(ctx context.Context, network, address string) (net.Conn, error) { return (&net.Dialer{}).DialContext(ctx, network, address) } + +// ContextErr converts the error from context package into a StreamError. +func ContextErr(err error) StreamError { + switch err { + case context.DeadlineExceeded, netctx.DeadlineExceeded: + return streamErrorf(codes.DeadlineExceeded, "%v", err) + case context.Canceled, netctx.Canceled: + return streamErrorf(codes.Canceled, "%v", err) + } + return streamErrorf(codes.Internal, "Unexpected error from context packet: %v", err) +} diff --git a/vendor/google.golang.org/grpc/transport/handler_server.go b/vendor/google.golang.org/grpc/transport/handler_server.go index 114e34906a142..27372b50894c5 100644 --- a/vendor/google.golang.org/grpc/transport/handler_server.go +++ b/vendor/google.golang.org/grpc/transport/handler_server.go @@ -1,32 +1,18 @@ /* - * Copyright 2016, Google Inc. - * All rights reserved. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Copyright 2016 gRPC authors. * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -53,6 +39,7 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" + "google.golang.org/grpc/status" ) // NewServerHandlerTransport returns a ServerTransport handling gRPC @@ -101,14 +88,9 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request) (ServerTr continue } for _, v := range vv { - if k == "user-agent" { - // user-agent is special. Copying logic of http_util.go. - if i := strings.LastIndex(v, " "); i == -1 { - // There is no application user agent string being set - continue - } else { - v = v[:i] - } + v, err := decodeMetadataHeader(k, v) + if err != nil { + return nil, streamErrorf(codes.InvalidArgument, "malformed binary metadata: %v", err) } metakv = append(metakv, k, v) } @@ -174,15 +156,22 @@ func (a strAddr) String() string { return string(a) } // do runs fn in the ServeHTTP goroutine. func (ht *serverHandlerTransport) do(fn func()) error { + // Avoid a panic writing to closed channel. Imperfect but maybe good enough. select { - case ht.writes <- fn: - return nil case <-ht.closedCh: return ErrConnClosing + default: + select { + case ht.writes <- fn: + return nil + case <-ht.closedCh: + return ErrConnClosing + } + } } -func (ht *serverHandlerTransport) WriteStatus(s *Stream, statusCode codes.Code, statusDesc string) error { +func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) error { err := ht.do(func() { ht.writeCommonHeaders(s) @@ -192,10 +181,13 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, statusCode codes.Code, ht.rw.(http.Flusher).Flush() h := ht.rw.Header() - h.Set("Grpc-Status", fmt.Sprintf("%d", statusCode)) - if statusDesc != "" { - h.Set("Grpc-Message", encodeGrpcMessage(statusDesc)) + h.Set("Grpc-Status", fmt.Sprintf("%d", st.Code())) + if m := st.Message(); m != "" { + h.Set("Grpc-Message", encodeGrpcMessage(m)) } + + // TODO: Support Grpc-Status-Details-Bin + if md := s.Trailer(); len(md) > 0 { for k, vv := range md { // Clients don't tolerate reading restricted headers after some non restricted ones were sent. @@ -203,10 +195,9 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, statusCode codes.Code, continue } for _, v := range vv { - // http2 ResponseWriter mechanism to - // send undeclared Trailers after the - // headers have possibly been written. - h.Add(http2.TrailerPrefix+k, v) + // http2 ResponseWriter mechanism to send undeclared Trailers after + // the headers have possibly been written. + h.Add(http2.TrailerPrefix+k, encodeMetadataHeader(k, v)) } } } @@ -234,6 +225,7 @@ func (ht *serverHandlerTransport) writeCommonHeaders(s *Stream) { // and https://golang.org/pkg/net/http/#example_ResponseWriter_trailers h.Add("Trailer", "Grpc-Status") h.Add("Trailer", "Grpc-Message") + // TODO: Support Grpc-Status-Details-Bin if s.sendCompress != "" { h.Set("Grpc-Encoding", s.sendCompress) @@ -260,6 +252,7 @@ func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { continue } for _, v := range vv { + v = encodeMetadataHeader(k, v) h.Add(k, v) } } @@ -268,7 +261,7 @@ func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { }) } -func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream)) { +func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), traceCtx func(context.Context, string) context.Context) { // With this transport type there will be exactly 1 stream: this HTTP request. var ctx context.Context @@ -300,13 +293,13 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream)) { req := ht.req s := &Stream{ - id: 0, // irrelevant - windowHandler: func(int) {}, // nothing - cancel: cancel, - buf: newRecvBuffer(), - st: ht, - method: req.URL.Path, - recvCompress: req.Header.Get("grpc-encoding"), + id: 0, // irrelevant + requestRead: func(int) {}, + cancel: cancel, + buf: newRecvBuffer(), + st: ht, + method: req.URL.Path, + recvCompress: req.Header.Get("grpc-encoding"), } pr := &peer.Peer{ Addr: ht.RemoteAddr(), @@ -314,10 +307,13 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream)) { if req.TLS != nil { pr.AuthInfo = credentials.TLSInfo{State: *req.TLS} } - ctx = metadata.NewContext(ctx, ht.headerMD) + ctx = metadata.NewIncomingContext(ctx, ht.headerMD) ctx = peer.NewContext(ctx, pr) s.ctx = newContextWithStream(ctx, s) - s.dec = &recvBufferReader{ctx: s.ctx, recv: s.buf} + s.trReader = &transportReader{ + reader: &recvBufferReader{ctx: s.ctx, recv: s.buf}, + windowHandler: func(int) {}, + } // readerDone is closed when the Body.Read-ing goroutine exits. readerDone := make(chan struct{}) @@ -329,11 +325,11 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream)) { for buf := make([]byte, readSize); ; { n, err := req.Body.Read(buf) if n > 0 { - s.buf.put(&recvMsg{data: buf[:n:n]}) + s.buf.put(recvMsg{data: buf[:n:n]}) buf = buf[n:] } if err != nil { - s.buf.put(&recvMsg{err: mapRecvMsgError(err)}) + s.buf.put(recvMsg{err: mapRecvMsgError(err)}) return } if len(buf) == 0 { diff --git a/vendor/google.golang.org/grpc/transport/http2_client.go b/vendor/google.golang.org/grpc/transport/http2_client.go index 2b0f68016af53..a62f4e31a323e 100644 --- a/vendor/google.golang.org/grpc/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/transport/http2_client.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -35,12 +20,12 @@ package transport import ( "bytes" - "fmt" "io" "math" "net" "strings" "sync" + "sync/atomic" "time" "golang.org/x/net/context" @@ -48,19 +33,24 @@ import ( "golang.org/x/net/http2/hpack" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" - "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" ) // http2Client implements the ClientTransport interface with HTTP2. type http2Client struct { - target string // server name/addr - userAgent string - md interface{} - conn net.Conn // underlying communication channel - authInfo credentials.AuthInfo // auth info about the connection - nextID uint32 // the next stream ID to be used + ctx context.Context + target string // server name/addr + userAgent string + md interface{} + conn net.Conn // underlying communication channel + remoteAddr net.Addr + localAddr net.Addr + authInfo credentials.AuthInfo // auth info about the connection + nextID uint32 // the next stream ID to be used // writableChan synchronizes write access to the transport. // A writer acquires the write lock by sending a value on writableChan @@ -76,6 +66,8 @@ type http2Client struct { // goAway is closed to notify the upper layer (i.e., addrConn.transportMonitor) // that the server sent GoAway on this transport. goAway chan struct{} + // awakenKeepalive is used to wake up keepalive when after it has gone dormant. + awakenKeepalive chan struct{} framer *framer hBuf *bytes.Buffer // the buffer for HPACK encoding @@ -83,7 +75,7 @@ type http2Client struct { // controlBuf delivers all the control related tasks (e.g., window // updates, reset streams, and various settings) to the controller. - controlBuf *recvBuffer + controlBuf *controlBuffer fc *inFlow // sendQuotaPool provides flow control to outbound message. sendQuotaPool *quotaPool @@ -93,8 +85,21 @@ type http2Client struct { // The scheme used: https if TLS is on, http otherwise. scheme string + isSecure bool + creds []credentials.PerRPCCredentials + // Boolean to keep track of reading activity on transport. + // 1 is true and 0 is false. + activity uint32 // Accessed atomically. + kp keepalive.ClientParameters + + statsHandler stats.Handler + + initialWindowSize int32 + + bdpEst *bdpEstimator + mu sync.Mutex // guard the following variables state transportState // the state of underlying connection activeStreams map[uint32]*Stream @@ -106,6 +111,9 @@ type http2Client struct { goAwayID uint32 // prevGoAway ID records the Last-Stream-ID in the previous GOAway frame. prevGoAwayID uint32 + // goAwayReason records the http2.ErrCode and debug data received with the + // GoAway frame. + goAwayReason GoAwayReason } func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr string) (net.Conn, error) { @@ -150,7 +158,10 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) ( scheme := "http" conn, err := dial(ctx, opts.Dialer, addr.Addr) if err != nil { - return nil, connectionErrorf(true, err, "transport: %v", err) + if opts.FailOnNonTempDialError { + return nil, connectionErrorf(isTemporary(err), err, "transport: error while dialing: %v", err) + } + return nil, connectionErrorf(true, err, "transport: Error while dialing %v", err) } // Any further errors will close the underlying connection defer func(conn net.Conn) { @@ -158,7 +169,10 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) ( conn.Close() } }(conn) - var authInfo credentials.AuthInfo + var ( + isSecure bool + authInfo credentials.AuthInfo + ) if creds := opts.TransportCredentials; creds != nil { scheme = "https" conn, authInfo, err = creds.ClientHandshake(ctx, addr.Addr, conn) @@ -166,38 +180,81 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) ( // Credentials handshake errors are typically considered permanent // to avoid retrying on e.g. bad certificates. temp := isTemporary(err) - return nil, connectionErrorf(temp, err, "transport: %v", err) + return nil, connectionErrorf(temp, err, "transport: authentication handshake failed: %v", err) } + isSecure = true + } + kp := opts.KeepaliveParams + // Validate keepalive parameters. + if kp.Time == 0 { + kp.Time = defaultClientKeepaliveTime } - ua := primaryUA - if opts.UserAgent != "" { - ua = opts.UserAgent + " " + ua + if kp.Timeout == 0 { + kp.Timeout = defaultClientKeepaliveTimeout + } + dynamicWindow := true + icwz := int32(initialWindowSize) + if opts.InitialConnWindowSize >= defaultWindowSize { + icwz = opts.InitialConnWindowSize + dynamicWindow = false } var buf bytes.Buffer t := &http2Client{ - target: addr.Addr, - userAgent: ua, - md: addr.Metadata, - conn: conn, - authInfo: authInfo, + ctx: ctx, + target: addr.Addr, + userAgent: opts.UserAgent, + md: addr.Metadata, + conn: conn, + remoteAddr: conn.RemoteAddr(), + localAddr: conn.LocalAddr(), + authInfo: authInfo, // The client initiated stream id is odd starting from 1. - nextID: 1, - writableChan: make(chan int, 1), - shutdownChan: make(chan struct{}), - errorChan: make(chan struct{}), - goAway: make(chan struct{}), - framer: newFramer(conn), - hBuf: &buf, - hEnc: hpack.NewEncoder(&buf), - controlBuf: newRecvBuffer(), - fc: &inFlow{limit: initialConnWindowSize}, - sendQuotaPool: newQuotaPool(defaultWindowSize), - scheme: scheme, - state: reachable, - activeStreams: make(map[uint32]*Stream), - creds: opts.PerRPCCredentials, - maxStreams: math.MaxInt32, - streamSendQuota: defaultWindowSize, + nextID: 1, + writableChan: make(chan int, 1), + shutdownChan: make(chan struct{}), + errorChan: make(chan struct{}), + goAway: make(chan struct{}), + awakenKeepalive: make(chan struct{}, 1), + framer: newFramer(conn), + hBuf: &buf, + hEnc: hpack.NewEncoder(&buf), + controlBuf: newControlBuffer(), + fc: &inFlow{limit: uint32(icwz)}, + sendQuotaPool: newQuotaPool(defaultWindowSize), + scheme: scheme, + state: reachable, + activeStreams: make(map[uint32]*Stream), + isSecure: isSecure, + creds: opts.PerRPCCredentials, + maxStreams: defaultMaxStreamsClient, + streamsQuota: newQuotaPool(defaultMaxStreamsClient), + streamSendQuota: defaultWindowSize, + kp: kp, + statsHandler: opts.StatsHandler, + initialWindowSize: initialWindowSize, + } + if opts.InitialWindowSize >= defaultWindowSize { + t.initialWindowSize = opts.InitialWindowSize + dynamicWindow = false + } + if dynamicWindow { + t.bdpEst = &bdpEstimator{ + bdp: initialWindowSize, + updateFlowControl: t.updateFlowControl, + } + } + // Make sure awakenKeepalive can't be written upon. + // keepalive routine will make it writable, if need be. + t.awakenKeepalive <- struct{}{} + if t.statsHandler != nil { + t.ctx = t.statsHandler.TagConn(t.ctx, &stats.ConnTagInfo{ + RemoteAddr: t.remoteAddr, + LocalAddr: t.localAddr, + }) + connBegin := &stats.ConnBegin{ + Client: true, + } + t.statsHandler.HandleConn(t.ctx, connBegin) } // Start the reader goroutine for incoming message. Each transport has // a dedicated goroutine which reads HTTP2 frame from network. Then it @@ -207,32 +264,35 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) ( n, err := t.conn.Write(clientPreface) if err != nil { t.Close() - return nil, connectionErrorf(true, err, "transport: %v", err) + return nil, connectionErrorf(true, err, "transport: failed to write client preface: %v", err) } if n != len(clientPreface) { t.Close() return nil, connectionErrorf(true, err, "transport: preface mismatch, wrote %d bytes; want %d", n, len(clientPreface)) } - if initialWindowSize != defaultWindowSize { + if t.initialWindowSize != defaultWindowSize { err = t.framer.writeSettings(true, http2.Setting{ ID: http2.SettingInitialWindowSize, - Val: uint32(initialWindowSize), + Val: uint32(t.initialWindowSize), }) } else { err = t.framer.writeSettings(true) } if err != nil { t.Close() - return nil, connectionErrorf(true, err, "transport: %v", err) + return nil, connectionErrorf(true, err, "transport: failed to write initial settings frame: %v", err) } // Adjust the connection flow control window if needed. - if delta := uint32(initialConnWindowSize - defaultWindowSize); delta > 0 { + if delta := uint32(icwz - defaultWindowSize); delta > 0 { if err := t.framer.writeWindowUpdate(true, 0, delta); err != nil { t.Close() - return nil, connectionErrorf(true, err, "transport: %v", err) + return nil, connectionErrorf(true, err, "transport: failed to write window update: %v", err) } } go t.controller() + if t.kp.Time != infinity { + go t.keepalive() + } t.writableChan <- 0 return t, nil } @@ -246,39 +306,49 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { method: callHdr.Method, sendCompress: callHdr.SendCompress, buf: newRecvBuffer(), - fc: &inFlow{limit: initialWindowSize}, + fc: &inFlow{limit: uint32(t.initialWindowSize)}, sendQuotaPool: newQuotaPool(int(t.streamSendQuota)), headerChan: make(chan struct{}), } t.nextID += 2 - s.windowHandler = func(n int) { - t.updateWindow(s, uint32(n)) + s.requestRead = func(n int) { + t.adjustWindow(s, uint32(n)) } // The client side stream context should have exactly the same life cycle with the user provided context. // That means, s.ctx should be read-only. And s.ctx is done iff ctx is done. // So we use the original context here instead of creating a copy. s.ctx = ctx - s.dec = &recvBufferReader{ - ctx: s.ctx, - goAway: s.goAway, - recv: s.buf, + s.trReader = &transportReader{ + reader: &recvBufferReader{ + ctx: s.ctx, + goAway: s.goAway, + recv: s.buf, + }, + windowHandler: func(n int) { + t.updateWindow(s, uint32(n)) + }, } + return s } -// NewStream creates a stream and register it into the transport as "active" +// NewStream creates a stream and registers it into the transport as "active" // streams. func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Stream, err error) { pr := &peer.Peer{ - Addr: t.conn.RemoteAddr(), + Addr: t.remoteAddr, } // Attach Auth info if there is any. if t.authInfo != nil { pr.AuthInfo = t.authInfo } ctx = peer.NewContext(ctx, pr) - authData := make(map[string]string) - for _, c := range t.creds { + var ( + authData = make(map[string]string) + audience string + ) + // Create an audience string only if needed. + if len(t.creds) > 0 || callHdr.Creds != nil { // Construct URI required to get auth request metadata. var port string if pos := strings.LastIndex(t.target, ":"); pos != -1 { @@ -289,17 +359,39 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea } pos := strings.LastIndex(callHdr.Method, "/") if pos == -1 { - return nil, streamErrorf(codes.InvalidArgument, "transport: malformed method name: %q", callHdr.Method) + pos = len(callHdr.Method) } - audience := "https://" + callHdr.Host + port + callHdr.Method[:pos] + audience = "https://" + callHdr.Host + port + callHdr.Method[:pos] + } + for _, c := range t.creds { data, err := c.GetRequestMetadata(ctx, audience) if err != nil { - return nil, streamErrorf(codes.InvalidArgument, "transport: %v", err) + return nil, streamErrorf(codes.Internal, "transport: %v", err) } for k, v := range data { + // Capital header names are illegal in HTTP/2. + k = strings.ToLower(k) authData[k] = v } } + callAuthData := make(map[string]string) + // Check if credentials.PerRPCCredentials were provided via call options. + // Note: if these credentials are provided both via dial options and call + // options, then both sets of credentials will be applied. + if callCreds := callHdr.Creds; callCreds != nil { + if !t.isSecure && callCreds.RequireTransportSecurity() { + return nil, streamErrorf(codes.Unauthenticated, "transport: cannot send secure credentials on an insecure conneciton") + } + data, err := callCreds.GetRequestMetadata(ctx, audience) + if err != nil { + return nil, streamErrorf(codes.Internal, "transport: %v", err) + } + for k, v := range data { + // Capital header names are illegal in HTTP/2 + k = strings.ToLower(k) + callAuthData[k] = v + } + } t.mu.Lock() if t.activeStreams == nil { t.mu.Unlock() @@ -313,21 +405,18 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea t.mu.Unlock() return nil, ErrConnClosing } - checkStreamsQuota := t.streamsQuota != nil t.mu.Unlock() - if checkStreamsQuota { - sq, err := wait(ctx, nil, nil, t.shutdownChan, t.streamsQuota.acquire()) - if err != nil { - return nil, err - } - // Returns the quota balance back. - if sq > 1 { - t.streamsQuota.add(sq - 1) - } + sq, err := wait(ctx, nil, nil, t.shutdownChan, t.streamsQuota.acquire()) + if err != nil { + return nil, err + } + // Returns the quota balance back. + if sq > 1 { + t.streamsQuota.add(sq - 1) } if _, err := wait(ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { // Return the quota back now because there is no stream returned to the caller. - if _, ok := err.(StreamError); ok && checkStreamsQuota { + if _, ok := err.(StreamError); ok { t.streamsQuota.add(1) } return nil, err @@ -335,9 +424,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea t.mu.Lock() if t.state == draining { t.mu.Unlock() - if checkStreamsQuota { - t.streamsQuota.add(1) - } + t.streamsQuota.add(1) // Need to make t writable again so that the rpc in flight can still proceed. t.writableChan <- 0 return nil, ErrStreamDrain @@ -348,17 +435,17 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea } s := t.newStream(ctx, callHdr) t.activeStreams[s.id] = s - - // This stream is not counted when applySetings(...) initialize t.streamsQuota. - // Reset t.streamsQuota to the right value. - var reset bool - if !checkStreamsQuota && t.streamsQuota != nil { - reset = true + // If the number of active streams change from 0 to 1, then check if keepalive + // has gone dormant. If so, wake it up. + if len(t.activeStreams) == 1 { + select { + case t.awakenKeepalive <- struct{}{}: + t.framer.writePing(false, false, [8]byte{}) + default: + } } + t.mu.Unlock() - if reset { - t.streamsQuota.reset(-1) - } // HPACK encodes various headers. Note that once WriteField(...) is // called, the corresponding headers/continuation frame has to be sent @@ -382,37 +469,37 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea } for k, v := range authData { - // Capital header names are illegal in HTTP/2. - k = strings.ToLower(k) - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: v}) + t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) + } + for k, v := range callAuthData { + t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) } var ( - hasMD bool endHeaders bool ) - if md, ok := metadata.FromContext(ctx); ok { - hasMD = true - for k, v := range md { + if md, ok := metadata.FromOutgoingContext(ctx); ok { + for k, vv := range md { // HTTP doesn't allow you to set pseudoheaders after non pseudoheaders were set. if isReservedHeader(k) { continue } - for _, entry := range v { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: entry}) + for _, v := range vv { + t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) } } } if md, ok := t.md.(*metadata.MD); ok { - for k, v := range *md { + for k, vv := range *md { if isReservedHeader(k) { continue } - for _, entry := range v { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: entry}) + for _, v := range vv { + t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) } } } first := true + bufLen := t.hBuf.Len() // Sends the headers in a single batch even when they span multiple frames. for !endHeaders { size := t.hBuf.Len() @@ -422,7 +509,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea endHeaders = true } var flush bool - if endHeaders && (hasMD || callHdr.Flush) { + if callHdr.Flush && endHeaders { flush = true } if first { @@ -447,6 +534,21 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea return nil, connectionErrorf(true, err, "transport: %v", err) } } + s.mu.Lock() + s.bytesSent = true + s.mu.Unlock() + + if t.statsHandler != nil { + outHeader := &stats.OutHeader{ + Client: true, + WireLength: bufLen, + FullMethod: callHdr.Method, + RemoteAddr: t.remoteAddr, + LocalAddr: t.localAddr, + Compression: callHdr.SendCompress, + } + t.statsHandler.HandleRPC(s.ctx, outHeader) + } t.writableChan <- 0 return s, nil } @@ -454,14 +556,14 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea // CloseStream clears the footprint of a stream when the stream is not needed any more. // This must not be executed in reader's goroutine. func (t *http2Client) CloseStream(s *Stream, err error) { - var updateStreams bool t.mu.Lock() if t.activeStreams == nil { t.mu.Unlock() return } - if t.streamsQuota != nil { - updateStreams = true + if err != nil { + // notify in-flight streams, before the deletion + s.write(recvMsg{err: err}) } delete(t.activeStreams, s.id) if t.state == draining && len(t.activeStreams) == 0 { @@ -471,15 +573,27 @@ func (t *http2Client) CloseStream(s *Stream, err error) { return } t.mu.Unlock() - if updateStreams { - t.streamsQuota.add(1) - } - s.mu.Lock() - if q := s.fc.resetPendingData(); q > 0 { - if n := t.fc.onRead(q); n > 0 { - t.controlBuf.put(&windowUpdate{0, n}) + // rstStream is true in case the stream is being closed at the client-side + // and the server needs to be intimated about it by sending a RST_STREAM + // frame. + // To make sure this frame is written to the wire before the headers of the + // next stream waiting for streamsQuota, we add to streamsQuota pool only + // after having acquired the writableChan to send RST_STREAM out (look at + // the controller() routine). + var rstStream bool + var rstError http2.ErrCode + defer func() { + // In case, the client doesn't have to send RST_STREAM to server + // we can safely add back to streamsQuota pool now. + if !rstStream { + t.streamsQuota.add(1) + return } - } + t.controlBuf.put(&resetStream{s.id, rstError}) + }() + s.mu.Lock() + rstStream = s.rstStream + rstError = s.rstError if s.state == streamDone { s.mu.Unlock() return @@ -490,8 +604,9 @@ func (t *http2Client) CloseStream(s *Stream, err error) { } s.state = streamDone s.mu.Unlock() - if se, ok := err.(StreamError); ok && se.Code != codes.DeadlineExceeded { - t.controlBuf.put(&resetStream{s.id, http2.ErrCodeCancel}) + if _, ok := err.(StreamError); ok { + rstStream = true + rstError = http2.ErrCodeCancel } } @@ -525,6 +640,12 @@ func (t *http2Client) Close() (err error) { s.mu.Unlock() s.write(recvMsg{err: ErrConnClosing}) } + if t.statsHandler != nil { + connEnd := &stats.ConnEnd{ + Client: true, + } + t.statsHandler.HandleConn(t.ctx, connEnd) + } return } @@ -582,19 +703,14 @@ func (t *http2Client) Write(s *Stream, data []byte, opts *Options) error { var p []byte if r.Len() > 0 { size := http2MaxFrameLen - s.sendQuotaPool.add(0) // Wait until the stream has some quota to send the data. sq, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, s.sendQuotaPool.acquire()) if err != nil { return err } - t.sendQuotaPool.add(0) // Wait until the transport has some quota to send the data. tq, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, t.sendQuotaPool.acquire()) if err != nil { - if _, ok := err.(StreamError); ok || err == io.EOF { - t.sendQuotaPool.cancel() - } return err } if sq < size { @@ -686,6 +802,24 @@ func (t *http2Client) getStream(f http2.Frame) (*Stream, bool) { return s, ok } +// adjustWindow sends out extra window update over the initial window size +// of stream if the application is requesting data larger in size than +// the window. +func (t *http2Client) adjustWindow(s *Stream, n uint32) { + s.mu.Lock() + defer s.mu.Unlock() + if s.state == streamDone { + return + } + if w := s.fc.maybeAdjust(n); w > 0 { + // Piggyback conneciton's window update along. + if cw := t.fc.resetPendingUpdate(); cw > 0 { + t.controlBuf.put(&windowUpdate{0, cw, false}) + } + t.controlBuf.put(&windowUpdate{s.id, w, true}) + } +} + // updateWindow adjusts the inbound quota for the stream and the transport. // Window updates will deliver to the controller for sending when // the cumulative quota exceeds the corresponding threshold. @@ -695,55 +829,98 @@ func (t *http2Client) updateWindow(s *Stream, n uint32) { if s.state == streamDone { return } - if w := t.fc.onRead(n); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } if w := s.fc.onRead(n); w > 0 { - t.controlBuf.put(&windowUpdate{s.id, w}) + if cw := t.fc.resetPendingUpdate(); cw > 0 { + t.controlBuf.put(&windowUpdate{0, cw, false}) + } + t.controlBuf.put(&windowUpdate{s.id, w, true}) } } +// updateFlowControl updates the incoming flow control windows +// for the transport and the stream based on the current bdp +// estimation. +func (t *http2Client) updateFlowControl(n uint32) { + t.mu.Lock() + for _, s := range t.activeStreams { + s.fc.newLimit(n) + } + t.initialWindowSize = int32(n) + t.mu.Unlock() + t.controlBuf.put(&windowUpdate{0, t.fc.newLimit(n), false}) + t.controlBuf.put(&settings{ + ack: false, + ss: []http2.Setting{ + { + ID: http2.SettingInitialWindowSize, + Val: uint32(n), + }, + }, + }) +} + func (t *http2Client) handleData(f *http2.DataFrame) { - size := len(f.Data()) - if err := t.fc.onData(uint32(size)); err != nil { - t.notifyError(connectionErrorf(true, err, "%v", err)) - return + size := f.Header().Length + var sendBDPPing bool + if t.bdpEst != nil { + sendBDPPing = t.bdpEst.add(uint32(size)) + } + // Decouple connection's flow control from application's read. + // An update on connection's flow control should not depend on + // whether user application has read the data or not. Such a + // restriction is already imposed on the stream's flow control, + // and therefore the sender will be blocked anyways. + // Decoupling the connection flow control will prevent other + // active(fast) streams from starving in presence of slow or + // inactive streams. + // + // Furthermore, if a bdpPing is being sent out we can piggyback + // connection's window update for the bytes we just received. + if sendBDPPing { + t.controlBuf.put(&windowUpdate{0, uint32(size), false}) + t.controlBuf.put(bdpPing) + } else { + if err := t.fc.onData(uint32(size)); err != nil { + t.notifyError(connectionErrorf(true, err, "%v", err)) + return + } + if w := t.fc.onRead(uint32(size)); w > 0 { + t.controlBuf.put(&windowUpdate{0, w, true}) + } } // Select the right stream to dispatch. s, ok := t.getStream(f) if !ok { - if w := t.fc.onRead(uint32(size)); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } return } if size > 0 { s.mu.Lock() if s.state == streamDone { s.mu.Unlock() - // The stream has been closed. Release the corresponding quota. - if w := t.fc.onRead(uint32(size)); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } return } if err := s.fc.onData(uint32(size)); err != nil { - s.state = streamDone - s.statusCode = codes.Internal - s.statusDesc = err.Error() - close(s.done) + s.rstStream = true + s.rstError = http2.ErrCodeFlowControl + s.finish(status.New(codes.Internal, err.Error())) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) - t.controlBuf.put(&resetStream{s.id, http2.ErrCodeFlowControl}) return } + if f.Header().Flags.Has(http2.FlagDataPadded) { + if w := s.fc.onRead(uint32(size) - uint32(len(f.Data()))); w > 0 { + t.controlBuf.put(&windowUpdate{s.id, w, true}) + } + } s.mu.Unlock() // TODO(bradfitz, zhaoq): A copy is required here because there is no // guarantee f.Data() is consumed before the arrival of next frame. // Can this copy be eliminated? - data := make([]byte, size) - copy(data, f.Data()) - s.write(recvMsg{data: data}) + if len(f.Data()) > 0 { + data := make([]byte, len(f.Data())) + copy(data, f.Data()) + s.write(recvMsg{data: data}) + } } // The server has closed the stream without sending trailers. Record that // the read direction is closed, and set the status appropriately. @@ -753,10 +930,7 @@ func (t *http2Client) handleData(f *http2.DataFrame) { s.mu.Unlock() return } - s.state = streamDone - s.statusCode = codes.Internal - s.statusDesc = "server closed the stream without sending trailers" - close(s.done) + s.finish(status.New(codes.Internal, "server closed the stream without sending trailers")) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) } @@ -772,18 +946,16 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { s.mu.Unlock() return } - s.state = streamDone if !s.headerDone { close(s.headerChan) s.headerDone = true } - s.statusCode, ok = http2ErrConvTab[http2.ErrCode(f.ErrCode)] + statusCode, ok := http2ErrConvTab[http2.ErrCode(f.ErrCode)] if !ok { - grpclog.Println("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error ", f.ErrCode) - s.statusCode = codes.Unknown + warningf("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error %v", f.ErrCode) + statusCode = codes.Unknown } - s.statusDesc = fmt.Sprintf("stream terminated by RST_STREAM with error code: %d", f.ErrCode) - close(s.done) + s.finish(status.Newf(statusCode, "stream terminated by RST_STREAM with error code: %d", f.ErrCode)) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) } @@ -802,7 +974,11 @@ func (t *http2Client) handleSettings(f *http2.SettingsFrame) { } func (t *http2Client) handlePing(f *http2.PingFrame) { - if f.IsAck() { // Do nothing. + if f.IsAck() { + // Maybe it's a BDP ping. + if t.bdpEst != nil { + t.bdpEst.calculate(f.Data) + } return } pingAck := &ping{ack: true} @@ -811,6 +987,9 @@ func (t *http2Client) handlePing(f *http2.PingFrame) { } func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { + if f.ErrCode == http2.ErrCodeEnhanceYourCalm { + infof("Client received GoAway with http2.ErrCodeEnhanceYourCalm.") + } t.mu.Lock() if t.state == reachable || t.state == draining { if f.LastStreamID > 0 && f.LastStreamID%2 != 1 { @@ -832,6 +1011,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { t.mu.Unlock() return default: + t.setGoAwayReason(f) } t.goAwayID = f.LastStreamID close(t.goAway) @@ -839,6 +1019,26 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { t.mu.Unlock() } +// setGoAwayReason sets the value of t.goAwayReason based +// on the GoAway frame received. +// It expects a lock on transport's mutext to be held by +// the caller. +func (t *http2Client) setGoAwayReason(f *http2.GoAwayFrame) { + t.goAwayReason = NoReason + switch f.ErrCode { + case http2.ErrCodeEnhanceYourCalm: + if string(f.DebugData()) == "too_many_pings" { + t.goAwayReason = TooManyPings + } + } +} + +func (t *http2Client) GetGoAwayReason() GoAwayReason { + t.mu.Lock() + defer t.mu.Unlock() + return t.goAwayReason +} + func (t *http2Client) handleWindowUpdate(f *http2.WindowUpdateFrame) { id := f.Header().StreamID incr := f.Increment @@ -857,23 +1057,41 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { if !ok { return } + s.mu.Lock() + s.bytesReceived = true + s.mu.Unlock() var state decodeState - for _, hf := range frame.Fields { - state.processHeaderField(hf) - } - if state.err != nil { + if err := state.decodeResponseHeader(frame); err != nil { s.mu.Lock() if !s.headerDone { close(s.headerChan) s.headerDone = true } s.mu.Unlock() - s.write(recvMsg{err: state.err}) + s.write(recvMsg{err: err}) // Something wrong. Stops reading even when there is remaining. return } endStream := frame.StreamEnded() + var isHeader bool + defer func() { + if t.statsHandler != nil { + if isHeader { + inHeader := &stats.InHeader{ + Client: true, + WireLength: int(frame.Header().Length), + } + t.statsHandler.HandleRPC(s.ctx, inHeader) + } else { + inTrailer := &stats.InTrailer{ + Client: true, + WireLength: int(frame.Header().Length), + } + t.statsHandler.HandleRPC(s.ctx, inTrailer) + } + } + }() s.mu.Lock() if !endStream { @@ -885,6 +1103,7 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { } close(s.headerChan) s.headerDone = true + isHeader = true } if !endStream || s.state == streamDone { s.mu.Unlock() @@ -894,10 +1113,7 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { if len(state.mdata) > 0 { s.trailer = state.mdata } - s.statusCode = state.statusCode - s.statusDesc = state.statusDesc - close(s.done) - s.state = streamDone + s.finish(state.status()) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) } @@ -925,6 +1141,7 @@ func (t *http2Client) reader() { t.notifyError(err) return } + atomic.CompareAndSwapUint32(&t.activity, 0, 1) sf, ok := frame.(*http2.SettingsFrame) if !ok { t.notifyError(err) @@ -935,6 +1152,7 @@ func (t *http2Client) reader() { // loop to keep reading incoming messages on this transport. for { frame, err := t.framer.readFrame() + atomic.CompareAndSwapUint32(&t.activity, 0, 1) if err != nil { // Abort an active stream if the http2.Framer returns a // http2.StreamError. This can happen only if the server's response @@ -970,7 +1188,7 @@ func (t *http2Client) reader() { case *http2.WindowUpdateFrame: t.handleWindowUpdate(frame) default: - grpclog.Printf("transport: http2Client.reader got unhandled frame type %v.", frame) + errorf("transport: http2Client.reader got unhandled frame type %v.", frame) } } } @@ -986,21 +1204,15 @@ func (t *http2Client) applySettings(ss []http2.Setting) { s.Val = math.MaxInt32 } t.mu.Lock() - reset := t.streamsQuota != nil - if !reset { - t.streamsQuota = newQuotaPool(int(s.Val) - len(t.activeStreams)) - } ms := t.maxStreams t.maxStreams = int(s.Val) t.mu.Unlock() - if reset { - t.streamsQuota.reset(int(s.Val) - ms) - } + t.streamsQuota.add(int(s.Val) - ms) case http2.SettingInitialWindowSize: t.mu.Lock() for _, stream := range t.activeStreams { // Adjust the sending quota for each stream. - stream.sendQuotaPool.reset(int(s.Val - t.streamSendQuota)) + stream.sendQuotaPool.add(int(s.Val) - int(t.streamSendQuota)) } t.streamSendQuota = s.Val t.mu.Unlock() @@ -1019,7 +1231,7 @@ func (t *http2Client) controller() { case <-t.writableChan: switch i := i.(type) { case *windowUpdate: - t.framer.writeWindowUpdate(true, i.streamID, i.increment) + t.framer.writeWindowUpdate(i.flush, i.streamID, i.increment) case *settings: if i.ack { t.framer.writeSettingsAck(true) @@ -1028,13 +1240,22 @@ func (t *http2Client) controller() { t.framer.writeSettings(true, i.ss...) } case *resetStream: + // If the server needs to be to intimated about stream closing, + // then we need to make sure the RST_STREAM frame is written to + // the wire before the headers of the next stream waiting on + // streamQuota. We ensure this by adding to the streamsQuota pool + // only after having acquired the writableChan to send RST_STREAM. + t.streamsQuota.add(1) t.framer.writeRSTStream(true, i.streamID, i.code) case *flushIO: t.framer.flushWrite() case *ping: + if !i.ack { + t.bdpEst.timesnap(i.data) + } t.framer.writePing(true, i.ack, i.data) default: - grpclog.Printf("transport: http2Client.controller got unexpected item type %v\n", i) + errorf("transport: http2Client.controller got unexpected item type %v\n", i) } t.writableChan <- 0 continue @@ -1047,6 +1268,61 @@ func (t *http2Client) controller() { } } +// keepalive running in a separate goroutune makes sure the connection is alive by sending pings. +func (t *http2Client) keepalive() { + p := &ping{data: [8]byte{}} + timer := time.NewTimer(t.kp.Time) + for { + select { + case <-timer.C: + if atomic.CompareAndSwapUint32(&t.activity, 1, 0) { + timer.Reset(t.kp.Time) + continue + } + // Check if keepalive should go dormant. + t.mu.Lock() + if len(t.activeStreams) < 1 && !t.kp.PermitWithoutStream { + // Make awakenKeepalive writable. + <-t.awakenKeepalive + t.mu.Unlock() + select { + case <-t.awakenKeepalive: + // If the control gets here a ping has been sent + // need to reset the timer with keepalive.Timeout. + case <-t.shutdownChan: + return + } + } else { + t.mu.Unlock() + // Send ping. + t.controlBuf.put(p) + } + + // By the time control gets here a ping has been sent one way or the other. + timer.Reset(t.kp.Timeout) + select { + case <-timer.C: + if atomic.CompareAndSwapUint32(&t.activity, 1, 0) { + timer.Reset(t.kp.Time) + continue + } + t.Close() + return + case <-t.shutdownChan: + if !timer.Stop() { + <-timer.C + } + return + } + case <-t.shutdownChan: + if !timer.Stop() { + <-timer.C + } + return + } + } +} + func (t *http2Client) Error() <-chan struct{} { return t.errorChan } @@ -1066,7 +1342,7 @@ func (t *http2Client) notifyError(err error) { if t.state == reachable { t.state = unreachable close(t.errorChan) - grpclog.Printf("transport: http2Client.notifyError got notified that the client transport was broken %v.", err) + infof("transport: http2Client.notifyError got notified that the client transport was broken %v.", err) } t.mu.Unlock() } diff --git a/vendor/google.golang.org/grpc/transport/http2_server.go b/vendor/google.golang.org/grpc/transport/http2_server.go index a62fb7c228f14..5bb283ffca49d 100644 --- a/vendor/google.golang.org/grpc/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/transport/http2_server.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -38,18 +23,25 @@ import ( "errors" "io" "math" + "math/rand" "net" "strconv" "sync" + "sync/atomic" + "time" + "github.com/golang/protobuf/proto" "golang.org/x/net/context" "golang.org/x/net/http2" "golang.org/x/net/http2/hpack" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" - "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" + "google.golang.org/grpc/tap" ) // ErrIllegalHeaderWrite indicates that setting header is illegal because of @@ -58,9 +50,13 @@ var ErrIllegalHeaderWrite = errors.New("transport: the stream is done or WriteHe // http2Server implements the ServerTransport interface with HTTP2. type http2Server struct { + ctx context.Context conn net.Conn + remoteAddr net.Addr + localAddr net.Addr maxStreamID uint32 // max stream ID ever seen authInfo credentials.AuthInfo // auth info about the connection + inTapHandle tap.ServerInHandle // writableChan synchronizes write access to the transport. // A writer acquires the write lock by receiving a value on writableChan // and releases it by sending on writableChan. @@ -77,89 +73,174 @@ type http2Server struct { maxStreams uint32 // controlBuf delivers all the control related tasks (e.g., window // updates, reset streams, and various settings) to the controller. - controlBuf *recvBuffer + controlBuf *controlBuffer fc *inFlow // sendQuotaPool provides flow control to outbound message. sendQuotaPool *quotaPool + stats stats.Handler + + // Flag to keep track of reading activity on transport. + // 1 is true and 0 is false. + activity uint32 // Accessed atomically. + // Keepalive and max-age parameters for the server. + kp keepalive.ServerParameters + + // Keepalive enforcement policy. + kep keepalive.EnforcementPolicy + // The time instance last ping was received. + lastPingAt time.Time + // Number of times the client has violated keepalive ping policy so far. + pingStrikes uint8 + // Flag to signify that number of ping strikes should be reset to 0. + // This is set whenever data or header frames are sent. + // 1 means yes. + resetPingStrikes uint32 // Accessed atomically. + + initialWindowSize int32 + + bdpEst *bdpEstimator + mu sync.Mutex // guard the following state transportState activeStreams map[uint32]*Stream // the per-stream outbound flow control window size set by the peer. streamSendQuota uint32 + // idle is the time instant when the connection went idle. + // This is either the begining of the connection or when the number of + // RPCs go down to 0. + // When the connection is busy, this value is set to 0. + idle time.Time } // newHTTP2Server constructs a ServerTransport based on HTTP2. ConnectionError is // returned if something goes wrong. -func newHTTP2Server(conn net.Conn, maxStreams uint32, authInfo credentials.AuthInfo) (_ ServerTransport, err error) { +func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err error) { framer := newFramer(conn) // Send initial settings as connection preface to client. - var settings []http2.Setting + var isettings []http2.Setting // TODO(zhaoq): Have a better way to signal "no limit" because 0 is // permitted in the HTTP2 spec. + maxStreams := config.MaxStreams if maxStreams == 0 { maxStreams = math.MaxUint32 } else { - settings = append(settings, http2.Setting{ + isettings = append(isettings, http2.Setting{ ID: http2.SettingMaxConcurrentStreams, Val: maxStreams, }) } - if initialWindowSize != defaultWindowSize { - settings = append(settings, http2.Setting{ + dynamicWindow := true + iwz := int32(initialWindowSize) + if config.InitialWindowSize >= defaultWindowSize { + iwz = config.InitialWindowSize + dynamicWindow = false + } + icwz := int32(initialWindowSize) + if config.InitialConnWindowSize >= defaultWindowSize { + icwz = config.InitialConnWindowSize + dynamicWindow = false + } + if iwz != defaultWindowSize { + isettings = append(isettings, http2.Setting{ ID: http2.SettingInitialWindowSize, - Val: uint32(initialWindowSize)}) + Val: uint32(iwz)}) } - if err := framer.writeSettings(true, settings...); err != nil { + if err := framer.writeSettings(true, isettings...); err != nil { return nil, connectionErrorf(true, err, "transport: %v", err) } // Adjust the connection flow control window if needed. - if delta := uint32(initialConnWindowSize - defaultWindowSize); delta > 0 { + if delta := uint32(icwz - defaultWindowSize); delta > 0 { if err := framer.writeWindowUpdate(true, 0, delta); err != nil { return nil, connectionErrorf(true, err, "transport: %v", err) } } + kp := config.KeepaliveParams + if kp.MaxConnectionIdle == 0 { + kp.MaxConnectionIdle = defaultMaxConnectionIdle + } + if kp.MaxConnectionAge == 0 { + kp.MaxConnectionAge = defaultMaxConnectionAge + } + // Add a jitter to MaxConnectionAge. + kp.MaxConnectionAge += getJitter(kp.MaxConnectionAge) + if kp.MaxConnectionAgeGrace == 0 { + kp.MaxConnectionAgeGrace = defaultMaxConnectionAgeGrace + } + if kp.Time == 0 { + kp.Time = defaultServerKeepaliveTime + } + if kp.Timeout == 0 { + kp.Timeout = defaultServerKeepaliveTimeout + } + kep := config.KeepalivePolicy + if kep.MinTime == 0 { + kep.MinTime = defaultKeepalivePolicyMinTime + } var buf bytes.Buffer t := &http2Server{ - conn: conn, - authInfo: authInfo, - framer: framer, - hBuf: &buf, - hEnc: hpack.NewEncoder(&buf), - maxStreams: maxStreams, - controlBuf: newRecvBuffer(), - fc: &inFlow{limit: initialConnWindowSize}, - sendQuotaPool: newQuotaPool(defaultWindowSize), - state: reachable, - writableChan: make(chan int, 1), - shutdownChan: make(chan struct{}), - activeStreams: make(map[uint32]*Stream), - streamSendQuota: defaultWindowSize, + ctx: context.Background(), + conn: conn, + remoteAddr: conn.RemoteAddr(), + localAddr: conn.LocalAddr(), + authInfo: config.AuthInfo, + framer: framer, + hBuf: &buf, + hEnc: hpack.NewEncoder(&buf), + maxStreams: maxStreams, + inTapHandle: config.InTapHandle, + controlBuf: newControlBuffer(), + fc: &inFlow{limit: uint32(icwz)}, + sendQuotaPool: newQuotaPool(defaultWindowSize), + state: reachable, + writableChan: make(chan int, 1), + shutdownChan: make(chan struct{}), + activeStreams: make(map[uint32]*Stream), + streamSendQuota: defaultWindowSize, + stats: config.StatsHandler, + kp: kp, + idle: time.Now(), + kep: kep, + initialWindowSize: iwz, + } + if dynamicWindow { + t.bdpEst = &bdpEstimator{ + bdp: initialWindowSize, + updateFlowControl: t.updateFlowControl, + } + } + if t.stats != nil { + t.ctx = t.stats.TagConn(t.ctx, &stats.ConnTagInfo{ + RemoteAddr: t.remoteAddr, + LocalAddr: t.localAddr, + }) + connBegin := &stats.ConnBegin{} + t.stats.HandleConn(t.ctx, connBegin) } go t.controller() + go t.keepalive() t.writableChan <- 0 return t, nil } // operateHeader takes action on the decoded headers. -func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream)) (close bool) { +func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream), traceCtx func(context.Context, string) context.Context) (close bool) { buf := newRecvBuffer() s := &Stream{ id: frame.Header().StreamID, st: t, buf: buf, - fc: &inFlow{limit: initialWindowSize}, + fc: &inFlow{limit: uint32(t.initialWindowSize)}, } var state decodeState for _, hf := range frame.Fields { - state.processHeaderField(hf) - } - if err := state.err; err != nil { - if se, ok := err.(StreamError); ok { - t.controlBuf.put(&resetStream{s.id, statusCodeConvTab[se.Code]}) + if err := state.processHeaderField(hf); err != nil { + if se, ok := err.(StreamError); ok { + t.controlBuf.put(&resetStream{s.id, statusCodeConvTab[se.Code]}) + } + return } - return } if frame.StreamEnded() { @@ -168,12 +249,12 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( } s.recvCompress = state.encoding if state.timeoutSet { - s.ctx, s.cancel = context.WithTimeout(context.TODO(), state.timeout) + s.ctx, s.cancel = context.WithTimeout(t.ctx, state.timeout) } else { - s.ctx, s.cancel = context.WithCancel(context.TODO()) + s.ctx, s.cancel = context.WithCancel(t.ctx) } pr := &peer.Peer{ - Addr: t.conn.RemoteAddr(), + Addr: t.remoteAddr, } // Attach Auth info if there is any. if t.authInfo != nil { @@ -186,15 +267,31 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( s.ctx = newContextWithStream(s.ctx, s) // Attach the received metadata to the context. if len(state.mdata) > 0 { - s.ctx = metadata.NewContext(s.ctx, state.mdata) + s.ctx = metadata.NewIncomingContext(s.ctx, state.mdata) } - - s.dec = &recvBufferReader{ - ctx: s.ctx, - recv: s.buf, + s.trReader = &transportReader{ + reader: &recvBufferReader{ + ctx: s.ctx, + recv: s.buf, + }, + windowHandler: func(n int) { + t.updateWindow(s, uint32(n)) + }, } s.recvCompress = state.encoding s.method = state.method + if t.inTapHandle != nil { + var err error + info := &tap.Info{ + FullMethodName: state.method, + } + s.ctx, err = t.inTapHandle(s.ctx, info) + if err != nil { + warningf("transport: http2Server.operateHeaders got an error from InTapHandle: %v", err) + t.controlBuf.put(&resetStream{s.id, http2.ErrCodeRefusedStream}) + return + } + } t.mu.Lock() if t.state != reachable { t.mu.Unlock() @@ -208,15 +305,30 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( if s.id%2 != 1 || s.id <= t.maxStreamID { t.mu.Unlock() // illegal gRPC stream id. - grpclog.Println("transport: http2Server.HandleStreams received an illegal stream id: ", s.id) + errorf("transport: http2Server.HandleStreams received an illegal stream id: %v", s.id) return true } t.maxStreamID = s.id s.sendQuotaPool = newQuotaPool(int(t.streamSendQuota)) t.activeStreams[s.id] = s + if len(t.activeStreams) == 1 { + t.idle = time.Time{} + } t.mu.Unlock() - s.windowHandler = func(n int) { - t.updateWindow(s, uint32(n)) + s.requestRead = func(n int) { + t.adjustWindow(s, uint32(n)) + } + s.ctx = traceCtx(s.ctx, s.method) + if t.stats != nil { + s.ctx = t.stats.TagRPC(s.ctx, &stats.RPCTagInfo{FullMethodName: s.method}) + inHeader := &stats.InHeader{ + FullMethod: s.method, + RemoteAddr: t.remoteAddr, + LocalAddr: t.localAddr, + Compression: s.recvCompress, + WireLength: int(frame.Header().Length), + } + t.stats.HandleRPC(s.ctx, inHeader) } handle(s) return @@ -224,16 +336,20 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( // HandleStreams receives incoming streams using the given handler. This is // typically run in a separate goroutine. -func (t *http2Server) HandleStreams(handle func(*Stream)) { +// traceCtx attaches trace to ctx and returns the new context. +func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.Context, string) context.Context) { // Check the validity of client preface. preface := make([]byte, len(clientPreface)) if _, err := io.ReadFull(t.conn, preface); err != nil { - grpclog.Printf("transport: http2Server.HandleStreams failed to receive the preface from client: %v", err) + // Only log if it isn't a simple tcp accept check (ie: tcp balancer doing open/close socket) + if err != io.EOF { + errorf("transport: http2Server.HandleStreams failed to receive the preface from client: %v", err) + } t.Close() return } if !bytes.Equal(preface, clientPreface) { - grpclog.Printf("transport: http2Server.HandleStreams received bogus greeting from client: %q", preface) + errorf("transport: http2Server.HandleStreams received bogus greeting from client: %q", preface) t.Close() return } @@ -244,13 +360,14 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) { return } if err != nil { - grpclog.Printf("transport: http2Server.HandleStreams failed to read frame: %v", err) + errorf("transport: http2Server.HandleStreams failed to read initial settings frame: %v", err) t.Close() return } + atomic.StoreUint32(&t.activity, 1) sf, ok := frame.(*http2.SettingsFrame) if !ok { - grpclog.Printf("transport: http2Server.HandleStreams saw invalid preface type %T from client", frame) + errorf("transport: http2Server.HandleStreams saw invalid preface type %T from client", frame) t.Close() return } @@ -258,6 +375,7 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) { for { frame, err := t.framer.readFrame() + atomic.StoreUint32(&t.activity, 1) if err != nil { if se, ok := err.(http2.StreamError); ok { t.mu.Lock() @@ -273,13 +391,13 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) { t.Close() return } - grpclog.Printf("transport: http2Server.HandleStreams failed to read frame: %v", err) + warningf("transport: http2Server.HandleStreams failed to read frame: %v", err) t.Close() return } switch frame := frame.(type) { case *http2.MetaHeadersFrame: - if t.operateHeaders(frame, handle) { + if t.operateHeaders(frame, handle, traceCtx) { t.Close() break } @@ -296,7 +414,7 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) { case *http2.GoAwayFrame: // TODO: Handle GoAway from the client appropriately. default: - grpclog.Printf("transport: http2Server.HandleStreams found unhandled frame type %v.", frame) + errorf("transport: http2Server.HandleStreams found unhandled frame type %v.", frame) } } } @@ -316,6 +434,23 @@ func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { return s, true } +// adjustWindow sends out extra window update over the initial window size +// of stream if the application is requesting data larger in size than +// the window. +func (t *http2Server) adjustWindow(s *Stream, n uint32) { + s.mu.Lock() + defer s.mu.Unlock() + if s.state == streamDone { + return + } + if w := s.fc.maybeAdjust(n); w > 0 { + if cw := t.fc.resetPendingUpdate(); cw > 0 { + t.controlBuf.put(&windowUpdate{0, cw, false}) + } + t.controlBuf.put(&windowUpdate{s.id, w, true}) + } +} + // updateWindow adjusts the inbound quota for the stream and the transport. // Window updates will deliver to the controller for sending when // the cumulative quota exceeds the corresponding threshold. @@ -325,37 +460,76 @@ func (t *http2Server) updateWindow(s *Stream, n uint32) { if s.state == streamDone { return } - if w := t.fc.onRead(n); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } if w := s.fc.onRead(n); w > 0 { - t.controlBuf.put(&windowUpdate{s.id, w}) + if cw := t.fc.resetPendingUpdate(); cw > 0 { + t.controlBuf.put(&windowUpdate{0, cw, false}) + } + t.controlBuf.put(&windowUpdate{s.id, w, true}) } } +// updateFlowControl updates the incoming flow control windows +// for the transport and the stream based on the current bdp +// estimation. +func (t *http2Server) updateFlowControl(n uint32) { + t.mu.Lock() + for _, s := range t.activeStreams { + s.fc.newLimit(n) + } + t.initialWindowSize = int32(n) + t.mu.Unlock() + t.controlBuf.put(&windowUpdate{0, t.fc.newLimit(n), false}) + t.controlBuf.put(&settings{ + ack: false, + ss: []http2.Setting{ + { + ID: http2.SettingInitialWindowSize, + Val: uint32(n), + }, + }, + }) + +} + func (t *http2Server) handleData(f *http2.DataFrame) { - size := len(f.Data()) - if err := t.fc.onData(uint32(size)); err != nil { - grpclog.Printf("transport: http2Server %v", err) - t.Close() - return + size := f.Header().Length + var sendBDPPing bool + if t.bdpEst != nil { + sendBDPPing = t.bdpEst.add(uint32(size)) + } + // Decouple connection's flow control from application's read. + // An update on connection's flow control should not depend on + // whether user application has read the data or not. Such a + // restriction is already imposed on the stream's flow control, + // and therefore the sender will be blocked anyways. + // Decoupling the connection flow control will prevent other + // active(fast) streams from starving in presence of slow or + // inactive streams. + // + // Furthermore, if a bdpPing is being sent out we can piggyback + // connection's window update for the bytes we just received. + if sendBDPPing { + t.controlBuf.put(&windowUpdate{0, uint32(size), false}) + t.controlBuf.put(bdpPing) + } else { + if err := t.fc.onData(uint32(size)); err != nil { + errorf("transport: http2Server %v", err) + t.Close() + return + } + if w := t.fc.onRead(uint32(size)); w > 0 { + t.controlBuf.put(&windowUpdate{0, w, true}) + } } // Select the right stream to dispatch. s, ok := t.getStream(f) if !ok { - if w := t.fc.onRead(uint32(size)); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } return } if size > 0 { s.mu.Lock() if s.state == streamDone { s.mu.Unlock() - // The stream has been closed. Release the corresponding quota. - if w := t.fc.onRead(uint32(size)); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } return } if err := s.fc.onData(uint32(size)); err != nil { @@ -364,13 +538,20 @@ func (t *http2Server) handleData(f *http2.DataFrame) { t.controlBuf.put(&resetStream{s.id, http2.ErrCodeFlowControl}) return } + if f.Header().Flags.Has(http2.FlagDataPadded) { + if w := s.fc.onRead(uint32(size) - uint32(len(f.Data()))); w > 0 { + t.controlBuf.put(&windowUpdate{s.id, w, true}) + } + } s.mu.Unlock() // TODO(bradfitz, zhaoq): A copy is required here because there is no // guarantee f.Data() is consumed before the arrival of next frame. // Can this copy be eliminated? - data := make([]byte, size) - copy(data, f.Data()) - s.write(recvMsg{data: data}) + if len(f.Data()) > 0 { + data := make([]byte, len(f.Data())) + copy(data, f.Data()) + s.write(recvMsg{data: data}) + } } if f.Header().Flags.Has(http2.FlagDataEndStream) { // Received the end of stream from the client. @@ -404,13 +585,54 @@ func (t *http2Server) handleSettings(f *http2.SettingsFrame) { t.controlBuf.put(&settings{ack: true, ss: ss}) } +const ( + maxPingStrikes = 2 + defaultPingTimeout = 2 * time.Hour +) + func (t *http2Server) handlePing(f *http2.PingFrame) { - if f.IsAck() { // Do nothing. + if f.IsAck() { + // Maybe it's a BDP ping. + if t.bdpEst != nil { + t.bdpEst.calculate(f.Data) + } return } pingAck := &ping{ack: true} copy(pingAck.data[:], f.Data[:]) t.controlBuf.put(pingAck) + + now := time.Now() + defer func() { + t.lastPingAt = now + }() + // A reset ping strikes means that we don't need to check for policy + // violation for this ping and the pingStrikes counter should be set + // to 0. + if atomic.CompareAndSwapUint32(&t.resetPingStrikes, 1, 0) { + t.pingStrikes = 0 + return + } + t.mu.Lock() + ns := len(t.activeStreams) + t.mu.Unlock() + if ns < 1 && !t.kep.PermitWithoutStream { + // Keepalive shouldn't be active thus, this new ping should + // have come after atleast defaultPingTimeout. + if t.lastPingAt.Add(defaultPingTimeout).After(now) { + t.pingStrikes++ + } + } else { + // Check if keepalive policy is respected. + if t.lastPingAt.Add(t.kep.MinTime).After(now) { + t.pingStrikes++ + } + } + + if t.pingStrikes > maxPingStrikes { + // Send goaway and close the connection. + t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings")}) + } } func (t *http2Server) handleWindowUpdate(f *http2.WindowUpdateFrame) { @@ -429,6 +651,13 @@ func (t *http2Server) writeHeaders(s *Stream, b *bytes.Buffer, endStream bool) e first := true endHeaders := false var err error + defer func() { + if err == nil { + // Reset ping strikes when seding headers since that might cause the + // peer to send ping. + atomic.StoreUint32(&t.resetPingStrikes, 1) + } + }() // Sends the headers in a single batch. for !endHeaders { size := t.hBuf.Len() @@ -483,18 +712,25 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { if s.sendCompress != "" { t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress}) } - for k, v := range md { + for k, vv := range md { if isReservedHeader(k) { // Clients don't tolerate reading restricted headers after some non restricted ones were sent. continue } - for _, entry := range v { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: entry}) + for _, v := range vv { + t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) } } + bufLen := t.hBuf.Len() if err := t.writeHeaders(s, t.hBuf, false); err != nil { return err } + if t.stats != nil { + outHeader := &stats.OutHeader{ + WireLength: bufLen, + } + t.stats.HandleRPC(s.Context(), outHeader) + } t.writableChan <- 0 return nil } @@ -503,7 +739,7 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { // There is no further I/O operations being able to perform on this stream. // TODO(zhaoq): Now it indicates the end of entire stream. Revisit if early // OK is adopted. -func (t *http2Server) WriteStatus(s *Stream, statusCode codes.Code, statusDesc string) error { +func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { var headersSent, hasHeader bool s.mu.Lock() if s.state == streamDone { @@ -534,23 +770,41 @@ func (t *http2Server) WriteStatus(s *Stream, statusCode codes.Code, statusDesc s t.hEnc.WriteField( hpack.HeaderField{ Name: "grpc-status", - Value: strconv.Itoa(int(statusCode)), + Value: strconv.Itoa(int(st.Code())), }) - t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(statusDesc)}) + t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(st.Message())}) + + if p := st.Proto(); p != nil && len(p.Details) > 0 { + stBytes, err := proto.Marshal(p) + if err != nil { + // TODO: return error instead, when callers are able to handle it. + panic(err) + } + + t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-status-details-bin", Value: encodeBinHeader(stBytes)}) + } + // Attach the trailer metadata. - for k, v := range s.trailer { + for k, vv := range s.trailer { // Clients don't tolerate reading restricted headers after some non restricted ones were sent. if isReservedHeader(k) { continue } - for _, entry := range v { - t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: entry}) + for _, v := range vv { + t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) } } + bufLen := t.hBuf.Len() if err := t.writeHeaders(s, t.hBuf, true); err != nil { t.Close() return err } + if t.stats != nil { + outTrailer := &stats.OutTrailer{ + WireLength: bufLen, + } + t.stats.HandleRPC(s.Context(), outTrailer) + } t.closeStream(s) t.writableChan <- 0 return nil @@ -558,7 +812,7 @@ func (t *http2Server) WriteStatus(s *Stream, statusCode codes.Code, statusDesc s // Write converts the data into HTTP2 data frame and sends it out. Non-nil error // is returns if it fails (e.g., framing error, transport error). -func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { +func (t *http2Server) Write(s *Stream, data []byte, opts *Options) (err error) { // TODO(zhaoq): Support multi-writers for a single stream. var writeHeaderFrame bool s.mu.Lock() @@ -579,19 +833,14 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { return nil } size := http2MaxFrameLen - s.sendQuotaPool.add(0) // Wait until the stream has some quota to send the data. sq, err := wait(s.ctx, nil, nil, t.shutdownChan, s.sendQuotaPool.acquire()) if err != nil { return err } - t.sendQuotaPool.add(0) // Wait until the transport has some quota to send the data. tq, err := wait(s.ctx, nil, nil, t.shutdownChan, t.sendQuotaPool.acquire()) if err != nil { - if _, ok := err.(StreamError); ok { - t.sendQuotaPool.cancel() - } return err } if sq < size { @@ -641,6 +890,9 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { if r.Len() == 0 && t.framer.adjustNumWriters(0) == 1 && !opts.Last { forceFlush = true } + // Reset ping strikes when sending data since this might cause + // the peer to send ping. + atomic.StoreUint32(&t.resetPingStrikes, 1) if err := t.framer.writeData(forceFlush, s.id, false, p); err != nil { t.Close() return connectionErrorf(true, err, "transport: %v", err) @@ -659,7 +911,7 @@ func (t *http2Server) applySettings(ss []http2.Setting) { t.mu.Lock() defer t.mu.Unlock() for _, stream := range t.activeStreams { - stream.sendQuotaPool.reset(int(s.Val - t.streamSendQuota)) + stream.sendQuotaPool.add(int(s.Val) - int(t.streamSendQuota)) } t.streamSendQuota = s.Val } @@ -667,6 +919,91 @@ func (t *http2Server) applySettings(ss []http2.Setting) { } } +// keepalive running in a separate goroutine does the following: +// 1. Gracefully closes an idle connection after a duration of keepalive.MaxConnectionIdle. +// 2. Gracefully closes any connection after a duration of keepalive.MaxConnectionAge. +// 3. Forcibly closes a connection after an additive period of keepalive.MaxConnectionAgeGrace over keepalive.MaxConnectionAge. +// 4. Makes sure a connection is alive by sending pings with a frequency of keepalive.Time and closes a non-resposive connection +// after an additional duration of keepalive.Timeout. +func (t *http2Server) keepalive() { + p := &ping{} + var pingSent bool + maxIdle := time.NewTimer(t.kp.MaxConnectionIdle) + maxAge := time.NewTimer(t.kp.MaxConnectionAge) + keepalive := time.NewTimer(t.kp.Time) + // NOTE: All exit paths of this function should reset their + // respecitve timers. A failure to do so will cause the + // following clean-up to deadlock and eventually leak. + defer func() { + if !maxIdle.Stop() { + <-maxIdle.C + } + if !maxAge.Stop() { + <-maxAge.C + } + if !keepalive.Stop() { + <-keepalive.C + } + }() + for { + select { + case <-maxIdle.C: + t.mu.Lock() + idle := t.idle + if idle.IsZero() { // The connection is non-idle. + t.mu.Unlock() + maxIdle.Reset(t.kp.MaxConnectionIdle) + continue + } + val := t.kp.MaxConnectionIdle - time.Since(idle) + if val <= 0 { + // The connection has been idle for a duration of keepalive.MaxConnectionIdle or more. + // Gracefully close the connection. + t.state = draining + t.mu.Unlock() + t.Drain() + // Reseting the timer so that the clean-up doesn't deadlock. + maxIdle.Reset(infinity) + return + } + t.mu.Unlock() + maxIdle.Reset(val) + case <-maxAge.C: + t.mu.Lock() + t.state = draining + t.mu.Unlock() + t.Drain() + maxAge.Reset(t.kp.MaxConnectionAgeGrace) + select { + case <-maxAge.C: + // Close the connection after grace period. + t.Close() + // Reseting the timer so that the clean-up doesn't deadlock. + maxAge.Reset(infinity) + case <-t.shutdownChan: + } + return + case <-keepalive.C: + if atomic.CompareAndSwapUint32(&t.activity, 1, 0) { + pingSent = false + keepalive.Reset(t.kp.Time) + continue + } + if pingSent { + t.Close() + // Reseting the timer so that the clean-up doesn't deadlock. + keepalive.Reset(infinity) + return + } + pingSent = true + t.controlBuf.put(p) + keepalive.Reset(t.kp.Timeout) + case <-t.shutdownChan: + return + } + } +} + // controller running in a separate goroutine takes charge of sending control // frames (e.g., window update, reset stream, setting, etc.) to the server. func (t *http2Server) controller() { @@ -678,7 +1015,7 @@ func (t *http2Server) controller() { case <-t.writableChan: switch i := i.(type) { case *windowUpdate: - t.framer.writeWindowUpdate(true, i.streamID, i.increment) + t.framer.writeWindowUpdate(i.flush, i.streamID, i.increment) case *settings: if i.ack { t.framer.writeSettingsAck(true) @@ -698,13 +1035,19 @@ func (t *http2Server) controller() { sid := t.maxStreamID t.state = draining t.mu.Unlock() - t.framer.writeGoAway(true, sid, http2.ErrCodeNo, nil) + t.framer.writeGoAway(true, sid, i.code, i.debugData) + if i.code == http2.ErrCodeEnhanceYourCalm { + t.Close() + } case *flushIO: t.framer.flushWrite() case *ping: + if !i.ack { + t.bdpEst.timesnap(i.data) + } t.framer.writePing(true, i.ack, i.data) default: - grpclog.Printf("transport: http2Server.controller got unexpected item type %v\n", i) + errorf("transport: http2Server.controller got unexpected item type %v\n", i) } t.writableChan <- 0 continue @@ -736,6 +1079,10 @@ func (t *http2Server) Close() (err error) { for _, s := range streams { s.cancel() } + if t.stats != nil { + connEnd := &stats.ConnEnd{} + t.stats.HandleConn(t.ctx, connEnd) + } return } @@ -744,6 +1091,9 @@ func (t *http2Server) Close() (err error) { func (t *http2Server) closeStream(s *Stream) { t.mu.Lock() delete(t.activeStreams, s.id) + if len(t.activeStreams) == 0 { + t.idle = time.Now() + } if t.state == draining && len(t.activeStreams) == 0 { defer t.Close() } @@ -753,11 +1103,6 @@ func (t *http2Server) closeStream(s *Stream) { // called to interrupt the potential blocking on other goroutines. s.cancel() s.mu.Lock() - if q := s.fc.resetPendingData(); q > 0 { - if w := t.fc.onRead(q); w > 0 { - t.controlBuf.put(&windowUpdate{0, w}) - } - } if s.state == streamDone { s.mu.Unlock() return @@ -767,9 +1112,21 @@ func (t *http2Server) closeStream(s *Stream) { } func (t *http2Server) RemoteAddr() net.Addr { - return t.conn.RemoteAddr() + return t.remoteAddr } func (t *http2Server) Drain() { - t.controlBuf.put(&goAway{}) + t.controlBuf.put(&goAway{code: http2.ErrCodeNo}) +} + +var rgen = rand.New(rand.NewSource(time.Now().UnixNano())) + +func getJitter(v time.Duration) time.Duration { + if v == infinity { + return 0 + } + // Generate a jitter between +/- 10% of the value. + r := int64(v / 10) + j := rgen.Int63n(2*r) - r + return time.Duration(j) } diff --git a/vendor/google.golang.org/grpc/transport/http_util.go b/vendor/google.golang.org/grpc/transport/http_util.go index a3c68d4cac7e6..685c6fbf96782 100644 --- a/vendor/google.golang.org/grpc/transport/http_util.go +++ b/vendor/google.golang.org/grpc/transport/http_util.go @@ -1,33 +1,18 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -36,24 +21,25 @@ package transport import ( "bufio" "bytes" + "encoding/base64" "fmt" "io" "net" + "net/http" "strconv" "strings" "sync/atomic" "time" + "github.com/golang/protobuf/proto" "golang.org/x/net/http2" "golang.org/x/net/http2/hpack" + spb "google.golang.org/genproto/googleapis/rpc/status" "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" ) const ( - // The primary user agent - primaryUA = "grpc-go/1.0" // http2MaxFrameLen specifies the max length of a HTTP2 frame. http2MaxFrameLen = 16384 // 16KB frame // http://http2.github.io/http2-spec/#SettingValues @@ -87,18 +73,39 @@ var ( codes.ResourceExhausted: http2.ErrCodeEnhanceYourCalm, codes.PermissionDenied: http2.ErrCodeInadequateSecurity, } + httpStatusConvTab = map[int]codes.Code{ + // 400 Bad Request - INTERNAL. + http.StatusBadRequest: codes.Internal, + // 401 Unauthorized - UNAUTHENTICATED. + http.StatusUnauthorized: codes.Unauthenticated, + // 403 Forbidden - PERMISSION_DENIED. + http.StatusForbidden: codes.PermissionDenied, + // 404 Not Found - UNIMPLEMENTED. + http.StatusNotFound: codes.Unimplemented, + // 429 Too Many Requests - UNAVAILABLE. + http.StatusTooManyRequests: codes.Unavailable, + // 502 Bad Gateway - UNAVAILABLE. + http.StatusBadGateway: codes.Unavailable, + // 503 Service Unavailable - UNAVAILABLE. + http.StatusServiceUnavailable: codes.Unavailable, + // 504 Gateway timeout - UNAVAILABLE. + http.StatusGatewayTimeout: codes.Unavailable, + } ) // Records the states during HPACK decoding. Must be reset once the // decoding of the entire headers are finished. type decodeState struct { - err error // first error encountered decoding - encoding string - // statusCode caches the stream status received from the trailer - // the server sent. Client side only. - statusCode codes.Code - statusDesc string + // statusGen caches the stream status received from the trailer the server + // sent. Client side only. Do not access directly. After all trailers are + // parsed, use the status method to retrieve the status. + statusGen *status.Status + // rawStatusCode and rawStatusMsg are set from the raw trailer fields and are not + // intended for direct access outside of parsing. + rawStatusCode *int + rawStatusMsg string + httpStatus *int // Server side only fields. timeoutSet bool timeout time.Duration @@ -121,6 +128,7 @@ func isReservedHeader(hdr string) bool { "grpc-message", "grpc-status", "grpc-timeout", + "grpc-status-details-bin", "te": return true default: @@ -139,12 +147,6 @@ func isWhitelistedPseudoHeader(hdr string) bool { } } -func (d *decodeState) setErr(err error) { - if d.err == nil { - d.err = err - } -} - func validContentType(t string) bool { e := "application/grpc" if !strings.HasPrefix(t, e) { @@ -158,56 +160,135 @@ func validContentType(t string) bool { return true } -func (d *decodeState) processHeaderField(f hpack.HeaderField) { +func (d *decodeState) status() *status.Status { + if d.statusGen == nil { + // No status-details were provided; generate status using code/msg. + d.statusGen = status.New(codes.Code(int32(*(d.rawStatusCode))), d.rawStatusMsg) + } + return d.statusGen +} + +const binHdrSuffix = "-bin" + +func encodeBinHeader(v []byte) string { + return base64.RawStdEncoding.EncodeToString(v) +} + +func decodeBinHeader(v string) ([]byte, error) { + if len(v)%4 == 0 { + // Input was padded, or padding was not necessary. + return base64.StdEncoding.DecodeString(v) + } + return base64.RawStdEncoding.DecodeString(v) +} + +func encodeMetadataHeader(k, v string) string { + if strings.HasSuffix(k, binHdrSuffix) { + return encodeBinHeader(([]byte)(v)) + } + return v +} + +func decodeMetadataHeader(k, v string) (string, error) { + if strings.HasSuffix(k, binHdrSuffix) { + b, err := decodeBinHeader(v) + return string(b), err + } + return v, nil +} + +func (d *decodeState) decodeResponseHeader(frame *http2.MetaHeadersFrame) error { + for _, hf := range frame.Fields { + if err := d.processHeaderField(hf); err != nil { + return err + } + } + + // If grpc status exists, no need to check further. + if d.rawStatusCode != nil || d.statusGen != nil { + return nil + } + + // If grpc status doesn't exist and http status doesn't exist, + // then it's a malformed header. + if d.httpStatus == nil { + return streamErrorf(codes.Internal, "malformed header: doesn't contain status(gRPC or HTTP)") + } + + if *(d.httpStatus) != http.StatusOK { + code, ok := httpStatusConvTab[*(d.httpStatus)] + if !ok { + code = codes.Unknown + } + return streamErrorf(code, http.StatusText(*(d.httpStatus))) + } + + // gRPC status doesn't exist and http status is OK. + // Set rawStatusCode to be unknown and return nil error. + // So that, if the stream has ended this Unknown status + // will be propogated to the user. + // Otherwise, it will be ignored. In which case, status from + // a later trailer, that has StreamEnded flag set, is propogated. + code := int(codes.Unknown) + d.rawStatusCode = &code + return nil + +} + +func (d *decodeState) processHeaderField(f hpack.HeaderField) error { switch f.Name { case "content-type": if !validContentType(f.Value) { - d.setErr(streamErrorf(codes.FailedPrecondition, "transport: received the unexpected content-type %q", f.Value)) - return + return streamErrorf(codes.FailedPrecondition, "transport: received the unexpected content-type %q", f.Value) } case "grpc-encoding": d.encoding = f.Value case "grpc-status": code, err := strconv.Atoi(f.Value) if err != nil { - d.setErr(streamErrorf(codes.Internal, "transport: malformed grpc-status: %v", err)) - return + return streamErrorf(codes.Internal, "transport: malformed grpc-status: %v", err) } - d.statusCode = codes.Code(code) + d.rawStatusCode = &code case "grpc-message": - d.statusDesc = decodeGrpcMessage(f.Value) + d.rawStatusMsg = decodeGrpcMessage(f.Value) + case "grpc-status-details-bin": + v, err := decodeBinHeader(f.Value) + if err != nil { + return streamErrorf(codes.Internal, "transport: malformed grpc-status-details-bin: %v", err) + } + s := &spb.Status{} + if err := proto.Unmarshal(v, s); err != nil { + return streamErrorf(codes.Internal, "transport: malformed grpc-status-details-bin: %v", err) + } + d.statusGen = status.FromProto(s) case "grpc-timeout": d.timeoutSet = true var err error - d.timeout, err = decodeTimeout(f.Value) - if err != nil { - d.setErr(streamErrorf(codes.Internal, "transport: malformed time-out: %v", err)) - return + if d.timeout, err = decodeTimeout(f.Value); err != nil { + return streamErrorf(codes.Internal, "transport: malformed time-out: %v", err) } case ":path": d.method = f.Value + case ":status": + code, err := strconv.Atoi(f.Value) + if err != nil { + return streamErrorf(codes.Internal, "transport: malformed http-status: %v", err) + } + d.httpStatus = &code default: if !isReservedHeader(f.Name) || isWhitelistedPseudoHeader(f.Name) { - if f.Name == "user-agent" { - i := strings.LastIndex(f.Value, " ") - if i == -1 { - // There is no application user agent string being set. - return - } - // Extract the application user agent string. - f.Value = f.Value[:i] - } if d.mdata == nil { d.mdata = make(map[string][]string) } - k, v, err := metadata.DecodeKeyValue(f.Name, f.Value) + v, err := decodeMetadataHeader(f.Name, f.Value) if err != nil { - grpclog.Printf("Failed to decode (%q, %q): %v", f.Name, f.Value, err) - return + errorf("Failed to decode metadata header (%q, %q): %v", f.Name, f.Value, err) + return nil } - d.mdata[k] = append(d.mdata[k], v) + d.mdata[f.Name] = append(d.mdata[f.Name], v) } } + return nil } type timeoutUnit uint8 @@ -379,6 +460,9 @@ func newFramer(conn net.Conn) *framer { writer: bufio.NewWriterSize(conn, http2IOBufSize), } f.fr = http2.NewFramer(f.writer, f.reader) + // Opt-in to Frame reuse API on framer to reduce garbage. + // Frames aren't safe to read from after a subsequent call to ReadFrame. + f.fr.SetReuseFrames() f.fr.ReadMetaHeaders = hpack.NewDecoder(http2InitHeaderTableSize, nil) return f } diff --git a/vendor/google.golang.org/grpc/transport/log.go b/vendor/google.golang.org/grpc/transport/log.go new file mode 100644 index 0000000000000..ac8e358c5c8c9 --- /dev/null +++ b/vendor/google.golang.org/grpc/transport/log.go @@ -0,0 +1,50 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// This file contains wrappers for grpclog functions. +// The transport package only logs to verbose level 2 by default. + +package transport + +import "google.golang.org/grpc/grpclog" + +const logLevel = 2 + +func infof(format string, args ...interface{}) { + if grpclog.V(logLevel) { + grpclog.Infof(format, args...) + } +} + +func warningf(format string, args ...interface{}) { + if grpclog.V(logLevel) { + grpclog.Warningf(format, args...) + } +} + +func errorf(format string, args ...interface{}) { + if grpclog.V(logLevel) { + grpclog.Errorf(format, args...) + } +} + +func fatalf(format string, args ...interface{}) { + if grpclog.V(logLevel) { + grpclog.Fatalf(format, args...) + } +} diff --git a/vendor/google.golang.org/grpc/transport/pre_go16.go b/vendor/google.golang.org/grpc/transport/pre_go16.go deleted file mode 100644 index 33d91c17c4e19..0000000000000 --- a/vendor/google.golang.org/grpc/transport/pre_go16.go +++ /dev/null @@ -1,51 +0,0 @@ -// +build !go1.6 - -/* - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -package transport - -import ( - "net" - "time" - - "golang.org/x/net/context" -) - -// dialContext connects to the address on the named network. -func dialContext(ctx context.Context, network, address string) (net.Conn, error) { - var dialer net.Dialer - if deadline, ok := ctx.Deadline(); ok { - dialer.Timeout = deadline.Sub(time.Now()) - } - return dialer.Dial(network, address) -} diff --git a/vendor/google.golang.org/grpc/transport/transport.go b/vendor/google.golang.org/grpc/transport/transport.go index 21f757ac64eb5..6dc63e4539a25 100644 --- a/vendor/google.golang.org/grpc/transport/transport.go +++ b/vendor/google.golang.org/grpc/transport/transport.go @@ -1,54 +1,40 @@ /* * - * Copyright 2014, Google Inc. - * All rights reserved. + * Copyright 2014 gRPC authors. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. + * http://www.apache.org/licenses/LICENSE-2.0 * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ -/* -Package transport defines and implements message oriented communication channel -to complete various transactions (e.g., an RPC). -*/ +// Package transport defines and implements message oriented communication +// channel to complete various transactions (e.g., an RPC). package transport import ( - "bytes" "fmt" "io" "net" "sync" "golang.org/x/net/context" - "golang.org/x/net/trace" + "golang.org/x/net/http2" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" + "google.golang.org/grpc/stats" + "google.golang.org/grpc/status" + "google.golang.org/grpc/tap" ) // recvMsg represents the received msg from the transport. All transport @@ -61,28 +47,25 @@ type recvMsg struct { err error } -func (*recvMsg) item() {} - -// All items in an out of a recvBuffer should be the same type. -type item interface { - item() -} - -// recvBuffer is an unbounded channel of item. +// recvBuffer is an unbounded channel of recvMsg structs. +// Note recvBuffer differs from controlBuffer only in that recvBuffer +// holds a channel of only recvMsg structs instead of objects implementing "item" interface. +// recvBuffer is written to much more often than +// controlBuffer and using strict recvMsg structs helps avoid allocation in "recvBuffer.put" type recvBuffer struct { - c chan item + c chan recvMsg mu sync.Mutex - backlog []item + backlog []recvMsg } func newRecvBuffer() *recvBuffer { b := &recvBuffer{ - c: make(chan item, 1), + c: make(chan recvMsg, 1), } return b } -func (b *recvBuffer) put(r item) { +func (b *recvBuffer) put(r recvMsg) { b.mu.Lock() defer b.mu.Unlock() if len(b.backlog) == 0 { @@ -101,17 +84,18 @@ func (b *recvBuffer) load() { if len(b.backlog) > 0 { select { case b.c <- b.backlog[0]: + b.backlog[0] = recvMsg{} b.backlog = b.backlog[1:] default: } } } -// get returns the channel that receives an item in the buffer. +// get returns the channel that receives a recvMsg in the buffer. // -// Upon receipt of an item, the caller should call load to send another -// item onto the channel if there is any. -func (b *recvBuffer) get() <-chan item { +// Upon receipt of a recvMsg, the caller should call load to send another +// recvMsg onto the channel if there is any. +func (b *recvBuffer) get() <-chan recvMsg { return b.c } @@ -121,7 +105,7 @@ type recvBufferReader struct { ctx context.Context goAway chan struct{} recv *recvBuffer - last *bytes.Reader // Stores the remaining data in the previous calls. + last []byte // Stores the remaining data in the previous calls. err error } @@ -133,26 +117,81 @@ func (r *recvBufferReader) Read(p []byte) (n int, err error) { return 0, r.err } defer func() { r.err = err }() - if r.last != nil && r.last.Len() > 0 { + if r.last != nil && len(r.last) > 0 { // Read remaining data left in last call. - return r.last.Read(p) + copied := copy(p, r.last) + r.last = r.last[copied:] + return copied, nil } select { case <-r.ctx.Done(): return 0, ContextErr(r.ctx.Err()) case <-r.goAway: return 0, ErrStreamDrain - case i := <-r.recv.get(): + case m := <-r.recv.get(): r.recv.load() - m := i.(*recvMsg) if m.err != nil { return 0, m.err } - r.last = bytes.NewReader(m.data) - return r.last.Read(p) + copied := copy(p, m.data) + r.last = m.data[copied:] + return copied, nil + } +} + +// All items in an out of a controlBuffer should be the same type. +type item interface { + item() +} + +// controlBuffer is an unbounded channel of item. +type controlBuffer struct { + c chan item + mu sync.Mutex + backlog []item +} + +func newControlBuffer() *controlBuffer { + b := &controlBuffer{ + c: make(chan item, 1), + } + return b +} + +func (b *controlBuffer) put(r item) { + b.mu.Lock() + defer b.mu.Unlock() + if len(b.backlog) == 0 { + select { + case b.c <- r: + return + default: + } + } + b.backlog = append(b.backlog, r) +} + +func (b *controlBuffer) load() { + b.mu.Lock() + defer b.mu.Unlock() + if len(b.backlog) > 0 { + select { + case b.c <- b.backlog[0]: + b.backlog[0] = nil + b.backlog = b.backlog[1:] + default: + } } } +// get returns the channel that receives an item in the buffer. +// +// Upon receipt of an item, the caller should call load to send another +// item onto the channel if there is any. +func (b *controlBuffer) get() <-chan item { + return b.c +} + type streamState uint8 const ( @@ -180,14 +219,17 @@ type Stream struct { recvCompress string sendCompress string buf *recvBuffer - dec io.Reader + trReader io.Reader fc *inFlow recvQuota uint32 + + // TODO: Remote this unused variable. // The accumulated inbound quota pending for window update. updateQuota uint32 - // The handler to control the window update procedure for both this - // particular stream and the associated transport. - windowHandler func(int) + + // Callback to state application's intentions to read data. This + // is used to adjust flow control, if need be. + requestRead func(int) sendQuotaPool *quotaPool // Close headerChan to indicate the end of reception of header metadata. @@ -204,9 +246,17 @@ type Stream struct { // true iff headerChan is closed. Used to avoid closing headerChan // multiple times. headerDone bool - // the status received from the server. - statusCode codes.Code - statusDesc string + // the status error received from the server. + status *status.Status + // rstStream indicates whether a RST_STREAM frame needs to be sent + // to the server to signify that this stream is closing. + rstStream bool + // rstError is the error that needs to be sent along with the RST_STREAM frame. + rstError http2.ErrCode + // bytesSent and bytesReceived indicates whether any bytes have been sent or + // received on this stream. + bytesSent bool + bytesReceived bool } // RecvCompress returns the compression algorithm applied to the inbound @@ -234,16 +284,24 @@ func (s *Stream) GoAway() <-chan struct{} { // Header acquires the key-value pairs of header metadata once it // is available. It blocks until i) the metadata is ready or ii) there is no -// header metadata or iii) the stream is cancelled/expired. +// header metadata or iii) the stream is canceled/expired. func (s *Stream) Header() (metadata.MD, error) { + var err error select { case <-s.ctx.Done(): - return nil, ContextErr(s.ctx.Err()) + err = ContextErr(s.ctx.Err()) case <-s.goAway: - return nil, ErrStreamDrain + err = ErrStreamDrain + case <-s.headerChan: + return s.header.Copy(), nil + } + // Even if the stream is closed, header is returned if available. + select { case <-s.headerChan: return s.header.Copy(), nil + default: } + return nil, err } // Trailer returns the cached trailer metedata. Note that if it is not called @@ -266,24 +324,14 @@ func (s *Stream) Context() context.Context { return s.ctx } -// TraceContext recreates the context of s with a trace.Trace. -func (s *Stream) TraceContext(tr trace.Trace) { - s.ctx = trace.NewContext(s.ctx, tr) -} - // Method returns the method for the stream. func (s *Stream) Method() string { return s.method } -// StatusCode returns statusCode received from the server. -func (s *Stream) StatusCode() codes.Code { - return s.statusCode -} - -// StatusDesc returns statusDesc received from the server. -func (s *Stream) StatusDesc() string { - return s.statusDesc +// Status returns the status received from the server. +func (s *Stream) Status() *status.Status { + return s.status } // SetHeader sets the header metadata. This can be called multiple times. @@ -314,22 +362,69 @@ func (s *Stream) SetTrailer(md metadata.MD) error { } func (s *Stream) write(m recvMsg) { - s.buf.put(&m) + s.buf.put(m) } -// Read reads all the data available for this Stream from the transport and +// Read reads all p bytes from the wire for this stream. +func (s *Stream) Read(p []byte) (n int, err error) { + // Don't request a read if there was an error earlier + if er := s.trReader.(*transportReader).er; er != nil { + return 0, er + } + s.requestRead(len(p)) + return io.ReadFull(s.trReader, p) +} + +// tranportReader reads all the data available for this Stream from the transport and // passes them into the decoder, which converts them into a gRPC message stream. // The error is io.EOF when the stream is done or another non-nil error if // the stream broke. -func (s *Stream) Read(p []byte) (n int, err error) { - n, err = s.dec.Read(p) +type transportReader struct { + reader io.Reader + // The handler to control the window update procedure for both this + // particular stream and the associated transport. + windowHandler func(int) + er error +} + +func (t *transportReader) Read(p []byte) (n int, err error) { + n, err = t.reader.Read(p) if err != nil { + t.er = err return } - s.windowHandler(n) + t.windowHandler(n) return } +// finish sets the stream's state and status, and closes the done channel. +// s.mu must be held by the caller. st must always be non-nil. +func (s *Stream) finish(st *status.Status) { + s.status = st + s.state = streamDone + close(s.done) +} + +// BytesSent indicates whether any bytes have been sent on this stream. +func (s *Stream) BytesSent() bool { + s.mu.Lock() + defer s.mu.Unlock() + return s.bytesSent +} + +// BytesReceived indicates whether any bytes have been received on this stream. +func (s *Stream) BytesReceived() bool { + s.mu.Lock() + defer s.mu.Unlock() + return s.bytesReceived +} + +// GoString is implemented by Stream so context.String() won't +// race when printing %#v. +func (s *Stream) GoString() string { + return fmt.Sprintf("", s, s.method) +} + // The key to save transport.Stream in the context. type streamKey struct{} @@ -355,22 +450,47 @@ const ( draining ) +// ServerConfig consists of all the configurations to establish a server transport. +type ServerConfig struct { + MaxStreams uint32 + AuthInfo credentials.AuthInfo + InTapHandle tap.ServerInHandle + StatsHandler stats.Handler + KeepaliveParams keepalive.ServerParameters + KeepalivePolicy keepalive.EnforcementPolicy + InitialWindowSize int32 + InitialConnWindowSize int32 +} + // NewServerTransport creates a ServerTransport with conn or non-nil error // if it fails. -func NewServerTransport(protocol string, conn net.Conn, maxStreams uint32, authInfo credentials.AuthInfo) (ServerTransport, error) { - return newHTTP2Server(conn, maxStreams, authInfo) +func NewServerTransport(protocol string, conn net.Conn, config *ServerConfig) (ServerTransport, error) { + return newHTTP2Server(conn, config) } // ConnectOptions covers all relevant options for communicating with the server. type ConnectOptions struct { // UserAgent is the application user agent. UserAgent string + // Authority is the :authority pseudo-header to use. This field has no effect if + // TransportCredentials is set. + Authority string // Dialer specifies how to dial a network address. Dialer func(context.Context, string) (net.Conn, error) + // FailOnNonTempDialError specifies if gRPC fails on non-temporary dial errors. + FailOnNonTempDialError bool // PerRPCCredentials stores the PerRPCCredentials required to issue RPCs. PerRPCCredentials []credentials.PerRPCCredentials // TransportCredentials stores the Authenticator required to setup a client connection. TransportCredentials credentials.TransportCredentials + // KeepaliveParams stores the keepalive parameters. + KeepaliveParams keepalive.ClientParameters + // StatsHandler stores the handler for stats. + StatsHandler stats.Handler + // InitialWindowSize sets the intial window size for a stream. + InitialWindowSize int32 + // InitialConnWindowSize sets the intial window size for a connection. + InitialConnWindowSize int32 } // TargetInfo contains the information of the target such as network address and metadata. @@ -414,10 +534,15 @@ type CallHdr struct { // outbound message. SendCompress string + // Creds specifies credentials.PerRPCCredentials for a call. + Creds credentials.PerRPCCredentials + // Flush indicates whether a new stream command should be sent // to the peer without waiting for the first data. This is - // only a hint. The transport may modify the flush decision + // only a hint. + // If it's true, the transport may modify the flush decision // for performance purposes. + // If it's false, new stream will never be flushed. Flush bool } @@ -453,10 +578,13 @@ type ClientTransport interface { // once the transport is initiated. Error() <-chan struct{} - // GoAway returns a channel that is closed when ClientTranspor + // GoAway returns a channel that is closed when ClientTransport // receives the draining signal from the server (e.g., GOAWAY frame in // HTTP/2). GoAway() <-chan struct{} + + // GetGoAwayReason returns the reason why GoAway frame was received. + GetGoAwayReason() GoAwayReason } // ServerTransport is the common interface for all gRPC server-side transport @@ -466,7 +594,7 @@ type ClientTransport interface { // Write methods for a given Stream will be called serially. type ServerTransport interface { // HandleStreams receives incoming streams using the given handler. - HandleStreams(func(*Stream)) + HandleStreams(func(*Stream), func(context.Context, string) context.Context) // WriteHeader sends the header metadata for the given stream. // WriteHeader may not be called on all streams. @@ -476,10 +604,9 @@ type ServerTransport interface { // Write may not be called on all streams. Write(s *Stream, data []byte, opts *Options) error - // WriteStatus sends the status of a stream to the client. - // WriteStatus is the final call made on a stream and always - // occurs. - WriteStatus(s *Stream, statusCode codes.Code, statusDesc string) error + // WriteStatus sends the status of a stream to the client. WriteStatus is + // the final call made on a stream and always occurs. + WriteStatus(s *Stream, st *status.Status) error // Close tears down the transport. Once it is called, the transport // should not be accessed any more. All the pending streams and their @@ -545,6 +672,8 @@ var ( ErrStreamDrain = streamErrorf(codes.Unavailable, "the server stops accepting new RPCs") ) +// TODO: See if we can replace StreamError with status package errors. + // StreamError is an error that only affects one stream within a connection. type StreamError struct { Code codes.Code @@ -552,18 +681,7 @@ type StreamError struct { } func (e StreamError) Error() string { - return fmt.Sprintf("stream error: code = %d desc = %q", e.Code, e.Desc) -} - -// ContextErr converts the error from context package into a StreamError. -func ContextErr(err error) StreamError { - switch err { - case context.DeadlineExceeded: - return streamErrorf(codes.DeadlineExceeded, "%v", err) - case context.Canceled: - return streamErrorf(codes.Canceled, "%v", err) - } - panic(fmt.Sprintf("Unexpected error from context packet: %v", err)) + return fmt.Sprintf("stream error: code = %s desc = %q", e.Code, e.Desc) } // wait blocks until it can receive from ctx.Done, closing, or proceed. @@ -593,3 +711,16 @@ func wait(ctx context.Context, done, goAway, closing <-chan struct{}, proceed <- return i, nil } } + +// GoAwayReason contains the reason for the GoAway frame received. +type GoAwayReason uint8 + +const ( + // Invalid indicates that no GoAway frame is received. + Invalid GoAwayReason = 0 + // NoReason is the default value when GoAway frame is received. + NoReason GoAwayReason = 1 + // TooManyPings indicates that a GoAway frame with ErrCodeEnhanceYourCalm + // was recieved and that the debug data said "too_many_pings". + TooManyPings GoAwayReason = 2 +) From 70123e71bba2cbc9d64b2a145817a43ba62da09e Mon Sep 17 00:00:00 2001 From: Shyam Jeedigunta Date: Fri, 18 Aug 2017 16:19:20 +0200 Subject: [PATCH 128/403] Increase latency threshold for list api calls --- test/e2e/framework/metrics_util.go | 25 +++++++++++++++---------- test/e2e/scalability/density.go | 2 +- test/e2e/scalability/load.go | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/test/e2e/framework/metrics_util.go b/test/e2e/framework/metrics_util.go index c1e5abeb113b7..232e057e79891 100644 --- a/test/e2e/framework/metrics_util.go +++ b/test/e2e/framework/metrics_util.go @@ -51,9 +51,10 @@ const ( // Increasing threshold to 1s is within our SLO and should solve this problem. apiCallLatencyThreshold time.Duration = 1 * time.Second - // We set a higher threshold for list apicalls as they can take more time when - // the list is really big. For eg. list nodes in a 5000-node cluster. - apiListCallLatencyThreshold time.Duration = 2 * time.Second + // We use a higher threshold for list apicalls if the cluster is big (i.e having > 500 nodes) + // as list response sizes are bigger in general for big clusters. + apiListCallLatencyThreshold time.Duration = 5 * time.Second + bigClusterNodeCountThreshold = 500 // Cluster Autoscaler metrics names caFunctionMetric = "cluster_autoscaler_function_duration_seconds_bucket" @@ -354,8 +355,10 @@ func readLatencyMetrics(c clientset.Interface) (*APIResponsiveness, error) { } // Prints top five summary metrics for request types with latency and returns -// number of such request types above threshold. -func HighLatencyRequests(c clientset.Interface) (int, *APIResponsiveness, error) { +// number of such request types above threshold. We use a higher threshold for +// list calls if nodeCount is above a given threshold (i.e. cluster is big). +func HighLatencyRequests(c clientset.Interface, nodeCount int) (int, *APIResponsiveness, error) { + isBigCluster := (nodeCount > bigClusterNodeCountThreshold) metrics, err := readLatencyMetrics(c) if err != nil { return 0, metrics, err @@ -364,12 +367,14 @@ func HighLatencyRequests(c clientset.Interface) (int, *APIResponsiveness, error) badMetrics := 0 top := 5 for i := range metrics.APICalls { + latency := metrics.APICalls[i].Latency.Perc99 + isListCall := (metrics.APICalls[i].Verb == "LIST") isBad := false - verb := metrics.APICalls[i].Verb - if verb != "LIST" && metrics.APICalls[i].Latency.Perc99 > apiCallLatencyThreshold || - verb == "LIST" && metrics.APICalls[i].Latency.Perc99 > apiListCallLatencyThreshold { - badMetrics++ - isBad = true + if latency > apiCallLatencyThreshold { + if !isListCall || !isBigCluster || (latency > apiListCallLatencyThreshold) { + isBad = true + badMetrics++ + } } if top > 0 || isBad { top-- diff --git a/test/e2e/scalability/density.go b/test/e2e/scalability/density.go index 0d584781b1049..0a4c4611bf2f4 100644 --- a/test/e2e/scalability/density.go +++ b/test/e2e/scalability/density.go @@ -328,7 +328,7 @@ var _ = SIGDescribe("Density", func() { summaries := make([]framework.TestDataSummary, 0, 2) // Verify latency metrics. - highLatencyRequests, metrics, err := framework.HighLatencyRequests(c) + highLatencyRequests, metrics, err := framework.HighLatencyRequests(c, nodeCount) framework.ExpectNoError(err) if err == nil { summaries = append(summaries, metrics) diff --git a/test/e2e/scalability/load.go b/test/e2e/scalability/load.go index a3bd0e991b01c..09f28f387eda9 100644 --- a/test/e2e/scalability/load.go +++ b/test/e2e/scalability/load.go @@ -92,7 +92,7 @@ var _ = SIGDescribe("Load capacity", func() { // TODO add flag that allows to skip cleanup on failure AfterEach(func() { // Verify latency metrics - highLatencyRequests, metrics, err := framework.HighLatencyRequests(clientset) + highLatencyRequests, metrics, err := framework.HighLatencyRequests(clientset, nodeCount) framework.ExpectNoError(err) if err == nil { summaries := make([]framework.TestDataSummary, 0, 1) From 102e4ee9e684968f231cd7b2ec69852a2460bff7 Mon Sep 17 00:00:00 2001 From: Michael Taufen Date: Fri, 18 Aug 2017 16:16:15 -0700 Subject: [PATCH 129/403] Fix duplicate field in kubeconfig The server field was accidentally duplicated during a rebase of #40050. --- cluster/gce/gci/configure-helper.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/cluster/gce/gci/configure-helper.sh b/cluster/gce/gci/configure-helper.sh index f8f7ffc79f6b0..80492da07d22a 100644 --- a/cluster/gce/gci/configure-helper.sh +++ b/cluster/gce/gci/configure-helper.sh @@ -653,7 +653,6 @@ clusters: cluster: server: https://${apiserver_address} certificate-authority: ${CA_CERT_BUNDLE_PATH} - server: https://${KUBERNETES_MASTER_NAME} contexts: - context: cluster: local From a2d0d46056f2f619d00f38e28e571d6463cc56dd Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Fri, 11 Aug 2017 16:37:31 +0800 Subject: [PATCH 130/403] Clean /run/kubernetes on kubeadm reset --- cmd/kubeadm/app/cmd/reset.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/kubeadm/app/cmd/reset.go b/cmd/kubeadm/app/cmd/reset.go index fcba36065c572..a02793a891004 100644 --- a/cmd/kubeadm/app/cmd/reset.go +++ b/cmd/kubeadm/app/cmd/reset.go @@ -113,7 +113,7 @@ func (r *Reset) Run(out io.Writer) error { fmt.Println("[reset] docker doesn't seem to be running, skipping the removal of running kubernetes containers") } - dirsToClean := []string{"/var/lib/kubelet", "/etc/cni/net.d", "/var/lib/dockershim"} + dirsToClean := []string{"/var/lib/kubelet", "/etc/cni/net.d", "/var/lib/dockershim", "/var/run/kubernetes"} // Only clear etcd data when the etcd manifest is found. In case it is not found, we must assume that the user // provided external etcd endpoints. In that case, it is his own responsibility to reset etcd From df3a6990690a55dfd68f45972ee2770862ffbd9f Mon Sep 17 00:00:00 2001 From: Klaus Ma Date: Sat, 19 Aug 2017 10:24:50 +0800 Subject: [PATCH 131/403] Revert #50362. --- .../scheduler/algorithm/predicates/error.go | 4 - .../algorithm/predicates/predicates.go | 31 -------- .../algorithm/predicates/predicates_test.go | 72 ------------------ .../defaults/compatibility_test.go | 73 ------------------- .../algorithmprovider/defaults/defaults.go | 3 - plugin/pkg/scheduler/factory/factory.go | 45 ++++++++++-- plugin/pkg/scheduler/factory/factory_test.go | 43 +++++++++++ plugin/pkg/scheduler/factory/plugins.go | 27 +------ test/integration/scheduler/scheduler_test.go | 3 +- 9 files changed, 84 insertions(+), 217 deletions(-) diff --git a/plugin/pkg/scheduler/algorithm/predicates/error.go b/plugin/pkg/scheduler/algorithm/predicates/error.go index 8cc85bce2c0d0..71e079481081e 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/error.go +++ b/plugin/pkg/scheduler/algorithm/predicates/error.go @@ -38,10 +38,6 @@ var ( ErrNodeUnderMemoryPressure = newPredicateFailureError("NodeUnderMemoryPressure") ErrNodeUnderDiskPressure = newPredicateFailureError("NodeUnderDiskPressure") ErrNodeOutOfDisk = newPredicateFailureError("NodeOutOfDisk") - ErrNodeNotReady = newPredicateFailureError("NodeNotReady") - ErrNodeNetworkUnavailable = newPredicateFailureError("NodeNetworkUnavailable") - ErrNodeUnschedulable = newPredicateFailureError("NodeUnschedulable") - ErrNodeUnknownCondition = newPredicateFailureError("NodeUnknownCondition") ErrVolumeNodeConflict = newPredicateFailureError("NoVolumeNodeConflict") // ErrFakePredicate is used for test only. The fake predicates returning false also returns error // as ErrFakePredicate. diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates.go b/plugin/pkg/scheduler/algorithm/predicates/predicates.go index 97b970c9e4d2b..d8e644b434926 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates.go @@ -1301,37 +1301,6 @@ func CheckNodeDiskPressurePredicate(pod *v1.Pod, meta interface{}, nodeInfo *sch return true, nil, nil } -// CheckNodeConditionPredicate checks if a pod can be scheduled on a node reporting out of disk, -// network unavailable and not ready condition. Only node conditions are accounted in this predicate. -func CheckNodeConditionPredicate(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, []algorithm.PredicateFailureReason, error) { - reasons := []algorithm.PredicateFailureReason{} - - if nodeInfo == nil || nodeInfo.Node() == nil { - return false, []algorithm.PredicateFailureReason{ErrNodeUnknownCondition}, nil - } - - node := nodeInfo.Node() - for _, cond := range node.Status.Conditions { - // We consider the node for scheduling only when its: - // - NodeReady condition status is ConditionTrue, - // - NodeOutOfDisk condition status is ConditionFalse, - // - NodeNetworkUnavailable condition status is ConditionFalse. - if cond.Type == v1.NodeReady && cond.Status != v1.ConditionTrue { - reasons = append(reasons, ErrNodeNotReady) - } else if cond.Type == v1.NodeOutOfDisk && cond.Status != v1.ConditionFalse { - reasons = append(reasons, ErrNodeOutOfDisk) - } else if cond.Type == v1.NodeNetworkUnavailable && cond.Status != v1.ConditionFalse { - reasons = append(reasons, ErrNodeNetworkUnavailable) - } - } - - if node.Spec.Unschedulable { - reasons = append(reasons, ErrNodeUnschedulable) - } - - return len(reasons) == 0, reasons, nil -} - type VolumeNodeChecker struct { pvInfo PersistentVolumeInfo pvcInfo PersistentVolumeClaimInfo diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go b/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go index 0dba44d4ac474..90c7be86ab84b 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go @@ -3442,78 +3442,6 @@ func TestPodSchedulesOnNodeWithDiskPressureCondition(t *testing.T) { } } -func TestNodeConditionPredicate(t *testing.T) { - tests := []struct { - node *v1.Node - schedulable bool - }{ - // node1 considered - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node1"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}}}}, - schedulable: true, - }, - // node2 ignored - node not Ready - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node2"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}}}}, - schedulable: false, - }, - // node3 ignored - node out of disk - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node3"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, - schedulable: false, - }, - - // node4 considered - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node4"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, - schedulable: true, - }, - // node5 ignored - node out of disk - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node5"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, - schedulable: false, - }, - // node6 considered - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node6"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, - schedulable: true, - }, - // node7 ignored - node out of disk, node not Ready - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node7"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, - schedulable: false, - }, - // node8 ignored - node not Ready - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node8"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, - schedulable: false, - }, - // node9 ignored - node unschedulable - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node9"}, Spec: v1.NodeSpec{Unschedulable: true}}, - schedulable: false, - }, - // node10 considered - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node10"}, Spec: v1.NodeSpec{Unschedulable: false}}, - schedulable: true, - }, - // node11 considered - { - node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node11"}}, - schedulable: true, - }, - } - - for _, test := range tests { - nodeInfo := makeEmptyNodeInfo(test.node) - if fit, reasons, err := CheckNodeConditionPredicate(nil, nil, nodeInfo); fit != test.schedulable { - t.Errorf("%s: expected: %t, got %t; %+v, %v", - test.node.Name, test.schedulable, fit, reasons, err) - } - } -} - func createPodWithVolume(pod, pv, pvc string) *v1.Pod { return &v1.Pod{ ObjectMeta: metav1.ObjectMeta{Name: pod, Namespace: "default"}, diff --git a/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go b/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go index 42ccee1ab0cdf..fce476b15bcca 100644 --- a/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go +++ b/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go @@ -387,79 +387,6 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { }, }, }, - // Do not change this JSON after the corresponding release has been tagged. - // A failure indicates backwards compatibility with the specified release was broken. - "1.8": { - JSON: `{ - "kind": "Policy", - "apiVersion": "v1", - "predicates": [ - {"name": "MatchNodeSelector"}, - {"name": "PodFitsResources"}, - {"name": "PodFitsHostPorts"}, - {"name": "HostName"}, - {"name": "NoDiskConflict"}, - {"name": "NoVolumeZoneConflict"}, - {"name": "PodToleratesNodeTaints"}, - {"name": "CheckNodeMemoryPressure"}, - {"name": "CheckNodeDiskPressure"}, - {"name": "CheckNodeCondition"}, - {"name": "MaxEBSVolumeCount"}, - {"name": "MaxGCEPDVolumeCount"}, - {"name": "MaxAzureDiskVolumeCount"}, - {"name": "MatchInterPodAffinity"}, - {"name": "GeneralPredicates"}, - {"name": "TestServiceAffinity", "argument": {"serviceAffinity" : {"labels" : ["region"]}}}, - {"name": "TestLabelsPresence", "argument": {"labelsPresence" : {"labels" : ["foo"], "presence":true}}}, - {"name": "NoVolumeNodeConflict"} - ],"priorities": [ - {"name": "EqualPriority", "weight": 2}, - {"name": "ImageLocalityPriority", "weight": 2}, - {"name": "LeastRequestedPriority", "weight": 2}, - {"name": "BalancedResourceAllocation", "weight": 2}, - {"name": "SelectorSpreadPriority", "weight": 2}, - {"name": "NodePreferAvoidPodsPriority", "weight": 2}, - {"name": "NodeAffinityPriority", "weight": 2}, - {"name": "TaintTolerationPriority", "weight": 2}, - {"name": "InterPodAffinityPriority", "weight": 2}, - {"name": "MostRequestedPriority", "weight": 2} - ] - }`, - ExpectedPolicy: schedulerapi.Policy{ - Predicates: []schedulerapi.PredicatePolicy{ - {Name: "MatchNodeSelector"}, - {Name: "PodFitsResources"}, - {Name: "PodFitsHostPorts"}, - {Name: "HostName"}, - {Name: "NoDiskConflict"}, - {Name: "NoVolumeZoneConflict"}, - {Name: "PodToleratesNodeTaints"}, - {Name: "CheckNodeMemoryPressure"}, - {Name: "CheckNodeDiskPressure"}, - {Name: "CheckNodeCondition"}, - {Name: "MaxEBSVolumeCount"}, - {Name: "MaxGCEPDVolumeCount"}, - {Name: "MaxAzureDiskVolumeCount"}, - {Name: "MatchInterPodAffinity"}, - {Name: "GeneralPredicates"}, - {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, - {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, - {Name: "NoVolumeNodeConflict"}, - }, - Priorities: []schedulerapi.PriorityPolicy{ - {Name: "EqualPriority", Weight: 2}, - {Name: "ImageLocalityPriority", Weight: 2}, - {Name: "LeastRequestedPriority", Weight: 2}, - {Name: "BalancedResourceAllocation", Weight: 2}, - {Name: "SelectorSpreadPriority", Weight: 2}, - {Name: "NodePreferAvoidPodsPriority", Weight: 2}, - {Name: "NodeAffinityPriority", Weight: 2}, - {Name: "TaintTolerationPriority", Weight: 2}, - {Name: "InterPodAffinityPriority", Weight: 2}, - {Name: "MostRequestedPriority", Weight: 2}, - }, - }, - }, } registeredPredicates := sets.NewString(factory.ListRegisteredFitPredicates()...) diff --git a/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go b/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go index 2d7e278a9211f..46fa0e60bfb8d 100644 --- a/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go +++ b/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go @@ -175,9 +175,6 @@ func defaultPredicates() sets.String { // Fit is determined by node disk pressure condition. factory.RegisterFitPredicate("CheckNodeDiskPressure", predicates.CheckNodeDiskPressurePredicate), - // Fit is determied by node condtions: not ready, network unavailable and out of disk. - factory.RegisterMandatoryFitPredicate("CheckNodeCondition", predicates.CheckNodeConditionPredicate), - // Fit is determined by volume zone requirements. factory.RegisterFitPredicateFactory( "NoVolumeNodeConflict", diff --git a/plugin/pkg/scheduler/factory/factory.go b/plugin/pkg/scheduler/factory/factory.go index cd58377635a57..b4c7062260995 100644 --- a/plugin/pkg/scheduler/factory/factory.go +++ b/plugin/pkg/scheduler/factory/factory.go @@ -705,7 +705,7 @@ func (f *ConfigFactory) CreateFromKeys(predicateKeys, priorityKeys sets.String, SchedulerCache: f.schedulerCache, Ecache: f.equivalencePodCache, // The scheduler only needs to consider schedulable nodes. - NodeLister: &nodeLister{f.nodeLister}, + NodeLister: &nodePredicateLister{f.nodeLister}, Algorithm: algo, Binder: f.getBinder(extenders), PodConditionUpdater: &podConditionUpdater{f.client}, @@ -720,12 +720,12 @@ func (f *ConfigFactory) CreateFromKeys(predicateKeys, priorityKeys sets.String, }, nil } -type nodeLister struct { +type nodePredicateLister struct { corelisters.NodeLister } -func (n *nodeLister) List() ([]*v1.Node, error) { - return n.NodeLister.List(labels.Everything()) +func (n *nodePredicateLister) List() ([]*v1.Node, error) { + return n.ListWithPredicate(getNodeConditionPredicate()) } func (f *ConfigFactory) GetPriorityFunctionConfigs(priorityKeys sets.String) ([]algorithm.PriorityConfig, error) { @@ -770,10 +770,11 @@ func (f *ConfigFactory) getPluginArgs() (*PluginFactoryArgs, error) { ControllerLister: f.controllerLister, ReplicaSetLister: f.replicaSetLister, StatefulSetLister: f.statefulSetLister, - NodeLister: &nodeLister{f.nodeLister}, - NodeInfo: &predicates.CachedNodeInfo{NodeLister: f.nodeLister}, - PVInfo: &predicates.CachedPersistentVolumeInfo{PersistentVolumeLister: f.pVLister}, - PVCInfo: &predicates.CachedPersistentVolumeClaimInfo{PersistentVolumeClaimLister: f.pVCLister}, + // All fit predicates only need to consider schedulable nodes. + NodeLister: &nodePredicateLister{f.nodeLister}, + NodeInfo: &predicates.CachedNodeInfo{NodeLister: f.nodeLister}, + PVInfo: &predicates.CachedPersistentVolumeInfo{PersistentVolumeLister: f.pVLister}, + PVCInfo: &predicates.CachedPersistentVolumeClaimInfo{PersistentVolumeClaimLister: f.pVCLister}, HardPodAffinitySymmetricWeight: f.hardPodAffinitySymmetricWeight, }, nil } @@ -792,6 +793,34 @@ func (f *ConfigFactory) ResponsibleForPod(pod *v1.Pod) bool { return f.schedulerName == pod.Spec.SchedulerName } +func getNodeConditionPredicate() corelisters.NodeConditionPredicate { + return func(node *v1.Node) bool { + for i := range node.Status.Conditions { + cond := &node.Status.Conditions[i] + // We consider the node for scheduling only when its: + // - NodeReady condition status is ConditionTrue, + // - NodeOutOfDisk condition status is ConditionFalse, + // - NodeNetworkUnavailable condition status is ConditionFalse. + if cond.Type == v1.NodeReady && cond.Status != v1.ConditionTrue { + glog.V(4).Infof("Ignoring node %v with %v condition status %v", node.Name, cond.Type, cond.Status) + return false + } else if cond.Type == v1.NodeOutOfDisk && cond.Status != v1.ConditionFalse { + glog.V(4).Infof("Ignoring node %v with %v condition status %v", node.Name, cond.Type, cond.Status) + return false + } else if cond.Type == v1.NodeNetworkUnavailable && cond.Status != v1.ConditionFalse { + glog.V(4).Infof("Ignoring node %v with %v condition status %v", node.Name, cond.Type, cond.Status) + return false + } + } + // Ignore nodes that are marked unschedulable + if node.Spec.Unschedulable { + glog.V(4).Infof("Ignoring node %v since it is unschedulable", node.Name) + return false + } + return true + } +} + // unassignedNonTerminatedPod selects pods that are unassigned and non-terminal. func unassignedNonTerminatedPod(pod *v1.Pod) bool { if len(pod.Spec.NodeName) != 0 { diff --git a/plugin/pkg/scheduler/factory/factory_test.go b/plugin/pkg/scheduler/factory/factory_test.go index 28cfaa56a64f9..730e1bb035ad0 100644 --- a/plugin/pkg/scheduler/factory/factory_test.go +++ b/plugin/pkg/scheduler/factory/factory_test.go @@ -525,3 +525,46 @@ func TestInvalidFactoryArgs(t *testing.T) { } } + +func TestNodeConditionPredicate(t *testing.T) { + nodeFunc := getNodeConditionPredicate() + nodeList := &v1.NodeList{ + Items: []v1.Node{ + // node1 considered + {ObjectMeta: metav1.ObjectMeta{Name: "node1"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}}}}, + // node2 ignored - node not Ready + {ObjectMeta: metav1.ObjectMeta{Name: "node2"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}}}}, + // node3 ignored - node out of disk + {ObjectMeta: metav1.ObjectMeta{Name: "node3"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, + // node4 considered + {ObjectMeta: metav1.ObjectMeta{Name: "node4"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, + + // node5 ignored - node out of disk + {ObjectMeta: metav1.ObjectMeta{Name: "node5"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, + // node6 considered + {ObjectMeta: metav1.ObjectMeta{Name: "node6"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, + // node7 ignored - node out of disk, node not Ready + {ObjectMeta: metav1.ObjectMeta{Name: "node7"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, + // node8 ignored - node not Ready + {ObjectMeta: metav1.ObjectMeta{Name: "node8"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, + + // node9 ignored - node unschedulable + {ObjectMeta: metav1.ObjectMeta{Name: "node9"}, Spec: v1.NodeSpec{Unschedulable: true}}, + // node10 considered + {ObjectMeta: metav1.ObjectMeta{Name: "node10"}, Spec: v1.NodeSpec{Unschedulable: false}}, + // node11 considered + {ObjectMeta: metav1.ObjectMeta{Name: "node11"}}, + }, + } + + nodeNames := []string{} + for _, node := range nodeList.Items { + if nodeFunc(&node) { + nodeNames = append(nodeNames, node.Name) + } + } + expectedNodes := []string{"node1", "node4", "node6", "node10", "node11"} + if !reflect.DeepEqual(expectedNodes, nodeNames) { + t.Errorf("expected: %v, got %v", expectedNodes, nodeNames) + } +} diff --git a/plugin/pkg/scheduler/factory/plugins.go b/plugin/pkg/scheduler/factory/plugins.go index 48cdca881a456..df1c6febfc5d4 100644 --- a/plugin/pkg/scheduler/factory/plugins.go +++ b/plugin/pkg/scheduler/factory/plugins.go @@ -72,10 +72,9 @@ var ( schedulerFactoryMutex sync.Mutex // maps that hold registered algorithm types - fitPredicateMap = make(map[string]FitPredicateFactory) - mandatoryFitPredicates = sets.NewString() - priorityFunctionMap = make(map[string]PriorityConfigFactory) - algorithmProviderMap = make(map[string]AlgorithmProviderConfig) + fitPredicateMap = make(map[string]FitPredicateFactory) + priorityFunctionMap = make(map[string]PriorityConfigFactory) + algorithmProviderMap = make(map[string]AlgorithmProviderConfig) // Registered metadata producers priorityMetadataProducer MetadataProducerFactory @@ -100,18 +99,6 @@ func RegisterFitPredicate(name string, predicate algorithm.FitPredicate) string return RegisterFitPredicateFactory(name, func(PluginFactoryArgs) algorithm.FitPredicate { return predicate }) } -// RegisterMandatoryFitPredicate registers a fit predicate with the algorithm registry, the predicate is used by -// kubelet, DaemonSet; it is always included in configuration. Returns the name with which the predicate was -// registered. -func RegisterMandatoryFitPredicate(name string, predicate algorithm.FitPredicate) string { - schedulerFactoryMutex.Lock() - defer schedulerFactoryMutex.Unlock() - validateAlgorithmNameOrDie(name) - fitPredicateMap[name] = func(PluginFactoryArgs) algorithm.FitPredicate { return predicate } - mandatoryFitPredicates.Insert(name) - return name -} - // RegisterFitPredicateFactory registers a fit predicate factory with the // algorithm registry. Returns the name with which the predicate was registered. func RegisterFitPredicateFactory(name string, predicateFactory FitPredicateFactory) string { @@ -321,14 +308,6 @@ func getFitPredicateFunctions(names sets.String, args PluginFactoryArgs) (map[st } predicates[name] = factory(args) } - - // Always include mandatory fit predicates. - for name := range mandatoryFitPredicates { - if factory, found := fitPredicateMap[name]; found { - predicates[name] = factory(args) - } - } - return predicates, nil } diff --git a/test/integration/scheduler/scheduler_test.go b/test/integration/scheduler/scheduler_test.go index 6322e55163185..cd109648a9de9 100644 --- a/test/integration/scheduler/scheduler_test.go +++ b/test/integration/scheduler/scheduler_test.go @@ -139,8 +139,7 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { // Verify that the config is applied correctly. schedPredicates := sched.Config().Algorithm.Predicates() schedPrioritizers := sched.Config().Algorithm.Prioritizers() - // Includes one mandatory predicates. - if len(schedPredicates) != 3 || len(schedPrioritizers) != 2 { + if len(schedPredicates) != 2 || len(schedPrioritizers) != 2 { t.Errorf("Unexpected number of predicates or priority functions. Number of predicates: %v, number of prioritizers: %v", len(schedPredicates), len(schedPrioritizers)) } // Check a predicate and a priority function. From 7154034fff79bf3af9b68aa7a9406e1e8e42a6d2 Mon Sep 17 00:00:00 2001 From: xswack Date: Thu, 17 Aug 2017 21:44:23 +0800 Subject: [PATCH 132/403] Expand the test to include other flags as well --- cmd/kube-apiserver/app/options/BUILD | 1 + .../app/options/options_test.go | 37 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/cmd/kube-apiserver/app/options/BUILD b/cmd/kube-apiserver/app/options/BUILD index 6e5b3d199632b..de3ec4f374bbf 100644 --- a/cmd/kube-apiserver/app/options/BUILD +++ b/cmd/kube-apiserver/app/options/BUILD @@ -39,6 +39,7 @@ go_test( "//vendor/k8s.io/apiserver/pkg/server/options:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", + "//vendor/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/cmd/kube-apiserver/app/options/options_test.go b/cmd/kube-apiserver/app/options/options_test.go index b96a878ec2711..60487dad875f4 100644 --- a/cmd/kube-apiserver/app/options/options_test.go +++ b/cmd/kube-apiserver/app/options/options_test.go @@ -28,13 +28,13 @@ import ( apiserveroptions "k8s.io/apiserver/pkg/server/options" "k8s.io/apiserver/pkg/storage/storagebackend" utilconfig "k8s.io/apiserver/pkg/util/flag" + restclient "k8s.io/client-go/rest" kapi "k8s.io/kubernetes/pkg/api" kubeoptions "k8s.io/kubernetes/pkg/kubeapiserver/options" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" ) -func TestAddFlagsFlag(t *testing.T) { - // TODO: Expand the test to include other flags as well. +func TestAddFlags(t *testing.T) { f := pflag.NewFlagSet("addflagstest", pflag.ContinueOnError) s := NewServerRunOptions() s.AddFlags(f) @@ -65,9 +65,23 @@ func TestAddFlagsFlag(t *testing.T) { "--cloud-config=/cloud-config", "--cloud-provider=azure", "--cors-allowed-origins=10.10.10.100,10.10.10.200", + "--contention-profiling=true", "--enable-aggregator-routing=true", "--enable-logs-handler=false", "--enable-swagger-ui=true", + "--etcd-quorum-read=false", + "--etcd-keyfile=/var/run/kubernetes/etcd.key", + "--etcd-certfile=/var/run/kubernetes/etcdce.crt", + "--etcd-cafile=/var/run/kubernetes/etcdca.crt", + "--kubelet-https=true", + "--kubelet-read-only-port=10255", + "--kubelet-timeout=5s", + "--kubelet-client-certificate=/var/run/kubernetes/ceserver.crt", + "--kubelet-client-key=/var/run/kubernetes/server.key", + "--kubelet-certificate-authority=/var/run/kubernetes/caserver.crt", + "--proxy-client-cert-file=/var/run/kubernetes/proxy.crt", + "--proxy-client-key-file=/var/run/kubernetes/proxy.key", + "--storage-backend=etcd2", } f.Parse(args) @@ -90,10 +104,15 @@ func TestAddFlagsFlag(t *testing.T) { }, Etcd: &apiserveroptions.EtcdOptions{ StorageConfig: storagebackend.Config{ + Type: "etcd2", ServerList: nil, Prefix: "/registry", DeserializationCacheSize: 0, - Copier: kapi.Scheme, + Copier: kapi.Scheme, + Quorum: false, + KeyFile: "/var/run/kubernetes/etcd.key", + CAFile: "/var/run/kubernetes/etcdca.crt", + CertFile: "/var/run/kubernetes/etcdce.crt", }, DefaultStorageMediaType: "application/vnd.kubernetes.protobuf", DeleteCollectionWorkers: 1, @@ -126,6 +145,11 @@ func TestAddFlagsFlag(t *testing.T) { }, EnableHttps: true, HTTPTimeout: time.Duration(5) * time.Second, + TLSClientConfig: restclient.TLSClientConfig{ + CertFile: "/var/run/kubernetes/ceserver.crt", + KeyFile: "/var/run/kubernetes/server.key", + CAFile: "/var/run/kubernetes/caserver.crt", + }, }, Audit: &apiserveroptions.AuditOptions{ LogOptions: apiserveroptions.AuditLogOptions{ @@ -142,8 +166,9 @@ func TestAddFlagsFlag(t *testing.T) { PolicyFile: "/policy", }, Features: &apiserveroptions.FeatureOptions{ - EnableSwaggerUI: true, - EnableProfiling: true, + EnableSwaggerUI: true, + EnableProfiling: true, + EnableContentionProfiling: true, }, Authentication: &kubeoptions.BuiltInAuthenticationOptions{ Anonymous: &kubeoptions.AnonymousAuthenticationOptions{ @@ -190,6 +215,8 @@ func TestAddFlagsFlag(t *testing.T) { }, EnableLogsHandler: false, EnableAggregatorRouting: true, + ProxyClientKeyFile: "/var/run/kubernetes/proxy.key", + ProxyClientCertFile: "/var/run/kubernetes/proxy.crt", } if !reflect.DeepEqual(expected, s) { From 831fd242e8678a5eebedc36ed46730d737256c64 Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Fri, 2 Jun 2017 20:51:09 -0700 Subject: [PATCH 133/403] Remove seemingly obsolete binaries --- build/BUILD | 1 - build/visible_to/BUILD | 1 - cmd/BUILD | 2 - cmd/genslateyaml/BUILD | 37 --- cmd/genslateyaml/gen_slate_yaml.go | 197 -------------- cmd/mungedocs/BUILD | 70 ----- cmd/mungedocs/README.md | 22 -- cmd/mungedocs/analytics.go | 58 ---- cmd/mungedocs/analytics_test.go | 93 ------- cmd/mungedocs/example_syncer.go | 121 --------- cmd/mungedocs/example_syncer_test.go | 67 ----- cmd/mungedocs/headers.go | 74 ------ cmd/mungedocs/headers_test.go | 73 ------ cmd/mungedocs/kubectl_dash_f.go | 125 --------- cmd/mungedocs/kubectl_dash_f_test.go | 143 ---------- cmd/mungedocs/links.go | 238 ----------------- cmd/mungedocs/links_test.go | 72 ----- cmd/mungedocs/mungedocs.go | 239 ----------------- cmd/mungedocs/preformatted.go | 51 ---- cmd/mungedocs/preformatted_test.go | 97 ------- cmd/mungedocs/testdata/README.md | 1 - cmd/mungedocs/testdata/example.txt | 1 - cmd/mungedocs/testdata/pod.yaml | 10 - cmd/mungedocs/testdata/test-dashes.md | 1 - cmd/mungedocs/testdata/test_underscores.md | 1 - cmd/mungedocs/toc.go | 89 ------- cmd/mungedocs/toc_test.go | 79 ------ cmd/mungedocs/util.go | 291 --------------------- cmd/mungedocs/util_test.go | 169 ------------ cmd/mungedocs/whitespace.go | 31 --- cmd/mungedocs/whitespace_test.go | 45 ---- hack/.golint_failures | 2 - hack/lib/golang.sh | 1 - test/test_owners.csv | 4 +- 34 files changed, 3 insertions(+), 2503 deletions(-) delete mode 100644 cmd/genslateyaml/BUILD delete mode 100644 cmd/genslateyaml/gen_slate_yaml.go delete mode 100644 cmd/mungedocs/BUILD delete mode 100644 cmd/mungedocs/README.md delete mode 100644 cmd/mungedocs/analytics.go delete mode 100644 cmd/mungedocs/analytics_test.go delete mode 100644 cmd/mungedocs/example_syncer.go delete mode 100644 cmd/mungedocs/example_syncer_test.go delete mode 100644 cmd/mungedocs/headers.go delete mode 100644 cmd/mungedocs/headers_test.go delete mode 100644 cmd/mungedocs/kubectl_dash_f.go delete mode 100644 cmd/mungedocs/kubectl_dash_f_test.go delete mode 100644 cmd/mungedocs/links.go delete mode 100644 cmd/mungedocs/links_test.go delete mode 100644 cmd/mungedocs/mungedocs.go delete mode 100644 cmd/mungedocs/preformatted.go delete mode 100644 cmd/mungedocs/preformatted_test.go delete mode 100644 cmd/mungedocs/testdata/README.md delete mode 100644 cmd/mungedocs/testdata/example.txt delete mode 100644 cmd/mungedocs/testdata/pod.yaml delete mode 100644 cmd/mungedocs/testdata/test-dashes.md delete mode 100644 cmd/mungedocs/testdata/test_underscores.md delete mode 100644 cmd/mungedocs/toc.go delete mode 100644 cmd/mungedocs/toc_test.go delete mode 100644 cmd/mungedocs/util.go delete mode 100644 cmd/mungedocs/util_test.go delete mode 100644 cmd/mungedocs/whitespace.go delete mode 100644 cmd/mungedocs/whitespace_test.go diff --git a/build/BUILD b/build/BUILD index 5f08ab29c54b2..5fcbe1d7e4fe1 100644 --- a/build/BUILD +++ b/build/BUILD @@ -137,7 +137,6 @@ filegroup( "//cmd/genyaml", "//cmd/kubemark", # TODO: server platforms only "//cmd/linkcheck", - "//cmd/mungedocs", "//federation/cmd/genfeddocs", "//test/e2e:e2e.test", "//test/e2e_node:e2e_node.test", # TODO: server platforms only diff --git a/build/visible_to/BUILD b/build/visible_to/BUILD index fef19852b3c94..788adc982cbd0 100644 --- a/build/visible_to/BUILD +++ b/build/visible_to/BUILD @@ -30,7 +30,6 @@ package_group( packages = [ "//cmd/gendocs", "//cmd/genman", - "//cmd/genslateyaml", "//cmd/genyaml", ], ) diff --git a/cmd/BUILD b/cmd/BUILD index ec7ef8d0beacc..75dcc63d834f6 100644 --- a/cmd/BUILD +++ b/cmd/BUILD @@ -16,7 +16,6 @@ filegroup( "//cmd/gendocs:all-srcs", "//cmd/genkubedocs:all-srcs", "//cmd/genman:all-srcs", - "//cmd/genslateyaml:all-srcs", "//cmd/genswaggertypedocs:all-srcs", "//cmd/genutils:all-srcs", "//cmd/genyaml:all-srcs", @@ -31,7 +30,6 @@ filegroup( "//cmd/kubelet:all-srcs", "//cmd/kubemark:all-srcs", "//cmd/linkcheck:all-srcs", - "//cmd/mungedocs:all-srcs", ], tags = ["automanaged"], ) diff --git a/cmd/genslateyaml/BUILD b/cmd/genslateyaml/BUILD deleted file mode 100644 index 8a840dcafcb38..0000000000000 --- a/cmd/genslateyaml/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_binary", - "go_library", -) - -go_binary( - name = "genslateyaml", - library = ":go_default_library", -) - -go_library( - name = "go_default_library", - srcs = ["gen_slate_yaml.go"], - deps = [ - "//pkg/kubectl/cmd:go_default_library", - "//pkg/kubectl/cmd/util:go_default_library", - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/gopkg.in/yaml.v2:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/cmd/genslateyaml/gen_slate_yaml.go b/cmd/genslateyaml/gen_slate_yaml.go deleted file mode 100644 index 7693fa6d890ef..0000000000000 --- a/cmd/genslateyaml/gen_slate_yaml.go +++ /dev/null @@ -1,197 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "flag" - "fmt" - "io/ioutil" - "os" - "sort" - - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "gopkg.in/yaml.v2" - - "k8s.io/kubernetes/pkg/kubectl/cmd" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -// gen_slate_yaml creates a yaml representation of the kubectl help commands. This is to be consumed -// by tools to generate documentation. - -var outputFile = flag.String("output", "", "Destination for kubectl yaml representation.") - -func main() { - flag.Parse() - - if len(*outputFile) < 1 { - fmt.Printf("Must specify --output.\n") - os.Exit(1) - } - - // Initialize a kubectl command that we can use to get the help documentation - kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) - - // Create the structural representation - spec := NewKubectlSpec(kubectl) - - // Write the spec to a file as yaml - WriteFile(spec) -} - -func WriteFile(spec KubectlSpec) { - // Marshall the yaml - final, err := yaml.Marshal(&spec) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // Create the file - outFile, err := os.Create(*outputFile) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - defer outFile.Close() - - // Write the file - _, err = outFile.Write(final) - if err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func NewKubectlSpec(c *cobra.Command) KubectlSpec { - return KubectlSpec{ - TopLevelCommandGroups: []TopLevelCommands{NewTopLevelCommands(c.Commands())}, - } -} - -func NewTopLevelCommands(cs []*cobra.Command) TopLevelCommands { - tlc := TopLevelCommands{} - for _, c := range cs { - tlc.Commands = append(tlc.Commands, NewTopLevelCommand(c)) - } - sort.Sort(tlc) - return tlc -} - -func NewTopLevelCommand(c *cobra.Command) TopLevelCommand { - result := TopLevelCommand{ - MainCommand: NewCommand(c, ""), - } - for _, sub := range c.Commands() { - result.SubCommands = append(result.SubCommands, NewSubCommands(sub, "")...) - } - sort.Sort(result.SubCommands) - return result -} - -// Parse the Options -func NewOptions(flags *pflag.FlagSet) Options { - result := Options{} - flags.VisitAll(func(flag *pflag.Flag) { - opt := &Option{ - Name: flag.Name, - Shorthand: flag.Shorthand, - DefaultValue: flag.DefValue, - Usage: flag.Usage, - } - result = append(result, opt) - }) - return result -} - -// Parse the Commands -func NewSubCommands(c *cobra.Command, path string) Commands { - subCommands := Commands{NewCommand(c, path+c.Name())} - for _, subCommand := range c.Commands() { - subCommands = append(subCommands, NewSubCommands(subCommand, path+c.Name()+" ")...) - } - return subCommands -} - -func NewCommand(c *cobra.Command, path string) *Command { - return &Command{ - Name: c.Name(), - Path: path, - Description: c.Long, - Synopsis: c.Short, - Example: c.Example, - Options: NewOptions(c.NonInheritedFlags()), - InheritedOptions: NewOptions(c.InheritedFlags()), - Usage: c.Use, - } -} - -////////////////////////// -// Types -////////////////////////// - -type KubectlSpec struct { - TopLevelCommandGroups []TopLevelCommands `yaml:",omitempty"` -} - -type TopLevelCommands struct { - Commands []TopLevelCommand `yaml:",omitempty"` -} -type TopLevelCommand struct { - MainCommand *Command `yaml:",omitempty"` - SubCommands Commands `yaml:",omitempty"` -} - -type Options []*Option -type Option struct { - Name string `yaml:",omitempty"` - Shorthand string `yaml:",omitempty"` - DefaultValue string `yaml:"default_value,omitempty"` - Usage string `yaml:",omitempty"` -} - -type Commands []*Command -type Command struct { - Name string `yaml:",omitempty"` - Path string `yaml:",omitempty"` - Synopsis string `yaml:",omitempty"` - Description string `yaml:",omitempty"` - Options Options `yaml:",omitempty"` - InheritedOptions Options `yaml:"inherited_options,omitempty"` - Example string `yaml:",omitempty"` - SeeAlso []string `yaml:"see_also,omitempty"` - Usage string `yaml:",omitempty"` -} - -func (a Options) Len() int { return len(a) } -func (a Options) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a Options) Less(i, j int) bool { - return a[i].Name < a[j].Name -} - -func (a TopLevelCommands) Len() int { return len(a.Commands) } -func (a TopLevelCommands) Swap(i, j int) { a.Commands[i], a.Commands[j] = a.Commands[j], a.Commands[i] } -func (a TopLevelCommands) Less(i, j int) bool { - return a.Commands[i].MainCommand.Path < a.Commands[j].MainCommand.Path -} - -func (a Commands) Len() int { return len(a) } -func (a Commands) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a Commands) Less(i, j int) bool { - return a[i].Path < a[j].Path -} diff --git a/cmd/mungedocs/BUILD b/cmd/mungedocs/BUILD deleted file mode 100644 index 1cc809f4159c9..0000000000000 --- a/cmd/mungedocs/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_binary", - "go_library", - "go_test", -) - -go_binary( - name = "mungedocs", - library = ":go_default_library", -) - -go_test( - name = "go_default_test", - srcs = [ - "analytics_test.go", - "example_syncer_test.go", - "headers_test.go", - "kubectl_dash_f_test.go", - "links_test.go", - "preformatted_test.go", - "toc_test.go", - "util_test.go", - "whitespace_test.go", - ], - data = [ - "mungedocs.go", - ":testdata", - "//docs:srcs", - ], - library = ":go_default_library", - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "analytics.go", - "example_syncer.go", - "headers.go", - "kubectl_dash_f.go", - "links.go", - "mungedocs.go", - "preformatted.go", - "toc.go", - "util.go", - "whitespace.go", - ], - deps = ["//vendor/github.com/spf13/pflag:go_default_library"], -) - -filegroup( - name = "testdata", - srcs = glob(["testdata/*"]), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/cmd/mungedocs/README.md b/cmd/mungedocs/README.md deleted file mode 100644 index 5fe3ed106cf45..0000000000000 --- a/cmd/mungedocs/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Documentation Mungers - -Basically this is like lint/gofmt for md docs. - -It basically does the following: -- iterate over all files in the given doc root. -- for each file split it into a slice (mungeLines) of lines (mungeLine) -- a mungeline has metadata about each line typically determined by a 'fast' regex. - - metadata contains things like 'is inside a preformatted block' - - contains a markdown header - - has a link to another file - - etc.. - - if you have a really slow regex with a lot of backtracking you might want to write a fast one to limit how often you run the slow one. -- each munger is then called in turn - - they are given the mungeLines - - they create an entirely new set of mungeLines with their modifications - - the new set is returned -- the new set is then fed into the next munger. -- in the end we might commit the end mungeLines to the file or not (--verify) - - -[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/cmd/mungedocs/README.md?pixel)]() diff --git a/cmd/mungedocs/analytics.go b/cmd/mungedocs/analytics.go deleted file mode 100644 index a7eaefa0803d4..0000000000000 --- a/cmd/mungedocs/analytics.go +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "fmt" - "strings" -) - -const analyticsMungeTag = "GENERATED_ANALYTICS" -const analyticsLinePrefix = "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/" - -func updateAnalytics(fileName string, mlines mungeLines) (mungeLines, error) { - var out mungeLines - fileName, err := makeRepoRelative(fileName, fileName) - if err != nil { - return mlines, err - } - - link := fmt.Sprintf(analyticsLinePrefix+"%s?pixel)]()", fileName) - insertLines := getMungeLines(link) - mlines, err = removeMacroBlock(analyticsMungeTag, mlines) - if err != nil { - return mlines, err - } - - // Remove floating analytics links not surrounded by the munge tags. - for _, mline := range mlines { - if mline.preformatted || mline.header || mline.beginTag || mline.endTag { - out = append(out, mline) - continue - } - if strings.HasPrefix(mline.data, analyticsLinePrefix) { - continue - } - out = append(out, mline) - } - out = appendMacroBlock(out, analyticsMungeTag) - out, err = updateMacroBlock(out, analyticsMungeTag, insertLines) - if err != nil { - return mlines, err - } - return out, nil -} diff --git a/cmd/mungedocs/analytics_test.go b/cmd/mungedocs/analytics_test.go deleted file mode 100644 index b97feef86eb82..0000000000000 --- a/cmd/mungedocs/analytics_test.go +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestAnalytics(t *testing.T) { - b := beginMungeTag("GENERATED_ANALYTICS") - e := endMungeTag("GENERATED_ANALYTICS") - var cases = []struct { - in string - expected string - }{ - { - "aoeu", - "aoeu" + "\n" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + "\n"}, - { - "aoeu" + "\n" + "\n" + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()", - "aoeu" + "\n" + "\n" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + "\n"}, - { - "aoeu" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + "\n", - "aoeu" + "\n" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + "\n"}, - { - "aoeu" + "\n" + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + "\n" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + "\n", - "aoeu" + "\n" + "\n" + "\n" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + "\n"}, - { - "prefix" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + - "\n" + "suffix", - "prefix" + "\n" + "suffix" + "\n" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + "\n"}, - { - "aoeu" + "\n" + "\n" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + "\n", - "aoeu" + "\n" + "\n" + "\n" + - b + "\n" + - "[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/path/to/file-name.md?pixel)]()" + "\n" + - e + "\n"}, - } - for i, c := range cases { - in := getMungeLines(c.in) - expected := getMungeLines(c.expected) - out, err := updateAnalytics("path/to/file-name.md", in) - assert.NoError(t, err) - if !expected.Equal(out) { - t.Errorf("Case %d Expected \n\n%v\n\n but got \n\n%v\n\n", i, expected.String(), out.String()) - } - } -} diff --git a/cmd/mungedocs/example_syncer.go b/cmd/mungedocs/example_syncer.go deleted file mode 100644 index c15255be43948..0000000000000 --- a/cmd/mungedocs/example_syncer.go +++ /dev/null @@ -1,121 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "fmt" - "io/ioutil" - "regexp" - "strings" -) - -const exampleToken = "EXAMPLE" - -const exampleLineStart = " -// -// ```yaml -// foo: -// bar: -// ``` -// -// [Download example](../../examples/guestbook/frontend-service.yaml?raw=true) -// -func syncExamples(filePath string, mlines mungeLines) (mungeLines, error) { - var err error - type exampleTag struct { - token string - linkText string - fileType string - } - exampleTags := []exampleTag{} - - // collect all example Tags - for _, mline := range mlines { - if mline.preformatted || !mline.beginTag { - continue - } - line := mline.data - if !strings.HasPrefix(line, exampleLineStart) { - continue - } - match := exampleMungeTagRE.FindStringSubmatch(line) - if len(match) < 4 { - err = fmt.Errorf("Found unparsable EXAMPLE munge line %v", line) - return mlines, err - } - tag := exampleTag{ - token: exampleToken + " " + match[1], - linkText: match[1], - fileType: match[3], - } - exampleTags = append(exampleTags, tag) - } - // update all example Tags - for _, tag := range exampleTags { - ft := "" - if tag.fileType == "json" { - ft = "json" - } - if tag.fileType == "yaml" { - ft = "yaml" - } - example, err := exampleContent(filePath, tag.linkText, ft) - if err != nil { - return mlines, err - } - mlines, err = updateMacroBlock(mlines, tag.token, example) - if err != nil { - return mlines, err - } - } - return mlines, nil -} - -// exampleContent retrieves the content of the file at linkPath -func exampleContent(filePath, linkPath, fileType string) (mungeLines, error) { - repoRel, err := makeRepoRelative(linkPath, filePath) - if err != nil { - return nil, err - } - - fileRel, err := makeFileRelative(linkPath, filePath) - if err != nil { - return nil, err - } - - dat, err := ioutil.ReadFile(repoRel) - if err != nil { - return nil, err - } - - // remove leading and trailing spaces and newlines - trimmedFileContent := strings.TrimSpace(string(dat)) - content := fmt.Sprintf("\n```%s\n%s\n```\n\n[Download example](%s?raw=true)", fileType, trimmedFileContent, fileRel) - out := getMungeLines(content) - return out, nil -} diff --git a/cmd/mungedocs/example_syncer_test.go b/cmd/mungedocs/example_syncer_test.go deleted file mode 100644 index 4c2505350415b..0000000000000 --- a/cmd/mungedocs/example_syncer_test.go +++ /dev/null @@ -1,67 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_syncExamples(t *testing.T) { - var podExample = `apiVersion: v1 -kind: Pod -metadata: - name: nginx -spec: - containers: - - name: nginx - image: nginx - ports: - - containerPort: 80 -` - var textExample = `some text -` - var cases = []struct { - in string - expected string - }{ - {"", ""}, - { - "\n\n", - "\n\n```yaml\n" + podExample + "```\n\n[Download example](testdata/pod.yaml?raw=true)\n\n", - }, - { - "\n\n", - "\n\n```yaml\n" + podExample + "```\n\n[Download example](../mungedocs/testdata/pod.yaml?raw=true)\n\n", - }, - { - "\n\n", - "\n\n```\n" + textExample + "```\n\n[Download example](testdata/example.txt?raw=true)\n\n", - }, - } - repoRoot = "" - for _, c := range cases { - in := getMungeLines(c.in) - expected := getMungeLines(c.expected) - actual, err := syncExamples("filename.md", in) - assert.NoError(t, err) - if !expected.Equal(actual) { - t.Errorf("Expected example \n'%q' but got \n'%q'", expected.String(), actual.String()) - } - } -} diff --git a/cmd/mungedocs/headers.go b/cmd/mungedocs/headers.go deleted file mode 100644 index e23ae7536e5ee..0000000000000 --- a/cmd/mungedocs/headers.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "fmt" - "regexp" -) - -var headerRegex = regexp.MustCompile(`^(#+)\s*(.*)$`) - -func fixHeaderLine(mlines mungeLines, newlines mungeLines, linenum int) mungeLines { - var out mungeLines - - mline := mlines[linenum] - line := mlines[linenum].data - - matches := headerRegex.FindStringSubmatch(line) - if matches == nil { - out = append(out, mline) - return out - } - - // There must be a blank line before the # (unless first line in file) - if linenum != 0 { - newlen := len(newlines) - if newlines[newlen-1].data != "" { - out = append(out, blankMungeLine) - } - } - - // There must be a space AFTER the ##'s - newline := fmt.Sprintf("%s %s", matches[1], matches[2]) - newmline := newMungeLine(newline) - out = append(out, newmline) - - // The next line needs to be a blank line (unless last line in file) - if len(mlines) > linenum+1 && mlines[linenum+1].data != "" { - out = append(out, blankMungeLine) - } - return out -} - -// Header lines need whitespace around them and after the #s. -func updateHeaderLines(filePath string, mlines mungeLines) (mungeLines, error) { - var out mungeLines - for i, mline := range mlines { - if mline.preformatted { - out = append(out, mline) - continue - } - if !mline.header { - out = append(out, mline) - continue - } - newLines := fixHeaderLine(mlines, out, i) - out = append(out, newLines...) - } - return out, nil -} diff --git a/cmd/mungedocs/headers_test.go b/cmd/mungedocs/headers_test.go deleted file mode 100644 index d30c9b32a144f..0000000000000 --- a/cmd/mungedocs/headers_test.go +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestHeaderLines(t *testing.T) { - var cases = []struct { - in string - expected string - }{ - {"", ""}, - { - "# ok", - "# ok", - }, - { - "## ok", - "## ok", - }, - { - "##### ok", - "##### ok", - }, - { - "##fix", - "## fix", - }, - { - "foo\n\n##fix\n\nbar", - "foo\n\n## fix\n\nbar", - }, - { - "foo\n##fix\nbar", - "foo\n\n## fix\n\nbar", - }, - { - "foo\n```\n##fix\n```\nbar", - "foo\n```\n##fix\n```\nbar", - }, - { - "foo\n#fix1\n##fix2\nbar", - "foo\n\n# fix1\n\n## fix2\n\nbar", - }, - } - for i, c := range cases { - in := getMungeLines(c.in) - expected := getMungeLines(c.expected) - actual, err := updateHeaderLines("filename.md", in) - assert.NoError(t, err) - if !actual.Equal(expected) { - t.Errorf("case[%d]: expected %q got %q", i, c.expected, actual.String()) - } - } -} diff --git a/cmd/mungedocs/kubectl_dash_f.go b/cmd/mungedocs/kubectl_dash_f.go deleted file mode 100644 index 2dae48cc8574d..0000000000000 --- a/cmd/mungedocs/kubectl_dash_f.go +++ /dev/null @@ -1,125 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "fmt" - "os" - "path" - "strings" -) - -// Looks for lines that have kubectl commands with -f flags and files that -// don't exist. -func updateKubectlFileTargets(file string, mlines mungeLines) (mungeLines, error) { - var errors []string - for i, mline := range mlines { - if !mline.preformatted { - continue - } - if err := lookForKubectl(mline.data, i); err != nil { - errors = append(errors, err.Error()) - } - } - err := error(nil) - if len(errors) != 0 { - err = fmt.Errorf("%s", strings.Join(errors, "\n")) - } - return mlines, err -} - -func lookForKubectl(line string, lineNum int) error { - fields := strings.Fields(line) - for i := range fields { - if fields[i] == "kubectl" { - return gotKubectl(lineNum, fields, i) - } - } - return nil -} - -func gotKubectl(lineNum int, fields []string, fieldNum int) error { - for i := fieldNum + 1; i < len(fields); i++ { - switch fields[i] { - case "create", "update", "replace", "delete": - return gotCommand(lineNum, fields, i) - } - } - return nil -} - -func gotCommand(lineNum int, fields []string, fieldNum int) error { - for i := fieldNum + 1; i < len(fields); i++ { - if strings.HasPrefix(fields[i], "-f") { - return gotDashF(lineNum, fields, i) - } - } - return nil -} - -func gotDashF(lineNum int, fields []string, fieldNum int) error { - target := "" - if fields[fieldNum] == "-f" { - if fieldNum+1 == len(fields) { - return fmt.Errorf("ran out of fields after '-f'") - } - target = fields[fieldNum+1] - } else { - target = fields[fieldNum][2:] - } - // Turn dirs into file-like names. - target = strings.TrimRight(target, "/") - - // Now exclude special-cases - - if target == "-" || target == "FILENAME" { - // stdin and "FILENAME" are OK - return nil - } - if strings.HasPrefix(target, "http://") || strings.HasPrefix(target, "https://") { - // URLs are ok - return nil - } - if strings.HasPrefix(target, "./") { - // Same-dir files are usually created in the same example - return nil - } - if strings.HasPrefix(target, "~/") { - // Home directory may also be created by the same example - return nil - } - if strings.HasPrefix(target, "/") { - // Absolute paths tend to be /tmp/* and created in the same example. - return nil - } - if strings.HasPrefix(target, "$") { - // Allow the start of the target to be an environment - // variable that points to the root of the kubernetes - // repo. - split := strings.SplitN(target, "/", 2) - if len(split) == 2 { - target = split[1] - } - } - - // If we got here we expect the file to exist. - _, err := os.Stat(path.Join(repoRoot, target)) - if os.IsNotExist(err) { - return fmt.Errorf("%d: target file %q does not exist", lineNum, target) - } - return err -} diff --git a/cmd/mungedocs/kubectl_dash_f_test.go b/cmd/mungedocs/kubectl_dash_f_test.go deleted file mode 100644 index 6f18fd547a408..0000000000000 --- a/cmd/mungedocs/kubectl_dash_f_test.go +++ /dev/null @@ -1,143 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import "testing" - -func TestKubectlDashF(t *testing.T) { - var cases = []struct { - in string - ok bool - }{ - // No match - {"", true}, - { - "Foo\nBar\n", - true, - }, - { - "Foo\nkubectl blah blech\nBar", - true, - }, - { - "Foo\n```shell\nkubectl blah blech\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create blech\n```\nBar", - true, - }, - // Special cases - { - "Foo\n```\nkubectl -blah create -f -\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -f-\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -f FILENAME\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -fFILENAME\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -f http://google.com/foobar\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -fhttp://google.com/foobar\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -f ./foobar\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -f./foobar\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -f /foobar\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -f/foobar\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -f~/foobar\n```\nBar", - true, - }, - // Real checks - { - "Foo\n```\nkubectl -blah create -f mungedocs.go\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah create -fmungedocs.go\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah update -f mungedocs.go\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah update -fmungedocs.go\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah replace -f mungedocs.go\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah replace -fmungedocs.go\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah delete -f mungedocs.go\n```\nBar", - true, - }, - { - "Foo\n```\nkubectl -blah delete -fmungedocs.go\n```\nBar", - true, - }, - // Failures - { - "Foo\n```\nkubectl -blah delete -f does_not_exist\n```\nBar", - false, - }, - { - "Foo\n```\nkubectl -blah delete -fdoes_not_exist\n```\nBar", - false, - }, - } - for i, c := range cases { - repoRoot = "" - in := getMungeLines(c.in) - _, err := updateKubectlFileTargets("filename.md", in) - if err != nil && c.ok { - t.Errorf("case[%d]: expected success, got %v", i, err) - } - if err == nil && !c.ok { - t.Errorf("case[%d]: unexpected success", i) - } - } -} diff --git a/cmd/mungedocs/links.go b/cmd/mungedocs/links.go deleted file mode 100644 index c05cdfa1874b7..0000000000000 --- a/cmd/mungedocs/links.go +++ /dev/null @@ -1,238 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "errors" - "fmt" - "net/url" - "os" - "path" - "regexp" - "strings" -) - -var ( - // Finds markdown links of the form [foo](bar "alt-text"). - linkRE = regexp.MustCompile(`\[([^]]*)\]\(([^)]*)\)`) - // Finds markdown link typos of the form (foo)[bar] - badLinkRE = regexp.MustCompile(`\([^]()]*\)\[[^]()]*\]`) - // Splits the link target into link target and alt-text. - altTextRE = regexp.MustCompile(`([^)]*)( ".*")`) -) - -func processLink(in string, filePath string) (string, error) { - var errs []string - out := linkRE.ReplaceAllStringFunc(in, func(in string) string { - var err error - match := linkRE.FindStringSubmatch(in) - if match == nil { - errs = append(errs, fmt.Sprintf("Detected this line had a link, but unable to parse, %v", in)) - return "" - } - // match[0] is the entire expression; - visibleText := match[1] - linkText := match[2] - altText := "" - if parts := altTextRE.FindStringSubmatch(linkText); parts != nil { - linkText = parts[1] - altText = parts[2] - } - - // clean up some random garbage I found in our docs. - linkText = strings.Trim(linkText, " ") - linkText = strings.Trim(linkText, "\n") - linkText = strings.Trim(linkText, " ") - - u, terr := url.Parse(linkText) - if terr != nil { - errs = append(errs, fmt.Sprintf("link %q is unparsable: %v", linkText, terr)) - return in - } - - if u.Host != "" && u.Host != "github.com" { - // We only care about relative links and links within github. - return in - } - - suggestedVisibleText := visibleText - if u.Path != "" && !strings.HasPrefix(linkText, "TODO:") { - newPath, targetExists := checkPath(filePath, path.Clean(u.Path)) - if !targetExists { - errs = append(errs, fmt.Sprintf("%q: target not found", linkText)) - return in - } - u.Path = newPath - if strings.HasPrefix(u.Path, "/") { - u.Host = "github.com" - u.Scheme = "https" - } else { - // Remove host and scheme from relative paths - u.Host = "" - u.Scheme = "" - } - // Make the visible text show the absolute path if it's - // not nested in or beneath the current directory. - if strings.HasPrefix(u.Path, "..") { - dir := path.Dir(filePath) - suggestedVisibleText, err = makeRepoRelative(path.Join(dir, u.Path), filePath) - if err != nil { - errs = append(errs, fmt.Sprintf("%q: unable to make path relative", filePath)) - return in - } - } else { - suggestedVisibleText = u.Path - } - var unescaped string - if unescaped, err = url.QueryUnescape(u.String()); err != nil { - // Remove %28 type stuff, be nice to humans. - // And don't fight with the toc generator. - linkText = unescaped - } else { - linkText = u.String() - } - } - // If the current visible text is trying to be a file name, use - // the correct file name. - if strings.HasSuffix(visibleText, ".md") && !strings.ContainsAny(visibleText, ` '"`+"`") { - visibleText = suggestedVisibleText - } - - return fmt.Sprintf("[%s](%s)", visibleText, linkText+altText) - }) - if len(errs) != 0 { - return "", errors.New(strings.Join(errs, ",")) - } - return out, nil -} - -// updateLinks assumes lines has links in markdown syntax, and verifies that -// any relative links actually point to files that exist. -func updateLinks(filePath string, mlines mungeLines) (mungeLines, error) { - var out mungeLines - allErrs := []string{} - - for lineNum, mline := range mlines { - if mline.preformatted { - out = append(out, mline) - continue - } - if badMatch := badLinkRE.FindString(mline.data); badMatch != "" { - allErrs = append(allErrs, - fmt.Sprintf("On line %d: found backwards markdown link %q", lineNum, badMatch)) - } - if !mline.link { - out = append(out, mline) - continue - } - line, err := processLink(mline.data, filePath) - if err != nil { - var s = fmt.Sprintf("On line %d: %s", lineNum, err.Error()) - err := errors.New(s) - allErrs = append(allErrs, err.Error()) - } - ml := newMungeLine(line) - out = append(out, ml) - } - err := error(nil) - if len(allErrs) != 0 { - err = fmt.Errorf("%s", strings.Join(allErrs, "\n")) - } - return out, err -} - -// We have to append together before path.Clean will be able to tell that stuff -// like ../docs isn't needed. -func cleanPath(dirPath, linkPath string) string { - clean := path.Clean(path.Join(dirPath, linkPath)) - if strings.HasPrefix(clean, dirPath+"/") { - out := strings.TrimPrefix(clean, dirPath+"/") - if out != linkPath { - fmt.Printf("%s -> %s\n", linkPath, out) - } - return out - } - return linkPath -} - -func checkPath(filePath, linkPath string) (newPath string, ok bool) { - dir := path.Dir(filePath) - absFilePrefixes := []string{ - "/kubernetes/kubernetes/blob/master/", - "/kubernetes/kubernetes/tree/master/", - } - for _, prefix := range absFilePrefixes { - if strings.HasPrefix(linkPath, prefix) { - linkPath = strings.TrimPrefix(linkPath, prefix) - // Now linkPath is relative to the root of the repo. The below - // loop that adds ../ at the beginning of the path should find - // the right path. - break - } - } - if strings.HasPrefix(linkPath, "/") { - // These links might go to e.g. the github issues page, or a - // file at a particular revision, or another github project - // entirely. - return linkPath, true - } - linkPath = cleanPath(dir, linkPath) - - // Fast exit if the link is already correct. - if info, err := os.Stat(path.Join(dir, linkPath)); err == nil { - if info.IsDir() { - return linkPath + "/", true - } - return linkPath, true - } - - for strings.HasPrefix(linkPath, "../") { - linkPath = strings.TrimPrefix(linkPath, "../") - } - - // Fix - vs _ automatically - nameMungers := []func(string) string{ - func(s string) string { return s }, - func(s string) string { return strings.Replace(s, "-", "_", -1) }, - func(s string) string { return strings.Replace(s, "_", "-", -1) }, - } - // Fix being moved into/out of admin (replace "admin" with directory - // you're doing mass movements to/from). - pathMungers := []func(string) string{ - func(s string) string { return s }, - func(s string) string { return path.Join("admin", s) }, - func(s string) string { return strings.TrimPrefix(s, "admin/") }, - } - - for _, namer := range nameMungers { - for _, pather := range pathMungers { - newPath = pather(namer(linkPath)) - for i := 0; i < 7; i++ { - // The file must exist. - target := path.Join(dir, newPath) - if info, err := os.Stat(target); err == nil { - if info.IsDir() { - return newPath + "/", true - } - return cleanPath(dir, newPath), true - } - newPath = path.Join("..", newPath) - } - } - } - return linkPath, false -} diff --git a/cmd/mungedocs/links_test.go b/cmd/mungedocs/links_test.go deleted file mode 100644 index d5c761e051bad..0000000000000 --- a/cmd/mungedocs/links_test.go +++ /dev/null @@ -1,72 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" -) - -var _ = fmt.Printf - -func TestBadLinks(t *testing.T) { - var cases = []struct { - in string - }{ - {"[NOTREADME](https://github.com/kubernetes/kubernetes/tree/master/NOTREADME.md)"}, - {"[NOTREADME](https://github.com/kubernetes/kubernetes/tree/master/docs/NOTREADME.md)"}, - {"[NOTREADME](../NOTREADME.md)"}, - } - for _, c := range cases { - in := getMungeLines(c.in) - _, err := updateLinks("filename.md", in) - assert.Error(t, err) - } -} -func TestGoodLinks(t *testing.T) { - var cases = []struct { - in string - expected string - }{ - {"", ""}, - {"[README](https://lwn.net)", - "[README](https://lwn.net)"}, - // _ to - - {"[README](https://github.com/kubernetes/kubernetes/tree/master/cmd/mungedocs/testdata/test_dashes.md)", - "[README](../../cmd/mungedocs/testdata/test-dashes.md)"}, - // - to _ - {"[README](../../cmd/mungedocs/testdata/test-underscores.md)", - "[README](../../cmd/mungedocs/testdata/test_underscores.md)"}, - - // Does this even make sense? i dunno - {"[README](/docs/README.md)", - "[README](https://github.com/docs/README.md)"}, - {"[README](/kubernetes/kubernetes/tree/master/cmd/mungedocs/testdata/README.md)", - "[README](../../cmd/mungedocs/testdata/README.md)"}, - } - for i, c := range cases { - in := getMungeLines(c.in) - expected := getMungeLines(c.expected) - actual, err := updateLinks("filename.md", in) - assert.NoError(t, err) - if !actual.Equal(expected) { - t.Errorf("case[%d]: expected %q got %q", i, c.expected, actual.String()) - } - } -} diff --git a/cmd/mungedocs/mungedocs.go b/cmd/mungedocs/mungedocs.go deleted file mode 100644 index 4ae44daff7c6c..0000000000000 --- a/cmd/mungedocs/mungedocs.go +++ /dev/null @@ -1,239 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "errors" - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - "strings" - - flag "github.com/spf13/pflag" -) - -// This needs to be updated when we cut a new release series. -const latestReleaseBranch = "release-1.5" - -var ( - verbose = flag.Bool("verbose", false, "On verification failure, emit pre-munge and post-munge versions.") - verify = flag.Bool("verify", false, "Exit with status 1 if files would have needed changes but do not change.") - norecurse = flag.Bool("norecurse", false, "Only process the files of --root-dir.") - upstream = flag.String("upstream", "upstream", "The name of the upstream Git remote to pull from") - rootDir = flag.String("root-dir", "", "Root directory containing documents to be processed.") - // "repo-root" seems like a dumb name, this is the relative path (from rootDir) to get to the repoRoot - relRoot = flag.String("repo-root", "..", `Appended to --root-dir to get the repository root. -It's done this way so that generally you just have to set --root-dir. -Examples: - * --root-dir=docs/ --repo-root=.. means the repository root is ./ - * --root-dir=/usr/local/long/path/repo/docs/ --repo-root=.. means the repository root is /usr/local/long/path/repo/ - * --root-dir=/usr/local/long/path/repo/docs/admin --repo-root=../.. means the repository root is /usr/local/long/path/repo/`) - skipMunges = flag.String("skip-munges", "", "Comma-separated list of munges to *not* run. Available munges are: "+availableMungeList) - repoRoot string - - ErrChangesNeeded = errors.New("mungedocs: changes required") - - // All of the munge operations to perform. - // TODO: allow selection from command line. (e.g., just check links in the examples directory.) - allMunges = []munge{ - // Simple "check something" functions must run first. - {"preformat-balance", checkPreformatBalance}, - // Functions which modify state. - {"remove-whitespace", updateWhitespace}, - {"table-of-contents", updateTOC}, - {"md-links", updateLinks}, - {"blank-lines-surround-preformatted", updatePreformatted}, - {"header-lines", updateHeaderLines}, - {"analytics", updateAnalytics}, - {"kubectl-dash-f", updateKubectlFileTargets}, - {"sync-examples", syncExamples}, - } - availableMungeList = func() string { - names := []string{} - for _, m := range allMunges { - names = append(names, m.name) - } - return strings.Join(names, ",") - }() -) - -// a munge processes a document, returning an updated document xor an error. -// The fn is NOT allowed to mutate 'before', if changes are needed it must copy -// data into a new byte array and return that. -type munge struct { - name string - fn func(filePath string, mlines mungeLines) (after mungeLines, err error) -} - -type fileProcessor struct { - // Which munge functions should we call? - munges []munge - - // Are we allowed to make changes? - verifyOnly bool -} - -// Either change a file or verify that it needs no changes (according to modify argument) -func (f fileProcessor) visit(path string) error { - if !strings.HasSuffix(path, ".md") { - return nil - } - - fileBytes, err := ioutil.ReadFile(path) - if err != nil { - return err - } - - mungeLines := getMungeLines(string(fileBytes)) - - modificationsMade := false - errFound := false - filePrinted := false - for _, munge := range f.munges { - after, err := munge.fn(path, mungeLines) - if err != nil || !after.Equal(mungeLines) { - if !filePrinted { - fmt.Printf("%s\n----\n", path) - filePrinted = true - } - fmt.Printf("%s:\n", munge.name) - if *verbose { - if len(mungeLines) <= 20 { - fmt.Printf("INPUT: <<<%v>>>\n", mungeLines) - fmt.Printf("MUNGED: <<<%v>>>\n", after) - } else { - fmt.Printf("not printing failed chunk: too many lines\n") - } - } - if err != nil { - fmt.Println(err) - errFound = true - } else { - fmt.Println("contents were modified") - modificationsMade = true - } - fmt.Println("") - } - mungeLines = after - } - - // Write out new file with any changes. - if modificationsMade { - if f.verifyOnly { - // We're not allowed to make changes. - return ErrChangesNeeded - } - ioutil.WriteFile(path, mungeLines.Bytes(), 0644) - } - if errFound { - return ErrChangesNeeded - } - - return nil -} - -func newWalkFunc(fp *fileProcessor, changesNeeded *bool) filepath.WalkFunc { - return func(path string, info os.FileInfo, err error) error { - stat, err := os.Stat(path) - if err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - if path != *rootDir && stat.IsDir() && *norecurse { - return filepath.SkipDir - } - if err := fp.visit(path); err != nil { - *changesNeeded = true - if err != ErrChangesNeeded { - return err - } - } - return nil - } -} - -func wantedMunges() (filtered []munge) { - skipList := strings.Split(*skipMunges, ",") - skipped := map[string]bool{} - for _, m := range skipList { - if len(m) > 0 { - skipped[m] = true - } - } - for _, m := range allMunges { - if !skipped[m.name] { - filtered = append(filtered, m) - } else { - // Remove from the map so we can verify that everything - // requested was in fact valid. - delete(skipped, m.name) - } - } - if len(skipped) != 0 { - fmt.Fprintf(os.Stderr, "ERROR: requested to skip %v, but these are not valid munges. (valid: %v)\n", skipped, availableMungeList) - os.Exit(1) - } - return filtered -} - -func main() { - var err error - flag.Parse() - - if *rootDir == "" { - fmt.Fprintf(os.Stderr, "usage: %s [--help] [--verify] [--norecurse] --root-dir [--skip-munges=] [--upstream=] \n", flag.Arg(0)) - os.Exit(1) - } - - repoRoot = path.Join(*rootDir, *relRoot) - repoRoot, err = filepath.Abs(repoRoot) - if err != nil { - fmt.Fprintf(os.Stderr, "ERROR: %v\n", err) - os.Exit(2) - } - - fp := fileProcessor{ - munges: wantedMunges(), - verifyOnly: *verify, - } - - // For each markdown file under source docs root, process the doc. - // - If any error occurs: exit with failure (exit >1). - // - If verify is true: exit 0 if no changes needed, exit 1 if changes - // needed. - // - If verify is false: exit 0 if changes successfully made or no - // changes needed, exit 1 if manual changes are needed. - var changesNeeded bool - - err = filepath.Walk(*rootDir, newWalkFunc(&fp, &changesNeeded)) - if err != nil { - fmt.Fprintf(os.Stderr, "ERROR: %v\n", err) - os.Exit(2) - } - if changesNeeded { - if *verify { - fmt.Fprintf(os.Stderr, "FAIL: changes needed but not made due to --verify\n") - } else { - fmt.Fprintf(os.Stderr, "FAIL: some manual changes are still required.\n") - } - os.Exit(1) - } -} diff --git a/cmd/mungedocs/preformatted.go b/cmd/mungedocs/preformatted.go deleted file mode 100644 index 582ba981a109d..0000000000000 --- a/cmd/mungedocs/preformatted.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import "fmt" - -// Blocks of ``` need to have blank lines on both sides or they don't look -// right in HTML. -func updatePreformatted(filePath string, mlines mungeLines) (mungeLines, error) { - var out mungeLines - inpreformat := false - for i, mline := range mlines { - if !inpreformat && mline.preformatted { - if i == 0 || out[len(out)-1].data != "" { - out = append(out, blankMungeLine) - } - // start of a preformat block - inpreformat = true - } - out = append(out, mline) - if inpreformat && !mline.preformatted { - if i >= len(mlines)-2 || mlines[i+1].data != "" { - out = append(out, blankMungeLine) - } - inpreformat = false - } - } - return out, nil -} - -// If the file ends on a preformatted line, there must have been an imbalance. -func checkPreformatBalance(filePath string, mlines mungeLines) (mungeLines, error) { - if len(mlines) > 0 && mlines[len(mlines)-1].preformatted { - return mlines, fmt.Errorf("unbalanced triple backtick delimiters") - } - return mlines, nil -} diff --git a/cmd/mungedocs/preformatted_test.go b/cmd/mungedocs/preformatted_test.go deleted file mode 100644 index 718e002976ee4..0000000000000 --- a/cmd/mungedocs/preformatted_test.go +++ /dev/null @@ -1,97 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestPreformatted(t *testing.T) { - var cases = []struct { - in string - expected string - }{ - {"", ""}, - { - "```\nbob\n```", - "\n```\nbob\n```\n\n", - }, - { - "```\nbob\n```\n```\nnotbob\n```\n", - "\n```\nbob\n```\n\n```\nnotbob\n```\n\n", - }, - { - "```bob```\n", - "```bob```\n", - }, - { - " ```\n bob\n ```", - "\n ```\n bob\n ```\n\n", - }, - } - for i, c := range cases { - in := getMungeLines(c.in) - expected := getMungeLines(c.expected) - actual, err := updatePreformatted("filename.md", in) - assert.NoError(t, err) - if !actual.Equal(expected) { - t.Errorf("case[%d]: expected %q got %q", i, c.expected, actual.String()) - } - } -} - -func TestPreformattedImbalance(t *testing.T) { - var cases = []struct { - in string - ok bool - }{ - {"", true}, - {"```\nin\n```", true}, - {"```\nin\n```\nout", true}, - {"```", false}, - {"```\nin\n```\nout\n```", false}, - } - for i, c := range cases { - in := getMungeLines(c.in) - out, err := checkPreformatBalance("filename.md", in) - if err != nil && c.ok { - t.Errorf("case[%d]: expected success", i) - } - if err == nil && !c.ok { - t.Errorf("case[%d]: expected failure", i) - } - // Even in case of misformat, return all the text, - // so that the user's work is not lost. - if !equalMungeLines(out, in) { - t.Errorf("case[%d]: expected munged text to be identical to input text", i) - } - } -} - -func equalMungeLines(a, b mungeLines) bool { - if len(a) != len(b) { - return false - } - for i := range a { - if a[i] != b[i] { - return false - } - } - return true -} diff --git a/cmd/mungedocs/testdata/README.md b/cmd/mungedocs/testdata/README.md deleted file mode 100644 index 7b57bd29ea8af..0000000000000 --- a/cmd/mungedocs/testdata/README.md +++ /dev/null @@ -1 +0,0 @@ -some text diff --git a/cmd/mungedocs/testdata/example.txt b/cmd/mungedocs/testdata/example.txt deleted file mode 100644 index 7b57bd29ea8af..0000000000000 --- a/cmd/mungedocs/testdata/example.txt +++ /dev/null @@ -1 +0,0 @@ -some text diff --git a/cmd/mungedocs/testdata/pod.yaml b/cmd/mungedocs/testdata/pod.yaml deleted file mode 100644 index 89920b83a9af6..0000000000000 --- a/cmd/mungedocs/testdata/pod.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: nginx -spec: - containers: - - name: nginx - image: nginx - ports: - - containerPort: 80 \ No newline at end of file diff --git a/cmd/mungedocs/testdata/test-dashes.md b/cmd/mungedocs/testdata/test-dashes.md deleted file mode 100644 index 7b57bd29ea8af..0000000000000 --- a/cmd/mungedocs/testdata/test-dashes.md +++ /dev/null @@ -1 +0,0 @@ -some text diff --git a/cmd/mungedocs/testdata/test_underscores.md b/cmd/mungedocs/testdata/test_underscores.md deleted file mode 100644 index 7b57bd29ea8af..0000000000000 --- a/cmd/mungedocs/testdata/test_underscores.md +++ /dev/null @@ -1 +0,0 @@ -some text diff --git a/cmd/mungedocs/toc.go b/cmd/mungedocs/toc.go deleted file mode 100644 index 649a954bf5abc..0000000000000 --- a/cmd/mungedocs/toc.go +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "fmt" - "regexp" - "strings" -) - -const tocMungeTag = "GENERATED_TOC" - -var r = regexp.MustCompile("[^A-Za-z0-9-]") - -// inserts/updates a table of contents in markdown file. -// -// First, builds a ToC. -// Then, finds the magic macro block tags and replaces anything between those with -// the ToC, thereby updating any previously inserted ToC. -// -// TODO(erictune): put this in own package with tests -func updateTOC(filePath string, mlines mungeLines) (mungeLines, error) { - toc := buildTOC(mlines) - updatedMarkdown, err := updateMacroBlock(mlines, tocMungeTag, toc) - if err != nil { - return mlines, err - } - return updatedMarkdown, nil -} - -// builds table of contents for markdown file -// -// First scans for all section headers (lines that begin with "#" but not within code quotes) -// and builds a table of contents from those. Assumes bookmarks for those will be -// like #each-word-in-heading-in-lowercases-with-dashes-instead-of-spaces. -// builds the ToC. - -func buildTOC(mlines mungeLines) mungeLines { - var out mungeLines - bookmarks := map[string]int{} - - for _, mline := range mlines { - if mline.preformatted || !mline.header { - continue - } - // Add a blank line after the munge start tag - if len(out) == 0 { - out = append(out, blankMungeLine) - } - line := mline.data - noSharps := strings.TrimLeft(line, "#") - numSharps := len(line) - len(noSharps) - heading := strings.Trim(noSharps, " \n") - if numSharps > 0 { - indent := strings.Repeat(" ", numSharps-1) - bookmark := strings.Replace(strings.ToLower(heading), " ", "-", -1) - // remove symbols (except for -) in bookmarks - bookmark = r.ReplaceAllString(bookmark, "") - // Incremental counter for duplicate bookmarks - next := bookmarks[bookmark] - bookmarks[bookmark] = next + 1 - if next > 0 { - bookmark = fmt.Sprintf("%s-%d", bookmark, next) - } - tocLine := fmt.Sprintf("%s- [%s](#%s)", indent, heading, bookmark) - out = append(out, newMungeLine(tocLine)) - } - - } - // Add a blank line before the munge end tag - if len(out) != 0 { - out = append(out, blankMungeLine) - } - return out -} diff --git a/cmd/mungedocs/toc_test.go b/cmd/mungedocs/toc_test.go deleted file mode 100644 index 5d7e27cdcdee1..0000000000000 --- a/cmd/mungedocs/toc_test.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_buildTOC(t *testing.T) { - var cases = []struct { - in string - expected string - }{ - {"", ""}, - {"Lorem ipsum\ndolor sit amet\n", ""}, - { - "# Title\nLorem ipsum \n## Section Heading\ndolor sit amet\n", - "\n- [Title](#title)\n - [Section Heading](#section-heading)\n\n", - }, - { - "# Title\nLorem ipsum \n## Section Heading\ndolor sit amet\n```bash\n#!/bin/sh\n```", - "\n- [Title](#title)\n - [Section Heading](#section-heading)\n\n", - }, - { - "# Title\nLorem ipsum \n## Section Heading\n### Ok, why doesn't this work? ...add 4 *more* `symbols`!\ndolor sit amet\n", - "\n- [Title](#title)\n - [Section Heading](#section-heading)\n - [Ok, why doesn't this work? ...add 4 *more* `symbols`!](#ok-why-doesnt-this-work-add-4-more-symbols)\n\n", - }, - } - for i, c := range cases { - in := getMungeLines(c.in) - expected := getMungeLines(c.expected) - actual := buildTOC(in) - if !expected.Equal(actual) { - t.Errorf("Case[%d] Expected TOC '%v' but got '%v'", i, expected.String(), actual.String()) - } - } -} - -func Test_updateTOC(t *testing.T) { - var cases = []struct { - in string - expected string - }{ - {"", ""}, - { - "Lorem ipsum\ndolor sit amet\n", - "Lorem ipsum\ndolor sit amet\n", - }, - { - "# Title\nLorem ipsum \n**table of contents**\n\nold cruft\n\n## Section Heading\ndolor sit amet\n", - "# Title\nLorem ipsum \n**table of contents**\n\n\n- [Title](#title)\n - [Section Heading](#section-heading)\n\n\n## Section Heading\ndolor sit amet\n", - }, - } - for _, c := range cases { - in := getMungeLines(c.in) - expected := getMungeLines(c.expected) - actual, err := updateTOC("filename.md", in) - assert.NoError(t, err) - if !expected.Equal(actual) { - t.Errorf("Expected TOC '%v' but got '%v'", expected.String(), actual.String()) - } - } -} diff --git a/cmd/mungedocs/util.go b/cmd/mungedocs/util.go deleted file mode 100644 index c25e1d1976ecc..0000000000000 --- a/cmd/mungedocs/util.go +++ /dev/null @@ -1,291 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "fmt" - "path" - "path/filepath" - "regexp" - "strings" - "unicode" -) - -// Replaces the text between matching "beginMark" and "endMark" within the -// document represented by "lines" with "insertThis". -// -// Delimiters should occupy own line. -// Returns copy of document with modifications. -func updateMacroBlock(mlines mungeLines, token string, insertThis mungeLines) (mungeLines, error) { - beginMark := beginMungeTag(token) - endMark := endMungeTag(token) - var out mungeLines - betweenBeginAndEnd := false - for _, mline := range mlines { - if mline.preformatted && !betweenBeginAndEnd { - out = append(out, mline) - continue - } - line := mline.data - if mline.beginTag && line == beginMark { - if betweenBeginAndEnd { - return nil, fmt.Errorf("found second begin mark while updating macro blocks") - } - betweenBeginAndEnd = true - out = append(out, mline) - } else if mline.endTag && line == endMark { - if !betweenBeginAndEnd { - return nil, fmt.Errorf("found end mark without begin mark while updating macro blocks") - } - betweenBeginAndEnd = false - out = append(out, insertThis...) - out = append(out, mline) - } else { - if !betweenBeginAndEnd { - out = append(out, mline) - } - } - } - if betweenBeginAndEnd { - return nil, fmt.Errorf("never found closing end mark while updating macro blocks") - } - return out, nil -} - -// Tests that a document, represented as a slice of lines, has a line. Ignores -// leading and trailing space. -func hasLine(lines mungeLines, needle string) bool { - for _, mline := range lines { - haystack := strings.TrimSpace(mline.data) - if haystack == needle { - return true - } - } - return false -} - -func removeMacroBlock(token string, mlines mungeLines) (mungeLines, error) { - beginMark := beginMungeTag(token) - endMark := endMungeTag(token) - var out mungeLines - betweenBeginAndEnd := false - for _, mline := range mlines { - if mline.preformatted { - out = append(out, mline) - continue - } - line := mline.data - if mline.beginTag && line == beginMark { - if betweenBeginAndEnd { - return nil, fmt.Errorf("found second begin mark while updating macro blocks") - } - betweenBeginAndEnd = true - } else if mline.endTag && line == endMark { - if !betweenBeginAndEnd { - return nil, fmt.Errorf("found end mark without begin mark while updating macro blocks") - } - betweenBeginAndEnd = false - } else { - if !betweenBeginAndEnd { - out = append(out, mline) - } - } - } - if betweenBeginAndEnd { - return nil, fmt.Errorf("never found closing end mark while updating macro blocks") - } - return out, nil -} - -// Add a macro block to the beginning of a set of lines -func prependMacroBlock(token string, mlines mungeLines) mungeLines { - beginLine := newMungeLine(beginMungeTag(token)) - endLine := newMungeLine(endMungeTag(token)) - out := mungeLines{beginLine, endLine} - if len(mlines) > 0 && mlines[0].data != "" { - out = append(out, blankMungeLine) - } - return append(out, mlines...) -} - -// Add a macro block to the end of a set of lines -func appendMacroBlock(mlines mungeLines, token string) mungeLines { - beginLine := newMungeLine(beginMungeTag(token)) - endLine := newMungeLine(endMungeTag(token)) - out := mlines - if len(mlines) > 0 && mlines[len(mlines)-1].data != "" { - out = append(out, blankMungeLine) - } - return append(out, beginLine, endLine) -} - -// Tests that a document, represented as a slice of lines, has a macro block. -func hasMacroBlock(lines mungeLines, token string) bool { - beginMark := beginMungeTag(token) - endMark := endMungeTag(token) - - foundBegin := false - for _, mline := range lines { - if mline.preformatted { - continue - } - if !mline.beginTag && !mline.endTag { - continue - } - line := mline.data - switch { - case !foundBegin && line == beginMark: - foundBegin = true - case foundBegin && line == endMark: - return true - } - } - return false -} - -// Returns the canonical begin-tag for a given description. This does not -// include the trailing newline. -func beginMungeTag(desc string) string { - return fmt.Sprintf("", desc) -} - -// Returns the canonical end-tag for a given description. This does not -// include the trailing newline. -func endMungeTag(desc string) string { - return fmt.Sprintf("", desc) -} - -type mungeLine struct { - data string - preformatted bool - header bool - link bool - beginTag bool - endTag bool -} - -type mungeLines []mungeLine - -func (m1 mungeLines) Equal(m2 mungeLines) bool { - if len(m1) != len(m2) { - return false - } - for i := range m1 { - if m1[i].data != m2[i].data { - return false - } - } - return true -} - -func (mlines mungeLines) String() string { - slice := []string{} - for _, mline := range mlines { - slice = append(slice, mline.data) - } - s := strings.Join(slice, "\n") - // We need to tack on an extra newline at the end of the file - return s + "\n" -} - -func (mlines mungeLines) Bytes() []byte { - return []byte(mlines.String()) -} - -var ( - // Finds all preformatted block start/stops. - preformatRE = regexp.MustCompile("^\\s*```") - notPreformatRE = regexp.MustCompile("^\\s*```.*```") - // Is this line a header? - mlHeaderRE = regexp.MustCompile(`^#`) - // Is there a link on this line? - mlLinkRE = regexp.MustCompile(`\[[^]]*\]\([^)]*\)`) - beginTagRE = regexp.MustCompile(` -- [v1.7.4](#v174) - - [Downloads for v1.7.4](#downloads-for-v174) +- [v1.6.9](#v169) + - [Downloads for v1.6.9](#downloads-for-v169) - [Client Binaries](#client-binaries) - [Server Binaries](#server-binaries) - [Node Binaries](#node-binaries) - - [Changelog since v1.7.3](#changelog-since-v173) + - [Changelog since v1.6.8](#changelog-since-v168) - [Other notable changes](#other-notable-changes) -- [v1.6.8](#v168) - - [Downloads for v1.6.8](#downloads-for-v168) +- [v1.7.4](#v174) + - [Downloads for v1.7.4](#downloads-for-v174) - [Client Binaries](#client-binaries-1) - [Server Binaries](#server-binaries-1) - [Node Binaries](#node-binaries-1) - - [Changelog since v1.6.7](#changelog-since-v167) + - [Changelog since v1.7.3](#changelog-since-v173) - [Other notable changes](#other-notable-changes-1) -- [v1.7.3](#v173) - - [Downloads for v1.7.3](#downloads-for-v173) +- [v1.6.8](#v168) + - [Downloads for v1.6.8](#downloads-for-v168) - [Client Binaries](#client-binaries-2) - [Server Binaries](#server-binaries-2) - [Node Binaries](#node-binaries-2) - - [Changelog since v1.7.2](#changelog-since-v172) + - [Changelog since v1.6.7](#changelog-since-v167) - [Other notable changes](#other-notable-changes-2) -- [v1.7.2](#v172) - - [Downloads for v1.7.2](#downloads-for-v172) +- [v1.7.3](#v173) + - [Downloads for v1.7.3](#downloads-for-v173) - [Client Binaries](#client-binaries-3) - [Server Binaries](#server-binaries-3) - [Node Binaries](#node-binaries-3) - - [Changelog since v1.7.1](#changelog-since-v171) + - [Changelog since v1.7.2](#changelog-since-v172) - [Other notable changes](#other-notable-changes-3) -- [v1.7.1](#v171) - - [Downloads for v1.7.1](#downloads-for-v171) +- [v1.7.2](#v172) + - [Downloads for v1.7.2](#downloads-for-v172) - [Client Binaries](#client-binaries-4) - [Server Binaries](#server-binaries-4) - [Node Binaries](#node-binaries-4) - - [Changelog since v1.7.0](#changelog-since-v170) + - [Changelog since v1.7.1](#changelog-since-v171) - [Other notable changes](#other-notable-changes-4) -- [v1.8.0-alpha.2](#v180-alpha2) - - [Downloads for v1.8.0-alpha.2](#downloads-for-v180-alpha2) +- [v1.7.1](#v171) + - [Downloads for v1.7.1](#downloads-for-v171) - [Client Binaries](#client-binaries-5) - [Server Binaries](#server-binaries-5) - [Node Binaries](#node-binaries-5) - - [Changelog since v1.7.0](#changelog-since-v170-1) - - [Action Required](#action-required) + - [Changelog since v1.7.0](#changelog-since-v170) - [Other notable changes](#other-notable-changes-5) -- [v1.6.7](#v167) - - [Downloads for v1.6.7](#downloads-for-v167) +- [v1.8.0-alpha.2](#v180-alpha2) + - [Downloads for v1.8.0-alpha.2](#downloads-for-v180-alpha2) - [Client Binaries](#client-binaries-6) - [Server Binaries](#server-binaries-6) - [Node Binaries](#node-binaries-6) - - [Changelog since v1.6.6](#changelog-since-v166) + - [Changelog since v1.7.0](#changelog-since-v170-1) + - [Action Required](#action-required) - [Other notable changes](#other-notable-changes-6) -- [v1.7.0](#v170) - - [Downloads for v1.7.0](#downloads-for-v170) +- [v1.6.7](#v167) + - [Downloads for v1.6.7](#downloads-for-v167) - [Client Binaries](#client-binaries-7) - [Server Binaries](#server-binaries-7) - [Node Binaries](#node-binaries-7) + - [Changelog since v1.6.6](#changelog-since-v166) + - [Other notable changes](#other-notable-changes-7) +- [v1.7.0](#v170) + - [Downloads for v1.7.0](#downloads-for-v170) + - [Client Binaries](#client-binaries-8) + - [Server Binaries](#server-binaries-8) + - [Node Binaries](#node-binaries-8) - [**Major Themes**](#major-themes) - [**Action Required Before Upgrading**](#action-required-before-upgrading) - [Network](#network) @@ -109,7 +116,7 @@ - [Local Storage](#local-storage) - [Volume Plugins](#volume-plugins) - [Metrics](#metrics) - - [**Other notable changes**](#other-notable-changes-7) + - [**Other notable changes**](#other-notable-changes-8) - [Admission plugin](#admission-plugin) - [API Machinery](#api-machinery-1) - [Application autoscaling](#application-autoscaling-1) @@ -137,127 +144,127 @@ - [Previous Releases Included in v1.7.0](#previous-releases-included-in-v170) - [v1.7.0-rc.1](#v170-rc1) - [Downloads for v1.7.0-rc.1](#downloads-for-v170-rc1) - - [Client Binaries](#client-binaries-8) - - [Server Binaries](#server-binaries-8) - - [Node Binaries](#node-binaries-8) + - [Client Binaries](#client-binaries-9) + - [Server Binaries](#server-binaries-9) + - [Node Binaries](#node-binaries-9) - [Changelog since v1.7.0-beta.2](#changelog-since-v170-beta2) - [Action Required](#action-required-1) - - [Other notable changes](#other-notable-changes-8) + - [Other notable changes](#other-notable-changes-9) - [v1.8.0-alpha.1](#v180-alpha1) - [Downloads for v1.8.0-alpha.1](#downloads-for-v180-alpha1) - - [Client Binaries](#client-binaries-9) - - [Server Binaries](#server-binaries-9) - - [Node Binaries](#node-binaries-9) + - [Client Binaries](#client-binaries-10) + - [Server Binaries](#server-binaries-10) + - [Node Binaries](#node-binaries-10) - [Changelog since v1.7.0-alpha.4](#changelog-since-v170-alpha4) - [Action Required](#action-required-2) - - [Other notable changes](#other-notable-changes-9) + - [Other notable changes](#other-notable-changes-10) - [v1.6.6](#v166) - [Downloads for v1.6.6](#downloads-for-v166) - - [Client Binaries](#client-binaries-10) - - [Server Binaries](#server-binaries-10) - - [Node Binaries](#node-binaries-10) + - [Client Binaries](#client-binaries-11) + - [Server Binaries](#server-binaries-11) + - [Node Binaries](#node-binaries-11) - [Changelog since v1.6.5](#changelog-since-v165) - [Action Required](#action-required-3) - - [Other notable changes](#other-notable-changes-10) + - [Other notable changes](#other-notable-changes-11) - [v1.7.0-beta.2](#v170-beta2) - [Downloads for v1.7.0-beta.2](#downloads-for-v170-beta2) - - [Client Binaries](#client-binaries-11) - - [Server Binaries](#server-binaries-11) - - [Node Binaries](#node-binaries-11) + - [Client Binaries](#client-binaries-12) + - [Server Binaries](#server-binaries-12) + - [Node Binaries](#node-binaries-12) - [Changelog since v1.7.0-beta.1](#changelog-since-v170-beta1) - [Action Required](#action-required-4) - - [Other notable changes](#other-notable-changes-11) + - [Other notable changes](#other-notable-changes-12) - [v1.6.5](#v165) - [Known Issues for v1.6.5](#known-issues-for-v165) - [Downloads for v1.6.5](#downloads-for-v165) - - [Client Binaries](#client-binaries-12) - - [Server Binaries](#server-binaries-12) - - [Node Binaries](#node-binaries-12) - - [Changelog since v1.6.4](#changelog-since-v164) - - [Other notable changes](#other-notable-changes-12) -- [v1.7.0-beta.1](#v170-beta1) - - [Downloads for v1.7.0-beta.1](#downloads-for-v170-beta1) - [Client Binaries](#client-binaries-13) - [Server Binaries](#server-binaries-13) - [Node Binaries](#node-binaries-13) - - [Changelog since v1.7.0-alpha.4](#changelog-since-v170-alpha4-1) - - [Action Required](#action-required-5) + - [Changelog since v1.6.4](#changelog-since-v164) - [Other notable changes](#other-notable-changes-13) -- [v1.6.4](#v164) - - [Known Issues for v1.6.4](#known-issues-for-v164) - - [Downloads for v1.6.4](#downloads-for-v164) +- [v1.7.0-beta.1](#v170-beta1) + - [Downloads for v1.7.0-beta.1](#downloads-for-v170-beta1) - [Client Binaries](#client-binaries-14) - [Server Binaries](#server-binaries-14) - [Node Binaries](#node-binaries-14) - - [Changelog since v1.6.3](#changelog-since-v163) + - [Changelog since v1.7.0-alpha.4](#changelog-since-v170-alpha4-1) + - [Action Required](#action-required-5) - [Other notable changes](#other-notable-changes-14) -- [v1.7.0-alpha.4](#v170-alpha4) - - [Downloads for v1.7.0-alpha.4](#downloads-for-v170-alpha4) +- [v1.6.4](#v164) + - [Known Issues for v1.6.4](#known-issues-for-v164) + - [Downloads for v1.6.4](#downloads-for-v164) - [Client Binaries](#client-binaries-15) - [Server Binaries](#server-binaries-15) - [Node Binaries](#node-binaries-15) - - [Changelog since v1.7.0-alpha.3](#changelog-since-v170-alpha3) - - [Action Required](#action-required-6) + - [Changelog since v1.6.3](#changelog-since-v163) - [Other notable changes](#other-notable-changes-15) -- [v1.6.3](#v163) - - [Known Issues for v1.6.3](#known-issues-for-v163) - - [Downloads for v1.6.3](#downloads-for-v163) +- [v1.7.0-alpha.4](#v170-alpha4) + - [Downloads for v1.7.0-alpha.4](#downloads-for-v170-alpha4) - [Client Binaries](#client-binaries-16) - [Server Binaries](#server-binaries-16) - [Node Binaries](#node-binaries-16) - - [Changelog since v1.6.2](#changelog-since-v162) + - [Changelog since v1.7.0-alpha.3](#changelog-since-v170-alpha3) + - [Action Required](#action-required-6) - [Other notable changes](#other-notable-changes-16) -- [v1.7.0-alpha.3](#v170-alpha3) - - [Downloads for v1.7.0-alpha.3](#downloads-for-v170-alpha3) +- [v1.6.3](#v163) + - [Known Issues for v1.6.3](#known-issues-for-v163) + - [Downloads for v1.6.3](#downloads-for-v163) - [Client Binaries](#client-binaries-17) - [Server Binaries](#server-binaries-17) - [Node Binaries](#node-binaries-17) - - [Changelog since v1.7.0-alpha.2](#changelog-since-v170-alpha2) - - [Action Required](#action-required-7) + - [Changelog since v1.6.2](#changelog-since-v162) - [Other notable changes](#other-notable-changes-17) -- [v1.5.7](#v157) - - [Downloads for v1.5.7](#downloads-for-v157) +- [v1.7.0-alpha.3](#v170-alpha3) + - [Downloads for v1.7.0-alpha.3](#downloads-for-v170-alpha3) - [Client Binaries](#client-binaries-18) - [Server Binaries](#server-binaries-18) - [Node Binaries](#node-binaries-18) - - [Changelog since v1.5.6](#changelog-since-v156) + - [Changelog since v1.7.0-alpha.2](#changelog-since-v170-alpha2) + - [Action Required](#action-required-7) - [Other notable changes](#other-notable-changes-18) -- [v1.4.12](#v1412) - - [Downloads for v1.4.12](#downloads-for-v1412) +- [v1.5.7](#v157) + - [Downloads for v1.5.7](#downloads-for-v157) - [Client Binaries](#client-binaries-19) - [Server Binaries](#server-binaries-19) - [Node Binaries](#node-binaries-19) - - [Changelog since v1.4.9](#changelog-since-v149) + - [Changelog since v1.5.6](#changelog-since-v156) - [Other notable changes](#other-notable-changes-19) -- [v1.7.0-alpha.2](#v170-alpha2) - - [Downloads for v1.7.0-alpha.2](#downloads-for-v170-alpha2) +- [v1.4.12](#v1412) + - [Downloads for v1.4.12](#downloads-for-v1412) - [Client Binaries](#client-binaries-20) - [Server Binaries](#server-binaries-20) + - [Node Binaries](#node-binaries-20) + - [Changelog since v1.4.9](#changelog-since-v149) + - [Other notable changes](#other-notable-changes-20) +- [v1.7.0-alpha.2](#v170-alpha2) + - [Downloads for v1.7.0-alpha.2](#downloads-for-v170-alpha2) + - [Client Binaries](#client-binaries-21) + - [Server Binaries](#server-binaries-21) - [Changelog since v1.7.0-alpha.1](#changelog-since-v170-alpha1) - [Action Required](#action-required-8) - - [Other notable changes](#other-notable-changes-20) + - [Other notable changes](#other-notable-changes-21) - [v1.6.2](#v162) - [Downloads for v1.6.2](#downloads-for-v162) - - [Client Binaries](#client-binaries-21) - - [Server Binaries](#server-binaries-21) + - [Client Binaries](#client-binaries-22) + - [Server Binaries](#server-binaries-22) - [Changelog since v1.6.1](#changelog-since-v161) - - [Other notable changes](#other-notable-changes-21) + - [Other notable changes](#other-notable-changes-22) - [v1.7.0-alpha.1](#v170-alpha1) - [Downloads for v1.7.0-alpha.1](#downloads-for-v170-alpha1) - - [Client Binaries](#client-binaries-22) - - [Server Binaries](#server-binaries-22) + - [Client Binaries](#client-binaries-23) + - [Server Binaries](#server-binaries-23) - [Changelog since v1.6.0](#changelog-since-v160) - - [Other notable changes](#other-notable-changes-22) + - [Other notable changes](#other-notable-changes-23) - [v1.6.1](#v161) - [Downloads for v1.6.1](#downloads-for-v161) - - [Client Binaries](#client-binaries-23) - - [Server Binaries](#server-binaries-23) + - [Client Binaries](#client-binaries-24) + - [Server Binaries](#server-binaries-24) - [Changelog since v1.6.0](#changelog-since-v160-1) - - [Other notable changes](#other-notable-changes-23) + - [Other notable changes](#other-notable-changes-24) - [v1.6.0](#v160) - [Downloads for v1.6.0](#downloads-for-v160) - - [Client Binaries](#client-binaries-24) - - [Server Binaries](#server-binaries-24) + - [Client Binaries](#client-binaries-25) + - [Server Binaries](#server-binaries-25) - [WARNING: etcd backup strongly recommended](#warning:-etcd-backup-strongly-recommended) - [Major updates and release themes](#major-updates-and-release-themes) - [Action Required](#action-required-9) @@ -324,7 +331,7 @@ - [vSphere](#vsphere) - [Federation](#federation-2) - [kubefed](#kubefed-1) - - [Other Notable Changes](#other-notable-changes-24) + - [Other Notable Changes](#other-notable-changes-25) - [Garbage Collector](#garbage-collector) - [kubeadm](#kubeadm-4) - [kubectl](#kubectl-1) @@ -334,7 +341,7 @@ - [Updates to apply](#updates-to-apply) - [Updates to edit](#updates-to-edit) - [Bug fixes](#bug-fixes) - - [Other Notable Changes](#other-notable-changes-25) + - [Other Notable Changes](#other-notable-changes-26) - [Node Components](#node-components-4) - [Bug fixes](#bug-fixes-1) - [kube-controller-manager](#kube-controller-manager) @@ -347,7 +354,7 @@ - [Photon](#photon) - [rbd](#rbd) - [vSphere](#vsphere-1) - - [Other Notable Changes](#other-notable-changes-26) + - [Other Notable Changes](#other-notable-changes-27) - [Changes to Cluster Provisioning Scripts](#changes-to-cluster-provisioning-scripts) - [AWS](#aws-1) - [Juju](#juju) @@ -355,7 +362,7 @@ - [GCE](#gce-1) - [OpenStack](#openstack) - [Container Images](#container-images) - - [Other Notable Changes](#other-notable-changes-27) + - [Other Notable Changes](#other-notable-changes-28) - [Changes to Addons](#changes-to-addons) - [Dashboard](#dashboard) - [DNS](#dns) @@ -371,108 +378,108 @@ - [Previous Releases Included in v1.6.0](#previous-releases-included-in-v160) - [v1.5.6](#v156) - [Downloads for v1.5.6](#downloads-for-v156) - - [Client Binaries](#client-binaries-25) - - [Server Binaries](#server-binaries-25) + - [Client Binaries](#client-binaries-26) + - [Server Binaries](#server-binaries-26) - [Changelog since v1.5.5](#changelog-since-v155) - - [Other notable changes](#other-notable-changes-28) + - [Other notable changes](#other-notable-changes-29) - [v1.6.0-rc.1](#v160-rc1) - [Downloads for v1.6.0-rc.1](#downloads-for-v160-rc1) - - [Client Binaries](#client-binaries-26) - - [Server Binaries](#server-binaries-26) + - [Client Binaries](#client-binaries-27) + - [Server Binaries](#server-binaries-27) - [Changelog since v1.6.0-beta.4](#changelog-since-v160-beta4) - - [Other notable changes](#other-notable-changes-29) + - [Other notable changes](#other-notable-changes-30) - [v1.5.5](#v155) - [Downloads for v1.5.5](#downloads-for-v155) - - [Client Binaries](#client-binaries-27) - - [Server Binaries](#server-binaries-27) + - [Client Binaries](#client-binaries-28) + - [Server Binaries](#server-binaries-28) - [Changelog since v1.5.4](#changelog-since-v154) - [v1.6.0-beta.4](#v160-beta4) - [Downloads for v1.6.0-beta.4](#downloads-for-v160-beta4) - - [Client Binaries](#client-binaries-28) - - [Server Binaries](#server-binaries-28) + - [Client Binaries](#client-binaries-29) + - [Server Binaries](#server-binaries-29) - [Changelog since v1.6.0-beta.3](#changelog-since-v160-beta3) - - [Other notable changes](#other-notable-changes-30) + - [Other notable changes](#other-notable-changes-31) - [v1.6.0-beta.3](#v160-beta3) - [Downloads for v1.6.0-beta.3](#downloads-for-v160-beta3) - - [Client Binaries](#client-binaries-29) - - [Server Binaries](#server-binaries-29) + - [Client Binaries](#client-binaries-30) + - [Server Binaries](#server-binaries-30) - [Changelog since v1.6.0-beta.2](#changelog-since-v160-beta2) - - [Other notable changes](#other-notable-changes-31) + - [Other notable changes](#other-notable-changes-32) - [v1.6.0-beta.2](#v160-beta2) - [Downloads for v1.6.0-beta.2](#downloads-for-v160-beta2) - - [Client Binaries](#client-binaries-30) - - [Server Binaries](#server-binaries-30) + - [Client Binaries](#client-binaries-31) + - [Server Binaries](#server-binaries-31) - [Changelog since v1.6.0-beta.1](#changelog-since-v160-beta1) - [Action Required](#action-required-10) - - [Other notable changes](#other-notable-changes-32) + - [Other notable changes](#other-notable-changes-33) - [v1.5.4](#v154) - [Downloads for v1.5.4](#downloads-for-v154) - - [Client Binaries](#client-binaries-31) - - [Server Binaries](#server-binaries-31) + - [Client Binaries](#client-binaries-32) + - [Server Binaries](#server-binaries-32) - [Changelog since v1.5.3](#changelog-since-v153) - - [Other notable changes](#other-notable-changes-33) + - [Other notable changes](#other-notable-changes-34) - [v1.6.0-beta.1](#v160-beta1) - [Downloads for v1.6.0-beta.1](#downloads-for-v160-beta1) - - [Client Binaries](#client-binaries-32) - - [Server Binaries](#server-binaries-32) + - [Client Binaries](#client-binaries-33) + - [Server Binaries](#server-binaries-33) - [Changelog since v1.6.0-alpha.3](#changelog-since-v160-alpha3) - [Action Required](#action-required-11) - - [Other notable changes](#other-notable-changes-34) + - [Other notable changes](#other-notable-changes-35) - [v1.6.0-alpha.3](#v160-alpha3) - [Downloads for v1.6.0-alpha.3](#downloads-for-v160-alpha3) - - [Client Binaries](#client-binaries-33) - - [Server Binaries](#server-binaries-33) + - [Client Binaries](#client-binaries-34) + - [Server Binaries](#server-binaries-34) - [Changelog since v1.6.0-alpha.2](#changelog-since-v160-alpha2) - - [Other notable changes](#other-notable-changes-35) + - [Other notable changes](#other-notable-changes-36) - [v1.4.9](#v149) - [Downloads for v1.4.9](#downloads-for-v149) - - [Client Binaries](#client-binaries-34) - - [Server Binaries](#server-binaries-34) + - [Client Binaries](#client-binaries-35) + - [Server Binaries](#server-binaries-35) - [Changelog since v1.4.8](#changelog-since-v148) - - [Other notable changes](#other-notable-changes-36) + - [Other notable changes](#other-notable-changes-37) - [v1.5.3](#v153) - [Downloads for v1.5.3](#downloads-for-v153) - - [Client Binaries](#client-binaries-35) - - [Server Binaries](#server-binaries-35) - - [Node Binaries](#node-binaries-20) + - [Client Binaries](#client-binaries-36) + - [Server Binaries](#server-binaries-36) + - [Node Binaries](#node-binaries-21) - [Changelog since v1.5.2](#changelog-since-v152) - - [Other notable changes](#other-notable-changes-37) + - [Other notable changes](#other-notable-changes-38) - [v1.6.0-alpha.2](#v160-alpha2) - [Downloads for v1.6.0-alpha.2](#downloads-for-v160-alpha2) - - [Client Binaries](#client-binaries-36) - - [Server Binaries](#server-binaries-36) + - [Client Binaries](#client-binaries-37) + - [Server Binaries](#server-binaries-37) - [Changelog since v1.6.0-alpha.1](#changelog-since-v160-alpha1) - - [Other notable changes](#other-notable-changes-38) + - [Other notable changes](#other-notable-changes-39) - [v1.6.0-alpha.1](#v160-alpha1) - [Downloads for v1.6.0-alpha.1](#downloads-for-v160-alpha1) - - [Client Binaries](#client-binaries-37) - - [Server Binaries](#server-binaries-37) + - [Client Binaries](#client-binaries-38) + - [Server Binaries](#server-binaries-38) - [Changelog since v1.5.0](#changelog-since-v150) - [Action Required](#action-required-12) - - [Other notable changes](#other-notable-changes-39) + - [Other notable changes](#other-notable-changes-40) - [v1.5.2](#v152) - [Downloads for v1.5.2](#downloads-for-v152) - - [Client Binaries](#client-binaries-38) - - [Server Binaries](#server-binaries-38) + - [Client Binaries](#client-binaries-39) + - [Server Binaries](#server-binaries-39) - [Changelog since v1.5.1](#changelog-since-v151) - - [Other notable changes](#other-notable-changes-40) + - [Other notable changes](#other-notable-changes-41) - [v1.4.8](#v148) - [Downloads for v1.4.8](#downloads-for-v148) - - [Client Binaries](#client-binaries-39) - - [Server Binaries](#server-binaries-39) + - [Client Binaries](#client-binaries-40) + - [Server Binaries](#server-binaries-40) - [Changelog since v1.4.7](#changelog-since-v147) - - [Other notable changes](#other-notable-changes-41) + - [Other notable changes](#other-notable-changes-42) - [v1.5.1](#v151) - [Downloads for v1.5.1](#downloads-for-v151) - - [Client Binaries](#client-binaries-40) - - [Server Binaries](#server-binaries-40) + - [Client Binaries](#client-binaries-41) + - [Server Binaries](#server-binaries-41) - [Changelog since v1.5.0](#changelog-since-v150-1) - - [Other notable changes](#other-notable-changes-42) + - [Other notable changes](#other-notable-changes-43) - [Known Issues for v1.5.1](#known-issues-for-v151) - [v1.5.0](#v150) - [Downloads for v1.5.0](#downloads-for-v150) - - [Client Binaries](#client-binaries-41) - - [Server Binaries](#server-binaries-41) + - [Client Binaries](#client-binaries-42) + - [Server Binaries](#server-binaries-42) - [Major Themes](#major-themes-1) - [Features](#features) - [Known Issues](#known-issues-1) @@ -481,103 +488,103 @@ - [Action Required Before Upgrading](#action-required-before-upgrading-1) - [External Dependency Version Information](#external-dependency-version-information-2) - [Changelog since v1.5.0-beta.3](#changelog-since-v150-beta3) - - [Other notable changes](#other-notable-changes-43) + - [Other notable changes](#other-notable-changes-44) - [Previous Releases Included in v1.5.0](#previous-releases-included-in-v150) - [v1.4.7](#v147) - [Downloads for v1.4.7](#downloads-for-v147) - - [Client Binaries](#client-binaries-42) - - [Server Binaries](#server-binaries-42) + - [Client Binaries](#client-binaries-43) + - [Server Binaries](#server-binaries-43) - [Changelog since v1.4.6](#changelog-since-v146) - - [Other notable changes](#other-notable-changes-44) + - [Other notable changes](#other-notable-changes-45) - [v1.5.0-beta.3](#v150-beta3) - [Downloads for v1.5.0-beta.3](#downloads-for-v150-beta3) - - [Client Binaries](#client-binaries-43) - - [Server Binaries](#server-binaries-43) + - [Client Binaries](#client-binaries-44) + - [Server Binaries](#server-binaries-44) - [Changelog since v1.5.0-beta.2](#changelog-since-v150-beta2) - - [Other notable changes](#other-notable-changes-45) + - [Other notable changes](#other-notable-changes-46) - [v1.5.0-beta.2](#v150-beta2) - [Downloads for v1.5.0-beta.2](#downloads-for-v150-beta2) - - [Client Binaries](#client-binaries-44) - - [Server Binaries](#server-binaries-44) + - [Client Binaries](#client-binaries-45) + - [Server Binaries](#server-binaries-45) - [Changelog since v1.5.0-beta.1](#changelog-since-v150-beta1) - - [Other notable changes](#other-notable-changes-46) + - [Other notable changes](#other-notable-changes-47) - [v1.5.0-beta.1](#v150-beta1) - [Downloads for v1.5.0-beta.1](#downloads-for-v150-beta1) - - [Client Binaries](#client-binaries-45) - - [Server Binaries](#server-binaries-45) + - [Client Binaries](#client-binaries-46) + - [Server Binaries](#server-binaries-46) - [Changelog since v1.5.0-alpha.2](#changelog-since-v150-alpha2) - [Action Required](#action-required-13) - - [Other notable changes](#other-notable-changes-47) + - [Other notable changes](#other-notable-changes-48) - [v1.4.6](#v146) - [Downloads for v1.4.6](#downloads-for-v146) - - [Client Binaries](#client-binaries-46) - - [Server Binaries](#server-binaries-46) + - [Client Binaries](#client-binaries-47) + - [Server Binaries](#server-binaries-47) - [Changelog since v1.4.5](#changelog-since-v145) - - [Other notable changes](#other-notable-changes-48) + - [Other notable changes](#other-notable-changes-49) - [v1.3.10](#v1310) - [Downloads for v1.3.10](#downloads-for-v1310) - - [Client Binaries](#client-binaries-47) - - [Server Binaries](#server-binaries-47) + - [Client Binaries](#client-binaries-48) + - [Server Binaries](#server-binaries-48) - [Changelog since v1.3.9](#changelog-since-v139) - - [Other notable changes](#other-notable-changes-49) + - [Other notable changes](#other-notable-changes-50) - [v1.4.5](#v145) - [Downloads for v1.4.5](#downloads-for-v145) - - [Client Binaries](#client-binaries-48) - - [Server Binaries](#server-binaries-48) + - [Client Binaries](#client-binaries-49) + - [Server Binaries](#server-binaries-49) - [Changelog since v1.4.4](#changelog-since-v144) - - [Other notable changes](#other-notable-changes-50) + - [Other notable changes](#other-notable-changes-51) - [v1.5.0-alpha.2](#v150-alpha2) - [Downloads for v1.5.0-alpha.2](#downloads-for-v150-alpha2) - - [Client Binaries](#client-binaries-49) - - [Server Binaries](#server-binaries-49) + - [Client Binaries](#client-binaries-50) + - [Server Binaries](#server-binaries-50) - [Changelog since v1.5.0-alpha.1](#changelog-since-v150-alpha1) - [Action Required](#action-required-14) - - [Other notable changes](#other-notable-changes-51) + - [Other notable changes](#other-notable-changes-52) - [v1.2.7](#v127) - [Downloads for v1.2.7](#downloads-for-v127) - - [Client Binaries](#client-binaries-50) - - [Server Binaries](#server-binaries-50) + - [Client Binaries](#client-binaries-51) + - [Server Binaries](#server-binaries-51) - [Changelog since v1.2.6](#changelog-since-v126) - - [Other notable changes](#other-notable-changes-52) + - [Other notable changes](#other-notable-changes-53) - [v1.4.4](#v144) - [Downloads for v1.4.4](#downloads-for-v144) - - [Client Binaries](#client-binaries-51) - - [Server Binaries](#server-binaries-51) + - [Client Binaries](#client-binaries-52) + - [Server Binaries](#server-binaries-52) - [Changelog since v1.4.3](#changelog-since-v143) - - [Other notable changes](#other-notable-changes-53) + - [Other notable changes](#other-notable-changes-54) - [v1.3.9](#v139) - [Downloads](#downloads) - [Changelog since v1.3.8](#changelog-since-v138) - - [Other notable changes](#other-notable-changes-54) + - [Other notable changes](#other-notable-changes-55) - [v1.4.3](#v143) - [Downloads](#downloads-1) - [Changelog since v1.4.2-beta.1](#changelog-since-v142-beta1) - - [Other notable changes](#other-notable-changes-55) + - [Other notable changes](#other-notable-changes-56) - [v1.4.2](#v142) - [Downloads](#downloads-2) - [Changelog since v1.4.2-beta.1](#changelog-since-v142-beta1-1) - - [Other notable changes](#other-notable-changes-56) + - [Other notable changes](#other-notable-changes-57) - [v1.5.0-alpha.1](#v150-alpha1) - [Downloads](#downloads-3) - [Changelog since v1.4.0-alpha.3](#changelog-since-v140-alpha3) - [Experimental Features](#experimental-features) - [Action Required](#action-required-15) - - [Other notable changes](#other-notable-changes-57) + - [Other notable changes](#other-notable-changes-58) - [v1.4.2-beta.1](#v142-beta1) - [Downloads](#downloads-4) - [Changelog since v1.4.1](#changelog-since-v141) - - [Other notable changes](#other-notable-changes-58) + - [Other notable changes](#other-notable-changes-59) - [v1.4.1](#v141) - [Downloads](#downloads-5) - [Changelog since v1.4.1-beta.2](#changelog-since-v141-beta2) - [v1.4.1-beta.2](#v141-beta2) - [Downloads](#downloads-6) - [Changelog since v1.4.0](#changelog-since-v140) - - [Other notable changes](#other-notable-changes-59) + - [Other notable changes](#other-notable-changes-60) - [v1.3.8](#v138) - [Downloads](#downloads-7) - [Changelog since v1.3.7](#changelog-since-v137) - - [Other notable changes](#other-notable-changes-60) + - [Other notable changes](#other-notable-changes-61) - [v1.4.0](#v140) - [Downloads](#downloads-8) - [Major Themes](#major-themes-2) @@ -597,26 +604,26 @@ - [v1.4.0-beta.10](#v140-beta10) - [Downloads](#downloads-10) - [Changelog since v1.4.0-beta.8](#changelog-since-v140-beta8) - - [Other notable changes](#other-notable-changes-61) + - [Other notable changes](#other-notable-changes-62) - [v1.4.0-beta.8](#v140-beta8) - [Downloads](#downloads-11) - [Changelog since v1.4.0-beta.7](#changelog-since-v140-beta7) - [v1.4.0-beta.7](#v140-beta7) - [Downloads](#downloads-12) - [Changelog since v1.4.0-beta.6](#changelog-since-v140-beta6) - - [Other notable changes](#other-notable-changes-62) + - [Other notable changes](#other-notable-changes-63) - [v1.4.0-beta.6](#v140-beta6) - [Downloads](#downloads-13) - [Changelog since v1.4.0-beta.5](#changelog-since-v140-beta5) - - [Other notable changes](#other-notable-changes-63) + - [Other notable changes](#other-notable-changes-64) - [v1.4.0-beta.5](#v140-beta5) - [Downloads](#downloads-14) - [Changelog since v1.4.0-beta.3](#changelog-since-v140-beta3) - - [Other notable changes](#other-notable-changes-64) + - [Other notable changes](#other-notable-changes-65) - [v1.3.7](#v137) - [Downloads](#downloads-15) - [Changelog since v1.3.6](#changelog-since-v136) - - [Other notable changes](#other-notable-changes-65) + - [Other notable changes](#other-notable-changes-66) - [v1.4.0-beta.3](#v140-beta3) - [Downloads](#downloads-16) - [Changelog since v1.4.0-beta.2](#changelog-since-v140-beta2) @@ -627,57 +634,57 @@ - [v1.4.0-beta.2](#v140-beta2) - [Downloads](#downloads-17) - [Changelog since v1.4.0-beta.1](#changelog-since-v140-beta1) - - [Other notable changes](#other-notable-changes-66) + - [Other notable changes](#other-notable-changes-67) - [v1.4.0-beta.1](#v140-beta1) - [Downloads](#downloads-18) - [Changelog since v1.4.0-alpha.3](#changelog-since-v140-alpha3-1) - [Action Required](#action-required-16) - - [Other notable changes](#other-notable-changes-67) + - [Other notable changes](#other-notable-changes-68) - [v1.3.6](#v136) - [Downloads](#downloads-19) - [Changelog since v1.3.5](#changelog-since-v135) - - [Other notable changes](#other-notable-changes-68) + - [Other notable changes](#other-notable-changes-69) - [v1.4.0-alpha.3](#v140-alpha3) - [Downloads](#downloads-20) - [Changelog since v1.4.0-alpha.2](#changelog-since-v140-alpha2) - [Action Required](#action-required-17) - - [Other notable changes](#other-notable-changes-69) + - [Other notable changes](#other-notable-changes-70) - [v1.3.5](#v135) - [Downloads](#downloads-21) - [Changelog since v1.3.4](#changelog-since-v134) - - [Other notable changes](#other-notable-changes-70) + - [Other notable changes](#other-notable-changes-71) - [v1.3.4](#v134) - [Downloads](#downloads-22) - [Changelog since v1.3.3](#changelog-since-v133) - - [Other notable changes](#other-notable-changes-71) + - [Other notable changes](#other-notable-changes-72) - [v1.4.0-alpha.2](#v140-alpha2) - [Downloads](#downloads-23) - [Changelog since v1.4.0-alpha.1](#changelog-since-v140-alpha1) - [Action Required](#action-required-18) - - [Other notable changes](#other-notable-changes-72) + - [Other notable changes](#other-notable-changes-73) - [v1.3.3](#v133) - [Downloads](#downloads-24) - [Changelog since v1.3.2](#changelog-since-v132) - - [Other notable changes](#other-notable-changes-73) + - [Other notable changes](#other-notable-changes-74) - [Known Issues](#known-issues-3) - [v1.3.2](#v132) - [Downloads](#downloads-25) - [Changelog since v1.3.1](#changelog-since-v131) - - [Other notable changes](#other-notable-changes-74) + - [Other notable changes](#other-notable-changes-75) - [v1.3.1](#v131) - [Downloads](#downloads-26) - [Changelog since v1.3.0](#changelog-since-v130) - - [Other notable changes](#other-notable-changes-75) + - [Other notable changes](#other-notable-changes-76) - [v1.2.6](#v126) - [Downloads](#downloads-27) - [Changelog since v1.2.5](#changelog-since-v125) - - [Other notable changes](#other-notable-changes-76) + - [Other notable changes](#other-notable-changes-77) - [v1.4.0-alpha.1](#v140-alpha1) - [Downloads](#downloads-28) - [Changelog since v1.3.0](#changelog-since-v130-1) - [Experimental Features](#experimental-features-1) - [Action Required](#action-required-19) - - [Other notable changes](#other-notable-changes-77) + - [Other notable changes](#other-notable-changes-78) - [v1.3.0](#v130) - [Downloads](#downloads-29) - [Highlights](#highlights) @@ -693,62 +700,62 @@ - [Downloads](#downloads-30) - [Changelog since v1.3.0-beta.2](#changelog-since-v130-beta2) - [Action Required](#action-required-20) - - [Other notable changes](#other-notable-changes-78) + - [Other notable changes](#other-notable-changes-79) - [v1.2.5](#v125) - [Downloads](#downloads-31) - [Changes since v1.2.4](#changes-since-v124) - - [Other notable changes](#other-notable-changes-79) + - [Other notable changes](#other-notable-changes-80) - [v1.3.0-beta.2](#v130-beta2) - [Downloads](#downloads-32) - [Changes since v1.3.0-beta.1](#changes-since-v130-beta1) - [Experimental Features](#experimental-features-2) - - [Other notable changes](#other-notable-changes-80) + - [Other notable changes](#other-notable-changes-81) - [v1.3.0-beta.1](#v130-beta1) - [Downloads](#downloads-33) - [Changes since v1.3.0-alpha.5](#changes-since-v130-alpha5) - [Action Required](#action-required-21) - - [Other notable changes](#other-notable-changes-81) + - [Other notable changes](#other-notable-changes-82) - [v1.3.0-alpha.5](#v130-alpha5) - [Downloads](#downloads-34) - [Changes since v1.3.0-alpha.4](#changes-since-v130-alpha4) - [Action Required](#action-required-22) - - [Other notable changes](#other-notable-changes-82) + - [Other notable changes](#other-notable-changes-83) - [v1.3.0-alpha.4](#v130-alpha4) - [Downloads](#downloads-35) - [Changes since v1.3.0-alpha.3](#changes-since-v130-alpha3) - [Action Required](#action-required-23) - - [Other notable changes](#other-notable-changes-83) + - [Other notable changes](#other-notable-changes-84) - [v1.2.4](#v124) - [Downloads](#downloads-36) - [Changes since v1.2.3](#changes-since-v123) - - [Other notable changes](#other-notable-changes-84) + - [Other notable changes](#other-notable-changes-85) - [v1.3.0-alpha.3](#v130-alpha3) - [Downloads](#downloads-37) - [Changes since v1.3.0-alpha.2](#changes-since-v130-alpha2) - [Action Required](#action-required-24) - - [Other notable changes](#other-notable-changes-85) + - [Other notable changes](#other-notable-changes-86) - [v1.2.3](#v123) - [Downloads](#downloads-38) - [Changes since v1.2.2](#changes-since-v122) - [Action Required](#action-required-25) - - [Other notable changes](#other-notable-changes-86) + - [Other notable changes](#other-notable-changes-87) - [v1.3.0-alpha.2](#v130-alpha2) - [Downloads](#downloads-39) - [Changes since v1.3.0-alpha.1](#changes-since-v130-alpha1) - - [Other notable changes](#other-notable-changes-87) + - [Other notable changes](#other-notable-changes-88) - [v1.2.2](#v122) - [Downloads](#downloads-40) - [Changes since v1.2.1](#changes-since-v121) - - [Other notable changes](#other-notable-changes-88) + - [Other notable changes](#other-notable-changes-89) - [v1.2.1](#v121) - [Downloads](#downloads-41) - [Changes since v1.2.0](#changes-since-v120) - - [Other notable changes](#other-notable-changes-89) + - [Other notable changes](#other-notable-changes-90) - [v1.3.0-alpha.1](#v130-alpha1) - [Downloads](#downloads-42) - [Changes since v1.2.0](#changes-since-v120-1) - [Action Required](#action-required-26) - - [Other notable changes](#other-notable-changes-90) + - [Other notable changes](#other-notable-changes-91) - [v1.2.0](#v120) - [Downloads](#downloads-43) - [Changes since v1.1.1](#changes-since-v111) @@ -768,6 +775,65 @@ +# v1.6.9 + +[Documentation](https://docs.k8s.io) & [Examples](https://releases.k8s.io/release-1.6/examples) + +## Downloads for v1.6.9 + + +filename | sha256 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes.tar.gz) | `08be94c252e7fbdd7c14811ec021818e687c1259e557b70db10aac64c0e8e4b2` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-src.tar.gz) | `519501e26afc341b236c5b46602f010a33fc190e3d1bfb7802969b2e979faaeb` + +### Client Binaries + +filename | sha256 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-darwin-386.tar.gz) | `864f2307dd22c055063d1a55354596754a94d03f023e7278c24d5978bba00b3e` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-darwin-amd64.tar.gz) | `0a107e0a1d7e6865ddd9241f1e8357405f476889a6f1a16989ba01f6cffd3be7` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-linux-386.tar.gz) | `b20599e266248e7e176383e0318acd855c1aad8014396cc4018adde11a33d0c8` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-linux-amd64.tar.gz) | `0690a8c9858f91cc000b3acd602799bf2320756b7471e463df2e3a36fbdde886` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-linux-arm64.tar.gz) | `354897ffc6382b8eb27f434d8e7aa3cbfae4b819da3160a43db8ccb8cae1275b` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-linux-arm.tar.gz) | `6897408bf8d65d1281555c21ae978a4ccd69482a7ad2549bcec381416e312d7a` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-linux-ppc64le.tar.gz) | `2afae0c211eb415829446f90a0bf9d48b9f8311ac4566fa74a08415ed9a31e75` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-linux-s390x.tar.gz) | `abde354528cc9c8ced49bb767ffcd8bfae47a0b4b5501502f560cf663a0c4a05` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-windows-386.tar.gz) | `83083c0d78e9468c7be395282a4697d2c703d3310593e7b70cd09fa9e7791d80` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-client-windows-amd64.tar.gz) | `3471db3463d60d22d82edb34fbe3ca301cc583ebddffc2664569255302e7d304` + +### Server Binaries + +filename | sha256 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-server-linux-amd64.tar.gz) | `598e49c8a22e4e8db1e1c0ed9d8955c991425cd4e06c072ac36fd5ed693b1c61` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-server-linux-arm64.tar.gz) | `5ce75f57636d537b4bf3ca00c4a1322e9c1aaf273bd945304333b558af3c081b` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-server-linux-arm.tar.gz) | `afea9780049c5e6548f64973bd8679aae60672ab05027f8c36784ccf2a83a1b2` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-server-linux-ppc64le.tar.gz) | `cd131b3e39e4160cd9920fe2635b4f6da4679cce12cb2483cfe28197e366bceb` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-server-linux-s390x.tar.gz) | `93ee43f33cbe061ac088acf62099be1abd0d9c0b4a8a79be4069904c3780c76d` + +### Node Binaries + +filename | sha256 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-node-linux-amd64.tar.gz) | `f8f13233b168c4833af685817f9591c73658d1377ceb9d550cbea929c6e27c2e` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-node-linux-arm64.tar.gz) | `1ed434f9e6469c8cc7a3bb15404e918cf242ef92ef075e7cf479b7e951269b5c` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-node-linux-arm.tar.gz) | `3fd8e089184f83bd9ed2cf5f193253e1f7b9b853876a08a2babf91647d6d0ac8` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-node-linux-ppc64le.tar.gz) | `9673547a32f83498bb28f02212d419b28cc50a0a4d7b866396994b5ea9313e79` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-node-linux-s390x.tar.gz) | `80044cdeb4260e807660c166ed15bb2a9db03d59d8c186b1d4f9a53841cea327` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.6.9/kubernetes-node-windows-amd64.tar.gz) | `b1dd678ee2974dc83ea7cfe8516557c9360ed55e40cad1b68803b71786f8d16f` + +## Changelog since v1.6.8 + +### Other notable changes + +* StatefulSet: Set hostname/subdomain fields on new Pods in addition to the deprecated annotations, to allow mitigation of Pod DNS issues upon upgrading to Kubernetes v1.7.x. ([#50942](https://github.com/kubernetes/kubernetes/pull/50942), [@enisoc](https://github.com/enisoc)) +* Azure: Allow VNet to be in a separate Resource Group. ([#49725](https://github.com/kubernetes/kubernetes/pull/49725), [@sylr](https://github.com/sylr)) +* In GCE, add measures to prevent corruption of known_tokens.csv. ([#49897](https://github.com/kubernetes/kubernetes/pull/49897), [@mikedanese](https://github.com/mikedanese)) +* Fixed a bug in the API server watch cache, which could cause a missing watch event immediately after cache initialization. ([#49992](https://github.com/kubernetes/kubernetes/pull/49992), [@liggitt](https://github.com/liggitt)) + + + # v1.7.4 [Documentation](https://docs.k8s.io) & [Examples](https://releases.k8s.io/release-1.7/examples) From 15c54ffa7750c3037f464933c2b678a9a94cea82 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 23 Aug 2017 11:06:29 -0400 Subject: [PATCH 255/403] Add an OrDie version for AddPostStartHook Simplifies usage and consolidate the error message so it is always the same everywhere. Signed-off-by: Simo Sorce --- pkg/master/master.go | 12 +++--------- staging/src/k8s.io/apiserver/pkg/server/hooks.go | 7 +++++++ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pkg/master/master.go b/pkg/master/master.go index 97c5c5357bf80..d6f7130a07685 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -278,9 +278,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) m.installTunneler(c.Tunneler, corev1client.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig).Nodes()) } - if err := m.GenericAPIServer.AddPostStartHook("ca-registration", c.ClientCARegistrationHook.PostStartHook); err != nil { - glog.Fatalf("Error registering PostStartHook %q: %v", "ca-registration", err) - } + m.GenericAPIServer.AddPostStartHookOrDie("ca-registration", c.ClientCARegistrationHook.PostStartHook) return m, nil } @@ -294,9 +292,7 @@ func (m *Master) InstallLegacyAPI(c *Config, restOptionsGetter generic.RESTOptio if c.EnableCoreControllers { coreClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) bootstrapController := c.NewBootstrapController(legacyRESTStorage, coreClient, coreClient) - if err := m.GenericAPIServer.AddPostStartHook("bootstrap-controller", bootstrapController.PostStartHook); err != nil { - glog.Fatalf("Error registering PostStartHook %q: %v", "bootstrap-controller", err) - } + m.GenericAPIServer.AddPostStartHookOrDie("bootstrap-controller", bootstrapController.PostStartHook) } if err := m.GenericAPIServer.InstallLegacyAPIGroup(genericapiserver.DefaultLegacyAPIPrefix, &apiGroupInfo); err != nil { @@ -341,9 +337,7 @@ func (m *Master) InstallAPIs(apiResourceConfigSource serverstorage.APIResourceCo if err != nil { glog.Fatalf("Error building PostStartHook: %v", err) } - if err := m.GenericAPIServer.AddPostStartHook(name, hook); err != nil { - glog.Fatalf("Error registering PostStartHook %q: %v", name, err) - } + m.GenericAPIServer.AddPostStartHookOrDie(name, hook) } apiGroupsInfo = append(apiGroupsInfo, apiGroupInfo) diff --git a/staging/src/k8s.io/apiserver/pkg/server/hooks.go b/staging/src/k8s.io/apiserver/pkg/server/hooks.go index 5fbae16ae7d21..a190f5622022d 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/hooks.go +++ b/staging/src/k8s.io/apiserver/pkg/server/hooks.go @@ -90,6 +90,13 @@ func (s *GenericAPIServer) AddPostStartHook(name string, hook PostStartHookFunc) return nil } +// AddPostStartHookOrDie allows you to add a PostStartHook, but dies on failure +func (s *GenericAPIServer) AddPostStartHookOrDie(name string, hook PostStartHookFunc) { + if err := s.AddPostStartHook(name, hook); err != nil { + glog.Fatalf("Error registering PostStartHook %q: %v", name, err) + } +} + // RunPostStartHooks runs the PostStartHooks for the server func (s *GenericAPIServer) RunPostStartHooks(stopCh <-chan struct{}) { s.postStartHookLock.Lock() From 671cd2bc6b80d180030d9c2c37b1872a49bd617c Mon Sep 17 00:00:00 2001 From: Jeff Grafton Date: Wed, 23 Aug 2017 13:11:03 -0700 Subject: [PATCH 256/403] Bump repo-infra dependency to fix go_genrule without sandboxing --- build/root/WORKSPACE | 6 +++--- hack/update-bazel.sh | 2 +- hack/verify-bazel.sh | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/root/WORKSPACE b/build/root/WORKSPACE index 28e0eaf247ef2..f92e09ddedd65 100644 --- a/build/root/WORKSPACE +++ b/build/root/WORKSPACE @@ -7,9 +7,9 @@ http_archive( http_archive( name = "io_kubernetes_build", - sha256 = "2b2cb64b2fd7734c5eb2b79b79fa35d064fcf53b92cb3aaec5b90fc10fc94135", - strip_prefix = "repo-infra-9ba3a24eeffafa3a794b9e7312103424e7da26e9", - urls = ["https://github.com/kubernetes/repo-infra/archive/9ba3a24eeffafa3a794b9e7312103424e7da26e9.tar.gz"], + sha256 = "5da78568ffb9a323410c701618c23da8c93f4bf4aea76eee41ac244dbd8c8f95", + strip_prefix = "repo-infra-4eaf9e671bbb549fb4ec292cf251f921d7ef80ac", + urls = ["https://github.com/kubernetes/repo-infra/archive/4eaf9e671bbb549fb4ec292cf251f921d7ef80ac.tar.gz"], ) ETCD_VERSION = "3.0.17" diff --git a/hack/update-bazel.sh b/hack/update-bazel.sh index b0f8d3e21d9e0..af46f0515b323 100755 --- a/hack/update-bazel.sh +++ b/hack/update-bazel.sh @@ -25,7 +25,7 @@ source "${KUBE_ROOT}/hack/lib/init.sh" rm -f "${KUBE_ROOT}/pkg/generated/openapi/zz_generated.openapi.go" # The git commit sha1s here should match the values in $KUBE_ROOT/WORKSPACE. -kube::util::go_install_from_commit github.com/kubernetes/repo-infra/kazel 9ba3a24eeffafa3a794b9e7312103424e7da26e9 +kube::util::go_install_from_commit github.com/kubernetes/repo-infra/kazel 4eaf9e671bbb549fb4ec292cf251f921d7ef80ac kube::util::go_install_from_commit github.com/bazelbuild/rules_go/go/tools/gazelle/gazelle 82483596ec203eb9c1849937636f4cbed83733eb gazelle fix -build_file_name=BUILD,BUILD.bazel -external=vendored -mode=fix -repo_root="$(kube::realpath ${KUBE_ROOT})" diff --git a/hack/verify-bazel.sh b/hack/verify-bazel.sh index 87c3eacdb6d36..ff70559e39e4c 100755 --- a/hack/verify-bazel.sh +++ b/hack/verify-bazel.sh @@ -25,7 +25,7 @@ source "${KUBE_ROOT}/hack/lib/init.sh" rm -f "${KUBE_ROOT}/pkg/generated/openapi/zz_generated.openapi.go" # The git commit sha1s here should match the values in $KUBE_ROOT/WORKSPACE. -kube::util::go_install_from_commit github.com/kubernetes/repo-infra/kazel 9ba3a24eeffafa3a794b9e7312103424e7da26e9 +kube::util::go_install_from_commit github.com/kubernetes/repo-infra/kazel 4eaf9e671bbb549fb4ec292cf251f921d7ef80ac kube::util::go_install_from_commit github.com/bazelbuild/rules_go/go/tools/gazelle/gazelle 82483596ec203eb9c1849937636f4cbed83733eb gazelle_diff=$(gazelle fix -build_file_name=BUILD,BUILD.bazel -external=vendored -mode=diff -repo_root="$(kube::realpath ${KUBE_ROOT})") From 5ef3516780fe26f53eb2b25260b3cc1bb6c55a13 Mon Sep 17 00:00:00 2001 From: Antoine Pelisse Date: Wed, 23 Aug 2017 14:11:16 -0700 Subject: [PATCH 257/403] openapi: Change reference to be first-class References in the openapi are currently completely hidden from the model, and just passed through as we walk the tree. The problem is that they can have a different description and more importantly, different extensions. Change them to be first-class citizen, and fully part of the model. It means that visitors have to implement one more function and decide if something specific should be done with references. Validation is updated to just completely ignore them and passthrough (like it was done before). --- pkg/kubectl/cmd/util/openapi/document.go | 40 +++++++------------ pkg/kubectl/cmd/util/openapi/openapi.go | 10 +++++ pkg/kubectl/cmd/util/openapi/openapi_test.go | 34 ++++++++-------- .../cmd/util/openapi/validation/types.go | 15 +++++++ 4 files changed, 57 insertions(+), 42 deletions(-) diff --git a/pkg/kubectl/cmd/util/openapi/document.go b/pkg/kubectl/cmd/util/openapi/document.go index 23e83b3dda175..6b2f6782b948d 100644 --- a/pkg/kubectl/cmd/util/openapi/document.go +++ b/pkg/kubectl/cmd/util/openapi/document.go @@ -164,8 +164,9 @@ func (d *Definitions) parseReference(s *openapi_v2.Schema, path *Path) (Schema, if _, ok := d.models[reference]; !ok { return nil, newSchemaError(path, "unknown model in reference: %q", reference) } - return &Reference{ - Reference: reference, + return &Ref{ + BaseSchema: d.parseBaseSchema(s, path), + reference: reference, definitions: d, }, nil } @@ -303,38 +304,27 @@ func (d *Definitions) LookupResource(gvk schema.GroupVersionKind) Schema { return model } -// SchemaReference doesn't match a specific type. It's mostly a -// pass-through type. -type Reference struct { - Reference string +type Ref struct { + BaseSchema + reference string definitions *Definitions } -var _ Schema = &Reference{} +var _ Reference = &Ref{} -func (r *Reference) GetSubSchema() Schema { - return r.definitions.models[r.Reference] +func (r *Ref) Reference() string { + return r.reference } -func (r *Reference) Accept(s SchemaVisitor) { - r.GetSubSchema().Accept(s) +func (r *Ref) SubSchema() Schema { + return r.definitions.models[r.reference] } -func (r *Reference) GetDescription() string { - return r.GetSubSchema().GetDescription() +func (r *Ref) Accept(v SchemaVisitor) { + v.VisitReference(r) } -func (r *Reference) GetExtensions() map[string]interface{} { - return r.GetSubSchema().GetExtensions() -} - -func (*Reference) GetPath() *Path { - // Reference never has a path, because it can be referenced from - // multiple locations. - return &Path{} -} - -func (r *Reference) GetName() string { - return r.Reference +func (r *Ref) GetName() string { + return fmt.Sprintf("Reference to %q", r.reference) } diff --git a/pkg/kubectl/cmd/util/openapi/openapi.go b/pkg/kubectl/cmd/util/openapi/openapi.go index 81f1f0eae5bd3..8e6cf0639f44f 100644 --- a/pkg/kubectl/cmd/util/openapi/openapi.go +++ b/pkg/kubectl/cmd/util/openapi/openapi.go @@ -49,11 +49,13 @@ type Resources interface { // - Map is a map of string to one and only one given subtype // - Primitive can be string, integer, number and boolean. // - Kind is an object with specific fields mapping to specific types. +// - Reference is a link to another definition. type SchemaVisitor interface { VisitArray(*Array) VisitMap(*Map) VisitPrimitive(*Primitive) VisitKind(*Kind) + VisitReference(Reference) } // Schema is the base definition of an openapi type. @@ -219,3 +221,11 @@ func (p *Primitive) GetName() string { } return fmt.Sprintf("%s (%s)", p.Type, p.Format) } + +// Reference implementation depends on the type of document. +type Reference interface { + Schema + + Reference() string + SubSchema() Schema +} diff --git a/pkg/kubectl/cmd/util/openapi/openapi_test.go b/pkg/kubectl/cmd/util/openapi/openapi_test.go index e2eb2fa0c0dc4..93736c93ca796 100644 --- a/pkg/kubectl/cmd/util/openapi/openapi_test.go +++ b/pkg/kubectl/cmd/util/openapi/openapi_test.go @@ -78,20 +78,20 @@ var _ = Describe("Reading apps/v1beta1/Deployment from openAPIData", func() { It("should have a metadata key of type Reference", func() { Expect(deployment.Fields).To(HaveKey("metadata")) - key := deployment.Fields["metadata"].(*openapi.Reference) + key := deployment.Fields["metadata"].(openapi.Reference) Expect(key).ToNot(BeNil()) - Expect(key.Reference).To(Equal("io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta")) - subSchema := key.GetSubSchema().(*openapi.Kind) + Expect(key.Reference()).To(Equal("io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta")) + subSchema := key.SubSchema().(*openapi.Kind) Expect(subSchema).ToNot(BeNil()) }) var status *openapi.Kind It("should have a status key of type Reference", func() { Expect(deployment.Fields).To(HaveKey("status")) - key := deployment.Fields["status"].(*openapi.Reference) + key := deployment.Fields["status"].(openapi.Reference) Expect(key).ToNot(BeNil()) - Expect(key.Reference).To(Equal("io.k8s.api.apps.v1beta1.DeploymentStatus")) - status = key.GetSubSchema().(*openapi.Kind) + Expect(key.Reference()).To(Equal("io.k8s.api.apps.v1beta1.DeploymentStatus")) + status = key.SubSchema().(*openapi.Kind) Expect(status).ToNot(BeNil()) }) @@ -106,22 +106,22 @@ var _ = Describe("Reading apps/v1beta1/Deployment from openAPIData", func() { Expect(status.Fields).To(HaveKey("conditions")) conditions := status.Fields["conditions"].(*openapi.Array) Expect(conditions).ToNot(BeNil()) - Expect(conditions.GetName()).To(Equal("Array of io.k8s.api.apps.v1beta1.DeploymentCondition")) + Expect(conditions.GetName()).To(Equal(`Array of Reference to "io.k8s.api.apps.v1beta1.DeploymentCondition"`)) Expect(conditions.GetExtensions()).To(Equal(map[string]interface{}{ "x-kubernetes-patch-merge-key": "type", "x-kubernetes-patch-strategy": "merge", })) - condition := conditions.SubType.(*openapi.Reference) - Expect(condition.Reference).To(Equal("io.k8s.api.apps.v1beta1.DeploymentCondition")) + condition := conditions.SubType.(openapi.Reference) + Expect(condition.Reference()).To(Equal("io.k8s.api.apps.v1beta1.DeploymentCondition")) }) var spec *openapi.Kind It("should have a spec key of type Reference", func() { Expect(deployment.Fields).To(HaveKey("spec")) - key := deployment.Fields["spec"].(*openapi.Reference) + key := deployment.Fields["spec"].(openapi.Reference) Expect(key).ToNot(BeNil()) - Expect(key.Reference).To(Equal("io.k8s.api.apps.v1beta1.DeploymentSpec")) - spec = key.GetSubSchema().(*openapi.Kind) + Expect(key.Reference()).To(Equal("io.k8s.api.apps.v1beta1.DeploymentSpec")) + spec = key.SubSchema().(*openapi.Kind) Expect(spec).ToNot(BeNil()) }) @@ -132,9 +132,9 @@ var _ = Describe("Reading apps/v1beta1/Deployment from openAPIData", func() { It("should have a spec with a PodTemplateSpec sub-field", func() { Expect(spec.Fields).To(HaveKey("template")) - key := spec.Fields["template"].(*openapi.Reference) + key := spec.Fields["template"].(openapi.Reference) Expect(key).ToNot(BeNil()) - Expect(key.Reference).To(Equal("io.k8s.api.core.v1.PodTemplateSpec")) + Expect(key.Reference()).To(Equal("io.k8s.api.core.v1.PodTemplateSpec")) }) }) @@ -164,10 +164,10 @@ var _ = Describe("Reading authorization.k8s.io/v1/SubjectAccessReview from openA sar := schema.(*openapi.Kind) Expect(sar).ToNot(BeNil()) Expect(sar.Fields).To(HaveKey("spec")) - specRef := sar.Fields["spec"].(*openapi.Reference) + specRef := sar.Fields["spec"].(openapi.Reference) Expect(specRef).ToNot(BeNil()) - Expect(specRef.Reference).To(Equal("io.k8s.api.authorization.v1.SubjectAccessReviewSpec")) - sarspec = specRef.GetSubSchema().(*openapi.Kind) + Expect(specRef.Reference()).To(Equal("io.k8s.api.authorization.v1.SubjectAccessReviewSpec")) + sarspec = specRef.SubSchema().(*openapi.Kind) Expect(sarspec).ToNot(BeNil()) }) diff --git a/pkg/kubectl/cmd/util/openapi/validation/types.go b/pkg/kubectl/cmd/util/openapi/validation/types.go index 335444c6c2466..2c16c2b16fc3f 100644 --- a/pkg/kubectl/cmd/util/openapi/validation/types.go +++ b/pkg/kubectl/cmd/util/openapi/validation/types.go @@ -127,6 +127,11 @@ func (item *mapItem) VisitKind(schema *openapi.Kind) { } } +func (item *mapItem) VisitReference(schema openapi.Reference) { + // passthrough + schema.SubSchema().Accept(item) +} + // arrayItem represents a yaml array. type arrayItem struct { baseItem @@ -165,6 +170,11 @@ func (item *arrayItem) VisitKind(schema *openapi.Kind) { item.AddValidationError(InvalidTypeError{Path: schema.GetPath().String(), Expected: "array", Actual: "map"}) } +func (item *arrayItem) VisitReference(schema openapi.Reference) { + // passthrough + schema.SubSchema().Accept(item) +} + // primitiveItem represents a yaml value. type primitiveItem struct { baseItem @@ -216,6 +226,11 @@ func (item *primitiveItem) VisitKind(schema *openapi.Kind) { item.AddValidationError(InvalidTypeError{Path: schema.GetPath().String(), Expected: "map", Actual: item.Kind}) } +func (item *primitiveItem) VisitReference(schema openapi.Reference) { + // passthrough + schema.SubSchema().Accept(item) +} + // itemFactory creates the relevant item type/visitor based on the current yaml type. func itemFactory(path openapi.Path, v interface{}) (ValidationItem, error) { // We need to special case for no-type fields in yaml (e.g. empty item in list) From d5dcec5218da77b59e36a9a6aee05ff510dd6d91 Mon Sep 17 00:00:00 2001 From: Garrett Rodrigues Date: Wed, 23 Aug 2017 13:25:26 -0700 Subject: [PATCH 258/403] add sig leads to owners-aliases --- OWNERS_ALIASES | 74 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES index da659c46833c9..8f2e6304d9bb4 100644 --- a/OWNERS_ALIASES +++ b/OWNERS_ALIASES @@ -100,5 +100,77 @@ aliases: sig-apps-api-approvers: - erictune - smarterclayton - sig-leads: + milestone-maintainers: + - lavalamp + - deads2k + - michelleN + - mattfarina + - prydonius + - bgrant0607 + - jdumars + - ericchiang + - liggitt + - deads2k + - mwielgus + - directxman12 + - justinsb + - kris-nova + - chrislovecnm + - mfburnett + - slack + - colemickens + - foxish + - fabianofranz + - pwittrock + - AdoHe + - lukemarsden + - jbeda + - roberthbailey + - zehicle + - jdumars + - grodrigues3 + - Phillels + - devin-donnelly + - jaredbhatti + - csbell + - quinton-hoole + - piosz + - fabxc + - thockin + - dcbw + - caseydavenport + - dchen1107 + - derekwaynecarr + - zen + - marcoceppi + - dghubble + - idvoretskyi + - xsgordon + - apsinha + - idvoretskyi + - calebamiles + - pwittrock + - calebamiles + - wojtek-t + - countspongebob + - jbeda + - davidopp + - timothysc + - pmorie + - arschles + - vaikas-google + - duglin + - saad-ali + - childsb - spiffxp + - fejta + - timothysc + - danielromlein + - floreks + - michmike + - abgworrall + - krzyzacy + - steveperry-53 + - radhikpac + - jpbetz + From ce3fad326f4698bccdf25d5938b207373bb7da0b Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Wed, 23 Aug 2017 14:06:51 -0700 Subject: [PATCH 259/403] StatefulSet: Deflake e2e "restart" phase. The test used to scale the StatefulSet down to 0, wait for ListPods to return 0 matching Pods, and then scale the StatefulSet back up. This was prone to a race in which StatefulSet was told to scale back up before it had observed its own deletion of the last Pod, as evidenced by logs showing the creation of Pod ss-1 prior to the creation of the replacement Pod ss-0. We now wait for the controller to observe all deletions before scaling it back up. This should fix flakes of the form: ``` Too many pods scheduled, expected 1 got 2 ``` --- test/e2e/apps/statefulset.go | 2 +- test/e2e/framework/statefulset_utils.go | 31 ++++++++++++++++--------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/test/e2e/apps/statefulset.go b/test/e2e/apps/statefulset.go index 6a0ed6e1f22cb..416f5a9cef125 100644 --- a/test/e2e/apps/statefulset.go +++ b/test/e2e/apps/statefulset.go @@ -757,7 +757,7 @@ var _ = SIGDescribe("StatefulSet", func() { By("Scaling down stateful set " + ssName + " to 0 replicas and waiting until none of pods will run in namespace" + ns) sst.RestoreHttpProbe(ss) sst.Scale(ss, 0) - sst.WaitForStatusReadyReplicas(ss, 0) + sst.WaitForStatusReplicas(ss, 0) }) It("Should recreate evicted statefulset", func() { diff --git a/test/e2e/framework/statefulset_utils.go b/test/e2e/framework/statefulset_utils.go index 1ba660243079d..413e245f23b60 100644 --- a/test/e2e/framework/statefulset_utils.go +++ b/test/e2e/framework/statefulset_utils.go @@ -197,10 +197,12 @@ func getStatefulSetPodNameAtIndex(index int, ss *apps.StatefulSet) string { } // Scale scales ss to count replicas. -func (s *StatefulSetTester) Scale(ss *apps.StatefulSet, count int32) error { +func (s *StatefulSetTester) Scale(ss *apps.StatefulSet, count int32) (*apps.StatefulSet, error) { name := ss.Name ns := ss.Namespace - s.update(ns, name, func(ss *apps.StatefulSet) { *(ss.Spec.Replicas) = count }) + + Logf("Scaling statefulset %s to %d", name, count) + ss = s.update(ns, name, func(ss *apps.StatefulSet) { *(ss.Spec.Replicas) = count }) var statefulPodList *v1.PodList pollErr := wait.PollImmediate(StatefulSetPoll, StatefulSetTimeout, func() (bool, error) { @@ -218,9 +220,9 @@ func (s *StatefulSetTester) Scale(ss *apps.StatefulSet, count int32) error { unhealthy = append(unhealthy, fmt.Sprintf("%v: deletion %v, phase %v, readiness %v", statefulPod.Name, delTs, phase, readiness)) } } - return fmt.Errorf("Failed to scale statefulset to %d in %v. Remaining pods:\n%v", count, StatefulSetTimeout, unhealthy) + return ss, fmt.Errorf("Failed to scale statefulset to %d in %v. Remaining pods:\n%v", count, StatefulSetTimeout, unhealthy) } - return nil + return ss, nil } // UpdateReplicas updates the replicas of ss to count. @@ -231,11 +233,16 @@ func (s *StatefulSetTester) UpdateReplicas(ss *apps.StatefulSet, count int32) { // Restart scales ss to 0 and then back to its previous number of replicas. func (s *StatefulSetTester) Restart(ss *apps.StatefulSet) { oldReplicas := *(ss.Spec.Replicas) - ExpectNoError(s.Scale(ss, 0)) + ss, err := s.Scale(ss, 0) + ExpectNoError(err) + // Wait for controller to report the desired number of Pods. + // This way we know the controller has observed all Pod deletions + // before we scale it back up. + s.WaitForStatusReplicas(ss, 0) s.update(ss.Namespace, ss.Name, func(ss *apps.StatefulSet) { *(ss.Spec.Replicas) = oldReplicas }) } -func (s *StatefulSetTester) update(ns, name string, update func(ss *apps.StatefulSet)) { +func (s *StatefulSetTester) update(ns, name string, update func(ss *apps.StatefulSet)) *apps.StatefulSet { for i := 0; i < 3; i++ { ss, err := s.c.AppsV1beta1().StatefulSets(ns).Get(name, metav1.GetOptions{}) if err != nil { @@ -244,13 +251,14 @@ func (s *StatefulSetTester) update(ns, name string, update func(ss *apps.Statefu update(ss) ss, err = s.c.AppsV1beta1().StatefulSets(ns).Update(ss) if err == nil { - return + return ss } if !apierrs.IsConflict(err) && !apierrs.IsServerTimeout(err) { Failf("failed to update statefulset %q: %v", name, err) } } Failf("too many retries draining statefulset %q", name) + return nil } // GetPodList gets the current Pods in ss. @@ -669,12 +677,13 @@ func DeleteAllStatefulSets(c clientset.Interface, ns string) { // Scale down each statefulset, then delete it completely. // Deleting a pvc without doing this will leak volumes, #25101. errList := []string{} - for _, ss := range ssList.Items { - Logf("Scaling statefulset %v to 0", ss.Name) - if err := sst.Scale(&ss, 0); err != nil { + for i := range ssList.Items { + ss := &ssList.Items[i] + var err error + if ss, err = sst.Scale(ss, 0); err != nil { errList = append(errList, fmt.Sprintf("%v", err)) } - sst.WaitForStatusReplicas(&ss, 0) + sst.WaitForStatusReplicas(ss, 0) Logf("Deleting statefulset %v", ss.Name) // Use OrphanDependents=false so it's deleted synchronously. // We already made sure the Pods are gone inside Scale(). From 122d881c01d8e202d9fd9def5608f63496ccbfac Mon Sep 17 00:00:00 2001 From: Ken'ichi Ohmichi Date: Tue, 22 Aug 2017 12:33:08 -0700 Subject: [PATCH 260/403] Add signal handler for catching Ctrl-C on hack/e2e When operating e2e test, hack/e2e.go process creates kubetest process. To kill the kubetest process when stop e2e test with Ctrl-C, we need to send the signal to the process because it also creates another process and it needs to kill it. This PR adds the signal handler on hack/e2e.go to kill the kubetest process. NOTE: https://github.com/kubernetes/test-infra/pull/4154 is the part of kubetest. solve #43051 --- hack/e2e.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hack/e2e.go b/hack/e2e.go index bc58a0ad8cf74..c016926c4a494 100644 --- a/hack/e2e.go +++ b/hack/e2e.go @@ -25,6 +25,7 @@ import ( "log" "os" "os/exec" + "os/signal" "path/filepath" "strings" "time" @@ -81,12 +82,21 @@ func main() { } func wait(cmd string, args ...string) error { + sigChannel := make(chan os.Signal, 1) + signal.Notify(sigChannel, os.Interrupt) + c := exec.Command(cmd, args...) c.Stdout = os.Stdout c.Stderr = os.Stderr if err := c.Start(); err != nil { return err } + go func() { + sig := <-sigChannel + if err := c.Process.Signal(sig); err != nil { + log.Fatalf("could not send %s signal %s: %v", cmd, sig, err) + } + }() return c.Wait() } From 8a12b65123bda5196e1ac1d3653839603b409348 Mon Sep 17 00:00:00 2001 From: mbohlool Date: Wed, 23 Aug 2017 16:18:55 -0700 Subject: [PATCH 261/403] Update CHANGELOG.md for v1.8.0-alpha.3. --- CHANGELOG.md | 738 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 509 insertions(+), 229 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93afcffd0002f..59ce6b7690d59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,66 +1,74 @@ -- [v1.6.9](#v169) - - [Downloads for v1.6.9](#downloads-for-v169) +- [v1.8.0-alpha.3](#v180-alpha3) + - [Downloads for v1.8.0-alpha.3](#downloads-for-v180-alpha3) - [Client Binaries](#client-binaries) - [Server Binaries](#server-binaries) - [Node Binaries](#node-binaries) - - [Changelog since v1.6.8](#changelog-since-v168) + - [Changelog since v1.8.0-alpha.2](#changelog-since-v180-alpha2) + - [Action Required](#action-required) - [Other notable changes](#other-notable-changes) -- [v1.7.4](#v174) - - [Downloads for v1.7.4](#downloads-for-v174) +- [v1.6.9](#v169) + - [Downloads for v1.6.9](#downloads-for-v169) - [Client Binaries](#client-binaries-1) - [Server Binaries](#server-binaries-1) - [Node Binaries](#node-binaries-1) - - [Changelog since v1.7.3](#changelog-since-v173) + - [Changelog since v1.6.8](#changelog-since-v168) - [Other notable changes](#other-notable-changes-1) -- [v1.6.8](#v168) - - [Downloads for v1.6.8](#downloads-for-v168) +- [v1.7.4](#v174) + - [Downloads for v1.7.4](#downloads-for-v174) - [Client Binaries](#client-binaries-2) - [Server Binaries](#server-binaries-2) - [Node Binaries](#node-binaries-2) - - [Changelog since v1.6.7](#changelog-since-v167) + - [Changelog since v1.7.3](#changelog-since-v173) - [Other notable changes](#other-notable-changes-2) -- [v1.7.3](#v173) - - [Downloads for v1.7.3](#downloads-for-v173) +- [v1.6.8](#v168) + - [Downloads for v1.6.8](#downloads-for-v168) - [Client Binaries](#client-binaries-3) - [Server Binaries](#server-binaries-3) - [Node Binaries](#node-binaries-3) - - [Changelog since v1.7.2](#changelog-since-v172) + - [Changelog since v1.6.7](#changelog-since-v167) - [Other notable changes](#other-notable-changes-3) -- [v1.7.2](#v172) - - [Downloads for v1.7.2](#downloads-for-v172) +- [v1.7.3](#v173) + - [Downloads for v1.7.3](#downloads-for-v173) - [Client Binaries](#client-binaries-4) - [Server Binaries](#server-binaries-4) - [Node Binaries](#node-binaries-4) - - [Changelog since v1.7.1](#changelog-since-v171) + - [Changelog since v1.7.2](#changelog-since-v172) - [Other notable changes](#other-notable-changes-4) -- [v1.7.1](#v171) - - [Downloads for v1.7.1](#downloads-for-v171) +- [v1.7.2](#v172) + - [Downloads for v1.7.2](#downloads-for-v172) - [Client Binaries](#client-binaries-5) - [Server Binaries](#server-binaries-5) - [Node Binaries](#node-binaries-5) - - [Changelog since v1.7.0](#changelog-since-v170) + - [Changelog since v1.7.1](#changelog-since-v171) - [Other notable changes](#other-notable-changes-5) -- [v1.8.0-alpha.2](#v180-alpha2) - - [Downloads for v1.8.0-alpha.2](#downloads-for-v180-alpha2) +- [v1.7.1](#v171) + - [Downloads for v1.7.1](#downloads-for-v171) - [Client Binaries](#client-binaries-6) - [Server Binaries](#server-binaries-6) - [Node Binaries](#node-binaries-6) - - [Changelog since v1.7.0](#changelog-since-v170-1) - - [Action Required](#action-required) + - [Changelog since v1.7.0](#changelog-since-v170) - [Other notable changes](#other-notable-changes-6) -- [v1.6.7](#v167) - - [Downloads for v1.6.7](#downloads-for-v167) +- [v1.8.0-alpha.2](#v180-alpha2) + - [Downloads for v1.8.0-alpha.2](#downloads-for-v180-alpha2) - [Client Binaries](#client-binaries-7) - [Server Binaries](#server-binaries-7) - [Node Binaries](#node-binaries-7) - - [Changelog since v1.6.6](#changelog-since-v166) + - [Changelog since v1.7.0](#changelog-since-v170-1) + - [Action Required](#action-required-1) - [Other notable changes](#other-notable-changes-7) -- [v1.7.0](#v170) - - [Downloads for v1.7.0](#downloads-for-v170) +- [v1.6.7](#v167) + - [Downloads for v1.6.7](#downloads-for-v167) - [Client Binaries](#client-binaries-8) - [Server Binaries](#server-binaries-8) - [Node Binaries](#node-binaries-8) + - [Changelog since v1.6.6](#changelog-since-v166) + - [Other notable changes](#other-notable-changes-8) +- [v1.7.0](#v170) + - [Downloads for v1.7.0](#downloads-for-v170) + - [Client Binaries](#client-binaries-9) + - [Server Binaries](#server-binaries-9) + - [Node Binaries](#node-binaries-9) - [**Major Themes**](#major-themes) - [**Action Required Before Upgrading**](#action-required-before-upgrading) - [Network](#network) @@ -116,7 +124,7 @@ - [Local Storage](#local-storage) - [Volume Plugins](#volume-plugins) - [Metrics](#metrics) - - [**Other notable changes**](#other-notable-changes-8) + - [**Other notable changes**](#other-notable-changes-9) - [Admission plugin](#admission-plugin) - [API Machinery](#api-machinery-1) - [Application autoscaling](#application-autoscaling-1) @@ -144,130 +152,130 @@ - [Previous Releases Included in v1.7.0](#previous-releases-included-in-v170) - [v1.7.0-rc.1](#v170-rc1) - [Downloads for v1.7.0-rc.1](#downloads-for-v170-rc1) - - [Client Binaries](#client-binaries-9) - - [Server Binaries](#server-binaries-9) - - [Node Binaries](#node-binaries-9) - - [Changelog since v1.7.0-beta.2](#changelog-since-v170-beta2) - - [Action Required](#action-required-1) - - [Other notable changes](#other-notable-changes-9) -- [v1.8.0-alpha.1](#v180-alpha1) - - [Downloads for v1.8.0-alpha.1](#downloads-for-v180-alpha1) - [Client Binaries](#client-binaries-10) - [Server Binaries](#server-binaries-10) - [Node Binaries](#node-binaries-10) - - [Changelog since v1.7.0-alpha.4](#changelog-since-v170-alpha4) + - [Changelog since v1.7.0-beta.2](#changelog-since-v170-beta2) - [Action Required](#action-required-2) - [Other notable changes](#other-notable-changes-10) -- [v1.6.6](#v166) - - [Downloads for v1.6.6](#downloads-for-v166) +- [v1.8.0-alpha.1](#v180-alpha1) + - [Downloads for v1.8.0-alpha.1](#downloads-for-v180-alpha1) - [Client Binaries](#client-binaries-11) - [Server Binaries](#server-binaries-11) - [Node Binaries](#node-binaries-11) - - [Changelog since v1.6.5](#changelog-since-v165) + - [Changelog since v1.7.0-alpha.4](#changelog-since-v170-alpha4) - [Action Required](#action-required-3) - [Other notable changes](#other-notable-changes-11) -- [v1.7.0-beta.2](#v170-beta2) - - [Downloads for v1.7.0-beta.2](#downloads-for-v170-beta2) +- [v1.6.6](#v166) + - [Downloads for v1.6.6](#downloads-for-v166) - [Client Binaries](#client-binaries-12) - [Server Binaries](#server-binaries-12) - [Node Binaries](#node-binaries-12) - - [Changelog since v1.7.0-beta.1](#changelog-since-v170-beta1) + - [Changelog since v1.6.5](#changelog-since-v165) - [Action Required](#action-required-4) - [Other notable changes](#other-notable-changes-12) -- [v1.6.5](#v165) - - [Known Issues for v1.6.5](#known-issues-for-v165) - - [Downloads for v1.6.5](#downloads-for-v165) +- [v1.7.0-beta.2](#v170-beta2) + - [Downloads for v1.7.0-beta.2](#downloads-for-v170-beta2) - [Client Binaries](#client-binaries-13) - [Server Binaries](#server-binaries-13) - [Node Binaries](#node-binaries-13) - - [Changelog since v1.6.4](#changelog-since-v164) + - [Changelog since v1.7.0-beta.1](#changelog-since-v170-beta1) + - [Action Required](#action-required-5) - [Other notable changes](#other-notable-changes-13) -- [v1.7.0-beta.1](#v170-beta1) - - [Downloads for v1.7.0-beta.1](#downloads-for-v170-beta1) +- [v1.6.5](#v165) + - [Known Issues for v1.6.5](#known-issues-for-v165) + - [Downloads for v1.6.5](#downloads-for-v165) - [Client Binaries](#client-binaries-14) - [Server Binaries](#server-binaries-14) - [Node Binaries](#node-binaries-14) - - [Changelog since v1.7.0-alpha.4](#changelog-since-v170-alpha4-1) - - [Action Required](#action-required-5) + - [Changelog since v1.6.4](#changelog-since-v164) - [Other notable changes](#other-notable-changes-14) -- [v1.6.4](#v164) - - [Known Issues for v1.6.4](#known-issues-for-v164) - - [Downloads for v1.6.4](#downloads-for-v164) +- [v1.7.0-beta.1](#v170-beta1) + - [Downloads for v1.7.0-beta.1](#downloads-for-v170-beta1) - [Client Binaries](#client-binaries-15) - [Server Binaries](#server-binaries-15) - [Node Binaries](#node-binaries-15) - - [Changelog since v1.6.3](#changelog-since-v163) + - [Changelog since v1.7.0-alpha.4](#changelog-since-v170-alpha4-1) + - [Action Required](#action-required-6) - [Other notable changes](#other-notable-changes-15) -- [v1.7.0-alpha.4](#v170-alpha4) - - [Downloads for v1.7.0-alpha.4](#downloads-for-v170-alpha4) +- [v1.6.4](#v164) + - [Known Issues for v1.6.4](#known-issues-for-v164) + - [Downloads for v1.6.4](#downloads-for-v164) - [Client Binaries](#client-binaries-16) - [Server Binaries](#server-binaries-16) - [Node Binaries](#node-binaries-16) - - [Changelog since v1.7.0-alpha.3](#changelog-since-v170-alpha3) - - [Action Required](#action-required-6) + - [Changelog since v1.6.3](#changelog-since-v163) - [Other notable changes](#other-notable-changes-16) -- [v1.6.3](#v163) - - [Known Issues for v1.6.3](#known-issues-for-v163) - - [Downloads for v1.6.3](#downloads-for-v163) +- [v1.7.0-alpha.4](#v170-alpha4) + - [Downloads for v1.7.0-alpha.4](#downloads-for-v170-alpha4) - [Client Binaries](#client-binaries-17) - [Server Binaries](#server-binaries-17) - [Node Binaries](#node-binaries-17) - - [Changelog since v1.6.2](#changelog-since-v162) + - [Changelog since v1.7.0-alpha.3](#changelog-since-v170-alpha3) + - [Action Required](#action-required-7) - [Other notable changes](#other-notable-changes-17) -- [v1.7.0-alpha.3](#v170-alpha3) - - [Downloads for v1.7.0-alpha.3](#downloads-for-v170-alpha3) +- [v1.6.3](#v163) + - [Known Issues for v1.6.3](#known-issues-for-v163) + - [Downloads for v1.6.3](#downloads-for-v163) - [Client Binaries](#client-binaries-18) - [Server Binaries](#server-binaries-18) - [Node Binaries](#node-binaries-18) - - [Changelog since v1.7.0-alpha.2](#changelog-since-v170-alpha2) - - [Action Required](#action-required-7) + - [Changelog since v1.6.2](#changelog-since-v162) - [Other notable changes](#other-notable-changes-18) -- [v1.5.7](#v157) - - [Downloads for v1.5.7](#downloads-for-v157) +- [v1.7.0-alpha.3](#v170-alpha3) + - [Downloads for v1.7.0-alpha.3](#downloads-for-v170-alpha3) - [Client Binaries](#client-binaries-19) - [Server Binaries](#server-binaries-19) - [Node Binaries](#node-binaries-19) - - [Changelog since v1.5.6](#changelog-since-v156) + - [Changelog since v1.7.0-alpha.2](#changelog-since-v170-alpha2) + - [Action Required](#action-required-8) - [Other notable changes](#other-notable-changes-19) -- [v1.4.12](#v1412) - - [Downloads for v1.4.12](#downloads-for-v1412) +- [v1.5.7](#v157) + - [Downloads for v1.5.7](#downloads-for-v157) - [Client Binaries](#client-binaries-20) - [Server Binaries](#server-binaries-20) - [Node Binaries](#node-binaries-20) - - [Changelog since v1.4.9](#changelog-since-v149) + - [Changelog since v1.5.6](#changelog-since-v156) - [Other notable changes](#other-notable-changes-20) -- [v1.7.0-alpha.2](#v170-alpha2) - - [Downloads for v1.7.0-alpha.2](#downloads-for-v170-alpha2) +- [v1.4.12](#v1412) + - [Downloads for v1.4.12](#downloads-for-v1412) - [Client Binaries](#client-binaries-21) - [Server Binaries](#server-binaries-21) - - [Changelog since v1.7.0-alpha.1](#changelog-since-v170-alpha1) - - [Action Required](#action-required-8) + - [Node Binaries](#node-binaries-21) + - [Changelog since v1.4.9](#changelog-since-v149) - [Other notable changes](#other-notable-changes-21) -- [v1.6.2](#v162) - - [Downloads for v1.6.2](#downloads-for-v162) +- [v1.7.0-alpha.2](#v170-alpha2) + - [Downloads for v1.7.0-alpha.2](#downloads-for-v170-alpha2) - [Client Binaries](#client-binaries-22) - [Server Binaries](#server-binaries-22) - - [Changelog since v1.6.1](#changelog-since-v161) + - [Changelog since v1.7.0-alpha.1](#changelog-since-v170-alpha1) + - [Action Required](#action-required-9) - [Other notable changes](#other-notable-changes-22) -- [v1.7.0-alpha.1](#v170-alpha1) - - [Downloads for v1.7.0-alpha.1](#downloads-for-v170-alpha1) +- [v1.6.2](#v162) + - [Downloads for v1.6.2](#downloads-for-v162) - [Client Binaries](#client-binaries-23) - [Server Binaries](#server-binaries-23) - - [Changelog since v1.6.0](#changelog-since-v160) + - [Changelog since v1.6.1](#changelog-since-v161) - [Other notable changes](#other-notable-changes-23) -- [v1.6.1](#v161) - - [Downloads for v1.6.1](#downloads-for-v161) +- [v1.7.0-alpha.1](#v170-alpha1) + - [Downloads for v1.7.0-alpha.1](#downloads-for-v170-alpha1) - [Client Binaries](#client-binaries-24) - [Server Binaries](#server-binaries-24) - - [Changelog since v1.6.0](#changelog-since-v160-1) + - [Changelog since v1.6.0](#changelog-since-v160) - [Other notable changes](#other-notable-changes-24) -- [v1.6.0](#v160) - - [Downloads for v1.6.0](#downloads-for-v160) +- [v1.6.1](#v161) + - [Downloads for v1.6.1](#downloads-for-v161) - [Client Binaries](#client-binaries-25) - [Server Binaries](#server-binaries-25) + - [Changelog since v1.6.0](#changelog-since-v160-1) + - [Other notable changes](#other-notable-changes-25) +- [v1.6.0](#v160) + - [Downloads for v1.6.0](#downloads-for-v160) + - [Client Binaries](#client-binaries-26) + - [Server Binaries](#server-binaries-26) - [WARNING: etcd backup strongly recommended](#warning:-etcd-backup-strongly-recommended) - [Major updates and release themes](#major-updates-and-release-themes) - - [Action Required](#action-required-9) + - [Action Required](#action-required-10) - [Certificates API](#certificates-api) - [Cluster Autoscaler](#cluster-autoscaler) - [Deployment](#deployment) @@ -331,7 +339,7 @@ - [vSphere](#vsphere) - [Federation](#federation-2) - [kubefed](#kubefed-1) - - [Other Notable Changes](#other-notable-changes-25) + - [Other Notable Changes](#other-notable-changes-26) - [Garbage Collector](#garbage-collector) - [kubeadm](#kubeadm-4) - [kubectl](#kubectl-1) @@ -341,7 +349,7 @@ - [Updates to apply](#updates-to-apply) - [Updates to edit](#updates-to-edit) - [Bug fixes](#bug-fixes) - - [Other Notable Changes](#other-notable-changes-26) + - [Other Notable Changes](#other-notable-changes-27) - [Node Components](#node-components-4) - [Bug fixes](#bug-fixes-1) - [kube-controller-manager](#kube-controller-manager) @@ -354,7 +362,7 @@ - [Photon](#photon) - [rbd](#rbd) - [vSphere](#vsphere-1) - - [Other Notable Changes](#other-notable-changes-27) + - [Other Notable Changes](#other-notable-changes-28) - [Changes to Cluster Provisioning Scripts](#changes-to-cluster-provisioning-scripts) - [AWS](#aws-1) - [Juju](#juju) @@ -362,7 +370,7 @@ - [GCE](#gce-1) - [OpenStack](#openstack) - [Container Images](#container-images) - - [Other Notable Changes](#other-notable-changes-28) + - [Other Notable Changes](#other-notable-changes-29) - [Changes to Addons](#changes-to-addons) - [Dashboard](#dashboard) - [DNS](#dns) @@ -378,108 +386,108 @@ - [Previous Releases Included in v1.6.0](#previous-releases-included-in-v160) - [v1.5.6](#v156) - [Downloads for v1.5.6](#downloads-for-v156) - - [Client Binaries](#client-binaries-26) - - [Server Binaries](#server-binaries-26) + - [Client Binaries](#client-binaries-27) + - [Server Binaries](#server-binaries-27) - [Changelog since v1.5.5](#changelog-since-v155) - - [Other notable changes](#other-notable-changes-29) + - [Other notable changes](#other-notable-changes-30) - [v1.6.0-rc.1](#v160-rc1) - [Downloads for v1.6.0-rc.1](#downloads-for-v160-rc1) - - [Client Binaries](#client-binaries-27) - - [Server Binaries](#server-binaries-27) + - [Client Binaries](#client-binaries-28) + - [Server Binaries](#server-binaries-28) - [Changelog since v1.6.0-beta.4](#changelog-since-v160-beta4) - - [Other notable changes](#other-notable-changes-30) + - [Other notable changes](#other-notable-changes-31) - [v1.5.5](#v155) - [Downloads for v1.5.5](#downloads-for-v155) - - [Client Binaries](#client-binaries-28) - - [Server Binaries](#server-binaries-28) + - [Client Binaries](#client-binaries-29) + - [Server Binaries](#server-binaries-29) - [Changelog since v1.5.4](#changelog-since-v154) - [v1.6.0-beta.4](#v160-beta4) - [Downloads for v1.6.0-beta.4](#downloads-for-v160-beta4) - - [Client Binaries](#client-binaries-29) - - [Server Binaries](#server-binaries-29) + - [Client Binaries](#client-binaries-30) + - [Server Binaries](#server-binaries-30) - [Changelog since v1.6.0-beta.3](#changelog-since-v160-beta3) - - [Other notable changes](#other-notable-changes-31) + - [Other notable changes](#other-notable-changes-32) - [v1.6.0-beta.3](#v160-beta3) - [Downloads for v1.6.0-beta.3](#downloads-for-v160-beta3) - - [Client Binaries](#client-binaries-30) - - [Server Binaries](#server-binaries-30) + - [Client Binaries](#client-binaries-31) + - [Server Binaries](#server-binaries-31) - [Changelog since v1.6.0-beta.2](#changelog-since-v160-beta2) - - [Other notable changes](#other-notable-changes-32) + - [Other notable changes](#other-notable-changes-33) - [v1.6.0-beta.2](#v160-beta2) - [Downloads for v1.6.0-beta.2](#downloads-for-v160-beta2) - - [Client Binaries](#client-binaries-31) - - [Server Binaries](#server-binaries-31) + - [Client Binaries](#client-binaries-32) + - [Server Binaries](#server-binaries-32) - [Changelog since v1.6.0-beta.1](#changelog-since-v160-beta1) - - [Action Required](#action-required-10) - - [Other notable changes](#other-notable-changes-33) + - [Action Required](#action-required-11) + - [Other notable changes](#other-notable-changes-34) - [v1.5.4](#v154) - [Downloads for v1.5.4](#downloads-for-v154) - - [Client Binaries](#client-binaries-32) - - [Server Binaries](#server-binaries-32) + - [Client Binaries](#client-binaries-33) + - [Server Binaries](#server-binaries-33) - [Changelog since v1.5.3](#changelog-since-v153) - - [Other notable changes](#other-notable-changes-34) + - [Other notable changes](#other-notable-changes-35) - [v1.6.0-beta.1](#v160-beta1) - [Downloads for v1.6.0-beta.1](#downloads-for-v160-beta1) - - [Client Binaries](#client-binaries-33) - - [Server Binaries](#server-binaries-33) + - [Client Binaries](#client-binaries-34) + - [Server Binaries](#server-binaries-34) - [Changelog since v1.6.0-alpha.3](#changelog-since-v160-alpha3) - - [Action Required](#action-required-11) - - [Other notable changes](#other-notable-changes-35) + - [Action Required](#action-required-12) + - [Other notable changes](#other-notable-changes-36) - [v1.6.0-alpha.3](#v160-alpha3) - [Downloads for v1.6.0-alpha.3](#downloads-for-v160-alpha3) - - [Client Binaries](#client-binaries-34) - - [Server Binaries](#server-binaries-34) + - [Client Binaries](#client-binaries-35) + - [Server Binaries](#server-binaries-35) - [Changelog since v1.6.0-alpha.2](#changelog-since-v160-alpha2) - - [Other notable changes](#other-notable-changes-36) + - [Other notable changes](#other-notable-changes-37) - [v1.4.9](#v149) - [Downloads for v1.4.9](#downloads-for-v149) - - [Client Binaries](#client-binaries-35) - - [Server Binaries](#server-binaries-35) + - [Client Binaries](#client-binaries-36) + - [Server Binaries](#server-binaries-36) - [Changelog since v1.4.8](#changelog-since-v148) - - [Other notable changes](#other-notable-changes-37) + - [Other notable changes](#other-notable-changes-38) - [v1.5.3](#v153) - [Downloads for v1.5.3](#downloads-for-v153) - - [Client Binaries](#client-binaries-36) - - [Server Binaries](#server-binaries-36) - - [Node Binaries](#node-binaries-21) + - [Client Binaries](#client-binaries-37) + - [Server Binaries](#server-binaries-37) + - [Node Binaries](#node-binaries-22) - [Changelog since v1.5.2](#changelog-since-v152) - - [Other notable changes](#other-notable-changes-38) + - [Other notable changes](#other-notable-changes-39) - [v1.6.0-alpha.2](#v160-alpha2) - [Downloads for v1.6.0-alpha.2](#downloads-for-v160-alpha2) - - [Client Binaries](#client-binaries-37) - - [Server Binaries](#server-binaries-37) + - [Client Binaries](#client-binaries-38) + - [Server Binaries](#server-binaries-38) - [Changelog since v1.6.0-alpha.1](#changelog-since-v160-alpha1) - - [Other notable changes](#other-notable-changes-39) + - [Other notable changes](#other-notable-changes-40) - [v1.6.0-alpha.1](#v160-alpha1) - [Downloads for v1.6.0-alpha.1](#downloads-for-v160-alpha1) - - [Client Binaries](#client-binaries-38) - - [Server Binaries](#server-binaries-38) + - [Client Binaries](#client-binaries-39) + - [Server Binaries](#server-binaries-39) - [Changelog since v1.5.0](#changelog-since-v150) - - [Action Required](#action-required-12) - - [Other notable changes](#other-notable-changes-40) + - [Action Required](#action-required-13) + - [Other notable changes](#other-notable-changes-41) - [v1.5.2](#v152) - [Downloads for v1.5.2](#downloads-for-v152) - - [Client Binaries](#client-binaries-39) - - [Server Binaries](#server-binaries-39) + - [Client Binaries](#client-binaries-40) + - [Server Binaries](#server-binaries-40) - [Changelog since v1.5.1](#changelog-since-v151) - - [Other notable changes](#other-notable-changes-41) + - [Other notable changes](#other-notable-changes-42) - [v1.4.8](#v148) - [Downloads for v1.4.8](#downloads-for-v148) - - [Client Binaries](#client-binaries-40) - - [Server Binaries](#server-binaries-40) + - [Client Binaries](#client-binaries-41) + - [Server Binaries](#server-binaries-41) - [Changelog since v1.4.7](#changelog-since-v147) - - [Other notable changes](#other-notable-changes-42) + - [Other notable changes](#other-notable-changes-43) - [v1.5.1](#v151) - [Downloads for v1.5.1](#downloads-for-v151) - - [Client Binaries](#client-binaries-41) - - [Server Binaries](#server-binaries-41) + - [Client Binaries](#client-binaries-42) + - [Server Binaries](#server-binaries-42) - [Changelog since v1.5.0](#changelog-since-v150-1) - - [Other notable changes](#other-notable-changes-43) + - [Other notable changes](#other-notable-changes-44) - [Known Issues for v1.5.1](#known-issues-for-v151) - [v1.5.0](#v150) - [Downloads for v1.5.0](#downloads-for-v150) - - [Client Binaries](#client-binaries-42) - - [Server Binaries](#server-binaries-42) + - [Client Binaries](#client-binaries-43) + - [Server Binaries](#server-binaries-43) - [Major Themes](#major-themes-1) - [Features](#features) - [Known Issues](#known-issues-1) @@ -488,103 +496,103 @@ - [Action Required Before Upgrading](#action-required-before-upgrading-1) - [External Dependency Version Information](#external-dependency-version-information-2) - [Changelog since v1.5.0-beta.3](#changelog-since-v150-beta3) - - [Other notable changes](#other-notable-changes-44) + - [Other notable changes](#other-notable-changes-45) - [Previous Releases Included in v1.5.0](#previous-releases-included-in-v150) - [v1.4.7](#v147) - [Downloads for v1.4.7](#downloads-for-v147) - - [Client Binaries](#client-binaries-43) - - [Server Binaries](#server-binaries-43) + - [Client Binaries](#client-binaries-44) + - [Server Binaries](#server-binaries-44) - [Changelog since v1.4.6](#changelog-since-v146) - - [Other notable changes](#other-notable-changes-45) + - [Other notable changes](#other-notable-changes-46) - [v1.5.0-beta.3](#v150-beta3) - [Downloads for v1.5.0-beta.3](#downloads-for-v150-beta3) - - [Client Binaries](#client-binaries-44) - - [Server Binaries](#server-binaries-44) + - [Client Binaries](#client-binaries-45) + - [Server Binaries](#server-binaries-45) - [Changelog since v1.5.0-beta.2](#changelog-since-v150-beta2) - - [Other notable changes](#other-notable-changes-46) + - [Other notable changes](#other-notable-changes-47) - [v1.5.0-beta.2](#v150-beta2) - [Downloads for v1.5.0-beta.2](#downloads-for-v150-beta2) - - [Client Binaries](#client-binaries-45) - - [Server Binaries](#server-binaries-45) + - [Client Binaries](#client-binaries-46) + - [Server Binaries](#server-binaries-46) - [Changelog since v1.5.0-beta.1](#changelog-since-v150-beta1) - - [Other notable changes](#other-notable-changes-47) + - [Other notable changes](#other-notable-changes-48) - [v1.5.0-beta.1](#v150-beta1) - [Downloads for v1.5.0-beta.1](#downloads-for-v150-beta1) - - [Client Binaries](#client-binaries-46) - - [Server Binaries](#server-binaries-46) + - [Client Binaries](#client-binaries-47) + - [Server Binaries](#server-binaries-47) - [Changelog since v1.5.0-alpha.2](#changelog-since-v150-alpha2) - - [Action Required](#action-required-13) - - [Other notable changes](#other-notable-changes-48) + - [Action Required](#action-required-14) + - [Other notable changes](#other-notable-changes-49) - [v1.4.6](#v146) - [Downloads for v1.4.6](#downloads-for-v146) - - [Client Binaries](#client-binaries-47) - - [Server Binaries](#server-binaries-47) + - [Client Binaries](#client-binaries-48) + - [Server Binaries](#server-binaries-48) - [Changelog since v1.4.5](#changelog-since-v145) - - [Other notable changes](#other-notable-changes-49) + - [Other notable changes](#other-notable-changes-50) - [v1.3.10](#v1310) - [Downloads for v1.3.10](#downloads-for-v1310) - - [Client Binaries](#client-binaries-48) - - [Server Binaries](#server-binaries-48) + - [Client Binaries](#client-binaries-49) + - [Server Binaries](#server-binaries-49) - [Changelog since v1.3.9](#changelog-since-v139) - - [Other notable changes](#other-notable-changes-50) + - [Other notable changes](#other-notable-changes-51) - [v1.4.5](#v145) - [Downloads for v1.4.5](#downloads-for-v145) - - [Client Binaries](#client-binaries-49) - - [Server Binaries](#server-binaries-49) + - [Client Binaries](#client-binaries-50) + - [Server Binaries](#server-binaries-50) - [Changelog since v1.4.4](#changelog-since-v144) - - [Other notable changes](#other-notable-changes-51) + - [Other notable changes](#other-notable-changes-52) - [v1.5.0-alpha.2](#v150-alpha2) - [Downloads for v1.5.0-alpha.2](#downloads-for-v150-alpha2) - - [Client Binaries](#client-binaries-50) - - [Server Binaries](#server-binaries-50) + - [Client Binaries](#client-binaries-51) + - [Server Binaries](#server-binaries-51) - [Changelog since v1.5.0-alpha.1](#changelog-since-v150-alpha1) - - [Action Required](#action-required-14) - - [Other notable changes](#other-notable-changes-52) + - [Action Required](#action-required-15) + - [Other notable changes](#other-notable-changes-53) - [v1.2.7](#v127) - [Downloads for v1.2.7](#downloads-for-v127) - - [Client Binaries](#client-binaries-51) - - [Server Binaries](#server-binaries-51) + - [Client Binaries](#client-binaries-52) + - [Server Binaries](#server-binaries-52) - [Changelog since v1.2.6](#changelog-since-v126) - - [Other notable changes](#other-notable-changes-53) + - [Other notable changes](#other-notable-changes-54) - [v1.4.4](#v144) - [Downloads for v1.4.4](#downloads-for-v144) - - [Client Binaries](#client-binaries-52) - - [Server Binaries](#server-binaries-52) + - [Client Binaries](#client-binaries-53) + - [Server Binaries](#server-binaries-53) - [Changelog since v1.4.3](#changelog-since-v143) - - [Other notable changes](#other-notable-changes-54) + - [Other notable changes](#other-notable-changes-55) - [v1.3.9](#v139) - [Downloads](#downloads) - [Changelog since v1.3.8](#changelog-since-v138) - - [Other notable changes](#other-notable-changes-55) + - [Other notable changes](#other-notable-changes-56) - [v1.4.3](#v143) - [Downloads](#downloads-1) - [Changelog since v1.4.2-beta.1](#changelog-since-v142-beta1) - - [Other notable changes](#other-notable-changes-56) + - [Other notable changes](#other-notable-changes-57) - [v1.4.2](#v142) - [Downloads](#downloads-2) - [Changelog since v1.4.2-beta.1](#changelog-since-v142-beta1-1) - - [Other notable changes](#other-notable-changes-57) + - [Other notable changes](#other-notable-changes-58) - [v1.5.0-alpha.1](#v150-alpha1) - [Downloads](#downloads-3) - [Changelog since v1.4.0-alpha.3](#changelog-since-v140-alpha3) - [Experimental Features](#experimental-features) - - [Action Required](#action-required-15) - - [Other notable changes](#other-notable-changes-58) + - [Action Required](#action-required-16) + - [Other notable changes](#other-notable-changes-59) - [v1.4.2-beta.1](#v142-beta1) - [Downloads](#downloads-4) - [Changelog since v1.4.1](#changelog-since-v141) - - [Other notable changes](#other-notable-changes-59) + - [Other notable changes](#other-notable-changes-60) - [v1.4.1](#v141) - [Downloads](#downloads-5) - [Changelog since v1.4.1-beta.2](#changelog-since-v141-beta2) - [v1.4.1-beta.2](#v141-beta2) - [Downloads](#downloads-6) - [Changelog since v1.4.0](#changelog-since-v140) - - [Other notable changes](#other-notable-changes-60) + - [Other notable changes](#other-notable-changes-61) - [v1.3.8](#v138) - [Downloads](#downloads-7) - [Changelog since v1.3.7](#changelog-since-v137) - - [Other notable changes](#other-notable-changes-61) + - [Other notable changes](#other-notable-changes-62) - [v1.4.0](#v140) - [Downloads](#downloads-8) - [Major Themes](#major-themes-2) @@ -604,26 +612,26 @@ - [v1.4.0-beta.10](#v140-beta10) - [Downloads](#downloads-10) - [Changelog since v1.4.0-beta.8](#changelog-since-v140-beta8) - - [Other notable changes](#other-notable-changes-62) + - [Other notable changes](#other-notable-changes-63) - [v1.4.0-beta.8](#v140-beta8) - [Downloads](#downloads-11) - [Changelog since v1.4.0-beta.7](#changelog-since-v140-beta7) - [v1.4.0-beta.7](#v140-beta7) - [Downloads](#downloads-12) - [Changelog since v1.4.0-beta.6](#changelog-since-v140-beta6) - - [Other notable changes](#other-notable-changes-63) + - [Other notable changes](#other-notable-changes-64) - [v1.4.0-beta.6](#v140-beta6) - [Downloads](#downloads-13) - [Changelog since v1.4.0-beta.5](#changelog-since-v140-beta5) - - [Other notable changes](#other-notable-changes-64) + - [Other notable changes](#other-notable-changes-65) - [v1.4.0-beta.5](#v140-beta5) - [Downloads](#downloads-14) - [Changelog since v1.4.0-beta.3](#changelog-since-v140-beta3) - - [Other notable changes](#other-notable-changes-65) + - [Other notable changes](#other-notable-changes-66) - [v1.3.7](#v137) - [Downloads](#downloads-15) - [Changelog since v1.3.6](#changelog-since-v136) - - [Other notable changes](#other-notable-changes-66) + - [Other notable changes](#other-notable-changes-67) - [v1.4.0-beta.3](#v140-beta3) - [Downloads](#downloads-16) - [Changelog since v1.4.0-beta.2](#changelog-since-v140-beta2) @@ -634,57 +642,57 @@ - [v1.4.0-beta.2](#v140-beta2) - [Downloads](#downloads-17) - [Changelog since v1.4.0-beta.1](#changelog-since-v140-beta1) - - [Other notable changes](#other-notable-changes-67) + - [Other notable changes](#other-notable-changes-68) - [v1.4.0-beta.1](#v140-beta1) - [Downloads](#downloads-18) - [Changelog since v1.4.0-alpha.3](#changelog-since-v140-alpha3-1) - - [Action Required](#action-required-16) - - [Other notable changes](#other-notable-changes-68) + - [Action Required](#action-required-17) + - [Other notable changes](#other-notable-changes-69) - [v1.3.6](#v136) - [Downloads](#downloads-19) - [Changelog since v1.3.5](#changelog-since-v135) - - [Other notable changes](#other-notable-changes-69) + - [Other notable changes](#other-notable-changes-70) - [v1.4.0-alpha.3](#v140-alpha3) - [Downloads](#downloads-20) - [Changelog since v1.4.0-alpha.2](#changelog-since-v140-alpha2) - - [Action Required](#action-required-17) - - [Other notable changes](#other-notable-changes-70) + - [Action Required](#action-required-18) + - [Other notable changes](#other-notable-changes-71) - [v1.3.5](#v135) - [Downloads](#downloads-21) - [Changelog since v1.3.4](#changelog-since-v134) - - [Other notable changes](#other-notable-changes-71) + - [Other notable changes](#other-notable-changes-72) - [v1.3.4](#v134) - [Downloads](#downloads-22) - [Changelog since v1.3.3](#changelog-since-v133) - - [Other notable changes](#other-notable-changes-72) + - [Other notable changes](#other-notable-changes-73) - [v1.4.0-alpha.2](#v140-alpha2) - [Downloads](#downloads-23) - [Changelog since v1.4.0-alpha.1](#changelog-since-v140-alpha1) - - [Action Required](#action-required-18) - - [Other notable changes](#other-notable-changes-73) + - [Action Required](#action-required-19) + - [Other notable changes](#other-notable-changes-74) - [v1.3.3](#v133) - [Downloads](#downloads-24) - [Changelog since v1.3.2](#changelog-since-v132) - - [Other notable changes](#other-notable-changes-74) + - [Other notable changes](#other-notable-changes-75) - [Known Issues](#known-issues-3) - [v1.3.2](#v132) - [Downloads](#downloads-25) - [Changelog since v1.3.1](#changelog-since-v131) - - [Other notable changes](#other-notable-changes-75) + - [Other notable changes](#other-notable-changes-76) - [v1.3.1](#v131) - [Downloads](#downloads-26) - [Changelog since v1.3.0](#changelog-since-v130) - - [Other notable changes](#other-notable-changes-76) + - [Other notable changes](#other-notable-changes-77) - [v1.2.6](#v126) - [Downloads](#downloads-27) - [Changelog since v1.2.5](#changelog-since-v125) - - [Other notable changes](#other-notable-changes-77) + - [Other notable changes](#other-notable-changes-78) - [v1.4.0-alpha.1](#v140-alpha1) - [Downloads](#downloads-28) - [Changelog since v1.3.0](#changelog-since-v130-1) - [Experimental Features](#experimental-features-1) - - [Action Required](#action-required-19) - - [Other notable changes](#other-notable-changes-78) + - [Action Required](#action-required-20) + - [Other notable changes](#other-notable-changes-79) - [v1.3.0](#v130) - [Downloads](#downloads-29) - [Highlights](#highlights) @@ -699,70 +707,70 @@ - [v1.3.0-beta.3](#v130-beta3) - [Downloads](#downloads-30) - [Changelog since v1.3.0-beta.2](#changelog-since-v130-beta2) - - [Action Required](#action-required-20) - - [Other notable changes](#other-notable-changes-79) + - [Action Required](#action-required-21) + - [Other notable changes](#other-notable-changes-80) - [v1.2.5](#v125) - [Downloads](#downloads-31) - [Changes since v1.2.4](#changes-since-v124) - - [Other notable changes](#other-notable-changes-80) + - [Other notable changes](#other-notable-changes-81) - [v1.3.0-beta.2](#v130-beta2) - [Downloads](#downloads-32) - [Changes since v1.3.0-beta.1](#changes-since-v130-beta1) - [Experimental Features](#experimental-features-2) - - [Other notable changes](#other-notable-changes-81) + - [Other notable changes](#other-notable-changes-82) - [v1.3.0-beta.1](#v130-beta1) - [Downloads](#downloads-33) - [Changes since v1.3.0-alpha.5](#changes-since-v130-alpha5) - - [Action Required](#action-required-21) - - [Other notable changes](#other-notable-changes-82) + - [Action Required](#action-required-22) + - [Other notable changes](#other-notable-changes-83) - [v1.3.0-alpha.5](#v130-alpha5) - [Downloads](#downloads-34) - [Changes since v1.3.0-alpha.4](#changes-since-v130-alpha4) - - [Action Required](#action-required-22) - - [Other notable changes](#other-notable-changes-83) + - [Action Required](#action-required-23) + - [Other notable changes](#other-notable-changes-84) - [v1.3.0-alpha.4](#v130-alpha4) - [Downloads](#downloads-35) - [Changes since v1.3.0-alpha.3](#changes-since-v130-alpha3) - - [Action Required](#action-required-23) - - [Other notable changes](#other-notable-changes-84) + - [Action Required](#action-required-24) + - [Other notable changes](#other-notable-changes-85) - [v1.2.4](#v124) - [Downloads](#downloads-36) - [Changes since v1.2.3](#changes-since-v123) - - [Other notable changes](#other-notable-changes-85) + - [Other notable changes](#other-notable-changes-86) - [v1.3.0-alpha.3](#v130-alpha3) - [Downloads](#downloads-37) - [Changes since v1.3.0-alpha.2](#changes-since-v130-alpha2) - - [Action Required](#action-required-24) - - [Other notable changes](#other-notable-changes-86) + - [Action Required](#action-required-25) + - [Other notable changes](#other-notable-changes-87) - [v1.2.3](#v123) - [Downloads](#downloads-38) - [Changes since v1.2.2](#changes-since-v122) - - [Action Required](#action-required-25) - - [Other notable changes](#other-notable-changes-87) + - [Action Required](#action-required-26) + - [Other notable changes](#other-notable-changes-88) - [v1.3.0-alpha.2](#v130-alpha2) - [Downloads](#downloads-39) - [Changes since v1.3.0-alpha.1](#changes-since-v130-alpha1) - - [Other notable changes](#other-notable-changes-88) + - [Other notable changes](#other-notable-changes-89) - [v1.2.2](#v122) - [Downloads](#downloads-40) - [Changes since v1.2.1](#changes-since-v121) - - [Other notable changes](#other-notable-changes-89) + - [Other notable changes](#other-notable-changes-90) - [v1.2.1](#v121) - [Downloads](#downloads-41) - [Changes since v1.2.0](#changes-since-v120) - - [Other notable changes](#other-notable-changes-90) + - [Other notable changes](#other-notable-changes-91) - [v1.3.0-alpha.1](#v130-alpha1) - [Downloads](#downloads-42) - [Changes since v1.2.0](#changes-since-v120-1) - - [Action Required](#action-required-26) - - [Other notable changes](#other-notable-changes-91) + - [Action Required](#action-required-27) + - [Other notable changes](#other-notable-changes-92) - [v1.2.0](#v120) - [Downloads](#downloads-43) - [Changes since v1.1.1](#changes-since-v111) - [Major Themes](#major-themes-3) - [Other notable improvements](#other-notable-improvements) - [Experimental Features](#experimental-features-3) - - [Action required](#action-required-27) + - [Action required](#action-required-28) - [Known Issues](#known-issues-4) - [Docker Known Issues](#docker-known-issues) - [1.9.1](#191) @@ -775,6 +783,278 @@ +# v1.8.0-alpha.3 + +[Documentation](https://docs.k8s.io) & [Examples](https://releases.k8s.io/master/examples) + +## Downloads for v1.8.0-alpha.3 + + +filename | sha256 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes.tar.gz) | `c99042c4826352b724dc02c8d92c01c49e1ad1663d2c55e0bce931fe4d76c1e3` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-src.tar.gz) | `3ee0cd3594bd5b326f042044d87e120fe335bd8e722635220dd5741485ab3493` + +### Client Binaries + +filename | sha256 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-darwin-386.tar.gz) | `c716e167383d118373d7b10425bb8db6033675e4520591017c688575f28a596d` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-darwin-amd64.tar.gz) | `dfe87cad00600049c841c8fd96c49088d4f7cdd34e5a903ef8048f75718f2d21` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-linux-386.tar.gz) | `97242dffee822cbf4e3e373acf05e9dc2f40176b18f4532a60264ecf92738356` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-linux-amd64.tar.gz) | `42e25e810333b00434217bae0aece145f82d0c7043faea83ff62bed079bae651` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-linux-arm64.tar.gz) | `7f9683c90dc894ee8cd7ad30ec58d0d49068d35478a71b315d2b7805ec28e14a` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-linux-arm.tar.gz) | `76347a154128e97cdd81674045b28035d89d509b35dda051f2cbc58c9b67fed4` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-linux-ppc64le.tar.gz) | `c991cbbf0afa6eccd005b6e5ea28b0b20ecbc79ab7d64e32c24e03fcf05b48ff` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-linux-s390x.tar.gz) | `94c2c29e8fd20d2a5c4f96098bd5c7d879a78e872f59c3c58ca1c775a57ddefb` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-windows-386.tar.gz) | `bc98fd5dc01c6e6117c2c78d65884190bf99fd1fec0904e2af05e6dbf503ccc8` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-client-windows-amd64.tar.gz) | `e32b56dbc69045b5b2821a2e3eb3c3b4a18cf4c11afd44e0c7c9c0e67bb38d02` + +### Server Binaries + +filename | sha256 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-server-linux-amd64.tar.gz) | `5446addff583b0dc977b91375f3c399242f7996e1f66f52b9e14c015add3bf13` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-server-linux-arm64.tar.gz) | `91e3cffed119b5105f6a6f74f583113384a26c746b459029c12babf45f680119` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-server-linux-arm.tar.gz) | `d4cb93787651193ef4fdd1d10a4822101586b2994d6b0e04d064687df8729910` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-server-linux-ppc64le.tar.gz) | `916e7f63a4e0c67d9f106fdda6eb24efcc94356b05cd9eb288e45fac9ff79fe8` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-server-linux-s390x.tar.gz) | `15b999b08f5fe0d8252f8a1c7e936b9e06f2b01132010b3cece547ab00b45282` + +### Node Binaries + +filename | sha256 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-node-linux-amd64.tar.gz) | `9120f6a06053ed91566d378a26ae455f521ab46911f257d64f629d93d143b369` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-node-linux-arm64.tar.gz) | `30af817f5de0ecb8a95ec898fba5b97e6b4f224927e1cf7efaf2d5479b23c116` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-node-linux-arm.tar.gz) | `8b0913e461d8ac821c2104a1f0b4efe3151f0d8e8598e0945e60b4ba7ac2d1a0` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-node-linux-ppc64le.tar.gz) | `a78a3a837c0fbf6e092b312472c89ef0f3872c268b0a5e1e344e725a88c0717d` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-node-linux-s390x.tar.gz) | `a0a38c5830fc1b7996c5befc24502991fc8a095f82cf81ddd0a301163143a2c5` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.8.0-alpha.3/kubernetes-node-windows-amd64.tar.gz) | `8af4253fe2c582843de329d12d84dbdc5f9f823f68ee08a42809864efc7c368d` + +## Changelog since v1.8.0-alpha.2 + +### Action Required + +* Remove deprecated kubectl command aliases `apiversions, clusterinfo, resize, rollingupdate, run-container, update` ([#49935](https://github.com/kubernetes/kubernetes/pull/49935), [@xiangpengzhao](https://github.com/xiangpengzhao)) +* The following deprecated flags have been removed from `kube-controller-manager`: `replication-controller-lookup-cache-size`, `replicaset-lookup-cache-size`, and `daemonset-lookup-cache-size`. Make sure you no longer attempt to set them. ([#50678](https://github.com/kubernetes/kubernetes/pull/50678), [@xiangpengzhao](https://github.com/xiangpengzhao)) +* Beta annotations `service.beta.kubernetes.io/external-traffic` and `service.beta.kubernetes.io/healthcheck-nodeport` have been removed. Please use fields `service.spec.externalTrafficPolicy` and `service.spec.healthCheckNodePort` instead. ([#50224](https://github.com/kubernetes/kubernetes/pull/50224), [@xiangpengzhao](https://github.com/xiangpengzhao)) +* A cluster using the AWS cloud provider will need to label existing nodes and resources with a ClusterID or the kube-controller-manager will not start. To run without a ClusterID pass --allow-untagged-cloud=true to the kube-controller-manager on startup. ([#49215](https://github.com/kubernetes/kubernetes/pull/49215), [@rrati](https://github.com/rrati)) +* RBAC: the `system:node` role is no longer automatically granted to the `system:nodes` group in new clusters. It is recommended that nodes be authorized using the `Node` authorization mode instead. Installations that wish to continue giving all members of the `system:nodes` group the `system:node` role (which grants broad read access, including all secrets and configmaps) must create an installation-specific `ClusterRoleBinding`. ([#49638](https://github.com/kubernetes/kubernetes/pull/49638), [@liggitt](https://github.com/liggitt)) +* StatefulSet: The deprecated `pod.alpha.kubernetes.io/initialized` annotation for interrupting StatefulSet Pod management is now ignored. If you were setting it to `true` or leaving it unset, no action is required. However, if you were setting it to `false`, be aware that previously-dormant StatefulSets may become active after upgrading. ([#49251](https://github.com/kubernetes/kubernetes/pull/49251), [@enisoc](https://github.com/enisoc)) +* add some more deprecation warnings to cluster ([#49148](https://github.com/kubernetes/kubernetes/pull/49148), [@mikedanese](https://github.com/mikedanese)) +* The --insecure-allow-any-token flag has been removed from kube-apiserver. Users of the flag should use impersonation headers instead for debugging. ([#49045](https://github.com/kubernetes/kubernetes/pull/49045), [@ericchiang](https://github.com/ericchiang)) +* Restored cAdvisor prometheus metrics to the main port -- a regression that existed in v1.7.0-v1.7.2 ([#49079](https://github.com/kubernetes/kubernetes/pull/49079), [@smarterclayton](https://github.com/smarterclayton)) + * cAdvisor metrics can now be scraped from `/metrics/cadvisor` on the kubelet ports. + * Note that you have to update your scraping jobs to get kubelet-only metrics from `/metrics` and `container_*` metrics from `/metrics/cadvisor` +* Change the default kubeadm bootstrap token TTL from infinite to 24 hours. This is a breaking change. If you require the old behavior, use `kubeadm init --token-ttl 0` / `kubeadm token create --ttl 0`. ([#48783](https://github.com/kubernetes/kubernetes/pull/48783), [@mattmoyer](https://github.com/mattmoyer)) + +### Other notable changes + +* /release-note Remove duplicate command example from `kubectl port-forward --help` ([#50229](https://github.com/kubernetes/kubernetes/pull/50229), [@tcharding](https://github.com/tcharding)) +* Adds a new `kubeadm config` command that lets users tell `kubeadm upgrade` what kubeadm configuration to use and lets users view the current state. ([#50980](https://github.com/kubernetes/kubernetes/pull/50980), [@luxas](https://github.com/luxas)) +* Kubectl uses openapi for validation. If OpenAPI is not available on the server, it defaults back to the old Swagger. ([#50546](https://github.com/kubernetes/kubernetes/pull/50546), [@apelisse](https://github.com/apelisse)) +* kubectl show node role if defined ([#50438](https://github.com/kubernetes/kubernetes/pull/50438), [@dixudx](https://github.com/dixudx)) +* iSCSI volume plugin: iSCSI initiatorname support ([#48789](https://github.com/kubernetes/kubernetes/pull/48789), [@mtanino](https://github.com/mtanino)) +* On AttachDetachController node status update, do not retry when node doesn't exist but keep the node entry in cache. ([#50806](https://github.com/kubernetes/kubernetes/pull/50806), [@verult](https://github.com/verult)) +* Prevent unneeded endpoint updates ([#50934](https://github.com/kubernetes/kubernetes/pull/50934), [@joelsmith](https://github.com/joelsmith)) +* Affinity in annotations alpha feature is no longer supported in 1.8. Anyone upgrading from 1.7 with AffinityInAnnotation feature enabled must ensure pods (specifically with pod anti-affinity PreferredDuringSchedulingIgnoredDuringExecution) with empty TopologyKey fields must be removed before upgrading to 1.8. ([#49976](https://github.com/kubernetes/kubernetes/pull/49976), [@aveshagarwal](https://github.com/aveshagarwal)) +* NONE ([#50871](https://github.com/kubernetes/kubernetes/pull/50871), [@liyinan926](https://github.com/liyinan926)) +* - kubeadm now supports "ci/latest-1.8" or "ci-cross/latest-1.8" and similar labels. ([#49119](https://github.com/kubernetes/kubernetes/pull/49119), [@kad](https://github.com/kad)) +* kubeadm: Adds dry-run support for kubeadm using the `--dry-run` option ([#50631](https://github.com/kubernetes/kubernetes/pull/50631), [@luxas](https://github.com/luxas)) +* Change GCE installs (kube-up.sh) to use GCI/COS for node OS, by default. ([#46512](https://github.com/kubernetes/kubernetes/pull/46512), [@thockin](https://github.com/thockin)) +* Use CollisionCount for collision avoidance when creating ControllerRevisions in StatefulSet controller ([#50490](https://github.com/kubernetes/kubernetes/pull/50490), [@liyinan926](https://github.com/liyinan926)) +* AWS: Arbitrarily choose first (lexicographically) subnet in AZ ([#50255](https://github.com/kubernetes/kubernetes/pull/50255), [@mattlandis](https://github.com/mattlandis)) +* Change CollisionCount from int64 to int32 across controllers ([#50575](https://github.com/kubernetes/kubernetes/pull/50575), [@dixudx](https://github.com/dixudx)) +* fix GPU resource validation that incorrectly allows zero limits ([#50218](https://github.com/kubernetes/kubernetes/pull/50218), [@dixudx](https://github.com/dixudx)) +* The `kubernetes.io/created-by` annotation is now deprecated and will be removed in v1.9. Use [ControllerRef](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/controller-ref.md) instead to determine which controller, if any, owns an object. ([#50536](https://github.com/kubernetes/kubernetes/pull/50536), [@crimsonfaith91](https://github.com/crimsonfaith91)) +* Disable Docker's health check until we officially support it ([#50796](https://github.com/kubernetes/kubernetes/pull/50796), [@yguo0905](https://github.com/yguo0905)) +* Add ControllerRevision to apps/v1beta2 ([#50698](https://github.com/kubernetes/kubernetes/pull/50698), [@liyinan926](https://github.com/liyinan926)) +* StorageClass has a new field to configure reclaim policy of dynamically provisioned PVs. ([#47987](https://github.com/kubernetes/kubernetes/pull/47987), [@wongma7](https://github.com/wongma7)) +* Rerun init containers when the pod needs to be restarted ([#47599](https://github.com/kubernetes/kubernetes/pull/47599), [@yujuhong](https://github.com/yujuhong)) +* Resources outside the `*kubernetes.io` namespace are integers and cannot be over-committed. ([#48922](https://github.com/kubernetes/kubernetes/pull/48922), [@ConnorDoyle](https://github.com/ConnorDoyle)) +* apps/v1beta2 is enabled by default. DaemonSet, Deployment, ReplicaSet, and StatefulSet have been moved to this group version. ([#50643](https://github.com/kubernetes/kubernetes/pull/50643), [@kow3ns](https://github.com/kow3ns)) +* TLS cert storage for self-hosted clusters is now configurable. You can store them as secrets (alpha) or as usual host mounts. ([#50762](https://github.com/kubernetes/kubernetes/pull/50762), [@jamiehannaford](https://github.com/jamiehannaford)) +* Remove deprecated command 'kubectl stop' ([#46927](https://github.com/kubernetes/kubernetes/pull/46927), [@shiywang](https://github.com/shiywang)) +* Add new Prometheus metric that monitors the remaining lifetime of certificates used to authenticate requests to the API server. ([#50387](https://github.com/kubernetes/kubernetes/pull/50387), [@jcbsmpsn](https://github.com/jcbsmpsn)) +* Upgrade advanced audit to version v1beta1 ([#49115](https://github.com/kubernetes/kubernetes/pull/49115), [@CaoShuFeng](https://github.com/CaoShuFeng)) +* Cluster Autoscaler - fixes issues with taints and updates kube-proxy cpu request. ([#50514](https://github.com/kubernetes/kubernetes/pull/50514), [@mwielgus](https://github.com/mwielgus)) +* fluentd-elasticsearch addon: change the fluentd base image to fix crashes on systems with non-standard systemd installation ([#50679](https://github.com/kubernetes/kubernetes/pull/50679), [@aknuds1](https://github.com/aknuds1)) +* advanced audit: shutdown batching audit webhook gracefully ([#50577](https://github.com/kubernetes/kubernetes/pull/50577), [@crassirostris](https://github.com/crassirostris)) +* Add Priority admission controller for monitoring and resolving PriorityClasses. ([#49322](https://github.com/kubernetes/kubernetes/pull/49322), [@bsalamat](https://github.com/bsalamat)) +* apiservers: add synchronous shutdown mechanism on SIGTERM+INT ([#50439](https://github.com/kubernetes/kubernetes/pull/50439), [@sttts](https://github.com/sttts)) +* Fix kubernetes-worker charm hook failure when applying labels ([#50633](https://github.com/kubernetes/kubernetes/pull/50633), [@Cynerva](https://github.com/Cynerva)) +* kubeadm: Implementing the controlplane phase ([#50302](https://github.com/kubernetes/kubernetes/pull/50302), [@fabriziopandini](https://github.com/fabriziopandini)) +* Refactor addons into multiple packages ([#50214](https://github.com/kubernetes/kubernetes/pull/50214), [@andrewrynhard](https://github.com/andrewrynhard)) +* Kubelet now manages `/etc/hosts` file for both hostNetwork Pods and non-hostNetwork Pods. ([#49140](https://github.com/kubernetes/kubernetes/pull/49140), [@rickypai](https://github.com/rickypai)) +* After 1.8, admission controller will add 'MemoryPressure' toleration to Guaranteed and Burstable pods. ([#50180](https://github.com/kubernetes/kubernetes/pull/50180), [@k82cn](https://github.com/k82cn)) +* A new predicates, named 'CheckNodeCondition', was added to replace node condition filter. 'NetworkUnavailable', 'OutOfDisk' and 'NotReady' maybe reported as a reason when failed to schedule pods. ([#50362](https://github.com/kubernetes/kubernetes/pull/50362), [@k82cn](https://github.com/k82cn)) +* fix apps DeploymentSpec conversion issue ([#49719](https://github.com/kubernetes/kubernetes/pull/49719), [@dixudx](https://github.com/dixudx)) +* fluentd-gcp addon: Fix a bug in the event-exporter, when repeated events were not sent to Stackdriver. ([#50511](https://github.com/kubernetes/kubernetes/pull/50511), [@crassirostris](https://github.com/crassirostris)) +* not allowing "kubectl edit " when you got an empty list ([#50205](https://github.com/kubernetes/kubernetes/pull/50205), [@dixudx](https://github.com/dixudx)) +* NONE ([#49025](https://github.com/kubernetes/kubernetes/pull/49025), [@danwinship](https://github.com/danwinship)) +* fixes kubefed's ability to create RBAC roles in version-skewed clusters ([#50537](https://github.com/kubernetes/kubernetes/pull/50537), [@liggitt](https://github.com/liggitt)) +* API server authentication now caches successful bearer token authentication results for a few seconds. ([#50258](https://github.com/kubernetes/kubernetes/pull/50258), [@liggitt](https://github.com/liggitt)) +* Added field CollisionCount to StatefulSetStatus in both apps/v1beta1 and apps/v1beta2 ([#49983](https://github.com/kubernetes/kubernetes/pull/49983), [@liyinan926](https://github.com/liyinan926)) +* FC volume plugin: Support WWID for volume identifier ([#48741](https://github.com/kubernetes/kubernetes/pull/48741), [@mtanino](https://github.com/mtanino)) +* kubeadm: added enhanced TLS validation for token-based discovery in `kubeadm join` using a new `--discovery-token-ca-cert-hash` flag. ([#49520](https://github.com/kubernetes/kubernetes/pull/49520), [@mattmoyer](https://github.com/mattmoyer)) +* federation: Support for leader-election among federation controller-manager instances introduced. ([#46090](https://github.com/kubernetes/kubernetes/pull/46090), [@shashidharatd](https://github.com/shashidharatd)) +* New get-kube.sh option: KUBERNETES_SKIP_RELEASE_VALIDATION ([#50391](https://github.com/kubernetes/kubernetes/pull/50391), [@pipejakob](https://github.com/pipejakob)) +* Azure: Allow VNet to be in a separate Resource Group. ([#49725](https://github.com/kubernetes/kubernetes/pull/49725), [@sylr](https://github.com/sylr)) +* fix bug when azure cloud provider configuration file is not specified ([#49283](https://github.com/kubernetes/kubernetes/pull/49283), [@dixudx](https://github.com/dixudx)) +* The `rbac.authorization.k8s.io/v1beta1` API has been promoted to `rbac.authorization.k8s.io/v1` with no changes. ([#49642](https://github.com/kubernetes/kubernetes/pull/49642), [@liggitt](https://github.com/liggitt)) + * The `rbac.authorization.k8s.io/v1alpha1` version is deprecated and will be removed in a future release. +* Fix an issue where if a CSR is not approved initially by the SAR approver is not retried. ([#49788](https://github.com/kubernetes/kubernetes/pull/49788), [@mikedanese](https://github.com/mikedanese)) +* The v1.Service.PublishNotReadyAddresses field is added to notify DNS addons to publish the notReadyAddresses of Enpdoints. The "service.alpha.kubernetes.io/tolerate-unready-endpoints" annotation has been deprecated and will be removed when clients have sufficient time to consume the field. ([#49061](https://github.com/kubernetes/kubernetes/pull/49061), [@kow3ns](https://github.com/kow3ns)) +* vSphere cloud provider: vSphere cloud provider code refactoring ([#49164](https://github.com/kubernetes/kubernetes/pull/49164), [@BaluDontu](https://github.com/BaluDontu)) +* `cluster/gke` has been removed. GKE end-to-end testing should be done using `kubetest --deployment=gke` ([#50338](https://github.com/kubernetes/kubernetes/pull/50338), [@zmerlynn](https://github.com/zmerlynn)) +* kubeadm: Upload configuration used at 'kubeadm init' time to ConfigMap for easier upgrades ([#50320](https://github.com/kubernetes/kubernetes/pull/50320), [@luxas](https://github.com/luxas)) +* Adds (alpha feature) the ability to dynamically configure Kubelets by enabling the DynamicKubeletConfig feature gate, posting a ConfigMap to the API server, and setting the spec.configSource field on Node objects. See the proposal at https://github.com/kubernetes/community/blob/master/contributors/design-proposals/dynamic-kubelet-configuration.md for details. ([#46254](https://github.com/kubernetes/kubernetes/pull/46254), [@mtaufen](https://github.com/mtaufen)) +* Remove deprecated ScheduledJobs endpoints, use CronJobs instead. ([#49930](https://github.com/kubernetes/kubernetes/pull/49930), [@soltysh](https://github.com/soltysh)) +* [Federation] Make the hpa scale time window configurable ([#49583](https://github.com/kubernetes/kubernetes/pull/49583), [@irfanurrehman](https://github.com/irfanurrehman)) +* fuse daemons for GlusterFS and CephFS are now run in their own systemd scope when Kubernetes runs on a system with systemd. ([#49640](https://github.com/kubernetes/kubernetes/pull/49640), [@jsafrane](https://github.com/jsafrane)) +* `kubectl proxy` will now correctly handle the `exec`, `attach`, and `portforward` commands. You must pass `--disable-filter` to the command in order to allow these endpoints. ([#49534](https://github.com/kubernetes/kubernetes/pull/49534), [@smarterclayton](https://github.com/smarterclayton)) +* Copy annotations from a StatefulSet's metadata to the ControllerRevisions it owns ([#50263](https://github.com/kubernetes/kubernetes/pull/50263), [@liyinan926](https://github.com/liyinan926)) +* Make rolling update the default update strategy for v1beta2.DaemonSet and v1beta2.StatefulSet ([#50175](https://github.com/kubernetes/kubernetes/pull/50175), [@foxish](https://github.com/foxish)) +* Deprecate Deployment .spec.rollbackTo field ([#49340](https://github.com/kubernetes/kubernetes/pull/49340), [@janetkuo](https://github.com/janetkuo)) +* Collect metrics from Heapster in Stackdriver mode. ([#50290](https://github.com/kubernetes/kubernetes/pull/50290), [@piosz](https://github.com/piosz)) +* N/A ([#50179](https://github.com/kubernetes/kubernetes/pull/50179), [@k82cn](https://github.com/k82cn)) +* [Federation] HPA controller ([#45993](https://github.com/kubernetes/kubernetes/pull/45993), [@irfanurrehman](https://github.com/irfanurrehman)) +* Relax restrictions on environment variable names. ([#48986](https://github.com/kubernetes/kubernetes/pull/48986), [@timoreimann](https://github.com/timoreimann)) +* The node condition 'NodeInodePressure' was removed, as kubelet did not report it. ([#50124](https://github.com/kubernetes/kubernetes/pull/50124), [@k82cn](https://github.com/k82cn)) +* Fix premature return ([#49834](https://github.com/kubernetes/kubernetes/pull/49834), [@guoshimin](https://github.com/guoshimin)) +* StatefulSet uses scale subresource when scaling in accord with ReplicationController, ReplicaSet, and Deployment implementations. ([#49168](https://github.com/kubernetes/kubernetes/pull/49168), [@crimsonfaith91](https://github.com/crimsonfaith91)) +* Feature gates now determine whether a cluster is self-hosted. For more information, see the FeatureGates configuration flag. ([#50241](https://github.com/kubernetes/kubernetes/pull/50241), [@jamiehannaford](https://github.com/jamiehannaford)) +* Updates Cinder AttachDisk operation to be more reliable by delegating Detaches to volume manager. ([#50042](https://github.com/kubernetes/kubernetes/pull/50042), [@jingxu97](https://github.com/jingxu97)) +* add fieldSelector podIP ([#50091](https://github.com/kubernetes/kubernetes/pull/50091), [@dixudx](https://github.com/dixudx)) +* Return Audit-Id http response header for trouble shooting ([#49377](https://github.com/kubernetes/kubernetes/pull/49377), [@CaoShuFeng](https://github.com/CaoShuFeng)) +* Status objects for 404 API errors will have the correct APIVersion ([#49868](https://github.com/kubernetes/kubernetes/pull/49868), [@shiywang](https://github.com/shiywang)) +* Fix incorrect retry logic in scheduler ([#50106](https://github.com/kubernetes/kubernetes/pull/50106), [@julia-stripe](https://github.com/julia-stripe)) +* Enforce explicit references to API group client interfaces in clientsets to avoid ambiguity. ([#49370](https://github.com/kubernetes/kubernetes/pull/49370), [@sttts](https://github.com/sttts)) +* update dashboard image version ([#49855](https://github.com/kubernetes/kubernetes/pull/49855), [@zouyee](https://github.com/zouyee)) +* kubeadm: Implementing the kubeconfig phase fully ([#49419](https://github.com/kubernetes/kubernetes/pull/49419), [@fabriziopandini](https://github.com/fabriziopandini)) +* fixes a bug around using the Global config ElbSecurityGroup where Kuberentes would modify the passed in Security Group. ([#49805](https://github.com/kubernetes/kubernetes/pull/49805), [@nbutton23](https://github.com/nbutton23)) +* Fluentd DaemonSet in the fluentd-elasticsearch addon is configured via ConfigMap and includes journald plugin ([#50082](https://github.com/kubernetes/kubernetes/pull/50082), [@crassirostris](https://github.com/crassirostris)) + * Elasticsearch StatefulSet in the fluentd-elasticsearch addon uses local storage instead of PVC by default +* Add possibility to use multiple floatingip pools in openstack loadbalancer ([#49697](https://github.com/kubernetes/kubernetes/pull/49697), [@zetaab](https://github.com/zetaab)) +* The 504 timeout error was returning a JSON error body that indicated it was a 500. The body contents now correctly report a 500 error. ([#49678](https://github.com/kubernetes/kubernetes/pull/49678), [@smarterclayton](https://github.com/smarterclayton)) +* add examples for kubectl run --labels ([#49862](https://github.com/kubernetes/kubernetes/pull/49862), [@dixudx](https://github.com/dixudx)) +* Kubelet will by default fail with swap enabled from now on. The experimental flag "--experimental-fail-swap-on" has been deprecated, please set the new "--fail-swap-on" flag to false if you wish to run with /proc/swaps on. ([#47181](https://github.com/kubernetes/kubernetes/pull/47181), [@dims](https://github.com/dims)) +* Fix bug in scheduler that caused initially unschedulable pods to stuck in Pending state forever. ([#50028](https://github.com/kubernetes/kubernetes/pull/50028), [@julia-stripe](https://github.com/julia-stripe)) +* GCE: Bump GLBC version to 0.9.6 ([#50096](https://github.com/kubernetes/kubernetes/pull/50096), [@nicksardo](https://github.com/nicksardo)) +* Remove 0,1,3 from rand.String, to avoid 'bad words' ([#50070](https://github.com/kubernetes/kubernetes/pull/50070), [@dixudx](https://github.com/dixudx)) +* Fix data race during addition of new CRD ([#50098](https://github.com/kubernetes/kubernetes/pull/50098), [@nikhita](https://github.com/nikhita)) +* Do not try to run preStopHook when the gracePeriod is 0 ([#49449](https://github.com/kubernetes/kubernetes/pull/49449), [@dhilipkumars](https://github.com/dhilipkumars)) +* The SubjectAccessReview API in the authorization.k8s.io API group now allows providing the user uid. ([#49677](https://github.com/kubernetes/kubernetes/pull/49677), [@dims](https://github.com/dims)) +* Increase default value of apps/v1beta2 DeploymentSpec.RevisionHistoryLimit to 10 ([#49924](https://github.com/kubernetes/kubernetes/pull/49924), [@dixudx](https://github.com/dixudx)) +* Upgrade Elasticsearch/Kibana to 5.5.1 in fluentd-elasticsearch addon ([#48722](https://github.com/kubernetes/kubernetes/pull/48722), [@aknuds1](https://github.com/aknuds1)) + * Switch to basing our image of Elasticsearch in fluentd-elasticsearch addon off the official one + * Switch to the official image of Kibana in fluentd-elasticsearch addon + * Use StatefulSet for Elasticsearch instead of ReplicationController, with persistent volume claims + * Require authenticating towards Elasticsearch, as Elasticsearch 5.5 by default requires basic authentication +* Rebase hyperkube image on debian-hyperkube-base, based on debian-base. ([#48365](https://github.com/kubernetes/kubernetes/pull/48365), [@ixdy](https://github.com/ixdy)) +* change apps/v1beta2 StatefulSet observedGeneration (optional field) from a pointer to an int for consistency ([#49607](https://github.com/kubernetes/kubernetes/pull/49607), [@dixudx](https://github.com/dixudx)) +* After a kubelet rotates its client cert, it now closes its connections to the API server to force a handshake using the new cert. Previously, the kubelet could keep its existing connection open, even if the cert used for that connection was expired and rejected by the API server. ([#49899](https://github.com/kubernetes/kubernetes/pull/49899), [@ericchiang](https://github.com/ericchiang)) +* Improve our Instance Metadata coverage in Azure. ([#49237](https://github.com/kubernetes/kubernetes/pull/49237), [@brendandburns](https://github.com/brendandburns)) +* Add etcd connectivity endpoint to healthz ([#49412](https://github.com/kubernetes/kubernetes/pull/49412), [@bjhaid](https://github.com/bjhaid)) +* kube-proxy will emit "FailedToStartNodeHealthcheck" event when fails to start healthz server. ([#49267](https://github.com/kubernetes/kubernetes/pull/49267), [@MrHohn](https://github.com/MrHohn)) +* Fixed a bug in the API server watch cache, which could cause a missing watch event immediately after cache initialization. ([#49992](https://github.com/kubernetes/kubernetes/pull/49992), [@liggitt](https://github.com/liggitt)) +* Enforcement of fsGroup; enable ScaleIO multiple-instance volume mapping; default PVC capacity; alignment of PVC, PV, and volume names for dynamic provisioning ([#48999](https://github.com/kubernetes/kubernetes/pull/48999), [@vladimirvivien](https://github.com/vladimirvivien)) +* In GCE, add measures to prevent corruption of known_tokens.csv. ([#49897](https://github.com/kubernetes/kubernetes/pull/49897), [@mikedanese](https://github.com/mikedanese)) +* kubeadm: Fix join preflight check false negative ([#49825](https://github.com/kubernetes/kubernetes/pull/49825), [@erhudy](https://github.com/erhudy)) +* route_controller will emit "FailedToCreateRoute" event when fails to create route. ([#49821](https://github.com/kubernetes/kubernetes/pull/49821), [@MrHohn](https://github.com/MrHohn)) +* Fix incorrect parsing of io_priority in Portworx volume StorageClass and add support for new paramters. ([#49526](https://github.com/kubernetes/kubernetes/pull/49526), [@harsh-px](https://github.com/harsh-px)) +* The API Server now automatically creates RBAC ClusterRoles for CSR approving. ([#49284](https://github.com/kubernetes/kubernetes/pull/49284), [@luxas](https://github.com/luxas)) + * Each deployment method should bind users/groups to the ClusterRoles if they are using this feature. +* Adds AllowPrivilegeEscalation to control whether a process can gain more privileges than it's parent process ([#47019](https://github.com/kubernetes/kubernetes/pull/47019), [@jessfraz](https://github.com/jessfraz)) +* `hack/local-up-cluster.sh` now enables the Node authorizer by default. Authorization modes can be overridden with the `AUTHORIZATION_MODE` environment variable, and the `ENABLE_RBAC` environment variable is no longer used. ([#49812](https://github.com/kubernetes/kubernetes/pull/49812), [@liggitt](https://github.com/liggitt)) +* rename stop.go file to delete.go to avoid confusion ([#49533](https://github.com/kubernetes/kubernetes/pull/49533), [@dixudx](https://github.com/dixudx)) +* Adding option to set the federation api server port if nodeport is set ([#46283](https://github.com/kubernetes/kubernetes/pull/46283), [@ktsakalozos](https://github.com/ktsakalozos)) +* The garbage collector now supports custom APIs added via CustomResourceDefinition or aggregated apiservers. Note that the garbage collector controller refreshes periodically, so there is a latency between when the API is added and when the garbage collector starts to manage it. ([#47665](https://github.com/kubernetes/kubernetes/pull/47665), [@ironcladlou](https://github.com/ironcladlou)) +* set the juju master charm state to blocked if the services appear to be failing ([#49717](https://github.com/kubernetes/kubernetes/pull/49717), [@wwwtyro](https://github.com/wwwtyro)) +* keep-terminated-pod-volumes flag on kubelet is deprecated. ([#47539](https://github.com/kubernetes/kubernetes/pull/47539), [@gnufied](https://github.com/gnufied)) +* kubectl describe podsecuritypolicy describes all fields. ([#45813](https://github.com/kubernetes/kubernetes/pull/45813), [@xilabao](https://github.com/xilabao)) +* Added flag support to kubectl plugins ([#47267](https://github.com/kubernetes/kubernetes/pull/47267), [@fabianofranz](https://github.com/fabianofranz)) +* Adding metrics support to local volume ([#49598](https://github.com/kubernetes/kubernetes/pull/49598), [@sbezverk](https://github.com/sbezverk)) +* Bug fix: Parsing of `--requestheader-group-headers` in requests should be case-insensitive. ([#49219](https://github.com/kubernetes/kubernetes/pull/49219), [@jmillikin-stripe](https://github.com/jmillikin-stripe)) +* Fix instance metadata service URL. ([#49081](https://github.com/kubernetes/kubernetes/pull/49081), [@brendandburns](https://github.com/brendandburns)) +* Add a new API object apps/v1beta2.ReplicaSet ([#49238](https://github.com/kubernetes/kubernetes/pull/49238), [@janetkuo](https://github.com/janetkuo)) +* fix pdb validation bug on PodDisruptionBudgetSpec ([#48706](https://github.com/kubernetes/kubernetes/pull/48706), [@dixudx](https://github.com/dixudx)) +* Revert deprecation of vCenter port in vSphere Cloud Provider. ([#49689](https://github.com/kubernetes/kubernetes/pull/49689), [@divyenpatel](https://github.com/divyenpatel)) +* Rev version of Calico's Typha daemon used in add-on to v0.2.3 to pull in bug-fixes. ([#48469](https://github.com/kubernetes/kubernetes/pull/48469), [@fasaxc](https://github.com/fasaxc)) +* set default adminid for rbd deleter if unset ([#49271](https://github.com/kubernetes/kubernetes/pull/49271), [@dixudx](https://github.com/dixudx)) +* Adding type apps/v1beta2.DaemonSet ([#49071](https://github.com/kubernetes/kubernetes/pull/49071), [@foxish](https://github.com/foxish)) +* Fix nil value issue when creating json patch for merge ([#49259](https://github.com/kubernetes/kubernetes/pull/49259), [@dixudx](https://github.com/dixudx)) +* Adds metrics for checking reflector health. ([#48224](https://github.com/kubernetes/kubernetes/pull/48224), [@deads2k](https://github.com/deads2k)) +* remove deads2k from volume reviewer ([#49566](https://github.com/kubernetes/kubernetes/pull/49566), [@deads2k](https://github.com/deads2k)) +* Unify genclient tags and add more fine control on verbs generated ([#49192](https://github.com/kubernetes/kubernetes/pull/49192), [@mfojtik](https://github.com/mfojtik)) +* kubeadm: Fixes a small bug where `--config` and `--skip-*` flags couldn't be passed at the same time in validation. ([#49498](https://github.com/kubernetes/kubernetes/pull/49498), [@luxas](https://github.com/luxas)) +* Remove depreciated flags: --low-diskspace-threshold-mb and --outofdisk-transition-frequency, which are replaced by --eviction-hard ([#48846](https://github.com/kubernetes/kubernetes/pull/48846), [@dashpole](https://github.com/dashpole)) +* Fixed OpenAPI Description and Nickname of API objects with subresources ([#49357](https://github.com/kubernetes/kubernetes/pull/49357), [@mbohlool](https://github.com/mbohlool)) +* set RBD default values as constant vars ([#49274](https://github.com/kubernetes/kubernetes/pull/49274), [@dixudx](https://github.com/dixudx)) +* Fix a bug with binding mount directories and files using flexVolumes ([#49118](https://github.com/kubernetes/kubernetes/pull/49118), [@adelton](https://github.com/adelton)) +* PodPreset is not injected if conflict occurs while applying PodPresets to a Pod. ([#47864](https://github.com/kubernetes/kubernetes/pull/47864), [@droot](https://github.com/droot)) +* `kubectl drain` no longer spins trying to delete pods that do not exist ([#49444](https://github.com/kubernetes/kubernetes/pull/49444), [@eparis](https://github.com/eparis)) +* Support specifying of FSType in StorageClass ([#45345](https://github.com/kubernetes/kubernetes/pull/45345), [@codablock](https://github.com/codablock)) +* The NodeRestriction admission plugin now allows a node to evict pods bound to itself ([#48707](https://github.com/kubernetes/kubernetes/pull/48707), [@danielfm](https://github.com/danielfm)) +* more robust stat handling from ceph df output in the kubernetes-master charm create-rbd-pv action ([#49394](https://github.com/kubernetes/kubernetes/pull/49394), [@wwwtyro](https://github.com/wwwtyro)) +* added cronjobs.batch to all, so kubectl get all returns them. ([#49326](https://github.com/kubernetes/kubernetes/pull/49326), [@deads2k](https://github.com/deads2k)) +* Update status to show failing services. ([#49296](https://github.com/kubernetes/kubernetes/pull/49296), [@ktsakalozos](https://github.com/ktsakalozos)) +* Fixes [#49418](https://github.com/kubernetes/kubernetes/pull/49418) where kube-controller-manager can panic on volume.CanSupport methods and enter a crash loop. ([#49420](https://github.com/kubernetes/kubernetes/pull/49420), [@gnufied](https://github.com/gnufied)) +* Add a new API version apps/v1beta2 ([#48746](https://github.com/kubernetes/kubernetes/pull/48746), [@janetkuo](https://github.com/janetkuo)) +* Websocket requests to aggregated APIs now perform TLS verification using the service DNS name instead of the backend server's IP address, consistent with non-websocket requests. ([#49353](https://github.com/kubernetes/kubernetes/pull/49353), [@liggitt](https://github.com/liggitt)) +* kubeadm: Don't set a specific `spc_t` SELinux label on the etcd Static Pod as that is more privs than etcd needs and due to that `spc_t` isn't compatible with some OSes. ([#49328](https://github.com/kubernetes/kubernetes/pull/49328), [@euank](https://github.com/euank)) +* GCE Cloud Provider: New created LoadBalancer type Service will have health checks for nodes by default if all nodes have version >= v1.7.2. ([#49330](https://github.com/kubernetes/kubernetes/pull/49330), [@MrHohn](https://github.com/MrHohn)) +* hack/local-up-cluster.sh now enables RBAC authorization by default ([#49323](https://github.com/kubernetes/kubernetes/pull/49323), [@mtanino](https://github.com/mtanino)) +* Use port 20256 for node-problem-detector in standalone mode. ([#49316](https://github.com/kubernetes/kubernetes/pull/49316), [@ajitak](https://github.com/ajitak)) +* Fixed unmounting of vSphere volumes when kubelet runs in a container. ([#49111](https://github.com/kubernetes/kubernetes/pull/49111), [@jsafrane](https://github.com/jsafrane)) +* use informers for quota evaluation of core resources where possible ([#49230](https://github.com/kubernetes/kubernetes/pull/49230), [@deads2k](https://github.com/deads2k)) +* additional backoff in azure cloudprovider ([#48967](https://github.com/kubernetes/kubernetes/pull/48967), [@jackfrancis](https://github.com/jackfrancis)) +* allow impersonate serviceaccount in cli ([#48253](https://github.com/kubernetes/kubernetes/pull/48253), [@CaoShuFeng](https://github.com/CaoShuFeng)) +* Add PriorityClass API object under new "scheduling" API group ([#48377](https://github.com/kubernetes/kubernetes/pull/48377), [@bsalamat](https://github.com/bsalamat)) +* None ([#45319](https://github.com/kubernetes/kubernetes/pull/45319), [@ericchiang](https://github.com/ericchiang)) +* Added golint check for pkg/kubelet. ([#47316](https://github.com/kubernetes/kubernetes/pull/47316), [@k82cn](https://github.com/k82cn)) +* azure: acr: support MSI with preview ACR with AAD auth ([#48981](https://github.com/kubernetes/kubernetes/pull/48981), [@colemickens](https://github.com/colemickens)) +* Set default CIDR to /16 for Juju deployments ([#49182](https://github.com/kubernetes/kubernetes/pull/49182), [@ktsakalozos](https://github.com/ktsakalozos)) +* Fix pod preset to ignore input pod namespace in favor of request namespace ([#49120](https://github.com/kubernetes/kubernetes/pull/49120), [@jpeeler](https://github.com/jpeeler)) +* None ([#48983](https://github.com/kubernetes/kubernetes/pull/48983), [@k82cn](https://github.com/k82cn)) +* Previously a deleted bootstrapping token secret would be considered valid until it was reaped. Now it is invalid as soon as the deletionTimestamp is set. ([#49057](https://github.com/kubernetes/kubernetes/pull/49057), [@ericchiang](https://github.com/ericchiang)) +* Set default snap channel on charms to 1.7 stable ([#48874](https://github.com/kubernetes/kubernetes/pull/48874), [@ktsakalozos](https://github.com/ktsakalozos)) +* prevent unsetting of nonexistent previous port in kubeapi-load-balancer charm ([#49033](https://github.com/kubernetes/kubernetes/pull/49033), [@wwwtyro](https://github.com/wwwtyro)) +* kubeadm: Make kube-proxy tolerate the external cloud provider taint so that an external cloud provider can be easily used on top of kubeadm ([#49017](https://github.com/kubernetes/kubernetes/pull/49017), [@luxas](https://github.com/luxas)) +* Fix Pods using Portworx volumes getting stuck in ContainerCreating phase. ([#48898](https://github.com/kubernetes/kubernetes/pull/48898), [@harsh-px](https://github.com/harsh-px)) +* hpa: Prevent scaling below MinReplicas if desiredReplicas is zero ([#48997](https://github.com/kubernetes/kubernetes/pull/48997), [@johanneswuerbach](https://github.com/johanneswuerbach)) +* Kubelet CRI: move seccomp from annotations to security context. ([#46332](https://github.com/kubernetes/kubernetes/pull/46332), [@feiskyer](https://github.com/feiskyer)) +* Never prevent deletion of resources as part of namespace lifecycle ([#48733](https://github.com/kubernetes/kubernetes/pull/48733), [@liggitt](https://github.com/liggitt)) +* The generic RESTClient type (`k8s.io/client-go/rest`) no longer exposes `LabelSelectorParam` or `FieldSelectorParam` methods - use `VersionedParams` with `metav1.ListOptions` instead. The `UintParam` method has been removed. The `timeout` parameter will no longer cause an error when using `Param()`. ([#48991](https://github.com/kubernetes/kubernetes/pull/48991), [@smarterclayton](https://github.com/smarterclayton)) +* Support completion for kubectl config delete-cluster ([#48381](https://github.com/kubernetes/kubernetes/pull/48381), [@superbrothers](https://github.com/superbrothers)) +* Could get the patch from kubectl edit command ([#46091](https://github.com/kubernetes/kubernetes/pull/46091), [@xilabao](https://github.com/xilabao)) +* Added scheduler integration test owners. ([#46930](https://github.com/kubernetes/kubernetes/pull/46930), [@k82cn](https://github.com/k82cn)) +* `kubectl run` learned how to set a service account name in the generated pod spec with the `--serviceaccount` flag. ([#46318](https://github.com/kubernetes/kubernetes/pull/46318), [@liggitt](https://github.com/liggitt)) +* Fix share name generation in azure file provisioner. ([#48326](https://github.com/kubernetes/kubernetes/pull/48326), [@karataliu](https://github.com/karataliu)) +* Fixed a bug where a jsonpath filter would return an error if one of the items being evaluated did not contain all of the nested elements in the filter query. ([#47846](https://github.com/kubernetes/kubernetes/pull/47846), [@ncdc](https://github.com/ncdc)) +* Uses the port config option in the kubeapi-load-balancer charm. ([#48958](https://github.com/kubernetes/kubernetes/pull/48958), [@wwwtyro](https://github.com/wwwtyro)) +* azure: support retrieving access tokens via managed identity extension ([#48854](https://github.com/kubernetes/kubernetes/pull/48854), [@colemickens](https://github.com/colemickens)) +* Add a runtime warning about the kubeadm default token TTL changes. ([#48838](https://github.com/kubernetes/kubernetes/pull/48838), [@mattmoyer](https://github.com/mattmoyer)) +* Azure PD (Managed/Blob) ([#46360](https://github.com/kubernetes/kubernetes/pull/46360), [@khenidak](https://github.com/khenidak)) +* Redirect all examples README to the the kubernetes/examples repo ([#46362](https://github.com/kubernetes/kubernetes/pull/46362), [@sebgoa](https://github.com/sebgoa)) +* Fix a regression that broke the `--config` flag for `kubeadm init`. ([#48915](https://github.com/kubernetes/kubernetes/pull/48915), [@mattmoyer](https://github.com/mattmoyer)) +* Fluentd-gcp DaemonSet exposes different set of metrics. ([#48812](https://github.com/kubernetes/kubernetes/pull/48812), [@crassirostris](https://github.com/crassirostris)) +* MountPath should be absolute ([#48815](https://github.com/kubernetes/kubernetes/pull/48815), [@dixudx](https://github.com/dixudx)) +* Updated comments of func in testapi. ([#48407](https://github.com/kubernetes/kubernetes/pull/48407), [@k82cn](https://github.com/k82cn)) +* Fix service controller crash loop when Service with GCP LoadBalancer uses static IP ([#48848](https://github.com/kubernetes/kubernetes/pull/48848), [@nicksardo](https://github.com/nicksardo)) ([#48849](https://github.com/kubernetes/kubernetes/pull/48849), [@nicksardo](https://github.com/nicksardo)) +* Fix pods failing to start when subPath is a dangling symlink from kubelet point of view, which can happen if it is running inside a container ([#48555](https://github.com/kubernetes/kubernetes/pull/48555), [@redbaron](https://github.com/redbaron)) +* Add initial support for the Azure instance metadata service. ([#48243](https://github.com/kubernetes/kubernetes/pull/48243), [@brendandburns](https://github.com/brendandburns)) +* Added new flag to `kubeadm init`: --node-name, that lets you specify the name of the Node object that will be created ([#48594](https://github.com/kubernetes/kubernetes/pull/48594), [@GheRivero](https://github.com/GheRivero)) +* Added pod evictors for new zone. ([#47952](https://github.com/kubernetes/kubernetes/pull/47952), [@k82cn](https://github.com/k82cn)) +* kube-up and kubemark will default to using cos (GCI) images for nodes. ([#48279](https://github.com/kubernetes/kubernetes/pull/48279), [@abgworrall](https://github.com/abgworrall)) + * The previous default was container-vm (CVM, "debian"), which is deprecated. + * If you need to explicitly use container-vm for some reason, you should set + * KUBE_NODE_OS_DISTRIBUTION=debian +* kubectl: Fix bug that showed terminated/evicted pods even without `--show-all`. ([#48786](https://github.com/kubernetes/kubernetes/pull/48786), [@janetkuo](https://github.com/janetkuo)) +* Fixed GlusterFS volumes taking too long to time out ([#48709](https://github.com/kubernetes/kubernetes/pull/48709), [@jsafrane](https://github.com/jsafrane)) + + + # v1.6.9 [Documentation](https://docs.k8s.io) & [Examples](https://releases.k8s.io/release-1.6/examples) From 15b9871d509f40cc530062da8f6a1033fd53324f Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Wed, 23 Aug 2017 09:34:09 +0800 Subject: [PATCH 262/403] Allow remote runtimes to pass apparmor host validation --- pkg/security/apparmor/validate.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/security/apparmor/validate.go b/pkg/security/apparmor/validate.go index 1036a43b3d533..13788876fb6a0 100644 --- a/pkg/security/apparmor/validate.go +++ b/pkg/security/apparmor/validate.go @@ -111,8 +111,8 @@ func validateHost(runtime string) error { } // Check runtime support. Currently only Docker is supported. - if runtime != "docker" { - return fmt.Errorf("AppArmor is only enabled for 'docker' runtime. Found: %q.", runtime) + if runtime != "docker" && runtime != "remote" { + return fmt.Errorf("AppArmor is only enabled for 'docker' and 'remote' runtimes. Found: %q.", runtime) } return nil From a7fd545d49cf55773363150ff406a7b6b3337d7e Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Tue, 22 Aug 2017 10:49:24 +0800 Subject: [PATCH 263/403] clean up LocalPort in proxier.go --- pkg/proxy/iptables/BUILD | 1 + pkg/proxy/iptables/proxier.go | 84 +++++++-------------- pkg/proxy/iptables/proxier_test.go | 98 ++---------------------- pkg/proxy/util/BUILD | 2 + pkg/proxy/util/port.go | 64 ++++++++++++++++ pkg/proxy/util/port_test.go | 116 +++++++++++++++++++++++++++++ 6 files changed, 214 insertions(+), 151 deletions(-) create mode 100644 pkg/proxy/util/port.go create mode 100644 pkg/proxy/util/port_test.go diff --git a/pkg/proxy/iptables/BUILD b/pkg/proxy/iptables/BUILD index e6c45650b382e..ac49fb2093e47 100644 --- a/pkg/proxy/iptables/BUILD +++ b/pkg/proxy/iptables/BUILD @@ -43,6 +43,7 @@ go_test( deps = [ "//pkg/api:go_default_library", "//pkg/proxy:go_default_library", + "//pkg/proxy/util:go_default_library", "//pkg/util/async:go_default_library", "//pkg/util/iptables:go_default_library", "//pkg/util/iptables/testing:go_default_library", diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 6f2e666842771..3ba5dcd0c624c 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -369,7 +369,7 @@ type Proxier struct { mu sync.Mutex // protects the following fields serviceMap proxyServiceMap endpointsMap proxyEndpointsMap - portsMap map[localPort]closeable + portsMap map[utilproxy.LocalPort]utilproxy.Closeable // endpointsSynced and servicesSynced are set to true when corresponding // objects are synced after startup. This is used to avoid updating iptables // with some partial data after kube-proxy restart. @@ -386,7 +386,7 @@ type Proxier struct { clusterCIDR string hostname string nodeIP net.IP - portMapper portOpener + portMapper utilproxy.PortOpener recorder record.EventRecorder healthChecker healthcheck.Server healthzServer healthcheck.HealthzUpdater @@ -405,32 +405,11 @@ type Proxier struct { natRules *bytes.Buffer } -type localPort struct { - desc string - ip string - port int - protocol string -} - -func (lp *localPort) String() string { - return fmt.Sprintf("%q (%s:%d/%s)", lp.desc, lp.ip, lp.port, lp.protocol) -} - -type closeable interface { - Close() error -} - -// portOpener is an interface around port opening/closing. -// Abstracted out for testing. -type portOpener interface { - OpenLocalPort(lp *localPort) (closeable, error) -} - // listenPortOpener opens ports by calling bind() and listen(). type listenPortOpener struct{} // OpenLocalPort holds the given local port open. -func (l *listenPortOpener) OpenLocalPort(lp *localPort) (closeable, error) { +func (l *listenPortOpener) OpenLocalPort(lp *utilproxy.LocalPort) (utilproxy.Closeable, error) { return openLocalPort(lp) } @@ -491,7 +470,7 @@ func NewProxier(ipt utiliptables.Interface, healthChecker := healthcheck.NewServer(hostname, recorder, nil, nil) // use default implementations of deps proxier := &Proxier{ - portsMap: make(map[localPort]closeable), + portsMap: make(map[utilproxy.LocalPort]utilproxy.Closeable), serviceMap: make(proxyServiceMap), serviceChanges: newServiceChangeMap(), endpointsMap: make(proxyEndpointsMap), @@ -1126,7 +1105,7 @@ func (proxier *Proxier) syncProxyRules() { activeNATChains := map[utiliptables.Chain]bool{} // use a map as a set // Accumulate the set of local ports that we will be holding open once this update is complete - replacementPortsMap := map[localPort]closeable{} + replacementPortsMap := map[utilproxy.LocalPort]utilproxy.Closeable{} // We are creating those slices ones here to avoid memory reallocations // in every loop. Note that reuse the memory, instead of doing: @@ -1200,11 +1179,11 @@ func (proxier *Proxier) syncProxyRules() { if local, err := utilproxy.IsLocalIP(externalIP); err != nil { glog.Errorf("can't determine if IP is local, assuming not: %v", err) } else if local { - lp := localPort{ - desc: "externalIP for " + svcNameString, - ip: externalIP, - port: svcInfo.port, - protocol: protocol, + lp := utilproxy.LocalPort{ + Description: "externalIP for " + svcNameString, + IP: externalIP, + Port: svcInfo.port, + Protocol: protocol, } if proxier.portsMap[lp] != nil { glog.V(4).Infof("Port %s was open before and is still needed", lp.String()) @@ -1337,11 +1316,11 @@ func (proxier *Proxier) syncProxyRules() { if svcInfo.nodePort != 0 { // Hold the local port open so no other process can open it // (because the socket might open but it would never work). - lp := localPort{ - desc: "nodePort for " + svcNameString, - ip: "", - port: svcInfo.nodePort, - protocol: protocol, + lp := utilproxy.LocalPort{ + Description: "nodePort for " + svcNameString, + IP: "", + Port: svcInfo.nodePort, + Protocol: protocol, } if proxier.portsMap[lp] != nil { glog.V(4).Infof("Port %s was open before and is still needed", lp.String()) @@ -1352,14 +1331,14 @@ func (proxier *Proxier) syncProxyRules() { glog.Errorf("can't open %s, skipping this nodePort: %v", lp.String(), err) continue } - if lp.protocol == "udp" { + if lp.Protocol == "udp" { // TODO: We might have multiple services using the same port, and this will clear conntrack for all of them. // This is very low impact. The NodePort range is intentionally obscure, and unlikely to actually collide with real Services. // This only affects UDP connections, which are not common. // See issue: https://github.com/kubernetes/kubernetes/issues/49881 - err := utilproxy.ClearUDPConntrackForPort(proxier.exec, lp.port) + err := utilproxy.ClearUDPConntrackForPort(proxier.exec, lp.Port) if err != nil { - glog.Errorf("Failed to clear udp conntrack for port %d, error: %v", lp.port, err) + glog.Errorf("Failed to clear udp conntrack for port %d, error: %v", lp.Port, err) } } replacementPortsMap[lp] = socket @@ -1601,7 +1580,8 @@ func (proxier *Proxier) syncProxyRules() { } // Revert new local ports. - revertPorts(replacementPortsMap, proxier.portsMap) + glog.V(2).Infof("Closing local ports after iptables-restore failure") + utilproxy.RevertPorts(replacementPortsMap, proxier.portsMap) return } @@ -1651,7 +1631,7 @@ func writeLine(buf *bytes.Buffer, words ...string) { } } -func openLocalPort(lp *localPort) (closeable, error) { +func openLocalPort(lp *utilproxy.LocalPort) (utilproxy.Closeable, error) { // For ports on node IPs, open the actual port and hold it, even though we // use iptables to redirect traffic. // This ensures a) that it's safe to use that port and b) that (a) stays @@ -1664,16 +1644,16 @@ func openLocalPort(lp *localPort) (closeable, error) { // it. Tools like 'ss' and 'netstat' do not show sockets that are // bind()ed but not listen()ed, and at least the default debian netcat // has no way to avoid about 10 seconds of retries. - var socket closeable - switch lp.protocol { + var socket utilproxy.Closeable + switch lp.Protocol { case "tcp": - listener, err := net.Listen("tcp", net.JoinHostPort(lp.ip, strconv.Itoa(lp.port))) + listener, err := net.Listen("tcp", net.JoinHostPort(lp.IP, strconv.Itoa(lp.Port))) if err != nil { return nil, err } socket = listener case "udp": - addr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(lp.ip, strconv.Itoa(lp.port))) + addr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(lp.IP, strconv.Itoa(lp.Port))) if err != nil { return nil, err } @@ -1683,20 +1663,8 @@ func openLocalPort(lp *localPort) (closeable, error) { } socket = conn default: - return nil, fmt.Errorf("unknown protocol %q", lp.protocol) + return nil, fmt.Errorf("unknown protocol %q", lp.Protocol) } glog.V(2).Infof("Opened local port %s", lp.String()) return socket, nil } - -// revertPorts is closing ports in replacementPortsMap but not in originalPortsMap. In other words, it only -// closes the ports opened in this sync. -func revertPorts(replacementPortsMap, originalPortsMap map[localPort]closeable) { - for k, v := range replacementPortsMap { - // Only close newly opened local ports - leave ones that were open before this update - if originalPortsMap[k] == nil { - glog.V(2).Infof("Closing local port %s after iptables-restore failure", k.String()) - v.Close() - } - } -} diff --git a/pkg/proxy/iptables/proxier_test.go b/pkg/proxy/iptables/proxier_test.go index 35f288c53b370..e9057f423afec 100644 --- a/pkg/proxy/iptables/proxier_test.go +++ b/pkg/proxy/iptables/proxier_test.go @@ -35,6 +35,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/proxy" + utilproxy "k8s.io/kubernetes/pkg/proxy/util" "k8s.io/kubernetes/pkg/util/async" utiliptables "k8s.io/kubernetes/pkg/util/iptables" iptablestest "k8s.io/kubernetes/pkg/util/iptables/testing" @@ -258,103 +259,14 @@ func (c *fakeClosable) Close() error { return nil } -func TestRevertPorts(t *testing.T) { - testCases := []struct { - replacementPorts []localPort - existingPorts []localPort - expectToBeClose []bool - }{ - { - replacementPorts: []localPort{ - {port: 5001}, - {port: 5002}, - {port: 5003}, - }, - existingPorts: []localPort{}, - expectToBeClose: []bool{true, true, true}, - }, - { - replacementPorts: []localPort{}, - existingPorts: []localPort{ - {port: 5001}, - {port: 5002}, - {port: 5003}, - }, - expectToBeClose: []bool{}, - }, - { - replacementPorts: []localPort{ - {port: 5001}, - {port: 5002}, - {port: 5003}, - }, - existingPorts: []localPort{ - {port: 5001}, - {port: 5002}, - {port: 5003}, - }, - expectToBeClose: []bool{false, false, false}, - }, - { - replacementPorts: []localPort{ - {port: 5001}, - {port: 5002}, - {port: 5003}, - }, - existingPorts: []localPort{ - {port: 5001}, - {port: 5003}, - }, - expectToBeClose: []bool{false, true, false}, - }, - { - replacementPorts: []localPort{ - {port: 5001}, - {port: 5002}, - {port: 5003}, - }, - existingPorts: []localPort{ - {port: 5001}, - {port: 5002}, - {port: 5003}, - {port: 5004}, - }, - expectToBeClose: []bool{false, false, false}, - }, - } - - for i, tc := range testCases { - replacementPortsMap := make(map[localPort]closeable) - for _, lp := range tc.replacementPorts { - replacementPortsMap[lp] = &fakeClosable{} - } - existingPortsMap := make(map[localPort]closeable) - for _, lp := range tc.existingPorts { - existingPortsMap[lp] = &fakeClosable{} - } - revertPorts(replacementPortsMap, existingPortsMap) - for j, expectation := range tc.expectToBeClose { - if replacementPortsMap[tc.replacementPorts[j]].(*fakeClosable).closed != expectation { - t.Errorf("Expect replacement localport %v to be %v in test case %v", tc.replacementPorts[j], expectation, i) - } - } - for _, lp := range tc.existingPorts { - if existingPortsMap[lp].(*fakeClosable).closed == true { - t.Errorf("Expect existing localport %v to be false in test case %v", lp, i) - } - } - } - -} - // fakePortOpener implements portOpener. type fakePortOpener struct { - openPorts []*localPort + openPorts []*utilproxy.LocalPort } // OpenLocalPort fakes out the listen() and bind() used by syncProxyRules // to lock a local port. -func (f *fakePortOpener) OpenLocalPort(lp *localPort) (closeable, error) { +func (f *fakePortOpener) OpenLocalPort(lp *utilproxy.LocalPort) (utilproxy.Closeable, error) { f.openPorts = append(f.openPorts, lp) return nil, nil } @@ -395,8 +307,8 @@ func NewFakeProxier(ipt utiliptables.Interface) *Proxier { iptables: ipt, clusterCIDR: "10.0.0.0/24", hostname: testHostname, - portsMap: make(map[localPort]closeable), - portMapper: &fakePortOpener{[]*localPort{}}, + portsMap: make(map[utilproxy.LocalPort]utilproxy.Closeable), + portMapper: &fakePortOpener{[]*utilproxy.LocalPort{}}, healthChecker: newFakeHealthChecker(), precomputedProbabilities: make([]string, 0, 1001), iptablesData: bytes.NewBuffer(nil), diff --git a/pkg/proxy/util/BUILD b/pkg/proxy/util/BUILD index 9cbb8476aacc1..0fb554dc0cf7f 100644 --- a/pkg/proxy/util/BUILD +++ b/pkg/proxy/util/BUILD @@ -4,6 +4,7 @@ go_library( name = "go_default_library", srcs = [ "conntrack.go", + "port.go", "utils.go", ], visibility = ["//visibility:public"], @@ -20,6 +21,7 @@ go_test( name = "go_default_test", srcs = [ "conntrack_test.go", + "port_test.go", "utils_test.go", ], library = ":go_default_library", diff --git a/pkg/proxy/util/port.go b/pkg/proxy/util/port.go new file mode 100644 index 0000000000000..fd1a024dac8a2 --- /dev/null +++ b/pkg/proxy/util/port.go @@ -0,0 +1,64 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "fmt" + + "github.com/golang/glog" +) + +// LocalPort describes a port on specific IP address and protocol +type LocalPort struct { + // Description is the identity message of a given local port. + Description string + // IP is the IP address part of a given local port. + // If this string is empty, the port binds to all local IP addresses. + IP string + // Port is the port part of a given local port. + Port int + // Protocol is the protocol part of a given local port. + // The value is assumed to be lower-case. For example, "udp" not "UDP", "tcp" not "TCP". + Protocol string +} + +func (lp *LocalPort) String() string { + return fmt.Sprintf("%q (%s:%d/%s)", lp.Description, lp.IP, lp.Port, lp.Protocol) +} + +// Closeable is an interface around closing an port. +type Closeable interface { + Close() error +} + +// PortOpener is an interface around port opening/closing. +// Abstracted out for testing. +type PortOpener interface { + OpenLocalPort(lp *LocalPort) (Closeable, error) +} + +// RevertPorts is closing ports in replacementPortsMap but not in originalPortsMap. In other words, it only +// closes the ports opened in this sync. +func RevertPorts(replacementPortsMap, originalPortsMap map[LocalPort]Closeable) { + for k, v := range replacementPortsMap { + // Only close newly opened local ports - leave ones that were open before this update + if originalPortsMap[k] == nil { + glog.V(2).Infof("Closing local port %s", k.String()) + v.Close() + } + } +} diff --git a/pkg/proxy/util/port_test.go b/pkg/proxy/util/port_test.go new file mode 100644 index 0000000000000..7f1cb0f9e1b9c --- /dev/null +++ b/pkg/proxy/util/port_test.go @@ -0,0 +1,116 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import "testing" + +type fakeClosable struct { + closed bool +} + +func (c *fakeClosable) Close() error { + c.closed = true + return nil +} + +func TestRevertPorts(t *testing.T) { + testCases := []struct { + replacementPorts []LocalPort + existingPorts []LocalPort + expectToBeClose []bool + }{ + { + replacementPorts: []LocalPort{ + {Port: 5001}, + {Port: 5002}, + {Port: 5003}, + }, + existingPorts: []LocalPort{}, + expectToBeClose: []bool{true, true, true}, + }, + { + replacementPorts: []LocalPort{}, + existingPorts: []LocalPort{ + {Port: 5001}, + {Port: 5002}, + {Port: 5003}, + }, + expectToBeClose: []bool{}, + }, + { + replacementPorts: []LocalPort{ + {Port: 5001}, + {Port: 5002}, + {Port: 5003}, + }, + existingPorts: []LocalPort{ + {Port: 5001}, + {Port: 5002}, + {Port: 5003}, + }, + expectToBeClose: []bool{false, false, false}, + }, + { + replacementPorts: []LocalPort{ + {Port: 5001}, + {Port: 5002}, + {Port: 5003}, + }, + existingPorts: []LocalPort{ + {Port: 5001}, + {Port: 5003}, + }, + expectToBeClose: []bool{false, true, false}, + }, + { + replacementPorts: []LocalPort{ + {Port: 5001}, + {Port: 5002}, + {Port: 5003}, + }, + existingPorts: []LocalPort{ + {Port: 5001}, + {Port: 5002}, + {Port: 5003}, + {Port: 5004}, + }, + expectToBeClose: []bool{false, false, false}, + }, + } + + for i, tc := range testCases { + replacementPortsMap := make(map[LocalPort]Closeable) + for _, lp := range tc.replacementPorts { + replacementPortsMap[lp] = &fakeClosable{} + } + existingPortsMap := make(map[LocalPort]Closeable) + for _, lp := range tc.existingPorts { + existingPortsMap[lp] = &fakeClosable{} + } + RevertPorts(replacementPortsMap, existingPortsMap) + for j, expectation := range tc.expectToBeClose { + if replacementPortsMap[tc.replacementPorts[j]].(*fakeClosable).closed != expectation { + t.Errorf("Expect replacement localport %v to be %v in test case %v", tc.replacementPorts[j], expectation, i) + } + } + for _, lp := range tc.existingPorts { + if existingPortsMap[lp].(*fakeClosable).closed == true { + t.Errorf("Expect existing localport %v to be false in test case %v", lp, i) + } + } + } +} From 1f4dc5559d71ffca74bcfdf10b0b593005f61dd4 Mon Sep 17 00:00:00 2001 From: Bowei Du Date: Wed, 23 Aug 2017 16:27:59 -0700 Subject: [PATCH 264/403] Add AddAliasToInstance() to gce cloud provider - Adds AddAliasToInstance() to the GCE cloud provider. - Adds field "secondary-range-name" to the gce.conf configuration file. ```release-note NONE ``` --- pkg/cloudprovider/providers/gce/gce.go | 35 ++++++++++++----- .../providers/gce/gce_instances.go | 39 +++++++++++++++++++ pkg/cloudprovider/providers/gce/gce_test.go | 9 ++++- 3 files changed, 72 insertions(+), 11 deletions(-) diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index aa03e5afb5e7c..c11c961d2d01f 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -103,6 +103,7 @@ type GCECloud struct { managedZones []string // List of zones we are spanning (for multi-AZ clusters, primarily when running on master) networkURL string subnetworkURL string + secondaryRangeName string networkProjectID string onXPN bool nodeTags []string // List of tags to use on firewall rules for load balancers @@ -143,21 +144,30 @@ type GCEServiceManager struct { gce *GCECloud } +// ConfigFile is the struct used to parse the /etc/gce.conf configuration file. type ConfigFile struct { Global struct { - TokenURL string `gcfg:"token-url"` - TokenBody string `gcfg:"token-body"` - ProjectID string `gcfg:"project-id"` - NetworkName string `gcfg:"network-name"` - SubnetworkName string `gcfg:"subnetwork-name"` + TokenURL string `gcfg:"token-url"` + TokenBody string `gcfg:"token-body"` + ProjectID string `gcfg:"project-id"` + NetworkName string `gcfg:"network-name"` + SubnetworkName string `gcfg:"subnetwork-name"` + // SecondaryRangeName is the name of the secondary range to allocate IP + // aliases. The secondary range must be present on the subnetwork the + // cluster is attached to. + SecondaryRangeName string `gcfg:"secondary-range-name"` NodeTags []string `gcfg:"node-tags"` NodeInstancePrefix string `gcfg:"node-instance-prefix"` Multizone bool `gcfg:"multizone"` - // Specifying ApiEndpoint will override the default GCE compute API endpoint. + // ApiEndpoint is the GCE compute API endpoint to use. If this is blank, + // then the default endpoint is used. ApiEndpoint string `gcfg:"api-endpoint"` - LocalZone string `gcfg:"local-zone"` - // Possible values: List of api names separated by comma. Default to none. - // For example: MyFeatureFlag + // LocalZone specifies the GCE zone that gce cloud client instance is + // located in (i.e. where the controller will be running). If this is + // blank, then the local zone will be discovered via the metadata server. + LocalZone string `gcfg:"local-zone"` + // AlphaFeatures is a list of API flags to be enabled. Defaults to none. + // Example API name format: "MyFeatureFlag" AlphaFeatures []string `gcfg:"alpha-features"` } } @@ -171,6 +181,7 @@ type CloudConfig struct { ManagedZones []string NetworkURL string SubnetworkURL string + SecondaryRangeName string NodeTags []string NodeInstancePrefix string TokenSource oauth2.TokenSource @@ -313,6 +324,11 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err cloudConfig.SubnetworkURL = gceSubnetworkURL(cloudConfig.ApiEndpoint, cloudConfig.ProjectID, cloudConfig.Region, configFile.Global.SubnetworkName) } } + + if configFile != nil { + cloudConfig.SecondaryRangeName = configFile.Global.SecondaryRangeName + } + return cloudConfig, err } @@ -409,6 +425,7 @@ func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { managedZones: config.ManagedZones, networkURL: config.NetworkURL, subnetworkURL: config.SubnetworkURL, + secondaryRangeName: config.SecondaryRangeName, nodeTags: config.NodeTags, nodeInstancePrefix: config.NodeInstancePrefix, useMetadataServer: config.UseMetadataServer, diff --git a/pkg/cloudprovider/providers/gce/gce_instances.go b/pkg/cloudprovider/providers/gce/gce_instances.go index 8d997ae9ed4f5..3597dab9575bb 100644 --- a/pkg/cloudprovider/providers/gce/gce_instances.go +++ b/pkg/cloudprovider/providers/gce/gce_instances.go @@ -18,6 +18,7 @@ package gce import ( "fmt" + "net" "net/http" "strconv" "strings" @@ -25,6 +26,7 @@ import ( "cloud.google.com/go/compute/metadata" "github.com/golang/glog" + computealpha "google.golang.org/api/compute/v0.alpha" computebeta "google.golang.org/api/compute/v0.beta" compute "google.golang.org/api/compute/v1" @@ -318,6 +320,43 @@ func (gce *GCECloud) AliasRanges(nodeName types.NodeName) (cidrs []string, err e return } +// AddAliasToInstance adds an alias to the given instance from the named +// secondary range. +func (gce *GCECloud) AddAliasToInstance(nodeName types.NodeName, alias *net.IPNet) error { + + v1instance, err := gce.getInstanceByName(mapNodeNameToInstanceName(nodeName)) + if err != nil { + return err + } + instance, err := gce.serviceAlpha.Instances.Get(gce.projectID, v1instance.Zone, v1instance.Name).Do() + if err != nil { + return err + } + + switch len(instance.NetworkInterfaces) { + case 0: + return fmt.Errorf("Instance %q has no network interfaces", nodeName) + case 1: + default: + glog.Warningf("Instance %q has more than one network interface, using only the first (%v)", + nodeName, instance.NetworkInterfaces) + } + + iface := instance.NetworkInterfaces[0] + iface.AliasIpRanges = append(iface.AliasIpRanges, &computealpha.AliasIpRange{ + IpCidrRange: alias.String(), + SubnetworkRangeName: gce.secondaryRangeName, + }) + + mc := newInstancesMetricContext("addalias", v1instance.Zone) + op, err := gce.serviceAlpha.Instances.UpdateNetworkInterface( + gce.projectID, instance.Zone, instance.Name, iface.Name, iface).Do() + if err != nil { + return mc.Observe(err) + } + return gce.waitForZoneOp(op, v1instance.Zone, mc) +} + // Gets the named instances, returning cloudprovider.InstanceNotFound if any instance is not found func (gce *GCECloud) getInstancesByNames(names []string) ([]*gceInstance, error) { instances := make(map[string]*gceInstance) diff --git a/pkg/cloudprovider/providers/gce/gce_test.go b/pkg/cloudprovider/providers/gce/gce_test.go index f3add41c49bcb..d05296fec01ca 100644 --- a/pkg/cloudprovider/providers/gce/gce_test.go +++ b/pkg/cloudprovider/providers/gce/gce_test.go @@ -18,11 +18,12 @@ package gce import ( "encoding/json" - "golang.org/x/oauth2/google" "reflect" "strings" "testing" + "golang.org/x/oauth2/google" + computealpha "google.golang.org/api/compute/v0.alpha" computebeta "google.golang.org/api/compute/v0.beta" computev1 "google.golang.org/api/compute/v1" @@ -268,6 +269,7 @@ type generateConfigParams struct { ProjectID string NetworkName string SubnetworkName string + SecondaryRangeName string NodeTags []string NodeInstancePrefix string Multizone bool @@ -283,6 +285,7 @@ func newGenerateConfigDefaults() *generateConfigParams { ProjectID: "project-id", NetworkName: "network-name", SubnetworkName: "", + SecondaryRangeName: "", NodeTags: []string{"node-tag"}, NodeInstancePrefix: "node-prefix", Multizone: false, @@ -452,6 +455,7 @@ func TestGenerateCloudConfigs(t *testing.T) { ProjectID string `gcfg:"project-id"` NetworkName string `gcfg:"network-name"` SubnetworkName string `gcfg:"subnetwork-name"` + SecondaryRangeName string `gcfg:"secondary-range-name"` NodeTags []string `gcfg:"node-tags"` NodeInstancePrefix string `gcfg:"node-instance-prefix"` Multizone bool `gcfg:"multizone"` @@ -464,6 +468,7 @@ func TestGenerateCloudConfigs(t *testing.T) { ProjectID: config.ProjectID, NetworkName: config.NetworkName, SubnetworkName: config.SubnetworkName, + SecondaryRangeName: config.SecondaryRangeName, NodeTags: config.NodeTags, NodeInstancePrefix: config.NodeInstancePrefix, Multizone: config.Multizone, @@ -477,7 +482,7 @@ func TestGenerateCloudConfigs(t *testing.T) { } if !reflect.DeepEqual(cloudConfig, tc.cloudConfig) { - t.Errorf("Expecting cloud config: %v, but got %v", tc.cloudConfig, cloudConfig) + t.Errorf("Got %v, want %v", cloudConfig, tc.cloudConfig) } } } From f0f06a3d1e185fd7d2538bdd4b69f3f32ace3fb3 Mon Sep 17 00:00:00 2001 From: Chen Rong Date: Thu, 24 Aug 2017 15:14:20 +0800 Subject: [PATCH 265/403] remove deprecated rbac rule --- .../authorizer/rbac/bootstrappolicy/controller_policy.go | 2 -- .../rbac/bootstrappolicy/testdata/controller-roles.yaml | 9 --------- 2 files changed, 11 deletions(-) diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go index 955ed2e5562bd..c95800fb67aec 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go @@ -141,8 +141,6 @@ func init() { rbac.NewRule("get", "update").Groups(extensionsGroup).Resources("replicationcontrollers/scale").RuleOrDie(), rbac.NewRule("get", "update").Groups(extensionsGroup, appsGroup).Resources("deployments/scale", "replicasets/scale").RuleOrDie(), rbac.NewRule("list").Groups(legacyGroup).Resources("pods").RuleOrDie(), - // TODO: Remove the root /proxy permission in 1.7; MetricsClient no longer requires root proxy access as of 1.6 (fixed in https://github.com/kubernetes/kubernetes/pull/39636) - rbac.NewRule("proxy").Groups(legacyGroup).Resources("services").Names("https:heapster:", "http:heapster:").RuleOrDie(), // TODO: restrict this to the appropriate namespace rbac.NewRule("get").Groups(legacyGroup).Resources("services/proxy").Names("https:heapster:", "http:heapster:").RuleOrDie(), eventsRule(), diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-roles.yaml b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-roles.yaml index 120b59ff76091..f7ca7ecd26992 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-roles.yaml +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-roles.yaml @@ -453,15 +453,6 @@ items: - pods verbs: - list - - apiGroups: - - "" - resourceNames: - - 'http:heapster:' - - 'https:heapster:' - resources: - - services - verbs: - - proxy - apiGroups: - "" resourceNames: From d5a937dc204cdcf28190ce9846c3dae710cd8bcd Mon Sep 17 00:00:00 2001 From: lichuqiang Date: Thu, 24 Aug 2017 11:49:10 +0800 Subject: [PATCH 266/403] fix status in deployment_rollback response --- .../extensions/deployment/storage/storage.go | 1 + .../extensions/deployment/storage/storage_test.go | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/pkg/registry/extensions/deployment/storage/storage.go b/pkg/registry/extensions/deployment/storage/storage.go index 1e6fcbe83d5b0..025f9cb52c311 100644 --- a/pkg/registry/extensions/deployment/storage/storage.go +++ b/pkg/registry/extensions/deployment/storage/storage.go @@ -146,6 +146,7 @@ func (r *RollbackREST) Create(ctx genericapirequest.Context, obj runtime.Object, return nil, err } return &metav1.Status{ + Status: metav1.StatusSuccess, Message: fmt.Sprintf("rollback request for deployment %q succeeded", rollback.Name), Code: http.StatusOK, }, nil diff --git a/pkg/registry/extensions/deployment/storage/storage_test.go b/pkg/registry/extensions/deployment/storage/storage_test.go index 07c84d58c2197..3bad7f5d04aba 100644 --- a/pkg/registry/extensions/deployment/storage/storage_test.go +++ b/pkg/registry/extensions/deployment/storage/storage_test.go @@ -17,6 +17,7 @@ limitations under the License. package storage import ( + "net/http" "reflect" "testing" @@ -343,10 +344,18 @@ func TestEtcdCreateDeploymentRollback(t *testing.T) { if _, err := storage.Deployment.Create(ctx, validNewDeployment(), false); err != nil { t.Fatalf("%s: unexpected error: %v", k, err) } - if _, err := rollbackStorage.Create(ctx, &test.rollback, false); !test.errOK(err) { + rollbackRespStatus, err := rollbackStorage.Create(ctx, &test.rollback, false) + if !test.errOK(err) { t.Errorf("%s: unexpected error: %v", k, err) } else if err == nil { - // If rollback succeeded, verify Rollback field of deployment + // If rollback succeeded, verify Rollback response and Rollback field of deployment + status, ok := rollbackRespStatus.(*metav1.Status) + if !ok { + t.Errorf("%s: unexpected response format", k) + } + if status.Code != http.StatusOK || status.Status != metav1.StatusSuccess { + t.Errorf("%s: unexpected response, code: %d, status: %s", k, status.Code, status.Status) + } d, err := storage.Deployment.Get(ctx, validNewDeployment().ObjectMeta.Name, &metav1.GetOptions{}) if err != nil { t.Errorf("%s: unexpected error: %v", k, err) From 2fd25b6796e0e0d94d49af5c6d145ea570b4ebb0 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Thu, 24 Aug 2017 17:24:04 +0800 Subject: [PATCH 267/403] fix fuzzer for hostpath type that the path can be an empty string --- pkg/api/fuzzer/fuzzer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/api/fuzzer/fuzzer.go b/pkg/api/fuzzer/fuzzer.go index 045952d9cb1d2..fb3712be64378 100644 --- a/pkg/api/fuzzer/fuzzer.go +++ b/pkg/api/fuzzer/fuzzer.go @@ -360,7 +360,7 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { types := []api.HostPathType{api.HostPathUnset, api.HostPathDirectoryOrCreate, api.HostPathDirectory, api.HostPathFileOrCreate, api.HostPathFile, api.HostPathSocket, api.HostPathCharDev, api.HostPathBlockDev} typeVol := types[c.Rand.Intn(len(types))] - if obj.Path != "" && obj.Type == nil { + if obj.Type == nil { obj.Type = &typeVol } }, From 7c72594c85b2220e14ada6b5b52a2930d5e04f13 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Sun, 18 Jun 2017 21:34:24 +0800 Subject: [PATCH 268/403] update related files --- cluster/addons/node-problem-detector/npd.yaml | 1 + .../gce/container-linux/configure-helper.sh | 10 +++++----- cluster/gce/gci/configure-helper.sh | 14 ++++++------- .../cluster-autoscaler.manifest | 5 +++-- .../e2e-image-puller.manifest | 2 ++ cluster/saltbase/salt/etcd/etcd.manifest | 3 ++- .../kube-apiserver/kube-apiserver.manifest | 20 ++++++++++--------- .../kube-controller-manager.manifest | 5 +++-- .../salt/kube-proxy/kube-proxy.manifest | 2 ++ .../kube-scheduler/kube-scheduler.manifest | 2 +- cluster/saltbase/salt/l7-gcp/glbc.manifest | 2 ++ .../salt/rescheduler/rescheduler.manifest | 1 + .../app/phases/addons/proxy/manifests.go | 2 +- examples/newrelic/newrelic-daemonset.yaml | 1 + examples/oms/omsagent-daemonset.yaml | 3 ++- examples/sysdig-cloud/sysdig-daemonset.yaml | 1 + examples/sysdig-cloud/sysdig-rc.yaml | 1 + 17 files changed, 46 insertions(+), 29 deletions(-) diff --git a/cluster/addons/node-problem-detector/npd.yaml b/cluster/addons/node-problem-detector/npd.yaml index 7761b6a9785ae..87365ad17f7b6 100644 --- a/cluster/addons/node-problem-detector/npd.yaml +++ b/cluster/addons/node-problem-detector/npd.yaml @@ -76,6 +76,7 @@ spec: - name: localtime hostPath: path: /etc/localtime + type: "FileOrCreate" serviceAccountName: node-problem-detector tolerations: - operator: "Exists" diff --git a/cluster/gce/container-linux/configure-helper.sh b/cluster/gce/container-linux/configure-helper.sh index 5e7b90357ea41..081ca970b70b0 100755 --- a/cluster/gce/container-linux/configure-helper.sh +++ b/cluster/gce/container-linux/configure-helper.sh @@ -828,7 +828,7 @@ function compute-master-manifest-variables { CLOUD_CONFIG_MOUNT="" if [[ -f /etc/gce.conf ]]; then CLOUD_CONFIG_OPT="--cloud-config=/etc/gce.conf" - CLOUD_CONFIG_VOLUME="{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"/etc/gce.conf\"}}," + CLOUD_CONFIG_VOLUME="{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"/etc/gce.conf\", \"type\": \"FileOrCreate\"}}," CLOUD_CONFIG_MOUNT="{\"name\": \"cloudconfigmount\",\"mountPath\": \"/etc/gce.conf\", \"readOnly\": true}," fi DOCKER_REGISTRY="gcr.io/google_containers" @@ -933,10 +933,10 @@ function start-kube-apiserver { params+=" --admission-control-config-file=/etc/admission_controller.config" # Mount the file to configure admission controllers if ImagePolicyWebhook is set. admission_controller_config_mount="{\"name\": \"admissioncontrollerconfigmount\",\"mountPath\": \"/etc/admission_controller.config\", \"readOnly\": false}," - admission_controller_config_volume="{\"name\": \"admissioncontrollerconfigmount\",\"hostPath\": {\"path\": \"/etc/admission_controller.config\"}}," + admission_controller_config_volume="{\"name\": \"admissioncontrollerconfigmount\",\"hostPath\": {\"path\": \"/etc/admission_controller.config\", \"type\": \"FileOrCreate\"}}," # Mount the file to configure the ImagePolicyWebhook's webhook. image_policy_webhook_config_mount="{\"name\": \"imagepolicywebhookconfigmount\",\"mountPath\": \"/etc/gcp_image_review.config\", \"readOnly\": false}," - image_policy_webhook_config_volume="{\"name\": \"imagepolicywebhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_image_review.config\"}}," + image_policy_webhook_config_volume="{\"name\": \"imagepolicywebhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_image_review.config\", \"type\": \"FileOrCreate\"}}," fi fi @@ -963,7 +963,7 @@ function start-kube-apiserver { if [[ -n "${GCP_AUTHN_URL:-}" ]]; then params+=" --authentication-token-webhook-config-file=/etc/gcp_authn.config" webhook_authn_config_mount="{\"name\": \"webhookauthnconfigmount\",\"mountPath\": \"/etc/gcp_authn.config\", \"readOnly\": false}," - webhook_authn_config_volume="{\"name\": \"webhookauthnconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_authn.config\"}}," + webhook_authn_config_volume="{\"name\": \"webhookauthnconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_authn.config\", \"type\": \"FileOrCreate\"}}," fi local authorization_mode="RBAC" @@ -994,7 +994,7 @@ function start-kube-apiserver { authorization_mode+=",Webhook" params+=" --authorization-webhook-config-file=/etc/gcp_authz.config" webhook_config_mount="{\"name\": \"webhookconfigmount\",\"mountPath\": \"/etc/gcp_authz.config\", \"readOnly\": false}," - webhook_config_volume="{\"name\": \"webhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_authz.config\"}}," + webhook_config_volume="{\"name\": \"webhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_authz.config\", \"type\": \"FileOrCreate\"}}," fi params+=" --authorization-mode=${authorization_mode}" diff --git a/cluster/gce/gci/configure-helper.sh b/cluster/gce/gci/configure-helper.sh index 08958b93ff195..8f50a18153d24 100644 --- a/cluster/gce/gci/configure-helper.sh +++ b/cluster/gce/gci/configure-helper.sh @@ -1154,7 +1154,7 @@ function compute-master-manifest-variables { CLOUD_CONFIG_MOUNT="" if [[ -f /etc/gce.conf ]]; then CLOUD_CONFIG_OPT="--cloud-config=/etc/gce.conf" - CLOUD_CONFIG_VOLUME="{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"/etc/gce.conf\"}}," + CLOUD_CONFIG_VOLUME="{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"/etc/gce.conf\", \"type\": \"FileOrCreate\"}}," CLOUD_CONFIG_MOUNT="{\"name\": \"cloudconfigmount\",\"mountPath\": \"/etc/gce.conf\", \"readOnly\": true}," fi DOCKER_REGISTRY="gcr.io/google_containers" @@ -1282,7 +1282,7 @@ function start-kube-apiserver { # Create the audit policy file, and mount it into the apiserver pod. create-master-audit-policy "${audit_policy_file}" audit_policy_config_mount="{\"name\": \"auditpolicyconfigmount\",\"mountPath\": \"${audit_policy_file}\", \"readOnly\": true}," - audit_policy_config_volume="{\"name\": \"auditpolicyconfigmount\",\"hostPath\": {\"path\": \"${audit_policy_file}\"}}," + audit_policy_config_volume="{\"name\": \"auditpolicyconfigmount\",\"hostPath\": {\"path\": \"${audit_policy_file}\", \"type\": \"FileOrCreate\"}}," if [[ "${ADVANCED_AUDIT_BACKEND:-log}" == *"log"* ]]; then # The advanced audit log backend config matches the basic audit log config. @@ -1304,7 +1304,7 @@ function start-kube-apiserver { params+=" --audit-webhook-config-file=${audit_webhook_config_file}" create-master-audit-webhook-config "${audit_webhook_config_file}" audit_webhook_config_mount="{\"name\": \"auditwebhookconfigmount\",\"mountPath\": \"${audit_webhook_config_file}\", \"readOnly\": true}," - audit_webhook_config_volume="{\"name\": \"auditwebhookconfigmount\",\"hostPath\": {\"path\": \"${audit_webhook_config_file}\"}}," + audit_webhook_config_volume="{\"name\": \"auditwebhookconfigmount\",\"hostPath\": {\"path\": \"${audit_webhook_config_file}\", \"type\": \"FileOrCreate\"}}," fi fi @@ -1322,10 +1322,10 @@ function start-kube-apiserver { params+=" --admission-control-config-file=/etc/admission_controller.config" # Mount the file to configure admission controllers if ImagePolicyWebhook is set. admission_controller_config_mount="{\"name\": \"admissioncontrollerconfigmount\",\"mountPath\": \"/etc/admission_controller.config\", \"readOnly\": false}," - admission_controller_config_volume="{\"name\": \"admissioncontrollerconfigmount\",\"hostPath\": {\"path\": \"/etc/admission_controller.config\"}}," + admission_controller_config_volume="{\"name\": \"admissioncontrollerconfigmount\",\"hostPath\": {\"path\": \"/etc/admission_controller.config\", \"type\": \"FileOrCreate\"}}," # Mount the file to configure the ImagePolicyWebhook's webhook. image_policy_webhook_config_mount="{\"name\": \"imagepolicywebhookconfigmount\",\"mountPath\": \"/etc/gcp_image_review.config\", \"readOnly\": false}," - image_policy_webhook_config_volume="{\"name\": \"imagepolicywebhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_image_review.config\"}}," + image_policy_webhook_config_volume="{\"name\": \"imagepolicywebhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_image_review.config\", \"type\": \"FileOrCreate\"}}," fi fi @@ -1352,7 +1352,7 @@ function start-kube-apiserver { if [[ -n "${GCP_AUTHN_URL:-}" ]]; then params+=" --authentication-token-webhook-config-file=/etc/gcp_authn.config" webhook_authn_config_mount="{\"name\": \"webhookauthnconfigmount\",\"mountPath\": \"/etc/gcp_authn.config\", \"readOnly\": false}," - webhook_authn_config_volume="{\"name\": \"webhookauthnconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_authn.config\"}}," + webhook_authn_config_volume="{\"name\": \"webhookauthnconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_authn.config\", \"type\": \"FileOrCreate\"}}," fi @@ -1384,7 +1384,7 @@ function start-kube-apiserver { authorization_mode+=",Webhook" params+=" --authorization-webhook-config-file=/etc/gcp_authz.config" webhook_config_mount="{\"name\": \"webhookconfigmount\",\"mountPath\": \"/etc/gcp_authz.config\", \"readOnly\": false}," - webhook_config_volume="{\"name\": \"webhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_authz.config\"}}," + webhook_config_volume="{\"name\": \"webhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_authz.config\", \"type\": \"FileOrCreate\"}}," fi params+=" --authorization-mode=${authorization_mode}" diff --git a/cluster/saltbase/salt/cluster-autoscaler/cluster-autoscaler.manifest b/cluster/saltbase/salt/cluster-autoscaler/cluster-autoscaler.manifest index 00bcd8ac06548..5b0a0a521008d 100644 --- a/cluster/saltbase/salt/cluster-autoscaler/cluster-autoscaler.manifest +++ b/cluster/saltbase/salt/cluster-autoscaler/cluster-autoscaler.manifest @@ -5,7 +5,7 @@ {% if grains.cloud == 'gce' and grains.cloud_config is defined -%} {% set cloud_config = "--cloud-config=" + grains.cloud_config -%} {% set cloud_config_mount = "{\"name\": \"cloudconfigmount\",\"mountPath\": \"" + grains.cloud_config + "\", \"readOnly\": true}," -%} - {% set cloud_config_volume = "{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"" + grains.cloud_config + "\"}}," -%} + {% set cloud_config_volume = "{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"" + grains.cloud_config + "\", \"type\": \"FileOrCreate\"}}," -%} {% endif -%} {% set params = pillar['autoscaler_mig_config'] + " " + cloud_config + " " + pillar.get('autoscaler_expander_config', '') -%} @@ -95,7 +95,8 @@ { "name": "logfile", "hostPath": { - "path": "/var/log/cluster-autoscaler.log" + "path": "/var/log/cluster-autoscaler.log", + "type": "FileOrCreate" } } ], diff --git a/cluster/saltbase/salt/e2e-image-puller/e2e-image-puller.manifest b/cluster/saltbase/salt/e2e-image-puller/e2e-image-puller.manifest index 3cf4a928be5e5..137c7d289b797 100644 --- a/cluster/saltbase/salt/e2e-image-puller/e2e-image-puller.manifest +++ b/cluster/saltbase/salt/e2e-image-puller/e2e-image-puller.manifest @@ -50,9 +50,11 @@ spec: volumes: - hostPath: path: /var/run/docker.sock + type: Socket name: socket - hostPath: path: /usr/bin/docker + type: File name: docker # This pod is really fire-and-forget. restartPolicy: OnFailure diff --git a/cluster/saltbase/salt/etcd/etcd.manifest b/cluster/saltbase/salt/etcd/etcd.manifest index 1f1be4ffe8caa..c5e56b5a51279 100644 --- a/cluster/saltbase/salt/etcd/etcd.manifest +++ b/cluster/saltbase/salt/etcd/etcd.manifest @@ -103,7 +103,8 @@ }, { "name": "varlogetcd", "hostPath": { - "path": "/var/log/etcd{{ suffix }}.log"} + "path": "/var/log/etcd{{ suffix }}.log", + "type": "FileOrCreate"} }, { "name": "etc", "hostPath": { diff --git a/cluster/saltbase/salt/kube-apiserver/kube-apiserver.manifest b/cluster/saltbase/salt/kube-apiserver/kube-apiserver.manifest index 4f6ad7bdfd684..e3d8f4cac8bea 100644 --- a/cluster/saltbase/salt/kube-apiserver/kube-apiserver.manifest +++ b/cluster/saltbase/salt/kube-apiserver/kube-apiserver.manifest @@ -25,7 +25,7 @@ {% if grains.cloud in [ 'aws', 'gce' ] and grains.cloud_config is defined -%} {% set cloud_config = "--cloud-config=" + grains.cloud_config -%} {% set cloud_config_mount = "{\"name\": \"cloudconfigmount\",\"mountPath\": \"" + grains.cloud_config + "\", \"readOnly\": true}," -%} - {% set cloud_config_volume = "{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"" + grains.cloud_config + "\"}}," -%} + {% set cloud_config_volume = "{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"" + grains.cloud_config + "\", \"type\": \"FileOrCreate\"}}," -%} {% endif -%} {% if grains.cloud in ['openstack'] -%} @@ -119,7 +119,7 @@ {% if grains.webhook_authentication_config is defined -%} {% set webhook_authentication_config = " --authentication-token-webhook-config-file=" + grains.webhook_authentication_config -%} {% set webhook_authn_config_mount = "{\"name\": \"webhookauthnconfigmount\",\"mountPath\": \"" + grains.webhook_authentication_config + "\", \"readOnly\": false}," -%} - {% set webhook_authn_config_volume = "{\"name\": \"webhookauthnconfigmount\",\"hostPath\": {\"path\": \"" + grains.webhook_authentication_config + "\"}}," -%} + {% set webhook_authn_config_volume = "{\"name\": \"webhookauthnconfigmount\",\"hostPath\": {\"path\": \"" + grains.webhook_authentication_config + "\", \"type\": \"FileOrCreate\"}}," -%} {% endif -%} {% set webhook_authorization_config = "" -%} @@ -128,7 +128,7 @@ {% if grains.webhook_authorization_config is defined -%} {% set webhook_authorization_config = " --authorization-webhook-config-file=" + grains.webhook_authorization_config -%} {% set webhook_config_mount = "{\"name\": \"webhookconfigmount\",\"mountPath\": \"" + grains.webhook_authorization_config + "\", \"readOnly\": false}," -%} - {% set webhook_config_volume = "{\"name\": \"webhookconfigmount\",\"hostPath\": {\"path\": \"" + grains.webhook_authorization_config + "\"}}," -%} + {% set webhook_config_volume = "{\"name\": \"webhookconfigmount\",\"hostPath\": {\"path\": \"" + grains.webhook_authorization_config + "\", \"type\": \"FileOrCreate\"}}," -%} {% set authz_mode = authz_mode + ",Webhook" -%} {% endif -%} @@ -140,9 +140,9 @@ {% if grains.image_review_config is defined -%} {% set image_review_config = " --admission-control-config-file=" + grains.image_review_config -%} {% set admission_controller_config_mount = "{\"name\": \"admissioncontrollerconfigmount\",\"mountPath\": \"" + grains.image_review_config + "\", \"readOnly\": false}," -%} - {% set admission_controller_config_volume = "{\"name\": \"admissioncontrollerconfigmount\",\"hostPath\": {\"path\": \"" + grains.image_review_config + "\"}}," -%} + {% set admission_controller_config_volume = "{\"name\": \"admissioncontrollerconfigmount\",\"hostPath\": {\"path\": \"" + grains.image_review_config + "\", \"type\": \"FileOrCreate\"}}," -%} {% set image_policy_webhook_config_mount = "{\"name\": \"imagepolicywebhookconfigmount\",\"mountPath\": \"/etc/gcp_image_review.config\", \"readOnly\": false}," -%} - {% set image_policy_webhook_config_volume = "{\"name\": \"imagepolicywebhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_image_review.config\"}}," -%} + {% set image_policy_webhook_config_volume = "{\"name\": \"imagepolicywebhookconfigmount\",\"hostPath\": {\"path\": \"/etc/gcp_image_review.config\", \"type\": \"FileOrCreate\"}}," -%} {% endif -%} {% set admission_control = "" -%} @@ -185,14 +185,14 @@ {% elif pillar['enable_apiserver_advanced_audit'] is defined and pillar['enable_apiserver_advanced_audit'] in ['true'] -%} {% set audit_log = "--audit-policy-file=/etc/audit_policy.config" -%} {% set audit_policy_config_mount = "{\"name\": \"auditpolicyconfigmount\",\"mountPath\": \"/etc/audit_policy.config\", \"readOnly\": true}," -%} - {% set audit_policy_config_volume = "{\"name\": \"auditpolicyconfigmount\",\"hostPath\": {\"path\": \"/etc/audit_policy.config\"}}," -%} + {% set audit_policy_config_volume = "{\"name\": \"auditpolicyconfigmount\",\"hostPath\": {\"path\": \"/etc/audit_policy.config\", \"type\": \"FileOrCreate\"}}," -%} {% if pillar['advanced_audit_backend'] is defined and 'log' in pillar['advanced_audit_backend'] -%} {% set audit_log = audit_log + " --audit-log-path=/var/log/kube-apiserver-audit.log --audit-log-maxage=0 --audit-log-maxbackup=0 --audit-log-maxsize=2000000000" -%} {% endif %} {% if pillar['advanced_audit_backend'] is defined and 'webhook' in pillar['advanced_audit_backend'] -%} {% set audit_log = audit_log + " --audit-webhook-mode=batch" -%} {% set audit_webhook_config_mount = "{\"name\": \"auditwebhookconfigmount\",\"mountPath\": \"/etc/audit_webhook.config\", \"readOnly\": true}," -%} - {% set audit_webhook_config_volume = "{\"name\": \"auditwebhookconfigmount\",\"hostPath\": {\"path\": \"/etc/audit_webhook.config\"}}," -%} + {% set audit_webhook_config_volume = "{\"name\": \"auditwebhookconfigmount\",\"hostPath\": {\"path\": \"/etc/audit_webhook.config\", \"type\": \"FileOrCreate\"}}," -%} {% endif %} {% endif -%} @@ -308,11 +308,13 @@ }, { "name": "logfile", "hostPath": { - "path": "/var/log/kube-apiserver.log"} + "path": "/var/log/kube-apiserver.log", + "type": "FileOrCreate"} }, { "name": "auditlogfile", "hostPath": { - "path": "/var/log/kube-apiserver-audit.log"} + "path": "/var/log/kube-apiserver-audit.log", + "type": "FileOrCreate"} }, { "name": "etcssl", "hostPath": { diff --git a/cluster/saltbase/salt/kube-controller-manager/kube-controller-manager.manifest b/cluster/saltbase/salt/kube-controller-manager/kube-controller-manager.manifest index 9911d09b8d3f6..65359afda7b54 100644 --- a/cluster/saltbase/salt/kube-controller-manager/kube-controller-manager.manifest +++ b/cluster/saltbase/salt/kube-controller-manager/kube-controller-manager.manifest @@ -49,7 +49,7 @@ {% if grains.cloud in [ 'aws', 'gce' ] and grains.cloud_config is defined -%} {% set cloud_config = "--cloud-config=" + grains.cloud_config -%} {% set cloud_config_mount = "{\"name\": \"cloudconfigmount\",\"mountPath\": \"" + grains.cloud_config + "\", \"readOnly\": true}," -%} - {% set cloud_config_volume = "{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"" + grains.cloud_config + "\"}}," -%} + {% set cloud_config_volume = "{\"name\": \"cloudconfigmount\",\"hostPath\": {\"path\": \"" + grains.cloud_config + "\", \"type\": \"FileOrCreate\"}}," -%} {% endif -%} {% if grains.cloud in ['openstack'] -%} @@ -164,7 +164,8 @@ }, { "name": "logfile", "hostPath": { - "path": "/var/log/kube-controller-manager.log"} + "path": "/var/log/kube-controller-manager.log", + "type": "FileOrCreate"} }, { "name": "etcssl", "hostPath": { diff --git a/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest b/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest index b07ff649e36c8..efb20b086a624 100644 --- a/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest +++ b/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest @@ -102,6 +102,7 @@ spec: name: etc-ssl-certs - hostPath: path: /var/lib/kube-proxy/kubeconfig + type: FileOrCreate name: kubeconfig - hostPath: path: /var/log @@ -111,4 +112,5 @@ spec: name: run - hostPath: path: /run/xtables.lock + type: FileOrCreate name: iptableslock diff --git a/cluster/saltbase/salt/kube-scheduler/kube-scheduler.manifest b/cluster/saltbase/salt/kube-scheduler/kube-scheduler.manifest index 8a78a6ddc56e1..6f946bd8c864c 100644 --- a/cluster/saltbase/salt/kube-scheduler/kube-scheduler.manifest +++ b/cluster/saltbase/salt/kube-scheduler/kube-scheduler.manifest @@ -83,7 +83,7 @@ }, { "name": "logfile", - "hostPath": {"path": "/var/log/kube-scheduler.log"} + "hostPath": {"path": "/var/log/kube-scheduler.log", "type": "FileOrCreate"} } ] }} diff --git a/cluster/saltbase/salt/l7-gcp/glbc.manifest b/cluster/saltbase/salt/l7-gcp/glbc.manifest index bb6863d495524..1214a131f3231 100644 --- a/cluster/saltbase/salt/l7-gcp/glbc.manifest +++ b/cluster/saltbase/salt/l7-gcp/glbc.manifest @@ -48,7 +48,9 @@ spec: volumes: - hostPath: path: /etc/gce.conf + type: FileOrCreate name: cloudconfig - hostPath: path: /var/log/glbc.log + type: FileOrCreate name: logfile diff --git a/cluster/saltbase/salt/rescheduler/rescheduler.manifest b/cluster/saltbase/salt/rescheduler/rescheduler.manifest index 8132a7d6fccc2..ef9af1f5f7fac 100644 --- a/cluster/saltbase/salt/rescheduler/rescheduler.manifest +++ b/cluster/saltbase/salt/rescheduler/rescheduler.manifest @@ -32,4 +32,5 @@ spec: volumes: - hostPath: path: /var/log/rescheduler.log + type: FileOrCreate name: logfile diff --git a/cmd/kubeadm/app/phases/addons/proxy/manifests.go b/cmd/kubeadm/app/phases/addons/proxy/manifests.go index dfca6bd5e96ef..b9903192d14d4 100644 --- a/cmd/kubeadm/app/phases/addons/proxy/manifests.go +++ b/cmd/kubeadm/app/phases/addons/proxy/manifests.go @@ -81,7 +81,6 @@ spec: volumeMounts: - mountPath: /var/lib/kube-proxy name: kube-proxy - # TODO: Make this a file hostpath mount - mountPath: /run/xtables.lock name: xtables-lock readOnly: false @@ -100,5 +99,6 @@ spec: - name: xtables-lock hostPath: path: /run/xtables.lock + type: FileOrCreate ` ) diff --git a/examples/newrelic/newrelic-daemonset.yaml b/examples/newrelic/newrelic-daemonset.yaml index 24adb382378b5..fd46972204959 100644 --- a/examples/newrelic/newrelic-daemonset.yaml +++ b/examples/newrelic/newrelic-daemonset.yaml @@ -52,6 +52,7 @@ spec: - name: run hostPath: path: /var/run/docker.sock + type: Socket - name: sys hostPath: path: /sys diff --git a/examples/oms/omsagent-daemonset.yaml b/examples/oms/omsagent-daemonset.yaml index bf59b370edbfe..8ab523f06032a 100644 --- a/examples/oms/omsagent-daemonset.yaml +++ b/examples/oms/omsagent-daemonset.yaml @@ -27,4 +27,5 @@ spec: volumes: - name: docker-sock hostPath: - path: /var/run/docker.sock \ No newline at end of file + path: /var/run/docker.sock + type: Socket diff --git a/examples/sysdig-cloud/sysdig-daemonset.yaml b/examples/sysdig-cloud/sysdig-daemonset.yaml index e1fc1534a75a9..3cfd4a54f8dbb 100644 --- a/examples/sysdig-cloud/sysdig-daemonset.yaml +++ b/examples/sysdig-cloud/sysdig-daemonset.yaml @@ -16,6 +16,7 @@ spec: - name: docker-sock hostPath: path: /var/run/docker.sock + type: Socket - name: dev-vol hostPath: path: /dev diff --git a/examples/sysdig-cloud/sysdig-rc.yaml b/examples/sysdig-cloud/sysdig-rc.yaml index d088cd5355b25..dfef08de1ad76 100644 --- a/examples/sysdig-cloud/sysdig-rc.yaml +++ b/examples/sysdig-cloud/sysdig-rc.yaml @@ -14,6 +14,7 @@ spec: - name: docker-sock hostPath: path: /var/run/docker.sock + type: Socket - name: dev-vol hostPath: path: /dev From d101183c79023402f0e4299e6a50ac6d36a04b28 Mon Sep 17 00:00:00 2001 From: fisherxu Date: Wed, 16 Aug 2017 16:58:41 +0800 Subject: [PATCH 269/403] fix invalid url link --- cluster/addons/registry/auth/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cluster/addons/registry/auth/README.md b/cluster/addons/registry/auth/README.md index 8fbd7e4f3bc44..040c54bcb8d1b 100644 --- a/cluster/addons/registry/auth/README.md +++ b/cluster/addons/registry/auth/README.md @@ -83,7 +83,7 @@ Setup proxy or port-forwarding to the kube-registry. Image push/pull should fail ### Configure Nodes to Authenticate with Kube-Registry -By default, nodes assume no authentication is required by kube-registry. Without authentication, nodes cannot pull images from kube-registry. To solve this, more documentation can be found [Here](https://github.com/kubernetes/kubernetes/blob/master/docs/user-guide/images.md#configuring-nodes-to-authenticate-to-a-private-repository) +By default, nodes assume no authentication is required by kube-registry. Without authentication, nodes cannot pull images from kube-registry. To solve this, more documentation can be found [Here](https://github.com/kubernetes/kubernetes.github.io/blob/master/docs/concepts/containers/images.md#configuring-nodes-to-authenticate-to-a-private-repository). From 22d5e4810b5d621f0c9bd6c02a74ac90d04370c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Cluseau?= Date: Wed, 23 Aug 2017 13:44:45 +1100 Subject: [PATCH 270/403] refactor(flexvolume): simplify capabilities handling --- pkg/volume/flexvolume/BUILD | 1 + pkg/volume/flexvolume/driver-call.go | 46 ++++++++--------------- pkg/volume/flexvolume/driver-call_test.go | 32 ++++++++++++++++ pkg/volume/flexvolume/mounter-defaults.go | 2 +- pkg/volume/flexvolume/plugin.go | 13 +++---- 5 files changed, 55 insertions(+), 39 deletions(-) create mode 100644 pkg/volume/flexvolume/driver-call_test.go diff --git a/pkg/volume/flexvolume/BUILD b/pkg/volume/flexvolume/BUILD index 3a78103ab8624..b590ed98acf85 100644 --- a/pkg/volume/flexvolume/BUILD +++ b/pkg/volume/flexvolume/BUILD @@ -42,6 +42,7 @@ go_test( "attacher_test.go", "common_test.go", "detacher_test.go", + "driver-call_test.go", "flexvolume_test.go", "mounter_test.go", "plugin_test.go", diff --git a/pkg/volume/flexvolume/driver-call.go b/pkg/volume/flexvolume/driver-call.go index aad05eeb159ce..e3e4527ddc97d 100644 --- a/pkg/volume/flexvolume/driver-call.go +++ b/pkg/volume/flexvolume/driver-call.go @@ -58,9 +58,6 @@ const ( optionKeyPodUID = "kubernetes.io/pod.uid" optionKeyServiceAccountName = "kubernetes.io/serviceAccount.name" - - attachCapability = "attach" - selinuxRelabelCapability = "selinuxRelabel" ) const ( @@ -83,11 +80,6 @@ type DriverCall struct { args []string } -type driverCapabilities struct { - attach bool - selinuxRelabel bool -} - func (plugin *flexVolumePlugin) NewDriverCall(command string) *DriverCall { return plugin.NewDriverCallWithTimeout(command, 0) } @@ -210,7 +202,19 @@ type DriverStatus struct { // Returns capabilities of the driver. // By default we assume all the capabilities are supported. // If the plugin does not support a capability, it can return false for that capability. - Capabilities map[string]bool + Capabilities *DriverCapabilities `json:",omitempty"` +} + +type DriverCapabilities struct { + Attach bool `json:"attach"` + SELinuxRelabel bool `json:"selinuxRelabel"` +} + +func defaultCapabilities() *DriverCapabilities { + return &DriverCapabilities{ + Attach: true, + SELinuxRelabel: true, + } } // isCmdNotSupportedErr checks if the error corresponds to command not supported by @@ -226,7 +230,9 @@ func isCmdNotSupportedErr(err error) bool { // handleCmdResponse processes the command output and returns the appropriate // error code or message. func handleCmdResponse(cmd string, output []byte) (*DriverStatus, error) { - var status DriverStatus + status := DriverStatus{ + Capabilities: defaultCapabilities(), + } if err := json.Unmarshal(output, &status); err != nil { glog.Errorf("Failed to unmarshal output for command: %s, output: %q, error: %s", cmd, string(output), err.Error()) return nil, err @@ -241,23 +247,3 @@ func handleCmdResponse(cmd string, output []byte) (*DriverStatus, error) { return &status, nil } - -// getDriverCapabilities returns the reported capabilities as returned by driver's init() function -func (ds *DriverStatus) getDriverCapabilities() *driverCapabilities { - driverCaps := &driverCapabilities{ - attach: true, - selinuxRelabel: true, - } - - // Check if driver supports SELinux Relabeling of mounted volume - if dcap, ok := ds.Capabilities[selinuxRelabelCapability]; ok { - driverCaps.selinuxRelabel = dcap - } - - // Check whether the plugin is attachable. - if dcap, ok := ds.Capabilities[attachCapability]; ok { - driverCaps.attach = dcap - } - - return driverCaps -} diff --git a/pkg/volume/flexvolume/driver-call_test.go b/pkg/volume/flexvolume/driver-call_test.go new file mode 100644 index 0000000000000..77f71f7b8f87c --- /dev/null +++ b/pkg/volume/flexvolume/driver-call_test.go @@ -0,0 +1,32 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package flexvolume + +import ( + "testing" +) + +func TestHandleResponseDefaults(t *testing.T) { + ds, err := handleCmdResponse("test", []byte(`{"status": "Success"}`)) + if err != nil { + t.Error("error: ", err) + } + + if *ds.Capabilities != *defaultCapabilities() { + t.Error("wrong default capabilities: ", *ds.Capabilities) + } +} diff --git a/pkg/volume/flexvolume/mounter-defaults.go b/pkg/volume/flexvolume/mounter-defaults.go index a3996d4da3ca8..b3cd9430ff532 100644 --- a/pkg/volume/flexvolume/mounter-defaults.go +++ b/pkg/volume/flexvolume/mounter-defaults.go @@ -47,7 +47,7 @@ func (f *mounterDefaults) GetAttributes() volume.Attributes { return volume.Attributes{ ReadOnly: f.readOnly, Managed: !f.readOnly, - SupportsSELinux: f.flexVolume.plugin.capabilities.selinuxRelabel, + SupportsSELinux: f.flexVolume.plugin.capabilities.SELinuxRelabel, } } diff --git a/pkg/volume/flexvolume/plugin.go b/pkg/volume/flexvolume/plugin.go index 2e54aae964c93..942be15f65318 100644 --- a/pkg/volume/flexvolume/plugin.go +++ b/pkg/volume/flexvolume/plugin.go @@ -42,8 +42,8 @@ type flexVolumePlugin struct { runner exec.Interface sync.Mutex - capabilities *driverCapabilities unsupportedCommands []string + capabilities DriverCapabilities } type flexVolumeAttachablePlugin struct { @@ -65,19 +65,16 @@ func NewFlexVolumePlugin(pluginDir, name string) (volume.VolumePlugin, error) { unsupportedCommands: []string{}, } - // Retrieve driver reported capabilities + // Initialize the plugin and probe the capabilities call := flexPlugin.NewDriverCall(initCmd) ds, err := call.Run() if err != nil { return nil, err } + flexPlugin.capabilities = *ds.Capabilities - driverCaps := ds.getDriverCapabilities() - flexPlugin.capabilities = driverCaps - - // Check whether the plugin is attachable. - if driverCaps.attach { - // Plugin supports attach/detach by default, so return flexVolumeAttachablePlugin + if flexPlugin.capabilities.Attach { + // Plugin supports attach/detach, so return flexVolumeAttachablePlugin return &flexVolumeAttachablePlugin{flexVolumePlugin: flexPlugin}, nil } else { return flexPlugin, nil From b8edd9b8858d1f3c9cab8c29b3c3e260bb2989d6 Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Thu, 24 Aug 2017 19:39:42 +0800 Subject: [PATCH 271/403] fix e2e network wrong output message --- test/e2e/framework/networking_utils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/framework/networking_utils.go b/test/e2e/framework/networking_utils.go index 9d5226e4cdb1e..512bf0ca420ad 100644 --- a/test/e2e/framework/networking_utils.go +++ b/test/e2e/framework/networking_utils.go @@ -214,7 +214,7 @@ func (config *NetworkingTestConfig) DialFromContainer(protocol, containerIP, tar } config.diagnoseMissingEndpoints(eps) - Failf("Failed to find expected endpoints:\nTries %d\nCommand %v\nretrieved %v\nexpected %v\n", minTries, cmd, eps, expectedEps) + Failf("Failed to find expected endpoints:\nTries %d\nCommand %v\nretrieved %v\nexpected %v\n", maxTries, cmd, eps, expectedEps) } // DialFromNode executes a tcp or udp request based on protocol via kubectl exec @@ -270,7 +270,7 @@ func (config *NetworkingTestConfig) DialFromNode(protocol, targetIP string, targ } config.diagnoseMissingEndpoints(eps) - Failf("Failed to find expected endpoints:\nTries %d\nCommand %v\nretrieved %v\nexpected %v\n", minTries, cmd, eps, expectedEps) + Failf("Failed to find expected endpoints:\nTries %d\nCommand %v\nretrieved %v\nexpected %v\n", maxTries, cmd, eps, expectedEps) } // GetSelfURL executes a curl against the given path via kubectl exec into a From 01e4b960d8000f25af51d3fa2e4b7d9b043b0b90 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Thu, 24 Aug 2017 21:11:52 +0800 Subject: [PATCH 272/403] update kubeadm to use hostpath type --- .../app/phases/controlplane/volumes.go | 25 ++-- .../app/phases/controlplane/volumes_test.go | 113 ++++++++++++++---- cmd/kubeadm/app/phases/etcd/local.go | 3 +- .../selfhosting/podspec_mutation_test.go | 12 ++ .../phases/selfhosting/selfhosting_test.go | 4 + cmd/kubeadm/app/util/staticpod/utils.go | 7 +- cmd/kubeadm/app/util/staticpod/utils_test.go | 10 +- 7 files changed, 136 insertions(+), 38 deletions(-) diff --git a/cmd/kubeadm/app/phases/controlplane/volumes.go b/cmd/kubeadm/app/phases/controlplane/volumes.go index cf8f8e8765e49..d83df4961d628 100644 --- a/cmd/kubeadm/app/phases/controlplane/volumes.go +++ b/cmd/kubeadm/app/phases/controlplane/volumes.go @@ -42,14 +42,16 @@ var caCertsPkiVolumePath = "/etc/pki" // getHostPathVolumesForTheControlPlane gets the required hostPath volumes and mounts for the control plane func getHostPathVolumesForTheControlPlane(cfg *kubeadmapi.MasterConfiguration) controlPlaneHostPathMounts { + hostPathDirectoryOrCreate := v1.HostPathDirectoryOrCreate + hostPathFileOrCreate := v1.HostPathFileOrCreate mounts := newControlPlaneHostPathMounts() // HostPath volumes for the API Server // Read-only mount for the certificates directory // TODO: Always mount the K8s Certificates directory to a static path inside of the container - mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, kubeadmconstants.KubeCertificatesVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) + mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, kubeadmconstants.KubeCertificatesVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true, &hostPathDirectoryOrCreate) // Read-only mount for the ca certs (/etc/ssl/certs) directory - mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true) + mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true, &hostPathDirectoryOrCreate) // If external etcd is specified, mount the directories needed for accessing the CA/serving certs and the private key if len(cfg.Etcd.Endpoints) != 0 { @@ -60,23 +62,23 @@ func getHostPathVolumesForTheControlPlane(cfg *kubeadmapi.MasterConfiguration) c // HostPath volumes for the controller manager // Read-only mount for the certificates directory // TODO: Always mount the K8s Certificates directory to a static path inside of the container - mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, kubeadmconstants.KubeCertificatesVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, kubeadmconstants.KubeCertificatesVolumeName, cfg.CertificatesDir, cfg.CertificatesDir, true, &hostPathDirectoryOrCreate) // Read-only mount for the ca certs (/etc/ssl/certs) directory - mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, caCertsVolumeName, caCertsVolumePath, caCertsVolumePath, true, &hostPathDirectoryOrCreate) // Read-only mount for the controller manager kubeconfig file controllerManagerKubeConfigFile := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ControllerManagerKubeConfigFileName) - mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, kubeadmconstants.KubeConfigVolumeName, controllerManagerKubeConfigFile, controllerManagerKubeConfigFile, true) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, kubeadmconstants.KubeConfigVolumeName, controllerManagerKubeConfigFile, controllerManagerKubeConfigFile, true, &hostPathFileOrCreate) // HostPath volumes for the scheduler // Read-only mount for the scheduler kubeconfig file schedulerKubeConfigFile := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.SchedulerKubeConfigFileName) - mounts.NewHostPathMount(kubeadmconstants.KubeScheduler, kubeadmconstants.KubeConfigVolumeName, schedulerKubeConfigFile, schedulerKubeConfigFile, true) + mounts.NewHostPathMount(kubeadmconstants.KubeScheduler, kubeadmconstants.KubeConfigVolumeName, schedulerKubeConfigFile, schedulerKubeConfigFile, true, &hostPathFileOrCreate) // On some systems were we host-mount /etc/ssl/certs, it is also required to mount /etc/pki. This is needed // due to symlinks pointing from files in /etc/ssl/certs into /etc/pki/ if isPkiVolumeMountNeeded() { - mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, caCertsPkiVolumeName, caCertsPkiVolumePath, caCertsPkiVolumePath, true) - mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, caCertsPkiVolumeName, caCertsPkiVolumePath, caCertsPkiVolumePath, true) + mounts.NewHostPathMount(kubeadmconstants.KubeAPIServer, caCertsPkiVolumeName, caCertsPkiVolumePath, caCertsPkiVolumePath, true, &hostPathDirectoryOrCreate) + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, caCertsPkiVolumeName, caCertsPkiVolumePath, caCertsPkiVolumePath, true, &hostPathDirectoryOrCreate) } return mounts @@ -95,8 +97,8 @@ func newControlPlaneHostPathMounts() controlPlaneHostPathMounts { } } -func (c *controlPlaneHostPathMounts) NewHostPathMount(component, mountName, hostPath, containerPath string, readOnly bool) { - c.volumes[component] = append(c.volumes[component], staticpodutil.NewVolume(mountName, hostPath)) +func (c *controlPlaneHostPathMounts) NewHostPathMount(component, mountName, hostPath, containerPath string, readOnly bool, hostPathType *v1.HostPathType) { + c.volumes[component] = append(c.volumes[component], staticpodutil.NewVolume(mountName, hostPath, hostPathType)) c.volumeMounts[component] = append(c.volumeMounts[component], staticpodutil.NewVolumeMount(mountName, containerPath, readOnly)) } @@ -143,9 +145,10 @@ func getEtcdCertVolumes(etcdCfg kubeadmapi.Etcd) ([]v1.Volume, []v1.VolumeMount) volumes := []v1.Volume{} volumeMounts := []v1.VolumeMount{} + pathType := v1.HostPathDirectoryOrCreate for i, certDir := range certDirs.List() { name := fmt.Sprintf("etcd-certs-%d", i) - volumes = append(volumes, staticpodutil.NewVolume(name, certDir)) + volumes = append(volumes, staticpodutil.NewVolume(name, certDir, &pathType)) volumeMounts = append(volumeMounts, staticpodutil.NewVolumeMount(name, certDir, true)) } return volumes, volumeMounts diff --git a/cmd/kubeadm/app/phases/controlplane/volumes_test.go b/cmd/kubeadm/app/phases/controlplane/volumes_test.go index d711e03bad12d..ebe74eed56955 100644 --- a/cmd/kubeadm/app/phases/controlplane/volumes_test.go +++ b/cmd/kubeadm/app/phases/controlplane/volumes_test.go @@ -29,6 +29,7 @@ import ( ) func TestGetEtcdCertVolumes(t *testing.T) { + hostPathDirectoryOrCreate := v1.HostPathDirectoryOrCreate var tests = []struct { ca, cert, key string vol []v1.Volume @@ -67,7 +68,10 @@ func TestGetEtcdCertVolumes(t *testing.T) { { Name: "etcd-certs-0", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/var/lib/certs/etcd"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/var/lib/certs/etcd", + Type: &hostPathDirectoryOrCreate, + }, }, }, }, @@ -88,13 +92,19 @@ func TestGetEtcdCertVolumes(t *testing.T) { { Name: "etcd-certs-0", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/certs/etcd"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/certs/etcd", + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "etcd-certs-1", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/var/lib/certs/etcd"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/var/lib/certs/etcd", + Type: &hostPathDirectoryOrCreate, + }, }, }, }, @@ -120,19 +130,28 @@ func TestGetEtcdCertVolumes(t *testing.T) { { Name: "etcd-certs-0", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/certs/etcd"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/certs/etcd", + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "etcd-certs-1", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/var/lib/certs/etcd"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/var/lib/certs/etcd", + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "etcd-certs-2", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/var/lib/certs/private"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/var/lib/certs/private", + Type: &hostPathDirectoryOrCreate, + }, }, }, }, @@ -163,7 +182,10 @@ func TestGetEtcdCertVolumes(t *testing.T) { { Name: "etcd-certs-0", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/certs/etcd"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/certs/etcd", + Type: &hostPathDirectoryOrCreate, + }, }, }, }, @@ -184,7 +206,10 @@ func TestGetEtcdCertVolumes(t *testing.T) { { Name: "etcd-certs-0", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/certs/etcd"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/certs/etcd", + Type: &hostPathDirectoryOrCreate, + }, }, }, }, @@ -222,6 +247,8 @@ func TestGetEtcdCertVolumes(t *testing.T) { } func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { + hostPathDirectoryOrCreate := v1.HostPathDirectoryOrCreate + hostPathFileOrCreate := v1.HostPathFileOrCreate var tests = []struct { cfg *kubeadmapi.MasterConfiguration vol map[string][]v1.Volume @@ -238,13 +265,19 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { { Name: "k8s-certs", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: testCertsDir}, + HostPath: &v1.HostPathVolumeSource{ + Path: testCertsDir, + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "ca-certs", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/ssl/certs"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/ssl/certs", + Type: &hostPathDirectoryOrCreate, + }, }, }, }, @@ -252,19 +285,28 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { { Name: "k8s-certs", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: testCertsDir}, + HostPath: &v1.HostPathVolumeSource{ + Path: testCertsDir, + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "ca-certs", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/ssl/certs"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/ssl/certs", + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "kubeconfig", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/kubernetes/controller-manager.conf"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/kubernetes/controller-manager.conf", + Type: &hostPathFileOrCreate, + }, }, }, }, @@ -272,7 +314,10 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { { Name: "kubeconfig", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/kubernetes/scheduler.conf"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/kubernetes/scheduler.conf", + Type: &hostPathFileOrCreate, + }, }, }, }, @@ -332,25 +377,37 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { { Name: "k8s-certs", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: testCertsDir}, + HostPath: &v1.HostPathVolumeSource{ + Path: testCertsDir, + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "ca-certs", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/ssl/certs"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/ssl/certs", + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "etcd-certs-0", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/certs/etcd"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/certs/etcd", + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "etcd-certs-1", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/var/lib/certs/etcd"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/var/lib/certs/etcd", + Type: &hostPathDirectoryOrCreate, + }, }, }, }, @@ -358,19 +415,28 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { { Name: "k8s-certs", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: testCertsDir}, + HostPath: &v1.HostPathVolumeSource{ + Path: testCertsDir, + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "ca-certs", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/ssl/certs"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/ssl/certs", + Type: &hostPathDirectoryOrCreate, + }, }, }, { Name: "kubeconfig", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/kubernetes/controller-manager.conf"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/kubernetes/controller-manager.conf", + Type: &hostPathFileOrCreate, + }, }, }, }, @@ -378,7 +444,10 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { { Name: "kubeconfig", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/kubernetes/scheduler.conf"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/kubernetes/scheduler.conf", + Type: &hostPathFileOrCreate, + }, }, }, }, diff --git a/cmd/kubeadm/app/phases/etcd/local.go b/cmd/kubeadm/app/phases/etcd/local.go index 58fa56f9f7c27..e947794fccb5e 100644 --- a/cmd/kubeadm/app/phases/etcd/local.go +++ b/cmd/kubeadm/app/phases/etcd/local.go @@ -49,6 +49,7 @@ func CreateLocalEtcdStaticPodManifestFile(manifestDir string, cfg *kubeadmapi.Ma // GetEtcdPodSpec returns the etcd static Pod actualized to the context of the current MasterConfiguration // NB. GetEtcdPodSpec methods holds the information about how kubeadm creates etcd static pod mainfests. func GetEtcdPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.Pod { + pathType := v1.HostPathDirectoryOrCreate return staticpodutil.ComponentPod(v1.Container{ Name: kubeadmconstants.Etcd, Command: getEtcdCommand(cfg), @@ -56,7 +57,7 @@ func GetEtcdPodSpec(cfg *kubeadmapi.MasterConfiguration) v1.Pod { // Mount the etcd datadir path read-write so etcd can store data in a more persistent manner VolumeMounts: []v1.VolumeMount{staticpodutil.NewVolumeMount(etcdVolumeName, cfg.Etcd.DataDir, false)}, LivenessProbe: staticpodutil.ComponentProbe(2379, "/health", v1.URISchemeHTTP), - }, []v1.Volume{staticpodutil.NewVolume(etcdVolumeName, cfg.Etcd.DataDir)}) + }, []v1.Volume{staticpodutil.NewVolume(etcdVolumeName, cfg.Etcd.DataDir, &pathType)}) } // getEtcdCommand builds the right etcd command from the given config object diff --git a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go index 60dacbfab83d0..b5e2483c94ebe 100644 --- a/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go +++ b/cmd/kubeadm/app/phases/selfhosting/podspec_mutation_test.go @@ -186,6 +186,7 @@ func TestSetRightDNSPolicyOnPodSpec(t *testing.T) { } func TestSetSelfHostedVolumesForAPIServer(t *testing.T) { + hostPathDirectoryOrCreate := v1.HostPathDirectoryOrCreate var tests = []struct { podSpec *v1.PodSpec expected v1.PodSpec @@ -215,6 +216,7 @@ func TestSetSelfHostedVolumesForAPIServer(t *testing.T) { VolumeSource: v1.VolumeSource{ HostPath: &v1.HostPathVolumeSource{ Path: "/etc/ssl/certs", + Type: &hostPathDirectoryOrCreate, }, }, }, @@ -223,6 +225,7 @@ func TestSetSelfHostedVolumesForAPIServer(t *testing.T) { VolumeSource: v1.VolumeSource{ HostPath: &v1.HostPathVolumeSource{ Path: "/etc/kubernetes/pki", + Type: &hostPathDirectoryOrCreate, }, }, }, @@ -252,6 +255,7 @@ func TestSetSelfHostedVolumesForAPIServer(t *testing.T) { VolumeSource: v1.VolumeSource{ HostPath: &v1.HostPathVolumeSource{ Path: "/etc/ssl/certs", + Type: &hostPathDirectoryOrCreate, }, }, }, @@ -276,6 +280,8 @@ func TestSetSelfHostedVolumesForAPIServer(t *testing.T) { } func TestSetSelfHostedVolumesForControllerManager(t *testing.T) { + hostPathFileOrCreate := v1.HostPathFileOrCreate + hostPathDirectoryOrCreate := v1.HostPathDirectoryOrCreate var tests = []struct { podSpec *v1.PodSpec expected v1.PodSpec @@ -310,6 +316,7 @@ func TestSetSelfHostedVolumesForControllerManager(t *testing.T) { VolumeSource: v1.VolumeSource{ HostPath: &v1.HostPathVolumeSource{ Path: "/etc/ssl/certs", + Type: &hostPathDirectoryOrCreate, }, }, }, @@ -318,6 +325,7 @@ func TestSetSelfHostedVolumesForControllerManager(t *testing.T) { VolumeSource: v1.VolumeSource{ HostPath: &v1.HostPathVolumeSource{ Path: "/etc/kubernetes/pki", + Type: &hostPathDirectoryOrCreate, }, }, }, @@ -326,6 +334,7 @@ func TestSetSelfHostedVolumesForControllerManager(t *testing.T) { VolumeSource: v1.VolumeSource{ HostPath: &v1.HostPathVolumeSource{ Path: "/etc/kubernetes/controller-manager.conf", + Type: &hostPathFileOrCreate, }, }, }, @@ -360,6 +369,7 @@ func TestSetSelfHostedVolumesForControllerManager(t *testing.T) { VolumeSource: v1.VolumeSource{ HostPath: &v1.HostPathVolumeSource{ Path: "/etc/ssl/certs", + Type: &hostPathDirectoryOrCreate, }, }, }, @@ -388,6 +398,7 @@ func TestSetSelfHostedVolumesForControllerManager(t *testing.T) { } func TestSetSelfHostedVolumesForScheduler(t *testing.T) { + hostPathFileOrCreate := v1.HostPathFileOrCreate var tests = []struct { podSpec *v1.PodSpec expected v1.PodSpec @@ -414,6 +425,7 @@ func TestSetSelfHostedVolumesForScheduler(t *testing.T) { VolumeSource: v1.VolumeSource{ HostPath: &v1.HostPathVolumeSource{ Path: "/etc/kubernetes/scheduler.conf", + Type: &hostPathFileOrCreate, }, }, }, diff --git a/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go b/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go index aa73f012731b3..3ac5a6e6ad7e6 100644 --- a/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go +++ b/cmd/kubeadm/app/phases/selfhosting/selfhosting_test.go @@ -249,6 +249,7 @@ spec: name: ca-certs - hostPath: path: /etc/kubernetes/controller-manager.conf + type: FileOrCreate name: kubeconfig - hostPath: path: /etc/pki @@ -324,6 +325,7 @@ spec: name: ca-certs - hostPath: path: /etc/kubernetes/controller-manager.conf + type: FileOrCreate name: kubeconfig - hostPath: path: /etc/pki @@ -374,6 +376,7 @@ spec: volumes: - hostPath: path: /etc/kubernetes/scheduler.conf + type: FileOrCreate name: kubeconfig status: {} ` @@ -425,6 +428,7 @@ spec: volumes: - hostPath: path: /etc/kubernetes/scheduler.conf + type: FileOrCreate name: kubeconfig updateStrategy: {} status: diff --git a/cmd/kubeadm/app/util/staticpod/utils.go b/cmd/kubeadm/app/util/staticpod/utils.go index c8004bcc6b838..9b40ea66642f7 100644 --- a/cmd/kubeadm/app/util/staticpod/utils.go +++ b/cmd/kubeadm/app/util/staticpod/utils.go @@ -82,11 +82,14 @@ func ComponentProbe(port int, path string, scheme v1.URIScheme) *v1.Probe { } // NewVolume creates a v1.Volume with a hostPath mount to the specified location -func NewVolume(name, path string) v1.Volume { +func NewVolume(name, path string, pathType *v1.HostPathType) v1.Volume { return v1.Volume{ Name: name, VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: path}, + HostPath: &v1.HostPathVolumeSource{ + Path: path, + Type: pathType, + }, }, } } diff --git a/cmd/kubeadm/app/util/staticpod/utils_test.go b/cmd/kubeadm/app/util/staticpod/utils_test.go index d7ecb437180a7..9d7707f961ecd 100644 --- a/cmd/kubeadm/app/util/staticpod/utils_test.go +++ b/cmd/kubeadm/app/util/staticpod/utils_test.go @@ -123,10 +123,12 @@ func TestComponentPod(t *testing.T) { } func TestNewVolume(t *testing.T) { + hostPathDirectoryOrCreate := v1.HostPathDirectoryOrCreate var tests = []struct { name string path string expected v1.Volume + pathType *v1.HostPathType }{ { name: "foo", @@ -134,14 +136,18 @@ func TestNewVolume(t *testing.T) { expected: v1.Volume{ Name: "foo", VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "/etc/foo"}, + HostPath: &v1.HostPathVolumeSource{ + Path: "/etc/foo", + Type: &hostPathDirectoryOrCreate, + }, }, }, + pathType: &hostPathDirectoryOrCreate, }, } for _, rt := range tests { - actual := NewVolume(rt.name, rt.path) + actual := NewVolume(rt.name, rt.path, rt.pathType) if !reflect.DeepEqual(actual, rt.expected) { t.Errorf( "failed newVolume:\n\texpected: %v\n\t actual: %v", From 6e08007ce17baaaa224058062ac73f273bfddaff Mon Sep 17 00:00:00 2001 From: Beata Skiba Date: Wed, 23 Aug 2017 12:02:55 +0200 Subject: [PATCH 273/403] Distribute pods efficiently in CA scalability tests Instead of using runReplicatedPodOnEachNode method which is suited to a small number of nodes, distribute pods on the nodes with desired load using RCs that eat up all the space we want to be empty after distribution. --- .../cluster_autoscaler_scalability.go | 93 +++++++++++++------ 1 file changed, 67 insertions(+), 26 deletions(-) diff --git a/test/e2e/autoscaling/cluster_autoscaler_scalability.go b/test/e2e/autoscaling/cluster_autoscaler_scalability.go index 2a09881ee9407..30ca0ddcb2f7a 100644 --- a/test/e2e/autoscaling/cluster_autoscaler_scalability.go +++ b/test/e2e/autoscaling/cluster_autoscaler_scalability.go @@ -38,7 +38,7 @@ import ( const ( memoryReservationTimeout = 5 * time.Minute - largeResizeTimeout = 10 * time.Minute + largeResizeTimeout = 8 * time.Minute largeScaleUpTimeout = 10 * time.Minute largeScaleDownTimeout = 20 * time.Minute minute = 1 * time.Minute @@ -220,16 +220,21 @@ var _ = framework.KubeDescribe("Cluster size autoscaler scalability [Slow]", fun }) It("should scale down underutilized nodes [Feature:ClusterAutoscalerScalability4]", func() { - underutilizedReservation := int64(float64(memCapacityMb) * 0.01) - fullReservation := int64(float64(memCapacityMb) * 0.8) - perNodeReplicas := 10 + perPodReservation := int(float64(memCapacityMb) * 0.01) + // underutilizedNodes are 10% full + underutilizedPerNodeReplicas := 10 + // fullNodes are 70% full + fullPerNodeReplicas := 70 totalNodes := maxNodes + underutilizedRatio := 0.3 + maxDelta := 30 // resize cluster to totalNodes newSizes := map[string]int{ anyKey(originalSizes): totalNodes, } setMigSizes(newSizes) + framework.ExpectNoError(framework.WaitForClusterSize(f.ClientSet, totalNodes, largeResizeTimeout)) // annotate all nodes with no-scale-down @@ -241,36 +246,32 @@ var _ = framework.KubeDescribe("Cluster size autoscaler scalability [Slow]", fun }.AsSelector().String(), }) + framework.ExpectNoError(err) framework.ExpectNoError(addAnnotation(f, nodes.Items, ScaleDownDisabledKey, "true")) - // distribute pods (using taints) - divider := int(float64(len(nodes.Items)) * 0.7) - - fullNodes := nodes.Items[:divider] - underutilizedNodes := nodes.Items[divider:] + // distribute pods using replication controllers taking up space that should + // be empty after pods are distributed + underutilizedNodesNum := int(float64(maxNodes) * underutilizedRatio) + fullNodesNum := totalNodes - underutilizedNodesNum - framework.ExpectNoError(makeUnschedulable(f, underutilizedNodes)) + podDistribution := []podBatch{ + {numNodes: fullNodesNum, podsPerNode: fullPerNodeReplicas}, + {numNodes: underutilizedNodesNum, podsPerNode: underutilizedPerNodeReplicas}} - testId2 := "full" - labels2 := map[string]string{"test_id": testId2} - cleanup2, err := runReplicatedPodOnEachNodeWithCleanup(f, fullNodes, f.Namespace.Name, 1, "filling-pod", labels2, fullReservation) - defer cleanup2() - framework.ExpectNoError(err) - - framework.ExpectNoError(makeUnschedulable(f, fullNodes)) - - testId := "underutilized" - labels := map[string]string{"test_id": testId} - cleanup, err := runReplicatedPodOnEachNodeWithCleanup(f, underutilizedNodes, f.Namespace.Name, perNodeReplicas, "underutilizing-pod", labels, underutilizedReservation) + cleanup := distributeLoad(f, f.Namespace.Name, "10-70", podDistribution, perPodReservation, + int(0.95*float64(memCapacityMb)), map[string]string{}, largeScaleUpTimeout) defer cleanup() - framework.ExpectNoError(err) - framework.ExpectNoError(makeSchedulable(f, nodes.Items)) + // enable scale down again framework.ExpectNoError(addAnnotation(f, nodes.Items, ScaleDownDisabledKey, "false")) - // wait for scale down - expectedSize := int(float64(totalNodes) * 0.85) - nodesToScaleDownCount := totalNodes - expectedSize + // wait for scale down to start. Node deletion takes a long time, so we just + // wait for maximum of 30 nodes deleted + nodesToScaleDownCount := int(float64(totalNodes) * 0.1) + if nodesToScaleDownCount > maxDelta { + nodesToScaleDownCount = maxDelta + } + expectedSize := totalNodes - nodesToScaleDownCount timeout := time.Duration(nodesToScaleDownCount)*time.Minute + scaleDownTimeout framework.ExpectNoError(WaitForClusterSizeFunc(f.ClientSet, func(size int) bool { return size <= expectedSize @@ -453,6 +454,46 @@ func createHostPortPodsWithMemory(f *framework.Framework, id string, replicas, p } } +type podBatch struct { + numNodes int + podsPerNode int +} + +// distributeLoad distributes the pods in the way described by podDostribution, +// assuming all pods will have the same memory reservation and all nodes the same +// memory capacity. This allows us generate the load on the cluster in the exact +// way that we want. +// +// To achieve this we do the following: +// 1. Create replication controllers that eat up all the space that should be +// empty after setup, making sure they end up on different nodes by specifying +// conflicting host port +// 2. Create targer RC that will generate the load on the cluster +// 3. Remove the rcs created in 1. +func distributeLoad(f *framework.Framework, namespace string, id string, podDistribution []podBatch, + podMemRequestMegabytes int, nodeMemCapacity int, labels map[string]string, timeout time.Duration) func() error { + port := 8013 + // Create load-distribution RCs with one pod per node, reserving all remaining + // memory to force the distribution of pods for the target RCs. + // The load-distribution RCs will be deleted on function return. + totalPods := 0 + for i, podBatch := range podDistribution { + totalPods += podBatch.numNodes * podBatch.podsPerNode + remainingMem := nodeMemCapacity - podBatch.podsPerNode*podMemRequestMegabytes + replicas := podBatch.numNodes + cleanup := createHostPortPodsWithMemory(f, fmt.Sprintf("load-distribution%d", i), replicas, port, remainingMem*replicas, timeout) + defer cleanup() + } + framework.ExpectNoError(waitForAllCaPodsReadyInNamespace(f, f.ClientSet)) + // Create the target RC + rcConfig := reserveMemoryRCConfig(f, id, totalPods, totalPods*podMemRequestMegabytes, timeout) + framework.ExpectNoError(framework.RunRC(*rcConfig)) + framework.ExpectNoError(waitForAllCaPodsReadyInNamespace(f, f.ClientSet)) + return func() error { + return framework.DeleteRCAndPods(f.ClientSet, f.InternalClientset, f.Namespace.Name, id) + } +} + func timeTrack(start time.Time, name string) { elapsed := time.Since(start) glog.Infof("%s took %s", name, elapsed) From 359fc7a4f4b477f9f64d925228e0aa2af3dc4945 Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Wed, 23 Aug 2017 13:54:45 -0700 Subject: [PATCH 274/403] Change the FakeCloudAddressService to store Alpha objects internally The change assumes the compute Alpha object is the superset of the v1 object. By storing the Alpha objects internally in the fake, we can convert them to Beta and v1 to test different functions. --- .../providers/gce/gce_addresses_fakes.go | 64 ++++++++++++++----- .../gce/gce_loadbalancer_external_test.go | 8 ++- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go index ce4422a7fd51e..e9873df11b590 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go @@ -17,6 +17,7 @@ limitations under the License. package gce import ( + "encoding/json" "fmt" "net/http" @@ -32,7 +33,7 @@ type FakeCloudAddressService struct { reservedAddrs map[string]bool // addrsByRegionAndName // Outer key is for region string; inner key is for address name. - addrsByRegionAndName map[string]map[string]*compute.Address + addrsByRegionAndName map[string]map[string]*computealpha.Address } // FakeCloudAddressService Implements CloudAddressService @@ -41,23 +42,23 @@ var _ CloudAddressService = &FakeCloudAddressService{} func NewFakeCloudAddressService() *FakeCloudAddressService { return &FakeCloudAddressService{ reservedAddrs: make(map[string]bool), - addrsByRegionAndName: make(map[string]map[string]*compute.Address), + addrsByRegionAndName: make(map[string]map[string]*computealpha.Address), } } -// SetRegionalAddresses populates the addresses of the region with the name to -// IP map. -func (cas *FakeCloudAddressService) SetRegionalAddresses(region string, ipList map[string]string) { +// SetRegionalAddresses sets the addresses of ther region. This is used for +// setting the test environment. +func (cas *FakeCloudAddressService) SetRegionalAddresses(region string, addrs []*computealpha.Address) { // Reset addresses in the region. - cas.addrsByRegionAndName[region] = make(map[string]*compute.Address) + cas.addrsByRegionAndName[region] = make(map[string]*computealpha.Address) - for name, ip := range ipList { - cas.reservedAddrs[ip] = true - cas.addrsByRegionAndName[region][name] = &compute.Address{Name: name, Address: ip} + for _, addr := range addrs { + cas.reservedAddrs[addr.Address] = true + cas.addrsByRegionAndName[region][addr.Name] = addr } } -func (cas *FakeCloudAddressService) ReserveRegionAddress(addr *compute.Address, region string) error { +func (cas *FakeCloudAddressService) ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error { if addr.Address == "" { addr.Address = fmt.Sprintf("1.2.3.%d", cas.count) cas.count++ @@ -68,7 +69,7 @@ func (cas *FakeCloudAddressService) ReserveRegionAddress(addr *compute.Address, } if _, exists := cas.addrsByRegionAndName[region]; !exists { - cas.addrsByRegionAndName[region] = make(map[string]*compute.Address) + cas.addrsByRegionAndName[region] = make(map[string]*computealpha.Address) } if _, exists := cas.addrsByRegionAndName[region][addr.Name]; exists { @@ -80,7 +81,12 @@ func (cas *FakeCloudAddressService) ReserveRegionAddress(addr *compute.Address, return nil } -func (cas *FakeCloudAddressService) GetRegionAddress(name, region string) (*compute.Address, error) { +func (cas *FakeCloudAddressService) ReserveRegionAddress(addr *compute.Address, region string) error { + alphaAddr := convertToAlphaAddress(addr) + return cas.ReserveAlphaRegionAddress(alphaAddr, region) +} + +func (cas *FakeCloudAddressService) GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) { if _, exists := cas.addrsByRegionAndName[region]; !exists { return nil, makeGoogleAPINotFoundError("") } @@ -92,6 +98,14 @@ func (cas *FakeCloudAddressService) GetRegionAddress(name, region string) (*comp } } +func (cas *FakeCloudAddressService) GetRegionAddress(name, region string) (*compute.Address, error) { + addr, err := cas.GetAlphaRegionAddress(name, region) + if addr != nil { + return convertToV1Address(addr), err + } + return nil, err +} + func (cas *FakeCloudAddressService) GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error) { if _, exists := cas.addrsByRegionAndName[region]; !exists { return nil, makeGoogleAPINotFoundError("") @@ -99,16 +113,32 @@ func (cas *FakeCloudAddressService) GetRegionAddressByIP(region, ipAddress strin for _, addr := range cas.addrsByRegionAndName[region] { if addr.Address == ipAddress { - return addr, nil + return convertToV1Address(addr), nil } } return nil, makeGoogleAPINotFoundError("") } -func (cas *FakeCloudAddressService) GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) { - return nil, fmt.Errorf("not implemented") +func convertToV1Address(object gceObject) *compute.Address { + enc, err := object.MarshalJSON() + if err != nil { + panic(fmt.Sprintf("Failed to encode to json: %v", err)) + } + var addr compute.Address + if err := json.Unmarshal(enc, &addr); err != nil { + panic(fmt.Sprintf("Failed to convert GCE apiObject %v to v1 address: %v", object, err)) + } + return &addr } -func (cas *FakeCloudAddressService) ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error { - return fmt.Errorf("not implemented") +func convertToAlphaAddress(object gceObject) *computealpha.Address { + enc, err := object.MarshalJSON() + if err != nil { + panic(fmt.Sprintf("Failed to encode to json: %v", err)) + } + var addr computealpha.Address + if err := json.Unmarshal(enc, &addr); err != nil { + panic(fmt.Sprintf("Failed to convert GCE apiObject %v to alpha address: %v", object, err)) + } + return &addr } diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go index a1535f7657a03..d0f26f8910d35 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go @@ -21,6 +21,8 @@ import ( "testing" "github.com/stretchr/testify/assert" + + computealpha "google.golang.org/api/compute/v0.alpha" ) func TestEnsureStaticIP(t *testing.T) { @@ -51,13 +53,13 @@ func TestVerifyRequestedIP(t *testing.T) { for desc, tc := range map[string]struct { requestedIP string fwdRuleIP string - ipList map[string]string + addrList []*computealpha.Address expectErr bool expectUserOwned bool }{ "requested IP exists": { requestedIP: "1.1.1.1", - ipList: map[string]string{"foo": "1.1.1.1"}, + addrList: []*computealpha.Address{{Name: "foo", Address: "1.1.1.1"}}, expectErr: false, expectUserOwned: true, }, @@ -76,7 +78,7 @@ func TestVerifyRequestedIP(t *testing.T) { }, } { t.Run(desc, func(t *testing.T) { - s.SetRegionalAddresses(region, tc.ipList) + s.SetRegionalAddresses(region, tc.addrList) isUserOwnedIP, err := verifyUserRequestedIP(s, region, tc.requestedIP, tc.fwdRuleIP, lbRef) assert.Equal(t, tc.expectErr, err != nil, fmt.Sprintf("err: %v", err)) assert.Equal(t, tc.expectUserOwned, isUserOwnedIP, desc) From 4525446af20cc1309381ddd48f1bb20d1be7682b Mon Sep 17 00:00:00 2001 From: Huamin Chen Date: Fri, 16 Jun 2017 15:23:22 +0000 Subject: [PATCH 275/403] azure file volume: add secret namespace api Signed-off-by: Huamin Chen --- pkg/api/persistentvolume/util.go | 10 ++- pkg/api/persistentvolume/util_test.go | 11 +++- pkg/api/types.go | 18 ++++- pkg/api/v1/zz_generated.conversion.go | 2 + pkg/api/validation/validation.go | 18 ++++- pkg/api/zz_generated.deepcopy.go | 8 ++- pkg/printers/internalversion/describe.go | 15 ++++- pkg/volume/azure_file/azure_file.go | 69 +++++++++++++------ pkg/volume/azure_file/azure_file_test.go | 84 +++++++++++++++++++++++- pkg/volume/azure_file/azure_provision.go | 28 ++++---- staging/src/k8s.io/api/core/v1/types.go | 18 ++++- test/integration/auth/node_test.go | 2 +- 12 files changed, 238 insertions(+), 45 deletions(-) diff --git a/pkg/api/persistentvolume/util.go b/pkg/api/persistentvolume/util.go index d4edd807a79f7..ee017403c5e9c 100644 --- a/pkg/api/persistentvolume/util.go +++ b/pkg/api/persistentvolume/util.go @@ -37,8 +37,14 @@ func VisitPVSecretNames(pv *api.PersistentVolume, visitor Visitor) bool { source := &pv.Spec.PersistentVolumeSource switch { case source.AzureFile != nil: - if len(source.AzureFile.SecretName) > 0 && !visitor(getClaimRefNamespace(pv), source.AzureFile.SecretName) { - return false + if source.AzureFile.SecretNamespace != nil && len(*source.AzureFile.SecretNamespace) > 0 { + if len(source.AzureFile.SecretName) > 0 && !visitor(*source.AzureFile.SecretNamespace, source.AzureFile.SecretName) { + return false + } + } else { + if len(source.AzureFile.SecretName) > 0 && !visitor(getClaimRefNamespace(pv), source.AzureFile.SecretName) { + return false + } } return true case source.CephFS != nil: diff --git a/pkg/api/persistentvolume/util_test.go b/pkg/api/persistentvolume/util_test.go index 87564d337233e..4e1d07e12a33c 100644 --- a/pkg/api/persistentvolume/util_test.go +++ b/pkg/api/persistentvolume/util_test.go @@ -30,12 +30,19 @@ import ( func TestPVSecrets(t *testing.T) { // Stub containing all possible secret references in a PV. // The names of the referenced secrets match struct paths detected by reflection. + secretNamespace := "Spec.PersistentVolumeSource.AzureFile.SecretNamespace" pvs := []*api.PersistentVolume{ {Spec: api.PersistentVolumeSpec{ ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, PersistentVolumeSource: api.PersistentVolumeSource{ - AzureFile: &api.AzureFileVolumeSource{ + AzureFile: &api.AzureFilePersistentVolumeSource{ SecretName: "Spec.PersistentVolumeSource.AzureFile.SecretName"}}}}, + {Spec: api.PersistentVolumeSpec{ + ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + AzureFile: &api.AzureFilePersistentVolumeSource{ + SecretName: "Spec.PersistentVolumeSource.AzureFile.SecretName", + SecretNamespace: &secretNamespace}}}}, {Spec: api.PersistentVolumeSpec{ ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, PersistentVolumeSource: api.PersistentVolumeSource{ @@ -88,6 +95,7 @@ func TestPVSecrets(t *testing.T) { // excludedSecretPaths holds struct paths to fields with "secret" in the name that are not actually references to secret API objects excludedSecretPaths := sets.NewString( "Spec.PersistentVolumeSource.CephFS.SecretFile", + "Spec.PersistentVolumeSource.AzureFile.SecretNamespace", ) // expectedSecretPaths holds struct paths to fields with "secret" in the name that are references to secret API objects. // every path here should be represented as an example in the PV stub above, with the secret name set to the path. @@ -122,6 +130,7 @@ func TestPVSecrets(t *testing.T) { expectedNamespacedNames := sets.NewString( "claimrefns/Spec.PersistentVolumeSource.AzureFile.SecretName", + "Spec.PersistentVolumeSource.AzureFile.SecretNamespace/Spec.PersistentVolumeSource.AzureFile.SecretName", "claimrefns/Spec.PersistentVolumeSource.CephFS.SecretRef", "claimrefns/Spec.PersistentVolumeSource.FlexVolume.SecretRef", "claimrefns/Spec.PersistentVolumeSource.RBD.SecretRef", diff --git a/pkg/api/types.go b/pkg/api/types.go index 630ca3b48af20..2b344c6d38d49 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -369,7 +369,7 @@ type PersistentVolumeSource struct { Flocker *FlockerVolumeSource // AzureFile represents an Azure File Service mount on the host and bind mount to the pod. // +optional - AzureFile *AzureFileVolumeSource + AzureFile *AzureFilePersistentVolumeSource // VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine // +optional VsphereVolume *VsphereVirtualDiskVolumeSource @@ -1087,6 +1087,22 @@ type AzureFileVolumeSource struct { ReadOnly bool } +// AzureFile represents an Azure File Service mount on the host and bind mount to the pod. +type AzureFilePersistentVolumeSource struct { + // the name of secret that contains Azure Storage Account Name and Key + SecretName string + // Share Name + ShareName string + // Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + ReadOnly bool + // the namespace of the secret that contains Azure Storage Account Name and Key + // default is the same as the Pod + // +optional + SecretNamespace *string +} + // Represents a vSphere volume resource. type VsphereVirtualDiskVolumeSource struct { // Path that identifies vSphere volume vmdk diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 228c8fe9361dc..6293ab4c96819 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -511,6 +511,7 @@ func autoConvert_v1_AzureFileVolumeSource_To_api_AzureFileVolumeSource(in *v1.Az out.SecretName = in.SecretName out.ShareName = in.ShareName out.ReadOnly = in.ReadOnly + out.SecretNamespace = (*string)(unsafe.Pointer(in.SecretNamespace)) return nil } @@ -523,6 +524,7 @@ func autoConvert_api_AzureFileVolumeSource_To_v1_AzureFileVolumeSource(in *api.A out.SecretName = in.SecretName out.ShareName = in.ShareName out.ReadOnly = in.ReadOnly + out.SecretNamespace = (*string)(unsafe.Pointer(in.SecretNamespace)) return nil } diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 1dd650fe40dc2..9bbb3c332631d 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -1098,6 +1098,22 @@ func validateAzureFile(azure *api.AzureFileVolumeSource, fldPath *field.Path) fi return allErrs } +func validateAzureFilePV(azure *api.AzureFilePersistentVolumeSource, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if azure.SecretName == "" { + allErrs = append(allErrs, field.Required(fldPath.Child("secretName"), "")) + } + if azure.ShareName == "" { + allErrs = append(allErrs, field.Required(fldPath.Child("shareName"), "")) + } + if azure.SecretNamespace != nil { + if len(*azure.SecretNamespace) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("secretNamespace"), "")) + } + } + return allErrs +} + func validateAzureDisk(azure *api.AzureDiskVolumeSource, fldPath *field.Path) field.ErrorList { var supportedCachingModes = sets.NewString(string(api.AzureDataDiskCachingNone), string(api.AzureDataDiskCachingReadOnly), string(api.AzureDataDiskCachingReadWrite)) var supportedDiskKinds = sets.NewString(string(api.AzureSharedBlobDisk), string(api.AzureDedicatedBlobDisk), string(api.AzureManagedDisk)) @@ -1375,7 +1391,7 @@ func ValidatePersistentVolume(pv *api.PersistentVolume) field.ErrorList { } else { numVolumes++ - allErrs = append(allErrs, validateAzureFile(pv.Spec.AzureFile, specPath.Child("azureFile"))...) + allErrs = append(allErrs, validateAzureFilePV(pv.Spec.AzureFile, specPath.Child("azureFile"))...) } } diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index 6ae4f9a97ae36..875e991a028e1 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -3680,7 +3680,9 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { *out = nil } else { *out = new(AzureFileVolumeSource) - **out = **in + if err := DeepCopy_api_AzureFileVolumeSource(*in, *out, c); err != nil { + return err + } } } if in.VsphereVolume != nil { @@ -5994,7 +5996,9 @@ func (in *VolumeSource) DeepCopyInto(out *VolumeSource) { *out = nil } else { *out = new(AzureFileVolumeSource) - **out = **in + if err := DeepCopy_api_AzureFileVolumeSource(*in, *out, c); err != nil { + return err + } } } if in.ConfigMap != nil { diff --git a/pkg/printers/internalversion/describe.go b/pkg/printers/internalversion/describe.go index 3a1724866a8ae..04b16fff344f2 100644 --- a/pkg/printers/internalversion/describe.go +++ b/pkg/printers/internalversion/describe.go @@ -993,6 +993,19 @@ func printAzureFileVolumeSource(azureFile *api.AzureFileVolumeSource, w PrefixWr azureFile.SecretName, azureFile.ShareName, azureFile.ReadOnly) } +func printAzureFilePersistentVolumeSource(azureFile *api.AzureFilePersistentVolumeSource, w PrefixWriter) { + ns := "" + if azureFile.SecretNamespace != nil { + ns = *azureFile.SecretNamespace + } + w.Write(LEVEL_2, "Type:\tAzureFile (an Azure File Service mount on the host and bind mount to the pod)\n"+ + " SecretName:\t%v\n"+ + " SecretNamespace:\t%v\n"+ + " ShareName:\t%v\n"+ + " ReadOnly:\t%v\n", + azureFile.SecretName, ns, azureFile.ShareName, azureFile.ReadOnly) +} + func printFlexVolumeSource(flex *api.FlexVolumeSource, w PrefixWriter) { w.Write(LEVEL_2, "Type:\tFlexVolume (a generic volume resource that is provisioned/attached using an exec based plugin)\n"+ " Driver:\t%v\n"+ @@ -1088,7 +1101,7 @@ func describePersistentVolume(pv *api.PersistentVolume, events *api.EventList) ( case pv.Spec.FC != nil: printFCVolumeSource(pv.Spec.FC, w) case pv.Spec.AzureFile != nil: - printAzureFileVolumeSource(pv.Spec.AzureFile, w) + printAzureFilePersistentVolumeSource(pv.Spec.AzureFile, w) case pv.Spec.FlexVolume != nil: printFlexVolumeSource(pv.Spec.FlexVolume, w) case pv.Spec.Flocker != nil: diff --git a/pkg/volume/azure_file/azure_file.go b/pkg/volume/azure_file/azure_file.go index 26077162382b5..2e51e46853a91 100644 --- a/pkg/volume/azure_file/azure_file.go +++ b/pkg/volume/azure_file/azure_file.go @@ -63,12 +63,12 @@ func (plugin *azureFilePlugin) GetPluginName() string { } func (plugin *azureFilePlugin) GetVolumeName(spec *volume.Spec) (string, error) { - volumeSource, _, err := getVolumeSource(spec) + share, _, err := getVolumeSource(spec) if err != nil { return "", err } - return volumeSource.ShareName, nil + return share, nil } func (plugin *azureFilePlugin) CanSupport(spec *volume.Spec) bool { @@ -102,11 +102,11 @@ func (plugin *azureFilePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volu } func (plugin *azureFilePlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, util azureUtil, mounter mount.Interface) (volume.Mounter, error) { - source, readOnly, err := getVolumeSource(spec) + share, readOnly, err := getVolumeSource(spec) if err != nil { return nil, err } - + secretName, secretNamespace, err := getSecretNameAndNamespace(spec, pod.Namespace) return &azureFileMounter{ azureFile: &azureFile{ volName: spec.Name(), @@ -115,11 +115,12 @@ func (plugin *azureFilePlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod plugin: plugin, MetricsProvider: volume.NewMetricsStatFS(getPath(pod.UID, spec.Name(), plugin.host)), }, - util: util, - secretName: source.SecretName, - shareName: source.ShareName, - readOnly: readOnly, - mountOptions: volume.MountOptionFromSpec(spec), + util: util, + secretNamespace: secretNamespace, + secretName: secretName, + shareName: share, + readOnly: readOnly, + mountOptions: volume.MountOptionFromSpec(spec), }, nil } @@ -166,11 +167,12 @@ func (azureFileVolume *azureFile) GetPath() string { type azureFileMounter struct { *azureFile - util azureUtil - secretName string - shareName string - readOnly bool - mountOptions []string + util azureUtil + secretName string + secretNamespace string + shareName string + readOnly bool + mountOptions []string } var _ volume.Mounter = &azureFileMounter{} @@ -205,7 +207,7 @@ func (b *azureFileMounter) SetUpAt(dir string, fsGroup *int64) error { return nil } var accountKey, accountName string - if accountName, accountKey, err = b.util.GetAzureCredentials(b.plugin.host, b.pod.Namespace, b.secretName); err != nil { + if accountName, accountKey, err = b.util.GetAzureCredentials(b.plugin.host, b.secretNamespace, b.secretName); err != nil { return err } os.MkdirAll(dir, 0700) @@ -260,16 +262,43 @@ func (c *azureFileUnmounter) TearDownAt(dir string) error { return util.UnmountPath(dir, c.mounter) } -func getVolumeSource( - spec *volume.Spec) (*v1.AzureFileVolumeSource, bool, error) { +func getVolumeSource(spec *volume.Spec) (string, bool, error) { if spec.Volume != nil && spec.Volume.AzureFile != nil { - return spec.Volume.AzureFile, spec.Volume.AzureFile.ReadOnly, nil + share := spec.Volume.AzureFile.ShareName + readOnly := spec.Volume.AzureFile.ReadOnly + return share, readOnly, nil } else if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.AzureFile != nil { - return spec.PersistentVolume.Spec.AzureFile, spec.ReadOnly, nil + share := spec.PersistentVolume.Spec.AzureFile.ShareName + readOnly := spec.ReadOnly + return share, readOnly, nil + } + return "", false, fmt.Errorf("Spec does not reference an AzureFile volume type") +} + +func getSecretNameAndNamespace(spec *volume.Spec, defaultNamespace string) (string, string, error) { + secretName := "" + secretNamespace := "" + if spec.Volume != nil && spec.Volume.AzureFile != nil { + secretName = spec.Volume.AzureFile.SecretName + secretNamespace = defaultNamespace + + } else if spec.PersistentVolume != nil && + spec.PersistentVolume.Spec.AzureFile != nil { + secretNamespace = defaultNamespace + if spec.PersistentVolume.Spec.AzureFile.SecretNamespace != nil { + secretNamespace = *spec.PersistentVolume.Spec.AzureFile.SecretNamespace + } + secretName = spec.PersistentVolume.Spec.AzureFile.SecretName + } else { + return "", "", fmt.Errorf("Spec does not reference an AzureFile volume type") + } + + if len(secretNamespace) == 0 { + return "", "", fmt.Errorf("invalid Azure volume: nil namespace") } + return secretName, secretNamespace, nil - return nil, false, fmt.Errorf("Spec does not reference an AzureFile volume type") } func getAzureCloud(cloudProvider cloudprovider.Interface) (*azure.Cloud, error) { diff --git a/pkg/volume/azure_file/azure_file_test.go b/pkg/volume/azure_file/azure_file_test.go index 425657e0eab1f..8991d5e231a94 100644 --- a/pkg/volume/azure_file/azure_file_test.go +++ b/pkg/volume/azure_file/azure_file_test.go @@ -53,7 +53,7 @@ func TestCanSupport(t *testing.T) { if !plug.CanSupport(&volume.Spec{Volume: &v1.Volume{VolumeSource: v1.VolumeSource{AzureFile: &v1.AzureFileVolumeSource{}}}}) { t.Errorf("Expected true") } - if !plug.CanSupport(&volume.Spec{PersistentVolume: &v1.PersistentVolume{Spec: v1.PersistentVolumeSpec{PersistentVolumeSource: v1.PersistentVolumeSource{AzureFile: &v1.AzureFileVolumeSource{}}}}}) { + if !plug.CanSupport(&volume.Spec{PersistentVolume: &v1.PersistentVolume{Spec: v1.PersistentVolumeSpec{PersistentVolumeSource: v1.PersistentVolumeSource{AzureFile: &v1.AzureFilePersistentVolumeSource{}}}}}) { t.Errorf("Expected true") } } @@ -204,7 +204,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { }, Spec: v1.PersistentVolumeSpec{ PersistentVolumeSource: v1.PersistentVolumeSource{ - AzureFile: &v1.AzureFileVolumeSource{}, + AzureFile: &v1.AzureFilePersistentVolumeSource{}, }, ClaimRef: &v1.ObjectReference{ Name: "claimA", @@ -287,3 +287,83 @@ func TestMounterAndUnmounterTypeAssert(t *testing.T) { t.Errorf("Volume Unmounter can be type-assert to Mounter") } } + +type testcase struct { + name string + defaultNs string + spec *volume.Spec + // Expected return of the test + expectedName string + expectedNs string + expectedError error +} + +func TestGetSecretNameAndNamespaceForPV(t *testing.T) { + secretNs := "ns" + tests := []testcase{ + { + name: "persistent volume source", + defaultNs: "default", + spec: &volume.Spec{ + PersistentVolume: &v1.PersistentVolume{ + Spec: v1.PersistentVolumeSpec{ + PersistentVolumeSource: v1.PersistentVolumeSource{ + AzureFile: &v1.AzureFilePersistentVolumeSource{ + ShareName: "share", + SecretName: "name", + SecretNamespace: &secretNs, + }, + }, + }, + }, + }, + expectedName: "name", + expectedNs: "ns", + expectedError: nil, + }, + { + name: "persistent volume source without namespace", + defaultNs: "default", + spec: &volume.Spec{ + PersistentVolume: &v1.PersistentVolume{ + Spec: v1.PersistentVolumeSpec{ + PersistentVolumeSource: v1.PersistentVolumeSource{ + AzureFile: &v1.AzureFilePersistentVolumeSource{ + ShareName: "share", + SecretName: "name", + }, + }, + }, + }, + }, + expectedName: "name", + expectedNs: "default", + expectedError: nil, + }, + { + name: "pod volume source", + defaultNs: "default", + spec: &volume.Spec{ + Volume: &v1.Volume{ + VolumeSource: v1.VolumeSource{ + AzureFile: &v1.AzureFileVolumeSource{ + ShareName: "share", + SecretName: "name", + }, + }, + }, + }, + expectedName: "name", + expectedNs: "default", + expectedError: nil, + }, + } + for _, testcase := range tests { + resultName, resultNs, err := getSecretNameAndNamespace(testcase.spec, testcase.defaultNs) + if err != testcase.expectedError || resultName != testcase.expectedName || resultNs != testcase.expectedNs { + t.Errorf("%s failed: expected err=%v ns=%q name=%q, got %v/%q/%q", testcase.name, testcase.expectedError, testcase.expectedNs, testcase.expectedName, + err, resultNs, resultName) + } + } + +} diff --git a/pkg/volume/azure_file/azure_provision.go b/pkg/volume/azure_file/azure_provision.go index a74fbc2cefa88..bebec4599fb5e 100644 --- a/pkg/volume/azure_file/azure_provision.go +++ b/pkg/volume/azure_file/azure_provision.go @@ -63,15 +63,13 @@ func (plugin *azureFilePlugin) newDeleterInternal(spec *volume.Spec, util azureU if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.AzureFile == nil { return nil, fmt.Errorf("invalid PV spec") } - pvSpec := spec.PersistentVolume - if pvSpec.Spec.ClaimRef.Namespace == "" { - glog.Errorf("namespace cannot be nil") - return nil, fmt.Errorf("invalid PV spec: nil namespace") + + secretName, secretNamespace, err := getSecretNameAndNamespace(spec, spec.PersistentVolume.Spec.ClaimRef.Namespace) + if err != nil { + return nil, err } - nameSpace := pvSpec.Spec.ClaimRef.Namespace - secretName := pvSpec.Spec.AzureFile.SecretName - shareName := pvSpec.Spec.AzureFile.ShareName - if accountName, accountKey, err := util.GetAzureCredentials(plugin.host, nameSpace, secretName); err != nil { + shareName := spec.PersistentVolume.Spec.AzureFile.ShareName + if accountName, accountKey, err := util.GetAzureCredentials(plugin.host, secretNamespace, secretName); err != nil { return nil, err } else { return &azureFileDeleter{ @@ -144,7 +142,7 @@ func (a *azureFileProvisioner) Provision() (*v1.PersistentVolume, error) { capacity := a.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] requestBytes := capacity.Value() requestGB := int(volume.RoundUpSize(requestBytes, 1024*1024*1024)) - + secretNamespace := a.options.PVC.Namespace // Apply ProvisionerParameters (case-insensitive). We leave validation of // the values to the cloud provider. for k, v := range a.options.Parameters { @@ -155,6 +153,8 @@ func (a *azureFileProvisioner) Provision() (*v1.PersistentVolume, error) { location = v case "storageaccount": account = v + case "secretnamespace": + secretNamespace = v default: return nil, fmt.Errorf("invalid option %q for volume plugin %s", k, a.plugin.GetPluginName()) } @@ -168,8 +168,9 @@ func (a *azureFileProvisioner) Provision() (*v1.PersistentVolume, error) { if err != nil { return nil, err } + // create a secret for storage account and key - secretName, err := a.util.SetAzureCredentials(a.plugin.host, a.options.PVC.Namespace, account, key) + secretName, err := a.util.SetAzureCredentials(a.plugin.host, secretNamespace, account, key) if err != nil { return nil, err } @@ -189,9 +190,10 @@ func (a *azureFileProvisioner) Provision() (*v1.PersistentVolume, error) { v1.ResourceName(v1.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", requestGB)), }, PersistentVolumeSource: v1.PersistentVolumeSource{ - AzureFile: &v1.AzureFileVolumeSource{ - SecretName: secretName, - ShareName: name, + AzureFile: &v1.AzureFilePersistentVolumeSource{ + SecretName: secretName, + ShareName: name, + SecretNamespace: &secretNamespace, }, }, }, diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index f92a1b3a41238..34d5395939da9 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -423,7 +423,7 @@ type PersistentVolumeSource struct { FlexVolume *FlexVolumeSource `json:"flexVolume,omitempty" protobuf:"bytes,12,opt,name=flexVolume"` // AzureFile represents an Azure File Service mount on the host and bind mount to the pod. // +optional - AzureFile *AzureFileVolumeSource `json:"azureFile,omitempty" protobuf:"bytes,13,opt,name=azureFile"` + AzureFile *AzureFilePersistentVolumeSource `json:"azureFile,omitempty" protobuf:"bytes,13,opt,name=azureFile"` // VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine // +optional VsphereVolume *VsphereVirtualDiskVolumeSource `json:"vsphereVolume,omitempty" protobuf:"bytes,14,opt,name=vsphereVolume"` @@ -1169,6 +1169,22 @@ type AzureFileVolumeSource struct { ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,3,opt,name=readOnly"` } +// AzureFile represents an Azure File Service mount on the host and bind mount to the pod. +type AzureFilePersistentVolumeSource struct { + // the name of secret that contains Azure Storage Account Name and Key + SecretName string `json:"secretName" protobuf:"bytes,1,opt,name=secretName"` + // Share Name + ShareName string `json:"shareName" protobuf:"bytes,2,opt,name=shareName"` + // Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,3,opt,name=readOnly"` + // the namespace of the secret that contains Azure Storage Account Name and Key + // default is the same as the Pod + // +optional + SecretNamespace *string `json:"secretNamespace" protobuf:"bytes,4,opt,name=secretNamespace"` +} + // Represents a vSphere volume resource. type VsphereVirtualDiskVolumeSource struct { // Path that identifies vSphere volume vmdk diff --git a/test/integration/auth/node_test.go b/test/integration/auth/node_test.go index f27b6f00bad1a..e8eedff7770e2 100644 --- a/test/integration/auth/node_test.go +++ b/test/integration/auth/node_test.go @@ -136,7 +136,7 @@ func TestNodeAuthorizer(t *testing.T) { AccessModes: []api.PersistentVolumeAccessMode{api.ReadOnlyMany}, Capacity: api.ResourceList{api.ResourceStorage: resource.MustParse("1")}, ClaimRef: &api.ObjectReference{Namespace: "ns", Name: "mypvc"}, - PersistentVolumeSource: api.PersistentVolumeSource{AzureFile: &api.AzureFileVolumeSource{ShareName: "default", SecretName: "mypvsecret"}}, + PersistentVolumeSource: api.PersistentVolumeSource{AzureFile: &api.AzureFilePersistentVolumeSource{ShareName: "default", SecretName: "mypvsecret"}}, }, }); err != nil { t.Fatal(err) From 8a38cf1b1bd6bf1459d3f87edf1e6a044398c68e Mon Sep 17 00:00:00 2001 From: Huamin Chen Date: Fri, 16 Jun 2017 17:16:33 +0000 Subject: [PATCH 276/403] generated files Signed-off-by: Huamin Chen --- api/openapi-spec/swagger.json | 27 +- api/swagger-spec/v1.json | 35 +- docs/api-reference/v1/definitions.html | 65 +- pkg/api/v1/zz_generated.conversion.go | 34 +- pkg/api/zz_generated.deepcopy.go | 39 +- .../src/k8s.io/api/core/v1/generated.pb.go | 2030 +++++++++-------- .../src/k8s.io/api/core/v1/generated.proto | 21 +- .../src/k8s.io/api/core/v1/types.generated.go | 370 ++- .../core/v1/types_swagger_doc_generated.go | 12 + .../api/core/v1/zz_generated.deepcopy.go | 33 +- 10 files changed, 1740 insertions(+), 926 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 3ba22ca413ecc..5b6551245ec0c 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -58134,6 +58134,31 @@ } } }, + "io.k8s.api.core.v1.AzureFilePersistentVolumeSource": { + "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod.", + "required": [ + "secretName", + "shareName" + ], + "properties": { + "readOnly": { + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "type": "boolean" + }, + "secretName": { + "description": "the name of secret that contains Azure Storage Account Name and Key", + "type": "string" + }, + "secretNamespace": { + "description": "the namespace of the secret that contains Azure Storage Account Name and Key default is the same as the Pod", + "type": "string" + }, + "shareName": { + "description": "Share Name", + "type": "string" + } + } + }, "io.k8s.api.core.v1.AzureFileVolumeSource": { "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod.", "required": [ @@ -60429,7 +60454,7 @@ }, "azureFile": { "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod.", - "$ref": "#/definitions/io.k8s.api.core.v1.AzureFileVolumeSource" + "$ref": "#/definitions/io.k8s.api.core.v1.AzureFilePersistentVolumeSource" }, "capacity": { "description": "A description of the persistent volume's resources and capacity. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#capacity", diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 57eaa0fe613fe..1990a5b5bcc44 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -18881,7 +18881,7 @@ "description": "FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. This is an alpha feature and may change in future." }, "azureFile": { - "$ref": "v1.AzureFileVolumeSource", + "$ref": "v1.AzureFilePersistentVolumeSource", "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod." }, "vsphereVolume": { @@ -19301,12 +19301,13 @@ } } }, - "v1.AzureFileVolumeSource": { - "id": "v1.AzureFileVolumeSource", + "v1.AzureFilePersistentVolumeSource": { + "id": "v1.AzureFilePersistentVolumeSource", "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod.", "required": [ "secretName", - "shareName" + "shareName", + "secretNamespace" ], "properties": { "secretName": { @@ -19320,6 +19321,10 @@ "readOnly": { "type": "boolean", "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + }, + "secretNamespace": { + "type": "string", + "description": "the namespace of the secret that contains Azure Storage Account Name and Key default is the same as the Pod" } } }, @@ -20054,6 +20059,28 @@ } } }, + "v1.AzureFileVolumeSource": { + "id": "v1.AzureFileVolumeSource", + "description": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod.", + "required": [ + "secretName", + "shareName" + ], + "properties": { + "secretName": { + "type": "string", + "description": "the name of secret that contains Azure Storage Account Name and Key" + }, + "shareName": { + "type": "string", + "description": "Share Name" + }, + "readOnly": { + "type": "boolean", + "description": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts." + } + } + }, "v1.ConfigMapVolumeSource": { "id": "v1.ConfigMapVolumeSource", "description": "Adapts a ConfigMap into a volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. ConfigMap volumes support ownership management and SELinux relabeling.", diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 362029d2e7d4e..3168d964bd392 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -2567,10 +2567,6 @@

v1.LimitRangeSpec

- -
-

types.UID

-

v1.AzureFileVolumeSource

@@ -2619,6 +2615,10 @@

v1.AzureFileVolumeSource

+
+
+

types.UID

+

v1.ISCSIVolumeSource

@@ -7447,7 +7447,7 @@

v1.PersistentVolumeSpec

azureFile

AzureFile represents an Azure File Service mount on the host and bind mount to the pod.

false

-

v1.AzureFileVolumeSource

+

v1.AzureFilePersistentVolumeSource

@@ -10117,6 +10117,61 @@

v1.ServiceSpec

+
+
+

v1.AzureFilePersistentVolumeSource

+
+

AzureFile represents an Azure File Service mount on the host and bind mount to the pod.

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

secretName

the name of secret that contains Azure Storage Account Name and Key

true

string

shareName

Share Name

true

string

readOnly

Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.

false

boolean

false

secretNamespace

the namespace of the secret that contains Azure Storage Account Name and Key default is the same as the Pod

true

string

+

v1.Pod

diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 6293ab4c96819..45924338de62c 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -48,6 +48,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_AvoidPods_To_v1_AvoidPods, Convert_v1_AzureDiskVolumeSource_To_api_AzureDiskVolumeSource, Convert_api_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource, + Convert_v1_AzureFilePersistentVolumeSource_To_api_AzureFilePersistentVolumeSource, + Convert_api_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource, Convert_v1_AzureFileVolumeSource_To_api_AzureFileVolumeSource, Convert_api_AzureFileVolumeSource_To_v1_AzureFileVolumeSource, Convert_v1_Binding_To_api_Binding, @@ -507,7 +509,7 @@ func Convert_api_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource(in *api.Azure return autoConvert_api_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource(in, out, s) } -func autoConvert_v1_AzureFileVolumeSource_To_api_AzureFileVolumeSource(in *v1.AzureFileVolumeSource, out *api.AzureFileVolumeSource, s conversion.Scope) error { +func autoConvert_v1_AzureFilePersistentVolumeSource_To_api_AzureFilePersistentVolumeSource(in *v1.AzureFilePersistentVolumeSource, out *api.AzureFilePersistentVolumeSource, s conversion.Scope) error { out.SecretName = in.SecretName out.ShareName = in.ShareName out.ReadOnly = in.ReadOnly @@ -515,6 +517,31 @@ func autoConvert_v1_AzureFileVolumeSource_To_api_AzureFileVolumeSource(in *v1.Az return nil } +// Convert_v1_AzureFilePersistentVolumeSource_To_api_AzureFilePersistentVolumeSource is an autogenerated conversion function. +func Convert_v1_AzureFilePersistentVolumeSource_To_api_AzureFilePersistentVolumeSource(in *v1.AzureFilePersistentVolumeSource, out *api.AzureFilePersistentVolumeSource, s conversion.Scope) error { + return autoConvert_v1_AzureFilePersistentVolumeSource_To_api_AzureFilePersistentVolumeSource(in, out, s) +} + +func autoConvert_api_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource(in *api.AzureFilePersistentVolumeSource, out *v1.AzureFilePersistentVolumeSource, s conversion.Scope) error { + out.SecretName = in.SecretName + out.ShareName = in.ShareName + out.ReadOnly = in.ReadOnly + out.SecretNamespace = (*string)(unsafe.Pointer(in.SecretNamespace)) + return nil +} + +// Convert_api_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource is an autogenerated conversion function. +func Convert_api_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource(in *api.AzureFilePersistentVolumeSource, out *v1.AzureFilePersistentVolumeSource, s conversion.Scope) error { + return autoConvert_api_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource(in, out, s) +} + +func autoConvert_v1_AzureFileVolumeSource_To_api_AzureFileVolumeSource(in *v1.AzureFileVolumeSource, out *api.AzureFileVolumeSource, s conversion.Scope) error { + out.SecretName = in.SecretName + out.ShareName = in.ShareName + out.ReadOnly = in.ReadOnly + return nil +} + // Convert_v1_AzureFileVolumeSource_To_api_AzureFileVolumeSource is an autogenerated conversion function. func Convert_v1_AzureFileVolumeSource_To_api_AzureFileVolumeSource(in *v1.AzureFileVolumeSource, out *api.AzureFileVolumeSource, s conversion.Scope) error { return autoConvert_v1_AzureFileVolumeSource_To_api_AzureFileVolumeSource(in, out, s) @@ -524,7 +551,6 @@ func autoConvert_api_AzureFileVolumeSource_To_v1_AzureFileVolumeSource(in *api.A out.SecretName = in.SecretName out.ShareName = in.ShareName out.ReadOnly = in.ReadOnly - out.SecretNamespace = (*string)(unsafe.Pointer(in.SecretNamespace)) return nil } @@ -3068,7 +3094,7 @@ func autoConvert_v1_PersistentVolumeSource_To_api_PersistentVolumeSource(in *v1. out.FC = (*api.FCVolumeSource)(unsafe.Pointer(in.FC)) out.Flocker = (*api.FlockerVolumeSource)(unsafe.Pointer(in.Flocker)) out.FlexVolume = (*api.FlexVolumeSource)(unsafe.Pointer(in.FlexVolume)) - out.AzureFile = (*api.AzureFileVolumeSource)(unsafe.Pointer(in.AzureFile)) + out.AzureFile = (*api.AzureFilePersistentVolumeSource)(unsafe.Pointer(in.AzureFile)) out.VsphereVolume = (*api.VsphereVirtualDiskVolumeSource)(unsafe.Pointer(in.VsphereVolume)) out.Quobyte = (*api.QuobyteVolumeSource)(unsafe.Pointer(in.Quobyte)) out.AzureDisk = (*api.AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk)) @@ -3099,7 +3125,7 @@ func autoConvert_api_PersistentVolumeSource_To_v1_PersistentVolumeSource(in *api out.CephFS = (*v1.CephFSVolumeSource)(unsafe.Pointer(in.CephFS)) out.FC = (*v1.FCVolumeSource)(unsafe.Pointer(in.FC)) out.Flocker = (*v1.FlockerVolumeSource)(unsafe.Pointer(in.Flocker)) - out.AzureFile = (*v1.AzureFileVolumeSource)(unsafe.Pointer(in.AzureFile)) + out.AzureFile = (*v1.AzureFilePersistentVolumeSource)(unsafe.Pointer(in.AzureFile)) out.VsphereVolume = (*v1.VsphereVirtualDiskVolumeSource)(unsafe.Pointer(in.VsphereVolume)) out.AzureDisk = (*v1.AzureDiskVolumeSource)(unsafe.Pointer(in.AzureDisk)) out.PhotonPersistentDisk = (*v1.PhotonPersistentDiskVolumeSource)(unsafe.Pointer(in.PhotonPersistentDisk)) diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index 875e991a028e1..e3ff932f5b68f 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -58,6 +58,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*AzureDiskVolumeSource).DeepCopyInto(out.(*AzureDiskVolumeSource)) return nil }, InType: reflect.TypeOf(&AzureDiskVolumeSource{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*AzureFilePersistentVolumeSource).DeepCopyInto(out.(*AzureFilePersistentVolumeSource)) + return nil + }, InType: reflect.TypeOf(&AzureFilePersistentVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*AzureFileVolumeSource).DeepCopyInto(out.(*AzureFileVolumeSource)) return nil @@ -879,6 +883,31 @@ func (in *AzureDiskVolumeSource) DeepCopy() *AzureDiskVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureFilePersistentVolumeSource) DeepCopyInto(out *AzureFilePersistentVolumeSource) { + *out = *in + if in.SecretNamespace != nil { + in, out := &in.SecretNamespace, &out.SecretNamespace + if *in == nil { + *out = nil + } else { + *out = new(string) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureFilePersistentVolumeSource. +func (in *AzureFilePersistentVolumeSource) DeepCopy() *AzureFilePersistentVolumeSource { + if in == nil { + return nil + } + out := new(AzureFilePersistentVolumeSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AzureFileVolumeSource) DeepCopyInto(out *AzureFileVolumeSource) { *out = *in @@ -3679,10 +3708,8 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { if *in == nil { *out = nil } else { - *out = new(AzureFileVolumeSource) - if err := DeepCopy_api_AzureFileVolumeSource(*in, *out, c); err != nil { - return err - } + *out = new(AzureFilePersistentVolumeSource) + (*in).DeepCopyInto(*out) } } if in.VsphereVolume != nil { @@ -5996,9 +6023,7 @@ func (in *VolumeSource) DeepCopyInto(out *VolumeSource) { *out = nil } else { *out = new(AzureFileVolumeSource) - if err := DeepCopy_api_AzureFileVolumeSource(*in, *out, c); err != nil { - return err - } + **out = **in } } if in.ConfigMap != nil { diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 9053f04d54c84..5bde18f63796a 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -30,6 +30,7 @@ limitations under the License. AttachedVolume AvoidPods AzureDiskVolumeSource + AzureFilePersistentVolumeSource AzureFileVolumeSource Binding Capabilities @@ -250,708 +251,716 @@ func (m *AzureDiskVolumeSource) Reset() { *m = AzureDiskVolum func (*AzureDiskVolumeSource) ProtoMessage() {} func (*AzureDiskVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} } +func (m *AzureFilePersistentVolumeSource) Reset() { *m = AzureFilePersistentVolumeSource{} } +func (*AzureFilePersistentVolumeSource) ProtoMessage() {} +func (*AzureFilePersistentVolumeSource) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{5} +} + func (m *AzureFileVolumeSource) Reset() { *m = AzureFileVolumeSource{} } func (*AzureFileVolumeSource) ProtoMessage() {} -func (*AzureFileVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} } +func (*AzureFileVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} } func (m *Binding) Reset() { *m = Binding{} } func (*Binding) ProtoMessage() {} -func (*Binding) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} } +func (*Binding) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{7} } func (m *Capabilities) Reset() { *m = Capabilities{} } func (*Capabilities) ProtoMessage() {} -func (*Capabilities) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{7} } +func (*Capabilities) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } func (m *CephFSVolumeSource) Reset() { *m = CephFSVolumeSource{} } func (*CephFSVolumeSource) ProtoMessage() {} -func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } +func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } func (m *CinderVolumeSource) Reset() { *m = CinderVolumeSource{} } func (*CinderVolumeSource) ProtoMessage() {} -func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } +func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } func (m *ComponentCondition) Reset() { *m = ComponentCondition{} } func (*ComponentCondition) ProtoMessage() {} -func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } +func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } func (m *ComponentStatus) Reset() { *m = ComponentStatus{} } func (*ComponentStatus) ProtoMessage() {} -func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } +func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } func (m *ComponentStatusList) Reset() { *m = ComponentStatusList{} } func (*ComponentStatusList) ProtoMessage() {} -func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } +func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } func (m *ConfigMap) Reset() { *m = ConfigMap{} } func (*ConfigMap) ProtoMessage() {} -func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } +func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (m *ConfigMapEnvSource) Reset() { *m = ConfigMapEnvSource{} } func (*ConfigMapEnvSource) ProtoMessage() {} -func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } +func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (m *ConfigMapKeySelector) Reset() { *m = ConfigMapKeySelector{} } func (*ConfigMapKeySelector) ProtoMessage() {} -func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } +func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } func (m *ConfigMapList) Reset() { *m = ConfigMapList{} } func (*ConfigMapList) ProtoMessage() {} -func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } +func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } func (m *ConfigMapProjection) Reset() { *m = ConfigMapProjection{} } func (*ConfigMapProjection) ProtoMessage() {} -func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } +func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } func (m *ConfigMapVolumeSource) Reset() { *m = ConfigMapVolumeSource{} } func (*ConfigMapVolumeSource) ProtoMessage() {} -func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } +func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (m *Container) Reset() { *m = Container{} } func (*Container) ProtoMessage() {} -func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } +func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (m *ContainerImage) Reset() { *m = ContainerImage{} } func (*ContainerImage) ProtoMessage() {} -func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } +func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } func (m *ContainerPort) Reset() { *m = ContainerPort{} } func (*ContainerPort) ProtoMessage() {} -func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (m *ContainerState) Reset() { *m = ContainerState{} } func (*ContainerState) ProtoMessage() {} -func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *ContainerStateRunning) Reset() { *m = ContainerStateRunning{} } func (*ContainerStateRunning) ProtoMessage() {} -func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *ContainerStateTerminated) Reset() { *m = ContainerStateTerminated{} } func (*ContainerStateTerminated) ProtoMessage() {} func (*ContainerStateTerminated) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{24} + return fileDescriptorGenerated, []int{25} } func (m *ContainerStateWaiting) Reset() { *m = ContainerStateWaiting{} } func (*ContainerStateWaiting) ProtoMessage() {} -func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } func (*ContainerStatus) ProtoMessage() {} -func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *DaemonEndpoint) Reset() { *m = DaemonEndpoint{} } func (*DaemonEndpoint) ProtoMessage() {} -func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } func (m *DeleteOptions) Reset() { *m = DeleteOptions{} } func (*DeleteOptions) ProtoMessage() {} -func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } +func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *DownwardAPIProjection) Reset() { *m = DownwardAPIProjection{} } func (*DownwardAPIProjection) ProtoMessage() {} -func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *DownwardAPIVolumeFile) Reset() { *m = DownwardAPIVolumeFile{} } func (*DownwardAPIVolumeFile) ProtoMessage() {} -func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *DownwardAPIVolumeSource) Reset() { *m = DownwardAPIVolumeSource{} } func (*DownwardAPIVolumeSource) ProtoMessage() {} func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{31} + return fileDescriptorGenerated, []int{32} } func (m *EmptyDirVolumeSource) Reset() { *m = EmptyDirVolumeSource{} } func (*EmptyDirVolumeSource) ProtoMessage() {} -func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *EndpointAddress) Reset() { *m = EndpointAddress{} } func (*EndpointAddress) ProtoMessage() {} -func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } +func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (m *EndpointPort) Reset() { *m = EndpointPort{} } func (*EndpointPort) ProtoMessage() {} -func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } +func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } func (m *EndpointSubset) Reset() { *m = EndpointSubset{} } func (*EndpointSubset) ProtoMessage() {} -func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } +func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (m *Endpoints) Reset() { *m = Endpoints{} } func (*Endpoints) ProtoMessage() {} -func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *EndpointsList) Reset() { *m = EndpointsList{} } func (*EndpointsList) ProtoMessage() {} -func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } +func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func (m *EnvFromSource) Reset() { *m = EnvFromSource{} } func (*EnvFromSource) ProtoMessage() {} -func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } +func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } func (m *EnvVar) Reset() { *m = EnvVar{} } func (*EnvVar) ProtoMessage() {} -func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } +func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } func (m *EnvVarSource) Reset() { *m = EnvVarSource{} } func (*EnvVarSource) ProtoMessage() {} -func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } +func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } +func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } func (m *EventList) Reset() { *m = EventList{} } func (*EventList) ProtoMessage() {} -func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } +func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } func (m *EventSource) Reset() { *m = EventSource{} } func (*EventSource) ProtoMessage() {} -func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } +func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } func (m *ExecAction) Reset() { *m = ExecAction{} } func (*ExecAction) ProtoMessage() {} -func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } +func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } func (m *FCVolumeSource) Reset() { *m = FCVolumeSource{} } func (*FCVolumeSource) ProtoMessage() {} -func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } +func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } func (m *FlexVolumeSource) Reset() { *m = FlexVolumeSource{} } func (*FlexVolumeSource) ProtoMessage() {} -func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } +func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } func (m *FlockerVolumeSource) Reset() { *m = FlockerVolumeSource{} } func (*FlockerVolumeSource) ProtoMessage() {} -func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } +func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } func (m *GCEPersistentDiskVolumeSource) Reset() { *m = GCEPersistentDiskVolumeSource{} } func (*GCEPersistentDiskVolumeSource) ProtoMessage() {} func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{48} + return fileDescriptorGenerated, []int{49} } func (m *GitRepoVolumeSource) Reset() { *m = GitRepoVolumeSource{} } func (*GitRepoVolumeSource) ProtoMessage() {} -func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } +func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } func (m *GlusterfsVolumeSource) Reset() { *m = GlusterfsVolumeSource{} } func (*GlusterfsVolumeSource) ProtoMessage() {} -func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } +func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } func (m *HTTPGetAction) Reset() { *m = HTTPGetAction{} } func (*HTTPGetAction) ProtoMessage() {} -func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } +func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } func (m *HTTPHeader) Reset() { *m = HTTPHeader{} } func (*HTTPHeader) ProtoMessage() {} -func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } +func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } func (m *Handler) Reset() { *m = Handler{} } func (*Handler) ProtoMessage() {} -func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } +func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } func (m *HostAlias) Reset() { *m = HostAlias{} } func (*HostAlias) ProtoMessage() {} -func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } +func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } func (m *HostPathVolumeSource) Reset() { *m = HostPathVolumeSource{} } func (*HostPathVolumeSource) ProtoMessage() {} -func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } +func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } func (m *ISCSIVolumeSource) Reset() { *m = ISCSIVolumeSource{} } func (*ISCSIVolumeSource) ProtoMessage() {} -func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } +func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } func (m *KeyToPath) Reset() { *m = KeyToPath{} } func (*KeyToPath) ProtoMessage() {} -func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } +func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } func (m *Lifecycle) Reset() { *m = Lifecycle{} } func (*Lifecycle) ProtoMessage() {} -func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } +func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } func (m *LimitRange) Reset() { *m = LimitRange{} } func (*LimitRange) ProtoMessage() {} -func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } +func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } func (m *LimitRangeItem) Reset() { *m = LimitRangeItem{} } func (*LimitRangeItem) ProtoMessage() {} -func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } +func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } func (m *LimitRangeList) Reset() { *m = LimitRangeList{} } func (*LimitRangeList) ProtoMessage() {} -func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } +func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } func (m *LimitRangeSpec) Reset() { *m = LimitRangeSpec{} } func (*LimitRangeSpec) ProtoMessage() {} -func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } +func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} -func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } +func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } func (m *ListOptions) Reset() { *m = ListOptions{} } func (*ListOptions) ProtoMessage() {} -func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } +func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } func (m *LoadBalancerIngress) Reset() { *m = LoadBalancerIngress{} } func (*LoadBalancerIngress) ProtoMessage() {} -func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } +func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } func (m *LoadBalancerStatus) Reset() { *m = LoadBalancerStatus{} } func (*LoadBalancerStatus) ProtoMessage() {} -func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } +func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } func (m *LocalObjectReference) Reset() { *m = LocalObjectReference{} } func (*LocalObjectReference) ProtoMessage() {} -func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } +func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } func (m *LocalVolumeSource) Reset() { *m = LocalVolumeSource{} } func (*LocalVolumeSource) ProtoMessage() {} -func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } +func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } func (m *NFSVolumeSource) Reset() { *m = NFSVolumeSource{} } func (*NFSVolumeSource) ProtoMessage() {} -func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } +func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } func (m *Namespace) Reset() { *m = Namespace{} } func (*Namespace) ProtoMessage() {} -func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } +func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } func (m *NamespaceList) Reset() { *m = NamespaceList{} } func (*NamespaceList) ProtoMessage() {} -func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } +func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (*NamespaceSpec) ProtoMessage() {} -func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } +func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } func (m *NamespaceStatus) Reset() { *m = NamespaceStatus{} } func (*NamespaceStatus) ProtoMessage() {} -func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } +func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } func (m *Node) Reset() { *m = Node{} } func (*Node) ProtoMessage() {} -func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } +func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (*NodeAddress) ProtoMessage() {} -func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } +func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } func (m *NodeAffinity) Reset() { *m = NodeAffinity{} } func (*NodeAffinity) ProtoMessage() {} -func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } +func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} -func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } +func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} } func (*NodeConfigSource) ProtoMessage() {} -func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } +func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} -func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } +func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} -func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } +func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} -func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } +func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } func (m *NodeResources) Reset() { *m = NodeResources{} } func (*NodeResources) ProtoMessage() {} -func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } +func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} -func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } +func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{84} + return fileDescriptorGenerated, []int{85} } func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} -func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } +func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} -func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } +func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} -func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } +func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} -func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } +func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} -func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } +func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } func (*ObjectMeta) ProtoMessage() {} -func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } +func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} -func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } +func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} -func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } +func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} -func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } +func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{94} + return fileDescriptorGenerated, []int{95} } func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{95} + return fileDescriptorGenerated, []int{96} } func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{96} + return fileDescriptorGenerated, []int{97} } func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{97} + return fileDescriptorGenerated, []int{98} } func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} -func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{98} } +func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} } -func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } -func (*PersistentVolumeSource) ProtoMessage() {} -func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} } +func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } +func (*PersistentVolumeSource) ProtoMessage() {} +func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{100} +} func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} -func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} } +func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{101} } func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{101} + return fileDescriptorGenerated, []int{102} } func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{102} + return fileDescriptorGenerated, []int{103} } func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} -func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{103} } +func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{104} } func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} -func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{104} } +func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} -func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } +func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} -func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } +func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} -func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } +func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} -func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } +func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} -func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } +func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} -func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } +func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} -func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } +func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} -func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } +func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} -func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } +func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} -func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } +func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} -func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } +func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} -func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } +func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} -func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } +func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} -func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } +func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} -func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } +func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} -func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } +func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} -func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } +func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} -func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } +func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} -func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } +func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{125} + return fileDescriptorGenerated, []int{126} } func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} -func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } +func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} -func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } +func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} -func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } +func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} -func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } +func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} -func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } +func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} -func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } +func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{132} + return fileDescriptorGenerated, []int{133} } func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{133} + return fileDescriptorGenerated, []int{134} } func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{134} + return fileDescriptorGenerated, []int{135} } func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{135} + return fileDescriptorGenerated, []int{136} } func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} -func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } +func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} -func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } +func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} -func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } +func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} -func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } +func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} -func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} -func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} -func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} -func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{160} + return fileDescriptorGenerated, []int{161} } func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} -func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{170} + return fileDescriptorGenerated, []int{171} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{171} + return fileDescriptorGenerated, []int{172} } func init() { @@ -960,6 +969,7 @@ func init() { proto.RegisterType((*AttachedVolume)(nil), "k8s.io.api.core.v1.AttachedVolume") proto.RegisterType((*AvoidPods)(nil), "k8s.io.api.core.v1.AvoidPods") proto.RegisterType((*AzureDiskVolumeSource)(nil), "k8s.io.api.core.v1.AzureDiskVolumeSource") + proto.RegisterType((*AzureFilePersistentVolumeSource)(nil), "k8s.io.api.core.v1.AzureFilePersistentVolumeSource") proto.RegisterType((*AzureFileVolumeSource)(nil), "k8s.io.api.core.v1.AzureFileVolumeSource") proto.RegisterType((*Binding)(nil), "k8s.io.api.core.v1.Binding") proto.RegisterType((*Capabilities)(nil), "k8s.io.api.core.v1.Capabilities") @@ -1323,6 +1333,46 @@ func (m *AzureDiskVolumeSource) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *AzureFilePersistentVolumeSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AzureFilePersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.SecretName))) + i += copy(dAtA[i:], m.SecretName) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ShareName))) + i += copy(dAtA[i:], m.ShareName) + dAtA[i] = 0x18 + i++ + if m.ReadOnly { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + if m.SecretNamespace != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SecretNamespace))) + i += copy(dAtA[i:], *m.SecretNamespace) + } + return i, nil +} + func (m *AzureFileVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9675,6 +9725,21 @@ func (m *AzureDiskVolumeSource) Size() (n int) { return n } +func (m *AzureFilePersistentVolumeSource) Size() (n int) { + var l int + _ = l + l = len(m.SecretName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ShareName) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + if m.SecretNamespace != nil { + l = len(*m.SecretNamespace) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *AzureFileVolumeSource) Size() (n int) { var l int _ = l @@ -12729,6 +12794,19 @@ func (this *AzureDiskVolumeSource) String() string { }, "") return s } +func (this *AzureFilePersistentVolumeSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AzureFilePersistentVolumeSource{`, + `SecretName:` + fmt.Sprintf("%v", this.SecretName) + `,`, + `ShareName:` + fmt.Sprintf("%v", this.ShareName) + `,`, + `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, + `SecretNamespace:` + valueToStringGenerated(this.SecretNamespace) + `,`, + `}`, + }, "") + return s +} func (this *AzureFileVolumeSource) String() string { if this == nil { return "nil" @@ -14043,7 +14121,7 @@ func (this *PersistentVolumeSource) String() string { `FC:` + strings.Replace(fmt.Sprintf("%v", this.FC), "FCVolumeSource", "FCVolumeSource", 1) + `,`, `Flocker:` + strings.Replace(fmt.Sprintf("%v", this.Flocker), "FlockerVolumeSource", "FlockerVolumeSource", 1) + `,`, `FlexVolume:` + strings.Replace(fmt.Sprintf("%v", this.FlexVolume), "FlexVolumeSource", "FlexVolumeSource", 1) + `,`, - `AzureFile:` + strings.Replace(fmt.Sprintf("%v", this.AzureFile), "AzureFileVolumeSource", "AzureFileVolumeSource", 1) + `,`, + `AzureFile:` + strings.Replace(fmt.Sprintf("%v", this.AzureFile), "AzureFilePersistentVolumeSource", "AzureFilePersistentVolumeSource", 1) + `,`, `VsphereVolume:` + strings.Replace(fmt.Sprintf("%v", this.VsphereVolume), "VsphereVirtualDiskVolumeSource", "VsphereVirtualDiskVolumeSource", 1) + `,`, `Quobyte:` + strings.Replace(fmt.Sprintf("%v", this.Quobyte), "QuobyteVolumeSource", "QuobyteVolumeSource", 1) + `,`, `AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`, @@ -15828,6 +15906,164 @@ func (m *AzureDiskVolumeSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *AzureFilePersistentVolumeSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AzureFilePersistentVolumeSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AzureFilePersistentVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SecretName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ShareName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadOnly = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretNamespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.SecretNamespace = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *AzureFileVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -31318,7 +31554,7 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.AzureFile == nil { - m.AzureFile = &AzureFileVolumeSource{} + m.AzureFile = &AzureFilePersistentVolumeSource{} } if err := m.AzureFile.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -44843,729 +45079,731 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11579 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xd7, - 0x75, 0x18, 0xac, 0x9e, 0xc1, 0x6b, 0x0e, 0xde, 0x77, 0x1f, 0x9c, 0x05, 0xc9, 0xc5, 0xb2, 0x29, - 0x91, 0xcb, 0x17, 0x60, 0x2e, 0x49, 0x91, 0x16, 0x29, 0x5a, 0x00, 0x06, 0xd8, 0x05, 0xf7, 0x35, - 0xbc, 0x83, 0x5d, 0x9a, 0x14, 0x4d, 0xab, 0x31, 0x7d, 0x01, 0x34, 0xd1, 0xe8, 0x1e, 0x76, 0xf7, - 0x60, 0x17, 0x2c, 0xab, 0xea, 0xfb, 0x14, 0x59, 0x79, 0xc8, 0x3f, 0x5c, 0x29, 0x57, 0xe2, 0x58, - 0x2a, 0xa7, 0x2a, 0x8f, 0xb2, 0x15, 0x27, 0x29, 0x3b, 0x72, 0xfc, 0x90, 0x9c, 0x4a, 0xe2, 0x3c, - 0x4a, 0xfa, 0xe3, 0xd8, 0xae, 0x4a, 0x49, 0x55, 0xa9, 0xc0, 0x16, 0x94, 0x4a, 0x2a, 0x3f, 0x92, - 0xca, 0xe3, 0x97, 0x11, 0x27, 0x4a, 0xdd, 0x67, 0xdf, 0xdb, 0xd3, 0x3d, 0x33, 0x58, 0x62, 0x41, - 0x4a, 0x95, 0x7f, 0x33, 0xe7, 0x9c, 0x7b, 0xee, 0xed, 0xfb, 0x38, 0xf7, 0x9c, 0x73, 0xcf, 0x3d, - 0x17, 0x5e, 0xde, 0x7e, 0x29, 0x9e, 0xf3, 0xc2, 0xf9, 0xed, 0xf6, 0x3a, 0x89, 0x02, 0x92, 0x90, - 0x78, 0x7e, 0x97, 0x04, 0x6e, 0x18, 0xcd, 0x0b, 0x84, 0xd3, 0xf2, 0xe6, 0x9b, 0x61, 0x44, 0xe6, - 0x77, 0x9f, 0x9d, 0xdf, 0x24, 0x01, 0x89, 0x9c, 0x84, 0xb8, 0x73, 0xad, 0x28, 0x4c, 0x42, 0x84, - 0x38, 0xcd, 0x9c, 0xd3, 0xf2, 0xe6, 0x28, 0xcd, 0xdc, 0xee, 0xb3, 0x33, 0xcf, 0x6c, 0x7a, 0xc9, - 0x56, 0x7b, 0x7d, 0xae, 0x19, 0xee, 0xcc, 0x6f, 0x86, 0x9b, 0xe1, 0x3c, 0x23, 0x5d, 0x6f, 0x6f, - 0xb0, 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x59, 0xcc, 0x3c, 0x9f, 0x56, 0xb3, 0xe3, 0x34, 0xb7, 0xbc, - 0x80, 0x44, 0x7b, 0xf3, 0xad, 0xed, 0x4d, 0x56, 0x6f, 0x44, 0xe2, 0xb0, 0x1d, 0x35, 0x49, 0xb6, - 0xe2, 0xae, 0xa5, 0xe2, 0xf9, 0x1d, 0x92, 0x38, 0x39, 0xcd, 0x9d, 0x99, 0x2f, 0x2a, 0x15, 0xb5, - 0x83, 0xc4, 0xdb, 0xe9, 0xac, 0xe6, 0x93, 0xbd, 0x0a, 0xc4, 0xcd, 0x2d, 0xb2, 0xe3, 0x74, 0x94, - 0x7b, 0xae, 0xa8, 0x5c, 0x3b, 0xf1, 0xfc, 0x79, 0x2f, 0x48, 0xe2, 0x24, 0xca, 0x16, 0xb2, 0xbf, - 0x63, 0xc1, 0x85, 0x85, 0x37, 0x1a, 0xcb, 0xbe, 0x13, 0x27, 0x5e, 0x73, 0xd1, 0x0f, 0x9b, 0xdb, - 0x8d, 0x24, 0x8c, 0xc8, 0xed, 0xd0, 0x6f, 0xef, 0x90, 0x06, 0xeb, 0x08, 0xf4, 0x34, 0x8c, 0xec, - 0xb2, 0xff, 0xab, 0xb5, 0xaa, 0x75, 0xc1, 0xba, 0x58, 0x59, 0x9c, 0xfa, 0xd6, 0xfe, 0xec, 0xc7, - 0x0e, 0xf6, 0x67, 0x47, 0x6e, 0x0b, 0x38, 0x56, 0x14, 0xe8, 0x31, 0x18, 0xda, 0x88, 0xd7, 0xf6, - 0x5a, 0xa4, 0x5a, 0x62, 0xb4, 0x13, 0x82, 0x76, 0x68, 0xa5, 0x41, 0xa1, 0x58, 0x60, 0xd1, 0x3c, - 0x54, 0x5a, 0x4e, 0x94, 0x78, 0x89, 0x17, 0x06, 0xd5, 0xf2, 0x05, 0xeb, 0xe2, 0xe0, 0xe2, 0xb4, - 0x20, 0xad, 0xd4, 0x25, 0x02, 0xa7, 0x34, 0xb4, 0x19, 0x11, 0x71, 0xdc, 0x9b, 0x81, 0xbf, 0x57, - 0x1d, 0xb8, 0x60, 0x5d, 0x1c, 0x49, 0x9b, 0x81, 0x05, 0x1c, 0x2b, 0x0a, 0xfb, 0x97, 0x4a, 0x30, - 0xb2, 0xb0, 0xb1, 0xe1, 0x05, 0x5e, 0xb2, 0x87, 0x6e, 0xc3, 0x58, 0x10, 0xba, 0x44, 0xfe, 0x67, - 0x5f, 0x31, 0x7a, 0xe9, 0xc2, 0x5c, 0xe7, 0x54, 0x9a, 0xbb, 0xa1, 0xd1, 0x2d, 0x4e, 0x1d, 0xec, - 0xcf, 0x8e, 0xe9, 0x10, 0x6c, 0xf0, 0x41, 0x18, 0x46, 0x5b, 0xa1, 0xab, 0xd8, 0x96, 0x18, 0xdb, - 0xd9, 0x3c, 0xb6, 0xf5, 0x94, 0x6c, 0x71, 0xf2, 0x60, 0x7f, 0x76, 0x54, 0x03, 0x60, 0x9d, 0x09, - 0x5a, 0x87, 0x49, 0xfa, 0x37, 0x48, 0x3c, 0xc5, 0xb7, 0xcc, 0xf8, 0x3e, 0x5a, 0xc4, 0x57, 0x23, - 0x5d, 0x3c, 0x75, 0xb0, 0x3f, 0x3b, 0x99, 0x01, 0xe2, 0x2c, 0x43, 0xfb, 0x7d, 0x98, 0x58, 0x48, - 0x12, 0xa7, 0xb9, 0x45, 0x5c, 0x3e, 0x82, 0xe8, 0x79, 0x18, 0x08, 0x9c, 0x1d, 0x22, 0xc6, 0xf7, - 0x82, 0xe8, 0xd8, 0x81, 0x1b, 0xce, 0x0e, 0x39, 0xdc, 0x9f, 0x9d, 0xba, 0x15, 0x78, 0xef, 0xb5, - 0xc5, 0xac, 0xa0, 0x30, 0xcc, 0xa8, 0xd1, 0x25, 0x00, 0x97, 0xec, 0x7a, 0x4d, 0x52, 0x77, 0x92, - 0x2d, 0x31, 0xde, 0x48, 0x94, 0x85, 0x9a, 0xc2, 0x60, 0x8d, 0xca, 0xbe, 0x0b, 0x95, 0x85, 0xdd, - 0xd0, 0x73, 0xeb, 0xa1, 0x1b, 0xa3, 0x6d, 0x98, 0x6c, 0x45, 0x64, 0x83, 0x44, 0x0a, 0x54, 0xb5, - 0x2e, 0x94, 0x2f, 0x8e, 0x5e, 0xba, 0x98, 0xfb, 0xb1, 0x26, 0xe9, 0x72, 0x90, 0x44, 0x7b, 0x8b, - 0x0f, 0x88, 0xfa, 0x26, 0x33, 0x58, 0x9c, 0xe5, 0x6c, 0xff, 0xcb, 0x12, 0x9c, 0x59, 0x78, 0xbf, - 0x1d, 0x91, 0x9a, 0x17, 0x6f, 0x67, 0x67, 0xb8, 0xeb, 0xc5, 0xdb, 0x37, 0xd2, 0x1e, 0x50, 0x53, - 0xab, 0x26, 0xe0, 0x58, 0x51, 0xa0, 0x67, 0x60, 0x98, 0xfe, 0xbe, 0x85, 0x57, 0xc5, 0x27, 0x9f, - 0x12, 0xc4, 0xa3, 0x35, 0x27, 0x71, 0x6a, 0x1c, 0x85, 0x25, 0x0d, 0xba, 0x0e, 0xa3, 0x4d, 0xb6, - 0x20, 0x37, 0xaf, 0x87, 0x2e, 0x61, 0x83, 0x59, 0x59, 0x7c, 0x8a, 0x92, 0x2f, 0xa5, 0xe0, 0xc3, - 0xfd, 0xd9, 0x2a, 0x6f, 0x9b, 0x60, 0xa1, 0xe1, 0xb0, 0x5e, 0x1e, 0xd9, 0x6a, 0x7d, 0x0d, 0x30, - 0x4e, 0x90, 0xb3, 0xb6, 0x2e, 0x6a, 0x4b, 0x65, 0x90, 0x2d, 0x95, 0xb1, 0xfc, 0x65, 0x82, 0x9e, - 0x85, 0x81, 0x6d, 0x2f, 0x70, 0xab, 0x43, 0x8c, 0xd7, 0xc3, 0x74, 0xcc, 0xaf, 0x7a, 0x81, 0x7b, - 0xb8, 0x3f, 0x3b, 0x6d, 0x34, 0x87, 0x02, 0x31, 0x23, 0xb5, 0xff, 0x9e, 0x25, 0xba, 0x71, 0xc5, - 0xf3, 0x4d, 0x41, 0x71, 0x09, 0x20, 0x26, 0xcd, 0x88, 0x24, 0x5a, 0x47, 0xaa, 0xe9, 0xd0, 0x50, - 0x18, 0xac, 0x51, 0x51, 0x31, 0x10, 0x6f, 0x39, 0x11, 0x9b, 0x55, 0xa2, 0x3b, 0x95, 0x18, 0x68, - 0x48, 0x04, 0x4e, 0x69, 0x0c, 0x31, 0x50, 0xee, 0x29, 0x06, 0x7e, 0xc7, 0x82, 0xe1, 0x45, 0x2f, - 0x70, 0xbd, 0x60, 0x13, 0x7d, 0x0e, 0x46, 0xa8, 0x94, 0x76, 0x9d, 0xc4, 0x11, 0x12, 0xe0, 0xc7, - 0xb4, 0x59, 0xa6, 0x84, 0xe6, 0x5c, 0x6b, 0x7b, 0x93, 0x02, 0xe2, 0x39, 0x4a, 0x4d, 0xe7, 0xdd, - 0xcd, 0xf5, 0x77, 0x49, 0x33, 0xb9, 0x4e, 0x12, 0x27, 0xfd, 0x9c, 0x14, 0x86, 0x15, 0x57, 0x74, - 0x15, 0x86, 0x12, 0x27, 0xda, 0x24, 0x89, 0x10, 0x05, 0xb9, 0x4b, 0x96, 0x97, 0xc4, 0x74, 0x6e, - 0x92, 0xa0, 0x49, 0x52, 0x01, 0xb9, 0xc6, 0x8a, 0x62, 0xc1, 0xc2, 0x6e, 0xc2, 0xd8, 0x92, 0xd3, - 0x72, 0xd6, 0x3d, 0xdf, 0x4b, 0x3c, 0x12, 0xa3, 0xc7, 0xa1, 0xec, 0xb8, 0x2e, 0x5b, 0x1f, 0x95, - 0xc5, 0x33, 0x07, 0xfb, 0xb3, 0xe5, 0x05, 0x97, 0x0e, 0x14, 0x28, 0xaa, 0x3d, 0x4c, 0x29, 0xd0, - 0x93, 0x30, 0xe0, 0x46, 0x61, 0xab, 0x5a, 0x62, 0x94, 0x67, 0xe9, 0x98, 0xd6, 0xa2, 0xb0, 0x95, - 0x21, 0x65, 0x34, 0xf6, 0x37, 0x4b, 0x80, 0x96, 0x48, 0x6b, 0x6b, 0xa5, 0x61, 0x8c, 0xe4, 0x45, - 0x18, 0xd9, 0x09, 0x03, 0x2f, 0x09, 0xa3, 0x58, 0x54, 0xc8, 0x26, 0xd0, 0x75, 0x01, 0xc3, 0x0a, - 0x8b, 0x2e, 0xc0, 0x40, 0x2b, 0x5d, 0xfc, 0x63, 0x52, 0x70, 0xb0, 0x65, 0xcf, 0x30, 0x94, 0xa2, - 0x1d, 0x93, 0x48, 0x4c, 0x7c, 0x45, 0x71, 0x2b, 0x26, 0x11, 0x66, 0x98, 0x74, 0xde, 0xd0, 0x19, - 0x25, 0xa6, 0x75, 0x66, 0xde, 0x50, 0x0c, 0xd6, 0xa8, 0xd0, 0x2d, 0xa8, 0xf0, 0x7f, 0x98, 0x6c, - 0xb0, 0x39, 0x5e, 0x20, 0x33, 0xae, 0x85, 0x4d, 0xc7, 0xcf, 0x76, 0xf9, 0x38, 0x9b, 0x5d, 0xb2, - 0x38, 0x4e, 0x39, 0x19, 0xb3, 0x6b, 0xa8, 0xe7, 0xec, 0xfa, 0x45, 0x0b, 0xd0, 0x92, 0x17, 0xb8, - 0x24, 0x3a, 0x81, 0x0d, 0xf3, 0x68, 0x13, 0xff, 0xdf, 0xd1, 0xa6, 0x85, 0x3b, 0xad, 0x30, 0x20, - 0x41, 0xb2, 0x14, 0x06, 0x2e, 0xdf, 0x44, 0x3f, 0x05, 0x03, 0x09, 0xad, 0x8a, 0x37, 0xeb, 0x31, - 0x39, 0x18, 0xb4, 0x82, 0xc3, 0xfd, 0xd9, 0xb3, 0x9d, 0x25, 0x58, 0x13, 0x58, 0x19, 0xf4, 0xe3, - 0x30, 0x14, 0x27, 0x4e, 0xd2, 0x8e, 0x45, 0x43, 0x1f, 0x91, 0x0d, 0x6d, 0x30, 0xe8, 0xe1, 0xfe, - 0xec, 0xa4, 0x2a, 0xc6, 0x41, 0x58, 0x14, 0x40, 0x4f, 0xc0, 0xf0, 0x0e, 0x89, 0x63, 0x67, 0x53, - 0xca, 0xbf, 0x49, 0x51, 0x76, 0xf8, 0x3a, 0x07, 0x63, 0x89, 0x47, 0x8f, 0xc2, 0x20, 0x89, 0xa2, - 0x30, 0x12, 0xf3, 0x60, 0x5c, 0x10, 0x0e, 0x2e, 0x53, 0x20, 0xe6, 0x38, 0xfb, 0xdf, 0x58, 0x30, - 0xa9, 0xda, 0xca, 0xeb, 0x3a, 0x81, 0xe5, 0xfd, 0x16, 0x40, 0x53, 0x7e, 0x60, 0xcc, 0x96, 0xd7, - 0xe8, 0xa5, 0xc7, 0xf2, 0x26, 0x5d, 0x67, 0x37, 0xa6, 0x9c, 0x15, 0x28, 0xc6, 0x1a, 0x37, 0xfb, - 0x9f, 0x58, 0x70, 0x2a, 0xf3, 0x45, 0xd7, 0xbc, 0x38, 0x41, 0x6f, 0x77, 0x7c, 0xd5, 0x5c, 0x7f, - 0x5f, 0x45, 0x4b, 0xb3, 0x6f, 0x52, 0xb3, 0x44, 0x42, 0xb4, 0x2f, 0xba, 0x02, 0x83, 0x5e, 0x42, - 0x76, 0xe4, 0xc7, 0x3c, 0xda, 0xf5, 0x63, 0x78, 0xab, 0xd2, 0x11, 0x59, 0xa5, 0x25, 0x31, 0x67, - 0x60, 0xff, 0x77, 0x0b, 0x2a, 0x4b, 0x61, 0xb0, 0xe1, 0x6d, 0x5e, 0x77, 0x5a, 0x27, 0x30, 0x16, - 0xab, 0x30, 0xc0, 0xb8, 0xf3, 0x86, 0x3f, 0x9e, 0xdf, 0x70, 0xd1, 0x9c, 0x39, 0xba, 0x8b, 0x71, - 0x6d, 0x41, 0x89, 0x1f, 0x0a, 0xc2, 0x8c, 0xc5, 0xcc, 0x8b, 0x50, 0x51, 0x04, 0x68, 0x0a, 0xca, - 0xdb, 0x84, 0x6b, 0x88, 0x15, 0x4c, 0x7f, 0xa2, 0xd3, 0x30, 0xb8, 0xeb, 0xf8, 0x6d, 0xb1, 0x3c, - 0x31, 0xff, 0xf3, 0xa9, 0xd2, 0x4b, 0x96, 0xfd, 0x0d, 0xb6, 0xc6, 0x44, 0x25, 0xcb, 0xc1, 0xae, - 0x58, 0xfe, 0xef, 0xc3, 0x69, 0x3f, 0x47, 0xea, 0x88, 0x8e, 0xe8, 0x5f, 0x4a, 0x3d, 0x24, 0xda, - 0x7a, 0x3a, 0x0f, 0x8b, 0x73, 0xeb, 0xa0, 0x82, 0x3b, 0x6c, 0xd1, 0x19, 0xe5, 0xf8, 0xac, 0xbd, - 0x62, 0xe7, 0xbf, 0x29, 0x60, 0x58, 0x61, 0xa9, 0x80, 0x38, 0xad, 0x1a, 0x7f, 0x95, 0xec, 0x35, - 0x88, 0x4f, 0x9a, 0x49, 0x18, 0x7d, 0xa8, 0xcd, 0x7f, 0x98, 0xf7, 0x3e, 0x97, 0x2f, 0xa3, 0x82, - 0x41, 0xf9, 0x2a, 0xd9, 0xe3, 0x43, 0xa1, 0x7f, 0x5d, 0xb9, 0xeb, 0xd7, 0xfd, 0x86, 0x05, 0xe3, - 0xea, 0xeb, 0x4e, 0x60, 0x21, 0x2d, 0x9a, 0x0b, 0xe9, 0xe1, 0xae, 0xf3, 0xb1, 0x60, 0x09, 0xfd, - 0x80, 0x89, 0x00, 0x41, 0x53, 0x8f, 0x42, 0xda, 0x35, 0x54, 0x66, 0x7f, 0x98, 0x03, 0xd2, 0xcf, - 0x77, 0x5d, 0x25, 0x7b, 0x6b, 0x21, 0xdd, 0xf0, 0xf3, 0xbf, 0xcb, 0x18, 0xb5, 0x81, 0xae, 0xa3, - 0xf6, 0x9b, 0x25, 0x38, 0xa3, 0x7a, 0xc0, 0xd8, 0x52, 0x7f, 0xd8, 0xfb, 0xe0, 0x59, 0x18, 0x75, - 0xc9, 0x86, 0xd3, 0xf6, 0x13, 0x65, 0x04, 0x0c, 0x72, 0x43, 0xb0, 0x96, 0x82, 0xb1, 0x4e, 0x73, - 0x84, 0x6e, 0xfb, 0x57, 0xc0, 0x64, 0x6f, 0xe2, 0xd0, 0x19, 0x4c, 0xf5, 0x2d, 0xcd, 0x94, 0x1b, - 0xd3, 0x4d, 0x39, 0x61, 0xb6, 0x3d, 0x0a, 0x83, 0xde, 0x0e, 0xdd, 0x8b, 0x4b, 0xe6, 0x16, 0xbb, - 0x4a, 0x81, 0x98, 0xe3, 0xd0, 0x27, 0x60, 0xb8, 0x19, 0xee, 0xec, 0x38, 0x81, 0x5b, 0x2d, 0x33, - 0x0d, 0x70, 0x94, 0x6e, 0xd7, 0x4b, 0x1c, 0x84, 0x25, 0x0e, 0x3d, 0x04, 0x03, 0x4e, 0xb4, 0x19, - 0x57, 0x07, 0x18, 0xcd, 0x08, 0xad, 0x69, 0x21, 0xda, 0x8c, 0x31, 0x83, 0x52, 0xcd, 0xee, 0x4e, - 0x18, 0x6d, 0x7b, 0xc1, 0x66, 0xcd, 0x8b, 0x98, 0x9a, 0xa6, 0x69, 0x76, 0x6f, 0x28, 0x0c, 0xd6, - 0xa8, 0xd0, 0x0a, 0x0c, 0xb6, 0xc2, 0x28, 0x89, 0xab, 0x43, 0xac, 0xbb, 0x1f, 0x29, 0x58, 0x4a, - 0xfc, 0x6b, 0xeb, 0x61, 0x94, 0xa4, 0x1f, 0x40, 0xff, 0xc5, 0x98, 0x17, 0x47, 0x3f, 0x0e, 0x65, - 0x12, 0xec, 0x56, 0x87, 0x19, 0x97, 0x99, 0x3c, 0x2e, 0xcb, 0xc1, 0xee, 0x6d, 0x27, 0x4a, 0xe5, - 0xcc, 0x72, 0xb0, 0x8b, 0x69, 0x19, 0xf4, 0x26, 0x54, 0xa4, 0x1b, 0x28, 0xae, 0x8e, 0x14, 0x4f, - 0x31, 0x2c, 0x88, 0x30, 0x79, 0xaf, 0xed, 0x45, 0x64, 0x87, 0x04, 0x49, 0x9c, 0x9a, 0x2f, 0x12, - 0x1b, 0xe3, 0x94, 0x1b, 0x7a, 0x13, 0xc6, 0xb8, 0xe6, 0x77, 0x3d, 0x6c, 0x07, 0x49, 0x5c, 0xad, - 0xb0, 0xe6, 0xe5, 0xfa, 0x0c, 0x6e, 0xa7, 0x74, 0x8b, 0xa7, 0x05, 0xd3, 0x31, 0x0d, 0x18, 0x63, - 0x83, 0x15, 0xc2, 0x30, 0xee, 0x7b, 0xbb, 0x24, 0x20, 0x71, 0x5c, 0x8f, 0xc2, 0x75, 0x52, 0x05, - 0xd6, 0xf2, 0x73, 0xf9, 0xa6, 0x74, 0xb8, 0x4e, 0x16, 0xa7, 0x0f, 0xf6, 0x67, 0xc7, 0xaf, 0xe9, - 0x65, 0xb0, 0xc9, 0x02, 0xdd, 0x82, 0x09, 0xaa, 0x52, 0x7a, 0x29, 0xd3, 0xd1, 0x5e, 0x4c, 0xd1, - 0xc1, 0xfe, 0xec, 0x04, 0x36, 0x0a, 0xe1, 0x0c, 0x13, 0xf4, 0x1a, 0x54, 0x7c, 0x6f, 0x83, 0x34, - 0xf7, 0x9a, 0x3e, 0xa9, 0x8e, 0x31, 0x8e, 0xb9, 0xcb, 0xea, 0x9a, 0x24, 0xe2, 0x2a, 0xbb, 0xfa, - 0x8b, 0xd3, 0xe2, 0xe8, 0x36, 0x9c, 0x4d, 0x48, 0xb4, 0xe3, 0x05, 0x0e, 0x5d, 0x0e, 0x42, 0x9f, - 0x64, 0x0e, 0x89, 0x71, 0x36, 0xdf, 0xce, 0x8b, 0xae, 0x3b, 0xbb, 0x96, 0x4b, 0x85, 0x0b, 0x4a, - 0xa3, 0x9b, 0x30, 0xc9, 0x56, 0x42, 0xbd, 0xed, 0xfb, 0xf5, 0xd0, 0xf7, 0x9a, 0x7b, 0xd5, 0x09, - 0xc6, 0xf0, 0x13, 0xd2, 0xe3, 0xb0, 0x6a, 0xa2, 0xa9, 0x81, 0x95, 0xfe, 0xc3, 0xd9, 0xd2, 0x68, - 0x1d, 0x26, 0x63, 0xd2, 0x6c, 0x47, 0x5e, 0xb2, 0x47, 0xe7, 0x2f, 0xb9, 0x9b, 0x54, 0x27, 0x8b, - 0xcd, 0xc4, 0x86, 0x49, 0xca, 0x3d, 0x3b, 0x19, 0x20, 0xce, 0x32, 0xa4, 0x4b, 0x3b, 0x4e, 0x5c, - 0x2f, 0xa8, 0x4e, 0x31, 0x89, 0xa1, 0x56, 0x46, 0x83, 0x02, 0x31, 0xc7, 0x31, 0x9b, 0x9b, 0xfe, - 0xb8, 0x49, 0x25, 0xe8, 0x34, 0x23, 0x4c, 0x6d, 0x6e, 0x89, 0xc0, 0x29, 0x0d, 0xdd, 0x96, 0x93, - 0x64, 0xaf, 0x8a, 0x18, 0xa9, 0x5a, 0x2e, 0x6b, 0x6b, 0x6f, 0x62, 0x0a, 0x47, 0xd7, 0x60, 0x98, - 0x04, 0xbb, 0x2b, 0x51, 0xb8, 0x53, 0x3d, 0x55, 0xbc, 0x66, 0x97, 0x39, 0x09, 0x17, 0xe8, 0xa9, - 0x01, 0x20, 0xc0, 0x58, 0xb2, 0x40, 0x77, 0xa1, 0x9a, 0x33, 0x22, 0x7c, 0x00, 0x4e, 0xb3, 0x01, - 0x78, 0x45, 0x94, 0xad, 0xae, 0x15, 0xd0, 0x1d, 0x76, 0xc1, 0xe1, 0x42, 0xee, 0xf6, 0x3a, 0x4c, - 0x28, 0xc1, 0xc2, 0xc6, 0x16, 0xcd, 0xc2, 0x20, 0x95, 0x98, 0xd2, 0x08, 0xae, 0xd0, 0xae, 0xa4, - 0x82, 0x34, 0xc6, 0x1c, 0xce, 0xba, 0xd2, 0x7b, 0x9f, 0x2c, 0xee, 0x25, 0x84, 0x9b, 0x45, 0x65, - 0xad, 0x2b, 0x25, 0x02, 0xa7, 0x34, 0xf6, 0xff, 0xe1, 0x8a, 0x49, 0x2a, 0xbd, 0xfa, 0x90, 0xd7, - 0x4f, 0xc3, 0xc8, 0x56, 0x18, 0x27, 0x94, 0x9a, 0xd5, 0x31, 0x98, 0xaa, 0x22, 0x57, 0x04, 0x1c, - 0x2b, 0x0a, 0xf4, 0x32, 0x8c, 0x37, 0xf5, 0x0a, 0xc4, 0x66, 0x73, 0x46, 0x14, 0x31, 0x6b, 0xc7, - 0x26, 0x2d, 0x7a, 0x09, 0x46, 0x98, 0x67, 0xb8, 0x19, 0xfa, 0xc2, 0x00, 0x93, 0x3b, 0xe6, 0x48, - 0x5d, 0xc0, 0x0f, 0xb5, 0xdf, 0x58, 0x51, 0x53, 0x33, 0x96, 0x36, 0x61, 0xb5, 0x2e, 0xc4, 0xbc, - 0x32, 0x63, 0xaf, 0x30, 0x28, 0x16, 0x58, 0xfb, 0xaf, 0x96, 0xb4, 0x5e, 0xa6, 0x26, 0x05, 0x41, - 0x75, 0x18, 0xbe, 0xe3, 0x78, 0x89, 0x17, 0x6c, 0x8a, 0xfd, 0xfc, 0x89, 0xae, 0x32, 0x9f, 0x15, - 0x7a, 0x83, 0x17, 0xe0, 0xbb, 0x92, 0xf8, 0x83, 0x25, 0x1b, 0xca, 0x31, 0x6a, 0x07, 0x01, 0xe5, - 0x58, 0xea, 0x97, 0x23, 0xe6, 0x05, 0x38, 0x47, 0xf1, 0x07, 0x4b, 0x36, 0xe8, 0x6d, 0x00, 0x39, - 0x6f, 0x88, 0x2b, 0x3c, 0xb2, 0x4f, 0xf7, 0x66, 0xba, 0xa6, 0xca, 0x2c, 0x4e, 0xd0, 0x3d, 0x2f, - 0xfd, 0x8f, 0x35, 0x7e, 0x76, 0xc2, 0xf4, 0x9e, 0xce, 0xc6, 0xa0, 0xcf, 0xd2, 0xa5, 0xea, 0x44, - 0x09, 0x71, 0x17, 0x12, 0xd1, 0x39, 0x4f, 0xf6, 0xa7, 0xb6, 0xae, 0x79, 0x3b, 0x44, 0x5f, 0xd6, - 0x82, 0x09, 0x4e, 0xf9, 0xd9, 0xbf, 0x5d, 0x86, 0x6a, 0x51, 0x73, 0xe9, 0xa4, 0x23, 0x77, 0xbd, - 0x64, 0x89, 0xaa, 0x2b, 0x96, 0x39, 0xe9, 0x96, 0x05, 0x1c, 0x2b, 0x0a, 0x3a, 0xfa, 0xb1, 0xb7, - 0x29, 0xad, 0x8e, 0xc1, 0x74, 0xf4, 0x1b, 0x0c, 0x8a, 0x05, 0x96, 0xd2, 0x45, 0xc4, 0x89, 0x85, - 0xcb, 0x5f, 0x9b, 0x25, 0x98, 0x41, 0xb1, 0xc0, 0xea, 0x0e, 0x83, 0x81, 0x1e, 0x0e, 0x03, 0xa3, - 0x8b, 0x06, 0x8f, 0xb7, 0x8b, 0xd0, 0x3b, 0x00, 0x1b, 0x5e, 0xe0, 0xc5, 0x5b, 0x8c, 0xfb, 0xd0, - 0x91, 0xb9, 0x2b, 0x65, 0x67, 0x45, 0x71, 0xc1, 0x1a, 0x47, 0xf4, 0x02, 0x8c, 0xaa, 0x05, 0xb8, - 0x5a, 0xab, 0x0e, 0x9b, 0xfe, 0xe4, 0x54, 0x1a, 0xd5, 0xb0, 0x4e, 0x67, 0xbf, 0x9b, 0x9d, 0x2f, - 0x62, 0x05, 0x68, 0xfd, 0x6b, 0xf5, 0xdb, 0xbf, 0xa5, 0xee, 0xfd, 0x6b, 0xff, 0x7e, 0x19, 0x26, - 0x8d, 0xca, 0xda, 0x71, 0x1f, 0x32, 0xeb, 0x32, 0xdd, 0x88, 0x9c, 0x84, 0x88, 0xf5, 0x67, 0xf7, - 0x5e, 0x2a, 0xfa, 0x66, 0x45, 0x57, 0x00, 0x2f, 0x8f, 0xde, 0x81, 0x8a, 0xef, 0xc4, 0xcc, 0xf9, - 0x40, 0xc4, 0xba, 0xeb, 0x87, 0x59, 0xaa, 0xe8, 0x3b, 0x71, 0xa2, 0xed, 0x05, 0x9c, 0x77, 0xca, - 0x92, 0xee, 0x98, 0x54, 0x39, 0x91, 0x67, 0x4a, 0xaa, 0x11, 0x54, 0x83, 0xd9, 0xc3, 0x1c, 0x87, - 0x5e, 0x82, 0xb1, 0x88, 0xb0, 0x59, 0xb1, 0x44, 0x75, 0x2d, 0x36, 0xcd, 0x06, 0x53, 0xa5, 0x0c, - 0x6b, 0x38, 0x6c, 0x50, 0xa6, 0xba, 0xf6, 0x50, 0x17, 0x5d, 0xfb, 0x09, 0x18, 0x66, 0x3f, 0xd4, - 0x0c, 0x50, 0xa3, 0xb1, 0xca, 0xc1, 0x58, 0xe2, 0xb3, 0x13, 0x66, 0xa4, 0xcf, 0x09, 0xf3, 0x24, - 0x4c, 0xd4, 0x1c, 0xb2, 0x13, 0x06, 0xcb, 0x81, 0xdb, 0x0a, 0xbd, 0x20, 0x41, 0x55, 0x18, 0x60, - 0xbb, 0x03, 0x5f, 0xdb, 0x03, 0x94, 0x03, 0x1e, 0xa0, 0x9a, 0xb3, 0xfd, 0x47, 0x25, 0x18, 0xaf, - 0x11, 0x9f, 0x24, 0x84, 0xdb, 0x1a, 0x31, 0x5a, 0x01, 0xb4, 0x19, 0x39, 0x4d, 0x52, 0x27, 0x91, - 0x17, 0xba, 0x0d, 0xd2, 0x0c, 0x03, 0x76, 0x52, 0x43, 0xb7, 0xbb, 0xb3, 0x07, 0xfb, 0xb3, 0xe8, - 0x72, 0x07, 0x16, 0xe7, 0x94, 0x40, 0x6f, 0xc1, 0x78, 0x2b, 0x22, 0x86, 0x0f, 0xcd, 0x2a, 0x52, - 0x17, 0xea, 0x3a, 0x21, 0xd7, 0x54, 0x0d, 0x10, 0x36, 0x59, 0xa1, 0xcf, 0xc0, 0x54, 0x18, 0xb5, - 0xb6, 0x9c, 0xa0, 0x46, 0x5a, 0x24, 0x70, 0xa9, 0x2a, 0x2e, 0x7c, 0x04, 0xa7, 0x0f, 0xf6, 0x67, - 0xa7, 0x6e, 0x66, 0x70, 0xb8, 0x83, 0x1a, 0xbd, 0x05, 0xd3, 0xad, 0x28, 0x6c, 0x39, 0x9b, 0x6c, - 0xa2, 0x08, 0x8d, 0x83, 0x4b, 0x9f, 0xa7, 0x0f, 0xf6, 0x67, 0xa7, 0xeb, 0x59, 0xe4, 0xe1, 0xfe, - 0xec, 0x29, 0xd6, 0x51, 0x14, 0x92, 0x22, 0x71, 0x27, 0x1b, 0x7b, 0x13, 0xce, 0xd4, 0xc2, 0x3b, - 0xc1, 0x1d, 0x27, 0x72, 0x17, 0xea, 0xab, 0x9a, 0x71, 0x7f, 0x43, 0x1a, 0x97, 0xfc, 0xdc, 0x2b, - 0x77, 0x9f, 0xd2, 0x4a, 0x72, 0xf5, 0x7f, 0xc5, 0xf3, 0x49, 0x81, 0x13, 0xe1, 0xaf, 0x97, 0x8c, - 0x9a, 0x52, 0x7a, 0xe5, 0xa9, 0xb7, 0x0a, 0x3d, 0xf5, 0xaf, 0xc3, 0xc8, 0x86, 0x47, 0x7c, 0x17, - 0x93, 0x0d, 0x31, 0x32, 0x8f, 0x17, 0x1f, 0x60, 0xac, 0x50, 0x4a, 0xe9, 0x34, 0xe2, 0xa6, 0xe9, - 0x8a, 0x28, 0x8c, 0x15, 0x1b, 0xb4, 0x0d, 0x53, 0xd2, 0xf6, 0x91, 0x58, 0xb1, 0x88, 0x9f, 0xe8, - 0x66, 0x50, 0x99, 0xcc, 0xd9, 0x00, 0xe2, 0x0c, 0x1b, 0xdc, 0xc1, 0x98, 0xda, 0xa2, 0x3b, 0x74, - 0xbb, 0x1a, 0x60, 0x53, 0x9a, 0xd9, 0xa2, 0xcc, 0xac, 0x66, 0x50, 0xfb, 0xab, 0x16, 0x3c, 0xd0, - 0xd1, 0x33, 0xc2, 0xbd, 0x70, 0xcc, 0xa3, 0x90, 0x35, 0xf7, 0x4b, 0xbd, 0xcd, 0x7d, 0xfb, 0xd7, - 0x2d, 0x38, 0xbd, 0xbc, 0xd3, 0x4a, 0xf6, 0x6a, 0x9e, 0x79, 0x9a, 0xf0, 0x22, 0x0c, 0xed, 0x10, - 0xd7, 0x6b, 0xef, 0x88, 0x91, 0x9b, 0x95, 0x22, 0xfd, 0x3a, 0x83, 0x1e, 0xee, 0xcf, 0x8e, 0x37, - 0x92, 0x30, 0x72, 0x36, 0x09, 0x07, 0x60, 0x41, 0x8e, 0x7e, 0x9a, 0xeb, 0xa6, 0xd7, 0xbc, 0x1d, - 0x4f, 0x1e, 0x48, 0x75, 0x75, 0x79, 0xcd, 0xc9, 0x0e, 0x9d, 0x7b, 0xbd, 0xed, 0x04, 0x89, 0x97, - 0xec, 0x99, 0xba, 0x2c, 0x63, 0x84, 0x53, 0x9e, 0xf6, 0x77, 0x2c, 0x98, 0x94, 0xf2, 0x64, 0xc1, - 0x75, 0x23, 0x12, 0xc7, 0x68, 0x06, 0x4a, 0x5e, 0x4b, 0xb4, 0x14, 0x44, 0xe9, 0xd2, 0x6a, 0x1d, - 0x97, 0xbc, 0x16, 0xaa, 0x43, 0x85, 0x9f, 0x6d, 0xa5, 0x13, 0xac, 0xaf, 0x13, 0x32, 0x66, 0xfb, - 0xad, 0xc9, 0x92, 0x38, 0x65, 0x22, 0x35, 0x63, 0xb6, 0x17, 0x95, 0xcd, 0x93, 0x96, 0x2b, 0x02, - 0x8e, 0x15, 0x05, 0xba, 0x08, 0x23, 0x41, 0xe8, 0xf2, 0xa3, 0x46, 0xbe, 0xae, 0xd9, 0xb4, 0xbd, - 0x21, 0x60, 0x58, 0x61, 0xed, 0x9f, 0xb3, 0x60, 0x4c, 0x7e, 0x59, 0x9f, 0x4a, 0x3a, 0x5d, 0x5e, - 0xa9, 0x82, 0x9e, 0x2e, 0x2f, 0xaa, 0x64, 0x33, 0x8c, 0xa1, 0x5b, 0x97, 0x8f, 0xa2, 0x5b, 0xdb, - 0x5f, 0x29, 0xc1, 0x84, 0x6c, 0x4e, 0xa3, 0xbd, 0x1e, 0x93, 0x04, 0xad, 0x41, 0xc5, 0xe1, 0x5d, - 0x4e, 0xe4, 0xac, 0x7d, 0x34, 0xdf, 0xea, 0x32, 0xc6, 0x27, 0x1d, 0xd1, 0x05, 0x59, 0x1a, 0xa7, - 0x8c, 0x90, 0x0f, 0xd3, 0x41, 0x98, 0xb0, 0xad, 0x4f, 0xe1, 0xbb, 0x9d, 0x0d, 0x64, 0xb9, 0x9f, - 0x13, 0xdc, 0xa7, 0x6f, 0x64, 0xb9, 0xe0, 0x4e, 0xc6, 0x68, 0x59, 0x7a, 0x7a, 0xca, 0xac, 0x86, - 0x0b, 0xdd, 0x6a, 0x28, 0x76, 0xf4, 0xd8, 0xbf, 0x67, 0x41, 0x45, 0x92, 0x9d, 0xc4, 0x31, 0xd0, - 0x75, 0x18, 0x8e, 0xd9, 0x20, 0xc8, 0xae, 0xb1, 0xbb, 0x35, 0x9c, 0x8f, 0x57, 0xba, 0xa3, 0xf3, - 0xff, 0x31, 0x96, 0x3c, 0x98, 0xab, 0x5a, 0x35, 0xff, 0x23, 0xe2, 0xaa, 0x56, 0xed, 0x29, 0xd8, - 0x65, 0xfe, 0x13, 0x6b, 0xb3, 0x66, 0xcf, 0x53, 0xc5, 0xb3, 0x15, 0x91, 0x0d, 0xef, 0x6e, 0x56, - 0xf1, 0xac, 0x33, 0x28, 0x16, 0x58, 0xf4, 0x36, 0x8c, 0x35, 0xa5, 0x87, 0x37, 0x15, 0x03, 0x8f, - 0x75, 0xf5, 0x97, 0xab, 0xa3, 0x15, 0x1e, 0x90, 0xb3, 0xa4, 0x95, 0xc7, 0x06, 0x37, 0x2a, 0x61, - 0xd2, 0x53, 0xe1, 0x72, 0x57, 0xe7, 0x4a, 0x44, 0x92, 0x94, 0x6f, 0xe1, 0x81, 0xb0, 0xfd, 0xcb, - 0x16, 0x0c, 0x71, 0x3f, 0x61, 0x7f, 0x8e, 0x55, 0xed, 0xa8, 0x28, 0xed, 0xbb, 0xdb, 0x14, 0x28, - 0x4e, 0x8e, 0xd0, 0x75, 0xa8, 0xb0, 0x1f, 0xcc, 0x5f, 0x52, 0x2e, 0x8e, 0x44, 0xe2, 0xb5, 0xea, - 0x0d, 0xbc, 0x2d, 0x8b, 0xe1, 0x94, 0x83, 0xfd, 0x0b, 0x65, 0x2a, 0xaa, 0x52, 0x52, 0x63, 0x17, - 0xb7, 0xee, 0xdf, 0x2e, 0x5e, 0xba, 0x5f, 0xbb, 0xf8, 0x26, 0x4c, 0x36, 0xb5, 0x73, 0xa9, 0x74, - 0x24, 0x2f, 0x76, 0x9d, 0x24, 0xda, 0x11, 0x16, 0xf7, 0x95, 0x2d, 0x99, 0x4c, 0x70, 0x96, 0x2b, - 0xfa, 0x2c, 0x8c, 0xf1, 0x71, 0x16, 0xb5, 0x0c, 0xb0, 0x5a, 0x3e, 0x51, 0x3c, 0x5f, 0xf4, 0x2a, - 0xd8, 0x4c, 0x6c, 0x68, 0xc5, 0xb1, 0xc1, 0xcc, 0xfe, 0xd2, 0x20, 0x0c, 0x2e, 0xef, 0x92, 0x20, - 0x39, 0x01, 0x81, 0xd4, 0x84, 0x09, 0x2f, 0xd8, 0x0d, 0xfd, 0x5d, 0xe2, 0x72, 0xfc, 0x51, 0x36, - 0xd7, 0xb3, 0x82, 0xf5, 0xc4, 0xaa, 0xc1, 0x02, 0x67, 0x58, 0xde, 0x0f, 0xcb, 0xfd, 0x32, 0x0c, - 0xf1, 0xb1, 0x17, 0x66, 0x7b, 0xae, 0x17, 0x9c, 0x75, 0xa2, 0x58, 0x05, 0xa9, 0x57, 0x81, 0xbb, - 0xdd, 0x45, 0x71, 0xf4, 0x2e, 0x4c, 0x6c, 0x78, 0x51, 0x9c, 0x50, 0x93, 0x3b, 0x4e, 0x9c, 0x9d, - 0xd6, 0x3d, 0x58, 0xea, 0xaa, 0x1f, 0x56, 0x0c, 0x4e, 0x38, 0xc3, 0x19, 0x6d, 0xc2, 0x38, 0x35, - 0x1e, 0xd3, 0xaa, 0x86, 0x8f, 0x5c, 0x95, 0x72, 0xc5, 0x5d, 0xd3, 0x19, 0x61, 0x93, 0x2f, 0x15, - 0x26, 0x4d, 0x66, 0x6c, 0x8e, 0x30, 0x8d, 0x42, 0x09, 0x13, 0x6e, 0x65, 0x72, 0x1c, 0x95, 0x49, - 0x2c, 0x9e, 0xa3, 0x62, 0xca, 0xa4, 0x34, 0x6a, 0xc3, 0xfe, 0x1a, 0xdd, 0x1d, 0x69, 0x1f, 0x9e, - 0xc0, 0xd6, 0xf2, 0xaa, 0xb9, 0xb5, 0x9c, 0x2b, 0x1c, 0xcf, 0x82, 0x6d, 0xe5, 0x73, 0x30, 0xaa, - 0x0d, 0x37, 0x9a, 0x87, 0x4a, 0x53, 0x06, 0x1f, 0x08, 0xa9, 0xab, 0xd4, 0x17, 0x15, 0x95, 0x80, - 0x53, 0x1a, 0xda, 0x1b, 0x54, 0xd9, 0xcb, 0x06, 0x23, 0x51, 0x55, 0x10, 0x33, 0x8c, 0xfd, 0x1c, - 0xc0, 0xf2, 0x5d, 0xd2, 0x5c, 0xe0, 0xc6, 0x97, 0x76, 0xc6, 0x65, 0x15, 0x9f, 0x71, 0xd9, 0x7f, - 0x6c, 0xc1, 0xc4, 0xca, 0x92, 0xa1, 0x94, 0xcf, 0x01, 0x70, 0x2d, 0xf4, 0x8d, 0x37, 0x6e, 0x48, - 0xef, 0x30, 0x77, 0xf0, 0x29, 0x28, 0xd6, 0x28, 0xd0, 0x39, 0x28, 0xfb, 0xed, 0x40, 0x28, 0x87, - 0xc3, 0x07, 0xfb, 0xb3, 0xe5, 0x6b, 0xed, 0x00, 0x53, 0x98, 0x16, 0xff, 0x53, 0xee, 0x3b, 0xfe, - 0xa7, 0x67, 0xfc, 0x2b, 0x9a, 0x85, 0xc1, 0x3b, 0x77, 0x3c, 0x37, 0xae, 0x0e, 0xa6, 0x9e, 0xeb, - 0x37, 0xde, 0x58, 0xad, 0xc5, 0x98, 0xc3, 0xed, 0xff, 0xbf, 0x0c, 0x53, 0x2b, 0x3e, 0xb9, 0x6b, - 0x7c, 0xd6, 0x63, 0x30, 0xe4, 0x46, 0xde, 0x2e, 0x89, 0xb2, 0xbb, 0x78, 0x8d, 0x41, 0xb1, 0xc0, - 0xf6, 0x1d, 0xb3, 0x74, 0xab, 0x73, 0x3f, 0x3e, 0xee, 0x28, 0xad, 0xde, 0x5d, 0xf1, 0x36, 0x0c, - 0xf3, 0xa3, 0x52, 0xde, 0x19, 0xa3, 0x97, 0x9e, 0xcd, 0x6b, 0x42, 0xb6, 0x2f, 0xe6, 0x84, 0xf3, - 0x83, 0xc7, 0x8d, 0x28, 0x21, 0x26, 0xa0, 0x58, 0xb2, 0x9c, 0xf9, 0x14, 0x8c, 0xe9, 0x94, 0x47, - 0x0a, 0x20, 0xf9, 0x0b, 0x16, 0x9c, 0x5a, 0xf1, 0xc3, 0xe6, 0x76, 0x26, 0x80, 0xec, 0x05, 0x18, - 0xa5, 0xeb, 0x29, 0x36, 0x22, 0x29, 0x8d, 0x28, 0x53, 0x81, 0xc2, 0x3a, 0x9d, 0x56, 0xec, 0xd6, - 0xad, 0xd5, 0x5a, 0x5e, 0x70, 0xaa, 0x40, 0x61, 0x9d, 0xce, 0xfe, 0x03, 0x0b, 0x1e, 0xbe, 0xbc, - 0xb4, 0x5c, 0x27, 0x51, 0xec, 0xc5, 0x09, 0x09, 0x92, 0x8e, 0xf8, 0x58, 0xaa, 0xdc, 0xb9, 0x5a, - 0x53, 0x52, 0xe5, 0xae, 0xc6, 0x5a, 0x21, 0xb0, 0x1f, 0x95, 0xd8, 0xef, 0x5f, 0xb5, 0xe0, 0xd4, - 0x65, 0x2f, 0xc1, 0xa4, 0x15, 0x66, 0xe3, 0x53, 0x23, 0xd2, 0x0a, 0x63, 0x2f, 0x09, 0xa3, 0xbd, - 0x6c, 0x7c, 0x2a, 0x56, 0x18, 0xac, 0x51, 0xf1, 0x9a, 0x77, 0xbd, 0x98, 0xb6, 0xb4, 0x64, 0x5a, - 0x98, 0x58, 0xc0, 0xb1, 0xa2, 0xa0, 0x1f, 0xe6, 0x7a, 0x11, 0xd3, 0x10, 0xf6, 0xc4, 0x72, 0x56, - 0x1f, 0x56, 0x93, 0x08, 0x9c, 0xd2, 0xd8, 0x5f, 0xb5, 0xe0, 0xcc, 0x65, 0xbf, 0x1d, 0x27, 0x24, - 0xda, 0x88, 0x8d, 0xc6, 0x3e, 0x07, 0x15, 0x22, 0xb5, 0x70, 0xd1, 0x56, 0xb5, 0x6f, 0x28, 0xf5, - 0x9c, 0x07, 0xc7, 0x2a, 0xba, 0x3e, 0xa2, 0x31, 0x8f, 0x16, 0x45, 0xf8, 0xf5, 0x12, 0x8c, 0x5f, - 0x59, 0x5b, 0xab, 0x5f, 0x26, 0x89, 0x10, 0x99, 0xbd, 0xbd, 0x48, 0x58, 0x33, 0x84, 0xbb, 0xe9, - 0x3a, 0xed, 0xc4, 0xf3, 0xe7, 0xf8, 0xbd, 0x84, 0xb9, 0xd5, 0x20, 0xb9, 0x19, 0x35, 0x92, 0xc8, - 0x0b, 0x36, 0x73, 0x4d, 0x67, 0x29, 0xd8, 0xcb, 0x45, 0x82, 0x1d, 0x3d, 0x07, 0x43, 0xec, 0x62, - 0x84, 0xd4, 0x3a, 0x1e, 0x54, 0xaa, 0x02, 0x83, 0x1e, 0xee, 0xcf, 0x56, 0x6e, 0xe1, 0x55, 0xfe, - 0x07, 0x0b, 0x52, 0x74, 0x0b, 0x46, 0xb7, 0x92, 0xa4, 0x75, 0x85, 0x38, 0x2e, 0x89, 0xa4, 0x74, - 0x38, 0x9f, 0x27, 0x1d, 0x68, 0x27, 0x70, 0xb2, 0x74, 0x41, 0xa5, 0xb0, 0x18, 0xeb, 0x7c, 0xec, - 0x06, 0x40, 0x8a, 0x3b, 0x26, 0xb3, 0xc1, 0xfe, 0xbe, 0x05, 0xc3, 0x57, 0x9c, 0xc0, 0xf5, 0x49, - 0x84, 0x5e, 0x81, 0x01, 0x72, 0x97, 0x34, 0xc5, 0x0e, 0x9e, 0xdb, 0xe0, 0x74, 0x97, 0xe3, 0x8e, - 0x30, 0xfa, 0x1f, 0xb3, 0x52, 0xe8, 0x0a, 0x0c, 0xd3, 0xd6, 0x5e, 0x56, 0x61, 0xca, 0x8f, 0x14, - 0x7d, 0xb1, 0x1a, 0x76, 0xbe, 0x31, 0x0a, 0x10, 0x96, 0xc5, 0x99, 0x43, 0xa7, 0xd9, 0x6a, 0x50, - 0x01, 0x96, 0x74, 0x33, 0xb7, 0xd6, 0x96, 0xea, 0x9c, 0x48, 0x70, 0xe3, 0x0e, 0x1d, 0x09, 0xc4, - 0x29, 0x13, 0x7b, 0x0d, 0x2a, 0x74, 0x50, 0x17, 0x7c, 0xcf, 0xe9, 0xee, 0x4b, 0x7a, 0x0a, 0x2a, - 0xd2, 0xaf, 0x13, 0x8b, 0x48, 0x67, 0xc6, 0x55, 0xba, 0x7d, 0x62, 0x9c, 0xe2, 0xed, 0x0d, 0x38, - 0xcd, 0x0e, 0x4a, 0x9d, 0x64, 0xcb, 0x58, 0x63, 0xbd, 0x27, 0xf3, 0xd3, 0x42, 0xbf, 0xe2, 0x23, - 0x53, 0xd5, 0x62, 0x65, 0xc7, 0x24, 0x47, 0x4d, 0xd7, 0xfa, 0x0f, 0x03, 0x30, 0xbd, 0xda, 0x58, - 0x6a, 0x98, 0xce, 0xc5, 0x97, 0x60, 0x8c, 0x6b, 0x02, 0x74, 0x42, 0x3b, 0xbe, 0xa8, 0x4d, 0x1d, - 0x1e, 0xac, 0x69, 0x38, 0x6c, 0x50, 0xa2, 0x87, 0xa1, 0xec, 0xbd, 0x17, 0x64, 0xc3, 0xe1, 0x56, - 0x5f, 0xbf, 0x81, 0x29, 0x9c, 0xa2, 0xa9, 0x52, 0xc1, 0x05, 0xa8, 0x42, 0x2b, 0xc5, 0xe2, 0x55, - 0x98, 0xf0, 0xe2, 0x66, 0xec, 0xad, 0x06, 0x54, 0xba, 0x38, 0x4d, 0xb9, 0x34, 0x52, 0x8d, 0x9f, - 0x36, 0x55, 0x61, 0x71, 0x86, 0x5a, 0x93, 0xe6, 0x83, 0x7d, 0x2b, 0x26, 0x3d, 0x63, 0xa6, 0xa9, - 0xce, 0xd5, 0x62, 0x5f, 0x17, 0xb3, 0xd0, 0x1c, 0xa1, 0x73, 0xf1, 0x0f, 0x8e, 0xb1, 0xc4, 0xa1, - 0xcb, 0x30, 0xdd, 0xdc, 0x72, 0x5a, 0x0b, 0xed, 0x64, 0xab, 0xe6, 0xc5, 0xcd, 0x70, 0x97, 0x44, - 0x7b, 0x4c, 0x13, 0x1e, 0x49, 0x9d, 0x4c, 0x0a, 0xb1, 0x74, 0x65, 0xa1, 0x4e, 0x29, 0x71, 0x67, - 0x19, 0x53, 0x05, 0x81, 0x63, 0x53, 0x41, 0x16, 0x60, 0x52, 0xd6, 0xd5, 0x20, 0x31, 0xdb, 0x1e, - 0x46, 0x59, 0xeb, 0xd4, 0x7d, 0x14, 0x01, 0x56, 0x6d, 0xcb, 0xd2, 0xa3, 0x17, 0x61, 0xdc, 0x0b, - 0xbc, 0xc4, 0x73, 0x92, 0x30, 0x62, 0x9b, 0xeb, 0x18, 0xdf, 0x30, 0xa8, 0x84, 0x5f, 0xd5, 0x11, - 0xd8, 0xa4, 0xb3, 0xdf, 0x85, 0x8a, 0x8a, 0x37, 0x93, 0x21, 0x93, 0x56, 0x41, 0xc8, 0x64, 0xef, - 0x1d, 0x41, 0x7a, 0xcd, 0xcb, 0xb9, 0x5e, 0xf3, 0xbf, 0x61, 0x41, 0x1a, 0x76, 0x83, 0xae, 0x40, - 0xa5, 0x15, 0xb2, 0x93, 0xb3, 0x48, 0x1e, 0x47, 0x3f, 0x98, 0x2b, 0x3c, 0xb8, 0xa0, 0xe2, 0xfd, - 0x57, 0x97, 0x25, 0x70, 0x5a, 0x18, 0x2d, 0xc2, 0x70, 0x2b, 0x22, 0x8d, 0x84, 0xdd, 0x53, 0xe8, - 0xc9, 0x87, 0xcf, 0x11, 0x4e, 0x8f, 0x65, 0x41, 0xfb, 0x37, 0x2d, 0x00, 0xee, 0x94, 0x76, 0x82, - 0x4d, 0x72, 0x02, 0x86, 0x76, 0x0d, 0x06, 0xe2, 0x16, 0x69, 0x76, 0x3b, 0xd3, 0x4c, 0xdb, 0xd3, - 0x68, 0x91, 0x66, 0xda, 0xe1, 0xf4, 0x1f, 0x66, 0xa5, 0xed, 0x9f, 0x05, 0x98, 0x48, 0xc9, 0xa8, - 0x01, 0x84, 0x9e, 0x31, 0xc2, 0xf2, 0xcf, 0x65, 0xc2, 0xf2, 0x2b, 0x8c, 0x5a, 0x8b, 0xc4, 0x7f, - 0x17, 0xca, 0x3b, 0xce, 0x5d, 0x61, 0x65, 0x3d, 0xd5, 0xbd, 0x19, 0x94, 0xff, 0xdc, 0x75, 0xe7, - 0x2e, 0xd7, 0x63, 0x9f, 0x92, 0x13, 0xe4, 0xba, 0x73, 0xf7, 0x90, 0x9f, 0x5c, 0x32, 0x21, 0x45, - 0x8d, 0xb9, 0x2f, 0xfc, 0x49, 0xfa, 0x9f, 0x4d, 0x3b, 0x5a, 0x09, 0xab, 0xcb, 0x0b, 0x84, 0x8b, - 0xb6, 0xaf, 0xba, 0xbc, 0x20, 0x5b, 0x97, 0x17, 0xf4, 0x51, 0x97, 0x17, 0xa0, 0xf7, 0x61, 0x58, - 0x1c, 0x89, 0xb0, 0x78, 0xc2, 0xd1, 0x4b, 0xf3, 0x7d, 0xd4, 0x27, 0x4e, 0x54, 0x78, 0x9d, 0xf3, - 0x52, 0x4f, 0x17, 0xd0, 0x9e, 0xf5, 0xca, 0x0a, 0xd1, 0x5f, 0xb3, 0x60, 0x42, 0xfc, 0xc6, 0xe4, - 0xbd, 0x36, 0x89, 0x13, 0xa1, 0x0f, 0x7c, 0xb2, 0xff, 0x36, 0x88, 0x82, 0xbc, 0x29, 0x9f, 0x94, - 0x62, 0xd6, 0x44, 0xf6, 0x6c, 0x51, 0xa6, 0x15, 0xe8, 0x1f, 0x5a, 0x70, 0x7a, 0xc7, 0xb9, 0xcb, - 0x6b, 0xe4, 0x30, 0xec, 0x24, 0x5e, 0x28, 0xe2, 0x23, 0x5f, 0xe9, 0x6f, 0xf8, 0x3b, 0x8a, 0xf3, - 0x46, 0xca, 0x50, 0xaa, 0xd3, 0x79, 0x24, 0x3d, 0x9b, 0x9a, 0xdb, 0xae, 0x99, 0x0d, 0x18, 0x91, - 0xf3, 0x2d, 0xc7, 0x1a, 0xaa, 0xe9, 0xca, 0xce, 0x91, 0x4f, 0xa4, 0x34, 0xeb, 0x89, 0xd5, 0x23, - 0xe6, 0xda, 0x7d, 0xad, 0xe7, 0x5d, 0x18, 0xd3, 0xe7, 0xd8, 0x7d, 0xad, 0xeb, 0x3d, 0x38, 0x95, - 0x33, 0x97, 0xee, 0x6b, 0x95, 0x77, 0xe0, 0x5c, 0xe1, 0xfc, 0xb8, 0x9f, 0x15, 0xdb, 0x5f, 0xb7, - 0x74, 0x39, 0x78, 0x02, 0xee, 0xa9, 0x25, 0xd3, 0x3d, 0x75, 0xbe, 0xfb, 0xca, 0x29, 0xf0, 0x51, - 0xbd, 0xad, 0x37, 0x9a, 0x4a, 0x75, 0xf4, 0x1a, 0x0c, 0xf9, 0x14, 0x22, 0xcf, 0xe1, 0xec, 0xde, - 0x2b, 0x32, 0xd5, 0xa5, 0x18, 0x3c, 0xc6, 0x82, 0x83, 0xfd, 0x3b, 0x16, 0x0c, 0x9c, 0x40, 0x4f, - 0x60, 0xb3, 0x27, 0x9e, 0x29, 0x64, 0x2d, 0x2e, 0x9d, 0xcf, 0x61, 0xe7, 0xce, 0xf2, 0xdd, 0x84, - 0x04, 0x31, 0x53, 0xdf, 0x73, 0x3b, 0xe6, 0x7f, 0x97, 0x60, 0x94, 0x56, 0x25, 0x83, 0x46, 0x5e, - 0x86, 0x71, 0xdf, 0x59, 0x27, 0xbe, 0x74, 0x99, 0x67, 0x8d, 0xd8, 0x6b, 0x3a, 0x12, 0x9b, 0xb4, - 0xb4, 0xf0, 0x86, 0x7e, 0x7a, 0x20, 0xf4, 0x17, 0x55, 0xd8, 0x38, 0x5a, 0xc0, 0x26, 0x2d, 0xb5, - 0xa7, 0xee, 0x38, 0x49, 0x73, 0x4b, 0x18, 0xb8, 0xaa, 0xb9, 0x6f, 0x50, 0x20, 0xe6, 0x38, 0xaa, - 0xc0, 0xc9, 0xd9, 0x79, 0x9b, 0x44, 0x4c, 0x81, 0xe3, 0xea, 0xb1, 0x52, 0xe0, 0xb0, 0x89, 0xc6, - 0x59, 0x7a, 0xf4, 0x29, 0x98, 0xa0, 0x9d, 0x13, 0xb6, 0x13, 0x19, 0x12, 0x33, 0xc8, 0x42, 0x62, - 0x58, 0x04, 0xf4, 0x9a, 0x81, 0xc1, 0x19, 0x4a, 0x54, 0x87, 0xd3, 0x5e, 0xd0, 0xf4, 0xdb, 0x2e, - 0xb9, 0x15, 0x70, 0xed, 0xce, 0xf7, 0xde, 0x27, 0xae, 0x50, 0xa0, 0x55, 0xf4, 0xd2, 0x6a, 0x0e, - 0x0d, 0xce, 0x2d, 0x69, 0xff, 0x34, 0x9c, 0xba, 0x16, 0x3a, 0xee, 0xa2, 0xe3, 0x3b, 0x41, 0x93, - 0x44, 0xab, 0xc1, 0x66, 0xcf, 0x03, 0x79, 0xfd, 0xf8, 0xbc, 0xd4, 0xeb, 0xf8, 0xdc, 0xde, 0x02, - 0xa4, 0x57, 0x20, 0x42, 0xc1, 0x30, 0x0c, 0x7b, 0xbc, 0x2a, 0x31, 0xfd, 0x1f, 0xcf, 0xd7, 0xae, - 0x3b, 0x5a, 0xa6, 0x05, 0x39, 0x71, 0x00, 0x96, 0x8c, 0xec, 0x97, 0x20, 0xf7, 0x7e, 0x46, 0x6f, - 0x53, 0xda, 0x7e, 0x01, 0xa6, 0x59, 0xc9, 0xa3, 0x99, 0x79, 0xf6, 0x5f, 0xb6, 0x60, 0xf2, 0x46, - 0xe6, 0x0e, 0xec, 0x63, 0x30, 0x14, 0x93, 0x28, 0xc7, 0x17, 0xda, 0x60, 0x50, 0x2c, 0xb0, 0xc7, - 0xee, 0x73, 0xf9, 0x81, 0x05, 0x15, 0x16, 0x63, 0xdc, 0xa2, 0x46, 0xd8, 0xfd, 0x57, 0x6a, 0x97, - 0x0c, 0xa5, 0x36, 0xd7, 0x17, 0xa0, 0x9a, 0x53, 0xa4, 0xd3, 0xa2, 0xab, 0xea, 0x6e, 0x68, 0x17, - 0x37, 0x40, 0xca, 0x86, 0xdf, 0x24, 0x9c, 0x30, 0x2f, 0x90, 0xca, 0xdb, 0xa2, 0xec, 0x44, 0x5c, - 0xd1, 0x7e, 0x44, 0x4e, 0xc4, 0x55, 0x7b, 0x0a, 0xa4, 0x5f, 0x5d, 0x6b, 0x32, 0xdb, 0x15, 0x7e, - 0x82, 0x45, 0x8e, 0xb2, 0xb5, 0xa9, 0x2e, 0x51, 0xcf, 0x8a, 0x48, 0x50, 0x01, 0x3d, 0x64, 0x82, - 0x4c, 0xfc, 0xe3, 0x37, 0xe3, 0xd3, 0x22, 0xf6, 0x15, 0x98, 0xcc, 0x74, 0x18, 0x7a, 0x01, 0x06, - 0x5b, 0x5b, 0x4e, 0x4c, 0x32, 0x91, 0x40, 0x83, 0x75, 0x0a, 0x3c, 0xdc, 0x9f, 0x9d, 0x50, 0x05, - 0x18, 0x04, 0x73, 0x6a, 0xfb, 0xbf, 0x59, 0x30, 0x70, 0x23, 0x74, 0x4f, 0x62, 0x32, 0xbd, 0x6a, - 0x4c, 0xa6, 0x87, 0x8a, 0x32, 0x6c, 0x14, 0xce, 0xa3, 0x95, 0xcc, 0x3c, 0x3a, 0x5f, 0xc8, 0xa1, - 0xfb, 0x14, 0xda, 0x81, 0x51, 0x96, 0xb7, 0x43, 0x44, 0x25, 0x3d, 0x67, 0xd8, 0x57, 0xb3, 0x19, - 0xfb, 0x6a, 0x52, 0x23, 0xd5, 0xac, 0xac, 0x27, 0x60, 0x58, 0x44, 0xc6, 0x64, 0x63, 0x64, 0x05, - 0x2d, 0x96, 0x78, 0xfb, 0x97, 0xcb, 0x60, 0xe4, 0x09, 0x41, 0xbf, 0x67, 0xc1, 0x5c, 0xc4, 0x6f, - 0x05, 0xb9, 0xb5, 0x76, 0xe4, 0x05, 0x9b, 0x8d, 0xe6, 0x16, 0x71, 0xdb, 0xbe, 0x17, 0x6c, 0xae, - 0x6e, 0x06, 0xa1, 0x02, 0x2f, 0xdf, 0x25, 0xcd, 0x36, 0xf3, 0x83, 0xf7, 0x48, 0x4a, 0xa2, 0x4e, - 0x9e, 0x2f, 0x1d, 0xec, 0xcf, 0xce, 0xe1, 0x23, 0xf1, 0xc6, 0x47, 0x6c, 0x0b, 0xfa, 0x03, 0x0b, - 0xe6, 0x79, 0xfa, 0x8c, 0xfe, 0xdb, 0xdf, 0xc5, 0x1a, 0xad, 0x4b, 0x56, 0x29, 0x93, 0x35, 0x12, - 0xed, 0x2c, 0xbe, 0x28, 0x3a, 0x74, 0xbe, 0x7e, 0xb4, 0xba, 0xf0, 0x51, 0x1b, 0x67, 0xff, 0xf3, - 0x32, 0x8c, 0xd3, 0x5e, 0x4c, 0x6f, 0xc2, 0xbf, 0x60, 0x4c, 0x89, 0x47, 0x32, 0x53, 0x62, 0xda, - 0x20, 0x3e, 0x9e, 0x4b, 0xf0, 0x31, 0x4c, 0xfb, 0x4e, 0x9c, 0x5c, 0x21, 0x4e, 0x94, 0xac, 0x13, - 0x87, 0x1d, 0xf5, 0x8a, 0x69, 0x7e, 0x94, 0xd3, 0x63, 0xe5, 0xfe, 0xba, 0x96, 0x65, 0x86, 0x3b, - 0xf9, 0xa3, 0x5d, 0x40, 0xec, 0x58, 0x39, 0x72, 0x82, 0x98, 0x7f, 0x8b, 0x27, 0x7c, 0xe4, 0x47, - 0xab, 0x75, 0x46, 0xd4, 0x8a, 0xae, 0x75, 0x70, 0xc3, 0x39, 0x35, 0x68, 0xe1, 0x02, 0x83, 0xfd, - 0x86, 0x0b, 0x0c, 0xf5, 0x08, 0x44, 0xdf, 0x81, 0x29, 0x31, 0x2a, 0x1b, 0xde, 0xa6, 0xd8, 0xa4, - 0xdf, 0xcc, 0x84, 0x13, 0x59, 0xfd, 0x07, 0x3e, 0xf4, 0x88, 0x25, 0xb2, 0x7f, 0x06, 0x4e, 0xd1, - 0xea, 0xcc, 0xb0, 0xe9, 0x18, 0x11, 0x98, 0xdc, 0x6e, 0xaf, 0x13, 0x9f, 0x24, 0x12, 0x26, 0x2a, - 0xcd, 0x55, 0xfb, 0xcd, 0xd2, 0xa9, 0x6e, 0x79, 0xd5, 0x64, 0x81, 0xb3, 0x3c, 0xed, 0x5f, 0xb1, - 0x80, 0x05, 0x26, 0x9e, 0xc0, 0xf6, 0xf7, 0x69, 0x73, 0xfb, 0xab, 0x16, 0x49, 0xa0, 0x82, 0x9d, - 0xef, 0x79, 0x3e, 0x2c, 0xf5, 0x28, 0xbc, 0xbb, 0x27, 0x75, 0xff, 0xde, 0x1a, 0xd7, 0xff, 0xb2, - 0xf8, 0x82, 0x54, 0x97, 0x24, 0xd1, 0xe7, 0x61, 0xa4, 0xe9, 0xb4, 0x9c, 0x26, 0x4f, 0xd0, 0x54, - 0xe8, 0xfd, 0x31, 0x0a, 0xcd, 0x2d, 0x89, 0x12, 0xdc, 0x9b, 0xf1, 0x63, 0xf2, 0x2b, 0x25, 0xb8, - 0xa7, 0x07, 0x43, 0x55, 0x39, 0xb3, 0x0d, 0xe3, 0x06, 0xb3, 0xfb, 0x6a, 0xfa, 0x7e, 0x9e, 0x6f, - 0x17, 0xca, 0x62, 0xd9, 0x81, 0xe9, 0x40, 0xfb, 0x4f, 0x85, 0xa3, 0x54, 0xa7, 0x3f, 0xde, 0x6b, - 0x43, 0x60, 0x92, 0x54, 0x0b, 0xbc, 0xcc, 0xb0, 0xc1, 0x9d, 0x9c, 0xed, 0xbf, 0x65, 0xc1, 0x03, - 0x3a, 0xa1, 0x76, 0x7f, 0xb5, 0x97, 0x3f, 0xb9, 0x06, 0x23, 0x61, 0x8b, 0x44, 0x4e, 0x6a, 0x93, - 0x5d, 0x94, 0x9d, 0x7e, 0x53, 0xc0, 0x0f, 0xf7, 0x67, 0x4f, 0xeb, 0xdc, 0x25, 0x1c, 0xab, 0x92, - 0xc8, 0x86, 0x21, 0xd6, 0x19, 0xb1, 0xb8, 0x5b, 0xcc, 0x92, 0x18, 0xb1, 0xe3, 0xae, 0x18, 0x0b, - 0x8c, 0xfd, 0xb3, 0x16, 0x9f, 0x58, 0x7a, 0xd3, 0xd1, 0x7b, 0x30, 0xb5, 0x43, 0xcd, 0xb7, 0xe5, - 0xbb, 0xad, 0x88, 0xbb, 0xd1, 0x65, 0x3f, 0x3d, 0xd5, 0xab, 0x9f, 0xb4, 0x8f, 0x5c, 0xac, 0x8a, - 0x36, 0x4f, 0x5d, 0xcf, 0x30, 0xc3, 0x1d, 0xec, 0xed, 0x3f, 0x2b, 0xf1, 0x95, 0xc8, 0xb4, 0xba, - 0x27, 0x60, 0xb8, 0x15, 0xba, 0x4b, 0xab, 0x35, 0x2c, 0x7a, 0x48, 0x89, 0xab, 0x3a, 0x07, 0x63, - 0x89, 0x47, 0x97, 0x00, 0xc8, 0xdd, 0x84, 0x44, 0x81, 0xe3, 0xab, 0xc3, 0x78, 0xa5, 0x3c, 0x2d, - 0x2b, 0x0c, 0xd6, 0xa8, 0x68, 0x99, 0x56, 0x14, 0xee, 0x7a, 0x2e, 0xbb, 0xdc, 0x51, 0x36, 0xcb, - 0xd4, 0x15, 0x06, 0x6b, 0x54, 0xd4, 0x54, 0x6e, 0x07, 0x31, 0xdf, 0x00, 0x9d, 0x75, 0x91, 0x40, - 0x67, 0x24, 0x35, 0x95, 0x6f, 0xe9, 0x48, 0x6c, 0xd2, 0xa2, 0x05, 0x18, 0x4a, 0x1c, 0x76, 0xc4, - 0x3c, 0x58, 0x1c, 0xb2, 0xb3, 0x46, 0x29, 0xf4, 0x3c, 0x45, 0xb4, 0x00, 0x16, 0x05, 0xd1, 0x5b, - 0x52, 0x04, 0x73, 0x91, 0x2c, 0x42, 0xaf, 0x0a, 0xa7, 0xad, 0x2e, 0xbe, 0x75, 0x19, 0x2c, 0x42, - 0xba, 0x0c, 0x5e, 0xf6, 0x17, 0x2b, 0x00, 0xa9, 0xb6, 0x87, 0xde, 0xef, 0x10, 0x11, 0x4f, 0x77, - 0xd7, 0x0f, 0x8f, 0x4f, 0x3e, 0xa0, 0x2f, 0x59, 0x30, 0xea, 0xf8, 0x7e, 0xd8, 0x74, 0x12, 0xd6, - 0xcb, 0xa5, 0xee, 0x22, 0x4a, 0xd4, 0xbf, 0x90, 0x96, 0xe0, 0x4d, 0x78, 0x4e, 0x9e, 0x1e, 0x6b, - 0x98, 0x9e, 0xad, 0xd0, 0x2b, 0x46, 0x3f, 0x26, 0x8d, 0x00, 0x3e, 0x3d, 0x66, 0xb2, 0x46, 0x40, - 0x85, 0x49, 0x63, 0x4d, 0xff, 0x47, 0xb7, 0x8c, 0xbc, 0x35, 0x03, 0xc5, 0x57, 0x74, 0x0d, 0xa5, - 0xa7, 0x57, 0xca, 0x1a, 0x54, 0xd7, 0x43, 0xd0, 0x07, 0x8b, 0xef, 0xb1, 0x6b, 0xda, 0x75, 0x8f, - 0xf0, 0xf3, 0x77, 0x61, 0xd2, 0x35, 0xb7, 0x5b, 0x31, 0x9b, 0x1e, 0x2f, 0xe2, 0x9b, 0xd9, 0x9d, - 0xd3, 0x0d, 0x36, 0x83, 0xc0, 0x59, 0xc6, 0xa8, 0xce, 0x2f, 0x03, 0xac, 0x06, 0x1b, 0xa1, 0x08, - 0xe1, 0xb3, 0x0b, 0xc7, 0x72, 0x2f, 0x4e, 0xc8, 0x0e, 0xa5, 0x4c, 0xf7, 0xd1, 0x1b, 0xa2, 0x2c, - 0x56, 0x5c, 0xd0, 0x6b, 0x30, 0xc4, 0x6e, 0x69, 0xc5, 0xd5, 0x91, 0x62, 0x3f, 0xa0, 0x79, 0xc1, - 0x38, 0x5d, 0x54, 0xec, 0x6f, 0x8c, 0x05, 0x07, 0x74, 0x45, 0xa6, 0x09, 0x88, 0x57, 0x83, 0x5b, - 0x31, 0x61, 0x69, 0x02, 0x2a, 0x8b, 0x1f, 0x4f, 0x33, 0x00, 0x70, 0x78, 0x6e, 0x6e, 0x3e, 0xa3, - 0x24, 0xd5, 0x57, 0xc4, 0x7f, 0x99, 0xf2, 0xaf, 0x0a, 0xc5, 0xcd, 0x33, 0xd3, 0x02, 0xa6, 0xdd, - 0x79, 0xdb, 0x64, 0x81, 0xb3, 0x3c, 0x4f, 0x74, 0xfb, 0x9c, 0x09, 0x60, 0x2a, 0xbb, 0xb0, 0xee, - 0xeb, 0x76, 0xfd, 0xfd, 0x01, 0x98, 0x30, 0x27, 0x02, 0x9a, 0x87, 0x8a, 0x60, 0xa2, 0x92, 0x7c, - 0xa9, 0xb9, 0x7d, 0x5d, 0x22, 0x70, 0x4a, 0xc3, 0x92, 0x9c, 0xb1, 0xe2, 0x5a, 0x6c, 0x56, 0x9a, - 0xe4, 0x4c, 0x61, 0xb0, 0x46, 0x45, 0x95, 0xe8, 0xf5, 0x30, 0x4c, 0xd4, 0x56, 0xa0, 0x66, 0xcb, - 0x22, 0x83, 0x62, 0x81, 0xa5, 0x5b, 0xc0, 0x36, 0x89, 0x02, 0xe2, 0x9b, 0x9e, 0x4c, 0xb5, 0x05, - 0x5c, 0xd5, 0x91, 0xd8, 0xa4, 0xa5, 0x5b, 0x5a, 0x18, 0xb3, 0xe9, 0x27, 0x54, 0xf5, 0x34, 0xd6, - 0xad, 0xc1, 0x6f, 0x29, 0x4a, 0x3c, 0x7a, 0x13, 0x1e, 0x50, 0x97, 0x0a, 0x31, 0xf7, 0x0c, 0xcb, - 0x1a, 0x87, 0x0c, 0xcb, 0xfa, 0x81, 0xa5, 0x7c, 0x32, 0x5c, 0x54, 0x1e, 0xbd, 0x0a, 0x13, 0x42, - 0x05, 0x96, 0x1c, 0x87, 0xcd, 0x60, 0x85, 0xab, 0x06, 0x16, 0x67, 0xa8, 0x51, 0x0d, 0xa6, 0x28, - 0x84, 0x69, 0xa1, 0x92, 0x03, 0xbf, 0x1c, 0xa9, 0xf6, 0xfa, 0xab, 0x19, 0x3c, 0xee, 0x28, 0x81, - 0x16, 0x60, 0x92, 0xeb, 0x28, 0xd4, 0xa6, 0x64, 0xe3, 0x20, 0x22, 0x6b, 0xd5, 0x42, 0xb8, 0x69, - 0xa2, 0x71, 0x96, 0x1e, 0xbd, 0x04, 0x63, 0x4e, 0xd4, 0xdc, 0xf2, 0x12, 0xd2, 0x4c, 0xda, 0x11, - 0x4f, 0xc2, 0xa1, 0x45, 0x7b, 0x2c, 0x68, 0x38, 0x6c, 0x50, 0xda, 0xef, 0xc3, 0xa9, 0x9c, 0xa0, - 0x7c, 0x3a, 0x71, 0x9c, 0x96, 0x27, 0xbf, 0x29, 0x13, 0xb5, 0xb6, 0x50, 0x5f, 0x95, 0x5f, 0xa3, - 0x51, 0xd1, 0xd9, 0xc9, 0x5c, 0xe2, 0x5a, 0x5e, 0x4e, 0x35, 0x3b, 0x57, 0x24, 0x02, 0xa7, 0x34, - 0xf6, 0xb7, 0x01, 0x34, 0x87, 0x4e, 0x1f, 0x31, 0x4b, 0x2f, 0xc1, 0x98, 0x4c, 0x26, 0xab, 0xa5, - 0x6e, 0x54, 0x9f, 0x79, 0x59, 0xc3, 0x61, 0x83, 0x92, 0xb6, 0x2d, 0x90, 0x6e, 0xaa, 0x6c, 0x8c, - 0x9c, 0xf2, 0x5f, 0xe1, 0x94, 0x06, 0x3d, 0x0d, 0x23, 0x31, 0xf1, 0x37, 0xae, 0x79, 0xc1, 0xb6, - 0x98, 0xd8, 0x4a, 0x0a, 0x37, 0x04, 0x1c, 0x2b, 0x0a, 0xb4, 0x08, 0xe5, 0xb6, 0xe7, 0x8a, 0xa9, - 0x2c, 0x37, 0xfc, 0xf2, 0xad, 0xd5, 0xda, 0xe1, 0xfe, 0xec, 0x23, 0x45, 0x39, 0x72, 0xa9, 0x69, - 0x1f, 0xcf, 0xd1, 0xe5, 0x47, 0x0b, 0xe7, 0x9d, 0x0d, 0x0c, 0x1d, 0xf1, 0x6c, 0xe0, 0x12, 0x80, - 0xf8, 0x6a, 0x39, 0x97, 0xcb, 0xe9, 0xa8, 0x5d, 0x56, 0x18, 0xac, 0x51, 0xa1, 0x18, 0xa6, 0x9b, - 0x11, 0x71, 0xa4, 0x0d, 0xcd, 0xc3, 0xcb, 0x47, 0xee, 0xdd, 0x41, 0xb0, 0x94, 0x65, 0x86, 0x3b, - 0xf9, 0xa3, 0x10, 0xa6, 0x5d, 0x71, 0x87, 0x35, 0xad, 0xb4, 0x72, 0xf4, 0x98, 0x76, 0x16, 0x90, - 0x93, 0x65, 0x84, 0x3b, 0x79, 0xa3, 0x77, 0x60, 0x46, 0x02, 0x3b, 0xaf, 0x0d, 0xb3, 0xe5, 0x52, - 0x5e, 0x3c, 0x7f, 0xb0, 0x3f, 0x3b, 0x53, 0x2b, 0xa4, 0xc2, 0x5d, 0x38, 0x20, 0x0c, 0x43, 0xec, - 0x2c, 0x29, 0xae, 0x8e, 0xb2, 0x7d, 0xee, 0xc9, 0x62, 0x67, 0x00, 0x9d, 0xeb, 0x73, 0xec, 0x1c, - 0x4a, 0x84, 0xf9, 0xa6, 0xc7, 0x72, 0x0c, 0x88, 0x05, 0x27, 0xb4, 0x01, 0xa3, 0x4e, 0x10, 0x84, - 0x89, 0xc3, 0x55, 0xa8, 0xb1, 0x62, 0xdd, 0x4f, 0x63, 0xbc, 0x90, 0x96, 0xe0, 0xdc, 0x55, 0xe4, - 0xa0, 0x86, 0xc1, 0x3a, 0x63, 0x74, 0x07, 0x26, 0xc3, 0x3b, 0x54, 0x38, 0x4a, 0x2f, 0x45, 0x5c, - 0x1d, 0x67, 0x75, 0x3d, 0xdf, 0xa7, 0x9f, 0xd6, 0x28, 0xac, 0x49, 0x2d, 0x93, 0x29, 0xce, 0xd6, - 0x82, 0xe6, 0x0c, 0x6f, 0xf5, 0x44, 0x1a, 0xcf, 0x9e, 0x7a, 0xab, 0x75, 0xe7, 0x34, 0xbb, 0x86, - 0xce, 0xc3, 0x56, 0xd9, 0xea, 0x9f, 0xcc, 0x5c, 0x43, 0x4f, 0x51, 0x58, 0xa7, 0x43, 0x5b, 0x30, - 0x96, 0x1e, 0x59, 0x45, 0x31, 0xcb, 0x52, 0x33, 0x7a, 0xe9, 0x52, 0x7f, 0x1f, 0xb7, 0xaa, 0x95, - 0xe4, 0x96, 0x83, 0x0e, 0xc1, 0x06, 0xe7, 0x99, 0x1f, 0x87, 0x51, 0x6d, 0x60, 0x8f, 0x12, 0x95, - 0x3d, 0xf3, 0x2a, 0x4c, 0x65, 0x87, 0xee, 0x48, 0x51, 0xdd, 0xff, 0xa3, 0x04, 0x93, 0x39, 0x27, - 0x57, 0x2c, 0xcf, 0x6e, 0x46, 0xa0, 0xa6, 0x69, 0x75, 0x4d, 0xb1, 0x58, 0xea, 0x43, 0x2c, 0x4a, - 0x19, 0x5d, 0x2e, 0x94, 0xd1, 0x42, 0x14, 0x0e, 0x7c, 0x10, 0x51, 0x68, 0xee, 0x3e, 0x83, 0x7d, - 0xed, 0x3e, 0xc7, 0x20, 0x3e, 0x8d, 0x0d, 0x6c, 0xb8, 0x8f, 0x0d, 0xec, 0x17, 0x4a, 0x30, 0x95, - 0x46, 0xb0, 0x8b, 0xac, 0xd6, 0xf7, 0xff, 0xbc, 0xe3, 0x35, 0xe3, 0xbc, 0x23, 0x3f, 0x6b, 0x75, - 0xa6, 0x55, 0x85, 0x67, 0x1f, 0x38, 0x73, 0xf6, 0xf1, 0x64, 0x5f, 0xdc, 0xba, 0x9f, 0x83, 0xfc, - 0xed, 0x12, 0x9c, 0xc9, 0x16, 0x59, 0xf2, 0x1d, 0x6f, 0xe7, 0x04, 0xfa, 0xe6, 0xa6, 0xd1, 0x37, - 0xcf, 0xf4, 0xf3, 0x35, 0xac, 0x69, 0x85, 0x1d, 0xf4, 0x46, 0xa6, 0x83, 0xe6, 0xfb, 0x67, 0xd9, - 0xbd, 0x97, 0xbe, 0x6d, 0xc1, 0xb9, 0xdc, 0x72, 0x27, 0xe0, 0x7d, 0xbd, 0x61, 0x7a, 0x5f, 0x9f, - 0xe8, 0xfb, 0x9b, 0x0a, 0xdc, 0xb1, 0x5f, 0x2d, 0x17, 0x7c, 0x0b, 0xf3, 0x5f, 0xdd, 0x84, 0x51, - 0xa7, 0xd9, 0x24, 0x71, 0x7c, 0x3d, 0x74, 0x55, 0x5a, 0xab, 0x67, 0xd8, 0x9e, 0x94, 0x82, 0x0f, - 0xf7, 0x67, 0x67, 0xb2, 0x2c, 0x52, 0x34, 0xd6, 0x39, 0x98, 0xa9, 0xf2, 0x4a, 0xc7, 0x9a, 0x2a, - 0xef, 0x12, 0xc0, 0xae, 0xb2, 0x6a, 0xb3, 0xce, 0x30, 0xcd, 0xde, 0xd5, 0xa8, 0xd0, 0x4f, 0x31, - 0x5d, 0x91, 0x87, 0x8c, 0xf0, 0x43, 0x8e, 0xe7, 0xfa, 0x1c, 0x2b, 0x3d, 0xfc, 0x84, 0x5f, 0x84, - 0x55, 0x8e, 0x43, 0xc5, 0x12, 0x7d, 0x06, 0xa6, 0x62, 0x9e, 0x6b, 0x61, 0xc9, 0x77, 0x62, 0x76, - 0xfd, 0x42, 0xc8, 0x44, 0x76, 0xbb, 0xb5, 0x91, 0xc1, 0xe1, 0x0e, 0x6a, 0xfb, 0xef, 0x97, 0xe1, - 0xc1, 0x2e, 0x53, 0x14, 0x2d, 0x98, 0x47, 0xbc, 0x4f, 0x65, 0xbd, 0x3b, 0x33, 0xb9, 0x85, 0x0d, - 0x77, 0x4f, 0x66, 0x8c, 0x4b, 0x1f, 0x78, 0x8c, 0xbf, 0x6c, 0x69, 0x7e, 0x37, 0x1e, 0x08, 0xfa, - 0xe9, 0x23, 0x2e, 0xbd, 0x1f, 0x56, 0x47, 0xfd, 0x17, 0x2c, 0x78, 0x24, 0xf7, 0xb3, 0x8c, 0x50, - 0x91, 0x79, 0xa8, 0x34, 0x29, 0x50, 0xbb, 0x22, 0x95, 0x5e, 0x54, 0x94, 0x08, 0x9c, 0xd2, 0x18, - 0x11, 0x21, 0xa5, 0x9e, 0x11, 0x21, 0xff, 0xd4, 0x82, 0xd3, 0xd9, 0x46, 0x9c, 0x80, 0x64, 0x5a, - 0x35, 0x25, 0xd3, 0xc7, 0xfb, 0x19, 0xf2, 0x02, 0xa1, 0xf4, 0x6f, 0x27, 0xe0, 0x6c, 0xc7, 0xce, - 0xc5, 0xfb, 0x6e, 0x17, 0xa6, 0x37, 0x99, 0x0a, 0xaf, 0x5d, 0x3e, 0x13, 0x1f, 0x93, 0x7b, 0x4f, - 0xaf, 0xeb, 0x4d, 0x35, 0x6e, 0x86, 0x74, 0x90, 0xe0, 0xce, 0x2a, 0xd0, 0x17, 0x2c, 0x38, 0xed, - 0xdc, 0x89, 0x3b, 0x9e, 0x3e, 0x11, 0x73, 0xe6, 0xf9, 0x5c, 0xef, 0x58, 0x8f, 0xa7, 0x52, 0xd8, - 0x05, 0x91, 0xd3, 0x79, 0x54, 0x38, 0xb7, 0x2e, 0x84, 0x45, 0x66, 0x3f, 0xaa, 0xe5, 0x74, 0xb9, - 0x1e, 0x99, 0x77, 0x79, 0x85, 0xcb, 0x28, 0x89, 0xc1, 0x8a, 0x0f, 0xba, 0x0d, 0x95, 0x4d, 0x79, - 0xa3, 0x4c, 0xc8, 0xc0, 0xdc, 0x4d, 0x25, 0xf7, 0xda, 0x19, 0x8f, 0xd8, 0x57, 0x28, 0x9c, 0xb2, - 0x42, 0xaf, 0x42, 0x39, 0xd8, 0x88, 0xc5, 0x55, 0xed, 0xfc, 0xf8, 0x1e, 0x33, 0x82, 0x8a, 0xdf, - 0x73, 0xbd, 0xb1, 0xd2, 0xc0, 0xb4, 0x20, 0x2d, 0x1f, 0xad, 0xbb, 0xc2, 0xa1, 0x9b, 0x5b, 0x1e, - 0x2f, 0xd6, 0x3a, 0xcb, 0xe3, 0xc5, 0x1a, 0xa6, 0x05, 0xd1, 0x0a, 0x0c, 0xb2, 0x0b, 0x2a, 0xc2, - 0x5b, 0x9b, 0x7b, 0x4f, 0xbf, 0xe3, 0xf2, 0x0d, 0xbf, 0xf8, 0xca, 0xc0, 0x98, 0x17, 0x47, 0xaf, - 0xc1, 0x50, 0x93, 0xe5, 0xec, 0x17, 0xa6, 0x75, 0x7e, 0xee, 0x89, 0x8e, 0xac, 0xfe, 0xfc, 0x8c, - 0x8a, 0xc3, 0xb1, 0xe0, 0xc0, 0x78, 0x91, 0xd6, 0xd6, 0x46, 0x2c, 0x2c, 0xe6, 0x7c, 0x5e, 0x1d, - 0xef, 0x2b, 0x08, 0x5e, 0x0c, 0x8e, 0x05, 0x07, 0xf4, 0x29, 0x28, 0x6d, 0x34, 0xc5, 0x0d, 0x95, - 0x5c, 0xdf, 0xac, 0x79, 0x05, 0x79, 0x71, 0xe8, 0x60, 0x7f, 0xb6, 0xb4, 0xb2, 0x84, 0x4b, 0x1b, - 0x4d, 0x74, 0x03, 0x86, 0x37, 0xf8, 0x3d, 0x52, 0x91, 0x9f, 0xf5, 0xf1, 0xfc, 0x2b, 0xae, 0x1d, - 0x57, 0x4d, 0xf9, 0xcd, 0x0a, 0x81, 0xc0, 0x92, 0x09, 0x5a, 0x03, 0xd8, 0x50, 0xf7, 0x61, 0x45, - 0x82, 0xd6, 0x8f, 0xf7, 0x73, 0x6b, 0x56, 0x18, 0x8d, 0x0a, 0x8a, 0x35, 0x3e, 0x74, 0x66, 0x3a, - 0xf2, 0xe1, 0x10, 0x96, 0x9c, 0xb5, 0x60, 0x66, 0xe6, 0xbe, 0x2e, 0xc2, 0x67, 0xa6, 0x42, 0xe1, - 0x94, 0x15, 0xda, 0x86, 0xf1, 0xdd, 0xb8, 0xb5, 0x45, 0xe4, 0x62, 0x64, 0x79, 0x5a, 0x4d, 0xb3, - 0x32, 0x4d, 0xaa, 0x2b, 0x08, 0xbd, 0x28, 0x69, 0x3b, 0x7e, 0x87, 0xfc, 0x60, 0x97, 0x6f, 0x6e, - 0xeb, 0xcc, 0xb0, 0xc9, 0x9b, 0x76, 0xf5, 0x7b, 0xed, 0x70, 0x7d, 0x2f, 0x21, 0x22, 0x7b, 0x6b, - 0x6e, 0x57, 0xbf, 0xce, 0x49, 0x3a, 0xbb, 0x5a, 0x20, 0xb0, 0x64, 0xa2, 0x3a, 0x85, 0xc9, 0xbd, - 0xa9, 0x1e, 0x9d, 0xd2, 0xd1, 0xde, 0xb4, 0x53, 0x98, 0x9c, 0x4b, 0x59, 0x31, 0xf9, 0xd6, 0xda, - 0x0a, 0x93, 0x30, 0xc8, 0xc8, 0xd6, 0xe9, 0x62, 0xf9, 0x56, 0xcf, 0xa1, 0xef, 0x94, 0x6f, 0x79, - 0x54, 0x38, 0xb7, 0x2e, 0xe4, 0xc2, 0x44, 0x2b, 0x8c, 0x92, 0x3b, 0x61, 0x24, 0xe7, 0x12, 0xea, - 0x62, 0x28, 0x19, 0x94, 0xa2, 0x46, 0x16, 0x4b, 0x6b, 0x62, 0x70, 0x86, 0x27, 0x1d, 0x92, 0xb8, - 0xe9, 0xf8, 0x64, 0xf5, 0x66, 0xf5, 0x54, 0xf1, 0x90, 0x34, 0x38, 0x49, 0xe7, 0x90, 0x08, 0x04, - 0x96, 0x4c, 0xa8, 0xa4, 0x61, 0x89, 0xc0, 0x59, 0xba, 0xd9, 0x02, 0x49, 0xd3, 0x11, 0x65, 0xca, - 0x25, 0x0d, 0x03, 0x63, 0x5e, 0x1c, 0x7d, 0x0e, 0x2a, 0x42, 0xff, 0x0b, 0xe3, 0xea, 0x99, 0x0e, - 0x6d, 0x34, 0x6d, 0x19, 0x27, 0xba, 0xd9, 0xc8, 0xdf, 0x22, 0xc5, 0x2d, 0x34, 0x49, 0x84, 0x53, - 0xa6, 0xf6, 0x17, 0x87, 0x3a, 0x35, 0x03, 0xa6, 0xe7, 0x7f, 0xd1, 0xea, 0x38, 0x2a, 0xfd, 0x64, - 0xbf, 0xc6, 0xe9, 0x31, 0x1e, 0x9a, 0x7e, 0xc1, 0x82, 0xb3, 0xad, 0xdc, 0x8f, 0x12, 0xdb, 0x6c, - 0x7f, 0x36, 0x2e, 0xef, 0x06, 0x95, 0xc8, 0x39, 0x1f, 0x8f, 0x0b, 0x6a, 0xca, 0xea, 0xc3, 0xe5, - 0x0f, 0xac, 0x0f, 0x5f, 0x87, 0x11, 0xa6, 0xca, 0xa5, 0x49, 0x63, 0xfa, 0x0a, 0x38, 0x62, 0x1b, - 0xf6, 0x92, 0x28, 0x88, 0x15, 0x0b, 0xf4, 0x73, 0x16, 0x3c, 0x9c, 0x6d, 0x3a, 0x26, 0x0c, 0x2d, - 0x92, 0x10, 0x72, 0x13, 0x63, 0x45, 0x7c, 0xff, 0xc3, 0xf5, 0x6e, 0xc4, 0x87, 0xbd, 0x08, 0x70, - 0xf7, 0xca, 0x50, 0x2d, 0xc7, 0xc6, 0x19, 0x32, 0x4f, 0x52, 0x7a, 0xdb, 0x39, 0x27, 0xab, 0xa5, - 0x7f, 0xcd, 0xca, 0x51, 0x2f, 0xb9, 0x3d, 0xf5, 0x8a, 0x69, 0x4f, 0x3d, 0x96, 0xb5, 0xa7, 0x3a, - 0xbc, 0x23, 0x86, 0x29, 0xd5, 0x7f, 0x9a, 0xd4, 0x7e, 0xf3, 0xe3, 0xd8, 0x3e, 0x5c, 0xe8, 0x25, - 0x66, 0x59, 0xf8, 0x94, 0xab, 0xce, 0x15, 0xd3, 0xf0, 0x29, 0x77, 0xb5, 0x86, 0x19, 0xa6, 0xdf, - 0x4c, 0x0b, 0xf6, 0x7f, 0xb1, 0xa0, 0x5c, 0x0f, 0xdd, 0x13, 0xf0, 0xf6, 0x7c, 0xda, 0xf0, 0xf6, - 0x3c, 0x58, 0xf0, 0x58, 0x5d, 0xa1, 0x6f, 0x67, 0x39, 0xe3, 0xdb, 0x79, 0xb8, 0x88, 0x41, 0x77, - 0x4f, 0xce, 0xdf, 0x29, 0x83, 0xfe, 0xb4, 0x1e, 0xfa, 0x17, 0xf7, 0x12, 0x87, 0x5b, 0xee, 0xf6, - 0xda, 0x9e, 0xe0, 0xcc, 0xa2, 0xae, 0xe4, 0x15, 0xbf, 0x1f, 0xb2, 0x70, 0xdc, 0x37, 0x88, 0xb7, - 0xb9, 0x95, 0x10, 0x37, 0xfb, 0x39, 0x27, 0x17, 0x8e, 0xfb, 0x1f, 0x2d, 0x98, 0xcc, 0xd4, 0x8e, - 0xfc, 0xbc, 0xfb, 0x42, 0xf7, 0xe8, 0xbf, 0x99, 0xee, 0x79, 0xc1, 0x68, 0x0e, 0x40, 0xb9, 0xd2, - 0xa5, 0x8f, 0x84, 0xe9, 0xae, 0xca, 0xd7, 0x1e, 0x63, 0x8d, 0x02, 0xbd, 0x00, 0xa3, 0x49, 0xd8, - 0x0a, 0xfd, 0x70, 0x73, 0xef, 0x2a, 0x91, 0xb9, 0x3d, 0xd4, 0x81, 0xc7, 0x5a, 0x8a, 0xc2, 0x3a, - 0x9d, 0xfd, 0xab, 0x65, 0xc8, 0x3e, 0xc7, 0xf8, 0xff, 0xe6, 0xe4, 0x47, 0x73, 0x4e, 0x7e, 0xc7, - 0x82, 0x29, 0x5a, 0x3b, 0x8b, 0x68, 0x91, 0x81, 0xac, 0xea, 0x3d, 0x05, 0xab, 0xcb, 0x7b, 0x0a, - 0x8f, 0x51, 0xd9, 0xe5, 0x86, 0xed, 0x44, 0xf8, 0x72, 0x34, 0xe1, 0x44, 0xa1, 0x58, 0x60, 0x05, - 0x1d, 0x89, 0x22, 0x71, 0x0b, 0x48, 0xa7, 0x23, 0x51, 0x84, 0x05, 0x56, 0x3e, 0xb7, 0x30, 0x50, - 0xf0, 0xdc, 0x02, 0x4b, 0x8b, 0x25, 0xa2, 0x28, 0x84, 0x6a, 0xa0, 0xa5, 0xc5, 0x92, 0xe1, 0x15, - 0x29, 0x8d, 0xfd, 0xf5, 0x32, 0x8c, 0xd5, 0x43, 0x37, 0x8d, 0x7d, 0x7f, 0xde, 0x88, 0x7d, 0xbf, - 0x90, 0x89, 0x7d, 0x9f, 0xd2, 0x69, 0x8f, 0x27, 0xf4, 0x5d, 0x24, 0x4d, 0x63, 0x8f, 0x7f, 0xdc, - 0x63, 0xd8, 0xbb, 0x91, 0x34, 0x4d, 0x31, 0xc2, 0x26, 0xdf, 0x1f, 0xa5, 0x70, 0xf7, 0x3f, 0xb7, - 0x60, 0xa2, 0x1e, 0xba, 0x74, 0x82, 0xfe, 0x28, 0xcd, 0x46, 0x3d, 0xe9, 0xda, 0x50, 0x97, 0xa4, - 0x6b, 0x7f, 0xd7, 0x82, 0xe1, 0x7a, 0xe8, 0x9e, 0x80, 0x9f, 0xf3, 0x15, 0xd3, 0xcf, 0xf9, 0x40, - 0x81, 0x94, 0x2d, 0x70, 0x6d, 0xfe, 0x56, 0x19, 0xc6, 0x69, 0x3b, 0xc3, 0x4d, 0x39, 0x4a, 0x46, - 0x8f, 0x58, 0x7d, 0xf4, 0x08, 0x55, 0xe6, 0x42, 0xdf, 0x0f, 0xef, 0x64, 0x47, 0x6c, 0x85, 0x41, - 0xb1, 0xc0, 0xa2, 0xa7, 0x61, 0xa4, 0x15, 0x91, 0x5d, 0x2f, 0x6c, 0xc7, 0xd9, 0x7b, 0x84, 0x75, - 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x0f, 0x63, 0xb1, 0x17, 0x34, 0x89, 0x8c, 0xac, 0x18, 0x60, 0x91, - 0x15, 0x3c, 0x6f, 0xa5, 0x06, 0xc7, 0x06, 0x15, 0x7a, 0x03, 0x2a, 0xec, 0x3f, 0x5b, 0x37, 0x47, - 0x7f, 0x4d, 0x81, 0x9b, 0xaa, 0x92, 0x01, 0x4e, 0x79, 0xa1, 0x4b, 0x00, 0x89, 0x8c, 0x01, 0x89, - 0xc5, 0x35, 0x57, 0xa5, 0x51, 0xaa, 0xe8, 0x90, 0x18, 0x6b, 0x54, 0xe8, 0x29, 0xa8, 0x24, 0x8e, - 0xe7, 0x5f, 0xf3, 0x02, 0x12, 0x8b, 0x18, 0x1a, 0x91, 0x0b, 0x5a, 0x00, 0x71, 0x8a, 0xa7, 0x3b, - 0x3a, 0xbb, 0x44, 0xcd, 0xdf, 0x62, 0x19, 0x61, 0xd4, 0x6c, 0x47, 0xbf, 0xa6, 0xa0, 0x58, 0xa3, - 0xb0, 0x5f, 0x82, 0x33, 0xf5, 0xd0, 0xad, 0x87, 0x51, 0xb2, 0x12, 0x46, 0x77, 0x9c, 0xc8, 0x95, - 0xe3, 0x37, 0x2b, 0xd3, 0x12, 0xd3, 0x5d, 0x77, 0x90, 0xdb, 0xf5, 0x46, 0xc2, 0xe1, 0xe7, 0xd8, - 0x9e, 0x7e, 0xc4, 0x0b, 0x0f, 0xff, 0xba, 0x04, 0xa8, 0xce, 0xa2, 0x54, 0x8c, 0x07, 0x7b, 0xde, - 0x81, 0x89, 0x98, 0x5c, 0xf3, 0x82, 0xf6, 0x5d, 0xc1, 0xaa, 0xdb, 0x6d, 0x92, 0xc6, 0xb2, 0x4e, - 0xc9, 0x7d, 0x23, 0x26, 0x0c, 0x67, 0xb8, 0xd1, 0x2e, 0x8c, 0xda, 0xc1, 0x42, 0x7c, 0x2b, 0x26, - 0x91, 0x78, 0xa0, 0x86, 0x75, 0x21, 0x96, 0x40, 0x9c, 0xe2, 0xe9, 0x94, 0x61, 0x7f, 0x6e, 0x84, - 0x01, 0x0e, 0xc3, 0x44, 0x4e, 0x32, 0xf6, 0xc4, 0x81, 0x06, 0xc7, 0x06, 0x15, 0x5a, 0x01, 0x14, - 0xb7, 0x5b, 0x2d, 0x9f, 0x1d, 0xea, 0x39, 0xfe, 0xe5, 0x28, 0x6c, 0xb7, 0x78, 0x98, 0xb1, 0x78, - 0x1d, 0xa0, 0xd1, 0x81, 0xc5, 0x39, 0x25, 0xa8, 0x60, 0xd8, 0x88, 0xd9, 0x6f, 0x71, 0x8f, 0x9a, - 0xfb, 0x26, 0x1b, 0x0c, 0x84, 0x25, 0xce, 0xfe, 0x3c, 0xdb, 0xcc, 0xd8, 0xbb, 0x22, 0x49, 0x3b, - 0x22, 0x68, 0x07, 0xc6, 0x5b, 0x6c, 0xc3, 0x4a, 0xa2, 0xd0, 0xf7, 0x89, 0xd4, 0x1b, 0xef, 0x2d, - 0x62, 0x86, 0xbf, 0x33, 0xa0, 0xb3, 0xc3, 0x26, 0x77, 0xfb, 0x8b, 0x93, 0x4c, 0x2e, 0x35, 0xb8, - 0xd1, 0x32, 0x2c, 0xe2, 0x60, 0x85, 0x86, 0x36, 0x53, 0xfc, 0x8e, 0x57, 0x2a, 0xe9, 0x45, 0x2c, - 0x2d, 0x96, 0x65, 0xd1, 0xeb, 0x2c, 0x3e, 0x9b, 0x0b, 0x83, 0x5e, 0x2f, 0x08, 0x72, 0x2a, 0x23, - 0x36, 0x5b, 0x14, 0xc4, 0x1a, 0x13, 0x74, 0x0d, 0xc6, 0xc5, 0x33, 0x14, 0xc2, 0x85, 0x50, 0x36, - 0xcc, 0xdf, 0x71, 0xac, 0x23, 0x0f, 0xb3, 0x00, 0x6c, 0x16, 0x46, 0x9b, 0xf0, 0xb0, 0xf6, 0x68, - 0x52, 0x4e, 0xd4, 0x16, 0x97, 0x2d, 0x8f, 0x1c, 0xec, 0xcf, 0x3e, 0xbc, 0xd6, 0x8d, 0x10, 0x77, - 0xe7, 0x83, 0x6e, 0xc2, 0x19, 0xa7, 0x99, 0x78, 0xbb, 0xa4, 0x46, 0x1c, 0xd7, 0xf7, 0x02, 0x62, - 0x5e, 0xac, 0x3f, 0x77, 0xb0, 0x3f, 0x7b, 0x66, 0x21, 0x8f, 0x00, 0xe7, 0x97, 0x43, 0xaf, 0x40, - 0xc5, 0x0d, 0x62, 0xd1, 0x07, 0x43, 0xc6, 0x7b, 0x60, 0x95, 0xda, 0x8d, 0x86, 0xfa, 0xfe, 0xf4, - 0x0f, 0x4e, 0x0b, 0xa0, 0x4d, 0xfe, 0x6e, 0xbc, 0xb2, 0x48, 0x86, 0x3b, 0xb2, 0x25, 0x64, 0x6d, - 0x5b, 0xe3, 0xc6, 0x09, 0xf7, 0x9f, 0xa9, 0x98, 0x48, 0xe3, 0x32, 0x8a, 0xc1, 0x18, 0xbd, 0x06, - 0x28, 0x26, 0xd1, 0xae, 0xd7, 0x24, 0x0b, 0x4d, 0x96, 0xd8, 0x95, 0x79, 0x5d, 0x46, 0x8c, 0x00, - 0x7f, 0xd4, 0xe8, 0xa0, 0xc0, 0x39, 0xa5, 0xd0, 0x15, 0x2a, 0x51, 0x74, 0xa8, 0x08, 0x61, 0x95, - 0x6a, 0x5e, 0xb5, 0x46, 0x5a, 0x11, 0x69, 0x3a, 0x09, 0x71, 0x4d, 0x8e, 0x38, 0x53, 0x8e, 0xee, - 0x37, 0x2a, 0x5f, 0x3e, 0x98, 0x81, 0x97, 0x9d, 0x39, 0xf3, 0xa9, 0x85, 0xb4, 0x15, 0xc6, 0xc9, - 0x0d, 0x92, 0xdc, 0x09, 0xa3, 0x6d, 0x91, 0x0d, 0x2b, 0x4d, 0x96, 0x97, 0xa2, 0xb0, 0x4e, 0x47, - 0x35, 0x22, 0x76, 0x74, 0xb5, 0x5a, 0x63, 0xe7, 0x0c, 0x23, 0xe9, 0x3a, 0xb9, 0xc2, 0xc1, 0x58, - 0xe2, 0x25, 0xe9, 0x6a, 0x7d, 0x89, 0x9d, 0x1e, 0x64, 0x48, 0x57, 0xeb, 0x4b, 0x58, 0xe2, 0x11, - 0xe9, 0x7c, 0x6b, 0x6d, 0xa2, 0xf8, 0x84, 0xa6, 0x53, 0x2e, 0xf7, 0xf9, 0xdc, 0x5a, 0x00, 0x53, - 0xea, 0x95, 0x37, 0x9e, 0x26, 0x2c, 0xae, 0x4e, 0x16, 0x3f, 0x60, 0x9f, 0x9b, 0x63, 0x4c, 0x79, - 0xd5, 0x56, 0x33, 0x9c, 0x70, 0x07, 0x6f, 0x23, 0x61, 0xc3, 0x54, 0xcf, 0xf7, 0x0e, 0xe6, 0xa1, - 0x12, 0xb7, 0xd7, 0xdd, 0x70, 0xc7, 0xf1, 0x02, 0xe6, 0xf6, 0xd7, 0xdf, 0x56, 0x97, 0x08, 0x9c, - 0xd2, 0xa0, 0x15, 0x18, 0x71, 0x84, 0xf1, 0x25, 0x1c, 0xf5, 0xb9, 0x37, 0xb8, 0xa5, 0x81, 0xc6, - 0x3d, 0x9a, 0xf2, 0x1f, 0x56, 0x65, 0xd1, 0xcb, 0x30, 0x2e, 0x2e, 0x19, 0x89, 0xf8, 0xc0, 0x53, - 0x66, 0x3c, 0x7a, 0x43, 0x47, 0x62, 0x93, 0x16, 0xfd, 0x14, 0x4c, 0x50, 0x2e, 0xa9, 0x60, 0xab, - 0x9e, 0xee, 0x47, 0x22, 0x6a, 0x79, 0xac, 0xf5, 0xc2, 0x38, 0xc3, 0x0c, 0xb9, 0xf0, 0x90, 0xd3, - 0x4e, 0xc2, 0x1d, 0x3a, 0xc3, 0xcd, 0xf9, 0xbf, 0x16, 0x6e, 0x93, 0x80, 0xf9, 0xe9, 0x47, 0x16, - 0x2f, 0x1c, 0xec, 0xcf, 0x3e, 0xb4, 0xd0, 0x85, 0x0e, 0x77, 0xe5, 0x82, 0x6e, 0xc1, 0x68, 0x12, - 0xfa, 0x22, 0xb0, 0x37, 0xae, 0x9e, 0x2d, 0x4e, 0x38, 0xb3, 0xa6, 0xc8, 0x74, 0x77, 0x82, 0x2a, - 0x8a, 0x75, 0x3e, 0x68, 0x8d, 0xaf, 0x31, 0x96, 0x1e, 0x91, 0xc4, 0xd5, 0x07, 0x8a, 0x3b, 0x46, - 0x65, 0x51, 0x34, 0x97, 0xa0, 0x28, 0x89, 0x75, 0x36, 0xe8, 0x32, 0x4c, 0xb7, 0x22, 0x2f, 0x64, - 0x13, 0x5b, 0xb9, 0x7c, 0xab, 0x46, 0x2a, 0xb2, 0xe9, 0x7a, 0x96, 0x00, 0x77, 0x96, 0x41, 0x17, - 0xa9, 0x82, 0xca, 0x81, 0xd5, 0x73, 0xfc, 0x1d, 0x0c, 0xae, 0x9c, 0x72, 0x18, 0x56, 0xd8, 0x99, - 0x9f, 0x80, 0xe9, 0x0e, 0x49, 0x79, 0xa4, 0x20, 0xcb, 0x5f, 0x1f, 0x84, 0x8a, 0x72, 0x07, 0xa2, - 0x79, 0xd3, 0xcb, 0x7b, 0x2e, 0xeb, 0xe5, 0x1d, 0xa1, 0xfa, 0x9a, 0xee, 0xd8, 0x5d, 0xcb, 0x79, - 0xca, 0xfb, 0x42, 0x81, 0x68, 0xe8, 0xff, 0x46, 0xd4, 0x11, 0x9e, 0x39, 0x4f, 0x0d, 0xc6, 0x81, - 0xae, 0x06, 0x63, 0x9f, 0xcf, 0xea, 0x51, 0xd3, 0xb0, 0x15, 0xba, 0xab, 0xf5, 0xec, 0x3b, 0x53, - 0x75, 0x0a, 0xc4, 0x1c, 0xc7, 0x94, 0x7b, 0xba, 0xad, 0x33, 0xe5, 0x7e, 0xf8, 0x1e, 0x95, 0x7b, - 0xc9, 0x00, 0xa7, 0xbc, 0x90, 0x0f, 0xd3, 0x4d, 0xf3, 0x89, 0x30, 0x75, 0x0b, 0xea, 0xd1, 0x9e, - 0x8f, 0x75, 0xb5, 0xb5, 0x77, 0x43, 0x96, 0xb2, 0x5c, 0x70, 0x27, 0x63, 0xf4, 0x32, 0x8c, 0xbc, - 0x17, 0xc6, 0x6c, 0xda, 0x89, 0xbd, 0x4d, 0xde, 0x3b, 0x19, 0x79, 0xfd, 0x66, 0x83, 0xc1, 0x0f, - 0xf7, 0x67, 0x47, 0xeb, 0xa1, 0x2b, 0xff, 0x62, 0x55, 0x00, 0xdd, 0x85, 0x33, 0x86, 0x44, 0x50, - 0xcd, 0x85, 0xfe, 0x9b, 0xfb, 0xb0, 0xa8, 0xee, 0xcc, 0x6a, 0x1e, 0x27, 0x9c, 0x5f, 0x81, 0xfd, - 0x0d, 0xee, 0xf4, 0x14, 0xae, 0x11, 0x12, 0xb7, 0xfd, 0x93, 0x78, 0x1c, 0x60, 0xd9, 0xf0, 0xda, - 0xdc, 0xb3, 0x63, 0xfd, 0xf7, 0x2d, 0xe6, 0x58, 0x5f, 0x23, 0x3b, 0x2d, 0xdf, 0x49, 0x4e, 0x22, - 0xb4, 0xf6, 0x75, 0x18, 0x49, 0x44, 0x6d, 0xdd, 0xde, 0x33, 0xd0, 0x1a, 0xc5, 0x0e, 0x17, 0xd4, - 0x86, 0x28, 0xa1, 0x58, 0xb1, 0xb1, 0xff, 0x31, 0x1f, 0x01, 0x89, 0x39, 0x01, 0xdf, 0x42, 0xcd, - 0xf4, 0x2d, 0xcc, 0xf6, 0xf8, 0x82, 0x02, 0x1f, 0xc3, 0x3f, 0x32, 0xdb, 0xcd, 0x6c, 0x8f, 0x8f, - 0xfa, 0x89, 0x8e, 0xfd, 0x4b, 0x16, 0x9c, 0xce, 0x3b, 0xd2, 0xa7, 0x4a, 0x0c, 0xb7, 0x7c, 0xd4, - 0x09, 0x97, 0xea, 0xc1, 0xdb, 0x02, 0x8e, 0x15, 0x45, 0xdf, 0x39, 0xc5, 0x8f, 0x96, 0x64, 0xe9, - 0x26, 0x98, 0xaf, 0xc9, 0xa1, 0x57, 0x79, 0xac, 0xbc, 0xa5, 0x9e, 0x7b, 0x3b, 0x5a, 0x9c, 0xbc, - 0xfd, 0x6b, 0x25, 0x38, 0xcd, 0x5d, 0xd4, 0x0b, 0xbb, 0xa1, 0xe7, 0xd6, 0x43, 0x57, 0xdc, 0x1c, - 0x78, 0x0b, 0xc6, 0x5a, 0x9a, 0xb9, 0xda, 0x2d, 0xcd, 0x8b, 0x6e, 0xd6, 0xa6, 0x66, 0x83, 0x0e, - 0xc5, 0x06, 0x2f, 0xe4, 0xc2, 0x18, 0xd9, 0xf5, 0x9a, 0xca, 0xcf, 0x59, 0x3a, 0xb2, 0x48, 0x57, - 0xb5, 0x2c, 0x6b, 0x7c, 0xb0, 0xc1, 0xf5, 0x3e, 0xbc, 0xfc, 0x61, 0x7f, 0xc5, 0x82, 0x07, 0x0a, - 0x92, 0xc2, 0xd0, 0xea, 0xee, 0xb0, 0xc3, 0x00, 0xf1, 0x34, 0xa1, 0xaa, 0x8e, 0x1f, 0x11, 0x60, - 0x81, 0x45, 0x3f, 0x09, 0xc0, 0x5d, 0xfc, 0xec, 0x21, 0xf8, 0x52, 0xf7, 0x5b, 0xe7, 0x46, 0xb2, - 0x04, 0xed, 0x46, 0xbd, 0x7a, 0xfa, 0x5d, 0xe3, 0x65, 0xff, 0x4a, 0x19, 0x06, 0xf9, 0x3b, 0xd5, - 0x2b, 0x30, 0xbc, 0xc5, 0x53, 0xd0, 0xf6, 0x93, 0xed, 0x36, 0x35, 0x47, 0x38, 0x00, 0xcb, 0xc2, - 0xe8, 0x3a, 0x9c, 0x12, 0xb7, 0x53, 0x6a, 0xc4, 0x77, 0xf6, 0xa4, 0x55, 0xcb, 0x9f, 0x83, 0x90, - 0xa9, 0xca, 0x4f, 0xad, 0x76, 0x92, 0xe0, 0xbc, 0x72, 0xe8, 0xd5, 0x8e, 0xc4, 0x73, 0x3c, 0x79, - 0xaf, 0xd2, 0x81, 0x7b, 0x24, 0x9f, 0x7b, 0x19, 0xc6, 0x5b, 0x1d, 0xf6, 0xbb, 0xf6, 0x44, 0xb0, - 0x69, 0xb3, 0x9b, 0xb4, 0x2c, 0x3e, 0xa0, 0xcd, 0xa2, 0x21, 0xd6, 0xb6, 0x22, 0x12, 0x6f, 0x85, - 0xbe, 0x2b, 0xde, 0xc3, 0x4c, 0xe3, 0x03, 0x32, 0x78, 0xdc, 0x51, 0x82, 0x72, 0xd9, 0x70, 0x3c, - 0xbf, 0x1d, 0x91, 0x94, 0xcb, 0x90, 0xc9, 0x65, 0x25, 0x83, 0xc7, 0x1d, 0x25, 0xe8, 0x3c, 0x3a, - 0x23, 0x1e, 0x53, 0x94, 0x77, 0x96, 0x55, 0xd0, 0xc7, 0xb0, 0x8c, 0x4a, 0xef, 0x92, 0x47, 0x43, - 0x1c, 0xf9, 0xab, 0xe7, 0x18, 0xb5, 0x67, 0xba, 0x44, 0x3c, 0xba, 0xe4, 0x72, 0x2f, 0x4f, 0xfa, - 0xfd, 0xa9, 0x05, 0xa7, 0x72, 0x02, 0xc1, 0xb8, 0xa8, 0xda, 0xf4, 0xe2, 0x44, 0xbd, 0x42, 0xa0, - 0x89, 0x2a, 0x0e, 0xc7, 0x8a, 0x82, 0xae, 0x07, 0x2e, 0x0c, 0xb3, 0x02, 0x50, 0x04, 0x6f, 0x08, - 0xec, 0xd1, 0x04, 0x20, 0xba, 0x00, 0x03, 0xed, 0x98, 0x44, 0xf2, 0x1d, 0x3c, 0x29, 0xbf, 0x99, - 0x47, 0x90, 0x61, 0xa8, 0x46, 0xb9, 0xa9, 0x9c, 0x71, 0x9a, 0x46, 0xc9, 0xdd, 0x71, 0x1c, 0x67, - 0x7f, 0xb9, 0x0c, 0x93, 0x99, 0xb0, 0x4d, 0xda, 0x90, 0x9d, 0x30, 0xf0, 0x92, 0x50, 0xe5, 0x3d, - 0xe3, 0x69, 0x1e, 0x48, 0x6b, 0xeb, 0xba, 0x80, 0x63, 0x45, 0x81, 0x1e, 0x93, 0x0f, 0xa4, 0x66, - 0x5f, 0x57, 0x58, 0xac, 0x19, 0x6f, 0xa4, 0xf6, 0xfb, 0x4c, 0xca, 0xa3, 0x30, 0xd0, 0x0a, 0xd5, - 0xeb, 0xd5, 0x6a, 0x3c, 0xf1, 0x62, 0xad, 0x1e, 0x86, 0x3e, 0x66, 0x48, 0xf4, 0x09, 0xf1, 0xf5, - 0x99, 0xf3, 0x0a, 0xec, 0xb8, 0x61, 0xac, 0x75, 0xc1, 0x13, 0x30, 0xbc, 0x4d, 0xf6, 0x22, 0x2f, - 0xd8, 0xcc, 0x9e, 0xd6, 0x5c, 0xe5, 0x60, 0x2c, 0xf1, 0x66, 0x9a, 0xf1, 0xe1, 0xfb, 0xf2, 0xd2, - 0xc9, 0x48, 0xcf, 0x5d, 0xed, 0xb7, 0x2c, 0x98, 0x64, 0x39, 0x46, 0xc5, 0xed, 0x78, 0x2f, 0x0c, - 0x4e, 0x40, 0x4f, 0x78, 0x14, 0x06, 0x23, 0x5a, 0x69, 0xf6, 0xf9, 0x02, 0xd6, 0x12, 0xcc, 0x71, - 0xe8, 0x21, 0x18, 0x60, 0x4d, 0xa0, 0x83, 0x37, 0xc6, 0xb3, 0x8c, 0xd7, 0x9c, 0xc4, 0xc1, 0x0c, - 0xca, 0xae, 0x29, 0x61, 0xd2, 0xf2, 0x3d, 0xde, 0xe8, 0xd4, 0xdd, 0xfa, 0xd1, 0xb8, 0xa6, 0x94, - 0xdb, 0xb4, 0x0f, 0x76, 0x4d, 0x29, 0x9f, 0x65, 0x77, 0x1d, 0xfc, 0xbf, 0x96, 0xe0, 0x7c, 0x6e, - 0xb9, 0xf4, 0x64, 0x77, 0xc5, 0x38, 0xd9, 0xbd, 0x94, 0x39, 0xd9, 0xb5, 0xbb, 0x97, 0x3e, 0x9e, - 0xb3, 0xde, 0xfc, 0x23, 0xd8, 0xf2, 0x09, 0x1e, 0xc1, 0x0e, 0xf4, 0xab, 0xa6, 0x0c, 0xf6, 0x50, - 0x53, 0xbe, 0x6d, 0xc1, 0xb9, 0xdc, 0x2e, 0xfb, 0x88, 0xdc, 0x0b, 0xcb, 0x6d, 0x5b, 0x81, 0x0d, - 0xf1, 0x83, 0x52, 0xc1, 0xb7, 0x30, 0x6b, 0xe2, 0x22, 0x95, 0x33, 0x0c, 0x19, 0x0b, 0xb5, 0x6b, - 0x8c, 0xcb, 0x18, 0x0e, 0xc3, 0x0a, 0x8b, 0x3c, 0xed, 0x86, 0x15, 0x6f, 0xda, 0xcb, 0x47, 0x5a, - 0x32, 0x73, 0xa6, 0x77, 0x5c, 0xbf, 0xca, 0x9f, 0xbd, 0x6d, 0x75, 0x5d, 0xb3, 0x00, 0xcb, 0xfd, - 0x5b, 0x80, 0x63, 0xf9, 0xd6, 0x1f, 0x5a, 0x80, 0xc9, 0x1d, 0x2f, 0x60, 0x6f, 0x90, 0x9a, 0x7a, - 0x8f, 0xba, 0x96, 0x7a, 0xdd, 0x44, 0xe3, 0x2c, 0xfd, 0xcc, 0xcb, 0x30, 0x7e, 0xef, 0x2e, 0xab, - 0xef, 0x94, 0xe1, 0xc1, 0x2e, 0xcb, 0x9e, 0xcb, 0x7a, 0x63, 0x0c, 0x34, 0x59, 0xdf, 0x31, 0x0e, - 0x75, 0x38, 0xbd, 0xd1, 0xf6, 0xfd, 0x3d, 0x16, 0xe5, 0x44, 0x5c, 0x49, 0x21, 0x14, 0x13, 0x95, - 0x40, 0x78, 0x25, 0x87, 0x06, 0xe7, 0x96, 0x44, 0xaf, 0x01, 0x0a, 0xd7, 0x59, 0x52, 0x5b, 0x37, - 0x4d, 0x50, 0xc0, 0x3a, 0xbe, 0x9c, 0x2e, 0xc6, 0x9b, 0x1d, 0x14, 0x38, 0xa7, 0x14, 0xd5, 0x30, - 0xd9, 0xcb, 0xe9, 0xaa, 0x59, 0x19, 0x0d, 0x13, 0xeb, 0x48, 0x6c, 0xd2, 0xa2, 0xcb, 0x30, 0xed, - 0xec, 0x3a, 0x1e, 0x4f, 0x58, 0x25, 0x19, 0x70, 0x15, 0x53, 0x39, 0x8a, 0x16, 0xb2, 0x04, 0xb8, - 0xb3, 0x0c, 0xda, 0x30, 0xbc, 0x7c, 0x3c, 0x5f, 0xfe, 0xa5, 0xbe, 0x67, 0x6b, 0xdf, 0x7e, 0x3f, - 0xfb, 0xdf, 0x5b, 0x74, 0xfb, 0xca, 0x79, 0xf4, 0x92, 0xf6, 0x83, 0xf2, 0x5f, 0x69, 0xb7, 0xc3, - 0x54, 0x3f, 0x2c, 0xe9, 0x48, 0x6c, 0xd2, 0xf2, 0x09, 0x11, 0xa7, 0xe1, 0xd2, 0x86, 0x9e, 0x28, - 0xae, 0x53, 0x2a, 0x0a, 0xf4, 0x26, 0x0c, 0xbb, 0xde, 0xae, 0x17, 0x87, 0x91, 0x58, 0x2c, 0x47, - 0x7d, 0xec, 0x59, 0xc9, 0xc1, 0x1a, 0x67, 0x83, 0x25, 0x3f, 0xfb, 0xcb, 0x25, 0x18, 0x97, 0x35, - 0xbe, 0xde, 0x0e, 0x13, 0xe7, 0x04, 0xb6, 0xe5, 0xcb, 0xc6, 0xb6, 0xfc, 0x89, 0x6e, 0x77, 0x4a, - 0x59, 0x93, 0x0a, 0xb7, 0xe3, 0x9b, 0x99, 0xed, 0xf8, 0xf1, 0xde, 0xac, 0xba, 0x6f, 0xc3, 0xbf, - 0x6b, 0xc1, 0xb4, 0x41, 0x7f, 0x02, 0xbb, 0xc1, 0x8a, 0xb9, 0x1b, 0x3c, 0xd2, 0xf3, 0x1b, 0x0a, - 0x76, 0x81, 0xaf, 0x95, 0x32, 0x6d, 0x67, 0xd2, 0xff, 0x3d, 0x18, 0xd8, 0x72, 0x22, 0xb7, 0x5b, - 0xda, 0xc5, 0x8e, 0x42, 0x73, 0x57, 0x9c, 0xc8, 0xe5, 0x32, 0xfc, 0x69, 0xf5, 0x1e, 0x97, 0x13, - 0xb9, 0x3d, 0x6f, 0x07, 0xb0, 0xaa, 0xd0, 0x4b, 0x30, 0x14, 0x37, 0xc3, 0x96, 0x8a, 0xbd, 0xbc, - 0xc0, 0xdf, 0xea, 0xa2, 0x90, 0xc3, 0xfd, 0x59, 0x64, 0x56, 0x47, 0xc1, 0x58, 0xd0, 0xcf, 0x6c, - 0x42, 0x45, 0x55, 0x7d, 0x5f, 0xa3, 0xca, 0xff, 0xa8, 0x0c, 0xa7, 0x72, 0xe6, 0x05, 0x8a, 0x8d, - 0xde, 0x7a, 0xb6, 0xcf, 0xe9, 0xf4, 0x01, 0xfb, 0x2b, 0x66, 0x16, 0x8b, 0x2b, 0xc6, 0xbf, 0xef, - 0x4a, 0x6f, 0xc5, 0x24, 0x5b, 0x29, 0x05, 0xf5, 0xae, 0x94, 0x56, 0x76, 0x62, 0x5d, 0x4d, 0x2b, - 0x52, 0x2d, 0xbd, 0xaf, 0x63, 0xfa, 0x3f, 0xcb, 0x70, 0x3a, 0xef, 0x2a, 0x3a, 0xfa, 0x99, 0xcc, - 0x23, 0x0e, 0xcf, 0xf7, 0x7b, 0x89, 0x9d, 0xbf, 0xec, 0x20, 0x32, 0xbc, 0xcc, 0x99, 0xcf, 0x3a, - 0xf4, 0xec, 0x66, 0x51, 0x27, 0xbb, 0xae, 0x13, 0xf1, 0xc7, 0x37, 0xe4, 0x12, 0xff, 0x64, 0xdf, - 0x0d, 0x10, 0xaf, 0x76, 0xc4, 0x99, 0xeb, 0x3a, 0x12, 0xdc, 0xfb, 0xba, 0x8e, 0xac, 0x79, 0xc6, - 0x83, 0x51, 0xed, 0x6b, 0xee, 0xeb, 0x88, 0x6f, 0xd3, 0x1d, 0x45, 0x6b, 0xf7, 0x7d, 0x1d, 0xf5, - 0xaf, 0x58, 0x90, 0x89, 0x93, 0x52, 0xfe, 0x0f, 0xab, 0xd0, 0xff, 0x71, 0x01, 0x06, 0xa2, 0xd0, - 0x27, 0xd9, 0xbc, 0xfe, 0x38, 0xf4, 0x09, 0x66, 0x18, 0xf5, 0xf8, 0x6e, 0xb9, 0xe8, 0xf1, 0x5d, - 0x6a, 0x1a, 0xfb, 0x64, 0x97, 0x48, 0x6f, 0x84, 0x92, 0xc9, 0xd7, 0x28, 0x10, 0x73, 0x9c, 0xfd, - 0x1b, 0x03, 0x70, 0x2a, 0xe7, 0x72, 0x1a, 0x35, 0x54, 0x36, 0x9d, 0x84, 0xdc, 0x71, 0xf6, 0xb2, - 0xb9, 0x46, 0x2f, 0x73, 0x30, 0x96, 0x78, 0x16, 0xcb, 0xc9, 0xd3, 0x95, 0x65, 0x7c, 0x44, 0x22, - 0x4b, 0x99, 0xc0, 0xde, 0xaf, 0xf7, 0x58, 0x2f, 0x01, 0xc4, 0xb1, 0xbf, 0x1c, 0x50, 0xe5, 0xcb, - 0x15, 0x91, 0xa2, 0x69, 0x6e, 0xbb, 0xc6, 0x35, 0x81, 0xc1, 0x1a, 0x15, 0xaa, 0xc1, 0x54, 0x2b, - 0x0a, 0x13, 0xee, 0x77, 0xab, 0xf1, 0x18, 0x85, 0x41, 0xf3, 0x9a, 0x51, 0x3d, 0x83, 0xc7, 0x1d, - 0x25, 0xd0, 0x0b, 0x30, 0x2a, 0xae, 0x1e, 0xd5, 0xc3, 0xd0, 0x17, 0x5e, 0x1a, 0x75, 0xe2, 0xdd, - 0x48, 0x51, 0x58, 0xa7, 0xd3, 0x8a, 0x31, 0x67, 0xde, 0x70, 0x6e, 0x31, 0xee, 0xd0, 0xd3, 0xe8, - 0x32, 0x19, 0x29, 0x46, 0xfa, 0xca, 0x48, 0x91, 0xfa, 0xad, 0x2a, 0x7d, 0x9f, 0x5f, 0x40, 0x4f, - 0x4f, 0xcf, 0x37, 0xca, 0x30, 0xc4, 0x87, 0xe2, 0x04, 0x54, 0xb1, 0x15, 0xe1, 0xbb, 0xe9, 0x92, - 0x07, 0x80, 0xb7, 0x65, 0xae, 0xe6, 0x24, 0x0e, 0x17, 0x43, 0x6a, 0x35, 0xa4, 0x5e, 0x1e, 0x34, - 0x67, 0xac, 0x97, 0x99, 0x8c, 0x73, 0x02, 0x38, 0x0f, 0x6d, 0xf5, 0xbc, 0x03, 0x10, 0xb3, 0x37, - 0x41, 0x29, 0x0f, 0x91, 0xb7, 0xf4, 0xc9, 0x2e, 0xb5, 0x37, 0x14, 0x31, 0x6f, 0x43, 0x3a, 0x05, - 0x15, 0x02, 0x6b, 0x1c, 0x67, 0x5e, 0x84, 0x8a, 0x22, 0xee, 0x65, 0xc9, 0x8d, 0xe9, 0xc2, 0xeb, - 0xd3, 0x30, 0x99, 0xa9, 0xeb, 0x48, 0x86, 0xe0, 0x6f, 0x5b, 0x30, 0xc9, 0x9b, 0xbc, 0x1c, 0xec, - 0x8a, 0xc5, 0xfe, 0x3e, 0x9c, 0xf6, 0x73, 0x16, 0x9d, 0x18, 0xd1, 0xfe, 0x17, 0xa9, 0x32, 0xfc, - 0xf2, 0xb0, 0x38, 0xb7, 0x0e, 0x6a, 0xfc, 0xf3, 0xd7, 0x8c, 0x1d, 0x5f, 0x44, 0x20, 0x8f, 0xf1, - 0x7c, 0xce, 0x1c, 0x86, 0x15, 0xd6, 0xfe, 0xae, 0x05, 0xd3, 0x1d, 0x6f, 0xe1, 0x7f, 0xa8, 0x6d, - 0x17, 0xe9, 0xaa, 0x4b, 0x05, 0xe9, 0xaa, 0xf5, 0x4f, 0x2b, 0x77, 0xfd, 0xb4, 0x5f, 0xb3, 0x40, - 0xcc, 0xc0, 0x13, 0x50, 0xe7, 0x7f, 0xc2, 0x54, 0xe7, 0x67, 0x8a, 0x27, 0x75, 0x81, 0x1e, 0xff, - 0xe7, 0x16, 0x4c, 0x71, 0x82, 0xf4, 0xf0, 0xe2, 0x43, 0x1d, 0x87, 0x7e, 0xde, 0x50, 0x51, 0x8f, - 0x56, 0xe6, 0x7f, 0x94, 0x31, 0x58, 0x03, 0x5d, 0x07, 0xeb, 0x3f, 0x5b, 0x80, 0xf8, 0xe7, 0x67, - 0x1f, 0x78, 0xe6, 0x9b, 0x92, 0x66, 0x6a, 0xa7, 0x42, 0x40, 0x61, 0xb0, 0x46, 0x75, 0x2c, 0x0d, - 0xcf, 0x9c, 0x0d, 0x95, 0x7b, 0x9f, 0x0d, 0x1d, 0xe1, 0x5b, 0xff, 0xca, 0x00, 0x64, 0x03, 0x11, - 0xd1, 0x6d, 0x18, 0x6b, 0x3a, 0x2d, 0x67, 0xdd, 0xf3, 0xbd, 0xc4, 0x23, 0x71, 0xb7, 0x43, 0xe5, - 0x25, 0x8d, 0x4e, 0x1c, 0xc4, 0x68, 0x10, 0x6c, 0xf0, 0x41, 0x73, 0x00, 0xad, 0xc8, 0xdb, 0xf5, - 0x7c, 0xb2, 0xc9, 0x6c, 0x0d, 0x76, 0x1b, 0x81, 0x9f, 0x94, 0x4a, 0x28, 0xd6, 0x28, 0x72, 0xa2, - 0xd7, 0xcb, 0xf7, 0x2f, 0x7a, 0x7d, 0xe0, 0x88, 0xd1, 0xeb, 0x83, 0x7d, 0x45, 0xaf, 0x63, 0x38, - 0x2b, 0x77, 0x55, 0xfa, 0x7f, 0xc5, 0xf3, 0x89, 0x50, 0xa5, 0xf8, 0x1d, 0x85, 0x99, 0x83, 0xfd, - 0xd9, 0xb3, 0x38, 0x97, 0x02, 0x17, 0x94, 0x44, 0x3f, 0x09, 0x55, 0xc7, 0xf7, 0xc3, 0x3b, 0xaa, - 0xd7, 0x96, 0xe3, 0xa6, 0xe3, 0xa7, 0xa9, 0x40, 0x47, 0x16, 0x1f, 0x3a, 0xd8, 0x9f, 0xad, 0x2e, - 0x14, 0xd0, 0xe0, 0xc2, 0xd2, 0xf6, 0x36, 0x9c, 0x6a, 0x90, 0x48, 0x3e, 0x04, 0xa6, 0x56, 0xdf, - 0x1a, 0x54, 0xa2, 0xcc, 0x72, 0xef, 0xeb, 0x4a, 0xba, 0x96, 0x80, 0x4b, 0x2e, 0xef, 0x94, 0x91, - 0xfd, 0x67, 0x16, 0x0c, 0x8b, 0xe0, 0xc6, 0x13, 0xd0, 0x32, 0x16, 0x0c, 0x87, 0xcf, 0x6c, 0xbe, - 0x48, 0x64, 0x8d, 0x29, 0x74, 0xf5, 0xac, 0x66, 0x5c, 0x3d, 0x8f, 0x74, 0x63, 0xd2, 0xdd, 0xc9, - 0xf3, 0x8b, 0x65, 0x98, 0x30, 0x03, 0x3b, 0x4f, 0xa0, 0x0b, 0x6e, 0xc0, 0x70, 0x2c, 0xa2, 0x88, - 0x4b, 0xc5, 0xd1, 0x68, 0xd9, 0x41, 0x4c, 0xcf, 0xac, 0x45, 0xdc, 0xb0, 0x64, 0x92, 0x1b, 0x9e, - 0x5c, 0xbe, 0x8f, 0xe1, 0xc9, 0xbd, 0x62, 0x6b, 0x07, 0x8e, 0x23, 0xb6, 0xd6, 0xfe, 0x26, 0x13, - 0xfe, 0x3a, 0xfc, 0x04, 0x76, 0xec, 0xcb, 0xe6, 0x36, 0x61, 0x77, 0x99, 0x59, 0xa2, 0x51, 0x05, - 0x3b, 0xf7, 0x3f, 0xb0, 0x60, 0x54, 0x10, 0x9e, 0x40, 0xb3, 0x3f, 0x63, 0x36, 0xfb, 0xc1, 0x2e, - 0xcd, 0x2e, 0x68, 0xef, 0xdf, 0x2c, 0xa9, 0xf6, 0xd6, 0xc5, 0x53, 0xfc, 0x3d, 0x53, 0x43, 0x8f, - 0x50, 0x3b, 0x2d, 0x6c, 0x86, 0xbe, 0xd0, 0xcb, 0x1e, 0x4a, 0xaf, 0xa9, 0x71, 0xf8, 0xa1, 0xf6, - 0x1b, 0x2b, 0x6a, 0x76, 0x8b, 0x2a, 0x8c, 0x12, 0xb1, 0x81, 0xa6, 0xb7, 0xa8, 0xc2, 0x28, 0xc1, - 0x0c, 0x83, 0x5c, 0x80, 0xf4, 0x85, 0x74, 0x71, 0xaf, 0xb3, 0x78, 0x15, 0xb6, 0x13, 0xcf, 0x9f, - 0xf3, 0x82, 0x24, 0x4e, 0xa2, 0xb9, 0xd5, 0x20, 0xb9, 0x19, 0x71, 0xad, 0x5d, 0xbb, 0x77, 0xa6, - 0x78, 0x61, 0x8d, 0xaf, 0xbc, 0xf8, 0xc0, 0xea, 0x18, 0x34, 0x4f, 0x62, 0x6e, 0x08, 0x38, 0x56, - 0x14, 0xf6, 0x8b, 0x4c, 0x26, 0xb3, 0x0e, 0x3a, 0xda, 0x95, 0xb0, 0x3f, 0x1e, 0x56, 0x5d, 0xcb, - 0xdc, 0xb0, 0x35, 0xfd, 0xe2, 0x59, 0x77, 0x11, 0x48, 0x2b, 0xd6, 0x83, 0x7c, 0xd3, 0xdb, 0x69, - 0xe8, 0xb3, 0x1d, 0x07, 0x74, 0xcf, 0xf4, 0x90, 0xa5, 0x47, 0x38, 0x92, 0x63, 0x99, 0xee, 0x58, - 0x46, 0xb0, 0xd5, 0x7a, 0x36, 0x79, 0xf7, 0x92, 0x44, 0xe0, 0x94, 0x06, 0xcd, 0x0b, 0x9b, 0x8f, - 0x3b, 0x40, 0x1e, 0xcc, 0xd8, 0x7c, 0xf2, 0xf3, 0x35, 0xa3, 0xef, 0x59, 0x18, 0x55, 0x0f, 0xa2, - 0xd4, 0xf9, 0xbb, 0x12, 0x15, 0xae, 0x4b, 0x2d, 0xa7, 0x60, 0xac, 0xd3, 0xa0, 0x35, 0x98, 0x8c, - 0xf9, 0x6b, 0x2d, 0xf2, 0x2e, 0x82, 0xb0, 0xe8, 0x9f, 0xcc, 0xbc, 0xc5, 0x2e, 0xd1, 0x87, 0x0c, - 0xc4, 0x17, 0xab, 0xbc, 0xbd, 0x90, 0x65, 0x81, 0x5e, 0x85, 0x09, 0x5f, 0x7f, 0xb5, 0xb2, 0x2e, - 0x0c, 0x7e, 0x15, 0x64, 0x65, 0xbc, 0x69, 0x59, 0xc7, 0x19, 0x6a, 0xaa, 0x04, 0xe8, 0x10, 0x91, - 0xa4, 0xc6, 0x09, 0x36, 0x49, 0x2c, 0x9e, 0x73, 0x60, 0x4a, 0xc0, 0xb5, 0x02, 0x1a, 0x5c, 0x58, - 0x1a, 0xbd, 0x04, 0x63, 0xf2, 0xf3, 0xb5, 0xbb, 0x39, 0x69, 0x28, 0x9f, 0x86, 0xc3, 0x06, 0x25, - 0xba, 0x03, 0x67, 0xe4, 0xff, 0xb5, 0xc8, 0xd9, 0xd8, 0xf0, 0x9a, 0xe2, 0x6a, 0xd4, 0x28, 0x63, - 0xb1, 0x20, 0xe3, 0x9a, 0x97, 0xf3, 0x88, 0x0e, 0xf7, 0x67, 0x2f, 0x88, 0x5e, 0xcb, 0xc5, 0xb3, - 0x41, 0xcc, 0xe7, 0x8f, 0xae, 0xc3, 0xa9, 0x2d, 0xe2, 0xf8, 0xc9, 0xd6, 0xd2, 0x16, 0x69, 0x6e, - 0xcb, 0x45, 0xc4, 0x6e, 0xfc, 0x68, 0x01, 0x70, 0x57, 0x3a, 0x49, 0x70, 0x5e, 0x39, 0xf4, 0x36, - 0x54, 0x5b, 0xed, 0x75, 0xdf, 0x8b, 0xb7, 0x6e, 0x84, 0x09, 0x3b, 0x4b, 0x54, 0xef, 0x89, 0x88, - 0xab, 0x41, 0xea, 0xb6, 0x53, 0xbd, 0x80, 0x0e, 0x17, 0x72, 0xf8, 0x60, 0xa7, 0xbc, 0xef, 0xd1, - 0xc2, 0x9a, 0x86, 0x81, 0x3e, 0x07, 0x63, 0xfa, 0x48, 0x0a, 0x21, 0xff, 0x58, 0xaf, 0x57, 0x52, - 0x85, 0x7e, 0xa2, 0x46, 0x55, 0xc7, 0x61, 0x83, 0xa3, 0xfd, 0xcf, 0x4a, 0x30, 0xdb, 0x23, 0x87, - 0x54, 0xc6, 0x75, 0x65, 0xf5, 0xe5, 0xba, 0x5a, 0x90, 0x4f, 0x87, 0xdc, 0xc8, 0x24, 0xa6, 0xce, - 0x3c, 0x0b, 0x92, 0xa6, 0xa7, 0xce, 0xd2, 0xf7, 0x1d, 0xb5, 0xa5, 0x7b, 0xbf, 0x06, 0x7a, 0x06, - 0xaf, 0xd5, 0x75, 0x37, 0xe6, 0x60, 0xff, 0xea, 0x6e, 0xa1, 0x07, 0xd3, 0xfe, 0x66, 0x09, 0xce, - 0xa8, 0x2e, 0xfc, 0xd1, 0xed, 0xb8, 0x5b, 0x9d, 0x1d, 0x77, 0x0c, 0xfe, 0x5f, 0xfb, 0x26, 0x0c, - 0x35, 0xf6, 0xe2, 0x66, 0xe2, 0xf7, 0xa1, 0x1d, 0x3c, 0x6a, 0xac, 0x9c, 0x74, 0x0f, 0x63, 0xaf, - 0x7f, 0x89, 0x85, 0x64, 0xff, 0x45, 0x0b, 0x26, 0xd7, 0x96, 0xea, 0x8d, 0xb0, 0xb9, 0x4d, 0x92, - 0x05, 0xee, 0xdd, 0xc0, 0x42, 0x39, 0xb0, 0xee, 0x71, 0xd3, 0xcf, 0x53, 0x27, 0x2e, 0xc0, 0xc0, - 0x56, 0x18, 0x27, 0x59, 0x1f, 0xff, 0x95, 0x30, 0x4e, 0x30, 0xc3, 0xd8, 0x7f, 0x62, 0xc1, 0x20, - 0x7b, 0xf0, 0xaa, 0xd7, 0xc3, 0x68, 0xfd, 0x7c, 0x17, 0x7a, 0x01, 0x86, 0xc8, 0xc6, 0x06, 0x69, - 0x26, 0x62, 0x54, 0xe5, 0x45, 0x92, 0xa1, 0x65, 0x06, 0xa5, 0x3b, 0x22, 0xab, 0x8c, 0xff, 0xc5, - 0x82, 0x18, 0x7d, 0x16, 0x2a, 0x89, 0xb7, 0x43, 0x16, 0x5c, 0x57, 0xb8, 0xd7, 0x8f, 0x16, 0x49, - 0xa5, 0x76, 0xe8, 0x35, 0xc9, 0x04, 0xa7, 0xfc, 0xec, 0x9f, 0x2f, 0x01, 0xa4, 0x17, 0xce, 0x7a, - 0x7d, 0xe6, 0x62, 0xc7, 0xfb, 0x6f, 0x8f, 0xe5, 0xbc, 0xff, 0x86, 0x52, 0x86, 0x39, 0xaf, 0xbf, - 0xa9, 0xae, 0x2a, 0xf7, 0xd5, 0x55, 0x03, 0x47, 0xe9, 0xaa, 0x25, 0x98, 0x4e, 0x2f, 0xcc, 0x99, - 0xb7, 0x87, 0x59, 0x6e, 0xd8, 0xb5, 0x2c, 0x12, 0x77, 0xd2, 0xdb, 0x5f, 0xb2, 0x40, 0x44, 0xd7, - 0xf6, 0x31, 0xa1, 0xdf, 0x92, 0x4f, 0x35, 0x19, 0x89, 0xed, 0x2e, 0x14, 0x87, 0x1b, 0x8b, 0x74, - 0x76, 0x4a, 0xb2, 0x1b, 0x49, 0xec, 0x0c, 0x5e, 0xf6, 0xef, 0x5a, 0x30, 0xca, 0xd1, 0xd7, 0x99, - 0x09, 0xda, 0xbb, 0x35, 0x47, 0xca, 0x2c, 0xcc, 0x5e, 0x31, 0xa2, 0x8c, 0x55, 0x02, 0x5a, 0xfd, - 0x15, 0x23, 0x89, 0xc0, 0x29, 0x0d, 0x7a, 0x02, 0x86, 0xe3, 0xf6, 0x3a, 0x23, 0xcf, 0x04, 0xd8, - 0x36, 0x38, 0x18, 0x4b, 0x3c, 0x9d, 0x57, 0x53, 0xd9, 0xf8, 0x6a, 0x74, 0x05, 0x86, 0xb8, 0xd8, - 0x10, 0xcb, 0xb8, 0xcb, 0x61, 0x82, 0x16, 0x95, 0x0d, 0xfc, 0xd9, 0x6d, 0x26, 0x6e, 0x44, 0x79, - 0xf4, 0x36, 0x8c, 0xba, 0xe1, 0x9d, 0xe0, 0x8e, 0x13, 0xb9, 0x0b, 0xf5, 0x55, 0xd1, 0xeb, 0xb9, - 0x51, 0x72, 0xb5, 0x94, 0x4c, 0x8f, 0xf4, 0x66, 0xee, 0xb9, 0x14, 0x85, 0x75, 0x76, 0x68, 0x8d, - 0xe5, 0xf0, 0xe0, 0x8f, 0x81, 0x76, 0x8b, 0x1b, 0x51, 0xef, 0x87, 0x6a, 0x9c, 0xc7, 0x45, 0xa2, - 0x0f, 0xf1, 0x94, 0x68, 0xca, 0xc8, 0xfe, 0xc2, 0x29, 0x30, 0x46, 0xdb, 0xc8, 0xff, 0x6b, 0x1d, - 0x53, 0xfe, 0x5f, 0x0c, 0x23, 0x64, 0xa7, 0x95, 0xec, 0xd5, 0xbc, 0xa8, 0x5b, 0x42, 0xf6, 0x65, - 0x41, 0xd3, 0xc9, 0x53, 0x62, 0xb0, 0xe2, 0x93, 0x9f, 0xa4, 0xb9, 0xfc, 0x21, 0x26, 0x69, 0x1e, - 0x38, 0xc1, 0x24, 0xcd, 0x37, 0x60, 0x78, 0xd3, 0x4b, 0x30, 0x69, 0x85, 0x62, 0xcb, 0xcc, 0x9d, - 0x09, 0x97, 0x39, 0x49, 0x67, 0x7a, 0x51, 0x81, 0xc0, 0x92, 0x09, 0x7a, 0x4d, 0xad, 0x81, 0xa1, - 0x62, 0x55, 0xb0, 0xd3, 0xbb, 0x9d, 0xbb, 0x0a, 0x44, 0x52, 0xe6, 0xe1, 0x7b, 0x4d, 0xca, 0xac, - 0x92, 0x2a, 0x8f, 0x7c, 0xb0, 0xa4, 0xca, 0x46, 0xd2, 0xe9, 0xca, 0xf1, 0x25, 0x9d, 0xfe, 0x92, - 0x05, 0x67, 0x5a, 0x79, 0xf9, 0xd7, 0x45, 0xa2, 0xe4, 0x17, 0xfa, 0xce, 0x43, 0x6f, 0x54, 0xc8, - 0x12, 0x49, 0xe4, 0x92, 0xe1, 0xfc, 0xea, 0x64, 0xf6, 0xea, 0xd1, 0x7b, 0xcd, 0x5e, 0x7d, 0x7f, - 0x32, 0x2a, 0xa7, 0xb9, 0xac, 0xc7, 0x8f, 0x31, 0x97, 0xf5, 0xc4, 0x07, 0xce, 0x65, 0xad, 0xe5, - 0xa3, 0x9e, 0x3c, 0x8e, 0x7c, 0xd4, 0xef, 0x98, 0xc2, 0x9e, 0xa7, 0x49, 0x7e, 0xaa, 0x87, 0xb0, - 0x37, 0xf8, 0x76, 0x17, 0xf7, 0x3c, 0xf7, 0xf6, 0xf4, 0x3d, 0xe5, 0xde, 0x36, 0xb2, 0x5a, 0xa3, - 0xe3, 0xcb, 0x6a, 0x7d, 0x5b, 0xdf, 0x82, 0x4e, 0x15, 0xf3, 0x55, 0x3b, 0x4d, 0x27, 0xdf, 0xbc, - 0x4d, 0xa8, 0x33, 0x5b, 0xf6, 0xe9, 0x93, 0xc9, 0x96, 0x7d, 0xe6, 0xd8, 0xb3, 0x65, 0x9f, 0x3d, - 0x81, 0x6c, 0xd9, 0x0f, 0x7c, 0xa8, 0xd9, 0xb2, 0xab, 0xf7, 0x37, 0x5b, 0xf6, 0xb9, 0xe3, 0xc8, - 0x96, 0x7d, 0x1b, 0x2a, 0x2d, 0x79, 0x05, 0xaf, 0x3a, 0x53, 0x3c, 0x24, 0xb9, 0xf7, 0xf4, 0xf8, - 0x90, 0x28, 0x14, 0x4e, 0x59, 0x51, 0xbe, 0x69, 0xf6, 0xec, 0x07, 0x8b, 0xf9, 0xe6, 0x9a, 0xed, - 0x5d, 0x72, 0x66, 0xff, 0xa5, 0x12, 0x9c, 0xef, 0x3e, 0xaf, 0x53, 0x9b, 0xbf, 0x9e, 0x3a, 0x70, - 0x33, 0x36, 0x3f, 0x53, 0xba, 0x34, 0xaa, 0xbe, 0xef, 0x29, 0x5f, 0x86, 0x69, 0x15, 0x89, 0xe4, - 0x7b, 0xcd, 0x3d, 0xed, 0x71, 0x1b, 0x15, 0xdc, 0xde, 0xc8, 0x12, 0xe0, 0xce, 0x32, 0x68, 0x01, - 0x26, 0x0d, 0xe0, 0x6a, 0x4d, 0xa8, 0xe4, 0xca, 0xc9, 0xd0, 0x30, 0xd1, 0x38, 0x4b, 0x6f, 0x7f, - 0xcd, 0x82, 0x07, 0x0a, 0x12, 0x6f, 0xf6, 0x7d, 0x0d, 0x77, 0x03, 0x26, 0x5b, 0x66, 0xd1, 0x1e, - 0xb7, 0xf5, 0x8d, 0xf4, 0x9e, 0xaa, 0xad, 0x19, 0x04, 0xce, 0x32, 0x5d, 0xbc, 0xf8, 0xad, 0xef, - 0x9d, 0xff, 0xd8, 0x1f, 0x7e, 0xef, 0xfc, 0xc7, 0xbe, 0xfb, 0xbd, 0xf3, 0x1f, 0xfb, 0xff, 0x0e, - 0xce, 0x5b, 0xdf, 0x3a, 0x38, 0x6f, 0xfd, 0xe1, 0xc1, 0x79, 0xeb, 0xbb, 0x07, 0xe7, 0xad, 0x3f, - 0x3d, 0x38, 0x6f, 0xfd, 0xfc, 0xf7, 0xcf, 0x7f, 0xec, 0xad, 0xd2, 0xee, 0xb3, 0xff, 0x37, 0x00, - 0x00, 0xff, 0xff, 0xba, 0x62, 0xf2, 0xf7, 0x5f, 0xca, 0x00, 0x00, + // 11611 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x90, 0x24, 0xc7, + 0x75, 0x18, 0xcc, 0xea, 0x9e, 0xab, 0xdf, 0xdc, 0xb9, 0x07, 0x7a, 0x07, 0xc0, 0xf6, 0xa2, 0x40, + 0x02, 0x8b, 0x6b, 0x46, 0x58, 0x00, 0x04, 0x44, 0x80, 0x90, 0x66, 0xa6, 0x67, 0x76, 0x07, 0x7b, + 0x35, 0xb2, 0x67, 0x17, 0x02, 0x08, 0x41, 0xac, 0xed, 0xca, 0x99, 0x29, 0x4c, 0x4d, 0x55, 0xa3, + 0xaa, 0x7a, 0x76, 0x07, 0x21, 0x46, 0x7c, 0x1f, 0x4d, 0xd1, 0x07, 0xf5, 0x43, 0xe1, 0x50, 0xd8, + 0xb2, 0xc8, 0x90, 0x23, 0x7c, 0x84, 0x44, 0xcb, 0x76, 0x48, 0xa6, 0xac, 0x83, 0x94, 0xc3, 0xb6, + 0x7c, 0x04, 0xf9, 0x47, 0x96, 0xf4, 0x87, 0x8c, 0x70, 0x78, 0x28, 0x0e, 0x1d, 0x76, 0xf8, 0x87, + 0x1d, 0xb6, 0xf5, 0x4b, 0x63, 0xd9, 0x74, 0xe4, 0x59, 0x99, 0xd5, 0x55, 0xdd, 0x3d, 0x8b, 0xdd, + 0x01, 0xc8, 0xf0, 0xbf, 0xee, 0xf7, 0x5e, 0xbe, 0xcc, 0xca, 0xe3, 0xe5, 0x7b, 0x2f, 0x5f, 0xbe, + 0x84, 0x97, 0xb7, 0x5f, 0x8a, 0xe7, 0xbd, 0x70, 0x61, 0xbb, 0x73, 0x8b, 0x44, 0x01, 0x49, 0x48, + 0xbc, 0xb0, 0x4b, 0x02, 0x37, 0x8c, 0x16, 0x04, 0xc2, 0x69, 0x7b, 0x0b, 0xad, 0x30, 0x22, 0x0b, + 0xbb, 0xcf, 0x2e, 0x6c, 0x92, 0x80, 0x44, 0x4e, 0x42, 0xdc, 0xf9, 0x76, 0x14, 0x26, 0x21, 0x42, + 0x9c, 0x66, 0xde, 0x69, 0x7b, 0xf3, 0x94, 0x66, 0x7e, 0xf7, 0xd9, 0xb9, 0x67, 0x36, 0xbd, 0x64, + 0xab, 0x73, 0x6b, 0xbe, 0x15, 0xee, 0x2c, 0x6c, 0x86, 0x9b, 0xe1, 0x02, 0x23, 0xbd, 0xd5, 0xd9, + 0x60, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0xb3, 0x98, 0x7b, 0x3e, 0xad, 0x66, 0xc7, 0x69, 0x6d, 0x79, + 0x01, 0x89, 0xf6, 0x16, 0xda, 0xdb, 0x9b, 0xac, 0xde, 0x88, 0xc4, 0x61, 0x27, 0x6a, 0x91, 0x6c, + 0xc5, 0x3d, 0x4b, 0xc5, 0x0b, 0x3b, 0x24, 0x71, 0x72, 0x9a, 0x3b, 0xb7, 0x50, 0x54, 0x2a, 0xea, + 0x04, 0x89, 0xb7, 0xd3, 0x5d, 0xcd, 0x27, 0xfb, 0x15, 0x88, 0x5b, 0x5b, 0x64, 0xc7, 0xe9, 0x2a, + 0xf7, 0x5c, 0x51, 0xb9, 0x4e, 0xe2, 0xf9, 0x0b, 0x5e, 0x90, 0xc4, 0x49, 0x94, 0x2d, 0x64, 0x7f, + 0xdb, 0x82, 0x73, 0x8b, 0x6f, 0x34, 0x57, 0x7c, 0x27, 0x4e, 0xbc, 0xd6, 0x92, 0x1f, 0xb6, 0xb6, + 0x9b, 0x49, 0x18, 0x91, 0x9b, 0xa1, 0xdf, 0xd9, 0x21, 0x4d, 0xd6, 0x11, 0xe8, 0x69, 0x18, 0xdb, + 0x65, 0xff, 0xd7, 0xea, 0x55, 0xeb, 0x9c, 0x75, 0xbe, 0xb2, 0x34, 0xf3, 0xcd, 0xfd, 0xda, 0xc7, + 0x0e, 0xf6, 0x6b, 0x63, 0x37, 0x05, 0x1c, 0x2b, 0x0a, 0xf4, 0x18, 0x8c, 0x6c, 0xc4, 0xeb, 0x7b, + 0x6d, 0x52, 0x2d, 0x31, 0xda, 0x29, 0x41, 0x3b, 0xb2, 0xda, 0xa4, 0x50, 0x2c, 0xb0, 0x68, 0x01, + 0x2a, 0x6d, 0x27, 0x4a, 0xbc, 0xc4, 0x0b, 0x83, 0x6a, 0xf9, 0x9c, 0x75, 0x7e, 0x78, 0x69, 0x56, + 0x90, 0x56, 0x1a, 0x12, 0x81, 0x53, 0x1a, 0xda, 0x8c, 0x88, 0x38, 0xee, 0xf5, 0xc0, 0xdf, 0xab, + 0x0e, 0x9d, 0xb3, 0xce, 0x8f, 0xa5, 0xcd, 0xc0, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0xcb, 0x25, 0x18, + 0x5b, 0xdc, 0xd8, 0xf0, 0x02, 0x2f, 0xd9, 0x43, 0x37, 0x61, 0x22, 0x08, 0x5d, 0x22, 0xff, 0xb3, + 0xaf, 0x18, 0xbf, 0x70, 0x6e, 0xbe, 0x7b, 0x2a, 0xcd, 0x5f, 0xd3, 0xe8, 0x96, 0x66, 0x0e, 0xf6, + 0x6b, 0x13, 0x3a, 0x04, 0x1b, 0x7c, 0x10, 0x86, 0xf1, 0x76, 0xe8, 0x2a, 0xb6, 0x25, 0xc6, 0xb6, + 0x96, 0xc7, 0xb6, 0x91, 0x92, 0x2d, 0x4d, 0x1f, 0xec, 0xd7, 0xc6, 0x35, 0x00, 0xd6, 0x99, 0xa0, + 0x5b, 0x30, 0x4d, 0xff, 0x06, 0x89, 0xa7, 0xf8, 0x96, 0x19, 0xdf, 0x47, 0x8b, 0xf8, 0x6a, 0xa4, + 0x4b, 0x27, 0x0e, 0xf6, 0x6b, 0xd3, 0x19, 0x20, 0xce, 0x32, 0xb4, 0xdf, 0x87, 0xa9, 0xc5, 0x24, + 0x71, 0x5a, 0x5b, 0xc4, 0xe5, 0x23, 0x88, 0x9e, 0x87, 0xa1, 0xc0, 0xd9, 0x21, 0x62, 0x7c, 0xcf, + 0x89, 0x8e, 0x1d, 0xba, 0xe6, 0xec, 0x90, 0xc3, 0xfd, 0xda, 0xcc, 0x8d, 0xc0, 0x7b, 0xaf, 0x23, + 0x66, 0x05, 0x85, 0x61, 0x46, 0x8d, 0x2e, 0x00, 0xb8, 0x64, 0xd7, 0x6b, 0x91, 0x86, 0x93, 0x6c, + 0x89, 0xf1, 0x46, 0xa2, 0x2c, 0xd4, 0x15, 0x06, 0x6b, 0x54, 0xf6, 0x1d, 0xa8, 0x2c, 0xee, 0x86, + 0x9e, 0xdb, 0x08, 0xdd, 0x18, 0x6d, 0xc3, 0x74, 0x3b, 0x22, 0x1b, 0x24, 0x52, 0xa0, 0xaa, 0x75, + 0xae, 0x7c, 0x7e, 0xfc, 0xc2, 0xf9, 0xdc, 0x8f, 0x35, 0x49, 0x57, 0x82, 0x24, 0xda, 0x5b, 0x7a, + 0x40, 0xd4, 0x37, 0x9d, 0xc1, 0xe2, 0x2c, 0x67, 0xfb, 0x5f, 0x97, 0xe0, 0xd4, 0xe2, 0xfb, 0x9d, + 0x88, 0xd4, 0xbd, 0x78, 0x3b, 0x3b, 0xc3, 0x5d, 0x2f, 0xde, 0xbe, 0x96, 0xf6, 0x80, 0x9a, 0x5a, + 0x75, 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x03, 0xa3, 0xf4, 0xf7, 0x0d, 0xbc, 0x26, 0x3e, 0xf9, 0x84, + 0x20, 0x1e, 0xaf, 0x3b, 0x89, 0x53, 0xe7, 0x28, 0x2c, 0x69, 0xd0, 0x55, 0x18, 0x6f, 0xb1, 0x05, + 0xb9, 0x79, 0x35, 0x74, 0x09, 0x1b, 0xcc, 0xca, 0xd2, 0x53, 0x94, 0x7c, 0x39, 0x05, 0x1f, 0xee, + 0xd7, 0xaa, 0xbc, 0x6d, 0x82, 0x85, 0x86, 0xc3, 0x7a, 0x79, 0x64, 0xab, 0xf5, 0x35, 0xc4, 0x38, + 0x41, 0xce, 0xda, 0x3a, 0xaf, 0x2d, 0x95, 0x61, 0xb6, 0x54, 0x26, 0xf2, 0x97, 0x09, 0x7a, 0x16, + 0x86, 0xb6, 0xbd, 0xc0, 0xad, 0x8e, 0x30, 0x5e, 0x0f, 0xd3, 0x31, 0xbf, 0xec, 0x05, 0xee, 0xe1, + 0x7e, 0x6d, 0xd6, 0x68, 0x0e, 0x05, 0x62, 0x46, 0x6a, 0xff, 0x99, 0x05, 0x35, 0x86, 0x5b, 0xf5, + 0x7c, 0xd2, 0x20, 0x51, 0xec, 0xc5, 0x09, 0x09, 0x12, 0xa3, 0x43, 0x2f, 0x00, 0xc4, 0xa4, 0x15, + 0x91, 0x44, 0xeb, 0x52, 0x35, 0x31, 0x9a, 0x0a, 0x83, 0x35, 0x2a, 0x2a, 0x10, 0xe2, 0x2d, 0x27, + 0x62, 0xf3, 0x4b, 0x74, 0xac, 0x12, 0x08, 0x4d, 0x89, 0xc0, 0x29, 0x8d, 0x21, 0x10, 0xca, 0xfd, + 0x04, 0x02, 0xfa, 0x34, 0x4c, 0xa7, 0x95, 0xc5, 0x6d, 0xa7, 0x25, 0x3b, 0x90, 0x2d, 0x99, 0xa6, + 0x89, 0xc2, 0x59, 0x5a, 0xfb, 0x1f, 0x58, 0x62, 0xf2, 0xd0, 0xaf, 0xfe, 0x88, 0x7f, 0xab, 0xfd, + 0xbb, 0x16, 0x8c, 0x2e, 0x79, 0x81, 0xeb, 0x05, 0x9b, 0xe8, 0xb3, 0x30, 0x46, 0xf7, 0x26, 0xd7, + 0x49, 0x1c, 0x21, 0xf7, 0x7e, 0x4c, 0x5b, 0x5b, 0x6a, 0xab, 0x98, 0x6f, 0x6f, 0x6f, 0x52, 0x40, + 0x3c, 0x4f, 0xa9, 0xe9, 0x6a, 0xbb, 0x7e, 0xeb, 0x5d, 0xd2, 0x4a, 0xae, 0x92, 0xc4, 0x49, 0x3f, + 0x27, 0x85, 0x61, 0xc5, 0x15, 0x5d, 0x86, 0x91, 0xc4, 0x89, 0x36, 0x49, 0x22, 0x04, 0x60, 0xae, + 0xa0, 0xe2, 0x25, 0x31, 0x5d, 0x91, 0x24, 0x68, 0x91, 0x74, 0x5b, 0x58, 0x67, 0x45, 0xb1, 0x60, + 0x61, 0xb7, 0x60, 0x62, 0xd9, 0x69, 0x3b, 0xb7, 0x3c, 0xdf, 0x4b, 0x3c, 0x12, 0xa3, 0xc7, 0xa1, + 0xec, 0xb8, 0x2e, 0x93, 0x0a, 0x95, 0xa5, 0x53, 0x07, 0xfb, 0xb5, 0xf2, 0xa2, 0x4b, 0xa7, 0x27, + 0x28, 0xaa, 0x3d, 0x4c, 0x29, 0xd0, 0x93, 0x30, 0xe4, 0x46, 0x61, 0xbb, 0x5a, 0x62, 0x94, 0xa7, + 0xe9, 0x4c, 0xae, 0x47, 0x61, 0x3b, 0x43, 0xca, 0x68, 0xec, 0x6f, 0x94, 0x00, 0x2d, 0x93, 0xf6, + 0xd6, 0x6a, 0xd3, 0x18, 0xc9, 0xf3, 0x30, 0xb6, 0x13, 0x06, 0x5e, 0x12, 0x46, 0xb1, 0xa8, 0x90, + 0x2d, 0x9b, 0xab, 0x02, 0x86, 0x15, 0x16, 0x9d, 0x83, 0xa1, 0x76, 0x2a, 0xf2, 0x26, 0xa4, 0xb8, + 0x64, 0xc2, 0x8e, 0x61, 0x28, 0x45, 0x27, 0x26, 0x91, 0x58, 0xee, 0x8a, 0xe2, 0x46, 0x4c, 0x22, + 0xcc, 0x30, 0xe9, 0xbc, 0xa1, 0x33, 0x4a, 0xcc, 0xc5, 0xcc, 0xbc, 0xa1, 0x18, 0xac, 0x51, 0xa1, + 0x1b, 0x50, 0xe1, 0xff, 0x30, 0xd9, 0x60, 0x2b, 0xbb, 0x40, 0x52, 0x5e, 0x09, 0x5b, 0x8e, 0x9f, + 0xed, 0xf2, 0x49, 0x36, 0xbb, 0x64, 0x71, 0x9c, 0x72, 0x32, 0x66, 0xd7, 0x48, 0xdf, 0xd9, 0xf5, + 0x4b, 0x16, 0xa0, 0x65, 0x2f, 0x70, 0x49, 0x74, 0x0c, 0x6a, 0xc2, 0xd1, 0x26, 0xfe, 0xbf, 0xa7, + 0x4d, 0x0b, 0x77, 0xda, 0x61, 0x40, 0x82, 0x64, 0x39, 0x0c, 0x5c, 0xae, 0x3a, 0x7c, 0x0a, 0x86, + 0x12, 0x5a, 0x15, 0x6f, 0xd6, 0x63, 0x72, 0x30, 0x68, 0x05, 0x87, 0xfb, 0xb5, 0xd3, 0xdd, 0x25, + 0x58, 0x13, 0x58, 0x19, 0xf4, 0xe3, 0x30, 0x12, 0x27, 0x4e, 0xd2, 0x89, 0x45, 0x43, 0x1f, 0x91, + 0x0d, 0x6d, 0x32, 0xe8, 0xe1, 0x7e, 0x6d, 0x5a, 0x15, 0xe3, 0x20, 0x2c, 0x0a, 0xa0, 0x27, 0x60, + 0x74, 0x87, 0xc4, 0xb1, 0xb3, 0x29, 0xa5, 0xfe, 0xb4, 0x28, 0x3b, 0x7a, 0x95, 0x83, 0xb1, 0xc4, + 0xa3, 0x47, 0x61, 0x98, 0x44, 0x51, 0x18, 0x89, 0x79, 0x30, 0x29, 0x08, 0x87, 0x57, 0x28, 0x10, + 0x73, 0x9c, 0xfd, 0xef, 0x2c, 0x98, 0x56, 0x6d, 0xe5, 0x75, 0x1d, 0xc3, 0xf2, 0x7e, 0x0b, 0xa0, + 0x25, 0x3f, 0x30, 0x66, 0xcb, 0x6b, 0xfc, 0xc2, 0x63, 0x79, 0x93, 0xae, 0xbb, 0x1b, 0x53, 0xce, + 0x0a, 0x14, 0x63, 0x8d, 0x9b, 0xfd, 0xcf, 0x2c, 0x38, 0x91, 0xf9, 0xa2, 0x2b, 0x5e, 0x9c, 0xa0, + 0xb7, 0xbb, 0xbe, 0x6a, 0x7e, 0xb0, 0xaf, 0xa2, 0xa5, 0xd9, 0x37, 0xa9, 0x59, 0x22, 0x21, 0xda, + 0x17, 0x5d, 0x82, 0x61, 0x2f, 0x21, 0x3b, 0xf2, 0x63, 0x1e, 0xed, 0xf9, 0x31, 0xbc, 0x55, 0xe9, + 0x88, 0xac, 0xd1, 0x92, 0x98, 0x33, 0xb0, 0xff, 0x87, 0x05, 0x95, 0xe5, 0x30, 0xd8, 0xf0, 0x36, + 0xaf, 0x3a, 0xed, 0x63, 0x18, 0x8b, 0x35, 0x18, 0x62, 0xdc, 0x79, 0xc3, 0x1f, 0xcf, 0x6f, 0xb8, + 0x68, 0xce, 0x3c, 0xdd, 0xbb, 0xb9, 0x8e, 0xa4, 0xc4, 0x0f, 0x05, 0x61, 0xc6, 0x62, 0xee, 0x45, + 0xa8, 0x28, 0x02, 0x34, 0x03, 0xe5, 0x6d, 0xc2, 0xf5, 0xe2, 0x0a, 0xa6, 0x3f, 0xd1, 0x49, 0x18, + 0xde, 0x75, 0xfc, 0x8e, 0x58, 0x9e, 0x98, 0xff, 0xf9, 0x54, 0xe9, 0x25, 0xcb, 0xfe, 0x3a, 0x5b, + 0x63, 0xa2, 0x92, 0x95, 0x60, 0x57, 0x2c, 0xff, 0xf7, 0xe1, 0xa4, 0x9f, 0x23, 0x75, 0x44, 0x47, + 0x0c, 0x2e, 0xa5, 0x1e, 0x12, 0x6d, 0x3d, 0x99, 0x87, 0xc5, 0xb9, 0x75, 0x50, 0xc1, 0x1d, 0xb6, + 0xe9, 0x8c, 0x72, 0x7c, 0xd6, 0x5e, 0xa1, 0xef, 0x5c, 0x17, 0x30, 0xac, 0xb0, 0x54, 0x40, 0x9c, + 0x54, 0x8d, 0xbf, 0x4c, 0xf6, 0x9a, 0xc4, 0x27, 0xad, 0x24, 0x8c, 0x3e, 0xd4, 0xe6, 0x3f, 0xcc, + 0x7b, 0x9f, 0xcb, 0x97, 0x71, 0xc1, 0xa0, 0x7c, 0x99, 0xec, 0xf1, 0xa1, 0xd0, 0xbf, 0xae, 0xdc, + 0xf3, 0xeb, 0x7e, 0xd3, 0x82, 0x49, 0xf5, 0x75, 0xc7, 0xb0, 0x90, 0x96, 0xcc, 0x85, 0xf4, 0x70, + 0xcf, 0xf9, 0x58, 0xb0, 0x84, 0x7e, 0xc0, 0x44, 0x80, 0xa0, 0x69, 0x44, 0x21, 0xed, 0x1a, 0x2a, + 0xb3, 0x3f, 0xcc, 0x01, 0x19, 0xe4, 0xbb, 0x2e, 0x93, 0xbd, 0xf5, 0x90, 0x6e, 0xf8, 0xf9, 0xdf, + 0x65, 0x8c, 0xda, 0x50, 0xcf, 0x51, 0xfb, 0xad, 0x12, 0x9c, 0x52, 0x3d, 0x60, 0x6c, 0xa9, 0x3f, + 0xec, 0x7d, 0xf0, 0x2c, 0x8c, 0xbb, 0x64, 0xc3, 0xe9, 0xf8, 0x89, 0x32, 0x7d, 0x86, 0xb9, 0xf9, + 0x5b, 0x4f, 0xc1, 0x58, 0xa7, 0x39, 0x42, 0xb7, 0xfd, 0x1b, 0x60, 0xb2, 0x37, 0x71, 0xe8, 0x0c, + 0xa6, 0xfa, 0x96, 0x66, 0xc0, 0x4e, 0xe8, 0x06, 0xac, 0x30, 0x56, 0x1f, 0x85, 0x61, 0x6f, 0x87, + 0xee, 0xc5, 0x25, 0x73, 0x8b, 0x5d, 0xa3, 0x40, 0xcc, 0x71, 0xe8, 0x13, 0x30, 0xda, 0x0a, 0x77, + 0x76, 0x9c, 0xc0, 0xad, 0x96, 0x99, 0x06, 0x38, 0x4e, 0xb7, 0xeb, 0x65, 0x0e, 0xc2, 0x12, 0x87, + 0x1e, 0x82, 0x21, 0x27, 0xda, 0x8c, 0xab, 0x43, 0x8c, 0x66, 0x8c, 0xd6, 0xb4, 0x18, 0x6d, 0xc6, + 0x98, 0x41, 0xa9, 0x66, 0x77, 0x3b, 0x8c, 0xb6, 0xbd, 0x60, 0xb3, 0xee, 0x45, 0x4c, 0x4d, 0xd3, + 0x34, 0xbb, 0x37, 0x14, 0x06, 0x6b, 0x54, 0x68, 0x15, 0x86, 0xdb, 0x61, 0x94, 0xc4, 0xd5, 0x11, + 0xd6, 0xdd, 0x8f, 0x14, 0x2c, 0x25, 0xfe, 0xb5, 0x8d, 0x30, 0x4a, 0xd2, 0x0f, 0xa0, 0xff, 0x62, + 0xcc, 0x8b, 0xa3, 0x1f, 0x87, 0x32, 0x09, 0x76, 0xab, 0xa3, 0x8c, 0xcb, 0x5c, 0x1e, 0x97, 0x95, + 0x60, 0xf7, 0xa6, 0x13, 0xa5, 0x72, 0x66, 0x25, 0xd8, 0xc5, 0xb4, 0x0c, 0x7a, 0x13, 0x2a, 0xd2, + 0xf9, 0x15, 0x57, 0xc7, 0x8a, 0xa7, 0x18, 0x16, 0x44, 0x98, 0xbc, 0xd7, 0xf1, 0x22, 0xb2, 0x43, + 0x82, 0x24, 0x4e, 0xcd, 0x17, 0x89, 0x8d, 0x71, 0xca, 0x0d, 0xbd, 0x09, 0x13, 0x5c, 0xf3, 0xbb, + 0x1a, 0x76, 0x82, 0x24, 0xae, 0x56, 0x58, 0xf3, 0x72, 0x3d, 0x25, 0x37, 0x53, 0xba, 0xa5, 0x93, + 0x82, 0xe9, 0x84, 0x06, 0x8c, 0xb1, 0xc1, 0x0a, 0x61, 0x98, 0xf4, 0xbd, 0x5d, 0x12, 0x90, 0x38, + 0x6e, 0x44, 0xe1, 0x2d, 0x52, 0x05, 0xd6, 0xf2, 0x33, 0xf9, 0x0e, 0x84, 0xf0, 0x16, 0x59, 0x9a, + 0x3d, 0xd8, 0xaf, 0x4d, 0x5e, 0xd1, 0xcb, 0x60, 0x93, 0x05, 0xba, 0x01, 0x53, 0x54, 0xa5, 0xf4, + 0x52, 0xa6, 0xe3, 0xfd, 0x98, 0xa2, 0x83, 0xfd, 0xda, 0x14, 0x36, 0x0a, 0xe1, 0x0c, 0x13, 0xf4, + 0x1a, 0x54, 0x7c, 0x6f, 0x83, 0xb4, 0xf6, 0x5a, 0x3e, 0xa9, 0x4e, 0x30, 0x8e, 0xb9, 0xcb, 0xea, + 0x8a, 0x24, 0xe2, 0x2a, 0xbb, 0xfa, 0x8b, 0xd3, 0xe2, 0xe8, 0x26, 0x9c, 0x4e, 0x48, 0xb4, 0xe3, + 0x05, 0x0e, 0x5d, 0x0e, 0x42, 0x9f, 0x64, 0x6e, 0x98, 0x49, 0x36, 0xdf, 0xce, 0x8a, 0xae, 0x3b, + 0xbd, 0x9e, 0x4b, 0x85, 0x0b, 0x4a, 0xa3, 0xeb, 0x30, 0xcd, 0x56, 0x42, 0xa3, 0xe3, 0xfb, 0x8d, + 0xd0, 0xf7, 0x5a, 0x7b, 0xd5, 0x29, 0xc6, 0xf0, 0x13, 0xd2, 0xcf, 0xb2, 0x66, 0xa2, 0xa9, 0x81, + 0x95, 0xfe, 0xc3, 0xd9, 0xd2, 0xe8, 0x16, 0xb3, 0xbb, 0x3b, 0x91, 0x97, 0xec, 0xd1, 0xf9, 0x4b, + 0xee, 0x24, 0xd5, 0xe9, 0x62, 0x33, 0xb1, 0x69, 0x92, 0x2a, 0xe3, 0x5c, 0x07, 0xe2, 0x2c, 0x43, + 0xba, 0xb4, 0xe3, 0xc4, 0xf5, 0x82, 0xea, 0x0c, 0x93, 0x18, 0x6a, 0x65, 0x34, 0x29, 0x10, 0x73, + 0x1c, 0xb3, 0xb9, 0xe9, 0x8f, 0xeb, 0x54, 0x82, 0xce, 0x32, 0xc2, 0xd4, 0xe6, 0x96, 0x08, 0x9c, + 0xd2, 0xd0, 0x6d, 0x39, 0x49, 0xf6, 0xaa, 0x88, 0x91, 0xaa, 0xe5, 0xb2, 0xbe, 0xfe, 0x26, 0xa6, + 0x70, 0x74, 0x05, 0x46, 0x49, 0xb0, 0xbb, 0x1a, 0x85, 0x3b, 0xd5, 0x13, 0xc5, 0x6b, 0x76, 0x85, + 0x93, 0x70, 0x81, 0x9e, 0x1a, 0x00, 0x02, 0x8c, 0x25, 0x0b, 0x74, 0x07, 0xaa, 0x39, 0x23, 0xc2, + 0x07, 0xe0, 0x24, 0x1b, 0x80, 0x57, 0x44, 0xd9, 0xea, 0x7a, 0x01, 0xdd, 0x61, 0x0f, 0x1c, 0x2e, + 0xe4, 0x6e, 0xdf, 0x82, 0x29, 0x25, 0x58, 0xd8, 0xd8, 0xa2, 0x1a, 0x0c, 0x53, 0x89, 0x29, 0x8d, + 0xe0, 0x0a, 0xed, 0x4a, 0xe6, 0x09, 0xc1, 0x1c, 0xce, 0xba, 0xd2, 0x7b, 0x9f, 0x2c, 0xed, 0x25, + 0x84, 0x9b, 0x45, 0x65, 0xad, 0x2b, 0x25, 0x02, 0xa7, 0x34, 0xf6, 0xff, 0xe1, 0x8a, 0x49, 0x2a, + 0xbd, 0x06, 0x90, 0xd7, 0x4f, 0xc3, 0xd8, 0x56, 0x18, 0x27, 0x94, 0x9a, 0xd5, 0x31, 0x9c, 0xaa, + 0x22, 0x97, 0x04, 0x1c, 0x2b, 0x0a, 0xf4, 0x32, 0x4c, 0xb6, 0xf4, 0x0a, 0xc4, 0x66, 0x73, 0x4a, + 0x14, 0x31, 0x6b, 0xc7, 0x26, 0x2d, 0x7a, 0x09, 0xc6, 0x98, 0x3f, 0xbc, 0x15, 0xfa, 0xc2, 0x00, + 0x93, 0x3b, 0xe6, 0x58, 0x43, 0xc0, 0x0f, 0xb5, 0xdf, 0x58, 0x51, 0x53, 0x33, 0x96, 0x36, 0x61, + 0xad, 0x21, 0xc4, 0xbc, 0x32, 0x63, 0x2f, 0x31, 0x28, 0x16, 0x58, 0xfb, 0xaf, 0x97, 0xb4, 0x5e, + 0xa6, 0x26, 0x05, 0x41, 0x0d, 0x18, 0xbd, 0xed, 0x78, 0x89, 0x17, 0x6c, 0x8a, 0xfd, 0xfc, 0x89, + 0x9e, 0x32, 0x9f, 0x15, 0x7a, 0x83, 0x17, 0xe0, 0xbb, 0x92, 0xf8, 0x83, 0x25, 0x1b, 0xca, 0x31, + 0xea, 0x04, 0x01, 0xe5, 0x58, 0x1a, 0x94, 0x23, 0xe6, 0x05, 0x38, 0x47, 0xf1, 0x07, 0x4b, 0x36, + 0xe8, 0x6d, 0x00, 0x39, 0x6f, 0x88, 0x2b, 0xfc, 0xd0, 0x4f, 0xf7, 0x67, 0xba, 0xae, 0xca, 0x2c, + 0x4d, 0xd1, 0x3d, 0x2f, 0xfd, 0x8f, 0x35, 0x7e, 0x76, 0xc2, 0xf4, 0x9e, 0xee, 0xc6, 0xa0, 0xcf, + 0xd0, 0xa5, 0xea, 0x44, 0x09, 0x71, 0x17, 0x13, 0xd1, 0x39, 0x4f, 0x0e, 0xa6, 0xb6, 0xae, 0x7b, + 0x3b, 0x44, 0x5f, 0xd6, 0x82, 0x09, 0x4e, 0xf9, 0xd9, 0xbf, 0x53, 0x86, 0x6a, 0x51, 0x73, 0xe9, + 0xa4, 0x23, 0x77, 0xbc, 0x64, 0x99, 0xaa, 0x2b, 0x96, 0x39, 0xe9, 0x56, 0x04, 0x1c, 0x2b, 0x0a, + 0x3a, 0xfa, 0xb1, 0xb7, 0x29, 0xad, 0x8e, 0xe1, 0x74, 0xf4, 0x9b, 0x0c, 0x8a, 0x05, 0x96, 0xd2, + 0x45, 0xc4, 0x89, 0xc5, 0x41, 0x87, 0x36, 0x4b, 0x30, 0x83, 0x62, 0x81, 0xd5, 0x1d, 0x06, 0x43, + 0x7d, 0x1c, 0x06, 0x46, 0x17, 0x0d, 0xdf, 0xdb, 0x2e, 0x42, 0xef, 0x00, 0x6c, 0x78, 0x81, 0x17, + 0x6f, 0x31, 0xee, 0x23, 0x47, 0xe6, 0xae, 0x94, 0x9d, 0x55, 0xc5, 0x05, 0x6b, 0x1c, 0xd1, 0x0b, + 0x30, 0xae, 0x16, 0xe0, 0x5a, 0xbd, 0x3a, 0x6a, 0x7a, 0xd1, 0x53, 0x69, 0x54, 0xc7, 0x3a, 0x9d, + 0xfd, 0x6e, 0x76, 0xbe, 0x88, 0x15, 0xa0, 0xf5, 0xaf, 0x35, 0x68, 0xff, 0x96, 0x7a, 0xf7, 0xaf, + 0xfd, 0x07, 0x65, 0x98, 0x36, 0x2a, 0xeb, 0xc4, 0x03, 0xc8, 0xac, 0x8b, 0x74, 0x23, 0x72, 0x12, + 0x22, 0xd6, 0x9f, 0xdd, 0x7f, 0xa9, 0xe8, 0x9b, 0x15, 0x5d, 0x01, 0xbc, 0x3c, 0x7a, 0x07, 0x2a, + 0xbe, 0x13, 0x33, 0xe7, 0x03, 0x11, 0xeb, 0x6e, 0x10, 0x66, 0xa9, 0xa2, 0xef, 0xc4, 0x89, 0xb6, + 0x17, 0x70, 0xde, 0x29, 0x4b, 0xba, 0x63, 0x52, 0xe5, 0x44, 0x9e, 0xa4, 0xa9, 0x46, 0x50, 0x0d, + 0x66, 0x0f, 0x73, 0x1c, 0x7a, 0x09, 0x26, 0x22, 0xc2, 0x66, 0xc5, 0x32, 0xd5, 0xb5, 0xd8, 0x34, + 0x1b, 0x4e, 0x95, 0x32, 0xac, 0xe1, 0xb0, 0x41, 0x99, 0xea, 0xda, 0x23, 0x3d, 0x74, 0xed, 0x27, + 0x60, 0x94, 0xfd, 0x50, 0x33, 0x40, 0x8d, 0xc6, 0x1a, 0x07, 0x63, 0x89, 0xcf, 0x4e, 0x98, 0xb1, + 0x01, 0x27, 0xcc, 0x93, 0x30, 0x55, 0x77, 0xc8, 0x4e, 0x18, 0xac, 0x04, 0x6e, 0x3b, 0xf4, 0x82, + 0x04, 0x55, 0x61, 0x88, 0xed, 0x0e, 0x7c, 0x6d, 0x0f, 0x51, 0x0e, 0x78, 0x88, 0x6a, 0xce, 0xf6, + 0x1f, 0x97, 0x60, 0xb2, 0x4e, 0x7c, 0x92, 0x10, 0x6e, 0x6b, 0xc4, 0x68, 0x15, 0xd0, 0x66, 0xe4, + 0xb4, 0x48, 0x83, 0x44, 0x5e, 0xe8, 0x36, 0x49, 0x2b, 0x0c, 0xd8, 0xf9, 0x14, 0xdd, 0xee, 0x4e, + 0x1f, 0xec, 0xd7, 0xd0, 0xc5, 0x2e, 0x2c, 0xce, 0x29, 0x81, 0xde, 0x82, 0xc9, 0x76, 0x44, 0x0c, + 0x1f, 0x9a, 0x55, 0xa4, 0x2e, 0x34, 0x74, 0x42, 0xae, 0xa9, 0x1a, 0x20, 0x6c, 0xb2, 0x42, 0x3f, + 0x09, 0x33, 0x61, 0xd4, 0xde, 0x72, 0x82, 0x3a, 0x69, 0x93, 0xc0, 0xa5, 0xaa, 0xb8, 0xf0, 0x11, + 0x9c, 0x3c, 0xd8, 0xaf, 0xcd, 0x5c, 0xcf, 0xe0, 0x70, 0x17, 0x35, 0x7a, 0x0b, 0x66, 0xdb, 0x51, + 0xd8, 0x76, 0x36, 0xd9, 0x44, 0x11, 0x1a, 0x07, 0x97, 0x3e, 0x4f, 0x1f, 0xec, 0xd7, 0x66, 0x1b, + 0x59, 0xe4, 0xe1, 0x7e, 0xed, 0x04, 0xeb, 0x28, 0x0a, 0x49, 0x91, 0xb8, 0x9b, 0x8d, 0xbd, 0x09, + 0xa7, 0xea, 0xe1, 0xed, 0xe0, 0xb6, 0x13, 0xb9, 0x8b, 0x8d, 0x35, 0xcd, 0xb8, 0xbf, 0x26, 0x8d, + 0x4b, 0x7e, 0xda, 0x97, 0xbb, 0x4f, 0x69, 0x25, 0xb9, 0xfa, 0xbf, 0xea, 0xf9, 0xa4, 0xc0, 0x89, + 0xf0, 0x37, 0x4b, 0x46, 0x4d, 0x29, 0xbd, 0xf2, 0xd4, 0x5b, 0x85, 0x9e, 0xfa, 0xd7, 0x61, 0x6c, + 0xc3, 0x23, 0xbe, 0x8b, 0xc9, 0x86, 0x18, 0x99, 0xc7, 0x8b, 0x0f, 0x30, 0x56, 0x29, 0xa5, 0x74, + 0x1a, 0x71, 0xd3, 0x74, 0x55, 0x14, 0xc6, 0x8a, 0x0d, 0xda, 0x86, 0x19, 0x69, 0xfb, 0x48, 0xac, + 0x58, 0xc4, 0x4f, 0xf4, 0x32, 0xa8, 0x4c, 0xe6, 0x6c, 0x00, 0x71, 0x86, 0x0d, 0xee, 0x62, 0x4c, + 0x6d, 0xd1, 0x1d, 0xba, 0x5d, 0x0d, 0xb1, 0x29, 0xcd, 0x6c, 0x51, 0x66, 0x56, 0x33, 0xa8, 0xfd, + 0x15, 0x0b, 0x1e, 0xe8, 0xea, 0x19, 0xe1, 0x5e, 0xb8, 0xc7, 0xa3, 0x90, 0x35, 0xf7, 0x4b, 0xfd, + 0xcd, 0x7d, 0xfb, 0x37, 0x2c, 0x38, 0xb9, 0xb2, 0xd3, 0x4e, 0xf6, 0xea, 0x9e, 0x79, 0x9a, 0xf0, + 0x22, 0x8c, 0xec, 0x10, 0xd7, 0xeb, 0xec, 0x88, 0x91, 0xab, 0x49, 0x91, 0x7e, 0x95, 0x41, 0x0f, + 0xf7, 0x6b, 0x93, 0xcd, 0x24, 0x8c, 0x9c, 0x4d, 0xc2, 0x01, 0x58, 0x90, 0xa3, 0x9f, 0xe1, 0xba, + 0xe9, 0x15, 0x6f, 0xc7, 0x93, 0x07, 0x52, 0x3d, 0x5d, 0x5e, 0xf3, 0xb2, 0x43, 0xe7, 0x5f, 0xef, + 0x38, 0x41, 0xe2, 0x25, 0x7b, 0xa6, 0x2e, 0xcb, 0x18, 0xe1, 0x94, 0xa7, 0xfd, 0x6d, 0x0b, 0xa6, + 0xa5, 0x3c, 0x59, 0x74, 0xdd, 0x88, 0xc4, 0x31, 0x9a, 0x83, 0x92, 0xd7, 0x16, 0x2d, 0x05, 0x51, + 0xba, 0xb4, 0xd6, 0xc0, 0x25, 0xaf, 0x8d, 0x1a, 0x50, 0xe1, 0x67, 0x5b, 0xe9, 0x04, 0x1b, 0xe8, + 0x84, 0x8c, 0xd9, 0x7e, 0xeb, 0xb2, 0x24, 0x4e, 0x99, 0x48, 0xcd, 0x98, 0xed, 0x45, 0x65, 0xf3, + 0xa4, 0xe5, 0x92, 0x80, 0x63, 0x45, 0x81, 0xce, 0xc3, 0x58, 0x10, 0xba, 0xfc, 0xa8, 0x91, 0xaf, + 0x6b, 0x36, 0x6d, 0xaf, 0x09, 0x18, 0x56, 0x58, 0xfb, 0xe7, 0x2d, 0x98, 0x90, 0x5f, 0x36, 0xa0, + 0x92, 0x4e, 0x97, 0x57, 0xaa, 0xa0, 0xa7, 0xcb, 0x8b, 0x2a, 0xd9, 0x0c, 0x63, 0xe8, 0xd6, 0xe5, + 0xa3, 0xe8, 0xd6, 0xf6, 0x97, 0x4b, 0x30, 0x25, 0x9b, 0xd3, 0xec, 0xdc, 0x8a, 0x49, 0x82, 0xd6, + 0xa1, 0xe2, 0xf0, 0x2e, 0x27, 0x72, 0xd6, 0x3e, 0x9a, 0x6f, 0x75, 0x19, 0xe3, 0x93, 0x8e, 0xe8, + 0xa2, 0x2c, 0x8d, 0x53, 0x46, 0xc8, 0x87, 0xd9, 0x20, 0x4c, 0xd8, 0xd6, 0xa7, 0xf0, 0xbd, 0xce, + 0x06, 0xb2, 0xdc, 0xcf, 0x08, 0xee, 0xb3, 0xd7, 0xb2, 0x5c, 0x70, 0x37, 0x63, 0xb4, 0x22, 0x3d, + 0x3d, 0x65, 0x56, 0xc3, 0xb9, 0x5e, 0x35, 0x14, 0x3b, 0x7a, 0xec, 0xdf, 0xb7, 0xa0, 0x22, 0xc9, + 0x8e, 0xe3, 0x18, 0xe8, 0x2a, 0x8c, 0xc6, 0x6c, 0x10, 0x64, 0xd7, 0xd8, 0xbd, 0x1a, 0xce, 0xc7, + 0x2b, 0xdd, 0xd1, 0xf9, 0xff, 0x18, 0x4b, 0x1e, 0xcc, 0x55, 0xad, 0x9a, 0xff, 0x11, 0x71, 0x55, + 0xab, 0xf6, 0x14, 0xec, 0x32, 0xff, 0x99, 0xb5, 0x59, 0xb3, 0xe7, 0xa9, 0xe2, 0xd9, 0x8e, 0xc8, + 0x86, 0x77, 0x27, 0xab, 0x78, 0x36, 0x18, 0x14, 0x0b, 0x2c, 0x7a, 0x1b, 0x26, 0x5a, 0xd2, 0xc3, + 0x9b, 0x8a, 0x81, 0xc7, 0x7a, 0xfa, 0xcb, 0xd5, 0xd1, 0x0a, 0x0f, 0x43, 0x5a, 0xd6, 0xca, 0x63, + 0x83, 0x1b, 0x95, 0x30, 0xe9, 0xa9, 0x70, 0xb9, 0xa7, 0x73, 0x25, 0x22, 0x49, 0xca, 0xb7, 0xf0, + 0x40, 0xd8, 0xfe, 0x15, 0x0b, 0x46, 0xb8, 0x9f, 0x70, 0x30, 0xc7, 0xaa, 0x76, 0x54, 0x94, 0xf6, + 0xdd, 0x4d, 0x0a, 0x14, 0x27, 0x47, 0xe8, 0x2a, 0x54, 0xd8, 0x0f, 0xe6, 0x2f, 0x29, 0x17, 0xc7, + 0x5f, 0xf1, 0x5a, 0xf5, 0x06, 0xde, 0x94, 0xc5, 0x70, 0xca, 0xc1, 0xfe, 0xc5, 0x32, 0x15, 0x55, + 0x29, 0xa9, 0xb1, 0x8b, 0x5b, 0xf7, 0x6f, 0x17, 0x2f, 0xdd, 0xaf, 0x5d, 0x7c, 0x13, 0xa6, 0x5b, + 0xda, 0xb9, 0x54, 0x3a, 0x92, 0xe7, 0x7b, 0x4e, 0x12, 0xed, 0x08, 0x8b, 0xfb, 0xca, 0x96, 0x4d, + 0x26, 0x38, 0xcb, 0x15, 0x7d, 0x06, 0x26, 0xf8, 0x38, 0x8b, 0x5a, 0x86, 0x58, 0x2d, 0x9f, 0x28, + 0x9e, 0x2f, 0x7a, 0x15, 0x6c, 0x26, 0x36, 0xb5, 0xe2, 0xd8, 0x60, 0x66, 0x7f, 0x71, 0x18, 0x86, + 0x57, 0x76, 0x49, 0x90, 0x1c, 0x83, 0x40, 0x6a, 0xc1, 0x94, 0x17, 0xec, 0x86, 0xfe, 0x2e, 0x71, + 0x39, 0xfe, 0x28, 0x9b, 0xeb, 0x69, 0xc1, 0x7a, 0x6a, 0xcd, 0x60, 0x81, 0x33, 0x2c, 0xef, 0x87, + 0xe5, 0x7e, 0x11, 0x46, 0xf8, 0xd8, 0x0b, 0xb3, 0x3d, 0xd7, 0x0b, 0xce, 0x3a, 0x51, 0xac, 0x82, + 0xd4, 0xab, 0xc0, 0xdd, 0xee, 0xa2, 0x38, 0x7a, 0x17, 0xa6, 0x36, 0xbc, 0x28, 0x4e, 0xa8, 0xc9, + 0x1d, 0x27, 0xce, 0x4e, 0xfb, 0x2e, 0x2c, 0x75, 0xd5, 0x0f, 0xab, 0x06, 0x27, 0x9c, 0xe1, 0x8c, + 0x36, 0x61, 0x92, 0x1a, 0x8f, 0x69, 0x55, 0xa3, 0x47, 0xae, 0x4a, 0xb9, 0xe2, 0xae, 0xe8, 0x8c, + 0xb0, 0xc9, 0x97, 0x0a, 0x93, 0x16, 0x33, 0x36, 0xc7, 0x98, 0x46, 0xa1, 0x84, 0x09, 0xb7, 0x32, + 0x39, 0x8e, 0xca, 0x24, 0x16, 0xcf, 0x51, 0x31, 0x65, 0x52, 0x1a, 0xb5, 0x61, 0x7f, 0x95, 0xee, + 0x8e, 0xb4, 0x0f, 0x8f, 0x61, 0x6b, 0x79, 0xd5, 0xdc, 0x5a, 0xce, 0x14, 0x8e, 0x67, 0xc1, 0xb6, + 0xf2, 0x59, 0x18, 0xd7, 0x86, 0x1b, 0x2d, 0x40, 0xa5, 0x25, 0x83, 0x0f, 0x84, 0xd4, 0x55, 0xea, + 0x8b, 0x8a, 0x4a, 0xc0, 0x29, 0x0d, 0xed, 0x0d, 0xaa, 0xec, 0x65, 0x83, 0x91, 0xa8, 0x2a, 0x88, + 0x19, 0xc6, 0x7e, 0x0e, 0x60, 0xe5, 0x0e, 0x69, 0x2d, 0x72, 0xe3, 0x4b, 0x3b, 0xe3, 0xb2, 0x8a, + 0xcf, 0xb8, 0xec, 0x3f, 0xb1, 0x60, 0x6a, 0x75, 0xd9, 0x50, 0xca, 0xe7, 0x01, 0xb8, 0x16, 0xfa, + 0xc6, 0x1b, 0xd7, 0xa4, 0x77, 0x98, 0x3b, 0xf8, 0x14, 0x14, 0x6b, 0x14, 0xe8, 0x0c, 0x94, 0xfd, + 0x4e, 0x20, 0x94, 0xc3, 0xd1, 0x83, 0xfd, 0x5a, 0xf9, 0x4a, 0x27, 0xc0, 0x14, 0xa6, 0xc5, 0xff, + 0x94, 0x07, 0x8e, 0xff, 0xe9, 0x1b, 0xf5, 0x8b, 0x6a, 0x30, 0x7c, 0xfb, 0xb6, 0xe7, 0xc6, 0xd5, + 0xe1, 0xd4, 0x73, 0xfd, 0xc6, 0x1b, 0x6b, 0xf5, 0x18, 0x73, 0xb8, 0xfd, 0xff, 0x97, 0x61, 0x66, + 0xd5, 0x27, 0x77, 0x8c, 0xcf, 0x7a, 0x0c, 0x46, 0xdc, 0xc8, 0xdb, 0x25, 0x51, 0x76, 0x17, 0xaf, + 0x33, 0x28, 0x16, 0xd8, 0x81, 0x63, 0x96, 0x6e, 0x74, 0xef, 0xc7, 0xf7, 0x3a, 0x4a, 0xab, 0x7f, + 0x57, 0xbc, 0x0d, 0xa3, 0xfc, 0xa8, 0x94, 0x77, 0xc6, 0xf8, 0x85, 0x67, 0xf3, 0x9a, 0x90, 0xed, + 0x8b, 0x79, 0xe1, 0xfc, 0xe0, 0x71, 0x23, 0x4a, 0x88, 0x09, 0x28, 0x96, 0x2c, 0xe7, 0x3e, 0x05, + 0x13, 0x3a, 0xe5, 0x91, 0x02, 0x48, 0xfe, 0x92, 0x05, 0x27, 0x56, 0xfd, 0xb0, 0xb5, 0x9d, 0x09, + 0x20, 0x7b, 0x01, 0xc6, 0xe9, 0x7a, 0x8a, 0x8d, 0x48, 0x4a, 0x23, 0xb6, 0x56, 0xa0, 0xb0, 0x4e, + 0xa7, 0x15, 0xbb, 0x71, 0x63, 0xad, 0x9e, 0x17, 0x92, 0x2b, 0x50, 0x58, 0xa7, 0xb3, 0xff, 0xd0, + 0x82, 0x87, 0x2f, 0x2e, 0xaf, 0xa4, 0x01, 0xac, 0x5d, 0x51, 0xc1, 0x54, 0xb9, 0x73, 0xb5, 0xa6, + 0xa4, 0xca, 0x5d, 0x9d, 0xb5, 0x42, 0x60, 0x3f, 0x2a, 0x11, 0xef, 0xbf, 0x66, 0xc1, 0x89, 0x8b, + 0x5e, 0x82, 0x49, 0x3b, 0xcc, 0xc6, 0xa7, 0x46, 0xa4, 0x1d, 0xc6, 0x5e, 0x12, 0x46, 0x7b, 0xd9, + 0xf8, 0x54, 0xac, 0x30, 0x58, 0xa3, 0xe2, 0x35, 0xef, 0x7a, 0x31, 0x6d, 0x69, 0xc9, 0xb4, 0x30, + 0xb1, 0x80, 0x63, 0x45, 0x41, 0x3f, 0xcc, 0xf5, 0x22, 0xa6, 0x21, 0xec, 0x89, 0xe5, 0xac, 0x3e, + 0xac, 0x2e, 0x11, 0x38, 0xa5, 0xb1, 0xbf, 0x62, 0xc1, 0xa9, 0x8b, 0x7e, 0x27, 0x4e, 0x48, 0xb4, + 0x11, 0x1b, 0x8d, 0x7d, 0x0e, 0x2a, 0x44, 0x6a, 0xe1, 0xa2, 0xad, 0x6a, 0xdf, 0x50, 0xea, 0x39, + 0x0f, 0x8e, 0x55, 0x74, 0x03, 0x44, 0x63, 0x1e, 0x2d, 0x8a, 0xf0, 0x6b, 0x25, 0x98, 0xbc, 0xb4, + 0xbe, 0xde, 0xb8, 0x48, 0x12, 0x21, 0x32, 0xfb, 0x7b, 0x91, 0xb0, 0x66, 0x08, 0xf7, 0xd2, 0x75, + 0x3a, 0x89, 0xe7, 0xcf, 0xf3, 0xdb, 0x18, 0xf3, 0x6b, 0x41, 0x72, 0x3d, 0x6a, 0x26, 0x91, 0x17, + 0x6c, 0xe6, 0x9a, 0xce, 0x52, 0xb0, 0x97, 0x8b, 0x04, 0x3b, 0x7a, 0x0e, 0x46, 0xd8, 0x75, 0x10, + 0xa9, 0x75, 0x3c, 0xa8, 0x54, 0x05, 0x06, 0x3d, 0xdc, 0xaf, 0x55, 0x6e, 0xe0, 0x35, 0xfe, 0x07, + 0x0b, 0x52, 0x74, 0x03, 0xc6, 0xb7, 0x92, 0xa4, 0x7d, 0x89, 0x38, 0x2e, 0x89, 0xa4, 0x74, 0x38, + 0x9b, 0x27, 0x1d, 0x68, 0x27, 0x70, 0xb2, 0x74, 0x41, 0xa5, 0xb0, 0x18, 0xeb, 0x7c, 0xec, 0x26, + 0x40, 0x8a, 0xbb, 0x47, 0x66, 0x83, 0xfd, 0x7d, 0x0b, 0x46, 0x2f, 0x39, 0x81, 0xeb, 0x93, 0x08, + 0xbd, 0x02, 0x43, 0xe4, 0x0e, 0x69, 0x89, 0x1d, 0x3c, 0xb7, 0xc1, 0xe9, 0x2e, 0xc7, 0x1d, 0x61, + 0xf4, 0x3f, 0x66, 0xa5, 0xd0, 0x25, 0x18, 0xa5, 0xad, 0xbd, 0xa8, 0xc2, 0x94, 0x1f, 0x29, 0xfa, + 0x62, 0x35, 0xec, 0x7c, 0x63, 0x14, 0x20, 0x2c, 0x8b, 0x33, 0x87, 0x4e, 0xab, 0xdd, 0xa4, 0x02, + 0x2c, 0xe9, 0x65, 0x6e, 0xad, 0x2f, 0x37, 0x38, 0x91, 0xe0, 0xc6, 0x1d, 0x3a, 0x12, 0x88, 0x53, + 0x26, 0xf6, 0x3a, 0x54, 0xe8, 0xa0, 0x2e, 0xfa, 0x9e, 0xd3, 0xdb, 0x97, 0xf4, 0x14, 0x54, 0xa4, + 0x5f, 0x27, 0x16, 0x91, 0xce, 0x8c, 0xab, 0x74, 0xfb, 0xc4, 0x38, 0xc5, 0xdb, 0x1b, 0x70, 0x92, + 0x1d, 0x94, 0x3a, 0xc9, 0x96, 0xb1, 0xc6, 0xfa, 0x4f, 0xe6, 0xa7, 0x85, 0x7e, 0xc5, 0x47, 0xa6, + 0xaa, 0xc5, 0xca, 0x4e, 0x48, 0x8e, 0x9a, 0xae, 0xf5, 0x1f, 0x87, 0x60, 0x76, 0xad, 0xb9, 0xdc, + 0x34, 0x9d, 0x8b, 0x2f, 0xc1, 0x04, 0xd7, 0x04, 0xe8, 0x84, 0x76, 0x7c, 0x51, 0x9b, 0x3a, 0x3c, + 0x58, 0xd7, 0x70, 0xd8, 0xa0, 0x44, 0x0f, 0x43, 0xd9, 0x7b, 0x2f, 0xc8, 0x86, 0xc3, 0xad, 0xbd, + 0x7e, 0x0d, 0x53, 0x38, 0x45, 0x53, 0xa5, 0x82, 0x0b, 0x50, 0x85, 0x56, 0x8a, 0xc5, 0xab, 0x30, + 0xe5, 0xc5, 0xad, 0xd8, 0x5b, 0x0b, 0xa8, 0x74, 0x49, 0xc3, 0xfc, 0x53, 0x8d, 0x9f, 0x36, 0x55, + 0x61, 0x71, 0x86, 0x5a, 0x93, 0xe6, 0xc3, 0x03, 0x2b, 0x26, 0x7d, 0x63, 0xa6, 0xa9, 0xce, 0xd5, + 0x66, 0x5f, 0x17, 0xb3, 0xd0, 0x1c, 0xa1, 0x73, 0xf1, 0x0f, 0x8e, 0xb1, 0xc4, 0xa1, 0x8b, 0x30, + 0xdb, 0xda, 0x72, 0xda, 0x8b, 0x9d, 0x64, 0xab, 0xee, 0xc5, 0xad, 0x70, 0x97, 0x44, 0x7b, 0x4c, + 0x13, 0x1e, 0x4b, 0x9d, 0x4c, 0x0a, 0xb1, 0x7c, 0x69, 0xb1, 0x41, 0x29, 0x71, 0x77, 0x19, 0x53, + 0x05, 0x81, 0x7b, 0xa6, 0x82, 0x2c, 0xc2, 0xb4, 0xac, 0xab, 0x49, 0x62, 0xb6, 0x3d, 0x8c, 0xb3, + 0xd6, 0xa9, 0x5b, 0x38, 0x02, 0xac, 0xda, 0x96, 0xa5, 0x47, 0x2f, 0xc2, 0xa4, 0x17, 0x78, 0x89, + 0xe7, 0x24, 0x61, 0xc4, 0x36, 0xd7, 0x09, 0xbe, 0x61, 0x50, 0x09, 0xbf, 0xa6, 0x23, 0xb0, 0x49, + 0x67, 0xbf, 0x0b, 0x15, 0x15, 0x6f, 0x26, 0x43, 0x26, 0xad, 0x82, 0x90, 0xc9, 0xfe, 0x3b, 0x82, + 0xf4, 0x9a, 0x97, 0x73, 0xbd, 0xe6, 0x7f, 0xcb, 0x82, 0x34, 0xec, 0x06, 0x5d, 0x82, 0x4a, 0x3b, + 0x64, 0x27, 0x67, 0x91, 0x3c, 0x8e, 0x7e, 0x30, 0x57, 0x78, 0x70, 0x41, 0xc5, 0xfb, 0xaf, 0x21, + 0x4b, 0xe0, 0xb4, 0x30, 0x5a, 0x82, 0xd1, 0x76, 0x44, 0x9a, 0x09, 0xbb, 0xa7, 0xd0, 0x97, 0x0f, + 0x9f, 0x23, 0x9c, 0x1e, 0xcb, 0x82, 0xf6, 0x6f, 0x59, 0x00, 0xdc, 0x29, 0xed, 0x04, 0x9b, 0xe4, + 0x18, 0x0c, 0xed, 0x3a, 0x0c, 0xc5, 0x6d, 0xd2, 0xea, 0x75, 0xa6, 0x99, 0xb6, 0xa7, 0xd9, 0x26, + 0xad, 0xb4, 0xc3, 0xe9, 0x3f, 0xcc, 0x4a, 0xdb, 0x3f, 0x07, 0x30, 0x95, 0x92, 0x51, 0x03, 0x08, + 0x3d, 0x63, 0x84, 0xe5, 0x9f, 0xc9, 0x84, 0xe5, 0x57, 0x18, 0xb5, 0x16, 0x89, 0xff, 0x2e, 0x94, + 0x77, 0x9c, 0x3b, 0xc2, 0xca, 0x7a, 0xaa, 0x77, 0x33, 0x28, 0xff, 0xf9, 0xab, 0xce, 0x1d, 0xae, + 0xc7, 0x3e, 0x25, 0x27, 0xc8, 0x55, 0xe7, 0xce, 0x21, 0x3f, 0xb9, 0x64, 0x42, 0x8a, 0x1a, 0x73, + 0x9f, 0xff, 0x6e, 0xfa, 0x9f, 0x4d, 0x3b, 0x5a, 0x09, 0xab, 0xcb, 0x0b, 0x84, 0x8b, 0x76, 0xa0, + 0xba, 0xbc, 0x20, 0x5b, 0x97, 0x17, 0x0c, 0x50, 0x97, 0x17, 0xa0, 0xf7, 0x61, 0x54, 0x1c, 0x89, + 0xb0, 0x78, 0xc2, 0xf1, 0x0b, 0x0b, 0x03, 0xd4, 0x27, 0x4e, 0x54, 0x78, 0x9d, 0x0b, 0x52, 0x4f, + 0x17, 0xd0, 0xbe, 0xf5, 0xca, 0x0a, 0xd1, 0xdf, 0xb0, 0x60, 0x4a, 0xfc, 0xc6, 0xe4, 0xbd, 0x0e, + 0x89, 0x13, 0xa1, 0x0f, 0x7c, 0x72, 0xf0, 0x36, 0x88, 0x82, 0xbc, 0x29, 0x9f, 0x94, 0x62, 0xd6, + 0x44, 0xf6, 0x6d, 0x51, 0xa6, 0x15, 0xe8, 0x1f, 0x5b, 0x70, 0x72, 0xc7, 0xb9, 0xc3, 0x6b, 0xe4, + 0x30, 0xec, 0x24, 0x5e, 0x28, 0xe2, 0x23, 0x5f, 0x19, 0x6c, 0xf8, 0xbb, 0x8a, 0xf3, 0x46, 0xca, + 0x50, 0xaa, 0x93, 0x79, 0x24, 0x7d, 0x9b, 0x9a, 0xdb, 0xae, 0xb9, 0x0d, 0x18, 0x93, 0xf3, 0x2d, + 0xc7, 0x1a, 0xaa, 0xeb, 0xca, 0xce, 0x91, 0x4f, 0xa4, 0x34, 0xeb, 0x89, 0xd5, 0x23, 0xe6, 0xda, + 0x7d, 0xad, 0xe7, 0x5d, 0x98, 0xd0, 0xe7, 0xd8, 0x7d, 0xad, 0xeb, 0x3d, 0x38, 0x91, 0x33, 0x97, + 0xee, 0x6b, 0x95, 0xb7, 0xe1, 0x4c, 0xe1, 0xfc, 0xb8, 0x9f, 0x15, 0xdb, 0x5f, 0xb3, 0x74, 0x39, + 0x78, 0x0c, 0xee, 0xa9, 0x65, 0xd3, 0x3d, 0x75, 0xb6, 0xf7, 0xca, 0x29, 0xf0, 0x51, 0xbd, 0xad, + 0x37, 0x9a, 0x4a, 0x75, 0xf4, 0x1a, 0x8c, 0xf8, 0x14, 0x22, 0xcf, 0xe1, 0xec, 0xfe, 0x2b, 0x32, + 0xd5, 0xa5, 0x18, 0x3c, 0xc6, 0x82, 0x83, 0xfd, 0xbb, 0x16, 0x0c, 0x1d, 0x43, 0x4f, 0x60, 0xb3, + 0x27, 0x9e, 0x29, 0x64, 0x2d, 0xae, 0xda, 0xcf, 0x63, 0xe7, 0xf6, 0xca, 0x9d, 0x84, 0x04, 0x31, + 0x53, 0xdf, 0x73, 0x3b, 0xe6, 0x7f, 0x97, 0x60, 0x9c, 0x56, 0x25, 0x83, 0x46, 0x5e, 0x86, 0x49, + 0xdf, 0xb9, 0x45, 0x7c, 0xe9, 0x32, 0xcf, 0x1a, 0xb1, 0x57, 0x74, 0x24, 0x36, 0x69, 0x69, 0xe1, + 0x0d, 0xfd, 0xf4, 0x40, 0xe8, 0x2f, 0xaa, 0xb0, 0x71, 0xb4, 0x80, 0x4d, 0x5a, 0x6a, 0x4f, 0xdd, + 0x76, 0x92, 0xd6, 0x96, 0x30, 0x70, 0x55, 0x73, 0xdf, 0xa0, 0x40, 0xcc, 0x71, 0x54, 0x81, 0x93, + 0xb3, 0xf3, 0x26, 0x89, 0x98, 0x02, 0xc7, 0xd5, 0x63, 0xa5, 0xc0, 0x61, 0x13, 0x8d, 0xb3, 0xf4, + 0xe8, 0x53, 0x30, 0x45, 0x3b, 0x27, 0xec, 0x24, 0x32, 0x24, 0x66, 0x98, 0x85, 0xc4, 0xb0, 0x08, + 0xe8, 0x75, 0x03, 0x83, 0x33, 0x94, 0xa8, 0x01, 0x27, 0xbd, 0xa0, 0xe5, 0x77, 0x5c, 0x72, 0x23, + 0xe0, 0xda, 0x9d, 0xef, 0xbd, 0x4f, 0x5c, 0xa1, 0x40, 0xab, 0xe8, 0xa5, 0xb5, 0x1c, 0x1a, 0x9c, + 0x5b, 0xd2, 0xfe, 0x19, 0x38, 0x71, 0x25, 0x74, 0xdc, 0x25, 0xc7, 0x77, 0x82, 0x16, 0x89, 0xd6, + 0x82, 0xcd, 0xbe, 0x07, 0xf2, 0xfa, 0xf1, 0x79, 0xa9, 0xdf, 0xf1, 0xb9, 0xbd, 0x05, 0x48, 0xaf, + 0x40, 0x84, 0x82, 0x61, 0x18, 0xf5, 0x78, 0x55, 0x62, 0xfa, 0x3f, 0x9e, 0xaf, 0x5d, 0x77, 0xb5, + 0x4c, 0x0b, 0x72, 0xe2, 0x00, 0x2c, 0x19, 0xd9, 0x2f, 0x41, 0xee, 0xfd, 0x8c, 0xfe, 0xa6, 0xb4, + 0xfd, 0x02, 0xcc, 0xb2, 0x92, 0x47, 0x33, 0xf3, 0xec, 0xbf, 0x6a, 0xc1, 0xf4, 0xb5, 0xcc, 0x1d, + 0xd8, 0xc7, 0x60, 0x24, 0x26, 0x51, 0x8e, 0x2f, 0xb4, 0xc9, 0xa0, 0x58, 0x60, 0xef, 0xb9, 0xcf, + 0xe5, 0x07, 0x16, 0x54, 0xd4, 0x6d, 0xeb, 0x63, 0x50, 0x6a, 0x97, 0x0d, 0xa5, 0x36, 0xd7, 0x17, + 0xa0, 0x9a, 0x53, 0xa4, 0xd3, 0xa2, 0xcb, 0xea, 0x6e, 0x68, 0x0f, 0x37, 0x40, 0xca, 0x86, 0xdf, + 0x24, 0x9c, 0x32, 0x2f, 0x90, 0xca, 0xdb, 0xa2, 0xec, 0x44, 0x5c, 0xd1, 0x7e, 0x44, 0x4e, 0xc4, + 0x55, 0x7b, 0x0a, 0xa4, 0x5f, 0x43, 0x6b, 0x32, 0xdb, 0x15, 0x7e, 0x82, 0x45, 0x8e, 0xb2, 0xb5, + 0xa9, 0x2e, 0x51, 0xd7, 0x44, 0x24, 0xa8, 0x80, 0x1e, 0x32, 0x41, 0x26, 0xfe, 0xf1, 0x9b, 0xf1, + 0x69, 0x11, 0xfb, 0x12, 0x4c, 0x67, 0x3a, 0x0c, 0xbd, 0x00, 0xc3, 0xed, 0x2d, 0x27, 0x26, 0x99, + 0x48, 0xa0, 0xe1, 0x06, 0x05, 0x1e, 0xee, 0xd7, 0xa6, 0x54, 0x01, 0x06, 0xc1, 0x9c, 0xda, 0xfe, + 0xef, 0x16, 0x0c, 0x5d, 0x0b, 0xdd, 0xe3, 0x98, 0x4c, 0xaf, 0x1a, 0x93, 0xe9, 0xa1, 0xa2, 0xbc, + 0x22, 0x85, 0xf3, 0x68, 0x35, 0x33, 0x8f, 0xce, 0x16, 0x72, 0xe8, 0x3d, 0x85, 0x76, 0x60, 0x9c, + 0x65, 0x2b, 0x11, 0x51, 0x49, 0xcf, 0x19, 0xf6, 0x55, 0x2d, 0x63, 0x5f, 0x4d, 0x6b, 0xa4, 0x9a, + 0x95, 0xf5, 0x04, 0x8c, 0x8a, 0xc8, 0x98, 0x6c, 0x8c, 0xac, 0xa0, 0xc5, 0x12, 0x6f, 0xff, 0x4a, + 0x19, 0x8c, 0xec, 0x28, 0xe8, 0xf7, 0x2d, 0x98, 0x8f, 0xf8, 0xad, 0x20, 0xb7, 0xde, 0x89, 0xbc, + 0x60, 0xb3, 0xd9, 0xda, 0x22, 0x6e, 0xc7, 0xf7, 0x82, 0xcd, 0xb5, 0xcd, 0x20, 0x54, 0xe0, 0x95, + 0x3b, 0xa4, 0xd5, 0x61, 0x7e, 0xf0, 0x3e, 0xa9, 0x58, 0xd4, 0xc9, 0xf3, 0x85, 0x83, 0xfd, 0xda, + 0x3c, 0x3e, 0x12, 0x6f, 0x7c, 0xc4, 0xb6, 0xa0, 0x3f, 0xb4, 0x60, 0x81, 0x27, 0x0d, 0x19, 0xbc, + 0xfd, 0x3d, 0xac, 0xd1, 0x86, 0x64, 0x95, 0x32, 0x59, 0x27, 0xd1, 0xce, 0xd2, 0x8b, 0xa2, 0x43, + 0x17, 0x1a, 0x47, 0xab, 0x0b, 0x1f, 0xb5, 0x71, 0xf6, 0xbf, 0x2c, 0xc3, 0x24, 0xed, 0xc5, 0xf4, + 0x26, 0xfc, 0x0b, 0xc6, 0x94, 0x78, 0x24, 0x33, 0x25, 0x66, 0x0d, 0xe2, 0x7b, 0x73, 0x09, 0x3e, + 0x86, 0x59, 0xdf, 0x89, 0x93, 0x4b, 0xc4, 0x89, 0x92, 0x5b, 0xc4, 0x61, 0x47, 0xbd, 0x62, 0x9a, + 0x1f, 0xe5, 0xf4, 0x58, 0xb9, 0xbf, 0xae, 0x64, 0x99, 0xe1, 0x6e, 0xfe, 0x68, 0x17, 0x10, 0x3b, + 0x56, 0x8e, 0x9c, 0x20, 0xe6, 0xdf, 0xe2, 0x09, 0x1f, 0xf9, 0xd1, 0x6a, 0x9d, 0x13, 0xb5, 0xa2, + 0x2b, 0x5d, 0xdc, 0x70, 0x4e, 0x0d, 0x5a, 0xb8, 0xc0, 0xf0, 0xa0, 0xe1, 0x02, 0x23, 0x7d, 0x02, + 0xd1, 0x77, 0x60, 0x46, 0x8c, 0xca, 0x86, 0xb7, 0x29, 0x36, 0xe9, 0x37, 0x33, 0xe1, 0x44, 0xd6, + 0xe0, 0x81, 0x0f, 0x7d, 0x62, 0x89, 0xec, 0x9f, 0x85, 0x13, 0xb4, 0x3a, 0x33, 0x6c, 0x3a, 0x46, + 0x04, 0xa6, 0xb7, 0x3b, 0xb7, 0x88, 0x4f, 0x12, 0x09, 0x13, 0x95, 0xe6, 0xaa, 0xfd, 0x66, 0xe9, + 0x54, 0xb7, 0xbc, 0x6c, 0xb2, 0xc0, 0x59, 0x9e, 0xf6, 0xaf, 0x5a, 0xc0, 0x02, 0x13, 0x8f, 0x61, + 0xfb, 0xfb, 0xb4, 0xb9, 0xfd, 0x55, 0x8b, 0x24, 0x50, 0xc1, 0xce, 0xf7, 0x3c, 0x1f, 0x96, 0x46, + 0x14, 0xde, 0xd9, 0x93, 0xba, 0x7f, 0x7f, 0x8d, 0xeb, 0x7f, 0x59, 0x7c, 0x41, 0xaa, 0x4b, 0x92, + 0xe8, 0x73, 0x30, 0xd6, 0x72, 0xda, 0x4e, 0x8b, 0xa7, 0xa5, 0x2a, 0xf4, 0xfe, 0x18, 0x85, 0xe6, + 0x97, 0x45, 0x09, 0xee, 0xcd, 0xf8, 0x31, 0xf9, 0x95, 0x12, 0xdc, 0xd7, 0x83, 0xa1, 0xaa, 0x9c, + 0xdb, 0x86, 0x49, 0x83, 0xd9, 0x7d, 0x35, 0x7d, 0x3f, 0xc7, 0xb7, 0x0b, 0x65, 0xb1, 0xec, 0xc0, + 0x6c, 0xa0, 0xfd, 0xa7, 0xc2, 0x51, 0xaa, 0xd3, 0x1f, 0xef, 0xb7, 0x21, 0x30, 0x49, 0xaa, 0x05, + 0x5e, 0x66, 0xd8, 0xe0, 0x6e, 0xce, 0xf6, 0xdf, 0xb1, 0xe0, 0x01, 0x9d, 0x50, 0xbb, 0xbf, 0xda, + 0xcf, 0x9f, 0x5c, 0x87, 0xb1, 0xb0, 0x4d, 0x22, 0x27, 0xb5, 0xc9, 0xce, 0xcb, 0x4e, 0xbf, 0x2e, + 0xe0, 0x87, 0xfb, 0xb5, 0x93, 0x3a, 0x77, 0x09, 0xc7, 0xaa, 0x24, 0xb2, 0x61, 0x84, 0x75, 0x46, + 0x2c, 0xee, 0x16, 0xb3, 0xd4, 0x4d, 0xec, 0xb8, 0x2b, 0xc6, 0x02, 0x63, 0xff, 0x9c, 0xc5, 0x27, + 0x96, 0xde, 0x74, 0xf4, 0x1e, 0xcc, 0xec, 0x50, 0xf3, 0x6d, 0xe5, 0x4e, 0x3b, 0xe2, 0x6e, 0x74, + 0xd9, 0x4f, 0x4f, 0xf5, 0xeb, 0x27, 0xed, 0x23, 0x97, 0xaa, 0xa2, 0xcd, 0x33, 0x57, 0x33, 0xcc, + 0x70, 0x17, 0x7b, 0xfb, 0xcf, 0x4b, 0x7c, 0x25, 0x32, 0xad, 0xee, 0x09, 0x18, 0x6d, 0x87, 0xee, + 0xf2, 0x5a, 0x1d, 0x8b, 0x1e, 0x52, 0xe2, 0xaa, 0xc1, 0xc1, 0x58, 0xe2, 0xd1, 0x05, 0x00, 0x72, + 0x27, 0x21, 0x51, 0xe0, 0xf8, 0xea, 0x30, 0x5e, 0x29, 0x4f, 0x2b, 0x0a, 0x83, 0x35, 0x2a, 0x5a, + 0xa6, 0x1d, 0x85, 0xbb, 0x9e, 0xcb, 0x2e, 0x77, 0x94, 0xcd, 0x32, 0x0d, 0x85, 0xc1, 0x1a, 0x15, + 0x35, 0x95, 0x3b, 0x41, 0xcc, 0x37, 0x40, 0xe7, 0x96, 0x48, 0xa0, 0x33, 0x96, 0x9a, 0xca, 0x37, + 0x74, 0x24, 0x36, 0x69, 0xd1, 0x22, 0x8c, 0x24, 0x0e, 0x3b, 0x62, 0x1e, 0x2e, 0x0e, 0xd9, 0x59, + 0xa7, 0x14, 0x7a, 0x9e, 0x22, 0x5a, 0x00, 0x8b, 0x82, 0xe8, 0x2d, 0x29, 0x82, 0xb9, 0x48, 0x16, + 0xa1, 0x57, 0x85, 0xd3, 0x56, 0x17, 0xdf, 0xba, 0x0c, 0x16, 0x21, 0x5d, 0x06, 0x2f, 0xfb, 0x0b, + 0x15, 0x80, 0x54, 0xdb, 0x43, 0xef, 0x77, 0x89, 0x88, 0xa7, 0x7b, 0xeb, 0x87, 0xf7, 0x4e, 0x3e, + 0xa0, 0x2f, 0x5a, 0x30, 0xee, 0xf8, 0x7e, 0xd8, 0x72, 0x12, 0xd6, 0xcb, 0xa5, 0xde, 0x22, 0x4a, + 0xd4, 0xbf, 0x98, 0x96, 0xe0, 0x4d, 0x78, 0x4e, 0x9e, 0x1e, 0x6b, 0x98, 0xbe, 0xad, 0xd0, 0x2b, + 0x46, 0x3f, 0x26, 0x8d, 0x00, 0x3e, 0x3d, 0xe6, 0xb2, 0x46, 0x40, 0x85, 0x49, 0x63, 0x4d, 0xff, + 0x47, 0x37, 0x8c, 0xbc, 0x35, 0x43, 0xc5, 0x57, 0x74, 0x0d, 0xa5, 0xa7, 0x5f, 0xca, 0x1a, 0xd4, + 0xd0, 0x43, 0xd0, 0x87, 0x8b, 0xef, 0xb1, 0x6b, 0xda, 0x75, 0x9f, 0xf0, 0xf3, 0x77, 0x61, 0xda, + 0x35, 0xb7, 0x5b, 0x31, 0x9b, 0x1e, 0x2f, 0xe2, 0x9b, 0xd9, 0x9d, 0xd3, 0x0d, 0x36, 0x83, 0xc0, + 0x59, 0xc6, 0xa8, 0xc1, 0x2f, 0x03, 0xac, 0x05, 0x1b, 0xa1, 0x08, 0xe1, 0xb3, 0x0b, 0xc7, 0x72, + 0x2f, 0x4e, 0xc8, 0x0e, 0xa5, 0x4c, 0xf7, 0xd1, 0x6b, 0xa2, 0x2c, 0x56, 0x5c, 0xd0, 0x6b, 0x30, + 0xc2, 0x6e, 0x69, 0xc5, 0xd5, 0xb1, 0x62, 0x3f, 0xa0, 0x79, 0xc1, 0x38, 0x5d, 0x54, 0xec, 0x6f, + 0x8c, 0x05, 0x07, 0x74, 0x49, 0xa6, 0x09, 0x88, 0xd7, 0x82, 0x1b, 0x31, 0x61, 0x69, 0x02, 0x2a, + 0x4b, 0x1f, 0x4f, 0x33, 0x00, 0x70, 0x78, 0x6e, 0x46, 0x42, 0xa3, 0x24, 0xd5, 0x57, 0xc4, 0x7f, + 0x99, 0xe8, 0xb0, 0x0a, 0xc5, 0xcd, 0x33, 0x93, 0x21, 0xa6, 0xdd, 0x79, 0xd3, 0x64, 0x81, 0xb3, + 0x3c, 0x8f, 0x75, 0xfb, 0x9c, 0x0b, 0x60, 0x26, 0xbb, 0xb0, 0xee, 0xeb, 0x76, 0xfd, 0xfd, 0x21, + 0x98, 0x32, 0x27, 0x02, 0x5a, 0x80, 0x8a, 0x60, 0xa2, 0x92, 0x7c, 0xa9, 0xb9, 0x7d, 0x55, 0x22, + 0x70, 0x4a, 0xc3, 0x92, 0x9c, 0xb1, 0xe2, 0x5a, 0x6c, 0x56, 0x9a, 0xe4, 0x4c, 0x61, 0xb0, 0x46, + 0x45, 0x95, 0xe8, 0x5b, 0x61, 0x98, 0xa8, 0xad, 0x40, 0xcd, 0x96, 0x25, 0x06, 0xc5, 0x02, 0x4b, + 0xb7, 0x80, 0x6d, 0x12, 0x05, 0xc4, 0x37, 0x3d, 0x99, 0x6a, 0x0b, 0xb8, 0xac, 0x23, 0xb1, 0x49, + 0x4b, 0xb7, 0xb4, 0x30, 0x66, 0xd3, 0x4f, 0xa8, 0xea, 0x69, 0xac, 0x5b, 0x93, 0xdf, 0x52, 0x94, + 0x78, 0xf4, 0x26, 0x3c, 0xa0, 0x2e, 0x15, 0x62, 0xee, 0x19, 0x96, 0x35, 0x8e, 0x18, 0x96, 0xf5, + 0x03, 0xcb, 0xf9, 0x64, 0xb8, 0xa8, 0x3c, 0x7a, 0x15, 0xa6, 0x84, 0x0a, 0x2c, 0x39, 0x8e, 0x9a, + 0xc1, 0x0a, 0x97, 0x0d, 0x2c, 0xce, 0x50, 0xa3, 0x3a, 0xcc, 0x50, 0x08, 0xd3, 0x42, 0x25, 0x07, + 0x7e, 0x39, 0x52, 0xed, 0xf5, 0x97, 0x33, 0x78, 0xdc, 0x55, 0x02, 0x2d, 0xc2, 0x34, 0xd7, 0x51, + 0xa8, 0x4d, 0xc9, 0xc6, 0x41, 0x44, 0xd6, 0xaa, 0x85, 0x70, 0xdd, 0x44, 0xe3, 0x2c, 0x3d, 0x7a, + 0x09, 0x26, 0x9c, 0xa8, 0xb5, 0xe5, 0x25, 0xa4, 0x95, 0x74, 0x22, 0x9e, 0x84, 0x43, 0x8b, 0xf6, + 0x58, 0xd4, 0x70, 0xd8, 0xa0, 0xb4, 0xdf, 0x87, 0x13, 0x39, 0x41, 0xf9, 0x74, 0xe2, 0x38, 0x6d, + 0x4f, 0x7e, 0x53, 0x26, 0x6a, 0x6d, 0xb1, 0xb1, 0x26, 0xbf, 0x46, 0xa3, 0xa2, 0xb3, 0x93, 0xb9, + 0xc4, 0xb5, 0x6c, 0xa4, 0x6a, 0x76, 0xae, 0x4a, 0x04, 0x4e, 0x69, 0xec, 0x6f, 0x01, 0x68, 0x0e, + 0x9d, 0x01, 0x62, 0x96, 0x5e, 0x82, 0x09, 0x99, 0x42, 0x57, 0x4b, 0xdd, 0xa8, 0x3e, 0xf3, 0xa2, + 0x86, 0xc3, 0x06, 0x25, 0x6d, 0x5b, 0xa0, 0x12, 0x4f, 0x66, 0x62, 0xe4, 0xd2, 0xb4, 0x93, 0x29, + 0x0d, 0x7a, 0x1a, 0xc6, 0x62, 0xe2, 0x6f, 0x5c, 0xf1, 0x82, 0x6d, 0x31, 0xb1, 0x95, 0x14, 0x6e, + 0x0a, 0x38, 0x56, 0x14, 0x68, 0x09, 0xca, 0x1d, 0xcf, 0x15, 0x53, 0x59, 0x6e, 0xf8, 0xe5, 0x1b, + 0x6b, 0xf5, 0xc3, 0xfd, 0xda, 0x23, 0x45, 0x99, 0x81, 0xa9, 0x69, 0x1f, 0xcf, 0xd3, 0xe5, 0x47, + 0x0b, 0xe7, 0x9d, 0x0d, 0x8c, 0x1c, 0xf1, 0x6c, 0xe0, 0x02, 0x80, 0xf8, 0x6a, 0x39, 0x97, 0xcb, + 0xe9, 0xa8, 0x5d, 0x54, 0x18, 0xac, 0x51, 0xa1, 0x18, 0x66, 0x5b, 0x11, 0x71, 0xa4, 0x0d, 0xcd, + 0xc3, 0xcb, 0xc7, 0xee, 0xde, 0x41, 0xb0, 0x9c, 0x65, 0x86, 0xbb, 0xf9, 0xa3, 0x10, 0x66, 0x5d, + 0x71, 0x87, 0x35, 0xad, 0xb4, 0x72, 0xf4, 0x98, 0x76, 0x16, 0x90, 0x93, 0x65, 0x84, 0xbb, 0x79, + 0xa3, 0x77, 0x60, 0x4e, 0x02, 0xbb, 0xaf, 0x0d, 0xb3, 0xe5, 0x52, 0x5e, 0x3a, 0x7b, 0xb0, 0x5f, + 0x9b, 0xab, 0x17, 0x52, 0xe1, 0x1e, 0x1c, 0x10, 0x86, 0x11, 0x76, 0x96, 0x14, 0x57, 0xc7, 0xd9, + 0x3e, 0xf7, 0x64, 0xb1, 0x33, 0x80, 0xce, 0xf5, 0x79, 0x76, 0x0e, 0x25, 0xc2, 0x7c, 0xd3, 0x63, + 0x39, 0x06, 0xc4, 0x82, 0x13, 0xda, 0x80, 0x71, 0x27, 0x08, 0xc2, 0xc4, 0xe1, 0x2a, 0xd4, 0x44, + 0xb1, 0xee, 0xa7, 0x31, 0x5e, 0x4c, 0x4b, 0x70, 0xee, 0x2a, 0x72, 0x50, 0xc3, 0x60, 0x9d, 0x31, + 0xba, 0x0d, 0xd3, 0xe1, 0x6d, 0x2a, 0x1c, 0xa5, 0x97, 0x22, 0xae, 0x4e, 0xb2, 0xba, 0x9e, 0x1f, + 0xd0, 0x4f, 0x6b, 0x14, 0xd6, 0xa4, 0x96, 0xc9, 0x14, 0x67, 0x6b, 0x41, 0xf3, 0x86, 0xb7, 0x7a, + 0x2a, 0x8d, 0x67, 0x4f, 0xbd, 0xd5, 0xba, 0x73, 0x9a, 0x5d, 0x43, 0xe7, 0x61, 0xab, 0x6c, 0xf5, + 0x4f, 0x67, 0xae, 0xa1, 0xa7, 0x28, 0xac, 0xd3, 0xa1, 0x2d, 0x98, 0x48, 0x8f, 0xac, 0xa2, 0x98, + 0x65, 0xa9, 0x19, 0xbf, 0x70, 0x61, 0xb0, 0x8f, 0x5b, 0xd3, 0x4a, 0x72, 0xcb, 0x41, 0x87, 0x60, + 0x83, 0xf3, 0xdc, 0x8f, 0xc3, 0xb8, 0x36, 0xb0, 0x47, 0x89, 0xca, 0x9e, 0x7b, 0x15, 0x66, 0xb2, + 0x43, 0x77, 0xa4, 0xa8, 0xee, 0xff, 0x59, 0x82, 0xe9, 0x9c, 0x93, 0x2b, 0x96, 0x5d, 0x38, 0x23, + 0x50, 0xd3, 0x64, 0xc2, 0xa6, 0x58, 0x2c, 0x0d, 0x20, 0x16, 0xa5, 0x8c, 0x2e, 0x17, 0xca, 0x68, + 0x21, 0x0a, 0x87, 0x3e, 0x88, 0x28, 0x34, 0x77, 0x9f, 0xe1, 0x81, 0x76, 0x9f, 0x7b, 0x20, 0x3e, + 0x8d, 0x0d, 0x6c, 0x74, 0x80, 0x0d, 0xec, 0x17, 0x4b, 0x30, 0x93, 0x4d, 0xc1, 0x7c, 0x0c, 0xe7, + 0x1d, 0xaf, 0x19, 0xe7, 0x1d, 0xf9, 0xb9, 0xba, 0xb3, 0x89, 0xa1, 0x8b, 0xce, 0x3e, 0x70, 0xe6, + 0xec, 0xe3, 0xc9, 0x81, 0xb8, 0xf5, 0x3e, 0x07, 0xf9, 0xbb, 0x25, 0x38, 0x95, 0x2d, 0xb2, 0xec, + 0x3b, 0xde, 0xce, 0x31, 0xf4, 0xcd, 0x75, 0xa3, 0x6f, 0x9e, 0x19, 0xe4, 0x6b, 0x58, 0xd3, 0x0a, + 0x3b, 0xe8, 0x8d, 0x4c, 0x07, 0x2d, 0x0c, 0xce, 0xb2, 0x77, 0x2f, 0x7d, 0xcb, 0x82, 0x33, 0xb9, + 0xe5, 0x8e, 0xc1, 0xfb, 0x7a, 0xcd, 0xf4, 0xbe, 0x3e, 0x31, 0xf0, 0x37, 0x15, 0xb8, 0x63, 0xbf, + 0x52, 0x2e, 0xf8, 0x16, 0xe6, 0xbf, 0xba, 0x0e, 0xe3, 0x4e, 0xab, 0x45, 0xe2, 0xf8, 0x6a, 0xe8, + 0xaa, 0xb4, 0x56, 0xcf, 0xb0, 0x3d, 0x29, 0x05, 0x1f, 0xee, 0xd7, 0xe6, 0xb2, 0x2c, 0x52, 0x34, + 0xd6, 0x39, 0x98, 0xa9, 0xf2, 0x4a, 0xf7, 0x34, 0x55, 0xde, 0x05, 0x80, 0x5d, 0x65, 0xd5, 0x66, + 0x9d, 0x61, 0x9a, 0xbd, 0xab, 0x51, 0xa1, 0x9f, 0x66, 0xba, 0x22, 0x0f, 0x19, 0xe1, 0x87, 0x1c, + 0xcf, 0x0d, 0x38, 0x56, 0x7a, 0xf8, 0x09, 0xbf, 0x08, 0xab, 0x1c, 0x87, 0x8a, 0x25, 0xfa, 0x49, + 0x98, 0x89, 0x79, 0xae, 0x85, 0x65, 0xdf, 0x89, 0xd9, 0xf5, 0x0b, 0x21, 0x13, 0xd9, 0xed, 0xd6, + 0x66, 0x06, 0x87, 0xbb, 0xa8, 0xed, 0x7f, 0x58, 0x86, 0x07, 0x7b, 0x4c, 0x51, 0xb4, 0x68, 0x1e, + 0xf1, 0x3e, 0x95, 0xf5, 0xee, 0xcc, 0xe5, 0x16, 0x36, 0xdc, 0x3d, 0x99, 0x31, 0x2e, 0x7d, 0xe0, + 0x31, 0xfe, 0x92, 0xa5, 0xf9, 0xdd, 0x78, 0x20, 0xe8, 0xa7, 0x8f, 0xb8, 0xf4, 0x7e, 0x58, 0x1d, + 0xf5, 0x9f, 0xb7, 0xe0, 0x91, 0xdc, 0xcf, 0x32, 0x42, 0x45, 0x16, 0xa0, 0xd2, 0xa2, 0x40, 0xed, + 0x8a, 0x54, 0x7a, 0x51, 0x51, 0x22, 0x70, 0x4a, 0x63, 0x44, 0x84, 0x94, 0xfa, 0x46, 0x84, 0xfc, + 0x73, 0x0b, 0x4e, 0x66, 0x1b, 0x71, 0x0c, 0x92, 0x69, 0xcd, 0x94, 0x4c, 0x1f, 0x1f, 0x64, 0xc8, + 0x0b, 0x84, 0xd2, 0x77, 0xa7, 0xe0, 0x74, 0xc1, 0x03, 0x09, 0xbb, 0x30, 0xbb, 0xd9, 0x22, 0xe6, + 0xe5, 0x33, 0xf1, 0x31, 0xb9, 0xf7, 0xf4, 0x7a, 0xde, 0x54, 0xe3, 0x66, 0x48, 0x17, 0x09, 0xee, + 0xae, 0x02, 0x7d, 0xde, 0x82, 0x93, 0xce, 0xed, 0xb8, 0xeb, 0xc1, 0x17, 0x31, 0x67, 0x9e, 0xcf, + 0xf5, 0x8e, 0xf5, 0x79, 0x20, 0x86, 0x5d, 0x10, 0x39, 0x99, 0x47, 0x85, 0x73, 0xeb, 0x42, 0x58, + 0x64, 0xf6, 0xa3, 0x5a, 0x4e, 0x8f, 0xeb, 0x91, 0x79, 0x97, 0x57, 0xb8, 0x8c, 0x92, 0x18, 0xac, + 0xf8, 0xa0, 0x9b, 0x50, 0xd9, 0x94, 0x37, 0xca, 0x84, 0x0c, 0xcc, 0xdd, 0x54, 0x72, 0xaf, 0x9d, + 0xf1, 0x88, 0x7d, 0x85, 0xc2, 0x29, 0x2b, 0xf4, 0x2a, 0x94, 0x83, 0x8d, 0x58, 0x5c, 0xd5, 0xce, + 0x8f, 0xef, 0x31, 0x23, 0xa8, 0xf8, 0x3d, 0xd7, 0x6b, 0xab, 0x4d, 0x4c, 0x0b, 0xd2, 0xf2, 0xd1, + 0x2d, 0x57, 0x38, 0x74, 0x73, 0xcb, 0xe3, 0xa5, 0x7a, 0x77, 0x79, 0xbc, 0x54, 0xc7, 0xb4, 0x20, + 0x5a, 0x85, 0x61, 0x76, 0x41, 0x45, 0x78, 0x6b, 0x73, 0xef, 0xe9, 0x77, 0x5d, 0xbe, 0xe1, 0x17, + 0x5f, 0x19, 0x18, 0xf3, 0xe2, 0xe8, 0x35, 0x18, 0x69, 0xb1, 0x9c, 0xfd, 0xc2, 0xb4, 0xce, 0xcf, + 0x3d, 0xd1, 0x95, 0xd5, 0x9f, 0x9f, 0x51, 0x71, 0x38, 0x16, 0x1c, 0x18, 0x2f, 0xd2, 0xde, 0xda, + 0x88, 0x85, 0xc5, 0x9c, 0xcf, 0xab, 0xeb, 0x7d, 0x05, 0xc1, 0x8b, 0xc1, 0xb1, 0xe0, 0x80, 0x3e, + 0x05, 0xa5, 0x8d, 0x96, 0xb8, 0xa1, 0x92, 0xeb, 0x9b, 0x35, 0xaf, 0x20, 0x2f, 0x8d, 0x1c, 0xec, + 0xd7, 0x4a, 0xab, 0xcb, 0xb8, 0xb4, 0xd1, 0x42, 0xd7, 0x60, 0x74, 0x83, 0xdf, 0x23, 0x15, 0xf9, + 0x59, 0x1f, 0xcf, 0xbf, 0xe2, 0xda, 0x75, 0xd5, 0x94, 0xdf, 0xac, 0x10, 0x08, 0x2c, 0x99, 0xa0, + 0x75, 0x80, 0x0d, 0x75, 0x1f, 0x56, 0x24, 0x68, 0xfd, 0xf8, 0x20, 0xb7, 0x66, 0x85, 0xd1, 0xa8, + 0xa0, 0x58, 0xe3, 0x83, 0x3e, 0x0b, 0x15, 0x47, 0x3e, 0x1c, 0xc2, 0x92, 0xb3, 0x9a, 0xbb, 0x73, + 0xba, 0xcc, 0x7a, 0xbf, 0xa9, 0xc2, 0xe7, 0xa8, 0x22, 0xc2, 0x29, 0x53, 0xb4, 0x0d, 0x93, 0xbb, + 0x71, 0x7b, 0x8b, 0xc8, 0x65, 0xc9, 0x32, 0xb6, 0x9a, 0x06, 0x66, 0x9a, 0x5e, 0x57, 0x10, 0x7a, + 0x51, 0xd2, 0x71, 0xfc, 0x2e, 0x49, 0xc2, 0xae, 0xe1, 0xdc, 0xd4, 0x99, 0x61, 0x93, 0x37, 0xed, + 0xf4, 0xf7, 0x3a, 0xe1, 0xad, 0xbd, 0x84, 0x88, 0x3c, 0xae, 0xb9, 0x9d, 0xfe, 0x3a, 0x27, 0xe9, + 0xee, 0x74, 0x81, 0xc0, 0x92, 0x09, 0x5d, 0xb8, 0x8e, 0x7c, 0x94, 0x47, 0x58, 0xc6, 0x4f, 0x14, + 0x76, 0x4f, 0x57, 0x7b, 0xd3, 0x4e, 0x61, 0x12, 0x2f, 0x65, 0xc5, 0x24, 0x5d, 0x7b, 0x2b, 0x4c, + 0xc2, 0x20, 0x23, 0x65, 0x67, 0x8b, 0x25, 0x5d, 0x23, 0x87, 0xbe, 0x5b, 0xd2, 0xe5, 0x51, 0xe1, + 0xdc, 0xba, 0x90, 0x0b, 0x53, 0xed, 0x30, 0x4a, 0x6e, 0x87, 0x91, 0x9c, 0x55, 0xa8, 0x87, 0xc9, + 0x64, 0x50, 0x8a, 0x1a, 0x59, 0x54, 0xad, 0x89, 0xc1, 0x19, 0x9e, 0x74, 0x48, 0xe2, 0x96, 0xe3, + 0x93, 0xb5, 0xeb, 0xd5, 0x13, 0xc5, 0x43, 0xd2, 0xe4, 0x24, 0xdd, 0x43, 0x22, 0x10, 0x58, 0x32, + 0xa1, 0x32, 0x87, 0xa5, 0x04, 0x67, 0x89, 0x67, 0x0b, 0x64, 0x4e, 0x57, 0xbc, 0x29, 0x97, 0x39, + 0x0c, 0x8c, 0x79, 0x71, 0x3a, 0xf3, 0x85, 0x26, 0x18, 0xc6, 0xd5, 0x53, 0xc5, 0x33, 0x5f, 0x28, + 0x90, 0xd7, 0x9b, 0xbd, 0x66, 0xbe, 0x22, 0xc2, 0x29, 0x53, 0xfb, 0x0b, 0x23, 0xdd, 0x3a, 0x02, + 0xd3, 0xf8, 0xbf, 0x60, 0x75, 0x1d, 0x9a, 0x7e, 0x72, 0x50, 0x33, 0xf5, 0x1e, 0x1e, 0x9f, 0x7e, + 0xde, 0x82, 0xd3, 0xed, 0xdc, 0x8f, 0x12, 0x1b, 0xee, 0x60, 0xd6, 0x2e, 0xef, 0x06, 0x95, 0xd2, + 0x39, 0x1f, 0x8f, 0x0b, 0x6a, 0xca, 0x6a, 0xc6, 0xe5, 0x0f, 0xac, 0x19, 0x5f, 0x85, 0x31, 0xa6, + 0xd4, 0xa5, 0xe9, 0x63, 0x06, 0x0a, 0x3d, 0x62, 0x5b, 0xf7, 0xb2, 0x28, 0x88, 0x15, 0x0b, 0xf4, + 0xf3, 0x16, 0x3c, 0x9c, 0x6d, 0x3a, 0x26, 0x0c, 0x2d, 0xd2, 0x11, 0x72, 0x63, 0x63, 0x55, 0x7c, + 0xff, 0xc3, 0x8d, 0x5e, 0xc4, 0x87, 0xfd, 0x08, 0x70, 0xef, 0xca, 0x50, 0x3d, 0xc7, 0xda, 0x19, + 0x31, 0xcf, 0x54, 0xfa, 0x5b, 0x3c, 0xc7, 0xab, 0xaf, 0x7f, 0xd5, 0xca, 0x51, 0x34, 0xb9, 0x65, + 0xf5, 0x8a, 0x69, 0x59, 0x3d, 0x96, 0xb5, 0xac, 0xba, 0xfc, 0x24, 0x86, 0x51, 0x35, 0x78, 0xc2, + 0xd4, 0x41, 0x33, 0xe5, 0xd8, 0x3e, 0x9c, 0xeb, 0x27, 0x66, 0x59, 0x20, 0x95, 0xab, 0x4e, 0x18, + 0xd3, 0x40, 0x2a, 0x77, 0xad, 0x8e, 0x19, 0x66, 0xd0, 0x9c, 0x0b, 0xf6, 0x7f, 0xb5, 0xa0, 0xdc, + 0x08, 0xdd, 0x63, 0xf0, 0xfb, 0x7c, 0xda, 0xf0, 0xfb, 0x3c, 0x58, 0xf0, 0x58, 0x5f, 0xa1, 0x97, + 0x67, 0x25, 0xe3, 0xe5, 0x79, 0xb8, 0x88, 0x41, 0x6f, 0x9f, 0xce, 0xdf, 0x2b, 0x83, 0xfe, 0xb4, + 0x20, 0xfa, 0x57, 0x77, 0x13, 0x91, 0x5b, 0xee, 0xf5, 0xda, 0xa0, 0xe0, 0xcc, 0xe2, 0xaf, 0xe4, + 0x65, 0xbf, 0x1f, 0xb2, 0xc0, 0xdc, 0x37, 0x88, 0xb7, 0xb9, 0x95, 0x10, 0x37, 0xfb, 0x39, 0xc7, + 0x17, 0x98, 0xfb, 0x9f, 0x2c, 0x98, 0xce, 0xd4, 0x8e, 0xfc, 0xbc, 0x9b, 0x43, 0x77, 0xe9, 0xc9, + 0x99, 0xed, 0x7b, 0xd5, 0x68, 0x1e, 0x40, 0x39, 0xd5, 0xa5, 0xb7, 0x84, 0x69, 0xb1, 0xca, 0xeb, + 0x1e, 0x63, 0x8d, 0x02, 0xbd, 0x00, 0xe3, 0x49, 0xd8, 0x0e, 0xfd, 0x70, 0x73, 0xef, 0x32, 0x91, + 0x59, 0x3e, 0xd4, 0xd1, 0xc7, 0x7a, 0x8a, 0xc2, 0x3a, 0x9d, 0xfd, 0x6b, 0x65, 0xc8, 0x3e, 0x47, + 0xf9, 0xff, 0xe6, 0xe4, 0x47, 0x73, 0x4e, 0x7e, 0xdb, 0x82, 0x19, 0x5a, 0x3b, 0x8b, 0x6d, 0x91, + 0x21, 0xad, 0xea, 0x65, 0x05, 0xab, 0xc7, 0xcb, 0x0a, 0x8f, 0x51, 0xd9, 0xe5, 0x86, 0x9d, 0x44, + 0x78, 0x75, 0x34, 0xe1, 0x44, 0xa1, 0x58, 0x60, 0x05, 0x1d, 0x89, 0x22, 0x71, 0x1f, 0x48, 0xa7, + 0x23, 0x51, 0x84, 0x05, 0x56, 0x3e, 0xbc, 0x30, 0x54, 0xf0, 0xf0, 0x02, 0x4b, 0x90, 0x25, 0xe2, + 0x29, 0x84, 0x6a, 0xa0, 0x25, 0xc8, 0x92, 0x81, 0x16, 0x29, 0x8d, 0xfd, 0xb5, 0x32, 0x4c, 0x34, + 0x42, 0x37, 0x8d, 0x82, 0x7f, 0xde, 0x88, 0x82, 0x3f, 0x97, 0x89, 0x82, 0x9f, 0xd1, 0x69, 0xef, + 0x4d, 0x10, 0xbc, 0x48, 0x9f, 0xc6, 0x9e, 0x01, 0xb9, 0xcb, 0x00, 0x78, 0x23, 0x7d, 0x9a, 0x62, + 0x84, 0x4d, 0xbe, 0x3f, 0x4a, 0x81, 0xef, 0x7f, 0x61, 0xc1, 0x54, 0x23, 0x74, 0xe9, 0x04, 0xfd, + 0x51, 0x9a, 0x8d, 0x7a, 0xfa, 0xb5, 0x91, 0x1e, 0xe9, 0xd7, 0xfe, 0xbe, 0x05, 0xa3, 0x8d, 0xd0, + 0x3d, 0x06, 0x8f, 0xe7, 0x2b, 0xa6, 0xc7, 0xf3, 0x81, 0x02, 0x29, 0x5b, 0xe0, 0xe4, 0xfc, 0xed, + 0x32, 0x4c, 0xd2, 0x76, 0x86, 0x9b, 0x72, 0x94, 0x8c, 0x1e, 0xb1, 0x06, 0xe8, 0x11, 0xaa, 0xcc, + 0x85, 0xbe, 0x1f, 0xde, 0xce, 0x8e, 0xd8, 0x2a, 0x83, 0x62, 0x81, 0x45, 0x4f, 0xc3, 0x58, 0x3b, + 0x22, 0xbb, 0x5e, 0xd8, 0x89, 0xb3, 0x37, 0x0a, 0x1b, 0x02, 0x8e, 0x15, 0x05, 0x7a, 0x1e, 0x26, + 0x62, 0x2f, 0x68, 0x11, 0x19, 0x63, 0x31, 0xc4, 0x62, 0x2c, 0x78, 0x06, 0x4b, 0x0d, 0x8e, 0x0d, + 0x2a, 0xf4, 0x06, 0x54, 0xd8, 0x7f, 0xb6, 0x6e, 0x8e, 0xfe, 0xae, 0x02, 0x37, 0x55, 0x25, 0x03, + 0x9c, 0xf2, 0x42, 0x17, 0x00, 0x12, 0x19, 0x0d, 0x12, 0x8b, 0x0b, 0xaf, 0x4a, 0xa3, 0x54, 0x71, + 0x22, 0x31, 0xd6, 0xa8, 0xd0, 0x53, 0x50, 0x49, 0x1c, 0xcf, 0xbf, 0xe2, 0x05, 0x24, 0x16, 0xd1, + 0x34, 0x22, 0x2b, 0xb4, 0x00, 0xe2, 0x14, 0x4f, 0x77, 0x74, 0x76, 0x9d, 0x9a, 0xbf, 0xca, 0x32, + 0xc6, 0xa8, 0xd9, 0x8e, 0x7e, 0x45, 0x41, 0xb1, 0x46, 0x61, 0xbf, 0x04, 0xa7, 0x1a, 0xa1, 0xdb, + 0x08, 0xa3, 0x64, 0x35, 0x8c, 0x6e, 0x3b, 0x91, 0x2b, 0xc7, 0xaf, 0x26, 0x13, 0x14, 0xd3, 0x5d, + 0x77, 0x98, 0xdb, 0xf5, 0x46, 0xea, 0xe1, 0xe7, 0xd8, 0x9e, 0x7e, 0xc4, 0xab, 0x0f, 0xff, 0xb6, + 0x04, 0xa8, 0xc1, 0xe2, 0x55, 0x8c, 0xa7, 0x7b, 0xde, 0x81, 0xa9, 0x98, 0x5c, 0xf1, 0x82, 0xce, + 0x1d, 0xc1, 0xaa, 0xd7, 0xbd, 0x92, 0xe6, 0x8a, 0x4e, 0xc9, 0x7d, 0x23, 0x26, 0x0c, 0x67, 0xb8, + 0xd1, 0x2e, 0x8c, 0x3a, 0xc1, 0x62, 0x7c, 0x23, 0x26, 0x91, 0x78, 0xaa, 0x86, 0x75, 0x21, 0x96, + 0x40, 0x9c, 0xe2, 0xe9, 0x94, 0x61, 0x7f, 0xae, 0x85, 0x01, 0x0e, 0xc3, 0x44, 0x4e, 0x32, 0xf6, + 0xd8, 0x81, 0x06, 0xc7, 0x06, 0x15, 0x5a, 0x05, 0x14, 0x77, 0xda, 0x6d, 0x9f, 0x1d, 0xef, 0x39, + 0xfe, 0xc5, 0x28, 0xec, 0xb4, 0x79, 0xc0, 0xb1, 0x78, 0x27, 0xa0, 0xd9, 0x85, 0xc5, 0x39, 0x25, + 0xa8, 0x60, 0xd8, 0x88, 0xd9, 0x6f, 0x71, 0xa3, 0x9a, 0x7b, 0x29, 0x9b, 0x0c, 0x84, 0x25, 0xce, + 0xfe, 0x1c, 0xdb, 0xcc, 0xd8, 0x0b, 0x23, 0x49, 0x27, 0x22, 0x68, 0x07, 0x26, 0xdb, 0x6c, 0xc3, + 0x4a, 0xa2, 0xd0, 0xf7, 0x89, 0xd4, 0x1b, 0xef, 0x2e, 0x76, 0x86, 0xbf, 0x38, 0xa0, 0xb3, 0xc3, + 0x26, 0x77, 0xfb, 0x0b, 0xd3, 0x4c, 0x2e, 0x35, 0xb9, 0xd1, 0x32, 0x2a, 0x22, 0x62, 0x85, 0x86, + 0x36, 0x57, 0xfc, 0xa2, 0x57, 0x2a, 0xe9, 0x45, 0x54, 0x2d, 0x96, 0x65, 0xd1, 0xeb, 0x2c, 0x52, + 0x9b, 0x0b, 0x83, 0x7e, 0x6f, 0x09, 0x72, 0x2a, 0x23, 0x4a, 0x5b, 0x14, 0xc4, 0x1a, 0x13, 0x74, + 0x05, 0x26, 0xc5, 0x83, 0x14, 0xc2, 0x85, 0x50, 0x36, 0xcc, 0xdf, 0x49, 0xac, 0x23, 0x0f, 0xb3, + 0x00, 0x6c, 0x16, 0x46, 0x9b, 0xf0, 0xb0, 0xf6, 0x7c, 0x52, 0x4e, 0xfc, 0x16, 0x97, 0x2d, 0x8f, + 0x1c, 0xec, 0xd7, 0x1e, 0x5e, 0xef, 0x45, 0x88, 0x7b, 0xf3, 0x41, 0xd7, 0xe1, 0x94, 0xd3, 0x4a, + 0xbc, 0x5d, 0x52, 0x27, 0x8e, 0xeb, 0x7b, 0x01, 0x31, 0xaf, 0xd8, 0x9f, 0x39, 0xd8, 0xaf, 0x9d, + 0x5a, 0xcc, 0x23, 0xc0, 0xf9, 0xe5, 0xd0, 0x2b, 0x50, 0x71, 0x83, 0x58, 0xf4, 0xc1, 0x88, 0xf1, + 0x32, 0x58, 0xa5, 0x7e, 0xad, 0xa9, 0xbe, 0x3f, 0xfd, 0x83, 0xd3, 0x02, 0x68, 0x93, 0xbf, 0x9b, + 0xaf, 0x2c, 0x92, 0xd1, 0xae, 0xbc, 0x09, 0x59, 0xdb, 0xd6, 0xb8, 0x7b, 0xc2, 0xfd, 0x67, 0x2a, + 0x3a, 0xd2, 0xb8, 0x96, 0x62, 0x30, 0x46, 0xaf, 0x01, 0x8a, 0x49, 0xb4, 0xeb, 0xb5, 0xc8, 0x62, + 0x8b, 0xa5, 0x78, 0x65, 0x5e, 0x97, 0x31, 0x23, 0xd4, 0x1f, 0x35, 0xbb, 0x28, 0x70, 0x4e, 0x29, + 0x74, 0x89, 0x4a, 0x14, 0x1d, 0x2a, 0x82, 0x59, 0xa5, 0x9a, 0x57, 0xad, 0x93, 0x76, 0x44, 0x5a, + 0x4e, 0x42, 0x5c, 0x93, 0x23, 0xce, 0x94, 0xa3, 0xfb, 0x8d, 0xca, 0x9c, 0x0f, 0x66, 0x08, 0x66, + 0x77, 0xf6, 0x7c, 0x6a, 0x21, 0x6d, 0x85, 0x71, 0x72, 0x8d, 0x24, 0xb7, 0xc3, 0x68, 0x5b, 0xe4, + 0xc5, 0x4a, 0xd3, 0xe6, 0xa5, 0x28, 0xac, 0xd3, 0x51, 0x8d, 0x88, 0x1d, 0x62, 0xad, 0xd5, 0xd9, + 0x89, 0xc3, 0x58, 0xba, 0x4e, 0x2e, 0x71, 0x30, 0x96, 0x78, 0x49, 0xba, 0xd6, 0x58, 0x66, 0xe7, + 0x08, 0x19, 0xd2, 0xb5, 0xc6, 0x32, 0x96, 0x78, 0x44, 0xba, 0x5f, 0x5d, 0x9b, 0x2a, 0x3e, 0xab, + 0xe9, 0x96, 0xcb, 0x03, 0x3e, 0xbc, 0x16, 0xc0, 0x8c, 0x7a, 0xef, 0x8d, 0x27, 0x0c, 0x8b, 0xab, + 0xd3, 0xc5, 0x0f, 0xf8, 0xe7, 0x66, 0x1b, 0x53, 0x5e, 0xb5, 0xb5, 0x0c, 0x27, 0xdc, 0xc5, 0xdb, + 0x48, 0xdd, 0x30, 0xd3, 0xf7, 0xe5, 0x83, 0x05, 0xa8, 0xc4, 0x9d, 0x5b, 0x6e, 0xb8, 0xe3, 0x78, + 0x01, 0x73, 0xfb, 0xeb, 0xaf, 0xac, 0x4b, 0x04, 0x4e, 0x69, 0xd0, 0x2a, 0x8c, 0x39, 0xc2, 0xf8, + 0x12, 0x8e, 0xfa, 0xdc, 0xbb, 0xdc, 0xd2, 0x40, 0xe3, 0x1e, 0x4d, 0xf9, 0x0f, 0xab, 0xb2, 0xe8, + 0x65, 0x98, 0x14, 0xd7, 0x8d, 0x44, 0xa4, 0xe0, 0x09, 0x33, 0x32, 0xbd, 0xa9, 0x23, 0xb1, 0x49, + 0x8b, 0x7e, 0x1a, 0xa6, 0x28, 0x97, 0x54, 0xb0, 0x55, 0x4f, 0x0e, 0x22, 0x11, 0xb5, 0x8c, 0xd6, + 0x7a, 0x61, 0x9c, 0x61, 0x86, 0x5c, 0x78, 0xc8, 0xe9, 0x24, 0xe1, 0x0e, 0x9d, 0xe1, 0xe6, 0xfc, + 0x5f, 0x0f, 0xb7, 0x49, 0xc0, 0xfc, 0xf4, 0x63, 0x4b, 0xe7, 0x0e, 0xf6, 0x6b, 0x0f, 0x2d, 0xf6, + 0xa0, 0xc3, 0x3d, 0xb9, 0xa0, 0x1b, 0x30, 0x9e, 0x84, 0xbe, 0x08, 0xf1, 0x8d, 0xab, 0xa7, 0x8b, + 0x53, 0xcf, 0xac, 0x2b, 0x32, 0xdd, 0x9d, 0xa0, 0x8a, 0x62, 0x9d, 0x0f, 0x5a, 0xe7, 0x6b, 0x8c, + 0x25, 0x4a, 0x24, 0x71, 0xf5, 0x81, 0xe2, 0x8e, 0x51, 0xf9, 0x14, 0xcd, 0x25, 0x28, 0x4a, 0x62, + 0x9d, 0x0d, 0xba, 0x08, 0xb3, 0xed, 0xc8, 0x0b, 0xd9, 0xc4, 0x56, 0x2e, 0xdf, 0xaa, 0x91, 0x94, + 0x6c, 0xb6, 0x91, 0x25, 0xc0, 0xdd, 0x65, 0xd0, 0x79, 0xaa, 0xa0, 0x72, 0x60, 0xf5, 0x0c, 0x7f, + 0x11, 0x83, 0x2b, 0xa7, 0x1c, 0x86, 0x15, 0x76, 0xee, 0x27, 0x60, 0xb6, 0x4b, 0x52, 0x1e, 0x29, + 0xdc, 0xf2, 0x37, 0x86, 0xa1, 0xa2, 0xdc, 0x81, 0x68, 0xc1, 0xf4, 0xf2, 0x9e, 0xc9, 0x7a, 0x79, + 0xc7, 0xa8, 0xbe, 0xa6, 0x3b, 0x76, 0xd7, 0x73, 0x1e, 0xf5, 0x3e, 0x57, 0x20, 0x1a, 0x06, 0xbf, + 0x1b, 0x75, 0x84, 0x07, 0xcf, 0x53, 0x83, 0x71, 0xa8, 0xa7, 0xc1, 0x38, 0xe0, 0x03, 0x7b, 0xd4, + 0x34, 0x6c, 0x87, 0xee, 0x5a, 0x23, 0xfb, 0xe2, 0x54, 0x83, 0x02, 0x31, 0xc7, 0x31, 0xe5, 0x9e, + 0x6e, 0xeb, 0x4c, 0xb9, 0x1f, 0xbd, 0x4b, 0xe5, 0x5e, 0x32, 0xc0, 0x29, 0x2f, 0xe4, 0xc3, 0x6c, + 0xcb, 0x7c, 0x2c, 0x4c, 0xdd, 0x87, 0x7a, 0xb4, 0xef, 0xb3, 0x5d, 0x1d, 0xed, 0x05, 0x91, 0xe5, + 0x2c, 0x17, 0xdc, 0xcd, 0x18, 0xbd, 0x0c, 0x63, 0xef, 0x85, 0x31, 0x9b, 0x76, 0x62, 0x6f, 0x93, + 0x37, 0x50, 0xc6, 0x5e, 0xbf, 0xde, 0x64, 0xf0, 0xc3, 0xfd, 0xda, 0x78, 0x23, 0x74, 0xe5, 0x5f, + 0xac, 0x0a, 0xa0, 0x3b, 0x70, 0xca, 0x90, 0x08, 0xaa, 0xb9, 0x30, 0x78, 0x73, 0x1f, 0x16, 0xd5, + 0x9d, 0x5a, 0xcb, 0xe3, 0x84, 0xf3, 0x2b, 0xb0, 0xbf, 0xce, 0x9d, 0x9e, 0xc2, 0x35, 0x42, 0xe2, + 0x8e, 0x7f, 0x1c, 0xcf, 0x04, 0xac, 0x18, 0x5e, 0x9b, 0xbb, 0x76, 0xac, 0xff, 0x81, 0xc5, 0x1c, + 0xeb, 0xeb, 0x64, 0xa7, 0xed, 0x3b, 0xc9, 0x71, 0x04, 0xd9, 0xbe, 0x0e, 0x63, 0x89, 0xa8, 0xad, + 0xd7, 0xcb, 0x06, 0x5a, 0xa3, 0xd8, 0xe1, 0x82, 0xda, 0x10, 0x25, 0x14, 0x2b, 0x36, 0xf6, 0x3f, + 0xe5, 0x23, 0x20, 0x31, 0xc7, 0xe0, 0x5b, 0xa8, 0x9b, 0xbe, 0x85, 0x5a, 0x9f, 0x2f, 0x28, 0xf0, + 0x31, 0xfc, 0x13, 0xb3, 0xdd, 0xcc, 0xf6, 0xf8, 0xa8, 0x9f, 0xe8, 0xd8, 0xbf, 0x6c, 0xc1, 0xc9, + 0xbc, 0x23, 0x7d, 0xaa, 0xc4, 0x70, 0xcb, 0x47, 0x9d, 0x70, 0xa9, 0x1e, 0xbc, 0x29, 0xe0, 0x58, + 0x51, 0x0c, 0x9c, 0x5d, 0xfc, 0x68, 0xe9, 0x96, 0xae, 0x83, 0xf9, 0xae, 0x1c, 0x7a, 0x95, 0x47, + 0xcd, 0x5b, 0xea, 0xe1, 0xb7, 0xa3, 0x45, 0xcc, 0xdb, 0xbf, 0x5e, 0x82, 0x93, 0xdc, 0x45, 0xbd, + 0xb8, 0x1b, 0x7a, 0x6e, 0x23, 0x74, 0xc5, 0x1d, 0x82, 0xb7, 0x60, 0xa2, 0xad, 0x99, 0xab, 0xbd, + 0x12, 0xbe, 0xe8, 0x66, 0x6d, 0x6a, 0x36, 0xe8, 0x50, 0x6c, 0xf0, 0x42, 0x2e, 0x4c, 0x90, 0x5d, + 0xaf, 0xa5, 0xfc, 0x9c, 0xa5, 0x23, 0x8b, 0x74, 0x55, 0xcb, 0x8a, 0xc6, 0x07, 0x1b, 0x5c, 0xef, + 0xc3, 0x1b, 0x20, 0xf6, 0x97, 0x2d, 0x78, 0xa0, 0x20, 0x3d, 0x0c, 0xad, 0xee, 0x36, 0x3b, 0x0c, + 0x10, 0x8f, 0x14, 0xaa, 0xea, 0xf8, 0x11, 0x01, 0x16, 0x58, 0xf4, 0x53, 0x00, 0xdc, 0xc5, 0xcf, + 0x9e, 0x84, 0x2f, 0xf5, 0xbe, 0x7f, 0x6e, 0xa4, 0x4d, 0xd0, 0xee, 0xd6, 0xab, 0x47, 0xe0, 0x35, + 0x5e, 0xf6, 0xaf, 0x96, 0x61, 0x98, 0xbf, 0x58, 0xbd, 0x0a, 0xa3, 0x5b, 0x3c, 0x19, 0xed, 0x20, + 0x79, 0x6f, 0x53, 0x73, 0x84, 0x03, 0xb0, 0x2c, 0x8c, 0xae, 0xc2, 0x09, 0x71, 0x4f, 0xa5, 0x4e, + 0x7c, 0x67, 0x4f, 0x5a, 0xb5, 0xfc, 0x61, 0x08, 0x99, 0xb4, 0xfc, 0xc4, 0x5a, 0x37, 0x09, 0xce, + 0x2b, 0x87, 0x5e, 0xed, 0x4a, 0x41, 0xc7, 0xd3, 0xf8, 0x2a, 0x1d, 0xb8, 0x4f, 0x1a, 0xba, 0x97, + 0x61, 0xb2, 0xdd, 0x65, 0xbf, 0x6b, 0x8f, 0x05, 0x9b, 0x36, 0xbb, 0x49, 0xcb, 0xe2, 0x03, 0x3a, + 0x2c, 0x1a, 0x62, 0x7d, 0x2b, 0x22, 0xf1, 0x56, 0xe8, 0xbb, 0xe2, 0x65, 0xcc, 0x34, 0x3e, 0x20, + 0x83, 0xc7, 0x5d, 0x25, 0x28, 0x97, 0x0d, 0xc7, 0xf3, 0x3b, 0x11, 0x49, 0xb9, 0x8c, 0x98, 0x5c, + 0x56, 0x33, 0x78, 0xdc, 0x55, 0x82, 0xce, 0xa3, 0x53, 0xe2, 0x59, 0x45, 0x79, 0x7b, 0x59, 0x05, + 0x7d, 0x8c, 0xca, 0xf8, 0xf4, 0x1e, 0x19, 0x35, 0xc4, 0x91, 0xbf, 0x7a, 0x98, 0x51, 0x7b, 0xb0, + 0x4b, 0x44, 0xa6, 0x4b, 0x2e, 0x77, 0xf3, 0xb8, 0xdf, 0x9f, 0x5a, 0x70, 0x22, 0x27, 0x10, 0x8c, + 0x8b, 0xaa, 0x4d, 0x2f, 0x4e, 0xd4, 0x7b, 0x04, 0x9a, 0xa8, 0xe2, 0x70, 0xac, 0x28, 0xe8, 0x7a, + 0xe0, 0xc2, 0x30, 0x2b, 0x00, 0x45, 0xf0, 0x86, 0xc0, 0x1e, 0x4d, 0x00, 0xa2, 0x73, 0x30, 0xd4, + 0x89, 0x49, 0x24, 0x5f, 0xc4, 0x93, 0xf2, 0x9b, 0x79, 0x04, 0x19, 0x86, 0x6a, 0x94, 0x9b, 0xca, + 0x19, 0xa7, 0x69, 0x94, 0xdc, 0x1d, 0xc7, 0x71, 0xf6, 0x97, 0xca, 0x30, 0x9d, 0x09, 0xe0, 0xa4, + 0x0d, 0xd9, 0x09, 0x03, 0x2f, 0x09, 0x55, 0x06, 0x34, 0x9e, 0xf0, 0x81, 0xb4, 0xb7, 0xae, 0x0a, + 0x38, 0x56, 0x14, 0xe8, 0x31, 0xf9, 0x54, 0x6a, 0xf6, 0x9d, 0x85, 0xa5, 0xba, 0xf1, 0x5a, 0xea, + 0xa0, 0x0f, 0xa6, 0x3c, 0x0a, 0x43, 0xed, 0x50, 0xbd, 0x63, 0xad, 0xc6, 0x13, 0x2f, 0xd5, 0x1b, + 0x61, 0xe8, 0x63, 0x86, 0x44, 0x9f, 0x10, 0x5f, 0x9f, 0x39, 0xaf, 0xc0, 0x8e, 0x1b, 0xc6, 0x5a, + 0x17, 0x3c, 0x01, 0xa3, 0xdb, 0x64, 0x2f, 0xf2, 0x82, 0xcd, 0xec, 0x69, 0xcd, 0x65, 0x0e, 0xc6, + 0x12, 0x6f, 0x26, 0x1c, 0x1f, 0xbd, 0x2f, 0x6f, 0x9e, 0x8c, 0xf5, 0xdd, 0xd5, 0x7e, 0xdb, 0x82, + 0x69, 0x96, 0x6d, 0x54, 0xdc, 0x93, 0xf7, 0xc2, 0xe0, 0x18, 0xf4, 0x84, 0x47, 0x61, 0x38, 0xa2, + 0x95, 0x66, 0x1f, 0x32, 0x60, 0x2d, 0xc1, 0x1c, 0x87, 0x1e, 0x82, 0x21, 0xd6, 0x04, 0x3a, 0x78, + 0x13, 0x3c, 0xdf, 0x78, 0xdd, 0x49, 0x1c, 0xcc, 0xa0, 0xec, 0xc2, 0x12, 0x26, 0x6d, 0xdf, 0xe3, + 0x8d, 0x4e, 0xdd, 0xad, 0x1f, 0x8d, 0x0b, 0x4b, 0xb9, 0x4d, 0xfb, 0x60, 0x17, 0x96, 0xf2, 0x59, + 0xf6, 0xd6, 0xc1, 0xff, 0x5b, 0x09, 0xce, 0xe6, 0x96, 0x4b, 0x4f, 0x76, 0x57, 0x8d, 0x93, 0xdd, + 0x0b, 0x99, 0x93, 0x5d, 0xbb, 0x77, 0xe9, 0x7b, 0x73, 0xd6, 0x9b, 0x7f, 0x04, 0x5b, 0x3e, 0xc6, + 0x23, 0xd8, 0xa1, 0x41, 0xd5, 0x94, 0xe1, 0x3e, 0x6a, 0xca, 0xb7, 0x2c, 0x38, 0x93, 0xdb, 0x65, + 0x1f, 0x91, 0x1b, 0x62, 0xb9, 0x6d, 0x2b, 0xb0, 0x21, 0x7e, 0x50, 0x2a, 0xf8, 0x16, 0x66, 0x4d, + 0x9c, 0xa7, 0x72, 0x86, 0x21, 0x63, 0xa1, 0x76, 0x4d, 0x70, 0x19, 0xc3, 0x61, 0x58, 0x61, 0x91, + 0xa7, 0xdd, 0xb5, 0xe2, 0x4d, 0x7b, 0xf9, 0x48, 0x4b, 0x66, 0xde, 0xf4, 0x8e, 0xeb, 0x97, 0xfa, + 0xb3, 0xf7, 0xae, 0xae, 0x6a, 0x16, 0x60, 0x79, 0x70, 0x0b, 0x70, 0x22, 0xdf, 0xfa, 0x43, 0x8b, + 0x30, 0xbd, 0xe3, 0x05, 0xec, 0x35, 0x52, 0x53, 0xef, 0x51, 0x17, 0x54, 0xaf, 0x9a, 0x68, 0x9c, + 0xa5, 0x9f, 0x7b, 0x19, 0x26, 0xef, 0xde, 0x65, 0xf5, 0xed, 0x32, 0x3c, 0xd8, 0x63, 0xd9, 0x73, + 0x59, 0x6f, 0x8c, 0x81, 0x26, 0xeb, 0xbb, 0xc6, 0xa1, 0x01, 0x27, 0x37, 0x3a, 0xbe, 0xbf, 0xc7, + 0xa2, 0x9c, 0x88, 0x2b, 0x29, 0x84, 0x62, 0xa2, 0x52, 0x09, 0xaf, 0xe6, 0xd0, 0xe0, 0xdc, 0x92, + 0xe8, 0x35, 0x40, 0xe1, 0x2d, 0x96, 0xde, 0xd6, 0x4d, 0x53, 0x15, 0xb0, 0x8e, 0x2f, 0xa7, 0x8b, + 0xf1, 0x7a, 0x17, 0x05, 0xce, 0x29, 0x45, 0x35, 0x4c, 0xf6, 0x86, 0xba, 0x6a, 0x56, 0x46, 0xc3, + 0xc4, 0x3a, 0x12, 0x9b, 0xb4, 0xe8, 0x22, 0xcc, 0x3a, 0xbb, 0x8e, 0xc7, 0x53, 0x57, 0x49, 0x06, + 0x5c, 0xc5, 0x54, 0x8e, 0xa2, 0xc5, 0x2c, 0x01, 0xee, 0x2e, 0x83, 0x36, 0x0c, 0x2f, 0x1f, 0xcf, + 0x9c, 0x7f, 0x61, 0xe0, 0xd9, 0x3a, 0xb0, 0xdf, 0xcf, 0xfe, 0x0f, 0x16, 0xdd, 0xbe, 0x72, 0x9e, + 0xbf, 0xa4, 0xfd, 0xa0, 0xfc, 0x57, 0xda, 0x3d, 0x31, 0xd5, 0x0f, 0xcb, 0x3a, 0x12, 0x9b, 0xb4, + 0x7c, 0x42, 0xc4, 0x69, 0xb8, 0xb4, 0xa1, 0x27, 0x8a, 0x8b, 0x95, 0x8a, 0x02, 0xbd, 0x09, 0xa3, + 0xae, 0xb7, 0xeb, 0xc5, 0x61, 0x24, 0x16, 0xcb, 0x51, 0x9f, 0x7d, 0x56, 0x72, 0xb0, 0xce, 0xd9, + 0x60, 0xc9, 0xcf, 0xfe, 0x52, 0x09, 0x26, 0x65, 0x8d, 0xaf, 0x77, 0xc2, 0xc4, 0x39, 0x86, 0x6d, + 0xf9, 0xa2, 0xb1, 0x2d, 0x7f, 0xa2, 0xd7, 0xed, 0x52, 0xd6, 0xa4, 0xc2, 0xed, 0xf8, 0x7a, 0x66, + 0x3b, 0x7e, 0xbc, 0x3f, 0xab, 0xde, 0xdb, 0xf0, 0xef, 0x59, 0x30, 0x6b, 0xd0, 0x1f, 0xc3, 0x6e, + 0xb0, 0x6a, 0xee, 0x06, 0x8f, 0xf4, 0xfd, 0x86, 0x82, 0x5d, 0xe0, 0xab, 0xa5, 0x4c, 0xdb, 0x99, + 0xf4, 0x7f, 0x0f, 0x86, 0xb6, 0x9c, 0xc8, 0xed, 0x95, 0x80, 0xb1, 0xab, 0xd0, 0xfc, 0x25, 0x27, + 0x72, 0xb9, 0x0c, 0x7f, 0x5a, 0xbd, 0xcc, 0xe5, 0x44, 0x6e, 0xdf, 0xdb, 0x01, 0xac, 0x2a, 0xf4, + 0x12, 0x8c, 0xc4, 0xad, 0xb0, 0xad, 0x62, 0x2f, 0xcf, 0xf1, 0x57, 0xbb, 0x28, 0xe4, 0x70, 0xbf, + 0x86, 0xcc, 0xea, 0x28, 0x18, 0x0b, 0xfa, 0xb9, 0x4d, 0xa8, 0xa8, 0xaa, 0xef, 0x6b, 0x54, 0xf9, + 0x1f, 0x97, 0xe1, 0x44, 0xce, 0xbc, 0x40, 0xb1, 0xd1, 0x5b, 0xcf, 0x0e, 0x38, 0x9d, 0x3e, 0x60, + 0x7f, 0xc5, 0xcc, 0x62, 0x71, 0xc5, 0xf8, 0x0f, 0x5c, 0xe9, 0x8d, 0x98, 0x64, 0x2b, 0xa5, 0xa0, + 0xfe, 0x95, 0xd2, 0xca, 0x8e, 0xad, 0xab, 0x69, 0x45, 0xaa, 0xa5, 0xf7, 0x75, 0x4c, 0xff, 0xac, + 0x0c, 0x27, 0xf3, 0x2e, 0xa5, 0xa3, 0x9f, 0xcd, 0x3c, 0xe7, 0xf0, 0xfc, 0xa0, 0xd7, 0xd9, 0xf9, + 0x1b, 0x0f, 0x22, 0xd7, 0xcb, 0xbc, 0xf9, 0xc0, 0x43, 0xdf, 0x6e, 0x16, 0x75, 0xb2, 0xeb, 0x3a, + 0x11, 0x7f, 0x86, 0x43, 0x2e, 0xf1, 0x4f, 0x0e, 0xdc, 0x00, 0xf1, 0x7e, 0x47, 0x9c, 0xb9, 0xae, + 0x23, 0xc1, 0xfd, 0xaf, 0xeb, 0xc8, 0x9a, 0xe7, 0x3c, 0x18, 0xd7, 0xbe, 0xe6, 0xbe, 0x8e, 0xf8, + 0x36, 0xdd, 0x51, 0xb4, 0x76, 0xdf, 0xd7, 0x51, 0xff, 0xb2, 0x05, 0x99, 0x38, 0x29, 0xe5, 0xff, + 0xb0, 0x0a, 0xfd, 0x1f, 0xe7, 0x60, 0x28, 0x0a, 0x7d, 0x92, 0xcd, 0xf0, 0x8f, 0x43, 0x9f, 0x60, + 0x86, 0x51, 0xcf, 0xf0, 0x96, 0x8b, 0x9e, 0xe1, 0xa5, 0xa6, 0xb1, 0x4f, 0x76, 0x89, 0xf4, 0x46, + 0x28, 0x99, 0x7c, 0x85, 0x02, 0x31, 0xc7, 0xd9, 0xbf, 0x39, 0x04, 0x27, 0x72, 0x2e, 0xa7, 0x51, + 0x43, 0x65, 0xd3, 0x49, 0xc8, 0x6d, 0x67, 0x2f, 0x9b, 0x75, 0xf4, 0x22, 0x07, 0x63, 0x89, 0x67, + 0xb1, 0x9c, 0x3c, 0x71, 0x59, 0xc6, 0x47, 0x24, 0xf2, 0x95, 0x09, 0xec, 0xfd, 0x7a, 0x99, 0xf5, + 0x02, 0x40, 0x1c, 0xfb, 0x2b, 0x01, 0x55, 0xbe, 0x5c, 0x11, 0x29, 0x9a, 0x66, 0xb9, 0x6b, 0x5e, + 0x11, 0x18, 0xac, 0x51, 0xa1, 0x3a, 0xcc, 0xb4, 0xa3, 0x30, 0xe1, 0x7e, 0xb7, 0x3a, 0x8f, 0x51, + 0x18, 0x36, 0xaf, 0x19, 0x35, 0x32, 0x78, 0xdc, 0x55, 0x02, 0xbd, 0x00, 0xe3, 0xe2, 0xea, 0x51, + 0x23, 0x0c, 0x7d, 0xe1, 0xa5, 0x51, 0x27, 0xde, 0xcd, 0x14, 0x85, 0x75, 0x3a, 0xad, 0x18, 0x73, + 0xe6, 0x8d, 0xe6, 0x16, 0xe3, 0x0e, 0x3d, 0x8d, 0x2e, 0x93, 0x9b, 0x62, 0x6c, 0xa0, 0xdc, 0x14, + 0xa9, 0xdf, 0xaa, 0x32, 0xf0, 0xf9, 0x05, 0xf4, 0xf5, 0xf4, 0x7c, 0xbd, 0x0c, 0x23, 0x7c, 0x28, + 0x8e, 0x41, 0x15, 0x5b, 0x15, 0xbe, 0x9b, 0x1e, 0x19, 0x01, 0x78, 0x5b, 0xe6, 0xeb, 0x4e, 0xe2, + 0x70, 0x31, 0xa4, 0x56, 0x43, 0xea, 0xe5, 0x41, 0xf3, 0xc6, 0x7a, 0x99, 0xcb, 0x38, 0x27, 0x80, + 0xf3, 0xd0, 0x56, 0xcf, 0x3b, 0x00, 0x31, 0x7b, 0x1d, 0x94, 0xf2, 0x10, 0x19, 0x4c, 0x9f, 0xec, + 0x51, 0x7b, 0x53, 0x11, 0xf3, 0x36, 0xa4, 0x53, 0x50, 0x21, 0xb0, 0xc6, 0x71, 0xee, 0x45, 0xa8, + 0x28, 0xe2, 0x7e, 0x96, 0xdc, 0x84, 0x2e, 0xbc, 0x3e, 0x0d, 0xd3, 0x99, 0xba, 0x8e, 0x64, 0x08, + 0xfe, 0x8e, 0x05, 0xd3, 0xbc, 0xc9, 0x2b, 0xc1, 0xae, 0x58, 0xec, 0xef, 0xc3, 0x49, 0x3f, 0x67, + 0xd1, 0x89, 0x11, 0x1d, 0x7c, 0x91, 0x2a, 0xc3, 0x2f, 0x0f, 0x8b, 0x73, 0xeb, 0xa0, 0xc6, 0x3f, + 0x7f, 0xd7, 0xd8, 0xf1, 0x45, 0x04, 0xf2, 0x04, 0xcf, 0xec, 0xcc, 0x61, 0x58, 0x61, 0xed, 0xef, + 0x58, 0x30, 0xdb, 0xf5, 0x2a, 0xfe, 0x87, 0xda, 0x76, 0x91, 0xb8, 0xba, 0x54, 0x90, 0xb8, 0x5a, + 0xff, 0xb4, 0x72, 0xcf, 0x4f, 0xfb, 0x75, 0x0b, 0xc4, 0x0c, 0x3c, 0x06, 0x75, 0xfe, 0x27, 0x4c, + 0x75, 0x7e, 0xae, 0x78, 0x52, 0x17, 0xe8, 0xf1, 0x7f, 0x61, 0xc1, 0x0c, 0x27, 0x48, 0x0f, 0x2f, + 0x3e, 0xd4, 0x71, 0x18, 0xe4, 0x35, 0x15, 0xf5, 0x7c, 0x65, 0xfe, 0x47, 0x19, 0x83, 0x35, 0xd4, + 0x73, 0xb0, 0xfe, 0x8b, 0x05, 0x88, 0x7f, 0x7e, 0xf6, 0xa9, 0x67, 0xbe, 0x29, 0x69, 0xa6, 0x76, + 0x2a, 0x04, 0x14, 0x06, 0x6b, 0x54, 0xf7, 0xa4, 0xe1, 0x99, 0xb3, 0xa1, 0x72, 0xff, 0xb3, 0xa1, + 0x23, 0x7c, 0xeb, 0x5f, 0x1b, 0x82, 0x6c, 0x20, 0x22, 0xba, 0x09, 0x13, 0x2d, 0xa7, 0xed, 0xdc, + 0xf2, 0x7c, 0x2f, 0xf1, 0x48, 0xdc, 0xeb, 0x50, 0x79, 0x59, 0xa3, 0x13, 0x07, 0x31, 0x1a, 0x04, + 0x1b, 0x7c, 0xd0, 0x3c, 0x40, 0x3b, 0xf2, 0x76, 0x3d, 0x9f, 0x6c, 0x32, 0x5b, 0x83, 0xdd, 0x46, + 0xe0, 0x27, 0xa5, 0x12, 0x8a, 0x35, 0x8a, 0x9c, 0xe8, 0xf5, 0xf2, 0xfd, 0x8b, 0x5e, 0x1f, 0x3a, + 0x62, 0xf4, 0xfa, 0xf0, 0x40, 0xd1, 0xeb, 0x18, 0x4e, 0xcb, 0x5d, 0x95, 0xfe, 0x5f, 0xf5, 0x7c, + 0x22, 0x54, 0x29, 0x7e, 0x47, 0x61, 0xee, 0x60, 0xbf, 0x76, 0x1a, 0xe7, 0x52, 0xe0, 0x82, 0x92, + 0xe8, 0xa7, 0xa0, 0xea, 0xf8, 0x7e, 0x78, 0x5b, 0xf5, 0xda, 0x4a, 0xdc, 0x72, 0xfc, 0x34, 0x29, + 0xe8, 0xd8, 0xd2, 0x43, 0x07, 0xfb, 0xb5, 0xea, 0x62, 0x01, 0x0d, 0x2e, 0x2c, 0x6d, 0x6f, 0xc3, + 0x89, 0x26, 0x89, 0xe4, 0x93, 0x60, 0x6a, 0xf5, 0xad, 0x43, 0x25, 0xca, 0x2c, 0xf7, 0x81, 0xae, + 0xa4, 0x6b, 0xa9, 0xb8, 0xe4, 0xf2, 0x4e, 0x19, 0xd9, 0x7f, 0x6e, 0xc1, 0xa8, 0x08, 0x6e, 0x3c, + 0x06, 0x2d, 0x63, 0xd1, 0x70, 0xf8, 0xd4, 0xf2, 0x45, 0x22, 0x6b, 0x4c, 0xa1, 0xab, 0x67, 0x2d, + 0xe3, 0xea, 0x79, 0xa4, 0x17, 0x93, 0xde, 0x4e, 0x9e, 0x5f, 0x2a, 0xc3, 0x94, 0x19, 0xd8, 0x79, + 0x0c, 0x5d, 0x70, 0x0d, 0x46, 0x63, 0x11, 0x45, 0x5c, 0x2a, 0x8e, 0x46, 0xcb, 0x0e, 0x62, 0x7a, + 0x66, 0x2d, 0xe2, 0x86, 0x25, 0x93, 0xdc, 0xf0, 0xe4, 0xf2, 0x7d, 0x0c, 0x4f, 0xee, 0x17, 0x5b, + 0x3b, 0x74, 0x2f, 0x62, 0x6b, 0xed, 0x6f, 0x30, 0xe1, 0xaf, 0xc3, 0x8f, 0x61, 0xc7, 0xbe, 0x68, + 0x6e, 0x13, 0x76, 0x8f, 0x99, 0x25, 0x1a, 0x55, 0xb0, 0x73, 0xff, 0x23, 0x0b, 0xc6, 0x05, 0xe1, + 0x31, 0x34, 0xfb, 0x27, 0xcd, 0x66, 0x3f, 0xd8, 0xa3, 0xd9, 0x05, 0xed, 0xfd, 0xdb, 0x25, 0xd5, + 0xde, 0x86, 0x78, 0x94, 0xbf, 0x6f, 0x92, 0xe8, 0x31, 0x6a, 0xa7, 0x85, 0xad, 0xd0, 0x17, 0x7a, + 0xd9, 0x43, 0xe9, 0x35, 0x35, 0x0e, 0x3f, 0xd4, 0x7e, 0x63, 0x45, 0xcd, 0x6e, 0x51, 0x85, 0x51, + 0x22, 0x36, 0xd0, 0xf4, 0x16, 0x55, 0x18, 0x25, 0x98, 0x61, 0x90, 0x0b, 0x90, 0xbe, 0x95, 0x2e, + 0xee, 0x75, 0x16, 0xaf, 0xc2, 0x4e, 0xe2, 0xf9, 0xf3, 0x5e, 0x90, 0xc4, 0x49, 0x34, 0xbf, 0x16, + 0x24, 0xd7, 0x23, 0xae, 0xb5, 0x6b, 0xf7, 0xce, 0x14, 0x2f, 0xac, 0xf1, 0x95, 0x17, 0x1f, 0x58, + 0x1d, 0xc3, 0xe6, 0x49, 0xcc, 0x35, 0x01, 0xc7, 0x8a, 0xc2, 0x7e, 0x91, 0xc9, 0x64, 0xd6, 0x41, + 0x47, 0xbb, 0x12, 0xf6, 0x27, 0xa3, 0xaa, 0x6b, 0x99, 0x1b, 0xb6, 0xae, 0x5f, 0x3c, 0xeb, 0x2d, + 0x02, 0x69, 0xc5, 0x7a, 0x90, 0x6f, 0x7a, 0x3b, 0x0d, 0x7d, 0xa6, 0xeb, 0x80, 0xee, 0x99, 0x3e, + 0xb2, 0xf4, 0x08, 0x47, 0x72, 0x2c, 0xe7, 0x1d, 0xcb, 0x0d, 0xb6, 0xd6, 0xc8, 0xa6, 0xf1, 0x5e, + 0x96, 0x08, 0x9c, 0xd2, 0xa0, 0x05, 0x61, 0xf3, 0x71, 0x07, 0xc8, 0x83, 0x19, 0x9b, 0x4f, 0x7e, + 0xbe, 0x66, 0xf4, 0x3d, 0x0b, 0xe3, 0xea, 0x69, 0x94, 0x06, 0x7f, 0x61, 0xa2, 0xc2, 0x75, 0xa9, + 0x95, 0x14, 0x8c, 0x75, 0x1a, 0xb4, 0x0e, 0xd3, 0x31, 0x7f, 0xb7, 0x45, 0xde, 0x45, 0x10, 0x16, + 0xfd, 0x93, 0x99, 0x57, 0xd9, 0x25, 0xfa, 0x90, 0x81, 0xf8, 0x62, 0x95, 0xb7, 0x17, 0xb2, 0x2c, + 0xd0, 0xab, 0x30, 0xe5, 0xeb, 0xef, 0x57, 0x36, 0x84, 0xc1, 0xaf, 0x82, 0xac, 0x8c, 0xd7, 0x2d, + 0x1b, 0x38, 0x43, 0x4d, 0x95, 0x00, 0x1d, 0x22, 0x92, 0xd4, 0x38, 0xc1, 0x26, 0x89, 0xc5, 0xc3, + 0x0e, 0x4c, 0x09, 0xb8, 0x52, 0x40, 0x83, 0x0b, 0x4b, 0xa3, 0x97, 0x60, 0x42, 0x7e, 0xbe, 0x76, + 0x37, 0x27, 0x0d, 0xe5, 0xd3, 0x70, 0xd8, 0xa0, 0x44, 0xb7, 0xe1, 0x94, 0xfc, 0xbf, 0x1e, 0x39, + 0x1b, 0x1b, 0x5e, 0x4b, 0x5c, 0x8d, 0x1a, 0x67, 0x2c, 0x16, 0x65, 0x5c, 0xf3, 0x4a, 0x1e, 0xd1, + 0xe1, 0x7e, 0xed, 0x9c, 0xe8, 0xb5, 0x5c, 0x3c, 0x1b, 0xc4, 0x7c, 0xfe, 0xe8, 0x2a, 0x9c, 0xd8, + 0x22, 0x8e, 0x9f, 0x6c, 0x2d, 0x6f, 0x91, 0xd6, 0xb6, 0x5c, 0x44, 0xec, 0xc6, 0x8f, 0x16, 0x00, + 0x77, 0xa9, 0x9b, 0x04, 0xe7, 0x95, 0x43, 0x6f, 0x43, 0xb5, 0xdd, 0xb9, 0xe5, 0x7b, 0xf1, 0xd6, + 0xb5, 0x30, 0x61, 0x67, 0x89, 0xea, 0x65, 0x11, 0x71, 0x35, 0x48, 0xdd, 0x76, 0x6a, 0x14, 0xd0, + 0xe1, 0x42, 0x0e, 0x1f, 0xec, 0x94, 0xf7, 0x3d, 0x5a, 0x58, 0xd3, 0x30, 0xd0, 0x67, 0x61, 0x42, + 0x1f, 0x49, 0x21, 0xe4, 0x1f, 0xeb, 0xf7, 0x5e, 0xaa, 0xd0, 0x4f, 0xd4, 0xa8, 0xea, 0x38, 0x6c, + 0x70, 0xb4, 0xff, 0x45, 0x09, 0x6a, 0x7d, 0x72, 0x48, 0x65, 0x5c, 0x57, 0xd6, 0x40, 0xae, 0xab, + 0x45, 0xf9, 0x88, 0xc8, 0xb5, 0x4c, 0x8a, 0xea, 0xcc, 0x03, 0x21, 0x69, 0xa2, 0xea, 0x2c, 0xfd, + 0xc0, 0x51, 0x5b, 0xba, 0xf7, 0x6b, 0xa8, 0x6f, 0xf0, 0x5a, 0x43, 0x77, 0x63, 0x0e, 0x0f, 0xae, + 0xee, 0x16, 0x7a, 0x30, 0xed, 0x6f, 0x94, 0xe0, 0x94, 0xea, 0xc2, 0x1f, 0xdd, 0x8e, 0xbb, 0xd1, + 0xdd, 0x71, 0xf7, 0xc0, 0xff, 0x6b, 0x5f, 0x87, 0x91, 0xe6, 0x5e, 0xdc, 0x4a, 0xfc, 0x01, 0xb4, + 0x83, 0x47, 0x8d, 0x95, 0x93, 0xee, 0x61, 0xec, 0x1d, 0x30, 0xb1, 0x90, 0xec, 0xbf, 0x6c, 0xc1, + 0xf4, 0xfa, 0x72, 0xa3, 0x19, 0xb6, 0xb6, 0x49, 0xb2, 0xc8, 0xbd, 0x1b, 0x58, 0x28, 0x07, 0xd6, + 0x5d, 0x6e, 0xfa, 0x79, 0xea, 0xc4, 0x39, 0x18, 0xda, 0x0a, 0xe3, 0x24, 0xeb, 0xe3, 0xbf, 0x14, + 0xc6, 0x09, 0x66, 0x18, 0xfb, 0xbb, 0x16, 0x0c, 0xb3, 0xa7, 0xaf, 0xfa, 0x3d, 0x91, 0x36, 0xc8, + 0x77, 0xa1, 0x17, 0x60, 0x84, 0x6c, 0x6c, 0x90, 0x56, 0x22, 0x46, 0x55, 0x5e, 0x24, 0x19, 0x59, + 0x61, 0x50, 0xba, 0x23, 0xb2, 0xca, 0xf8, 0x5f, 0x2c, 0x88, 0xd1, 0x67, 0xa0, 0x92, 0x78, 0x3b, + 0x64, 0xd1, 0x75, 0x85, 0x7b, 0xfd, 0x68, 0x91, 0x54, 0x6a, 0x87, 0x5e, 0x97, 0x4c, 0x70, 0xca, + 0xcf, 0xfe, 0x85, 0x12, 0x40, 0x7a, 0xe1, 0xac, 0xdf, 0x67, 0x2e, 0x75, 0xbd, 0x04, 0xf7, 0x58, + 0xce, 0x4b, 0x70, 0x28, 0x65, 0x98, 0xf3, 0x0e, 0x9c, 0xea, 0xaa, 0xf2, 0x40, 0x5d, 0x35, 0x74, + 0x94, 0xae, 0x5a, 0x86, 0xd9, 0xf4, 0xc2, 0x9c, 0x79, 0x7b, 0x98, 0x65, 0x89, 0x5d, 0xcf, 0x22, + 0x71, 0x37, 0xbd, 0xfd, 0x45, 0x0b, 0x44, 0x74, 0xed, 0x00, 0x13, 0xfa, 0x2d, 0xf9, 0x68, 0x93, + 0x91, 0xd8, 0xee, 0x5c, 0x71, 0xb8, 0xb1, 0x48, 0x67, 0xa7, 0x24, 0xbb, 0x91, 0xc4, 0xce, 0xe0, + 0x65, 0xff, 0x9e, 0x05, 0xe3, 0x1c, 0x7d, 0x95, 0x99, 0xa0, 0xfd, 0x5b, 0x73, 0xa4, 0x1c, 0xc3, + 0xec, 0x3d, 0x23, 0xca, 0x58, 0xa5, 0xa2, 0xd5, 0xdf, 0x33, 0x92, 0x08, 0x9c, 0xd2, 0xa0, 0x27, + 0x60, 0x34, 0xee, 0xdc, 0x62, 0xe4, 0x99, 0x00, 0xdb, 0x26, 0x07, 0x63, 0x89, 0xa7, 0xf3, 0x6a, + 0x26, 0x1b, 0x5f, 0x8d, 0x2e, 0xc1, 0x08, 0x17, 0x1b, 0x62, 0x19, 0xf7, 0x38, 0x4c, 0xd0, 0xa2, + 0xb2, 0x81, 0x3f, 0xc0, 0xcd, 0xc4, 0x8d, 0x28, 0x8f, 0xde, 0x86, 0x71, 0x37, 0xbc, 0x1d, 0xdc, + 0x76, 0x22, 0x77, 0xb1, 0xb1, 0x26, 0x7a, 0x3d, 0x37, 0x4a, 0xae, 0x9e, 0x92, 0xe9, 0x91, 0xde, + 0xcc, 0x3d, 0x97, 0xa2, 0xb0, 0xce, 0x0e, 0xad, 0xb3, 0x1c, 0x1e, 0xfc, 0x59, 0xd0, 0x5e, 0x71, + 0x23, 0xea, 0x25, 0x51, 0x8d, 0xf3, 0xa4, 0x48, 0xf4, 0x21, 0x1e, 0x15, 0x4d, 0x19, 0xd9, 0x9f, + 0x3f, 0x01, 0xc6, 0x68, 0x1b, 0x99, 0x80, 0xad, 0x7b, 0x94, 0x09, 0x18, 0xc3, 0x18, 0xd9, 0x69, + 0x27, 0x7b, 0x75, 0x2f, 0xea, 0x95, 0x9a, 0x7d, 0x45, 0xd0, 0x74, 0xf3, 0x94, 0x18, 0xac, 0xf8, + 0xe4, 0xa7, 0x6b, 0x2e, 0x7f, 0x88, 0xe9, 0x9a, 0x87, 0x8e, 0x31, 0x5d, 0xf3, 0x35, 0x18, 0xdd, + 0xf4, 0x12, 0x4c, 0xda, 0xa1, 0xd8, 0x32, 0x73, 0x67, 0xc2, 0x45, 0x4e, 0xd2, 0x9d, 0x5e, 0x54, + 0x20, 0xb0, 0x64, 0x82, 0x5e, 0x53, 0x6b, 0x60, 0xa4, 0x58, 0x15, 0xec, 0xf6, 0x6e, 0xe7, 0xae, + 0x02, 0x91, 0x9e, 0x79, 0xf4, 0x6e, 0xd3, 0x33, 0xab, 0xf4, 0xca, 0x63, 0x1f, 0x2c, 0xbd, 0xb2, + 0x91, 0x7e, 0xba, 0x72, 0xef, 0xd2, 0x4f, 0x7f, 0xd1, 0x82, 0x53, 0xed, 0xbc, 0x4c, 0xec, 0x22, + 0x65, 0xf2, 0x0b, 0x03, 0x67, 0xa4, 0x37, 0x2a, 0x64, 0x89, 0x24, 0x72, 0xc9, 0x70, 0x7e, 0x75, + 0x32, 0x8f, 0xf5, 0xf8, 0xdd, 0xe6, 0xb1, 0xbe, 0x3f, 0xb9, 0x95, 0xd3, 0xac, 0xd6, 0x93, 0xf7, + 0x30, 0xab, 0xf5, 0xd4, 0x07, 0xce, 0x6a, 0xad, 0x65, 0xa6, 0x9e, 0xbe, 0x17, 0x99, 0xa9, 0xdf, + 0x31, 0x85, 0x3d, 0x4f, 0x93, 0xfc, 0x54, 0x1f, 0x61, 0x6f, 0xf0, 0xed, 0x2d, 0xee, 0x79, 0x16, + 0xee, 0xd9, 0xbb, 0xca, 0xc2, 0x7d, 0x53, 0xcf, 0x6f, 0x8d, 0xfa, 0x24, 0x70, 0xa6, 0x44, 0x03, + 0x66, 0xb5, 0xbe, 0xa9, 0x6f, 0x41, 0x27, 0x8a, 0xf9, 0xaa, 0x9d, 0xa6, 0x9b, 0x6f, 0xde, 0x26, + 0xd4, 0x9d, 0x2d, 0xfb, 0xe4, 0xf1, 0x64, 0xcb, 0x3e, 0x75, 0xcf, 0xb3, 0x65, 0x9f, 0x3e, 0x86, + 0x6c, 0xd9, 0x0f, 0x7c, 0xa8, 0xd9, 0xb2, 0xab, 0xf7, 0x37, 0x5b, 0xf6, 0x99, 0x7b, 0x91, 0x2d, + 0xfb, 0x26, 0x54, 0xda, 0xf2, 0x0a, 0x5e, 0x75, 0xae, 0x78, 0x48, 0x72, 0xef, 0xe9, 0xf1, 0x21, + 0x51, 0x28, 0x9c, 0xb2, 0xa2, 0x7c, 0xd3, 0xec, 0xd9, 0x0f, 0x16, 0xf3, 0xcd, 0x35, 0xdb, 0x7b, + 0xe4, 0xcc, 0xfe, 0x2b, 0x25, 0x38, 0xdb, 0x7b, 0x5e, 0xa7, 0x36, 0x7f, 0x23, 0x75, 0xe0, 0x66, + 0x6c, 0x7e, 0xa6, 0x74, 0x69, 0x54, 0x03, 0xdf, 0x53, 0xbe, 0x08, 0xb3, 0x2a, 0x12, 0xc9, 0xf7, + 0x5a, 0x7b, 0xda, 0x33, 0x37, 0x2a, 0xb8, 0xbd, 0x99, 0x25, 0xc0, 0xdd, 0x65, 0xd0, 0x22, 0x4c, + 0x1b, 0xc0, 0xb5, 0xba, 0x50, 0xc9, 0x95, 0x93, 0xa1, 0x69, 0xa2, 0x71, 0x96, 0xde, 0xfe, 0xaa, + 0x05, 0x0f, 0x14, 0x24, 0xde, 0x1c, 0xf8, 0x1a, 0xee, 0x06, 0x4c, 0xb7, 0xcd, 0xa2, 0x7d, 0x6e, + 0xeb, 0x1b, 0xe9, 0x3d, 0x55, 0x5b, 0x33, 0x08, 0x9c, 0x65, 0xba, 0x74, 0xfe, 0x9b, 0xdf, 0x3b, + 0xfb, 0xb1, 0x3f, 0xfa, 0xde, 0xd9, 0x8f, 0x7d, 0xe7, 0x7b, 0x67, 0x3f, 0xf6, 0xff, 0x1d, 0x9c, + 0xb5, 0xbe, 0x79, 0x70, 0xd6, 0xfa, 0xa3, 0x83, 0xb3, 0xd6, 0x77, 0x0e, 0xce, 0x5a, 0x7f, 0x7a, + 0x70, 0xd6, 0xfa, 0x85, 0xef, 0x9f, 0xfd, 0xd8, 0x5b, 0xa5, 0xdd, 0x67, 0xff, 0x6f, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x32, 0xb3, 0xcb, 0xd3, 0x5f, 0xcb, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 504198647cf7c..8fa22ed6b171a 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -124,6 +124,25 @@ message AzureDiskVolumeSource { optional string kind = 6; } +// AzureFile represents an Azure File Service mount on the host and bind mount to the pod. +message AzureFilePersistentVolumeSource { + // the name of secret that contains Azure Storage Account Name and Key + optional string secretName = 1; + + // Share Name + optional string shareName = 2; + + // Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + optional bool readOnly = 3; + + // the namespace of the secret that contains Azure Storage Account Name and Key + // default is the same as the Pod + // +optional + optional string secretNamespace = 4; +} + // AzureFile represents an Azure File Service mount on the host and bind mount to the pod. message AzureFileVolumeSource { // the name of secret that contains Azure Storage Account Name and Key @@ -2222,7 +2241,7 @@ message PersistentVolumeSource { // AzureFile represents an Azure File Service mount on the host and bind mount to the pod. // +optional - optional AzureFileVolumeSource azureFile = 13; + optional AzureFilePersistentVolumeSource azureFile = 13; // VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine // +optional diff --git a/staging/src/k8s.io/api/core/v1/types.generated.go b/staging/src/k8s.io/api/core/v1/types.generated.go index c7ea44dc9c768..67a270e62249f 100644 --- a/staging/src/k8s.io/api/core/v1/types.generated.go +++ b/staging/src/k8s.io/api/core/v1/types.generated.go @@ -6113,7 +6113,7 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Deco } } else { if x.AzureFile == nil { - x.AzureFile = new(AzureFileVolumeSource) + x.AzureFile = new(AzureFilePersistentVolumeSource) } x.AzureFile.CodecDecodeSelf(d) } @@ -6488,7 +6488,7 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } } else { if x.AzureFile == nil { - x.AzureFile = new(AzureFileVolumeSource) + x.AzureFile = new(AzureFilePersistentVolumeSource) } x.AzureFile.CodecDecodeSelf(d) } @@ -8257,7 +8257,7 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decode } case "azureFile": if x.PersistentVolumeSource.AzureFile == nil { - x.PersistentVolumeSource.AzureFile = new(AzureFileVolumeSource) + x.PersistentVolumeSource.AzureFile = new(AzureFilePersistentVolumeSource) } if r.TryDecodeAsNil() { if x.AzureFile != nil { @@ -8265,7 +8265,7 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decode } } else { if x.AzureFile == nil { - x.AzureFile = new(AzureFileVolumeSource) + x.AzureFile = new(AzureFilePersistentVolumeSource) } x.AzureFile.CodecDecodeSelf(d) } @@ -8743,7 +8743,7 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco x.FlexVolume.CodecDecodeSelf(d) } if x.PersistentVolumeSource.AzureFile == nil { - x.PersistentVolumeSource.AzureFile = new(AzureFileVolumeSource) + x.PersistentVolumeSource.AzureFile = new(AzureFilePersistentVolumeSource) } yyj32++ if yyhl32 { @@ -8762,7 +8762,7 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco } } else { if x.AzureFile == nil { - x.AzureFile = new(AzureFileVolumeSource) + x.AzureFile = new(AzureFilePersistentVolumeSource) } x.AzureFile.CodecDecodeSelf(d) } @@ -18100,6 +18100,364 @@ func (x *AzureFileVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Dec z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x *AzureFilePersistentVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [4]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[2] = x.ReadOnly != false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(4) + } else { + yynn2 = 3 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.SecretName)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("secretName")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.SecretName)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.ShareName)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("shareName")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.ShareName)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeBool(bool(x.ReadOnly)) + } + } else { + r.EncodeBool(false) + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("readOnly")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + r.EncodeBool(bool(x.ReadOnly)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.SecretNamespace == nil { + r.EncodeNil() + } else { + yy13 := *x.SecretNamespace + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(yy13)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("secretNamespace")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.SecretNamespace == nil { + r.EncodeNil() + } else { + yy15 := *x.SecretNamespace + yym16 := z.EncBinary() + _ = yym16 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(yy15)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *AzureFilePersistentVolumeSource) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *AzureFilePersistentVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "secretName": + if r.TryDecodeAsNil() { + x.SecretName = "" + } else { + yyv4 := &x.SecretName + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "shareName": + if r.TryDecodeAsNil() { + x.ShareName = "" + } else { + yyv6 := &x.ShareName + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "readOnly": + if r.TryDecodeAsNil() { + x.ReadOnly = false + } else { + yyv8 := &x.ReadOnly + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*bool)(yyv8)) = r.DecodeBool() + } + } + case "secretNamespace": + if r.TryDecodeAsNil() { + if x.SecretNamespace != nil { + x.SecretNamespace = nil + } + } else { + if x.SecretNamespace == nil { + x.SecretNamespace = new(string) + } + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + *((*string)(x.SecretNamespace)) = r.DecodeString() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *AzureFilePersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj12 int + var yyb12 bool + var yyhl12 bool = l >= 0 + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.SecretName = "" + } else { + yyv13 := &x.SecretName + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*string)(yyv13)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ShareName = "" + } else { + yyv15 := &x.ShareName + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + *((*string)(yyv15)) = r.DecodeString() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ReadOnly = false + } else { + yyv17 := &x.ReadOnly + yym18 := z.DecBinary() + _ = yym18 + if false { + } else { + *((*bool)(yyv17)) = r.DecodeBool() + } + } + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.SecretNamespace != nil { + x.SecretNamespace = nil + } + } else { + if x.SecretNamespace == nil { + x.SecretNamespace = new(string) + } + yym20 := z.DecBinary() + _ = yym20 + if false { + } else { + *((*string)(x.SecretNamespace)) = r.DecodeString() + } + } + for { + yyj12++ + if yyhl12 { + yyb12 = yyj12 > l + } else { + yyb12 = r.CheckBreak() + } + if yyb12 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj12-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x *VsphereVirtualDiskVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index eea093c8d741f..f7bda3bd10ea8 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -83,6 +83,18 @@ func (AzureDiskVolumeSource) SwaggerDoc() map[string]string { return map_AzureDiskVolumeSource } +var map_AzureFilePersistentVolumeSource = map[string]string{ + "": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod.", + "secretName": "the name of secret that contains Azure Storage Account Name and Key", + "shareName": "Share Name", + "readOnly": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", + "secretNamespace": "the namespace of the secret that contains Azure Storage Account Name and Key default is the same as the Pod", +} + +func (AzureFilePersistentVolumeSource) SwaggerDoc() map[string]string { + return map_AzureFilePersistentVolumeSource +} + var map_AzureFileVolumeSource = map[string]string{ "": "AzureFile represents an Azure File Service mount on the host and bind mount to the pod.", "secretName": "the name of secret that contains Azure Storage Account Name and Key", diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index 9d4a5706375de..20929a5db9595 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -58,6 +58,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*AzureDiskVolumeSource).DeepCopyInto(out.(*AzureDiskVolumeSource)) return nil }, InType: reflect.TypeOf(&AzureDiskVolumeSource{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*AzureFilePersistentVolumeSource).DeepCopyInto(out.(*AzureFilePersistentVolumeSource)) + return nil + }, InType: reflect.TypeOf(&AzureFilePersistentVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*AzureFileVolumeSource).DeepCopyInto(out.(*AzureFileVolumeSource)) return nil @@ -879,6 +883,31 @@ func (in *AzureDiskVolumeSource) DeepCopy() *AzureDiskVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureFilePersistentVolumeSource) DeepCopyInto(out *AzureFilePersistentVolumeSource) { + *out = *in + if in.SecretNamespace != nil { + in, out := &in.SecretNamespace, &out.SecretNamespace + if *in == nil { + *out = nil + } else { + *out = new(string) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureFilePersistentVolumeSource. +func (in *AzureFilePersistentVolumeSource) DeepCopy() *AzureFilePersistentVolumeSource { + if in == nil { + return nil + } + out := new(AzureFilePersistentVolumeSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AzureFileVolumeSource) DeepCopyInto(out *AzureFileVolumeSource) { *out = *in @@ -3656,8 +3685,8 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { if *in == nil { *out = nil } else { - *out = new(AzureFileVolumeSource) - **out = **in + *out = new(AzureFilePersistentVolumeSource) + (*in).DeepCopyInto(*out) } } if in.VsphereVolume != nil { From c648505f7646c0b6ef76c586d95b71774adf3389 Mon Sep 17 00:00:00 2001 From: Yecheng Fu Date: Tue, 22 Aug 2017 07:10:01 +0000 Subject: [PATCH 277/403] RBD Plugin: Log RBD Attach/Mount/Unmout actions at logging level 3 --- pkg/volume/rbd/disk_manager.go | 1 + pkg/volume/rbd/rbd_util.go | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/volume/rbd/disk_manager.go b/pkg/volume/rbd/disk_manager.go index 482151c075dde..d219d62ab1b1d 100644 --- a/pkg/volume/rbd/disk_manager.go +++ b/pkg/volume/rbd/disk_manager.go @@ -77,6 +77,7 @@ func diskSetUp(manager diskManager, b rbdMounter, volPath string, mounter mount. glog.Errorf("failed to bind mount:%s", globalPDPath) return err } + glog.V(3).Infof("rbd: successfully bind mount %s to %s with options %v", globalPDPath, volPath, mountOptions) if !b.ReadOnly { volume.SetVolumeOwnership(&b, fsGroup) diff --git a/pkg/volume/rbd/rbd_util.go b/pkg/volume/rbd/rbd_util.go index 001054e903a16..70aedb4861cf3 100644 --- a/pkg/volume/rbd/rbd_util.go +++ b/pkg/volume/rbd/rbd_util.go @@ -312,12 +312,14 @@ func (util *RBDUtil) AttachDisk(b rbdMounter) error { if !found { return errors.New("Could not map image: Timeout after 10s") } + glog.V(3).Infof("rbd: successfully map image %s/%s to %s", b.Pool, b.Image, devicePath) } // mount it if err = b.mounter.FormatAndMount(devicePath, globalPDPath, b.fsType, nil); err != nil { err = fmt.Errorf("rbd: failed to mount rbd volume %s [%s] to %s, error %v", devicePath, b.fsType, globalPDPath, err) } + glog.V(3).Infof("rbd: successfully mount image %s/%s at %s", b.Pool, b.Image, globalPDPath) return err } @@ -329,6 +331,7 @@ func (util *RBDUtil) DetachDisk(c rbdUnmounter, mntPath string) error { if err = c.mounter.Unmount(mntPath); err != nil { return fmt.Errorf("rbd detach disk: failed to umount: %s\nError: %v", mntPath, err) } + glog.V(3).Infof("rbd: successfully umount mountpoint %s", mntPath) // if device is no longer used, see if can unmap if cnt <= 1 { // rbd unmap @@ -343,7 +346,7 @@ func (util *RBDUtil) DetachDisk(c rbdUnmounter, mntPath string) error { util.defencing(c) } - glog.Infof("rbd: successfully unmap device %s", device) + glog.V(3).Infof("rbd: successfully unmap device %s", device) } return nil } From b374416807d3634688f26d35ff541dd17a2d351e Mon Sep 17 00:00:00 2001 From: Shyam Jeedigunta Date: Thu, 24 Aug 2017 19:20:36 +0200 Subject: [PATCH 278/403] AllowedNotReadyNodes allowed to be not ready for absolutely *any* reason --- test/e2e/framework/BUILD | 1 - test/e2e/framework/util.go | 32 +++----------------------------- 2 files changed, 3 insertions(+), 30 deletions(-) diff --git a/test/e2e/framework/BUILD b/test/e2e/framework/BUILD index 65f0265c96391..4806b68eaec71 100644 --- a/test/e2e/framework/BUILD +++ b/test/e2e/framework/BUILD @@ -43,7 +43,6 @@ go_library( "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", "//pkg/api/v1/helper:go_default_library", - "//pkg/api/v1/node:go_default_library", "//pkg/api/v1/pod:go_default_library", "//pkg/apis/batch:go_default_library", "//pkg/apis/extensions:go_default_library", diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index 5d4e9c255229c..878b0519fdc5e 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -75,7 +75,6 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/testapi" - nodeutil "k8s.io/kubernetes/pkg/api/v1/node" podutil "k8s.io/kubernetes/pkg/api/v1/pod" batchinternal "k8s.io/kubernetes/pkg/apis/batch" extensionsinternal "k8s.io/kubernetes/pkg/apis/extensions" @@ -2487,10 +2486,7 @@ func WaitForAllNodesSchedulable(c clientset.Interface, timeout time.Duration) er Logf("================================") } } - if len(notSchedulable) > TestContext.AllowedNotReadyNodes { - return false, nil - } - return allowedNotReadyReasons(notSchedulable), nil + return len(notSchedulable) <= TestContext.AllowedNotReadyNodes, nil }) } @@ -3579,23 +3575,6 @@ func WaitForNodeToBe(c clientset.Interface, name string, conditionType v1.NodeCo return false } -// Checks whether not-ready nodes can be ignored while checking if all nodes are -// ready (we allow e.g. for incorrect provisioning of some small percentage of nodes -// while validating cluster, and those nodes may never become healthy). -// Currently we allow only for: -// - not present CNI plugins on node -// TODO: we should extend it for other reasons. -func allowedNotReadyReasons(nodes []*v1.Node) bool { - for _, node := range nodes { - index, condition := nodeutil.GetNodeCondition(&node.Status, v1.NodeReady) - if index == -1 || - !strings.Contains(condition.Message, "could not locate kubenet required CNI plugins") { - return false - } - } - return true -} - // Checks whether all registered nodes are ready. // TODO: we should change the AllNodesReady call in AfterEach to WaitForAllNodesHealthy, // and figure out how to do it in a configurable way, as we can't expect all setups to run @@ -3625,19 +3604,14 @@ func AllNodesReady(c clientset.Interface, timeout time.Duration) error { // of nodes (which we allow in cluster validation). Some nodes that are not // provisioned correctly at startup will never become ready (e.g. when something // won't install correctly), so we can't expect them to be ready at any point. - // - // However, we only allow non-ready nodes with some specific reasons. - if len(notReady) > TestContext.AllowedNotReadyNodes { - return false, nil - } - return allowedNotReadyReasons(notReady), nil + return len(notReady) <= TestContext.AllowedNotReadyNodes, nil }) if err != nil && err != wait.ErrWaitTimeout { return err } - if len(notReady) > TestContext.AllowedNotReadyNodes || !allowedNotReadyReasons(notReady) { + if len(notReady) > TestContext.AllowedNotReadyNodes { msg := "" for _, node := range notReady { msg = fmt.Sprintf("%s, %s", msg, node.Name) From fcd646d80ec6261be83fb1537575db521e80af3f Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Mon, 21 Aug 2017 23:10:17 -0700 Subject: [PATCH 279/403] Let the initializer admission plugin set the metadata.intializers to nil if an update makes the pendings and the result both nil --- .../initialization/initialization.go | 3 +++ .../pkg/api/validation/objectmeta.go | 3 --- test/e2e/apimachinery/initializers.go | 23 +++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/plugin/pkg/admission/initialization/initialization.go b/plugin/pkg/admission/initialization/initialization.go index 447753c47b3bd..b60855c242cf3 100644 --- a/plugin/pkg/admission/initialization/initialization.go +++ b/plugin/pkg/admission/initialization/initialization.go @@ -208,6 +208,9 @@ func (i *initializer) Admit(a admission.Attributes) (err error) { glog.V(5).Infof("Modifying uninitialized resource %s", a.GetResource()) + if updated != nil && len(updated.Pending) == 0 && updated.Result == nil { + accessor.SetInitializers(nil) + } // because we are called before validation, we need to ensure the update transition is valid. if errs := validation.ValidateInitializersUpdate(updated, existing, initializerFieldPath); len(errs) > 0 { return errors.NewInvalid(a.GetKind().GroupKind(), a.GetName(), errs) diff --git a/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go b/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go index 780c31c476cdd..5bef9495c60bc 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go @@ -200,9 +200,6 @@ func ValidateInitializers(initializers *metav1.Initializers, fldPath *field.Path } } allErrs = append(allErrs, validateInitializersResult(initializers.Result, fldPath.Child("result"))...) - if len(initializers.Pending) == 0 && initializers.Result == nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("pending"), nil, "must be non-empty when result is not set")) - } return allErrs } diff --git a/test/e2e/apimachinery/initializers.go b/test/e2e/apimachinery/initializers.go index 6e6ca4806c368..39f0252856248 100644 --- a/test/e2e/apimachinery/initializers.go +++ b/test/e2e/apimachinery/initializers.go @@ -262,6 +262,29 @@ var _ = SIGDescribe("Initializers", func() { Expect(err).NotTo(HaveOccurred()) Expect(len(pods.Items)).Should(Equal(1)) }) + + It("will be set to nil if a patch removes the last pending initializer", func() { + ns := f.Namespace.Name + c := f.ClientSet + + podName := "to-be-patch-initialized-pod" + framework.Logf("Creating pod %s", podName) + + // TODO: lower the timeout so that the server responds faster. + _, err := c.CoreV1().Pods(ns).Create(newUninitializedPod(podName)) + if err != nil && !errors.IsTimeout(err) { + framework.Failf("expect err to be timeout error, got %v", err) + } + uninitializedPod, err := c.CoreV1().Pods(ns).Get(podName, metav1.GetOptions{}) + Expect(err).NotTo(HaveOccurred()) + Expect(uninitializedPod.Initializers).NotTo(BeNil()) + Expect(len(uninitializedPod.Initializers.Pending)).Should(Equal(1)) + + patch := fmt.Sprintf(`{"metadata":{"initializers":{"pending":[{"$patch":"delete","name":"%s"}]}}}`, uninitializedPod.Initializers.Pending[0].Name) + patchedPod, err := c.CoreV1().Pods(ns).Patch(uninitializedPod.Name, types.StrategicMergePatchType, []byte(patch)) + Expect(err).NotTo(HaveOccurred()) + Expect(patchedPod.Initializers).To(BeNil()) + }) }) func newUninitializedPod(podName string) *v1.Pod { From 05d6c8a6c22c2a0c11ec1019c359ca9f12a31731 Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Wed, 23 Aug 2017 15:56:28 -0700 Subject: [PATCH 280/403] StatefulSet: Deflake e2e `kubectl exec` commands. We seem to get a lot of flakes due to "connection refused" while running `kubectl exec`. I can't find any reason this would be caused by the test flow, so I'm adding retries to see if that helps. --- test/e2e/framework/statefulset_utils.go | 22 +++++++++++++--------- test/e2e/framework/util.go | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/test/e2e/framework/statefulset_utils.go b/test/e2e/framework/statefulset_utils.go index 1ba660243079d..1827573c7f970 100644 --- a/test/e2e/framework/statefulset_utils.go +++ b/test/e2e/framework/statefulset_utils.go @@ -134,7 +134,7 @@ func (s *StatefulSetTester) CheckMount(ss *apps.StatefulSet, mountPath string) e func (s *StatefulSetTester) ExecInStatefulPods(ss *apps.StatefulSet, cmd string) error { podList := s.GetPodList(ss) for _, statefulPod := range podList.Items { - stdout, err := RunHostCmd(statefulPod.Namespace, statefulPod.Name, cmd) + stdout, err := RunHostCmdWithRetries(statefulPod.Namespace, statefulPod.Name, cmd, StatefulSetPoll, 3) Logf("stdout of %v on %v: %v", cmd, statefulPod.Name, stdout) if err != nil { return err @@ -148,7 +148,7 @@ func (s *StatefulSetTester) CheckHostname(ss *apps.StatefulSet) error { cmd := "printf $(hostname)" podList := s.GetPodList(ss) for _, statefulPod := range podList.Items { - hostname, err := RunHostCmd(statefulPod.Namespace, statefulPod.Name, cmd) + hostname, err := RunHostCmdWithRetries(statefulPod.Namespace, statefulPod.Name, cmd, StatefulSetPoll, 3) if err != nil { return err } @@ -508,7 +508,8 @@ func (s *StatefulSetTester) BreakHttpProbe(ss *apps.StatefulSet) error { if path == "" { return fmt.Errorf("Path expected to be not empty: %v", path) } - cmd := fmt.Sprintf("mv -v /usr/share/nginx/html%v /tmp/", path) + // Ignore 'mv' errors to make this idempotent. + cmd := fmt.Sprintf("mv -v /usr/share/nginx/html%v /tmp/ || true", path) return s.ExecInStatefulPods(ss, cmd) } @@ -518,8 +519,9 @@ func (s *StatefulSetTester) BreakPodHttpProbe(ss *apps.StatefulSet, pod *v1.Pod) if path == "" { return fmt.Errorf("Path expected to be not empty: %v", path) } - cmd := fmt.Sprintf("mv -v /usr/share/nginx/html%v /tmp/", path) - stdout, err := RunHostCmd(pod.Namespace, pod.Name, cmd) + // Ignore 'mv' errors to make this idempotent. + cmd := fmt.Sprintf("mv -v /usr/share/nginx/html%v /tmp/ || true", path) + stdout, err := RunHostCmdWithRetries(pod.Namespace, pod.Name, cmd, StatefulSetPoll, 3) Logf("stdout of %v on %v: %v", cmd, pod.Name, stdout) return err } @@ -530,7 +532,8 @@ func (s *StatefulSetTester) RestoreHttpProbe(ss *apps.StatefulSet) error { if path == "" { return fmt.Errorf("Path expected to be not empty: %v", path) } - cmd := fmt.Sprintf("mv -v /tmp%v /usr/share/nginx/html/", path) + // Ignore 'mv' errors to make this idempotent. + cmd := fmt.Sprintf("mv -v /tmp%v /usr/share/nginx/html/ || true", path) return s.ExecInStatefulPods(ss, cmd) } @@ -540,8 +543,9 @@ func (s *StatefulSetTester) RestorePodHttpProbe(ss *apps.StatefulSet, pod *v1.Po if path == "" { return fmt.Errorf("Path expected to be not empty: %v", path) } - cmd := fmt.Sprintf("mv -v /tmp%v /usr/share/nginx/html/", path) - stdout, err := RunHostCmd(pod.Namespace, pod.Name, cmd) + // Ignore 'mv' errors to make this idempotent. + cmd := fmt.Sprintf("mv -v /tmp%v /usr/share/nginx/html/ || true", path) + stdout, err := RunHostCmdWithRetries(pod.Namespace, pod.Name, cmd, StatefulSetPoll, 3) Logf("stdout of %v on %v: %v", cmd, pod.Name, stdout) return err } @@ -586,7 +590,7 @@ func (s *StatefulSetTester) ResumeNextPod(ss *apps.StatefulSet) { if resumedPod != "" { Failf("Found multiple paused stateful pods: %v and %v", pod.Name, resumedPod) } - _, err := RunHostCmd(pod.Namespace, pod.Name, "touch /data/statefulset-continue") + _, err := RunHostCmdWithRetries(pod.Namespace, pod.Name, "touch /data/statefulset-continue", StatefulSetPoll, 3) ExpectNoError(err) Logf("Resumed pod %v", pod.Name) resumedPod = pod.Name diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index 5d4e9c255229c..6b659e4efdc2d 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -3290,6 +3290,24 @@ func RunHostCmdOrDie(ns, name, cmd string) string { return stdout } +// RunHostCmdWithRetries calls RunHostCmd until it succeeds or a built-in timeout expires. +// This can be used with idempotent commands to deflake transient connection issues. +func RunHostCmdWithRetries(ns, name, cmd string, interval time.Duration, maxTries int) (string, error) { + tries := 0 + for { + out, err := RunHostCmd(ns, name, cmd) + if err == nil { + return out, nil + } + tries++ + if tries >= maxTries { + return out, fmt.Errorf("RunHostCmd still failed after %d tries: %v", tries, err) + } + Logf("Waiting %v to retry failed RunHostCmd (attempt %d): %v", interval, tries, err) + time.Sleep(interval) + } +} + // LaunchHostExecPod launches a hostexec pod in the given namespace and waits // until it's Running func LaunchHostExecPod(client clientset.Interface, ns, name string) *v1.Pod { From 82cecd9080a167351c6dc629fce10c0b7396fefe Mon Sep 17 00:00:00 2001 From: Jordan Lewis Date: Thu, 24 Aug 2017 14:42:52 -0400 Subject: [PATCH 281/403] Update example to CockroachDB v1.0.5 --- examples/cockroachdb/cockroachdb-statefulset.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cockroachdb/cockroachdb-statefulset.yaml b/examples/cockroachdb/cockroachdb-statefulset.yaml index e5e6ae6c72928..24446df42b78f 100644 --- a/examples/cockroachdb/cockroachdb-statefulset.yaml +++ b/examples/cockroachdb/cockroachdb-statefulset.yaml @@ -120,7 +120,7 @@ spec: topologyKey: kubernetes.io/hostname containers: - name: cockroachdb - image: cockroachdb/cockroach:v1.0.3 + image: cockroachdb/cockroach:v1.0.5 imagePullPolicy: IfNotPresent ports: - containerPort: 26257 From 9e656231877207b908b1fd073cf01531c9bfeb5d Mon Sep 17 00:00:00 2001 From: Huamin Chen Date: Mon, 24 Jul 2017 14:53:49 +0000 Subject: [PATCH 282/403] refactor CephFS PV spec to use SecretReference Signed-off-by: Huamin Chen --- pkg/api/persistentvolume/util.go | 12 +++- pkg/api/persistentvolume/util_test.go | 13 +++- pkg/api/types.go | 36 +++++++++- pkg/api/validation/validation.go | 10 ++- pkg/printers/internalversion/describe.go | 13 +++- pkg/volume/cephfs/cephfs.go | 73 +++++++++++++------ pkg/volume/cephfs/cephfs_test.go | 91 ++++++++++++++++++++++++ staging/src/k8s.io/api/core/v1/types.go | 41 ++++++++++- 8 files changed, 259 insertions(+), 30 deletions(-) diff --git a/pkg/api/persistentvolume/util.go b/pkg/api/persistentvolume/util.go index ee017403c5e9c..0a8de7c5e68f6 100644 --- a/pkg/api/persistentvolume/util.go +++ b/pkg/api/persistentvolume/util.go @@ -48,8 +48,16 @@ func VisitPVSecretNames(pv *api.PersistentVolume, visitor Visitor) bool { } return true case source.CephFS != nil: - if source.CephFS.SecretRef != nil && !visitor(getClaimRefNamespace(pv), source.CephFS.SecretRef.Name) { - return false + if source.CephFS.SecretRef != nil { + // previously persisted PV objects use claimRef namespace + ns := getClaimRefNamespace(pv) + if len(source.CephFS.SecretRef.Namespace) > 0 { + // use the secret namespace if namespace is set + ns = source.CephFS.SecretRef.Namespace + } + if !visitor(ns, source.CephFS.SecretRef.Name) { + return false + } } case source.FlexVolume != nil: if source.FlexVolume.SecretRef != nil && !visitor(getClaimRefNamespace(pv), source.FlexVolume.SecretRef.Name) { diff --git a/pkg/api/persistentvolume/util_test.go b/pkg/api/persistentvolume/util_test.go index 4e1d07e12a33c..8e83f0644c6d3 100644 --- a/pkg/api/persistentvolume/util_test.go +++ b/pkg/api/persistentvolume/util_test.go @@ -46,8 +46,15 @@ func TestPVSecrets(t *testing.T) { {Spec: api.PersistentVolumeSpec{ ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, PersistentVolumeSource: api.PersistentVolumeSource{ - CephFS: &api.CephFSVolumeSource{ - SecretRef: &api.LocalObjectReference{ + CephFS: &api.CephFSPersistentVolumeSource{ + SecretRef: &api.SecretReference{ + Name: "Spec.PersistentVolumeSource.CephFS.SecretRef", + Namespace: "cephfs"}}}}}, + {Spec: api.PersistentVolumeSpec{ + ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, + PersistentVolumeSource: api.PersistentVolumeSource{ + CephFS: &api.CephFSPersistentVolumeSource{ + SecretRef: &api.SecretReference{ Name: "Spec.PersistentVolumeSource.CephFS.SecretRef"}}}}}, {Spec: api.PersistentVolumeSpec{ ClaimRef: &api.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"}, @@ -81,7 +88,6 @@ func TestPVSecrets(t *testing.T) { Name: "Spec.PersistentVolumeSource.StorageOS.SecretRef", Namespace: "storageosns"}}}}}, } - extractedNames := sets.NewString() extractedNamesWithNamespace := sets.NewString() for _, pv := range pvs { @@ -132,6 +138,7 @@ func TestPVSecrets(t *testing.T) { "claimrefns/Spec.PersistentVolumeSource.AzureFile.SecretName", "Spec.PersistentVolumeSource.AzureFile.SecretNamespace/Spec.PersistentVolumeSource.AzureFile.SecretName", "claimrefns/Spec.PersistentVolumeSource.CephFS.SecretRef", + "cephfs/Spec.PersistentVolumeSource.CephFS.SecretRef", "claimrefns/Spec.PersistentVolumeSource.FlexVolume.SecretRef", "claimrefns/Spec.PersistentVolumeSource.RBD.SecretRef", "claimrefns/Spec.PersistentVolumeSource.ScaleIO.SecretRef", diff --git a/pkg/api/types.go b/pkg/api/types.go index 2b344c6d38d49..a84ee8da13054 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -360,7 +360,7 @@ type PersistentVolumeSource struct { Cinder *CinderVolumeSource // CephFS represents a Ceph FS mount on the host that shares a pod's lifetime // +optional - CephFS *CephFSVolumeSource + CephFS *CephFSPersistentVolumeSource // FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. // +optional FC *FCVolumeSource @@ -1019,6 +1019,40 @@ type CephFSVolumeSource struct { ReadOnly bool } +// SecretReference represents a Secret Reference. It has enough information to retrieve secret +// in any namespace +type SecretReference struct { + // Name is unique within a namespace to reference a secret resource. + // +optional + Name string + // Namespace defines the space within which the secret name must be unique. + // +optional + Namespace string +} + +// Represents a Ceph Filesystem mount that lasts the lifetime of a pod +// Cephfs volumes do not support ownership management or SELinux relabeling. +type CephFSPersistentVolumeSource struct { + // Required: Monitors is a collection of Ceph monitors + Monitors []string + // Optional: Used as the mounted root, rather than the full Ceph tree, default is / + // +optional + Path string + // Optional: User is the rados user name, default is admin + // +optional + User string + // Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret + // +optional + SecretFile string + // Optional: SecretRef is reference to the authentication secret for User, default is empty. + // +optional + SecretRef *SecretReference + // Optional: Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // +optional + ReadOnly bool +} + // Represents a Flocker volume mounted by the Flocker agent. // One and only one of datasetName and datasetUUID should be set. // Flocker volumes do not support ownership management or SELinux relabeling. diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 9bbb3c332631d..73301784c01d3 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -1066,6 +1066,14 @@ func validateCephFSVolumeSource(cephfs *api.CephFSVolumeSource, fldPath *field.P return allErrs } +func validateCephFSPersistentVolumeSource(cephfs *api.CephFSPersistentVolumeSource, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if len(cephfs.Monitors) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("monitors"), "")) + } + return allErrs +} + func validateFlexVolumeSource(fv *api.FlexVolumeSource, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} if len(fv.Driver) == 0 { @@ -1350,7 +1358,7 @@ func ValidatePersistentVolume(pv *api.PersistentVolume) field.ErrorList { allErrs = append(allErrs, field.Forbidden(specPath.Child("cephFS"), "may not specify more than 1 volume type")) } else { numVolumes++ - allErrs = append(allErrs, validateCephFSVolumeSource(pv.Spec.CephFS, specPath.Child("cephfs"))...) + allErrs = append(allErrs, validateCephFSPersistentVolumeSource(pv.Spec.CephFS, specPath.Child("cephfs"))...) } } if pv.Spec.ISCSI != nil { diff --git a/pkg/printers/internalversion/describe.go b/pkg/printers/internalversion/describe.go index 04b16fff344f2..9bb815c4b29d0 100644 --- a/pkg/printers/internalversion/describe.go +++ b/pkg/printers/internalversion/describe.go @@ -954,6 +954,17 @@ func printCephFSVolumeSource(cephfs *api.CephFSVolumeSource, w PrefixWriter) { cephfs.Monitors, cephfs.Path, cephfs.User, cephfs.SecretFile, cephfs.SecretRef, cephfs.ReadOnly) } +func printCephFSPersistentVolumeSource(cephfs *api.CephFSPersistentVolumeSource, w PrefixWriter) { + w.Write(LEVEL_2, "Type:\tCephFS (a CephFS mount on the host that shares a pod's lifetime)\n"+ + " Monitors:\t%v\n"+ + " Path:\t%v\n"+ + " User:\t%v\n"+ + " SecretFile:\t%v\n"+ + " SecretRef:\t%v\n"+ + " ReadOnly:\t%v\n", + cephfs.Monitors, cephfs.Path, cephfs.User, cephfs.SecretFile, cephfs.SecretRef, cephfs.ReadOnly) +} + func printStorageOSVolumeSource(storageos *api.StorageOSVolumeSource, w PrefixWriter) { w.Write(LEVEL_2, "Type:\tStorageOS (a StorageOS Persistent Disk resource)\n"+ " VolumeName:\t%v\n"+ @@ -1095,7 +1106,7 @@ func describePersistentVolume(pv *api.PersistentVolume, events *api.EventList) ( case pv.Spec.Local != nil: printLocalVolumeSource(pv.Spec.Local, w) case pv.Spec.CephFS != nil: - printCephFSVolumeSource(pv.Spec.CephFS, w) + printCephFSPersistentVolumeSource(pv.Spec.CephFS, w) case pv.Spec.StorageOS != nil: printStorageOSPersistentVolumeSource(pv.Spec.StorageOS, w) case pv.Spec.FC != nil: diff --git a/pkg/volume/cephfs/cephfs.go b/pkg/volume/cephfs/cephfs.go index ff2972fcaff00..5c0fdd04a747d 100644 --- a/pkg/volume/cephfs/cephfs.go +++ b/pkg/volume/cephfs/cephfs.go @@ -56,12 +56,12 @@ func (plugin *cephfsPlugin) GetPluginName() string { } func (plugin *cephfsPlugin) GetVolumeName(spec *volume.Spec) (string, error) { - volumeSource, _, err := getVolumeSource(spec) + mon, _, _, _, _, err := getVolumeSource(spec) if err != nil { return "", err } - return fmt.Sprintf("%v", volumeSource.Monitors), nil + return fmt.Sprintf("%v", mon), nil } func (plugin *cephfsPlugin) CanSupport(spec *volume.Spec) bool { @@ -89,23 +89,23 @@ func (plugin *cephfsPlugin) GetAccessModes() []v1.PersistentVolumeAccessMode { } func (plugin *cephfsPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) { - cephvs, _, err := getVolumeSource(spec) + secretName, secretNs, err := getSecretNameAndNamespace(spec, pod.Namespace) if err != nil { return nil, err } secret := "" - if cephvs.SecretRef != nil { + if len(secretName) > 0 && len(secretNs) > 0 { + // if secret is provideded, retrieve it kubeClient := plugin.host.GetKubeClient() if kubeClient == nil { return nil, fmt.Errorf("Cannot get kube client") } - - secretName, err := kubeClient.Core().Secrets(pod.Namespace).Get(cephvs.SecretRef.Name, metav1.GetOptions{}) + secrets, err := kubeClient.Core().Secrets(secretNs).Get(secretName, metav1.GetOptions{}) if err != nil { - err = fmt.Errorf("Couldn't get secret %v/%v err: %v", pod.Namespace, cephvs.SecretRef, err) + err = fmt.Errorf("Couldn't get secret %v/%v err: %v", secretNs, secretName, err) return nil, err } - for name, data := range secretName.Data { + for name, data := range secrets.Data { secret = string(data) glog.V(4).Infof("found ceph secret info: %s", name) } @@ -114,37 +114,35 @@ func (plugin *cephfsPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume. } func (plugin *cephfsPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, mounter mount.Interface, secret string) (volume.Mounter, error) { - cephvs, _, err := getVolumeSource(spec) + mon, path, id, secretFile, readOnly, err := getVolumeSource(spec) if err != nil { return nil, err } - id := cephvs.User if id == "" { id = "admin" } - path := cephvs.Path if path == "" { path = "/" } if !strings.HasPrefix(path, "/") { path = "/" + path } - secret_file := cephvs.SecretFile - if secret_file == "" { - secret_file = "/etc/ceph/" + id + ".secret" + + if secretFile == "" { + secretFile = "/etc/ceph/" + id + ".secret" } return &cephfsMounter{ cephfs: &cephfs{ podUID: podUID, volName: spec.Name(), - mon: cephvs.Monitors, + mon: mon, path: path, secret: secret, id: id, - secret_file: secret_file, - readonly: cephvs.ReadOnly, + secret_file: secretFile, + readonly: readOnly, mounter: mounter, plugin: plugin, mountOptions: volume.MountOptionFromSpec(spec), @@ -301,13 +299,46 @@ func (cephfsVolume *cephfs) execMount(mountpoint string) error { return nil } -func getVolumeSource(spec *volume.Spec) (*v1.CephFSVolumeSource, bool, error) { +func getVolumeSource(spec *volume.Spec) ([]string, string, string, string, bool, error) { if spec.Volume != nil && spec.Volume.CephFS != nil { - return spec.Volume.CephFS, spec.Volume.CephFS.ReadOnly, nil + mon := spec.Volume.CephFS.Monitors + path := spec.Volume.CephFS.Path + user := spec.Volume.CephFS.User + secretFile := spec.Volume.CephFS.SecretFile + readOnly := spec.Volume.CephFS.ReadOnly + return mon, path, user, secretFile, readOnly, nil } else if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.CephFS != nil { - return spec.PersistentVolume.Spec.CephFS, spec.ReadOnly, nil + mon := spec.PersistentVolume.Spec.CephFS.Monitors + path := spec.PersistentVolume.Spec.CephFS.Path + user := spec.PersistentVolume.Spec.CephFS.User + secretFile := spec.PersistentVolume.Spec.CephFS.SecretFile + readOnly := spec.PersistentVolume.Spec.CephFS.ReadOnly + return mon, path, user, secretFile, readOnly, nil } - return nil, false, fmt.Errorf("Spec does not reference a CephFS volume type") + return nil, "", "", "", false, fmt.Errorf("Spec does not reference a CephFS volume type") +} + +func getSecretNameAndNamespace(spec *volume.Spec, defaultNamespace string) (string, string, error) { + if spec.Volume != nil && spec.Volume.CephFS != nil { + localSecretRef := spec.Volume.CephFS.SecretRef + if localSecretRef != nil { + return localSecretRef.Name, defaultNamespace, nil + } + return "", "", nil + + } else if spec.PersistentVolume != nil && + spec.PersistentVolume.Spec.CephFS != nil { + secretRef := spec.PersistentVolume.Spec.CephFS.SecretRef + secretNs := defaultNamespace + if secretRef != nil { + if len(secretRef.Namespace) != 0 { + secretNs = secretRef.Namespace + } + return secretRef.Name, secretNs, nil + } + return "", "", nil + } + return "", "", fmt.Errorf("Spec does not reference an CephFS volume type") } diff --git a/pkg/volume/cephfs/cephfs_test.go b/pkg/volume/cephfs/cephfs_test.go index 87912a784cc33..f17e1902eaccd 100644 --- a/pkg/volume/cephfs/cephfs_test.go +++ b/pkg/volume/cephfs/cephfs_test.go @@ -135,3 +135,94 @@ func TestConstructVolumeSpec(t *testing.T) { t.Errorf("Get wrong cephfs spec name, got: %s", cephfsSpec.Name()) } } + +type testcase struct { + name string + defaultNs string + spec *volume.Spec + // Expected return of the test + expectedName string + expectedNs string + expectedError error +} + +func TestGetSecretNameAndNamespaceForPV(t *testing.T) { + tests := []testcase{ + { + name: "persistent volume source", + defaultNs: "default", + spec: &volume.Spec{ + PersistentVolume: &v1.PersistentVolume{ + Spec: v1.PersistentVolumeSpec{ + PersistentVolumeSource: v1.PersistentVolumeSource{ + CephFS: &v1.CephFSPersistentVolumeSource{ + Monitors: []string{"a", "b"}, + User: "user", + SecretRef: &v1.SecretReference{ + Name: "name", + Namespace: "ns", + }, + SecretFile: "/etc/ceph/user.secret", + }, + }, + }, + }, + }, + expectedName: "name", + expectedNs: "ns", + expectedError: nil, + }, + { + name: "persistent volume source without namespace", + defaultNs: "default", + spec: &volume.Spec{ + PersistentVolume: &v1.PersistentVolume{ + Spec: v1.PersistentVolumeSpec{ + PersistentVolumeSource: v1.PersistentVolumeSource{ + CephFS: &v1.CephFSPersistentVolumeSource{ + Monitors: []string{"a", "b"}, + User: "user", + SecretRef: &v1.SecretReference{ + Name: "name", + }, + SecretFile: "/etc/ceph/user.secret", + }, + }, + }, + }, + }, + expectedName: "name", + expectedNs: "default", + expectedError: nil, + }, + { + name: "pod volume source", + defaultNs: "default", + spec: &volume.Spec{ + Volume: &v1.Volume{ + VolumeSource: v1.VolumeSource{ + CephFS: &v1.CephFSVolumeSource{ + Monitors: []string{"a", "b"}, + User: "user", + SecretRef: &v1.LocalObjectReference{ + Name: "name", + }, + SecretFile: "/etc/ceph/user.secret", + }, + }, + }, + }, + expectedName: "name", + expectedNs: "default", + expectedError: nil, + }, + } + for _, testcase := range tests { + resultName, resultNs, err := getSecretNameAndNamespace(testcase.spec, testcase.defaultNs) + if err != testcase.expectedError || resultName != testcase.expectedName || resultNs != testcase.expectedNs { + t.Errorf("%s failed: expected err=%v ns=%q name=%q, got %v/%q/%q", testcase.name, testcase.expectedError, testcase.expectedNs, testcase.expectedName, + err, resultNs, resultName) + } + } + +} diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 34d5395939da9..c3de989d35812 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -409,7 +409,7 @@ type PersistentVolumeSource struct { Cinder *CinderVolumeSource `json:"cinder,omitempty" protobuf:"bytes,8,opt,name=cinder"` // CephFS represents a Ceph FS mount on the host that shares a pod's lifetime // +optional - CephFS *CephFSVolumeSource `json:"cephfs,omitempty" protobuf:"bytes,9,opt,name=cephfs"` + CephFS *CephFSPersistentVolumeSource `json:"cephfs,omitempty" protobuf:"bytes,9,opt,name=cephfs"` // FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. // +optional FC *FCVolumeSource `json:"fc,omitempty" protobuf:"bytes,10,opt,name=fc"` @@ -848,6 +848,45 @@ type CephFSVolumeSource struct { ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,6,opt,name=readOnly"` } +// SecretReference represents a Secret Reference. It has enough information to retrieve secret +// in any namespace +type SecretReference struct { + // Name is unique within a namespace to reference a secret resource. + // +optional + Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` + // Namespace defines the space within which the secret name must be unique. + // +optional + Namespace string `json:"namespace,omitempty" protobuf:"bytes,2,opt,name=namespace"` +} + +// Represents a Ceph Filesystem mount that lasts the lifetime of a pod +// Cephfs volumes do not support ownership management or SELinux relabeling. +type CephFSPersistentVolumeSource struct { + // Required: Monitors is a collection of Ceph monitors + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + Monitors []string `json:"monitors" protobuf:"bytes,1,rep,name=monitors"` + // Optional: Used as the mounted root, rather than the full Ceph tree, default is / + // +optional + Path string `json:"path,omitempty" protobuf:"bytes,2,opt,name=path"` + // Optional: User is the rados user name, default is admin + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + // +optional + User string `json:"user,omitempty" protobuf:"bytes,3,opt,name=user"` + // Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + // +optional + SecretFile string `json:"secretFile,omitempty" protobuf:"bytes,4,opt,name=secretFile"` + // Optional: SecretRef is reference to the authentication secret for User, default is empty. + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + // +optional + SecretRef *SecretReference `json:"secretRef,omitempty" protobuf:"bytes,5,opt,name=secretRef"` + // Optional: Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + // +optional + ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,6,opt,name=readOnly"` +} + // Represents a Flocker volume mounted by the Flocker agent. // One and only one of datasetName and datasetUUID should be set. // Flocker volumes do not support ownership management or SELinux relabeling. From 9f0aad32b0ee8fc12a7b0b33dbd806d413171450 Mon Sep 17 00:00:00 2001 From: Huamin Chen Date: Mon, 24 Jul 2017 15:01:46 +0000 Subject: [PATCH 283/403] generated files Signed-off-by: Huamin Chen --- api/openapi-spec/swagger.json | 50 +- api/swagger-spec/v1.json | 58 +- build/root/BUILD.root | 25 +- docs/api-reference/v1/definitions.html | 112 +- pkg/api/v1/zz_generated.conversion.go | 64 +- pkg/api/zz_generated.deepcopy.go | 56 +- .../src/k8s.io/api/core/v1/generated.pb.go | 3372 ++++++++++------- .../src/k8s.io/api/core/v1/generated.proto | 47 +- .../src/k8s.io/api/core/v1/types.generated.go | 731 +++- .../core/v1/types_swagger_doc_generated.go | 24 + .../api/core/v1/zz_generated.deepcopy.go | 56 +- 11 files changed, 3137 insertions(+), 1458 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 5b6551245ec0c..f7dd649d02eed 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -58230,6 +58230,41 @@ } } }, + "io.k8s.api.core.v1.CephFSPersistentVolumeSource": { + "description": "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.", + "required": [ + "monitors" + ], + "properties": { + "monitors": { + "description": "Required: Monitors is a collection of Ceph monitors More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", + "type": "array", + "items": { + "type": "string" + } + }, + "path": { + "description": "Optional: Used as the mounted root, rather than the full Ceph tree, default is /", + "type": "string" + }, + "readOnly": { + "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", + "type": "boolean" + }, + "secretFile": { + "description": "Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", + "type": "string" + }, + "secretRef": { + "description": "Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", + "$ref": "#/definitions/io.k8s.api.core.v1.SecretReference" + }, + "user": { + "description": "Optional: User is the rados user name, default is admin More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", + "type": "string" + } + } + }, "io.k8s.api.core.v1.CephFSVolumeSource": { "description": "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.", "required": [ @@ -60465,7 +60500,7 @@ }, "cephfs": { "description": "CephFS represents a Ceph FS mount on the host that shares a pod's lifetime", - "$ref": "#/definitions/io.k8s.api.core.v1.CephFSVolumeSource" + "$ref": "#/definitions/io.k8s.api.core.v1.CephFSPersistentVolumeSource" }, "cinder": { "description": "Cinder represents a cinder volume attached and mounted on kubelets host machine More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", @@ -61723,6 +61758,19 @@ } } }, + "io.k8s.api.core.v1.SecretReference": { + "description": "SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace", + "properties": { + "name": { + "description": "Name is unique within a namespace to reference a secret resource.", + "type": "string" + }, + "namespace": { + "description": "Namespace defines the space within which the secret name must be unique.", + "type": "string" + } + } + }, "io.k8s.api.core.v1.SecretVolumeSource": { "description": "Adapts a Secret into a volume.\n\nThe contents of the target Secret's Data field will be presented in a volume as files using the keys in the Data field as the file names. Secret volumes support ownership management and SELinux relabeling.", "properties": { diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 1990a5b5bcc44..893be84f2e2d1 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -18865,7 +18865,7 @@ "description": "Cinder represents a cinder volume attached and mounted on kubelets host machine More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md" }, "cephfs": { - "$ref": "v1.CephFSVolumeSource", + "$ref": "v1.CephFSPersistentVolumeSource", "description": "CephFS represents a Ceph FS mount on the host that shares a pod's lifetime" }, "fc": { @@ -19189,8 +19189,8 @@ } } }, - "v1.CephFSVolumeSource": { - "id": "v1.CephFSVolumeSource", + "v1.CephFSPersistentVolumeSource": { + "id": "v1.CephFSPersistentVolumeSource", "description": "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.", "required": [ "monitors" @@ -19216,7 +19216,7 @@ "description": "Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it" }, "secretRef": { - "$ref": "v1.LocalObjectReference", + "$ref": "v1.SecretReference", "description": "Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it" }, "readOnly": { @@ -19225,6 +19225,20 @@ } } }, + "v1.SecretReference": { + "id": "v1.SecretReference", + "description": "SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace", + "properties": { + "name": { + "type": "string", + "description": "Name is unique within a namespace to reference a secret resource." + }, + "namespace": { + "type": "string", + "description": "Namespace defines the space within which the secret name must be unique." + } + } + }, "v1.FCVolumeSource": { "id": "v1.FCVolumeSource", "description": "Represents a Fibre Channel volume. Fibre Channel volumes can only be mounted as read/write once. Fibre Channel volumes support ownership management and SELinux relabeling.", @@ -19977,6 +19991,42 @@ } } }, + "v1.CephFSVolumeSource": { + "id": "v1.CephFSVolumeSource", + "description": "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.", + "required": [ + "monitors" + ], + "properties": { + "monitors": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Required: Monitors is a collection of Ceph monitors More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it" + }, + "path": { + "type": "string", + "description": "Optional: Used as the mounted root, rather than the full Ceph tree, default is /" + }, + "user": { + "type": "string", + "description": "Optional: User is the rados user name, default is admin More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it" + }, + "secretFile": { + "type": "string", + "description": "Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it" + }, + "secretRef": { + "$ref": "v1.LocalObjectReference", + "description": "Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it" + }, + "readOnly": { + "type": "boolean", + "description": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it" + } + } + }, "v1.DownwardAPIVolumeSource": { "id": "v1.DownwardAPIVolumeSource", "description": "DownwardAPIVolumeSource represents a volume containing downward API info. Downward API volumes support ownership management and SELinux relabeling.", diff --git a/build/root/BUILD.root b/build/root/BUILD.root index 773defc3b9ec6..5258945f61280 100644 --- a/build/root/BUILD.root +++ b/build/root/BUILD.root @@ -5,7 +5,7 @@ package(default_visibility = ["//visibility:public"]) -load("@io_bazel_rules_go//go:def.bzl", "go_prefix") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_prefix") load("@io_kubernetes_build//defs:build.bzl", "gcs_upload") go_prefix("k8s.io/kubernetes") @@ -457,3 +457,26 @@ genrule( cmd = "grep ^STABLE_BUILD_SCM_REVISION bazel-out/stable-status.txt | awk '{print $$2}' >$@", stamp = 1, ) + +go_library( + name = "go_default_library", + srcs = [ + "generated.pb.go", + "types.go", + ], + deps = [ + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + ], +) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 3168d964bd392..a6f1b125796e9 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -2378,6 +2378,47 @@

v1.ExecAction

+
+
+

v1.SecretReference

+
+

SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace

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

name

Name is unique within a namespace to reference a secret resource.

false

string

namespace

Namespace defines the space within which the secret name must be unique.

false

string

+

v1.ObjectMeta

@@ -4847,6 +4888,75 @@

v1.Probe

+
+
+

v1.CephFSPersistentVolumeSource

+
+

Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.

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

monitors

Required: Monitors is a collection of Ceph monitors More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it

true

string array

path

Optional: Used as the mounted root, rather than the full Ceph tree, default is /

false

string

user

Optional: User is the rados user name, default is admin More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it

false

string

secretFile

Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it

false

string

secretRef

Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it

false

v1.SecretReference

readOnly

Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it

false

boolean

false

+

v1.SecretKeySelector

@@ -7419,7 +7529,7 @@

v1.PersistentVolumeSpec

cephfs

CephFS represents a Ceph FS mount on the host that shares a pod’s lifetime

false

-

v1.CephFSVolumeSource

+

v1.CephFSPersistentVolumeSource

diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 45924338de62c..b1e6276a87615 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -56,6 +56,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_Binding_To_v1_Binding, Convert_v1_Capabilities_To_api_Capabilities, Convert_api_Capabilities_To_v1_Capabilities, + Convert_v1_CephFSPersistentVolumeSource_To_api_CephFSPersistentVolumeSource, + Convert_api_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource, Convert_v1_CephFSVolumeSource_To_api_CephFSVolumeSource, Convert_api_CephFSVolumeSource_To_v1_CephFSVolumeSource, Convert_v1_CinderVolumeSource_To_api_CinderVolumeSource, @@ -338,6 +340,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_SecretList_To_v1_SecretList, Convert_v1_SecretProjection_To_api_SecretProjection, Convert_api_SecretProjection_To_v1_SecretProjection, + Convert_v1_SecretReference_To_api_SecretReference, + Convert_api_SecretReference_To_v1_SecretReference, Convert_v1_SecretVolumeSource_To_api_SecretVolumeSource, Convert_api_SecretVolumeSource_To_v1_SecretVolumeSource, Convert_v1_SecurityContext_To_api_SecurityContext, @@ -607,6 +611,40 @@ func Convert_api_Capabilities_To_v1_Capabilities(in *api.Capabilities, out *v1.C return autoConvert_api_Capabilities_To_v1_Capabilities(in, out, s) } +func autoConvert_v1_CephFSPersistentVolumeSource_To_api_CephFSPersistentVolumeSource(in *v1.CephFSPersistentVolumeSource, out *api.CephFSPersistentVolumeSource, s conversion.Scope) error { + out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors)) + out.Path = in.Path + out.User = in.User + out.SecretFile = in.SecretFile + out.SecretRef = (*api.SecretReference)(unsafe.Pointer(in.SecretRef)) + out.ReadOnly = in.ReadOnly + return nil +} + +// Convert_v1_CephFSPersistentVolumeSource_To_api_CephFSPersistentVolumeSource is an autogenerated conversion function. +func Convert_v1_CephFSPersistentVolumeSource_To_api_CephFSPersistentVolumeSource(in *v1.CephFSPersistentVolumeSource, out *api.CephFSPersistentVolumeSource, s conversion.Scope) error { + return autoConvert_v1_CephFSPersistentVolumeSource_To_api_CephFSPersistentVolumeSource(in, out, s) +} + +func autoConvert_api_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource(in *api.CephFSPersistentVolumeSource, out *v1.CephFSPersistentVolumeSource, s conversion.Scope) error { + if in.Monitors == nil { + out.Monitors = make([]string, 0) + } else { + out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors)) + } + out.Path = in.Path + out.User = in.User + out.SecretFile = in.SecretFile + out.SecretRef = (*v1.SecretReference)(unsafe.Pointer(in.SecretRef)) + out.ReadOnly = in.ReadOnly + return nil +} + +// Convert_api_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource is an autogenerated conversion function. +func Convert_api_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource(in *api.CephFSPersistentVolumeSource, out *v1.CephFSPersistentVolumeSource, s conversion.Scope) error { + return autoConvert_api_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource(in, out, s) +} + func autoConvert_v1_CephFSVolumeSource_To_api_CephFSVolumeSource(in *v1.CephFSVolumeSource, out *api.CephFSVolumeSource, s conversion.Scope) error { out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors)) out.Path = in.Path @@ -3090,7 +3128,7 @@ func autoConvert_v1_PersistentVolumeSource_To_api_PersistentVolumeSource(in *v1. out.RBD = (*api.RBDVolumeSource)(unsafe.Pointer(in.RBD)) out.ISCSI = (*api.ISCSIVolumeSource)(unsafe.Pointer(in.ISCSI)) out.Cinder = (*api.CinderVolumeSource)(unsafe.Pointer(in.Cinder)) - out.CephFS = (*api.CephFSVolumeSource)(unsafe.Pointer(in.CephFS)) + out.CephFS = (*api.CephFSPersistentVolumeSource)(unsafe.Pointer(in.CephFS)) out.FC = (*api.FCVolumeSource)(unsafe.Pointer(in.FC)) out.Flocker = (*api.FlockerVolumeSource)(unsafe.Pointer(in.Flocker)) out.FlexVolume = (*api.FlexVolumeSource)(unsafe.Pointer(in.FlexVolume)) @@ -3122,7 +3160,7 @@ func autoConvert_api_PersistentVolumeSource_To_v1_PersistentVolumeSource(in *api out.ISCSI = (*v1.ISCSIVolumeSource)(unsafe.Pointer(in.ISCSI)) out.FlexVolume = (*v1.FlexVolumeSource)(unsafe.Pointer(in.FlexVolume)) out.Cinder = (*v1.CinderVolumeSource)(unsafe.Pointer(in.Cinder)) - out.CephFS = (*v1.CephFSVolumeSource)(unsafe.Pointer(in.CephFS)) + out.CephFS = (*v1.CephFSPersistentVolumeSource)(unsafe.Pointer(in.CephFS)) out.FC = (*v1.FCVolumeSource)(unsafe.Pointer(in.FC)) out.Flocker = (*v1.FlockerVolumeSource)(unsafe.Pointer(in.Flocker)) out.AzureFile = (*v1.AzureFilePersistentVolumeSource)(unsafe.Pointer(in.AzureFile)) @@ -4606,6 +4644,28 @@ func Convert_api_SecretProjection_To_v1_SecretProjection(in *api.SecretProjectio return autoConvert_api_SecretProjection_To_v1_SecretProjection(in, out, s) } +func autoConvert_v1_SecretReference_To_api_SecretReference(in *v1.SecretReference, out *api.SecretReference, s conversion.Scope) error { + out.Name = in.Name + out.Namespace = in.Namespace + return nil +} + +// Convert_v1_SecretReference_To_api_SecretReference is an autogenerated conversion function. +func Convert_v1_SecretReference_To_api_SecretReference(in *v1.SecretReference, out *api.SecretReference, s conversion.Scope) error { + return autoConvert_v1_SecretReference_To_api_SecretReference(in, out, s) +} + +func autoConvert_api_SecretReference_To_v1_SecretReference(in *api.SecretReference, out *v1.SecretReference, s conversion.Scope) error { + out.Name = in.Name + out.Namespace = in.Namespace + return nil +} + +// Convert_api_SecretReference_To_v1_SecretReference is an autogenerated conversion function. +func Convert_api_SecretReference_To_v1_SecretReference(in *api.SecretReference, out *v1.SecretReference, s conversion.Scope) error { + return autoConvert_api_SecretReference_To_v1_SecretReference(in, out, s) +} + func autoConvert_v1_SecretVolumeSource_To_api_SecretVolumeSource(in *v1.SecretVolumeSource, out *api.SecretVolumeSource, s conversion.Scope) error { out.SecretName = in.SecretName out.Items = *(*[]api.KeyToPath)(unsafe.Pointer(&in.Items)) diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index e3ff932f5b68f..fb5377d6679b4 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -74,6 +74,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*Capabilities).DeepCopyInto(out.(*Capabilities)) return nil }, InType: reflect.TypeOf(&Capabilities{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*CephFSPersistentVolumeSource).DeepCopyInto(out.(*CephFSPersistentVolumeSource)) + return nil + }, InType: reflect.TypeOf(&CephFSPersistentVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*CephFSVolumeSource).DeepCopyInto(out.(*CephFSVolumeSource)) return nil @@ -638,6 +642,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*SecretProjection).DeepCopyInto(out.(*SecretProjection)) return nil }, InType: reflect.TypeOf(&SecretProjection{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*SecretReference).DeepCopyInto(out.(*SecretReference)) + return nil + }, InType: reflect.TypeOf(&SecretReference{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*SecretVolumeSource).DeepCopyInto(out.(*SecretVolumeSource)) return nil @@ -978,6 +986,36 @@ func (in *Capabilities) DeepCopy() *Capabilities { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CephFSPersistentVolumeSource) DeepCopyInto(out *CephFSPersistentVolumeSource) { + *out = *in + if in.Monitors != nil { + in, out := &in.Monitors, &out.Monitors + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + if *in == nil { + *out = nil + } else { + *out = new(SecretReference) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CephFSPersistentVolumeSource. +func (in *CephFSPersistentVolumeSource) DeepCopy() *CephFSPersistentVolumeSource { + if in == nil { + return nil + } + out := new(CephFSPersistentVolumeSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CephFSVolumeSource) DeepCopyInto(out *CephFSVolumeSource) { *out = *in @@ -3681,7 +3719,7 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { if *in == nil { *out = nil } else { - *out = new(CephFSVolumeSource) + *out = new(CephFSPersistentVolumeSource) (*in).DeepCopyInto(*out) } } @@ -5263,6 +5301,22 @@ func (in *SecretProjection) DeepCopy() *SecretProjection { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretReference) DeepCopyInto(out *SecretReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretReference. +func (in *SecretReference) DeepCopy() *SecretReference { + if in == nil { + return nil + } + out := new(SecretReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SecretVolumeSource) DeepCopyInto(out *SecretVolumeSource) { *out = *in diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 5bde18f63796a..77e938ee5649a 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -34,6 +34,7 @@ limitations under the License. AzureFileVolumeSource Binding Capabilities + CephFSPersistentVolumeSource CephFSVolumeSource CinderVolumeSource ComponentCondition @@ -175,6 +176,7 @@ limitations under the License. SecretKeySelector SecretList SecretProjection + SecretReference SecretVolumeSource SecurityContext SerializedReference @@ -269,698 +271,708 @@ func (m *Capabilities) Reset() { *m = Capabilities{} } func (*Capabilities) ProtoMessage() {} func (*Capabilities) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } +func (m *CephFSPersistentVolumeSource) Reset() { *m = CephFSPersistentVolumeSource{} } +func (*CephFSPersistentVolumeSource) ProtoMessage() {} +func (*CephFSPersistentVolumeSource) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{9} +} + func (m *CephFSVolumeSource) Reset() { *m = CephFSVolumeSource{} } func (*CephFSVolumeSource) ProtoMessage() {} -func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } +func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } func (m *CinderVolumeSource) Reset() { *m = CinderVolumeSource{} } func (*CinderVolumeSource) ProtoMessage() {} -func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } +func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } func (m *ComponentCondition) Reset() { *m = ComponentCondition{} } func (*ComponentCondition) ProtoMessage() {} -func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } +func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } func (m *ComponentStatus) Reset() { *m = ComponentStatus{} } func (*ComponentStatus) ProtoMessage() {} -func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } +func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } func (m *ComponentStatusList) Reset() { *m = ComponentStatusList{} } func (*ComponentStatusList) ProtoMessage() {} -func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } +func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (m *ConfigMap) Reset() { *m = ConfigMap{} } func (*ConfigMap) ProtoMessage() {} -func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } +func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (m *ConfigMapEnvSource) Reset() { *m = ConfigMapEnvSource{} } func (*ConfigMapEnvSource) ProtoMessage() {} -func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } +func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } func (m *ConfigMapKeySelector) Reset() { *m = ConfigMapKeySelector{} } func (*ConfigMapKeySelector) ProtoMessage() {} -func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } +func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } func (m *ConfigMapList) Reset() { *m = ConfigMapList{} } func (*ConfigMapList) ProtoMessage() {} -func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } +func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } func (m *ConfigMapProjection) Reset() { *m = ConfigMapProjection{} } func (*ConfigMapProjection) ProtoMessage() {} -func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } +func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (m *ConfigMapVolumeSource) Reset() { *m = ConfigMapVolumeSource{} } func (*ConfigMapVolumeSource) ProtoMessage() {} -func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } +func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (m *Container) Reset() { *m = Container{} } func (*Container) ProtoMessage() {} -func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } +func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } func (m *ContainerImage) Reset() { *m = ContainerImage{} } func (*ContainerImage) ProtoMessage() {} -func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (m *ContainerPort) Reset() { *m = ContainerPort{} } func (*ContainerPort) ProtoMessage() {} -func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *ContainerState) Reset() { *m = ContainerState{} } func (*ContainerState) ProtoMessage() {} -func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *ContainerStateRunning) Reset() { *m = ContainerStateRunning{} } func (*ContainerStateRunning) ProtoMessage() {} -func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *ContainerStateTerminated) Reset() { *m = ContainerStateTerminated{} } func (*ContainerStateTerminated) ProtoMessage() {} func (*ContainerStateTerminated) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{25} + return fileDescriptorGenerated, []int{26} } func (m *ContainerStateWaiting) Reset() { *m = ContainerStateWaiting{} } func (*ContainerStateWaiting) ProtoMessage() {} -func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } func (*ContainerStatus) ProtoMessage() {} -func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } func (m *DaemonEndpoint) Reset() { *m = DaemonEndpoint{} } func (*DaemonEndpoint) ProtoMessage() {} -func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } +func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *DeleteOptions) Reset() { *m = DeleteOptions{} } func (*DeleteOptions) ProtoMessage() {} -func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *DownwardAPIProjection) Reset() { *m = DownwardAPIProjection{} } func (*DownwardAPIProjection) ProtoMessage() {} -func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *DownwardAPIVolumeFile) Reset() { *m = DownwardAPIVolumeFile{} } func (*DownwardAPIVolumeFile) ProtoMessage() {} -func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } +func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (m *DownwardAPIVolumeSource) Reset() { *m = DownwardAPIVolumeSource{} } func (*DownwardAPIVolumeSource) ProtoMessage() {} func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{32} + return fileDescriptorGenerated, []int{33} } func (m *EmptyDirVolumeSource) Reset() { *m = EmptyDirVolumeSource{} } func (*EmptyDirVolumeSource) ProtoMessage() {} -func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } +func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (m *EndpointAddress) Reset() { *m = EndpointAddress{} } func (*EndpointAddress) ProtoMessage() {} -func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } +func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } func (m *EndpointPort) Reset() { *m = EndpointPort{} } func (*EndpointPort) ProtoMessage() {} -func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } +func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (m *EndpointSubset) Reset() { *m = EndpointSubset{} } func (*EndpointSubset) ProtoMessage() {} -func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *Endpoints) Reset() { *m = Endpoints{} } func (*Endpoints) ProtoMessage() {} -func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } +func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func (m *EndpointsList) Reset() { *m = EndpointsList{} } func (*EndpointsList) ProtoMessage() {} -func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } +func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } func (m *EnvFromSource) Reset() { *m = EnvFromSource{} } func (*EnvFromSource) ProtoMessage() {} -func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } +func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } func (m *EnvVar) Reset() { *m = EnvVar{} } func (*EnvVar) ProtoMessage() {} -func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } +func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } func (m *EnvVarSource) Reset() { *m = EnvVarSource{} } func (*EnvVarSource) ProtoMessage() {} -func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } +func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } +func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } func (m *EventList) Reset() { *m = EventList{} } func (*EventList) ProtoMessage() {} -func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } +func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } func (m *EventSource) Reset() { *m = EventSource{} } func (*EventSource) ProtoMessage() {} -func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } +func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } func (m *ExecAction) Reset() { *m = ExecAction{} } func (*ExecAction) ProtoMessage() {} -func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } +func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } func (m *FCVolumeSource) Reset() { *m = FCVolumeSource{} } func (*FCVolumeSource) ProtoMessage() {} -func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } +func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } func (m *FlexVolumeSource) Reset() { *m = FlexVolumeSource{} } func (*FlexVolumeSource) ProtoMessage() {} -func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } +func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } func (m *FlockerVolumeSource) Reset() { *m = FlockerVolumeSource{} } func (*FlockerVolumeSource) ProtoMessage() {} -func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } +func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } func (m *GCEPersistentDiskVolumeSource) Reset() { *m = GCEPersistentDiskVolumeSource{} } func (*GCEPersistentDiskVolumeSource) ProtoMessage() {} func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{49} + return fileDescriptorGenerated, []int{50} } func (m *GitRepoVolumeSource) Reset() { *m = GitRepoVolumeSource{} } func (*GitRepoVolumeSource) ProtoMessage() {} -func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } +func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } func (m *GlusterfsVolumeSource) Reset() { *m = GlusterfsVolumeSource{} } func (*GlusterfsVolumeSource) ProtoMessage() {} -func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } +func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } func (m *HTTPGetAction) Reset() { *m = HTTPGetAction{} } func (*HTTPGetAction) ProtoMessage() {} -func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } +func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } func (m *HTTPHeader) Reset() { *m = HTTPHeader{} } func (*HTTPHeader) ProtoMessage() {} -func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } +func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } func (m *Handler) Reset() { *m = Handler{} } func (*Handler) ProtoMessage() {} -func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } +func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } func (m *HostAlias) Reset() { *m = HostAlias{} } func (*HostAlias) ProtoMessage() {} -func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } +func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } func (m *HostPathVolumeSource) Reset() { *m = HostPathVolumeSource{} } func (*HostPathVolumeSource) ProtoMessage() {} -func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } +func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } func (m *ISCSIVolumeSource) Reset() { *m = ISCSIVolumeSource{} } func (*ISCSIVolumeSource) ProtoMessage() {} -func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } +func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } func (m *KeyToPath) Reset() { *m = KeyToPath{} } func (*KeyToPath) ProtoMessage() {} -func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } +func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } func (m *Lifecycle) Reset() { *m = Lifecycle{} } func (*Lifecycle) ProtoMessage() {} -func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } +func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } func (m *LimitRange) Reset() { *m = LimitRange{} } func (*LimitRange) ProtoMessage() {} -func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } +func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } func (m *LimitRangeItem) Reset() { *m = LimitRangeItem{} } func (*LimitRangeItem) ProtoMessage() {} -func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } +func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } func (m *LimitRangeList) Reset() { *m = LimitRangeList{} } func (*LimitRangeList) ProtoMessage() {} -func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } +func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } func (m *LimitRangeSpec) Reset() { *m = LimitRangeSpec{} } func (*LimitRangeSpec) ProtoMessage() {} -func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } +func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} -func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } +func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } func (m *ListOptions) Reset() { *m = ListOptions{} } func (*ListOptions) ProtoMessage() {} -func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } +func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } func (m *LoadBalancerIngress) Reset() { *m = LoadBalancerIngress{} } func (*LoadBalancerIngress) ProtoMessage() {} -func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } +func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } func (m *LoadBalancerStatus) Reset() { *m = LoadBalancerStatus{} } func (*LoadBalancerStatus) ProtoMessage() {} -func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } +func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } func (m *LocalObjectReference) Reset() { *m = LocalObjectReference{} } func (*LocalObjectReference) ProtoMessage() {} -func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } +func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } func (m *LocalVolumeSource) Reset() { *m = LocalVolumeSource{} } func (*LocalVolumeSource) ProtoMessage() {} -func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } +func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } func (m *NFSVolumeSource) Reset() { *m = NFSVolumeSource{} } func (*NFSVolumeSource) ProtoMessage() {} -func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } +func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } func (m *Namespace) Reset() { *m = Namespace{} } func (*Namespace) ProtoMessage() {} -func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } +func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } func (m *NamespaceList) Reset() { *m = NamespaceList{} } func (*NamespaceList) ProtoMessage() {} -func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } +func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (*NamespaceSpec) ProtoMessage() {} -func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } +func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } func (m *NamespaceStatus) Reset() { *m = NamespaceStatus{} } func (*NamespaceStatus) ProtoMessage() {} -func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } +func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } func (m *Node) Reset() { *m = Node{} } func (*Node) ProtoMessage() {} -func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } +func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (*NodeAddress) ProtoMessage() {} -func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } +func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } func (m *NodeAffinity) Reset() { *m = NodeAffinity{} } func (*NodeAffinity) ProtoMessage() {} -func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } +func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} -func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } +func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} } func (*NodeConfigSource) ProtoMessage() {} -func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } +func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} -func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } +func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} -func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } +func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} -func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } +func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } func (m *NodeResources) Reset() { *m = NodeResources{} } func (*NodeResources) ProtoMessage() {} -func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } +func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} -func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } +func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{85} + return fileDescriptorGenerated, []int{86} } func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} -func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } +func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} -func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } +func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} -func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } +func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} -func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } +func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} -func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } +func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } func (*ObjectMeta) ProtoMessage() {} -func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } +func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} -func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } +func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} -func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } +func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} -func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } +func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} } func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{95} + return fileDescriptorGenerated, []int{96} } func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{96} + return fileDescriptorGenerated, []int{97} } func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{97} + return fileDescriptorGenerated, []int{98} } func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{98} + return fileDescriptorGenerated, []int{99} } func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} -func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} } +func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} } func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{100} + return fileDescriptorGenerated, []int{101} } func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} -func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{101} } +func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{102} } func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{102} + return fileDescriptorGenerated, []int{103} } func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{103} + return fileDescriptorGenerated, []int{104} } func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} -func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{104} } +func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} -func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } +func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} -func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } +func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} -func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } +func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} -func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } +func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} -func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } +func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} -func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } +func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} -func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } +func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} -func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } +func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} -func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } +func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} -func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } +func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} -func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } +func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} -func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } +func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} -func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } +func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} -func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } +func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} -func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } +func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} -func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } +func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} -func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } +func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} -func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } +func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} -func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } +func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} -func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } +func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{126} + return fileDescriptorGenerated, []int{127} } func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} -func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } +func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} -func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } +func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} -func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } +func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} -func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } +func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} -func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } +func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} -func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } +func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{133} + return fileDescriptorGenerated, []int{134} } func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{134} + return fileDescriptorGenerated, []int{135} } func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{135} + return fileDescriptorGenerated, []int{136} } func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{136} + return fileDescriptorGenerated, []int{137} } func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} -func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } +func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} -func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } +func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} -func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } +func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} -func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} -func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} -func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} -func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} -func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } + +func (m *SecretReference) Reset() { *m = SecretReference{} } +func (*SecretReference) ProtoMessage() {} +func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{161} + return fileDescriptorGenerated, []int{163} } func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} -func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{171} + return fileDescriptorGenerated, []int{173} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{172} + return fileDescriptorGenerated, []int{174} } func init() { @@ -973,6 +985,7 @@ func init() { proto.RegisterType((*AzureFileVolumeSource)(nil), "k8s.io.api.core.v1.AzureFileVolumeSource") proto.RegisterType((*Binding)(nil), "k8s.io.api.core.v1.Binding") proto.RegisterType((*Capabilities)(nil), "k8s.io.api.core.v1.Capabilities") + proto.RegisterType((*CephFSPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CephFSPersistentVolumeSource") proto.RegisterType((*CephFSVolumeSource)(nil), "k8s.io.api.core.v1.CephFSVolumeSource") proto.RegisterType((*CinderVolumeSource)(nil), "k8s.io.api.core.v1.CinderVolumeSource") proto.RegisterType((*ComponentCondition)(nil), "k8s.io.api.core.v1.ComponentCondition") @@ -1114,6 +1127,7 @@ func init() { proto.RegisterType((*SecretKeySelector)(nil), "k8s.io.api.core.v1.SecretKeySelector") proto.RegisterType((*SecretList)(nil), "k8s.io.api.core.v1.SecretList") proto.RegisterType((*SecretProjection)(nil), "k8s.io.api.core.v1.SecretProjection") + proto.RegisterType((*SecretReference)(nil), "k8s.io.api.core.v1.SecretReference") proto.RegisterType((*SecretVolumeSource)(nil), "k8s.io.api.core.v1.SecretVolumeSource") proto.RegisterType((*SecurityContext)(nil), "k8s.io.api.core.v1.SecurityContext") proto.RegisterType((*SerializedReference)(nil), "k8s.io.api.core.v1.SerializedReference") @@ -1489,7 +1503,7 @@ func (m *Capabilities) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *CephFSVolumeSource) Marshal() (dAtA []byte, err error) { +func (m *CephFSPersistentVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -1499,7 +1513,7 @@ func (m *CephFSVolumeSource) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CephFSVolumeSource) MarshalTo(dAtA []byte) (int, error) { +func (m *CephFSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int @@ -1552,6 +1566,69 @@ func (m *CephFSVolumeSource) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *CephFSVolumeSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CephFSVolumeSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Monitors) > 0 { + for _, s := range m.Monitors { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) + i += copy(dAtA[i:], m.Path) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.User))) + i += copy(dAtA[i:], m.User) + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.SecretFile))) + i += copy(dAtA[i:], m.SecretFile) + if m.SecretRef != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) + n7, err := m.SecretRef.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + dAtA[i] = 0x30 + i++ + if m.ReadOnly { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + return i, nil +} + func (m *CinderVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1638,11 +1715,11 @@ func (m *ComponentStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n7, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n8, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n7 + i += n8 if len(m.Conditions) > 0 { for _, msg := range m.Conditions { dAtA[i] = 0x12 @@ -1676,11 +1753,11 @@ func (m *ComponentStatusList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n8, err := m.ListMeta.MarshalTo(dAtA[i:]) + n9, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n8 + i += n9 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -1714,11 +1791,11 @@ func (m *ConfigMap) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n9, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n10, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n9 + i += n10 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -1762,11 +1839,11 @@ func (m *ConfigMapEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n10, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n11, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n10 + i += n11 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -1798,11 +1875,11 @@ func (m *ConfigMapKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n11, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n12, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n11 + i += n12 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -1838,11 +1915,11 @@ func (m *ConfigMapList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n12, err := m.ListMeta.MarshalTo(dAtA[i:]) + n13, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n12 + i += n13 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -1876,11 +1953,11 @@ func (m *ConfigMapProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n13, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n14, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n13 + i += n14 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -1924,11 +2001,11 @@ func (m *ConfigMapVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n14, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n15, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n14 + i += n15 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -2043,11 +2120,11 @@ func (m *Container) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Resources.Size())) - n15, err := m.Resources.MarshalTo(dAtA[i:]) + n16, err := m.Resources.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n15 + i += n16 if len(m.VolumeMounts) > 0 { for _, msg := range m.VolumeMounts { dAtA[i] = 0x4a @@ -2064,31 +2141,31 @@ func (m *Container) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LivenessProbe.Size())) - n16, err := m.LivenessProbe.MarshalTo(dAtA[i:]) + n17, err := m.LivenessProbe.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n17 } if m.ReadinessProbe != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ReadinessProbe.Size())) - n17, err := m.ReadinessProbe.MarshalTo(dAtA[i:]) + n18, err := m.ReadinessProbe.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n17 + i += n18 } if m.Lifecycle != nil { dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Lifecycle.Size())) - n18, err := m.Lifecycle.MarshalTo(dAtA[i:]) + n19, err := m.Lifecycle.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n19 } dAtA[i] = 0x6a i++ @@ -2102,11 +2179,11 @@ func (m *Container) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x7a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size())) - n19, err := m.SecurityContext.MarshalTo(dAtA[i:]) + n20, err := m.SecurityContext.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n19 + i += n20 } dAtA[i] = 0x80 i++ @@ -2252,31 +2329,31 @@ func (m *ContainerState) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Waiting.Size())) - n20, err := m.Waiting.MarshalTo(dAtA[i:]) + n21, err := m.Waiting.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n21 } if m.Running != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Running.Size())) - n21, err := m.Running.MarshalTo(dAtA[i:]) + n22, err := m.Running.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n21 + i += n22 } if m.Terminated != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Terminated.Size())) - n22, err := m.Terminated.MarshalTo(dAtA[i:]) + n23, err := m.Terminated.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n22 + i += n23 } return i, nil } @@ -2299,11 +2376,11 @@ func (m *ContainerStateRunning) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n23, err := m.StartedAt.MarshalTo(dAtA[i:]) + n24, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n23 + i += n24 return i, nil } @@ -2339,19 +2416,19 @@ func (m *ContainerStateTerminated) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n24, err := m.StartedAt.MarshalTo(dAtA[i:]) + n25, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n25 dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FinishedAt.Size())) - n25, err := m.FinishedAt.MarshalTo(dAtA[i:]) + n26, err := m.FinishedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n26 dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.ContainerID))) @@ -2407,19 +2484,19 @@ func (m *ContainerStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.State.Size())) - n26, err := m.State.MarshalTo(dAtA[i:]) + n27, err := m.State.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n27 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTerminationState.Size())) - n27, err := m.LastTerminationState.MarshalTo(dAtA[i:]) + n28, err := m.LastTerminationState.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n28 dAtA[i] = 0x20 i++ if m.Ready { @@ -2491,11 +2568,11 @@ func (m *DeleteOptions) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Preconditions.Size())) - n28, err := m.Preconditions.MarshalTo(dAtA[i:]) + n29, err := m.Preconditions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n29 } if m.OrphanDependents != nil { dAtA[i] = 0x18 @@ -2569,21 +2646,21 @@ func (m *DownwardAPIVolumeFile) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FieldRef.Size())) - n29, err := m.FieldRef.MarshalTo(dAtA[i:]) + n30, err := m.FieldRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n30 } if m.ResourceFieldRef != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ResourceFieldRef.Size())) - n30, err := m.ResourceFieldRef.MarshalTo(dAtA[i:]) + n31, err := m.ResourceFieldRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n31 } if m.Mode != nil { dAtA[i] = 0x20 @@ -2650,11 +2727,11 @@ func (m *EmptyDirVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SizeLimit.Size())) - n31, err := m.SizeLimit.MarshalTo(dAtA[i:]) + n32, err := m.SizeLimit.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n31 + i += n32 return i, nil } @@ -2681,11 +2758,11 @@ func (m *EndpointAddress) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetRef.Size())) - n32, err := m.TargetRef.MarshalTo(dAtA[i:]) + n33, err := m.TargetRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n32 + i += n33 } dAtA[i] = 0x1a i++ @@ -2801,11 +2878,11 @@ func (m *Endpoints) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n33, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n34, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n33 + i += n34 if len(m.Subsets) > 0 { for _, msg := range m.Subsets { dAtA[i] = 0x12 @@ -2839,11 +2916,11 @@ func (m *EndpointsList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n34, err := m.ListMeta.MarshalTo(dAtA[i:]) + n35, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n34 + i += n35 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -2882,21 +2959,21 @@ func (m *EnvFromSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMapRef.Size())) - n35, err := m.ConfigMapRef.MarshalTo(dAtA[i:]) + n36, err := m.ConfigMapRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n35 + i += n36 } if m.SecretRef != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n36, err := m.SecretRef.MarshalTo(dAtA[i:]) + n37, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n36 + i += n37 } return i, nil } @@ -2928,11 +3005,11 @@ func (m *EnvVar) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ValueFrom.Size())) - n37, err := m.ValueFrom.MarshalTo(dAtA[i:]) + n38, err := m.ValueFrom.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n37 + i += n38 } return i, nil } @@ -2956,41 +3033,41 @@ func (m *EnvVarSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FieldRef.Size())) - n38, err := m.FieldRef.MarshalTo(dAtA[i:]) + n39, err := m.FieldRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n38 + i += n39 } if m.ResourceFieldRef != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ResourceFieldRef.Size())) - n39, err := m.ResourceFieldRef.MarshalTo(dAtA[i:]) + n40, err := m.ResourceFieldRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n40 } if m.ConfigMapKeyRef != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMapKeyRef.Size())) - n40, err := m.ConfigMapKeyRef.MarshalTo(dAtA[i:]) + n41, err := m.ConfigMapKeyRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n40 + i += n41 } if m.SecretKeyRef != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretKeyRef.Size())) - n41, err := m.SecretKeyRef.MarshalTo(dAtA[i:]) + n42, err := m.SecretKeyRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n42 } return i, nil } @@ -3013,19 +3090,19 @@ func (m *Event) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n42, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n43, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n42 + i += n43 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.InvolvedObject.Size())) - n43, err := m.InvolvedObject.MarshalTo(dAtA[i:]) + n44, err := m.InvolvedObject.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n43 + i += n44 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -3037,27 +3114,27 @@ func (m *Event) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size())) - n44, err := m.Source.MarshalTo(dAtA[i:]) + n45, err := m.Source.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n44 + i += n45 dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FirstTimestamp.Size())) - n45, err := m.FirstTimestamp.MarshalTo(dAtA[i:]) + n46, err := m.FirstTimestamp.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n45 + i += n46 dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTimestamp.Size())) - n46, err := m.LastTimestamp.MarshalTo(dAtA[i:]) + n47, err := m.LastTimestamp.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n46 + i += n47 dAtA[i] = 0x40 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Count)) @@ -3086,11 +3163,11 @@ func (m *EventList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n47, err := m.ListMeta.MarshalTo(dAtA[i:]) + n48, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n47 + i += n48 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -3257,11 +3334,11 @@ func (m *FlexVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n48, err := m.SecretRef.MarshalTo(dAtA[i:]) + n49, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n48 + i += n49 } dAtA[i] = 0x20 i++ @@ -3445,11 +3522,11 @@ func (m *HTTPGetAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n49, err := m.Port.MarshalTo(dAtA[i:]) + n50, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n49 + i += n50 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -3518,31 +3595,31 @@ func (m *Handler) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Exec.Size())) - n50, err := m.Exec.MarshalTo(dAtA[i:]) + n51, err := m.Exec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n50 + i += n51 } if m.HTTPGet != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HTTPGet.Size())) - n51, err := m.HTTPGet.MarshalTo(dAtA[i:]) + n52, err := m.HTTPGet.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n51 + i += n52 } if m.TCPSocket != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TCPSocket.Size())) - n52, err := m.TCPSocket.MarshalTo(dAtA[i:]) + n53, err := m.TCPSocket.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n52 + i += n53 } return i, nil } @@ -3681,11 +3758,11 @@ func (m *ISCSIVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n53, err := m.SecretRef.MarshalTo(dAtA[i:]) + n54, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n53 + i += n54 } dAtA[i] = 0x58 i++ @@ -3754,21 +3831,21 @@ func (m *Lifecycle) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PostStart.Size())) - n54, err := m.PostStart.MarshalTo(dAtA[i:]) + n55, err := m.PostStart.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n54 + i += n55 } if m.PreStop != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PreStop.Size())) - n55, err := m.PreStop.MarshalTo(dAtA[i:]) + n56, err := m.PreStop.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n55 + i += n56 } return i, nil } @@ -3791,19 +3868,19 @@ func (m *LimitRange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n56, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n57, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n56 + i += n57 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n57, err := m.Spec.MarshalTo(dAtA[i:]) + n58, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n57 + i += n58 return i, nil } @@ -3850,11 +3927,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n58, err := (&v).MarshalTo(dAtA[i:]) + n59, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n58 + i += n59 } } if len(m.Min) > 0 { @@ -3881,11 +3958,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n59, err := (&v).MarshalTo(dAtA[i:]) + n60, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n59 + i += n60 } } if len(m.Default) > 0 { @@ -3912,11 +3989,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n60, err := (&v).MarshalTo(dAtA[i:]) + n61, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n60 + i += n61 } } if len(m.DefaultRequest) > 0 { @@ -3943,11 +4020,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n61, err := (&v).MarshalTo(dAtA[i:]) + n62, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n61 + i += n62 } } if len(m.MaxLimitRequestRatio) > 0 { @@ -3974,11 +4051,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n62, err := (&v).MarshalTo(dAtA[i:]) + n63, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n62 + i += n63 } } return i, nil @@ -4002,11 +4079,11 @@ func (m *LimitRangeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n63, err := m.ListMeta.MarshalTo(dAtA[i:]) + n64, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n63 + i += n64 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -4070,11 +4147,11 @@ func (m *List) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n64, err := m.ListMeta.MarshalTo(dAtA[i:]) + n65, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n64 + i += n65 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -4293,27 +4370,27 @@ func (m *Namespace) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n65, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n66, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n65 + i += n66 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n66, err := m.Spec.MarshalTo(dAtA[i:]) + n67, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n66 + i += n67 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n67, err := m.Status.MarshalTo(dAtA[i:]) + n68, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n67 + i += n68 return i, nil } @@ -4335,11 +4412,11 @@ func (m *NamespaceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n68, err := m.ListMeta.MarshalTo(dAtA[i:]) + n69, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n68 + i += n69 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -4428,27 +4505,27 @@ func (m *Node) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n69, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n70, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n69 + i += n70 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n70, err := m.Spec.MarshalTo(dAtA[i:]) + n71, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n70 + i += n71 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n71, err := m.Status.MarshalTo(dAtA[i:]) + n72, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n71 + i += n72 return i, nil } @@ -4497,11 +4574,11 @@ func (m *NodeAffinity) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RequiredDuringSchedulingIgnoredDuringExecution.Size())) - n72, err := m.RequiredDuringSchedulingIgnoredDuringExecution.MarshalTo(dAtA[i:]) + n73, err := m.RequiredDuringSchedulingIgnoredDuringExecution.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n72 + i += n73 } if len(m.PreferredDuringSchedulingIgnoredDuringExecution) > 0 { for _, msg := range m.PreferredDuringSchedulingIgnoredDuringExecution { @@ -4544,19 +4621,19 @@ func (m *NodeCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastHeartbeatTime.Size())) - n73, err := m.LastHeartbeatTime.MarshalTo(dAtA[i:]) + n74, err := m.LastHeartbeatTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n73 + i += n74 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n74, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n75, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n74 + i += n75 dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -4587,11 +4664,11 @@ func (m *NodeConfigSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMapRef.Size())) - n75, err := m.ConfigMapRef.MarshalTo(dAtA[i:]) + n76, err := m.ConfigMapRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n75 + i += n76 } return i, nil } @@ -4614,11 +4691,11 @@ func (m *NodeDaemonEndpoints) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.KubeletEndpoint.Size())) - n76, err := m.KubeletEndpoint.MarshalTo(dAtA[i:]) + n77, err := m.KubeletEndpoint.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n76 + i += n77 return i, nil } @@ -4640,11 +4717,11 @@ func (m *NodeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n77, err := m.ListMeta.MarshalTo(dAtA[i:]) + n78, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n77 + i += n78 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -4721,11 +4798,11 @@ func (m *NodeResources) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n78, err := (&v).MarshalTo(dAtA[i:]) + n79, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n78 + i += n79 } } return i, nil @@ -4883,11 +4960,11 @@ func (m *NodeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigSource.Size())) - n79, err := m.ConfigSource.MarshalTo(dAtA[i:]) + n80, err := m.ConfigSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n79 + i += n80 } return i, nil } @@ -4931,11 +5008,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n80, err := (&v).MarshalTo(dAtA[i:]) + n81, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n80 + i += n81 } } if len(m.Allocatable) > 0 { @@ -4962,11 +5039,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n81, err := (&v).MarshalTo(dAtA[i:]) + n82, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n81 + i += n82 } } dAtA[i] = 0x1a @@ -5000,19 +5077,19 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DaemonEndpoints.Size())) - n82, err := m.DaemonEndpoints.MarshalTo(dAtA[i:]) + n83, err := m.DaemonEndpoints.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n82 + i += n83 dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodeInfo.Size())) - n83, err := m.NodeInfo.MarshalTo(dAtA[i:]) + n84, err := m.NodeInfo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n83 + i += n84 if len(m.Images) > 0 { for _, msg := range m.Images { dAtA[i] = 0x42 @@ -5184,20 +5261,20 @@ func (m *ObjectMeta) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CreationTimestamp.Size())) - n84, err := m.CreationTimestamp.MarshalTo(dAtA[i:]) + n85, err := m.CreationTimestamp.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n84 + i += n85 if m.DeletionTimestamp != nil { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DeletionTimestamp.Size())) - n85, err := m.DeletionTimestamp.MarshalTo(dAtA[i:]) + n86, err := m.DeletionTimestamp.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n85 + i += n86 } if m.DeletionGracePeriodSeconds != nil { dAtA[i] = 0x50 @@ -5285,11 +5362,11 @@ func (m *ObjectMeta) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Initializers.Size())) - n86, err := m.Initializers.MarshalTo(dAtA[i:]) + n87, err := m.Initializers.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n86 + i += n87 } return i, nil } @@ -5358,27 +5435,27 @@ func (m *PersistentVolume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n87, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n88, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n87 + i += n88 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n88, err := m.Spec.MarshalTo(dAtA[i:]) + n89, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n88 + i += n89 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n89, err := m.Status.MarshalTo(dAtA[i:]) + n90, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n89 + i += n90 return i, nil } @@ -5400,27 +5477,27 @@ func (m *PersistentVolumeClaim) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n90, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n91, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n90 + i += n91 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n91, err := m.Spec.MarshalTo(dAtA[i:]) + n92, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n91 + i += n92 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n92, err := m.Status.MarshalTo(dAtA[i:]) + n93, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n92 + i += n93 return i, nil } @@ -5442,11 +5519,11 @@ func (m *PersistentVolumeClaimList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n93, err := m.ListMeta.MarshalTo(dAtA[i:]) + n94, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n93 + i += n94 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -5495,11 +5572,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Resources.Size())) - n94, err := m.Resources.MarshalTo(dAtA[i:]) + n95, err := m.Resources.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n94 + i += n95 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.VolumeName))) @@ -5508,11 +5585,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) - n95, err := m.Selector.MarshalTo(dAtA[i:]) + n96, err := m.Selector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n95 + i += n96 } if m.StorageClassName != nil { dAtA[i] = 0x2a @@ -5581,11 +5658,11 @@ func (m *PersistentVolumeClaimStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n96, err := (&v).MarshalTo(dAtA[i:]) + n97, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n96 + i += n97 } } return i, nil @@ -5639,11 +5716,11 @@ func (m *PersistentVolumeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n97, err := m.ListMeta.MarshalTo(dAtA[i:]) + n98, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n97 + i += n98 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -5678,151 +5755,151 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n98, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + n99, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n98 + i += n99 } if m.AWSElasticBlockStore != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n99, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + n100, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n99 + i += n100 } if m.HostPath != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n100, err := m.HostPath.MarshalTo(dAtA[i:]) + n101, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n100 + i += n101 } if m.Glusterfs != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n101, err := m.Glusterfs.MarshalTo(dAtA[i:]) + n102, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n101 + i += n102 } if m.NFS != nil { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n102, err := m.NFS.MarshalTo(dAtA[i:]) + n103, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n102 + i += n103 } if m.RBD != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n103, err := m.RBD.MarshalTo(dAtA[i:]) + n104, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n103 + i += n104 } if m.ISCSI != nil { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n104, err := m.ISCSI.MarshalTo(dAtA[i:]) + n105, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n104 + i += n105 } if m.Cinder != nil { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n105, err := m.Cinder.MarshalTo(dAtA[i:]) + n106, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n105 + i += n106 } if m.CephFS != nil { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n106, err := m.CephFS.MarshalTo(dAtA[i:]) + n107, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n106 + i += n107 } if m.FC != nil { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n107, err := m.FC.MarshalTo(dAtA[i:]) + n108, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n107 + i += n108 } if m.Flocker != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n108, err := m.Flocker.MarshalTo(dAtA[i:]) + n109, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n108 + i += n109 } if m.FlexVolume != nil { dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n109, err := m.FlexVolume.MarshalTo(dAtA[i:]) + n110, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n109 + i += n110 } if m.AzureFile != nil { dAtA[i] = 0x6a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n110, err := m.AzureFile.MarshalTo(dAtA[i:]) + n111, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n110 + i += n111 } if m.VsphereVolume != nil { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n111, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n112, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n111 + i += n112 } if m.Quobyte != nil { dAtA[i] = 0x7a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n112, err := m.Quobyte.MarshalTo(dAtA[i:]) + n113, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n112 + i += n113 } if m.AzureDisk != nil { dAtA[i] = 0x82 @@ -5830,11 +5907,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n113, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n114, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n113 + i += n114 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0x8a @@ -5842,11 +5919,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n114, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n115, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n114 + i += n115 } if m.PortworxVolume != nil { dAtA[i] = 0x92 @@ -5854,11 +5931,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n115, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n116, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n115 + i += n116 } if m.ScaleIO != nil { dAtA[i] = 0x9a @@ -5866,11 +5943,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n116, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n117, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n116 + i += n117 } if m.Local != nil { dAtA[i] = 0xa2 @@ -5878,11 +5955,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Local.Size())) - n117, err := m.Local.MarshalTo(dAtA[i:]) + n118, err := m.Local.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n117 + i += n118 } if m.StorageOS != nil { dAtA[i] = 0xaa @@ -5890,11 +5967,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n118, err := m.StorageOS.MarshalTo(dAtA[i:]) + n119, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n118 + i += n119 } return i, nil } @@ -5938,21 +6015,21 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n119, err := (&v).MarshalTo(dAtA[i:]) + n120, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n119 + i += n120 } } dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeSource.Size())) - n120, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) + n121, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n120 + i += n121 if len(m.AccessModes) > 0 { for _, s := range m.AccessModes { dAtA[i] = 0x1a @@ -5972,11 +6049,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClaimRef.Size())) - n121, err := m.ClaimRef.MarshalTo(dAtA[i:]) + n122, err := m.ClaimRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n121 + i += n122 } dAtA[i] = 0x2a i++ @@ -6063,27 +6140,27 @@ func (m *Pod) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n122, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n123, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n122 + i += n123 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n123, err := m.Spec.MarshalTo(dAtA[i:]) + n124, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n123 + i += n124 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n124, err := m.Status.MarshalTo(dAtA[i:]) + n125, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n124 + i += n125 return i, nil } @@ -6148,11 +6225,11 @@ func (m *PodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LabelSelector.Size())) - n125, err := m.LabelSelector.MarshalTo(dAtA[i:]) + n126, err := m.LabelSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n125 + i += n126 } if len(m.Namespaces) > 0 { for _, s := range m.Namespaces { @@ -6298,19 +6375,19 @@ func (m *PodCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size())) - n126, err := m.LastProbeTime.MarshalTo(dAtA[i:]) + n127, err := m.LastProbeTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n126 + i += n127 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n127, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n128, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n127 + i += n128 dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -6409,11 +6486,11 @@ func (m *PodList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n128, err := m.ListMeta.MarshalTo(dAtA[i:]) + n129, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n128 + i += n129 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -6473,11 +6550,11 @@ func (m *PodLogOptions) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SinceTime.Size())) - n129, err := m.SinceTime.MarshalTo(dAtA[i:]) + n130, err := m.SinceTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n129 + i += n130 } dAtA[i] = 0x30 i++ @@ -6566,11 +6643,11 @@ func (m *PodSecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n130, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n131, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n130 + i += n131 } if m.RunAsUser != nil { dAtA[i] = 0x10 @@ -6621,11 +6698,11 @@ func (m *PodSignature) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodController.Size())) - n131, err := m.PodController.MarshalTo(dAtA[i:]) + n132, err := m.PodController.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n131 + i += n132 } return i, nil } @@ -6749,11 +6826,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size())) - n132, err := m.SecurityContext.MarshalTo(dAtA[i:]) + n133, err := m.SecurityContext.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n132 + i += n133 } if len(m.ImagePullSecrets) > 0 { for _, msg := range m.ImagePullSecrets { @@ -6785,11 +6862,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Affinity.Size())) - n133, err := m.Affinity.MarshalTo(dAtA[i:]) + n134, err := m.Affinity.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n133 + i += n134 } dAtA[i] = 0x9a i++ @@ -6918,11 +6995,11 @@ func (m *PodStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size())) - n134, err := m.StartTime.MarshalTo(dAtA[i:]) + n135, err := m.StartTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n134 + i += n135 } if len(m.ContainerStatuses) > 0 { for _, msg := range m.ContainerStatuses { @@ -6973,19 +7050,19 @@ func (m *PodStatusResult) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n135, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n136, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n135 + i += n136 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n136, err := m.Status.MarshalTo(dAtA[i:]) + n137, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n136 + i += n137 return i, nil } @@ -7007,19 +7084,19 @@ func (m *PodTemplate) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n137, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n138, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n137 + i += n138 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n138, err := m.Template.MarshalTo(dAtA[i:]) + n139, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n138 + i += n139 return i, nil } @@ -7041,11 +7118,11 @@ func (m *PodTemplateList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n139, err := m.ListMeta.MarshalTo(dAtA[i:]) + n140, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n139 + i += n140 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7079,19 +7156,19 @@ func (m *PodTemplateSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n140, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n141, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n140 + i += n141 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n141, err := m.Spec.MarshalTo(dAtA[i:]) + n142, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n141 + i += n142 return i, nil } @@ -7171,19 +7248,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodSignature.Size())) - n142, err := m.PodSignature.MarshalTo(dAtA[i:]) + n143, err := m.PodSignature.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n142 + i += n143 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EvictionTime.Size())) - n143, err := m.EvictionTime.MarshalTo(dAtA[i:]) + n144, err := m.EvictionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n143 + i += n144 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7216,11 +7293,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Preference.Size())) - n144, err := m.Preference.MarshalTo(dAtA[i:]) + n145, err := m.Preference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n144 + i += n145 return i, nil } @@ -7242,11 +7319,11 @@ func (m *Probe) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Handler.Size())) - n145, err := m.Handler.MarshalTo(dAtA[i:]) + n146, err := m.Handler.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n145 + i += n146 dAtA[i] = 0x10 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.InitialDelaySeconds)) @@ -7396,11 +7473,11 @@ func (m *RBDVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n146, err := m.SecretRef.MarshalTo(dAtA[i:]) + n147, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n146 + i += n147 } dAtA[i] = 0x40 i++ @@ -7431,11 +7508,11 @@ func (m *RangeAllocation) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n147, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n148, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n147 + i += n148 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Range))) @@ -7467,27 +7544,27 @@ func (m *ReplicationController) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n148, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n149, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n148 + i += n149 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n149, err := m.Spec.MarshalTo(dAtA[i:]) + n150, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n149 + i += n150 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n150, err := m.Status.MarshalTo(dAtA[i:]) + n151, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n150 + i += n151 return i, nil } @@ -7517,11 +7594,11 @@ func (m *ReplicationControllerCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n151, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n152, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n151 + i += n152 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7551,11 +7628,11 @@ func (m *ReplicationControllerList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n152, err := m.ListMeta.MarshalTo(dAtA[i:]) + n153, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n152 + i += n153 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7617,11 +7694,11 @@ func (m *ReplicationControllerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n153, err := m.Template.MarshalTo(dAtA[i:]) + n154, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n153 + i += n154 } dAtA[i] = 0x20 i++ @@ -7700,11 +7777,11 @@ func (m *ResourceFieldSelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Divisor.Size())) - n154, err := m.Divisor.MarshalTo(dAtA[i:]) + n155, err := m.Divisor.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n154 + i += n155 return i, nil } @@ -7726,27 +7803,27 @@ func (m *ResourceQuota) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n155, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n156, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n155 + i += n156 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n156, err := m.Spec.MarshalTo(dAtA[i:]) + n157, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n156 + i += n157 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n157, err := m.Status.MarshalTo(dAtA[i:]) + n158, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n157 + i += n158 return i, nil } @@ -7768,11 +7845,11 @@ func (m *ResourceQuotaList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n158, err := m.ListMeta.MarshalTo(dAtA[i:]) + n159, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n158 + i += n159 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7827,11 +7904,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n159, err := (&v).MarshalTo(dAtA[i:]) + n160, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n159 + i += n160 } } if len(m.Scopes) > 0 { @@ -7891,11 +7968,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n160, err := (&v).MarshalTo(dAtA[i:]) + n161, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n160 + i += n161 } } if len(m.Used) > 0 { @@ -7922,11 +7999,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n161, err := (&v).MarshalTo(dAtA[i:]) + n162, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n161 + i += n162 } } return i, nil @@ -7971,11 +8048,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n162, err := (&v).MarshalTo(dAtA[i:]) + n163, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n162 + i += n163 } } if len(m.Requests) > 0 { @@ -8002,11 +8079,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n163, err := (&v).MarshalTo(dAtA[i:]) + n164, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n163 + i += n164 } } return i, nil @@ -8073,11 +8150,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n164, err := m.SecretRef.MarshalTo(dAtA[i:]) + n165, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n164 + i += n165 } dAtA[i] = 0x20 i++ @@ -8136,11 +8213,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n165, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n166, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n165 + i += n166 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -8216,11 +8293,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n166, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n167, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n166 + i += n167 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -8252,11 +8329,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n167, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n168, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n167 + i += n168 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -8292,11 +8369,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n168, err := m.ListMeta.MarshalTo(dAtA[i:]) + n169, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n168 + i += n169 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8330,11 +8407,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n169, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n170, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n169 + i += n170 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8360,6 +8437,32 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *SecretReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SecretReference) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i += copy(dAtA[i:], m.Namespace) + return i, nil +} + func (m *SecretVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8428,11 +8531,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size())) - n170, err := m.Capabilities.MarshalTo(dAtA[i:]) + n171, err := m.Capabilities.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n170 + i += n171 } if m.Privileged != nil { dAtA[i] = 0x10 @@ -8448,11 +8551,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n171, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n172, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n171 + i += n172 } if m.RunAsUser != nil { dAtA[i] = 0x20 @@ -8510,11 +8613,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size())) - n172, err := m.Reference.MarshalTo(dAtA[i:]) + n173, err := m.Reference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n172 + i += n173 return i, nil } @@ -8536,27 +8639,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n173, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n174, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n173 + i += n174 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n174, err := m.Spec.MarshalTo(dAtA[i:]) + n175, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n174 + i += n175 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n175, err := m.Status.MarshalTo(dAtA[i:]) + n176, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n175 + i += n176 return i, nil } @@ -8578,11 +8681,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n176, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n177, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n176 + i += n177 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { dAtA[i] = 0x12 @@ -8638,11 +8741,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n177, err := m.ListMeta.MarshalTo(dAtA[i:]) + n178, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n177 + i += n178 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8676,11 +8779,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n178, err := m.ListMeta.MarshalTo(dAtA[i:]) + n179, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n178 + i += n179 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8725,11 +8828,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size())) - n179, err := m.TargetPort.MarshalTo(dAtA[i:]) + n180, err := m.TargetPort.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n179 + i += n180 dAtA[i] = 0x28 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort)) @@ -8893,11 +8996,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size())) - n180, err := m.LoadBalancer.MarshalTo(dAtA[i:]) + n181, err := m.LoadBalancer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n180 + i += n181 return i, nil } @@ -8940,11 +9043,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n181, err := m.SecretRef.MarshalTo(dAtA[i:]) + n182, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n181 + i += n182 } return i, nil } @@ -8988,11 +9091,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n182, err := m.SecretRef.MarshalTo(dAtA[i:]) + n183, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n182 + i += n183 } return i, nil } @@ -9041,11 +9144,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n183, err := m.Port.MarshalTo(dAtA[i:]) + n184, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n183 + i += n184 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -9083,11 +9186,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size())) - n184, err := m.TimeAdded.MarshalTo(dAtA[i:]) + n185, err := m.TimeAdded.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n184 + i += n185 return i, nil } @@ -9152,11 +9255,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size())) - n185, err := m.VolumeSource.MarshalTo(dAtA[i:]) + n186, err := m.VolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n185 + i += n186 return i, nil } @@ -9217,31 +9320,31 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n186, err := m.Secret.MarshalTo(dAtA[i:]) + n187, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n186 + i += n187 } if m.DownwardAPI != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n187, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n188, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n187 + i += n188 } if m.ConfigMap != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n188, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n189, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n188 + i += n189 } return i, nil } @@ -9265,151 +9368,151 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n189, err := m.HostPath.MarshalTo(dAtA[i:]) + n190, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n189 + i += n190 } if m.EmptyDir != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) - n190, err := m.EmptyDir.MarshalTo(dAtA[i:]) + n191, err := m.EmptyDir.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n190 + i += n191 } if m.GCEPersistentDisk != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n191, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + n192, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n191 + i += n192 } if m.AWSElasticBlockStore != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n192, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + n193, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n192 + i += n193 } if m.GitRepo != nil { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) - n193, err := m.GitRepo.MarshalTo(dAtA[i:]) + n194, err := m.GitRepo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n193 + i += n194 } if m.Secret != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n194, err := m.Secret.MarshalTo(dAtA[i:]) + n195, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n194 + i += n195 } if m.NFS != nil { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n195, err := m.NFS.MarshalTo(dAtA[i:]) + n196, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n195 + i += n196 } if m.ISCSI != nil { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n196, err := m.ISCSI.MarshalTo(dAtA[i:]) + n197, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n196 + i += n197 } if m.Glusterfs != nil { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n197, err := m.Glusterfs.MarshalTo(dAtA[i:]) + n198, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n197 + i += n198 } if m.PersistentVolumeClaim != nil { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) - n198, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) + n199, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n198 + i += n199 } if m.RBD != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n199, err := m.RBD.MarshalTo(dAtA[i:]) + n200, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n199 + i += n200 } if m.FlexVolume != nil { dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n200, err := m.FlexVolume.MarshalTo(dAtA[i:]) + n201, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n200 + i += n201 } if m.Cinder != nil { dAtA[i] = 0x6a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n201, err := m.Cinder.MarshalTo(dAtA[i:]) + n202, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n201 + i += n202 } if m.CephFS != nil { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n202, err := m.CephFS.MarshalTo(dAtA[i:]) + n203, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n202 + i += n203 } if m.Flocker != nil { dAtA[i] = 0x7a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n203, err := m.Flocker.MarshalTo(dAtA[i:]) + n204, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n203 + i += n204 } if m.DownwardAPI != nil { dAtA[i] = 0x82 @@ -9417,11 +9520,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n204, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n205, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n204 + i += n205 } if m.FC != nil { dAtA[i] = 0x8a @@ -9429,11 +9532,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n205, err := m.FC.MarshalTo(dAtA[i:]) + n206, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n205 + i += n206 } if m.AzureFile != nil { dAtA[i] = 0x92 @@ -9441,11 +9544,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n206, err := m.AzureFile.MarshalTo(dAtA[i:]) + n207, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n206 + i += n207 } if m.ConfigMap != nil { dAtA[i] = 0x9a @@ -9453,11 +9556,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n207, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n208, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n207 + i += n208 } if m.VsphereVolume != nil { dAtA[i] = 0xa2 @@ -9465,11 +9568,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n208, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n209, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n208 + i += n209 } if m.Quobyte != nil { dAtA[i] = 0xaa @@ -9477,11 +9580,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n209, err := m.Quobyte.MarshalTo(dAtA[i:]) + n210, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n209 + i += n210 } if m.AzureDisk != nil { dAtA[i] = 0xb2 @@ -9489,11 +9592,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n210, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n211, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n210 + i += n211 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0xba @@ -9501,11 +9604,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n211, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n212, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n211 + i += n212 } if m.PortworxVolume != nil { dAtA[i] = 0xc2 @@ -9513,11 +9616,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n212, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n213, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n212 + i += n213 } if m.ScaleIO != nil { dAtA[i] = 0xca @@ -9525,11 +9628,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n213, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n214, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n213 + i += n214 } if m.Projected != nil { dAtA[i] = 0xd2 @@ -9537,11 +9640,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size())) - n214, err := m.Projected.MarshalTo(dAtA[i:]) + n215, err := m.Projected.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n214 + i += n215 } if m.StorageOS != nil { dAtA[i] = 0xda @@ -9549,11 +9652,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n215, err := m.StorageOS.MarshalTo(dAtA[i:]) + n216, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n215 + i += n216 } return i, nil } @@ -9613,11 +9716,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size())) - n216, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) + n217, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n216 + i += n217 return i, nil } @@ -9779,6 +9882,29 @@ func (m *Capabilities) Size() (n int) { return n } +func (m *CephFSPersistentVolumeSource) Size() (n int) { + var l int + _ = l + if len(m.Monitors) > 0 { + for _, s := range m.Monitors { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.Path) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.User) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.SecretFile) + n += 1 + l + sovGenerated(uint64(l)) + if m.SecretRef != nil { + l = m.SecretRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + n += 2 + return n +} + func (m *CephFSVolumeSource) Size() (n int) { var l int _ = l @@ -12261,6 +12387,16 @@ func (m *SecretProjection) Size() (n int) { return n } +func (m *SecretReference) Size() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *SecretVolumeSource) Size() (n int) { var l int _ = l @@ -12841,6 +12977,21 @@ func (this *Capabilities) String() string { }, "") return s } +func (this *CephFSPersistentVolumeSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CephFSPersistentVolumeSource{`, + `Monitors:` + fmt.Sprintf("%v", this.Monitors) + `,`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `User:` + fmt.Sprintf("%v", this.User) + `,`, + `SecretFile:` + fmt.Sprintf("%v", this.SecretFile) + `,`, + `SecretRef:` + strings.Replace(fmt.Sprintf("%v", this.SecretRef), "SecretReference", "SecretReference", 1) + `,`, + `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, + `}`, + }, "") + return s +} func (this *CephFSVolumeSource) String() string { if this == nil { return "nil" @@ -14117,7 +14268,7 @@ func (this *PersistentVolumeSource) String() string { `RBD:` + strings.Replace(fmt.Sprintf("%v", this.RBD), "RBDVolumeSource", "RBDVolumeSource", 1) + `,`, `ISCSI:` + strings.Replace(fmt.Sprintf("%v", this.ISCSI), "ISCSIVolumeSource", "ISCSIVolumeSource", 1) + `,`, `Cinder:` + strings.Replace(fmt.Sprintf("%v", this.Cinder), "CinderVolumeSource", "CinderVolumeSource", 1) + `,`, - `CephFS:` + strings.Replace(fmt.Sprintf("%v", this.CephFS), "CephFSVolumeSource", "CephFSVolumeSource", 1) + `,`, + `CephFS:` + strings.Replace(fmt.Sprintf("%v", this.CephFS), "CephFSPersistentVolumeSource", "CephFSPersistentVolumeSource", 1) + `,`, `FC:` + strings.Replace(fmt.Sprintf("%v", this.FC), "FCVolumeSource", "FCVolumeSource", 1) + `,`, `Flocker:` + strings.Replace(fmt.Sprintf("%v", this.Flocker), "FlockerVolumeSource", "FlockerVolumeSource", 1) + `,`, `FlexVolume:` + strings.Replace(fmt.Sprintf("%v", this.FlexVolume), "FlexVolumeSource", "FlexVolumeSource", 1) + `,`, @@ -14870,6 +15021,17 @@ func (this *SecretProjection) String() string { }, "") return s } +func (this *SecretReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SecretReference{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `}`, + }, "") + return s +} func (this *SecretVolumeSource) String() string { if this == nil { return "nil" @@ -16410,7 +16572,7 @@ func (m *Capabilities) Unmarshal(dAtA []byte) error { } return nil } -func (m *CephFSVolumeSource) Unmarshal(dAtA []byte) error { +func (m *CephFSPersistentVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16433,10 +16595,10 @@ func (m *CephFSVolumeSource) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CephFSVolumeSource: wiretype end group for non-group") + return fmt.Errorf("proto: CephFSPersistentVolumeSource: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CephFSVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CephFSPersistentVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -16582,7 +16744,7 @@ func (m *CephFSVolumeSource) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.SecretRef == nil { - m.SecretRef = &LocalObjectReference{} + m.SecretRef = &SecretReference{} } if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -16629,7 +16791,7 @@ func (m *CephFSVolumeSource) Unmarshal(dAtA []byte) error { } return nil } -func (m *CinderVolumeSource) Unmarshal(dAtA []byte) error { +func (m *CephFSVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -16652,15 +16814,234 @@ func (m *CinderVolumeSource) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CinderVolumeSource: wiretype end group for non-group") + return fmt.Errorf("proto: CephFSVolumeSource: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CinderVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CephFSVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VolumeID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Monitors", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Monitors = append(m.Monitors, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.User = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretFile", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SecretFile = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SecretRef == nil { + m.SecretRef = &LocalObjectReference{} + } + if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadOnly = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CinderVolumeSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CinderVolumeSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CinderVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -31422,7 +31803,7 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.CephFS == nil { - m.CephFS = &CephFSVolumeSource{} + m.CephFS = &CephFSPersistentVolumeSource{} } if err := m.CephFS.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -40034,22 +40415,181 @@ func (m *Secret) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } + var keykey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + keykey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey := string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + if m.StringData == nil { + m.StringData = make(map[string]string) + } + if iNdEx < postIndex { + var valuekey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + valuekey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue := string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + m.StringData[mapkey] = mapvalue + } else { + var mapvalue string + m.StringData[mapkey] = mapvalue + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SecretEnvSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SecretEnvSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SecretEnvSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LocalObjectReference", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LocalObjectReference.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - var stringLenmapkey uint64 + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) + } + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -40059,71 +40599,13 @@ func (m *Secret) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift + v |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - if m.StringData == nil { - m.StringData = make(map[string]string) - } - if iNdEx < postIndex { - var valuekey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue := string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - m.StringData[mapkey] = mapvalue - } else { - var mapvalue string - m.StringData[mapkey] = mapvalue - } - iNdEx = postIndex + b := bool(v != 0) + m.Optional = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -40145,7 +40627,7 @@ func (m *Secret) Unmarshal(dAtA []byte) error { } return nil } -func (m *SecretEnvSource) Unmarshal(dAtA []byte) error { +func (m *SecretKeySelector) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -40168,10 +40650,10 @@ func (m *SecretEnvSource) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SecretEnvSource: wiretype end group for non-group") + return fmt.Errorf("proto: SecretKeySelector: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SecretEnvSource: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SecretKeySelector: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -40205,6 +40687,35 @@ func (m *SecretEnvSource) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) } @@ -40246,7 +40757,7 @@ func (m *SecretEnvSource) Unmarshal(dAtA []byte) error { } return nil } -func (m *SecretKeySelector) Unmarshal(dAtA []byte) error { +func (m *SecretList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -40269,15 +40780,15 @@ func (m *SecretKeySelector) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SecretKeySelector: wiretype end group for non-group") + return fmt.Errorf("proto: SecretList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SecretKeySelector: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SecretList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LocalObjectReference", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -40301,15 +40812,15 @@ func (m *SecretKeySelector) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.LocalObjectReference.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -40319,42 +40830,23 @@ func (m *SecretKeySelector) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.Key = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } + m.Items = append(m.Items, Secret{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - b := bool(v != 0) - m.Optional = &b + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -40376,7 +40868,7 @@ func (m *SecretKeySelector) Unmarshal(dAtA []byte) error { } return nil } -func (m *SecretList) Unmarshal(dAtA []byte) error { +func (m *SecretProjection) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -40399,15 +40891,15 @@ func (m *SecretList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SecretList: wiretype end group for non-group") + return fmt.Errorf("proto: SecretProjection: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SecretList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SecretProjection: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field LocalObjectReference", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -40431,7 +40923,7 @@ func (m *SecretList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.LocalObjectReference.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -40461,11 +40953,32 @@ func (m *SecretList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, Secret{}) + m.Items = append(m.Items, KeyToPath{}) if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Optional = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -40487,7 +41000,7 @@ func (m *SecretList) Unmarshal(dAtA []byte) error { } return nil } -func (m *SecretProjection) Unmarshal(dAtA []byte) error { +func (m *SecretReference) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -40510,17 +41023,17 @@ func (m *SecretProjection) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SecretProjection: wiretype end group for non-group") + return fmt.Errorf("proto: SecretReference: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SecretProjection: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SecretReference: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LocalObjectReference", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -40530,27 +41043,26 @@ func (m *SecretProjection) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.LocalObjectReference.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -40560,44 +41072,21 @@ func (m *SecretProjection) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, KeyToPath{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Namespace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Optional = &b default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -45079,16 +45568,16 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11611 bytes of a gzipped FileDescriptorProto + // 11649 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x90, 0x24, 0xc7, 0x75, 0x18, 0xcc, 0xea, 0x9e, 0xab, 0xdf, 0xdc, 0xb9, 0x07, 0x7a, 0x07, 0xc0, 0xf6, 0xa2, 0x40, - 0x02, 0x8b, 0x6b, 0x46, 0x58, 0x00, 0x04, 0x44, 0x80, 0x90, 0x66, 0xa6, 0x67, 0x76, 0x07, 0x7b, + 0x02, 0x8b, 0x6b, 0x86, 0x58, 0x00, 0x04, 0x44, 0x80, 0x90, 0x66, 0xa6, 0x67, 0x76, 0x07, 0x7b, 0x35, 0xb2, 0x67, 0x17, 0x02, 0x08, 0x41, 0xac, 0xed, 0xca, 0x99, 0x29, 0x4c, 0x4d, 0x55, 0xa3, - 0xaa, 0x7a, 0x76, 0x07, 0x21, 0x46, 0x7c, 0x1f, 0x4d, 0xd1, 0x07, 0xf5, 0x43, 0xe1, 0x50, 0xd8, - 0xb2, 0xc8, 0x90, 0x23, 0x7c, 0x84, 0x44, 0xcb, 0x76, 0x48, 0xa6, 0xac, 0x83, 0x94, 0xc3, 0xb6, - 0x7c, 0x04, 0xf9, 0x47, 0x96, 0xf4, 0x87, 0x8c, 0x70, 0x78, 0x28, 0x0e, 0x1d, 0x76, 0xf8, 0x87, + 0xaa, 0x7a, 0x76, 0x07, 0x21, 0x45, 0x7c, 0x1f, 0x4d, 0xd1, 0x07, 0xf5, 0x43, 0xe1, 0x50, 0xd8, + 0xb2, 0xc8, 0x90, 0x23, 0x7c, 0x84, 0x44, 0xcb, 0x76, 0x48, 0xa6, 0xac, 0x83, 0x94, 0xc3, 0xb2, + 0x7c, 0x04, 0xf9, 0x47, 0x96, 0xf4, 0x87, 0x8c, 0x70, 0x78, 0x24, 0x0e, 0x1d, 0x76, 0xe8, 0x87, 0x1d, 0xb6, 0xf5, 0x4b, 0x63, 0xd9, 0x74, 0xe4, 0x59, 0x99, 0xd5, 0x55, 0xdd, 0x3d, 0x8b, 0xdd, - 0x01, 0xc8, 0xf0, 0xbf, 0xee, 0xf7, 0x5e, 0xbe, 0xcc, 0xca, 0xe3, 0xe5, 0x7b, 0x2f, 0x5f, 0xbe, + 0x01, 0xc8, 0xf0, 0xbf, 0xee, 0xf7, 0x5e, 0xbe, 0xcc, 0xca, 0xe3, 0xe5, 0xcb, 0x97, 0xef, 0xbd, 0x84, 0x97, 0xb7, 0x5f, 0x8a, 0xe7, 0xbd, 0x70, 0x61, 0xbb, 0x73, 0x8b, 0x44, 0x01, 0x49, 0x48, 0xbc, 0xb0, 0x4b, 0x02, 0x37, 0x8c, 0x16, 0x04, 0xc2, 0x69, 0x7b, 0x0b, 0xad, 0x30, 0x22, 0x0b, 0xbb, 0xcf, 0x2e, 0x6c, 0x92, 0x80, 0x44, 0x4e, 0x42, 0xdc, 0xf9, 0x76, 0x14, 0x26, 0x21, 0x42, @@ -45097,7 +45586,7 @@ var fileDescriptorGenerated = []byte{ 0x60, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0xb3, 0x98, 0x7b, 0x3e, 0xad, 0x66, 0xc7, 0x69, 0x6d, 0x79, 0x01, 0x89, 0xf6, 0x16, 0xda, 0xdb, 0x9b, 0xac, 0xde, 0x88, 0xc4, 0x61, 0x27, 0x6a, 0x91, 0x6c, 0xc5, 0x3d, 0x4b, 0xc5, 0x0b, 0x3b, 0x24, 0x71, 0x72, 0x9a, 0x3b, 0xb7, 0x50, 0x54, 0x2a, 0xea, - 0x04, 0x89, 0xb7, 0xd3, 0x5d, 0xcd, 0x27, 0xfb, 0x15, 0x88, 0x5b, 0x5b, 0x64, 0xc7, 0xe9, 0x2a, + 0x04, 0x89, 0xb7, 0xd3, 0x5d, 0xcd, 0xa7, 0xfa, 0x15, 0x88, 0x5b, 0x5b, 0x64, 0xc7, 0xe9, 0x2a, 0xf7, 0x5c, 0x51, 0xb9, 0x4e, 0xe2, 0xf9, 0x0b, 0x5e, 0x90, 0xc4, 0x49, 0x94, 0x2d, 0x64, 0x7f, 0xdb, 0x82, 0x73, 0x8b, 0x6f, 0x34, 0x57, 0x7c, 0x27, 0x4e, 0xbc, 0xd6, 0x92, 0x1f, 0xb6, 0xb6, 0x9b, 0x49, 0x18, 0x91, 0x9b, 0xa1, 0xdf, 0xd9, 0x21, 0x4d, 0xd6, 0x11, 0xe8, 0x69, 0x18, 0xdb, @@ -45106,7 +45595,7 @@ var fileDescriptorGenerated = []byte{ 0x6d, 0x52, 0x2d, 0x31, 0xda, 0x29, 0x41, 0x3b, 0xb2, 0xda, 0xa4, 0x50, 0x2c, 0xb0, 0x68, 0x01, 0x2a, 0x6d, 0x27, 0x4a, 0xbc, 0xc4, 0x0b, 0x83, 0x6a, 0xf9, 0x9c, 0x75, 0x7e, 0x78, 0x69, 0x56, 0x90, 0x56, 0x1a, 0x12, 0x81, 0x53, 0x1a, 0xda, 0x8c, 0x88, 0x38, 0xee, 0xf5, 0xc0, 0xdf, 0xab, - 0x0e, 0x9d, 0xb3, 0xce, 0x8f, 0xa5, 0xcd, 0xc0, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0xcb, 0x25, 0x18, + 0x0e, 0x9d, 0xb3, 0xce, 0x8f, 0xa5, 0xcd, 0xc0, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0x8b, 0x25, 0x18, 0x5b, 0xdc, 0xd8, 0xf0, 0x02, 0x2f, 0xd9, 0x43, 0x37, 0x61, 0x22, 0x08, 0x5d, 0x22, 0xff, 0xb3, 0xaf, 0x18, 0xbf, 0x70, 0x6e, 0xbe, 0x7b, 0x2a, 0xcd, 0x5f, 0xd3, 0xe8, 0x96, 0x66, 0x0e, 0xf6, 0x6b, 0x13, 0x3a, 0x04, 0x1b, 0x7c, 0x10, 0x86, 0xf1, 0x76, 0xe8, 0x2a, 0xb6, 0x25, 0xc6, 0xb6, @@ -45119,7 +45608,7 @@ var fileDescriptorGenerated = []byte{ 0x89, 0xf1, 0x46, 0xa2, 0x2c, 0xd4, 0x15, 0x06, 0x6b, 0x54, 0xf6, 0x1d, 0xa8, 0x2c, 0xee, 0x86, 0x9e, 0xdb, 0x08, 0xdd, 0x18, 0x6d, 0xc3, 0x74, 0x3b, 0x22, 0x1b, 0x24, 0x52, 0xa0, 0xaa, 0x75, 0xae, 0x7c, 0x7e, 0xfc, 0xc2, 0xf9, 0xdc, 0x8f, 0x35, 0x49, 0x57, 0x82, 0x24, 0xda, 0x5b, 0x7a, - 0x40, 0xd4, 0x37, 0x9d, 0xc1, 0xe2, 0x2c, 0x67, 0xfb, 0x5f, 0x97, 0xe0, 0xd4, 0xe2, 0xfb, 0x9d, + 0x40, 0xd4, 0x37, 0x9d, 0xc1, 0xe2, 0x2c, 0x67, 0xfb, 0xdf, 0x94, 0xe0, 0xd4, 0xe2, 0xfb, 0x9d, 0x88, 0xd4, 0xbd, 0x78, 0x3b, 0x3b, 0xc3, 0x5d, 0x2f, 0xde, 0xbe, 0x96, 0xf6, 0x80, 0x9a, 0x5a, 0x75, 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x03, 0xa3, 0xf4, 0xf7, 0x0d, 0xbc, 0x26, 0x3e, 0xf9, 0x84, 0x20, 0x1e, 0xaf, 0x3b, 0x89, 0x53, 0xe7, 0x28, 0x2c, 0x69, 0xd0, 0x55, 0x18, 0x6f, 0xb1, 0x05, @@ -45127,683 +45616,686 @@ var fileDescriptorGenerated = []byte{ 0xd7, 0xaa, 0xbc, 0x6d, 0x82, 0x85, 0x86, 0xc3, 0x7a, 0x79, 0x64, 0xab, 0xf5, 0x35, 0xc4, 0x38, 0x41, 0xce, 0xda, 0x3a, 0xaf, 0x2d, 0x95, 0x61, 0xb6, 0x54, 0x26, 0xf2, 0x97, 0x09, 0x7a, 0x16, 0x86, 0xb6, 0xbd, 0xc0, 0xad, 0x8e, 0x30, 0x5e, 0x0f, 0xd3, 0x31, 0xbf, 0xec, 0x05, 0xee, 0xe1, - 0x7e, 0x6d, 0xd6, 0x68, 0x0e, 0x05, 0x62, 0x46, 0x6a, 0xff, 0x99, 0x05, 0x35, 0x86, 0x5b, 0xf5, + 0x7e, 0x6d, 0xd6, 0x68, 0x0e, 0x05, 0x62, 0x46, 0x6a, 0xff, 0xb9, 0x05, 0x35, 0x86, 0x5b, 0xf5, 0x7c, 0xd2, 0x20, 0x51, 0xec, 0xc5, 0x09, 0x09, 0x12, 0xa3, 0x43, 0x2f, 0x00, 0xc4, 0xa4, 0x15, 0x91, 0x44, 0xeb, 0x52, 0x35, 0x31, 0x9a, 0x0a, 0x83, 0x35, 0x2a, 0x2a, 0x10, 0xe2, 0x2d, 0x27, 0x62, 0xf3, 0x4b, 0x74, 0xac, 0x12, 0x08, 0x4d, 0x89, 0xc0, 0x29, 0x8d, 0x21, 0x10, 0xca, 0xfd, - 0x04, 0x02, 0xfa, 0x34, 0x4c, 0xa7, 0x95, 0xc5, 0x6d, 0xa7, 0x25, 0x3b, 0x90, 0x2d, 0x99, 0xa6, - 0x89, 0xc2, 0x59, 0x5a, 0xfb, 0x1f, 0x58, 0x62, 0xf2, 0xd0, 0xaf, 0xfe, 0x88, 0x7f, 0xab, 0xfd, - 0xbb, 0x16, 0x8c, 0x2e, 0x79, 0x81, 0xeb, 0x05, 0x9b, 0xe8, 0xb3, 0x30, 0x46, 0xf7, 0x26, 0xd7, - 0x49, 0x1c, 0x21, 0xf7, 0x7e, 0x4c, 0x5b, 0x5b, 0x6a, 0xab, 0x98, 0x6f, 0x6f, 0x6f, 0x52, 0x40, - 0x3c, 0x4f, 0xa9, 0xe9, 0x6a, 0xbb, 0x7e, 0xeb, 0x5d, 0xd2, 0x4a, 0xae, 0x92, 0xc4, 0x49, 0x3f, - 0x27, 0x85, 0x61, 0xc5, 0x15, 0x5d, 0x86, 0x91, 0xc4, 0x89, 0x36, 0x49, 0x22, 0x04, 0x60, 0xae, - 0xa0, 0xe2, 0x25, 0x31, 0x5d, 0x91, 0x24, 0x68, 0x91, 0x74, 0x5b, 0x58, 0x67, 0x45, 0xb1, 0x60, - 0x61, 0xb7, 0x60, 0x62, 0xd9, 0x69, 0x3b, 0xb7, 0x3c, 0xdf, 0x4b, 0x3c, 0x12, 0xa3, 0xc7, 0xa1, - 0xec, 0xb8, 0x2e, 0x93, 0x0a, 0x95, 0xa5, 0x53, 0x07, 0xfb, 0xb5, 0xf2, 0xa2, 0x4b, 0xa7, 0x27, - 0x28, 0xaa, 0x3d, 0x4c, 0x29, 0xd0, 0x93, 0x30, 0xe4, 0x46, 0x61, 0xbb, 0x5a, 0x62, 0x94, 0xa7, - 0xe9, 0x4c, 0xae, 0x47, 0x61, 0x3b, 0x43, 0xca, 0x68, 0xec, 0x6f, 0x94, 0x00, 0x2d, 0x93, 0xf6, - 0xd6, 0x6a, 0xd3, 0x18, 0xc9, 0xf3, 0x30, 0xb6, 0x13, 0x06, 0x5e, 0x12, 0x46, 0xb1, 0xa8, 0x90, - 0x2d, 0x9b, 0xab, 0x02, 0x86, 0x15, 0x16, 0x9d, 0x83, 0xa1, 0x76, 0x2a, 0xf2, 0x26, 0xa4, 0xb8, - 0x64, 0xc2, 0x8e, 0x61, 0x28, 0x45, 0x27, 0x26, 0x91, 0x58, 0xee, 0x8a, 0xe2, 0x46, 0x4c, 0x22, - 0xcc, 0x30, 0xe9, 0xbc, 0xa1, 0x33, 0x4a, 0xcc, 0xc5, 0xcc, 0xbc, 0xa1, 0x18, 0xac, 0x51, 0xa1, - 0x1b, 0x50, 0xe1, 0xff, 0x30, 0xd9, 0x60, 0x2b, 0xbb, 0x40, 0x52, 0x5e, 0x09, 0x5b, 0x8e, 0x9f, - 0xed, 0xf2, 0x49, 0x36, 0xbb, 0x64, 0x71, 0x9c, 0x72, 0x32, 0x66, 0xd7, 0x48, 0xdf, 0xd9, 0xf5, - 0x4b, 0x16, 0xa0, 0x65, 0x2f, 0x70, 0x49, 0x74, 0x0c, 0x6a, 0xc2, 0xd1, 0x26, 0xfe, 0xbf, 0xa7, - 0x4d, 0x0b, 0x77, 0xda, 0x61, 0x40, 0x82, 0x64, 0x39, 0x0c, 0x5c, 0xae, 0x3a, 0x7c, 0x0a, 0x86, - 0x12, 0x5a, 0x15, 0x6f, 0xd6, 0x63, 0x72, 0x30, 0x68, 0x05, 0x87, 0xfb, 0xb5, 0xd3, 0xdd, 0x25, - 0x58, 0x13, 0x58, 0x19, 0xf4, 0xe3, 0x30, 0x12, 0x27, 0x4e, 0xd2, 0x89, 0x45, 0x43, 0x1f, 0x91, - 0x0d, 0x6d, 0x32, 0xe8, 0xe1, 0x7e, 0x6d, 0x5a, 0x15, 0xe3, 0x20, 0x2c, 0x0a, 0xa0, 0x27, 0x60, - 0x74, 0x87, 0xc4, 0xb1, 0xb3, 0x29, 0xa5, 0xfe, 0xb4, 0x28, 0x3b, 0x7a, 0x95, 0x83, 0xb1, 0xc4, - 0xa3, 0x47, 0x61, 0x98, 0x44, 0x51, 0x18, 0x89, 0x79, 0x30, 0x29, 0x08, 0x87, 0x57, 0x28, 0x10, - 0x73, 0x9c, 0xfd, 0xef, 0x2c, 0x98, 0x56, 0x6d, 0xe5, 0x75, 0x1d, 0xc3, 0xf2, 0x7e, 0x0b, 0xa0, - 0x25, 0x3f, 0x30, 0x66, 0xcb, 0x6b, 0xfc, 0xc2, 0x63, 0x79, 0x93, 0xae, 0xbb, 0x1b, 0x53, 0xce, - 0x0a, 0x14, 0x63, 0x8d, 0x9b, 0xfd, 0xcf, 0x2c, 0x38, 0x91, 0xf9, 0xa2, 0x2b, 0x5e, 0x9c, 0xa0, - 0xb7, 0xbb, 0xbe, 0x6a, 0x7e, 0xb0, 0xaf, 0xa2, 0xa5, 0xd9, 0x37, 0xa9, 0x59, 0x22, 0x21, 0xda, - 0x17, 0x5d, 0x82, 0x61, 0x2f, 0x21, 0x3b, 0xf2, 0x63, 0x1e, 0xed, 0xf9, 0x31, 0xbc, 0x55, 0xe9, - 0x88, 0xac, 0xd1, 0x92, 0x98, 0x33, 0xb0, 0xff, 0x87, 0x05, 0x95, 0xe5, 0x30, 0xd8, 0xf0, 0x36, - 0xaf, 0x3a, 0xed, 0x63, 0x18, 0x8b, 0x35, 0x18, 0x62, 0xdc, 0x79, 0xc3, 0x1f, 0xcf, 0x6f, 0xb8, - 0x68, 0xce, 0x3c, 0xdd, 0xbb, 0xb9, 0x8e, 0xa4, 0xc4, 0x0f, 0x05, 0x61, 0xc6, 0x62, 0xee, 0x45, - 0xa8, 0x28, 0x02, 0x34, 0x03, 0xe5, 0x6d, 0xc2, 0xf5, 0xe2, 0x0a, 0xa6, 0x3f, 0xd1, 0x49, 0x18, - 0xde, 0x75, 0xfc, 0x8e, 0x58, 0x9e, 0x98, 0xff, 0xf9, 0x54, 0xe9, 0x25, 0xcb, 0xfe, 0x3a, 0x5b, - 0x63, 0xa2, 0x92, 0x95, 0x60, 0x57, 0x2c, 0xff, 0xf7, 0xe1, 0xa4, 0x9f, 0x23, 0x75, 0x44, 0x47, - 0x0c, 0x2e, 0xa5, 0x1e, 0x12, 0x6d, 0x3d, 0x99, 0x87, 0xc5, 0xb9, 0x75, 0x50, 0xc1, 0x1d, 0xb6, - 0xe9, 0x8c, 0x72, 0x7c, 0xd6, 0x5e, 0xa1, 0xef, 0x5c, 0x17, 0x30, 0xac, 0xb0, 0x54, 0x40, 0x9c, - 0x54, 0x8d, 0xbf, 0x4c, 0xf6, 0x9a, 0xc4, 0x27, 0xad, 0x24, 0x8c, 0x3e, 0xd4, 0xe6, 0x3f, 0xcc, - 0x7b, 0x9f, 0xcb, 0x97, 0x71, 0xc1, 0xa0, 0x7c, 0x99, 0xec, 0xf1, 0xa1, 0xd0, 0xbf, 0xae, 0xdc, - 0xf3, 0xeb, 0x7e, 0xd3, 0x82, 0x49, 0xf5, 0x75, 0xc7, 0xb0, 0x90, 0x96, 0xcc, 0x85, 0xf4, 0x70, - 0xcf, 0xf9, 0x58, 0xb0, 0x84, 0x7e, 0xc0, 0x44, 0x80, 0xa0, 0x69, 0x44, 0x21, 0xed, 0x1a, 0x2a, - 0xb3, 0x3f, 0xcc, 0x01, 0x19, 0xe4, 0xbb, 0x2e, 0x93, 0xbd, 0xf5, 0x90, 0x6e, 0xf8, 0xf9, 0xdf, - 0x65, 0x8c, 0xda, 0x50, 0xcf, 0x51, 0xfb, 0xad, 0x12, 0x9c, 0x52, 0x3d, 0x60, 0x6c, 0xa9, 0x3f, - 0xec, 0x7d, 0xf0, 0x2c, 0x8c, 0xbb, 0x64, 0xc3, 0xe9, 0xf8, 0x89, 0x32, 0x7d, 0x86, 0xb9, 0xf9, - 0x5b, 0x4f, 0xc1, 0x58, 0xa7, 0x39, 0x42, 0xb7, 0xfd, 0x1b, 0x60, 0xb2, 0x37, 0x71, 0xe8, 0x0c, - 0xa6, 0xfa, 0x96, 0x66, 0xc0, 0x4e, 0xe8, 0x06, 0xac, 0x30, 0x56, 0x1f, 0x85, 0x61, 0x6f, 0x87, - 0xee, 0xc5, 0x25, 0x73, 0x8b, 0x5d, 0xa3, 0x40, 0xcc, 0x71, 0xe8, 0x13, 0x30, 0xda, 0x0a, 0x77, - 0x76, 0x9c, 0xc0, 0xad, 0x96, 0x99, 0x06, 0x38, 0x4e, 0xb7, 0xeb, 0x65, 0x0e, 0xc2, 0x12, 0x87, - 0x1e, 0x82, 0x21, 0x27, 0xda, 0x8c, 0xab, 0x43, 0x8c, 0x66, 0x8c, 0xd6, 0xb4, 0x18, 0x6d, 0xc6, - 0x98, 0x41, 0xa9, 0x66, 0x77, 0x3b, 0x8c, 0xb6, 0xbd, 0x60, 0xb3, 0xee, 0x45, 0x4c, 0x4d, 0xd3, - 0x34, 0xbb, 0x37, 0x14, 0x06, 0x6b, 0x54, 0x68, 0x15, 0x86, 0xdb, 0x61, 0x94, 0xc4, 0xd5, 0x11, - 0xd6, 0xdd, 0x8f, 0x14, 0x2c, 0x25, 0xfe, 0xb5, 0x8d, 0x30, 0x4a, 0xd2, 0x0f, 0xa0, 0xff, 0x62, - 0xcc, 0x8b, 0xa3, 0x1f, 0x87, 0x32, 0x09, 0x76, 0xab, 0xa3, 0x8c, 0xcb, 0x5c, 0x1e, 0x97, 0x95, - 0x60, 0xf7, 0xa6, 0x13, 0xa5, 0x72, 0x66, 0x25, 0xd8, 0xc5, 0xb4, 0x0c, 0x7a, 0x13, 0x2a, 0xd2, - 0xf9, 0x15, 0x57, 0xc7, 0x8a, 0xa7, 0x18, 0x16, 0x44, 0x98, 0xbc, 0xd7, 0xf1, 0x22, 0xb2, 0x43, - 0x82, 0x24, 0x4e, 0xcd, 0x17, 0x89, 0x8d, 0x71, 0xca, 0x0d, 0xbd, 0x09, 0x13, 0x5c, 0xf3, 0xbb, - 0x1a, 0x76, 0x82, 0x24, 0xae, 0x56, 0x58, 0xf3, 0x72, 0x3d, 0x25, 0x37, 0x53, 0xba, 0xa5, 0x93, - 0x82, 0xe9, 0x84, 0x06, 0x8c, 0xb1, 0xc1, 0x0a, 0x61, 0x98, 0xf4, 0xbd, 0x5d, 0x12, 0x90, 0x38, - 0x6e, 0x44, 0xe1, 0x2d, 0x52, 0x05, 0xd6, 0xf2, 0x33, 0xf9, 0x0e, 0x84, 0xf0, 0x16, 0x59, 0x9a, - 0x3d, 0xd8, 0xaf, 0x4d, 0x5e, 0xd1, 0xcb, 0x60, 0x93, 0x05, 0xba, 0x01, 0x53, 0x54, 0xa5, 0xf4, - 0x52, 0xa6, 0xe3, 0xfd, 0x98, 0xa2, 0x83, 0xfd, 0xda, 0x14, 0x36, 0x0a, 0xe1, 0x0c, 0x13, 0xf4, - 0x1a, 0x54, 0x7c, 0x6f, 0x83, 0xb4, 0xf6, 0x5a, 0x3e, 0xa9, 0x4e, 0x30, 0x8e, 0xb9, 0xcb, 0xea, - 0x8a, 0x24, 0xe2, 0x2a, 0xbb, 0xfa, 0x8b, 0xd3, 0xe2, 0xe8, 0x26, 0x9c, 0x4e, 0x48, 0xb4, 0xe3, - 0x05, 0x0e, 0x5d, 0x0e, 0x42, 0x9f, 0x64, 0x6e, 0x98, 0x49, 0x36, 0xdf, 0xce, 0x8a, 0xae, 0x3b, - 0xbd, 0x9e, 0x4b, 0x85, 0x0b, 0x4a, 0xa3, 0xeb, 0x30, 0xcd, 0x56, 0x42, 0xa3, 0xe3, 0xfb, 0x8d, - 0xd0, 0xf7, 0x5a, 0x7b, 0xd5, 0x29, 0xc6, 0xf0, 0x13, 0xd2, 0xcf, 0xb2, 0x66, 0xa2, 0xa9, 0x81, - 0x95, 0xfe, 0xc3, 0xd9, 0xd2, 0xe8, 0x16, 0xb3, 0xbb, 0x3b, 0x91, 0x97, 0xec, 0xd1, 0xf9, 0x4b, - 0xee, 0x24, 0xd5, 0xe9, 0x62, 0x33, 0xb1, 0x69, 0x92, 0x2a, 0xe3, 0x5c, 0x07, 0xe2, 0x2c, 0x43, - 0xba, 0xb4, 0xe3, 0xc4, 0xf5, 0x82, 0xea, 0x0c, 0x93, 0x18, 0x6a, 0x65, 0x34, 0x29, 0x10, 0x73, - 0x1c, 0xb3, 0xb9, 0xe9, 0x8f, 0xeb, 0x54, 0x82, 0xce, 0x32, 0xc2, 0xd4, 0xe6, 0x96, 0x08, 0x9c, - 0xd2, 0xd0, 0x6d, 0x39, 0x49, 0xf6, 0xaa, 0x88, 0x91, 0xaa, 0xe5, 0xb2, 0xbe, 0xfe, 0x26, 0xa6, - 0x70, 0x74, 0x05, 0x46, 0x49, 0xb0, 0xbb, 0x1a, 0x85, 0x3b, 0xd5, 0x13, 0xc5, 0x6b, 0x76, 0x85, - 0x93, 0x70, 0x81, 0x9e, 0x1a, 0x00, 0x02, 0x8c, 0x25, 0x0b, 0x74, 0x07, 0xaa, 0x39, 0x23, 0xc2, - 0x07, 0xe0, 0x24, 0x1b, 0x80, 0x57, 0x44, 0xd9, 0xea, 0x7a, 0x01, 0xdd, 0x61, 0x0f, 0x1c, 0x2e, - 0xe4, 0x6e, 0xdf, 0x82, 0x29, 0x25, 0x58, 0xd8, 0xd8, 0xa2, 0x1a, 0x0c, 0x53, 0x89, 0x29, 0x8d, - 0xe0, 0x0a, 0xed, 0x4a, 0xe6, 0x09, 0xc1, 0x1c, 0xce, 0xba, 0xd2, 0x7b, 0x9f, 0x2c, 0xed, 0x25, - 0x84, 0x9b, 0x45, 0x65, 0xad, 0x2b, 0x25, 0x02, 0xa7, 0x34, 0xf6, 0xff, 0xe1, 0x8a, 0x49, 0x2a, - 0xbd, 0x06, 0x90, 0xd7, 0x4f, 0xc3, 0xd8, 0x56, 0x18, 0x27, 0x94, 0x9a, 0xd5, 0x31, 0x9c, 0xaa, - 0x22, 0x97, 0x04, 0x1c, 0x2b, 0x0a, 0xf4, 0x32, 0x4c, 0xb6, 0xf4, 0x0a, 0xc4, 0x66, 0x73, 0x4a, - 0x14, 0x31, 0x6b, 0xc7, 0x26, 0x2d, 0x7a, 0x09, 0xc6, 0x98, 0x3f, 0xbc, 0x15, 0xfa, 0xc2, 0x00, - 0x93, 0x3b, 0xe6, 0x58, 0x43, 0xc0, 0x0f, 0xb5, 0xdf, 0x58, 0x51, 0x53, 0x33, 0x96, 0x36, 0x61, - 0xad, 0x21, 0xc4, 0xbc, 0x32, 0x63, 0x2f, 0x31, 0x28, 0x16, 0x58, 0xfb, 0xaf, 0x97, 0xb4, 0x5e, - 0xa6, 0x26, 0x05, 0x41, 0x0d, 0x18, 0xbd, 0xed, 0x78, 0x89, 0x17, 0x6c, 0x8a, 0xfd, 0xfc, 0x89, - 0x9e, 0x32, 0x9f, 0x15, 0x7a, 0x83, 0x17, 0xe0, 0xbb, 0x92, 0xf8, 0x83, 0x25, 0x1b, 0xca, 0x31, - 0xea, 0x04, 0x01, 0xe5, 0x58, 0x1a, 0x94, 0x23, 0xe6, 0x05, 0x38, 0x47, 0xf1, 0x07, 0x4b, 0x36, - 0xe8, 0x6d, 0x00, 0x39, 0x6f, 0x88, 0x2b, 0xfc, 0xd0, 0x4f, 0xf7, 0x67, 0xba, 0xae, 0xca, 0x2c, - 0x4d, 0xd1, 0x3d, 0x2f, 0xfd, 0x8f, 0x35, 0x7e, 0x76, 0xc2, 0xf4, 0x9e, 0xee, 0xc6, 0xa0, 0xcf, - 0xd0, 0xa5, 0xea, 0x44, 0x09, 0x71, 0x17, 0x13, 0xd1, 0x39, 0x4f, 0x0e, 0xa6, 0xb6, 0xae, 0x7b, - 0x3b, 0x44, 0x5f, 0xd6, 0x82, 0x09, 0x4e, 0xf9, 0xd9, 0xbf, 0x53, 0x86, 0x6a, 0x51, 0x73, 0xe9, - 0xa4, 0x23, 0x77, 0xbc, 0x64, 0x99, 0xaa, 0x2b, 0x96, 0x39, 0xe9, 0x56, 0x04, 0x1c, 0x2b, 0x0a, - 0x3a, 0xfa, 0xb1, 0xb7, 0x29, 0xad, 0x8e, 0xe1, 0x74, 0xf4, 0x9b, 0x0c, 0x8a, 0x05, 0x96, 0xd2, - 0x45, 0xc4, 0x89, 0xc5, 0x41, 0x87, 0x36, 0x4b, 0x30, 0x83, 0x62, 0x81, 0xd5, 0x1d, 0x06, 0x43, - 0x7d, 0x1c, 0x06, 0x46, 0x17, 0x0d, 0xdf, 0xdb, 0x2e, 0x42, 0xef, 0x00, 0x6c, 0x78, 0x81, 0x17, - 0x6f, 0x31, 0xee, 0x23, 0x47, 0xe6, 0xae, 0x94, 0x9d, 0x55, 0xc5, 0x05, 0x6b, 0x1c, 0xd1, 0x0b, - 0x30, 0xae, 0x16, 0xe0, 0x5a, 0xbd, 0x3a, 0x6a, 0x7a, 0xd1, 0x53, 0x69, 0x54, 0xc7, 0x3a, 0x9d, - 0xfd, 0x6e, 0x76, 0xbe, 0x88, 0x15, 0xa0, 0xf5, 0xaf, 0x35, 0x68, 0xff, 0x96, 0x7a, 0xf7, 0xaf, - 0xfd, 0x07, 0x65, 0x98, 0x36, 0x2a, 0xeb, 0xc4, 0x03, 0xc8, 0xac, 0x8b, 0x74, 0x23, 0x72, 0x12, - 0x22, 0xd6, 0x9f, 0xdd, 0x7f, 0xa9, 0xe8, 0x9b, 0x15, 0x5d, 0x01, 0xbc, 0x3c, 0x7a, 0x07, 0x2a, - 0xbe, 0x13, 0x33, 0xe7, 0x03, 0x11, 0xeb, 0x6e, 0x10, 0x66, 0xa9, 0xa2, 0xef, 0xc4, 0x89, 0xb6, - 0x17, 0x70, 0xde, 0x29, 0x4b, 0xba, 0x63, 0x52, 0xe5, 0x44, 0x9e, 0xa4, 0xa9, 0x46, 0x50, 0x0d, - 0x66, 0x0f, 0x73, 0x1c, 0x7a, 0x09, 0x26, 0x22, 0xc2, 0x66, 0xc5, 0x32, 0xd5, 0xb5, 0xd8, 0x34, - 0x1b, 0x4e, 0x95, 0x32, 0xac, 0xe1, 0xb0, 0x41, 0x99, 0xea, 0xda, 0x23, 0x3d, 0x74, 0xed, 0x27, - 0x60, 0x94, 0xfd, 0x50, 0x33, 0x40, 0x8d, 0xc6, 0x1a, 0x07, 0x63, 0x89, 0xcf, 0x4e, 0x98, 0xb1, - 0x01, 0x27, 0xcc, 0x93, 0x30, 0x55, 0x77, 0xc8, 0x4e, 0x18, 0xac, 0x04, 0x6e, 0x3b, 0xf4, 0x82, - 0x04, 0x55, 0x61, 0x88, 0xed, 0x0e, 0x7c, 0x6d, 0x0f, 0x51, 0x0e, 0x78, 0x88, 0x6a, 0xce, 0xf6, - 0x1f, 0x97, 0x60, 0xb2, 0x4e, 0x7c, 0x92, 0x10, 0x6e, 0x6b, 0xc4, 0x68, 0x15, 0xd0, 0x66, 0xe4, - 0xb4, 0x48, 0x83, 0x44, 0x5e, 0xe8, 0x36, 0x49, 0x2b, 0x0c, 0xd8, 0xf9, 0x14, 0xdd, 0xee, 0x4e, - 0x1f, 0xec, 0xd7, 0xd0, 0xc5, 0x2e, 0x2c, 0xce, 0x29, 0x81, 0xde, 0x82, 0xc9, 0x76, 0x44, 0x0c, - 0x1f, 0x9a, 0x55, 0xa4, 0x2e, 0x34, 0x74, 0x42, 0xae, 0xa9, 0x1a, 0x20, 0x6c, 0xb2, 0x42, 0x3f, - 0x09, 0x33, 0x61, 0xd4, 0xde, 0x72, 0x82, 0x3a, 0x69, 0x93, 0xc0, 0xa5, 0xaa, 0xb8, 0xf0, 0x11, - 0x9c, 0x3c, 0xd8, 0xaf, 0xcd, 0x5c, 0xcf, 0xe0, 0x70, 0x17, 0x35, 0x7a, 0x0b, 0x66, 0xdb, 0x51, - 0xd8, 0x76, 0x36, 0xd9, 0x44, 0x11, 0x1a, 0x07, 0x97, 0x3e, 0x4f, 0x1f, 0xec, 0xd7, 0x66, 0x1b, - 0x59, 0xe4, 0xe1, 0x7e, 0xed, 0x04, 0xeb, 0x28, 0x0a, 0x49, 0x91, 0xb8, 0x9b, 0x8d, 0xbd, 0x09, - 0xa7, 0xea, 0xe1, 0xed, 0xe0, 0xb6, 0x13, 0xb9, 0x8b, 0x8d, 0x35, 0xcd, 0xb8, 0xbf, 0x26, 0x8d, - 0x4b, 0x7e, 0xda, 0x97, 0xbb, 0x4f, 0x69, 0x25, 0xb9, 0xfa, 0xbf, 0xea, 0xf9, 0xa4, 0xc0, 0x89, - 0xf0, 0x37, 0x4b, 0x46, 0x4d, 0x29, 0xbd, 0xf2, 0xd4, 0x5b, 0x85, 0x9e, 0xfa, 0xd7, 0x61, 0x6c, - 0xc3, 0x23, 0xbe, 0x8b, 0xc9, 0x86, 0x18, 0x99, 0xc7, 0x8b, 0x0f, 0x30, 0x56, 0x29, 0xa5, 0x74, - 0x1a, 0x71, 0xd3, 0x74, 0x55, 0x14, 0xc6, 0x8a, 0x0d, 0xda, 0x86, 0x19, 0x69, 0xfb, 0x48, 0xac, - 0x58, 0xc4, 0x4f, 0xf4, 0x32, 0xa8, 0x4c, 0xe6, 0x6c, 0x00, 0x71, 0x86, 0x0d, 0xee, 0x62, 0x4c, - 0x6d, 0xd1, 0x1d, 0xba, 0x5d, 0x0d, 0xb1, 0x29, 0xcd, 0x6c, 0x51, 0x66, 0x56, 0x33, 0xa8, 0xfd, - 0x15, 0x0b, 0x1e, 0xe8, 0xea, 0x19, 0xe1, 0x5e, 0xb8, 0xc7, 0xa3, 0x90, 0x35, 0xf7, 0x4b, 0xfd, - 0xcd, 0x7d, 0xfb, 0x37, 0x2c, 0x38, 0xb9, 0xb2, 0xd3, 0x4e, 0xf6, 0xea, 0x9e, 0x79, 0x9a, 0xf0, - 0x22, 0x8c, 0xec, 0x10, 0xd7, 0xeb, 0xec, 0x88, 0x91, 0xab, 0x49, 0x91, 0x7e, 0x95, 0x41, 0x0f, - 0xf7, 0x6b, 0x93, 0xcd, 0x24, 0x8c, 0x9c, 0x4d, 0xc2, 0x01, 0x58, 0x90, 0xa3, 0x9f, 0xe1, 0xba, - 0xe9, 0x15, 0x6f, 0xc7, 0x93, 0x07, 0x52, 0x3d, 0x5d, 0x5e, 0xf3, 0xb2, 0x43, 0xe7, 0x5f, 0xef, - 0x38, 0x41, 0xe2, 0x25, 0x7b, 0xa6, 0x2e, 0xcb, 0x18, 0xe1, 0x94, 0xa7, 0xfd, 0x6d, 0x0b, 0xa6, - 0xa5, 0x3c, 0x59, 0x74, 0xdd, 0x88, 0xc4, 0x31, 0x9a, 0x83, 0x92, 0xd7, 0x16, 0x2d, 0x05, 0x51, - 0xba, 0xb4, 0xd6, 0xc0, 0x25, 0xaf, 0x8d, 0x1a, 0x50, 0xe1, 0x67, 0x5b, 0xe9, 0x04, 0x1b, 0xe8, - 0x84, 0x8c, 0xd9, 0x7e, 0xeb, 0xb2, 0x24, 0x4e, 0x99, 0x48, 0xcd, 0x98, 0xed, 0x45, 0x65, 0xf3, - 0xa4, 0xe5, 0x92, 0x80, 0x63, 0x45, 0x81, 0xce, 0xc3, 0x58, 0x10, 0xba, 0xfc, 0xa8, 0x91, 0xaf, - 0x6b, 0x36, 0x6d, 0xaf, 0x09, 0x18, 0x56, 0x58, 0xfb, 0xe7, 0x2d, 0x98, 0x90, 0x5f, 0x36, 0xa0, - 0x92, 0x4e, 0x97, 0x57, 0xaa, 0xa0, 0xa7, 0xcb, 0x8b, 0x2a, 0xd9, 0x0c, 0x63, 0xe8, 0xd6, 0xe5, - 0xa3, 0xe8, 0xd6, 0xf6, 0x97, 0x4b, 0x30, 0x25, 0x9b, 0xd3, 0xec, 0xdc, 0x8a, 0x49, 0x82, 0xd6, - 0xa1, 0xe2, 0xf0, 0x2e, 0x27, 0x72, 0xd6, 0x3e, 0x9a, 0x6f, 0x75, 0x19, 0xe3, 0x93, 0x8e, 0xe8, - 0xa2, 0x2c, 0x8d, 0x53, 0x46, 0xc8, 0x87, 0xd9, 0x20, 0x4c, 0xd8, 0xd6, 0xa7, 0xf0, 0xbd, 0xce, - 0x06, 0xb2, 0xdc, 0xcf, 0x08, 0xee, 0xb3, 0xd7, 0xb2, 0x5c, 0x70, 0x37, 0x63, 0xb4, 0x22, 0x3d, - 0x3d, 0x65, 0x56, 0xc3, 0xb9, 0x5e, 0x35, 0x14, 0x3b, 0x7a, 0xec, 0xdf, 0xb7, 0xa0, 0x22, 0xc9, - 0x8e, 0xe3, 0x18, 0xe8, 0x2a, 0x8c, 0xc6, 0x6c, 0x10, 0x64, 0xd7, 0xd8, 0xbd, 0x1a, 0xce, 0xc7, - 0x2b, 0xdd, 0xd1, 0xf9, 0xff, 0x18, 0x4b, 0x1e, 0xcc, 0x55, 0xad, 0x9a, 0xff, 0x11, 0x71, 0x55, - 0xab, 0xf6, 0x14, 0xec, 0x32, 0xff, 0x99, 0xb5, 0x59, 0xb3, 0xe7, 0xa9, 0xe2, 0xd9, 0x8e, 0xc8, - 0x86, 0x77, 0x27, 0xab, 0x78, 0x36, 0x18, 0x14, 0x0b, 0x2c, 0x7a, 0x1b, 0x26, 0x5a, 0xd2, 0xc3, - 0x9b, 0x8a, 0x81, 0xc7, 0x7a, 0xfa, 0xcb, 0xd5, 0xd1, 0x0a, 0x0f, 0x43, 0x5a, 0xd6, 0xca, 0x63, - 0x83, 0x1b, 0x95, 0x30, 0xe9, 0xa9, 0x70, 0xb9, 0xa7, 0x73, 0x25, 0x22, 0x49, 0xca, 0xb7, 0xf0, - 0x40, 0xd8, 0xfe, 0x15, 0x0b, 0x46, 0xb8, 0x9f, 0x70, 0x30, 0xc7, 0xaa, 0x76, 0x54, 0x94, 0xf6, - 0xdd, 0x4d, 0x0a, 0x14, 0x27, 0x47, 0xe8, 0x2a, 0x54, 0xd8, 0x0f, 0xe6, 0x2f, 0x29, 0x17, 0xc7, - 0x5f, 0xf1, 0x5a, 0xf5, 0x06, 0xde, 0x94, 0xc5, 0x70, 0xca, 0xc1, 0xfe, 0xc5, 0x32, 0x15, 0x55, - 0x29, 0xa9, 0xb1, 0x8b, 0x5b, 0xf7, 0x6f, 0x17, 0x2f, 0xdd, 0xaf, 0x5d, 0x7c, 0x13, 0xa6, 0x5b, - 0xda, 0xb9, 0x54, 0x3a, 0x92, 0xe7, 0x7b, 0x4e, 0x12, 0xed, 0x08, 0x8b, 0xfb, 0xca, 0x96, 0x4d, - 0x26, 0x38, 0xcb, 0x15, 0x7d, 0x06, 0x26, 0xf8, 0x38, 0x8b, 0x5a, 0x86, 0x58, 0x2d, 0x9f, 0x28, - 0x9e, 0x2f, 0x7a, 0x15, 0x6c, 0x26, 0x36, 0xb5, 0xe2, 0xd8, 0x60, 0x66, 0x7f, 0x71, 0x18, 0x86, - 0x57, 0x76, 0x49, 0x90, 0x1c, 0x83, 0x40, 0x6a, 0xc1, 0x94, 0x17, 0xec, 0x86, 0xfe, 0x2e, 0x71, - 0x39, 0xfe, 0x28, 0x9b, 0xeb, 0x69, 0xc1, 0x7a, 0x6a, 0xcd, 0x60, 0x81, 0x33, 0x2c, 0xef, 0x87, - 0xe5, 0x7e, 0x11, 0x46, 0xf8, 0xd8, 0x0b, 0xb3, 0x3d, 0xd7, 0x0b, 0xce, 0x3a, 0x51, 0xac, 0x82, - 0xd4, 0xab, 0xc0, 0xdd, 0xee, 0xa2, 0x38, 0x7a, 0x17, 0xa6, 0x36, 0xbc, 0x28, 0x4e, 0xa8, 0xc9, - 0x1d, 0x27, 0xce, 0x4e, 0xfb, 0x2e, 0x2c, 0x75, 0xd5, 0x0f, 0xab, 0x06, 0x27, 0x9c, 0xe1, 0x8c, - 0x36, 0x61, 0x92, 0x1a, 0x8f, 0x69, 0x55, 0xa3, 0x47, 0xae, 0x4a, 0xb9, 0xe2, 0xae, 0xe8, 0x8c, - 0xb0, 0xc9, 0x97, 0x0a, 0x93, 0x16, 0x33, 0x36, 0xc7, 0x98, 0x46, 0xa1, 0x84, 0x09, 0xb7, 0x32, - 0x39, 0x8e, 0xca, 0x24, 0x16, 0xcf, 0x51, 0x31, 0x65, 0x52, 0x1a, 0xb5, 0x61, 0x7f, 0x95, 0xee, - 0x8e, 0xb4, 0x0f, 0x8f, 0x61, 0x6b, 0x79, 0xd5, 0xdc, 0x5a, 0xce, 0x14, 0x8e, 0x67, 0xc1, 0xb6, - 0xf2, 0x59, 0x18, 0xd7, 0x86, 0x1b, 0x2d, 0x40, 0xa5, 0x25, 0x83, 0x0f, 0x84, 0xd4, 0x55, 0xea, - 0x8b, 0x8a, 0x4a, 0xc0, 0x29, 0x0d, 0xed, 0x0d, 0xaa, 0xec, 0x65, 0x83, 0x91, 0xa8, 0x2a, 0x88, - 0x19, 0xc6, 0x7e, 0x0e, 0x60, 0xe5, 0x0e, 0x69, 0x2d, 0x72, 0xe3, 0x4b, 0x3b, 0xe3, 0xb2, 0x8a, - 0xcf, 0xb8, 0xec, 0x3f, 0xb1, 0x60, 0x6a, 0x75, 0xd9, 0x50, 0xca, 0xe7, 0x01, 0xb8, 0x16, 0xfa, - 0xc6, 0x1b, 0xd7, 0xa4, 0x77, 0x98, 0x3b, 0xf8, 0x14, 0x14, 0x6b, 0x14, 0xe8, 0x0c, 0x94, 0xfd, - 0x4e, 0x20, 0x94, 0xc3, 0xd1, 0x83, 0xfd, 0x5a, 0xf9, 0x4a, 0x27, 0xc0, 0x14, 0xa6, 0xc5, 0xff, - 0x94, 0x07, 0x8e, 0xff, 0xe9, 0x1b, 0xf5, 0x8b, 0x6a, 0x30, 0x7c, 0xfb, 0xb6, 0xe7, 0xc6, 0xd5, - 0xe1, 0xd4, 0x73, 0xfd, 0xc6, 0x1b, 0x6b, 0xf5, 0x18, 0x73, 0xb8, 0xfd, 0xff, 0x97, 0x61, 0x66, - 0xd5, 0x27, 0x77, 0x8c, 0xcf, 0x7a, 0x0c, 0x46, 0xdc, 0xc8, 0xdb, 0x25, 0x51, 0x76, 0x17, 0xaf, - 0x33, 0x28, 0x16, 0xd8, 0x81, 0x63, 0x96, 0x6e, 0x74, 0xef, 0xc7, 0xf7, 0x3a, 0x4a, 0xab, 0x7f, - 0x57, 0xbc, 0x0d, 0xa3, 0xfc, 0xa8, 0x94, 0x77, 0xc6, 0xf8, 0x85, 0x67, 0xf3, 0x9a, 0x90, 0xed, - 0x8b, 0x79, 0xe1, 0xfc, 0xe0, 0x71, 0x23, 0x4a, 0x88, 0x09, 0x28, 0x96, 0x2c, 0xe7, 0x3e, 0x05, - 0x13, 0x3a, 0xe5, 0x91, 0x02, 0x48, 0xfe, 0x92, 0x05, 0x27, 0x56, 0xfd, 0xb0, 0xb5, 0x9d, 0x09, - 0x20, 0x7b, 0x01, 0xc6, 0xe9, 0x7a, 0x8a, 0x8d, 0x48, 0x4a, 0x23, 0xb6, 0x56, 0xa0, 0xb0, 0x4e, - 0xa7, 0x15, 0xbb, 0x71, 0x63, 0xad, 0x9e, 0x17, 0x92, 0x2b, 0x50, 0x58, 0xa7, 0xb3, 0xff, 0xd0, - 0x82, 0x87, 0x2f, 0x2e, 0xaf, 0xa4, 0x01, 0xac, 0x5d, 0x51, 0xc1, 0x54, 0xb9, 0x73, 0xb5, 0xa6, - 0xa4, 0xca, 0x5d, 0x9d, 0xb5, 0x42, 0x60, 0x3f, 0x2a, 0x11, 0xef, 0xbf, 0x66, 0xc1, 0x89, 0x8b, - 0x5e, 0x82, 0x49, 0x3b, 0xcc, 0xc6, 0xa7, 0x46, 0xa4, 0x1d, 0xc6, 0x5e, 0x12, 0x46, 0x7b, 0xd9, - 0xf8, 0x54, 0xac, 0x30, 0x58, 0xa3, 0xe2, 0x35, 0xef, 0x7a, 0x31, 0x6d, 0x69, 0xc9, 0xb4, 0x30, - 0xb1, 0x80, 0x63, 0x45, 0x41, 0x3f, 0xcc, 0xf5, 0x22, 0xa6, 0x21, 0xec, 0x89, 0xe5, 0xac, 0x3e, - 0xac, 0x2e, 0x11, 0x38, 0xa5, 0xb1, 0xbf, 0x62, 0xc1, 0xa9, 0x8b, 0x7e, 0x27, 0x4e, 0x48, 0xb4, - 0x11, 0x1b, 0x8d, 0x7d, 0x0e, 0x2a, 0x44, 0x6a, 0xe1, 0xa2, 0xad, 0x6a, 0xdf, 0x50, 0xea, 0x39, - 0x0f, 0x8e, 0x55, 0x74, 0x03, 0x44, 0x63, 0x1e, 0x2d, 0x8a, 0xf0, 0x6b, 0x25, 0x98, 0xbc, 0xb4, - 0xbe, 0xde, 0xb8, 0x48, 0x12, 0x21, 0x32, 0xfb, 0x7b, 0x91, 0xb0, 0x66, 0x08, 0xf7, 0xd2, 0x75, - 0x3a, 0x89, 0xe7, 0xcf, 0xf3, 0xdb, 0x18, 0xf3, 0x6b, 0x41, 0x72, 0x3d, 0x6a, 0x26, 0x91, 0x17, - 0x6c, 0xe6, 0x9a, 0xce, 0x52, 0xb0, 0x97, 0x8b, 0x04, 0x3b, 0x7a, 0x0e, 0x46, 0xd8, 0x75, 0x10, - 0xa9, 0x75, 0x3c, 0xa8, 0x54, 0x05, 0x06, 0x3d, 0xdc, 0xaf, 0x55, 0x6e, 0xe0, 0x35, 0xfe, 0x07, - 0x0b, 0x52, 0x74, 0x03, 0xc6, 0xb7, 0x92, 0xa4, 0x7d, 0x89, 0x38, 0x2e, 0x89, 0xa4, 0x74, 0x38, - 0x9b, 0x27, 0x1d, 0x68, 0x27, 0x70, 0xb2, 0x74, 0x41, 0xa5, 0xb0, 0x18, 0xeb, 0x7c, 0xec, 0x26, - 0x40, 0x8a, 0xbb, 0x47, 0x66, 0x83, 0xfd, 0x7d, 0x0b, 0x46, 0x2f, 0x39, 0x81, 0xeb, 0x93, 0x08, - 0xbd, 0x02, 0x43, 0xe4, 0x0e, 0x69, 0x89, 0x1d, 0x3c, 0xb7, 0xc1, 0xe9, 0x2e, 0xc7, 0x1d, 0x61, - 0xf4, 0x3f, 0x66, 0xa5, 0xd0, 0x25, 0x18, 0xa5, 0xad, 0xbd, 0xa8, 0xc2, 0x94, 0x1f, 0x29, 0xfa, - 0x62, 0x35, 0xec, 0x7c, 0x63, 0x14, 0x20, 0x2c, 0x8b, 0x33, 0x87, 0x4e, 0xab, 0xdd, 0xa4, 0x02, - 0x2c, 0xe9, 0x65, 0x6e, 0xad, 0x2f, 0x37, 0x38, 0x91, 0xe0, 0xc6, 0x1d, 0x3a, 0x12, 0x88, 0x53, - 0x26, 0xf6, 0x3a, 0x54, 0xe8, 0xa0, 0x2e, 0xfa, 0x9e, 0xd3, 0xdb, 0x97, 0xf4, 0x14, 0x54, 0xa4, - 0x5f, 0x27, 0x16, 0x91, 0xce, 0x8c, 0xab, 0x74, 0xfb, 0xc4, 0x38, 0xc5, 0xdb, 0x1b, 0x70, 0x92, - 0x1d, 0x94, 0x3a, 0xc9, 0x96, 0xb1, 0xc6, 0xfa, 0x4f, 0xe6, 0xa7, 0x85, 0x7e, 0xc5, 0x47, 0xa6, - 0xaa, 0xc5, 0xca, 0x4e, 0x48, 0x8e, 0x9a, 0xae, 0xf5, 0x1f, 0x87, 0x60, 0x76, 0xad, 0xb9, 0xdc, - 0x34, 0x9d, 0x8b, 0x2f, 0xc1, 0x04, 0xd7, 0x04, 0xe8, 0x84, 0x76, 0x7c, 0x51, 0x9b, 0x3a, 0x3c, - 0x58, 0xd7, 0x70, 0xd8, 0xa0, 0x44, 0x0f, 0x43, 0xd9, 0x7b, 0x2f, 0xc8, 0x86, 0xc3, 0xad, 0xbd, - 0x7e, 0x0d, 0x53, 0x38, 0x45, 0x53, 0xa5, 0x82, 0x0b, 0x50, 0x85, 0x56, 0x8a, 0xc5, 0xab, 0x30, - 0xe5, 0xc5, 0xad, 0xd8, 0x5b, 0x0b, 0xa8, 0x74, 0x49, 0xc3, 0xfc, 0x53, 0x8d, 0x9f, 0x36, 0x55, - 0x61, 0x71, 0x86, 0x5a, 0x93, 0xe6, 0xc3, 0x03, 0x2b, 0x26, 0x7d, 0x63, 0xa6, 0xa9, 0xce, 0xd5, - 0x66, 0x5f, 0x17, 0xb3, 0xd0, 0x1c, 0xa1, 0x73, 0xf1, 0x0f, 0x8e, 0xb1, 0xc4, 0xa1, 0x8b, 0x30, - 0xdb, 0xda, 0x72, 0xda, 0x8b, 0x9d, 0x64, 0xab, 0xee, 0xc5, 0xad, 0x70, 0x97, 0x44, 0x7b, 0x4c, - 0x13, 0x1e, 0x4b, 0x9d, 0x4c, 0x0a, 0xb1, 0x7c, 0x69, 0xb1, 0x41, 0x29, 0x71, 0x77, 0x19, 0x53, - 0x05, 0x81, 0x7b, 0xa6, 0x82, 0x2c, 0xc2, 0xb4, 0xac, 0xab, 0x49, 0x62, 0xb6, 0x3d, 0x8c, 0xb3, - 0xd6, 0xa9, 0x5b, 0x38, 0x02, 0xac, 0xda, 0x96, 0xa5, 0x47, 0x2f, 0xc2, 0xa4, 0x17, 0x78, 0x89, - 0xe7, 0x24, 0x61, 0xc4, 0x36, 0xd7, 0x09, 0xbe, 0x61, 0x50, 0x09, 0xbf, 0xa6, 0x23, 0xb0, 0x49, - 0x67, 0xbf, 0x0b, 0x15, 0x15, 0x6f, 0x26, 0x43, 0x26, 0xad, 0x82, 0x90, 0xc9, 0xfe, 0x3b, 0x82, - 0xf4, 0x9a, 0x97, 0x73, 0xbd, 0xe6, 0x7f, 0xcb, 0x82, 0x34, 0xec, 0x06, 0x5d, 0x82, 0x4a, 0x3b, - 0x64, 0x27, 0x67, 0x91, 0x3c, 0x8e, 0x7e, 0x30, 0x57, 0x78, 0x70, 0x41, 0xc5, 0xfb, 0xaf, 0x21, - 0x4b, 0xe0, 0xb4, 0x30, 0x5a, 0x82, 0xd1, 0x76, 0x44, 0x9a, 0x09, 0xbb, 0xa7, 0xd0, 0x97, 0x0f, - 0x9f, 0x23, 0x9c, 0x1e, 0xcb, 0x82, 0xf6, 0x6f, 0x59, 0x00, 0xdc, 0x29, 0xed, 0x04, 0x9b, 0xe4, - 0x18, 0x0c, 0xed, 0x3a, 0x0c, 0xc5, 0x6d, 0xd2, 0xea, 0x75, 0xa6, 0x99, 0xb6, 0xa7, 0xd9, 0x26, - 0xad, 0xb4, 0xc3, 0xe9, 0x3f, 0xcc, 0x4a, 0xdb, 0x3f, 0x07, 0x30, 0x95, 0x92, 0x51, 0x03, 0x08, - 0x3d, 0x63, 0x84, 0xe5, 0x9f, 0xc9, 0x84, 0xe5, 0x57, 0x18, 0xb5, 0x16, 0x89, 0xff, 0x2e, 0x94, - 0x77, 0x9c, 0x3b, 0xc2, 0xca, 0x7a, 0xaa, 0x77, 0x33, 0x28, 0xff, 0xf9, 0xab, 0xce, 0x1d, 0xae, - 0xc7, 0x3e, 0x25, 0x27, 0xc8, 0x55, 0xe7, 0xce, 0x21, 0x3f, 0xb9, 0x64, 0x42, 0x8a, 0x1a, 0x73, - 0x9f, 0xff, 0x6e, 0xfa, 0x9f, 0x4d, 0x3b, 0x5a, 0x09, 0xab, 0xcb, 0x0b, 0x84, 0x8b, 0x76, 0xa0, - 0xba, 0xbc, 0x20, 0x5b, 0x97, 0x17, 0x0c, 0x50, 0x97, 0x17, 0xa0, 0xf7, 0x61, 0x54, 0x1c, 0x89, - 0xb0, 0x78, 0xc2, 0xf1, 0x0b, 0x0b, 0x03, 0xd4, 0x27, 0x4e, 0x54, 0x78, 0x9d, 0x0b, 0x52, 0x4f, - 0x17, 0xd0, 0xbe, 0xf5, 0xca, 0x0a, 0xd1, 0xdf, 0xb0, 0x60, 0x4a, 0xfc, 0xc6, 0xe4, 0xbd, 0x0e, - 0x89, 0x13, 0xa1, 0x0f, 0x7c, 0x72, 0xf0, 0x36, 0x88, 0x82, 0xbc, 0x29, 0x9f, 0x94, 0x62, 0xd6, - 0x44, 0xf6, 0x6d, 0x51, 0xa6, 0x15, 0xe8, 0x1f, 0x5b, 0x70, 0x72, 0xc7, 0xb9, 0xc3, 0x6b, 0xe4, - 0x30, 0xec, 0x24, 0x5e, 0x28, 0xe2, 0x23, 0x5f, 0x19, 0x6c, 0xf8, 0xbb, 0x8a, 0xf3, 0x46, 0xca, - 0x50, 0xaa, 0x93, 0x79, 0x24, 0x7d, 0x9b, 0x9a, 0xdb, 0xae, 0xb9, 0x0d, 0x18, 0x93, 0xf3, 0x2d, - 0xc7, 0x1a, 0xaa, 0xeb, 0xca, 0xce, 0x91, 0x4f, 0xa4, 0x34, 0xeb, 0x89, 0xd5, 0x23, 0xe6, 0xda, - 0x7d, 0xad, 0xe7, 0x5d, 0x98, 0xd0, 0xe7, 0xd8, 0x7d, 0xad, 0xeb, 0x3d, 0x38, 0x91, 0x33, 0x97, - 0xee, 0x6b, 0x95, 0xb7, 0xe1, 0x4c, 0xe1, 0xfc, 0xb8, 0x9f, 0x15, 0xdb, 0x5f, 0xb3, 0x74, 0x39, - 0x78, 0x0c, 0xee, 0xa9, 0x65, 0xd3, 0x3d, 0x75, 0xb6, 0xf7, 0xca, 0x29, 0xf0, 0x51, 0xbd, 0xad, - 0x37, 0x9a, 0x4a, 0x75, 0xf4, 0x1a, 0x8c, 0xf8, 0x14, 0x22, 0xcf, 0xe1, 0xec, 0xfe, 0x2b, 0x32, - 0xd5, 0xa5, 0x18, 0x3c, 0xc6, 0x82, 0x83, 0xfd, 0xbb, 0x16, 0x0c, 0x1d, 0x43, 0x4f, 0x60, 0xb3, - 0x27, 0x9e, 0x29, 0x64, 0x2d, 0xae, 0xda, 0xcf, 0x63, 0xe7, 0xf6, 0xca, 0x9d, 0x84, 0x04, 0x31, - 0x53, 0xdf, 0x73, 0x3b, 0xe6, 0x7f, 0x97, 0x60, 0x9c, 0x56, 0x25, 0x83, 0x46, 0x5e, 0x86, 0x49, - 0xdf, 0xb9, 0x45, 0x7c, 0xe9, 0x32, 0xcf, 0x1a, 0xb1, 0x57, 0x74, 0x24, 0x36, 0x69, 0x69, 0xe1, - 0x0d, 0xfd, 0xf4, 0x40, 0xe8, 0x2f, 0xaa, 0xb0, 0x71, 0xb4, 0x80, 0x4d, 0x5a, 0x6a, 0x4f, 0xdd, - 0x76, 0x92, 0xd6, 0x96, 0x30, 0x70, 0x55, 0x73, 0xdf, 0xa0, 0x40, 0xcc, 0x71, 0x54, 0x81, 0x93, - 0xb3, 0xf3, 0x26, 0x89, 0x98, 0x02, 0xc7, 0xd5, 0x63, 0xa5, 0xc0, 0x61, 0x13, 0x8d, 0xb3, 0xf4, - 0xe8, 0x53, 0x30, 0x45, 0x3b, 0x27, 0xec, 0x24, 0x32, 0x24, 0x66, 0x98, 0x85, 0xc4, 0xb0, 0x08, - 0xe8, 0x75, 0x03, 0x83, 0x33, 0x94, 0xa8, 0x01, 0x27, 0xbd, 0xa0, 0xe5, 0x77, 0x5c, 0x72, 0x23, - 0xe0, 0xda, 0x9d, 0xef, 0xbd, 0x4f, 0x5c, 0xa1, 0x40, 0xab, 0xe8, 0xa5, 0xb5, 0x1c, 0x1a, 0x9c, - 0x5b, 0xd2, 0xfe, 0x19, 0x38, 0x71, 0x25, 0x74, 0xdc, 0x25, 0xc7, 0x77, 0x82, 0x16, 0x89, 0xd6, - 0x82, 0xcd, 0xbe, 0x07, 0xf2, 0xfa, 0xf1, 0x79, 0xa9, 0xdf, 0xf1, 0xb9, 0xbd, 0x05, 0x48, 0xaf, - 0x40, 0x84, 0x82, 0x61, 0x18, 0xf5, 0x78, 0x55, 0x62, 0xfa, 0x3f, 0x9e, 0xaf, 0x5d, 0x77, 0xb5, - 0x4c, 0x0b, 0x72, 0xe2, 0x00, 0x2c, 0x19, 0xd9, 0x2f, 0x41, 0xee, 0xfd, 0x8c, 0xfe, 0xa6, 0xb4, - 0xfd, 0x02, 0xcc, 0xb2, 0x92, 0x47, 0x33, 0xf3, 0xec, 0xbf, 0x6a, 0xc1, 0xf4, 0xb5, 0xcc, 0x1d, - 0xd8, 0xc7, 0x60, 0x24, 0x26, 0x51, 0x8e, 0x2f, 0xb4, 0xc9, 0xa0, 0x58, 0x60, 0xef, 0xb9, 0xcf, - 0xe5, 0x07, 0x16, 0x54, 0xd4, 0x6d, 0xeb, 0x63, 0x50, 0x6a, 0x97, 0x0d, 0xa5, 0x36, 0xd7, 0x17, - 0xa0, 0x9a, 0x53, 0xa4, 0xd3, 0xa2, 0xcb, 0xea, 0x6e, 0x68, 0x0f, 0x37, 0x40, 0xca, 0x86, 0xdf, - 0x24, 0x9c, 0x32, 0x2f, 0x90, 0xca, 0xdb, 0xa2, 0xec, 0x44, 0x5c, 0xd1, 0x7e, 0x44, 0x4e, 0xc4, - 0x55, 0x7b, 0x0a, 0xa4, 0x5f, 0x43, 0x6b, 0x32, 0xdb, 0x15, 0x7e, 0x82, 0x45, 0x8e, 0xb2, 0xb5, - 0xa9, 0x2e, 0x51, 0xd7, 0x44, 0x24, 0xa8, 0x80, 0x1e, 0x32, 0x41, 0x26, 0xfe, 0xf1, 0x9b, 0xf1, - 0x69, 0x11, 0xfb, 0x12, 0x4c, 0x67, 0x3a, 0x0c, 0xbd, 0x00, 0xc3, 0xed, 0x2d, 0x27, 0x26, 0x99, - 0x48, 0xa0, 0xe1, 0x06, 0x05, 0x1e, 0xee, 0xd7, 0xa6, 0x54, 0x01, 0x06, 0xc1, 0x9c, 0xda, 0xfe, - 0xef, 0x16, 0x0c, 0x5d, 0x0b, 0xdd, 0xe3, 0x98, 0x4c, 0xaf, 0x1a, 0x93, 0xe9, 0xa1, 0xa2, 0xbc, - 0x22, 0x85, 0xf3, 0x68, 0x35, 0x33, 0x8f, 0xce, 0x16, 0x72, 0xe8, 0x3d, 0x85, 0x76, 0x60, 0x9c, - 0x65, 0x2b, 0x11, 0x51, 0x49, 0xcf, 0x19, 0xf6, 0x55, 0x2d, 0x63, 0x5f, 0x4d, 0x6b, 0xa4, 0x9a, - 0x95, 0xf5, 0x04, 0x8c, 0x8a, 0xc8, 0x98, 0x6c, 0x8c, 0xac, 0xa0, 0xc5, 0x12, 0x6f, 0xff, 0x4a, - 0x19, 0x8c, 0xec, 0x28, 0xe8, 0xf7, 0x2d, 0x98, 0x8f, 0xf8, 0xad, 0x20, 0xb7, 0xde, 0x89, 0xbc, - 0x60, 0xb3, 0xd9, 0xda, 0x22, 0x6e, 0xc7, 0xf7, 0x82, 0xcd, 0xb5, 0xcd, 0x20, 0x54, 0xe0, 0x95, - 0x3b, 0xa4, 0xd5, 0x61, 0x7e, 0xf0, 0x3e, 0xa9, 0x58, 0xd4, 0xc9, 0xf3, 0x85, 0x83, 0xfd, 0xda, - 0x3c, 0x3e, 0x12, 0x6f, 0x7c, 0xc4, 0xb6, 0xa0, 0x3f, 0xb4, 0x60, 0x81, 0x27, 0x0d, 0x19, 0xbc, - 0xfd, 0x3d, 0xac, 0xd1, 0x86, 0x64, 0x95, 0x32, 0x59, 0x27, 0xd1, 0xce, 0xd2, 0x8b, 0xa2, 0x43, - 0x17, 0x1a, 0x47, 0xab, 0x0b, 0x1f, 0xb5, 0x71, 0xf6, 0xbf, 0x2c, 0xc3, 0x24, 0xed, 0xc5, 0xf4, - 0x26, 0xfc, 0x0b, 0xc6, 0x94, 0x78, 0x24, 0x33, 0x25, 0x66, 0x0d, 0xe2, 0x7b, 0x73, 0x09, 0x3e, - 0x86, 0x59, 0xdf, 0x89, 0x93, 0x4b, 0xc4, 0x89, 0x92, 0x5b, 0xc4, 0x61, 0x47, 0xbd, 0x62, 0x9a, - 0x1f, 0xe5, 0xf4, 0x58, 0xb9, 0xbf, 0xae, 0x64, 0x99, 0xe1, 0x6e, 0xfe, 0x68, 0x17, 0x10, 0x3b, - 0x56, 0x8e, 0x9c, 0x20, 0xe6, 0xdf, 0xe2, 0x09, 0x1f, 0xf9, 0xd1, 0x6a, 0x9d, 0x13, 0xb5, 0xa2, - 0x2b, 0x5d, 0xdc, 0x70, 0x4e, 0x0d, 0x5a, 0xb8, 0xc0, 0xf0, 0xa0, 0xe1, 0x02, 0x23, 0x7d, 0x02, - 0xd1, 0x77, 0x60, 0x46, 0x8c, 0xca, 0x86, 0xb7, 0x29, 0x36, 0xe9, 0x37, 0x33, 0xe1, 0x44, 0xd6, - 0xe0, 0x81, 0x0f, 0x7d, 0x62, 0x89, 0xec, 0x9f, 0x85, 0x13, 0xb4, 0x3a, 0x33, 0x6c, 0x3a, 0x46, - 0x04, 0xa6, 0xb7, 0x3b, 0xb7, 0x88, 0x4f, 0x12, 0x09, 0x13, 0x95, 0xe6, 0xaa, 0xfd, 0x66, 0xe9, - 0x54, 0xb7, 0xbc, 0x6c, 0xb2, 0xc0, 0x59, 0x9e, 0xf6, 0xaf, 0x5a, 0xc0, 0x02, 0x13, 0x8f, 0x61, - 0xfb, 0xfb, 0xb4, 0xb9, 0xfd, 0x55, 0x8b, 0x24, 0x50, 0xc1, 0xce, 0xf7, 0x3c, 0x1f, 0x96, 0x46, - 0x14, 0xde, 0xd9, 0x93, 0xba, 0x7f, 0x7f, 0x8d, 0xeb, 0x7f, 0x59, 0x7c, 0x41, 0xaa, 0x4b, 0x92, - 0xe8, 0x73, 0x30, 0xd6, 0x72, 0xda, 0x4e, 0x8b, 0xa7, 0xa5, 0x2a, 0xf4, 0xfe, 0x18, 0x85, 0xe6, - 0x97, 0x45, 0x09, 0xee, 0xcd, 0xf8, 0x31, 0xf9, 0x95, 0x12, 0xdc, 0xd7, 0x83, 0xa1, 0xaa, 0x9c, - 0xdb, 0x86, 0x49, 0x83, 0xd9, 0x7d, 0x35, 0x7d, 0x3f, 0xc7, 0xb7, 0x0b, 0x65, 0xb1, 0xec, 0xc0, - 0x6c, 0xa0, 0xfd, 0xa7, 0xc2, 0x51, 0xaa, 0xd3, 0x1f, 0xef, 0xb7, 0x21, 0x30, 0x49, 0xaa, 0x05, - 0x5e, 0x66, 0xd8, 0xe0, 0x6e, 0xce, 0xf6, 0xdf, 0xb1, 0xe0, 0x01, 0x9d, 0x50, 0xbb, 0xbf, 0xda, - 0xcf, 0x9f, 0x5c, 0x87, 0xb1, 0xb0, 0x4d, 0x22, 0x27, 0xb5, 0xc9, 0xce, 0xcb, 0x4e, 0xbf, 0x2e, - 0xe0, 0x87, 0xfb, 0xb5, 0x93, 0x3a, 0x77, 0x09, 0xc7, 0xaa, 0x24, 0xb2, 0x61, 0x84, 0x75, 0x46, - 0x2c, 0xee, 0x16, 0xb3, 0xd4, 0x4d, 0xec, 0xb8, 0x2b, 0xc6, 0x02, 0x63, 0xff, 0x9c, 0xc5, 0x27, - 0x96, 0xde, 0x74, 0xf4, 0x1e, 0xcc, 0xec, 0x50, 0xf3, 0x6d, 0xe5, 0x4e, 0x3b, 0xe2, 0x6e, 0x74, - 0xd9, 0x4f, 0x4f, 0xf5, 0xeb, 0x27, 0xed, 0x23, 0x97, 0xaa, 0xa2, 0xcd, 0x33, 0x57, 0x33, 0xcc, - 0x70, 0x17, 0x7b, 0xfb, 0xcf, 0x4b, 0x7c, 0x25, 0x32, 0xad, 0xee, 0x09, 0x18, 0x6d, 0x87, 0xee, - 0xf2, 0x5a, 0x1d, 0x8b, 0x1e, 0x52, 0xe2, 0xaa, 0xc1, 0xc1, 0x58, 0xe2, 0xd1, 0x05, 0x00, 0x72, - 0x27, 0x21, 0x51, 0xe0, 0xf8, 0xea, 0x30, 0x5e, 0x29, 0x4f, 0x2b, 0x0a, 0x83, 0x35, 0x2a, 0x5a, - 0xa6, 0x1d, 0x85, 0xbb, 0x9e, 0xcb, 0x2e, 0x77, 0x94, 0xcd, 0x32, 0x0d, 0x85, 0xc1, 0x1a, 0x15, - 0x35, 0x95, 0x3b, 0x41, 0xcc, 0x37, 0x40, 0xe7, 0x96, 0x48, 0xa0, 0x33, 0x96, 0x9a, 0xca, 0x37, - 0x74, 0x24, 0x36, 0x69, 0xd1, 0x22, 0x8c, 0x24, 0x0e, 0x3b, 0x62, 0x1e, 0x2e, 0x0e, 0xd9, 0x59, - 0xa7, 0x14, 0x7a, 0x9e, 0x22, 0x5a, 0x00, 0x8b, 0x82, 0xe8, 0x2d, 0x29, 0x82, 0xb9, 0x48, 0x16, - 0xa1, 0x57, 0x85, 0xd3, 0x56, 0x17, 0xdf, 0xba, 0x0c, 0x16, 0x21, 0x5d, 0x06, 0x2f, 0xfb, 0x0b, - 0x15, 0x80, 0x54, 0xdb, 0x43, 0xef, 0x77, 0x89, 0x88, 0xa7, 0x7b, 0xeb, 0x87, 0xf7, 0x4e, 0x3e, - 0xa0, 0x2f, 0x5a, 0x30, 0xee, 0xf8, 0x7e, 0xd8, 0x72, 0x12, 0xd6, 0xcb, 0xa5, 0xde, 0x22, 0x4a, - 0xd4, 0xbf, 0x98, 0x96, 0xe0, 0x4d, 0x78, 0x4e, 0x9e, 0x1e, 0x6b, 0x98, 0xbe, 0xad, 0xd0, 0x2b, - 0x46, 0x3f, 0x26, 0x8d, 0x00, 0x3e, 0x3d, 0xe6, 0xb2, 0x46, 0x40, 0x85, 0x49, 0x63, 0x4d, 0xff, - 0x47, 0x37, 0x8c, 0xbc, 0x35, 0x43, 0xc5, 0x57, 0x74, 0x0d, 0xa5, 0xa7, 0x5f, 0xca, 0x1a, 0xd4, - 0xd0, 0x43, 0xd0, 0x87, 0x8b, 0xef, 0xb1, 0x6b, 0xda, 0x75, 0x9f, 0xf0, 0xf3, 0x77, 0x61, 0xda, - 0x35, 0xb7, 0x5b, 0x31, 0x9b, 0x1e, 0x2f, 0xe2, 0x9b, 0xd9, 0x9d, 0xd3, 0x0d, 0x36, 0x83, 0xc0, - 0x59, 0xc6, 0xa8, 0xc1, 0x2f, 0x03, 0xac, 0x05, 0x1b, 0xa1, 0x08, 0xe1, 0xb3, 0x0b, 0xc7, 0x72, - 0x2f, 0x4e, 0xc8, 0x0e, 0xa5, 0x4c, 0xf7, 0xd1, 0x6b, 0xa2, 0x2c, 0x56, 0x5c, 0xd0, 0x6b, 0x30, - 0xc2, 0x6e, 0x69, 0xc5, 0xd5, 0xb1, 0x62, 0x3f, 0xa0, 0x79, 0xc1, 0x38, 0x5d, 0x54, 0xec, 0x6f, - 0x8c, 0x05, 0x07, 0x74, 0x49, 0xa6, 0x09, 0x88, 0xd7, 0x82, 0x1b, 0x31, 0x61, 0x69, 0x02, 0x2a, - 0x4b, 0x1f, 0x4f, 0x33, 0x00, 0x70, 0x78, 0x6e, 0x46, 0x42, 0xa3, 0x24, 0xd5, 0x57, 0xc4, 0x7f, - 0x99, 0xe8, 0xb0, 0x0a, 0xc5, 0xcd, 0x33, 0x93, 0x21, 0xa6, 0xdd, 0x79, 0xd3, 0x64, 0x81, 0xb3, - 0x3c, 0x8f, 0x75, 0xfb, 0x9c, 0x0b, 0x60, 0x26, 0xbb, 0xb0, 0xee, 0xeb, 0x76, 0xfd, 0xfd, 0x21, - 0x98, 0x32, 0x27, 0x02, 0x5a, 0x80, 0x8a, 0x60, 0xa2, 0x92, 0x7c, 0xa9, 0xb9, 0x7d, 0x55, 0x22, - 0x70, 0x4a, 0xc3, 0x92, 0x9c, 0xb1, 0xe2, 0x5a, 0x6c, 0x56, 0x9a, 0xe4, 0x4c, 0x61, 0xb0, 0x46, - 0x45, 0x95, 0xe8, 0x5b, 0x61, 0x98, 0xa8, 0xad, 0x40, 0xcd, 0x96, 0x25, 0x06, 0xc5, 0x02, 0x4b, - 0xb7, 0x80, 0x6d, 0x12, 0x05, 0xc4, 0x37, 0x3d, 0x99, 0x6a, 0x0b, 0xb8, 0xac, 0x23, 0xb1, 0x49, - 0x4b, 0xb7, 0xb4, 0x30, 0x66, 0xd3, 0x4f, 0xa8, 0xea, 0x69, 0xac, 0x5b, 0x93, 0xdf, 0x52, 0x94, - 0x78, 0xf4, 0x26, 0x3c, 0xa0, 0x2e, 0x15, 0x62, 0xee, 0x19, 0x96, 0x35, 0x8e, 0x18, 0x96, 0xf5, - 0x03, 0xcb, 0xf9, 0x64, 0xb8, 0xa8, 0x3c, 0x7a, 0x15, 0xa6, 0x84, 0x0a, 0x2c, 0x39, 0x8e, 0x9a, - 0xc1, 0x0a, 0x97, 0x0d, 0x2c, 0xce, 0x50, 0xa3, 0x3a, 0xcc, 0x50, 0x08, 0xd3, 0x42, 0x25, 0x07, - 0x7e, 0x39, 0x52, 0xed, 0xf5, 0x97, 0x33, 0x78, 0xdc, 0x55, 0x02, 0x2d, 0xc2, 0x34, 0xd7, 0x51, - 0xa8, 0x4d, 0xc9, 0xc6, 0x41, 0x44, 0xd6, 0xaa, 0x85, 0x70, 0xdd, 0x44, 0xe3, 0x2c, 0x3d, 0x7a, - 0x09, 0x26, 0x9c, 0xa8, 0xb5, 0xe5, 0x25, 0xa4, 0x95, 0x74, 0x22, 0x9e, 0x84, 0x43, 0x8b, 0xf6, - 0x58, 0xd4, 0x70, 0xd8, 0xa0, 0xb4, 0xdf, 0x87, 0x13, 0x39, 0x41, 0xf9, 0x74, 0xe2, 0x38, 0x6d, - 0x4f, 0x7e, 0x53, 0x26, 0x6a, 0x6d, 0xb1, 0xb1, 0x26, 0xbf, 0x46, 0xa3, 0xa2, 0xb3, 0x93, 0xb9, - 0xc4, 0xb5, 0x6c, 0xa4, 0x6a, 0x76, 0xae, 0x4a, 0x04, 0x4e, 0x69, 0xec, 0x6f, 0x01, 0x68, 0x0e, - 0x9d, 0x01, 0x62, 0x96, 0x5e, 0x82, 0x09, 0x99, 0x42, 0x57, 0x4b, 0xdd, 0xa8, 0x3e, 0xf3, 0xa2, - 0x86, 0xc3, 0x06, 0x25, 0x6d, 0x5b, 0xa0, 0x12, 0x4f, 0x66, 0x62, 0xe4, 0xd2, 0xb4, 0x93, 0x29, - 0x0d, 0x7a, 0x1a, 0xc6, 0x62, 0xe2, 0x6f, 0x5c, 0xf1, 0x82, 0x6d, 0x31, 0xb1, 0x95, 0x14, 0x6e, - 0x0a, 0x38, 0x56, 0x14, 0x68, 0x09, 0xca, 0x1d, 0xcf, 0x15, 0x53, 0x59, 0x6e, 0xf8, 0xe5, 0x1b, - 0x6b, 0xf5, 0xc3, 0xfd, 0xda, 0x23, 0x45, 0x99, 0x81, 0xa9, 0x69, 0x1f, 0xcf, 0xd3, 0xe5, 0x47, - 0x0b, 0xe7, 0x9d, 0x0d, 0x8c, 0x1c, 0xf1, 0x6c, 0xe0, 0x02, 0x80, 0xf8, 0x6a, 0x39, 0x97, 0xcb, - 0xe9, 0xa8, 0x5d, 0x54, 0x18, 0xac, 0x51, 0xa1, 0x18, 0x66, 0x5b, 0x11, 0x71, 0xa4, 0x0d, 0xcd, - 0xc3, 0xcb, 0xc7, 0xee, 0xde, 0x41, 0xb0, 0x9c, 0x65, 0x86, 0xbb, 0xf9, 0xa3, 0x10, 0x66, 0x5d, - 0x71, 0x87, 0x35, 0xad, 0xb4, 0x72, 0xf4, 0x98, 0x76, 0x16, 0x90, 0x93, 0x65, 0x84, 0xbb, 0x79, - 0xa3, 0x77, 0x60, 0x4e, 0x02, 0xbb, 0xaf, 0x0d, 0xb3, 0xe5, 0x52, 0x5e, 0x3a, 0x7b, 0xb0, 0x5f, - 0x9b, 0xab, 0x17, 0x52, 0xe1, 0x1e, 0x1c, 0x10, 0x86, 0x11, 0x76, 0x96, 0x14, 0x57, 0xc7, 0xd9, - 0x3e, 0xf7, 0x64, 0xb1, 0x33, 0x80, 0xce, 0xf5, 0x79, 0x76, 0x0e, 0x25, 0xc2, 0x7c, 0xd3, 0x63, - 0x39, 0x06, 0xc4, 0x82, 0x13, 0xda, 0x80, 0x71, 0x27, 0x08, 0xc2, 0xc4, 0xe1, 0x2a, 0xd4, 0x44, - 0xb1, 0xee, 0xa7, 0x31, 0x5e, 0x4c, 0x4b, 0x70, 0xee, 0x2a, 0x72, 0x50, 0xc3, 0x60, 0x9d, 0x31, - 0xba, 0x0d, 0xd3, 0xe1, 0x6d, 0x2a, 0x1c, 0xa5, 0x97, 0x22, 0xae, 0x4e, 0xb2, 0xba, 0x9e, 0x1f, - 0xd0, 0x4f, 0x6b, 0x14, 0xd6, 0xa4, 0x96, 0xc9, 0x14, 0x67, 0x6b, 0x41, 0xf3, 0x86, 0xb7, 0x7a, - 0x2a, 0x8d, 0x67, 0x4f, 0xbd, 0xd5, 0xba, 0x73, 0x9a, 0x5d, 0x43, 0xe7, 0x61, 0xab, 0x6c, 0xf5, - 0x4f, 0x67, 0xae, 0xa1, 0xa7, 0x28, 0xac, 0xd3, 0xa1, 0x2d, 0x98, 0x48, 0x8f, 0xac, 0xa2, 0x98, - 0x65, 0xa9, 0x19, 0xbf, 0x70, 0x61, 0xb0, 0x8f, 0x5b, 0xd3, 0x4a, 0x72, 0xcb, 0x41, 0x87, 0x60, - 0x83, 0xf3, 0xdc, 0x8f, 0xc3, 0xb8, 0x36, 0xb0, 0x47, 0x89, 0xca, 0x9e, 0x7b, 0x15, 0x66, 0xb2, - 0x43, 0x77, 0xa4, 0xa8, 0xee, 0xff, 0x59, 0x82, 0xe9, 0x9c, 0x93, 0x2b, 0x96, 0x5d, 0x38, 0x23, - 0x50, 0xd3, 0x64, 0xc2, 0xa6, 0x58, 0x2c, 0x0d, 0x20, 0x16, 0xa5, 0x8c, 0x2e, 0x17, 0xca, 0x68, - 0x21, 0x0a, 0x87, 0x3e, 0x88, 0x28, 0x34, 0x77, 0x9f, 0xe1, 0x81, 0x76, 0x9f, 0x7b, 0x20, 0x3e, - 0x8d, 0x0d, 0x6c, 0x74, 0x80, 0x0d, 0xec, 0x17, 0x4b, 0x30, 0x93, 0x4d, 0xc1, 0x7c, 0x0c, 0xe7, - 0x1d, 0xaf, 0x19, 0xe7, 0x1d, 0xf9, 0xb9, 0xba, 0xb3, 0x89, 0xa1, 0x8b, 0xce, 0x3e, 0x70, 0xe6, - 0xec, 0xe3, 0xc9, 0x81, 0xb8, 0xf5, 0x3e, 0x07, 0xf9, 0xbb, 0x25, 0x38, 0x95, 0x2d, 0xb2, 0xec, - 0x3b, 0xde, 0xce, 0x31, 0xf4, 0xcd, 0x75, 0xa3, 0x6f, 0x9e, 0x19, 0xe4, 0x6b, 0x58, 0xd3, 0x0a, - 0x3b, 0xe8, 0x8d, 0x4c, 0x07, 0x2d, 0x0c, 0xce, 0xb2, 0x77, 0x2f, 0x7d, 0xcb, 0x82, 0x33, 0xb9, - 0xe5, 0x8e, 0xc1, 0xfb, 0x7a, 0xcd, 0xf4, 0xbe, 0x3e, 0x31, 0xf0, 0x37, 0x15, 0xb8, 0x63, 0xbf, - 0x52, 0x2e, 0xf8, 0x16, 0xe6, 0xbf, 0xba, 0x0e, 0xe3, 0x4e, 0xab, 0x45, 0xe2, 0xf8, 0x6a, 0xe8, - 0xaa, 0xb4, 0x56, 0xcf, 0xb0, 0x3d, 0x29, 0x05, 0x1f, 0xee, 0xd7, 0xe6, 0xb2, 0x2c, 0x52, 0x34, - 0xd6, 0x39, 0x98, 0xa9, 0xf2, 0x4a, 0xf7, 0x34, 0x55, 0xde, 0x05, 0x80, 0x5d, 0x65, 0xd5, 0x66, - 0x9d, 0x61, 0x9a, 0xbd, 0xab, 0x51, 0xa1, 0x9f, 0x66, 0xba, 0x22, 0x0f, 0x19, 0xe1, 0x87, 0x1c, - 0xcf, 0x0d, 0x38, 0x56, 0x7a, 0xf8, 0x09, 0xbf, 0x08, 0xab, 0x1c, 0x87, 0x8a, 0x25, 0xfa, 0x49, - 0x98, 0x89, 0x79, 0xae, 0x85, 0x65, 0xdf, 0x89, 0xd9, 0xf5, 0x0b, 0x21, 0x13, 0xd9, 0xed, 0xd6, - 0x66, 0x06, 0x87, 0xbb, 0xa8, 0xed, 0x7f, 0x58, 0x86, 0x07, 0x7b, 0x4c, 0x51, 0xb4, 0x68, 0x1e, - 0xf1, 0x3e, 0x95, 0xf5, 0xee, 0xcc, 0xe5, 0x16, 0x36, 0xdc, 0x3d, 0x99, 0x31, 0x2e, 0x7d, 0xe0, - 0x31, 0xfe, 0x92, 0xa5, 0xf9, 0xdd, 0x78, 0x20, 0xe8, 0xa7, 0x8f, 0xb8, 0xf4, 0x7e, 0x58, 0x1d, - 0xf5, 0x9f, 0xb7, 0xe0, 0x91, 0xdc, 0xcf, 0x32, 0x42, 0x45, 0x16, 0xa0, 0xd2, 0xa2, 0x40, 0xed, - 0x8a, 0x54, 0x7a, 0x51, 0x51, 0x22, 0x70, 0x4a, 0x63, 0x44, 0x84, 0x94, 0xfa, 0x46, 0x84, 0xfc, - 0x73, 0x0b, 0x4e, 0x66, 0x1b, 0x71, 0x0c, 0x92, 0x69, 0xcd, 0x94, 0x4c, 0x1f, 0x1f, 0x64, 0xc8, - 0x0b, 0x84, 0xd2, 0x77, 0xa7, 0xe0, 0x74, 0xc1, 0x03, 0x09, 0xbb, 0x30, 0xbb, 0xd9, 0x22, 0xe6, - 0xe5, 0x33, 0xf1, 0x31, 0xb9, 0xf7, 0xf4, 0x7a, 0xde, 0x54, 0xe3, 0x66, 0x48, 0x17, 0x09, 0xee, - 0xae, 0x02, 0x7d, 0xde, 0x82, 0x93, 0xce, 0xed, 0xb8, 0xeb, 0xc1, 0x17, 0x31, 0x67, 0x9e, 0xcf, - 0xf5, 0x8e, 0xf5, 0x79, 0x20, 0x86, 0x5d, 0x10, 0x39, 0x99, 0x47, 0x85, 0x73, 0xeb, 0x42, 0x58, - 0x64, 0xf6, 0xa3, 0x5a, 0x4e, 0x8f, 0xeb, 0x91, 0x79, 0x97, 0x57, 0xb8, 0x8c, 0x92, 0x18, 0xac, - 0xf8, 0xa0, 0x9b, 0x50, 0xd9, 0x94, 0x37, 0xca, 0x84, 0x0c, 0xcc, 0xdd, 0x54, 0x72, 0xaf, 0x9d, - 0xf1, 0x88, 0x7d, 0x85, 0xc2, 0x29, 0x2b, 0xf4, 0x2a, 0x94, 0x83, 0x8d, 0x58, 0x5c, 0xd5, 0xce, - 0x8f, 0xef, 0x31, 0x23, 0xa8, 0xf8, 0x3d, 0xd7, 0x6b, 0xab, 0x4d, 0x4c, 0x0b, 0xd2, 0xf2, 0xd1, - 0x2d, 0x57, 0x38, 0x74, 0x73, 0xcb, 0xe3, 0xa5, 0x7a, 0x77, 0x79, 0xbc, 0x54, 0xc7, 0xb4, 0x20, - 0x5a, 0x85, 0x61, 0x76, 0x41, 0x45, 0x78, 0x6b, 0x73, 0xef, 0xe9, 0x77, 0x5d, 0xbe, 0xe1, 0x17, - 0x5f, 0x19, 0x18, 0xf3, 0xe2, 0xe8, 0x35, 0x18, 0x69, 0xb1, 0x9c, 0xfd, 0xc2, 0xb4, 0xce, 0xcf, - 0x3d, 0xd1, 0x95, 0xd5, 0x9f, 0x9f, 0x51, 0x71, 0x38, 0x16, 0x1c, 0x18, 0x2f, 0xd2, 0xde, 0xda, - 0x88, 0x85, 0xc5, 0x9c, 0xcf, 0xab, 0xeb, 0x7d, 0x05, 0xc1, 0x8b, 0xc1, 0xb1, 0xe0, 0x80, 0x3e, - 0x05, 0xa5, 0x8d, 0x96, 0xb8, 0xa1, 0x92, 0xeb, 0x9b, 0x35, 0xaf, 0x20, 0x2f, 0x8d, 0x1c, 0xec, - 0xd7, 0x4a, 0xab, 0xcb, 0xb8, 0xb4, 0xd1, 0x42, 0xd7, 0x60, 0x74, 0x83, 0xdf, 0x23, 0x15, 0xf9, - 0x59, 0x1f, 0xcf, 0xbf, 0xe2, 0xda, 0x75, 0xd5, 0x94, 0xdf, 0xac, 0x10, 0x08, 0x2c, 0x99, 0xa0, - 0x75, 0x80, 0x0d, 0x75, 0x1f, 0x56, 0x24, 0x68, 0xfd, 0xf8, 0x20, 0xb7, 0x66, 0x85, 0xd1, 0xa8, - 0xa0, 0x58, 0xe3, 0x83, 0x3e, 0x0b, 0x15, 0x47, 0x3e, 0x1c, 0xc2, 0x92, 0xb3, 0x9a, 0xbb, 0x73, - 0xba, 0xcc, 0x7a, 0xbf, 0xa9, 0xc2, 0xe7, 0xa8, 0x22, 0xc2, 0x29, 0x53, 0xb4, 0x0d, 0x93, 0xbb, - 0x71, 0x7b, 0x8b, 0xc8, 0x65, 0xc9, 0x32, 0xb6, 0x9a, 0x06, 0x66, 0x9a, 0x5e, 0x57, 0x10, 0x7a, - 0x51, 0xd2, 0x71, 0xfc, 0x2e, 0x49, 0xc2, 0xae, 0xe1, 0xdc, 0xd4, 0x99, 0x61, 0x93, 0x37, 0xed, - 0xf4, 0xf7, 0x3a, 0xe1, 0xad, 0xbd, 0x84, 0x88, 0x3c, 0xae, 0xb9, 0x9d, 0xfe, 0x3a, 0x27, 0xe9, - 0xee, 0x74, 0x81, 0xc0, 0x92, 0x09, 0x5d, 0xb8, 0x8e, 0x7c, 0x94, 0x47, 0x58, 0xc6, 0x4f, 0x14, - 0x76, 0x4f, 0x57, 0x7b, 0xd3, 0x4e, 0x61, 0x12, 0x2f, 0x65, 0xc5, 0x24, 0x5d, 0x7b, 0x2b, 0x4c, - 0xc2, 0x20, 0x23, 0x65, 0x67, 0x8b, 0x25, 0x5d, 0x23, 0x87, 0xbe, 0x5b, 0xd2, 0xe5, 0x51, 0xe1, - 0xdc, 0xba, 0x90, 0x0b, 0x53, 0xed, 0x30, 0x4a, 0x6e, 0x87, 0x91, 0x9c, 0x55, 0xa8, 0x87, 0xc9, - 0x64, 0x50, 0x8a, 0x1a, 0x59, 0x54, 0xad, 0x89, 0xc1, 0x19, 0x9e, 0x74, 0x48, 0xe2, 0x96, 0xe3, - 0x93, 0xb5, 0xeb, 0xd5, 0x13, 0xc5, 0x43, 0xd2, 0xe4, 0x24, 0xdd, 0x43, 0x22, 0x10, 0x58, 0x32, - 0xa1, 0x32, 0x87, 0xa5, 0x04, 0x67, 0x89, 0x67, 0x0b, 0x64, 0x4e, 0x57, 0xbc, 0x29, 0x97, 0x39, - 0x0c, 0x8c, 0x79, 0x71, 0x3a, 0xf3, 0x85, 0x26, 0x18, 0xc6, 0xd5, 0x53, 0xc5, 0x33, 0x5f, 0x28, - 0x90, 0xd7, 0x9b, 0xbd, 0x66, 0xbe, 0x22, 0xc2, 0x29, 0x53, 0xfb, 0x0b, 0x23, 0xdd, 0x3a, 0x02, - 0xd3, 0xf8, 0xbf, 0x60, 0x75, 0x1d, 0x9a, 0x7e, 0x72, 0x50, 0x33, 0xf5, 0x1e, 0x1e, 0x9f, 0x7e, - 0xde, 0x82, 0xd3, 0xed, 0xdc, 0x8f, 0x12, 0x1b, 0xee, 0x60, 0xd6, 0x2e, 0xef, 0x06, 0x95, 0xd2, - 0x39, 0x1f, 0x8f, 0x0b, 0x6a, 0xca, 0x6a, 0xc6, 0xe5, 0x0f, 0xac, 0x19, 0x5f, 0x85, 0x31, 0xa6, - 0xd4, 0xa5, 0xe9, 0x63, 0x06, 0x0a, 0x3d, 0x62, 0x5b, 0xf7, 0xb2, 0x28, 0x88, 0x15, 0x0b, 0xf4, - 0xf3, 0x16, 0x3c, 0x9c, 0x6d, 0x3a, 0x26, 0x0c, 0x2d, 0xd2, 0x11, 0x72, 0x63, 0x63, 0x55, 0x7c, - 0xff, 0xc3, 0x8d, 0x5e, 0xc4, 0x87, 0xfd, 0x08, 0x70, 0xef, 0xca, 0x50, 0x3d, 0xc7, 0xda, 0x19, - 0x31, 0xcf, 0x54, 0xfa, 0x5b, 0x3c, 0xc7, 0xab, 0xaf, 0x7f, 0xd5, 0xca, 0x51, 0x34, 0xb9, 0x65, - 0xf5, 0x8a, 0x69, 0x59, 0x3d, 0x96, 0xb5, 0xac, 0xba, 0xfc, 0x24, 0x86, 0x51, 0x35, 0x78, 0xc2, - 0xd4, 0x41, 0x33, 0xe5, 0xd8, 0x3e, 0x9c, 0xeb, 0x27, 0x66, 0x59, 0x20, 0x95, 0xab, 0x4e, 0x18, - 0xd3, 0x40, 0x2a, 0x77, 0xad, 0x8e, 0x19, 0x66, 0xd0, 0x9c, 0x0b, 0xf6, 0x7f, 0xb5, 0xa0, 0xdc, - 0x08, 0xdd, 0x63, 0xf0, 0xfb, 0x7c, 0xda, 0xf0, 0xfb, 0x3c, 0x58, 0xf0, 0x58, 0x5f, 0xa1, 0x97, - 0x67, 0x25, 0xe3, 0xe5, 0x79, 0xb8, 0x88, 0x41, 0x6f, 0x9f, 0xce, 0xdf, 0x2b, 0x83, 0xfe, 0xb4, - 0x20, 0xfa, 0x57, 0x77, 0x13, 0x91, 0x5b, 0xee, 0xf5, 0xda, 0xa0, 0xe0, 0xcc, 0xe2, 0xaf, 0xe4, - 0x65, 0xbf, 0x1f, 0xb2, 0xc0, 0xdc, 0x37, 0x88, 0xb7, 0xb9, 0x95, 0x10, 0x37, 0xfb, 0x39, 0xc7, - 0x17, 0x98, 0xfb, 0x9f, 0x2c, 0x98, 0xce, 0xd4, 0x8e, 0xfc, 0xbc, 0x9b, 0x43, 0x77, 0xe9, 0xc9, - 0x99, 0xed, 0x7b, 0xd5, 0x68, 0x1e, 0x40, 0x39, 0xd5, 0xa5, 0xb7, 0x84, 0x69, 0xb1, 0xca, 0xeb, - 0x1e, 0x63, 0x8d, 0x02, 0xbd, 0x00, 0xe3, 0x49, 0xd8, 0x0e, 0xfd, 0x70, 0x73, 0xef, 0x32, 0x91, - 0x59, 0x3e, 0xd4, 0xd1, 0xc7, 0x7a, 0x8a, 0xc2, 0x3a, 0x9d, 0xfd, 0x6b, 0x65, 0xc8, 0x3e, 0x47, - 0xf9, 0xff, 0xe6, 0xe4, 0x47, 0x73, 0x4e, 0x7e, 0xdb, 0x82, 0x19, 0x5a, 0x3b, 0x8b, 0x6d, 0x91, - 0x21, 0xad, 0xea, 0x65, 0x05, 0xab, 0xc7, 0xcb, 0x0a, 0x8f, 0x51, 0xd9, 0xe5, 0x86, 0x9d, 0x44, - 0x78, 0x75, 0x34, 0xe1, 0x44, 0xa1, 0x58, 0x60, 0x05, 0x1d, 0x89, 0x22, 0x71, 0x1f, 0x48, 0xa7, - 0x23, 0x51, 0x84, 0x05, 0x56, 0x3e, 0xbc, 0x30, 0x54, 0xf0, 0xf0, 0x02, 0x4b, 0x90, 0x25, 0xe2, - 0x29, 0x84, 0x6a, 0xa0, 0x25, 0xc8, 0x92, 0x81, 0x16, 0x29, 0x8d, 0xfd, 0xb5, 0x32, 0x4c, 0x34, - 0x42, 0x37, 0x8d, 0x82, 0x7f, 0xde, 0x88, 0x82, 0x3f, 0x97, 0x89, 0x82, 0x9f, 0xd1, 0x69, 0xef, - 0x4d, 0x10, 0xbc, 0x48, 0x9f, 0xc6, 0x9e, 0x01, 0xb9, 0xcb, 0x00, 0x78, 0x23, 0x7d, 0x9a, 0x62, - 0x84, 0x4d, 0xbe, 0x3f, 0x4a, 0x81, 0xef, 0x7f, 0x61, 0xc1, 0x54, 0x23, 0x74, 0xe9, 0x04, 0xfd, - 0x51, 0x9a, 0x8d, 0x7a, 0xfa, 0xb5, 0x91, 0x1e, 0xe9, 0xd7, 0xfe, 0xbe, 0x05, 0xa3, 0x8d, 0xd0, - 0x3d, 0x06, 0x8f, 0xe7, 0x2b, 0xa6, 0xc7, 0xf3, 0x81, 0x02, 0x29, 0x5b, 0xe0, 0xe4, 0xfc, 0xed, - 0x32, 0x4c, 0xd2, 0x76, 0x86, 0x9b, 0x72, 0x94, 0x8c, 0x1e, 0xb1, 0x06, 0xe8, 0x11, 0xaa, 0xcc, - 0x85, 0xbe, 0x1f, 0xde, 0xce, 0x8e, 0xd8, 0x2a, 0x83, 0x62, 0x81, 0x45, 0x4f, 0xc3, 0x58, 0x3b, - 0x22, 0xbb, 0x5e, 0xd8, 0x89, 0xb3, 0x37, 0x0a, 0x1b, 0x02, 0x8e, 0x15, 0x05, 0x7a, 0x1e, 0x26, - 0x62, 0x2f, 0x68, 0x11, 0x19, 0x63, 0x31, 0xc4, 0x62, 0x2c, 0x78, 0x06, 0x4b, 0x0d, 0x8e, 0x0d, - 0x2a, 0xf4, 0x06, 0x54, 0xd8, 0x7f, 0xb6, 0x6e, 0x8e, 0xfe, 0xae, 0x02, 0x37, 0x55, 0x25, 0x03, - 0x9c, 0xf2, 0x42, 0x17, 0x00, 0x12, 0x19, 0x0d, 0x12, 0x8b, 0x0b, 0xaf, 0x4a, 0xa3, 0x54, 0x71, - 0x22, 0x31, 0xd6, 0xa8, 0xd0, 0x53, 0x50, 0x49, 0x1c, 0xcf, 0xbf, 0xe2, 0x05, 0x24, 0x16, 0xd1, - 0x34, 0x22, 0x2b, 0xb4, 0x00, 0xe2, 0x14, 0x4f, 0x77, 0x74, 0x76, 0x9d, 0x9a, 0xbf, 0xca, 0x32, - 0xc6, 0xa8, 0xd9, 0x8e, 0x7e, 0x45, 0x41, 0xb1, 0x46, 0x61, 0xbf, 0x04, 0xa7, 0x1a, 0xa1, 0xdb, - 0x08, 0xa3, 0x64, 0x35, 0x8c, 0x6e, 0x3b, 0x91, 0x2b, 0xc7, 0xaf, 0x26, 0x13, 0x14, 0xd3, 0x5d, - 0x77, 0x98, 0xdb, 0xf5, 0x46, 0xea, 0xe1, 0xe7, 0xd8, 0x9e, 0x7e, 0xc4, 0xab, 0x0f, 0xff, 0xb6, - 0x04, 0xa8, 0xc1, 0xe2, 0x55, 0x8c, 0xa7, 0x7b, 0xde, 0x81, 0xa9, 0x98, 0x5c, 0xf1, 0x82, 0xce, - 0x1d, 0xc1, 0xaa, 0xd7, 0xbd, 0x92, 0xe6, 0x8a, 0x4e, 0xc9, 0x7d, 0x23, 0x26, 0x0c, 0x67, 0xb8, - 0xd1, 0x2e, 0x8c, 0x3a, 0xc1, 0x62, 0x7c, 0x23, 0x26, 0x91, 0x78, 0xaa, 0x86, 0x75, 0x21, 0x96, - 0x40, 0x9c, 0xe2, 0xe9, 0x94, 0x61, 0x7f, 0xae, 0x85, 0x01, 0x0e, 0xc3, 0x44, 0x4e, 0x32, 0xf6, - 0xd8, 0x81, 0x06, 0xc7, 0x06, 0x15, 0x5a, 0x05, 0x14, 0x77, 0xda, 0x6d, 0x9f, 0x1d, 0xef, 0x39, - 0xfe, 0xc5, 0x28, 0xec, 0xb4, 0x79, 0xc0, 0xb1, 0x78, 0x27, 0xa0, 0xd9, 0x85, 0xc5, 0x39, 0x25, - 0xa8, 0x60, 0xd8, 0x88, 0xd9, 0x6f, 0x71, 0xa3, 0x9a, 0x7b, 0x29, 0x9b, 0x0c, 0x84, 0x25, 0xce, - 0xfe, 0x1c, 0xdb, 0xcc, 0xd8, 0x0b, 0x23, 0x49, 0x27, 0x22, 0x68, 0x07, 0x26, 0xdb, 0x6c, 0xc3, - 0x4a, 0xa2, 0xd0, 0xf7, 0x89, 0xd4, 0x1b, 0xef, 0x2e, 0x76, 0x86, 0xbf, 0x38, 0xa0, 0xb3, 0xc3, - 0x26, 0x77, 0xfb, 0x0b, 0xd3, 0x4c, 0x2e, 0x35, 0xb9, 0xd1, 0x32, 0x2a, 0x22, 0x62, 0x85, 0x86, - 0x36, 0x57, 0xfc, 0xa2, 0x57, 0x2a, 0xe9, 0x45, 0x54, 0x2d, 0x96, 0x65, 0xd1, 0xeb, 0x2c, 0x52, - 0x9b, 0x0b, 0x83, 0x7e, 0x6f, 0x09, 0x72, 0x2a, 0x23, 0x4a, 0x5b, 0x14, 0xc4, 0x1a, 0x13, 0x74, - 0x05, 0x26, 0xc5, 0x83, 0x14, 0xc2, 0x85, 0x50, 0x36, 0xcc, 0xdf, 0x49, 0xac, 0x23, 0x0f, 0xb3, - 0x00, 0x6c, 0x16, 0x46, 0x9b, 0xf0, 0xb0, 0xf6, 0x7c, 0x52, 0x4e, 0xfc, 0x16, 0x97, 0x2d, 0x8f, - 0x1c, 0xec, 0xd7, 0x1e, 0x5e, 0xef, 0x45, 0x88, 0x7b, 0xf3, 0x41, 0xd7, 0xe1, 0x94, 0xd3, 0x4a, - 0xbc, 0x5d, 0x52, 0x27, 0x8e, 0xeb, 0x7b, 0x01, 0x31, 0xaf, 0xd8, 0x9f, 0x39, 0xd8, 0xaf, 0x9d, - 0x5a, 0xcc, 0x23, 0xc0, 0xf9, 0xe5, 0xd0, 0x2b, 0x50, 0x71, 0x83, 0x58, 0xf4, 0xc1, 0x88, 0xf1, - 0x32, 0x58, 0xa5, 0x7e, 0xad, 0xa9, 0xbe, 0x3f, 0xfd, 0x83, 0xd3, 0x02, 0x68, 0x93, 0xbf, 0x9b, - 0xaf, 0x2c, 0x92, 0xd1, 0xae, 0xbc, 0x09, 0x59, 0xdb, 0xd6, 0xb8, 0x7b, 0xc2, 0xfd, 0x67, 0x2a, - 0x3a, 0xd2, 0xb8, 0x96, 0x62, 0x30, 0x46, 0xaf, 0x01, 0x8a, 0x49, 0xb4, 0xeb, 0xb5, 0xc8, 0x62, - 0x8b, 0xa5, 0x78, 0x65, 0x5e, 0x97, 0x31, 0x23, 0xd4, 0x1f, 0x35, 0xbb, 0x28, 0x70, 0x4e, 0x29, - 0x74, 0x89, 0x4a, 0x14, 0x1d, 0x2a, 0x82, 0x59, 0xa5, 0x9a, 0x57, 0xad, 0x93, 0x76, 0x44, 0x5a, - 0x4e, 0x42, 0x5c, 0x93, 0x23, 0xce, 0x94, 0xa3, 0xfb, 0x8d, 0xca, 0x9c, 0x0f, 0x66, 0x08, 0x66, - 0x77, 0xf6, 0x7c, 0x6a, 0x21, 0x6d, 0x85, 0x71, 0x72, 0x8d, 0x24, 0xb7, 0xc3, 0x68, 0x5b, 0xe4, - 0xc5, 0x4a, 0xd3, 0xe6, 0xa5, 0x28, 0xac, 0xd3, 0x51, 0x8d, 0x88, 0x1d, 0x62, 0xad, 0xd5, 0xd9, - 0x89, 0xc3, 0x58, 0xba, 0x4e, 0x2e, 0x71, 0x30, 0x96, 0x78, 0x49, 0xba, 0xd6, 0x58, 0x66, 0xe7, - 0x08, 0x19, 0xd2, 0xb5, 0xc6, 0x32, 0x96, 0x78, 0x44, 0xba, 0x5f, 0x5d, 0x9b, 0x2a, 0x3e, 0xab, - 0xe9, 0x96, 0xcb, 0x03, 0x3e, 0xbc, 0x16, 0xc0, 0x8c, 0x7a, 0xef, 0x8d, 0x27, 0x0c, 0x8b, 0xab, - 0xd3, 0xc5, 0x0f, 0xf8, 0xe7, 0x66, 0x1b, 0x53, 0x5e, 0xb5, 0xb5, 0x0c, 0x27, 0xdc, 0xc5, 0xdb, - 0x48, 0xdd, 0x30, 0xd3, 0xf7, 0xe5, 0x83, 0x05, 0xa8, 0xc4, 0x9d, 0x5b, 0x6e, 0xb8, 0xe3, 0x78, - 0x01, 0x73, 0xfb, 0xeb, 0xaf, 0xac, 0x4b, 0x04, 0x4e, 0x69, 0xd0, 0x2a, 0x8c, 0x39, 0xc2, 0xf8, - 0x12, 0x8e, 0xfa, 0xdc, 0xbb, 0xdc, 0xd2, 0x40, 0xe3, 0x1e, 0x4d, 0xf9, 0x0f, 0xab, 0xb2, 0xe8, - 0x65, 0x98, 0x14, 0xd7, 0x8d, 0x44, 0xa4, 0xe0, 0x09, 0x33, 0x32, 0xbd, 0xa9, 0x23, 0xb1, 0x49, - 0x8b, 0x7e, 0x1a, 0xa6, 0x28, 0x97, 0x54, 0xb0, 0x55, 0x4f, 0x0e, 0x22, 0x11, 0xb5, 0x8c, 0xd6, - 0x7a, 0x61, 0x9c, 0x61, 0x86, 0x5c, 0x78, 0xc8, 0xe9, 0x24, 0xe1, 0x0e, 0x9d, 0xe1, 0xe6, 0xfc, - 0x5f, 0x0f, 0xb7, 0x49, 0xc0, 0xfc, 0xf4, 0x63, 0x4b, 0xe7, 0x0e, 0xf6, 0x6b, 0x0f, 0x2d, 0xf6, - 0xa0, 0xc3, 0x3d, 0xb9, 0xa0, 0x1b, 0x30, 0x9e, 0x84, 0xbe, 0x08, 0xf1, 0x8d, 0xab, 0xa7, 0x8b, - 0x53, 0xcf, 0xac, 0x2b, 0x32, 0xdd, 0x9d, 0xa0, 0x8a, 0x62, 0x9d, 0x0f, 0x5a, 0xe7, 0x6b, 0x8c, - 0x25, 0x4a, 0x24, 0x71, 0xf5, 0x81, 0xe2, 0x8e, 0x51, 0xf9, 0x14, 0xcd, 0x25, 0x28, 0x4a, 0x62, - 0x9d, 0x0d, 0xba, 0x08, 0xb3, 0xed, 0xc8, 0x0b, 0xd9, 0xc4, 0x56, 0x2e, 0xdf, 0xaa, 0x91, 0x94, - 0x6c, 0xb6, 0x91, 0x25, 0xc0, 0xdd, 0x65, 0xd0, 0x79, 0xaa, 0xa0, 0x72, 0x60, 0xf5, 0x0c, 0x7f, - 0x11, 0x83, 0x2b, 0xa7, 0x1c, 0x86, 0x15, 0x76, 0xee, 0x27, 0x60, 0xb6, 0x4b, 0x52, 0x1e, 0x29, - 0xdc, 0xf2, 0x37, 0x86, 0xa1, 0xa2, 0xdc, 0x81, 0x68, 0xc1, 0xf4, 0xf2, 0x9e, 0xc9, 0x7a, 0x79, - 0xc7, 0xa8, 0xbe, 0xa6, 0x3b, 0x76, 0xd7, 0x73, 0x1e, 0xf5, 0x3e, 0x57, 0x20, 0x1a, 0x06, 0xbf, - 0x1b, 0x75, 0x84, 0x07, 0xcf, 0x53, 0x83, 0x71, 0xa8, 0xa7, 0xc1, 0x38, 0xe0, 0x03, 0x7b, 0xd4, - 0x34, 0x6c, 0x87, 0xee, 0x5a, 0x23, 0xfb, 0xe2, 0x54, 0x83, 0x02, 0x31, 0xc7, 0x31, 0xe5, 0x9e, - 0x6e, 0xeb, 0x4c, 0xb9, 0x1f, 0xbd, 0x4b, 0xe5, 0x5e, 0x32, 0xc0, 0x29, 0x2f, 0xe4, 0xc3, 0x6c, - 0xcb, 0x7c, 0x2c, 0x4c, 0xdd, 0x87, 0x7a, 0xb4, 0xef, 0xb3, 0x5d, 0x1d, 0xed, 0x05, 0x91, 0xe5, - 0x2c, 0x17, 0xdc, 0xcd, 0x18, 0xbd, 0x0c, 0x63, 0xef, 0x85, 0x31, 0x9b, 0x76, 0x62, 0x6f, 0x93, - 0x37, 0x50, 0xc6, 0x5e, 0xbf, 0xde, 0x64, 0xf0, 0xc3, 0xfd, 0xda, 0x78, 0x23, 0x74, 0xe5, 0x5f, - 0xac, 0x0a, 0xa0, 0x3b, 0x70, 0xca, 0x90, 0x08, 0xaa, 0xb9, 0x30, 0x78, 0x73, 0x1f, 0x16, 0xd5, - 0x9d, 0x5a, 0xcb, 0xe3, 0x84, 0xf3, 0x2b, 0xb0, 0xbf, 0xce, 0x9d, 0x9e, 0xc2, 0x35, 0x42, 0xe2, - 0x8e, 0x7f, 0x1c, 0xcf, 0x04, 0xac, 0x18, 0x5e, 0x9b, 0xbb, 0x76, 0xac, 0xff, 0x81, 0xc5, 0x1c, - 0xeb, 0xeb, 0x64, 0xa7, 0xed, 0x3b, 0xc9, 0x71, 0x04, 0xd9, 0xbe, 0x0e, 0x63, 0x89, 0xa8, 0xad, - 0xd7, 0xcb, 0x06, 0x5a, 0xa3, 0xd8, 0xe1, 0x82, 0xda, 0x10, 0x25, 0x14, 0x2b, 0x36, 0xf6, 0x3f, - 0xe5, 0x23, 0x20, 0x31, 0xc7, 0xe0, 0x5b, 0xa8, 0x9b, 0xbe, 0x85, 0x5a, 0x9f, 0x2f, 0x28, 0xf0, - 0x31, 0xfc, 0x13, 0xb3, 0xdd, 0xcc, 0xf6, 0xf8, 0xa8, 0x9f, 0xe8, 0xd8, 0xbf, 0x6c, 0xc1, 0xc9, - 0xbc, 0x23, 0x7d, 0xaa, 0xc4, 0x70, 0xcb, 0x47, 0x9d, 0x70, 0xa9, 0x1e, 0xbc, 0x29, 0xe0, 0x58, - 0x51, 0x0c, 0x9c, 0x5d, 0xfc, 0x68, 0xe9, 0x96, 0xae, 0x83, 0xf9, 0xae, 0x1c, 0x7a, 0x95, 0x47, - 0xcd, 0x5b, 0xea, 0xe1, 0xb7, 0xa3, 0x45, 0xcc, 0xdb, 0xbf, 0x5e, 0x82, 0x93, 0xdc, 0x45, 0xbd, - 0xb8, 0x1b, 0x7a, 0x6e, 0x23, 0x74, 0xc5, 0x1d, 0x82, 0xb7, 0x60, 0xa2, 0xad, 0x99, 0xab, 0xbd, - 0x12, 0xbe, 0xe8, 0x66, 0x6d, 0x6a, 0x36, 0xe8, 0x50, 0x6c, 0xf0, 0x42, 0x2e, 0x4c, 0x90, 0x5d, - 0xaf, 0xa5, 0xfc, 0x9c, 0xa5, 0x23, 0x8b, 0x74, 0x55, 0xcb, 0x8a, 0xc6, 0x07, 0x1b, 0x5c, 0xef, - 0xc3, 0x1b, 0x20, 0xf6, 0x97, 0x2d, 0x78, 0xa0, 0x20, 0x3d, 0x0c, 0xad, 0xee, 0x36, 0x3b, 0x0c, - 0x10, 0x8f, 0x14, 0xaa, 0xea, 0xf8, 0x11, 0x01, 0x16, 0x58, 0xf4, 0x53, 0x00, 0xdc, 0xc5, 0xcf, - 0x9e, 0x84, 0x2f, 0xf5, 0xbe, 0x7f, 0x6e, 0xa4, 0x4d, 0xd0, 0xee, 0xd6, 0xab, 0x47, 0xe0, 0x35, - 0x5e, 0xf6, 0xaf, 0x96, 0x61, 0x98, 0xbf, 0x58, 0xbd, 0x0a, 0xa3, 0x5b, 0x3c, 0x19, 0xed, 0x20, - 0x79, 0x6f, 0x53, 0x73, 0x84, 0x03, 0xb0, 0x2c, 0x8c, 0xae, 0xc2, 0x09, 0x71, 0x4f, 0xa5, 0x4e, - 0x7c, 0x67, 0x4f, 0x5a, 0xb5, 0xfc, 0x61, 0x08, 0x99, 0xb4, 0xfc, 0xc4, 0x5a, 0x37, 0x09, 0xce, - 0x2b, 0x87, 0x5e, 0xed, 0x4a, 0x41, 0xc7, 0xd3, 0xf8, 0x2a, 0x1d, 0xb8, 0x4f, 0x1a, 0xba, 0x97, - 0x61, 0xb2, 0xdd, 0x65, 0xbf, 0x6b, 0x8f, 0x05, 0x9b, 0x36, 0xbb, 0x49, 0xcb, 0xe2, 0x03, 0x3a, - 0x2c, 0x1a, 0x62, 0x7d, 0x2b, 0x22, 0xf1, 0x56, 0xe8, 0xbb, 0xe2, 0x65, 0xcc, 0x34, 0x3e, 0x20, - 0x83, 0xc7, 0x5d, 0x25, 0x28, 0x97, 0x0d, 0xc7, 0xf3, 0x3b, 0x11, 0x49, 0xb9, 0x8c, 0x98, 0x5c, - 0x56, 0x33, 0x78, 0xdc, 0x55, 0x82, 0xce, 0xa3, 0x53, 0xe2, 0x59, 0x45, 0x79, 0x7b, 0x59, 0x05, - 0x7d, 0x8c, 0xca, 0xf8, 0xf4, 0x1e, 0x19, 0x35, 0xc4, 0x91, 0xbf, 0x7a, 0x98, 0x51, 0x7b, 0xb0, - 0x4b, 0x44, 0xa6, 0x4b, 0x2e, 0x77, 0xf3, 0xb8, 0xdf, 0x9f, 0x5a, 0x70, 0x22, 0x27, 0x10, 0x8c, - 0x8b, 0xaa, 0x4d, 0x2f, 0x4e, 0xd4, 0x7b, 0x04, 0x9a, 0xa8, 0xe2, 0x70, 0xac, 0x28, 0xe8, 0x7a, - 0xe0, 0xc2, 0x30, 0x2b, 0x00, 0x45, 0xf0, 0x86, 0xc0, 0x1e, 0x4d, 0x00, 0xa2, 0x73, 0x30, 0xd4, - 0x89, 0x49, 0x24, 0x5f, 0xc4, 0x93, 0xf2, 0x9b, 0x79, 0x04, 0x19, 0x86, 0x6a, 0x94, 0x9b, 0xca, - 0x19, 0xa7, 0x69, 0x94, 0xdc, 0x1d, 0xc7, 0x71, 0xf6, 0x97, 0xca, 0x30, 0x9d, 0x09, 0xe0, 0xa4, - 0x0d, 0xd9, 0x09, 0x03, 0x2f, 0x09, 0x55, 0x06, 0x34, 0x9e, 0xf0, 0x81, 0xb4, 0xb7, 0xae, 0x0a, - 0x38, 0x56, 0x14, 0xe8, 0x31, 0xf9, 0x54, 0x6a, 0xf6, 0x9d, 0x85, 0xa5, 0xba, 0xf1, 0x5a, 0xea, - 0xa0, 0x0f, 0xa6, 0x3c, 0x0a, 0x43, 0xed, 0x50, 0xbd, 0x63, 0xad, 0xc6, 0x13, 0x2f, 0xd5, 0x1b, - 0x61, 0xe8, 0x63, 0x86, 0x44, 0x9f, 0x10, 0x5f, 0x9f, 0x39, 0xaf, 0xc0, 0x8e, 0x1b, 0xc6, 0x5a, - 0x17, 0x3c, 0x01, 0xa3, 0xdb, 0x64, 0x2f, 0xf2, 0x82, 0xcd, 0xec, 0x69, 0xcd, 0x65, 0x0e, 0xc6, - 0x12, 0x6f, 0x26, 0x1c, 0x1f, 0xbd, 0x2f, 0x6f, 0x9e, 0x8c, 0xf5, 0xdd, 0xd5, 0x7e, 0xdb, 0x82, - 0x69, 0x96, 0x6d, 0x54, 0xdc, 0x93, 0xf7, 0xc2, 0xe0, 0x18, 0xf4, 0x84, 0x47, 0x61, 0x38, 0xa2, - 0x95, 0x66, 0x1f, 0x32, 0x60, 0x2d, 0xc1, 0x1c, 0x87, 0x1e, 0x82, 0x21, 0xd6, 0x04, 0x3a, 0x78, - 0x13, 0x3c, 0xdf, 0x78, 0xdd, 0x49, 0x1c, 0xcc, 0xa0, 0xec, 0xc2, 0x12, 0x26, 0x6d, 0xdf, 0xe3, - 0x8d, 0x4e, 0xdd, 0xad, 0x1f, 0x8d, 0x0b, 0x4b, 0xb9, 0x4d, 0xfb, 0x60, 0x17, 0x96, 0xf2, 0x59, - 0xf6, 0xd6, 0xc1, 0xff, 0x5b, 0x09, 0xce, 0xe6, 0x96, 0x4b, 0x4f, 0x76, 0x57, 0x8d, 0x93, 0xdd, - 0x0b, 0x99, 0x93, 0x5d, 0xbb, 0x77, 0xe9, 0x7b, 0x73, 0xd6, 0x9b, 0x7f, 0x04, 0x5b, 0x3e, 0xc6, - 0x23, 0xd8, 0xa1, 0x41, 0xd5, 0x94, 0xe1, 0x3e, 0x6a, 0xca, 0xb7, 0x2c, 0x38, 0x93, 0xdb, 0x65, - 0x1f, 0x91, 0x1b, 0x62, 0xb9, 0x6d, 0x2b, 0xb0, 0x21, 0x7e, 0x50, 0x2a, 0xf8, 0x16, 0x66, 0x4d, - 0x9c, 0xa7, 0x72, 0x86, 0x21, 0x63, 0xa1, 0x76, 0x4d, 0x70, 0x19, 0xc3, 0x61, 0x58, 0x61, 0x91, - 0xa7, 0xdd, 0xb5, 0xe2, 0x4d, 0x7b, 0xf9, 0x48, 0x4b, 0x66, 0xde, 0xf4, 0x8e, 0xeb, 0x97, 0xfa, - 0xb3, 0xf7, 0xae, 0xae, 0x6a, 0x16, 0x60, 0x79, 0x70, 0x0b, 0x70, 0x22, 0xdf, 0xfa, 0x43, 0x8b, - 0x30, 0xbd, 0xe3, 0x05, 0xec, 0x35, 0x52, 0x53, 0xef, 0x51, 0x17, 0x54, 0xaf, 0x9a, 0x68, 0x9c, - 0xa5, 0x9f, 0x7b, 0x19, 0x26, 0xef, 0xde, 0x65, 0xf5, 0xed, 0x32, 0x3c, 0xd8, 0x63, 0xd9, 0x73, - 0x59, 0x6f, 0x8c, 0x81, 0x26, 0xeb, 0xbb, 0xc6, 0xa1, 0x01, 0x27, 0x37, 0x3a, 0xbe, 0xbf, 0xc7, - 0xa2, 0x9c, 0x88, 0x2b, 0x29, 0x84, 0x62, 0xa2, 0x52, 0x09, 0xaf, 0xe6, 0xd0, 0xe0, 0xdc, 0x92, - 0xe8, 0x35, 0x40, 0xe1, 0x2d, 0x96, 0xde, 0xd6, 0x4d, 0x53, 0x15, 0xb0, 0x8e, 0x2f, 0xa7, 0x8b, - 0xf1, 0x7a, 0x17, 0x05, 0xce, 0x29, 0x45, 0x35, 0x4c, 0xf6, 0x86, 0xba, 0x6a, 0x56, 0x46, 0xc3, - 0xc4, 0x3a, 0x12, 0x9b, 0xb4, 0xe8, 0x22, 0xcc, 0x3a, 0xbb, 0x8e, 0xc7, 0x53, 0x57, 0x49, 0x06, - 0x5c, 0xc5, 0x54, 0x8e, 0xa2, 0xc5, 0x2c, 0x01, 0xee, 0x2e, 0x83, 0x36, 0x0c, 0x2f, 0x1f, 0xcf, - 0x9c, 0x7f, 0x61, 0xe0, 0xd9, 0x3a, 0xb0, 0xdf, 0xcf, 0xfe, 0x0f, 0x16, 0xdd, 0xbe, 0x72, 0x9e, - 0xbf, 0xa4, 0xfd, 0xa0, 0xfc, 0x57, 0xda, 0x3d, 0x31, 0xd5, 0x0f, 0xcb, 0x3a, 0x12, 0x9b, 0xb4, - 0x7c, 0x42, 0xc4, 0x69, 0xb8, 0xb4, 0xa1, 0x27, 0x8a, 0x8b, 0x95, 0x8a, 0x02, 0xbd, 0x09, 0xa3, - 0xae, 0xb7, 0xeb, 0xc5, 0x61, 0x24, 0x16, 0xcb, 0x51, 0x9f, 0x7d, 0x56, 0x72, 0xb0, 0xce, 0xd9, - 0x60, 0xc9, 0xcf, 0xfe, 0x52, 0x09, 0x26, 0x65, 0x8d, 0xaf, 0x77, 0xc2, 0xc4, 0x39, 0x86, 0x6d, - 0xf9, 0xa2, 0xb1, 0x2d, 0x7f, 0xa2, 0xd7, 0xed, 0x52, 0xd6, 0xa4, 0xc2, 0xed, 0xf8, 0x7a, 0x66, - 0x3b, 0x7e, 0xbc, 0x3f, 0xab, 0xde, 0xdb, 0xf0, 0xef, 0x59, 0x30, 0x6b, 0xd0, 0x1f, 0xc3, 0x6e, - 0xb0, 0x6a, 0xee, 0x06, 0x8f, 0xf4, 0xfd, 0x86, 0x82, 0x5d, 0xe0, 0xab, 0xa5, 0x4c, 0xdb, 0x99, - 0xf4, 0x7f, 0x0f, 0x86, 0xb6, 0x9c, 0xc8, 0xed, 0x95, 0x80, 0xb1, 0xab, 0xd0, 0xfc, 0x25, 0x27, - 0x72, 0xb9, 0x0c, 0x7f, 0x5a, 0xbd, 0xcc, 0xe5, 0x44, 0x6e, 0xdf, 0xdb, 0x01, 0xac, 0x2a, 0xf4, - 0x12, 0x8c, 0xc4, 0xad, 0xb0, 0xad, 0x62, 0x2f, 0xcf, 0xf1, 0x57, 0xbb, 0x28, 0xe4, 0x70, 0xbf, - 0x86, 0xcc, 0xea, 0x28, 0x18, 0x0b, 0xfa, 0xb9, 0x4d, 0xa8, 0xa8, 0xaa, 0xef, 0x6b, 0x54, 0xf9, - 0x1f, 0x97, 0xe1, 0x44, 0xce, 0xbc, 0x40, 0xb1, 0xd1, 0x5b, 0xcf, 0x0e, 0x38, 0x9d, 0x3e, 0x60, - 0x7f, 0xc5, 0xcc, 0x62, 0x71, 0xc5, 0xf8, 0x0f, 0x5c, 0xe9, 0x8d, 0x98, 0x64, 0x2b, 0xa5, 0xa0, - 0xfe, 0x95, 0xd2, 0xca, 0x8e, 0xad, 0xab, 0x69, 0x45, 0xaa, 0xa5, 0xf7, 0x75, 0x4c, 0xff, 0xac, - 0x0c, 0x27, 0xf3, 0x2e, 0xa5, 0xa3, 0x9f, 0xcd, 0x3c, 0xe7, 0xf0, 0xfc, 0xa0, 0xd7, 0xd9, 0xf9, - 0x1b, 0x0f, 0x22, 0xd7, 0xcb, 0xbc, 0xf9, 0xc0, 0x43, 0xdf, 0x6e, 0x16, 0x75, 0xb2, 0xeb, 0x3a, - 0x11, 0x7f, 0x86, 0x43, 0x2e, 0xf1, 0x4f, 0x0e, 0xdc, 0x00, 0xf1, 0x7e, 0x47, 0x9c, 0xb9, 0xae, - 0x23, 0xc1, 0xfd, 0xaf, 0xeb, 0xc8, 0x9a, 0xe7, 0x3c, 0x18, 0xd7, 0xbe, 0xe6, 0xbe, 0x8e, 0xf8, - 0x36, 0xdd, 0x51, 0xb4, 0x76, 0xdf, 0xd7, 0x51, 0xff, 0xb2, 0x05, 0x99, 0x38, 0x29, 0xe5, 0xff, - 0xb0, 0x0a, 0xfd, 0x1f, 0xe7, 0x60, 0x28, 0x0a, 0x7d, 0x92, 0xcd, 0xf0, 0x8f, 0x43, 0x9f, 0x60, - 0x86, 0x51, 0xcf, 0xf0, 0x96, 0x8b, 0x9e, 0xe1, 0xa5, 0xa6, 0xb1, 0x4f, 0x76, 0x89, 0xf4, 0x46, - 0x28, 0x99, 0x7c, 0x85, 0x02, 0x31, 0xc7, 0xd9, 0xbf, 0x39, 0x04, 0x27, 0x72, 0x2e, 0xa7, 0x51, - 0x43, 0x65, 0xd3, 0x49, 0xc8, 0x6d, 0x67, 0x2f, 0x9b, 0x75, 0xf4, 0x22, 0x07, 0x63, 0x89, 0x67, - 0xb1, 0x9c, 0x3c, 0x71, 0x59, 0xc6, 0x47, 0x24, 0xf2, 0x95, 0x09, 0xec, 0xfd, 0x7a, 0x99, 0xf5, - 0x02, 0x40, 0x1c, 0xfb, 0x2b, 0x01, 0x55, 0xbe, 0x5c, 0x11, 0x29, 0x9a, 0x66, 0xb9, 0x6b, 0x5e, - 0x11, 0x18, 0xac, 0x51, 0xa1, 0x3a, 0xcc, 0xb4, 0xa3, 0x30, 0xe1, 0x7e, 0xb7, 0x3a, 0x8f, 0x51, - 0x18, 0x36, 0xaf, 0x19, 0x35, 0x32, 0x78, 0xdc, 0x55, 0x02, 0xbd, 0x00, 0xe3, 0xe2, 0xea, 0x51, - 0x23, 0x0c, 0x7d, 0xe1, 0xa5, 0x51, 0x27, 0xde, 0xcd, 0x14, 0x85, 0x75, 0x3a, 0xad, 0x18, 0x73, - 0xe6, 0x8d, 0xe6, 0x16, 0xe3, 0x0e, 0x3d, 0x8d, 0x2e, 0x93, 0x9b, 0x62, 0x6c, 0xa0, 0xdc, 0x14, - 0xa9, 0xdf, 0xaa, 0x32, 0xf0, 0xf9, 0x05, 0xf4, 0xf5, 0xf4, 0x7c, 0xbd, 0x0c, 0x23, 0x7c, 0x28, - 0x8e, 0x41, 0x15, 0x5b, 0x15, 0xbe, 0x9b, 0x1e, 0x19, 0x01, 0x78, 0x5b, 0xe6, 0xeb, 0x4e, 0xe2, - 0x70, 0x31, 0xa4, 0x56, 0x43, 0xea, 0xe5, 0x41, 0xf3, 0xc6, 0x7a, 0x99, 0xcb, 0x38, 0x27, 0x80, - 0xf3, 0xd0, 0x56, 0xcf, 0x3b, 0x00, 0x31, 0x7b, 0x1d, 0x94, 0xf2, 0x10, 0x19, 0x4c, 0x9f, 0xec, - 0x51, 0x7b, 0x53, 0x11, 0xf3, 0x36, 0xa4, 0x53, 0x50, 0x21, 0xb0, 0xc6, 0x71, 0xee, 0x45, 0xa8, - 0x28, 0xe2, 0x7e, 0x96, 0xdc, 0x84, 0x2e, 0xbc, 0x3e, 0x0d, 0xd3, 0x99, 0xba, 0x8e, 0x64, 0x08, - 0xfe, 0x8e, 0x05, 0xd3, 0xbc, 0xc9, 0x2b, 0xc1, 0xae, 0x58, 0xec, 0xef, 0xc3, 0x49, 0x3f, 0x67, - 0xd1, 0x89, 0x11, 0x1d, 0x7c, 0x91, 0x2a, 0xc3, 0x2f, 0x0f, 0x8b, 0x73, 0xeb, 0xa0, 0xc6, 0x3f, - 0x7f, 0xd7, 0xd8, 0xf1, 0x45, 0x04, 0xf2, 0x04, 0xcf, 0xec, 0xcc, 0x61, 0x58, 0x61, 0xed, 0xef, - 0x58, 0x30, 0xdb, 0xf5, 0x2a, 0xfe, 0x87, 0xda, 0x76, 0x91, 0xb8, 0xba, 0x54, 0x90, 0xb8, 0x5a, - 0xff, 0xb4, 0x72, 0xcf, 0x4f, 0xfb, 0x75, 0x0b, 0xc4, 0x0c, 0x3c, 0x06, 0x75, 0xfe, 0x27, 0x4c, - 0x75, 0x7e, 0xae, 0x78, 0x52, 0x17, 0xe8, 0xf1, 0x7f, 0x61, 0xc1, 0x0c, 0x27, 0x48, 0x0f, 0x2f, - 0x3e, 0xd4, 0x71, 0x18, 0xe4, 0x35, 0x15, 0xf5, 0x7c, 0x65, 0xfe, 0x47, 0x19, 0x83, 0x35, 0xd4, - 0x73, 0xb0, 0xfe, 0x8b, 0x05, 0x88, 0x7f, 0x7e, 0xf6, 0xa9, 0x67, 0xbe, 0x29, 0x69, 0xa6, 0x76, - 0x2a, 0x04, 0x14, 0x06, 0x6b, 0x54, 0xf7, 0xa4, 0xe1, 0x99, 0xb3, 0xa1, 0x72, 0xff, 0xb3, 0xa1, - 0x23, 0x7c, 0xeb, 0x5f, 0x1b, 0x82, 0x6c, 0x20, 0x22, 0xba, 0x09, 0x13, 0x2d, 0xa7, 0xed, 0xdc, - 0xf2, 0x7c, 0x2f, 0xf1, 0x48, 0xdc, 0xeb, 0x50, 0x79, 0x59, 0xa3, 0x13, 0x07, 0x31, 0x1a, 0x04, - 0x1b, 0x7c, 0xd0, 0x3c, 0x40, 0x3b, 0xf2, 0x76, 0x3d, 0x9f, 0x6c, 0x32, 0x5b, 0x83, 0xdd, 0x46, - 0xe0, 0x27, 0xa5, 0x12, 0x8a, 0x35, 0x8a, 0x9c, 0xe8, 0xf5, 0xf2, 0xfd, 0x8b, 0x5e, 0x1f, 0x3a, - 0x62, 0xf4, 0xfa, 0xf0, 0x40, 0xd1, 0xeb, 0x18, 0x4e, 0xcb, 0x5d, 0x95, 0xfe, 0x5f, 0xf5, 0x7c, - 0x22, 0x54, 0x29, 0x7e, 0x47, 0x61, 0xee, 0x60, 0xbf, 0x76, 0x1a, 0xe7, 0x52, 0xe0, 0x82, 0x92, - 0xe8, 0xa7, 0xa0, 0xea, 0xf8, 0x7e, 0x78, 0x5b, 0xf5, 0xda, 0x4a, 0xdc, 0x72, 0xfc, 0x34, 0x29, - 0xe8, 0xd8, 0xd2, 0x43, 0x07, 0xfb, 0xb5, 0xea, 0x62, 0x01, 0x0d, 0x2e, 0x2c, 0x6d, 0x6f, 0xc3, - 0x89, 0x26, 0x89, 0xe4, 0x93, 0x60, 0x6a, 0xf5, 0xad, 0x43, 0x25, 0xca, 0x2c, 0xf7, 0x81, 0xae, - 0xa4, 0x6b, 0xa9, 0xb8, 0xe4, 0xf2, 0x4e, 0x19, 0xd9, 0x7f, 0x6e, 0xc1, 0xa8, 0x08, 0x6e, 0x3c, - 0x06, 0x2d, 0x63, 0xd1, 0x70, 0xf8, 0xd4, 0xf2, 0x45, 0x22, 0x6b, 0x4c, 0xa1, 0xab, 0x67, 0x2d, - 0xe3, 0xea, 0x79, 0xa4, 0x17, 0x93, 0xde, 0x4e, 0x9e, 0x5f, 0x2a, 0xc3, 0x94, 0x19, 0xd8, 0x79, - 0x0c, 0x5d, 0x70, 0x0d, 0x46, 0x63, 0x11, 0x45, 0x5c, 0x2a, 0x8e, 0x46, 0xcb, 0x0e, 0x62, 0x7a, - 0x66, 0x2d, 0xe2, 0x86, 0x25, 0x93, 0xdc, 0xf0, 0xe4, 0xf2, 0x7d, 0x0c, 0x4f, 0xee, 0x17, 0x5b, - 0x3b, 0x74, 0x2f, 0x62, 0x6b, 0xed, 0x6f, 0x30, 0xe1, 0xaf, 0xc3, 0x8f, 0x61, 0xc7, 0xbe, 0x68, - 0x6e, 0x13, 0x76, 0x8f, 0x99, 0x25, 0x1a, 0x55, 0xb0, 0x73, 0xff, 0x23, 0x0b, 0xc6, 0x05, 0xe1, - 0x31, 0x34, 0xfb, 0x27, 0xcd, 0x66, 0x3f, 0xd8, 0xa3, 0xd9, 0x05, 0xed, 0xfd, 0xdb, 0x25, 0xd5, - 0xde, 0x86, 0x78, 0x94, 0xbf, 0x6f, 0x92, 0xe8, 0x31, 0x6a, 0xa7, 0x85, 0xad, 0xd0, 0x17, 0x7a, - 0xd9, 0x43, 0xe9, 0x35, 0x35, 0x0e, 0x3f, 0xd4, 0x7e, 0x63, 0x45, 0xcd, 0x6e, 0x51, 0x85, 0x51, - 0x22, 0x36, 0xd0, 0xf4, 0x16, 0x55, 0x18, 0x25, 0x98, 0x61, 0x90, 0x0b, 0x90, 0xbe, 0x95, 0x2e, - 0xee, 0x75, 0x16, 0xaf, 0xc2, 0x4e, 0xe2, 0xf9, 0xf3, 0x5e, 0x90, 0xc4, 0x49, 0x34, 0xbf, 0x16, - 0x24, 0xd7, 0x23, 0xae, 0xb5, 0x6b, 0xf7, 0xce, 0x14, 0x2f, 0xac, 0xf1, 0x95, 0x17, 0x1f, 0x58, - 0x1d, 0xc3, 0xe6, 0x49, 0xcc, 0x35, 0x01, 0xc7, 0x8a, 0xc2, 0x7e, 0x91, 0xc9, 0x64, 0xd6, 0x41, - 0x47, 0xbb, 0x12, 0xf6, 0x27, 0xa3, 0xaa, 0x6b, 0x99, 0x1b, 0xb6, 0xae, 0x5f, 0x3c, 0xeb, 0x2d, - 0x02, 0x69, 0xc5, 0x7a, 0x90, 0x6f, 0x7a, 0x3b, 0x0d, 0x7d, 0xa6, 0xeb, 0x80, 0xee, 0x99, 0x3e, - 0xb2, 0xf4, 0x08, 0x47, 0x72, 0x2c, 0xe7, 0x1d, 0xcb, 0x0d, 0xb6, 0xd6, 0xc8, 0xa6, 0xf1, 0x5e, - 0x96, 0x08, 0x9c, 0xd2, 0xa0, 0x05, 0x61, 0xf3, 0x71, 0x07, 0xc8, 0x83, 0x19, 0x9b, 0x4f, 0x7e, - 0xbe, 0x66, 0xf4, 0x3d, 0x0b, 0xe3, 0xea, 0x69, 0x94, 0x06, 0x7f, 0x61, 0xa2, 0xc2, 0x75, 0xa9, - 0x95, 0x14, 0x8c, 0x75, 0x1a, 0xb4, 0x0e, 0xd3, 0x31, 0x7f, 0xb7, 0x45, 0xde, 0x45, 0x10, 0x16, - 0xfd, 0x93, 0x99, 0x57, 0xd9, 0x25, 0xfa, 0x90, 0x81, 0xf8, 0x62, 0x95, 0xb7, 0x17, 0xb2, 0x2c, - 0xd0, 0xab, 0x30, 0xe5, 0xeb, 0xef, 0x57, 0x36, 0x84, 0xc1, 0xaf, 0x82, 0xac, 0x8c, 0xd7, 0x2d, - 0x1b, 0x38, 0x43, 0x4d, 0x95, 0x00, 0x1d, 0x22, 0x92, 0xd4, 0x38, 0xc1, 0x26, 0x89, 0xc5, 0xc3, - 0x0e, 0x4c, 0x09, 0xb8, 0x52, 0x40, 0x83, 0x0b, 0x4b, 0xa3, 0x97, 0x60, 0x42, 0x7e, 0xbe, 0x76, - 0x37, 0x27, 0x0d, 0xe5, 0xd3, 0x70, 0xd8, 0xa0, 0x44, 0xb7, 0xe1, 0x94, 0xfc, 0xbf, 0x1e, 0x39, - 0x1b, 0x1b, 0x5e, 0x4b, 0x5c, 0x8d, 0x1a, 0x67, 0x2c, 0x16, 0x65, 0x5c, 0xf3, 0x4a, 0x1e, 0xd1, - 0xe1, 0x7e, 0xed, 0x9c, 0xe8, 0xb5, 0x5c, 0x3c, 0x1b, 0xc4, 0x7c, 0xfe, 0xe8, 0x2a, 0x9c, 0xd8, - 0x22, 0x8e, 0x9f, 0x6c, 0x2d, 0x6f, 0x91, 0xd6, 0xb6, 0x5c, 0x44, 0xec, 0xc6, 0x8f, 0x16, 0x00, - 0x77, 0xa9, 0x9b, 0x04, 0xe7, 0x95, 0x43, 0x6f, 0x43, 0xb5, 0xdd, 0xb9, 0xe5, 0x7b, 0xf1, 0xd6, - 0xb5, 0x30, 0x61, 0x67, 0x89, 0xea, 0x65, 0x11, 0x71, 0x35, 0x48, 0xdd, 0x76, 0x6a, 0x14, 0xd0, - 0xe1, 0x42, 0x0e, 0x1f, 0xec, 0x94, 0xf7, 0x3d, 0x5a, 0x58, 0xd3, 0x30, 0xd0, 0x67, 0x61, 0x42, - 0x1f, 0x49, 0x21, 0xe4, 0x1f, 0xeb, 0xf7, 0x5e, 0xaa, 0xd0, 0x4f, 0xd4, 0xa8, 0xea, 0x38, 0x6c, - 0x70, 0xb4, 0xff, 0x45, 0x09, 0x6a, 0x7d, 0x72, 0x48, 0x65, 0x5c, 0x57, 0xd6, 0x40, 0xae, 0xab, - 0x45, 0xf9, 0x88, 0xc8, 0xb5, 0x4c, 0x8a, 0xea, 0xcc, 0x03, 0x21, 0x69, 0xa2, 0xea, 0x2c, 0xfd, - 0xc0, 0x51, 0x5b, 0xba, 0xf7, 0x6b, 0xa8, 0x6f, 0xf0, 0x5a, 0x43, 0x77, 0x63, 0x0e, 0x0f, 0xae, - 0xee, 0x16, 0x7a, 0x30, 0xed, 0x6f, 0x94, 0xe0, 0x94, 0xea, 0xc2, 0x1f, 0xdd, 0x8e, 0xbb, 0xd1, - 0xdd, 0x71, 0xf7, 0xc0, 0xff, 0x6b, 0x5f, 0x87, 0x91, 0xe6, 0x5e, 0xdc, 0x4a, 0xfc, 0x01, 0xb4, - 0x83, 0x47, 0x8d, 0x95, 0x93, 0xee, 0x61, 0xec, 0x1d, 0x30, 0xb1, 0x90, 0xec, 0xbf, 0x6c, 0xc1, - 0xf4, 0xfa, 0x72, 0xa3, 0x19, 0xb6, 0xb6, 0x49, 0xb2, 0xc8, 0xbd, 0x1b, 0x58, 0x28, 0x07, 0xd6, - 0x5d, 0x6e, 0xfa, 0x79, 0xea, 0xc4, 0x39, 0x18, 0xda, 0x0a, 0xe3, 0x24, 0xeb, 0xe3, 0xbf, 0x14, - 0xc6, 0x09, 0x66, 0x18, 0xfb, 0xbb, 0x16, 0x0c, 0xb3, 0xa7, 0xaf, 0xfa, 0x3d, 0x91, 0x36, 0xc8, - 0x77, 0xa1, 0x17, 0x60, 0x84, 0x6c, 0x6c, 0x90, 0x56, 0x22, 0x46, 0x55, 0x5e, 0x24, 0x19, 0x59, - 0x61, 0x50, 0xba, 0x23, 0xb2, 0xca, 0xf8, 0x5f, 0x2c, 0x88, 0xd1, 0x67, 0xa0, 0x92, 0x78, 0x3b, - 0x64, 0xd1, 0x75, 0x85, 0x7b, 0xfd, 0x68, 0x91, 0x54, 0x6a, 0x87, 0x5e, 0x97, 0x4c, 0x70, 0xca, - 0xcf, 0xfe, 0x85, 0x12, 0x40, 0x7a, 0xe1, 0xac, 0xdf, 0x67, 0x2e, 0x75, 0xbd, 0x04, 0xf7, 0x58, - 0xce, 0x4b, 0x70, 0x28, 0x65, 0x98, 0xf3, 0x0e, 0x9c, 0xea, 0xaa, 0xf2, 0x40, 0x5d, 0x35, 0x74, - 0x94, 0xae, 0x5a, 0x86, 0xd9, 0xf4, 0xc2, 0x9c, 0x79, 0x7b, 0x98, 0x65, 0x89, 0x5d, 0xcf, 0x22, - 0x71, 0x37, 0xbd, 0xfd, 0x45, 0x0b, 0x44, 0x74, 0xed, 0x00, 0x13, 0xfa, 0x2d, 0xf9, 0x68, 0x93, - 0x91, 0xd8, 0xee, 0x5c, 0x71, 0xb8, 0xb1, 0x48, 0x67, 0xa7, 0x24, 0xbb, 0x91, 0xc4, 0xce, 0xe0, - 0x65, 0xff, 0x9e, 0x05, 0xe3, 0x1c, 0x7d, 0x95, 0x99, 0xa0, 0xfd, 0x5b, 0x73, 0xa4, 0x1c, 0xc3, - 0xec, 0x3d, 0x23, 0xca, 0x58, 0xa5, 0xa2, 0xd5, 0xdf, 0x33, 0x92, 0x08, 0x9c, 0xd2, 0xa0, 0x27, - 0x60, 0x34, 0xee, 0xdc, 0x62, 0xe4, 0x99, 0x00, 0xdb, 0x26, 0x07, 0x63, 0x89, 0xa7, 0xf3, 0x6a, - 0x26, 0x1b, 0x5f, 0x8d, 0x2e, 0xc1, 0x08, 0x17, 0x1b, 0x62, 0x19, 0xf7, 0x38, 0x4c, 0xd0, 0xa2, - 0xb2, 0x81, 0x3f, 0xc0, 0xcd, 0xc4, 0x8d, 0x28, 0x8f, 0xde, 0x86, 0x71, 0x37, 0xbc, 0x1d, 0xdc, - 0x76, 0x22, 0x77, 0xb1, 0xb1, 0x26, 0x7a, 0x3d, 0x37, 0x4a, 0xae, 0x9e, 0x92, 0xe9, 0x91, 0xde, - 0xcc, 0x3d, 0x97, 0xa2, 0xb0, 0xce, 0x0e, 0xad, 0xb3, 0x1c, 0x1e, 0xfc, 0x59, 0xd0, 0x5e, 0x71, - 0x23, 0xea, 0x25, 0x51, 0x8d, 0xf3, 0xa4, 0x48, 0xf4, 0x21, 0x1e, 0x15, 0x4d, 0x19, 0xd9, 0x9f, - 0x3f, 0x01, 0xc6, 0x68, 0x1b, 0x99, 0x80, 0xad, 0x7b, 0x94, 0x09, 0x18, 0xc3, 0x18, 0xd9, 0x69, - 0x27, 0x7b, 0x75, 0x2f, 0xea, 0x95, 0x9a, 0x7d, 0x45, 0xd0, 0x74, 0xf3, 0x94, 0x18, 0xac, 0xf8, - 0xe4, 0xa7, 0x6b, 0x2e, 0x7f, 0x88, 0xe9, 0x9a, 0x87, 0x8e, 0x31, 0x5d, 0xf3, 0x35, 0x18, 0xdd, - 0xf4, 0x12, 0x4c, 0xda, 0xa1, 0xd8, 0x32, 0x73, 0x67, 0xc2, 0x45, 0x4e, 0xd2, 0x9d, 0x5e, 0x54, - 0x20, 0xb0, 0x64, 0x82, 0x5e, 0x53, 0x6b, 0x60, 0xa4, 0x58, 0x15, 0xec, 0xf6, 0x6e, 0xe7, 0xae, - 0x02, 0x91, 0x9e, 0x79, 0xf4, 0x6e, 0xd3, 0x33, 0xab, 0xf4, 0xca, 0x63, 0x1f, 0x2c, 0xbd, 0xb2, - 0x91, 0x7e, 0xba, 0x72, 0xef, 0xd2, 0x4f, 0x7f, 0xd1, 0x82, 0x53, 0xed, 0xbc, 0x4c, 0xec, 0x22, - 0x65, 0xf2, 0x0b, 0x03, 0x67, 0xa4, 0x37, 0x2a, 0x64, 0x89, 0x24, 0x72, 0xc9, 0x70, 0x7e, 0x75, - 0x32, 0x8f, 0xf5, 0xf8, 0xdd, 0xe6, 0xb1, 0xbe, 0x3f, 0xb9, 0x95, 0xd3, 0xac, 0xd6, 0x93, 0xf7, - 0x30, 0xab, 0xf5, 0xd4, 0x07, 0xce, 0x6a, 0xad, 0x65, 0xa6, 0x9e, 0xbe, 0x17, 0x99, 0xa9, 0xdf, - 0x31, 0x85, 0x3d, 0x4f, 0x93, 0xfc, 0x54, 0x1f, 0x61, 0x6f, 0xf0, 0xed, 0x2d, 0xee, 0x79, 0x16, - 0xee, 0xd9, 0xbb, 0xca, 0xc2, 0x7d, 0x53, 0xcf, 0x6f, 0x8d, 0xfa, 0x24, 0x70, 0xa6, 0x44, 0x03, - 0x66, 0xb5, 0xbe, 0xa9, 0x6f, 0x41, 0x27, 0x8a, 0xf9, 0xaa, 0x9d, 0xa6, 0x9b, 0x6f, 0xde, 0x26, - 0xd4, 0x9d, 0x2d, 0xfb, 0xe4, 0xf1, 0x64, 0xcb, 0x3e, 0x75, 0xcf, 0xb3, 0x65, 0x9f, 0x3e, 0x86, - 0x6c, 0xd9, 0x0f, 0x7c, 0xa8, 0xd9, 0xb2, 0xab, 0xf7, 0x37, 0x5b, 0xf6, 0x99, 0x7b, 0x91, 0x2d, - 0xfb, 0x26, 0x54, 0xda, 0xf2, 0x0a, 0x5e, 0x75, 0xae, 0x78, 0x48, 0x72, 0xef, 0xe9, 0xf1, 0x21, - 0x51, 0x28, 0x9c, 0xb2, 0xa2, 0x7c, 0xd3, 0xec, 0xd9, 0x0f, 0x16, 0xf3, 0xcd, 0x35, 0xdb, 0x7b, - 0xe4, 0xcc, 0xfe, 0x2b, 0x25, 0x38, 0xdb, 0x7b, 0x5e, 0xa7, 0x36, 0x7f, 0x23, 0x75, 0xe0, 0x66, - 0x6c, 0x7e, 0xa6, 0x74, 0x69, 0x54, 0x03, 0xdf, 0x53, 0xbe, 0x08, 0xb3, 0x2a, 0x12, 0xc9, 0xf7, - 0x5a, 0x7b, 0xda, 0x33, 0x37, 0x2a, 0xb8, 0xbd, 0x99, 0x25, 0xc0, 0xdd, 0x65, 0xd0, 0x22, 0x4c, - 0x1b, 0xc0, 0xb5, 0xba, 0x50, 0xc9, 0x95, 0x93, 0xa1, 0x69, 0xa2, 0x71, 0x96, 0xde, 0xfe, 0xaa, - 0x05, 0x0f, 0x14, 0x24, 0xde, 0x1c, 0xf8, 0x1a, 0xee, 0x06, 0x4c, 0xb7, 0xcd, 0xa2, 0x7d, 0x6e, - 0xeb, 0x1b, 0xe9, 0x3d, 0x55, 0x5b, 0x33, 0x08, 0x9c, 0x65, 0xba, 0x74, 0xfe, 0x9b, 0xdf, 0x3b, - 0xfb, 0xb1, 0x3f, 0xfa, 0xde, 0xd9, 0x8f, 0x7d, 0xe7, 0x7b, 0x67, 0x3f, 0xf6, 0xff, 0x1d, 0x9c, - 0xb5, 0xbe, 0x79, 0x70, 0xd6, 0xfa, 0xa3, 0x83, 0xb3, 0xd6, 0x77, 0x0e, 0xce, 0x5a, 0x7f, 0x7a, - 0x70, 0xd6, 0xfa, 0x85, 0xef, 0x9f, 0xfd, 0xd8, 0x5b, 0xa5, 0xdd, 0x67, 0xff, 0x6f, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x32, 0xb3, 0xcb, 0xd3, 0x5f, 0xcb, 0x00, 0x00, + 0x04, 0x02, 0xfa, 0x0c, 0x4c, 0xa7, 0x95, 0xc5, 0x6d, 0xa7, 0x25, 0x3b, 0x90, 0x2d, 0x99, 0xa6, + 0x89, 0xc2, 0x59, 0x5a, 0xfb, 0x1f, 0x59, 0x62, 0xf2, 0xd0, 0xaf, 0xfe, 0x88, 0x7f, 0xab, 0xfd, + 0xdb, 0x16, 0x8c, 0x2e, 0x79, 0x81, 0xeb, 0x05, 0x9b, 0xe8, 0x73, 0x30, 0x46, 0xf7, 0x26, 0xd7, + 0x49, 0x1c, 0x21, 0xf7, 0x3e, 0xa9, 0xad, 0x2d, 0xb5, 0x55, 0xcc, 0xb7, 0xb7, 0x37, 0x29, 0x20, + 0x9e, 0xa7, 0xd4, 0x74, 0xb5, 0x5d, 0xbf, 0xf5, 0x2e, 0x69, 0x25, 0x57, 0x49, 0xe2, 0xa4, 0x9f, + 0x93, 0xc2, 0xb0, 0xe2, 0x8a, 0x2e, 0xc3, 0x48, 0xe2, 0x44, 0x9b, 0x24, 0x11, 0x02, 0x30, 0x57, + 0x50, 0xf1, 0x92, 0x98, 0xae, 0x48, 0x12, 0xb4, 0x48, 0xba, 0x2d, 0xac, 0xb3, 0xa2, 0x58, 0xb0, + 0xb0, 0x5b, 0x30, 0xb1, 0xec, 0xb4, 0x9d, 0x5b, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0xd1, 0xe3, 0x50, + 0x76, 0x5c, 0x97, 0x49, 0x85, 0xca, 0xd2, 0xa9, 0x83, 0xfd, 0x5a, 0x79, 0xd1, 0xa5, 0xd3, 0x13, + 0x14, 0xd5, 0x1e, 0xa6, 0x14, 0xe8, 0x49, 0x18, 0x72, 0xa3, 0xb0, 0x5d, 0x2d, 0x31, 0xca, 0xd3, + 0x74, 0x26, 0xd7, 0xa3, 0xb0, 0x9d, 0x21, 0x65, 0x34, 0xf6, 0xef, 0x95, 0xe0, 0xa1, 0x65, 0xd2, + 0xde, 0x5a, 0x6d, 0x16, 0xcc, 0xdf, 0xf3, 0x30, 0xb6, 0x13, 0x06, 0x5e, 0x12, 0x46, 0xb1, 0xa8, + 0x9a, 0x2d, 0xa0, 0xab, 0x02, 0x86, 0x15, 0x16, 0x9d, 0x83, 0xa1, 0x76, 0x2a, 0xfc, 0x26, 0xa4, + 0xe0, 0x64, 0x62, 0x8f, 0x61, 0x28, 0x45, 0x27, 0x26, 0x91, 0x58, 0xf8, 0x8a, 0xe2, 0x46, 0x4c, + 0x22, 0xcc, 0x30, 0xe9, 0x0c, 0xa2, 0x73, 0x4b, 0xcc, 0xca, 0xcc, 0x0c, 0xa2, 0x18, 0xac, 0x51, + 0xa1, 0x06, 0x54, 0xf8, 0x3f, 0x4c, 0x36, 0xd8, 0x1a, 0x2f, 0xe8, 0xf7, 0xa6, 0x24, 0x12, 0xfd, + 0x3e, 0xc9, 0xa6, 0x98, 0x04, 0xe2, 0x94, 0x89, 0x31, 0xc5, 0x46, 0xfa, 0x4e, 0xb1, 0x6f, 0x94, + 0x00, 0xf1, 0x2e, 0xfc, 0x01, 0xeb, 0xb8, 0x1b, 0xdd, 0x1d, 0x97, 0xbb, 0xd9, 0x5c, 0x09, 0x5b, + 0x8e, 0x9f, 0x9d, 0xb5, 0xf7, 0xaa, 0xf7, 0x7e, 0xc1, 0x02, 0xb4, 0xec, 0x05, 0x2e, 0x89, 0x8e, + 0x41, 0xd3, 0x3a, 0x9a, 0xec, 0xf8, 0x0f, 0xb4, 0x69, 0xe1, 0x4e, 0x3b, 0x0c, 0x48, 0x90, 0x2c, + 0x87, 0x81, 0xcb, 0xb5, 0xaf, 0x4f, 0xc3, 0x50, 0x42, 0xab, 0xe2, 0xcd, 0x7a, 0x4c, 0x0e, 0x06, + 0xad, 0xe0, 0x70, 0xbf, 0x76, 0xba, 0xbb, 0x04, 0x6b, 0x02, 0x2b, 0x83, 0x7e, 0x04, 0x46, 0xe2, + 0xc4, 0x49, 0x3a, 0xb1, 0x68, 0xe8, 0x23, 0xb2, 0xa1, 0x4d, 0x06, 0x3d, 0xdc, 0xaf, 0x4d, 0xab, + 0x62, 0x1c, 0x84, 0x45, 0x01, 0xf4, 0x04, 0x8c, 0xee, 0x90, 0x38, 0x76, 0x36, 0xe5, 0xc6, 0x39, + 0x2d, 0xca, 0x8e, 0x5e, 0xe5, 0x60, 0x2c, 0xf1, 0xe8, 0x51, 0x18, 0x26, 0x51, 0x14, 0x46, 0x62, + 0x1e, 0x4c, 0x0a, 0xc2, 0xe1, 0x15, 0x0a, 0xc4, 0x1c, 0x67, 0xff, 0x7b, 0x0b, 0xa6, 0x55, 0x5b, + 0x79, 0x5d, 0xc7, 0x20, 0x21, 0xdf, 0x02, 0x68, 0xc9, 0x0f, 0x8c, 0x99, 0x84, 0x1a, 0xbf, 0xf0, + 0x58, 0xde, 0xa4, 0xeb, 0xee, 0xc6, 0x94, 0xb3, 0x02, 0xc5, 0x58, 0xe3, 0x66, 0xff, 0x0b, 0x0b, + 0x4e, 0x64, 0xbe, 0xe8, 0x8a, 0x17, 0x27, 0xe8, 0xed, 0xae, 0xaf, 0x9a, 0x1f, 0xec, 0xab, 0x68, + 0x69, 0xf6, 0x4d, 0x6a, 0x96, 0x48, 0x88, 0xf6, 0x45, 0x97, 0x60, 0xd8, 0x4b, 0xc8, 0x8e, 0xfc, + 0x98, 0x47, 0x7b, 0x7e, 0x0c, 0x6f, 0x55, 0x3a, 0x22, 0x6b, 0xb4, 0x24, 0xe6, 0x0c, 0xec, 0xff, + 0x61, 0x41, 0x65, 0x39, 0x0c, 0x36, 0xbc, 0xcd, 0xab, 0x4e, 0xfb, 0x18, 0xc6, 0x62, 0x0d, 0x86, + 0x18, 0x77, 0xde, 0xf0, 0xc7, 0xf3, 0x1b, 0x2e, 0x9a, 0x33, 0x4f, 0xd5, 0x1f, 0xae, 0x66, 0x2a, + 0xf1, 0x43, 0x41, 0x98, 0xb1, 0x98, 0x7b, 0x11, 0x2a, 0x8a, 0x00, 0xcd, 0x40, 0x79, 0x9b, 0xf0, + 0xa3, 0x45, 0x05, 0xd3, 0x9f, 0xe8, 0x24, 0x0c, 0xef, 0x3a, 0x7e, 0x47, 0x2c, 0x4f, 0xcc, 0xff, + 0x7c, 0xba, 0xf4, 0x92, 0x65, 0x7f, 0x9d, 0xad, 0x31, 0x51, 0xc9, 0x4a, 0xb0, 0x2b, 0x96, 0xff, + 0xfb, 0x70, 0xd2, 0xcf, 0x91, 0x3a, 0xa2, 0x23, 0x06, 0x97, 0x52, 0x0f, 0x89, 0xb6, 0x9e, 0xcc, + 0xc3, 0xe2, 0xdc, 0x3a, 0xa8, 0xe0, 0x0e, 0xdb, 0x74, 0x46, 0x39, 0x3e, 0x6b, 0xaf, 0x50, 0x19, + 0xaf, 0x0b, 0x18, 0x56, 0x58, 0x2a, 0x20, 0x4e, 0xaa, 0xc6, 0x5f, 0x26, 0x7b, 0x4d, 0xe2, 0x93, + 0x56, 0x12, 0x46, 0x1f, 0x6a, 0xf3, 0x1f, 0xe6, 0xbd, 0xcf, 0xe5, 0xcb, 0xb8, 0x60, 0x50, 0xbe, + 0x4c, 0xf6, 0xf8, 0x50, 0xe8, 0x5f, 0x57, 0xee, 0xf9, 0x75, 0xbf, 0x6e, 0xc1, 0xa4, 0xfa, 0xba, + 0x63, 0x58, 0x48, 0x4b, 0xe6, 0x42, 0x7a, 0xb8, 0xe7, 0x7c, 0x2c, 0x58, 0x42, 0xdf, 0x67, 0x22, + 0x40, 0xd0, 0x34, 0xa2, 0x90, 0x76, 0x0d, 0x95, 0xd9, 0x1f, 0xe6, 0x80, 0x0c, 0xf2, 0x5d, 0x97, + 0xc9, 0xde, 0x7a, 0x48, 0x37, 0xfc, 0xfc, 0xef, 0x32, 0x46, 0x6d, 0xa8, 0xe7, 0xa8, 0xfd, 0x46, + 0x09, 0x4e, 0xa9, 0x1e, 0x30, 0xb6, 0xd4, 0x1f, 0xf4, 0x3e, 0x78, 0x16, 0xc6, 0x5d, 0xb2, 0xe1, + 0x74, 0xfc, 0x44, 0x9d, 0x1e, 0x87, 0xb9, 0x05, 0xa1, 0x9e, 0x82, 0xb1, 0x4e, 0x73, 0x84, 0x6e, + 0xfb, 0xb7, 0xc0, 0x64, 0x6f, 0xe2, 0xd0, 0x19, 0x4c, 0xf5, 0x2d, 0xcd, 0x06, 0x30, 0xa1, 0xdb, + 0x00, 0xc4, 0x79, 0xff, 0x51, 0x18, 0xf6, 0x76, 0xe8, 0x5e, 0x5c, 0x32, 0xb7, 0xd8, 0x35, 0x0a, + 0xc4, 0x1c, 0x87, 0x3e, 0x01, 0xa3, 0xad, 0x70, 0x67, 0xc7, 0x09, 0xdc, 0x6a, 0x99, 0x69, 0x80, + 0xe3, 0x74, 0xbb, 0x5e, 0xe6, 0x20, 0x2c, 0x71, 0xe8, 0x21, 0x18, 0x72, 0xa2, 0xcd, 0xb8, 0x3a, + 0xc4, 0x68, 0xc6, 0x68, 0x4d, 0x8b, 0xd1, 0x66, 0x8c, 0x19, 0x94, 0x6a, 0x76, 0xb7, 0xc3, 0x68, + 0xdb, 0x0b, 0x36, 0xeb, 0x5e, 0xc4, 0xd4, 0x34, 0x4d, 0xb3, 0x7b, 0x43, 0x61, 0xb0, 0x46, 0x85, + 0x56, 0x61, 0xb8, 0x1d, 0x46, 0x49, 0x5c, 0x1d, 0x61, 0xdd, 0xfd, 0x48, 0xc1, 0x52, 0xe2, 0x5f, + 0xdb, 0x08, 0xa3, 0x24, 0xfd, 0x00, 0xfa, 0x2f, 0xc6, 0xbc, 0x38, 0xfa, 0x11, 0x28, 0x93, 0x60, + 0xb7, 0x3a, 0xca, 0xb8, 0xcc, 0xe5, 0x71, 0x59, 0x09, 0x76, 0x6f, 0x3a, 0x51, 0x2a, 0x67, 0x56, + 0x82, 0x5d, 0x4c, 0xcb, 0xa0, 0x37, 0xa1, 0x22, 0xed, 0x87, 0x71, 0x75, 0xac, 0x78, 0x8a, 0x61, + 0x41, 0x84, 0xc9, 0x7b, 0x1d, 0x2f, 0x22, 0x3b, 0x24, 0x48, 0xe2, 0xf4, 0x04, 0x28, 0xb1, 0x31, + 0x4e, 0xb9, 0xa1, 0x37, 0x61, 0x82, 0x6b, 0x7e, 0x57, 0xc3, 0x4e, 0x90, 0xc4, 0xd5, 0x0a, 0x6b, + 0x5e, 0xae, 0xb1, 0xe9, 0x66, 0x4a, 0xb7, 0x74, 0x52, 0x30, 0x9d, 0xd0, 0x80, 0x31, 0x36, 0x58, + 0x21, 0x0c, 0x93, 0xbe, 0xb7, 0x4b, 0x02, 0x12, 0xc7, 0x8d, 0x28, 0xbc, 0x45, 0xaa, 0xc0, 0x5a, + 0x7e, 0x26, 0xdf, 0x06, 0x13, 0xde, 0x22, 0x4b, 0xb3, 0x07, 0xfb, 0xb5, 0xc9, 0x2b, 0x7a, 0x19, + 0x6c, 0xb2, 0x40, 0x37, 0x60, 0x8a, 0xaa, 0x94, 0x5e, 0xca, 0x74, 0xbc, 0x1f, 0x53, 0x74, 0xb0, + 0x5f, 0x9b, 0xc2, 0x46, 0x21, 0x9c, 0x61, 0x82, 0x5e, 0x83, 0x8a, 0xef, 0x6d, 0x90, 0xd6, 0x5e, + 0xcb, 0x27, 0xd5, 0x09, 0xc6, 0x31, 0x77, 0x59, 0x5d, 0x91, 0x44, 0x5c, 0x65, 0x57, 0x7f, 0x71, + 0x5a, 0x1c, 0xdd, 0x84, 0xd3, 0x09, 0x89, 0x76, 0xbc, 0xc0, 0xa1, 0xcb, 0x41, 0xe8, 0x93, 0xcc, + 0x92, 0x35, 0xc9, 0xe6, 0xdb, 0x59, 0xd1, 0x75, 0xa7, 0xd7, 0x73, 0xa9, 0x70, 0x41, 0x69, 0x74, + 0x1d, 0xa6, 0xd9, 0x4a, 0x68, 0x74, 0x7c, 0xbf, 0x11, 0xfa, 0x5e, 0x6b, 0xaf, 0x3a, 0xc5, 0x18, + 0x7e, 0x42, 0x9a, 0xaa, 0xd6, 0x4c, 0x34, 0x3d, 0xa3, 0xa6, 0xff, 0x70, 0xb6, 0x34, 0xba, 0xc5, + 0x4c, 0x17, 0x9d, 0xc8, 0x4b, 0xf6, 0xe8, 0xfc, 0x25, 0x77, 0x92, 0xea, 0x74, 0xcf, 0x13, 0x9f, + 0x4e, 0xaa, 0xec, 0x1b, 0x3a, 0x10, 0x67, 0x19, 0xd2, 0xa5, 0x1d, 0x27, 0xae, 0x17, 0x54, 0x67, + 0x98, 0xc4, 0x50, 0x2b, 0xa3, 0x49, 0x81, 0x98, 0xe3, 0x98, 0xd9, 0x82, 0xfe, 0xb8, 0x4e, 0x25, + 0xe8, 0x2c, 0x23, 0x4c, 0xcd, 0x16, 0x12, 0x81, 0x53, 0x1a, 0xba, 0x2d, 0x27, 0xc9, 0x5e, 0x15, + 0x31, 0x52, 0xb5, 0x5c, 0xd6, 0xd7, 0xdf, 0xc4, 0x14, 0x8e, 0xae, 0xc0, 0x28, 0x09, 0x76, 0x57, + 0xa3, 0x70, 0xa7, 0x7a, 0xa2, 0x78, 0xcd, 0xae, 0x70, 0x12, 0x2e, 0xd0, 0xd3, 0x03, 0x80, 0x00, + 0x63, 0xc9, 0x02, 0xdd, 0x81, 0x6a, 0xce, 0x88, 0xf0, 0x01, 0x38, 0xc9, 0x06, 0xe0, 0x15, 0x51, + 0xb6, 0xba, 0x5e, 0x40, 0x77, 0xd8, 0x03, 0x87, 0x0b, 0xb9, 0xdb, 0xb7, 0x60, 0x4a, 0x09, 0x16, + 0x36, 0xb6, 0xa8, 0x06, 0xc3, 0x54, 0x62, 0xca, 0x43, 0x70, 0x85, 0x76, 0x25, 0x33, 0x26, 0x61, + 0x0e, 0x67, 0x5d, 0xe9, 0xbd, 0x4f, 0x96, 0xf6, 0x12, 0xc2, 0x8f, 0x45, 0x65, 0xad, 0x2b, 0x25, + 0x02, 0xa7, 0x34, 0xf6, 0xff, 0xe1, 0x8a, 0x49, 0x2a, 0xbd, 0x06, 0x90, 0xd7, 0x4f, 0xc3, 0xd8, + 0x56, 0x18, 0x27, 0x94, 0x9a, 0xd5, 0x31, 0x9c, 0xaa, 0x22, 0x97, 0x04, 0x1c, 0x2b, 0x0a, 0xf4, + 0x32, 0x4c, 0xb6, 0xf4, 0x0a, 0xc4, 0x66, 0x73, 0x4a, 0x14, 0x31, 0x6b, 0xc7, 0x26, 0x2d, 0x7a, + 0x09, 0xc6, 0xd8, 0x95, 0x42, 0x2b, 0xf4, 0xc5, 0x01, 0x4c, 0xee, 0x98, 0x63, 0x0d, 0x01, 0x3f, + 0xd4, 0x7e, 0x63, 0x45, 0x4d, 0x8f, 0xb1, 0xb4, 0x09, 0x6b, 0x0d, 0x21, 0xe6, 0xd5, 0x31, 0xf6, + 0x12, 0x83, 0x62, 0x81, 0xb5, 0xff, 0x66, 0x49, 0xeb, 0x65, 0x7a, 0xa4, 0x20, 0xa8, 0x01, 0xa3, + 0xb7, 0x1d, 0x2f, 0xf1, 0x82, 0x4d, 0xb1, 0x9f, 0x3f, 0xd1, 0x53, 0xe6, 0xb3, 0x42, 0x6f, 0xf0, + 0x02, 0x7c, 0x57, 0x12, 0x7f, 0xb0, 0x64, 0x43, 0x39, 0x46, 0x9d, 0x20, 0xa0, 0x1c, 0x4b, 0x83, + 0x72, 0xc4, 0xbc, 0x00, 0xe7, 0x28, 0xfe, 0x60, 0xc9, 0x06, 0xbd, 0x0d, 0x20, 0xe7, 0x0d, 0x71, + 0x85, 0x29, 0xff, 0xe9, 0xfe, 0x4c, 0xd7, 0x55, 0x99, 0xa5, 0x29, 0xba, 0xe7, 0xa5, 0xff, 0xb1, + 0xc6, 0xcf, 0x4e, 0x98, 0xde, 0xd3, 0xdd, 0x18, 0xf4, 0x59, 0xba, 0x54, 0x9d, 0x28, 0x21, 0xee, + 0x62, 0x22, 0x3a, 0xe7, 0xc9, 0xc1, 0xd4, 0xd6, 0x75, 0x6f, 0x87, 0xe8, 0xcb, 0x5a, 0x30, 0xc1, + 0x29, 0x3f, 0xfb, 0xb7, 0xca, 0x50, 0x2d, 0x6a, 0x2e, 0x9d, 0x74, 0xe4, 0x8e, 0x97, 0x2c, 0x53, + 0x75, 0xc5, 0x32, 0x27, 0xdd, 0x8a, 0x80, 0x63, 0x45, 0x41, 0x47, 0x3f, 0xf6, 0x36, 0xe5, 0xa9, + 0x63, 0x38, 0x1d, 0xfd, 0x26, 0x83, 0x62, 0x81, 0xa5, 0x74, 0x11, 0x71, 0x62, 0x71, 0x57, 0xa4, + 0xcd, 0x12, 0xcc, 0xa0, 0x58, 0x60, 0x75, 0x83, 0xc1, 0x50, 0x1f, 0x83, 0x81, 0xd1, 0x45, 0xc3, + 0xf7, 0xb6, 0x8b, 0xd0, 0x3b, 0x00, 0x1b, 0x5e, 0xe0, 0xc5, 0x5b, 0x8c, 0xfb, 0xc8, 0x91, 0xb9, + 0x2b, 0x65, 0x67, 0x55, 0x71, 0xc1, 0x1a, 0x47, 0xf4, 0x02, 0x8c, 0xab, 0x05, 0xb8, 0x56, 0xaf, + 0x8e, 0x9a, 0x17, 0x11, 0xa9, 0x34, 0xaa, 0x63, 0x9d, 0xce, 0x7e, 0x37, 0x3b, 0x5f, 0xc4, 0x0a, + 0xd0, 0xfa, 0xd7, 0x1a, 0xb4, 0x7f, 0x4b, 0xbd, 0xfb, 0xd7, 0xfe, 0xfd, 0x32, 0x4c, 0x1b, 0x95, + 0x75, 0xe2, 0x01, 0x64, 0xd6, 0x45, 0xba, 0x11, 0x39, 0x09, 0x11, 0xeb, 0xcf, 0xee, 0xbf, 0x54, + 0xf4, 0xcd, 0x8a, 0xae, 0x00, 0x5e, 0x1e, 0xbd, 0x03, 0x15, 0xdf, 0x89, 0x99, 0xf1, 0x81, 0x88, + 0x75, 0x37, 0x08, 0xb3, 0x54, 0xd1, 0x77, 0xe2, 0x44, 0xdb, 0x0b, 0x38, 0xef, 0x94, 0x25, 0xdd, + 0x31, 0xa9, 0x72, 0x22, 0x2f, 0x23, 0x55, 0x23, 0xa8, 0x06, 0xb3, 0x87, 0x39, 0x0e, 0xbd, 0x04, + 0x13, 0x11, 0x61, 0xb3, 0x62, 0x99, 0xea, 0x5a, 0x6c, 0x9a, 0x0d, 0xa7, 0x4a, 0x19, 0xd6, 0x70, + 0xd8, 0xa0, 0x4c, 0x75, 0xed, 0x91, 0x1e, 0xba, 0xf6, 0x13, 0x30, 0xca, 0x7e, 0xa8, 0x19, 0xa0, + 0x46, 0x63, 0x8d, 0x83, 0xb1, 0xc4, 0x67, 0x27, 0xcc, 0xd8, 0x80, 0x13, 0xe6, 0x49, 0x98, 0xaa, + 0x3b, 0x64, 0x27, 0x0c, 0x56, 0x02, 0xb7, 0x1d, 0x7a, 0x41, 0x82, 0xaa, 0x30, 0xc4, 0x76, 0x07, + 0xbe, 0xb6, 0x87, 0x28, 0x07, 0x3c, 0x44, 0x35, 0x67, 0xfb, 0x8f, 0x4a, 0x30, 0x59, 0x27, 0x3e, + 0x49, 0x08, 0x3f, 0x6b, 0xc4, 0x68, 0x15, 0xd0, 0x66, 0xe4, 0xb4, 0x48, 0x83, 0x44, 0x5e, 0xe8, + 0x36, 0x49, 0x2b, 0x0c, 0xd8, 0x15, 0x1f, 0xdd, 0xee, 0x4e, 0x1f, 0xec, 0xd7, 0xd0, 0xc5, 0x2e, + 0x2c, 0xce, 0x29, 0x81, 0xde, 0x82, 0xc9, 0x76, 0x44, 0x0c, 0x1b, 0x9a, 0x55, 0xa4, 0x2e, 0x34, + 0x74, 0x42, 0xae, 0xa9, 0x1a, 0x20, 0x6c, 0xb2, 0x42, 0x3f, 0x06, 0x33, 0x61, 0xd4, 0xde, 0x72, + 0x82, 0x3a, 0x69, 0x93, 0xc0, 0xa5, 0xaa, 0xb8, 0xb0, 0x11, 0x9c, 0x3c, 0xd8, 0xaf, 0xcd, 0x5c, + 0xcf, 0xe0, 0x70, 0x17, 0x35, 0x7a, 0x0b, 0x66, 0xdb, 0x51, 0xd8, 0x76, 0x36, 0xd9, 0x44, 0x11, + 0x1a, 0x07, 0x97, 0x3e, 0x4f, 0x1f, 0xec, 0xd7, 0x66, 0x1b, 0x59, 0xe4, 0xe1, 0x7e, 0xed, 0x04, + 0xeb, 0x28, 0x0a, 0x49, 0x91, 0xb8, 0x9b, 0x8d, 0xbd, 0x09, 0xa7, 0xea, 0xe1, 0xed, 0xe0, 0xb6, + 0x13, 0xb9, 0x8b, 0x8d, 0x35, 0xed, 0x70, 0x7f, 0x4d, 0x1e, 0x2e, 0xf9, 0x85, 0x69, 0xee, 0x3e, + 0xa5, 0x95, 0xe4, 0xea, 0xff, 0xaa, 0xe7, 0x93, 0x02, 0x23, 0xc2, 0xdf, 0x2e, 0x19, 0x35, 0xa5, + 0xf4, 0xca, 0x52, 0x6f, 0x15, 0x5a, 0xea, 0x5f, 0x87, 0xb1, 0x0d, 0x8f, 0xf8, 0x2e, 0x26, 0x1b, + 0x62, 0x64, 0x1e, 0x2f, 0xbe, 0x03, 0x5a, 0xa5, 0x94, 0xd2, 0x68, 0xc4, 0x8f, 0xa6, 0xab, 0xa2, + 0x30, 0x56, 0x6c, 0xd0, 0x36, 0xcc, 0xc8, 0xb3, 0x8f, 0xc4, 0x8a, 0x45, 0xfc, 0x44, 0xaf, 0x03, + 0x95, 0xc9, 0x9c, 0x0d, 0x20, 0xce, 0xb0, 0xc1, 0x5d, 0x8c, 0xe9, 0x59, 0x74, 0x87, 0x6e, 0x57, + 0x43, 0x6c, 0x4a, 0xb3, 0xb3, 0x28, 0x3b, 0x56, 0x33, 0xa8, 0xfd, 0x15, 0x0b, 0x1e, 0xe8, 0xea, + 0x19, 0x61, 0x5e, 0xb8, 0xc7, 0xa3, 0x90, 0x3d, 0xee, 0x97, 0xfa, 0x1f, 0xf7, 0xed, 0x5f, 0xb3, + 0xe0, 0xe4, 0xca, 0x4e, 0x3b, 0xd9, 0xab, 0x7b, 0xe6, 0x6d, 0xc2, 0x8b, 0x30, 0xb2, 0x43, 0x5c, + 0xaf, 0xb3, 0x23, 0x46, 0xae, 0x26, 0x45, 0xfa, 0x55, 0x06, 0x3d, 0xdc, 0xaf, 0x4d, 0x36, 0x93, + 0x30, 0x72, 0x36, 0x09, 0x07, 0x60, 0x41, 0x8e, 0x7e, 0x92, 0xeb, 0xa6, 0x57, 0xbc, 0x1d, 0x4f, + 0xde, 0xe9, 0xf5, 0x34, 0x79, 0xcd, 0xcb, 0x0e, 0x9d, 0x7f, 0xbd, 0xe3, 0x04, 0x89, 0x97, 0xec, + 0x99, 0xba, 0x2c, 0x63, 0x84, 0x53, 0x9e, 0xf6, 0xb7, 0x2d, 0x98, 0x96, 0xf2, 0x64, 0xd1, 0x75, + 0x23, 0x12, 0xc7, 0x68, 0x0e, 0x4a, 0x5e, 0x5b, 0xb4, 0x14, 0x44, 0xe9, 0xd2, 0x5a, 0x03, 0x97, + 0xbc, 0x36, 0x6a, 0x40, 0x85, 0x5f, 0x0f, 0xa6, 0x13, 0x6c, 0xa0, 0x4b, 0x46, 0x76, 0xf6, 0x5b, + 0x97, 0x25, 0x71, 0xca, 0x44, 0x6a, 0xc6, 0x6c, 0x2f, 0x2a, 0x9b, 0x37, 0x2d, 0x97, 0x04, 0x1c, + 0x2b, 0x0a, 0x74, 0x1e, 0xc6, 0x82, 0xd0, 0xe5, 0xb7, 0xb5, 0x7c, 0x5d, 0xb3, 0x69, 0x7b, 0x4d, + 0xc0, 0xb0, 0xc2, 0xda, 0x3f, 0x6b, 0xc1, 0x84, 0xfc, 0xb2, 0x01, 0x95, 0x74, 0xba, 0xbc, 0x52, + 0x05, 0x3d, 0x5d, 0x5e, 0x54, 0xc9, 0x66, 0x18, 0x43, 0xb7, 0x2e, 0x1f, 0x45, 0xb7, 0xb6, 0xbf, + 0x5c, 0x82, 0x29, 0xd9, 0x9c, 0x66, 0xe7, 0x56, 0x4c, 0x12, 0xb4, 0x0e, 0x15, 0x87, 0x77, 0x39, + 0x91, 0xb3, 0xf6, 0xd1, 0xfc, 0x53, 0x97, 0x31, 0x3e, 0xe9, 0x88, 0x2e, 0xca, 0xd2, 0x38, 0x65, + 0x84, 0x7c, 0x98, 0x0d, 0xc2, 0x84, 0x6d, 0x7d, 0x0a, 0xdf, 0xeb, 0x6e, 0x20, 0xcb, 0xfd, 0x8c, + 0xe0, 0x3e, 0x7b, 0x2d, 0xcb, 0x05, 0x77, 0x33, 0x46, 0x2b, 0xd2, 0xd2, 0x53, 0x66, 0x35, 0x9c, + 0xeb, 0x55, 0x43, 0xb1, 0xa1, 0xc7, 0xfe, 0x5d, 0x0b, 0x2a, 0x92, 0xec, 0x38, 0xae, 0x81, 0xae, + 0xc2, 0x68, 0xcc, 0x06, 0x41, 0x76, 0x8d, 0xdd, 0xab, 0xe1, 0x7c, 0xbc, 0xd2, 0x1d, 0x9d, 0xff, + 0x8f, 0xb1, 0xe4, 0xc1, 0x4c, 0xd5, 0xaa, 0xf9, 0x1f, 0x11, 0x53, 0xb5, 0x6a, 0x4f, 0xc1, 0x2e, + 0xf3, 0x5f, 0x58, 0x9b, 0xb5, 0xf3, 0x3c, 0x55, 0x3c, 0xdb, 0x11, 0xd9, 0xf0, 0xee, 0x64, 0x15, + 0xcf, 0x06, 0x83, 0x62, 0x81, 0x45, 0x6f, 0xc3, 0x44, 0x4b, 0x5a, 0x78, 0x53, 0x31, 0xf0, 0x58, + 0x4f, 0x7b, 0xb9, 0xba, 0x5a, 0xe1, 0x9e, 0x5c, 0xcb, 0x5a, 0x79, 0x6c, 0x70, 0x33, 0xaf, 0xd3, + 0xcb, 0xfd, 0xae, 0xd3, 0x53, 0xbe, 0x85, 0x17, 0xc2, 0xf6, 0x2f, 0x59, 0x30, 0xc2, 0xed, 0x84, + 0x83, 0x19, 0x56, 0xb5, 0xab, 0xa2, 0xb4, 0xef, 0x6e, 0x52, 0xa0, 0xb8, 0x39, 0x42, 0x57, 0xa1, + 0xc2, 0x7e, 0x30, 0x7b, 0x49, 0xb9, 0xd8, 0x85, 0x8d, 0xd7, 0xaa, 0x37, 0xf0, 0xa6, 0x2c, 0x86, + 0x53, 0x0e, 0xf6, 0xcf, 0x97, 0xa9, 0xa8, 0x4a, 0x49, 0x8d, 0x5d, 0xdc, 0xba, 0x7f, 0xbb, 0x78, + 0xe9, 0x7e, 0xed, 0xe2, 0x9b, 0x30, 0xdd, 0xd2, 0xee, 0xa5, 0xd2, 0x91, 0x3c, 0xdf, 0x73, 0x92, + 0x68, 0x57, 0x58, 0xdc, 0x56, 0xb6, 0x6c, 0x32, 0xc1, 0x59, 0xae, 0xe8, 0xb3, 0x30, 0xc1, 0xc7, + 0x59, 0xd4, 0x32, 0xc4, 0x6a, 0xf9, 0x44, 0xf1, 0x7c, 0xd1, 0xab, 0x60, 0x33, 0xb1, 0xa9, 0x15, + 0xc7, 0x06, 0x33, 0xfb, 0x8b, 0xc3, 0x30, 0xbc, 0xb2, 0x4b, 0x82, 0xe4, 0x18, 0x04, 0x52, 0x0b, + 0xa6, 0xbc, 0x60, 0x37, 0xf4, 0x77, 0x89, 0xcb, 0xf1, 0x47, 0xd9, 0x5c, 0x4f, 0x0b, 0xd6, 0x53, + 0x6b, 0x06, 0x0b, 0x9c, 0x61, 0x79, 0x3f, 0x4e, 0xee, 0x17, 0x61, 0x84, 0x8f, 0xbd, 0x38, 0xb6, + 0xe7, 0x5a, 0xc1, 0x59, 0x27, 0x8a, 0x55, 0x90, 0x5a, 0x15, 0xb8, 0xd9, 0x5d, 0x14, 0x47, 0xef, + 0xc2, 0xd4, 0x86, 0x17, 0xc5, 0x09, 0x3d, 0x72, 0xc7, 0x89, 0xb3, 0xd3, 0xbe, 0x8b, 0x93, 0xba, + 0xea, 0x87, 0x55, 0x83, 0x13, 0xce, 0x70, 0x46, 0x9b, 0x30, 0x49, 0x0f, 0x8f, 0x69, 0x55, 0xa3, + 0x47, 0xae, 0x4a, 0x99, 0xe2, 0xae, 0xe8, 0x8c, 0xb0, 0xc9, 0x97, 0x0a, 0x93, 0x16, 0x3b, 0x6c, + 0x8e, 0x31, 0x8d, 0x42, 0x09, 0x13, 0x7e, 0xca, 0xe4, 0x38, 0x2a, 0x93, 0x98, 0x3f, 0x47, 0xc5, + 0x94, 0x49, 0xa9, 0xd7, 0x86, 0xfd, 0x55, 0xba, 0x3b, 0xd2, 0x3e, 0x3c, 0x86, 0xad, 0xe5, 0x55, + 0x73, 0x6b, 0x39, 0x53, 0x38, 0x9e, 0x05, 0xdb, 0xca, 0xe7, 0x60, 0x5c, 0x1b, 0x6e, 0xb4, 0x00, + 0x95, 0x96, 0x74, 0x3e, 0x10, 0x52, 0x57, 0xa9, 0x2f, 0xca, 0x2b, 0x01, 0xa7, 0x34, 0xb4, 0x37, + 0xa8, 0xb2, 0x97, 0x75, 0x46, 0xa2, 0xaa, 0x20, 0x66, 0x18, 0xfb, 0x39, 0x80, 0x95, 0x3b, 0xa4, + 0xb5, 0xc8, 0x0f, 0x5f, 0xda, 0x1d, 0x97, 0x55, 0x7c, 0xc7, 0x65, 0xff, 0xb1, 0x05, 0x53, 0xab, + 0xcb, 0x86, 0x52, 0x3e, 0x0f, 0xc0, 0xb5, 0xd0, 0x37, 0xde, 0xb8, 0x26, 0xad, 0xc3, 0xdc, 0xc0, + 0xa7, 0xa0, 0x58, 0xa3, 0x40, 0x67, 0xa0, 0xec, 0x77, 0x02, 0xa1, 0x1c, 0x8e, 0x1e, 0xec, 0xd7, + 0xca, 0x57, 0x3a, 0x01, 0xa6, 0x30, 0xcd, 0xff, 0xa7, 0x3c, 0xb0, 0xff, 0x4f, 0x5f, 0xc7, 0x69, + 0x54, 0x83, 0xe1, 0xdb, 0xb7, 0x3d, 0x37, 0xae, 0x0e, 0xa7, 0x96, 0xeb, 0x37, 0xde, 0x58, 0xab, + 0xc7, 0x98, 0xc3, 0xed, 0xff, 0xbf, 0x0c, 0x33, 0xab, 0x3e, 0xb9, 0x63, 0x7c, 0xd6, 0x63, 0x30, + 0xe2, 0x46, 0xde, 0x2e, 0x89, 0xb2, 0xbb, 0x78, 0x9d, 0x41, 0xb1, 0xc0, 0x0e, 0xec, 0xb3, 0x74, + 0xa3, 0x7b, 0x3f, 0xbe, 0xd7, 0x5e, 0x5a, 0xfd, 0xbb, 0xe2, 0x6d, 0x18, 0xe5, 0x57, 0xa5, 0xbc, + 0x33, 0xc6, 0x2f, 0x3c, 0x9b, 0xd7, 0x84, 0x6c, 0x5f, 0xcc, 0x0b, 0xe3, 0x07, 0xf7, 0x1b, 0x51, + 0x42, 0x4c, 0x40, 0xb1, 0x64, 0x39, 0xf7, 0x69, 0x98, 0xd0, 0x29, 0x8f, 0xe4, 0x40, 0xf2, 0x57, + 0x2c, 0x38, 0xb1, 0xea, 0x87, 0xad, 0xed, 0x8c, 0x03, 0xd9, 0x0b, 0x30, 0x4e, 0xd7, 0x53, 0x6c, + 0x38, 0xa3, 0x1a, 0xee, 0xc9, 0x02, 0x85, 0x75, 0x3a, 0xad, 0xd8, 0x8d, 0x1b, 0x6b, 0xf5, 0x3c, + 0xaf, 0x66, 0x81, 0xc2, 0x3a, 0x9d, 0xfd, 0x07, 0x16, 0x3c, 0x7c, 0x71, 0x79, 0x25, 0xf5, 0xa1, + 0xec, 0x72, 0xac, 0xa6, 0xca, 0x9d, 0xab, 0x35, 0x25, 0x55, 0xee, 0xea, 0xac, 0x15, 0x02, 0xfb, + 0x51, 0x09, 0x1a, 0xf8, 0x15, 0x0b, 0x4e, 0x5c, 0xf4, 0x12, 0x4c, 0xda, 0x61, 0xd6, 0xc5, 0x37, + 0x22, 0xed, 0x30, 0xf6, 0x92, 0x30, 0xda, 0xcb, 0xba, 0xf8, 0x62, 0x85, 0xc1, 0x1a, 0x15, 0xaf, + 0x79, 0xd7, 0x8b, 0x69, 0x4b, 0x4b, 0xe6, 0x09, 0x13, 0x0b, 0x38, 0x56, 0x14, 0xf4, 0xc3, 0x5c, + 0x2f, 0x62, 0x1a, 0xc2, 0x9e, 0x58, 0xce, 0xea, 0xc3, 0xea, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0x2b, + 0x16, 0x9c, 0xba, 0xe8, 0x77, 0xe2, 0x84, 0x44, 0x1b, 0xb1, 0xd1, 0xd8, 0xe7, 0xa0, 0x42, 0xa4, + 0x16, 0x2e, 0xda, 0xaa, 0xf6, 0x0d, 0xa5, 0x9e, 0x73, 0xff, 0x62, 0x45, 0x37, 0x80, 0x37, 0xe6, + 0xd1, 0xbc, 0x08, 0xbf, 0x56, 0x82, 0xc9, 0x4b, 0xeb, 0xeb, 0x8d, 0x8b, 0x24, 0x11, 0x22, 0xb3, + 0xbf, 0x15, 0x09, 0x6b, 0x07, 0xe1, 0x5e, 0xba, 0x4e, 0x27, 0xf1, 0xfc, 0x79, 0x1e, 0xd0, 0x32, + 0xbf, 0x16, 0x24, 0xd7, 0xa3, 0x66, 0x12, 0x79, 0xc1, 0x66, 0xee, 0xd1, 0x59, 0x0a, 0xf6, 0x72, + 0x91, 0x60, 0x47, 0xcf, 0xc1, 0x08, 0x8b, 0xa8, 0x91, 0x5a, 0xc7, 0x83, 0x4a, 0x55, 0x60, 0xd0, + 0xc3, 0xfd, 0x5a, 0xe5, 0x06, 0x5e, 0xe3, 0x7f, 0xb0, 0x20, 0x45, 0x37, 0x60, 0x7c, 0x2b, 0x49, + 0xda, 0x97, 0x88, 0xe3, 0x92, 0x48, 0x4a, 0x87, 0xb3, 0x79, 0xd2, 0x81, 0x76, 0x02, 0x27, 0x4b, + 0x17, 0x54, 0x0a, 0x8b, 0xb1, 0xce, 0xc7, 0x6e, 0x02, 0xa4, 0xb8, 0x7b, 0x74, 0x6c, 0xb0, 0xbf, + 0x67, 0xc1, 0xe8, 0x25, 0x27, 0x70, 0x7d, 0x12, 0xa1, 0x57, 0x60, 0x88, 0xdc, 0x21, 0x2d, 0xb1, + 0x83, 0xe7, 0x36, 0x38, 0xdd, 0xe5, 0xb8, 0x21, 0x8c, 0xfe, 0xc7, 0xac, 0x14, 0xba, 0x04, 0xa3, + 0xb4, 0xb5, 0x17, 0x95, 0xa7, 0xf7, 0x23, 0x45, 0x5f, 0xac, 0x86, 0x9d, 0x6f, 0x8c, 0x02, 0x84, + 0x65, 0x71, 0x66, 0xd0, 0x69, 0xb5, 0x9b, 0x54, 0x80, 0x25, 0xbd, 0x8e, 0x5b, 0xeb, 0xcb, 0x0d, + 0x4e, 0x24, 0xb8, 0x71, 0x83, 0x8e, 0x04, 0xe2, 0x94, 0x89, 0xbd, 0x0e, 0x15, 0x3a, 0xa8, 0x8b, + 0xbe, 0xe7, 0xf4, 0xb6, 0x25, 0x3d, 0x05, 0x15, 0x69, 0xd7, 0x89, 0x85, 0xb3, 0x38, 0xe3, 0x2a, + 0xcd, 0x3e, 0x31, 0x4e, 0xf1, 0xf6, 0x06, 0x9c, 0x64, 0x17, 0xa5, 0x4e, 0xb2, 0x65, 0xac, 0xb1, + 0xfe, 0x93, 0xf9, 0x69, 0xa1, 0x5f, 0xf1, 0x91, 0xa9, 0x6a, 0xbe, 0xb2, 0x13, 0x92, 0xa3, 0xa6, + 0x6b, 0xfd, 0xa7, 0x21, 0x98, 0x5d, 0x6b, 0x2e, 0x37, 0x4d, 0xe3, 0xe2, 0x4b, 0x30, 0xc1, 0x35, + 0x01, 0x3a, 0xa1, 0x1d, 0x5f, 0xd4, 0xa6, 0x2e, 0x0f, 0xd6, 0x35, 0x1c, 0x36, 0x28, 0xd1, 0xc3, + 0x50, 0xf6, 0xde, 0x0b, 0xb2, 0xee, 0x70, 0x6b, 0xaf, 0x5f, 0xc3, 0x14, 0x4e, 0xd1, 0x54, 0xa9, + 0xe0, 0x02, 0x54, 0xa1, 0x95, 0x62, 0xf1, 0x2a, 0x4c, 0x79, 0x71, 0x2b, 0xf6, 0xd6, 0x02, 0x2a, + 0x5d, 0xd2, 0x48, 0x89, 0x54, 0xe3, 0xa7, 0x4d, 0x55, 0x58, 0x9c, 0xa1, 0xd6, 0xa4, 0xf9, 0xf0, + 0xc0, 0x8a, 0x49, 0x5f, 0x9f, 0x69, 0xaa, 0x73, 0xb5, 0xd9, 0xd7, 0xc5, 0xcc, 0x35, 0x47, 0xe8, + 0x5c, 0xfc, 0x83, 0x63, 0x2c, 0x71, 0xe8, 0x22, 0xcc, 0xb6, 0xb6, 0x9c, 0xf6, 0x62, 0x27, 0xd9, + 0xaa, 0x7b, 0x71, 0x2b, 0xdc, 0x25, 0xd1, 0x1e, 0xd3, 0x84, 0xc7, 0x52, 0x23, 0x93, 0x42, 0x2c, + 0x5f, 0x5a, 0x6c, 0x50, 0x4a, 0xdc, 0x5d, 0xc6, 0x54, 0x41, 0xe0, 0x9e, 0xa9, 0x20, 0x8b, 0x30, + 0x2d, 0xeb, 0x6a, 0x92, 0x98, 0x6d, 0x0f, 0xe3, 0xac, 0x75, 0x2a, 0x90, 0x49, 0x80, 0x55, 0xdb, + 0xb2, 0xf4, 0xe8, 0x45, 0x98, 0xf4, 0x02, 0x2f, 0xf1, 0x9c, 0x24, 0x8c, 0xd8, 0xe6, 0x3a, 0xc1, + 0x37, 0x0c, 0x2a, 0xe1, 0xd7, 0x74, 0x04, 0x36, 0xe9, 0xec, 0x77, 0xa1, 0xa2, 0xfc, 0xcd, 0xa4, + 0xcb, 0xa4, 0x55, 0xe0, 0x32, 0xd9, 0x7f, 0x47, 0x90, 0x56, 0xf3, 0x72, 0xae, 0xd5, 0xfc, 0xef, + 0x58, 0x90, 0xba, 0xdd, 0xa0, 0x4b, 0x50, 0x69, 0x87, 0xec, 0xe6, 0x2c, 0x92, 0xd7, 0xd1, 0x0f, + 0xe6, 0x0a, 0x0f, 0x2e, 0xa8, 0x78, 0xff, 0x35, 0x64, 0x09, 0x9c, 0x16, 0x46, 0x4b, 0x30, 0xda, + 0x8e, 0x48, 0x33, 0x61, 0xa1, 0x1e, 0x7d, 0xf9, 0xf0, 0x39, 0xc2, 0xe9, 0xb1, 0x2c, 0x68, 0xff, + 0x86, 0x05, 0xc0, 0x8d, 0xd2, 0x4e, 0xb0, 0x49, 0x8e, 0xe1, 0xa0, 0x5d, 0x87, 0xa1, 0xb8, 0x4d, + 0x5a, 0xbd, 0xee, 0x34, 0xd3, 0xf6, 0x34, 0xdb, 0xa4, 0x95, 0x76, 0x38, 0xfd, 0x87, 0x59, 0x69, + 0xfb, 0x67, 0x00, 0xa6, 0x52, 0x32, 0x7a, 0x00, 0x42, 0xcf, 0x18, 0x6e, 0xf9, 0x67, 0x32, 0x6e, + 0xf9, 0x15, 0x46, 0xad, 0x79, 0xe2, 0xbf, 0x0b, 0xe5, 0x1d, 0xe7, 0x8e, 0x38, 0x65, 0x3d, 0xd5, + 0xbb, 0x19, 0x94, 0xff, 0xfc, 0x55, 0xe7, 0x0e, 0xd7, 0x63, 0x9f, 0x92, 0x13, 0xe4, 0xaa, 0x73, + 0xe7, 0x90, 0xdf, 0x5c, 0x32, 0x21, 0x45, 0x0f, 0x73, 0x9f, 0xff, 0x93, 0xf4, 0x3f, 0x9b, 0x76, + 0xb4, 0x12, 0x56, 0x97, 0x17, 0x08, 0x13, 0xed, 0x40, 0x75, 0x79, 0x41, 0xb6, 0x2e, 0x2f, 0x18, + 0xa0, 0x2e, 0x2f, 0x40, 0xef, 0xc3, 0xa8, 0xb8, 0x12, 0x61, 0xfe, 0x84, 0xe3, 0x17, 0x16, 0x06, + 0xa8, 0x4f, 0xdc, 0xa8, 0xf0, 0x3a, 0x17, 0xa4, 0x9e, 0x2e, 0xa0, 0x7d, 0xeb, 0x95, 0x15, 0xa2, + 0xbf, 0x65, 0xc1, 0x94, 0xf8, 0x8d, 0xc9, 0x7b, 0x1d, 0x12, 0x27, 0x42, 0x1f, 0xf8, 0xd4, 0xe0, + 0x6d, 0x10, 0x05, 0x79, 0x53, 0x3e, 0x25, 0xc5, 0xac, 0x89, 0xec, 0xdb, 0xa2, 0x4c, 0x2b, 0xd0, + 0x3f, 0xb5, 0xe0, 0xe4, 0x8e, 0x73, 0x87, 0xd7, 0xc8, 0x61, 0xd8, 0x49, 0xbc, 0x50, 0xf8, 0x47, + 0xbe, 0x32, 0xd8, 0xf0, 0x77, 0x15, 0xe7, 0x8d, 0x94, 0xae, 0x54, 0x27, 0xf3, 0x48, 0xfa, 0x36, + 0x35, 0xb7, 0x5d, 0x73, 0x1b, 0x30, 0x26, 0xe7, 0x5b, 0xce, 0x69, 0xa8, 0xae, 0x2b, 0x3b, 0x47, + 0xbe, 0x91, 0xd2, 0x4e, 0x4f, 0xac, 0x1e, 0x31, 0xd7, 0xee, 0x6b, 0x3d, 0xef, 0xc2, 0x84, 0x3e, + 0xc7, 0xee, 0x6b, 0x5d, 0xef, 0xc1, 0x89, 0x9c, 0xb9, 0x74, 0x5f, 0xab, 0xbc, 0x0d, 0x67, 0x0a, + 0xe7, 0xc7, 0xfd, 0xac, 0xd8, 0xfe, 0x9a, 0xa5, 0xcb, 0xc1, 0x63, 0x30, 0x4f, 0x2d, 0x9b, 0xe6, + 0xa9, 0xb3, 0xbd, 0x57, 0x4e, 0x81, 0x8d, 0xea, 0x6d, 0xbd, 0xd1, 0x54, 0xaa, 0xa3, 0xd7, 0x60, + 0xc4, 0xa7, 0x10, 0x79, 0x0f, 0x67, 0xf7, 0x5f, 0x91, 0xa9, 0x2e, 0xc5, 0xe0, 0x31, 0x16, 0x1c, + 0xec, 0xdf, 0xb6, 0x60, 0xe8, 0x18, 0x7a, 0x02, 0x9b, 0x3d, 0xf1, 0x4c, 0x21, 0x6b, 0x91, 0xad, + 0x60, 0x1e, 0x3b, 0xb7, 0x57, 0xee, 0x24, 0x24, 0x88, 0x99, 0xfa, 0x9e, 0xdb, 0x31, 0xff, 0xbb, + 0x04, 0xe3, 0xb4, 0x2a, 0xe9, 0x34, 0xf2, 0x32, 0x4c, 0xfa, 0xce, 0x2d, 0xe2, 0x4b, 0x93, 0x79, + 0xf6, 0x10, 0x7b, 0x45, 0x47, 0x62, 0x93, 0x96, 0x16, 0xde, 0xd0, 0x6f, 0x0f, 0x84, 0xfe, 0xa2, + 0x0a, 0x1b, 0x57, 0x0b, 0xd8, 0xa4, 0xa5, 0xe7, 0xa9, 0xdb, 0x4e, 0xd2, 0xda, 0x12, 0x07, 0x5c, + 0xd5, 0xdc, 0x37, 0x28, 0x10, 0x73, 0x1c, 0x55, 0xe0, 0xe4, 0xec, 0xbc, 0x49, 0x22, 0xa6, 0xc0, + 0x71, 0xf5, 0x58, 0x29, 0x70, 0xd8, 0x44, 0xe3, 0x2c, 0x3d, 0xfa, 0x34, 0x4c, 0xd1, 0xce, 0x09, + 0x3b, 0x89, 0x74, 0x89, 0x19, 0x66, 0x2e, 0x31, 0xcc, 0x03, 0x7a, 0xdd, 0xc0, 0xe0, 0x0c, 0x25, + 0x6a, 0xc0, 0x49, 0x2f, 0x68, 0xf9, 0x1d, 0x97, 0xdc, 0x08, 0xb8, 0x76, 0xe7, 0x7b, 0xef, 0x13, + 0x57, 0x28, 0xd0, 0xca, 0x7b, 0x69, 0x2d, 0x87, 0x06, 0xe7, 0x96, 0xb4, 0x7f, 0x12, 0x4e, 0x5c, + 0x09, 0x1d, 0x77, 0xc9, 0xf1, 0x9d, 0xa0, 0x45, 0xa2, 0xb5, 0x60, 0xb3, 0xef, 0x85, 0xbc, 0x7e, + 0x7d, 0x5e, 0xea, 0x77, 0x7d, 0x6e, 0x6f, 0x01, 0xd2, 0x2b, 0x10, 0xae, 0x60, 0x18, 0x46, 0x3d, + 0x5e, 0x95, 0x98, 0xfe, 0x8f, 0xe7, 0x6b, 0xd7, 0x5d, 0x2d, 0xd3, 0x9c, 0x9c, 0x38, 0x00, 0x4b, + 0x46, 0xf6, 0x4b, 0x90, 0x1b, 0x9f, 0xd1, 0xff, 0x28, 0x6d, 0xbf, 0x00, 0xb3, 0xac, 0xe4, 0xd1, + 0x8e, 0x79, 0xf6, 0x5f, 0xb7, 0x60, 0xfa, 0x5a, 0x26, 0x06, 0xf6, 0x31, 0x18, 0x89, 0x49, 0x94, + 0x63, 0x0b, 0x6d, 0x32, 0x28, 0x16, 0xd8, 0x7b, 0x6e, 0x73, 0xf9, 0xbe, 0x05, 0x15, 0x15, 0xb0, + 0x7e, 0x0c, 0x4a, 0xed, 0xb2, 0xa1, 0xd4, 0xe6, 0xda, 0x02, 0x54, 0x73, 0x8a, 0x74, 0x5a, 0x74, + 0x59, 0xc5, 0x86, 0xf6, 0x30, 0x03, 0xa4, 0x6c, 0x78, 0x24, 0xe1, 0x94, 0x19, 0x40, 0x2a, 0xa3, + 0x45, 0xd9, 0x8d, 0xb8, 0xa2, 0xfd, 0x88, 0xdc, 0x88, 0xab, 0xf6, 0x14, 0x48, 0xbf, 0x86, 0xd6, + 0x64, 0xb6, 0x2b, 0xfc, 0x28, 0xf3, 0x1c, 0x65, 0x6b, 0x53, 0x05, 0x51, 0xd7, 0x84, 0x27, 0xa8, + 0x80, 0x1e, 0x32, 0x41, 0x26, 0xfe, 0xf1, 0xe4, 0x02, 0x69, 0x11, 0xfb, 0x12, 0x4c, 0x67, 0x3a, + 0x0c, 0xbd, 0x00, 0xc3, 0xed, 0x2d, 0x27, 0x26, 0x19, 0x4f, 0xa0, 0xe1, 0x06, 0x05, 0x1e, 0xee, + 0xd7, 0xa6, 0x54, 0x01, 0x06, 0xc1, 0x9c, 0xda, 0xfe, 0xef, 0x16, 0x0c, 0x5d, 0x0b, 0xdd, 0xe3, + 0x98, 0x4c, 0xaf, 0x1a, 0x93, 0xe9, 0xa1, 0xa2, 0xd4, 0x2c, 0x85, 0xf3, 0x68, 0x35, 0x33, 0x8f, + 0xce, 0x16, 0x72, 0xe8, 0x3d, 0x85, 0x76, 0x60, 0x9c, 0x25, 0x7c, 0x11, 0x5e, 0x49, 0xcf, 0x19, + 0xe7, 0xab, 0x5a, 0xe6, 0x7c, 0x35, 0xad, 0x91, 0x6a, 0xa7, 0xac, 0x27, 0x60, 0x54, 0x78, 0xc6, + 0x64, 0x7d, 0x64, 0x05, 0x2d, 0x96, 0x78, 0xfb, 0x97, 0xca, 0x60, 0x24, 0x98, 0x41, 0xbf, 0x6b, + 0xc1, 0x7c, 0xc4, 0xa3, 0x82, 0xdc, 0x7a, 0x27, 0xf2, 0x82, 0xcd, 0x66, 0x6b, 0x8b, 0xb8, 0x1d, + 0xdf, 0x0b, 0x36, 0xd7, 0x36, 0x83, 0x50, 0x81, 0x57, 0xee, 0x90, 0x56, 0x87, 0xd9, 0xc1, 0xfb, + 0x64, 0xb3, 0x51, 0x37, 0xcf, 0x17, 0x0e, 0xf6, 0x6b, 0xf3, 0xf8, 0x48, 0xbc, 0xf1, 0x11, 0xdb, + 0x82, 0xfe, 0xc0, 0x82, 0x05, 0x9e, 0x77, 0x65, 0xf0, 0xf6, 0xf7, 0x38, 0x8d, 0x36, 0x24, 0xab, + 0x94, 0xc9, 0x3a, 0x89, 0x76, 0x96, 0x5e, 0x14, 0x1d, 0xba, 0xd0, 0x38, 0x5a, 0x5d, 0xf8, 0xa8, + 0x8d, 0xb3, 0xff, 0x55, 0x19, 0x26, 0x69, 0x2f, 0xa6, 0x91, 0xf0, 0x2f, 0x18, 0x53, 0xe2, 0x91, + 0xcc, 0x94, 0x98, 0x35, 0x88, 0xef, 0x4d, 0x10, 0x7c, 0x0c, 0xb3, 0xbe, 0x13, 0x27, 0x97, 0x88, + 0x13, 0x25, 0xb7, 0x88, 0xc3, 0xae, 0x7a, 0xc5, 0x34, 0x3f, 0xca, 0xed, 0xb1, 0x32, 0x7f, 0x5d, + 0xc9, 0x32, 0xc3, 0xdd, 0xfc, 0xd1, 0x2e, 0x20, 0x76, 0xad, 0x1c, 0x39, 0x41, 0xcc, 0xbf, 0xc5, + 0x13, 0x36, 0xf2, 0xa3, 0xd5, 0x3a, 0x27, 0x6a, 0x45, 0x57, 0xba, 0xb8, 0xe1, 0x9c, 0x1a, 0x34, + 0x77, 0x81, 0xe1, 0x41, 0xdd, 0x05, 0x46, 0xfa, 0x38, 0xa2, 0xef, 0xc0, 0x8c, 0x18, 0x95, 0x0d, + 0x6f, 0x53, 0x6c, 0xd2, 0x6f, 0x66, 0xdc, 0x89, 0xac, 0xc1, 0x1d, 0x1f, 0xfa, 0xf8, 0x12, 0xd9, + 0x3f, 0x05, 0x27, 0x68, 0x75, 0xa6, 0xdb, 0x74, 0x8c, 0x08, 0x4c, 0x6f, 0x77, 0x6e, 0x11, 0x9f, + 0x24, 0x12, 0x26, 0x2a, 0xcd, 0x55, 0xfb, 0xcd, 0xd2, 0xa9, 0x6e, 0x79, 0xd9, 0x64, 0x81, 0xb3, + 0x3c, 0xed, 0x5f, 0xb6, 0x80, 0x39, 0x26, 0x1e, 0xc3, 0xf6, 0xf7, 0x19, 0x73, 0xfb, 0xab, 0x16, + 0x49, 0xa0, 0x82, 0x9d, 0xef, 0x79, 0x3e, 0x2c, 0x8d, 0x28, 0xbc, 0xb3, 0x27, 0x75, 0xff, 0xfe, + 0x1a, 0xd7, 0xff, 0xb2, 0xf8, 0x82, 0x54, 0x41, 0x92, 0xe8, 0xa7, 0x61, 0xac, 0xe5, 0xb4, 0x9d, + 0x16, 0xcf, 0xec, 0x55, 0x68, 0xfd, 0x31, 0x0a, 0xcd, 0x2f, 0x8b, 0x12, 0xdc, 0x9a, 0xf1, 0x49, + 0xf9, 0x95, 0x12, 0xdc, 0xd7, 0x82, 0xa1, 0xaa, 0x9c, 0xdb, 0x86, 0x49, 0x83, 0xd9, 0x7d, 0x3d, + 0xfa, 0xfe, 0x34, 0xdf, 0x2e, 0xd4, 0x89, 0x65, 0x07, 0x66, 0x03, 0xed, 0x3f, 0x15, 0x8e, 0x52, + 0x9d, 0xfe, 0x78, 0xbf, 0x0d, 0x81, 0x49, 0x52, 0xcd, 0xf1, 0x32, 0xc3, 0x06, 0x77, 0x73, 0xb6, + 0xff, 0x9e, 0x05, 0x0f, 0xe8, 0x84, 0x5a, 0xfc, 0x6a, 0x3f, 0x7b, 0x72, 0x1d, 0xc6, 0xc2, 0x36, + 0x89, 0x9c, 0xf4, 0x4c, 0x76, 0x5e, 0x76, 0xfa, 0x75, 0x01, 0x3f, 0xdc, 0xaf, 0x9d, 0xd4, 0xb9, + 0x4b, 0x38, 0x56, 0x25, 0x91, 0x0d, 0x23, 0xac, 0x33, 0x62, 0x11, 0x5b, 0xcc, 0xb2, 0x5f, 0xb1, + 0xeb, 0xae, 0x18, 0x0b, 0x8c, 0xfd, 0x33, 0x16, 0x9f, 0x58, 0x7a, 0xd3, 0xd1, 0x7b, 0x30, 0xb3, + 0x43, 0x8f, 0x6f, 0x2b, 0x77, 0xda, 0x11, 0x37, 0xa3, 0xcb, 0x7e, 0x7a, 0xaa, 0x5f, 0x3f, 0x69, + 0x1f, 0xb9, 0x54, 0x15, 0x6d, 0x9e, 0xb9, 0x9a, 0x61, 0x86, 0xbb, 0xd8, 0xdb, 0x7f, 0x51, 0xe2, + 0x2b, 0x91, 0x69, 0x75, 0x4f, 0xc0, 0x68, 0x3b, 0x74, 0x97, 0xd7, 0xea, 0x58, 0xf4, 0x90, 0x12, + 0x57, 0x0d, 0x0e, 0xc6, 0x12, 0x8f, 0x2e, 0x00, 0x90, 0x3b, 0x09, 0x89, 0x02, 0xc7, 0x57, 0x97, + 0xf1, 0x4a, 0x79, 0x5a, 0x51, 0x18, 0xac, 0x51, 0xd1, 0x32, 0xed, 0x28, 0xdc, 0xf5, 0x5c, 0x16, + 0xdc, 0x51, 0x36, 0xcb, 0x34, 0x14, 0x06, 0x6b, 0x54, 0xf4, 0xa8, 0xdc, 0x09, 0x62, 0xbe, 0x01, + 0x3a, 0xb7, 0x44, 0x02, 0x9d, 0xb1, 0xf4, 0xa8, 0x7c, 0x43, 0x47, 0x62, 0x93, 0x16, 0x2d, 0xc2, + 0x48, 0xe2, 0xb0, 0x2b, 0xe6, 0xe1, 0x62, 0x97, 0x9d, 0x75, 0x4a, 0xa1, 0xa7, 0x7a, 0xa2, 0x05, + 0xb0, 0x28, 0x88, 0xde, 0x92, 0x22, 0x98, 0x8b, 0x64, 0xe1, 0x7a, 0x55, 0x38, 0x6d, 0x75, 0xf1, + 0xad, 0xcb, 0x60, 0xe1, 0xd2, 0x65, 0xf0, 0xb2, 0xbf, 0x50, 0x01, 0x48, 0xb5, 0x3d, 0xf4, 0x7e, + 0x97, 0x88, 0x78, 0xba, 0xb7, 0x7e, 0x78, 0xef, 0xe4, 0x03, 0xfa, 0xa2, 0x05, 0xe3, 0x8e, 0xef, + 0x87, 0x2d, 0x27, 0x61, 0xbd, 0x5c, 0xea, 0x2d, 0xa2, 0x44, 0xfd, 0x8b, 0x69, 0x09, 0xde, 0x84, + 0xe7, 0xe4, 0xed, 0xb1, 0x86, 0xe9, 0xdb, 0x0a, 0xbd, 0x62, 0xf4, 0x49, 0x79, 0x08, 0xe0, 0xd3, + 0x63, 0x2e, 0x7b, 0x08, 0xa8, 0x30, 0x69, 0xac, 0xe9, 0xff, 0xe8, 0x86, 0x91, 0xb7, 0x66, 0xa8, + 0x38, 0x44, 0xd7, 0x50, 0x7a, 0xfa, 0xa5, 0xac, 0x41, 0x0d, 0xdd, 0x05, 0x7d, 0xb8, 0x38, 0x8e, + 0x5d, 0xd3, 0xae, 0xfb, 0xb8, 0x9f, 0xbf, 0x0b, 0xd3, 0xae, 0xb9, 0xdd, 0x8a, 0xd9, 0xf4, 0x78, + 0x11, 0xdf, 0xcc, 0xee, 0x9c, 0x6e, 0xb0, 0x19, 0x04, 0xce, 0x32, 0x46, 0x0d, 0x1e, 0x0c, 0xb0, + 0x16, 0x6c, 0x84, 0xc2, 0x85, 0xcf, 0x2e, 0x1c, 0xcb, 0xbd, 0x38, 0x21, 0x3b, 0x94, 0x32, 0xdd, + 0x47, 0xaf, 0x89, 0xb2, 0x58, 0x71, 0x41, 0xaf, 0xc1, 0x08, 0x8b, 0xd2, 0x8a, 0xab, 0x63, 0xc5, + 0x76, 0x40, 0x33, 0xc0, 0x38, 0x5d, 0x54, 0xec, 0x6f, 0x8c, 0x05, 0x07, 0x74, 0x49, 0xa6, 0x09, + 0x88, 0xd7, 0x82, 0x1b, 0x31, 0x61, 0x69, 0x02, 0x2a, 0x4b, 0x1f, 0x4f, 0x33, 0x00, 0x70, 0x78, + 0x6e, 0x52, 0x47, 0xa3, 0x24, 0xd5, 0x57, 0xc4, 0x7f, 0x99, 0x2b, 0xb2, 0x0a, 0xc5, 0xcd, 0x33, + 0xf3, 0x49, 0xa6, 0xdd, 0x79, 0xd3, 0x64, 0x81, 0xb3, 0x3c, 0x8f, 0x75, 0xfb, 0x9c, 0x0b, 0x60, + 0x26, 0xbb, 0xb0, 0xee, 0xeb, 0x76, 0xfd, 0xbd, 0x21, 0x98, 0x32, 0x27, 0x02, 0x5a, 0x80, 0x8a, + 0x60, 0xa2, 0x92, 0x7c, 0xa9, 0xb9, 0x7d, 0x55, 0x22, 0x70, 0x4a, 0xc3, 0x92, 0x9c, 0xb1, 0xe2, + 0x9a, 0x6f, 0x56, 0x9a, 0xe4, 0x4c, 0x61, 0xb0, 0x46, 0x45, 0x95, 0xe8, 0x5b, 0x61, 0x98, 0xa8, + 0xad, 0x40, 0xcd, 0x96, 0x25, 0x06, 0xc5, 0x02, 0x4b, 0xb7, 0x80, 0x6d, 0x12, 0x05, 0xc4, 0x37, + 0x2d, 0x99, 0x6a, 0x0b, 0xb8, 0xac, 0x23, 0xb1, 0x49, 0x4b, 0xb7, 0xb4, 0x30, 0x66, 0xd3, 0x4f, + 0xa8, 0xea, 0xa9, 0xaf, 0x5b, 0x93, 0x47, 0x29, 0x4a, 0x3c, 0x7a, 0x13, 0x1e, 0x50, 0x41, 0x85, + 0x98, 0x5b, 0x86, 0x65, 0x8d, 0x23, 0xc6, 0xc9, 0xfa, 0x81, 0xe5, 0x7c, 0x32, 0x5c, 0x54, 0x1e, + 0xbd, 0x0a, 0x53, 0x42, 0x05, 0x96, 0x1c, 0x47, 0x4d, 0x67, 0x85, 0xcb, 0x06, 0x16, 0x67, 0xa8, + 0x51, 0x1d, 0x66, 0x28, 0x84, 0x69, 0xa1, 0x92, 0x03, 0x0f, 0x8e, 0x54, 0x7b, 0xfd, 0xe5, 0x0c, + 0x1e, 0x77, 0x95, 0x40, 0x8b, 0x30, 0xcd, 0x75, 0x14, 0x7a, 0xa6, 0x64, 0xe3, 0x20, 0x3c, 0x6b, + 0xd5, 0x42, 0xb8, 0x6e, 0xa2, 0x71, 0x96, 0x1e, 0xbd, 0x04, 0x13, 0x4e, 0xd4, 0xda, 0xf2, 0x12, + 0xd2, 0x4a, 0x3a, 0x11, 0x4f, 0xc2, 0xa1, 0x79, 0x7b, 0x2c, 0x6a, 0x38, 0x6c, 0x50, 0xda, 0xef, + 0xc3, 0x89, 0x1c, 0xa7, 0x7c, 0x3a, 0x71, 0x9c, 0xb6, 0x27, 0xbf, 0x29, 0xe3, 0xb5, 0xb6, 0xd8, + 0x58, 0x93, 0x5f, 0xa3, 0x51, 0xd1, 0xd9, 0xc9, 0x4c, 0xe2, 0x5a, 0x42, 0x57, 0x35, 0x3b, 0x57, + 0x25, 0x02, 0xa7, 0x34, 0xf6, 0xb7, 0x00, 0x34, 0x83, 0xce, 0x00, 0x3e, 0x4b, 0x2f, 0xc1, 0x84, + 0xcc, 0x42, 0xac, 0x65, 0xbf, 0x54, 0x9f, 0x79, 0x51, 0xc3, 0x61, 0x83, 0x92, 0xb6, 0x2d, 0x50, + 0xb9, 0x3b, 0x33, 0x3e, 0x72, 0x69, 0xe6, 0xce, 0x94, 0x06, 0x3d, 0x0d, 0x63, 0x31, 0xf1, 0x37, + 0xae, 0x78, 0xc1, 0xb6, 0x98, 0xd8, 0x4a, 0x0a, 0x37, 0x05, 0x1c, 0x2b, 0x0a, 0xb4, 0x04, 0xe5, + 0x8e, 0xe7, 0x8a, 0xa9, 0x2c, 0x37, 0xfc, 0xf2, 0x8d, 0xb5, 0xfa, 0xe1, 0x7e, 0xed, 0x91, 0xa2, + 0xe4, 0xca, 0xf4, 0x68, 0x1f, 0xcf, 0xd3, 0xe5, 0x47, 0x0b, 0xe7, 0xdd, 0x0d, 0x8c, 0x1c, 0xf1, + 0x6e, 0xe0, 0x02, 0x80, 0xf8, 0x6a, 0x39, 0x97, 0xcb, 0xe9, 0xa8, 0x5d, 0x54, 0x18, 0xac, 0x51, + 0xa1, 0x18, 0x66, 0x5b, 0x11, 0x71, 0xe4, 0x19, 0x9a, 0xbb, 0x97, 0x8f, 0xdd, 0xbd, 0x81, 0x60, + 0x39, 0xcb, 0x0c, 0x77, 0xf3, 0x47, 0x21, 0xcc, 0xba, 0x22, 0x86, 0x35, 0xad, 0xb4, 0x72, 0x74, + 0x9f, 0x76, 0xe6, 0x90, 0x93, 0x65, 0x84, 0xbb, 0x79, 0xa3, 0x77, 0x60, 0x4e, 0x02, 0xbb, 0xc3, + 0x86, 0xd9, 0x72, 0x29, 0x2f, 0x9d, 0x3d, 0xd8, 0xaf, 0xcd, 0xd5, 0x0b, 0xa9, 0x70, 0x0f, 0x0e, + 0x08, 0xc3, 0x08, 0xbb, 0x4b, 0x8a, 0xab, 0xe3, 0x6c, 0x9f, 0x7b, 0xb2, 0xd8, 0x18, 0x40, 0xe7, + 0xfa, 0x3c, 0xbb, 0x87, 0x12, 0x6e, 0xbe, 0xe9, 0xb5, 0x1c, 0x03, 0x62, 0xc1, 0x09, 0x6d, 0xc0, + 0xb8, 0x13, 0x04, 0x61, 0xe2, 0x70, 0x15, 0x6a, 0xa2, 0x58, 0xf7, 0xd3, 0x18, 0x2f, 0xa6, 0x25, + 0x38, 0x77, 0xe5, 0x39, 0xa8, 0x61, 0xb0, 0xce, 0x18, 0xdd, 0x86, 0xe9, 0xf0, 0x36, 0x15, 0x8e, + 0xd2, 0x4a, 0x11, 0x57, 0x27, 0x59, 0x5d, 0xcf, 0x0f, 0x68, 0xa7, 0x35, 0x0a, 0x6b, 0x52, 0xcb, + 0x64, 0x8a, 0xb3, 0xb5, 0xa0, 0x79, 0xc3, 0x5a, 0x3d, 0x95, 0xfa, 0xb3, 0xa7, 0xd6, 0x6a, 0xdd, + 0x38, 0xcd, 0xc2, 0xd0, 0xb9, 0xdb, 0x2a, 0x5b, 0xfd, 0xd3, 0x99, 0x30, 0xf4, 0x14, 0x85, 0x75, + 0x3a, 0xb4, 0x05, 0x13, 0xe9, 0x95, 0x55, 0x14, 0xb3, 0x2c, 0x35, 0xe3, 0x17, 0x2e, 0x0c, 0xf6, + 0x71, 0x6b, 0x5a, 0x49, 0x7e, 0x72, 0xd0, 0x21, 0xd8, 0xe0, 0x3c, 0xf7, 0x23, 0x30, 0xae, 0x0d, + 0xec, 0x51, 0xbc, 0xb2, 0xe7, 0x5e, 0x85, 0x99, 0xec, 0xd0, 0x1d, 0xc9, 0xab, 0xfb, 0x7f, 0x96, + 0x60, 0x3a, 0xe7, 0xe6, 0x8a, 0x25, 0x68, 0xce, 0x08, 0xd4, 0x34, 0x1f, 0xb3, 0x29, 0x16, 0x4b, + 0x03, 0x88, 0x45, 0x29, 0xa3, 0xcb, 0x85, 0x32, 0x5a, 0x88, 0xc2, 0xa1, 0x0f, 0x22, 0x0a, 0xcd, + 0xdd, 0x67, 0x78, 0xa0, 0xdd, 0xe7, 0x1e, 0x88, 0x4f, 0x63, 0x03, 0x1b, 0x1d, 0x60, 0x03, 0xfb, + 0xf9, 0x12, 0xcc, 0x64, 0xb3, 0x00, 0x1f, 0xc3, 0x7d, 0xc7, 0x6b, 0xc6, 0x7d, 0x47, 0x7e, 0xba, + 0xf3, 0x6c, 0x6e, 0xe2, 0xa2, 0xbb, 0x0f, 0x9c, 0xb9, 0xfb, 0x78, 0x72, 0x20, 0x6e, 0xbd, 0xef, + 0x41, 0xfe, 0x7e, 0x09, 0x4e, 0x65, 0x8b, 0x2c, 0xfb, 0x8e, 0xb7, 0x73, 0x0c, 0x7d, 0x73, 0xdd, + 0xe8, 0x9b, 0x67, 0x06, 0xf9, 0x1a, 0xd6, 0xb4, 0xc2, 0x0e, 0x7a, 0x23, 0xd3, 0x41, 0x0b, 0x83, + 0xb3, 0xec, 0xdd, 0x4b, 0xdf, 0xb2, 0xe0, 0x4c, 0x6e, 0xb9, 0x63, 0xb0, 0xbe, 0x5e, 0x33, 0xad, + 0xaf, 0x4f, 0x0c, 0xfc, 0x4d, 0x05, 0xe6, 0xd8, 0xaf, 0x94, 0x0b, 0xbe, 0x85, 0xd9, 0xaf, 0xae, + 0xc3, 0xb8, 0xd3, 0x6a, 0x91, 0x38, 0xbe, 0x1a, 0xba, 0x2a, 0xad, 0xd5, 0x33, 0x6c, 0x4f, 0x4a, + 0xc1, 0x87, 0xfb, 0xb5, 0xb9, 0x2c, 0x8b, 0x14, 0x8d, 0x75, 0x0e, 0x66, 0xaa, 0xbc, 0xd2, 0x3d, + 0x4d, 0x95, 0x77, 0x01, 0x60, 0x57, 0x9d, 0x6a, 0xb3, 0xc6, 0x30, 0xed, 0xbc, 0xab, 0x51, 0xa1, + 0x9f, 0x60, 0xba, 0x22, 0x77, 0x19, 0xe1, 0x97, 0x1c, 0xcf, 0x0d, 0x38, 0x56, 0xba, 0xfb, 0x09, + 0x0f, 0x84, 0x55, 0x86, 0x43, 0xc5, 0x12, 0xfd, 0x18, 0xcc, 0xc4, 0x3c, 0xd7, 0xc2, 0xb2, 0xef, + 0xc4, 0x2c, 0xfc, 0x42, 0xc8, 0x44, 0x16, 0xdd, 0xda, 0xcc, 0xe0, 0x70, 0x17, 0xb5, 0xfd, 0x8f, + 0xcb, 0xf0, 0x60, 0x8f, 0x29, 0x8a, 0x16, 0xcd, 0x2b, 0xde, 0xa7, 0xb2, 0xd6, 0x9d, 0xb9, 0xdc, + 0xc2, 0x86, 0xb9, 0x27, 0x33, 0xc6, 0xa5, 0x0f, 0x3c, 0xc6, 0x5f, 0xb2, 0x34, 0xbb, 0x1b, 0x77, + 0x04, 0xfd, 0xcc, 0x11, 0x97, 0xde, 0x0f, 0xaa, 0xa1, 0xfe, 0xf3, 0x16, 0x3c, 0x92, 0xfb, 0x59, + 0x86, 0xab, 0xc8, 0x02, 0x54, 0x5a, 0x14, 0xa8, 0x85, 0x48, 0xa5, 0x81, 0x8a, 0x12, 0x81, 0x53, + 0x1a, 0xc3, 0x23, 0xa4, 0xd4, 0xd7, 0x23, 0xe4, 0x5f, 0x5a, 0x70, 0x32, 0xdb, 0x88, 0x63, 0x90, + 0x4c, 0x6b, 0xa6, 0x64, 0xfa, 0xf8, 0x20, 0x43, 0x5e, 0x20, 0x94, 0xfe, 0x6c, 0x0a, 0x4e, 0x17, + 0xe4, 0xe8, 0xdf, 0x85, 0xd9, 0xcd, 0x16, 0x31, 0x83, 0xcf, 0xc4, 0xc7, 0xe4, 0xc6, 0xe9, 0xf5, + 0x8c, 0x54, 0xe3, 0xc7, 0x90, 0x2e, 0x12, 0xdc, 0x5d, 0x05, 0xfa, 0xbc, 0x05, 0x27, 0x9d, 0xdb, + 0x71, 0xd7, 0x9b, 0x39, 0x62, 0xce, 0x3c, 0x9f, 0x6b, 0x1d, 0xeb, 0xf3, 0xc6, 0x0e, 0x0b, 0x10, + 0x39, 0x99, 0x47, 0x85, 0x73, 0xeb, 0x42, 0x58, 0x64, 0xf6, 0xa3, 0x5a, 0x4e, 0x8f, 0xf0, 0xc8, + 0xbc, 0xe0, 0x15, 0x2e, 0xa3, 0x24, 0x06, 0x2b, 0x3e, 0xe8, 0x26, 0x54, 0x36, 0x65, 0x44, 0x99, + 0x90, 0x81, 0xb9, 0x9b, 0x4a, 0x6e, 0xd8, 0x19, 0xf7, 0xd8, 0x57, 0x28, 0x9c, 0xb2, 0x42, 0xaf, + 0x42, 0x39, 0xd8, 0x88, 0x7b, 0x3d, 0x52, 0x90, 0xf1, 0xa0, 0xe2, 0x71, 0xae, 0xd7, 0x56, 0x9b, + 0x98, 0x16, 0xa4, 0xe5, 0xa3, 0x5b, 0xae, 0x30, 0xe8, 0xe6, 0x96, 0xc7, 0x4b, 0xf5, 0xee, 0xf2, + 0x78, 0xa9, 0x8e, 0x69, 0x41, 0xb4, 0x0a, 0xc3, 0x2c, 0x40, 0x45, 0x58, 0x6b, 0x73, 0xe3, 0xf4, + 0xbb, 0x82, 0x6f, 0x78, 0xe0, 0x2b, 0x03, 0x63, 0x5e, 0x1c, 0xbd, 0x06, 0x23, 0x2d, 0x96, 0xb3, + 0x5f, 0x1c, 0xad, 0xf3, 0x73, 0x4f, 0x74, 0x65, 0xf5, 0xe7, 0x77, 0x54, 0x1c, 0x8e, 0x05, 0x07, + 0xb4, 0x0e, 0x23, 0x2d, 0xd2, 0xde, 0xda, 0x88, 0xc5, 0x89, 0xf9, 0x93, 0xb9, 0xbc, 0x7a, 0x3c, + 0x51, 0x21, 0xb8, 0x32, 0x0a, 0x2c, 0x78, 0xa1, 0x4f, 0x43, 0x69, 0xa3, 0x25, 0x62, 0x55, 0x72, + 0xad, 0xb4, 0x66, 0x30, 0xf2, 0xd2, 0xc8, 0xc1, 0x7e, 0xad, 0xb4, 0xba, 0x8c, 0x4b, 0x1b, 0x2d, + 0x74, 0x0d, 0x46, 0x37, 0x78, 0x44, 0xa9, 0xc8, 0xd4, 0xfa, 0x78, 0x7e, 0xb0, 0x6b, 0x57, 0xd0, + 0x29, 0x8f, 0xb1, 0x10, 0x08, 0x2c, 0x99, 0xa0, 0x75, 0x80, 0x0d, 0x15, 0x19, 0x2b, 0x52, 0xb5, + 0x7e, 0x7c, 0x90, 0xf8, 0x59, 0x71, 0x7c, 0x54, 0x50, 0xac, 0xf1, 0x41, 0x9f, 0x83, 0x8a, 0x23, + 0x5f, 0x61, 0x61, 0x69, 0x5a, 0xcd, 0x7d, 0x3a, 0x5d, 0x70, 0xbd, 0x1f, 0xa8, 0xe1, 0xb3, 0x55, + 0x11, 0xe1, 0x94, 0x29, 0xda, 0x86, 0xc9, 0xdd, 0xb8, 0xbd, 0x45, 0xe4, 0x02, 0x65, 0xb9, 0x5b, + 0xcd, 0xa3, 0x66, 0x9a, 0x68, 0x57, 0x10, 0x7a, 0x51, 0xd2, 0x71, 0xfc, 0x2e, 0x99, 0xc2, 0x02, + 0x72, 0x6e, 0xea, 0xcc, 0xb0, 0xc9, 0x9b, 0x76, 0xfa, 0x7b, 0x9d, 0xf0, 0xd6, 0x5e, 0x42, 0x44, + 0x46, 0xd7, 0xdc, 0x4e, 0x7f, 0x9d, 0x93, 0x74, 0x77, 0xba, 0x40, 0x60, 0xc9, 0x84, 0x2e, 0x61, + 0x47, 0xbe, 0x70, 0x24, 0xce, 0xc8, 0x4f, 0x14, 0x76, 0x4f, 0x57, 0x7b, 0xd3, 0x4e, 0x61, 0xb2, + 0x2f, 0x65, 0xc5, 0x64, 0x5e, 0x7b, 0x2b, 0x4c, 0xc2, 0x20, 0x23, 0x6f, 0x67, 0x8b, 0x65, 0x5e, + 0x23, 0x87, 0xbe, 0x5b, 0xe6, 0xe5, 0x51, 0xe1, 0xdc, 0xba, 0x90, 0x0b, 0x53, 0xed, 0x30, 0x4a, + 0x6e, 0x87, 0x91, 0x9c, 0x55, 0xa8, 0xc7, 0xe1, 0xc9, 0xa0, 0x14, 0x35, 0x32, 0xff, 0x5a, 0x13, + 0x83, 0x33, 0x3c, 0xe9, 0x90, 0xc4, 0x2d, 0xc7, 0x27, 0x6b, 0xd7, 0xab, 0x27, 0x8a, 0x87, 0xa4, + 0xc9, 0x49, 0xba, 0x87, 0x44, 0x20, 0xb0, 0x64, 0x42, 0xa5, 0x0f, 0x4b, 0x0e, 0xce, 0x52, 0xd0, + 0x16, 0x48, 0x9f, 0x2e, 0xcf, 0x53, 0x2e, 0x7d, 0x18, 0x18, 0xf3, 0xe2, 0x74, 0xe6, 0x0b, 0x9d, + 0x30, 0x8c, 0xab, 0xa7, 0x8a, 0x67, 0xbe, 0x50, 0x25, 0xaf, 0x37, 0x7b, 0xcd, 0x7c, 0x45, 0x84, + 0x53, 0xa6, 0xf6, 0x17, 0x46, 0xba, 0xb5, 0x05, 0xa6, 0xfb, 0x7f, 0xc1, 0xea, 0xba, 0x3e, 0xfd, + 0xd4, 0xa0, 0x07, 0xd6, 0x7b, 0x78, 0x91, 0xfa, 0x79, 0x0b, 0x4e, 0xb7, 0x73, 0x3f, 0x4a, 0x6c, + 0xbd, 0x83, 0x9d, 0x7b, 0x79, 0x37, 0xa8, 0xe4, 0xce, 0xf9, 0x78, 0x5c, 0x50, 0x53, 0x56, 0x47, + 0x2e, 0x7f, 0x60, 0x1d, 0xf9, 0x2a, 0x8c, 0x31, 0xf5, 0x2e, 0x4d, 0x24, 0x33, 0x90, 0x13, 0x12, + 0xdb, 0xc4, 0x97, 0x45, 0x41, 0xac, 0x58, 0xa0, 0x9f, 0xb5, 0xe0, 0xe1, 0x6c, 0xd3, 0x31, 0x61, + 0x68, 0x91, 0x98, 0x90, 0x1f, 0x3b, 0x56, 0xc5, 0xf7, 0x3f, 0xdc, 0xe8, 0x45, 0x7c, 0xd8, 0x8f, + 0x00, 0xf7, 0xae, 0x0c, 0xd5, 0x73, 0xce, 0x3d, 0x23, 0xe6, 0xed, 0x4a, 0xff, 0xb3, 0xcf, 0xf1, + 0x6a, 0xee, 0x5f, 0xb5, 0x72, 0x54, 0x4e, 0x7e, 0xc6, 0x7a, 0xc5, 0x3c, 0x63, 0x3d, 0x96, 0x3d, + 0x63, 0x75, 0x59, 0x4c, 0x8c, 0xe3, 0xd5, 0xe0, 0xa9, 0x53, 0x07, 0xcd, 0x99, 0x63, 0xfb, 0x70, + 0xae, 0x9f, 0x98, 0x65, 0x2e, 0x55, 0xae, 0xba, 0x6b, 0x4c, 0x5d, 0xaa, 0xdc, 0xb5, 0x3a, 0x66, + 0x98, 0x41, 0xb3, 0x2f, 0xd8, 0xff, 0xd5, 0x82, 0x72, 0x23, 0x74, 0x8f, 0xc1, 0x02, 0xf4, 0x19, + 0xc3, 0x02, 0xf4, 0x60, 0xc1, 0xcb, 0x87, 0x85, 0xf6, 0x9e, 0x95, 0x8c, 0xbd, 0xe7, 0xe1, 0x22, + 0x06, 0xbd, 0xad, 0x3b, 0xff, 0xa0, 0x0c, 0xfa, 0x3b, 0x8d, 0xe8, 0x5f, 0xdf, 0x8d, 0x6f, 0x6e, + 0xb9, 0xd7, 0xd3, 0x8d, 0x82, 0x33, 0xf3, 0xc4, 0x92, 0x61, 0x7f, 0x3f, 0x60, 0x2e, 0xba, 0x6f, + 0x10, 0x6f, 0x73, 0x2b, 0x21, 0x6e, 0xf6, 0x73, 0x8e, 0xcf, 0x45, 0xf7, 0x3f, 0x5b, 0x30, 0x9d, + 0xa9, 0x1d, 0xf9, 0x79, 0x31, 0x44, 0x77, 0x69, 0xd3, 0x99, 0xed, 0x1b, 0x74, 0x34, 0x0f, 0xa0, + 0xcc, 0xeb, 0xd2, 0x6e, 0xc2, 0xb4, 0x58, 0x65, 0x7f, 0x8f, 0xb1, 0x46, 0x81, 0x5e, 0x80, 0xf1, + 0x24, 0x6c, 0x87, 0x7e, 0xb8, 0xb9, 0x77, 0x99, 0xc8, 0x7c, 0x1f, 0xea, 0x12, 0x64, 0x3d, 0x45, + 0x61, 0x9d, 0xce, 0xfe, 0x95, 0x32, 0x64, 0xdf, 0xf6, 0xfc, 0x7f, 0x73, 0xf2, 0xa3, 0x39, 0x27, + 0xbf, 0x6d, 0xc1, 0x0c, 0xad, 0x9d, 0x79, 0xb9, 0x48, 0xe7, 0x56, 0xf5, 0xc6, 0x82, 0xd5, 0xe3, + 0x8d, 0x85, 0xc7, 0xa8, 0xec, 0x72, 0xc3, 0x4e, 0x22, 0xec, 0x3b, 0x9a, 0x70, 0xa2, 0x50, 0x2c, + 0xb0, 0x82, 0x8e, 0x44, 0x91, 0x88, 0x0c, 0xd2, 0xe9, 0x48, 0x14, 0x61, 0x81, 0x95, 0x4f, 0x30, + 0x0c, 0x15, 0x3c, 0xc1, 0xc0, 0x52, 0x65, 0x09, 0xcf, 0x0a, 0xa1, 0x1a, 0x68, 0xa9, 0xb2, 0xa4, + 0xcb, 0x45, 0x4a, 0x63, 0x7f, 0xad, 0x0c, 0x13, 0x8d, 0xd0, 0x4d, 0xfd, 0xe1, 0x9f, 0x37, 0xfc, + 0xe1, 0xcf, 0x65, 0xfc, 0xe1, 0x67, 0x74, 0xda, 0x7b, 0xe3, 0x0e, 0x2f, 0x12, 0xa9, 0xb1, 0x07, + 0x41, 0xee, 0xd2, 0x15, 0xde, 0x48, 0xa4, 0xa6, 0x18, 0x61, 0x93, 0xef, 0x0f, 0x93, 0x0b, 0xfc, + 0x5f, 0x5a, 0x30, 0xd5, 0x08, 0x5d, 0x3a, 0x41, 0x7f, 0x98, 0x66, 0xa3, 0x9e, 0x88, 0x6d, 0xa4, + 0x47, 0x22, 0xb6, 0x7f, 0x68, 0xc1, 0x68, 0x23, 0x74, 0x8f, 0xc1, 0xf6, 0xf9, 0x8a, 0x69, 0xfb, + 0x7c, 0xa0, 0x40, 0xca, 0x16, 0x98, 0x3b, 0x7f, 0xb3, 0x0c, 0x93, 0xb4, 0x9d, 0xe1, 0xa6, 0x1c, + 0x25, 0xa3, 0x47, 0xac, 0x01, 0x7a, 0x84, 0x2a, 0x73, 0xa1, 0xef, 0x87, 0xb7, 0xb3, 0x23, 0xb6, + 0xca, 0xa0, 0x58, 0x60, 0xd1, 0xd3, 0x30, 0xd6, 0x8e, 0xc8, 0xae, 0x17, 0x76, 0xe2, 0x6c, 0x6c, + 0x61, 0x43, 0xc0, 0xb1, 0xa2, 0x40, 0xcf, 0xc3, 0x44, 0xec, 0x05, 0x2d, 0x22, 0xbd, 0x2d, 0x86, + 0x98, 0xb7, 0x05, 0xcf, 0x65, 0xa9, 0xc1, 0xb1, 0x41, 0x85, 0xde, 0x80, 0x0a, 0xfb, 0xcf, 0xd6, + 0xcd, 0xd1, 0x5f, 0x58, 0xe0, 0x47, 0x55, 0xc9, 0x00, 0xa7, 0xbc, 0xd0, 0x05, 0x80, 0x44, 0xfa, + 0x85, 0xc4, 0x22, 0xf4, 0x55, 0x69, 0x94, 0xca, 0x63, 0x24, 0xc6, 0x1a, 0x15, 0x7a, 0x0a, 0x2a, + 0x89, 0xe3, 0xf9, 0x57, 0xbc, 0x80, 0xc4, 0xc2, 0xaf, 0x46, 0xe4, 0x87, 0x16, 0x40, 0x9c, 0xe2, + 0xe9, 0x8e, 0xce, 0x02, 0xab, 0xf9, 0xfb, 0x2c, 0x63, 0x8c, 0x9a, 0xed, 0xe8, 0x57, 0x14, 0x14, + 0x6b, 0x14, 0xf6, 0x4b, 0x70, 0xaa, 0x11, 0xba, 0x8d, 0x30, 0x4a, 0x56, 0xc3, 0xe8, 0xb6, 0x13, + 0xb9, 0x72, 0xfc, 0x6a, 0x32, 0x55, 0x31, 0xdd, 0x75, 0x87, 0xf9, 0xb9, 0xde, 0x48, 0x42, 0xfc, + 0x1c, 0xdb, 0xd3, 0x8f, 0x18, 0x04, 0xf1, 0xef, 0x4a, 0x80, 0x1a, 0xcc, 0x73, 0xc5, 0x78, 0xc4, + 0xe7, 0x1d, 0x98, 0x8a, 0xc9, 0x15, 0x2f, 0xe8, 0xdc, 0x11, 0xac, 0x7a, 0x45, 0x98, 0x34, 0x57, + 0x74, 0x4a, 0x6e, 0x1b, 0x31, 0x61, 0x38, 0xc3, 0x8d, 0x76, 0x61, 0xd4, 0x09, 0x16, 0xe3, 0x1b, + 0x31, 0x89, 0xc4, 0xa3, 0x35, 0xac, 0x0b, 0xb1, 0x04, 0xe2, 0x14, 0x4f, 0xa7, 0x0c, 0xfb, 0x73, + 0x2d, 0x0c, 0x70, 0x18, 0x26, 0x72, 0x92, 0xb1, 0x67, 0x0f, 0x34, 0x38, 0x36, 0xa8, 0xd0, 0x2a, + 0xa0, 0xb8, 0xd3, 0x6e, 0xfb, 0xec, 0xa2, 0xcf, 0xf1, 0x2f, 0x46, 0x61, 0xa7, 0xcd, 0x5d, 0x8f, + 0xc5, 0x8b, 0x01, 0xcd, 0x2e, 0x2c, 0xce, 0x29, 0x41, 0x05, 0xc3, 0x46, 0xcc, 0x7e, 0x8b, 0xd8, + 0x6a, 0x6e, 0xa5, 0x6c, 0x32, 0x10, 0x96, 0x38, 0xfb, 0xa7, 0xd9, 0x66, 0xc6, 0xde, 0x1a, 0x49, + 0x3a, 0x11, 0x41, 0x3b, 0x30, 0xd9, 0x66, 0x1b, 0x56, 0x12, 0x85, 0xbe, 0x4f, 0xa4, 0xde, 0x78, + 0x77, 0x5e, 0x34, 0xfc, 0xed, 0x01, 0x9d, 0x1d, 0x36, 0xb9, 0xdb, 0x5f, 0x98, 0x66, 0x72, 0xa9, + 0xc9, 0x0f, 0x2d, 0xa3, 0xc2, 0x37, 0x56, 0x68, 0x68, 0x73, 0xc5, 0x6f, 0x7b, 0xa5, 0x92, 0x5e, + 0xf8, 0xd7, 0x62, 0x59, 0x16, 0xbd, 0xce, 0x7c, 0xb6, 0xb9, 0x30, 0xe8, 0xf7, 0xaa, 0x20, 0xa7, + 0x32, 0xfc, 0xb5, 0x45, 0x41, 0xac, 0x31, 0x41, 0x57, 0x60, 0x52, 0x3c, 0x4d, 0x21, 0x4c, 0x08, + 0x65, 0xe3, 0xf8, 0x3b, 0x89, 0x75, 0xe4, 0x61, 0x16, 0x80, 0xcd, 0xc2, 0x68, 0x13, 0x1e, 0xd6, + 0x1e, 0x52, 0xca, 0xf1, 0xe4, 0xe2, 0xb2, 0xe5, 0x91, 0x83, 0xfd, 0xda, 0xc3, 0xeb, 0xbd, 0x08, + 0x71, 0x6f, 0x3e, 0xe8, 0x3a, 0x9c, 0x72, 0x5a, 0x89, 0xb7, 0x4b, 0xea, 0xc4, 0x71, 0x7d, 0x2f, + 0x20, 0x66, 0xb0, 0xfd, 0x99, 0x83, 0xfd, 0xda, 0xa9, 0xc5, 0x3c, 0x02, 0x9c, 0x5f, 0x0e, 0xbd, + 0x02, 0x15, 0x37, 0x88, 0x45, 0x1f, 0x8c, 0x18, 0x6f, 0x84, 0x55, 0xea, 0xd7, 0x9a, 0xea, 0xfb, + 0xd3, 0x3f, 0x38, 0x2d, 0x80, 0x36, 0x61, 0x42, 0x0f, 0xa8, 0x11, 0xef, 0xcb, 0x3d, 0xd3, 0xe3, + 0x6c, 0x6b, 0x44, 0xa1, 0x70, 0xfb, 0x99, 0xf2, 0x93, 0x34, 0x02, 0x54, 0x0c, 0xc6, 0xe8, 0x35, + 0x40, 0x31, 0x89, 0x76, 0xbd, 0x16, 0x59, 0x6c, 0xb1, 0x64, 0xaf, 0xcc, 0xea, 0x32, 0x66, 0x38, + 0xfd, 0xa3, 0x66, 0x17, 0x05, 0xce, 0x29, 0x85, 0x2e, 0x51, 0x89, 0xa2, 0x43, 0x85, 0x5b, 0xab, + 0x54, 0xf3, 0xaa, 0x75, 0xd2, 0x8e, 0x48, 0xcb, 0x49, 0x88, 0x6b, 0x72, 0xc4, 0x99, 0x72, 0x74, + 0xbf, 0x51, 0x39, 0xf4, 0xc1, 0x74, 0xc6, 0xec, 0xce, 0xa3, 0x4f, 0x4f, 0x48, 0x5b, 0x61, 0x9c, + 0x5c, 0x23, 0xc9, 0xed, 0x30, 0xda, 0x16, 0x19, 0xb2, 0xd2, 0x04, 0x7a, 0x29, 0x0a, 0xeb, 0x74, + 0x54, 0x23, 0x62, 0xd7, 0x59, 0x6b, 0x75, 0x76, 0xe3, 0x30, 0x96, 0xae, 0x93, 0x4b, 0x1c, 0x8c, + 0x25, 0x5e, 0x92, 0xae, 0x35, 0x96, 0xd9, 0x3d, 0x42, 0x86, 0x74, 0xad, 0xb1, 0x8c, 0x25, 0x1e, + 0x91, 0xee, 0xf7, 0xd7, 0xa6, 0x8a, 0x6f, 0x80, 0xba, 0xe5, 0xf2, 0x80, 0x4f, 0xb0, 0x05, 0x30, + 0xa3, 0x5e, 0x7e, 0xe3, 0xa9, 0xc3, 0xe2, 0xea, 0x34, 0x9b, 0x24, 0x83, 0xe7, 0x1d, 0x53, 0x56, + 0xb5, 0xb5, 0x0c, 0x27, 0xdc, 0xc5, 0xdb, 0x48, 0xe2, 0x30, 0xd3, 0xf7, 0x0d, 0x84, 0x05, 0xa8, + 0xc4, 0x9d, 0x5b, 0x6e, 0xb8, 0xe3, 0x78, 0x01, 0x33, 0xfb, 0xeb, 0x4f, 0xd6, 0x4b, 0x04, 0x4e, + 0x69, 0xd0, 0x2a, 0x8c, 0x39, 0xe2, 0xf0, 0x25, 0x0c, 0xf5, 0xb9, 0x51, 0xdd, 0xf2, 0x80, 0xc6, + 0x2d, 0x9a, 0xf2, 0x1f, 0x56, 0x65, 0xd1, 0xcb, 0x30, 0x29, 0x02, 0x8f, 0x84, 0xcf, 0xe0, 0x09, + 0xd3, 0x47, 0xbd, 0xa9, 0x23, 0xb1, 0x49, 0x8b, 0x7e, 0x02, 0xa6, 0x28, 0x97, 0x54, 0xb0, 0x55, + 0x4f, 0x0e, 0x22, 0x11, 0xb5, 0xdc, 0xd6, 0x7a, 0x61, 0x9c, 0x61, 0x86, 0x5c, 0x78, 0xc8, 0xe9, + 0x24, 0xe1, 0x0e, 0x9d, 0xe1, 0xe6, 0xfc, 0x5f, 0x0f, 0xb7, 0x49, 0xc0, 0xec, 0xf4, 0x63, 0x4b, + 0xe7, 0x0e, 0xf6, 0x6b, 0x0f, 0x2d, 0xf6, 0xa0, 0xc3, 0x3d, 0xb9, 0xa0, 0x1b, 0x30, 0x9e, 0x84, + 0xbe, 0x70, 0xf6, 0x8d, 0xab, 0xa7, 0x8b, 0x93, 0xd0, 0xac, 0x2b, 0x32, 0xdd, 0x9c, 0xa0, 0x8a, + 0x62, 0x9d, 0x0f, 0x5a, 0xe7, 0x6b, 0x8c, 0xa5, 0x4c, 0x24, 0x71, 0xf5, 0x81, 0xe2, 0x8e, 0x51, + 0x99, 0x15, 0xcd, 0x25, 0x28, 0x4a, 0x62, 0x9d, 0x0d, 0xba, 0x08, 0xb3, 0xed, 0xc8, 0x0b, 0xd9, + 0xc4, 0x56, 0x26, 0xdf, 0xaa, 0x91, 0x9e, 0x6c, 0xb6, 0x91, 0x25, 0xc0, 0xdd, 0x65, 0xd0, 0x79, + 0xaa, 0xa0, 0x72, 0x60, 0xf5, 0x0c, 0x7f, 0x1b, 0x83, 0x2b, 0xa7, 0x1c, 0x86, 0x15, 0x76, 0xee, + 0x47, 0x61, 0xb6, 0x4b, 0x52, 0x1e, 0xc9, 0xf1, 0xf2, 0xd7, 0x86, 0xa1, 0xa2, 0xcc, 0x81, 0x68, + 0xc1, 0xb4, 0xf2, 0x9e, 0xc9, 0x5a, 0x79, 0xc7, 0xa8, 0xbe, 0xa6, 0x1b, 0x76, 0xd7, 0x73, 0x9e, + 0xf7, 0x3e, 0x57, 0x20, 0x1a, 0x06, 0x8f, 0x92, 0x3a, 0xc2, 0xd3, 0xe7, 0xe9, 0x81, 0x71, 0xa8, + 0xe7, 0x81, 0x71, 0xc0, 0xa7, 0xf6, 0xe8, 0xd1, 0xb0, 0x1d, 0xba, 0x6b, 0x8d, 0xec, 0xdb, 0x53, + 0x0d, 0x0a, 0xc4, 0x1c, 0xc7, 0x94, 0x7b, 0xba, 0xad, 0x33, 0xe5, 0x7e, 0xf4, 0x2e, 0x95, 0x7b, + 0xc9, 0x00, 0xa7, 0xbc, 0x90, 0x0f, 0xb3, 0x2d, 0xf3, 0xd9, 0x30, 0x15, 0x19, 0xf5, 0x68, 0xdf, + 0x07, 0xbc, 0x3a, 0xda, 0x5b, 0x22, 0xcb, 0x59, 0x2e, 0xb8, 0x9b, 0x31, 0x7a, 0x19, 0xc6, 0xde, + 0x0b, 0x63, 0x36, 0xed, 0xc4, 0xde, 0x26, 0x63, 0x51, 0xc6, 0x5e, 0xbf, 0xde, 0x64, 0xf0, 0xc3, + 0xfd, 0xda, 0x78, 0x23, 0x74, 0xe5, 0x5f, 0xac, 0x0a, 0xa0, 0x3b, 0x70, 0xca, 0x90, 0x08, 0xaa, + 0xb9, 0x30, 0x78, 0x73, 0x1f, 0x16, 0xd5, 0x9d, 0x5a, 0xcb, 0xe3, 0x84, 0xf3, 0x2b, 0xb0, 0xbf, + 0xce, 0x8d, 0x9e, 0xc2, 0x34, 0x42, 0xe2, 0x8e, 0x7f, 0x1c, 0x0f, 0x06, 0xac, 0x18, 0x56, 0x9b, + 0xbb, 0x36, 0xac, 0xff, 0xbe, 0xc5, 0x0c, 0xeb, 0xeb, 0x64, 0xa7, 0xed, 0x3b, 0xc9, 0x71, 0xb8, + 0xdb, 0xbe, 0x0e, 0x63, 0x89, 0xa8, 0xad, 0xd7, 0x1b, 0x07, 0x5a, 0xa3, 0xd8, 0xe5, 0x82, 0xda, + 0x10, 0x25, 0x14, 0x2b, 0x36, 0xf6, 0x3f, 0xe7, 0x23, 0x20, 0x31, 0xc7, 0x60, 0x5b, 0xa8, 0x9b, + 0xb6, 0x85, 0x5a, 0x9f, 0x2f, 0x28, 0xb0, 0x31, 0xfc, 0x33, 0xb3, 0xdd, 0xec, 0xec, 0xf1, 0x51, + 0xbf, 0xd1, 0xb1, 0x7f, 0xd1, 0x82, 0x93, 0x79, 0x57, 0xfa, 0x54, 0x89, 0xe1, 0x27, 0x1f, 0x75, + 0xc3, 0xa5, 0x7a, 0xf0, 0xa6, 0x80, 0x63, 0x45, 0x31, 0x70, 0x9e, 0xf1, 0xa3, 0x25, 0x5e, 0xba, + 0x0e, 0xe6, 0x0b, 0x73, 0xe8, 0x55, 0xee, 0x3f, 0x6f, 0xa9, 0x27, 0xe0, 0x8e, 0xe6, 0x3b, 0x6f, + 0xff, 0x6a, 0x09, 0x4e, 0x72, 0x13, 0xf5, 0xe2, 0x6e, 0xe8, 0xb9, 0x8d, 0xd0, 0x15, 0xd1, 0x04, + 0x6f, 0xc1, 0x44, 0x5b, 0x3b, 0xae, 0xf6, 0x4a, 0xfd, 0xa2, 0x1f, 0x6b, 0xd3, 0x63, 0x83, 0x0e, + 0xc5, 0x06, 0x2f, 0xe4, 0xc2, 0x04, 0xd9, 0xf5, 0x5a, 0xca, 0xce, 0x59, 0x3a, 0xb2, 0x48, 0x57, + 0xb5, 0xac, 0x68, 0x7c, 0xb0, 0xc1, 0xf5, 0x3e, 0xbc, 0x06, 0x62, 0x7f, 0xd9, 0x82, 0x07, 0x0a, + 0x12, 0xc5, 0xd0, 0xea, 0x6e, 0xb3, 0xcb, 0x00, 0xf1, 0x5c, 0xa1, 0xaa, 0x8e, 0x5f, 0x11, 0x60, + 0x81, 0x45, 0x3f, 0x0e, 0xc0, 0x4d, 0xfc, 0xec, 0x71, 0xf8, 0x52, 0xef, 0x48, 0x74, 0x23, 0x81, + 0x82, 0x16, 0x65, 0xaf, 0x9e, 0x83, 0xd7, 0x78, 0xd9, 0xbf, 0x5c, 0x86, 0x61, 0xfe, 0x76, 0xf5, + 0x2a, 0x8c, 0x6e, 0xf1, 0xb4, 0xb4, 0x83, 0x64, 0xc0, 0x4d, 0x8f, 0x23, 0x1c, 0x80, 0x65, 0x61, + 0x74, 0x15, 0x4e, 0x88, 0x88, 0x95, 0x3a, 0xf1, 0x9d, 0x3d, 0x79, 0xaa, 0xe5, 0x4f, 0x44, 0xc8, + 0xf4, 0xe5, 0x27, 0xd6, 0xba, 0x49, 0x70, 0x5e, 0x39, 0xf4, 0x6a, 0x57, 0x32, 0x3a, 0x9e, 0xd0, + 0x57, 0xe9, 0xc0, 0x7d, 0x12, 0xd2, 0xbd, 0x0c, 0x93, 0xed, 0xae, 0xf3, 0xbb, 0xf6, 0x6c, 0xb0, + 0x79, 0x66, 0x37, 0x69, 0x99, 0x7f, 0x40, 0x87, 0x79, 0x43, 0xac, 0x6f, 0x45, 0x24, 0xde, 0x0a, + 0x7d, 0x57, 0xbc, 0x91, 0x99, 0xfa, 0x07, 0x64, 0xf0, 0xb8, 0xab, 0x04, 0xe5, 0xb2, 0xe1, 0x78, + 0x7e, 0x27, 0x22, 0x29, 0x97, 0x11, 0x93, 0xcb, 0x6a, 0x06, 0x8f, 0xbb, 0x4a, 0xd0, 0x79, 0x74, + 0x4a, 0x3c, 0xb0, 0x28, 0xe3, 0x98, 0x95, 0xd3, 0xc7, 0xa8, 0xf4, 0x54, 0xef, 0x91, 0x5b, 0x43, + 0x5c, 0xf9, 0xab, 0x27, 0x1a, 0xb5, 0xa7, 0xbb, 0x84, 0x8f, 0xba, 0xe4, 0x72, 0x37, 0xcf, 0xfc, + 0xfd, 0xa9, 0x05, 0x27, 0x72, 0x1c, 0xc1, 0xb8, 0xa8, 0xda, 0xf4, 0xe2, 0x44, 0xbd, 0x4c, 0xa0, + 0x89, 0x2a, 0x0e, 0xc7, 0x8a, 0x82, 0xae, 0x07, 0x2e, 0x0c, 0xb3, 0x02, 0x50, 0x38, 0x6f, 0x08, + 0xec, 0xd1, 0x04, 0x20, 0x3a, 0x07, 0x43, 0x9d, 0x98, 0x44, 0xf2, 0x6d, 0x3c, 0x29, 0xbf, 0x99, + 0x45, 0x90, 0x61, 0xa8, 0x46, 0xb9, 0xa9, 0x8c, 0x71, 0x9a, 0x46, 0xc9, 0xcd, 0x71, 0x1c, 0x67, + 0x7f, 0xa9, 0x0c, 0xd3, 0x19, 0x57, 0x4e, 0xda, 0x90, 0x9d, 0x30, 0xf0, 0x92, 0x50, 0xe5, 0x42, + 0xe3, 0xa9, 0x1f, 0x48, 0x7b, 0xeb, 0xaa, 0x80, 0x63, 0x45, 0x81, 0x1e, 0x93, 0x8f, 0xa6, 0x66, + 0x5f, 0x5c, 0x58, 0xaa, 0x1b, 0xef, 0xa6, 0x0e, 0xfa, 0x74, 0xca, 0xa3, 0x30, 0xd4, 0x0e, 0xd5, + 0x8b, 0xd6, 0x6a, 0x3c, 0xf1, 0x52, 0xbd, 0x11, 0x86, 0x3e, 0x66, 0x48, 0xf4, 0x09, 0xf1, 0xf5, + 0x99, 0xfb, 0x0a, 0xec, 0xb8, 0x61, 0xac, 0x75, 0xc1, 0x13, 0x30, 0xba, 0x4d, 0xf6, 0x22, 0x2f, + 0xd8, 0xcc, 0xde, 0xd6, 0x5c, 0xe6, 0x60, 0x2c, 0xf1, 0x66, 0xea, 0xf1, 0xd1, 0xfb, 0xf2, 0xfa, + 0xc9, 0x58, 0xdf, 0x5d, 0xed, 0x37, 0x2d, 0x98, 0x66, 0x79, 0x47, 0x45, 0xc4, 0xbc, 0x17, 0x06, + 0xc7, 0xa0, 0x27, 0x3c, 0x0a, 0xc3, 0x11, 0xad, 0x34, 0xfb, 0xa4, 0x01, 0x6b, 0x09, 0xe6, 0x38, + 0xf4, 0x10, 0x0c, 0xb1, 0x26, 0xd0, 0xc1, 0x9b, 0xe0, 0x99, 0xc7, 0xeb, 0x4e, 0xe2, 0x60, 0x06, + 0x65, 0xa1, 0x4b, 0x98, 0xb4, 0x7d, 0x8f, 0x37, 0x3a, 0x35, 0xb7, 0x7e, 0x34, 0x42, 0x97, 0x72, + 0x9b, 0xf6, 0xc1, 0x42, 0x97, 0xf2, 0x59, 0xf6, 0xd6, 0xc1, 0xff, 0x5b, 0x09, 0xce, 0xe6, 0x96, + 0x4b, 0x6f, 0x76, 0x57, 0x8d, 0x9b, 0xdd, 0x0b, 0x99, 0x9b, 0x5d, 0xbb, 0x77, 0xe9, 0x7b, 0x73, + 0xd7, 0x9b, 0x7f, 0x05, 0x5b, 0x3e, 0xc6, 0x2b, 0xd8, 0xa1, 0x41, 0xd5, 0x94, 0xe1, 0x3e, 0x6a, + 0xca, 0xb7, 0x2c, 0x38, 0x93, 0xdb, 0x65, 0x1f, 0x91, 0x58, 0xb1, 0xdc, 0xb6, 0x15, 0x9c, 0x21, + 0xbe, 0x5f, 0x2a, 0xf8, 0x16, 0x76, 0x9a, 0x38, 0x4f, 0xe5, 0x0c, 0x43, 0xc6, 0x42, 0xed, 0x9a, + 0xe0, 0x32, 0x86, 0xc3, 0xb0, 0xc2, 0x22, 0x4f, 0x8b, 0xba, 0xe2, 0x4d, 0x7b, 0xf9, 0x48, 0x4b, + 0x66, 0xde, 0xb4, 0x8e, 0xeb, 0xe1, 0xfd, 0xd9, 0x08, 0xac, 0xab, 0xda, 0x09, 0xb0, 0x3c, 0xf8, + 0x09, 0x70, 0x22, 0xff, 0xf4, 0x87, 0x16, 0x61, 0x7a, 0xc7, 0x0b, 0xd8, 0xbb, 0xa4, 0xa6, 0xde, + 0xa3, 0x42, 0x55, 0xaf, 0x9a, 0x68, 0x9c, 0xa5, 0x9f, 0x7b, 0x19, 0x26, 0xef, 0xde, 0x64, 0xf5, + 0xed, 0x32, 0x3c, 0xd8, 0x63, 0xd9, 0x73, 0x59, 0x6f, 0x8c, 0x81, 0x26, 0xeb, 0xbb, 0xc6, 0xa1, + 0x01, 0x27, 0x37, 0x3a, 0xbe, 0xbf, 0xc7, 0xbc, 0x9c, 0x88, 0x2b, 0x29, 0x84, 0x62, 0xa2, 0x92, + 0x0a, 0xaf, 0xe6, 0xd0, 0xe0, 0xdc, 0x92, 0xe8, 0x35, 0x40, 0xe1, 0x2d, 0x96, 0xe8, 0xd6, 0x4d, + 0x93, 0x16, 0xb0, 0x8e, 0x2f, 0xa7, 0x8b, 0xf1, 0x7a, 0x17, 0x05, 0xce, 0x29, 0x45, 0x35, 0x4c, + 0xf6, 0x9a, 0xba, 0x6a, 0x56, 0x46, 0xc3, 0xc4, 0x3a, 0x12, 0x9b, 0xb4, 0xe8, 0x22, 0xcc, 0x3a, + 0xbb, 0x8e, 0xc7, 0x93, 0x58, 0x49, 0x06, 0x5c, 0xc5, 0x54, 0x86, 0xa2, 0xc5, 0x2c, 0x01, 0xee, + 0x2e, 0x83, 0x36, 0x0c, 0x2b, 0x1f, 0xcf, 0xa1, 0x7f, 0x61, 0xe0, 0xd9, 0x3a, 0xb0, 0xdd, 0xcf, + 0xfe, 0x8f, 0x16, 0xdd, 0xbe, 0x72, 0x1e, 0xc2, 0xa4, 0xfd, 0xa0, 0xec, 0x57, 0x5a, 0xc4, 0x98, + 0xea, 0x87, 0x65, 0x1d, 0x89, 0x4d, 0x5a, 0x3e, 0x21, 0xe2, 0xd4, 0x5d, 0xda, 0xd0, 0x13, 0x45, + 0x88, 0xa5, 0xa2, 0x40, 0x6f, 0xc2, 0xa8, 0xeb, 0xed, 0x7a, 0x71, 0x18, 0x89, 0xc5, 0x72, 0xd4, + 0x07, 0xa0, 0x95, 0x1c, 0xac, 0x73, 0x36, 0x58, 0xf2, 0xb3, 0xbf, 0x54, 0x82, 0x49, 0x59, 0xe3, + 0xeb, 0x9d, 0x30, 0x71, 0x8e, 0x61, 0x5b, 0xbe, 0x68, 0x6c, 0xcb, 0x9f, 0xe8, 0x15, 0x67, 0xca, + 0x9a, 0x54, 0xb8, 0x1d, 0x5f, 0xcf, 0x6c, 0xc7, 0x8f, 0xf7, 0x67, 0xd5, 0x7b, 0x1b, 0xfe, 0x1d, + 0x0b, 0x66, 0x0d, 0xfa, 0x63, 0xd8, 0x0d, 0x56, 0xcd, 0xdd, 0xe0, 0x91, 0xbe, 0xdf, 0x50, 0xb0, + 0x0b, 0x7c, 0xb5, 0x94, 0x69, 0x3b, 0x93, 0xfe, 0xef, 0xc1, 0xd0, 0x96, 0x13, 0xb9, 0xbd, 0x52, + 0x31, 0x76, 0x15, 0x9a, 0xbf, 0xe4, 0x44, 0x2e, 0x97, 0xe1, 0x4f, 0xab, 0x37, 0xba, 0x9c, 0xc8, + 0xed, 0x1b, 0x1d, 0xc0, 0xaa, 0x42, 0x2f, 0xc1, 0x48, 0xdc, 0x0a, 0xdb, 0xca, 0xf7, 0xf2, 0x1c, + 0x7f, 0xbf, 0x8b, 0x42, 0x0e, 0xf7, 0x6b, 0xc8, 0xac, 0x8e, 0x82, 0xb1, 0xa0, 0x9f, 0xdb, 0x84, + 0x8a, 0xaa, 0xfa, 0xbe, 0x7a, 0x95, 0xff, 0x51, 0x19, 0x4e, 0xe4, 0xcc, 0x0b, 0x14, 0x1b, 0xbd, + 0xf5, 0xec, 0x80, 0xd3, 0xe9, 0x03, 0xf6, 0x57, 0xcc, 0x4e, 0x2c, 0xae, 0x18, 0xff, 0x81, 0x2b, + 0xbd, 0x11, 0x93, 0x6c, 0xa5, 0x14, 0xd4, 0xbf, 0x52, 0x5a, 0xd9, 0xb1, 0x75, 0x35, 0xad, 0x48, + 0xb5, 0xf4, 0xbe, 0x8e, 0xe9, 0x9f, 0x97, 0xe1, 0x64, 0x5e, 0x78, 0x3a, 0xfa, 0xa9, 0xcc, 0xc3, + 0x0e, 0xcf, 0x0f, 0x1a, 0xd8, 0xce, 0x5f, 0x7b, 0x10, 0x59, 0x5f, 0xe6, 0xcd, 0xa7, 0x1e, 0xfa, + 0x76, 0xb3, 0xa8, 0x93, 0x85, 0xeb, 0x44, 0xfc, 0x41, 0x0e, 0xb9, 0xc4, 0x3f, 0x35, 0x70, 0x03, + 0xc4, 0x4b, 0x1e, 0x71, 0x26, 0x5c, 0x47, 0x82, 0xfb, 0x87, 0xeb, 0xc8, 0x9a, 0xe7, 0x3c, 0x18, + 0xd7, 0xbe, 0xe6, 0xbe, 0x8e, 0xf8, 0x36, 0xdd, 0x51, 0xb4, 0x76, 0xdf, 0xd7, 0x51, 0xff, 0xb2, + 0x05, 0x19, 0x3f, 0x29, 0x65, 0xff, 0xb0, 0x0a, 0xed, 0x1f, 0xe7, 0x60, 0x28, 0x0a, 0x7d, 0x92, + 0xcd, 0xf5, 0x8f, 0x43, 0x9f, 0x60, 0x86, 0x51, 0x0f, 0xf2, 0x96, 0x8b, 0x1e, 0xe4, 0xa5, 0x47, + 0x63, 0x9f, 0xec, 0x12, 0x69, 0x8d, 0x50, 0x32, 0xf9, 0x0a, 0x05, 0x62, 0x8e, 0xb3, 0x7f, 0x7d, + 0x08, 0x4e, 0xe4, 0x04, 0xa7, 0xd1, 0x83, 0xca, 0xa6, 0x93, 0x90, 0xdb, 0xce, 0x5e, 0x36, 0xff, + 0xe8, 0x45, 0x0e, 0xc6, 0x12, 0xcf, 0x7c, 0x39, 0x79, 0x0a, 0xb3, 0x8c, 0x8d, 0x48, 0x64, 0x2e, + 0x13, 0xd8, 0xfb, 0xf5, 0x46, 0xeb, 0x05, 0x80, 0x38, 0xf6, 0x57, 0x02, 0xaa, 0x7c, 0xb9, 0xc2, + 0x53, 0x34, 0xcd, 0x77, 0xd7, 0xbc, 0x22, 0x30, 0x58, 0xa3, 0x42, 0x75, 0x98, 0x69, 0x47, 0x61, + 0xc2, 0xed, 0x6e, 0x75, 0xee, 0xa3, 0x30, 0x6c, 0x86, 0x19, 0x35, 0x32, 0x78, 0xdc, 0x55, 0x02, + 0xbd, 0x00, 0xe3, 0x22, 0xf4, 0xa8, 0x11, 0x86, 0xbe, 0xb0, 0xd2, 0xa8, 0x1b, 0xef, 0x66, 0x8a, + 0xc2, 0x3a, 0x9d, 0x56, 0x8c, 0x19, 0xf3, 0x46, 0x73, 0x8b, 0x71, 0x83, 0x9e, 0x46, 0x97, 0xc9, + 0x52, 0x31, 0x36, 0x50, 0x96, 0x8a, 0xd4, 0x6e, 0x55, 0x19, 0xf8, 0xfe, 0x02, 0xfa, 0x5a, 0x7a, + 0xbe, 0x5e, 0x86, 0x11, 0x3e, 0x14, 0xc7, 0xa0, 0x8a, 0xad, 0x0a, 0xdb, 0x4d, 0x8f, 0xdc, 0x00, + 0xbc, 0x2d, 0xf3, 0x75, 0x27, 0x71, 0xb8, 0x18, 0x52, 0xab, 0x21, 0xb5, 0xf2, 0xa0, 0x79, 0x63, + 0xbd, 0xcc, 0x65, 0x8c, 0x13, 0xc0, 0x79, 0x68, 0xab, 0xe7, 0x1d, 0x80, 0x98, 0xbd, 0x13, 0x4a, + 0x79, 0x88, 0x5c, 0xa6, 0x4f, 0xf6, 0xa8, 0xbd, 0xa9, 0x88, 0x79, 0x1b, 0xd2, 0x29, 0xa8, 0x10, + 0x58, 0xe3, 0x38, 0xf7, 0x22, 0x54, 0x14, 0x71, 0xbf, 0x93, 0xdc, 0x84, 0x2e, 0xbc, 0x3e, 0x03, + 0xd3, 0x99, 0xba, 0x8e, 0x74, 0x10, 0xfc, 0x2d, 0x0b, 0xa6, 0x79, 0x93, 0x57, 0x82, 0x5d, 0xb1, + 0xd8, 0xdf, 0x87, 0x93, 0x7e, 0xce, 0xa2, 0x13, 0x23, 0x3a, 0xf8, 0x22, 0x55, 0x07, 0xbf, 0x3c, + 0x2c, 0xce, 0xad, 0x83, 0x1e, 0xfe, 0xf9, 0x0b, 0xc7, 0x8e, 0x2f, 0x3c, 0x90, 0x27, 0x78, 0x8e, + 0x67, 0x0e, 0xc3, 0x0a, 0x6b, 0x7f, 0xc7, 0x82, 0xd9, 0xae, 0xf7, 0xf1, 0x3f, 0xd4, 0xb6, 0x8b, + 0x14, 0xd6, 0xa5, 0x82, 0x14, 0xd6, 0xfa, 0xa7, 0x95, 0x7b, 0x7e, 0xda, 0xaf, 0x5a, 0x20, 0x66, + 0xe0, 0x31, 0xa8, 0xf3, 0x3f, 0x6a, 0xaa, 0xf3, 0x73, 0xc5, 0x93, 0xba, 0x40, 0x8f, 0xff, 0x4b, + 0x0b, 0x66, 0x38, 0x41, 0x7a, 0x79, 0xf1, 0xa1, 0x8e, 0xc3, 0x20, 0xef, 0xaa, 0xa8, 0x87, 0x2c, + 0xf3, 0x3f, 0xca, 0x18, 0xac, 0xa1, 0x9e, 0x83, 0xe5, 0xca, 0x05, 0x74, 0x84, 0xf7, 0x82, 0x8e, + 0x9c, 0x75, 0xcd, 0xfe, 0x33, 0x0b, 0x10, 0xaf, 0x26, 0xfb, 0xb4, 0x34, 0xdf, 0xfa, 0xb4, 0x03, + 0x7d, 0x2a, 0x6a, 0x14, 0x06, 0x6b, 0x54, 0xf7, 0xa4, 0x7b, 0x32, 0x37, 0x50, 0xe5, 0xfe, 0x37, + 0x50, 0x47, 0xe8, 0xd1, 0xbf, 0x31, 0x04, 0x59, 0x77, 0x47, 0x74, 0x13, 0x26, 0x5a, 0x4e, 0xdb, + 0xb9, 0xe5, 0xf9, 0x5e, 0xe2, 0x91, 0xb8, 0xd7, 0xd5, 0xf5, 0xb2, 0x46, 0x27, 0xae, 0x7b, 0x34, + 0x08, 0x36, 0xf8, 0xa0, 0x79, 0x80, 0x76, 0xe4, 0xed, 0x7a, 0x3e, 0xd9, 0x64, 0x27, 0x1a, 0x16, + 0xf3, 0xc0, 0xef, 0x63, 0x25, 0x14, 0x6b, 0x14, 0x39, 0x3e, 0xf2, 0xe5, 0xfb, 0xe7, 0x23, 0x3f, + 0x74, 0x44, 0x1f, 0xf9, 0xe1, 0x81, 0x7c, 0xe4, 0x31, 0x9c, 0x96, 0x7b, 0x37, 0xfd, 0xbf, 0xea, + 0xf9, 0x44, 0x28, 0x6c, 0x3c, 0x12, 0x62, 0xee, 0x60, 0xbf, 0x76, 0x1a, 0xe7, 0x52, 0xe0, 0x82, + 0x92, 0xe8, 0xc7, 0xa1, 0xea, 0xf8, 0x7e, 0x78, 0x5b, 0xf5, 0xda, 0x4a, 0xdc, 0x72, 0xfc, 0x34, + 0x09, 0xe9, 0xd8, 0xd2, 0x43, 0x07, 0xfb, 0xb5, 0xea, 0x62, 0x01, 0x0d, 0x2e, 0x2c, 0x6d, 0x6f, + 0xc3, 0x89, 0x26, 0x89, 0xe4, 0x13, 0x64, 0x6a, 0x89, 0xad, 0x43, 0x25, 0xca, 0x08, 0x95, 0x81, + 0x02, 0xdf, 0xb5, 0xd4, 0x5f, 0x52, 0x88, 0xa4, 0x8c, 0xec, 0xbf, 0xb0, 0x60, 0x54, 0xb8, 0x50, + 0x1e, 0x83, 0x2e, 0xb3, 0x68, 0x98, 0x95, 0x6a, 0xf9, 0x82, 0x97, 0x35, 0xa6, 0xd0, 0xa0, 0xb4, + 0x96, 0x31, 0x28, 0x3d, 0xd2, 0x8b, 0x49, 0x6f, 0x53, 0xd2, 0x2f, 0x94, 0x61, 0xca, 0x74, 0x1f, + 0x3d, 0x86, 0x2e, 0xb8, 0x06, 0xa3, 0xb1, 0xf0, 0x55, 0x2e, 0x15, 0xfb, 0xbc, 0x65, 0x07, 0x31, + 0xbd, 0x19, 0x17, 0xde, 0xc9, 0x92, 0x49, 0xae, 0x13, 0x74, 0xf9, 0x3e, 0x3a, 0x41, 0xf7, 0xf3, + 0xe0, 0x1d, 0xba, 0x17, 0x1e, 0xbc, 0xf6, 0x37, 0x98, 0xf0, 0xd7, 0xe1, 0xc7, 0xa0, 0x17, 0x5c, + 0x34, 0xb7, 0x09, 0xbb, 0xc7, 0xcc, 0x12, 0x8d, 0x2a, 0xd0, 0x0f, 0xfe, 0x89, 0x05, 0xe3, 0x82, + 0xf0, 0x18, 0x9a, 0xfd, 0x63, 0x66, 0xb3, 0x1f, 0xec, 0xd1, 0xec, 0x82, 0xf6, 0xfe, 0xdd, 0x92, + 0x6a, 0x6f, 0x23, 0x8c, 0x92, 0x81, 0x92, 0x52, 0x8f, 0xd1, 0xd3, 0x60, 0xd8, 0x0a, 0x7d, 0xb1, + 0x99, 0x3f, 0x94, 0x06, 0xc3, 0x71, 0xf8, 0xa1, 0xf6, 0x1b, 0x2b, 0x6a, 0x16, 0xab, 0x15, 0x46, + 0x89, 0xd8, 0x40, 0xd3, 0x58, 0xad, 0x30, 0x4a, 0x30, 0xc3, 0x20, 0x17, 0x20, 0x7d, 0x9b, 0x5d, + 0x44, 0x8f, 0x16, 0xaf, 0xc2, 0x4e, 0xe2, 0xf9, 0xf3, 0x5e, 0x90, 0xc4, 0x49, 0x34, 0xbf, 0x16, + 0x24, 0xd7, 0x23, 0x7e, 0x36, 0xd0, 0xa2, 0xdb, 0x14, 0x2f, 0xac, 0xf1, 0x95, 0xe1, 0x15, 0xac, + 0x8e, 0x61, 0xf3, 0xbe, 0xe7, 0x9a, 0x80, 0x63, 0x45, 0x61, 0xbf, 0xc8, 0x64, 0x32, 0xeb, 0xa0, + 0xa3, 0x05, 0x9e, 0xfd, 0xf1, 0xa8, 0xea, 0x5a, 0x66, 0xec, 0xad, 0xeb, 0xe1, 0x6d, 0xbd, 0x45, + 0x20, 0xad, 0x58, 0x77, 0x25, 0x4e, 0x63, 0xe0, 0xd0, 0x67, 0xbb, 0xae, 0x01, 0x9f, 0xe9, 0x23, + 0x4b, 0x8f, 0x70, 0xf1, 0xc7, 0x72, 0xec, 0xb1, 0x5c, 0x64, 0x6b, 0x8d, 0x6c, 0xda, 0xf0, 0x65, + 0x89, 0xc0, 0x29, 0x0d, 0x5a, 0x10, 0x27, 0x4b, 0x6e, 0x66, 0x79, 0x30, 0x73, 0xb2, 0x94, 0x9f, + 0xaf, 0x1d, 0x2d, 0x9f, 0x85, 0x71, 0xf5, 0x14, 0x4b, 0x83, 0xbf, 0x68, 0x51, 0xe1, 0xba, 0xd4, + 0x4a, 0x0a, 0xc6, 0x3a, 0x0d, 0x5a, 0x87, 0xe9, 0x98, 0xbf, 0x13, 0x23, 0x23, 0x1e, 0x84, 0xdd, + 0xe0, 0xc9, 0xcc, 0x2b, 0xf0, 0x12, 0x7d, 0xc8, 0x40, 0x7c, 0xb1, 0xca, 0x18, 0x89, 0x2c, 0x0b, + 0xf4, 0x2a, 0x4c, 0xf9, 0xfa, 0x7b, 0x99, 0x0d, 0x61, 0x56, 0x50, 0xae, 0x5c, 0xc6, 0x6b, 0x9a, + 0x0d, 0x9c, 0xa1, 0xa6, 0x4a, 0x80, 0x0e, 0x11, 0xa9, 0x70, 0x9c, 0x60, 0x93, 0xc4, 0xe2, 0x21, + 0x09, 0xa6, 0x04, 0x5c, 0x29, 0xa0, 0xc1, 0x85, 0xa5, 0xd1, 0x4b, 0x30, 0x21, 0x3f, 0x5f, 0x8b, + 0x00, 0x4a, 0x1d, 0x06, 0x35, 0x1c, 0x36, 0x28, 0xd1, 0x6d, 0x38, 0x25, 0xff, 0xaf, 0x47, 0xce, + 0xc6, 0x86, 0xd7, 0x12, 0x01, 0x58, 0xe3, 0x8c, 0xc5, 0xa2, 0xf4, 0x9e, 0x5e, 0xc9, 0x23, 0x3a, + 0xdc, 0xaf, 0x9d, 0x13, 0xbd, 0x96, 0x8b, 0x67, 0x83, 0x98, 0xcf, 0x1f, 0x5d, 0x85, 0x13, 0x5b, + 0xc4, 0xf1, 0x93, 0xad, 0xe5, 0x2d, 0xd2, 0xda, 0x96, 0x8b, 0x88, 0xc5, 0x15, 0x69, 0x6e, 0x76, + 0x97, 0xba, 0x49, 0x70, 0x5e, 0x39, 0xf4, 0x36, 0x54, 0xdb, 0x9d, 0x5b, 0xbe, 0x17, 0x6f, 0x5d, + 0x0b, 0x13, 0x76, 0x63, 0xa9, 0x5e, 0x32, 0x11, 0x01, 0x48, 0x2a, 0xa6, 0xaa, 0x51, 0x40, 0x87, + 0x0b, 0x39, 0x7c, 0xb0, 0xbb, 0xe4, 0xf7, 0x68, 0x61, 0x4d, 0xc3, 0x40, 0x9f, 0x83, 0x09, 0x7d, + 0x24, 0x85, 0x90, 0x7f, 0xac, 0xdf, 0xfb, 0xac, 0x42, 0x3f, 0x51, 0xa3, 0xaa, 0xe3, 0xb0, 0xc1, + 0xd1, 0xfe, 0xbd, 0x12, 0xd4, 0xfa, 0x64, 0xaa, 0xca, 0x18, 0xc8, 0xac, 0x81, 0x0c, 0x64, 0x8b, + 0xf2, 0xd1, 0x92, 0x6b, 0x99, 0xc3, 0x59, 0xe6, 0x41, 0x92, 0xf4, 0x88, 0x96, 0xa5, 0x1f, 0xd8, + 0x37, 0x4c, 0xb7, 0xb1, 0x0d, 0xf5, 0x75, 0x91, 0x6b, 0xe8, 0xc6, 0xd2, 0xe1, 0xc1, 0xd5, 0xdd, + 0x42, 0x3b, 0xa9, 0xfd, 0x8d, 0x12, 0x9c, 0x52, 0x5d, 0xf8, 0xc3, 0xdb, 0x71, 0x37, 0xba, 0x3b, + 0xee, 0x1e, 0x58, 0x99, 0xed, 0xeb, 0x30, 0xd2, 0xdc, 0x8b, 0x5b, 0x89, 0x3f, 0x80, 0x76, 0xf0, + 0xa8, 0xb1, 0x72, 0xd2, 0x3d, 0x8c, 0xbd, 0x3b, 0x26, 0x16, 0x92, 0xfd, 0x57, 0x2d, 0x98, 0x5e, + 0x5f, 0x6e, 0x34, 0xc3, 0xd6, 0x36, 0x49, 0x16, 0xb9, 0x0d, 0x05, 0x0b, 0xe5, 0xc0, 0xba, 0xcb, + 0x4d, 0x3f, 0x4f, 0x9d, 0x38, 0x07, 0x43, 0x5b, 0x61, 0x9c, 0x64, 0x6f, 0x12, 0x2e, 0x85, 0x71, + 0x82, 0x19, 0xc6, 0xfe, 0x13, 0x0b, 0x86, 0xd9, 0x53, 0x5b, 0xfd, 0x9e, 0x64, 0x1b, 0xe4, 0xbb, + 0xd0, 0x0b, 0x30, 0x42, 0x36, 0x36, 0x48, 0x2b, 0x11, 0xa3, 0x2a, 0xc3, 0x55, 0x46, 0x56, 0x18, + 0x94, 0xee, 0x88, 0xac, 0x32, 0xfe, 0x17, 0x0b, 0x62, 0xf4, 0x59, 0xa8, 0x24, 0xde, 0x0e, 0x59, + 0x74, 0x5d, 0x61, 0xc4, 0x3f, 0x9a, 0xbf, 0x96, 0xda, 0xa1, 0xd7, 0x25, 0x13, 0x9c, 0xf2, 0xb3, + 0x7f, 0xae, 0x04, 0x90, 0x86, 0xb5, 0xf5, 0xfb, 0xcc, 0xa5, 0xae, 0x97, 0xe7, 0x1e, 0xcb, 0x79, + 0x79, 0x0e, 0xa5, 0x0c, 0x73, 0xde, 0x9d, 0x53, 0x5d, 0x55, 0x1e, 0xa8, 0xab, 0x86, 0x8e, 0xd2, + 0x55, 0xcb, 0x30, 0x9b, 0x86, 0xe5, 0x99, 0x31, 0xca, 0x2c, 0x2b, 0xed, 0x7a, 0x16, 0x89, 0xbb, + 0xe9, 0xed, 0x2f, 0x5a, 0x20, 0x7c, 0x78, 0x07, 0x98, 0xd0, 0x6f, 0xc9, 0x47, 0xa2, 0x8c, 0xf4, + 0x79, 0xe7, 0x8a, 0x9d, 0x9a, 0x45, 0xd2, 0x3c, 0x25, 0xd9, 0x8d, 0x54, 0x79, 0x06, 0x2f, 0xfb, + 0x77, 0x2c, 0x18, 0xe7, 0xe8, 0xab, 0xec, 0x08, 0xda, 0xbf, 0x35, 0x47, 0xca, 0x69, 0xcc, 0xde, + 0x4f, 0xa2, 0x8c, 0x55, 0xea, 0x5b, 0xfd, 0xfd, 0x24, 0x89, 0xc0, 0x29, 0x0d, 0x7a, 0x02, 0x46, + 0xe3, 0xce, 0x2d, 0x46, 0x9e, 0x71, 0xe3, 0x6d, 0x72, 0x30, 0x96, 0x78, 0x3a, 0xaf, 0x66, 0xb2, + 0x5e, 0xdc, 0xe8, 0x12, 0x8c, 0x70, 0xb1, 0x21, 0x96, 0x71, 0x8f, 0x2b, 0x0b, 0xcd, 0xf7, 0x1b, + 0xf8, 0x83, 0xdf, 0x4c, 0xdc, 0x88, 0xf2, 0xe8, 0x6d, 0x18, 0x77, 0xc3, 0xdb, 0xc1, 0x6d, 0x27, + 0x72, 0x17, 0x1b, 0x6b, 0xa2, 0xd7, 0x73, 0x7d, 0xf1, 0xea, 0x29, 0x99, 0xee, 0x4f, 0xce, 0xcc, + 0x73, 0x29, 0x0a, 0xeb, 0xec, 0xd0, 0x3a, 0xcb, 0x14, 0xc2, 0x9f, 0x21, 0xed, 0xe5, 0x9d, 0xa2, + 0x5e, 0x2e, 0xd5, 0x38, 0x4f, 0x8a, 0x74, 0x22, 0xe2, 0x11, 0xd3, 0x94, 0x91, 0xfd, 0xf9, 0x13, + 0x60, 0x8c, 0xb6, 0x91, 0x79, 0xd8, 0xba, 0x47, 0x99, 0x87, 0x31, 0x8c, 0x91, 0x9d, 0x76, 0xb2, + 0x57, 0xf7, 0xa2, 0x5e, 0xa9, 0xe0, 0x57, 0x04, 0x4d, 0x37, 0x4f, 0x89, 0xc1, 0x8a, 0x4f, 0x7e, + 0x7a, 0xe8, 0xf2, 0x87, 0x98, 0x1e, 0x7a, 0xe8, 0x18, 0xd3, 0x43, 0x5f, 0x83, 0xd1, 0x4d, 0x2f, + 0xc1, 0xa4, 0x1d, 0x8a, 0x2d, 0x33, 0x77, 0x26, 0x5c, 0xe4, 0x24, 0xdd, 0x49, 0x4c, 0x05, 0x02, + 0x4b, 0x26, 0xe8, 0x35, 0xb5, 0x06, 0x46, 0x8a, 0x55, 0xc1, 0x6e, 0xeb, 0x76, 0xee, 0x2a, 0x10, + 0xe9, 0xa0, 0x47, 0xef, 0x36, 0x1d, 0xb4, 0x4a, 0xe7, 0x3c, 0xf6, 0xc1, 0xd2, 0x39, 0x1b, 0xe9, + 0xae, 0x2b, 0xf7, 0x2e, 0xdd, 0xf5, 0x17, 0x2d, 0x38, 0xd5, 0xce, 0xcb, 0xfc, 0x2e, 0x12, 0x33, + 0xbf, 0x30, 0x70, 0x06, 0x7c, 0xa3, 0x42, 0x96, 0xae, 0x22, 0x97, 0x0c, 0xe7, 0x57, 0x27, 0xf3, + 0x66, 0x8f, 0xdf, 0x6d, 0xde, 0xec, 0xfb, 0x93, 0xc1, 0x39, 0xcd, 0xa2, 0x3d, 0xf9, 0x81, 0xb3, + 0x68, 0xbf, 0xa6, 0xb2, 0x68, 0xf7, 0xc8, 0xc7, 0xc0, 0x73, 0x64, 0xf7, 0xcd, 0x9d, 0xad, 0xe5, + 0xbf, 0x9e, 0xbe, 0x17, 0xf9, 0xaf, 0xdf, 0x31, 0x85, 0x3d, 0x4f, 0xc6, 0xfc, 0x54, 0x1f, 0x61, + 0x6f, 0xf0, 0xed, 0x2d, 0xee, 0x79, 0xae, 0xef, 0xd9, 0xbb, 0xca, 0xf5, 0x7d, 0x53, 0xcf, 0xa2, + 0x8d, 0xfa, 0xa4, 0x89, 0xa6, 0x44, 0x03, 0xe6, 0xce, 0xbe, 0xa9, 0x6f, 0x41, 0x27, 0x8a, 0xf9, + 0xaa, 0x9d, 0xa6, 0x9b, 0x6f, 0xde, 0x26, 0xd4, 0x9d, 0x93, 0xfb, 0xe4, 0xf1, 0xe4, 0xe4, 0x3e, + 0x75, 0xcf, 0x73, 0x72, 0x9f, 0x3e, 0x86, 0x9c, 0xdc, 0x0f, 0x7c, 0xa8, 0x39, 0xb9, 0xab, 0xf7, + 0x37, 0x27, 0xf7, 0x99, 0x7b, 0x91, 0x93, 0xfb, 0x26, 0x54, 0xda, 0x32, 0xd0, 0xaf, 0x3a, 0x57, + 0x3c, 0x24, 0xb9, 0xd1, 0x80, 0x7c, 0x48, 0x14, 0x0a, 0xa7, 0xac, 0x28, 0xdf, 0x34, 0x47, 0xf7, + 0x83, 0xc5, 0x7c, 0x73, 0x8f, 0xed, 0x3d, 0x32, 0x73, 0xff, 0xb5, 0x12, 0x9c, 0xed, 0x3d, 0xaf, + 0xd3, 0x33, 0x7f, 0x23, 0x35, 0xe0, 0x66, 0xce, 0xfc, 0x4c, 0xe9, 0xd2, 0xa8, 0x06, 0x8e, 0x86, + 0xbe, 0x08, 0xb3, 0xca, 0xdf, 0xc9, 0xf7, 0x5a, 0x7b, 0xda, 0xb3, 0x3a, 0xca, 0x85, 0xbe, 0x99, + 0x25, 0xc0, 0xdd, 0x65, 0xd0, 0x22, 0x4c, 0x1b, 0xc0, 0xb5, 0xba, 0x50, 0xc9, 0x95, 0x91, 0xa1, + 0x69, 0xa2, 0x71, 0x96, 0xde, 0xfe, 0xaa, 0x05, 0x0f, 0x14, 0xa4, 0xf7, 0x1c, 0x38, 0xd8, 0x77, + 0x03, 0xa6, 0xdb, 0x66, 0xd1, 0x3e, 0x39, 0x01, 0x8c, 0x24, 0xa2, 0xaa, 0xad, 0x19, 0x04, 0xce, + 0x32, 0x5d, 0x3a, 0xff, 0xcd, 0xef, 0x9e, 0xfd, 0xd8, 0x1f, 0x7e, 0xf7, 0xec, 0xc7, 0xbe, 0xf3, + 0xdd, 0xb3, 0x1f, 0xfb, 0xff, 0x0e, 0xce, 0x5a, 0xdf, 0x3c, 0x38, 0x6b, 0xfd, 0xe1, 0xc1, 0x59, + 0xeb, 0x3b, 0x07, 0x67, 0xad, 0x3f, 0x3d, 0x38, 0x6b, 0xfd, 0xdc, 0xf7, 0xce, 0x7e, 0xec, 0xad, + 0xd2, 0xee, 0xb3, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x42, 0x9f, 0x1b, 0x58, 0x12, 0xcd, 0x00, + 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 8fa22ed6b171a..73268a344cf94 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -180,6 +180,39 @@ message Capabilities { repeated string drop = 2; } +// Represents a Ceph Filesystem mount that lasts the lifetime of a pod +// Cephfs volumes do not support ownership management or SELinux relabeling. +message CephFSPersistentVolumeSource { + // Required: Monitors is a collection of Ceph monitors + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + repeated string monitors = 1; + + // Optional: Used as the mounted root, rather than the full Ceph tree, default is / + // +optional + optional string path = 2; + + // Optional: User is the rados user name, default is admin + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + // +optional + optional string user = 3; + + // Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + // +optional + optional string secretFile = 4; + + // Optional: SecretRef is reference to the authentication secret for User, default is empty. + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + // +optional + optional SecretReference secretRef = 5; + + // Optional: Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it + // +optional + optional bool readOnly = 6; +} + // Represents a Ceph Filesystem mount that lasts the lifetime of a pod // Cephfs volumes do not support ownership management or SELinux relabeling. message CephFSVolumeSource { @@ -2223,7 +2256,7 @@ message PersistentVolumeSource { // CephFS represents a Ceph FS mount on the host that shares a pod's lifetime // +optional - optional CephFSVolumeSource cephfs = 9; + optional CephFSPersistentVolumeSource cephfs = 9; // FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. // +optional @@ -3491,6 +3524,18 @@ message SecretProjection { optional bool optional = 4; } +// SecretReference represents a Secret Reference. It has enough information to retrieve secret +// in any namespace +message SecretReference { + // Name is unique within a namespace to reference a secret resource. + // +optional + optional string name = 1; + + // Namespace defines the space within which the secret name must be unique. + // +optional + optional string namespace = 2; +} + // Adapts a Secret into a volume. // // The contents of the target Secret's Data field will be presented in a volume diff --git a/staging/src/k8s.io/api/core/v1/types.generated.go b/staging/src/k8s.io/api/core/v1/types.generated.go index 67a270e62249f..8de7da85cc92d 100644 --- a/staging/src/k8s.io/api/core/v1/types.generated.go +++ b/staging/src/k8s.io/api/core/v1/types.generated.go @@ -6069,7 +6069,7 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Deco } } else { if x.CephFS == nil { - x.CephFS = new(CephFSVolumeSource) + x.CephFS = new(CephFSPersistentVolumeSource) } x.CephFS.CodecDecodeSelf(d) } @@ -6404,7 +6404,7 @@ func (x *PersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.De } } else { if x.CephFS == nil { - x.CephFS = new(CephFSVolumeSource) + x.CephFS = new(CephFSPersistentVolumeSource) } x.CephFS.CodecDecodeSelf(d) } @@ -8201,7 +8201,7 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decode } case "cephfs": if x.PersistentVolumeSource.CephFS == nil { - x.PersistentVolumeSource.CephFS = new(CephFSVolumeSource) + x.PersistentVolumeSource.CephFS = new(CephFSPersistentVolumeSource) } if r.TryDecodeAsNil() { if x.CephFS != nil { @@ -8209,7 +8209,7 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decode } } else { if x.CephFS == nil { - x.CephFS = new(CephFSVolumeSource) + x.CephFS = new(CephFSPersistentVolumeSource) } x.CephFS.CodecDecodeSelf(d) } @@ -8647,7 +8647,7 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco x.Cinder.CodecDecodeSelf(d) } if x.PersistentVolumeSource.CephFS == nil { - x.PersistentVolumeSource.CephFS = new(CephFSVolumeSource) + x.PersistentVolumeSource.CephFS = new(CephFSPersistentVolumeSource) } yyj32++ if yyhl32 { @@ -8666,7 +8666,7 @@ func (x *PersistentVolumeSpec) codecDecodeSelfFromArray(l int, d *codec1978.Deco } } else { if x.CephFS == nil { - x.CephFS = new(CephFSVolumeSource) + x.CephFS = new(CephFSPersistentVolumeSource) } x.CephFS.CodecDecodeSelf(d) } @@ -13437,6 +13437,725 @@ func (x *CephFSVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decode z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x *SecretReference) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [2]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.Name != "" + yyq2[1] = x.Namespace != "" + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(2) + } else { + yynn2 = 0 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("name")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Name)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Namespace)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("namespace")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Namespace)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *SecretReference) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *SecretReference) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "name": + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv4 := &x.Name + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "namespace": + if r.TryDecodeAsNil() { + x.Namespace = "" + } else { + yyv6 := &x.Namespace + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *SecretReference) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj8 int + var yyb8 bool + var yyhl8 bool = l >= 0 + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Name = "" + } else { + yyv9 := &x.Name + yym10 := z.DecBinary() + _ = yym10 + if false { + } else { + *((*string)(yyv9)) = r.DecodeString() + } + } + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Namespace = "" + } else { + yyv11 := &x.Namespace + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + *((*string)(yyv11)) = r.DecodeString() + } + } + for { + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj8-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *CephFSPersistentVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [6]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[1] = x.Path != "" + yyq2[2] = x.User != "" + yyq2[3] = x.SecretFile != "" + yyq2[4] = x.SecretRef != nil + yyq2[5] = x.ReadOnly != false + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(6) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.Monitors == nil { + r.EncodeNil() + } else { + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + z.F.EncSliceStringV(x.Monitors, false, e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("monitors")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Monitors == nil { + r.EncodeNil() + } else { + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + z.F.EncSliceStringV(x.Monitors, false, e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Path)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("path")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Path)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.User)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("user")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym11 := z.EncBinary() + _ = yym11 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.User)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[3] { + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.SecretFile)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("secretFile")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.SecretFile)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[4] { + if x.SecretRef == nil { + r.EncodeNil() + } else { + x.SecretRef.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[4] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("secretRef")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.SecretRef == nil { + r.EncodeNil() + } else { + x.SecretRef.CodecEncodeSelf(e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[5] { + yym19 := z.EncBinary() + _ = yym19 + if false { + } else { + r.EncodeBool(bool(x.ReadOnly)) + } + } else { + r.EncodeBool(false) + } + } else { + if yyq2[5] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("readOnly")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym20 := z.EncBinary() + _ = yym20 + if false { + } else { + r.EncodeBool(bool(x.ReadOnly)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *CephFSPersistentVolumeSource) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *CephFSPersistentVolumeSource) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "monitors": + if r.TryDecodeAsNil() { + x.Monitors = nil + } else { + yyv4 := &x.Monitors + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + z.F.DecSliceStringX(yyv4, false, d) + } + } + case "path": + if r.TryDecodeAsNil() { + x.Path = "" + } else { + yyv6 := &x.Path + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + *((*string)(yyv6)) = r.DecodeString() + } + } + case "user": + if r.TryDecodeAsNil() { + x.User = "" + } else { + yyv8 := &x.User + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + *((*string)(yyv8)) = r.DecodeString() + } + } + case "secretFile": + if r.TryDecodeAsNil() { + x.SecretFile = "" + } else { + yyv10 := &x.SecretFile + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + *((*string)(yyv10)) = r.DecodeString() + } + } + case "secretRef": + if r.TryDecodeAsNil() { + if x.SecretRef != nil { + x.SecretRef = nil + } + } else { + if x.SecretRef == nil { + x.SecretRef = new(SecretReference) + } + x.SecretRef.CodecDecodeSelf(d) + } + case "readOnly": + if r.TryDecodeAsNil() { + x.ReadOnly = false + } else { + yyv13 := &x.ReadOnly + yym14 := z.DecBinary() + _ = yym14 + if false { + } else { + *((*bool)(yyv13)) = r.DecodeBool() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *CephFSPersistentVolumeSource) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj15 int + var yyb15 bool + var yyhl15 bool = l >= 0 + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l + } else { + yyb15 = r.CheckBreak() + } + if yyb15 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Monitors = nil + } else { + yyv16 := &x.Monitors + yym17 := z.DecBinary() + _ = yym17 + if false { + } else { + z.F.DecSliceStringX(yyv16, false, d) + } + } + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l + } else { + yyb15 = r.CheckBreak() + } + if yyb15 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Path = "" + } else { + yyv18 := &x.Path + yym19 := z.DecBinary() + _ = yym19 + if false { + } else { + *((*string)(yyv18)) = r.DecodeString() + } + } + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l + } else { + yyb15 = r.CheckBreak() + } + if yyb15 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.User = "" + } else { + yyv20 := &x.User + yym21 := z.DecBinary() + _ = yym21 + if false { + } else { + *((*string)(yyv20)) = r.DecodeString() + } + } + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l + } else { + yyb15 = r.CheckBreak() + } + if yyb15 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.SecretFile = "" + } else { + yyv22 := &x.SecretFile + yym23 := z.DecBinary() + _ = yym23 + if false { + } else { + *((*string)(yyv22)) = r.DecodeString() + } + } + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l + } else { + yyb15 = r.CheckBreak() + } + if yyb15 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.SecretRef != nil { + x.SecretRef = nil + } + } else { + if x.SecretRef == nil { + x.SecretRef = new(SecretReference) + } + x.SecretRef.CodecDecodeSelf(d) + } + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l + } else { + yyb15 = r.CheckBreak() + } + if yyb15 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.ReadOnly = false + } else { + yyv25 := &x.ReadOnly + yym26 := z.DecBinary() + _ = yym26 + if false { + } else { + *((*bool)(yyv25)) = r.DecodeBool() + } + } + for { + yyj15++ + if yyhl15 { + yyb15 = yyj15 > l + } else { + yyb15 = r.CheckBreak() + } + if yyb15 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj15-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x *FlockerVolumeSource) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index f7bda3bd10ea8..30add02bcf531 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -126,6 +126,20 @@ func (Capabilities) SwaggerDoc() map[string]string { return map_Capabilities } +var map_CephFSPersistentVolumeSource = map[string]string{ + "": "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.", + "monitors": "Required: Monitors is a collection of Ceph monitors More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", + "path": "Optional: Used as the mounted root, rather than the full Ceph tree, default is /", + "user": "Optional: User is the rados user name, default is admin More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", + "secretFile": "Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", + "secretRef": "Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", + "readOnly": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", +} + +func (CephFSPersistentVolumeSource) SwaggerDoc() map[string]string { + return map_CephFSPersistentVolumeSource +} + var map_CephFSVolumeSource = map[string]string{ "": "Represents a Ceph Filesystem mount that lasts the lifetime of a pod Cephfs volumes do not support ownership management or SELinux relabeling.", "monitors": "Required: Monitors is a collection of Ceph monitors More info: https://releases.k8s.io/HEAD/examples/volumes/cephfs/README.md#how-to-use-it", @@ -1764,6 +1778,16 @@ func (SecretProjection) SwaggerDoc() map[string]string { return map_SecretProjection } +var map_SecretReference = map[string]string{ + "": "SecretReference represents a Secret Reference. It has enough information to retrieve secret in any namespace", + "name": "Name is unique within a namespace to reference a secret resource.", + "namespace": "Namespace defines the space within which the secret name must be unique.", +} + +func (SecretReference) SwaggerDoc() map[string]string { + return map_SecretReference +} + var map_SecretVolumeSource = map[string]string{ "": "Adapts a Secret into a volume.\n\nThe contents of the target Secret's Data field will be presented in a volume as files using the keys in the Data field as the file names. Secret volumes support ownership management and SELinux relabeling.", "secretName": "Name of the secret in the pod's namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret", diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index 20929a5db9595..b204c2d696565 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -74,6 +74,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*Capabilities).DeepCopyInto(out.(*Capabilities)) return nil }, InType: reflect.TypeOf(&Capabilities{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*CephFSPersistentVolumeSource).DeepCopyInto(out.(*CephFSPersistentVolumeSource)) + return nil + }, InType: reflect.TypeOf(&CephFSPersistentVolumeSource{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*CephFSVolumeSource).DeepCopyInto(out.(*CephFSVolumeSource)) return nil @@ -638,6 +642,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*SecretProjection).DeepCopyInto(out.(*SecretProjection)) return nil }, InType: reflect.TypeOf(&SecretProjection{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*SecretReference).DeepCopyInto(out.(*SecretReference)) + return nil + }, InType: reflect.TypeOf(&SecretReference{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*SecretVolumeSource).DeepCopyInto(out.(*SecretVolumeSource)) return nil @@ -978,6 +986,36 @@ func (in *Capabilities) DeepCopy() *Capabilities { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CephFSPersistentVolumeSource) DeepCopyInto(out *CephFSPersistentVolumeSource) { + *out = *in + if in.Monitors != nil { + in, out := &in.Monitors, &out.Monitors + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + if *in == nil { + *out = nil + } else { + *out = new(SecretReference) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CephFSPersistentVolumeSource. +func (in *CephFSPersistentVolumeSource) DeepCopy() *CephFSPersistentVolumeSource { + if in == nil { + return nil + } + out := new(CephFSPersistentVolumeSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CephFSVolumeSource) DeepCopyInto(out *CephFSVolumeSource) { *out = *in @@ -3649,7 +3687,7 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { if *in == nil { *out = nil } else { - *out = new(CephFSVolumeSource) + *out = new(CephFSPersistentVolumeSource) (*in).DeepCopyInto(*out) } } @@ -5265,6 +5303,22 @@ func (in *SecretProjection) DeepCopy() *SecretProjection { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretReference) DeepCopyInto(out *SecretReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretReference. +func (in *SecretReference) DeepCopy() *SecretReference { + if in == nil { + return nil + } + out := new(SecretReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SecretVolumeSource) DeepCopyInto(out *SecretVolumeSource) { *out = *in From b75dc93dd40e60df14886e7f251479001a5c2283 Mon Sep 17 00:00:00 2001 From: "Christopher M. Luciano" Date: Sat, 19 Aug 2017 14:25:27 -0400 Subject: [PATCH 284/403] Add IPBlock to NetworkPolicy Signed-off-by: Christopher M. Luciano --- pkg/apis/extensions/v1beta1/conversion.go | 34 +++++++ pkg/apis/networking/types.go | 18 ++++ pkg/apis/networking/validation/validation.go | 43 +++++++- .../networking/validation/validation_test.go | 97 +++++++++++++++++++ .../k8s.io/api/extensions/v1beta1/types.go | 18 ++++ staging/src/k8s.io/api/networking/v1/types.go | 18 ++++ 6 files changed, 227 insertions(+), 1 deletion(-) diff --git a/pkg/apis/extensions/v1beta1/conversion.go b/pkg/apis/extensions/v1beta1/conversion.go index 8e8c4c08cd9fc..4fa33ca7cb8ac 100644 --- a/pkg/apis/extensions/v1beta1/conversion.go +++ b/pkg/apis/extensions/v1beta1/conversion.go @@ -60,6 +60,8 @@ func addConversionFuncs(scheme *runtime.Scheme) error { Convert_v1beta1_NetworkPolicySpec_To_networking_NetworkPolicySpec, Convert_networking_NetworkPolicySpec_To_v1beta1_NetworkPolicySpec, Convert_extensions_PodSecurityPolicySpec_To_v1beta1_PodSecurityPolicySpec, + Convert_v1beta1_IPBlock_To_networking_IPBlock, + Convert_networking_IPBlock_To_v1beta1_IPBlock, ) if err != nil { return err @@ -364,6 +366,14 @@ func Convert_v1beta1_NetworkPolicyPeer_To_networking_NetworkPolicyPeer(in *exten } else { out.NamespaceSelector = nil } + if in.IPBlock != nil { + out.IPBlock = new(networking.IPBlock) + if err := s.Convert(in.IPBlock, out.IPBlock, 0); err != nil { + return err + } + } else { + out.IPBlock = nil + } return nil } @@ -384,6 +394,30 @@ func Convert_networking_NetworkPolicyPeer_To_v1beta1_NetworkPolicyPeer(in *netwo } else { out.NamespaceSelector = nil } + if in.IPBlock != nil { + out.IPBlock = new(extensionsv1beta1.IPBlock) + if err := s.Convert(in.IPBlock, out.IPBlock, 0); err != nil { + return err + } + } else { + out.IPBlock = nil + } + return nil +} + +func Convert_v1beta1_IPBlock_To_networking_IPBlock(in *extensionsv1beta1.IPBlock, out *networking.IPBlock, s conversion.Scope) error { + out.CIDR = in.CIDR + + out.Except = make([]string, len(in.Except)) + copy(out.Except, in.Except) + return nil +} + +func Convert_networking_IPBlock_To_v1beta1_IPBlock(in *networking.IPBlock, out *extensionsv1beta1.IPBlock, s conversion.Scope) error { + out.CIDR = in.CIDR + + out.Except = make([]string, len(in.Except)) + copy(out.Except, in.Except) return nil } diff --git a/pkg/apis/networking/types.go b/pkg/apis/networking/types.go index a422b05d5c010..74d818cd77f4d 100644 --- a/pkg/apis/networking/types.go +++ b/pkg/apis/networking/types.go @@ -90,6 +90,20 @@ type NetworkPolicyPort struct { Port *intstr.IntOrString } +// IPBlock describes a particular CIDR (Ex. "192.168.1.1/24") that is allowed to the pods +// matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should +// not be included within this rule. +type IPBlock struct { + // CIDR is a string representing the IP Block + // Valid examples are "192.168.1.1/24" + CIDR string + // Except is a slice of CIDRs that should not be included within an IP Block + // Valid examples are "192.168.1.1/24" + // Except values will be rejected if they are outside the CIDR range + // +optional + Except []string +} + // NetworkPolicyPeer describes a peer to allow traffic from. Exactly one of its fields // must be specified. type NetworkPolicyPeer struct { @@ -104,6 +118,10 @@ type NetworkPolicyPeer struct { // selector semantics. If present but empty, this selector selects all namespaces. // +optional NamespaceSelector *metav1.LabelSelector + + // IPBlock defines policy on a particular IPBlock + // +optional + IPBlock *IPBlock } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/apis/networking/validation/validation.go b/pkg/apis/networking/validation/validation.go index 12272d5028936..780cc652905e4 100644 --- a/pkg/apis/networking/validation/validation.go +++ b/pkg/apis/networking/validation/validation.go @@ -17,6 +17,8 @@ limitations under the License. package validation import ( + "net" + unversionedvalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/validation" @@ -68,7 +70,10 @@ func ValidateNetworkPolicySpec(spec *networking.NetworkPolicySpec, fldPath *fiel numFroms++ allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(from.NamespaceSelector, fromPath.Child("namespaceSelector"))...) } - + if from.IPBlock != nil { + numFroms++ + allErrs = append(allErrs, ValidateIPBlock(from.IPBlock, fromPath.Child("ipBlock"))...) + } if numFroms == 0 { allErrs = append(allErrs, field.Required(fromPath, "must specify a from type")) } else if numFroms > 1 { @@ -93,3 +98,39 @@ func ValidateNetworkPolicyUpdate(update, old *networking.NetworkPolicy) field.Er allErrs = append(allErrs, ValidateNetworkPolicySpec(&update.Spec, field.NewPath("spec"))...) return allErrs } + +// ValidateIPBlock validates a cidr and the except fields of an IpBlock NetworkPolicyPeer +func ValidateIPBlock(ipb *networking.IPBlock, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if len(ipb.CIDR) == 0 || ipb.CIDR == "" { + allErrs = append(allErrs, field.Required(fldPath.Child("cidr"), "")) + return allErrs + } + cidrIPNet, err := validateCIDR(ipb.CIDR) + if err != nil { + allErrs = append(allErrs, field.Invalid(fldPath.Child("cidr"), ipb.CIDR, "not a valid CIDR")) + return allErrs + } + exceptCIDR := ipb.Except + for i, exceptIP := range exceptCIDR { + exceptPath := fldPath.Child("except").Index(i) + exceptCIDR, err := validateCIDR(exceptIP) + if err != nil { + allErrs = append(allErrs, field.Invalid(exceptPath, exceptIP, "not a valid CIDR")) + return allErrs + } + if !cidrIPNet.Contains(exceptCIDR.IP) { + allErrs = append(allErrs, field.Invalid(exceptPath, exceptCIDR.IP, "not within CIDR range")) + } + } + return allErrs +} + +// validateCIDR validates whether a CIDR matches the conventions expected by net.ParseCIDR +func validateCIDR(cidr string) (*net.IPNet, error) { + _, net, err := net.ParseCIDR(cidr) + if err != nil { + return nil, err + } + return net, nil +} diff --git a/pkg/apis/networking/validation/validation_test.go b/pkg/apis/networking/validation/validation_test.go index 154d783bf153c..0be1f0998c576 100644 --- a/pkg/apis/networking/validation/validation_test.go +++ b/pkg/apis/networking/validation/validation_test.go @@ -122,6 +122,26 @@ func TestValidateNetworkPolicy(t *testing.T) { }, }, }, + { + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"}, + Spec: networking.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{"a": "b"}, + }, + Ingress: []networking.NetworkPolicyIngressRule{ + { + From: []networking.NetworkPolicyPeer{ + { + IPBlock: &networking.IPBlock{ + CIDR: "192.168.0.0/16", + Except: []string{"192.168.3.0/24", "192.168.4.0/24"}, + }, + }, + }, + }, + }, + }, + }, } // Success cases are expected to pass validation. @@ -256,6 +276,83 @@ func TestValidateNetworkPolicy(t *testing.T) { }, }, }, + "missing cidr field": { + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"}, + Spec: networking.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{}, + Ingress: []networking.NetworkPolicyIngressRule{ + { + From: []networking.NetworkPolicyPeer{ + { + IPBlock: &networking.IPBlock{ + Except: []string{"192.168.8.0/24", "192.168.9.0/24"}, + }, + }, + }, + }, + }, + }, + }, + "invalid cidr format": { + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"}, + Spec: networking.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{"a": "b"}, + }, + Ingress: []networking.NetworkPolicyIngressRule{ + { + From: []networking.NetworkPolicyPeer{ + { + IPBlock: &networking.IPBlock{ + CIDR: "192.168.5.6", + Except: []string{"192.168.1.0/24", "192.168.2.0/24"}, + }, + }, + }, + }, + }, + }, + }, + "except field is an empty string": { + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"}, + Spec: networking.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{"a": "b"}, + }, + Ingress: []networking.NetworkPolicyIngressRule{ + { + From: []networking.NetworkPolicyPeer{ + { + IPBlock: &networking.IPBlock{ + CIDR: "192.168.8.0/24", + Except: []string{"", " "}, + }, + }, + }, + }, + }, + }, + }, + "except IP is outside of CIDR range": { + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"}, + Spec: networking.NetworkPolicySpec{ + PodSelector: metav1.LabelSelector{ + MatchLabels: map[string]string{"a": "b"}, + }, + Ingress: []networking.NetworkPolicyIngressRule{ + { + From: []networking.NetworkPolicyPeer{ + { + IPBlock: &networking.IPBlock{ + CIDR: "192.168.8.0/24", + Except: []string{"192.168.9.1/24"}, + }, + }, + }, + }, + }, + }, + }, } // Error cases are not expected to pass validation. diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types.go b/staging/src/k8s.io/api/extensions/v1beta1/types.go index 11300661fb10f..2967f053b35bd 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types.go @@ -1181,6 +1181,20 @@ type NetworkPolicyPort struct { Port *intstr.IntOrString `json:"port,omitempty" protobuf:"bytes,2,opt,name=port"` } +// IPBlock describes a particular CIDR (Ex. "192.168.1.1/24") that is allowed to the pods +// matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should +// not be included within this rule. +type IPBlock struct { + // CIDR is a string representing the IP Block + // Valid examples are "192.168.1.1/24" + CIDR string `json:"cidr" protobuf:"bytes,1,name=cidr"` + // Except is a slice of CIDRs that should not be included within an IP Block + // Valid examples are "192.168.1.1/24" + // Except values will be rejected if they are outside the CIDR range + // +optional + Except []string `json:"except,omitempty" protobuf:"bytes,2,rep,name=except"` +} + type NetworkPolicyPeer struct { // Exactly one of the following must be specified. @@ -1196,6 +1210,10 @@ type NetworkPolicyPeer struct { // If present but empty, this selector selects all namespaces. // +optional NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty" protobuf:"bytes,2,opt,name=namespaceSelector"` + + // IPBlock defines policy on a particular IPBlock + // +optional + IPBlock *IPBlock `json:"ipBlock,omitempty" protobuf:"bytes,3,rep,name=ipBlock"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/staging/src/k8s.io/api/networking/v1/types.go b/staging/src/k8s.io/api/networking/v1/types.go index 1a6ea7b96a640..a0c7721b2d67f 100644 --- a/staging/src/k8s.io/api/networking/v1/types.go +++ b/staging/src/k8s.io/api/networking/v1/types.go @@ -92,6 +92,20 @@ type NetworkPolicyPort struct { Port *intstr.IntOrString `json:"port,omitempty" protobuf:"bytes,2,opt,name=port"` } +// IPBlock describes a particular CIDR (Ex. "192.168.1.1/24") that is allowed to the pods +// matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should +// not be included within this rule. +type IPBlock struct { + // CIDR is a string representing the IP Block + // Valid examples are "192.168.1.1/24" + CIDR string `json:"cidr" protobuf:"bytes,1,name=cidr"` + // Except is a slice of CIDRs that should not be included within an IP Block + // Valid examples are "192.168.1.1/24" + // Except values will be rejected if they are outside the CIDR range + // +optional + Except []string `json:"except,omitempty" protobuf:"bytes,2,rep,name=except"` +} + // NetworkPolicyPeer describes a peer to allow traffic from. Exactly one of its fields // must be specified. type NetworkPolicyPeer struct { @@ -106,6 +120,10 @@ type NetworkPolicyPeer struct { // selector semantics. If present but empty, this selector selects all namespaces. // +optional NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty" protobuf:"bytes,2,opt,name=namespaceSelector"` + + // IPBlock defines policy on a particular IPBlock + // +optional + IPBlock *IPBlock `json:"ipBlock,omitempty" protobuf:"bytes,3,rep,name=ipBlock"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object From 54a058f792555610fbae9e819a2b5e32cdfb4c34 Mon Sep 17 00:00:00 2001 From: "Christopher M. Luciano" Date: Mon, 21 Aug 2017 12:36:45 -0400 Subject: [PATCH 285/403] Add networking fuzzer Signed-off-by: Christopher M. Luciano --- pkg/api/testing/fuzzer.go | 4 +++- pkg/apis/networking/fuzzer/fuzzer.go | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pkg/api/testing/fuzzer.go b/pkg/api/testing/fuzzer.go index 844b9f79d2b86..8fc37898d491d 100644 --- a/pkg/api/testing/fuzzer.go +++ b/pkg/api/testing/fuzzer.go @@ -19,7 +19,7 @@ package testing import ( "fmt" - "github.com/google/gofuzz" + fuzz "github.com/google/gofuzz" "k8s.io/api/core/v1" apitesting "k8s.io/apimachinery/pkg/api/testing" @@ -38,6 +38,7 @@ import ( "k8s.io/kubernetes/pkg/apis/extensions" extensionsfuzzer "k8s.io/kubernetes/pkg/apis/extensions/fuzzer" extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" + networkingfuzzer "k8s.io/kubernetes/pkg/apis/networking/fuzzer" policyfuzzer "k8s.io/kubernetes/pkg/apis/policy/fuzzer" rbacfuzzer "k8s.io/kubernetes/pkg/apis/rbac/fuzzer" storagefuzzer "k8s.io/kubernetes/pkg/apis/storage/fuzzer" @@ -102,4 +103,5 @@ var FuzzerFuncs = fuzzer.MergeFuzzerFuncs( certificatesfuzzer.Funcs, admissionregistrationfuzzer.Funcs, storagefuzzer.Funcs, + networkingfuzzer.Funcs, ) diff --git a/pkg/apis/networking/fuzzer/fuzzer.go b/pkg/apis/networking/fuzzer/fuzzer.go index 6e142826d3be5..1325b9d336cef 100644 --- a/pkg/apis/networking/fuzzer/fuzzer.go +++ b/pkg/apis/networking/fuzzer/fuzzer.go @@ -17,10 +17,24 @@ limitations under the License. package fuzzer import ( + fuzz "github.com/google/gofuzz" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/kubernetes/pkg/apis/networking" ) // Funcs returns the fuzzer functions for the networking api group. var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { - return []interface{}{} + return []interface{}{ + func(np *networking.NetworkPolicyPeer, c fuzz.Continue) { + c.FuzzNoCustom(np) // fuzz self without calling this function again + // TODO: Implement a fuzzer to generate valid keys, values and operators for + // selector requirements. + if np.IPBlock != nil { + np.IPBlock = &networking.IPBlock{ + CIDR: "192.168.1.0/24", + Except: []string{"192.168.1.1/24", "192.168.1.2/24"}, + } + } + }, + } } From 02735c3fb25aa1f014cfbcde0690802262b40f25 Mon Sep 17 00:00:00 2001 From: "Christopher M. Luciano" Date: Thu, 24 Aug 2017 14:58:02 -0400 Subject: [PATCH 286/403] IPBlock generated code Signed-off-by: Christopher M. Luciano --- api/openapi-spec/swagger.json | 46 + api/swagger-spec/extensions_v1beta1.json | 24 + api/swagger-spec/networking.k8s.io_v1.json | 24 + .../extensions/v1beta1/definitions.html | 48 + .../networking.k8s.io/v1/definitions.html | 48 + pkg/api/testing/BUILD | 1 + pkg/apis/networking/fuzzer/BUILD | 6 +- .../networking/v1/zz_generated.conversion.go | 26 + pkg/apis/networking/zz_generated.deepcopy.go | 34 + .../api/extensions/v1beta1/generated.pb.go | 840 +++++++++++------- .../api/extensions/v1beta1/generated.proto | 19 + .../api/extensions/v1beta1/types.generated.go | 350 +++++++- .../v1beta1/types_swagger_doc_generated.go | 11 + .../v1beta1/zz_generated.deepcopy.go | 34 + .../k8s.io/api/networking/v1/generated.pb.go | 335 +++++-- .../k8s.io/api/networking/v1/generated.proto | 19 + .../api/networking/v1/types.generated.go | 350 +++++++- .../v1/types_swagger_doc_generated.go | 11 + .../networking/v1/zz_generated.deepcopy.go | 34 + 19 files changed, 1848 insertions(+), 412 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 82b161ba2574d..a5b14d22072f9 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -62829,6 +62829,25 @@ } } }, + "io.k8s.api.extensions.v1beta1.IPBlock": { + "description": "IPBlock describes a particular CIDR (Ex. \"192.168.1.1/24\") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.", + "required": [ + "cidr" + ], + "properties": { + "cidr": { + "description": "CIDR is a string representing the IP Block Valid examples are \"192.168.1.1/24\"", + "type": "string" + }, + "except": { + "description": "Except is a slice of CIDRs that should not be included within an IP Block Valid examples are \"192.168.1.1/24\" Except values will be rejected if they are outside the CIDR range", + "type": "array", + "items": { + "type": "string" + } + } + } + }, "io.k8s.api.extensions.v1beta1.Ingress": { "description": "Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc.", "properties": { @@ -63055,6 +63074,10 @@ }, "io.k8s.api.extensions.v1beta1.NetworkPolicyPeer": { "properties": { + "ipBlock": { + "description": "IPBlock defines policy on a particular IPBlock", + "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.IPBlock" + }, "namespaceSelector": { "description": "Selects Namespaces using cluster scoped-labels. This matches all pods in all namespaces selected by this label selector. This field follows standard label selector semantics. If present but empty, this selector selects all namespaces.", "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector" @@ -63556,6 +63579,25 @@ } } }, + "io.k8s.api.networking.v1.IPBlock": { + "description": "IPBlock describes a particular CIDR (Ex. \"192.168.1.1/24\") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.", + "required": [ + "cidr" + ], + "properties": { + "cidr": { + "description": "CIDR is a string representing the IP Block Valid examples are \"192.168.1.1/24\"", + "type": "string" + }, + "except": { + "description": "Except is a slice of CIDRs that should not be included within an IP Block Valid examples are \"192.168.1.1/24\" Except values will be rejected if they are outside the CIDR range", + "type": "array", + "items": { + "type": "string" + } + } + } + }, "io.k8s.api.networking.v1.NetworkPolicy": { "description": "NetworkPolicy describes what network traffic is allowed for a set of Pods", "properties": { @@ -63640,6 +63682,10 @@ "io.k8s.api.networking.v1.NetworkPolicyPeer": { "description": "NetworkPolicyPeer describes a peer to allow traffic from. Exactly one of its fields must be specified.", "properties": { + "ipBlock": { + "description": "IPBlock defines policy on a particular IPBlock", + "$ref": "#/definitions/io.k8s.api.networking.v1.IPBlock" + }, "namespaceSelector": { "description": "Selects Namespaces using cluster scoped-labels. This matches all pods in all namespaces selected by this label selector. This field follows standard label selector semantics. If present but empty, this selector selects all namespaces.", "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector" diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index 138f899914f34..75b166737bbb5 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -9293,6 +9293,30 @@ "namespaceSelector": { "$ref": "v1.LabelSelector", "description": "Selects Namespaces using cluster scoped-labels. This matches all pods in all namespaces selected by this label selector. This field follows standard label selector semantics. If present but empty, this selector selects all namespaces." + }, + "ipBlock": { + "$ref": "v1beta1.IPBlock", + "description": "IPBlock defines policy on a particular IPBlock" + } + } + }, + "v1beta1.IPBlock": { + "id": "v1beta1.IPBlock", + "description": "IPBlock describes a particular CIDR (Ex. \"192.168.1.1/24\") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.", + "required": [ + "cidr" + ], + "properties": { + "cidr": { + "type": "string", + "description": "CIDR is a string representing the IP Block Valid examples are \"192.168.1.1/24\"" + }, + "except": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Except is a slice of CIDRs that should not be included within an IP Block Valid examples are \"192.168.1.1/24\" Except values will be rejected if they are outside the CIDR range" } } }, diff --git a/api/swagger-spec/networking.k8s.io_v1.json b/api/swagger-spec/networking.k8s.io_v1.json index 79a9ac80cb39b..059a1c639640e 100644 --- a/api/swagger-spec/networking.k8s.io_v1.json +++ b/api/swagger-spec/networking.k8s.io_v1.json @@ -1307,6 +1307,30 @@ "namespaceSelector": { "$ref": "v1.LabelSelector", "description": "Selects Namespaces using cluster scoped-labels. This matches all pods in all namespaces selected by this label selector. This field follows standard label selector semantics. If present but empty, this selector selects all namespaces." + }, + "ipBlock": { + "$ref": "v1.IPBlock", + "description": "IPBlock defines policy on a particular IPBlock" + } + } + }, + "v1.IPBlock": { + "id": "v1.IPBlock", + "description": "IPBlock describes a particular CIDR (Ex. \"192.168.1.1/24\") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.", + "required": [ + "cidr" + ], + "properties": { + "cidr": { + "type": "string", + "description": "CIDR is a string representing the IP Block Valid examples are \"192.168.1.1/24\"" + }, + "except": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Except is a slice of CIDRs that should not be included within an IP Block Valid examples are \"192.168.1.1/24\" Except values will be rejected if they are outside the CIDR range" } } }, diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index 125105c42dd73..2b9bdc2282622 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -3208,6 +3208,47 @@

v1.EnvVarSource

+
+
+

v1beta1.IPBlock

+
+

IPBlock describes a particular CIDR (Ex. "192.168.1.1/24") that is allowed to the pods matched by a NetworkPolicySpec’s podSelector. The except entry describes CIDRs that should not be included within this rule.

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

cidr

CIDR is a string representing the IP Block Valid examples are "192.168.1.1/24"

true

string

except

Except is a slice of CIDRs that should not be included within an IP Block Valid examples are "192.168.1.1/24" Except values will be rejected if they are outside the CIDR range

false

string array

+

v1.LoadBalancerIngress

@@ -5954,6 +5995,13 @@

v1beta1.NetworkPolicyPeer

v1.LabelSelector

+ +

ipBlock

+

IPBlock defines policy on a particular IPBlock

+

false

+

v1beta1.IPBlock

+ + diff --git a/docs/api-reference/networking.k8s.io/v1/definitions.html b/docs/api-reference/networking.k8s.io/v1/definitions.html index eec98686c2906..92f95a1f59275 100755 --- a/docs/api-reference/networking.k8s.io/v1/definitions.html +++ b/docs/api-reference/networking.k8s.io/v1/definitions.html @@ -937,6 +937,47 @@

v1.NetworkPolicyPort

+
+
+

v1.IPBlock

+
+

IPBlock describes a particular CIDR (Ex. "192.168.1.1/24") that is allowed to the pods matched by a NetworkPolicySpec’s podSelector. The except entry describes CIDRs that should not be included within this rule.

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

cidr

CIDR is a string representing the IP Block Valid examples are "192.168.1.1/24"

true

string

except

Except is a slice of CIDRs that should not be included within an IP Block Valid examples are "192.168.1.1/24" Except values will be rejected if they are outside the CIDR range

false

string array

+

v1.LabelSelector

@@ -1460,6 +1501,13 @@

v1.NetworkPolicyPeer

v1.LabelSelector

+ +

ipBlock

+

IPBlock defines policy on a particular IPBlock

+

false

+

v1.IPBlock

+ + diff --git a/pkg/api/testing/BUILD b/pkg/api/testing/BUILD index c914bec2270d7..659e97210cd47 100644 --- a/pkg/api/testing/BUILD +++ b/pkg/api/testing/BUILD @@ -24,6 +24,7 @@ go_library( "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/fuzzer:go_default_library", "//pkg/apis/extensions/v1beta1:go_default_library", + "//pkg/apis/networking/fuzzer:go_default_library", "//pkg/apis/policy/fuzzer:go_default_library", "//pkg/apis/rbac/fuzzer:go_default_library", "//pkg/apis/storage/fuzzer:go_default_library", diff --git a/pkg/apis/networking/fuzzer/BUILD b/pkg/apis/networking/fuzzer/BUILD index dd0561eec8f8f..b5819de095d1e 100644 --- a/pkg/apis/networking/fuzzer/BUILD +++ b/pkg/apis/networking/fuzzer/BUILD @@ -8,7 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["fuzzer.go"], - deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library"], + deps = [ + "//pkg/apis/networking:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + ], ) filegroup( diff --git a/pkg/apis/networking/v1/zz_generated.conversion.go b/pkg/apis/networking/v1/zz_generated.conversion.go index d746e7ffaef40..de3bd546369d8 100644 --- a/pkg/apis/networking/v1/zz_generated.conversion.go +++ b/pkg/apis/networking/v1/zz_generated.conversion.go @@ -40,6 +40,8 @@ func init() { // Public to allow building arbitrary schemes. func RegisterConversions(scheme *runtime.Scheme) error { return scheme.AddGeneratedConversionFuncs( + Convert_v1_IPBlock_To_networking_IPBlock, + Convert_networking_IPBlock_To_v1_IPBlock, Convert_v1_NetworkPolicy_To_networking_NetworkPolicy, Convert_networking_NetworkPolicy_To_v1_NetworkPolicy, Convert_v1_NetworkPolicyIngressRule_To_networking_NetworkPolicyIngressRule, @@ -55,6 +57,28 @@ func RegisterConversions(scheme *runtime.Scheme) error { ) } +func autoConvert_v1_IPBlock_To_networking_IPBlock(in *v1.IPBlock, out *networking.IPBlock, s conversion.Scope) error { + out.CIDR = in.CIDR + out.Except = *(*[]string)(unsafe.Pointer(&in.Except)) + return nil +} + +// Convert_v1_IPBlock_To_networking_IPBlock is an autogenerated conversion function. +func Convert_v1_IPBlock_To_networking_IPBlock(in *v1.IPBlock, out *networking.IPBlock, s conversion.Scope) error { + return autoConvert_v1_IPBlock_To_networking_IPBlock(in, out, s) +} + +func autoConvert_networking_IPBlock_To_v1_IPBlock(in *networking.IPBlock, out *v1.IPBlock, s conversion.Scope) error { + out.CIDR = in.CIDR + out.Except = *(*[]string)(unsafe.Pointer(&in.Except)) + return nil +} + +// Convert_networking_IPBlock_To_v1_IPBlock is an autogenerated conversion function. +func Convert_networking_IPBlock_To_v1_IPBlock(in *networking.IPBlock, out *v1.IPBlock, s conversion.Scope) error { + return autoConvert_networking_IPBlock_To_v1_IPBlock(in, out, s) +} + func autoConvert_v1_NetworkPolicy_To_networking_NetworkPolicy(in *v1.NetworkPolicy, out *networking.NetworkPolicy, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta if err := Convert_v1_NetworkPolicySpec_To_networking_NetworkPolicySpec(&in.Spec, &out.Spec, s); err != nil { @@ -132,6 +156,7 @@ func Convert_networking_NetworkPolicyList_To_v1_NetworkPolicyList(in *networking func autoConvert_v1_NetworkPolicyPeer_To_networking_NetworkPolicyPeer(in *v1.NetworkPolicyPeer, out *networking.NetworkPolicyPeer, s conversion.Scope) error { out.PodSelector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.PodSelector)) out.NamespaceSelector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.NamespaceSelector)) + out.IPBlock = (*networking.IPBlock)(unsafe.Pointer(in.IPBlock)) return nil } @@ -143,6 +168,7 @@ func Convert_v1_NetworkPolicyPeer_To_networking_NetworkPolicyPeer(in *v1.Network func autoConvert_networking_NetworkPolicyPeer_To_v1_NetworkPolicyPeer(in *networking.NetworkPolicyPeer, out *v1.NetworkPolicyPeer, s conversion.Scope) error { out.PodSelector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.PodSelector)) out.NamespaceSelector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.NamespaceSelector)) + out.IPBlock = (*v1.IPBlock)(unsafe.Pointer(in.IPBlock)) return nil } diff --git a/pkg/apis/networking/zz_generated.deepcopy.go b/pkg/apis/networking/zz_generated.deepcopy.go index d68f23467bcf4..6cc1fa4d3d60d 100644 --- a/pkg/apis/networking/zz_generated.deepcopy.go +++ b/pkg/apis/networking/zz_generated.deepcopy.go @@ -39,6 +39,10 @@ func init() { // Deprecated: deepcopy registration will go away when static deepcopy is fully implemented. func RegisterDeepCopies(scheme *runtime.Scheme) error { return scheme.AddGeneratedDeepCopyFuncs( + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*IPBlock).DeepCopyInto(out.(*IPBlock)) + return nil + }, InType: reflect.TypeOf(&IPBlock{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*NetworkPolicy).DeepCopyInto(out.(*NetworkPolicy)) return nil @@ -66,6 +70,27 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { ) } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IPBlock) DeepCopyInto(out *IPBlock) { + *out = *in + if in.Except != nil { + in, out := &in.Except, &out.Except + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPBlock. +func (in *IPBlock) DeepCopy() *IPBlock { + if in == nil { + return nil + } + out := new(IPBlock) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NetworkPolicy) DeepCopyInto(out *NetworkPolicy) { *out = *in @@ -179,6 +204,15 @@ func (in *NetworkPolicyPeer) DeepCopyInto(out *NetworkPolicyPeer) { (*in).DeepCopyInto(*out) } } + if in.IPBlock != nil { + in, out := &in.IPBlock, &out.IPBlock + if *in == nil { + *out = nil + } else { + *out = new(IPBlock) + (*in).DeepCopyInto(*out) + } + } return } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go b/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go index 47ded03b8357f..f7eb3b4d65af9 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go @@ -47,6 +47,7 @@ limitations under the License. HTTPIngressRuleValue HostPortRange IDRange + IPBlock Ingress IngressBackend IngressList @@ -206,161 +207,165 @@ func (m *IDRange) Reset() { *m = IDRange{} } func (*IDRange) ProtoMessage() {} func (*IDRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (m *IPBlock) Reset() { *m = IPBlock{} } +func (*IPBlock) ProtoMessage() {} +func (*IPBlock) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } + func (m *Ingress) Reset() { *m = Ingress{} } func (*Ingress) ProtoMessage() {} -func (*Ingress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*Ingress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *IngressBackend) Reset() { *m = IngressBackend{} } func (*IngressBackend) ProtoMessage() {} -func (*IngressBackend) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*IngressBackend) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *IngressList) Reset() { *m = IngressList{} } func (*IngressList) ProtoMessage() {} -func (*IngressList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*IngressList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *IngressRule) Reset() { *m = IngressRule{} } func (*IngressRule) ProtoMessage() {} -func (*IngressRule) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*IngressRule) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (m *IngressRuleValue) Reset() { *m = IngressRuleValue{} } func (*IngressRuleValue) ProtoMessage() {} -func (*IngressRuleValue) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*IngressRuleValue) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *IngressSpec) Reset() { *m = IngressSpec{} } func (*IngressSpec) ProtoMessage() {} -func (*IngressSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*IngressSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } func (m *IngressStatus) Reset() { *m = IngressStatus{} } func (*IngressStatus) ProtoMessage() {} -func (*IngressStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } +func (*IngressStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *IngressTLS) Reset() { *m = IngressTLS{} } func (*IngressTLS) ProtoMessage() {} -func (*IngressTLS) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*IngressTLS) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *NetworkPolicy) Reset() { *m = NetworkPolicy{} } func (*NetworkPolicy) ProtoMessage() {} -func (*NetworkPolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*NetworkPolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *NetworkPolicyIngressRule) Reset() { *m = NetworkPolicyIngressRule{} } func (*NetworkPolicyIngressRule) ProtoMessage() {} func (*NetworkPolicyIngressRule) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{31} + return fileDescriptorGenerated, []int{32} } func (m *NetworkPolicyList) Reset() { *m = NetworkPolicyList{} } func (*NetworkPolicyList) ProtoMessage() {} -func (*NetworkPolicyList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*NetworkPolicyList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *NetworkPolicyPeer) Reset() { *m = NetworkPolicyPeer{} } func (*NetworkPolicyPeer) ProtoMessage() {} -func (*NetworkPolicyPeer) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } +func (*NetworkPolicyPeer) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (m *NetworkPolicyPort) Reset() { *m = NetworkPolicyPort{} } func (*NetworkPolicyPort) ProtoMessage() {} -func (*NetworkPolicyPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } +func (*NetworkPolicyPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } func (m *NetworkPolicySpec) Reset() { *m = NetworkPolicySpec{} } func (*NetworkPolicySpec) ProtoMessage() {} -func (*NetworkPolicySpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } +func (*NetworkPolicySpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (m *PodSecurityPolicy) Reset() { *m = PodSecurityPolicy{} } func (*PodSecurityPolicy) ProtoMessage() {} -func (*PodSecurityPolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*PodSecurityPolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *PodSecurityPolicyList) Reset() { *m = PodSecurityPolicyList{} } func (*PodSecurityPolicyList) ProtoMessage() {} -func (*PodSecurityPolicyList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } +func (*PodSecurityPolicyList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func (m *PodSecurityPolicySpec) Reset() { *m = PodSecurityPolicySpec{} } func (*PodSecurityPolicySpec) ProtoMessage() {} -func (*PodSecurityPolicySpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } +func (*PodSecurityPolicySpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } func (m *ReplicaSet) Reset() { *m = ReplicaSet{} } func (*ReplicaSet) ProtoMessage() {} -func (*ReplicaSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } +func (*ReplicaSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } func (m *ReplicaSetCondition) Reset() { *m = ReplicaSetCondition{} } func (*ReplicaSetCondition) ProtoMessage() {} -func (*ReplicaSetCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } +func (*ReplicaSetCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } func (m *ReplicaSetList) Reset() { *m = ReplicaSetList{} } func (*ReplicaSetList) ProtoMessage() {} -func (*ReplicaSetList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } +func (*ReplicaSetList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } func (m *ReplicaSetSpec) Reset() { *m = ReplicaSetSpec{} } func (*ReplicaSetSpec) ProtoMessage() {} -func (*ReplicaSetSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } +func (*ReplicaSetSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } func (m *ReplicaSetStatus) Reset() { *m = ReplicaSetStatus{} } func (*ReplicaSetStatus) ProtoMessage() {} -func (*ReplicaSetStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } +func (*ReplicaSetStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } func (m *ReplicationControllerDummy) Reset() { *m = ReplicationControllerDummy{} } func (*ReplicationControllerDummy) ProtoMessage() {} func (*ReplicationControllerDummy) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{44} + return fileDescriptorGenerated, []int{45} } func (m *RollbackConfig) Reset() { *m = RollbackConfig{} } func (*RollbackConfig) ProtoMessage() {} -func (*RollbackConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } +func (*RollbackConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } func (m *RollingUpdateDaemonSet) Reset() { *m = RollingUpdateDaemonSet{} } func (*RollingUpdateDaemonSet) ProtoMessage() {} -func (*RollingUpdateDaemonSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } +func (*RollingUpdateDaemonSet) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } func (m *RollingUpdateDeployment) Reset() { *m = RollingUpdateDeployment{} } func (*RollingUpdateDeployment) ProtoMessage() {} func (*RollingUpdateDeployment) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{47} + return fileDescriptorGenerated, []int{48} } func (m *RunAsUserStrategyOptions) Reset() { *m = RunAsUserStrategyOptions{} } func (*RunAsUserStrategyOptions) ProtoMessage() {} func (*RunAsUserStrategyOptions) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{48} + return fileDescriptorGenerated, []int{49} } func (m *SELinuxStrategyOptions) Reset() { *m = SELinuxStrategyOptions{} } func (*SELinuxStrategyOptions) ProtoMessage() {} -func (*SELinuxStrategyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } +func (*SELinuxStrategyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } func (m *Scale) Reset() { *m = Scale{} } func (*Scale) ProtoMessage() {} -func (*Scale) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } +func (*Scale) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } func (m *ScaleSpec) Reset() { *m = ScaleSpec{} } func (*ScaleSpec) ProtoMessage() {} -func (*ScaleSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } +func (*ScaleSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } func (m *ScaleStatus) Reset() { *m = ScaleStatus{} } func (*ScaleStatus) ProtoMessage() {} -func (*ScaleStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } +func (*ScaleStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } func (m *SupplementalGroupsStrategyOptions) Reset() { *m = SupplementalGroupsStrategyOptions{} } func (*SupplementalGroupsStrategyOptions) ProtoMessage() {} func (*SupplementalGroupsStrategyOptions) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{53} + return fileDescriptorGenerated, []int{54} } func (m *ThirdPartyResource) Reset() { *m = ThirdPartyResource{} } func (*ThirdPartyResource) ProtoMessage() {} -func (*ThirdPartyResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } +func (*ThirdPartyResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } func (m *ThirdPartyResourceData) Reset() { *m = ThirdPartyResourceData{} } func (*ThirdPartyResourceData) ProtoMessage() {} -func (*ThirdPartyResourceData) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } +func (*ThirdPartyResourceData) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } func (m *ThirdPartyResourceDataList) Reset() { *m = ThirdPartyResourceDataList{} } func (*ThirdPartyResourceDataList) ProtoMessage() {} func (*ThirdPartyResourceDataList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{56} + return fileDescriptorGenerated, []int{57} } func (m *ThirdPartyResourceList) Reset() { *m = ThirdPartyResourceList{} } func (*ThirdPartyResourceList) ProtoMessage() {} -func (*ThirdPartyResourceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } +func (*ThirdPartyResourceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } func init() { proto.RegisterType((*APIVersion)(nil), "k8s.io.api.extensions.v1beta1.APIVersion") @@ -385,6 +390,7 @@ func init() { proto.RegisterType((*HTTPIngressRuleValue)(nil), "k8s.io.api.extensions.v1beta1.HTTPIngressRuleValue") proto.RegisterType((*HostPortRange)(nil), "k8s.io.api.extensions.v1beta1.HostPortRange") proto.RegisterType((*IDRange)(nil), "k8s.io.api.extensions.v1beta1.IDRange") + proto.RegisterType((*IPBlock)(nil), "k8s.io.api.extensions.v1beta1.IPBlock") proto.RegisterType((*Ingress)(nil), "k8s.io.api.extensions.v1beta1.Ingress") proto.RegisterType((*IngressBackend)(nil), "k8s.io.api.extensions.v1beta1.IngressBackend") proto.RegisterType((*IngressList)(nil), "k8s.io.api.extensions.v1beta1.IngressList") @@ -1267,6 +1273,43 @@ func (m *IDRange) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *IPBlock) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IPBlock) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CIDR))) + i += copy(dAtA[i:], m.CIDR) + if len(m.Except) > 0 { + for _, s := range m.Except { + dAtA[i] = 0x12 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + func (m *Ingress) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1699,6 +1742,16 @@ func (m *NetworkPolicyPeer) MarshalTo(dAtA []byte) (int, error) { } i += n37 } + if m.IPBlock != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.IPBlock.Size())) + n38, err := m.IPBlock.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n38 + } return i, nil } @@ -1727,11 +1780,11 @@ func (m *NetworkPolicyPort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n38, err := m.Port.MarshalTo(dAtA[i:]) + n39, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n38 + i += n39 } return i, nil } @@ -1754,11 +1807,11 @@ func (m *NetworkPolicySpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodSelector.Size())) - n39, err := m.PodSelector.MarshalTo(dAtA[i:]) + n40, err := m.PodSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n40 if len(m.Ingress) > 0 { for _, msg := range m.Ingress { dAtA[i] = 0x12 @@ -1792,19 +1845,19 @@ func (m *PodSecurityPolicy) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n40, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n41, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n40 + i += n41 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n41, err := m.Spec.MarshalTo(dAtA[i:]) + n42, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n42 return i, nil } @@ -1826,11 +1879,11 @@ func (m *PodSecurityPolicyList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n42, err := m.ListMeta.MarshalTo(dAtA[i:]) + n43, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n42 + i += n43 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -1968,35 +2021,35 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinux.Size())) - n43, err := m.SELinux.MarshalTo(dAtA[i:]) + n44, err := m.SELinux.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n43 + i += n44 dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RunAsUser.Size())) - n44, err := m.RunAsUser.MarshalTo(dAtA[i:]) + n45, err := m.RunAsUser.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n44 + i += n45 dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SupplementalGroups.Size())) - n45, err := m.SupplementalGroups.MarshalTo(dAtA[i:]) + n46, err := m.SupplementalGroups.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n45 + i += n46 dAtA[i] = 0x6a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FSGroup.Size())) - n46, err := m.FSGroup.MarshalTo(dAtA[i:]) + n47, err := m.FSGroup.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n46 + i += n47 dAtA[i] = 0x70 i++ if m.ReadOnlyRootFilesystem { @@ -2046,27 +2099,27 @@ func (m *ReplicaSet) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n47, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n48, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n47 + i += n48 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n48, err := m.Spec.MarshalTo(dAtA[i:]) + n49, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n48 + i += n49 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n49, err := m.Status.MarshalTo(dAtA[i:]) + n50, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n49 + i += n50 return i, nil } @@ -2096,11 +2149,11 @@ func (m *ReplicaSetCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n50, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n51, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n50 + i += n51 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -2130,11 +2183,11 @@ func (m *ReplicaSetList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n51, err := m.ListMeta.MarshalTo(dAtA[i:]) + n52, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n51 + i += n52 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -2174,20 +2227,20 @@ func (m *ReplicaSetSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) - n52, err := m.Selector.MarshalTo(dAtA[i:]) + n53, err := m.Selector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n52 + i += n53 } dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n53, err := m.Template.MarshalTo(dAtA[i:]) + n54, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n53 + i += n54 dAtA[i] = 0x20 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MinReadySeconds)) @@ -2297,11 +2350,11 @@ func (m *RollingUpdateDaemonSet) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MaxUnavailable.Size())) - n54, err := m.MaxUnavailable.MarshalTo(dAtA[i:]) + n55, err := m.MaxUnavailable.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n54 + i += n55 } return i, nil } @@ -2325,21 +2378,21 @@ func (m *RollingUpdateDeployment) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MaxUnavailable.Size())) - n55, err := m.MaxUnavailable.MarshalTo(dAtA[i:]) + n56, err := m.MaxUnavailable.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n55 + i += n56 } if m.MaxSurge != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MaxSurge.Size())) - n56, err := m.MaxSurge.MarshalTo(dAtA[i:]) + n57, err := m.MaxSurge.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n56 + i += n57 } return i, nil } @@ -2401,11 +2454,11 @@ func (m *SELinuxStrategyOptions) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n57, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n58, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n57 + i += n58 } return i, nil } @@ -2428,27 +2481,27 @@ func (m *Scale) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n58, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n59, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n58 + i += n59 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n59, err := m.Spec.MarshalTo(dAtA[i:]) + n60, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n59 + i += n60 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n60, err := m.Status.MarshalTo(dAtA[i:]) + n61, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n60 + i += n61 return i, nil } @@ -2572,11 +2625,11 @@ func (m *ThirdPartyResource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n61, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n62, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n61 + i += n62 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Description))) @@ -2614,11 +2667,11 @@ func (m *ThirdPartyResourceData) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n62, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n63, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n62 + i += n63 if m.Data != nil { dAtA[i] = 0x12 i++ @@ -2646,11 +2699,11 @@ func (m *ThirdPartyResourceDataList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n63, err := m.ListMeta.MarshalTo(dAtA[i:]) + n64, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n63 + i += n64 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -2684,11 +2737,11 @@ func (m *ThirdPartyResourceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n64, err := m.ListMeta.MarshalTo(dAtA[i:]) + n65, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n64 + i += n65 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -3033,6 +3086,20 @@ func (m *IDRange) Size() (n int) { return n } +func (m *IPBlock) Size() (n int) { + var l int + _ = l + l = len(m.CIDR) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Except) > 0 { + for _, s := range m.Except { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *Ingress) Size() (n int) { var l int _ = l @@ -3186,6 +3253,10 @@ func (m *NetworkPolicyPeer) Size() (n int) { l = m.NamespaceSelector.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.IPBlock != nil { + l = m.IPBlock.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -3830,6 +3901,17 @@ func (this *IDRange) String() string { }, "") return s } +func (this *IPBlock) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&IPBlock{`, + `CIDR:` + fmt.Sprintf("%v", this.CIDR) + `,`, + `Except:` + fmt.Sprintf("%v", this.Except) + `,`, + `}`, + }, "") + return s +} func (this *Ingress) String() string { if this == nil { return "nil" @@ -3958,6 +4040,7 @@ func (this *NetworkPolicyPeer) String() string { s := strings.Join([]string{`&NetworkPolicyPeer{`, `PodSelector:` + strings.Replace(fmt.Sprintf("%v", this.PodSelector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, + `IPBlock:` + strings.Replace(fmt.Sprintf("%v", this.IPBlock), "IPBlock", "IPBlock", 1) + `,`, `}`, }, "") return s @@ -7291,6 +7374,114 @@ func (m *IDRange) Unmarshal(dAtA []byte) error { } return nil } +func (m *IPBlock) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IPBlock: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IPBlock: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CIDR", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CIDR = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Except", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Except = append(m.Except, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Ingress) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -8604,6 +8795,39 @@ func (m *NetworkPolicyPeer) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPBlock", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.IPBlock == nil { + m.IPBlock = &IPBlock{} + } + if err := m.IPBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -11959,220 +12183,224 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 3430 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5b, 0x4f, 0x6c, 0x1b, 0xc7, - 0xd5, 0xf7, 0x8a, 0xa2, 0x44, 0x3d, 0x59, 0x92, 0x35, 0x72, 0x64, 0x46, 0x8e, 0x45, 0x67, 0x03, - 0xf8, 0xb3, 0xf3, 0xd9, 0x64, 0xec, 0xc4, 0x89, 0xbf, 0x18, 0x5f, 0xbe, 0x4f, 0x94, 0xfc, 0x47, - 0xa9, 0x24, 0xd3, 0x43, 0x4a, 0x69, 0x8d, 0xb8, 0xcd, 0x8a, 0x1c, 0x51, 0x6b, 0x2d, 0x77, 0x37, - 0xbb, 0xb3, 0x8a, 0x79, 0x29, 0x7a, 0x0a, 0x50, 0xa0, 0x45, 0xdb, 0x43, 0x8a, 0xf4, 0xd6, 0x5c, - 0x7a, 0x6a, 0xd1, 0xdc, 0xda, 0x43, 0x50, 0xa0, 0x40, 0x0b, 0x18, 0x45, 0x5a, 0xe4, 0xd4, 0xe6, - 0x24, 0x34, 0xca, 0xb1, 0xe7, 0x02, 0x85, 0x0f, 0x45, 0x31, 0xb3, 0xb3, 0xff, 0x77, 0x45, 0x52, - 0xb1, 0x85, 0xa2, 0x37, 0x71, 0xde, 0x7b, 0xbf, 0xf7, 0x67, 0x66, 0xde, 0xbc, 0x99, 0xb7, 0x82, - 0x9b, 0x3b, 0xd7, 0xec, 0xb2, 0x6a, 0x54, 0x76, 0x9c, 0x4d, 0x62, 0xe9, 0x84, 0x12, 0xbb, 0xb2, - 0x4b, 0xf4, 0x96, 0x61, 0x55, 0x04, 0x41, 0x31, 0xd5, 0x0a, 0x79, 0x48, 0x89, 0x6e, 0xab, 0x86, - 0x6e, 0x57, 0x76, 0x2f, 0x6f, 0x12, 0xaa, 0x5c, 0xae, 0xb4, 0x89, 0x4e, 0x2c, 0x85, 0x92, 0x56, - 0xd9, 0xb4, 0x0c, 0x6a, 0xa0, 0x33, 0x2e, 0x7b, 0x59, 0x31, 0xd5, 0x72, 0xc0, 0x5e, 0x16, 0xec, - 0x73, 0x97, 0xda, 0x2a, 0xdd, 0x76, 0x36, 0xcb, 0x4d, 0xa3, 0x53, 0x69, 0x1b, 0x6d, 0xa3, 0xc2, - 0xa5, 0x36, 0x9d, 0x2d, 0xfe, 0x8b, 0xff, 0xe0, 0x7f, 0xb9, 0x68, 0x73, 0x72, 0x48, 0x79, 0xd3, - 0xb0, 0x48, 0x65, 0x37, 0xa1, 0x71, 0xee, 0x42, 0x88, 0xc7, 0x34, 0x34, 0xb5, 0xd9, 0xcd, 0x32, - 0x6e, 0xee, 0x95, 0x80, 0xb5, 0xa3, 0x34, 0xb7, 0x55, 0x9d, 0x58, 0xdd, 0x8a, 0xb9, 0xd3, 0xe6, - 0xb2, 0x16, 0xb1, 0x0d, 0xc7, 0x6a, 0x92, 0x81, 0xa4, 0xec, 0x4a, 0x87, 0x50, 0x25, 0xcd, 0xac, - 0x4a, 0x96, 0x94, 0xe5, 0xe8, 0x54, 0xed, 0x24, 0xd5, 0xbc, 0xda, 0x4b, 0xc0, 0x6e, 0x6e, 0x93, - 0x8e, 0x92, 0x90, 0x7b, 0x39, 0x4b, 0xce, 0xa1, 0xaa, 0x56, 0x51, 0x75, 0x6a, 0x53, 0x2b, 0x2e, - 0x24, 0x97, 0x01, 0x16, 0x6a, 0xcb, 0x1b, 0xc4, 0x62, 0xd3, 0x83, 0xce, 0xc2, 0xb0, 0xae, 0x74, - 0x48, 0x51, 0x3a, 0x2b, 0x9d, 0x1f, 0xab, 0x1e, 0x7f, 0xb4, 0x57, 0x3a, 0xb6, 0xbf, 0x57, 0x1a, - 0x5e, 0x53, 0x3a, 0x04, 0x73, 0x8a, 0xfc, 0x13, 0x09, 0x9e, 0x5d, 0x74, 0x6c, 0x6a, 0x74, 0x56, - 0x09, 0xb5, 0xd4, 0xe6, 0xa2, 0x63, 0x59, 0x44, 0xa7, 0x75, 0xaa, 0x50, 0xc7, 0xee, 0x2d, 0x8f, - 0xee, 0x41, 0x7e, 0x57, 0xd1, 0x1c, 0x52, 0x1c, 0x3a, 0x2b, 0x9d, 0x1f, 0xbf, 0x52, 0x2e, 0x07, - 0xcb, 0xc4, 0x37, 0xba, 0x6c, 0xee, 0xb4, 0xf9, 0xba, 0xf1, 0x66, 0xa2, 0x7c, 0xd7, 0x51, 0x74, - 0xaa, 0xd2, 0x6e, 0xf5, 0xa4, 0x80, 0x3c, 0x2e, 0xf4, 0x6e, 0x30, 0x2c, 0xec, 0x42, 0xca, 0xdf, - 0x86, 0x33, 0x99, 0xa6, 0xad, 0xa8, 0x36, 0x45, 0xf7, 0x21, 0xaf, 0x52, 0xd2, 0xb1, 0x8b, 0xd2, - 0xd9, 0xdc, 0xf9, 0xf1, 0x2b, 0xd7, 0xca, 0x07, 0xae, 0xd1, 0x72, 0x26, 0x58, 0x75, 0x42, 0x98, - 0x91, 0x5f, 0x66, 0x70, 0xd8, 0x45, 0x95, 0x7f, 0x24, 0x01, 0x0a, 0xcb, 0x34, 0x14, 0xab, 0x4d, - 0x68, 0x1f, 0x41, 0xf9, 0xc6, 0x57, 0x0b, 0xca, 0x8c, 0x80, 0x1c, 0x77, 0x15, 0x46, 0x62, 0x62, - 0xc2, 0x6c, 0xd2, 0x24, 0x1e, 0x8c, 0x8d, 0x68, 0x30, 0x2e, 0x0f, 0x10, 0x0c, 0x17, 0x25, 0x23, - 0x0a, 0x1f, 0x0c, 0xc1, 0xd8, 0x92, 0x42, 0x3a, 0x86, 0x5e, 0x27, 0x14, 0xbd, 0x03, 0x05, 0xb6, - 0x31, 0x5a, 0x0a, 0x55, 0x78, 0x00, 0xc6, 0xaf, 0xbc, 0x74, 0x90, 0x77, 0x76, 0x99, 0x71, 0x97, - 0x77, 0x2f, 0x97, 0xef, 0x6c, 0x3e, 0x20, 0x4d, 0xba, 0x4a, 0xa8, 0x52, 0x45, 0x42, 0x0f, 0x04, - 0x63, 0xd8, 0x47, 0x45, 0x6b, 0x30, 0x6c, 0x9b, 0xa4, 0x29, 0x62, 0x77, 0xb1, 0x87, 0x1b, 0xbe, - 0x65, 0x75, 0x93, 0x34, 0x83, 0xc9, 0x60, 0xbf, 0x30, 0xc7, 0x41, 0x1b, 0x30, 0x62, 0xf3, 0x59, - 0x2e, 0xe6, 0x12, 0xb3, 0x71, 0x30, 0xa2, 0xbb, 0x36, 0x26, 0x05, 0xe6, 0x88, 0xfb, 0x1b, 0x0b, - 0x34, 0xf9, 0x13, 0x09, 0x26, 0x7c, 0x5e, 0x3e, 0x03, 0x6f, 0x27, 0x62, 0x53, 0xee, 0x2f, 0x36, - 0x4c, 0x9a, 0x47, 0xe6, 0x84, 0xd0, 0x55, 0xf0, 0x46, 0x42, 0x71, 0x59, 0xf5, 0xe6, 0x77, 0x88, - 0xcf, 0xef, 0xf9, 0x7e, 0xdd, 0xc8, 0x98, 0xd6, 0x1f, 0x0f, 0x87, 0xcc, 0x67, 0xe1, 0x42, 0xf7, - 0xa1, 0x60, 0x13, 0x8d, 0x34, 0xa9, 0x61, 0x09, 0xf3, 0x5f, 0xee, 0xd3, 0x7c, 0x65, 0x93, 0x68, - 0x75, 0x21, 0x5a, 0x3d, 0xce, 0xec, 0xf7, 0x7e, 0x61, 0x1f, 0x12, 0xdd, 0x85, 0x02, 0x25, 0x1d, - 0x53, 0x53, 0xa8, 0xb7, 0x2f, 0x5e, 0x08, 0xbb, 0xc0, 0x4e, 0x01, 0x06, 0x56, 0x33, 0x5a, 0x0d, - 0xc1, 0xc6, 0xa7, 0xd4, 0x0f, 0x89, 0x37, 0x8a, 0x7d, 0x18, 0xb4, 0x0b, 0x93, 0x8e, 0xd9, 0x62, - 0x9c, 0x94, 0xe5, 0xc0, 0x76, 0x57, 0x4c, 0xf1, 0xab, 0xfd, 0xc6, 0x66, 0x3d, 0x22, 0x5d, 0x9d, - 0x15, 0xba, 0x26, 0xa3, 0xe3, 0x38, 0xa6, 0x05, 0x2d, 0xc0, 0x54, 0x47, 0xd5, 0x31, 0x51, 0x5a, - 0xdd, 0x3a, 0x69, 0x1a, 0x7a, 0xcb, 0x2e, 0x0e, 0x9f, 0x95, 0xce, 0xe7, 0xab, 0xa7, 0x04, 0xc0, - 0xd4, 0x6a, 0x94, 0x8c, 0xe3, 0xfc, 0xe8, 0x4d, 0x40, 0x9e, 0x1b, 0xb7, 0xdc, 0x14, 0xae, 0x1a, - 0x7a, 0x31, 0x7f, 0x56, 0x3a, 0x9f, 0xab, 0xce, 0x09, 0x14, 0xd4, 0x48, 0x70, 0xe0, 0x14, 0x29, - 0xb4, 0x02, 0x27, 0x2d, 0xb2, 0xab, 0x32, 0x1f, 0x6f, 0xab, 0x36, 0x35, 0xac, 0xee, 0x8a, 0xda, - 0x51, 0x69, 0x71, 0x84, 0xdb, 0x54, 0xdc, 0xdf, 0x2b, 0x9d, 0xc4, 0x29, 0x74, 0x9c, 0x2a, 0x25, - 0x7f, 0x9c, 0x87, 0xa9, 0xd8, 0x1e, 0x40, 0x1b, 0x30, 0xdb, 0x74, 0x13, 0xe6, 0x9a, 0xd3, 0xd9, - 0x24, 0x56, 0xbd, 0xb9, 0x4d, 0x5a, 0x8e, 0x46, 0x5a, 0x7c, 0xa1, 0xe4, 0xab, 0xf3, 0xc2, 0xe2, - 0xd9, 0xc5, 0x54, 0x2e, 0x9c, 0x21, 0xcd, 0xa2, 0xa0, 0xf3, 0xa1, 0x55, 0xd5, 0xb6, 0x7d, 0xcc, - 0x21, 0x8e, 0xe9, 0x47, 0x61, 0x2d, 0xc1, 0x81, 0x53, 0xa4, 0x98, 0x8d, 0x2d, 0x62, 0xab, 0x16, - 0x69, 0xc5, 0x6d, 0xcc, 0x45, 0x6d, 0x5c, 0x4a, 0xe5, 0xc2, 0x19, 0xd2, 0xe8, 0x2a, 0x8c, 0xbb, - 0xda, 0xf8, 0xfc, 0x89, 0x89, 0xf6, 0x53, 0xf4, 0x5a, 0x40, 0xc2, 0x61, 0x3e, 0xe6, 0x9a, 0xb1, - 0x69, 0x13, 0x6b, 0x97, 0xb4, 0xb2, 0x27, 0xf8, 0x4e, 0x82, 0x03, 0xa7, 0x48, 0x31, 0xd7, 0xdc, - 0x15, 0x98, 0x70, 0x6d, 0x24, 0xea, 0xda, 0x7a, 0x2a, 0x17, 0xce, 0x90, 0x66, 0xeb, 0xd8, 0x35, - 0x79, 0x61, 0x57, 0x51, 0x35, 0x65, 0x53, 0x23, 0xc5, 0xd1, 0xe8, 0x3a, 0x5e, 0x8b, 0x92, 0x71, - 0x9c, 0x1f, 0xdd, 0x82, 0x69, 0x77, 0x68, 0x5d, 0x57, 0x7c, 0x90, 0x02, 0x07, 0x79, 0x56, 0x80, - 0x4c, 0xaf, 0xc5, 0x19, 0x70, 0x52, 0x06, 0xbd, 0x0e, 0x93, 0x4d, 0x43, 0xd3, 0xf8, 0x7a, 0x5c, - 0x34, 0x1c, 0x9d, 0x16, 0xc7, 0x38, 0x0a, 0x62, 0xfb, 0x71, 0x31, 0x42, 0xc1, 0x31, 0x4e, 0xf9, - 0x0f, 0x12, 0x9c, 0xca, 0xd8, 0xd3, 0xe8, 0xff, 0x60, 0x98, 0x76, 0x4d, 0xef, 0xb4, 0xfe, 0x6f, - 0xef, 0x80, 0x68, 0x74, 0x4d, 0xf2, 0x78, 0xaf, 0x74, 0x3a, 0x43, 0x8c, 0x91, 0x31, 0x17, 0x44, - 0x3a, 0x4c, 0x58, 0x4c, 0x9d, 0xde, 0x76, 0x59, 0x44, 0xf2, 0xba, 0xda, 0x23, 0xc7, 0xe0, 0xb0, - 0x4c, 0x90, 0x8c, 0xa7, 0xf7, 0xf7, 0x4a, 0x13, 0x11, 0x1a, 0x8e, 0xc2, 0xcb, 0x1f, 0x0e, 0x01, - 0x2c, 0x11, 0x53, 0x33, 0xba, 0x1d, 0xa2, 0x1f, 0xc5, 0x81, 0x7b, 0x27, 0x72, 0xe0, 0x5e, 0xea, - 0x95, 0x3b, 0x7d, 0xd3, 0x32, 0x4f, 0xdc, 0xb7, 0x62, 0x27, 0x6e, 0xa5, 0x7f, 0xc8, 0x83, 0x8f, - 0xdc, 0xbf, 0xe4, 0x60, 0x26, 0x60, 0x5e, 0x34, 0xf4, 0x96, 0xca, 0xf7, 0xc7, 0xf5, 0xc8, 0x1c, - 0xff, 0x57, 0x6c, 0x8e, 0x4f, 0xa5, 0x88, 0x84, 0xe6, 0x77, 0xc5, 0xb7, 0x76, 0x88, 0x8b, 0xbf, - 0x12, 0x55, 0xfe, 0x78, 0xaf, 0x94, 0x72, 0x59, 0x29, 0xfb, 0x48, 0x51, 0x13, 0xd1, 0x39, 0x18, - 0xb1, 0x88, 0x62, 0x1b, 0x3a, 0x4f, 0x14, 0x63, 0x81, 0x2b, 0x98, 0x8f, 0x62, 0x41, 0x45, 0x17, - 0x60, 0xb4, 0x43, 0x6c, 0x5b, 0x69, 0x13, 0x9e, 0x13, 0xc6, 0xaa, 0x53, 0x82, 0x71, 0x74, 0xd5, - 0x1d, 0xc6, 0x1e, 0x1d, 0x3d, 0x80, 0x49, 0x4d, 0xb1, 0xc5, 0x02, 0x6d, 0xa8, 0x1d, 0xc2, 0x77, - 0xfd, 0xf8, 0x95, 0x17, 0xfb, 0x5b, 0x07, 0x4c, 0x22, 0x38, 0xd9, 0x56, 0x22, 0x48, 0x38, 0x86, - 0x8c, 0x76, 0x01, 0xb1, 0x91, 0x86, 0xa5, 0xe8, 0xb6, 0x1b, 0x28, 0xa6, 0x6f, 0x74, 0x60, 0x7d, - 0x7e, 0x86, 0x5b, 0x49, 0xa0, 0xe1, 0x14, 0x0d, 0xf2, 0x6f, 0x24, 0x98, 0x0c, 0xa6, 0xe9, 0x08, - 0xaa, 0xa9, 0xb5, 0x68, 0x35, 0x75, 0xa1, 0xef, 0x25, 0x9a, 0x51, 0x4e, 0xfd, 0x63, 0x08, 0x50, - 0xc0, 0xc4, 0x36, 0xf8, 0xa6, 0xd2, 0xdc, 0xe9, 0xe3, 0xae, 0xf0, 0x81, 0x04, 0x48, 0xa4, 0xe7, - 0x05, 0x5d, 0x37, 0x28, 0xcf, 0xf8, 0x9e, 0x59, 0xcb, 0x7d, 0x9b, 0xe5, 0x69, 0x2c, 0xaf, 0x27, - 0xb0, 0x6e, 0xe8, 0xd4, 0xea, 0x06, 0x33, 0x92, 0x64, 0xc0, 0x29, 0x06, 0x20, 0x05, 0xc0, 0x12, - 0x98, 0x0d, 0x43, 0x6c, 0xe4, 0x4b, 0x7d, 0xe4, 0x3c, 0x26, 0xb0, 0x68, 0xe8, 0x5b, 0x6a, 0x3b, - 0x48, 0x3b, 0xd8, 0x07, 0xc2, 0x21, 0xd0, 0xb9, 0x1b, 0x70, 0x2a, 0xc3, 0x5a, 0x74, 0x02, 0x72, - 0x3b, 0xa4, 0xeb, 0x86, 0x0d, 0xb3, 0x3f, 0xd1, 0xc9, 0xf0, 0x9d, 0x6a, 0x4c, 0x5c, 0x87, 0x5e, - 0x1f, 0xba, 0x26, 0xc9, 0x9f, 0xe4, 0xc3, 0x6b, 0x87, 0x97, 0xb2, 0xe7, 0xa1, 0x60, 0x11, 0x53, - 0x53, 0x9b, 0x8a, 0x2d, 0x2a, 0x14, 0x5e, 0x95, 0x62, 0x31, 0x86, 0x7d, 0x6a, 0xa4, 0xe8, 0x1d, - 0x7a, 0xba, 0x45, 0x6f, 0xee, 0xc9, 0x14, 0xbd, 0xdf, 0x82, 0x82, 0xed, 0x95, 0xbb, 0xc3, 0x1c, - 0xf2, 0xf2, 0x00, 0xf9, 0x55, 0x54, 0xba, 0xbe, 0x02, 0xbf, 0xc6, 0xf5, 0x41, 0xd3, 0xaa, 0xdb, - 0xfc, 0x80, 0xd5, 0xed, 0x13, 0xad, 0x48, 0x59, 0x4e, 0x35, 0x15, 0xc7, 0x26, 0x2d, 0x9e, 0x88, - 0x0a, 0x41, 0x4e, 0xad, 0xf1, 0x51, 0x2c, 0xa8, 0xe8, 0x7e, 0x64, 0xc9, 0x16, 0x0e, 0xb3, 0x64, - 0x27, 0xb3, 0x97, 0x2b, 0x5a, 0x87, 0x53, 0xa6, 0x65, 0xb4, 0x2d, 0x62, 0xdb, 0x4b, 0x44, 0x69, - 0x69, 0xaa, 0x4e, 0xbc, 0xf8, 0xb8, 0xa5, 0xca, 0xe9, 0xfd, 0xbd, 0xd2, 0xa9, 0x5a, 0x3a, 0x0b, - 0xce, 0x92, 0x95, 0x1f, 0x0d, 0xc3, 0x89, 0xf8, 0x09, 0x98, 0x51, 0x3d, 0x4a, 0x87, 0xaa, 0x1e, - 0x2f, 0x86, 0x36, 0x83, 0x5b, 0x5a, 0xfb, 0xb3, 0x9f, 0xb2, 0x21, 0x16, 0x60, 0x4a, 0x64, 0x03, - 0x8f, 0x28, 0xea, 0x67, 0x7f, 0xf6, 0xd7, 0xa3, 0x64, 0x1c, 0xe7, 0x67, 0x35, 0x61, 0x50, 0xea, - 0x79, 0x20, 0xc3, 0xd1, 0x9a, 0x70, 0x21, 0xce, 0x80, 0x93, 0x32, 0x68, 0x15, 0x66, 0x1c, 0x3d, - 0x09, 0xe5, 0xae, 0xc6, 0xd3, 0x02, 0x6a, 0x66, 0x3d, 0xc9, 0x82, 0xd3, 0xe4, 0xd0, 0x16, 0x40, - 0xd3, 0x3b, 0xb6, 0xed, 0xe2, 0x08, 0xcf, 0xb0, 0x57, 0xfa, 0xde, 0x3b, 0xfe, 0x89, 0x1f, 0xe4, - 0x35, 0x7f, 0xc8, 0xc6, 0x21, 0x64, 0x74, 0x1d, 0x26, 0x2c, 0x7e, 0x21, 0xf0, 0x0c, 0x76, 0x8b, - 0xea, 0x67, 0x84, 0xd8, 0x04, 0x0e, 0x13, 0x71, 0x94, 0x37, 0xa5, 0x0e, 0x2e, 0xf4, 0x5d, 0x07, - 0xff, 0x56, 0x0a, 0x1f, 0x42, 0x7e, 0x09, 0xfc, 0x7a, 0xa4, 0x3c, 0x3a, 0x17, 0x2b, 0x8f, 0x66, - 0x93, 0x12, 0xa1, 0xea, 0xc8, 0x48, 0xaf, 0x7e, 0x5f, 0x1d, 0xa8, 0xfa, 0x0d, 0x0e, 0xcf, 0xde, - 0xe5, 0xef, 0x47, 0x12, 0xcc, 0xde, 0xac, 0xdf, 0xb2, 0x0c, 0xc7, 0xf4, 0xcc, 0xb9, 0x63, 0xba, - 0x71, 0x7d, 0x0d, 0x86, 0x2d, 0x47, 0xf3, 0xfc, 0x78, 0xc1, 0xf3, 0x03, 0x3b, 0x1a, 0xf3, 0x63, - 0x26, 0x26, 0xe5, 0x3a, 0xc1, 0x04, 0xd0, 0x1a, 0x8c, 0x58, 0x8a, 0xde, 0x26, 0xde, 0xb1, 0x7a, - 0xae, 0x87, 0xf5, 0xcb, 0x4b, 0x98, 0xb1, 0x87, 0x8a, 0x37, 0x2e, 0x8d, 0x05, 0x8a, 0xfc, 0x7d, - 0x09, 0xa6, 0x6e, 0x37, 0x1a, 0xb5, 0x65, 0x9d, 0xef, 0xe8, 0x9a, 0x42, 0xb7, 0xd9, 0x49, 0x6f, - 0x2a, 0x74, 0x3b, 0x7e, 0xd2, 0x33, 0x1a, 0xe6, 0x14, 0xf4, 0x75, 0x18, 0x65, 0x99, 0x84, 0xe8, - 0xad, 0x3e, 0x4b, 0x6d, 0x01, 0x5f, 0x75, 0x85, 0x82, 0x0a, 0x51, 0x0c, 0x60, 0x0f, 0x4e, 0xde, - 0x81, 0x93, 0x21, 0x73, 0x58, 0x3c, 0xf8, 0x9b, 0x21, 0xaa, 0x43, 0x9e, 0x69, 0xf6, 0x9e, 0x04, - 0x7b, 0xbd, 0x7c, 0xc5, 0x5c, 0x0a, 0x2a, 0x1d, 0xf6, 0xcb, 0xc6, 0x2e, 0x96, 0xbc, 0x0a, 0x13, - 0xb7, 0x0d, 0x9b, 0xd6, 0x0c, 0x8b, 0xf2, 0xb0, 0xa0, 0x33, 0x90, 0xeb, 0xa8, 0xba, 0x38, 0x67, - 0xc7, 0x85, 0x4c, 0x8e, 0x9d, 0x11, 0x6c, 0x9c, 0x93, 0x95, 0x87, 0x22, 0xf3, 0x04, 0x64, 0xe5, - 0x21, 0x66, 0xe3, 0xf2, 0x2d, 0x18, 0x15, 0xe1, 0x0e, 0x03, 0xe5, 0x0e, 0x06, 0xca, 0xa5, 0x00, - 0xfd, 0x60, 0x08, 0x46, 0x85, 0xf5, 0x47, 0x70, 0x69, 0x5a, 0x89, 0x5c, 0x9a, 0x5e, 0xec, 0x6f, - 0x26, 0x33, 0x6f, 0x4c, 0x8d, 0xd8, 0x8d, 0xe9, 0x62, 0x9f, 0x78, 0x07, 0x5f, 0x97, 0x3e, 0x96, - 0x60, 0x32, 0xba, 0x86, 0xd0, 0x55, 0x18, 0x67, 0xe7, 0x83, 0xda, 0x24, 0x6b, 0x41, 0x59, 0xea, - 0x3f, 0x66, 0xd4, 0x03, 0x12, 0x0e, 0xf3, 0xa1, 0xb6, 0x2f, 0xc6, 0xa6, 0x5d, 0x38, 0x9d, 0x1d, - 0x52, 0x87, 0xaa, 0x5a, 0xd9, 0x6d, 0x50, 0x94, 0x97, 0x75, 0x7a, 0xc7, 0xaa, 0x53, 0x4b, 0xd5, - 0xdb, 0x09, 0x45, 0x7c, 0x0d, 0x85, 0x91, 0xe5, 0x5f, 0x4b, 0x30, 0x2e, 0x4c, 0x3e, 0x82, 0x4b, - 0xc0, 0xd7, 0xa2, 0x97, 0x80, 0x73, 0x7d, 0xee, 0xc7, 0xf4, 0x1b, 0xc0, 0xcf, 0x02, 0xd3, 0xd9, - 0x0e, 0x64, 0x09, 0x61, 0xdb, 0xb0, 0x69, 0x3c, 0x21, 0xb0, 0xbd, 0x83, 0x39, 0x05, 0x39, 0x70, - 0x42, 0x8d, 0x6d, 0x59, 0x11, 0xda, 0x4a, 0x7f, 0x96, 0xf8, 0x62, 0xd5, 0xa2, 0x80, 0x3f, 0x11, - 0xa7, 0xe0, 0x84, 0x0a, 0x99, 0x40, 0x82, 0x0b, 0xdd, 0x85, 0xe1, 0x6d, 0x4a, 0xcd, 0x94, 0x77, - 0xdf, 0x1e, 0x89, 0x22, 0x30, 0xa1, 0xc0, 0xbd, 0x6b, 0x34, 0x6a, 0x98, 0x43, 0xc9, 0xff, 0x0c, - 0xe2, 0x51, 0x77, 0xd7, 0xb8, 0x9f, 0xfe, 0xa4, 0xc3, 0xa4, 0xbf, 0xf1, 0xb4, 0xd4, 0x87, 0x6e, - 0x43, 0x8e, 0x6a, 0xfd, 0xde, 0xe2, 0x04, 0x62, 0x63, 0xa5, 0x1e, 0xe4, 0x8f, 0xc6, 0x4a, 0x1d, - 0x33, 0x08, 0x74, 0x07, 0xf2, 0xec, 0xb0, 0x60, 0x5b, 0x30, 0xd7, 0xff, 0x96, 0x66, 0xfe, 0x07, - 0x0b, 0x82, 0xfd, 0xb2, 0xb1, 0x8b, 0x23, 0xbf, 0x0b, 0x13, 0x91, 0x7d, 0x8a, 0xde, 0x81, 0xe3, - 0x9a, 0xa1, 0xb4, 0xaa, 0x8a, 0xa6, 0xe8, 0x4d, 0xe2, 0x3d, 0xb2, 0x9f, 0x4b, 0xbb, 0x10, 0xac, - 0x84, 0xf8, 0xc4, 0x2e, 0xf7, 0x5b, 0x65, 0x61, 0x1a, 0x8e, 0x20, 0xca, 0x0a, 0x40, 0xe0, 0x23, - 0x2a, 0x41, 0x9e, 0xad, 0x33, 0x37, 0xfd, 0x8f, 0x55, 0xc7, 0x98, 0x85, 0x6c, 0xf9, 0xd9, 0xd8, - 0x1d, 0x47, 0x57, 0x00, 0x6c, 0xd2, 0xb4, 0x08, 0xe5, 0xc9, 0xc0, 0x7d, 0xfe, 0xf0, 0xd3, 0x5e, - 0xdd, 0xa7, 0xe0, 0x10, 0x97, 0xfc, 0x7b, 0x09, 0x26, 0xd6, 0x08, 0x7d, 0xcf, 0xb0, 0x76, 0x6a, - 0xbc, 0x29, 0x7b, 0x04, 0xc9, 0x16, 0x47, 0x92, 0xed, 0x4b, 0x3d, 0x66, 0x26, 0x62, 0x5d, 0x56, - 0xca, 0x65, 0x7e, 0x14, 0x23, 0x9c, 0xe1, 0xbd, 0xbb, 0x0e, 0x79, 0xd3, 0xb0, 0xa8, 0x77, 0x70, - 0x0e, 0xa4, 0x91, 0xe5, 0xb1, 0xd0, 0xd1, 0xc9, 0x60, 0xb0, 0x8b, 0xc6, 0xfc, 0xd8, 0xb2, 0x8c, - 0x8e, 0x58, 0xad, 0x83, 0xa1, 0x12, 0x62, 0x05, 0x7e, 0xdc, 0xb4, 0x8c, 0x0e, 0xe6, 0x58, 0xf2, - 0xef, 0x24, 0x98, 0x8e, 0x70, 0x1e, 0x41, 0xde, 0xbc, 0x1b, 0xcd, 0x9b, 0x17, 0x07, 0x71, 0x24, - 0x23, 0x7b, 0xfe, 0x3d, 0xee, 0x06, 0x73, 0x18, 0x6d, 0xc1, 0xb8, 0x69, 0xb4, 0xea, 0x4f, 0xa0, - 0x2b, 0x35, 0xc5, 0x8e, 0x9d, 0x5a, 0x80, 0x85, 0xc3, 0xc0, 0xe8, 0x21, 0x4c, 0xeb, 0x4a, 0x87, - 0xd8, 0xa6, 0xd2, 0x24, 0xf5, 0x27, 0xf0, 0x1c, 0xf0, 0x0c, 0x7f, 0xf6, 0x8e, 0x23, 0xe2, 0xa4, - 0x12, 0xf9, 0xe7, 0x09, 0xbf, 0x0d, 0x8b, 0xa2, 0x5b, 0x50, 0xe0, 0xed, 0xfc, 0xa6, 0xa1, 0x79, - 0x0f, 0xd7, 0x6c, 0x2a, 0x6a, 0x62, 0xec, 0xf1, 0x5e, 0xe9, 0x74, 0xca, 0x9b, 0xa4, 0x47, 0xc6, - 0xbe, 0x30, 0x5a, 0x83, 0x61, 0xf3, 0xab, 0x9c, 0xd8, 0x3c, 0xa9, 0xf3, 0x63, 0x9a, 0xe3, 0xc8, - 0x5f, 0xc6, 0xcd, 0xe5, 0xa9, 0xfd, 0xc1, 0x13, 0x9b, 0x26, 0xbf, 0x42, 0xc8, 0x9c, 0xaa, 0x4d, - 0x18, 0x15, 0x27, 0x9a, 0x58, 0x7d, 0xaf, 0x0d, 0xb2, 0xfa, 0xc2, 0x59, 0xdb, 0xaf, 0xa7, 0xbd, - 0x41, 0x0f, 0x58, 0xfe, 0xa3, 0x04, 0xd3, 0xdc, 0x80, 0xa6, 0x63, 0xa9, 0xb4, 0x7b, 0x64, 0x79, - 0x6e, 0x23, 0x92, 0xe7, 0x5e, 0xe9, 0xe1, 0x58, 0xc2, 0xc2, 0xcc, 0x5c, 0xf7, 0xa9, 0x04, 0xcf, - 0x24, 0xb8, 0x8f, 0x20, 0x4f, 0xac, 0x47, 0xf3, 0xc4, 0x4b, 0x83, 0x3a, 0x94, 0x55, 0x69, 0x8d, - 0xa7, 0xb8, 0xc3, 0x17, 0xe2, 0x15, 0x00, 0xd3, 0x52, 0x77, 0x55, 0x8d, 0xb4, 0x45, 0x6f, 0xb2, - 0x10, 0x84, 0xbc, 0xe6, 0x53, 0x70, 0x88, 0x0b, 0xd9, 0x30, 0xdb, 0x22, 0x5b, 0x8a, 0xa3, 0xd1, - 0x85, 0x56, 0x6b, 0x51, 0x31, 0x95, 0x4d, 0x55, 0x53, 0xa9, 0x2a, 0x2e, 0x8b, 0x63, 0xd5, 0xeb, - 0x6e, 0xcf, 0x30, 0x8d, 0xe3, 0xf1, 0x5e, 0xe9, 0x4c, 0x5a, 0x6f, 0xc0, 0x63, 0xe9, 0xe2, 0x0c, - 0x68, 0xd4, 0x85, 0xa2, 0x45, 0xde, 0x75, 0x54, 0x8b, 0xb4, 0x96, 0x2c, 0xc3, 0x8c, 0xa8, 0xcd, - 0x71, 0xb5, 0xff, 0xbb, 0xbf, 0x57, 0x2a, 0xe2, 0x0c, 0x9e, 0xde, 0x8a, 0x33, 0xe1, 0xd1, 0x03, - 0x98, 0x51, 0x34, 0xcd, 0x78, 0x8f, 0x44, 0x9d, 0x1d, 0xe6, 0x5a, 0xaf, 0xed, 0xef, 0x95, 0x66, - 0x16, 0x92, 0xe4, 0xde, 0x0a, 0xd3, 0x40, 0x51, 0x05, 0x46, 0x77, 0x0d, 0xcd, 0xe9, 0x10, 0xbb, - 0x98, 0xe7, 0xf8, 0x2c, 0x31, 0x8e, 0x6e, 0xb8, 0x43, 0x8f, 0xf7, 0x4a, 0x23, 0x37, 0xeb, 0xfc, - 0x9a, 0xee, 0x71, 0xb1, 0xfb, 0x09, 0x2b, 0x4d, 0xc4, 0x9e, 0xe5, 0xef, 0x85, 0x85, 0x20, 0x29, - 0xdc, 0x0e, 0x48, 0x38, 0xcc, 0x87, 0xee, 0xc3, 0xd8, 0xb6, 0xb8, 0x93, 0xda, 0xc5, 0xd1, 0xbe, - 0x0e, 0xa5, 0xc8, 0x1d, 0xb6, 0x3a, 0x2d, 0x54, 0x8c, 0x79, 0xc3, 0x36, 0x0e, 0x10, 0xd1, 0x05, - 0x18, 0xe5, 0x3f, 0x96, 0x97, 0xf8, 0x63, 0x4c, 0x21, 0x48, 0x1d, 0xb7, 0xdd, 0x61, 0xec, 0xd1, - 0x3d, 0xd6, 0xe5, 0xda, 0x22, 0x7f, 0x14, 0x8c, 0xb1, 0x2e, 0xd7, 0x16, 0xb1, 0x47, 0x47, 0xef, - 0xc0, 0xa8, 0x4d, 0x56, 0x54, 0xdd, 0x79, 0x58, 0x84, 0xbe, 0x5a, 0x8a, 0xf5, 0x1b, 0x9c, 0x3b, - 0xf6, 0x2c, 0x12, 0x68, 0x10, 0x74, 0xec, 0xc1, 0xa2, 0x6d, 0x18, 0xb3, 0x1c, 0x7d, 0xc1, 0x5e, - 0xb7, 0x89, 0x55, 0x1c, 0xe7, 0x3a, 0x7a, 0x65, 0x4b, 0xec, 0xf1, 0xc7, 0xb5, 0xf8, 0x11, 0xf2, - 0x39, 0x70, 0x00, 0x8e, 0xbe, 0x27, 0x01, 0xb2, 0x1d, 0xd3, 0xd4, 0x48, 0x87, 0xe8, 0x54, 0xd1, - 0xf8, 0x4b, 0x8c, 0x5d, 0x3c, 0xce, 0x75, 0xfe, 0x7f, 0x2f, 0xbf, 0x12, 0x82, 0x71, 0xe5, 0xfe, - 0x93, 0x67, 0x92, 0x15, 0xa7, 0xe8, 0x65, 0xa1, 0xdd, 0xb2, 0xf9, 0xdf, 0xc5, 0x89, 0xbe, 0x42, - 0x9b, 0xfe, 0xe2, 0x14, 0x84, 0x56, 0xd0, 0xb1, 0x07, 0x8b, 0x36, 0x60, 0xd6, 0x22, 0x4a, 0xeb, - 0x8e, 0xae, 0x75, 0xb1, 0x61, 0xd0, 0x9b, 0xaa, 0x46, 0xec, 0xae, 0x4d, 0x49, 0xa7, 0x38, 0xc9, - 0xa7, 0xdd, 0x6f, 0xc9, 0xe3, 0x54, 0x2e, 0x9c, 0x21, 0x8d, 0x3a, 0x50, 0xf2, 0x52, 0x06, 0xdb, - 0x4f, 0x7e, 0xce, 0xba, 0x61, 0x37, 0x15, 0xcd, 0x7d, 0x05, 0x9e, 0xe2, 0x0a, 0x5e, 0xd8, 0xdf, - 0x2b, 0x95, 0x96, 0x0e, 0x66, 0xc5, 0xbd, 0xb0, 0xd0, 0xdb, 0x50, 0x54, 0xb2, 0xf4, 0x9c, 0xe0, - 0x7a, 0xce, 0x0a, 0x47, 0x8a, 0x99, 0x4a, 0x32, 0x11, 0x78, 0x2b, 0x5b, 0x3c, 0x6c, 0x1e, 0xcd, - 0xb7, 0x63, 0x83, 0xb5, 0xb2, 0x03, 0xd3, 0x9e, 0x58, 0x2b, 0x3b, 0x04, 0x79, 0xf0, 0xdb, 0xcc, - 0xdf, 0x86, 0x60, 0x26, 0x60, 0xee, 0xbb, 0x95, 0x9d, 0x22, 0xf2, 0xd4, 0x5a, 0xd9, 0xe9, 0xbd, - 0xe0, 0xdc, 0xd3, 0xee, 0x05, 0x3f, 0x85, 0x16, 0x3a, 0x6f, 0x2f, 0x07, 0xa1, 0xfb, 0xf7, 0x6b, - 0x2f, 0x07, 0xb6, 0x65, 0x94, 0x3c, 0xbf, 0x1c, 0x0a, 0x3b, 0xf0, 0x1f, 0xdf, 0xe3, 0xfc, 0xea, - 0x1f, 0xd8, 0xc9, 0x9f, 0xe6, 0xe0, 0x44, 0x7c, 0x37, 0x46, 0x5a, 0x61, 0x52, 0xcf, 0x56, 0x58, - 0x0d, 0x4e, 0x6e, 0x39, 0x9a, 0xd6, 0xe5, 0x61, 0x08, 0xf5, 0xc3, 0xdc, 0xa7, 0xec, 0xe7, 0x84, - 0xe4, 0xc9, 0x9b, 0x29, 0x3c, 0x38, 0x55, 0x32, 0xa3, 0xad, 0x97, 0x3b, 0x54, 0x5b, 0x2f, 0xd1, - 0x65, 0x1a, 0x1e, 0xa0, 0xcb, 0x94, 0xda, 0xa2, 0xcb, 0x1f, 0xa2, 0x45, 0x77, 0x98, 0x9e, 0x5a, - 0x4a, 0x12, 0xeb, 0xd5, 0x53, 0x93, 0x9f, 0x83, 0x39, 0x21, 0x46, 0x79, 0xbb, 0x4b, 0xa7, 0x96, - 0xa1, 0x69, 0xc4, 0x5a, 0x72, 0x3a, 0x9d, 0xae, 0xfc, 0x06, 0x4c, 0x46, 0x1b, 0xb9, 0xee, 0x4c, - 0xbb, 0xbd, 0x64, 0xd1, 0x50, 0x08, 0xcd, 0xb4, 0x3b, 0x8e, 0x7d, 0x0e, 0xf9, 0x7d, 0x09, 0x66, - 0xd3, 0x3f, 0xd8, 0x42, 0x1a, 0x4c, 0x76, 0x94, 0x87, 0xe1, 0xaf, 0xdb, 0xa4, 0x43, 0xde, 0xa5, - 0x79, 0x07, 0x6f, 0x35, 0x82, 0x85, 0x63, 0xd8, 0xec, 0x7e, 0x7d, 0x2a, 0xa3, 0x77, 0x76, 0xb4, - 0x96, 0xa0, 0x7b, 0x50, 0xe8, 0x28, 0x0f, 0xeb, 0x8e, 0xd5, 0x26, 0x87, 0x7e, 0x3d, 0xe0, 0x19, - 0x63, 0x55, 0xa0, 0x60, 0x1f, 0x4f, 0xfe, 0x48, 0x82, 0x62, 0x56, 0xa1, 0x89, 0xae, 0x46, 0xba, - 0x7c, 0xcf, 0xc7, 0xba, 0x7c, 0xd3, 0x09, 0xb9, 0xa7, 0xd4, 0xe3, 0xfb, 0x85, 0x04, 0xb3, 0xe9, - 0x05, 0x37, 0x7a, 0x39, 0x62, 0x61, 0x29, 0x66, 0xe1, 0x54, 0x4c, 0x4a, 0xd8, 0xf7, 0x4d, 0x98, - 0x14, 0x65, 0xb9, 0x80, 0x11, 0x51, 0x95, 0xd3, 0x72, 0xa5, 0x80, 0xf0, 0xca, 0x50, 0x3e, 0x5f, - 0xd1, 0x31, 0x1c, 0x43, 0x93, 0xbf, 0x3b, 0x04, 0xf9, 0x7a, 0x53, 0xd1, 0xc8, 0x11, 0x94, 0x59, - 0x6f, 0x46, 0xca, 0xac, 0x5e, 0x5f, 0xa2, 0x73, 0xab, 0x32, 0x2b, 0x2c, 0x1c, 0xab, 0xb0, 0x5e, - 0xec, 0x0b, 0xed, 0xe0, 0xe2, 0xea, 0x7f, 0x60, 0xcc, 0x57, 0x3a, 0x58, 0xce, 0x97, 0x7f, 0x3a, - 0x04, 0xe3, 0x21, 0x15, 0x03, 0x9e, 0x18, 0x5b, 0x91, 0x93, 0xb6, 0x9f, 0xff, 0x49, 0x09, 0xe9, - 0x2a, 0x7b, 0x67, 0xab, 0xfb, 0xc1, 0x56, 0xf0, 0x89, 0x4e, 0xf2, 0xc8, 0x7d, 0x03, 0x26, 0x29, - 0xff, 0x9f, 0x0d, 0xff, 0xcd, 0x2d, 0xc7, 0xd7, 0xa2, 0xff, 0x99, 0x5f, 0x23, 0x42, 0xc5, 0x31, - 0xee, 0xb9, 0xeb, 0x30, 0x11, 0x51, 0x36, 0xd0, 0xf7, 0x56, 0xbf, 0x92, 0xe0, 0xf9, 0x9e, 0x57, - 0x36, 0x54, 0x8d, 0x6c, 0x92, 0x72, 0x6c, 0x93, 0xcc, 0x67, 0x03, 0x3c, 0xc5, 0xbe, 0xfd, 0xfb, - 0x43, 0x80, 0x1a, 0xdb, 0xaa, 0xd5, 0xaa, 0x29, 0x16, 0xed, 0x62, 0xf1, 0x8f, 0x37, 0x47, 0xb0, - 0x61, 0xae, 0xc2, 0x78, 0x8b, 0xd8, 0x4d, 0x4b, 0xe5, 0xc1, 0x11, 0xd5, 0xb9, 0xff, 0xac, 0xb1, - 0x14, 0x90, 0x70, 0x98, 0x0f, 0xbd, 0x05, 0x85, 0x5d, 0xf7, 0x3f, 0xb9, 0xbc, 0xae, 0x54, 0xaf, - 0x42, 0x32, 0xf8, 0xdf, 0xaf, 0x60, 0xfd, 0x88, 0x01, 0x1b, 0xfb, 0x60, 0xf2, 0x87, 0x12, 0xcc, - 0x26, 0x03, 0xb1, 0xc4, 0x4c, 0x7d, 0xfa, 0xc1, 0x78, 0x0e, 0x86, 0x39, 0x3a, 0x8b, 0xc2, 0x71, - 0xf7, 0x85, 0x99, 0x69, 0xc6, 0x7c, 0x54, 0xfe, 0xb3, 0x04, 0x73, 0xe9, 0xa6, 0x1d, 0x41, 0xd9, - 0x7e, 0x2f, 0x5a, 0xb6, 0xf7, 0x7a, 0x35, 0x48, 0xb7, 0x33, 0xa3, 0x84, 0xff, 0x53, 0x6a, 0xcc, - 0x8f, 0xc0, 0xa9, 0x8d, 0xa8, 0x53, 0x97, 0x07, 0x76, 0x2a, 0xdd, 0xa1, 0xea, 0xa5, 0x47, 0x5f, - 0xcc, 0x1f, 0xfb, 0xec, 0x8b, 0xf9, 0x63, 0x9f, 0x7f, 0x31, 0x7f, 0xec, 0x3b, 0xfb, 0xf3, 0xd2, - 0xa3, 0xfd, 0x79, 0xe9, 0xb3, 0xfd, 0x79, 0xe9, 0xf3, 0xfd, 0x79, 0xe9, 0xaf, 0xfb, 0xf3, 0xd2, - 0x0f, 0xbf, 0x9c, 0x3f, 0x76, 0x6f, 0x54, 0xe0, 0xfe, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x87, - 0x28, 0xe6, 0x89, 0x3a, 0x00, 0x00, + // 3495 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5b, 0xcd, 0x6f, 0x1b, 0xd7, + 0xb5, 0xf7, 0x90, 0xa2, 0x48, 0x1d, 0x5a, 0x92, 0x75, 0xe5, 0xc8, 0x8c, 0x1c, 0x8b, 0xce, 0x04, + 0xf0, 0xb3, 0xf3, 0x6c, 0x32, 0x76, 0xe2, 0xc4, 0x2f, 0xc6, 0xcb, 0x7b, 0xa2, 0xe4, 0x0f, 0xa5, + 0xfa, 0xa0, 0x2f, 0x29, 0xa5, 0x35, 0xe2, 0x36, 0x23, 0xf2, 0x8a, 0x1a, 0x6b, 0x38, 0x33, 0x99, + 0x0f, 0x45, 0xdc, 0x14, 0x5d, 0x05, 0x28, 0xd0, 0xa2, 0xed, 0x22, 0x45, 0xba, 0x6b, 0x36, 0x5d, + 0xb5, 0x68, 0x76, 0xed, 0x22, 0x28, 0x50, 0x20, 0x05, 0x8c, 0x22, 0x2d, 0xb2, 0x6a, 0xb3, 0x12, + 0x1a, 0x65, 0xd9, 0x7f, 0xa0, 0xf0, 0xa2, 0x28, 0xee, 0x9d, 0x3b, 0xdf, 0x33, 0x22, 0xa9, 0xd8, + 0x42, 0xd1, 0x9d, 0x78, 0xef, 0x39, 0xbf, 0xf3, 0x71, 0xef, 0x3d, 0xe7, 0xdc, 0x7b, 0x46, 0x70, + 0x7b, 0xe7, 0x86, 0x59, 0x91, 0xb5, 0xea, 0x8e, 0xbd, 0x49, 0x0c, 0x95, 0x58, 0xc4, 0xac, 0xee, + 0x12, 0xb5, 0xad, 0x19, 0x55, 0x3e, 0x21, 0xe9, 0x72, 0x95, 0xec, 0x59, 0x44, 0x35, 0x65, 0x4d, + 0x35, 0xab, 0xbb, 0x57, 0x37, 0x89, 0x25, 0x5d, 0xad, 0x76, 0x88, 0x4a, 0x0c, 0xc9, 0x22, 0xed, + 0x8a, 0x6e, 0x68, 0x96, 0x86, 0xce, 0x39, 0xe4, 0x15, 0x49, 0x97, 0x2b, 0x3e, 0x79, 0x85, 0x93, + 0xcf, 0x5e, 0xe9, 0xc8, 0xd6, 0xb6, 0xbd, 0x59, 0x69, 0x69, 0xdd, 0x6a, 0x47, 0xeb, 0x68, 0x55, + 0xc6, 0xb5, 0x69, 0x6f, 0xb1, 0x5f, 0xec, 0x07, 0xfb, 0xcb, 0x41, 0x9b, 0x15, 0x03, 0xc2, 0x5b, + 0x9a, 0x41, 0xaa, 0xbb, 0x31, 0x89, 0xb3, 0x97, 0x02, 0x34, 0xba, 0xa6, 0xc8, 0xad, 0x5e, 0x9a, + 0x72, 0xb3, 0xaf, 0xf8, 0xa4, 0x5d, 0xa9, 0xb5, 0x2d, 0xab, 0xc4, 0xe8, 0x55, 0xf5, 0x9d, 0x0e, + 0xe3, 0x35, 0x88, 0xa9, 0xd9, 0x46, 0x8b, 0x0c, 0xc5, 0x65, 0x56, 0xbb, 0xc4, 0x92, 0x92, 0xd4, + 0xaa, 0xa6, 0x71, 0x19, 0xb6, 0x6a, 0xc9, 0xdd, 0xb8, 0x98, 0x57, 0xfb, 0x31, 0x98, 0xad, 0x6d, + 0xd2, 0x95, 0x62, 0x7c, 0x2f, 0xa7, 0xf1, 0xd9, 0x96, 0xac, 0x54, 0x65, 0xd5, 0x32, 0x2d, 0x23, + 0xca, 0x24, 0x56, 0x00, 0xe6, 0xeb, 0x4b, 0x1b, 0xc4, 0xa0, 0xcb, 0x83, 0xce, 0xc3, 0x88, 0x2a, + 0x75, 0x49, 0x49, 0x38, 0x2f, 0x5c, 0x1c, 0xab, 0x9d, 0x7c, 0xb4, 0x5f, 0x3e, 0x71, 0xb0, 0x5f, + 0x1e, 0x59, 0x95, 0xba, 0x04, 0xb3, 0x19, 0xf1, 0x67, 0x02, 0x3c, 0xbb, 0x60, 0x9b, 0x96, 0xd6, + 0x5d, 0x21, 0x96, 0x21, 0xb7, 0x16, 0x6c, 0xc3, 0x20, 0xaa, 0xd5, 0xb0, 0x24, 0xcb, 0x36, 0xfb, + 0xf3, 0xa3, 0xfb, 0x90, 0xdb, 0x95, 0x14, 0x9b, 0x94, 0x32, 0xe7, 0x85, 0x8b, 0xc5, 0x6b, 0x95, + 0x8a, 0xbf, 0x4d, 0x3c, 0xa5, 0x2b, 0xfa, 0x4e, 0x87, 0xed, 0x1b, 0x77, 0x25, 0x2a, 0xf7, 0x6c, + 0x49, 0xb5, 0x64, 0xab, 0x57, 0x3b, 0xcd, 0x21, 0x4f, 0x72, 0xb9, 0x1b, 0x14, 0x0b, 0x3b, 0x90, + 0xe2, 0x77, 0xe1, 0x5c, 0xaa, 0x6a, 0xcb, 0xb2, 0x69, 0xa1, 0x07, 0x90, 0x93, 0x2d, 0xd2, 0x35, + 0x4b, 0xc2, 0xf9, 0xec, 0xc5, 0xe2, 0xb5, 0x1b, 0x95, 0x43, 0xf7, 0x68, 0x25, 0x15, 0xac, 0x36, + 0xce, 0xd5, 0xc8, 0x2d, 0x51, 0x38, 0xec, 0xa0, 0x8a, 0x3f, 0x11, 0x00, 0x05, 0x79, 0x9a, 0x92, + 0xd1, 0x21, 0xd6, 0x00, 0x4e, 0xf9, 0xd6, 0xd7, 0x73, 0xca, 0x34, 0x87, 0x2c, 0x3a, 0x02, 0x43, + 0x3e, 0xd1, 0x61, 0x26, 0xae, 0x12, 0x73, 0xc6, 0x46, 0xd8, 0x19, 0x57, 0x87, 0x70, 0x86, 0x83, + 0x92, 0xe2, 0x85, 0x0f, 0x32, 0x30, 0xb6, 0x28, 0x91, 0xae, 0xa6, 0x36, 0x88, 0x85, 0xde, 0x81, + 0x02, 0x3d, 0x18, 0x6d, 0xc9, 0x92, 0x98, 0x03, 0x8a, 0xd7, 0x5e, 0x3a, 0xcc, 0x3a, 0xb3, 0x42, + 0xa9, 0x2b, 0xbb, 0x57, 0x2b, 0x6b, 0x9b, 0x0f, 0x49, 0xcb, 0x5a, 0x21, 0x96, 0x54, 0x43, 0x5c, + 0x0e, 0xf8, 0x63, 0xd8, 0x43, 0x45, 0xab, 0x30, 0x62, 0xea, 0xa4, 0xc5, 0x7d, 0x77, 0xb9, 0x8f, + 0x19, 0x9e, 0x66, 0x0d, 0x9d, 0xb4, 0xfc, 0xc5, 0xa0, 0xbf, 0x30, 0xc3, 0x41, 0x1b, 0x30, 0x6a, + 0xb2, 0x55, 0x2e, 0x65, 0x63, 0xab, 0x71, 0x38, 0xa2, 0xb3, 0x37, 0x26, 0x38, 0xe6, 0xa8, 0xf3, + 0x1b, 0x73, 0x34, 0xf1, 0x13, 0x01, 0xc6, 0x3d, 0x5a, 0xb6, 0x02, 0x6f, 0xc7, 0x7c, 0x53, 0x19, + 0xcc, 0x37, 0x94, 0x9b, 0x79, 0xe6, 0x14, 0x97, 0x55, 0x70, 0x47, 0x02, 0x7e, 0x59, 0x71, 0xd7, + 0x37, 0xc3, 0xd6, 0xf7, 0xe2, 0xa0, 0x66, 0xa4, 0x2c, 0xeb, 0x4f, 0x47, 0x02, 0xea, 0x53, 0x77, + 0xa1, 0x07, 0x50, 0x30, 0x89, 0x42, 0x5a, 0x96, 0x66, 0x70, 0xf5, 0x5f, 0x1e, 0x50, 0x7d, 0x69, + 0x93, 0x28, 0x0d, 0xce, 0x5a, 0x3b, 0x49, 0xf5, 0x77, 0x7f, 0x61, 0x0f, 0x12, 0xdd, 0x83, 0x82, + 0x45, 0xba, 0xba, 0x22, 0x59, 0xee, 0xb9, 0x78, 0x21, 0x68, 0x02, 0xcd, 0x02, 0x14, 0xac, 0xae, + 0xb5, 0x9b, 0x9c, 0x8c, 0x2d, 0xa9, 0xe7, 0x12, 0x77, 0x14, 0x7b, 0x30, 0x68, 0x17, 0x26, 0x6c, + 0xbd, 0x4d, 0x29, 0x2d, 0x1a, 0x03, 0x3b, 0x3d, 0xbe, 0xc4, 0xaf, 0x0e, 0xea, 0x9b, 0xf5, 0x10, + 0x77, 0x6d, 0x86, 0xcb, 0x9a, 0x08, 0x8f, 0xe3, 0x88, 0x14, 0x34, 0x0f, 0x93, 0x5d, 0x59, 0xc5, + 0x44, 0x6a, 0xf7, 0x1a, 0xa4, 0xa5, 0xa9, 0x6d, 0xb3, 0x34, 0x72, 0x5e, 0xb8, 0x98, 0xab, 0x9d, + 0xe1, 0x00, 0x93, 0x2b, 0xe1, 0x69, 0x1c, 0xa5, 0x47, 0x6f, 0x02, 0x72, 0xcd, 0xb8, 0xe3, 0x84, + 0x70, 0x59, 0x53, 0x4b, 0xb9, 0xf3, 0xc2, 0xc5, 0x6c, 0x6d, 0x96, 0xa3, 0xa0, 0x66, 0x8c, 0x02, + 0x27, 0x70, 0xa1, 0x65, 0x38, 0x6d, 0x90, 0x5d, 0x99, 0xda, 0x78, 0x57, 0x36, 0x2d, 0xcd, 0xe8, + 0x2d, 0xcb, 0x5d, 0xd9, 0x2a, 0x8d, 0x32, 0x9d, 0x4a, 0x07, 0xfb, 0xe5, 0xd3, 0x38, 0x61, 0x1e, + 0x27, 0x72, 0x89, 0x1f, 0xe7, 0x60, 0x32, 0x72, 0x06, 0xd0, 0x06, 0xcc, 0xb4, 0x9c, 0x80, 0xb9, + 0x6a, 0x77, 0x37, 0x89, 0xd1, 0x68, 0x6d, 0x93, 0xb6, 0xad, 0x90, 0x36, 0xdb, 0x28, 0xb9, 0xda, + 0x1c, 0xd7, 0x78, 0x66, 0x21, 0x91, 0x0a, 0xa7, 0x70, 0x53, 0x2f, 0xa8, 0x6c, 0x68, 0x45, 0x36, + 0x4d, 0x0f, 0x33, 0xc3, 0x30, 0x3d, 0x2f, 0xac, 0xc6, 0x28, 0x70, 0x02, 0x17, 0xd5, 0xb1, 0x4d, + 0x4c, 0xd9, 0x20, 0xed, 0xa8, 0x8e, 0xd9, 0xb0, 0x8e, 0x8b, 0x89, 0x54, 0x38, 0x85, 0x1b, 0x5d, + 0x87, 0xa2, 0x23, 0x8d, 0xad, 0x1f, 0x5f, 0x68, 0x2f, 0x44, 0xaf, 0xfa, 0x53, 0x38, 0x48, 0x47, + 0x4d, 0xd3, 0x36, 0x4d, 0x62, 0xec, 0x92, 0x76, 0xfa, 0x02, 0xaf, 0xc5, 0x28, 0x70, 0x02, 0x17, + 0x35, 0xcd, 0xd9, 0x81, 0x31, 0xd3, 0x46, 0xc3, 0xa6, 0xad, 0x27, 0x52, 0xe1, 0x14, 0x6e, 0xba, + 0x8f, 0x1d, 0x95, 0xe7, 0x77, 0x25, 0x59, 0x91, 0x36, 0x15, 0x52, 0xca, 0x87, 0xf7, 0xf1, 0x6a, + 0x78, 0x1a, 0x47, 0xe9, 0xd1, 0x1d, 0x98, 0x72, 0x86, 0xd6, 0x55, 0xc9, 0x03, 0x29, 0x30, 0x90, + 0x67, 0x39, 0xc8, 0xd4, 0x6a, 0x94, 0x00, 0xc7, 0x79, 0xd0, 0xeb, 0x30, 0xd1, 0xd2, 0x14, 0x85, + 0xed, 0xc7, 0x05, 0xcd, 0x56, 0xad, 0xd2, 0x18, 0x43, 0x41, 0xf4, 0x3c, 0x2e, 0x84, 0x66, 0x70, + 0x84, 0x52, 0xfc, 0xa3, 0x00, 0x67, 0x52, 0xce, 0x34, 0xfa, 0x3f, 0x18, 0xb1, 0x7a, 0xba, 0x9b, + 0xad, 0xff, 0xdb, 0x4d, 0x10, 0xcd, 0x9e, 0x4e, 0x1e, 0xef, 0x97, 0xcf, 0xa6, 0xb0, 0xd1, 0x69, + 0xcc, 0x18, 0x91, 0x0a, 0xe3, 0x06, 0x15, 0xa7, 0x76, 0x1c, 0x12, 0x1e, 0xbc, 0xae, 0xf7, 0x89, + 0x31, 0x38, 0xc8, 0xe3, 0x07, 0xe3, 0xa9, 0x83, 0xfd, 0xf2, 0x78, 0x68, 0x0e, 0x87, 0xe1, 0xc5, + 0x0f, 0x33, 0x00, 0x8b, 0x44, 0x57, 0xb4, 0x5e, 0x97, 0xa8, 0xc7, 0x91, 0x70, 0xd7, 0x42, 0x09, + 0xf7, 0x4a, 0xbf, 0xd8, 0xe9, 0xa9, 0x96, 0x9a, 0x71, 0xdf, 0x8a, 0x64, 0xdc, 0xea, 0xe0, 0x90, + 0x87, 0xa7, 0xdc, 0xbf, 0x66, 0x61, 0xda, 0x27, 0x5e, 0xd0, 0xd4, 0xb6, 0xcc, 0xce, 0xc7, 0xcd, + 0xd0, 0x1a, 0xff, 0x57, 0x64, 0x8d, 0xcf, 0x24, 0xb0, 0x04, 0xd6, 0x77, 0xd9, 0xd3, 0x36, 0xc3, + 0xd8, 0x5f, 0x09, 0x0b, 0x7f, 0xbc, 0x5f, 0x4e, 0xb8, 0xac, 0x54, 0x3c, 0xa4, 0xb0, 0x8a, 0xe8, + 0x02, 0x8c, 0x1a, 0x44, 0x32, 0x35, 0x95, 0x05, 0x8a, 0x31, 0xdf, 0x14, 0xcc, 0x46, 0x31, 0x9f, + 0x45, 0x97, 0x20, 0xdf, 0x25, 0xa6, 0x29, 0x75, 0x08, 0x8b, 0x09, 0x63, 0xb5, 0x49, 0x4e, 0x98, + 0x5f, 0x71, 0x86, 0xb1, 0x3b, 0x8f, 0x1e, 0xc2, 0x84, 0x22, 0x99, 0x7c, 0x83, 0x36, 0xe5, 0x2e, + 0x61, 0xa7, 0xbe, 0x78, 0xed, 0xc5, 0xc1, 0xf6, 0x01, 0xe5, 0xf0, 0x33, 0xdb, 0x72, 0x08, 0x09, + 0x47, 0x90, 0xd1, 0x2e, 0x20, 0x3a, 0xd2, 0x34, 0x24, 0xd5, 0x74, 0x1c, 0x45, 0xe5, 0xe5, 0x87, + 0x96, 0xe7, 0x45, 0xb8, 0xe5, 0x18, 0x1a, 0x4e, 0x90, 0x20, 0xfe, 0x4e, 0x80, 0x09, 0x7f, 0x99, + 0x8e, 0xa1, 0x9a, 0x5a, 0x0d, 0x57, 0x53, 0x97, 0x06, 0xde, 0xa2, 0x29, 0xe5, 0xd4, 0x3f, 0x32, + 0x80, 0x7c, 0x22, 0x7a, 0xc0, 0x37, 0xa5, 0xd6, 0xce, 0x00, 0x77, 0x85, 0x0f, 0x04, 0x40, 0x3c, + 0x3c, 0xcf, 0xab, 0xaa, 0x66, 0xb1, 0x88, 0xef, 0xaa, 0xb5, 0x34, 0xb0, 0x5a, 0xae, 0xc4, 0xca, + 0x7a, 0x0c, 0xeb, 0x96, 0x6a, 0x19, 0x3d, 0x7f, 0x45, 0xe2, 0x04, 0x38, 0x41, 0x01, 0x24, 0x01, + 0x18, 0x1c, 0xb3, 0xa9, 0xf1, 0x83, 0x7c, 0x65, 0x80, 0x98, 0x47, 0x19, 0x16, 0x34, 0x75, 0x4b, + 0xee, 0xf8, 0x61, 0x07, 0x7b, 0x40, 0x38, 0x00, 0x3a, 0x7b, 0x0b, 0xce, 0xa4, 0x68, 0x8b, 0x4e, + 0x41, 0x76, 0x87, 0xf4, 0x1c, 0xb7, 0x61, 0xfa, 0x27, 0x3a, 0x1d, 0xbc, 0x53, 0x8d, 0xf1, 0xeb, + 0xd0, 0xeb, 0x99, 0x1b, 0x82, 0xf8, 0x49, 0x2e, 0xb8, 0x77, 0x58, 0x29, 0x7b, 0x11, 0x0a, 0x06, + 0xd1, 0x15, 0xb9, 0x25, 0x99, 0xbc, 0x42, 0x61, 0x55, 0x29, 0xe6, 0x63, 0xd8, 0x9b, 0x0d, 0x15, + 0xbd, 0x99, 0xa7, 0x5b, 0xf4, 0x66, 0x9f, 0x4c, 0xd1, 0xfb, 0x1d, 0x28, 0x98, 0x6e, 0xb9, 0x3b, + 0xc2, 0x20, 0xaf, 0x0e, 0x11, 0x5f, 0x79, 0xa5, 0xeb, 0x09, 0xf0, 0x6a, 0x5c, 0x0f, 0x34, 0xa9, + 0xba, 0xcd, 0x0d, 0x59, 0xdd, 0x3e, 0xd1, 0x8a, 0x94, 0xc6, 0x54, 0x5d, 0xb2, 0x4d, 0xd2, 0x66, + 0x81, 0xa8, 0xe0, 0xc7, 0xd4, 0x3a, 0x1b, 0xc5, 0x7c, 0x16, 0x3d, 0x08, 0x6d, 0xd9, 0xc2, 0x51, + 0xb6, 0xec, 0x44, 0xfa, 0x76, 0x45, 0xeb, 0x70, 0x46, 0x37, 0xb4, 0x8e, 0x41, 0x4c, 0x73, 0x91, + 0x48, 0x6d, 0x45, 0x56, 0x89, 0xeb, 0x1f, 0xa7, 0x54, 0x39, 0x7b, 0xb0, 0x5f, 0x3e, 0x53, 0x4f, + 0x26, 0xc1, 0x69, 0xbc, 0xe2, 0xa3, 0x11, 0x38, 0x15, 0xcd, 0x80, 0x29, 0xd5, 0xa3, 0x70, 0xa4, + 0xea, 0xf1, 0x72, 0xe0, 0x30, 0x38, 0xa5, 0xb5, 0xb7, 0xfa, 0x09, 0x07, 0x62, 0x1e, 0x26, 0x79, + 0x34, 0x70, 0x27, 0x79, 0xfd, 0xec, 0xad, 0xfe, 0x7a, 0x78, 0x1a, 0x47, 0xe9, 0x69, 0x4d, 0xe8, + 0x97, 0x7a, 0x2e, 0xc8, 0x48, 0xb8, 0x26, 0x9c, 0x8f, 0x12, 0xe0, 0x38, 0x0f, 0x5a, 0x81, 0x69, + 0x5b, 0x8d, 0x43, 0x39, 0xbb, 0xf1, 0x2c, 0x87, 0x9a, 0x5e, 0x8f, 0x93, 0xe0, 0x24, 0x3e, 0xb4, + 0x05, 0xd0, 0x72, 0xd3, 0xb6, 0x59, 0x1a, 0x65, 0x11, 0xf6, 0xda, 0xc0, 0x67, 0xc7, 0xcb, 0xf8, + 0x7e, 0x5c, 0xf3, 0x86, 0x4c, 0x1c, 0x40, 0x46, 0x37, 0x61, 0xdc, 0x60, 0x17, 0x02, 0x57, 0x61, + 0xa7, 0xa8, 0x7e, 0x86, 0xb3, 0x8d, 0xe3, 0xe0, 0x24, 0x0e, 0xd3, 0x26, 0xd4, 0xc1, 0x85, 0x81, + 0xeb, 0xe0, 0xdf, 0x0b, 0xc1, 0x24, 0xe4, 0x95, 0xc0, 0xaf, 0x87, 0xca, 0xa3, 0x0b, 0x91, 0xf2, + 0x68, 0x26, 0xce, 0x11, 0xa8, 0x8e, 0xb4, 0xe4, 0xea, 0xf7, 0xd5, 0xa1, 0xaa, 0x5f, 0x3f, 0x79, + 0xf6, 0x2f, 0x7f, 0x3f, 0x12, 0x60, 0xe6, 0x76, 0xe3, 0x8e, 0xa1, 0xd9, 0xba, 0xab, 0xce, 0x9a, + 0xee, 0xf8, 0xf5, 0x35, 0x18, 0x31, 0x6c, 0xc5, 0xb5, 0xe3, 0x05, 0xd7, 0x0e, 0x6c, 0x2b, 0xd4, + 0x8e, 0xe9, 0x08, 0x97, 0x63, 0x04, 0x65, 0x40, 0xab, 0x30, 0x6a, 0x48, 0x6a, 0x87, 0xb8, 0x69, + 0xf5, 0x42, 0x1f, 0xed, 0x97, 0x16, 0x31, 0x25, 0x0f, 0x14, 0x6f, 0x8c, 0x1b, 0x73, 0x14, 0xf1, + 0x87, 0x02, 0x4c, 0xde, 0x6d, 0x36, 0xeb, 0x4b, 0x2a, 0x3b, 0xd1, 0x75, 0xc9, 0xda, 0xa6, 0x99, + 0x5e, 0x97, 0xac, 0xed, 0x68, 0xa6, 0xa7, 0x73, 0x98, 0xcd, 0xa0, 0x6f, 0x42, 0x9e, 0x46, 0x12, + 0xa2, 0xb6, 0x07, 0x2c, 0xb5, 0x39, 0x7c, 0xcd, 0x61, 0xf2, 0x2b, 0x44, 0x3e, 0x80, 0x5d, 0x38, + 0x71, 0x07, 0x4e, 0x07, 0xd4, 0xa1, 0xfe, 0x60, 0x6f, 0x86, 0xa8, 0x01, 0x39, 0x2a, 0xd9, 0x7d, + 0x12, 0xec, 0xf7, 0xf2, 0x15, 0x31, 0xc9, 0xaf, 0x74, 0xe8, 0x2f, 0x13, 0x3b, 0x58, 0xe2, 0x0a, + 0x8c, 0xdf, 0xd5, 0x4c, 0xab, 0xae, 0x19, 0x16, 0x73, 0x0b, 0x3a, 0x07, 0xd9, 0xae, 0xac, 0xf2, + 0x3c, 0x5b, 0xe4, 0x3c, 0x59, 0x9a, 0x23, 0xe8, 0x38, 0x9b, 0x96, 0xf6, 0x78, 0xe4, 0xf1, 0xa7, + 0xa5, 0x3d, 0x4c, 0xc7, 0xc5, 0x3b, 0x90, 0xe7, 0xee, 0x0e, 0x02, 0x65, 0x0f, 0x07, 0xca, 0x26, + 0x00, 0xad, 0x41, 0x7e, 0xa9, 0x5e, 0x53, 0x34, 0xa7, 0xea, 0x6a, 0xc9, 0x6d, 0x23, 0xba, 0x16, + 0x0b, 0x4b, 0x8b, 0x18, 0xb3, 0x19, 0x24, 0xc2, 0x28, 0xd9, 0x6b, 0x11, 0xdd, 0x62, 0x3b, 0x62, + 0xac, 0x06, 0x74, 0x95, 0x6f, 0xb1, 0x11, 0xcc, 0x67, 0xc4, 0x1f, 0x65, 0x20, 0xcf, 0xdd, 0x71, + 0x0c, 0xb7, 0xb0, 0xe5, 0xd0, 0x2d, 0xec, 0xc5, 0xc1, 0xb6, 0x46, 0xea, 0x15, 0xac, 0x19, 0xb9, + 0x82, 0x5d, 0x1e, 0x10, 0xef, 0xf0, 0xfb, 0xd7, 0xc7, 0x02, 0x4c, 0x84, 0x37, 0x25, 0xba, 0x0e, + 0x45, 0x9a, 0x70, 0xe4, 0x16, 0x59, 0xf5, 0xeb, 0x5c, 0xef, 0x75, 0xa4, 0xe1, 0x4f, 0xe1, 0x20, + 0x1d, 0xea, 0x78, 0x6c, 0x74, 0x1f, 0x71, 0xa3, 0xd3, 0x5d, 0x6a, 0x5b, 0xb2, 0x52, 0x71, 0x3a, + 0x1e, 0x95, 0x25, 0xd5, 0x5a, 0x33, 0x1a, 0x96, 0x21, 0xab, 0x9d, 0x98, 0x20, 0xb6, 0x29, 0x83, + 0xc8, 0xe2, 0x6f, 0x05, 0x28, 0x72, 0x95, 0x8f, 0xe1, 0x56, 0xf1, 0x8d, 0xf0, 0xad, 0xe2, 0xc2, + 0x80, 0x07, 0x3c, 0xf9, 0x4a, 0xf1, 0x0b, 0x5f, 0x75, 0x7a, 0xa4, 0xe9, 0xae, 0xde, 0xd6, 0x4c, + 0x2b, 0xba, 0xab, 0xe9, 0x61, 0xc4, 0x6c, 0x06, 0xd9, 0x70, 0x4a, 0x8e, 0xc4, 0x00, 0xee, 0xda, + 0xea, 0x60, 0x9a, 0x78, 0x6c, 0xb5, 0x12, 0x87, 0x3f, 0x15, 0x9d, 0xc1, 0x31, 0x11, 0x22, 0x81, + 0x18, 0x15, 0xba, 0x07, 0x23, 0xdb, 0x96, 0xa5, 0x27, 0x3c, 0x24, 0xf7, 0x89, 0x3c, 0xbe, 0x0a, + 0x05, 0x66, 0x5d, 0xb3, 0x59, 0xc7, 0x0c, 0x4a, 0xfc, 0xa7, 0xef, 0x8f, 0x86, 0xb3, 0xc7, 0xbd, + 0x78, 0x2a, 0x1c, 0x25, 0x9e, 0x16, 0x93, 0x62, 0x29, 0xba, 0x0b, 0x59, 0x4b, 0x19, 0xf4, 0x5a, + 0xc8, 0x11, 0x9b, 0xcb, 0x0d, 0x3f, 0x20, 0x35, 0x97, 0x1b, 0x98, 0x42, 0xa0, 0x35, 0xc8, 0xd1, + 0xec, 0x43, 0x8f, 0x60, 0x76, 0xf0, 0x23, 0x4d, 0xed, 0xf7, 0x37, 0x04, 0xfd, 0x65, 0x62, 0x07, + 0x47, 0x7c, 0x17, 0xc6, 0x43, 0xe7, 0x14, 0xbd, 0x03, 0x27, 0x15, 0x4d, 0x6a, 0xd7, 0x24, 0x45, + 0x52, 0x5b, 0xc4, 0x7d, 0xb5, 0xbf, 0x90, 0x74, 0xc3, 0x58, 0x0e, 0xd0, 0xf1, 0x53, 0xee, 0xf5, + 0xde, 0x82, 0x73, 0x38, 0x84, 0x28, 0x4a, 0x00, 0xbe, 0x8d, 0xa8, 0x0c, 0x39, 0xba, 0xcf, 0x9c, + 0x7c, 0x32, 0x56, 0x1b, 0xa3, 0x1a, 0xd2, 0xed, 0x67, 0x62, 0x67, 0x1c, 0x5d, 0x03, 0x30, 0x49, + 0xcb, 0x20, 0x16, 0x0b, 0x06, 0xce, 0x7b, 0x8a, 0x17, 0xf6, 0x1a, 0xde, 0x0c, 0x0e, 0x50, 0x89, + 0x7f, 0x10, 0x60, 0x7c, 0x95, 0x58, 0xef, 0x69, 0xc6, 0x4e, 0x9d, 0x75, 0x79, 0x8f, 0x21, 0xd8, + 0xe2, 0x50, 0xb0, 0x7d, 0xa9, 0xcf, 0xca, 0x84, 0xb4, 0x4b, 0x0b, 0xb9, 0xd4, 0x8e, 0x52, 0x88, + 0x32, 0x78, 0x76, 0xd7, 0x21, 0xa7, 0x6b, 0x86, 0xe5, 0x66, 0xe2, 0xa1, 0x24, 0xd2, 0x38, 0x16, + 0xc8, 0xc5, 0x14, 0x06, 0x3b, 0x68, 0xd4, 0x8e, 0x2d, 0x43, 0xeb, 0xf2, 0xdd, 0x3a, 0x1c, 0x2a, + 0x21, 0x86, 0x6f, 0xc7, 0x6d, 0x43, 0xeb, 0x62, 0x86, 0x25, 0x7e, 0x2a, 0xc0, 0x54, 0x88, 0xf2, + 0x18, 0xe2, 0xe6, 0xbd, 0x70, 0xdc, 0xbc, 0x3c, 0x8c, 0x21, 0x29, 0xd1, 0xf3, 0xd3, 0x4c, 0xc4, + 0x0c, 0x6a, 0x30, 0xda, 0x82, 0xa2, 0xae, 0xb5, 0x1b, 0x4f, 0xa0, 0xcd, 0x35, 0x49, 0xd3, 0x4e, + 0xdd, 0xc7, 0xc2, 0x41, 0x60, 0xb4, 0x07, 0x53, 0xaa, 0xd4, 0x25, 0xa6, 0x2e, 0xb5, 0x48, 0xe3, + 0x09, 0xbc, 0x2f, 0x3c, 0xc3, 0xde, 0xd1, 0xa3, 0x88, 0x38, 0x2e, 0x04, 0xad, 0x40, 0x5e, 0xd6, + 0x59, 0x19, 0xc4, 0x53, 0x7f, 0xdf, 0x24, 0xe4, 0x14, 0x4d, 0x4e, 0x38, 0xe4, 0x3f, 0xb0, 0x8b, + 0x21, 0xfe, 0x32, 0xba, 0x1b, 0xe8, 0xfe, 0x43, 0x77, 0xa0, 0xc0, 0x3e, 0x37, 0x68, 0x69, 0x8a, + 0xfb, 0xb0, 0x4e, 0x57, 0xb6, 0xce, 0xc7, 0x1e, 0xef, 0x97, 0xcf, 0x26, 0xbc, 0x99, 0xba, 0xd3, + 0xd8, 0x63, 0x46, 0xab, 0x30, 0xa2, 0x7f, 0x9d, 0x02, 0x80, 0xe5, 0x08, 0x96, 0xf5, 0x19, 0x8e, + 0xf8, 0x55, 0x54, 0x5d, 0x96, 0x29, 0x1e, 0x3e, 0xb1, 0x55, 0xf7, 0x0a, 0x8e, 0xd4, 0x95, 0xdf, + 0x84, 0x3c, 0x4f, 0x90, 0x7c, 0x33, 0xbf, 0x36, 0xcc, 0x66, 0x0e, 0x26, 0x01, 0xaf, 0xde, 0x77, + 0x07, 0x5d, 0x60, 0xf1, 0x4f, 0x02, 0x4c, 0x31, 0x05, 0x5a, 0xb6, 0x21, 0x5b, 0xbd, 0x63, 0x0b, + 0x9b, 0x1b, 0xa1, 0xb0, 0xf9, 0x4a, 0x1f, 0xc3, 0x62, 0x1a, 0xa6, 0x86, 0xce, 0xcf, 0x04, 0x78, + 0x26, 0x46, 0x7d, 0x0c, 0x61, 0x67, 0x3d, 0x1c, 0x76, 0x5e, 0x1a, 0xd6, 0xa0, 0xb4, 0xc2, 0xad, + 0x98, 0x60, 0x0e, 0xdb, 0x88, 0xd7, 0x00, 0x74, 0x43, 0xde, 0x95, 0x15, 0xd2, 0xe1, 0xbd, 0xd3, + 0x82, 0xef, 0xf2, 0xba, 0x37, 0x83, 0x03, 0x54, 0xc8, 0x84, 0x99, 0x36, 0xd9, 0x92, 0x6c, 0xc5, + 0x9a, 0x6f, 0xb7, 0x17, 0x24, 0x5d, 0xda, 0x94, 0x15, 0xd9, 0x92, 0xf9, 0x65, 0x76, 0xac, 0x76, + 0xd3, 0xe9, 0x69, 0x26, 0x51, 0x3c, 0xde, 0x2f, 0x9f, 0x4b, 0xea, 0x5d, 0xb8, 0x24, 0x3d, 0x9c, + 0x02, 0x8d, 0x7a, 0x50, 0x32, 0xc8, 0xbb, 0xb6, 0x6c, 0x90, 0xf6, 0xa2, 0xa1, 0xe9, 0x21, 0xb1, + 0x59, 0x26, 0xf6, 0x7f, 0x0f, 0xf6, 0xcb, 0x25, 0x9c, 0x42, 0xd3, 0x5f, 0x70, 0x2a, 0x3c, 0x7a, + 0x08, 0xd3, 0x92, 0xa2, 0x68, 0xef, 0x91, 0xb0, 0xb1, 0x23, 0x4c, 0xea, 0x8d, 0x83, 0xfd, 0xf2, + 0xf4, 0x7c, 0x7c, 0xba, 0xbf, 0xc0, 0x24, 0x50, 0x54, 0x85, 0xfc, 0xae, 0xa6, 0xd8, 0x5d, 0x62, + 0x96, 0x72, 0x0c, 0x9f, 0xc6, 0xd9, 0xfc, 0x86, 0x33, 0xf4, 0x78, 0xbf, 0x3c, 0x7a, 0xbb, 0xc1, + 0x9e, 0x11, 0x5c, 0x2a, 0x7a, 0xdd, 0xa1, 0x95, 0x0e, 0x3f, 0xb3, 0xec, 0x3d, 0xb3, 0xe0, 0x07, + 0x85, 0xbb, 0xfe, 0x14, 0x0e, 0xd2, 0xa1, 0x07, 0x30, 0xb6, 0xcd, 0xef, 0xcc, 0x66, 0x29, 0x3f, + 0x50, 0x8e, 0x0b, 0xdd, 0xb1, 0x6b, 0x53, 0x5c, 0xc4, 0x98, 0x3b, 0x6c, 0x62, 0x1f, 0x11, 0x5d, + 0x82, 0x3c, 0xfb, 0xb1, 0xb4, 0xc8, 0x1e, 0x8b, 0x0a, 0x7e, 0xe8, 0xb8, 0xeb, 0x0c, 0x63, 0x77, + 0xde, 0x25, 0x5d, 0xaa, 0x2f, 0xb0, 0x47, 0xcb, 0x08, 0xe9, 0x52, 0x7d, 0x01, 0xbb, 0xf3, 0xe8, + 0x1d, 0xc8, 0x9b, 0x64, 0x59, 0x56, 0xed, 0xbd, 0x12, 0x0c, 0xd4, 0xf2, 0x6c, 0xdc, 0x62, 0xd4, + 0x91, 0x67, 0x1b, 0x5f, 0x02, 0x9f, 0xc7, 0x2e, 0x2c, 0xda, 0x86, 0x31, 0xc3, 0x56, 0xe7, 0xcd, + 0x75, 0x93, 0x18, 0xa5, 0x22, 0x93, 0xd1, 0x2f, 0x5a, 0x62, 0x97, 0x3e, 0x2a, 0xc5, 0xf3, 0x90, + 0x47, 0x81, 0x7d, 0x70, 0xf4, 0x03, 0x01, 0x90, 0x69, 0xeb, 0xba, 0x42, 0xba, 0x44, 0xb5, 0x24, + 0x85, 0xbd, 0x14, 0x99, 0xa5, 0x93, 0x4c, 0xe6, 0xff, 0xf7, 0xb3, 0x2b, 0xc6, 0x18, 0x15, 0xee, + 0x3d, 0xc9, 0xc6, 0x49, 0x71, 0x82, 0x5c, 0xea, 0xda, 0x2d, 0x93, 0xfd, 0x5d, 0x1a, 0x1f, 0xc8, + 0xb5, 0xc9, 0x2f, 0x62, 0xbe, 0x6b, 0xf9, 0x3c, 0x76, 0x61, 0xd1, 0x06, 0xcc, 0x18, 0x44, 0x6a, + 0xaf, 0xa9, 0x4a, 0x0f, 0x6b, 0x9a, 0x75, 0x5b, 0x56, 0x88, 0xd9, 0x33, 0x2d, 0xd2, 0x2d, 0x4d, + 0xb0, 0x65, 0xf7, 0x3e, 0x19, 0xc0, 0x89, 0x54, 0x38, 0x85, 0x1b, 0x75, 0xa1, 0xec, 0x86, 0x0c, + 0x7a, 0x9e, 0xbc, 0x98, 0x75, 0xcb, 0x6c, 0x49, 0x8a, 0xf3, 0x4a, 0x3d, 0xc9, 0x04, 0xbc, 0x70, + 0xb0, 0x5f, 0x2e, 0x2f, 0x1e, 0x4e, 0x8a, 0xfb, 0x61, 0xa1, 0xb7, 0xa1, 0x24, 0xa5, 0xc9, 0x39, + 0xc5, 0xe4, 0x9c, 0xe7, 0x86, 0x94, 0x52, 0x85, 0xa4, 0x22, 0xb0, 0x56, 0x3b, 0x7f, 0x78, 0x3d, + 0x9e, 0x6f, 0xdb, 0x86, 0x6b, 0xb5, 0xfb, 0xaa, 0x3d, 0xb1, 0x56, 0x7b, 0x00, 0xf2, 0xf0, 0xa7, + 0x9e, 0xbf, 0x67, 0x60, 0xda, 0x27, 0x1e, 0xb8, 0xd5, 0x9e, 0xc0, 0xf2, 0xd4, 0x5a, 0xed, 0xc9, + 0xbd, 0xea, 0xec, 0xd3, 0xee, 0x55, 0x3f, 0x85, 0x16, 0x3f, 0x6b, 0x7f, 0xfb, 0xae, 0xfb, 0xf7, + 0x6b, 0x7f, 0xfb, 0xba, 0xa5, 0x94, 0x3c, 0xbf, 0xce, 0x04, 0x0d, 0xf8, 0x8f, 0xef, 0xc1, 0x7e, + 0xfd, 0x0f, 0x00, 0xc5, 0xcf, 0xb2, 0x70, 0x2a, 0x7a, 0x1a, 0x43, 0xad, 0x3a, 0xa1, 0x6f, 0xab, + 0xae, 0x0e, 0xa7, 0xb7, 0x6c, 0x45, 0xe9, 0x31, 0x37, 0x04, 0xfa, 0x75, 0xce, 0x53, 0xfb, 0x73, + 0x9c, 0xf3, 0xf4, 0xed, 0x04, 0x1a, 0x9c, 0xc8, 0x99, 0xd2, 0x76, 0xcc, 0x1e, 0xa9, 0xed, 0x18, + 0xeb, 0x82, 0x8d, 0x0c, 0xd1, 0x05, 0x4b, 0x6c, 0x21, 0xe6, 0x8e, 0xd0, 0x42, 0x3c, 0x4a, 0xcf, + 0x2f, 0x21, 0x88, 0xf5, 0xeb, 0xf9, 0x89, 0xcf, 0xc1, 0x2c, 0x67, 0xb3, 0x58, 0x3b, 0x4e, 0xb5, + 0x0c, 0x4d, 0x51, 0x88, 0xb1, 0x68, 0x77, 0xbb, 0x3d, 0xf1, 0x0d, 0x98, 0x08, 0x37, 0x9a, 0x9d, + 0x95, 0x76, 0x7a, 0xdd, 0xbc, 0xe1, 0x11, 0x58, 0x69, 0x67, 0x1c, 0x7b, 0x14, 0xe2, 0xfb, 0x02, + 0xcc, 0x24, 0x7f, 0x50, 0x86, 0x14, 0x98, 0xe8, 0x4a, 0x7b, 0xc1, 0xaf, 0xef, 0x84, 0x23, 0xde, + 0xa5, 0x59, 0x87, 0x71, 0x25, 0x84, 0x85, 0x23, 0xd8, 0xf4, 0x7e, 0x7d, 0x26, 0xa5, 0xb7, 0x77, + 0xbc, 0x9a, 0xa0, 0xfb, 0x50, 0xe8, 0x4a, 0x7b, 0x0d, 0xdb, 0xe8, 0x90, 0x23, 0xbf, 0x1e, 0xb0, + 0x88, 0xb1, 0xc2, 0x51, 0xb0, 0x87, 0x27, 0x7e, 0x24, 0x40, 0x29, 0xad, 0xd0, 0x44, 0xd7, 0x43, + 0x5d, 0xc8, 0xe7, 0x23, 0x5d, 0xc8, 0xa9, 0x18, 0xdf, 0x53, 0xea, 0x41, 0xfe, 0x4a, 0x80, 0x99, + 0xe4, 0x82, 0x1b, 0xbd, 0x1c, 0xd2, 0xb0, 0x1c, 0xd1, 0x70, 0x32, 0xc2, 0xc5, 0xf5, 0xfb, 0x36, + 0x4c, 0xf0, 0xb2, 0x9c, 0xc3, 0x70, 0xaf, 0x8a, 0x49, 0xb1, 0x92, 0x43, 0xb8, 0x65, 0x28, 0x5b, + 0xaf, 0xf0, 0x18, 0x8e, 0xa0, 0x89, 0xdf, 0xcf, 0x40, 0xae, 0xd1, 0x92, 0x14, 0x72, 0x0c, 0x65, + 0xd6, 0x9b, 0xa1, 0x32, 0xab, 0xdf, 0x97, 0xf2, 0x4c, 0xab, 0xd4, 0x0a, 0x0b, 0x47, 0x2a, 0xac, + 0x17, 0x07, 0x42, 0x3b, 0xbc, 0xb8, 0xfa, 0x1f, 0x18, 0xf3, 0x84, 0x0e, 0x17, 0xf3, 0xc5, 0x9f, + 0x67, 0xa0, 0x18, 0x10, 0x31, 0x64, 0xc6, 0xd8, 0x0a, 0x65, 0xda, 0x41, 0xfe, 0x67, 0x26, 0x20, + 0xab, 0xe2, 0xe6, 0x56, 0xe7, 0x83, 0x32, 0xff, 0x13, 0xa2, 0x78, 0xca, 0x7d, 0x03, 0x26, 0x2c, + 0xf6, 0x3f, 0x25, 0xde, 0x9b, 0x5b, 0x96, 0xed, 0x45, 0xef, 0x33, 0xc4, 0x66, 0x68, 0x16, 0x47, + 0xa8, 0x67, 0x6f, 0xc2, 0x78, 0x48, 0xd8, 0x50, 0xdf, 0x83, 0xfd, 0x46, 0x80, 0xe7, 0xfb, 0x5e, + 0xd9, 0x50, 0x2d, 0x74, 0x48, 0x2a, 0x91, 0x43, 0x32, 0x97, 0x0e, 0xf0, 0x14, 0xbf, 0x2b, 0x78, + 0x3f, 0x03, 0xa8, 0xb9, 0x2d, 0x1b, 0xed, 0xba, 0x64, 0x58, 0x3d, 0xcc, 0xff, 0x31, 0xe8, 0x18, + 0x0e, 0xcc, 0x75, 0x28, 0xb6, 0x89, 0xd9, 0x32, 0x64, 0xe6, 0x1c, 0x5e, 0x9d, 0x7b, 0xcf, 0x1a, + 0x8b, 0xfe, 0x14, 0x0e, 0xd2, 0xa1, 0xb7, 0xa0, 0xb0, 0xeb, 0xfc, 0xa7, 0x99, 0xdb, 0xe4, 0xea, + 0x57, 0x48, 0xfa, 0xff, 0x9b, 0xe6, 0xef, 0x1f, 0x3e, 0x60, 0x62, 0x0f, 0x4c, 0xfc, 0x50, 0x80, + 0x99, 0xb8, 0x23, 0x16, 0xa9, 0xaa, 0x4f, 0xdf, 0x19, 0xcf, 0xc1, 0x08, 0x43, 0xa7, 0x5e, 0x38, + 0xe9, 0xbc, 0x30, 0x53, 0xc9, 0x98, 0x8d, 0x8a, 0x7f, 0x11, 0x60, 0x36, 0x59, 0xb5, 0x63, 0x28, + 0xdb, 0xef, 0x87, 0xcb, 0xf6, 0x7e, 0xaf, 0x06, 0xc9, 0x7a, 0xa6, 0x94, 0xf0, 0x7f, 0x4e, 0xf4, + 0xf9, 0x31, 0x18, 0xb5, 0x11, 0x36, 0xea, 0xea, 0xd0, 0x46, 0x25, 0x1b, 0x54, 0xbb, 0xf2, 0xe8, + 0xcb, 0xb9, 0x13, 0x9f, 0x7f, 0x39, 0x77, 0xe2, 0x8b, 0x2f, 0xe7, 0x4e, 0x7c, 0xef, 0x60, 0x4e, + 0x78, 0x74, 0x30, 0x27, 0x7c, 0x7e, 0x30, 0x27, 0x7c, 0x71, 0x30, 0x27, 0xfc, 0xed, 0x60, 0x4e, + 0xf8, 0xf1, 0x57, 0x73, 0x27, 0xee, 0xe7, 0x39, 0xee, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x6f, + 0x30, 0xd5, 0x91, 0x29, 0x3b, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto index c9e7224726924..87a2f91687b71 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto @@ -421,6 +421,21 @@ message IDRange { optional int64 max = 2; } +// IPBlock describes a particular CIDR (Ex. "192.168.1.1/24") that is allowed to the pods +// matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should +// not be included within this rule. +message IPBlock { + // CIDR is a string representing the IP Block + // Valid examples are "192.168.1.1/24" + optional string cidr = 1; + + // Except is a slice of CIDRs that should not be included within an IP Block + // Valid examples are "192.168.1.1/24" + // Except values will be rejected if they are outside the CIDR range + // +optional + repeated string except = 2; +} + // Ingress is a collection of rules that allow inbound connections to reach the // endpoints defined by a backend. An Ingress can be configured to give services // externally-reachable urls, load balance traffic, terminate SSL, offer name @@ -602,6 +617,10 @@ message NetworkPolicyPeer { // If present but empty, this selector selects all namespaces. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector namespaceSelector = 2; + + // IPBlock defines policy on a particular IPBlock + // +optional + optional IPBlock ipBlock = 3; } message NetworkPolicyPort { diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types.generated.go b/staging/src/k8s.io/api/extensions/v1beta1/types.generated.go index b6ecc170b19f7..37120e62d103e 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types.generated.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types.generated.go @@ -18741,7 +18741,7 @@ func (x *NetworkPolicyPort) codecDecodeSelfFromArray(l int, d *codec1978.Decoder z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } -func (x *NetworkPolicyPeer) CodecEncodeSelf(e *codec1978.Encoder) { +func (x *IPBlock) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) _, _, _ = h, z, r @@ -18758,11 +18758,254 @@ func (x *NetworkPolicyPeer) CodecEncodeSelf(e *codec1978.Encoder) { var yyq2 [2]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false + yyq2[1] = len(x.Except) != 0 + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(2) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.CIDR)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("cidr")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.CIDR)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + if x.Except == nil { + r.EncodeNil() + } else { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + z.F.EncSliceStringV(x.Except, false, e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("except")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Except == nil { + r.EncodeNil() + } else { + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + z.F.EncSliceStringV(x.Except, false, e) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *IPBlock) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *IPBlock) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "cidr": + if r.TryDecodeAsNil() { + x.CIDR = "" + } else { + yyv4 := &x.CIDR + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "except": + if r.TryDecodeAsNil() { + x.Except = nil + } else { + yyv6 := &x.Except + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + z.F.DecSliceStringX(yyv6, false, d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *IPBlock) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj8 int + var yyb8 bool + var yyhl8 bool = l >= 0 + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.CIDR = "" + } else { + yyv9 := &x.CIDR + yym10 := z.DecBinary() + _ = yym10 + if false { + } else { + *((*string)(yyv9)) = r.DecodeString() + } + } + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Except = nil + } else { + yyv11 := &x.Except + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + z.F.DecSliceStringX(yyv11, false, d) + } + } + for { + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj8-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *NetworkPolicyPeer) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [3]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false yyq2[0] = x.PodSelector != nil yyq2[1] = x.NamespaceSelector != nil + yyq2[2] = x.IPBlock != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(2) + r.EncodeArrayStart(3) } else { yynn2 = 0 for _, b := range yyq2 { @@ -18843,6 +19086,29 @@ func (x *NetworkPolicyPeer) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + if x.IPBlock == nil { + r.EncodeNil() + } else { + x.IPBlock.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("ipBlock")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.IPBlock == nil { + r.EncodeNil() + } else { + x.IPBlock.CodecEncodeSelf(e) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -18938,6 +19204,17 @@ func (x *NetworkPolicyPeer) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) z.DecFallback(x.NamespaceSelector, false) } } + case "ipBlock": + if r.TryDecodeAsNil() { + if x.IPBlock != nil { + x.IPBlock = nil + } + } else { + if x.IPBlock == nil { + x.IPBlock = new(IPBlock) + } + x.IPBlock.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -18949,16 +19226,16 @@ func (x *NetworkPolicyPeer) codecDecodeSelfFromArray(l int, d *codec1978.Decoder var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj8 int - var yyb8 bool - var yyhl8 bool = l >= 0 - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + var yyj9 int + var yyb9 bool + var yyhl9 bool = l >= 0 + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l } else { - yyb8 = r.CheckBreak() + yyb9 = r.CheckBreak() } - if yyb8 { + if yyb9 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -18971,21 +19248,21 @@ func (x *NetworkPolicyPeer) codecDecodeSelfFromArray(l int, d *codec1978.Decoder if x.PodSelector == nil { x.PodSelector = new(pkg1_v1.LabelSelector) } - yym10 := z.DecBinary() - _ = yym10 + yym11 := z.DecBinary() + _ = yym11 if false { } else if z.HasExtensions() && z.DecExt(x.PodSelector) { } else { z.DecFallback(x.PodSelector, false) } } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l } else { - yyb8 = r.CheckBreak() + yyb9 = r.CheckBreak() } - if yyb8 { + if yyb9 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -18998,26 +19275,47 @@ func (x *NetworkPolicyPeer) codecDecodeSelfFromArray(l int, d *codec1978.Decoder if x.NamespaceSelector == nil { x.NamespaceSelector = new(pkg1_v1.LabelSelector) } - yym12 := z.DecBinary() - _ = yym12 + yym13 := z.DecBinary() + _ = yym13 if false { } else if z.HasExtensions() && z.DecExt(x.NamespaceSelector) { } else { z.DecFallback(x.NamespaceSelector, false) } } + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l + } else { + yyb9 = r.CheckBreak() + } + if yyb9 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.IPBlock != nil { + x.IPBlock = nil + } + } else { + if x.IPBlock == nil { + x.IPBlock = new(IPBlock) + } + x.IPBlock.CodecDecodeSelf(d) + } for { - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l } else { - yyb8 = r.CheckBreak() + yyb9 = r.CheckBreak() } - if yyb8 { + if yyb9 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj8-1, "") + z.DecStructFieldNotFound(yyj9-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -21917,7 +22215,7 @@ func (x codecSelfer1234) decSliceNetworkPolicyPeer(v *[]NetworkPolicyPeer, d *co yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 16) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 24) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index 2a0259548c85a..2944ec44ab263 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -254,6 +254,16 @@ func (IDRange) SwaggerDoc() map[string]string { return map_IDRange } +var map_IPBlock = map[string]string{ + "": "IPBlock describes a particular CIDR (Ex. \"192.168.1.1/24\") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.", + "cidr": "CIDR is a string representing the IP Block Valid examples are \"192.168.1.1/24\"", + "except": "Except is a slice of CIDRs that should not be included within an IP Block Valid examples are \"192.168.1.1/24\" Except values will be rejected if they are outside the CIDR range", +} + +func (IPBlock) SwaggerDoc() map[string]string { + return map_IPBlock +} + var map_Ingress = map[string]string{ "": "Ingress is a collection of rules that allow inbound connections to reach the endpoints defined by a backend. An Ingress can be configured to give services externally-reachable urls, load balance traffic, terminate SSL, offer name based virtual hosting etc.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", @@ -365,6 +375,7 @@ func (NetworkPolicyList) SwaggerDoc() map[string]string { var map_NetworkPolicyPeer = map[string]string{ "podSelector": "This is a label selector which selects Pods in this namespace. This field follows standard label selector semantics. If present but empty, this selector selects all pods in this namespace.", "namespaceSelector": "Selects Namespaces using cluster scoped-labels. This matches all pods in all namespaces selected by this label selector. This field follows standard label selector semantics. If present but empty, this selector selects all namespaces.", + "ipBlock": "IPBlock defines policy on a particular IPBlock", } func (NetworkPolicyPeer) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go index d93cb0cea23b7..c0aa22dad1851 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go @@ -127,6 +127,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*IDRange).DeepCopyInto(out.(*IDRange)) return nil }, InType: reflect.TypeOf(&IDRange{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*IPBlock).DeepCopyInto(out.(*IPBlock)) + return nil + }, InType: reflect.TypeOf(&IPBlock{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*Ingress).DeepCopyInto(out.(*Ingress)) return nil @@ -845,6 +849,27 @@ func (in *IDRange) DeepCopy() *IDRange { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IPBlock) DeepCopyInto(out *IPBlock) { + *out = *in + if in.Except != nil { + in, out := &in.Except, &out.Except + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPBlock. +func (in *IPBlock) DeepCopy() *IPBlock { + if in == nil { + return nil + } + out := new(IPBlock) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Ingress) DeepCopyInto(out *Ingress) { *out = *in @@ -1157,6 +1182,15 @@ func (in *NetworkPolicyPeer) DeepCopyInto(out *NetworkPolicyPeer) { (*in).DeepCopyInto(*out) } } + if in.IPBlock != nil { + in, out := &in.IPBlock, &out.IPBlock + if *in == nil { + *out = nil + } else { + *out = new(IPBlock) + (*in).DeepCopyInto(*out) + } + } return } diff --git a/staging/src/k8s.io/api/networking/v1/generated.pb.go b/staging/src/k8s.io/api/networking/v1/generated.pb.go index 186b288824bb7..226b55997ce32 100644 --- a/staging/src/k8s.io/api/networking/v1/generated.pb.go +++ b/staging/src/k8s.io/api/networking/v1/generated.pb.go @@ -25,6 +25,7 @@ limitations under the License. k8s.io/kubernetes/vendor/k8s.io/api/networking/v1/generated.proto It has these top-level messages: + IPBlock NetworkPolicy NetworkPolicyIngressRule NetworkPolicyList @@ -60,33 +61,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package +func (m *IPBlock) Reset() { *m = IPBlock{} } +func (*IPBlock) ProtoMessage() {} +func (*IPBlock) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } + func (m *NetworkPolicy) Reset() { *m = NetworkPolicy{} } func (*NetworkPolicy) ProtoMessage() {} -func (*NetworkPolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } +func (*NetworkPolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } func (m *NetworkPolicyIngressRule) Reset() { *m = NetworkPolicyIngressRule{} } func (*NetworkPolicyIngressRule) ProtoMessage() {} func (*NetworkPolicyIngressRule) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{1} + return fileDescriptorGenerated, []int{2} } func (m *NetworkPolicyList) Reset() { *m = NetworkPolicyList{} } func (*NetworkPolicyList) ProtoMessage() {} -func (*NetworkPolicyList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } +func (*NetworkPolicyList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} } func (m *NetworkPolicyPeer) Reset() { *m = NetworkPolicyPeer{} } func (*NetworkPolicyPeer) ProtoMessage() {} -func (*NetworkPolicyPeer) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} } +func (*NetworkPolicyPeer) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} } func (m *NetworkPolicyPort) Reset() { *m = NetworkPolicyPort{} } func (*NetworkPolicyPort) ProtoMessage() {} -func (*NetworkPolicyPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} } +func (*NetworkPolicyPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} } func (m *NetworkPolicySpec) Reset() { *m = NetworkPolicySpec{} } func (*NetworkPolicySpec) ProtoMessage() {} -func (*NetworkPolicySpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} } +func (*NetworkPolicySpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} } func init() { + proto.RegisterType((*IPBlock)(nil), "k8s.io.api.networking.v1.IPBlock") proto.RegisterType((*NetworkPolicy)(nil), "k8s.io.api.networking.v1.NetworkPolicy") proto.RegisterType((*NetworkPolicyIngressRule)(nil), "k8s.io.api.networking.v1.NetworkPolicyIngressRule") proto.RegisterType((*NetworkPolicyList)(nil), "k8s.io.api.networking.v1.NetworkPolicyList") @@ -94,6 +100,43 @@ func init() { proto.RegisterType((*NetworkPolicyPort)(nil), "k8s.io.api.networking.v1.NetworkPolicyPort") proto.RegisterType((*NetworkPolicySpec)(nil), "k8s.io.api.networking.v1.NetworkPolicySpec") } +func (m *IPBlock) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IPBlock) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CIDR))) + i += copy(dAtA[i:], m.CIDR) + if len(m.Except) > 0 { + for _, s := range m.Except { + dAtA[i] = 0x12 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + func (m *NetworkPolicy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -243,6 +286,16 @@ func (m *NetworkPolicyPeer) MarshalTo(dAtA []byte) (int, error) { } i += n5 } + if m.IPBlock != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.IPBlock.Size())) + n6, err := m.IPBlock.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + } return i, nil } @@ -271,11 +324,11 @@ func (m *NetworkPolicyPort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n6, err := m.Port.MarshalTo(dAtA[i:]) + n7, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n6 + i += n7 } return i, nil } @@ -298,11 +351,11 @@ func (m *NetworkPolicySpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodSelector.Size())) - n7, err := m.PodSelector.MarshalTo(dAtA[i:]) + n8, err := m.PodSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n7 + i += n8 if len(m.Ingress) > 0 { for _, msg := range m.Ingress { dAtA[i] = 0x12 @@ -345,6 +398,20 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return offset + 1 } +func (m *IPBlock) Size() (n int) { + var l int + _ = l + l = len(m.CIDR) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Except) > 0 { + for _, s := range m.Except { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *NetworkPolicy) Size() (n int) { var l int _ = l @@ -398,6 +465,10 @@ func (m *NetworkPolicyPeer) Size() (n int) { l = m.NamespaceSelector.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.IPBlock != nil { + l = m.IPBlock.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -442,6 +513,17 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *IPBlock) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&IPBlock{`, + `CIDR:` + fmt.Sprintf("%v", this.CIDR) + `,`, + `Except:` + fmt.Sprintf("%v", this.Except) + `,`, + `}`, + }, "") + return s +} func (this *NetworkPolicy) String() string { if this == nil { return "nil" @@ -482,6 +564,7 @@ func (this *NetworkPolicyPeer) String() string { s := strings.Join([]string{`&NetworkPolicyPeer{`, `PodSelector:` + strings.Replace(fmt.Sprintf("%v", this.PodSelector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, + `IPBlock:` + strings.Replace(fmt.Sprintf("%v", this.IPBlock), "IPBlock", "IPBlock", 1) + `,`, `}`, }, "") return s @@ -516,6 +599,114 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *IPBlock) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IPBlock: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IPBlock: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CIDR", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CIDR = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Except", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Except = append(m.Except, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NetworkPolicy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -944,6 +1135,39 @@ func (m *NetworkPolicyPeer) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPBlock", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.IPBlock == nil { + m.IPBlock = &IPBlock{} + } + if err := m.IPBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -1299,47 +1523,52 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 670 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4d, 0x4f, 0xdb, 0x4a, - 0x14, 0x8d, 0xf3, 0x40, 0xe4, 0x0d, 0x0f, 0xf1, 0xf0, 0xd3, 0x93, 0x22, 0x2a, 0x39, 0xc8, 0x9b, - 0x52, 0x21, 0x66, 0x1a, 0xa8, 0xaa, 0x6e, 0xeb, 0x45, 0x2b, 0x24, 0x3e, 0x22, 0xb3, 0xab, 0x5a, - 0xa9, 0x13, 0xe7, 0x62, 0x86, 0xc4, 0x33, 0xd6, 0xcc, 0x24, 0x85, 0x5d, 0x7f, 0x42, 0x7f, 0x48, - 0xff, 0x41, 0x17, 0xed, 0x92, 0x25, 0x4b, 0x56, 0x51, 0x71, 0x7f, 0x43, 0x37, 0x5d, 0x55, 0x63, - 0x3b, 0x71, 0x88, 0x89, 0x1a, 0xaa, 0xee, 0x98, 0xeb, 0x73, 0xce, 0xbd, 0x87, 0x73, 0x6f, 0xd0, - 0xf3, 0xee, 0x33, 0x85, 0x99, 0x20, 0xdd, 0x7e, 0x1b, 0x24, 0x07, 0x0d, 0x8a, 0x0c, 0x80, 0x77, - 0x84, 0x24, 0xf9, 0x07, 0x1a, 0x33, 0xc2, 0x41, 0xbf, 0x13, 0xb2, 0xcb, 0x78, 0x48, 0x06, 0x4d, - 0x12, 0x02, 0x07, 0x49, 0x35, 0x74, 0x70, 0x2c, 0x85, 0x16, 0x76, 0x3d, 0x43, 0x62, 0x1a, 0x33, - 0x5c, 0x20, 0xf1, 0xa0, 0xb9, 0xbe, 0x1d, 0x32, 0x7d, 0xda, 0x6f, 0xe3, 0x40, 0x44, 0x24, 0x14, - 0xa1, 0x20, 0x29, 0xa1, 0xdd, 0x3f, 0x49, 0x5f, 0xe9, 0x23, 0xfd, 0x2b, 0x13, 0x5a, 0x77, 0x27, - 0x5a, 0x06, 0x42, 0xc2, 0x1d, 0xcd, 0xd6, 0xb7, 0x27, 0x30, 0x70, 0xae, 0x81, 0x2b, 0x26, 0xb8, - 0x22, 0x83, 0x66, 0x1b, 0x34, 0x2d, 0xc3, 0x1f, 0x4d, 0xc0, 0x63, 0xd1, 0x63, 0xc1, 0xc5, 0x4c, - 0xe8, 0x93, 0x02, 0x1a, 0xd1, 0xe0, 0x94, 0x71, 0x90, 0x17, 0x24, 0xee, 0x86, 0xa6, 0xa0, 0x48, - 0x04, 0x9a, 0xde, 0x35, 0x0f, 0x99, 0xc5, 0x92, 0x7d, 0xae, 0x59, 0x04, 0x25, 0xc2, 0xd3, 0x5f, - 0x11, 0x54, 0x70, 0x0a, 0x11, 0x2d, 0xf1, 0x76, 0x67, 0xf1, 0xfa, 0x9a, 0xf5, 0x08, 0xe3, 0x5a, - 0x69, 0x39, 0x4d, 0x72, 0xbf, 0x58, 0x68, 0xe5, 0x30, 0x8b, 0xa4, 0x95, 0xba, 0xb7, 0xdf, 0xa2, - 0x9a, 0xb1, 0xd2, 0xa1, 0x9a, 0xd6, 0xad, 0x0d, 0x6b, 0x73, 0x79, 0xe7, 0x31, 0x2e, 0xf2, 0x1b, - 0x2b, 0xe3, 0xb8, 0x1b, 0x9a, 0x82, 0xc2, 0x06, 0x8d, 0x07, 0x4d, 0x7c, 0xd4, 0x3e, 0x83, 0x40, - 0x1f, 0x80, 0xa6, 0x9e, 0x7d, 0x39, 0x6c, 0x54, 0x92, 0x61, 0x03, 0x15, 0x35, 0x7f, 0xac, 0x6a, - 0x1f, 0xa0, 0x05, 0x15, 0x43, 0x50, 0xaf, 0xa6, 0xea, 0x5b, 0x78, 0xd6, 0x76, 0xe0, 0x5b, 0x83, - 0x1d, 0xc7, 0x10, 0x78, 0xff, 0xe4, 0xc2, 0x0b, 0xe6, 0xe5, 0xa7, 0x32, 0xee, 0x27, 0x0b, 0xd5, - 0x6f, 0x21, 0xf7, 0x78, 0x28, 0x41, 0x29, 0xbf, 0xdf, 0x03, 0xbb, 0x85, 0x16, 0x63, 0x21, 0xb5, - 0xaa, 0x5b, 0x1b, 0x7f, 0xdd, 0xa3, 0x59, 0x4b, 0x48, 0xed, 0xad, 0xe4, 0xcd, 0x16, 0xcd, 0x4b, - 0xf9, 0x99, 0x90, 0x99, 0xfe, 0x44, 0x8a, 0xa8, 0x5e, 0xbd, 0x9f, 0x20, 0x80, 0x2c, 0xa6, 0x7f, - 0x21, 0x45, 0xe4, 0xa7, 0x32, 0xee, 0x67, 0x0b, 0xad, 0xdd, 0x42, 0xee, 0x33, 0xa5, 0xed, 0xd7, - 0xa5, 0x10, 0xf0, 0x7c, 0x21, 0x18, 0x76, 0x1a, 0xc1, 0xbf, 0x79, 0xaf, 0xda, 0xa8, 0x32, 0x11, - 0xc0, 0x3e, 0x5a, 0x64, 0x1a, 0x22, 0x95, 0x7b, 0x78, 0x38, 0xa7, 0x87, 0xe2, 0x1f, 0xb2, 0x67, - 0xd8, 0x7e, 0x26, 0xe2, 0x7e, 0x9f, 0x76, 0x60, 0xbc, 0xda, 0x27, 0x68, 0x39, 0x16, 0x9d, 0x63, - 0xe8, 0x41, 0xa0, 0x85, 0xcc, 0x4d, 0xec, 0xce, 0x69, 0x82, 0xb6, 0xa1, 0x37, 0xa2, 0x7a, 0xab, - 0xc9, 0xb0, 0xb1, 0xdc, 0x2a, 0xb4, 0xfc, 0x49, 0x61, 0xfb, 0x1c, 0xad, 0x71, 0x1a, 0x81, 0x8a, - 0x69, 0x00, 0xe3, 0x6e, 0xd5, 0xdf, 0xef, 0xf6, 0x7f, 0x32, 0x6c, 0xac, 0x1d, 0x4e, 0x2b, 0xfa, - 0xe5, 0x26, 0xee, 0xc7, 0x92, 0x6f, 0x21, 0xb5, 0xfd, 0x12, 0xd5, 0xd2, 0xcb, 0x0a, 0x44, 0x2f, - 0x35, 0xfd, 0xb7, 0xb7, 0x65, 0x52, 0x68, 0xe5, 0xb5, 0x1f, 0xc3, 0xc6, 0x83, 0xf2, 0x8f, 0x18, - 0x1e, 0x7d, 0xf6, 0xc7, 0x64, 0xfb, 0x10, 0x2d, 0x98, 0x85, 0xcb, 0xbd, 0xcc, 0xbe, 0x41, 0x73, - 0xdd, 0x38, 0xbb, 0x6e, 0xbc, 0xc7, 0xf5, 0x91, 0x3c, 0xd6, 0x92, 0xf1, 0xd0, 0xab, 0x99, 0x45, - 0x33, 0x23, 0xf9, 0xa9, 0x8e, 0x3b, 0x9c, 0x1e, 0xd7, 0x9c, 0x90, 0x7d, 0xf6, 0xc7, 0x62, 0xfa, - 0x2f, 0x5f, 0x8e, 0xd9, 0x51, 0xbd, 0x41, 0x4b, 0x2c, 0x3b, 0xcd, 0x7c, 0xf1, 0x76, 0xe6, 0x5c, - 0xbc, 0x89, 0x83, 0xf6, 0x56, 0xf3, 0x36, 0x4b, 0xa3, 0xe2, 0x48, 0xd3, 0xdb, 0xbc, 0xbc, 0x71, - 0x2a, 0x57, 0x37, 0x4e, 0xe5, 0xfa, 0xc6, 0xa9, 0xbc, 0x4f, 0x1c, 0xeb, 0x32, 0x71, 0xac, 0xab, - 0xc4, 0xb1, 0xae, 0x13, 0xc7, 0xfa, 0x9a, 0x38, 0xd6, 0x87, 0x6f, 0x4e, 0xe5, 0x55, 0x75, 0xd0, - 0xfc, 0x19, 0x00, 0x00, 0xff, 0xff, 0x75, 0x6b, 0xae, 0xb3, 0xd3, 0x06, 0x00, 0x00, + // 745 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0xcd, 0x4e, 0xdb, 0x4a, + 0x14, 0x8e, 0x43, 0x20, 0x61, 0x72, 0x11, 0x17, 0x5f, 0x5d, 0x29, 0xa2, 0x92, 0x93, 0x7a, 0x53, + 0x2a, 0xc4, 0xb8, 0x81, 0xaa, 0xea, 0xb6, 0xee, 0x6f, 0x24, 0x7e, 0x22, 0xb3, 0xab, 0x5a, 0xa9, + 0x8e, 0x73, 0x30, 0x43, 0x62, 0x8f, 0x35, 0x33, 0x49, 0x61, 0xd7, 0x47, 0xe8, 0x83, 0xf4, 0x0d, + 0xba, 0xa0, 0x4b, 0x96, 0x2c, 0x59, 0x59, 0xc5, 0x7d, 0x8b, 0xae, 0xaa, 0x99, 0x38, 0x71, 0x48, + 0x88, 0x1a, 0xaa, 0xee, 0x66, 0xce, 0x9c, 0xef, 0xfb, 0xce, 0xef, 0xa0, 0x67, 0x9d, 0xa7, 0x1c, + 0x13, 0x6a, 0x75, 0x7a, 0x2d, 0x60, 0x21, 0x08, 0xe0, 0x56, 0x1f, 0xc2, 0x36, 0x65, 0x56, 0xfa, + 0xe0, 0x46, 0xc4, 0x0a, 0x41, 0x7c, 0xa4, 0xac, 0x43, 0x42, 0xdf, 0xea, 0xd7, 0x2d, 0x1f, 0x42, + 0x60, 0xae, 0x80, 0x36, 0x8e, 0x18, 0x15, 0x54, 0xaf, 0x0c, 0x3c, 0xb1, 0x1b, 0x11, 0x9c, 0x79, + 0xe2, 0x7e, 0x7d, 0x7d, 0xcb, 0x27, 0xe2, 0xb8, 0xd7, 0xc2, 0x1e, 0x0d, 0x2c, 0x9f, 0xfa, 0xd4, + 0x52, 0x80, 0x56, 0xef, 0x48, 0xdd, 0xd4, 0x45, 0x9d, 0x06, 0x44, 0xeb, 0xe6, 0x98, 0xa4, 0x47, + 0x19, 0xdc, 0x22, 0xb6, 0xbe, 0x35, 0xe6, 0x03, 0xa7, 0x02, 0x42, 0x4e, 0x68, 0xc8, 0xad, 0x7e, + 0xbd, 0x05, 0xc2, 0x9d, 0x76, 0x7f, 0x38, 0xe6, 0x1e, 0xd1, 0x2e, 0xf1, 0xce, 0x66, 0xba, 0x3e, + 0xce, 0x5c, 0x03, 0xd7, 0x3b, 0x26, 0x21, 0xb0, 0x33, 0x2b, 0xea, 0xf8, 0xd2, 0xc0, 0xad, 0x00, + 0x84, 0x7b, 0x5b, 0x3c, 0xd6, 0x2c, 0x14, 0xeb, 0x85, 0x82, 0x04, 0x30, 0x05, 0x78, 0xf2, 0x3b, + 0x00, 0xf7, 0x8e, 0x21, 0x70, 0xa7, 0x70, 0x3b, 0xb3, 0x70, 0x3d, 0x41, 0xba, 0x16, 0x09, 0x05, + 0x17, 0x6c, 0x12, 0x64, 0x1e, 0xa0, 0x62, 0xa3, 0x69, 0x77, 0xa9, 0xd7, 0xd1, 0x6b, 0xa8, 0xe0, + 0x91, 0x36, 0xab, 0x68, 0x35, 0x6d, 0x63, 0xd9, 0xfe, 0xe7, 0x22, 0xae, 0xe6, 0x92, 0xb8, 0x5a, + 0x78, 0xde, 0x78, 0xe1, 0x38, 0xea, 0x45, 0x37, 0xd1, 0x12, 0x9c, 0x7a, 0x10, 0x89, 0x4a, 0xbe, + 0xb6, 0xb0, 0xb1, 0x6c, 0xa3, 0x24, 0xae, 0x2e, 0xbd, 0x54, 0x16, 0x27, 0x7d, 0x31, 0xbf, 0x69, + 0x68, 0x65, 0x7f, 0xd0, 0xe3, 0xa6, 0x2a, 0xa7, 0xfe, 0x01, 0x95, 0x64, 0x6d, 0xda, 0xae, 0x70, + 0x15, 0x77, 0x79, 0xfb, 0x11, 0xce, 0x06, 0x62, 0x14, 0x2a, 0x8e, 0x3a, 0xbe, 0x34, 0x70, 0x2c, + 0xbd, 0x71, 0xbf, 0x8e, 0x0f, 0x5a, 0x27, 0xe0, 0x89, 0x3d, 0x10, 0xae, 0xad, 0xa7, 0xd1, 0xa0, + 0xcc, 0xe6, 0x8c, 0x58, 0xf5, 0x3d, 0x54, 0xe0, 0x11, 0x78, 0x95, 0xbc, 0x62, 0xdf, 0xc4, 0xb3, + 0xc6, 0x0d, 0xdf, 0x08, 0xec, 0x30, 0x02, 0x2f, 0x4b, 0x53, 0xde, 0x1c, 0x45, 0x63, 0x7e, 0xd5, + 0x50, 0xe5, 0x86, 0x67, 0x23, 0xf4, 0x19, 0x70, 0xee, 0xf4, 0xba, 0xa0, 0x37, 0xd1, 0x62, 0x44, + 0x99, 0xe0, 0x15, 0xad, 0xb6, 0x70, 0x07, 0xb1, 0x26, 0x65, 0xc2, 0x5e, 0x49, 0xc5, 0x16, 0xe5, + 0x8d, 0x3b, 0x03, 0x22, 0x19, 0xfd, 0x11, 0xa3, 0x81, 0xaa, 0xe9, 0x1d, 0x08, 0x01, 0x58, 0x16, + 0xfd, 0x2b, 0x46, 0x03, 0x47, 0xd1, 0x98, 0xe7, 0x1a, 0x5a, 0xbb, 0xe1, 0xb9, 0x4b, 0xb8, 0xd0, + 0xdf, 0x4d, 0x35, 0x01, 0xcf, 0xd7, 0x04, 0x89, 0x56, 0x2d, 0xf8, 0x37, 0xd5, 0x2a, 0x0d, 0x2d, + 0x63, 0x0d, 0xd8, 0x45, 0x8b, 0x44, 0x40, 0xc0, 0xd3, 0x1c, 0x1e, 0xcc, 0x99, 0x43, 0x56, 0x90, + 0x86, 0x44, 0x3b, 0x03, 0x12, 0xf3, 0x3c, 0x3f, 0x91, 0x81, 0xcc, 0x55, 0x3f, 0x42, 0xe5, 0x88, + 0xb6, 0x0f, 0xa1, 0x0b, 0x9e, 0xa0, 0x2c, 0x4d, 0x62, 0x67, 0xce, 0x24, 0xdc, 0x16, 0x74, 0x87, + 0x50, 0x7b, 0x35, 0x89, 0xab, 0xe5, 0x66, 0xc6, 0xe5, 0x8c, 0x13, 0xeb, 0xa7, 0x68, 0x2d, 0x74, + 0x03, 0xe0, 0x91, 0xeb, 0xc1, 0x48, 0x2d, 0xff, 0xe7, 0x6a, 0xff, 0x27, 0x71, 0x75, 0x6d, 0x7f, + 0x92, 0xd1, 0x99, 0x16, 0xd1, 0xdf, 0xa0, 0x22, 0x89, 0xd4, 0x2e, 0x56, 0x16, 0x94, 0xde, 0xfd, + 0xd9, 0x75, 0x4c, 0x97, 0xd6, 0x2e, 0x27, 0x71, 0x75, 0xb8, 0xc1, 0xce, 0x10, 0x6e, 0x7e, 0x99, + 0x9c, 0x01, 0x39, 0x70, 0xfa, 0x6b, 0x54, 0x52, 0x4b, 0xef, 0xd1, 0x6e, 0xba, 0xe4, 0x9b, 0xb2, + 0x9f, 0xcd, 0xd4, 0xf6, 0x33, 0xae, 0xde, 0x9b, 0xfe, 0x5f, 0xf1, 0xf0, 0xd9, 0x19, 0x81, 0xf5, + 0x7d, 0x54, 0x90, 0xa3, 0x9b, 0x56, 0x65, 0xf6, 0x36, 0xcb, 0x8f, 0x07, 0x0f, 0x3e, 0x1e, 0xdc, + 0x08, 0xc5, 0x01, 0x3b, 0x14, 0x8c, 0x84, 0xbe, 0x5d, 0x92, 0x23, 0x2b, 0x43, 0x72, 0x14, 0x8f, + 0x19, 0x4f, 0x86, 0x2b, 0x97, 0x51, 0x3f, 0xf9, 0x6b, 0x0d, 0xff, 0x2f, 0x1d, 0xb3, 0xd9, 0x4d, + 0x7f, 0x8f, 0x8a, 0x64, 0xb0, 0xe4, 0xe9, 0x08, 0x6f, 0xcf, 0x39, 0xc2, 0x63, 0x5f, 0x83, 0xbd, + 0x9a, 0xca, 0x14, 0x87, 0xc6, 0x21, 0xa7, 0xbd, 0x71, 0x71, 0x6d, 0xe4, 0x2e, 0xaf, 0x8d, 0xdc, + 0xd5, 0xb5, 0x91, 0xfb, 0x94, 0x18, 0xda, 0x45, 0x62, 0x68, 0x97, 0x89, 0xa1, 0x5d, 0x25, 0x86, + 0xf6, 0x3d, 0x31, 0xb4, 0xcf, 0x3f, 0x8c, 0xdc, 0xdb, 0x7c, 0xbf, 0xfe, 0x2b, 0x00, 0x00, 0xff, + 0xff, 0x3b, 0x3f, 0x8c, 0x26, 0x6e, 0x07, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/networking/v1/generated.proto b/staging/src/k8s.io/api/networking/v1/generated.proto index 0c0e5bc6af128..2dee2c9f78b4b 100644 --- a/staging/src/k8s.io/api/networking/v1/generated.proto +++ b/staging/src/k8s.io/api/networking/v1/generated.proto @@ -32,6 +32,21 @@ import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1"; +// IPBlock describes a particular CIDR (Ex. "192.168.1.1/24") that is allowed to the pods +// matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should +// not be included within this rule. +message IPBlock { + // CIDR is a string representing the IP Block + // Valid examples are "192.168.1.1/24" + optional string cidr = 1; + + // Except is a slice of CIDRs that should not be included within an IP Block + // Valid examples are "192.168.1.1/24" + // Except values will be rejected if they are outside the CIDR range + // +optional + repeated string except = 2; +} + // NetworkPolicy describes what network traffic is allowed for a set of Pods message NetworkPolicy { // Standard object's metadata. @@ -89,6 +104,10 @@ message NetworkPolicyPeer { // selector semantics. If present but empty, this selector selects all namespaces. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector namespaceSelector = 2; + + // IPBlock defines policy on a particular IPBlock + // +optional + optional IPBlock ipBlock = 3; } // NetworkPolicyPort describes a port to allow traffic on diff --git a/staging/src/k8s.io/api/networking/v1/types.generated.go b/staging/src/k8s.io/api/networking/v1/types.generated.go index 6b89e36d7da66..d81d40a22f7ca 100644 --- a/staging/src/k8s.io/api/networking/v1/types.generated.go +++ b/staging/src/k8s.io/api/networking/v1/types.generated.go @@ -1196,7 +1196,7 @@ func (x *NetworkPolicyPort) codecDecodeSelfFromArray(l int, d *codec1978.Decoder z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } -func (x *NetworkPolicyPeer) CodecEncodeSelf(e *codec1978.Encoder) { +func (x *IPBlock) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) _, _, _ = h, z, r @@ -1213,11 +1213,254 @@ func (x *NetworkPolicyPeer) CodecEncodeSelf(e *codec1978.Encoder) { var yyq2 [2]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false + yyq2[1] = len(x.Except) != 0 + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(2) + } else { + yynn2 = 1 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yym4 := z.EncBinary() + _ = yym4 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.CIDR)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("cidr")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.CIDR)) + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[1] { + if x.Except == nil { + r.EncodeNil() + } else { + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + z.F.EncSliceStringV(x.Except, false, e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("except")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Except == nil { + r.EncodeNil() + } else { + yym8 := z.EncBinary() + _ = yym8 + if false { + } else { + z.F.EncSliceStringV(x.Except, false, e) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *IPBlock) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *IPBlock) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "cidr": + if r.TryDecodeAsNil() { + x.CIDR = "" + } else { + yyv4 := &x.CIDR + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*string)(yyv4)) = r.DecodeString() + } + } + case "except": + if r.TryDecodeAsNil() { + x.Except = nil + } else { + yyv6 := &x.Except + yym7 := z.DecBinary() + _ = yym7 + if false { + } else { + z.F.DecSliceStringX(yyv6, false, d) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *IPBlock) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj8 int + var yyb8 bool + var yyhl8 bool = l >= 0 + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.CIDR = "" + } else { + yyv9 := &x.CIDR + yym10 := z.DecBinary() + _ = yym10 + if false { + } else { + *((*string)(yyv9)) = r.DecodeString() + } + } + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Except = nil + } else { + yyv11 := &x.Except + yym12 := z.DecBinary() + _ = yym12 + if false { + } else { + z.F.DecSliceStringX(yyv11, false, d) + } + } + for { + yyj8++ + if yyhl8 { + yyb8 = yyj8 > l + } else { + yyb8 = r.CheckBreak() + } + if yyb8 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj8-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *NetworkPolicyPeer) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [3]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false yyq2[0] = x.PodSelector != nil yyq2[1] = x.NamespaceSelector != nil + yyq2[2] = x.IPBlock != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(2) + r.EncodeArrayStart(3) } else { yynn2 = 0 for _, b := range yyq2 { @@ -1298,6 +1541,29 @@ func (x *NetworkPolicyPeer) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + if x.IPBlock == nil { + r.EncodeNil() + } else { + x.IPBlock.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("ipBlock")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.IPBlock == nil { + r.EncodeNil() + } else { + x.IPBlock.CodecEncodeSelf(e) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -1393,6 +1659,17 @@ func (x *NetworkPolicyPeer) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) z.DecFallback(x.NamespaceSelector, false) } } + case "ipBlock": + if r.TryDecodeAsNil() { + if x.IPBlock != nil { + x.IPBlock = nil + } + } else { + if x.IPBlock == nil { + x.IPBlock = new(IPBlock) + } + x.IPBlock.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -1404,16 +1681,16 @@ func (x *NetworkPolicyPeer) codecDecodeSelfFromArray(l int, d *codec1978.Decoder var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj8 int - var yyb8 bool - var yyhl8 bool = l >= 0 - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + var yyj9 int + var yyb9 bool + var yyhl9 bool = l >= 0 + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l } else { - yyb8 = r.CheckBreak() + yyb9 = r.CheckBreak() } - if yyb8 { + if yyb9 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -1426,21 +1703,21 @@ func (x *NetworkPolicyPeer) codecDecodeSelfFromArray(l int, d *codec1978.Decoder if x.PodSelector == nil { x.PodSelector = new(pkg1_v1.LabelSelector) } - yym10 := z.DecBinary() - _ = yym10 + yym11 := z.DecBinary() + _ = yym11 if false { } else if z.HasExtensions() && z.DecExt(x.PodSelector) { } else { z.DecFallback(x.PodSelector, false) } } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l } else { - yyb8 = r.CheckBreak() + yyb9 = r.CheckBreak() } - if yyb8 { + if yyb9 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -1453,26 +1730,47 @@ func (x *NetworkPolicyPeer) codecDecodeSelfFromArray(l int, d *codec1978.Decoder if x.NamespaceSelector == nil { x.NamespaceSelector = new(pkg1_v1.LabelSelector) } - yym12 := z.DecBinary() - _ = yym12 + yym13 := z.DecBinary() + _ = yym13 if false { } else if z.HasExtensions() && z.DecExt(x.NamespaceSelector) { } else { z.DecFallback(x.NamespaceSelector, false) } } + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l + } else { + yyb9 = r.CheckBreak() + } + if yyb9 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.IPBlock != nil { + x.IPBlock = nil + } + } else { + if x.IPBlock == nil { + x.IPBlock = new(IPBlock) + } + x.IPBlock.CodecDecodeSelf(d) + } for { - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + yyj9++ + if yyhl9 { + yyb9 = yyj9 > l } else { - yyb8 = r.CheckBreak() + yyb9 = r.CheckBreak() } - if yyb8 { + if yyb9 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj8-1, "") + z.DecStructFieldNotFound(yyj9-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -2122,7 +2420,7 @@ func (x codecSelfer1234) decSliceNetworkPolicyPeer(v *[]NetworkPolicyPeer, d *co yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 16) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 24) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/api/networking/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/networking/v1/types_swagger_doc_generated.go index c3c9116313f92..87170082d6dc0 100644 --- a/staging/src/k8s.io/api/networking/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/networking/v1/types_swagger_doc_generated.go @@ -27,6 +27,16 @@ package v1 // Those methods can be generated by using hack/update-generated-swagger-docs.sh // AUTO-GENERATED FUNCTIONS START HERE +var map_IPBlock = map[string]string{ + "": "IPBlock describes a particular CIDR (Ex. \"192.168.1.1/24\") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.", + "cidr": "CIDR is a string representing the IP Block Valid examples are \"192.168.1.1/24\"", + "except": "Except is a slice of CIDRs that should not be included within an IP Block Valid examples are \"192.168.1.1/24\" Except values will be rejected if they are outside the CIDR range", +} + +func (IPBlock) SwaggerDoc() map[string]string { + return map_IPBlock +} + var map_NetworkPolicy = map[string]string{ "": "NetworkPolicy describes what network traffic is allowed for a set of Pods", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", @@ -61,6 +71,7 @@ var map_NetworkPolicyPeer = map[string]string{ "": "NetworkPolicyPeer describes a peer to allow traffic from. Exactly one of its fields must be specified.", "podSelector": "This is a label selector which selects Pods in this namespace. This field follows standard label selector semantics. If present but empty, this selector selects all pods in this namespace.", "namespaceSelector": "Selects Namespaces using cluster scoped-labels. This matches all pods in all namespaces selected by this label selector. This field follows standard label selector semantics. If present but empty, this selector selects all namespaces.", + "ipBlock": "IPBlock defines policy on a particular IPBlock", } func (NetworkPolicyPeer) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/networking/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/networking/v1/zz_generated.deepcopy.go index f6a0a5f809e33..94948b14168e1 100644 --- a/staging/src/k8s.io/api/networking/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/networking/v1/zz_generated.deepcopy.go @@ -39,6 +39,10 @@ func init() { // Deprecated: deepcopy registration will go away when static deepcopy is fully implemented. func RegisterDeepCopies(scheme *runtime.Scheme) error { return scheme.AddGeneratedDeepCopyFuncs( + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*IPBlock).DeepCopyInto(out.(*IPBlock)) + return nil + }, InType: reflect.TypeOf(&IPBlock{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*NetworkPolicy).DeepCopyInto(out.(*NetworkPolicy)) return nil @@ -66,6 +70,27 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { ) } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IPBlock) DeepCopyInto(out *IPBlock) { + *out = *in + if in.Except != nil { + in, out := &in.Except, &out.Except + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPBlock. +func (in *IPBlock) DeepCopy() *IPBlock { + if in == nil { + return nil + } + out := new(IPBlock) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NetworkPolicy) DeepCopyInto(out *NetworkPolicy) { *out = *in @@ -179,6 +204,15 @@ func (in *NetworkPolicyPeer) DeepCopyInto(out *NetworkPolicyPeer) { (*in).DeepCopyInto(*out) } } + if in.IPBlock != nil { + in, out := &in.IPBlock, &out.IPBlock + if *in == nil { + *out = nil + } else { + *out = new(IPBlock) + (*in).DeepCopyInto(*out) + } + } return } From d433ecd6cb6d9e545d157eedd0c143ea9f299c82 Mon Sep 17 00:00:00 2001 From: Yassine TIJANI Date: Thu, 24 Aug 2017 17:11:06 +0200 Subject: [PATCH 287/403] cleaning dettach logic since it's not needed --- pkg/volume/cinder/cinder.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pkg/volume/cinder/cinder.go b/pkg/volume/cinder/cinder.go index 034a5f8e8cdde..ca9f8c9a01403 100644 --- a/pkg/volume/cinder/cinder.go +++ b/pkg/volume/cinder/cinder.go @@ -276,13 +276,6 @@ type cinderVolume struct { volume.MetricsNil } -func detachDiskLogError(cd *cinderVolume) { - err := cd.manager.DetachDisk(&cinderVolumeUnmounter{cd}) - if err != nil { - glog.Warningf("Failed to detach disk: %v (%v)", cd, err) - } -} - func (b *cinderVolumeMounter) GetAttributes() volume.Attributes { return volume.Attributes{ ReadOnly: b.readOnly, @@ -309,7 +302,6 @@ func (b *cinderVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { b.plugin.volumeLocks.LockKey(b.pdName) defer b.plugin.volumeLocks.UnlockKey(b.pdName) - // TODO: handle failed mounts here. notmnt, err := b.mounter.IsLikelyNotMountPoint(dir) if err != nil && !os.IsNotExist(err) { glog.Errorf("Cannot validate mount point: %s %v", dir, err) @@ -327,9 +319,7 @@ func (b *cinderVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { } if err := os.MkdirAll(dir, 0750); err != nil { - // TODO: we should really eject the attach/detach out into its own control loop. glog.V(4).Infof("Could not create directory %s: %v", dir, err) - detachDiskLogError(b.cinderVolume) return err } @@ -360,8 +350,6 @@ func (b *cinderVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { } } os.Remove(dir) - // TODO: we should really eject the attach/detach out into its own control loop. - detachDiskLogError(b.cinderVolume) glog.Errorf("Failed to mount %s: %v", dir, err) return err } From 1e837a9387c0067478ee31713ab6397daa6c0449 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Thu, 24 Aug 2017 11:22:12 -0700 Subject: [PATCH 288/403] add unit test --- .../initialization/initialization_test.go | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/plugin/pkg/admission/initialization/initialization_test.go b/plugin/pkg/admission/initialization/initialization_test.go index 8f871993919cf..cd8728379f25d 100644 --- a/plugin/pkg/admission/initialization/initialization_test.go +++ b/plugin/pkg/admission/initialization/initialization_test.go @@ -18,10 +18,17 @@ package initialization import ( "reflect" + "strings" "testing" "k8s.io/api/admissionregistration/v1alpha1" + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/authorization/authorizer" ) func newInitializer(name string, rules ...v1alpha1.Rule) *v1alpha1.InitializerConfiguration { @@ -97,3 +104,75 @@ func TestFindInitializers(t *testing.T) { }) } } + +type fakeAuthorizer struct { + accept bool +} + +func (f *fakeAuthorizer) Authorize(a authorizer.Attributes) (bool, string, error) { + if f.accept { + return true, "", nil + } + return false, "denied", nil +} + +func TestAdmitUpdate(t *testing.T) { + tests := []struct { + name string + oldInitializers *metav1.Initializers + newInitializers *metav1.Initializers + verifyUpdatedObj func(runtime.Object) (pass bool, reason string) + err string + }{ + { + name: "updates on initialized resources are allowed", + oldInitializers: nil, + newInitializers: nil, + err: "", + }, + { + name: "updates on initialized resources are allowed", + oldInitializers: &metav1.Initializers{Pending: []metav1.Initializer{{Name: "init.k8s.io"}}}, + newInitializers: &metav1.Initializers{}, + verifyUpdatedObj: func(obj runtime.Object) (bool, string) { + accessor, err := meta.Accessor(obj) + if err != nil { + return false, "cannot get accessor" + } + if accessor.GetInitializers() != nil { + return false, "expect nil initializers" + } + return true, "" + }, + err: "", + }, + { + name: "initializers may not be set once initialized", + oldInitializers: nil, + newInitializers: &metav1.Initializers{Pending: []metav1.Initializer{{Name: "init.k8s.io"}}}, + err: "field is immutable once initialization has completed", + }, + } + + plugin := initializer{ + config: nil, + authorizer: &fakeAuthorizer{true}, + } + for _, tc := range tests { + oldObj := &v1.Pod{} + oldObj.Initializers = tc.oldInitializers + newObj := &v1.Pod{} + newObj.Initializers = tc.newInitializers + a := admission.NewAttributesRecord(newObj, oldObj, schema.GroupVersionKind{}, "", "foo", schema.GroupVersionResource{}, "", admission.Update, nil) + err := plugin.Admit(a) + switch { + case tc.err == "" && err != nil: + t.Errorf("%q: unexpected error: %v", tc.name, err) + case tc.err != "" && err == nil: + t.Errorf("%q: unexpected no error, expected %s", tc.name, tc.err) + case tc.err != "" && err != nil && !strings.Contains(err.Error(), tc.err): + t.Errorf("%q: expected %s, got %v", tc.name, tc.err, err) + } + } + +} From 14dc1d8cb1c80affe6a76105fc326f2bafe82950 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Tue, 22 Aug 2017 10:34:54 -0700 Subject: [PATCH 289/403] generated --- api/openapi-spec/swagger.json | 4 +++- federation/apis/openapi-spec/swagger.json | 4 +++- plugin/pkg/admission/initialization/BUILD | 6 ++++++ .../k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto | 2 ++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 82b161ba2574d..51b4790bd0c75 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -65682,7 +65682,9 @@ "type": "array", "items": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Initializer" - } + }, + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" }, "result": { "description": "If result is set with the Failure field, the object will be persisted to storage and then deleted, ensuring that other clients can observe the deletion.", diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index 7fc8d68e2da3a..1169aa6b285d1 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -13414,7 +13414,9 @@ "type": "array", "items": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Initializer" - } + }, + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" }, "result": { "description": "If result is set with the Failure field, the object will be persisted to storage and then deleted, ensuring that other clients can observe the deletion.", diff --git a/plugin/pkg/admission/initialization/BUILD b/plugin/pkg/admission/initialization/BUILD index 54529cc258b1a..60047ceb63323 100644 --- a/plugin/pkg/admission/initialization/BUILD +++ b/plugin/pkg/admission/initialization/BUILD @@ -46,6 +46,12 @@ go_test( library = ":go_default_library", deps = [ "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", ], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto index 83b9eb14bb22b..c6a9edd380188 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto @@ -250,6 +250,8 @@ message Initializers { // When the last pending initializer is removed, and no failing result is set, the initializers // struct will be set to nil and the object is considered as initialized and visible to all // clients. + // +patchMergeKey=name + // +patchStrategy=merge repeated Initializer pending = 1; // If result is set with the Failure field, the object will be persisted to storage and then deleted, From 795d09a800ad1e62b5df725063787d02c6a35e6b Mon Sep 17 00:00:00 2001 From: Jeff Grafton Date: Tue, 22 Aug 2017 12:17:39 -0700 Subject: [PATCH 290/403] Always create vendor/BUILD in hack/update-bazel.sh --- hack/update-bazel.sh | 2 ++ hack/verify-bazel.sh | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/hack/update-bazel.sh b/hack/update-bazel.sh index af46f0515b323..c3f9c13255528 100755 --- a/hack/update-bazel.sh +++ b/hack/update-bazel.sh @@ -28,5 +28,7 @@ rm -f "${KUBE_ROOT}/pkg/generated/openapi/zz_generated.openapi.go" kube::util::go_install_from_commit github.com/kubernetes/repo-infra/kazel 4eaf9e671bbb549fb4ec292cf251f921d7ef80ac kube::util::go_install_from_commit github.com/bazelbuild/rules_go/go/tools/gazelle/gazelle 82483596ec203eb9c1849937636f4cbed83733eb +touch "${KUBE_ROOT}/vendor/BUILD" + gazelle fix -build_file_name=BUILD,BUILD.bazel -external=vendored -mode=fix -repo_root="$(kube::realpath ${KUBE_ROOT})" kazel -root="$(kube::realpath ${KUBE_ROOT})" diff --git a/hack/verify-bazel.sh b/hack/verify-bazel.sh index ff70559e39e4c..e51e8ccf689e1 100755 --- a/hack/verify-bazel.sh +++ b/hack/verify-bazel.sh @@ -20,6 +20,13 @@ set -o pipefail export KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. source "${KUBE_ROOT}/hack/lib/init.sh" +if [[ ! -f "${KUBE_ROOT}/vendor/BUILD" ]]; then + echo "${KUBE_ROOT}/vendor/BUILD does not exist." + echo + echo "Run ./hack/update-bazel.sh" + exit 1 +fi + # Remove generated files prior to running kazel. # TODO(spxtr): Remove this line once Bazel is the only way to build. rm -f "${KUBE_ROOT}/pkg/generated/openapi/zz_generated.openapi.go" From 2a869d89d8f4198814257f2fd351cb94e8ec8f37 Mon Sep 17 00:00:00 2001 From: Jeff Grafton Date: Thu, 24 Aug 2017 14:07:21 -0700 Subject: [PATCH 291/403] Regenerate the vendor/BUILD file --- build/root/BUILD.root | 379 +--------------------------------------- vendor/BUILD | 393 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 394 insertions(+), 378 deletions(-) create mode 100644 vendor/BUILD diff --git a/build/root/BUILD.root b/build/root/BUILD.root index 773defc3b9ec6..56627f257dd76 100644 --- a/build/root/BUILD.root +++ b/build/root/BUILD.root @@ -69,384 +69,7 @@ filegroup( "//staging:all-srcs", "//test:all-srcs", "//third_party:all-srcs", - "//vendor/bitbucket.org/bertimus9/systemstat:all-srcs", - "//vendor/bitbucket.org/ww/goautoneg:all-srcs", - "//vendor/cloud.google.com/go/compute/metadata:all-srcs", - "//vendor/cloud.google.com/go/internal:all-srcs", - "//vendor/github.com/Azure/azure-sdk-for-go/arm/compute:all-srcs", - "//vendor/github.com/Azure/azure-sdk-for-go/arm/containerregistry:all-srcs", - "//vendor/github.com/Azure/azure-sdk-for-go/arm/disk:all-srcs", - "//vendor/github.com/Azure/azure-sdk-for-go/arm/network:all-srcs", - "//vendor/github.com/Azure/azure-sdk-for-go/arm/storage:all-srcs", - "//vendor/github.com/Azure/azure-sdk-for-go/storage:all-srcs", - "//vendor/github.com/Azure/go-ansiterm:all-srcs", - "//vendor/github.com/Azure/go-autorest/autorest:all-srcs", - "//vendor/github.com/MakeNowJust/heredoc:all-srcs", - "//vendor/github.com/Microsoft/go-winio:all-srcs", - "//vendor/github.com/NYTimes/gziphandler:all-srcs", - "//vendor/github.com/PuerkitoBio/purell:all-srcs", - "//vendor/github.com/PuerkitoBio/urlesc:all-srcs", - "//vendor/github.com/Sirupsen/logrus:all-srcs", - "//vendor/github.com/abbot/go-http-auth:all-srcs", - "//vendor/github.com/appc/spec/schema:all-srcs", - "//vendor/github.com/armon/circbuf:all-srcs", - "//vendor/github.com/asaskevich/govalidator:all-srcs", - "//vendor/github.com/aws/aws-sdk-go/aws:all-srcs", - "//vendor/github.com/aws/aws-sdk-go/private/protocol:all-srcs", - "//vendor/github.com/aws/aws-sdk-go/private/waiter:all-srcs", - "//vendor/github.com/aws/aws-sdk-go/service/autoscaling:all-srcs", - "//vendor/github.com/aws/aws-sdk-go/service/ec2:all-srcs", - "//vendor/github.com/aws/aws-sdk-go/service/ecr:all-srcs", - "//vendor/github.com/aws/aws-sdk-go/service/elb:all-srcs", - "//vendor/github.com/aws/aws-sdk-go/service/route53:all-srcs", - "//vendor/github.com/aws/aws-sdk-go/service/sts:all-srcs", - "//vendor/github.com/beorn7/perks/quantile:all-srcs", - "//vendor/github.com/blang/semver:all-srcs", - "//vendor/github.com/boltdb/bolt:all-srcs", - "//vendor/github.com/chai2010/gettext-go/gettext:all-srcs", - "//vendor/github.com/cloudflare/cfssl/auth:all-srcs", - "//vendor/github.com/cloudflare/cfssl/certdb:all-srcs", - "//vendor/github.com/cloudflare/cfssl/config:all-srcs", - "//vendor/github.com/cloudflare/cfssl/crypto/pkcs7:all-srcs", - "//vendor/github.com/cloudflare/cfssl/csr:all-srcs", - "//vendor/github.com/cloudflare/cfssl/errors:all-srcs", - "//vendor/github.com/cloudflare/cfssl/helpers:all-srcs", - "//vendor/github.com/cloudflare/cfssl/info:all-srcs", - "//vendor/github.com/cloudflare/cfssl/log:all-srcs", - "//vendor/github.com/cloudflare/cfssl/ocsp/config:all-srcs", - "//vendor/github.com/cloudflare/cfssl/signer:all-srcs", - "//vendor/github.com/clusterhq/flocker-go:all-srcs", - "//vendor/github.com/codedellemc/goscaleio:all-srcs", - "//vendor/github.com/codegangsta/negroni:all-srcs", - "//vendor/github.com/containernetworking/cni/libcni:all-srcs", - "//vendor/github.com/containernetworking/cni/pkg/invoke:all-srcs", - "//vendor/github.com/containernetworking/cni/pkg/types:all-srcs", - "//vendor/github.com/containernetworking/cni/pkg/version:all-srcs", - "//vendor/github.com/coreos/etcd/alarm:all-srcs", - "//vendor/github.com/coreos/etcd/auth:all-srcs", - "//vendor/github.com/coreos/etcd/client:all-srcs", - "//vendor/github.com/coreos/etcd/clientv3:all-srcs", - "//vendor/github.com/coreos/etcd/compactor:all-srcs", - "//vendor/github.com/coreos/etcd/discovery:all-srcs", - "//vendor/github.com/coreos/etcd/error:all-srcs", - "//vendor/github.com/coreos/etcd/etcdserver:all-srcs", - "//vendor/github.com/coreos/etcd/integration:all-srcs", - "//vendor/github.com/coreos/etcd/lease:all-srcs", - "//vendor/github.com/coreos/etcd/mvcc:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/adt:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/contention:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/cpuutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/crc:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/fileutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/httputil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/idutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/ioutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/logutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/monotime:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/netutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/pathutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/pbutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/runtime:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/schedule:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/testutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/tlsutil:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/transport:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/types:all-srcs", - "//vendor/github.com/coreos/etcd/pkg/wait:all-srcs", - "//vendor/github.com/coreos/etcd/proxy/grpcproxy:all-srcs", - "//vendor/github.com/coreos/etcd/raft:all-srcs", - "//vendor/github.com/coreos/etcd/rafthttp:all-srcs", - "//vendor/github.com/coreos/etcd/snap:all-srcs", - "//vendor/github.com/coreos/etcd/store:all-srcs", - "//vendor/github.com/coreos/etcd/version:all-srcs", - "//vendor/github.com/coreos/etcd/wal:all-srcs", - "//vendor/github.com/coreos/go-oidc/http:all-srcs", - "//vendor/github.com/coreos/go-oidc/jose:all-srcs", - "//vendor/github.com/coreos/go-oidc/key:all-srcs", - "//vendor/github.com/coreos/go-oidc/oauth2:all-srcs", - "//vendor/github.com/coreos/go-oidc/oidc:all-srcs", - "//vendor/github.com/coreos/go-semver/semver:all-srcs", - "//vendor/github.com/coreos/go-systemd/daemon:all-srcs", - "//vendor/github.com/coreos/go-systemd/dbus:all-srcs", - "//vendor/github.com/coreos/go-systemd/journal:all-srcs", - "//vendor/github.com/coreos/go-systemd/unit:all-srcs", - "//vendor/github.com/coreos/go-systemd/util:all-srcs", - "//vendor/github.com/coreos/pkg/capnslog:all-srcs", - "//vendor/github.com/coreos/pkg/dlopen:all-srcs", - "//vendor/github.com/coreos/pkg/health:all-srcs", - "//vendor/github.com/coreos/pkg/httputil:all-srcs", - "//vendor/github.com/coreos/pkg/timeutil:all-srcs", - "//vendor/github.com/coreos/rkt/api/v1alpha:all-srcs", - "//vendor/github.com/cpuguy83/go-md2man/md2man:all-srcs", - "//vendor/github.com/davecgh/go-spew/spew:all-srcs", - "//vendor/github.com/daviddengcn/go-colortext:all-srcs", - "//vendor/github.com/dgrijalva/jwt-go:all-srcs", - "//vendor/github.com/docker/distribution/digest:all-srcs", - "//vendor/github.com/docker/distribution/reference:all-srcs", - "//vendor/github.com/docker/docker/api/types:all-srcs", - "//vendor/github.com/docker/docker/client:all-srcs", - "//vendor/github.com/docker/docker/pkg/jsonlog:all-srcs", - "//vendor/github.com/docker/docker/pkg/jsonmessage:all-srcs", - "//vendor/github.com/docker/docker/pkg/longpath:all-srcs", - "//vendor/github.com/docker/docker/pkg/mount:all-srcs", - "//vendor/github.com/docker/docker/pkg/stdcopy:all-srcs", - "//vendor/github.com/docker/docker/pkg/symlink:all-srcs", - "//vendor/github.com/docker/docker/pkg/system:all-srcs", - "//vendor/github.com/docker/docker/pkg/term:all-srcs", - "//vendor/github.com/docker/docker/pkg/tlsconfig:all-srcs", - "//vendor/github.com/docker/engine-api/client:all-srcs", - "//vendor/github.com/docker/engine-api/types:all-srcs", - "//vendor/github.com/docker/go-connections/nat:all-srcs", - "//vendor/github.com/docker/go-connections/sockets:all-srcs", - "//vendor/github.com/docker/go-connections/tlsconfig:all-srcs", - "//vendor/github.com/docker/go-units:all-srcs", - "//vendor/github.com/docker/spdystream:all-srcs", - "//vendor/github.com/elazarl/go-bindata-assetfs:all-srcs", - "//vendor/github.com/elazarl/goproxy:all-srcs", - "//vendor/github.com/emicklei/go-restful:all-srcs", - "//vendor/github.com/emicklei/go-restful-swagger12:all-srcs", - "//vendor/github.com/evanphx/json-patch:all-srcs", - "//vendor/github.com/exponent-io/jsonpath:all-srcs", - "//vendor/github.com/fatih/camelcase:all-srcs", - "//vendor/github.com/fsnotify/fsnotify:all-srcs", - "//vendor/github.com/garyburd/redigo/internal:all-srcs", - "//vendor/github.com/garyburd/redigo/redis:all-srcs", - "//vendor/github.com/ghodss/yaml:all-srcs", - "//vendor/github.com/go-ini/ini:all-srcs", - "//vendor/github.com/go-openapi/analysis:all-srcs", - "//vendor/github.com/go-openapi/errors:all-srcs", - "//vendor/github.com/go-openapi/jsonpointer:all-srcs", - "//vendor/github.com/go-openapi/jsonreference:all-srcs", - "//vendor/github.com/go-openapi/loads:all-srcs", - "//vendor/github.com/go-openapi/runtime:all-srcs", - "//vendor/github.com/go-openapi/spec:all-srcs", - "//vendor/github.com/go-openapi/strfmt:all-srcs", - "//vendor/github.com/go-openapi/swag:all-srcs", - "//vendor/github.com/go-openapi/validate:all-srcs", - "//vendor/github.com/godbus/dbus:all-srcs", - "//vendor/github.com/gogo/protobuf/gogoproto:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/compare:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/defaultcheck:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/description:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/embedcheck:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/enumstringer:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/equal:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/face:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/gostring:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/marshalto:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/oneofcheck:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/populate:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/size:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/stringer:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/testgen:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/union:all-srcs", - "//vendor/github.com/gogo/protobuf/plugin/unmarshal:all-srcs", - "//vendor/github.com/gogo/protobuf/proto:all-srcs", - "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor:all-srcs", - "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator:all-srcs", - "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/grpc:all-srcs", - "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/plugin:all-srcs", - "//vendor/github.com/gogo/protobuf/sortkeys:all-srcs", - "//vendor/github.com/gogo/protobuf/vanity:all-srcs", - "//vendor/github.com/golang/glog:all-srcs", - "//vendor/github.com/golang/groupcache/lru:all-srcs", - "//vendor/github.com/golang/mock/gomock:all-srcs", - "//vendor/github.com/golang/protobuf/jsonpb:all-srcs", - "//vendor/github.com/golang/protobuf/proto:all-srcs", - "//vendor/github.com/golang/protobuf/ptypes:all-srcs", - "//vendor/github.com/google/btree:all-srcs", - "//vendor/github.com/google/cadvisor/api:all-srcs", - "//vendor/github.com/google/cadvisor/cache/memory:all-srcs", - "//vendor/github.com/google/cadvisor/client/v2:all-srcs", - "//vendor/github.com/google/cadvisor/collector:all-srcs", - "//vendor/github.com/google/cadvisor/container:all-srcs", - "//vendor/github.com/google/cadvisor/devicemapper:all-srcs", - "//vendor/github.com/google/cadvisor/events:all-srcs", - "//vendor/github.com/google/cadvisor/fs:all-srcs", - "//vendor/github.com/google/cadvisor/healthz:all-srcs", - "//vendor/github.com/google/cadvisor/http:all-srcs", - "//vendor/github.com/google/cadvisor/info/v1:all-srcs", - "//vendor/github.com/google/cadvisor/info/v2:all-srcs", - "//vendor/github.com/google/cadvisor/machine:all-srcs", - "//vendor/github.com/google/cadvisor/manager:all-srcs", - "//vendor/github.com/google/cadvisor/metrics:all-srcs", - "//vendor/github.com/google/cadvisor/pages:all-srcs", - "//vendor/github.com/google/cadvisor/storage:all-srcs", - "//vendor/github.com/google/cadvisor/summary:all-srcs", - "//vendor/github.com/google/cadvisor/utils:all-srcs", - "//vendor/github.com/google/cadvisor/validate:all-srcs", - "//vendor/github.com/google/cadvisor/version:all-srcs", - "//vendor/github.com/google/cadvisor/zfs:all-srcs", - "//vendor/github.com/google/certificate-transparency/go:all-srcs", - "//vendor/github.com/google/gofuzz:all-srcs", - "//vendor/github.com/googleapis/gnostic/OpenAPIv2:all-srcs", - "//vendor/github.com/googleapis/gnostic/compiler:all-srcs", - "//vendor/github.com/googleapis/gnostic/extensions:all-srcs", - "//vendor/github.com/gophercloud/gophercloud:all-srcs", - "//vendor/github.com/gorilla/context:all-srcs", - "//vendor/github.com/gorilla/mux:all-srcs", - "//vendor/github.com/gorilla/websocket:all-srcs", - "//vendor/github.com/grpc-ecosystem/go-grpc-prometheus:all-srcs", - "//vendor/github.com/grpc-ecosystem/grpc-gateway/runtime:all-srcs", - "//vendor/github.com/grpc-ecosystem/grpc-gateway/utilities:all-srcs", - "//vendor/github.com/hashicorp/golang-lru:all-srcs", - "//vendor/github.com/hashicorp/hcl:all-srcs", - "//vendor/github.com/hawkular/hawkular-client-go/metrics:all-srcs", - "//vendor/github.com/heketi/heketi/client/api/go-client:all-srcs", - "//vendor/github.com/heketi/heketi/pkg/glusterfs/api:all-srcs", - "//vendor/github.com/heketi/heketi/pkg/utils:all-srcs", - "//vendor/github.com/howeyc/gopass:all-srcs", - "//vendor/github.com/imdario/mergo:all-srcs", - "//vendor/github.com/inconshreveable/mousetrap:all-srcs", - "//vendor/github.com/influxdata/influxdb/client:all-srcs", - "//vendor/github.com/influxdata/influxdb/models:all-srcs", - "//vendor/github.com/influxdata/influxdb/pkg/escape:all-srcs", - "//vendor/github.com/jmespath/go-jmespath:all-srcs", - "//vendor/github.com/jonboulle/clockwork:all-srcs", - "//vendor/github.com/jteeuwen/go-bindata:all-srcs", - "//vendor/github.com/juju/ratelimit:all-srcs", - "//vendor/github.com/kardianos/osext:all-srcs", - "//vendor/github.com/karlseguin/ccache:all-srcs", - "//vendor/github.com/kr/fs:all-srcs", - "//vendor/github.com/kr/pty:all-srcs", - "//vendor/github.com/libopenstorage/openstorage/api:all-srcs", - "//vendor/github.com/libopenstorage/openstorage/pkg/units:all-srcs", - "//vendor/github.com/libopenstorage/openstorage/volume:all-srcs", - "//vendor/github.com/lpabon/godbc:all-srcs", - "//vendor/github.com/magiconair/properties:all-srcs", - "//vendor/github.com/mailru/easyjson/buffer:all-srcs", - "//vendor/github.com/mailru/easyjson/jlexer:all-srcs", - "//vendor/github.com/mailru/easyjson/jwriter:all-srcs", - "//vendor/github.com/matttproud/golang_protobuf_extensions/pbutil:all-srcs", - "//vendor/github.com/miekg/coredns/middleware/etcd/msg:all-srcs", - "//vendor/github.com/miekg/dns:all-srcs", - "//vendor/github.com/mistifyio/go-zfs:all-srcs", - "//vendor/github.com/mitchellh/go-wordwrap:all-srcs", - "//vendor/github.com/mitchellh/mapstructure:all-srcs", - "//vendor/github.com/mreiferson/go-httpclient:all-srcs", - "//vendor/github.com/mvdan/xurls:all-srcs", - "//vendor/github.com/mxk/go-flowrate/flowrate:all-srcs", - "//vendor/github.com/onsi/ginkgo:all-srcs", - "//vendor/github.com/onsi/gomega:all-srcs", - "//vendor/github.com/opencontainers/runc/libcontainer:all-srcs", - "//vendor/github.com/pborman/uuid:all-srcs", - "//vendor/github.com/pelletier/go-buffruneio:all-srcs", - "//vendor/github.com/pelletier/go-toml:all-srcs", - "//vendor/github.com/pkg/errors:all-srcs", - "//vendor/github.com/pkg/sftp:all-srcs", - "//vendor/github.com/pmezard/go-difflib/difflib:all-srcs", - "//vendor/github.com/prometheus/client_golang/prometheus:all-srcs", - "//vendor/github.com/prometheus/client_model/go:all-srcs", - "//vendor/github.com/prometheus/common/expfmt:all-srcs", - "//vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg:all-srcs", - "//vendor/github.com/prometheus/common/model:all-srcs", - "//vendor/github.com/prometheus/procfs:all-srcs", - "//vendor/github.com/quobyte/api:all-srcs", - "//vendor/github.com/rackspace/gophercloud:all-srcs", - "//vendor/github.com/rancher/go-rancher/client:all-srcs", - "//vendor/github.com/renstrom/dedent:all-srcs", - "//vendor/github.com/robfig/cron:all-srcs", - "//vendor/github.com/rubiojr/go-vhd/vhd:all-srcs", - "//vendor/github.com/russross/blackfriday:all-srcs", - "//vendor/github.com/satori/uuid:all-srcs", - "//vendor/github.com/seccomp/libseccomp-golang:all-srcs", - "//vendor/github.com/shurcooL/sanitized_anchor_name:all-srcs", - "//vendor/github.com/spf13/afero:all-srcs", - "//vendor/github.com/spf13/cast:all-srcs", - "//vendor/github.com/spf13/cobra:all-srcs", - "//vendor/github.com/spf13/jwalterweatherman:all-srcs", - "//vendor/github.com/spf13/pflag:all-srcs", - "//vendor/github.com/spf13/viper:all-srcs", - "//vendor/github.com/square/go-jose:all-srcs", - "//vendor/github.com/storageos/go-api:all-srcs", - "//vendor/github.com/stretchr/objx:all-srcs", - "//vendor/github.com/stretchr/testify/assert:all-srcs", - "//vendor/github.com/stretchr/testify/mock:all-srcs", - "//vendor/github.com/stretchr/testify/require:all-srcs", - "//vendor/github.com/syndtr/gocapability/capability:all-srcs", - "//vendor/github.com/ugorji/go/codec:all-srcs", - "//vendor/github.com/vishvananda/netlink:all-srcs", - "//vendor/github.com/vmware/govmomi:all-srcs", - "//vendor/github.com/vmware/photon-controller-go-sdk/SSPI:all-srcs", - "//vendor/github.com/vmware/photon-controller-go-sdk/photon:all-srcs", - "//vendor/github.com/xanzy/go-cloudstack/cloudstack:all-srcs", - "//vendor/github.com/xiang90/probing:all-srcs", - "//vendor/github.com/xyproto/simpleredis:all-srcs", - "//vendor/go.pedge.io/pb/go/google/protobuf:all-srcs", - "//vendor/go4.org/errorutil:all-srcs", - "//vendor/golang.org/x/crypto/bcrypt:all-srcs", - "//vendor/golang.org/x/crypto/blowfish:all-srcs", - "//vendor/golang.org/x/crypto/curve25519:all-srcs", - "//vendor/golang.org/x/crypto/ed25519:all-srcs", - "//vendor/golang.org/x/crypto/nacl/secretbox:all-srcs", - "//vendor/golang.org/x/crypto/pkcs12:all-srcs", - "//vendor/golang.org/x/crypto/poly1305:all-srcs", - "//vendor/golang.org/x/crypto/salsa20/salsa:all-srcs", - "//vendor/golang.org/x/crypto/ssh:all-srcs", - "//vendor/golang.org/x/exp/inotify:all-srcs", - "//vendor/golang.org/x/net/context:all-srcs", - "//vendor/golang.org/x/net/html:all-srcs", - "//vendor/golang.org/x/net/http2:all-srcs", - "//vendor/golang.org/x/net/idna:all-srcs", - "//vendor/golang.org/x/net/internal/timeseries:all-srcs", - "//vendor/golang.org/x/net/lex/httplex:all-srcs", - "//vendor/golang.org/x/net/proxy:all-srcs", - "//vendor/golang.org/x/net/trace:all-srcs", - "//vendor/golang.org/x/net/websocket:all-srcs", - "//vendor/golang.org/x/oauth2:all-srcs", - "//vendor/golang.org/x/sys/unix:all-srcs", - "//vendor/golang.org/x/sys/windows:all-srcs", - "//vendor/golang.org/x/text/cases:all-srcs", - "//vendor/golang.org/x/text/encoding:all-srcs", - "//vendor/golang.org/x/text/internal:all-srcs", - "//vendor/golang.org/x/text/language:all-srcs", - "//vendor/golang.org/x/text/runes:all-srcs", - "//vendor/golang.org/x/text/secure/bidirule:all-srcs", - "//vendor/golang.org/x/text/secure/precis:all-srcs", - "//vendor/golang.org/x/text/transform:all-srcs", - "//vendor/golang.org/x/text/unicode/bidi:all-srcs", - "//vendor/golang.org/x/text/unicode/norm:all-srcs", - "//vendor/golang.org/x/text/width:all-srcs", - "//vendor/golang.org/x/time/rate:all-srcs", - "//vendor/golang.org/x/tools/container/intsets:all-srcs", - "//vendor/google.golang.org/api/cloudkms/v1:all-srcs", - "//vendor/google.golang.org/api/cloudmonitoring/v2beta2:all-srcs", - "//vendor/google.golang.org/api/compute/v0.alpha:all-srcs", - "//vendor/google.golang.org/api/compute/v0.beta:all-srcs", - "//vendor/google.golang.org/api/compute/v1:all-srcs", - "//vendor/google.golang.org/api/container/v1:all-srcs", - "//vendor/google.golang.org/api/dns/v1:all-srcs", - "//vendor/google.golang.org/api/gensupport:all-srcs", - "//vendor/google.golang.org/api/googleapi:all-srcs", - "//vendor/google.golang.org/api/logging/v2beta1:all-srcs", - "//vendor/google.golang.org/api/monitoring/v3:all-srcs", - "//vendor/google.golang.org/api/pubsub/v1:all-srcs", - "//vendor/google.golang.org/genproto/googleapis/rpc/status:all-srcs", - "//vendor/google.golang.org/grpc:all-srcs", - "//vendor/gopkg.in/gcfg.v1:all-srcs", - "//vendor/gopkg.in/inf.v0:all-srcs", - "//vendor/gopkg.in/natefinch/lumberjack.v2:all-srcs", - "//vendor/gopkg.in/warnings.v0:all-srcs", - "//vendor/gopkg.in/yaml.v2:all-srcs", - "//vendor/k8s.io/gengo/args:all-srcs", - "//vendor/k8s.io/gengo/examples/deepcopy-gen/generators:all-srcs", - "//vendor/k8s.io/gengo/examples/defaulter-gen/generators:all-srcs", - "//vendor/k8s.io/gengo/examples/import-boss/generators:all-srcs", - "//vendor/k8s.io/gengo/examples/set-gen/generators:all-srcs", - "//vendor/k8s.io/gengo/examples/set-gen/sets:all-srcs", - "//vendor/k8s.io/gengo/generator:all-srcs", - "//vendor/k8s.io/gengo/namer:all-srcs", - "//vendor/k8s.io/gengo/parser:all-srcs", - "//vendor/k8s.io/gengo/types:all-srcs", - "//vendor/k8s.io/heapster/metrics/api/v1/types:all-srcs", - "//vendor/k8s.io/kube-openapi/pkg/aggregator:all-srcs", - "//vendor/k8s.io/kube-openapi/pkg/builder:all-srcs", - "//vendor/k8s.io/kube-openapi/pkg/common:all-srcs", - "//vendor/k8s.io/kube-openapi/pkg/generators:all-srcs", - "//vendor/k8s.io/kube-openapi/pkg/handler:all-srcs", - "//vendor/k8s.io/kube-openapi/pkg/util:all-srcs", - "//vendor/k8s.io/utils/exec:all-srcs", - "//vendor/vbom.ml/util/sortorder:all-srcs", + "//vendor:all-srcs", ], tags = ["automanaged"], ) diff --git a/vendor/BUILD b/vendor/BUILD new file mode 100644 index 0000000000000..5250904625235 --- /dev/null +++ b/vendor/BUILD @@ -0,0 +1,393 @@ +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/bitbucket.org/bertimus9/systemstat:all-srcs", + "//vendor/bitbucket.org/ww/goautoneg:all-srcs", + "//vendor/cloud.google.com/go/compute/metadata:all-srcs", + "//vendor/cloud.google.com/go/internal:all-srcs", + "//vendor/github.com/Azure/azure-sdk-for-go/arm/compute:all-srcs", + "//vendor/github.com/Azure/azure-sdk-for-go/arm/containerregistry:all-srcs", + "//vendor/github.com/Azure/azure-sdk-for-go/arm/disk:all-srcs", + "//vendor/github.com/Azure/azure-sdk-for-go/arm/network:all-srcs", + "//vendor/github.com/Azure/azure-sdk-for-go/arm/storage:all-srcs", + "//vendor/github.com/Azure/azure-sdk-for-go/storage:all-srcs", + "//vendor/github.com/Azure/go-ansiterm:all-srcs", + "//vendor/github.com/Azure/go-autorest/autorest:all-srcs", + "//vendor/github.com/MakeNowJust/heredoc:all-srcs", + "//vendor/github.com/Microsoft/go-winio:all-srcs", + "//vendor/github.com/NYTimes/gziphandler:all-srcs", + "//vendor/github.com/PuerkitoBio/purell:all-srcs", + "//vendor/github.com/PuerkitoBio/urlesc:all-srcs", + "//vendor/github.com/Sirupsen/logrus:all-srcs", + "//vendor/github.com/abbot/go-http-auth:all-srcs", + "//vendor/github.com/appc/spec/schema:all-srcs", + "//vendor/github.com/armon/circbuf:all-srcs", + "//vendor/github.com/asaskevich/govalidator:all-srcs", + "//vendor/github.com/aws/aws-sdk-go/aws:all-srcs", + "//vendor/github.com/aws/aws-sdk-go/private/protocol:all-srcs", + "//vendor/github.com/aws/aws-sdk-go/private/waiter:all-srcs", + "//vendor/github.com/aws/aws-sdk-go/service/autoscaling:all-srcs", + "//vendor/github.com/aws/aws-sdk-go/service/ec2:all-srcs", + "//vendor/github.com/aws/aws-sdk-go/service/ecr:all-srcs", + "//vendor/github.com/aws/aws-sdk-go/service/elb:all-srcs", + "//vendor/github.com/aws/aws-sdk-go/service/route53:all-srcs", + "//vendor/github.com/aws/aws-sdk-go/service/sts:all-srcs", + "//vendor/github.com/beorn7/perks/quantile:all-srcs", + "//vendor/github.com/blang/semver:all-srcs", + "//vendor/github.com/boltdb/bolt:all-srcs", + "//vendor/github.com/chai2010/gettext-go/gettext:all-srcs", + "//vendor/github.com/cloudflare/cfssl/auth:all-srcs", + "//vendor/github.com/cloudflare/cfssl/certdb:all-srcs", + "//vendor/github.com/cloudflare/cfssl/config:all-srcs", + "//vendor/github.com/cloudflare/cfssl/crypto/pkcs7:all-srcs", + "//vendor/github.com/cloudflare/cfssl/csr:all-srcs", + "//vendor/github.com/cloudflare/cfssl/errors:all-srcs", + "//vendor/github.com/cloudflare/cfssl/helpers:all-srcs", + "//vendor/github.com/cloudflare/cfssl/info:all-srcs", + "//vendor/github.com/cloudflare/cfssl/log:all-srcs", + "//vendor/github.com/cloudflare/cfssl/ocsp/config:all-srcs", + "//vendor/github.com/cloudflare/cfssl/signer:all-srcs", + "//vendor/github.com/clusterhq/flocker-go:all-srcs", + "//vendor/github.com/codedellemc/goscaleio:all-srcs", + "//vendor/github.com/codegangsta/negroni:all-srcs", + "//vendor/github.com/containernetworking/cni/libcni:all-srcs", + "//vendor/github.com/containernetworking/cni/pkg/invoke:all-srcs", + "//vendor/github.com/containernetworking/cni/pkg/types:all-srcs", + "//vendor/github.com/containernetworking/cni/pkg/version:all-srcs", + "//vendor/github.com/coreos/etcd/alarm:all-srcs", + "//vendor/github.com/coreos/etcd/auth:all-srcs", + "//vendor/github.com/coreos/etcd/client:all-srcs", + "//vendor/github.com/coreos/etcd/clientv3:all-srcs", + "//vendor/github.com/coreos/etcd/compactor:all-srcs", + "//vendor/github.com/coreos/etcd/discovery:all-srcs", + "//vendor/github.com/coreos/etcd/error:all-srcs", + "//vendor/github.com/coreos/etcd/etcdserver:all-srcs", + "//vendor/github.com/coreos/etcd/integration:all-srcs", + "//vendor/github.com/coreos/etcd/lease:all-srcs", + "//vendor/github.com/coreos/etcd/mvcc:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/adt:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/contention:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/cpuutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/crc:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/fileutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/httputil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/idutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/ioutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/logutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/monotime:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/netutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/pathutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/pbutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/runtime:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/schedule:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/testutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/tlsutil:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/transport:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/types:all-srcs", + "//vendor/github.com/coreos/etcd/pkg/wait:all-srcs", + "//vendor/github.com/coreos/etcd/proxy/grpcproxy:all-srcs", + "//vendor/github.com/coreos/etcd/raft:all-srcs", + "//vendor/github.com/coreos/etcd/rafthttp:all-srcs", + "//vendor/github.com/coreos/etcd/snap:all-srcs", + "//vendor/github.com/coreos/etcd/store:all-srcs", + "//vendor/github.com/coreos/etcd/version:all-srcs", + "//vendor/github.com/coreos/etcd/wal:all-srcs", + "//vendor/github.com/coreos/go-oidc/http:all-srcs", + "//vendor/github.com/coreos/go-oidc/jose:all-srcs", + "//vendor/github.com/coreos/go-oidc/key:all-srcs", + "//vendor/github.com/coreos/go-oidc/oauth2:all-srcs", + "//vendor/github.com/coreos/go-oidc/oidc:all-srcs", + "//vendor/github.com/coreos/go-semver/semver:all-srcs", + "//vendor/github.com/coreos/go-systemd/daemon:all-srcs", + "//vendor/github.com/coreos/go-systemd/dbus:all-srcs", + "//vendor/github.com/coreos/go-systemd/journal:all-srcs", + "//vendor/github.com/coreos/go-systemd/unit:all-srcs", + "//vendor/github.com/coreos/go-systemd/util:all-srcs", + "//vendor/github.com/coreos/pkg/capnslog:all-srcs", + "//vendor/github.com/coreos/pkg/dlopen:all-srcs", + "//vendor/github.com/coreos/pkg/health:all-srcs", + "//vendor/github.com/coreos/pkg/httputil:all-srcs", + "//vendor/github.com/coreos/pkg/timeutil:all-srcs", + "//vendor/github.com/coreos/rkt/api/v1alpha:all-srcs", + "//vendor/github.com/cpuguy83/go-md2man/md2man:all-srcs", + "//vendor/github.com/davecgh/go-spew/spew:all-srcs", + "//vendor/github.com/daviddengcn/go-colortext:all-srcs", + "//vendor/github.com/dgrijalva/jwt-go:all-srcs", + "//vendor/github.com/docker/distribution/digest:all-srcs", + "//vendor/github.com/docker/distribution/reference:all-srcs", + "//vendor/github.com/docker/docker/api/types:all-srcs", + "//vendor/github.com/docker/docker/client:all-srcs", + "//vendor/github.com/docker/docker/pkg/jsonlog:all-srcs", + "//vendor/github.com/docker/docker/pkg/jsonmessage:all-srcs", + "//vendor/github.com/docker/docker/pkg/longpath:all-srcs", + "//vendor/github.com/docker/docker/pkg/mount:all-srcs", + "//vendor/github.com/docker/docker/pkg/stdcopy:all-srcs", + "//vendor/github.com/docker/docker/pkg/symlink:all-srcs", + "//vendor/github.com/docker/docker/pkg/system:all-srcs", + "//vendor/github.com/docker/docker/pkg/term:all-srcs", + "//vendor/github.com/docker/docker/pkg/tlsconfig:all-srcs", + "//vendor/github.com/docker/engine-api/client:all-srcs", + "//vendor/github.com/docker/engine-api/types:all-srcs", + "//vendor/github.com/docker/go-connections/nat:all-srcs", + "//vendor/github.com/docker/go-connections/sockets:all-srcs", + "//vendor/github.com/docker/go-connections/tlsconfig:all-srcs", + "//vendor/github.com/docker/go-units:all-srcs", + "//vendor/github.com/docker/spdystream:all-srcs", + "//vendor/github.com/elazarl/go-bindata-assetfs:all-srcs", + "//vendor/github.com/elazarl/goproxy:all-srcs", + "//vendor/github.com/emicklei/go-restful:all-srcs", + "//vendor/github.com/emicklei/go-restful-swagger12:all-srcs", + "//vendor/github.com/evanphx/json-patch:all-srcs", + "//vendor/github.com/exponent-io/jsonpath:all-srcs", + "//vendor/github.com/fatih/camelcase:all-srcs", + "//vendor/github.com/fsnotify/fsnotify:all-srcs", + "//vendor/github.com/garyburd/redigo/internal:all-srcs", + "//vendor/github.com/garyburd/redigo/redis:all-srcs", + "//vendor/github.com/ghodss/yaml:all-srcs", + "//vendor/github.com/go-ini/ini:all-srcs", + "//vendor/github.com/go-openapi/analysis:all-srcs", + "//vendor/github.com/go-openapi/errors:all-srcs", + "//vendor/github.com/go-openapi/jsonpointer:all-srcs", + "//vendor/github.com/go-openapi/jsonreference:all-srcs", + "//vendor/github.com/go-openapi/loads:all-srcs", + "//vendor/github.com/go-openapi/runtime:all-srcs", + "//vendor/github.com/go-openapi/spec:all-srcs", + "//vendor/github.com/go-openapi/strfmt:all-srcs", + "//vendor/github.com/go-openapi/swag:all-srcs", + "//vendor/github.com/go-openapi/validate:all-srcs", + "//vendor/github.com/godbus/dbus:all-srcs", + "//vendor/github.com/gogo/protobuf/gogoproto:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/compare:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/defaultcheck:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/description:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/embedcheck:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/enumstringer:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/equal:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/face:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/gostring:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/marshalto:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/oneofcheck:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/populate:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/size:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/stringer:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/testgen:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/union:all-srcs", + "//vendor/github.com/gogo/protobuf/plugin/unmarshal:all-srcs", + "//vendor/github.com/gogo/protobuf/proto:all-srcs", + "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor:all-srcs", + "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/generator:all-srcs", + "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/grpc:all-srcs", + "//vendor/github.com/gogo/protobuf/protoc-gen-gogo/plugin:all-srcs", + "//vendor/github.com/gogo/protobuf/sortkeys:all-srcs", + "//vendor/github.com/gogo/protobuf/vanity:all-srcs", + "//vendor/github.com/golang/glog:all-srcs", + "//vendor/github.com/golang/groupcache/lru:all-srcs", + "//vendor/github.com/golang/mock/gomock:all-srcs", + "//vendor/github.com/golang/protobuf/jsonpb:all-srcs", + "//vendor/github.com/golang/protobuf/proto:all-srcs", + "//vendor/github.com/golang/protobuf/ptypes:all-srcs", + "//vendor/github.com/google/btree:all-srcs", + "//vendor/github.com/google/cadvisor/api:all-srcs", + "//vendor/github.com/google/cadvisor/cache/memory:all-srcs", + "//vendor/github.com/google/cadvisor/client/v2:all-srcs", + "//vendor/github.com/google/cadvisor/collector:all-srcs", + "//vendor/github.com/google/cadvisor/container:all-srcs", + "//vendor/github.com/google/cadvisor/devicemapper:all-srcs", + "//vendor/github.com/google/cadvisor/events:all-srcs", + "//vendor/github.com/google/cadvisor/fs:all-srcs", + "//vendor/github.com/google/cadvisor/healthz:all-srcs", + "//vendor/github.com/google/cadvisor/http:all-srcs", + "//vendor/github.com/google/cadvisor/info/v1:all-srcs", + "//vendor/github.com/google/cadvisor/info/v2:all-srcs", + "//vendor/github.com/google/cadvisor/machine:all-srcs", + "//vendor/github.com/google/cadvisor/manager:all-srcs", + "//vendor/github.com/google/cadvisor/metrics:all-srcs", + "//vendor/github.com/google/cadvisor/pages:all-srcs", + "//vendor/github.com/google/cadvisor/storage:all-srcs", + "//vendor/github.com/google/cadvisor/summary:all-srcs", + "//vendor/github.com/google/cadvisor/utils:all-srcs", + "//vendor/github.com/google/cadvisor/validate:all-srcs", + "//vendor/github.com/google/cadvisor/version:all-srcs", + "//vendor/github.com/google/cadvisor/zfs:all-srcs", + "//vendor/github.com/google/certificate-transparency/go:all-srcs", + "//vendor/github.com/google/gofuzz:all-srcs", + "//vendor/github.com/googleapis/gnostic/OpenAPIv2:all-srcs", + "//vendor/github.com/googleapis/gnostic/compiler:all-srcs", + "//vendor/github.com/googleapis/gnostic/extensions:all-srcs", + "//vendor/github.com/gophercloud/gophercloud:all-srcs", + "//vendor/github.com/gorilla/context:all-srcs", + "//vendor/github.com/gorilla/mux:all-srcs", + "//vendor/github.com/gorilla/websocket:all-srcs", + "//vendor/github.com/grpc-ecosystem/go-grpc-prometheus:all-srcs", + "//vendor/github.com/grpc-ecosystem/grpc-gateway/runtime:all-srcs", + "//vendor/github.com/grpc-ecosystem/grpc-gateway/utilities:all-srcs", + "//vendor/github.com/hashicorp/golang-lru:all-srcs", + "//vendor/github.com/hashicorp/hcl:all-srcs", + "//vendor/github.com/hawkular/hawkular-client-go/metrics:all-srcs", + "//vendor/github.com/heketi/heketi/client/api/go-client:all-srcs", + "//vendor/github.com/heketi/heketi/pkg/glusterfs/api:all-srcs", + "//vendor/github.com/heketi/heketi/pkg/utils:all-srcs", + "//vendor/github.com/howeyc/gopass:all-srcs", + "//vendor/github.com/imdario/mergo:all-srcs", + "//vendor/github.com/inconshreveable/mousetrap:all-srcs", + "//vendor/github.com/influxdata/influxdb/client:all-srcs", + "//vendor/github.com/influxdata/influxdb/models:all-srcs", + "//vendor/github.com/influxdata/influxdb/pkg/escape:all-srcs", + "//vendor/github.com/jmespath/go-jmespath:all-srcs", + "//vendor/github.com/jonboulle/clockwork:all-srcs", + "//vendor/github.com/jteeuwen/go-bindata:all-srcs", + "//vendor/github.com/juju/ratelimit:all-srcs", + "//vendor/github.com/kardianos/osext:all-srcs", + "//vendor/github.com/karlseguin/ccache:all-srcs", + "//vendor/github.com/kr/fs:all-srcs", + "//vendor/github.com/kr/pty:all-srcs", + "//vendor/github.com/libopenstorage/openstorage/api:all-srcs", + "//vendor/github.com/libopenstorage/openstorage/pkg/units:all-srcs", + "//vendor/github.com/libopenstorage/openstorage/volume:all-srcs", + "//vendor/github.com/lpabon/godbc:all-srcs", + "//vendor/github.com/magiconair/properties:all-srcs", + "//vendor/github.com/mailru/easyjson/buffer:all-srcs", + "//vendor/github.com/mailru/easyjson/jlexer:all-srcs", + "//vendor/github.com/mailru/easyjson/jwriter:all-srcs", + "//vendor/github.com/matttproud/golang_protobuf_extensions/pbutil:all-srcs", + "//vendor/github.com/miekg/coredns/middleware/etcd/msg:all-srcs", + "//vendor/github.com/miekg/dns:all-srcs", + "//vendor/github.com/mistifyio/go-zfs:all-srcs", + "//vendor/github.com/mitchellh/go-wordwrap:all-srcs", + "//vendor/github.com/mitchellh/mapstructure:all-srcs", + "//vendor/github.com/mreiferson/go-httpclient:all-srcs", + "//vendor/github.com/mvdan/xurls:all-srcs", + "//vendor/github.com/mxk/go-flowrate/flowrate:all-srcs", + "//vendor/github.com/onsi/ginkgo:all-srcs", + "//vendor/github.com/onsi/gomega:all-srcs", + "//vendor/github.com/opencontainers/runc/libcontainer:all-srcs", + "//vendor/github.com/pborman/uuid:all-srcs", + "//vendor/github.com/pelletier/go-buffruneio:all-srcs", + "//vendor/github.com/pelletier/go-toml:all-srcs", + "//vendor/github.com/pkg/errors:all-srcs", + "//vendor/github.com/pkg/sftp:all-srcs", + "//vendor/github.com/pmezard/go-difflib/difflib:all-srcs", + "//vendor/github.com/prometheus/client_golang/prometheus:all-srcs", + "//vendor/github.com/prometheus/client_model/go:all-srcs", + "//vendor/github.com/prometheus/common/expfmt:all-srcs", + "//vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg:all-srcs", + "//vendor/github.com/prometheus/common/model:all-srcs", + "//vendor/github.com/prometheus/procfs:all-srcs", + "//vendor/github.com/quobyte/api:all-srcs", + "//vendor/github.com/rackspace/gophercloud:all-srcs", + "//vendor/github.com/rancher/go-rancher/client:all-srcs", + "//vendor/github.com/renstrom/dedent:all-srcs", + "//vendor/github.com/robfig/cron:all-srcs", + "//vendor/github.com/rubiojr/go-vhd/vhd:all-srcs", + "//vendor/github.com/russross/blackfriday:all-srcs", + "//vendor/github.com/satori/uuid:all-srcs", + "//vendor/github.com/seccomp/libseccomp-golang:all-srcs", + "//vendor/github.com/shurcooL/sanitized_anchor_name:all-srcs", + "//vendor/github.com/spf13/afero:all-srcs", + "//vendor/github.com/spf13/cast:all-srcs", + "//vendor/github.com/spf13/cobra:all-srcs", + "//vendor/github.com/spf13/jwalterweatherman:all-srcs", + "//vendor/github.com/spf13/pflag:all-srcs", + "//vendor/github.com/spf13/viper:all-srcs", + "//vendor/github.com/square/go-jose:all-srcs", + "//vendor/github.com/storageos/go-api:all-srcs", + "//vendor/github.com/stretchr/objx:all-srcs", + "//vendor/github.com/stretchr/testify/assert:all-srcs", + "//vendor/github.com/stretchr/testify/mock:all-srcs", + "//vendor/github.com/stretchr/testify/require:all-srcs", + "//vendor/github.com/syndtr/gocapability/capability:all-srcs", + "//vendor/github.com/ugorji/go/codec:all-srcs", + "//vendor/github.com/vishvananda/netlink:all-srcs", + "//vendor/github.com/vmware/govmomi:all-srcs", + "//vendor/github.com/vmware/photon-controller-go-sdk/SSPI:all-srcs", + "//vendor/github.com/vmware/photon-controller-go-sdk/photon:all-srcs", + "//vendor/github.com/xanzy/go-cloudstack/cloudstack:all-srcs", + "//vendor/github.com/xiang90/probing:all-srcs", + "//vendor/github.com/xyproto/simpleredis:all-srcs", + "//vendor/go.pedge.io/pb/go/google/protobuf:all-srcs", + "//vendor/go4.org/errorutil:all-srcs", + "//vendor/golang.org/x/crypto/bcrypt:all-srcs", + "//vendor/golang.org/x/crypto/blowfish:all-srcs", + "//vendor/golang.org/x/crypto/curve25519:all-srcs", + "//vendor/golang.org/x/crypto/ed25519:all-srcs", + "//vendor/golang.org/x/crypto/nacl/secretbox:all-srcs", + "//vendor/golang.org/x/crypto/pkcs12:all-srcs", + "//vendor/golang.org/x/crypto/poly1305:all-srcs", + "//vendor/golang.org/x/crypto/salsa20/salsa:all-srcs", + "//vendor/golang.org/x/crypto/ssh:all-srcs", + "//vendor/golang.org/x/exp/inotify:all-srcs", + "//vendor/golang.org/x/net/context:all-srcs", + "//vendor/golang.org/x/net/html:all-srcs", + "//vendor/golang.org/x/net/http2:all-srcs", + "//vendor/golang.org/x/net/idna:all-srcs", + "//vendor/golang.org/x/net/internal/timeseries:all-srcs", + "//vendor/golang.org/x/net/lex/httplex:all-srcs", + "//vendor/golang.org/x/net/proxy:all-srcs", + "//vendor/golang.org/x/net/trace:all-srcs", + "//vendor/golang.org/x/net/websocket:all-srcs", + "//vendor/golang.org/x/oauth2:all-srcs", + "//vendor/golang.org/x/sys/unix:all-srcs", + "//vendor/golang.org/x/sys/windows:all-srcs", + "//vendor/golang.org/x/text/cases:all-srcs", + "//vendor/golang.org/x/text/encoding:all-srcs", + "//vendor/golang.org/x/text/internal:all-srcs", + "//vendor/golang.org/x/text/language:all-srcs", + "//vendor/golang.org/x/text/runes:all-srcs", + "//vendor/golang.org/x/text/secure/bidirule:all-srcs", + "//vendor/golang.org/x/text/secure/precis:all-srcs", + "//vendor/golang.org/x/text/transform:all-srcs", + "//vendor/golang.org/x/text/unicode/bidi:all-srcs", + "//vendor/golang.org/x/text/unicode/norm:all-srcs", + "//vendor/golang.org/x/text/width:all-srcs", + "//vendor/golang.org/x/time/rate:all-srcs", + "//vendor/golang.org/x/tools/container/intsets:all-srcs", + "//vendor/google.golang.org/api/cloudkms/v1:all-srcs", + "//vendor/google.golang.org/api/cloudmonitoring/v2beta2:all-srcs", + "//vendor/google.golang.org/api/compute/v0.alpha:all-srcs", + "//vendor/google.golang.org/api/compute/v0.beta:all-srcs", + "//vendor/google.golang.org/api/compute/v1:all-srcs", + "//vendor/google.golang.org/api/container/v1:all-srcs", + "//vendor/google.golang.org/api/dns/v1:all-srcs", + "//vendor/google.golang.org/api/gensupport:all-srcs", + "//vendor/google.golang.org/api/googleapi:all-srcs", + "//vendor/google.golang.org/api/logging/v2beta1:all-srcs", + "//vendor/google.golang.org/api/monitoring/v3:all-srcs", + "//vendor/google.golang.org/api/pubsub/v1:all-srcs", + "//vendor/google.golang.org/genproto/googleapis/rpc/status:all-srcs", + "//vendor/google.golang.org/grpc:all-srcs", + "//vendor/gopkg.in/gcfg.v1:all-srcs", + "//vendor/gopkg.in/inf.v0:all-srcs", + "//vendor/gopkg.in/natefinch/lumberjack.v2:all-srcs", + "//vendor/gopkg.in/warnings.v0:all-srcs", + "//vendor/gopkg.in/yaml.v2:all-srcs", + "//vendor/k8s.io/gengo/args:all-srcs", + "//vendor/k8s.io/gengo/examples/deepcopy-gen/generators:all-srcs", + "//vendor/k8s.io/gengo/examples/defaulter-gen/generators:all-srcs", + "//vendor/k8s.io/gengo/examples/import-boss/generators:all-srcs", + "//vendor/k8s.io/gengo/examples/set-gen/generators:all-srcs", + "//vendor/k8s.io/gengo/examples/set-gen/sets:all-srcs", + "//vendor/k8s.io/gengo/generator:all-srcs", + "//vendor/k8s.io/gengo/namer:all-srcs", + "//vendor/k8s.io/gengo/parser:all-srcs", + "//vendor/k8s.io/gengo/types:all-srcs", + "//vendor/k8s.io/heapster/metrics/api/v1/types:all-srcs", + "//vendor/k8s.io/kube-openapi/pkg/aggregator:all-srcs", + "//vendor/k8s.io/kube-openapi/pkg/builder:all-srcs", + "//vendor/k8s.io/kube-openapi/pkg/common:all-srcs", + "//vendor/k8s.io/kube-openapi/pkg/generators:all-srcs", + "//vendor/k8s.io/kube-openapi/pkg/handler:all-srcs", + "//vendor/k8s.io/kube-openapi/pkg/util:all-srcs", + "//vendor/k8s.io/utils/exec:all-srcs", + "//vendor/vbom.ml/util/sortorder:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) From 1be99dd78e92b72e97c3dcd5568319cfc82b9674 Mon Sep 17 00:00:00 2001 From: Serguei Bezverkhi Date: Tue, 1 Aug 2017 10:05:59 -0400 Subject: [PATCH 292/403] Adding fsGroup check before mounting a volume fsGroup check will be enforcing that if a volume has already been mounted by one pod and another pod wants to mount it but has a different fsGroup value, this mount operation will not be allowed. --- pkg/kubelet/events/event.go | 1 + pkg/util/mount/mount.go | 34 +++++++++++++- pkg/util/mount/mount_linux_test.go | 38 +++++++++++++++ pkg/volume/local/BUILD | 4 ++ pkg/volume/local/local.go | 64 +++++++++++++++++++++++--- pkg/volume/local/local_test.go | 74 +++++++++++++++++++++++++++--- 6 files changed, 202 insertions(+), 13 deletions(-) diff --git a/pkg/kubelet/events/event.go b/pkg/kubelet/events/event.go index 28cddf4a901c3..bd315ffd4674c 100644 --- a/pkg/kubelet/events/event.go +++ b/pkg/kubelet/events/event.go @@ -46,6 +46,7 @@ const ( FailedDetachVolume = "FailedDetachVolume" FailedMountVolume = "FailedMount" FailedUnMountVolume = "FailedUnMount" + WarnAlreadyMountedVolume = "AlreadyMountedVolume" SuccessfulDetachVolume = "SuccessfulDetachVolume" SuccessfulMountVolume = "SuccessfulMountVolume" SuccessfulUnMountVolume = "SuccessfulUnMountVolume" diff --git a/pkg/util/mount/mount.go b/pkg/util/mount/mount.go index 446e1f51f7fad..7bdc4fe64603b 100644 --- a/pkg/util/mount/mount.go +++ b/pkg/util/mount/mount.go @@ -123,7 +123,6 @@ func GetMountRefs(mounter Interface, mountPath string) ([]string, error) { if err != nil { return nil, err } - // Find the device name. deviceName := "" // If mountPath is symlink, need get its target path. @@ -152,6 +151,39 @@ func GetMountRefs(mounter Interface, mountPath string) ([]string, error) { return refs, nil } +// GetMountRefsByDev finds all references to the device provided +// by mountPath; returns a list of paths. +func GetMountRefsByDev(mounter Interface, mountPath string) ([]string, error) { + mps, err := mounter.List() + if err != nil { + return nil, err + } + slTarget, err := filepath.EvalSymlinks(mountPath) + if err != nil { + slTarget = mountPath + } + + // Finding the device mounted to mountPath + diskDev := "" + for i := range mps { + if slTarget == mps[i].Path { + diskDev = mps[i].Device + break + } + } + + // Find all references to the device. + var refs []string + for i := range mps { + if mps[i].Device == diskDev || mps[i].Device == slTarget { + if mps[i].Path != slTarget { + refs = append(refs, mps[i].Path) + } + } + } + return refs, nil +} + // GetDeviceNameFromMount: given a mnt point, find the device from /proc/mounts // returns the device name, reference count, and error code func GetDeviceNameFromMount(mounter Interface, mountPath string) (string, int, error) { diff --git a/pkg/util/mount/mount_linux_test.go b/pkg/util/mount/mount_linux_test.go index 4b9c6a059b360..ccd5c46b66a94 100644 --- a/pkg/util/mount/mount_linux_test.go +++ b/pkg/util/mount/mount_linux_test.go @@ -170,3 +170,41 @@ func TestGetDeviceNameFromMount(t *testing.T) { } } } + +func TestGetMountRefsByDev(t *testing.T) { + fm := &FakeMounter{ + MountPoints: []MountPoint{ + {Device: "/dev/sdb", Path: "/var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gce-pd"}, + {Device: "/dev/sdb", Path: "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd-in-pod"}, + {Device: "/dev/sdc", Path: "/var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gce-pd2"}, + {Device: "/dev/sdc", Path: "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd2-in-pod1"}, + {Device: "/dev/sdc", Path: "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd2-in-pod2"}, + }, + } + + tests := []struct { + mountPath string + expectedRefs []string + }{ + { + "/var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gce-pd", + []string{ + "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd-in-pod", + }, + }, + { + "/var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gce-pd2", + []string{ + "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd2-in-pod1", + "/var/lib/kubelet/pods/some-pod/volumes/kubernetes.io~gce-pd/gce-pd2-in-pod2", + }, + }, + } + + for i, test := range tests { + + if refs, err := GetMountRefsByDev(fm, test.mountPath); err != nil || !setEquivalent(test.expectedRefs, refs) { + t.Errorf("%d. getMountRefsByDev(%q) = %v, %v; expected %v, nil", i, test.mountPath, refs, err, test.expectedRefs) + } + } +} diff --git a/pkg/volume/local/BUILD b/pkg/volume/local/BUILD index beab00e289c39..931fba880c018 100644 --- a/pkg/volume/local/BUILD +++ b/pkg/volume/local/BUILD @@ -13,6 +13,8 @@ go_library( "local.go", ], deps = [ + "//pkg/kubelet/events:go_default_library", + "//pkg/util/keymutex:go_default_library", "//pkg/util/mount:go_default_library", "//pkg/util/strings:go_default_library", "//pkg/volume:go_default_library", @@ -22,6 +24,8 @@ go_library( "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", ], ) diff --git a/pkg/volume/local/local.go b/pkg/volume/local/local.go index e7316e248dfcb..122993d6d28a6 100644 --- a/pkg/volume/local/local.go +++ b/pkg/volume/local/local.go @@ -18,13 +18,17 @@ package local import ( "fmt" - "os" - "github.com/golang/glog" + "os" + "syscall" "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/tools/record" + "k8s.io/kubernetes/pkg/kubelet/events" + "k8s.io/kubernetes/pkg/util/keymutex" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/strings" "k8s.io/kubernetes/pkg/volume" @@ -38,7 +42,9 @@ func ProbeVolumePlugins() []volume.VolumePlugin { } type localVolumePlugin struct { - host volume.VolumeHost + host volume.VolumeHost + volumeLocks keymutex.KeyMutex + recorder record.EventRecorder } var _ volume.VolumePlugin = &localVolumePlugin{} @@ -50,6 +56,11 @@ const ( func (plugin *localVolumePlugin) Init(host volume.VolumeHost) error { plugin.host = host + plugin.volumeLocks = keymutex.NewKeyMutex() + eventBroadcaster := record.NewBroadcaster() + eventBroadcaster.StartLogging(glog.Infof) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "localvolume"}) + plugin.recorder = recorder return nil } @@ -102,6 +113,7 @@ func (plugin *localVolumePlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ vo return &localVolumeMounter{ localVolume: &localVolume{ + pod: pod, podUID: pod.UID, volName: spec.Name(), mounter: plugin.host.GetMounter(plugin.GetPluginName()), @@ -146,6 +158,7 @@ func (plugin *localVolumePlugin) ConstructVolumeSpec(volumeName, mountPath strin // The directory at the globalPath will be bind-mounted to the pod's directory type localVolume struct { volName string + pod *v1.Pod podUID types.UID // Global path to the volume globalPath string @@ -188,6 +201,9 @@ func (m *localVolumeMounter) SetUp(fsGroup *int64) error { // SetUpAt bind mounts the directory to the volume path and sets up volume ownership func (m *localVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { + m.plugin.volumeLocks.LockKey(m.globalPath) + defer m.plugin.volumeLocks.UnlockKey(m.globalPath) + if m.globalPath == "" { err := fmt.Errorf("LocalVolume volume %q path is empty", m.volName) return err @@ -204,9 +220,30 @@ func (m *localVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { glog.Errorf("cannot validate mount point: %s %v", dir, err) return err } + if !notMnt { return nil } + refs, err := mount.GetMountRefsByDev(m.mounter, m.globalPath) + if fsGroup != nil { + if err != nil { + glog.Errorf("cannot collect mounting information: %s %v", m.globalPath, err) + return err + } + + if len(refs) > 0 { + fsGroupNew := int64(*fsGroup) + fsGroupSame, fsGroupOld, err := isSameFSGroup(m.globalPath, fsGroupNew) + if err != nil { + err = fmt.Errorf("failed to check fsGroup for %s (%v)", m.globalPath, err) + return err + } + if !fsGroupSame { + m.plugin.recorder.Eventf(m.pod, v1.EventTypeWarning, events.WarnAlreadyMountedVolume, "The requested fsGroup is %d, but the volume %s has GID %d. The volume may not be shareable.", fsGroupNew, m.volName, fsGroupOld) + } + } + + } if err := os.MkdirAll(dir, 0750); err != nil { glog.Errorf("mkdir failed on disk %s (%v)", dir, err) @@ -247,14 +284,29 @@ func (m *localVolumeMounter) SetUpAt(dir string, fsGroup *int64) error { os.Remove(dir) return err } - if !m.readOnly { - // TODO: how to prevent multiple mounts with conflicting fsGroup? - return volume.SetVolumeOwnership(m, fsGroup) + // Volume owner will be written only once on the first volume mount + if len(refs) == 0 { + return volume.SetVolumeOwnership(m, fsGroup) + } } return nil } +// isSameFSGroup is called only for requests to mount an already mounted +// volume. It checks if fsGroup of new mount request is the same or not. +// It returns false if it not the same. It also returns current Gid of a path +// provided for dir variable. +func isSameFSGroup(dir string, fsGroup int64) (bool, int, error) { + info, err := os.Stat(dir) + if err != nil { + glog.Errorf("Error getting stats for %s (%v)", dir, err) + return false, 0, err + } + s := info.Sys().(*syscall.Stat_t) + return int(s.Gid) == int(fsGroup), int(s.Gid), nil +} + type localVolumeUnmounter struct { *localVolume } diff --git a/pkg/volume/local/local_test.go b/pkg/volume/local/local_test.go index bf8b3a3aad522..972da115ec3b1 100644 --- a/pkg/volume/local/local_test.go +++ b/pkg/volume/local/local_test.go @@ -17,8 +17,10 @@ limitations under the License. package local import ( + "fmt" "os" "path" + "syscall" "testing" "k8s.io/api/core/v1" @@ -104,7 +106,7 @@ func TestCanSupport(t *testing.T) { tmpDir, plug := getPlugin(t) defer os.RemoveAll(tmpDir) - if !plug.CanSupport(getTestVolume(false, "/test-vol")) { + if !plug.CanSupport(getTestVolume(false, tmpDir)) { t.Errorf("Expected true") } } @@ -130,7 +132,7 @@ func TestGetVolumeName(t *testing.T) { tmpDir, plug := getPersistentPlugin(t) defer os.RemoveAll(tmpDir) - volName, err := plug.GetVolumeName(getTestVolume(false, "/test-vol")) + volName, err := plug.GetVolumeName(getTestVolume(false, tmpDir)) if err != nil { t.Errorf("Failed to get volume name: %v", err) } @@ -161,7 +163,7 @@ func TestMountUnmount(t *testing.T) { defer os.RemoveAll(tmpDir) pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{UID: types.UID("poduid")}} - mounter, err := plug.NewMounter(getTestVolume(false, "/test-vol"), pod, volume.VolumeOptions{}) + mounter, err := plug.NewMounter(getTestVolume(false, tmpDir), pod, volume.VolumeOptions{}) if err != nil { t.Errorf("Failed to make a new Mounter: %v", err) } @@ -204,6 +206,66 @@ func TestMountUnmount(t *testing.T) { } } +func testFSGroupMount(plug volume.VolumePlugin, pod *v1.Pod, tmpDir string, fsGroup int64) error { + mounter, err := plug.NewMounter(getTestVolume(false, tmpDir), pod, volume.VolumeOptions{}) + if err != nil { + return err + } + if mounter == nil { + return fmt.Errorf("Got a nil Mounter") + } + + volPath := path.Join(tmpDir, testMountPath) + path := mounter.GetPath() + if path != volPath { + return fmt.Errorf("Got unexpected path: %s", path) + } + + if err := mounter.SetUp(&fsGroup); err != nil { + return err + } + return nil +} + +func TestFSGroupMount(t *testing.T) { + tmpDir, plug := getPlugin(t) + defer os.RemoveAll(tmpDir) + info, err := os.Stat(tmpDir) + if err != nil { + t.Errorf("Error getting stats for %s (%v)", tmpDir, err) + } + s := info.Sys().(*syscall.Stat_t) + if s == nil { + t.Errorf("Error getting stats for %s (%v)", tmpDir, err) + } + fsGroup1 := int64(s.Gid) + fsGroup2 := fsGroup1 + 1 + pod1 := &v1.Pod{ObjectMeta: metav1.ObjectMeta{UID: types.UID("poduid")}} + pod1.Spec.SecurityContext = &v1.PodSecurityContext{ + FSGroup: &fsGroup1, + } + pod2 := &v1.Pod{ObjectMeta: metav1.ObjectMeta{UID: types.UID("poduid")}} + pod2.Spec.SecurityContext = &v1.PodSecurityContext{ + FSGroup: &fsGroup2, + } + err = testFSGroupMount(plug, pod1, tmpDir, fsGroup1) + if err != nil { + t.Errorf("Failed to make a new Mounter: %v", err) + } + err = testFSGroupMount(plug, pod2, tmpDir, fsGroup2) + if err != nil { + t.Errorf("Failed to make a new Mounter: %v", err) + } + //Checking if GID of tmpDir has not been changed by mounting it by second pod + s = info.Sys().(*syscall.Stat_t) + if s == nil { + t.Errorf("Error getting stats for %s (%v)", tmpDir, err) + } + if fsGroup1 != int64(s.Gid) { + t.Errorf("Old Gid %d for volume %s got overwritten by new Gid %d", fsGroup1, tmpDir, int64(s.Gid)) + } +} + func TestConstructVolumeSpec(t *testing.T) { tmpDir, plug := getPlugin(t) defer os.RemoveAll(tmpDir) @@ -243,7 +305,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { // Read only == true pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{UID: types.UID("poduid")}} - mounter, err := plug.NewMounter(getTestVolume(true, "/test-vol"), pod, volume.VolumeOptions{}) + mounter, err := plug.NewMounter(getTestVolume(true, tmpDir), pod, volume.VolumeOptions{}) if err != nil { t.Errorf("Failed to make a new Mounter: %v", err) } @@ -255,7 +317,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { } // Read only == false - mounter, err = plug.NewMounter(getTestVolume(false, "/test-vol"), pod, volume.VolumeOptions{}) + mounter, err = plug.NewMounter(getTestVolume(false, tmpDir), pod, volume.VolumeOptions{}) if err != nil { t.Errorf("Failed to make a new Mounter: %v", err) } @@ -276,7 +338,7 @@ func TestUnsupportedPlugins(t *testing.T) { plugMgr := volume.VolumePluginMgr{} plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) - spec := getTestVolume(false, "/test-vol") + spec := getTestVolume(false, tmpDir) recyclePlug, err := plugMgr.FindRecyclablePluginBySpec(spec) if err == nil && recyclePlug != nil { From 4928c8d1bf485a10c61855156bc4342002b3ed93 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Tue, 22 Aug 2017 21:14:13 -0700 Subject: [PATCH 293/403] let resourcequota evaluator handle uninitialid pod and pvc --- pkg/quota/evaluator/core/BUILD | 1 + .../core/persistent_volume_claims.go | 15 +++- pkg/quota/evaluator/core/pods.go | 18 ++++- pkg/quota/evaluator/core/services.go | 3 +- pkg/quota/generic/evaluator.go | 5 +- pkg/quota/interfaces.go | 4 +- .../pkg/admission/resourcequota/controller.go | 8 +- test/e2e/resource_quota.go | 79 +++++++++++++++++++ 8 files changed, 117 insertions(+), 16 deletions(-) diff --git a/pkg/quota/evaluator/core/BUILD b/pkg/quota/evaluator/core/BUILD index efc0798d80a6e..b413ddac201a7 100644 --- a/pkg/quota/evaluator/core/BUILD +++ b/pkg/quota/evaluator/core/BUILD @@ -25,6 +25,7 @@ go_library( "//pkg/api/helper/qos:go_default_library", "//pkg/api/v1:go_default_library", "//pkg/api/validation:go_default_library", + "//pkg/kubeapiserver/admission/util:go_default_library", "//pkg/quota:go_default_library", "//pkg/quota/generic:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/pkg/quota/evaluator/core/persistent_volume_claims.go b/pkg/quota/evaluator/core/persistent_volume_claims.go index 86e7350dee706..ed2d8bef0d058 100644 --- a/pkg/quota/evaluator/core/persistent_volume_claims.go +++ b/pkg/quota/evaluator/core/persistent_volume_claims.go @@ -32,6 +32,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/helper" k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/kubeapiserver/admission/util" "k8s.io/kubernetes/pkg/quota" "k8s.io/kubernetes/pkg/quota/generic" ) @@ -141,8 +142,18 @@ func (p *pvcEvaluator) GroupKind() schema.GroupKind { } // Handles returns true if the evaluator should handle the specified operation. -func (p *pvcEvaluator) Handles(operation admission.Operation) bool { - return admission.Create == operation +func (p *pvcEvaluator) Handles(a admission.Attributes) bool { + op := a.GetOperation() + if op == admission.Create { + return true + } + updateUninitialized, err := util.IsUpdatingUninitializedObject(a) + if err != nil { + // fail closed, will try to give an evaluation. + return true + } + // only uninitialized pvc might be updated. + return updateUninitialized } // Matches returns true if the evaluator matches the specified quota with the provided input item diff --git a/pkg/quota/evaluator/core/pods.go b/pkg/quota/evaluator/core/pods.go index 5773a4a229db7..da398860df7fa 100644 --- a/pkg/quota/evaluator/core/pods.go +++ b/pkg/quota/evaluator/core/pods.go @@ -34,6 +34,7 @@ import ( "k8s.io/kubernetes/pkg/api/helper/qos" k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/validation" + "k8s.io/kubernetes/pkg/kubeapiserver/admission/util" "k8s.io/kubernetes/pkg/quota" "k8s.io/kubernetes/pkg/quota/generic" ) @@ -131,10 +132,19 @@ func (p *podEvaluator) GroupKind() schema.GroupKind { return api.Kind("Pod") } -// Handles returns true of the evaluator should handle the specified operation. -func (p *podEvaluator) Handles(operation admission.Operation) bool { - // TODO: update this if/when pods support resizing resource requirements. - return admission.Create == operation +// Handles returns true of the evaluator should handle the specified attributes. +func (p *podEvaluator) Handles(a admission.Attributes) bool { + op := a.GetOperation() + if op == admission.Create { + return true + } + updateUninitialized, err := util.IsUpdatingUninitializedObject(a) + if err != nil { + // fail closed, will try to give an evaluation. + return true + } + // only uninitialized pods might be updated. + return updateUninitialized } // Matches returns true if the evaluator matches the specified quota with the provided input item diff --git a/pkg/quota/evaluator/core/services.go b/pkg/quota/evaluator/core/services.go index 457d8b4173543..91a5ef0a059b1 100644 --- a/pkg/quota/evaluator/core/services.go +++ b/pkg/quota/evaluator/core/services.go @@ -108,7 +108,8 @@ func (p *serviceEvaluator) GroupKind() schema.GroupKind { } // Handles returns true of the evaluator should handle the specified operation. -func (p *serviceEvaluator) Handles(operation admission.Operation) bool { +func (p *serviceEvaluator) Handles(a admission.Attributes) bool { + operation := a.GetOperation() // We handle create and update because a service type can change. return admission.Create == operation || admission.Update == operation } diff --git a/pkg/quota/generic/evaluator.go b/pkg/quota/generic/evaluator.go index ab3bbb531b4e9..1b574bb6b52ec 100644 --- a/pkg/quota/generic/evaluator.go +++ b/pkg/quota/generic/evaluator.go @@ -150,8 +150,9 @@ func (o *ObjectCountEvaluator) GroupKind() schema.GroupKind { return o.InternalGroupKind } -// Handles returns true if the object count evaluator needs to track this operation. -func (o *ObjectCountEvaluator) Handles(operation admission.Operation) bool { +// Handles returns true if the object count evaluator needs to track this attributes. +func (o *ObjectCountEvaluator) Handles(a admission.Attributes) bool { + operation := a.GetOperation() return operation == admission.Create || (o.AllowCreateOnUpdate && operation == admission.Update) } diff --git a/pkg/quota/interfaces.go b/pkg/quota/interfaces.go index 393e89791b57a..56eacfe2d47f5 100644 --- a/pkg/quota/interfaces.go +++ b/pkg/quota/interfaces.go @@ -45,9 +45,9 @@ type Evaluator interface { Constraints(required []api.ResourceName, item runtime.Object) error // GroupKind returns the groupKind that this object knows how to evaluate GroupKind() schema.GroupKind - // Handles determines if quota could be impacted by the specified operation. + // Handles determines if quota could be impacted by the specified attribute. // If true, admission control must perform quota processing for the operation, otherwise it is safe to ignore quota. - Handles(operation admission.Operation) bool + Handles(operation admission.Attributes) bool // Matches returns true if the specified quota matches the input item Matches(resourceQuota *api.ResourceQuota, item runtime.Object) (bool, error) // MatchingResources takes the input specified list of resources and returns the set of resources evaluator matches. diff --git a/plugin/pkg/admission/resourcequota/controller.go b/plugin/pkg/admission/resourcequota/controller.go index ab32bbf31bacb..84f196ba60da8 100644 --- a/plugin/pkg/admission/resourcequota/controller.go +++ b/plugin/pkg/admission/resourcequota/controller.go @@ -375,8 +375,7 @@ func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.At return quotas, nil } - op := a.GetOperation() - if !evaluator.Handles(op) { + if !evaluator.Handles(a) { return quotas, nil } @@ -463,7 +462,7 @@ func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.At return nil, admission.NewForbidden(a, fmt.Errorf("quota usage is negative for resource(s): %s", prettyPrintResourceNames(negativeUsage))) } - if admission.Update == op { + if admission.Update == a.GetOperation() { prevItem := a.GetOldObject() if prevItem == nil { return nil, admission.NewForbidden(a, fmt.Errorf("unable to get previous usage since prior version of object was not found")) @@ -529,8 +528,7 @@ func (e *quotaEvaluator) Evaluate(a admission.Attributes) error { } // for this kind, check if the operation could mutate any quota resources // if no resources tracked by quota are impacted, then just return - op := a.GetOperation() - if !evaluator.Handles(op) { + if !evaluator.Handles(a) { return nil } diff --git a/test/e2e/resource_quota.go b/test/e2e/resource_quota.go index c666a54406d88..e70f8fb65b97a 100644 --- a/test/e2e/resource_quota.go +++ b/test/e2e/resource_quota.go @@ -147,6 +147,85 @@ var _ = framework.KubeDescribe("ResourceQuota", func() { Expect(err).NotTo(HaveOccurred()) }) + It("should create a ResourceQuota and capture the life of an uninitialized pod.", func() { + // TODO: uncomment the test when #50344 is merged. + // By("Creating a ResourceQuota") + // quotaName := "test-quota" + // resourceQuota := newTestResourceQuota(quotaName) + // resourceQuota, err := createResourceQuota(f.ClientSet, f.Namespace.Name, resourceQuota) + // Expect(err).NotTo(HaveOccurred()) + + // By("Ensuring resource quota status is calculated") + // usedResources := v1.ResourceList{} + // usedResources[v1.ResourceQuotas] = resource.MustParse("1") + // err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quotaName, usedResources) + // Expect(err).NotTo(HaveOccurred()) + + // By("Creating an uninitialized Pod that fits quota") + // podName := "test-pod" + // requests := v1.ResourceList{} + // requests[v1.ResourceCPU] = resource.MustParse("500m") + // requests[v1.ResourceMemory] = resource.MustParse("252Mi") + // pod := newTestPodForQuota(f, podName, requests, v1.ResourceList{}) + // pod.Initializers = &metav1.Initializers{Pending: []metav1.Initializer{{Name: "unhandled"}}} + // _, err = f.ClientSet.Core().Pods(f.Namespace.Name).Create(pod) + // // because no one is handling the initializer, server will return a 504 timeout + // if err != nil && !errors.IsTimeout(err) { + // framework.Failf("expect err to be timeout error, got %v", err) + // } + // podToUpdate, err := f.ClientSet.Core().Pods(f.Namespace.Name).Get(podName, metav1.GetOptions{}) + // Expect(err).NotTo(HaveOccurred()) + + // By("Ensuring ResourceQuota status captures the pod usage") + // usedResources[v1.ResourceQuotas] = resource.MustParse("1") + // usedResources[v1.ResourcePods] = resource.MustParse("1") + // usedResources[v1.ResourceCPU] = requests[v1.ResourceCPU] + // usedResources[v1.ResourceMemory] = requests[v1.ResourceMemory] + // err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quotaName, usedResources) + // Expect(err).NotTo(HaveOccurred()) + + // By("Not allowing an uninitialized pod to be created that exceeds remaining quota") + // requests = v1.ResourceList{} + // requests[v1.ResourceCPU] = resource.MustParse("600m") + // requests[v1.ResourceMemory] = resource.MustParse("100Mi") + // pod = newTestPodForQuota(f, "fail-pod", requests, v1.ResourceList{}) + // pod.Initializers = &metav1.Initializers{Pending: []metav1.Initializer{{Name: "unhandled"}}} + // pod, err = f.ClientSet.Core().Pods(f.Namespace.Name).Create(pod) + // Expect(err).To(HaveOccurred()) + // fmt.Println("CHAO: err=", err) + + // By("Ensuring an uninitialized pod can update its resource requirements") + // // a pod cannot dynamically update its resource requirements. + // requests = v1.ResourceList{} + // requests[v1.ResourceCPU] = resource.MustParse("100m") + // requests[v1.ResourceMemory] = resource.MustParse("100Mi") + // podToUpdate.Spec.Containers[0].Resources.Requests = requests + // _, err = f.ClientSet.Core().Pods(f.Namespace.Name).Update(podToUpdate) + // Expect(err).NotTo(HaveOccurred()) + + // By("Ensuring attempts to update pod resource requirements did change quota usage") + // usedResources[v1.ResourceQuotas] = resource.MustParse("1") + // usedResources[v1.ResourcePods] = resource.MustParse("1") + // usedResources[v1.ResourceCPU] = requests[v1.ResourceCPU] + // usedResources[v1.ResourceMemory] = requests[v1.ResourceMemory] + // err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quotaName, usedResources) + // Expect(err).NotTo(HaveOccurred()) + + // TODO: uncomment the test when the replenishment_controller uses the + // sharedInformer that list/watches uninitialized objects. + // By("Deleting the pod") + // err = f.ClientSet.Core().Pods(f.Namespace.Name).Delete(podName, metav1.NewDeleteOptions(0)) + // Expect(err).NotTo(HaveOccurred()) + // + // By("Ensuring resource quota status released the pod usage") + // usedResources[v1.ResourceQuotas] = resource.MustParse("1") + // usedResources[v1.ResourcePods] = resource.MustParse("0") + // usedResources[v1.ResourceCPU] = resource.MustParse("0") + // usedResources[v1.ResourceMemory] = resource.MustParse("0") + // err = waitForResourceQuota(f.ClientSet, f.Namespace.Name, quotaName, usedResources) + // Expect(err).NotTo(HaveOccurred()) + }) + It("should create a ResourceQuota and capture the life of a pod.", func() { By("Creating a ResourceQuota") quotaName := "test-quota" From 1ab88c94e8e3b9ccfe16b2b0dbf26f688be1d4df Mon Sep 17 00:00:00 2001 From: Mikhail Mazurskiy Date: Fri, 25 Aug 2017 08:11:39 +1000 Subject: [PATCH 294/403] Call the right cleanup function --- staging/src/k8s.io/client-go/tools/cache/reflector.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/client-go/tools/cache/reflector.go b/staging/src/k8s.io/client-go/tools/cache/reflector.go index d0cb2dd152a58..4967f98d4600e 100644 --- a/staging/src/k8s.io/client-go/tools/cache/reflector.go +++ b/staging/src/k8s.io/client-go/tools/cache/reflector.go @@ -239,8 +239,6 @@ func (r *Reflector) resyncChan() (<-chan time.Time, func() bool) { func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { glog.V(3).Infof("Listing and watching %v from %s", r.expectedType, r.name) var resourceVersion string - resyncCh, cleanup := r.resyncChan() - defer cleanup() // Explicitly set "0" as resource version - it's fine for the List() // to be served from cache and potentially be delayed relative to @@ -272,6 +270,10 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { cancelCh := make(chan struct{}) defer close(cancelCh) go func() { + resyncCh, cleanup := r.resyncChan() + defer func() { + cleanup() // Call the last one written into cleanup + }() for { select { case <-resyncCh: From e11933f2d02cfef7a774b806de538c366616f761 Mon Sep 17 00:00:00 2001 From: Jeff Grafton Date: Thu, 24 Aug 2017 15:59:10 -0700 Subject: [PATCH 295/403] bazel: use fast docker_pull --- build/BUILD | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build/BUILD b/build/BUILD index 5fcbe1d7e4fe1..9bed34abc7c10 100644 --- a/build/BUILD +++ b/build/BUILD @@ -25,23 +25,23 @@ filegroup( # in build/common.sh. DOCKERIZED_BINARIES = { "cloud-controller-manager": { - "base": "@official_busybox//image:image.tar", + "base": "@official_busybox//image", "target": "//cmd/cloud-controller-manager:cloud-controller-manager", }, "kube-apiserver": { - "base": "@official_busybox//image:image.tar", + "base": "@official_busybox//image", "target": "//cmd/kube-apiserver:kube-apiserver", }, "kube-controller-manager": { - "base": "@official_busybox//image:image.tar", + "base": "@official_busybox//image", "target": "//cmd/kube-controller-manager:kube-controller-manager", }, "kube-scheduler": { - "base": "@official_busybox//image:image.tar", + "base": "@official_busybox//image", "target": "//plugin/cmd/kube-scheduler:kube-scheduler", }, "kube-proxy": { - "base": "@debian-iptables-amd64//image:image.tar", + "base": "@debian-iptables-amd64//image", "target": "//cmd/kube-proxy:kube-proxy", }, } From ebdbafd2c509fde48935a97a812b4c1c394b3561 Mon Sep 17 00:00:00 2001 From: crimsonfaith91 Date: Mon, 7 Aug 2017 14:49:46 -0700 Subject: [PATCH 296/403] statefulSet kubectl rollout command --- hack/make-rules/test-cmd-util.sh | 145 ++++++++++++------ .../rollingupdate-statefulset-rv2.yaml | 33 ++++ ...et.yaml => rollingupdate-statefulset.yaml} | 27 +--- .../statefulset/stateful_set_control.go | 4 +- .../statefulset/stateful_set_control_test.go | 2 +- .../statefulset/stateful_set_utils.go | 14 +- .../statefulset/stateful_set_utils_test.go | 2 +- pkg/kubectl/BUILD | 1 + pkg/kubectl/cmd/rollout/rollout.go | 1 + pkg/kubectl/cmd/rollout/rollout_history.go | 2 +- pkg/kubectl/cmd/rollout/rollout_status.go | 2 +- pkg/kubectl/cmd/rollout/rollout_undo.go | 2 +- pkg/kubectl/history.go | 54 +++++-- pkg/kubectl/rollback.go | 134 +++++++++++++--- 14 files changed, 310 insertions(+), 113 deletions(-) create mode 100644 hack/testdata/rollingupdate-statefulset-rv2.yaml rename hack/testdata/{nginx-statefulset.yaml => rollingupdate-statefulset.yaml} (50%) diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index 7a32851dfa445..835a5a229c1b4 100755 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -41,9 +41,11 @@ IMAGE_NGINX="gcr.io/google-containers/nginx:1.7.9" IMAGE_DEPLOYMENT_R1="gcr.io/google-containers/nginx:test-cmd" # deployment-revision1.yaml IMAGE_DEPLOYMENT_R2="$IMAGE_NGINX" # deployment-revision2.yaml IMAGE_PERL="gcr.io/google-containers/perl" -IMAGE_DAEMONSET_R1="gcr.io/google-containers/pause:2.0" +IMAGE_PAUSE_V2="gcr.io/google-containers/pause:2.0" IMAGE_DAEMONSET_R2="gcr.io/google-containers/pause:latest" IMAGE_DAEMONSET_R2_2="gcr.io/google-containers/nginx:test-cmd" # rollingupdate-daemonset-rv2.yaml +IMAGE_STATEFULSET_R1="gcr.io/google_containers/nginx-slim:0.7" +IMAGE_STATEFULSET_R2="gcr.io/google_containers/nginx-slim:0.8" # Expose kubectl directly for readability PATH="${KUBE_OUTPUT_HOSTBIN}":$PATH @@ -1859,7 +1861,7 @@ run_recursive_resources_tests() { # Create a deployment (revision 1) kubectl create -f hack/testdata/deployment-revision1.yaml "${kube_flags[@]}" kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" 'nginx:' - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" # Command output_message=$(kubectl convert --local -f hack/testdata/deployment-revision1.yaml --output-version=apps/v1beta1 -o go-template='{{ .apiVersion }}' "${kube_flags[@]}") echo $output_message @@ -1982,11 +1984,11 @@ run_recursive_resources_tests() { # Create deployments (revision 1) recursively from directory of YAML files ! kubectl create -f hack/testdata/recursive/deployment --recursive "${kube_flags[@]}" kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" 'nginx0-deployment:nginx1-deployment:' - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_NGINX}:${IMAGE_NGINX}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_NGINX}:${IMAGE_NGINX}:" ## Rollback the deployments to revision 1 recursively output_message=$(! kubectl rollout undo -f hack/testdata/recursive/deployment --recursive --to-revision=1 2>&1 "${kube_flags[@]}") # Post-condition: nginx0 & nginx1 should be a no-op, and since nginx2 is malformed, it should error - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_NGINX}:${IMAGE_NGINX}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_NGINX}:${IMAGE_NGINX}:" kube::test::if_has_string "${output_message}" "Object 'Kind' is missing" ## Pause the deployments recursively PRESERVE_ERR_FILE=true @@ -2621,8 +2623,8 @@ run_rc_tests() { # Create a deployment kubectl create -f hack/testdata/deployment-multicontainer-resources.yaml "${kube_flags[@]}" kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" 'nginx-deployment-resources:' - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_PERL}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_PERL}:" # Set the deployment's cpu limits kubectl set resources deployment nginx-deployment-resources --limits=cpu=100m "${kube_flags[@]}" kube::test::get_object_assert deployment "{{range.items}}{{(index .spec.template.spec.containers 0).resources.limits.cpu}}:{{end}}" "100m:" @@ -2753,27 +2755,27 @@ run_deployment_tests() { # Create a deployment (revision 1) kubectl create -f hack/testdata/deployment-revision1.yaml "${kube_flags[@]}" kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" 'nginx:' - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" # Rollback to revision 1 - should be no-op kubectl rollout undo deployment nginx --to-revision=1 "${kube_flags[@]}" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" # Update the deployment (revision 2) kubectl apply -f hack/testdata/deployment-revision2.yaml "${kube_flags[@]}" - kube::test::get_object_assert deployment.extensions "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" + kube::test::get_object_assert deployment.extensions "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" # Rollback to revision 1 with dry-run - should be no-op kubectl rollout undo deployment nginx --dry-run=true "${kube_flags[@]}" | grep "test-cmd" - kube::test::get_object_assert deployment.extensions "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" + kube::test::get_object_assert deployment.extensions "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" # Rollback to revision 1 kubectl rollout undo deployment nginx --to-revision=1 "${kube_flags[@]}" sleep 1 - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" # Rollback to revision 1000000 - should be no-op kubectl rollout undo deployment nginx --to-revision=1000000 "${kube_flags[@]}" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" # Rollback to last revision kubectl rollout undo deployment nginx "${kube_flags[@]}" sleep 1 - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" # Pause the deployment kubectl-with-retry rollout pause deployment nginx "${kube_flags[@]}" # A paused deployment cannot be rolled back @@ -2799,34 +2801,35 @@ run_deployment_tests() { # Create a deployment kubectl create -f hack/testdata/deployment-multicontainer.yaml "${kube_flags[@]}" kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" 'nginx-deployment:' - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_PERL}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_PERL}:" # Set the deployment's image kubectl set image deployment nginx-deployment nginx="${IMAGE_DEPLOYMENT_R2}" "${kube_flags[@]}" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_PERL}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_PERL}:" # Set non-existing container should fail ! kubectl set image deployment nginx-deployment redis=redis "${kube_flags[@]}" # Set image of deployments without specifying name kubectl set image deployments --all nginx="${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]}" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_PERL}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_PERL}:" # Set image of a deployment specified by file kubectl set image -f hack/testdata/deployment-multicontainer.yaml nginx="${IMAGE_DEPLOYMENT_R2}" "${kube_flags[@]}" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_PERL}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_PERL}:" # Set image of a local file without talking to the server kubectl set image -f hack/testdata/deployment-multicontainer.yaml nginx="${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]}" --local -o yaml - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_PERL}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_PERL}:" # Set image of all containers of the deployment kubectl set image deployment nginx-deployment "*"="${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]}" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" # Set image of all containners of the deployment again when image not change kubectl set image deployment nginx-deployment "*"="${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]}" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" - kube::test::get_object_assert deployment "{{range.items}}{{$deployment_second_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + kube::test::get_object_assert deployment "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:" + # Clean up kubectl delete deployment nginx-deployment "${kube_flags[@]}" @@ -3004,35 +3007,35 @@ run_daemonset_history_tests() { # Command # Create a DaemonSet (revision 1) kubectl apply -f hack/testdata/rollingupdate-daemonset.yaml --record "${kube_flags[@]}" - kube::test::get_object_assert controllerrevisions "{{range.items}}{{$annotations_field}}:{{end}}" ".*rollingupdate-daemonset.yaml --record.*" + kube::test::wait_object_assert controllerrevisions "{{range.items}}{{$annotations_field}}:{{end}}" ".*rollingupdate-daemonset.yaml --record.*" # Rollback to revision 1 - should be no-op kubectl rollout undo daemonset --to-revision=1 "${kube_flags[@]}" - kube::test::get_object_assert daemonset "{{range.items}}{{$daemonset_image_field0}}:{{end}}" "${IMAGE_DAEMONSET_R1}:" + kube::test::get_object_assert daemonset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_PAUSE_V2}:" kube::test::get_object_assert daemonset "{{range.items}}{{$container_len}}{{end}}" "1" # Update the DaemonSet (revision 2) kubectl apply -f hack/testdata/rollingupdate-daemonset-rv2.yaml --record "${kube_flags[@]}" - kube::test::wait_object_assert daemonset "{{range.items}}{{$daemonset_image_field0}}:{{end}}" "${IMAGE_DAEMONSET_R2}:" - kube::test::wait_object_assert daemonset "{{range.items}}{{$daemonset_image_field1}}:{{end}}" "${IMAGE_DAEMONSET_R2_2}:" + kube::test::wait_object_assert daemonset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DAEMONSET_R2}:" + kube::test::wait_object_assert daemonset "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_DAEMONSET_R2_2}:" kube::test::get_object_assert daemonset "{{range.items}}{{$container_len}}{{end}}" "2" kube::test::wait_object_assert controllerrevisions "{{range.items}}{{$annotations_field}}:{{end}}" ".*rollingupdate-daemonset-rv2.yaml --record.*" # Rollback to revision 1 with dry-run - should be no-op kubectl rollout undo daemonset --dry-run=true "${kube_flags[@]}" - kube::test::get_object_assert daemonset "{{range.items}}{{$daemonset_image_field0}}:{{end}}" "${IMAGE_DAEMONSET_R2}:" - kube::test::get_object_assert daemonset "{{range.items}}{{$daemonset_image_field1}}:{{end}}" "${IMAGE_DAEMONSET_R2_2}:" + kube::test::get_object_assert daemonset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DAEMONSET_R2}:" + kube::test::get_object_assert daemonset "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_DAEMONSET_R2_2}:" kube::test::get_object_assert daemonset "{{range.items}}{{$container_len}}{{end}}" "2" # Rollback to revision 1 kubectl rollout undo daemonset --to-revision=1 "${kube_flags[@]}" - kube::test::wait_object_assert daemonset "{{range.items}}{{$daemonset_image_field0}}:{{end}}" "${IMAGE_DAEMONSET_R1}:" + kube::test::wait_object_assert daemonset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_PAUSE_V2}:" kube::test::get_object_assert daemonset "{{range.items}}{{$container_len}}{{end}}" "1" # Rollback to revision 1000000 - should fail output_message=$(! kubectl rollout undo daemonset --to-revision=1000000 "${kube_flags[@]}" 2>&1) kube::test::if_has_string "${output_message}" "unable to find specified revision" - kube::test::get_object_assert daemonset "{{range.items}}{{$daemonset_image_field0}}:{{end}}" "${IMAGE_DAEMONSET_R1}:" + kube::test::get_object_assert daemonset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_PAUSE_V2}:" kube::test::get_object_assert daemonset "{{range.items}}{{$container_len}}{{end}}" "1" # Rollback to last revision kubectl rollout undo daemonset "${kube_flags[@]}" - kube::test::wait_object_assert daemonset "{{range.items}}{{$daemonset_image_field0}}:{{end}}" "${IMAGE_DAEMONSET_R2}:" - kube::test::wait_object_assert daemonset "{{range.items}}{{$daemonset_image_field1}}:{{end}}" "${IMAGE_DAEMONSET_R2_2}:" + kube::test::wait_object_assert daemonset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_DAEMONSET_R2}:" + kube::test::wait_object_assert daemonset "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_DAEMONSET_R2_2}:" kube::test::get_object_assert daemonset "{{range.items}}{{$container_len}}{{end}}" "2" # Clean up kubectl delete -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]}" @@ -3041,6 +3044,58 @@ run_daemonset_history_tests() { set +o errexit } +run_statefulset_history_tests() { + set -o nounset + set -o errexit + + create_and_use_new_namespace + kube::log::status "Testing kubectl(v1:statefulsets, v1:controllerrevisions)" + + ### Test rolling back a StatefulSet + # Pre-condition: no statefulset or its pods exists + kube::test::get_object_assert statefulset "{{range.items}}{{$id_field}}:{{end}}" '' + # Command + # Create a StatefulSet (revision 1) + kubectl apply -f hack/testdata/rollingupdate-statefulset.yaml --record "${kube_flags[@]}" + kube::test::wait_object_assert controllerrevisions "{{range.items}}{{$annotations_field}}:{{end}}" ".*rollingupdate-statefulset.yaml --record.*" + # Rollback to revision 1 - should be no-op + kubectl rollout undo statefulset --to-revision=1 "${kube_flags[@]}" + kube::test::get_object_assert statefulset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_STATEFULSET_R1}:" + kube::test::get_object_assert statefulset "{{range.items}}{{$container_len}}{{end}}" "1" + # Update the statefulset (revision 2) + kubectl apply -f hack/testdata/rollingupdate-statefulset-rv2.yaml --record "${kube_flags[@]}" + kube::test::wait_object_assert statefulset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_STATEFULSET_R2}:" + kube::test::wait_object_assert statefulset "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_PAUSE_V2}:" + kube::test::get_object_assert statefulset "{{range.items}}{{$container_len}}{{end}}" "2" + kube::test::wait_object_assert controllerrevisions "{{range.items}}{{$annotations_field}}:{{end}}" ".*rollingupdate-statefulset-rv2.yaml --record.*" + # Rollback to revision 1 with dry-run - should be no-op + kubectl rollout undo statefulset --dry-run=true "${kube_flags[@]}" + kube::test::get_object_assert statefulset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_STATEFULSET_R2}:" + kube::test::get_object_assert statefulset "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_PAUSE_V2}:" + kube::test::get_object_assert statefulset "{{range.items}}{{$container_len}}{{end}}" "2" + # Rollback to revision 1 + kubectl rollout undo statefulset --to-revision=1 "${kube_flags[@]}" + kube::test::wait_object_assert statefulset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_STATEFULSET_R1}:" + kube::test::get_object_assert statefulset "{{range.items}}{{$container_len}}{{end}}" "1" + # Rollback to revision 1000000 - should fail + output_message=$(! kubectl rollout undo statefulset --to-revision=1000000 "${kube_flags[@]}" 2>&1) + kube::test::if_has_string "${output_message}" "unable to find specified revision" + kube::test::get_object_assert statefulset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_STATEFULSET_R1}:" + kube::test::get_object_assert statefulset "{{range.items}}{{$container_len}}{{end}}" "1" + # Rollback to last revision + kubectl rollout undo statefulset "${kube_flags[@]}" + kube::test::wait_object_assert statefulset "{{range.items}}{{$image_field0}}:{{end}}" "${IMAGE_STATEFULSET_R2}:" + kube::test::wait_object_assert statefulset "{{range.items}}{{$image_field1}}:{{end}}" "${IMAGE_PAUSE_V2}:" + kube::test::get_object_assert statefulset "{{range.items}}{{$container_len}}{{end}}" "2" + # Clean up - delete newest configuration + kubectl delete -f hack/testdata/rollingupdate-statefulset-rv2.yaml "${kube_flags[@]}" + # Post-condition: no pods from statefulset controller + wait-for-pods-with-label "app=nginx-statefulset" "" + + set +o nounset + set +o errexit +} + run_multi_resources_tests() { set -o nounset set -o errexit @@ -3618,7 +3673,7 @@ run_stateful_set_tests() { # Pre-condition: no statefulset exists kube::test::get_object_assert statefulset "{{range.items}}{{$id_field}}:{{end}}" '' # Command: create statefulset - kubectl create -f hack/testdata/nginx-statefulset.yaml "${kube_flags[@]}" + kubectl create -f hack/testdata/rollingupdate-statefulset.yaml "${kube_flags[@]}" ### Scale statefulset test with current-replicas and replicas # Pre-condition: 0 replicas @@ -3635,7 +3690,7 @@ run_stateful_set_tests() { wait-for-pods-with-label "app=nginx-statefulset" "nginx-0" ### Clean up - kubectl delete -f hack/testdata/nginx-statefulset.yaml "${kube_flags[@]}" + kubectl delete -f hack/testdata/rollingupdate-statefulset.yaml "${kube_flags[@]}" # Post-condition: no pods from statefulset controller wait-for-pods-with-label "app=nginx-statefulset" "" @@ -4220,15 +4275,13 @@ runTests() { deployment_replicas=".spec.replicas" secret_data=".data" secret_type=".type" - deployment_image_field="(index .spec.template.spec.containers 0).image" - deployment_second_image_field="(index .spec.template.spec.containers 1).image" change_cause_annotation='.*kubernetes.io/change-cause.*' pdb_min_available=".spec.minAvailable" pdb_max_unavailable=".spec.maxUnavailable" template_generation_field=".spec.templateGeneration" container_len="(len .spec.template.spec.containers)" - daemonset_image_field0="(index .spec.template.spec.containers 0).image" - daemonset_image_field1="(index .spec.template.spec.containers 1).image" + image_field0="(index .spec.template.spec.containers 0).image" + image_field1="(index .spec.template.spec.containers 1).image" # Make sure "default" namespace exists. if kube::test::if_supports_resource "${namespaces}" ; then @@ -4434,7 +4487,6 @@ runTests() { record_command run_service_tests fi - ################## # DaemonSets # ################## @@ -4472,16 +4524,17 @@ runTests() { record_command run_rs_tests fi - ################# # Stateful Sets # ################# if kube::test::if_supports_resource "${statefulsets}" ; then record_command run_stateful_set_tests + if kube::test::if_supports_resource "${controllerrevisions}"; then + record_command run_statefulset_history_tests + fi fi - ###################### # Lists # ###################### diff --git a/hack/testdata/rollingupdate-statefulset-rv2.yaml b/hack/testdata/rollingupdate-statefulset-rv2.yaml new file mode 100644 index 0000000000000..fec5493ab6975 --- /dev/null +++ b/hack/testdata/rollingupdate-statefulset-rv2.yaml @@ -0,0 +1,33 @@ +apiVersion: apps/v1beta2 +kind: StatefulSet +metadata: + name: nginx +spec: + selector: + matchLabels: + app: nginx-statefulset + updateStrategy: + type: RollingUpdate + serviceName: "nginx" + replicas: 0 + template: + metadata: + labels: + app: nginx-statefulset + spec: + terminationGracePeriodSeconds: 5 + containers: + - name: nginx + image: gcr.io/google_containers/nginx-slim:0.8 + ports: + - containerPort: 80 + name: web + command: + - sh + - -c + - 'while true; do sleep 1; done' + - name: pause + image: gcr.io/google-containers/pause:2.0 + ports: + - containerPort: 81 + name: web-2 diff --git a/hack/testdata/nginx-statefulset.yaml b/hack/testdata/rollingupdate-statefulset.yaml similarity index 50% rename from hack/testdata/nginx-statefulset.yaml rename to hack/testdata/rollingupdate-statefulset.yaml index 299e407dfa3f3..2acbf0f322b9f 100644 --- a/hack/testdata/nginx-statefulset.yaml +++ b/hack/testdata/rollingupdate-statefulset.yaml @@ -1,26 +1,13 @@ -# A headless service to create DNS records -apiVersion: v1 -kind: Service -metadata: - annotations: - service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" - name: nginx - labels: - app: nginx-statefulset -spec: - ports: - - port: 80 - name: web - # *.nginx.default.svc.cluster.local - clusterIP: None - selector: - app: nginx-statefulset ---- -apiVersion: apps/v1beta1 +apiVersion: apps/v1beta2 kind: StatefulSet metadata: name: nginx spec: + selector: + matchLabels: + app: nginx-statefulset + updateStrategy: + type: RollingUpdate serviceName: "nginx" replicas: 0 template: @@ -28,7 +15,7 @@ spec: labels: app: nginx-statefulset spec: - terminationGracePeriodSeconds: 0 + terminationGracePeriodSeconds: 5 containers: - name: nginx image: gcr.io/google_containers/nginx-slim:0.7 diff --git a/pkg/controller/statefulset/stateful_set_control.go b/pkg/controller/statefulset/stateful_set_control.go index 0fe3ff9708c8f..dd264790d9ef8 100644 --- a/pkg/controller/statefulset/stateful_set_control.go +++ b/pkg/controller/statefulset/stateful_set_control.go @@ -256,11 +256,11 @@ func (ssc *defaultStatefulSetControl) updateStatefulSet( collisionCount int32, pods []*v1.Pod) (*apps.StatefulSetStatus, error) { // get the current and update revisions of the set. - currentSet, err := applyRevision(set, currentRevision) + currentSet, err := ApplyRevision(set, currentRevision) if err != nil { return nil, err } - updateSet, err := applyRevision(set, updateRevision) + updateSet, err := ApplyRevision(set, updateRevision) if err != nil { return nil, err } diff --git a/pkg/controller/statefulset/stateful_set_control_test.go b/pkg/controller/statefulset/stateful_set_control_test.go index 548180d34d73c..bcb38badf45fe 100644 --- a/pkg/controller/statefulset/stateful_set_control_test.go +++ b/pkg/controller/statefulset/stateful_set_control_test.go @@ -1281,7 +1281,7 @@ func TestStatefulSetControlRollback(t *testing.T) { t.Fatalf("%s: %s", test.name, err) } history.SortControllerRevisions(revisions) - set, err = applyRevision(set, revisions[0]) + set, err = ApplyRevision(set, revisions[0]) if err != nil { t.Fatalf("%s: %s", test.name, err) } diff --git a/pkg/controller/statefulset/stateful_set_utils.go b/pkg/controller/statefulset/stateful_set_utils.go index 0dc861a721238..fb80888a95690 100644 --- a/pkg/controller/statefulset/stateful_set_utils.go +++ b/pkg/controller/statefulset/stateful_set_utils.go @@ -17,6 +17,7 @@ limitations under the License. package statefulset import ( + "bytes" "encoding/json" "fmt" "regexp" @@ -266,6 +267,15 @@ func newVersionedStatefulSetPod(currentSet, updateSet *apps.StatefulSet, current return pod } +// Match check if the given StatefulSet's template matches the template stored in the given history. +func Match(ss *apps.StatefulSet, history *apps.ControllerRevision) (bool, error) { + patch, err := getPatch(ss) + if err != nil { + return false, err + } + return bytes.Equal(patch, history.Data.Raw), nil +} + // getPatch returns a strategic merge patch that can be applied to restore a StatefulSet to a // previous version. If the returned error is nil the patch is valid. The current state that we save is just the // PodSpecTemplate. We can modify this later to encompass more state (or less) and remain compatible with previously @@ -319,9 +329,9 @@ func newRevision(set *apps.StatefulSet, revision int64, collisionCount *int32) ( return cr, nil } -// applyRevision returns a new StatefulSet constructed by restoring the state in revision to set. If the returned error +// ApplyRevision returns a new StatefulSet constructed by restoring the state in revision to set. If the returned error // is nil, the returned StatefulSet is valid. -func applyRevision(set *apps.StatefulSet, revision *apps.ControllerRevision) (*apps.StatefulSet, error) { +func ApplyRevision(set *apps.StatefulSet, revision *apps.ControllerRevision) (*apps.StatefulSet, error) { obj, err := scheme.Scheme.DeepCopy(set) if err != nil { return nil, err diff --git a/pkg/controller/statefulset/stateful_set_utils_test.go b/pkg/controller/statefulset/stateful_set_utils_test.go index 85fb01ae8c60d..3b5c10c99fc4c 100644 --- a/pkg/controller/statefulset/stateful_set_utils_test.go +++ b/pkg/controller/statefulset/stateful_set_utils_test.go @@ -258,7 +258,7 @@ func TestCreateApplyRevision(t *testing.T) { key := "foo" expectedValue := "bar" set.Annotations[key] = expectedValue - restoredSet, err := applyRevision(set, revision) + restoredSet, err := ApplyRevision(set, revision) if err != nil { t.Fatal(err) } diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index 35f8eff04c854..eda5d6de078b3 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -129,6 +129,7 @@ go_library( "//pkg/client/unversioned:go_default_library", "//pkg/controller/daemon:go_default_library", "//pkg/controller/deployment/util:go_default_library", + "//pkg/controller/statefulset:go_default_library", "//pkg/credentialprovider:go_default_library", "//pkg/kubectl/resource:go_default_library", "//pkg/kubectl/util:go_default_library", diff --git a/pkg/kubectl/cmd/rollout/rollout.go b/pkg/kubectl/cmd/rollout/rollout.go index fb816c643d84f..a65ed4d8df568 100644 --- a/pkg/kubectl/cmd/rollout/rollout.go +++ b/pkg/kubectl/cmd/rollout/rollout.go @@ -42,6 +42,7 @@ var ( * deployments * daemonsets + * statefulsets `) ) diff --git a/pkg/kubectl/cmd/rollout/rollout_history.go b/pkg/kubectl/cmd/rollout/rollout_history.go index 986a51c734bcd..22f31e8e7c21d 100644 --- a/pkg/kubectl/cmd/rollout/rollout_history.go +++ b/pkg/kubectl/cmd/rollout/rollout_history.go @@ -44,7 +44,7 @@ var ( func NewCmdRolloutHistory(f cmdutil.Factory, out io.Writer) *cobra.Command { options := &resource.FilenameOptions{} - validArgs := []string{"deployment", "daemonset"} + validArgs := []string{"deployment", "daemonset", "statefulset"} argAliases := kubectl.ResourceAliases(validArgs) cmd := &cobra.Command{ diff --git a/pkg/kubectl/cmd/rollout/rollout_status.go b/pkg/kubectl/cmd/rollout/rollout_status.go index be9c7f0692427..e54f22030f8af 100644 --- a/pkg/kubectl/cmd/rollout/rollout_status.go +++ b/pkg/kubectl/cmd/rollout/rollout_status.go @@ -50,7 +50,7 @@ var ( func NewCmdRolloutStatus(f cmdutil.Factory, out io.Writer) *cobra.Command { options := &resource.FilenameOptions{} - validArgs := []string{"deployment", "daemonset"} + validArgs := []string{"deployment", "daemonset", "statefulset"} argAliases := kubectl.ResourceAliases(validArgs) cmd := &cobra.Command{ diff --git a/pkg/kubectl/cmd/rollout/rollout_undo.go b/pkg/kubectl/cmd/rollout/rollout_undo.go index 2db0034231539..c703924c42f16 100644 --- a/pkg/kubectl/cmd/rollout/rollout_undo.go +++ b/pkg/kubectl/cmd/rollout/rollout_undo.go @@ -64,7 +64,7 @@ var ( func NewCmdRolloutUndo(f cmdutil.Factory, out io.Writer) *cobra.Command { options := &UndoOptions{} - validArgs := []string{"deployment", "daemonset"} + validArgs := []string{"deployment", "daemonset", "statefulset"} argAliases := kubectl.ResourceAliases(validArgs) cmd := &cobra.Command{ diff --git a/pkg/kubectl/history.go b/pkg/kubectl/history.go index 5277abfbc89d2..7bf4eb5b88c37 100644 --- a/pkg/kubectl/history.go +++ b/pkg/kubectl/history.go @@ -153,9 +153,9 @@ type DaemonSetHistoryViewer struct { // ViewHistory returns a revision-to-history map as the revision history of a deployment // TODO: this should be a describer func (h *DaemonSetHistoryViewer) ViewHistory(namespace, name string, revision int64) (string, error) { - versionedExtensionsClient := versionedExtensionsClientV1beta1(h.c) versionedAppsClient := versionedAppsClientV1beta1(h.c) - ds, allHistory, err := controlledHistories(versionedExtensionsClient, versionedAppsClient, namespace, name) + versionedExtensionsClient := versionedExtensionsClientV1beta1(h.c) + versionedObj, allHistory, err := controlledHistories(versionedAppsClient, versionedExtensionsClient, namespace, name, "DaemonSet") if err != nil { return "", fmt.Errorf("unable to find history controlled by DaemonSet %s: %v", name, err) } @@ -175,7 +175,13 @@ func (h *DaemonSetHistoryViewer) ViewHistory(namespace, name string, revision in if !ok { return "", fmt.Errorf("unable to find the specified revision") } - dsOfHistory, err := applyHistory(ds, history) + + versionedDS, ok := versionedObj.(*extensionsv1beta1.DaemonSet) + if !ok { + return "", fmt.Errorf("unexpected non-DaemonSet object returned: %v", versionedDS) + } + + dsOfHistory, err := applyHistory(versionedDS, history) if err != nil { return "", fmt.Errorf("unable to parse history %s", history.Name) } @@ -256,29 +262,51 @@ func (h *StatefulSetHistoryViewer) ViewHistory(namespace, name string, revision }) } -// controlledHistories returns all ControllerRevisions controlled by the given DaemonSet -func controlledHistories(extensions clientextensionsv1beta1.ExtensionsV1beta1Interface, apps clientappsv1beta1.AppsV1beta1Interface, namespace, name string) (*extensionsv1beta1.DaemonSet, []*appsv1beta1.ControllerRevision, error) { - ds, err := extensions.DaemonSets(namespace).Get(name, metav1.GetOptions{}) - if err != nil { - return nil, nil, fmt.Errorf("failed to retrieve DaemonSet %s: %v", name, err) +// controlledHistories returns all ControllerRevisions controlled by the given API object +func controlledHistories(apps clientappsv1beta1.AppsV1beta1Interface, extensions clientextensionsv1beta1.ExtensionsV1beta1Interface, namespace, name, kind string) (runtime.Object, []*appsv1beta1.ControllerRevision, error) { + var obj runtime.Object + var labelSelector *metav1.LabelSelector + + switch kind { + case "DaemonSet": + ds, err := extensions.DaemonSets(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return nil, nil, fmt.Errorf("failed to retrieve DaemonSet %s: %v", name, err) + } + labelSelector = ds.Spec.Selector + obj = ds + case "StatefulSet": + ss, err := apps.StatefulSets(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return nil, nil, fmt.Errorf("failed to retrieve StatefulSet %s: %v", name, err) + } + labelSelector = ss.Spec.Selector + obj = ss + default: + return nil, nil, fmt.Errorf("unsupported API object kind: %s", kind) } + var result []*appsv1beta1.ControllerRevision - selector, err := metav1.LabelSelectorAsSelector(ds.Spec.Selector) + selector, err := metav1.LabelSelectorAsSelector(labelSelector) if err != nil { return nil, nil, err } - historyList, err := apps.ControllerRevisions(ds.Namespace).List(metav1.ListOptions{LabelSelector: selector.String()}) + historyList, err := apps.ControllerRevisions(namespace).List(metav1.ListOptions{LabelSelector: selector.String()}) if err != nil { return nil, nil, err } + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, nil, fmt.Errorf("failed to obtain accessor for %s named %s: %v", kind, name, err) + } for i := range historyList.Items { history := historyList.Items[i] - // Only add history that belongs to the DaemonSet - if metav1.IsControlledBy(&history, ds) { + // Only add history that belongs to the API object + if metav1.IsControlledBy(&history, accessor) { result = append(result, &history) } } - return ds, result, nil + return obj, result, nil } // applyHistory returns a specific revision of DaemonSet by applying the given history to a copy of the given DaemonSet diff --git a/pkg/kubectl/rollback.go b/pkg/kubectl/rollback.go index 957cbf111e413..31f74d81c06f6 100644 --- a/pkg/kubectl/rollback.go +++ b/pkg/kubectl/rollback.go @@ -39,6 +39,7 @@ import ( clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/controller/daemon" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" + "k8s.io/kubernetes/pkg/controller/statefulset" sliceutil "k8s.io/kubernetes/pkg/kubectl/util/slice" printersinternal "k8s.io/kubernetes/pkg/printers/internalversion" ) @@ -59,6 +60,8 @@ func RollbackerFor(kind schema.GroupKind, c clientset.Interface) (Rollbacker, er return &DeploymentRollbacker{c}, nil case extensions.Kind("DaemonSet"), apps.Kind("DaemonSet"): return &DaemonSetRollbacker{c}, nil + case apps.Kind("StatefulSet"): + return &StatefulSetRollbacker{c}, nil } return nil, fmt.Errorf("no rollbacker has been implemented for %q", kind) } @@ -221,32 +224,22 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma if !ok { return "", fmt.Errorf("passed object is not a DaemonSet: %#v", obj) } - versionedExtensionsClient := versionedExtensionsClientV1beta1(r.c) versionedAppsClient := versionedAppsClientV1beta1(r.c) - versionedDS, allHistory, err := controlledHistories(versionedExtensionsClient, versionedAppsClient, ds.Namespace, ds.Name) + versionedExtensionsClient := versionedExtensionsClientV1beta1(r.c) + versionedObj, allHistory, err := controlledHistories(versionedAppsClient, versionedExtensionsClient, ds.Namespace, ds.Name, "DaemonSet") if err != nil { return "", fmt.Errorf("unable to find history controlled by DaemonSet %s: %v", ds.Name, err) } + versionedDS, ok := versionedObj.(*externalextensions.DaemonSet) + if !ok { + return "", fmt.Errorf("unexpected non-DaemonSet object returned: %v", versionedDS) + } if toRevision == 0 && len(allHistory) <= 1 { return "", fmt.Errorf("no last revision to roll back to") } - // Find the history to rollback to - var toHistory *appsv1beta1.ControllerRevision - if toRevision == 0 { - // If toRevision == 0, find the latest revision (2nd max) - sort.Sort(historiesByRevision(allHistory)) - toHistory = allHistory[len(allHistory)-2] - } else { - for _, h := range allHistory { - if h.Revision == toRevision { - // If toRevision != 0, find the history with matching revision - toHistory = h - break - } - } - } + toHistory := findHistory(toRevision, allHistory) if toHistory == nil { return "", revisionNotFoundErr(toRevision) } @@ -256,14 +249,7 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma if err != nil { return "", err } - content := bytes.NewBuffer([]byte{}) - w := printersinternal.NewPrefixWriter(content) - internalTemplate := &api.PodTemplateSpec{} - if err := apiv1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&appliedDS.Spec.Template, internalTemplate, nil); err != nil { - return "", fmt.Errorf("failed to convert podtemplate while printing: %v", err) - } - printersinternal.DescribePodTemplate(internalTemplate, w) - return fmt.Sprintf("will roll back to %s", content.String()), nil + return printPodTemplate(&appliedDS.Spec.Template) } // Skip if the revision already matches current DaemonSet @@ -283,6 +269,104 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma return rollbackSuccess, nil } +type StatefulSetRollbacker struct { + c clientset.Interface +} + +// toRevision is a non-negative integer, with 0 being reserved to indicate rolling back to previous configuration +func (r *StatefulSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations map[string]string, toRevision int64, dryRun bool) (string, error) { + if toRevision < 0 { + return "", revisionNotFoundErr(toRevision) + } + + ss, ok := obj.(*apps.StatefulSet) + if !ok { + return "", fmt.Errorf("passed object is not a StatefulSet: %#v", obj) + } + versionedAppsClient := versionedAppsClientV1beta1(r.c) + versionedExtensionsClient := versionedExtensionsClientV1beta1(r.c) + versionedObj, allHistory, err := controlledHistories(versionedAppsClient, versionedExtensionsClient, ss.Namespace, ss.Name, "StatefulSet") + if err != nil { + return "", fmt.Errorf("unable to find history controlled by StatefulSet %s: %v", ss.Name, err) + } + + versionedSS, ok := versionedObj.(*appsv1beta1.StatefulSet) + if !ok { + return "", fmt.Errorf("unexpected non-StatefulSet object returned: %v", versionedSS) + } + + if toRevision == 0 && len(allHistory) <= 1 { + return "", fmt.Errorf("no last revision to roll back to") + } + + toHistory := findHistory(toRevision, allHistory) + if toHistory == nil { + return "", revisionNotFoundErr(toRevision) + } + + if dryRun { + appliedSS, err := statefulset.ApplyRevision(versionedSS, toHistory) + if err != nil { + return "", err + } + return printPodTemplate(&appliedSS.Spec.Template) + } + + // Skip if the revision already matches current StatefulSet + done, err := statefulset.Match(versionedSS, toHistory) + if err != nil { + return "", err + } + if done { + return fmt.Sprintf("%s (current template already matches revision %d)", rollbackSkipped, toRevision), nil + } + + // Restore revision + if _, err = versionedAppsClient.StatefulSets(ss.Namespace).Patch(ss.Name, types.StrategicMergePatchType, toHistory.Data.Raw); err != nil { + return "", fmt.Errorf("failed restoring revision %d: %v", toRevision, err) + } + + return rollbackSuccess, nil +} + +// findHistory returns a controllerrevision of a specific revision from the given controllerrevisions. +// It returns nil if no such controllerrevision exists. +// If toRevision is 0, the last previously used history is returned. +func findHistory(toRevision int64, allHistory []*appsv1beta1.ControllerRevision) *appsv1beta1.ControllerRevision { + if toRevision == 0 && len(allHistory) <= 1 { + return nil + } + + // Find the history to rollback to + var toHistory *appsv1beta1.ControllerRevision + if toRevision == 0 { + // If toRevision == 0, find the latest revision (2nd max) + sort.Sort(historiesByRevision(allHistory)) + toHistory = allHistory[len(allHistory)-2] + } else { + for _, h := range allHistory { + if h.Revision == toRevision { + // If toRevision != 0, find the history with matching revision + return h + } + } + } + + return toHistory +} + +// printPodTemplate converts a given pod template into a human-readable string. +func printPodTemplate(specTemplate *v1.PodTemplateSpec) (string, error) { + content := bytes.NewBuffer([]byte{}) + w := printersinternal.NewPrefixWriter(content) + internalTemplate := &api.PodTemplateSpec{} + if err := apiv1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(specTemplate, internalTemplate, nil); err != nil { + return "", fmt.Errorf("failed to convert podtemplate while printing: %v", err) + } + printersinternal.DescribePodTemplate(internalTemplate, w) + return fmt.Sprintf("will roll back to %s", content.String()), nil +} + func revisionNotFoundErr(r int64) error { return fmt.Errorf("unable to find specified revision %v in history", r) } From 2f1ea47c83fd64a9fd774e6337cf6ae7c2be940c Mon Sep 17 00:00:00 2001 From: Josh Horwitz Date: Mon, 21 Aug 2017 14:55:43 -0400 Subject: [PATCH 297/403] Add InstanceExists* methods to cloud provider interface for CCM --- pkg/cloudprovider/cloud.go | 5 +- pkg/cloudprovider/providers/aws/aws.go | 5 + .../providers/azure/azure_instances.go | 6 + pkg/cloudprovider/providers/fake/fake.go | 14 +- .../providers/gce/gce_instances.go | 6 + .../openstack/openstack_instances.go | 5 + pkg/cloudprovider/providers/ovirt/ovirt.go | 5 + pkg/cloudprovider/providers/photon/photon.go | 5 + .../providers/rackspace/rackspace.go | 5 + .../providers/vsphere/vsphere.go | 5 + pkg/controller/cloud/node_controller.go | 67 ++++++--- pkg/controller/cloud/node_controller_test.go | 130 +++++++++++++++++- pkg/volume/cinder/attacher_test.go | 4 + 13 files changed, 235 insertions(+), 27 deletions(-) diff --git a/pkg/cloudprovider/cloud.go b/pkg/cloudprovider/cloud.go index 5c4651f7d3ad1..47e088a09e696 100644 --- a/pkg/cloudprovider/cloud.go +++ b/pkg/cloudprovider/cloud.go @@ -124,7 +124,7 @@ type Instances interface { // ProviderID is a unique identifier of the node. This will not be called // from the node whose nodeaddresses are being queried. i.e. local metadata // services cannot be used in this method to obtain nodeaddresses - NodeAddressesByProviderID(providerId string) ([]v1.NodeAddress, error) + NodeAddressesByProviderID(providerID string) ([]v1.NodeAddress, error) // ExternalID returns the cloud provider ID of the node with the specified NodeName. // Note that if the instance does not exist or is no longer running, we must return ("", cloudprovider.InstanceNotFound) ExternalID(nodeName types.NodeName) (string, error) @@ -140,6 +140,9 @@ type Instances interface { // CurrentNodeName returns the name of the node we are currently running on // On most clouds (e.g. GCE) this is the hostname, so we provide the hostname CurrentNodeName(hostname string) (types.NodeName, error) + // InstanceExistsByProviderID returns true if the instance for the given provider id still is running. + // If false is returned with no error, the instance will be immediately deleted. + InstanceExistsByProviderID(providerID string) (bool, error) } // Route is a representation of an advanced routing rule. diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index 217fbcad45fd7..18fbbc3b453ac 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -1101,6 +1101,11 @@ func (c *Cloud) ExternalID(nodeName types.NodeName) (string, error) { return orEmpty(instance.InstanceId), nil } +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +func (c *Cloud) InstanceExistsByProviderID(providerID string) (bool, error) { + return false, errors.New("unimplemented") +} + // InstanceID returns the cloud provider ID of the node with the specified nodeName. func (c *Cloud) InstanceID(nodeName types.NodeName) (string, error) { // In the future it is possible to also return an endpoint as: diff --git a/pkg/cloudprovider/providers/azure/azure_instances.go b/pkg/cloudprovider/providers/azure/azure_instances.go index b94b8225d6423..e0fb6d0753f06 100644 --- a/pkg/cloudprovider/providers/azure/azure_instances.go +++ b/pkg/cloudprovider/providers/azure/azure_instances.go @@ -17,6 +17,7 @@ limitations under the License. package azure import ( + "errors" "fmt" "k8s.io/api/core/v1" @@ -86,6 +87,11 @@ func (az *Cloud) ExternalID(name types.NodeName) (string, error) { return az.InstanceID(name) } +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +func (az *Cloud) InstanceExistsByProviderID(providerID string) (bool, error) { + return false, errors.New("unimplemented") +} + func (az *Cloud) isCurrentInstance(name types.NodeName) (bool, error) { nodeName := mapNodeNameToVMName(name) metadataName, err := az.metadata.Text("instance/compute/name") diff --git a/pkg/cloudprovider/providers/fake/fake.go b/pkg/cloudprovider/providers/fake/fake.go index 05c10c146cc2b..633dbba8ae778 100644 --- a/pkg/cloudprovider/providers/fake/fake.go +++ b/pkg/cloudprovider/providers/fake/fake.go @@ -47,8 +47,12 @@ type FakeUpdateBalancerCall struct { // FakeCloud is a test-double implementation of Interface, LoadBalancer, Instances, and Routes. It is useful for testing. type FakeCloud struct { - Exists bool - Err error + Exists bool + Err error + + ExistsByProviderID bool + ErrByProviderID error + Calls []string Addresses []v1.NodeAddress ExtID map[types.NodeName]string @@ -234,6 +238,12 @@ func (f *FakeCloud) InstanceTypeByProviderID(providerID string) (string, error) return f.InstanceTypes[types.NodeName(providerID)], nil } +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +func (f *FakeCloud) InstanceExistsByProviderID(providerID string) (bool, error) { + f.addCall("instance-exists-by-provider-id") + return f.ExistsByProviderID, f.ErrByProviderID +} + // List is a test-spy implementation of Instances.List. // It adds an entry "list" into the internal method call record. func (f *FakeCloud) List(filter string) ([]types.NodeName, error) { diff --git a/pkg/cloudprovider/providers/gce/gce_instances.go b/pkg/cloudprovider/providers/gce/gce_instances.go index 4c1c4af6c966d..25f3728bef25f 100644 --- a/pkg/cloudprovider/providers/gce/gce_instances.go +++ b/pkg/cloudprovider/providers/gce/gce_instances.go @@ -17,6 +17,7 @@ limitations under the License. package gce import ( + "errors" "fmt" "net/http" "strconv" @@ -151,6 +152,11 @@ func (gce *GCECloud) ExternalID(nodeName types.NodeName) (string, error) { return strconv.FormatUint(inst.ID, 10), nil } +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +func (gce *GCECloud) InstanceExistsByProviderID(providerID string) (bool, error) { + return false, errors.New("unimplemented") +} + // InstanceID returns the cloud provider ID of the node with the specified NodeName. func (gce *GCECloud) InstanceID(nodeName types.NodeName) (string, error) { instanceName := mapNodeNameToInstanceName(nodeName) diff --git a/pkg/cloudprovider/providers/openstack/openstack_instances.go b/pkg/cloudprovider/providers/openstack/openstack_instances.go index 2ae872cc99982..d8f96061f75e0 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_instances.go +++ b/pkg/cloudprovider/providers/openstack/openstack_instances.go @@ -110,6 +110,11 @@ func (i *Instances) ExternalID(name types.NodeName) (string, error) { return srv.ID, nil } +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +func (i *Instances) InstanceExistsByProviderID(providerID string) (bool, error) { + return false, errors.New("unimplemented") +} + // InstanceID returns the kubelet's cloud provider ID. func (os *OpenStack) InstanceID() (string, error) { if len(os.localInstanceID) == 0 { diff --git a/pkg/cloudprovider/providers/ovirt/ovirt.go b/pkg/cloudprovider/providers/ovirt/ovirt.go index fe71113ed0af7..38c22e0f1b01a 100644 --- a/pkg/cloudprovider/providers/ovirt/ovirt.go +++ b/pkg/cloudprovider/providers/ovirt/ovirt.go @@ -211,6 +211,11 @@ func (v *OVirtCloud) ExternalID(nodeName types.NodeName) (string, error) { return instance.UUID, nil } +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +func (v *OVirtCloud) InstanceExistsByProviderID(providerID string) (bool, error) { + return false, errors.New("unimplemented") +} + // InstanceID returns the cloud provider ID of the node with the specified NodeName. func (v *OVirtCloud) InstanceID(nodeName types.NodeName) (string, error) { name := mapNodeNameToInstanceName(nodeName) diff --git a/pkg/cloudprovider/providers/photon/photon.go b/pkg/cloudprovider/providers/photon/photon.go index e9c9fbc87a719..37466bd34689e 100644 --- a/pkg/cloudprovider/providers/photon/photon.go +++ b/pkg/cloudprovider/providers/photon/photon.go @@ -470,6 +470,11 @@ func (pc *PCCloud) ExternalID(nodeName k8stypes.NodeName) (string, error) { } } +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +func (pc *PCCloud) InstanceExistsByProviderID(providerID string) (bool, error) { + return false, errors.New("unimplemented") +} + // InstanceID returns the cloud provider ID of the specified instance. func (pc *PCCloud) InstanceID(nodeName k8stypes.NodeName) (string, error) { name := string(nodeName) diff --git a/pkg/cloudprovider/providers/rackspace/rackspace.go b/pkg/cloudprovider/providers/rackspace/rackspace.go index b087bfa4cea49..61127aea0e236 100644 --- a/pkg/cloudprovider/providers/rackspace/rackspace.go +++ b/pkg/cloudprovider/providers/rackspace/rackspace.go @@ -436,6 +436,11 @@ func (i *Instances) ExternalID(nodeName types.NodeName) (string, error) { return probeInstanceID(i.compute, serverName) } +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +func (i *Instances) InstanceExistsByProviderID(providerID string) (bool, error) { + return false, errors.New("unimplemented") +} + // InstanceID returns the cloud provider ID of the kubelet's instance. func (rs *Rackspace) InstanceID() (string, error) { return readInstanceID() diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 2105edcd6e9ac..58e1a3020ec4f 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -376,6 +376,11 @@ func (vs *VSphere) ExternalID(nodeName k8stypes.NodeName) (string, error) { return vs.InstanceID(nodeName) } +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +func (vs *VSphere) InstanceExistsByProviderID(providerID string) (bool, error) { + return false, errors.New("unimplemented") +} + // InstanceID returns the cloud provider ID of the node with the specified Name. func (vs *VSphere) InstanceID(nodeName k8stypes.NodeName) (string, error) { if vs.localInstanceID == nodeNameToVMName(nodeName) { diff --git a/pkg/controller/cloud/node_controller.go b/pkg/controller/cloud/node_controller.go index bb470d41bc4be..c5557832d0fd7 100644 --- a/pkg/controller/cloud/node_controller.go +++ b/pkg/controller/cloud/node_controller.go @@ -237,26 +237,36 @@ func (cnc *CloudNodeController) MonitorNode() { if currentReadyCondition.Status != v1.ConditionTrue { // Check with the cloud provider to see if the node still exists. If it // doesn't, delete the node immediately. - if _, err := instances.ExternalID(types.NodeName(node.Name)); err != nil { - if err == cloudprovider.InstanceNotFound { - glog.V(2).Infof("Deleting node no longer present in cloud provider: %s", node.Name) - ref := &v1.ObjectReference{ - Kind: "Node", - Name: node.Name, - UID: types.UID(node.UID), - Namespace: "", - } - glog.V(2).Infof("Recording %s event message for node %s", "DeletingNode", node.Name) - cnc.recorder.Eventf(ref, v1.EventTypeNormal, fmt.Sprintf("Deleting Node %v because it's not present according to cloud provider", node.Name), "Node %s event: %s", node.Name, "DeletingNode") - go func(nodeName string) { - defer utilruntime.HandleCrash() - if err := cnc.kubeClient.CoreV1().Nodes().Delete(node.Name, nil); err != nil { - glog.Errorf("unable to delete node %q: %v", node.Name, err) - } - }(node.Name) - } - glog.Errorf("Error getting node data from cloud: %v", err) + exists, err := ensureNodeExistsByProviderIDOrName(instances, node) + if err != nil { + glog.Errorf("Error getting data for node %s from cloud: %v", node.Name, err) + continue + } + + if exists { + // Continue checking the remaining nodes since the current one is fine. + continue + } + + glog.V(2).Infof("Deleting node since it is no longer present in cloud provider: %s", node.Name) + + ref := &v1.ObjectReference{ + Kind: "Node", + Name: node.Name, + UID: types.UID(node.UID), + Namespace: "", } + glog.V(2).Infof("Recording %s event message for node %s", "DeletingNode", node.Name) + + cnc.recorder.Eventf(ref, v1.EventTypeNormal, fmt.Sprintf("Deleting Node %v because it's not present according to cloud provider", node.Name), "Node %s event: %s", node.Name, "DeletingNode") + + go func(nodeName string) { + defer utilruntime.HandleCrash() + if err := cnc.kubeClient.CoreV1().Nodes().Delete(nodeName, nil); err != nil { + glog.Errorf("unable to delete node %q: %v", nodeName, err) + } + }(node.Name) + } } } @@ -372,6 +382,25 @@ func excludeTaintFromList(taints []v1.Taint, toExclude v1.Taint) []v1.Taint { return newTaints } +// ensureNodeExistsByProviderIDOrName first checks if the instance exists by the provider id and then by node name +func ensureNodeExistsByProviderIDOrName(instances cloudprovider.Instances, node *v1.Node) (bool, error) { + exists, err := instances.InstanceExistsByProviderID(node.Spec.ProviderID) + if err != nil { + providerIDErr := err + _, err = instances.ExternalID(types.NodeName(node.Name)) + if err == nil { + return true, nil + } + if err == cloudprovider.InstanceNotFound { + return false, nil + } + + return false, fmt.Errorf("InstanceExistsByProviderID: Error fetching by providerID: %v Error fetching by NodeName: %v", providerIDErr, err) + } + + return exists, nil +} + func getNodeAddressesByProviderIDOrName(instances cloudprovider.Instances, node *v1.Node) ([]v1.NodeAddress, error) { nodeAddresses, err := instances.NodeAddressesByProviderID(node.Spec.ProviderID) if err != nil { diff --git a/pkg/controller/cloud/node_controller_test.go b/pkg/controller/cloud/node_controller_test.go index 033dbe9088900..49e956e93fdf4 100644 --- a/pkg/controller/cloud/node_controller_test.go +++ b/pkg/controller/cloud/node_controller_test.go @@ -17,6 +17,8 @@ limitations under the License. package cloud import ( + "errors" + "reflect" "testing" "time" @@ -39,6 +41,119 @@ import ( "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm" ) +func TestEnsureNodeExistsByProviderIDOrNodeName(t *testing.T) { + + testCases := []struct { + testName string + node *v1.Node + expectedCalls []string + existsByNodeName bool + existsByProviderID bool + nodeNameErr error + providerIDErr error + }{ + { + testName: "node exists by provider id", + existsByProviderID: true, + providerIDErr: nil, + existsByNodeName: false, + nodeNameErr: errors.New("unimplemented"), + expectedCalls: []string{"instance-exists-by-provider-id"}, + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node0", + }, + Spec: v1.NodeSpec{ + ProviderID: "node0", + }, + }, + }, + { + testName: "does not exist by provider id", + existsByProviderID: false, + providerIDErr: nil, + existsByNodeName: false, + nodeNameErr: errors.New("unimplemented"), + expectedCalls: []string{"instance-exists-by-provider-id"}, + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node0", + }, + Spec: v1.NodeSpec{ + ProviderID: "node0", + }, + }, + }, + { + testName: "node exists by node name", + existsByProviderID: false, + providerIDErr: errors.New("unimplemented"), + existsByNodeName: true, + nodeNameErr: nil, + expectedCalls: []string{"instance-exists-by-provider-id", "external-id"}, + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node0", + }, + Spec: v1.NodeSpec{ + ProviderID: "node0", + }, + }, + }, + { + testName: "does not exist by node name", + existsByProviderID: false, + providerIDErr: errors.New("unimplemented"), + existsByNodeName: false, + nodeNameErr: cloudprovider.InstanceNotFound, + expectedCalls: []string{"instance-exists-by-provider-id", "external-id"}, + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node0", + }, + Spec: v1.NodeSpec{ + ProviderID: "node0", + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.testName, func(t *testing.T) { + fc := &fakecloud.FakeCloud{ + Exists: tc.existsByNodeName, + ExistsByProviderID: tc.existsByProviderID, + Err: tc.nodeNameErr, + ErrByProviderID: tc.providerIDErr, + } + + instances, _ := fc.Instances() + exists, err := ensureNodeExistsByProviderIDOrName(instances, tc.node) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(fc.Calls, tc.expectedCalls) { + t.Fatalf("expected cloud provider methods `%v` to be called but `%v` was called ", tc.expectedCalls, fc.Calls) + } + + if tc.existsByProviderID && tc.existsByProviderID != exists { + t.Fatalf("expected exist by provider id to be `%t` but got `%t`", tc.existsByProviderID, exists) + } + + if tc.existsByNodeName && tc.existsByNodeName != exists { + t.Fatalf("expected exist by node name to be `%t` but got `%t`", tc.existsByNodeName, exists) + } + + if !tc.existsByNodeName && !tc.existsByProviderID && exists { + t.Fatal("node is not supposed to exist") + } + + }) + } + +} + // This test checks that the node is deleted when kubelet stops reporting // and cloud provider says node is gone func TestNodeDeleted(t *testing.T) { @@ -105,9 +220,12 @@ func TestNodeDeleted(t *testing.T) { eventBroadcaster := record.NewBroadcaster() cloudNodeController := &CloudNodeController{ - kubeClient: fnh, - nodeInformer: factory.Core().V1().Nodes(), - cloud: &fakecloud.FakeCloud{Err: cloudprovider.InstanceNotFound}, + kubeClient: fnh, + nodeInformer: factory.Core().V1().Nodes(), + cloud: &fakecloud.FakeCloud{ + ExistsByProviderID: false, + Err: nil, + }, nodeMonitorPeriod: 1 * time.Second, recorder: eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "cloud-controller-manager"}), nodeStatusUpdateFrequency: 1 * time.Second, @@ -520,7 +638,8 @@ func TestNodeAddresses(t *testing.T) { FailureDomain: "us-west-1a", Region: "us-west", }, - Err: nil, + ExistsByProviderID: true, + Err: nil, } eventBroadcaster := record.NewBroadcaster() @@ -639,7 +758,8 @@ func TestNodeProvidedIPAddresses(t *testing.T) { FailureDomain: "us-west-1a", Region: "us-west", }, - Err: nil, + ExistsByProviderID: true, + Err: nil, } eventBroadcaster := record.NewBroadcaster() diff --git a/pkg/volume/cinder/attacher_test.go b/pkg/volume/cinder/attacher_test.go index e1818d58447e9..d6a4b5b06e639 100644 --- a/pkg/volume/cinder/attacher_test.go +++ b/pkg/volume/cinder/attacher_test.go @@ -650,6 +650,10 @@ func (instances *instances) InstanceTypeByProviderID(providerID string) (string, return "", errors.New("Not implemented") } +func (instances *instances) InstanceExistsByProviderID(providerID string) (bool, error) { + return false, errors.New("unimplemented") +} + func (instances *instances) List(filter string) ([]types.NodeName, error) { return []types.NodeName{}, errors.New("Not implemented") } From bd3cc8311056be47156b029e7ee44ad558589b64 Mon Sep 17 00:00:00 2001 From: andrewsykim Date: Thu, 17 Aug 2017 14:46:25 -0400 Subject: [PATCH 298/403] cloudprovider.Zones should support external cloud providers --- pkg/cloudprovider/cloud.go | 13 +++++++++++++ pkg/cloudprovider/providers/aws/aws.go | 14 ++++++++++++++ .../providers/azure/azure_zones.go | 16 ++++++++++++++++ pkg/cloudprovider/providers/cloudstack/BUILD | 1 + .../providers/cloudstack/cloudstack.go | 17 +++++++++++++++++ pkg/cloudprovider/providers/fake/fake.go | 16 ++++++++++++++++ pkg/cloudprovider/providers/gce/gce_zones.go | 18 +++++++++++++++++- .../providers/openstack/openstack.go | 14 ++++++++++++++ pkg/cloudprovider/providers/photon/photon.go | 14 ++++++++++++++ .../providers/rackspace/rackspace.go | 14 ++++++++++++++ pkg/controller/cloud/node_controller.go | 17 ++++++++++++++++- 11 files changed, 152 insertions(+), 2 deletions(-) diff --git a/pkg/cloudprovider/cloud.go b/pkg/cloudprovider/cloud.go index 5c4651f7d3ad1..685adf1c9881e 100644 --- a/pkg/cloudprovider/cloud.go +++ b/pkg/cloudprovider/cloud.go @@ -184,5 +184,18 @@ type Zone struct { // Zones is an abstract, pluggable interface for zone enumeration. type Zones interface { // GetZone returns the Zone containing the current failure zone and locality region that the program is running in + // In most cases, this method is called from the kubelet querying a local metadata service to aquire its zone. + // For the case of external cloud providers, use GetZoneByProviderID or GetZoneByNodeName since GetZone + // can no longer be called from the kubelets. GetZone() (Zone, error) + + // GetZoneByProviderID returns the Zone containing the current zone and locality region of the node specified by providerId + // This method is particularly used in the context of external cloud providers where node initialization must be down + // outside the kubelets. + GetZoneByProviderID(providerID string) (Zone, error) + + // GetZoneByNodeName returns the Zone containing the current zone and locality region of the node specified by node name + // This method is particularly used in the context of external cloud providers where node initialization must be down + // outside the kubelets. + GetZoneByNodeName(nodeName types.NodeName) (Zone, error) } diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index 217fbcad45fd7..da24324ab4558 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -1201,6 +1201,20 @@ func (c *Cloud) GetZone() (cloudprovider.Zone, error) { }, nil } +// GetZoneByProviderID implements Zones.GetZoneByProviderID +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (c *Cloud) GetZoneByProviderID(providerID string) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByProviderID not implemented") +} + +// GetZoneByNodeName implements Zones.GetZoneByNodeName +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (c *Cloud) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByNodeName not imeplemented") +} + // Abstraction around AWS Instance Types // There isn't an API to get information for a particular instance type (that I know of) type awsInstanceType struct { diff --git a/pkg/cloudprovider/providers/azure/azure_zones.go b/pkg/cloudprovider/providers/azure/azure_zones.go index ab2dd9e3b27f3..3d993d414c60c 100644 --- a/pkg/cloudprovider/providers/azure/azure_zones.go +++ b/pkg/cloudprovider/providers/azure/azure_zones.go @@ -18,11 +18,13 @@ package azure import ( "encoding/json" + "errors" "io" "io/ioutil" "net/http" "sync" + "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/cloudprovider" ) @@ -55,6 +57,20 @@ func (az *Cloud) GetZone() (cloudprovider.Zone, error) { return zone, nil } +// GetZoneByProviderID implements Zones.GetZoneByProviderID +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (az *Cloud) GetZoneByProviderID(providerID string) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByProviderID not implemented") +} + +// GetZoneByNodeName implements Zones.GetZoneByNodeName +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (az *Cloud) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByNodeName not imeplemented") +} + func fetchFaultDomain() (*string, error) { resp, err := http.Get(instanceInfoURL) if err != nil { diff --git a/pkg/cloudprovider/providers/cloudstack/BUILD b/pkg/cloudprovider/providers/cloudstack/BUILD index ecfe91d54172f..0302fae33e488 100644 --- a/pkg/cloudprovider/providers/cloudstack/BUILD +++ b/pkg/cloudprovider/providers/cloudstack/BUILD @@ -19,6 +19,7 @@ go_library( "//vendor/github.com/xanzy/go-cloudstack/cloudstack:go_default_library", "//vendor/gopkg.in/gcfg.v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", ], ) diff --git a/pkg/cloudprovider/providers/cloudstack/cloudstack.go b/pkg/cloudprovider/providers/cloudstack/cloudstack.go index 1b86d8243ab39..4e0bea291e24b 100644 --- a/pkg/cloudprovider/providers/cloudstack/cloudstack.go +++ b/pkg/cloudprovider/providers/cloudstack/cloudstack.go @@ -17,12 +17,15 @@ limitations under the License. package cloudstack import ( + "errors" "fmt" "io" "github.com/golang/glog" "github.com/xanzy/go-cloudstack/cloudstack" "gopkg.in/gcfg.v1" + + "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/controller" ) @@ -130,3 +133,17 @@ func (cs *CSCloud) GetZone() (cloudprovider.Zone, error) { glog.V(2).Infof("Current zone is %v", cs.zone) return cloudprovider.Zone{Region: cs.zone}, nil } + +// GetZoneByProviderID implements Zones.GetZoneByProviderID +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (cs *CSCloud) GetZoneByProviderID(providerID string) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByProviderID not implemented") +} + +// GetZoneByNodeName implements Zones.GetZoneByNodeName +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (cs *CSCloud) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByNodeName not imeplemented") +} diff --git a/pkg/cloudprovider/providers/fake/fake.go b/pkg/cloudprovider/providers/fake/fake.go index 05c10c146cc2b..77604cbcd7122 100644 --- a/pkg/cloudprovider/providers/fake/fake.go +++ b/pkg/cloudprovider/providers/fake/fake.go @@ -252,6 +252,22 @@ func (f *FakeCloud) GetZone() (cloudprovider.Zone, error) { return f.Zone, f.Err } +// GetZoneByProviderID implements Zones.GetZoneByProviderID +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (f *FakeCloud) GetZoneByProviderID(providerID string) (cloudprovider.Zone, error) { + f.addCall("get-zone-by-provider-id") + return f.Zone, f.Err +} + +// GetZoneByNodeName implements Zones.GetZoneByNodeName +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (f *FakeCloud) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Zone, error) { + f.addCall("get-zone-by-node-name") + return f.Zone, f.Err +} + func (f *FakeCloud) ListRoutes(clusterName string) ([]*cloudprovider.Route, error) { f.Lock.Lock() defer f.Lock.Unlock() diff --git a/pkg/cloudprovider/providers/gce/gce_zones.go b/pkg/cloudprovider/providers/gce/gce_zones.go index 212e740893c74..107bb878f5491 100644 --- a/pkg/cloudprovider/providers/gce/gce_zones.go +++ b/pkg/cloudprovider/providers/gce/gce_zones.go @@ -17,12 +17,14 @@ limitations under the License. package gce import ( + "errors" "fmt" + "strings" compute "google.golang.org/api/compute/v1" + "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/cloudprovider" - "strings" ) func newZonesMetricContext(request, region string) *metricContext { @@ -37,6 +39,20 @@ func (gce *GCECloud) GetZone() (cloudprovider.Zone, error) { }, nil } +// GetZoneByProviderID implements Zones.GetZoneByProviderID +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (gce *GCECloud) GetZoneByProviderID(providerID string) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByProviderID not implemented") +} + +// GetZoneByNodeName implements Zones.GetZoneByNodeName +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (gce *GCECloud) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByNodeName not imeplemented") +} + // ListZonesInRegion returns all zones in a GCP region func (gce *GCECloud) ListZonesInRegion(region string) ([]*compute.Zone, error) { mc := newZonesMetricContext("list", region) diff --git a/pkg/cloudprovider/providers/openstack/openstack.go b/pkg/cloudprovider/providers/openstack/openstack.go index 14f70c297b8bc..e794afebbb103 100644 --- a/pkg/cloudprovider/providers/openstack/openstack.go +++ b/pkg/cloudprovider/providers/openstack/openstack.go @@ -549,6 +549,20 @@ func (os *OpenStack) GetZone() (cloudprovider.Zone, error) { return zone, nil } +// GetZoneByProviderID implements Zones.GetZoneByProviderID +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (os *OpenStack) GetZoneByProviderID(providerID string) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByProviderID not implemented") +} + +// GetZoneByNodeName implements Zones.GetZoneByNodeName +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (os *OpenStack) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByNodeName not imeplemented") +} + func (os *OpenStack) Routes() (cloudprovider.Routes, bool) { glog.V(4).Info("openstack.Routes() called") diff --git a/pkg/cloudprovider/providers/photon/photon.go b/pkg/cloudprovider/providers/photon/photon.go index e9c9fbc87a719..4d18b7a7030c5 100644 --- a/pkg/cloudprovider/providers/photon/photon.go +++ b/pkg/cloudprovider/providers/photon/photon.go @@ -521,6 +521,20 @@ func (pc *PCCloud) GetZone() (cloudprovider.Zone, error) { return pc.Zone, nil } +// GetZoneByProviderID implements Zones.GetZoneByProviderID +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (pc *PCCloud) GetZoneByProviderID(providerID string) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByProviderID not implemented") +} + +// GetZoneByNodeName implements Zones.GetZoneByNodeName +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (pc *PCCloud) GetZoneByNodeName(nodeName k8stypes.NodeName) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByNodeName not imeplemented") +} + // Routes returns a false since the interface is not supported for photon controller. func (pc *PCCloud) Routes() (cloudprovider.Routes, bool) { return nil, false diff --git a/pkg/cloudprovider/providers/rackspace/rackspace.go b/pkg/cloudprovider/providers/rackspace/rackspace.go index b087bfa4cea49..6b94209d5d77b 100644 --- a/pkg/cloudprovider/providers/rackspace/rackspace.go +++ b/pkg/cloudprovider/providers/rackspace/rackspace.go @@ -554,6 +554,20 @@ func (os *Rackspace) GetZone() (cloudprovider.Zone, error) { return cloudprovider.Zone{Region: os.region}, nil } +// GetZoneByProviderID implements Zones.GetZoneByProviderID +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (os *Rackspace) GetZoneByProviderID(providerID string) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByProviderID not implemented") +} + +// GetZoneByNodeName implements Zones.GetZoneByNodeName +// This is particularly useful in external cloud providers where the kubelet +// does not initialize node data. +func (os *Rackspace) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Zone, error) { + return cloudprovider.Zone{}, errors.New("GetZoneByNodeName not imeplemented") +} + // Create a volume of given size (in GiB) func (rs *Rackspace) CreateVolume(name string, size int, vtype, availability string, tags *map[string]string) (string, string, error) { return "", "", errors.New("unimplemented") diff --git a/pkg/controller/cloud/node_controller.go b/pkg/controller/cloud/node_controller.go index bb470d41bc4be..c4ef9eee827e3 100644 --- a/pkg/controller/cloud/node_controller.go +++ b/pkg/controller/cloud/node_controller.go @@ -321,7 +321,7 @@ func (cnc *CloudNodeController) AddCloudNode(obj interface{}) { } if zones, ok := cnc.cloud.Zones(); ok { - zone, err := zones.GetZone() + zone, err := getZoneByProviderIDOrName(zones, curNode) if err != nil { return fmt.Errorf("failed to get zone from cloud provider: %v", err) } @@ -430,3 +430,18 @@ func getInstanceTypeByProviderIDOrName(instances cloudprovider.Instances, node * } return instanceType, err } + +// getZoneByProviderIDorName will attempt to get the zone of node using its providerID +// then it's name. If both attempts fail, an error is returned +func getZoneByProviderIDOrName(zones cloudprovider.Zones, node *v1.Node) (cloudprovider.Zone, error) { + zone, err := zones.GetZoneByProviderID(node.Spec.ProviderID) + if err != nil { + providerIDErr := err + zone, err = zones.GetZoneByNodeName(types.NodeName(node.Name)) + if err != nil { + return cloudprovider.Zone{}, fmt.Errorf("Zone: Error fetching by providerID: %v Error fetching by NodeName: %v", providerIDErr, err) + } + } + + return zone, nil +} From 130f5d10adf13492f3435ab85a50d357a6831f6e Mon Sep 17 00:00:00 2001 From: Cao Shufeng Date: Sun, 20 Aug 2017 11:27:34 +0800 Subject: [PATCH 299/403] set --audit-log-format default to json Updates: https://github.com/kubernetes/kubernetes/issues/48561 --- cmd/kube-apiserver/app/options/options_test.go | 2 +- staging/src/k8s.io/apiserver/pkg/server/options/audit.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/kube-apiserver/app/options/options_test.go b/cmd/kube-apiserver/app/options/options_test.go index b96a878ec2711..41b6c99ff0ab3 100644 --- a/cmd/kube-apiserver/app/options/options_test.go +++ b/cmd/kube-apiserver/app/options/options_test.go @@ -133,7 +133,7 @@ func TestAddFlagsFlag(t *testing.T) { MaxAge: 11, MaxBackups: 12, MaxSize: 13, - Format: "legacy", + Format: "json", }, WebhookOptions: apiserveroptions.AuditWebhookOptions{ Mode: "blocking", diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/audit.go b/staging/src/k8s.io/apiserver/pkg/server/options/audit.go index 9e673848beac7..a79bb5d7c61d5 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/audit.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/audit.go @@ -81,7 +81,7 @@ type AuditWebhookOptions struct { func NewAuditOptions() *AuditOptions { return &AuditOptions{ WebhookOptions: AuditWebhookOptions{Mode: pluginwebhook.ModeBatch}, - LogOptions: AuditLogOptions{Format: pluginlog.FormatLegacy}, + LogOptions: AuditLogOptions{Format: pluginlog.FormatJson}, } } From a975ee1301e44056b3b31519c93f1e2dbbd82b8b Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Thu, 24 Aug 2017 16:32:12 +0800 Subject: [PATCH 300/403] Fix validation return value --- pkg/api/helper/helpers.go | 2 ++ pkg/api/validation/validation.go | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/api/helper/helpers.go b/pkg/api/helper/helpers.go index 93eb7a130dbc0..a77bf04892d89 100644 --- a/pkg/api/helper/helpers.go +++ b/pkg/api/helper/helpers.go @@ -207,6 +207,8 @@ var standardResources = sets.NewString( string(api.ResourcePersistentVolumeClaims), string(api.ResourceStorage), string(api.ResourceRequestsStorage), + string(api.ResourceServicesNodePorts), + string(api.ResourceServicesLoadBalancers), ) // IsStandardResourceName returns true if the resource is known to the system diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index f34205a59cc2b..37cf856ebb7dd 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -3409,7 +3409,7 @@ func validateResourceName(value string, fldPath *field.Path) field.ErrorList { } } - return field.ErrorList{} + return allErrs } // Validate container resource name @@ -3422,7 +3422,7 @@ func validateContainerResourceName(value string, fldPath *field.Path) field.Erro return append(allErrs, field.Invalid(fldPath, value, "must be a standard resource for containers")) } } - return field.ErrorList{} + return allErrs } // Validate resource names that can go in a resource quota @@ -3434,7 +3434,7 @@ func ValidateResourceQuotaResourceName(value string, fldPath *field.Path) field. return append(allErrs, field.Invalid(fldPath, value, isInvalidQuotaResource)) } } - return field.ErrorList{} + return allErrs } // Validate limit range types From 79f2dc6ac4a44d1ffebc8f17711b8c1805dc34fd Mon Sep 17 00:00:00 2001 From: Zihong Zheng Date: Mon, 21 Aug 2017 17:12:24 -0700 Subject: [PATCH 301/403] Add kube-proxy daemonset as a cluster addon. --- cluster/addons/kube-proxy/kube-proxy-ds.yaml | 76 +++++++++++++++++++ .../addons/kube-proxy/kube-proxy-rbac.yaml | 22 ++++++ .../salt/kube-proxy/kube-proxy.manifest | 3 + 3 files changed, 101 insertions(+) create mode 100644 cluster/addons/kube-proxy/kube-proxy-ds.yaml create mode 100644 cluster/addons/kube-proxy/kube-proxy-rbac.yaml diff --git a/cluster/addons/kube-proxy/kube-proxy-ds.yaml b/cluster/addons/kube-proxy/kube-proxy-ds.yaml new file mode 100644 index 0000000000000..a84f838f9123b --- /dev/null +++ b/cluster/addons/kube-proxy/kube-proxy-ds.yaml @@ -0,0 +1,76 @@ +# Please keep kube-proxy configuration in-sync with: +# cluster/saltbase/salt/kube-proxy/kube-proxy.manifest + +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + labels: + k8s-app: kube-proxy + addonmanager.kubernetes.io/mode: Reconcile + name: kube-proxy + namespace: kube-system +spec: + selector: + matchLabels: + k8s-app: kube-proxy + updateStrategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 10% + template: + metadata: + labels: + k8s-app: kube-proxy + annotations: + scheduler.alpha.kubernetes.io/critical-pod: '' + spec: + hostNetwork: true + nodeSelector: + beta.kubernetes.io/kube-proxy-ds-ready: "true" + initContainers: + - name: touch-lock + image: busybox + command: ['/bin/touch', '/run/xtables.lock'] + securityContext: + privileged: true + volumeMounts: + - mountPath: /run + name: run + readOnly: false + containers: + - name: kube-proxy + image: {{pillar['kube_docker_registry']}}/kube-proxy:{{pillar['kube-proxy_docker_tag']}} + resources: + requests: + cpu: {{ cpurequest }} + command: + - /bin/sh + - -c + - echo -998 > /proc/$$$/oom_score_adj && kube-proxy {{kubeconfig}} {{cluster_cidr}} --resource-container="" {{params}} 1>>/var/log/kube-proxy.log 2>&1 + {{container_env}} + securityContext: + privileged: true + volumeMounts: + - mountPath: /var/log + name: varlog + readOnly: false + - mountPath: /var/lib/kube-proxy/kubeconfig + name: kubeconfig + readOnly: false + - mountPath: /run/xtables.lock + name: xtables-lock + readOnly: false + volumes: + - name: varlog + hostPath: + path: /var/log + - name: kubeconfig + hostPath: + path: /var/lib/kube-proxy/kubeconfig + - name: xtables-lock + hostPath: + path: /run/xtables.lock + - name: run + hostPath: + path: /run + serviceAccountName: kube-proxy diff --git a/cluster/addons/kube-proxy/kube-proxy-rbac.yaml b/cluster/addons/kube-proxy/kube-proxy-rbac.yaml new file mode 100644 index 0000000000000..a12ef9d3bfe46 --- /dev/null +++ b/cluster/addons/kube-proxy/kube-proxy-rbac.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: kube-proxy + namespace: kube-system + labels: + addonmanager.kubernetes.io/mode: Reconcile +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: system:kube-proxy + labels: + addonmanager.kubernetes.io/mode: Reconcile +subjects: + - kind: ServiceAccount + name: kube-proxy + namespace: kube-system +roleRef: + kind: ClusterRole + name: system:node-proxier + apiGroup: rbac.authorization.k8s.io diff --git a/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest b/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest index b07ff649e36c8..0befd5b6457ca 100644 --- a/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest +++ b/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest @@ -1,3 +1,6 @@ +# Please keep kube-proxy configuration in-sync with: +# cluster/addons/kube-proxy/kube-proxy-ds.yaml + {% set kubeconfig = "--kubeconfig=/var/lib/kube-proxy/kubeconfig" -%} {% if grains.api_servers is defined -%} {% set api_servers = "--master=https://" + grains.api_servers -%} From c95ecbc7e8adb894b0daf9139551449a675c3a8c Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Thu, 17 Aug 2017 09:44:15 +0800 Subject: [PATCH 302/403] Local storage does not manage overlay any more --- .../algorithm/predicates/predicates.go | 34 ++----- .../algorithm/predicates/predicates_test.go | 96 ++++++------------- .../pkg/scheduler/schedulercache/node_info.go | 40 +++----- 3 files changed, 48 insertions(+), 122 deletions(-) diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates.go b/plugin/pkg/scheduler/algorithm/predicates/predicates.go index d8e644b434926..a30232d22d3bd 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates.go @@ -504,14 +504,6 @@ func GetResourceRequest(pod *v1.Pod) *schedulercache.Resource { result.Add(container.Resources.Requests) } - // Account for storage requested by emptydir volumes - // If the storage medium is memory, should exclude the size - for _, vol := range pod.Spec.Volumes { - if vol.EmptyDir != nil && vol.EmptyDir.Medium != v1.StorageMediumMemory { - result.StorageScratch += vol.EmptyDir.SizeLimit.Value() - } - } - // take max_resource(sum_pod, any_init_container) for _, container := range pod.Spec.InitContainers { for rName, rQuantity := range container.Resources.Requests { @@ -520,6 +512,10 @@ func GetResourceRequest(pod *v1.Pod) *schedulercache.Resource { if mem := rQuantity.Value(); mem > result.Memory { result.Memory = mem } + case v1.ResourceEphemeralStorage: + if ephemeralStorage := rQuantity.Value(); ephemeralStorage > result.EphemeralStorage { + result.EphemeralStorage = ephemeralStorage + } case v1.ResourceCPU: if cpu := rQuantity.MilliValue(); cpu > result.MilliCPU { result.MilliCPU = cpu @@ -528,10 +524,6 @@ func GetResourceRequest(pod *v1.Pod) *schedulercache.Resource { if gpu := rQuantity.Value(); gpu > result.NvidiaGPU { result.NvidiaGPU = gpu } - case v1.ResourceStorageOverlay: - if overlay := rQuantity.Value(); overlay > result.StorageOverlay { - result.StorageOverlay = overlay - } default: if v1helper.IsExtendedResourceName(rName) { value := rQuantity.Value() @@ -572,7 +564,7 @@ func PodFitsResources(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.No // We couldn't parse metadata - fallback to computing it. podRequest = GetResourceRequest(pod) } - if podRequest.MilliCPU == 0 && podRequest.Memory == 0 && podRequest.NvidiaGPU == 0 && podRequest.StorageOverlay == 0 && podRequest.StorageScratch == 0 && len(podRequest.ExtendedResources) == 0 { + if podRequest.MilliCPU == 0 && podRequest.Memory == 0 && podRequest.NvidiaGPU == 0 && podRequest.EphemeralStorage == 0 && len(podRequest.ExtendedResources) == 0 { return len(predicateFails) == 0, predicateFails, nil } @@ -587,20 +579,8 @@ func PodFitsResources(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.No predicateFails = append(predicateFails, NewInsufficientResourceError(v1.ResourceNvidiaGPU, podRequest.NvidiaGPU, nodeInfo.RequestedResource().NvidiaGPU, allocatable.NvidiaGPU)) } - scratchSpaceRequest := podRequest.StorageScratch - if allocatable.StorageOverlay == 0 { - scratchSpaceRequest += podRequest.StorageOverlay - //scratchSpaceRequest += nodeInfo.RequestedResource().StorageOverlay - nodeScratchRequest := nodeInfo.RequestedResource().StorageOverlay + nodeInfo.RequestedResource().StorageScratch - if allocatable.StorageScratch < scratchSpaceRequest+nodeScratchRequest { - predicateFails = append(predicateFails, NewInsufficientResourceError(v1.ResourceStorageScratch, scratchSpaceRequest, nodeScratchRequest, allocatable.StorageScratch)) - } - - } else if allocatable.StorageScratch < scratchSpaceRequest+nodeInfo.RequestedResource().StorageScratch { - predicateFails = append(predicateFails, NewInsufficientResourceError(v1.ResourceStorageScratch, scratchSpaceRequest, nodeInfo.RequestedResource().StorageScratch, allocatable.StorageScratch)) - } - if allocatable.StorageOverlay > 0 && allocatable.StorageOverlay < podRequest.StorageOverlay+nodeInfo.RequestedResource().StorageOverlay { - predicateFails = append(predicateFails, NewInsufficientResourceError(v1.ResourceStorageOverlay, podRequest.StorageOverlay, nodeInfo.RequestedResource().StorageOverlay, allocatable.StorageOverlay)) + if allocatable.EphemeralStorage < podRequest.EphemeralStorage+nodeInfo.RequestedResource().EphemeralStorage { + predicateFails = append(predicateFails, NewInsufficientResourceError(v1.ResourceEphemeralStorage, podRequest.EphemeralStorage, nodeInfo.RequestedResource().EphemeralStorage, allocatable.EphemeralStorage)) } for rName, rQuant := range podRequest.ExtendedResources { diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go b/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go index 90c7be86ab84b..d592dfe0338e7 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go @@ -80,24 +80,24 @@ var ( func makeResources(milliCPU, memory, nvidiaGPUs, pods, opaqueA, storage int64) v1.NodeResources { return v1.NodeResources{ Capacity: v1.ResourceList{ - v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), - v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), - v1.ResourcePods: *resource.NewQuantity(pods, resource.DecimalSI), - v1.ResourceNvidiaGPU: *resource.NewQuantity(nvidiaGPUs, resource.DecimalSI), - opaqueResourceA: *resource.NewQuantity(opaqueA, resource.DecimalSI), - v1.ResourceStorageScratch: *resource.NewQuantity(storage, resource.BinarySI), + v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), + v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), + v1.ResourcePods: *resource.NewQuantity(pods, resource.DecimalSI), + v1.ResourceNvidiaGPU: *resource.NewQuantity(nvidiaGPUs, resource.DecimalSI), + opaqueResourceA: *resource.NewQuantity(opaqueA, resource.DecimalSI), + v1.ResourceEphemeralStorage: *resource.NewQuantity(storage, resource.BinarySI), }, } } func makeAllocatableResources(milliCPU, memory, nvidiaGPUs, pods, opaqueA, storage int64) v1.ResourceList { return v1.ResourceList{ - v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), - v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), - v1.ResourcePods: *resource.NewQuantity(pods, resource.DecimalSI), - v1.ResourceNvidiaGPU: *resource.NewQuantity(nvidiaGPUs, resource.DecimalSI), - opaqueResourceA: *resource.NewQuantity(opaqueA, resource.DecimalSI), - v1.ResourceStorageScratch: *resource.NewQuantity(storage, resource.BinarySI), + v1.ResourceCPU: *resource.NewMilliQuantity(milliCPU, resource.DecimalSI), + v1.ResourceMemory: *resource.NewQuantity(memory, resource.BinarySI), + v1.ResourcePods: *resource.NewQuantity(pods, resource.DecimalSI), + v1.ResourceNvidiaGPU: *resource.NewQuantity(nvidiaGPUs, resource.DecimalSI), + opaqueResourceA: *resource.NewQuantity(opaqueA, resource.DecimalSI), + v1.ResourceEphemeralStorage: *resource.NewQuantity(storage, resource.BinarySI), } } @@ -421,92 +421,52 @@ func TestPodFitsResources(t *testing.T) { } storagePodsTests := []struct { - pod *v1.Pod - emptyDirLimit int64 - storageMedium v1.StorageMedium - nodeInfo *schedulercache.NodeInfo - fits bool - test string - reasons []algorithm.PredicateFailureReason + pod *v1.Pod + nodeInfo *schedulercache.NodeInfo + fits bool + test string + reasons []algorithm.PredicateFailureReason }{ { - pod: newResourcePod(schedulercache.Resource{MilliCPU: 1, Memory: 1, StorageOverlay: 1}), + pod: newResourcePod(schedulercache.Resource{MilliCPU: 1, Memory: 1}), nodeInfo: schedulercache.NewNodeInfo( - newResourcePod(schedulercache.Resource{MilliCPU: 10, Memory: 10, StorageOverlay: 20})), + newResourcePod(schedulercache.Resource{MilliCPU: 10, Memory: 10})), fits: false, test: "due to container scratch disk", reasons: []algorithm.PredicateFailureReason{ NewInsufficientResourceError(v1.ResourceCPU, 1, 10, 10), - NewInsufficientResourceError(v1.ResourceStorageScratch, 1, 20, 20), }, }, { - pod: newResourcePod(schedulercache.Resource{MilliCPU: 1, Memory: 1, StorageOverlay: 10}), + pod: newResourcePod(schedulercache.Resource{MilliCPU: 1, Memory: 1}), nodeInfo: schedulercache.NewNodeInfo( newResourcePod(schedulercache.Resource{MilliCPU: 2, Memory: 10})), fits: true, test: "pod fit", }, { - pod: newResourcePod(schedulercache.Resource{MilliCPU: 1, Memory: 1, StorageOverlay: 18}), - nodeInfo: schedulercache.NewNodeInfo( - newResourcePod(schedulercache.Resource{MilliCPU: 2, Memory: 2, StorageOverlay: 5})), - fits: false, - test: "request exceeds allocatable overlay storage resource", - reasons: []algorithm.PredicateFailureReason{ - NewInsufficientResourceError(v1.ResourceStorageScratch, 18, 5, 20), - }, - }, - { - pod: newResourcePod(schedulercache.Resource{StorageOverlay: 18}), + pod: newResourcePod(schedulercache.Resource{EphemeralStorage: 25}), nodeInfo: schedulercache.NewNodeInfo( - newResourcePod(schedulercache.Resource{MilliCPU: 2, Memory: 2, StorageOverlay: 5})), + newResourcePod(schedulercache.Resource{MilliCPU: 2, Memory: 2})), fits: false, - test: "request exceeds allocatable overlay storage resource", + test: "storage ephemeral local storage request exceeds allocatable", reasons: []algorithm.PredicateFailureReason{ - NewInsufficientResourceError(v1.ResourceStorageScratch, 18, 5, 20), + NewInsufficientResourceError(v1.ResourceEphemeralStorage, 25, 0, 20), }, }, { - pod: newResourcePod(schedulercache.Resource{MilliCPU: 1, Memory: 1, StorageOverlay: 10}), - emptyDirLimit: 15, - storageMedium: v1.StorageMediumDefault, + pod: newResourcePod(schedulercache.Resource{EphemeralStorage: 10}), nodeInfo: schedulercache.NewNodeInfo( - newResourcePod(schedulercache.Resource{MilliCPU: 2, Memory: 2, StorageOverlay: 5})), - fits: false, - test: "storage scratchrequest exceeds allocatable", - reasons: []algorithm.PredicateFailureReason{ - NewInsufficientResourceError(v1.ResourceStorageScratch, 25, 5, 20), - }, - }, - { - pod: newResourcePod(schedulercache.Resource{}), - emptyDirLimit: 25, - storageMedium: v1.StorageMediumDefault, - nodeInfo: schedulercache.NewNodeInfo( - newResourcePod(schedulercache.Resource{MilliCPU: 2, Memory: 2, StorageOverlay: 5})), - fits: false, - test: "storage scratchrequest exceeds allocatable", - reasons: []algorithm.PredicateFailureReason{ - NewInsufficientResourceError(v1.ResourceStorageScratch, 25, 5, 20), - }, - }, - { - pod: newResourcePod(schedulercache.Resource{MilliCPU: 1, Memory: 1, StorageOverlay: 10}), - emptyDirLimit: 15, - storageMedium: v1.StorageMediumMemory, - nodeInfo: schedulercache.NewNodeInfo( - newResourcePod(schedulercache.Resource{MilliCPU: 2, Memory: 2, StorageOverlay: 5})), + newResourcePod(schedulercache.Resource{MilliCPU: 2, Memory: 2})), fits: true, - test: "pod fit with memory medium", + test: "pod fits", }, } for _, test := range storagePodsTests { node := v1.Node{Status: v1.NodeStatus{Capacity: makeResources(10, 20, 0, 32, 5, 20).Capacity, Allocatable: makeAllocatableResources(10, 20, 0, 32, 5, 20)}} test.nodeInfo.SetNode(&node) - pod := addStorageLimit(test.pod, test.emptyDirLimit, test.storageMedium) - fits, reasons, err := PodFitsResources(pod, PredicateMetadata(pod, nil), test.nodeInfo) + fits, reasons, err := PodFitsResources(test.pod, PredicateMetadata(test.pod, nil), test.nodeInfo) if err != nil { t.Errorf("%s: unexpected error: %v", test.test, err) } diff --git a/plugin/pkg/scheduler/schedulercache/node_info.go b/plugin/pkg/scheduler/schedulercache/node_info.go index 6aa97213e0181..c60a047cca484 100644 --- a/plugin/pkg/scheduler/schedulercache/node_info.go +++ b/plugin/pkg/scheduler/schedulercache/node_info.go @@ -63,11 +63,10 @@ type NodeInfo struct { // Resource is a collection of compute resource. type Resource struct { - MilliCPU int64 - Memory int64 - NvidiaGPU int64 - StorageScratch int64 - StorageOverlay int64 + MilliCPU int64 + Memory int64 + NvidiaGPU int64 + EphemeralStorage int64 // We store allowedPodNumber (which is Node.Status.Allocatable.Pods().Value()) // explicitly as int, to avoid conversions and improve performance. AllowedPodNumber int @@ -97,10 +96,8 @@ func (r *Resource) Add(rl v1.ResourceList) { r.NvidiaGPU += rQuant.Value() case v1.ResourcePods: r.AllowedPodNumber += int(rQuant.Value()) - case v1.ResourceStorageScratch: - r.StorageScratch += rQuant.Value() - case v1.ResourceStorageOverlay: - r.StorageOverlay += rQuant.Value() + case v1.ResourceEphemeralStorage: + r.EphemeralStorage += rQuant.Value() default: if v1helper.IsExtendedResourceName(rName) { r.AddExtended(rName, rQuant.Value()) @@ -111,12 +108,11 @@ func (r *Resource) Add(rl v1.ResourceList) { func (r *Resource) ResourceList() v1.ResourceList { result := v1.ResourceList{ - v1.ResourceCPU: *resource.NewMilliQuantity(r.MilliCPU, resource.DecimalSI), - v1.ResourceMemory: *resource.NewQuantity(r.Memory, resource.BinarySI), - v1.ResourceNvidiaGPU: *resource.NewQuantity(r.NvidiaGPU, resource.DecimalSI), - v1.ResourcePods: *resource.NewQuantity(int64(r.AllowedPodNumber), resource.BinarySI), - v1.ResourceStorageOverlay: *resource.NewQuantity(r.StorageOverlay, resource.BinarySI), - v1.ResourceStorageScratch: *resource.NewQuantity(r.StorageScratch, resource.BinarySI), + v1.ResourceCPU: *resource.NewMilliQuantity(r.MilliCPU, resource.DecimalSI), + v1.ResourceMemory: *resource.NewQuantity(r.Memory, resource.BinarySI), + v1.ResourceNvidiaGPU: *resource.NewQuantity(r.NvidiaGPU, resource.DecimalSI), + v1.ResourcePods: *resource.NewQuantity(int64(r.AllowedPodNumber), resource.BinarySI), + v1.ResourceEphemeralStorage: *resource.NewQuantity(r.EphemeralStorage, resource.BinarySI), } for rName, rQuant := range r.ExtendedResources { result[rName] = *resource.NewQuantity(rQuant, resource.DecimalSI) @@ -130,8 +126,7 @@ func (r *Resource) Clone() *Resource { Memory: r.Memory, NvidiaGPU: r.NvidiaGPU, AllowedPodNumber: r.AllowedPodNumber, - StorageOverlay: r.StorageOverlay, - StorageScratch: r.StorageScratch, + EphemeralStorage: r.EphemeralStorage, } if r.ExtendedResources != nil { res.ExtendedResources = make(map[v1.ResourceName]int64) @@ -304,8 +299,7 @@ func (n *NodeInfo) addPod(pod *v1.Pod) { n.requestedResource.MilliCPU += res.MilliCPU n.requestedResource.Memory += res.Memory n.requestedResource.NvidiaGPU += res.NvidiaGPU - n.requestedResource.StorageOverlay += res.StorageOverlay - n.requestedResource.StorageScratch += res.StorageScratch + n.requestedResource.EphemeralStorage += res.EphemeralStorage if n.requestedResource.ExtendedResources == nil && len(res.ExtendedResources) > 0 { n.requestedResource.ExtendedResources = map[v1.ResourceName]int64{} } @@ -392,14 +386,6 @@ func calculateResource(pod *v1.Pod) (res Resource, non0_cpu int64, non0_mem int6 // No non-zero resources for GPUs or opaque resources. } - // Account for storage requested by emptydir volumes - // If the storage medium is memory, should exclude the size - for _, vol := range pod.Spec.Volumes { - if vol.EmptyDir != nil && vol.EmptyDir.Medium != v1.StorageMediumMemory { - res.StorageScratch += vol.EmptyDir.SizeLimit.Value() - } - } - return } From 2e0156ad83bdc4368b5cedc528eb5808fc97cab2 Mon Sep 17 00:00:00 2001 From: hzxuzhonghu Date: Fri, 25 Aug 2017 09:48:11 +0800 Subject: [PATCH 303/403] fix validation return error --- pkg/api/v1/validation/validation.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/api/v1/validation/validation.go b/pkg/api/v1/validation/validation.go index e47b0aa86cdef..109054f804ea8 100644 --- a/pkg/api/v1/validation/validation.go +++ b/pkg/api/v1/validation/validation.go @@ -78,7 +78,7 @@ func validateContainerResourceName(value string, fldPath *field.Path) field.Erro return append(allErrs, field.Invalid(fldPath, value, "must be a standard resource for containers")) } } - return field.ErrorList{} + return allErrs } // ValidateResourceQuantityValue enforces that specified quantity is valid for specified resource @@ -125,7 +125,7 @@ func validateResourceName(value string, fldPath *field.Path) field.ErrorList { } } - return field.ErrorList{} + return allErrs } func ValidatePodLogOptions(opts *v1.PodLogOptions) field.ErrorList { From 2cc3c33a4b77c2fd61885f5345d3dcfd62f7c221 Mon Sep 17 00:00:00 2001 From: andrewsykim Date: Tue, 15 Aug 2017 23:34:50 -0400 Subject: [PATCH 304/403] Cloud Controller Manager now sets Node.Spec.ProviderID --- pkg/controller/cloud/node_controller.go | 12 ++ pkg/controller/cloud/node_controller_test.go | 176 +++++++++++++++++++ 2 files changed, 188 insertions(+) diff --git a/pkg/controller/cloud/node_controller.go b/pkg/controller/cloud/node_controller.go index bb470d41bc4be..4ee4816d54b38 100644 --- a/pkg/controller/cloud/node_controller.go +++ b/pkg/controller/cloud/node_controller.go @@ -284,6 +284,18 @@ func (cnc *CloudNodeController) AddCloudNode(obj interface{}) { return err } + if curNode.Spec.ProviderID == "" { + providerID, err := cloudprovider.GetInstanceProviderID(cnc.cloud, types.NodeName(curNode.Name)) + if err == nil { + curNode.Spec.ProviderID = providerID + } else { + // we should attempt to set providerID on curNode, but + // we can continue if we fail since we will attempt to set + // node addresses given the node name in getNodeAddressesByProviderIDOrName + glog.Errorf("failed to set node provider id: %v", err) + } + } + nodeAddresses, err := getNodeAddressesByProviderIDOrName(instances, curNode) if err != nil { glog.Errorf("%v", err) diff --git a/pkg/controller/cloud/node_controller_test.go b/pkg/controller/cloud/node_controller_test.go index 033dbe9088900..6f054432b9f3a 100644 --- a/pkg/controller/cloud/node_controller_test.go +++ b/pkg/controller/cloud/node_controller_test.go @@ -804,3 +804,179 @@ func TestNodeAddressesChangeDetected(t *testing.T) { t.Errorf("Node address changes are not detected correctly") } } + +// This test checks that a node is set with the correct providerID +func TestNodeProviderID(t *testing.T) { + fnh := &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node0", + CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), + Labels: map[string]string{}, + }, + Status: v1.NodeStatus{ + Conditions: []v1.NodeCondition{ + { + Type: v1.NodeReady, + Status: v1.ConditionUnknown, + LastHeartbeatTime: metav1.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), + LastTransitionTime: metav1.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), + }, + }, + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + { + Key: "ImproveCoverageTaint", + Value: "true", + Effect: v1.TaintEffectNoSchedule, + }, + { + Key: algorithm.TaintExternalCloudProvider, + Value: "true", + Effect: v1.TaintEffectNoSchedule, + }, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{}), + DeleteWaitChan: make(chan struct{}), + } + + factory := informers.NewSharedInformerFactory(fnh, controller.NoResyncPeriodFunc()) + + fakeCloud := &fakecloud.FakeCloud{ + InstanceTypes: map[types.NodeName]string{}, + Addresses: []v1.NodeAddress{ + { + Type: v1.NodeHostName, + Address: "node0.cloud.internal", + }, + { + Type: v1.NodeInternalIP, + Address: "10.0.0.1", + }, + { + Type: v1.NodeExternalIP, + Address: "132.143.154.163", + }, + }, + Provider: "test", + ExtID: map[types.NodeName]string{ + types.NodeName("node0"): "12345", + }, + Err: nil, + } + + eventBroadcaster := record.NewBroadcaster() + cloudNodeController := &CloudNodeController{ + kubeClient: fnh, + nodeInformer: factory.Core().V1().Nodes(), + cloud: fakeCloud, + nodeMonitorPeriod: 5 * time.Second, + nodeStatusUpdateFrequency: 1 * time.Second, + recorder: eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "cloud-controller-manager"}), + } + eventBroadcaster.StartLogging(glog.Infof) + + cloudNodeController.AddCloudNode(fnh.Existing[0]) + + if len(fnh.UpdatedNodes) != 1 || fnh.UpdatedNodes[0].Name != "node0" { + t.Errorf("Node was not updated") + } + + if fnh.UpdatedNodes[0].Spec.ProviderID != "test://12345" { + t.Errorf("Node ProviderID not set correctly") + } +} + +// This test checks that a node's provider ID will not be overwritten +func TestNodeProviderIDAlreadySet(t *testing.T) { + fnh := &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node0", + CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), + Labels: map[string]string{}, + }, + Status: v1.NodeStatus{ + Conditions: []v1.NodeCondition{ + { + Type: v1.NodeReady, + Status: v1.ConditionUnknown, + LastHeartbeatTime: metav1.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), + LastTransitionTime: metav1.Date(2015, 1, 1, 12, 0, 0, 0, time.UTC), + }, + }, + }, + Spec: v1.NodeSpec{ + ProviderID: "test-provider-id", + Taints: []v1.Taint{ + { + Key: "ImproveCoverageTaint", + Value: "true", + Effect: v1.TaintEffectNoSchedule, + }, + { + Key: algorithm.TaintExternalCloudProvider, + Value: "true", + Effect: v1.TaintEffectNoSchedule, + }, + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{}), + DeleteWaitChan: make(chan struct{}), + } + + factory := informers.NewSharedInformerFactory(fnh, controller.NoResyncPeriodFunc()) + + fakeCloud := &fakecloud.FakeCloud{ + InstanceTypes: map[types.NodeName]string{}, + Addresses: []v1.NodeAddress{ + { + Type: v1.NodeHostName, + Address: "node0.cloud.internal", + }, + { + Type: v1.NodeInternalIP, + Address: "10.0.0.1", + }, + { + Type: v1.NodeExternalIP, + Address: "132.143.154.163", + }, + }, + Provider: "test", + ExtID: map[types.NodeName]string{ + types.NodeName("node0"): "12345", + }, + Err: nil, + } + + eventBroadcaster := record.NewBroadcaster() + cloudNodeController := &CloudNodeController{ + kubeClient: fnh, + nodeInformer: factory.Core().V1().Nodes(), + cloud: fakeCloud, + nodeMonitorPeriod: 5 * time.Second, + nodeStatusUpdateFrequency: 1 * time.Second, + recorder: eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "cloud-controller-manager"}), + } + eventBroadcaster.StartLogging(glog.Infof) + + cloudNodeController.AddCloudNode(fnh.Existing[0]) + + if len(fnh.UpdatedNodes) != 1 || fnh.UpdatedNodes[0].Name != "node0" { + t.Errorf("Node was not updated") + } + + // CCM node controller should not overwrite provider if it's already set + if fnh.UpdatedNodes[0].Spec.ProviderID != "test-provider-id" { + t.Errorf("Node ProviderID not set correctly") + } +} From c02aeb7ec1891707f4c05bfe7c17fa0c0657cc22 Mon Sep 17 00:00:00 2001 From: Yassine TIJANI Date: Wed, 9 Aug 2017 16:04:18 +0200 Subject: [PATCH 305/403] handle failed mounts for fc volumes --- pkg/volume/fc/disk_manager.go | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/pkg/volume/fc/disk_manager.go b/pkg/volume/fc/disk_manager.go index b14d84ff31f1c..33a0c422cfff8 100644 --- a/pkg/volume/fc/disk_manager.go +++ b/pkg/volume/fc/disk_manager.go @@ -36,7 +36,6 @@ type diskManager interface { // utility to mount a disk based filesystem func diskSetUp(manager diskManager, b fcDiskMounter, volPath string, mounter mount.Interface, fsGroup *int64) error { globalPDPath := manager.MakeGlobalPDName(*b.fcDisk) - // TODO: handle failed mounts here. noMnt, err := mounter.IsLikelyNotMountPoint(volPath) if err != nil && !os.IsNotExist(err) { @@ -57,7 +56,30 @@ func diskSetUp(manager diskManager, b fcDiskMounter, volPath string, mounter mou } err = mounter.Mount(globalPDPath, volPath, "", options) if err != nil { - glog.Errorf("failed to bind mount:%s", globalPDPath) + glog.Errorf("Failed to bind mount: source:%s, target:%s, err:%v", globalPDPath, volPath, err) + noMnt, mntErr := b.mounter.IsLikelyNotMountPoint(volPath) + if mntErr != nil { + glog.Errorf("IsLikelyNotMountPoint check failed: %v", mntErr) + return err + } + if !noMnt { + if mntErr = b.mounter.Unmount(volPath); mntErr != nil { + glog.Errorf("Failed to unmount: %v", mntErr) + return err + } + noMnt, mntErr = b.mounter.IsLikelyNotMountPoint(volPath) + if mntErr != nil { + glog.Errorf("IsLikelyNotMountPoint check failed: %v", mntErr) + return err + } + if !noMnt { + // will most likely retry on next sync loop. + glog.Errorf("%s is still mounted, despite call to unmount(). Will try again next sync loop.", volPath) + return err + } + } + os.Remove(volPath) + return err } From 6e1fbf32b0763f70fd59e6006409c2fc3b681877 Mon Sep 17 00:00:00 2001 From: Andrzej Wasylkowski Date: Fri, 25 Aug 2017 11:11:38 +0200 Subject: [PATCH 306/403] Made the tests ensure that Cluster Autoscaler is on before running. --- test/e2e/autoscaling/cluster_autoscaler_scalability.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/e2e/autoscaling/cluster_autoscaler_scalability.go b/test/e2e/autoscaling/cluster_autoscaler_scalability.go index 2a09881ee9407..323dfbbe9cd42 100644 --- a/test/e2e/autoscaling/cluster_autoscaler_scalability.go +++ b/test/e2e/autoscaling/cluster_autoscaler_scalability.go @@ -69,6 +69,12 @@ var _ = framework.KubeDescribe("Cluster size autoscaler scalability [Slow]", fun BeforeEach(func() { framework.SkipUnlessProviderIs("gce", "gke", "kubemark") + // Check if Cloud Autoscaler is enabled by trying to get its ConfigMap. + _, err := f.ClientSet.CoreV1().ConfigMaps("kube-system").Get("cluster-autoscaler-status", metav1.GetOptions{}) + if err != nil { + framework.Skipf("test expects Cluster Autoscaler to be enabled") + } + c = f.ClientSet if originalSizes == nil { originalSizes = make(map[string]int) From c355a2ac96b470b1ed57bc0204fb9a3b4d5f2a35 Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Wed, 2 Aug 2017 00:09:37 +0800 Subject: [PATCH 307/403] Paramaterize stickyMaxAgeMinutes for service in API --- examples/meteor/meteor-service.json | 5 + pkg/api/types.go | 29 ++++++ pkg/api/validation/validation.go | 38 ++++++- pkg/api/validation/validation_test.go | 90 ++++++++++++++++ pkg/master/controller.go | 6 ++ pkg/master/controller_test.go | 120 +++++++++++++++++++--- pkg/proxy/iptables/proxier.go | 11 +- pkg/proxy/iptables/proxier_test.go | 4 +- pkg/proxy/userspace/loadbalancer.go | 2 +- pkg/proxy/userspace/proxier.go | 15 +-- pkg/proxy/userspace/roundrobin.go | 22 ++-- pkg/proxy/userspace/roundrobin_test.go | 14 +-- pkg/proxy/winuserspace/proxier.go | 7 +- pkg/proxy/winuserspace/roundrobin.go | 22 ++-- pkg/proxy/winuserspace/roundrobin_test.go | 14 +-- staging/src/k8s.io/api/core/v1/types.go | 19 ++++ 16 files changed, 349 insertions(+), 69 deletions(-) diff --git a/examples/meteor/meteor-service.json b/examples/meteor/meteor-service.json index 2dc55a041bb97..2e494c0a2c1c0 100644 --- a/examples/meteor/meteor-service.json +++ b/examples/meteor/meteor-service.json @@ -15,6 +15,11 @@ "name": "meteor" }, "sessionAffinity": "ClientIP", + "sessionAffinityConfig": { + "clientIP": { + "timeoutSeconds": 90 + } + }, "type": "LoadBalancer" } } diff --git a/pkg/api/types.go b/pkg/api/types.go index a84ee8da13054..7359453dafc72 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -2660,6 +2660,31 @@ const ( ServiceAffinityNone ServiceAffinity = "None" ) +const ( + // DefaultClientIPServiceAffinitySeconds is the default timeout seconds + // of Client IP based session affinity - 3 hours. + DefaultClientIPServiceAffinitySeconds int32 = 10800 + // MaxClientIPServiceAffinitySeconds is the max timeout seconds + // of Client IP based session affinity - 1 day. + MaxClientIPServiceAffinitySeconds int32 = 86400 +) + +// SessionAffinityConfig represents the configurations of session affinity. +type SessionAffinityConfig struct { + // clientIP contains the configurations of Client IP based session affinity. + // +optional + ClientIP *ClientIPConfig +} + +// ClientIPConfig represents the configurations of Client IP based session affinity. +type ClientIPConfig struct { + // timeoutSeconds specifies the seconds of ClientIP type session sticky time. + // The value must be >0 && <=86400(for 1 day) if ServiceAffinity == "ClientIP". + // Default value is 10800(for 3 hours). + // +optional + TimeoutSeconds *int32 +} + // Service Type string describes ingress methods for a service type ServiceType string @@ -2787,6 +2812,10 @@ type ServiceSpec struct { // +optional SessionAffinity ServiceAffinity + // sessionAffinityConfig contains the configurations of session affinity. + // +optional + SessionAffinityConfig *SessionAffinityConfig + // Optional: If specified and supported by the platform, this will restrict traffic through the cloud-provider // load-balancer will be restricted to the specified client IPs. This field will be ignored if the // cloud-provider does not support the feature." diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 73301784c01d3..9544388908b0f 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -19,6 +19,7 @@ package validation import ( "encoding/json" "fmt" + "math" "net" "path" "path/filepath" @@ -28,8 +29,6 @@ import ( "github.com/golang/glog" - "math" - "k8s.io/api/core/v1" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/resource" @@ -1873,6 +1872,33 @@ func validateProbe(probe *api.Probe, fldPath *field.Path) field.ErrorList { return allErrs } +func validateClientIPAffinityConfig(config *api.SessionAffinityConfig, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if config == nil { + allErrs = append(allErrs, field.Required(fldPath, fmt.Sprintf("when session affinity type is %s", api.ServiceAffinityClientIP))) + return allErrs + } + if config.ClientIP == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("clientIP"), fmt.Sprintf("when session affinity type is %s", api.ServiceAffinityClientIP))) + return allErrs + } + if config.ClientIP.TimeoutSeconds == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("clientIP").Child("timeoutSeconds"), fmt.Sprintf("when session affinity type is %s", api.ServiceAffinityClientIP))) + return allErrs + } + allErrs = append(allErrs, validateAffinityTimeout(config.ClientIP.TimeoutSeconds, fldPath.Child("clientIP").Child("timeoutSeconds"))...) + + return allErrs +} + +func validateAffinityTimeout(timeout *int32, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if *timeout <= 0 || *timeout > api.MaxClientIPServiceAffinitySeconds { + allErrs = append(allErrs, field.Invalid(fldPath, timeout, fmt.Sprintf("must be greater than 0 and less than %d", api.MaxClientIPServiceAffinitySeconds))) + } + return allErrs +} + // AccumulateUniqueHostPorts extracts each HostPort of each Container, // accumulating the results and returning an error if any ports conflict. func AccumulateUniqueHostPorts(containers []api.Container, accumulator *sets.String, fldPath *field.Path) field.ErrorList { @@ -2914,6 +2940,14 @@ func ValidateService(service *api.Service) field.ErrorList { allErrs = append(allErrs, field.NotSupported(specPath.Child("sessionAffinity"), service.Spec.SessionAffinity, supportedSessionAffinityType.List())) } + if service.Spec.SessionAffinity == api.ServiceAffinityClientIP { + allErrs = append(allErrs, validateClientIPAffinityConfig(service.Spec.SessionAffinityConfig, specPath.Child("sessionAffinityConfig"))...) + } else if service.Spec.SessionAffinity == api.ServiceAffinityNone { + if service.Spec.SessionAffinityConfig != nil { + allErrs = append(allErrs, field.Forbidden(specPath.Child("sessionAffinityConfig"), fmt.Sprintf("must not be set when session affinity is %s", string(api.ServiceAffinityNone)))) + } + } + if helper.IsServiceIPSet(service) { if ip := net.ParseIP(service.Spec.ClusterIP); ip == nil { allErrs = append(allErrs, field.Invalid(specPath.Child("clusterIP"), service.Spec.ClusterIP, "must be empty, 'None', or a valid IP address")) diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 50e36fe6b6a66..bdd514ceb0764 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -6792,6 +6792,32 @@ func TestValidateService(t *testing.T) { numErrs: 0, }, // ESIPP section ends. + { + name: "invalid timeoutSeconds field", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeClusterIP + s.Spec.SessionAffinity = api.ServiceAffinityClientIP + s.Spec.SessionAffinityConfig = &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: newInt32(-1), + }, + } + }, + numErrs: 1, + }, + { + name: "sessionAffinityConfig can't be set when session affinity is None", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeLoadBalancer + s.Spec.SessionAffinity = api.ServiceAffinityNone + s.Spec.SessionAffinityConfig = &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: newInt32(90), + }, + } + }, + numErrs: 1, + }, } for _, tc := range testCases { @@ -8193,6 +8219,11 @@ func TestValidateServiceUpdate(t *testing.T) { name: "change affinity", tweakSvc: func(oldSvc, newSvc *api.Service) { newSvc.Spec.SessionAffinity = "ClientIP" + newSvc.Spec.SessionAffinityConfig = &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: newInt32(90), + }, + } }, numErrs: 0, }, @@ -10314,3 +10345,62 @@ func TestValidateFlexVolumeSource(t *testing.T) { } } } + +func TestValidateOrSetClientIPAffinityConfig(t *testing.T) { + successCases := map[string]*api.SessionAffinityConfig{ + "non-empty config, valid timeout: 1": { + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: newInt32(1), + }, + }, + "non-empty config, valid timeout: api.MaxClientIPServiceAffinitySeconds-1": { + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: newInt32(int(api.MaxClientIPServiceAffinitySeconds - 1)), + }, + }, + "non-empty config, valid timeout: api.MaxClientIPServiceAffinitySeconds": { + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: newInt32(int(api.MaxClientIPServiceAffinitySeconds)), + }, + }, + } + + for name, test := range successCases { + if errs := validateClientIPAffinityConfig(test, field.NewPath("field")); len(errs) != 0 { + t.Errorf("case: %s, expected success: %v", name, errs) + } + } + + errorCases := map[string]*api.SessionAffinityConfig{ + "empty session affinity config": nil, + "empty client IP config": { + ClientIP: nil, + }, + "empty timeoutSeconds": { + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: nil, + }, + }, + "non-empty config, invalid timeout: api.MaxClientIPServiceAffinitySeconds+1": { + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: newInt32(int(api.MaxClientIPServiceAffinitySeconds + 1)), + }, + }, + "non-empty config, invalid timeout: -1": { + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: newInt32(-1), + }, + }, + "non-empty config, invalid timeout: 0": { + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: newInt32(0), + }, + }, + } + + for name, test := range errorCases { + if errs := validateClientIPAffinityConfig(test, field.NewPath("field")); len(errs) == 0 { + t.Errorf("case: %v, expected failures: %v", name, errs) + } + } +} diff --git a/pkg/master/controller.go b/pkg/master/controller.go index 0e922e17b8257..e38718c6167a4 100644 --- a/pkg/master/controller.go +++ b/pkg/master/controller.go @@ -250,6 +250,7 @@ func (c *Controller) CreateOrUpdateMasterServiceIfNeeded(serviceName string, ser } return nil } + timeoutSeconds := api.DefaultClientIPServiceAffinitySeconds svc := &api.Service{ ObjectMeta: metav1.ObjectMeta{ Name: serviceName, @@ -263,6 +264,11 @@ func (c *Controller) CreateOrUpdateMasterServiceIfNeeded(serviceName string, ser ClusterIP: serviceIP.String(), SessionAffinity: api.ServiceAffinityClientIP, Type: serviceType, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, }, } diff --git a/pkg/master/controller_test.go b/pkg/master/controller_test.go index 50dc1bab734fe..f0011223347db 100644 --- a/pkg/master/controller_test.go +++ b/pkg/master/controller_test.go @@ -546,6 +546,7 @@ func TestCreateOrUpdateMasterService(t *testing.T) { om := func(name string) metav1.ObjectMeta { return metav1.ObjectMeta{Namespace: ns, Name: name} } + timeoutSeconds := api.DefaultClientIPServiceAffinitySeconds create_tests := []struct { testName string @@ -570,7 +571,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, }, @@ -625,7 +631,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, expectUpdate: &api.Service{ @@ -637,7 +648,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, }, @@ -658,7 +674,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, expectUpdate: &api.Service{ @@ -671,7 +692,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, }, @@ -691,7 +717,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, expectUpdate: &api.Service{ @@ -703,7 +734,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, }, @@ -723,7 +759,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, expectUpdate: &api.Service{ @@ -735,7 +776,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, }, @@ -755,7 +801,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, expectUpdate: &api.Service{ @@ -767,7 +818,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, }, @@ -787,7 +843,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, expectUpdate: &api.Service{ @@ -799,7 +860,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, }, @@ -819,7 +885,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeNodePort, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeNodePort, }, }, expectUpdate: &api.Service{ @@ -831,7 +902,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, }, @@ -851,7 +927,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, expectUpdate: nil, @@ -910,7 +991,12 @@ func TestCreateOrUpdateMasterService(t *testing.T) { Selector: nil, ClusterIP: "1.2.3.4", SessionAffinity: api.ServiceAffinityClientIP, - Type: api.ServiceTypeClusterIP, + SessionAffinityConfig: &api.SessionAffinityConfig{ + ClientIP: &api.ClientIPConfig{ + TimeoutSeconds: &timeoutSeconds, + }, + }, + Type: api.ServiceTypeClusterIP, }, }, expectUpdate: nil, diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 6f2e666842771..4479a2e112858 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -143,7 +143,7 @@ type serviceInfo struct { nodePort int loadBalancerStatus api.LoadBalancerStatus sessionAffinityType api.ServiceAffinity - stickyMaxAgeMinutes int + stickyMaxAgeSeconds int externalIPs []string loadBalancerSourceRanges []string onlyNodeLocalEndpoints bool @@ -194,6 +194,10 @@ func newServiceInfo(svcPortName proxy.ServicePortName, port *api.ServicePort, se apiservice.RequestsOnlyLocalTraffic(service) { onlyNodeLocalEndpoints = true } + var stickyMaxAgeSeconds int + if service.Spec.SessionAffinity == api.ServiceAffinityClientIP { + stickyMaxAgeSeconds = int(*service.Spec.SessionAffinityConfig.ClientIP.TimeoutSeconds) + } info := &serviceInfo{ clusterIP: net.ParseIP(service.Spec.ClusterIP), port: int(port.Port), @@ -202,11 +206,12 @@ func newServiceInfo(svcPortName proxy.ServicePortName, port *api.ServicePort, se // Deep-copy in case the service instance changes loadBalancerStatus: *helper.LoadBalancerStatusDeepCopy(&service.Status.LoadBalancer), sessionAffinityType: service.Spec.SessionAffinity, - stickyMaxAgeMinutes: 180, // TODO: paramaterize this in the API. + stickyMaxAgeSeconds: stickyMaxAgeSeconds, externalIPs: make([]string, len(service.Spec.ExternalIPs)), loadBalancerSourceRanges: make([]string, len(service.Spec.LoadBalancerSourceRanges)), onlyNodeLocalEndpoints: onlyNodeLocalEndpoints, } + copy(info.loadBalancerSourceRanges, service.Spec.LoadBalancerSourceRanges) copy(info.externalIPs, service.Spec.ExternalIPs) @@ -1440,7 +1445,7 @@ func (proxier *Proxier) syncProxyRules() { "-A", string(svcChain), "-m", "comment", "--comment", svcNameString, "-m", "recent", "--name", string(endpointChain), - "--rcheck", "--seconds", strconv.Itoa(svcInfo.stickyMaxAgeMinutes*60), "--reap", + "--rcheck", "--seconds", strconv.Itoa(svcInfo.stickyMaxAgeSeconds), "--reap", "-j", string(endpointChain)) } } diff --git a/pkg/proxy/iptables/proxier_test.go b/pkg/proxy/iptables/proxier_test.go index 35f288c53b370..311fbd88ab1a0 100644 --- a/pkg/proxy/iptables/proxier_test.go +++ b/pkg/proxy/iptables/proxier_test.go @@ -178,8 +178,8 @@ func TestGetChainLinesMultipleTables(t *testing.T) { func newFakeServiceInfo(service proxy.ServicePortName, ip net.IP, port int, protocol api.Protocol, onlyNodeLocalEndpoints bool) *serviceInfo { return &serviceInfo{ - sessionAffinityType: api.ServiceAffinityNone, // default - stickyMaxAgeMinutes: 180, // TODO: paramaterize this in the API. + sessionAffinityType: api.ServiceAffinityNone, // default + stickyMaxAgeSeconds: int(api.DefaultClientIPServiceAffinitySeconds), // default clusterIP: ip, port: port, protocol: protocol, diff --git a/pkg/proxy/userspace/loadbalancer.go b/pkg/proxy/userspace/loadbalancer.go index 2bf23d5b940f0..369094e3296c4 100644 --- a/pkg/proxy/userspace/loadbalancer.go +++ b/pkg/proxy/userspace/loadbalancer.go @@ -28,7 +28,7 @@ type LoadBalancer interface { // NextEndpoint returns the endpoint to handle a request for the given // service-port and source address. NextEndpoint(service proxy.ServicePortName, srcAddr net.Addr, sessionAffinityReset bool) (string, error) - NewService(service proxy.ServicePortName, sessionAffinityType api.ServiceAffinity, stickyMaxAgeMinutes int) error + NewService(service proxy.ServicePortName, sessionAffinityType api.ServiceAffinity, stickyMaxAgeSeconds int) error DeleteService(service proxy.ServicePortName) CleanupStaleStickySessions(service proxy.ServicePortName) ServiceHasEndpoints(service proxy.ServicePortName) bool diff --git a/pkg/proxy/userspace/proxier.go b/pkg/proxy/userspace/proxier.go index 7d3502ce79d00..d299544da2e3a 100644 --- a/pkg/proxy/userspace/proxier.go +++ b/pkg/proxy/userspace/proxier.go @@ -61,7 +61,7 @@ type ServiceInfo struct { nodePort int loadBalancerStatus api.LoadBalancerStatus sessionAffinityType api.ServiceAffinity - stickyMaxAgeMinutes int + stickyMaxAgeSeconds int // Deprecated, but required for back-compat (including e2e) externalIPs []string } @@ -378,15 +378,13 @@ func (proxier *Proxier) addServiceOnPort(service proxy.ServicePortName, protocol return nil, err } si := &ServiceInfo{ - Timeout: timeout, - ActiveClients: newClientCache(), - + Timeout: timeout, + ActiveClients: newClientCache(), isAliveAtomic: 1, proxyPort: portNum, protocol: protocol, socket: sock, sessionAffinityType: api.ServiceAffinityNone, // default - stickyMaxAgeMinutes: 180, // TODO: parameterize this in the API. } proxier.setServiceInfo(service, si) @@ -450,12 +448,17 @@ func (proxier *Proxier) mergeService(service *api.Service) sets.String { info.loadBalancerStatus = *helper.LoadBalancerStatusDeepCopy(&service.Status.LoadBalancer) info.nodePort = int(servicePort.NodePort) info.sessionAffinityType = service.Spec.SessionAffinity + // Set session affinity timeout value when sessionAffinity==ClientIP + if service.Spec.SessionAffinity == api.ServiceAffinityClientIP { + info.stickyMaxAgeSeconds = int(*service.Spec.SessionAffinityConfig.ClientIP.TimeoutSeconds) + } + glog.V(4).Infof("info: %#v", info) if err := proxier.openPortal(serviceName, info); err != nil { glog.Errorf("Failed to open portal for %q: %v", serviceName, err) } - proxier.loadBalancer.NewService(serviceName, info.sessionAffinityType, info.stickyMaxAgeMinutes) + proxier.loadBalancer.NewService(serviceName, info.sessionAffinityType, info.stickyMaxAgeSeconds) } return existingPorts diff --git a/pkg/proxy/userspace/roundrobin.go b/pkg/proxy/userspace/roundrobin.go index b610ebbbd7603..b32d69d8776a7 100644 --- a/pkg/proxy/userspace/roundrobin.go +++ b/pkg/proxy/userspace/roundrobin.go @@ -48,7 +48,7 @@ type affinityState struct { type affinityPolicy struct { affinityType api.ServiceAffinity affinityMap map[string]*affinityState // map client IP -> affinity info - ttlMinutes int + ttlSeconds int } // LoadBalancerRR is a round-robin load balancer. @@ -66,11 +66,11 @@ type balancerState struct { affinity affinityPolicy } -func newAffinityPolicy(affinityType api.ServiceAffinity, ttlMinutes int) *affinityPolicy { +func newAffinityPolicy(affinityType api.ServiceAffinity, ttlSeconds int) *affinityPolicy { return &affinityPolicy{ affinityType: affinityType, affinityMap: make(map[string]*affinityState), - ttlMinutes: ttlMinutes, + ttlSeconds: ttlSeconds, } } @@ -81,22 +81,22 @@ func NewLoadBalancerRR() *LoadBalancerRR { } } -func (lb *LoadBalancerRR) NewService(svcPort proxy.ServicePortName, affinityType api.ServiceAffinity, ttlMinutes int) error { +func (lb *LoadBalancerRR) NewService(svcPort proxy.ServicePortName, affinityType api.ServiceAffinity, ttlSeconds int) error { glog.V(4).Infof("LoadBalancerRR NewService %q", svcPort) lb.lock.Lock() defer lb.lock.Unlock() - lb.newServiceInternal(svcPort, affinityType, ttlMinutes) + lb.newServiceInternal(svcPort, affinityType, ttlSeconds) return nil } // This assumes that lb.lock is already held. -func (lb *LoadBalancerRR) newServiceInternal(svcPort proxy.ServicePortName, affinityType api.ServiceAffinity, ttlMinutes int) *balancerState { - if ttlMinutes == 0 { - ttlMinutes = 180 //default to 3 hours if not specified. Should 0 be unlimited instead???? +func (lb *LoadBalancerRR) newServiceInternal(svcPort proxy.ServicePortName, affinityType api.ServiceAffinity, ttlSeconds int) *balancerState { + if ttlSeconds == 0 { + ttlSeconds = int(api.DefaultClientIPServiceAffinitySeconds) //default to 3 hours if not specified. Should 0 be unlimited instead???? } if _, exists := lb.services[svcPort]; !exists { - lb.services[svcPort] = &balancerState{affinity: *newAffinityPolicy(affinityType, ttlMinutes)} + lb.services[svcPort] = &balancerState{affinity: *newAffinityPolicy(affinityType, ttlSeconds)} glog.V(4).Infof("LoadBalancerRR service %q did not exist, created", svcPort) } else if affinityType != "" { lb.services[svcPort].affinity.affinityType = affinityType @@ -159,7 +159,7 @@ func (lb *LoadBalancerRR) NextEndpoint(svcPort proxy.ServicePortName, srcAddr ne } if !sessionAffinityReset { sessionAffinity, exists := state.affinity.affinityMap[ipaddr] - if exists && int(time.Now().Sub(sessionAffinity.lastUsed).Minutes()) < state.affinity.ttlMinutes { + if exists && int(time.Now().Sub(sessionAffinity.lastUsed).Seconds()) < state.affinity.ttlSeconds { // Affinity wins. endpoint := sessionAffinity.endpoint sessionAffinity.lastUsed = time.Now() @@ -378,7 +378,7 @@ func (lb *LoadBalancerRR) CleanupStaleStickySessions(svcPort proxy.ServicePortNa return } for ip, affinity := range state.affinity.affinityMap { - if int(time.Now().Sub(affinity.lastUsed).Minutes()) >= state.affinity.ttlMinutes { + if int(time.Now().Sub(affinity.lastUsed).Seconds()) >= state.affinity.ttlSeconds { glog.V(4).Infof("Removing client %s from affinityMap for service %q", affinity.clientIP, svcPort) delete(state.affinity.affinityMap, ip) } diff --git a/pkg/proxy/userspace/roundrobin_test.go b/pkg/proxy/userspace/roundrobin_test.go index de3a64de77bc8..05ccbd37a817e 100644 --- a/pkg/proxy/userspace/roundrobin_test.go +++ b/pkg/proxy/userspace/roundrobin_test.go @@ -357,7 +357,7 @@ func TestStickyLoadBalanceWorksWithNewServiceCalledFirst(t *testing.T) { } // Call NewService() before OnEndpointsUpdate() - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpoints := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: service.Name, Namespace: service.Namespace}, Subsets: []api.EndpointSubset{ @@ -421,7 +421,7 @@ func TestStickyLoadBalanceWorksWithNewServiceCalledSecond(t *testing.T) { }, } loadBalancer.OnEndpointsAdd(endpoints) - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) client1 := &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0} client2 := &net.TCPAddr{IP: net.IPv4(127, 0, 0, 2), Port: 0} @@ -473,7 +473,7 @@ func TestStickyLoadBalanaceWorksWithMultipleEndpointsRemoveOne(t *testing.T) { t.Errorf("Didn't fail with non-existent service") } - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpointsv1 := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: service.Name, Namespace: service.Namespace}, Subsets: []api.EndpointSubset{ @@ -546,7 +546,7 @@ func TestStickyLoadBalanceWorksWithMultipleEndpointsAndUpdates(t *testing.T) { t.Errorf("Didn't fail with non-existent service") } - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpointsv1 := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: service.Name, Namespace: service.Namespace}, Subsets: []api.EndpointSubset{ @@ -605,7 +605,7 @@ func TestStickyLoadBalanceWorksWithServiceRemoval(t *testing.T) { if err == nil || len(endpoint) != 0 { t.Errorf("Didn't fail with non-existent service") } - loadBalancer.NewService(fooService, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(fooService, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpoints1 := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: fooService.Name, Namespace: fooService.Namespace}, Subsets: []api.EndpointSubset{ @@ -616,7 +616,7 @@ func TestStickyLoadBalanceWorksWithServiceRemoval(t *testing.T) { }, } barService := proxy.ServicePortName{NamespacedName: types.NamespacedName{Namespace: "testnamespace", Name: "bar"}, Port: ""} - loadBalancer.NewService(barService, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(barService, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpoints2 := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: barService.Name, Namespace: barService.Namespace}, Subsets: []api.EndpointSubset{ @@ -674,7 +674,7 @@ func TestStickyLoadBalanceWorksWithEndpointFails(t *testing.T) { } // Call NewService() before OnEndpointsUpdate() - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpoints := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: service.Name, Namespace: service.Namespace}, Subsets: []api.EndpointSubset{ diff --git a/pkg/proxy/winuserspace/proxier.go b/pkg/proxy/winuserspace/proxier.go index 03fd9546c4524..4e6382918c658 100644 --- a/pkg/proxy/winuserspace/proxier.go +++ b/pkg/proxy/winuserspace/proxier.go @@ -36,7 +36,6 @@ import ( ) const allAvailableInterfaces string = "" -const stickyMaxAgeMinutes int = 180 // TODO: parameterize this in the API. type portal struct { ip string @@ -360,7 +359,11 @@ func (proxier *Proxier) mergeService(service *api.Service) map[ServicePortPortal }, Port: servicePort.Name, } - proxier.loadBalancer.NewService(servicePortName, service.Spec.SessionAffinity, stickyMaxAgeMinutes) + timeoutSeconds := 0 + if service.Spec.SessionAffinity == api.ServiceAffinityClientIP { + timeoutSeconds = int(*service.Spec.SessionAffinityConfig.ClientIP.TimeoutSeconds) + } + proxier.loadBalancer.NewService(servicePortName, service.Spec.SessionAffinity, timeoutSeconds) } } diff --git a/pkg/proxy/winuserspace/roundrobin.go b/pkg/proxy/winuserspace/roundrobin.go index ff2026bd8fcf6..86d7614c85034 100644 --- a/pkg/proxy/winuserspace/roundrobin.go +++ b/pkg/proxy/winuserspace/roundrobin.go @@ -48,7 +48,7 @@ type affinityState struct { type affinityPolicy struct { affinityType api.ServiceAffinity affinityMap map[string]*affinityState // map client IP -> affinity info - ttlMinutes int + ttlSeconds int } // LoadBalancerRR is a round-robin load balancer. @@ -66,11 +66,11 @@ type balancerState struct { affinity affinityPolicy } -func newAffinityPolicy(affinityType api.ServiceAffinity, ttlMinutes int) *affinityPolicy { +func newAffinityPolicy(affinityType api.ServiceAffinity, ttlSeconds int) *affinityPolicy { return &affinityPolicy{ affinityType: affinityType, affinityMap: make(map[string]*affinityState), - ttlMinutes: ttlMinutes, + ttlSeconds: ttlSeconds, } } @@ -81,22 +81,22 @@ func NewLoadBalancerRR() *LoadBalancerRR { } } -func (lb *LoadBalancerRR) NewService(svcPort proxy.ServicePortName, affinityType api.ServiceAffinity, ttlMinutes int) error { +func (lb *LoadBalancerRR) NewService(svcPort proxy.ServicePortName, affinityType api.ServiceAffinity, ttlSeconds int) error { glog.V(4).Infof("LoadBalancerRR NewService %q", svcPort) lb.lock.Lock() defer lb.lock.Unlock() - lb.newServiceInternal(svcPort, affinityType, ttlMinutes) + lb.newServiceInternal(svcPort, affinityType, ttlSeconds) return nil } // This assumes that lb.lock is already held. -func (lb *LoadBalancerRR) newServiceInternal(svcPort proxy.ServicePortName, affinityType api.ServiceAffinity, ttlMinutes int) *balancerState { - if ttlMinutes == 0 { - ttlMinutes = 180 //default to 3 hours if not specified. Should 0 be unlimited instead???? +func (lb *LoadBalancerRR) newServiceInternal(svcPort proxy.ServicePortName, affinityType api.ServiceAffinity, ttlSeconds int) *balancerState { + if ttlSeconds == 0 { + ttlSeconds = int(api.DefaultClientIPServiceAffinitySeconds) //default to 3 hours if not specified. Should 0 be unlimited instead???? } if _, exists := lb.services[svcPort]; !exists { - lb.services[svcPort] = &balancerState{affinity: *newAffinityPolicy(affinityType, ttlMinutes)} + lb.services[svcPort] = &balancerState{affinity: *newAffinityPolicy(affinityType, ttlSeconds)} glog.V(4).Infof("LoadBalancerRR service %q did not exist, created", svcPort) } else if affinityType != "" { lb.services[svcPort].affinity.affinityType = affinityType @@ -149,7 +149,7 @@ func (lb *LoadBalancerRR) NextEndpoint(svcPort proxy.ServicePortName, srcAddr ne } if !sessionAffinityReset { sessionAffinity, exists := state.affinity.affinityMap[ipaddr] - if exists && int(time.Now().Sub(sessionAffinity.lastUsed).Minutes()) < state.affinity.ttlMinutes { + if exists && int(time.Now().Sub(sessionAffinity.lastUsed).Seconds()) < state.affinity.ttlSeconds { // Affinity wins. endpoint := sessionAffinity.endpoint sessionAffinity.lastUsed = time.Now() @@ -366,7 +366,7 @@ func (lb *LoadBalancerRR) CleanupStaleStickySessions(svcPort proxy.ServicePortNa return } for ip, affinity := range state.affinity.affinityMap { - if int(time.Now().Sub(affinity.lastUsed).Minutes()) >= state.affinity.ttlMinutes { + if int(time.Now().Sub(affinity.lastUsed).Seconds()) >= state.affinity.ttlSeconds { glog.V(4).Infof("Removing client %s from affinityMap for service %q", affinity.clientIP, svcPort) delete(state.affinity.affinityMap, ip) } diff --git a/pkg/proxy/winuserspace/roundrobin_test.go b/pkg/proxy/winuserspace/roundrobin_test.go index b334a3ccc241e..1f4973ee1a941 100644 --- a/pkg/proxy/winuserspace/roundrobin_test.go +++ b/pkg/proxy/winuserspace/roundrobin_test.go @@ -357,7 +357,7 @@ func TestStickyLoadBalanceWorksWithNewServiceCalledFirst(t *testing.T) { } // Call NewService() before OnEndpointsUpdate() - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpoints := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: service.Name, Namespace: service.Namespace}, Subsets: []api.EndpointSubset{ @@ -421,7 +421,7 @@ func TestStickyLoadBalanceWorksWithNewServiceCalledSecond(t *testing.T) { }, } loadBalancer.OnEndpointsAdd(endpoints) - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) client1 := &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0} client2 := &net.TCPAddr{IP: net.IPv4(127, 0, 0, 2), Port: 0} @@ -473,7 +473,7 @@ func TestStickyLoadBalanaceWorksWithMultipleEndpointsRemoveOne(t *testing.T) { t.Errorf("Didn't fail with non-existent service") } - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpointsv1 := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: service.Name, Namespace: service.Namespace}, Subsets: []api.EndpointSubset{ @@ -546,7 +546,7 @@ func TestStickyLoadBalanceWorksWithMultipleEndpointsAndUpdates(t *testing.T) { t.Errorf("Didn't fail with non-existent service") } - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpointsv1 := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: service.Name, Namespace: service.Namespace}, Subsets: []api.EndpointSubset{ @@ -605,7 +605,7 @@ func TestStickyLoadBalanceWorksWithServiceRemoval(t *testing.T) { if err == nil || len(endpoint) != 0 { t.Errorf("Didn't fail with non-existent service") } - loadBalancer.NewService(fooService, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(fooService, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpoints1 := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: fooService.Name, Namespace: fooService.Namespace}, Subsets: []api.EndpointSubset{ @@ -616,7 +616,7 @@ func TestStickyLoadBalanceWorksWithServiceRemoval(t *testing.T) { }, } barService := proxy.ServicePortName{NamespacedName: types.NamespacedName{Namespace: "testnamespace", Name: "bar"}, Port: ""} - loadBalancer.NewService(barService, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(barService, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpoints2 := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: barService.Name, Namespace: barService.Namespace}, Subsets: []api.EndpointSubset{ @@ -674,7 +674,7 @@ func TestStickyLoadBalanceWorksWithEndpointFails(t *testing.T) { } // Call NewService() before OnEndpointsUpdate() - loadBalancer.NewService(service, api.ServiceAffinityClientIP, 0) + loadBalancer.NewService(service, api.ServiceAffinityClientIP, int(api.DefaultClientIPServiceAffinitySeconds)) endpoints := &api.Endpoints{ ObjectMeta: metav1.ObjectMeta{Name: service.Name, Namespace: service.Namespace}, Subsets: []api.EndpointSubset{ diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index c3de989d35812..e5e58c0d84fca 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -2998,6 +2998,22 @@ const ( ServiceAffinityNone ServiceAffinity = "None" ) +// SessionAffinityConfig represents the configurations of session affinity. +type SessionAffinityConfig struct { + // clientIP contains the configurations of Client IP based session affinity. + // +optional + ClientIP *ClientIPConfig `json:"clientIP,omitempty" protobuf:"bytes,1,opt,name=clientIP"` +} + +// ClientIPConfig represents the configurations of Client IP based session affinity. +type ClientIPConfig struct { + // timeoutSeconds specifies the seconds of ClientIP type session sticky time. + // The value must be >0 && <=86400(for 1 day) if ServiceAffinity == "ClientIP". + // Default value is 10800(for 3 hours). + // +optional + TimeoutSeconds *int32 `json:"timeoutSeconds,omitempty" protobuf:"varint,1,opt,name=timeoutSeconds"` +} + // Service Type string describes ingress methods for a service type ServiceType string @@ -3172,6 +3188,9 @@ type ServiceSpec struct { // field. // +optional PublishNotReadyAddresses bool `json:"publishNotReadyAddresses,omitempty" protobuf:"varint,13,opt,name=publishNotReadyAddresses"` + // sessionAffinityConfig contains the configurations of session affinity. + // +optional + SessionAffinityConfig *SessionAffinityConfig `json:"sessionAffinityConfig,omitempty" protobuf:"bytes,14,opt,name=sessionAffinityConfig"` } // ServicePort contains information on service's port. From ad73fe68a7c3f6380337f100bf30542776d9bcf0 Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Thu, 24 Aug 2017 17:12:53 +0800 Subject: [PATCH 308/403] auto gen code --- api/openapi-spec/swagger.json | 23 + api/swagger-spec/v1.json | 25 + docs/api-reference/v1/definitions.html | 75 + federation/apis/openapi-spec/swagger.json | 23 + federation/apis/swagger-spec/v1.json | 25 + .../docs/api-reference/v1/definitions.html | 75 + pkg/api/v1/zz_generated.conversion.go | 46 + pkg/api/zz_generated.deepcopy.go | 67 + .../src/k8s.io/api/core/v1/generated.pb.go | 2241 ++++++++++------- .../src/k8s.io/api/core/v1/generated.proto | 20 + .../src/k8s.io/api/core/v1/types.generated.go | 660 ++++- .../core/v1/types_swagger_doc_generated.go | 19 + .../api/core/v1/zz_generated.deepcopy.go | 67 + 13 files changed, 2285 insertions(+), 1081 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index ab558baa8f088..4f98dc62630b8 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -58320,6 +58320,16 @@ } } }, + "io.k8s.api.core.v1.ClientIPConfig": { + "description": "ClientIPConfig represents the configurations of Client IP based session affinity.", + "properties": { + "timeoutSeconds": { + "description": "timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be \u003e0 \u0026\u0026 \u003c=86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800(for 3 hours).", + "type": "integer", + "format": "int32" + } + } + }, "io.k8s.api.core.v1.ComponentCondition": { "description": "Information about the condition of a component.", "required": [ @@ -62066,6 +62076,10 @@ "description": "Supports \"ClientIP\" and \"None\". Used to maintain session affinity. Enable client IP based session affinity. Must be ClientIP or None. Defaults to None. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies", "type": "string" }, + "sessionAffinityConfig": { + "description": "sessionAffinityConfig contains the configurations of session affinity.", + "$ref": "#/definitions/io.k8s.api.core.v1.SessionAffinityConfig" + }, "type": { "description": "type determines how the Service is exposed. Defaults to ClusterIP. Valid options are ExternalName, ClusterIP, NodePort, and LoadBalancer. \"ExternalName\" maps to the specified externalName. \"ClusterIP\" allocates a cluster-internal IP address for load-balancing to endpoints. Endpoints are determined by the selector or if that is not specified, by manual construction of an Endpoints object. If clusterIP is \"None\", no virtual IP is allocated and the endpoints are published as a set of endpoints rather than a stable IP. \"NodePort\" builds on ClusterIP and allocates a port on every node which routes to the clusterIP. \"LoadBalancer\" builds on NodePort and creates an external load-balancer (if supported in the current cloud) which routes to the clusterIP. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types", "type": "string" @@ -62081,6 +62095,15 @@ } } }, + "io.k8s.api.core.v1.SessionAffinityConfig": { + "description": "SessionAffinityConfig represents the configurations of session affinity.", + "properties": { + "clientIP": { + "description": "clientIP contains the configurations of Client IP based session affinity.", + "$ref": "#/definitions/io.k8s.api.core.v1.ClientIPConfig" + } + } + }, "io.k8s.api.core.v1.StorageOSPersistentVolumeSource": { "description": "Represents a StorageOS persistent volume resource.", "properties": { diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 893be84f2e2d1..d33172a205867 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -21907,6 +21907,10 @@ "publishNotReadyAddresses": { "type": "boolean", "description": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field." + }, + "sessionAffinityConfig": { + "$ref": "v1.SessionAffinityConfig", + "description": "sessionAffinityConfig contains the configurations of session affinity." } } }, @@ -21941,6 +21945,27 @@ } } }, + "v1.SessionAffinityConfig": { + "id": "v1.SessionAffinityConfig", + "description": "SessionAffinityConfig represents the configurations of session affinity.", + "properties": { + "clientIP": { + "$ref": "v1.ClientIPConfig", + "description": "clientIP contains the configurations of Client IP based session affinity." + } + } + }, + "v1.ClientIPConfig": { + "id": "v1.ClientIPConfig", + "description": "ClientIPConfig represents the configurations of Client IP based session affinity.", + "properties": { + "timeoutSeconds": { + "type": "integer", + "format": "int32", + "description": "timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be \u003e0 \u0026\u0026 \u003c=86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800(for 3 hours)." + } + } + }, "v1.ServiceStatus": { "id": "v1.ServiceStatus", "description": "ServiceStatus represents the current status of a service.", diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index a6f1b125796e9..ee36292742061 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -6144,6 +6144,40 @@

v1.StatusCause

+
+
+

v1.SessionAffinityConfig

+
+

SessionAffinityConfig represents the configurations of session affinity.

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

clientIP

clientIP contains the configurations of Client IP based session affinity.

false

v1.ClientIPConfig

+

v1.PodCondition

@@ -7995,6 +8029,40 @@

v1.ComponentStatusList

+
+
+

v1.ClientIPConfig

+
+

ClientIPConfig represents the configurations of Client IP based session affinity.

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

timeoutSeconds

timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be >0 && ⇐86400(for 1 day) if ServiceAffinity == "ClientIP". Default value is 10800(for 3 hours).

false

integer (int32)

+

v1.APIResource

@@ -10224,6 +10292,13 @@

v1.ServiceSpec

boolean

false

+ +

sessionAffinityConfig

+

sessionAffinityConfig contains the configurations of session affinity.

+

false

+

v1.SessionAffinityConfig

+ + diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index 96f9d9284ce15..6bfe197cc0f9c 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -9844,6 +9844,16 @@ } } }, + "io.k8s.api.core.v1.ClientIPConfig": { + "description": "ClientIPConfig represents the configurations of Client IP based session affinity.", + "properties": { + "timeoutSeconds": { + "description": "timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be \u003e0 \u0026\u0026 \u003c=86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800(for 3 hours).", + "type": "integer", + "format": "int32" + } + } + }, "io.k8s.api.core.v1.ConfigMap": { "description": "ConfigMap holds configuration data for pods to consume.", "properties": { @@ -11874,6 +11884,10 @@ "description": "Supports \"ClientIP\" and \"None\". Used to maintain session affinity. Enable client IP based session affinity. Must be ClientIP or None. Defaults to None. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies", "type": "string" }, + "sessionAffinityConfig": { + "description": "sessionAffinityConfig contains the configurations of session affinity.", + "$ref": "#/definitions/io.k8s.api.core.v1.SessionAffinityConfig" + }, "type": { "description": "type determines how the Service is exposed. Defaults to ClusterIP. Valid options are ExternalName, ClusterIP, NodePort, and LoadBalancer. \"ExternalName\" maps to the specified externalName. \"ClusterIP\" allocates a cluster-internal IP address for load-balancing to endpoints. Endpoints are determined by the selector or if that is not specified, by manual construction of an Endpoints object. If clusterIP is \"None\", no virtual IP is allocated and the endpoints are published as a set of endpoints rather than a stable IP. \"NodePort\" builds on ClusterIP and allocates a port on every node which routes to the clusterIP. \"LoadBalancer\" builds on NodePort and creates an external load-balancer (if supported in the current cloud) which routes to the clusterIP. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types", "type": "string" @@ -11889,6 +11903,15 @@ } } }, + "io.k8s.api.core.v1.SessionAffinityConfig": { + "description": "SessionAffinityConfig represents the configurations of session affinity.", + "properties": { + "clientIP": { + "description": "clientIP contains the configurations of Client IP based session affinity.", + "$ref": "#/definitions/io.k8s.api.core.v1.ClientIPConfig" + } + } + }, "io.k8s.api.core.v1.StorageOSVolumeSource": { "description": "Represents a StorageOS persistent volume resource.", "properties": { diff --git a/federation/apis/swagger-spec/v1.json b/federation/apis/swagger-spec/v1.json index de5cbc562de16..54ca88fed9a84 100644 --- a/federation/apis/swagger-spec/v1.json +++ b/federation/apis/swagger-spec/v1.json @@ -5128,6 +5128,10 @@ "publishNotReadyAddresses": { "type": "boolean", "description": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field." + }, + "sessionAffinityConfig": { + "$ref": "v1.SessionAffinityConfig", + "description": "sessionAffinityConfig contains the configurations of session affinity." } } }, @@ -5162,6 +5166,27 @@ } } }, + "v1.SessionAffinityConfig": { + "id": "v1.SessionAffinityConfig", + "description": "SessionAffinityConfig represents the configurations of session affinity.", + "properties": { + "clientIP": { + "$ref": "v1.ClientIPConfig", + "description": "clientIP contains the configurations of Client IP based session affinity." + } + } + }, + "v1.ClientIPConfig": { + "id": "v1.ClientIPConfig", + "description": "ClientIPConfig represents the configurations of Client IP based session affinity.", + "properties": { + "timeoutSeconds": { + "type": "integer", + "format": "int32", + "description": "timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be \u003e0 \u0026\u0026 \u003c=86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800(for 3 hours)." + } + } + }, "v1.ServiceStatus": { "id": "v1.ServiceStatus", "description": "ServiceStatus represents the current status of a service.", diff --git a/federation/docs/api-reference/v1/definitions.html b/federation/docs/api-reference/v1/definitions.html index b4ba4127bbd4c..f02c87030702e 100755 --- a/federation/docs/api-reference/v1/definitions.html +++ b/federation/docs/api-reference/v1/definitions.html @@ -2049,6 +2049,40 @@

v1.EventList

+
+
+

v1.ClientIPConfig

+
+

ClientIPConfig represents the configurations of Client IP based session affinity.

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

timeoutSeconds

timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be >0 && ⇐86400(for 1 day) if ServiceAffinity == "ClientIP". Default value is 10800(for 3 hours).

false

integer (int32)

+

v1.APIResource

@@ -2233,6 +2267,13 @@

v1.ServiceSpec

boolean

false

+ +

sessionAffinityConfig

+

sessionAffinityConfig contains the configurations of session affinity.

+

false

+

v1.SessionAffinityConfig

+ + @@ -2333,6 +2374,40 @@

v1.StatusCause

+
+
+

v1.SessionAffinityConfig

+
+

SessionAffinityConfig represents the configurations of session affinity.

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

clientIP

clientIP contains the configurations of Client IP based session affinity.

false

v1.ClientIPConfig

+

any

diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index b1e6276a87615..2f5c85acf6853 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -62,6 +62,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_CephFSVolumeSource_To_v1_CephFSVolumeSource, Convert_v1_CinderVolumeSource_To_api_CinderVolumeSource, Convert_api_CinderVolumeSource_To_v1_CinderVolumeSource, + Convert_v1_ClientIPConfig_To_api_ClientIPConfig, + Convert_api_ClientIPConfig_To_v1_ClientIPConfig, Convert_v1_ComponentCondition_To_api_ComponentCondition, Convert_api_ComponentCondition_To_v1_ComponentCondition, Convert_v1_ComponentStatus_To_api_ComponentStatus, @@ -364,6 +366,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_ServiceSpec_To_v1_ServiceSpec, Convert_v1_ServiceStatus_To_api_ServiceStatus, Convert_api_ServiceStatus_To_v1_ServiceStatus, + Convert_v1_SessionAffinityConfig_To_api_SessionAffinityConfig, + Convert_api_SessionAffinityConfig_To_v1_SessionAffinityConfig, Convert_v1_StorageOSPersistentVolumeSource_To_api_StorageOSPersistentVolumeSource, Convert_api_StorageOSPersistentVolumeSource_To_v1_StorageOSPersistentVolumeSource, Convert_v1_StorageOSVolumeSource_To_api_StorageOSVolumeSource, @@ -703,6 +707,26 @@ func Convert_api_CinderVolumeSource_To_v1_CinderVolumeSource(in *api.CinderVolum return autoConvert_api_CinderVolumeSource_To_v1_CinderVolumeSource(in, out, s) } +func autoConvert_v1_ClientIPConfig_To_api_ClientIPConfig(in *v1.ClientIPConfig, out *api.ClientIPConfig, s conversion.Scope) error { + out.TimeoutSeconds = (*int32)(unsafe.Pointer(in.TimeoutSeconds)) + return nil +} + +// Convert_v1_ClientIPConfig_To_api_ClientIPConfig is an autogenerated conversion function. +func Convert_v1_ClientIPConfig_To_api_ClientIPConfig(in *v1.ClientIPConfig, out *api.ClientIPConfig, s conversion.Scope) error { + return autoConvert_v1_ClientIPConfig_To_api_ClientIPConfig(in, out, s) +} + +func autoConvert_api_ClientIPConfig_To_v1_ClientIPConfig(in *api.ClientIPConfig, out *v1.ClientIPConfig, s conversion.Scope) error { + out.TimeoutSeconds = (*int32)(unsafe.Pointer(in.TimeoutSeconds)) + return nil +} + +// Convert_api_ClientIPConfig_To_v1_ClientIPConfig is an autogenerated conversion function. +func Convert_api_ClientIPConfig_To_v1_ClientIPConfig(in *api.ClientIPConfig, out *v1.ClientIPConfig, s conversion.Scope) error { + return autoConvert_api_ClientIPConfig_To_v1_ClientIPConfig(in, out, s) +} + func autoConvert_v1_ComponentCondition_To_api_ComponentCondition(in *v1.ComponentCondition, out *api.ComponentCondition, s conversion.Scope) error { out.Type = api.ComponentConditionType(in.Type) out.Status = api.ConditionStatus(in.Status) @@ -4930,6 +4954,7 @@ func autoConvert_v1_ServiceSpec_To_api_ServiceSpec(in *v1.ServiceSpec, out *api. out.ExternalTrafficPolicy = api.ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy) out.HealthCheckNodePort = in.HealthCheckNodePort out.PublishNotReadyAddresses = in.PublishNotReadyAddresses + out.SessionAffinityConfig = (*api.SessionAffinityConfig)(unsafe.Pointer(in.SessionAffinityConfig)) return nil } @@ -4947,6 +4972,7 @@ func autoConvert_api_ServiceSpec_To_v1_ServiceSpec(in *api.ServiceSpec, out *v1. out.ExternalIPs = *(*[]string)(unsafe.Pointer(&in.ExternalIPs)) out.LoadBalancerIP = in.LoadBalancerIP out.SessionAffinity = v1.ServiceAffinity(in.SessionAffinity) + out.SessionAffinityConfig = (*v1.SessionAffinityConfig)(unsafe.Pointer(in.SessionAffinityConfig)) out.LoadBalancerSourceRanges = *(*[]string)(unsafe.Pointer(&in.LoadBalancerSourceRanges)) out.ExternalTrafficPolicy = v1.ServiceExternalTrafficPolicyType(in.ExternalTrafficPolicy) out.HealthCheckNodePort = in.HealthCheckNodePort @@ -4983,6 +5009,26 @@ func Convert_api_ServiceStatus_To_v1_ServiceStatus(in *api.ServiceStatus, out *v return autoConvert_api_ServiceStatus_To_v1_ServiceStatus(in, out, s) } +func autoConvert_v1_SessionAffinityConfig_To_api_SessionAffinityConfig(in *v1.SessionAffinityConfig, out *api.SessionAffinityConfig, s conversion.Scope) error { + out.ClientIP = (*api.ClientIPConfig)(unsafe.Pointer(in.ClientIP)) + return nil +} + +// Convert_v1_SessionAffinityConfig_To_api_SessionAffinityConfig is an autogenerated conversion function. +func Convert_v1_SessionAffinityConfig_To_api_SessionAffinityConfig(in *v1.SessionAffinityConfig, out *api.SessionAffinityConfig, s conversion.Scope) error { + return autoConvert_v1_SessionAffinityConfig_To_api_SessionAffinityConfig(in, out, s) +} + +func autoConvert_api_SessionAffinityConfig_To_v1_SessionAffinityConfig(in *api.SessionAffinityConfig, out *v1.SessionAffinityConfig, s conversion.Scope) error { + out.ClientIP = (*v1.ClientIPConfig)(unsafe.Pointer(in.ClientIP)) + return nil +} + +// Convert_api_SessionAffinityConfig_To_v1_SessionAffinityConfig is an autogenerated conversion function. +func Convert_api_SessionAffinityConfig_To_v1_SessionAffinityConfig(in *api.SessionAffinityConfig, out *v1.SessionAffinityConfig, s conversion.Scope) error { + return autoConvert_api_SessionAffinityConfig_To_v1_SessionAffinityConfig(in, out, s) +} + func autoConvert_v1_StorageOSPersistentVolumeSource_To_api_StorageOSPersistentVolumeSource(in *v1.StorageOSPersistentVolumeSource, out *api.StorageOSPersistentVolumeSource, s conversion.Scope) error { out.VolumeName = in.VolumeName out.VolumeNamespace = in.VolumeNamespace diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index fb5377d6679b4..1c2f7bd751cec 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -86,6 +86,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*CinderVolumeSource).DeepCopyInto(out.(*CinderVolumeSource)) return nil }, InType: reflect.TypeOf(&CinderVolumeSource{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*ClientIPConfig).DeepCopyInto(out.(*ClientIPConfig)) + return nil + }, InType: reflect.TypeOf(&ClientIPConfig{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*ComponentCondition).DeepCopyInto(out.(*ComponentCondition)) return nil @@ -690,6 +694,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*ServiceStatus).DeepCopyInto(out.(*ServiceStatus)) return nil }, InType: reflect.TypeOf(&ServiceStatus{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*SessionAffinityConfig).DeepCopyInto(out.(*SessionAffinityConfig)) + return nil + }, InType: reflect.TypeOf(&SessionAffinityConfig{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*StorageOSPersistentVolumeSource).DeepCopyInto(out.(*StorageOSPersistentVolumeSource)) return nil @@ -1062,6 +1070,31 @@ func (in *CinderVolumeSource) DeepCopy() *CinderVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClientIPConfig) DeepCopyInto(out *ClientIPConfig) { + *out = *in + if in.TimeoutSeconds != nil { + in, out := &in.TimeoutSeconds, &out.TimeoutSeconds + if *in == nil { + *out = nil + } else { + *out = new(int32) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClientIPConfig. +func (in *ClientIPConfig) DeepCopy() *ClientIPConfig { + if in == nil { + return nil + } + out := new(ClientIPConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ComponentCondition) DeepCopyInto(out *ComponentCondition) { *out = *in @@ -5670,6 +5703,15 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.SessionAffinityConfig != nil { + in, out := &in.SessionAffinityConfig, &out.SessionAffinityConfig + if *in == nil { + *out = nil + } else { + *out = new(SessionAffinityConfig) + (*in).DeepCopyInto(*out) + } + } if in.LoadBalancerSourceRanges != nil { in, out := &in.LoadBalancerSourceRanges, &out.LoadBalancerSourceRanges *out = make([]string, len(*in)) @@ -5705,6 +5747,31 @@ func (in *ServiceStatus) DeepCopy() *ServiceStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SessionAffinityConfig) DeepCopyInto(out *SessionAffinityConfig) { + *out = *in + if in.ClientIP != nil { + in, out := &in.ClientIP, &out.ClientIP + if *in == nil { + *out = nil + } else { + *out = new(ClientIPConfig) + (*in).DeepCopyInto(*out) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SessionAffinityConfig. +func (in *SessionAffinityConfig) DeepCopy() *SessionAffinityConfig { + if in == nil { + return nil + } + out := new(SessionAffinityConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StorageOSPersistentVolumeSource) DeepCopyInto(out *StorageOSPersistentVolumeSource) { *out = *in diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 77e938ee5649a..2e8c6ddaf016d 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -37,6 +37,7 @@ limitations under the License. CephFSPersistentVolumeSource CephFSVolumeSource CinderVolumeSource + ClientIPConfig ComponentCondition ComponentStatus ComponentStatusList @@ -188,6 +189,7 @@ limitations under the License. ServiceProxyOptions ServiceSpec ServiceStatus + SessionAffinityConfig StorageOSPersistentVolumeSource StorageOSVolumeSource Sysctl @@ -285,694 +287,702 @@ func (m *CinderVolumeSource) Reset() { *m = CinderVolumeSourc func (*CinderVolumeSource) ProtoMessage() {} func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } +func (m *ClientIPConfig) Reset() { *m = ClientIPConfig{} } +func (*ClientIPConfig) ProtoMessage() {} +func (*ClientIPConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } + func (m *ComponentCondition) Reset() { *m = ComponentCondition{} } func (*ComponentCondition) ProtoMessage() {} -func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } +func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } func (m *ComponentStatus) Reset() { *m = ComponentStatus{} } func (*ComponentStatus) ProtoMessage() {} -func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } +func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (m *ComponentStatusList) Reset() { *m = ComponentStatusList{} } func (*ComponentStatusList) ProtoMessage() {} -func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } +func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (m *ConfigMap) Reset() { *m = ConfigMap{} } func (*ConfigMap) ProtoMessage() {} -func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } +func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } func (m *ConfigMapEnvSource) Reset() { *m = ConfigMapEnvSource{} } func (*ConfigMapEnvSource) ProtoMessage() {} -func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } +func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } func (m *ConfigMapKeySelector) Reset() { *m = ConfigMapKeySelector{} } func (*ConfigMapKeySelector) ProtoMessage() {} -func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } +func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } func (m *ConfigMapList) Reset() { *m = ConfigMapList{} } func (*ConfigMapList) ProtoMessage() {} -func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } +func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (m *ConfigMapProjection) Reset() { *m = ConfigMapProjection{} } func (*ConfigMapProjection) ProtoMessage() {} -func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } +func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (m *ConfigMapVolumeSource) Reset() { *m = ConfigMapVolumeSource{} } func (*ConfigMapVolumeSource) ProtoMessage() {} -func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } +func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } func (m *Container) Reset() { *m = Container{} } func (*Container) ProtoMessage() {} -func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (m *ContainerImage) Reset() { *m = ContainerImage{} } func (*ContainerImage) ProtoMessage() {} -func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *ContainerPort) Reset() { *m = ContainerPort{} } func (*ContainerPort) ProtoMessage() {} -func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *ContainerState) Reset() { *m = ContainerState{} } func (*ContainerState) ProtoMessage() {} -func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *ContainerStateRunning) Reset() { *m = ContainerStateRunning{} } func (*ContainerStateRunning) ProtoMessage() {} -func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (m *ContainerStateTerminated) Reset() { *m = ContainerStateTerminated{} } func (*ContainerStateTerminated) ProtoMessage() {} func (*ContainerStateTerminated) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{26} + return fileDescriptorGenerated, []int{27} } func (m *ContainerStateWaiting) Reset() { *m = ContainerStateWaiting{} } func (*ContainerStateWaiting) ProtoMessage() {} -func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } func (*ContainerStatus) ProtoMessage() {} -func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } +func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *DaemonEndpoint) Reset() { *m = DaemonEndpoint{} } func (*DaemonEndpoint) ProtoMessage() {} -func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *DeleteOptions) Reset() { *m = DeleteOptions{} } func (*DeleteOptions) ProtoMessage() {} -func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *DownwardAPIProjection) Reset() { *m = DownwardAPIProjection{} } func (*DownwardAPIProjection) ProtoMessage() {} -func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } +func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (m *DownwardAPIVolumeFile) Reset() { *m = DownwardAPIVolumeFile{} } func (*DownwardAPIVolumeFile) ProtoMessage() {} -func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *DownwardAPIVolumeSource) Reset() { *m = DownwardAPIVolumeSource{} } func (*DownwardAPIVolumeSource) ProtoMessage() {} func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{33} + return fileDescriptorGenerated, []int{34} } func (m *EmptyDirVolumeSource) Reset() { *m = EmptyDirVolumeSource{} } func (*EmptyDirVolumeSource) ProtoMessage() {} -func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } +func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } func (m *EndpointAddress) Reset() { *m = EndpointAddress{} } func (*EndpointAddress) ProtoMessage() {} -func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } +func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (m *EndpointPort) Reset() { *m = EndpointPort{} } func (*EndpointPort) ProtoMessage() {} -func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *EndpointSubset) Reset() { *m = EndpointSubset{} } func (*EndpointSubset) ProtoMessage() {} -func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } +func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func (m *Endpoints) Reset() { *m = Endpoints{} } func (*Endpoints) ProtoMessage() {} -func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } +func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } func (m *EndpointsList) Reset() { *m = EndpointsList{} } func (*EndpointsList) ProtoMessage() {} -func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } +func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } func (m *EnvFromSource) Reset() { *m = EnvFromSource{} } func (*EnvFromSource) ProtoMessage() {} -func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } +func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } func (m *EnvVar) Reset() { *m = EnvVar{} } func (*EnvVar) ProtoMessage() {} -func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } +func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } func (m *EnvVarSource) Reset() { *m = EnvVarSource{} } func (*EnvVarSource) ProtoMessage() {} -func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } +func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } +func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } func (m *EventList) Reset() { *m = EventList{} } func (*EventList) ProtoMessage() {} -func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } +func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } func (m *EventSource) Reset() { *m = EventSource{} } func (*EventSource) ProtoMessage() {} -func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } +func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } func (m *ExecAction) Reset() { *m = ExecAction{} } func (*ExecAction) ProtoMessage() {} -func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } +func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } func (m *FCVolumeSource) Reset() { *m = FCVolumeSource{} } func (*FCVolumeSource) ProtoMessage() {} -func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } +func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } func (m *FlexVolumeSource) Reset() { *m = FlexVolumeSource{} } func (*FlexVolumeSource) ProtoMessage() {} -func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } +func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } func (m *FlockerVolumeSource) Reset() { *m = FlockerVolumeSource{} } func (*FlockerVolumeSource) ProtoMessage() {} -func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } +func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } func (m *GCEPersistentDiskVolumeSource) Reset() { *m = GCEPersistentDiskVolumeSource{} } func (*GCEPersistentDiskVolumeSource) ProtoMessage() {} func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{50} + return fileDescriptorGenerated, []int{51} } func (m *GitRepoVolumeSource) Reset() { *m = GitRepoVolumeSource{} } func (*GitRepoVolumeSource) ProtoMessage() {} -func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } +func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } func (m *GlusterfsVolumeSource) Reset() { *m = GlusterfsVolumeSource{} } func (*GlusterfsVolumeSource) ProtoMessage() {} -func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } +func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } func (m *HTTPGetAction) Reset() { *m = HTTPGetAction{} } func (*HTTPGetAction) ProtoMessage() {} -func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } +func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } func (m *HTTPHeader) Reset() { *m = HTTPHeader{} } func (*HTTPHeader) ProtoMessage() {} -func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } +func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } func (m *Handler) Reset() { *m = Handler{} } func (*Handler) ProtoMessage() {} -func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } +func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } func (m *HostAlias) Reset() { *m = HostAlias{} } func (*HostAlias) ProtoMessage() {} -func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } +func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } func (m *HostPathVolumeSource) Reset() { *m = HostPathVolumeSource{} } func (*HostPathVolumeSource) ProtoMessage() {} -func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } +func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } func (m *ISCSIVolumeSource) Reset() { *m = ISCSIVolumeSource{} } func (*ISCSIVolumeSource) ProtoMessage() {} -func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } +func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } func (m *KeyToPath) Reset() { *m = KeyToPath{} } func (*KeyToPath) ProtoMessage() {} -func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } +func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } func (m *Lifecycle) Reset() { *m = Lifecycle{} } func (*Lifecycle) ProtoMessage() {} -func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } +func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } func (m *LimitRange) Reset() { *m = LimitRange{} } func (*LimitRange) ProtoMessage() {} -func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } +func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } func (m *LimitRangeItem) Reset() { *m = LimitRangeItem{} } func (*LimitRangeItem) ProtoMessage() {} -func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } +func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } func (m *LimitRangeList) Reset() { *m = LimitRangeList{} } func (*LimitRangeList) ProtoMessage() {} -func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } +func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } func (m *LimitRangeSpec) Reset() { *m = LimitRangeSpec{} } func (*LimitRangeSpec) ProtoMessage() {} -func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } +func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} -func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } +func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } func (m *ListOptions) Reset() { *m = ListOptions{} } func (*ListOptions) ProtoMessage() {} -func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } +func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } func (m *LoadBalancerIngress) Reset() { *m = LoadBalancerIngress{} } func (*LoadBalancerIngress) ProtoMessage() {} -func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } +func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } func (m *LoadBalancerStatus) Reset() { *m = LoadBalancerStatus{} } func (*LoadBalancerStatus) ProtoMessage() {} -func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } +func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } func (m *LocalObjectReference) Reset() { *m = LocalObjectReference{} } func (*LocalObjectReference) ProtoMessage() {} -func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } +func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } func (m *LocalVolumeSource) Reset() { *m = LocalVolumeSource{} } func (*LocalVolumeSource) ProtoMessage() {} -func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } +func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } func (m *NFSVolumeSource) Reset() { *m = NFSVolumeSource{} } func (*NFSVolumeSource) ProtoMessage() {} -func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } +func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } func (m *Namespace) Reset() { *m = Namespace{} } func (*Namespace) ProtoMessage() {} -func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} } +func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } func (m *NamespaceList) Reset() { *m = NamespaceList{} } func (*NamespaceList) ProtoMessage() {} -func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} } +func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (*NamespaceSpec) ProtoMessage() {} -func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} } +func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } func (m *NamespaceStatus) Reset() { *m = NamespaceStatus{} } func (*NamespaceStatus) ProtoMessage() {} -func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} } +func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } func (m *Node) Reset() { *m = Node{} } func (*Node) ProtoMessage() {} -func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} } +func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (*NodeAddress) ProtoMessage() {} -func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} } +func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } func (m *NodeAffinity) Reset() { *m = NodeAffinity{} } func (*NodeAffinity) ProtoMessage() {} -func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} } +func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} -func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} } +func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} } func (*NodeConfigSource) ProtoMessage() {} -func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} } +func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} -func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} } +func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} -func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} } +func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} -func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} } +func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } func (m *NodeResources) Reset() { *m = NodeResources{} } func (*NodeResources) ProtoMessage() {} -func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} } +func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} -func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } +func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{86} + return fileDescriptorGenerated, []int{87} } func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} -func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } +func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} -func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } +func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} -func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } +func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} -func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } +func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} -func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } +func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } func (*ObjectMeta) ProtoMessage() {} -func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } +func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} -func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } +func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} -func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } +func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} } func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} -func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} } +func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} } func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{96} + return fileDescriptorGenerated, []int{97} } func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{97} + return fileDescriptorGenerated, []int{98} } func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{98} + return fileDescriptorGenerated, []int{99} } func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{99} + return fileDescriptorGenerated, []int{100} } func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} -func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} } +func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{101} } func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{101} + return fileDescriptorGenerated, []int{102} } func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} -func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{102} } +func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{103} } func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{103} + return fileDescriptorGenerated, []int{104} } func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{104} + return fileDescriptorGenerated, []int{105} } func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} -func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{105} } +func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} -func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} } +func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} -func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} } +func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} -func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} } +func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} -func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} } +func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} -func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{110} } +func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} -func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} } +func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} -func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} } +func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} -func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} } +func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} -func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} } +func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} -func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} } +func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} -func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} } +func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} -func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} } +func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} -func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} } +func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} -func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} } +func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} -func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} } +func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} -func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} } +func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} -func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} } +func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} -func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } +func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} -func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } +func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} -func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } +func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{127} + return fileDescriptorGenerated, []int{128} } func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} -func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } +func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} -func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } +func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} -func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } +func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} -func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } +func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} -func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } +func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} -func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } +func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} } func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{134} + return fileDescriptorGenerated, []int{135} } func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{135} + return fileDescriptorGenerated, []int{136} } func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{136} + return fileDescriptorGenerated, []int{137} } func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{137} + return fileDescriptorGenerated, []int{138} } func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} -func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } +func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} -func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } +func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} -func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} -func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} -func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} -func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} -func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} -func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} -func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } + +func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } +func (*SessionAffinityConfig) ProtoMessage() {} +func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{163} + return fileDescriptorGenerated, []int{165} } func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} -func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } +func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{173} + return fileDescriptorGenerated, []int{175} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{174} + return fileDescriptorGenerated, []int{176} } func init() { @@ -988,6 +998,7 @@ func init() { proto.RegisterType((*CephFSPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CephFSPersistentVolumeSource") proto.RegisterType((*CephFSVolumeSource)(nil), "k8s.io.api.core.v1.CephFSVolumeSource") proto.RegisterType((*CinderVolumeSource)(nil), "k8s.io.api.core.v1.CinderVolumeSource") + proto.RegisterType((*ClientIPConfig)(nil), "k8s.io.api.core.v1.ClientIPConfig") proto.RegisterType((*ComponentCondition)(nil), "k8s.io.api.core.v1.ComponentCondition") proto.RegisterType((*ComponentStatus)(nil), "k8s.io.api.core.v1.ComponentStatus") proto.RegisterType((*ComponentStatusList)(nil), "k8s.io.api.core.v1.ComponentStatusList") @@ -1139,6 +1150,7 @@ func init() { proto.RegisterType((*ServiceProxyOptions)(nil), "k8s.io.api.core.v1.ServiceProxyOptions") proto.RegisterType((*ServiceSpec)(nil), "k8s.io.api.core.v1.ServiceSpec") proto.RegisterType((*ServiceStatus)(nil), "k8s.io.api.core.v1.ServiceStatus") + proto.RegisterType((*SessionAffinityConfig)(nil), "k8s.io.api.core.v1.SessionAffinityConfig") proto.RegisterType((*StorageOSPersistentVolumeSource)(nil), "k8s.io.api.core.v1.StorageOSPersistentVolumeSource") proto.RegisterType((*StorageOSVolumeSource)(nil), "k8s.io.api.core.v1.StorageOSVolumeSource") proto.RegisterType((*Sysctl)(nil), "k8s.io.api.core.v1.Sysctl") @@ -1663,6 +1675,29 @@ func (m *CinderVolumeSource) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *ClientIPConfig) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ClientIPConfig) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.TimeoutSeconds != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) + } + return i, nil +} + func (m *ComponentCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8975,6 +9010,16 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0 } i++ + if m.SessionAffinityConfig != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.SessionAffinityConfig.Size())) + n181, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n181 + } return i, nil } @@ -8996,11 +9041,39 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size())) - n181, err := m.LoadBalancer.MarshalTo(dAtA[i:]) + n182, err := m.LoadBalancer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n181 + i += n182 + return i, nil +} + +func (m *SessionAffinityConfig) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SessionAffinityConfig) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ClientIP != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ClientIP.Size())) + n183, err := m.ClientIP.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n183 + } return i, nil } @@ -9043,11 +9116,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n182, err := m.SecretRef.MarshalTo(dAtA[i:]) + n184, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n182 + i += n184 } return i, nil } @@ -9091,11 +9164,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n183, err := m.SecretRef.MarshalTo(dAtA[i:]) + n185, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n183 + i += n185 } return i, nil } @@ -9144,11 +9217,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n184, err := m.Port.MarshalTo(dAtA[i:]) + n186, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n184 + i += n186 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -9186,11 +9259,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size())) - n185, err := m.TimeAdded.MarshalTo(dAtA[i:]) + n187, err := m.TimeAdded.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n185 + i += n187 return i, nil } @@ -9255,11 +9328,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size())) - n186, err := m.VolumeSource.MarshalTo(dAtA[i:]) + n188, err := m.VolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n186 + i += n188 return i, nil } @@ -9320,31 +9393,31 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n187, err := m.Secret.MarshalTo(dAtA[i:]) + n189, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n187 + i += n189 } if m.DownwardAPI != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n188, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n190, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n188 + i += n190 } if m.ConfigMap != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n189, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n191, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n189 + i += n191 } return i, nil } @@ -9368,151 +9441,151 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n190, err := m.HostPath.MarshalTo(dAtA[i:]) + n192, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n190 + i += n192 } if m.EmptyDir != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) - n191, err := m.EmptyDir.MarshalTo(dAtA[i:]) + n193, err := m.EmptyDir.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n191 + i += n193 } if m.GCEPersistentDisk != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n192, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + n194, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n192 + i += n194 } if m.AWSElasticBlockStore != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n193, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + n195, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n193 + i += n195 } if m.GitRepo != nil { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) - n194, err := m.GitRepo.MarshalTo(dAtA[i:]) + n196, err := m.GitRepo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n194 + i += n196 } if m.Secret != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n195, err := m.Secret.MarshalTo(dAtA[i:]) + n197, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n195 + i += n197 } if m.NFS != nil { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n196, err := m.NFS.MarshalTo(dAtA[i:]) + n198, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n196 + i += n198 } if m.ISCSI != nil { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n197, err := m.ISCSI.MarshalTo(dAtA[i:]) + n199, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n197 + i += n199 } if m.Glusterfs != nil { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n198, err := m.Glusterfs.MarshalTo(dAtA[i:]) + n200, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n198 + i += n200 } if m.PersistentVolumeClaim != nil { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) - n199, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) + n201, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n199 + i += n201 } if m.RBD != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n200, err := m.RBD.MarshalTo(dAtA[i:]) + n202, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n200 + i += n202 } if m.FlexVolume != nil { dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n201, err := m.FlexVolume.MarshalTo(dAtA[i:]) + n203, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n201 + i += n203 } if m.Cinder != nil { dAtA[i] = 0x6a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n202, err := m.Cinder.MarshalTo(dAtA[i:]) + n204, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n202 + i += n204 } if m.CephFS != nil { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n203, err := m.CephFS.MarshalTo(dAtA[i:]) + n205, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n203 + i += n205 } if m.Flocker != nil { dAtA[i] = 0x7a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n204, err := m.Flocker.MarshalTo(dAtA[i:]) + n206, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n204 + i += n206 } if m.DownwardAPI != nil { dAtA[i] = 0x82 @@ -9520,11 +9593,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n205, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n207, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n205 + i += n207 } if m.FC != nil { dAtA[i] = 0x8a @@ -9532,11 +9605,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n206, err := m.FC.MarshalTo(dAtA[i:]) + n208, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n206 + i += n208 } if m.AzureFile != nil { dAtA[i] = 0x92 @@ -9544,11 +9617,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n207, err := m.AzureFile.MarshalTo(dAtA[i:]) + n209, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n207 + i += n209 } if m.ConfigMap != nil { dAtA[i] = 0x9a @@ -9556,11 +9629,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n208, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n210, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n208 + i += n210 } if m.VsphereVolume != nil { dAtA[i] = 0xa2 @@ -9568,11 +9641,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n209, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n211, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n209 + i += n211 } if m.Quobyte != nil { dAtA[i] = 0xaa @@ -9580,11 +9653,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n210, err := m.Quobyte.MarshalTo(dAtA[i:]) + n212, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n210 + i += n212 } if m.AzureDisk != nil { dAtA[i] = 0xb2 @@ -9592,11 +9665,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n211, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n213, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n211 + i += n213 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0xba @@ -9604,11 +9677,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n212, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n214, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n212 + i += n214 } if m.PortworxVolume != nil { dAtA[i] = 0xc2 @@ -9616,11 +9689,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n213, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n215, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n213 + i += n215 } if m.ScaleIO != nil { dAtA[i] = 0xca @@ -9628,11 +9701,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n214, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n216, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n214 + i += n216 } if m.Projected != nil { dAtA[i] = 0xd2 @@ -9640,11 +9713,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size())) - n215, err := m.Projected.MarshalTo(dAtA[i:]) + n217, err := m.Projected.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n215 + i += n217 } if m.StorageOS != nil { dAtA[i] = 0xda @@ -9652,11 +9725,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n216, err := m.StorageOS.MarshalTo(dAtA[i:]) + n218, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n216 + i += n218 } return i, nil } @@ -9716,11 +9789,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size())) - n217, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) + n219, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n217 + i += n219 return i, nil } @@ -9939,6 +10012,15 @@ func (m *CinderVolumeSource) Size() (n int) { return n } +func (m *ClientIPConfig) Size() (n int) { + var l int + _ = l + if m.TimeoutSeconds != nil { + n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) + } + return n +} + func (m *ComponentCondition) Size() (n int) { var l int _ = l @@ -12582,6 +12664,10 @@ func (m *ServiceSpec) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) n += 1 + sovGenerated(uint64(m.HealthCheckNodePort)) n += 2 + if m.SessionAffinityConfig != nil { + l = m.SessionAffinityConfig.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -12593,6 +12679,16 @@ func (m *ServiceStatus) Size() (n int) { return n } +func (m *SessionAffinityConfig) Size() (n int) { + var l int + _ = l + if m.ClientIP != nil { + l = m.ClientIP.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *StorageOSPersistentVolumeSource) Size() (n int) { var l int _ = l @@ -13019,6 +13115,16 @@ func (this *CinderVolumeSource) String() string { }, "") return s } +func (this *ClientIPConfig) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClientIPConfig{`, + `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, + `}`, + }, "") + return s +} func (this *ComponentCondition) String() string { if this == nil { return "nil" @@ -15169,6 +15275,7 @@ func (this *ServiceSpec) String() string { `ExternalTrafficPolicy:` + fmt.Sprintf("%v", this.ExternalTrafficPolicy) + `,`, `HealthCheckNodePort:` + fmt.Sprintf("%v", this.HealthCheckNodePort) + `,`, `PublishNotReadyAddresses:` + fmt.Sprintf("%v", this.PublishNotReadyAddresses) + `,`, + `SessionAffinityConfig:` + strings.Replace(fmt.Sprintf("%v", this.SessionAffinityConfig), "SessionAffinityConfig", "SessionAffinityConfig", 1) + `,`, `}`, }, "") return s @@ -15183,6 +15290,16 @@ func (this *ServiceStatus) String() string { }, "") return s } +func (this *SessionAffinityConfig) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SessionAffinityConfig{`, + `ClientIP:` + strings.Replace(fmt.Sprintf("%v", this.ClientIP), "ClientIPConfig", "ClientIPConfig", 1) + `,`, + `}`, + }, "") + return s +} func (this *StorageOSPersistentVolumeSource) String() string { if this == nil { return "nil" @@ -17138,6 +17255,76 @@ func (m *CinderVolumeSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *ClientIPConfig) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ClientIPConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClientIPConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeoutSeconds", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.TimeoutSeconds = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ComponentCondition) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -42786,6 +42973,39 @@ func (m *ServiceSpec) Unmarshal(dAtA []byte) error { } } m.PublishNotReadyAddresses = bool(v != 0) + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionAffinityConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SessionAffinityConfig == nil { + m.SessionAffinityConfig = &SessionAffinityConfig{} + } + if err := m.SessionAffinityConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -42887,6 +43107,89 @@ func (m *ServiceStatus) Unmarshal(dAtA []byte) error { } return nil } +func (m *SessionAffinityConfig) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SessionAffinityConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SessionAffinityConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientIP", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ClientIP == nil { + m.ClientIP = &ClientIPConfig{} + } + if err := m.ClientIP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *StorageOSPersistentVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -45568,734 +45871,738 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11649 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x90, 0x24, 0xc7, - 0x75, 0x18, 0xcc, 0xea, 0x9e, 0xab, 0xdf, 0xdc, 0xb9, 0x07, 0x7a, 0x07, 0xc0, 0xf6, 0xa2, 0x40, - 0x02, 0x8b, 0x6b, 0x86, 0x58, 0x00, 0x04, 0x44, 0x80, 0x90, 0x66, 0xa6, 0x67, 0x76, 0x07, 0x7b, - 0x35, 0xb2, 0x67, 0x17, 0x02, 0x08, 0x41, 0xac, 0xed, 0xca, 0x99, 0x29, 0x4c, 0x4d, 0x55, 0xa3, - 0xaa, 0x7a, 0x76, 0x07, 0x21, 0x45, 0x7c, 0x1f, 0x4d, 0xd1, 0x07, 0xf5, 0x43, 0xe1, 0x50, 0xd8, - 0xb2, 0xc8, 0x90, 0x23, 0x7c, 0x84, 0x44, 0xcb, 0x76, 0x48, 0xa6, 0xac, 0x83, 0x94, 0xc3, 0xb2, - 0x7c, 0x04, 0xf9, 0x47, 0x96, 0xf4, 0x87, 0x8c, 0x70, 0x78, 0x24, 0x0e, 0x1d, 0x76, 0xe8, 0x87, - 0x1d, 0xb6, 0xf5, 0x4b, 0x63, 0xd9, 0x74, 0xe4, 0x59, 0x99, 0xd5, 0x55, 0xdd, 0x3d, 0x8b, 0xdd, - 0x01, 0xc8, 0xf0, 0xbf, 0xee, 0xf7, 0x5e, 0xbe, 0xcc, 0xca, 0xe3, 0xe5, 0xcb, 0x97, 0xef, 0xbd, - 0x84, 0x97, 0xb7, 0x5f, 0x8a, 0xe7, 0xbd, 0x70, 0x61, 0xbb, 0x73, 0x8b, 0x44, 0x01, 0x49, 0x48, - 0xbc, 0xb0, 0x4b, 0x02, 0x37, 0x8c, 0x16, 0x04, 0xc2, 0x69, 0x7b, 0x0b, 0xad, 0x30, 0x22, 0x0b, - 0xbb, 0xcf, 0x2e, 0x6c, 0x92, 0x80, 0x44, 0x4e, 0x42, 0xdc, 0xf9, 0x76, 0x14, 0x26, 0x21, 0x42, - 0x9c, 0x66, 0xde, 0x69, 0x7b, 0xf3, 0x94, 0x66, 0x7e, 0xf7, 0xd9, 0xb9, 0x67, 0x36, 0xbd, 0x64, - 0xab, 0x73, 0x6b, 0xbe, 0x15, 0xee, 0x2c, 0x6c, 0x86, 0x9b, 0xe1, 0x02, 0x23, 0xbd, 0xd5, 0xd9, - 0x60, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0xb3, 0x98, 0x7b, 0x3e, 0xad, 0x66, 0xc7, 0x69, 0x6d, 0x79, - 0x01, 0x89, 0xf6, 0x16, 0xda, 0xdb, 0x9b, 0xac, 0xde, 0x88, 0xc4, 0x61, 0x27, 0x6a, 0x91, 0x6c, - 0xc5, 0x3d, 0x4b, 0xc5, 0x0b, 0x3b, 0x24, 0x71, 0x72, 0x9a, 0x3b, 0xb7, 0x50, 0x54, 0x2a, 0xea, - 0x04, 0x89, 0xb7, 0xd3, 0x5d, 0xcd, 0xa7, 0xfa, 0x15, 0x88, 0x5b, 0x5b, 0x64, 0xc7, 0xe9, 0x2a, - 0xf7, 0x5c, 0x51, 0xb9, 0x4e, 0xe2, 0xf9, 0x0b, 0x5e, 0x90, 0xc4, 0x49, 0x94, 0x2d, 0x64, 0x7f, - 0xdb, 0x82, 0x73, 0x8b, 0x6f, 0x34, 0x57, 0x7c, 0x27, 0x4e, 0xbc, 0xd6, 0x92, 0x1f, 0xb6, 0xb6, - 0x9b, 0x49, 0x18, 0x91, 0x9b, 0xa1, 0xdf, 0xd9, 0x21, 0x4d, 0xd6, 0x11, 0xe8, 0x69, 0x18, 0xdb, - 0x65, 0xff, 0xd7, 0xea, 0x55, 0xeb, 0x9c, 0x75, 0xbe, 0xb2, 0x34, 0xf3, 0xcd, 0xfd, 0xda, 0xc7, - 0x0e, 0xf6, 0x6b, 0x63, 0x37, 0x05, 0x1c, 0x2b, 0x0a, 0xf4, 0x18, 0x8c, 0x6c, 0xc4, 0xeb, 0x7b, - 0x6d, 0x52, 0x2d, 0x31, 0xda, 0x29, 0x41, 0x3b, 0xb2, 0xda, 0xa4, 0x50, 0x2c, 0xb0, 0x68, 0x01, - 0x2a, 0x6d, 0x27, 0x4a, 0xbc, 0xc4, 0x0b, 0x83, 0x6a, 0xf9, 0x9c, 0x75, 0x7e, 0x78, 0x69, 0x56, - 0x90, 0x56, 0x1a, 0x12, 0x81, 0x53, 0x1a, 0xda, 0x8c, 0x88, 0x38, 0xee, 0xf5, 0xc0, 0xdf, 0xab, - 0x0e, 0x9d, 0xb3, 0xce, 0x8f, 0xa5, 0xcd, 0xc0, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0x8b, 0x25, 0x18, - 0x5b, 0xdc, 0xd8, 0xf0, 0x02, 0x2f, 0xd9, 0x43, 0x37, 0x61, 0x22, 0x08, 0x5d, 0x22, 0xff, 0xb3, - 0xaf, 0x18, 0xbf, 0x70, 0x6e, 0xbe, 0x7b, 0x2a, 0xcd, 0x5f, 0xd3, 0xe8, 0x96, 0x66, 0x0e, 0xf6, - 0x6b, 0x13, 0x3a, 0x04, 0x1b, 0x7c, 0x10, 0x86, 0xf1, 0x76, 0xe8, 0x2a, 0xb6, 0x25, 0xc6, 0xb6, - 0x96, 0xc7, 0xb6, 0x91, 0x92, 0x2d, 0x4d, 0x1f, 0xec, 0xd7, 0xc6, 0x35, 0x00, 0xd6, 0x99, 0xa0, - 0x5b, 0x30, 0x4d, 0xff, 0x06, 0x89, 0xa7, 0xf8, 0x96, 0x19, 0xdf, 0x47, 0x8b, 0xf8, 0x6a, 0xa4, - 0x4b, 0x27, 0x0e, 0xf6, 0x6b, 0xd3, 0x19, 0x20, 0xce, 0x32, 0xb4, 0xdf, 0x87, 0xa9, 0xc5, 0x24, - 0x71, 0x5a, 0x5b, 0xc4, 0xe5, 0x23, 0x88, 0x9e, 0x87, 0xa1, 0xc0, 0xd9, 0x21, 0x62, 0x7c, 0xcf, - 0x89, 0x8e, 0x1d, 0xba, 0xe6, 0xec, 0x90, 0xc3, 0xfd, 0xda, 0xcc, 0x8d, 0xc0, 0x7b, 0xaf, 0x23, - 0x66, 0x05, 0x85, 0x61, 0x46, 0x8d, 0x2e, 0x00, 0xb8, 0x64, 0xd7, 0x6b, 0x91, 0x86, 0x93, 0x6c, - 0x89, 0xf1, 0x46, 0xa2, 0x2c, 0xd4, 0x15, 0x06, 0x6b, 0x54, 0xf6, 0x1d, 0xa8, 0x2c, 0xee, 0x86, - 0x9e, 0xdb, 0x08, 0xdd, 0x18, 0x6d, 0xc3, 0x74, 0x3b, 0x22, 0x1b, 0x24, 0x52, 0xa0, 0xaa, 0x75, - 0xae, 0x7c, 0x7e, 0xfc, 0xc2, 0xf9, 0xdc, 0x8f, 0x35, 0x49, 0x57, 0x82, 0x24, 0xda, 0x5b, 0x7a, - 0x40, 0xd4, 0x37, 0x9d, 0xc1, 0xe2, 0x2c, 0x67, 0xfb, 0xdf, 0x94, 0xe0, 0xd4, 0xe2, 0xfb, 0x9d, - 0x88, 0xd4, 0xbd, 0x78, 0x3b, 0x3b, 0xc3, 0x5d, 0x2f, 0xde, 0xbe, 0x96, 0xf6, 0x80, 0x9a, 0x5a, - 0x75, 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x03, 0xa3, 0xf4, 0xf7, 0x0d, 0xbc, 0x26, 0x3e, 0xf9, 0x84, - 0x20, 0x1e, 0xaf, 0x3b, 0x89, 0x53, 0xe7, 0x28, 0x2c, 0x69, 0xd0, 0x55, 0x18, 0x6f, 0xb1, 0x05, - 0xb9, 0x79, 0x35, 0x74, 0x09, 0x1b, 0xcc, 0xca, 0xd2, 0x53, 0x94, 0x7c, 0x39, 0x05, 0x1f, 0xee, - 0xd7, 0xaa, 0xbc, 0x6d, 0x82, 0x85, 0x86, 0xc3, 0x7a, 0x79, 0x64, 0xab, 0xf5, 0x35, 0xc4, 0x38, - 0x41, 0xce, 0xda, 0x3a, 0xaf, 0x2d, 0x95, 0x61, 0xb6, 0x54, 0x26, 0xf2, 0x97, 0x09, 0x7a, 0x16, - 0x86, 0xb6, 0xbd, 0xc0, 0xad, 0x8e, 0x30, 0x5e, 0x0f, 0xd3, 0x31, 0xbf, 0xec, 0x05, 0xee, 0xe1, - 0x7e, 0x6d, 0xd6, 0x68, 0x0e, 0x05, 0x62, 0x46, 0x6a, 0xff, 0xb9, 0x05, 0x35, 0x86, 0x5b, 0xf5, - 0x7c, 0xd2, 0x20, 0x51, 0xec, 0xc5, 0x09, 0x09, 0x12, 0xa3, 0x43, 0x2f, 0x00, 0xc4, 0xa4, 0x15, - 0x91, 0x44, 0xeb, 0x52, 0x35, 0x31, 0x9a, 0x0a, 0x83, 0x35, 0x2a, 0x2a, 0x10, 0xe2, 0x2d, 0x27, - 0x62, 0xf3, 0x4b, 0x74, 0xac, 0x12, 0x08, 0x4d, 0x89, 0xc0, 0x29, 0x8d, 0x21, 0x10, 0xca, 0xfd, - 0x04, 0x02, 0xfa, 0x0c, 0x4c, 0xa7, 0x95, 0xc5, 0x6d, 0xa7, 0x25, 0x3b, 0x90, 0x2d, 0x99, 0xa6, - 0x89, 0xc2, 0x59, 0x5a, 0xfb, 0x1f, 0x59, 0x62, 0xf2, 0xd0, 0xaf, 0xfe, 0x88, 0x7f, 0xab, 0xfd, - 0xdb, 0x16, 0x8c, 0x2e, 0x79, 0x81, 0xeb, 0x05, 0x9b, 0xe8, 0x73, 0x30, 0x46, 0xf7, 0x26, 0xd7, - 0x49, 0x1c, 0x21, 0xf7, 0x3e, 0xa9, 0xad, 0x2d, 0xb5, 0x55, 0xcc, 0xb7, 0xb7, 0x37, 0x29, 0x20, - 0x9e, 0xa7, 0xd4, 0x74, 0xb5, 0x5d, 0xbf, 0xf5, 0x2e, 0x69, 0x25, 0x57, 0x49, 0xe2, 0xa4, 0x9f, - 0x93, 0xc2, 0xb0, 0xe2, 0x8a, 0x2e, 0xc3, 0x48, 0xe2, 0x44, 0x9b, 0x24, 0x11, 0x02, 0x30, 0x57, - 0x50, 0xf1, 0x92, 0x98, 0xae, 0x48, 0x12, 0xb4, 0x48, 0xba, 0x2d, 0xac, 0xb3, 0xa2, 0x58, 0xb0, - 0xb0, 0x5b, 0x30, 0xb1, 0xec, 0xb4, 0x9d, 0x5b, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0xd1, 0xe3, 0x50, - 0x76, 0x5c, 0x97, 0x49, 0x85, 0xca, 0xd2, 0xa9, 0x83, 0xfd, 0x5a, 0x79, 0xd1, 0xa5, 0xd3, 0x13, - 0x14, 0xd5, 0x1e, 0xa6, 0x14, 0xe8, 0x49, 0x18, 0x72, 0xa3, 0xb0, 0x5d, 0x2d, 0x31, 0xca, 0xd3, - 0x74, 0x26, 0xd7, 0xa3, 0xb0, 0x9d, 0x21, 0x65, 0x34, 0xf6, 0xef, 0x95, 0xe0, 0xa1, 0x65, 0xd2, - 0xde, 0x5a, 0x6d, 0x16, 0xcc, 0xdf, 0xf3, 0x30, 0xb6, 0x13, 0x06, 0x5e, 0x12, 0x46, 0xb1, 0xa8, - 0x9a, 0x2d, 0xa0, 0xab, 0x02, 0x86, 0x15, 0x16, 0x9d, 0x83, 0xa1, 0x76, 0x2a, 0xfc, 0x26, 0xa4, - 0xe0, 0x64, 0x62, 0x8f, 0x61, 0x28, 0x45, 0x27, 0x26, 0x91, 0x58, 0xf8, 0x8a, 0xe2, 0x46, 0x4c, - 0x22, 0xcc, 0x30, 0xe9, 0x0c, 0xa2, 0x73, 0x4b, 0xcc, 0xca, 0xcc, 0x0c, 0xa2, 0x18, 0xac, 0x51, - 0xa1, 0x06, 0x54, 0xf8, 0x3f, 0x4c, 0x36, 0xd8, 0x1a, 0x2f, 0xe8, 0xf7, 0xa6, 0x24, 0x12, 0xfd, - 0x3e, 0xc9, 0xa6, 0x98, 0x04, 0xe2, 0x94, 0x89, 0x31, 0xc5, 0x46, 0xfa, 0x4e, 0xb1, 0x6f, 0x94, - 0x00, 0xf1, 0x2e, 0xfc, 0x01, 0xeb, 0xb8, 0x1b, 0xdd, 0x1d, 0x97, 0xbb, 0xd9, 0x5c, 0x09, 0x5b, - 0x8e, 0x9f, 0x9d, 0xb5, 0xf7, 0xaa, 0xf7, 0x7e, 0xc1, 0x02, 0xb4, 0xec, 0x05, 0x2e, 0x89, 0x8e, - 0x41, 0xd3, 0x3a, 0x9a, 0xec, 0xf8, 0x0f, 0xb4, 0x69, 0xe1, 0x4e, 0x3b, 0x0c, 0x48, 0x90, 0x2c, - 0x87, 0x81, 0xcb, 0xb5, 0xaf, 0x4f, 0xc3, 0x50, 0x42, 0xab, 0xe2, 0xcd, 0x7a, 0x4c, 0x0e, 0x06, - 0xad, 0xe0, 0x70, 0xbf, 0x76, 0xba, 0xbb, 0x04, 0x6b, 0x02, 0x2b, 0x83, 0x7e, 0x04, 0x46, 0xe2, - 0xc4, 0x49, 0x3a, 0xb1, 0x68, 0xe8, 0x23, 0xb2, 0xa1, 0x4d, 0x06, 0x3d, 0xdc, 0xaf, 0x4d, 0xab, - 0x62, 0x1c, 0x84, 0x45, 0x01, 0xf4, 0x04, 0x8c, 0xee, 0x90, 0x38, 0x76, 0x36, 0xe5, 0xc6, 0x39, - 0x2d, 0xca, 0x8e, 0x5e, 0xe5, 0x60, 0x2c, 0xf1, 0xe8, 0x51, 0x18, 0x26, 0x51, 0x14, 0x46, 0x62, - 0x1e, 0x4c, 0x0a, 0xc2, 0xe1, 0x15, 0x0a, 0xc4, 0x1c, 0x67, 0xff, 0x7b, 0x0b, 0xa6, 0x55, 0x5b, - 0x79, 0x5d, 0xc7, 0x20, 0x21, 0xdf, 0x02, 0x68, 0xc9, 0x0f, 0x8c, 0x99, 0x84, 0x1a, 0xbf, 0xf0, - 0x58, 0xde, 0xa4, 0xeb, 0xee, 0xc6, 0x94, 0xb3, 0x02, 0xc5, 0x58, 0xe3, 0x66, 0xff, 0x0b, 0x0b, - 0x4e, 0x64, 0xbe, 0xe8, 0x8a, 0x17, 0x27, 0xe8, 0xed, 0xae, 0xaf, 0x9a, 0x1f, 0xec, 0xab, 0x68, - 0x69, 0xf6, 0x4d, 0x6a, 0x96, 0x48, 0x88, 0xf6, 0x45, 0x97, 0x60, 0xd8, 0x4b, 0xc8, 0x8e, 0xfc, - 0x98, 0x47, 0x7b, 0x7e, 0x0c, 0x6f, 0x55, 0x3a, 0x22, 0x6b, 0xb4, 0x24, 0xe6, 0x0c, 0xec, 0xff, - 0x61, 0x41, 0x65, 0x39, 0x0c, 0x36, 0xbc, 0xcd, 0xab, 0x4e, 0xfb, 0x18, 0xc6, 0x62, 0x0d, 0x86, - 0x18, 0x77, 0xde, 0xf0, 0xc7, 0xf3, 0x1b, 0x2e, 0x9a, 0x33, 0x4f, 0xd5, 0x1f, 0xae, 0x66, 0x2a, - 0xf1, 0x43, 0x41, 0x98, 0xb1, 0x98, 0x7b, 0x11, 0x2a, 0x8a, 0x00, 0xcd, 0x40, 0x79, 0x9b, 0xf0, - 0xa3, 0x45, 0x05, 0xd3, 0x9f, 0xe8, 0x24, 0x0c, 0xef, 0x3a, 0x7e, 0x47, 0x2c, 0x4f, 0xcc, 0xff, - 0x7c, 0xba, 0xf4, 0x92, 0x65, 0x7f, 0x9d, 0xad, 0x31, 0x51, 0xc9, 0x4a, 0xb0, 0x2b, 0x96, 0xff, - 0xfb, 0x70, 0xd2, 0xcf, 0x91, 0x3a, 0xa2, 0x23, 0x06, 0x97, 0x52, 0x0f, 0x89, 0xb6, 0x9e, 0xcc, - 0xc3, 0xe2, 0xdc, 0x3a, 0xa8, 0xe0, 0x0e, 0xdb, 0x74, 0x46, 0x39, 0x3e, 0x6b, 0xaf, 0x50, 0x19, - 0xaf, 0x0b, 0x18, 0x56, 0x58, 0x2a, 0x20, 0x4e, 0xaa, 0xc6, 0x5f, 0x26, 0x7b, 0x4d, 0xe2, 0x93, - 0x56, 0x12, 0x46, 0x1f, 0x6a, 0xf3, 0x1f, 0xe6, 0xbd, 0xcf, 0xe5, 0xcb, 0xb8, 0x60, 0x50, 0xbe, - 0x4c, 0xf6, 0xf8, 0x50, 0xe8, 0x5f, 0x57, 0xee, 0xf9, 0x75, 0xbf, 0x6e, 0xc1, 0xa4, 0xfa, 0xba, - 0x63, 0x58, 0x48, 0x4b, 0xe6, 0x42, 0x7a, 0xb8, 0xe7, 0x7c, 0x2c, 0x58, 0x42, 0xdf, 0x67, 0x22, - 0x40, 0xd0, 0x34, 0xa2, 0x90, 0x76, 0x0d, 0x95, 0xd9, 0x1f, 0xe6, 0x80, 0x0c, 0xf2, 0x5d, 0x97, - 0xc9, 0xde, 0x7a, 0x48, 0x37, 0xfc, 0xfc, 0xef, 0x32, 0x46, 0x6d, 0xa8, 0xe7, 0xa8, 0xfd, 0x46, - 0x09, 0x4e, 0xa9, 0x1e, 0x30, 0xb6, 0xd4, 0x1f, 0xf4, 0x3e, 0x78, 0x16, 0xc6, 0x5d, 0xb2, 0xe1, - 0x74, 0xfc, 0x44, 0x9d, 0x1e, 0x87, 0xb9, 0x05, 0xa1, 0x9e, 0x82, 0xb1, 0x4e, 0x73, 0x84, 0x6e, - 0xfb, 0xb7, 0xc0, 0x64, 0x6f, 0xe2, 0xd0, 0x19, 0x4c, 0xf5, 0x2d, 0xcd, 0x06, 0x30, 0xa1, 0xdb, - 0x00, 0xc4, 0x79, 0xff, 0x51, 0x18, 0xf6, 0x76, 0xe8, 0x5e, 0x5c, 0x32, 0xb7, 0xd8, 0x35, 0x0a, - 0xc4, 0x1c, 0x87, 0x3e, 0x01, 0xa3, 0xad, 0x70, 0x67, 0xc7, 0x09, 0xdc, 0x6a, 0x99, 0x69, 0x80, - 0xe3, 0x74, 0xbb, 0x5e, 0xe6, 0x20, 0x2c, 0x71, 0xe8, 0x21, 0x18, 0x72, 0xa2, 0xcd, 0xb8, 0x3a, - 0xc4, 0x68, 0xc6, 0x68, 0x4d, 0x8b, 0xd1, 0x66, 0x8c, 0x19, 0x94, 0x6a, 0x76, 0xb7, 0xc3, 0x68, - 0xdb, 0x0b, 0x36, 0xeb, 0x5e, 0xc4, 0xd4, 0x34, 0x4d, 0xb3, 0x7b, 0x43, 0x61, 0xb0, 0x46, 0x85, - 0x56, 0x61, 0xb8, 0x1d, 0x46, 0x49, 0x5c, 0x1d, 0x61, 0xdd, 0xfd, 0x48, 0xc1, 0x52, 0xe2, 0x5f, - 0xdb, 0x08, 0xa3, 0x24, 0xfd, 0x00, 0xfa, 0x2f, 0xc6, 0xbc, 0x38, 0xfa, 0x11, 0x28, 0x93, 0x60, - 0xb7, 0x3a, 0xca, 0xb8, 0xcc, 0xe5, 0x71, 0x59, 0x09, 0x76, 0x6f, 0x3a, 0x51, 0x2a, 0x67, 0x56, - 0x82, 0x5d, 0x4c, 0xcb, 0xa0, 0x37, 0xa1, 0x22, 0xed, 0x87, 0x71, 0x75, 0xac, 0x78, 0x8a, 0x61, - 0x41, 0x84, 0xc9, 0x7b, 0x1d, 0x2f, 0x22, 0x3b, 0x24, 0x48, 0xe2, 0xf4, 0x04, 0x28, 0xb1, 0x31, - 0x4e, 0xb9, 0xa1, 0x37, 0x61, 0x82, 0x6b, 0x7e, 0x57, 0xc3, 0x4e, 0x90, 0xc4, 0xd5, 0x0a, 0x6b, - 0x5e, 0xae, 0xb1, 0xe9, 0x66, 0x4a, 0xb7, 0x74, 0x52, 0x30, 0x9d, 0xd0, 0x80, 0x31, 0x36, 0x58, - 0x21, 0x0c, 0x93, 0xbe, 0xb7, 0x4b, 0x02, 0x12, 0xc7, 0x8d, 0x28, 0xbc, 0x45, 0xaa, 0xc0, 0x5a, - 0x7e, 0x26, 0xdf, 0x06, 0x13, 0xde, 0x22, 0x4b, 0xb3, 0x07, 0xfb, 0xb5, 0xc9, 0x2b, 0x7a, 0x19, - 0x6c, 0xb2, 0x40, 0x37, 0x60, 0x8a, 0xaa, 0x94, 0x5e, 0xca, 0x74, 0xbc, 0x1f, 0x53, 0x74, 0xb0, - 0x5f, 0x9b, 0xc2, 0x46, 0x21, 0x9c, 0x61, 0x82, 0x5e, 0x83, 0x8a, 0xef, 0x6d, 0x90, 0xd6, 0x5e, - 0xcb, 0x27, 0xd5, 0x09, 0xc6, 0x31, 0x77, 0x59, 0x5d, 0x91, 0x44, 0x5c, 0x65, 0x57, 0x7f, 0x71, - 0x5a, 0x1c, 0xdd, 0x84, 0xd3, 0x09, 0x89, 0x76, 0xbc, 0xc0, 0xa1, 0xcb, 0x41, 0xe8, 0x93, 0xcc, - 0x92, 0x35, 0xc9, 0xe6, 0xdb, 0x59, 0xd1, 0x75, 0xa7, 0xd7, 0x73, 0xa9, 0x70, 0x41, 0x69, 0x74, - 0x1d, 0xa6, 0xd9, 0x4a, 0x68, 0x74, 0x7c, 0xbf, 0x11, 0xfa, 0x5e, 0x6b, 0xaf, 0x3a, 0xc5, 0x18, - 0x7e, 0x42, 0x9a, 0xaa, 0xd6, 0x4c, 0x34, 0x3d, 0xa3, 0xa6, 0xff, 0x70, 0xb6, 0x34, 0xba, 0xc5, - 0x4c, 0x17, 0x9d, 0xc8, 0x4b, 0xf6, 0xe8, 0xfc, 0x25, 0x77, 0x92, 0xea, 0x74, 0xcf, 0x13, 0x9f, - 0x4e, 0xaa, 0xec, 0x1b, 0x3a, 0x10, 0x67, 0x19, 0xd2, 0xa5, 0x1d, 0x27, 0xae, 0x17, 0x54, 0x67, - 0x98, 0xc4, 0x50, 0x2b, 0xa3, 0x49, 0x81, 0x98, 0xe3, 0x98, 0xd9, 0x82, 0xfe, 0xb8, 0x4e, 0x25, - 0xe8, 0x2c, 0x23, 0x4c, 0xcd, 0x16, 0x12, 0x81, 0x53, 0x1a, 0xba, 0x2d, 0x27, 0xc9, 0x5e, 0x15, - 0x31, 0x52, 0xb5, 0x5c, 0xd6, 0xd7, 0xdf, 0xc4, 0x14, 0x8e, 0xae, 0xc0, 0x28, 0x09, 0x76, 0x57, - 0xa3, 0x70, 0xa7, 0x7a, 0xa2, 0x78, 0xcd, 0xae, 0x70, 0x12, 0x2e, 0xd0, 0xd3, 0x03, 0x80, 0x00, - 0x63, 0xc9, 0x02, 0xdd, 0x81, 0x6a, 0xce, 0x88, 0xf0, 0x01, 0x38, 0xc9, 0x06, 0xe0, 0x15, 0x51, - 0xb6, 0xba, 0x5e, 0x40, 0x77, 0xd8, 0x03, 0x87, 0x0b, 0xb9, 0xdb, 0xb7, 0x60, 0x4a, 0x09, 0x16, - 0x36, 0xb6, 0xa8, 0x06, 0xc3, 0x54, 0x62, 0xca, 0x43, 0x70, 0x85, 0x76, 0x25, 0x33, 0x26, 0x61, - 0x0e, 0x67, 0x5d, 0xe9, 0xbd, 0x4f, 0x96, 0xf6, 0x12, 0xc2, 0x8f, 0x45, 0x65, 0xad, 0x2b, 0x25, - 0x02, 0xa7, 0x34, 0xf6, 0xff, 0xe1, 0x8a, 0x49, 0x2a, 0xbd, 0x06, 0x90, 0xd7, 0x4f, 0xc3, 0xd8, - 0x56, 0x18, 0x27, 0x94, 0x9a, 0xd5, 0x31, 0x9c, 0xaa, 0x22, 0x97, 0x04, 0x1c, 0x2b, 0x0a, 0xf4, - 0x32, 0x4c, 0xb6, 0xf4, 0x0a, 0xc4, 0x66, 0x73, 0x4a, 0x14, 0x31, 0x6b, 0xc7, 0x26, 0x2d, 0x7a, - 0x09, 0xc6, 0xd8, 0x95, 0x42, 0x2b, 0xf4, 0xc5, 0x01, 0x4c, 0xee, 0x98, 0x63, 0x0d, 0x01, 0x3f, - 0xd4, 0x7e, 0x63, 0x45, 0x4d, 0x8f, 0xb1, 0xb4, 0x09, 0x6b, 0x0d, 0x21, 0xe6, 0xd5, 0x31, 0xf6, - 0x12, 0x83, 0x62, 0x81, 0xb5, 0xff, 0x66, 0x49, 0xeb, 0x65, 0x7a, 0xa4, 0x20, 0xa8, 0x01, 0xa3, - 0xb7, 0x1d, 0x2f, 0xf1, 0x82, 0x4d, 0xb1, 0x9f, 0x3f, 0xd1, 0x53, 0xe6, 0xb3, 0x42, 0x6f, 0xf0, - 0x02, 0x7c, 0x57, 0x12, 0x7f, 0xb0, 0x64, 0x43, 0x39, 0x46, 0x9d, 0x20, 0xa0, 0x1c, 0x4b, 0x83, - 0x72, 0xc4, 0xbc, 0x00, 0xe7, 0x28, 0xfe, 0x60, 0xc9, 0x06, 0xbd, 0x0d, 0x20, 0xe7, 0x0d, 0x71, - 0x85, 0x29, 0xff, 0xe9, 0xfe, 0x4c, 0xd7, 0x55, 0x99, 0xa5, 0x29, 0xba, 0xe7, 0xa5, 0xff, 0xb1, - 0xc6, 0xcf, 0x4e, 0x98, 0xde, 0xd3, 0xdd, 0x18, 0xf4, 0x59, 0xba, 0x54, 0x9d, 0x28, 0x21, 0xee, - 0x62, 0x22, 0x3a, 0xe7, 0xc9, 0xc1, 0xd4, 0xd6, 0x75, 0x6f, 0x87, 0xe8, 0xcb, 0x5a, 0x30, 0xc1, - 0x29, 0x3f, 0xfb, 0xb7, 0xca, 0x50, 0x2d, 0x6a, 0x2e, 0x9d, 0x74, 0xe4, 0x8e, 0x97, 0x2c, 0x53, - 0x75, 0xc5, 0x32, 0x27, 0xdd, 0x8a, 0x80, 0x63, 0x45, 0x41, 0x47, 0x3f, 0xf6, 0x36, 0xe5, 0xa9, - 0x63, 0x38, 0x1d, 0xfd, 0x26, 0x83, 0x62, 0x81, 0xa5, 0x74, 0x11, 0x71, 0x62, 0x71, 0x57, 0xa4, - 0xcd, 0x12, 0xcc, 0xa0, 0x58, 0x60, 0x75, 0x83, 0xc1, 0x50, 0x1f, 0x83, 0x81, 0xd1, 0x45, 0xc3, - 0xf7, 0xb6, 0x8b, 0xd0, 0x3b, 0x00, 0x1b, 0x5e, 0xe0, 0xc5, 0x5b, 0x8c, 0xfb, 0xc8, 0x91, 0xb9, - 0x2b, 0x65, 0x67, 0x55, 0x71, 0xc1, 0x1a, 0x47, 0xf4, 0x02, 0x8c, 0xab, 0x05, 0xb8, 0x56, 0xaf, - 0x8e, 0x9a, 0x17, 0x11, 0xa9, 0x34, 0xaa, 0x63, 0x9d, 0xce, 0x7e, 0x37, 0x3b, 0x5f, 0xc4, 0x0a, - 0xd0, 0xfa, 0xd7, 0x1a, 0xb4, 0x7f, 0x4b, 0xbd, 0xfb, 0xd7, 0xfe, 0xfd, 0x32, 0x4c, 0x1b, 0x95, - 0x75, 0xe2, 0x01, 0x64, 0xd6, 0x45, 0xba, 0x11, 0x39, 0x09, 0x11, 0xeb, 0xcf, 0xee, 0xbf, 0x54, - 0xf4, 0xcd, 0x8a, 0xae, 0x00, 0x5e, 0x1e, 0xbd, 0x03, 0x15, 0xdf, 0x89, 0x99, 0xf1, 0x81, 0x88, - 0x75, 0x37, 0x08, 0xb3, 0x54, 0xd1, 0x77, 0xe2, 0x44, 0xdb, 0x0b, 0x38, 0xef, 0x94, 0x25, 0xdd, - 0x31, 0xa9, 0x72, 0x22, 0x2f, 0x23, 0x55, 0x23, 0xa8, 0x06, 0xb3, 0x87, 0x39, 0x0e, 0xbd, 0x04, - 0x13, 0x11, 0x61, 0xb3, 0x62, 0x99, 0xea, 0x5a, 0x6c, 0x9a, 0x0d, 0xa7, 0x4a, 0x19, 0xd6, 0x70, - 0xd8, 0xa0, 0x4c, 0x75, 0xed, 0x91, 0x1e, 0xba, 0xf6, 0x13, 0x30, 0xca, 0x7e, 0xa8, 0x19, 0xa0, - 0x46, 0x63, 0x8d, 0x83, 0xb1, 0xc4, 0x67, 0x27, 0xcc, 0xd8, 0x80, 0x13, 0xe6, 0x49, 0x98, 0xaa, - 0x3b, 0x64, 0x27, 0x0c, 0x56, 0x02, 0xb7, 0x1d, 0x7a, 0x41, 0x82, 0xaa, 0x30, 0xc4, 0x76, 0x07, - 0xbe, 0xb6, 0x87, 0x28, 0x07, 0x3c, 0x44, 0x35, 0x67, 0xfb, 0x8f, 0x4a, 0x30, 0x59, 0x27, 0x3e, - 0x49, 0x08, 0x3f, 0x6b, 0xc4, 0x68, 0x15, 0xd0, 0x66, 0xe4, 0xb4, 0x48, 0x83, 0x44, 0x5e, 0xe8, - 0x36, 0x49, 0x2b, 0x0c, 0xd8, 0x15, 0x1f, 0xdd, 0xee, 0x4e, 0x1f, 0xec, 0xd7, 0xd0, 0xc5, 0x2e, - 0x2c, 0xce, 0x29, 0x81, 0xde, 0x82, 0xc9, 0x76, 0x44, 0x0c, 0x1b, 0x9a, 0x55, 0xa4, 0x2e, 0x34, - 0x74, 0x42, 0xae, 0xa9, 0x1a, 0x20, 0x6c, 0xb2, 0x42, 0x3f, 0x06, 0x33, 0x61, 0xd4, 0xde, 0x72, - 0x82, 0x3a, 0x69, 0x93, 0xc0, 0xa5, 0xaa, 0xb8, 0xb0, 0x11, 0x9c, 0x3c, 0xd8, 0xaf, 0xcd, 0x5c, - 0xcf, 0xe0, 0x70, 0x17, 0x35, 0x7a, 0x0b, 0x66, 0xdb, 0x51, 0xd8, 0x76, 0x36, 0xd9, 0x44, 0x11, - 0x1a, 0x07, 0x97, 0x3e, 0x4f, 0x1f, 0xec, 0xd7, 0x66, 0x1b, 0x59, 0xe4, 0xe1, 0x7e, 0xed, 0x04, - 0xeb, 0x28, 0x0a, 0x49, 0x91, 0xb8, 0x9b, 0x8d, 0xbd, 0x09, 0xa7, 0xea, 0xe1, 0xed, 0xe0, 0xb6, - 0x13, 0xb9, 0x8b, 0x8d, 0x35, 0xed, 0x70, 0x7f, 0x4d, 0x1e, 0x2e, 0xf9, 0x85, 0x69, 0xee, 0x3e, - 0xa5, 0x95, 0xe4, 0xea, 0xff, 0xaa, 0xe7, 0x93, 0x02, 0x23, 0xc2, 0xdf, 0x2e, 0x19, 0x35, 0xa5, - 0xf4, 0xca, 0x52, 0x6f, 0x15, 0x5a, 0xea, 0x5f, 0x87, 0xb1, 0x0d, 0x8f, 0xf8, 0x2e, 0x26, 0x1b, - 0x62, 0x64, 0x1e, 0x2f, 0xbe, 0x03, 0x5a, 0xa5, 0x94, 0xd2, 0x68, 0xc4, 0x8f, 0xa6, 0xab, 0xa2, - 0x30, 0x56, 0x6c, 0xd0, 0x36, 0xcc, 0xc8, 0xb3, 0x8f, 0xc4, 0x8a, 0x45, 0xfc, 0x44, 0xaf, 0x03, - 0x95, 0xc9, 0x9c, 0x0d, 0x20, 0xce, 0xb0, 0xc1, 0x5d, 0x8c, 0xe9, 0x59, 0x74, 0x87, 0x6e, 0x57, - 0x43, 0x6c, 0x4a, 0xb3, 0xb3, 0x28, 0x3b, 0x56, 0x33, 0xa8, 0xfd, 0x15, 0x0b, 0x1e, 0xe8, 0xea, - 0x19, 0x61, 0x5e, 0xb8, 0xc7, 0xa3, 0x90, 0x3d, 0xee, 0x97, 0xfa, 0x1f, 0xf7, 0xed, 0x5f, 0xb3, - 0xe0, 0xe4, 0xca, 0x4e, 0x3b, 0xd9, 0xab, 0x7b, 0xe6, 0x6d, 0xc2, 0x8b, 0x30, 0xb2, 0x43, 0x5c, - 0xaf, 0xb3, 0x23, 0x46, 0xae, 0x26, 0x45, 0xfa, 0x55, 0x06, 0x3d, 0xdc, 0xaf, 0x4d, 0x36, 0x93, - 0x30, 0x72, 0x36, 0x09, 0x07, 0x60, 0x41, 0x8e, 0x7e, 0x92, 0xeb, 0xa6, 0x57, 0xbc, 0x1d, 0x4f, - 0xde, 0xe9, 0xf5, 0x34, 0x79, 0xcd, 0xcb, 0x0e, 0x9d, 0x7f, 0xbd, 0xe3, 0x04, 0x89, 0x97, 0xec, - 0x99, 0xba, 0x2c, 0x63, 0x84, 0x53, 0x9e, 0xf6, 0xb7, 0x2d, 0x98, 0x96, 0xf2, 0x64, 0xd1, 0x75, - 0x23, 0x12, 0xc7, 0x68, 0x0e, 0x4a, 0x5e, 0x5b, 0xb4, 0x14, 0x44, 0xe9, 0xd2, 0x5a, 0x03, 0x97, - 0xbc, 0x36, 0x6a, 0x40, 0x85, 0x5f, 0x0f, 0xa6, 0x13, 0x6c, 0xa0, 0x4b, 0x46, 0x76, 0xf6, 0x5b, - 0x97, 0x25, 0x71, 0xca, 0x44, 0x6a, 0xc6, 0x6c, 0x2f, 0x2a, 0x9b, 0x37, 0x2d, 0x97, 0x04, 0x1c, - 0x2b, 0x0a, 0x74, 0x1e, 0xc6, 0x82, 0xd0, 0xe5, 0xb7, 0xb5, 0x7c, 0x5d, 0xb3, 0x69, 0x7b, 0x4d, - 0xc0, 0xb0, 0xc2, 0xda, 0x3f, 0x6b, 0xc1, 0x84, 0xfc, 0xb2, 0x01, 0x95, 0x74, 0xba, 0xbc, 0x52, - 0x05, 0x3d, 0x5d, 0x5e, 0x54, 0xc9, 0x66, 0x18, 0x43, 0xb7, 0x2e, 0x1f, 0x45, 0xb7, 0xb6, 0xbf, - 0x5c, 0x82, 0x29, 0xd9, 0x9c, 0x66, 0xe7, 0x56, 0x4c, 0x12, 0xb4, 0x0e, 0x15, 0x87, 0x77, 0x39, - 0x91, 0xb3, 0xf6, 0xd1, 0xfc, 0x53, 0x97, 0x31, 0x3e, 0xe9, 0x88, 0x2e, 0xca, 0xd2, 0x38, 0x65, - 0x84, 0x7c, 0x98, 0x0d, 0xc2, 0x84, 0x6d, 0x7d, 0x0a, 0xdf, 0xeb, 0x6e, 0x20, 0xcb, 0xfd, 0x8c, - 0xe0, 0x3e, 0x7b, 0x2d, 0xcb, 0x05, 0x77, 0x33, 0x46, 0x2b, 0xd2, 0xd2, 0x53, 0x66, 0x35, 0x9c, - 0xeb, 0x55, 0x43, 0xb1, 0xa1, 0xc7, 0xfe, 0x5d, 0x0b, 0x2a, 0x92, 0xec, 0x38, 0xae, 0x81, 0xae, - 0xc2, 0x68, 0xcc, 0x06, 0x41, 0x76, 0x8d, 0xdd, 0xab, 0xe1, 0x7c, 0xbc, 0xd2, 0x1d, 0x9d, 0xff, - 0x8f, 0xb1, 0xe4, 0xc1, 0x4c, 0xd5, 0xaa, 0xf9, 0x1f, 0x11, 0x53, 0xb5, 0x6a, 0x4f, 0xc1, 0x2e, - 0xf3, 0x5f, 0x58, 0x9b, 0xb5, 0xf3, 0x3c, 0x55, 0x3c, 0xdb, 0x11, 0xd9, 0xf0, 0xee, 0x64, 0x15, - 0xcf, 0x06, 0x83, 0x62, 0x81, 0x45, 0x6f, 0xc3, 0x44, 0x4b, 0x5a, 0x78, 0x53, 0x31, 0xf0, 0x58, - 0x4f, 0x7b, 0xb9, 0xba, 0x5a, 0xe1, 0x9e, 0x5c, 0xcb, 0x5a, 0x79, 0x6c, 0x70, 0x33, 0xaf, 0xd3, - 0xcb, 0xfd, 0xae, 0xd3, 0x53, 0xbe, 0x85, 0x17, 0xc2, 0xf6, 0x2f, 0x59, 0x30, 0xc2, 0xed, 0x84, - 0x83, 0x19, 0x56, 0xb5, 0xab, 0xa2, 0xb4, 0xef, 0x6e, 0x52, 0xa0, 0xb8, 0x39, 0x42, 0x57, 0xa1, - 0xc2, 0x7e, 0x30, 0x7b, 0x49, 0xb9, 0xd8, 0x85, 0x8d, 0xd7, 0xaa, 0x37, 0xf0, 0xa6, 0x2c, 0x86, - 0x53, 0x0e, 0xf6, 0xcf, 0x97, 0xa9, 0xa8, 0x4a, 0x49, 0x8d, 0x5d, 0xdc, 0xba, 0x7f, 0xbb, 0x78, - 0xe9, 0x7e, 0xed, 0xe2, 0x9b, 0x30, 0xdd, 0xd2, 0xee, 0xa5, 0xd2, 0x91, 0x3c, 0xdf, 0x73, 0x92, - 0x68, 0x57, 0x58, 0xdc, 0x56, 0xb6, 0x6c, 0x32, 0xc1, 0x59, 0xae, 0xe8, 0xb3, 0x30, 0xc1, 0xc7, - 0x59, 0xd4, 0x32, 0xc4, 0x6a, 0xf9, 0x44, 0xf1, 0x7c, 0xd1, 0xab, 0x60, 0x33, 0xb1, 0xa9, 0x15, - 0xc7, 0x06, 0x33, 0xfb, 0x8b, 0xc3, 0x30, 0xbc, 0xb2, 0x4b, 0x82, 0xe4, 0x18, 0x04, 0x52, 0x0b, - 0xa6, 0xbc, 0x60, 0x37, 0xf4, 0x77, 0x89, 0xcb, 0xf1, 0x47, 0xd9, 0x5c, 0x4f, 0x0b, 0xd6, 0x53, - 0x6b, 0x06, 0x0b, 0x9c, 0x61, 0x79, 0x3f, 0x4e, 0xee, 0x17, 0x61, 0x84, 0x8f, 0xbd, 0x38, 0xb6, - 0xe7, 0x5a, 0xc1, 0x59, 0x27, 0x8a, 0x55, 0x90, 0x5a, 0x15, 0xb8, 0xd9, 0x5d, 0x14, 0x47, 0xef, - 0xc2, 0xd4, 0x86, 0x17, 0xc5, 0x09, 0x3d, 0x72, 0xc7, 0x89, 0xb3, 0xd3, 0xbe, 0x8b, 0x93, 0xba, - 0xea, 0x87, 0x55, 0x83, 0x13, 0xce, 0x70, 0x46, 0x9b, 0x30, 0x49, 0x0f, 0x8f, 0x69, 0x55, 0xa3, - 0x47, 0xae, 0x4a, 0x99, 0xe2, 0xae, 0xe8, 0x8c, 0xb0, 0xc9, 0x97, 0x0a, 0x93, 0x16, 0x3b, 0x6c, - 0x8e, 0x31, 0x8d, 0x42, 0x09, 0x13, 0x7e, 0xca, 0xe4, 0x38, 0x2a, 0x93, 0x98, 0x3f, 0x47, 0xc5, - 0x94, 0x49, 0xa9, 0xd7, 0x86, 0xfd, 0x55, 0xba, 0x3b, 0xd2, 0x3e, 0x3c, 0x86, 0xad, 0xe5, 0x55, - 0x73, 0x6b, 0x39, 0x53, 0x38, 0x9e, 0x05, 0xdb, 0xca, 0xe7, 0x60, 0x5c, 0x1b, 0x6e, 0xb4, 0x00, - 0x95, 0x96, 0x74, 0x3e, 0x10, 0x52, 0x57, 0xa9, 0x2f, 0xca, 0x2b, 0x01, 0xa7, 0x34, 0xb4, 0x37, - 0xa8, 0xb2, 0x97, 0x75, 0x46, 0xa2, 0xaa, 0x20, 0x66, 0x18, 0xfb, 0x39, 0x80, 0x95, 0x3b, 0xa4, - 0xb5, 0xc8, 0x0f, 0x5f, 0xda, 0x1d, 0x97, 0x55, 0x7c, 0xc7, 0x65, 0xff, 0xb1, 0x05, 0x53, 0xab, - 0xcb, 0x86, 0x52, 0x3e, 0x0f, 0xc0, 0xb5, 0xd0, 0x37, 0xde, 0xb8, 0x26, 0xad, 0xc3, 0xdc, 0xc0, - 0xa7, 0xa0, 0x58, 0xa3, 0x40, 0x67, 0xa0, 0xec, 0x77, 0x02, 0xa1, 0x1c, 0x8e, 0x1e, 0xec, 0xd7, - 0xca, 0x57, 0x3a, 0x01, 0xa6, 0x30, 0xcd, 0xff, 0xa7, 0x3c, 0xb0, 0xff, 0x4f, 0x5f, 0xc7, 0x69, - 0x54, 0x83, 0xe1, 0xdb, 0xb7, 0x3d, 0x37, 0xae, 0x0e, 0xa7, 0x96, 0xeb, 0x37, 0xde, 0x58, 0xab, - 0xc7, 0x98, 0xc3, 0xed, 0xff, 0xbf, 0x0c, 0x33, 0xab, 0x3e, 0xb9, 0x63, 0x7c, 0xd6, 0x63, 0x30, - 0xe2, 0x46, 0xde, 0x2e, 0x89, 0xb2, 0xbb, 0x78, 0x9d, 0x41, 0xb1, 0xc0, 0x0e, 0xec, 0xb3, 0x74, - 0xa3, 0x7b, 0x3f, 0xbe, 0xd7, 0x5e, 0x5a, 0xfd, 0xbb, 0xe2, 0x6d, 0x18, 0xe5, 0x57, 0xa5, 0xbc, - 0x33, 0xc6, 0x2f, 0x3c, 0x9b, 0xd7, 0x84, 0x6c, 0x5f, 0xcc, 0x0b, 0xe3, 0x07, 0xf7, 0x1b, 0x51, - 0x42, 0x4c, 0x40, 0xb1, 0x64, 0x39, 0xf7, 0x69, 0x98, 0xd0, 0x29, 0x8f, 0xe4, 0x40, 0xf2, 0x57, - 0x2c, 0x38, 0xb1, 0xea, 0x87, 0xad, 0xed, 0x8c, 0x03, 0xd9, 0x0b, 0x30, 0x4e, 0xd7, 0x53, 0x6c, - 0x38, 0xa3, 0x1a, 0xee, 0xc9, 0x02, 0x85, 0x75, 0x3a, 0xad, 0xd8, 0x8d, 0x1b, 0x6b, 0xf5, 0x3c, - 0xaf, 0x66, 0x81, 0xc2, 0x3a, 0x9d, 0xfd, 0x07, 0x16, 0x3c, 0x7c, 0x71, 0x79, 0x25, 0xf5, 0xa1, - 0xec, 0x72, 0xac, 0xa6, 0xca, 0x9d, 0xab, 0x35, 0x25, 0x55, 0xee, 0xea, 0xac, 0x15, 0x02, 0xfb, - 0x51, 0x09, 0x1a, 0xf8, 0x15, 0x0b, 0x4e, 0x5c, 0xf4, 0x12, 0x4c, 0xda, 0x61, 0xd6, 0xc5, 0x37, - 0x22, 0xed, 0x30, 0xf6, 0x92, 0x30, 0xda, 0xcb, 0xba, 0xf8, 0x62, 0x85, 0xc1, 0x1a, 0x15, 0xaf, - 0x79, 0xd7, 0x8b, 0x69, 0x4b, 0x4b, 0xe6, 0x09, 0x13, 0x0b, 0x38, 0x56, 0x14, 0xf4, 0xc3, 0x5c, - 0x2f, 0x62, 0x1a, 0xc2, 0x9e, 0x58, 0xce, 0xea, 0xc3, 0xea, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0x2b, - 0x16, 0x9c, 0xba, 0xe8, 0x77, 0xe2, 0x84, 0x44, 0x1b, 0xb1, 0xd1, 0xd8, 0xe7, 0xa0, 0x42, 0xa4, - 0x16, 0x2e, 0xda, 0xaa, 0xf6, 0x0d, 0xa5, 0x9e, 0x73, 0xff, 0x62, 0x45, 0x37, 0x80, 0x37, 0xe6, - 0xd1, 0xbc, 0x08, 0xbf, 0x56, 0x82, 0xc9, 0x4b, 0xeb, 0xeb, 0x8d, 0x8b, 0x24, 0x11, 0x22, 0xb3, - 0xbf, 0x15, 0x09, 0x6b, 0x07, 0xe1, 0x5e, 0xba, 0x4e, 0x27, 0xf1, 0xfc, 0x79, 0x1e, 0xd0, 0x32, - 0xbf, 0x16, 0x24, 0xd7, 0xa3, 0x66, 0x12, 0x79, 0xc1, 0x66, 0xee, 0xd1, 0x59, 0x0a, 0xf6, 0x72, - 0x91, 0x60, 0x47, 0xcf, 0xc1, 0x08, 0x8b, 0xa8, 0x91, 0x5a, 0xc7, 0x83, 0x4a, 0x55, 0x60, 0xd0, - 0xc3, 0xfd, 0x5a, 0xe5, 0x06, 0x5e, 0xe3, 0x7f, 0xb0, 0x20, 0x45, 0x37, 0x60, 0x7c, 0x2b, 0x49, - 0xda, 0x97, 0x88, 0xe3, 0x92, 0x48, 0x4a, 0x87, 0xb3, 0x79, 0xd2, 0x81, 0x76, 0x02, 0x27, 0x4b, - 0x17, 0x54, 0x0a, 0x8b, 0xb1, 0xce, 0xc7, 0x6e, 0x02, 0xa4, 0xb8, 0x7b, 0x74, 0x6c, 0xb0, 0xbf, - 0x67, 0xc1, 0xe8, 0x25, 0x27, 0x70, 0x7d, 0x12, 0xa1, 0x57, 0x60, 0x88, 0xdc, 0x21, 0x2d, 0xb1, - 0x83, 0xe7, 0x36, 0x38, 0xdd, 0xe5, 0xb8, 0x21, 0x8c, 0xfe, 0xc7, 0xac, 0x14, 0xba, 0x04, 0xa3, - 0xb4, 0xb5, 0x17, 0x95, 0xa7, 0xf7, 0x23, 0x45, 0x5f, 0xac, 0x86, 0x9d, 0x6f, 0x8c, 0x02, 0x84, - 0x65, 0x71, 0x66, 0xd0, 0x69, 0xb5, 0x9b, 0x54, 0x80, 0x25, 0xbd, 0x8e, 0x5b, 0xeb, 0xcb, 0x0d, - 0x4e, 0x24, 0xb8, 0x71, 0x83, 0x8e, 0x04, 0xe2, 0x94, 0x89, 0xbd, 0x0e, 0x15, 0x3a, 0xa8, 0x8b, - 0xbe, 0xe7, 0xf4, 0xb6, 0x25, 0x3d, 0x05, 0x15, 0x69, 0xd7, 0x89, 0x85, 0xb3, 0x38, 0xe3, 0x2a, - 0xcd, 0x3e, 0x31, 0x4e, 0xf1, 0xf6, 0x06, 0x9c, 0x64, 0x17, 0xa5, 0x4e, 0xb2, 0x65, 0xac, 0xb1, - 0xfe, 0x93, 0xf9, 0x69, 0xa1, 0x5f, 0xf1, 0x91, 0xa9, 0x6a, 0xbe, 0xb2, 0x13, 0x92, 0xa3, 0xa6, - 0x6b, 0xfd, 0xa7, 0x21, 0x98, 0x5d, 0x6b, 0x2e, 0x37, 0x4d, 0xe3, 0xe2, 0x4b, 0x30, 0xc1, 0x35, - 0x01, 0x3a, 0xa1, 0x1d, 0x5f, 0xd4, 0xa6, 0x2e, 0x0f, 0xd6, 0x35, 0x1c, 0x36, 0x28, 0xd1, 0xc3, - 0x50, 0xf6, 0xde, 0x0b, 0xb2, 0xee, 0x70, 0x6b, 0xaf, 0x5f, 0xc3, 0x14, 0x4e, 0xd1, 0x54, 0xa9, - 0xe0, 0x02, 0x54, 0xa1, 0x95, 0x62, 0xf1, 0x2a, 0x4c, 0x79, 0x71, 0x2b, 0xf6, 0xd6, 0x02, 0x2a, - 0x5d, 0xd2, 0x48, 0x89, 0x54, 0xe3, 0xa7, 0x4d, 0x55, 0x58, 0x9c, 0xa1, 0xd6, 0xa4, 0xf9, 0xf0, - 0xc0, 0x8a, 0x49, 0x5f, 0x9f, 0x69, 0xaa, 0x73, 0xb5, 0xd9, 0xd7, 0xc5, 0xcc, 0x35, 0x47, 0xe8, - 0x5c, 0xfc, 0x83, 0x63, 0x2c, 0x71, 0xe8, 0x22, 0xcc, 0xb6, 0xb6, 0x9c, 0xf6, 0x62, 0x27, 0xd9, - 0xaa, 0x7b, 0x71, 0x2b, 0xdc, 0x25, 0xd1, 0x1e, 0xd3, 0x84, 0xc7, 0x52, 0x23, 0x93, 0x42, 0x2c, - 0x5f, 0x5a, 0x6c, 0x50, 0x4a, 0xdc, 0x5d, 0xc6, 0x54, 0x41, 0xe0, 0x9e, 0xa9, 0x20, 0x8b, 0x30, - 0x2d, 0xeb, 0x6a, 0x92, 0x98, 0x6d, 0x0f, 0xe3, 0xac, 0x75, 0x2a, 0x90, 0x49, 0x80, 0x55, 0xdb, - 0xb2, 0xf4, 0xe8, 0x45, 0x98, 0xf4, 0x02, 0x2f, 0xf1, 0x9c, 0x24, 0x8c, 0xd8, 0xe6, 0x3a, 0xc1, - 0x37, 0x0c, 0x2a, 0xe1, 0xd7, 0x74, 0x04, 0x36, 0xe9, 0xec, 0x77, 0xa1, 0xa2, 0xfc, 0xcd, 0xa4, - 0xcb, 0xa4, 0x55, 0xe0, 0x32, 0xd9, 0x7f, 0x47, 0x90, 0x56, 0xf3, 0x72, 0xae, 0xd5, 0xfc, 0xef, - 0x58, 0x90, 0xba, 0xdd, 0xa0, 0x4b, 0x50, 0x69, 0x87, 0xec, 0xe6, 0x2c, 0x92, 0xd7, 0xd1, 0x0f, - 0xe6, 0x0a, 0x0f, 0x2e, 0xa8, 0x78, 0xff, 0x35, 0x64, 0x09, 0x9c, 0x16, 0x46, 0x4b, 0x30, 0xda, - 0x8e, 0x48, 0x33, 0x61, 0xa1, 0x1e, 0x7d, 0xf9, 0xf0, 0x39, 0xc2, 0xe9, 0xb1, 0x2c, 0x68, 0xff, - 0x86, 0x05, 0xc0, 0x8d, 0xd2, 0x4e, 0xb0, 0x49, 0x8e, 0xe1, 0xa0, 0x5d, 0x87, 0xa1, 0xb8, 0x4d, - 0x5a, 0xbd, 0xee, 0x34, 0xd3, 0xf6, 0x34, 0xdb, 0xa4, 0x95, 0x76, 0x38, 0xfd, 0x87, 0x59, 0x69, - 0xfb, 0x67, 0x00, 0xa6, 0x52, 0x32, 0x7a, 0x00, 0x42, 0xcf, 0x18, 0x6e, 0xf9, 0x67, 0x32, 0x6e, - 0xf9, 0x15, 0x46, 0xad, 0x79, 0xe2, 0xbf, 0x0b, 0xe5, 0x1d, 0xe7, 0x8e, 0x38, 0x65, 0x3d, 0xd5, - 0xbb, 0x19, 0x94, 0xff, 0xfc, 0x55, 0xe7, 0x0e, 0xd7, 0x63, 0x9f, 0x92, 0x13, 0xe4, 0xaa, 0x73, - 0xe7, 0x90, 0xdf, 0x5c, 0x32, 0x21, 0x45, 0x0f, 0x73, 0x9f, 0xff, 0x93, 0xf4, 0x3f, 0x9b, 0x76, - 0xb4, 0x12, 0x56, 0x97, 0x17, 0x08, 0x13, 0xed, 0x40, 0x75, 0x79, 0x41, 0xb6, 0x2e, 0x2f, 0x18, - 0xa0, 0x2e, 0x2f, 0x40, 0xef, 0xc3, 0xa8, 0xb8, 0x12, 0x61, 0xfe, 0x84, 0xe3, 0x17, 0x16, 0x06, - 0xa8, 0x4f, 0xdc, 0xa8, 0xf0, 0x3a, 0x17, 0xa4, 0x9e, 0x2e, 0xa0, 0x7d, 0xeb, 0x95, 0x15, 0xa2, - 0xbf, 0x65, 0xc1, 0x94, 0xf8, 0x8d, 0xc9, 0x7b, 0x1d, 0x12, 0x27, 0x42, 0x1f, 0xf8, 0xd4, 0xe0, - 0x6d, 0x10, 0x05, 0x79, 0x53, 0x3e, 0x25, 0xc5, 0xac, 0x89, 0xec, 0xdb, 0xa2, 0x4c, 0x2b, 0xd0, - 0x3f, 0xb5, 0xe0, 0xe4, 0x8e, 0x73, 0x87, 0xd7, 0xc8, 0x61, 0xd8, 0x49, 0xbc, 0x50, 0xf8, 0x47, - 0xbe, 0x32, 0xd8, 0xf0, 0x77, 0x15, 0xe7, 0x8d, 0x94, 0xae, 0x54, 0x27, 0xf3, 0x48, 0xfa, 0x36, - 0x35, 0xb7, 0x5d, 0x73, 0x1b, 0x30, 0x26, 0xe7, 0x5b, 0xce, 0x69, 0xa8, 0xae, 0x2b, 0x3b, 0x47, - 0xbe, 0x91, 0xd2, 0x4e, 0x4f, 0xac, 0x1e, 0x31, 0xd7, 0xee, 0x6b, 0x3d, 0xef, 0xc2, 0x84, 0x3e, - 0xc7, 0xee, 0x6b, 0x5d, 0xef, 0xc1, 0x89, 0x9c, 0xb9, 0x74, 0x5f, 0xab, 0xbc, 0x0d, 0x67, 0x0a, - 0xe7, 0xc7, 0xfd, 0xac, 0xd8, 0xfe, 0x9a, 0xa5, 0xcb, 0xc1, 0x63, 0x30, 0x4f, 0x2d, 0x9b, 0xe6, - 0xa9, 0xb3, 0xbd, 0x57, 0x4e, 0x81, 0x8d, 0xea, 0x6d, 0xbd, 0xd1, 0x54, 0xaa, 0xa3, 0xd7, 0x60, - 0xc4, 0xa7, 0x10, 0x79, 0x0f, 0x67, 0xf7, 0x5f, 0x91, 0xa9, 0x2e, 0xc5, 0xe0, 0x31, 0x16, 0x1c, - 0xec, 0xdf, 0xb6, 0x60, 0xe8, 0x18, 0x7a, 0x02, 0x9b, 0x3d, 0xf1, 0x4c, 0x21, 0x6b, 0x91, 0xad, - 0x60, 0x1e, 0x3b, 0xb7, 0x57, 0xee, 0x24, 0x24, 0x88, 0x99, 0xfa, 0x9e, 0xdb, 0x31, 0xff, 0xbb, - 0x04, 0xe3, 0xb4, 0x2a, 0xe9, 0x34, 0xf2, 0x32, 0x4c, 0xfa, 0xce, 0x2d, 0xe2, 0x4b, 0x93, 0x79, - 0xf6, 0x10, 0x7b, 0x45, 0x47, 0x62, 0x93, 0x96, 0x16, 0xde, 0xd0, 0x6f, 0x0f, 0x84, 0xfe, 0xa2, - 0x0a, 0x1b, 0x57, 0x0b, 0xd8, 0xa4, 0xa5, 0xe7, 0xa9, 0xdb, 0x4e, 0xd2, 0xda, 0x12, 0x07, 0x5c, - 0xd5, 0xdc, 0x37, 0x28, 0x10, 0x73, 0x1c, 0x55, 0xe0, 0xe4, 0xec, 0xbc, 0x49, 0x22, 0xa6, 0xc0, - 0x71, 0xf5, 0x58, 0x29, 0x70, 0xd8, 0x44, 0xe3, 0x2c, 0x3d, 0xfa, 0x34, 0x4c, 0xd1, 0xce, 0x09, - 0x3b, 0x89, 0x74, 0x89, 0x19, 0x66, 0x2e, 0x31, 0xcc, 0x03, 0x7a, 0xdd, 0xc0, 0xe0, 0x0c, 0x25, - 0x6a, 0xc0, 0x49, 0x2f, 0x68, 0xf9, 0x1d, 0x97, 0xdc, 0x08, 0xb8, 0x76, 0xe7, 0x7b, 0xef, 0x13, - 0x57, 0x28, 0xd0, 0xca, 0x7b, 0x69, 0x2d, 0x87, 0x06, 0xe7, 0x96, 0xb4, 0x7f, 0x12, 0x4e, 0x5c, - 0x09, 0x1d, 0x77, 0xc9, 0xf1, 0x9d, 0xa0, 0x45, 0xa2, 0xb5, 0x60, 0xb3, 0xef, 0x85, 0xbc, 0x7e, - 0x7d, 0x5e, 0xea, 0x77, 0x7d, 0x6e, 0x6f, 0x01, 0xd2, 0x2b, 0x10, 0xae, 0x60, 0x18, 0x46, 0x3d, - 0x5e, 0x95, 0x98, 0xfe, 0x8f, 0xe7, 0x6b, 0xd7, 0x5d, 0x2d, 0xd3, 0x9c, 0x9c, 0x38, 0x00, 0x4b, - 0x46, 0xf6, 0x4b, 0x90, 0x1b, 0x9f, 0xd1, 0xff, 0x28, 0x6d, 0xbf, 0x00, 0xb3, 0xac, 0xe4, 0xd1, - 0x8e, 0x79, 0xf6, 0x5f, 0xb7, 0x60, 0xfa, 0x5a, 0x26, 0x06, 0xf6, 0x31, 0x18, 0x89, 0x49, 0x94, - 0x63, 0x0b, 0x6d, 0x32, 0x28, 0x16, 0xd8, 0x7b, 0x6e, 0x73, 0xf9, 0xbe, 0x05, 0x15, 0x15, 0xb0, - 0x7e, 0x0c, 0x4a, 0xed, 0xb2, 0xa1, 0xd4, 0xe6, 0xda, 0x02, 0x54, 0x73, 0x8a, 0x74, 0x5a, 0x74, - 0x59, 0xc5, 0x86, 0xf6, 0x30, 0x03, 0xa4, 0x6c, 0x78, 0x24, 0xe1, 0x94, 0x19, 0x40, 0x2a, 0xa3, - 0x45, 0xd9, 0x8d, 0xb8, 0xa2, 0xfd, 0x88, 0xdc, 0x88, 0xab, 0xf6, 0x14, 0x48, 0xbf, 0x86, 0xd6, - 0x64, 0xb6, 0x2b, 0xfc, 0x28, 0xf3, 0x1c, 0x65, 0x6b, 0x53, 0x05, 0x51, 0xd7, 0x84, 0x27, 0xa8, - 0x80, 0x1e, 0x32, 0x41, 0x26, 0xfe, 0xf1, 0xe4, 0x02, 0x69, 0x11, 0xfb, 0x12, 0x4c, 0x67, 0x3a, - 0x0c, 0xbd, 0x00, 0xc3, 0xed, 0x2d, 0x27, 0x26, 0x19, 0x4f, 0xa0, 0xe1, 0x06, 0x05, 0x1e, 0xee, - 0xd7, 0xa6, 0x54, 0x01, 0x06, 0xc1, 0x9c, 0xda, 0xfe, 0xef, 0x16, 0x0c, 0x5d, 0x0b, 0xdd, 0xe3, - 0x98, 0x4c, 0xaf, 0x1a, 0x93, 0xe9, 0xa1, 0xa2, 0xd4, 0x2c, 0x85, 0xf3, 0x68, 0x35, 0x33, 0x8f, - 0xce, 0x16, 0x72, 0xe8, 0x3d, 0x85, 0x76, 0x60, 0x9c, 0x25, 0x7c, 0x11, 0x5e, 0x49, 0xcf, 0x19, - 0xe7, 0xab, 0x5a, 0xe6, 0x7c, 0x35, 0xad, 0x91, 0x6a, 0xa7, 0xac, 0x27, 0x60, 0x54, 0x78, 0xc6, - 0x64, 0x7d, 0x64, 0x05, 0x2d, 0x96, 0x78, 0xfb, 0x97, 0xca, 0x60, 0x24, 0x98, 0x41, 0xbf, 0x6b, - 0xc1, 0x7c, 0xc4, 0xa3, 0x82, 0xdc, 0x7a, 0x27, 0xf2, 0x82, 0xcd, 0x66, 0x6b, 0x8b, 0xb8, 0x1d, - 0xdf, 0x0b, 0x36, 0xd7, 0x36, 0x83, 0x50, 0x81, 0x57, 0xee, 0x90, 0x56, 0x87, 0xd9, 0xc1, 0xfb, - 0x64, 0xb3, 0x51, 0x37, 0xcf, 0x17, 0x0e, 0xf6, 0x6b, 0xf3, 0xf8, 0x48, 0xbc, 0xf1, 0x11, 0xdb, - 0x82, 0xfe, 0xc0, 0x82, 0x05, 0x9e, 0x77, 0x65, 0xf0, 0xf6, 0xf7, 0x38, 0x8d, 0x36, 0x24, 0xab, - 0x94, 0xc9, 0x3a, 0x89, 0x76, 0x96, 0x5e, 0x14, 0x1d, 0xba, 0xd0, 0x38, 0x5a, 0x5d, 0xf8, 0xa8, - 0x8d, 0xb3, 0xff, 0x55, 0x19, 0x26, 0x69, 0x2f, 0xa6, 0x91, 0xf0, 0x2f, 0x18, 0x53, 0xe2, 0x91, - 0xcc, 0x94, 0x98, 0x35, 0x88, 0xef, 0x4d, 0x10, 0x7c, 0x0c, 0xb3, 0xbe, 0x13, 0x27, 0x97, 0x88, - 0x13, 0x25, 0xb7, 0x88, 0xc3, 0xae, 0x7a, 0xc5, 0x34, 0x3f, 0xca, 0xed, 0xb1, 0x32, 0x7f, 0x5d, - 0xc9, 0x32, 0xc3, 0xdd, 0xfc, 0xd1, 0x2e, 0x20, 0x76, 0xad, 0x1c, 0x39, 0x41, 0xcc, 0xbf, 0xc5, - 0x13, 0x36, 0xf2, 0xa3, 0xd5, 0x3a, 0x27, 0x6a, 0x45, 0x57, 0xba, 0xb8, 0xe1, 0x9c, 0x1a, 0x34, - 0x77, 0x81, 0xe1, 0x41, 0xdd, 0x05, 0x46, 0xfa, 0x38, 0xa2, 0xef, 0xc0, 0x8c, 0x18, 0x95, 0x0d, - 0x6f, 0x53, 0x6c, 0xd2, 0x6f, 0x66, 0xdc, 0x89, 0xac, 0xc1, 0x1d, 0x1f, 0xfa, 0xf8, 0x12, 0xd9, - 0x3f, 0x05, 0x27, 0x68, 0x75, 0xa6, 0xdb, 0x74, 0x8c, 0x08, 0x4c, 0x6f, 0x77, 0x6e, 0x11, 0x9f, - 0x24, 0x12, 0x26, 0x2a, 0xcd, 0x55, 0xfb, 0xcd, 0xd2, 0xa9, 0x6e, 0x79, 0xd9, 0x64, 0x81, 0xb3, - 0x3c, 0xed, 0x5f, 0xb6, 0x80, 0x39, 0x26, 0x1e, 0xc3, 0xf6, 0xf7, 0x19, 0x73, 0xfb, 0xab, 0x16, - 0x49, 0xa0, 0x82, 0x9d, 0xef, 0x79, 0x3e, 0x2c, 0x8d, 0x28, 0xbc, 0xb3, 0x27, 0x75, 0xff, 0xfe, - 0x1a, 0xd7, 0xff, 0xb2, 0xf8, 0x82, 0x54, 0x41, 0x92, 0xe8, 0xa7, 0x61, 0xac, 0xe5, 0xb4, 0x9d, - 0x16, 0xcf, 0xec, 0x55, 0x68, 0xfd, 0x31, 0x0a, 0xcd, 0x2f, 0x8b, 0x12, 0xdc, 0x9a, 0xf1, 0x49, - 0xf9, 0x95, 0x12, 0xdc, 0xd7, 0x82, 0xa1, 0xaa, 0x9c, 0xdb, 0x86, 0x49, 0x83, 0xd9, 0x7d, 0x3d, - 0xfa, 0xfe, 0x34, 0xdf, 0x2e, 0xd4, 0x89, 0x65, 0x07, 0x66, 0x03, 0xed, 0x3f, 0x15, 0x8e, 0x52, - 0x9d, 0xfe, 0x78, 0xbf, 0x0d, 0x81, 0x49, 0x52, 0xcd, 0xf1, 0x32, 0xc3, 0x06, 0x77, 0x73, 0xb6, - 0xff, 0x9e, 0x05, 0x0f, 0xe8, 0x84, 0x5a, 0xfc, 0x6a, 0x3f, 0x7b, 0x72, 0x1d, 0xc6, 0xc2, 0x36, - 0x89, 0x9c, 0xf4, 0x4c, 0x76, 0x5e, 0x76, 0xfa, 0x75, 0x01, 0x3f, 0xdc, 0xaf, 0x9d, 0xd4, 0xb9, - 0x4b, 0x38, 0x56, 0x25, 0x91, 0x0d, 0x23, 0xac, 0x33, 0x62, 0x11, 0x5b, 0xcc, 0xb2, 0x5f, 0xb1, - 0xeb, 0xae, 0x18, 0x0b, 0x8c, 0xfd, 0x33, 0x16, 0x9f, 0x58, 0x7a, 0xd3, 0xd1, 0x7b, 0x30, 0xb3, - 0x43, 0x8f, 0x6f, 0x2b, 0x77, 0xda, 0x11, 0x37, 0xa3, 0xcb, 0x7e, 0x7a, 0xaa, 0x5f, 0x3f, 0x69, - 0x1f, 0xb9, 0x54, 0x15, 0x6d, 0x9e, 0xb9, 0x9a, 0x61, 0x86, 0xbb, 0xd8, 0xdb, 0x7f, 0x51, 0xe2, - 0x2b, 0x91, 0x69, 0x75, 0x4f, 0xc0, 0x68, 0x3b, 0x74, 0x97, 0xd7, 0xea, 0x58, 0xf4, 0x90, 0x12, - 0x57, 0x0d, 0x0e, 0xc6, 0x12, 0x8f, 0x2e, 0x00, 0x90, 0x3b, 0x09, 0x89, 0x02, 0xc7, 0x57, 0x97, - 0xf1, 0x4a, 0x79, 0x5a, 0x51, 0x18, 0xac, 0x51, 0xd1, 0x32, 0xed, 0x28, 0xdc, 0xf5, 0x5c, 0x16, - 0xdc, 0x51, 0x36, 0xcb, 0x34, 0x14, 0x06, 0x6b, 0x54, 0xf4, 0xa8, 0xdc, 0x09, 0x62, 0xbe, 0x01, - 0x3a, 0xb7, 0x44, 0x02, 0x9d, 0xb1, 0xf4, 0xa8, 0x7c, 0x43, 0x47, 0x62, 0x93, 0x16, 0x2d, 0xc2, - 0x48, 0xe2, 0xb0, 0x2b, 0xe6, 0xe1, 0x62, 0x97, 0x9d, 0x75, 0x4a, 0xa1, 0xa7, 0x7a, 0xa2, 0x05, - 0xb0, 0x28, 0x88, 0xde, 0x92, 0x22, 0x98, 0x8b, 0x64, 0xe1, 0x7a, 0x55, 0x38, 0x6d, 0x75, 0xf1, - 0xad, 0xcb, 0x60, 0xe1, 0xd2, 0x65, 0xf0, 0xb2, 0xbf, 0x50, 0x01, 0x48, 0xb5, 0x3d, 0xf4, 0x7e, - 0x97, 0x88, 0x78, 0xba, 0xb7, 0x7e, 0x78, 0xef, 0xe4, 0x03, 0xfa, 0xa2, 0x05, 0xe3, 0x8e, 0xef, - 0x87, 0x2d, 0x27, 0x61, 0xbd, 0x5c, 0xea, 0x2d, 0xa2, 0x44, 0xfd, 0x8b, 0x69, 0x09, 0xde, 0x84, - 0xe7, 0xe4, 0xed, 0xb1, 0x86, 0xe9, 0xdb, 0x0a, 0xbd, 0x62, 0xf4, 0x49, 0x79, 0x08, 0xe0, 0xd3, - 0x63, 0x2e, 0x7b, 0x08, 0xa8, 0x30, 0x69, 0xac, 0xe9, 0xff, 0xe8, 0x86, 0x91, 0xb7, 0x66, 0xa8, - 0x38, 0x44, 0xd7, 0x50, 0x7a, 0xfa, 0xa5, 0xac, 0x41, 0x0d, 0xdd, 0x05, 0x7d, 0xb8, 0x38, 0x8e, - 0x5d, 0xd3, 0xae, 0xfb, 0xb8, 0x9f, 0xbf, 0x0b, 0xd3, 0xae, 0xb9, 0xdd, 0x8a, 0xd9, 0xf4, 0x78, - 0x11, 0xdf, 0xcc, 0xee, 0x9c, 0x6e, 0xb0, 0x19, 0x04, 0xce, 0x32, 0x46, 0x0d, 0x1e, 0x0c, 0xb0, - 0x16, 0x6c, 0x84, 0xc2, 0x85, 0xcf, 0x2e, 0x1c, 0xcb, 0xbd, 0x38, 0x21, 0x3b, 0x94, 0x32, 0xdd, - 0x47, 0xaf, 0x89, 0xb2, 0x58, 0x71, 0x41, 0xaf, 0xc1, 0x08, 0x8b, 0xd2, 0x8a, 0xab, 0x63, 0xc5, - 0x76, 0x40, 0x33, 0xc0, 0x38, 0x5d, 0x54, 0xec, 0x6f, 0x8c, 0x05, 0x07, 0x74, 0x49, 0xa6, 0x09, - 0x88, 0xd7, 0x82, 0x1b, 0x31, 0x61, 0x69, 0x02, 0x2a, 0x4b, 0x1f, 0x4f, 0x33, 0x00, 0x70, 0x78, - 0x6e, 0x52, 0x47, 0xa3, 0x24, 0xd5, 0x57, 0xc4, 0x7f, 0x99, 0x2b, 0xb2, 0x0a, 0xc5, 0xcd, 0x33, - 0xf3, 0x49, 0xa6, 0xdd, 0x79, 0xd3, 0x64, 0x81, 0xb3, 0x3c, 0x8f, 0x75, 0xfb, 0x9c, 0x0b, 0x60, - 0x26, 0xbb, 0xb0, 0xee, 0xeb, 0x76, 0xfd, 0xbd, 0x21, 0x98, 0x32, 0x27, 0x02, 0x5a, 0x80, 0x8a, - 0x60, 0xa2, 0x92, 0x7c, 0xa9, 0xb9, 0x7d, 0x55, 0x22, 0x70, 0x4a, 0xc3, 0x92, 0x9c, 0xb1, 0xe2, - 0x9a, 0x6f, 0x56, 0x9a, 0xe4, 0x4c, 0x61, 0xb0, 0x46, 0x45, 0x95, 0xe8, 0x5b, 0x61, 0x98, 0xa8, - 0xad, 0x40, 0xcd, 0x96, 0x25, 0x06, 0xc5, 0x02, 0x4b, 0xb7, 0x80, 0x6d, 0x12, 0x05, 0xc4, 0x37, - 0x2d, 0x99, 0x6a, 0x0b, 0xb8, 0xac, 0x23, 0xb1, 0x49, 0x4b, 0xb7, 0xb4, 0x30, 0x66, 0xd3, 0x4f, - 0xa8, 0xea, 0xa9, 0xaf, 0x5b, 0x93, 0x47, 0x29, 0x4a, 0x3c, 0x7a, 0x13, 0x1e, 0x50, 0x41, 0x85, - 0x98, 0x5b, 0x86, 0x65, 0x8d, 0x23, 0xc6, 0xc9, 0xfa, 0x81, 0xe5, 0x7c, 0x32, 0x5c, 0x54, 0x1e, - 0xbd, 0x0a, 0x53, 0x42, 0x05, 0x96, 0x1c, 0x47, 0x4d, 0x67, 0x85, 0xcb, 0x06, 0x16, 0x67, 0xa8, - 0x51, 0x1d, 0x66, 0x28, 0x84, 0x69, 0xa1, 0x92, 0x03, 0x0f, 0x8e, 0x54, 0x7b, 0xfd, 0xe5, 0x0c, - 0x1e, 0x77, 0x95, 0x40, 0x8b, 0x30, 0xcd, 0x75, 0x14, 0x7a, 0xa6, 0x64, 0xe3, 0x20, 0x3c, 0x6b, - 0xd5, 0x42, 0xb8, 0x6e, 0xa2, 0x71, 0x96, 0x1e, 0xbd, 0x04, 0x13, 0x4e, 0xd4, 0xda, 0xf2, 0x12, - 0xd2, 0x4a, 0x3a, 0x11, 0x4f, 0xc2, 0xa1, 0x79, 0x7b, 0x2c, 0x6a, 0x38, 0x6c, 0x50, 0xda, 0xef, - 0xc3, 0x89, 0x1c, 0xa7, 0x7c, 0x3a, 0x71, 0x9c, 0xb6, 0x27, 0xbf, 0x29, 0xe3, 0xb5, 0xb6, 0xd8, - 0x58, 0x93, 0x5f, 0xa3, 0x51, 0xd1, 0xd9, 0xc9, 0x4c, 0xe2, 0x5a, 0x42, 0x57, 0x35, 0x3b, 0x57, - 0x25, 0x02, 0xa7, 0x34, 0xf6, 0xb7, 0x00, 0x34, 0x83, 0xce, 0x00, 0x3e, 0x4b, 0x2f, 0xc1, 0x84, - 0xcc, 0x42, 0xac, 0x65, 0xbf, 0x54, 0x9f, 0x79, 0x51, 0xc3, 0x61, 0x83, 0x92, 0xb6, 0x2d, 0x50, - 0xb9, 0x3b, 0x33, 0x3e, 0x72, 0x69, 0xe6, 0xce, 0x94, 0x06, 0x3d, 0x0d, 0x63, 0x31, 0xf1, 0x37, - 0xae, 0x78, 0xc1, 0xb6, 0x98, 0xd8, 0x4a, 0x0a, 0x37, 0x05, 0x1c, 0x2b, 0x0a, 0xb4, 0x04, 0xe5, - 0x8e, 0xe7, 0x8a, 0xa9, 0x2c, 0x37, 0xfc, 0xf2, 0x8d, 0xb5, 0xfa, 0xe1, 0x7e, 0xed, 0x91, 0xa2, - 0xe4, 0xca, 0xf4, 0x68, 0x1f, 0xcf, 0xd3, 0xe5, 0x47, 0x0b, 0xe7, 0xdd, 0x0d, 0x8c, 0x1c, 0xf1, - 0x6e, 0xe0, 0x02, 0x80, 0xf8, 0x6a, 0x39, 0x97, 0xcb, 0xe9, 0xa8, 0x5d, 0x54, 0x18, 0xac, 0x51, - 0xa1, 0x18, 0x66, 0x5b, 0x11, 0x71, 0xe4, 0x19, 0x9a, 0xbb, 0x97, 0x8f, 0xdd, 0xbd, 0x81, 0x60, - 0x39, 0xcb, 0x0c, 0x77, 0xf3, 0x47, 0x21, 0xcc, 0xba, 0x22, 0x86, 0x35, 0xad, 0xb4, 0x72, 0x74, - 0x9f, 0x76, 0xe6, 0x90, 0x93, 0x65, 0x84, 0xbb, 0x79, 0xa3, 0x77, 0x60, 0x4e, 0x02, 0xbb, 0xc3, - 0x86, 0xd9, 0x72, 0x29, 0x2f, 0x9d, 0x3d, 0xd8, 0xaf, 0xcd, 0xd5, 0x0b, 0xa9, 0x70, 0x0f, 0x0e, - 0x08, 0xc3, 0x08, 0xbb, 0x4b, 0x8a, 0xab, 0xe3, 0x6c, 0x9f, 0x7b, 0xb2, 0xd8, 0x18, 0x40, 0xe7, - 0xfa, 0x3c, 0xbb, 0x87, 0x12, 0x6e, 0xbe, 0xe9, 0xb5, 0x1c, 0x03, 0x62, 0xc1, 0x09, 0x6d, 0xc0, - 0xb8, 0x13, 0x04, 0x61, 0xe2, 0x70, 0x15, 0x6a, 0xa2, 0x58, 0xf7, 0xd3, 0x18, 0x2f, 0xa6, 0x25, - 0x38, 0x77, 0xe5, 0x39, 0xa8, 0x61, 0xb0, 0xce, 0x18, 0xdd, 0x86, 0xe9, 0xf0, 0x36, 0x15, 0x8e, - 0xd2, 0x4a, 0x11, 0x57, 0x27, 0x59, 0x5d, 0xcf, 0x0f, 0x68, 0xa7, 0x35, 0x0a, 0x6b, 0x52, 0xcb, - 0x64, 0x8a, 0xb3, 0xb5, 0xa0, 0x79, 0xc3, 0x5a, 0x3d, 0x95, 0xfa, 0xb3, 0xa7, 0xd6, 0x6a, 0xdd, - 0x38, 0xcd, 0xc2, 0xd0, 0xb9, 0xdb, 0x2a, 0x5b, 0xfd, 0xd3, 0x99, 0x30, 0xf4, 0x14, 0x85, 0x75, - 0x3a, 0xb4, 0x05, 0x13, 0xe9, 0x95, 0x55, 0x14, 0xb3, 0x2c, 0x35, 0xe3, 0x17, 0x2e, 0x0c, 0xf6, - 0x71, 0x6b, 0x5a, 0x49, 0x7e, 0x72, 0xd0, 0x21, 0xd8, 0xe0, 0x3c, 0xf7, 0x23, 0x30, 0xae, 0x0d, - 0xec, 0x51, 0xbc, 0xb2, 0xe7, 0x5e, 0x85, 0x99, 0xec, 0xd0, 0x1d, 0xc9, 0xab, 0xfb, 0x7f, 0x96, - 0x60, 0x3a, 0xe7, 0xe6, 0x8a, 0x25, 0x68, 0xce, 0x08, 0xd4, 0x34, 0x1f, 0xb3, 0x29, 0x16, 0x4b, - 0x03, 0x88, 0x45, 0x29, 0xa3, 0xcb, 0x85, 0x32, 0x5a, 0x88, 0xc2, 0xa1, 0x0f, 0x22, 0x0a, 0xcd, - 0xdd, 0x67, 0x78, 0xa0, 0xdd, 0xe7, 0x1e, 0x88, 0x4f, 0x63, 0x03, 0x1b, 0x1d, 0x60, 0x03, 0xfb, - 0xf9, 0x12, 0xcc, 0x64, 0xb3, 0x00, 0x1f, 0xc3, 0x7d, 0xc7, 0x6b, 0xc6, 0x7d, 0x47, 0x7e, 0xba, - 0xf3, 0x6c, 0x6e, 0xe2, 0xa2, 0xbb, 0x0f, 0x9c, 0xb9, 0xfb, 0x78, 0x72, 0x20, 0x6e, 0xbd, 0xef, - 0x41, 0xfe, 0x7e, 0x09, 0x4e, 0x65, 0x8b, 0x2c, 0xfb, 0x8e, 0xb7, 0x73, 0x0c, 0x7d, 0x73, 0xdd, - 0xe8, 0x9b, 0x67, 0x06, 0xf9, 0x1a, 0xd6, 0xb4, 0xc2, 0x0e, 0x7a, 0x23, 0xd3, 0x41, 0x0b, 0x83, - 0xb3, 0xec, 0xdd, 0x4b, 0xdf, 0xb2, 0xe0, 0x4c, 0x6e, 0xb9, 0x63, 0xb0, 0xbe, 0x5e, 0x33, 0xad, - 0xaf, 0x4f, 0x0c, 0xfc, 0x4d, 0x05, 0xe6, 0xd8, 0xaf, 0x94, 0x0b, 0xbe, 0x85, 0xd9, 0xaf, 0xae, - 0xc3, 0xb8, 0xd3, 0x6a, 0x91, 0x38, 0xbe, 0x1a, 0xba, 0x2a, 0xad, 0xd5, 0x33, 0x6c, 0x4f, 0x4a, - 0xc1, 0x87, 0xfb, 0xb5, 0xb9, 0x2c, 0x8b, 0x14, 0x8d, 0x75, 0x0e, 0x66, 0xaa, 0xbc, 0xd2, 0x3d, - 0x4d, 0x95, 0x77, 0x01, 0x60, 0x57, 0x9d, 0x6a, 0xb3, 0xc6, 0x30, 0xed, 0xbc, 0xab, 0x51, 0xa1, - 0x9f, 0x60, 0xba, 0x22, 0x77, 0x19, 0xe1, 0x97, 0x1c, 0xcf, 0x0d, 0x38, 0x56, 0xba, 0xfb, 0x09, - 0x0f, 0x84, 0x55, 0x86, 0x43, 0xc5, 0x12, 0xfd, 0x18, 0xcc, 0xc4, 0x3c, 0xd7, 0xc2, 0xb2, 0xef, - 0xc4, 0x2c, 0xfc, 0x42, 0xc8, 0x44, 0x16, 0xdd, 0xda, 0xcc, 0xe0, 0x70, 0x17, 0xb5, 0xfd, 0x8f, - 0xcb, 0xf0, 0x60, 0x8f, 0x29, 0x8a, 0x16, 0xcd, 0x2b, 0xde, 0xa7, 0xb2, 0xd6, 0x9d, 0xb9, 0xdc, - 0xc2, 0x86, 0xb9, 0x27, 0x33, 0xc6, 0xa5, 0x0f, 0x3c, 0xc6, 0x5f, 0xb2, 0x34, 0xbb, 0x1b, 0x77, - 0x04, 0xfd, 0xcc, 0x11, 0x97, 0xde, 0x0f, 0xaa, 0xa1, 0xfe, 0xf3, 0x16, 0x3c, 0x92, 0xfb, 0x59, - 0x86, 0xab, 0xc8, 0x02, 0x54, 0x5a, 0x14, 0xa8, 0x85, 0x48, 0xa5, 0x81, 0x8a, 0x12, 0x81, 0x53, - 0x1a, 0xc3, 0x23, 0xa4, 0xd4, 0xd7, 0x23, 0xe4, 0x5f, 0x5a, 0x70, 0x32, 0xdb, 0x88, 0x63, 0x90, - 0x4c, 0x6b, 0xa6, 0x64, 0xfa, 0xf8, 0x20, 0x43, 0x5e, 0x20, 0x94, 0xfe, 0x6c, 0x0a, 0x4e, 0x17, - 0xe4, 0xe8, 0xdf, 0x85, 0xd9, 0xcd, 0x16, 0x31, 0x83, 0xcf, 0xc4, 0xc7, 0xe4, 0xc6, 0xe9, 0xf5, - 0x8c, 0x54, 0xe3, 0xc7, 0x90, 0x2e, 0x12, 0xdc, 0x5d, 0x05, 0xfa, 0xbc, 0x05, 0x27, 0x9d, 0xdb, - 0x71, 0xd7, 0x9b, 0x39, 0x62, 0xce, 0x3c, 0x9f, 0x6b, 0x1d, 0xeb, 0xf3, 0xc6, 0x0e, 0x0b, 0x10, - 0x39, 0x99, 0x47, 0x85, 0x73, 0xeb, 0x42, 0x58, 0x64, 0xf6, 0xa3, 0x5a, 0x4e, 0x8f, 0xf0, 0xc8, - 0xbc, 0xe0, 0x15, 0x2e, 0xa3, 0x24, 0x06, 0x2b, 0x3e, 0xe8, 0x26, 0x54, 0x36, 0x65, 0x44, 0x99, - 0x90, 0x81, 0xb9, 0x9b, 0x4a, 0x6e, 0xd8, 0x19, 0xf7, 0xd8, 0x57, 0x28, 0x9c, 0xb2, 0x42, 0xaf, - 0x42, 0x39, 0xd8, 0x88, 0x7b, 0x3d, 0x52, 0x90, 0xf1, 0xa0, 0xe2, 0x71, 0xae, 0xd7, 0x56, 0x9b, - 0x98, 0x16, 0xa4, 0xe5, 0xa3, 0x5b, 0xae, 0x30, 0xe8, 0xe6, 0x96, 0xc7, 0x4b, 0xf5, 0xee, 0xf2, - 0x78, 0xa9, 0x8e, 0x69, 0x41, 0xb4, 0x0a, 0xc3, 0x2c, 0x40, 0x45, 0x58, 0x6b, 0x73, 0xe3, 0xf4, - 0xbb, 0x82, 0x6f, 0x78, 0xe0, 0x2b, 0x03, 0x63, 0x5e, 0x1c, 0xbd, 0x06, 0x23, 0x2d, 0x96, 0xb3, - 0x5f, 0x1c, 0xad, 0xf3, 0x73, 0x4f, 0x74, 0x65, 0xf5, 0xe7, 0x77, 0x54, 0x1c, 0x8e, 0x05, 0x07, - 0xb4, 0x0e, 0x23, 0x2d, 0xd2, 0xde, 0xda, 0x88, 0xc5, 0x89, 0xf9, 0x93, 0xb9, 0xbc, 0x7a, 0x3c, - 0x51, 0x21, 0xb8, 0x32, 0x0a, 0x2c, 0x78, 0xa1, 0x4f, 0x43, 0x69, 0xa3, 0x25, 0x62, 0x55, 0x72, - 0xad, 0xb4, 0x66, 0x30, 0xf2, 0xd2, 0xc8, 0xc1, 0x7e, 0xad, 0xb4, 0xba, 0x8c, 0x4b, 0x1b, 0x2d, - 0x74, 0x0d, 0x46, 0x37, 0x78, 0x44, 0xa9, 0xc8, 0xd4, 0xfa, 0x78, 0x7e, 0xb0, 0x6b, 0x57, 0xd0, - 0x29, 0x8f, 0xb1, 0x10, 0x08, 0x2c, 0x99, 0xa0, 0x75, 0x80, 0x0d, 0x15, 0x19, 0x2b, 0x52, 0xb5, - 0x7e, 0x7c, 0x90, 0xf8, 0x59, 0x71, 0x7c, 0x54, 0x50, 0xac, 0xf1, 0x41, 0x9f, 0x83, 0x8a, 0x23, - 0x5f, 0x61, 0x61, 0x69, 0x5a, 0xcd, 0x7d, 0x3a, 0x5d, 0x70, 0xbd, 0x1f, 0xa8, 0xe1, 0xb3, 0x55, - 0x11, 0xe1, 0x94, 0x29, 0xda, 0x86, 0xc9, 0xdd, 0xb8, 0xbd, 0x45, 0xe4, 0x02, 0x65, 0xb9, 0x5b, - 0xcd, 0xa3, 0x66, 0x9a, 0x68, 0x57, 0x10, 0x7a, 0x51, 0xd2, 0x71, 0xfc, 0x2e, 0x99, 0xc2, 0x02, - 0x72, 0x6e, 0xea, 0xcc, 0xb0, 0xc9, 0x9b, 0x76, 0xfa, 0x7b, 0x9d, 0xf0, 0xd6, 0x5e, 0x42, 0x44, - 0x46, 0xd7, 0xdc, 0x4e, 0x7f, 0x9d, 0x93, 0x74, 0x77, 0xba, 0x40, 0x60, 0xc9, 0x84, 0x2e, 0x61, - 0x47, 0xbe, 0x70, 0x24, 0xce, 0xc8, 0x4f, 0x14, 0x76, 0x4f, 0x57, 0x7b, 0xd3, 0x4e, 0x61, 0xb2, - 0x2f, 0x65, 0xc5, 0x64, 0x5e, 0x7b, 0x2b, 0x4c, 0xc2, 0x20, 0x23, 0x6f, 0x67, 0x8b, 0x65, 0x5e, - 0x23, 0x87, 0xbe, 0x5b, 0xe6, 0xe5, 0x51, 0xe1, 0xdc, 0xba, 0x90, 0x0b, 0x53, 0xed, 0x30, 0x4a, - 0x6e, 0x87, 0x91, 0x9c, 0x55, 0xa8, 0xc7, 0xe1, 0xc9, 0xa0, 0x14, 0x35, 0x32, 0xff, 0x5a, 0x13, - 0x83, 0x33, 0x3c, 0xe9, 0x90, 0xc4, 0x2d, 0xc7, 0x27, 0x6b, 0xd7, 0xab, 0x27, 0x8a, 0x87, 0xa4, - 0xc9, 0x49, 0xba, 0x87, 0x44, 0x20, 0xb0, 0x64, 0x42, 0xa5, 0x0f, 0x4b, 0x0e, 0xce, 0x52, 0xd0, - 0x16, 0x48, 0x9f, 0x2e, 0xcf, 0x53, 0x2e, 0x7d, 0x18, 0x18, 0xf3, 0xe2, 0x74, 0xe6, 0x0b, 0x9d, - 0x30, 0x8c, 0xab, 0xa7, 0x8a, 0x67, 0xbe, 0x50, 0x25, 0xaf, 0x37, 0x7b, 0xcd, 0x7c, 0x45, 0x84, - 0x53, 0xa6, 0xf6, 0x17, 0x46, 0xba, 0xb5, 0x05, 0xa6, 0xfb, 0x7f, 0xc1, 0xea, 0xba, 0x3e, 0xfd, - 0xd4, 0xa0, 0x07, 0xd6, 0x7b, 0x78, 0x91, 0xfa, 0x79, 0x0b, 0x4e, 0xb7, 0x73, 0x3f, 0x4a, 0x6c, - 0xbd, 0x83, 0x9d, 0x7b, 0x79, 0x37, 0xa8, 0xe4, 0xce, 0xf9, 0x78, 0x5c, 0x50, 0x53, 0x56, 0x47, - 0x2e, 0x7f, 0x60, 0x1d, 0xf9, 0x2a, 0x8c, 0x31, 0xf5, 0x2e, 0x4d, 0x24, 0x33, 0x90, 0x13, 0x12, - 0xdb, 0xc4, 0x97, 0x45, 0x41, 0xac, 0x58, 0xa0, 0x9f, 0xb5, 0xe0, 0xe1, 0x6c, 0xd3, 0x31, 0x61, - 0x68, 0x91, 0x98, 0x90, 0x1f, 0x3b, 0x56, 0xc5, 0xf7, 0x3f, 0xdc, 0xe8, 0x45, 0x7c, 0xd8, 0x8f, - 0x00, 0xf7, 0xae, 0x0c, 0xd5, 0x73, 0xce, 0x3d, 0x23, 0xe6, 0xed, 0x4a, 0xff, 0xb3, 0xcf, 0xf1, - 0x6a, 0xee, 0x5f, 0xb5, 0x72, 0x54, 0x4e, 0x7e, 0xc6, 0x7a, 0xc5, 0x3c, 0x63, 0x3d, 0x96, 0x3d, - 0x63, 0x75, 0x59, 0x4c, 0x8c, 0xe3, 0xd5, 0xe0, 0xa9, 0x53, 0x07, 0xcd, 0x99, 0x63, 0xfb, 0x70, - 0xae, 0x9f, 0x98, 0x65, 0x2e, 0x55, 0xae, 0xba, 0x6b, 0x4c, 0x5d, 0xaa, 0xdc, 0xb5, 0x3a, 0x66, - 0x98, 0x41, 0xb3, 0x2f, 0xd8, 0xff, 0xd5, 0x82, 0x72, 0x23, 0x74, 0x8f, 0xc1, 0x02, 0xf4, 0x19, - 0xc3, 0x02, 0xf4, 0x60, 0xc1, 0xcb, 0x87, 0x85, 0xf6, 0x9e, 0x95, 0x8c, 0xbd, 0xe7, 0xe1, 0x22, - 0x06, 0xbd, 0xad, 0x3b, 0xff, 0xa0, 0x0c, 0xfa, 0x3b, 0x8d, 0xe8, 0x5f, 0xdf, 0x8d, 0x6f, 0x6e, - 0xb9, 0xd7, 0xd3, 0x8d, 0x82, 0x33, 0xf3, 0xc4, 0x92, 0x61, 0x7f, 0x3f, 0x60, 0x2e, 0xba, 0x6f, - 0x10, 0x6f, 0x73, 0x2b, 0x21, 0x6e, 0xf6, 0x73, 0x8e, 0xcf, 0x45, 0xf7, 0x3f, 0x5b, 0x30, 0x9d, - 0xa9, 0x1d, 0xf9, 0x79, 0x31, 0x44, 0x77, 0x69, 0xd3, 0x99, 0xed, 0x1b, 0x74, 0x34, 0x0f, 0xa0, - 0xcc, 0xeb, 0xd2, 0x6e, 0xc2, 0xb4, 0x58, 0x65, 0x7f, 0x8f, 0xb1, 0x46, 0x81, 0x5e, 0x80, 0xf1, - 0x24, 0x6c, 0x87, 0x7e, 0xb8, 0xb9, 0x77, 0x99, 0xc8, 0x7c, 0x1f, 0xea, 0x12, 0x64, 0x3d, 0x45, - 0x61, 0x9d, 0xce, 0xfe, 0x95, 0x32, 0x64, 0xdf, 0xf6, 0xfc, 0x7f, 0x73, 0xf2, 0xa3, 0x39, 0x27, - 0xbf, 0x6d, 0xc1, 0x0c, 0xad, 0x9d, 0x79, 0xb9, 0x48, 0xe7, 0x56, 0xf5, 0xc6, 0x82, 0xd5, 0xe3, - 0x8d, 0x85, 0xc7, 0xa8, 0xec, 0x72, 0xc3, 0x4e, 0x22, 0xec, 0x3b, 0x9a, 0x70, 0xa2, 0x50, 0x2c, - 0xb0, 0x82, 0x8e, 0x44, 0x91, 0x88, 0x0c, 0xd2, 0xe9, 0x48, 0x14, 0x61, 0x81, 0x95, 0x4f, 0x30, - 0x0c, 0x15, 0x3c, 0xc1, 0xc0, 0x52, 0x65, 0x09, 0xcf, 0x0a, 0xa1, 0x1a, 0x68, 0xa9, 0xb2, 0xa4, - 0xcb, 0x45, 0x4a, 0x63, 0x7f, 0xad, 0x0c, 0x13, 0x8d, 0xd0, 0x4d, 0xfd, 0xe1, 0x9f, 0x37, 0xfc, - 0xe1, 0xcf, 0x65, 0xfc, 0xe1, 0x67, 0x74, 0xda, 0x7b, 0xe3, 0x0e, 0x2f, 0x12, 0xa9, 0xb1, 0x07, - 0x41, 0xee, 0xd2, 0x15, 0xde, 0x48, 0xa4, 0xa6, 0x18, 0x61, 0x93, 0xef, 0x0f, 0x93, 0x0b, 0xfc, - 0x5f, 0x5a, 0x30, 0xd5, 0x08, 0x5d, 0x3a, 0x41, 0x7f, 0x98, 0x66, 0xa3, 0x9e, 0x88, 0x6d, 0xa4, - 0x47, 0x22, 0xb6, 0x7f, 0x68, 0xc1, 0x68, 0x23, 0x74, 0x8f, 0xc1, 0xf6, 0xf9, 0x8a, 0x69, 0xfb, - 0x7c, 0xa0, 0x40, 0xca, 0x16, 0x98, 0x3b, 0x7f, 0xb3, 0x0c, 0x93, 0xb4, 0x9d, 0xe1, 0xa6, 0x1c, - 0x25, 0xa3, 0x47, 0xac, 0x01, 0x7a, 0x84, 0x2a, 0x73, 0xa1, 0xef, 0x87, 0xb7, 0xb3, 0x23, 0xb6, - 0xca, 0xa0, 0x58, 0x60, 0xd1, 0xd3, 0x30, 0xd6, 0x8e, 0xc8, 0xae, 0x17, 0x76, 0xe2, 0x6c, 0x6c, - 0x61, 0x43, 0xc0, 0xb1, 0xa2, 0x40, 0xcf, 0xc3, 0x44, 0xec, 0x05, 0x2d, 0x22, 0xbd, 0x2d, 0x86, - 0x98, 0xb7, 0x05, 0xcf, 0x65, 0xa9, 0xc1, 0xb1, 0x41, 0x85, 0xde, 0x80, 0x0a, 0xfb, 0xcf, 0xd6, - 0xcd, 0xd1, 0x5f, 0x58, 0xe0, 0x47, 0x55, 0xc9, 0x00, 0xa7, 0xbc, 0xd0, 0x05, 0x80, 0x44, 0xfa, - 0x85, 0xc4, 0x22, 0xf4, 0x55, 0x69, 0x94, 0xca, 0x63, 0x24, 0xc6, 0x1a, 0x15, 0x7a, 0x0a, 0x2a, - 0x89, 0xe3, 0xf9, 0x57, 0xbc, 0x80, 0xc4, 0xc2, 0xaf, 0x46, 0xe4, 0x87, 0x16, 0x40, 0x9c, 0xe2, - 0xe9, 0x8e, 0xce, 0x02, 0xab, 0xf9, 0xfb, 0x2c, 0x63, 0x8c, 0x9a, 0xed, 0xe8, 0x57, 0x14, 0x14, - 0x6b, 0x14, 0xf6, 0x4b, 0x70, 0xaa, 0x11, 0xba, 0x8d, 0x30, 0x4a, 0x56, 0xc3, 0xe8, 0xb6, 0x13, - 0xb9, 0x72, 0xfc, 0x6a, 0x32, 0x55, 0x31, 0xdd, 0x75, 0x87, 0xf9, 0xb9, 0xde, 0x48, 0x42, 0xfc, - 0x1c, 0xdb, 0xd3, 0x8f, 0x18, 0x04, 0xf1, 0xef, 0x4a, 0x80, 0x1a, 0xcc, 0x73, 0xc5, 0x78, 0xc4, - 0xe7, 0x1d, 0x98, 0x8a, 0xc9, 0x15, 0x2f, 0xe8, 0xdc, 0x11, 0xac, 0x7a, 0x45, 0x98, 0x34, 0x57, - 0x74, 0x4a, 0x6e, 0x1b, 0x31, 0x61, 0x38, 0xc3, 0x8d, 0x76, 0x61, 0xd4, 0x09, 0x16, 0xe3, 0x1b, - 0x31, 0x89, 0xc4, 0xa3, 0x35, 0xac, 0x0b, 0xb1, 0x04, 0xe2, 0x14, 0x4f, 0xa7, 0x0c, 0xfb, 0x73, - 0x2d, 0x0c, 0x70, 0x18, 0x26, 0x72, 0x92, 0xb1, 0x67, 0x0f, 0x34, 0x38, 0x36, 0xa8, 0xd0, 0x2a, - 0xa0, 0xb8, 0xd3, 0x6e, 0xfb, 0xec, 0xa2, 0xcf, 0xf1, 0x2f, 0x46, 0x61, 0xa7, 0xcd, 0x5d, 0x8f, - 0xc5, 0x8b, 0x01, 0xcd, 0x2e, 0x2c, 0xce, 0x29, 0x41, 0x05, 0xc3, 0x46, 0xcc, 0x7e, 0x8b, 0xd8, - 0x6a, 0x6e, 0xa5, 0x6c, 0x32, 0x10, 0x96, 0x38, 0xfb, 0xa7, 0xd9, 0x66, 0xc6, 0xde, 0x1a, 0x49, - 0x3a, 0x11, 0x41, 0x3b, 0x30, 0xd9, 0x66, 0x1b, 0x56, 0x12, 0x85, 0xbe, 0x4f, 0xa4, 0xde, 0x78, - 0x77, 0x5e, 0x34, 0xfc, 0xed, 0x01, 0x9d, 0x1d, 0x36, 0xb9, 0xdb, 0x5f, 0x98, 0x66, 0x72, 0xa9, - 0xc9, 0x0f, 0x2d, 0xa3, 0xc2, 0x37, 0x56, 0x68, 0x68, 0x73, 0xc5, 0x6f, 0x7b, 0xa5, 0x92, 0x5e, - 0xf8, 0xd7, 0x62, 0x59, 0x16, 0xbd, 0xce, 0x7c, 0xb6, 0xb9, 0x30, 0xe8, 0xf7, 0xaa, 0x20, 0xa7, - 0x32, 0xfc, 0xb5, 0x45, 0x41, 0xac, 0x31, 0x41, 0x57, 0x60, 0x52, 0x3c, 0x4d, 0x21, 0x4c, 0x08, - 0x65, 0xe3, 0xf8, 0x3b, 0x89, 0x75, 0xe4, 0x61, 0x16, 0x80, 0xcd, 0xc2, 0x68, 0x13, 0x1e, 0xd6, - 0x1e, 0x52, 0xca, 0xf1, 0xe4, 0xe2, 0xb2, 0xe5, 0x91, 0x83, 0xfd, 0xda, 0xc3, 0xeb, 0xbd, 0x08, - 0x71, 0x6f, 0x3e, 0xe8, 0x3a, 0x9c, 0x72, 0x5a, 0x89, 0xb7, 0x4b, 0xea, 0xc4, 0x71, 0x7d, 0x2f, - 0x20, 0x66, 0xb0, 0xfd, 0x99, 0x83, 0xfd, 0xda, 0xa9, 0xc5, 0x3c, 0x02, 0x9c, 0x5f, 0x0e, 0xbd, - 0x02, 0x15, 0x37, 0x88, 0x45, 0x1f, 0x8c, 0x18, 0x6f, 0x84, 0x55, 0xea, 0xd7, 0x9a, 0xea, 0xfb, - 0xd3, 0x3f, 0x38, 0x2d, 0x80, 0x36, 0x61, 0x42, 0x0f, 0xa8, 0x11, 0xef, 0xcb, 0x3d, 0xd3, 0xe3, - 0x6c, 0x6b, 0x44, 0xa1, 0x70, 0xfb, 0x99, 0xf2, 0x93, 0x34, 0x02, 0x54, 0x0c, 0xc6, 0xe8, 0x35, - 0x40, 0x31, 0x89, 0x76, 0xbd, 0x16, 0x59, 0x6c, 0xb1, 0x64, 0xaf, 0xcc, 0xea, 0x32, 0x66, 0x38, - 0xfd, 0xa3, 0x66, 0x17, 0x05, 0xce, 0x29, 0x85, 0x2e, 0x51, 0x89, 0xa2, 0x43, 0x85, 0x5b, 0xab, - 0x54, 0xf3, 0xaa, 0x75, 0xd2, 0x8e, 0x48, 0xcb, 0x49, 0x88, 0x6b, 0x72, 0xc4, 0x99, 0x72, 0x74, - 0xbf, 0x51, 0x39, 0xf4, 0xc1, 0x74, 0xc6, 0xec, 0xce, 0xa3, 0x4f, 0x4f, 0x48, 0x5b, 0x61, 0x9c, - 0x5c, 0x23, 0xc9, 0xed, 0x30, 0xda, 0x16, 0x19, 0xb2, 0xd2, 0x04, 0x7a, 0x29, 0x0a, 0xeb, 0x74, - 0x54, 0x23, 0x62, 0xd7, 0x59, 0x6b, 0x75, 0x76, 0xe3, 0x30, 0x96, 0xae, 0x93, 0x4b, 0x1c, 0x8c, - 0x25, 0x5e, 0x92, 0xae, 0x35, 0x96, 0xd9, 0x3d, 0x42, 0x86, 0x74, 0xad, 0xb1, 0x8c, 0x25, 0x1e, - 0x91, 0xee, 0xf7, 0xd7, 0xa6, 0x8a, 0x6f, 0x80, 0xba, 0xe5, 0xf2, 0x80, 0x4f, 0xb0, 0x05, 0x30, - 0xa3, 0x5e, 0x7e, 0xe3, 0xa9, 0xc3, 0xe2, 0xea, 0x34, 0x9b, 0x24, 0x83, 0xe7, 0x1d, 0x53, 0x56, - 0xb5, 0xb5, 0x0c, 0x27, 0xdc, 0xc5, 0xdb, 0x48, 0xe2, 0x30, 0xd3, 0xf7, 0x0d, 0x84, 0x05, 0xa8, - 0xc4, 0x9d, 0x5b, 0x6e, 0xb8, 0xe3, 0x78, 0x01, 0x33, 0xfb, 0xeb, 0x4f, 0xd6, 0x4b, 0x04, 0x4e, - 0x69, 0xd0, 0x2a, 0x8c, 0x39, 0xe2, 0xf0, 0x25, 0x0c, 0xf5, 0xb9, 0x51, 0xdd, 0xf2, 0x80, 0xc6, - 0x2d, 0x9a, 0xf2, 0x1f, 0x56, 0x65, 0xd1, 0xcb, 0x30, 0x29, 0x02, 0x8f, 0x84, 0xcf, 0xe0, 0x09, - 0xd3, 0x47, 0xbd, 0xa9, 0x23, 0xb1, 0x49, 0x8b, 0x7e, 0x02, 0xa6, 0x28, 0x97, 0x54, 0xb0, 0x55, - 0x4f, 0x0e, 0x22, 0x11, 0xb5, 0xdc, 0xd6, 0x7a, 0x61, 0x9c, 0x61, 0x86, 0x5c, 0x78, 0xc8, 0xe9, - 0x24, 0xe1, 0x0e, 0x9d, 0xe1, 0xe6, 0xfc, 0x5f, 0x0f, 0xb7, 0x49, 0xc0, 0xec, 0xf4, 0x63, 0x4b, - 0xe7, 0x0e, 0xf6, 0x6b, 0x0f, 0x2d, 0xf6, 0xa0, 0xc3, 0x3d, 0xb9, 0xa0, 0x1b, 0x30, 0x9e, 0x84, - 0xbe, 0x70, 0xf6, 0x8d, 0xab, 0xa7, 0x8b, 0x93, 0xd0, 0xac, 0x2b, 0x32, 0xdd, 0x9c, 0xa0, 0x8a, - 0x62, 0x9d, 0x0f, 0x5a, 0xe7, 0x6b, 0x8c, 0xa5, 0x4c, 0x24, 0x71, 0xf5, 0x81, 0xe2, 0x8e, 0x51, - 0x99, 0x15, 0xcd, 0x25, 0x28, 0x4a, 0x62, 0x9d, 0x0d, 0xba, 0x08, 0xb3, 0xed, 0xc8, 0x0b, 0xd9, - 0xc4, 0x56, 0x26, 0xdf, 0xaa, 0x91, 0x9e, 0x6c, 0xb6, 0x91, 0x25, 0xc0, 0xdd, 0x65, 0xd0, 0x79, - 0xaa, 0xa0, 0x72, 0x60, 0xf5, 0x0c, 0x7f, 0x1b, 0x83, 0x2b, 0xa7, 0x1c, 0x86, 0x15, 0x76, 0xee, - 0x47, 0x61, 0xb6, 0x4b, 0x52, 0x1e, 0xc9, 0xf1, 0xf2, 0xd7, 0x86, 0xa1, 0xa2, 0xcc, 0x81, 0x68, - 0xc1, 0xb4, 0xf2, 0x9e, 0xc9, 0x5a, 0x79, 0xc7, 0xa8, 0xbe, 0xa6, 0x1b, 0x76, 0xd7, 0x73, 0x9e, - 0xf7, 0x3e, 0x57, 0x20, 0x1a, 0x06, 0x8f, 0x92, 0x3a, 0xc2, 0xd3, 0xe7, 0xe9, 0x81, 0x71, 0xa8, - 0xe7, 0x81, 0x71, 0xc0, 0xa7, 0xf6, 0xe8, 0xd1, 0xb0, 0x1d, 0xba, 0x6b, 0x8d, 0xec, 0xdb, 0x53, - 0x0d, 0x0a, 0xc4, 0x1c, 0xc7, 0x94, 0x7b, 0xba, 0xad, 0x33, 0xe5, 0x7e, 0xf4, 0x2e, 0x95, 0x7b, - 0xc9, 0x00, 0xa7, 0xbc, 0x90, 0x0f, 0xb3, 0x2d, 0xf3, 0xd9, 0x30, 0x15, 0x19, 0xf5, 0x68, 0xdf, - 0x07, 0xbc, 0x3a, 0xda, 0x5b, 0x22, 0xcb, 0x59, 0x2e, 0xb8, 0x9b, 0x31, 0x7a, 0x19, 0xc6, 0xde, - 0x0b, 0x63, 0x36, 0xed, 0xc4, 0xde, 0x26, 0x63, 0x51, 0xc6, 0x5e, 0xbf, 0xde, 0x64, 0xf0, 0xc3, - 0xfd, 0xda, 0x78, 0x23, 0x74, 0xe5, 0x5f, 0xac, 0x0a, 0xa0, 0x3b, 0x70, 0xca, 0x90, 0x08, 0xaa, - 0xb9, 0x30, 0x78, 0x73, 0x1f, 0x16, 0xd5, 0x9d, 0x5a, 0xcb, 0xe3, 0x84, 0xf3, 0x2b, 0xb0, 0xbf, - 0xce, 0x8d, 0x9e, 0xc2, 0x34, 0x42, 0xe2, 0x8e, 0x7f, 0x1c, 0x0f, 0x06, 0xac, 0x18, 0x56, 0x9b, - 0xbb, 0x36, 0xac, 0xff, 0xbe, 0xc5, 0x0c, 0xeb, 0xeb, 0x64, 0xa7, 0xed, 0x3b, 0xc9, 0x71, 0xb8, - 0xdb, 0xbe, 0x0e, 0x63, 0x89, 0xa8, 0xad, 0xd7, 0x1b, 0x07, 0x5a, 0xa3, 0xd8, 0xe5, 0x82, 0xda, - 0x10, 0x25, 0x14, 0x2b, 0x36, 0xf6, 0x3f, 0xe7, 0x23, 0x20, 0x31, 0xc7, 0x60, 0x5b, 0xa8, 0x9b, - 0xb6, 0x85, 0x5a, 0x9f, 0x2f, 0x28, 0xb0, 0x31, 0xfc, 0x33, 0xb3, 0xdd, 0xec, 0xec, 0xf1, 0x51, - 0xbf, 0xd1, 0xb1, 0x7f, 0xd1, 0x82, 0x93, 0x79, 0x57, 0xfa, 0x54, 0x89, 0xe1, 0x27, 0x1f, 0x75, - 0xc3, 0xa5, 0x7a, 0xf0, 0xa6, 0x80, 0x63, 0x45, 0x31, 0x70, 0x9e, 0xf1, 0xa3, 0x25, 0x5e, 0xba, - 0x0e, 0xe6, 0x0b, 0x73, 0xe8, 0x55, 0xee, 0x3f, 0x6f, 0xa9, 0x27, 0xe0, 0x8e, 0xe6, 0x3b, 0x6f, - 0xff, 0x6a, 0x09, 0x4e, 0x72, 0x13, 0xf5, 0xe2, 0x6e, 0xe8, 0xb9, 0x8d, 0xd0, 0x15, 0xd1, 0x04, - 0x6f, 0xc1, 0x44, 0x5b, 0x3b, 0xae, 0xf6, 0x4a, 0xfd, 0xa2, 0x1f, 0x6b, 0xd3, 0x63, 0x83, 0x0e, - 0xc5, 0x06, 0x2f, 0xe4, 0xc2, 0x04, 0xd9, 0xf5, 0x5a, 0xca, 0xce, 0x59, 0x3a, 0xb2, 0x48, 0x57, - 0xb5, 0xac, 0x68, 0x7c, 0xb0, 0xc1, 0xf5, 0x3e, 0xbc, 0x06, 0x62, 0x7f, 0xd9, 0x82, 0x07, 0x0a, - 0x12, 0xc5, 0xd0, 0xea, 0x6e, 0xb3, 0xcb, 0x00, 0xf1, 0x5c, 0xa1, 0xaa, 0x8e, 0x5f, 0x11, 0x60, - 0x81, 0x45, 0x3f, 0x0e, 0xc0, 0x4d, 0xfc, 0xec, 0x71, 0xf8, 0x52, 0xef, 0x48, 0x74, 0x23, 0x81, - 0x82, 0x16, 0x65, 0xaf, 0x9e, 0x83, 0xd7, 0x78, 0xd9, 0xbf, 0x5c, 0x86, 0x61, 0xfe, 0x76, 0xf5, - 0x2a, 0x8c, 0x6e, 0xf1, 0xb4, 0xb4, 0x83, 0x64, 0xc0, 0x4d, 0x8f, 0x23, 0x1c, 0x80, 0x65, 0x61, - 0x74, 0x15, 0x4e, 0x88, 0x88, 0x95, 0x3a, 0xf1, 0x9d, 0x3d, 0x79, 0xaa, 0xe5, 0x4f, 0x44, 0xc8, - 0xf4, 0xe5, 0x27, 0xd6, 0xba, 0x49, 0x70, 0x5e, 0x39, 0xf4, 0x6a, 0x57, 0x32, 0x3a, 0x9e, 0xd0, - 0x57, 0xe9, 0xc0, 0x7d, 0x12, 0xd2, 0xbd, 0x0c, 0x93, 0xed, 0xae, 0xf3, 0xbb, 0xf6, 0x6c, 0xb0, - 0x79, 0x66, 0x37, 0x69, 0x99, 0x7f, 0x40, 0x87, 0x79, 0x43, 0xac, 0x6f, 0x45, 0x24, 0xde, 0x0a, - 0x7d, 0x57, 0xbc, 0x91, 0x99, 0xfa, 0x07, 0x64, 0xf0, 0xb8, 0xab, 0x04, 0xe5, 0xb2, 0xe1, 0x78, - 0x7e, 0x27, 0x22, 0x29, 0x97, 0x11, 0x93, 0xcb, 0x6a, 0x06, 0x8f, 0xbb, 0x4a, 0xd0, 0x79, 0x74, - 0x4a, 0x3c, 0xb0, 0x28, 0xe3, 0x98, 0x95, 0xd3, 0xc7, 0xa8, 0xf4, 0x54, 0xef, 0x91, 0x5b, 0x43, - 0x5c, 0xf9, 0xab, 0x27, 0x1a, 0xb5, 0xa7, 0xbb, 0x84, 0x8f, 0xba, 0xe4, 0x72, 0x37, 0xcf, 0xfc, - 0xfd, 0xa9, 0x05, 0x27, 0x72, 0x1c, 0xc1, 0xb8, 0xa8, 0xda, 0xf4, 0xe2, 0x44, 0xbd, 0x4c, 0xa0, - 0x89, 0x2a, 0x0e, 0xc7, 0x8a, 0x82, 0xae, 0x07, 0x2e, 0x0c, 0xb3, 0x02, 0x50, 0x38, 0x6f, 0x08, - 0xec, 0xd1, 0x04, 0x20, 0x3a, 0x07, 0x43, 0x9d, 0x98, 0x44, 0xf2, 0x6d, 0x3c, 0x29, 0xbf, 0x99, - 0x45, 0x90, 0x61, 0xa8, 0x46, 0xb9, 0xa9, 0x8c, 0x71, 0x9a, 0x46, 0xc9, 0xcd, 0x71, 0x1c, 0x67, - 0x7f, 0xa9, 0x0c, 0xd3, 0x19, 0x57, 0x4e, 0xda, 0x90, 0x9d, 0x30, 0xf0, 0x92, 0x50, 0xe5, 0x42, - 0xe3, 0xa9, 0x1f, 0x48, 0x7b, 0xeb, 0xaa, 0x80, 0x63, 0x45, 0x81, 0x1e, 0x93, 0x8f, 0xa6, 0x66, - 0x5f, 0x5c, 0x58, 0xaa, 0x1b, 0xef, 0xa6, 0x0e, 0xfa, 0x74, 0xca, 0xa3, 0x30, 0xd4, 0x0e, 0xd5, - 0x8b, 0xd6, 0x6a, 0x3c, 0xf1, 0x52, 0xbd, 0x11, 0x86, 0x3e, 0x66, 0x48, 0xf4, 0x09, 0xf1, 0xf5, - 0x99, 0xfb, 0x0a, 0xec, 0xb8, 0x61, 0xac, 0x75, 0xc1, 0x13, 0x30, 0xba, 0x4d, 0xf6, 0x22, 0x2f, - 0xd8, 0xcc, 0xde, 0xd6, 0x5c, 0xe6, 0x60, 0x2c, 0xf1, 0x66, 0xea, 0xf1, 0xd1, 0xfb, 0xf2, 0xfa, - 0xc9, 0x58, 0xdf, 0x5d, 0xed, 0x37, 0x2d, 0x98, 0x66, 0x79, 0x47, 0x45, 0xc4, 0xbc, 0x17, 0x06, - 0xc7, 0xa0, 0x27, 0x3c, 0x0a, 0xc3, 0x11, 0xad, 0x34, 0xfb, 0xa4, 0x01, 0x6b, 0x09, 0xe6, 0x38, - 0xf4, 0x10, 0x0c, 0xb1, 0x26, 0xd0, 0xc1, 0x9b, 0xe0, 0x99, 0xc7, 0xeb, 0x4e, 0xe2, 0x60, 0x06, - 0x65, 0xa1, 0x4b, 0x98, 0xb4, 0x7d, 0x8f, 0x37, 0x3a, 0x35, 0xb7, 0x7e, 0x34, 0x42, 0x97, 0x72, - 0x9b, 0xf6, 0xc1, 0x42, 0x97, 0xf2, 0x59, 0xf6, 0xd6, 0xc1, 0xff, 0x5b, 0x09, 0xce, 0xe6, 0x96, - 0x4b, 0x6f, 0x76, 0x57, 0x8d, 0x9b, 0xdd, 0x0b, 0x99, 0x9b, 0x5d, 0xbb, 0x77, 0xe9, 0x7b, 0x73, - 0xd7, 0x9b, 0x7f, 0x05, 0x5b, 0x3e, 0xc6, 0x2b, 0xd8, 0xa1, 0x41, 0xd5, 0x94, 0xe1, 0x3e, 0x6a, - 0xca, 0xb7, 0x2c, 0x38, 0x93, 0xdb, 0x65, 0x1f, 0x91, 0x58, 0xb1, 0xdc, 0xb6, 0x15, 0x9c, 0x21, - 0xbe, 0x5f, 0x2a, 0xf8, 0x16, 0x76, 0x9a, 0x38, 0x4f, 0xe5, 0x0c, 0x43, 0xc6, 0x42, 0xed, 0x9a, - 0xe0, 0x32, 0x86, 0xc3, 0xb0, 0xc2, 0x22, 0x4f, 0x8b, 0xba, 0xe2, 0x4d, 0x7b, 0xf9, 0x48, 0x4b, - 0x66, 0xde, 0xb4, 0x8e, 0xeb, 0xe1, 0xfd, 0xd9, 0x08, 0xac, 0xab, 0xda, 0x09, 0xb0, 0x3c, 0xf8, - 0x09, 0x70, 0x22, 0xff, 0xf4, 0x87, 0x16, 0x61, 0x7a, 0xc7, 0x0b, 0xd8, 0xbb, 0xa4, 0xa6, 0xde, - 0xa3, 0x42, 0x55, 0xaf, 0x9a, 0x68, 0x9c, 0xa5, 0x9f, 0x7b, 0x19, 0x26, 0xef, 0xde, 0x64, 0xf5, - 0xed, 0x32, 0x3c, 0xd8, 0x63, 0xd9, 0x73, 0x59, 0x6f, 0x8c, 0x81, 0x26, 0xeb, 0xbb, 0xc6, 0xa1, - 0x01, 0x27, 0x37, 0x3a, 0xbe, 0xbf, 0xc7, 0xbc, 0x9c, 0x88, 0x2b, 0x29, 0x84, 0x62, 0xa2, 0x92, - 0x0a, 0xaf, 0xe6, 0xd0, 0xe0, 0xdc, 0x92, 0xe8, 0x35, 0x40, 0xe1, 0x2d, 0x96, 0xe8, 0xd6, 0x4d, - 0x93, 0x16, 0xb0, 0x8e, 0x2f, 0xa7, 0x8b, 0xf1, 0x7a, 0x17, 0x05, 0xce, 0x29, 0x45, 0x35, 0x4c, - 0xf6, 0x9a, 0xba, 0x6a, 0x56, 0x46, 0xc3, 0xc4, 0x3a, 0x12, 0x9b, 0xb4, 0xe8, 0x22, 0xcc, 0x3a, - 0xbb, 0x8e, 0xc7, 0x93, 0x58, 0x49, 0x06, 0x5c, 0xc5, 0x54, 0x86, 0xa2, 0xc5, 0x2c, 0x01, 0xee, - 0x2e, 0x83, 0x36, 0x0c, 0x2b, 0x1f, 0xcf, 0xa1, 0x7f, 0x61, 0xe0, 0xd9, 0x3a, 0xb0, 0xdd, 0xcf, - 0xfe, 0x8f, 0x16, 0xdd, 0xbe, 0x72, 0x1e, 0xc2, 0xa4, 0xfd, 0xa0, 0xec, 0x57, 0x5a, 0xc4, 0x98, - 0xea, 0x87, 0x65, 0x1d, 0x89, 0x4d, 0x5a, 0x3e, 0x21, 0xe2, 0xd4, 0x5d, 0xda, 0xd0, 0x13, 0x45, - 0x88, 0xa5, 0xa2, 0x40, 0x6f, 0xc2, 0xa8, 0xeb, 0xed, 0x7a, 0x71, 0x18, 0x89, 0xc5, 0x72, 0xd4, - 0x07, 0xa0, 0x95, 0x1c, 0xac, 0x73, 0x36, 0x58, 0xf2, 0xb3, 0xbf, 0x54, 0x82, 0x49, 0x59, 0xe3, - 0xeb, 0x9d, 0x30, 0x71, 0x8e, 0x61, 0x5b, 0xbe, 0x68, 0x6c, 0xcb, 0x9f, 0xe8, 0x15, 0x67, 0xca, - 0x9a, 0x54, 0xb8, 0x1d, 0x5f, 0xcf, 0x6c, 0xc7, 0x8f, 0xf7, 0x67, 0xd5, 0x7b, 0x1b, 0xfe, 0x1d, - 0x0b, 0x66, 0x0d, 0xfa, 0x63, 0xd8, 0x0d, 0x56, 0xcd, 0xdd, 0xe0, 0x91, 0xbe, 0xdf, 0x50, 0xb0, - 0x0b, 0x7c, 0xb5, 0x94, 0x69, 0x3b, 0x93, 0xfe, 0xef, 0xc1, 0xd0, 0x96, 0x13, 0xb9, 0xbd, 0x52, - 0x31, 0x76, 0x15, 0x9a, 0xbf, 0xe4, 0x44, 0x2e, 0x97, 0xe1, 0x4f, 0xab, 0x37, 0xba, 0x9c, 0xc8, - 0xed, 0x1b, 0x1d, 0xc0, 0xaa, 0x42, 0x2f, 0xc1, 0x48, 0xdc, 0x0a, 0xdb, 0xca, 0xf7, 0xf2, 0x1c, - 0x7f, 0xbf, 0x8b, 0x42, 0x0e, 0xf7, 0x6b, 0xc8, 0xac, 0x8e, 0x82, 0xb1, 0xa0, 0x9f, 0xdb, 0x84, - 0x8a, 0xaa, 0xfa, 0xbe, 0x7a, 0x95, 0xff, 0x51, 0x19, 0x4e, 0xe4, 0xcc, 0x0b, 0x14, 0x1b, 0xbd, - 0xf5, 0xec, 0x80, 0xd3, 0xe9, 0x03, 0xf6, 0x57, 0xcc, 0x4e, 0x2c, 0xae, 0x18, 0xff, 0x81, 0x2b, - 0xbd, 0x11, 0x93, 0x6c, 0xa5, 0x14, 0xd4, 0xbf, 0x52, 0x5a, 0xd9, 0xb1, 0x75, 0x35, 0xad, 0x48, - 0xb5, 0xf4, 0xbe, 0x8e, 0xe9, 0x9f, 0x97, 0xe1, 0x64, 0x5e, 0x78, 0x3a, 0xfa, 0xa9, 0xcc, 0xc3, - 0x0e, 0xcf, 0x0f, 0x1a, 0xd8, 0xce, 0x5f, 0x7b, 0x10, 0x59, 0x5f, 0xe6, 0xcd, 0xa7, 0x1e, 0xfa, - 0x76, 0xb3, 0xa8, 0x93, 0x85, 0xeb, 0x44, 0xfc, 0x41, 0x0e, 0xb9, 0xc4, 0x3f, 0x35, 0x70, 0x03, - 0xc4, 0x4b, 0x1e, 0x71, 0x26, 0x5c, 0x47, 0x82, 0xfb, 0x87, 0xeb, 0xc8, 0x9a, 0xe7, 0x3c, 0x18, - 0xd7, 0xbe, 0xe6, 0xbe, 0x8e, 0xf8, 0x36, 0xdd, 0x51, 0xb4, 0x76, 0xdf, 0xd7, 0x51, 0xff, 0xb2, - 0x05, 0x19, 0x3f, 0x29, 0x65, 0xff, 0xb0, 0x0a, 0xed, 0x1f, 0xe7, 0x60, 0x28, 0x0a, 0x7d, 0x92, - 0xcd, 0xf5, 0x8f, 0x43, 0x9f, 0x60, 0x86, 0x51, 0x0f, 0xf2, 0x96, 0x8b, 0x1e, 0xe4, 0xa5, 0x47, - 0x63, 0x9f, 0xec, 0x12, 0x69, 0x8d, 0x50, 0x32, 0xf9, 0x0a, 0x05, 0x62, 0x8e, 0xb3, 0x7f, 0x7d, - 0x08, 0x4e, 0xe4, 0x04, 0xa7, 0xd1, 0x83, 0xca, 0xa6, 0x93, 0x90, 0xdb, 0xce, 0x5e, 0x36, 0xff, - 0xe8, 0x45, 0x0e, 0xc6, 0x12, 0xcf, 0x7c, 0x39, 0x79, 0x0a, 0xb3, 0x8c, 0x8d, 0x48, 0x64, 0x2e, - 0x13, 0xd8, 0xfb, 0xf5, 0x46, 0xeb, 0x05, 0x80, 0x38, 0xf6, 0x57, 0x02, 0xaa, 0x7c, 0xb9, 0xc2, - 0x53, 0x34, 0xcd, 0x77, 0xd7, 0xbc, 0x22, 0x30, 0x58, 0xa3, 0x42, 0x75, 0x98, 0x69, 0x47, 0x61, - 0xc2, 0xed, 0x6e, 0x75, 0xee, 0xa3, 0x30, 0x6c, 0x86, 0x19, 0x35, 0x32, 0x78, 0xdc, 0x55, 0x02, - 0xbd, 0x00, 0xe3, 0x22, 0xf4, 0xa8, 0x11, 0x86, 0xbe, 0xb0, 0xd2, 0xa8, 0x1b, 0xef, 0x66, 0x8a, - 0xc2, 0x3a, 0x9d, 0x56, 0x8c, 0x19, 0xf3, 0x46, 0x73, 0x8b, 0x71, 0x83, 0x9e, 0x46, 0x97, 0xc9, - 0x52, 0x31, 0x36, 0x50, 0x96, 0x8a, 0xd4, 0x6e, 0x55, 0x19, 0xf8, 0xfe, 0x02, 0xfa, 0x5a, 0x7a, - 0xbe, 0x5e, 0x86, 0x11, 0x3e, 0x14, 0xc7, 0xa0, 0x8a, 0xad, 0x0a, 0xdb, 0x4d, 0x8f, 0xdc, 0x00, - 0xbc, 0x2d, 0xf3, 0x75, 0x27, 0x71, 0xb8, 0x18, 0x52, 0xab, 0x21, 0xb5, 0xf2, 0xa0, 0x79, 0x63, - 0xbd, 0xcc, 0x65, 0x8c, 0x13, 0xc0, 0x79, 0x68, 0xab, 0xe7, 0x1d, 0x80, 0x98, 0xbd, 0x13, 0x4a, - 0x79, 0x88, 0x5c, 0xa6, 0x4f, 0xf6, 0xa8, 0xbd, 0xa9, 0x88, 0x79, 0x1b, 0xd2, 0x29, 0xa8, 0x10, - 0x58, 0xe3, 0x38, 0xf7, 0x22, 0x54, 0x14, 0x71, 0xbf, 0x93, 0xdc, 0x84, 0x2e, 0xbc, 0x3e, 0x03, - 0xd3, 0x99, 0xba, 0x8e, 0x74, 0x10, 0xfc, 0x2d, 0x0b, 0xa6, 0x79, 0x93, 0x57, 0x82, 0x5d, 0xb1, - 0xd8, 0xdf, 0x87, 0x93, 0x7e, 0xce, 0xa2, 0x13, 0x23, 0x3a, 0xf8, 0x22, 0x55, 0x07, 0xbf, 0x3c, - 0x2c, 0xce, 0xad, 0x83, 0x1e, 0xfe, 0xf9, 0x0b, 0xc7, 0x8e, 0x2f, 0x3c, 0x90, 0x27, 0x78, 0x8e, - 0x67, 0x0e, 0xc3, 0x0a, 0x6b, 0x7f, 0xc7, 0x82, 0xd9, 0xae, 0xf7, 0xf1, 0x3f, 0xd4, 0xb6, 0x8b, - 0x14, 0xd6, 0xa5, 0x82, 0x14, 0xd6, 0xfa, 0xa7, 0x95, 0x7b, 0x7e, 0xda, 0xaf, 0x5a, 0x20, 0x66, - 0xe0, 0x31, 0xa8, 0xf3, 0x3f, 0x6a, 0xaa, 0xf3, 0x73, 0xc5, 0x93, 0xba, 0x40, 0x8f, 0xff, 0x4b, - 0x0b, 0x66, 0x38, 0x41, 0x7a, 0x79, 0xf1, 0xa1, 0x8e, 0xc3, 0x20, 0xef, 0xaa, 0xa8, 0x87, 0x2c, - 0xf3, 0x3f, 0xca, 0x18, 0xac, 0xa1, 0x9e, 0x83, 0xe5, 0xca, 0x05, 0x74, 0x84, 0xf7, 0x82, 0x8e, - 0x9c, 0x75, 0xcd, 0xfe, 0x33, 0x0b, 0x10, 0xaf, 0x26, 0xfb, 0xb4, 0x34, 0xdf, 0xfa, 0xb4, 0x03, - 0x7d, 0x2a, 0x6a, 0x14, 0x06, 0x6b, 0x54, 0xf7, 0xa4, 0x7b, 0x32, 0x37, 0x50, 0xe5, 0xfe, 0x37, - 0x50, 0x47, 0xe8, 0xd1, 0xbf, 0x31, 0x04, 0x59, 0x77, 0x47, 0x74, 0x13, 0x26, 0x5a, 0x4e, 0xdb, - 0xb9, 0xe5, 0xf9, 0x5e, 0xe2, 0x91, 0xb8, 0xd7, 0xd5, 0xf5, 0xb2, 0x46, 0x27, 0xae, 0x7b, 0x34, - 0x08, 0x36, 0xf8, 0xa0, 0x79, 0x80, 0x76, 0xe4, 0xed, 0x7a, 0x3e, 0xd9, 0x64, 0x27, 0x1a, 0x16, - 0xf3, 0xc0, 0xef, 0x63, 0x25, 0x14, 0x6b, 0x14, 0x39, 0x3e, 0xf2, 0xe5, 0xfb, 0xe7, 0x23, 0x3f, - 0x74, 0x44, 0x1f, 0xf9, 0xe1, 0x81, 0x7c, 0xe4, 0x31, 0x9c, 0x96, 0x7b, 0x37, 0xfd, 0xbf, 0xea, - 0xf9, 0x44, 0x28, 0x6c, 0x3c, 0x12, 0x62, 0xee, 0x60, 0xbf, 0x76, 0x1a, 0xe7, 0x52, 0xe0, 0x82, - 0x92, 0xe8, 0xc7, 0xa1, 0xea, 0xf8, 0x7e, 0x78, 0x5b, 0xf5, 0xda, 0x4a, 0xdc, 0x72, 0xfc, 0x34, - 0x09, 0xe9, 0xd8, 0xd2, 0x43, 0x07, 0xfb, 0xb5, 0xea, 0x62, 0x01, 0x0d, 0x2e, 0x2c, 0x6d, 0x6f, - 0xc3, 0x89, 0x26, 0x89, 0xe4, 0x13, 0x64, 0x6a, 0x89, 0xad, 0x43, 0x25, 0xca, 0x08, 0x95, 0x81, - 0x02, 0xdf, 0xb5, 0xd4, 0x5f, 0x52, 0x88, 0xa4, 0x8c, 0xec, 0xbf, 0xb0, 0x60, 0x54, 0xb8, 0x50, - 0x1e, 0x83, 0x2e, 0xb3, 0x68, 0x98, 0x95, 0x6a, 0xf9, 0x82, 0x97, 0x35, 0xa6, 0xd0, 0xa0, 0xb4, - 0x96, 0x31, 0x28, 0x3d, 0xd2, 0x8b, 0x49, 0x6f, 0x53, 0xd2, 0x2f, 0x94, 0x61, 0xca, 0x74, 0x1f, - 0x3d, 0x86, 0x2e, 0xb8, 0x06, 0xa3, 0xb1, 0xf0, 0x55, 0x2e, 0x15, 0xfb, 0xbc, 0x65, 0x07, 0x31, - 0xbd, 0x19, 0x17, 0xde, 0xc9, 0x92, 0x49, 0xae, 0x13, 0x74, 0xf9, 0x3e, 0x3a, 0x41, 0xf7, 0xf3, - 0xe0, 0x1d, 0xba, 0x17, 0x1e, 0xbc, 0xf6, 0x37, 0x98, 0xf0, 0xd7, 0xe1, 0xc7, 0xa0, 0x17, 0x5c, - 0x34, 0xb7, 0x09, 0xbb, 0xc7, 0xcc, 0x12, 0x8d, 0x2a, 0xd0, 0x0f, 0xfe, 0x89, 0x05, 0xe3, 0x82, - 0xf0, 0x18, 0x9a, 0xfd, 0x63, 0x66, 0xb3, 0x1f, 0xec, 0xd1, 0xec, 0x82, 0xf6, 0xfe, 0xdd, 0x92, - 0x6a, 0x6f, 0x23, 0x8c, 0x92, 0x81, 0x92, 0x52, 0x8f, 0xd1, 0xd3, 0x60, 0xd8, 0x0a, 0x7d, 0xb1, - 0x99, 0x3f, 0x94, 0x06, 0xc3, 0x71, 0xf8, 0xa1, 0xf6, 0x1b, 0x2b, 0x6a, 0x16, 0xab, 0x15, 0x46, - 0x89, 0xd8, 0x40, 0xd3, 0x58, 0xad, 0x30, 0x4a, 0x30, 0xc3, 0x20, 0x17, 0x20, 0x7d, 0x9b, 0x5d, - 0x44, 0x8f, 0x16, 0xaf, 0xc2, 0x4e, 0xe2, 0xf9, 0xf3, 0x5e, 0x90, 0xc4, 0x49, 0x34, 0xbf, 0x16, - 0x24, 0xd7, 0x23, 0x7e, 0x36, 0xd0, 0xa2, 0xdb, 0x14, 0x2f, 0xac, 0xf1, 0x95, 0xe1, 0x15, 0xac, - 0x8e, 0x61, 0xf3, 0xbe, 0xe7, 0x9a, 0x80, 0x63, 0x45, 0x61, 0xbf, 0xc8, 0x64, 0x32, 0xeb, 0xa0, - 0xa3, 0x05, 0x9e, 0xfd, 0xf1, 0xa8, 0xea, 0x5a, 0x66, 0xec, 0xad, 0xeb, 0xe1, 0x6d, 0xbd, 0x45, - 0x20, 0xad, 0x58, 0x77, 0x25, 0x4e, 0x63, 0xe0, 0xd0, 0x67, 0xbb, 0xae, 0x01, 0x9f, 0xe9, 0x23, - 0x4b, 0x8f, 0x70, 0xf1, 0xc7, 0x72, 0xec, 0xb1, 0x5c, 0x64, 0x6b, 0x8d, 0x6c, 0xda, 0xf0, 0x65, - 0x89, 0xc0, 0x29, 0x0d, 0x5a, 0x10, 0x27, 0x4b, 0x6e, 0x66, 0x79, 0x30, 0x73, 0xb2, 0x94, 0x9f, - 0xaf, 0x1d, 0x2d, 0x9f, 0x85, 0x71, 0xf5, 0x14, 0x4b, 0x83, 0xbf, 0x68, 0x51, 0xe1, 0xba, 0xd4, - 0x4a, 0x0a, 0xc6, 0x3a, 0x0d, 0x5a, 0x87, 0xe9, 0x98, 0xbf, 0x13, 0x23, 0x23, 0x1e, 0x84, 0xdd, - 0xe0, 0xc9, 0xcc, 0x2b, 0xf0, 0x12, 0x7d, 0xc8, 0x40, 0x7c, 0xb1, 0xca, 0x18, 0x89, 0x2c, 0x0b, - 0xf4, 0x2a, 0x4c, 0xf9, 0xfa, 0x7b, 0x99, 0x0d, 0x61, 0x56, 0x50, 0xae, 0x5c, 0xc6, 0x6b, 0x9a, - 0x0d, 0x9c, 0xa1, 0xa6, 0x4a, 0x80, 0x0e, 0x11, 0xa9, 0x70, 0x9c, 0x60, 0x93, 0xc4, 0xe2, 0x21, - 0x09, 0xa6, 0x04, 0x5c, 0x29, 0xa0, 0xc1, 0x85, 0xa5, 0xd1, 0x4b, 0x30, 0x21, 0x3f, 0x5f, 0x8b, - 0x00, 0x4a, 0x1d, 0x06, 0x35, 0x1c, 0x36, 0x28, 0xd1, 0x6d, 0x38, 0x25, 0xff, 0xaf, 0x47, 0xce, - 0xc6, 0x86, 0xd7, 0x12, 0x01, 0x58, 0xe3, 0x8c, 0xc5, 0xa2, 0xf4, 0x9e, 0x5e, 0xc9, 0x23, 0x3a, - 0xdc, 0xaf, 0x9d, 0x13, 0xbd, 0x96, 0x8b, 0x67, 0x83, 0x98, 0xcf, 0x1f, 0x5d, 0x85, 0x13, 0x5b, - 0xc4, 0xf1, 0x93, 0xad, 0xe5, 0x2d, 0xd2, 0xda, 0x96, 0x8b, 0x88, 0xc5, 0x15, 0x69, 0x6e, 0x76, - 0x97, 0xba, 0x49, 0x70, 0x5e, 0x39, 0xf4, 0x36, 0x54, 0xdb, 0x9d, 0x5b, 0xbe, 0x17, 0x6f, 0x5d, - 0x0b, 0x13, 0x76, 0x63, 0xa9, 0x5e, 0x32, 0x11, 0x01, 0x48, 0x2a, 0xa6, 0xaa, 0x51, 0x40, 0x87, - 0x0b, 0x39, 0x7c, 0xb0, 0xbb, 0xe4, 0xf7, 0x68, 0x61, 0x4d, 0xc3, 0x40, 0x9f, 0x83, 0x09, 0x7d, - 0x24, 0x85, 0x90, 0x7f, 0xac, 0xdf, 0xfb, 0xac, 0x42, 0x3f, 0x51, 0xa3, 0xaa, 0xe3, 0xb0, 0xc1, - 0xd1, 0xfe, 0xbd, 0x12, 0xd4, 0xfa, 0x64, 0xaa, 0xca, 0x18, 0xc8, 0xac, 0x81, 0x0c, 0x64, 0x8b, - 0xf2, 0xd1, 0x92, 0x6b, 0x99, 0xc3, 0x59, 0xe6, 0x41, 0x92, 0xf4, 0x88, 0x96, 0xa5, 0x1f, 0xd8, - 0x37, 0x4c, 0xb7, 0xb1, 0x0d, 0xf5, 0x75, 0x91, 0x6b, 0xe8, 0xc6, 0xd2, 0xe1, 0xc1, 0xd5, 0xdd, - 0x42, 0x3b, 0xa9, 0xfd, 0x8d, 0x12, 0x9c, 0x52, 0x5d, 0xf8, 0xc3, 0xdb, 0x71, 0x37, 0xba, 0x3b, - 0xee, 0x1e, 0x58, 0x99, 0xed, 0xeb, 0x30, 0xd2, 0xdc, 0x8b, 0x5b, 0x89, 0x3f, 0x80, 0x76, 0xf0, - 0xa8, 0xb1, 0x72, 0xd2, 0x3d, 0x8c, 0xbd, 0x3b, 0x26, 0x16, 0x92, 0xfd, 0x57, 0x2d, 0x98, 0x5e, - 0x5f, 0x6e, 0x34, 0xc3, 0xd6, 0x36, 0x49, 0x16, 0xb9, 0x0d, 0x05, 0x0b, 0xe5, 0xc0, 0xba, 0xcb, - 0x4d, 0x3f, 0x4f, 0x9d, 0x38, 0x07, 0x43, 0x5b, 0x61, 0x9c, 0x64, 0x6f, 0x12, 0x2e, 0x85, 0x71, - 0x82, 0x19, 0xc6, 0xfe, 0x13, 0x0b, 0x86, 0xd9, 0x53, 0x5b, 0xfd, 0x9e, 0x64, 0x1b, 0xe4, 0xbb, - 0xd0, 0x0b, 0x30, 0x42, 0x36, 0x36, 0x48, 0x2b, 0x11, 0xa3, 0x2a, 0xc3, 0x55, 0x46, 0x56, 0x18, - 0x94, 0xee, 0x88, 0xac, 0x32, 0xfe, 0x17, 0x0b, 0x62, 0xf4, 0x59, 0xa8, 0x24, 0xde, 0x0e, 0x59, - 0x74, 0x5d, 0x61, 0xc4, 0x3f, 0x9a, 0xbf, 0x96, 0xda, 0xa1, 0xd7, 0x25, 0x13, 0x9c, 0xf2, 0xb3, - 0x7f, 0xae, 0x04, 0x90, 0x86, 0xb5, 0xf5, 0xfb, 0xcc, 0xa5, 0xae, 0x97, 0xe7, 0x1e, 0xcb, 0x79, - 0x79, 0x0e, 0xa5, 0x0c, 0x73, 0xde, 0x9d, 0x53, 0x5d, 0x55, 0x1e, 0xa8, 0xab, 0x86, 0x8e, 0xd2, - 0x55, 0xcb, 0x30, 0x9b, 0x86, 0xe5, 0x99, 0x31, 0xca, 0x2c, 0x2b, 0xed, 0x7a, 0x16, 0x89, 0xbb, - 0xe9, 0xed, 0x2f, 0x5a, 0x20, 0x7c, 0x78, 0x07, 0x98, 0xd0, 0x6f, 0xc9, 0x47, 0xa2, 0x8c, 0xf4, - 0x79, 0xe7, 0x8a, 0x9d, 0x9a, 0x45, 0xd2, 0x3c, 0x25, 0xd9, 0x8d, 0x54, 0x79, 0x06, 0x2f, 0xfb, - 0x77, 0x2c, 0x18, 0xe7, 0xe8, 0xab, 0xec, 0x08, 0xda, 0xbf, 0x35, 0x47, 0xca, 0x69, 0xcc, 0xde, - 0x4f, 0xa2, 0x8c, 0x55, 0xea, 0x5b, 0xfd, 0xfd, 0x24, 0x89, 0xc0, 0x29, 0x0d, 0x7a, 0x02, 0x46, - 0xe3, 0xce, 0x2d, 0x46, 0x9e, 0x71, 0xe3, 0x6d, 0x72, 0x30, 0x96, 0x78, 0x3a, 0xaf, 0x66, 0xb2, - 0x5e, 0xdc, 0xe8, 0x12, 0x8c, 0x70, 0xb1, 0x21, 0x96, 0x71, 0x8f, 0x2b, 0x0b, 0xcd, 0xf7, 0x1b, - 0xf8, 0x83, 0xdf, 0x4c, 0xdc, 0x88, 0xf2, 0xe8, 0x6d, 0x18, 0x77, 0xc3, 0xdb, 0xc1, 0x6d, 0x27, - 0x72, 0x17, 0x1b, 0x6b, 0xa2, 0xd7, 0x73, 0x7d, 0xf1, 0xea, 0x29, 0x99, 0xee, 0x4f, 0xce, 0xcc, - 0x73, 0x29, 0x0a, 0xeb, 0xec, 0xd0, 0x3a, 0xcb, 0x14, 0xc2, 0x9f, 0x21, 0xed, 0xe5, 0x9d, 0xa2, - 0x5e, 0x2e, 0xd5, 0x38, 0x4f, 0x8a, 0x74, 0x22, 0xe2, 0x11, 0xd3, 0x94, 0x91, 0xfd, 0xf9, 0x13, - 0x60, 0x8c, 0xb6, 0x91, 0x79, 0xd8, 0xba, 0x47, 0x99, 0x87, 0x31, 0x8c, 0x91, 0x9d, 0x76, 0xb2, - 0x57, 0xf7, 0xa2, 0x5e, 0xa9, 0xe0, 0x57, 0x04, 0x4d, 0x37, 0x4f, 0x89, 0xc1, 0x8a, 0x4f, 0x7e, - 0x7a, 0xe8, 0xf2, 0x87, 0x98, 0x1e, 0x7a, 0xe8, 0x18, 0xd3, 0x43, 0x5f, 0x83, 0xd1, 0x4d, 0x2f, - 0xc1, 0xa4, 0x1d, 0x8a, 0x2d, 0x33, 0x77, 0x26, 0x5c, 0xe4, 0x24, 0xdd, 0x49, 0x4c, 0x05, 0x02, - 0x4b, 0x26, 0xe8, 0x35, 0xb5, 0x06, 0x46, 0x8a, 0x55, 0xc1, 0x6e, 0xeb, 0x76, 0xee, 0x2a, 0x10, - 0xe9, 0xa0, 0x47, 0xef, 0x36, 0x1d, 0xb4, 0x4a, 0xe7, 0x3c, 0xf6, 0xc1, 0xd2, 0x39, 0x1b, 0xe9, - 0xae, 0x2b, 0xf7, 0x2e, 0xdd, 0xf5, 0x17, 0x2d, 0x38, 0xd5, 0xce, 0xcb, 0xfc, 0x2e, 0x12, 0x33, - 0xbf, 0x30, 0x70, 0x06, 0x7c, 0xa3, 0x42, 0x96, 0xae, 0x22, 0x97, 0x0c, 0xe7, 0x57, 0x27, 0xf3, - 0x66, 0x8f, 0xdf, 0x6d, 0xde, 0xec, 0xfb, 0x93, 0xc1, 0x39, 0xcd, 0xa2, 0x3d, 0xf9, 0x81, 0xb3, - 0x68, 0xbf, 0xa6, 0xb2, 0x68, 0xf7, 0xc8, 0xc7, 0xc0, 0x73, 0x64, 0xf7, 0xcd, 0x9d, 0xad, 0xe5, - 0xbf, 0x9e, 0xbe, 0x17, 0xf9, 0xaf, 0xdf, 0x31, 0x85, 0x3d, 0x4f, 0xc6, 0xfc, 0x54, 0x1f, 0x61, - 0x6f, 0xf0, 0xed, 0x2d, 0xee, 0x79, 0xae, 0xef, 0xd9, 0xbb, 0xca, 0xf5, 0x7d, 0x53, 0xcf, 0xa2, - 0x8d, 0xfa, 0xa4, 0x89, 0xa6, 0x44, 0x03, 0xe6, 0xce, 0xbe, 0xa9, 0x6f, 0x41, 0x27, 0x8a, 0xf9, - 0xaa, 0x9d, 0xa6, 0x9b, 0x6f, 0xde, 0x26, 0xd4, 0x9d, 0x93, 0xfb, 0xe4, 0xf1, 0xe4, 0xe4, 0x3e, - 0x75, 0xcf, 0x73, 0x72, 0x9f, 0x3e, 0x86, 0x9c, 0xdc, 0x0f, 0x7c, 0xa8, 0x39, 0xb9, 0xab, 0xf7, - 0x37, 0x27, 0xf7, 0x99, 0x7b, 0x91, 0x93, 0xfb, 0x26, 0x54, 0xda, 0x32, 0xd0, 0xaf, 0x3a, 0x57, - 0x3c, 0x24, 0xb9, 0xd1, 0x80, 0x7c, 0x48, 0x14, 0x0a, 0xa7, 0xac, 0x28, 0xdf, 0x34, 0x47, 0xf7, - 0x83, 0xc5, 0x7c, 0x73, 0x8f, 0xed, 0x3d, 0x32, 0x73, 0xff, 0xb5, 0x12, 0x9c, 0xed, 0x3d, 0xaf, - 0xd3, 0x33, 0x7f, 0x23, 0x35, 0xe0, 0x66, 0xce, 0xfc, 0x4c, 0xe9, 0xd2, 0xa8, 0x06, 0x8e, 0x86, - 0xbe, 0x08, 0xb3, 0xca, 0xdf, 0xc9, 0xf7, 0x5a, 0x7b, 0xda, 0xb3, 0x3a, 0xca, 0x85, 0xbe, 0x99, - 0x25, 0xc0, 0xdd, 0x65, 0xd0, 0x22, 0x4c, 0x1b, 0xc0, 0xb5, 0xba, 0x50, 0xc9, 0x95, 0x91, 0xa1, - 0x69, 0xa2, 0x71, 0x96, 0xde, 0xfe, 0xaa, 0x05, 0x0f, 0x14, 0xa4, 0xf7, 0x1c, 0x38, 0xd8, 0x77, - 0x03, 0xa6, 0xdb, 0x66, 0xd1, 0x3e, 0x39, 0x01, 0x8c, 0x24, 0xa2, 0xaa, 0xad, 0x19, 0x04, 0xce, - 0x32, 0x5d, 0x3a, 0xff, 0xcd, 0xef, 0x9e, 0xfd, 0xd8, 0x1f, 0x7e, 0xf7, 0xec, 0xc7, 0xbe, 0xf3, - 0xdd, 0xb3, 0x1f, 0xfb, 0xff, 0x0e, 0xce, 0x5a, 0xdf, 0x3c, 0x38, 0x6b, 0xfd, 0xe1, 0xc1, 0x59, - 0xeb, 0x3b, 0x07, 0x67, 0xad, 0x3f, 0x3d, 0x38, 0x6b, 0xfd, 0xdc, 0xf7, 0xce, 0x7e, 0xec, 0xad, - 0xd2, 0xee, 0xb3, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x42, 0x9f, 0x1b, 0x58, 0x12, 0xcd, 0x00, - 0x00, + // 11721 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5b, 0x90, 0x24, 0xc7, + 0x71, 0x18, 0x7b, 0x66, 0x5f, 0x93, 0xfb, 0xae, 0xbb, 0x03, 0xe6, 0x16, 0xc0, 0xed, 0xa1, 0x41, + 0x02, 0x87, 0xd7, 0x2e, 0x71, 0x00, 0x08, 0x88, 0x00, 0x41, 0xee, 0xee, 0xec, 0xde, 0x0d, 0xee, + 0x35, 0xa8, 0xd9, 0x3b, 0x08, 0x20, 0x04, 0xb1, 0x6f, 0xba, 0x76, 0xb7, 0xb1, 0xbd, 0xdd, 0x83, + 0xee, 0x9e, 0xbd, 0x5b, 0x84, 0x18, 0x61, 0xd3, 0x14, 0xfd, 0xa0, 0x3e, 0x14, 0x0e, 0x85, 0x2d, + 0x8b, 0x0c, 0x39, 0xc2, 0x8f, 0x90, 0x68, 0xd9, 0x0e, 0xc9, 0x94, 0xf5, 0x20, 0xe5, 0xb0, 0x2c, + 0x3f, 0x82, 0xfc, 0xa1, 0x25, 0xff, 0x90, 0x11, 0x0e, 0xaf, 0xc4, 0xa5, 0xc3, 0x0e, 0x7d, 0xd8, + 0x61, 0x5b, 0x5f, 0x5a, 0xcb, 0xa6, 0xa3, 0x9e, 0x5d, 0xd5, 0xd3, 0x3d, 0x33, 0x7b, 0xb8, 0x5b, + 0x80, 0x0c, 0xff, 0xcd, 0x64, 0x66, 0x65, 0x55, 0xd7, 0x23, 0x2b, 0x2b, 0x2b, 0x33, 0x0b, 0x5e, + 0xda, 0x7e, 0x31, 0x5e, 0xf0, 0xc2, 0xc5, 0xed, 0xce, 0x4d, 0x12, 0x05, 0x24, 0x21, 0xf1, 0xe2, + 0x2e, 0x09, 0xdc, 0x30, 0x5a, 0x14, 0x08, 0xa7, 0xed, 0x2d, 0xb6, 0xc2, 0x88, 0x2c, 0xee, 0x3e, + 0xb3, 0xb8, 0x49, 0x02, 0x12, 0x39, 0x09, 0x71, 0x17, 0xda, 0x51, 0x98, 0x84, 0x08, 0x71, 0x9a, + 0x05, 0xa7, 0xed, 0x2d, 0x50, 0x9a, 0x85, 0xdd, 0x67, 0xe6, 0x9e, 0xde, 0xf4, 0x92, 0xad, 0xce, + 0xcd, 0x85, 0x56, 0xb8, 0xb3, 0xb8, 0x19, 0x6e, 0x86, 0x8b, 0x8c, 0xf4, 0x66, 0x67, 0x83, 0xfd, + 0x63, 0x7f, 0xd8, 0x2f, 0xce, 0x62, 0xee, 0xb9, 0xb4, 0x9a, 0x1d, 0xa7, 0xb5, 0xe5, 0x05, 0x24, + 0xda, 0x5b, 0x6c, 0x6f, 0x6f, 0xb2, 0x7a, 0x23, 0x12, 0x87, 0x9d, 0xa8, 0x45, 0xb2, 0x15, 0xf7, + 0x2c, 0x15, 0x2f, 0xee, 0x90, 0xc4, 0xc9, 0x69, 0xee, 0xdc, 0x62, 0x51, 0xa9, 0xa8, 0x13, 0x24, + 0xde, 0x4e, 0x77, 0x35, 0x9f, 0xe8, 0x57, 0x20, 0x6e, 0x6d, 0x91, 0x1d, 0xa7, 0xab, 0xdc, 0xb3, + 0x45, 0xe5, 0x3a, 0x89, 0xe7, 0x2f, 0x7a, 0x41, 0x12, 0x27, 0x51, 0xb6, 0x90, 0xfd, 0x5d, 0x0b, + 0xce, 0x2e, 0xbd, 0xde, 0x5c, 0xf5, 0x9d, 0x38, 0xf1, 0x5a, 0xcb, 0x7e, 0xd8, 0xda, 0x6e, 0x26, + 0x61, 0x44, 0x6e, 0x84, 0x7e, 0x67, 0x87, 0x34, 0x59, 0x47, 0xa0, 0xa7, 0x60, 0x6c, 0x97, 0xfd, + 0xaf, 0xd7, 0xaa, 0xd6, 0x59, 0xeb, 0x5c, 0x65, 0x79, 0xe6, 0x5b, 0xfb, 0xf3, 0x1f, 0x39, 0xd8, + 0x9f, 0x1f, 0xbb, 0x21, 0xe0, 0x58, 0x51, 0xa0, 0x47, 0x61, 0x64, 0x23, 0x5e, 0xdf, 0x6b, 0x93, + 0x6a, 0x89, 0xd1, 0x4e, 0x09, 0xda, 0x91, 0xb5, 0x26, 0x85, 0x62, 0x81, 0x45, 0x8b, 0x50, 0x69, + 0x3b, 0x51, 0xe2, 0x25, 0x5e, 0x18, 0x54, 0xcb, 0x67, 0xad, 0x73, 0xc3, 0xcb, 0xb3, 0x82, 0xb4, + 0xd2, 0x90, 0x08, 0x9c, 0xd2, 0xd0, 0x66, 0x44, 0xc4, 0x71, 0xaf, 0x05, 0xfe, 0x5e, 0x75, 0xe8, + 0xac, 0x75, 0x6e, 0x2c, 0x6d, 0x06, 0x16, 0x70, 0xac, 0x28, 0xec, 0x5f, 0x2a, 0xc1, 0xd8, 0xd2, + 0xc6, 0x86, 0x17, 0x78, 0xc9, 0x1e, 0xba, 0x01, 0x13, 0x41, 0xe8, 0x12, 0xf9, 0x9f, 0x7d, 0xc5, + 0xf8, 0xf9, 0xb3, 0x0b, 0xdd, 0x53, 0x69, 0xe1, 0xaa, 0x46, 0xb7, 0x3c, 0x73, 0xb0, 0x3f, 0x3f, + 0xa1, 0x43, 0xb0, 0xc1, 0x07, 0x61, 0x18, 0x6f, 0x87, 0xae, 0x62, 0x5b, 0x62, 0x6c, 0xe7, 0xf3, + 0xd8, 0x36, 0x52, 0xb2, 0xe5, 0xe9, 0x83, 0xfd, 0xf9, 0x71, 0x0d, 0x80, 0x75, 0x26, 0xe8, 0x26, + 0x4c, 0xd3, 0xbf, 0x41, 0xe2, 0x29, 0xbe, 0x65, 0xc6, 0xf7, 0x91, 0x22, 0xbe, 0x1a, 0xe9, 0xf2, + 0x89, 0x83, 0xfd, 0xf9, 0xe9, 0x0c, 0x10, 0x67, 0x19, 0xda, 0xef, 0xc1, 0xd4, 0x52, 0x92, 0x38, + 0xad, 0x2d, 0xe2, 0xf2, 0x11, 0x44, 0xcf, 0xc1, 0x50, 0xe0, 0xec, 0x10, 0x31, 0xbe, 0x67, 0x45, + 0xc7, 0x0e, 0x5d, 0x75, 0x76, 0xc8, 0xe1, 0xfe, 0xfc, 0xcc, 0xf5, 0xc0, 0x7b, 0xb7, 0x23, 0x66, + 0x05, 0x85, 0x61, 0x46, 0x8d, 0xce, 0x03, 0xb8, 0x64, 0xd7, 0x6b, 0x91, 0x86, 0x93, 0x6c, 0x89, + 0xf1, 0x46, 0xa2, 0x2c, 0xd4, 0x14, 0x06, 0x6b, 0x54, 0xf6, 0x6d, 0xa8, 0x2c, 0xed, 0x86, 0x9e, + 0xdb, 0x08, 0xdd, 0x18, 0x6d, 0xc3, 0x74, 0x3b, 0x22, 0x1b, 0x24, 0x52, 0xa0, 0xaa, 0x75, 0xb6, + 0x7c, 0x6e, 0xfc, 0xfc, 0xb9, 0xdc, 0x8f, 0x35, 0x49, 0x57, 0x83, 0x24, 0xda, 0x5b, 0xbe, 0x5f, + 0xd4, 0x37, 0x9d, 0xc1, 0xe2, 0x2c, 0x67, 0xfb, 0xdf, 0x94, 0xe0, 0xd4, 0xd2, 0x7b, 0x9d, 0x88, + 0xd4, 0xbc, 0x78, 0x3b, 0x3b, 0xc3, 0x5d, 0x2f, 0xde, 0xbe, 0x9a, 0xf6, 0x80, 0x9a, 0x5a, 0x35, + 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x0d, 0xa3, 0xf4, 0xf7, 0x75, 0x5c, 0x17, 0x9f, 0x7c, 0x42, 0x10, + 0x8f, 0xd7, 0x9c, 0xc4, 0xa9, 0x71, 0x14, 0x96, 0x34, 0xe8, 0x0a, 0x8c, 0xb7, 0xd8, 0x82, 0xdc, + 0xbc, 0x12, 0xba, 0x84, 0x0d, 0x66, 0x65, 0xf9, 0x49, 0x4a, 0xbe, 0x92, 0x82, 0x0f, 0xf7, 0xe7, + 0xab, 0xbc, 0x6d, 0x82, 0x85, 0x86, 0xc3, 0x7a, 0x79, 0x64, 0xab, 0xf5, 0x35, 0xc4, 0x38, 0x41, + 0xce, 0xda, 0x3a, 0xa7, 0x2d, 0x95, 0x61, 0xb6, 0x54, 0x26, 0xf2, 0x97, 0x09, 0x7a, 0x06, 0x86, + 0xb6, 0xbd, 0xc0, 0xad, 0x8e, 0x30, 0x5e, 0x0f, 0xd1, 0x31, 0xbf, 0xe4, 0x05, 0xee, 0xe1, 0xfe, + 0xfc, 0xac, 0xd1, 0x1c, 0x0a, 0xc4, 0x8c, 0xd4, 0xfe, 0x33, 0x0b, 0xe6, 0x19, 0x6e, 0xcd, 0xf3, + 0x49, 0x83, 0x44, 0xb1, 0x17, 0x27, 0x24, 0x48, 0x8c, 0x0e, 0x3d, 0x0f, 0x10, 0x93, 0x56, 0x44, + 0x12, 0xad, 0x4b, 0xd5, 0xc4, 0x68, 0x2a, 0x0c, 0xd6, 0xa8, 0xa8, 0x40, 0x88, 0xb7, 0x9c, 0x88, + 0xcd, 0x2f, 0xd1, 0xb1, 0x4a, 0x20, 0x34, 0x25, 0x02, 0xa7, 0x34, 0x86, 0x40, 0x28, 0xf7, 0x13, + 0x08, 0xe8, 0x53, 0x30, 0x9d, 0x56, 0x16, 0xb7, 0x9d, 0x96, 0xec, 0x40, 0xb6, 0x64, 0x9a, 0x26, + 0x0a, 0x67, 0x69, 0xed, 0x7f, 0x64, 0x89, 0xc9, 0x43, 0xbf, 0xfa, 0x43, 0xfe, 0xad, 0xf6, 0xef, + 0x58, 0x30, 0xba, 0xec, 0x05, 0xae, 0x17, 0x6c, 0xa2, 0xcf, 0xc1, 0x18, 0xdd, 0x9b, 0x5c, 0x27, + 0x71, 0x84, 0xdc, 0xfb, 0xb8, 0xb6, 0xb6, 0xd4, 0x56, 0xb1, 0xd0, 0xde, 0xde, 0xa4, 0x80, 0x78, + 0x81, 0x52, 0xd3, 0xd5, 0x76, 0xed, 0xe6, 0x3b, 0xa4, 0x95, 0x5c, 0x21, 0x89, 0x93, 0x7e, 0x4e, + 0x0a, 0xc3, 0x8a, 0x2b, 0xba, 0x04, 0x23, 0x89, 0x13, 0x6d, 0x92, 0x44, 0x08, 0xc0, 0x5c, 0x41, + 0xc5, 0x4b, 0x62, 0xba, 0x22, 0x49, 0xd0, 0x22, 0xe9, 0xb6, 0xb0, 0xce, 0x8a, 0x62, 0xc1, 0xc2, + 0x6e, 0xc1, 0xc4, 0x8a, 0xd3, 0x76, 0x6e, 0x7a, 0xbe, 0x97, 0x78, 0x24, 0x46, 0x8f, 0x41, 0xd9, + 0x71, 0x5d, 0x26, 0x15, 0x2a, 0xcb, 0xa7, 0x0e, 0xf6, 0xe7, 0xcb, 0x4b, 0x2e, 0x9d, 0x9e, 0xa0, + 0xa8, 0xf6, 0x30, 0xa5, 0x40, 0x4f, 0xc0, 0x90, 0x1b, 0x85, 0xed, 0x6a, 0x89, 0x51, 0xde, 0x47, + 0x67, 0x72, 0x2d, 0x0a, 0xdb, 0x19, 0x52, 0x46, 0x63, 0xff, 0x7e, 0x09, 0x1e, 0x5c, 0x21, 0xed, + 0xad, 0xb5, 0x66, 0xc1, 0xfc, 0x3d, 0x07, 0x63, 0x3b, 0x61, 0xe0, 0x25, 0x61, 0x14, 0x8b, 0xaa, + 0xd9, 0x02, 0xba, 0x22, 0x60, 0x58, 0x61, 0xd1, 0x59, 0x18, 0x6a, 0xa7, 0xc2, 0x6f, 0x42, 0x0a, + 0x4e, 0x26, 0xf6, 0x18, 0x86, 0x52, 0x74, 0x62, 0x12, 0x89, 0x85, 0xaf, 0x28, 0xae, 0xc7, 0x24, + 0xc2, 0x0c, 0x93, 0xce, 0x20, 0x3a, 0xb7, 0xc4, 0xac, 0xcc, 0xcc, 0x20, 0x8a, 0xc1, 0x1a, 0x15, + 0x6a, 0x40, 0x85, 0xff, 0xc3, 0x64, 0x83, 0xad, 0xf1, 0x82, 0x7e, 0x6f, 0x4a, 0x22, 0xd1, 0xef, + 0x93, 0x6c, 0x8a, 0x49, 0x20, 0x4e, 0x99, 0x18, 0x53, 0x6c, 0xa4, 0xef, 0x14, 0xfb, 0x66, 0x09, + 0x10, 0xef, 0xc2, 0x1f, 0xb1, 0x8e, 0xbb, 0xde, 0xdd, 0x71, 0xb9, 0x9b, 0xcd, 0xe5, 0xb0, 0xe5, + 0xf8, 0xd9, 0x59, 0x7b, 0xb7, 0x7a, 0xef, 0x17, 0x2d, 0x40, 0x2b, 0x5e, 0xe0, 0x92, 0xe8, 0x18, + 0x34, 0xad, 0xa3, 0xc9, 0x8e, 0xcb, 0x30, 0xb5, 0xe2, 0x7b, 0x24, 0x48, 0xea, 0x8d, 0x95, 0x30, + 0xd8, 0xf0, 0x36, 0xd1, 0x27, 0x61, 0x8a, 0x2a, 0x9e, 0x61, 0x27, 0x69, 0x92, 0x56, 0x18, 0xb0, + 0x3d, 0x9a, 0xaa, 0x6b, 0xe8, 0x60, 0x7f, 0x7e, 0x6a, 0xdd, 0xc0, 0xe0, 0x0c, 0xa5, 0xfd, 0x1f, + 0xe9, 0x87, 0x86, 0x3b, 0xed, 0x30, 0x20, 0x41, 0xb2, 0x12, 0x06, 0x2e, 0xd7, 0xe5, 0x3e, 0x09, + 0x43, 0x09, 0x6d, 0x38, 0xff, 0xc8, 0x47, 0xe5, 0xd0, 0xd2, 0xe6, 0x1e, 0xee, 0xcf, 0xdf, 0xd7, + 0x5d, 0x82, 0x7d, 0x10, 0x2b, 0x83, 0x7e, 0x02, 0x46, 0xe2, 0xc4, 0x49, 0x3a, 0xb1, 0xf8, 0xec, + 0x87, 0xe5, 0x67, 0x37, 0x19, 0xf4, 0x70, 0x7f, 0x7e, 0x5a, 0x15, 0xe3, 0x20, 0x2c, 0x0a, 0xa0, + 0xc7, 0x61, 0x74, 0x87, 0xc4, 0xb1, 0xb3, 0x29, 0xb7, 0xe1, 0x69, 0x51, 0x76, 0xf4, 0x0a, 0x07, + 0x63, 0x89, 0x47, 0x8f, 0xc0, 0x30, 0x89, 0xa2, 0x30, 0x12, 0xb3, 0x6a, 0x52, 0x10, 0x0e, 0xaf, + 0x52, 0x20, 0xe6, 0x38, 0xfb, 0xdf, 0x5b, 0x30, 0xad, 0xda, 0xca, 0xeb, 0x3a, 0x06, 0x79, 0xfb, + 0x26, 0x40, 0x4b, 0x7e, 0x60, 0xcc, 0xe4, 0xdd, 0xf8, 0xf9, 0x47, 0xf3, 0xa6, 0x70, 0x77, 0x37, + 0xa6, 0x9c, 0x15, 0x28, 0xc6, 0x1a, 0x37, 0xfb, 0x5f, 0x58, 0x70, 0x22, 0xf3, 0x45, 0x97, 0xbd, + 0x38, 0x41, 0x6f, 0x75, 0x7d, 0xd5, 0xc2, 0x60, 0x5f, 0x45, 0x4b, 0xb3, 0x6f, 0x52, 0x73, 0x4e, + 0x42, 0xb4, 0x2f, 0xba, 0x08, 0xc3, 0x5e, 0x42, 0x76, 0xe4, 0xc7, 0x3c, 0xd2, 0xf3, 0x63, 0x78, + 0xab, 0xd2, 0x11, 0xa9, 0xd3, 0x92, 0x98, 0x33, 0xb0, 0xff, 0xa7, 0x05, 0x15, 0x3e, 0x6d, 0xaf, + 0x38, 0xed, 0x63, 0x18, 0x8b, 0x3a, 0x0c, 0x31, 0xee, 0xbc, 0xe1, 0x8f, 0xe5, 0x37, 0x5c, 0x34, + 0x67, 0x81, 0x2a, 0x53, 0x5c, 0x69, 0x55, 0xc2, 0x8c, 0x82, 0x30, 0x63, 0x31, 0xf7, 0x02, 0x54, + 0x14, 0x01, 0x9a, 0x81, 0xf2, 0x36, 0xe1, 0x07, 0x95, 0x0a, 0xa6, 0x3f, 0xd1, 0x49, 0x18, 0xde, + 0x75, 0xfc, 0x8e, 0x58, 0xec, 0x98, 0xff, 0xf9, 0x64, 0xe9, 0x45, 0xcb, 0xfe, 0x06, 0x5b, 0x63, + 0xa2, 0x92, 0xd5, 0x60, 0x57, 0x08, 0x93, 0xf7, 0xe0, 0xa4, 0x9f, 0x23, 0xc3, 0x44, 0x47, 0x0c, + 0x2e, 0xf3, 0x1e, 0x14, 0x6d, 0x3d, 0x99, 0x87, 0xc5, 0xb9, 0x75, 0xd0, 0x6d, 0x20, 0x6c, 0xd3, + 0x19, 0xe5, 0xf8, 0xac, 0xbd, 0x42, 0x01, 0xbd, 0x26, 0x60, 0x58, 0x61, 0xa9, 0x80, 0x38, 0xa9, + 0x1a, 0x7f, 0x89, 0xec, 0x35, 0x89, 0x4f, 0x5a, 0x49, 0x18, 0x7d, 0xa0, 0xcd, 0x7f, 0x88, 0xf7, + 0x3e, 0x97, 0x2f, 0xe3, 0x82, 0x41, 0xf9, 0x12, 0xd9, 0xe3, 0x43, 0xa1, 0x7f, 0x5d, 0xb9, 0xe7, + 0xd7, 0xfd, 0x86, 0x05, 0x93, 0xea, 0xeb, 0x8e, 0x61, 0x21, 0x2d, 0x9b, 0x0b, 0xe9, 0xa1, 0x9e, + 0xf3, 0xb1, 0x60, 0x09, 0xfd, 0x90, 0x89, 0x00, 0x41, 0xd3, 0x88, 0x42, 0xda, 0x35, 0x54, 0x66, + 0x7f, 0x90, 0x03, 0x32, 0xc8, 0x77, 0x5d, 0x22, 0x7b, 0xeb, 0x21, 0x55, 0x1f, 0xf2, 0xbf, 0xcb, + 0x18, 0xb5, 0xa1, 0x9e, 0xa3, 0xf6, 0x9b, 0x25, 0x38, 0xa5, 0x7a, 0xc0, 0xd8, 0xa0, 0x7f, 0xd4, + 0xfb, 0xe0, 0x19, 0x18, 0x77, 0xc9, 0x86, 0xd3, 0xf1, 0x13, 0x75, 0x16, 0x1d, 0xe6, 0xf6, 0x88, + 0x5a, 0x0a, 0xc6, 0x3a, 0xcd, 0x11, 0xba, 0xed, 0xdf, 0x02, 0x93, 0xbd, 0x89, 0x43, 0x67, 0x30, + 0xd5, 0xde, 0x34, 0x8b, 0xc2, 0x84, 0x6e, 0x51, 0x10, 0xd6, 0x83, 0x47, 0x60, 0xd8, 0xdb, 0xa1, + 0x7b, 0x71, 0xc9, 0xdc, 0x62, 0xeb, 0x14, 0x88, 0x39, 0x0e, 0x7d, 0x0c, 0x46, 0x5b, 0xe1, 0xce, + 0x8e, 0x13, 0xb8, 0xd5, 0x32, 0xd3, 0x27, 0xc7, 0xe9, 0x76, 0xbd, 0xc2, 0x41, 0x58, 0xe2, 0xd0, + 0x83, 0x30, 0xe4, 0x44, 0x9b, 0x71, 0x75, 0x88, 0xd1, 0x8c, 0xd1, 0x9a, 0x96, 0xa2, 0xcd, 0x18, + 0x33, 0x28, 0xd5, 0x13, 0x6f, 0x85, 0xd1, 0xb6, 0x17, 0x6c, 0xd6, 0xbc, 0x88, 0x29, 0x7d, 0x9a, + 0x9e, 0xf8, 0xba, 0xc2, 0x60, 0x8d, 0x0a, 0xad, 0xc1, 0x70, 0x3b, 0x8c, 0x92, 0xb8, 0x3a, 0xc2, + 0xba, 0xfb, 0xe1, 0x82, 0xa5, 0xc4, 0xbf, 0xb6, 0x11, 0x46, 0x49, 0xfa, 0x01, 0xf4, 0x5f, 0x8c, + 0x79, 0x71, 0xf4, 0x13, 0x50, 0x26, 0xc1, 0x6e, 0x75, 0x94, 0x71, 0x99, 0xcb, 0xe3, 0xb2, 0x1a, + 0xec, 0xde, 0x70, 0xa2, 0x54, 0xce, 0xac, 0x06, 0xbb, 0x98, 0x96, 0x41, 0x6f, 0x40, 0x45, 0x5a, + 0x23, 0xe3, 0xea, 0x58, 0xf1, 0x14, 0xc3, 0x82, 0x08, 0x93, 0x77, 0x3b, 0x5e, 0x44, 0x76, 0x48, + 0x90, 0xc4, 0xe9, 0x79, 0x52, 0x62, 0x63, 0x9c, 0x72, 0x43, 0x6f, 0xc0, 0x04, 0xd7, 0x23, 0xaf, + 0x84, 0x9d, 0x20, 0x89, 0xab, 0x15, 0xd6, 0xbc, 0x5c, 0xd3, 0xd5, 0x8d, 0x94, 0x6e, 0xf9, 0xa4, + 0x60, 0x3a, 0xa1, 0x01, 0x63, 0x6c, 0xb0, 0x42, 0x18, 0x26, 0x7d, 0x6f, 0x97, 0x04, 0x24, 0x8e, + 0x1b, 0x51, 0x78, 0x93, 0x54, 0x81, 0xb5, 0xfc, 0x74, 0xbe, 0x45, 0x27, 0xbc, 0x49, 0x96, 0x67, + 0x0f, 0xf6, 0xe7, 0x27, 0x2f, 0xeb, 0x65, 0xb0, 0xc9, 0x02, 0x5d, 0x87, 0x29, 0xaa, 0xa0, 0x7a, + 0x29, 0xd3, 0xf1, 0x7e, 0x4c, 0x99, 0x76, 0x8a, 0x8d, 0x42, 0x38, 0xc3, 0x04, 0xbd, 0x0a, 0x15, + 0xdf, 0xdb, 0x20, 0xad, 0xbd, 0x96, 0x4f, 0xaa, 0x13, 0x8c, 0x63, 0xee, 0xb2, 0xba, 0x2c, 0x89, + 0xf8, 0x01, 0x40, 0xfd, 0xc5, 0x69, 0x71, 0x74, 0x03, 0xee, 0x4b, 0x48, 0xb4, 0xe3, 0x05, 0x0e, + 0x5d, 0x0e, 0x42, 0x9f, 0x64, 0x76, 0xb1, 0x49, 0x36, 0xdf, 0xce, 0x88, 0xae, 0xbb, 0x6f, 0x3d, + 0x97, 0x0a, 0x17, 0x94, 0x46, 0xd7, 0x60, 0x9a, 0xad, 0x84, 0x46, 0xc7, 0xf7, 0x1b, 0xa1, 0xef, + 0xb5, 0xf6, 0xaa, 0x53, 0x8c, 0xe1, 0xc7, 0xa4, 0xe1, 0xab, 0x6e, 0xa2, 0xe9, 0x89, 0x37, 0xfd, + 0x87, 0xb3, 0xa5, 0xd1, 0x4d, 0x66, 0x08, 0xe9, 0x44, 0x5e, 0xb2, 0x47, 0xe7, 0x2f, 0xb9, 0x9d, + 0x54, 0xa7, 0x7b, 0x9e, 0x1f, 0x75, 0x52, 0x65, 0x2d, 0xd1, 0x81, 0x38, 0xcb, 0x90, 0x2e, 0xed, + 0x38, 0x71, 0xbd, 0xa0, 0x3a, 0xc3, 0x24, 0x86, 0x5a, 0x19, 0x4d, 0x0a, 0xc4, 0x1c, 0xc7, 0x8c, + 0x20, 0xf4, 0xc7, 0x35, 0x2a, 0x41, 0x67, 0x19, 0x61, 0x6a, 0x04, 0x91, 0x08, 0x9c, 0xd2, 0xd0, + 0x6d, 0x39, 0x49, 0xf6, 0xaa, 0x88, 0x91, 0xaa, 0xe5, 0xb2, 0xbe, 0xfe, 0x06, 0xa6, 0x70, 0x74, + 0x19, 0x46, 0x49, 0xb0, 0xbb, 0x16, 0x85, 0x3b, 0xd5, 0x13, 0xc5, 0x6b, 0x76, 0x95, 0x93, 0x70, + 0x81, 0x9e, 0x1e, 0x00, 0x04, 0x18, 0x4b, 0x16, 0xe8, 0x36, 0x54, 0x73, 0x46, 0x84, 0x0f, 0xc0, + 0x49, 0x36, 0x00, 0x2f, 0x8b, 0xb2, 0xd5, 0xf5, 0x02, 0xba, 0xc3, 0x1e, 0x38, 0x5c, 0xc8, 0xdd, + 0xbe, 0x09, 0x53, 0x4a, 0xb0, 0xb0, 0xb1, 0x45, 0xf3, 0x30, 0x4c, 0x25, 0xa6, 0x3c, 0x52, 0x57, + 0x68, 0x57, 0x32, 0xd3, 0x14, 0xe6, 0x70, 0xd6, 0x95, 0xde, 0x7b, 0x64, 0x79, 0x2f, 0x21, 0xfc, + 0x58, 0x54, 0xd6, 0xba, 0x52, 0x22, 0x70, 0x4a, 0x63, 0xff, 0x5f, 0xae, 0x98, 0xa4, 0xd2, 0x6b, + 0x00, 0x79, 0xfd, 0x14, 0x8c, 0x6d, 0x85, 0x71, 0x42, 0xa9, 0x59, 0x1d, 0xc3, 0xa9, 0x2a, 0x72, + 0x51, 0xc0, 0xb1, 0xa2, 0x40, 0x2f, 0xc1, 0x64, 0x4b, 0xaf, 0x40, 0x6c, 0x36, 0xa7, 0x44, 0x11, + 0xb3, 0x76, 0x6c, 0xd2, 0xa2, 0x17, 0x61, 0x8c, 0x5d, 0x50, 0xb4, 0x42, 0x5f, 0x1c, 0xc0, 0xe4, + 0x8e, 0x39, 0xd6, 0x10, 0xf0, 0x43, 0xed, 0x37, 0x56, 0xd4, 0xf4, 0x50, 0x4c, 0x9b, 0x50, 0x6f, + 0x08, 0x31, 0xaf, 0x0e, 0xc5, 0x17, 0x19, 0x14, 0x0b, 0xac, 0xfd, 0x37, 0x4b, 0x5a, 0x2f, 0xd3, + 0x23, 0x05, 0x41, 0x0d, 0x18, 0xbd, 0xe5, 0x78, 0x89, 0x17, 0x6c, 0x8a, 0xfd, 0xfc, 0xf1, 0x9e, + 0x32, 0x9f, 0x15, 0x7a, 0x9d, 0x17, 0xe0, 0xbb, 0x92, 0xf8, 0x83, 0x25, 0x1b, 0xca, 0x31, 0xea, + 0x04, 0x01, 0xe5, 0x58, 0x1a, 0x94, 0x23, 0xe6, 0x05, 0x38, 0x47, 0xf1, 0x07, 0x4b, 0x36, 0xe8, + 0x2d, 0x00, 0x39, 0x6f, 0x88, 0x2b, 0x2e, 0x06, 0x9e, 0xea, 0xcf, 0x74, 0x5d, 0x95, 0x59, 0x9e, + 0xa2, 0x7b, 0x5e, 0xfa, 0x1f, 0x6b, 0xfc, 0xec, 0x84, 0xe9, 0x3d, 0xdd, 0x8d, 0x41, 0x9f, 0xa5, + 0x4b, 0xd5, 0x89, 0x12, 0xe2, 0x2e, 0x25, 0xa2, 0x73, 0x9e, 0x18, 0x4c, 0x6d, 0x5d, 0xf7, 0x76, + 0x88, 0xbe, 0xac, 0x05, 0x13, 0x9c, 0xf2, 0xb3, 0x7f, 0xbb, 0x0c, 0xd5, 0xa2, 0xe6, 0xd2, 0x49, + 0x47, 0x6e, 0x7b, 0xc9, 0x0a, 0x55, 0x57, 0x2c, 0x73, 0xd2, 0xad, 0x0a, 0x38, 0x56, 0x14, 0x74, + 0xf4, 0x63, 0x6f, 0x53, 0x9e, 0x3a, 0x86, 0xd3, 0xd1, 0x6f, 0x32, 0x28, 0x16, 0x58, 0x4a, 0x17, + 0x11, 0x27, 0x16, 0x37, 0x4f, 0xda, 0x2c, 0xc1, 0x0c, 0x8a, 0x05, 0x56, 0x37, 0x18, 0x0c, 0xf5, + 0x31, 0x18, 0x18, 0x5d, 0x34, 0x7c, 0x77, 0xbb, 0x08, 0xbd, 0x0d, 0xb0, 0xe1, 0x05, 0x5e, 0xbc, + 0xc5, 0xb8, 0x8f, 0x1c, 0x99, 0xbb, 0x52, 0x76, 0xd6, 0x14, 0x17, 0xac, 0x71, 0x44, 0xcf, 0xc3, + 0xb8, 0x5a, 0x80, 0xf5, 0x5a, 0x75, 0xd4, 0xbc, 0xd6, 0x48, 0xa5, 0x51, 0x0d, 0xeb, 0x74, 0xf6, + 0x3b, 0xd9, 0xf9, 0x22, 0x56, 0x80, 0xd6, 0xbf, 0xd6, 0xa0, 0xfd, 0x5b, 0xea, 0xdd, 0xbf, 0xf6, + 0x1f, 0x94, 0x61, 0xda, 0xa8, 0xac, 0x13, 0x0f, 0x20, 0xb3, 0x2e, 0xd0, 0x8d, 0xc8, 0x49, 0x88, + 0x58, 0x7f, 0x76, 0xff, 0xa5, 0xa2, 0x6f, 0x56, 0x74, 0x05, 0xf0, 0xf2, 0xe8, 0x6d, 0xa8, 0xf8, + 0x4e, 0xcc, 0x8c, 0x0f, 0x44, 0xac, 0xbb, 0x41, 0x98, 0xa5, 0x8a, 0xbe, 0x13, 0x27, 0xda, 0x5e, + 0xc0, 0x79, 0xa7, 0x2c, 0xe9, 0x8e, 0x49, 0x95, 0x13, 0x79, 0xb5, 0xa9, 0x1a, 0x41, 0x35, 0x98, + 0x3d, 0xcc, 0x71, 0xe8, 0x45, 0x98, 0x88, 0x08, 0x9b, 0x15, 0x2b, 0x54, 0xd7, 0x62, 0xd3, 0x6c, + 0x38, 0x55, 0xca, 0xb0, 0x86, 0xc3, 0x06, 0x65, 0xaa, 0x6b, 0x8f, 0xf4, 0xd0, 0xb5, 0x1f, 0x87, + 0x51, 0xf6, 0x43, 0xcd, 0x00, 0x35, 0x1a, 0x75, 0x0e, 0xc6, 0x12, 0x9f, 0x9d, 0x30, 0x63, 0x03, + 0x4e, 0x98, 0x27, 0x60, 0xaa, 0xe6, 0x90, 0x9d, 0x30, 0x58, 0x0d, 0xdc, 0x76, 0xe8, 0x05, 0x09, + 0xaa, 0xc2, 0x10, 0xdb, 0x1d, 0xf8, 0xda, 0x1e, 0xa2, 0x1c, 0xf0, 0x10, 0xd5, 0x9c, 0xed, 0x3f, + 0x2a, 0xc1, 0x64, 0x8d, 0xf8, 0x24, 0x21, 0xfc, 0xac, 0x11, 0xa3, 0x35, 0x40, 0x9b, 0x91, 0xd3, + 0x22, 0x0d, 0x12, 0x79, 0xa1, 0xab, 0x1b, 0x23, 0xcb, 0xcc, 0xe0, 0x8f, 0x2e, 0x74, 0x61, 0x71, + 0x4e, 0x09, 0xf4, 0x26, 0x4c, 0xb6, 0x23, 0x62, 0xd8, 0xd0, 0xac, 0x22, 0x75, 0xa1, 0xa1, 0x13, + 0x72, 0x4d, 0xd5, 0x00, 0x61, 0x93, 0x15, 0xfa, 0x0c, 0xcc, 0x84, 0x51, 0x7b, 0xcb, 0x09, 0x6a, + 0xa4, 0x4d, 0x02, 0x97, 0xaa, 0xe2, 0xc2, 0x46, 0x70, 0xf2, 0x60, 0x7f, 0x7e, 0xe6, 0x5a, 0x06, + 0x87, 0xbb, 0xa8, 0xd1, 0x9b, 0x30, 0xdb, 0x8e, 0xc2, 0xb6, 0xb3, 0xc9, 0x26, 0x8a, 0xd0, 0x38, + 0xb8, 0xf4, 0x79, 0xea, 0x60, 0x7f, 0x7e, 0xb6, 0x91, 0x45, 0x1e, 0xee, 0xcf, 0x9f, 0x60, 0x1d, + 0x45, 0x21, 0x29, 0x12, 0x77, 0xb3, 0xb1, 0x37, 0xe1, 0x54, 0x2d, 0xbc, 0x15, 0xdc, 0x72, 0x22, + 0x77, 0xa9, 0x51, 0xd7, 0x0e, 0xf7, 0x57, 0xe5, 0xe1, 0x92, 0x5f, 0xbf, 0xe6, 0xee, 0x53, 0x5a, + 0x49, 0xae, 0xfe, 0xaf, 0x79, 0x3e, 0x29, 0x30, 0x22, 0xfc, 0xed, 0x92, 0x51, 0x53, 0x4a, 0xaf, + 0xec, 0xfe, 0x56, 0xa1, 0xdd, 0xff, 0x35, 0x18, 0xdb, 0xf0, 0x88, 0xef, 0x62, 0xb2, 0x21, 0x46, + 0xe6, 0xb1, 0xe2, 0x1b, 0xa5, 0x35, 0x4a, 0x29, 0x8d, 0x46, 0xfc, 0x68, 0xba, 0x26, 0x0a, 0x63, + 0xc5, 0x06, 0x6d, 0xc3, 0x8c, 0x3c, 0xfb, 0x48, 0xac, 0x58, 0xc4, 0x8f, 0xf7, 0x3a, 0x50, 0x99, + 0xcc, 0xd9, 0x00, 0xe2, 0x0c, 0x1b, 0xdc, 0xc5, 0x98, 0x9e, 0x45, 0x77, 0xe8, 0x76, 0x35, 0xc4, + 0xa6, 0x34, 0x3b, 0x8b, 0xb2, 0x63, 0x35, 0x83, 0xda, 0x5f, 0xb5, 0xe0, 0xfe, 0xae, 0x9e, 0x11, + 0xe6, 0x85, 0xbb, 0x3c, 0x0a, 0xd9, 0xe3, 0x7e, 0xa9, 0xff, 0x71, 0xdf, 0xfe, 0x75, 0x0b, 0x4e, + 0xae, 0xee, 0xb4, 0x93, 0xbd, 0x9a, 0x67, 0xde, 0x4d, 0xbc, 0x00, 0x23, 0x3b, 0xc4, 0xf5, 0x3a, + 0x3b, 0x62, 0xe4, 0xe6, 0xa5, 0x48, 0xbf, 0xc2, 0xa0, 0x87, 0xfb, 0xf3, 0x93, 0xcd, 0x24, 0x8c, + 0x9c, 0x4d, 0xc2, 0x01, 0x58, 0x90, 0xa3, 0x9f, 0xe6, 0xba, 0xe9, 0x65, 0x6f, 0xc7, 0x93, 0x37, + 0x84, 0x3d, 0x4d, 0x5e, 0x0b, 0xb2, 0x43, 0x17, 0x5e, 0xeb, 0x38, 0x41, 0xe2, 0x25, 0x7b, 0xa6, + 0x2e, 0xcb, 0x18, 0xe1, 0x94, 0xa7, 0xfd, 0x5d, 0x0b, 0xa6, 0xa5, 0x3c, 0x59, 0x72, 0xdd, 0x88, + 0xc4, 0x31, 0x9a, 0x83, 0x92, 0xd7, 0x16, 0x2d, 0x05, 0x51, 0xba, 0x54, 0x6f, 0xe0, 0x92, 0xd7, + 0x46, 0x0d, 0xa8, 0xf0, 0xcb, 0xc6, 0x74, 0x82, 0x0d, 0x74, 0x65, 0xc9, 0xce, 0x7e, 0xeb, 0xb2, + 0x24, 0x4e, 0x99, 0x48, 0xcd, 0x98, 0xed, 0x45, 0x65, 0xf3, 0xde, 0xe6, 0xa2, 0x80, 0x63, 0x45, + 0x81, 0xce, 0xc1, 0x58, 0x10, 0xba, 0xfc, 0xee, 0x97, 0xaf, 0x6b, 0x36, 0x6d, 0xaf, 0x0a, 0x18, + 0x56, 0x58, 0xfb, 0xe7, 0x2c, 0x98, 0x90, 0x5f, 0x36, 0xa0, 0x92, 0x4e, 0x97, 0x57, 0xaa, 0xa0, + 0xa7, 0xcb, 0x8b, 0x2a, 0xd9, 0x0c, 0x63, 0xe8, 0xd6, 0xe5, 0xa3, 0xe8, 0xd6, 0xf6, 0x57, 0x4a, + 0x30, 0x25, 0x9b, 0xd3, 0xec, 0xdc, 0x8c, 0x49, 0x82, 0xd6, 0xa1, 0xe2, 0xf0, 0x2e, 0x27, 0x72, + 0xd6, 0x3e, 0x92, 0x7f, 0xea, 0x32, 0xc6, 0x27, 0x1d, 0xd1, 0x25, 0x59, 0x1a, 0xa7, 0x8c, 0x90, + 0x0f, 0xb3, 0x41, 0x98, 0xb0, 0xad, 0x4f, 0xe1, 0x7b, 0xdd, 0x0d, 0x64, 0xb9, 0x9f, 0x16, 0xdc, + 0x67, 0xaf, 0x66, 0xb9, 0xe0, 0x6e, 0xc6, 0x68, 0x55, 0x5a, 0x7a, 0xca, 0xac, 0x86, 0xb3, 0xbd, + 0x6a, 0x28, 0x36, 0xf4, 0xd8, 0xbf, 0x67, 0x41, 0x45, 0x92, 0x1d, 0xc7, 0x35, 0xd0, 0x15, 0x18, + 0x8d, 0xd9, 0x20, 0xc8, 0xae, 0xb1, 0x7b, 0x35, 0x9c, 0x8f, 0x57, 0xba, 0xa3, 0xf3, 0xff, 0x31, + 0x96, 0x3c, 0x98, 0xa9, 0x5a, 0x35, 0xff, 0x43, 0x62, 0xaa, 0x56, 0xed, 0x29, 0xd8, 0x65, 0xfe, + 0x2b, 0x6b, 0xb3, 0x76, 0x9e, 0xa7, 0x8a, 0x67, 0x3b, 0x22, 0x1b, 0xde, 0xed, 0xac, 0xe2, 0xd9, + 0x60, 0x50, 0x2c, 0xb0, 0xe8, 0x2d, 0x98, 0x68, 0x49, 0x0b, 0x6f, 0x2a, 0x06, 0x1e, 0xed, 0x69, + 0x2f, 0x57, 0x57, 0x2b, 0xdc, 0x2f, 0x6c, 0x45, 0x2b, 0x8f, 0x0d, 0x6e, 0xe6, 0xe5, 0x7c, 0xb9, + 0xdf, 0xe5, 0x7c, 0xca, 0xb7, 0xf0, 0x7a, 0xd9, 0xfe, 0x65, 0x0b, 0x46, 0xb8, 0x9d, 0x70, 0x30, + 0xc3, 0xaa, 0x76, 0x55, 0x94, 0xf6, 0xdd, 0x0d, 0x0a, 0x14, 0x37, 0x47, 0xe8, 0x0a, 0x54, 0xd8, + 0x0f, 0x66, 0x2f, 0x29, 0x17, 0x3b, 0xc4, 0xf1, 0x5a, 0xf5, 0x06, 0xde, 0x90, 0xc5, 0x70, 0xca, + 0xc1, 0xfe, 0x85, 0x32, 0x15, 0x55, 0x29, 0xa9, 0xb1, 0x8b, 0x5b, 0xf7, 0x6e, 0x17, 0x2f, 0xdd, + 0xab, 0x5d, 0x7c, 0x13, 0xa6, 0x5b, 0xda, 0xbd, 0x54, 0x3a, 0x92, 0xe7, 0x7a, 0x4e, 0x12, 0xed, + 0x0a, 0x8b, 0xdb, 0xca, 0x56, 0x4c, 0x26, 0x38, 0xcb, 0x15, 0x7d, 0x16, 0x26, 0xf8, 0x38, 0x8b, + 0x5a, 0x86, 0x58, 0x2d, 0x1f, 0x2b, 0x9e, 0x2f, 0x7a, 0x15, 0x6c, 0x26, 0x36, 0xb5, 0xe2, 0xd8, + 0x60, 0x66, 0x7f, 0x69, 0x18, 0x86, 0x57, 0x77, 0x49, 0x90, 0x1c, 0x83, 0x40, 0x6a, 0xc1, 0x94, + 0x17, 0xec, 0x86, 0xfe, 0x2e, 0x71, 0x39, 0xfe, 0x28, 0x9b, 0xeb, 0x7d, 0x82, 0xf5, 0x54, 0xdd, + 0x60, 0x81, 0x33, 0x2c, 0xef, 0xc5, 0xc9, 0xfd, 0x02, 0x8c, 0xf0, 0xb1, 0x17, 0xc7, 0xf6, 0x5c, + 0x2b, 0x38, 0xeb, 0x44, 0xb1, 0x0a, 0x52, 0xab, 0x02, 0x37, 0xbb, 0x8b, 0xe2, 0xe8, 0x1d, 0x98, + 0xda, 0xf0, 0xa2, 0x38, 0xa1, 0x47, 0xee, 0x38, 0x71, 0x76, 0xda, 0x77, 0x70, 0x52, 0x57, 0xfd, + 0xb0, 0x66, 0x70, 0xc2, 0x19, 0xce, 0x68, 0x13, 0x26, 0xe9, 0xe1, 0x31, 0xad, 0x6a, 0xf4, 0xc8, + 0x55, 0x29, 0x53, 0xdc, 0x65, 0x9d, 0x11, 0x36, 0xf9, 0x52, 0x61, 0xd2, 0x62, 0x87, 0xcd, 0x31, + 0xa6, 0x51, 0x28, 0x61, 0xc2, 0x4f, 0x99, 0x1c, 0x47, 0x65, 0x12, 0xf3, 0xe7, 0xa8, 0x98, 0x32, + 0x29, 0xf5, 0xda, 0xb0, 0xbf, 0x46, 0x77, 0x47, 0xda, 0x87, 0xc7, 0xb0, 0xb5, 0xbc, 0x62, 0x6e, + 0x2d, 0xa7, 0x0b, 0xc7, 0xb3, 0x60, 0x5b, 0xf9, 0x1c, 0x8c, 0x6b, 0xc3, 0x8d, 0x16, 0xa1, 0xd2, + 0x92, 0xce, 0x07, 0x42, 0xea, 0x2a, 0xf5, 0x45, 0x79, 0x25, 0xe0, 0x94, 0x86, 0xf6, 0x06, 0x55, + 0xf6, 0xb2, 0xae, 0x4d, 0x54, 0x15, 0xc4, 0x0c, 0x63, 0x3f, 0x0b, 0xb0, 0x7a, 0x9b, 0xb4, 0x96, + 0xf8, 0xe1, 0x4b, 0xbb, 0xe3, 0xb2, 0x8a, 0xef, 0xb8, 0xec, 0xff, 0x60, 0xc1, 0xd4, 0xda, 0x8a, + 0xa1, 0x94, 0x2f, 0x00, 0x70, 0x2d, 0xf4, 0xf5, 0xd7, 0xaf, 0x4a, 0xeb, 0x30, 0x37, 0xf0, 0x29, + 0x28, 0xd6, 0x28, 0xd0, 0x69, 0x28, 0xfb, 0x9d, 0x40, 0x28, 0x87, 0xa3, 0x07, 0xfb, 0xf3, 0xe5, + 0xcb, 0x9d, 0x00, 0x53, 0x98, 0xe6, 0x4d, 0x54, 0x1e, 0xd8, 0x9b, 0xa8, 0xaf, 0x1b, 0x36, 0x9a, + 0x87, 0xe1, 0x5b, 0xb7, 0x3c, 0x37, 0xae, 0x0e, 0xa7, 0x96, 0xeb, 0xd7, 0x5f, 0xaf, 0xd7, 0x62, + 0xcc, 0xe1, 0xf6, 0x5f, 0x2e, 0xc3, 0xcc, 0x9a, 0x4f, 0x6e, 0x1b, 0x9f, 0xf5, 0x28, 0x8c, 0xb8, + 0x91, 0xb7, 0x4b, 0xa2, 0xec, 0x2e, 0x5e, 0x63, 0x50, 0x2c, 0xb0, 0x03, 0x7b, 0x40, 0x5d, 0xef, + 0xde, 0x8f, 0xef, 0xb6, 0xcf, 0x57, 0xff, 0xae, 0x78, 0x0b, 0x46, 0xf9, 0x55, 0x29, 0xef, 0x8c, + 0xf1, 0xf3, 0xcf, 0xe4, 0x35, 0x21, 0xdb, 0x17, 0x0b, 0xc2, 0xf8, 0xc1, 0xfd, 0x46, 0x94, 0x10, + 0x13, 0x50, 0x2c, 0x59, 0xce, 0x7d, 0x12, 0x26, 0x74, 0xca, 0x23, 0x39, 0x90, 0xfc, 0x15, 0x0b, + 0x4e, 0xac, 0xf9, 0x61, 0x6b, 0x3b, 0xe3, 0x8e, 0xf6, 0x3c, 0x8c, 0xd3, 0xf5, 0x14, 0x1b, 0xae, + 0xad, 0x86, 0xb3, 0xb3, 0x40, 0x61, 0x9d, 0x4e, 0x2b, 0x76, 0xfd, 0x7a, 0xbd, 0x96, 0xe7, 0x23, + 0x2d, 0x50, 0x58, 0xa7, 0xb3, 0xbf, 0x63, 0xc1, 0x43, 0x17, 0x56, 0x56, 0x53, 0x8f, 0xcc, 0x2e, + 0x37, 0x6d, 0xaa, 0xdc, 0xb9, 0x5a, 0x53, 0x52, 0xe5, 0xae, 0xc6, 0x5a, 0x21, 0xb0, 0x1f, 0x96, + 0x10, 0x84, 0x5f, 0xb5, 0xe0, 0xc4, 0x05, 0x2f, 0xc1, 0xa4, 0x1d, 0x66, 0x1d, 0x86, 0x23, 0xd2, + 0x0e, 0x63, 0x2f, 0x09, 0xa3, 0xbd, 0xac, 0xc3, 0x30, 0x56, 0x18, 0xac, 0x51, 0xf1, 0x9a, 0x77, + 0xbd, 0x98, 0xb6, 0xb4, 0x64, 0x9e, 0x30, 0xb1, 0x80, 0x63, 0x45, 0x41, 0x3f, 0xcc, 0xf5, 0x22, + 0xa6, 0x21, 0xec, 0x89, 0xe5, 0xac, 0x3e, 0xac, 0x26, 0x11, 0x38, 0xa5, 0xb1, 0xbf, 0x6a, 0xc1, + 0xa9, 0x0b, 0x7e, 0x27, 0x4e, 0x48, 0xb4, 0x11, 0x1b, 0x8d, 0x7d, 0x16, 0x2a, 0x44, 0x6a, 0xe1, + 0xa2, 0xad, 0x6a, 0xdf, 0x50, 0xea, 0x39, 0xf7, 0x56, 0x56, 0x74, 0x03, 0xf8, 0x76, 0x1e, 0xcd, + 0x27, 0xf1, 0xeb, 0x25, 0x98, 0xbc, 0xb8, 0xbe, 0xde, 0xb8, 0x40, 0x12, 0x21, 0x32, 0xfb, 0x5b, + 0x91, 0xb0, 0x76, 0x10, 0xee, 0xa5, 0xeb, 0x74, 0x12, 0xcf, 0x5f, 0xe0, 0xe1, 0x31, 0x0b, 0xf5, + 0x20, 0xb9, 0x16, 0x35, 0x93, 0xc8, 0x0b, 0x36, 0x73, 0x8f, 0xce, 0x52, 0xb0, 0x97, 0x8b, 0x04, + 0x3b, 0x7a, 0x16, 0x46, 0x58, 0x7c, 0x8e, 0xd4, 0x3a, 0x1e, 0x50, 0xaa, 0x02, 0x83, 0x1e, 0xee, + 0xcf, 0x57, 0xae, 0xe3, 0x3a, 0xff, 0x83, 0x05, 0x29, 0xba, 0x0e, 0xe3, 0x5b, 0x49, 0xd2, 0xbe, + 0x48, 0x1c, 0x97, 0x44, 0x52, 0x3a, 0x9c, 0xc9, 0x93, 0x0e, 0xb4, 0x13, 0x38, 0x59, 0xba, 0xa0, + 0x52, 0x58, 0x8c, 0x75, 0x3e, 0x76, 0x13, 0x20, 0xc5, 0xdd, 0xa5, 0x63, 0x83, 0xfd, 0x03, 0x0b, + 0x46, 0x2f, 0x3a, 0x81, 0xeb, 0x93, 0x08, 0xbd, 0x0c, 0x43, 0xe4, 0x36, 0x69, 0x89, 0x1d, 0x3c, + 0xb7, 0xc1, 0xe9, 0x2e, 0xc7, 0x0d, 0x61, 0xf4, 0x3f, 0x66, 0xa5, 0xd0, 0x45, 0x18, 0xa5, 0xad, + 0xbd, 0xa0, 0xfc, 0xc6, 0x1f, 0x2e, 0xfa, 0x62, 0x35, 0xec, 0x7c, 0x63, 0x14, 0x20, 0x2c, 0x8b, + 0x33, 0x83, 0x4e, 0xab, 0xdd, 0xa4, 0x02, 0x2c, 0xe9, 0x75, 0xdc, 0x5a, 0x5f, 0x69, 0x70, 0x22, + 0xc1, 0x8d, 0x1b, 0x74, 0x24, 0x10, 0xa7, 0x4c, 0xec, 0x75, 0xa8, 0xd0, 0x41, 0x5d, 0xf2, 0x3d, + 0xa7, 0xb7, 0x2d, 0xe9, 0x49, 0xa8, 0x48, 0xbb, 0x4e, 0x2c, 0x5c, 0xcf, 0x19, 0x57, 0x69, 0xf6, + 0x89, 0x71, 0x8a, 0xb7, 0x37, 0xe0, 0x24, 0xbb, 0x28, 0x75, 0x92, 0x2d, 0x63, 0x8d, 0xf5, 0x9f, + 0xcc, 0x4f, 0x09, 0xfd, 0x8a, 0x8f, 0x4c, 0x55, 0xf3, 0x95, 0x9d, 0x90, 0x1c, 0x35, 0x5d, 0xeb, + 0x3f, 0x0f, 0xc1, 0x6c, 0xbd, 0xb9, 0xd2, 0x34, 0x8d, 0x8b, 0x2f, 0xc2, 0x04, 0xd7, 0x04, 0xe8, + 0x84, 0x76, 0x7c, 0x51, 0x9b, 0xba, 0x3c, 0x58, 0xd7, 0x70, 0xd8, 0xa0, 0x44, 0x0f, 0x41, 0xd9, + 0x7b, 0x37, 0xc8, 0xba, 0xc3, 0xd5, 0x5f, 0xbb, 0x8a, 0x29, 0x9c, 0xa2, 0xa9, 0x52, 0xc1, 0x05, + 0xa8, 0x42, 0x2b, 0xc5, 0xe2, 0x15, 0x98, 0xf2, 0xe2, 0x56, 0xec, 0xd5, 0x03, 0x2a, 0x5d, 0xd2, + 0xb8, 0x8b, 0x54, 0xe3, 0xa7, 0x4d, 0x55, 0x58, 0x9c, 0xa1, 0xd6, 0xa4, 0xf9, 0xf0, 0xc0, 0x8a, + 0x49, 0x5f, 0x0f, 0x6c, 0xaa, 0x73, 0xb5, 0xd9, 0xd7, 0xc5, 0xcc, 0x35, 0x47, 0xe8, 0x5c, 0xfc, + 0x83, 0x63, 0x2c, 0x71, 0xe8, 0x02, 0xcc, 0xb6, 0xb6, 0x9c, 0xf6, 0x52, 0x27, 0xd9, 0xaa, 0x79, + 0x71, 0x2b, 0xdc, 0x25, 0xd1, 0x1e, 0xd3, 0x84, 0xc7, 0x52, 0x23, 0x93, 0x42, 0xac, 0x5c, 0x5c, + 0x6a, 0x50, 0x4a, 0xdc, 0x5d, 0xc6, 0x54, 0x41, 0xe0, 0xae, 0xa9, 0x20, 0x4b, 0x30, 0x2d, 0xeb, + 0x6a, 0x92, 0x98, 0x6d, 0x0f, 0xe3, 0xac, 0x75, 0x2a, 0x2c, 0x4a, 0x80, 0x55, 0xdb, 0xb2, 0xf4, + 0xe8, 0x05, 0x98, 0xf4, 0x02, 0x2f, 0xf1, 0x9c, 0x24, 0x8c, 0xd8, 0xe6, 0x3a, 0xc1, 0x37, 0x0c, + 0x2a, 0xe1, 0xeb, 0x3a, 0x02, 0x9b, 0x74, 0xf6, 0x3b, 0x50, 0x51, 0xfe, 0x66, 0xd2, 0x65, 0xd2, + 0x2a, 0x70, 0x99, 0xec, 0xbf, 0x23, 0x48, 0xab, 0x79, 0x39, 0xd7, 0x6a, 0xfe, 0x77, 0x2c, 0x48, + 0xdd, 0x6e, 0xd0, 0x45, 0xa8, 0xb4, 0x43, 0x76, 0x73, 0x16, 0xc9, 0xeb, 0xe8, 0x07, 0x72, 0x85, + 0x07, 0x17, 0x54, 0xbc, 0xff, 0x1a, 0xb2, 0x04, 0x4e, 0x0b, 0xa3, 0x65, 0x18, 0x6d, 0x47, 0xa4, + 0x99, 0xb0, 0xc0, 0x91, 0xbe, 0x7c, 0xf8, 0x1c, 0xe1, 0xf4, 0x58, 0x16, 0xb4, 0x7f, 0xd3, 0x02, + 0xe0, 0x46, 0x69, 0x27, 0xd8, 0x24, 0xc7, 0x70, 0xd0, 0xae, 0xc1, 0x50, 0xdc, 0x26, 0xad, 0x5e, + 0x77, 0x9a, 0x69, 0x7b, 0x9a, 0x6d, 0xd2, 0x4a, 0x3b, 0x9c, 0xfe, 0xc3, 0xac, 0xb4, 0xfd, 0xb3, + 0x00, 0x53, 0x29, 0x19, 0x3d, 0x00, 0xa1, 0xa7, 0x0d, 0xb7, 0xfc, 0xd3, 0x19, 0xb7, 0xfc, 0x0a, + 0xa3, 0xd6, 0x3c, 0xf1, 0xdf, 0x81, 0xf2, 0x8e, 0x73, 0x5b, 0x9c, 0xb2, 0x9e, 0xec, 0xdd, 0x0c, + 0xca, 0x7f, 0xe1, 0x8a, 0x73, 0x9b, 0xeb, 0xb1, 0x4f, 0xca, 0x09, 0x72, 0xc5, 0xb9, 0x7d, 0xc8, + 0x6f, 0x2e, 0x99, 0x90, 0xa2, 0x87, 0xb9, 0x2f, 0xfc, 0x71, 0xfa, 0x9f, 0x4d, 0x3b, 0x5a, 0x09, + 0xab, 0xcb, 0x0b, 0x84, 0x89, 0x76, 0xa0, 0xba, 0xbc, 0x20, 0x5b, 0x97, 0x17, 0x0c, 0x50, 0x97, + 0x17, 0xa0, 0xf7, 0x60, 0x54, 0x5c, 0x89, 0x30, 0x7f, 0xc2, 0xf1, 0xf3, 0x8b, 0x03, 0xd4, 0x27, + 0x6e, 0x54, 0x78, 0x9d, 0x8b, 0x52, 0x4f, 0x17, 0xd0, 0xbe, 0xf5, 0xca, 0x0a, 0xd1, 0xdf, 0xb2, + 0x60, 0x4a, 0xfc, 0xc6, 0xe4, 0xdd, 0x0e, 0x89, 0x13, 0xa1, 0x0f, 0x7c, 0x62, 0xf0, 0x36, 0x88, + 0x82, 0xbc, 0x29, 0x9f, 0x90, 0x62, 0xd6, 0x44, 0xf6, 0x6d, 0x51, 0xa6, 0x15, 0xe8, 0x9f, 0x5a, + 0x70, 0x72, 0xc7, 0xb9, 0xcd, 0x6b, 0xe4, 0x30, 0xec, 0x24, 0x5e, 0x28, 0xfc, 0x23, 0x5f, 0x1e, + 0x6c, 0xf8, 0xbb, 0x8a, 0xf3, 0x46, 0x4a, 0x57, 0xaa, 0x93, 0x79, 0x24, 0x7d, 0x9b, 0x9a, 0xdb, + 0xae, 0xb9, 0x0d, 0x18, 0x93, 0xf3, 0x2d, 0xe7, 0x34, 0x54, 0xd3, 0x95, 0x9d, 0x23, 0xdf, 0x48, + 0x69, 0xa7, 0x27, 0x56, 0x8f, 0x98, 0x6b, 0xf7, 0xb4, 0x9e, 0x77, 0x60, 0x42, 0x9f, 0x63, 0xf7, + 0xb4, 0xae, 0x77, 0xe1, 0x44, 0xce, 0x5c, 0xba, 0xa7, 0x55, 0xde, 0x82, 0xd3, 0x85, 0xf3, 0xe3, + 0x5e, 0x56, 0x6c, 0x7f, 0xdd, 0xd2, 0xe5, 0xe0, 0x31, 0x98, 0xa7, 0x56, 0x4c, 0xf3, 0xd4, 0x99, + 0xde, 0x2b, 0xa7, 0xc0, 0x46, 0xf5, 0x96, 0xde, 0x68, 0x2a, 0xd5, 0xd1, 0xab, 0x30, 0xe2, 0x53, + 0x88, 0xbc, 0x87, 0xb3, 0xfb, 0xaf, 0xc8, 0x54, 0x97, 0x62, 0xf0, 0x18, 0x0b, 0x0e, 0xf6, 0xef, + 0x58, 0x30, 0x74, 0x0c, 0x3d, 0x81, 0xcd, 0x9e, 0x78, 0xba, 0x90, 0xb5, 0xc8, 0x7d, 0xb0, 0x80, + 0x9d, 0x5b, 0xab, 0xb7, 0x13, 0x12, 0xc4, 0x4c, 0x7d, 0xcf, 0xed, 0x98, 0xff, 0x53, 0x82, 0x71, + 0x5a, 0x95, 0x74, 0x1a, 0x79, 0x09, 0x26, 0x7d, 0xe7, 0x26, 0xf1, 0xa5, 0xc9, 0x3c, 0x7b, 0x88, + 0xbd, 0xac, 0x23, 0xb1, 0x49, 0x4b, 0x0b, 0x6f, 0xe8, 0xb7, 0x07, 0x42, 0x7f, 0x51, 0x85, 0x8d, + 0xab, 0x05, 0x6c, 0xd2, 0xd2, 0xf3, 0xd4, 0x2d, 0x27, 0x69, 0x6d, 0x89, 0x03, 0xae, 0x6a, 0xee, + 0xeb, 0x14, 0x88, 0x39, 0x8e, 0x2a, 0x70, 0x72, 0x76, 0xde, 0x20, 0x11, 0x53, 0xe0, 0xb8, 0x7a, + 0xac, 0x14, 0x38, 0x6c, 0xa2, 0x71, 0x96, 0x3e, 0x27, 0x3e, 0x6f, 0x98, 0xb9, 0xc4, 0x0c, 0x10, + 0x9f, 0x87, 0x1a, 0x70, 0xd2, 0x0b, 0x5a, 0x7e, 0xc7, 0x25, 0xd7, 0x03, 0xae, 0xdd, 0xf9, 0xde, + 0x7b, 0xc4, 0x15, 0x0a, 0xb4, 0xf2, 0x5e, 0xaa, 0xe7, 0xd0, 0xe0, 0xdc, 0x92, 0xf6, 0x4f, 0xc3, + 0x89, 0xcb, 0xa1, 0xe3, 0x2e, 0x3b, 0xbe, 0x13, 0xb4, 0x48, 0x54, 0x0f, 0x36, 0xfb, 0x5e, 0xc8, + 0xeb, 0xd7, 0xe7, 0xa5, 0x7e, 0xd7, 0xe7, 0xf6, 0x16, 0x20, 0xbd, 0x02, 0xe1, 0x0a, 0x86, 0x61, + 0xd4, 0xe3, 0x55, 0x89, 0xe9, 0xff, 0x58, 0xbe, 0x76, 0xdd, 0xd5, 0x32, 0xcd, 0xc9, 0x89, 0x03, + 0xb0, 0x64, 0x64, 0xbf, 0x08, 0xb9, 0xf1, 0x19, 0xfd, 0x8f, 0xd2, 0xf6, 0xf3, 0x30, 0xcb, 0x4a, + 0x1e, 0xed, 0x98, 0x67, 0xff, 0x75, 0x0b, 0xa6, 0xaf, 0x66, 0x22, 0x6a, 0x1f, 0x85, 0x91, 0x98, + 0x44, 0x39, 0xb6, 0xd0, 0x26, 0x83, 0x62, 0x81, 0xbd, 0xeb, 0x36, 0x97, 0x1f, 0x5a, 0x50, 0x51, + 0xe1, 0xef, 0xc7, 0xa0, 0xd4, 0xae, 0x18, 0x4a, 0x6d, 0xae, 0x2d, 0x40, 0x35, 0xa7, 0x48, 0xa7, + 0x45, 0x97, 0x54, 0x6c, 0x68, 0x0f, 0x33, 0x40, 0xca, 0x86, 0x47, 0x12, 0x4e, 0x99, 0x01, 0xa4, + 0x32, 0x5a, 0x94, 0xdd, 0x88, 0x2b, 0xda, 0x0f, 0xc9, 0x8d, 0xb8, 0x6a, 0x4f, 0x81, 0xf4, 0x6b, + 0x68, 0x4d, 0x66, 0xbb, 0xc2, 0xa7, 0x99, 0xe7, 0x28, 0x5b, 0x9b, 0x2a, 0x24, 0x7b, 0x5e, 0x78, + 0x82, 0x0a, 0xe8, 0x21, 0x13, 0x64, 0xe2, 0x1f, 0x4f, 0x55, 0x90, 0x16, 0xb1, 0x2f, 0xc2, 0x74, + 0xa6, 0xc3, 0xd0, 0xf3, 0x30, 0xdc, 0xde, 0x72, 0x62, 0x92, 0xf1, 0x04, 0x1a, 0x6e, 0x50, 0xe0, + 0xe1, 0xfe, 0xfc, 0x94, 0x2a, 0xc0, 0x20, 0x98, 0x53, 0xdb, 0xff, 0xc3, 0x82, 0xa1, 0xab, 0xa1, + 0x7b, 0x1c, 0x93, 0xe9, 0x15, 0x63, 0x32, 0x3d, 0x58, 0x94, 0xe8, 0xa5, 0x70, 0x1e, 0xad, 0x65, + 0xe6, 0xd1, 0x99, 0x42, 0x0e, 0xbd, 0xa7, 0xd0, 0x0e, 0x8c, 0xb3, 0xf4, 0x31, 0xc2, 0x2b, 0xe9, + 0x59, 0xe3, 0x7c, 0x35, 0x9f, 0x39, 0x5f, 0x4d, 0x6b, 0xa4, 0xda, 0x29, 0xeb, 0x71, 0x18, 0x15, + 0x9e, 0x31, 0x59, 0x1f, 0x59, 0x41, 0x8b, 0x25, 0xde, 0xfe, 0xe5, 0x32, 0x18, 0xe9, 0x6a, 0xd0, + 0xef, 0x59, 0xb0, 0x10, 0xf1, 0xa8, 0x20, 0xb7, 0xd6, 0x89, 0xbc, 0x60, 0xb3, 0xd9, 0xda, 0x22, + 0x6e, 0xc7, 0xf7, 0x82, 0xcd, 0xfa, 0x66, 0x10, 0x2a, 0xf0, 0xea, 0x6d, 0xd2, 0xea, 0x30, 0x3b, + 0x78, 0x9f, 0xdc, 0x38, 0xea, 0xe6, 0xf9, 0xfc, 0xc1, 0xfe, 0xfc, 0x02, 0x3e, 0x12, 0x6f, 0x7c, + 0xc4, 0xb6, 0xa0, 0xef, 0x58, 0xb0, 0xc8, 0xb3, 0xb8, 0x0c, 0xde, 0xfe, 0x1e, 0xa7, 0xd1, 0x86, + 0x64, 0x95, 0x32, 0x59, 0x27, 0xd1, 0xce, 0xf2, 0x0b, 0xa2, 0x43, 0x17, 0x1b, 0x47, 0xab, 0x0b, + 0x1f, 0xb5, 0x71, 0xf6, 0xbf, 0x2a, 0xc3, 0x24, 0xed, 0xc5, 0x34, 0x12, 0xfe, 0x79, 0x63, 0x4a, + 0x3c, 0x9c, 0x99, 0x12, 0xb3, 0x06, 0xf1, 0xdd, 0x09, 0x82, 0x8f, 0x61, 0xd6, 0x77, 0xe2, 0xe4, + 0x22, 0x71, 0xa2, 0xe4, 0x26, 0x71, 0xd8, 0x55, 0xaf, 0x98, 0xe6, 0x47, 0xb9, 0x3d, 0x56, 0xe6, + 0xaf, 0xcb, 0x59, 0x66, 0xb8, 0x9b, 0x3f, 0xda, 0x05, 0xc4, 0xae, 0x95, 0x23, 0x27, 0x88, 0xf9, + 0xb7, 0x78, 0xc2, 0x46, 0x7e, 0xb4, 0x5a, 0xe7, 0x44, 0xad, 0xe8, 0x72, 0x17, 0x37, 0x9c, 0x53, + 0x83, 0xe6, 0x2e, 0x30, 0x3c, 0xa8, 0xbb, 0xc0, 0x48, 0x1f, 0x47, 0xf4, 0x1d, 0x98, 0x11, 0xa3, + 0xb2, 0xe1, 0x6d, 0x8a, 0x4d, 0xfa, 0x8d, 0x8c, 0x3b, 0x91, 0x35, 0xb8, 0xe3, 0x43, 0x1f, 0x5f, + 0x22, 0xfb, 0x67, 0xe0, 0x04, 0xad, 0xce, 0x74, 0x9b, 0x8e, 0x11, 0x81, 0xe9, 0xed, 0xce, 0x4d, + 0xe2, 0x93, 0x44, 0xc2, 0x44, 0xa5, 0xb9, 0x6a, 0xbf, 0x59, 0x3a, 0xd5, 0x2d, 0x2f, 0x99, 0x2c, + 0x70, 0x96, 0xa7, 0xfd, 0x2b, 0x16, 0x30, 0xc7, 0xc4, 0x63, 0xd8, 0xfe, 0x3e, 0x65, 0x6e, 0x7f, + 0xd5, 0x22, 0x09, 0x54, 0xb0, 0xf3, 0x3d, 0xc7, 0x87, 0xa5, 0x11, 0x85, 0xb7, 0xf7, 0xa4, 0xee, + 0xdf, 0x5f, 0xe3, 0xfa, 0xdf, 0x16, 0x5f, 0x90, 0x2a, 0x48, 0x12, 0x7d, 0x1e, 0xc6, 0x5a, 0x4e, + 0xdb, 0x69, 0xf1, 0x3c, 0x61, 0x85, 0xd6, 0x1f, 0xa3, 0xd0, 0xc2, 0x8a, 0x28, 0xc1, 0xad, 0x19, + 0x1f, 0x97, 0x5f, 0x29, 0xc1, 0x7d, 0x2d, 0x18, 0xaa, 0xca, 0xb9, 0x6d, 0x98, 0x34, 0x98, 0xdd, + 0xd3, 0xa3, 0xef, 0xe7, 0xf9, 0x76, 0xa1, 0x4e, 0x2c, 0x3b, 0x30, 0x1b, 0x68, 0xff, 0xa9, 0x70, + 0x94, 0xea, 0xf4, 0x47, 0xfb, 0x6d, 0x08, 0x4c, 0x92, 0x6a, 0x8e, 0x97, 0x19, 0x36, 0xb8, 0x9b, + 0xb3, 0xfd, 0xf7, 0x2c, 0xb8, 0x5f, 0x27, 0xd4, 0xe2, 0x57, 0xfb, 0xd9, 0x93, 0x6b, 0x30, 0x16, + 0xb6, 0x49, 0xe4, 0xa4, 0x67, 0xb2, 0x73, 0xb2, 0xd3, 0xaf, 0x09, 0xf8, 0xe1, 0xfe, 0xfc, 0x49, + 0x9d, 0xbb, 0x84, 0x63, 0x55, 0x12, 0xd9, 0x30, 0xc2, 0x3a, 0x23, 0x16, 0xb1, 0xc5, 0x2c, 0x97, + 0x16, 0xbb, 0xee, 0x8a, 0xb1, 0xc0, 0xd8, 0x3f, 0x6b, 0xf1, 0x89, 0xa5, 0x37, 0x1d, 0xbd, 0x0b, + 0x33, 0x3b, 0xf4, 0xf8, 0xb6, 0x7a, 0xbb, 0x1d, 0x71, 0x33, 0xba, 0xec, 0xa7, 0x27, 0xfb, 0xf5, + 0x93, 0xf6, 0x91, 0xcb, 0x55, 0xd1, 0xe6, 0x99, 0x2b, 0x19, 0x66, 0xb8, 0x8b, 0xbd, 0xfd, 0xe7, + 0x25, 0xbe, 0x12, 0x99, 0x56, 0xf7, 0x38, 0x8c, 0xb6, 0x43, 0x77, 0xa5, 0x5e, 0xc3, 0xa2, 0x87, + 0x94, 0xb8, 0x6a, 0x70, 0x30, 0x96, 0x78, 0x74, 0x1e, 0x80, 0xdc, 0x4e, 0x48, 0x14, 0x38, 0xbe, + 0xba, 0x8c, 0x57, 0xca, 0xd3, 0xaa, 0xc2, 0x60, 0x8d, 0x8a, 0x96, 0x69, 0x47, 0xe1, 0xae, 0xe7, + 0xb2, 0xe0, 0x8e, 0xb2, 0x59, 0xa6, 0xa1, 0x30, 0x58, 0xa3, 0xa2, 0x47, 0xe5, 0x4e, 0x10, 0xf3, + 0x0d, 0xd0, 0xb9, 0x29, 0xd2, 0xf1, 0x8c, 0xa5, 0x47, 0xe5, 0xeb, 0x3a, 0x12, 0x9b, 0xb4, 0x68, + 0x09, 0x46, 0x12, 0x87, 0x5d, 0x31, 0x0f, 0x17, 0xbb, 0xec, 0xac, 0x53, 0x0a, 0x3d, 0x71, 0x14, + 0x2d, 0x80, 0x45, 0x41, 0xf4, 0xa6, 0x14, 0xc1, 0x5c, 0x24, 0x0b, 0xd7, 0xab, 0xc2, 0x69, 0xab, + 0x8b, 0x6f, 0x5d, 0x06, 0x0b, 0x97, 0x2e, 0x83, 0x97, 0xfd, 0xc5, 0x0a, 0x40, 0xaa, 0xed, 0xa1, + 0xf7, 0xba, 0x44, 0xc4, 0x53, 0xbd, 0xf5, 0xc3, 0xbb, 0x27, 0x1f, 0xd0, 0x97, 0x2c, 0x18, 0x77, + 0x7c, 0x3f, 0x6c, 0x39, 0x09, 0xeb, 0xe5, 0x52, 0x6f, 0x11, 0x25, 0xea, 0x5f, 0x4a, 0x4b, 0xf0, + 0x26, 0x3c, 0x2b, 0x6f, 0x8f, 0x35, 0x4c, 0xdf, 0x56, 0xe8, 0x15, 0xa3, 0x8f, 0xcb, 0x43, 0x00, + 0x9f, 0x1e, 0x73, 0xd9, 0x43, 0x40, 0x85, 0x49, 0x63, 0x4d, 0xff, 0x47, 0xd7, 0x8d, 0xbc, 0x35, + 0x43, 0xc5, 0x21, 0xba, 0x86, 0xd2, 0xd3, 0x2f, 0x65, 0x0d, 0x6a, 0xe8, 0x2e, 0xe8, 0xc3, 0xc5, + 0x71, 0xec, 0x9a, 0x76, 0xdd, 0xc7, 0xfd, 0xfc, 0x1d, 0x98, 0x76, 0xcd, 0xed, 0x56, 0xcc, 0xa6, + 0xc7, 0x8a, 0xf8, 0x66, 0x76, 0xe7, 0x74, 0x83, 0xcd, 0x20, 0x70, 0x96, 0x31, 0x6a, 0xf0, 0x60, + 0x80, 0x7a, 0xb0, 0x11, 0x0a, 0x17, 0x3e, 0xbb, 0x70, 0x2c, 0xf7, 0xe2, 0x84, 0xec, 0x50, 0xca, + 0x74, 0x1f, 0xbd, 0x2a, 0xca, 0x62, 0xc5, 0x05, 0xbd, 0x0a, 0x23, 0x2c, 0x4a, 0x2b, 0xae, 0x8e, + 0x15, 0xdb, 0x01, 0xcd, 0x00, 0xe3, 0x74, 0x51, 0xb1, 0xbf, 0x31, 0x16, 0x1c, 0xd0, 0x45, 0x99, + 0x26, 0x20, 0xae, 0x07, 0xd7, 0x63, 0xc2, 0xd2, 0x04, 0x54, 0x96, 0x3f, 0x9a, 0x66, 0x00, 0xe0, + 0xf0, 0xdc, 0x14, 0x91, 0x46, 0x49, 0xaa, 0xaf, 0x88, 0xff, 0x32, 0xf3, 0x64, 0x15, 0x8a, 0x9b, + 0x67, 0x66, 0xa7, 0x4c, 0xbb, 0xf3, 0x86, 0xc9, 0x02, 0x67, 0x79, 0x1e, 0xeb, 0xf6, 0x39, 0x17, + 0xc0, 0x4c, 0x76, 0x61, 0xdd, 0xd3, 0xed, 0xfa, 0x07, 0x43, 0x30, 0x65, 0x4e, 0x04, 0xb4, 0x08, + 0x15, 0xc1, 0x44, 0xa5, 0x0c, 0x53, 0x73, 0xfb, 0x8a, 0x44, 0xe0, 0x94, 0x86, 0xa5, 0x4c, 0x63, + 0xc5, 0x35, 0xdf, 0xac, 0x34, 0x65, 0x9a, 0xc2, 0x60, 0x8d, 0x8a, 0x2a, 0xd1, 0x37, 0xc3, 0x30, + 0x51, 0x5b, 0x81, 0x9a, 0x2d, 0xcb, 0x0c, 0x8a, 0x05, 0x96, 0x6e, 0x01, 0xdb, 0x24, 0x0a, 0x88, + 0x6f, 0x5a, 0x32, 0xd5, 0x16, 0x70, 0x49, 0x47, 0x62, 0x93, 0x96, 0x6e, 0x69, 0x61, 0xcc, 0xa6, + 0x9f, 0x50, 0xd5, 0x53, 0x5f, 0xb7, 0x26, 0x8f, 0x52, 0x94, 0x78, 0xf4, 0x06, 0xdc, 0xaf, 0x82, + 0x0a, 0x31, 0xb7, 0x0c, 0xcb, 0x1a, 0x47, 0x8c, 0x93, 0xf5, 0xfd, 0x2b, 0xf9, 0x64, 0xb8, 0xa8, + 0x3c, 0x7a, 0x05, 0xa6, 0x84, 0x0a, 0x2c, 0x39, 0x8e, 0x9a, 0xce, 0x0a, 0x97, 0x0c, 0x2c, 0xce, + 0x50, 0xa3, 0x1a, 0xcc, 0x50, 0x08, 0xd3, 0x42, 0x25, 0x07, 0x1e, 0x1c, 0xa9, 0xf6, 0xfa, 0x4b, + 0x19, 0x3c, 0xee, 0x2a, 0x81, 0x96, 0x60, 0x9a, 0xeb, 0x28, 0xf4, 0x4c, 0xc9, 0xc6, 0x41, 0x78, + 0xd6, 0xaa, 0x85, 0x70, 0xcd, 0x44, 0xe3, 0x2c, 0x3d, 0x7a, 0x11, 0x26, 0x9c, 0xa8, 0xb5, 0xe5, + 0x25, 0xa4, 0x95, 0x74, 0x22, 0x9e, 0x84, 0x43, 0xf3, 0xf6, 0x58, 0xd2, 0x70, 0xd8, 0xa0, 0xb4, + 0xdf, 0x83, 0x13, 0x39, 0x4e, 0xf9, 0x74, 0xe2, 0x38, 0x6d, 0x4f, 0x7e, 0x53, 0xc6, 0x6b, 0x6d, + 0xa9, 0x51, 0x97, 0x5f, 0xa3, 0x51, 0xd1, 0xd9, 0xc9, 0x4c, 0xe2, 0x5a, 0x7a, 0x58, 0x35, 0x3b, + 0xd7, 0x24, 0x02, 0xa7, 0x34, 0xf6, 0xb7, 0x01, 0x34, 0x83, 0xce, 0x00, 0x3e, 0x4b, 0x2f, 0xc2, + 0x84, 0xcc, 0x69, 0xac, 0xe5, 0xd2, 0x54, 0x9f, 0x79, 0x41, 0xc3, 0x61, 0x83, 0x92, 0xb6, 0x2d, + 0x50, 0x99, 0x40, 0x33, 0x3e, 0x72, 0x69, 0x1e, 0xd0, 0x94, 0x06, 0x3d, 0x05, 0x63, 0x31, 0xf1, + 0x37, 0x2e, 0x7b, 0xc1, 0xb6, 0x98, 0xd8, 0x4a, 0x0a, 0x37, 0x05, 0x1c, 0x2b, 0x0a, 0xb4, 0x0c, + 0xe5, 0x8e, 0xe7, 0x8a, 0xa9, 0x2c, 0x37, 0xfc, 0xf2, 0xf5, 0x7a, 0xed, 0x70, 0x7f, 0xfe, 0xe1, + 0xa2, 0x54, 0xcd, 0xf4, 0x68, 0x1f, 0x2f, 0xd0, 0xe5, 0x47, 0x0b, 0xe7, 0xdd, 0x0d, 0x8c, 0x1c, + 0xf1, 0x6e, 0xe0, 0x3c, 0x80, 0xf8, 0x6a, 0x39, 0x97, 0xcb, 0xe9, 0xa8, 0x5d, 0x50, 0x18, 0xac, + 0x51, 0xa1, 0x18, 0x66, 0x5b, 0x11, 0x71, 0xe4, 0x19, 0x9a, 0xbb, 0x97, 0x8f, 0xdd, 0xb9, 0x81, + 0x60, 0x25, 0xcb, 0x0c, 0x77, 0xf3, 0x47, 0x21, 0xcc, 0xba, 0x22, 0x86, 0x35, 0xad, 0xb4, 0x72, + 0x74, 0x9f, 0x76, 0xe6, 0x90, 0x93, 0x65, 0x84, 0xbb, 0x79, 0xa3, 0xb7, 0x61, 0x4e, 0x02, 0xbb, + 0xc3, 0x86, 0xd9, 0x72, 0x29, 0x2f, 0x9f, 0x39, 0xd8, 0x9f, 0x9f, 0xab, 0x15, 0x52, 0xe1, 0x1e, + 0x1c, 0x10, 0x86, 0x11, 0x76, 0x97, 0x14, 0x57, 0xc7, 0xd9, 0x3e, 0xf7, 0x44, 0xb1, 0x31, 0x80, + 0xce, 0xf5, 0x05, 0x76, 0x0f, 0x25, 0xdc, 0x7c, 0xd3, 0x6b, 0x39, 0x06, 0xc4, 0x82, 0x13, 0xda, + 0x80, 0x71, 0x27, 0x08, 0xc2, 0xc4, 0xe1, 0x2a, 0xd4, 0x44, 0xb1, 0xee, 0xa7, 0x31, 0x5e, 0x4a, + 0x4b, 0x70, 0xee, 0xca, 0x73, 0x50, 0xc3, 0x60, 0x9d, 0x31, 0xba, 0x05, 0xd3, 0xe1, 0x2d, 0x2a, + 0x1c, 0xa5, 0x95, 0x22, 0xae, 0x4e, 0xb2, 0xba, 0x9e, 0x1b, 0xd0, 0x4e, 0x6b, 0x14, 0xd6, 0xa4, + 0x96, 0xc9, 0x14, 0x67, 0x6b, 0x41, 0x0b, 0x86, 0xb5, 0x7a, 0x2a, 0xf5, 0x67, 0x4f, 0xad, 0xd5, + 0xba, 0x71, 0x9a, 0x85, 0xa1, 0x73, 0xb7, 0x55, 0xb6, 0xfa, 0xa7, 0x33, 0x61, 0xe8, 0x29, 0x0a, + 0xeb, 0x74, 0x68, 0x0b, 0x26, 0xd2, 0x2b, 0xab, 0x28, 0x66, 0x59, 0x6a, 0xc6, 0xcf, 0x9f, 0x1f, + 0xec, 0xe3, 0xea, 0x5a, 0x49, 0x7e, 0x72, 0xd0, 0x21, 0xd8, 0xe0, 0x3c, 0xf7, 0x13, 0x30, 0xae, + 0x0d, 0xec, 0x51, 0xbc, 0xb2, 0xe7, 0x5e, 0x81, 0x99, 0xec, 0xd0, 0x1d, 0xc9, 0xab, 0xfb, 0x7f, + 0x95, 0x60, 0x3a, 0xe7, 0xe6, 0x8a, 0xa5, 0x7b, 0xce, 0x08, 0xd4, 0x34, 0xbb, 0xb3, 0x29, 0x16, + 0x4b, 0x03, 0x88, 0x45, 0x29, 0xa3, 0xcb, 0x85, 0x32, 0x5a, 0x88, 0xc2, 0xa1, 0xf7, 0x23, 0x0a, + 0xcd, 0xdd, 0x67, 0x78, 0xa0, 0xdd, 0xe7, 0x2e, 0x88, 0x4f, 0x63, 0x03, 0x1b, 0x1d, 0x60, 0x03, + 0xfb, 0x85, 0x12, 0xcc, 0x64, 0x73, 0x0a, 0x1f, 0xc3, 0x7d, 0xc7, 0xab, 0xc6, 0x7d, 0x47, 0x7e, + 0xf2, 0xf4, 0x6c, 0xa6, 0xe3, 0xa2, 0xbb, 0x0f, 0x9c, 0xb9, 0xfb, 0x78, 0x62, 0x20, 0x6e, 0xbd, + 0xef, 0x41, 0xfe, 0x7e, 0x09, 0x4e, 0x65, 0x8b, 0xac, 0xf8, 0x8e, 0xb7, 0x73, 0x0c, 0x7d, 0x73, + 0xcd, 0xe8, 0x9b, 0xa7, 0x07, 0xf9, 0x1a, 0xd6, 0xb4, 0xc2, 0x0e, 0x7a, 0x3d, 0xd3, 0x41, 0x8b, + 0x83, 0xb3, 0xec, 0xdd, 0x4b, 0xdf, 0xb6, 0xe0, 0x74, 0x6e, 0xb9, 0x63, 0xb0, 0xbe, 0x5e, 0x35, + 0xad, 0xaf, 0x8f, 0x0f, 0xfc, 0x4d, 0x05, 0xe6, 0xd8, 0xaf, 0x96, 0x0b, 0xbe, 0x85, 0xd9, 0xaf, + 0xae, 0xc1, 0xb8, 0xd3, 0x6a, 0x91, 0x38, 0xbe, 0x12, 0xba, 0x2a, 0xad, 0xd5, 0xd3, 0x6c, 0x4f, + 0x4a, 0xc1, 0x87, 0xfb, 0xf3, 0x73, 0x59, 0x16, 0x29, 0x1a, 0xeb, 0x1c, 0xcc, 0x54, 0x79, 0xa5, + 0xbb, 0x9a, 0x2a, 0xef, 0x3c, 0xc0, 0xae, 0x3a, 0xd5, 0x66, 0x8d, 0x61, 0xda, 0x79, 0x57, 0xa3, + 0x42, 0x3f, 0xc5, 0x74, 0x45, 0xee, 0x32, 0xc2, 0x2f, 0x39, 0x9e, 0x1d, 0x70, 0xac, 0x74, 0xf7, + 0x13, 0x1e, 0x08, 0xab, 0x0c, 0x87, 0x8a, 0x25, 0xfa, 0x0c, 0xcc, 0xc4, 0x3c, 0xd7, 0xc2, 0x8a, + 0xef, 0xc4, 0x2c, 0xfc, 0x42, 0xc8, 0x44, 0x16, 0xdd, 0xda, 0xcc, 0xe0, 0x70, 0x17, 0xb5, 0xfd, + 0x8f, 0xcb, 0xf0, 0x40, 0x8f, 0x29, 0x8a, 0x96, 0xcc, 0x2b, 0xde, 0x27, 0xb3, 0xd6, 0x9d, 0xb9, + 0xdc, 0xc2, 0x86, 0xb9, 0x27, 0x33, 0xc6, 0xa5, 0xf7, 0x3d, 0xc6, 0x5f, 0xb6, 0x34, 0xbb, 0x1b, + 0x77, 0x04, 0xfd, 0xd4, 0x11, 0x97, 0xde, 0x8f, 0xaa, 0xa1, 0xfe, 0x0b, 0x16, 0x3c, 0x9c, 0xfb, + 0x59, 0x86, 0xab, 0xc8, 0x22, 0x54, 0x5a, 0x14, 0xa8, 0x85, 0x48, 0xa5, 0x81, 0x8a, 0x12, 0x81, + 0x53, 0x1a, 0xc3, 0x23, 0xa4, 0xd4, 0xd7, 0x23, 0xe4, 0x5f, 0x5a, 0x70, 0x32, 0xdb, 0x88, 0x63, + 0x90, 0x4c, 0x75, 0x53, 0x32, 0x7d, 0x74, 0x90, 0x21, 0x2f, 0x10, 0x4a, 0x7f, 0x3a, 0x05, 0xf7, + 0x15, 0x64, 0xfc, 0xdf, 0x85, 0xd9, 0xcd, 0x16, 0x31, 0x83, 0xcf, 0xc4, 0xc7, 0xe4, 0xc6, 0xe9, + 0xf5, 0x8c, 0x54, 0xe3, 0xc7, 0x90, 0x2e, 0x12, 0xdc, 0x5d, 0x05, 0xfa, 0x82, 0x05, 0x27, 0x9d, + 0x5b, 0x71, 0xd7, 0x0b, 0x3c, 0x62, 0xce, 0x3c, 0x97, 0x6b, 0x1d, 0xeb, 0xf3, 0x62, 0x0f, 0x0b, + 0x10, 0x39, 0x99, 0x47, 0x85, 0x73, 0xeb, 0x42, 0x58, 0x64, 0xf6, 0xa3, 0x5a, 0x4e, 0x8f, 0xf0, + 0xc8, 0xbc, 0xe0, 0x15, 0x2e, 0xa3, 0x24, 0x06, 0x2b, 0x3e, 0xe8, 0x06, 0x54, 0x36, 0x65, 0x44, + 0x99, 0x90, 0x81, 0xb9, 0x9b, 0x4a, 0x6e, 0xd8, 0x19, 0xf7, 0xd8, 0x57, 0x28, 0x9c, 0xb2, 0x42, + 0xaf, 0x40, 0x39, 0xd8, 0x88, 0x7b, 0x3d, 0x79, 0x90, 0xf1, 0xa0, 0xe2, 0x71, 0xae, 0x57, 0xd7, + 0x9a, 0x98, 0x16, 0xa4, 0xe5, 0xa3, 0x9b, 0xae, 0x30, 0xe8, 0xe6, 0x96, 0xc7, 0xcb, 0xb5, 0xee, + 0xf2, 0x78, 0xb9, 0x86, 0x69, 0x41, 0xb4, 0x06, 0xc3, 0x2c, 0x40, 0x45, 0x58, 0x6b, 0x73, 0xe3, + 0xf4, 0xbb, 0x82, 0x6f, 0x78, 0xe0, 0x2b, 0x03, 0x63, 0x5e, 0x1c, 0xbd, 0x0a, 0x23, 0x2d, 0xf6, + 0x02, 0x80, 0x38, 0x5a, 0xe7, 0xe7, 0x9e, 0xe8, 0x7a, 0x23, 0x80, 0xdf, 0x51, 0x71, 0x38, 0x16, + 0x1c, 0xd0, 0x3a, 0x8c, 0xb4, 0x48, 0x7b, 0x6b, 0x23, 0x16, 0x27, 0xe6, 0x8f, 0xe7, 0xf2, 0xea, + 0xf1, 0xe0, 0x85, 0xe0, 0xca, 0x28, 0xb0, 0xe0, 0x85, 0x3e, 0x09, 0xa5, 0x8d, 0x96, 0x88, 0x55, + 0xc9, 0xb5, 0xd2, 0x9a, 0xc1, 0xc8, 0xcb, 0x23, 0x07, 0xfb, 0xf3, 0xa5, 0xb5, 0x15, 0x5c, 0xda, + 0x68, 0xa1, 0xab, 0x30, 0xba, 0xc1, 0x23, 0x4a, 0x45, 0xa6, 0xd6, 0xc7, 0xf2, 0x83, 0x5d, 0xbb, + 0x82, 0x4e, 0x79, 0x8c, 0x85, 0x40, 0x60, 0xc9, 0x04, 0xad, 0x03, 0x6c, 0xa8, 0xc8, 0x58, 0x91, + 0xaa, 0xf5, 0xa3, 0x83, 0xc4, 0xcf, 0x8a, 0xe3, 0xa3, 0x82, 0x62, 0x8d, 0x0f, 0xfa, 0x1c, 0x54, + 0x1c, 0xf9, 0xa6, 0x0b, 0x4b, 0xd3, 0x6a, 0xee, 0xd3, 0xe9, 0x82, 0xeb, 0xfd, 0xdc, 0x0d, 0x9f, + 0xad, 0x8a, 0x08, 0xa7, 0x4c, 0xd1, 0x36, 0x4c, 0xee, 0xc6, 0xed, 0x2d, 0x22, 0x17, 0x28, 0xcb, + 0xdd, 0x6a, 0x1e, 0x35, 0xd3, 0x44, 0xbb, 0x82, 0xd0, 0x8b, 0x92, 0x8e, 0xe3, 0x77, 0xc9, 0x14, + 0x16, 0x90, 0x73, 0x43, 0x67, 0x86, 0x4d, 0xde, 0xb4, 0xd3, 0xdf, 0xed, 0x84, 0x37, 0xf7, 0x12, + 0x22, 0x32, 0xba, 0xe6, 0x76, 0xfa, 0x6b, 0x9c, 0xa4, 0xbb, 0xd3, 0x05, 0x02, 0x4b, 0x26, 0x74, + 0x09, 0x3b, 0xf2, 0xbd, 0x24, 0x71, 0x46, 0x7e, 0xbc, 0xb0, 0x7b, 0xba, 0xda, 0x9b, 0x76, 0x0a, + 0x93, 0x7d, 0x29, 0x2b, 0x26, 0xf3, 0xda, 0x5b, 0x61, 0x12, 0x06, 0x19, 0x79, 0x3b, 0x5b, 0x2c, + 0xf3, 0x1a, 0x39, 0xf4, 0xdd, 0x32, 0x2f, 0x8f, 0x0a, 0xe7, 0xd6, 0x85, 0x5c, 0x98, 0x6a, 0x87, + 0x51, 0x72, 0x2b, 0x8c, 0xe4, 0xac, 0x42, 0x3d, 0x0e, 0x4f, 0x06, 0xa5, 0xa8, 0x91, 0xf9, 0xd7, + 0x9a, 0x18, 0x9c, 0xe1, 0x49, 0x87, 0x24, 0x6e, 0x39, 0x3e, 0xa9, 0x5f, 0xab, 0x9e, 0x28, 0x1e, + 0x92, 0x26, 0x27, 0xe9, 0x1e, 0x12, 0x81, 0xc0, 0x92, 0x09, 0x95, 0x3e, 0x2c, 0x39, 0x38, 0x4b, + 0x41, 0x5b, 0x20, 0x7d, 0xba, 0x3c, 0x4f, 0xb9, 0xf4, 0x61, 0x60, 0xcc, 0x8b, 0xd3, 0x99, 0x2f, + 0x74, 0xc2, 0x30, 0xae, 0x9e, 0x2a, 0x9e, 0xf9, 0x42, 0x95, 0xbc, 0xd6, 0xec, 0x35, 0xf3, 0x15, + 0x11, 0x4e, 0x99, 0xda, 0x5f, 0x1c, 0xe9, 0xd6, 0x16, 0x98, 0xee, 0xff, 0x45, 0xab, 0xeb, 0xfa, + 0xf4, 0x13, 0x83, 0x1e, 0x58, 0xef, 0xe2, 0x45, 0xea, 0x17, 0x2c, 0xb8, 0xaf, 0x9d, 0xfb, 0x51, + 0x62, 0xeb, 0x1d, 0xec, 0xdc, 0xcb, 0xbb, 0x41, 0x25, 0x77, 0xce, 0xc7, 0xe3, 0x82, 0x9a, 0xb2, + 0x3a, 0x72, 0xf9, 0x7d, 0xeb, 0xc8, 0x57, 0x60, 0x8c, 0xa9, 0x77, 0x69, 0x22, 0x99, 0x81, 0x9c, + 0x90, 0xd8, 0x26, 0xbe, 0x22, 0x0a, 0x62, 0xc5, 0x02, 0xfd, 0x9c, 0x05, 0x0f, 0x65, 0x9b, 0x8e, + 0x09, 0x43, 0x8b, 0xc4, 0x84, 0xfc, 0xd8, 0xb1, 0x26, 0xbe, 0xff, 0xa1, 0x46, 0x2f, 0xe2, 0xc3, + 0x7e, 0x04, 0xb8, 0x77, 0x65, 0xa8, 0x96, 0x73, 0xee, 0x19, 0x31, 0x6f, 0x57, 0xfa, 0x9f, 0x7d, + 0x8e, 0x57, 0x73, 0xff, 0x9a, 0x95, 0xa3, 0x72, 0xf2, 0x33, 0xd6, 0xcb, 0xe6, 0x19, 0xeb, 0xd1, + 0xec, 0x19, 0xab, 0xcb, 0x62, 0x62, 0x1c, 0xaf, 0x06, 0x4f, 0x9d, 0x3a, 0x68, 0xce, 0x1c, 0xdb, + 0x87, 0xb3, 0xfd, 0xc4, 0x2c, 0x73, 0xa9, 0x72, 0xd5, 0x5d, 0x63, 0xea, 0x52, 0xe5, 0xd6, 0x6b, + 0x98, 0x61, 0x06, 0xcd, 0xbe, 0x60, 0xff, 0x37, 0x0b, 0xca, 0x8d, 0xd0, 0x3d, 0x06, 0x0b, 0xd0, + 0xa7, 0x0c, 0x0b, 0xd0, 0x03, 0x05, 0xef, 0x28, 0x16, 0xda, 0x7b, 0x56, 0x33, 0xf6, 0x9e, 0x87, + 0x8a, 0x18, 0xf4, 0xb6, 0xee, 0xfc, 0x83, 0x32, 0xe8, 0xaf, 0x3e, 0xa2, 0x7f, 0x7d, 0x27, 0xbe, + 0xb9, 0xe5, 0x5e, 0x0f, 0x41, 0x0a, 0xce, 0xcc, 0x13, 0x4b, 0x86, 0xfd, 0xfd, 0x88, 0xb9, 0xe8, + 0xbe, 0x4e, 0xbc, 0xcd, 0xad, 0x84, 0xb8, 0xd9, 0xcf, 0x39, 0x3e, 0x17, 0xdd, 0xff, 0x62, 0xc1, + 0x74, 0xa6, 0x76, 0xe4, 0xe7, 0xc5, 0x10, 0xdd, 0xa1, 0x4d, 0x67, 0xb6, 0x6f, 0xd0, 0xd1, 0x02, + 0x80, 0x32, 0xaf, 0x4b, 0xbb, 0x09, 0xd3, 0x62, 0x95, 0xfd, 0x3d, 0xc6, 0x1a, 0x05, 0x7a, 0x1e, + 0xc6, 0x93, 0xb0, 0x1d, 0xfa, 0xe1, 0xe6, 0xde, 0x25, 0x22, 0xf3, 0x7d, 0xa8, 0x4b, 0x90, 0xf5, + 0x14, 0x85, 0x75, 0x3a, 0xfb, 0x57, 0xcb, 0x90, 0x7d, 0x29, 0xf4, 0xff, 0xcf, 0xc9, 0x0f, 0xe7, + 0x9c, 0xfc, 0xae, 0x05, 0x33, 0xb4, 0x76, 0xe6, 0xe5, 0x22, 0x9d, 0x5b, 0xd5, 0x1b, 0x0b, 0x56, + 0x8f, 0x37, 0x16, 0x1e, 0xa5, 0xb2, 0xcb, 0x0d, 0x3b, 0x89, 0xb0, 0xef, 0x68, 0xc2, 0x89, 0x42, + 0xb1, 0xc0, 0x0a, 0x3a, 0x12, 0x45, 0x22, 0x32, 0x48, 0xa7, 0x23, 0x51, 0x84, 0x05, 0x56, 0x3e, + 0xc1, 0x30, 0x54, 0xf0, 0x04, 0x03, 0x4b, 0x95, 0x25, 0x3c, 0x2b, 0x84, 0x6a, 0xa0, 0xa5, 0xca, + 0x92, 0x2e, 0x17, 0x29, 0x8d, 0xfd, 0xf5, 0x32, 0x4c, 0x34, 0x42, 0x37, 0xf5, 0x87, 0x7f, 0xce, + 0xf0, 0x87, 0x3f, 0x9b, 0xf1, 0x87, 0x9f, 0xd1, 0x69, 0xef, 0x8e, 0x3b, 0xbc, 0x48, 0xa4, 0xc6, + 0x1e, 0x04, 0xb9, 0x43, 0x57, 0x78, 0x23, 0x91, 0x9a, 0x62, 0x84, 0x4d, 0xbe, 0x3f, 0x4e, 0x2e, + 0xf0, 0x7f, 0x61, 0xc1, 0x54, 0x23, 0x74, 0xe9, 0x04, 0xfd, 0x71, 0x9a, 0x8d, 0x7a, 0x22, 0xb6, + 0x91, 0x1e, 0x89, 0xd8, 0xfe, 0xa1, 0x05, 0xa3, 0x8d, 0xd0, 0x3d, 0x06, 0xdb, 0xe7, 0xcb, 0xa6, + 0xed, 0xf3, 0xfe, 0x02, 0x29, 0x5b, 0x60, 0xee, 0xfc, 0xad, 0x32, 0x4c, 0xd2, 0x76, 0x86, 0x9b, + 0x72, 0x94, 0x8c, 0x1e, 0xb1, 0x06, 0xe8, 0x11, 0xaa, 0xcc, 0x85, 0xbe, 0x1f, 0xde, 0xca, 0x8e, + 0xd8, 0x1a, 0x83, 0x62, 0x81, 0x45, 0x4f, 0xc1, 0x58, 0x3b, 0x22, 0xbb, 0x5e, 0xd8, 0x89, 0xb3, + 0xb1, 0x85, 0x0d, 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x07, 0x13, 0xb1, 0x17, 0xb4, 0x88, 0xf4, 0xb6, + 0x18, 0x62, 0xde, 0x16, 0x3c, 0x97, 0xa5, 0x06, 0xc7, 0x06, 0x15, 0x7a, 0x1d, 0x2a, 0xec, 0x3f, + 0x5b, 0x37, 0x47, 0x7f, 0x61, 0x81, 0x1f, 0x55, 0x25, 0x03, 0x9c, 0xf2, 0x42, 0xe7, 0x01, 0x12, + 0xe9, 0x17, 0x12, 0x8b, 0xd0, 0x57, 0xa5, 0x51, 0x2a, 0x8f, 0x91, 0x18, 0x6b, 0x54, 0xe8, 0x49, + 0xa8, 0x24, 0x8e, 0xe7, 0x5f, 0xf6, 0x02, 0x12, 0x0b, 0xbf, 0x1a, 0x91, 0x1f, 0x5a, 0x00, 0x71, + 0x8a, 0xa7, 0x3b, 0x3a, 0x0b, 0xac, 0xe6, 0xef, 0xb3, 0x8c, 0x31, 0x6a, 0xb6, 0xa3, 0x5f, 0x56, + 0x50, 0xac, 0x51, 0xd8, 0x2f, 0xc2, 0xa9, 0x46, 0xe8, 0x36, 0xc2, 0x28, 0x59, 0x0b, 0xa3, 0x5b, + 0x4e, 0xe4, 0xca, 0xf1, 0x9b, 0x97, 0xa9, 0x8a, 0xe9, 0xae, 0x3b, 0xcc, 0xcf, 0xf5, 0x46, 0x12, + 0xe2, 0x67, 0xd9, 0x9e, 0x7e, 0xc4, 0x20, 0x88, 0x7f, 0x57, 0x02, 0xd4, 0x60, 0x9e, 0x2b, 0xc6, + 0x23, 0x3e, 0x6f, 0xc3, 0x54, 0x4c, 0x2e, 0x7b, 0x41, 0xe7, 0xb6, 0x60, 0xd5, 0x2b, 0xc2, 0xa4, + 0xb9, 0xaa, 0x53, 0x72, 0xdb, 0x88, 0x09, 0xc3, 0x19, 0x6e, 0xb4, 0x0b, 0xa3, 0x4e, 0xb0, 0x14, + 0x5f, 0x8f, 0x49, 0x24, 0x1e, 0xad, 0x61, 0x5d, 0x88, 0x25, 0x10, 0xa7, 0x78, 0x3a, 0x65, 0xd8, + 0x9f, 0xab, 0x61, 0x80, 0xc3, 0x30, 0x91, 0x93, 0x8c, 0x3d, 0x7b, 0xa0, 0xc1, 0xb1, 0x41, 0x85, + 0xd6, 0x00, 0xc5, 0x9d, 0x76, 0xdb, 0x67, 0x17, 0x7d, 0x8e, 0x7f, 0x21, 0x0a, 0x3b, 0x6d, 0xee, + 0x7a, 0x2c, 0x5e, 0x0c, 0x68, 0x76, 0x61, 0x71, 0x4e, 0x09, 0x2a, 0x18, 0x36, 0x62, 0xf6, 0x5b, + 0xc4, 0x56, 0x73, 0x2b, 0x65, 0x93, 0x81, 0xb0, 0xc4, 0xd9, 0x9f, 0x67, 0x9b, 0x19, 0x7b, 0x6b, + 0x24, 0xe9, 0x44, 0x04, 0xed, 0xc0, 0x64, 0x9b, 0x6d, 0x58, 0x49, 0x14, 0xfa, 0x3e, 0x91, 0x7a, + 0xe3, 0x9d, 0x79, 0xd1, 0xf0, 0xb7, 0x07, 0x74, 0x76, 0xd8, 0xe4, 0x6e, 0x7f, 0x71, 0x9a, 0xc9, + 0xa5, 0x26, 0x3f, 0xb4, 0x8c, 0x0a, 0xdf, 0x58, 0xa1, 0xa1, 0xcd, 0x15, 0xbf, 0xed, 0x95, 0x4a, + 0x7a, 0xe1, 0x5f, 0x8b, 0x65, 0x59, 0xf4, 0x1a, 0xf3, 0xd9, 0xe6, 0xc2, 0xa0, 0xdf, 0xab, 0x82, + 0x9c, 0xca, 0xf0, 0xd7, 0x16, 0x05, 0xb1, 0xc6, 0x04, 0x5d, 0x86, 0x49, 0xf1, 0x34, 0x85, 0x30, + 0x21, 0x94, 0x8d, 0xe3, 0xef, 0x24, 0xd6, 0x91, 0x87, 0x59, 0x00, 0x36, 0x0b, 0xa3, 0x4d, 0x78, + 0x48, 0x7b, 0x48, 0x29, 0xc7, 0x93, 0x8b, 0xcb, 0x96, 0x87, 0x0f, 0xf6, 0xe7, 0x1f, 0x5a, 0xef, + 0x45, 0x88, 0x7b, 0xf3, 0x41, 0xd7, 0xe0, 0x94, 0xd3, 0x4a, 0xbc, 0x5d, 0x52, 0x23, 0x8e, 0xeb, + 0x7b, 0x01, 0x31, 0x83, 0xed, 0x4f, 0x1f, 0xec, 0xcf, 0x9f, 0x5a, 0xca, 0x23, 0xc0, 0xf9, 0xe5, + 0xd0, 0xcb, 0x50, 0x71, 0x83, 0x58, 0xf4, 0xc1, 0x88, 0xf1, 0x46, 0x58, 0xa5, 0x76, 0xb5, 0xa9, + 0xbe, 0x3f, 0xfd, 0x83, 0xd3, 0x02, 0x68, 0x13, 0x26, 0xf4, 0x80, 0x1a, 0xf1, 0xbe, 0xdc, 0xd3, + 0x3d, 0xce, 0xb6, 0x46, 0x14, 0x0a, 0xb7, 0x9f, 0x29, 0x3f, 0x49, 0x23, 0x40, 0xc5, 0x60, 0x8c, + 0x5e, 0x05, 0x14, 0x93, 0x68, 0xd7, 0x6b, 0x91, 0xa5, 0x16, 0x4b, 0xf6, 0xca, 0xac, 0x2e, 0x63, + 0x86, 0xd3, 0x3f, 0x6a, 0x76, 0x51, 0xe0, 0x9c, 0x52, 0xe8, 0x22, 0x95, 0x28, 0x3a, 0x54, 0xb8, + 0xb5, 0x4a, 0x35, 0xaf, 0x5a, 0x23, 0xed, 0x88, 0xb4, 0x9c, 0x84, 0xb8, 0x26, 0x47, 0x9c, 0x29, + 0x47, 0xf7, 0x1b, 0x95, 0x43, 0x1f, 0x4c, 0x67, 0xcc, 0xee, 0x3c, 0xfa, 0xf4, 0x84, 0xb4, 0x15, + 0xc6, 0xc9, 0x55, 0x92, 0xdc, 0x0a, 0xa3, 0x6d, 0x91, 0x21, 0x2b, 0x4d, 0xa0, 0x97, 0xa2, 0xb0, + 0x4e, 0x47, 0x35, 0x22, 0x76, 0x9d, 0x55, 0xaf, 0xb1, 0x1b, 0x87, 0xb1, 0x74, 0x9d, 0x5c, 0xe4, + 0x60, 0x2c, 0xf1, 0x92, 0xb4, 0xde, 0x58, 0x61, 0xf7, 0x08, 0x19, 0xd2, 0x7a, 0x63, 0x05, 0x4b, + 0x3c, 0x22, 0xdd, 0xef, 0xaf, 0x4d, 0x15, 0xdf, 0x00, 0x75, 0xcb, 0xe5, 0x01, 0x9f, 0x60, 0x0b, + 0x60, 0x46, 0xbd, 0xfc, 0xc6, 0x53, 0x87, 0xc5, 0xd5, 0x69, 0x36, 0x49, 0x06, 0xcf, 0x3b, 0xa6, + 0xac, 0x6a, 0xf5, 0x0c, 0x27, 0xdc, 0xc5, 0xdb, 0x48, 0xe2, 0x30, 0xd3, 0xf7, 0x0d, 0x84, 0x45, + 0xa8, 0xc4, 0x9d, 0x9b, 0x6e, 0xb8, 0xe3, 0x78, 0x01, 0x33, 0xfb, 0xeb, 0x0f, 0xe0, 0x4b, 0x04, + 0x4e, 0x69, 0xd0, 0x1a, 0x8c, 0x39, 0xe2, 0xf0, 0x25, 0x0c, 0xf5, 0xb9, 0x51, 0xdd, 0xf2, 0x80, + 0xc6, 0x2d, 0x9a, 0xf2, 0x1f, 0x56, 0x65, 0xd1, 0x4b, 0x30, 0x29, 0x02, 0x8f, 0x84, 0xcf, 0xe0, + 0x09, 0xd3, 0x47, 0xbd, 0xa9, 0x23, 0xb1, 0x49, 0x8b, 0x7e, 0x0a, 0xa6, 0x28, 0x97, 0x54, 0xb0, + 0x55, 0x4f, 0x0e, 0x22, 0x11, 0xb5, 0xdc, 0xd6, 0x7a, 0x61, 0x9c, 0x61, 0x86, 0x5c, 0x78, 0xd0, + 0xe9, 0x24, 0xe1, 0x0e, 0x9d, 0xe1, 0xe6, 0xfc, 0x5f, 0x0f, 0xb7, 0x49, 0xc0, 0xec, 0xf4, 0x63, + 0xcb, 0x67, 0x0f, 0xf6, 0xe7, 0x1f, 0x5c, 0xea, 0x41, 0x87, 0x7b, 0x72, 0x41, 0xd7, 0x61, 0x3c, + 0x09, 0x7d, 0xe1, 0xec, 0x1b, 0x57, 0xef, 0x2b, 0x4e, 0x42, 0xb3, 0xae, 0xc8, 0x74, 0x73, 0x82, + 0x2a, 0x8a, 0x75, 0x3e, 0x68, 0x9d, 0xaf, 0x31, 0x96, 0x32, 0x91, 0xc4, 0xd5, 0xfb, 0x8b, 0x3b, + 0x46, 0x65, 0x56, 0x34, 0x97, 0xa0, 0x28, 0x89, 0x75, 0x36, 0xe8, 0x02, 0xcc, 0xb6, 0x23, 0x2f, + 0x64, 0x13, 0x5b, 0x99, 0x7c, 0xab, 0x46, 0x7a, 0xb2, 0xd9, 0x46, 0x96, 0x00, 0x77, 0x97, 0x41, + 0xe7, 0xa8, 0x82, 0xca, 0x81, 0xd5, 0xd3, 0xfc, 0x6d, 0x0c, 0xae, 0x9c, 0x72, 0x18, 0x56, 0xd8, + 0xb9, 0x4f, 0xc3, 0x6c, 0x97, 0xa4, 0x3c, 0x92, 0xe3, 0xe5, 0xaf, 0x0f, 0x43, 0x45, 0x99, 0x03, + 0xd1, 0xa2, 0x69, 0xe5, 0x3d, 0x9d, 0xb5, 0xf2, 0x8e, 0x51, 0x7d, 0x4d, 0x37, 0xec, 0xae, 0xe7, + 0x3c, 0xef, 0x7d, 0xb6, 0x40, 0x34, 0x0c, 0x1e, 0x25, 0x75, 0x84, 0xa7, 0xcf, 0xd3, 0x03, 0xe3, + 0x50, 0xcf, 0x03, 0xe3, 0x80, 0x4f, 0xed, 0xd1, 0xa3, 0x61, 0x3b, 0x74, 0xeb, 0x8d, 0xec, 0xdb, + 0x53, 0x0d, 0x0a, 0xc4, 0x1c, 0xc7, 0x94, 0x7b, 0xba, 0xad, 0x33, 0xe5, 0x7e, 0xf4, 0x0e, 0x95, + 0x7b, 0xc9, 0x00, 0xa7, 0xbc, 0x90, 0x0f, 0xb3, 0x2d, 0xf3, 0xd9, 0x30, 0x15, 0x19, 0xf5, 0x48, + 0xdf, 0x07, 0xbc, 0x3a, 0xda, 0x5b, 0x22, 0x2b, 0x59, 0x2e, 0xb8, 0x9b, 0x31, 0x7a, 0x09, 0xc6, + 0xde, 0x0d, 0x63, 0x36, 0xed, 0xc4, 0xde, 0x26, 0x63, 0x51, 0xc6, 0x5e, 0xbb, 0xd6, 0x64, 0xf0, + 0xc3, 0xfd, 0xf9, 0xf1, 0x46, 0xe8, 0xca, 0xbf, 0x58, 0x15, 0x40, 0xb7, 0xe1, 0x94, 0x21, 0x11, + 0x54, 0x73, 0x61, 0xf0, 0xe6, 0x3e, 0x24, 0xaa, 0x3b, 0x55, 0xcf, 0xe3, 0x84, 0xf3, 0x2b, 0xb0, + 0xbf, 0xc1, 0x8d, 0x9e, 0xc2, 0x34, 0x42, 0xe2, 0x8e, 0x7f, 0x1c, 0x0f, 0x06, 0xac, 0x1a, 0x56, + 0x9b, 0x3b, 0x36, 0xac, 0xff, 0x81, 0xc5, 0x0c, 0xeb, 0xeb, 0x64, 0xa7, 0xed, 0x3b, 0xc9, 0x71, + 0xb8, 0xdb, 0xbe, 0x06, 0x63, 0x89, 0xa8, 0xad, 0xd7, 0x1b, 0x07, 0x5a, 0xa3, 0xd8, 0xe5, 0x82, + 0xda, 0x10, 0x25, 0x14, 0x2b, 0x36, 0xf6, 0x3f, 0xe7, 0x23, 0x20, 0x31, 0xc7, 0x60, 0x5b, 0xa8, + 0x99, 0xb6, 0x85, 0xf9, 0x3e, 0x5f, 0x50, 0x60, 0x63, 0xf8, 0x67, 0x66, 0xbb, 0xd9, 0xd9, 0xe3, + 0xc3, 0x7e, 0xa3, 0x63, 0xff, 0x92, 0x05, 0x27, 0xf3, 0xae, 0xf4, 0xa9, 0x12, 0xc3, 0x4f, 0x3e, + 0xea, 0x86, 0x4b, 0xf5, 0xe0, 0x0d, 0x01, 0xc7, 0x8a, 0x62, 0xe0, 0x3c, 0xe3, 0x47, 0x4b, 0xbc, + 0x74, 0x0d, 0xcc, 0x17, 0xe6, 0xd0, 0x2b, 0xdc, 0x7f, 0xde, 0x52, 0x4f, 0xc0, 0x1d, 0xcd, 0x77, + 0xde, 0xfe, 0xb5, 0x12, 0x9c, 0xe4, 0x26, 0xea, 0xa5, 0xdd, 0xd0, 0x73, 0x1b, 0xa1, 0x2b, 0xa2, + 0x09, 0xde, 0x84, 0x89, 0xb6, 0x76, 0x5c, 0xed, 0x95, 0xfa, 0x45, 0x3f, 0xd6, 0xa6, 0xc7, 0x06, + 0x1d, 0x8a, 0x0d, 0x5e, 0xc8, 0x85, 0x09, 0xb2, 0xeb, 0xb5, 0x94, 0x9d, 0xb3, 0x74, 0x64, 0x91, + 0xae, 0x6a, 0x59, 0xd5, 0xf8, 0x60, 0x83, 0xeb, 0x3d, 0x78, 0x0d, 0xc4, 0xfe, 0x8a, 0x05, 0xf7, + 0x17, 0x24, 0x8a, 0xa1, 0xd5, 0xdd, 0x62, 0x97, 0x01, 0xe2, 0xb9, 0x42, 0x55, 0x1d, 0xbf, 0x22, + 0xc0, 0x02, 0x8b, 0x7e, 0x12, 0x80, 0x9b, 0xf8, 0xd9, 0xe3, 0xf0, 0xa5, 0xde, 0x91, 0xe8, 0x46, + 0x02, 0x05, 0x2d, 0xca, 0x5e, 0x3d, 0x07, 0xaf, 0xf1, 0xb2, 0x7f, 0xa5, 0x0c, 0xc3, 0xfc, 0xed, + 0xea, 0x35, 0x18, 0xdd, 0xe2, 0x69, 0x69, 0x07, 0xc9, 0x80, 0x9b, 0x1e, 0x47, 0x38, 0x00, 0xcb, + 0xc2, 0xe8, 0x0a, 0x9c, 0x10, 0x11, 0x2b, 0x35, 0xe2, 0x3b, 0x7b, 0xf2, 0x54, 0xcb, 0x9f, 0x88, + 0x90, 0xe9, 0xcb, 0x4f, 0xd4, 0xbb, 0x49, 0x70, 0x5e, 0x39, 0xf4, 0x4a, 0x57, 0x32, 0x3a, 0x9e, + 0xd0, 0x57, 0xe9, 0xc0, 0x7d, 0x12, 0xd2, 0xbd, 0x04, 0x93, 0xed, 0xae, 0xf3, 0xbb, 0xf6, 0x6c, + 0xb0, 0x79, 0x66, 0x37, 0x69, 0x99, 0x7f, 0x40, 0x87, 0x79, 0x43, 0xac, 0x6f, 0x45, 0x24, 0xde, + 0x0a, 0x7d, 0x57, 0xbc, 0x91, 0x99, 0xfa, 0x07, 0x64, 0xf0, 0xb8, 0xab, 0x04, 0xe5, 0xb2, 0xe1, + 0x78, 0x7e, 0x27, 0x22, 0x29, 0x97, 0x11, 0x93, 0xcb, 0x5a, 0x06, 0x8f, 0xbb, 0x4a, 0xd0, 0x79, + 0x74, 0x4a, 0x3c, 0xb0, 0x28, 0xe3, 0x98, 0x95, 0xd3, 0xc7, 0xa8, 0xf4, 0x54, 0xef, 0x91, 0x5b, + 0x43, 0x5c, 0xf9, 0xab, 0x27, 0x1a, 0xb5, 0xa7, 0xbb, 0x84, 0x8f, 0xba, 0xe4, 0x72, 0x27, 0xcf, + 0xfc, 0xfd, 0x89, 0x05, 0x27, 0x72, 0x1c, 0xc1, 0xb8, 0xa8, 0xda, 0xf4, 0xe2, 0x44, 0xbd, 0x4c, + 0xa0, 0x89, 0x2a, 0x0e, 0xc7, 0x8a, 0x82, 0xae, 0x07, 0x2e, 0x0c, 0xb3, 0x02, 0x50, 0x38, 0x6f, + 0x08, 0xec, 0xd1, 0x04, 0x20, 0x3a, 0x0b, 0x43, 0x9d, 0x98, 0x44, 0xf2, 0x6d, 0x3c, 0x29, 0xbf, + 0x99, 0x45, 0x90, 0x61, 0xa8, 0x46, 0xb9, 0xa9, 0x8c, 0x71, 0x9a, 0x46, 0xc9, 0xcd, 0x71, 0x1c, + 0x67, 0x7f, 0xb9, 0x0c, 0xd3, 0x19, 0x57, 0x4e, 0xda, 0x90, 0x9d, 0x30, 0xf0, 0x92, 0x50, 0xe5, + 0x42, 0xe3, 0xa9, 0x1f, 0x48, 0x7b, 0xeb, 0x8a, 0x80, 0x63, 0x45, 0x81, 0x1e, 0x95, 0x8f, 0xa6, + 0x66, 0x5f, 0x5c, 0x58, 0xae, 0x19, 0xef, 0xa6, 0x0e, 0xfa, 0x74, 0xca, 0x23, 0x30, 0xd4, 0x0e, + 0xd5, 0x8b, 0xd6, 0x6a, 0x3c, 0xf1, 0x72, 0xad, 0x11, 0x86, 0x3e, 0x66, 0x48, 0xf4, 0x31, 0xf1, + 0xf5, 0x99, 0xfb, 0x0a, 0xec, 0xb8, 0x61, 0xac, 0x75, 0xc1, 0xe3, 0x30, 0xba, 0x4d, 0xf6, 0x22, + 0x2f, 0xd8, 0xcc, 0xde, 0xd6, 0x5c, 0xe2, 0x60, 0x2c, 0xf1, 0x66, 0xea, 0xf1, 0xd1, 0x7b, 0xf2, + 0xfa, 0xc9, 0x58, 0xdf, 0x5d, 0xed, 0xb7, 0x2c, 0x98, 0x66, 0x79, 0x47, 0x45, 0xc4, 0xbc, 0x17, + 0x06, 0xc7, 0xa0, 0x27, 0x3c, 0x02, 0xc3, 0x11, 0xad, 0x34, 0xfb, 0xa4, 0x01, 0x6b, 0x09, 0xe6, + 0x38, 0xf4, 0x20, 0x0c, 0xb1, 0x26, 0xd0, 0xc1, 0x9b, 0xe0, 0x99, 0xc7, 0x6b, 0x4e, 0xe2, 0x60, + 0x06, 0x65, 0xa1, 0x4b, 0x98, 0xb4, 0x7d, 0x8f, 0x37, 0x3a, 0x35, 0xb7, 0x7e, 0x38, 0x42, 0x97, + 0x72, 0x9b, 0xf6, 0xfe, 0x42, 0x97, 0xf2, 0x59, 0xf6, 0xd6, 0xc1, 0xff, 0x7b, 0x09, 0xce, 0xe4, + 0x96, 0x4b, 0x6f, 0x76, 0xd7, 0x8c, 0x9b, 0xdd, 0xf3, 0x99, 0x9b, 0x5d, 0xbb, 0x77, 0xe9, 0xbb, + 0x73, 0xd7, 0x9b, 0x7f, 0x05, 0x5b, 0x3e, 0xc6, 0x2b, 0xd8, 0xa1, 0x41, 0xd5, 0x94, 0xe1, 0x3e, + 0x6a, 0xca, 0xb7, 0x2d, 0x38, 0x9d, 0xdb, 0x65, 0x1f, 0x92, 0x58, 0xb1, 0xdc, 0xb6, 0x15, 0x9c, + 0x21, 0x7e, 0x58, 0x2a, 0xf8, 0x16, 0x76, 0x9a, 0x38, 0x47, 0xe5, 0x0c, 0x43, 0xc6, 0x42, 0xed, + 0x9a, 0xe0, 0x32, 0x86, 0xc3, 0xb0, 0xc2, 0x22, 0x4f, 0x8b, 0xba, 0xe2, 0x4d, 0x7b, 0xe9, 0x48, + 0x4b, 0x66, 0xc1, 0xb4, 0x8e, 0xeb, 0xe1, 0xfd, 0xd9, 0x08, 0xac, 0x2b, 0xda, 0x09, 0xb0, 0x3c, + 0xf8, 0x09, 0x70, 0x22, 0xff, 0xf4, 0x87, 0x96, 0x60, 0x7a, 0xc7, 0x0b, 0xd8, 0xbb, 0xa4, 0xa6, + 0xde, 0xa3, 0x42, 0x55, 0xaf, 0x98, 0x68, 0x9c, 0xa5, 0x9f, 0x7b, 0x09, 0x26, 0xef, 0xdc, 0x64, + 0xf5, 0xdd, 0x32, 0x3c, 0xd0, 0x63, 0xd9, 0x73, 0x59, 0x6f, 0x8c, 0x81, 0x26, 0xeb, 0xbb, 0xc6, + 0xa1, 0x01, 0x27, 0x37, 0x3a, 0xbe, 0xbf, 0xc7, 0xbc, 0x9c, 0x88, 0x2b, 0x29, 0x84, 0x62, 0xa2, + 0x92, 0x0a, 0xaf, 0xe5, 0xd0, 0xe0, 0xdc, 0x92, 0xe8, 0x55, 0x40, 0xe1, 0x4d, 0x96, 0xe8, 0xd6, + 0x4d, 0x93, 0x16, 0xb0, 0x8e, 0x2f, 0xa7, 0x8b, 0xf1, 0x5a, 0x17, 0x05, 0xce, 0x29, 0x45, 0x35, + 0x4c, 0xf6, 0x9a, 0xba, 0x6a, 0x56, 0x46, 0xc3, 0xc4, 0x3a, 0x12, 0x9b, 0xb4, 0xe8, 0x02, 0xcc, + 0x3a, 0xbb, 0x8e, 0xc7, 0x93, 0x58, 0x49, 0x06, 0x5c, 0xc5, 0x54, 0x86, 0xa2, 0xa5, 0x2c, 0x01, + 0xee, 0x2e, 0x83, 0x36, 0x0c, 0x2b, 0x1f, 0xcf, 0xa1, 0x7f, 0x7e, 0xe0, 0xd9, 0x3a, 0xb0, 0xdd, + 0xcf, 0xfe, 0x4f, 0x16, 0xdd, 0xbe, 0x72, 0x1e, 0xc2, 0xa4, 0xfd, 0xa0, 0xec, 0x57, 0x5a, 0xc4, + 0x98, 0xea, 0x87, 0x15, 0x1d, 0x89, 0x4d, 0x5a, 0x3e, 0x21, 0xe2, 0xd4, 0x5d, 0xda, 0xd0, 0x13, + 0x45, 0x88, 0xa5, 0xa2, 0x40, 0x6f, 0xc0, 0xa8, 0xeb, 0xed, 0x7a, 0x71, 0x18, 0x89, 0xc5, 0x72, + 0xd4, 0x07, 0xa0, 0x95, 0x1c, 0xac, 0x71, 0x36, 0x58, 0xf2, 0xb3, 0xbf, 0x5c, 0x82, 0x49, 0x59, + 0xe3, 0x6b, 0x9d, 0x30, 0x71, 0x8e, 0x61, 0x5b, 0xbe, 0x60, 0x6c, 0xcb, 0x1f, 0xeb, 0x15, 0x67, + 0xca, 0x9a, 0x54, 0xb8, 0x1d, 0x5f, 0xcb, 0x6c, 0xc7, 0x8f, 0xf5, 0x67, 0xd5, 0x7b, 0x1b, 0xfe, + 0x5d, 0x0b, 0x66, 0x0d, 0xfa, 0x63, 0xd8, 0x0d, 0xd6, 0xcc, 0xdd, 0xe0, 0xe1, 0xbe, 0xdf, 0x50, + 0xb0, 0x0b, 0x7c, 0xad, 0x94, 0x69, 0x3b, 0x93, 0xfe, 0xef, 0xc2, 0xd0, 0x96, 0x13, 0xb9, 0xbd, + 0x52, 0x31, 0x76, 0x15, 0x5a, 0xb8, 0xe8, 0x44, 0x2e, 0x97, 0xe1, 0x4f, 0xa9, 0x37, 0xba, 0x9c, + 0xc8, 0xed, 0x1b, 0x1d, 0xc0, 0xaa, 0x42, 0x2f, 0xc2, 0x48, 0xdc, 0x0a, 0xdb, 0xca, 0xf7, 0xf2, + 0x2c, 0x7f, 0xbf, 0x8b, 0x42, 0x0e, 0xf7, 0xe7, 0x91, 0x59, 0x1d, 0x05, 0x63, 0x41, 0x3f, 0xb7, + 0x09, 0x15, 0x55, 0xf5, 0x3d, 0xf5, 0x2a, 0xff, 0xa3, 0x32, 0x9c, 0xc8, 0x99, 0x17, 0x28, 0x36, + 0x7a, 0xeb, 0x99, 0x01, 0xa7, 0xd3, 0xfb, 0xec, 0xaf, 0x98, 0x9d, 0x58, 0x5c, 0x31, 0xfe, 0x03, + 0x57, 0x7a, 0x3d, 0x26, 0xd9, 0x4a, 0x29, 0xa8, 0x7f, 0xa5, 0xb4, 0xb2, 0x63, 0xeb, 0x6a, 0x5a, + 0x91, 0x6a, 0xe9, 0x3d, 0x1d, 0xd3, 0x3f, 0x2b, 0xc3, 0xc9, 0xbc, 0xf0, 0x74, 0xf4, 0x33, 0x99, + 0x87, 0x1d, 0x9e, 0x1b, 0x34, 0xb0, 0x9d, 0xbf, 0xf6, 0x20, 0xb2, 0xbe, 0x2c, 0x98, 0x4f, 0x3d, + 0xf4, 0xed, 0x66, 0x51, 0x27, 0x0b, 0xd7, 0x89, 0xf8, 0x83, 0x1c, 0x72, 0x89, 0x7f, 0x62, 0xe0, + 0x06, 0x88, 0x97, 0x3c, 0xe2, 0x4c, 0xb8, 0x8e, 0x04, 0xf7, 0x0f, 0xd7, 0x91, 0x35, 0xcf, 0x79, + 0x30, 0xae, 0x7d, 0xcd, 0x3d, 0x1d, 0xf1, 0x6d, 0xba, 0xa3, 0x68, 0xed, 0xbe, 0xa7, 0xa3, 0xfe, + 0x15, 0x0b, 0x32, 0x7e, 0x52, 0xca, 0xfe, 0x61, 0x15, 0xda, 0x3f, 0xce, 0xc2, 0x50, 0x14, 0xfa, + 0x24, 0x9b, 0xeb, 0x1f, 0x87, 0x3e, 0xc1, 0x0c, 0xa3, 0x1e, 0xe4, 0x2d, 0x17, 0x3d, 0xc8, 0x4b, + 0x8f, 0xc6, 0x3e, 0xd9, 0x25, 0xd2, 0x1a, 0xa1, 0x64, 0xf2, 0x65, 0x0a, 0xc4, 0x1c, 0x67, 0xff, + 0xc6, 0x10, 0x9c, 0xc8, 0x09, 0x4e, 0xa3, 0x07, 0x95, 0x4d, 0x27, 0x21, 0xb7, 0x9c, 0xbd, 0x6c, + 0xfe, 0xd1, 0x0b, 0x1c, 0x8c, 0x25, 0x9e, 0xf9, 0x72, 0xf2, 0x14, 0x66, 0x19, 0x1b, 0x91, 0xc8, + 0x5c, 0x26, 0xb0, 0xf7, 0xea, 0x8d, 0xd6, 0xf3, 0x00, 0x71, 0xec, 0xaf, 0x06, 0x54, 0xf9, 0x72, + 0x85, 0xa7, 0x68, 0x9a, 0xef, 0xae, 0x79, 0x59, 0x60, 0xb0, 0x46, 0x85, 0x6a, 0x30, 0xd3, 0x8e, + 0xc2, 0x84, 0xdb, 0xdd, 0x6a, 0xdc, 0x47, 0x61, 0xd8, 0x0c, 0x33, 0x6a, 0x64, 0xf0, 0xb8, 0xab, + 0x04, 0x7a, 0x1e, 0xc6, 0x45, 0xe8, 0x51, 0x23, 0x0c, 0x7d, 0x61, 0xa5, 0x51, 0x37, 0xde, 0xcd, + 0x14, 0x85, 0x75, 0x3a, 0xad, 0x18, 0x33, 0xe6, 0x8d, 0xe6, 0x16, 0xe3, 0x06, 0x3d, 0x8d, 0x2e, + 0x93, 0xa5, 0x62, 0x6c, 0xa0, 0x2c, 0x15, 0xa9, 0xdd, 0xaa, 0x32, 0xf0, 0xfd, 0x05, 0xf4, 0xb5, + 0xf4, 0x7c, 0xa3, 0x0c, 0x23, 0x7c, 0x28, 0x8e, 0x41, 0x15, 0x5b, 0x13, 0xb6, 0x9b, 0x1e, 0xb9, + 0x01, 0x78, 0x5b, 0x16, 0x6a, 0x4e, 0xe2, 0x70, 0x31, 0xa4, 0x56, 0x43, 0x6a, 0xe5, 0x41, 0x0b, + 0xc6, 0x7a, 0x99, 0xcb, 0x18, 0x27, 0x80, 0xf3, 0xd0, 0x56, 0xcf, 0xdb, 0x00, 0x31, 0x7b, 0x27, + 0x94, 0xf2, 0x10, 0xb9, 0x4c, 0x9f, 0xe8, 0x51, 0x7b, 0x53, 0x11, 0xf3, 0x36, 0xa4, 0x53, 0x50, + 0x21, 0xb0, 0xc6, 0x71, 0xee, 0x05, 0xa8, 0x28, 0xe2, 0x7e, 0x27, 0xb9, 0x09, 0x5d, 0x78, 0x7d, + 0x0a, 0xa6, 0x33, 0x75, 0x1d, 0xe9, 0x20, 0xf8, 0xdb, 0x16, 0x4c, 0xf3, 0x26, 0xaf, 0x06, 0xbb, + 0x62, 0xb1, 0xbf, 0x07, 0x27, 0xfd, 0x9c, 0x45, 0x27, 0x46, 0x74, 0xf0, 0x45, 0xaa, 0x0e, 0x7e, + 0x79, 0x58, 0x9c, 0x5b, 0x07, 0x3d, 0xfc, 0xf3, 0x17, 0x8e, 0x1d, 0x5f, 0x78, 0x20, 0x4f, 0xf0, + 0x1c, 0xcf, 0x1c, 0x86, 0x15, 0xd6, 0xfe, 0x9e, 0x05, 0xb3, 0x5d, 0xef, 0xe3, 0x7f, 0xa0, 0x6d, + 0x17, 0x29, 0xac, 0x4b, 0x05, 0x29, 0xac, 0xf5, 0x4f, 0x2b, 0xf7, 0xfc, 0xb4, 0x5f, 0xb3, 0x40, + 0xcc, 0xc0, 0x63, 0x50, 0xe7, 0x3f, 0x6d, 0xaa, 0xf3, 0x73, 0xc5, 0x93, 0xba, 0x40, 0x8f, 0xff, + 0x0b, 0x0b, 0x66, 0x38, 0x41, 0x7a, 0x79, 0xf1, 0x81, 0x8e, 0xc3, 0x20, 0xef, 0xaa, 0xa8, 0x87, + 0x2c, 0xf3, 0x3f, 0xca, 0x18, 0xac, 0xa1, 0x9e, 0x83, 0xe5, 0xca, 0x05, 0x74, 0x84, 0xf7, 0x82, + 0x8e, 0x9c, 0x75, 0xcd, 0xfe, 0x53, 0x0b, 0x10, 0xaf, 0x26, 0xfb, 0xb4, 0x34, 0xdf, 0xfa, 0xb4, + 0x03, 0x7d, 0x2a, 0x6a, 0x14, 0x06, 0x6b, 0x54, 0x77, 0xa5, 0x7b, 0x32, 0x37, 0x50, 0xe5, 0xfe, + 0x37, 0x50, 0x47, 0xe8, 0xd1, 0xbf, 0x31, 0x04, 0x59, 0x77, 0x47, 0x74, 0x03, 0x26, 0x5a, 0x4e, + 0xdb, 0xb9, 0xe9, 0xf9, 0x5e, 0xe2, 0x91, 0xb8, 0xd7, 0xd5, 0xf5, 0x8a, 0x46, 0x27, 0xae, 0x7b, + 0x34, 0x08, 0x36, 0xf8, 0xa0, 0x05, 0x80, 0x76, 0xe4, 0xed, 0x7a, 0x3e, 0xd9, 0x64, 0x27, 0x1a, + 0x16, 0xf3, 0xc0, 0xef, 0x63, 0x25, 0x14, 0x6b, 0x14, 0x39, 0x3e, 0xf2, 0xe5, 0x7b, 0xe7, 0x23, + 0x3f, 0x74, 0x44, 0x1f, 0xf9, 0xe1, 0x81, 0x7c, 0xe4, 0x31, 0xdc, 0x27, 0xf7, 0x6e, 0xfa, 0x7f, + 0xcd, 0xf3, 0x89, 0x50, 0xd8, 0x78, 0x24, 0xc4, 0xdc, 0xc1, 0xfe, 0xfc, 0x7d, 0x38, 0x97, 0x02, + 0x17, 0x94, 0x44, 0x3f, 0x09, 0x55, 0xc7, 0xf7, 0xc3, 0x5b, 0xaa, 0xd7, 0x56, 0xe3, 0x96, 0xe3, + 0xa7, 0x49, 0x48, 0xc7, 0x96, 0x1f, 0x3c, 0xd8, 0x9f, 0xaf, 0x2e, 0x15, 0xd0, 0xe0, 0xc2, 0xd2, + 0xf6, 0x36, 0x9c, 0x68, 0x92, 0x48, 0x3e, 0x41, 0xa6, 0x96, 0xd8, 0x3a, 0x54, 0xa2, 0x8c, 0x50, + 0x19, 0x28, 0xf0, 0x5d, 0x4b, 0xfd, 0x25, 0x85, 0x48, 0xca, 0xc8, 0xfe, 0x73, 0x0b, 0x46, 0x85, + 0x0b, 0xe5, 0x31, 0xe8, 0x32, 0x4b, 0x86, 0x59, 0x69, 0x3e, 0x5f, 0xf0, 0xb2, 0xc6, 0x14, 0x1a, + 0x94, 0xea, 0x19, 0x83, 0xd2, 0xc3, 0xbd, 0x98, 0xf4, 0x36, 0x25, 0xfd, 0x62, 0x19, 0xa6, 0x4c, + 0xf7, 0xd1, 0x63, 0xe8, 0x82, 0xab, 0x30, 0x1a, 0x0b, 0x5f, 0xe5, 0x52, 0xb1, 0xcf, 0x5b, 0x76, + 0x10, 0xd3, 0x9b, 0x71, 0xe1, 0x9d, 0x2c, 0x99, 0xe4, 0x3a, 0x41, 0x97, 0xef, 0xa1, 0x13, 0x74, + 0x3f, 0x0f, 0xde, 0xa1, 0xbb, 0xe1, 0xc1, 0x6b, 0x7f, 0x93, 0x09, 0x7f, 0x1d, 0x7e, 0x0c, 0x7a, + 0xc1, 0x05, 0x73, 0x9b, 0xb0, 0x7b, 0xcc, 0x2c, 0xd1, 0xa8, 0x02, 0xfd, 0xe0, 0x9f, 0x58, 0x30, + 0x2e, 0x08, 0x8f, 0xa1, 0xd9, 0x9f, 0x31, 0x9b, 0xfd, 0x40, 0x8f, 0x66, 0x17, 0xb4, 0xf7, 0xef, + 0x96, 0x54, 0x7b, 0x1b, 0x61, 0x94, 0x0c, 0x94, 0x94, 0x7a, 0x8c, 0x9e, 0x06, 0xc3, 0x56, 0xe8, + 0x8b, 0xcd, 0xfc, 0xc1, 0x34, 0x18, 0x8e, 0xc3, 0x0f, 0xb5, 0xdf, 0x58, 0x51, 0xb3, 0x58, 0xad, + 0x30, 0x4a, 0xc4, 0x06, 0x9a, 0xc6, 0x6a, 0x85, 0x51, 0x82, 0x19, 0x06, 0xb9, 0x00, 0xe9, 0xdb, + 0xec, 0x22, 0x7a, 0xb4, 0x78, 0x15, 0x76, 0x12, 0xcf, 0x5f, 0xf0, 0x82, 0x24, 0x4e, 0xa2, 0x85, + 0x7a, 0x90, 0x5c, 0x8b, 0xf8, 0xd9, 0x40, 0x8b, 0x6e, 0x53, 0xbc, 0xb0, 0xc6, 0x57, 0x86, 0x57, + 0xb0, 0x3a, 0x86, 0xcd, 0xfb, 0x9e, 0xab, 0x02, 0x8e, 0x15, 0x85, 0xfd, 0x02, 0x93, 0xc9, 0xac, + 0x83, 0x8e, 0x16, 0x78, 0xf6, 0x9d, 0x31, 0xd5, 0xb5, 0xcc, 0xd8, 0x5b, 0xd3, 0xc3, 0xdb, 0x7a, + 0x8b, 0x40, 0x5a, 0xb1, 0xee, 0x4a, 0x9c, 0xc6, 0xc0, 0xa1, 0xcf, 0x76, 0x5d, 0x03, 0x3e, 0xdd, + 0x47, 0x96, 0x1e, 0xe1, 0xe2, 0x8f, 0xe5, 0xd8, 0x63, 0xb9, 0xc8, 0xea, 0x8d, 0x6c, 0xda, 0xf0, + 0x15, 0x89, 0xc0, 0x29, 0x0d, 0x5a, 0x14, 0x27, 0x4b, 0x6e, 0x66, 0x79, 0x20, 0x73, 0xb2, 0x94, + 0x9f, 0xaf, 0x1d, 0x2d, 0x9f, 0x81, 0x71, 0xf5, 0x14, 0x4b, 0x83, 0xbf, 0x68, 0x51, 0xe1, 0xba, + 0xd4, 0x6a, 0x0a, 0xc6, 0x3a, 0x0d, 0x5a, 0x87, 0xe9, 0x98, 0xbf, 0x13, 0x23, 0x23, 0x1e, 0x84, + 0xdd, 0xe0, 0x89, 0xcc, 0x2b, 0xf0, 0x12, 0x7d, 0xc8, 0x40, 0x7c, 0xb1, 0xca, 0x18, 0x89, 0x2c, + 0x0b, 0xf4, 0x0a, 0x4c, 0xf9, 0xfa, 0x7b, 0x99, 0x0d, 0x61, 0x56, 0x50, 0xae, 0x5c, 0xc6, 0x6b, + 0x9a, 0x0d, 0x9c, 0xa1, 0xa6, 0x4a, 0x80, 0x0e, 0x11, 0xa9, 0x70, 0x9c, 0x60, 0x93, 0xc4, 0xe2, + 0x21, 0x09, 0xa6, 0x04, 0x5c, 0x2e, 0xa0, 0xc1, 0x85, 0xa5, 0xd1, 0x8b, 0x30, 0x21, 0x3f, 0x5f, + 0x8b, 0x00, 0x4a, 0x1d, 0x06, 0x35, 0x1c, 0x36, 0x28, 0xd1, 0x2d, 0x38, 0x25, 0xff, 0xaf, 0x47, + 0xce, 0xc6, 0x86, 0xd7, 0x12, 0x01, 0x58, 0xe3, 0x8c, 0xc5, 0x92, 0xf4, 0x9e, 0x5e, 0xcd, 0x23, + 0x3a, 0xdc, 0x9f, 0x3f, 0x2b, 0x7a, 0x2d, 0x17, 0xcf, 0x06, 0x31, 0x9f, 0x3f, 0xba, 0x02, 0x27, + 0xb6, 0x88, 0xe3, 0x27, 0x5b, 0x2b, 0x5b, 0xa4, 0xb5, 0x2d, 0x17, 0x11, 0x8b, 0x2b, 0xd2, 0xdc, + 0xec, 0x2e, 0x76, 0x93, 0xe0, 0xbc, 0x72, 0xe8, 0x2d, 0xa8, 0xb6, 0x3b, 0x37, 0x7d, 0x2f, 0xde, + 0xba, 0x1a, 0x26, 0xec, 0xc6, 0x52, 0xbd, 0x64, 0x22, 0x02, 0x90, 0x54, 0x4c, 0x55, 0xa3, 0x80, + 0x0e, 0x17, 0x72, 0x40, 0xef, 0xc1, 0xa9, 0xcc, 0x64, 0xe0, 0x8f, 0xe3, 0x88, 0x40, 0xa5, 0xc7, + 0xf3, 0x97, 0x53, 0x4e, 0x01, 0x1e, 0x16, 0x97, 0x8b, 0xc2, 0xf9, 0x55, 0xbc, 0xbf, 0x7b, 0xec, + 0x77, 0x69, 0x61, 0x4d, 0xbb, 0x41, 0x9f, 0x83, 0x09, 0x7d, 0x16, 0x89, 0x0d, 0xe6, 0xd1, 0x7e, + 0x6f, 0xc3, 0x0a, 0xdd, 0x48, 0xcd, 0x28, 0x1d, 0x87, 0x0d, 0x8e, 0x36, 0x81, 0xfc, 0xef, 0x43, + 0x97, 0x61, 0xac, 0xe5, 0x7b, 0x24, 0x48, 0xea, 0x8d, 0x5e, 0x81, 0xb3, 0x2b, 0x82, 0x46, 0x74, + 0x98, 0xc8, 0xc4, 0xc4, 0x61, 0x58, 0x71, 0xb0, 0x7f, 0xbf, 0x04, 0xf3, 0x7d, 0x92, 0x71, 0x65, + 0x6c, 0x80, 0xd6, 0x40, 0x36, 0xc0, 0x25, 0xf9, 0x2e, 0xcb, 0xd5, 0xcc, 0xf9, 0x33, 0xf3, 0xe6, + 0x4a, 0x7a, 0x0a, 0xcd, 0xd2, 0x0f, 0xec, 0xfe, 0xa6, 0x9b, 0x11, 0x87, 0xfa, 0x7a, 0x01, 0x36, + 0x74, 0x7b, 0xf0, 0xf0, 0xe0, 0x1a, 0x7d, 0xa1, 0x29, 0xd8, 0xfe, 0x66, 0x09, 0x4e, 0xa9, 0x2e, + 0xfc, 0xf1, 0xed, 0xb8, 0xeb, 0xdd, 0x1d, 0x77, 0x17, 0x0c, 0xe9, 0xf6, 0x35, 0x18, 0x69, 0xee, + 0xc5, 0xad, 0xc4, 0x1f, 0x40, 0x01, 0x7a, 0xc4, 0x58, 0xa0, 0xe9, 0x36, 0xcd, 0x9e, 0x56, 0x13, + 0xeb, 0xd5, 0xfe, 0xab, 0x16, 0x4c, 0xaf, 0xaf, 0x34, 0x9a, 0x61, 0x6b, 0x9b, 0x24, 0x4b, 0xdc, + 0x4c, 0x84, 0x85, 0xfe, 0x63, 0xdd, 0xa1, 0x5e, 0x93, 0xa7, 0x31, 0x9d, 0x85, 0xa1, 0xad, 0x30, + 0x4e, 0xb2, 0x97, 0x25, 0x17, 0xc3, 0x38, 0xc1, 0x0c, 0x63, 0xff, 0xb1, 0x05, 0xc3, 0xec, 0x35, + 0xb1, 0x7e, 0xaf, 0xce, 0x0d, 0xf2, 0x5d, 0xe8, 0x79, 0x18, 0x21, 0x1b, 0x1b, 0xa4, 0x95, 0x88, + 0x51, 0x95, 0x11, 0x39, 0x23, 0xab, 0x0c, 0x4a, 0x37, 0x7d, 0x56, 0x19, 0xff, 0x8b, 0x05, 0x31, + 0xfa, 0x2c, 0x54, 0x12, 0x6f, 0x87, 0x2c, 0xb9, 0xae, 0xb8, 0xa7, 0x38, 0x9a, 0x4b, 0x9a, 0x52, + 0x42, 0xd6, 0x25, 0x13, 0x9c, 0xf2, 0xb3, 0x7f, 0xbe, 0x04, 0x90, 0x46, 0xee, 0xf5, 0xfb, 0xcc, + 0xe5, 0xae, 0xc7, 0xf5, 0x1e, 0xcd, 0x79, 0x5c, 0x0f, 0xa5, 0x0c, 0x73, 0x9e, 0xd6, 0x53, 0x5d, + 0x55, 0x1e, 0xa8, 0xab, 0x86, 0x8e, 0xd2, 0x55, 0x2b, 0x30, 0x9b, 0x46, 0x1e, 0x9a, 0x61, 0xd8, + 0x2c, 0xf1, 0xee, 0x7a, 0x16, 0x89, 0xbb, 0xe9, 0xed, 0x2f, 0x59, 0x20, 0xdc, 0x94, 0x07, 0x98, + 0xd0, 0x6f, 0xca, 0x77, 0xb0, 0x8c, 0x0c, 0x81, 0x67, 0x8b, 0xfd, 0xb6, 0x45, 0x5e, 0x40, 0xb5, + 0x81, 0x18, 0xd9, 0x00, 0x0d, 0x5e, 0xf6, 0xef, 0x5a, 0x30, 0xce, 0xd1, 0x57, 0xd8, 0x29, 0xbb, + 0x7f, 0x6b, 0x8e, 0x94, 0xb6, 0x99, 0x3d, 0x11, 0x45, 0x19, 0xab, 0xec, 0xbe, 0xfa, 0x13, 0x51, + 0x12, 0x81, 0x53, 0x1a, 0xf4, 0x38, 0x8c, 0xc6, 0x9d, 0x9b, 0x8c, 0x3c, 0xe3, 0xa9, 0xdc, 0xe4, + 0x60, 0x2c, 0xf1, 0x74, 0x5e, 0xcd, 0x64, 0x1d, 0xd5, 0xd1, 0x45, 0x18, 0xe1, 0x62, 0x43, 0x2c, + 0xe3, 0x1e, 0xb7, 0x32, 0x9a, 0x7b, 0x3b, 0xf0, 0x37, 0xcd, 0x99, 0xb8, 0x11, 0xe5, 0xd1, 0x5b, + 0x30, 0xee, 0x86, 0xb7, 0x82, 0x5b, 0x4e, 0xe4, 0x2e, 0x35, 0xea, 0xa2, 0xd7, 0x73, 0xb5, 0x8f, + 0x5a, 0x4a, 0xa6, 0xbb, 0xcc, 0x33, 0x0b, 0x64, 0x8a, 0xc2, 0x3a, 0x3b, 0xb4, 0xce, 0x92, 0xa1, + 0xf0, 0x97, 0x56, 0x7b, 0x39, 0xe0, 0xa8, 0xc7, 0x59, 0x35, 0xce, 0x93, 0x22, 0x63, 0x8a, 0x78, + 0xa7, 0x35, 0x65, 0x64, 0x7f, 0xe1, 0x04, 0x18, 0xa3, 0x6d, 0x24, 0x57, 0xb6, 0xee, 0x52, 0x72, + 0x65, 0x0c, 0x63, 0x64, 0xa7, 0x9d, 0xec, 0xd5, 0xbc, 0xa8, 0x57, 0xb6, 0xfb, 0x55, 0x41, 0xd3, + 0xcd, 0x53, 0x62, 0xb0, 0xe2, 0x93, 0x9f, 0x01, 0xbb, 0xfc, 0x01, 0x66, 0xc0, 0x1e, 0x3a, 0xc6, + 0x0c, 0xd8, 0x57, 0x61, 0x74, 0xd3, 0x4b, 0x30, 0x69, 0x87, 0x62, 0xcb, 0xcc, 0x9d, 0x09, 0x17, + 0x38, 0x49, 0x77, 0x9e, 0x56, 0x81, 0xc0, 0x92, 0x09, 0x7a, 0x55, 0xad, 0x81, 0x91, 0x62, 0x8d, + 0xb3, 0xdb, 0x80, 0x9f, 0xbb, 0x0a, 0x44, 0xc6, 0xeb, 0xd1, 0x3b, 0xcd, 0x78, 0xad, 0x32, 0x56, + 0x8f, 0xbd, 0xbf, 0x8c, 0xd5, 0x46, 0x46, 0xef, 0xca, 0xdd, 0xcb, 0xe8, 0xfd, 0x25, 0x0b, 0x4e, + 0xb5, 0xf3, 0x92, 0xdb, 0x8b, 0xdc, 0xd3, 0xcf, 0x0f, 0x9c, 0xe4, 0xdf, 0xa8, 0x90, 0x1d, 0x3d, + 0x72, 0xc9, 0x70, 0x7e, 0x75, 0x32, 0x35, 0xf8, 0xf8, 0x9d, 0xa6, 0x06, 0xbf, 0x37, 0x49, 0xaa, + 0xd3, 0x44, 0xe1, 0x93, 0xef, 0x3b, 0x51, 0xf8, 0xab, 0x2a, 0x51, 0x78, 0x8f, 0x94, 0x13, 0x3c, + 0x0d, 0x78, 0xdf, 0xf4, 0xe0, 0x5a, 0x8a, 0xef, 0xe9, 0xbb, 0x91, 0xe2, 0xfb, 0x6d, 0x53, 0xd8, + 0xf3, 0x7c, 0xd3, 0x4f, 0xf6, 0x11, 0xf6, 0x06, 0xdf, 0xde, 0xe2, 0x9e, 0xa7, 0x33, 0x9f, 0xbd, + 0xa3, 0x74, 0xe6, 0x37, 0xf4, 0x44, 0xe1, 0xa8, 0x4f, 0x26, 0x6c, 0x4a, 0x34, 0x60, 0x7a, 0xf0, + 0x1b, 0xfa, 0x16, 0x74, 0xa2, 0x98, 0xaf, 0xda, 0x69, 0xba, 0xf9, 0xe6, 0x6d, 0x42, 0xdd, 0x69, + 0xc7, 0x4f, 0x1e, 0x4f, 0xda, 0xf1, 0x53, 0x77, 0x3d, 0xed, 0xf8, 0x7d, 0xc7, 0x90, 0x76, 0xfc, + 0xfe, 0x0f, 0x34, 0xed, 0x78, 0xf5, 0xde, 0xa6, 0x1d, 0x3f, 0x7d, 0x37, 0xd2, 0x8e, 0xdf, 0x80, + 0x4a, 0x5b, 0xc6, 0x32, 0x56, 0xe7, 0x8a, 0x87, 0x24, 0x37, 0xe0, 0x91, 0x0f, 0x89, 0x42, 0xe1, + 0x94, 0x15, 0xe5, 0x9b, 0xa6, 0x21, 0x7f, 0xa0, 0x87, 0x71, 0x29, 0xef, 0xd8, 0xde, 0x23, 0xf9, + 0xf8, 0x5f, 0x2b, 0xc1, 0x99, 0xde, 0xf3, 0x3a, 0x3d, 0xf3, 0x37, 0x52, 0x1b, 0x75, 0xe6, 0xcc, + 0xcf, 0x94, 0x2e, 0x8d, 0x6a, 0xe0, 0x80, 0xef, 0x0b, 0x30, 0xab, 0x5c, 0xba, 0x7c, 0xaf, 0xb5, + 0xa7, 0xbd, 0x1c, 0xa4, 0xa2, 0x04, 0x9a, 0x59, 0x02, 0xdc, 0x5d, 0x06, 0x2d, 0xc1, 0xb4, 0x01, + 0xac, 0xd7, 0x84, 0x4a, 0xae, 0x8c, 0x0c, 0x4d, 0x13, 0x8d, 0xb3, 0xf4, 0xf6, 0xd7, 0x2c, 0xb8, + 0xbf, 0x20, 0x83, 0xe9, 0xc0, 0xf1, 0xcc, 0x1b, 0x30, 0xdd, 0x36, 0x8b, 0xf6, 0x49, 0x7b, 0x60, + 0xe4, 0x49, 0x55, 0x6d, 0xcd, 0x20, 0x70, 0x96, 0xe9, 0xf2, 0xb9, 0x6f, 0x7d, 0xff, 0xcc, 0x47, + 0xfe, 0xf0, 0xfb, 0x67, 0x3e, 0xf2, 0xbd, 0xef, 0x9f, 0xf9, 0xc8, 0x5f, 0x3a, 0x38, 0x63, 0x7d, + 0xeb, 0xe0, 0x8c, 0xf5, 0x87, 0x07, 0x67, 0xac, 0xef, 0x1d, 0x9c, 0xb1, 0xfe, 0xe4, 0xe0, 0x8c, + 0xf5, 0xf3, 0x3f, 0x38, 0xf3, 0x91, 0x37, 0x4b, 0xbb, 0xcf, 0xfc, 0xbf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xa6, 0x63, 0x42, 0x83, 0x43, 0xce, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 73268a344cf94..75d84162389f8 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -269,6 +269,15 @@ message CinderVolumeSource { optional bool readOnly = 3; } +// ClientIPConfig represents the configurations of Client IP based session affinity. +message ClientIPConfig { + // timeoutSeconds specifies the seconds of ClientIP type session sticky time. + // The value must be >0 && <=86400(for 1 day) if ServiceAffinity == "ClientIP". + // Default value is 10800(for 3 hours). + // +optional + optional int32 timeoutSeconds = 1; +} + // Information about the condition of a component. message ComponentCondition { // Type of condition for a component. @@ -3864,6 +3873,10 @@ message ServiceSpec { // field. // +optional optional bool publishNotReadyAddresses = 13; + + // sessionAffinityConfig contains the configurations of session affinity. + // +optional + optional SessionAffinityConfig sessionAffinityConfig = 14; } // ServiceStatus represents the current status of a service. @@ -3874,6 +3887,13 @@ message ServiceStatus { optional LoadBalancerStatus loadBalancer = 1; } +// SessionAffinityConfig represents the configurations of session affinity. +message SessionAffinityConfig { + // clientIP contains the configurations of Client IP based session affinity. + // +optional + optional ClientIPConfig clientIP = 1; +} + // Represents a StorageOS persistent volume resource. message StorageOSPersistentVolumeSource { // VolumeName is the human-readable name of the StorageOS volume. Volume diff --git a/staging/src/k8s.io/api/core/v1/types.generated.go b/staging/src/k8s.io/api/core/v1/types.generated.go index 8de7da85cc92d..90352dc65bcea 100644 --- a/staging/src/k8s.io/api/core/v1/types.generated.go +++ b/staging/src/k8s.io/api/core/v1/types.generated.go @@ -44373,6 +44373,382 @@ func (x *ServiceAffinity) CodecDecodeSelf(d *codec1978.Decoder) { } } +func (x *SessionAffinityConfig) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [1]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.ClientIP != nil + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(1) + } else { + yynn2 = 0 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + if x.ClientIP == nil { + r.EncodeNil() + } else { + x.ClientIP.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("clientIP")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.ClientIP == nil { + r.EncodeNil() + } else { + x.ClientIP.CodecEncodeSelf(e) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *SessionAffinityConfig) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *SessionAffinityConfig) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "clientIP": + if r.TryDecodeAsNil() { + if x.ClientIP != nil { + x.ClientIP = nil + } + } else { + if x.ClientIP == nil { + x.ClientIP = new(ClientIPConfig) + } + x.ClientIP.CodecDecodeSelf(d) + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *SessionAffinityConfig) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj5 int + var yyb5 bool + var yyhl5 bool = l >= 0 + yyj5++ + if yyhl5 { + yyb5 = yyj5 > l + } else { + yyb5 = r.CheckBreak() + } + if yyb5 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.ClientIP != nil { + x.ClientIP = nil + } + } else { + if x.ClientIP == nil { + x.ClientIP = new(ClientIPConfig) + } + x.ClientIP.CodecDecodeSelf(d) + } + for { + yyj5++ + if yyhl5 { + yyb5 = yyj5 > l + } else { + yyb5 = r.CheckBreak() + } + if yyb5 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj5-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x *ClientIPConfig) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [1]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[0] = x.TimeoutSeconds != nil + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(1) + } else { + yynn2 = 0 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[0] { + if x.TimeoutSeconds == nil { + r.EncodeNil() + } else { + yy4 := *x.TimeoutSeconds + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeInt(int64(yy4)) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("timeoutSeconds")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.TimeoutSeconds == nil { + r.EncodeNil() + } else { + yy6 := *x.TimeoutSeconds + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeInt(int64(yy6)) + } + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *ClientIPConfig) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *ClientIPConfig) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "timeoutSeconds": + if r.TryDecodeAsNil() { + if x.TimeoutSeconds != nil { + x.TimeoutSeconds = nil + } + } else { + if x.TimeoutSeconds == nil { + x.TimeoutSeconds = new(int32) + } + yym5 := z.DecBinary() + _ = yym5 + if false { + } else { + *((*int32)(x.TimeoutSeconds)) = int32(r.DecodeInt(32)) + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *ClientIPConfig) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj6 int + var yyb6 bool + var yyhl6 bool = l >= 0 + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.TimeoutSeconds != nil { + x.TimeoutSeconds = nil + } + } else { + if x.TimeoutSeconds == nil { + x.TimeoutSeconds = new(int32) + } + yym8 := z.DecBinary() + _ = yym8 + if false { + } else { + *((*int32)(x.TimeoutSeconds)) = int32(r.DecodeInt(32)) + } + } + for { + yyj6++ + if yyhl6 { + yyb6 = yyj6 > l + } else { + yyb6 = r.CheckBreak() + } + if yyb6 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj6-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x ServiceType) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -45032,7 +45408,7 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [12]bool + var yyq2 [13]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = len(x.Ports) != 0 @@ -45047,9 +45423,10 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[9] = x.ExternalTrafficPolicy != "" yyq2[10] = x.HealthCheckNodePort != 0 yyq2[11] = x.PublishNotReadyAddresses != false + yyq2[12] = x.SessionAffinityConfig != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(12) + r.EncodeArrayStart(13) } else { yynn2 = 0 for _, b := range yyq2 { @@ -45362,6 +45739,29 @@ func (x *ServiceSpec) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[12] { + if x.SessionAffinityConfig == nil { + r.EncodeNil() + } else { + x.SessionAffinityConfig.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[12] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("sessionAffinityConfig")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.SessionAffinityConfig == nil { + r.EncodeNil() + } else { + x.SessionAffinityConfig.CodecEncodeSelf(e) + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -45552,6 +45952,17 @@ func (x *ServiceSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { *((*bool)(yyv23)) = r.DecodeBool() } } + case "sessionAffinityConfig": + if r.TryDecodeAsNil() { + if x.SessionAffinityConfig != nil { + x.SessionAffinityConfig = nil + } + } else { + if x.SessionAffinityConfig == nil { + x.SessionAffinityConfig = new(SessionAffinityConfig) + } + x.SessionAffinityConfig.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -45563,16 +45974,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj25 int - var yyb25 bool - var yyhl25 bool = l >= 0 - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + var yyj26 int + var yyb26 bool + var yyhl26 bool = l >= 0 + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45580,21 +45991,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Ports = nil } else { - yyv26 := &x.Ports - yym27 := z.DecBinary() - _ = yym27 + yyv27 := &x.Ports + yym28 := z.DecBinary() + _ = yym28 if false { } else { - h.decSliceServicePort((*[]ServicePort)(yyv26), d) + h.decSliceServicePort((*[]ServicePort)(yyv27), d) } } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45602,21 +46013,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Selector = nil } else { - yyv28 := &x.Selector - yym29 := z.DecBinary() - _ = yym29 + yyv29 := &x.Selector + yym30 := z.DecBinary() + _ = yym30 if false { } else { - z.F.DecMapStringStringX(yyv28, false, d) + z.F.DecMapStringStringX(yyv29, false, d) } } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45624,21 +46035,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ClusterIP = "" } else { - yyv30 := &x.ClusterIP - yym31 := z.DecBinary() - _ = yym31 + yyv31 := &x.ClusterIP + yym32 := z.DecBinary() + _ = yym32 if false { } else { - *((*string)(yyv30)) = r.DecodeString() + *((*string)(yyv31)) = r.DecodeString() } } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45646,16 +46057,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Type = "" } else { - yyv32 := &x.Type - yyv32.CodecDecodeSelf(d) + yyv33 := &x.Type + yyv33.CodecDecodeSelf(d) } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45663,21 +46074,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalIPs = nil } else { - yyv33 := &x.ExternalIPs - yym34 := z.DecBinary() - _ = yym34 + yyv34 := &x.ExternalIPs + yym35 := z.DecBinary() + _ = yym35 if false { } else { - z.F.DecSliceStringX(yyv33, false, d) + z.F.DecSliceStringX(yyv34, false, d) } } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45685,16 +46096,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.SessionAffinity = "" } else { - yyv35 := &x.SessionAffinity - yyv35.CodecDecodeSelf(d) + yyv36 := &x.SessionAffinity + yyv36.CodecDecodeSelf(d) } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45702,21 +46113,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.LoadBalancerIP = "" } else { - yyv36 := &x.LoadBalancerIP - yym37 := z.DecBinary() - _ = yym37 + yyv37 := &x.LoadBalancerIP + yym38 := z.DecBinary() + _ = yym38 if false { } else { - *((*string)(yyv36)) = r.DecodeString() + *((*string)(yyv37)) = r.DecodeString() } } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45724,21 +46135,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.LoadBalancerSourceRanges = nil } else { - yyv38 := &x.LoadBalancerSourceRanges - yym39 := z.DecBinary() - _ = yym39 + yyv39 := &x.LoadBalancerSourceRanges + yym40 := z.DecBinary() + _ = yym40 if false { } else { - z.F.DecSliceStringX(yyv38, false, d) + z.F.DecSliceStringX(yyv39, false, d) } } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45746,21 +46157,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalName = "" } else { - yyv40 := &x.ExternalName - yym41 := z.DecBinary() - _ = yym41 + yyv41 := &x.ExternalName + yym42 := z.DecBinary() + _ = yym42 if false { } else { - *((*string)(yyv40)) = r.DecodeString() + *((*string)(yyv41)) = r.DecodeString() } } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45768,16 +46179,16 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.ExternalTrafficPolicy = "" } else { - yyv42 := &x.ExternalTrafficPolicy - yyv42.CodecDecodeSelf(d) + yyv43 := &x.ExternalTrafficPolicy + yyv43.CodecDecodeSelf(d) } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45785,21 +46196,21 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.HealthCheckNodePort = 0 } else { - yyv43 := &x.HealthCheckNodePort - yym44 := z.DecBinary() - _ = yym44 + yyv44 := &x.HealthCheckNodePort + yym45 := z.DecBinary() + _ = yym45 if false { } else { - *((*int32)(yyv43)) = int32(r.DecodeInt(32)) + *((*int32)(yyv44)) = int32(r.DecodeInt(32)) } } - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -45807,26 +46218,47 @@ func (x *ServiceSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.PublishNotReadyAddresses = false } else { - yyv45 := &x.PublishNotReadyAddresses - yym46 := z.DecBinary() - _ = yym46 + yyv46 := &x.PublishNotReadyAddresses + yym47 := z.DecBinary() + _ = yym47 if false { } else { - *((*bool)(yyv45)) = r.DecodeBool() + *((*bool)(yyv46)) = r.DecodeBool() + } + } + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l + } else { + yyb26 = r.CheckBreak() + } + if yyb26 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.SessionAffinityConfig != nil { + x.SessionAffinityConfig = nil } + } else { + if x.SessionAffinityConfig == nil { + x.SessionAffinityConfig = new(SessionAffinityConfig) + } + x.SessionAffinityConfig.CodecDecodeSelf(d) } for { - yyj25++ - if yyhl25 { - yyb25 = yyj25 > l + yyj26++ + if yyhl26 { + yyb26 = yyj26 > l } else { - yyb25 = r.CheckBreak() + yyb26 = r.CheckBreak() } - if yyb25 { + if yyb26 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj25-1, "") + z.DecStructFieldNotFound(yyj26-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -74751,7 +75183,7 @@ func (x codecSelfer1234) decSliceService(v *[]Service, d *codec1978.Decoder) { yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 472) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 480) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index 30add02bcf531..6f6a4a503b22e 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -165,6 +165,15 @@ func (CinderVolumeSource) SwaggerDoc() map[string]string { return map_CinderVolumeSource } +var map_ClientIPConfig = map[string]string{ + "": "ClientIPConfig represents the configurations of Client IP based session affinity.", + "timeoutSeconds": "timeoutSeconds specifies the seconds of ClientIP type session sticky time. The value must be >0 && <=86400(for 1 day) if ServiceAffinity == \"ClientIP\". Default value is 10800(for 3 hours).", +} + +func (ClientIPConfig) SwaggerDoc() map[string]string { + return map_ClientIPConfig +} + var map_ComponentCondition = map[string]string{ "": "Information about the condition of a component.", "type": "Type of condition for a component. Valid value: \"Healthy\"", @@ -1903,6 +1912,7 @@ var map_ServiceSpec = map[string]string{ "externalTrafficPolicy": "externalTrafficPolicy denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. \"Local\" preserves the client source IP and avoids a second hop for LoadBalancer and Nodeport type services, but risks potentially imbalanced traffic spreading. \"Cluster\" obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.", "healthCheckNodePort": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local.", "publishNotReadyAddresses": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field.", + "sessionAffinityConfig": "sessionAffinityConfig contains the configurations of session affinity.", } func (ServiceSpec) SwaggerDoc() map[string]string { @@ -1918,6 +1928,15 @@ func (ServiceStatus) SwaggerDoc() map[string]string { return map_ServiceStatus } +var map_SessionAffinityConfig = map[string]string{ + "": "SessionAffinityConfig represents the configurations of session affinity.", + "clientIP": "clientIP contains the configurations of Client IP based session affinity.", +} + +func (SessionAffinityConfig) SwaggerDoc() map[string]string { + return map_SessionAffinityConfig +} + var map_StorageOSPersistentVolumeSource = map[string]string{ "": "Represents a StorageOS persistent volume resource.", "volumeName": "VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace.", diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index b204c2d696565..f91dfb48c41c6 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -86,6 +86,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*CinderVolumeSource).DeepCopyInto(out.(*CinderVolumeSource)) return nil }, InType: reflect.TypeOf(&CinderVolumeSource{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*ClientIPConfig).DeepCopyInto(out.(*ClientIPConfig)) + return nil + }, InType: reflect.TypeOf(&ClientIPConfig{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*ComponentCondition).DeepCopyInto(out.(*ComponentCondition)) return nil @@ -690,6 +694,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*ServiceStatus).DeepCopyInto(out.(*ServiceStatus)) return nil }, InType: reflect.TypeOf(&ServiceStatus{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*SessionAffinityConfig).DeepCopyInto(out.(*SessionAffinityConfig)) + return nil + }, InType: reflect.TypeOf(&SessionAffinityConfig{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*StorageOSPersistentVolumeSource).DeepCopyInto(out.(*StorageOSPersistentVolumeSource)) return nil @@ -1062,6 +1070,31 @@ func (in *CinderVolumeSource) DeepCopy() *CinderVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClientIPConfig) DeepCopyInto(out *ClientIPConfig) { + *out = *in + if in.TimeoutSeconds != nil { + in, out := &in.TimeoutSeconds, &out.TimeoutSeconds + if *in == nil { + *out = nil + } else { + *out = new(int32) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClientIPConfig. +func (in *ClientIPConfig) DeepCopy() *ClientIPConfig { + if in == nil { + return nil + } + out := new(ClientIPConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ComponentCondition) DeepCopyInto(out *ComponentCondition) { *out = *in @@ -5677,6 +5710,15 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.SessionAffinityConfig != nil { + in, out := &in.SessionAffinityConfig, &out.SessionAffinityConfig + if *in == nil { + *out = nil + } else { + *out = new(SessionAffinityConfig) + (*in).DeepCopyInto(*out) + } + } return } @@ -5707,6 +5749,31 @@ func (in *ServiceStatus) DeepCopy() *ServiceStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SessionAffinityConfig) DeepCopyInto(out *SessionAffinityConfig) { + *out = *in + if in.ClientIP != nil { + in, out := &in.ClientIP, &out.ClientIP + if *in == nil { + *out = nil + } else { + *out = new(ClientIPConfig) + (*in).DeepCopyInto(*out) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SessionAffinityConfig. +func (in *SessionAffinityConfig) DeepCopy() *SessionAffinityConfig { + if in == nil { + return nil + } + out := new(SessionAffinityConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StorageOSPersistentVolumeSource) DeepCopyInto(out *StorageOSPersistentVolumeSource) { *out = *in From 8e63473d9e9b2744b1798c08a19f82cdb1a2a17b Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 23 Aug 2017 20:55:31 +0200 Subject: [PATCH 309/403] admission api: cut off api from k8s.io/apiserver This caused an import cycle: api -> apiserver -> api Fixes https://github.com/kubernetes/kubernetes/issues/51212 --- pkg/apis/admission/BUILD | 1 - pkg/apis/admission/types.go | 14 +- pkg/apis/admission/v1alpha1/helpers.go | 2 +- .../v1alpha1/zz_generated.conversion.go | 5 +- staging/src/k8s.io/api/Godeps/Godeps.json | 12 - .../src/k8s.io/api/admission/v1alpha1/BUILD | 1 - .../api/admission/v1alpha1/generated.pb.go | 89 +++--- .../api/admission/v1alpha1/types.generated.go | 298 +++++++++--------- .../k8s.io/api/admission/v1alpha1/types.go | 14 +- 9 files changed, 219 insertions(+), 217 deletions(-) diff --git a/pkg/apis/admission/BUILD b/pkg/apis/admission/BUILD index ea672dbcacc6f..2756df077cdaf 100644 --- a/pkg/apis/admission/BUILD +++ b/pkg/apis/admission/BUILD @@ -19,7 +19,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", ], ) diff --git a/pkg/apis/admission/types.go b/pkg/apis/admission/types.go index 86efca6d7f53e..a816fa8d3faa4 100644 --- a/pkg/apis/admission/types.go +++ b/pkg/apis/admission/types.go @@ -19,7 +19,6 @@ package admission import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apiserver/pkg/admission" "k8s.io/kubernetes/pkg/apis/authentication" ) @@ -51,7 +50,7 @@ type AdmissionReviewSpec struct { // OldObject is the existing object. Only populated for UPDATE requests. OldObject runtime.Object // Operation is the operation being performed - Operation admission.Operation + Operation Operation // Resource is the name of the resource being requested. This is not the kind. For example: pods Resource metav1.GroupVersionResource // SubResource is the name of the subresource being requested. This is a different resource, scoped to the parent @@ -73,3 +72,14 @@ type AdmissionReviewStatus struct { // +optional Result *metav1.Status } + +// Operation is the type of resource operation being checked for admission control +type Operation string + +// Operation constants +const ( + Create Operation = "CREATE" + Update Operation = "UPDATE" + Delete Operation = "DELETE" + Connect Operation = "CONNECT" +) diff --git a/pkg/apis/admission/v1alpha1/helpers.go b/pkg/apis/admission/v1alpha1/helpers.go index c7a3960b6555c..ad1e543744cd3 100644 --- a/pkg/apis/admission/v1alpha1/helpers.go +++ b/pkg/apis/admission/v1alpha1/helpers.go @@ -51,7 +51,7 @@ func NewAdmissionReview(attr admission.Attributes) admissionv1alpha1.AdmissionRe Version: gvr.Version, }, SubResource: attr.GetSubresource(), - Operation: attr.GetOperation(), + Operation: admissionv1alpha1.Operation(attr.GetOperation()), Object: runtime.RawExtension{ Object: attr.GetObject(), }, diff --git a/pkg/apis/admission/v1alpha1/zz_generated.conversion.go b/pkg/apis/admission/v1alpha1/zz_generated.conversion.go index e30473017571f..c96eb913882c8 100644 --- a/pkg/apis/admission/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/admission/v1alpha1/zz_generated.conversion.go @@ -25,7 +25,6 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" - pkg_admission "k8s.io/apiserver/pkg/admission" admission "k8s.io/kubernetes/pkg/apis/admission" unsafe "unsafe" ) @@ -85,7 +84,7 @@ func autoConvert_v1alpha1_AdmissionReviewSpec_To_admission_AdmissionReviewSpec(i if err := runtime.Convert_runtime_RawExtension_To_runtime_Object(&in.OldObject, &out.OldObject, s); err != nil { return err } - out.Operation = pkg_admission.Operation(in.Operation) + out.Operation = admission.Operation(in.Operation) out.Name = in.Name out.Namespace = in.Namespace out.Resource = in.Resource @@ -112,7 +111,7 @@ func autoConvert_admission_AdmissionReviewSpec_To_v1alpha1_AdmissionReviewSpec(i if err := runtime.Convert_runtime_Object_To_runtime_RawExtension(&in.OldObject, &out.OldObject, s); err != nil { return err } - out.Operation = pkg_admission.Operation(in.Operation) + out.Operation = v1alpha1.Operation(in.Operation) out.Resource = in.Resource out.SubResource = in.SubResource // TODO: Inefficient conversion - can we improve it? diff --git a/staging/src/k8s.io/api/Godeps/Godeps.json b/staging/src/k8s.io/api/Godeps/Godeps.json index babb6ba48c061..b4ec17ea4fb74 100644 --- a/staging/src/k8s.io/api/Godeps/Godeps.json +++ b/staging/src/k8s.io/api/Godeps/Godeps.json @@ -14,10 +14,6 @@ "ImportPath": "github.com/PuerkitoBio/urlesc", "Rev": "5bd2802263f21d8788851d5305584c82a5c75d7e" }, - { - "ImportPath": "github.com/davecgh/go-spew/spew", - "Rev": "782f4967f2dc4564575ca782fe2d04090b5faca8" - }, { "ImportPath": "github.com/emicklei/go-restful", "Rev": "ff4f55a206334ef123e4f79bbf348980da81ca46" @@ -26,10 +22,6 @@ "ImportPath": "github.com/emicklei/go-restful/log", "Rev": "ff4f55a206334ef123e4f79bbf348980da81ca46" }, - { - "ImportPath": "github.com/ghodss/yaml", - "Rev": "73d445a93680fa1a78ae23a5839bad48f32ba1ee" - }, { "ImportPath": "github.com/go-openapi/jsonpointer", "Rev": "46af16f9f7b149af66e5d1bd010e3574dc06de98" @@ -145,10 +137,6 @@ { "ImportPath": "gopkg.in/inf.v0", "Rev": "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" - }, - { - "ImportPath": "gopkg.in/yaml.v2", - "Rev": "53feefa2559fb8dfa8d81baad31be332c97d6c77" } ] } diff --git a/staging/src/k8s.io/api/admission/v1alpha1/BUILD b/staging/src/k8s.io/api/admission/v1alpha1/BUILD index 389b56c3a9dbb..714b425a4a1e3 100644 --- a/staging/src/k8s.io/api/admission/v1alpha1/BUILD +++ b/staging/src/k8s.io/api/admission/v1alpha1/BUILD @@ -25,7 +25,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", ], ) diff --git a/staging/src/k8s.io/api/admission/v1alpha1/generated.pb.go b/staging/src/k8s.io/api/admission/v1alpha1/generated.pb.go index 9d3ea2eb58313..03fa1f6be8d1a 100644 --- a/staging/src/k8s.io/api/admission/v1alpha1/generated.pb.go +++ b/staging/src/k8s.io/api/admission/v1alpha1/generated.pb.go @@ -37,8 +37,6 @@ import math "math" import k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" -import k8s_io_apiserver_pkg_admission "k8s.io/apiserver/pkg/admission" - import strings "strings" import reflect "reflect" @@ -605,7 +603,7 @@ func (m *AdmissionReviewSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Operation = k8s_io_apiserver_pkg_admission.Operation(dAtA[iNdEx:postIndex]) + m.Operation = Operation(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: if wireType != 2 { @@ -988,47 +986,46 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 663 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xcf, 0x4b, 0x1c, 0x49, - 0x14, 0xc7, 0xa7, 0x77, 0xc7, 0x71, 0xa6, 0x5c, 0xd6, 0xdd, 0x92, 0x85, 0x46, 0xd8, 0x56, 0x3c, - 0x2c, 0x2e, 0x68, 0x35, 0x1a, 0x23, 0x21, 0x90, 0x83, 0x03, 0x49, 0x08, 0x01, 0x0d, 0xa5, 0x86, - 0x90, 0x84, 0x40, 0x4d, 0xcf, 0x73, 0xa6, 0x32, 0xd3, 0x55, 0x4d, 0x55, 0xf5, 0x98, 0xdc, 0xf2, - 0x27, 0xe4, 0x90, 0x7f, 0x29, 0xe0, 0x25, 0xe0, 0xd1, 0x93, 0xc4, 0xc9, 0x7f, 0x91, 0x53, 0xe8, - 0xea, 0xea, 0x6e, 0x1d, 0x35, 0x89, 0x39, 0xcd, 0xbc, 0x1f, 0xdf, 0x4f, 0xbd, 0x7a, 0xf5, 0x5e, - 0xa3, 0x07, 0x83, 0x3b, 0x9a, 0x70, 0x19, 0x0e, 0xd2, 0x0e, 0x28, 0x01, 0x06, 0x74, 0x38, 0x02, - 0xd1, 0x95, 0x2a, 0x74, 0x01, 0x96, 0xf0, 0x90, 0x75, 0x63, 0xae, 0x35, 0x97, 0x22, 0x1c, 0xad, - 0xb1, 0x61, 0xd2, 0x67, 0x6b, 0x61, 0x0f, 0x04, 0x28, 0x66, 0xa0, 0x4b, 0x12, 0x25, 0x8d, 0xc4, - 0xff, 0xe6, 0xe9, 0x84, 0x25, 0x9c, 0x94, 0xe9, 0xa4, 0x48, 0x9f, 0x5f, 0xed, 0x71, 0xd3, 0x4f, - 0x3b, 0x24, 0x92, 0x71, 0xd8, 0x93, 0x3d, 0x19, 0x5a, 0x55, 0x27, 0x3d, 0xb0, 0x96, 0x35, 0xec, - 0xbf, 0x9c, 0x36, 0xbf, 0x72, 0xfe, 0xf0, 0xd4, 0xf4, 0x41, 0x18, 0x1e, 0x31, 0x93, 0x57, 0x30, - 0x79, 0xf6, 0xfc, 0x46, 0x95, 0x1d, 0xb3, 0xa8, 0xcf, 0x05, 0xa8, 0xb7, 0x61, 0x32, 0xe8, 0x65, - 0x0e, 0x1d, 0xc6, 0x60, 0xd8, 0x55, 0xaa, 0xf0, 0x3a, 0x95, 0x4a, 0x85, 0xe1, 0x31, 0x5c, 0x12, - 0x6c, 0xfe, 0x48, 0xa0, 0xa3, 0x3e, 0xc4, 0xec, 0x92, 0xee, 0xd6, 0x75, 0xba, 0xd4, 0xf0, 0x61, - 0xc8, 0x85, 0xd1, 0x46, 0x4d, 0x8a, 0x96, 0x3e, 0x7a, 0x68, 0x76, 0xab, 0xe8, 0x23, 0x85, 0x11, - 0x87, 0x43, 0xbc, 0x87, 0xea, 0x3a, 0x81, 0xc8, 0xf7, 0x16, 0xbd, 0xe5, 0x99, 0xf5, 0x75, 0xf2, - 0xdd, 0x96, 0x93, 0x09, 0xf5, 0x6e, 0x02, 0x51, 0xfb, 0x8f, 0xa3, 0xd3, 0x85, 0xda, 0xf8, 0x74, - 0xa1, 0x9e, 0x59, 0xd4, 0xd2, 0xf0, 0x4b, 0xd4, 0xd0, 0x86, 0x99, 0x54, 0xfb, 0xbf, 0x59, 0xee, - 0xc6, 0x0d, 0xb9, 0x56, 0xdb, 0xfe, 0xd3, 0x91, 0x1b, 0xb9, 0x4d, 0x1d, 0x73, 0xe9, 0xd3, 0x14, - 0x9a, 0xbb, 0xa2, 0x12, 0xfc, 0x0c, 0xd5, 0x07, 0x5c, 0x74, 0xdd, 0x5d, 0x36, 0xcf, 0x9d, 0x59, - 0xf6, 0x88, 0x24, 0x83, 0x5e, 0xe6, 0xd0, 0x24, 0x7b, 0x42, 0x32, 0x5a, 0x23, 0x0f, 0x95, 0x4c, - 0x93, 0xa7, 0xa0, 0x32, 0xd6, 0x63, 0x2e, 0xba, 0xd5, 0x7d, 0x32, 0x8b, 0x5a, 0x22, 0xde, 0x47, - 0x0d, 0xd9, 0x79, 0x0d, 0x91, 0x71, 0xf7, 0x59, 0xbd, 0x96, 0xed, 0xde, 0x8d, 0x50, 0x76, 0x78, - 0xff, 0x8d, 0x01, 0x91, 0x61, 0xab, 0x8b, 0xec, 0x58, 0x08, 0x75, 0x30, 0xfc, 0x0a, 0xb5, 0xe4, - 0xb0, 0x9b, 0x3b, 0xfd, 0xdf, 0x7f, 0x85, 0xfc, 0xb7, 0x23, 0xb7, 0x76, 0x0a, 0x0e, 0xad, 0x90, - 0xf8, 0x05, 0x6a, 0xc9, 0x24, 0x1b, 0x01, 0x2e, 0x85, 0x5f, 0x5f, 0xf4, 0x96, 0x5b, 0xed, 0x7b, - 0xa5, 0xa0, 0x08, 0x7c, 0x3d, 0x5d, 0x58, 0xae, 0xa6, 0x49, 0x83, 0x1a, 0x81, 0xca, 0x27, 0xbd, - 0x7c, 0xa7, 0x32, 0x97, 0x56, 0x3c, 0xbc, 0x88, 0xea, 0x82, 0xc5, 0xe0, 0x4f, 0x59, 0x6e, 0xd9, - 0xb5, 0x6d, 0x16, 0x03, 0xb5, 0x11, 0x1c, 0xa2, 0x56, 0xf6, 0xab, 0x13, 0x16, 0x81, 0xdf, 0xb0, - 0x69, 0x65, 0xbd, 0xdb, 0x45, 0x80, 0x56, 0x39, 0xb8, 0x8f, 0x9a, 0x0a, 0xb4, 0x4c, 0x55, 0x04, - 0xfe, 0xb4, 0x6d, 0xc7, 0xdd, 0x9b, 0x3f, 0x22, 0x75, 0x84, 0xf6, 0x5f, 0xee, 0xac, 0x66, 0xe1, - 0xa1, 0x25, 0x1d, 0xdf, 0x46, 0x33, 0x3a, 0xed, 0x14, 0x01, 0xbf, 0x69, 0x8b, 0x9b, 0x73, 0x82, - 0x99, 0xdd, 0x2a, 0x44, 0xcf, 0xe7, 0xe1, 0x3d, 0xd4, 0x4c, 0x35, 0xa8, 0x47, 0xe2, 0x40, 0xfa, - 0x2d, 0x5b, 0xe0, 0x7f, 0x17, 0x26, 0xfb, 0xc2, 0x67, 0x25, 0x2b, 0x6c, 0xdf, 0x65, 0x57, 0xc5, - 0x14, 0x1e, 0x5a, 0x92, 0x96, 0x3e, 0x78, 0xe8, 0x9f, 0x2b, 0x37, 0x00, 0xff, 0x8f, 0xa6, 0xd9, - 0x70, 0x28, 0x0f, 0x21, 0x1f, 0xea, 0x66, 0x7b, 0xd6, 0x61, 0xa6, 0xb7, 0x72, 0x37, 0x2d, 0xe2, - 0xf8, 0xc9, 0xc4, 0xca, 0xad, 0xfc, 0x5c, 0xe7, 0xdc, 0xaa, 0xa1, 0x6c, 0x3a, 0x29, 0xe8, 0x74, - 0x68, 0x8a, 0x35, 0x6b, 0x93, 0xa3, 0xb3, 0xa0, 0x76, 0x7c, 0x16, 0xd4, 0x4e, 0xce, 0x82, 0xda, - 0xbb, 0x71, 0xe0, 0x1d, 0x8d, 0x03, 0xef, 0x78, 0x1c, 0x78, 0x27, 0xe3, 0xc0, 0xfb, 0x3c, 0x0e, - 0xbc, 0xf7, 0x5f, 0x82, 0xda, 0xf3, 0x66, 0xb1, 0xc4, 0xdf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x42, - 0x53, 0xac, 0x65, 0xf7, 0x05, 0x00, 0x00, + // 645 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xcf, 0x4f, 0x13, 0x41, + 0x14, 0xc7, 0xbb, 0x5a, 0x4a, 0x3b, 0x18, 0xd1, 0x21, 0x26, 0x1b, 0x12, 0x17, 0xc2, 0xc1, 0x60, + 0x02, 0xb3, 0x01, 0x91, 0x18, 0xe3, 0x85, 0x26, 0x6a, 0x8c, 0x09, 0x98, 0x01, 0x8c, 0x31, 0xc6, + 0x64, 0xba, 0x7d, 0xb4, 0x63, 0xbb, 0x33, 0x9b, 0x9d, 0xd9, 0xa2, 0x37, 0xff, 0x04, 0x0f, 0xfe, + 0x1d, 0xfe, 0x17, 0x26, 0x1c, 0x39, 0x72, 0x22, 0x52, 0xff, 0x0b, 0x4f, 0x66, 0x67, 0x67, 0x77, + 0x4b, 0xa1, 0x2a, 0x9e, 0xda, 0xf7, 0xe3, 0xfb, 0x99, 0xf7, 0xde, 0xbc, 0x59, 0xf4, 0xac, 0xf7, + 0x48, 0x11, 0x2e, 0xfd, 0x5e, 0xd2, 0x82, 0x58, 0x80, 0x06, 0xe5, 0x0f, 0x40, 0xb4, 0x65, 0xec, + 0xdb, 0x00, 0x8b, 0xb8, 0xcf, 0xda, 0x21, 0x57, 0x8a, 0x4b, 0xe1, 0x0f, 0xd6, 0x58, 0x3f, 0xea, + 0xb2, 0x35, 0xbf, 0x03, 0x02, 0x62, 0xa6, 0xa1, 0x4d, 0xa2, 0x58, 0x6a, 0x89, 0xef, 0x66, 0xe9, + 0x84, 0x45, 0x9c, 0x14, 0xe9, 0x24, 0x4f, 0x9f, 0x5f, 0xed, 0x70, 0xdd, 0x4d, 0x5a, 0x24, 0x90, + 0xa1, 0xdf, 0x91, 0x1d, 0xe9, 0x1b, 0x55, 0x2b, 0x39, 0x30, 0x96, 0x31, 0xcc, 0xbf, 0x8c, 0x36, + 0xbf, 0x32, 0x7a, 0x78, 0xa2, 0xbb, 0x20, 0x34, 0x0f, 0x98, 0xce, 0x2a, 0x18, 0x3f, 0x7b, 0x7e, + 0xa3, 0xcc, 0x0e, 0x59, 0xd0, 0xe5, 0x02, 0xe2, 0x4f, 0x7e, 0xd4, 0xeb, 0xa4, 0x0e, 0xe5, 0x87, + 0xa0, 0xd9, 0x65, 0x2a, 0x7f, 0x92, 0x2a, 0x4e, 0x84, 0xe6, 0x21, 0x5c, 0x10, 0x6c, 0xfe, 0x4d, + 0xa0, 0x82, 0x2e, 0x84, 0xec, 0x82, 0xee, 0xc1, 0x24, 0x5d, 0xa2, 0x79, 0xdf, 0xe7, 0x42, 0x2b, + 0x1d, 0x8f, 0x8b, 0x96, 0xbe, 0x3b, 0x68, 0x76, 0x2b, 0x9f, 0x23, 0x85, 0x01, 0x87, 0x43, 0xbc, + 0x87, 0xaa, 0x2a, 0x82, 0xc0, 0x75, 0x16, 0x9d, 0xe5, 0x99, 0xf5, 0x75, 0xf2, 0xc7, 0x91, 0x93, + 0x31, 0xf5, 0x6e, 0x04, 0x41, 0xf3, 0xc6, 0xd1, 0xe9, 0x42, 0x65, 0x78, 0xba, 0x50, 0x4d, 0x2d, + 0x6a, 0x68, 0xf8, 0x1d, 0xaa, 0x29, 0xcd, 0x74, 0xa2, 0xdc, 0x6b, 0x86, 0xbb, 0x71, 0x45, 0xae, + 0xd1, 0x36, 0x6f, 0x5a, 0x72, 0x2d, 0xb3, 0xa9, 0x65, 0x2e, 0x7d, 0x9b, 0x42, 0x73, 0x97, 0x54, + 0x82, 0xdf, 0xa0, 0x6a, 0x8f, 0x8b, 0xb6, 0xed, 0x65, 0x73, 0xe4, 0xcc, 0x62, 0x46, 0x24, 0xea, + 0x75, 0x52, 0x87, 0x22, 0xe9, 0x15, 0x92, 0xc1, 0x1a, 0x79, 0x1e, 0xcb, 0x24, 0x7a, 0x0d, 0x71, + 0xca, 0x7a, 0xc9, 0x45, 0xbb, 0xec, 0x27, 0xb5, 0xa8, 0x21, 0xe2, 0x7d, 0x54, 0x93, 0xad, 0x0f, + 0x10, 0x68, 0xdb, 0xcf, 0xea, 0x44, 0xb6, 0xbd, 0x37, 0x42, 0xd9, 0xe1, 0xd3, 0x8f, 0x1a, 0x44, + 0x8a, 0x2d, 0x1b, 0xd9, 0x31, 0x10, 0x6a, 0x61, 0xf8, 0x3d, 0x6a, 0xc8, 0x7e, 0x3b, 0x73, 0xba, + 0xd7, 0xff, 0x87, 0x7c, 0xdb, 0x92, 0x1b, 0x3b, 0x39, 0x87, 0x96, 0x48, 0xfc, 0x04, 0x35, 0x64, + 0x94, 0xae, 0x00, 0x97, 0xc2, 0xad, 0x2e, 0x3a, 0xcb, 0x8d, 0xa6, 0x57, 0x08, 0xf2, 0xc0, 0xaf, + 0x51, 0x83, 0x96, 0x02, 0xbc, 0x88, 0xaa, 0x82, 0x85, 0xe0, 0x4e, 0x19, 0x61, 0x31, 0x96, 0x6d, + 0x16, 0x02, 0x35, 0x11, 0xec, 0xa3, 0x46, 0xfa, 0xab, 0x22, 0x16, 0x80, 0x5b, 0x33, 0x69, 0x45, + 0x41, 0xdb, 0x79, 0x80, 0x96, 0x39, 0xb8, 0x8b, 0xea, 0x31, 0x28, 0x99, 0xc4, 0x01, 0xb8, 0xd3, + 0xa6, 0xdf, 0xc7, 0x57, 0xbf, 0x25, 0x6a, 0x09, 0xcd, 0x5b, 0xf6, 0xac, 0x7a, 0xee, 0xa1, 0x05, + 0x1d, 0x3f, 0x44, 0x33, 0x2a, 0x69, 0xe5, 0x01, 0xb7, 0x6e, 0x8a, 0x9b, 0xb3, 0x82, 0x99, 0xdd, + 0x32, 0x44, 0x47, 0xf3, 0xf0, 0x1e, 0xaa, 0x27, 0x0a, 0xe2, 0x17, 0xe2, 0x40, 0xba, 0x0d, 0x53, + 0xe0, 0xbd, 0x73, 0xab, 0x7b, 0xee, 0xbb, 0x91, 0x16, 0xb6, 0x6f, 0xb3, 0xcb, 0x62, 0x72, 0x0f, + 0x2d, 0x48, 0x4b, 0x5f, 0x1d, 0x74, 0xe7, 0xd2, 0x15, 0xc7, 0xf7, 0xd1, 0x34, 0xeb, 0xf7, 0xe5, + 0x21, 0x64, 0x5b, 0x5b, 0x6f, 0xce, 0x5a, 0xcc, 0xf4, 0x56, 0xe6, 0xa6, 0x79, 0x1c, 0xbf, 0x1a, + 0x7b, 0x53, 0x2b, 0xff, 0x36, 0x39, 0xfb, 0x96, 0x50, 0xba, 0x7e, 0x14, 0x54, 0xd2, 0xd7, 0xf9, + 0x3b, 0x6a, 0x92, 0xa3, 0x33, 0xaf, 0x72, 0x7c, 0xe6, 0x55, 0x4e, 0xce, 0xbc, 0xca, 0xe7, 0xa1, + 0xe7, 0x1c, 0x0d, 0x3d, 0xe7, 0x78, 0xe8, 0x39, 0x27, 0x43, 0xcf, 0xf9, 0x31, 0xf4, 0x9c, 0x2f, + 0x3f, 0xbd, 0xca, 0xdb, 0x7a, 0xfe, 0x4a, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0xa0, 0x57, 0xa7, + 0x50, 0xd8, 0x05, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/admission/v1alpha1/types.generated.go b/staging/src/k8s.io/api/admission/v1alpha1/types.generated.go index 6ca9a63bc4249..ee49a96c39f54 100644 --- a/staging/src/k8s.io/api/admission/v1alpha1/types.generated.go +++ b/staging/src/k8s.io/api/admission/v1alpha1/types.generated.go @@ -25,11 +25,10 @@ import ( "errors" "fmt" codec1978 "github.com/ugorji/go/codec" - pkg4_v1 "k8s.io/api/authentication/v1" + pkg3_v1 "k8s.io/api/authentication/v1" pkg1_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" pkg2_runtime "k8s.io/apimachinery/pkg/runtime" - pkg5_types "k8s.io/apimachinery/pkg/types" - pkg3_admission "k8s.io/apiserver/pkg/admission" + pkg4_types "k8s.io/apimachinery/pkg/types" "reflect" "runtime" ) @@ -64,12 +63,11 @@ func init() { panic(err) } if false { // reference the types, but skip this branch at build/run time - var v0 pkg4_v1.UserInfo + var v0 pkg3_v1.UserInfo var v1 pkg1_v1.TypeMeta var v2 pkg2_runtime.RawExtension - var v3 pkg5_types.UID - var v4 pkg3_admission.Operation - _, _, _, _, _ = v0, v1, v2, v3, v4 + var v3 pkg4_types.UID + _, _, _, _ = v0, v1, v2, v3 } } @@ -535,13 +533,7 @@ func (x *AdmissionReviewSpec) CodecEncodeSelf(e *codec1978.Encoder) { if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) if yyq2[3] { - yym19 := z.EncBinary() - _ = yym19 - if false { - } else if z.HasExtensions() && z.EncExt(x.Operation) { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.Operation)) - } + x.Operation.CodecEncodeSelf(e) } else { r.EncodeString(codecSelferC_UTF81234, "") } @@ -550,13 +542,7 @@ func (x *AdmissionReviewSpec) CodecEncodeSelf(e *codec1978.Encoder) { z.EncSendContainerState(codecSelfer_containerMapKey1234) r.EncodeString(codecSelferC_UTF81234, string("operation")) z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym20 := z.EncBinary() - _ = yym20 - if false { - } else if z.HasExtensions() && z.EncExt(x.Operation) { - } else { - r.EncodeString(codecSelferC_UTF81234, string(x.Operation)) - } + x.Operation.CodecEncodeSelf(e) } } if yyr2 || yy2arr2 { @@ -789,69 +775,63 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromMap(l int, d *codec1978.Decoder x.Operation = "" } else { yyv10 := &x.Operation - yym11 := z.DecBinary() - _ = yym11 - if false { - } else if z.HasExtensions() && z.DecExt(yyv10) { - } else { - *((*string)(yyv10)) = r.DecodeString() - } + yyv10.CodecDecodeSelf(d) } case "name": if r.TryDecodeAsNil() { x.Name = "" } else { - yyv12 := &x.Name - yym13 := z.DecBinary() - _ = yym13 + yyv11 := &x.Name + yym12 := z.DecBinary() + _ = yym12 if false { } else { - *((*string)(yyv12)) = r.DecodeString() + *((*string)(yyv11)) = r.DecodeString() } } case "namespace": if r.TryDecodeAsNil() { x.Namespace = "" } else { - yyv14 := &x.Namespace - yym15 := z.DecBinary() - _ = yym15 + yyv13 := &x.Namespace + yym14 := z.DecBinary() + _ = yym14 if false { } else { - *((*string)(yyv14)) = r.DecodeString() + *((*string)(yyv13)) = r.DecodeString() } } case "resource": if r.TryDecodeAsNil() { x.Resource = pkg1_v1.GroupVersionResource{} } else { - yyv16 := &x.Resource - yym17 := z.DecBinary() - _ = yym17 + yyv15 := &x.Resource + yym16 := z.DecBinary() + _ = yym16 if false { - } else if z.HasExtensions() && z.DecExt(yyv16) { + } else if z.HasExtensions() && z.DecExt(yyv15) { } else { - z.DecFallback(yyv16, false) + z.DecFallback(yyv15, false) } } case "subResource": if r.TryDecodeAsNil() { x.SubResource = "" } else { - yyv18 := &x.SubResource - yym19 := z.DecBinary() - _ = yym19 + yyv17 := &x.SubResource + yym18 := z.DecBinary() + _ = yym18 if false { } else { - *((*string)(yyv18)) = r.DecodeString() + *((*string)(yyv17)) = r.DecodeString() } } case "userInfo": if r.TryDecodeAsNil() { - x.UserInfo = pkg4_v1.UserInfo{} + x.UserInfo = pkg3_v1.UserInfo{} } else { - yyv20 := &x.UserInfo - yyv20.CodecDecodeSelf(d) + yyv19 := &x.UserInfo + yyv19.CodecDecodeSelf(d) } default: z.DecStructFieldNotFound(-1, yys3) @@ -864,16 +844,16 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decod var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj21 int - var yyb21 bool - var yyhl21 bool = l >= 0 - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + var yyj20 int + var yyb20 bool + var yyhl20 bool = l >= 0 + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -881,22 +861,22 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decod if r.TryDecodeAsNil() { x.Kind = pkg1_v1.GroupVersionKind{} } else { - yyv22 := &x.Kind - yym23 := z.DecBinary() - _ = yym23 + yyv21 := &x.Kind + yym22 := z.DecBinary() + _ = yym22 if false { - } else if z.HasExtensions() && z.DecExt(yyv22) { + } else if z.HasExtensions() && z.DecExt(yyv21) { } else { - z.DecFallback(yyv22, false) + z.DecFallback(yyv21, false) } } - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -904,24 +884,24 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decod if r.TryDecodeAsNil() { x.Object = pkg2_runtime.RawExtension{} } else { - yyv24 := &x.Object - yym25 := z.DecBinary() - _ = yym25 + yyv23 := &x.Object + yym24 := z.DecBinary() + _ = yym24 if false { - } else if z.HasExtensions() && z.DecExt(yyv24) { - } else if !yym25 && z.IsJSONHandle() { - z.DecJSONUnmarshal(yyv24) + } else if z.HasExtensions() && z.DecExt(yyv23) { + } else if !yym24 && z.IsJSONHandle() { + z.DecJSONUnmarshal(yyv23) } else { - z.DecFallback(yyv24, false) + z.DecFallback(yyv23, false) } } - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -929,24 +909,24 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decod if r.TryDecodeAsNil() { x.OldObject = pkg2_runtime.RawExtension{} } else { - yyv26 := &x.OldObject - yym27 := z.DecBinary() - _ = yym27 + yyv25 := &x.OldObject + yym26 := z.DecBinary() + _ = yym26 if false { - } else if z.HasExtensions() && z.DecExt(yyv26) { - } else if !yym27 && z.IsJSONHandle() { - z.DecJSONUnmarshal(yyv26) + } else if z.HasExtensions() && z.DecExt(yyv25) { + } else if !yym26 && z.IsJSONHandle() { + z.DecJSONUnmarshal(yyv25) } else { - z.DecFallback(yyv26, false) + z.DecFallback(yyv25, false) } } - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -954,22 +934,16 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decod if r.TryDecodeAsNil() { x.Operation = "" } else { - yyv28 := &x.Operation - yym29 := z.DecBinary() - _ = yym29 - if false { - } else if z.HasExtensions() && z.DecExt(yyv28) { - } else { - *((*string)(yyv28)) = r.DecodeString() - } + yyv27 := &x.Operation + yyv27.CodecDecodeSelf(d) } - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -977,21 +951,21 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decod if r.TryDecodeAsNil() { x.Name = "" } else { - yyv30 := &x.Name - yym31 := z.DecBinary() - _ = yym31 + yyv28 := &x.Name + yym29 := z.DecBinary() + _ = yym29 if false { } else { - *((*string)(yyv30)) = r.DecodeString() + *((*string)(yyv28)) = r.DecodeString() } } - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -999,21 +973,21 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decod if r.TryDecodeAsNil() { x.Namespace = "" } else { - yyv32 := &x.Namespace - yym33 := z.DecBinary() - _ = yym33 + yyv30 := &x.Namespace + yym31 := z.DecBinary() + _ = yym31 if false { } else { - *((*string)(yyv32)) = r.DecodeString() + *((*string)(yyv30)) = r.DecodeString() } } - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -1021,22 +995,22 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decod if r.TryDecodeAsNil() { x.Resource = pkg1_v1.GroupVersionResource{} } else { - yyv34 := &x.Resource - yym35 := z.DecBinary() - _ = yym35 + yyv32 := &x.Resource + yym33 := z.DecBinary() + _ = yym33 if false { - } else if z.HasExtensions() && z.DecExt(yyv34) { + } else if z.HasExtensions() && z.DecExt(yyv32) { } else { - z.DecFallback(yyv34, false) + z.DecFallback(yyv32, false) } } - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -1044,43 +1018,43 @@ func (x *AdmissionReviewSpec) codecDecodeSelfFromArray(l int, d *codec1978.Decod if r.TryDecodeAsNil() { x.SubResource = "" } else { - yyv36 := &x.SubResource - yym37 := z.DecBinary() - _ = yym37 + yyv34 := &x.SubResource + yym35 := z.DecBinary() + _ = yym35 if false { } else { - *((*string)(yyv36)) = r.DecodeString() + *((*string)(yyv34)) = r.DecodeString() } } - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.UserInfo = pkg4_v1.UserInfo{} + x.UserInfo = pkg3_v1.UserInfo{} } else { - yyv38 := &x.UserInfo - yyv38.CodecDecodeSelf(d) + yyv36 := &x.UserInfo + yyv36.CodecDecodeSelf(d) } for { - yyj21++ - if yyhl21 { - yyb21 = yyj21 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb21 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb21 { + if yyb20 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj21-1, "") + z.DecStructFieldNotFound(yyj20-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -1338,3 +1312,29 @@ func (x *AdmissionReviewStatus) codecDecodeSelfFromArray(l int, d *codec1978.Dec } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } + +func (x Operation) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x)) + } +} + +func (x *Operation) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + *((*string)(x)) = r.DecodeString() + } +} diff --git a/staging/src/k8s.io/api/admission/v1alpha1/types.go b/staging/src/k8s.io/api/admission/v1alpha1/types.go index c727f05292b79..5defadca6bdb6 100644 --- a/staging/src/k8s.io/api/admission/v1alpha1/types.go +++ b/staging/src/k8s.io/api/admission/v1alpha1/types.go @@ -20,7 +20,6 @@ import ( authenticationv1 "k8s.io/api/authentication/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apiserver/pkg/admission" ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -48,7 +47,7 @@ type AdmissionReviewSpec struct { // +optional OldObject runtime.RawExtension `json:"oldObject,omitempty" protobuf:"bytes,3,opt,name=oldObject"` // Operation is the operation being performed - Operation admission.Operation `json:"operation,omitempty" protobuf:"bytes,4,opt,name=operation"` + Operation Operation `json:"operation,omitempty" protobuf:"bytes,4,opt,name=operation"` // Name is the name of the object as presented in the request. On a CREATE operation, the client may omit name and // rely on the server to generate the name. If that is the case, this method will return the empty string. // +optional @@ -78,3 +77,14 @@ type AdmissionReviewStatus struct { // +optional Result *metav1.Status `json:"status,omitempty" protobuf:"bytes,2,opt,name=status"` } + +// Operation is the type of resource operation being checked for admission control +type Operation string + +// Operation constants +const ( + Create Operation = "CREATE" + Update Operation = "UPDATE" + Delete Operation = "DELETE" + Connect Operation = "CONNECT" +) From a145cf81b095f91914140706bb6bf8cb1b004be8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Fri, 25 Aug 2017 13:59:33 +0300 Subject: [PATCH 310/403] kubeadm: Resolve tech debt; move commonly used funcs to a general package instead of duplicating --- cmd/kubeadm/app/BUILD | 1 + cmd/kubeadm/app/cmd/BUILD | 4 ++ cmd/kubeadm/app/cmd/cmd.go | 18 +----- cmd/kubeadm/app/cmd/config.go | 5 +- cmd/kubeadm/app/cmd/phases/BUILD | 2 +- cmd/kubeadm/app/cmd/phases/bootstraptoken.go | 7 ++- cmd/kubeadm/app/cmd/phases/certs.go | 3 +- cmd/kubeadm/app/cmd/phases/controlplane.go | 3 +- cmd/kubeadm/app/cmd/phases/etcd.go | 3 +- cmd/kubeadm/app/cmd/phases/kubeconfig.go | 3 +- cmd/kubeadm/app/cmd/phases/markmaster.go | 3 +- cmd/kubeadm/app/cmd/phases/phase.go | 38 +------------ cmd/kubeadm/app/cmd/phases/preflight.go | 3 +- cmd/kubeadm/app/cmd/phases/selfhosting.go | 3 +- cmd/kubeadm/app/cmd/token.go | 3 +- cmd/kubeadm/app/cmd/util/BUILD | 28 +++++++++ cmd/kubeadm/app/cmd/util/cmdutil.go | 57 +++++++++++++++++++ .../phase_test.go => util/cmdutil_test.go} | 4 +- 18 files changed, 120 insertions(+), 68 deletions(-) create mode 100644 cmd/kubeadm/app/cmd/util/BUILD create mode 100644 cmd/kubeadm/app/cmd/util/cmdutil.go rename cmd/kubeadm/app/cmd/{phases/phase_test.go => util/cmdutil_test.go} (92%) diff --git a/cmd/kubeadm/app/BUILD b/cmd/kubeadm/app/BUILD index 83e384e8fcd9c..c3705c11052da 100644 --- a/cmd/kubeadm/app/BUILD +++ b/cmd/kubeadm/app/BUILD @@ -46,6 +46,7 @@ filegroup( "//cmd/kubeadm/app/phases/markmaster:all-srcs", "//cmd/kubeadm/app/phases/selfhosting:all-srcs", "//cmd/kubeadm/app/phases/token:all-srcs", + "//cmd/kubeadm/app/phases/upgrade:all-srcs", "//cmd/kubeadm/app/phases/uploadconfig:all-srcs", "//cmd/kubeadm/app/preflight:all-srcs", "//cmd/kubeadm/app/util:all-srcs", diff --git a/cmd/kubeadm/app/cmd/BUILD b/cmd/kubeadm/app/cmd/BUILD index ae031e5464652..e7bf5647fc124 100644 --- a/cmd/kubeadm/app/cmd/BUILD +++ b/cmd/kubeadm/app/cmd/BUILD @@ -23,6 +23,8 @@ go_library( "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library", "//cmd/kubeadm/app/cmd/phases:go_default_library", + "//cmd/kubeadm/app/cmd/upgrade:go_default_library", + "//cmd/kubeadm/app/cmd/util:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/discovery:go_default_library", "//cmd/kubeadm/app/features:go_default_library", @@ -95,6 +97,8 @@ filegroup( srcs = [ ":package-srcs", "//cmd/kubeadm/app/cmd/phases:all-srcs", + "//cmd/kubeadm/app/cmd/upgrade:all-srcs", + "//cmd/kubeadm/app/cmd/util:all-srcs", ], tags = ["automanaged"], ) diff --git a/cmd/kubeadm/app/cmd/cmd.go b/cmd/kubeadm/app/cmd/cmd.go index 6013adfa923fc..9546f0d10426e 100644 --- a/cmd/kubeadm/app/cmd/cmd.go +++ b/cmd/kubeadm/app/cmd/cmd.go @@ -17,7 +17,6 @@ limitations under the License. package cmd import ( - "fmt" "io" "github.com/renstrom/dedent" @@ -25,6 +24,7 @@ import ( "k8s.io/apiserver/pkg/util/flag" "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/upgrade" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" ) @@ -75,6 +75,7 @@ func NewKubeadmCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob cmds.AddCommand(NewCmdReset(out)) cmds.AddCommand(NewCmdVersion(out)) cmds.AddCommand(NewCmdToken(out, err)) + cmds.AddCommand(upgrade.NewCmdUpgrade(out)) // Wrap not yet fully supported commands in an alpha subcommand experimentalCmd := &cobra.Command{ @@ -86,18 +87,3 @@ func NewKubeadmCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob return cmds } - -// subCmdRunE returns a function that handles a case where a subcommand must be specified -// Without this callback, if a user runs just the command without a subcommand, -// or with an invalid subcommand, cobra will print usage information, but still exit cleanly. -// We want to return an error code in these cases so that the -// user knows that their command was invalid. -func subCmdRunE(name string) func(*cobra.Command, []string) error { - return func(_ *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("missing subcommand; %q is not meant to be run on its own", name) - } - - return fmt.Errorf("invalid subcommand: %q", args[0]) - } -} diff --git a/cmd/kubeadm/app/cmd/config.go b/cmd/kubeadm/app/cmd/config.go index f4ff47c7cacd3..f5c792ed82152 100644 --- a/cmd/kubeadm/app/cmd/config.go +++ b/cmd/kubeadm/app/cmd/config.go @@ -26,6 +26,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/features" "k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig" @@ -52,7 +53,7 @@ func NewCmdConfig(out io.Writer) *cobra.Command { // cobra will print usage information, but still exit cleanly. // We want to return an error code in these cases so that the // user knows that their command was invalid. - RunE: subCmdRunE("config"), + RunE: cmdutil.SubCmdRunE("config"), } cmd.PersistentFlags().StringVar(&kubeConfigFile, "kubeconfig", "/etc/kubernetes/admin.conf", "The KubeConfig file to use for talking to the cluster") @@ -67,7 +68,7 @@ func NewCmdConfigUpload(out io.Writer, kubeConfigFile *string) *cobra.Command { cmd := &cobra.Command{ Use: "upload", Short: "Upload configuration about the current state so 'kubeadm upgrade' later can know how to configure the upgraded cluster", - RunE: subCmdRunE("upload"), + RunE: cmdutil.SubCmdRunE("upload"), } cmd.AddCommand(NewCmdConfigUploadFromFile(out, kubeConfigFile)) diff --git a/cmd/kubeadm/app/cmd/phases/BUILD b/cmd/kubeadm/app/cmd/phases/BUILD index 683b2ef5ed2bb..0bf15e601eaaa 100644 --- a/cmd/kubeadm/app/cmd/phases/BUILD +++ b/cmd/kubeadm/app/cmd/phases/BUILD @@ -25,6 +25,7 @@ go_library( "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library", + "//cmd/kubeadm/app/cmd/util:go_default_library", "//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/features:go_default_library", "//cmd/kubeadm/app/phases/bootstraptoken/clusterinfo:go_default_library", @@ -54,7 +55,6 @@ go_test( "controlplane_test.go", "etcd_test.go", "kubeconfig_test.go", - "phase_test.go", ], library = ":go_default_library", deps = [ diff --git a/cmd/kubeadm/app/cmd/phases/bootstraptoken.go b/cmd/kubeadm/app/cmd/phases/bootstraptoken.go index f9b4535872000..40a5f1d0a0265 100644 --- a/cmd/kubeadm/app/cmd/phases/bootstraptoken.go +++ b/cmd/kubeadm/app/cmd/phases/bootstraptoken.go @@ -22,6 +22,7 @@ import ( "github.com/spf13/cobra" clientset "k8s.io/client-go/kubernetes" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/clusterinfo" "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" @@ -36,7 +37,7 @@ func NewCmdBootstrapToken() *cobra.Command { Use: "bootstrap-token", Short: "Manage kubeadm-specific Bootstrap Token functions.", Aliases: []string{"bootstraptoken"}, - RunE: subCmdRunE("bootstrap-token"), + RunE: cmdutil.SubCmdRunE("bootstrap-token"), } cmd.PersistentFlags().StringVar(&kubeConfigFile, "kubeconfig", "/etc/kubernetes/admin.conf", "The KubeConfig file to use for talking to the cluster") @@ -55,7 +56,7 @@ func NewSubCmdClusterInfo(kubeConfigFile *string) *cobra.Command { Short: "Uploads and exposes the cluster-info ConfigMap publicly from the given cluster-info file", Aliases: []string{"clusterinfo"}, Run: func(cmd *cobra.Command, args []string) { - err := validateExactArgNumber(args, []string{"clusterinfo-file"}) + err := cmdutil.ValidateExactArgNumber(args, []string{"clusterinfo-file"}) kubeadmutil.CheckErr(err) client, err := kubeconfigutil.ClientSetFromFile(*kubeConfigFile) @@ -81,7 +82,7 @@ func NewSubCmdNodeBootstrapToken(kubeConfigFile *string) *cobra.Command { Use: "node", Short: "Manages Node Bootstrap Tokens", Aliases: []string{"clusterinfo"}, - RunE: subCmdRunE("node"), + RunE: cmdutil.SubCmdRunE("node"), } cmd.AddCommand(NewSubCmdNodeBootstrapTokenPostCSRs(kubeConfigFile)) diff --git a/cmd/kubeadm/app/cmd/phases/certs.go b/cmd/kubeadm/app/cmd/phases/certs.go index 6e4344d74cd25..6749552a1c9fb 100644 --- a/cmd/kubeadm/app/cmd/phases/certs.go +++ b/cmd/kubeadm/app/cmd/phases/certs.go @@ -22,6 +22,7 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" @@ -34,7 +35,7 @@ func NewCmdCerts() *cobra.Command { Use: "certs", Aliases: []string{"certificates"}, Short: "Generate certificates for a Kubernetes cluster.", - RunE: subCmdRunE("certs"), + RunE: cmdutil.SubCmdRunE("certs"), } cmd.AddCommand(getCertsSubCommands()...) diff --git a/cmd/kubeadm/app/cmd/phases/controlplane.go b/cmd/kubeadm/app/cmd/phases/controlplane.go index bc9bc5c9dec23..06571fed3948a 100644 --- a/cmd/kubeadm/app/cmd/phases/controlplane.go +++ b/cmd/kubeadm/app/cmd/phases/controlplane.go @@ -21,6 +21,7 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" controlplanephase "k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane" "k8s.io/kubernetes/pkg/api" @@ -31,7 +32,7 @@ func NewCmdControlplane() *cobra.Command { cmd := &cobra.Command{ Use: "controlplane", Short: "Generate all static pod manifest files necessary to establish the control plane.", - RunE: subCmdRunE("controlplane"), + RunE: cmdutil.SubCmdRunE("controlplane"), } manifestPath := kubeadmconstants.GetStaticPodDirectory() diff --git a/cmd/kubeadm/app/cmd/phases/etcd.go b/cmd/kubeadm/app/cmd/phases/etcd.go index 7d205160fe518..f3b9ab865f2f6 100644 --- a/cmd/kubeadm/app/cmd/phases/etcd.go +++ b/cmd/kubeadm/app/cmd/phases/etcd.go @@ -21,6 +21,7 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" etcdphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/etcd" "k8s.io/kubernetes/pkg/api" @@ -31,7 +32,7 @@ func NewCmdEtcd() *cobra.Command { cmd := &cobra.Command{ Use: "etcd", Short: "Generate static pod manifest file for etcd.", - RunE: subCmdRunE("etcd"), + RunE: cmdutil.SubCmdRunE("etcd"), } manifestPath := kubeadmconstants.GetStaticPodDirectory() diff --git a/cmd/kubeadm/app/cmd/phases/kubeconfig.go b/cmd/kubeadm/app/cmd/phases/kubeconfig.go index a8b144563ea35..47b88e80f2eae 100644 --- a/cmd/kubeadm/app/cmd/phases/kubeconfig.go +++ b/cmd/kubeadm/app/cmd/phases/kubeconfig.go @@ -24,6 +24,7 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig" "k8s.io/kubernetes/pkg/api" @@ -34,7 +35,7 @@ func NewCmdKubeConfig(out io.Writer) *cobra.Command { cmd := &cobra.Command{ Use: "kubeconfig", Short: "Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file.", - RunE: subCmdRunE("kubeconfig"), + RunE: cmdutil.SubCmdRunE("kubeconfig"), } cmd.AddCommand(getKubeConfigSubCommands(out, kubeadmconstants.KubernetesDir)...) diff --git a/cmd/kubeadm/app/cmd/phases/markmaster.go b/cmd/kubeadm/app/cmd/phases/markmaster.go index 5c4e91e2b0c86..89457fdfc7640 100644 --- a/cmd/kubeadm/app/cmd/phases/markmaster.go +++ b/cmd/kubeadm/app/cmd/phases/markmaster.go @@ -19,6 +19,7 @@ package phases import ( "github.com/spf13/cobra" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" markmasterphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/markmaster" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" @@ -32,7 +33,7 @@ func NewCmdMarkMaster() *cobra.Command { Short: "Mark a node as master.", Aliases: []string{"markmaster"}, RunE: func(_ *cobra.Command, args []string) error { - err := validateExactArgNumber(args, []string{"node-name"}) + err := cmdutil.ValidateExactArgNumber(args, []string{"node-name"}) kubeadmutil.CheckErr(err) client, err := kubeconfigutil.ClientSetFromFile(kubeConfigFile) diff --git a/cmd/kubeadm/app/cmd/phases/phase.go b/cmd/kubeadm/app/cmd/phases/phase.go index fd6edbfed03d8..f0a33c2b59e6c 100644 --- a/cmd/kubeadm/app/cmd/phases/phase.go +++ b/cmd/kubeadm/app/cmd/phases/phase.go @@ -17,10 +17,10 @@ limitations under the License. package phases import ( - "fmt" "io" "github.com/spf13/cobra" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" ) // NewCmdPhase returns the cobra command for the "kubeadm phase" command (currently alpha-gated) @@ -28,7 +28,7 @@ func NewCmdPhase(out io.Writer) *cobra.Command { cmd := &cobra.Command{ Use: "phase", Short: "Invoke subsets of kubeadm functions separately for a manual install.", - RunE: subCmdRunE("phase"), + RunE: cmdutil.SubCmdRunE("phase"), } cmd.AddCommand(NewCmdBootstrapToken()) @@ -43,37 +43,3 @@ func NewCmdPhase(out io.Writer) *cobra.Command { return cmd } - -// subCmdRunE returns a function that handles a case where a subcommand must be specified -// Without this callback, if a user runs just the command without a subcommand, -// or with an invalid subcommand, cobra will print usage information, but still exit cleanly. -// We want to return an error code in these cases so that the -// user knows that their command was invalid. -func subCmdRunE(name string) func(*cobra.Command, []string) error { - return func(_ *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("missing subcommand; %q is not meant to be run on its own", name) - } - - return fmt.Errorf("invalid subcommand: %q", args[0]) - } -} - -// validateExactArgNumber validates that the required top-level arguments are specified -func validateExactArgNumber(args []string, supportedArgs []string) error { - validArgs := 0 - // Disregard possible "" arguments; they are invalid - for _, arg := range args { - if len(arg) > 0 { - validArgs++ - } - } - - if validArgs < len(supportedArgs) { - return fmt.Errorf("missing one or more required arguments. Required arguments: %v", supportedArgs) - } - if validArgs > len(supportedArgs) { - return fmt.Errorf("too many arguments, only %d argument(s) supported: %v", validArgs, supportedArgs) - } - return nil -} diff --git a/cmd/kubeadm/app/cmd/phases/preflight.go b/cmd/kubeadm/app/cmd/phases/preflight.go index b16a8e01e6ca1..f47e35126c891 100644 --- a/cmd/kubeadm/app/cmd/phases/preflight.go +++ b/cmd/kubeadm/app/cmd/phases/preflight.go @@ -20,6 +20,7 @@ import ( "github.com/spf13/cobra" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" "k8s.io/kubernetes/cmd/kubeadm/app/preflight" ) @@ -27,7 +28,7 @@ func NewCmdPreFlight() *cobra.Command { cmd := &cobra.Command{ Use: "preflight", Short: "Run pre-flight checks", - RunE: subCmdRunE("preflight"), + RunE: cmdutil.SubCmdRunE("preflight"), } cmd.AddCommand(NewCmdPreFlightMaster()) diff --git a/cmd/kubeadm/app/cmd/phases/selfhosting.go b/cmd/kubeadm/app/cmd/phases/selfhosting.go index 2fd9c3a8206cb..f7b20b69a3ea7 100644 --- a/cmd/kubeadm/app/cmd/phases/selfhosting.go +++ b/cmd/kubeadm/app/cmd/phases/selfhosting.go @@ -29,6 +29,7 @@ import ( configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" "k8s.io/kubernetes/pkg/api" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" ) // NewCmdSelfhosting returns the self-hosting Cobra command @@ -37,7 +38,7 @@ func NewCmdSelfhosting() *cobra.Command { Use: "selfhosting", Aliases: []string{"selfhosted"}, Short: "Make a kubeadm cluster self-hosted.", - RunE: subCmdRunE("selfhosting"), + RunE: cmdutil.SubCmdRunE("selfhosting"), } cmd.AddCommand(getSelfhostingSubCommand()) diff --git a/cmd/kubeadm/app/cmd/token.go b/cmd/kubeadm/app/cmd/token.go index 6523c7cf914be..d3bbda1041dee 100644 --- a/cmd/kubeadm/app/cmd/token.go +++ b/cmd/kubeadm/app/cmd/token.go @@ -33,6 +33,7 @@ import ( "k8s.io/apimachinery/pkg/fields" clientset "k8s.io/client-go/kubernetes" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" tokenphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/bootstraptoken/node" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" @@ -77,7 +78,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { // cobra will print usage information, but still exit cleanly. // We want to return an error code in these cases so that the // user knows that their command was invalid. - RunE: subCmdRunE("token"), + RunE: cmdutil.SubCmdRunE("token"), } tokenCmd.PersistentFlags().StringVar(&kubeConfigFile, diff --git a/cmd/kubeadm/app/cmd/util/BUILD b/cmd/kubeadm/app/cmd/util/BUILD new file mode 100644 index 0000000000000..cb123d65d2a60 --- /dev/null +++ b/cmd/kubeadm/app/cmd/util/BUILD @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["cmdutil.go"], + visibility = ["//visibility:public"], + deps = ["//vendor/github.com/spf13/cobra:go_default_library"], +) + +go_test( + name = "go_default_test", + srcs = ["cmdutil_test.go"], + library = ":go_default_library", +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cmd/kubeadm/app/cmd/util/cmdutil.go b/cmd/kubeadm/app/cmd/util/cmdutil.go new file mode 100644 index 0000000000000..3c0e7d65b1043 --- /dev/null +++ b/cmd/kubeadm/app/cmd/util/cmdutil.go @@ -0,0 +1,57 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package phases + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +// SubCmdRunE returns a function that handles a case where a subcommand must be specified +// Without this callback, if a user runs just the command without a subcommand, +// or with an invalid subcommand, cobra will print usage information, but still exit cleanly. +// We want to return an error code in these cases so that the +// user knows that their command was invalid. +func SubCmdRunE(name string) func(*cobra.Command, []string) error { + return func(_ *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("missing subcommand; %q is not meant to be run on its own", name) + } + + return fmt.Errorf("invalid subcommand: %q", args[0]) + } +} + +// ValidateExactArgNumber validates that the required top-level arguments are specified +func ValidateExactArgNumber(args []string, supportedArgs []string) error { + validArgs := 0 + // Disregard possible "" arguments; they are invalid + for _, arg := range args { + if len(arg) > 0 { + validArgs++ + } + } + + if validArgs < len(supportedArgs) { + return fmt.Errorf("missing one or more required arguments. Required arguments: %v", supportedArgs) + } + if validArgs > len(supportedArgs) { + return fmt.Errorf("too many arguments, only %d argument(s) supported: %v", validArgs, supportedArgs) + } + return nil +} diff --git a/cmd/kubeadm/app/cmd/phases/phase_test.go b/cmd/kubeadm/app/cmd/util/cmdutil_test.go similarity index 92% rename from cmd/kubeadm/app/cmd/phases/phase_test.go rename to cmd/kubeadm/app/cmd/util/cmdutil_test.go index 67a5283337fc6..ef4d81ce009a0 100644 --- a/cmd/kubeadm/app/cmd/phases/phase_test.go +++ b/cmd/kubeadm/app/cmd/util/cmdutil_test.go @@ -52,10 +52,10 @@ func TestValidateExactArgNumber(t *testing.T) { }, } for _, rt := range tests { - actual := validateExactArgNumber(rt.args, rt.supportedArgs) + actual := ValidateExactArgNumber(rt.args, rt.supportedArgs) if (actual != nil) != rt.expectedErr { t.Errorf( - "failed validateExactArgNumber:\n\texpected error: %t\n\t actual error: %t", + "failed ValidateExactArgNumber:\n\texpected error: %t\n\t actual error: %t", rt.expectedErr, (actual != nil), ) From 65f225a2653ce2364a6bf3b7138eec530c8a6eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Fri, 25 Aug 2017 14:00:16 +0300 Subject: [PATCH 311/403] kubeadm: Add 'kubeadm upgrade plan' and 'kubeadm upgrade apply' CLI commands --- cmd/kubeadm/app/cmd/upgrade/apply.go | 213 ++++++++++++++++++ cmd/kubeadm/app/cmd/upgrade/common.go | 120 ++++++++++ cmd/kubeadm/app/cmd/upgrade/plan.go | 142 ++++++++++++ cmd/kubeadm/app/cmd/upgrade/upgrade.go | 64 ++++++ cmd/kubeadm/app/phases/upgrade/compute.go | 63 ++++++ .../app/phases/upgrade/configuration.go | 36 +++ cmd/kubeadm/app/phases/upgrade/health.go | 36 +++ cmd/kubeadm/app/phases/upgrade/policy.go | 33 +++ cmd/kubeadm/app/phases/upgrade/postupgrade.go | 30 +++ cmd/kubeadm/app/phases/upgrade/staticpods.go | 29 +++ .../app/phases/upgrade/versiongetter.go | 83 +++++++ 11 files changed, 849 insertions(+) create mode 100644 cmd/kubeadm/app/cmd/upgrade/apply.go create mode 100644 cmd/kubeadm/app/cmd/upgrade/common.go create mode 100644 cmd/kubeadm/app/cmd/upgrade/plan.go create mode 100644 cmd/kubeadm/app/cmd/upgrade/upgrade.go create mode 100644 cmd/kubeadm/app/phases/upgrade/compute.go create mode 100644 cmd/kubeadm/app/phases/upgrade/configuration.go create mode 100644 cmd/kubeadm/app/phases/upgrade/health.go create mode 100644 cmd/kubeadm/app/phases/upgrade/policy.go create mode 100644 cmd/kubeadm/app/phases/upgrade/postupgrade.go create mode 100644 cmd/kubeadm/app/phases/upgrade/staticpods.go create mode 100644 cmd/kubeadm/app/phases/upgrade/versiongetter.go diff --git a/cmd/kubeadm/app/cmd/upgrade/apply.go b/cmd/kubeadm/app/cmd/upgrade/apply.go new file mode 100644 index 0000000000000..319029ce07806 --- /dev/null +++ b/cmd/kubeadm/app/cmd/upgrade/apply.go @@ -0,0 +1,213 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "fmt" + "strings" + "time" + + "github.com/spf13/cobra" + + clientset "k8s.io/client-go/kubernetes" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" + "k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/util/version" +) + +// applyFlags holds the information about the flags that can be passed to apply +type applyFlags struct { + nonInteractiveMode bool + force bool + dryRun bool + newK8sVersionStr string + newK8sVersion *version.Version + imagePullTimeout time.Duration + parent *cmdUpgradeFlags +} + +// SessionIsInteractive returns true if the session is of an interactive type (the default, can be opted out of with -y, -f or --dry-run) +func (f *applyFlags) SessionIsInteractive() bool { + return !f.nonInteractiveMode +} + +// NewCmdApply returns the cobra command for `kubeadm upgrade apply` +func NewCmdApply(parentFlags *cmdUpgradeFlags) *cobra.Command { + flags := &applyFlags{ + parent: parentFlags, + imagePullTimeout: 15 * time.Minute, + } + + cmd := &cobra.Command{ + Use: "apply [version]", + Short: "Upgrade your Kubernetes cluster to the specified version", + Run: func(cmd *cobra.Command, args []string) { + // Ensure the user is root + err := runPreflightChecks(flags.parent.skipPreFlight) + kubeadmutil.CheckErr(err) + + err = cmdutil.ValidateExactArgNumber(args, []string{"version"}) + kubeadmutil.CheckErr(err) + + // It's safe to use args[0] here as the slice has been validated above + flags.newK8sVersionStr = args[0] + + // Default the flags dynamically, based on each others' value + err = SetImplicitFlags(flags) + kubeadmutil.CheckErr(err) + + err = RunApply(flags) + kubeadmutil.CheckErr(err) + }, + } + + // Specify the valid flags specific for apply + cmd.Flags().BoolVarP(&flags.nonInteractiveMode, "yes", "y", flags.nonInteractiveMode, "Perform the upgrade and do not prompt for confirmation (non-interactive mode).") + cmd.Flags().BoolVarP(&flags.force, "force", "f", flags.force, "Force upgrading although some requirements might not be met. This also implies non-interactive mode.") + cmd.Flags().BoolVar(&flags.dryRun, "dry-run", flags.dryRun, "Do not change any state, just output what actions would be applied.") + cmd.Flags().DurationVar(&flags.imagePullTimeout, "image-pull-timeout", flags.imagePullTimeout, "The maximum amount of time to wait for the control plane pods to be downloaded.") + + return cmd +} + +// RunApply takes care of the actual upgrade functionality +// It does the following things: +// - Checks if the cluster is healthy +// - Gets the configuration from the kubeadm-config ConfigMap in the cluster +// - Enforces all version skew policies +// - Asks the user if they really want to upgrade +// - Makes sure the control plane images are available locally on the master(s) +// - Upgrades the control plane components +// - Applies the other resources that'd be created with kubeadm init as well, like +// - Creating the RBAC rules for the Bootstrap Tokens and the cluster-info ConfigMap +// - Applying new kube-dns and kube-proxy manifests +// - Uploads the newly used configuration to the cluster ConfigMap +func RunApply(flags *applyFlags) error { + + // Start with the basics, verify that the cluster is healthy and get the configuration from the cluster (using the ConfigMap) + upgradeVars, err := enforceRequirements(flags.parent.kubeConfigPath, flags.parent.cfgPath, flags.parent.printConfig) + if err != nil { + return err + } + + // Set the upgraded version on the external config object now + upgradeVars.cfg.KubernetesVersion = flags.newK8sVersionStr + + // Grab the external, versioned configuration and convert it to the internal type for usage here later + internalcfg := &kubeadmapi.MasterConfiguration{} + api.Scheme.Convert(upgradeVars.cfg, internalcfg, nil) + + // Enforce the version skew policies + if err := EnforceVersionPolicies(flags, upgradeVars.versionGetter); err != nil { + return fmt.Errorf("[upgrade/version] FATAL: %v", err) + } + + // If the current session is interactive, ask the user whether they really want to upgrade + if flags.SessionIsInteractive() { + if err := InteractivelyConfirmUpgrade("Are you sure you want to proceed with the upgrade?"); err != nil { + return err + } + } + + // TODO: Implement a prepulling mechanism here + + // Now; perform the upgrade procedure + if err := PerformControlPlaneUpgrade(flags, upgradeVars.client, internalcfg); err != nil { + return fmt.Errorf("[upgrade/apply] FATAL: %v", err) + } + + // Upgrade RBAC rules and addons. Optionally, if needed, perform some extra task for a specific version + if err := upgrade.PerformPostUpgradeTasks(upgradeVars.client, internalcfg, flags.newK8sVersion); err != nil { + return fmt.Errorf("[upgrade/postupgrade] FATAL: %v", err) + } + + fmt.Println("") + fmt.Printf("[upgrade/successful] SUCCESS! Your cluster was upgraded to %q. Enjoy!\n", flags.newK8sVersionStr) + fmt.Println("") + fmt.Println("[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets in turn.") + + return nil +} + +// SetImplicitFlags handles dynamically defaulting flags based on each other's value +func SetImplicitFlags(flags *applyFlags) error { + // If we are in dry-run or force mode; we should automatically execute this command non-interactively + if flags.dryRun || flags.force { + flags.nonInteractiveMode = true + } + + k8sVer, err := version.ParseSemantic(flags.newK8sVersionStr) + if err != nil { + return fmt.Errorf("couldn't parse version %q as a semantic version", flags.newK8sVersionStr) + } + flags.newK8sVersion = k8sVer + + // Automatically add the "v" prefix to the string representation in case it doesn't exist + if !strings.HasPrefix(flags.newK8sVersionStr, "v") { + flags.newK8sVersionStr = fmt.Sprintf("v%s", flags.newK8sVersionStr) + } + + return nil +} + +// EnforceVersionPolicies makes sure that the version the user specified is valid to upgrade to +// There are both fatal and skippable (with --force) errors +func EnforceVersionPolicies(flags *applyFlags, versionGetter upgrade.VersionGetter) error { + fmt.Printf("[upgrade/version] You have chosen to upgrade to version %q\n", flags.newK8sVersionStr) + + versionSkewErrs := upgrade.EnforceVersionPolicies(versionGetter, flags.newK8sVersionStr, flags.newK8sVersion, flags.parent.allowExperimentalUpgrades, flags.parent.allowRCUpgrades) + if versionSkewErrs != nil { + + if len(versionSkewErrs.Mandatory) > 0 { + return fmt.Errorf("The --version argument is invalid due to these fatal errors: %v", versionSkewErrs.Mandatory) + } + + if len(versionSkewErrs.Skippable) > 0 { + // Return the error if the user hasn't specified the --force flag + if !flags.force { + return fmt.Errorf("The --version argument is invalid due to these errors: %v. Can be bypassed if you pass the --force flag", versionSkewErrs.Mandatory) + } + // Soft errors found, but --force was specified + fmt.Printf("[upgrade/version] Found %d potential version compatibility errors but skipping since the --force flag is set: %v\n", len(versionSkewErrs.Skippable), versionSkewErrs.Skippable) + } + } + return nil +} + +// PerformControlPlaneUpgrade actually performs the upgrade procedure for the cluster of your type (self-hosted or static-pod-hosted) +func PerformControlPlaneUpgrade(flags *applyFlags, client clientset.Interface, internalcfg *kubeadmapi.MasterConfiguration) error { + + // Check if the cluster is self-hosted and act accordingly + if upgrade.IsControlPlaneSelfHosted(client) { + fmt.Printf("[upgrade/apply] Upgrading your Self-Hosted control plane to version %q...\n", flags.newK8sVersionStr) + + // Upgrade a self-hosted cluster + // TODO(luxas): Implement this later when we have the new upgrade strategy + return fmt.Errorf("not implemented") + } + + // OK, the cluster is hosted using static pods. Upgrade a static-pod hosted cluster + fmt.Printf("[upgrade/apply] Upgrading your Static Pod-hosted control plane to version %q...\n", flags.newK8sVersionStr) + + if err := upgrade.PerformStaticPodControlPlaneUpgrade(client, internalcfg, flags.newK8sVersion); err != nil { + return err + } + return nil +} diff --git a/cmd/kubeadm/app/cmd/upgrade/common.go b/cmd/kubeadm/app/cmd/upgrade/common.go new file mode 100644 index 0000000000000..4a64d37011bfa --- /dev/null +++ b/cmd/kubeadm/app/cmd/upgrade/common.go @@ -0,0 +1,120 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "bufio" + "bytes" + "fmt" + "io" + "os" + "strings" + + "github.com/ghodss/yaml" + + clientset "k8s.io/client-go/kubernetes" + kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + "k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade" + "k8s.io/kubernetes/cmd/kubeadm/app/preflight" + kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" +) + +// upgradeVariables holds variables needed for performing an upgrade or planning to do so +// TODO - Restructure or rename upgradeVariables +type upgradeVariables struct { + client clientset.Interface + cfg *kubeadmapiext.MasterConfiguration + versionGetter upgrade.VersionGetter +} + +// enforceRequirements verifies that it's okay to upgrade and then returns the variables needed for the rest of the procedure +func enforceRequirements(kubeConfigPath, cfgPath string, printConfig bool) (*upgradeVariables, error) { + client, err := kubeconfigutil.ClientSetFromFile(kubeConfigPath) + if err != nil { + return nil, fmt.Errorf("couldn't create a Kubernetes client from file %q: %v", kubeConfigPath, err) + } + + // Run healthchecks against the cluster + if err := upgrade.CheckClusterHealth(client); err != nil { + return nil, fmt.Errorf("[upgrade/health] FATAL: %v", err) + } + + // Fetch the configuration from a file or ConfigMap and validate it + cfg, err := upgrade.FetchConfiguration(client, os.Stdout, cfgPath) + if err != nil { + return nil, fmt.Errorf("[upgrade/config] FATAL: %v", err) + } + + // If the user told us to print this information out; do it! + if printConfig { + printConfiguration(cfg, os.Stdout) + } + + return &upgradeVariables{ + client: client, + cfg: cfg, + // Use a real version getter interface that queries the API server, the kubeadm client and the Kubernetes CI system for latest versions + versionGetter: upgrade.NewKubeVersionGetter(client, os.Stdout), + }, nil +} + +// printConfiguration prints the external version of the API to yaml +func printConfiguration(cfg *kubeadmapiext.MasterConfiguration, w io.Writer) { + // Short-circuit if cfg is nil, so we can safely get the value of the pointer below + if cfg == nil { + return + } + + cfgYaml, err := yaml.Marshal(*cfg) + if err == nil { + fmt.Fprintln(w, "[upgrade/config] Configuration used:") + + scanner := bufio.NewScanner(bytes.NewReader(cfgYaml)) + for scanner.Scan() { + fmt.Fprintf(w, "\t%s\n", scanner.Text()) + } + } +} + +// runPreflightChecks runs the root preflight check +func runPreflightChecks(skipPreFlight bool) error { + if skipPreFlight { + fmt.Println("[preflight] Skipping pre-flight checks") + return nil + } + + fmt.Println("[preflight] Running pre-flight checks") + return preflight.RunRootCheckOnly() +} + +// InteractivelyConfirmUpgrade asks the user whether they _really_ want to upgrade. +func InteractivelyConfirmUpgrade(question string) error { + + fmt.Printf("[upgrade/confirm] %s [y/N]: ", question) + + scanner := bufio.NewScanner(os.Stdin) + scanner.Scan() + if err := scanner.Err(); err != nil { + return fmt.Errorf("couldn't read from standard input: %v", err) + } + answer := scanner.Text() + if strings.ToLower(answer) == "y" || strings.ToLower(answer) == "yes" { + return nil + } + + return fmt.Errorf("won't proceed; the user didn't answer (Y|y) in order to continue") +} diff --git a/cmd/kubeadm/app/cmd/upgrade/plan.go b/cmd/kubeadm/app/cmd/upgrade/plan.go new file mode 100644 index 0000000000000..545b362ae85a8 --- /dev/null +++ b/cmd/kubeadm/app/cmd/upgrade/plan.go @@ -0,0 +1,142 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "fmt" + "io" + "os" + "sort" + "text/tabwriter" + + "github.com/spf13/cobra" + + "k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" +) + +// NewCmdPlan returns the cobra command for `kubeadm upgrade plan` +func NewCmdPlan(parentFlags *cmdUpgradeFlags) *cobra.Command { + cmd := &cobra.Command{ + Use: "plan", + Short: "Check which versions are available to upgrade to and validate whether your current cluster is upgradeable", + Run: func(_ *cobra.Command, _ []string) { + // Ensure the user is root + err := runPreflightChecks(parentFlags.skipPreFlight) + kubeadmutil.CheckErr(err) + + err = RunPlan(parentFlags) + kubeadmutil.CheckErr(err) + }, + } + + return cmd +} + +// RunPlan takes care of outputting available versions to upgrade to for the user +func RunPlan(parentFlags *cmdUpgradeFlags) error { + + // Start with the basics, verify that the cluster is healthy, build a client and a versionGetter. + upgradeVars, err := enforceRequirements(parentFlags.kubeConfigPath, parentFlags.cfgPath, parentFlags.printConfig) + if err != nil { + return err + } + + // Compute which upgrade possibilities there are + availUpgrades, err := upgrade.GetAvailableUpgrades(upgradeVars.versionGetter, parentFlags.allowExperimentalUpgrades, parentFlags.allowRCUpgrades) + if err != nil { + return err + } + + // Tell the user which upgrades are available + printAvailableUpgrades(availUpgrades, os.Stdout) + return nil +} + +// printAvailableUpgrades prints a UX-friendly overview of what versions are available to upgrade to +// TODO look into columnize or some other formatter when time permits instead of using the tabwriter +func printAvailableUpgrades(upgrades []upgrade.Upgrade, w io.Writer) { + + // Return quickly if no upgrades can be made + if len(upgrades) == 0 { + fmt.Fprintln(w, "Awesome, you're up-to-date! Enjoy!") + return + } + // The tab writer writes to the "real" writer w + tabw := tabwriter.NewWriter(w, 10, 4, 3, ' ', 0) + + // Loop through the upgrade possibilities and output text to the command line + for _, upgrade := range upgrades { + + if upgrade.CanUpgradeKubelets() { + fmt.Fprintln(w, "Components that must be upgraded manually after you've upgraded the control plane with 'kubeadm upgrade apply':") + fmt.Fprintln(tabw, "COMPONENT\tCURRENT\tAVAILABLE") + firstPrinted := false + + // The map is of the form :. Here all the keys are put into a slice and sorted + // in order to always get the right order. Then the map value is extracted separately + for _, oldVersion := range sortedSliceFromStringIntMap(upgrade.Before.KubeletVersions) { + nodeCount := upgrade.Before.KubeletVersions[oldVersion] + if !firstPrinted { + // Output the Kubelet header only on the first version pair + fmt.Fprintf(tabw, "Kubelet\t%d x %s\t%s\n", nodeCount, oldVersion, upgrade.After.KubeVersion) + firstPrinted = true + continue + } + fmt.Fprintf(tabw, "\t\t%d x %s\t%s\n", nodeCount, oldVersion, upgrade.After.KubeVersion) + } + // We should flush the writer here at this stage; as the columns will now be of the right size, adjusted to the above content + tabw.Flush() + fmt.Fprintln(w, "") + } + + fmt.Fprintf(w, "Upgrade to the latest %s:\n", upgrade.Description) + fmt.Fprintln(w, "") + fmt.Fprintln(tabw, "COMPONENT\tCURRENT\tAVAILABLE") + fmt.Fprintf(tabw, "API Server\t%s\t%s\n", upgrade.Before.KubeVersion, upgrade.After.KubeVersion) + fmt.Fprintf(tabw, "Controller Manager\t%s\t%s\n", upgrade.Before.KubeVersion, upgrade.After.KubeVersion) + fmt.Fprintf(tabw, "Scheduler\t%s\t%s\n", upgrade.Before.KubeVersion, upgrade.After.KubeVersion) + fmt.Fprintf(tabw, "Kube Proxy\t%s\t%s\n", upgrade.Before.KubeVersion, upgrade.After.KubeVersion) + fmt.Fprintf(tabw, "Kube DNS\t%s\t%s\n", upgrade.Before.DNSVersion, upgrade.After.DNSVersion) + + // The tabwriter should be flushed at this stage as we have now put in all the required content for this time. This is required for the tabs' size to be correct. + tabw.Flush() + fmt.Fprintln(w, "") + fmt.Fprintln(w, "You can now apply the upgrade by executing the following command:") + fmt.Fprintln(w, "") + fmt.Fprintf(w, "\tkubeadm upgrade apply %s\n", upgrade.After.KubeVersion) + fmt.Fprintln(w, "") + + if upgrade.Before.KubeadmVersion != upgrade.After.KubeadmVersion { + fmt.Fprintf(w, "Note: Before you do can perform this upgrade, you have to update kubeadm to %s\n", upgrade.After.KubeadmVersion) + fmt.Fprintln(w, "") + } + + fmt.Fprintln(w, "_____________________________________________________________________") + fmt.Fprintln(w, "") + } +} + +// sortedSliceFromStringIntMap returns a slice of the keys in the map sorted alphabetically +func sortedSliceFromStringIntMap(strMap map[string]uint16) []string { + strSlice := []string{} + for k := range strMap { + strSlice = append(strSlice, k) + } + sort.Strings(strSlice) + return strSlice +} diff --git a/cmd/kubeadm/app/cmd/upgrade/upgrade.go b/cmd/kubeadm/app/cmd/upgrade/upgrade.go new file mode 100644 index 0000000000000..9f9b14f08ff13 --- /dev/null +++ b/cmd/kubeadm/app/cmd/upgrade/upgrade.go @@ -0,0 +1,64 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "io" + + "github.com/spf13/cobra" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" +) + +// cmdUpgradeFlags holds the values for the common flags in `kubeadm upgrade` +type cmdUpgradeFlags struct { + kubeConfigPath string + cfgPath string + allowExperimentalUpgrades bool + allowRCUpgrades bool + printConfig bool + skipPreFlight bool +} + +// NewCmdUpgrade returns the cobra command for `kubeadm upgrade` +func NewCmdUpgrade(out io.Writer) *cobra.Command { + flags := &cmdUpgradeFlags{ + kubeConfigPath: "/etc/kubernetes/admin.conf", + cfgPath: "", + allowExperimentalUpgrades: false, + allowRCUpgrades: false, + printConfig: false, + skipPreFlight: false, + } + + cmd := &cobra.Command{ + Use: "upgrade", + Short: "Upgrade your cluster smoothly to a newer version with this command.", + RunE: cmdutil.SubCmdRunE("upgrade"), + } + + cmd.PersistentFlags().StringVar(&flags.kubeConfigPath, "kubeconfig", flags.kubeConfigPath, "The KubeConfig file to use for talking to the cluster.") + cmd.PersistentFlags().StringVar(&flags.cfgPath, "config", flags.cfgPath, "Path to kubeadm config file (WARNING: Usage of a configuration file is experimental).") + cmd.PersistentFlags().BoolVar(&flags.allowExperimentalUpgrades, "allow-experimental-upgrades", flags.allowExperimentalUpgrades, "Show unstable versions of Kubernetes as an upgrade alternative and allow upgrading to an alpha/beta/release candidate versions of Kubernetes.") + cmd.PersistentFlags().BoolVar(&flags.allowRCUpgrades, "allow-release-candidate-upgrades", flags.allowRCUpgrades, "Show release candidate versions of Kubernetes as an upgrade alternative and allow upgrading to a release candidate versions of Kubernetes.") + cmd.PersistentFlags().BoolVar(&flags.printConfig, "print-config", flags.printConfig, "Whether the configuration file that will be used in the upgrade should be printed or not.") + cmd.PersistentFlags().BoolVar(&flags.skipPreFlight, "skip-preflight-checks", flags.skipPreFlight, "Skip preflight checks normally run before modifying the system") + + cmd.AddCommand(NewCmdApply(flags)) + cmd.AddCommand(NewCmdPlan(flags)) + + return cmd +} diff --git a/cmd/kubeadm/app/phases/upgrade/compute.go b/cmd/kubeadm/app/phases/upgrade/compute.go new file mode 100644 index 0000000000000..e81eb93b9d3b2 --- /dev/null +++ b/cmd/kubeadm/app/phases/upgrade/compute.go @@ -0,0 +1,63 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "fmt" +) + +// Upgrade defines an upgrade possibility to upgrade from a current version to a new one +type Upgrade struct { + Description string + Before ClusterState + After ClusterState +} + +// CanUpgradeKubelets returns whether an upgrade of any kubelet in the cluster is possible +func (u *Upgrade) CanUpgradeKubelets() bool { + // If there are multiple different versions now, an upgrade is possible (even if only for a subset of the nodes) + if len(u.Before.KubeletVersions) > 1 { + return true + } + // Don't report something available for upgrade if we don't know the current state + if len(u.Before.KubeletVersions) == 0 { + return false + } + + // if the same version number existed both before and after, we don't have to upgrade it + _, sameVersionFound := u.Before.KubeletVersions[u.After.KubeVersion] + return !sameVersionFound +} + +// ClusterState describes the state of certain versions for a cluster +type ClusterState struct { + // KubeVersion describes the version of the Kubernetes API Server, Controller Manager, Scheduler and Proxy. + KubeVersion string + // DNSVersion describes the version of the kube-dns images used and manifest version + DNSVersion string + // KubeadmVersion describes the version of the kubeadm CLI + KubeadmVersion string + // KubeletVersions is a map with a version number linked to the amount of kubelets running that version in the cluster + KubeletVersions map[string]uint16 +} + +// GetAvailableUpgrades fetches all versions from the specified VersionGetter and computes which +// kinds of upgrades can be performed +func GetAvailableUpgrades(_ VersionGetter, _, _ bool) ([]Upgrade, error) { + fmt.Println("[upgrade] Fetching available versions to upgrade to:") + return []Upgrade{}, nil +} diff --git a/cmd/kubeadm/app/phases/upgrade/configuration.go b/cmd/kubeadm/app/phases/upgrade/configuration.go new file mode 100644 index 0000000000000..a91e4140a8a06 --- /dev/null +++ b/cmd/kubeadm/app/phases/upgrade/configuration.go @@ -0,0 +1,36 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "fmt" + "io" + + clientset "k8s.io/client-go/kubernetes" + kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + "k8s.io/kubernetes/pkg/api" +) + +// FetchConfiguration fetches configuration required for upgrading your cluster from a file (which has precedence) or a ConfigMap in the cluster +func FetchConfiguration(_ clientset.Interface, _ io.Writer, _ string) (*kubeadmapiext.MasterConfiguration, error) { + fmt.Println("[upgrade/config] Making sure the configuration is correct:") + + cfg := &kubeadmapiext.MasterConfiguration{} + api.Scheme.Default(cfg) + + return cfg, nil +} diff --git a/cmd/kubeadm/app/phases/upgrade/health.go b/cmd/kubeadm/app/phases/upgrade/health.go new file mode 100644 index 0000000000000..1beac03999660 --- /dev/null +++ b/cmd/kubeadm/app/phases/upgrade/health.go @@ -0,0 +1,36 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + clientset "k8s.io/client-go/kubernetes" +) + +// CheckClusterHealth makes sure: +// - the API /healthz endpoint is healthy +// - all Nodes are Ready +// - (if self-hosted) that there are DaemonSets with at least one Pod for all control plane components +// - (if static pod-hosted) that all required Static Pod manifests exist on disk +func CheckClusterHealth(_ clientset.Interface) error { + return nil +} + +// IsControlPlaneSelfHosted returns whether the control plane is self hosted or not +func IsControlPlaneSelfHosted(_ clientset.Interface) bool { + // No-op for now + return false +} diff --git a/cmd/kubeadm/app/phases/upgrade/policy.go b/cmd/kubeadm/app/phases/upgrade/policy.go new file mode 100644 index 0000000000000..6b06a4116e4f1 --- /dev/null +++ b/cmd/kubeadm/app/phases/upgrade/policy.go @@ -0,0 +1,33 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "k8s.io/kubernetes/pkg/util/version" +) + +// VersionSkewPolicyErrors describes version skew errors that might be seen during the validation process in EnforceVersionPolicies +type VersionSkewPolicyErrors struct { + Mandatory []error + Skippable []error +} + +// EnforceVersionPolicies enforces that the proposed new version is compatible with all the different version skew policies +func EnforceVersionPolicies(_ VersionGetter, _ string, _ *version.Version, _, _ bool) *VersionSkewPolicyErrors { + // No-op now and return no skew errors + return nil +} diff --git a/cmd/kubeadm/app/phases/upgrade/postupgrade.go b/cmd/kubeadm/app/phases/upgrade/postupgrade.go new file mode 100644 index 0000000000000..3510caa57a27d --- /dev/null +++ b/cmd/kubeadm/app/phases/upgrade/postupgrade.go @@ -0,0 +1,30 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + clientset "k8s.io/client-go/kubernetes" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + "k8s.io/kubernetes/pkg/util/version" +) + +// PerformPostUpgradeTasks runs nearly the same functions as 'kubeadm init' would do +// Note that the markmaster phase is left out, not needed, and no token is created as that doesn't belong to the upgrade +func PerformPostUpgradeTasks(_ clientset.Interface, _ *kubeadmapi.MasterConfiguration, _ *version.Version) error { + // No-op; don't do anything here yet + return nil +} diff --git a/cmd/kubeadm/app/phases/upgrade/staticpods.go b/cmd/kubeadm/app/phases/upgrade/staticpods.go new file mode 100644 index 0000000000000..6970560f54137 --- /dev/null +++ b/cmd/kubeadm/app/phases/upgrade/staticpods.go @@ -0,0 +1,29 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + clientset "k8s.io/client-go/kubernetes" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + "k8s.io/kubernetes/pkg/util/version" +) + +// PerformStaticPodControlPlaneUpgrade upgrades a static pod-hosted control plane +func PerformStaticPodControlPlaneUpgrade(_ clientset.Interface, _ *kubeadmapi.MasterConfiguration, _ *version.Version) error { + // No-op for now; doesn't do anything yet + return nil +} diff --git a/cmd/kubeadm/app/phases/upgrade/versiongetter.go b/cmd/kubeadm/app/phases/upgrade/versiongetter.go new file mode 100644 index 0000000000000..879ca11276f30 --- /dev/null +++ b/cmd/kubeadm/app/phases/upgrade/versiongetter.go @@ -0,0 +1,83 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "fmt" + "io" + + clientset "k8s.io/client-go/kubernetes" + versionutil "k8s.io/kubernetes/pkg/util/version" +) + +// VersionGetter defines an interface for fetching different versions. +// Easy to implement a fake variant of this interface for unit testing +type VersionGetter interface { + // ClusterVersion should return the version of the cluster i.e. the API Server version + ClusterVersion() (string, *versionutil.Version, error) + // KubeadmVersion should return the version of the kubeadm CLI + KubeadmVersion() (string, *versionutil.Version, error) + // VersionFromCILabel should resolve CI labels like `latest`, `stable`, `stable-1.8`, etc. to real versions + VersionFromCILabel(string, string) (string, *versionutil.Version, error) + // KubeletVersions should return a map with a version and a number that describes how many kubelets there are for that version + KubeletVersions() (map[string]uint16, error) +} + +// KubeVersionGetter handles the version-fetching mechanism from external sources +type KubeVersionGetter struct { + client clientset.Interface + w io.Writer +} + +// Make sure KubeVersionGetter implements the VersionGetter interface +var _ VersionGetter = &KubeVersionGetter{} + +// NewKubeVersionGetter returns a new instance of KubeVersionGetter +func NewKubeVersionGetter(client clientset.Interface, writer io.Writer) *KubeVersionGetter { + return &KubeVersionGetter{ + client: client, + w: writer, + } +} + +// ClusterVersion gets API server version +func (g *KubeVersionGetter) ClusterVersion() (string, *versionutil.Version, error) { + fmt.Fprintf(g.w, "[upgrade/versions] Cluster version: ") + fmt.Fprintln(g.w, "v1.7.0") + + return "v1.7.0", versionutil.MustParseSemantic("v1.7.0"), nil +} + +// KubeadmVersion gets kubeadm version +func (g *KubeVersionGetter) KubeadmVersion() (string, *versionutil.Version, error) { + fmt.Fprintf(g.w, "[upgrade/versions] kubeadm version: %s\n", "v1.8.0") + + return "v1.8.0", versionutil.MustParseSemantic("v1.8.0"), nil +} + +// VersionFromCILabel resolves different labels like "stable" to action semver versions using the Kubernetes CI uploads to GCS +func (g *KubeVersionGetter) VersionFromCILabel(_, _ string) (string, *versionutil.Version, error) { + return "v1.8.1", versionutil.MustParseSemantic("v1.8.0"), nil +} + +// KubeletVersions gets the versions of the kubelets in the cluster +func (g *KubeVersionGetter) KubeletVersions() (map[string]uint16, error) { + // This tells kubeadm that there are two nodes in the cluster; both on the v1.7.1 version currently + return map[string]uint16{ + "v1.7.1": 2, + }, nil +} From f9c3148af5096292b3196472d1e85db1177c1457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Fri, 25 Aug 2017 14:00:39 +0300 Subject: [PATCH 312/403] Add unit tests for kubeadm upgrade|plan --- cmd/kubeadm/app/cmd/upgrade/apply_test.go | 194 ++++++++++++ cmd/kubeadm/app/cmd/upgrade/common_test.go | 124 ++++++++ cmd/kubeadm/app/cmd/upgrade/plan_test.go | 329 +++++++++++++++++++++ 3 files changed, 647 insertions(+) create mode 100644 cmd/kubeadm/app/cmd/upgrade/apply_test.go create mode 100644 cmd/kubeadm/app/cmd/upgrade/common_test.go create mode 100644 cmd/kubeadm/app/cmd/upgrade/plan_test.go diff --git a/cmd/kubeadm/app/cmd/upgrade/apply_test.go b/cmd/kubeadm/app/cmd/upgrade/apply_test.go new file mode 100644 index 0000000000000..8f8b15845352b --- /dev/null +++ b/cmd/kubeadm/app/cmd/upgrade/apply_test.go @@ -0,0 +1,194 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "reflect" + "testing" + + "k8s.io/kubernetes/pkg/util/version" +) + +func TestSetImplicitFlags(t *testing.T) { + var tests = []struct { + flags *applyFlags + expectedFlags applyFlags + errExpected bool + }{ + { // if not dryRun or force is set; the nonInteractiveMode field should not be touched + flags: &applyFlags{ + newK8sVersionStr: "v1.8.0", + dryRun: false, + force: false, + nonInteractiveMode: false, + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "v1.8.0", + newK8sVersion: version.MustParseSemantic("v1.8.0"), + dryRun: false, + force: false, + nonInteractiveMode: false, + }, + }, + { // if not dryRun or force is set; the nonInteractiveMode field should not be touched + flags: &applyFlags{ + newK8sVersionStr: "v1.8.0", + dryRun: false, + force: false, + nonInteractiveMode: true, + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "v1.8.0", + newK8sVersion: version.MustParseSemantic("v1.8.0"), + dryRun: false, + force: false, + nonInteractiveMode: true, + }, + }, + { // if dryRun or force is set; the nonInteractiveMode field should be set to true + flags: &applyFlags{ + newK8sVersionStr: "v1.8.0", + dryRun: true, + force: false, + nonInteractiveMode: false, + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "v1.8.0", + newK8sVersion: version.MustParseSemantic("v1.8.0"), + dryRun: true, + force: false, + nonInteractiveMode: true, + }, + }, + { // if dryRun or force is set; the nonInteractiveMode field should be set to true + flags: &applyFlags{ + newK8sVersionStr: "v1.8.0", + dryRun: false, + force: true, + nonInteractiveMode: false, + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "v1.8.0", + newK8sVersion: version.MustParseSemantic("v1.8.0"), + dryRun: false, + force: true, + nonInteractiveMode: true, + }, + }, + { // if dryRun or force is set; the nonInteractiveMode field should be set to true + flags: &applyFlags{ + newK8sVersionStr: "v1.8.0", + dryRun: true, + force: true, + nonInteractiveMode: false, + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "v1.8.0", + newK8sVersion: version.MustParseSemantic("v1.8.0"), + dryRun: true, + force: true, + nonInteractiveMode: true, + }, + }, + { // if dryRun or force is set; the nonInteractiveMode field should be set to true + flags: &applyFlags{ + newK8sVersionStr: "v1.8.0", + dryRun: true, + force: true, + nonInteractiveMode: true, + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "v1.8.0", + newK8sVersion: version.MustParseSemantic("v1.8.0"), + dryRun: true, + force: true, + nonInteractiveMode: true, + }, + }, + { // if the new version is empty; it should error out + flags: &applyFlags{ + newK8sVersionStr: "", + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "", + }, + errExpected: true, + }, + { // if the new version is invalid; it should error out + flags: &applyFlags{ + newK8sVersionStr: "foo", + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "foo", + }, + errExpected: true, + }, + { // if the new version is valid but without the "v" prefix; it parse and prepend v + flags: &applyFlags{ + newK8sVersionStr: "1.8.0", + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "v1.8.0", + newK8sVersion: version.MustParseSemantic("v1.8.0"), + }, + errExpected: false, + }, + { // valid version should succeed + flags: &applyFlags{ + newK8sVersionStr: "v1.8.1", + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "v1.8.1", + newK8sVersion: version.MustParseSemantic("v1.8.1"), + }, + errExpected: false, + }, + { // valid version should succeed + flags: &applyFlags{ + newK8sVersionStr: "1.8.0-alpha.3", + }, + expectedFlags: applyFlags{ + newK8sVersionStr: "v1.8.0-alpha.3", + newK8sVersion: version.MustParseSemantic("v1.8.0-alpha.3"), + }, + errExpected: false, + }, + } + for _, rt := range tests { + actualErr := SetImplicitFlags(rt.flags) + + // If an error was returned; make newK8sVersion nil so it's easy to match using reflect.DeepEqual later (instead of a random pointer) + if actualErr != nil { + rt.flags.newK8sVersion = nil + } + + if !reflect.DeepEqual(*rt.flags, rt.expectedFlags) { + t.Errorf( + "failed SetImplicitFlags:\n\texpected flags: %v\n\t actual: %v", + rt.expectedFlags, + *rt.flags, + ) + } + if (actualErr != nil) != rt.errExpected { + t.Errorf( + "failed SetImplicitFlags:\n\texpected error: %t\n\t actual: %t", + rt.errExpected, + (actualErr != nil), + ) + } + } +} diff --git a/cmd/kubeadm/app/cmd/upgrade/common_test.go b/cmd/kubeadm/app/cmd/upgrade/common_test.go new file mode 100644 index 0000000000000..4bf791d3009b5 --- /dev/null +++ b/cmd/kubeadm/app/cmd/upgrade/common_test.go @@ -0,0 +1,124 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "bytes" + "testing" + + kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" +) + +func TestPrintConfiguration(t *testing.T) { + var tests = []struct { + cfg *kubeadmapiext.MasterConfiguration + buf *bytes.Buffer + expectedBytes []byte + }{ + { + cfg: nil, + expectedBytes: []byte(""), + }, + { + cfg: &kubeadmapiext.MasterConfiguration{ + KubernetesVersion: "v1.7.1", + }, + expectedBytes: []byte(`[upgrade/config] Configuration used: + api: + advertiseAddress: "" + bindPort: 0 + apiServerCertSANs: null + apiServerExtraArgs: null + authorizationModes: null + certificatesDir: "" + cloudProvider: "" + controllerManagerExtraArgs: null + etcd: + caFile: "" + certFile: "" + dataDir: "" + endpoints: null + extraArgs: null + image: "" + keyFile: "" + featureFlags: null + imageRepository: "" + kubernetesVersion: v1.7.1 + networking: + dnsDomain: "" + podSubnet: "" + serviceSubnet: "" + nodeName: "" + schedulerExtraArgs: null + token: "" + tokenTTL: 0 + unifiedControlPlaneImage: "" +`), + }, + { + cfg: &kubeadmapiext.MasterConfiguration{ + KubernetesVersion: "v1.7.1", + Networking: kubeadmapiext.Networking{ + ServiceSubnet: "10.96.0.1/12", + }, + }, + expectedBytes: []byte(`[upgrade/config] Configuration used: + api: + advertiseAddress: "" + bindPort: 0 + apiServerCertSANs: null + apiServerExtraArgs: null + authorizationModes: null + certificatesDir: "" + cloudProvider: "" + controllerManagerExtraArgs: null + etcd: + caFile: "" + certFile: "" + dataDir: "" + endpoints: null + extraArgs: null + image: "" + keyFile: "" + featureFlags: null + imageRepository: "" + kubernetesVersion: v1.7.1 + networking: + dnsDomain: "" + podSubnet: "" + serviceSubnet: 10.96.0.1/12 + nodeName: "" + schedulerExtraArgs: null + token: "" + tokenTTL: 0 + unifiedControlPlaneImage: "" +`), + }, + } + for _, rt := range tests { + rt.buf = bytes.NewBufferString("") + printConfiguration(rt.cfg, rt.buf) + actualBytes := rt.buf.Bytes() + if !bytes.Equal(actualBytes, rt.expectedBytes) { + t.Errorf( + "failed PrintConfiguration:\n\texpected: %q\n\t actual: %q", + string(rt.expectedBytes), + string(actualBytes), + ) + } + } +} diff --git a/cmd/kubeadm/app/cmd/upgrade/plan_test.go b/cmd/kubeadm/app/cmd/upgrade/plan_test.go new file mode 100644 index 0000000000000..bddef5c393cef --- /dev/null +++ b/cmd/kubeadm/app/cmd/upgrade/plan_test.go @@ -0,0 +1,329 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package upgrade + +import ( + "bytes" + "reflect" + "testing" + + "k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade" +) + +func TestSortedSliceFromStringIntMap(t *testing.T) { + var tests = []struct { + strMap map[string]uint16 + expectedSlice []string + }{ // The returned slice should be alphabetically sorted based on the string keys in the map + { + strMap: map[string]uint16{"foo": 1, "bar": 2}, + expectedSlice: []string{"bar", "foo"}, + }, + { // The int value should not affect this func + strMap: map[string]uint16{"foo": 2, "bar": 1}, + expectedSlice: []string{"bar", "foo"}, + }, + { + strMap: map[string]uint16{"b": 2, "a": 1, "cb": 0, "ca": 1000}, + expectedSlice: []string{"a", "b", "ca", "cb"}, + }, + { // This should work for version numbers as well; and the lowest version should come first + strMap: map[string]uint16{"v1.7.0": 1, "v1.6.1": 1, "v1.6.2": 1, "v1.8.0": 1, "v1.8.0-alpha.1": 1}, + expectedSlice: []string{"v1.6.1", "v1.6.2", "v1.7.0", "v1.8.0", "v1.8.0-alpha.1"}, + }, + } + for _, rt := range tests { + actualSlice := sortedSliceFromStringIntMap(rt.strMap) + if !reflect.DeepEqual(actualSlice, rt.expectedSlice) { + t.Errorf( + "failed SortedSliceFromStringIntMap:\n\texpected: %v\n\t actual: %v", + rt.expectedSlice, + actualSlice, + ) + } + } +} + +// TODO Think about modifying this test to be less verbose checking b/c it can be brittle. +func TestPrintAvailableUpgrades(t *testing.T) { + var tests = []struct { + upgrades []upgrade.Upgrade + buf *bytes.Buffer + expectedBytes []byte + }{ + { + upgrades: []upgrade.Upgrade{}, + expectedBytes: []byte(`Awesome, you're up-to-date! Enjoy! +`), + }, + { + upgrades: []upgrade.Upgrade{ + { + Description: "version in the v1.7 series", + Before: upgrade.ClusterState{ + KubeVersion: "v1.7.1", + KubeletVersions: map[string]uint16{ + "v1.7.1": 1, + }, + KubeadmVersion: "v1.7.2", + DNSVersion: "1.14.4", + }, + After: upgrade.ClusterState{ + KubeVersion: "v1.7.3", + KubeadmVersion: "v1.7.3", + DNSVersion: "1.14.4", + }, + }, + }, + expectedBytes: []byte(`Components that must be upgraded manually after you've upgraded the control plane with 'kubeadm upgrade apply': +COMPONENT CURRENT AVAILABLE +Kubelet 1 x v1.7.1 v1.7.3 + +Upgrade to the latest version in the v1.7 series: + +COMPONENT CURRENT AVAILABLE +API Server v1.7.1 v1.7.3 +Controller Manager v1.7.1 v1.7.3 +Scheduler v1.7.1 v1.7.3 +Kube Proxy v1.7.1 v1.7.3 +Kube DNS 1.14.4 1.14.4 + +You can now apply the upgrade by executing the following command: + + kubeadm upgrade apply v1.7.3 + +Note: Before you do can perform this upgrade, you have to update kubeadm to v1.7.3 + +_____________________________________________________________________ + +`), + }, + { + upgrades: []upgrade.Upgrade{ + { + Description: "stable version", + Before: upgrade.ClusterState{ + KubeVersion: "v1.7.3", + KubeletVersions: map[string]uint16{ + "v1.7.3": 1, + }, + KubeadmVersion: "v1.8.0", + DNSVersion: "1.14.4", + }, + After: upgrade.ClusterState{ + KubeVersion: "v1.8.0", + KubeadmVersion: "v1.8.0", + DNSVersion: "1.14.4", + }, + }, + }, + expectedBytes: []byte(`Components that must be upgraded manually after you've upgraded the control plane with 'kubeadm upgrade apply': +COMPONENT CURRENT AVAILABLE +Kubelet 1 x v1.7.3 v1.8.0 + +Upgrade to the latest stable version: + +COMPONENT CURRENT AVAILABLE +API Server v1.7.3 v1.8.0 +Controller Manager v1.7.3 v1.8.0 +Scheduler v1.7.3 v1.8.0 +Kube Proxy v1.7.3 v1.8.0 +Kube DNS 1.14.4 1.14.4 + +You can now apply the upgrade by executing the following command: + + kubeadm upgrade apply v1.8.0 + +_____________________________________________________________________ + +`), + }, + { + upgrades: []upgrade.Upgrade{ + { + Description: "version in the v1.7 series", + Before: upgrade.ClusterState{ + KubeVersion: "v1.7.3", + KubeletVersions: map[string]uint16{ + "v1.7.3": 1, + }, + KubeadmVersion: "v1.8.1", + DNSVersion: "1.14.4", + }, + After: upgrade.ClusterState{ + KubeVersion: "v1.7.5", + KubeadmVersion: "v1.8.1", + DNSVersion: "1.14.4", + }, + }, + { + Description: "stable version", + Before: upgrade.ClusterState{ + KubeVersion: "v1.7.3", + KubeletVersions: map[string]uint16{ + "v1.7.3": 1, + }, + KubeadmVersion: "v1.8.1", + DNSVersion: "1.14.4", + }, + After: upgrade.ClusterState{ + KubeVersion: "v1.8.2", + KubeadmVersion: "v1.8.2", + DNSVersion: "1.14.4", + }, + }, + }, + expectedBytes: []byte(`Components that must be upgraded manually after you've upgraded the control plane with 'kubeadm upgrade apply': +COMPONENT CURRENT AVAILABLE +Kubelet 1 x v1.7.3 v1.7.5 + +Upgrade to the latest version in the v1.7 series: + +COMPONENT CURRENT AVAILABLE +API Server v1.7.3 v1.7.5 +Controller Manager v1.7.3 v1.7.5 +Scheduler v1.7.3 v1.7.5 +Kube Proxy v1.7.3 v1.7.5 +Kube DNS 1.14.4 1.14.4 + +You can now apply the upgrade by executing the following command: + + kubeadm upgrade apply v1.7.5 + +_____________________________________________________________________ + +Components that must be upgraded manually after you've upgraded the control plane with 'kubeadm upgrade apply': +COMPONENT CURRENT AVAILABLE +Kubelet 1 x v1.7.3 v1.8.2 + +Upgrade to the latest stable version: + +COMPONENT CURRENT AVAILABLE +API Server v1.7.3 v1.8.2 +Controller Manager v1.7.3 v1.8.2 +Scheduler v1.7.3 v1.8.2 +Kube Proxy v1.7.3 v1.8.2 +Kube DNS 1.14.4 1.14.4 + +You can now apply the upgrade by executing the following command: + + kubeadm upgrade apply v1.8.2 + +Note: Before you do can perform this upgrade, you have to update kubeadm to v1.8.2 + +_____________________________________________________________________ + +`), + }, + { + upgrades: []upgrade.Upgrade{ + { + Description: "experimental version", + Before: upgrade.ClusterState{ + KubeVersion: "v1.7.5", + KubeletVersions: map[string]uint16{ + "v1.7.5": 1, + }, + KubeadmVersion: "v1.7.5", + DNSVersion: "1.14.4", + }, + After: upgrade.ClusterState{ + KubeVersion: "v1.8.0-beta.1", + KubeadmVersion: "v1.8.0-beta.1", + DNSVersion: "1.14.4", + }, + }, + }, + expectedBytes: []byte(`Components that must be upgraded manually after you've upgraded the control plane with 'kubeadm upgrade apply': +COMPONENT CURRENT AVAILABLE +Kubelet 1 x v1.7.5 v1.8.0-beta.1 + +Upgrade to the latest experimental version: + +COMPONENT CURRENT AVAILABLE +API Server v1.7.5 v1.8.0-beta.1 +Controller Manager v1.7.5 v1.8.0-beta.1 +Scheduler v1.7.5 v1.8.0-beta.1 +Kube Proxy v1.7.5 v1.8.0-beta.1 +Kube DNS 1.14.4 1.14.4 + +You can now apply the upgrade by executing the following command: + + kubeadm upgrade apply v1.8.0-beta.1 + +Note: Before you do can perform this upgrade, you have to update kubeadm to v1.8.0-beta.1 + +_____________________________________________________________________ + +`), + }, + { + upgrades: []upgrade.Upgrade{ + { + Description: "release candidate version", + Before: upgrade.ClusterState{ + KubeVersion: "v1.7.5", + KubeletVersions: map[string]uint16{ + "v1.7.5": 1, + }, + KubeadmVersion: "v1.7.5", + DNSVersion: "1.14.4", + }, + After: upgrade.ClusterState{ + KubeVersion: "v1.8.0-rc.1", + KubeadmVersion: "v1.8.0-rc.1", + DNSVersion: "1.14.4", + }, + }, + }, + expectedBytes: []byte(`Components that must be upgraded manually after you've upgraded the control plane with 'kubeadm upgrade apply': +COMPONENT CURRENT AVAILABLE +Kubelet 1 x v1.7.5 v1.8.0-rc.1 + +Upgrade to the latest release candidate version: + +COMPONENT CURRENT AVAILABLE +API Server v1.7.5 v1.8.0-rc.1 +Controller Manager v1.7.5 v1.8.0-rc.1 +Scheduler v1.7.5 v1.8.0-rc.1 +Kube Proxy v1.7.5 v1.8.0-rc.1 +Kube DNS 1.14.4 1.14.4 + +You can now apply the upgrade by executing the following command: + + kubeadm upgrade apply v1.8.0-rc.1 + +Note: Before you do can perform this upgrade, you have to update kubeadm to v1.8.0-rc.1 + +_____________________________________________________________________ + +`), + }, + } + for _, rt := range tests { + rt.buf = bytes.NewBufferString("") + printAvailableUpgrades(rt.upgrades, rt.buf) + actualBytes := rt.buf.Bytes() + if !bytes.Equal(actualBytes, rt.expectedBytes) { + t.Errorf( + "failed PrintAvailableUpgrades:\n\texpected: %q\n\t actual: %q", + string(rt.expectedBytes), + string(actualBytes), + ) + } + } +} From e4c58a3c029476fb874976c163f5d768a7b67001 Mon Sep 17 00:00:00 2001 From: Klaus Ma Date: Fri, 25 Aug 2017 19:13:41 +0800 Subject: [PATCH 313/403] Added test case for Predicates. --- pkg/controller/daemon/BUILD | 2 + .../daemon/daemon_controller_test.go | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/pkg/controller/daemon/BUILD b/pkg/controller/daemon/BUILD index acf6eb0d66ef6..29d9999169b00 100644 --- a/pkg/controller/daemon/BUILD +++ b/pkg/controller/daemon/BUILD @@ -72,6 +72,8 @@ go_test( "//pkg/securitycontext:go_default_library", "//pkg/util/labels:go_default_library", "//plugin/pkg/scheduler/algorithm:go_default_library", + "//plugin/pkg/scheduler/algorithm/predicates:go_default_library", + "//plugin/pkg/scheduler/schedulercache:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", diff --git a/pkg/controller/daemon/daemon_controller_test.go b/pkg/controller/daemon/daemon_controller_test.go index 097f4cc1a2389..a708a4b997927 100644 --- a/pkg/controller/daemon/daemon_controller_test.go +++ b/pkg/controller/daemon/daemon_controller_test.go @@ -47,6 +47,8 @@ import ( "k8s.io/kubernetes/pkg/securitycontext" labelsutil "k8s.io/kubernetes/pkg/util/labels" "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm" + "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates" + "k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache" ) var ( @@ -2172,3 +2174,57 @@ func getQueuedKeys(queue workqueue.RateLimitingInterface) []string { sort.Strings(keys) return keys } + +func TestPredicates(t *testing.T) { + type args struct { + pod *v1.Pod + node *v1.Node + } + tests := []struct { + name string + args args + want bool + wantRes []algorithm.PredicateFailureReason + wantErr bool + }{ + { + name: "retrun OutOfDiskErr if outOfDisk", + args: args{ + pod: newPod("pod1-", "node-0", nil, nil), + node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node-0", + }, + Status: v1.NodeStatus{ + Conditions: []v1.NodeCondition{ + {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}, + }, + Allocatable: v1.ResourceList{ + v1.ResourcePods: resource.MustParse("100"), + }, + }, + }, + }, + want: false, + wantRes: []algorithm.PredicateFailureReason{predicates.ErrNodeOutOfDisk}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + nodeInfo := schedulercache.NewNodeInfo(tt.args.pod) + nodeInfo.SetNode(tt.args.node) + + got, res, err := Predicates(tt.args.pod, nodeInfo) + if (err != nil) != tt.wantErr { + t.Errorf("%s (error): error = %v, wantErr %v", tt.name, err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("%s (fit): got = %v, want %v", tt.name, got, tt.want) + } + if !reflect.DeepEqual(res, tt.wantRes) { + t.Errorf("%s (reasons): got = %v, want %v", tt.name, res, tt.wantRes) + } + }) + } +} From 734be0c49f3d283ec086c9aef2dc63142b481c19 Mon Sep 17 00:00:00 2001 From: Slava Semushin Date: Tue, 20 Jun 2017 13:22:07 +0200 Subject: [PATCH 314/403] Fix benchmarks to really test reverse order of the keys. --- .../pkg/storage/value/encrypt/aes/aes_test.go | 24 +++++++++---------- .../value/encrypt/secretbox/secretbox_test.go | 12 +++++----- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes/aes_test.go b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes/aes_test.go index 167d6d8a98477..cb87f27b574dc 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes/aes_test.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/aes/aes_test.go @@ -158,7 +158,7 @@ func BenchmarkGCMWrite_16_1024(b *testing.B) { benchmarkGCMWrite(b, 16, 1024) } func BenchmarkGCMWrite_32_1024(b *testing.B) { benchmarkGCMWrite(b, 32, 1024) } func BenchmarkGCMWrite_32_16384(b *testing.B) { benchmarkGCMWrite(b, 32, 16384) } -func benchmarkGCMRead(b *testing.B, keyLength int, valueLength int, stale bool) { +func benchmarkGCMRead(b *testing.B, keyLength int, valueLength int, expectStale bool) { block1, err := aes.NewCipher(bytes.Repeat([]byte("a"), keyLength)) if err != nil { b.Fatal(err) @@ -179,11 +179,11 @@ func benchmarkGCMRead(b *testing.B, keyLength int, valueLength int, stale bool) if err != nil { b.Fatal(err) } - // reverse the key order if stale - if stale { + // reverse the key order if expecting stale + if expectStale { p = value.NewPrefixTransformers(nil, - value.PrefixTransformer{Prefix: []byte("first:"), Transformer: NewGCMTransformer(block1)}, value.PrefixTransformer{Prefix: []byte("second:"), Transformer: NewGCMTransformer(block2)}, + value.PrefixTransformer{Prefix: []byte("first:"), Transformer: NewGCMTransformer(block1)}, ) } @@ -193,8 +193,8 @@ func benchmarkGCMRead(b *testing.B, keyLength int, valueLength int, stale bool) if err != nil { b.Fatal(err) } - if stale { - b.Fatalf("unexpected data: %t %q", stale, from) + if expectStale != stale { + b.Fatalf("unexpected data: %q, expect stale %t but got %t", from, expectStale, stale) } } b.StopTimer() @@ -234,7 +234,7 @@ func BenchmarkCBCRead_32_16384_Stale(b *testing.B) { benchmarkCBCRead(b, 32, 163 func BenchmarkCBCWrite_32_1024(b *testing.B) { benchmarkCBCWrite(b, 32, 1024) } func BenchmarkCBCWrite_32_16384(b *testing.B) { benchmarkCBCWrite(b, 32, 16384) } -func benchmarkCBCRead(b *testing.B, keyLength int, valueLength int, stale bool) { +func benchmarkCBCRead(b *testing.B, keyLength int, valueLength int, expectStale bool) { block1, err := aes.NewCipher(bytes.Repeat([]byte("a"), keyLength)) if err != nil { b.Fatal(err) @@ -255,11 +255,11 @@ func benchmarkCBCRead(b *testing.B, keyLength int, valueLength int, stale bool) if err != nil { b.Fatal(err) } - // reverse the key order if stale - if stale { + // reverse the key order if expecting stale + if expectStale { p = value.NewPrefixTransformers(nil, - value.PrefixTransformer{Prefix: []byte("first:"), Transformer: NewCBCTransformer(block1)}, value.PrefixTransformer{Prefix: []byte("second:"), Transformer: NewCBCTransformer(block2)}, + value.PrefixTransformer{Prefix: []byte("first:"), Transformer: NewCBCTransformer(block1)}, ) } @@ -269,8 +269,8 @@ func benchmarkCBCRead(b *testing.B, keyLength int, valueLength int, stale bool) if err != nil { b.Fatal(err) } - if stale { - b.Fatalf("unexpected data: %t %q", stale, from) + if expectStale != stale { + b.Fatalf("unexpected data: %q, expect stale %t but got %t", from, expectStale, stale) } } b.StopTimer() diff --git a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/secretbox_test.go b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/secretbox_test.go index 9e9ae2f5aa200..1dd42bd4da3ab 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/secretbox_test.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/secretbox/secretbox_test.go @@ -84,7 +84,7 @@ func BenchmarkSecretboxRead_32_16384_Stale(b *testing.B) { benchmarkSecretboxRea func BenchmarkSecretboxWrite_32_1024(b *testing.B) { benchmarkSecretboxWrite(b, 32, 1024) } func BenchmarkSecretboxWrite_32_16384(b *testing.B) { benchmarkSecretboxWrite(b, 32, 16384) } -func benchmarkSecretboxRead(b *testing.B, keyLength int, valueLength int, stale bool) { +func benchmarkSecretboxRead(b *testing.B, keyLength int, valueLength int, expectStale bool) { p := value.NewPrefixTransformers(nil, value.PrefixTransformer{Prefix: []byte("first:"), Transformer: NewSecretboxTransformer(key1)}, value.PrefixTransformer{Prefix: []byte("second:"), Transformer: NewSecretboxTransformer(key2)}, @@ -97,11 +97,11 @@ func benchmarkSecretboxRead(b *testing.B, keyLength int, valueLength int, stale if err != nil { b.Fatal(err) } - // reverse the key order if stale - if stale { + // reverse the key order if expecting stale + if expectStale { p = value.NewPrefixTransformers(nil, - value.PrefixTransformer{Prefix: []byte("first:"), Transformer: NewSecretboxTransformer(key1)}, value.PrefixTransformer{Prefix: []byte("second:"), Transformer: NewSecretboxTransformer(key2)}, + value.PrefixTransformer{Prefix: []byte("first:"), Transformer: NewSecretboxTransformer(key1)}, ) } @@ -111,8 +111,8 @@ func benchmarkSecretboxRead(b *testing.B, keyLength int, valueLength int, stale if err != nil { b.Fatal(err) } - if stale { - b.Fatalf("unexpected data: %t %q", stale, from) + if expectStale != stale { + b.Fatalf("unexpected data: %q, expect stale %t but got %t", from, expectStale, stale) } } b.StopTimer() From 396a33dd8fe112454652cdbf8618c8671c18c42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Fri, 25 Aug 2017 17:23:17 +0300 Subject: [PATCH 315/403] autogenerated bazel --- cmd/kubeadm/app/cmd/phases/selfhosting.go | 2 +- cmd/kubeadm/app/cmd/upgrade/BUILD | 55 +++++++++++++++++++++++ cmd/kubeadm/app/phases/upgrade/BUILD | 36 +++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 cmd/kubeadm/app/cmd/upgrade/BUILD create mode 100644 cmd/kubeadm/app/phases/upgrade/BUILD diff --git a/cmd/kubeadm/app/cmd/phases/selfhosting.go b/cmd/kubeadm/app/cmd/phases/selfhosting.go index f7b20b69a3ea7..09b3b2483658c 100644 --- a/cmd/kubeadm/app/cmd/phases/selfhosting.go +++ b/cmd/kubeadm/app/cmd/phases/selfhosting.go @@ -23,13 +23,13 @@ import ( kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" "k8s.io/kubernetes/cmd/kubeadm/app/features" "k8s.io/kubernetes/cmd/kubeadm/app/phases/selfhosting" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" "k8s.io/kubernetes/pkg/api" - cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" ) // NewCmdSelfhosting returns the self-hosting Cobra command diff --git a/cmd/kubeadm/app/cmd/upgrade/BUILD b/cmd/kubeadm/app/cmd/upgrade/BUILD new file mode 100644 index 0000000000000..dc34c1134b00e --- /dev/null +++ b/cmd/kubeadm/app/cmd/upgrade/BUILD @@ -0,0 +1,55 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "apply.go", + "common.go", + "plan.go", + "upgrade.go", + ], + visibility = ["//visibility:public"], + deps = [ + "//cmd/kubeadm/app/apis/kubeadm:go_default_library", + "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", + "//cmd/kubeadm/app/cmd/util:go_default_library", + "//cmd/kubeadm/app/phases/upgrade:go_default_library", + "//cmd/kubeadm/app/preflight:go_default_library", + "//cmd/kubeadm/app/util:go_default_library", + "//cmd/kubeadm/app/util/kubeconfig:go_default_library", + "//pkg/api:go_default_library", + "//pkg/util/version:go_default_library", + "//vendor/github.com/ghodss/yaml:go_default_library", + "//vendor/github.com/spf13/cobra:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "apply_test.go", + "common_test.go", + "plan_test.go", + ], + library = ":go_default_library", + deps = [ + "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", + "//cmd/kubeadm/app/phases/upgrade:go_default_library", + "//pkg/util/version:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cmd/kubeadm/app/phases/upgrade/BUILD b/cmd/kubeadm/app/phases/upgrade/BUILD new file mode 100644 index 0000000000000..ae4a84b4a547c --- /dev/null +++ b/cmd/kubeadm/app/phases/upgrade/BUILD @@ -0,0 +1,36 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "compute.go", + "configuration.go", + "health.go", + "policy.go", + "postupgrade.go", + "staticpods.go", + "versiongetter.go", + ], + visibility = ["//visibility:public"], + deps = [ + "//cmd/kubeadm/app/apis/kubeadm:go_default_library", + "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", + "//pkg/api:go_default_library", + "//pkg/util/version:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) From 79d2b1dd4e30e59c5ab559992e0046a672880c0f Mon Sep 17 00:00:00 2001 From: FengyunPan Date: Fri, 25 Aug 2017 23:08:00 +0800 Subject: [PATCH 316/403] Implement GetZoneByProviderID and GetZoneByNodeName for openstack This is part of #50926 cc @wlan0 --- .../providers/openstack/openstack.go | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/pkg/cloudprovider/providers/openstack/openstack.go b/pkg/cloudprovider/providers/openstack/openstack.go index e794afebbb103..0233892321a13 100644 --- a/pkg/cloudprovider/providers/openstack/openstack.go +++ b/pkg/cloudprovider/providers/openstack/openstack.go @@ -49,7 +49,10 @@ import ( "k8s.io/kubernetes/pkg/controller" ) -const ProviderName = "openstack" +const ( + ProviderName = "openstack" + AvailabilityZone = "availability_zone" +) var ErrNotFound = errors.New("Failed to find object") var ErrMultipleResults = errors.New("Multiple results where only one expected") @@ -534,6 +537,7 @@ func (os *OpenStack) Zones() (cloudprovider.Zones, bool) { return os, true } + func (os *OpenStack) GetZone() (cloudprovider.Zone, error) { md, err := getMetadata() if err != nil { @@ -553,14 +557,54 @@ func (os *OpenStack) GetZone() (cloudprovider.Zone, error) { // This is particularly useful in external cloud providers where the kubelet // does not initialize node data. func (os *OpenStack) GetZoneByProviderID(providerID string) (cloudprovider.Zone, error) { - return cloudprovider.Zone{}, errors.New("GetZoneByProviderID not implemented") + instanceID, err := instanceIDFromProviderID(providerID) + if err != nil { + return cloudprovider.Zone{}, err + } + + compute, err := os.NewComputeV2() + if err != nil { + return cloudprovider.Zone{}, err + } + + srv, err := servers.Get(compute, instanceID).Extract() + if err != nil { + return cloudprovider.Zone{}, err + } + + zone := cloudprovider.Zone{ + FailureDomain: srv.Metadata[AvailabilityZone], + Region: os.region, + } + glog.V(4).Infof("The instance %s in zone %v", srv.Name, zone) + + return zone, nil } // GetZoneByNodeName implements Zones.GetZoneByNodeName // This is particularly useful in external cloud providers where the kubelet // does not initialize node data. func (os *OpenStack) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Zone, error) { - return cloudprovider.Zone{}, errors.New("GetZoneByNodeName not imeplemented") + compute, err := os.NewComputeV2() + if err != nil { + return cloudprovider.Zone{}, err + } + + srv, err := getServerByName(compute, nodeName) + if err != nil { + if err == ErrNotFound { + return cloudprovider.Zone{}, cloudprovider.InstanceNotFound + } + return cloudprovider.Zone{}, err + } + + zone := cloudprovider.Zone{ + FailureDomain: srv.Metadata[AvailabilityZone], + Region: os.region, + } + glog.V(4).Infof("The instance %s in zone %v", srv.Name, zone) + + return zone, nil } func (os *OpenStack) Routes() (cloudprovider.Routes, bool) { From 96c6bc5d91b8d856708080496731eb1be372a93d Mon Sep 17 00:00:00 2001 From: devinyan Date: Fri, 25 Aug 2017 23:16:05 +0800 Subject: [PATCH 317/403] modify an little gammer error. --- cmd/cloud-controller-manager/controller-manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/cloud-controller-manager/controller-manager.go b/cmd/cloud-controller-manager/controller-manager.go index 49f793294b5c8..b8f2425676bc4 100644 --- a/cmd/cloud-controller-manager/controller-manager.go +++ b/cmd/cloud-controller-manager/controller-manager.go @@ -65,7 +65,7 @@ func main() { if s.AllowUntaggedCloud == true { glog.Warning("detected a cluster without a ClusterID. A ClusterID will be required in the future. Please tag your cluster to avoid any future issues") } else { - glog.Fatalf("no ClusterID Found. A ClusterID is required for the cloud provider to function properly. This check can be bypassed by setting the allow-untagged-cloud option") + glog.Fatalf("no ClusterID found. A ClusterID is required for the cloud provider to function properly. This check can be bypassed by setting the allow-untagged-cloud option") } } From 0028385e20a1b4e9c6e0dacb7bc299c2409a9613 Mon Sep 17 00:00:00 2001 From: Nick Sardo Date: Thu, 24 Aug 2017 11:06:42 -0700 Subject: [PATCH 318/403] Consume new config value for network project id --- pkg/cloudprovider/providers/gce/gce.go | 156 +++++--- .../providers/gce/gce_firewall.go | 14 +- .../gce/gce_loadbalancer_external.go | 4 +- pkg/cloudprovider/providers/gce/gce_op.go | 34 +- pkg/cloudprovider/providers/gce/gce_routes.go | 14 +- pkg/cloudprovider/providers/gce/gce_test.go | 336 ++++++++---------- test/e2e/e2e.go | 4 +- 7 files changed, 304 insertions(+), 258 deletions(-) diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index c11c961d2d01f..14cefb31eb40a 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -144,42 +144,51 @@ type GCEServiceManager struct { gce *GCECloud } +type ConfigGlobal struct { + TokenURL string `gcfg:"token-url"` + TokenBody string `gcfg:"token-body"` + // ProjectID and NetworkProjectID can either be the numeric or string-based + // unique identifier that starts with [a-z]. + ProjectID string `gcfg:"project-id"` + // NetworkProjectID refers to the project which owns the network being used. + NetworkProjectID string `gcfg:"network-project-id"` + NetworkName string `gcfg:"network-name"` + SubnetworkName string `gcfg:"subnetwork-name"` + // SecondaryRangeName is the name of the secondary range to allocate IP + // aliases. The secondary range must be present on the subnetwork the + // cluster is attached to. + SecondaryRangeName string `gcfg:"secondary-range-name"` + NodeTags []string `gcfg:"node-tags"` + NodeInstancePrefix string `gcfg:"node-instance-prefix"` + Multizone bool `gcfg:"multizone"` + // ApiEndpoint is the GCE compute API endpoint to use. If this is blank, + // then the default endpoint is used. + ApiEndpoint string `gcfg:"api-endpoint"` + // LocalZone specifies the GCE zone that gce cloud client instance is + // located in (i.e. where the controller will be running). If this is + // blank, then the local zone will be discovered via the metadata server. + LocalZone string `gcfg:"local-zone"` + // Possible values: List of api names separated by comma. Default to none. + // For example: MyFeatureFlag + AlphaFeatures []string `gcfg:"alpha-features"` +} + // ConfigFile is the struct used to parse the /etc/gce.conf configuration file. type ConfigFile struct { - Global struct { - TokenURL string `gcfg:"token-url"` - TokenBody string `gcfg:"token-body"` - ProjectID string `gcfg:"project-id"` - NetworkName string `gcfg:"network-name"` - SubnetworkName string `gcfg:"subnetwork-name"` - // SecondaryRangeName is the name of the secondary range to allocate IP - // aliases. The secondary range must be present on the subnetwork the - // cluster is attached to. - SecondaryRangeName string `gcfg:"secondary-range-name"` - NodeTags []string `gcfg:"node-tags"` - NodeInstancePrefix string `gcfg:"node-instance-prefix"` - Multizone bool `gcfg:"multizone"` - // ApiEndpoint is the GCE compute API endpoint to use. If this is blank, - // then the default endpoint is used. - ApiEndpoint string `gcfg:"api-endpoint"` - // LocalZone specifies the GCE zone that gce cloud client instance is - // located in (i.e. where the controller will be running). If this is - // blank, then the local zone will be discovered via the metadata server. - LocalZone string `gcfg:"local-zone"` - // AlphaFeatures is a list of API flags to be enabled. Defaults to none. - // Example API name format: "MyFeatureFlag" - AlphaFeatures []string `gcfg:"alpha-features"` - } + Global ConfigGlobal `gcfg:"global"` } // CloudConfig includes all the necessary configuration for creating GCECloud type CloudConfig struct { ApiEndpoint string ProjectID string + NetworkProjectID string Region string Zone string ManagedZones []string + NetworkName string NetworkURL string + SubnetworkName string SubnetworkURL string SecondaryRangeName string NodeTags []string @@ -207,11 +216,6 @@ func (g *GCECloud) GetKMSService() *cloudkms.Service { return g.cloudkmsService } -// Returns the ProjectID corresponding to the project this cloud is in. -func (g *GCECloud) GetProjectID() string { - return g.projectID -} - // newGCECloud creates a new instance of GCECloud. func newGCECloud(config io.Reader) (gceCloud *GCECloud, err error) { var cloudConfig *CloudConfig @@ -280,6 +284,7 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err return nil, err } } + if configFile != nil { if configFile.Global.ProjectID != "" { cloudConfig.ProjectID = configFile.Global.ProjectID @@ -287,6 +292,9 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err if configFile.Global.LocalZone != "" { cloudConfig.Zone = configFile.Global.LocalZone } + if configFile.Global.NetworkProjectID != "" { + cloudConfig.NetworkProjectID = configFile.Global.NetworkProjectID + } } // retrieve region @@ -301,27 +309,27 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err cloudConfig.ManagedZones = nil // Use all zones in region } - // generate networkURL + // Determine if network parameter is URL or Name if configFile != nil && configFile.Global.NetworkName != "" { if strings.Contains(configFile.Global.NetworkName, "/") { cloudConfig.NetworkURL = configFile.Global.NetworkName } else { - cloudConfig.NetworkURL = gceNetworkURL(cloudConfig.ApiEndpoint, cloudConfig.ProjectID, configFile.Global.NetworkName) + cloudConfig.NetworkName = configFile.Global.NetworkName } } else { - networkName, err := getNetworkNameViaMetadata() + cloudConfig.NetworkName, err = getNetworkNameViaMetadata() if err != nil { return nil, err } - cloudConfig.NetworkURL = gceNetworkURL("", cloudConfig.ProjectID, networkName) } - // generate subnetworkURL + // Determine if subnetwork parameter is URL or Name + // If cluster is on a GCP network of mode=custom, then `SubnetName` must be specified in config file. if configFile != nil && configFile.Global.SubnetworkName != "" { if strings.Contains(configFile.Global.SubnetworkName, "/") { cloudConfig.SubnetworkURL = configFile.Global.SubnetworkName } else { - cloudConfig.SubnetworkURL = gceSubnetworkURL(cloudConfig.ApiEndpoint, cloudConfig.ProjectID, cloudConfig.Region, configFile.Global.SubnetworkName) + cloudConfig.SubnetworkName = configFile.Global.SubnetworkName } } @@ -332,11 +340,15 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err return cloudConfig, err } -// Creates a GCECloud object using the specified parameters. +// CreateGCECloud creates a GCECloud object using the specified parameters. // If no networkUrl is specified, loads networkName via rest call. // If no tokenSource is specified, uses oauth2.DefaultTokenSource. // If managedZones is nil / empty all zones in the region will be managed. func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { + // Use ProjectID for NetworkProjectID, if it wasn't explicitly set. + if config.NetworkProjectID == "" { + config.NetworkProjectID = config.ProjectID + } client, err := newOauthClient(config.TokenSource) if err != nil { @@ -385,19 +397,49 @@ func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { return nil, err } - if config.NetworkURL == "" { - networkName, err := getNetworkNameViaAPICall(service, config.ProjectID) + // config.ProjectID may be the id or project number + // In gce_routes.go, the generated networkURL is compared with a URL within a route + // therefore, we need to make sure the URL is constructed with the string ID. + projID, err := getProjectID(service, config.ProjectID) + if err != nil { + return nil, fmt.Errorf("failed to get project %v, err: %v", config.ProjectID, err) + } + + // config.NetworkProjectID may be the id or project number. In order to compare project ID + // to network project ID to determine XPN status, we need to verify both are actual IDs. + netProjID := projID + if config.NetworkProjectID != config.ProjectID { + netProjID, err = getProjectID(service, config.NetworkProjectID) + if err != nil { + return nil, fmt.Errorf("failed to get network project %v, err: %v", config.NetworkProjectID, err) + } + } + + onXPN := projID != netProjID + + var networkURL string + var subnetURL string + + if config.NetworkName == "" && config.NetworkURL == "" { + // TODO: Stop using this call and return an error. + // This function returns the first network in a list of networks for a project. The project + // should be set via configuration instead of randomly taking the first. + networkName, err := getNetworkNameViaAPICall(service, config.NetworkProjectID) if err != nil { return nil, err } - config.NetworkURL = gceNetworkURL(config.ApiEndpoint, config.ProjectID, networkName) + networkURL = gceNetworkURL(config.ApiEndpoint, netProjID, networkName) + } else if config.NetworkURL != "" { + networkURL = config.NetworkURL + } else { + networkURL = gceNetworkURL(config.ApiEndpoint, netProjID, config.NetworkName) } - networkProjectID, err := getProjectIDInURL(config.NetworkURL) - if err != nil { - return nil, err + if config.SubnetworkURL != "" { + subnetURL = config.SubnetworkURL + } else if config.SubnetworkName != "" { + subnetURL = gceSubnetworkURL(config.ApiEndpoint, netProjID, config.Region, config.SubnetworkName) } - onXPN := networkProjectID != config.ProjectID if len(config.ManagedZones) == 0 { config.ManagedZones, err = getZonesForRegion(service, config.ProjectID, config.Region) @@ -417,14 +459,14 @@ func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { serviceBeta: serviceBeta, containerService: containerService, cloudkmsService: cloudkmsService, - projectID: config.ProjectID, - networkProjectID: networkProjectID, + projectID: projID, + networkProjectID: netProjID, onXPN: onXPN, region: config.Region, localZone: config.Zone, managedZones: config.ManagedZones, - networkURL: config.NetworkURL, - subnetworkURL: config.SubnetworkURL, + networkURL: networkURL, + subnetworkURL: subnetURL, secondaryRangeName: config.SecondaryRangeName, nodeTags: config.NodeTags, nodeInstancePrefix: config.NodeInstancePrefix, @@ -473,6 +515,16 @@ func (gce *GCECloud) ProviderName() string { return ProviderName } +// ProjectID returns the ProjectID corresponding to the project this cloud is in. +func (g *GCECloud) ProjectID() string { + return g.projectID +} + +// NetworkProjectID returns the ProjectID corresponding to the project this cluster's network is in. +func (g *GCECloud) NetworkProjectID() string { + return g.networkProjectID +} + // Region returns the region func (gce *GCECloud) Region() string { return gce.region @@ -569,6 +621,16 @@ func getNetworkNameViaAPICall(svc *compute.Service, projectID string) (string, e return networkList.Items[0].Name, nil } +// getProjectID returns the project's string ID given a project number or string +func getProjectID(svc *compute.Service, projectNumberOrID string) (string, error) { + proj, err := svc.Projects.Get(projectNumberOrID).Do() + if err != nil { + return "", err + } + + return proj.Name, nil +} + func getZonesForRegion(svc *compute.Service, projectID, region string) ([]string, error) { // TODO: use PageToken to list all not just the first 500 listCall := svc.Zones.List(projectID) diff --git a/pkg/cloudprovider/providers/gce/gce_firewall.go b/pkg/cloudprovider/providers/gce/gce_firewall.go index b08d3f2806743..2e5297275f978 100644 --- a/pkg/cloudprovider/providers/gce/gce_firewall.go +++ b/pkg/cloudprovider/providers/gce/gce_firewall.go @@ -27,38 +27,38 @@ func newFirewallMetricContext(request string) *metricContext { // GetFirewall returns the Firewall by name. func (gce *GCECloud) GetFirewall(name string) (*compute.Firewall, error) { mc := newFirewallMetricContext("get") - v, err := gce.service.Firewalls.Get(gce.projectID, name).Do() + v, err := gce.service.Firewalls.Get(gce.NetworkProjectID(), name).Do() return v, mc.Observe(err) } // CreateFirewall creates the passed firewall func (gce *GCECloud) CreateFirewall(f *compute.Firewall) error { mc := newFirewallMetricContext("create") - op, err := gce.service.Firewalls.Insert(gce.projectID, f).Do() + op, err := gce.service.Firewalls.Insert(gce.NetworkProjectID(), f).Do() if err != nil { return mc.Observe(err) } - return gce.waitForGlobalOp(op, mc) + return gce.waitForGlobalOpInProject(op, gce.NetworkProjectID(), mc) } // DeleteFirewall deletes the given firewall rule. func (gce *GCECloud) DeleteFirewall(name string) error { mc := newFirewallMetricContext("delete") - op, err := gce.service.Firewalls.Delete(gce.projectID, name).Do() + op, err := gce.service.Firewalls.Delete(gce.NetworkProjectID(), name).Do() if err != nil { return mc.Observe(err) } - return gce.waitForGlobalOp(op, mc) + return gce.waitForGlobalOpInProject(op, gce.NetworkProjectID(), mc) } // UpdateFirewall applies the given firewall as an update to an existing service. func (gce *GCECloud) UpdateFirewall(f *compute.Firewall) error { mc := newFirewallMetricContext("update") - op, err := gce.service.Firewalls.Update(gce.projectID, f.Name, f).Do() + op, err := gce.service.Firewalls.Update(gce.NetworkProjectID(), f.Name, f).Do() if err != nil { return mc.Observe(err) } - return gce.waitForGlobalOp(op, mc) + return gce.waitForGlobalOpInProject(op, gce.NetworkProjectID(), mc) } diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go index 37047f6483b2e..129086e77c5e6 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go @@ -729,7 +729,7 @@ func (gce *GCECloud) firewallNeedsUpdate(name, serviceName, region, ipAddress st return false, false, nil } - fw, err := gce.service.Firewalls.Get(gce.projectID, makeFirewallName(name)).Do() + fw, err := gce.service.Firewalls.Get(gce.NetworkProjectID(), makeFirewallName(name)).Do() if err != nil { if isHTTPErrorCode(err, http.StatusNotFound) { return false, true, nil @@ -776,7 +776,7 @@ func (gce *GCECloud) ensureHttpHealthCheckFirewall(serviceName, ipAddress, regio ports := []v1.ServicePort{{Protocol: "tcp", Port: hcPort}} fwName := MakeHealthCheckFirewallName(clusterID, hcName, isNodesHealthCheck) - fw, err := gce.service.Firewalls.Get(gce.projectID, fwName).Do() + fw, err := gce.service.Firewalls.Get(gce.NetworkProjectID(), fwName).Do() if err != nil { if !isHTTPErrorCode(err, http.StatusNotFound) { return fmt.Errorf("error getting firewall for health checks: %v", err) diff --git a/pkg/cloudprovider/providers/gce/gce_op.go b/pkg/cloudprovider/providers/gce/gce_op.go index fc1549d448a8b..b354d79cea706 100644 --- a/pkg/cloudprovider/providers/gce/gce_op.go +++ b/pkg/cloudprovider/providers/gce/gce_op.go @@ -93,62 +93,74 @@ func getErrorFromOp(op *computev1.Operation) error { } func (gce *GCECloud) waitForGlobalOp(op gceObject, mc *metricContext) error { + return gce.waitForGlobalOpInProject(op, gce.ProjectID(), mc) +} + +func (gce *GCECloud) waitForRegionOp(op gceObject, region string, mc *metricContext) error { + return gce.waitForRegionOpInProject(op, gce.ProjectID(), region, mc) +} + +func (gce *GCECloud) waitForZoneOp(op gceObject, zone string, mc *metricContext) error { + return gce.waitForZoneOpInProject(op, gce.ProjectID(), zone, mc) +} + +func (gce *GCECloud) waitForGlobalOpInProject(op gceObject, projectID string, mc *metricContext) error { switch v := op.(type) { case *computealpha.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceAlpha.GlobalOperations.Get(gce.projectID, operationName).Do() + op, err := gce.serviceAlpha.GlobalOperations.Get(projectID, operationName).Do() return convertToV1Operation(op), err }, mc) case *computebeta.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceBeta.GlobalOperations.Get(gce.projectID, operationName).Do() + op, err := gce.serviceBeta.GlobalOperations.Get(projectID, operationName).Do() return convertToV1Operation(op), err }, mc) case *computev1.Operation: return gce.waitForOp(op.(*computev1.Operation), func(operationName string) (*computev1.Operation, error) { - return gce.service.GlobalOperations.Get(gce.projectID, operationName).Do() + return gce.service.GlobalOperations.Get(projectID, operationName).Do() }, mc) default: return fmt.Errorf("unexpected type: %T", v) } } -func (gce *GCECloud) waitForRegionOp(op gceObject, region string, mc *metricContext) error { +func (gce *GCECloud) waitForRegionOpInProject(op gceObject, projectID, region string, mc *metricContext) error { switch v := op.(type) { case *computealpha.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceAlpha.RegionOperations.Get(gce.projectID, region, operationName).Do() + op, err := gce.serviceAlpha.RegionOperations.Get(projectID, region, operationName).Do() return convertToV1Operation(op), err }, mc) case *computebeta.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceBeta.RegionOperations.Get(gce.projectID, region, operationName).Do() + op, err := gce.serviceBeta.RegionOperations.Get(projectID, region, operationName).Do() return convertToV1Operation(op), err }, mc) case *computev1.Operation: return gce.waitForOp(op.(*computev1.Operation), func(operationName string) (*computev1.Operation, error) { - return gce.service.RegionOperations.Get(gce.projectID, region, operationName).Do() + return gce.service.RegionOperations.Get(projectID, region, operationName).Do() }, mc) default: return fmt.Errorf("unexpected type: %T", v) } } -func (gce *GCECloud) waitForZoneOp(op gceObject, zone string, mc *metricContext) error { +func (gce *GCECloud) waitForZoneOpInProject(op gceObject, projectID, zone string, mc *metricContext) error { switch v := op.(type) { case *computealpha.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceAlpha.ZoneOperations.Get(gce.projectID, zone, operationName).Do() + op, err := gce.serviceAlpha.ZoneOperations.Get(projectID, zone, operationName).Do() return convertToV1Operation(op), err }, mc) case *computebeta.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceBeta.ZoneOperations.Get(gce.projectID, zone, operationName).Do() + op, err := gce.serviceBeta.ZoneOperations.Get(projectID, zone, operationName).Do() return convertToV1Operation(op), err }, mc) case *computev1.Operation: return gce.waitForOp(op.(*computev1.Operation), func(operationName string) (*computev1.Operation, error) { - return gce.service.ZoneOperations.Get(gce.projectID, zone, operationName).Do() + return gce.service.ZoneOperations.Get(projectID, zone, operationName).Do() }, mc) default: return fmt.Errorf("unexpected type: %T", v) diff --git a/pkg/cloudprovider/providers/gce/gce_routes.go b/pkg/cloudprovider/providers/gce/gce_routes.go index 5f6459cd1a8ca..87184aef1142c 100644 --- a/pkg/cloudprovider/providers/gce/gce_routes.go +++ b/pkg/cloudprovider/providers/gce/gce_routes.go @@ -38,13 +38,13 @@ func (gce *GCECloud) ListRoutes(clusterName string) ([]*cloudprovider.Route, err page := 0 for ; page == 0 || (pageToken != "" && page < maxPages); page++ { mc := newRoutesMetricContext("list_page") - listCall := gce.service.Routes.List(gce.projectID) + listCall := gce.service.Routes.List(gce.NetworkProjectID()) prefix := truncateClusterName(clusterName) // Filter for routes starting with clustername AND belonging to the // relevant gcp network AND having description = "k8s-node-route". filter := "(name eq " + prefix + "-.*) " - filter = filter + "(network eq " + gce.networkURL + ") " + filter = filter + "(network eq " + gce.NetworkURL() + ") " filter = filter + "(description eq " + k8sNodeRouteTag + ")" listCall = listCall.Filter(filter) if pageToken != "" { @@ -80,11 +80,11 @@ func (gce *GCECloud) CreateRoute(clusterName string, nameHint string, route *clo } mc := newRoutesMetricContext("create") - insertOp, err := gce.service.Routes.Insert(gce.projectID, &compute.Route{ + insertOp, err := gce.service.Routes.Insert(gce.NetworkProjectID(), &compute.Route{ Name: routeName, DestRange: route.DestinationCIDR, NextHopInstance: fmt.Sprintf("zones/%s/instances/%s", targetInstance.Zone, targetInstance.Name), - Network: gce.networkURL, + Network: gce.NetworkURL(), Priority: 1000, Description: k8sNodeRouteTag, }).Do() @@ -96,16 +96,16 @@ func (gce *GCECloud) CreateRoute(clusterName string, nameHint string, route *clo return mc.Observe(err) } } - return gce.waitForGlobalOp(insertOp, mc) + return gce.waitForGlobalOpInProject(insertOp, gce.NetworkProjectID(), mc) } func (gce *GCECloud) DeleteRoute(clusterName string, route *cloudprovider.Route) error { mc := newRoutesMetricContext("delete") - deleteOp, err := gce.service.Routes.Delete(gce.projectID, route.Name).Do() + deleteOp, err := gce.service.Routes.Delete(gce.NetworkProjectID(), route.Name).Do() if err != nil { return mc.Observe(err) } - return gce.waitForGlobalOp(deleteOp, mc) + return gce.waitForGlobalOpInProject(deleteOp, gce.NetworkProjectID(), mc) } func truncateClusterName(clusterName string) string { diff --git a/pkg/cloudprovider/providers/gce/gce_test.go b/pkg/cloudprovider/providers/gce/gce_test.go index d05296fec01ca..cc8a70300b7a3 100644 --- a/pkg/cloudprovider/providers/gce/gce_test.go +++ b/pkg/cloudprovider/providers/gce/gce_test.go @@ -29,6 +29,43 @@ import ( computev1 "google.golang.org/api/compute/v1" ) +func TestReadConfigFile(t *testing.T) { + const s = `[Global] +token-url = my-token-url +token-body = my-token-body +project-id = my-project +network-project-id = my-network-project +network-name = my-network +subnetwork-name = my-subnetwork +secondary-range-name = my-secondary-range +node-tags = my-node-tag1 +node-instance-prefix = my-prefix +multizone = true + ` + reader := strings.NewReader(s) + config, err := readConfig(reader) + if err != nil { + t.Fatalf("Unexpected config parsing error %v", err) + } + + expected := &ConfigFile{Global: ConfigGlobal{ + TokenURL: "my-token-url", + TokenBody: "my-token-body", + ProjectID: "my-project", + NetworkProjectID: "my-network-project", + NetworkName: "my-network", + SubnetworkName: "my-subnetwork", + SecondaryRangeName: "my-secondary-range", + NodeTags: []string{"my-node-tag1"}, + NodeInstancePrefix: "my-prefix", + Multizone: true, + }} + + if !reflect.DeepEqual(expected, config) { + t.Fatalf("Expected config file values to be read into ConfigFile struct. \nExpected:\n%+v\nActual:\n%+v", expected, config) + } +} + func TestExtraKeyInConfig(t *testing.T) { const s = `[Global] project-id = my-project @@ -263,23 +300,8 @@ func TestSplitProviderID(t *testing.T) { } } -type generateConfigParams struct { - TokenURL string - TokenBody string - ProjectID string - NetworkName string - SubnetworkName string - SecondaryRangeName string - NodeTags []string - NodeInstancePrefix string - Multizone bool - ApiEndpoint string - LocalZone string - AlphaFeatures []string -} - -func newGenerateConfigDefaults() *generateConfigParams { - return &generateConfigParams{ +func TestGenerateCloudConfigs(t *testing.T) { + configBoilerplate := ConfigGlobal{ TokenURL: "", TokenBody: "", ProjectID: "project-id", @@ -293,197 +315,147 @@ func newGenerateConfigDefaults() *generateConfigParams { LocalZone: "us-central1-a", AlphaFeatures: []string{}, } -} -func TestGenerateCloudConfigs(t *testing.T) { + cloudBoilerplate := CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + NetworkProjectID: "", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkName: "network-name", + SubnetworkName: "", + NetworkURL: "", + SubnetworkURL: "", + SecondaryRangeName: "", + NodeTags: []string{"node-tag"}, + TokenSource: google.ComputeTokenSource(""), + NodeInstancePrefix: "node-prefix", + UseMetadataServer: true, + AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, + } + testCases := []struct { - TokenURL string - TokenBody string - ProjectID string - NetworkName string - SubnetworkName string - NodeTags []string - NodeInstancePrefix string - Multizone bool - ApiEndpoint string - LocalZone string - cloudConfig *CloudConfig - AlphaFeatures []string + name string + config func() ConfigGlobal + cloud func() CloudConfig }{ - // default config { - cloudConfig: &CloudConfig{ - ApiEndpoint: "", - ProjectID: "project-id", - Region: "us-central1", - Zone: "us-central1-a", - ManagedZones: []string{"us-central1-a"}, - NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", - SubnetworkURL: "", - NodeTags: []string{"node-tag"}, - NodeInstancePrefix: "node-prefix", - TokenSource: google.ComputeTokenSource(""), - UseMetadataServer: true, - AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, + name: "Empty Config", + config: func() ConfigGlobal { return configBoilerplate }, + cloud: func() CloudConfig { return cloudBoilerplate }, + }, + { + name: "Nil token URL", + config: func() ConfigGlobal { + v := configBoilerplate + v.TokenURL = "nil" + return v + }, + cloud: func() CloudConfig { + v := cloudBoilerplate + v.TokenSource = nil + return v }, }, - // nil token source { - TokenURL: "nil", - cloudConfig: &CloudConfig{ - ApiEndpoint: "", - ProjectID: "project-id", - Region: "us-central1", - Zone: "us-central1-a", - ManagedZones: []string{"us-central1-a"}, - NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", - SubnetworkURL: "", - NodeTags: []string{"node-tag"}, - NodeInstancePrefix: "node-prefix", - TokenSource: nil, - UseMetadataServer: true, - AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, + name: "Network Project ID", + config: func() ConfigGlobal { + v := configBoilerplate + v.NetworkProjectID = "my-awesome-project" + return v + }, + cloud: func() CloudConfig { + v := cloudBoilerplate + v.NetworkProjectID = "my-awesome-project" + return v }, }, - // specified api endpoint { - ApiEndpoint: "https://www.googleapis.com/compute/staging_v1/", - cloudConfig: &CloudConfig{ - ApiEndpoint: "https://www.googleapis.com/compute/staging_v1/", - ProjectID: "project-id", - Region: "us-central1", - Zone: "us-central1-a", - ManagedZones: []string{"us-central1-a"}, - NetworkURL: "https://www.googleapis.com/compute/staging_v1/projects/project-id/global/networks/network-name", - SubnetworkURL: "", - NodeTags: []string{"node-tag"}, - NodeInstancePrefix: "node-prefix", - TokenSource: google.ComputeTokenSource(""), - UseMetadataServer: true, - AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, + name: "Specified API Endpint", + config: func() ConfigGlobal { + v := configBoilerplate + v.ApiEndpoint = "https://www.googleapis.com/compute/staging_v1/" + return v + }, + cloud: func() CloudConfig { + v := cloudBoilerplate + v.ApiEndpoint = "https://www.googleapis.com/compute/staging_v1/" + return v }, }, - // fqdn subnetname { - SubnetworkName: "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", - cloudConfig: &CloudConfig{ - ApiEndpoint: "", - ProjectID: "project-id", - Region: "us-central1", - Zone: "us-central1-a", - ManagedZones: []string{"us-central1-a"}, - NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", - SubnetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", - NodeTags: []string{"node-tag"}, - NodeInstancePrefix: "node-prefix", - TokenSource: google.ComputeTokenSource(""), - UseMetadataServer: true, - AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, + name: "Network & Subnetwork names", + config: func() ConfigGlobal { + v := configBoilerplate + v.NetworkName = "my-network" + v.SubnetworkName = "my-subnetwork" + return v + }, + cloud: func() CloudConfig { + v := cloudBoilerplate + v.NetworkName = "my-network" + v.SubnetworkName = "my-subnetwork" + return v }, }, - // subnetname { - SubnetworkName: "subnetwork-name", - cloudConfig: &CloudConfig{ - ApiEndpoint: "", - ProjectID: "project-id", - Region: "us-central1", - Zone: "us-central1-a", - ManagedZones: []string{"us-central1-a"}, - NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", - SubnetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", - NodeTags: []string{"node-tag"}, - NodeInstancePrefix: "node-prefix", - TokenSource: google.ComputeTokenSource(""), - UseMetadataServer: true, - AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, + name: "Network & Subnetwork URLs", + config: func() ConfigGlobal { + v := configBoilerplate + v.NetworkName = "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/my-network" + v.SubnetworkName = "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/my-subnetwork" + return v + }, + cloud: func() CloudConfig { + v := cloudBoilerplate + v.NetworkName = "" + v.SubnetworkName = "" + v.NetworkURL = "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/my-network" + v.SubnetworkURL = "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/my-subnetwork" + return v + }, + }, + { + name: "Multizone", + config: func() ConfigGlobal { + v := configBoilerplate + v.Multizone = true + return v + }, + cloud: func() CloudConfig { + v := cloudBoilerplate + v.ManagedZones = nil + return v }, }, - // multi zone { - Multizone: true, - cloudConfig: &CloudConfig{ - ApiEndpoint: "", - ProjectID: "project-id", - Region: "us-central1", - Zone: "us-central1-a", - ManagedZones: nil, - NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", - SubnetworkURL: "", - NodeTags: []string{"node-tag"}, - NodeInstancePrefix: "node-prefix", - TokenSource: google.ComputeTokenSource(""), - UseMetadataServer: true, - AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, + name: "Secondary Range Name", + config: func() ConfigGlobal { + v := configBoilerplate + v.SecondaryRangeName = "my-secondary" + return v + }, + cloud: func() CloudConfig { + v := cloudBoilerplate + v.SecondaryRangeName = "my-secondary" + return v }, }, } for _, tc := range testCases { - config := newGenerateConfigDefaults() - config.Multizone = tc.Multizone - config.ApiEndpoint = tc.ApiEndpoint - config.AlphaFeatures = tc.AlphaFeatures - config.TokenBody = tc.TokenBody - - if tc.TokenURL != "" { - config.TokenURL = tc.TokenURL - } - if tc.ProjectID != "" { - config.ProjectID = tc.ProjectID - } - if tc.NetworkName != "" { - config.NetworkName = tc.NetworkName - } - if tc.SubnetworkName != "" { - config.SubnetworkName = tc.SubnetworkName - } - if len(tc.NodeTags) > 0 { - config.NodeTags = tc.NodeTags - } - if tc.NodeInstancePrefix != "" { - config.NodeInstancePrefix = tc.NodeInstancePrefix - } - if tc.LocalZone != "" { - config.LocalZone = tc.LocalZone - } + t.Run(tc.name, func(t *testing.T) { + resultCloud, err := generateCloudConfig(&ConfigFile{Global: tc.config()}) + if err != nil { + t.Fatalf("Unexpect error: %v", err) + } - cloudConfig, err := generateCloudConfig(&ConfigFile{ - Global: struct { - TokenURL string `gcfg:"token-url"` - TokenBody string `gcfg:"token-body"` - ProjectID string `gcfg:"project-id"` - NetworkName string `gcfg:"network-name"` - SubnetworkName string `gcfg:"subnetwork-name"` - SecondaryRangeName string `gcfg:"secondary-range-name"` - NodeTags []string `gcfg:"node-tags"` - NodeInstancePrefix string `gcfg:"node-instance-prefix"` - Multizone bool `gcfg:"multizone"` - ApiEndpoint string `gcfg:"api-endpoint"` - LocalZone string `gcfg:"local-zone"` - AlphaFeatures []string `gcfg:"alpha-features"` - }{ - TokenURL: config.TokenURL, - TokenBody: config.TokenBody, - ProjectID: config.ProjectID, - NetworkName: config.NetworkName, - SubnetworkName: config.SubnetworkName, - SecondaryRangeName: config.SecondaryRangeName, - NodeTags: config.NodeTags, - NodeInstancePrefix: config.NodeInstancePrefix, - Multizone: config.Multizone, - ApiEndpoint: config.ApiEndpoint, - LocalZone: config.LocalZone, - AlphaFeatures: config.AlphaFeatures, - }, + v := tc.cloud() + if !reflect.DeepEqual(*resultCloud, v) { + t.Errorf("Got: \n%v\nWant\n%v\n", v, *resultCloud) + } }) - if err != nil { - t.Fatalf("Unexpect error: %v", err) - } - - if !reflect.DeepEqual(cloudConfig, tc.cloudConfig) { - t.Errorf("Got %v, want %v", cloudConfig, tc.cloudConfig) - } } } diff --git a/test/e2e/e2e.go b/test/e2e/e2e.go index dd20e04cf98a5..d25f664a819c2 100644 --- a/test/e2e/e2e.go +++ b/test/e2e/e2e.go @@ -84,8 +84,8 @@ func setupProviderConfig() error { Region: region, Zone: zone, ManagedZones: managedZones, - NetworkURL: "", - SubnetworkURL: "", + NetworkName: "", // TODO: Change this to use framework.TestContext.CloudConfig.Network? + SubnetworkName: "", NodeTags: nil, NodeInstancePrefix: "", TokenSource: nil, From 91275d23e2d1a0c326d397e33d649eca84e91f5e Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Thu, 24 Aug 2017 10:29:55 -0700 Subject: [PATCH 319/403] GCE: Add a fake forwarding rule service Also add more methods to the address service. --- pkg/cloudprovider/providers/gce/BUILD | 1 + .../providers/gce/gce_addresses_fakes.go | 12 ++ .../providers/gce/gce_forwardingrule_fakes.go | 127 ++++++++++++++++++ .../providers/gce/gce_interfaces.go | 14 +- 4 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 pkg/cloudprovider/providers/gce/gce_forwardingrule_fakes.go diff --git a/pkg/cloudprovider/providers/gce/BUILD b/pkg/cloudprovider/providers/gce/BUILD index e2d5e25bf3452..d262a2a1c75f1 100644 --- a/pkg/cloudprovider/providers/gce/BUILD +++ b/pkg/cloudprovider/providers/gce/BUILD @@ -22,6 +22,7 @@ go_library( "gce_disks.go", "gce_firewall.go", "gce_forwardingrule.go", + "gce_forwardingrule_fakes.go", "gce_healthchecks.go", "gce_instancegroup.go", "gce_instances.go", diff --git a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go index e9873df11b590..94c86e95d9e3b 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go @@ -106,6 +106,18 @@ func (cas *FakeCloudAddressService) GetRegionAddress(name, region string) (*comp return nil, err } +func (cas *FakeCloudAddressService) DeleteRegionAddress(name, region string) error { + if _, exists := cas.addrsByRegionAndName[region]; !exists { + return makeGoogleAPINotFoundError("") + } + + if _, exists := cas.addrsByRegionAndName[region][name]; !exists { + return makeGoogleAPINotFoundError("") + } + delete(cas.addrsByRegionAndName[region], name) + return nil +} + func (cas *FakeCloudAddressService) GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error) { if _, exists := cas.addrsByRegionAndName[region]; !exists { return nil, makeGoogleAPINotFoundError("") diff --git a/pkg/cloudprovider/providers/gce/gce_forwardingrule_fakes.go b/pkg/cloudprovider/providers/gce/gce_forwardingrule_fakes.go new file mode 100644 index 0000000000000..0cc0188223aec --- /dev/null +++ b/pkg/cloudprovider/providers/gce/gce_forwardingrule_fakes.go @@ -0,0 +1,127 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package gce + +import ( + "encoding/json" + "fmt" + "net/http" + + computealpha "google.golang.org/api/compute/v0.alpha" + compute "google.golang.org/api/compute/v1" + "google.golang.org/api/googleapi" +) + +type FakeCloudForwardingRuleService struct { + // fwdRulesByRegionAndName + // Outer key is for region string; inner key is for fwdRuleess name. + fwdRulesByRegionAndName map[string]map[string]*computealpha.ForwardingRule +} + +// FakeCloudForwardingRuleService Implements CloudForwardingRuleService +var _ CloudForwardingRuleService = &FakeCloudForwardingRuleService{} + +func NewFakeCloudForwardingRuleService() *FakeCloudForwardingRuleService { + return &FakeCloudForwardingRuleService{ + fwdRulesByRegionAndName: make(map[string]map[string]*computealpha.ForwardingRule), + } +} + +// SetRegionalForwardingRulees sets the fwdRuleesses of ther region. This is used for +// setting the test environment. +func (f *FakeCloudForwardingRuleService) SetRegionalForwardingRulees(region string, fwdRules []*computealpha.ForwardingRule) { + // Reset fwdRuleesses in the region. + f.fwdRulesByRegionAndName[region] = make(map[string]*computealpha.ForwardingRule) + + for _, fwdRule := range fwdRules { + f.fwdRulesByRegionAndName[region][fwdRule.Name] = fwdRule + } +} + +func (f *FakeCloudForwardingRuleService) CreateAlphaRegionForwardingRule(fwdRule *computealpha.ForwardingRule, region string) error { + if _, exists := f.fwdRulesByRegionAndName[region]; !exists { + f.fwdRulesByRegionAndName[region] = make(map[string]*computealpha.ForwardingRule) + } + + if _, exists := f.fwdRulesByRegionAndName[region][fwdRule.Name]; exists { + return &googleapi.Error{Code: http.StatusConflict} + } + + f.fwdRulesByRegionAndName[region][fwdRule.Name] = fwdRule + return nil +} + +func (f *FakeCloudForwardingRuleService) CreateRegionForwardingRule(fwdRule *compute.ForwardingRule, region string) error { + alphafwdRule := convertToAlphaForwardingRule(fwdRule) + return f.CreateAlphaRegionForwardingRule(alphafwdRule, region) +} + +func (f *FakeCloudForwardingRuleService) DeleteRegionForwardingRule(name, region string) error { + if _, exists := f.fwdRulesByRegionAndName[region]; !exists { + return makeGoogleAPINotFoundError("") + } + + if _, exists := f.fwdRulesByRegionAndName[region][name]; !exists { + return makeGoogleAPINotFoundError("") + } + delete(f.fwdRulesByRegionAndName[region], name) + return nil +} + +func (f *FakeCloudForwardingRuleService) GetAlphaRegionForwardingRule(name, region string) (*computealpha.ForwardingRule, error) { + if _, exists := f.fwdRulesByRegionAndName[region]; !exists { + return nil, makeGoogleAPINotFoundError("") + } + + if fwdRule, exists := f.fwdRulesByRegionAndName[region][name]; !exists { + return nil, makeGoogleAPINotFoundError("") + } else { + return fwdRule, nil + } +} + +func (f *FakeCloudForwardingRuleService) GetRegionForwardingRule(name, region string) (*compute.ForwardingRule, error) { + fwdRule, err := f.GetAlphaRegionForwardingRule(name, region) + if fwdRule != nil { + return convertToV1ForwardingRule(fwdRule), err + } + return nil, err +} + +func convertToV1ForwardingRule(object gceObject) *compute.ForwardingRule { + enc, err := object.MarshalJSON() + if err != nil { + panic(fmt.Sprintf("Failed to encode to json: %v", err)) + } + var fwdRule compute.ForwardingRule + if err := json.Unmarshal(enc, &fwdRule); err != nil { + panic(fmt.Sprintf("Failed to convert GCE apiObject %v to v1 fwdRuleess: %v", object, err)) + } + return &fwdRule +} + +func convertToAlphaForwardingRule(object gceObject) *computealpha.ForwardingRule { + enc, err := object.MarshalJSON() + if err != nil { + panic(fmt.Sprintf("Failed to encode to json: %v", err)) + } + var fwdRule computealpha.ForwardingRule + if err := json.Unmarshal(enc, &fwdRule); err != nil { + panic(fmt.Sprintf("Failed to convert GCE apiObject %v to alpha fwdRuleess: %v", object, err)) + } + return &fwdRule +} diff --git a/pkg/cloudprovider/providers/gce/gce_interfaces.go b/pkg/cloudprovider/providers/gce/gce_interfaces.go index 34fcdde427825..96bfa343b85cb 100644 --- a/pkg/cloudprovider/providers/gce/gce_interfaces.go +++ b/pkg/cloudprovider/providers/gce/gce_interfaces.go @@ -26,10 +26,22 @@ type CloudAddressService interface { ReserveRegionAddress(*compute.Address, string) error GetRegionAddress(string, string) (*compute.Address, error) GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error) - // TODO: Mock `DeleteRegionAddress(name, region string) endpoint + DeleteRegionAddress(name, region string) error // TODO: Mock Global endpoints // Alpha API. GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error } + +// CloudForwardingRuleService is an interface for managing forwarding rules. +// TODO: Expand the interface to include more methods. +type CloudForwardingRuleService interface { + GetRegionForwardingRule(name, region string) (*compute.ForwardingRule, error) + CreateRegionForwardingRule(rule *compute.ForwardingRule, region string) error + DeleteRegionForwardingRule(name, region string) error + + // Alpha API. + GetAlphaRegionForwardingRule(name, region string) (*computealpha.ForwardingRule, error) + CreateAlphaRegionForwardingRule(rule *computealpha.ForwardingRule, region string) error +} From 8ab21103280a5ec948e66f3ebcdb505ecb5978cc Mon Sep 17 00:00:00 2001 From: devinyan Date: Sat, 26 Aug 2017 00:25:37 +0800 Subject: [PATCH 320/403] add an starting info log of namespace controller. --- pkg/controller/namespace/namespace_controller.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pkg/controller/namespace/namespace_controller.go b/pkg/controller/namespace/namespace_controller.go index f066182b06b9a..c3bdd28be7a1e 100644 --- a/pkg/controller/namespace/namespace_controller.go +++ b/pkg/controller/namespace/namespace_controller.go @@ -183,14 +183,16 @@ func (nm *NamespaceController) Run(workers int, stopCh <-chan struct{}) { defer utilruntime.HandleCrash() defer nm.queue.ShutDown() + glog.Infof("Starting namespace controller") + defer glog.Infof("Shutting down namespace controller") + if !controller.WaitForCacheSync("namespace", stopCh, nm.listerSynced) { return } - glog.V(5).Info("Starting workers") + glog.V(5).Info("Starting workers of namespace controller") for i := 0; i < workers; i++ { go wait.Until(nm.worker, time.Second, stopCh) } <-stopCh - glog.V(1).Infof("Shutting down") } From 2c718143441e7c9d588ce1b331ea927baa5a48ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Fri, 25 Aug 2017 20:31:14 +0300 Subject: [PATCH 321/403] kubeadm: Fully implement 'kubeadm init --dry-run' --- cmd/kubeadm/app/cmd/BUILD | 1 + cmd/kubeadm/app/cmd/config.go | 2 + cmd/kubeadm/app/cmd/init.go | 116 +++++++++++++++--- cmd/kubeadm/app/cmd/phases/BUILD | 1 + cmd/kubeadm/app/cmd/phases/selfhosting.go | 7 +- .../app/phases/selfhosting/selfhosting.go | 15 ++- .../phases/selfhosting/selfhosting_volumes.go | 12 +- cmd/kubeadm/app/util/BUILD | 1 + cmd/kubeadm/app/util/apiclient/BUILD | 2 +- .../app/util/apiclient/dryrunclient.go | 33 +++-- .../app/util/apiclient/dryrunclient_test.go | 2 + cmd/kubeadm/app/util/apiclient/wait.go | 59 +++++++-- cmd/kubeadm/app/util/dryrun/BUILD | 26 ++++ cmd/kubeadm/app/util/dryrun/dryrun.go | 100 +++++++++++++++ 14 files changed, 317 insertions(+), 60 deletions(-) create mode 100644 cmd/kubeadm/app/util/dryrun/BUILD create mode 100644 cmd/kubeadm/app/util/dryrun/dryrun.go diff --git a/cmd/kubeadm/app/cmd/BUILD b/cmd/kubeadm/app/cmd/BUILD index e7bf5647fc124..4249096ded378 100644 --- a/cmd/kubeadm/app/cmd/BUILD +++ b/cmd/kubeadm/app/cmd/BUILD @@ -45,6 +45,7 @@ go_library( "//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util/apiclient:go_default_library", "//cmd/kubeadm/app/util/config:go_default_library", + "//cmd/kubeadm/app/util/dryrun:go_default_library", "//cmd/kubeadm/app/util/kubeconfig:go_default_library", "//cmd/kubeadm/app/util/pubkeypin:go_default_library", "//cmd/kubeadm/app/util/token:go_default_library", diff --git a/cmd/kubeadm/app/cmd/config.go b/cmd/kubeadm/app/cmd/config.go index f5c792ed82152..94eda145587d3 100644 --- a/cmd/kubeadm/app/cmd/config.go +++ b/cmd/kubeadm/app/cmd/config.go @@ -139,6 +139,8 @@ func NewCmdConfigUploadFromFlags(out io.Writer, kubeConfigFile *string) *cobra.C Using from-flags, you can upload configuration to the ConfigMap in the cluster using the same flags you'd give to kubeadm init. If you initialized your cluster using a v1.7.x or lower kubeadm client and set some flag; you need to run this command with the same flags before upgrading to v1.8 using 'kubeadm upgrade'. + + The configuration is located in the %q namespace in the %q ConfigMap `), metav1.NamespaceSystem, constants.MasterConfigurationConfigMap), Run: func(cmd *cobra.Command, args []string) { var err error diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index 1914b7284e5b8..1fdbd1cf82b71 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -21,6 +21,7 @@ import ( "io" "io/ioutil" "os" + "path/filepath" "strings" "text/template" "time" @@ -53,6 +54,7 @@ import ( kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" + dryrunutil "k8s.io/kubernetes/cmd/kubeadm/app/util/dryrun" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" "k8s.io/kubernetes/cmd/kubeadm/app/util/pubkeypin" "k8s.io/kubernetes/pkg/api" @@ -264,33 +266,67 @@ func (i *Init) Run(out io.Writer) error { return fmt.Errorf("couldn't parse kubernetes version %q: %v", i.cfg.KubernetesVersion, err) } + // Get directories to write files to; can be faked if we're dry-running + realCertsDir := i.cfg.CertificatesDir + certsDirToWriteTo, kubeConfigDir, manifestDir, err := getDirectoriesToUse(i.dryRun, i.cfg.CertificatesDir) + if err != nil { + return err + } + // certsDirToWriteTo is gonna equal cfg.CertificatesDir in the normal case, but gonna be a temp directory if dryrunning + i.cfg.CertificatesDir = certsDirToWriteTo + + adminKubeConfigPath := filepath.Join(kubeConfigDir, kubeadmconstants.AdminKubeConfigFileName) + // PHASE 1: Generate certificates if err := certsphase.CreatePKIAssets(i.cfg); err != nil { return err } // PHASE 2: Generate kubeconfig files for the admin and the kubelet - if err := kubeconfigphase.CreateInitKubeConfigFiles(kubeadmconstants.KubernetesDir, i.cfg); err != nil { + if err := kubeconfigphase.CreateInitKubeConfigFiles(kubeConfigDir, i.cfg); err != nil { return err } + // Temporarily set cfg.CertificatesDir to the "real value" when writing controlplane manifests + // This is needed for writing the right kind of manifests + i.cfg.CertificatesDir = realCertsDir + // PHASE 3: Bootstrap the control plane - manifestPath := kubeadmconstants.GetStaticPodDirectory() - if err := controlplanephase.CreateInitStaticPodManifestFiles(manifestPath, i.cfg); err != nil { + if err := controlplanephase.CreateInitStaticPodManifestFiles(manifestDir, i.cfg); err != nil { return err } // Add etcd static pod spec only if external etcd is not configured if len(i.cfg.Etcd.Endpoints) == 0 { - if err := etcdphase.CreateLocalEtcdStaticPodManifestFile(manifestPath, i.cfg); err != nil { + if err := etcdphase.CreateLocalEtcdStaticPodManifestFile(manifestDir, i.cfg); err != nil { return err } } - client, err := createClientsetAndOptionallyWaitForReady(i.cfg, i.dryRun) + // Revert the earlier CertificatesDir assignment to the directory that can be written to + i.cfg.CertificatesDir = certsDirToWriteTo + + // If we're dry-running, print the generated manifests + if err := printFilesIfDryRunning(i.dryRun, manifestDir); err != nil { + return err + } + + // Create a kubernetes client and wait for the API server to be healthy (if not dryrunning) + client, err := createClient(i.cfg, i.dryRun) if err != nil { return err } + // waiter holds the apiclient.Waiter implementation of choice, responsible for querying the API server in various ways and waiting for conditions to be fulfilled + waiter := getWaiter(i.dryRun, client) + + fmt.Printf("[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory %q\n", kubeadmconstants.GetStaticPodDirectory()) + fmt.Println("[init] This process often takes about a minute to perform or longer if the control plane images have to be pulled...") + // TODO: Adjust this timeout or start polling the kubelet API + // TODO: Make this timeout more realistic when we do create some more complex logic about the interaction with the kubelet + if err := waiter.WaitForAPI(); err != nil { + return err + } + // PHASE 4: Mark the master with the right label/taint if err := markmasterphase.MarkMaster(client, i.cfg.NodeName); err != nil { return err @@ -316,7 +352,7 @@ func (i *Init) Run(out io.Writer) error { } // Create the cluster-info ConfigMap with the associated RBAC rules - if err := clusterinfophase.CreateBootstrapConfigMapIfNotExists(client, kubeadmconstants.GetAdminKubeConfigPath()); err != nil { + if err := clusterinfophase.CreateBootstrapConfigMapIfNotExists(client, adminKubeConfigPath); err != nil { return err } if err := clusterinfophase.CreateClusterInfoRBACRules(client); err != nil { @@ -347,11 +383,17 @@ func (i *Init) Run(out io.Writer) error { // Temporary control plane is up, now we create our self hosted control // plane components and remove the static manifests: fmt.Println("[self-hosted] Creating self-hosted control plane...") - if err := selfhostingphase.CreateSelfHostedControlPlane(i.cfg, client); err != nil { + if err := selfhostingphase.CreateSelfHostedControlPlane(manifestDir, kubeConfigDir, i.cfg, client, waiter); err != nil { return err } } + // Exit earlier if we're dryrunning + if i.dryRun { + fmt.Println("[dryrun] Finished dry-running successfully; above are the resources that would be created.") + return nil + } + // Load the CA certificate from so we can pin its public key caCert, err := pkiutil.TryLoadCertFromDisk(i.cfg.CertificatesDir, kubeadmconstants.CACertAndKeyBaseName) @@ -362,8 +404,7 @@ func (i *Init) Run(out io.Writer) error { } ctx := map[string]string{ - "KubeConfigPath": kubeadmconstants.GetAdminKubeConfigPath(), - "KubeConfigName": kubeadmconstants.AdminKubeConfigFileName, + "KubeConfigPath": adminKubeConfigPath, "Token": i.cfg.Token, "CAPubKeyPin": pubkeypin.Hash(caCert), "MasterHostPort": masterHostPort, @@ -375,24 +416,59 @@ func (i *Init) Run(out io.Writer) error { return initDoneTempl.Execute(out, ctx) } -func createClientsetAndOptionallyWaitForReady(cfg *kubeadmapi.MasterConfiguration, dryRun bool) (clientset.Interface, error) { +// createClient creates a clientset.Interface object +func createClient(cfg *kubeadmapi.MasterConfiguration, dryRun bool) (clientset.Interface, error) { if dryRun { // If we're dry-running; we should create a faked client that answers some GETs in order to be able to do the full init flow and just logs the rest of requests dryRunGetter := apiclient.NewInitDryRunGetter(cfg.NodeName, cfg.Networking.ServiceSubnet) return apiclient.NewDryRunClient(dryRunGetter, os.Stdout), nil } - // If we're acting for real,we should create a connection to the API server and wait for it to come up - client, err := kubeconfigutil.ClientSetFromFile(kubeadmconstants.GetAdminKubeConfigPath()) - if err != nil { - return nil, err + // If we're acting for real, we should create a connection to the API server and wait for it to come up + return kubeconfigutil.ClientSetFromFile(kubeadmconstants.GetAdminKubeConfigPath()) +} + +// getDirectoriesToUse returns the (in order) certificates, kubeconfig and Static Pod manifest directories, followed by a possible error +// This behaves differently when dry-running vs the normal flow +func getDirectoriesToUse(dryRun bool, defaultPkiDir string) (string, string, string, error) { + if dryRun { + dryRunDir, err := ioutil.TempDir("", "kubeadm-init-dryrun") + if err != nil { + return "", "", "", fmt.Errorf("couldn't create a temporary directory: %v", err) + } + // Use the same temp dir for all + return dryRunDir, dryRunDir, dryRunDir, nil } - fmt.Printf("[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory %q\n", kubeadmconstants.GetStaticPodDirectory()) - // TODO: Adjust this timeout or start polling the kubelet API - // TODO: Make this timeout more realistic when we do create some more complex logic about the interaction with the kubelet - if err := apiclient.WaitForAPI(client, 30*time.Minute); err != nil { - return nil, err + return defaultPkiDir, kubeadmconstants.KubernetesDir, kubeadmconstants.GetStaticPodDirectory(), nil +} + +// printFilesIfDryRunning prints the Static Pod manifests to stdout and informs about the temporary directory to go and lookup +func printFilesIfDryRunning(dryRun bool, manifestDir string) error { + if !dryRun { + return nil + } + + fmt.Printf("[dryrun] Wrote certificates, kubeconfig files and control plane manifests to %q\n", manifestDir) + fmt.Println("[dryrun] Won't print certificates or kubeconfig files due to the sensitive nature of them") + fmt.Printf("[dryrun] Please go and examine the %q directory for details about what would be written\n", manifestDir) + + // Print the contents of the upgraded manifests and pretend like they were in /etc/kubernetes/manifests + files := []dryrunutil.FileToPrint{} + for _, component := range kubeadmconstants.MasterComponents { + realPath := kubeadmconstants.GetStaticPodFilepath(component, manifestDir) + outputPath := kubeadmconstants.GetStaticPodFilepath(component, kubeadmconstants.GetStaticPodDirectory()) + files = append(files, dryrunutil.NewFileToPrint(realPath, outputPath)) + } + + return dryrunutil.PrintDryRunFiles(files, os.Stdout) +} + +// getWaiter gets the right waiter implementation +func getWaiter(dryRun bool, client clientset.Interface) apiclient.Waiter { + if dryRun { + return dryrunutil.NewWaiter() } - return client, nil + // TODO: Adjust this timeout slightly? + return apiclient.NewKubeWaiter(client, 30*time.Minute, os.Stdout) } diff --git a/cmd/kubeadm/app/cmd/phases/BUILD b/cmd/kubeadm/app/cmd/phases/BUILD index 0bf15e601eaaa..7a673cf283e91 100644 --- a/cmd/kubeadm/app/cmd/phases/BUILD +++ b/cmd/kubeadm/app/cmd/phases/BUILD @@ -39,6 +39,7 @@ go_library( "//cmd/kubeadm/app/phases/uploadconfig:go_default_library", "//cmd/kubeadm/app/preflight:go_default_library", "//cmd/kubeadm/app/util:go_default_library", + "//cmd/kubeadm/app/util/apiclient:go_default_library", "//cmd/kubeadm/app/util/config:go_default_library", "//cmd/kubeadm/app/util/kubeconfig:go_default_library", "//pkg/api:go_default_library", diff --git a/cmd/kubeadm/app/cmd/phases/selfhosting.go b/cmd/kubeadm/app/cmd/phases/selfhosting.go index 09b3b2483658c..b029eadafa1c6 100644 --- a/cmd/kubeadm/app/cmd/phases/selfhosting.go +++ b/cmd/kubeadm/app/cmd/phases/selfhosting.go @@ -17,16 +17,20 @@ limitations under the License. package phases import ( + "os" "strings" + "time" "github.com/spf13/cobra" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" + "k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/features" "k8s.io/kubernetes/cmd/kubeadm/app/phases/selfhosting" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" + "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig" "k8s.io/kubernetes/pkg/api" @@ -78,7 +82,8 @@ func getSelfhostingSubCommand() *cobra.Command { kubeadmutil.CheckErr(err) // Converts the Static Pod-hosted control plane into a self-hosted one - err = selfhosting.CreateSelfHostedControlPlane(internalcfg, client) + waiter := apiclient.NewKubeWaiter(client, 2*time.Minute, os.Stdout) + err = selfhosting.CreateSelfHostedControlPlane(constants.GetStaticPodDirectory(), constants.KubernetesDir, internalcfg, client, waiter) kubeadmutil.CheckErr(err) }, } diff --git a/cmd/kubeadm/app/phases/selfhosting/selfhosting.go b/cmd/kubeadm/app/phases/selfhosting/selfhosting.go index 8fea9e9a0359a..7ad39f6d69d7e 100644 --- a/cmd/kubeadm/app/phases/selfhosting/selfhosting.go +++ b/cmd/kubeadm/app/phases/selfhosting/selfhosting.go @@ -54,7 +54,10 @@ const ( // 8. In order to avoid race conditions, we have to make sure that static pod is deleted correctly before we continue // Otherwise, there is a race condition when we proceed without kubelet having restarted the API server correctly and the next .Create call flakes // 9. Do that for the kube-apiserver, kube-controller-manager and kube-scheduler in a loop -func CreateSelfHostedControlPlane(cfg *kubeadmapi.MasterConfiguration, client clientset.Interface) error { +func CreateSelfHostedControlPlane(manifestsDir, kubeConfigDir string, cfg *kubeadmapi.MasterConfiguration, client clientset.Interface, waiter apiclient.Waiter) error { + + // Adjust the timeout slightly to something self-hosting specific + waiter.SetTimeout(selfHostingWaitTimeout) // Here the map of different mutators to use for the control plane's podspec is stored mutators := getDefaultMutators() @@ -66,7 +69,7 @@ func CreateSelfHostedControlPlane(cfg *kubeadmapi.MasterConfiguration, client cl if err := uploadTLSSecrets(client, cfg.CertificatesDir); err != nil { return err } - if err := uploadKubeConfigSecrets(client); err != nil { + if err := uploadKubeConfigSecrets(client, kubeConfigDir); err != nil { return err } // Add the store-certs-in-secrets-specific mutators here so that the self-hosted component starts using them @@ -77,7 +80,7 @@ func CreateSelfHostedControlPlane(cfg *kubeadmapi.MasterConfiguration, client cl for _, componentName := range kubeadmconstants.MasterComponents { start := time.Now() - manifestPath := kubeadmconstants.GetStaticPodFilepath(componentName, kubeadmconstants.GetStaticPodDirectory()) + manifestPath := kubeadmconstants.GetStaticPodFilepath(componentName, manifestsDir) // Since we want this function to be idempotent; just continue and try the next component if this file doesn't exist if _, err := os.Stat(manifestPath); err != nil { @@ -102,7 +105,7 @@ func CreateSelfHostedControlPlane(cfg *kubeadmapi.MasterConfiguration, client cl } // Wait for the self-hosted component to come up - if err := apiclient.WaitForPodsWithLabel(client, selfHostingWaitTimeout, os.Stdout, buildSelfHostedWorkloadLabelQuery(componentName)); err != nil { + if err := waiter.WaitForPodsWithLabel(buildSelfHostedWorkloadLabelQuery(componentName)); err != nil { return err } @@ -115,12 +118,12 @@ func CreateSelfHostedControlPlane(cfg *kubeadmapi.MasterConfiguration, client cl // remove the Static Pod (or the mirror Pod respectively). This implicitely also tests that the API server endpoint is healthy, // because this blocks until the API server returns a 404 Not Found when getting the Static Pod staticPodName := fmt.Sprintf("%s-%s", componentName, cfg.NodeName) - if err := apiclient.WaitForStaticPodToDisappear(client, selfHostingWaitTimeout, staticPodName); err != nil { + if err := waiter.WaitForPodToDisappear(staticPodName); err != nil { return err } // Just as an extra safety check; make sure the API server is returning ok at the /healthz endpoint (although we know it could return a GET answer for a Pod above) - if err := apiclient.WaitForAPI(client, selfHostingWaitTimeout); err != nil { + if err := waiter.WaitForAPI(); err != nil { return err } diff --git a/cmd/kubeadm/app/phases/selfhosting/selfhosting_volumes.go b/cmd/kubeadm/app/phases/selfhosting/selfhosting_volumes.go index 015e7c24682f1..627fb01f043f6 100644 --- a/cmd/kubeadm/app/phases/selfhosting/selfhosting_volumes.go +++ b/cmd/kubeadm/app/phases/selfhosting/selfhosting_volumes.go @@ -19,7 +19,7 @@ package selfhosting import ( "fmt" "io/ioutil" - "path" + "path/filepath" "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -184,8 +184,8 @@ func uploadTLSSecrets(client clientset.Interface, certDir string) error { for _, tlsKeyPair := range getTLSKeyPairs() { secret, err := createTLSSecretFromFiles( tlsKeyPair.name, - path.Join(certDir, tlsKeyPair.cert), - path.Join(certDir, tlsKeyPair.key), + filepath.Join(certDir, tlsKeyPair.cert), + filepath.Join(certDir, tlsKeyPair.key), ) if err != nil { return err @@ -200,13 +200,13 @@ func uploadTLSSecrets(client clientset.Interface, certDir string) error { return nil } -func uploadKubeConfigSecrets(client clientset.Interface) error { +func uploadKubeConfigSecrets(client clientset.Interface, kubeConfigDir string) error { files := []string{ kubeadmconstants.SchedulerKubeConfigFileName, kubeadmconstants.ControllerManagerKubeConfigFileName, } for _, file := range files { - kubeConfigPath := path.Join(kubeadmconstants.KubernetesDir, file) + kubeConfigPath := filepath.Join(kubeConfigDir, file) secret, err := createOpaqueSecretFromFile(file, kubeConfigPath) if err != nil { return err @@ -257,7 +257,7 @@ func createOpaqueSecretFromFile(secretName, file string) (*v1.Secret, error) { }, Type: v1.SecretTypeOpaque, Data: map[string][]byte{ - path.Base(file): fileBytes, + filepath.Base(file): fileBytes, }, }, nil } diff --git a/cmd/kubeadm/app/util/BUILD b/cmd/kubeadm/app/util/BUILD index 3f0e5f233b0c6..62caae99a8980 100644 --- a/cmd/kubeadm/app/util/BUILD +++ b/cmd/kubeadm/app/util/BUILD @@ -51,6 +51,7 @@ filegroup( ":package-srcs", "//cmd/kubeadm/app/util/apiclient:all-srcs", "//cmd/kubeadm/app/util/config:all-srcs", + "//cmd/kubeadm/app/util/dryrun:all-srcs", "//cmd/kubeadm/app/util/kubeconfig:all-srcs", "//cmd/kubeadm/app/util/pubkeypin:all-srcs", "//cmd/kubeadm/app/util/staticpod:all-srcs", diff --git a/cmd/kubeadm/app/util/apiclient/BUILD b/cmd/kubeadm/app/util/apiclient/BUILD index d4cfb392fdb18..1537d4d22f1da 100644 --- a/cmd/kubeadm/app/util/apiclient/BUILD +++ b/cmd/kubeadm/app/util/apiclient/BUILD @@ -18,13 +18,13 @@ go_library( deps = [ "//cmd/kubeadm/app/constants:go_default_library", "//pkg/registry/core/service/ipallocator:go_default_library", - "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/dynamic:go_default_library", diff --git a/cmd/kubeadm/app/util/apiclient/dryrunclient.go b/cmd/kubeadm/app/util/apiclient/dryrunclient.go index c306a9c4740a8..e20ce89221c5f 100644 --- a/cmd/kubeadm/app/util/apiclient/dryrunclient.go +++ b/cmd/kubeadm/app/util/apiclient/dryrunclient.go @@ -23,10 +23,11 @@ import ( "io" "strings" - "github.com/ghodss/yaml" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" clientset "k8s.io/client-go/kubernetes" fakeclientset "k8s.io/client-go/kubernetes/fake" + clientsetscheme "k8s.io/client-go/kubernetes/scheme" core "k8s.io/client-go/testing" ) @@ -37,12 +38,18 @@ type DryRunGetter interface { } // MarshalFunc takes care of converting any object to a byte array for displaying the object to the user -type MarshalFunc func(runtime.Object) ([]byte, error) +type MarshalFunc func(runtime.Object, schema.GroupVersion) ([]byte, error) // DefaultMarshalFunc is the default MarshalFunc used; uses YAML to print objects to the user -func DefaultMarshalFunc(obj runtime.Object) ([]byte, error) { - b, err := yaml.Marshal(obj) - return b, err +func DefaultMarshalFunc(obj runtime.Object, gv schema.GroupVersion) ([]byte, error) { + mediaType := "application/yaml" + info, ok := runtime.SerializerInfoForMediaType(clientsetscheme.Codecs.SupportedMediaTypes(), mediaType) + if !ok { + return []byte{}, fmt.Errorf("unsupported media type %q", mediaType) + } + + encoder := clientsetscheme.Codecs.EncoderForVersion(info.Serializer, gv) + return runtime.Encode(encoder, obj) } // DryRunClientOptions specifies options to pass to NewDryRunClientWithOpts in order to get a dryrun clientset @@ -115,10 +122,10 @@ func NewDryRunClientWithOpts(opts DryRunClientOptions) clientset.Interface { if opts.PrintGETAndLIST { // Print the marshalled object format with one tab indentation - objBytes, err := opts.MarshalFunc(obj) + objBytes, err := opts.MarshalFunc(obj, action.GetResource().GroupVersion()) if err == nil { fmt.Println("[dryrun] Returning faked GET response:") - printBytesWithLinePrefix(opts.Writer, objBytes, "\t") + PrintBytesWithLinePrefix(opts.Writer, objBytes, "\t") } } @@ -140,10 +147,10 @@ func NewDryRunClientWithOpts(opts DryRunClientOptions) clientset.Interface { if opts.PrintGETAndLIST { // Print the marshalled object format with one tab indentation - objBytes, err := opts.MarshalFunc(objs) + objBytes, err := opts.MarshalFunc(objs, action.GetResource().GroupVersion()) if err == nil { fmt.Println("[dryrun] Returning faked LIST response:") - printBytesWithLinePrefix(opts.Writer, objBytes, "\t") + PrintBytesWithLinePrefix(opts.Writer, objBytes, "\t") } } @@ -214,10 +221,10 @@ func logDryRunAction(action core.Action, w io.Writer, marshalFunc MarshalFunc) { objAction, ok := action.(actionWithObject) if ok && objAction.GetObject() != nil { // Print the marshalled object with a tab indentation - objBytes, err := marshalFunc(objAction.GetObject()) + objBytes, err := marshalFunc(objAction.GetObject(), action.GetResource().GroupVersion()) if err == nil { fmt.Println("[dryrun] Attached object:") - printBytesWithLinePrefix(w, objBytes, "\t") + PrintBytesWithLinePrefix(w, objBytes, "\t") } } @@ -228,8 +235,8 @@ func logDryRunAction(action core.Action, w io.Writer, marshalFunc MarshalFunc) { } } -// printBytesWithLinePrefix prints objBytes to writer w with linePrefix in the beginning of every line -func printBytesWithLinePrefix(w io.Writer, objBytes []byte, linePrefix string) { +// PrintBytesWithLinePrefix prints objBytes to writer w with linePrefix in the beginning of every line +func PrintBytesWithLinePrefix(w io.Writer, objBytes []byte, linePrefix string) { scanner := bufio.NewScanner(bytes.NewReader(objBytes)) for scanner.Scan() { fmt.Fprintf(w, "%s%s\n", linePrefix, scanner.Text()) diff --git a/cmd/kubeadm/app/util/apiclient/dryrunclient_test.go b/cmd/kubeadm/app/util/apiclient/dryrunclient_test.go index 246bc7a78d6bb..f3c4a7fec9d5a 100644 --- a/cmd/kubeadm/app/util/apiclient/dryrunclient_test.go +++ b/cmd/kubeadm/app/util/apiclient/dryrunclient_test.go @@ -60,6 +60,8 @@ func TestLogDryRunAction(t *testing.T) { }, }), expectedBytes: []byte(`[dryrun] Would perform action CREATE on resource "services" in API group "core/v1" + apiVersion: v1 + kind: Service metadata: creationTimestamp: null name: foo diff --git a/cmd/kubeadm/app/util/apiclient/wait.go b/cmd/kubeadm/app/util/apiclient/wait.go index d964d5aab9c40..59eb1599f7a2e 100644 --- a/cmd/kubeadm/app/util/apiclient/wait.go +++ b/cmd/kubeadm/app/util/apiclient/wait.go @@ -30,12 +30,40 @@ import ( "k8s.io/kubernetes/cmd/kubeadm/app/constants" ) +// Waiter is an interface for waiting for criterias in Kubernetes to happen +type Waiter interface { + // WaitForAPI waits for the API Server's /healthz endpoint to become "ok" + WaitForAPI() error + // WaitForPodsWithLabel waits for Pods in the kube-system namespace to become Ready + WaitForPodsWithLabel(kvLabel string) error + // WaitForPodToDisappear waits for the given Pod in the kube-system namespace to be deleted + WaitForPodToDisappear(staticPodName string) error + // SetTimeout adjusts the timeout to the specified duration + SetTimeout(timeout time.Duration) +} + +// KubeWaiter is an implementation of Waiter that is backed by a Kubernetes client +type KubeWaiter struct { + client clientset.Interface + timeout time.Duration + writer io.Writer +} + +// NewKubeWaiter returns a new Waiter object that talks to the given Kubernetes cluster +func NewKubeWaiter(client clientset.Interface, timeout time.Duration, writer io.Writer) Waiter { + return &KubeWaiter{ + client: client, + timeout: timeout, + writer: writer, + } +} + // WaitForAPI waits for the API Server's /healthz endpoint to report "ok" -func WaitForAPI(client clientset.Interface, timeout time.Duration) error { +func (w *KubeWaiter) WaitForAPI() error { start := time.Now() - return wait.PollImmediate(constants.APICallRetryInterval, timeout, func() (bool, error) { + return wait.PollImmediate(constants.APICallRetryInterval, w.timeout, func() (bool, error) { healthStatus := 0 - client.Discovery().RESTClient().Get().AbsPath("/healthz").Do().StatusCode(&healthStatus) + w.client.Discovery().RESTClient().Get().AbsPath("/healthz").Do().StatusCode(&healthStatus) if healthStatus != http.StatusOK { return false, nil } @@ -47,19 +75,19 @@ func WaitForAPI(client clientset.Interface, timeout time.Duration) error { // WaitForPodsWithLabel will lookup pods with the given label and wait until they are all // reporting status as running. -func WaitForPodsWithLabel(client clientset.Interface, timeout time.Duration, out io.Writer, labelKeyValPair string) error { +func (w *KubeWaiter) WaitForPodsWithLabel(kvLabel string) error { lastKnownPodNumber := -1 - return wait.PollImmediate(constants.APICallRetryInterval, timeout, func() (bool, error) { - listOpts := metav1.ListOptions{LabelSelector: labelKeyValPair} - pods, err := client.CoreV1().Pods(metav1.NamespaceSystem).List(listOpts) + return wait.PollImmediate(constants.APICallRetryInterval, w.timeout, func() (bool, error) { + listOpts := metav1.ListOptions{LabelSelector: kvLabel} + pods, err := w.client.CoreV1().Pods(metav1.NamespaceSystem).List(listOpts) if err != nil { - fmt.Fprintf(out, "[apiclient] Error getting Pods with label selector %q [%v]\n", labelKeyValPair, err) + fmt.Fprintf(w.writer, "[apiclient] Error getting Pods with label selector %q [%v]\n", kvLabel, err) return false, nil } if lastKnownPodNumber != len(pods.Items) { - fmt.Fprintf(out, "[apiclient] Found %d Pods for label selector %s\n", len(pods.Items), labelKeyValPair) + fmt.Fprintf(w.writer, "[apiclient] Found %d Pods for label selector %s\n", len(pods.Items), kvLabel) lastKnownPodNumber = len(pods.Items) } @@ -77,10 +105,10 @@ func WaitForPodsWithLabel(client clientset.Interface, timeout time.Duration, out }) } -// WaitForStaticPodToDisappear blocks until it timeouts or gets a "NotFound" response from the API Server when getting the Static Pod in question -func WaitForStaticPodToDisappear(client clientset.Interface, timeout time.Duration, podName string) error { - return wait.PollImmediate(constants.APICallRetryInterval, timeout, func() (bool, error) { - _, err := client.CoreV1().Pods(metav1.NamespaceSystem).Get(podName, metav1.GetOptions{}) +// WaitForPodToDisappear blocks until it timeouts or gets a "NotFound" response from the API Server when getting the Static Pod in question +func (w *KubeWaiter) WaitForPodToDisappear(podName string) error { + return wait.PollImmediate(constants.APICallRetryInterval, w.timeout, func() (bool, error) { + _, err := w.client.CoreV1().Pods(metav1.NamespaceSystem).Get(podName, metav1.GetOptions{}) if apierrors.IsNotFound(err) { fmt.Printf("[apiclient] The Static Pod %q is now removed\n", podName) return true, nil @@ -89,6 +117,11 @@ func WaitForStaticPodToDisappear(client clientset.Interface, timeout time.Durati }) } +// SetTimeout adjusts the timeout to the specified duration +func (w *KubeWaiter) SetTimeout(timeout time.Duration) { + w.timeout = timeout +} + // TryRunCommand runs a function a maximum of failureThreshold times, and retries on error. If failureThreshold is hit; the last error is returned func TryRunCommand(f func() error, failureThreshold uint8) error { var numFailures uint8 diff --git a/cmd/kubeadm/app/util/dryrun/BUILD b/cmd/kubeadm/app/util/dryrun/BUILD new file mode 100644 index 0000000000000..b175152e7b68b --- /dev/null +++ b/cmd/kubeadm/app/util/dryrun/BUILD @@ -0,0 +1,26 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["dryrun.go"], + visibility = ["//visibility:public"], + deps = [ + "//cmd/kubeadm/app/util/apiclient:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cmd/kubeadm/app/util/dryrun/dryrun.go b/cmd/kubeadm/app/util/dryrun/dryrun.go new file mode 100644 index 0000000000000..dbba795d9ebfe --- /dev/null +++ b/cmd/kubeadm/app/util/dryrun/dryrun.go @@ -0,0 +1,100 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package dryrun + +import ( + "fmt" + "io" + "io/ioutil" + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/errors" + "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" +) + +// FileToPrint represents a temporary file on disk that might want to be aliased when printing +// Useful for things like loading a file from /tmp/ but saying to the user "Would write file foo to /etc/kubernetes/..." +type FileToPrint struct { + RealPath string + PrintPath string +} + +// NewFileToPrint makes a new instance of FileToPrint with the specified arguments +func NewFileToPrint(realPath, printPath string) FileToPrint { + return FileToPrint{ + RealPath: realPath, + PrintPath: printPath, + } +} + +// PrintDryRunFiles prints the contents of the FileToPrints given to it to the writer w +func PrintDryRunFiles(files []FileToPrint, w io.Writer) error { + errs := []error{} + for _, file := range files { + if len(file.RealPath) == 0 { + continue + } + + fileBytes, err := ioutil.ReadFile(file.RealPath) + if err != nil { + errs = append(errs, err) + continue + } + + // Make it possible to fake the path of the file; i.e. you may want to tell the user + // "Here is what would be written to /etc/kubernetes/admin.conf", although you wrote it to /tmp/kubeadm-dryrun/admin.conf and are loading it from there + // Fall back to the "real" path if PrintPath is not set + outputFilePath := file.PrintPath + if len(outputFilePath) == 0 { + outputFilePath = file.RealPath + } + + fmt.Fprintf(w, "[dryrun] Would write file %q with content:\n", outputFilePath) + apiclient.PrintBytesWithLinePrefix(w, fileBytes, "\t") + } + return errors.NewAggregate(errs) +} + +// Waiter is an implementation of apiclient.Waiter that should be used for dry-running +type Waiter struct{} + +// NewWaiter returns a new Waiter object that talks to the given Kubernetes cluster +func NewWaiter() apiclient.Waiter { + return &Waiter{} +} + +// WaitForAPI just returns a dummy nil, to indicate that the program should just proceed +func (w *Waiter) WaitForAPI() error { + fmt.Println("[dryrun] Would wait for the API Server's /healthz endpoint to return 'ok'") + return nil +} + +// WaitForPodsWithLabel just returns a dummy nil, to indicate that the program should just proceed +func (w *Waiter) WaitForPodsWithLabel(kvLabel string) error { + fmt.Printf("[dryrun] Would wait for the Pods with the label %q in the %s namespace to become Running\n", kvLabel, metav1.NamespaceSystem) + return nil +} + +// WaitForPodToDisappear just returns a dummy nil, to indicate that the program should just proceed +func (w *Waiter) WaitForPodToDisappear(podName string) error { + fmt.Printf("[dryrun] Would wait for the %q Pod in the %s namespace to be deleted\n", podName, metav1.NamespaceSystem) + return nil +} + +// SetTimeout is a no-op; we don't wait in this implementation +func (w *Waiter) SetTimeout(_ time.Duration) {} From 8b5b2e992746269aa7a635ce3c9a84db0894dff8 Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Fri, 25 Aug 2017 13:36:17 -0400 Subject: [PATCH 322/403] Set flexvolumeplugin.host so that it's not nil --- pkg/volume/flexvolume/plugin.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/volume/flexvolume/plugin.go b/pkg/volume/flexvolume/plugin.go index 2e54aae964c93..733d3082ce560 100644 --- a/pkg/volume/flexvolume/plugin.go +++ b/pkg/volume/flexvolume/plugin.go @@ -86,6 +86,7 @@ func NewFlexVolumePlugin(pluginDir, name string) (volume.VolumePlugin, error) { // Init is part of the volume.VolumePlugin interface. func (plugin *flexVolumePlugin) Init(host volume.VolumeHost) error { + plugin.host = host // Hardwired 'success' as any errors from calling init() will be caught by NewFlexVolumePlugin() return nil } From 3b9485bba3ad48b9a8c9124d13e6d66eee2f11bf Mon Sep 17 00:00:00 2001 From: Walter Fender Date: Mon, 21 Aug 2017 15:45:51 -0700 Subject: [PATCH 323/403] Fixed gke auth update wait condition. Lookup whoami on gke using gcloud auth list. Make sure we do not run the test on any cluster older than 1.7. Fix for Mehdy Fixes for LavaLamp --- test/e2e/apimachinery/BUILD | 2 +- test/e2e/apimachinery/aggregator.go | 40 +++++++++++++++++------------ 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/test/e2e/apimachinery/BUILD b/test/e2e/apimachinery/BUILD index 21a93f45c6c37..96bb4738f9b12 100644 --- a/test/e2e/apimachinery/BUILD +++ b/test/e2e/apimachinery/BUILD @@ -51,7 +51,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", + "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", diff --git a/test/e2e/apimachinery/aggregator.go b/test/e2e/apimachinery/aggregator.go index bbf9bfb2e0049..26a98fdf2a739 100644 --- a/test/e2e/apimachinery/aggregator.go +++ b/test/e2e/apimachinery/aggregator.go @@ -33,11 +33,12 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/apiserver/pkg/authentication/serviceaccount" + "k8s.io/apiserver/pkg/authentication/user" "k8s.io/client-go/discovery" "k8s.io/client-go/util/cert" apiregistrationv1beta1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1" rbacapi "k8s.io/kubernetes/pkg/apis/rbac" + utilversion "k8s.io/kubernetes/pkg/util/version" "k8s.io/kubernetes/test/e2e/framework" samplev1alpha1 "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" @@ -50,6 +51,8 @@ type aggregatorContext struct { apiserverSigningCert []byte } +var serverAggregatorVersion = utilversion.MustParseSemantic("v1.7.0") + var _ = SIGDescribe("Aggregator", func() { f := framework.NewDefaultFramework("aggregator") framework.AddCleanupAction(func() { @@ -58,6 +61,7 @@ var _ = SIGDescribe("Aggregator", func() { It("Should be able to support the 1.7 Sample API Server using the current Aggregator", func() { // Make sure the relevant provider supports Agggregator + framework.SkipUnlessServerVersionGTE(serverAggregatorVersion, f.ClientSet.Discovery()) framework.SkipUnlessProviderIs("gce", "gke") // Testing a 1.7 version of the sample-apiserver @@ -161,12 +165,8 @@ func TestSampleAPIServer(f *framework.Framework, image, namespaceName string) { ns := f.Namespace.Name if framework.ProviderIs("gke") { // kubectl create clusterrolebinding user-cluster-admin-binding --clusterrole=cluster-admin --user=user@domain.com - framework.BindClusterRole(client.RbacV1beta1(), "cluster-admin", ns, - rbacv1beta1.Subject{Kind: rbacv1beta1.ServiceAccountKind, Namespace: ns, Name: "default"}) - err := framework.WaitForAuthorizationUpdate(client.AuthorizationV1beta1(), - serviceaccount.MakeUsername(ns, "default"), - "", "get", schema.GroupResource{Group: "storage.k8s.io", Resource: "storageclasses"}, true) - framework.ExpectNoError(err, "Failed to update authorization: %v", err) + authenticated := rbacv1beta1.Subject{Kind: rbacv1beta1.GroupKind, Name: user.AllAuthenticated} + framework.BindClusterRole(client.RbacV1beta1(), "cluster-admin", ns, authenticated) } // kubectl create -f namespace.yaml @@ -319,16 +319,22 @@ func TestSampleAPIServer(f *framework.Framework, image, namespaceName string) { framework.ExpectNoError(err, "creating cluster resource rule") urlRule, err := rbacapi.NewRule("get").URLs("*").Rule() framework.ExpectNoError(err, "creating cluster url rule") - roleLabels := map[string]string{"kubernetes.io/bootstrapping": "wardle-default"} - role := rbacapi.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: "wardler", - Labels: roleLabels, - }, - Rules: []rbacapi.PolicyRule{resourceRule, urlRule}, - } - _, err = iclient.Rbac().ClusterRoles().Create(&role) - framework.ExpectNoError(err, "creating cluster role %s", "wardler") + err = wait.Poll(100*time.Millisecond, 30*time.Second, func() (bool, error) { + roleLabels := map[string]string{"kubernetes.io/bootstrapping": "wardle-default"} + role := rbacapi.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{ + Name: "wardler", + Labels: roleLabels, + }, + Rules: []rbacapi.PolicyRule{resourceRule, urlRule}, + } + _, err = iclient.Rbac().ClusterRoles().Create(&role) + if err != nil { + return false, nil + } + return true, nil + }) + framework.ExpectNoError(err, "creating cluster role wardler - may not have permissions") // kubectl create -f auth-reader.yaml _, err = client.RbacV1beta1().RoleBindings("kube-system").Create(&rbacv1beta1.RoleBinding{ From 396c3c7c6fd008663d2d30369c8e33a58cde5ee2 Mon Sep 17 00:00:00 2001 From: Cheng Xing Date: Tue, 25 Jul 2017 17:48:26 -0700 Subject: [PATCH 324/403] Adding dynamic Flexvolume plugin discovery capability, using filesystem watch. --- cmd/kube-controller-manager/app/core.go | 3 +- cmd/kube-controller-manager/app/plugins.go | 14 +- cmd/kubelet/app/plugins.go | 12 +- cmd/kubelet/app/server.go | 32 +-- pkg/controller/volume/attachdetach/BUILD | 1 + .../attachdetach/attach_detach_controller.go | 3 +- .../attach_detach_controller_test.go | 7 +- .../volume/persistentvolume/framework_test.go | 2 +- .../persistentvolume/pv_controller_base.go | 3 +- pkg/kubelet/kubelet.go | 3 +- pkg/kubelet/kubelet_test.go | 3 +- pkg/kubelet/runonce_test.go | 2 +- pkg/kubelet/volume_host.go | 5 +- .../volumemanager/volume_manager_test.go | 3 +- pkg/volume/aws_ebs/aws_ebs_test.go | 10 +- pkg/volume/azure_dd/azure_dd_test.go | 2 +- pkg/volume/azure_file/azure_file_test.go | 10 +- pkg/volume/cephfs/cephfs_test.go | 6 +- pkg/volume/cinder/cinder_test.go | 4 +- pkg/volume/configmap/configmap_test.go | 10 +- pkg/volume/downwardapi/downwardapi_test.go | 4 +- pkg/volume/empty_dir/empty_dir_test.go | 2 +- pkg/volume/fc/fc_test.go | 10 +- pkg/volume/flexvolume/BUILD | 2 + pkg/volume/flexvolume/flexvolume_test.go | 4 +- pkg/volume/flexvolume/probe.go | 207 +++++++++++++++++- pkg/volume/flocker/flocker_test.go | 4 +- pkg/volume/flocker/flocker_volume_test.go | 2 +- pkg/volume/gce_pd/attacher_test.go | 3 +- pkg/volume/gce_pd/gce_pd_test.go | 8 +- pkg/volume/git_repo/git_repo_test.go | 4 +- pkg/volume/glusterfs/glusterfs_test.go | 8 +- pkg/volume/host_path/host_path_test.go | 17 +- pkg/volume/iscsi/iscsi_test.go | 8 +- pkg/volume/local/local_test.go | 6 +- pkg/volume/nfs/nfs_test.go | 10 +- pkg/volume/photon_pd/photon_pd_test.go | 8 +- pkg/volume/plugins.go | 114 +++++++++- pkg/volume/plugins_test.go | 3 +- pkg/volume/portworx/portworx_test.go | 6 +- pkg/volume/projected/projected_test.go | 10 +- pkg/volume/quobyte/quobyte_test.go | 8 +- pkg/volume/rbd/rbd_test.go | 6 +- pkg/volume/scaleio/sio_volume_test.go | 2 +- pkg/volume/secret/secret_test.go | 10 +- pkg/volume/storageos/storageos_test.go | 8 +- pkg/volume/storageos/storageos_util_test.go | 4 +- pkg/volume/testing/testing.go | 4 +- .../vsphere_volume/vsphere_volume_test.go | 4 +- test/integration/volume/attach_detach_test.go | 1 + 50 files changed, 464 insertions(+), 158 deletions(-) diff --git a/cmd/kube-controller-manager/app/core.go b/cmd/kube-controller-manager/app/core.go index 0d6f3dca1fe73..46c9309f51dc2 100644 --- a/cmd/kube-controller-manager/app/core.go +++ b/cmd/kube-controller-manager/app/core.go @@ -175,7 +175,8 @@ func startAttachDetachController(ctx ControllerContext) (bool, error) { ctx.InformerFactory.Core().V1().PersistentVolumeClaims(), ctx.InformerFactory.Core().V1().PersistentVolumes(), ctx.Cloud, - ProbeAttachableVolumePlugins(ctx.Options.VolumeConfiguration), + ProbeAttachableVolumePlugins(), + GetDynamicPluginProber(ctx.Options.VolumeConfiguration), ctx.Options.DisableAttachDetachReconcilerSync, ctx.Options.ReconcilerSyncLoopPeriod.Duration, attachdetach.DefaultTimerConfig, diff --git a/cmd/kube-controller-manager/app/plugins.go b/cmd/kube-controller-manager/app/plugins.go index 2b036c8b7e65c..bdc62a2673d77 100644 --- a/cmd/kube-controller-manager/app/plugins.go +++ b/cmd/kube-controller-manager/app/plugins.go @@ -60,18 +60,15 @@ import ( ) // ProbeAttachableVolumePlugins collects all volume plugins for the attach/ -// detach controller. VolumeConfiguration is used ot get FlexVolumePluginDir -// which specifies the directory to search for additional third party volume -// plugins. +// detach controller. // The list of plugins is manually compiled. This code and the plugin // initialization code for kubelet really, really need a through refactor. -func ProbeAttachableVolumePlugins(config componentconfig.VolumeConfiguration) []volume.VolumePlugin { +func ProbeAttachableVolumePlugins() []volume.VolumePlugin { allPlugins := []volume.VolumePlugin{} allPlugins = append(allPlugins, aws_ebs.ProbeVolumePlugins()...) allPlugins = append(allPlugins, gce_pd.ProbeVolumePlugins()...) allPlugins = append(allPlugins, cinder.ProbeVolumePlugins()...) - allPlugins = append(allPlugins, flexvolume.ProbeVolumePlugins(config.FlexVolumePluginDir)...) allPlugins = append(allPlugins, portworx.ProbeVolumePlugins()...) allPlugins = append(allPlugins, vsphere_volume.ProbeVolumePlugins()...) allPlugins = append(allPlugins, azure_dd.ProbeVolumePlugins()...) @@ -82,6 +79,13 @@ func ProbeAttachableVolumePlugins(config componentconfig.VolumeConfiguration) [] return allPlugins } +// GetDynamicPluginProber gets the probers of dynamically discoverable plugins +// for the attach/detach controller. +// Currently only Flexvolume plugins are dynamically discoverable. +func GetDynamicPluginProber(config componentconfig.VolumeConfiguration) volume.DynamicPluginProber { + return flexvolume.GetDynamicPluginProber(config.FlexVolumePluginDir) +} + // ProbeControllerVolumePlugins collects all persistent volume plugins into an // easy to use list. Only volume plugins that implement any of // provisioner/recycler/deleter interface should be returned. diff --git a/cmd/kubelet/app/plugins.go b/cmd/kubelet/app/plugins.go index 852bd12bf0a66..13abcd9ff7396 100644 --- a/cmd/kubelet/app/plugins.go +++ b/cmd/kubelet/app/plugins.go @@ -61,9 +61,7 @@ import ( ) // ProbeVolumePlugins collects all volume plugins into an easy to use list. -// PluginDir specifies the directory to search for additional third party -// volume plugins. -func ProbeVolumePlugins(pluginDir string) []volume.VolumePlugin { +func ProbeVolumePlugins() []volume.VolumePlugin { allPlugins := []volume.VolumePlugin{} // The list of plugins to probe is decided by the kubelet binary, not @@ -88,7 +86,6 @@ func ProbeVolumePlugins(pluginDir string) []volume.VolumePlugin { allPlugins = append(allPlugins, downwardapi.ProbeVolumePlugins()...) allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...) allPlugins = append(allPlugins, flocker.ProbeVolumePlugins()...) - allPlugins = append(allPlugins, flexvolume.ProbeVolumePlugins(pluginDir)...) allPlugins = append(allPlugins, azure_file.ProbeVolumePlugins()...) allPlugins = append(allPlugins, configmap.ProbeVolumePlugins()...) allPlugins = append(allPlugins, vsphere_volume.ProbeVolumePlugins()...) @@ -102,6 +99,13 @@ func ProbeVolumePlugins(pluginDir string) []volume.VolumePlugin { return allPlugins } +// GetDynamicPluginProber gets the probers of dynamically discoverable plugins +// for kubelet. +// Currently only Flexvolume plugins are dynamically discoverable. +func GetDynamicPluginProber(pluginDir string) volume.DynamicPluginProber { + return flexvolume.GetDynamicPluginProber(pluginDir) +} + // ProbeNetworkPlugins collects all compiled-in plugins func ProbeNetworkPlugins(pluginDir, cniConfDir, cniBinDir string) []network.NetworkPlugin { allPlugins := []network.NetworkPlugin{} diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 85d37b75c60ab..ddf0a4979758e 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -151,22 +151,22 @@ func UnsecuredDependencies(s *options.KubeletServer) (*kubelet.Dependencies, err } return &kubelet.Dependencies{ - Auth: nil, // default does not enforce auth[nz] - CAdvisorInterface: nil, // cadvisor.New launches background processes (bg http.ListenAndServe, and some bg cleaners), not set here - Cloud: nil, // cloud provider might start background processes - ContainerManager: nil, - DockerClient: dockerClient, - KubeClient: nil, - ExternalKubeClient: nil, - EventClient: nil, - Mounter: mounter, - NetworkPlugins: ProbeNetworkPlugins(s.NetworkPluginDir, s.CNIConfDir, s.CNIBinDir), - OOMAdjuster: oom.NewOOMAdjuster(), - OSInterface: kubecontainer.RealOS{}, - Writer: writer, - VolumePlugins: ProbeVolumePlugins(s.VolumePluginDir), - TLSOptions: tlsOptions, - }, nil + Auth: nil, // default does not enforce auth[nz] + CAdvisorInterface: nil, // cadvisor.New launches background processes (bg http.ListenAndServe, and some bg cleaners), not set here + Cloud: nil, // cloud provider might start background processes + ContainerManager: nil, + DockerClient: dockerClient, + KubeClient: nil, + ExternalKubeClient: nil, + EventClient: nil, + Mounter: mounter, + NetworkPlugins: ProbeNetworkPlugins(s.NetworkPluginDir, s.CNIConfDir, s.CNIBinDir), + OOMAdjuster: oom.NewOOMAdjuster(), + OSInterface: kubecontainer.RealOS{}, + Writer: writer, + VolumePlugins: ProbeVolumePlugins(), + DynamicPluginProber: GetDynamicPluginProber(s.VolumePluginDir), + TLSOptions: tlsOptions}, nil } // Run runs the specified KubeletServer with the given Dependencies. This should never exit. diff --git a/pkg/controller/volume/attachdetach/BUILD b/pkg/controller/volume/attachdetach/BUILD index db1e5fcccb2d3..b3d129b7abed3 100644 --- a/pkg/controller/volume/attachdetach/BUILD +++ b/pkg/controller/volume/attachdetach/BUILD @@ -45,6 +45,7 @@ go_test( "//pkg/controller:go_default_library", "//pkg/controller/volume/attachdetach/cache:go_default_library", "//pkg/controller/volume/attachdetach/testing:go_default_library", + "//pkg/volume:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", diff --git a/pkg/controller/volume/attachdetach/attach_detach_controller.go b/pkg/controller/volume/attachdetach/attach_detach_controller.go index 151c900fd6c0f..a608fbf94d7df 100644 --- a/pkg/controller/volume/attachdetach/attach_detach_controller.go +++ b/pkg/controller/volume/attachdetach/attach_detach_controller.go @@ -97,6 +97,7 @@ func NewAttachDetachController( pvInformer coreinformers.PersistentVolumeInformer, cloud cloudprovider.Interface, plugins []volume.VolumePlugin, + prober volume.DynamicPluginProber, disableReconciliationSync bool, reconcilerSyncDuration time.Duration, timerConfig TimerConfig) (AttachDetachController, error) { @@ -127,7 +128,7 @@ func NewAttachDetachController( cloud: cloud, } - if err := adc.volumePluginMgr.InitPlugins(plugins, adc); err != nil { + if err := adc.volumePluginMgr.InitPlugins(plugins, prober, adc); err != nil { return nil, fmt.Errorf("Could not initialize volume plugins for Attach/Detach Controller: %+v", err) } diff --git a/pkg/controller/volume/attachdetach/attach_detach_controller_test.go b/pkg/controller/volume/attachdetach/attach_detach_controller_test.go index b63103bf2f8cd..b0e12589b16c8 100644 --- a/pkg/controller/volume/attachdetach/attach_detach_controller_test.go +++ b/pkg/controller/volume/attachdetach/attach_detach_controller_test.go @@ -29,6 +29,7 @@ import ( "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/volume/attachdetach/cache" controllervolumetesting "k8s.io/kubernetes/pkg/controller/volume/attachdetach/testing" + "k8s.io/kubernetes/pkg/volume" ) func Test_NewAttachDetachController_Positive(t *testing.T) { @@ -45,6 +46,7 @@ func Test_NewAttachDetachController_Positive(t *testing.T) { informerFactory.Core().V1().PersistentVolumes(), nil, /* cloud */ nil, /* plugins */ + nil, /* prober */ false, 5*time.Second, DefaultTimerConfig) @@ -79,8 +81,9 @@ func Test_AttachDetachControllerStateOfWolrdPopulators_Positive(t *testing.T) { // Act plugins := controllervolumetesting.CreateTestPlugin() + var prober volume.DynamicPluginProber = nil // TODO (#51147) inject mock - if err := adc.volumePluginMgr.InitPlugins(plugins, adc); err != nil { + if err := adc.volumePluginMgr.InitPlugins(plugins, prober, adc); err != nil { t.Fatalf("Could not initialize volume plugins for Attach/Detach Controller: %+v", err) } @@ -141,6 +144,7 @@ func attachDetachRecoveryTestCase(t *testing.T, extraPods1 []*v1.Pod, extraPods2 informerFactory := informers.NewSharedInformerFactory(fakeKubeClient, time.Second*1) //informerFactory := informers.NewSharedInformerFactory(fakeKubeClient, time.Second*1) plugins := controllervolumetesting.CreateTestPlugin() + var prober volume.DynamicPluginProber = nil // TODO (#51147) inject mock nodeInformer := informerFactory.Core().V1().Nodes().Informer() podInformer := informerFactory.Core().V1().Pods().Informer() var podsNum, extraPodsNum, nodesNum, i int @@ -212,6 +216,7 @@ func attachDetachRecoveryTestCase(t *testing.T, extraPods1 []*v1.Pod, extraPods2 informerFactory.Core().V1().PersistentVolumes(), nil, /* cloud */ plugins, + prober, false, 1*time.Second, DefaultTimerConfig) diff --git a/pkg/controller/volume/persistentvolume/framework_test.go b/pkg/controller/volume/persistentvolume/framework_test.go index 64c75adb5321b..9c53ef3891fbe 100644 --- a/pkg/controller/volume/persistentvolume/framework_test.go +++ b/pkg/controller/volume/persistentvolume/framework_test.go @@ -827,7 +827,7 @@ func wrapTestWithPluginCalls(expectedRecycleCalls, expectedDeleteCalls []error, deleteCalls: expectedDeleteCalls, provisionCalls: expectedProvisionCalls, } - ctrl.volumePluginMgr.InitPlugins([]vol.VolumePlugin{plugin}, ctrl) + ctrl.volumePluginMgr.InitPlugins([]vol.VolumePlugin{plugin}, nil /* prober */, ctrl) return toWrap(ctrl, reactor, test) } } diff --git a/pkg/controller/volume/persistentvolume/pv_controller_base.go b/pkg/controller/volume/persistentvolume/pv_controller_base.go index cfbe26401aeb2..a4c6d918d1f17 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller_base.go +++ b/pkg/controller/volume/persistentvolume/pv_controller_base.go @@ -90,7 +90,8 @@ func NewController(p ControllerParameters) (*PersistentVolumeController, error) resyncPeriod: p.SyncPeriod, } - if err := controller.volumePluginMgr.InitPlugins(p.VolumePlugins, controller); err != nil { + // Prober is nil because PV is not aware of Flexvolume. + if err := controller.volumePluginMgr.InitPlugins(p.VolumePlugins, nil /* prober */, controller); err != nil { return nil, fmt.Errorf("Could not initialize volume plugins for PersistentVolume Controller: %v", err) } diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 80fd03f26a163..952af0ac1bea0 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -243,6 +243,7 @@ type Dependencies struct { Recorder record.EventRecorder Writer kubeio.Writer VolumePlugins []volume.VolumePlugin + DynamicPluginProber volume.DynamicPluginProber TLSOptions *server.TLSOptions KubeletConfigController *kubeletconfig.Controller } @@ -736,7 +737,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, kubeDeps.Recorder) klet.volumePluginMgr, err = - NewInitializedVolumePluginMgr(klet, secretManager, configMapManager, kubeDeps.VolumePlugins) + NewInitializedVolumePluginMgr(klet, secretManager, configMapManager, kubeDeps.VolumePlugins, kubeDeps.DynamicPluginProber) if err != nil { return nil, err } diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index b5a1ba0924b3c..57f0ef96e6be9 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -272,8 +272,9 @@ func newTestKubeletWithImageList( kubelet.admitHandlers.AddPodAdmitHandler(lifecycle.NewPredicateAdmitHandler(kubelet.getNodeAnyWay, lifecycle.NewAdmissionFailureHandlerStub())) plug := &volumetest.FakeVolumePlugin{PluginName: "fake", Host: nil} + var prober volume.DynamicPluginProber = nil // TODO (#51147) inject mock kubelet.volumePluginMgr, err = - NewInitializedVolumePluginMgr(kubelet, kubelet.secretManager, kubelet.configMapManager, []volume.VolumePlugin{plug}) + NewInitializedVolumePluginMgr(kubelet, kubelet.secretManager, kubelet.configMapManager, []volume.VolumePlugin{plug}, prober) require.NoError(t, err, "Failed to initialize VolumePluginMgr") kubelet.mounter = &mount.FakeMounter{} diff --git a/pkg/kubelet/runonce_test.go b/pkg/kubelet/runonce_test.go index 7449c271cc3dc..a43b6fb27d50f 100644 --- a/pkg/kubelet/runonce_test.go +++ b/pkg/kubelet/runonce_test.go @@ -92,7 +92,7 @@ func TestRunOnce(t *testing.T) { plug := &volumetest.FakeVolumePlugin{PluginName: "fake", Host: nil} kb.volumePluginMgr, err = - NewInitializedVolumePluginMgr(kb, fakeSecretManager, fakeConfigMapManager, []volume.VolumePlugin{plug}) + NewInitializedVolumePluginMgr(kb, fakeSecretManager, fakeConfigMapManager, []volume.VolumePlugin{plug}, nil /* prober */) if err != nil { t.Fatalf("failed to initialize VolumePluginMgr: %v", err) } diff --git a/pkg/kubelet/volume_host.go b/pkg/kubelet/volume_host.go index 3cedc81da8fec..26323b7d84883 100644 --- a/pkg/kubelet/volume_host.go +++ b/pkg/kubelet/volume_host.go @@ -41,7 +41,8 @@ func NewInitializedVolumePluginMgr( kubelet *Kubelet, secretManager secret.Manager, configMapManager configmap.Manager, - plugins []volume.VolumePlugin) (*volume.VolumePluginMgr, error) { + plugins []volume.VolumePlugin, + prober volume.DynamicPluginProber) (*volume.VolumePluginMgr, error) { kvh := &kubeletVolumeHost{ kubelet: kubelet, volumePluginMgr: volume.VolumePluginMgr{}, @@ -49,7 +50,7 @@ func NewInitializedVolumePluginMgr( configMapManager: configMapManager, } - if err := kvh.volumePluginMgr.InitPlugins(plugins, kvh); err != nil { + if err := kvh.volumePluginMgr.InitPlugins(plugins, prober, kvh); err != nil { return nil, fmt.Errorf( "Could not initialize volume plugins for KubeletVolumePluginMgr: %v", err) diff --git a/pkg/kubelet/volumemanager/volume_manager_test.go b/pkg/kubelet/volumemanager/volume_manager_test.go index 2648e0f2b0d96..6eb81cb7f74c0 100644 --- a/pkg/kubelet/volumemanager/volume_manager_test.go +++ b/pkg/kubelet/volumemanager/volume_manager_test.go @@ -217,7 +217,8 @@ func newTestVolumeManager(tmpDir string, podManager pod.Manager, kubeClient clie plug := &volumetest.FakeVolumePlugin{PluginName: "fake", Host: nil} fakeRecorder := &record.FakeRecorder{} plugMgr := &volume.VolumePluginMgr{} - plugMgr.InitPlugins([]volume.VolumePlugin{plug}, volumetest.NewFakeVolumeHost(tmpDir, kubeClient, nil)) + // TODO (#51147) inject mock prober + plugMgr.InitPlugins([]volume.VolumePlugin{plug}, nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, kubeClient, nil)) statusManager := status.NewManager(kubeClient, podManager, &statustest.FakePodDeletionSafetyProvider{}) vm := NewVolumeManager( diff --git a/pkg/volume/aws_ebs/aws_ebs_test.go b/pkg/volume/aws_ebs/aws_ebs_test.go index 3766b21254a1e..85538b3649a4a 100644 --- a/pkg/volume/aws_ebs/aws_ebs_test.go +++ b/pkg/volume/aws_ebs/aws_ebs_test.go @@ -40,7 +40,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/aws-ebs") if err != nil { @@ -64,7 +64,7 @@ func TestGetAccessModes(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/aws-ebs") if err != nil { @@ -113,7 +113,7 @@ func TestPlugin(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/aws-ebs") if err != nil { @@ -251,7 +251,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, clientset, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, clientset, nil)) plug, _ := plugMgr.FindPluginByName(awsElasticBlockStorePluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes @@ -271,7 +271,7 @@ func TestMounterAndUnmounterTypeAssert(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/aws-ebs") if err != nil { diff --git a/pkg/volume/azure_dd/azure_dd_test.go b/pkg/volume/azure_dd/azure_dd_test.go index 59becdeeadadf..e1d24c9141e7e 100644 --- a/pkg/volume/azure_dd/azure_dd_test.go +++ b/pkg/volume/azure_dd/azure_dd_test.go @@ -33,7 +33,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName(azureDataDiskPluginName) if err != nil { diff --git a/pkg/volume/azure_file/azure_file_test.go b/pkg/volume/azure_file/azure_file_test.go index 8991d5e231a94..d6fc125963e64 100644 --- a/pkg/volume/azure_file/azure_file_test.go +++ b/pkg/volume/azure_file/azure_file_test.go @@ -41,7 +41,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/azure-file") if err != nil { @@ -65,7 +65,7 @@ func TestGetAccessModes(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/azure-file") if err != nil { @@ -131,7 +131,7 @@ func TestPluginWithOtherCloudProvider(t *testing.T) { func testPlugin(t *testing.T, tmpDir string, volumeHost volume.VolumeHost) { plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumeHost) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumeHost) plug, err := plugMgr.FindPluginByName("kubernetes.io/azure-file") if err != nil { @@ -228,7 +228,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { client := fake.NewSimpleClientset(pv, claim) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost("/tmp/fake", client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost("/tmp/fake", client, nil)) plug, _ := plugMgr.FindPluginByName(azureFilePluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes @@ -260,7 +260,7 @@ func TestMounterAndUnmounterTypeAssert(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/azure-file") if err != nil { diff --git a/pkg/volume/cephfs/cephfs_test.go b/pkg/volume/cephfs/cephfs_test.go index f17e1902eaccd..da9d85f11e133 100644 --- a/pkg/volume/cephfs/cephfs_test.go +++ b/pkg/volume/cephfs/cephfs_test.go @@ -36,7 +36,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/cephfs") if err != nil { t.Errorf("Can't find the plugin by name") @@ -59,7 +59,7 @@ func TestPlugin(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/cephfs") if err != nil { t.Errorf("Can't find the plugin by name") @@ -123,7 +123,7 @@ func TestConstructVolumeSpec(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/cephfs") if err != nil { t.Errorf("can't find cephfs plugin by name") diff --git a/pkg/volume/cinder/cinder_test.go b/pkg/volume/cinder/cinder_test.go index d4cf53cdc7190..a5fc228814f83 100644 --- a/pkg/volume/cinder/cinder_test.go +++ b/pkg/volume/cinder/cinder_test.go @@ -38,7 +38,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/cinder") if err != nil { @@ -134,7 +134,7 @@ func TestPlugin(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/cinder") if err != nil { diff --git a/pkg/volume/configmap/configmap_test.go b/pkg/volume/configmap/configmap_test.go index 5ff5acf8018f3..9b2388517520c 100644 --- a/pkg/volume/configmap/configmap_test.go +++ b/pkg/volume/configmap/configmap_test.go @@ -272,7 +272,7 @@ func TestCanSupport(t *testing.T) { pluginMgr := volume.VolumePluginMgr{} tempDir, host := newTestHost(t, nil) defer os.RemoveAll(tempDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(configMapPluginName) if err != nil { @@ -304,7 +304,7 @@ func TestPlugin(t *testing.T) { ) defer os.RemoveAll(tempDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(configMapPluginName) if err != nil { @@ -368,7 +368,7 @@ func TestPluginReboot(t *testing.T) { ) defer os.RemoveAll(rootDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(configMapPluginName) if err != nil { @@ -424,7 +424,7 @@ func TestPluginOptional(t *testing.T) { volumeSpec.VolumeSource.ConfigMap.Optional = &trueVal defer os.RemoveAll(tempDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(configMapPluginName) if err != nil { @@ -499,7 +499,7 @@ func TestPluginKeysOptional(t *testing.T) { volumeSpec.VolumeSource.ConfigMap.Optional = &trueVal defer os.RemoveAll(tempDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(configMapPluginName) if err != nil { diff --git a/pkg/volume/downwardapi/downwardapi_test.go b/pkg/volume/downwardapi/downwardapi_test.go index b0edd400f7807..4f68da8456629 100644 --- a/pkg/volume/downwardapi/downwardapi_test.go +++ b/pkg/volume/downwardapi/downwardapi_test.go @@ -54,7 +54,7 @@ func TestCanSupport(t *testing.T) { pluginMgr := volume.VolumePluginMgr{} tmpDir, host := newTestHost(t, nil) defer os.RemoveAll(tmpDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(downwardAPIPluginName) if err != nil { @@ -219,7 +219,7 @@ func newDownwardAPITest(t *testing.T, name string, volumeFiles, podLabels, podAn pluginMgr := volume.VolumePluginMgr{} rootDir, host := newTestHost(t, clientset) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(downwardAPIPluginName) if err != nil { t.Errorf("Can't find the plugin by name") diff --git a/pkg/volume/empty_dir/empty_dir_test.go b/pkg/volume/empty_dir/empty_dir_test.go index 642c49422c563..31cc7f5a31228 100644 --- a/pkg/volume/empty_dir/empty_dir_test.go +++ b/pkg/volume/empty_dir/empty_dir_test.go @@ -36,7 +36,7 @@ import ( // Construct an instance of a plugin, by name. func makePluginUnderTest(t *testing.T, plugName, basePath string) volume.VolumePlugin { plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(basePath, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(basePath, nil, nil)) plug, err := plugMgr.FindPluginByName(plugName) if err != nil { diff --git a/pkg/volume/fc/fc_test.go b/pkg/volume/fc/fc_test.go index 5e6ab7f9fa24d..b800694281744 100644 --- a/pkg/volume/fc/fc_test.go +++ b/pkg/volume/fc/fc_test.go @@ -39,7 +39,7 @@ func TestCanSupport(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/fc") if err != nil { @@ -61,7 +61,7 @@ func TestGetAccessModes(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/fc") if err != nil { @@ -132,7 +132,7 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/fc") if err != nil { @@ -202,7 +202,7 @@ func doTestPluginNilMounter(t *testing.T, spec *volume.Spec) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/fc") if err != nil { @@ -355,7 +355,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { client := fake.NewSimpleClientset(pv, claim) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, client, nil)) plug, _ := plugMgr.FindPluginByName(fcPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes diff --git a/pkg/volume/flexvolume/BUILD b/pkg/volume/flexvolume/BUILD index b590ed98acf85..02f3602940803 100644 --- a/pkg/volume/flexvolume/BUILD +++ b/pkg/volume/flexvolume/BUILD @@ -29,9 +29,11 @@ go_library( "//pkg/util/strings:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", + "//vendor/github.com/fsnotify/fsnotify:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/pkg/volume/flexvolume/flexvolume_test.go b/pkg/volume/flexvolume/flexvolume_test.go index 76ade7b85450d..292beb54506f3 100644 --- a/pkg/volume/flexvolume/flexvolume_test.go +++ b/pkg/volume/flexvolume/flexvolume_test.go @@ -174,7 +174,7 @@ func TestCanSupport(t *testing.T) { plugMgr := volume.VolumePluginMgr{} installPluginUnderTest(t, "kubernetes.io", "fakeAttacher", tmpDir, execScriptTempl1, nil) - plugMgr.InitPlugins(ProbeVolumePlugins(tmpDir), volumetest.NewFakeVolumeHost("fake", nil, nil)) + plugMgr.InitPlugins(nil, GetDynamicPluginProber(tmpDir), volumetest.NewFakeVolumeHost("fake", nil, nil)) plugin, err := plugMgr.FindPluginByName("flexvolume-kubernetes.io/fakeAttacher") if err != nil { t.Fatalf("Can't find the plugin by name") @@ -202,7 +202,7 @@ func TestGetAccessModes(t *testing.T) { plugMgr := volume.VolumePluginMgr{} installPluginUnderTest(t, "kubernetes.io", "fakeAttacher", tmpDir, execScriptTempl1, nil) - plugMgr.InitPlugins(ProbeVolumePlugins(tmpDir), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(nil, GetDynamicPluginProber(tmpDir), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plugin, err := plugMgr.FindPersistentPluginByName("flexvolume-kubernetes.io/fakeAttacher") if err != nil { diff --git a/pkg/volume/flexvolume/probe.go b/pkg/volume/flexvolume/probe.go index 431c340a22e28..4acdb9f932ec7 100644 --- a/pkg/volume/flexvolume/probe.go +++ b/pkg/volume/flexvolume/probe.go @@ -19,28 +19,217 @@ package flexvolume import ( "io/ioutil" + "github.com/golang/glog" "k8s.io/kubernetes/pkg/volume" + + "os" + + "fmt" + "path/filepath" + "sync" + "time" + + "github.com/fsnotify/fsnotify" + "k8s.io/apimachinery/pkg/util/errors" +) + +type flexVolumeProber struct { + mutex sync.Mutex + pluginDir string // Flexvolume driver directory + watcher *fsnotify.Watcher + probeNeeded bool // Must only read and write this through testAndSetProbeNeeded. + lastUpdated time.Time // Last time probeNeeded was updated. + watchEventCount int +} + +const ( + // TODO (cxing) Tune these params based on test results. + // watchEventLimit is the max allowable number of processed watches within watchEventInterval. + watchEventInterval = 5 * time.Second + watchEventLimit = 20 ) -// This is the primary entrypoint for volume plugins. -func ProbeVolumePlugins(pluginDir string) []volume.VolumePlugin { - plugins := []volume.VolumePlugin{} +func GetDynamicPluginProber(pluginDir string) volume.DynamicPluginProber { + return &flexVolumeProber{pluginDir: pluginDir} +} + +func (prober *flexVolumeProber) Init() error { + prober.testAndSetProbeNeeded(true) + prober.lastUpdated = time.Now() + + if err := prober.createPluginDir(); err != nil { + return err + } + if err := prober.initWatcher(); err != nil { + return err + } + + go func() { + defer prober.watcher.Close() + for { + select { + case event := <-prober.watcher.Events: + if err := prober.handleWatchEvent(event); err != nil { + glog.Errorf("Flexvolume prober watch: %s", err) + } + case err := <-prober.watcher.Errors: + glog.Errorf("Received an error from watcher: %s", err) + } + } + }() - files, _ := ioutil.ReadDir(pluginDir) + return nil +} + +// Probes for Flexvolume drivers. +// If a filesystem update has occurred since the last probe, updated = true +// and the list of probed plugins is returned. +// Otherwise, update = false and probedPlugins = nil. +// +// If an error occurs, updated and plugins are set arbitrarily. +func (prober *flexVolumeProber) Probe() (updated bool, plugins []volume.VolumePlugin, err error) { + probeNeeded := prober.testAndSetProbeNeeded(false) + + if !probeNeeded { + return false, nil, nil + } + + files, err := ioutil.ReadDir(prober.pluginDir) + if err != nil { + return false, nil, fmt.Errorf("Error reading the Flexvolume directory: %s", err) + } + + plugins = []volume.VolumePlugin{} + allErrs := []error{} for _, f := range files { - // only directories are counted as plugins + // only directories with names that do not begin with '.' are counted as plugins // and pluginDir/dirname/dirname should be an executable // unless dirname contains '~' for escaping namespace // e.g. dirname = vendor~cifs // then, executable will be pluginDir/dirname/cifs - if f.IsDir() { - plugin, err := NewFlexVolumePlugin(pluginDir, f.Name()) - if err != nil { + if f.IsDir() && filepath.Base(f.Name())[0] != '.' { + plugin, pluginErr := NewFlexVolumePlugin(prober.pluginDir, f.Name()) + if pluginErr != nil { + pluginErr = fmt.Errorf( + "Error creating Flexvolume plugin from directory %s, skipping. Error: %s", + f.Name(), pluginErr) + allErrs = append(allErrs, pluginErr) continue } plugins = append(plugins, plugin) } } - return plugins + + return true, plugins, errors.NewAggregate(allErrs) +} + +func (prober *flexVolumeProber) handleWatchEvent(event fsnotify.Event) error { + // event.Name is the watched path. + if filepath.Base(event.Name)[0] == '.' { + // Ignore files beginning with '.' + return nil + } + + eventPathAbs, err := filepath.Abs(event.Name) + if err != nil { + return err + } + + pluginDirAbs, err := filepath.Abs(prober.pluginDir) + if err != nil { + return err + } + + // If the Flexvolume plugin directory is removed, need to recreate it + // in order to keep it under watch. + if eventOpIs(event, fsnotify.Remove) && eventPathAbs == pluginDirAbs { + glog.Warningf("Flexvolume plugin directory at %s is removed. Recreating.", pluginDirAbs) + if err := prober.createPluginDir(); err != nil { + return err + } + if err := prober.addWatchRecursive(pluginDirAbs); err != nil { + return err + } + } else if eventOpIs(event, fsnotify.Create) { + if err := prober.addWatchRecursive(eventPathAbs); err != nil { + return err + } + } + + prober.updateProbeNeeded() + + return nil +} + +func (prober *flexVolumeProber) updateProbeNeeded() { + // Within 'watchEventInterval' seconds, a max of 'watchEventLimit' watch events is processed. + // The watch event will not be registered if the limit is reached. + // This prevents increased disk usage from Probe() being triggered too frequently (either + // accidentally or maliciously). + if time.Since(prober.lastUpdated) > watchEventInterval { + // Update, then reset the timer and watch count. + prober.testAndSetProbeNeeded(true) + prober.lastUpdated = time.Now() + prober.watchEventCount = 1 + } else if prober.watchEventCount < watchEventLimit { + prober.testAndSetProbeNeeded(true) + prober.watchEventCount++ + } +} + +// Recursively adds to watch all directories inside and including the file specified by the given filename. +// If the file is a symlink to a directory, it will watch the symlink but not any of the subdirectories. +// +// Each file or directory change triggers two events: one from the watch on itself, another from the watch +// on its parent directory. +func (prober *flexVolumeProber) addWatchRecursive(filename string) error { + addWatch := func(path string, info os.FileInfo, err error) error { + if info.IsDir() { + if err := prober.watcher.Add(path); err != nil { + glog.Errorf("Error recursively adding watch: %v", err) + } + } + return nil + } + + return filepath.Walk(filename, addWatch) +} + +// Creates a new filesystem watcher and adds watches for the plugin directory +// and all of its subdirectories. +func (prober *flexVolumeProber) initWatcher() error { + var err error + if prober.watcher, err = fsnotify.NewWatcher(); err != nil { + return fmt.Errorf("Error creating new watcher: %s", err) + } + + if err = prober.addWatchRecursive(prober.pluginDir); err != nil { + return fmt.Errorf("Error adding watch on Flexvolume directory: %s", err) + } + + return nil +} + +// Creates the plugin directory, if it doesn't already exist. +func (prober *flexVolumeProber) createPluginDir() error { + if _, err := os.Stat(prober.pluginDir); os.IsNotExist(err) { + err := os.MkdirAll(prober.pluginDir, 0755) + if err != nil { + return fmt.Errorf("Error (re-)creating driver directory: %s", err) + } + } + + return nil +} + +func (prober *flexVolumeProber) testAndSetProbeNeeded(newval bool) (oldval bool) { + prober.mutex.Lock() + defer prober.mutex.Unlock() + oldval, prober.probeNeeded = prober.probeNeeded, newval + return +} + +func eventOpIs(event fsnotify.Event, op fsnotify.Op) bool { + return event.Op&op == op } diff --git a/pkg/volume/flocker/flocker_test.go b/pkg/volume/flocker/flocker_test.go index 9ffba24befe00..78930d8945129 100644 --- a/pkg/volume/flocker/flocker_test.go +++ b/pkg/volume/flocker/flocker_test.go @@ -127,7 +127,7 @@ func newInitializedVolumePlugMgr(t *testing.T) (*volume.VolumePluginMgr, string) plugMgr := &volume.VolumePluginMgr{} dir, err := utiltesting.MkTmpdir("flocker") assert.NoError(t, err) - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(dir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(dir, nil, nil)) return plugMgr, dir } @@ -138,7 +138,7 @@ func TestPlugin(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/flocker") if err != nil { diff --git a/pkg/volume/flocker/flocker_volume_test.go b/pkg/volume/flocker/flocker_volume_test.go index 8abc62c82e2bd..7f1a2e3071530 100644 --- a/pkg/volume/flocker/flocker_volume_test.go +++ b/pkg/volume/flocker/flocker_volume_test.go @@ -35,7 +35,7 @@ func newTestableProvisioner(assert *assert.Assertions, options volume.VolumeOpti assert.NoError(err, fmt.Sprintf("can't make a temp dir: %v", err)) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName(pluginName) assert.NoError(err, "Can't find the plugin by name") diff --git a/pkg/volume/gce_pd/attacher_test.go b/pkg/volume/gce_pd/attacher_test.go index 84de7c55b4bbf..cccb876376b4d 100644 --- a/pkg/volume/gce_pd/attacher_test.go +++ b/pkg/volume/gce_pd/attacher_test.go @@ -202,7 +202,8 @@ func newPlugin() *gcePersistentDiskPlugin { host := volumetest.NewFakeVolumeHost( "/tmp", /* rootDir */ nil, /* kubeClient */ - nil /* plugins */) + nil, /* plugins */ + ) plugins := ProbeVolumePlugins() plugin := plugins[0] plugin.Init(host) diff --git a/pkg/volume/gce_pd/gce_pd_test.go b/pkg/volume/gce_pd/gce_pd_test.go index 4dc1761ec7573..285e7b5faf0fc 100644 --- a/pkg/volume/gce_pd/gce_pd_test.go +++ b/pkg/volume/gce_pd/gce_pd_test.go @@ -39,7 +39,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/gce-pd") if err != nil { @@ -63,7 +63,7 @@ func TestGetAccessModes(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/gce-pd") if err != nil { @@ -106,7 +106,7 @@ func TestPlugin(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/gce-pd") if err != nil { @@ -244,7 +244,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, client, nil)) plug, _ := plugMgr.FindPluginByName(gcePersistentDiskPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes diff --git a/pkg/volume/git_repo/git_repo_test.go b/pkg/volume/git_repo/git_repo_test.go index e851e43c475b6..1bee3ad218586 100644 --- a/pkg/volume/git_repo/git_repo_test.go +++ b/pkg/volume/git_repo/git_repo_test.go @@ -47,7 +47,7 @@ func TestCanSupport(t *testing.T) { plugMgr := volume.VolumePluginMgr{} tempDir, host := newTestHost(t) defer os.RemoveAll(tempDir) - plugMgr.InitPlugins(ProbeVolumePlugins(), host) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plug, err := plugMgr.FindPluginByName("kubernetes.io/git-repo") if err != nil { @@ -225,7 +225,7 @@ func doTestPlugin(scenario struct { plugMgr := volume.VolumePluginMgr{} rootDir, host := newTestHost(t) defer os.RemoveAll(rootDir) - plugMgr.InitPlugins(ProbeVolumePlugins(), host) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plug, err := plugMgr.FindPluginByName("kubernetes.io/git-repo") if err != nil { diff --git a/pkg/volume/glusterfs/glusterfs_test.go b/pkg/volume/glusterfs/glusterfs_test.go index 2f4f66adff87a..ba8a2fb37268f 100644 --- a/pkg/volume/glusterfs/glusterfs_test.go +++ b/pkg/volume/glusterfs/glusterfs_test.go @@ -43,7 +43,7 @@ func TestCanSupport(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/glusterfs") if err != nil { t.Errorf("Can't find the plugin by name") @@ -67,7 +67,7 @@ func TestGetAccessModes(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/glusterfs") if err != nil { @@ -95,7 +95,7 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/glusterfs") if err != nil { t.Errorf("Can't find the plugin by name") @@ -213,7 +213,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { client := fake.NewSimpleClientset(pv, claim, ep) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, client, nil)) plug, _ := plugMgr.FindPluginByName(glusterfsPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes diff --git a/pkg/volume/host_path/host_path_test.go b/pkg/volume/host_path/host_path_test.go index 8d78b99d0fbfc..1184f5d35ad13 100644 --- a/pkg/volume/host_path/host_path_test.go +++ b/pkg/volume/host_path/host_path_test.go @@ -51,7 +51,7 @@ func newHostPathTypeList(pathType ...string) []*v1.HostPathType { func TestCanSupport(t *testing.T) { plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("fake", nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost("fake", nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/host-path") if err != nil { @@ -73,7 +73,7 @@ func TestCanSupport(t *testing.T) { func TestGetAccessModes(t *testing.T) { plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/host-path") if err != nil { @@ -87,7 +87,7 @@ func TestGetAccessModes(t *testing.T) { func TestRecycler(t *testing.T) { plugMgr := volume.VolumePluginMgr{} pluginHost := volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil) - plugMgr.InitPlugins([]volume.VolumePlugin{&hostPathPlugin{nil, volume.VolumeConfig{}}}, pluginHost) + plugMgr.InitPlugins([]volume.VolumePlugin{&hostPathPlugin{nil, volume.VolumeConfig{}}}, nil, pluginHost) spec := &volume.Spec{PersistentVolume: &v1.PersistentVolume{Spec: v1.PersistentVolumeSpec{PersistentVolumeSource: v1.PersistentVolumeSource{HostPath: &v1.HostPathVolumeSource{Path: "/foo"}}}}} _, err := plugMgr.FindRecyclablePluginBySpec(spec) @@ -106,7 +106,7 @@ func TestDeleter(t *testing.T) { } plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) spec := &volume.Spec{PersistentVolume: &v1.PersistentVolume{Spec: v1.PersistentVolumeSpec{PersistentVolumeSource: v1.PersistentVolumeSource{HostPath: &v1.HostPathVolumeSource{Path: tempPath}}}}} plug, err := plugMgr.FindDeletablePluginBySpec(spec) @@ -140,7 +140,7 @@ func TestDeleterTempDir(t *testing.T) { for name, test := range tests { plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) spec := &volume.Spec{PersistentVolume: &v1.PersistentVolume{Spec: v1.PersistentVolumeSpec{PersistentVolumeSource: v1.PersistentVolumeSource{HostPath: &v1.HostPathVolumeSource{Path: test.path}}}}} plug, _ := plugMgr.FindDeletablePluginBySpec(spec) deleter, _ := plug.NewDeleter(spec) @@ -161,6 +161,7 @@ func TestProvisioner(t *testing.T) { plugMgr := volume.VolumePluginMgr{} plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{ProvisioningEnabled: true}), + nil, volumetest.NewFakeVolumeHost("/tmp/fake", nil, nil)) spec := &volume.Spec{PersistentVolume: &v1.PersistentVolume{Spec: v1.PersistentVolumeSpec{PersistentVolumeSource: v1.PersistentVolumeSource{HostPath: &v1.HostPathVolumeSource{Path: tempPath}}}}} plug, err := plugMgr.FindCreatablePluginBySpec(spec) @@ -199,7 +200,7 @@ func TestProvisioner(t *testing.T) { func TestInvalidHostPath(t *testing.T) { plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("fake", nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost("fake", nil, nil)) plug, err := plugMgr.FindPluginByName(hostPathPluginName) if err != nil { @@ -224,7 +225,7 @@ func TestInvalidHostPath(t *testing.T) { func TestPlugin(t *testing.T) { plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("fake", nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost("fake", nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/host-path") if err != nil { @@ -300,7 +301,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { client := fake.NewSimpleClientset(pv, claim) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost("/tmp/fake", client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost("/tmp/fake", client, nil)) plug, _ := plugMgr.FindPluginByName(hostPathPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes diff --git a/pkg/volume/iscsi/iscsi_test.go b/pkg/volume/iscsi/iscsi_test.go index d9499bf532379..ebdb67adc284e 100644 --- a/pkg/volume/iscsi/iscsi_test.go +++ b/pkg/volume/iscsi/iscsi_test.go @@ -39,7 +39,7 @@ func TestCanSupport(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/iscsi") if err != nil { @@ -61,7 +61,7 @@ func TestGetAccessModes(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/iscsi") if err != nil { @@ -132,7 +132,7 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/iscsi") if err != nil { @@ -276,7 +276,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { client := fake.NewSimpleClientset(pv, claim) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, client, nil)) plug, _ := plugMgr.FindPluginByName(iscsiPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes diff --git a/pkg/volume/local/local_test.go b/pkg/volume/local/local_test.go index 972da115ec3b1..87fb829c493b3 100644 --- a/pkg/volume/local/local_test.go +++ b/pkg/volume/local/local_test.go @@ -44,7 +44,7 @@ func getPlugin(t *testing.T) (string, volume.VolumePlugin) { } plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName(localVolumePluginName) if err != nil { @@ -64,7 +64,7 @@ func getPersistentPlugin(t *testing.T) (string, volume.PersistentVolumePlugin) { } plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName(localVolumePluginName) if err != nil { @@ -337,7 +337,7 @@ func TestUnsupportedPlugins(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) spec := getTestVolume(false, tmpDir) recyclePlug, err := plugMgr.FindRecyclablePluginBySpec(spec) diff --git a/pkg/volume/nfs/nfs_test.go b/pkg/volume/nfs/nfs_test.go index 3b086b44b62e7..2cb83235b59c8 100644 --- a/pkg/volume/nfs/nfs_test.go +++ b/pkg/volume/nfs/nfs_test.go @@ -39,7 +39,7 @@ func TestCanSupport(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/nfs") if err != nil { t.Errorf("Can't find the plugin by name") @@ -67,7 +67,7 @@ func TestGetAccessModes(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/nfs") if err != nil { @@ -86,7 +86,7 @@ func TestRecycler(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins([]volume.VolumePlugin{&nfsPlugin{nil, volume.VolumeConfig{}}}, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins([]volume.VolumePlugin{&nfsPlugin{nil, volume.VolumeConfig{}}}, nil, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) spec := &volume.Spec{PersistentVolume: &v1.PersistentVolume{Spec: v1.PersistentVolumeSpec{PersistentVolumeSource: v1.PersistentVolumeSource{NFS: &v1.NFSVolumeSource{Path: "/foo"}}}}} _, plugin_err := plugMgr.FindRecyclablePluginBySpec(spec) @@ -112,7 +112,7 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/nfs") if err != nil { t.Errorf("Can't find the plugin by name") @@ -240,7 +240,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { client := fake.NewSimpleClientset(pv, claim) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), volumetest.NewFakeVolumeHost(tmpDir, client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(volume.VolumeConfig{}), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, client, nil)) plug, _ := plugMgr.FindPluginByName(nfsPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes diff --git a/pkg/volume/photon_pd/photon_pd_test.go b/pkg/volume/photon_pd/photon_pd_test.go index b874c5b0da624..085ca2408ee06 100644 --- a/pkg/volume/photon_pd/photon_pd_test.go +++ b/pkg/volume/photon_pd/photon_pd_test.go @@ -37,7 +37,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/photon-pd") if err != nil { @@ -61,7 +61,7 @@ func TestGetAccessModes(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/photon-pd") if err != nil { @@ -106,7 +106,7 @@ func TestPlugin(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/photon-pd") if err != nil { @@ -211,7 +211,7 @@ func TestMounterAndUnmounterTypeAssert(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/photon-pd") if err != nil { diff --git a/pkg/volume/plugins.go b/pkg/volume/plugins.go index 7ba0d3ec67db3..dccb99fce7d79 100644 --- a/pkg/volume/plugins.go +++ b/pkg/volume/plugins.go @@ -70,6 +70,17 @@ type VolumeOptions struct { Containerized bool } +type DynamicPluginProber interface { + Init() error + + // If an update has occurred since the last probe, updated = true + // and the list of probed plugins is returned. + // Otherwise, update = false and probedPlugins = nil. + // + // If an error occurs, updated and probedPlugins are undefined. + Probe() (updated bool, probedPlugins []VolumePlugin, err error) +} + // VolumePlugin is an interface to volume plugins that can be used on a // kubernetes node (e.g. by kubelet) to instantiate and manage volumes. type VolumePlugin interface { @@ -255,9 +266,11 @@ type VolumeHost interface { // VolumePluginMgr tracks registered plugins. type VolumePluginMgr struct { - mutex sync.Mutex - plugins map[string]VolumePlugin - Host VolumeHost + mutex sync.Mutex + plugins map[string]VolumePlugin + prober DynamicPluginProber + probedPlugins []VolumePlugin + Host VolumeHost } // Spec is an internal representation of a volume. All API volume types translate to Spec. @@ -352,11 +365,24 @@ func NewSpecFromPersistentVolume(pv *v1.PersistentVolume, readOnly bool) *Spec { // InitPlugins initializes each plugin. All plugins must have unique names. // This must be called exactly once before any New* methods are called on any // plugins. -func (pm *VolumePluginMgr) InitPlugins(plugins []VolumePlugin, host VolumeHost) error { +func (pm *VolumePluginMgr) InitPlugins(plugins []VolumePlugin, prober DynamicPluginProber, host VolumeHost) error { pm.mutex.Lock() defer pm.mutex.Unlock() pm.Host = host + + if prober == nil { + // Use a dummy prober to prevent nil deference. + pm.prober = &dummyPluginProber{} + } else { + pm.prober = prober + } + if err := pm.prober.Init(); err != nil { + // Prober init failure should not affect the initialization of other plugins. + glog.Errorf("Error initializing dynamic plugin prober: %s", err) + pm.prober = &dummyPluginProber{} + } + if pm.plugins == nil { pm.plugins = map[string]VolumePlugin{} } @@ -385,6 +411,21 @@ func (pm *VolumePluginMgr) InitPlugins(plugins []VolumePlugin, host VolumeHost) return utilerrors.NewAggregate(allErrs) } +func (pm *VolumePluginMgr) initProbedPlugin(probedPlugin VolumePlugin) error { + name := probedPlugin.GetPluginName() + if errs := validation.IsQualifiedName(name); len(errs) != 0 { + return fmt.Errorf("volume plugin has invalid name: %q: %s", name, strings.Join(errs, ";")) + } + + err := probedPlugin.Init(pm.Host) + if err != nil { + return fmt.Errorf("Failed to load volume plugin %s, error: %s", name, err.Error()) + } + + glog.V(1).Infof("Loaded volume plugin %q", name) + return nil +} + // FindPluginBySpec looks for a plugin that can support a given volume // specification. If no plugins can support or more than one plugin can // support it, return error. @@ -396,19 +437,30 @@ func (pm *VolumePluginMgr) FindPluginBySpec(spec *Spec) (VolumePlugin, error) { return nil, fmt.Errorf("Could not find plugin because volume spec is nil") } - matches := []string{} + matchedPluginNames := []string{} + matches := []VolumePlugin{} for k, v := range pm.plugins { if v.CanSupport(spec) { - matches = append(matches, k) + matchedPluginNames = append(matchedPluginNames, k) + matches = append(matches, v) } } + + pm.refreshProbedPlugins() + for _, plugin := range pm.probedPlugins { + if plugin.CanSupport(spec) { + matchedPluginNames = append(matchedPluginNames, plugin.GetPluginName()) + matches = append(matches, plugin) + } + } + if len(matches) == 0 { return nil, fmt.Errorf("no volume plugin matched") } if len(matches) > 1 { - return nil, fmt.Errorf("multiple volume plugins matched: %s", strings.Join(matches, ",")) + return nil, fmt.Errorf("multiple volume plugins matched: %s", strings.Join(matchedPluginNames, ",")) } - return pm.plugins[matches[0]], nil + return matches[0], nil } // FindPluginByName fetches a plugin by name or by legacy name. If no plugin @@ -418,19 +470,52 @@ func (pm *VolumePluginMgr) FindPluginByName(name string) (VolumePlugin, error) { defer pm.mutex.Unlock() // Once we can get rid of legacy names we can reduce this to a map lookup. - matches := []string{} + matchedPluginNames := []string{} + matches := []VolumePlugin{} for k, v := range pm.plugins { if v.GetPluginName() == name { - matches = append(matches, k) + matchedPluginNames = append(matchedPluginNames, k) + matches = append(matches, v) } } + + pm.refreshProbedPlugins() + for _, plugin := range pm.probedPlugins { + if plugin.GetPluginName() == name { + matchedPluginNames = append(matchedPluginNames, plugin.GetPluginName()) + matches = append(matches, plugin) + } + } + if len(matches) == 0 { return nil, fmt.Errorf("no volume plugin matched") } if len(matches) > 1 { - return nil, fmt.Errorf("multiple volume plugins matched: %s", strings.Join(matches, ",")) + return nil, fmt.Errorf("multiple volume plugins matched: %s", strings.Join(matchedPluginNames, ",")) + } + return matches[0], nil +} + +// Check if probedPlugin cache update is required. +// If it is, initialize all probed plugins and replace the cache with them. +func (pm *VolumePluginMgr) refreshProbedPlugins() { + updated, plugins, err := pm.prober.Probe() + if err != nil { + glog.Errorf("Error dynamically probing plugins: %s", err) + return // Use cached plugins upon failure. + } + + if updated { + pm.probedPlugins = []VolumePlugin{} + for _, plugin := range plugins { + if err := pm.initProbedPlugin(plugin); err != nil { + glog.Errorf("Error initializing dynamically probed plugin %s; error: %s", + plugin.GetPluginName(), err) + continue + } + pm.probedPlugins = append(pm.probedPlugins, plugin) + } } - return pm.plugins[matches[0]], nil } // FindPersistentPluginBySpec looks for a persistent volume plugin that can @@ -618,3 +703,8 @@ func ValidateRecyclerPodTemplate(pod *v1.Pod) error { } return nil } + +type dummyPluginProber struct{} + +func (*dummyPluginProber) Init() error { return nil } +func (*dummyPluginProber) Probe() (bool, []VolumePlugin, error) { return false, nil, nil } diff --git a/pkg/volume/plugins_test.go b/pkg/volume/plugins_test.go index fc319e1027159..b8d74a26fa876 100644 --- a/pkg/volume/plugins_test.go +++ b/pkg/volume/plugins_test.go @@ -103,7 +103,8 @@ func newTestPlugin() []VolumePlugin { func TestVolumePluginMgrFunc(t *testing.T) { vpm := VolumePluginMgr{} - vpm.InitPlugins(newTestPlugin(), nil) + var prober DynamicPluginProber = nil // TODO (#51147) inject mock + vpm.InitPlugins(newTestPlugin(), prober, nil) plug, err := vpm.FindPluginByName("testPlugin") if err != nil { diff --git a/pkg/volume/portworx/portworx_test.go b/pkg/volume/portworx/portworx_test.go index 195e6c784721f..e14ef825020a4 100644 --- a/pkg/volume/portworx/portworx_test.go +++ b/pkg/volume/portworx/portworx_test.go @@ -41,7 +41,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/portworx-volume") if err != nil { @@ -65,7 +65,7 @@ func TestGetAccessModes(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/portworx-volume") if err != nil { @@ -135,7 +135,7 @@ func TestPlugin(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/portworx-volume") if err != nil { diff --git a/pkg/volume/projected/projected_test.go b/pkg/volume/projected/projected_test.go index 3c65ce1107ac7..6b8258652393b 100644 --- a/pkg/volume/projected/projected_test.go +++ b/pkg/volume/projected/projected_test.go @@ -670,7 +670,7 @@ func TestCanSupport(t *testing.T) { pluginMgr := volume.VolumePluginMgr{} tempDir, host := newTestHost(t, nil) defer os.RemoveAll(tempDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(projectedPluginName) if err != nil { @@ -701,7 +701,7 @@ func TestPlugin(t *testing.T) { rootDir, host = newTestHost(t, client) ) defer os.RemoveAll(rootDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(projectedPluginName) if err != nil { @@ -765,7 +765,7 @@ func TestPluginReboot(t *testing.T) { rootDir, host = newTestHost(t, client) ) defer os.RemoveAll(rootDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(projectedPluginName) if err != nil { @@ -819,7 +819,7 @@ func TestPluginOptional(t *testing.T) { ) volumeSpec.VolumeSource.Projected.Sources[0].Secret.Optional = &trueVal defer os.RemoveAll(rootDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(projectedPluginName) if err != nil { @@ -896,7 +896,7 @@ func TestPluginOptionalKeys(t *testing.T) { } volumeSpec.VolumeSource.Projected.Sources[0].Secret.Optional = &trueVal defer os.RemoveAll(rootDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(projectedPluginName) if err != nil { diff --git a/pkg/volume/quobyte/quobyte_test.go b/pkg/volume/quobyte/quobyte_test.go index 86fb2fd09215b..1ae60e4078b93 100644 --- a/pkg/volume/quobyte/quobyte_test.go +++ b/pkg/volume/quobyte/quobyte_test.go @@ -39,7 +39,7 @@ func TestCanSupport(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/quobyte") if err != nil { t.Errorf("Can't find the plugin by name") @@ -63,7 +63,7 @@ func TestGetAccessModes(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/quobyte") if err != nil { @@ -91,7 +91,7 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/quobyte") if err != nil { t.Errorf("Can't find the plugin by name") @@ -187,7 +187,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { client := fake.NewSimpleClientset(pv, claim) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, client, nil)) plug, _ := plugMgr.FindPluginByName(quobytePluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes diff --git a/pkg/volume/rbd/rbd_test.go b/pkg/volume/rbd/rbd_test.go index 2cabe4d30f264..ba27d570c3c72 100644 --- a/pkg/volume/rbd/rbd_test.go +++ b/pkg/volume/rbd/rbd_test.go @@ -39,7 +39,7 @@ func TestCanSupport(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/rbd") if err != nil { @@ -104,7 +104,7 @@ func doTestPlugin(t *testing.T, spec *volume.Spec) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/rbd") if err != nil { @@ -229,7 +229,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { client := fake.NewSimpleClientset(pv, claim) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, client, nil)) plug, _ := plugMgr.FindPluginByName(rbdPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes diff --git a/pkg/volume/scaleio/sio_volume_test.go b/pkg/volume/scaleio/sio_volume_test.go index 36e747c31fd0d..b83be41828e02 100644 --- a/pkg/volume/scaleio/sio_volume_test.go +++ b/pkg/volume/scaleio/sio_volume_test.go @@ -63,7 +63,7 @@ func newPluginMgr(t *testing.T) (*volume.VolumePluginMgr, string) { fakeClient := fakeclient.NewSimpleClientset(config) host := volumetest.NewFakeVolumeHost(tmpDir, fakeClient, nil) plugMgr := &volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), host) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) return plugMgr, tmpDir } diff --git a/pkg/volume/secret/secret_test.go b/pkg/volume/secret/secret_test.go index 438442a4c7cd6..6ba6a10d4b02c 100644 --- a/pkg/volume/secret/secret_test.go +++ b/pkg/volume/secret/secret_test.go @@ -275,7 +275,7 @@ func TestCanSupport(t *testing.T) { pluginMgr := volume.VolumePluginMgr{} tempDir, host := newTestHost(t, nil) defer os.RemoveAll(tempDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(secretPluginName) if err != nil { @@ -306,7 +306,7 @@ func TestPlugin(t *testing.T) { rootDir, host = newTestHost(t, client) ) defer os.RemoveAll(rootDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(secretPluginName) if err != nil { @@ -379,7 +379,7 @@ func TestPluginReboot(t *testing.T) { rootDir, host = newTestHost(t, client) ) defer os.RemoveAll(rootDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(secretPluginName) if err != nil { @@ -433,7 +433,7 @@ func TestPluginOptional(t *testing.T) { ) volumeSpec.Secret.Optional = &trueVal defer os.RemoveAll(rootDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(secretPluginName) if err != nil { @@ -510,7 +510,7 @@ func TestPluginOptionalKeys(t *testing.T) { } volumeSpec.Secret.Optional = &trueVal defer os.RemoveAll(rootDir) - pluginMgr.InitPlugins(ProbeVolumePlugins(), host) + pluginMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, host) plugin, err := pluginMgr.FindPluginByName(secretPluginName) if err != nil { diff --git a/pkg/volume/storageos/storageos_test.go b/pkg/volume/storageos/storageos_test.go index 37d6cc71f763c..8f1f29887b783 100644 --- a/pkg/volume/storageos/storageos_test.go +++ b/pkg/volume/storageos/storageos_test.go @@ -39,7 +39,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/storageos") if err != nil { @@ -63,7 +63,7 @@ func TestGetAccessModes(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPersistentPluginByName("kubernetes.io/storageos") if err != nil { @@ -138,7 +138,7 @@ func TestPlugin(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/storageos") if err != nil { @@ -353,7 +353,7 @@ func TestPersistentClaimReadOnlyFlag(t *testing.T) { client := fake.NewSimpleClientset(pv, claim) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, client, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, client, nil)) plug, _ := plugMgr.FindPluginByName(storageosPluginName) // readOnly bool is supplied by persistent-claim volume source when its mounter creates other volumes diff --git a/pkg/volume/storageos/storageos_util_test.go b/pkg/volume/storageos/storageos_util_test.go index 99897e7a0309f..3eee51231e770 100644 --- a/pkg/volume/storageos/storageos_util_test.go +++ b/pkg/volume/storageos/storageos_util_test.go @@ -117,7 +117,7 @@ func TestCreateVolume(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, _ := plugMgr.FindPluginByName("kubernetes.io/storageos") // Use real util with stubbed api @@ -209,7 +209,7 @@ func TestAttachVolume(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, _ := plugMgr.FindPluginByName("kubernetes.io/storageos") // Use real util with stubbed api diff --git a/pkg/volume/testing/testing.go b/pkg/volume/testing/testing.go index 902416c8a35d0..435f5683a7d31 100644 --- a/pkg/volume/testing/testing.go +++ b/pkg/volume/testing/testing.go @@ -73,7 +73,7 @@ func newFakeVolumeHost(rootDir string, kubeClient clientset.Interface, plugins [ host.mounter = &mount.FakeMounter{} host.writer = &io.StdWriter{} host.exec = mount.NewFakeExec(nil) - host.pluginMgr.InitPlugins(plugins, host) + host.pluginMgr.InitPlugins(plugins, nil /* prober */, host) return host } @@ -768,7 +768,7 @@ func GetTestVolumePluginMgr( nil, /* plugins */ ) plugins := ProbeVolumePlugins(VolumeConfig{}) - if err := v.pluginMgr.InitPlugins(plugins, v); err != nil { + if err := v.pluginMgr.InitPlugins(plugins, nil /* prober */, v); err != nil { t.Fatal(err) } diff --git a/pkg/volume/vsphere_volume/vsphere_volume_test.go b/pkg/volume/vsphere_volume/vsphere_volume_test.go index 992bc612750bf..282cb23d60271 100644 --- a/pkg/volume/vsphere_volume/vsphere_volume_test.go +++ b/pkg/volume/vsphere_volume/vsphere_volume_test.go @@ -37,7 +37,7 @@ func TestCanSupport(t *testing.T) { } defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/vsphere-volume") if err != nil { @@ -90,7 +90,7 @@ func TestPlugin(t *testing.T) { defer os.RemoveAll(tmpDir) plugMgr := volume.VolumePluginMgr{} - plugMgr.InitPlugins(ProbeVolumePlugins(), volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) + plugMgr.InitPlugins(ProbeVolumePlugins(), nil /* prober */, volumetest.NewFakeVolumeHost(tmpDir, nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/vsphere-volume") if err != nil { diff --git a/test/integration/volume/attach_detach_test.go b/test/integration/volume/attach_detach_test.go index 417a29032a45f..a5b1fe11fc081 100644 --- a/test/integration/volume/attach_detach_test.go +++ b/test/integration/volume/attach_detach_test.go @@ -361,6 +361,7 @@ func createAdClients(ns *v1.Namespace, t *testing.T, server *httptest.Server, sy informers.Core().V1().PersistentVolumes(), cloud, plugins, + nil, /* prober */ false, 5*time.Second, timers) From a7e64aaa6605e97c6ade6603481bd54cd3f18b65 Mon Sep 17 00:00:00 2001 From: Ryan Hitchman Date: Fri, 25 Aug 2017 11:21:59 -0700 Subject: [PATCH 325/403] Make coreos test images sshd not allow password login. Configuration is based on: https://coreos.com/os/docs/latest/customizing-sshd.html The specific SSHD config is: # Use most defaults for sshd configuration. UsePrivilegeSeparation sandbox Subsystem sftp internal-sftp ClientAliveInterval 180 UseDNS no UsePAM yes PrintLastLog no # handled by PAM PrintMotd no # handled by PAM AuthenticationMethods publickey This will prevent security scanners from triggering. --- test/e2e_node/jenkins/coreos-init.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/e2e_node/jenkins/coreos-init.json b/test/e2e_node/jenkins/coreos-init.json index 24e1fb9653469..b8eaf437fe7fe 100644 --- a/test/e2e_node/jenkins/coreos-init.json +++ b/test/e2e_node/jenkins/coreos-init.json @@ -24,6 +24,21 @@ "groups": ["docker", "sudo"] } }] + }, + "storage": { + "files": [ + { + "filesystem": "root", + "path": "/etc/ssh/sshd_config", + "contents": { + "source": "data:,%23%20Use%20most%20defaults%20for%20sshd%20configuration.%0AUsePrivilegeSeparation%20sandbox%0ASubsystem%20sftp%20internal-sftp%0AClientAliveInterval%20180%0AUseDNS%20no%0AUsePAM%20yes%0APrintLastLog%20no%20%23%20handled%20by%20PAM%0APrintMotd%20no%20%23%20handled%20by%20PAM%0AAuthenticationMethods%20publickey", + "verification": {} + }, + "mode": 384, + "user": {}, + "group": {} + } + ] } } From 1bb19dfcc505d00f51a60d42bcd09ee56fb1620c Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Thu, 11 May 2017 13:15:30 -0400 Subject: [PATCH 326/403] Revert "Ensure empty serialized slices are zero-length, not null" --- .../conversion-gen/generators/conversion.go | 27 ++----------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/staging/src/k8s.io/code-generator/cmd/conversion-gen/generators/conversion.go b/staging/src/k8s.io/code-generator/cmd/conversion-gen/generators/conversion.go index 9a219fcd69dc3..dfb065e58e713 100644 --- a/staging/src/k8s.io/code-generator/cmd/conversion-gen/generators/conversion.go +++ b/staging/src/k8s.io/code-generator/cmd/conversion-gen/generators/conversion.go @@ -29,8 +29,6 @@ import ( "k8s.io/gengo/namer" "k8s.io/gengo/types" - "reflect" - "github.com/golang/glog" ) @@ -792,15 +790,6 @@ func (g *genConversion) doStruct(inType, outType *types.Type, sw *generator.Snip outMemberType = &copied } - // Determine if our destination field is a slice that should be output when empty. - // If it is, ensure a nil source slice converts to a zero-length destination slice. - // See http://issue.k8s.io/43203 - persistEmptySlice := false - if outMemberType.Kind == types.Slice { - jsonTag := reflect.StructTag(outMember.Tags).Get("json") - persistEmptySlice = len(jsonTag) > 0 && !strings.Contains(jsonTag, ",omitempty") - } - args := argsFromType(inMemberType, outMemberType).With("name", inMember.Name) // try a direct memory copy for any type that has exactly equivalent values @@ -816,15 +805,7 @@ func (g *genConversion) doStruct(inType, outType *types.Type, sw *generator.Snip sw.Do("out.$.name$ = *(*$.outType|raw$)($.Pointer|raw$(&in.$.name$))\n", args) continue case types.Slice: - if persistEmptySlice { - sw.Do("if in.$.name$ == nil {\n", args) - sw.Do("out.$.name$ = make($.outType|raw$, 0)\n", args) - sw.Do("} else {\n", nil) - sw.Do("out.$.name$ = *(*$.outType|raw$)($.Pointer|raw$(&in.$.name$))\n", args) - sw.Do("}\n", nil) - } else { - sw.Do("out.$.name$ = *(*$.outType|raw$)($.Pointer|raw$(&in.$.name$))\n", args) - } + sw.Do("out.$.name$ = *(*$.outType|raw$)($.Pointer|raw$(&in.$.name$))\n", args) continue } } @@ -874,11 +855,7 @@ func (g *genConversion) doStruct(inType, outType *types.Type, sw *generator.Snip sw.Do("in, out := &in.$.name$, &out.$.name$\n", args) g.generateFor(inMemberType, outMemberType, sw) sw.Do("} else {\n", nil) - if persistEmptySlice { - sw.Do("out.$.name$ = make($.outType|raw$, 0)\n", args) - } else { - sw.Do("out.$.name$ = nil\n", args) - } + sw.Do("out.$.name$ = nil\n", args) sw.Do("}\n", nil) case types.Struct: if g.isDirectlyAssignable(inMemberType, outMemberType) { From c7defb806fc6c69deb4ab57655c3fa323ba8bebd Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Mon, 7 Aug 2017 15:16:21 -0400 Subject: [PATCH 327/403] Generated files --- .../v1alpha1/zz_generated.conversion.go | 36 +---- .../v1beta1/zz_generated.conversion.go | 12 +- pkg/api/v1/zz_generated.conversion.go | 142 ++++-------------- .../v1alpha1/zz_generated.conversion.go | 18 +-- .../apps/v1beta1/zz_generated.conversion.go | 6 +- .../apps/v1beta2/zz_generated.conversion.go | 10 +- .../autoscaling/v1/zz_generated.conversion.go | 2 +- .../v2alpha1/zz_generated.conversion.go | 18 +-- pkg/apis/batch/v1/zz_generated.conversion.go | 2 +- .../batch/v1beta1/zz_generated.conversion.go | 2 +- .../batch/v2alpha1/zz_generated.conversion.go | 2 +- .../v1beta1/zz_generated.conversion.go | 12 +- .../v1beta1/zz_generated.conversion.go | 44 ++---- .../networking/v1/zz_generated.conversion.go | 6 +- .../policy/v1beta1/zz_generated.conversion.go | 6 +- pkg/apis/rbac/v1/zz_generated.conversion.go | 54 ++----- .../rbac/v1alpha1/zz_generated.conversion.go | 38 ++--- .../rbac/v1beta1/zz_generated.conversion.go | 54 ++----- .../v1alpha1/zz_generated.conversion.go | 6 +- .../v1alpha1/zz_generated.conversion.go | 2 +- .../storage/v1/zz_generated.conversion.go | 6 +- .../v1beta1/zz_generated.conversion.go | 6 +- .../v1alpha1/zz_generated.conversion.go | 36 +---- .../v1alpha1/zz_generated.conversion.go | 6 +- .../v1beta1/zz_generated.conversion.go | 12 +- .../v1/zz_generated.conversion.go | 2 +- .../v1alpha1/zz_generated.conversion.go | 2 +- .../audit/v1alpha1/zz_generated.conversion.go | 18 +-- .../audit/v1beta1/zz_generated.conversion.go | 18 +-- .../example/v1/zz_generated.conversion.go | 2 +- .../v1beta1/zz_generated.conversion.go | 12 +- .../v1alpha1/zz_generated.conversion.go | 12 +- .../v1alpha1/zz_generated.conversion.go | 18 +-- .../v1alpha1/zz_generated.conversion.go | 12 +- 34 files changed, 127 insertions(+), 507 deletions(-) diff --git a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.conversion.go index f1f66e6e26582..a8d146a761f2a 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1alpha1/zz_generated.conversion.go @@ -90,11 +90,7 @@ func Convert_v1alpha1_Etcd_To_kubeadm_Etcd(in *Etcd, out *kubeadm.Etcd, s conver } func autoConvert_kubeadm_Etcd_To_v1alpha1_Etcd(in *kubeadm.Etcd, out *Etcd, s conversion.Scope) error { - if in.Endpoints == nil { - out.Endpoints = make([]string, 0) - } else { - out.Endpoints = *(*[]string)(unsafe.Pointer(&in.Endpoints)) - } + out.Endpoints = *(*[]string)(unsafe.Pointer(&in.Endpoints)) out.CAFile = in.CAFile out.CertFile = in.CertFile out.KeyFile = in.KeyFile @@ -154,21 +150,13 @@ func autoConvert_kubeadm_MasterConfiguration_To_v1alpha1_MasterConfiguration(in out.KubernetesVersion = in.KubernetesVersion out.CloudProvider = in.CloudProvider out.NodeName = in.NodeName - if in.AuthorizationModes == nil { - out.AuthorizationModes = make([]string, 0) - } else { - out.AuthorizationModes = *(*[]string)(unsafe.Pointer(&in.AuthorizationModes)) - } + out.AuthorizationModes = *(*[]string)(unsafe.Pointer(&in.AuthorizationModes)) out.Token = in.Token out.TokenTTL = time.Duration(in.TokenTTL) out.APIServerExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.APIServerExtraArgs)) out.ControllerManagerExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.ControllerManagerExtraArgs)) out.SchedulerExtraArgs = *(*map[string]string)(unsafe.Pointer(&in.SchedulerExtraArgs)) - if in.APIServerCertSANs == nil { - out.APIServerCertSANs = make([]string, 0) - } else { - out.APIServerCertSANs = *(*[]string)(unsafe.Pointer(&in.APIServerCertSANs)) - } + out.APIServerCertSANs = *(*[]string)(unsafe.Pointer(&in.APIServerCertSANs)) out.CertificatesDir = in.CertificatesDir out.ImageRepository = in.ImageRepository // INFO: in.CIImageRepository opted out of conversion generation @@ -228,19 +216,11 @@ func autoConvert_kubeadm_NodeConfiguration_To_v1alpha1_NodeConfiguration(in *kub out.CACertPath = in.CACertPath out.DiscoveryFile = in.DiscoveryFile out.DiscoveryToken = in.DiscoveryToken - if in.DiscoveryTokenAPIServers == nil { - out.DiscoveryTokenAPIServers = make([]string, 0) - } else { - out.DiscoveryTokenAPIServers = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenAPIServers)) - } + out.DiscoveryTokenAPIServers = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenAPIServers)) out.NodeName = in.NodeName out.TLSBootstrapToken = in.TLSBootstrapToken out.Token = in.Token - if in.DiscoveryTokenCACertHashes == nil { - out.DiscoveryTokenCACertHashes = make([]string, 0) - } else { - out.DiscoveryTokenCACertHashes = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenCACertHashes)) - } + out.DiscoveryTokenCACertHashes = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenCACertHashes)) out.DiscoveryTokenUnsafeSkipCAVerification = in.DiscoveryTokenUnsafeSkipCAVerification return nil } @@ -265,11 +245,7 @@ func Convert_v1alpha1_TokenDiscovery_To_kubeadm_TokenDiscovery(in *TokenDiscover func autoConvert_kubeadm_TokenDiscovery_To_v1alpha1_TokenDiscovery(in *kubeadm.TokenDiscovery, out *TokenDiscovery, s conversion.Scope) error { out.ID = in.ID out.Secret = in.Secret - if in.Addresses == nil { - out.Addresses = make([]string, 0) - } else { - out.Addresses = *(*[]string)(unsafe.Pointer(&in.Addresses)) - } + out.Addresses = *(*[]string)(unsafe.Pointer(&in.Addresses)) return nil } diff --git a/federation/apis/federation/v1beta1/zz_generated.conversion.go b/federation/apis/federation/v1beta1/zz_generated.conversion.go index c663146f3e819..1f9e733ddcdc0 100644 --- a/federation/apis/federation/v1beta1/zz_generated.conversion.go +++ b/federation/apis/federation/v1beta1/zz_generated.conversion.go @@ -127,11 +127,7 @@ func Convert_v1beta1_ClusterList_To_federation_ClusterList(in *ClusterList, out func autoConvert_federation_ClusterList_To_v1beta1_ClusterList(in *federation.ClusterList, out *ClusterList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]Cluster, 0) - } else { - out.Items = *(*[]Cluster)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]Cluster)(unsafe.Pointer(&in.Items)) return nil } @@ -152,11 +148,7 @@ func Convert_v1beta1_ClusterSpec_To_federation_ClusterSpec(in *ClusterSpec, out } func autoConvert_federation_ClusterSpec_To_v1beta1_ClusterSpec(in *federation.ClusterSpec, out *ClusterSpec, s conversion.Scope) error { - if in.ServerAddressByClientCIDRs == nil { - out.ServerAddressByClientCIDRs = make([]ServerAddressByClientCIDR, 0) - } else { - out.ServerAddressByClientCIDRs = *(*[]ServerAddressByClientCIDR)(unsafe.Pointer(&in.ServerAddressByClientCIDRs)) - } + out.ServerAddressByClientCIDRs = *(*[]ServerAddressByClientCIDR)(unsafe.Pointer(&in.ServerAddressByClientCIDRs)) out.SecretRef = (*v1.LocalObjectReference)(unsafe.Pointer(in.SecretRef)) return nil } diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index b1e6276a87615..4a1731a9ed1ba 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -627,11 +627,7 @@ func Convert_v1_CephFSPersistentVolumeSource_To_api_CephFSPersistentVolumeSource } func autoConvert_api_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource(in *api.CephFSPersistentVolumeSource, out *v1.CephFSPersistentVolumeSource, s conversion.Scope) error { - if in.Monitors == nil { - out.Monitors = make([]string, 0) - } else { - out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors)) - } + out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors)) out.Path = in.Path out.User = in.User out.SecretFile = in.SecretFile @@ -661,11 +657,7 @@ func Convert_v1_CephFSVolumeSource_To_api_CephFSVolumeSource(in *v1.CephFSVolume } func autoConvert_api_CephFSVolumeSource_To_v1_CephFSVolumeSource(in *api.CephFSVolumeSource, out *v1.CephFSVolumeSource, s conversion.Scope) error { - if in.Monitors == nil { - out.Monitors = make([]string, 0) - } else { - out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors)) - } + out.Monitors = *(*[]string)(unsafe.Pointer(&in.Monitors)) out.Path = in.Path out.User = in.User out.SecretFile = in.SecretFile @@ -764,11 +756,7 @@ func Convert_v1_ComponentStatusList_To_api_ComponentStatusList(in *v1.ComponentS func autoConvert_api_ComponentStatusList_To_v1_ComponentStatusList(in *api.ComponentStatusList, out *v1.ComponentStatusList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.ComponentStatus, 0) - } else { - out.Items = *(*[]v1.ComponentStatus)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.ComponentStatus)(unsafe.Pointer(&in.Items)) return nil } @@ -866,11 +854,7 @@ func Convert_v1_ConfigMapList_To_api_ConfigMapList(in *v1.ConfigMapList, out *ap func autoConvert_api_ConfigMapList_To_v1_ConfigMapList(in *api.ConfigMapList, out *v1.ConfigMapList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.ConfigMap, 0) - } else { - out.Items = *(*[]v1.ConfigMap)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.ConfigMap)(unsafe.Pointer(&in.Items)) return nil } @@ -1027,11 +1011,7 @@ func Convert_v1_ContainerImage_To_api_ContainerImage(in *v1.ContainerImage, out } func autoConvert_api_ContainerImage_To_v1_ContainerImage(in *api.ContainerImage, out *v1.ContainerImage, s conversion.Scope) error { - if in.Names == nil { - out.Names = make([]string, 0) - } else { - out.Names = *(*[]string)(unsafe.Pointer(&in.Names)) - } + out.Names = *(*[]string)(unsafe.Pointer(&in.Names)) out.SizeBytes = in.SizeBytes return nil } @@ -1432,11 +1412,7 @@ func Convert_v1_Endpoints_To_api_Endpoints(in *v1.Endpoints, out *api.Endpoints, func autoConvert_api_Endpoints_To_v1_Endpoints(in *api.Endpoints, out *v1.Endpoints, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Subsets == nil { - out.Subsets = make([]v1.EndpointSubset, 0) - } else { - out.Subsets = *(*[]v1.EndpointSubset)(unsafe.Pointer(&in.Subsets)) - } + out.Subsets = *(*[]v1.EndpointSubset)(unsafe.Pointer(&in.Subsets)) return nil } @@ -1458,11 +1434,7 @@ func Convert_v1_EndpointsList_To_api_EndpointsList(in *v1.EndpointsList, out *ap func autoConvert_api_EndpointsList_To_v1_EndpointsList(in *api.EndpointsList, out *v1.EndpointsList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.Endpoints, 0) - } else { - out.Items = *(*[]v1.Endpoints)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.Endpoints)(unsafe.Pointer(&in.Items)) return nil } @@ -1602,11 +1574,7 @@ func Convert_v1_EventList_To_api_EventList(in *v1.EventList, out *api.EventList, func autoConvert_api_EventList_To_v1_EventList(in *api.EventList, out *v1.EventList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.Event, 0) - } else { - out.Items = *(*[]v1.Event)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.Event)(unsafe.Pointer(&in.Items)) return nil } @@ -2082,11 +2050,7 @@ func Convert_v1_LimitRangeList_To_api_LimitRangeList(in *v1.LimitRangeList, out func autoConvert_api_LimitRangeList_To_v1_LimitRangeList(in *api.LimitRangeList, out *v1.LimitRangeList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.LimitRange, 0) - } else { - out.Items = *(*[]v1.LimitRange)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.LimitRange)(unsafe.Pointer(&in.Items)) return nil } @@ -2106,11 +2070,7 @@ func Convert_v1_LimitRangeSpec_To_api_LimitRangeSpec(in *v1.LimitRangeSpec, out } func autoConvert_api_LimitRangeSpec_To_v1_LimitRangeSpec(in *api.LimitRangeSpec, out *v1.LimitRangeSpec, s conversion.Scope) error { - if in.Limits == nil { - out.Limits = make([]v1.LimitRangeItem, 0) - } else { - out.Limits = *(*[]v1.LimitRangeItem)(unsafe.Pointer(&in.Limits)) - } + out.Limits = *(*[]v1.LimitRangeItem)(unsafe.Pointer(&in.Limits)) return nil } @@ -2151,7 +2111,7 @@ func autoConvert_api_List_To_v1_List(in *api.List, out *v1.List, s conversion.Sc } } } else { - out.Items = make([]runtime.RawExtension, 0) + out.Items = nil } return nil } @@ -2350,11 +2310,7 @@ func Convert_v1_NamespaceList_To_api_NamespaceList(in *v1.NamespaceList, out *ap func autoConvert_api_NamespaceList_To_v1_NamespaceList(in *api.NamespaceList, out *v1.NamespaceList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.Namespace, 0) - } else { - out.Items = *(*[]v1.Namespace)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.Namespace)(unsafe.Pointer(&in.Items)) return nil } @@ -2566,11 +2522,7 @@ func Convert_v1_NodeList_To_api_NodeList(in *v1.NodeList, out *api.NodeList, s c func autoConvert_api_NodeList_To_v1_NodeList(in *api.NodeList, out *v1.NodeList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.Node, 0) - } else { - out.Items = *(*[]v1.Node)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.Node)(unsafe.Pointer(&in.Items)) return nil } @@ -2630,11 +2582,7 @@ func Convert_v1_NodeSelector_To_api_NodeSelector(in *v1.NodeSelector, out *api.N } func autoConvert_api_NodeSelector_To_v1_NodeSelector(in *api.NodeSelector, out *v1.NodeSelector, s conversion.Scope) error { - if in.NodeSelectorTerms == nil { - out.NodeSelectorTerms = make([]v1.NodeSelectorTerm, 0) - } else { - out.NodeSelectorTerms = *(*[]v1.NodeSelectorTerm)(unsafe.Pointer(&in.NodeSelectorTerms)) - } + out.NodeSelectorTerms = *(*[]v1.NodeSelectorTerm)(unsafe.Pointer(&in.NodeSelectorTerms)) return nil } @@ -2678,11 +2626,7 @@ func Convert_v1_NodeSelectorTerm_To_api_NodeSelectorTerm(in *v1.NodeSelectorTerm } func autoConvert_api_NodeSelectorTerm_To_v1_NodeSelectorTerm(in *api.NodeSelectorTerm, out *v1.NodeSelectorTerm, s conversion.Scope) error { - if in.MatchExpressions == nil { - out.MatchExpressions = make([]v1.NodeSelectorRequirement, 0) - } else { - out.MatchExpressions = *(*[]v1.NodeSelectorRequirement)(unsafe.Pointer(&in.MatchExpressions)) - } + out.MatchExpressions = *(*[]v1.NodeSelectorRequirement)(unsafe.Pointer(&in.MatchExpressions)) return nil } @@ -2986,11 +2930,7 @@ func Convert_v1_PersistentVolumeClaimList_To_api_PersistentVolumeClaimList(in *v func autoConvert_api_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList(in *api.PersistentVolumeClaimList, out *v1.PersistentVolumeClaimList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.PersistentVolumeClaim, 0) - } else { - out.Items = *(*[]v1.PersistentVolumeClaim)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.PersistentVolumeClaim)(unsafe.Pointer(&in.Items)) return nil } @@ -3109,7 +3049,7 @@ func autoConvert_api_PersistentVolumeList_To_v1_PersistentVolumeList(in *api.Per } } } else { - out.Items = make([]v1.PersistentVolume, 0) + out.Items = nil } return nil } @@ -3428,11 +3368,7 @@ func autoConvert_api_PodExecOptions_To_v1_PodExecOptions(in *api.PodExecOptions, out.Stderr = in.Stderr out.TTY = in.TTY out.Container = in.Container - if in.Command == nil { - out.Command = make([]string, 0) - } else { - out.Command = *(*[]string)(unsafe.Pointer(&in.Command)) - } + out.Command = *(*[]string)(unsafe.Pointer(&in.Command)) return nil } @@ -3473,7 +3409,7 @@ func autoConvert_api_PodList_To_v1_PodList(in *api.PodList, out *v1.PodList, s c } } } else { - out.Items = make([]v1.Pod, 0) + out.Items = nil } return nil } @@ -3697,7 +3633,7 @@ func autoConvert_api_PodSpec_To_v1_PodSpec(in *api.PodSpec, out *v1.PodSpec, s c } } } else { - out.Containers = make([]v1.Container, 0) + out.Containers = nil } out.RestartPolicy = v1.RestartPolicy(in.RestartPolicy) out.TerminationGracePeriodSeconds = (*int64)(unsafe.Pointer(in.TerminationGracePeriodSeconds)) @@ -3840,7 +3776,7 @@ func autoConvert_api_PodTemplateList_To_v1_PodTemplateList(in *api.PodTemplateLi } } } else { - out.Items = make([]v1.PodTemplate, 0) + out.Items = nil } return nil } @@ -4012,11 +3948,7 @@ func Convert_v1_ProjectedVolumeSource_To_api_ProjectedVolumeSource(in *v1.Projec } func autoConvert_api_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(in *api.ProjectedVolumeSource, out *v1.ProjectedVolumeSource, s conversion.Scope) error { - if in.Sources == nil { - out.Sources = make([]v1.VolumeProjection, 0) - } else { - out.Sources = *(*[]v1.VolumeProjection)(unsafe.Pointer(&in.Sources)) - } + out.Sources = *(*[]v1.VolumeProjection)(unsafe.Pointer(&in.Sources)) out.DefaultMode = (*int32)(unsafe.Pointer(in.DefaultMode)) return nil } @@ -4072,11 +4004,7 @@ func Convert_v1_RBDVolumeSource_To_api_RBDVolumeSource(in *v1.RBDVolumeSource, o } func autoConvert_api_RBDVolumeSource_To_v1_RBDVolumeSource(in *api.RBDVolumeSource, out *v1.RBDVolumeSource, s conversion.Scope) error { - if in.CephMonitors == nil { - out.CephMonitors = make([]string, 0) - } else { - out.CephMonitors = *(*[]string)(unsafe.Pointer(&in.CephMonitors)) - } + out.CephMonitors = *(*[]string)(unsafe.Pointer(&in.CephMonitors)) out.RBDImage = in.RBDImage out.FSType = in.FSType out.RBDPool = in.RBDPool @@ -4107,11 +4035,7 @@ func Convert_v1_RangeAllocation_To_api_RangeAllocation(in *v1.RangeAllocation, o func autoConvert_api_RangeAllocation_To_v1_RangeAllocation(in *api.RangeAllocation, out *v1.RangeAllocation, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.Range = in.Range - if in.Data == nil { - out.Data = make([]byte, 0) - } else { - out.Data = *(*[]byte)(unsafe.Pointer(&in.Data)) - } + out.Data = *(*[]byte)(unsafe.Pointer(&in.Data)) return nil } @@ -4212,7 +4136,7 @@ func autoConvert_api_ReplicationControllerList_To_v1_ReplicationControllerList(i } } } else { - out.Items = make([]v1.ReplicationController, 0) + out.Items = nil } return nil } @@ -4357,11 +4281,7 @@ func Convert_v1_ResourceQuotaList_To_api_ResourceQuotaList(in *v1.ResourceQuotaL func autoConvert_api_ResourceQuotaList_To_v1_ResourceQuotaList(in *api.ResourceQuotaList, out *v1.ResourceQuotaList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.ResourceQuota, 0) - } else { - out.Items = *(*[]v1.ResourceQuota)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.ResourceQuota)(unsafe.Pointer(&in.Items)) return nil } @@ -4606,7 +4526,7 @@ func autoConvert_api_SecretList_To_v1_SecretList(in *api.SecretList, out *v1.Sec } } } else { - out.Items = make([]v1.Secret, 0) + out.Items = nil } return nil } @@ -4814,11 +4734,7 @@ func Convert_v1_ServiceAccountList_To_api_ServiceAccountList(in *v1.ServiceAccou func autoConvert_api_ServiceAccountList_To_v1_ServiceAccountList(in *api.ServiceAccountList, out *v1.ServiceAccountList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.ServiceAccount, 0) - } else { - out.Items = *(*[]v1.ServiceAccount)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.ServiceAccount)(unsafe.Pointer(&in.Items)) return nil } @@ -4859,7 +4775,7 @@ func autoConvert_api_ServiceList_To_v1_ServiceList(in *api.ServiceList, out *v1. } } } else { - out.Items = make([]v1.Service, 0) + out.Items = nil } return nil } diff --git a/pkg/apis/admissionregistration/v1alpha1/zz_generated.conversion.go b/pkg/apis/admissionregistration/v1alpha1/zz_generated.conversion.go index 9e278de1bc520..a884adcffc85e 100644 --- a/pkg/apis/admissionregistration/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/admissionregistration/v1alpha1/zz_generated.conversion.go @@ -76,11 +76,7 @@ func autoConvert_admissionregistration_AdmissionHookClientConfig_To_v1alpha1_Adm if err := Convert_admissionregistration_ServiceReference_To_v1alpha1_ServiceReference(&in.Service, &out.Service, s); err != nil { return err } - if in.CABundle == nil { - out.CABundle = make([]byte, 0) - } else { - out.CABundle = *(*[]byte)(unsafe.Pointer(&in.CABundle)) - } + out.CABundle = *(*[]byte)(unsafe.Pointer(&in.CABundle)) return nil } @@ -154,11 +150,7 @@ func Convert_v1alpha1_ExternalAdmissionHookConfigurationList_To_admissionregistr func autoConvert_admissionregistration_ExternalAdmissionHookConfigurationList_To_v1alpha1_ExternalAdmissionHookConfigurationList(in *admissionregistration.ExternalAdmissionHookConfigurationList, out *v1alpha1.ExternalAdmissionHookConfigurationList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1alpha1.ExternalAdmissionHookConfiguration, 0) - } else { - out.Items = *(*[]v1alpha1.ExternalAdmissionHookConfiguration)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1alpha1.ExternalAdmissionHookConfiguration)(unsafe.Pointer(&in.Items)) return nil } @@ -226,11 +218,7 @@ func Convert_v1alpha1_InitializerConfigurationList_To_admissionregistration_Init func autoConvert_admissionregistration_InitializerConfigurationList_To_v1alpha1_InitializerConfigurationList(in *admissionregistration.InitializerConfigurationList, out *v1alpha1.InitializerConfigurationList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1alpha1.InitializerConfiguration, 0) - } else { - out.Items = *(*[]v1alpha1.InitializerConfiguration)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1alpha1.InitializerConfiguration)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/apps/v1beta1/zz_generated.conversion.go b/pkg/apis/apps/v1beta1/zz_generated.conversion.go index 4a670f88fd6d6..d3ddaac0333fa 100644 --- a/pkg/apis/apps/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/apps/v1beta1/zz_generated.conversion.go @@ -144,7 +144,7 @@ func autoConvert_apps_ControllerRevisionList_To_v1beta1_ControllerRevisionList(i } } } else { - out.Items = make([]v1beta1.ControllerRevision, 0) + out.Items = nil } return nil } @@ -248,7 +248,7 @@ func autoConvert_extensions_DeploymentList_To_v1beta1_DeploymentList(in *extensi } } } else { - out.Items = make([]v1beta1.Deployment, 0) + out.Items = nil } return nil } @@ -571,7 +571,7 @@ func autoConvert_apps_StatefulSetList_To_v1beta1_StatefulSetList(in *apps.Statef } } } else { - out.Items = make([]v1beta1.StatefulSet, 0) + out.Items = nil } return nil } diff --git a/pkg/apis/apps/v1beta2/zz_generated.conversion.go b/pkg/apis/apps/v1beta2/zz_generated.conversion.go index 51c33d9d896a1..4624fa42bf09a 100644 --- a/pkg/apis/apps/v1beta2/zz_generated.conversion.go +++ b/pkg/apis/apps/v1beta2/zz_generated.conversion.go @@ -162,7 +162,7 @@ func autoConvert_apps_ControllerRevisionList_To_v1beta2_ControllerRevisionList(i } } } else { - out.Items = make([]v1beta2.ControllerRevision, 0) + out.Items = nil } return nil } @@ -226,7 +226,7 @@ func autoConvert_extensions_DaemonSetList_To_v1beta2_DaemonSetList(in *extension } } } else { - out.Items = make([]v1beta2.DaemonSet, 0) + out.Items = nil } return nil } @@ -411,7 +411,7 @@ func autoConvert_extensions_DeploymentList_To_v1beta2_DeploymentList(in *extensi } } } else { - out.Items = make([]v1beta2.Deployment, 0) + out.Items = nil } return nil } @@ -612,7 +612,7 @@ func autoConvert_extensions_ReplicaSetList_To_v1beta2_ReplicaSetList(in *extensi } } } else { - out.Items = make([]v1beta2.ReplicaSet, 0) + out.Items = nil } return nil } @@ -851,7 +851,7 @@ func autoConvert_apps_StatefulSetList_To_v1beta2_StatefulSetList(in *apps.Statef } } } else { - out.Items = make([]v1beta2.StatefulSet, 0) + out.Items = nil } return nil } diff --git a/pkg/apis/autoscaling/v1/zz_generated.conversion.go b/pkg/apis/autoscaling/v1/zz_generated.conversion.go index 5baee8823543c..e1f48bdce5356 100644 --- a/pkg/apis/autoscaling/v1/zz_generated.conversion.go +++ b/pkg/apis/autoscaling/v1/zz_generated.conversion.go @@ -183,7 +183,7 @@ func autoConvert_autoscaling_HorizontalPodAutoscalerList_To_v1_HorizontalPodAuto } } } else { - out.Items = make([]v1.HorizontalPodAutoscaler, 0) + out.Items = nil } return nil } diff --git a/pkg/apis/autoscaling/v2alpha1/zz_generated.conversion.go b/pkg/apis/autoscaling/v2alpha1/zz_generated.conversion.go index e0c5eed6828ad..9ceea56ef4bfb 100644 --- a/pkg/apis/autoscaling/v2alpha1/zz_generated.conversion.go +++ b/pkg/apis/autoscaling/v2alpha1/zz_generated.conversion.go @@ -168,11 +168,7 @@ func Convert_v2alpha1_HorizontalPodAutoscalerList_To_autoscaling_HorizontalPodAu func autoConvert_autoscaling_HorizontalPodAutoscalerList_To_v2alpha1_HorizontalPodAutoscalerList(in *autoscaling.HorizontalPodAutoscalerList, out *v2alpha1.HorizontalPodAutoscalerList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v2alpha1.HorizontalPodAutoscaler, 0) - } else { - out.Items = *(*[]v2alpha1.HorizontalPodAutoscaler)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v2alpha1.HorizontalPodAutoscaler)(unsafe.Pointer(&in.Items)) return nil } @@ -231,16 +227,8 @@ func autoConvert_autoscaling_HorizontalPodAutoscalerStatus_To_v2alpha1_Horizonta out.LastScaleTime = (*meta_v1.Time)(unsafe.Pointer(in.LastScaleTime)) out.CurrentReplicas = in.CurrentReplicas out.DesiredReplicas = in.DesiredReplicas - if in.CurrentMetrics == nil { - out.CurrentMetrics = make([]v2alpha1.MetricStatus, 0) - } else { - out.CurrentMetrics = *(*[]v2alpha1.MetricStatus)(unsafe.Pointer(&in.CurrentMetrics)) - } - if in.Conditions == nil { - out.Conditions = make([]v2alpha1.HorizontalPodAutoscalerCondition, 0) - } else { - out.Conditions = *(*[]v2alpha1.HorizontalPodAutoscalerCondition)(unsafe.Pointer(&in.Conditions)) - } + out.CurrentMetrics = *(*[]v2alpha1.MetricStatus)(unsafe.Pointer(&in.CurrentMetrics)) + out.Conditions = *(*[]v2alpha1.HorizontalPodAutoscalerCondition)(unsafe.Pointer(&in.Conditions)) return nil } diff --git a/pkg/apis/batch/v1/zz_generated.conversion.go b/pkg/apis/batch/v1/zz_generated.conversion.go index c1b8843fcba47..015a0f76a4155 100644 --- a/pkg/apis/batch/v1/zz_generated.conversion.go +++ b/pkg/apis/batch/v1/zz_generated.conversion.go @@ -147,7 +147,7 @@ func autoConvert_batch_JobList_To_v1_JobList(in *batch.JobList, out *v1.JobList, } } } else { - out.Items = make([]v1.Job, 0) + out.Items = nil } return nil } diff --git a/pkg/apis/batch/v1beta1/zz_generated.conversion.go b/pkg/apis/batch/v1beta1/zz_generated.conversion.go index d335dbadba32d..f6ae62bd03912 100644 --- a/pkg/apis/batch/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/batch/v1beta1/zz_generated.conversion.go @@ -119,7 +119,7 @@ func autoConvert_batch_CronJobList_To_v1beta1_CronJobList(in *batch.CronJobList, } } } else { - out.Items = make([]v1beta1.CronJob, 0) + out.Items = nil } return nil } diff --git a/pkg/apis/batch/v2alpha1/zz_generated.conversion.go b/pkg/apis/batch/v2alpha1/zz_generated.conversion.go index a492fe79bd52e..92c8c8ceb6aa5 100644 --- a/pkg/apis/batch/v2alpha1/zz_generated.conversion.go +++ b/pkg/apis/batch/v2alpha1/zz_generated.conversion.go @@ -119,7 +119,7 @@ func autoConvert_batch_CronJobList_To_v2alpha1_CronJobList(in *batch.CronJobList } } } else { - out.Items = make([]v2alpha1.CronJob, 0) + out.Items = nil } return nil } diff --git a/pkg/apis/certificates/v1beta1/zz_generated.conversion.go b/pkg/apis/certificates/v1beta1/zz_generated.conversion.go index 9253dbed8ad2f..96780e6730d87 100644 --- a/pkg/apis/certificates/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/certificates/v1beta1/zz_generated.conversion.go @@ -120,11 +120,7 @@ func Convert_v1beta1_CertificateSigningRequestList_To_certificates_CertificateSi func autoConvert_certificates_CertificateSigningRequestList_To_v1beta1_CertificateSigningRequestList(in *certificates.CertificateSigningRequestList, out *v1beta1.CertificateSigningRequestList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.CertificateSigningRequest, 0) - } else { - out.Items = *(*[]v1beta1.CertificateSigningRequest)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.CertificateSigningRequest)(unsafe.Pointer(&in.Items)) return nil } @@ -149,11 +145,7 @@ func Convert_v1beta1_CertificateSigningRequestSpec_To_certificates_CertificateSi } func autoConvert_certificates_CertificateSigningRequestSpec_To_v1beta1_CertificateSigningRequestSpec(in *certificates.CertificateSigningRequestSpec, out *v1beta1.CertificateSigningRequestSpec, s conversion.Scope) error { - if in.Request == nil { - out.Request = make([]byte, 0) - } else { - out.Request = *(*[]byte)(unsafe.Pointer(&in.Request)) - } + out.Request = *(*[]byte)(unsafe.Pointer(&in.Request)) out.Usages = *(*[]v1beta1.KeyUsage)(unsafe.Pointer(&in.Usages)) out.Username = in.Username out.UID = in.UID diff --git a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go index aee174500ab5e..8b7a7b100739a 100644 --- a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go @@ -198,11 +198,7 @@ func Convert_v1beta1_CustomMetricCurrentStatusList_To_extensions_CustomMetricCur } func autoConvert_extensions_CustomMetricCurrentStatusList_To_v1beta1_CustomMetricCurrentStatusList(in *extensions.CustomMetricCurrentStatusList, out *v1beta1.CustomMetricCurrentStatusList, s conversion.Scope) error { - if in.Items == nil { - out.Items = make([]v1beta1.CustomMetricCurrentStatus, 0) - } else { - out.Items = *(*[]v1beta1.CustomMetricCurrentStatus)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.CustomMetricCurrentStatus)(unsafe.Pointer(&in.Items)) return nil } @@ -244,11 +240,7 @@ func Convert_v1beta1_CustomMetricTargetList_To_extensions_CustomMetricTargetList } func autoConvert_extensions_CustomMetricTargetList_To_v1beta1_CustomMetricTargetList(in *extensions.CustomMetricTargetList, out *v1beta1.CustomMetricTargetList, s conversion.Scope) error { - if in.Items == nil { - out.Items = make([]v1beta1.CustomMetricTarget, 0) - } else { - out.Items = *(*[]v1beta1.CustomMetricTarget)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.CustomMetricTarget)(unsafe.Pointer(&in.Items)) return nil } @@ -321,7 +313,7 @@ func autoConvert_extensions_DaemonSetList_To_v1beta1_DaemonSetList(in *extension } } } else { - out.Items = make([]v1beta1.DaemonSet, 0) + out.Items = nil } return nil } @@ -537,7 +529,7 @@ func autoConvert_extensions_DeploymentList_To_v1beta1_DeploymentList(in *extensi } } } else { - out.Items = make([]v1beta1.Deployment, 0) + out.Items = nil } return nil } @@ -734,11 +726,7 @@ func Convert_v1beta1_HTTPIngressRuleValue_To_extensions_HTTPIngressRuleValue(in } func autoConvert_extensions_HTTPIngressRuleValue_To_v1beta1_HTTPIngressRuleValue(in *extensions.HTTPIngressRuleValue, out *v1beta1.HTTPIngressRuleValue, s conversion.Scope) error { - if in.Paths == nil { - out.Paths = make([]v1beta1.HTTPIngressPath, 0) - } else { - out.Paths = *(*[]v1beta1.HTTPIngressPath)(unsafe.Pointer(&in.Paths)) - } + out.Paths = *(*[]v1beta1.HTTPIngressPath)(unsafe.Pointer(&in.Paths)) return nil } @@ -836,11 +824,7 @@ func Convert_v1beta1_IngressList_To_extensions_IngressList(in *v1beta1.IngressLi func autoConvert_extensions_IngressList_To_v1beta1_IngressList(in *extensions.IngressList, out *v1beta1.IngressList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.Ingress, 0) - } else { - out.Items = *(*[]v1beta1.Ingress)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.Ingress)(unsafe.Pointer(&in.Items)) return nil } @@ -1025,7 +1009,7 @@ func autoConvert_extensions_PodSecurityPolicyList_To_v1beta1_PodSecurityPolicyLi } } } else { - out.Items = make([]v1beta1.PodSecurityPolicy, 0) + out.Items = nil } return nil } @@ -1208,7 +1192,7 @@ func autoConvert_extensions_ReplicaSetList_To_v1beta1_ReplicaSetList(in *extensi } } } else { - out.Items = make([]v1beta1.ReplicaSet, 0) + out.Items = nil } return nil } @@ -1522,11 +1506,7 @@ func Convert_v1beta1_ThirdPartyResourceDataList_To_extensions_ThirdPartyResource func autoConvert_extensions_ThirdPartyResourceDataList_To_v1beta1_ThirdPartyResourceDataList(in *extensions.ThirdPartyResourceDataList, out *v1beta1.ThirdPartyResourceDataList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.ThirdPartyResourceData, 0) - } else { - out.Items = *(*[]v1beta1.ThirdPartyResourceData)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.ThirdPartyResourceData)(unsafe.Pointer(&in.Items)) return nil } @@ -1548,11 +1528,7 @@ func Convert_v1beta1_ThirdPartyResourceList_To_extensions_ThirdPartyResourceList func autoConvert_extensions_ThirdPartyResourceList_To_v1beta1_ThirdPartyResourceList(in *extensions.ThirdPartyResourceList, out *v1beta1.ThirdPartyResourceList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.ThirdPartyResource, 0) - } else { - out.Items = *(*[]v1beta1.ThirdPartyResource)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.ThirdPartyResource)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/networking/v1/zz_generated.conversion.go b/pkg/apis/networking/v1/zz_generated.conversion.go index de3bd546369d8..bc0f0fb2aaf5f 100644 --- a/pkg/apis/networking/v1/zz_generated.conversion.go +++ b/pkg/apis/networking/v1/zz_generated.conversion.go @@ -140,11 +140,7 @@ func Convert_v1_NetworkPolicyList_To_networking_NetworkPolicyList(in *v1.Network func autoConvert_networking_NetworkPolicyList_To_v1_NetworkPolicyList(in *networking.NetworkPolicyList, out *v1.NetworkPolicyList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.NetworkPolicy, 0) - } else { - out.Items = *(*[]v1.NetworkPolicy)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.NetworkPolicy)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/policy/v1beta1/zz_generated.conversion.go b/pkg/apis/policy/v1beta1/zz_generated.conversion.go index 29b2bef6ea00d..aa07a7bd7d5a1 100644 --- a/pkg/apis/policy/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/policy/v1beta1/zz_generated.conversion.go @@ -118,11 +118,7 @@ func Convert_v1beta1_PodDisruptionBudgetList_To_policy_PodDisruptionBudgetList(i func autoConvert_policy_PodDisruptionBudgetList_To_v1beta1_PodDisruptionBudgetList(in *policy.PodDisruptionBudgetList, out *v1beta1.PodDisruptionBudgetList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.PodDisruptionBudget, 0) - } else { - out.Items = *(*[]v1beta1.PodDisruptionBudget)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.PodDisruptionBudget)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/rbac/v1/zz_generated.conversion.go b/pkg/apis/rbac/v1/zz_generated.conversion.go index dab304a212784..e5e668811e21a 100644 --- a/pkg/apis/rbac/v1/zz_generated.conversion.go +++ b/pkg/apis/rbac/v1/zz_generated.conversion.go @@ -74,11 +74,7 @@ func Convert_v1_ClusterRole_To_rbac_ClusterRole(in *v1.ClusterRole, out *rbac.Cl func autoConvert_rbac_ClusterRole_To_v1_ClusterRole(in *rbac.ClusterRole, out *v1.ClusterRole, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Rules == nil { - out.Rules = make([]v1.PolicyRule, 0) - } else { - out.Rules = *(*[]v1.PolicyRule)(unsafe.Pointer(&in.Rules)) - } + out.Rules = *(*[]v1.PolicyRule)(unsafe.Pointer(&in.Rules)) return nil } @@ -103,11 +99,7 @@ func Convert_v1_ClusterRoleBinding_To_rbac_ClusterRoleBinding(in *v1.ClusterRole func autoConvert_rbac_ClusterRoleBinding_To_v1_ClusterRoleBinding(in *rbac.ClusterRoleBinding, out *v1.ClusterRoleBinding, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Subjects == nil { - out.Subjects = make([]v1.Subject, 0) - } else { - out.Subjects = *(*[]v1.Subject)(unsafe.Pointer(&in.Subjects)) - } + out.Subjects = *(*[]v1.Subject)(unsafe.Pointer(&in.Subjects)) if err := Convert_rbac_RoleRef_To_v1_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { return err } @@ -132,11 +124,7 @@ func Convert_v1_ClusterRoleBindingList_To_rbac_ClusterRoleBindingList(in *v1.Clu func autoConvert_rbac_ClusterRoleBindingList_To_v1_ClusterRoleBindingList(in *rbac.ClusterRoleBindingList, out *v1.ClusterRoleBindingList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.ClusterRoleBinding, 0) - } else { - out.Items = *(*[]v1.ClusterRoleBinding)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.ClusterRoleBinding)(unsafe.Pointer(&in.Items)) return nil } @@ -158,11 +146,7 @@ func Convert_v1_ClusterRoleList_To_rbac_ClusterRoleList(in *v1.ClusterRoleList, func autoConvert_rbac_ClusterRoleList_To_v1_ClusterRoleList(in *rbac.ClusterRoleList, out *v1.ClusterRoleList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.ClusterRole, 0) - } else { - out.Items = *(*[]v1.ClusterRole)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.ClusterRole)(unsafe.Pointer(&in.Items)) return nil } @@ -186,11 +170,7 @@ func Convert_v1_PolicyRule_To_rbac_PolicyRule(in *v1.PolicyRule, out *rbac.Polic } func autoConvert_rbac_PolicyRule_To_v1_PolicyRule(in *rbac.PolicyRule, out *v1.PolicyRule, s conversion.Scope) error { - if in.Verbs == nil { - out.Verbs = make([]string, 0) - } else { - out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs)) - } + out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs)) out.APIGroups = *(*[]string)(unsafe.Pointer(&in.APIGroups)) out.Resources = *(*[]string)(unsafe.Pointer(&in.Resources)) out.ResourceNames = *(*[]string)(unsafe.Pointer(&in.ResourceNames)) @@ -216,11 +196,7 @@ func Convert_v1_Role_To_rbac_Role(in *v1.Role, out *rbac.Role, s conversion.Scop func autoConvert_rbac_Role_To_v1_Role(in *rbac.Role, out *v1.Role, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Rules == nil { - out.Rules = make([]v1.PolicyRule, 0) - } else { - out.Rules = *(*[]v1.PolicyRule)(unsafe.Pointer(&in.Rules)) - } + out.Rules = *(*[]v1.PolicyRule)(unsafe.Pointer(&in.Rules)) return nil } @@ -245,11 +221,7 @@ func Convert_v1_RoleBinding_To_rbac_RoleBinding(in *v1.RoleBinding, out *rbac.Ro func autoConvert_rbac_RoleBinding_To_v1_RoleBinding(in *rbac.RoleBinding, out *v1.RoleBinding, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Subjects == nil { - out.Subjects = make([]v1.Subject, 0) - } else { - out.Subjects = *(*[]v1.Subject)(unsafe.Pointer(&in.Subjects)) - } + out.Subjects = *(*[]v1.Subject)(unsafe.Pointer(&in.Subjects)) if err := Convert_rbac_RoleRef_To_v1_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { return err } @@ -274,11 +246,7 @@ func Convert_v1_RoleBindingList_To_rbac_RoleBindingList(in *v1.RoleBindingList, func autoConvert_rbac_RoleBindingList_To_v1_RoleBindingList(in *rbac.RoleBindingList, out *v1.RoleBindingList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.RoleBinding, 0) - } else { - out.Items = *(*[]v1.RoleBinding)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.RoleBinding)(unsafe.Pointer(&in.Items)) return nil } @@ -300,11 +268,7 @@ func Convert_v1_RoleList_To_rbac_RoleList(in *v1.RoleList, out *rbac.RoleList, s func autoConvert_rbac_RoleList_To_v1_RoleList(in *rbac.RoleList, out *v1.RoleList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.Role, 0) - } else { - out.Items = *(*[]v1.Role)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.Role)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/rbac/v1alpha1/zz_generated.conversion.go b/pkg/apis/rbac/v1alpha1/zz_generated.conversion.go index e59d4144527bc..4c52c5a783919 100644 --- a/pkg/apis/rbac/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/rbac/v1alpha1/zz_generated.conversion.go @@ -74,11 +74,7 @@ func Convert_v1alpha1_ClusterRole_To_rbac_ClusterRole(in *v1alpha1.ClusterRole, func autoConvert_rbac_ClusterRole_To_v1alpha1_ClusterRole(in *rbac.ClusterRole, out *v1alpha1.ClusterRole, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Rules == nil { - out.Rules = make([]v1alpha1.PolicyRule, 0) - } else { - out.Rules = *(*[]v1alpha1.PolicyRule)(unsafe.Pointer(&in.Rules)) - } + out.Rules = *(*[]v1alpha1.PolicyRule)(unsafe.Pointer(&in.Rules)) return nil } @@ -122,7 +118,7 @@ func autoConvert_rbac_ClusterRoleBinding_To_v1alpha1_ClusterRoleBinding(in *rbac } } } else { - out.Subjects = make([]v1alpha1.Subject, 0) + out.Subjects = nil } if err := Convert_rbac_RoleRef_To_v1alpha1_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { return err @@ -167,7 +163,7 @@ func autoConvert_rbac_ClusterRoleBindingList_To_v1alpha1_ClusterRoleBindingList( } } } else { - out.Items = make([]v1alpha1.ClusterRoleBinding, 0) + out.Items = nil } return nil } @@ -190,11 +186,7 @@ func Convert_v1alpha1_ClusterRoleList_To_rbac_ClusterRoleList(in *v1alpha1.Clust func autoConvert_rbac_ClusterRoleList_To_v1alpha1_ClusterRoleList(in *rbac.ClusterRoleList, out *v1alpha1.ClusterRoleList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1alpha1.ClusterRole, 0) - } else { - out.Items = *(*[]v1alpha1.ClusterRole)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1alpha1.ClusterRole)(unsafe.Pointer(&in.Items)) return nil } @@ -218,11 +210,7 @@ func Convert_v1alpha1_PolicyRule_To_rbac_PolicyRule(in *v1alpha1.PolicyRule, out } func autoConvert_rbac_PolicyRule_To_v1alpha1_PolicyRule(in *rbac.PolicyRule, out *v1alpha1.PolicyRule, s conversion.Scope) error { - if in.Verbs == nil { - out.Verbs = make([]string, 0) - } else { - out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs)) - } + out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs)) out.APIGroups = *(*[]string)(unsafe.Pointer(&in.APIGroups)) out.Resources = *(*[]string)(unsafe.Pointer(&in.Resources)) out.ResourceNames = *(*[]string)(unsafe.Pointer(&in.ResourceNames)) @@ -248,11 +236,7 @@ func Convert_v1alpha1_Role_To_rbac_Role(in *v1alpha1.Role, out *rbac.Role, s con func autoConvert_rbac_Role_To_v1alpha1_Role(in *rbac.Role, out *v1alpha1.Role, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Rules == nil { - out.Rules = make([]v1alpha1.PolicyRule, 0) - } else { - out.Rules = *(*[]v1alpha1.PolicyRule)(unsafe.Pointer(&in.Rules)) - } + out.Rules = *(*[]v1alpha1.PolicyRule)(unsafe.Pointer(&in.Rules)) return nil } @@ -296,7 +280,7 @@ func autoConvert_rbac_RoleBinding_To_v1alpha1_RoleBinding(in *rbac.RoleBinding, } } } else { - out.Subjects = make([]v1alpha1.Subject, 0) + out.Subjects = nil } if err := Convert_rbac_RoleRef_To_v1alpha1_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { return err @@ -341,7 +325,7 @@ func autoConvert_rbac_RoleBindingList_To_v1alpha1_RoleBindingList(in *rbac.RoleB } } } else { - out.Items = make([]v1alpha1.RoleBinding, 0) + out.Items = nil } return nil } @@ -364,11 +348,7 @@ func Convert_v1alpha1_RoleList_To_rbac_RoleList(in *v1alpha1.RoleList, out *rbac func autoConvert_rbac_RoleList_To_v1alpha1_RoleList(in *rbac.RoleList, out *v1alpha1.RoleList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1alpha1.Role, 0) - } else { - out.Items = *(*[]v1alpha1.Role)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1alpha1.Role)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/rbac/v1beta1/zz_generated.conversion.go b/pkg/apis/rbac/v1beta1/zz_generated.conversion.go index ade9a69bf003c..d06b9265aa1a9 100644 --- a/pkg/apis/rbac/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/rbac/v1beta1/zz_generated.conversion.go @@ -74,11 +74,7 @@ func Convert_v1beta1_ClusterRole_To_rbac_ClusterRole(in *v1beta1.ClusterRole, ou func autoConvert_rbac_ClusterRole_To_v1beta1_ClusterRole(in *rbac.ClusterRole, out *v1beta1.ClusterRole, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Rules == nil { - out.Rules = make([]v1beta1.PolicyRule, 0) - } else { - out.Rules = *(*[]v1beta1.PolicyRule)(unsafe.Pointer(&in.Rules)) - } + out.Rules = *(*[]v1beta1.PolicyRule)(unsafe.Pointer(&in.Rules)) return nil } @@ -103,11 +99,7 @@ func Convert_v1beta1_ClusterRoleBinding_To_rbac_ClusterRoleBinding(in *v1beta1.C func autoConvert_rbac_ClusterRoleBinding_To_v1beta1_ClusterRoleBinding(in *rbac.ClusterRoleBinding, out *v1beta1.ClusterRoleBinding, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Subjects == nil { - out.Subjects = make([]v1beta1.Subject, 0) - } else { - out.Subjects = *(*[]v1beta1.Subject)(unsafe.Pointer(&in.Subjects)) - } + out.Subjects = *(*[]v1beta1.Subject)(unsafe.Pointer(&in.Subjects)) if err := Convert_rbac_RoleRef_To_v1beta1_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { return err } @@ -132,11 +124,7 @@ func Convert_v1beta1_ClusterRoleBindingList_To_rbac_ClusterRoleBindingList(in *v func autoConvert_rbac_ClusterRoleBindingList_To_v1beta1_ClusterRoleBindingList(in *rbac.ClusterRoleBindingList, out *v1beta1.ClusterRoleBindingList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.ClusterRoleBinding, 0) - } else { - out.Items = *(*[]v1beta1.ClusterRoleBinding)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.ClusterRoleBinding)(unsafe.Pointer(&in.Items)) return nil } @@ -158,11 +146,7 @@ func Convert_v1beta1_ClusterRoleList_To_rbac_ClusterRoleList(in *v1beta1.Cluster func autoConvert_rbac_ClusterRoleList_To_v1beta1_ClusterRoleList(in *rbac.ClusterRoleList, out *v1beta1.ClusterRoleList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.ClusterRole, 0) - } else { - out.Items = *(*[]v1beta1.ClusterRole)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.ClusterRole)(unsafe.Pointer(&in.Items)) return nil } @@ -186,11 +170,7 @@ func Convert_v1beta1_PolicyRule_To_rbac_PolicyRule(in *v1beta1.PolicyRule, out * } func autoConvert_rbac_PolicyRule_To_v1beta1_PolicyRule(in *rbac.PolicyRule, out *v1beta1.PolicyRule, s conversion.Scope) error { - if in.Verbs == nil { - out.Verbs = make([]string, 0) - } else { - out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs)) - } + out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs)) out.APIGroups = *(*[]string)(unsafe.Pointer(&in.APIGroups)) out.Resources = *(*[]string)(unsafe.Pointer(&in.Resources)) out.ResourceNames = *(*[]string)(unsafe.Pointer(&in.ResourceNames)) @@ -216,11 +196,7 @@ func Convert_v1beta1_Role_To_rbac_Role(in *v1beta1.Role, out *rbac.Role, s conve func autoConvert_rbac_Role_To_v1beta1_Role(in *rbac.Role, out *v1beta1.Role, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Rules == nil { - out.Rules = make([]v1beta1.PolicyRule, 0) - } else { - out.Rules = *(*[]v1beta1.PolicyRule)(unsafe.Pointer(&in.Rules)) - } + out.Rules = *(*[]v1beta1.PolicyRule)(unsafe.Pointer(&in.Rules)) return nil } @@ -245,11 +221,7 @@ func Convert_v1beta1_RoleBinding_To_rbac_RoleBinding(in *v1beta1.RoleBinding, ou func autoConvert_rbac_RoleBinding_To_v1beta1_RoleBinding(in *rbac.RoleBinding, out *v1beta1.RoleBinding, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Subjects == nil { - out.Subjects = make([]v1beta1.Subject, 0) - } else { - out.Subjects = *(*[]v1beta1.Subject)(unsafe.Pointer(&in.Subjects)) - } + out.Subjects = *(*[]v1beta1.Subject)(unsafe.Pointer(&in.Subjects)) if err := Convert_rbac_RoleRef_To_v1beta1_RoleRef(&in.RoleRef, &out.RoleRef, s); err != nil { return err } @@ -274,11 +246,7 @@ func Convert_v1beta1_RoleBindingList_To_rbac_RoleBindingList(in *v1beta1.RoleBin func autoConvert_rbac_RoleBindingList_To_v1beta1_RoleBindingList(in *rbac.RoleBindingList, out *v1beta1.RoleBindingList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.RoleBinding, 0) - } else { - out.Items = *(*[]v1beta1.RoleBinding)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.RoleBinding)(unsafe.Pointer(&in.Items)) return nil } @@ -300,11 +268,7 @@ func Convert_v1beta1_RoleList_To_rbac_RoleList(in *v1beta1.RoleList, out *rbac.R func autoConvert_rbac_RoleList_To_v1beta1_RoleList(in *rbac.RoleList, out *v1beta1.RoleList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.Role, 0) - } else { - out.Items = *(*[]v1beta1.Role)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.Role)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/scheduling/v1alpha1/zz_generated.conversion.go b/pkg/apis/scheduling/v1alpha1/zz_generated.conversion.go index c9be26ed14690..6a99b58a6e5cf 100644 --- a/pkg/apis/scheduling/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/scheduling/v1alpha1/zz_generated.conversion.go @@ -82,11 +82,7 @@ func Convert_v1alpha1_PriorityClassList_To_scheduling_PriorityClassList(in *v1al func autoConvert_scheduling_PriorityClassList_To_v1alpha1_PriorityClassList(in *scheduling.PriorityClassList, out *v1alpha1.PriorityClassList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1alpha1.PriorityClass, 0) - } else { - out.Items = *(*[]v1alpha1.PriorityClass)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1alpha1.PriorityClass)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/settings/v1alpha1/zz_generated.conversion.go b/pkg/apis/settings/v1alpha1/zz_generated.conversion.go index dfdd7d133baee..396102ecd8433 100644 --- a/pkg/apis/settings/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/settings/v1alpha1/zz_generated.conversion.go @@ -105,7 +105,7 @@ func autoConvert_settings_PodPresetList_To_v1alpha1_PodPresetList(in *settings.P } } } else { - out.Items = make([]v1alpha1.PodPreset, 0) + out.Items = nil } return nil } diff --git a/pkg/apis/storage/v1/zz_generated.conversion.go b/pkg/apis/storage/v1/zz_generated.conversion.go index 6041cff96fae2..70472b1e9e8ce 100644 --- a/pkg/apis/storage/v1/zz_generated.conversion.go +++ b/pkg/apis/storage/v1/zz_generated.conversion.go @@ -84,11 +84,7 @@ func Convert_v1_StorageClassList_To_storage_StorageClassList(in *v1.StorageClass func autoConvert_storage_StorageClassList_To_v1_StorageClassList(in *storage.StorageClassList, out *v1.StorageClassList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1.StorageClass, 0) - } else { - out.Items = *(*[]v1.StorageClass)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1.StorageClass)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/storage/v1beta1/zz_generated.conversion.go b/pkg/apis/storage/v1beta1/zz_generated.conversion.go index 80bab19cd8942..7d259d1e32479 100644 --- a/pkg/apis/storage/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/storage/v1beta1/zz_generated.conversion.go @@ -84,11 +84,7 @@ func Convert_v1beta1_StorageClassList_To_storage_StorageClassList(in *v1beta1.St func autoConvert_storage_StorageClassList_To_v1beta1_StorageClassList(in *storage.StorageClassList, out *v1beta1.StorageClassList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]v1beta1.StorageClass, 0) - } else { - out.Items = *(*[]v1beta1.StorageClass)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]v1beta1.StorageClass)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.conversion.go b/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.conversion.go index 8944101adec6c..125991c652dff 100644 --- a/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.conversion.go +++ b/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.conversion.go @@ -326,21 +326,9 @@ func autoConvert_kubeletconfig_KubeletConfiguration_To_v1alpha1_KubeletConfigura if err := v1.Convert_bool_To_Pointer_bool(&in.AllowPrivileged, &out.AllowPrivileged, s); err != nil { return err } - if in.HostNetworkSources == nil { - out.HostNetworkSources = make([]string, 0) - } else { - out.HostNetworkSources = *(*[]string)(unsafe.Pointer(&in.HostNetworkSources)) - } - if in.HostPIDSources == nil { - out.HostPIDSources = make([]string, 0) - } else { - out.HostPIDSources = *(*[]string)(unsafe.Pointer(&in.HostPIDSources)) - } - if in.HostIPCSources == nil { - out.HostIPCSources = make([]string, 0) - } else { - out.HostIPCSources = *(*[]string)(unsafe.Pointer(&in.HostIPCSources)) - } + out.HostNetworkSources = *(*[]string)(unsafe.Pointer(&in.HostNetworkSources)) + out.HostPIDSources = *(*[]string)(unsafe.Pointer(&in.HostPIDSources)) + out.HostIPCSources = *(*[]string)(unsafe.Pointer(&in.HostIPCSources)) if err := v1.Convert_int32_To_Pointer_int32(&in.RegistryPullQPS, &out.RegistryPullQPS, s); err != nil { return err } @@ -371,11 +359,7 @@ func autoConvert_kubeletconfig_KubeletConfiguration_To_v1alpha1_KubeletConfigura } out.ClusterDomain = in.ClusterDomain out.MasterServiceNamespace = in.MasterServiceNamespace - if in.ClusterDNS == nil { - out.ClusterDNS = make([]string, 0) - } else { - out.ClusterDNS = *(*[]string)(unsafe.Pointer(&in.ClusterDNS)) - } + out.ClusterDNS = *(*[]string)(unsafe.Pointer(&in.ClusterDNS)) out.StreamingConnectionIdleTimeout = in.StreamingConnectionIdleTimeout out.NodeStatusUpdateFrequency = in.NodeStatusUpdateFrequency out.ImageMinimumGCAge = in.ImageMinimumGCAge @@ -418,11 +402,7 @@ func autoConvert_kubeletconfig_KubeletConfiguration_To_v1alpha1_KubeletConfigura if err := v1.Convert_bool_To_Pointer_bool(&in.RegisterSchedulable, &out.RegisterSchedulable, s); err != nil { return err } - if in.RegisterWithTaints == nil { - out.RegisterWithTaints = make([]core_v1.Taint, 0) - } else { - out.RegisterWithTaints = *(*[]core_v1.Taint)(unsafe.Pointer(&in.RegisterWithTaints)) - } + out.RegisterWithTaints = *(*[]core_v1.Taint)(unsafe.Pointer(&in.RegisterWithTaints)) out.ContentType = in.ContentType if err := v1.Convert_int32_To_Pointer_int32(&in.KubeAPIQPS, &out.KubeAPIQPS, s); err != nil { return err @@ -469,11 +449,7 @@ func autoConvert_kubeletconfig_KubeletConfiguration_To_v1alpha1_KubeletConfigura out.KubeReserved = *(*map[string]string)(unsafe.Pointer(&in.KubeReserved)) out.SystemReservedCgroup = in.SystemReservedCgroup out.KubeReservedCgroup = in.KubeReservedCgroup - if in.EnforceNodeAllocatable == nil { - out.EnforceNodeAllocatable = make([]string, 0) - } else { - out.EnforceNodeAllocatable = *(*[]string)(unsafe.Pointer(&in.EnforceNodeAllocatable)) - } + out.EnforceNodeAllocatable = *(*[]string)(unsafe.Pointer(&in.EnforceNodeAllocatable)) out.ExperimentalNodeAllocatableIgnoreEvictionThreshold = in.ExperimentalNodeAllocatableIgnoreEvictionThreshold return nil } diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go index 786ae971711b3..43b75e6b832b8 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go +++ b/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go @@ -53,11 +53,7 @@ func Convert_v1alpha1_Configuration_To_resourcequota_Configuration(in *Configura } func autoConvert_resourcequota_Configuration_To_v1alpha1_Configuration(in *resourcequota.Configuration, out *Configuration, s conversion.Scope) error { - if in.LimitedResources == nil { - out.LimitedResources = make([]LimitedResource, 0) - } else { - out.LimitedResources = *(*[]LimitedResource)(unsafe.Pointer(&in.LimitedResources)) - } + out.LimitedResources = *(*[]LimitedResource)(unsafe.Pointer(&in.LimitedResources)) return nil } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go index 15b1255a3d8a2..cb19f35d7c7a0 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go @@ -123,11 +123,7 @@ func Convert_v1beta1_CustomResourceDefinitionList_To_apiextensions_CustomResourc func autoConvert_apiextensions_CustomResourceDefinitionList_To_v1beta1_CustomResourceDefinitionList(in *apiextensions.CustomResourceDefinitionList, out *CustomResourceDefinitionList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]CustomResourceDefinition, 0) - } else { - out.Items = *(*[]CustomResourceDefinition)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]CustomResourceDefinition)(unsafe.Pointer(&in.Items)) return nil } @@ -208,11 +204,7 @@ func Convert_v1beta1_CustomResourceDefinitionStatus_To_apiextensions_CustomResou } func autoConvert_apiextensions_CustomResourceDefinitionStatus_To_v1beta1_CustomResourceDefinitionStatus(in *apiextensions.CustomResourceDefinitionStatus, out *CustomResourceDefinitionStatus, s conversion.Scope) error { - if in.Conditions == nil { - out.Conditions = make([]CustomResourceDefinitionCondition, 0) - } else { - out.Conditions = *(*[]CustomResourceDefinitionCondition)(unsafe.Pointer(&in.Conditions)) - } + out.Conditions = *(*[]CustomResourceDefinitionCondition)(unsafe.Pointer(&in.Conditions)) if err := Convert_apiextensions_CustomResourceDefinitionNames_To_v1beta1_CustomResourceDefinitionNames(&in.AcceptedNames, &out.AcceptedNames, s); err != nil { return err } diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.conversion.go b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.conversion.go index bd3dbf1d69465..bc060c309bf18 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.conversion.go @@ -143,7 +143,7 @@ func autoConvert_testapigroup_CarpList_To_v1_CarpList(in *testapigroup.CarpList, } } } else { - out.Items = make([]Carp, 0) + out.Items = nil } return nil } diff --git a/staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.conversion.go b/staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.conversion.go index 750a73cd9e222..8b6a1695634fc 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.conversion.go @@ -71,7 +71,7 @@ func autoConvert_apiserver_AdmissionConfiguration_To_v1alpha1_AdmissionConfigura } } } else { - out.Plugins = make([]AdmissionPluginConfiguration, 0) + out.Plugins = nil } return nil } diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.conversion.go b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.conversion.go index 972dca99f0c28..8007dda36e855 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.conversion.go @@ -120,11 +120,7 @@ func Convert_v1alpha1_EventList_To_audit_EventList(in *EventList, out *audit.Eve func autoConvert_audit_EventList_To_v1alpha1_EventList(in *audit.EventList, out *EventList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]Event, 0) - } else { - out.Items = *(*[]Event)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]Event)(unsafe.Pointer(&in.Items)) return nil } @@ -200,11 +196,7 @@ func Convert_v1alpha1_Policy_To_audit_Policy(in *Policy, out *audit.Policy, s co func autoConvert_audit_Policy_To_v1alpha1_Policy(in *audit.Policy, out *Policy, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Rules == nil { - out.Rules = make([]PolicyRule, 0) - } else { - out.Rules = *(*[]PolicyRule)(unsafe.Pointer(&in.Rules)) - } + out.Rules = *(*[]PolicyRule)(unsafe.Pointer(&in.Rules)) return nil } @@ -226,11 +218,7 @@ func Convert_v1alpha1_PolicyList_To_audit_PolicyList(in *PolicyList, out *audit. func autoConvert_audit_PolicyList_To_v1alpha1_PolicyList(in *audit.PolicyList, out *PolicyList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]Policy, 0) - } else { - out.Items = *(*[]Policy)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]Policy)(unsafe.Pointer(&in.Items)) return nil } diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.conversion.go b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.conversion.go index 78617dba62095..905420af9debe 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.conversion.go @@ -120,11 +120,7 @@ func Convert_v1beta1_EventList_To_audit_EventList(in *EventList, out *audit.Even func autoConvert_audit_EventList_To_v1beta1_EventList(in *audit.EventList, out *EventList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]Event, 0) - } else { - out.Items = *(*[]Event)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]Event)(unsafe.Pointer(&in.Items)) return nil } @@ -200,11 +196,7 @@ func Convert_v1beta1_Policy_To_audit_Policy(in *Policy, out *audit.Policy, s con func autoConvert_audit_Policy_To_v1beta1_Policy(in *audit.Policy, out *Policy, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if in.Rules == nil { - out.Rules = make([]PolicyRule, 0) - } else { - out.Rules = *(*[]PolicyRule)(unsafe.Pointer(&in.Rules)) - } + out.Rules = *(*[]PolicyRule)(unsafe.Pointer(&in.Rules)) return nil } @@ -226,11 +218,7 @@ func Convert_v1beta1_PolicyList_To_audit_PolicyList(in *PolicyList, out *audit.P func autoConvert_audit_PolicyList_To_v1beta1_PolicyList(in *audit.PolicyList, out *PolicyList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]Policy, 0) - } else { - out.Items = *(*[]Policy)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]Policy)(unsafe.Pointer(&in.Items)) return nil } diff --git a/staging/src/k8s.io/apiserver/pkg/apis/example/v1/zz_generated.conversion.go b/staging/src/k8s.io/apiserver/pkg/apis/example/v1/zz_generated.conversion.go index 4785d9da2c9e9..8fa603fde7648 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/example/v1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/example/v1/zz_generated.conversion.go @@ -143,7 +143,7 @@ func autoConvert_example_PodList_To_v1_PodList(in *example.PodList, out *PodList } } } else { - out.Items = make([]Pod, 0) + out.Items = nil } return nil } diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/zz_generated.conversion.go b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/zz_generated.conversion.go index 6f865823766fe..e283d20b7c7d4 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/zz_generated.conversion.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/zz_generated.conversion.go @@ -123,11 +123,7 @@ func Convert_v1beta1_APIServiceList_To_apiregistration_APIServiceList(in *APISer func autoConvert_apiregistration_APIServiceList_To_v1beta1_APIServiceList(in *apiregistration.APIServiceList, out *APIServiceList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]APIService, 0) - } else { - out.Items = *(*[]APIService)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]APIService)(unsafe.Pointer(&in.Items)) return nil } @@ -157,11 +153,7 @@ func autoConvert_apiregistration_APIServiceSpec_To_v1beta1_APIServiceSpec(in *ap out.Group = in.Group out.Version = in.Version out.InsecureSkipTLSVerify = in.InsecureSkipTLSVerify - if in.CABundle == nil { - out.CABundle = make([]byte, 0) - } else { - out.CABundle = *(*[]byte)(unsafe.Pointer(&in.CABundle)) - } + out.CABundle = *(*[]byte)(unsafe.Pointer(&in.CABundle)) out.GroupPriorityMinimum = in.GroupPriorityMinimum out.VersionPriority = in.VersionPriority return nil diff --git a/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1/zz_generated.conversion.go b/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1/zz_generated.conversion.go index 486f06be10c50..ab90bf36bc6ce 100644 --- a/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1/zz_generated.conversion.go +++ b/staging/src/k8s.io/metrics/pkg/apis/custom_metrics/v1alpha1/zz_generated.conversion.go @@ -78,11 +78,7 @@ func Convert_custom_metrics_MetricValue_To_v1alpha1_MetricValue(in *custom_metri func autoConvert_v1alpha1_MetricValueList_To_custom_metrics_MetricValueList(in *MetricValueList, out *custom_metrics.MetricValueList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]custom_metrics.MetricValue, 0) - } else { - out.Items = *(*[]custom_metrics.MetricValue)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]custom_metrics.MetricValue)(unsafe.Pointer(&in.Items)) return nil } @@ -93,11 +89,7 @@ func Convert_v1alpha1_MetricValueList_To_custom_metrics_MetricValueList(in *Metr func autoConvert_custom_metrics_MetricValueList_To_v1alpha1_MetricValueList(in *custom_metrics.MetricValueList, out *MetricValueList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]MetricValue, 0) - } else { - out.Items = *(*[]MetricValue)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]MetricValue)(unsafe.Pointer(&in.Items)) return nil } diff --git a/staging/src/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.conversion.go b/staging/src/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.conversion.go index b39ae569a5ed1..3ec0eba6b328f 100644 --- a/staging/src/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.conversion.go +++ b/staging/src/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.conversion.go @@ -110,11 +110,7 @@ func Convert_v1alpha1_NodeMetricsList_To_metrics_NodeMetricsList(in *NodeMetrics func autoConvert_metrics_NodeMetricsList_To_v1alpha1_NodeMetricsList(in *metrics.NodeMetricsList, out *NodeMetricsList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]NodeMetrics, 0) - } else { - out.Items = *(*[]NodeMetrics)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]NodeMetrics)(unsafe.Pointer(&in.Items)) return nil } @@ -140,11 +136,7 @@ func autoConvert_metrics_PodMetrics_To_v1alpha1_PodMetrics(in *metrics.PodMetric out.ObjectMeta = in.ObjectMeta out.Timestamp = in.Timestamp out.Window = in.Window - if in.Containers == nil { - out.Containers = make([]ContainerMetrics, 0) - } else { - out.Containers = *(*[]ContainerMetrics)(unsafe.Pointer(&in.Containers)) - } + out.Containers = *(*[]ContainerMetrics)(unsafe.Pointer(&in.Containers)) return nil } @@ -166,11 +158,7 @@ func Convert_v1alpha1_PodMetricsList_To_metrics_PodMetricsList(in *PodMetricsLis func autoConvert_metrics_PodMetricsList_To_v1alpha1_PodMetricsList(in *metrics.PodMetricsList, out *PodMetricsList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]PodMetrics, 0) - } else { - out.Items = *(*[]PodMetrics)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]PodMetrics)(unsafe.Pointer(&in.Items)) return nil } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/zz_generated.conversion.go b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/zz_generated.conversion.go index 81169932cffaf..8a4fbab332131 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/zz_generated.conversion.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/zz_generated.conversion.go @@ -85,11 +85,7 @@ func Convert_v1alpha1_FischerList_To_wardle_FischerList(in *FischerList, out *wa func autoConvert_wardle_FischerList_To_v1alpha1_FischerList(in *wardle.FischerList, out *FischerList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]Fischer, 0) - } else { - out.Items = *(*[]Fischer)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]Fischer)(unsafe.Pointer(&in.Items)) return nil } @@ -143,11 +139,7 @@ func Convert_v1alpha1_FlunderList_To_wardle_FlunderList(in *FlunderList, out *wa func autoConvert_wardle_FlunderList_To_v1alpha1_FlunderList(in *wardle.FlunderList, out *FlunderList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items == nil { - out.Items = make([]Flunder, 0) - } else { - out.Items = *(*[]Flunder)(unsafe.Pointer(&in.Items)) - } + out.Items = *(*[]Flunder)(unsafe.Pointer(&in.Items)) return nil } From c59c54b247435c9ba4d7e2557d7812d14da579d5 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Mon, 7 Aug 2017 15:16:29 -0400 Subject: [PATCH 328/403] Update fixture data --- .../rbac/bootstrappolicy/testdata/cluster-role-bindings.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-role-bindings.yaml b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-role-bindings.yaml index 9688f9abd1f53..1dbc33dd4491d 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-role-bindings.yaml +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-role-bindings.yaml @@ -121,7 +121,7 @@ items: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:node - subjects: [] + subjects: null - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: From 19ebaf2870c9546ff09b4213c408a8cc09eeb3e3 Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Fri, 25 Aug 2017 15:21:47 -0400 Subject: [PATCH 329/403] Don't update pvc.status.capacity if pvc is already Bound --- .../volume/persistentvolume/pv_controller.go | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/pkg/controller/volume/persistentvolume/pv_controller.go b/pkg/controller/volume/persistentvolume/pv_controller.go index 16ad055d83a02..facfe4ab03306 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller.go +++ b/pkg/controller/volume/persistentvolume/pv_controller.go @@ -625,14 +625,19 @@ func (ctrl *PersistentVolumeController) updateClaimStatus(claim *v1.PersistentVo dirty = true } - volumeCap, ok := volume.Spec.Capacity[v1.ResourceStorage] - if !ok { - return nil, fmt.Errorf("PersistentVolume %q is without a storage capacity", volume.Name) - } - claimCap, ok := claim.Status.Capacity[v1.ResourceStorage] - if !ok || volumeCap.Cmp(claimCap) != 0 { - claimClone.Status.Capacity = volume.Spec.Capacity - dirty = true + // Update Capacity if the claim is becoming Bound, not if it was already. + // A discrepancy can be intentional to mean that the PVC filesystem size + // doesn't match the PV block device size, so don't clobber it + if claim.Status.Phase != phase { + volumeCap, ok := volume.Spec.Capacity[v1.ResourceStorage] + if !ok { + return nil, fmt.Errorf("PersistentVolume %q is without a storage capacity", volume.Name) + } + claimCap, ok := claim.Status.Capacity[v1.ResourceStorage] + if !ok || volumeCap.Cmp(claimCap) != 0 { + claimClone.Status.Capacity = volume.Spec.Capacity + dirty = true + } } } From f9767d2f71adbae98b9447e918a8c4c51d919baf Mon Sep 17 00:00:00 2001 From: Yang Guo Date: Fri, 18 Aug 2017 15:08:44 -0700 Subject: [PATCH 330/403] Change StatsProvider interface to provide container stats from either cadvisor or CRI and implement this interface using cadvisor --- hack/.golint_failures | 1 + pkg/kubelet/BUILD | 5 +- pkg/kubelet/container/BUILD | 10 +- pkg/kubelet/container/testing/BUILD | 10 +- .../container/testing/mock_runtime_cache.go | 64 ++ pkg/kubelet/kubelet.go | 25 +- pkg/kubelet/kubelet_cadvisor.go | 108 ---- pkg/kubelet/kubelet_cadvisor_test.go | 252 -------- pkg/kubelet/kubelet_getters.go | 19 + pkg/kubelet/kubelet_test.go | 11 +- pkg/kubelet/pod/testing/BUILD | 8 +- pkg/kubelet/pod/testing/mock_manager.go | 291 +++++++++ pkg/kubelet/runonce_test.go | 2 +- pkg/kubelet/server/BUILD | 5 +- pkg/kubelet/server/server.go | 14 +- pkg/kubelet/server/server_test.go | 23 +- pkg/kubelet/server/stats/BUILD | 32 +- pkg/kubelet/server/stats/handler.go | 39 +- pkg/kubelet/server/stats/mocks_test.go | 244 -------- pkg/kubelet/server/stats/resource_analyzer.go | 6 +- pkg/kubelet/server/stats/summary.go | 514 ++-------------- pkg/kubelet/server/stats/summary_test.go | 551 +++-------------- pkg/kubelet/server/stats/testing/BUILD | 30 + .../stats/testing/mock_stats_provider.go | 280 +++++++++ pkg/kubelet/stats/BUILD | 69 +++ pkg/kubelet/stats/cadvisor_stats_provider.go | 288 +++++++++ .../stats/cadvisor_stats_provider_test.go | 271 ++++++++ pkg/kubelet/stats/cri_stats_provider.go | 66 ++ pkg/kubelet/stats/helper.go | 248 ++++++++ pkg/kubelet/stats/helper_test.go | 99 +++ pkg/kubelet/stats/stats_provider.go | 175 ++++++ pkg/kubelet/stats/stats_provider_test.go | 579 ++++++++++++++++++ 32 files changed, 2723 insertions(+), 1616 deletions(-) create mode 100644 pkg/kubelet/container/testing/mock_runtime_cache.go delete mode 100644 pkg/kubelet/kubelet_cadvisor.go delete mode 100644 pkg/kubelet/kubelet_cadvisor_test.go create mode 100644 pkg/kubelet/pod/testing/mock_manager.go delete mode 100644 pkg/kubelet/server/stats/mocks_test.go create mode 100644 pkg/kubelet/server/stats/testing/BUILD create mode 100644 pkg/kubelet/server/stats/testing/mock_stats_provider.go create mode 100644 pkg/kubelet/stats/BUILD create mode 100644 pkg/kubelet/stats/cadvisor_stats_provider.go create mode 100644 pkg/kubelet/stats/cadvisor_stats_provider_test.go create mode 100644 pkg/kubelet/stats/cri_stats_provider.go create mode 100644 pkg/kubelet/stats/helper.go create mode 100644 pkg/kubelet/stats/helper_test.go create mode 100644 pkg/kubelet/stats/stats_provider.go create mode 100644 pkg/kubelet/stats/stats_provider_test.go diff --git a/hack/.golint_failures b/hack/.golint_failures index 75ff200d52975..32330dca2e086 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -279,6 +279,7 @@ pkg/kubelet/server/portforward pkg/kubelet/server/remotecommand pkg/kubelet/server/stats pkg/kubelet/server/streaming +pkg/kubelet/stats pkg/kubelet/status pkg/kubelet/status/testing pkg/kubelet/sysctl diff --git a/pkg/kubelet/BUILD b/pkg/kubelet/BUILD index 1f0aa84dceeea..4f7d840b084f3 100644 --- a/pkg/kubelet/BUILD +++ b/pkg/kubelet/BUILD @@ -12,7 +12,6 @@ go_library( "active_deadline.go", "doc.go", "kubelet.go", - "kubelet_cadvisor.go", "kubelet_getters.go", "kubelet_network.go", "kubelet_node_status.go", @@ -79,6 +78,7 @@ go_library( "//pkg/kubelet/server/remotecommand:go_default_library", "//pkg/kubelet/server/stats:go_default_library", "//pkg/kubelet/server/streaming:go_default_library", + "//pkg/kubelet/stats:go_default_library", "//pkg/kubelet/status:go_default_library", "//pkg/kubelet/sysctl:go_default_library", "//pkg/kubelet/types:go_default_library", @@ -145,7 +145,6 @@ go_test( name = "go_default_test", srcs = [ "active_deadline_test.go", - "kubelet_cadvisor_test.go", "kubelet_getters_test.go", "kubelet_network_test.go", "kubelet_node_status_test.go", @@ -192,6 +191,7 @@ go_test( "//pkg/kubelet/server/portforward:go_default_library", "//pkg/kubelet/server/remotecommand:go_default_library", "//pkg/kubelet/server/stats:go_default_library", + "//pkg/kubelet/stats:go_default_library", "//pkg/kubelet/status:go_default_library", "//pkg/kubelet/status/testing:go_default_library", "//pkg/kubelet/types:go_default_library", @@ -274,6 +274,7 @@ filegroup( "//pkg/kubelet/rktshim:all-srcs", "//pkg/kubelet/secret:all-srcs", "//pkg/kubelet/server:all-srcs", + "//pkg/kubelet/stats:all-srcs", "//pkg/kubelet/status:all-srcs", "//pkg/kubelet/sysctl:all-srcs", "//pkg/kubelet/types:all-srcs", diff --git a/pkg/kubelet/container/BUILD b/pkg/kubelet/container/BUILD index 6f68454ab62b1..78c840846a9fb 100644 --- a/pkg/kubelet/container/BUILD +++ b/pkg/kubelet/container/BUILD @@ -1,10 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", @@ -27,6 +21,7 @@ go_library( ], "//conditions:default": [], }), + visibility = ["//visibility:public"], deps = [ "//pkg/api:go_default_library", "//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library", @@ -96,4 +91,5 @@ filegroup( "//pkg/kubelet/container/testing:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/pkg/kubelet/container/testing/BUILD b/pkg/kubelet/container/testing/BUILD index 3efa80948c6e8..deb39b6aa59d9 100644 --- a/pkg/kubelet/container/testing/BUILD +++ b/pkg/kubelet/container/testing/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -11,10 +6,12 @@ go_library( "fake_cache.go", "fake_runtime.go", "fake_runtime_helper.go", + "mock_runtime_cache.go", "mockfileinfo.go", "os.go", "runtime_mock.go", ], + visibility = ["//visibility:public"], deps = [ "//pkg/kubelet/container:go_default_library", "//pkg/volume:go_default_library", @@ -38,4 +35,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/pkg/kubelet/container/testing/mock_runtime_cache.go b/pkg/kubelet/container/testing/mock_runtime_cache.go new file mode 100644 index 0000000000000..0267764c90b58 --- /dev/null +++ b/pkg/kubelet/container/testing/mock_runtime_cache.go @@ -0,0 +1,64 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by mockery v1.0.0 +package testing + +import container "k8s.io/kubernetes/pkg/kubelet/container" +import mock "github.com/stretchr/testify/mock" +import time "time" + +// MockRuntimeCache is an autogenerated mock type for the RuntimeCache type +type MockRuntimeCache struct { + mock.Mock +} + +// ForceUpdateIfOlder provides a mock function with given fields: _a0 +func (_m *MockRuntimeCache) ForceUpdateIfOlder(_a0 time.Time) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(time.Time) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetPods provides a mock function with given fields: +func (_m *MockRuntimeCache) GetPods() ([]*container.Pod, error) { + ret := _m.Called() + + var r0 []*container.Pod + if rf, ok := ret.Get(0).(func() []*container.Pod); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*container.Pod) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 80fd03f26a163..992e3ea262f9b 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -88,8 +88,9 @@ import ( "k8s.io/kubernetes/pkg/kubelet/rkt" "k8s.io/kubernetes/pkg/kubelet/secret" "k8s.io/kubernetes/pkg/kubelet/server" - "k8s.io/kubernetes/pkg/kubelet/server/stats" + serverstats "k8s.io/kubernetes/pkg/kubelet/server/stats" "k8s.io/kubernetes/pkg/kubelet/server/streaming" + "k8s.io/kubernetes/pkg/kubelet/stats" "k8s.io/kubernetes/pkg/kubelet/status" "k8s.io/kubernetes/pkg/kubelet/sysctl" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" @@ -559,6 +560,8 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, MTU: int(crOptions.NetworkPluginMTU), } + klet.resourceAnalyzer = serverstats.NewResourceAnalyzer(klet, kubeCfg.VolumeStatsAggPeriod.Duration) + // Remote runtime shim just cannot talk back to kubelet, so it doesn't // support bandwidth shaping or hostports till #35457. To enable legacy // features, replace with networkHost. @@ -641,6 +644,12 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, } klet.containerRuntime = runtime klet.runner = runtime + klet.StatsProvider = stats.NewCadvisorStatsProvider( + klet.cadvisor, + klet.resourceAnalyzer, + klet.podManager, + klet.runtimeCache, + klet.containerRuntime) } else { // rkt uses the legacy, non-CRI, integration. Configure it the old way. // TODO: Include hairpin mode settings in rkt? @@ -673,11 +682,14 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, } klet.containerRuntime = runtime klet.runner = kubecontainer.DirectStreamingRunner(runtime) + klet.StatsProvider = stats.NewCadvisorStatsProvider( + klet.cadvisor, + klet.resourceAnalyzer, + klet.podManager, + klet.runtimeCache, + klet.containerRuntime) } - // TODO: Factor out "StatsProvider" from Kubelet so we don't have a cyclic dependency - klet.resourceAnalyzer = stats.NewResourceAnalyzer(klet, kubeCfg.VolumeStatsAggPeriod.Duration, klet.containerRuntime) - klet.pleg = pleg.NewGenericPLEG(klet.containerRuntime, plegChannelCapacity, plegRelistPeriod, klet.podCache, clock.RealClock{}) klet.runtimeState = newRuntimeState(maxWaitForContainerRuntime) klet.runtimeState.addHealthCheck("PLEG", klet.pleg.Healthy) @@ -992,7 +1004,7 @@ type Kubelet struct { oomWatcher OOMWatcher // Monitor resource usage - resourceAnalyzer stats.ResourceAnalyzer + resourceAnalyzer serverstats.ResourceAnalyzer // Whether or not we should have the QOS cgroup hierarchy for resource management cgroupsPerQOS bool @@ -1103,6 +1115,9 @@ type Kubelet struct { // dockerLegacyService contains some legacy methods for backward compatibility. // It should be set only when docker is using non json-file logging driver. dockerLegacyService dockershim.DockerLegacyService + + // StatsProvider provides the node and the container stats. + *stats.StatsProvider } func allLocalIPsWithoutLoopback() ([]net.IP, error) { diff --git a/pkg/kubelet/kubelet_cadvisor.go b/pkg/kubelet/kubelet_cadvisor.go deleted file mode 100644 index 2ff74f03cbc1e..0000000000000 --- a/pkg/kubelet/kubelet_cadvisor.go +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package kubelet - -import ( - cadvisorapi "github.com/google/cadvisor/info/v1" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" - "k8s.io/apimachinery/pkg/types" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" -) - -// GetContainerInfo returns stats (from Cadvisor) for a container. -func (kl *Kubelet) GetContainerInfo(podFullName string, podUID types.UID, containerName string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) { - - // Resolve and type convert back again. - // We need the static pod UID but the kubecontainer API works with types.UID. - podUID = types.UID(kl.podManager.TranslatePodUID(podUID)) - - pods, err := kl.runtimeCache.GetPods() - if err != nil { - return nil, err - } - pod := kubecontainer.Pods(pods).FindPod(podFullName, podUID) - container := pod.FindContainerByName(containerName) - if container == nil { - return nil, kubecontainer.ErrContainerNotFound - } - - ci, err := kl.cadvisor.DockerContainer(container.ID.ID, req) - if err != nil { - return nil, err - } - return &ci, nil -} - -// GetContainerInfoV2 returns stats (from Cadvisor) for containers. -func (kl *Kubelet) GetContainerInfoV2(name string, options cadvisorapiv2.RequestOptions) (map[string]cadvisorapiv2.ContainerInfo, error) { - return kl.cadvisor.ContainerInfoV2(name, options) -} - -// ImagesFsInfo returns information about docker image fs usage from -// cadvisor. -func (kl *Kubelet) ImagesFsInfo() (cadvisorapiv2.FsInfo, error) { - return kl.cadvisor.ImagesFsInfo() -} - -// RootFsInfo returns info about the root fs from cadvisor. -func (kl *Kubelet) RootFsInfo() (cadvisorapiv2.FsInfo, error) { - return kl.cadvisor.RootFsInfo() -} - -// GetRawContainerInfo returns stats (from Cadvisor) for a non-Kubernetes container. -func (kl *Kubelet) GetRawContainerInfo(containerName string, req *cadvisorapi.ContainerInfoRequest, subcontainers bool) (map[string]*cadvisorapi.ContainerInfo, error) { - if subcontainers { - return kl.cadvisor.SubcontainerInfo(containerName, req) - } - - containerInfo, err := kl.cadvisor.ContainerInfo(containerName, req) - if err != nil { - return nil, err - } - return map[string]*cadvisorapi.ContainerInfo{ - containerInfo.Name: containerInfo, - }, nil -} - -// GetVersionInfo returns information about the version of cAdvisor in use. -func (kl *Kubelet) GetVersionInfo() (*cadvisorapi.VersionInfo, error) { - return kl.cadvisor.VersionInfo() -} - -// GetCachedMachineInfo assumes that the machine info can't change without a reboot -func (kl *Kubelet) GetCachedMachineInfo() (*cadvisorapi.MachineInfo, error) { - if kl.machineInfo == nil { - info, err := kl.cadvisor.MachineInfo() - if err != nil { - return nil, err - } - kl.machineInfo = info - } - return kl.machineInfo, nil -} - -// GetCachedRootFsInfo assumes that the rootfs info can't change without a reboot -func (kl *Kubelet) GetCachedRootFsInfo() (cadvisorapiv2.FsInfo, error) { - if kl.rootfsInfo == nil { - info, err := kl.cadvisor.RootFsInfo() - if err != nil { - return cadvisorapiv2.FsInfo{}, err - } - kl.rootfsInfo = &info - } - return *kl.rootfsInfo, nil -} diff --git a/pkg/kubelet/kubelet_cadvisor_test.go b/pkg/kubelet/kubelet_cadvisor_test.go deleted file mode 100644 index a107dc1df0904..0000000000000 --- a/pkg/kubelet/kubelet_cadvisor_test.go +++ /dev/null @@ -1,252 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package kubelet - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - cadvisorapi "github.com/google/cadvisor/info/v1" - "k8s.io/apimachinery/pkg/types" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - kubecontainertest "k8s.io/kubernetes/pkg/kubelet/container/testing" -) - -func TestGetContainerInfo(t *testing.T) { - cadvisorAPIFailure := fmt.Errorf("cAdvisor failure") - runtimeError := fmt.Errorf("List containers error") - tests := []struct { - name string - containerID string - containerPath string - cadvisorContainerInfo cadvisorapi.ContainerInfo - runtimeError error - podList []*kubecontainertest.FakePod - requestedPodFullName string - requestedPodUID types.UID - requestedContainerName string - expectDockerContainerCall bool - mockError error - expectedError error - expectStats bool - }{ - { - name: "get container info", - containerID: "ab2cdf", - containerPath: "/docker/ab2cdf", - cadvisorContainerInfo: cadvisorapi.ContainerInfo{ - ContainerReference: cadvisorapi.ContainerReference{ - Name: "/docker/ab2cdf", - }, - }, - runtimeError: nil, - podList: []*kubecontainertest.FakePod{ - { - Pod: &kubecontainer.Pod{ - ID: "12345678", - Name: "qux", - Namespace: "ns", - Containers: []*kubecontainer.Container{ - { - Name: "foo", - ID: kubecontainer.ContainerID{Type: "test", ID: "ab2cdf"}, - }, - }, - }, - }, - }, - requestedPodFullName: "qux_ns", - requestedPodUID: "", - requestedContainerName: "foo", - expectDockerContainerCall: true, - mockError: nil, - expectedError: nil, - expectStats: true, - }, - { - name: "get container info when cadvisor failed", - containerID: "ab2cdf", - containerPath: "/docker/ab2cdf", - cadvisorContainerInfo: cadvisorapi.ContainerInfo{}, - runtimeError: nil, - podList: []*kubecontainertest.FakePod{ - { - Pod: &kubecontainer.Pod{ - ID: "uuid", - Name: "qux", - Namespace: "ns", - Containers: []*kubecontainer.Container{ - { - Name: "foo", - ID: kubecontainer.ContainerID{Type: "test", ID: "ab2cdf"}, - }, - }, - }, - }, - }, - requestedPodFullName: "qux_ns", - requestedPodUID: "uuid", - requestedContainerName: "foo", - expectDockerContainerCall: true, - mockError: cadvisorAPIFailure, - expectedError: cadvisorAPIFailure, - expectStats: false, - }, - { - name: "get container info on non-existent container", - containerID: "", - containerPath: "", - cadvisorContainerInfo: cadvisorapi.ContainerInfo{}, - runtimeError: nil, - podList: []*kubecontainertest.FakePod{}, - requestedPodFullName: "qux", - requestedPodUID: "", - requestedContainerName: "foo", - expectDockerContainerCall: false, - mockError: nil, - expectedError: kubecontainer.ErrContainerNotFound, - expectStats: false, - }, - { - name: "get container info when container runtime failed", - containerID: "", - containerPath: "", - cadvisorContainerInfo: cadvisorapi.ContainerInfo{}, - runtimeError: runtimeError, - podList: []*kubecontainertest.FakePod{}, - requestedPodFullName: "qux", - requestedPodUID: "", - requestedContainerName: "foo", - mockError: nil, - expectedError: runtimeError, - expectStats: false, - }, - { - name: "get container info with no containers", - containerID: "", - containerPath: "", - cadvisorContainerInfo: cadvisorapi.ContainerInfo{}, - runtimeError: nil, - podList: []*kubecontainertest.FakePod{}, - requestedPodFullName: "qux_ns", - requestedPodUID: "", - requestedContainerName: "foo", - mockError: nil, - expectedError: kubecontainer.ErrContainerNotFound, - expectStats: false, - }, - { - name: "get container info with no matching containers", - containerID: "", - containerPath: "", - cadvisorContainerInfo: cadvisorapi.ContainerInfo{}, - runtimeError: nil, - podList: []*kubecontainertest.FakePod{ - { - Pod: &kubecontainer.Pod{ - ID: "12345678", - Name: "qux", - Namespace: "ns", - Containers: []*kubecontainer.Container{ - { - Name: "bar", - ID: kubecontainer.ContainerID{Type: "test", ID: "fakeID"}, - }, - }, - }, - }, - }, - requestedPodFullName: "qux_ns", - requestedPodUID: "", - requestedContainerName: "foo", - mockError: nil, - expectedError: kubecontainer.ErrContainerNotFound, - expectStats: false, - }, - } - - for _, tc := range tests { - testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnablec */) - defer testKubelet.Cleanup() - fakeRuntime := testKubelet.fakeRuntime - kubelet := testKubelet.kubelet - cadvisorReq := &cadvisorapi.ContainerInfoRequest{} - mockCadvisor := testKubelet.fakeCadvisor - if tc.expectDockerContainerCall { - mockCadvisor.On("DockerContainer", tc.containerID, cadvisorReq).Return(tc.cadvisorContainerInfo, tc.mockError) - } - fakeRuntime.Err = tc.runtimeError - fakeRuntime.PodList = tc.podList - - stats, err := kubelet.GetContainerInfo(tc.requestedPodFullName, tc.requestedPodUID, tc.requestedContainerName, cadvisorReq) - assert.Equal(t, tc.expectedError, err) - - if tc.expectStats { - require.NotNil(t, stats) - } - mockCadvisor.AssertExpectations(t) - } -} - -func TestGetRawContainerInfoRoot(t *testing.T) { - containerPath := "/" - containerInfo := &cadvisorapi.ContainerInfo{ - ContainerReference: cadvisorapi.ContainerReference{ - Name: containerPath, - }, - } - testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) - defer testKubelet.Cleanup() - kubelet := testKubelet.kubelet - mockCadvisor := testKubelet.fakeCadvisor - cadvisorReq := &cadvisorapi.ContainerInfoRequest{} - mockCadvisor.On("ContainerInfo", containerPath, cadvisorReq).Return(containerInfo, nil) - - _, err := kubelet.GetRawContainerInfo(containerPath, cadvisorReq, false) - assert.NoError(t, err) - mockCadvisor.AssertExpectations(t) -} - -func TestGetRawContainerInfoSubcontainers(t *testing.T) { - containerPath := "/kubelet" - containerInfo := map[string]*cadvisorapi.ContainerInfo{ - containerPath: { - ContainerReference: cadvisorapi.ContainerReference{ - Name: containerPath, - }, - }, - "/kubelet/sub": { - ContainerReference: cadvisorapi.ContainerReference{ - Name: "/kubelet/sub", - }, - }, - } - testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) - defer testKubelet.Cleanup() - kubelet := testKubelet.kubelet - mockCadvisor := testKubelet.fakeCadvisor - cadvisorReq := &cadvisorapi.ContainerInfoRequest{} - mockCadvisor.On("SubcontainerInfo", containerPath, cadvisorReq).Return(containerInfo, nil) - - result, err := kubelet.GetRawContainerInfo(containerPath, cadvisorReq, true) - assert.NoError(t, err) - assert.Len(t, result, 2) - mockCadvisor.AssertExpectations(t) -} diff --git a/pkg/kubelet/kubelet_getters.go b/pkg/kubelet/kubelet_getters.go index dd55bd10df2e9..7737229507ee1 100644 --- a/pkg/kubelet/kubelet_getters.go +++ b/pkg/kubelet/kubelet_getters.go @@ -23,6 +23,8 @@ import ( "path/filepath" "github.com/golang/glog" + cadvisorapiv1 "github.com/google/cadvisor/info/v1" + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/cmd/kubelet/app/options" @@ -239,3 +241,20 @@ func (kl *Kubelet) getPodVolumePathListFromDisk(podUID types.UID) ([]string, err } return volumes, nil } + +// GetVersionInfo returns information about the version of cAdvisor in use. +func (kl *Kubelet) GetVersionInfo() (*cadvisorapiv1.VersionInfo, error) { + return kl.cadvisor.VersionInfo() +} + +// GetCachedMachineInfo assumes that the machine info can't change without a reboot +func (kl *Kubelet) GetCachedMachineInfo() (*cadvisorapiv1.MachineInfo, error) { + if kl.machineInfo == nil { + info, err := kl.cadvisor.MachineInfo() + if err != nil { + return nil, err + } + kl.machineInfo = info + } + return kl.machineInfo, nil +} diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index b5a1ba0924b3c..4580b5269d273 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -60,7 +60,8 @@ import ( proberesults "k8s.io/kubernetes/pkg/kubelet/prober/results" probetest "k8s.io/kubernetes/pkg/kubelet/prober/testing" "k8s.io/kubernetes/pkg/kubelet/secret" - "k8s.io/kubernetes/pkg/kubelet/server/stats" + serverstats "k8s.io/kubernetes/pkg/kubelet/server/stats" + "k8s.io/kubernetes/pkg/kubelet/stats" "k8s.io/kubernetes/pkg/kubelet/status" statustest "k8s.io/kubernetes/pkg/kubelet/status/testing" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" @@ -256,7 +257,7 @@ func newTestKubeletWithImageList( // TODO: Factor out "StatsProvider" from Kubelet so we don't have a cyclic dependency volumeStatsAggPeriod := time.Second * 10 - kubelet.resourceAnalyzer = stats.NewResourceAnalyzer(kubelet, volumeStatsAggPeriod, kubelet.containerRuntime) + kubelet.resourceAnalyzer = serverstats.NewResourceAnalyzer(kubelet, volumeStatsAggPeriod) nodeRef := &v1.ObjectReference{ Kind: "Node", Name: string(kubelet.nodeName), @@ -298,6 +299,12 @@ func newTestKubeletWithImageList( kubelet.AddPodSyncLoopHandler(activeDeadlineHandler) kubelet.AddPodSyncHandler(activeDeadlineHandler) kubelet.gpuManager = gpu.NewGPUManagerStub() + kubelet.StatsProvider = stats.NewCadvisorStatsProvider( + kubelet.cadvisor, + kubelet.resourceAnalyzer, + kubelet.podManager, + kubelet.runtimeCache, + fakeRuntime) return &TestKubelet{kubelet, fakeRuntime, mockCadvisor, fakeKubeClient, fakeMirrorClient, fakeClock, nil, plug} } diff --git a/pkg/kubelet/pod/testing/BUILD b/pkg/kubelet/pod/testing/BUILD index 0120951709e38..0dd6bf9819d2d 100644 --- a/pkg/kubelet/pod/testing/BUILD +++ b/pkg/kubelet/pod/testing/BUILD @@ -7,10 +7,16 @@ load( go_library( name = "go_default_library", - srcs = ["fake_mirror_client.go"], + srcs = [ + "fake_mirror_client.go", + "mock_manager.go", + ], deps = [ "//pkg/kubelet/container:go_default_library", + "//pkg/kubelet/types:go_default_library", + "//vendor/github.com/stretchr/testify/mock:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/pkg/kubelet/pod/testing/mock_manager.go b/pkg/kubelet/pod/testing/mock_manager.go new file mode 100644 index 0000000000000..f15845b79ffd7 --- /dev/null +++ b/pkg/kubelet/pod/testing/mock_manager.go @@ -0,0 +1,291 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by mockery v1.0.0 +package testing + +import kubelettypes "k8s.io/kubernetes/pkg/kubelet/types" +import mock "github.com/stretchr/testify/mock" + +import types "k8s.io/apimachinery/pkg/types" +import v1 "k8s.io/api/core/v1" + +// MockManager is an autogenerated mock type for the Manager type +type MockManager struct { + mock.Mock +} + +// AddPod provides a mock function with given fields: _a0 +func (_m *MockManager) AddPod(_a0 *v1.Pod) { + _m.Called(_a0) +} + +// CreateMirrorPod provides a mock function with given fields: _a0 +func (_m *MockManager) CreateMirrorPod(_a0 *v1.Pod) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(*v1.Pod) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DeleteMirrorPod provides a mock function with given fields: podFullName +func (_m *MockManager) DeleteMirrorPod(podFullName string) error { + ret := _m.Called(podFullName) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(podFullName) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DeleteOrphanedMirrorPods provides a mock function with given fields: +func (_m *MockManager) DeleteOrphanedMirrorPods() { + _m.Called() +} + +// DeletePod provides a mock function with given fields: _a0 +func (_m *MockManager) DeletePod(_a0 *v1.Pod) { + _m.Called(_a0) +} + +// GetMirrorPodByPod provides a mock function with given fields: _a0 +func (_m *MockManager) GetMirrorPodByPod(_a0 *v1.Pod) (*v1.Pod, bool) { + ret := _m.Called(_a0) + + var r0 *v1.Pod + if rf, ok := ret.Get(0).(func(*v1.Pod) *v1.Pod); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Pod) + } + } + + var r1 bool + if rf, ok := ret.Get(1).(func(*v1.Pod) bool); ok { + r1 = rf(_a0) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// GetPodByFullName provides a mock function with given fields: podFullName +func (_m *MockManager) GetPodByFullName(podFullName string) (*v1.Pod, bool) { + ret := _m.Called(podFullName) + + var r0 *v1.Pod + if rf, ok := ret.Get(0).(func(string) *v1.Pod); ok { + r0 = rf(podFullName) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Pod) + } + } + + var r1 bool + if rf, ok := ret.Get(1).(func(string) bool); ok { + r1 = rf(podFullName) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// GetPodByMirrorPod provides a mock function with given fields: _a0 +func (_m *MockManager) GetPodByMirrorPod(_a0 *v1.Pod) (*v1.Pod, bool) { + ret := _m.Called(_a0) + + var r0 *v1.Pod + if rf, ok := ret.Get(0).(func(*v1.Pod) *v1.Pod); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Pod) + } + } + + var r1 bool + if rf, ok := ret.Get(1).(func(*v1.Pod) bool); ok { + r1 = rf(_a0) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// GetPodByName provides a mock function with given fields: namespace, name +func (_m *MockManager) GetPodByName(namespace string, name string) (*v1.Pod, bool) { + ret := _m.Called(namespace, name) + + var r0 *v1.Pod + if rf, ok := ret.Get(0).(func(string, string) *v1.Pod); ok { + r0 = rf(namespace, name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Pod) + } + } + + var r1 bool + if rf, ok := ret.Get(1).(func(string, string) bool); ok { + r1 = rf(namespace, name) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// GetPodByUID provides a mock function with given fields: _a0 +func (_m *MockManager) GetPodByUID(_a0 types.UID) (*v1.Pod, bool) { + ret := _m.Called(_a0) + + var r0 *v1.Pod + if rf, ok := ret.Get(0).(func(types.UID) *v1.Pod); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Pod) + } + } + + var r1 bool + if rf, ok := ret.Get(1).(func(types.UID) bool); ok { + r1 = rf(_a0) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// GetPods provides a mock function with given fields: +func (_m *MockManager) GetPods() []*v1.Pod { + ret := _m.Called() + + var r0 []*v1.Pod + if rf, ok := ret.Get(0).(func() []*v1.Pod); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*v1.Pod) + } + } + + return r0 +} + +// GetPodsAndMirrorPods provides a mock function with given fields: +func (_m *MockManager) GetPodsAndMirrorPods() ([]*v1.Pod, []*v1.Pod) { + ret := _m.Called() + + var r0 []*v1.Pod + if rf, ok := ret.Get(0).(func() []*v1.Pod); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*v1.Pod) + } + } + + var r1 []*v1.Pod + if rf, ok := ret.Get(1).(func() []*v1.Pod); ok { + r1 = rf() + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]*v1.Pod) + } + } + + return r0, r1 +} + +// GetUIDTranslations provides a mock function with given fields: +func (_m *MockManager) GetUIDTranslations() (map[kubelettypes.ResolvedPodUID]kubelettypes.MirrorPodUID, map[kubelettypes.MirrorPodUID]kubelettypes.ResolvedPodUID) { + ret := _m.Called() + + var r0 map[kubelettypes.ResolvedPodUID]kubelettypes.MirrorPodUID + if rf, ok := ret.Get(0).(func() map[kubelettypes.ResolvedPodUID]kubelettypes.MirrorPodUID); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[kubelettypes.ResolvedPodUID]kubelettypes.MirrorPodUID) + } + } + + var r1 map[kubelettypes.MirrorPodUID]kubelettypes.ResolvedPodUID + if rf, ok := ret.Get(1).(func() map[kubelettypes.MirrorPodUID]kubelettypes.ResolvedPodUID); ok { + r1 = rf() + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(map[kubelettypes.MirrorPodUID]kubelettypes.ResolvedPodUID) + } + } + + return r0, r1 +} + +// IsMirrorPodOf provides a mock function with given fields: mirrorPod, _a1 +func (_m *MockManager) IsMirrorPodOf(mirrorPod *v1.Pod, _a1 *v1.Pod) bool { + ret := _m.Called(mirrorPod, _a1) + + var r0 bool + if rf, ok := ret.Get(0).(func(*v1.Pod, *v1.Pod) bool); ok { + r0 = rf(mirrorPod, _a1) + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// SetPods provides a mock function with given fields: pods +func (_m *MockManager) SetPods(pods []*v1.Pod) { + _m.Called(pods) +} + +// TranslatePodUID provides a mock function with given fields: uid +func (_m *MockManager) TranslatePodUID(uid types.UID) kubelettypes.ResolvedPodUID { + ret := _m.Called(uid) + + var r0 kubelettypes.ResolvedPodUID + if rf, ok := ret.Get(0).(func(types.UID) kubelettypes.ResolvedPodUID); ok { + r0 = rf(uid) + } else { + r0 = ret.Get(0).(kubelettypes.ResolvedPodUID) + } + + return r0 +} + +// UpdatePod provides a mock function with given fields: _a0 +func (_m *MockManager) UpdatePod(_a0 *v1.Pod) { + _m.Called(_a0) +} diff --git a/pkg/kubelet/runonce_test.go b/pkg/kubelet/runonce_test.go index 7449c271cc3dc..b9b95fccf27ce 100644 --- a/pkg/kubelet/runonce_test.go +++ b/pkg/kubelet/runonce_test.go @@ -113,7 +113,7 @@ func TestRunOnce(t *testing.T) { kb.networkPlugin, _ = network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil), kubeletconfig.HairpinNone, "", network.UseDefaultMTU) // TODO: Factor out "StatsProvider" from Kubelet so we don't have a cyclic dependency volumeStatsAggPeriod := time.Second * 10 - kb.resourceAnalyzer = stats.NewResourceAnalyzer(kb, volumeStatsAggPeriod, kb.containerRuntime) + kb.resourceAnalyzer = stats.NewResourceAnalyzer(kb, volumeStatsAggPeriod) nodeRef := &v1.ObjectReference{ Kind: "Node", Name: string(kb.nodeName), diff --git a/pkg/kubelet/server/BUILD b/pkg/kubelet/server/BUILD index cfc4800fa0452..61c57935567e6 100644 --- a/pkg/kubelet/server/BUILD +++ b/pkg/kubelet/server/BUILD @@ -16,7 +16,6 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/validation:go_default_library", - "//pkg/kubelet/cm:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/server/portforward:go_default_library", "//pkg/kubelet/server/remotecommand:go_default_library", @@ -25,11 +24,9 @@ go_library( "//pkg/kubelet/types:go_default_library", "//pkg/util/configz:go_default_library", "//pkg/util/limitwriter:go_default_library", - "//pkg/volume:go_default_library", "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", "//vendor/github.com/google/cadvisor/metrics:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus/promhttp:go_default_library", @@ -61,6 +58,7 @@ go_test( deps = [ "//pkg/api:go_default_library", "//pkg/api/install:go_default_library", + "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", "//pkg/kubelet/cm:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/container/testing:go_default_library", @@ -69,7 +67,6 @@ go_test( "//pkg/kubelet/server/stats:go_default_library", "//pkg/volume:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", "//vendor/golang.org/x/net/websocket:go_default_library", diff --git a/pkg/kubelet/server/server.go b/pkg/kubelet/server/server.go index 74a5036828a59..d4eb74bfed0e4 100644 --- a/pkg/kubelet/server/server.go +++ b/pkg/kubelet/server/server.go @@ -33,7 +33,6 @@ import ( restful "github.com/emicklei/go-restful" "github.com/golang/glog" cadvisorapi "github.com/google/cadvisor/info/v1" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" "github.com/google/cadvisor/metrics" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" @@ -53,7 +52,6 @@ import ( "k8s.io/client-go/tools/remotecommand" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1/validation" - "k8s.io/kubernetes/pkg/kubelet/cm" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/server/portforward" remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" @@ -62,7 +60,6 @@ import ( kubelettypes "k8s.io/kubernetes/pkg/kubelet/types" "k8s.io/kubernetes/pkg/util/configz" "k8s.io/kubernetes/pkg/util/limitwriter" - "k8s.io/kubernetes/pkg/volume" ) const ( @@ -169,14 +166,10 @@ type AuthInterface interface { // HostInterface contains all the kubelet methods required by the server. // For testability. type HostInterface interface { - GetContainerInfo(podFullName string, uid types.UID, containerName string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) - GetContainerInfoV2(name string, options cadvisorapiv2.RequestOptions) (map[string]cadvisorapiv2.ContainerInfo, error) - GetRawContainerInfo(containerName string, req *cadvisorapi.ContainerInfoRequest, subcontainers bool) (map[string]*cadvisorapi.ContainerInfo, error) + stats.StatsProvider GetVersionInfo() (*cadvisorapi.VersionInfo, error) GetCachedMachineInfo() (*cadvisorapi.MachineInfo, error) - GetPods() []*v1.Pod GetRunningPods() ([]*v1.Pod, error) - GetPodByName(namespace, name string) (*v1.Pod, bool) RunInContainer(name string, uid types.UID, container string, cmd []string) ([]byte, error) ExecInContainer(name string, uid types.UID, container string, cmd []string, in io.Reader, out, err io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize, timeout time.Duration) error AttachContainer(name string, uid types.UID, container string, in io.Reader, out, err io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize) error @@ -186,12 +179,7 @@ type HostInterface interface { StreamingConnectionIdleTimeout() time.Duration ResyncInterval() time.Duration GetHostname() string - GetNode() (*v1.Node, error) - GetNodeConfig() cm.NodeConfig LatestLoopEntryTime() time.Time - ImagesFsInfo() (cadvisorapiv2.FsInfo, error) - RootFsInfo() (cadvisorapiv2.FsInfo, error) - ListVolumesForPod(podUID types.UID) (map[string]volume.Volume, bool) GetExec(podFullName string, podUID types.UID, containerName string, cmd []string, streamOpts remotecommandserver.Options) (*url.URL, error) GetAttach(podFullName string, podUID types.UID, containerName string, streamOpts remotecommandserver.Options) (*url.URL, error) GetPortForward(podName, podNamespace string, podUID types.UID, portForwardOpts portforward.V4Options) (*url.URL, error) diff --git a/pkg/kubelet/server/server_test.go b/pkg/kubelet/server/server_test.go index b3b5ce9b46e44..85e62b2aae1d1 100644 --- a/pkg/kubelet/server/server_test.go +++ b/pkg/kubelet/server/server_test.go @@ -35,7 +35,6 @@ import ( "time" cadvisorapi "github.com/google/cadvisor/info/v1" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "k8s.io/api/core/v1" @@ -49,6 +48,7 @@ import ( "k8s.io/client-go/tools/remotecommand" utiltesting "k8s.io/client-go/util/testing" "k8s.io/kubernetes/pkg/api" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" // Do some initialization to decode the query parameters correctly. _ "k8s.io/kubernetes/pkg/api/install" "k8s.io/kubernetes/pkg/kubelet/cm" @@ -166,18 +166,6 @@ func (fk *fakeKubelet) StreamingConnectionIdleTimeout() time.Duration { } // Unused functions -func (_ *fakeKubelet) GetContainerInfoV2(_ string, _ cadvisorapiv2.RequestOptions) (map[string]cadvisorapiv2.ContainerInfo, error) { - return nil, nil -} - -func (_ *fakeKubelet) ImagesFsInfo() (cadvisorapiv2.FsInfo, error) { - return cadvisorapiv2.FsInfo{}, fmt.Errorf("Unsupported Operation ImagesFsInfo") -} - -func (_ *fakeKubelet) RootFsInfo() (cadvisorapiv2.FsInfo, error) { - return cadvisorapiv2.FsInfo{}, fmt.Errorf("Unsupport Operation RootFsInfo") -} - func (_ *fakeKubelet) GetNode() (*v1.Node, error) { return nil, nil } func (_ *fakeKubelet) GetNodeConfig() cm.NodeConfig { return cm.NodeConfig{} } @@ -185,6 +173,13 @@ func (fk *fakeKubelet) ListVolumesForPod(podUID types.UID) (map[string]volume.Vo return map[string]volume.Volume{}, true } +func (_ *fakeKubelet) RootFsStats() (*statsapi.FsStats, error) { return nil, nil } +func (_ *fakeKubelet) ListPodStats() ([]statsapi.PodStats, error) { return nil, nil } +func (_ *fakeKubelet) ImageFsStats() (*statsapi.FsStats, error) { return nil, nil } +func (_ *fakeKubelet) GetCgroupStats(cgroupName string) (*statsapi.ContainerStats, *statsapi.NetworkStats, error) { + return nil, nil, nil +} + type fakeAuth struct { authenticateFunc func(*http.Request) (user.Info, bool, error) attributesFunc func(user.Info, *http.Request) authorizer.Attributes @@ -242,7 +237,7 @@ func newServerTest() *serverTestFramework { } server := NewServer( fw.fakeKubelet, - stats.NewResourceAnalyzer(fw.fakeKubelet, time.Minute, &kubecontainertesting.FakeRuntime{}), + stats.NewResourceAnalyzer(fw.fakeKubelet, time.Minute), fw.fakeAuth, true, false, diff --git a/pkg/kubelet/server/stats/BUILD b/pkg/kubelet/server/stats/BUILD index 8c026960d4967..a1e299d9eb0f9 100644 --- a/pkg/kubelet/server/stats/BUILD +++ b/pkg/kubelet/server/stats/BUILD @@ -1,10 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", @@ -16,19 +10,16 @@ go_library( "summary.go", "volume_stat_calculator.go", ], + visibility = ["//visibility:public"], deps = [ "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", "//pkg/kubelet/cm:go_default_library", "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/leaky:go_default_library", - "//pkg/kubelet/network:go_default_library", - "//pkg/kubelet/types:go_default_library", "//pkg/kubelet/util/format:go_default_library", "//pkg/volume:go_default_library", "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", @@ -38,25 +29,16 @@ go_library( go_test( name = "go_default_test", - srcs = [ - "mocks_test.go", - "summary_test.go", - ], + srcs = ["summary_test.go"], library = ":go_default_library", deps = [ "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/leaky:go_default_library", - "//pkg/volume:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", + "//pkg/kubelet/server/stats/testing:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", ], ) @@ -69,6 +51,10 @@ filegroup( filegroup( name = "all-srcs", - srcs = [":package-srcs"], + srcs = [ + ":package-srcs", + "//pkg/kubelet/server/stats/testing:all-srcs", + ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/pkg/kubelet/server/stats/handler.go b/pkg/kubelet/server/stats/handler.go index f64095b20fd9f..969b25f3de127 100644 --- a/pkg/kubelet/server/stats/handler.go +++ b/pkg/kubelet/server/stats/handler.go @@ -24,14 +24,14 @@ import ( "path" "time" + restful "github.com/emicklei/go-restful" "github.com/golang/glog" cadvisorapi "github.com/google/cadvisor/info/v1" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" - "github.com/emicklei/go-restful" "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" "k8s.io/kubernetes/pkg/kubelet/cm" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/volume" @@ -39,15 +39,44 @@ import ( // Host methods required by stats handlers. type StatsProvider interface { + // The following stats are provided by either CRI or cAdvisor. + // + // ListPodStats returns the stats of all the containers managed by pods. + ListPodStats() ([]statsapi.PodStats, error) + // ImageFsStats returns the stats of the image filesystem. + ImageFsStats() (*statsapi.FsStats, error) + + // The following stats are provided by cAdvisor. + // + // GetCgroupStats returns the stats and the networking usage of the cgroup + // with the specified cgroupName. + GetCgroupStats(cgroupName string) (*statsapi.ContainerStats, *statsapi.NetworkStats, error) + // RootFsStats returns the stats of the node root filesystem. + RootFsStats() (*statsapi.FsStats, error) + + // The following stats are provided by cAdvisor for legacy usage. + // + // GetContainerInfo returns the information of the container with the + // containerName managed by the pod with the uid. GetContainerInfo(podFullName string, uid types.UID, containerName string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) - GetContainerInfoV2(name string, options cadvisorapiv2.RequestOptions) (map[string]cadvisorapiv2.ContainerInfo, error) + // GetRawContainerInfo returns the information of the container with the + // containerName. If subcontainers is true, this function will return the + // information of all the sub-containers as well. GetRawContainerInfo(containerName string, req *cadvisorapi.ContainerInfoRequest, subcontainers bool) (map[string]*cadvisorapi.ContainerInfo, error) + + // The following information is provided by Kubelet. + // + // GetPodByName returns the spec of the pod with the name in the specified + // namespace. GetPodByName(namespace, name string) (*v1.Pod, bool) + // GetNode returns the spec of the local node. GetNode() (*v1.Node, error) + // GetNodeConfig returns the configuration of the local node. GetNodeConfig() cm.NodeConfig - ImagesFsInfo() (cadvisorapiv2.FsInfo, error) - RootFsInfo() (cadvisorapiv2.FsInfo, error) + // ListVolumesForPod returns the stats of the volume used by the pod with + // the podUID. ListVolumesForPod(podUID types.UID) (map[string]volume.Volume, bool) + // GetPods returns the specs of all the pods running on this node. GetPods() []*v1.Pod } diff --git a/pkg/kubelet/server/stats/mocks_test.go b/pkg/kubelet/server/stats/mocks_test.go deleted file mode 100644 index 5b044e9195e68..0000000000000 --- a/pkg/kubelet/server/stats/mocks_test.go +++ /dev/null @@ -1,244 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package stats - -import ( - cadvisorapi "github.com/google/cadvisor/info/v1" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" - "github.com/stretchr/testify/mock" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/kubernetes/pkg/kubelet/cm" - "k8s.io/kubernetes/pkg/volume" -) - -// DO NOT EDIT -// GENERATED BY mockery - -type MockStatsProvider struct { - mock.Mock -} - -// GetContainerInfo provides a mock function with given fields: podFullName, uid, containerName, req -func (_m *MockStatsProvider) GetContainerInfo(podFullName string, uid types.UID, containerName string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) { - ret := _m.Called(podFullName, uid, containerName, req) - - var r0 *cadvisorapi.ContainerInfo - if rf, ok := ret.Get(0).(func(string, types.UID, string, *cadvisorapi.ContainerInfoRequest) *cadvisorapi.ContainerInfo); ok { - r0 = rf(podFullName, uid, containerName, req) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*cadvisorapi.ContainerInfo) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, types.UID, string, *cadvisorapi.ContainerInfoRequest) error); ok { - r1 = rf(podFullName, uid, containerName, req) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetContainerInfoV2 provides a mock function with given fields: name, options -func (_m *MockStatsProvider) GetContainerInfoV2(name string, options cadvisorapiv2.RequestOptions) (map[string]cadvisorapiv2.ContainerInfo, error) { - ret := _m.Called(name, options) - - var r0 map[string]cadvisorapiv2.ContainerInfo - if rf, ok := ret.Get(0).(func(string, cadvisorapiv2.RequestOptions) map[string]cadvisorapiv2.ContainerInfo); ok { - r0 = rf(name, options) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(map[string]cadvisorapiv2.ContainerInfo) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, cadvisorapiv2.RequestOptions) error); ok { - r1 = rf(name, options) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetRawContainerInfo provides a mock function with given fields: containerName, req, subcontainers -func (_m *MockStatsProvider) GetRawContainerInfo(containerName string, req *cadvisorapi.ContainerInfoRequest, subcontainers bool) (map[string]*cadvisorapi.ContainerInfo, error) { - ret := _m.Called(containerName, req, subcontainers) - - var r0 map[string]*cadvisorapi.ContainerInfo - if rf, ok := ret.Get(0).(func(string, *cadvisorapi.ContainerInfoRequest, bool) map[string]*cadvisorapi.ContainerInfo); ok { - r0 = rf(containerName, req, subcontainers) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(map[string]*cadvisorapi.ContainerInfo) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(string, *cadvisorapi.ContainerInfoRequest, bool) error); ok { - r1 = rf(containerName, req, subcontainers) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetPodByName provides a mock function with given fields: namespace, name -func (_m *MockStatsProvider) GetPodByName(namespace string, name string) (*v1.Pod, bool) { - ret := _m.Called(namespace, name) - - var r0 *v1.Pod - if rf, ok := ret.Get(0).(func(string, string) *v1.Pod); ok { - r0 = rf(namespace, name) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Pod) - } - } - - var r1 bool - if rf, ok := ret.Get(1).(func(string, string) bool); ok { - r1 = rf(namespace, name) - } else { - r1 = ret.Get(1).(bool) - } - - return r0, r1 -} - -// GetNode provides a mock function with given fields: -func (_m *MockStatsProvider) GetNode() (*v1.Node, error) { - ret := _m.Called() - - var r0 *v1.Node - if rf, ok := ret.Get(0).(func() *v1.Node); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Node) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetNodeConfig provides a mock function with given fields: -func (_m *MockStatsProvider) GetNodeConfig() cm.NodeConfig { - ret := _m.Called() - - var r0 cm.NodeConfig - if rf, ok := ret.Get(0).(func() cm.NodeConfig); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(cm.NodeConfig) - } - - return r0 -} - -// ImagesFsInfo provides a mock function with given fields: -func (_m *MockStatsProvider) ImagesFsInfo() (cadvisorapiv2.FsInfo, error) { - ret := _m.Called() - - var r0 cadvisorapiv2.FsInfo - if rf, ok := ret.Get(0).(func() cadvisorapiv2.FsInfo); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(cadvisorapiv2.FsInfo) - } - - var r1 error - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// RootFsInfo provides a mock function with given fields: -func (_m *MockStatsProvider) RootFsInfo() (cadvisorapiv2.FsInfo, error) { - ret := _m.Called() - - var r0 cadvisorapiv2.FsInfo - if rf, ok := ret.Get(0).(func() cadvisorapiv2.FsInfo); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(cadvisorapiv2.FsInfo) - } - - var r1 error - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// ListVolumesForPod provides a mock function with given fields: podUID -func (_m *MockStatsProvider) ListVolumesForPod(podUID types.UID) (map[string]volume.Volume, bool) { - ret := _m.Called(podUID) - - var r0 map[string]volume.Volume - if rf, ok := ret.Get(0).(func(types.UID) map[string]volume.Volume); ok { - r0 = rf(podUID) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(map[string]volume.Volume) - } - } - - var r1 bool - if rf, ok := ret.Get(1).(func(types.UID) bool); ok { - r1 = rf(podUID) - } else { - r1 = ret.Get(1).(bool) - } - - return r0, r1 -} - -// GetPods provides a mock function with given fields: -func (_m *MockStatsProvider) GetPods() []*v1.Pod { - ret := _m.Called() - - var r0 []*v1.Pod - if rf, ok := ret.Get(0).(func() []*v1.Pod); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*v1.Pod) - } - } - - return r0 -} diff --git a/pkg/kubelet/server/stats/resource_analyzer.go b/pkg/kubelet/server/stats/resource_analyzer.go index 670e7a751aca4..5def6ba714d88 100644 --- a/pkg/kubelet/server/stats/resource_analyzer.go +++ b/pkg/kubelet/server/stats/resource_analyzer.go @@ -18,8 +18,6 @@ package stats import ( "time" - - "k8s.io/kubernetes/pkg/kubelet/container" ) // ResourceAnalyzer provides statistics on node resource consumption @@ -39,9 +37,9 @@ type resourceAnalyzer struct { var _ ResourceAnalyzer = &resourceAnalyzer{} // NewResourceAnalyzer returns a new ResourceAnalyzer -func NewResourceAnalyzer(statsProvider StatsProvider, calVolumeFrequency time.Duration, runtime container.Runtime) ResourceAnalyzer { +func NewResourceAnalyzer(statsProvider StatsProvider, calVolumeFrequency time.Duration) ResourceAnalyzer { fsAnalyzer := newFsResourceAnalyzer(statsProvider, calVolumeFrequency) - summaryProvider := NewSummaryProvider(statsProvider, fsAnalyzer, runtime) + summaryProvider := NewSummaryProvider(statsProvider) return &resourceAnalyzer{fsAnalyzer, summaryProvider} } diff --git a/pkg/kubelet/server/stats/summary.go b/pkg/kubelet/server/stats/summary.go index c45e16054a95e..313d0d57ea562 100644 --- a/pkg/kubelet/server/stats/summary.go +++ b/pkg/kubelet/server/stats/summary.go @@ -18,513 +18,85 @@ package stats import ( "fmt" - "sort" - "strings" - "time" - - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - kubetypes "k8s.io/apimachinery/pkg/types" - stats "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/cm" - "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/leaky" - "k8s.io/kubernetes/pkg/kubelet/network" - "k8s.io/kubernetes/pkg/kubelet/types" "github.com/golang/glog" - cadvisorapiv1 "github.com/google/cadvisor/info/v1" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" ) type SummaryProvider interface { - // Get provides a new Summary using the latest results from cadvisor - Get() (*stats.Summary, error) + Get() (*statsapi.Summary, error) } +// summaryProviderImpl implements the SummaryProvider interface. type summaryProviderImpl struct { - provider StatsProvider - fsResourceAnalyzer fsResourceAnalyzerInterface - runtime container.Runtime + provider StatsProvider } var _ SummaryProvider = &summaryProviderImpl{} -// NewSummaryProvider returns a new SummaryProvider -func NewSummaryProvider(statsProvider StatsProvider, fsResourceAnalyzer fsResourceAnalyzerInterface, cruntime container.Runtime) SummaryProvider { - return &summaryProviderImpl{statsProvider, fsResourceAnalyzer, cruntime} +// NewSummaryProvider returns a SummaryProvider using the stats provided by the +// specified statsProvider. +func NewSummaryProvider(statsProvider StatsProvider) SummaryProvider { + return &summaryProviderImpl{statsProvider} } -// Get implements the SummaryProvider interface -// Query cadvisor for the latest resource metrics and build into a summary -func (sp *summaryProviderImpl) Get() (*stats.Summary, error) { - options := cadvisorapiv2.RequestOptions{ - IdType: cadvisorapiv2.TypeName, - Count: 2, // 2 samples are needed to compute "instantaneous" CPU - Recursive: true, - } - infos, err := sp.provider.GetContainerInfoV2("/", options) - if err != nil { - if _, ok := infos["/"]; ok { - // If the failure is partial, log it and return a best-effort response. - glog.Errorf("Partial failure issuing GetContainerInfoV2: %v", err) - } else { - return nil, fmt.Errorf("failed GetContainerInfoV2: %v", err) - } - } - - // TODO(tallclair): Consider returning a best-effort response if any of the following errors - // occur. +// Get provides a new Summary with the stats from Kubelet. +func (sp *summaryProviderImpl) Get() (*statsapi.Summary, error) { + // TODO(timstclair): Consider returning a best-effort response if any of + // the following errors occur. node, err := sp.provider.GetNode() if err != nil { - return nil, fmt.Errorf("failed GetNode: %v", err) + return nil, fmt.Errorf("failed to get node info: %v", err) } - nodeConfig := sp.provider.GetNodeConfig() - rootFsInfo, err := sp.provider.RootFsInfo() + rootStats, networkStats, err := sp.provider.GetCgroupStats("/") if err != nil { - return nil, fmt.Errorf("failed RootFsInfo: %v", err) + return nil, fmt.Errorf("failed to get root cgroup stats: %v", err) } - imageFsInfo, err := sp.provider.ImagesFsInfo() + rootFsStats, err := sp.provider.RootFsStats() if err != nil { - return nil, fmt.Errorf("failed DockerImagesFsInfo: %v", err) + return nil, fmt.Errorf("failed to get rootFs stats: %v", err) } - imageStats, err := sp.runtime.ImageStats() - if err != nil || imageStats == nil { - return nil, fmt.Errorf("failed ImageStats: %v", err) - } - sb := &summaryBuilder{sp.fsResourceAnalyzer, node, nodeConfig, rootFsInfo, imageFsInfo, *imageStats, infos} - return sb.build() -} - -// summaryBuilder aggregates the datastructures provided by cadvisor into a Summary result -type summaryBuilder struct { - fsResourceAnalyzer fsResourceAnalyzerInterface - node *v1.Node - nodeConfig cm.NodeConfig - rootFsInfo cadvisorapiv2.FsInfo - imageFsInfo cadvisorapiv2.FsInfo - imageStats container.ImageStats - infos map[string]cadvisorapiv2.ContainerInfo -} - -// build returns a Summary from aggregating the input data -func (sb *summaryBuilder) build() (*stats.Summary, error) { - rootInfo, found := sb.infos["/"] - if !found { - return nil, fmt.Errorf("Missing stats for root container") - } - - var nodeFsInodesUsed *uint64 - if sb.rootFsInfo.Inodes != nil && sb.rootFsInfo.InodesFree != nil { - nodeFsIU := *sb.rootFsInfo.Inodes - *sb.rootFsInfo.InodesFree - nodeFsInodesUsed = &nodeFsIU + imageFsStats, err := sp.provider.ImageFsStats() + if err != nil { + return nil, fmt.Errorf("failed to get imageFs stats: %v", err) } - - var imageFsInodesUsed *uint64 - if sb.imageFsInfo.Inodes != nil && sb.imageFsInfo.InodesFree != nil { - imageFsIU := *sb.imageFsInfo.Inodes - *sb.imageFsInfo.InodesFree - imageFsInodesUsed = &imageFsIU + podStats, err := sp.provider.ListPodStats() + if err != nil { + return nil, fmt.Errorf("failed to list pod stats: %v", err) } - rootStats := sb.containerInfoV2ToStats("", &rootInfo) - cStats, _ := latestContainerStats(&rootInfo) - nodeStats := stats.NodeStats{ - NodeName: sb.node.Name, - CPU: rootStats.CPU, - Memory: rootStats.Memory, - Network: sb.containerInfoV2ToNetworkStats("node:"+sb.node.Name, &rootInfo), - Fs: &stats.FsStats{ - Time: metav1.NewTime(cStats.Timestamp), - AvailableBytes: &sb.rootFsInfo.Available, - CapacityBytes: &sb.rootFsInfo.Capacity, - UsedBytes: &sb.rootFsInfo.Usage, - InodesFree: sb.rootFsInfo.InodesFree, - Inodes: sb.rootFsInfo.Inodes, - InodesUsed: nodeFsInodesUsed, - }, + nodeStats := statsapi.NodeStats{ + NodeName: node.Name, + CPU: rootStats.CPU, + Memory: rootStats.Memory, + Network: networkStats, StartTime: rootStats.StartTime, - Runtime: &stats.RuntimeStats{ - ImageFs: &stats.FsStats{ - Time: metav1.NewTime(cStats.Timestamp), - AvailableBytes: &sb.imageFsInfo.Available, - CapacityBytes: &sb.imageFsInfo.Capacity, - UsedBytes: &sb.imageStats.TotalStorageBytes, - InodesFree: sb.imageFsInfo.InodesFree, - Inodes: sb.imageFsInfo.Inodes, - InodesUsed: imageFsInodesUsed, - }, - }, + Fs: rootFsStats, + Runtime: &statsapi.RuntimeStats{ImageFs: imageFsStats}, } systemContainers := map[string]string{ - stats.SystemContainerKubelet: sb.nodeConfig.KubeletCgroupsName, - stats.SystemContainerRuntime: sb.nodeConfig.RuntimeCgroupsName, - stats.SystemContainerMisc: sb.nodeConfig.SystemCgroupsName, + statsapi.SystemContainerKubelet: nodeConfig.KubeletCgroupsName, + statsapi.SystemContainerRuntime: nodeConfig.RuntimeCgroupsName, + statsapi.SystemContainerMisc: nodeConfig.SystemCgroupsName, } for sys, name := range systemContainers { - if info, ok := sb.infos[name]; ok { - sysCont := sb.containerInfoV2ToStats(sys, &info) - // System containers don't have a filesystem associated with them. - sysCont.Rootfs = nil - sysCont.Logs = nil - nodeStats.SystemContainers = append(nodeStats.SystemContainers, sysCont) + s, _, err := sp.provider.GetCgroupStats(name) + if err != nil { + glog.Errorf("Failed to get system container stats for %q: %v", name, err) + continue } + // System containers don't have a filesystem associated with them. + s.Logs, s.Rootfs = nil, nil + s.Name = sys + nodeStats.SystemContainers = append(nodeStats.SystemContainers, *s) } - summary := stats.Summary{ + summary := statsapi.Summary{ Node: nodeStats, - Pods: sb.buildSummaryPods(), + Pods: podStats, } return &summary, nil } - -// containerInfoV2FsStats populates the container fs stats -func (sb *summaryBuilder) containerInfoV2FsStats( - info *cadvisorapiv2.ContainerInfo, - cs *stats.ContainerStats) { - - lcs, found := latestContainerStats(info) - if !found { - return - } - - // The container logs live on the node rootfs device - cs.Logs = &stats.FsStats{ - Time: metav1.NewTime(lcs.Timestamp), - AvailableBytes: &sb.rootFsInfo.Available, - CapacityBytes: &sb.rootFsInfo.Capacity, - InodesFree: sb.rootFsInfo.InodesFree, - Inodes: sb.rootFsInfo.Inodes, - } - - if sb.rootFsInfo.Inodes != nil && sb.rootFsInfo.InodesFree != nil { - logsInodesUsed := *sb.rootFsInfo.Inodes - *sb.rootFsInfo.InodesFree - cs.Logs.InodesUsed = &logsInodesUsed - } - - // The container rootFs lives on the imageFs devices (which may not be the node root fs) - cs.Rootfs = &stats.FsStats{ - Time: metav1.NewTime(lcs.Timestamp), - AvailableBytes: &sb.imageFsInfo.Available, - CapacityBytes: &sb.imageFsInfo.Capacity, - InodesFree: sb.imageFsInfo.InodesFree, - Inodes: sb.imageFsInfo.Inodes, - } - cfs := lcs.Filesystem - - if cfs != nil { - if cfs.BaseUsageBytes != nil { - rootfsUsage := *cfs.BaseUsageBytes - cs.Rootfs.UsedBytes = &rootfsUsage - if cfs.TotalUsageBytes != nil { - logsUsage := *cfs.TotalUsageBytes - *cfs.BaseUsageBytes - cs.Logs.UsedBytes = &logsUsage - } - } - if cfs.InodeUsage != nil { - rootInodes := *cfs.InodeUsage - cs.Rootfs.InodesUsed = &rootInodes - } - } -} - -// latestContainerStats returns the latest container stats from cadvisor, or nil if none exist -func latestContainerStats(info *cadvisorapiv2.ContainerInfo) (*cadvisorapiv2.ContainerStats, bool) { - stats := info.Stats - if len(stats) < 1 { - return nil, false - } - latest := stats[len(stats)-1] - if latest == nil { - return nil, false - } - return latest, true -} - -// hasMemoryAndCPUInstUsage returns true if the specified container info has -// both non-zero CPU instantaneous usage and non-zero memory RSS usage, and -// false otherwise. -func hasMemoryAndCPUInstUsage(info *cadvisorapiv2.ContainerInfo) bool { - if !info.Spec.HasCpu || !info.Spec.HasMemory { - return false - } - cstat, found := latestContainerStats(info) - if !found { - return false - } - if cstat.CpuInst == nil { - return false - } - return cstat.CpuInst.Usage.Total != 0 && cstat.Memory.RSS != 0 -} - -// ByCreationTime implements sort.Interface for []containerInfoWithCgroup based -// on the cinfo.Spec.CreationTime field. -type ByCreationTime []containerInfoWithCgroup - -func (a ByCreationTime) Len() int { return len(a) } -func (a ByCreationTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a ByCreationTime) Less(i, j int) bool { - if a[i].cinfo.Spec.CreationTime.Equal(a[j].cinfo.Spec.CreationTime) { - // There shouldn't be two containers with the same name and/or the same - // creation time. However, to make the logic here robust, we break the - // tie by moving the one without CPU instantaneous or memory RSS usage - // to the beginning. - return hasMemoryAndCPUInstUsage(&a[j].cinfo) - } - return a[i].cinfo.Spec.CreationTime.Before(a[j].cinfo.Spec.CreationTime) -} - -// containerID is the identity of a container in a pod. -type containerID struct { - podRef stats.PodReference - containerName string -} - -// containerInfoWithCgroup contains the ContainerInfo and its cgroup name. -type containerInfoWithCgroup struct { - cinfo cadvisorapiv2.ContainerInfo - cgroup string -} - -// removeTerminatedContainerInfo returns the specified containerInfo but with -// the stats of the terminated containers removed. -// -// A ContainerInfo is considered to be of a terminated container if it has an -// older CreationTime and zero CPU instantaneous and memory RSS usage. -func removeTerminatedContainerInfo(containerInfo map[string]cadvisorapiv2.ContainerInfo) map[string]cadvisorapiv2.ContainerInfo { - cinfoMap := make(map[containerID][]containerInfoWithCgroup) - for key, cinfo := range containerInfo { - if !isPodManagedContainer(&cinfo) { - continue - } - cinfoID := containerID{ - podRef: buildPodRef(&cinfo), - containerName: types.GetContainerName(cinfo.Spec.Labels), - } - cinfoMap[cinfoID] = append(cinfoMap[cinfoID], containerInfoWithCgroup{ - cinfo: cinfo, - cgroup: key, - }) - } - result := make(map[string]cadvisorapiv2.ContainerInfo) - for _, refs := range cinfoMap { - if len(refs) == 1 { - result[refs[0].cgroup] = refs[0].cinfo - continue - } - sort.Sort(ByCreationTime(refs)) - i := 0 - for ; i < len(refs); i++ { - if hasMemoryAndCPUInstUsage(&refs[i].cinfo) { - // Stops removing when we first see an info with non-zero - // CPU/Memory usage. - break - } - } - for ; i < len(refs); i++ { - result[refs[i].cgroup] = refs[i].cinfo - } - } - return result -} - -// buildSummaryPods aggregates and returns the container stats in cinfos by the Pod managing the container. -// Containers not managed by a Pod are omitted. -func (sb *summaryBuilder) buildSummaryPods() []stats.PodStats { - // Map each container to a pod and update the PodStats with container data - podToStats := map[stats.PodReference]*stats.PodStats{} - infos := removeTerminatedContainerInfo(sb.infos) - for key, cinfo := range infos { - // on systemd using devicemapper each mount into the container has an associated cgroup. - // we ignore them to ensure we do not get duplicate entries in our summary. - // for details on .mount units: http://man7.org/linux/man-pages/man5/systemd.mount.5.html - if strings.HasSuffix(key, ".mount") { - continue - } - // Build the Pod key if this container is managed by a Pod - if !isPodManagedContainer(&cinfo) { - continue - } - ref := buildPodRef(&cinfo) - - // Lookup the PodStats for the pod using the PodRef. If none exists, initialize a new entry. - podStats, found := podToStats[ref] - if !found { - podStats = &stats.PodStats{PodRef: ref} - podToStats[ref] = podStats - } - - // Update the PodStats entry with the stats from the container by adding it to stats.Containers - containerName := types.GetContainerName(cinfo.Spec.Labels) - if containerName == leaky.PodInfraContainerName { - // Special case for infrastructure container which is hidden from the user and has network stats - podStats.Network = sb.containerInfoV2ToNetworkStats("pod:"+ref.Namespace+"_"+ref.Name, &cinfo) - podStats.StartTime = metav1.NewTime(cinfo.Spec.CreationTime) - } else { - podStats.Containers = append(podStats.Containers, sb.containerInfoV2ToStats(containerName, &cinfo)) - } - } - - // Add each PodStats to the result - result := make([]stats.PodStats, 0, len(podToStats)) - for _, podStats := range podToStats { - // Lookup the volume stats for each pod - podUID := kubetypes.UID(podStats.PodRef.UID) - if vstats, found := sb.fsResourceAnalyzer.GetPodVolumeStats(podUID); found { - podStats.VolumeStats = vstats.Volumes - } - result = append(result, *podStats) - } - return result -} - -// buildPodRef returns a PodReference that identifies the Pod managing cinfo -func buildPodRef(cinfo *cadvisorapiv2.ContainerInfo) stats.PodReference { - podName := types.GetPodName(cinfo.Spec.Labels) - podNamespace := types.GetPodNamespace(cinfo.Spec.Labels) - podUID := types.GetPodUID(cinfo.Spec.Labels) - return stats.PodReference{Name: podName, Namespace: podNamespace, UID: podUID} -} - -// isPodManagedContainer returns true if the cinfo container is managed by a Pod -func isPodManagedContainer(cinfo *cadvisorapiv2.ContainerInfo) bool { - podName := types.GetPodName(cinfo.Spec.Labels) - podNamespace := types.GetPodNamespace(cinfo.Spec.Labels) - managed := podName != "" && podNamespace != "" - if !managed && podName != podNamespace { - glog.Warningf( - "Expect container to have either both podName (%s) and podNamespace (%s) labels, or neither.", - podName, podNamespace) - } - return managed -} - -func (sb *summaryBuilder) containerInfoV2ToStats( - name string, - info *cadvisorapiv2.ContainerInfo) stats.ContainerStats { - cStats := stats.ContainerStats{ - StartTime: metav1.NewTime(info.Spec.CreationTime), - Name: name, - } - cstat, found := latestContainerStats(info) - if !found { - return cStats - } - if info.Spec.HasCpu { - cpuStats := stats.CPUStats{ - Time: metav1.NewTime(cstat.Timestamp), - } - if cstat.CpuInst != nil { - cpuStats.UsageNanoCores = &cstat.CpuInst.Usage.Total - } - if cstat.Cpu != nil { - cpuStats.UsageCoreNanoSeconds = &cstat.Cpu.Usage.Total - } - cStats.CPU = &cpuStats - } - if info.Spec.HasMemory { - pageFaults := cstat.Memory.ContainerData.Pgfault - majorPageFaults := cstat.Memory.ContainerData.Pgmajfault - cStats.Memory = &stats.MemoryStats{ - Time: metav1.NewTime(cstat.Timestamp), - UsageBytes: &cstat.Memory.Usage, - WorkingSetBytes: &cstat.Memory.WorkingSet, - RSSBytes: &cstat.Memory.RSS, - PageFaults: &pageFaults, - MajorPageFaults: &majorPageFaults, - } - // availableBytes = memory limit (if known) - workingset - if !isMemoryUnlimited(info.Spec.Memory.Limit) { - availableBytes := info.Spec.Memory.Limit - cstat.Memory.WorkingSet - cStats.Memory.AvailableBytes = &availableBytes - } - } - - sb.containerInfoV2FsStats(info, &cStats) - cStats.UserDefinedMetrics = sb.containerInfoV2ToUserDefinedMetrics(info) - return cStats -} - -// Size after which we consider memory to be "unlimited". This is not -// MaxInt64 due to rounding by the kernel. -// TODO: cadvisor should export this https://github.com/google/cadvisor/blob/master/metrics/prometheus.go#L596 -const maxMemorySize = uint64(1 << 62) - -func isMemoryUnlimited(v uint64) bool { - return v > maxMemorySize -} - -func (sb *summaryBuilder) containerInfoV2ToNetworkStats(name string, info *cadvisorapiv2.ContainerInfo) *stats.NetworkStats { - if !info.Spec.HasNetwork { - return nil - } - cstat, found := latestContainerStats(info) - if !found { - return nil - } - for _, inter := range cstat.Network.Interfaces { - if inter.Name == network.DefaultInterfaceName { - return &stats.NetworkStats{ - Time: metav1.NewTime(cstat.Timestamp), - RxBytes: &inter.RxBytes, - RxErrors: &inter.RxErrors, - TxBytes: &inter.TxBytes, - TxErrors: &inter.TxErrors, - } - } - } - glog.V(4).Infof("Missing default interface %q for %s", network.DefaultInterfaceName, name) - return nil -} - -func (sb *summaryBuilder) containerInfoV2ToUserDefinedMetrics(info *cadvisorapiv2.ContainerInfo) []stats.UserDefinedMetric { - type specVal struct { - ref stats.UserDefinedMetricDescriptor - valType cadvisorapiv1.DataType - time time.Time - value float64 - } - udmMap := map[string]*specVal{} - for _, spec := range info.Spec.CustomMetrics { - udmMap[spec.Name] = &specVal{ - ref: stats.UserDefinedMetricDescriptor{ - Name: spec.Name, - Type: stats.UserDefinedMetricType(spec.Type), - Units: spec.Units, - }, - valType: spec.Format, - } - } - for _, stat := range info.Stats { - for name, values := range stat.CustomMetrics { - specVal, ok := udmMap[name] - if !ok { - glog.Warningf("spec for custom metric %q is missing from cAdvisor output. Spec: %+v, Metrics: %+v", name, info.Spec, stat.CustomMetrics) - continue - } - for _, value := range values { - // Pick the most recent value - if value.Timestamp.Before(specVal.time) { - continue - } - specVal.time = value.Timestamp - specVal.value = value.FloatValue - if specVal.valType == cadvisorapiv1.IntType { - specVal.value = float64(value.IntValue) - } - } - } - } - var udm []stats.UserDefinedMetric - for _, specVal := range udmMap { - udm = append(udm, stats.UserDefinedMetric{ - UserDefinedMetricDescriptor: specVal.ref, - Time: metav1.NewTime(specVal.time), - Value: specVal.value, - }) - } - return udm -} diff --git a/pkg/kubelet/server/stats/summary_test.go b/pkg/kubelet/server/stats/summary_test.go index 2253a10b876a7..22e38f7f67914 100644 --- a/pkg/kubelet/server/stats/summary_test.go +++ b/pkg/kubelet/server/stats/summary_test.go @@ -20,480 +20,123 @@ import ( "testing" "time" - "github.com/google/cadvisor/info/v1" - "github.com/google/cadvisor/info/v2" fuzz "github.com/google/gofuzz" "github.com/stretchr/testify/assert" - k8sv1 "k8s.io/api/core/v1" + "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - kubestats "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" "k8s.io/kubernetes/pkg/kubelet/cm" - "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/leaky" + statstest "k8s.io/kubernetes/pkg/kubelet/server/stats/testing" ) -const ( - // Offsets from seed value in generated container stats. - offsetCPUUsageCores = iota - offsetCPUUsageCoreSeconds - offsetMemPageFaults - offsetMemMajorPageFaults - offsetMemUsageBytes - offsetMemRSSBytes - offsetMemWorkingSetBytes - offsetNetRxBytes - offsetNetRxErrors - offsetNetTxBytes - offsetNetTxErrors -) - -var ( - timestamp = time.Now() - creationTime = timestamp.Add(-5 * time.Minute) -) - -func TestRemoveTerminatedContainerInfo(t *testing.T) { - const ( - seedPastPod0Infra = 1000 - seedPastPod0Container0 = 2000 - seedPod0Infra = 3000 - seedPod0Container0 = 4000 - ) - const ( - namespace = "test" - pName0 = "pod0" - cName00 = "c0" - ) - infos := map[string]v2.ContainerInfo{ - // ContainerInfo with past creation time and no CPU/memory usage for - // simulating uncleaned cgroups of already terminated containers, which - // should not be shown in the results. - "/pod0-i-terminated-1": summaryTerminatedContainerInfo(seedPastPod0Infra, pName0, namespace, leaky.PodInfraContainerName), - "/pod0-c0-terminated-1": summaryTerminatedContainerInfo(seedPastPod0Container0, pName0, namespace, cName00), - - // Same as above but uses the same creation time as the latest - // containers. They are terminated containers, so they should not be in - // the results. - "/pod0-i-terminated-2": summaryTerminatedContainerInfo(seedPod0Infra, pName0, namespace, leaky.PodInfraContainerName), - "/pod0-c0-terminated-2": summaryTerminatedContainerInfo(seedPod0Container0, pName0, namespace, cName00), - - // The latest containers, which should be in the results. - "/pod0-i": summaryTestContainerInfo(seedPod0Infra, pName0, namespace, leaky.PodInfraContainerName), - "/pod0-c0": summaryTestContainerInfo(seedPod0Container0, pName0, namespace, cName00), - - // Duplicated containers with non-zero CPU and memory usage. This case - // shouldn't happen unless something goes wrong, but we want to test - // that the metrics reporting logic works in this scenario. - "/pod0-i-duplicated": summaryTestContainerInfo(seedPod0Infra, pName0, namespace, leaky.PodInfraContainerName), - "/pod0-c0-duplicated": summaryTestContainerInfo(seedPod0Container0, pName0, namespace, cName00), - } - output := removeTerminatedContainerInfo(infos) - assert.Len(t, output, 4) - for _, c := range []string{"/pod0-i", "/pod0-c0", "/pod0-i-duplicated", "/pod0-c0-duplicated"} { - if _, found := output[c]; !found { - t.Errorf("%q is expected to be in the output\n", c) +func TestSummaryProvider(t *testing.T) { + var ( + podStats = []statsapi.PodStats{ + { + PodRef: statsapi.PodReference{Name: "test-pod", Namespace: "test-namespace", UID: "UID_test-pod"}, + StartTime: metav1.NewTime(time.Now()), + Containers: []statsapi.ContainerStats{*getContainerStats()}, + Network: getNetworkStats(), + VolumeStats: []statsapi.VolumeStats{*getVolumeStats()}, + }, } - } -} - -func TestBuildSummary(t *testing.T) { - node := k8sv1.Node{} - node.Name = "FooNode" - nodeConfig := cm.NodeConfig{ - RuntimeCgroupsName: "/docker-daemon", - SystemCgroupsName: "/system", - KubeletCgroupsName: "/kubelet", - } - const ( - namespace0 = "test0" - namespace2 = "test2" - ) - const ( - seedRoot = 0 - seedRuntime = 100 - seedKubelet = 200 - seedMisc = 300 - seedPod0Infra = 1000 - seedPod0Container0 = 2000 - seedPod0Container1 = 2001 - seedPod1Infra = 3000 - seedPod1Container = 4000 - seedPod2Infra = 5000 - seedPod2Container = 6000 - ) - const ( - pName0 = "pod0" - pName1 = "pod1" - pName2 = "pod0" // ensure pName2 conflicts with pName0, but is in a different namespace - ) - const ( - cName00 = "c0" - cName01 = "c1" - cName10 = "c0" // ensure cName10 conflicts with cName02, but is in a different pod - cName20 = "c1" // ensure cName20 conflicts with cName01, but is in a different pod + namespace - ) - const ( - rootfsCapacity = uint64(10000000) - rootfsAvailable = uint64(5000000) - rootfsInodesFree = uint64(1000) - rootfsInodes = uint64(2000) - imagefsCapacity = uint64(20000000) - imagefsAvailable = uint64(8000000) - imagefsInodesFree = uint64(2000) - imagefsInodes = uint64(4000) - ) - - prf0 := kubestats.PodReference{Name: pName0, Namespace: namespace0, UID: "UID" + pName0} - prf1 := kubestats.PodReference{Name: pName1, Namespace: namespace0, UID: "UID" + pName1} - prf2 := kubestats.PodReference{Name: pName2, Namespace: namespace2, UID: "UID" + pName2} - infos := map[string]v2.ContainerInfo{ - "/": summaryTestContainerInfo(seedRoot, "", "", ""), - "/docker-daemon": summaryTestContainerInfo(seedRuntime, "", "", ""), - "/kubelet": summaryTestContainerInfo(seedKubelet, "", "", ""), - "/system": summaryTestContainerInfo(seedMisc, "", "", ""), - // Pod0 - Namespace0 - "/pod0-i": summaryTestContainerInfo(seedPod0Infra, pName0, namespace0, leaky.PodInfraContainerName), - "/pod0-c0": summaryTestContainerInfo(seedPod0Container0, pName0, namespace0, cName00), - "/pod0-c1": summaryTestContainerInfo(seedPod0Container1, pName0, namespace0, cName01), - // Pod1 - Namespace0 - "/pod1-i": summaryTestContainerInfo(seedPod1Infra, pName1, namespace0, leaky.PodInfraContainerName), - "/pod1-c0": summaryTestContainerInfo(seedPod1Container, pName1, namespace0, cName10), - // Pod2 - Namespace2 - "/pod2-i": summaryTestContainerInfo(seedPod2Infra, pName2, namespace2, leaky.PodInfraContainerName), - "/pod2-c0": summaryTestContainerInfo(seedPod2Container, pName2, namespace2, cName20), - } - - freeRootfsInodes := rootfsInodesFree - totalRootfsInodes := rootfsInodes - rootfs := v2.FsInfo{ - Capacity: rootfsCapacity, - Available: rootfsAvailable, - InodesFree: &freeRootfsInodes, - Inodes: &totalRootfsInodes, - } - freeImagefsInodes := imagefsInodesFree - totalImagefsInodes := imagefsInodes - imagefs := v2.FsInfo{ - Capacity: imagefsCapacity, - Available: imagefsAvailable, - InodesFree: &freeImagefsInodes, - Inodes: &totalImagefsInodes, - } - - // memory limit overrides for each container (used to test available bytes if a memory limit is known) - memoryLimitOverrides := map[string]uint64{ - "/": uint64(1 << 30), - "/pod2-c0": uint64(1 << 15), - } - for name, memoryLimitOverride := range memoryLimitOverrides { - info, found := infos[name] - if !found { - t.Errorf("No container defined with name %v", name) + imageFsStats = getFsStats() + rootFsStats = getFsStats() + node = &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "test-node"}} + nodeConfig = cm.NodeConfig{ + RuntimeCgroupsName: "/runtime", + SystemCgroupsName: "/system", + KubeletCgroupsName: "/kubelet", } - info.Spec.Memory.Limit = memoryLimitOverride - infos[name] = info - } - - sb := &summaryBuilder{ - newFsResourceAnalyzer(&MockStatsProvider{}, time.Minute*5), &node, nodeConfig, rootfs, imagefs, container.ImageStats{}, infos} - summary, err := sb.build() - - assert.NoError(t, err) - nodeStats := summary.Node - assert.Equal(t, "FooNode", nodeStats.NodeName) - assert.EqualValues(t, testTime(creationTime, seedRoot).Unix(), nodeStats.StartTime.Time.Unix()) - checkCPUStats(t, "Node", seedRoot, nodeStats.CPU) - checkMemoryStats(t, "Node", seedRoot, infos["/"], nodeStats.Memory) - checkNetworkStats(t, "Node", seedRoot, nodeStats.Network) - - systemSeeds := map[string]int{ - kubestats.SystemContainerRuntime: seedRuntime, - kubestats.SystemContainerKubelet: seedKubelet, - kubestats.SystemContainerMisc: seedMisc, - } - systemContainerToNodeCgroup := map[string]string{ - kubestats.SystemContainerRuntime: nodeConfig.RuntimeCgroupsName, - kubestats.SystemContainerKubelet: nodeConfig.KubeletCgroupsName, - kubestats.SystemContainerMisc: nodeConfig.SystemCgroupsName, - } - for _, sys := range nodeStats.SystemContainers { - name := sys.Name - info := infos[systemContainerToNodeCgroup[name]] - seed, found := systemSeeds[name] - if !found { - t.Errorf("Unknown SystemContainer: %q", name) + cgroupStatsMap = map[string]struct { + cs *statsapi.ContainerStats + ns *statsapi.NetworkStats + }{ + "/": {cs: getContainerStats(), ns: getNetworkStats()}, + "/runtime": {cs: getContainerStats(), ns: getNetworkStats()}, + "/system": {cs: getContainerStats(), ns: getNetworkStats()}, + "/kubelet": {cs: getContainerStats(), ns: getNetworkStats()}, } - assert.EqualValues(t, testTime(creationTime, seed).Unix(), sys.StartTime.Time.Unix(), name+".StartTime") - checkCPUStats(t, name, seed, sys.CPU) - checkMemoryStats(t, name, seed, info, sys.Memory) - assert.Nil(t, sys.Logs, name+".Logs") - assert.Nil(t, sys.Rootfs, name+".Rootfs") - } - - assert.Equal(t, 3, len(summary.Pods)) - indexPods := make(map[kubestats.PodReference]kubestats.PodStats, len(summary.Pods)) - for _, pod := range summary.Pods { - indexPods[pod.PodRef] = pod - } - - // Validate Pod0 Results - ps, found := indexPods[prf0] - assert.True(t, found) - assert.Len(t, ps.Containers, 2) - indexCon := make(map[string]kubestats.ContainerStats, len(ps.Containers)) - for _, con := range ps.Containers { - indexCon[con.Name] = con - } - con := indexCon[cName00] - assert.EqualValues(t, testTime(creationTime, seedPod0Container0).Unix(), con.StartTime.Time.Unix()) - checkCPUStats(t, "Pod0Container0", seedPod0Container0, con.CPU) - checkMemoryStats(t, "Pod0Conainer0", seedPod0Container0, infos["/pod0-c0"], con.Memory) - - con = indexCon[cName01] - assert.EqualValues(t, testTime(creationTime, seedPod0Container1).Unix(), con.StartTime.Time.Unix()) - checkCPUStats(t, "Pod0Container1", seedPod0Container1, con.CPU) - checkMemoryStats(t, "Pod0Container1", seedPod0Container1, infos["/pod0-c1"], con.Memory) - - assert.EqualValues(t, testTime(creationTime, seedPod0Infra).Unix(), ps.StartTime.Time.Unix()) - checkNetworkStats(t, "Pod0", seedPod0Infra, ps.Network) - - // Validate Pod1 Results - ps, found = indexPods[prf1] - assert.True(t, found) - assert.Len(t, ps.Containers, 1) - con = ps.Containers[0] - assert.Equal(t, cName10, con.Name) - checkCPUStats(t, "Pod1Container0", seedPod1Container, con.CPU) - checkMemoryStats(t, "Pod1Container0", seedPod1Container, infos["/pod1-c0"], con.Memory) - checkNetworkStats(t, "Pod1", seedPod1Infra, ps.Network) - - // Validate Pod2 Results - ps, found = indexPods[prf2] - assert.True(t, found) - assert.Len(t, ps.Containers, 1) - con = ps.Containers[0] - assert.Equal(t, cName20, con.Name) - checkCPUStats(t, "Pod2Container0", seedPod2Container, con.CPU) - checkMemoryStats(t, "Pod2Container0", seedPod2Container, infos["/pod2-c0"], con.Memory) - checkNetworkStats(t, "Pod2", seedPod2Infra, ps.Network) -} - -func generateCustomMetricSpec() []v1.MetricSpec { - f := fuzz.New().NilChance(0).Funcs( - func(e *v1.MetricSpec, c fuzz.Continue) { - c.Fuzz(&e.Name) - switch c.Intn(3) { - case 0: - e.Type = v1.MetricGauge - case 1: - e.Type = v1.MetricCumulative - case 2: - e.Type = v1.MetricDelta - } - switch c.Intn(2) { - case 0: - e.Format = v1.IntType - case 1: - e.Format = v1.FloatType - } - c.Fuzz(&e.Units) - }) - var ret []v1.MetricSpec - f.Fuzz(&ret) - return ret -} - -func generateCustomMetrics(spec []v1.MetricSpec) map[string][]v1.MetricVal { - ret := map[string][]v1.MetricVal{} - for _, metricSpec := range spec { - f := fuzz.New().NilChance(0).Funcs( - func(e *v1.MetricVal, c fuzz.Continue) { - switch metricSpec.Format { - case v1.IntType: - c.Fuzz(&e.IntValue) - case v1.FloatType: - c.Fuzz(&e.FloatValue) - } - }) - - var metrics []v1.MetricVal - f.Fuzz(&metrics) - ret[metricSpec.Name] = metrics - } - return ret -} - -func summaryTerminatedContainerInfo(seed int, podName string, podNamespace string, containerName string) v2.ContainerInfo { - cinfo := summaryTestContainerInfo(seed, podName, podNamespace, containerName) - cinfo.Stats[0].Memory.RSS = 0 - cinfo.Stats[0].CpuInst.Usage.Total = 0 - return cinfo -} + ) -func summaryTestContainerInfo(seed int, podName string, podNamespace string, containerName string) v2.ContainerInfo { - labels := map[string]string{} - if podName != "" { - labels = map[string]string{ - "io.kubernetes.pod.name": podName, - "io.kubernetes.pod.uid": "UID" + podName, - "io.kubernetes.pod.namespace": podNamespace, - "io.kubernetes.container.name": containerName, - } - } - // by default, kernel will set memory.limit_in_bytes to 1 << 63 if not bounded - unlimitedMemory := uint64(1 << 63) - spec := v2.ContainerSpec{ - CreationTime: testTime(creationTime, seed), - HasCpu: true, - HasMemory: true, - HasNetwork: true, - Labels: labels, - Memory: v2.MemorySpec{ - Limit: unlimitedMemory, + assert := assert.New(t) + + mockStatsProvider := new(statstest.StatsProvider) + mockStatsProvider. + On("GetNode").Return(node, nil). + On("GetNodeConfig").Return(nodeConfig). + On("ListPodStats").Return(podStats, nil). + On("ImageFsStats").Return(imageFsStats, nil). + On("RootFsStats").Return(rootFsStats, nil). + On("GetCgroupStats", "/").Return(cgroupStatsMap["/"].cs, cgroupStatsMap["/"].ns, nil). + On("GetCgroupStats", "/runtime").Return(cgroupStatsMap["/runtime"].cs, cgroupStatsMap["/runtime"].ns, nil). + On("GetCgroupStats", "/system").Return(cgroupStatsMap["/system"].cs, cgroupStatsMap["/system"].ns, nil). + On("GetCgroupStats", "/kubelet").Return(cgroupStatsMap["/kubelet"].cs, cgroupStatsMap["/kubelet"].ns, nil) + + provider := NewSummaryProvider(mockStatsProvider) + summary, err := provider.Get() + assert.NoError(err) + + assert.Equal(summary.Node.NodeName, "test-node") + assert.Equal(summary.Node.StartTime, cgroupStatsMap["/"].cs.StartTime) + assert.Equal(summary.Node.CPU, cgroupStatsMap["/"].cs.CPU) + assert.Equal(summary.Node.Memory, cgroupStatsMap["/"].cs.Memory) + assert.Equal(summary.Node.Network, cgroupStatsMap["/"].ns) + assert.Equal(summary.Node.Fs, rootFsStats) + assert.Equal(summary.Node.Runtime, &statsapi.RuntimeStats{ImageFs: imageFsStats}) + + assert.Equal(len(summary.Node.SystemContainers), 3) + assert.Contains(summary.Node.SystemContainers, + statsapi.ContainerStats{ + Name: "kubelet", + StartTime: cgroupStatsMap["/kubelet"].cs.StartTime, + CPU: cgroupStatsMap["/kubelet"].cs.CPU, + Memory: cgroupStatsMap["/kubelet"].cs.Memory, + UserDefinedMetrics: cgroupStatsMap["/kubelet"].cs.UserDefinedMetrics, }, - CustomMetrics: generateCustomMetricSpec(), - } - - stats := v2.ContainerStats{ - Timestamp: testTime(timestamp, seed), - Cpu: &v1.CpuStats{}, - CpuInst: &v2.CpuInstStats{}, - Memory: &v1.MemoryStats{ - Usage: uint64(seed + offsetMemUsageBytes), - WorkingSet: uint64(seed + offsetMemWorkingSetBytes), - RSS: uint64(seed + offsetMemRSSBytes), - ContainerData: v1.MemoryStatsMemoryData{ - Pgfault: uint64(seed + offsetMemPageFaults), - Pgmajfault: uint64(seed + offsetMemMajorPageFaults), - }, + statsapi.ContainerStats{ + Name: "system", + StartTime: cgroupStatsMap["/system"].cs.StartTime, + CPU: cgroupStatsMap["/system"].cs.CPU, + Memory: cgroupStatsMap["/system"].cs.Memory, + UserDefinedMetrics: cgroupStatsMap["/system"].cs.UserDefinedMetrics, }, - Network: &v2.NetworkStats{ - Interfaces: []v1.InterfaceStats{{ - Name: "eth0", - RxBytes: uint64(seed + offsetNetRxBytes), - RxErrors: uint64(seed + offsetNetRxErrors), - TxBytes: uint64(seed + offsetNetTxBytes), - TxErrors: uint64(seed + offsetNetTxErrors), - }, { - Name: "cbr0", - RxBytes: 100, - RxErrors: 100, - TxBytes: 100, - TxErrors: 100, - }}, + statsapi.ContainerStats{ + Name: "runtime", + StartTime: cgroupStatsMap["/runtime"].cs.StartTime, + CPU: cgroupStatsMap["/runtime"].cs.CPU, + Memory: cgroupStatsMap["/runtime"].cs.Memory, + UserDefinedMetrics: cgroupStatsMap["/runtime"].cs.UserDefinedMetrics, }, - CustomMetrics: generateCustomMetrics(spec.CustomMetrics), - } - stats.Cpu.Usage.Total = uint64(seed + offsetCPUUsageCoreSeconds) - stats.CpuInst.Usage.Total = uint64(seed + offsetCPUUsageCores) - return v2.ContainerInfo{ - Spec: spec, - Stats: []*v2.ContainerStats{&stats}, - } -} - -func testTime(base time.Time, seed int) time.Time { - return base.Add(time.Duration(seed) * time.Second) + ) + assert.Equal(summary.Pods, podStats) } -func checkNetworkStats(t *testing.T, label string, seed int, stats *kubestats.NetworkStats) { - assert.NotNil(t, stats) - assert.EqualValues(t, testTime(timestamp, seed).Unix(), stats.Time.Time.Unix(), label+".Net.Time") - assert.EqualValues(t, seed+offsetNetRxBytes, *stats.RxBytes, label+".Net.RxBytes") - assert.EqualValues(t, seed+offsetNetRxErrors, *stats.RxErrors, label+".Net.RxErrors") - assert.EqualValues(t, seed+offsetNetTxBytes, *stats.TxBytes, label+".Net.TxBytes") - assert.EqualValues(t, seed+offsetNetTxErrors, *stats.TxErrors, label+".Net.TxErrors") +func getFsStats() *statsapi.FsStats { + f := fuzz.New().NilChance(0) + v := &statsapi.FsStats{} + f.Fuzz(v) + return v } -func checkCPUStats(t *testing.T, label string, seed int, stats *kubestats.CPUStats) { - assert.EqualValues(t, testTime(timestamp, seed).Unix(), stats.Time.Time.Unix(), label+".CPU.Time") - assert.EqualValues(t, seed+offsetCPUUsageCores, *stats.UsageNanoCores, label+".CPU.UsageCores") - assert.EqualValues(t, seed+offsetCPUUsageCoreSeconds, *stats.UsageCoreNanoSeconds, label+".CPU.UsageCoreSeconds") +func getContainerStats() *statsapi.ContainerStats { + f := fuzz.New().NilChance(0) + v := &statsapi.ContainerStats{} + f.Fuzz(v) + return v } -func checkMemoryStats(t *testing.T, label string, seed int, info v2.ContainerInfo, stats *kubestats.MemoryStats) { - assert.EqualValues(t, testTime(timestamp, seed).Unix(), stats.Time.Time.Unix(), label+".Mem.Time") - assert.EqualValues(t, seed+offsetMemUsageBytes, *stats.UsageBytes, label+".Mem.UsageBytes") - assert.EqualValues(t, seed+offsetMemWorkingSetBytes, *stats.WorkingSetBytes, label+".Mem.WorkingSetBytes") - assert.EqualValues(t, seed+offsetMemRSSBytes, *stats.RSSBytes, label+".Mem.RSSBytes") - assert.EqualValues(t, seed+offsetMemPageFaults, *stats.PageFaults, label+".Mem.PageFaults") - assert.EqualValues(t, seed+offsetMemMajorPageFaults, *stats.MajorPageFaults, label+".Mem.MajorPageFaults") - if !info.Spec.HasMemory || isMemoryUnlimited(info.Spec.Memory.Limit) { - assert.Nil(t, stats.AvailableBytes, label+".Mem.AvailableBytes") - } else { - expected := info.Spec.Memory.Limit - *stats.WorkingSetBytes - assert.EqualValues(t, expected, *stats.AvailableBytes, label+".Mem.AvailableBytes") - } +func getVolumeStats() *statsapi.VolumeStats { + f := fuzz.New().NilChance(0) + v := &statsapi.VolumeStats{} + f.Fuzz(v) + return v } -func TestCustomMetrics(t *testing.T) { - spec := []v1.MetricSpec{ - { - Name: "qos", - Type: v1.MetricGauge, - Format: v1.IntType, - Units: "per second", - }, - { - Name: "cpuLoad", - Type: v1.MetricCumulative, - Format: v1.FloatType, - Units: "count", - }, - } - timestamp1 := time.Now() - timestamp2 := time.Now().Add(time.Minute) - metrics := map[string][]v1.MetricVal{ - "qos": { - { - Timestamp: timestamp1, - IntValue: 10, - }, - { - Timestamp: timestamp2, - IntValue: 100, - }, - }, - "cpuLoad": { - { - Timestamp: timestamp1, - FloatValue: 1.2, - }, - { - Timestamp: timestamp2, - FloatValue: 2.1, - }, - }, - } - cInfo := v2.ContainerInfo{ - Spec: v2.ContainerSpec{ - CustomMetrics: spec, - }, - Stats: []*v2.ContainerStats{ - { - CustomMetrics: metrics, - }, - }, - } - sb := &summaryBuilder{} - assert.Contains(t, sb.containerInfoV2ToUserDefinedMetrics(&cInfo), - kubestats.UserDefinedMetric{ - UserDefinedMetricDescriptor: kubestats.UserDefinedMetricDescriptor{ - Name: "qos", - Type: kubestats.MetricGauge, - Units: "per second", - }, - Time: metav1.NewTime(timestamp2), - Value: 100, - }, - kubestats.UserDefinedMetric{ - UserDefinedMetricDescriptor: kubestats.UserDefinedMetricDescriptor{ - Name: "cpuLoad", - Type: kubestats.MetricCumulative, - Units: "count", - }, - Time: metav1.NewTime(timestamp2), - Value: 2.1, - }) +func getNetworkStats() *statsapi.NetworkStats { + f := fuzz.New().NilChance(0) + v := &statsapi.NetworkStats{} + f.Fuzz(v) + return v } diff --git a/pkg/kubelet/server/stats/testing/BUILD b/pkg/kubelet/server/stats/testing/BUILD new file mode 100644 index 0000000000000..23c1db4915243 --- /dev/null +++ b/pkg/kubelet/server/stats/testing/BUILD @@ -0,0 +1,30 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["mock_stats_provider.go"], + visibility = ["//visibility:public"], + deps = [ + "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", + "//pkg/kubelet/cm:go_default_library", + "//pkg/volume:go_default_library", + "//vendor/github.com/google/cadvisor/info/v1:go_default_library", + "//vendor/github.com/stretchr/testify/mock:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/pkg/kubelet/server/stats/testing/mock_stats_provider.go b/pkg/kubelet/server/stats/testing/mock_stats_provider.go new file mode 100644 index 0000000000000..befa19b0bf756 --- /dev/null +++ b/pkg/kubelet/server/stats/testing/mock_stats_provider.go @@ -0,0 +1,280 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package testing + +import cm "k8s.io/kubernetes/pkg/kubelet/cm" +import corev1 "k8s.io/api/core/v1" +import mock "github.com/stretchr/testify/mock" + +import types "k8s.io/apimachinery/pkg/types" +import v1 "github.com/google/cadvisor/info/v1" +import v1alpha1 "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" +import volume "k8s.io/kubernetes/pkg/volume" + +// DO NOT EDIT +// GENERATED BY mockery + +// StatsProvider is an autogenerated mock type for the StatsProvider type +type StatsProvider struct { + mock.Mock +} + +// GetCgroupStats provides a mock function with given fields: cgroupName +func (_m *StatsProvider) GetCgroupStats(cgroupName string) (*v1alpha1.ContainerStats, *v1alpha1.NetworkStats, error) { + ret := _m.Called(cgroupName) + + var r0 *v1alpha1.ContainerStats + if rf, ok := ret.Get(0).(func(string) *v1alpha1.ContainerStats); ok { + r0 = rf(cgroupName) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1alpha1.ContainerStats) + } + } + + var r1 *v1alpha1.NetworkStats + if rf, ok := ret.Get(1).(func(string) *v1alpha1.NetworkStats); ok { + r1 = rf(cgroupName) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*v1alpha1.NetworkStats) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string) error); ok { + r2 = rf(cgroupName) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetContainerInfo provides a mock function with given fields: podFullName, uid, containerName, req +func (_m *StatsProvider) GetContainerInfo(podFullName string, uid types.UID, containerName string, req *v1.ContainerInfoRequest) (*v1.ContainerInfo, error) { + ret := _m.Called(podFullName, uid, containerName, req) + + var r0 *v1.ContainerInfo + if rf, ok := ret.Get(0).(func(string, types.UID, string, *v1.ContainerInfoRequest) *v1.ContainerInfo); ok { + r0 = rf(podFullName, uid, containerName, req) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.ContainerInfo) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, types.UID, string, *v1.ContainerInfoRequest) error); ok { + r1 = rf(podFullName, uid, containerName, req) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetNode provides a mock function with given fields: +func (_m *StatsProvider) GetNode() (*corev1.Node, error) { + ret := _m.Called() + + var r0 *corev1.Node + if rf, ok := ret.Get(0).(func() *corev1.Node); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*corev1.Node) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetNodeConfig provides a mock function with given fields: +func (_m *StatsProvider) GetNodeConfig() cm.NodeConfig { + ret := _m.Called() + + var r0 cm.NodeConfig + if rf, ok := ret.Get(0).(func() cm.NodeConfig); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(cm.NodeConfig) + } + + return r0 +} + +// GetPodByName provides a mock function with given fields: namespace, name +func (_m *StatsProvider) GetPodByName(namespace string, name string) (*corev1.Pod, bool) { + ret := _m.Called(namespace, name) + + var r0 *corev1.Pod + if rf, ok := ret.Get(0).(func(string, string) *corev1.Pod); ok { + r0 = rf(namespace, name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*corev1.Pod) + } + } + + var r1 bool + if rf, ok := ret.Get(1).(func(string, string) bool); ok { + r1 = rf(namespace, name) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// GetPods provides a mock function with given fields: +func (_m *StatsProvider) GetPods() []*corev1.Pod { + ret := _m.Called() + + var r0 []*corev1.Pod + if rf, ok := ret.Get(0).(func() []*corev1.Pod); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*corev1.Pod) + } + } + + return r0 +} + +// GetRawContainerInfo provides a mock function with given fields: containerName, req, subcontainers +func (_m *StatsProvider) GetRawContainerInfo(containerName string, req *v1.ContainerInfoRequest, subcontainers bool) (map[string]*v1.ContainerInfo, error) { + ret := _m.Called(containerName, req, subcontainers) + + var r0 map[string]*v1.ContainerInfo + if rf, ok := ret.Get(0).(func(string, *v1.ContainerInfoRequest, bool) map[string]*v1.ContainerInfo); ok { + r0 = rf(containerName, req, subcontainers) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]*v1.ContainerInfo) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, *v1.ContainerInfoRequest, bool) error); ok { + r1 = rf(containerName, req, subcontainers) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ImageFsStats provides a mock function with given fields: +func (_m *StatsProvider) ImageFsStats() (*v1alpha1.FsStats, error) { + ret := _m.Called() + + var r0 *v1alpha1.FsStats + if rf, ok := ret.Get(0).(func() *v1alpha1.FsStats); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1alpha1.FsStats) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ListPodStats provides a mock function with given fields: +func (_m *StatsProvider) ListPodStats() ([]v1alpha1.PodStats, error) { + ret := _m.Called() + + var r0 []v1alpha1.PodStats + if rf, ok := ret.Get(0).(func() []v1alpha1.PodStats); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]v1alpha1.PodStats) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ListVolumesForPod provides a mock function with given fields: podUID +func (_m *StatsProvider) ListVolumesForPod(podUID types.UID) (map[string]volume.Volume, bool) { + ret := _m.Called(podUID) + + var r0 map[string]volume.Volume + if rf, ok := ret.Get(0).(func(types.UID) map[string]volume.Volume); ok { + r0 = rf(podUID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]volume.Volume) + } + } + + var r1 bool + if rf, ok := ret.Get(1).(func(types.UID) bool); ok { + r1 = rf(podUID) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// RootFsStats provides a mock function with given fields: +func (_m *StatsProvider) RootFsStats() (*v1alpha1.FsStats, error) { + ret := _m.Called() + + var r0 *v1alpha1.FsStats + if rf, ok := ret.Get(0).(func() *v1alpha1.FsStats); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1alpha1.FsStats) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/pkg/kubelet/stats/BUILD b/pkg/kubelet/stats/BUILD new file mode 100644 index 0000000000000..e96170a6bd969 --- /dev/null +++ b/pkg/kubelet/stats/BUILD @@ -0,0 +1,69 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "cadvisor_stats_provider.go", + "cri_stats_provider.go", + "helper.go", + "stats_provider.go", + ], + visibility = ["//visibility:public"], + deps = [ + "//pkg/kubelet/apis/cri:go_default_library", + "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", + "//pkg/kubelet/cadvisor:go_default_library", + "//pkg/kubelet/container:go_default_library", + "//pkg/kubelet/leaky:go_default_library", + "//pkg/kubelet/network:go_default_library", + "//pkg/kubelet/pod:go_default_library", + "//pkg/kubelet/server/stats:go_default_library", + "//pkg/kubelet/types:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/google/cadvisor/info/v1:go_default_library", + "//vendor/github.com/google/cadvisor/info/v2:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) + +go_test( + name = "go_default_test", + srcs = [ + "cadvisor_stats_provider_test.go", + "helper_test.go", + "stats_provider_test.go", + ], + library = ":go_default_library", + deps = [ + "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", + "//pkg/kubelet/cadvisor/testing:go_default_library", + "//pkg/kubelet/container:go_default_library", + "//pkg/kubelet/container/testing:go_default_library", + "//pkg/kubelet/leaky:go_default_library", + "//pkg/kubelet/pod/testing:go_default_library", + "//pkg/kubelet/server/stats:go_default_library", + "//pkg/kubelet/types:go_default_library", + "//vendor/github.com/google/cadvisor/info/v1:go_default_library", + "//vendor/github.com/google/cadvisor/info/v2:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/github.com/stretchr/testify/require:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + ], +) diff --git a/pkg/kubelet/stats/cadvisor_stats_provider.go b/pkg/kubelet/stats/cadvisor_stats_provider.go new file mode 100644 index 0000000000000..39a6b8aac695b --- /dev/null +++ b/pkg/kubelet/stats/cadvisor_stats_provider.go @@ -0,0 +1,288 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package stats + +import ( + "fmt" + "sort" + "strings" + + "github.com/golang/glog" + cadvisorapiv2 "github.com/google/cadvisor/info/v2" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + "k8s.io/kubernetes/pkg/kubelet/cadvisor" + kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" + "k8s.io/kubernetes/pkg/kubelet/leaky" + "k8s.io/kubernetes/pkg/kubelet/server/stats" + kubetypes "k8s.io/kubernetes/pkg/kubelet/types" +) + +// cadvisorStatsProvider implements the containerStatsProvider interface by +// getting the container stats from cAdvisor. This is needed by docker and rkt +// integrations since they do not provide stats from CRI. +type cadvisorStatsProvider struct { + // cadvisor is used to get the stats of the cgroup for the containers that + // are managed by pods. + cadvisor cadvisor.Interface + // resourceAnalyzer is used to get the volume stats of the pods. + resourceAnalyzer stats.ResourceAnalyzer + // imageService is used to get the stats of the image filesystem. + imageService kubecontainer.ImageService +} + +// newCadvisorStatsProvider returns a containerStatsProvider that provides +// container stats from cAdvisor. +func newCadvisorStatsProvider( + cadvisor cadvisor.Interface, + resourceAnalyzer stats.ResourceAnalyzer, + imageService kubecontainer.ImageService, +) containerStatsProvider { + return &cadvisorStatsProvider{ + cadvisor: cadvisor, + resourceAnalyzer: resourceAnalyzer, + imageService: imageService, + } +} + +// ListPodStats returns the stats of all the pod-managed containers. +func (p *cadvisorStatsProvider) ListPodStats() ([]statsapi.PodStats, error) { + // Gets node root filesystem information and image filesystem stats, which + // will be used to populate the available and capacity bytes/inodes in + // container stats. + rootFsInfo, err := p.cadvisor.RootFsInfo() + if err != nil { + return nil, fmt.Errorf("failed to get rootFs info: %v", err) + } + imageFsInfo, err := p.cadvisor.ImagesFsInfo() + if err != nil { + return nil, fmt.Errorf("failed to get imageFs info: %v", err) + } + + infos, err := p.cadvisor.ContainerInfoV2("/", cadvisorapiv2.RequestOptions{ + IdType: cadvisorapiv2.TypeName, + Count: 2, // 2 samples are needed to compute "instantaneous" CPU + Recursive: true, + }) + if err != nil { + if _, ok := infos["/"]; ok { + // If the failure is partial, log it and return a best-effort + // response. + glog.Errorf("Partial failure issuing cadvisor.ContainerInfoV2: %v", err) + } else { + return nil, fmt.Errorf("failed to get root cgroup stats: %v", err) + } + } + + infos = removeTerminatedContainerInfo(infos) + + // Map each container to a pod and update the PodStats with container data. + podToStats := map[statsapi.PodReference]*statsapi.PodStats{} + for key, cinfo := range infos { + // On systemd using devicemapper each mount into the container has an + // associated cgroup. We ignore them to ensure we do not get duplicate + // entries in our summary. For details on .mount units: + // http://man7.org/linux/man-pages/man5/systemd.mount.5.html + if strings.HasSuffix(key, ".mount") { + continue + } + // Build the Pod key if this container is managed by a Pod + if !isPodManagedContainer(&cinfo) { + continue + } + ref := buildPodRef(&cinfo) + + // Lookup the PodStats for the pod using the PodRef. If none exists, + // initialize a new entry. + podStats, found := podToStats[ref] + if !found { + podStats = &statsapi.PodStats{PodRef: ref} + podToStats[ref] = podStats + } + + // Update the PodStats entry with the stats from the container by + // adding it to podStats.Containers. + containerName := kubetypes.GetContainerName(cinfo.Spec.Labels) + if containerName == leaky.PodInfraContainerName { + // Special case for infrastructure container which is hidden from + // the user and has network stats. + podStats.Network = cadvisorInfoToNetworkStats("pod:"+ref.Namespace+"_"+ref.Name, &cinfo) + podStats.StartTime = metav1.NewTime(cinfo.Spec.CreationTime) + } else { + podStats.Containers = append(podStats.Containers, *cadvisorInfoToContainerStats(containerName, &cinfo, &rootFsInfo, &imageFsInfo)) + } + } + + // Add each PodStats to the result. + result := make([]statsapi.PodStats, 0, len(podToStats)) + for _, podStats := range podToStats { + // Lookup the volume stats for each pod. + podUID := types.UID(podStats.PodRef.UID) + if vstats, found := p.resourceAnalyzer.GetPodVolumeStats(podUID); found { + podStats.VolumeStats = vstats.Volumes + } + result = append(result, *podStats) + } + + return result, nil +} + +// ImageFsStats returns the stats of the filesystem for storing images. +func (p *cadvisorStatsProvider) ImageFsStats() (*statsapi.FsStats, error) { + imageFsInfo, err := p.cadvisor.ImagesFsInfo() + if err != nil { + return nil, fmt.Errorf("failed to get imageFs info: %v", err) + } + imageStats, err := p.imageService.ImageStats() + if err != nil || imageStats == nil { + return nil, fmt.Errorf("failed to get image stats: %v", err) + } + + var imageFsInodesUsed *uint64 + if imageFsInfo.Inodes != nil && imageFsInfo.InodesFree != nil { + imageFsIU := *imageFsInfo.Inodes - *imageFsInfo.InodesFree + imageFsInodesUsed = &imageFsIU + } + + // Get the root container stats's timestamp, which will be used as the + // imageFs stats timestamp. + rootStats, err := getCgroupStats(p.cadvisor, "/") + if err != nil { + return nil, fmt.Errorf("failed to get root container stats: %v", err) + } + + return &statsapi.FsStats{ + Time: metav1.NewTime(rootStats.Timestamp), + AvailableBytes: &imageFsInfo.Available, + CapacityBytes: &imageFsInfo.Capacity, + UsedBytes: &imageStats.TotalStorageBytes, + InodesFree: imageFsInfo.InodesFree, + Inodes: imageFsInfo.Inodes, + InodesUsed: imageFsInodesUsed, + }, nil +} + +// buildPodRef returns a PodReference that identifies the Pod managing cinfo +func buildPodRef(cinfo *cadvisorapiv2.ContainerInfo) statsapi.PodReference { + podName := kubetypes.GetPodName(cinfo.Spec.Labels) + podNamespace := kubetypes.GetPodNamespace(cinfo.Spec.Labels) + podUID := kubetypes.GetPodUID(cinfo.Spec.Labels) + return statsapi.PodReference{Name: podName, Namespace: podNamespace, UID: podUID} +} + +// isPodManagedContainer returns true if the cinfo container is managed by a Pod +func isPodManagedContainer(cinfo *cadvisorapiv2.ContainerInfo) bool { + podName := kubetypes.GetPodName(cinfo.Spec.Labels) + podNamespace := kubetypes.GetPodNamespace(cinfo.Spec.Labels) + managed := podName != "" && podNamespace != "" + if !managed && podName != podNamespace { + glog.Warningf( + "Expect container to have either both podName (%s) and podNamespace (%s) labels, or neither.", + podName, podNamespace) + } + return managed +} + +// removeTerminatedContainerInfo returns the specified containerInfo but with +// the stats of the terminated containers removed. +// +// A ContainerInfo is considered to be of a terminated container if it has an +// older CreationTime and zero CPU instantaneous and memory RSS usage. +func removeTerminatedContainerInfo(containerInfo map[string]cadvisorapiv2.ContainerInfo) map[string]cadvisorapiv2.ContainerInfo { + cinfoMap := make(map[containerID][]containerInfoWithCgroup) + for key, cinfo := range containerInfo { + if !isPodManagedContainer(&cinfo) { + continue + } + cinfoID := containerID{ + podRef: buildPodRef(&cinfo), + containerName: kubetypes.GetContainerName(cinfo.Spec.Labels), + } + cinfoMap[cinfoID] = append(cinfoMap[cinfoID], containerInfoWithCgroup{ + cinfo: cinfo, + cgroup: key, + }) + } + result := make(map[string]cadvisorapiv2.ContainerInfo) + for _, refs := range cinfoMap { + if len(refs) == 1 { + result[refs[0].cgroup] = refs[0].cinfo + continue + } + sort.Sort(ByCreationTime(refs)) + i := 0 + for ; i < len(refs); i++ { + if hasMemoryAndCPUInstUsage(&refs[i].cinfo) { + // Stops removing when we first see an info with non-zero + // CPU/Memory usage. + break + } + } + for ; i < len(refs); i++ { + result[refs[i].cgroup] = refs[i].cinfo + } + } + return result +} + +// ByCreationTime implements sort.Interface for []containerInfoWithCgroup based +// on the cinfo.Spec.CreationTime field. +type ByCreationTime []containerInfoWithCgroup + +func (a ByCreationTime) Len() int { return len(a) } +func (a ByCreationTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a ByCreationTime) Less(i, j int) bool { + if a[i].cinfo.Spec.CreationTime.Equal(a[j].cinfo.Spec.CreationTime) { + // There shouldn't be two containers with the same name and/or the same + // creation time. However, to make the logic here robust, we break the + // tie by moving the one without CPU instantaneous or memory RSS usage + // to the beginning. + return hasMemoryAndCPUInstUsage(&a[j].cinfo) + } + return a[i].cinfo.Spec.CreationTime.Before(a[j].cinfo.Spec.CreationTime) +} + +// containerID is the identity of a container in a pod. +type containerID struct { + podRef statsapi.PodReference + containerName string +} + +// containerInfoWithCgroup contains the ContainerInfo and its cgroup name. +type containerInfoWithCgroup struct { + cinfo cadvisorapiv2.ContainerInfo + cgroup string +} + +// hasMemoryAndCPUInstUsage returns true if the specified container info has +// both non-zero CPU instantaneous usage and non-zero memory RSS usage, and +// false otherwise. +func hasMemoryAndCPUInstUsage(info *cadvisorapiv2.ContainerInfo) bool { + if !info.Spec.HasCpu || !info.Spec.HasMemory { + return false + } + cstat, found := latestContainerStats(info) + if !found { + return false + } + if cstat.CpuInst == nil { + return false + } + return cstat.CpuInst.Usage.Total != 0 && cstat.Memory.RSS != 0 +} diff --git a/pkg/kubelet/stats/cadvisor_stats_provider_test.go b/pkg/kubelet/stats/cadvisor_stats_provider_test.go new file mode 100644 index 0000000000000..06b60a64f5dfd --- /dev/null +++ b/pkg/kubelet/stats/cadvisor_stats_provider_test.go @@ -0,0 +1,271 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package stats + +import ( + "testing" + + cadvisorapiv2 "github.com/google/cadvisor/info/v2" + "github.com/stretchr/testify/assert" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing" + kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" + containertest "k8s.io/kubernetes/pkg/kubelet/container/testing" + "k8s.io/kubernetes/pkg/kubelet/leaky" +) + +func TestRemoveTerminatedContainerInfo(t *testing.T) { + const ( + seedPastPod0Infra = 1000 + seedPastPod0Container0 = 2000 + seedPod0Infra = 3000 + seedPod0Container0 = 4000 + ) + const ( + namespace = "test" + pName0 = "pod0" + cName00 = "c0" + ) + infos := map[string]cadvisorapiv2.ContainerInfo{ + // ContainerInfo with past creation time and no CPU/memory usage for + // simulating uncleaned cgroups of already terminated containers, which + // should not be shown in the results. + "/pod0-i-terminated-1": getTerminatedContainerInfo(seedPastPod0Infra, pName0, namespace, leaky.PodInfraContainerName), + "/pod0-c0-terminated-1": getTerminatedContainerInfo(seedPastPod0Container0, pName0, namespace, cName00), + + // Same as above but uses the same creation time as the latest + // containers. They are terminated containers, so they should not be in + // the results. + "/pod0-i-terminated-2": getTerminatedContainerInfo(seedPod0Infra, pName0, namespace, leaky.PodInfraContainerName), + "/pod0-c0-terminated-2": getTerminatedContainerInfo(seedPod0Container0, pName0, namespace, cName00), + + // The latest containers, which should be in the results. + "/pod0-i": getTestContainerInfo(seedPod0Infra, pName0, namespace, leaky.PodInfraContainerName), + "/pod0-c0": getTestContainerInfo(seedPod0Container0, pName0, namespace, cName00), + + // Duplicated containers with non-zero CPU and memory usage. This case + // shouldn't happen unless something goes wrong, but we want to test + // that the metrics reporting logic works in this scenario. + "/pod0-i-duplicated": getTestContainerInfo(seedPod0Infra, pName0, namespace, leaky.PodInfraContainerName), + "/pod0-c0-duplicated": getTestContainerInfo(seedPod0Container0, pName0, namespace, cName00), + } + output := removeTerminatedContainerInfo(infos) + assert.Len(t, output, 4) + for _, c := range []string{"/pod0-i", "/pod0-c0", "/pod0-i-duplicated", "/pod0-c0-duplicated"} { + if _, found := output[c]; !found { + t.Errorf("%q is expected to be in the output\n", c) + } + } +} + +func TestListPodStats(t *testing.T) { + const ( + namespace0 = "test0" + namespace2 = "test2" + ) + const ( + seedRoot = 0 + seedRuntime = 100 + seedKubelet = 200 + seedMisc = 300 + seedPod0Infra = 1000 + seedPod0Container0 = 2000 + seedPod0Container1 = 2001 + seedPod1Infra = 3000 + seedPod1Container = 4000 + seedPod2Infra = 5000 + seedPod2Container = 6000 + ) + const ( + pName0 = "pod0" + pName1 = "pod1" + pName2 = "pod0" // ensure pName2 conflicts with pName0, but is in a different namespace + ) + const ( + cName00 = "c0" + cName01 = "c1" + cName10 = "c0" // ensure cName10 conflicts with cName02, but is in a different pod + cName20 = "c1" // ensure cName20 conflicts with cName01, but is in a different pod + namespace + ) + const ( + rootfsCapacity = uint64(10000000) + rootfsAvailable = uint64(5000000) + rootfsInodesFree = uint64(1000) + rootfsInodes = uint64(2000) + imagefsCapacity = uint64(20000000) + imagefsAvailable = uint64(8000000) + imagefsInodesFree = uint64(2000) + imagefsInodes = uint64(4000) + ) + + prf0 := statsapi.PodReference{Name: pName0, Namespace: namespace0, UID: "UID" + pName0} + prf1 := statsapi.PodReference{Name: pName1, Namespace: namespace0, UID: "UID" + pName1} + prf2 := statsapi.PodReference{Name: pName2, Namespace: namespace2, UID: "UID" + pName2} + infos := map[string]cadvisorapiv2.ContainerInfo{ + "/": getTestContainerInfo(seedRoot, "", "", ""), + "/docker-daemon": getTestContainerInfo(seedRuntime, "", "", ""), + "/kubelet": getTestContainerInfo(seedKubelet, "", "", ""), + "/system": getTestContainerInfo(seedMisc, "", "", ""), + // Pod0 - Namespace0 + "/pod0-i": getTestContainerInfo(seedPod0Infra, pName0, namespace0, leaky.PodInfraContainerName), + "/pod0-c0": getTestContainerInfo(seedPod0Container0, pName0, namespace0, cName00), + "/pod0-c1": getTestContainerInfo(seedPod0Container1, pName0, namespace0, cName01), + // Pod1 - Namespace0 + "/pod1-i": getTestContainerInfo(seedPod1Infra, pName1, namespace0, leaky.PodInfraContainerName), + "/pod1-c0": getTestContainerInfo(seedPod1Container, pName1, namespace0, cName10), + // Pod2 - Namespace2 + "/pod2-i": getTestContainerInfo(seedPod2Infra, pName2, namespace2, leaky.PodInfraContainerName), + "/pod2-c0": getTestContainerInfo(seedPod2Container, pName2, namespace2, cName20), + } + + freeRootfsInodes := rootfsInodesFree + totalRootfsInodes := rootfsInodes + rootfs := cadvisorapiv2.FsInfo{ + Capacity: rootfsCapacity, + Available: rootfsAvailable, + InodesFree: &freeRootfsInodes, + Inodes: &totalRootfsInodes, + } + + freeImagefsInodes := imagefsInodesFree + totalImagefsInodes := imagefsInodes + imagefs := cadvisorapiv2.FsInfo{ + Capacity: imagefsCapacity, + Available: imagefsAvailable, + InodesFree: &freeImagefsInodes, + Inodes: &totalImagefsInodes, + } + + // memory limit overrides for each container (used to test available bytes if a memory limit is known) + memoryLimitOverrides := map[string]uint64{ + "/": uint64(1 << 30), + "/pod2-c0": uint64(1 << 15), + } + for name, memoryLimitOverride := range memoryLimitOverrides { + info, found := infos[name] + if !found { + t.Errorf("No container defined with name %v", name) + } + info.Spec.Memory.Limit = memoryLimitOverride + infos[name] = info + } + + options := cadvisorapiv2.RequestOptions{ + IdType: cadvisorapiv2.TypeName, + Count: 2, + Recursive: true, + } + + mockCadvisor := new(cadvisortest.Mock) + mockCadvisor. + On("ContainerInfoV2", "/", options).Return(infos, nil). + On("RootFsInfo").Return(rootfs, nil). + On("ImagesFsInfo").Return(imagefs, nil) + + mockRuntime := new(containertest.Mock) + mockRuntime. + On("ImageStats").Return(&kubecontainer.ImageStats{TotalStorageBytes: 123}, nil) + + resourceAnalyzer := &fakeResourceAnalyzer{} + + p := NewCadvisorStatsProvider(mockCadvisor, resourceAnalyzer, nil, nil, mockRuntime) + pods, err := p.ListPodStats() + assert.NoError(t, err) + + assert.Equal(t, 3, len(pods)) + indexPods := make(map[statsapi.PodReference]statsapi.PodStats, len(pods)) + for _, pod := range pods { + indexPods[pod.PodRef] = pod + } + + // Validate Pod0 Results + ps, found := indexPods[prf0] + assert.True(t, found) + assert.Len(t, ps.Containers, 2) + indexCon := make(map[string]statsapi.ContainerStats, len(ps.Containers)) + for _, con := range ps.Containers { + indexCon[con.Name] = con + } + con := indexCon[cName00] + assert.EqualValues(t, testTime(creationTime, seedPod0Container0).Unix(), con.StartTime.Time.Unix()) + checkCPUStats(t, "Pod0Container0", seedPod0Container0, con.CPU) + checkMemoryStats(t, "Pod0Conainer0", seedPod0Container0, infos["/pod0-c0"], con.Memory) + + con = indexCon[cName01] + assert.EqualValues(t, testTime(creationTime, seedPod0Container1).Unix(), con.StartTime.Time.Unix()) + checkCPUStats(t, "Pod0Container1", seedPod0Container1, con.CPU) + checkMemoryStats(t, "Pod0Container1", seedPod0Container1, infos["/pod0-c1"], con.Memory) + + assert.EqualValues(t, testTime(creationTime, seedPod0Infra).Unix(), ps.StartTime.Time.Unix()) + checkNetworkStats(t, "Pod0", seedPod0Infra, ps.Network) + + // Validate Pod1 Results + ps, found = indexPods[prf1] + assert.True(t, found) + assert.Len(t, ps.Containers, 1) + con = ps.Containers[0] + assert.Equal(t, cName10, con.Name) + checkCPUStats(t, "Pod1Container0", seedPod1Container, con.CPU) + checkMemoryStats(t, "Pod1Container0", seedPod1Container, infos["/pod1-c0"], con.Memory) + checkNetworkStats(t, "Pod1", seedPod1Infra, ps.Network) + + // Validate Pod2 Results + ps, found = indexPods[prf2] + assert.True(t, found) + assert.Len(t, ps.Containers, 1) + con = ps.Containers[0] + assert.Equal(t, cName20, con.Name) + checkCPUStats(t, "Pod2Container0", seedPod2Container, con.CPU) + checkMemoryStats(t, "Pod2Container0", seedPod2Container, infos["/pod2-c0"], con.Memory) + checkNetworkStats(t, "Pod2", seedPod2Infra, ps.Network) +} + +func TestImagesFsStats(t *testing.T) { + var ( + assert = assert.New(t) + mockCadvisor = new(cadvisortest.Mock) + mockRuntime = new(containertest.Mock) + + seed = 100 + options = cadvisorapiv2.RequestOptions{IdType: cadvisorapiv2.TypeName, Count: 2, Recursive: false} + imageFsInfo = getTestFsInfo(100) + containerInfo = map[string]cadvisorapiv2.ContainerInfo{"/": getTestContainerInfo(seed, "test-pod", "test-ns", "test-container")} + imageStats = &kubecontainer.ImageStats{TotalStorageBytes: 100} + ) + + mockCadvisor. + On("ImagesFsInfo").Return(imageFsInfo, nil). + On("ContainerInfoV2", "/", options).Return(containerInfo, nil) + mockRuntime. + On("ImageStats").Return(imageStats, nil) + + provider := newCadvisorStatsProvider(mockCadvisor, &fakeResourceAnalyzer{}, mockRuntime) + stats, err := provider.ImageFsStats() + assert.NoError(err) + + assert.Equal(stats.Time, metav1.NewTime(containerInfo["/"].Stats[0].Timestamp)) + assert.Equal(*stats.AvailableBytes, imageFsInfo.Available) + assert.Equal(*stats.CapacityBytes, imageFsInfo.Capacity) + assert.Equal(*stats.UsedBytes, imageStats.TotalStorageBytes) + assert.Equal(stats.InodesFree, imageFsInfo.InodesFree) + assert.Equal(stats.Inodes, imageFsInfo.Inodes) + assert.Equal(*stats.InodesUsed, *imageFsInfo.Inodes-*imageFsInfo.InodesFree) + + mockCadvisor.AssertExpectations(t) +} diff --git a/pkg/kubelet/stats/cri_stats_provider.go b/pkg/kubelet/stats/cri_stats_provider.go new file mode 100644 index 0000000000000..105fa853f916f --- /dev/null +++ b/pkg/kubelet/stats/cri_stats_provider.go @@ -0,0 +1,66 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package stats + +import ( + "fmt" + + internalapi "k8s.io/kubernetes/pkg/kubelet/apis/cri" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + "k8s.io/kubernetes/pkg/kubelet/cadvisor" + "k8s.io/kubernetes/pkg/kubelet/server/stats" +) + +// criStatsProvider implements the containerStatsProvider interface by getting +// the container stats from CRI. +type criStatsProvider struct { + // cadvisor is used to get the node root filesystem's stats (such as the + // capacity/available bytes/inodes) that will be populated in per container + // filesystem stats. + cadvisor cadvisor.Interface + // resourceAnalyzer is used to get the volume stats of the pods. + resourceAnalyzer stats.ResourceAnalyzer + // runtimeService is used to get the status and stats of the pods and its + // managed containers. + runtimeService internalapi.RuntimeService + // imageService is used to get the stats of the image filesystem. + imageService internalapi.ImageManagerService +} + +// newCRIStatsProvider returns a containerStatsProvider implementation that +// provides container stats using CRI. +func newCRIStatsProvider( + cadvisor cadvisor.Interface, + resourceAnalyzer stats.ResourceAnalyzer, + runtimeService internalapi.RuntimeService, + imageService internalapi.ImageManagerService, +) containerStatsProvider { + return &criStatsProvider{ + cadvisor: cadvisor, + resourceAnalyzer: resourceAnalyzer, + runtimeService: runtimeService, + imageService: imageService, + } +} + +func (p *criStatsProvider) ListPodStats() ([]statsapi.PodStats, error) { + return nil, fmt.Errorf("not implemented") +} + +func (p *criStatsProvider) ImageFsStats() (*statsapi.FsStats, error) { + return nil, fmt.Errorf("not implemented") +} diff --git a/pkg/kubelet/stats/helper.go b/pkg/kubelet/stats/helper.go new file mode 100644 index 0000000000000..091a0d51da1dc --- /dev/null +++ b/pkg/kubelet/stats/helper.go @@ -0,0 +1,248 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package stats + +import ( + "fmt" + "time" + + "github.com/golang/glog" + + cadvisorapiv1 "github.com/google/cadvisor/info/v1" + cadvisorapiv2 "github.com/google/cadvisor/info/v2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + "k8s.io/kubernetes/pkg/kubelet/cadvisor" + "k8s.io/kubernetes/pkg/kubelet/network" +) + +// cadvisorInfoToContainerStats returns the statsapi.ContainerStats converted +// from the container and filesystem info. +func cadvisorInfoToContainerStats(name string, info *cadvisorapiv2.ContainerInfo, rootFs, imageFs *cadvisorapiv2.FsInfo) *statsapi.ContainerStats { + result := &statsapi.ContainerStats{ + StartTime: metav1.NewTime(info.Spec.CreationTime), + Name: name, + } + + cstat, found := latestContainerStats(info) + if !found { + return result + } + + if info.Spec.HasCpu { + cpuStats := statsapi.CPUStats{ + Time: metav1.NewTime(cstat.Timestamp), + } + if cstat.CpuInst != nil { + cpuStats.UsageNanoCores = &cstat.CpuInst.Usage.Total + } + if cstat.Cpu != nil { + cpuStats.UsageCoreNanoSeconds = &cstat.Cpu.Usage.Total + } + result.CPU = &cpuStats + } + + if info.Spec.HasMemory { + pageFaults := cstat.Memory.ContainerData.Pgfault + majorPageFaults := cstat.Memory.ContainerData.Pgmajfault + result.Memory = &statsapi.MemoryStats{ + Time: metav1.NewTime(cstat.Timestamp), + UsageBytes: &cstat.Memory.Usage, + WorkingSetBytes: &cstat.Memory.WorkingSet, + RSSBytes: &cstat.Memory.RSS, + PageFaults: &pageFaults, + MajorPageFaults: &majorPageFaults, + } + // availableBytes = memory limit (if known) - workingset + if !isMemoryUnlimited(info.Spec.Memory.Limit) { + availableBytes := info.Spec.Memory.Limit - cstat.Memory.WorkingSet + result.Memory.AvailableBytes = &availableBytes + } + } + + // The container logs live on the node rootfs device + result.Logs = &statsapi.FsStats{ + Time: metav1.NewTime(cstat.Timestamp), + AvailableBytes: &rootFs.Available, + CapacityBytes: &rootFs.Capacity, + InodesFree: rootFs.InodesFree, + Inodes: rootFs.Inodes, + } + + if rootFs.Inodes != nil && rootFs.InodesFree != nil { + logsInodesUsed := *rootFs.Inodes - *rootFs.InodesFree + result.Logs.InodesUsed = &logsInodesUsed + } + + // The container rootFs lives on the imageFs devices (which may not be the node root fs) + result.Rootfs = &statsapi.FsStats{ + Time: metav1.NewTime(cstat.Timestamp), + AvailableBytes: &imageFs.Available, + CapacityBytes: &imageFs.Capacity, + InodesFree: imageFs.InodesFree, + Inodes: imageFs.Inodes, + } + + cfs := cstat.Filesystem + if cfs != nil { + if cfs.BaseUsageBytes != nil { + rootfsUsage := *cfs.BaseUsageBytes + result.Rootfs.UsedBytes = &rootfsUsage + if cfs.TotalUsageBytes != nil { + logsUsage := *cfs.TotalUsageBytes - *cfs.BaseUsageBytes + result.Logs.UsedBytes = &logsUsage + } + } + if cfs.InodeUsage != nil { + rootInodes := *cfs.InodeUsage + result.Rootfs.InodesUsed = &rootInodes + } + } + + result.UserDefinedMetrics = cadvisorInfoToUserDefinedMetrics(info) + return result +} + +// cadvisorInfoToNetworkStats returns the statsapi.NetworkStats converted from +// the container info from cadvisor. +func cadvisorInfoToNetworkStats(name string, info *cadvisorapiv2.ContainerInfo) *statsapi.NetworkStats { + if !info.Spec.HasNetwork { + return nil + } + cstat, found := latestContainerStats(info) + if !found { + return nil + } + for _, inter := range cstat.Network.Interfaces { + if inter.Name == network.DefaultInterfaceName { + return &statsapi.NetworkStats{ + Time: metav1.NewTime(cstat.Timestamp), + RxBytes: &inter.RxBytes, + RxErrors: &inter.RxErrors, + TxBytes: &inter.TxBytes, + TxErrors: &inter.TxErrors, + } + } + } + glog.V(4).Infof("Missing default interface %q for %s", network.DefaultInterfaceName, name) + return nil +} + +// cadvisorInfoToUserDefinedMetrics returns the statsapi.UserDefinedMetric +// converted from the container info from cadvisor. +func cadvisorInfoToUserDefinedMetrics(info *cadvisorapiv2.ContainerInfo) []statsapi.UserDefinedMetric { + type specVal struct { + ref statsapi.UserDefinedMetricDescriptor + valType cadvisorapiv1.DataType + time time.Time + value float64 + } + udmMap := map[string]*specVal{} + for _, spec := range info.Spec.CustomMetrics { + udmMap[spec.Name] = &specVal{ + ref: statsapi.UserDefinedMetricDescriptor{ + Name: spec.Name, + Type: statsapi.UserDefinedMetricType(spec.Type), + Units: spec.Units, + }, + valType: spec.Format, + } + } + for _, stat := range info.Stats { + for name, values := range stat.CustomMetrics { + specVal, ok := udmMap[name] + if !ok { + glog.Warningf("spec for custom metric %q is missing from cAdvisor output. Spec: %+v, Metrics: %+v", name, info.Spec, stat.CustomMetrics) + continue + } + for _, value := range values { + // Pick the most recent value + if value.Timestamp.Before(specVal.time) { + continue + } + specVal.time = value.Timestamp + specVal.value = value.FloatValue + if specVal.valType == cadvisorapiv1.IntType { + specVal.value = float64(value.IntValue) + } + } + } + } + var udm []statsapi.UserDefinedMetric + for _, specVal := range udmMap { + udm = append(udm, statsapi.UserDefinedMetric{ + UserDefinedMetricDescriptor: specVal.ref, + Time: metav1.NewTime(specVal.time), + Value: specVal.value, + }) + } + return udm +} + +// latestContainerStats returns the latest container stats from cadvisor, or nil if none exist +func latestContainerStats(info *cadvisorapiv2.ContainerInfo) (*cadvisorapiv2.ContainerStats, bool) { + stats := info.Stats + if len(stats) < 1 { + return nil, false + } + latest := stats[len(stats)-1] + if latest == nil { + return nil, false + } + return latest, true +} + +func isMemoryUnlimited(v uint64) bool { + // Size after which we consider memory to be "unlimited". This is not + // MaxInt64 due to rounding by the kernel. + // TODO: cadvisor should export this https://github.com/google/cadvisor/blob/master/metrics/prometheus.go#L596 + const maxMemorySize = uint64(1 << 62) + + return v > maxMemorySize +} + +// getCgroupInfo returns the information of the container with the specified +// containerName from cadvisor. +func getCgroupInfo(cadvisor cadvisor.Interface, containerName string) (*cadvisorapiv2.ContainerInfo, error) { + infoMap, err := cadvisor.ContainerInfoV2(containerName, cadvisorapiv2.RequestOptions{ + IdType: cadvisorapiv2.TypeName, + Count: 2, // 2 samples are needed to compute "instantaneous" CPU + Recursive: false, + }) + if err != nil { + return nil, fmt.Errorf("failed to get container info for %q: %v", containerName, err) + } + if len(infoMap) != 1 { + return nil, fmt.Errorf("unexpected number of containers: %v", len(infoMap)) + } + info := infoMap[containerName] + return &info, nil +} + +// getCgroupStats returns the latest stats of the container having the +// specified containerName from cadvisor. +func getCgroupStats(cadvisor cadvisor.Interface, containerName string) (*cadvisorapiv2.ContainerStats, error) { + info, err := getCgroupInfo(cadvisor, containerName) + if err != nil { + return nil, err + } + stats, found := latestContainerStats(info) + if !found { + return nil, fmt.Errorf("failed to get latest stats from container info for %q", containerName) + } + return stats, nil +} diff --git a/pkg/kubelet/stats/helper_test.go b/pkg/kubelet/stats/helper_test.go new file mode 100644 index 0000000000000..c1b13423cbb75 --- /dev/null +++ b/pkg/kubelet/stats/helper_test.go @@ -0,0 +1,99 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package stats + +import ( + "testing" + "time" + + cadvisorapiv1 "github.com/google/cadvisor/info/v1" + cadvisorapiv2 "github.com/google/cadvisor/info/v2" + "github.com/stretchr/testify/assert" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" +) + +func TestCustomMetrics(t *testing.T) { + spec := []cadvisorapiv1.MetricSpec{ + { + Name: "qos", + Type: cadvisorapiv1.MetricGauge, + Format: cadvisorapiv1.IntType, + Units: "per second", + }, + { + Name: "cpuLoad", + Type: cadvisorapiv1.MetricCumulative, + Format: cadvisorapiv1.FloatType, + Units: "count", + }, + } + timestamp1 := time.Now() + timestamp2 := time.Now().Add(time.Minute) + metrics := map[string][]cadvisorapiv1.MetricVal{ + "qos": { + { + Timestamp: timestamp1, + IntValue: 10, + }, + { + Timestamp: timestamp2, + IntValue: 100, + }, + }, + "cpuLoad": { + { + Timestamp: timestamp1, + FloatValue: 1.2, + }, + { + Timestamp: timestamp2, + FloatValue: 2.1, + }, + }, + } + cInfo := cadvisorapiv2.ContainerInfo{ + Spec: cadvisorapiv2.ContainerSpec{ + CustomMetrics: spec, + }, + Stats: []*cadvisorapiv2.ContainerStats{ + { + CustomMetrics: metrics, + }, + }, + } + assert.Contains(t, cadvisorInfoToUserDefinedMetrics(&cInfo), + statsapi.UserDefinedMetric{ + UserDefinedMetricDescriptor: statsapi.UserDefinedMetricDescriptor{ + Name: "qos", + Type: statsapi.MetricGauge, + Units: "per second", + }, + Time: metav1.NewTime(timestamp2), + Value: 100, + }, + statsapi.UserDefinedMetric{ + UserDefinedMetricDescriptor: statsapi.UserDefinedMetricDescriptor{ + Name: "cpuLoad", + Type: statsapi.MetricCumulative, + Units: "count", + }, + Time: metav1.NewTime(timestamp2), + Value: 2.1, + }) +} diff --git a/pkg/kubelet/stats/stats_provider.go b/pkg/kubelet/stats/stats_provider.go new file mode 100644 index 0000000000000..af7e9d418bfbd --- /dev/null +++ b/pkg/kubelet/stats/stats_provider.go @@ -0,0 +1,175 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package stats + +import ( + "fmt" + + cadvisorapiv1 "github.com/google/cadvisor/info/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + internalapi "k8s.io/kubernetes/pkg/kubelet/apis/cri" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + "k8s.io/kubernetes/pkg/kubelet/cadvisor" + kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" + kubepod "k8s.io/kubernetes/pkg/kubelet/pod" + "k8s.io/kubernetes/pkg/kubelet/server/stats" +) + +// NewCRIStatsProvider returns a StatsProvider that provides the node stats +// from cAdvisor and the container stats from CRI. +func NewCRIStatsProvider( + cadvisor cadvisor.Interface, + resourceAnalyzer stats.ResourceAnalyzer, + podManager kubepod.Manager, + runtimeCache kubecontainer.RuntimeCache, + runtimeService internalapi.RuntimeService, + imageService internalapi.ImageManagerService, +) *StatsProvider { + return newStatsProvider(cadvisor, podManager, runtimeCache, newCRIStatsProvider(cadvisor, resourceAnalyzer, runtimeService, imageService)) +} + +// NewCadvisorStatsProvider returns a containerStatsProvider that provides both +// the node and the container stats from cAdvisor. +func NewCadvisorStatsProvider( + cadvisor cadvisor.Interface, + resourceAnalyzer stats.ResourceAnalyzer, + podManager kubepod.Manager, + runtimeCache kubecontainer.RuntimeCache, + imageService kubecontainer.ImageService, +) *StatsProvider { + return newStatsProvider(cadvisor, podManager, runtimeCache, newCadvisorStatsProvider(cadvisor, resourceAnalyzer, imageService)) +} + +// newStatsProvider returns a new StatsProvider that provides node stats from +// cAdvisor and the container stats using the containerStatsProvider. +func newStatsProvider( + cadvisor cadvisor.Interface, + podManager kubepod.Manager, + runtimeCache kubecontainer.RuntimeCache, + containerStatsProvider containerStatsProvider, +) *StatsProvider { + return &StatsProvider{ + cadvisor: cadvisor, + podManager: podManager, + runtimeCache: runtimeCache, + containerStatsProvider: containerStatsProvider, + } +} + +// StatsProvider provides the stats of the node and the pod-managed containers. +type StatsProvider struct { + cadvisor cadvisor.Interface + podManager kubepod.Manager + runtimeCache kubecontainer.RuntimeCache + containerStatsProvider +} + +// containerStatsProvider is an interface that provides the stats of the +// containers managed by pods. +type containerStatsProvider interface { + ListPodStats() ([]statsapi.PodStats, error) + ImageFsStats() (*statsapi.FsStats, error) +} + +// GetCgroupStats returns the stats of the cgroup with the cgroupName. +func (p *StatsProvider) GetCgroupStats(cgroupName string) (*statsapi.ContainerStats, *statsapi.NetworkStats, error) { + info, err := getCgroupInfo(p.cadvisor, cgroupName) + if err != nil { + return nil, nil, fmt.Errorf("failed to get cgroup stats for %q: %v", cgroupName, err) + } + rootFsInfo, err := p.cadvisor.RootFsInfo() + if err != nil { + return nil, nil, fmt.Errorf("failed to get rootFs info: %v", err) + } + imageFsInfo, err := p.cadvisor.ImagesFsInfo() + if err != nil { + return nil, nil, fmt.Errorf("failed to get imageFs info: %v", err) + } + s := cadvisorInfoToContainerStats(cgroupName, info, &rootFsInfo, &imageFsInfo) + n := cadvisorInfoToNetworkStats(cgroupName, info) + return s, n, nil +} + +// RootFsStats returns the stats of the node root filesystem. +func (p *StatsProvider) RootFsStats() (*statsapi.FsStats, error) { + rootFsInfo, err := p.cadvisor.RootFsInfo() + if err != nil { + return nil, fmt.Errorf("failed to get rootFs info: %v", err) + } + + var nodeFsInodesUsed *uint64 + if rootFsInfo.Inodes != nil && rootFsInfo.InodesFree != nil { + nodeFsIU := *rootFsInfo.Inodes - *rootFsInfo.InodesFree + nodeFsInodesUsed = &nodeFsIU + } + + // Get the root container stats's timestamp, which will be used as the + // imageFs stats timestamp. + rootStats, err := getCgroupStats(p.cadvisor, "/") + if err != nil { + return nil, fmt.Errorf("failed to get root container stats: %v", err) + } + + return &statsapi.FsStats{ + Time: metav1.NewTime(rootStats.Timestamp), + AvailableBytes: &rootFsInfo.Available, + CapacityBytes: &rootFsInfo.Capacity, + UsedBytes: &rootFsInfo.Usage, + InodesFree: rootFsInfo.InodesFree, + Inodes: rootFsInfo.Inodes, + InodesUsed: nodeFsInodesUsed, + }, nil +} + +// GetContainerInfo returns stats (from cAdvisor) for a container. +func (p *StatsProvider) GetContainerInfo(podFullName string, podUID types.UID, containerName string, req *cadvisorapiv1.ContainerInfoRequest) (*cadvisorapiv1.ContainerInfo, error) { + // Resolve and type convert back again. + // We need the static pod UID but the kubecontainer API works with types.UID. + podUID = types.UID(p.podManager.TranslatePodUID(podUID)) + + pods, err := p.runtimeCache.GetPods() + if err != nil { + return nil, err + } + pod := kubecontainer.Pods(pods).FindPod(podFullName, podUID) + container := pod.FindContainerByName(containerName) + if container == nil { + return nil, kubecontainer.ErrContainerNotFound + } + + ci, err := p.cadvisor.DockerContainer(container.ID.ID, req) + if err != nil { + return nil, err + } + return &ci, nil +} + +// GetRawContainerInfo returns the stats (from cadvisor) for a non-Kubernetes +// container. +func (p *StatsProvider) GetRawContainerInfo(containerName string, req *cadvisorapiv1.ContainerInfoRequest, subcontainers bool) (map[string]*cadvisorapiv1.ContainerInfo, error) { + if subcontainers { + return p.cadvisor.SubcontainerInfo(containerName, req) + } + containerInfo, err := p.cadvisor.ContainerInfo(containerName, req) + if err != nil { + return nil, err + } + return map[string]*cadvisorapiv1.ContainerInfo{ + containerInfo.Name: containerInfo, + }, nil +} diff --git a/pkg/kubelet/stats/stats_provider_test.go b/pkg/kubelet/stats/stats_provider_test.go new file mode 100644 index 0000000000000..532a43292e3bc --- /dev/null +++ b/pkg/kubelet/stats/stats_provider_test.go @@ -0,0 +1,579 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package stats + +import ( + "fmt" + "testing" + "time" + + cadvisorapiv1 "github.com/google/cadvisor/info/v1" + cadvisorapiv2 "github.com/google/cadvisor/info/v2" + fuzz "github.com/google/gofuzz" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing" + kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" + kubecontainertest "k8s.io/kubernetes/pkg/kubelet/container/testing" + kubepodtest "k8s.io/kubernetes/pkg/kubelet/pod/testing" + serverstats "k8s.io/kubernetes/pkg/kubelet/server/stats" + kubetypes "k8s.io/kubernetes/pkg/kubelet/types" +) + +const ( + // Offsets from seed value in generated container stats. + offsetCPUUsageCores = iota + offsetCPUUsageCoreSeconds + offsetMemPageFaults + offsetMemMajorPageFaults + offsetMemUsageBytes + offsetMemRSSBytes + offsetMemWorkingSetBytes + offsetNetRxBytes + offsetNetRxErrors + offsetNetTxBytes + offsetNetTxErrors + offsetFsCapacity + offsetFsAvailable + offsetFsUsage + offsetFsInodes + offsetFsInodesFree + offsetFsTotalUsageBytes + offsetFsBaseUsageBytes + offsetFsInodeUsage +) + +var ( + timestamp = time.Now() + creationTime = timestamp.Add(-5 * time.Minute) +) + +func TestGetCgroupStats(t *testing.T) { + const ( + cgroupName = "test-cgroup-name" + rootFsInfoSeed = 1000 + imageFsInfoSeed = 2000 + containerInfoSeed = 3000 + ) + var ( + mockCadvisor = new(cadvisortest.Mock) + mockPodManager = new(kubepodtest.MockManager) + mockRuntimeCache = new(kubecontainertest.MockRuntimeCache) + + assert = assert.New(t) + options = cadvisorapiv2.RequestOptions{IdType: cadvisorapiv2.TypeName, Count: 2, Recursive: false} + + rootFsInfo = getTestFsInfo(rootFsInfoSeed) + imageFsInfo = getTestFsInfo(imageFsInfoSeed) + containerInfo = getTestContainerInfo(containerInfoSeed, "test-pod", "test-ns", "test-container") + containerInfoMap = map[string]cadvisorapiv2.ContainerInfo{cgroupName: containerInfo} + ) + + mockCadvisor. + On("RootFsInfo").Return(rootFsInfo, nil). + On("ImagesFsInfo").Return(imageFsInfo, nil). + On("ContainerInfoV2", cgroupName, options).Return(containerInfoMap, nil) + + provider := newStatsProvider(mockCadvisor, mockPodManager, mockRuntimeCache, fakeContainerStatsProvider{}) + cs, ns, err := provider.GetCgroupStats(cgroupName) + assert.NoError(err) + + checkCPUStats(t, "", containerInfoSeed, cs.CPU) + checkMemoryStats(t, "", containerInfoSeed, containerInfo, cs.Memory) + checkFsStats(t, "", imageFsInfoSeed, cs.Rootfs) + checkFsStats(t, "", rootFsInfoSeed, cs.Logs) + checkNetworkStats(t, "", containerInfoSeed, ns) + + assert.Equal(cs.Name, cgroupName) + assert.Equal(cs.StartTime, metav1.NewTime(containerInfo.Spec.CreationTime)) + + assert.Equal(cs.Rootfs.Time, metav1.NewTime(containerInfo.Stats[0].Timestamp)) + assert.Equal(*cs.Rootfs.UsedBytes, *containerInfo.Stats[0].Filesystem.BaseUsageBytes) + assert.Equal(*cs.Rootfs.InodesUsed, *containerInfo.Stats[0].Filesystem.InodeUsage) + + assert.Equal(cs.Logs.Time, metav1.NewTime(containerInfo.Stats[0].Timestamp)) + assert.Equal(*cs.Logs.UsedBytes, *containerInfo.Stats[0].Filesystem.TotalUsageBytes-*containerInfo.Stats[0].Filesystem.BaseUsageBytes) + assert.Equal(*cs.Logs.InodesUsed, *rootFsInfo.Inodes-*rootFsInfo.InodesFree) + + mockCadvisor.AssertExpectations(t) +} + +func TestRootFsStats(t *testing.T) { + const ( + rootFsInfoSeed = 1000 + containerInfoSeed = 2000 + ) + var ( + mockCadvisor = new(cadvisortest.Mock) + mockPodManager = new(kubepodtest.MockManager) + mockRuntimeCache = new(kubecontainertest.MockRuntimeCache) + + assert = assert.New(t) + options = cadvisorapiv2.RequestOptions{IdType: cadvisorapiv2.TypeName, Count: 2, Recursive: false} + + rootFsInfo = getTestFsInfo(rootFsInfoSeed) + containerInfo = getTestContainerInfo(containerInfoSeed, "test-pod", "test-ns", "test-container") + containerInfoMap = map[string]cadvisorapiv2.ContainerInfo{"/": containerInfo} + ) + + mockCadvisor. + On("RootFsInfo").Return(rootFsInfo, nil). + On("ContainerInfoV2", "/", options).Return(containerInfoMap, nil) + + provider := newStatsProvider(mockCadvisor, mockPodManager, mockRuntimeCache, fakeContainerStatsProvider{}) + stats, err := provider.RootFsStats() + assert.NoError(err) + + checkFsStats(t, "", rootFsInfoSeed, stats) + + assert.Equal(stats.Time, metav1.NewTime(containerInfo.Stats[0].Timestamp)) + assert.Equal(*stats.UsedBytes, rootFsInfo.Usage) + assert.Equal(*stats.InodesUsed, *rootFsInfo.Inodes-*rootFsInfo.InodesFree) + + mockCadvisor.AssertExpectations(t) +} + +func TestGetContainerInfo(t *testing.T) { + cadvisorAPIFailure := fmt.Errorf("cAdvisor failure") + runtimeError := fmt.Errorf("List containers error") + tests := []struct { + name string + containerID string + containerPath string + cadvisorContainerInfo cadvisorapiv1.ContainerInfo + runtimeError error + podList []*kubecontainer.Pod + requestedPodFullName string + requestedPodUID types.UID + requestedContainerName string + expectDockerContainerCall bool + mockError error + expectedError error + expectStats bool + }{ + { + name: "get container info", + containerID: "ab2cdf", + containerPath: "/docker/ab2cdf", + cadvisorContainerInfo: cadvisorapiv1.ContainerInfo{ + ContainerReference: cadvisorapiv1.ContainerReference{ + Name: "/docker/ab2cdf", + }, + }, + runtimeError: nil, + podList: []*kubecontainer.Pod{ + { + ID: "12345678", + Name: "qux", + Namespace: "ns", + Containers: []*kubecontainer.Container{ + { + Name: "foo", + ID: kubecontainer.ContainerID{Type: "test", ID: "ab2cdf"}, + }, + }, + }, + }, + requestedPodFullName: "qux_ns", + requestedPodUID: "", + requestedContainerName: "foo", + expectDockerContainerCall: true, + mockError: nil, + expectedError: nil, + expectStats: true, + }, + { + name: "get container info when cadvisor failed", + containerID: "ab2cdf", + containerPath: "/docker/ab2cdf", + cadvisorContainerInfo: cadvisorapiv1.ContainerInfo{}, + runtimeError: nil, + podList: []*kubecontainer.Pod{ + { + ID: "uuid", + Name: "qux", + Namespace: "ns", + Containers: []*kubecontainer.Container{ + { + Name: "foo", + ID: kubecontainer.ContainerID{Type: "test", ID: "ab2cdf"}, + }, + }, + }, + }, + requestedPodFullName: "qux_ns", + requestedPodUID: "uuid", + requestedContainerName: "foo", + expectDockerContainerCall: true, + mockError: cadvisorAPIFailure, + expectedError: cadvisorAPIFailure, + expectStats: false, + }, + { + name: "get container info on non-existent container", + containerID: "", + containerPath: "", + cadvisorContainerInfo: cadvisorapiv1.ContainerInfo{}, + runtimeError: nil, + podList: []*kubecontainer.Pod{}, + requestedPodFullName: "qux", + requestedPodUID: "", + requestedContainerName: "foo", + expectDockerContainerCall: false, + mockError: nil, + expectedError: kubecontainer.ErrContainerNotFound, + expectStats: false, + }, + { + name: "get container info when container runtime failed", + containerID: "", + containerPath: "", + cadvisorContainerInfo: cadvisorapiv1.ContainerInfo{}, + runtimeError: runtimeError, + podList: []*kubecontainer.Pod{}, + requestedPodFullName: "qux", + requestedPodUID: "", + requestedContainerName: "foo", + mockError: nil, + expectedError: runtimeError, + expectStats: false, + }, + { + name: "get container info with no containers", + containerID: "", + containerPath: "", + cadvisorContainerInfo: cadvisorapiv1.ContainerInfo{}, + runtimeError: nil, + podList: []*kubecontainer.Pod{}, + requestedPodFullName: "qux_ns", + requestedPodUID: "", + requestedContainerName: "foo", + mockError: nil, + expectedError: kubecontainer.ErrContainerNotFound, + expectStats: false, + }, + { + name: "get container info with no matching containers", + containerID: "", + containerPath: "", + cadvisorContainerInfo: cadvisorapiv1.ContainerInfo{}, + runtimeError: nil, + podList: []*kubecontainer.Pod{ + { + ID: "12345678", + Name: "qux", + Namespace: "ns", + Containers: []*kubecontainer.Container{ + { + Name: "bar", + ID: kubecontainer.ContainerID{Type: "test", ID: "fakeID"}, + }, + }, + }, + }, + requestedPodFullName: "qux_ns", + requestedPodUID: "", + requestedContainerName: "foo", + mockError: nil, + expectedError: kubecontainer.ErrContainerNotFound, + expectStats: false, + }, + } + + for _, tc := range tests { + var ( + mockCadvisor = new(cadvisortest.Mock) + mockPodManager = new(kubepodtest.MockManager) + mockRuntimeCache = new(kubecontainertest.MockRuntimeCache) + + cadvisorReq = &cadvisorapiv1.ContainerInfoRequest{} + ) + + mockPodManager.On("TranslatePodUID", tc.requestedPodUID).Return(kubetypes.ResolvedPodUID(tc.requestedPodUID)) + mockRuntimeCache.On("GetPods").Return(tc.podList, tc.runtimeError) + if tc.expectDockerContainerCall { + mockCadvisor.On("DockerContainer", tc.containerID, cadvisorReq).Return(tc.cadvisorContainerInfo, tc.mockError) + } + + provider := newStatsProvider(mockCadvisor, mockPodManager, mockRuntimeCache, fakeContainerStatsProvider{}) + stats, err := provider.GetContainerInfo(tc.requestedPodFullName, tc.requestedPodUID, tc.requestedContainerName, cadvisorReq) + assert.Equal(t, tc.expectedError, err) + + if tc.expectStats { + require.NotNil(t, stats) + } + mockCadvisor.AssertExpectations(t) + } +} + +func TestGetRawContainerInfoRoot(t *testing.T) { + var ( + mockCadvisor = new(cadvisortest.Mock) + mockPodManager = new(kubepodtest.MockManager) + mockRuntimeCache = new(kubecontainertest.MockRuntimeCache) + + cadvisorReq = &cadvisorapiv1.ContainerInfoRequest{} + containerPath = "/" + containerInfo = &cadvisorapiv1.ContainerInfo{ + ContainerReference: cadvisorapiv1.ContainerReference{ + Name: containerPath, + }, + } + ) + + mockCadvisor.On("ContainerInfo", containerPath, cadvisorReq).Return(containerInfo, nil) + + provider := newStatsProvider(mockCadvisor, mockPodManager, mockRuntimeCache, fakeContainerStatsProvider{}) + _, err := provider.GetRawContainerInfo(containerPath, cadvisorReq, false) + assert.NoError(t, err) + mockCadvisor.AssertExpectations(t) +} + +func TestGetRawContainerInfoSubcontainers(t *testing.T) { + var ( + mockCadvisor = new(cadvisortest.Mock) + mockPodManager = new(kubepodtest.MockManager) + mockRuntimeCache = new(kubecontainertest.MockRuntimeCache) + + cadvisorReq = &cadvisorapiv1.ContainerInfoRequest{} + containerPath = "/kubelet" + containerInfo = map[string]*cadvisorapiv1.ContainerInfo{ + containerPath: { + ContainerReference: cadvisorapiv1.ContainerReference{ + Name: containerPath, + }, + }, + "/kubelet/sub": { + ContainerReference: cadvisorapiv1.ContainerReference{ + Name: "/kubelet/sub", + }, + }, + } + ) + + mockCadvisor.On("SubcontainerInfo", containerPath, cadvisorReq).Return(containerInfo, nil) + + provider := newStatsProvider(mockCadvisor, mockPodManager, mockRuntimeCache, fakeContainerStatsProvider{}) + result, err := provider.GetRawContainerInfo(containerPath, cadvisorReq, true) + assert.NoError(t, err) + assert.Len(t, result, 2) + mockCadvisor.AssertExpectations(t) +} + +func getTerminatedContainerInfo(seed int, podName string, podNamespace string, containerName string) cadvisorapiv2.ContainerInfo { + cinfo := getTestContainerInfo(seed, podName, podNamespace, containerName) + cinfo.Stats[0].Memory.RSS = 0 + cinfo.Stats[0].CpuInst.Usage.Total = 0 + return cinfo +} + +func getTestContainerInfo(seed int, podName string, podNamespace string, containerName string) cadvisorapiv2.ContainerInfo { + labels := map[string]string{} + if podName != "" { + labels = map[string]string{ + "io.kubernetes.pod.name": podName, + "io.kubernetes.pod.uid": "UID" + podName, + "io.kubernetes.pod.namespace": podNamespace, + "io.kubernetes.container.name": containerName, + } + } + // by default, kernel will set memory.limit_in_bytes to 1 << 63 if not bounded + unlimitedMemory := uint64(1 << 63) + spec := cadvisorapiv2.ContainerSpec{ + CreationTime: testTime(creationTime, seed), + HasCpu: true, + HasMemory: true, + HasNetwork: true, + Labels: labels, + Memory: cadvisorapiv2.MemorySpec{ + Limit: unlimitedMemory, + }, + CustomMetrics: generateCustomMetricSpec(), + } + + totalUsageBytes := uint64(seed + offsetFsTotalUsageBytes) + baseUsageBytes := uint64(seed + offsetFsBaseUsageBytes) + inodeUsage := uint64(seed + offsetFsInodeUsage) + + stats := cadvisorapiv2.ContainerStats{ + Timestamp: testTime(timestamp, seed), + Cpu: &cadvisorapiv1.CpuStats{}, + CpuInst: &cadvisorapiv2.CpuInstStats{}, + Memory: &cadvisorapiv1.MemoryStats{ + Usage: uint64(seed + offsetMemUsageBytes), + WorkingSet: uint64(seed + offsetMemWorkingSetBytes), + RSS: uint64(seed + offsetMemRSSBytes), + ContainerData: cadvisorapiv1.MemoryStatsMemoryData{ + Pgfault: uint64(seed + offsetMemPageFaults), + Pgmajfault: uint64(seed + offsetMemMajorPageFaults), + }, + }, + Network: &cadvisorapiv2.NetworkStats{ + Interfaces: []cadvisorapiv1.InterfaceStats{{ + Name: "eth0", + RxBytes: uint64(seed + offsetNetRxBytes), + RxErrors: uint64(seed + offsetNetRxErrors), + TxBytes: uint64(seed + offsetNetTxBytes), + TxErrors: uint64(seed + offsetNetTxErrors), + }, { + Name: "cbr0", + RxBytes: 100, + RxErrors: 100, + TxBytes: 100, + TxErrors: 100, + }}, + }, + CustomMetrics: generateCustomMetrics(spec.CustomMetrics), + Filesystem: &cadvisorapiv2.FilesystemStats{ + TotalUsageBytes: &totalUsageBytes, + BaseUsageBytes: &baseUsageBytes, + InodeUsage: &inodeUsage, + }, + } + stats.Cpu.Usage.Total = uint64(seed + offsetCPUUsageCoreSeconds) + stats.CpuInst.Usage.Total = uint64(seed + offsetCPUUsageCores) + return cadvisorapiv2.ContainerInfo{ + Spec: spec, + Stats: []*cadvisorapiv2.ContainerStats{&stats}, + } +} + +func getTestFsInfo(seed int) cadvisorapiv2.FsInfo { + var ( + inodes = uint64(seed + offsetFsInodes) + inodesFree = uint64(seed + offsetFsInodesFree) + ) + return cadvisorapiv2.FsInfo{ + Device: "test-device", + Mountpoint: "test-mount-point", + Capacity: uint64(seed + offsetFsCapacity), + Available: uint64(seed + offsetFsAvailable), + Usage: uint64(seed + offsetFsUsage), + Inodes: &inodes, + InodesFree: &inodesFree, + } +} + +func generateCustomMetricSpec() []cadvisorapiv1.MetricSpec { + f := fuzz.New().NilChance(0).Funcs( + func(e *cadvisorapiv1.MetricSpec, c fuzz.Continue) { + c.Fuzz(&e.Name) + switch c.Intn(3) { + case 0: + e.Type = cadvisorapiv1.MetricGauge + case 1: + e.Type = cadvisorapiv1.MetricCumulative + case 2: + e.Type = cadvisorapiv1.MetricDelta + } + switch c.Intn(2) { + case 0: + e.Format = cadvisorapiv1.IntType + case 1: + e.Format = cadvisorapiv1.FloatType + } + c.Fuzz(&e.Units) + }) + var ret []cadvisorapiv1.MetricSpec + f.Fuzz(&ret) + return ret +} + +func generateCustomMetrics(spec []cadvisorapiv1.MetricSpec) map[string][]cadvisorapiv1.MetricVal { + ret := map[string][]cadvisorapiv1.MetricVal{} + for _, metricSpec := range spec { + f := fuzz.New().NilChance(0).Funcs( + func(e *cadvisorapiv1.MetricVal, c fuzz.Continue) { + switch metricSpec.Format { + case cadvisorapiv1.IntType: + c.Fuzz(&e.IntValue) + case cadvisorapiv1.FloatType: + c.Fuzz(&e.FloatValue) + } + }) + + var metrics []cadvisorapiv1.MetricVal + f.Fuzz(&metrics) + ret[metricSpec.Name] = metrics + } + return ret +} + +func testTime(base time.Time, seed int) time.Time { + return base.Add(time.Duration(seed) * time.Second) +} + +func checkNetworkStats(t *testing.T, label string, seed int, stats *statsapi.NetworkStats) { + assert.NotNil(t, stats) + assert.EqualValues(t, testTime(timestamp, seed).Unix(), stats.Time.Time.Unix(), label+".Net.Time") + assert.EqualValues(t, seed+offsetNetRxBytes, *stats.RxBytes, label+".Net.RxBytes") + assert.EqualValues(t, seed+offsetNetRxErrors, *stats.RxErrors, label+".Net.RxErrors") + assert.EqualValues(t, seed+offsetNetTxBytes, *stats.TxBytes, label+".Net.TxBytes") + assert.EqualValues(t, seed+offsetNetTxErrors, *stats.TxErrors, label+".Net.TxErrors") +} + +func checkCPUStats(t *testing.T, label string, seed int, stats *statsapi.CPUStats) { + assert.EqualValues(t, testTime(timestamp, seed).Unix(), stats.Time.Time.Unix(), label+".CPU.Time") + assert.EqualValues(t, seed+offsetCPUUsageCores, *stats.UsageNanoCores, label+".CPU.UsageCores") + assert.EqualValues(t, seed+offsetCPUUsageCoreSeconds, *stats.UsageCoreNanoSeconds, label+".CPU.UsageCoreSeconds") +} + +func checkMemoryStats(t *testing.T, label string, seed int, info cadvisorapiv2.ContainerInfo, stats *statsapi.MemoryStats) { + assert.EqualValues(t, testTime(timestamp, seed).Unix(), stats.Time.Time.Unix(), label+".Mem.Time") + assert.EqualValues(t, seed+offsetMemUsageBytes, *stats.UsageBytes, label+".Mem.UsageBytes") + assert.EqualValues(t, seed+offsetMemWorkingSetBytes, *stats.WorkingSetBytes, label+".Mem.WorkingSetBytes") + assert.EqualValues(t, seed+offsetMemRSSBytes, *stats.RSSBytes, label+".Mem.RSSBytes") + assert.EqualValues(t, seed+offsetMemPageFaults, *stats.PageFaults, label+".Mem.PageFaults") + assert.EqualValues(t, seed+offsetMemMajorPageFaults, *stats.MajorPageFaults, label+".Mem.MajorPageFaults") + if !info.Spec.HasMemory || isMemoryUnlimited(info.Spec.Memory.Limit) { + assert.Nil(t, stats.AvailableBytes, label+".Mem.AvailableBytes") + } else { + expected := info.Spec.Memory.Limit - *stats.WorkingSetBytes + assert.EqualValues(t, expected, *stats.AvailableBytes, label+".Mem.AvailableBytes") + } +} + +func checkFsStats(t *testing.T, label string, seed int, stats *statsapi.FsStats) { + assert.EqualValues(t, seed+offsetFsCapacity, *stats.CapacityBytes, label+".CapacityBytes") + assert.EqualValues(t, seed+offsetFsAvailable, *stats.AvailableBytes, label+".AvailableBytes") + assert.EqualValues(t, seed+offsetFsInodes, *stats.Inodes, label+".Inodes") + assert.EqualValues(t, seed+offsetFsInodesFree, *stats.InodesFree, label+".InodesFree") +} + +type fakeResourceAnalyzer struct { + podVolumeStats serverstats.PodVolumeStats +} + +func (o *fakeResourceAnalyzer) Start() {} +func (o *fakeResourceAnalyzer) Get() (*statsapi.Summary, error) { return nil, nil } +func (o *fakeResourceAnalyzer) GetPodVolumeStats(uid types.UID) (serverstats.PodVolumeStats, bool) { + return o.podVolumeStats, true +} + +type fakeContainerStatsProvider struct { +} + +func (p fakeContainerStatsProvider) ListPodStats() ([]statsapi.PodStats, error) { + return nil, fmt.Errorf("not implemented") +} +func (p fakeContainerStatsProvider) ImageFsStats() (*statsapi.FsStats, error) { + return nil, fmt.Errorf("not implemented") +} From 6918ab1d70035306eec02eb826c4b39ecda90f07 Mon Sep 17 00:00:00 2001 From: Michael Taufen Date: Fri, 25 Aug 2017 10:16:26 -0700 Subject: [PATCH 331/403] fix ReadOnlyPort, HealthzPort, CAdvisorPort defaulting/documentation The ReadOnlyPort defaulting prevented passing 0 to diable via the KubeletConfiguraiton struct. The HealthzPort defaulting prevented passing 0 to disable via the KubeletConfiguration struct. The documentation also failed to mention this, but the check is performed in code. The CAdvisorPort documentation failed to mention that you can pass 0 to disable. --- cmd/kubelet/app/options/options.go | 4 ++-- pkg/kubelet/apis/kubeletconfig/types.go | 4 ++-- .../apis/kubeletconfig/v1alpha1/defaults.go | 8 ++++---- .../apis/kubeletconfig/v1alpha1/types.go | 8 ++++---- .../v1alpha1/zz_generated.conversion.go | 16 ++++++++++++---- .../v1alpha1/zz_generated.deepcopy.go | 18 ++++++++++++++++++ 6 files changed, 42 insertions(+), 16 deletions(-) diff --git a/cmd/kubelet/app/options/options.go b/cmd/kubelet/app/options/options.go index ad60d5fa83c3a..e2722b44394ed 100644 --- a/cmd/kubelet/app/options/options.go +++ b/cmd/kubelet/app/options/options.go @@ -292,8 +292,8 @@ func AddKubeletConfigFlags(fs *pflag.FlagSet, c *kubeletconfig.KubeletConfigurat fs.MarkDeprecated("maximum-dead-containers-per-container", "Use --eviction-hard or --eviction-soft instead. Will be removed in a future version.") fs.Int32Var(&c.MaxContainerCount, "maximum-dead-containers", c.MaxContainerCount, "Maximum number of old instances of containers to retain globally. Each container takes up some disk space. To disable, set to a negative number.") fs.MarkDeprecated("maximum-dead-containers", "Use --eviction-hard or --eviction-soft instead. Will be removed in a future version.") - fs.Int32Var(&c.CAdvisorPort, "cadvisor-port", c.CAdvisorPort, "The port of the localhost cAdvisor endpoint") - fs.Int32Var(&c.HealthzPort, "healthz-port", c.HealthzPort, "The port of the localhost healthz endpoint") + fs.Int32Var(&c.CAdvisorPort, "cadvisor-port", c.CAdvisorPort, "The port of the localhost cAdvisor endpoint (set to 0 to disable)") + fs.Int32Var(&c.HealthzPort, "healthz-port", c.HealthzPort, "The port of the localhost healthz endpoint (set to 0 to disable)") fs.Var(componentconfig.IPVar{Val: &c.HealthzBindAddress}, "healthz-bind-address", "The IP address for the healthz server to serve on. (set to 0.0.0.0 for all interfaces)") fs.Int32Var(&c.OOMScoreAdj, "oom-score-adj", c.OOMScoreAdj, "The oom-score-adj value for kubelet process. Values must be within the range [-1000, 1000]") fs.BoolVar(&c.RegisterNode, "register-node", c.RegisterNode, "Register the node with the apiserver. If --kubeconfig is not provided, this flag is irrelevant, as the Kubelet won't have an apiserver to register with. Default=true.") diff --git a/pkg/kubelet/apis/kubeletconfig/types.go b/pkg/kubelet/apis/kubeletconfig/types.go index c46750eb418af..2f44149bcf716 100644 --- a/pkg/kubelet/apis/kubeletconfig/types.go +++ b/pkg/kubelet/apis/kubeletconfig/types.go @@ -140,9 +140,9 @@ type KubeletConfiguration struct { // maxContainerCount is the maximum number of old instances of containers // to retain globally. Each container takes up some disk space. MaxContainerCount int32 - // cAdvisorPort is the port of the localhost cAdvisor endpoint + // cAdvisorPort is the port of the localhost cAdvisor endpoint (set to 0 to disable) CAdvisorPort int32 - // healthzPort is the port of the localhost healthz endpoint + // healthzPort is the port of the localhost healthz endpoint (set to 0 to disable) HealthzPort int32 // healthzBindAddress is the IP address for the healthz server to serve // on. diff --git a/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go b/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go index 669b693a7b66c..192da88f3b722 100644 --- a/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go +++ b/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go @@ -112,8 +112,8 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { if obj.HealthzBindAddress == "" { obj.HealthzBindAddress = "127.0.0.1" } - if obj.HealthzPort == 0 { - obj.HealthzPort = 10248 + if obj.HealthzPort == nil { + obj.HealthzPort = utilpointer.Int32Ptr(10248) } if obj.HostNetworkSources == nil { obj.HostNetworkSources = []string{kubetypes.AllSource} @@ -174,8 +174,8 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { if obj.Port == 0 { obj.Port = ports.KubeletPort } - if obj.ReadOnlyPort == 0 { - obj.ReadOnlyPort = ports.KubeletReadOnlyPort + if obj.ReadOnlyPort == nil { + obj.ReadOnlyPort = utilpointer.Int32Ptr(ports.KubeletReadOnlyPort) } if obj.RegisterNode == nil { obj.RegisterNode = boolVar(true) diff --git a/pkg/kubelet/apis/kubeletconfig/v1alpha1/types.go b/pkg/kubelet/apis/kubeletconfig/v1alpha1/types.go index ee1356df1b044..679ffa21e2162 100644 --- a/pkg/kubelet/apis/kubeletconfig/v1alpha1/types.go +++ b/pkg/kubelet/apis/kubeletconfig/v1alpha1/types.go @@ -78,7 +78,7 @@ type KubeletConfiguration struct { Port int32 `json:"port"` // readOnlyPort is the read-only port for the Kubelet to serve on with // no authentication/authorization (set to 0 to disable) - ReadOnlyPort int32 `json:"readOnlyPort"` + ReadOnlyPort *int32 `json:"readOnlyPort"` // tlsCertFile is the file containing x509 Certificate for HTTPS. (CA cert, // if any, concatenated after server cert). If tlsCertFile and // tlsPrivateKeyFile are not provided, a self-signed certificate @@ -135,10 +135,10 @@ type KubeletConfiguration struct { // maxContainerCount is the maximum number of old instances of containers // to retain globally. Each container takes up some disk space. MaxContainerCount *int32 `json:"maxContainerCount"` - // cAdvisorPort is the port of the localhost cAdvisor endpoint + // cAdvisorPort is the port of the localhost cAdvisor endpoint (set to 0 to disable) CAdvisorPort *int32 `json:"cAdvisorPort"` - // healthzPort is the port of the localhost healthz endpoint - HealthzPort int32 `json:"healthzPort"` + // healthzPort is the port of the localhost healthz endpoint (set to 0 to disable) + HealthzPort *int32 `json:"healthzPort"` // healthzBindAddress is the IP address for the healthz server to serve // on. HealthzBindAddress string `json:"healthzBindAddress"` diff --git a/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.conversion.go b/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.conversion.go index 8944101adec6c..bd842cacf0aa0 100644 --- a/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.conversion.go +++ b/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.conversion.go @@ -154,7 +154,9 @@ func autoConvert_v1alpha1_KubeletConfiguration_To_kubeletconfig_KubeletConfigura } out.Address = in.Address out.Port = in.Port - out.ReadOnlyPort = in.ReadOnlyPort + if err := v1.Convert_Pointer_int32_To_int32(&in.ReadOnlyPort, &out.ReadOnlyPort, s); err != nil { + return err + } out.TLSCertFile = in.TLSCertFile out.TLSPrivateKeyFile = in.TLSPrivateKeyFile if err := Convert_v1alpha1_KubeletAuthentication_To_kubeletconfig_KubeletAuthentication(&in.Authentication, &out.Authentication, s); err != nil { @@ -190,7 +192,9 @@ func autoConvert_v1alpha1_KubeletConfiguration_To_kubeletconfig_KubeletConfigura if err := v1.Convert_Pointer_int32_To_int32(&in.CAdvisorPort, &out.CAdvisorPort, s); err != nil { return err } - out.HealthzPort = in.HealthzPort + if err := v1.Convert_Pointer_int32_To_int32(&in.HealthzPort, &out.HealthzPort, s); err != nil { + return err + } out.HealthzBindAddress = in.HealthzBindAddress if err := v1.Convert_Pointer_int32_To_int32(&in.OOMScoreAdj, &out.OOMScoreAdj, s); err != nil { return err @@ -313,7 +317,9 @@ func autoConvert_kubeletconfig_KubeletConfiguration_To_v1alpha1_KubeletConfigura } out.Address = in.Address out.Port = in.Port - out.ReadOnlyPort = in.ReadOnlyPort + if err := v1.Convert_int32_To_Pointer_int32(&in.ReadOnlyPort, &out.ReadOnlyPort, s); err != nil { + return err + } out.TLSCertFile = in.TLSCertFile out.TLSPrivateKeyFile = in.TLSPrivateKeyFile if err := Convert_kubeletconfig_KubeletAuthentication_To_v1alpha1_KubeletAuthentication(&in.Authentication, &out.Authentication, s); err != nil { @@ -361,7 +367,9 @@ func autoConvert_kubeletconfig_KubeletConfiguration_To_v1alpha1_KubeletConfigura if err := v1.Convert_int32_To_Pointer_int32(&in.CAdvisorPort, &out.CAdvisorPort, s); err != nil { return err } - out.HealthzPort = in.HealthzPort + if err := v1.Convert_int32_To_Pointer_int32(&in.HealthzPort, &out.HealthzPort, s); err != nil { + return err + } out.HealthzBindAddress = in.HealthzBindAddress if err := v1.Convert_int32_To_Pointer_int32(&in.OOMScoreAdj, &out.OOMScoreAdj, s); err != nil { return err diff --git a/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.deepcopy.go b/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.deepcopy.go index 89109a385317f..a6ba484b4f294 100644 --- a/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/kubelet/apis/kubeletconfig/v1alpha1/zz_generated.deepcopy.go @@ -155,6 +155,15 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { **out = **in } } + if in.ReadOnlyPort != nil { + in, out := &in.ReadOnlyPort, &out.ReadOnlyPort + if *in == nil { + *out = nil + } else { + *out = new(int32) + **out = **in + } + } in.Authentication.DeepCopyInto(&out.Authentication) out.Authorization = in.Authorization if in.AllowPrivileged != nil { @@ -227,6 +236,15 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { **out = **in } } + if in.HealthzPort != nil { + in, out := &in.HealthzPort, &out.HealthzPort + if *in == nil { + *out = nil + } else { + *out = new(int32) + **out = **in + } + } if in.OOMScoreAdj != nil { in, out := &in.OOMScoreAdj, &out.OOMScoreAdj if *in == nil { From 3528ceb27fddab8b1aae1cb471feda70506b1074 Mon Sep 17 00:00:00 2001 From: Josh Horwitz Date: Fri, 25 Aug 2017 16:15:55 -0400 Subject: [PATCH 332/403] address test & doc comments --- pkg/cloudprovider/providers/aws/aws.go | 1 + pkg/cloudprovider/providers/azure/azure_instances.go | 1 + pkg/cloudprovider/providers/fake/fake.go | 1 + pkg/cloudprovider/providers/gce/gce_instances.go | 1 + .../providers/openstack/openstack_instances.go | 1 + pkg/cloudprovider/providers/ovirt/ovirt.go | 1 + pkg/cloudprovider/providers/photon/photon.go | 1 + pkg/cloudprovider/providers/rackspace/rackspace.go | 1 + pkg/cloudprovider/providers/vsphere/vsphere.go | 1 + pkg/controller/cloud/node_controller_test.go | 10 +++++----- 10 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index 18fbbc3b453ac..a2132f531a393 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -1102,6 +1102,7 @@ func (c *Cloud) ExternalID(nodeName types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// If false is returned with no error, the instance will be immediately deleted. func (c *Cloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/azure/azure_instances.go b/pkg/cloudprovider/providers/azure/azure_instances.go index e0fb6d0753f06..b2d5a9785c446 100644 --- a/pkg/cloudprovider/providers/azure/azure_instances.go +++ b/pkg/cloudprovider/providers/azure/azure_instances.go @@ -88,6 +88,7 @@ func (az *Cloud) ExternalID(name types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// If false is returned with no error, the instance will be immediately deleted. func (az *Cloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/fake/fake.go b/pkg/cloudprovider/providers/fake/fake.go index 633dbba8ae778..78deba4826819 100644 --- a/pkg/cloudprovider/providers/fake/fake.go +++ b/pkg/cloudprovider/providers/fake/fake.go @@ -239,6 +239,7 @@ func (f *FakeCloud) InstanceTypeByProviderID(providerID string) (string, error) } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// If false is returned with no error, the instance will be immediately deleted. func (f *FakeCloud) InstanceExistsByProviderID(providerID string) (bool, error) { f.addCall("instance-exists-by-provider-id") return f.ExistsByProviderID, f.ErrByProviderID diff --git a/pkg/cloudprovider/providers/gce/gce_instances.go b/pkg/cloudprovider/providers/gce/gce_instances.go index 25f3728bef25f..0687dfa5279b3 100644 --- a/pkg/cloudprovider/providers/gce/gce_instances.go +++ b/pkg/cloudprovider/providers/gce/gce_instances.go @@ -153,6 +153,7 @@ func (gce *GCECloud) ExternalID(nodeName types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// If false is returned with no error, the instance will be immediately deleted. func (gce *GCECloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/openstack/openstack_instances.go b/pkg/cloudprovider/providers/openstack/openstack_instances.go index d8f96061f75e0..6f81763794006 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_instances.go +++ b/pkg/cloudprovider/providers/openstack/openstack_instances.go @@ -111,6 +111,7 @@ func (i *Instances) ExternalID(name types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// If false is returned with no error, the instance will be immediately deleted. func (i *Instances) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/ovirt/ovirt.go b/pkg/cloudprovider/providers/ovirt/ovirt.go index 38c22e0f1b01a..96eed8d9a299a 100644 --- a/pkg/cloudprovider/providers/ovirt/ovirt.go +++ b/pkg/cloudprovider/providers/ovirt/ovirt.go @@ -212,6 +212,7 @@ func (v *OVirtCloud) ExternalID(nodeName types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// If false is returned with no error, the instance will be immediately deleted. func (v *OVirtCloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/photon/photon.go b/pkg/cloudprovider/providers/photon/photon.go index 37466bd34689e..9612f1b463d4b 100644 --- a/pkg/cloudprovider/providers/photon/photon.go +++ b/pkg/cloudprovider/providers/photon/photon.go @@ -471,6 +471,7 @@ func (pc *PCCloud) ExternalID(nodeName k8stypes.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// If false is returned with no error, the instance will be immediately deleted. func (pc *PCCloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/rackspace/rackspace.go b/pkg/cloudprovider/providers/rackspace/rackspace.go index 61127aea0e236..e5a84cbc831f2 100644 --- a/pkg/cloudprovider/providers/rackspace/rackspace.go +++ b/pkg/cloudprovider/providers/rackspace/rackspace.go @@ -437,6 +437,7 @@ func (i *Instances) ExternalID(nodeName types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// If false is returned with no error, the instance will be immediately deleted. func (i *Instances) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 58e1a3020ec4f..2407d569331da 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -377,6 +377,7 @@ func (vs *VSphere) ExternalID(nodeName k8stypes.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// If false is returned with no error, the instance will be immediately deleted. func (vs *VSphere) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/controller/cloud/node_controller_test.go b/pkg/controller/cloud/node_controller_test.go index 49e956e93fdf4..9cdebd140d1b7 100644 --- a/pkg/controller/cloud/node_controller_test.go +++ b/pkg/controller/cloud/node_controller_test.go @@ -130,23 +130,23 @@ func TestEnsureNodeExistsByProviderIDOrNodeName(t *testing.T) { instances, _ := fc.Instances() exists, err := ensureNodeExistsByProviderIDOrName(instances, tc.node) if err != nil { - t.Fatal(err) + t.Error(err) } if !reflect.DeepEqual(fc.Calls, tc.expectedCalls) { - t.Fatalf("expected cloud provider methods `%v` to be called but `%v` was called ", tc.expectedCalls, fc.Calls) + t.Errorf("expected cloud provider methods `%v` to be called but `%v` was called ", tc.expectedCalls, fc.Calls) } if tc.existsByProviderID && tc.existsByProviderID != exists { - t.Fatalf("expected exist by provider id to be `%t` but got `%t`", tc.existsByProviderID, exists) + t.Errorf("expected exist by provider id to be `%t` but got `%t`", tc.existsByProviderID, exists) } if tc.existsByNodeName && tc.existsByNodeName != exists { - t.Fatalf("expected exist by node name to be `%t` but got `%t`", tc.existsByNodeName, exists) + t.Errorf("expected exist by node name to be `%t` but got `%t`", tc.existsByNodeName, exists) } if !tc.existsByNodeName && !tc.existsByProviderID && exists { - t.Fatal("node is not supposed to exist") + t.Error("node is not supposed to exist") } }) From c682d7cd7487adc534ee1efc35d08045a79b0133 Mon Sep 17 00:00:00 2001 From: Steve Leon Date: Thu, 24 Aug 2017 15:08:07 -0700 Subject: [PATCH 333/403] Add host mountpath for controller-manager for flexvolume dir Controller manager needs access to Flexvolume plugin when using attach-detach controller interface. This PR adds the host mount path for the default directory of flexvolume plugins Fixes https://github.com/kubernetes/kubeadm/issues/410 --- .../app/phases/controlplane/volumes.go | 11 ++++++-- .../app/phases/controlplane/volumes_test.go | 28 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/cmd/kubeadm/app/phases/controlplane/volumes.go b/cmd/kubeadm/app/phases/controlplane/volumes.go index d83df4961d628..a9c69d01b913e 100644 --- a/cmd/kubeadm/app/phases/controlplane/volumes.go +++ b/cmd/kubeadm/app/phases/controlplane/volumes.go @@ -30,9 +30,11 @@ import ( ) const ( - caCertsVolumeName = "ca-certs" - caCertsVolumePath = "/etc/ssl/certs" - caCertsPkiVolumeName = "ca-certs-etc-pki" + caCertsVolumeName = "ca-certs" + caCertsVolumePath = "/etc/ssl/certs" + caCertsPkiVolumeName = "ca-certs-etc-pki" + flexvolumeDirVolumeName = "flexvolume-dir" + flexvolumeDirVolumePath = "/usr/libexec/kubernetes/kubelet-plugins/volume/exec" ) // caCertsPkiVolumePath specifies the path that can be conditionally mounted into the apiserver and controller-manager containers @@ -68,6 +70,9 @@ func getHostPathVolumesForTheControlPlane(cfg *kubeadmapi.MasterConfiguration) c // Read-only mount for the controller manager kubeconfig file controllerManagerKubeConfigFile := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ControllerManagerKubeConfigFileName) mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, kubeadmconstants.KubeConfigVolumeName, controllerManagerKubeConfigFile, controllerManagerKubeConfigFile, true, &hostPathFileOrCreate) + // Mount for the flexvolume directory (/usr/libexec/kubernetes/kubelet-plugins/volume/exec) directory + // Flexvolume dir must NOT be readonly as it is used for third-party plugins to integrate with their storage backends via unix domain socket. + mounts.NewHostPathMount(kubeadmconstants.KubeControllerManager, flexvolumeDirVolumeName, flexvolumeDirVolumePath, flexvolumeDirVolumePath, false, &hostPathDirectoryOrCreate) // HostPath volumes for the scheduler // Read-only mount for the scheduler kubeconfig file diff --git a/cmd/kubeadm/app/phases/controlplane/volumes_test.go b/cmd/kubeadm/app/phases/controlplane/volumes_test.go index ebe74eed56955..af784c0e64b30 100644 --- a/cmd/kubeadm/app/phases/controlplane/volumes_test.go +++ b/cmd/kubeadm/app/phases/controlplane/volumes_test.go @@ -309,6 +309,15 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { }, }, }, + { + Name: "flexvolume-dir", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/usr/libexec/kubernetes/kubelet-plugins/volume/exec", + Type: &hostPathDirectoryOrCreate, + }, + }, + }, }, kubeadmconstants.KubeScheduler: { { @@ -351,6 +360,11 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { MountPath: "/etc/kubernetes/controller-manager.conf", ReadOnly: true, }, + { + Name: "flexvolume-dir", + MountPath: "/usr/libexec/kubernetes/kubelet-plugins/volume/exec", + ReadOnly: false, + }, }, kubeadmconstants.KubeScheduler: { { @@ -439,6 +453,15 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { }, }, }, + { + Name: "flexvolume-dir", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/usr/libexec/kubernetes/kubelet-plugins/volume/exec", + Type: &hostPathDirectoryOrCreate, + }, + }, + }, }, kubeadmconstants.KubeScheduler: { { @@ -491,6 +514,11 @@ func TestGetHostPathVolumesForTheControlPlane(t *testing.T) { MountPath: "/etc/kubernetes/controller-manager.conf", ReadOnly: true, }, + { + Name: "flexvolume-dir", + MountPath: "/usr/libexec/kubernetes/kubelet-plugins/volume/exec", + ReadOnly: false, + }, }, kubeadmconstants.KubeScheduler: { { From 82a69b281585b7319dd181ee31d46985bc05b79d Mon Sep 17 00:00:00 2001 From: Josh Horwitz Date: Fri, 25 Aug 2017 16:25:19 -0400 Subject: [PATCH 334/403] refactor method name as per comments --- pkg/controller/cloud/node_controller.go | 6 +++--- pkg/controller/cloud/node_controller_test.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/controller/cloud/node_controller.go b/pkg/controller/cloud/node_controller.go index c5557832d0fd7..94308cdcbbd9e 100644 --- a/pkg/controller/cloud/node_controller.go +++ b/pkg/controller/cloud/node_controller.go @@ -237,7 +237,7 @@ func (cnc *CloudNodeController) MonitorNode() { if currentReadyCondition.Status != v1.ConditionTrue { // Check with the cloud provider to see if the node still exists. If it // doesn't, delete the node immediately. - exists, err := ensureNodeExistsByProviderIDOrName(instances, node) + exists, err := ensureNodeExistsByProviderIDOrExternalID(instances, node) if err != nil { glog.Errorf("Error getting data for node %s from cloud: %v", node.Name, err) continue @@ -382,8 +382,8 @@ func excludeTaintFromList(taints []v1.Taint, toExclude v1.Taint) []v1.Taint { return newTaints } -// ensureNodeExistsByProviderIDOrName first checks if the instance exists by the provider id and then by node name -func ensureNodeExistsByProviderIDOrName(instances cloudprovider.Instances, node *v1.Node) (bool, error) { +// ensureNodeExistsByProviderIDOrExternalID first checks if the instance exists by the provider id and then by calling external id with node name +func ensureNodeExistsByProviderIDOrExternalID(instances cloudprovider.Instances, node *v1.Node) (bool, error) { exists, err := instances.InstanceExistsByProviderID(node.Spec.ProviderID) if err != nil { providerIDErr := err diff --git a/pkg/controller/cloud/node_controller_test.go b/pkg/controller/cloud/node_controller_test.go index 9cdebd140d1b7..32116831a856f 100644 --- a/pkg/controller/cloud/node_controller_test.go +++ b/pkg/controller/cloud/node_controller_test.go @@ -128,7 +128,7 @@ func TestEnsureNodeExistsByProviderIDOrNodeName(t *testing.T) { } instances, _ := fc.Instances() - exists, err := ensureNodeExistsByProviderIDOrName(instances, tc.node) + exists, err := ensureNodeExistsByProviderIDOrExternalID(instances, tc.node) if err != nil { t.Error(err) } From 33e02aff604fa4795b3d02be254155cd9829eed8 Mon Sep 17 00:00:00 2001 From: Matt Moyer Date: Tue, 22 Aug 2017 15:43:47 -0500 Subject: [PATCH 335/403] Add extra group constants and validation to `pkg/bootstrap/api`. This adds constants and validation for a new `auth-extra-groups` key on `bootstrap.kubernetes.io/token` secrets. This key allows a bootstrap token to authenticate to extra groups in addition to the `system:bootstrappers` group. Extra groups are always applied in addition to the `system:bootstrappers` group, must begin with a `system:bootstrappers:` prefix, are limited in length, and are limited to a restricted set of characters (alphanumeric, colons, and dashes without a trailing colon/dash). --- pkg/bootstrap/api/BUILD | 8 +++ pkg/bootstrap/api/helpers.go | 34 ++++++++++++ pkg/bootstrap/api/helpers_test.go | 52 +++++++++++++++++++ pkg/bootstrap/api/types.go | 18 +++++-- .../token/bootstrap/bootstrap.go | 2 +- 5 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 pkg/bootstrap/api/helpers.go create mode 100644 pkg/bootstrap/api/helpers_test.go diff --git a/pkg/bootstrap/api/BUILD b/pkg/bootstrap/api/BUILD index dfb7d6976381b..db7be057bf6c7 100644 --- a/pkg/bootstrap/api/BUILD +++ b/pkg/bootstrap/api/BUILD @@ -3,12 +3,14 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( name = "go_default_library", srcs = [ "doc.go", + "helpers.go", "types.go", ], deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], @@ -26,3 +28,9 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["helpers_test.go"], + library = ":go_default_library", +) diff --git a/pkg/bootstrap/api/helpers.go b/pkg/bootstrap/api/helpers.go new file mode 100644 index 0000000000000..639d61a33c3f7 --- /dev/null +++ b/pkg/bootstrap/api/helpers.go @@ -0,0 +1,34 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package api + +import ( + "fmt" + "regexp" +) + +var bootstrapGroupRegexp = regexp.MustCompile(`\A` + BootstrapGroupPattern + `\z`) + +// ValidateBootstrapGroupName checks if the provided group name is a valid +// bootstrap group name. Returns nil if valid or a validation error if invalid. +// TODO(mattmoyer): this validation should migrate out to client-go (see https://github.com/kubernetes/client-go/issues/114) +func ValidateBootstrapGroupName(name string) error { + if bootstrapGroupRegexp.Match([]byte(name)) { + return nil + } + return fmt.Errorf("bootstrap group %q is invalid (must match %s)", name, BootstrapGroupPattern) +} diff --git a/pkg/bootstrap/api/helpers_test.go b/pkg/bootstrap/api/helpers_test.go new file mode 100644 index 0000000000000..177687150c5c6 --- /dev/null +++ b/pkg/bootstrap/api/helpers_test.go @@ -0,0 +1,52 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package api + +import ( + "strings" + "testing" +) + +func TestValidateBootstrapGroupName(t *testing.T) { + tests := []struct { + name string + input string + valid bool + }{ + {"valid", "system:bootstrappers:foo", true}, + {"valid nested", "system:bootstrappers:foo:bar:baz", true}, + {"valid with dashes and number", "system:bootstrappers:foo-bar-42", true}, + {"invalid uppercase", "system:bootstrappers:Foo", false}, + {"missing prefix", "foo", false}, + {"prefix with no body", "system:bootstrappers:", false}, + {"invalid spaces", "system:bootstrappers: ", false}, + {"invalid asterisk", "system:bootstrappers:*", false}, + {"trailing colon", "system:bootstrappers:foo:", false}, + {"trailing dash", "system:bootstrappers:foo-", false}, + {"script tags", "system:bootstrappers:", false}, + {"too long", "system:bootstrappers:" + strings.Repeat("x", 300), false}, + } + for _, test := range tests { + err := ValidateBootstrapGroupName(test.input) + if err != nil && test.valid { + t.Errorf("test %q: ValidateBootstrapGroupName(%q) returned unexpected error: %v", test.name, test.input, err) + } + if err == nil && !test.valid { + t.Errorf("test %q: ValidateBootstrapGroupName(%q) was supposed to return an error but didn't", test.name, test.input) + } + } +} diff --git a/pkg/bootstrap/api/types.go b/pkg/bootstrap/api/types.go index a7cca0c9bd86e..a4e67a1c2491e 100644 --- a/pkg/bootstrap/api/types.go +++ b/pkg/bootstrap/api/types.go @@ -51,6 +51,11 @@ const ( // describes what the bootstrap token is used for. Optional. BootstrapTokenDescriptionKey = "description" + // BootstrapTokenExtraGroupsKey is a comma-separated list of group names. + // The bootstrap token will authenticate as these groups in addition to the + // "system:bootstrappers" group. + BootstrapTokenExtraGroupsKey = "auth-extra-groups" + // BootstrapTokenUsagePrefix is the prefix for the other usage constants that specifies different // functions of a bootstrap token BootstrapTokenUsagePrefix = "usage-bootstrap-" @@ -63,7 +68,8 @@ const ( // BootstrapTokenUsageAuthentication signals that this token should be used // as a bearer token to authenticate against the Kubernetes API. The bearer // token takes the form "." and authenticates as the - // user "system:bootstrap:" in the group "system:bootstrappers". + // user "system:bootstrap:" in the "system:bootstrappers" group + // as well as any groups specified using BootstrapTokenExtraGroupsKey. // Value must be "true". Any other value is assumed to be false. Optional. BootstrapTokenUsageAuthentication = "usage-bootstrap-authentication" @@ -80,6 +86,12 @@ const ( // authenticate as. The full username given is "system:bootstrap:". BootstrapUserPrefix = "system:bootstrap:" - // BootstrapGroup is the group bootstrapping bearer tokens authenticate in. - BootstrapGroup = "system:bootstrappers" + // BootstrapGroupPattern is the valid regex pattern that all groups + // assigned to a bootstrap token by BootstrapTokenExtraGroupsKey must match. + // See also ValidateBootstrapGroupName(). + BootstrapGroupPattern = "system:bootstrappers:[a-z0-9:-]{0,255}[a-z0-9]" + + // BootstrapDefaultGroup is the default group for bootstrapping bearer + // tokens (in addition to any groups from BootstrapTokenExtraGroupsKey). + BootstrapDefaultGroup = "system:bootstrappers" ) diff --git a/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go b/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go index 62b3ad50d8cd9..abd5eb196f240 100644 --- a/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go +++ b/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go @@ -136,7 +136,7 @@ func (t *TokenAuthenticator) AuthenticateToken(token string) (user.Info, bool, e return &user.DefaultInfo{ Name: bootstrapapi.BootstrapUserPrefix + string(id), - Groups: []string{bootstrapapi.BootstrapGroup}, + Groups: []string{bootstrapapi.BootstrapDefaultGroup}, }, true, nil } From 27901ad5df0a338b5cf281d12e046a1cebc316a8 Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Fri, 18 Aug 2017 12:42:19 +0800 Subject: [PATCH 336/403] Change eviction policy to manage one single local storage resource --- cmd/kubelet/app/server.go | 9 +-- pkg/kubelet/cadvisor/util.go | 13 +---- pkg/kubelet/cm/BUILD | 1 - pkg/kubelet/cm/container_manager_linux.go | 16 +----- pkg/kubelet/cm/node_container_manager.go | 4 +- pkg/kubelet/cm/node_container_manager_test.go | 20 +++---- pkg/kubelet/eviction/BUILD | 1 + pkg/kubelet/eviction/eviction_manager.go | 57 ++++++++++++++++--- pkg/kubelet/eviction/helpers.go | 35 +++++------- pkg/kubelet/kubelet_node_status.go | 6 +- .../local_storage_isolation_eviction_test.go | 53 +++++++++++++++-- 11 files changed, 129 insertions(+), 86 deletions(-) diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 85d37b75c60ab..34b1cf6fe9c26 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -745,7 +745,7 @@ func parseResourceList(m kubeletconfiginternal.ConfigurationMap) (v1.ResourceLis for k, v := range m { switch v1.ResourceName(k) { // CPU, memory and local storage resources are supported. - case v1.ResourceCPU, v1.ResourceMemory, v1.ResourceStorage: + case v1.ResourceCPU, v1.ResourceMemory, v1.ResourceEphemeralStorage: q, err := resource.ParseQuantity(v) if err != nil { return nil, err @@ -753,12 +753,7 @@ func parseResourceList(m kubeletconfiginternal.ConfigurationMap) (v1.ResourceLis if q.Sign() == -1 { return nil, fmt.Errorf("resource quantity for %q cannot be negative: %v", k, v) } - // storage specified in configuration map is mapped to ResourceStorageScratch API - if v1.ResourceName(k) == v1.ResourceStorage { - rl[v1.ResourceStorageScratch] = q - } else { - rl[v1.ResourceName(k)] = q - } + rl[v1.ResourceName(k)] = q default: return nil, fmt.Errorf("cannot reserve %q resource", k) } diff --git a/pkg/kubelet/cadvisor/util.go b/pkg/kubelet/cadvisor/util.go index e1d0c90f27c88..a95a8fb19e29a 100644 --- a/pkg/kubelet/cadvisor/util.go +++ b/pkg/kubelet/cadvisor/util.go @@ -35,18 +35,9 @@ func CapacityFromMachineInfo(info *cadvisorapi.MachineInfo) v1.ResourceList { return c } -func StorageScratchCapacityFromFsInfo(info cadvisorapi2.FsInfo) v1.ResourceList { +func EphemeralStorageCapacityFromFsInfo(info cadvisorapi2.FsInfo) v1.ResourceList { c := v1.ResourceList{ - v1.ResourceStorageScratch: *resource.NewQuantity( - int64(info.Capacity), - resource.BinarySI), - } - return c -} - -func StorageOverlayCapacityFromFsInfo(info cadvisorapi2.FsInfo) v1.ResourceList { - c := v1.ResourceList{ - v1.ResourceStorageOverlay: *resource.NewQuantity( + v1.ResourceEphemeralStorage: *resource.NewQuantity( int64(info.Capacity), resource.BinarySI), } diff --git a/pkg/kubelet/cm/BUILD b/pkg/kubelet/cm/BUILD index e352bd354a61b..51b892c222ccb 100644 --- a/pkg/kubelet/cm/BUILD +++ b/pkg/kubelet/cm/BUILD @@ -55,7 +55,6 @@ go_library( "//pkg/util/procfs:go_default_library", "//pkg/util/sysctl:go_default_library", "//pkg/util/version:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd:go_default_library", diff --git a/pkg/kubelet/cm/container_manager_linux.go b/pkg/kubelet/cm/container_manager_linux.go index 8ba7d91942914..66128398e3bd7 100644 --- a/pkg/kubelet/cm/container_manager_linux.go +++ b/pkg/kubelet/cm/container_manager_linux.go @@ -30,7 +30,6 @@ import ( "time" "github.com/golang/glog" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups/fs" "github.com/opencontainers/runc/libcontainer/configs" @@ -552,24 +551,11 @@ func (cm *containerManagerImpl) setFsCapacity() error { if err != nil { return fmt.Errorf("Fail to get rootfs information %v", err) } - hasDedicatedImageFs, _ := cm.cadvisorInterface.HasDedicatedImageFs() - var imagesfs cadvisorapiv2.FsInfo - if hasDedicatedImageFs { - imagesfs, err = cm.cadvisorInterface.ImagesFsInfo() - if err != nil { - return fmt.Errorf("Fail to get imagefs information %v", err) - } - } cm.Lock() - for rName, rCap := range cadvisor.StorageScratchCapacityFromFsInfo(rootfs) { + for rName, rCap := range cadvisor.EphemeralStorageCapacityFromFsInfo(rootfs) { cm.capacity[rName] = rCap } - if hasDedicatedImageFs { - for rName, rCap := range cadvisor.StorageOverlayCapacityFromFsInfo(imagesfs) { - cm.capacity[rName] = rCap - } - } cm.Unlock() return nil } diff --git a/pkg/kubelet/cm/node_container_manager.go b/pkg/kubelet/cm/node_container_manager.go index 7c817984b0712..a96f9c5403790 100644 --- a/pkg/kubelet/cm/node_container_manager.go +++ b/pkg/kubelet/cm/node_container_manager.go @@ -218,9 +218,9 @@ func hardEvictionReservation(thresholds []evictionapi.Threshold, capacity v1.Res value := evictionapi.GetThresholdQuantity(threshold.Value, &memoryCapacity) ret[v1.ResourceMemory] = *value case evictionapi.SignalNodeFsAvailable: - storageCapacity := capacity[v1.ResourceStorageScratch] + storageCapacity := capacity[v1.ResourceEphemeralStorage] value := evictionapi.GetThresholdQuantity(threshold.Value, &storageCapacity) - ret[v1.ResourceStorageScratch] = *value + ret[v1.ResourceEphemeralStorage] = *value } } return ret diff --git a/pkg/kubelet/cm/node_container_manager_test.go b/pkg/kubelet/cm/node_container_manager_test.go index 29208186abc68..c06b9aa85be57 100644 --- a/pkg/kubelet/cm/node_container_manager_test.go +++ b/pkg/kubelet/cm/node_container_manager_test.go @@ -316,17 +316,17 @@ func TestNodeAllocatableInputValidation(t *testing.T) { invalidConfiguration bool }{ { - kubeReserved: getScratchResourceList("100Mi"), - systemReserved: getScratchResourceList("50Mi"), - capacity: getScratchResourceList("500Mi"), + kubeReserved: getEphemeralStorageResourceList("100Mi"), + systemReserved: getEphemeralStorageResourceList("50Mi"), + capacity: getEphemeralStorageResourceList("500Mi"), }, { - kubeReserved: getScratchResourceList("10Gi"), - systemReserved: getScratchResourceList("10Gi"), + kubeReserved: getEphemeralStorageResourceList("10Gi"), + systemReserved: getEphemeralStorageResourceList("10Gi"), hardThreshold: evictionapi.ThresholdValue{ Quantity: &storageEvictionThreshold, }, - capacity: getScratchResourceList("20Gi"), + capacity: getEphemeralStorageResourceList("20Gi"), invalidConfiguration: true, }, } @@ -359,12 +359,12 @@ func TestNodeAllocatableInputValidation(t *testing.T) { } } -// getScratchResourceList returns a ResourceList with the -// specified scratch storage resource values -func getScratchResourceList(storage string) v1.ResourceList { +// getEphemeralStorageResourceList returns a ResourceList with the +// specified ephemeral storage resource values +func getEphemeralStorageResourceList(storage string) v1.ResourceList { res := v1.ResourceList{} if storage != "" { - res[v1.ResourceStorageScratch] = resource.MustParse(storage) + res[v1.ResourceEphemeralStorage] = resource.MustParse(storage) } return res } diff --git a/pkg/kubelet/eviction/BUILD b/pkg/kubelet/eviction/BUILD index 0d796fdd3a7db..69b373533fd53 100644 --- a/pkg/kubelet/eviction/BUILD +++ b/pkg/kubelet/eviction/BUILD @@ -48,6 +48,7 @@ go_library( deps = [ "//pkg/api:go_default_library", "//pkg/api/v1/helper/qos:go_default_library", + "//pkg/api/v1/resource:go_default_library", "//pkg/features:go_default_library", "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", "//pkg/kubelet/cm:go_default_library", diff --git a/pkg/kubelet/eviction/eviction_manager.go b/pkg/kubelet/eviction/eviction_manager.go index 5841afe7cdd39..f430b82502bcb 100644 --- a/pkg/kubelet/eviction/eviction_manager.go +++ b/pkg/kubelet/eviction/eviction_manager.go @@ -31,6 +31,7 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/record" v1qos "k8s.io/kubernetes/pkg/api/v1/helper/qos" + apiv1resource "k8s.io/kubernetes/pkg/api/v1/resource" "k8s.io/kubernetes/pkg/features" statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" "k8s.io/kubernetes/pkg/kubelet/cm" @@ -472,7 +473,12 @@ func (m *managerImpl) localStorageEviction(pods []*v1.Pod) []*v1.Pod { continue } - if m.containerOverlayLimitEviction(podStats, pod) { + if m.podEphemeralStorageLimitEviction(podStats, pod) { + evicted = append(evicted, pod) + continue + } + + if m.containerEphemeralStorageLimitEviction(podStats, pod) { evicted = append(evicted, pod) } } @@ -496,23 +502,56 @@ func (m *managerImpl) emptyDirLimitEviction(podStats statsapi.PodStats, pod *v1. } } } + + return false +} + +func (m *managerImpl) podEphemeralStorageLimitEviction(podStats statsapi.PodStats, pod *v1.Pod) bool { + _, podLimits := apiv1resource.PodRequestsAndLimits(pod) + _, found := podLimits[v1.ResourceEphemeralStorage] + if !found { + return false + } + + podEphemeralStorageTotalUsage := &resource.Quantity{} + fsStatsSet := []fsStatsType{} + if *m.dedicatedImageFs { + fsStatsSet = []fsStatsType{fsStatsLogs, fsStatsLocalVolumeSource} + } else { + fsStatsSet = []fsStatsType{fsStatsRoot, fsStatsLogs, fsStatsLocalVolumeSource} + } + podUsage, err := podDiskUsage(podStats, pod, fsStatsSet) + if err != nil { + glog.Errorf("eviction manager: error getting pod disk usage %v", err) + return false + } + + podEphemeralStorageTotalUsage.Add(podUsage[resourceDisk]) + if podEphemeralStorageTotalUsage.Cmp(podLimits[v1.ResourceEphemeralStorage]) > 0 { + // the total usage of pod exceeds the total size limit of containers, evict the pod + return m.evictPod(pod, v1.ResourceEphemeralStorage, fmt.Sprintf("pod ephemeral local storage usage exceeds the total limit of containers %v", podLimits[v1.ResourceEphemeralStorage])) + } return false } -func (m *managerImpl) containerOverlayLimitEviction(podStats statsapi.PodStats, pod *v1.Pod) bool { +func (m *managerImpl) containerEphemeralStorageLimitEviction(podStats statsapi.PodStats, pod *v1.Pod) bool { thresholdsMap := make(map[string]*resource.Quantity) for _, container := range pod.Spec.Containers { - overlayLimit := container.Resources.Limits.StorageOverlay() - if overlayLimit != nil && overlayLimit.Value() != 0 { - thresholdsMap[container.Name] = overlayLimit + ephemeralLimit := container.Resources.Limits.StorageEphemeral() + if ephemeralLimit != nil && ephemeralLimit.Value() != 0 { + thresholdsMap[container.Name] = ephemeralLimit } } for _, containerStat := range podStats.Containers { - rootfs := diskUsage(containerStat.Rootfs) - if overlayThreshold, ok := thresholdsMap[containerStat.Name]; ok { - if overlayThreshold.Cmp(*rootfs) < 0 { - return m.evictPod(pod, v1.ResourceName("containerOverlay"), fmt.Sprintf("container's overlay usage exceeds the limit %q", overlayThreshold.String())) + containerUsed := diskUsage(containerStat.Logs) + if !*m.dedicatedImageFs { + containerUsed.Add(*diskUsage(containerStat.Rootfs)) + } + + if ephemeralStorageThreshold, ok := thresholdsMap[containerStat.Name]; ok { + if ephemeralStorageThreshold.Cmp(*containerUsed) < 0 { + return m.evictPod(pod, v1.ResourceEphemeralStorage, fmt.Sprintf("container's ephemeral local storage usage exceeds the limit %q", ephemeralStorageThreshold.String())) } } diff --git a/pkg/kubelet/eviction/helpers.go b/pkg/kubelet/eviction/helpers.go index 859b8d21a4592..6cef960232a7b 100644 --- a/pkg/kubelet/eviction/helpers.go +++ b/pkg/kubelet/eviction/helpers.go @@ -54,8 +54,6 @@ const ( resourceNodeFs v1.ResourceName = "nodefs" // nodefs inodes, number. internal to this module, used to account for local node root filesystem inodes. resourceNodeFsInodes v1.ResourceName = "nodefsInodes" - // container overlay storage, in bytes. internal to this module, used to account for local disk usage for container overlay. - resourceOverlay v1.ResourceName = "overlay" ) var ( @@ -400,12 +398,10 @@ func localVolumeNames(pod *v1.Pod) []string { func podDiskUsage(podStats statsapi.PodStats, pod *v1.Pod, statsToMeasure []fsStatsType) (v1.ResourceList, error) { disk := resource.Quantity{Format: resource.BinarySI} inodes := resource.Quantity{Format: resource.BinarySI} - overlay := resource.Quantity{Format: resource.BinarySI} for _, container := range podStats.Containers { if hasFsStatsType(statsToMeasure, fsStatsRoot) { disk.Add(*diskUsage(container.Rootfs)) inodes.Add(*inodeUsage(container.Rootfs)) - overlay.Add(*diskUsage(container.Rootfs)) } if hasFsStatsType(statsToMeasure, fsStatsLogs) { disk.Add(*diskUsage(container.Logs)) @@ -425,9 +421,8 @@ func podDiskUsage(podStats statsapi.PodStats, pod *v1.Pod, statsToMeasure []fsSt } } return v1.ResourceList{ - resourceDisk: disk, - resourceInodes: inodes, - resourceOverlay: overlay, + resourceDisk: disk, + resourceInodes: inodes, }, nil } @@ -727,7 +722,7 @@ func makeSignalObservations(summaryProvider stats.SummaryProvider, capacityProvi } } - storageScratchCapacity, storageScratchAllocatable, exist := getResourceAllocatable(nodeCapacity, allocatableReservation, v1.ResourceStorageScratch) + ephemeralStorageCapacity, ephemeralStorageAllocatable, exist := getResourceAllocatable(nodeCapacity, allocatableReservation, v1.ResourceEphemeralStorage) if exist { for _, pod := range pods { podStat, ok := statsFunc(pod) @@ -735,25 +730,23 @@ func makeSignalObservations(summaryProvider stats.SummaryProvider, capacityProvi continue } - usage, err := podDiskUsage(podStat, pod, []fsStatsType{fsStatsLogs, fsStatsLocalVolumeSource, fsStatsRoot}) + fsStatsSet := []fsStatsType{} + if withImageFs { + fsStatsSet = []fsStatsType{fsStatsLogs, fsStatsLocalVolumeSource} + } else { + fsStatsSet = []fsStatsType{fsStatsRoot, fsStatsLogs, fsStatsLocalVolumeSource} + } + + usage, err := podDiskUsage(podStat, pod, fsStatsSet) if err != nil { glog.Warningf("eviction manager: error getting pod disk usage %v", err) continue } - // If there is a seperate imagefs set up for container runtimes, the scratch disk usage from nodefs should exclude the overlay usage - if withImageFs { - diskUsage := usage[resourceDisk] - diskUsageP := &diskUsage - diskUsagep := diskUsageP.Copy() - diskUsagep.Sub(usage[resourceOverlay]) - storageScratchAllocatable.Sub(*diskUsagep) - } else { - storageScratchAllocatable.Sub(usage[resourceDisk]) - } + ephemeralStorageAllocatable.Sub(usage[resourceDisk]) } result[evictionapi.SignalAllocatableNodeFsAvailable] = signalObservation{ - available: storageScratchAllocatable, - capacity: storageScratchCapacity, + available: ephemeralStorageAllocatable, + capacity: ephemeralStorageCapacity, } } diff --git a/pkg/kubelet/kubelet_node_status.go b/pkg/kubelet/kubelet_node_status.go index 9a20a75600ad3..b5dd137cfd27c 100644 --- a/pkg/kubelet/kubelet_node_status.go +++ b/pkg/kubelet/kubelet_node_status.go @@ -564,11 +564,7 @@ func (kl *Kubelet) setNodeStatusMachineInfo(node *v1.Node) { // capacity for every node status request initialCapacity := kl.containerManager.GetCapacity() if initialCapacity != nil { - node.Status.Capacity[v1.ResourceStorageScratch] = initialCapacity[v1.ResourceStorageScratch] - imageCapacity, ok := initialCapacity[v1.ResourceStorageOverlay] - if ok { - node.Status.Capacity[v1.ResourceStorageOverlay] = imageCapacity - } + node.Status.Capacity[v1.ResourceEphemeralStorage] = initialCapacity[v1.ResourceEphemeralStorage] } } } diff --git a/test/e2e_node/local_storage_isolation_eviction_test.go b/test/e2e_node/local_storage_isolation_eviction_test.go index f0932383a6c92..5d3408c4b2c21 100644 --- a/test/e2e_node/local_storage_isolation_eviction_test.go +++ b/test/e2e_node/local_storage_isolation_eviction_test.go @@ -36,7 +36,7 @@ type podEvictSpec struct { } const ( - totalEvict = 3 + totalEvict = 4 ) // Eviction Policy is described here: @@ -48,7 +48,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se emptyDirVolumeName := "volume-emptydir-pod" podTestSpecs := []podEvictSpec{ - {evicted: true, // This pod should be evicted because emptyDir (defualt storage type) usage violation + {evicted: true, // This pod should be evicted because emptyDir (default storage type) usage violation pod: v1.Pod{ ObjectMeta: metav1.ObjectMeta{Name: "emptydir-hog-pod"}, Spec: v1.PodSpec{ @@ -157,7 +157,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se }, }, - {evicted: true, // This pod should be evicted because container overlay usage violation + {evicted: true, // This pod should be evicted because container ephemeral storage usage violation pod: v1.Pod{ ObjectMeta: metav1.ObjectMeta{Name: "container-hog-pod"}, Spec: v1.PodSpec{ @@ -173,7 +173,7 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se }, Resources: v1.ResourceRequirements{ Limits: v1.ResourceList{ - v1.ResourceStorageOverlay: *resource.NewMilliQuantity( + v1.ResourceEphemeralStorage: *resource.NewMilliQuantity( int64(40000), resource.BinarySI), }, @@ -183,10 +183,53 @@ var _ = framework.KubeDescribe("LocalStorageCapacityIsolationEviction [Slow] [Se }, }, }, + + {evicted: true, // This pod should be evicted because pod ephemeral storage usage violation + pod: v1.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: "emptydir-container-hog-pod"}, + Spec: v1.PodSpec{ + RestartPolicy: v1.RestartPolicyNever, + Containers: []v1.Container{ + { + Image: "gcr.io/google_containers/busybox:1.24", + Name: "emptydir-container-hog-pod", + Command: []string{ + "sh", + "-c", + "sleep 5; dd if=/dev/urandom of=target-file of=/cache/target-file bs=50000 count=1; while true; do sleep 5; done", + }, + Resources: v1.ResourceRequirements{ + Limits: v1.ResourceList{ + v1.ResourceEphemeralStorage: *resource.NewMilliQuantity( + int64(40000), + resource.BinarySI), + }, + }, + VolumeMounts: []v1.VolumeMount{ + { + Name: emptyDirVolumeName, + MountPath: "/cache", + }, + }, + }, + }, + Volumes: []v1.Volume{ + { + Name: emptyDirVolumeName, + VolumeSource: v1.VolumeSource{ + EmptyDir: &v1.EmptyDirVolumeSource{ + SizeLimit: *resource.NewQuantity(int64(100000), resource.BinarySI), + }, + }, + }, + }, + }, + }, + }, } evictionTestTimeout := 10 * time.Minute - testCondition := "EmptyDir/ContainerOverlay usage limit violation" + testCondition := "EmptyDir/ContainerContainerEphemeralStorage usage limit violation" Context(fmt.Sprintf("EmptyDirEviction when we run containers that should cause %s", testCondition), func() { tempSetCurrentKubeletConfig(f, func(initialConfig *kubeletconfig.KubeletConfiguration) { initialConfig.FeatureGates += ", LocalStorageCapacityIsolation=true" From 9730e3d3029784e942719b6c3745c2c87cdce48a Mon Sep 17 00:00:00 2001 From: NickrenREN Date: Thu, 24 Aug 2017 12:43:06 +0800 Subject: [PATCH 337/403] Change validation for local ephemeral storage --- pkg/api/helper/helpers.go | 4 ++++ pkg/api/validation/validation.go | 4 ++-- pkg/api/validation/validation_test.go | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/api/helper/helpers.go b/pkg/api/helper/helpers.go index a77bf04892d89..e8b7ac923c444 100644 --- a/pkg/api/helper/helpers.go +++ b/pkg/api/helper/helpers.go @@ -107,6 +107,7 @@ func IsResourceQuotaScopeValidForResource(scope api.ResourceQuotaScope, resource var standardContainerResources = sets.NewString( string(api.ResourceCPU), string(api.ResourceMemory), + string(api.ResourceEphemeralStorage), ) // IsStandardContainerResourceName returns true if the container can make a resource request @@ -194,10 +195,13 @@ func IsStandardQuotaResourceName(str string) bool { var standardResources = sets.NewString( string(api.ResourceCPU), string(api.ResourceMemory), + string(api.ResourceEphemeralStorage), string(api.ResourceRequestsCPU), string(api.ResourceRequestsMemory), + string(api.ResourceRequestsEphemeralStorage), string(api.ResourceLimitsCPU), string(api.ResourceLimitsMemory), + string(api.ResourceLimitsEphemeralStorage), string(api.ResourcePods), string(api.ResourceQuotas), string(api.ResourceServices), diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 200e0c15d340a..94cd6b4a03544 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -3783,8 +3783,8 @@ func ValidateResourceRequirements(requirements *api.ResourceRequirements, fldPat // Validate resource quantity. allErrs = append(allErrs, ValidateResourceQuantityValue(string(resourceName), quantity, fldPath)...) - if resourceName == api.ResourceStorageOverlay && !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) { - allErrs = append(allErrs, field.Forbidden(limPath, "ResourceStorageOverlay field disabled by feature-gate for ResourceRequirements")) + if resourceName == api.ResourceEphemeralStorage && !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) { + allErrs = append(allErrs, field.Forbidden(limPath, "ResourceEphemeralStorage field disabled by feature-gate for ResourceRequirements")) } } for resourceName, quantity := range requirements.Requests { diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 50e36fe6b6a66..2ce196b5339cb 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -2683,7 +2683,7 @@ func TestAlphaLocalStorageCapacityIsolation(t *testing.T) { containerLimitCase := api.ResourceRequirements{ Limits: api.ResourceList{ - api.ResourceStorageOverlay: *resource.NewMilliQuantity( + api.ResourceEphemeralStorage: *resource.NewMilliQuantity( int64(40000), resource.BinarySI), }, From fd5c00b38dd7fb74eacecef47799972f59baa4dc Mon Sep 17 00:00:00 2001 From: Matt Moyer Date: Tue, 22 Aug 2017 15:51:57 -0500 Subject: [PATCH 338/403] Implement `auth-extra-groups` in bootstrap token authenticator. This implements support for the new `auth-extra-groups` key in `bootstrap.kubernetes.io/token` secrets by adding extra groups to the user info returned for valid bootstrap tokens. --- .../auth/authenticator/token/bootstrap/BUILD | 1 + .../token/bootstrap/bootstrap.go | 36 +++++- .../token/bootstrap/bootstrap_test.go | 110 ++++++++++++++++++ 3 files changed, 146 insertions(+), 1 deletion(-) diff --git a/plugin/pkg/auth/authenticator/token/bootstrap/BUILD b/plugin/pkg/auth/authenticator/token/bootstrap/BUILD index abba54f6eee35..ff951252f0896 100644 --- a/plugin/pkg/auth/authenticator/token/bootstrap/BUILD +++ b/plugin/pkg/auth/authenticator/token/bootstrap/BUILD @@ -30,6 +30,7 @@ go_library( "//pkg/client/listers/core/internalversion:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", ], ) diff --git a/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go b/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go index abd5eb196f240..fecea0f6855ff 100644 --- a/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go +++ b/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap.go @@ -23,11 +23,13 @@ import ( "crypto/subtle" "fmt" "regexp" + "strings" "time" "github.com/golang/glog" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apiserver/pkg/authentication/user" "k8s.io/kubernetes/pkg/api" bootstrapapi "k8s.io/kubernetes/pkg/bootstrap/api" @@ -79,6 +81,7 @@ func tokenErrorf(s *api.Secret, format string, i ...interface{}) { // token-id: ( token id ) // # Required key usage. // usage-bootstrap-authentication: true +// auth-extra-groups: "system:bootstrappers:custom-group1,system:bootstrappers:custom-group2" // # May also contain an expiry. // // Tokens are expected to be of the form: @@ -134,9 +137,15 @@ func (t *TokenAuthenticator) AuthenticateToken(token string) (user.Info, bool, e return nil, false, nil } + groups, err := getGroups(secret) + if err != nil { + tokenErrorf(secret, "has invalid value for key %s: %v.", bootstrapapi.BootstrapTokenExtraGroupsKey, err) + return nil, false, nil + } + return &user.DefaultInfo{ Name: bootstrapapi.BootstrapUserPrefix + string(id), - Groups: []string{bootstrapapi.BootstrapDefaultGroup}, + Groups: groups, }, true, nil } @@ -184,3 +193,28 @@ func parseToken(s string) (string, string, error) { } return split[1], split[2], nil } + +// getGroups loads and validates the bootstrapapi.BootstrapTokenExtraGroupsKey +// key from the bootstrap token secret, returning a list of group names or an +// error if any of the group names are invalid. +func getGroups(secret *api.Secret) ([]string, error) { + // always include the default group + groups := sets.NewString(bootstrapapi.BootstrapDefaultGroup) + + // grab any extra groups and if there are none, return just the default + extraGroupsString := getSecretString(secret, bootstrapapi.BootstrapTokenExtraGroupsKey) + if extraGroupsString == "" { + return groups.List(), nil + } + + // validate the names of the extra groups + for _, group := range strings.Split(extraGroupsString, ",") { + if err := bootstrapapi.ValidateBootstrapGroupName(group); err != nil { + return nil, err + } + groups.Insert(group) + } + + // return the result as a deduplicated, sorted list + return groups.List(), nil +} diff --git a/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap_test.go b/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap_test.go index e8586e9f1a4dc..7e76faaf63af8 100644 --- a/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap_test.go +++ b/plugin/pkg/auth/authenticator/token/bootstrap/bootstrap_test.go @@ -84,6 +84,47 @@ func TestTokenAuthenticator(t *testing.T) { Groups: []string{"system:bootstrappers"}, }, }, + { + name: "valid token with extra group", + secrets: []*api.Secret{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: bootstrapapi.BootstrapTokenSecretPrefix + tokenID, + }, + Data: map[string][]byte{ + bootstrapapi.BootstrapTokenIDKey: []byte(tokenID), + bootstrapapi.BootstrapTokenSecretKey: []byte(tokenSecret), + bootstrapapi.BootstrapTokenUsageAuthentication: []byte("true"), + bootstrapapi.BootstrapTokenExtraGroupsKey: []byte("system:bootstrappers:foo"), + }, + Type: "bootstrap.kubernetes.io/token", + }, + }, + token: tokenID + "." + tokenSecret, + wantUser: &user.DefaultInfo{ + Name: "system:bootstrap:" + tokenID, + Groups: []string{"system:bootstrappers", "system:bootstrappers:foo"}, + }, + }, + { + name: "invalid group", + secrets: []*api.Secret{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: bootstrapapi.BootstrapTokenSecretPrefix + tokenID, + }, + Data: map[string][]byte{ + bootstrapapi.BootstrapTokenIDKey: []byte(tokenID), + bootstrapapi.BootstrapTokenSecretKey: []byte(tokenSecret), + bootstrapapi.BootstrapTokenUsageAuthentication: []byte("true"), + bootstrapapi.BootstrapTokenExtraGroupsKey: []byte("foo"), + }, + Type: "bootstrap.kubernetes.io/token", + }, + }, + token: tokenID + "." + tokenSecret, + wantNotFound: true, + }, { name: "invalid secret name", secrets: []*api.Secret{ @@ -247,3 +288,72 @@ func TestTokenAuthenticator(t *testing.T) { }() } } + +func TestGetGroups(t *testing.T) { + tests := []struct { + name string + secret *api.Secret + expectResult []string + expectError bool + }{ + { + name: "not set", + secret: &api.Secret{ + ObjectMeta: metav1.ObjectMeta{Name: "test"}, + Data: map[string][]byte{}, + }, + expectResult: []string{"system:bootstrappers"}, + }, + { + name: "set to empty value", + secret: &api.Secret{ + ObjectMeta: metav1.ObjectMeta{Name: "test"}, + Data: map[string][]byte{ + bootstrapapi.BootstrapTokenExtraGroupsKey: []byte(""), + }, + }, + expectResult: []string{"system:bootstrappers"}, + }, + { + name: "invalid prefix", + secret: &api.Secret{ + ObjectMeta: metav1.ObjectMeta{Name: "test"}, + Data: map[string][]byte{ + bootstrapapi.BootstrapTokenExtraGroupsKey: []byte("foo"), + }, + }, + expectError: true, + }, + { + name: "valid", + secret: &api.Secret{ + ObjectMeta: metav1.ObjectMeta{Name: "test"}, + Data: map[string][]byte{ + bootstrapapi.BootstrapTokenExtraGroupsKey: []byte("system:bootstrappers:foo,system:bootstrappers:bar,system:bootstrappers:bar"), + }, + }, + // expect the results in deduplicated, sorted order + expectResult: []string{ + "system:bootstrappers", + "system:bootstrappers:bar", + "system:bootstrappers:foo", + }, + }, + } + for _, test := range tests { + result, err := getGroups(test.secret) + if test.expectError { + if err == nil { + t.Errorf("test %q expected an error, but didn't get one (result: %#v)", test.name, result) + } + continue + } + if err != nil { + t.Errorf("test %q return an unexpected error: %v", test.name, err) + continue + } + if !reflect.DeepEqual(result, test.expectResult) { + t.Errorf("test %q expected %#v, got %#v", test.name, test.expectResult, result) + } + } +} From 77f1b72a404b90326263fc55bef2f951b77db5f0 Mon Sep 17 00:00:00 2001 From: Matt Moyer Date: Tue, 22 Aug 2017 16:13:24 -0500 Subject: [PATCH 339/403] kubeadm: add `--groups` flag for `kubeadm token create`. This adds support for creating a bootstrap token that authenticates with extra `system:bootstrappers:*` groups in addition to `system:bootstrappers`. --- cmd/kubeadm/app/cmd/BUILD | 1 + cmd/kubeadm/app/cmd/init.go | 2 +- cmd/kubeadm/app/cmd/token.go | 25 ++++++++++++++++--- .../app/phases/bootstraptoken/node/token.go | 17 ++++++++----- .../phases/bootstraptoken/node/token_test.go | 2 +- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/cmd/kubeadm/app/cmd/BUILD b/cmd/kubeadm/app/cmd/BUILD index 4249096ded378..6c261ac2c68a9 100644 --- a/cmd/kubeadm/app/cmd/BUILD +++ b/cmd/kubeadm/app/cmd/BUILD @@ -66,6 +66,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index 1fdbd1cf82b71..d6f08cf471c69 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -339,7 +339,7 @@ func (i *Init) Run(out io.Writer) error { // Create the default node bootstrap token tokenDescription := "The default bootstrap token generated by 'kubeadm init'." - if err := nodebootstraptokenphase.UpdateOrCreateToken(client, i.cfg.Token, false, i.cfg.TokenTTL, kubeadmconstants.DefaultTokenUsages, tokenDescription); err != nil { + if err := nodebootstraptokenphase.UpdateOrCreateToken(client, i.cfg.Token, false, i.cfg.TokenTTL, kubeadmconstants.DefaultTokenUsages, []string{}, tokenDescription); err != nil { return err } // Create RBAC rules that makes the bootstrap tokens able to post CSRs diff --git a/cmd/kubeadm/app/cmd/token.go b/cmd/kubeadm/app/cmd/token.go index d3bbda1041dee..1aab3f196e0b4 100644 --- a/cmd/kubeadm/app/cmd/token.go +++ b/cmd/kubeadm/app/cmd/token.go @@ -31,6 +31,7 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/util/sets" clientset "k8s.io/client-go/kubernetes" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" @@ -87,6 +88,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { "dry-run", dryRun, "Whether to enable dry-run mode or not") var usages []string + var extraGroups []string var tokenDuration time.Duration var description string createCmd := &cobra.Command{ @@ -114,7 +116,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { fmt.Fprintln(errW, "[kubeadm] WARNING: starting in 1.8, tokens expire after 24 hours by default (if you require a non-expiring token use --ttl 0)") } - err = RunCreateToken(out, client, token, tokenDuration, usages, description) + err = RunCreateToken(out, client, token, tokenDuration, usages, extraGroups, description) kubeadmutil.CheckErr(err) }, } @@ -122,6 +124,9 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { "ttl", kubeadmconstants.DefaultTokenDuration, "The duration before the token is automatically deleted (e.g. 1s, 2m, 3h). 0 means 'never expires'.") createCmd.Flags().StringSliceVar(&usages, "usages", kubeadmconstants.DefaultTokenUsages, "The ways in which this token can be used. Valid options: [signing,authentication].") + createCmd.Flags().StringSliceVar(&extraGroups, + "groups", []string{}, + fmt.Sprintf("Extra groups that this token will authenticate as when used for authentication. Must match %q.", bootstrapapi.BootstrapGroupPattern)) createCmd.Flags().StringVar(&description, "description", "", "A human friendly description of how this token is used.") tokenCmd.AddCommand(createCmd) @@ -192,7 +197,7 @@ func NewCmdTokenGenerate(out io.Writer) *cobra.Command { } // RunCreateToken generates a new bootstrap token and stores it as a secret on the server. -func RunCreateToken(out io.Writer, client clientset.Interface, token string, tokenDuration time.Duration, usages []string, description string) error { +func RunCreateToken(out io.Writer, client clientset.Interface, token string, tokenDuration time.Duration, usages []string, extraGroups []string, description string) error { if len(token) == 0 { var err error @@ -207,8 +212,22 @@ func RunCreateToken(out io.Writer, client clientset.Interface, token string, tok } } + // adding groups only makes sense for authentication + var usagesSet sets.String + usagesSet.Insert(usages...) + if len(extraGroups) > 0 && !usagesSet.Has("authentication") { + return fmt.Errorf("--groups cannot be specified unless --usages includes \"authentication\"") + } + + // validate any extra group names + for _, group := range extraGroups { + if err := bootstrapapi.ValidateBootstrapGroupName(group); err != nil { + return err + } + } + // TODO: Validate usages here so we don't allow something unsupported - err := tokenphase.CreateNewToken(client, token, tokenDuration, usages, description) + err := tokenphase.CreateNewToken(client, token, tokenDuration, usages, extraGroups, description) if err != nil { return err } diff --git a/cmd/kubeadm/app/phases/bootstraptoken/node/token.go b/cmd/kubeadm/app/phases/bootstraptoken/node/token.go index e4c29912e4af7..4b59d81fcc057 100644 --- a/cmd/kubeadm/app/phases/bootstraptoken/node/token.go +++ b/cmd/kubeadm/app/phases/bootstraptoken/node/token.go @@ -18,6 +18,7 @@ package node import ( "fmt" + "strings" "time" "k8s.io/api/core/v1" @@ -33,12 +34,12 @@ const tokenCreateRetries = 5 // TODO(mattmoyer): Move CreateNewToken, UpdateOrCreateToken and encodeTokenSecretData out of this package to client-go for a generic abstraction and client for a Bootstrap Token // CreateNewToken tries to create a token and fails if one with the same ID already exists -func CreateNewToken(client clientset.Interface, token string, tokenDuration time.Duration, usages []string, description string) error { - return UpdateOrCreateToken(client, token, true, tokenDuration, usages, description) +func CreateNewToken(client clientset.Interface, token string, tokenDuration time.Duration, usages []string, extraGroups []string, description string) error { + return UpdateOrCreateToken(client, token, true, tokenDuration, usages, extraGroups, description) } // UpdateOrCreateToken attempts to update a token with the given ID, or create if it does not already exist. -func UpdateOrCreateToken(client clientset.Interface, token string, failIfExists bool, tokenDuration time.Duration, usages []string, description string) error { +func UpdateOrCreateToken(client clientset.Interface, token string, failIfExists bool, tokenDuration time.Duration, usages []string, extraGroups []string, description string) error { tokenID, tokenSecret, err := tokenutil.ParseToken(token) if err != nil { return err @@ -52,7 +53,7 @@ func UpdateOrCreateToken(client clientset.Interface, token string, failIfExists return fmt.Errorf("a token with id %q already exists", tokenID) } // Secret with this ID already exists, update it: - secret.Data = encodeTokenSecretData(tokenID, tokenSecret, tokenDuration, usages, description) + secret.Data = encodeTokenSecretData(tokenID, tokenSecret, tokenDuration, usages, extraGroups, description) if _, err := client.CoreV1().Secrets(metav1.NamespaceSystem).Update(secret); err == nil { return nil } @@ -67,7 +68,7 @@ func UpdateOrCreateToken(client clientset.Interface, token string, failIfExists Name: secretName, }, Type: v1.SecretType(bootstrapapi.SecretTypeBootstrapToken), - Data: encodeTokenSecretData(tokenID, tokenSecret, tokenDuration, usages, description), + Data: encodeTokenSecretData(tokenID, tokenSecret, tokenDuration, usages, extraGroups, description), } if _, err := client.CoreV1().Secrets(metav1.NamespaceSystem).Create(secret); err == nil { return nil @@ -85,12 +86,16 @@ func UpdateOrCreateToken(client clientset.Interface, token string, failIfExists } // encodeTokenSecretData takes the token discovery object and an optional duration and returns the .Data for the Secret -func encodeTokenSecretData(tokenID, tokenSecret string, duration time.Duration, usages []string, description string) map[string][]byte { +func encodeTokenSecretData(tokenID, tokenSecret string, duration time.Duration, usages []string, extraGroups []string, description string) map[string][]byte { data := map[string][]byte{ bootstrapapi.BootstrapTokenIDKey: []byte(tokenID), bootstrapapi.BootstrapTokenSecretKey: []byte(tokenSecret), } + if len(extraGroups) > 0 { + data[bootstrapapi.BootstrapTokenExtraGroupsKey] = []byte(strings.Join(extraGroups, ",")) + } + if duration > 0 { // Get the current time, add the specified duration, and format it accordingly durationString := time.Now().Add(duration).Format(time.RFC3339) diff --git a/cmd/kubeadm/app/phases/bootstraptoken/node/token_test.go b/cmd/kubeadm/app/phases/bootstraptoken/node/token_test.go index 48a6f80e9827a..7af575e01d161 100644 --- a/cmd/kubeadm/app/phases/bootstraptoken/node/token_test.go +++ b/cmd/kubeadm/app/phases/bootstraptoken/node/token_test.go @@ -33,7 +33,7 @@ func TestEncodeTokenSecretData(t *testing.T) { {token: &kubeadmapi.TokenDiscovery{ID: "foo", Secret: "bar"}, t: time.Second}, // should use default } for _, rt := range tests { - actual := encodeTokenSecretData(rt.token.ID, rt.token.Secret, rt.t, []string{}, "") + actual := encodeTokenSecretData(rt.token.ID, rt.token.Secret, rt.t, []string{}, []string{}, "") if !bytes.Equal(actual["token-id"], []byte(rt.token.ID)) { t.Errorf( "failed EncodeTokenSecretData:\n\texpected: %s\n\t actual: %s", From c7996a7236ee67c01babcfca3f4a91f88cca699e Mon Sep 17 00:00:00 2001 From: Matt Moyer Date: Wed, 23 Aug 2017 16:37:56 -0500 Subject: [PATCH 340/403] kubeadm: add extra group info to `token list`. This adds an `EXTRA GROUPS` column to the output of `kubeadm token list`. This displays any extra `system:bootstrappers:*` groups that are specified in the token's `auth-extra-groups` key. --- cmd/kubeadm/app/cmd/token.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cmd/kubeadm/app/cmd/token.go b/cmd/kubeadm/app/cmd/token.go index 1aab3f196e0b4..f21b22934b2c4 100644 --- a/cmd/kubeadm/app/cmd/token.go +++ b/cmd/kubeadm/app/cmd/token.go @@ -265,7 +265,7 @@ func RunListTokens(out io.Writer, errW io.Writer, client clientset.Interface) er } w := tabwriter.NewWriter(out, 10, 4, 3, ' ', 0) - fmt.Fprintln(w, "TOKEN\tTTL\tEXPIRES\tUSAGES\tDESCRIPTION") + fmt.Fprintln(w, "TOKEN\tTTL\tEXPIRES\tUSAGES\tDESCRIPTION\tEXTRA GROUPS") for _, secret := range secrets.Items { tokenId := getSecretString(&secret, bootstrapapi.BootstrapTokenIDKey) if len(tokenId) == 0 { @@ -323,7 +323,12 @@ func RunListTokens(out io.Writer, errW io.Writer, client clientset.Interface) er if len(description) == 0 { description = "" } - fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\n", tokenutil.BearerToken(td), ttl, expires, usageString, description) + + groups := getSecretString(&secret, bootstrapapi.BootstrapTokenExtraGroupsKey) + if len(groups) == 0 { + groups = "" + } + fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\n", tokenutil.BearerToken(td), ttl, expires, usageString, description, groups) } w.Flush() return nil From b760fa95e5832b983b8fc331c6c7032a71b9e3ca Mon Sep 17 00:00:00 2001 From: Lantao Liu Date: Fri, 25 Aug 2017 18:10:57 +0000 Subject: [PATCH 341/403] Fix NoNewPrivs and also allow remote runtime to provide the support. --- pkg/kubelet/lifecycle/handlers.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/kubelet/lifecycle/handlers.go b/pkg/kubelet/lifecycle/handlers.go index 3ee925cf25a5b..8d606796ae789 100644 --- a/pkg/kubelet/lifecycle/handlers.go +++ b/pkg/kubelet/lifecycle/handlers.go @@ -187,6 +187,11 @@ func (a *noNewPrivsAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult return PodAdmitResult{Admit: true} } + // Always admit for remote runtime. + if a.Runtime.Type() == kubetypes.RemoteContainerRuntime { + return PodAdmitResult{Admit: true} + } + // Make sure it is either docker or rkt runtimes. if a.Runtime.Type() != kubetypes.DockerContainerRuntime && a.Runtime.Type() != kubetypes.RktContainerRuntime { return PodAdmitResult{ @@ -196,7 +201,7 @@ func (a *noNewPrivsAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult } } - if a.Runtime.Type() != kubetypes.DockerContainerRuntime { + if a.Runtime.Type() == kubetypes.DockerContainerRuntime { // Make sure docker api version is valid. rversion, err := a.Runtime.APIVersion() if err != nil { @@ -206,7 +211,7 @@ func (a *noNewPrivsAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult Message: fmt.Sprintf("Cannot enforce NoNewPrivs: %v", err), } } - v, err := rversion.Compare("1.23") + v, err := rversion.Compare("1.23.0") if err != nil { return PodAdmitResult{ Admit: false, From cf75c4988304ff8eab4d0223fa63095e626faaeb Mon Sep 17 00:00:00 2001 From: Josh Horwitz Date: Fri, 25 Aug 2017 18:04:10 -0400 Subject: [PATCH 342/403] change godoc based on feedback from luxas --- pkg/cloudprovider/cloud.go | 2 +- pkg/cloudprovider/providers/aws/aws.go | 2 +- pkg/cloudprovider/providers/azure/azure_instances.go | 2 +- pkg/cloudprovider/providers/fake/fake.go | 2 +- pkg/cloudprovider/providers/gce/gce_instances.go | 2 +- pkg/cloudprovider/providers/openstack/openstack_instances.go | 2 +- pkg/cloudprovider/providers/ovirt/ovirt.go | 2 +- pkg/cloudprovider/providers/photon/photon.go | 2 +- pkg/cloudprovider/providers/rackspace/rackspace.go | 2 +- pkg/cloudprovider/providers/vsphere/vsphere.go | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pkg/cloudprovider/cloud.go b/pkg/cloudprovider/cloud.go index 47e088a09e696..3b19b2323dda9 100644 --- a/pkg/cloudprovider/cloud.go +++ b/pkg/cloudprovider/cloud.go @@ -141,7 +141,7 @@ type Instances interface { // On most clouds (e.g. GCE) this is the hostname, so we provide the hostname CurrentNodeName(hostname string) (types.NodeName, error) // InstanceExistsByProviderID returns true if the instance for the given provider id still is running. - // If false is returned with no error, the instance will be immediately deleted. + // If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. InstanceExistsByProviderID(providerID string) (bool, error) } diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index a2132f531a393..999f056b0c3d8 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -1102,7 +1102,7 @@ func (c *Cloud) ExternalID(nodeName types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. -// If false is returned with no error, the instance will be immediately deleted. +// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (c *Cloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/azure/azure_instances.go b/pkg/cloudprovider/providers/azure/azure_instances.go index b2d5a9785c446..85e7f6acd1c57 100644 --- a/pkg/cloudprovider/providers/azure/azure_instances.go +++ b/pkg/cloudprovider/providers/azure/azure_instances.go @@ -88,7 +88,7 @@ func (az *Cloud) ExternalID(name types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. -// If false is returned with no error, the instance will be immediately deleted. +// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (az *Cloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/fake/fake.go b/pkg/cloudprovider/providers/fake/fake.go index 78deba4826819..8de9fa75018d3 100644 --- a/pkg/cloudprovider/providers/fake/fake.go +++ b/pkg/cloudprovider/providers/fake/fake.go @@ -239,7 +239,7 @@ func (f *FakeCloud) InstanceTypeByProviderID(providerID string) (string, error) } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. -// If false is returned with no error, the instance will be immediately deleted. +// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (f *FakeCloud) InstanceExistsByProviderID(providerID string) (bool, error) { f.addCall("instance-exists-by-provider-id") return f.ExistsByProviderID, f.ErrByProviderID diff --git a/pkg/cloudprovider/providers/gce/gce_instances.go b/pkg/cloudprovider/providers/gce/gce_instances.go index 0687dfa5279b3..d17a91bd8e98d 100644 --- a/pkg/cloudprovider/providers/gce/gce_instances.go +++ b/pkg/cloudprovider/providers/gce/gce_instances.go @@ -153,7 +153,7 @@ func (gce *GCECloud) ExternalID(nodeName types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. -// If false is returned with no error, the instance will be immediately deleted. +// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (gce *GCECloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/openstack/openstack_instances.go b/pkg/cloudprovider/providers/openstack/openstack_instances.go index 6f81763794006..7a7574a968abc 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_instances.go +++ b/pkg/cloudprovider/providers/openstack/openstack_instances.go @@ -111,7 +111,7 @@ func (i *Instances) ExternalID(name types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. -// If false is returned with no error, the instance will be immediately deleted. +// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (i *Instances) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/ovirt/ovirt.go b/pkg/cloudprovider/providers/ovirt/ovirt.go index 96eed8d9a299a..d255979412627 100644 --- a/pkg/cloudprovider/providers/ovirt/ovirt.go +++ b/pkg/cloudprovider/providers/ovirt/ovirt.go @@ -212,7 +212,7 @@ func (v *OVirtCloud) ExternalID(nodeName types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. -// If false is returned with no error, the instance will be immediately deleted. +// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (v *OVirtCloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/photon/photon.go b/pkg/cloudprovider/providers/photon/photon.go index 9612f1b463d4b..f3a6f4f0f14b8 100644 --- a/pkg/cloudprovider/providers/photon/photon.go +++ b/pkg/cloudprovider/providers/photon/photon.go @@ -471,7 +471,7 @@ func (pc *PCCloud) ExternalID(nodeName k8stypes.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. -// If false is returned with no error, the instance will be immediately deleted. +// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (pc *PCCloud) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/rackspace/rackspace.go b/pkg/cloudprovider/providers/rackspace/rackspace.go index e5a84cbc831f2..e06485828863f 100644 --- a/pkg/cloudprovider/providers/rackspace/rackspace.go +++ b/pkg/cloudprovider/providers/rackspace/rackspace.go @@ -437,7 +437,7 @@ func (i *Instances) ExternalID(nodeName types.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. -// If false is returned with no error, the instance will be immediately deleted. +// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (i *Instances) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 2407d569331da..3f0e66582101d 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -377,7 +377,7 @@ func (vs *VSphere) ExternalID(nodeName k8stypes.NodeName) (string, error) { } // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. -// If false is returned with no error, the instance will be immediately deleted. +// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (vs *VSphere) InstanceExistsByProviderID(providerID string) (bool, error) { return false, errors.New("unimplemented") } From b1fb289f0fafb2471eafd54133dfe23824f313f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Sat, 26 Aug 2017 01:50:24 +0300 Subject: [PATCH 343/403] kubeadm: Move the uploadconfig phase right in the beginning of cluster init --- cmd/kubeadm/app/cmd/init.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index 1fdbd1cf82b71..51b3f1cef4a11 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -327,6 +327,13 @@ func (i *Init) Run(out io.Writer) error { return err } + // Upload currently used configuration to the cluster + // Note: This is done right in the beginning of cluster initialization; as we might want to make other phases + // depend on centralized information from this source in the future + if err := uploadconfigphase.UploadConfiguration(i.cfg, client); err != nil { + return err + } + // PHASE 4: Mark the master with the right label/taint if err := markmasterphase.MarkMaster(client, i.cfg.NodeName); err != nil { return err @@ -361,11 +368,6 @@ func (i *Init) Run(out io.Writer) error { // PHASE 6: Install and deploy all addons, and configure things as necessary - // Upload currently used configuration to the cluster - if err := uploadconfigphase.UploadConfiguration(i.cfg, client); err != nil { - return err - } - if err := apiconfigphase.CreateRBACRules(client, k8sVersion); err != nil { return err } From fd860227147a2d3cd64ccd37b0d75900e6fc2e0e Mon Sep 17 00:00:00 2001 From: andrewsykim Date: Thu, 24 Aug 2017 23:20:58 -0400 Subject: [PATCH 344/403] add deprecation warnings for auto detecting cloud providers --- cmd/kubelet/app/options/options.go | 8 ++++++-- cmd/kubelet/app/server.go | 4 ++++ pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go | 4 ++++ pkg/kubelet/kubelet.go | 6 +++++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/cmd/kubelet/app/options/options.go b/cmd/kubelet/app/options/options.go index ad60d5fa83c3a..9afb0018e0865 100644 --- a/cmd/kubelet/app/options/options.go +++ b/cmd/kubelet/app/options/options.go @@ -121,8 +121,12 @@ func NewKubeletFlags() *KubeletFlags { KubeConfig: flag.NewStringFlag("/var/lib/kubelet/kubeconfig"), ContainerRuntimeOptions: *NewContainerRuntimeOptions(), CertDirectory: "/var/run/kubernetes", - CloudProvider: v1alpha1.AutoDetectCloudProvider, RootDirectory: v1alpha1.DefaultRootDir, + // DEPRECATED: auto detecting cloud providers goes against the initiative + // for out-of-tree cloud providers as we'll now depend on cAdvisor integrations + // with cloud providers instead of in the core repo. + // More details here: https://github.com/kubernetes/kubernetes/issues/50986 + CloudProvider: v1alpha1.AutoDetectCloudProvider, } } @@ -220,7 +224,7 @@ func (f *KubeletFlags) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&f.CertDirectory, "cert-dir", f.CertDirectory, "The directory where the TLS certs are located. "+ "If --tls-cert-file and --tls-private-key-file are provided, this flag will be ignored.") - fs.StringVar(&f.CloudProvider, "cloud-provider", f.CloudProvider, "The provider for cloud services. By default, kubelet will attempt to auto-detect the cloud provider. Specify empty string for running with no cloud provider.") + fs.StringVar(&f.CloudProvider, "cloud-provider", f.CloudProvider, "The provider for cloud services. By default, kubelet will attempt to auto-detect the cloud provider (deprecated). Specify empty string for running with no cloud provider, this will be the default in upcoming releases.") fs.StringVar(&f.CloudConfigFile, "cloud-config", f.CloudConfigFile, "The path to the cloud provider configuration file. Empty string for no configuration file.") fs.StringVar(&f.RootDirectory, "root-dir", f.RootDirectory, "Directory path for managing kubelet files (volume mounts,etc).") diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index 85d37b75c60ab..059987becc586 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -283,6 +283,10 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies) (err error) { } } + if s.CloudProvider == kubeletconfigv1alpha1.AutoDetectCloudProvider { + glog.Warning("--cloud-provider=auto-detect is deprecated. The desired cloud provider should be set explicitly") + } + if kubeDeps.Cloud == nil { if !cloudprovider.IsExternal(s.CloudProvider) && s.CloudProvider != kubeletconfigv1alpha1.AutoDetectCloudProvider { cloud, err := cloudprovider.InitCloudProvider(s.CloudProvider, s.CloudConfigFile) diff --git a/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go b/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go index 669b693a7b66c..e8901ca298e04 100644 --- a/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go +++ b/pkg/kubelet/apis/kubeletconfig/v1alpha1/defaults.go @@ -32,6 +32,10 @@ import ( const ( DefaultRootDir = "/var/lib/kubelet" + // DEPRECATED: auto detecting cloud providers goes against the initiative + // for out-of-tree cloud providers as we'll now depend on cAdvisor integrations + // with cloud providers instead of in the core repo. + // More details here: https://github.com/kubernetes/kubernetes/issues/50986 AutoDetectCloudProvider = "auto-detect" defaultIPTablesMasqueradeBit = 14 diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 80fd03f26a163..c35edd6519cae 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -952,7 +952,11 @@ type Kubelet struct { volumeManager volumemanager.VolumeManager // Cloud provider interface. - cloud cloudprovider.Interface + cloud cloudprovider.Interface + // DEPRECATED: auto detecting cloud providers goes against the initiative + // for out-of-tree cloud providers as we'll now depend on cAdvisor integrations + // with cloud providers instead of in the core repo. + // More details here: https://github.com/kubernetes/kubernetes/issues/50986 autoDetectCloudProvider bool // Indicates that the node initialization happens in an external cloud controller externalCloudProvider bool From 68232c328fa0f26c6c66c3d1896ce0b9155aeb06 Mon Sep 17 00:00:00 2001 From: Christoph Blecker Date: Fri, 25 Aug 2017 16:51:51 -0700 Subject: [PATCH 345/403] Create kube::util::create-fake-git-tree function --- hack/lib/util.sh | 19 ++++++++++++++++++- hack/update-staging-godeps-dockerized.sh | 23 +++++++---------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/hack/lib/util.sh b/hack/lib/util.sh index ab27382c56efc..8e96ad462b1d0 100755 --- a/hack/lib/util.sh +++ b/hack/lib/util.sh @@ -331,7 +331,7 @@ kube::util::group-version-to-pkg-path() { return fi - # "v1" is the API GroupVersion + # "v1" is the API GroupVersion if [[ "${group_version}" == "v1" ]]; then echo "vendor/k8s.io/api/core/v1" return @@ -437,6 +437,23 @@ kube::util::git_upstream_remote_name() { head -n 1 | awk '{print $1}' } +# Ensures the current directory is a git tree for doing things like restoring or +# validating godeps +kube::util::create-fake-git-tree() { + local -r target_dir=${1:-$(pwd)} + + pushd "${target_dir}" >/dev/null + git init >/dev/null + git config --local user.email "nobody@k8s.io" + git config --local user.name "$0" + git add . >/dev/null + git commit -q -m "Snapshot" >/dev/null + if (( ${KUBE_VERBOSE:-5} >= 6 )); then + kube::log::status "${target_dir} is now a git tree." + fi + popd >/dev/null +} + # Checks whether godep restore was run in the current GOPATH, i.e. that all referenced repos exist # and are checked out to the referenced rev. kube::util::godep_restored() { diff --git a/hack/update-staging-godeps-dockerized.sh b/hack/update-staging-godeps-dockerized.sh index 458cbb211f247..bf4bbea8bba2f 100755 --- a/hack/update-staging-godeps-dockerized.sh +++ b/hack/update-staging-godeps-dockerized.sh @@ -50,11 +50,16 @@ while getopts ":df" opt; do esac done +# Confirm this is running inside a docker container, as this will modify the git tree (unsafe to run outside of container) kube::util::ensure_dockerized kube::golang::setup_env +# Ensure we have a simple gopath so that we can modify it, and that no staging repos have made their way in kube::util::ensure_single_dir_gopath kube::util::ensure_no_staging_repos_in_gopath +# Confirm we have the right godep version installed kube::util::ensure_godep_version v79 +# Create a fake git repo the root of the repo to prevent godeps from complaining +kube::util::create-fake-git-tree "${KUBE_ROOT}" kube::log::status "Checking whether godeps are restored" if ! kube::util::godep_restored 2>&1 | sed 's/^/ /'; then @@ -87,27 +92,13 @@ function diffGodepManifest() { fi } -# Create a fake git repo for staging to prevent godeps from complaining -pushd "${KUBE_ROOT}" >/dev/null - git init >/dev/null - git config --local user.email "nobody@k8s.io" - git config --local user.name "$0" - git add . >/dev/null - git commit -q -m "Snapshot" >/dev/null -popd >/dev/null - # move into staging and save the dependencies for everything in order mkdir -p "${TMP_GOPATH}/src/k8s.io" for repo in $(ls ${KUBE_ROOT}/staging/src/k8s.io); do cp -a "${KUBE_ROOT}/staging/src/k8s.io/${repo}" "${TMP_GOPATH}/src/k8s.io/" - pushd "${TMP_GOPATH}/src/k8s.io/${repo}" >/dev/null - git init >/dev/null - git config --local user.email "nobody@k8s.io" - git config --local user.name "$0" - git add . >/dev/null - git commit -q -m "Snapshot" >/dev/null - popd >/dev/null + # Create a fake git tree for the staging repo to prevent godeps from complaining + kube::util::create-fake-git-tree "${TMP_GOPATH}/src/k8s.io/${repo}" updateGodepManifest diffGodepManifest From 4d63e13c9fedd75e352e09102497a768f79da225 Mon Sep 17 00:00:00 2001 From: Christoph Blecker Date: Fri, 25 Aug 2017 16:58:06 -0700 Subject: [PATCH 346/403] Add option to copy output when running the build shell --- build/run.sh | 11 ++++++++++- build/shell.sh | 5 +---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/build/run.sh b/build/run.sh index af6e92dfa3f37..5304f92803743 100755 --- a/build/run.sh +++ b/build/run.sh @@ -25,10 +25,19 @@ set -o pipefail KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. source "$KUBE_ROOT/build/common.sh" +KUBE_RUN_COPY_OUTPUT="${KUBE_RUN_COPY_OUTPUT:-y}" + kube::build::verify_prereqs kube::build::build_image + +if [[ ${KUBE_RUN_COPY_OUTPUT} =~ ^[yY]$ ]]; then + kube::log::status "Output from this container will be rsynced out upon completion. Set KUBE_RUN_COPY_OUTPUT=n to disable." +else + kube::log::status "Output from this container will NOT be rsynced out upon completion. Set KUBE_RUN_COPY_OUTPUT=y to enable." +fi + kube::build::run_build_command "$@" -if [[ ${KUBE_RUN_COPY_OUTPUT:-y} =~ ^[yY]$ ]]; then +if [[ ${KUBE_RUN_COPY_OUTPUT} =~ ^[yY]$ ]]; then kube::build::copy_output fi diff --git a/build/shell.sh b/build/shell.sh index 6f546b662de3f..dac2e4949766e 100755 --- a/build/shell.sh +++ b/build/shell.sh @@ -24,8 +24,5 @@ set -o pipefail KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. source "${KUBE_ROOT}/build/common.sh" -source "${KUBE_ROOT}/build/lib/release.sh" -kube::build::verify_prereqs -kube::build::build_image -kube::build::run_build_command bash || true +KUBE_RUN_COPY_OUTPUT="${KUBE_RUN_COPY_OUTPUT:-n}" "${KUBE_ROOT}/build/run.sh" bash "$@" From 4f1106c8a536228dd6d401698ee304b5b24383b1 Mon Sep 17 00:00:00 2001 From: Christoph Blecker Date: Fri, 25 Aug 2017 16:58:59 -0700 Subject: [PATCH 347/403] Modify rsync filter to retain output across runs --- build/common.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/build/common.sh b/build/common.sh index 80c6fc7d8a397..2db1fae322668 100755 --- a/build/common.sh +++ b/build/common.sh @@ -654,7 +654,6 @@ function kube::build::stop_rsyncd_container() { function kube::build::rsync { local -a rsync_opts=( --archive - --prune-empty-dirs --password-file="${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password" ) if (( ${KUBE_VERBOSE} >= 6 )); then @@ -679,16 +678,19 @@ function kube::build::sync_to_container() { # directory and generated files. The '- /' filter prevents rsync # from trying to set the uid/gid/perms on the root of the sync tree. # As an exception, we need to sync generated files in staging/, because - # they will not be re-generated by 'make'. + # they will not be re-generated by 'make'. Note that the 'H' filtered files + # are hidden from rsync so they will be deleted in the target container if + # they exist. This will allow them to be re-created in the container if + # necessary. kube::build::rsync \ --delete \ - --filter='- /.git/' \ + --filter='H /.git/' \ --filter='- /.make/' \ --filter='- /_tmp/' \ --filter='- /_output/' \ --filter='- /' \ - --filter='- zz_generated.*' \ - --filter='- generated.proto' \ + --filter='H zz_generated.*' \ + --filter='H generated.proto' \ "${KUBE_ROOT}/" "rsync://k8s@${KUBE_RSYNC_ADDR}/k8s/" kube::build::stop_rsyncd_container @@ -714,6 +716,7 @@ function kube::build::copy_output() { # We are looking to copy out all of the built binaries along with various # generated files. kube::build::rsync \ + --prune-empty-dirs \ --filter='- /_temp/' \ --filter='+ /vendor/' \ --filter='+ /Godeps/' \ From 0d55f6bdcbcb16fe6f5f117acc946aa0e94732eb Mon Sep 17 00:00:00 2001 From: Nick Sardo Date: Fri, 25 Aug 2017 18:02:10 -0700 Subject: [PATCH 348/403] Revert "GCE: Consume new config value for network project id" --- pkg/cloudprovider/providers/gce/gce.go | 156 +++----- .../providers/gce/gce_firewall.go | 14 +- .../gce/gce_loadbalancer_external.go | 4 +- pkg/cloudprovider/providers/gce/gce_op.go | 34 +- pkg/cloudprovider/providers/gce/gce_routes.go | 14 +- pkg/cloudprovider/providers/gce/gce_test.go | 336 ++++++++++-------- test/e2e/e2e.go | 4 +- 7 files changed, 258 insertions(+), 304 deletions(-) diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index 14cefb31eb40a..c11c961d2d01f 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -144,51 +144,42 @@ type GCEServiceManager struct { gce *GCECloud } -type ConfigGlobal struct { - TokenURL string `gcfg:"token-url"` - TokenBody string `gcfg:"token-body"` - // ProjectID and NetworkProjectID can either be the numeric or string-based - // unique identifier that starts with [a-z]. - ProjectID string `gcfg:"project-id"` - // NetworkProjectID refers to the project which owns the network being used. - NetworkProjectID string `gcfg:"network-project-id"` - NetworkName string `gcfg:"network-name"` - SubnetworkName string `gcfg:"subnetwork-name"` - // SecondaryRangeName is the name of the secondary range to allocate IP - // aliases. The secondary range must be present on the subnetwork the - // cluster is attached to. - SecondaryRangeName string `gcfg:"secondary-range-name"` - NodeTags []string `gcfg:"node-tags"` - NodeInstancePrefix string `gcfg:"node-instance-prefix"` - Multizone bool `gcfg:"multizone"` - // ApiEndpoint is the GCE compute API endpoint to use. If this is blank, - // then the default endpoint is used. - ApiEndpoint string `gcfg:"api-endpoint"` - // LocalZone specifies the GCE zone that gce cloud client instance is - // located in (i.e. where the controller will be running). If this is - // blank, then the local zone will be discovered via the metadata server. - LocalZone string `gcfg:"local-zone"` - // Possible values: List of api names separated by comma. Default to none. - // For example: MyFeatureFlag - AlphaFeatures []string `gcfg:"alpha-features"` -} - // ConfigFile is the struct used to parse the /etc/gce.conf configuration file. type ConfigFile struct { - Global ConfigGlobal `gcfg:"global"` + Global struct { + TokenURL string `gcfg:"token-url"` + TokenBody string `gcfg:"token-body"` + ProjectID string `gcfg:"project-id"` + NetworkName string `gcfg:"network-name"` + SubnetworkName string `gcfg:"subnetwork-name"` + // SecondaryRangeName is the name of the secondary range to allocate IP + // aliases. The secondary range must be present on the subnetwork the + // cluster is attached to. + SecondaryRangeName string `gcfg:"secondary-range-name"` + NodeTags []string `gcfg:"node-tags"` + NodeInstancePrefix string `gcfg:"node-instance-prefix"` + Multizone bool `gcfg:"multizone"` + // ApiEndpoint is the GCE compute API endpoint to use. If this is blank, + // then the default endpoint is used. + ApiEndpoint string `gcfg:"api-endpoint"` + // LocalZone specifies the GCE zone that gce cloud client instance is + // located in (i.e. where the controller will be running). If this is + // blank, then the local zone will be discovered via the metadata server. + LocalZone string `gcfg:"local-zone"` + // AlphaFeatures is a list of API flags to be enabled. Defaults to none. + // Example API name format: "MyFeatureFlag" + AlphaFeatures []string `gcfg:"alpha-features"` + } } // CloudConfig includes all the necessary configuration for creating GCECloud type CloudConfig struct { ApiEndpoint string ProjectID string - NetworkProjectID string Region string Zone string ManagedZones []string - NetworkName string NetworkURL string - SubnetworkName string SubnetworkURL string SecondaryRangeName string NodeTags []string @@ -216,6 +207,11 @@ func (g *GCECloud) GetKMSService() *cloudkms.Service { return g.cloudkmsService } +// Returns the ProjectID corresponding to the project this cloud is in. +func (g *GCECloud) GetProjectID() string { + return g.projectID +} + // newGCECloud creates a new instance of GCECloud. func newGCECloud(config io.Reader) (gceCloud *GCECloud, err error) { var cloudConfig *CloudConfig @@ -284,7 +280,6 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err return nil, err } } - if configFile != nil { if configFile.Global.ProjectID != "" { cloudConfig.ProjectID = configFile.Global.ProjectID @@ -292,9 +287,6 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err if configFile.Global.LocalZone != "" { cloudConfig.Zone = configFile.Global.LocalZone } - if configFile.Global.NetworkProjectID != "" { - cloudConfig.NetworkProjectID = configFile.Global.NetworkProjectID - } } // retrieve region @@ -309,27 +301,27 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err cloudConfig.ManagedZones = nil // Use all zones in region } - // Determine if network parameter is URL or Name + // generate networkURL if configFile != nil && configFile.Global.NetworkName != "" { if strings.Contains(configFile.Global.NetworkName, "/") { cloudConfig.NetworkURL = configFile.Global.NetworkName } else { - cloudConfig.NetworkName = configFile.Global.NetworkName + cloudConfig.NetworkURL = gceNetworkURL(cloudConfig.ApiEndpoint, cloudConfig.ProjectID, configFile.Global.NetworkName) } } else { - cloudConfig.NetworkName, err = getNetworkNameViaMetadata() + networkName, err := getNetworkNameViaMetadata() if err != nil { return nil, err } + cloudConfig.NetworkURL = gceNetworkURL("", cloudConfig.ProjectID, networkName) } - // Determine if subnetwork parameter is URL or Name - // If cluster is on a GCP network of mode=custom, then `SubnetName` must be specified in config file. + // generate subnetworkURL if configFile != nil && configFile.Global.SubnetworkName != "" { if strings.Contains(configFile.Global.SubnetworkName, "/") { cloudConfig.SubnetworkURL = configFile.Global.SubnetworkName } else { - cloudConfig.SubnetworkName = configFile.Global.SubnetworkName + cloudConfig.SubnetworkURL = gceSubnetworkURL(cloudConfig.ApiEndpoint, cloudConfig.ProjectID, cloudConfig.Region, configFile.Global.SubnetworkName) } } @@ -340,15 +332,11 @@ func generateCloudConfig(configFile *ConfigFile) (cloudConfig *CloudConfig, err return cloudConfig, err } -// CreateGCECloud creates a GCECloud object using the specified parameters. +// Creates a GCECloud object using the specified parameters. // If no networkUrl is specified, loads networkName via rest call. // If no tokenSource is specified, uses oauth2.DefaultTokenSource. // If managedZones is nil / empty all zones in the region will be managed. func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { - // Use ProjectID for NetworkProjectID, if it wasn't explicitly set. - if config.NetworkProjectID == "" { - config.NetworkProjectID = config.ProjectID - } client, err := newOauthClient(config.TokenSource) if err != nil { @@ -397,49 +385,19 @@ func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { return nil, err } - // config.ProjectID may be the id or project number - // In gce_routes.go, the generated networkURL is compared with a URL within a route - // therefore, we need to make sure the URL is constructed with the string ID. - projID, err := getProjectID(service, config.ProjectID) - if err != nil { - return nil, fmt.Errorf("failed to get project %v, err: %v", config.ProjectID, err) - } - - // config.NetworkProjectID may be the id or project number. In order to compare project ID - // to network project ID to determine XPN status, we need to verify both are actual IDs. - netProjID := projID - if config.NetworkProjectID != config.ProjectID { - netProjID, err = getProjectID(service, config.NetworkProjectID) - if err != nil { - return nil, fmt.Errorf("failed to get network project %v, err: %v", config.NetworkProjectID, err) - } - } - - onXPN := projID != netProjID - - var networkURL string - var subnetURL string - - if config.NetworkName == "" && config.NetworkURL == "" { - // TODO: Stop using this call and return an error. - // This function returns the first network in a list of networks for a project. The project - // should be set via configuration instead of randomly taking the first. - networkName, err := getNetworkNameViaAPICall(service, config.NetworkProjectID) + if config.NetworkURL == "" { + networkName, err := getNetworkNameViaAPICall(service, config.ProjectID) if err != nil { return nil, err } - networkURL = gceNetworkURL(config.ApiEndpoint, netProjID, networkName) - } else if config.NetworkURL != "" { - networkURL = config.NetworkURL - } else { - networkURL = gceNetworkURL(config.ApiEndpoint, netProjID, config.NetworkName) + config.NetworkURL = gceNetworkURL(config.ApiEndpoint, config.ProjectID, networkName) } - if config.SubnetworkURL != "" { - subnetURL = config.SubnetworkURL - } else if config.SubnetworkName != "" { - subnetURL = gceSubnetworkURL(config.ApiEndpoint, netProjID, config.Region, config.SubnetworkName) + networkProjectID, err := getProjectIDInURL(config.NetworkURL) + if err != nil { + return nil, err } + onXPN := networkProjectID != config.ProjectID if len(config.ManagedZones) == 0 { config.ManagedZones, err = getZonesForRegion(service, config.ProjectID, config.Region) @@ -459,14 +417,14 @@ func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { serviceBeta: serviceBeta, containerService: containerService, cloudkmsService: cloudkmsService, - projectID: projID, - networkProjectID: netProjID, + projectID: config.ProjectID, + networkProjectID: networkProjectID, onXPN: onXPN, region: config.Region, localZone: config.Zone, managedZones: config.ManagedZones, - networkURL: networkURL, - subnetworkURL: subnetURL, + networkURL: config.NetworkURL, + subnetworkURL: config.SubnetworkURL, secondaryRangeName: config.SecondaryRangeName, nodeTags: config.NodeTags, nodeInstancePrefix: config.NodeInstancePrefix, @@ -515,16 +473,6 @@ func (gce *GCECloud) ProviderName() string { return ProviderName } -// ProjectID returns the ProjectID corresponding to the project this cloud is in. -func (g *GCECloud) ProjectID() string { - return g.projectID -} - -// NetworkProjectID returns the ProjectID corresponding to the project this cluster's network is in. -func (g *GCECloud) NetworkProjectID() string { - return g.networkProjectID -} - // Region returns the region func (gce *GCECloud) Region() string { return gce.region @@ -621,16 +569,6 @@ func getNetworkNameViaAPICall(svc *compute.Service, projectID string) (string, e return networkList.Items[0].Name, nil } -// getProjectID returns the project's string ID given a project number or string -func getProjectID(svc *compute.Service, projectNumberOrID string) (string, error) { - proj, err := svc.Projects.Get(projectNumberOrID).Do() - if err != nil { - return "", err - } - - return proj.Name, nil -} - func getZonesForRegion(svc *compute.Service, projectID, region string) ([]string, error) { // TODO: use PageToken to list all not just the first 500 listCall := svc.Zones.List(projectID) diff --git a/pkg/cloudprovider/providers/gce/gce_firewall.go b/pkg/cloudprovider/providers/gce/gce_firewall.go index 2e5297275f978..b08d3f2806743 100644 --- a/pkg/cloudprovider/providers/gce/gce_firewall.go +++ b/pkg/cloudprovider/providers/gce/gce_firewall.go @@ -27,38 +27,38 @@ func newFirewallMetricContext(request string) *metricContext { // GetFirewall returns the Firewall by name. func (gce *GCECloud) GetFirewall(name string) (*compute.Firewall, error) { mc := newFirewallMetricContext("get") - v, err := gce.service.Firewalls.Get(gce.NetworkProjectID(), name).Do() + v, err := gce.service.Firewalls.Get(gce.projectID, name).Do() return v, mc.Observe(err) } // CreateFirewall creates the passed firewall func (gce *GCECloud) CreateFirewall(f *compute.Firewall) error { mc := newFirewallMetricContext("create") - op, err := gce.service.Firewalls.Insert(gce.NetworkProjectID(), f).Do() + op, err := gce.service.Firewalls.Insert(gce.projectID, f).Do() if err != nil { return mc.Observe(err) } - return gce.waitForGlobalOpInProject(op, gce.NetworkProjectID(), mc) + return gce.waitForGlobalOp(op, mc) } // DeleteFirewall deletes the given firewall rule. func (gce *GCECloud) DeleteFirewall(name string) error { mc := newFirewallMetricContext("delete") - op, err := gce.service.Firewalls.Delete(gce.NetworkProjectID(), name).Do() + op, err := gce.service.Firewalls.Delete(gce.projectID, name).Do() if err != nil { return mc.Observe(err) } - return gce.waitForGlobalOpInProject(op, gce.NetworkProjectID(), mc) + return gce.waitForGlobalOp(op, mc) } // UpdateFirewall applies the given firewall as an update to an existing service. func (gce *GCECloud) UpdateFirewall(f *compute.Firewall) error { mc := newFirewallMetricContext("update") - op, err := gce.service.Firewalls.Update(gce.NetworkProjectID(), f.Name, f).Do() + op, err := gce.service.Firewalls.Update(gce.projectID, f.Name, f).Do() if err != nil { return mc.Observe(err) } - return gce.waitForGlobalOpInProject(op, gce.NetworkProjectID(), mc) + return gce.waitForGlobalOp(op, mc) } diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go index 129086e77c5e6..37047f6483b2e 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go @@ -729,7 +729,7 @@ func (gce *GCECloud) firewallNeedsUpdate(name, serviceName, region, ipAddress st return false, false, nil } - fw, err := gce.service.Firewalls.Get(gce.NetworkProjectID(), makeFirewallName(name)).Do() + fw, err := gce.service.Firewalls.Get(gce.projectID, makeFirewallName(name)).Do() if err != nil { if isHTTPErrorCode(err, http.StatusNotFound) { return false, true, nil @@ -776,7 +776,7 @@ func (gce *GCECloud) ensureHttpHealthCheckFirewall(serviceName, ipAddress, regio ports := []v1.ServicePort{{Protocol: "tcp", Port: hcPort}} fwName := MakeHealthCheckFirewallName(clusterID, hcName, isNodesHealthCheck) - fw, err := gce.service.Firewalls.Get(gce.NetworkProjectID(), fwName).Do() + fw, err := gce.service.Firewalls.Get(gce.projectID, fwName).Do() if err != nil { if !isHTTPErrorCode(err, http.StatusNotFound) { return fmt.Errorf("error getting firewall for health checks: %v", err) diff --git a/pkg/cloudprovider/providers/gce/gce_op.go b/pkg/cloudprovider/providers/gce/gce_op.go index b354d79cea706..fc1549d448a8b 100644 --- a/pkg/cloudprovider/providers/gce/gce_op.go +++ b/pkg/cloudprovider/providers/gce/gce_op.go @@ -93,74 +93,62 @@ func getErrorFromOp(op *computev1.Operation) error { } func (gce *GCECloud) waitForGlobalOp(op gceObject, mc *metricContext) error { - return gce.waitForGlobalOpInProject(op, gce.ProjectID(), mc) -} - -func (gce *GCECloud) waitForRegionOp(op gceObject, region string, mc *metricContext) error { - return gce.waitForRegionOpInProject(op, gce.ProjectID(), region, mc) -} - -func (gce *GCECloud) waitForZoneOp(op gceObject, zone string, mc *metricContext) error { - return gce.waitForZoneOpInProject(op, gce.ProjectID(), zone, mc) -} - -func (gce *GCECloud) waitForGlobalOpInProject(op gceObject, projectID string, mc *metricContext) error { switch v := op.(type) { case *computealpha.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceAlpha.GlobalOperations.Get(projectID, operationName).Do() + op, err := gce.serviceAlpha.GlobalOperations.Get(gce.projectID, operationName).Do() return convertToV1Operation(op), err }, mc) case *computebeta.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceBeta.GlobalOperations.Get(projectID, operationName).Do() + op, err := gce.serviceBeta.GlobalOperations.Get(gce.projectID, operationName).Do() return convertToV1Operation(op), err }, mc) case *computev1.Operation: return gce.waitForOp(op.(*computev1.Operation), func(operationName string) (*computev1.Operation, error) { - return gce.service.GlobalOperations.Get(projectID, operationName).Do() + return gce.service.GlobalOperations.Get(gce.projectID, operationName).Do() }, mc) default: return fmt.Errorf("unexpected type: %T", v) } } -func (gce *GCECloud) waitForRegionOpInProject(op gceObject, projectID, region string, mc *metricContext) error { +func (gce *GCECloud) waitForRegionOp(op gceObject, region string, mc *metricContext) error { switch v := op.(type) { case *computealpha.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceAlpha.RegionOperations.Get(projectID, region, operationName).Do() + op, err := gce.serviceAlpha.RegionOperations.Get(gce.projectID, region, operationName).Do() return convertToV1Operation(op), err }, mc) case *computebeta.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceBeta.RegionOperations.Get(projectID, region, operationName).Do() + op, err := gce.serviceBeta.RegionOperations.Get(gce.projectID, region, operationName).Do() return convertToV1Operation(op), err }, mc) case *computev1.Operation: return gce.waitForOp(op.(*computev1.Operation), func(operationName string) (*computev1.Operation, error) { - return gce.service.RegionOperations.Get(projectID, region, operationName).Do() + return gce.service.RegionOperations.Get(gce.projectID, region, operationName).Do() }, mc) default: return fmt.Errorf("unexpected type: %T", v) } } -func (gce *GCECloud) waitForZoneOpInProject(op gceObject, projectID, zone string, mc *metricContext) error { +func (gce *GCECloud) waitForZoneOp(op gceObject, zone string, mc *metricContext) error { switch v := op.(type) { case *computealpha.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceAlpha.ZoneOperations.Get(projectID, zone, operationName).Do() + op, err := gce.serviceAlpha.ZoneOperations.Get(gce.projectID, zone, operationName).Do() return convertToV1Operation(op), err }, mc) case *computebeta.Operation: return gce.waitForOp(convertToV1Operation(op), func(operationName string) (*computev1.Operation, error) { - op, err := gce.serviceBeta.ZoneOperations.Get(projectID, zone, operationName).Do() + op, err := gce.serviceBeta.ZoneOperations.Get(gce.projectID, zone, operationName).Do() return convertToV1Operation(op), err }, mc) case *computev1.Operation: return gce.waitForOp(op.(*computev1.Operation), func(operationName string) (*computev1.Operation, error) { - return gce.service.ZoneOperations.Get(projectID, zone, operationName).Do() + return gce.service.ZoneOperations.Get(gce.projectID, zone, operationName).Do() }, mc) default: return fmt.Errorf("unexpected type: %T", v) diff --git a/pkg/cloudprovider/providers/gce/gce_routes.go b/pkg/cloudprovider/providers/gce/gce_routes.go index 87184aef1142c..5f6459cd1a8ca 100644 --- a/pkg/cloudprovider/providers/gce/gce_routes.go +++ b/pkg/cloudprovider/providers/gce/gce_routes.go @@ -38,13 +38,13 @@ func (gce *GCECloud) ListRoutes(clusterName string) ([]*cloudprovider.Route, err page := 0 for ; page == 0 || (pageToken != "" && page < maxPages); page++ { mc := newRoutesMetricContext("list_page") - listCall := gce.service.Routes.List(gce.NetworkProjectID()) + listCall := gce.service.Routes.List(gce.projectID) prefix := truncateClusterName(clusterName) // Filter for routes starting with clustername AND belonging to the // relevant gcp network AND having description = "k8s-node-route". filter := "(name eq " + prefix + "-.*) " - filter = filter + "(network eq " + gce.NetworkURL() + ") " + filter = filter + "(network eq " + gce.networkURL + ") " filter = filter + "(description eq " + k8sNodeRouteTag + ")" listCall = listCall.Filter(filter) if pageToken != "" { @@ -80,11 +80,11 @@ func (gce *GCECloud) CreateRoute(clusterName string, nameHint string, route *clo } mc := newRoutesMetricContext("create") - insertOp, err := gce.service.Routes.Insert(gce.NetworkProjectID(), &compute.Route{ + insertOp, err := gce.service.Routes.Insert(gce.projectID, &compute.Route{ Name: routeName, DestRange: route.DestinationCIDR, NextHopInstance: fmt.Sprintf("zones/%s/instances/%s", targetInstance.Zone, targetInstance.Name), - Network: gce.NetworkURL(), + Network: gce.networkURL, Priority: 1000, Description: k8sNodeRouteTag, }).Do() @@ -96,16 +96,16 @@ func (gce *GCECloud) CreateRoute(clusterName string, nameHint string, route *clo return mc.Observe(err) } } - return gce.waitForGlobalOpInProject(insertOp, gce.NetworkProjectID(), mc) + return gce.waitForGlobalOp(insertOp, mc) } func (gce *GCECloud) DeleteRoute(clusterName string, route *cloudprovider.Route) error { mc := newRoutesMetricContext("delete") - deleteOp, err := gce.service.Routes.Delete(gce.NetworkProjectID(), route.Name).Do() + deleteOp, err := gce.service.Routes.Delete(gce.projectID, route.Name).Do() if err != nil { return mc.Observe(err) } - return gce.waitForGlobalOpInProject(deleteOp, gce.NetworkProjectID(), mc) + return gce.waitForGlobalOp(deleteOp, mc) } func truncateClusterName(clusterName string) string { diff --git a/pkg/cloudprovider/providers/gce/gce_test.go b/pkg/cloudprovider/providers/gce/gce_test.go index cc8a70300b7a3..d05296fec01ca 100644 --- a/pkg/cloudprovider/providers/gce/gce_test.go +++ b/pkg/cloudprovider/providers/gce/gce_test.go @@ -29,43 +29,6 @@ import ( computev1 "google.golang.org/api/compute/v1" ) -func TestReadConfigFile(t *testing.T) { - const s = `[Global] -token-url = my-token-url -token-body = my-token-body -project-id = my-project -network-project-id = my-network-project -network-name = my-network -subnetwork-name = my-subnetwork -secondary-range-name = my-secondary-range -node-tags = my-node-tag1 -node-instance-prefix = my-prefix -multizone = true - ` - reader := strings.NewReader(s) - config, err := readConfig(reader) - if err != nil { - t.Fatalf("Unexpected config parsing error %v", err) - } - - expected := &ConfigFile{Global: ConfigGlobal{ - TokenURL: "my-token-url", - TokenBody: "my-token-body", - ProjectID: "my-project", - NetworkProjectID: "my-network-project", - NetworkName: "my-network", - SubnetworkName: "my-subnetwork", - SecondaryRangeName: "my-secondary-range", - NodeTags: []string{"my-node-tag1"}, - NodeInstancePrefix: "my-prefix", - Multizone: true, - }} - - if !reflect.DeepEqual(expected, config) { - t.Fatalf("Expected config file values to be read into ConfigFile struct. \nExpected:\n%+v\nActual:\n%+v", expected, config) - } -} - func TestExtraKeyInConfig(t *testing.T) { const s = `[Global] project-id = my-project @@ -300,8 +263,23 @@ func TestSplitProviderID(t *testing.T) { } } -func TestGenerateCloudConfigs(t *testing.T) { - configBoilerplate := ConfigGlobal{ +type generateConfigParams struct { + TokenURL string + TokenBody string + ProjectID string + NetworkName string + SubnetworkName string + SecondaryRangeName string + NodeTags []string + NodeInstancePrefix string + Multizone bool + ApiEndpoint string + LocalZone string + AlphaFeatures []string +} + +func newGenerateConfigDefaults() *generateConfigParams { + return &generateConfigParams{ TokenURL: "", TokenBody: "", ProjectID: "project-id", @@ -315,147 +293,197 @@ func TestGenerateCloudConfigs(t *testing.T) { LocalZone: "us-central1-a", AlphaFeatures: []string{}, } +} - cloudBoilerplate := CloudConfig{ - ApiEndpoint: "", - ProjectID: "project-id", - NetworkProjectID: "", - Region: "us-central1", - Zone: "us-central1-a", - ManagedZones: []string{"us-central1-a"}, - NetworkName: "network-name", - SubnetworkName: "", - NetworkURL: "", - SubnetworkURL: "", - SecondaryRangeName: "", - NodeTags: []string{"node-tag"}, - TokenSource: google.ComputeTokenSource(""), - NodeInstancePrefix: "node-prefix", - UseMetadataServer: true, - AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, - } - +func TestGenerateCloudConfigs(t *testing.T) { testCases := []struct { - name string - config func() ConfigGlobal - cloud func() CloudConfig + TokenURL string + TokenBody string + ProjectID string + NetworkName string + SubnetworkName string + NodeTags []string + NodeInstancePrefix string + Multizone bool + ApiEndpoint string + LocalZone string + cloudConfig *CloudConfig + AlphaFeatures []string }{ + // default config { - name: "Empty Config", - config: func() ConfigGlobal { return configBoilerplate }, - cloud: func() CloudConfig { return cloudBoilerplate }, - }, - { - name: "Nil token URL", - config: func() ConfigGlobal { - v := configBoilerplate - v.TokenURL = "nil" - return v - }, - cloud: func() CloudConfig { - v := cloudBoilerplate - v.TokenSource = nil - return v + cloudConfig: &CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: google.ComputeTokenSource(""), + UseMetadataServer: true, + AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, }, }, + // nil token source { - name: "Network Project ID", - config: func() ConfigGlobal { - v := configBoilerplate - v.NetworkProjectID = "my-awesome-project" - return v - }, - cloud: func() CloudConfig { - v := cloudBoilerplate - v.NetworkProjectID = "my-awesome-project" - return v + TokenURL: "nil", + cloudConfig: &CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: nil, + UseMetadataServer: true, + AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, }, }, + // specified api endpoint { - name: "Specified API Endpint", - config: func() ConfigGlobal { - v := configBoilerplate - v.ApiEndpoint = "https://www.googleapis.com/compute/staging_v1/" - return v - }, - cloud: func() CloudConfig { - v := cloudBoilerplate - v.ApiEndpoint = "https://www.googleapis.com/compute/staging_v1/" - return v + ApiEndpoint: "https://www.googleapis.com/compute/staging_v1/", + cloudConfig: &CloudConfig{ + ApiEndpoint: "https://www.googleapis.com/compute/staging_v1/", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkURL: "https://www.googleapis.com/compute/staging_v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: google.ComputeTokenSource(""), + UseMetadataServer: true, + AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, }, }, + // fqdn subnetname { - name: "Network & Subnetwork names", - config: func() ConfigGlobal { - v := configBoilerplate - v.NetworkName = "my-network" - v.SubnetworkName = "my-subnetwork" - return v - }, - cloud: func() CloudConfig { - v := cloudBoilerplate - v.NetworkName = "my-network" - v.SubnetworkName = "my-subnetwork" - return v + SubnetworkName: "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", + cloudConfig: &CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: google.ComputeTokenSource(""), + UseMetadataServer: true, + AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, }, }, + // subnetname { - name: "Network & Subnetwork URLs", - config: func() ConfigGlobal { - v := configBoilerplate - v.NetworkName = "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/my-network" - v.SubnetworkName = "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/my-subnetwork" - return v - }, - cloud: func() CloudConfig { - v := cloudBoilerplate - v.NetworkName = "" - v.SubnetworkName = "" - v.NetworkURL = "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/my-network" - v.SubnetworkURL = "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/my-subnetwork" - return v - }, - }, - { - name: "Multizone", - config: func() ConfigGlobal { - v := configBoilerplate - v.Multizone = true - return v - }, - cloud: func() CloudConfig { - v := cloudBoilerplate - v.ManagedZones = nil - return v + SubnetworkName: "subnetwork-name", + cloudConfig: &CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: []string{"us-central1-a"}, + NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/regions/us-central1/subnetworks/subnetwork-name", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: google.ComputeTokenSource(""), + UseMetadataServer: true, + AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, }, }, + // multi zone { - name: "Secondary Range Name", - config: func() ConfigGlobal { - v := configBoilerplate - v.SecondaryRangeName = "my-secondary" - return v - }, - cloud: func() CloudConfig { - v := cloudBoilerplate - v.SecondaryRangeName = "my-secondary" - return v + Multizone: true, + cloudConfig: &CloudConfig{ + ApiEndpoint: "", + ProjectID: "project-id", + Region: "us-central1", + Zone: "us-central1-a", + ManagedZones: nil, + NetworkURL: "https://www.googleapis.com/compute/v1/projects/project-id/global/networks/network-name", + SubnetworkURL: "", + NodeTags: []string{"node-tag"}, + NodeInstancePrefix: "node-prefix", + TokenSource: google.ComputeTokenSource(""), + UseMetadataServer: true, + AlphaFeatureGate: &AlphaFeatureGate{map[string]bool{}}, }, }, } for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - resultCloud, err := generateCloudConfig(&ConfigFile{Global: tc.config()}) - if err != nil { - t.Fatalf("Unexpect error: %v", err) - } + config := newGenerateConfigDefaults() + config.Multizone = tc.Multizone + config.ApiEndpoint = tc.ApiEndpoint + config.AlphaFeatures = tc.AlphaFeatures + config.TokenBody = tc.TokenBody + + if tc.TokenURL != "" { + config.TokenURL = tc.TokenURL + } + if tc.ProjectID != "" { + config.ProjectID = tc.ProjectID + } + if tc.NetworkName != "" { + config.NetworkName = tc.NetworkName + } + if tc.SubnetworkName != "" { + config.SubnetworkName = tc.SubnetworkName + } + if len(tc.NodeTags) > 0 { + config.NodeTags = tc.NodeTags + } + if tc.NodeInstancePrefix != "" { + config.NodeInstancePrefix = tc.NodeInstancePrefix + } + if tc.LocalZone != "" { + config.LocalZone = tc.LocalZone + } - v := tc.cloud() - if !reflect.DeepEqual(*resultCloud, v) { - t.Errorf("Got: \n%v\nWant\n%v\n", v, *resultCloud) - } + cloudConfig, err := generateCloudConfig(&ConfigFile{ + Global: struct { + TokenURL string `gcfg:"token-url"` + TokenBody string `gcfg:"token-body"` + ProjectID string `gcfg:"project-id"` + NetworkName string `gcfg:"network-name"` + SubnetworkName string `gcfg:"subnetwork-name"` + SecondaryRangeName string `gcfg:"secondary-range-name"` + NodeTags []string `gcfg:"node-tags"` + NodeInstancePrefix string `gcfg:"node-instance-prefix"` + Multizone bool `gcfg:"multizone"` + ApiEndpoint string `gcfg:"api-endpoint"` + LocalZone string `gcfg:"local-zone"` + AlphaFeatures []string `gcfg:"alpha-features"` + }{ + TokenURL: config.TokenURL, + TokenBody: config.TokenBody, + ProjectID: config.ProjectID, + NetworkName: config.NetworkName, + SubnetworkName: config.SubnetworkName, + SecondaryRangeName: config.SecondaryRangeName, + NodeTags: config.NodeTags, + NodeInstancePrefix: config.NodeInstancePrefix, + Multizone: config.Multizone, + ApiEndpoint: config.ApiEndpoint, + LocalZone: config.LocalZone, + AlphaFeatures: config.AlphaFeatures, + }, }) + if err != nil { + t.Fatalf("Unexpect error: %v", err) + } + + if !reflect.DeepEqual(cloudConfig, tc.cloudConfig) { + t.Errorf("Got %v, want %v", cloudConfig, tc.cloudConfig) + } } } diff --git a/test/e2e/e2e.go b/test/e2e/e2e.go index d25f664a819c2..dd20e04cf98a5 100644 --- a/test/e2e/e2e.go +++ b/test/e2e/e2e.go @@ -84,8 +84,8 @@ func setupProviderConfig() error { Region: region, Zone: zone, ManagedZones: managedZones, - NetworkName: "", // TODO: Change this to use framework.TestContext.CloudConfig.Network? - SubnetworkName: "", + NetworkURL: "", + SubnetworkURL: "", NodeTags: nil, NodeInstancePrefix: "", TokenSource: nil, From 18dc690c7c42afcb486b9857967007c42d309d5a Mon Sep 17 00:00:00 2001 From: Klaus Ma Date: Wed, 23 Aug 2017 11:00:42 +0800 Subject: [PATCH 349/403] Moved node condition filter into a predicates. --- .../scheduler/algorithm/predicates/error.go | 4 + .../algorithm/predicates/predicates.go | 31 ++++++++ .../algorithm/predicates/predicates_test.go | 72 ++++++++++++++++++ .../defaults/compatibility_test.go | 73 +++++++++++++++++++ .../algorithmprovider/defaults/defaults.go | 3 + plugin/pkg/scheduler/factory/factory.go | 45 ++---------- plugin/pkg/scheduler/factory/factory_test.go | 43 ----------- plugin/pkg/scheduler/factory/plugins.go | 27 ++++++- test/integration/scheduler/scheduler_test.go | 3 +- 9 files changed, 217 insertions(+), 84 deletions(-) diff --git a/plugin/pkg/scheduler/algorithm/predicates/error.go b/plugin/pkg/scheduler/algorithm/predicates/error.go index 71e079481081e..8cc85bce2c0d0 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/error.go +++ b/plugin/pkg/scheduler/algorithm/predicates/error.go @@ -38,6 +38,10 @@ var ( ErrNodeUnderMemoryPressure = newPredicateFailureError("NodeUnderMemoryPressure") ErrNodeUnderDiskPressure = newPredicateFailureError("NodeUnderDiskPressure") ErrNodeOutOfDisk = newPredicateFailureError("NodeOutOfDisk") + ErrNodeNotReady = newPredicateFailureError("NodeNotReady") + ErrNodeNetworkUnavailable = newPredicateFailureError("NodeNetworkUnavailable") + ErrNodeUnschedulable = newPredicateFailureError("NodeUnschedulable") + ErrNodeUnknownCondition = newPredicateFailureError("NodeUnknownCondition") ErrVolumeNodeConflict = newPredicateFailureError("NoVolumeNodeConflict") // ErrFakePredicate is used for test only. The fake predicates returning false also returns error // as ErrFakePredicate. diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates.go b/plugin/pkg/scheduler/algorithm/predicates/predicates.go index d8e644b434926..97b970c9e4d2b 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates.go @@ -1301,6 +1301,37 @@ func CheckNodeDiskPressurePredicate(pod *v1.Pod, meta interface{}, nodeInfo *sch return true, nil, nil } +// CheckNodeConditionPredicate checks if a pod can be scheduled on a node reporting out of disk, +// network unavailable and not ready condition. Only node conditions are accounted in this predicate. +func CheckNodeConditionPredicate(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, []algorithm.PredicateFailureReason, error) { + reasons := []algorithm.PredicateFailureReason{} + + if nodeInfo == nil || nodeInfo.Node() == nil { + return false, []algorithm.PredicateFailureReason{ErrNodeUnknownCondition}, nil + } + + node := nodeInfo.Node() + for _, cond := range node.Status.Conditions { + // We consider the node for scheduling only when its: + // - NodeReady condition status is ConditionTrue, + // - NodeOutOfDisk condition status is ConditionFalse, + // - NodeNetworkUnavailable condition status is ConditionFalse. + if cond.Type == v1.NodeReady && cond.Status != v1.ConditionTrue { + reasons = append(reasons, ErrNodeNotReady) + } else if cond.Type == v1.NodeOutOfDisk && cond.Status != v1.ConditionFalse { + reasons = append(reasons, ErrNodeOutOfDisk) + } else if cond.Type == v1.NodeNetworkUnavailable && cond.Status != v1.ConditionFalse { + reasons = append(reasons, ErrNodeNetworkUnavailable) + } + } + + if node.Spec.Unschedulable { + reasons = append(reasons, ErrNodeUnschedulable) + } + + return len(reasons) == 0, reasons, nil +} + type VolumeNodeChecker struct { pvInfo PersistentVolumeInfo pvcInfo PersistentVolumeClaimInfo diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go b/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go index 90c7be86ab84b..0dba44d4ac474 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates_test.go @@ -3442,6 +3442,78 @@ func TestPodSchedulesOnNodeWithDiskPressureCondition(t *testing.T) { } } +func TestNodeConditionPredicate(t *testing.T) { + tests := []struct { + node *v1.Node + schedulable bool + }{ + // node1 considered + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node1"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}}}}, + schedulable: true, + }, + // node2 ignored - node not Ready + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node2"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}}}}, + schedulable: false, + }, + // node3 ignored - node out of disk + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node3"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, + schedulable: false, + }, + + // node4 considered + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node4"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, + schedulable: true, + }, + // node5 ignored - node out of disk + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node5"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, + schedulable: false, + }, + // node6 considered + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node6"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, + schedulable: true, + }, + // node7 ignored - node out of disk, node not Ready + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node7"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, + schedulable: false, + }, + // node8 ignored - node not Ready + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node8"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, + schedulable: false, + }, + // node9 ignored - node unschedulable + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node9"}, Spec: v1.NodeSpec{Unschedulable: true}}, + schedulable: false, + }, + // node10 considered + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node10"}, Spec: v1.NodeSpec{Unschedulable: false}}, + schedulable: true, + }, + // node11 considered + { + node: &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node11"}}, + schedulable: true, + }, + } + + for _, test := range tests { + nodeInfo := makeEmptyNodeInfo(test.node) + if fit, reasons, err := CheckNodeConditionPredicate(nil, nil, nodeInfo); fit != test.schedulable { + t.Errorf("%s: expected: %t, got %t; %+v, %v", + test.node.Name, test.schedulable, fit, reasons, err) + } + } +} + func createPodWithVolume(pod, pv, pvc string) *v1.Pod { return &v1.Pod{ ObjectMeta: metav1.ObjectMeta{Name: pod, Namespace: "default"}, diff --git a/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go b/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go index fce476b15bcca..42ccee1ab0cdf 100644 --- a/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go +++ b/plugin/pkg/scheduler/algorithmprovider/defaults/compatibility_test.go @@ -387,6 +387,79 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { }, }, }, + // Do not change this JSON after the corresponding release has been tagged. + // A failure indicates backwards compatibility with the specified release was broken. + "1.8": { + JSON: `{ + "kind": "Policy", + "apiVersion": "v1", + "predicates": [ + {"name": "MatchNodeSelector"}, + {"name": "PodFitsResources"}, + {"name": "PodFitsHostPorts"}, + {"name": "HostName"}, + {"name": "NoDiskConflict"}, + {"name": "NoVolumeZoneConflict"}, + {"name": "PodToleratesNodeTaints"}, + {"name": "CheckNodeMemoryPressure"}, + {"name": "CheckNodeDiskPressure"}, + {"name": "CheckNodeCondition"}, + {"name": "MaxEBSVolumeCount"}, + {"name": "MaxGCEPDVolumeCount"}, + {"name": "MaxAzureDiskVolumeCount"}, + {"name": "MatchInterPodAffinity"}, + {"name": "GeneralPredicates"}, + {"name": "TestServiceAffinity", "argument": {"serviceAffinity" : {"labels" : ["region"]}}}, + {"name": "TestLabelsPresence", "argument": {"labelsPresence" : {"labels" : ["foo"], "presence":true}}}, + {"name": "NoVolumeNodeConflict"} + ],"priorities": [ + {"name": "EqualPriority", "weight": 2}, + {"name": "ImageLocalityPriority", "weight": 2}, + {"name": "LeastRequestedPriority", "weight": 2}, + {"name": "BalancedResourceAllocation", "weight": 2}, + {"name": "SelectorSpreadPriority", "weight": 2}, + {"name": "NodePreferAvoidPodsPriority", "weight": 2}, + {"name": "NodeAffinityPriority", "weight": 2}, + {"name": "TaintTolerationPriority", "weight": 2}, + {"name": "InterPodAffinityPriority", "weight": 2}, + {"name": "MostRequestedPriority", "weight": 2} + ] + }`, + ExpectedPolicy: schedulerapi.Policy{ + Predicates: []schedulerapi.PredicatePolicy{ + {Name: "MatchNodeSelector"}, + {Name: "PodFitsResources"}, + {Name: "PodFitsHostPorts"}, + {Name: "HostName"}, + {Name: "NoDiskConflict"}, + {Name: "NoVolumeZoneConflict"}, + {Name: "PodToleratesNodeTaints"}, + {Name: "CheckNodeMemoryPressure"}, + {Name: "CheckNodeDiskPressure"}, + {Name: "CheckNodeCondition"}, + {Name: "MaxEBSVolumeCount"}, + {Name: "MaxGCEPDVolumeCount"}, + {Name: "MaxAzureDiskVolumeCount"}, + {Name: "MatchInterPodAffinity"}, + {Name: "GeneralPredicates"}, + {Name: "TestServiceAffinity", Argument: &schedulerapi.PredicateArgument{ServiceAffinity: &schedulerapi.ServiceAffinity{Labels: []string{"region"}}}}, + {Name: "TestLabelsPresence", Argument: &schedulerapi.PredicateArgument{LabelsPresence: &schedulerapi.LabelsPresence{Labels: []string{"foo"}, Presence: true}}}, + {Name: "NoVolumeNodeConflict"}, + }, + Priorities: []schedulerapi.PriorityPolicy{ + {Name: "EqualPriority", Weight: 2}, + {Name: "ImageLocalityPriority", Weight: 2}, + {Name: "LeastRequestedPriority", Weight: 2}, + {Name: "BalancedResourceAllocation", Weight: 2}, + {Name: "SelectorSpreadPriority", Weight: 2}, + {Name: "NodePreferAvoidPodsPriority", Weight: 2}, + {Name: "NodeAffinityPriority", Weight: 2}, + {Name: "TaintTolerationPriority", Weight: 2}, + {Name: "InterPodAffinityPriority", Weight: 2}, + {Name: "MostRequestedPriority", Weight: 2}, + }, + }, + }, } registeredPredicates := sets.NewString(factory.ListRegisteredFitPredicates()...) diff --git a/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go b/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go index 46fa0e60bfb8d..2d7e278a9211f 100644 --- a/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go +++ b/plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go @@ -175,6 +175,9 @@ func defaultPredicates() sets.String { // Fit is determined by node disk pressure condition. factory.RegisterFitPredicate("CheckNodeDiskPressure", predicates.CheckNodeDiskPressurePredicate), + // Fit is determied by node condtions: not ready, network unavailable and out of disk. + factory.RegisterMandatoryFitPredicate("CheckNodeCondition", predicates.CheckNodeConditionPredicate), + // Fit is determined by volume zone requirements. factory.RegisterFitPredicateFactory( "NoVolumeNodeConflict", diff --git a/plugin/pkg/scheduler/factory/factory.go b/plugin/pkg/scheduler/factory/factory.go index b4c7062260995..cd58377635a57 100644 --- a/plugin/pkg/scheduler/factory/factory.go +++ b/plugin/pkg/scheduler/factory/factory.go @@ -705,7 +705,7 @@ func (f *ConfigFactory) CreateFromKeys(predicateKeys, priorityKeys sets.String, SchedulerCache: f.schedulerCache, Ecache: f.equivalencePodCache, // The scheduler only needs to consider schedulable nodes. - NodeLister: &nodePredicateLister{f.nodeLister}, + NodeLister: &nodeLister{f.nodeLister}, Algorithm: algo, Binder: f.getBinder(extenders), PodConditionUpdater: &podConditionUpdater{f.client}, @@ -720,12 +720,12 @@ func (f *ConfigFactory) CreateFromKeys(predicateKeys, priorityKeys sets.String, }, nil } -type nodePredicateLister struct { +type nodeLister struct { corelisters.NodeLister } -func (n *nodePredicateLister) List() ([]*v1.Node, error) { - return n.ListWithPredicate(getNodeConditionPredicate()) +func (n *nodeLister) List() ([]*v1.Node, error) { + return n.NodeLister.List(labels.Everything()) } func (f *ConfigFactory) GetPriorityFunctionConfigs(priorityKeys sets.String) ([]algorithm.PriorityConfig, error) { @@ -770,11 +770,10 @@ func (f *ConfigFactory) getPluginArgs() (*PluginFactoryArgs, error) { ControllerLister: f.controllerLister, ReplicaSetLister: f.replicaSetLister, StatefulSetLister: f.statefulSetLister, - // All fit predicates only need to consider schedulable nodes. - NodeLister: &nodePredicateLister{f.nodeLister}, - NodeInfo: &predicates.CachedNodeInfo{NodeLister: f.nodeLister}, - PVInfo: &predicates.CachedPersistentVolumeInfo{PersistentVolumeLister: f.pVLister}, - PVCInfo: &predicates.CachedPersistentVolumeClaimInfo{PersistentVolumeClaimLister: f.pVCLister}, + NodeLister: &nodeLister{f.nodeLister}, + NodeInfo: &predicates.CachedNodeInfo{NodeLister: f.nodeLister}, + PVInfo: &predicates.CachedPersistentVolumeInfo{PersistentVolumeLister: f.pVLister}, + PVCInfo: &predicates.CachedPersistentVolumeClaimInfo{PersistentVolumeClaimLister: f.pVCLister}, HardPodAffinitySymmetricWeight: f.hardPodAffinitySymmetricWeight, }, nil } @@ -793,34 +792,6 @@ func (f *ConfigFactory) ResponsibleForPod(pod *v1.Pod) bool { return f.schedulerName == pod.Spec.SchedulerName } -func getNodeConditionPredicate() corelisters.NodeConditionPredicate { - return func(node *v1.Node) bool { - for i := range node.Status.Conditions { - cond := &node.Status.Conditions[i] - // We consider the node for scheduling only when its: - // - NodeReady condition status is ConditionTrue, - // - NodeOutOfDisk condition status is ConditionFalse, - // - NodeNetworkUnavailable condition status is ConditionFalse. - if cond.Type == v1.NodeReady && cond.Status != v1.ConditionTrue { - glog.V(4).Infof("Ignoring node %v with %v condition status %v", node.Name, cond.Type, cond.Status) - return false - } else if cond.Type == v1.NodeOutOfDisk && cond.Status != v1.ConditionFalse { - glog.V(4).Infof("Ignoring node %v with %v condition status %v", node.Name, cond.Type, cond.Status) - return false - } else if cond.Type == v1.NodeNetworkUnavailable && cond.Status != v1.ConditionFalse { - glog.V(4).Infof("Ignoring node %v with %v condition status %v", node.Name, cond.Type, cond.Status) - return false - } - } - // Ignore nodes that are marked unschedulable - if node.Spec.Unschedulable { - glog.V(4).Infof("Ignoring node %v since it is unschedulable", node.Name) - return false - } - return true - } -} - // unassignedNonTerminatedPod selects pods that are unassigned and non-terminal. func unassignedNonTerminatedPod(pod *v1.Pod) bool { if len(pod.Spec.NodeName) != 0 { diff --git a/plugin/pkg/scheduler/factory/factory_test.go b/plugin/pkg/scheduler/factory/factory_test.go index 730e1bb035ad0..28cfaa56a64f9 100644 --- a/plugin/pkg/scheduler/factory/factory_test.go +++ b/plugin/pkg/scheduler/factory/factory_test.go @@ -525,46 +525,3 @@ func TestInvalidFactoryArgs(t *testing.T) { } } - -func TestNodeConditionPredicate(t *testing.T) { - nodeFunc := getNodeConditionPredicate() - nodeList := &v1.NodeList{ - Items: []v1.Node{ - // node1 considered - {ObjectMeta: metav1.ObjectMeta{Name: "node1"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}}}}, - // node2 ignored - node not Ready - {ObjectMeta: metav1.ObjectMeta{Name: "node2"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}}}}, - // node3 ignored - node out of disk - {ObjectMeta: metav1.ObjectMeta{Name: "node3"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, - // node4 considered - {ObjectMeta: metav1.ObjectMeta{Name: "node4"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, - - // node5 ignored - node out of disk - {ObjectMeta: metav1.ObjectMeta{Name: "node5"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, - // node6 considered - {ObjectMeta: metav1.ObjectMeta{Name: "node6"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, - // node7 ignored - node out of disk, node not Ready - {ObjectMeta: metav1.ObjectMeta{Name: "node7"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionTrue}}}}, - // node8 ignored - node not Ready - {ObjectMeta: metav1.ObjectMeta{Name: "node8"}, Status: v1.NodeStatus{Conditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}, {Type: v1.NodeOutOfDisk, Status: v1.ConditionFalse}}}}, - - // node9 ignored - node unschedulable - {ObjectMeta: metav1.ObjectMeta{Name: "node9"}, Spec: v1.NodeSpec{Unschedulable: true}}, - // node10 considered - {ObjectMeta: metav1.ObjectMeta{Name: "node10"}, Spec: v1.NodeSpec{Unschedulable: false}}, - // node11 considered - {ObjectMeta: metav1.ObjectMeta{Name: "node11"}}, - }, - } - - nodeNames := []string{} - for _, node := range nodeList.Items { - if nodeFunc(&node) { - nodeNames = append(nodeNames, node.Name) - } - } - expectedNodes := []string{"node1", "node4", "node6", "node10", "node11"} - if !reflect.DeepEqual(expectedNodes, nodeNames) { - t.Errorf("expected: %v, got %v", expectedNodes, nodeNames) - } -} diff --git a/plugin/pkg/scheduler/factory/plugins.go b/plugin/pkg/scheduler/factory/plugins.go index df1c6febfc5d4..48cdca881a456 100644 --- a/plugin/pkg/scheduler/factory/plugins.go +++ b/plugin/pkg/scheduler/factory/plugins.go @@ -72,9 +72,10 @@ var ( schedulerFactoryMutex sync.Mutex // maps that hold registered algorithm types - fitPredicateMap = make(map[string]FitPredicateFactory) - priorityFunctionMap = make(map[string]PriorityConfigFactory) - algorithmProviderMap = make(map[string]AlgorithmProviderConfig) + fitPredicateMap = make(map[string]FitPredicateFactory) + mandatoryFitPredicates = sets.NewString() + priorityFunctionMap = make(map[string]PriorityConfigFactory) + algorithmProviderMap = make(map[string]AlgorithmProviderConfig) // Registered metadata producers priorityMetadataProducer MetadataProducerFactory @@ -99,6 +100,18 @@ func RegisterFitPredicate(name string, predicate algorithm.FitPredicate) string return RegisterFitPredicateFactory(name, func(PluginFactoryArgs) algorithm.FitPredicate { return predicate }) } +// RegisterMandatoryFitPredicate registers a fit predicate with the algorithm registry, the predicate is used by +// kubelet, DaemonSet; it is always included in configuration. Returns the name with which the predicate was +// registered. +func RegisterMandatoryFitPredicate(name string, predicate algorithm.FitPredicate) string { + schedulerFactoryMutex.Lock() + defer schedulerFactoryMutex.Unlock() + validateAlgorithmNameOrDie(name) + fitPredicateMap[name] = func(PluginFactoryArgs) algorithm.FitPredicate { return predicate } + mandatoryFitPredicates.Insert(name) + return name +} + // RegisterFitPredicateFactory registers a fit predicate factory with the // algorithm registry. Returns the name with which the predicate was registered. func RegisterFitPredicateFactory(name string, predicateFactory FitPredicateFactory) string { @@ -308,6 +321,14 @@ func getFitPredicateFunctions(names sets.String, args PluginFactoryArgs) (map[st } predicates[name] = factory(args) } + + // Always include mandatory fit predicates. + for name := range mandatoryFitPredicates { + if factory, found := fitPredicateMap[name]; found { + predicates[name] = factory(args) + } + } + return predicates, nil } diff --git a/test/integration/scheduler/scheduler_test.go b/test/integration/scheduler/scheduler_test.go index cd109648a9de9..6322e55163185 100644 --- a/test/integration/scheduler/scheduler_test.go +++ b/test/integration/scheduler/scheduler_test.go @@ -139,7 +139,8 @@ func TestSchedulerCreationFromConfigMap(t *testing.T) { // Verify that the config is applied correctly. schedPredicates := sched.Config().Algorithm.Predicates() schedPrioritizers := sched.Config().Algorithm.Prioritizers() - if len(schedPredicates) != 2 || len(schedPrioritizers) != 2 { + // Includes one mandatory predicates. + if len(schedPredicates) != 3 || len(schedPrioritizers) != 2 { t.Errorf("Unexpected number of predicates or priority functions. Number of predicates: %v, number of prioritizers: %v", len(schedPredicates), len(schedPrioritizers)) } // Check a predicate and a priority function. From ab0918673728fc50fc539017c86bbc03fceb0adc Mon Sep 17 00:00:00 2001 From: Cao Shufeng Date: Mon, 17 Jul 2017 14:44:41 +0800 Subject: [PATCH 350/403] Fix forbidden message format Before this change: # kubectl get pods --as=tom Error from server (Forbidden): pods "" is forbidden: User "tom" cannot list pods in the namespace "default". After this change: # kubectl get pods --as=tom Error from server (Forbidden): pods is forbidden: User "tom" cannot list pods in the namespace "default". --- .../src/k8s.io/apimachinery/pkg/api/errors/errors.go | 10 +++++++++- .../endpoints/handlers/responsewriters/errors_test.go | 10 ++++++---- test/integration/master/master_test.go | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/staging/src/k8s.io/apimachinery/pkg/api/errors/errors.go b/staging/src/k8s.io/apimachinery/pkg/api/errors/errors.go index 91975be85b316..981602270246b 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/errors/errors.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/errors/errors.go @@ -128,6 +128,14 @@ func NewUnauthorized(reason string) *StatusError { // NewForbidden returns an error indicating the requested action was forbidden func NewForbidden(qualifiedResource schema.GroupResource, name string, err error) *StatusError { + var message string + if qualifiedResource.Empty() { + message = fmt.Sprintf("forbidden: %v", err) + } else if name == "" { + message = fmt.Sprintf("%s is forbidden: %v", qualifiedResource.String(), err) + } else { + message = fmt.Sprintf("%s %q is forbidden: %v", qualifiedResource.String(), name, err) + } return &StatusError{metav1.Status{ Status: metav1.StatusFailure, Code: http.StatusForbidden, @@ -137,7 +145,7 @@ func NewForbidden(qualifiedResource schema.GroupResource, name string, err error Kind: qualifiedResource.Resource, Name: name, }, - Message: fmt.Sprintf("%s %q is forbidden: %v", qualifiedResource.String(), name, err), + Message: message, }} } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/errors_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/errors_test.go index 8ea30401e277a..de5d3a300c357 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/errors_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/errors_test.go @@ -68,13 +68,15 @@ func TestForbidden(t *testing.T) { reason string contentType string }{ - {`{"metadata":{},"status":"Failure","message":" \"\" is forbidden: User \"NAME\" cannot GET path \"/whatever\".","reason":"Forbidden","details":{},"code":403} + {`{"metadata":{},"status":"Failure","message":"forbidden: User \"NAME\" cannot GET path \"/whatever\".","reason":"Forbidden","details":{},"code":403} `, authorizer.AttributesRecord{User: u, Verb: "GET", Path: "/whatever"}, "", "application/json"}, - {`{"metadata":{},"status":"Failure","message":" \"\" is forbidden: User \"NAME\" cannot GET path \"/\u0026lt;script\u0026gt;\".","reason":"Forbidden","details":{},"code":403} + {`{"metadata":{},"status":"Failure","message":"forbidden: User \"NAME\" cannot GET path \"/\u0026lt;script\u0026gt;\".","reason":"Forbidden","details":{},"code":403} `, authorizer.AttributesRecord{User: u, Verb: "GET", Path: "/